| Index: src/ia32/codegen-ia32.cc
|
| ===================================================================
|
| --- src/ia32/codegen-ia32.cc (revision 3833)
|
| +++ src/ia32/codegen-ia32.cc (working copy)
|
| @@ -7036,6 +7036,8 @@
|
| }
|
| } else if (left.is(left_arg)) {
|
| __ mov(right_arg, right);
|
| + } else if (right.is(right_arg)) {
|
| + __ mov(left_arg, left);
|
| } else if (left.is(right_arg)) {
|
| if (IsOperationCommutative()) {
|
| __ mov(left_arg, right);
|
| @@ -7054,8 +7056,6 @@
|
| __ mov(right_arg, right);
|
| __ mov(left_arg, left);
|
| }
|
| - } else if (right.is(right_arg)) {
|
| - __ mov(left_arg, left);
|
| } else {
|
| // Order of moves is not important.
|
| __ mov(left_arg, left);
|
| @@ -7091,6 +7091,10 @@
|
| __ mov(left_arg, Immediate(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.
|
| __ mov(left_arg, left);
|
| __ mov(right_arg, Immediate(right));
|
| }
|
| @@ -7123,8 +7127,12 @@
|
| __ mov(right_arg, Immediate(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.
|
| + __ mov(right_arg, right);
|
| __ mov(left_arg, Immediate(left));
|
| - __ mov(right_arg, right);
|
| }
|
| // Update flags to indicate that arguments are in registers.
|
| SetArgsInRegisters();
|
|
|