From: sgjesse@chromium.org Date: Thu, 26 May 2011 13:52:14 +0000 (+0000) Subject: ARM: Avoid using ldrd/strd with post increment X-Git-Tag: upstream/4.7.83~19295 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=5cd77037aa23c2b84175918126e292b454e62884;p=platform%2Fupstream%2Fv8.git ARM: Avoid using ldrd/strd with post increment These instructions seems to cause problems in some situations. This reverts parts of r7873. R=erik.corry@gmail.com BUG=none TEST=none Review URL: http://codereview.chromium.org//6962010 git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@8080 ce2b1a6d-e550-0410-aec6-3dcde31c8c00 --- diff --git a/src/arm/deoptimizer-arm.cc b/src/arm/deoptimizer-arm.cc index 0298b0d..e0e84ab 100644 --- a/src/arm/deoptimizer-arm.cc +++ b/src/arm/deoptimizer-arm.cc @@ -611,30 +611,21 @@ void Deoptimizer::EntryGenerator::Generate() { // Copy core registers into FrameDescription::registers_[kNumRegisters]. ASSERT(Register::kNumRegisters == kNumberOfRegisters); - 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); + 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)); + } // Copy VFP registers to // double_registers_[DoubleRegister::kNumAllocatableRegisters] - 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); + 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); + } // Remove the bailout id, eventually return address, and the saved registers // from the stack.