Browse Source

+ properly support the one operand version of imul and mul in
TX86AsmOptimizer.RegLoadedWithNewValue

git-svn-id: trunk@36068 -

nickysn 8 years ago
parent
commit
1a139b951d
1 changed files with 14 additions and 1 deletions
  1. 14 1
      compiler/x86/aoptx86.pas

+ 14 - 1
compiler/x86/aoptx86.pas

@@ -439,7 +439,20 @@ unit aoptx86;
            (p.ops=3) and
            (Reg1WriteOverwritesReg2Entirely(p.oper[2]^.reg,reg)) and
            (((p.oper[1]^.typ=top_reg) and not(Reg1ReadDependsOnReg2(p.oper[1]^.reg,reg))) or
-            ((p.oper[1]^.typ=top_ref) and not(RegInRef(reg,p.oper[1]^.ref^)))));
+            ((p.oper[1]^.typ=top_ref) and not(RegInRef(reg,p.oper[1]^.ref^))))) or
+          ((((p.opcode = A_IMUL) or
+             (p.opcode = A_MUL)) and
+            (p.ops=1)) and
+           (((p.oper[0]^.typ=top_reg) and not(Reg1ReadDependsOnReg2(p.oper[0]^.reg,reg))) or
+            ((p.oper[0]^.typ=top_ref) and not(RegInRef(reg,p.oper[0]^.ref^)))) and
+           (((p.opsize=S_B) and Reg1WriteOverwritesReg2Entirely(NR_AX,reg) and not(Reg1ReadDependsOnReg2(NR_AL,reg))) or
+            ((p.opsize=S_W) and Reg1WriteOverwritesReg2Entirely(NR_DX,reg)) or
+            ((p.opsize=S_L) and Reg1WriteOverwritesReg2Entirely(NR_EDX,reg))
+{$ifdef x86_64}
+         or ((p.opsize=S_Q) and Reg1WriteOverwritesReg2Entirely(NR_RDX,reg))
+{$endif x86_64}
+           )
+          );
       end;