Index: src/IceAssemblerARM32.h |
diff --git a/src/IceAssemblerARM32.h b/src/IceAssemblerARM32.h |
index 1c2528c21c675b11595696fd293274b6848d8508..6cd120e5e864b65a9d01c559e6538f3c777d6445 100644 |
--- a/src/IceAssemblerARM32.h |
+++ b/src/IceAssemblerARM32.h |
@@ -168,13 +168,13 @@ public: |
void mov(const Operand *OpRd, const Operand *OpSrc, CondARM32::Cond Cond); |
- void mul(const Operand *OpRd, const Operand *OpRn, const Operand *OpSrc1, |
- bool SetFlags, CondARM32::Cond Cond); |
- |
void movw(const Operand *OpRd, const Operand *OpSrc, CondARM32::Cond Cond); |
void movt(const Operand *OpRd, const Operand *OpSrc, CondARM32::Cond Cond); |
+ void mul(const Operand *OpRd, const Operand *OpRn, const Operand *OpSrc1, |
+ bool SetFlags, CondARM32::Cond Cond); |
+ |
void orr(const Operand *OpRd, const Operand *OpRn, const Operand *OpSrc1, |
bool SetFlags, CondARM32::Cond Cond); |
@@ -189,6 +189,8 @@ public: |
void sub(const Operand *OpRd, const Operand *OpRn, const Operand *OpSrc1, |
bool SetFlags, CondARM32::Cond Cond); |
+ void tst(const Operand *OpRn, const Operand *OpSrc1, CondARM32::Cond Cond); |
+ |
void udiv(const Operand *OpRd, const Operand *OpRn, const Operand *OpSrc1, |
CondARM32::Cond Cond); |
@@ -216,10 +218,23 @@ private: |
void emitType01(CondARM32::Cond Cond, IValueT Type, IValueT Opcode, |
bool SetCc, IValueT Rn, IValueT Rd, IValueT imm12); |
- // Converts arguments to appropriate representation on a data operation, |
- // and then calls emitType01 above. |
+ // List of possible checks to apply when calling emitType01() (below). |
+ enum Type01Checks { |
+ NoChecks, |
+ RdIsPcAndSetFlags, |
+ }; |
+ |
+ // Converts appropriate representation on a data operation, and then calls |
+ // emitType01 above. |
void emitType01(IValueT Opcode, const Operand *OpRd, const Operand *OpRn, |
- const Operand *OpSrc1, bool SetFlags, CondARM32::Cond Cond); |
+ const Operand *OpSrc1, bool SetFlags, CondARM32::Cond Cond, |
+ Type01Checks RuleChecks = RdIsPcAndSetFlags); |
+ |
+ // Same as above, but the value for Rd and Rn have already been converted |
+ // into instruction values. |
+ void emitType01(IValueT Opcode, IValueT OpRd, IValueT OpRn, |
+ const Operand *OpSrc1, bool SetFlags, CondARM32::Cond Cond, |
+ Type01Checks RuleChecks = RdIsPcAndSetFlags); |
void emitType05(CondARM32::Cond COnd, int32_t Offset, bool Link); |
@@ -240,6 +255,12 @@ private: |
void emitMulOp(CondARM32::Cond Cond, IValueT Opcode, IValueT Rd, IValueT Rn, |
IValueT Rm, IValueT Rs, bool SetCc); |
+ // Pattern cccctttxxxxnnnn0000iiiiiiiiiiii where cccc=Cond, nnnn=Rn, |
+ // ttt=Instruction type (derived from OpSrc1), iiiiiiiiiiii is derived from |
+ // OpSrc1, and xxxx=Opcode. |
+ void emitCompareOp(IValueT Opcode, const Operand *OpRn, const Operand *OpSrc1, |
+ CondARM32::Cond Cond); |
+ |
void emitBranch(Label *L, CondARM32::Cond, bool Link); |
// Encodes the given Offset into the branch instruction Inst. |