Pierre Muller 1 день тому
батько
коміт
688e20f7a5
1 змінених файлів з 10 додано та 2 видалено
  1. 10 2
      compiler/x86/aoptx86.pas

+ 10 - 2
compiler/x86/aoptx86.pas

@@ -16346,7 +16346,11 @@ unit aoptx86;
                     reference_reset(NewRef, 1, []);
                     NewRef.base := taicpu(p).oper[1]^.reg;
                     NewRef.scalefactor := 1;
-                    NewRef.offset := asizeint(taicpu(p).oper[0]^.val);
+                    { if the destination reg is the same as the ADD register,
+                      and we keep the ADD instruction, do not add the offset
+                      to LEA instruction, otherwise the reg gets increased by 2 times the offset value }
+                    if DoAddMov2Lea or not MatchOperand(taicpu(hp1).oper[0]^,taicpu(hp1).oper[1]^.reg) then
+                      NewRef.offset := asizeint(taicpu(p).oper[0]^.val);
 
                     taicpu(hp1).opcode := A_LEA;
                     taicpu(hp1).loadref(0, NewRef);
@@ -16620,7 +16624,11 @@ unit aoptx86;
                     reference_reset(NewRef, 1, []);
                     NewRef.base := taicpu(p).oper[1]^.reg;
                     NewRef.scalefactor := 1;
-                    NewRef.offset := -taicpu(p).oper[0]^.val;
+                    { if the destination reg is the same as the SUB register,
+                      and we keep the ADD instruction, do not substract the offset
+                      to LEA instruction, otherwise the reg gets decreased by 2 times the offset value }
+                    if DoSubMov2Lea or not MatchOperand(taicpu(hp1).oper[0]^,taicpu(hp1).oper[1]^.reg) then
+                       NewRef.offset := -taicpu(p).oper[0]^.val;
 
                     taicpu(hp1).opcode := A_LEA;
                     taicpu(hp1).loadref(0, NewRef);