mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2025-01-10 05:41:40 +00:00
MC/ARM: Add an ARMOperand class for condition codes.
llvm-svn: 110788
This commit is contained in:
parent
e67c4c3723
commit
74ed9321a3
@ -138,11 +138,17 @@ def VFPNeonDomain : Domain<3>; // Instructions in both VFP & Neon domains
|
||||
// ARM special operands.
|
||||
//
|
||||
|
||||
def CondCodeOperand : AsmOperandClass {
|
||||
let Name = "CondCode";
|
||||
let SuperClasses = [];
|
||||
}
|
||||
|
||||
// ARM Predicate operand. Default to 14 = always (AL). Second part is CC
|
||||
// register whose default is 0 (no register).
|
||||
def pred : PredicateOperand<OtherVT, (ops i32imm, CCR),
|
||||
(ops (i32 14), (i32 zero_reg))> {
|
||||
let PrintMethod = "printPredicateOperand";
|
||||
let ParserMatchClass = CondCodeOperand;
|
||||
}
|
||||
|
||||
// Conditional code result for instructions whose 's' bit is set, e.g. subs.
|
||||
|
@ -106,15 +106,20 @@ private:
|
||||
ARMOperand() {}
|
||||
public:
|
||||
enum KindTy {
|
||||
Token,
|
||||
Register,
|
||||
CondCode,
|
||||
Immediate,
|
||||
Memory
|
||||
Memory,
|
||||
Register,
|
||||
Token
|
||||
} Kind;
|
||||
|
||||
SMLoc StartLoc, EndLoc;
|
||||
|
||||
union {
|
||||
struct {
|
||||
ARMCC::CondCodes Val;
|
||||
} CC;
|
||||
|
||||
struct {
|
||||
const char *Data;
|
||||
unsigned Length;
|
||||
@ -155,8 +160,11 @@ public:
|
||||
StartLoc = o.StartLoc;
|
||||
EndLoc = o.EndLoc;
|
||||
switch (Kind) {
|
||||
case CondCode:
|
||||
CC = o.CC;
|
||||
break;
|
||||
case Token:
|
||||
Tok = o.Tok;
|
||||
Tok = o.Tok;
|
||||
break;
|
||||
case Register:
|
||||
Reg = o.Reg;
|
||||
@ -175,6 +183,11 @@ public:
|
||||
/// getEndLoc - Get the location of the last token of this operand.
|
||||
SMLoc getEndLoc() const { return EndLoc; }
|
||||
|
||||
ARMCC::CondCodes getCondCode() const {
|
||||
assert(Kind == CondCode && "Invalid access!");
|
||||
return CC.Val;
|
||||
}
|
||||
|
||||
StringRef getToken() const {
|
||||
assert(Kind == Token && "Invalid access!");
|
||||
return StringRef(Tok.Data, Tok.Length);
|
||||
@ -190,6 +203,8 @@ public:
|
||||
return Imm.Val;
|
||||
}
|
||||
|
||||
bool isCondCode() const { return Kind == CondCode; }
|
||||
|
||||
bool isImm() const { return Kind == Immediate; }
|
||||
|
||||
bool isReg() const { return Kind == Register; }
|
||||
@ -204,6 +219,11 @@ public:
|
||||
Inst.addOperand(MCOperand::CreateExpr(Expr));
|
||||
}
|
||||
|
||||
void addCondCodeOperands(MCInst &Inst, unsigned N) const {
|
||||
assert(N == 1 && "Invalid number of operands!");
|
||||
Inst.addOperand(MCOperand::CreateImm(unsigned(getCondCode())));
|
||||
}
|
||||
|
||||
void addRegOperands(MCInst &Inst, unsigned N) const {
|
||||
assert(N == 1 && "Invalid number of operands!");
|
||||
Inst.addOperand(MCOperand::CreateReg(getReg()));
|
||||
|
Loading…
Reference in New Issue
Block a user