Forráskód Böngészése

* fix return registers for hfa's containing singles

git-svn-id: trunk@42666 -
florian 6 éve
szülő
commit
58bbbadc16
1 módosított fájl, 30 hozzáadás és 5 törlés
  1. 30 5
      compiler/arm/cpupara.pas

+ 30 - 5
compiler/arm/cpupara.pas

@@ -711,7 +711,8 @@ unit cpupara;
         retcgsize  : tcgsize;
         basedef: tdef;
         i: longint;
-        mmreg: tregister;
+        sparesinglereg: tregister;
+        mmreg : TSuperRegister;
       begin
          if set_common_funcretloc_info(p,forcetempdef,retcgsize,result) then
            exit;
@@ -719,6 +720,7 @@ unit cpupara;
         paraloc:=result.add_location;
         { Return in FPU register? }
         basedef:=nil;
+        sparesinglereg:=NR_NO;
         if (result.def.typ=floatdef) or
            is_hfa(result.def,basedef) then
           begin
@@ -736,20 +738,43 @@ unit cpupara;
                   OS_64,
                   OS_F64:
                     begin
-                      mmreg:=NR_MM_RESULT_REG
+                      mmreg:=RS_D0;
                     end;
                   OS_32,
                   OS_F32:
                     begin
-                      mmreg:=NR_S0;
+                      mmreg:=RS_S0;
                     end;
                   else
                     internalerror(2012032501);
                 end;
                 repeat
                   paraloc^.loc:=LOC_MMREGISTER;
-                  paraloc^.register:=mmreg;
-                  inc(mmreg);
+                  { mm registers are strangly ordered in the arm compiler }
+                  case retcgsize of
+                    OS_32,OS_F32:
+                      begin
+                        if sparesinglereg=NR_NO then
+                          begin
+                            paraloc^.register:=newreg(R_MMREGISTER,mmreg,R_SUBFS);
+                            sparesinglereg:=newreg(R_MMREGISTER,mmreg-RS_S0+RS_S1,R_SUBFS);
+                            inc(mmreg);
+                          end
+                        else
+                          begin
+                            paraloc^.register:=sparesinglereg;
+                            sparesinglereg:=NR_NO;
+                          end;
+                      end;
+                    OS_64,OS_F64:
+                      begin
+                        paraloc^.register:=newreg(R_MMREGISTER,mmreg,R_SUBFD);
+                        inc(mmreg);
+                      end;
+                    else
+                      Internalerror(2019081201);
+                  end;
+
                   paraloc^.size:=retcgsize;
                   paraloc^.def:=basedef;
                   paraloc:=paraloc^.next;