浏览代码

* three operand shl for shifting by 2, 4 or 8 can be simulated by lea

git-svn-id: trunk@40337 -
florian 6 年之前
父节点
当前提交
6dbde11f5a
共有 1 个文件被更改,包括 8 次插入0 次删除
  1. 8 0
      compiler/x86/cgx86.pas

+ 8 - 0
compiler/x86/cgx86.pas

@@ -2080,6 +2080,14 @@ unit cgx86;
             reference_reset_base(href,src,al,ctempposinvalid,0,[]);
             list.concat(taicpu.op_ref_reg(A_LEA,TCgSize2OpSize[size],href,dst));
           end
+        else if (op=OP_SHL) and (size in [OS_32,OS_S32,OS_64,OS_S64]) and
+          (int64(a)>=1) and (int64(a)<=3) then
+          begin
+            reference_reset_base(href,NR_NO,0,ctempposinvalid,0,[]);
+            href.index:=src;
+            href.scalefactor:=1 shl longint(a);
+            list.concat(taicpu.op_ref_reg(A_LEA,TCgSize2OpSize[size],href,dst));
+          end
         else if (op=OP_SUB) and
           ((size in [OS_32,OS_S32]) or
            { lea supports only 32 bit signed displacments }