Index: src/IceAssemblerARM32.h |
diff --git a/src/IceAssemblerARM32.h b/src/IceAssemblerARM32.h |
index e40e359d329cc816220f81394302af645aee1771..e524e4224fe0a346141cac3197e543eb066f4bc7 100644 |
--- a/src/IceAssemblerARM32.h |
+++ b/src/IceAssemblerARM32.h |
@@ -59,6 +59,14 @@ class AssemblerARM32 : public Assembler { |
AssemblerARM32 &operator=(const AssemblerARM32 &) = delete; |
public: |
+ // Rotation values. |
+ enum RotationValue { |
+ kRotateNone, // Omitted |
+ kRotate8, // ror #8 |
+ kRotate16, // ror #16 |
+ kRotate24 // ror #24 |
+ }; |
+ |
class TargetInfo { |
TargetInfo(const TargetInfo &) = delete; |
TargetInfo &operator=(const TargetInfo &) = delete; |
@@ -250,6 +258,9 @@ public: |
void umull(const Operand *OpRdLo, const Operand *OpRdHi, const Operand *OpRn, |
const Operand *OpRm, CondARM32::Cond Cond); |
+ // Implements uxtb/uxth depending on type of OpSrc0. |
+ void uxt(const Operand *OpRd, const Operand *OpSrc0, CondARM32::Cond Cond); |
+ |
static bool classof(const Assembler *Asm) { |
return Asm->getKind() == Asm_ARM32; |
} |
@@ -333,6 +344,12 @@ private: |
void emitMulOp(CondARM32::Cond Cond, IValueT Opcode, IValueT Rd, IValueT Rn, |
IValueT Rm, IValueT Rs, bool SetCc); |
+ // Implements various forms of Unsigned extend value, using pattern |
+ // ccccxxxxxxxxnnnnddddrr000111mmmm where cccc=Cond, xxxxxxxx<<20=Opcode, |
+ // nnnn=Rn, dddd=Rd, rr=Rotation, and mmmm=Rm. |
+ void emitUxt(CondARM32::Cond, IValueT Opcode, IValueT Rd, IValueT Rn, |
+ IValueT Rm, RotationValue Rotation); |
+ |
// Pattern cccctttxxxxnnnn0000iiiiiiiiiiii where cccc=Cond, nnnn=Rn, |
// ttt=Instruction type (derived from OpSrc1), iiiiiiiiiiii is derived from |
// OpSrc1, and xxxx=Opcode. |