Index: src/arm/assembler-arm.h |
diff --git a/src/arm/assembler-arm.h b/src/arm/assembler-arm.h |
index 8a443ce1a69434b33403e0eed26e3073469f6705..507a845b11ff8f420555d16813464f0e9590a191 100644 |
--- a/src/arm/assembler-arm.h |
+++ b/src/arm/assembler-arm.h |
@@ -835,6 +835,10 @@ class Assembler : public AssemblerBase { |
// Aligns code to something that's optimal for a jump target for the platform. |
void CodeTargetAlign(); |
+ SBit sbit_from_mode(SBitMode smode) { |
+ return smode == SetCC ? SetCCBit : LeaveCCBit; |
+ } |
+ |
// Branch instructions |
void b(int branch_offset, Condition cond = al); |
void b_thumb(int branch_offset, Condition cond); |
@@ -855,28 +859,28 @@ class Assembler : public AssemblerBase { |
// Data-processing instructions |
void and_(Register dst, Register src1, const Operand& src2, |
- SBit s = LeaveCC, Condition cond = al); |
+ SBitMode smode = DontCareCC, Condition cond = al); |
void and_imm_t1(Register dst, Register src1, SBit s, Condition cond, |
uint32_t i, uint32_t imm3, uint32_t imm8); |
void and_reg_t2(Register dst, Register src1, const Operand& src2, |
SBit s, Condition cond); |
void and_thumb(Register dst, Register src1, const Operand& src2, |
- SBit s, Condition cond); |
+ SBitMode smode, Condition cond); |
void eor(Register dst, Register src1, const Operand& src2, |
- SBit s = LeaveCC, Condition cond = al); |
+ SBitMode smode = DontCareCC, Condition cond = al); |
void eor_imm_t1(Register dst, Register src1, SBit s, Condition cond, |
uint32_t i, uint32_t imm3, uint32_t imm8); |
void eor_reg_t2(Register dst, Register src1, const Operand& src2, |
SBit s, Condition cond); |
void eor_thumb(Register dst, Register src1, const Operand& src2, |
- SBit s, Condition cond); |
+ SBitMode smode, Condition cond); |
void sub(Register dst, Register src1, const Operand& src2, |
- SBit s = LeaveCC, Condition cond = al); |
+ SBitMode smode = DontCareCC, Condition cond = al); |
void sub(Register dst, Register src1, Register src2, |
- SBit s = LeaveCC, Condition cond = al) { |
- sub(dst, src1, Operand(src2), s, cond); |
+ SBitMode smode = DontCareCC, Condition cond = al) { |
+ sub(dst, src1, Operand(src2), smode, cond); |
} |
void sub_imm_t3(Register dst, Register src1, SBit s, Condition cond, |
uint32_t i, uint32_t imm3, uint32_t imm8); |
@@ -885,22 +889,22 @@ class Assembler : public AssemblerBase { |
void sub_reg_t3(Register dst, Register src1, const Operand& src2, |
SBit s, Condition cond); |
void sub_thumb(Register dst, Register src1, const Operand& src2, |
- SBit s, Condition cond); |
+ SBitMode smode, Condition cond); |
void rsb(Register dst, Register src1, const Operand& src2, |
- SBit s = LeaveCC, Condition cond = al); |
+ SBitMode smode = DontCareCC, Condition cond = al); |
void rsb_imm_t2(Register dst, Register src1, SBit s, Condition cond, |
uint32_t i, uint32_t imm3, uint32_t imm8); |
void rsb_reg_t1(Register dst, Register src1, const Operand& src2, |
SBit s, Condition cond); |
void rsb_thumb(Register dst, Register src1, const Operand& src2, |
- SBit s, Condition cond); |
+ SBitMode smode, Condition cond); |
void add(Register dst, Register src1, const Operand& src2, |
- SBit s = LeaveCC, Condition cond = al); |
+ SBitMode smode = DontCareCC, Condition cond = al); |
void add(Register dst, Register src1, Register src2, |
- SBit s = LeaveCC, Condition cond = al) { |
- add(dst, src1, Operand(src2), s, cond); |
+ SBitMode smode = DontCareCC, Condition cond = al) { |
+ add(dst, src1, Operand(src2), smode, cond); |
} |
void add_imm_t3(Register dst, Register src1, SBit s, Condition cond, |
uint32_t i, uint32_t imm3, uint32_t imm8); |
@@ -909,28 +913,29 @@ class Assembler : public AssemblerBase { |
void add_reg_t3(Register dst, Register src1, const Operand& src2, |
SBit s, Condition cond); |
void add_thumb(Register dst, Register src1, const Operand& src2, |
- SBit s, Condition cond); |
+ SBitMode smode, Condition cond); |
void adc(Register dst, Register src1, const Operand& src2, |
- SBit s = LeaveCC, Condition cond = al); |
+ SBitMode smode = DontCareCC, Condition cond = al); |
void adc_imm_t1(Register dst, Register src1, SBit s, Condition cond, |
uint32_t i, uint32_t imm3, uint32_t imm8); |
void adc_reg_t2(Register dst, Register src1, const Operand& src2, |
SBit s, Condition cond); |
void adc_thumb(Register dst, Register src1, const Operand& src2, |
- SBit s, Condition cond); |
+ SBitMode smode, Condition cond); |
void sbc(Register dst, Register src1, const Operand& src2, |
- SBit s = LeaveCC, Condition cond = al); |
+ SBitMode smode = DontCareCC, Condition cond = al); |
void sbc_imm_t1(Register dst, Register src1, SBit s, Condition cond, |
uint32_t i, uint32_t imm3, uint32_t imm8); |
void sbc_reg_t2(Register dst, Register src1, const Operand& src2, |
SBit s, Condition cond); |
void sbc_thumb(Register dst, Register src1, const Operand& src2, |
- SBit s, Condition cond); |
+ SBitMode smode, Condition cond); |
+ |
void rsc(Register dst, Register src1, const Operand& src2, |
- SBit s = LeaveCC, Condition cond = al); |
+ SBitMode smode = DontCareCC, Condition cond = al); |
void tst(Register src1, const Operand& src2, Condition cond = al); |
void tst(Register src1, Register src2, Condition cond = al) { |
@@ -964,22 +969,24 @@ class Assembler : public AssemblerBase { |
void cmn_thumb(Register src1, const Operand& src2, Condition cond); |
void orr(Register dst, Register src1, const Operand& src2, |
- SBit s = LeaveCC, Condition cond = al); |
+ SBitMode smode = DontCareCC, Condition cond = al); |
void orr(Register dst, Register src1, Register src2, |
- SBit s = LeaveCC, Condition cond = al) { |
- orr(dst, src1, Operand(src2), s, cond); |
+ SBitMode smode = DontCareCC, Condition cond = al) { |
+ orr(dst, src1, Operand(src2), smode, cond); |
} |
+ |
void orr_imm_t1(Register dst, Register src1, SBit s, Condition cond, |
uint32_t i, uint32_t imm3, uint32_t imm8); |
void orr_reg_t2(Register dst, Register src1, const Operand& src2, |
SBit s, Condition cond); |
void orr_thumb(Register dst, Register src1, const Operand& src2, |
- SBit s, Condition cond); |
+ SBitMode smode, Condition cond); |
void mov(Register dst, const Operand& src, |
- SBit s = LeaveCC, Condition cond = al); |
- void mov(Register dst, Register src, SBit s = LeaveCC, Condition cond = al) { |
- mov(dst, Operand(src), s, cond); |
+ SBitMode smode = DontCareCC, Condition cond = al); |
+ void mov(Register dst, Register src, |
+ SBitMode smode = DontCareCC, Condition cond = al) { |
+ mov(dst, Operand(src), smode, cond); |
} |
void mov_imm_t2(Register dst, SBit s, Condition cond, |
uint32_t i, uint32_t imm3, uint32_t imm8); |
@@ -988,20 +995,24 @@ class Assembler : public AssemblerBase { |
void mov_reg_t3(Register dst, const Operand& src, |
SBit s, Condition cond); |
void mov_thumb(Register dst, const Operand& src, |
- SBit s, Condition cond); |
+ SBitMode smode, Condition cond); |
void lsl_imm_t2(Register dst, const Operand& src, SBit s, Condition cond); |
void lsl_reg_t2(Register dst, const Operand& src, SBit s, Condition cond); |
- void lsl_thumb(Register dst, const Operand& src, SBit s, Condition cond); |
+ void lsl_thumb(Register dst, const Operand& src, |
+ SBitMode smode, Condition cond); |
void lsr_imm_t2(Register dst, const Operand& src, SBit s, Condition cond); |
void lsr_reg_t2(Register dst, const Operand& src, SBit s, Condition cond); |
- void lsr_thumb(Register dst, const Operand& src, SBit s, Condition cond); |
+ void lsr_thumb(Register dst, const Operand& src, |
+ SBitMode smode, Condition cond); |
void asr_imm_t2(Register dst, const Operand& src, SBit s, Condition cond); |
void asr_reg_t2(Register dst, const Operand& src, SBit s, Condition cond); |
- void asr_thumb(Register dst, const Operand& src, SBit s, Condition cond); |
+ void asr_thumb(Register dst, const Operand& src, |
+ SBitMode smode, Condition cond, bool is_in_it_block); |
void ror_imm_t2(Register dst, const Operand& src, SBit s, Condition cond); |
void ror_reg_t2(Register dst, const Operand& src, SBit s, Condition cond); |
- void ror_thumb(Register dst, const Operand& src, SBit s, Condition cond); |
+ void ror_thumb(Register dst, const Operand& src, |
+ SBitMode smode, Condition cond); |
// ARMv7 instructions for loading a 32 bit immediate in two instructions. |
// This may actually emit a different mov instruction, but on an ARMv7 it |
@@ -1010,31 +1021,30 @@ class Assembler : public AssemblerBase { |
// The constant for movt should be in the range 0-0xffff. |
void movt(Register reg, uint32_t immediate, Condition cond = al); |
void movt_thumb(Register reg, uint32_t immediate, Condition cond = al); |
- |
void bic(Register dst, Register src1, const Operand& src2, |
- SBit s = LeaveCC, Condition cond = al); |
+ SBitMode smode = DontCareCC, Condition cond = al); |
void bic_imm_t1(Register dst, Register src1, SBit s, Condition cond, |
uint32_t i, uint32_t imm3, uint32_t imm8); |
void bic_reg_t2(Register dst, Register src1, const Operand& src2, |
SBit s, Condition cond); |
void bic_thumb(Register dst, Register src1, const Operand& src2, |
- SBit s, Condition cond); |
+ SBitMode smode, Condition cond); |
void mvn(Register dst, const Operand& src, |
- SBit s = LeaveCC, Condition cond = al); |
+ SBitMode smode = DontCareCC, Condition cond = al); |
void mvn_imm_t1(Register dst, SBit s, Condition cond, |
uint32_t i, uint32_t imm3, uint32_t imm8); |
void mvn_reg_t2(Register dst, const Operand& src, |
SBit s, Condition cond); |
void mvn_thumb(Register dst, const Operand& src, |
- SBit s, Condition cond); |
+ SBitMode smode, Condition cond); |
// Multiply instructions |
void mla(Register dst, Register src1, Register src2, Register srcA, |
- SBit s = LeaveCC, Condition cond = al); |
+ SBitMode smode = DontCareCC, Condition cond = al); |
void mla_thumb(Register dst, Register src1, Register src2, Register srcA, |
- SBit s, Condition cond); |
+ SBitMode smode, Condition cond); |
void mls(Register dst, Register src1, Register src2, Register srcA, |
Condition cond = al); |
@@ -1047,31 +1057,31 @@ class Assembler : public AssemblerBase { |
Condition cond); |
void mul(Register dst, Register src1, Register src2, |
- SBit s = LeaveCC, Condition cond = al); |
+ SBitMode smode = DontCareCC, Condition cond = al); |
void mul_t2(Register dst, Register src1, Register src2, |
SBit s, Condition cond); |
void mul_thumb(Register dst, Register src1, Register src2, |
- SBit s, Condition cond); |
+ SBitMode smode, Condition cond); |
void smlal(Register dstL, Register dstH, Register src1, Register src2, |
- SBit s = LeaveCC, Condition cond = al); |
+ SBitMode smode = DontCareCC, Condition cond = al); |
void smlal_thumb(Register dstL, Register dstH, Register src1, Register src2, |
- SBit s, Condition cond); |
+ SBitMode smode, Condition cond); |
void smull(Register dstL, Register dstH, Register src1, Register src2, |
- SBit s = LeaveCC, Condition cond = al); |
+ SBitMode smode = DontCareCC, Condition cond = al); |
void smull_thumb(Register dstL, Register dstH, Register src1, Register src2, |
- SBit s, Condition cond); |
+ SBitMode smode, Condition cond); |
void umlal(Register dstL, Register dstH, Register src1, Register src2, |
- SBit s = LeaveCC, Condition cond = al); |
+ SBitMode smode = DontCareCC, Condition cond = al); |
void umlal_thumb(Register dstL, Register dstH, Register src1, Register src2, |
- SBit s, Condition cond); |
+ SBitMode smode, Condition cond); |
void umull(Register dstL, Register dstH, Register src1, Register src2, |
- SBit s = LeaveCC, Condition cond = al); |
+ SBitMode smode = DontCareCC, Condition cond = al); |
void umull_thumb(Register dstL, Register dstH, Register src1, Register src2, |
- SBit s, Condition cond); |
+ SBitMode smode, Condition cond); |
// Miscellaneous arithmetic instructions |
@@ -1447,7 +1457,10 @@ class Assembler : public AssemblerBase { |
void it_thumb(Condition cond, int num_instr, bool cond2 = false, |
bool cond3 = false, bool cond4 = false); |
- inline void emit_it(Condition cond); |
+ |
+ inline bool emit_it(Condition cond); |
+ inline bool it_block_smode_check(bool is_in_it_block, SBitMode smode); |
+ |
void ldr_pc_thumb(Register dst, const Operand& src); |
static bool use_immediate_embedded_pointer_loads( |
@@ -1734,15 +1747,15 @@ class Assembler : public AssemblerBase { |
// 32-bit immediate values |
void move_32_bit_immediate(Condition cond, |
Register rd, |
- SBit s, |
const Operand& x); |
void move_32_bit_immediate_thumb(Register rd, |
- SBit s, |
+ SBitMode smode, |
const Operand& x, |
Condition cond = al); |
// Instruction generation |
- void addrmod1(Instr instr, Register rn, Register rd, const Operand& x); |
+ void addrmod1(Instr instr, SBitMode smode, |
+ Register rn, Register rd, const Operand& x); |
void addrmod2(Instr instr, Register rd, const MemOperand& x); |
void addrmod3(Instr instr, Register rd, const MemOperand& x); |
void addrmod4(Instr instr, Register rn, RegList rl); |