Browse Source

* comps are passed in int registers

peter 21 years ago
parent
commit
20d7aca9f0
1 changed files with 26 additions and 9 deletions
  1. 26 9
      compiler/ncgcal.pas

+ 26 - 9
compiler/ncgcal.pas

@@ -163,7 +163,7 @@ implementation
                    end
                    end
                  else
                  else
                    reference_reset_base(href,tempparaloc.reference.index,tempparaloc.reference.offset);
                    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);
+                 cg.a_loadfpu_reg_ref(exprasmlist,left.location.size,left.location.register,href);
                end;
                end;
              LOC_MMREGISTER,
              LOC_MMREGISTER,
              LOC_CMMREGISTER:
              LOC_CMMREGISTER:
@@ -176,7 +176,7 @@ implementation
                    end
                    end
                  else
                  else
                    reference_reset_base(href,tempparaloc.reference.index,tempparaloc.reference.offset);
                    reference_reset_base(href,tempparaloc.reference.index,tempparaloc.reference.offset);
-                 cg.a_loadmm_reg_ref(exprasmlist,def_cgsize(left.resulttype.def),def_cgsize(left.resulttype.def),left.location.register,href,mms_movescalar);
+                 cg.a_loadmm_reg_ref(exprasmlist,left.location.size,left.location.size,left.location.register,href,mms_movescalar);
                end;
                end;
              LOC_REFERENCE,
              LOC_REFERENCE,
              LOC_CREFERENCE :
              LOC_CREFERENCE :
@@ -221,12 +221,12 @@ implementation
                  LOC_CREFERENCE,
                  LOC_CREFERENCE,
                  LOC_MMREGISTER,
                  LOC_MMREGISTER,
                  LOC_CMMREGISTER:
                  LOC_CMMREGISTER:
-                   cg.a_parammm_reg(exprasmlist,def_cgsize(left.resulttype.def),left.location.register,tempparaloc,mms_movescalar);
+                   cg.a_parammm_reg(exprasmlist,left.location.size,left.location.register,tempparaloc,mms_movescalar);
                  LOC_FPUREGISTER,
                  LOC_FPUREGISTER,
                  LOC_CFPUREGISTER:
                  LOC_CFPUREGISTER:
                    begin
                    begin
                      location_force_fpureg(exprasmlist,left.location,false);
                      location_force_fpureg(exprasmlist,left.location,false);
-                     cg.a_paramfpu_reg(exprasmlist,def_cgsize(left.resulttype.def),left.location.register,tempparaloc);
+                     cg.a_paramfpu_reg(exprasmlist,left.location.size,left.location.register,tempparaloc);
                    end;
                    end;
                  else
                  else
                    internalerror(2002042433);
                    internalerror(2002042433);
@@ -238,8 +238,19 @@ implementation
                  LOC_CMMREGISTER:
                  LOC_CMMREGISTER:
                    begin
                    begin
                      location_force_mmregscalar(exprasmlist,left.location,false);
                      location_force_mmregscalar(exprasmlist,left.location,false);
-                     cg.a_parammm_reg(exprasmlist,def_cgsize(left.resulttype.def),left.location.register,tempparaloc,mms_movescalar);
+                     cg.a_parammm_reg(exprasmlist,left.location.size,left.location.register,tempparaloc,mms_movescalar);
                    end;
                    end;
+{$ifdef x86_64}
+                 { x86_64 pushes s64comp in normal register }
+                 LOC_REGISTER,
+                 LOC_CREGISTER :
+                   begin
+                     location_force_mem(exprasmlist,left.location);
+                     { force integer size }
+                     left.location.size:=int_cgsize(tcgsize2size[left.location.size]);
+                     cg.a_param_ref(exprasmlist,left.location.size,left.location.reference,tempparaloc);
+                   end;
+{$endif x86_64}
 {$ifdef sparc}
 {$ifdef sparc}
                  { sparc pushes floats in normal registers }
                  { sparc pushes floats in normal registers }
                  LOC_REGISTER,
                  LOC_REGISTER,
@@ -249,7 +260,7 @@ implementation
                  LOC_CREFERENCE,
                  LOC_CREFERENCE,
                  LOC_FPUREGISTER,
                  LOC_FPUREGISTER,
                  LOC_CFPUREGISTER:
                  LOC_CFPUREGISTER:
-                   cg.a_paramfpu_reg(exprasmlist,def_cgsize(left.resulttype.def),left.location.register,tempparaloc);
+                   cg.a_paramfpu_reg(exprasmlist,left.location.size,left.location.register,tempparaloc);
                  else
                  else
                    internalerror(2002042433);
                    internalerror(2002042433);
                end;
                end;
@@ -258,7 +269,7 @@ implementation
                case tempparaloc.loc of
                case tempparaloc.loc of
                  LOC_MMREGISTER,
                  LOC_MMREGISTER,
                  LOC_CMMREGISTER:
                  LOC_CMMREGISTER:
-                   cg.a_parammm_ref(exprasmlist,def_cgsize(left.resulttype.def),left.location.reference,tempparaloc,mms_movescalar);
+                   cg.a_parammm_ref(exprasmlist,left.location.size,left.location.reference,tempparaloc,mms_movescalar);
 {$ifdef sparc}
 {$ifdef sparc}
                  { sparc pushes floats in normal registers }
                  { sparc pushes floats in normal registers }
                  LOC_REGISTER,
                  LOC_REGISTER,
@@ -268,7 +279,7 @@ implementation
                  LOC_CREFERENCE,
                  LOC_CREFERENCE,
                  LOC_FPUREGISTER,
                  LOC_FPUREGISTER,
                  LOC_CFPUREGISTER:
                  LOC_CFPUREGISTER:
-                   cg.a_paramfpu_ref(exprasmlist,def_cgsize(left.resulttype.def),left.location.reference,tempparaloc);
+                   cg.a_paramfpu_ref(exprasmlist,left.location.size,left.location.reference,tempparaloc);
                  else
                  else
                    internalerror(2002042431);
                    internalerror(2002042431);
                end;
                end;
@@ -641,6 +652,9 @@ implementation
      procedure tcgcallnode.pushparas;
      procedure tcgcallnode.pushparas;
        var
        var
          ppn : tcgcallparanode;
          ppn : tcgcallparanode;
+{$ifdef cputargethasfixedstack}
+         href : treference;
+{$endif cputargethasfixedstack}
        begin
        begin
          { copy all resources to the allocated registers }
          { copy all resources to the allocated registers }
          ppn:=tcgcallparanode(left);
          ppn:=tcgcallparanode(left);
@@ -1250,7 +1264,10 @@ begin
 end.
 end.
 {
 {
   $Log$
   $Log$
-  Revision 1.171  2004-07-09 23:41:04  jonas
+  Revision 1.172  2004-07-11 19:01:13  peter
+    * comps are passed in int registers
+
+  Revision 1.171  2004/07/09 23:41:04  jonas
     * support register parameters for inlined procedures + some inline
     * support register parameters for inlined procedures + some inline
       cleanups
       cleanups