Revision: 10140
Author:   [email protected]
Date:     Fri Dec  2 05:16:49 2011
Log:      Quickfix for DoMathPowHalf.

TEST=regress-397.js

Review URL: http://codereview.chromium.org/8769037
http://code.google.com/p/v8/source/detail?r=10140

Modified:
 /branches/bleeding_edge/src/ia32/assembler-ia32.cc
 /branches/bleeding_edge/src/ia32/assembler-ia32.h
 /branches/bleeding_edge/src/ia32/code-stubs-ia32.cc
 /branches/bleeding_edge/src/ia32/lithium-codegen-ia32.cc
 /branches/bleeding_edge/test/mjsunit/regress/regress-397.js

=======================================
--- /branches/bleeding_edge/src/ia32/assembler-ia32.cc Fri Dec 2 02:01:50 2011 +++ /branches/bleeding_edge/src/ia32/assembler-ia32.cc Fri Dec 2 05:16:49 2011
@@ -2055,6 +2055,16 @@
   EMIT(0x2E);
   emit_sse_operand(dst, src);
 }
+
+
+void Assembler::ucomisd(XMMRegister dst, const Operand& src) {
+  ASSERT(CpuFeatures::IsEnabled(SSE2));
+  EnsureSpace ensure_space(this);
+  EMIT(0x66);
+  EMIT(0x0F);
+  EMIT(0x2E);
+  emit_sse_operand(dst, src);
+}


void Assembler::roundsd(XMMRegister dst, XMMRegister src, RoundingMode mode) {
=======================================
--- /branches/bleeding_edge/src/ia32/assembler-ia32.h Fri Dec 2 02:01:50 2011 +++ /branches/bleeding_edge/src/ia32/assembler-ia32.h Fri Dec 2 05:16:49 2011
@@ -987,6 +987,7 @@
   void andpd(XMMRegister dst, XMMRegister src);

   void ucomisd(XMMRegister dst, XMMRegister src);
+  void ucomisd(XMMRegister dst, const Operand& src);

   enum RoundingMode {
     kRoundToNearest = 0x0,
=======================================
--- /branches/bleeding_edge/src/ia32/code-stubs-ia32.cc Fri Dec 2 00:06:37 2011 +++ /branches/bleeding_edge/src/ia32/code-stubs-ia32.cc Fri Dec 2 05:16:49 2011
@@ -3003,13 +3003,9 @@
       // Check base in xmm1 for NaN or +/-Infinity
       const int kExponentShift = kBitsPerByte *
           (HeapNumber::kExponentOffset - HeapNumber::kMantissaOffset);
-      if (CpuFeatures::IsSupported(SSE4_1)) {
-        __ extractps(ecx, xmm1, kExponentShift);
-      } else {
-        __ movsd(xmm4, xmm1);
-        __ psrlq(xmm4, kExponentShift);
-        __ movd(ecx, xmm4);
-      }
+      __ movsd(xmm4, xmm1);
+      __ psrlq(xmm4, kExponentShift);
+      __ movd(ecx, xmm4);
       __ and_(ecx, HeapNumber::kExponentMask);
       __ cmp(ecx, Immediate(HeapNumber::kExponentMask));
       __ j(equal, &generic_runtime);
=======================================
--- /branches/bleeding_edge/src/ia32/lithium-codegen-ia32.cc Fri Dec 2 04:42:35 2011 +++ /branches/bleeding_edge/src/ia32/lithium-codegen-ia32.cc Fri Dec 2 05:16:49 2011
@@ -2938,9 +2938,28 @@
   XMMRegister xmm_scratch = xmm0;
   XMMRegister input_reg = ToDoubleRegister(instr->value());
   ASSERT(ToDoubleRegister(instr->result()).is(input_reg));
+
+  Label return_infinity, done;
+  // Check base for +/- infinity.
+  __ push(ecx);  // TODO(1848): reserve this register.
+  __ mov(ecx, factory()->infinity_value());
+  __ ucomisd(input_reg, FieldOperand(ecx, HeapNumber::kValueOffset));
+  __ j(equal, &return_infinity, Label::kNear);
+  __ xorps(xmm_scratch, xmm_scratch);
+  __ subsd(xmm_scratch, input_reg);
+  __ ucomisd(xmm_scratch, FieldOperand(ecx, HeapNumber::kValueOffset));
+  __ j(equal, &return_infinity, Label::kNear);
+
+  __ pop(ecx);
   __ xorps(xmm_scratch, xmm_scratch);
   __ addsd(input_reg, xmm_scratch);  // Convert -0 to +0.
   __ sqrtsd(input_reg, input_reg);
+  __ jmp(&done, Label::kNear);
+
+  __ bind(&return_infinity);
+  __ movdbl(input_reg, FieldOperand(ecx, HeapNumber::kValueOffset));
+  __ pop(ecx);
+  __ bind(&done);
 }


=======================================
--- /branches/bleeding_edge/test/mjsunit/regress/regress-397.js Tue Dec 7 03:01:02 2010 +++ /branches/bleeding_edge/test/mjsunit/regress/regress-397.js Fri Dec 2 05:16:49 2011
@@ -25,10 +25,19 @@
 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

+// Flags: --allow-natives-syntax
 // See http://code.google.com/p/v8/issues/detail?id=397

-assertEquals("Infinity", String(Math.pow(Infinity, 0.5)));
-assertEquals(0, Math.pow(Infinity, -0.5));
-
-assertEquals("Infinity", String(Math.pow(-Infinity, 0.5)));
-assertEquals(0, Math.pow(-Infinity, -0.5));
+
+function test() {
+  assertEquals("Infinity", String(Math.pow(Infinity, 0.5)));
+  assertEquals(0, Math.pow(Infinity, -0.5));
+
+  assertEquals("Infinity", String(Math.pow(-Infinity, 0.5)));
+  assertEquals(0, Math.pow(-Infinity, -0.5));
+}
+
+test();
+test();
+%OptimizeFunctionOnNextCall(test);
+test();

--
v8-dev mailing list
[email protected]
http://groups.google.com/group/v8-dev

Reply via email to