Index: src/x64/codegen-x64.cc |
=================================================================== |
--- src/x64/codegen-x64.cc (revision 3833) |
+++ src/x64/codegen-x64.cc (working copy) |
@@ -8051,6 +8051,8 @@ |
} |
} else if (left.is(left_arg)) { |
__ movq(right_arg, right); |
+ } else if (right.is(right_arg)) { |
+ __ movq(left_arg, left); |
} else if (left.is(right_arg)) { |
if (IsOperationCommutative()) { |
__ movq(left_arg, right); |
@@ -8069,8 +8071,6 @@ |
__ movq(right_arg, right); |
__ movq(left_arg, left); |
} |
- } else if (right.is(right_arg)) { |
- __ movq(left_arg, left); |
} else { |
// Order of moves is not important. |
__ movq(left_arg, left); |
@@ -8106,6 +8106,10 @@ |
__ Move(left_arg, right); |
SetArgsReversed(); |
} else { |
+ // For non-commutative operations, left and right_arg might be |
+ // the same register. Therefore, the order of the moves is |
+ // important here in order to not overwrite left before moving |
+ // it to left_arg. |
__ movq(left_arg, left); |
__ Move(right_arg, right); |
} |
@@ -8138,8 +8142,12 @@ |
__ Move(right_arg, left); |
SetArgsReversed(); |
} else { |
+ // For non-commutative operations, right and left_arg might be |
+ // the same register. Therefore, the order of the moves is |
+ // important here in order to not overwrite right before moving |
+ // it to right_arg. |
+ __ movq(right_arg, right); |
__ Move(left_arg, left); |
- __ movq(right_arg, right); |
} |
// Update flags to indicate that arguments are in registers. |
SetArgsInRegisters(); |