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;
|
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));
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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;
|
||||||
|
|
Loading…
Reference in New Issue