mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-11-01 15:17:25 +00:00
Fix PR11985
- BlockAddress has no support of BA + offset form and there is no way to propagate that offset into machine operand; - Add BA + offset support and a new interface 'getTargetBlockAddress' to simplify target block address forming; - All targets are modified to use new interface and X86 backend is enhanced to support BA + offset addressing. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@163743 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@@ -628,11 +628,11 @@ public:
|
||||
Op.setTargetFlags(TargetFlags);
|
||||
return Op;
|
||||
}
|
||||
static MachineOperand CreateBA(const BlockAddress *BA,
|
||||
static MachineOperand CreateBA(const BlockAddress *BA, int64_t Offset,
|
||||
unsigned char TargetFlags = 0) {
|
||||
MachineOperand Op(MachineOperand::MO_BlockAddress);
|
||||
Op.Contents.OffsetedInfo.Val.BA = BA;
|
||||
Op.setOffset(0); // Offset is always 0.
|
||||
Op.setOffset(Offset);
|
||||
Op.setTargetFlags(TargetFlags);
|
||||
return Op;
|
||||
}
|
||||
|
||||
@@ -437,7 +437,13 @@ public:
|
||||
SDValue getRegisterMask(const uint32_t *RegMask);
|
||||
SDValue getEHLabel(DebugLoc dl, SDValue Root, MCSymbol *Label);
|
||||
SDValue getBlockAddress(const BlockAddress *BA, EVT VT,
|
||||
bool isTarget = false, unsigned char TargetFlags = 0);
|
||||
int64_t Offset = 0, bool isTarget = false,
|
||||
unsigned char TargetFlags = 0);
|
||||
SDValue getTargetBlockAddress(const BlockAddress *BA, EVT VT,
|
||||
int64_t Offset = 0,
|
||||
unsigned char TargetFlags = 0) {
|
||||
return getBlockAddress(BA, VT, Offset, true, TargetFlags);
|
||||
}
|
||||
|
||||
SDValue getCopyToReg(SDValue Chain, DebugLoc dl, unsigned Reg, SDValue N) {
|
||||
return getNode(ISD::CopyToReg, dl, MVT::Other, Chain,
|
||||
|
||||
@@ -1483,15 +1483,17 @@ public:
|
||||
|
||||
class BlockAddressSDNode : public SDNode {
|
||||
const BlockAddress *BA;
|
||||
int64_t Offset;
|
||||
unsigned char TargetFlags;
|
||||
friend class SelectionDAG;
|
||||
BlockAddressSDNode(unsigned NodeTy, EVT VT, const BlockAddress *ba,
|
||||
unsigned char Flags)
|
||||
int64_t o, unsigned char Flags)
|
||||
: SDNode(NodeTy, DebugLoc(), getSDVTList(VT)),
|
||||
BA(ba), TargetFlags(Flags) {
|
||||
BA(ba), Offset(o), TargetFlags(Flags) {
|
||||
}
|
||||
public:
|
||||
const BlockAddress *getBlockAddress() const { return BA; }
|
||||
int64_t getOffset() const { return Offset; }
|
||||
unsigned char getTargetFlags() const { return TargetFlags; }
|
||||
|
||||
static bool classof(const BlockAddressSDNode *) { return true; }
|
||||
|
||||
Reference in New Issue
Block a user