Index: src/arm/assembler-arm.cc |
diff --git a/src/arm/assembler-arm.cc b/src/arm/assembler-arm.cc |
index 5e8f14ab0e3eaada8bd9799c1e7f718c74b4eef2..df45159767baf629160e2ddb694f8e0fefad0dc2 100644 |
--- a/src/arm/assembler-arm.cc |
+++ b/src/arm/assembler-arm.cc |
@@ -1544,6 +1544,15 @@ void Assembler::sdiv(Register dst, Register src1, Register src2, |
} |
+void Assembler::udiv(Register dst, Register src1, Register src2, |
+ Condition cond) { |
+ ASSERT(!dst.is(pc) && !src1.is(pc) && !src2.is(pc)); |
+ ASSERT(IsEnabled(SUDIV)); |
+ emit(cond | B26 | B25 | B24 | B21 | B20 | dst.code() * B16 | 0xf * B12 | |
+ src2.code() * B8 | B4 | src1.code()); |
+} |
+ |
+ |
void Assembler::mul(Register dst, Register src1, Register src2, |
SBit s, Condition cond) { |
ASSERT(!dst.is(pc) && !src1.is(pc) && !src2.is(pc)); |
@@ -2156,9 +2165,14 @@ void Assembler::vldr(const DwVfpRegister dst, |
void Assembler::vldr(const DwVfpRegister dst, |
const MemOperand& operand, |
const Condition cond) { |
- ASSERT(!operand.rm().is_valid()); |
ASSERT(operand.am_ == Offset); |
- vldr(dst, operand.rn(), operand.offset(), cond); |
+ if (operand.rm().is_valid()) { |
+ add(ip, operand.rn(), |
+ Operand(operand.rm(), operand.shift_op_, operand.shift_imm_)); |
+ vldr(dst, ip, 0, cond); |
+ } else { |
+ vldr(dst, operand.rn(), operand.offset(), cond); |
+ } |
} |
@@ -2199,9 +2213,14 @@ void Assembler::vldr(const SwVfpRegister dst, |
void Assembler::vldr(const SwVfpRegister dst, |
const MemOperand& operand, |
const Condition cond) { |
- ASSERT(!operand.rm().is_valid()); |
ASSERT(operand.am_ == Offset); |
- vldr(dst, operand.rn(), operand.offset(), cond); |
+ if (operand.rm().is_valid()) { |
+ add(ip, operand.rn(), |
+ Operand(operand.rm(), operand.shift_op_, operand.shift_imm_)); |
+ vldr(dst, ip, 0, cond); |
+ } else { |
+ vldr(dst, operand.rn(), operand.offset(), cond); |
+ } |
} |
@@ -2242,9 +2261,14 @@ void Assembler::vstr(const DwVfpRegister src, |
void Assembler::vstr(const DwVfpRegister src, |
const MemOperand& operand, |
const Condition cond) { |
- ASSERT(!operand.rm().is_valid()); |
ASSERT(operand.am_ == Offset); |
- vstr(src, operand.rn(), operand.offset(), cond); |
+ if (operand.rm().is_valid()) { |
+ add(ip, operand.rn(), |
+ Operand(operand.rm(), operand.shift_op_, operand.shift_imm_)); |
+ vstr(src, ip, 0, cond); |
+ } else { |
+ vstr(src, operand.rn(), operand.offset(), cond); |
+ } |
} |
@@ -2284,9 +2308,14 @@ void Assembler::vstr(const SwVfpRegister src, |
void Assembler::vstr(const SwVfpRegister src, |
const MemOperand& operand, |
const Condition cond) { |
- ASSERT(!operand.rm().is_valid()); |
ASSERT(operand.am_ == Offset); |
- vstr(src, operand.rn(), operand.offset(), cond); |
+ if (operand.rm().is_valid()) { |
+ add(ip, operand.rn(), |
+ Operand(operand.rm(), operand.shift_op_, operand.shift_imm_)); |
+ vstr(src, ip, 0, cond); |
+ } else { |
+ vstr(src, operand.rn(), operand.offset(), cond); |
+ } |
} |
@@ -3125,6 +3154,7 @@ bool Assembler::IsNop(Instr instr, int type) { |
} |
+// static |
bool Assembler::ImmediateFitsAddrMode1Instruction(int32_t imm32) { |
uint32_t dummy1; |
uint32_t dummy2; |