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