From 9dc822ca13efa304ae721e28f9698f98490a7631 Mon Sep 17 00:00:00 2001 From: "mmassi@chromium.org" Date: Wed, 19 Sep 2012 12:48:49 +0000 Subject: [PATCH] Fixed minus zero test (fixes v8:2133). BUG=v8:2133 Review URL: https://chromiumcodereview.appspot.com/10937013 git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@12548 ce2b1a6d-e550-0410-aec6-3dcde31c8c00 --- src/ia32/assembler-ia32.cc | 10 ++++++ src/ia32/assembler-ia32.h | 1 + src/ia32/code-stubs-ia32.cc | 7 ++-- src/ia32/disasm-ia32.cc | 8 +++++ test/mjsunit/deopt-minus-zero.js | 56 ++++++++++++++++++++++++++++++++ 5 files changed, 79 insertions(+), 3 deletions(-) create mode 100644 test/mjsunit/deopt-minus-zero.js diff --git a/src/ia32/assembler-ia32.cc b/src/ia32/assembler-ia32.cc index ea68c5090f..f291b05260 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); diff --git a/src/ia32/assembler-ia32.h b/src/ia32/assembler-ia32.h index f95e7b797c..4d9562ec01 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); diff --git a/src/ia32/code-stubs-ia32.cc b/src/ia32/code-stubs-ia32.cc index 96d45d319e..65a4934936 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, ¬_int32); - __ j(carry, ¬_int32); + __ pcmpeqd(xmm2, xmm0); + __ movmskpd(ecx, xmm2); + __ test(ecx, Immediate(1)); + __ j(zero, ¬_int32); } GenerateHeapResultAllocation(masm, &call_runtime); __ movdbl(FieldOperand(eax, HeapNumber::kValueOffset), xmm0); diff --git a/src/ia32/disasm-ia32.cc b/src/ia32/disasm-ia32.cc index 008fdde7ea..75b46bd478 100644 --- a/src/ia32/disasm-ia32.cc +++ b/src/ia32/disasm-ia32.cc @@ -1305,6 +1305,14 @@ int DisassemblerIA32::InstructionDecode(v8::internal::Vector out_buffer, NameOfXMMRegister(rm), static_cast(imm8)); data += 2; + } else if (*data == 0x76) { + data++; + int mod, regop, rm; + get_modrm(*data, &mod, ®op, &rm); + AppendToBuffer("pcmpeqd %s,%s", + NameOfXMMRegister(regop), + NameOfXMMRegister(rm)); + data++; } else if (*data == 0x90) { data++; AppendToBuffer("nop"); // 2 byte nop. diff --git a/test/mjsunit/deopt-minus-zero.js b/test/mjsunit/deopt-minus-zero.js new file mode 100644 index 0000000000..ee0983127d --- /dev/null +++ b/test/mjsunit/deopt-minus-zero.js @@ -0,0 +1,56 @@ +// Copyright 2012 the V8 project authors. All rights reserved. +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following +// disclaimer in the documentation and/or other materials provided +// with the distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (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 --expose-gc + +/** + * 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(); +