| Index: src/arm/macro-assembler-arm.cc
|
| ===================================================================
|
| --- src/arm/macro-assembler-arm.cc (revision 8354)
|
| +++ src/arm/macro-assembler-arm.cc (working copy)
|
| @@ -647,19 +647,36 @@
|
| ASSERT_EQ(0, dst1.code() % 2);
|
| ASSERT_EQ(dst1.code() + 1, dst2.code());
|
|
|
| + // V8 does not use this addressing mode, so the fallback code
|
| + // below doesn't support it yet.
|
| + ASSERT((src.am() != PreIndex) && (src.am() != NegPreIndex));
|
| +
|
| // 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);
|
| + if ((src.am() == Offset) || (src.am() == NegOffset)) {
|
| + 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);
|
| + }
|
| + } else { // PostIndex or NegPostIndex.
|
| + ASSERT((src.am() == PostIndex) || (src.am() == NegPostIndex));
|
| + if (dst1.is(src.rn())) {
|
| + ldr(dst2, MemOperand(src.rn(), 4, Offset), cond);
|
| + ldr(dst1, src, cond);
|
| + } else {
|
| + MemOperand src2(src);
|
| + src2.set_offset(src2.offset() - 4);
|
| + ldr(dst1, MemOperand(src.rn(), 4, PostIndex), cond);
|
| + ldr(dst2, src2, cond);
|
| + }
|
| }
|
| }
|
| }
|
| @@ -672,15 +689,26 @@
|
| ASSERT_EQ(0, src1.code() % 2);
|
| ASSERT_EQ(src1.code() + 1, src2.code());
|
|
|
| + // V8 does not use this addressing mode, so the fallback code
|
| + // below doesn't support it yet.
|
| + ASSERT((dst.am() != PreIndex) && (dst.am() != NegPreIndex));
|
| +
|
| // 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);
|
| + if ((dst.am() == Offset) || (dst.am() == NegOffset)) {
|
| + dst2.set_offset(dst2.offset() + 4);
|
| + str(src1, dst, cond);
|
| + str(src2, dst2, cond);
|
| + } else { // PostIndex or NegPostIndex.
|
| + ASSERT((dst.am() == PostIndex) || (dst.am() == NegPostIndex));
|
| + dst2.set_offset(dst2.offset() - 4);
|
| + str(src1, MemOperand(dst.rn(), 4, PostIndex), cond);
|
| + str(src2, dst2, cond);
|
| + }
|
| }
|
| }
|
|
|
|
|