mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-07-24 22:24:54 +00:00
Added an offset field to ConstantPoolSDNode.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@26371 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@@ -131,7 +131,8 @@ private:
|
||||
// will be set for a value after reg allocation
|
||||
|
||||
int offset; // Offset to address of global or external, only
|
||||
// valid for MO_GlobalAddress and MO_ExternalSym
|
||||
// valid for MO_GlobalAddress, MO_ExternalSym
|
||||
// and MO_ConstantPoolIndex
|
||||
} extra;
|
||||
|
||||
void zeroContents () {
|
||||
@@ -140,11 +141,14 @@ private:
|
||||
}
|
||||
|
||||
MachineOperand(int64_t ImmVal = 0,
|
||||
MachineOperandType OpTy = MO_VirtualRegister)
|
||||
MachineOperandType OpTy = MO_VirtualRegister, int Offset = 0)
|
||||
: flags(0), opType(OpTy) {
|
||||
zeroContents ();
|
||||
contents.immedVal = ImmVal;
|
||||
extra.regNum = -1;
|
||||
if (OpTy == MachineOperand::MO_ConstantPoolIndex)
|
||||
extra.offset = Offset;
|
||||
else
|
||||
extra.regNum = -1;
|
||||
}
|
||||
|
||||
MachineOperand(int Reg, MachineOperandType OpTy, UseType UseTy)
|
||||
@@ -286,7 +290,7 @@ public:
|
||||
return (GlobalValue*)contents.value;
|
||||
}
|
||||
int getOffset() const {
|
||||
assert((isGlobalAddress() || isExternalSymbol()) &&
|
||||
assert((isGlobalAddress() || isExternalSymbol() || isConstantPoolIndex()) &&
|
||||
"Wrong MachineOperand accessor");
|
||||
return extra.offset;
|
||||
}
|
||||
@@ -344,7 +348,7 @@ public:
|
||||
}
|
||||
|
||||
void setOffset(int Offset) {
|
||||
assert((isGlobalAddress() || isExternalSymbol()) &&
|
||||
assert((isGlobalAddress() || isExternalSymbol() || isConstantPoolIndex()) &&
|
||||
"Wrong MachineOperand accessor");
|
||||
extra.offset = Offset;
|
||||
}
|
||||
@@ -644,7 +648,7 @@ public:
|
||||
/// addConstantPoolndexOperand - Add a constant pool object index to the
|
||||
/// instruction.
|
||||
///
|
||||
void addConstantPoolIndexOperand(unsigned I) {
|
||||
void addConstantPoolIndexOperand(unsigned I, int Offset=0) {
|
||||
assert(!OperandsComplete() &&
|
||||
"Trying to add an operand to a machine instr that is already done!");
|
||||
operands.push_back(MachineOperand(I, MachineOperand::MO_ConstantPoolIndex));
|
||||
|
@@ -125,13 +125,15 @@ public:
|
||||
return *this;
|
||||
}
|
||||
|
||||
const MachineInstrBuilder &addConstantPoolIndex(unsigned Idx) const {
|
||||
MI->addConstantPoolIndexOperand(Idx);
|
||||
const MachineInstrBuilder &addConstantPoolIndex(unsigned Idx,
|
||||
int Offset = 0) const {
|
||||
MI->addConstantPoolIndexOperand(Idx, Offset);
|
||||
return *this;
|
||||
}
|
||||
|
||||
const MachineInstrBuilder &addGlobalAddress(GlobalValue *GV,
|
||||
bool isPCRelative = false, int Offset = 0) const {
|
||||
bool isPCRelative = false,
|
||||
int Offset = 0) const {
|
||||
MI->addGlobalAddressOperand(GV, isPCRelative, Offset);
|
||||
return *this;
|
||||
}
|
||||
|
@@ -121,9 +121,9 @@ public:
|
||||
SDOperand getFrameIndex(int FI, MVT::ValueType VT);
|
||||
SDOperand getTargetFrameIndex(int FI, MVT::ValueType VT);
|
||||
SDOperand getConstantPool(Constant *C, MVT::ValueType VT,
|
||||
unsigned Alignment=0);
|
||||
unsigned Alignment=0, int offset = 0);
|
||||
SDOperand getTargetConstantPool(Constant *C, MVT::ValueType VT,
|
||||
unsigned Alignment=0);
|
||||
unsigned Alignment=0, int offset = 0);
|
||||
SDOperand getBasicBlock(MachineBasicBlock *MBB);
|
||||
SDOperand getExternalSymbol(const char *Sym, MVT::ValueType VT);
|
||||
SDOperand getTargetExternalSymbol(const char *Sym, MVT::ValueType VT);
|
||||
@@ -469,8 +469,10 @@ private:
|
||||
std::map<std::pair<uint64_t, MVT::ValueType>, SDNode*> ConstantFPs;
|
||||
std::map<std::pair<uint64_t, MVT::ValueType>, SDNode*> TargetConstantFPs;
|
||||
std::map<int, SDNode*> FrameIndices, TargetFrameIndices;
|
||||
std::map<std::pair<Constant *, unsigned>, SDNode*> ConstantPoolIndices;
|
||||
std::map<std::pair<Constant *, unsigned>, SDNode*> TargetConstantPoolIndices;
|
||||
std::map<std::pair<Constant *,
|
||||
std::pair<int, unsigned> >, SDNode*> ConstantPoolIndices;
|
||||
std::map<std::pair<Constant *,
|
||||
std::pair<int, unsigned> >, SDNode*> TargetConstantPoolIndices;
|
||||
std::map<MachineBasicBlock *, SDNode*> BBNodes;
|
||||
std::vector<SDNode*> ValueTypeNodes;
|
||||
std::map<std::string, SDNode*> ExternalSymbols;
|
||||
|
@@ -1028,19 +1028,19 @@ public:
|
||||
|
||||
class GlobalAddressSDNode : public SDNode {
|
||||
GlobalValue *TheGlobal;
|
||||
int offset;
|
||||
int Offset;
|
||||
protected:
|
||||
friend class SelectionDAG;
|
||||
GlobalAddressSDNode(bool isTarget, const GlobalValue *GA, MVT::ValueType VT,
|
||||
int o=0)
|
||||
: SDNode(isTarget ? ISD::TargetGlobalAddress : ISD::GlobalAddress, VT) {
|
||||
: SDNode(isTarget ? ISD::TargetGlobalAddress : ISD::GlobalAddress, VT),
|
||||
Offset(o) {
|
||||
TheGlobal = const_cast<GlobalValue*>(GA);
|
||||
offset = o;
|
||||
}
|
||||
public:
|
||||
|
||||
GlobalValue *getGlobal() const { return TheGlobal; }
|
||||
int getOffset() const { return offset; }
|
||||
int getOffset() const { return Offset; }
|
||||
|
||||
static bool classof(const GlobalAddressSDNode *) { return true; }
|
||||
static bool classof(const SDNode *N) {
|
||||
@@ -1069,19 +1069,22 @@ public:
|
||||
|
||||
class ConstantPoolSDNode : public SDNode {
|
||||
Constant *C;
|
||||
int Offset;
|
||||
unsigned Alignment;
|
||||
protected:
|
||||
friend class SelectionDAG;
|
||||
ConstantPoolSDNode(Constant *c, MVT::ValueType VT, bool isTarget)
|
||||
ConstantPoolSDNode(bool isTarget, Constant *c, MVT::ValueType VT,
|
||||
int o=0)
|
||||
: SDNode(isTarget ? ISD::TargetConstantPool : ISD::ConstantPool, VT),
|
||||
C(c), Alignment(0) {}
|
||||
ConstantPoolSDNode(Constant *c, MVT::ValueType VT, unsigned Align,
|
||||
bool isTarget)
|
||||
C(c), Offset(o), Alignment(0) {}
|
||||
ConstantPoolSDNode(bool isTarget, Constant *c, MVT::ValueType VT, int o,
|
||||
unsigned Align)
|
||||
: SDNode(isTarget ? ISD::TargetConstantPool : ISD::ConstantPool, VT),
|
||||
C(c), Alignment(Align) {}
|
||||
C(c), Offset(o), Alignment(Align) {}
|
||||
public:
|
||||
|
||||
Constant *get() const { return C; }
|
||||
int getOffset() const { return Offset; }
|
||||
|
||||
// Return the alignment of this constant pool object, which is either 0 (for
|
||||
// default alignment) or log2 of the desired value.
|
||||
|
Reference in New Issue
Block a user