mirror of
https://github.com/RPCS3/llvm.git
synced 2025-01-11 06:56:12 +00:00
Target: Allow target specific operand types
This adds two new fields to the RegisterOperand TableGen class: string OperandNamespace = "MCOI"; string OperandType = "OPERAND_REGISTER"; These fields can be used to specify a target specific operand type, which will be stored in the OperandType member of the MCOperandInfo object. This can be useful for targets that need to store some extra information about operands that cannot be expressed using the target independent types. For example, in the R600 backend, there are operands which can take either registers or immediates and it is convenient to be able to specify this in the TableGen definitions. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@225661 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
2211d38267
commit
b461e8304c
@ -44,11 +44,12 @@ namespace MCOI {
|
|||||||
|
|
||||||
/// Operand Type - Operands are tagged with one of the values of this enum.
|
/// Operand Type - Operands are tagged with one of the values of this enum.
|
||||||
enum OperandType {
|
enum OperandType {
|
||||||
OPERAND_UNKNOWN,
|
OPERAND_UNKNOWN = 0,
|
||||||
OPERAND_IMMEDIATE,
|
OPERAND_IMMEDIATE = 1,
|
||||||
OPERAND_REGISTER,
|
OPERAND_REGISTER = 2,
|
||||||
OPERAND_MEMORY,
|
OPERAND_MEMORY = 3,
|
||||||
OPERAND_PCREL
|
OPERAND_PCREL = 4,
|
||||||
|
OPERAND_FIRST_TARGET = 5
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -624,6 +624,9 @@ class RegisterOperand<RegisterClass regclass, string pm = "printOperand">
|
|||||||
// can match a subset of some other class, in which case the AsmOperandClass
|
// can match a subset of some other class, in which case the AsmOperandClass
|
||||||
// should declare the other operand as one of its super classes.
|
// should declare the other operand as one of its super classes.
|
||||||
AsmOperandClass ParserMatchClass;
|
AsmOperandClass ParserMatchClass;
|
||||||
|
|
||||||
|
string OperandNamespace = "MCOI";
|
||||||
|
string OperandType = "OPERAND_REGISTER";
|
||||||
}
|
}
|
||||||
|
|
||||||
let OperandType = "OPERAND_IMMEDIATE" in {
|
let OperandType = "OPERAND_IMMEDIATE" in {
|
||||||
|
@ -68,10 +68,13 @@ CGIOperandList::CGIOperandList(Record *R) : TheDef(R) {
|
|||||||
std::string PrintMethod = "printOperand";
|
std::string PrintMethod = "printOperand";
|
||||||
std::string EncoderMethod;
|
std::string EncoderMethod;
|
||||||
std::string OperandType = "OPERAND_UNKNOWN";
|
std::string OperandType = "OPERAND_UNKNOWN";
|
||||||
|
std::string OperandNamespace = "MCOI";
|
||||||
unsigned NumOps = 1;
|
unsigned NumOps = 1;
|
||||||
DagInit *MIOpInfo = nullptr;
|
DagInit *MIOpInfo = nullptr;
|
||||||
if (Rec->isSubClassOf("RegisterOperand")) {
|
if (Rec->isSubClassOf("RegisterOperand")) {
|
||||||
PrintMethod = Rec->getValueAsString("PrintMethod");
|
PrintMethod = Rec->getValueAsString("PrintMethod");
|
||||||
|
OperandType = Rec->getValueAsString("OperandType");
|
||||||
|
OperandNamespace = Rec->getValueAsString("OperandNamespace");
|
||||||
} else if (Rec->isSubClassOf("Operand")) {
|
} else if (Rec->isSubClassOf("Operand")) {
|
||||||
PrintMethod = Rec->getValueAsString("PrintMethod");
|
PrintMethod = Rec->getValueAsString("PrintMethod");
|
||||||
OperandType = Rec->getValueAsString("OperandType");
|
OperandType = Rec->getValueAsString("OperandType");
|
||||||
@ -113,8 +116,8 @@ CGIOperandList::CGIOperandList(Record *R) : TheDef(R) {
|
|||||||
Twine(i) + " has the same name as a previous operand!");
|
Twine(i) + " has the same name as a previous operand!");
|
||||||
|
|
||||||
OperandList.push_back(OperandInfo(Rec, ArgName, PrintMethod, EncoderMethod,
|
OperandList.push_back(OperandInfo(Rec, ArgName, PrintMethod, EncoderMethod,
|
||||||
OperandType, MIOperandNo, NumOps,
|
OperandNamespace + "::" + OperandType,
|
||||||
MIOpInfo));
|
MIOperandNo, NumOps, MIOpInfo));
|
||||||
MIOperandNo += NumOps;
|
MIOperandNo += NumOps;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -143,7 +143,7 @@ InstrInfoEmitter::GetOperandInfo(const CodeGenInstruction &Inst) {
|
|||||||
Res += "|(1<<MCOI::OptionalDef)";
|
Res += "|(1<<MCOI::OptionalDef)";
|
||||||
|
|
||||||
// Fill in operand type.
|
// Fill in operand type.
|
||||||
Res += ", MCOI::";
|
Res += ", ";
|
||||||
assert(!Op.OperandType.empty() && "Invalid operand type.");
|
assert(!Op.OperandType.empty() && "Invalid operand type.");
|
||||||
Res += Op.OperandType;
|
Res += Op.OperandType;
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user