Browse Source

* handling of float parameters passed in mm registers fixed

florian 21 years ago
parent
commit
e7399ee666
2 changed files with 45 additions and 20 deletions
  1. 19 6
      compiler/cgobj.pas
  2. 26 14
      compiler/ncgcal.pas

+ 19 - 6
compiler/cgobj.pas

@@ -1138,12 +1138,22 @@ implementation
 
     procedure tcg.a_paramfpu_ref(list : taasmoutput;size : tcgsize;const ref : treference;const locpara : tparalocation);
       var
-         hr : tregister;
+         href : treference;
       begin
-         hr:=getfpuregister(list,size);
-         a_loadfpu_ref_reg(list,size,ref,hr);
-         a_paramfpu_reg(list,size,hr,locpara);
-         ungetregister(list,hr);
+        case locpara.loc of
+          LOC_FPUREGISTER,LOC_CFPUREGISTER:
+            a_loadfpu_ref_reg(list,size,ref,locpara.register);
+          LOC_REFERENCE,LOC_CREFERENCE:
+            begin
+              reference_reset(href);
+              href.base:=locpara.reference.index;
+              href.offset:=locpara.reference.offset;
+              { concatcopy should choose the best way to copy the data }
+              g_concatcopy(list,ref,href,tcgsize2size[size],false,false);
+            end
+          else
+            internalerror(200402201);
+        end;
       end;
 
 
@@ -2143,7 +2153,10 @@ finalization
 end.
 {
   $Log$
-  Revision 1.157  2004-02-12 15:54:03  peter
+  Revision 1.158  2004-02-20 22:16:34  florian
+    * handling of float parameters passed in mm registers fixed
+
+  Revision 1.157  2004/02/12 15:54:03  peter
     * make extcycle is working again
 
   Revision 1.156  2004/02/08 18:08:59  jonas

+ 26 - 14
compiler/ncgcal.pas

@@ -147,7 +147,7 @@ implementation
         if left.resulttype.def.deftype=floatdef then
          begin
            location_release(exprasmlist,left.location);
-{$ifdef x86}
+{$ifdef i386}
            if tempparaloc.loc<>LOC_REFERENCE then
              internalerror(200309291);
            case left.location.loc of
@@ -216,14 +216,28 @@ implementation
              else
                internalerror(200204243);
            end;
-{$else x86}
+{$else i386}
            case left.location.loc of
+             LOC_MMREGISTER,
+             LOC_CMMREGISTER:
+               cg.a_parammm_reg(exprasmlist,def_cgsize(left.resulttype.def),left.location.register,tempparaloc,mms_movescalar);
              LOC_FPUREGISTER,
              LOC_CFPUREGISTER:
                cg.a_paramfpu_reg(exprasmlist,def_cgsize(left.resulttype.def),left.location.register,tempparaloc);
              LOC_REFERENCE,
-             LOC_CREFERENCE :
-               cg.a_paramfpu_ref(exprasmlist,def_cgsize(left.resulttype.def),left.location.reference,tempparaloc);
+             LOC_CREFERENCE:
+               case tempparaloc.loc of
+                 LOC_MMREGISTER,
+                 LOC_CMMREGISTER:
+                   cg.a_parammm_ref(exprasmlist,def_cgsize(left.resulttype.def),left.location.reference,tempparaloc,mms_movescalar);
+                 LOC_REFERENCE,
+                 LOC_CREFERENCE,
+                 LOC_FPUREGISTER,
+                 LOC_CFPUREGISTER:
+                   cg.a_paramfpu_ref(exprasmlist,def_cgsize(left.resulttype.def),left.location.reference,tempparaloc);
+                 else
+                   internalerror(200204243);
+               end;
              else
                internalerror(200204243);
            end;
@@ -238,7 +252,7 @@ implementation
                   aktcallnode.procdefinition.proccalloption) then
             begin
               location_release(exprasmlist,left.location);
-{$ifdef x86}
+{$ifdef i386}
               if tempparaloc.loc<>LOC_REFERENCE then
                 internalerror(200309292);
               if not (left.location.loc in [LOC_REFERENCE,LOC_CREFERENCE]) then
@@ -254,9 +268,9 @@ implementation
               else
                 reference_reset_base(href,tempparaloc.reference.index,tempparaloc.reference.offset);
               cg.g_concatcopy(exprasmlist,left.location.reference,href,size,false,false);
-{$else x86}
+{$else i386}
               cg.a_param_copy_ref(exprasmlist,left.resulttype.def.size,left.location.reference,tempparaloc);
-{$endif x86}
+{$endif i386}
             end
            else
             begin
@@ -665,15 +679,10 @@ implementation
                        end;
                      LOC_MMREGISTER:
                        begin
-{
-                         paramanager.freeparaloc(exprasmlist,ppn.tempparaloc);
-                         paramanager.allocparaloc(exprasmlist,ppn.paraitem.paraloc[callerside]);
                          paramanager.freeparaloc(exprasmlist,ppn.tempparaloc);
                          paramanager.allocparaloc(exprasmlist,ppn.paraitem.paraloc[callerside]);
                          cg.a_loadmm_reg_reg(exprasmlist,ppn.tempparaloc.size,
-                           ppn.tempparaloc.size,ppn.tempparaloc.register,ppn.paraitem.paraloc[callerside].register, shuffle???);
-}
-                         internalerror(2003102910);
+                           ppn.tempparaloc.size,ppn.tempparaloc.register,ppn.paraitem.paraloc[callerside].register,mms_movescalar);
                        end;
                      LOC_REFERENCE:
                        begin
@@ -1210,7 +1219,10 @@ begin
 end.
 {
   $Log$
-  Revision 1.155  2004-02-20 21:55:59  peter
+  Revision 1.156  2004-02-20 22:16:35  florian
+    * handling of float parameters passed in mm registers fixed
+
+  Revision 1.155  2004/02/20 21:55:59  peter
     * procvar cleanup
 
   Revision 1.154  2004/02/11 19:59:06  peter