Index: src/arm/lithium-codegen-arm.cc |
diff --git a/src/arm/lithium-codegen-arm.cc b/src/arm/lithium-codegen-arm.cc |
index 192add00a9a9dacbad28705ccbd590df25db900c..57815bdbaf2be43545f4e30f0458ca680405d285 100644 |
--- a/src/arm/lithium-codegen-arm.cc |
+++ b/src/arm/lithium-codegen-arm.cc |
@@ -1178,7 +1178,7 @@ void LCodeGen::DoModI(LModI* instr) { |
DwVfpRegister dividend = ToDoubleRegister(instr->temp()); |
DwVfpRegister divisor = ToDoubleRegister(instr->temp2()); |
ASSERT(!divisor.is(dividend)); |
- DwVfpRegister quotient = double_scratch0(); |
+ LowDwVfpRegister quotient = double_scratch0(); |
ASSERT(!quotient.is(dividend)); |
ASSERT(!quotient.is(divisor)); |
@@ -1194,11 +1194,10 @@ void LCodeGen::DoModI(LModI* instr) { |
// Load the arguments in VFP registers. The divisor value is preloaded |
// before. Be careful that 'right_reg' is only live on entry. |
// TODO(svenpanne) The last comments seems to be wrong nowadays. |
- __ vmov(dividend.low(), left_reg); |
- __ vmov(divisor.low(), right_reg); |
- |
- __ vcvt_f64_s32(dividend, dividend.low()); |
- __ vcvt_f64_s32(divisor, divisor.low()); |
+ __ vmov(double_scratch0().low(), left_reg); |
+ __ vcvt_f64_s32(dividend, double_scratch0().low()); |
+ __ vmov(double_scratch0().low(), right_reg); |
+ __ vcvt_f64_s32(divisor, double_scratch0().low()); |
// We do not care about the sign of the divisor. Note that we still handle |
// the kMinInt % -1 case correctly, though. |
@@ -1209,10 +1208,9 @@ void LCodeGen::DoModI(LModI* instr) { |
__ vcvt_f64_s32(quotient, quotient.low()); |
// Compute the remainder in result. |
- DwVfpRegister double_scratch = dividend; |
- __ vmul(double_scratch, divisor, quotient); |
- __ vcvt_s32_f64(double_scratch.low(), double_scratch); |
- __ vmov(scratch, double_scratch.low()); |
+ __ vmul(double_scratch0(), divisor, quotient); |
+ __ vcvt_s32_f64(double_scratch0().low(), double_scratch0()); |
+ __ vmov(scratch, double_scratch0().low()); |
__ sub(result_reg, left_reg, scratch, SetCC); |
// If we care about -0, test if the dividend is <0 and the result is 0. |
@@ -1412,20 +1410,20 @@ void LCodeGen::DoDivI(LDivI* instr) { |
} else { |
const DoubleRegister vleft = ToDoubleRegister(instr->temp()); |
const DoubleRegister vright = double_scratch0(); |
- __ vmov(vleft.low(), left); |
- __ vmov(vright.low(), right); |
- __ vcvt_f64_s32(vleft, vleft.low()); |
- __ vcvt_f64_s32(vright, vright.low()); |
+ __ vmov(double_scratch0().low(), left); |
+ __ vcvt_f64_s32(vleft, double_scratch0().low()); |
+ __ vmov(double_scratch0().low(), right); |
+ __ vcvt_f64_s32(vright, double_scratch0().low()); |
__ vdiv(vleft, vleft, vright); // vleft now contains the result. |
- __ vcvt_s32_f64(vright.low(), vleft); |
- __ vmov(result, vright.low()); |
+ __ vcvt_s32_f64(double_scratch0().low(), vleft); |
+ __ vmov(result, double_scratch0().low()); |
if (!instr->hydrogen()->CheckFlag( |
HInstruction::kAllUsesTruncatingToInt32)) { |
// Deopt if exact conversion to integer was not possible. |
// Use vright as scratch register. |
- __ vcvt_f64_s32(vright, vright.low()); |
- __ VFPCompareAndSetFlags(vleft, vright); |
+ __ vcvt_f64_s32(double_scratch0(), double_scratch0().low()); |
+ __ VFPCompareAndSetFlags(vleft, double_scratch0()); |
DeoptimizeIf(ne, instr->environment()); |
} |
} |
@@ -3186,8 +3184,8 @@ void LCodeGen::DoLoadKeyedExternalArray(LLoadKeyed* instr) { |
: Operand(key, LSL, shift_size); |
__ add(scratch0(), external_pointer, operand); |
if (elements_kind == EXTERNAL_FLOAT_ELEMENTS) { |
- __ vldr(kScratchDoubleReg.low(), scratch0(), additional_offset); |
- __ vcvt_f64_f32(result, kScratchDoubleReg.low()); |
+ __ vldr(double_scratch0().low(), scratch0(), additional_offset); |
+ __ vcvt_f64_f32(result, double_scratch0().low()); |
} else { // i.e. elements_kind == EXTERNAL_DOUBLE_ELEMENTS |
__ vldr(result, scratch0(), additional_offset); |
} |
@@ -3755,7 +3753,6 @@ void LCodeGen::DoMathFloor(LMathFloor* instr) { |
Register input_high = scratch0(); |
Label done, exact; |
- __ vmov(input_high, input.high()); |
__ TryInt32Floor(result, input, input_high, double_scratch0(), &done, &exact); |
DeoptimizeIf(al, instr->environment()); |
@@ -3788,7 +3785,7 @@ void LCodeGen::DoMathRound(LMathRound* instr) { |
// If the input is +0.5, the result is 1. |
__ b(hi, &convert); // Out of [-0.5, +0.5]. |
if (instr->hydrogen()->CheckFlag(HValue::kBailoutOnMinusZero)) { |
- __ vmov(input_high, input.high()); |
+ __ VmovHigh(input_high, input); |
__ cmp(input_high, Operand::Zero()); |
DeoptimizeIf(mi, instr->environment()); // [-0.5, -0]. |
} |
@@ -3801,7 +3798,6 @@ void LCodeGen::DoMathRound(LMathRound* instr) { |
__ bind(&convert); |
__ vadd(input_plus_dot_five, input, dot_five); |
- __ vmov(input_high, input_plus_dot_five.high()); |
// Reuse dot_five (double_scratch0) as we no longer need this value. |
__ TryInt32Floor(result, input_plus_dot_five, input_high, double_scratch0(), |
&done, &done); |
@@ -4724,8 +4720,7 @@ void LCodeGen::DoDeferredNumberTagI(LInstruction* instr, |
Label slow; |
Register src = ToRegister(value); |
Register dst = ToRegister(instr->result()); |
- DwVfpRegister dbl_scratch = double_scratch0(); |
- SwVfpRegister flt_scratch = dbl_scratch.low(); |
+ LowDwVfpRegister dbl_scratch = double_scratch0(); |
// Preserve the value of all registers. |
PushSafepointRegistersScope scope(this, Safepoint::kWithRegisters); |
@@ -4739,11 +4734,11 @@ void LCodeGen::DoDeferredNumberTagI(LInstruction* instr, |
__ SmiUntag(src, dst); |
__ eor(src, src, Operand(0x80000000)); |
} |
- __ vmov(flt_scratch, src); |
- __ vcvt_f64_s32(dbl_scratch, flt_scratch); |
+ __ vmov(dbl_scratch.low(), src); |
+ __ vcvt_f64_s32(dbl_scratch, dbl_scratch.low()); |
} else { |
- __ vmov(flt_scratch, src); |
- __ vcvt_f64_u32(dbl_scratch, flt_scratch); |
+ __ vmov(dbl_scratch.low(), src); |
+ __ vcvt_f64_u32(dbl_scratch, dbl_scratch.low()); |
} |
if (FLAG_inline_new) { |
@@ -4804,7 +4799,7 @@ void LCodeGen::DoNumberTagD(LNumberTagD* instr) { |
DwVfpRegister input_reg = ToDoubleRegister(instr->value()); |
__ VFPCompareAndSetFlags(input_reg, input_reg); |
__ b(vc, &no_special_nan_handling); |
- __ vmov(scratch, input_reg.high()); |
+ __ VmovHigh(scratch, input_reg); |
__ cmp(scratch, Operand(kHoleNanUpper32)); |
// If not the hole NaN, force the NaN to be canonical. |
__ VFPCanonicalizeNaN(input_reg, ne); |
@@ -4904,22 +4899,20 @@ void LCodeGen::EmitNumberUntagD(Register input_reg, |
DeoptimizeIf(ne, env); |
__ bind(&convert); |
- __ LoadRoot(ip, Heap::kNanValueRootIndex); |
- __ sub(ip, ip, Operand(kHeapObjectTag)); |
- __ vldr(result_reg, ip, HeapNumber::kValueOffset); |
+ __ LoadRoot(scratch, Heap::kNanValueRootIndex); |
+ __ vldr(result_reg, scratch, HeapNumber::kValueOffset - kHeapObjectTag); |
__ jmp(&done); |
__ bind(&heap_number); |
} |
// Heap number to double register conversion. |
- __ sub(ip, input_reg, Operand(kHeapObjectTag)); |
- __ vldr(result_reg, ip, HeapNumber::kValueOffset); |
+ __ vldr(result_reg, input_reg, HeapNumber::kValueOffset - kHeapObjectTag); |
if (deoptimize_on_minus_zero) { |
- __ vmov(ip, result_reg.low()); |
- __ cmp(ip, Operand::Zero()); |
+ __ VmovLow(scratch, result_reg); |
+ __ cmp(scratch, Operand::Zero()); |
__ b(ne, &done); |
- __ vmov(ip, result_reg.high()); |
- __ cmp(ip, Operand(HeapNumber::kSignMask)); |
+ __ VmovHigh(scratch, result_reg); |
+ __ cmp(scratch, Operand(HeapNumber::kSignMask)); |
DeoptimizeIf(eq, env); |
} |
__ jmp(&done); |
@@ -4941,7 +4934,7 @@ void LCodeGen::DoDeferredTaggedToI(LTaggedToI* instr) { |
Register input_reg = ToRegister(instr->value()); |
Register scratch1 = scratch0(); |
Register scratch2 = ToRegister(instr->temp()); |
- DwVfpRegister double_scratch = double_scratch0(); |
+ LowDwVfpRegister double_scratch = double_scratch0(); |
DwVfpRegister double_scratch2 = ToDoubleRegister(instr->temp3()); |
ASSERT(!scratch1.is(input_reg) && !scratch1.is(scratch2)); |
@@ -4989,14 +4982,14 @@ void LCodeGen::DoDeferredTaggedToI(LTaggedToI* instr) { |
DeoptimizeIf(ne, instr->environment()); |
__ sub(ip, input_reg, Operand(kHeapObjectTag)); |
- __ vldr(double_scratch, ip, HeapNumber::kValueOffset); |
- __ TryDoubleToInt32Exact(input_reg, double_scratch, double_scratch2); |
+ __ vldr(double_scratch2, ip, HeapNumber::kValueOffset); |
+ __ TryDoubleToInt32Exact(input_reg, double_scratch2, double_scratch); |
DeoptimizeIf(ne, instr->environment()); |
if (instr->hydrogen()->CheckFlag(HValue::kBailoutOnMinusZero)) { |
__ cmp(input_reg, Operand::Zero()); |
__ b(ne, &done); |
- __ vmov(scratch1, double_scratch.high()); |
+ __ VmovHigh(scratch1, double_scratch2); |
__ tst(scratch1, Operand(HeapNumber::kSignMask)); |
DeoptimizeIf(ne, instr->environment()); |
} |
@@ -5069,7 +5062,7 @@ void LCodeGen::DoDoubleToI(LDoubleToI* instr) { |
Register scratch1 = scratch0(); |
Register scratch2 = ToRegister(instr->temp()); |
DwVfpRegister double_input = ToDoubleRegister(instr->value()); |
- DwVfpRegister double_scratch = double_scratch0(); |
+ LowDwVfpRegister double_scratch = double_scratch0(); |
if (instr->truncating()) { |
Register scratch3 = ToRegister(instr->temp2()); |
@@ -5083,7 +5076,7 @@ void LCodeGen::DoDoubleToI(LDoubleToI* instr) { |
Label done; |
__ cmp(result_reg, Operand::Zero()); |
__ b(ne, &done); |
- __ vmov(scratch1, double_input.high()); |
+ __ VmovHigh(scratch1, double_input); |
__ tst(scratch1, Operand(HeapNumber::kSignMask)); |
DeoptimizeIf(ne, instr->environment()); |
__ bind(&done); |
@@ -5097,7 +5090,7 @@ void LCodeGen::DoDoubleToSmi(LDoubleToSmi* instr) { |
Register scratch1 = scratch0(); |
Register scratch2 = ToRegister(instr->temp()); |
DwVfpRegister double_input = ToDoubleRegister(instr->value()); |
- DwVfpRegister double_scratch = double_scratch0(); |
+ LowDwVfpRegister double_scratch = double_scratch0(); |
if (instr->truncating()) { |
Register scratch3 = ToRegister(instr->temp2()); |
@@ -5111,7 +5104,7 @@ void LCodeGen::DoDoubleToSmi(LDoubleToSmi* instr) { |
Label done; |
__ cmp(result_reg, Operand::Zero()); |
__ b(ne, &done); |
- __ vmov(scratch1, double_input.high()); |
+ __ VmovHigh(scratch1, double_input); |
__ tst(scratch1, Operand(HeapNumber::kSignMask)); |
DeoptimizeIf(ne, instr->environment()); |
__ bind(&done); |
@@ -5232,8 +5225,7 @@ void LCodeGen::DoCheckMaps(LCheckMaps* instr) { |
void LCodeGen::DoClampDToUint8(LClampDToUint8* instr) { |
DwVfpRegister value_reg = ToDoubleRegister(instr->unclamped()); |
Register result_reg = ToRegister(instr->result()); |
- DwVfpRegister temp_reg = ToDoubleRegister(instr->temp()); |
- __ ClampDoubleToUint8(result_reg, value_reg, temp_reg); |
+ __ ClampDoubleToUint8(result_reg, value_reg, double_scratch0()); |
} |
@@ -5268,9 +5260,8 @@ void LCodeGen::DoClampTToUint8(LClampTToUint8* instr) { |
// Heap number |
__ bind(&heap_number); |
- __ vldr(double_scratch0(), FieldMemOperand(input_reg, |
- HeapNumber::kValueOffset)); |
- __ ClampDoubleToUint8(result_reg, double_scratch0(), temp_reg); |
+ __ vldr(temp_reg, FieldMemOperand(input_reg, HeapNumber::kValueOffset)); |
+ __ ClampDoubleToUint8(result_reg, temp_reg, double_scratch0()); |
__ jmp(&done); |
// smi |
@@ -5443,8 +5434,7 @@ void LCodeGen::DoRegExpLiteral(LRegExpLiteral* instr) { |
__ bind(&allocated); |
// Copy the content into the newly allocated memory. |
- __ CopyFields(r0, r1, double_scratch0(), double_scratch0().low(), |
- size / kPointerSize); |
+ __ CopyFields(r0, r1, double_scratch0(), size / kPointerSize); |
} |