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, &not_int32);
-            __ j(carry, &not_int32);
+            __ pcmpeqd(xmm2, xmm0);
+            __ movmskpd(ecx, xmm2);
+            __ test(ecx, Immediate(1));
+            __ j(zero, &not_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

Reply via email to