Index: src/ia32/lithium-codegen-ia32.cc |
diff --git a/src/ia32/lithium-codegen-ia32.cc b/src/ia32/lithium-codegen-ia32.cc |
index cf24756e3df464c6f193f3babf099ce11ea3960f..92b1250458acda624dbdf0facddff1728159bc28 100644 |
--- a/src/ia32/lithium-codegen-ia32.cc |
+++ b/src/ia32/lithium-codegen-ia32.cc |
@@ -1996,9 +1996,10 @@ void LCodeGen::DoConstantD(LConstantD* instr) { |
__ movd(res, Operand(temp)); |
__ psllq(res, 32); |
if (lower != 0) { |
+ XMMRegister xmm_scratch = double_scratch0(); |
__ Set(temp, Immediate(lower)); |
- __ movd(xmm0, Operand(temp)); |
- __ por(res, xmm0); |
+ __ movd(xmm_scratch, Operand(temp)); |
+ __ por(res, xmm_scratch); |
} |
} |
} |
@@ -2207,7 +2208,7 @@ void LCodeGen::DoMathMinMax(LMathMinMax* instr) { |
__ jmp(&return_right, Label::kNear); |
__ bind(&check_zero); |
- XMMRegister xmm_scratch = xmm0; |
+ XMMRegister xmm_scratch = double_scratch0(); |
__ xorps(xmm_scratch, xmm_scratch); |
__ ucomisd(left_reg, xmm_scratch); |
__ j(not_equal, &return_left, Label::kNear); // left == right != 0. |
@@ -2377,8 +2378,9 @@ void LCodeGen::DoBranch(LBranch* instr) { |
ASSERT(!info()->IsStub()); |
CpuFeatureScope scope(masm(), SSE2); |
XMMRegister reg = ToDoubleRegister(instr->value()); |
- __ xorps(xmm0, xmm0); |
- __ ucomisd(reg, xmm0); |
+ XMMRegister xmm_scratch = double_scratch0(); |
+ __ xorps(xmm_scratch, xmm_scratch); |
+ __ ucomisd(reg, xmm_scratch); |
EmitBranch(instr, not_equal); |
} else { |
ASSERT(r.IsTagged()); |
@@ -2398,8 +2400,9 @@ void LCodeGen::DoBranch(LBranch* instr) { |
} else if (type.IsHeapNumber()) { |
ASSERT(!info()->IsStub()); |
CpuFeatureScope scope(masm(), SSE2); |
- __ xorps(xmm0, xmm0); |
- __ ucomisd(xmm0, FieldOperand(reg, HeapNumber::kValueOffset)); |
+ XMMRegister xmm_scratch = double_scratch0(); |
+ __ xorps(xmm_scratch, xmm_scratch); |
+ __ ucomisd(xmm_scratch, FieldOperand(reg, HeapNumber::kValueOffset)); |
EmitBranch(instr, not_equal); |
} else if (type.IsString()) { |
ASSERT(!info()->IsStub()); |
@@ -2484,8 +2487,9 @@ void LCodeGen::DoBranch(LBranch* instr) { |
__ j(not_equal, ¬_heap_number, Label::kNear); |
if (CpuFeatures::IsSafeForSnapshot(SSE2)) { |
CpuFeatureScope scope(masm(), SSE2); |
- __ xorps(xmm0, xmm0); |
- __ ucomisd(xmm0, FieldOperand(reg, HeapNumber::kValueOffset)); |
+ XMMRegister xmm_scratch = double_scratch0(); |
+ __ xorps(xmm_scratch, xmm_scratch); |
+ __ ucomisd(xmm_scratch, FieldOperand(reg, HeapNumber::kValueOffset)); |
} else { |
__ fldz(); |
__ fld_d(FieldOperand(reg, HeapNumber::kValueOffset)); |
@@ -3925,7 +3929,7 @@ void LCodeGen::DoMathAbs(LMathAbs* instr) { |
CpuFeatureScope scope(masm(), SSE2); |
if (r.IsDouble()) { |
- XMMRegister scratch = xmm0; |
+ XMMRegister scratch = double_scratch0(); |
XMMRegister input_reg = ToDoubleRegister(instr->value()); |
__ xorps(scratch, scratch); |
__ subsd(scratch, input_reg); |
@@ -3946,7 +3950,7 @@ void LCodeGen::DoMathAbs(LMathAbs* instr) { |
void LCodeGen::DoMathFloor(LMathFloor* instr) { |
CpuFeatureScope scope(masm(), SSE2); |
- XMMRegister xmm_scratch = xmm0; |
+ XMMRegister xmm_scratch = double_scratch0(); |
Register output_reg = ToRegister(instr->result()); |
XMMRegister input_reg = ToDoubleRegister(instr->value()); |
@@ -4014,7 +4018,7 @@ void LCodeGen::DoMathRound(LMathRound* instr) { |
CpuFeatureScope scope(masm(), SSE2); |
Register output_reg = ToRegister(instr->result()); |
XMMRegister input_reg = ToDoubleRegister(instr->value()); |
- XMMRegister xmm_scratch = xmm0; |
+ XMMRegister xmm_scratch = double_scratch0(); |
XMMRegister input_temp = ToDoubleRegister(instr->temp()); |
ExternalReference one_half = ExternalReference::address_of_one_half(); |
ExternalReference minus_one_half = |
@@ -4081,7 +4085,7 @@ void LCodeGen::DoMathSqrt(LMathSqrt* instr) { |
void LCodeGen::DoMathPowHalf(LMathPowHalf* instr) { |
CpuFeatureScope scope(masm(), SSE2); |
- XMMRegister xmm_scratch = xmm0; |
+ XMMRegister xmm_scratch = double_scratch0(); |
XMMRegister input_reg = ToDoubleRegister(instr->value()); |
Register scratch = ToRegister(instr->temp()); |
ASSERT(ToDoubleRegister(instr->result()).is(input_reg)); |
@@ -4200,8 +4204,7 @@ void LCodeGen::DoRandom(LRandom* instr) { |
// by computing: |
// ( 1.(20 0s)(32 random bits) x 2^20 ) - (1.0 x 2^20)). |
XMMRegister result = ToDoubleRegister(instr->result()); |
- // We use xmm0 as fixed scratch register here. |
- XMMRegister scratch4 = xmm0; |
+ XMMRegister scratch4 = double_scratch0(); |
__ mov(scratch3, Immediate(0x49800000)); // 1.0 x 2^20 as single. |
__ movd(scratch4, scratch3); |
__ movd(result, random); |
@@ -4215,9 +4218,10 @@ void LCodeGen::DoMathLog(LMathLog* instr) { |
CpuFeatureScope scope(masm(), SSE2); |
ASSERT(instr->value()->Equals(instr->result())); |
XMMRegister input_reg = ToDoubleRegister(instr->value()); |
+ XMMRegister xmm_scratch = double_scratch0(); |
Label positive, done, zero; |
- __ xorps(xmm0, xmm0); |
- __ ucomisd(input_reg, xmm0); |
+ __ xorps(xmm_scratch, xmm_scratch); |
+ __ ucomisd(input_reg, xmm_scratch); |
__ j(above, &positive, Label::kNear); |
__ j(equal, &zero, Label::kNear); |
ExternalReference nan = |
@@ -4247,10 +4251,11 @@ void LCodeGen::DoMathExp(LMathExp* instr) { |
CpuFeatureScope scope(masm(), SSE2); |
XMMRegister input = ToDoubleRegister(instr->value()); |
XMMRegister result = ToDoubleRegister(instr->result()); |
+ XMMRegister temp0 = double_scratch0(); |
Register temp1 = ToRegister(instr->temp1()); |
Register temp2 = ToRegister(instr->temp2()); |
- MathExpGenerator::EmitMathExp(masm(), input, result, xmm0, temp1, temp2); |
+ MathExpGenerator::EmitMathExp(masm(), input, result, temp0, temp1, temp2); |
} |
@@ -4631,8 +4636,9 @@ void LCodeGen::DoStoreKeyedExternalArray(LStoreKeyed* instr) { |
if (elements_kind == EXTERNAL_FLOAT_ELEMENTS) { |
if (CpuFeatures::IsSafeForSnapshot(SSE2)) { |
CpuFeatureScope scope(masm(), SSE2); |
- __ cvtsd2ss(xmm0, ToDoubleRegister(instr->value())); |
- __ movss(operand, xmm0); |
+ XMMRegister xmm_scratch = double_scratch0(); |
+ __ cvtsd2ss(xmm_scratch, ToDoubleRegister(instr->value())); |
+ __ movss(operand, xmm_scratch); |
} else { |
__ fld(0); |
__ fstp_s(operand); |
@@ -5095,6 +5101,7 @@ void LCodeGen::DoDeferredNumberTagI(LInstruction* instr, |
Label slow; |
Register reg = ToRegister(value); |
Register tmp = reg.is(eax) ? ecx : eax; |
+ XMMRegister xmm_scratch = double_scratch0(); |
// Preserve the value of all registers. |
PushSafepointRegistersScope scope(this); |
@@ -5109,7 +5116,7 @@ void LCodeGen::DoDeferredNumberTagI(LInstruction* instr, |
__ xor_(reg, 0x80000000); |
if (CpuFeatures::IsSupported(SSE2)) { |
CpuFeatureScope feature_scope(masm(), SSE2); |
- __ Cvtsi2sd(xmm0, Operand(reg)); |
+ __ Cvtsi2sd(xmm_scratch, Operand(reg)); |
} else { |
__ push(reg); |
__ fild_s(Operand(esp, 0)); |
@@ -5118,7 +5125,7 @@ void LCodeGen::DoDeferredNumberTagI(LInstruction* instr, |
} else { |
if (CpuFeatures::IsSupported(SSE2)) { |
CpuFeatureScope feature_scope(masm(), SSE2); |
- __ LoadUint32(xmm0, reg, |
+ __ LoadUint32(xmm_scratch, reg, |
ToDoubleRegister(LNumberTagU::cast(instr)->temp())); |
} else { |
// There's no fild variant for unsigned values, so zero-extend to a 64-bit |
@@ -5154,12 +5161,12 @@ void LCodeGen::DoDeferredNumberTagI(LInstruction* instr, |
instr->pointer_map(), 0, Safepoint::kNoLazyDeopt); |
if (!reg.is(eax)) __ mov(reg, eax); |
- // Done. Put the value in xmm0 into the value of the allocated heap |
+ // Done. Put the value in xmm_scratch into the value of the allocated heap |
// number. |
__ bind(&done); |
if (CpuFeatures::IsSupported(SSE2)) { |
CpuFeatureScope feature_scope(masm(), SSE2); |
- __ movdbl(FieldOperand(reg, HeapNumber::kValueOffset), xmm0); |
+ __ movdbl(FieldOperand(reg, HeapNumber::kValueOffset), xmm_scratch); |
} else { |
__ fstp_d(FieldOperand(reg, HeapNumber::kValueOffset)); |
} |
@@ -5349,7 +5356,7 @@ void LCodeGen::EmitNumberUntagD(Register input_reg, |
__ movdbl(result_reg, FieldOperand(input_reg, HeapNumber::kValueOffset)); |
if (deoptimize_on_minus_zero) { |
- XMMRegister xmm_scratch = xmm0; |
+ XMMRegister xmm_scratch = double_scratch0(); |
__ xorps(xmm_scratch, xmm_scratch); |
__ ucomisd(result_reg, xmm_scratch); |
__ j(not_zero, &done, Label::kNear); |
@@ -5515,7 +5522,8 @@ void LCodeGen::DoDoubleToI(LDoubleToI* instr) { |
if (CpuFeatures::IsSafeForSnapshot(SSE2)) { |
CpuFeatureScope scope(masm(), SSE2); |
XMMRegister input_reg = ToDoubleRegister(input); |
- __ DoubleToI(result_reg, input_reg, xmm0, |
+ XMMRegister xmm_scratch = double_scratch0(); |
+ __ DoubleToI(result_reg, input_reg, xmm_scratch, |
instr->hydrogen()->GetMinusZeroMode(), &bailout, Label::kNear); |
} else { |
X87Register input_reg = ToX87Register(input); |
@@ -5542,7 +5550,8 @@ void LCodeGen::DoDoubleToSmi(LDoubleToSmi* instr) { |
if (CpuFeatures::IsSafeForSnapshot(SSE2)) { |
CpuFeatureScope scope(masm(), SSE2); |
XMMRegister input_reg = ToDoubleRegister(input); |
- __ DoubleToI(result_reg, input_reg, xmm0, |
+ XMMRegister xmm_scratch = double_scratch0(); |
+ __ DoubleToI(result_reg, input_reg, xmm_scratch, |
instr->hydrogen()->GetMinusZeroMode(), &bailout, Label::kNear); |
} else { |
X87Register input_reg = ToX87Register(input); |
@@ -5706,8 +5715,9 @@ void LCodeGen::DoCheckMaps(LCheckMaps* instr) { |
void LCodeGen::DoClampDToUint8(LClampDToUint8* instr) { |
CpuFeatureScope scope(masm(), SSE2); |
XMMRegister value_reg = ToDoubleRegister(instr->unclamped()); |
+ XMMRegister xmm_scratch = double_scratch0(); |
Register result_reg = ToRegister(instr->result()); |
- __ ClampDoubleToUint8(value_reg, xmm0, result_reg); |
+ __ ClampDoubleToUint8(value_reg, xmm_scratch, result_reg); |
} |
@@ -5723,6 +5733,7 @@ void LCodeGen::DoClampTToUint8(LClampTToUint8* instr) { |
ASSERT(instr->unclamped()->Equals(instr->result())); |
Register input_reg = ToRegister(instr->unclamped()); |
+ XMMRegister xmm_scratch = double_scratch0(); |
Label is_smi, done, heap_number; |
__ JumpIfSmi(input_reg, &is_smi); |
@@ -5741,8 +5752,8 @@ void LCodeGen::DoClampTToUint8(LClampTToUint8* instr) { |
// Heap number |
__ bind(&heap_number); |
- __ movdbl(xmm0, FieldOperand(input_reg, HeapNumber::kValueOffset)); |
- __ ClampDoubleToUint8(xmm0, xmm1, input_reg); |
+ __ movdbl(xmm_scratch, FieldOperand(input_reg, HeapNumber::kValueOffset)); |
+ __ ClampDoubleToUint8(xmm_scratch, xmm1, input_reg); |
__ jmp(&done, Label::kNear); |
// smi |