Browse Source

* use zero page registers for FPU function results on the 6502

Nikolay Nikolov 1 year ago
parent
commit
80c85551d4
1 changed files with 34 additions and 34 deletions
  1. 34 34
      compiler/mos6502/cpupara.pas

+ 34 - 34
compiler/mos6502/cpupara.pas

@@ -416,40 +416,40 @@ unit cpupara;
         { Return in FPU register? }
         if result.def.typ=floatdef then
           begin
-            //if (p.proccalloption in [pocall_softfloat]) or (cs_fp_emulation in current_settings.moduleswitches) then
-            //  begin
-            //    case retcgsize of
-            //      OS_32,
-            //      OS_F32:
-            //        begin
-            //          paraloc^.loc:=LOC_REGISTER;
-            //          paraloc^.register:=NR_L;
-            //          paraloc^.size:=OS_8;
-            //          paraloc^.def:=u8inttype;
-            //
-            //          paraloc:=result.add_location;
-            //          paraloc^.loc:=LOC_REGISTER;
-            //          paraloc^.register:=NR_H;
-            //          paraloc^.size:=OS_8;
-            //          paraloc^.def:=u8inttype;
-            //
-            //          paraloc:=result.add_location;
-            //          paraloc^.loc:=LOC_REGISTER;
-            //          paraloc^.register:=NR_E;
-            //          paraloc^.size:=OS_8;
-            //          paraloc^.def:=u8inttype;
-            //
-            //          paraloc:=result.add_location;
-            //          paraloc^.loc:=LOC_REGISTER;
-            //          paraloc^.register:=NR_D;
-            //          paraloc^.size:=OS_8;
-            //          paraloc^.def:=u8inttype;
-            //        end;
-            //      else
-            //        internalerror(2005082603);
-            //    end;
-            //  end
-            //else
+            if (p.proccalloption in [pocall_softfloat]) or (cs_fp_emulation in current_settings.moduleswitches) then
+              begin
+                case retcgsize of
+                  OS_32,
+                  OS_F32:
+                    begin
+                      paraloc^.loc:=LOC_REGISTER;
+                      paraloc^.register:=NR_RZB0;
+                      paraloc^.size:=OS_8;
+                      paraloc^.def:=u8inttype;
+
+                      paraloc:=result.add_location;
+                      paraloc^.loc:=LOC_REGISTER;
+                      paraloc^.register:=NR_RZB1;
+                      paraloc^.size:=OS_8;
+                      paraloc^.def:=u8inttype;
+
+                      paraloc:=result.add_location;
+                      paraloc^.loc:=LOC_REGISTER;
+                      paraloc^.register:=NR_RZB2;
+                      paraloc^.size:=OS_8;
+                      paraloc^.def:=u8inttype;
+
+                      paraloc:=result.add_location;
+                      paraloc^.loc:=LOC_REGISTER;
+                      paraloc^.register:=NR_RZB3;
+                      paraloc^.size:=OS_8;
+                      paraloc^.def:=u8inttype;
+                    end;
+                  else
+                    internalerror(2005082603);
+                end;
+              end
+            else
               begin
                 paraloc^.loc:=LOC_FPUREGISTER;
                 paraloc^.register:=NR_FPU_RESULT_REG;