forked from OSchip/llvm-project
Add a new kind of MachineOperand: MO_TargetIndex.
A target index operand looks a lot like a constant pool reference, but it is completely target-defined. It contains the 8-bit TargetFlags, a 32-bit index, and a 64-bit offset. It is preserved by all code generator passes. TargetIndex operands can be used to carry target-specific information in cases where immediate operands won't suffice. llvm-svn: 161441
This commit is contained in:
parent
f0267f5c9e
commit
84689b0d5a
|
@ -108,6 +108,12 @@ public:
|
|||
return *this;
|
||||
}
|
||||
|
||||
const MachineInstrBuilder &addTargetIndex(unsigned Idx, int64_t Offset = 0,
|
||||
unsigned char TargetFlags = 0) const {
|
||||
MI->addOperand(MachineOperand::CreateTargetIndex(Idx, Offset, TargetFlags));
|
||||
return *this;
|
||||
}
|
||||
|
||||
const MachineInstrBuilder &addJumpTableIndex(unsigned Idx,
|
||||
unsigned char TargetFlags = 0) const {
|
||||
MI->addOperand(MachineOperand::CreateJTI(Idx, TargetFlags));
|
||||
|
|
|
@ -45,6 +45,7 @@ public:
|
|||
MO_MachineBasicBlock, ///< MachineBasicBlock reference
|
||||
MO_FrameIndex, ///< Abstract Stack Frame Index
|
||||
MO_ConstantPoolIndex, ///< Address of indexed Constant in Constant Pool
|
||||
MO_TargetIndex, ///< Target-dependent index+offset operand.
|
||||
MO_JumpTableIndex, ///< Address of indexed Jump Table for switch
|
||||
MO_ExternalSymbol, ///< Name of external global symbol
|
||||
MO_GlobalAddress, ///< Address of a global value
|
||||
|
@ -215,6 +216,8 @@ public:
|
|||
bool isFI() const { return OpKind == MO_FrameIndex; }
|
||||
/// isCPI - Tests if this is a MO_ConstantPoolIndex operand.
|
||||
bool isCPI() const { return OpKind == MO_ConstantPoolIndex; }
|
||||
/// isTargetIndex - Tests if this is a MO_TargetIndex operand.
|
||||
bool isTargetIndex() const { return OpKind == MO_TargetIndex; }
|
||||
/// isJTI - Tests if this is a MO_JumpTableIndex operand.
|
||||
bool isJTI() const { return OpKind == MO_JumpTableIndex; }
|
||||
/// isGlobal - Tests if this is a MO_GlobalAddress operand.
|
||||
|
@ -410,7 +413,7 @@ public:
|
|||
}
|
||||
|
||||
int getIndex() const {
|
||||
assert((isFI() || isCPI() || isJTI()) &&
|
||||
assert((isFI() || isCPI() || isTargetIndex() || isJTI()) &&
|
||||
"Wrong MachineOperand accessor");
|
||||
return Contents.OffsetedInfo.Val.Index;
|
||||
}
|
||||
|
@ -433,8 +436,8 @@ public:
|
|||
/// getOffset - Return the offset from the symbol in this operand. This always
|
||||
/// returns 0 for ExternalSymbol operands.
|
||||
int64_t getOffset() const {
|
||||
assert((isGlobal() || isSymbol() || isCPI() || isBlockAddress()) &&
|
||||
"Wrong MachineOperand accessor");
|
||||
assert((isGlobal() || isSymbol() || isCPI() || isTargetIndex() ||
|
||||
isBlockAddress()) && "Wrong MachineOperand accessor");
|
||||
return (int64_t(Contents.OffsetedInfo.OffsetHi) << 32) |
|
||||
SmallContents.OffsetLo;
|
||||
}
|
||||
|
@ -481,14 +484,14 @@ public:
|
|||
}
|
||||
|
||||
void setOffset(int64_t Offset) {
|
||||
assert((isGlobal() || isSymbol() || isCPI() || isBlockAddress()) &&
|
||||
"Wrong MachineOperand accessor");
|
||||
assert((isGlobal() || isSymbol() || isCPI() || isTargetIndex() ||
|
||||
isBlockAddress()) && "Wrong MachineOperand accessor");
|
||||
SmallContents.OffsetLo = unsigned(Offset);
|
||||
Contents.OffsetedInfo.OffsetHi = int(Offset >> 32);
|
||||
}
|
||||
|
||||
void setIndex(int Idx) {
|
||||
assert((isFI() || isCPI() || isJTI()) &&
|
||||
assert((isFI() || isCPI() || isTargetIndex() || isJTI()) &&
|
||||
"Wrong MachineOperand accessor");
|
||||
Contents.OffsetedInfo.Val.Index = Idx;
|
||||
}
|
||||
|
@ -589,6 +592,14 @@ public:
|
|||
Op.setTargetFlags(TargetFlags);
|
||||
return Op;
|
||||
}
|
||||
static MachineOperand CreateTargetIndex(unsigned Idx, int64_t Offset,
|
||||
unsigned char TargetFlags = 0) {
|
||||
MachineOperand Op(MachineOperand::MO_TargetIndex);
|
||||
Op.setIndex(Idx);
|
||||
Op.setOffset(Offset);
|
||||
Op.setTargetFlags(TargetFlags);
|
||||
return Op;
|
||||
}
|
||||
static MachineOperand CreateJTI(unsigned Idx,
|
||||
unsigned char TargetFlags = 0) {
|
||||
MachineOperand Op(MachineOperand::MO_JumpTableIndex);
|
||||
|
|
|
@ -208,6 +208,7 @@ bool MachineOperand::isIdenticalTo(const MachineOperand &Other) const {
|
|||
case MachineOperand::MO_FrameIndex:
|
||||
return getIndex() == Other.getIndex();
|
||||
case MachineOperand::MO_ConstantPoolIndex:
|
||||
case MachineOperand::MO_TargetIndex:
|
||||
return getIndex() == Other.getIndex() && getOffset() == Other.getOffset();
|
||||
case MachineOperand::MO_JumpTableIndex:
|
||||
return getIndex() == Other.getIndex();
|
||||
|
@ -245,6 +246,7 @@ hash_code llvm::hash_value(const MachineOperand &MO) {
|
|||
case MachineOperand::MO_FrameIndex:
|
||||
return hash_combine(MO.getType(), MO.getTargetFlags(), MO.getIndex());
|
||||
case MachineOperand::MO_ConstantPoolIndex:
|
||||
case MachineOperand::MO_TargetIndex:
|
||||
return hash_combine(MO.getType(), MO.getTargetFlags(), MO.getIndex(),
|
||||
MO.getOffset());
|
||||
case MachineOperand::MO_JumpTableIndex:
|
||||
|
@ -353,6 +355,11 @@ void MachineOperand::print(raw_ostream &OS, const TargetMachine *TM) const {
|
|||
if (getOffset()) OS << "+" << getOffset();
|
||||
OS << '>';
|
||||
break;
|
||||
case MachineOperand::MO_TargetIndex:
|
||||
OS << "<ti#" << getIndex();
|
||||
if (getOffset()) OS << "+" << getOffset();
|
||||
OS << '>';
|
||||
break;
|
||||
case MachineOperand::MO_JumpTableIndex:
|
||||
OS << "<jt#" << getIndex() << '>';
|
||||
break;
|
||||
|
|
Loading…
Reference in New Issue