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