Chromium Code Reviews| Index: src/arm/deoptimizer-arm.cc |
| =================================================================== |
| --- src/arm/deoptimizer-arm.cc (revision 7795) |
| +++ src/arm/deoptimizer-arm.cc (working copy) |
| @@ -550,12 +550,11 @@ |
| kDoubleSize * DwVfpRegister::kNumAllocatableRegisters; |
| // Save all general purpose registers before messing with them. |
|
Søren Thygesen Gjesse
2011/05/06 10:12:37
Please also change the comment - it was already wr
m.m.capewell
2011/05/10 10:40:25
Done.
|
| - __ sub(sp, sp, Operand(kDoubleRegsSize)); |
| - for (int i = 0; i < DwVfpRegister::kNumAllocatableRegisters; ++i) { |
| - DwVfpRegister vfp_reg = DwVfpRegister::FromAllocationIndex(i); |
| - int offset = i * kDoubleSize; |
| - __ vstr(vfp_reg, sp, offset); |
| - } |
| + DwVfpRegister first = DwVfpRegister::FromAllocationIndex(0); |
|
Søren Thygesen Gjesse
2011/05/06 10:12:37
We should have an assert here checking that all do
m.m.capewell
2011/05/10 10:40:25
Done.
|
| + DwVfpRegister last = |
| + DwVfpRegister::FromAllocationIndex( |
| + DwVfpRegister::kNumAllocatableRegisters - 1); |
| + __ vstm(db_w, sp, first, last); |
| // Push all 16 registers (needed to populate FrameDescription::registers_). |
| __ stm(db_w, sp, restored_regs | sp.bit() | lr.bit() | pc.bit()); |
| @@ -603,22 +602,31 @@ |
| // Copy core registers into FrameDescription::registers_[kNumRegisters]. |
| ASSERT(Register::kNumRegisters == kNumberOfRegisters); |
| - for (int i = 0; i < kNumberOfRegisters; i++) { |
| - int offset = (i * kPointerSize) + FrameDescription::registers_offset(); |
| - __ ldr(r2, MemOperand(sp, i * kPointerSize)); |
| - __ str(r2, MemOperand(r1, offset)); |
| - } |
| + ASSERT(kNumberOfRegisters % 2 == 0); |
| + Label arm_loop; |
| + __ add(r6, r1, Operand(FrameDescription::registers_offset())); |
| + __ mov(r5, Operand(sp)); |
| + __ mov(r4, Operand(kNumberOfRegisters / 2)); |
| + |
| + __ bind(&arm_loop); |
| + __ Ldrd(r2, r3, MemOperand(r5, kPointerSize * 2, PostIndex)); |
| + __ sub(r4, r4, Operand(1), SetCC); |
| + __ Strd(r2, r3, MemOperand(r6, kPointerSize * 2, PostIndex)); |
| + __ b(gt, &arm_loop); |
| + |
| // Copy VFP registers to |
| // double_registers_[DoubleRegister::kNumAllocatableRegisters] |
| - int double_regs_offset = FrameDescription::double_registers_offset(); |
| - for (int i = 0; i < DwVfpRegister::kNumAllocatableRegisters; ++i) { |
| - int dst_offset = i * kDoubleSize + double_regs_offset; |
| - int src_offset = i * kDoubleSize + kNumberOfRegisters * kPointerSize; |
| - __ vldr(d0, sp, src_offset); |
| - __ vstr(d0, r1, dst_offset); |
| - } |
| + Label vfp_loop; |
| + __ add(r6, r1, Operand(FrameDescription::double_registers_offset())); |
| + __ mov(r4, Operand(DwVfpRegister::kNumAllocatableRegisters)); |
| + __ bind(&vfp_loop); |
| + __ Ldrd(r2, r3, MemOperand(r5, kDoubleSize, PostIndex)); |
| + __ sub(r4, r4, Operand(1), SetCC); |
| + __ Strd(r2, r3, MemOperand(r6, kDoubleSize, PostIndex)); |
| + __ b(gt, &vfp_loop); |
| + |
| // Remove the bailout id, eventually return address, and the saved registers |
| // from the stack. |
| if (type() == EAGER || type() == OSR) { |