| Index: src/ia32/lithium-codegen-ia32.cc
|
| diff --git a/src/ia32/lithium-codegen-ia32.cc b/src/ia32/lithium-codegen-ia32.cc
|
| index 5d3d11be17d27668355507b42f4321575c9ba31a..076ae7200894551a776f59dfd7a41a23b308f9e7 100644
|
| --- a/src/ia32/lithium-codegen-ia32.cc
|
| +++ b/src/ia32/lithium-codegen-ia32.cc
|
| @@ -1709,38 +1709,37 @@ void LCodeGen::DoConstantS(LConstantS* instr) {
|
|
|
|
|
| void LCodeGen::DoConstantD(LConstantD* instr) {
|
| - double v = instr->value();
|
| - uint64_t int_val = bit_cast<uint64_t, double>(v);
|
| - int32_t lower = static_cast<int32_t>(int_val);
|
| - int32_t upper = static_cast<int32_t>(int_val >> (kBitsPerInt));
|
| + uint64_t const bits = instr->bits();
|
| + uint32_t const lower = static_cast<uint32_t>(bits);
|
| + uint32_t const upper = static_cast<uint32_t>(bits >> 32);
|
| DCHECK(instr->result()->IsDoubleRegister());
|
|
|
| - XMMRegister res = ToDoubleRegister(instr->result());
|
| - if (int_val == 0) {
|
| - __ xorps(res, res);
|
| + XMMRegister result = ToDoubleRegister(instr->result());
|
| + if (bits == 0u) {
|
| + __ xorps(result, result);
|
| } else {
|
| Register temp = ToRegister(instr->temp());
|
| if (CpuFeatures::IsSupported(SSE4_1)) {
|
| CpuFeatureScope scope2(masm(), SSE4_1);
|
| if (lower != 0) {
|
| __ Move(temp, Immediate(lower));
|
| - __ movd(res, Operand(temp));
|
| + __ movd(result, Operand(temp));
|
| __ Move(temp, Immediate(upper));
|
| - __ pinsrd(res, Operand(temp), 1);
|
| + __ pinsrd(result, Operand(temp), 1);
|
| } else {
|
| - __ xorps(res, res);
|
| + __ xorps(result, result);
|
| __ Move(temp, Immediate(upper));
|
| - __ pinsrd(res, Operand(temp), 1);
|
| + __ pinsrd(result, Operand(temp), 1);
|
| }
|
| } else {
|
| __ Move(temp, Immediate(upper));
|
| - __ movd(res, Operand(temp));
|
| - __ psllq(res, 32);
|
| - if (lower != 0) {
|
| + __ movd(result, Operand(temp));
|
| + __ psllq(result, 32);
|
| + if (lower != 0u) {
|
| XMMRegister xmm_scratch = double_scratch0();
|
| __ Move(temp, Immediate(lower));
|
| __ movd(xmm_scratch, Operand(temp));
|
| - __ orps(res, xmm_scratch);
|
| + __ orps(result, xmm_scratch);
|
| }
|
| }
|
| }
|
| @@ -3894,9 +3893,7 @@ void LCodeGen::DoMathLog(LMathLog* instr) {
|
| __ ucomisd(input_reg, xmm_scratch);
|
| __ j(above, &positive, Label::kNear);
|
| __ j(not_carry, &zero, Label::kNear);
|
| - ExternalReference nan =
|
| - ExternalReference::address_of_canonical_non_hole_nan();
|
| - __ movsd(input_reg, Operand::StaticVariable(nan));
|
| + __ pcmpeqd(input_reg, input_reg);
|
| __ jmp(&done, Label::kNear);
|
| __ bind(&zero);
|
| ExternalReference ninf =
|
| @@ -4250,8 +4247,6 @@ void LCodeGen::DoStoreKeyedExternalArray(LStoreKeyed* instr) {
|
|
|
|
|
| void LCodeGen::DoStoreKeyedFixedDoubleArray(LStoreKeyed* instr) {
|
| - ExternalReference canonical_nan_reference =
|
| - ExternalReference::address_of_canonical_non_hole_nan();
|
| Operand double_store_operand = BuildFastArrayOperand(
|
| instr->elements(),
|
| instr->key(),
|
| @@ -4262,13 +4257,10 @@ void LCodeGen::DoStoreKeyedFixedDoubleArray(LStoreKeyed* instr) {
|
| XMMRegister value = ToDoubleRegister(instr->value());
|
|
|
| if (instr->NeedsCanonicalization()) {
|
| - Label have_value;
|
| -
|
| - __ ucomisd(value, value);
|
| - __ j(parity_odd, &have_value, Label::kNear); // NaN.
|
| -
|
| - __ movsd(value, Operand::StaticVariable(canonical_nan_reference));
|
| - __ bind(&have_value);
|
| + XMMRegister xmm_scratch = double_scratch0();
|
| + // Turn potential sNaN value into qNaN.
|
| + __ xorps(xmm_scratch, xmm_scratch);
|
| + __ subsd(value, xmm_scratch);
|
| }
|
|
|
| __ movsd(double_store_operand, value);
|
| @@ -4757,13 +4749,11 @@ void LCodeGen::EmitNumberUntagD(LNumberUntagD* instr, Register input_reg,
|
| if (can_convert_undefined_to_nan) {
|
| __ bind(&convert);
|
|
|
| - // Convert undefined (and hole) to NaN.
|
| + // Convert undefined to NaN.
|
| __ cmp(input_reg, factory()->undefined_value());
|
| DeoptimizeIf(not_equal, instr, "not a heap number/undefined");
|
|
|
| - ExternalReference nan =
|
| - ExternalReference::address_of_canonical_non_hole_nan();
|
| - __ movsd(result_reg, Operand::StaticVariable(nan));
|
| + __ pcmpeqd(result_reg, result_reg);
|
| __ jmp(&done, Label::kNear);
|
| }
|
| } else {
|
|
|