mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-12-13 20:32:21 +00:00
Remove TargetMachine from PPCInstrInfo and all dependencies and
replace with the current subtarget. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@210836 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
5c792faa0e
commit
f7ab98c252
@ -258,8 +258,8 @@ void PPCDispatchGroupSBHazardRecognizer::EmitNoop() {
|
|||||||
// 3. Handling of the esoteric cases in "Resource-based Instruction Grouping".
|
// 3. Handling of the esoteric cases in "Resource-based Instruction Grouping".
|
||||||
//
|
//
|
||||||
|
|
||||||
PPCHazardRecognizer970::PPCHazardRecognizer970(const TargetMachine &TM)
|
PPCHazardRecognizer970::PPCHazardRecognizer970(const ScheduleDAG &DAG)
|
||||||
: TM(TM) {
|
: DAG(DAG) {
|
||||||
EndDispatchGroup();
|
EndDispatchGroup();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -278,7 +278,7 @@ PPCHazardRecognizer970::GetInstrType(unsigned Opcode,
|
|||||||
bool &isFirst, bool &isSingle,
|
bool &isFirst, bool &isSingle,
|
||||||
bool &isCracked,
|
bool &isCracked,
|
||||||
bool &isLoad, bool &isStore) {
|
bool &isLoad, bool &isStore) {
|
||||||
const MCInstrDesc &MCID = TM.getInstrInfo()->get(Opcode);
|
const MCInstrDesc &MCID = DAG.TII->get(Opcode);
|
||||||
|
|
||||||
isLoad = MCID.mayLoad();
|
isLoad = MCID.mayLoad();
|
||||||
isStore = MCID.mayStore();
|
isStore = MCID.mayStore();
|
||||||
|
@ -54,7 +54,7 @@ public:
|
|||||||
/// setting the CTR register then branching through it within a dispatch group),
|
/// setting the CTR register then branching through it within a dispatch group),
|
||||||
/// or storing then loading from the same address within a dispatch group.
|
/// or storing then loading from the same address within a dispatch group.
|
||||||
class PPCHazardRecognizer970 : public ScheduleHazardRecognizer {
|
class PPCHazardRecognizer970 : public ScheduleHazardRecognizer {
|
||||||
const TargetMachine &TM;
|
const ScheduleDAG &DAG;
|
||||||
|
|
||||||
unsigned NumIssued; // Number of insts issued, including advanced cycles.
|
unsigned NumIssued; // Number of insts issued, including advanced cycles.
|
||||||
|
|
||||||
@ -75,7 +75,7 @@ class PPCHazardRecognizer970 : public ScheduleHazardRecognizer {
|
|||||||
unsigned NumStores;
|
unsigned NumStores;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
PPCHazardRecognizer970(const TargetMachine &TM);
|
PPCHazardRecognizer970(const ScheduleDAG &DAG);
|
||||||
virtual HazardType getHazardType(SUnit *SU, int Stalls) override;
|
virtual HazardType getHazardType(SUnit *SU, int Stalls) override;
|
||||||
virtual void EmitInstruction(SUnit *SU) override;
|
virtual void EmitInstruction(SUnit *SU) override;
|
||||||
virtual void AdvanceCycle() override;
|
virtual void AdvanceCycle() override;
|
||||||
|
@ -27,6 +27,7 @@
|
|||||||
#include "llvm/CodeGen/MachineMemOperand.h"
|
#include "llvm/CodeGen/MachineMemOperand.h"
|
||||||
#include "llvm/CodeGen/MachineRegisterInfo.h"
|
#include "llvm/CodeGen/MachineRegisterInfo.h"
|
||||||
#include "llvm/CodeGen/PseudoSourceValue.h"
|
#include "llvm/CodeGen/PseudoSourceValue.h"
|
||||||
|
#include "llvm/CodeGen/ScheduleDAG.h"
|
||||||
#include "llvm/CodeGen/SlotIndexes.h"
|
#include "llvm/CodeGen/SlotIndexes.h"
|
||||||
#include "llvm/MC/MCAsmInfo.h"
|
#include "llvm/MC/MCAsmInfo.h"
|
||||||
#include "llvm/Support/CommandLine.h"
|
#include "llvm/Support/CommandLine.h"
|
||||||
@ -60,9 +61,9 @@ cl::Hidden);
|
|||||||
// Pin the vtable to this file.
|
// Pin the vtable to this file.
|
||||||
void PPCInstrInfo::anchor() {}
|
void PPCInstrInfo::anchor() {}
|
||||||
|
|
||||||
PPCInstrInfo::PPCInstrInfo(PPCTargetMachine &tm)
|
PPCInstrInfo::PPCInstrInfo(PPCSubtarget &STI)
|
||||||
: PPCGenInstrInfo(PPC::ADJCALLSTACKDOWN, PPC::ADJCALLSTACKUP),
|
: PPCGenInstrInfo(PPC::ADJCALLSTACKDOWN, PPC::ADJCALLSTACKUP),
|
||||||
TM(tm), RI(*TM.getSubtargetImpl()) {}
|
Subtarget(STI), RI(STI) {}
|
||||||
|
|
||||||
/// CreateTargetHazardRecognizer - Return the hazard recognizer to use for
|
/// CreateTargetHazardRecognizer - Return the hazard recognizer to use for
|
||||||
/// this target when scheduling the DAG.
|
/// this target when scheduling the DAG.
|
||||||
@ -84,7 +85,8 @@ ScheduleHazardRecognizer *PPCInstrInfo::CreateTargetHazardRecognizer(
|
|||||||
ScheduleHazardRecognizer *PPCInstrInfo::CreateTargetPostRAHazardRecognizer(
|
ScheduleHazardRecognizer *PPCInstrInfo::CreateTargetPostRAHazardRecognizer(
|
||||||
const InstrItineraryData *II,
|
const InstrItineraryData *II,
|
||||||
const ScheduleDAG *DAG) const {
|
const ScheduleDAG *DAG) const {
|
||||||
unsigned Directive = TM.getSubtarget<PPCSubtarget>().getDarwinDirective();
|
unsigned Directive =
|
||||||
|
DAG->TM.getSubtarget<PPCSubtarget>().getDarwinDirective();
|
||||||
|
|
||||||
if (Directive == PPC::DIR_PWR7)
|
if (Directive == PPC::DIR_PWR7)
|
||||||
return new PPCDispatchGroupSBHazardRecognizer(II, DAG);
|
return new PPCDispatchGroupSBHazardRecognizer(II, DAG);
|
||||||
@ -92,9 +94,9 @@ ScheduleHazardRecognizer *PPCInstrInfo::CreateTargetPostRAHazardRecognizer(
|
|||||||
// Most subtargets use a PPC970 recognizer.
|
// Most subtargets use a PPC970 recognizer.
|
||||||
if (Directive != PPC::DIR_440 && Directive != PPC::DIR_A2 &&
|
if (Directive != PPC::DIR_440 && Directive != PPC::DIR_A2 &&
|
||||||
Directive != PPC::DIR_E500mc && Directive != PPC::DIR_E5500) {
|
Directive != PPC::DIR_E500mc && Directive != PPC::DIR_E5500) {
|
||||||
assert(TM.getInstrInfo() && "No InstrInfo?");
|
assert(DAG->TII && "No InstrInfo?");
|
||||||
|
|
||||||
return new PPCHazardRecognizer970(TM);
|
return new PPCHazardRecognizer970(*DAG);
|
||||||
}
|
}
|
||||||
|
|
||||||
return new ScoreboardHazardRecognizer(II, DAG);
|
return new ScoreboardHazardRecognizer(II, DAG);
|
||||||
@ -129,7 +131,7 @@ int PPCInstrInfo::getOperandLatency(const InstrItineraryData *ItinData,
|
|||||||
|
|
||||||
// On some cores, there is an additional delay between writing to a condition
|
// On some cores, there is an additional delay between writing to a condition
|
||||||
// register, and using it from a branch.
|
// register, and using it from a branch.
|
||||||
unsigned Directive = TM.getSubtarget<PPCSubtarget>().getDarwinDirective();
|
unsigned Directive = Subtarget.getDarwinDirective();
|
||||||
switch (Directive) {
|
switch (Directive) {
|
||||||
default: break;
|
default: break;
|
||||||
case PPC::DIR_7400:
|
case PPC::DIR_7400:
|
||||||
@ -313,7 +315,7 @@ void PPCInstrInfo::insertNoop(MachineBasicBlock &MBB,
|
|||||||
MachineBasicBlock::iterator MI) const {
|
MachineBasicBlock::iterator MI) const {
|
||||||
// This function is used for scheduling, and the nop wanted here is the type
|
// This function is used for scheduling, and the nop wanted here is the type
|
||||||
// that terminates dispatch groups on the POWER cores.
|
// that terminates dispatch groups on the POWER cores.
|
||||||
unsigned Directive = TM.getSubtarget<PPCSubtarget>().getDarwinDirective();
|
unsigned Directive = Subtarget.getDarwinDirective();
|
||||||
unsigned Opcode;
|
unsigned Opcode;
|
||||||
switch (Directive) {
|
switch (Directive) {
|
||||||
default: Opcode = PPC::NOP; break;
|
default: Opcode = PPC::NOP; break;
|
||||||
@ -332,7 +334,7 @@ bool PPCInstrInfo::AnalyzeBranch(MachineBasicBlock &MBB,MachineBasicBlock *&TBB,
|
|||||||
MachineBasicBlock *&FBB,
|
MachineBasicBlock *&FBB,
|
||||||
SmallVectorImpl<MachineOperand> &Cond,
|
SmallVectorImpl<MachineOperand> &Cond,
|
||||||
bool AllowModify) const {
|
bool AllowModify) const {
|
||||||
bool isPPC64 = TM.getSubtargetImpl()->isPPC64();
|
bool isPPC64 = Subtarget.isPPC64();
|
||||||
|
|
||||||
// If the block has no terminators, it just falls into the block after it.
|
// If the block has no terminators, it just falls into the block after it.
|
||||||
MachineBasicBlock::iterator I = MBB.end();
|
MachineBasicBlock::iterator I = MBB.end();
|
||||||
@ -538,7 +540,7 @@ PPCInstrInfo::InsertBranch(MachineBasicBlock &MBB, MachineBasicBlock *TBB,
|
|||||||
assert((Cond.size() == 2 || Cond.size() == 0) &&
|
assert((Cond.size() == 2 || Cond.size() == 0) &&
|
||||||
"PPC branch conditions have two components!");
|
"PPC branch conditions have two components!");
|
||||||
|
|
||||||
bool isPPC64 = TM.getSubtargetImpl()->isPPC64();
|
bool isPPC64 = Subtarget.isPPC64();
|
||||||
|
|
||||||
// One-way branch.
|
// One-way branch.
|
||||||
if (!FBB) {
|
if (!FBB) {
|
||||||
@ -579,7 +581,7 @@ bool PPCInstrInfo::canInsertSelect(const MachineBasicBlock &MBB,
|
|||||||
const SmallVectorImpl<MachineOperand> &Cond,
|
const SmallVectorImpl<MachineOperand> &Cond,
|
||||||
unsigned TrueReg, unsigned FalseReg,
|
unsigned TrueReg, unsigned FalseReg,
|
||||||
int &CondCycles, int &TrueCycles, int &FalseCycles) const {
|
int &CondCycles, int &TrueCycles, int &FalseCycles) const {
|
||||||
if (!TM.getSubtargetImpl()->hasISEL())
|
if (!Subtarget.hasISEL())
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
if (Cond.size() != 2)
|
if (Cond.size() != 2)
|
||||||
@ -623,7 +625,7 @@ void PPCInstrInfo::insertSelect(MachineBasicBlock &MBB,
|
|||||||
assert(Cond.size() == 2 &&
|
assert(Cond.size() == 2 &&
|
||||||
"PPC branch conditions have two components!");
|
"PPC branch conditions have two components!");
|
||||||
|
|
||||||
assert(TM.getSubtargetImpl()->hasISEL() &&
|
assert(Subtarget.hasISEL() &&
|
||||||
"Cannot insert select on target without ISEL support");
|
"Cannot insert select on target without ISEL support");
|
||||||
|
|
||||||
// Get the register classes.
|
// Get the register classes.
|
||||||
@ -826,7 +828,7 @@ PPCInstrInfo::StoreRegToStackSlot(MachineFunction &MF,
|
|||||||
FrameIdx));
|
FrameIdx));
|
||||||
NonRI = true;
|
NonRI = true;
|
||||||
} else if (PPC::VRSAVERCRegClass.hasSubClassEq(RC)) {
|
} else if (PPC::VRSAVERCRegClass.hasSubClassEq(RC)) {
|
||||||
assert(TM.getSubtargetImpl()->isDarwin() &&
|
assert(Subtarget.isDarwin() &&
|
||||||
"VRSAVE only needs spill/restore on Darwin");
|
"VRSAVE only needs spill/restore on Darwin");
|
||||||
NewMIs.push_back(addFrameReference(BuildMI(MF, DL, get(PPC::SPILL_VRSAVE))
|
NewMIs.push_back(addFrameReference(BuildMI(MF, DL, get(PPC::SPILL_VRSAVE))
|
||||||
.addReg(SrcReg,
|
.addReg(SrcReg,
|
||||||
@ -921,7 +923,7 @@ PPCInstrInfo::LoadRegFromStackSlot(MachineFunction &MF, DebugLoc DL,
|
|||||||
FrameIdx));
|
FrameIdx));
|
||||||
NonRI = true;
|
NonRI = true;
|
||||||
} else if (PPC::VRSAVERCRegClass.hasSubClassEq(RC)) {
|
} else if (PPC::VRSAVERCRegClass.hasSubClassEq(RC)) {
|
||||||
assert(TM.getSubtargetImpl()->isDarwin() &&
|
assert(Subtarget.isDarwin() &&
|
||||||
"VRSAVE only needs spill/restore on Darwin");
|
"VRSAVE only needs spill/restore on Darwin");
|
||||||
NewMIs.push_back(addFrameReference(BuildMI(MF, DL,
|
NewMIs.push_back(addFrameReference(BuildMI(MF, DL,
|
||||||
get(PPC::RESTORE_VRSAVE),
|
get(PPC::RESTORE_VRSAVE),
|
||||||
@ -1035,7 +1037,7 @@ bool PPCInstrInfo::FoldImmediate(MachineInstr *UseMI, MachineInstr *DefMI,
|
|||||||
|
|
||||||
unsigned ZeroReg;
|
unsigned ZeroReg;
|
||||||
if (UseInfo->isLookupPtrRegClass()) {
|
if (UseInfo->isLookupPtrRegClass()) {
|
||||||
bool isPPC64 = TM.getSubtargetImpl()->isPPC64();
|
bool isPPC64 = Subtarget.isPPC64();
|
||||||
ZeroReg = isPPC64 ? PPC::ZERO8 : PPC::ZERO;
|
ZeroReg = isPPC64 ? PPC::ZERO8 : PPC::ZERO;
|
||||||
} else {
|
} else {
|
||||||
ZeroReg = UseInfo->RegClass == PPC::G8RC_NOX0RegClassID ?
|
ZeroReg = UseInfo->RegClass == PPC::G8RC_NOX0RegClassID ?
|
||||||
@ -1102,7 +1104,7 @@ bool PPCInstrInfo::PredicateInstruction(
|
|||||||
unsigned OpC = MI->getOpcode();
|
unsigned OpC = MI->getOpcode();
|
||||||
if (OpC == PPC::BLR) {
|
if (OpC == PPC::BLR) {
|
||||||
if (Pred[1].getReg() == PPC::CTR8 || Pred[1].getReg() == PPC::CTR) {
|
if (Pred[1].getReg() == PPC::CTR8 || Pred[1].getReg() == PPC::CTR) {
|
||||||
bool isPPC64 = TM.getSubtargetImpl()->isPPC64();
|
bool isPPC64 = Subtarget.isPPC64();
|
||||||
MI->setDesc(get(Pred[0].getImm() ?
|
MI->setDesc(get(Pred[0].getImm() ?
|
||||||
(isPPC64 ? PPC::BDNZLR8 : PPC::BDNZLR) :
|
(isPPC64 ? PPC::BDNZLR8 : PPC::BDNZLR) :
|
||||||
(isPPC64 ? PPC::BDZLR8 : PPC::BDZLR)));
|
(isPPC64 ? PPC::BDZLR8 : PPC::BDZLR)));
|
||||||
@ -1124,7 +1126,7 @@ bool PPCInstrInfo::PredicateInstruction(
|
|||||||
return true;
|
return true;
|
||||||
} else if (OpC == PPC::B) {
|
} else if (OpC == PPC::B) {
|
||||||
if (Pred[1].getReg() == PPC::CTR8 || Pred[1].getReg() == PPC::CTR) {
|
if (Pred[1].getReg() == PPC::CTR8 || Pred[1].getReg() == PPC::CTR) {
|
||||||
bool isPPC64 = TM.getSubtargetImpl()->isPPC64();
|
bool isPPC64 = Subtarget.isPPC64();
|
||||||
MI->setDesc(get(Pred[0].getImm() ?
|
MI->setDesc(get(Pred[0].getImm() ?
|
||||||
(isPPC64 ? PPC::BDNZ8 : PPC::BDNZ) :
|
(isPPC64 ? PPC::BDNZ8 : PPC::BDNZ) :
|
||||||
(isPPC64 ? PPC::BDZ8 : PPC::BDZ)));
|
(isPPC64 ? PPC::BDZ8 : PPC::BDZ)));
|
||||||
@ -1162,7 +1164,7 @@ bool PPCInstrInfo::PredicateInstruction(
|
|||||||
llvm_unreachable("Cannot predicate bctr[l] on the ctr register");
|
llvm_unreachable("Cannot predicate bctr[l] on the ctr register");
|
||||||
|
|
||||||
bool setLR = OpC == PPC::BCTRL || OpC == PPC::BCTRL8;
|
bool setLR = OpC == PPC::BCTRL || OpC == PPC::BCTRL8;
|
||||||
bool isPPC64 = TM.getSubtargetImpl()->isPPC64();
|
bool isPPC64 = Subtarget.isPPC64();
|
||||||
|
|
||||||
if (Pred[0].getImm() == PPC::PRED_BIT_SET) {
|
if (Pred[0].getImm() == PPC::PRED_BIT_SET) {
|
||||||
MI->setDesc(get(isPPC64 ? (setLR ? PPC::BCCTRL8 : PPC::BCCTR8) :
|
MI->setDesc(get(isPPC64 ? (setLR ? PPC::BCCTRL8 : PPC::BCCTR8) :
|
||||||
@ -1323,7 +1325,7 @@ bool PPCInstrInfo::optimizeCompareInstr(MachineInstr *CmpInstr,
|
|||||||
// for equality checks (as those don't depend on the sign). On PPC64,
|
// for equality checks (as those don't depend on the sign). On PPC64,
|
||||||
// we are restricted to equality for unsigned 64-bit comparisons and for
|
// we are restricted to equality for unsigned 64-bit comparisons and for
|
||||||
// signed 32-bit comparisons the applicability is more restricted.
|
// signed 32-bit comparisons the applicability is more restricted.
|
||||||
bool isPPC64 = TM.getSubtargetImpl()->isPPC64();
|
bool isPPC64 = Subtarget.isPPC64();
|
||||||
bool is32BitSignedCompare = OpC == PPC::CMPWI || OpC == PPC::CMPW;
|
bool is32BitSignedCompare = OpC == PPC::CMPWI || OpC == PPC::CMPW;
|
||||||
bool is32BitUnsignedCompare = OpC == PPC::CMPLWI || OpC == PPC::CMPLW;
|
bool is32BitUnsignedCompare = OpC == PPC::CMPLWI || OpC == PPC::CMPLW;
|
||||||
bool is64BitUnsignedCompare = OpC == PPC::CMPLDI || OpC == PPC::CMPLD;
|
bool is64BitUnsignedCompare = OpC == PPC::CMPLDI || OpC == PPC::CMPLD;
|
||||||
|
@ -65,7 +65,7 @@ enum PPC970_Unit {
|
|||||||
|
|
||||||
|
|
||||||
class PPCInstrInfo : public PPCGenInstrInfo {
|
class PPCInstrInfo : public PPCGenInstrInfo {
|
||||||
PPCTargetMachine &TM;
|
PPCSubtarget &Subtarget;
|
||||||
const PPCRegisterInfo RI;
|
const PPCRegisterInfo RI;
|
||||||
|
|
||||||
bool StoreRegToStackSlot(MachineFunction &MF,
|
bool StoreRegToStackSlot(MachineFunction &MF,
|
||||||
@ -80,7 +80,7 @@ class PPCInstrInfo : public PPCGenInstrInfo {
|
|||||||
bool &NonRI, bool &SpillsVRS) const;
|
bool &NonRI, bool &SpillsVRS) const;
|
||||||
virtual void anchor();
|
virtual void anchor();
|
||||||
public:
|
public:
|
||||||
explicit PPCInstrInfo(PPCTargetMachine &TM);
|
explicit PPCInstrInfo(PPCSubtarget &STI);
|
||||||
|
|
||||||
/// getRegisterInfo - TargetInstrInfo is a superset of MRegister info. As
|
/// getRegisterInfo - TargetInstrInfo is a superset of MRegister info. As
|
||||||
/// such, whenever a client has an instance of instruction info, it should
|
/// such, whenever a client has an instance of instruction info, it should
|
||||||
|
@ -42,7 +42,7 @@ PPCTargetMachine::PPCTargetMachine(const Target &T, StringRef TT, StringRef CPU,
|
|||||||
Reloc::Model RM, CodeModel::Model CM,
|
Reloc::Model RM, CodeModel::Model CM,
|
||||||
CodeGenOpt::Level OL, bool is64Bit)
|
CodeGenOpt::Level OL, bool is64Bit)
|
||||||
: LLVMTargetMachine(T, TT, CPU, FS, Options, RM, CM, OL),
|
: LLVMTargetMachine(T, TT, CPU, FS, Options, RM, CM, OL),
|
||||||
Subtarget(TT, CPU, FS, is64Bit, OL), InstrInfo(*this),
|
Subtarget(TT, CPU, FS, is64Bit, OL), InstrInfo(Subtarget),
|
||||||
JITInfo(*this, is64Bit), TLInfo(*this), TSInfo(*this) {
|
JITInfo(*this, is64Bit), TLInfo(*this), TSInfo(*this) {
|
||||||
initAsmInfo();
|
initAsmInfo();
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user