Index: src/arm/macro-assembler-arm.cc |
diff --git a/src/arm/macro-assembler-arm.cc b/src/arm/macro-assembler-arm.cc |
index ba80cdafebbd6c2f400d0194e19c300a9f572289..442f49b378eba59846d0e205b617a5c86758ddf4 100644 |
--- a/src/arm/macro-assembler-arm.cc |
+++ b/src/arm/macro-assembler-arm.cc |
@@ -792,6 +792,46 @@ void MacroAssembler::Vmov(const DwVfpRegister dst, |
} |
+void MacroAssembler::VmovHigh(Register dst, DwVfpRegister src) { |
+ if (src.code() < 16) { |
+ const LowDwVfpRegister loc = LowDwVfpRegister::from_code(src.code()); |
+ vmov(dst, loc.high()); |
+ } else { |
+ vmov(dst, VmovIndexHi, src); |
+ } |
+} |
+ |
+ |
+void MacroAssembler::VmovHigh(DwVfpRegister dst, Register src) { |
+ if (dst.code() < 16) { |
+ const LowDwVfpRegister loc = LowDwVfpRegister::from_code(dst.code()); |
+ vmov(loc.high(), src); |
+ } else { |
+ vmov(dst, VmovIndexHi, src); |
+ } |
+} |
+ |
+ |
+void MacroAssembler::VmovLow(Register dst, DwVfpRegister src) { |
+ if (src.code() < 16) { |
+ const LowDwVfpRegister loc = LowDwVfpRegister::from_code(src.code()); |
+ vmov(dst, loc.low()); |
+ } else { |
+ vmov(dst, VmovIndexLo, src); |
+ } |
+} |
+ |
+ |
+void MacroAssembler::VmovLow(DwVfpRegister dst, Register src) { |
+ if (dst.code() < 16) { |
+ const LowDwVfpRegister loc = LowDwVfpRegister::from_code(dst.code()); |
+ vmov(loc.low(), src); |
+ } else { |
+ vmov(dst, VmovIndexLo, src); |
+ } |
+} |
+ |
+ |
void MacroAssembler::ConvertNumberToInt32(Register object, |
Register dst, |
Register heap_number_map, |
@@ -799,7 +839,7 @@ void MacroAssembler::ConvertNumberToInt32(Register object, |
Register scratch2, |
Register scratch3, |
DwVfpRegister double_scratch1, |
- DwVfpRegister double_scratch2, |
+ LowDwVfpRegister double_scratch2, |
Label* not_number) { |
Label done; |
UntagAndJumpIfSmi(dst, object, &done); |
@@ -813,7 +853,7 @@ void MacroAssembler::ConvertNumberToInt32(Register object, |
void MacroAssembler::LoadNumber(Register object, |
- DwVfpRegister dst, |
+ LowDwVfpRegister dst, |
Register heap_number_map, |
Register scratch, |
Label* not_number) { |
@@ -838,7 +878,7 @@ void MacroAssembler::LoadNumberAsInt32Double(Register object, |
DwVfpRegister double_dst, |
Register heap_number_map, |
Register scratch, |
- DwVfpRegister double_scratch, |
+ LowDwVfpRegister double_scratch, |
Label* not_int32) { |
ASSERT(!scratch.is(object)); |
ASSERT(!heap_number_map.is(object) && !heap_number_map.is(scratch)); |
@@ -870,7 +910,7 @@ void MacroAssembler::LoadNumberAsInt32(Register object, |
Register heap_number_map, |
Register scratch, |
DwVfpRegister double_scratch0, |
- DwVfpRegister double_scratch1, |
+ LowDwVfpRegister double_scratch1, |
Label* not_int32) { |
ASSERT(!dst.is(object)); |
ASSERT(!scratch.is(object)); |
@@ -2066,12 +2106,14 @@ void MacroAssembler::CheckFastSmiElements(Register map, |
} |
-void MacroAssembler::StoreNumberToDoubleElements(Register value_reg, |
- Register key_reg, |
- Register elements_reg, |
- Register scratch1, |
- Label* fail, |
- int elements_offset) { |
+void MacroAssembler::StoreNumberToDoubleElements( |
+ Register value_reg, |
+ Register key_reg, |
+ Register elements_reg, |
+ Register scratch1, |
+ LowDwVfpRegister double_scratch0, |
+ Label* fail, |
+ int elements_offset) { |
Label smi_value, store; |
// Handle smi values specially. |
@@ -2084,23 +2126,24 @@ void MacroAssembler::StoreNumberToDoubleElements(Register value_reg, |
fail, |
DONT_DO_SMI_CHECK); |
- vldr(d0, FieldMemOperand(value_reg, HeapNumber::kValueOffset)); |
+ vldr(double_scratch0, FieldMemOperand(value_reg, HeapNumber::kValueOffset)); |
// Force a canonical NaN. |
if (emit_debug_code()) { |
vmrs(ip); |
tst(ip, Operand(kVFPDefaultNaNModeControlBit)); |
Assert(ne, "Default NaN mode not set"); |
} |
- VFPCanonicalizeNaN(d0); |
+ VFPCanonicalizeNaN(double_scratch0); |
b(&store); |
bind(&smi_value); |
- SmiToDouble(d0, value_reg); |
+ SmiToDouble(double_scratch0, value_reg); |
bind(&store); |
add(scratch1, elements_reg, Operand::DoubleOffsetFromSmiKey(key_reg)); |
- vstr(d0, FieldMemOperand(scratch1, |
- FixedDoubleArray::kHeaderSize - elements_offset)); |
+ vstr(double_scratch0, |
+ FieldMemOperand(scratch1, |
+ FixedDoubleArray::kHeaderSize - elements_offset)); |
} |
@@ -2406,8 +2449,7 @@ void MacroAssembler::IndexFromHash(Register hash, Register index) { |
} |
-void MacroAssembler::SmiToDouble(DwVfpRegister value, Register smi) { |
- ASSERT(value.code() < 16); |
+void MacroAssembler::SmiToDouble(LowDwVfpRegister value, Register smi) { |
if (CpuFeatures::IsSupported(VFP3)) { |
vmov(value.low(), smi); |
vcvt_f64_s32(value, 1); |
@@ -2420,7 +2462,7 @@ void MacroAssembler::SmiToDouble(DwVfpRegister value, Register smi) { |
void MacroAssembler::TestDoubleIsInt32(DwVfpRegister double_input, |
- DwVfpRegister double_scratch) { |
+ LowDwVfpRegister double_scratch) { |
ASSERT(!double_input.is(double_scratch)); |
vcvt_s32_f64(double_scratch.low(), double_input); |
vcvt_f64_s32(double_scratch, double_scratch.low()); |
@@ -2430,7 +2472,7 @@ void MacroAssembler::TestDoubleIsInt32(DwVfpRegister double_input, |
void MacroAssembler::TryDoubleToInt32Exact(Register result, |
DwVfpRegister double_input, |
- DwVfpRegister double_scratch) { |
+ LowDwVfpRegister double_scratch) { |
ASSERT(!double_input.is(double_scratch)); |
vcvt_s32_f64(double_scratch.low(), double_input); |
vmov(result, double_scratch.low()); |
@@ -2442,13 +2484,15 @@ void MacroAssembler::TryDoubleToInt32Exact(Register result, |
void MacroAssembler::TryInt32Floor(Register result, |
DwVfpRegister double_input, |
Register input_high, |
- DwVfpRegister double_scratch, |
+ LowDwVfpRegister double_scratch, |
Label* done, |
Label* exact) { |
ASSERT(!result.is(input_high)); |
ASSERT(!double_input.is(double_scratch)); |
Label negative, exception; |
+ VmovHigh(input_high, double_input); |
+ |
// Test for NaN and infinities. |
Sbfx(result, input_high, |
HeapNumber::kExponentShift, HeapNumber::kExponentBits); |
@@ -2489,7 +2533,7 @@ void MacroAssembler::ECMAToInt32(Register result, |
Register scratch, |
Register scratch_high, |
Register scratch_low, |
- DwVfpRegister double_scratch) { |
+ LowDwVfpRegister double_scratch) { |
ASSERT(!scratch_high.is(result)); |
ASSERT(!scratch_low.is(result)); |
ASSERT(!scratch_low.is(scratch_high)); |
@@ -3143,8 +3187,7 @@ void MacroAssembler::AllocateHeapNumberWithValue(Register result, |
// Copies a fixed number of fields of heap objects from src to dst. |
void MacroAssembler::CopyFields(Register dst, |
Register src, |
- DwVfpRegister double_scratch, |
- SwVfpRegister single_scratch, |
+ LowDwVfpRegister double_scratch, |
int field_count) { |
int double_count = field_count / (DwVfpRegister::kSizeInBytes / kPointerSize); |
for (int i = 0; i < double_count; i++) { |
@@ -3157,9 +3200,9 @@ void MacroAssembler::CopyFields(Register dst, |
int remain = field_count % (DwVfpRegister::kSizeInBytes / kPointerSize); |
if (remain != 0) { |
- vldr(single_scratch, |
+ vldr(double_scratch.low(), |
FieldMemOperand(src, (field_count - 1) * kPointerSize)); |
- vstr(single_scratch, |
+ vstr(double_scratch.low(), |
FieldMemOperand(dst, (field_count - 1) * kPointerSize)); |
} |
} |
@@ -3660,13 +3703,12 @@ void MacroAssembler::ClampUint8(Register output_reg, Register input_reg) { |
void MacroAssembler::ClampDoubleToUint8(Register result_reg, |
DwVfpRegister input_reg, |
- DwVfpRegister temp_double_reg) { |
+ LowDwVfpRegister temp_double_reg) { |
Label above_zero; |
Label done; |
Label in_bounds; |
- Vmov(temp_double_reg, 0.0); |
- VFPCompareAndSetFlags(input_reg, temp_double_reg); |
+ VFPCompareAndSetFlags(input_reg, 0.0); |
b(gt, &above_zero); |
// Double value is less than zero, NaN or Inf, return 0. |
@@ -3688,8 +3730,8 @@ void MacroAssembler::ClampDoubleToUint8(Register result_reg, |
// Set rounding mode to round to the nearest integer by clearing bits[23:22]. |
bic(result_reg, ip, Operand(kVFPRoundingModeMask)); |
vmsr(result_reg); |
- vcvt_s32_f64(input_reg.low(), input_reg, kFPSCRRounding); |
- vmov(result_reg, input_reg.low()); |
+ vcvt_s32_f64(temp_double_reg.low(), input_reg, kFPSCRRounding); |
+ vmov(result_reg, temp_double_reg.low()); |
// Restore FPSCR. |
vmsr(ip); |
bind(&done); |