ARM: Add PostIndex support to Ldrd/Strd macro fallback code.
BUG=none TEST=none Review URL: http://codereview.chromium.org//7080052 Patch from Martyn Capewell <m.m.capewell@googlemail.com>. git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@8380 ce2b1a6d-e550-0410-aec6-3dcde31c8c00
This commit is contained in:
parent
2b77b78446
commit
8677fd370c
@ -455,6 +455,7 @@ class MemOperand BASE_EMBEDDED {
|
||||
|
||||
Register rn() const { return rn_; }
|
||||
Register rm() const { return rm_; }
|
||||
AddrMode am() const { return am_; }
|
||||
|
||||
bool OffsetIsUint12Encodable() const {
|
||||
return offset_ >= 0 ? is_uint12(offset_) : is_uint12(-offset_);
|
||||
|
@ -647,19 +647,36 @@ void MacroAssembler::Ldrd(Register dst1, Register dst2,
|
||||
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 @@ void MacroAssembler::Strd(Register src1, Register src2,
|
||||
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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user