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); |
+ } |
} |
} |