Index: src/arm/assembler-arm.h |
diff --git a/src/arm/assembler-arm.h b/src/arm/assembler-arm.h |
index 09392941715ce7e2f135733fb35bc5437a187e94..6fb692f22ef4616786f8740d93eaae44e484480d 100644 |
--- a/src/arm/assembler-arm.h |
+++ b/src/arm/assembler-arm.h |
@@ -785,6 +785,7 @@ class Assembler : public AssemblerBase { |
// Size of an instruction. |
static const int kInstrSize = sizeof(Instr); |
+ static const int kInstr16Size = sizeof(Instr16); |
// Distance between start of patched return sequence and the emitted address |
// to jump to. |
@@ -1367,6 +1368,10 @@ class Assembler : public AssemblerBase { |
Instr16 thumb16_instr_at(int pos) { |
return *reinterpret_cast<Instr16*>(buffer_ + pos); |
} |
+ Instr thumb32_instr_at(int pos) { |
+ return (*reinterpret_cast<Instr16*>(buffer_ + pos) << 16) | |
+ (*reinterpret_cast<Instr16*>(buffer_ + pos + 2) & 0xffff); |
+ } |
void instr_at_put(int pos, Instr instr) { |
*reinterpret_cast<Instr*>(buffer_ + pos) = instr; |
} |
@@ -1535,6 +1540,7 @@ class Assembler : public AssemblerBase { |
void GrowBuffer(); |
inline void emit(Instr x); |
inline void emit16(Instr16 x, bool check_buffer = true); |
+ inline void emit32(Instr x); // proper half-word order for thumb |
// 32-bit immediate values |
void move_32_bit_immediate(Condition cond, |
@@ -1596,6 +1602,61 @@ class Assembler : public AssemblerBase { |
bool is_low_reg(Register reg); |
bool are_low_reg(Register reg1, Register reg2); |
+ Instr thumb32_mode1(ThumbOpcode32Mode1 op, SBit s); |
+ Instr thumb32_mode3(ThumbOpcode32Mode3 op); |
+ Instr thumb32_mode4(ThumbOpcode32Mode4 op); |
+ Instr thumb32_mode5(); |
+ Instr thumb32_mode6(ThumbOpcode32Mode6 op1, ThumbOpcode32Mode6 op2); |
+ Instr thumb32_mode7(ThumbOpcode32Mode7 op); |
+ Instr thumb32_mode8(ThumbOpcode32Mode8 op); |
+ Instr thumb32_mode9(ThumbOpcode32Mode9 op); |
+ Instr thumb32_mode10(ThumbOpcode32Mode10 op); |
+ Instr thumb32_mode11(ThumbOpcode32Mode11 op, SBit s); |
+ Instr thumb32_mode12(ThumbOpcode32Mode12 op1); |
+ Instr thumb32_mode16(ThumbOpcode32Mode16 op2); |
+ Instr thumb32_mode17(ThumbOpcode32Mode17 op); |
+ |
+ bool thumb_expand_imm(uint32_t imm32, |
+ uint32_t* i, |
+ uint32_t* imm3, |
+ uint32_t* imm8); |
+ Instr thumb32_1reg_zero_extend_imm_split_4i38(Register rd, |
+ uint32_t imm); |
+ Instr thumb32_sign_extend_imm24(int imm); |
+ Instr thumb32_2reg_zero_extend_imm12(Register rd, |
+ const MemOperand& x); |
+ Instr thumb32_2reg_zero_extend_imm8(Register rd, |
+ const MemOperand& x); |
+ Instr thumb32_3reg_zero_extend_imm8(Register rt, |
+ Register rt2, |
+ const MemOperand& x); |
+ Instr thumb32_2reg_zero_extend_imm_split(Register rn, |
+ Register rd, |
+ const Operand& x); |
+ Instr thumb32_2reg_thumb_expand_imm(Register rn, |
+ Register rd, |
+ uint32_t i, |
+ uint32_t imm3, |
+ uint32_t imm8); |
+ Instr thumb32_3reg_shift_imm8(Register rn, |
+ Register rd, |
+ const Operand& x); |
+ Instr thumb32_bit_field(Register rn, |
+ Register rd, |
+ int split_imm, |
+ int lower_imm); |
+ Instr thumb32_3reg_lsl(Register rd, |
+ const MemOperand& x); |
+ Instr thumb32_3reg_shift(Register rd, |
+ const Operand& x); |
+ Instr thumb32_4reg(Register dst, Register src1, Register src2, |
+ Register srcA); |
+ static uint16_t thumb32_movw_immediate(Instr instr); |
+ static Instr thumb32_instr_at(Address addr); |
+ static Instr thumb32_set_movw_immediate(uint32_t imm); |
+ void thumb32_instr_at_put(int pos, Instr instr); |
+ static void thumb32_instr_at_put(byte* pc, Instr instr); |
+ |
// Labels |
void print(Label* L); |
void bind_to(Label* L, int pos); |