Selaa lähdekoodia

* emit_div/mod_reg_reg_reg takes now three operands

florian 23 tuntia sitten
vanhempi
commit
a291347d98

+ 6 - 6
compiler/loongarch64/ncpumat.pas

@@ -32,8 +32,8 @@ unit ncpumat;
     type
       tloongarch64moddivnode = class(tcgmoddivnode)
         function use_moddiv64bitint_helper: boolean; override;
-        procedure emit_div_reg_reg(signed: boolean; denum, num: tregister); override;
-        procedure emit_mod_reg_reg(signed: boolean; denum, num: tregister); override;
+        procedure emit_div_reg_reg_reg(signed: boolean; denum, num, res: tregister); override;
+        procedure emit_mod_reg_reg_reg(signed: boolean; denum, num, res: tregister); override;
         function first_moddiv64bitint: tnode; override;
       end;
 
@@ -100,7 +100,7 @@ implementation
       end;
 
 
-    procedure tloongarch64moddivnode.emit_div_reg_reg(signed: boolean; denum, num: tregister);
+    procedure tloongarch64moddivnode.emit_div_reg_reg_reg(signed: boolean; denum, num, res: tregister);
       var
         op: TAsmOp;
       begin
@@ -109,11 +109,11 @@ implementation
         else
           op:=A_DIV_DU;
 
-        current_asmdata.CurrAsmList.Concat(taicpu.op_reg_reg_reg(op,num,num,denum));
+        current_asmdata.CurrAsmList.Concat(taicpu.op_reg_reg_reg(op,res,num,denum));
       end;
 
 
-    procedure tloongarch64moddivnode.emit_mod_reg_reg(signed: boolean; denum, num: tregister);
+    procedure tloongarch64moddivnode.emit_mod_reg_reg_reg(signed: boolean; denum, num, res: tregister);
       var
         op: TAsmOp;
       begin
@@ -122,7 +122,7 @@ implementation
         else
           op:=A_MOD_DU;
 
-        current_asmdata.CurrAsmList.Concat(taicpu.op_reg_reg_reg(op,num,num,denum));
+        current_asmdata.CurrAsmList.Concat(taicpu.op_reg_reg_reg(op,res,num,denum));
       end;
 
 

+ 7 - 10
compiler/m68k/n68kmat.pas

@@ -38,8 +38,8 @@ interface
       tm68kmoddivnode = class(tcgmoddivnode)
       public
         function first_moddivint: tnode;override;
-        procedure emit_div_reg_reg(signed: boolean;denum,num : tregister);override;
-        procedure emit_mod_reg_reg(signed: boolean;denum,num : tregister);override;
+        procedure emit_div_reg_reg_reg(signed: boolean;denum,num,res : tregister);override;
+        procedure emit_mod_reg_reg_reg(signed: boolean;denum,num,res : tregister);override;
       end;
 
       tm68kunaryminusnode = class(tcgunaryminusnode)
@@ -153,20 +153,21 @@ implementation
     end;
 
 
-  procedure tm68kmoddivnode.emit_div_reg_reg(signed: boolean;denum,num : tregister);
+  procedure tm68kmoddivnode.emit_div_reg_reg_reg(signed: boolean;denum,num,res : tregister);
    const
      divudivs: array[boolean] of tasmop = (A_DIVU,A_DIVS);
    begin
      if CPUM68K_HAS_32BITDIV in cpu_capabilities[current_settings.cputype] then
        begin
-         current_asmdata.CurrAsmList.concat(taicpu.op_reg_reg(divudivs[signed],S_L,denum,num));
+         cg.a_load_reg_reg(current_asmdata.CurrAsmList,OS_INT,OS_INT,num,res);
+         current_asmdata.CurrAsmList.concat(taicpu.op_reg_reg(divudivs[signed],S_L,denum,res));
        end
      else
        InternalError(2014062801);
    end;
 
 
-  procedure tm68kmoddivnode.emit_mod_reg_reg(signed: boolean;denum,num : tregister);
+  procedure tm68kmoddivnode.emit_mod_reg_reg_reg(signed: boolean;denum,num,res : tregister);
     const
       remop: array[boolean,boolean] of tasmop = ((A_DIVUL,A_DIVSL),(A_REMU,A_REMS));
     var
@@ -174,12 +175,8 @@ implementation
     begin
       if CPUM68K_HAS_32BITDIV in cpu_capabilities[current_settings.cputype] then
         begin
-          tmpreg:=cg.getintregister(current_asmdata.CurrAsmList,OS_INT);
-          { copy the numerator to the tmpreg, so we can use it as quotient, which
-            means we'll get the remainder immediately in the numerator }
-          cg.a_load_reg_reg(current_asmdata.CurrAsmList,OS_INT,OS_INT,num,tmpreg);
           current_asmdata.CurrAsmList.concat(taicpu.op_reg_reg_reg(
-            remop[CPUM68K_HAS_REMSREMU in cpu_capabilities[current_settings.cputype],signed],S_L,denum,num,tmpreg));
+            remop[CPUM68K_HAS_REMSREMU in cpu_capabilities[current_settings.cputype],signed],S_L,denum,res,num));
         end
       else
         InternalError(2014062802);

+ 6 - 6
compiler/ncgmat.pas

@@ -70,7 +70,7 @@ interface
            The actual optimizations regarding shifts have already
            been done and emitted, so this should really a do a divide.
          }
-         procedure emit_div_reg_reg(signed: boolean;denum,num : tregister);virtual;abstract;
+         procedure emit_div_reg_reg_reg(signed: boolean;denum,num,res : tregister);virtual;abstract;
          { This routine must do an actual 32-bit modulo, be it
            signed or unsigned. The result must set into the the
            @var(num) register.
@@ -82,7 +82,7 @@ interface
            The actual optimizations regarding shifts have already
            been done and emitted, so this should really a do a modulo.
          }
-         procedure emit_mod_reg_reg(signed: boolean;denum,num : tregister);virtual;abstract;
+         procedure emit_mod_reg_reg_reg(signed: boolean;denum,num,res : tregister);virtual;abstract;
 {$if not defined(cpu64bitalu) and not defined(cpuhighleveltarget)}
          { This routine must do an actual 64-bit division, be it
            signed or unsigned. The result must set into the the
@@ -462,13 +462,13 @@ implementation
                       paraloc1.done;
                       cg.a_label(current_asmdata.CurrAsmList,hl);
                     end;
+                  location_reset(location,LOC_REGISTER,opsize);
+                  location.register:=cg.getintregister(current_asmdata.CurrAsmList,OS_INT);
                   if nodetype = modn then
-                    emit_mod_reg_reg(is_signed(left.resultdef),hdenom,hreg1)
+                    emit_mod_reg_reg_reg(is_signed(left.resultdef),hdenom,hreg1,location.register)
                   else
-                    emit_div_reg_reg(is_signed(left.resultdef),hdenom,hreg1);
+                    emit_div_reg_reg_reg(is_signed(left.resultdef),hdenom,hreg1,location.register);
                 end;
-              location_reset(location,LOC_REGISTER,opsize);
-              location.register:=hreg1;
            end;
         cg.g_overflowcheck(current_asmdata.CurrAsmList,location,resultdef);
       end;

+ 6 - 6
compiler/riscv32/nrv32mat.pas

@@ -32,8 +32,8 @@ interface
 
     type
       trv32moddivnode = class(tcgmoddivnode)
-        procedure emit_div_reg_reg(signed: boolean; denum, num: tregister); override;
-        procedure emit_mod_reg_reg(signed: boolean; denum, num: tregister); override;
+        procedure emit_div_reg_reg_reg(signed: boolean; denum, num, res: tregister); override;
+        procedure emit_mod_reg_reg_reg(signed: boolean; denum, num, res: tregister); override;
         function first_moddivint: tnode; override;
       end;
 
@@ -94,7 +94,7 @@ implementation
           end;
       end;
 
-    procedure trv32moddivnode.emit_div_reg_reg(signed: boolean; denum, num: tregister);
+    procedure trv32moddivnode.emit_div_reg_reg_reg(signed: boolean; denum, num, res: tregister);
       var
         op: TAsmOp;
       begin
@@ -103,10 +103,10 @@ implementation
         else
           op:=A_DIVU;
 
-        current_asmdata.CurrAsmList.Concat(taicpu.op_reg_reg_reg(op,num,num,denum));
+        current_asmdata.CurrAsmList.Concat(taicpu.op_reg_reg_reg(op,res,num,denum));
       end;
 
-    procedure trv32moddivnode.emit_mod_reg_reg(signed: boolean; denum, num: tregister);
+    procedure trv32moddivnode.emit_mod_reg_reg_reg(signed: boolean; denum, num, res: tregister);
       var
         op: TAsmOp;
       begin
@@ -115,7 +115,7 @@ implementation
         else
           op:=A_REMU;
 
-        current_asmdata.CurrAsmList.Concat(taicpu.op_reg_reg_reg(op,num,num,denum));
+        current_asmdata.CurrAsmList.Concat(taicpu.op_reg_reg_reg(op,res,num,denum));
       end;
 
 

+ 6 - 6
compiler/xtensa/ncpumat.pas

@@ -31,8 +31,8 @@ interface
     type
       tcpumoddivnode = class(tcgmoddivnode)
         function first_moddivint: tnode; override;
-        procedure emit_div_reg_reg(signed: boolean; denum, num: tregister); override;
-        procedure emit_mod_reg_reg(signed: boolean; denum, num: tregister); override;
+        procedure emit_div_reg_reg_reg(signed: boolean; denum, num, res: tregister); override;
+        procedure emit_mod_reg_reg_reg(signed: boolean; denum, num, res: tregister); override;
       end;
 
       tcpunotnode = class(tcgnotnode)
@@ -69,7 +69,7 @@ implementation
                              TCPUMODDIVNODE
 *****************************************************************************}
 
-    procedure tcpumoddivnode.emit_div_reg_reg(signed: boolean; denum, num: tregister);
+    procedure tcpumoddivnode.emit_div_reg_reg_reg(signed: boolean; denum, num, res: tregister);
       var
         op: TAsmOp;
       begin
@@ -78,11 +78,11 @@ implementation
         else
           op:=A_QUOU;
 
-        current_asmdata.CurrAsmList.Concat(taicpu.op_reg_reg_reg(op,num,num,denum));
+        current_asmdata.CurrAsmList.Concat(taicpu.op_reg_reg_reg(op,res,num,denum));
       end;
 
 
-    procedure tcpumoddivnode.emit_mod_reg_reg(signed: boolean; denum, num: tregister);
+    procedure tcpumoddivnode.emit_mod_reg_reg_reg(signed: boolean; denum, num, res: tregister);
       var
         op: TAsmOp;
       begin
@@ -91,7 +91,7 @@ implementation
         else
           op:=A_REMU;
 
-        current_asmdata.CurrAsmList.Concat(taicpu.op_reg_reg_reg(op,num,num,denum));
+        current_asmdata.CurrAsmList.Concat(taicpu.op_reg_reg_reg(op,res,num,denum));
       end;