| 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();
|
|
|