Index: src/arm/macro-assembler-arm.cc |
=================================================================== |
--- src/arm/macro-assembler-arm.cc (revision 4723) |
+++ src/arm/macro-assembler-arm.cc (working copy) |
@@ -354,6 +354,51 @@ |
} |
+void MacroAssembler::Ldrd(Register dst1, Register dst2, |
+ const MemOperand& src, Condition cond) { |
+ ASSERT(src.rm().is(no_reg)); |
+ ASSERT(!dst1.is(lr)); // r14. |
+ ASSERT_EQ(0, dst1.code() % 2); |
+ ASSERT_EQ(dst1.code() + 1, dst2.code()); |
+ |
+ // Generate two ldr instructions if ldrd is not available. |
+ if (CpuFeatures::IsSupported(ARMv7)) { |
+ CpuFeatures::Scope scope(ARMv7); |
+ ldrd(dst1, dst2, src, cond); |
+ } else { |
+ MemOperand src2(src); |
+ src2.set_offset(src2.offset() + 4); |
+ if (dst1.is(src.rn())) { |
+ ldr(dst2, src2, cond); |
+ ldr(dst1, src, cond); |
+ } else { |
+ ldr(dst1, src, cond); |
+ ldr(dst2, src2, cond); |
+ } |
+ } |
+} |
+ |
+ |
+void MacroAssembler::Strd(Register src1, Register src2, |
+ const MemOperand& dst, Condition cond) { |
+ ASSERT(dst.rm().is(no_reg)); |
+ ASSERT(!src1.is(lr)); // r14. |
+ ASSERT_EQ(0, src1.code() % 2); |
+ ASSERT_EQ(src1.code() + 1, src2.code()); |
+ |
+ // Generate two str instructions if strd is not available. |
+ if (CpuFeatures::IsSupported(ARMv7)) { |
+ CpuFeatures::Scope scope(ARMv7); |
+ strd(src1, src2, dst, cond); |
+ } else { |
+ MemOperand dst2(dst); |
+ dst2.set_offset(dst2.offset() + 4); |
+ str(src1, dst, cond); |
+ str(src2, dst2, cond); |
+ } |
+} |
+ |
+ |
void MacroAssembler::EnterFrame(StackFrame::Type type) { |
// r0-r3: preserved |
stm(db_w, sp, cp.bit() | fp.bit() | lr.bit()); |