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:
Jakob Stoklund Olesen 2012-08-07 18:56:39 +00:00
parent f0267f5c9e
commit 84689b0d5a
3 changed files with 30 additions and 6 deletions

View File

@ -108,6 +108,12 @@ public:
return *this; 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, const MachineInstrBuilder &addJumpTableIndex(unsigned Idx,
unsigned char TargetFlags = 0) const { unsigned char TargetFlags = 0) const {
MI->addOperand(MachineOperand::CreateJTI(Idx, TargetFlags)); MI->addOperand(MachineOperand::CreateJTI(Idx, TargetFlags));

View File

@ -45,6 +45,7 @@ public:
MO_MachineBasicBlock, ///< MachineBasicBlock reference MO_MachineBasicBlock, ///< MachineBasicBlock reference
MO_FrameIndex, ///< Abstract Stack Frame Index MO_FrameIndex, ///< Abstract Stack Frame Index
MO_ConstantPoolIndex, ///< Address of indexed Constant in Constant Pool 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_JumpTableIndex, ///< Address of indexed Jump Table for switch
MO_ExternalSymbol, ///< Name of external global symbol MO_ExternalSymbol, ///< Name of external global symbol
MO_GlobalAddress, ///< Address of a global value MO_GlobalAddress, ///< Address of a global value
@ -215,6 +216,8 @@ public:
bool isFI() const { return OpKind == MO_FrameIndex; } bool isFI() const { return OpKind == MO_FrameIndex; }
/// isCPI - Tests if this is a MO_ConstantPoolIndex operand. /// isCPI - Tests if this is a MO_ConstantPoolIndex operand.
bool isCPI() const { return OpKind == MO_ConstantPoolIndex; } 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. /// isJTI - Tests if this is a MO_JumpTableIndex operand.
bool isJTI() const { return OpKind == MO_JumpTableIndex; } bool isJTI() const { return OpKind == MO_JumpTableIndex; }
/// isGlobal - Tests if this is a MO_GlobalAddress operand. /// isGlobal - Tests if this is a MO_GlobalAddress operand.
@ -410,7 +413,7 @@ public:
} }
int getIndex() const { int getIndex() const {
assert((isFI() || isCPI() || isJTI()) && assert((isFI() || isCPI() || isTargetIndex() || isJTI()) &&
"Wrong MachineOperand accessor"); "Wrong MachineOperand accessor");
return Contents.OffsetedInfo.Val.Index; return Contents.OffsetedInfo.Val.Index;
} }
@ -433,8 +436,8 @@ public:
/// getOffset - Return the offset from the symbol in this operand. This always /// getOffset - Return the offset from the symbol in this operand. This always
/// returns 0 for ExternalSymbol operands. /// returns 0 for ExternalSymbol operands.
int64_t getOffset() const { int64_t getOffset() const {
assert((isGlobal() || isSymbol() || isCPI() || isBlockAddress()) && assert((isGlobal() || isSymbol() || isCPI() || isTargetIndex() ||
"Wrong MachineOperand accessor"); isBlockAddress()) && "Wrong MachineOperand accessor");
return (int64_t(Contents.OffsetedInfo.OffsetHi) << 32) | return (int64_t(Contents.OffsetedInfo.OffsetHi) << 32) |
SmallContents.OffsetLo; SmallContents.OffsetLo;
} }
@ -481,14 +484,14 @@ public:
} }
void setOffset(int64_t Offset) { void setOffset(int64_t Offset) {
assert((isGlobal() || isSymbol() || isCPI() || isBlockAddress()) && assert((isGlobal() || isSymbol() || isCPI() || isTargetIndex() ||
"Wrong MachineOperand accessor"); isBlockAddress()) && "Wrong MachineOperand accessor");
SmallContents.OffsetLo = unsigned(Offset); SmallContents.OffsetLo = unsigned(Offset);
Contents.OffsetedInfo.OffsetHi = int(Offset >> 32); Contents.OffsetedInfo.OffsetHi = int(Offset >> 32);
} }
void setIndex(int Idx) { void setIndex(int Idx) {
assert((isFI() || isCPI() || isJTI()) && assert((isFI() || isCPI() || isTargetIndex() || isJTI()) &&
"Wrong MachineOperand accessor"); "Wrong MachineOperand accessor");
Contents.OffsetedInfo.Val.Index = Idx; Contents.OffsetedInfo.Val.Index = Idx;
} }
@ -589,6 +592,14 @@ public:
Op.setTargetFlags(TargetFlags); Op.setTargetFlags(TargetFlags);
return Op; 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, static MachineOperand CreateJTI(unsigned Idx,
unsigned char TargetFlags = 0) { unsigned char TargetFlags = 0) {
MachineOperand Op(MachineOperand::MO_JumpTableIndex); MachineOperand Op(MachineOperand::MO_JumpTableIndex);

View File

@ -208,6 +208,7 @@ bool MachineOperand::isIdenticalTo(const MachineOperand &Other) const {
case MachineOperand::MO_FrameIndex: case MachineOperand::MO_FrameIndex:
return getIndex() == Other.getIndex(); return getIndex() == Other.getIndex();
case MachineOperand::MO_ConstantPoolIndex: case MachineOperand::MO_ConstantPoolIndex:
case MachineOperand::MO_TargetIndex:
return getIndex() == Other.getIndex() && getOffset() == Other.getOffset(); return getIndex() == Other.getIndex() && getOffset() == Other.getOffset();
case MachineOperand::MO_JumpTableIndex: case MachineOperand::MO_JumpTableIndex:
return getIndex() == Other.getIndex(); return getIndex() == Other.getIndex();
@ -245,6 +246,7 @@ hash_code llvm::hash_value(const MachineOperand &MO) {
case MachineOperand::MO_FrameIndex: case MachineOperand::MO_FrameIndex:
return hash_combine(MO.getType(), MO.getTargetFlags(), MO.getIndex()); return hash_combine(MO.getType(), MO.getTargetFlags(), MO.getIndex());
case MachineOperand::MO_ConstantPoolIndex: case MachineOperand::MO_ConstantPoolIndex:
case MachineOperand::MO_TargetIndex:
return hash_combine(MO.getType(), MO.getTargetFlags(), MO.getIndex(), return hash_combine(MO.getType(), MO.getTargetFlags(), MO.getIndex(),
MO.getOffset()); MO.getOffset());
case MachineOperand::MO_JumpTableIndex: case MachineOperand::MO_JumpTableIndex:
@ -353,6 +355,11 @@ void MachineOperand::print(raw_ostream &OS, const TargetMachine *TM) const {
if (getOffset()) OS << "+" << getOffset(); if (getOffset()) OS << "+" << getOffset();
OS << '>'; OS << '>';
break; break;
case MachineOperand::MO_TargetIndex:
OS << "<ti#" << getIndex();
if (getOffset()) OS << "+" << getOffset();
OS << '>';
break;
case MachineOperand::MO_JumpTableIndex: case MachineOperand::MO_JumpTableIndex:
OS << "<jt#" << getIndex() << '>'; OS << "<jt#" << getIndex() << '>';
break; break;