Sfoglia il codice sorgente

m68k: implement frac inline nodes

git-svn-id: trunk@36290 -
Károly Balogh 8 anni fa
parent
commit
1f7b6fbd9a
1 ha cambiato i file con 56 aggiunte e 0 eliminazioni
  1. 56 0
      compiler/m68k/n68kinl.pas

+ 56 - 0
compiler/m68k/n68kinl.pas

@@ -38,6 +38,7 @@ interface
         function first_cos_real: tnode; override;
         function first_sin_real: tnode; override;
         function first_int_real: tnode; override;
+        function first_frac_real: tnode; override;
 
         procedure second_abs_real; override;
         procedure second_sqr_real; override;
@@ -47,6 +48,7 @@ interface
         procedure second_cos_real; override;
         procedure second_sin_real; override;
         procedure second_int_real; override;
+        procedure second_frac_real; override;
         {procedure second_prefetch; override;
         procedure second_abs_long; override;}
       private
@@ -172,6 +174,21 @@ implementation
           end;
       end;
 
+    function t68kinlinenode.first_frac_real : tnode;
+      begin
+        if (cs_fp_emulation in current_settings.moduleswitches) then
+          result:=inherited first_frac_real
+        else
+          begin
+            case current_settings.fputype of
+              fpu_68881,fpu_coldfire:
+                expectloc:=LOC_FPUREGISTER;
+              else
+                internalerror(2017052103);
+            end;
+            first_frac_real:=nil;
+          end;
+      end;
 
     procedure t68kinlinenode.second_abs_real;
       begin
@@ -263,6 +280,45 @@ implementation
         end;
       end;
 
+    procedure t68kinlinenode.second_frac_real;
+      var
+        href: TReference;
+        hreg: TRegister;
+      begin
+        secondpass(left);
+        case current_settings.fputype of
+          fpu_68881,fpu_coldfire:
+            begin
+              location_reset(location,LOC_FPUREGISTER,left.location.size);
+
+              case left.location.loc of
+                LOC_FPUREGISTER,LOC_CFPUREGISTER:
+                  begin
+                    hreg:=cg.getfpuregister(current_asmdata.CurrAsmList,location.size);
+                    location.register:=cg.getfpuregister(current_asmdata.CurrAsmList,location.size);
+                    cg.a_loadfpu_reg_reg(current_asmdata.CurrAsmlist,OS_NO,OS_NO,left.location.register,location.register);
+                    current_asmdata.CurrAsmList.concat(taicpu.op_reg_reg(A_FINTRZ,fpuregopsize,left.location.register,hreg));
+                    current_asmdata.CurrAsmList.concat(taicpu.op_reg_reg(A_FSUB,fpuregopsize,hreg,location.register));
+                  end;
+                LOC_REFERENCE,LOC_CREFERENCE:
+                  begin
+                    hreg:=cg.getfpuregister(current_asmdata.CurrAsmList,location.size);
+                    location.register:=cg.getfpuregister(current_asmdata.CurrAsmList,location.size);
+                    href:=left.location.reference;
+                    tcg68k(cg).fixref(current_asmdata.CurrAsmList,href,current_settings.fputype = fpu_coldfire);
+                    cg.a_loadfpu_ref_reg(current_asmdata.CurrAsmlist,left.location.size,OS_NO,href,location.register);
+                    current_asmdata.CurrAsmList.concat(taicpu.op_reg_reg(A_FINTRZ,fpuregopsize,location.register,hreg));
+                    current_asmdata.CurrAsmList.concat(taicpu.op_reg_reg(A_FSUB,fpuregopsize,hreg,location.register));
+                  end;
+                else
+                  internalerror(2017052101);
+              end;
+            end;
+        else
+          internalerror(2017052102);
+        end;
+      end;
+
       { ideas for second_abs_long (KB) }
 
       { This is probably faster on 68000 than the generic implementation,