Browse Source

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

git-svn-id: trunk@40337 -
florian 6 years ago
parent
commit
6dbde11f5a
1 changed files with 8 additions and 0 deletions
  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 }