Push revision 3834 to trunk to fix binary operation bug that causes
overlapping events to disappear in Google Calendar.
Review URL: http://codereview.chromium.org/603029
git-svn-id: http://v8.googlecode.com/svn/trunk@3836 ce2b1a6d-e550-0410-aec6-3dcde31c8c00
diff --git a/src/ia32/codegen-ia32.cc b/src/ia32/codegen-ia32.cc
index fe91903..31adb56 100644
--- a/src/ia32/codegen-ia32.cc
+++ b/src/ia32/codegen-ia32.cc
@@ -7045,6 +7045,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);
@@ -7063,8 +7065,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);
@@ -7100,6 +7100,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));
}
@@ -7132,8 +7136,12 @@
__ mov(right_arg, Immediate(left));
SetArgsReversed();
} else {
- __ mov(left_arg, Immediate(left));
+ // 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));
}
// Update flags to indicate that arguments are in registers.
SetArgsInRegisters();
diff --git a/src/version.cc b/src/version.cc
index 7583d1c..67e1e02 100644
--- a/src/version.cc
+++ b/src/version.cc
@@ -35,7 +35,7 @@
#define MAJOR_VERSION 2
#define MINOR_VERSION 1
#define BUILD_NUMBER 0
-#define PATCH_LEVEL 0
+#define PATCH_LEVEL 1
#define CANDIDATE_VERSION false
// Define SONAME to have the SCons build the put a specific SONAME into the
diff --git a/src/x64/codegen-x64.cc b/src/x64/codegen-x64.cc
index 685c928..ce1c938 100644
--- a/src/x64/codegen-x64.cc
+++ b/src/x64/codegen-x64.cc
@@ -8019,6 +8019,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);
@@ -8037,8 +8039,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);
@@ -8074,6 +8074,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);
}
@@ -8106,8 +8110,12 @@
__ Move(right_arg, left);
SetArgsReversed();
} else {
- __ Move(left_arg, left);
+ // 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);
}
// Update flags to indicate that arguments are in registers.
SetArgsInRegisters();