Reviewers: Erik Corry,

Message:
PTAL.

Description:
Quickfix for DoMathPowHalf.

TEST=regress-397.js


Please review this at http://codereview.chromium.org/8769037/

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
  M src/ia32/lithium-codegen-ia32.cc
  M test/mjsunit/regress/regress-397.js


Index: src/ia32/assembler-ia32.cc
diff --git a/src/ia32/assembler-ia32.cc b/src/ia32/assembler-ia32.cc
index ba58362886253de2fdb4bbc153f868a41a6f7b15..a38e46341a7319396b12f3384b962e4603044dc1 100644
--- a/src/ia32/assembler-ia32.cc
+++ b/src/ia32/assembler-ia32.cc
@@ -2057,6 +2057,16 @@ void Assembler::ucomisd(XMMRegister dst, XMMRegister 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) {
   ASSERT(CpuFeatures::IsEnabled(SSE4_1));
   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 060b01d0dd9c98176890f28ee9c15b70f080d1e0..08afc3aedce5ae57708d83531d0e0f214c7127f7 100644
--- a/src/ia32/assembler-ia32.h
+++ b/src/ia32/assembler-ia32.h
@@ -987,6 +987,7 @@ class Assembler : public AssemblerBase {
   void andpd(XMMRegister dst, XMMRegister src);

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

   enum RoundingMode {
     kRoundToNearest = 0x0,
Index: src/ia32/code-stubs-ia32.cc
diff --git a/src/ia32/code-stubs-ia32.cc b/src/ia32/code-stubs-ia32.cc
index 855720c80a48bd2030938205253906182048252f..0afc9cc6e02ed65a0dc1803723c60a14429ff211 100644
--- a/src/ia32/code-stubs-ia32.cc
+++ b/src/ia32/code-stubs-ia32.cc
@@ -3003,13 +3003,9 @@ void MathPowStub::Generate(MacroAssembler* masm) {
       // 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);
Index: src/ia32/lithium-codegen-ia32.cc
diff --git a/src/ia32/lithium-codegen-ia32.cc b/src/ia32/lithium-codegen-ia32.cc index 052115bd417badedb371a90ef22fbebd2fcee854..b49dfaf9429aaa9abfbcddfaebf1a92c00aa7cf6 100644
--- a/src/ia32/lithium-codegen-ia32.cc
+++ b/src/ia32/lithium-codegen-ia32.cc
@@ -2938,9 +2938,28 @@ void LCodeGen::DoMathPowHalf(LUnaryMathOperation* instr) {
   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);
+  __ 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);
 }


Index: test/mjsunit/regress/regress-397.js
diff --git a/test/mjsunit/regress/regress-397.js b/test/mjsunit/regress/regress-397.js index 111f4a6e531df609642ac449ae1e266b8c83b0eb..0e4143d032d886ca74258950f6c9f1b2954f96db 100644
--- a/test/mjsunit/regress/regress-397.js
+++ b/test/mjsunit/regress/regress-397.js
@@ -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