Переглянути джерело

* fixed inlining float parameters for i386

peter 22 роки тому
батько
коміт
d0b13d33c5
1 змінених файлів з 55 додано та 37 видалено
  1. 55 37
      compiler/ncgcal.pas

+ 55 - 37
compiler/ncgcal.pas

@@ -123,12 +123,8 @@ implementation
 
     procedure tcgcallparanode.push_value_para;
       var
-        href : treference;
-{$ifdef i386}
-        tempreference : treference;
-        sizetopush : longint;
-{$endif i386}
-        size : longint;
+        href   : treference;
+        size   : longint;
         cgsize : tcgsize;
       begin
         { we've nothing to push when the size of the parameter is 0 }
@@ -145,42 +141,56 @@ implementation
            location_release(exprasmlist,left.location);
            allocate_tempparaloc;
 {$ifdef i386}
+           if tempparaloc.loc<>LOC_REFERENCE then
+             internalerror(200309291);
            case left.location.loc of
              LOC_FPUREGISTER,
              LOC_CFPUREGISTER:
                begin
-                  if tempparaloc.loc<>LOC_REFERENCE then
-                    internalerror(200309291);
-                  size:=align(tfloatdef(left.resulttype.def).size,tempparaloc.alignment);
-                  inc(tcgcallnode(aktcallnode).pushedparasize,size);
-                  cg.g_stackpointer_alloc(exprasmlist,size);
-                  reference_reset_base(href,NR_STACK_POINTER_REG,0);
-                  cg.a_loadfpu_reg_ref(exprasmlist,def_cgsize(left.resulttype.def),left.location.register,href);
+                 size:=align(tfloatdef(left.resulttype.def).size,tempparaloc.alignment);
+                 inc(tcgcallnode(aktcallnode).pushedparasize,size);
+                 if tempparaloc.reference.index=NR_STACK_POINTER_REG then
+                   begin
+                     cg.g_stackpointer_alloc(exprasmlist,size);
+                     reference_reset_base(href,NR_STACK_POINTER_REG,0);
+                   end
+                 else
+                   reference_reset_base(href,tempparaloc.reference.index,tempparaloc.reference.offset);
+                 cg.a_loadfpu_reg_ref(exprasmlist,def_cgsize(left.resulttype.def),left.location.register,href);
                end;
              LOC_REFERENCE,
              LOC_CREFERENCE :
                begin
-                 sizetopush:=align(left.resulttype.def.size,tempparaloc.alignment);
-                 tempreference:=left.location.reference;
-                 inc(tempreference.offset,sizetopush);
-                 while (sizetopush>0) do
-                  begin
-                    if (sizetopush>=4) or (tempparaloc.alignment>=4) then
-                     begin
-                       cgsize:=OS_32;
-                       inc(tcgcallnode(aktcallnode).pushedparasize,4);
-                       dec(tempreference.offset,4);
-                       dec(sizetopush,4);
-                     end
-                    else
-                     begin
-                       cgsize:=OS_16;
-                       inc(tcgcallnode(aktcallnode).pushedparasize,2);
-                       dec(tempreference.offset,2);
-                       dec(sizetopush,2);
-                     end;
-                    cg.a_param_ref(exprasmlist,cgsize,tempreference,tempparaloc);
-                  end;
+                 size:=align(left.resulttype.def.size,tempparaloc.alignment);
+                 if tempparaloc.reference.index=NR_STACK_POINTER_REG then
+                   begin
+                     href:=left.location.reference;
+                     inc(href.offset,size);
+                     while (size>0) do
+                      begin
+                        if (size>=4) or (tempparaloc.alignment>=4) then
+                         begin
+                           cgsize:=OS_32;
+                           inc(tcgcallnode(aktcallnode).pushedparasize,4);
+                           dec(href.offset,4);
+                           dec(size,4);
+                         end
+                        else
+                         begin
+                           cgsize:=OS_16;
+                           inc(tcgcallnode(aktcallnode).pushedparasize,2);
+                           dec(href.offset,2);
+                           dec(size,2);
+                         end;
+                        cg.a_param_ref(exprasmlist,cgsize,href,tempparaloc);
+                      end;
+                   end
+                 else
+                   begin
+                     reference_reset_base(href,tempparaloc.reference.index,tempparaloc.reference.offset);
+                     cg.g_concatcopy(exprasmlist,left.location.reference,href,size,false,false);
+                     inc(tcgcallnode(aktcallnode).pushedparasize,size);
+                   end;
                end;
              else
                internalerror(200204243);
@@ -216,8 +226,13 @@ implementation
               { push on stack }
               size:=align(left.resulttype.def.size,tempparaloc.alignment);
               inc(tcgcallnode(aktcallnode).pushedparasize,size);
-              cg.g_stackpointer_alloc(exprasmlist,size);
-              reference_reset_base(href,NR_STACK_POINTER_REG,0);
+              if tempparaloc.reference.index=NR_STACK_POINTER_REG then
+                begin
+                  cg.g_stackpointer_alloc(exprasmlist,size);
+                  reference_reset_base(href,NR_STACK_POINTER_REG,0);
+                end
+              else
+                reference_reset_base(href,tempparaloc.reference.index,tempparaloc.reference.offset);
               cg.g_concatcopy(exprasmlist,left.location.reference,href,size,false,false);
 {$else i386}
               cg.a_param_copy_ref(exprasmlist,left.resulttype.def.size,left.location.reference,tempparaloc);
@@ -1105,7 +1120,10 @@ begin
 end.
 {
   $Log$
-  Revision 1.132  2003-10-17 14:38:32  peter
+  Revision 1.133  2003-10-20 19:28:17  peter
+    * fixed inlining float parameters for i386
+
+  Revision 1.132  2003/10/17 14:38:32  peter
     * 64k registers supported
     * fixed some memory leaks