Bläddra i källkod

* fix register calling for assembler procedures
* fix result loading for assembler procedures

peter 22 år sedan
förälder
incheckning
9365837ecd
2 ändrade filer med 64 tillägg och 40 borttagningar
  1. 17 5
      compiler/ncgbas.pas
  2. 47 35
      compiler/ncgutil.pas

+ 17 - 5
compiler/ncgbas.pas

@@ -68,7 +68,7 @@ interface
 
     uses
       globtype,systems,
-      cutils,verbose,globals,
+      cutils,verbose,
       aasmbase,aasmtai,aasmcpu,symsym,
       defutil,
       nflw,pass_2,
@@ -149,10 +149,18 @@ interface
                   end;
                 LOC_REGISTER :
                   begin
-                    op.typ:=top_reg;
-                    op.reg:=sym.localloc.register;
+                    { Subscribed access }
                     if sofs<>0 then
-                      internalerror(200309231);
+                      begin
+                        op.typ:=top_ref;
+                        new(op.ref);
+                        reference_reset_base(op.ref^,sym.localloc.register,sofs);
+                      end
+                    else
+                      begin
+                        op.typ:=top_reg;
+                        op.reg:=sym.localloc.register;
+                      end;
                   end;
               end;
             end;
@@ -364,7 +372,11 @@ begin
 end.
 {
   $Log$
-  Revision 1.41  2003-10-01 20:34:48  peter
+  Revision 1.42  2003-10-07 18:18:16  peter
+    * fix register calling for assembler procedures
+    * fix result loading for assembler procedures
+
+  Revision 1.41  2003/10/01 20:34:48  peter
     * procinfo unit contains tprocinfo
     * cginfo renamed to cgbase
     * moved cgmessage to verbose

+ 47 - 35
compiler/ncgutil.pas

@@ -971,7 +971,7 @@ implementation
            (
             (po_assembler in current_procinfo.procdef.procoptions) and
             (not(assigned(current_procinfo.procdef.funcretsym)) or
-             (tvarsym(current_procinfo.procdef.funcretsym).refcount=0))
+             (tvarsym(current_procinfo.procdef.funcretsym).refs=0))
            ) then
           exit;
 
@@ -1815,41 +1815,46 @@ implementation
               begin
                 with tvarsym(sym) do
                   begin
-                    if (paraitem.paraloc[calleeside].loc=LOC_REGISTER) then
+                    if not(po_assembler in current_procinfo.procdef.procoptions) then
                       begin
-                        (*
-                        if paraitem.paraloc[calleeside].register=NR_NO then
+                        if (paraitem.paraloc[calleeside].loc=LOC_REGISTER) then
                           begin
-                            paraitem.paraloc[calleeside].loc:=LOC_REGISTER;
-                            paraitem.paraloc[calleeside].size:=paraitem.paraloc[calleeside].size;
+                            (*
+                            if paraitem.paraloc[calleeside].register=NR_NO then
+                              begin
+                                paraitem.paraloc[calleeside].loc:=LOC_REGISTER;
+                                paraitem.paraloc[calleeside].size:=paraitem.paraloc[calleeside].size;
+{$ifndef cpu64bit}
+                                if paraitem.paraloc[calleeside].size in [OS_64,OS_S64] then
+                                  begin
+                                    paraitem.paraloc[calleeside].registerlow:=rg.getregisterint(list,OS_32);
+                                    paraitem.paraloc[calleeside].registerhigh:=rg.getregisterint(list,OS_32);
+                                  end
+                                else
+{$endif cpu64bit}
+                                  paraitem.paraloc[calleeside].register:=rg.getregisterint(list,localloc.size);
+                              end;
+                             *)
+                            (*
+{$warning TODO Allocate register paras}
+                            localloc.loc:=LOC_REGISTER;
+                           localloc.size:=paraitem.paraloc[calleeside].size;
 {$ifndef cpu64bit}
-                            if paraitem.paraloc[calleeside].size in [OS_64,OS_S64] then
+                            if localloc.size in [OS_64,OS_S64] then
                               begin
-                                paraitem.paraloc[calleeside].registerlow:=rg.getregisterint(list,OS_32);
-                                paraitem.paraloc[calleeside].registerhigh:=rg.getregisterint(list,OS_32);
+                                localloc.registerlow:=rg.getregisterint(list,OS_32);
+                                localloc.registerhigh:=rg.getregisterint(list,OS_32);
                               end
                             else
 {$endif cpu64bit}
-                              paraitem.paraloc[calleeside].register:=rg.getregisterint(list,localloc.size);
-                          end;
-                         *)
-                        (*
-{$warning TODO Allocate register paras}
-                        localloc.loc:=LOC_REGISTER;
-                        localloc.size:=paraitem.paraloc[calleeside].size;
-{$ifndef cpu64bit}
-                        if localloc.size in [OS_64,OS_S64] then
-                          begin
-                            localloc.registerlow:=rg.getregisterint(list,OS_32);
-                            localloc.registerhigh:=rg.getregisterint(list,OS_32);
+                              localloc.register:=rg.getregisterint(list,localloc.size);
+                              *)
+                            localloc.loc:=LOC_REFERENCE;
+                            localloc.size:=paraitem.paraloc[calleeside].size;
+                            tg.GetLocal(list,tcgsize2size[localloc.size],localloc.reference);
                           end
                         else
-{$endif cpu64bit}
-                          localloc.register:=rg.getregisterint(list,localloc.size);
-                          *)
-                        localloc.loc:=LOC_REFERENCE;
-                        localloc.size:=paraitem.paraloc[calleeside].size;
-                        tg.GetLocal(list,tcgsize2size[localloc.size],localloc.reference);
+                          localloc:=paraitem.paraloc[calleeside];
                       end
                     else
                       localloc:=paraitem.paraloc[calleeside];
@@ -1919,15 +1924,18 @@ implementation
                         tg.UngetLocal(list,localloc.reference);
                       LOC_REGISTER :
                         begin
-{$ifndef cpu64bit}
-                          if localloc.size in [OS_64,OS_S64] then
+                          if localloc.register<>paraitem.paraloc[calleeside].register then
                             begin
-                              rg.ungetregister(list,localloc.registerlow);
-                              rg.ungetregister(list,localloc.registerhigh);
-                            end
-                          else
+{$ifndef cpu64bit}
+                              if localloc.size in [OS_64,OS_S64] then
+                                begin
+                                  rg.ungetregister(list,localloc.registerlow);
+                                  rg.ungetregister(list,localloc.registerhigh);
+                                end
+                              else
 {$endif cpu64bit}
-                            rg.ungetregister(list,localloc.register);
+                                rg.ungetregister(list,localloc.register);
+                            end;
                         end;
                     end;
                   end;
@@ -1940,7 +1948,11 @@ implementation
 end.
 {
   $Log$
-  Revision 1.155  2003-10-07 15:17:07  peter
+  Revision 1.156  2003-10-07 18:18:16  peter
+    * fix register calling for assembler procedures
+    * fix result loading for assembler procedures
+
+  Revision 1.155  2003/10/07 15:17:07  peter
     * inline supported again, LOC_REFERENCEs are used to pass the
       parameters
     * inlineparasymtable,inlinelocalsymtable removed