瀏覽代碼

+ optimize <signed> mod <power of 2> for x86-64 as well

git-svn-id: trunk@45854 -
florian 5 年之前
父節點
當前提交
f6e6b807d5
共有 1 個文件被更改,包括 15 次插入0 次删除
  1. 15 0
      compiler/x86/nx86mat.pas

+ 15 - 0
compiler/x86/nx86mat.pas

@@ -643,6 +643,21 @@ interface
                   end;
               end;
           end
+        else if (nodetype=modn) and (right.nodetype=ordconstn) and (is_signed(left.resultdef)) and isabspowerof2(tordconstnode(right).value,power) then
+          begin
+            hreg2:=cg.getintregister(current_asmdata.CurrAsmList,cgsize);
+            if power=1 then
+              cg.a_op_const_reg_reg(current_asmdata.CurrAsmList,OP_SHR,cgsize,resultdef.size*8-power,hreg1,hreg2)
+            else
+              begin
+                cg.a_op_const_reg_reg(current_asmdata.CurrAsmList,OP_SAR,cgsize,resultdef.size*8-1,hreg1,hreg2);
+                cg.a_op_const_reg_reg(current_asmdata.CurrAsmList,OP_SHR,cgsize,resultdef.size*8-power,hreg2,hreg2);
+              end;
+            emit_reg_reg(A_ADD,opsize,hreg1,hreg2);
+            emit_const_reg(A_AND,opsize,not((aint(1) shl power)-1),hreg2);
+            emit_reg_reg(A_SUB,opsize,hreg2,hreg1);
+            location.register:=hreg1;
+          end
         else
           begin
 DefaultDiv: