Index: src/arm/assembler-arm.cc |
diff --git a/src/arm/assembler-arm.cc b/src/arm/assembler-arm.cc |
index bd8b0613eb9bea99a87c3f549b12069cbd8c858a..fc33b660011afc7731c5136a4d9a7720bd96353f 100644 |
--- a/src/arm/assembler-arm.cc |
+++ b/src/arm/assembler-arm.cc |
@@ -1088,6 +1088,32 @@ bool Operand::is_single_instruction(const Assembler* assembler, |
} |
+void Assembler::move_32_bit_immediate_thumb(Register rd, |
+ SBit s, |
+ const Operand& x, |
+ Condition cond) { |
+ if (rd.code() != pc.code() && s == LeaveCC) { |
+ if (use_movw_movt(x, this)) { |
+ if (x.must_output_reloc_info(this)) { |
+ RecordRelocInfo(x.rmode_, x.imm32_, DONT_USE_CONSTANT_POOL); |
+ // Make sure the movw/movt doesn't get separated. |
+ BlockConstPoolFor(2); |
+ } |
+ if (cond != al) { |
+ pc_ -= kInstr16Size; |
+ it_thumb(cond, 2, true); |
+ } |
+ emit32(thumb32_mode3(MOV_32_IMM3) | |
+ thumb32_1reg_zero_extend_imm_split_4i38(rd, (x.imm32_ & 0xffff))); |
+ movt_thumb(rd, static_cast<uint32_t>(x.imm32_) >> 16, al); |
+ return; |
+ } |
+ } |
+ RecordRelocInfo(x.rmode_, x.imm32_, USE_CONSTANT_POOL); |
+ ldr_thumb(rd, MemOperand(pc, 0)); |
+} |
+ |
+ |
void Assembler::move_32_bit_immediate(Condition cond, |
Register rd, |
SBit s, |