Reviewers: Jakob,
Description:
Fixed minus zero test (fixes v8:2133).
BUG=v8:2133
Please review this at https://chromiumcodereview.appspot.com/10937013/
SVN Base: https://v8.googlecode.com/svn/branches/bleeding_edge
Affected files:
M src/ia32/assembler-ia32.h
M src/ia32/assembler-ia32.cc
M src/ia32/code-stubs-ia32.cc
A + test/mjsunit/deopt-minus-zero.js
Index: src/ia32/assembler-ia32.cc
diff --git a/src/ia32/assembler-ia32.cc b/src/ia32/assembler-ia32.cc
index
ea68c5090f9389ed3173a4fa291c4139b3bd4257..f291b05260b141dde99cb81b394529f69ffcc2af
100644
--- a/src/ia32/assembler-ia32.cc
+++ b/src/ia32/assembler-ia32.cc
@@ -2105,6 +2105,16 @@ void Assembler::movmskpd(Register dst, XMMRegister
src) {
}
+void Assembler::pcmpeqd(XMMRegister dst, XMMRegister src) {
+ ASSERT(CpuFeatures::IsEnabled(SSE2));
+ EnsureSpace ensure_space(this);
+ EMIT(0x66);
+ EMIT(0x0F);
+ EMIT(0x76);
+ emit_sse_operand(dst, src);
+}
+
+
void Assembler::cmpltsd(XMMRegister dst, XMMRegister src) {
ASSERT(CpuFeatures::IsEnabled(SSE2));
EnsureSpace ensure_space(this);
Index: src/ia32/assembler-ia32.h
diff --git a/src/ia32/assembler-ia32.h b/src/ia32/assembler-ia32.h
index
f95e7b797cdde18eafa1b7d975010a3710e4449e..4d9562ec01870fd62a9fc92409f247abd1c6c956
100644
--- a/src/ia32/assembler-ia32.h
+++ b/src/ia32/assembler-ia32.h
@@ -1016,6 +1016,7 @@ class Assembler : public AssemblerBase {
void movmskpd(Register dst, XMMRegister src);
void cmpltsd(XMMRegister dst, XMMRegister src);
+ void pcmpeqd(XMMRegister dst, XMMRegister src);
void movaps(XMMRegister dst, XMMRegister src);
Index: src/ia32/code-stubs-ia32.cc
diff --git a/src/ia32/code-stubs-ia32.cc b/src/ia32/code-stubs-ia32.cc
index
96d45d319eeb8c4e13870e3b7ee636a9a67648a8..65a49349360f96963e6fab8197dbf565febc59e9
100644
--- a/src/ia32/code-stubs-ia32.cc
+++ b/src/ia32/code-stubs-ia32.cc
@@ -1793,9 +1793,10 @@ void BinaryOpStub::GenerateInt32Stub(MacroAssembler*
masm) {
if (result_type_ <= BinaryOpIC::INT32) {
__ cvttsd2si(ecx, Operand(xmm0));
__ cvtsi2sd(xmm2, ecx);
- __ ucomisd(xmm0, xmm2);
- __ j(not_zero, ¬_int32);
- __ j(carry, ¬_int32);
+ __ pcmpeqd(xmm2, xmm0);
+ __ movmskpd(ecx, xmm2);
+ __ test(ecx, Immediate(1));
+ __ j(zero, ¬_int32);
}
GenerateHeapResultAllocation(masm, &call_runtime);
__ movdbl(FieldOperand(eax, HeapNumber::kValueOffset), xmm0);
Index: test/mjsunit/deopt-minus-zero.js
diff --git a/test/mjsunit/regress/regress-cntl-descriptors-enum.js
b/test/mjsunit/deopt-minus-zero.js
similarity index 76%
copy from test/mjsunit/regress/regress-cntl-descriptors-enum.js
copy to test/mjsunit/deopt-minus-zero.js
index
ee72fafc8a7c67f2b1ab6cc22a734ef8033a5697..a0c1fb2c49b1a6cdf18057c22df4eda28b521a33
100644
--- a/test/mjsunit/regress/regress-cntl-descriptors-enum.js
+++ b/test/mjsunit/deopt-minus-zero.js
@@ -27,20 +27,32 @@
// Flags: --allow-natives-syntax --expose-gc
-DontEnum = 2;
-
-var o = {};
-%SetProperty(o, "a", 0, DontEnum);
-
-var o2 = {};
-%SetProperty(o2, "a", 0, DontEnum);
-
-assertTrue(%HaveSameMap(o, o2));
-
-o.y = 2;
-
-for (var v in o) { print(v); }
-o = {};
+/**
+ * The possible optimization states of a function. Must be in sync with the
+ * return values of Runtime_GetOptimizationStatus() in runtime.cc!
+ */
+var OptimizationState = {
+ YES: 1,
+ NO: 2,
+ ALWAYS: 3,
+ NEVER: 4
+};
+
+function mul (a, b) {
+ return a * b;
+}
+
+
+
+mul(-1, -1);
+mul(0x80000001|0, -1);
+mul(0x80000001|0, -1);
+%OptimizeFunctionOnNextCall(mul);
+mul(0, -1);
+%OptimizeFunctionOnNextCall(mul);
+mul(0, -1);
+
+var raw_optimized = %GetOptimizationStatus(mul);
+assertFalse(raw_optimized == OptimizationState.NO);
gc();
-for (var v in o2) { print(v); }
--
v8-dev mailing list
[email protected]
http://groups.google.com/group/v8-dev