Browse Source

* llvm implementation of tmoddivnode
o doesn't reuse the generic code generator methods, as the div-to-mul/shift
optimization can be performed by llvm if necessary

git-svn-id: branches/hlcgllvm@28205 -

Jonas Maebe 11 years ago
parent
commit
1c9932d921
1 changed files with 35 additions and 1 deletions
  1. 35 1
      compiler/llvm/nllvmmat.pas

+ 35 - 1
compiler/llvm/nllvmmat.pas

@@ -30,6 +30,10 @@ uses
   node, nmat, ncgmat, cgbase;
   node, nmat, ncgmat, cgbase;
 
 
 type
 type
+  tllvmmoddivnode = class(tcgmoddivnode)
+    procedure pass_generate_code; override;
+  end;
+
   Tllvmunaryminusnode = class(tcgunaryminusnode)
   Tllvmunaryminusnode = class(tcgunaryminusnode)
     procedure emit_float_sign_change(r: tregister; _size : tdef);override;
     procedure emit_float_sign_change(r: tregister; _size : tdef);override;
   end;
   end;
@@ -48,6 +52,36 @@ uses
   llvmbase,
   llvmbase,
   ncgutil, cgutils;
   ncgutil, cgutils;
 
 
+{*****************************************************************************
+                               tllvmmoddivnode
+*****************************************************************************}
+
+procedure tllvmmoddivnode.pass_generate_code;
+  var
+    op: tllvmop;
+  begin
+    secondpass(left);
+    secondpass(right);
+    if is_signed(left.resultdef) then
+      if nodetype=divn then
+        op:=la_sdiv
+      else
+        op:=la_srem
+    else if nodetype=divn then
+      op:=la_udiv
+    else
+      op:=la_urem;
+    hlcg.location_force_reg(current_asmdata.CurrAsmList,left.location,left.resultdef,resultdef,true);
+    if right.location.loc<>LOC_CONSTANT then
+      hlcg.location_force_reg(current_asmdata.CurrAsmList,right.location,right.resultdef,resultdef,true);
+    location_reset(location,LOC_REGISTER,def_cgsize(resultdef));
+    location.register:=hlcg.getintregister(current_asmdata.CurrAsmList,resultdef);
+    if right.location.loc=LOC_CONSTANT then
+      current_asmdata.CurrAsmList.concat(taillvm.op_reg_size_reg_const(op,location.register,resultdef,left.location.register,right.location.value))
+    else
+      current_asmdata.CurrAsmList.concat(taillvm.op_reg_size_reg_reg(op,location.register,resultdef,left.location.register,right.location.register))
+  end;
+
 {*****************************************************************************
 {*****************************************************************************
                                Tllvmunaryminusnode
                                Tllvmunaryminusnode
 *****************************************************************************}
 *****************************************************************************}
@@ -77,8 +111,8 @@ end;
 
 
 
 
 begin
 begin
-(*
   cmoddivnode := tllvmmoddivnode;
   cmoddivnode := tllvmmoddivnode;
+(*
   cshlshrnode := tllvmshlshrnode;
   cshlshrnode := tllvmshlshrnode;
   cnotnode    := tllvmnotnode;
   cnotnode    := tllvmnotnode;
 *)
 *)