37#define DEBUG_TYPE "M68k-instr-info" 
   39#define GET_INSTRINFO_CTOR_DTOR 
   40#include "M68kGenInstrInfo.inc" 
   43void M68kInstrInfo::anchor() {}
 
   89                                      bool AllowModify)
 const {
 
   92      std::pair<MachineBasicBlock::reverse_iterator, MachineBasicBlock *>{
 
   96  std::vector<std::reference_wrapper<llvm::MachineInstr>> EraseList;
 
   98    for (
auto &
Ref : EraseList)
 
   99      Ref.get().eraseFromParent();
 
  104  for (
auto iter = 
MBB.rbegin(); iter != 
MBB.rend(); iter = std::next(iter)) {
 
  106    unsigned Opcode = iter->getOpcode();
 
  108    if (iter->isDebugInstr())
 
  113    if (!isUnpredicatedTerminator(*iter))
 
  118    if (!iter->isBranch())
 
  122    if (Opcode == M68k::BRA8 || Opcode == M68k::BRA16) {
 
  123      if (!iter->getOperand(0).isMBB())
 
  125      UncondBranch = {iter, iter->getOperand(0).getMBB()};
 
  128      TBB = UncondBranch.second;
 
  134      EraseList.insert(EraseList.begin(), 
MBB.rbegin(), iter);
 
  140      if (
MBB.isLayoutSuccessor(UncondBranch.second)) {
 
  142        EraseList.push_back(*iter);
 
  143        UncondBranch = {
MBB.rend(), 
nullptr};
 
  164      if (!iter->getOperand(0).isMBB())
 
  176      if (UncondBranch.first != 
MBB.rend()) {
 
  178        assert(std::next(UncondBranch.first) == iter && 
"Wrong block layout.");
 
  197        if (AllowModify && 
MBB.isLayoutSuccessor(CondBranchTarget)) {
 
  203              .
addMBB(UncondBranch.second);
 
  205          EraseList.push_back(*iter);
 
  206          EraseList.push_back(*UncondBranch.first);
 
  208          TBB = UncondBranch.second;
 
  214          TBB = CondBranchTarget;
 
  215          FBB = UncondBranch.second;
 
  219        UncondBranch = {
MBB.rend(), 
nullptr};
 
  223      TBB = CondBranchTarget;
 
  238    if (!iter->getOperand(0).isMBB())
 
  240    auto NewTBB = iter->getOperand(0).getMBB();
 
  241    if (OldBranchCode == BranchCode && 
TBB == NewTBB)
 
 
  255                                  bool AllowModify)
 const {
 
 
  260                                     int *BytesRemoved)
 const {
 
  261  assert(!BytesRemoved && 
"code size not handled");
 
  266  while (
I != 
MBB.begin()) {
 
  268    if (
I->isDebugValue())
 
  270    if (
I->getOpcode() != M68k::BRA8 &&
 
  274    I->eraseFromParent();
 
 
  286  assert(
TBB && 
"InsertBranch must not be told to insert a fallthrough");
 
  288         "M68k branch conditions have one component!");
 
  289  assert(!BytesAdded && 
"code size not handled");
 
  293    assert(!FBB && 
"Unconditional branch with multiple successors!");
 
  299  bool FallThru = FBB == 
nullptr;
 
 
  317                            unsigned Reg, 
MVT From, 
MVT To)
 const {
 
  318  if (From == MVT::i8) {
 
  321    if (To == MVT::i32) {
 
  322      R = 
RI.getSubReg(Reg, M68k::MxSubRegIndex16Lo);
 
  323      assert(R && 
"No viable SUB register available");
 
 
  334                            unsigned Reg, 
MVT From, 
MVT To)
 const {
 
 
  356  bool IsAddressReg = 
false;
 
  358  const auto *DR32 = 
RI.getRegClass(M68k::DR32RegClassID);
 
  359  const auto *AR32 = 
RI.getRegClass(M68k::AR32RegClassID);
 
  360  const auto *AR16 = 
RI.getRegClass(M68k::AR16RegClassID);
 
  362  if (AR16->contains(Reg) || AR32->contains(Reg))
 
  369          : 
Register(
RI.getMatchingMegaReg(Reg, IsAddressReg ? AR32 : DR32));
 
  370  assert(SReg && 
"No viable MEGA register available");
 
  375  if (MVTSize == MVT::i8 || (!IsAddressReg && Imm >= -128 && Imm <= 127)) {
 
  383  } 
else if (DR32->contains(Reg) && 
isUInt<8>(Imm)) {
 
  389    unsigned SubReg = 
RI.getSubReg(Reg, M68k::MxSubRegIndex8Lo);
 
  398  } 
else if (IsAddressReg && Imm == 0) {
 
  415  } 
else if (AR32->contains(Reg) && 
isUInt<16>(Imm)) {
 
  418    unsigned SubReg = 
RI.getSubReg(Reg, M68k::MxSubRegIndex16Lo);
 
  427    MIB->
setDesc(
get(MVTSize == MVT::i16 ? M68k::MOV16ri : M68k::MOV32ri));
 
 
  435  unsigned Move = MVTDst == MVT::i16 ? M68k::MOV16rr : M68k::MOV32rr;
 
  439  assert(Dst != Src && 
"You cannot use the same Regs with MOVX_RR");
 
  443  const auto *RCDst = 
TRI.getMaximalPhysRegClass(Dst, MVTDst);
 
  444  const auto *RCSrc = 
TRI.getMaximalPhysRegClass(Src, MVTSrc);
 
  446  assert(RCDst && RCSrc && 
"Wrong use of MOVX_RR");
 
  447  assert(RCDst != RCSrc && 
"You cannot use the same Reg Classes with MOVX_RR");
 
  451  unsigned SSrc = 
RI.getMatchingMegaReg(Src, RCDst);
 
  452  assert(SSrc && 
"No viable MEGA register available");
 
 
  473                                    MVT MVTDst, 
MVT MVTSrc)
 const {
 
  478  if (MVTDst == MVT::i16)
 
  479    Move = M68k::MOV16rr;
 
  481    Move = M68k::MOV32rr;
 
  486  assert(Dst != Src && 
"You cannot use the same Regs with MOVSX_RR");
 
  490  const auto *RCDst = 
TRI.getMaximalPhysRegClass(Dst, MVTDst);
 
  491  const auto *RCSrc = 
TRI.getMaximalPhysRegClass(Src, MVTSrc);
 
  493  assert(RCDst && RCSrc && 
"Wrong use of MOVSX_RR");
 
  494  assert(RCDst != RCSrc && 
"You cannot use the same Reg Classes with MOVSX_RR");
 
  498  unsigned SSrc = 
RI.getMatchingMegaReg(Src, RCDst);
 
  499  assert(SSrc && 
"No viable MEGA register available");
 
 
  535      RI.getSubReg(Dst, MVTSrc == MVT::i8 ? M68k::MxSubRegIndex8Lo
 
  536                                          : M68k::MxSubRegIndex16Lo);
 
  537  assert(SubDst && 
"No viable SUB register available");
 
 
  580        Opd.
getReg(), M68k::MxSubRegIndex8Lo, &M68k::DR16RegClass));
 
 
  610  unsigned Mask = 1 << 
RI.getSpillRegisterOrder(Reg);
 
 
  641  assert(
Desc.getNumOperands() == 3 && 
"Expected two-addr instruction.");
 
 
  656  switch (
MI.getOpcode()) {
 
  671  case M68k::SETCS_C8d:
 
  673  case M68k::SETCS_C16d:
 
  675  case M68k::SETCS_C32d:
 
 
  689  const unsigned NameIndices = M68kInstrNameIndices[
MI->getOpcode()];
 
  690  StringRef InstrName(&M68kInstrNameData[NameIndices]);
 
  696    return Regex(
"[A-Z]+(8|16|32)k[a-z](_TC)?$").
match(InstrName);
 
  700  if (OperandNo == 
MI->getNumExplicitOperands() - 1)
 
  701    return Regex(
"[A-Z]+(8|16|32)[a-z]k(_TC)?$").
match(InstrName);
 
 
  710                                bool RenamableDest, 
bool RenamableSrc)
 const {
 
  714  if (M68k::XR32RegClass.
contains(DstReg, SrcReg))
 
  716  else if (M68k::XR16RegClass.
contains(DstReg, SrcReg))
 
  718  else if (M68k::DR8RegClass.
contains(DstReg, SrcReg))
 
  734  if (M68k::DR8RegClass.
contains(SrcReg)) {
 
  735    if (M68k::XR16RegClass.
contains(DstReg))
 
  736      Opc = M68k::MOVXd16d8;
 
  737    else if (M68k::XR32RegClass.
contains(DstReg))
 
  738      Opc = M68k::MOVXd32d8;
 
  739  } 
else if (M68k::XR16RegClass.
contains(SrcReg) &&
 
  740             M68k::XR32RegClass.
contains(DstReg))
 
  741    Opc = M68k::MOVXd32d16;
 
  749  bool FromCCR = SrcReg == M68k::CCR;
 
  750  bool FromSR = SrcReg == M68k::SR;
 
  751  bool ToCCR = DstReg == M68k::CCR;
 
  752  bool ToSR = DstReg == M68k::SR;
 
  755    if (M68k::DR8RegClass.
contains(DstReg)) {
 
  757    } 
else if (M68k::DR16RegClass.
contains(DstReg)) {
 
  759    } 
else if (M68k::DR32RegClass.
contains(DstReg)) {
 
  766    if (M68k::DR8RegClass.
contains(SrcReg)) {
 
  768    } 
else if (M68k::DR16RegClass.
contains(SrcReg)) {
 
  770    } 
else if (M68k::DR32RegClass.
contains(SrcReg)) {
 
  776  } 
else if (FromSR || ToSR)
 
  786                    << 
RI.getName(DstReg) << 
'\n');
 
 
  794  switch (
TRI->getSpillSize(*RC)) {
 
  797        dbgs() << 
"Cannot determine appropriate opcode for load/store to/from " 
  798               << 
TRI->getName(Reg) << 
" of class " << 
TRI->getRegClassName(RC)
 
  799               << 
" with spill size " << 
TRI->getSpillSize(*RC) << 
'\n');
 
  802    if (M68k::XR16RegClass.hasSubClassEq(RC))
 
  803      return load ? M68k::MOVM16mp_P : M68k::MOVM16pm_P;
 
  804    if (M68k::DR8RegClass.hasSubClassEq(RC))
 
  805      return load ? M68k::MOVM16mp_P : M68k::MOVM16pm_P;
 
  806    if (M68k::CCRCRegClass.hasSubClassEq(RC))
 
  807      return load ? M68k::MOVM16mp_P : M68k::MOVM16pm_P;
 
  810    if (M68k::XR32RegClass.hasSubClassEq(RC))
 
  811      return load ? M68k::MOVM32mp_P : M68k::MOVM32pm_P;
 
  830                                      unsigned SubIdx, 
unsigned &
Size,
 
 
  846         "Stack slot is too small to store");
 
 
  865         "Stack slot is too small to load");
 
 
  881  if (GlobalBaseReg != 0)
 
  882    return GlobalBaseReg;
 
  894  GlobalBaseReg = RegInfo.createVirtualRegister(&M68k::AR32_NOSPRegClass);
 
  896  return GlobalBaseReg;
 
 
  899std::pair<unsigned, unsigned>
 
  901  return std::make_pair(TF, 0u);
 
 
  907  static const std::pair<unsigned, const char *> TargetFlags[] = {
 
  908      {MO_ABSOLUTE_ADDRESS, 
"m68k-absolute"},
 
  909      {MO_PC_RELATIVE_ADDRESS, 
"m68k-pcrel"},
 
  910      {MO_GOT, 
"m68k-got"},
 
  911      {MO_GOTOFF, 
"m68k-gotoff"},
 
  912      {MO_GOTPCREL, 
"m68k-gotpcrel"},
 
  913      {MO_PLT, 
"m68k-plt"},
 
  914      {MO_TLSGD, 
"m68k-tlsgd"},
 
  915      {MO_TLSLD, 
"m68k-tlsld"},
 
  916      {MO_TLSLDM, 
"m68k-tlsldm"},
 
  917      {MO_TLSIE, 
"m68k-tlsie"},
 
  918      {MO_TLSLE, 
"m68k-tlsle"}};
 
 
  923#define DEBUG_TYPE "m68k-create-global-base-reg" 
  925#define PASS_NAME "M68k PIC Global Base Reg Initialization" 
  937    unsigned GlobalBaseReg = MxFI->getGlobalBaseReg();
 
  940    if (GlobalBaseReg == 0)
 
  961char M68kGlobalBaseReg::ID = 0;
 
  967  return new M68kGlobalBaseReg();
 
 
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
 
AMDGPU Mark last scratch load
 
MachineBasicBlock MachineBasicBlock::iterator DebugLoc DL
 
MachineBasicBlock MachineBasicBlock::iterator MBBI
 
const HexagonInstrInfo * TII
 
This file implements the LivePhysRegs utility for tracking liveness of physical registers.
 
This file exposes functions that may be used with BuildMI from the MachineInstrBuilder....
 
static M68k::CondCode getCondFromBranchOpc(unsigned BrOpc)
 
static bool Expand2AddrUndef(MachineInstrBuilder &MIB, const MCInstrDesc &Desc)
Expand a single-def pseudo instruction to a two-addr instruction with two undef reads of the register...
 
This file contains the M68k implementation of the TargetInstrInfo class.
 
This file contains the declarations for the code emitter which are useful outside of the emitter itse...
 
This file declares the M68k specific subclass of MachineFunctionInfo.
 
This file declares the M68k specific subclass of TargetMachine.
 
Register const TargetRegisterInfo * TRI
 
Promote Memory to Register
 
#define INITIALIZE_PASS(passName, arg, name, cfg, analysis)
 
const SmallVectorImpl< MachineOperand > MachineBasicBlock * TBB
 
const SmallVectorImpl< MachineOperand > & Cond
 
static bool contains(SmallPtrSetImpl< ConstantExpr * > &Cache, ConstantExpr *Expr, Constant *C)
 
This file defines the make_scope_exit function, which executes user-defined cleanup logic at scope ex...
 
static SPCC::CondCodes GetOppositeBranchCondition(SPCC::CondCodes CC)
 
static unsigned getStoreRegOpcode(Register SrcReg, const TargetRegisterClass *RC, bool IsStackAligned, const X86Subtarget &STI)
 
static unsigned getLoadRegOpcode(Register DestReg, const TargetRegisterClass *RC, bool IsStackAligned, const X86Subtarget &STI)
 
static unsigned getLoadStoreRegOpcode(Register Reg, const TargetRegisterClass *RC, bool IsStackAligned, const X86Subtarget &STI, bool Load)
 
static unsigned GetCondBranchFromCond(XCore::CondCode CC)
GetCondBranchFromCond - Return the Branch instruction opcode that matches the cc.
 
Represent the analysis usage information of a pass.
 
LLVM_ABI void setPreservesCFG()
This function should be called by the pass, iff they do not:
 
ArrayRef - Represent a constant reference to an array (0 or more elements consecutively in memory),...
 
FunctionPass class - This class is used to implement most global optimizations.
 
unsigned getGlobalBaseReg(MachineFunction *MF) const
Return a virtual register initialized with the global base register value.
 
const M68kSubtarget & Subtarget
 
bool ExpandMOVI(MachineInstrBuilder &MIB, MVT MVTSize) const
Move immediate to register.
 
bool ExpandMOVSZX_RR(MachineInstrBuilder &MIB, bool IsSigned, MVT MVTDst, MVT MVTSrc) const
Move from register and extend.
 
const M68kRegisterInfo & getRegisterInfo() const
TargetInstrInfo is a superset of MRegister info.
 
const M68kRegisterInfo RI
 
void loadRegFromStackSlot(MachineBasicBlock &MBB, MachineBasicBlock::iterator MI, Register DestReg, int FrameIndex, const TargetRegisterClass *RC, const TargetRegisterInfo *TRI, Register VReg, MachineInstr::MIFlag Flags=MachineInstr::NoFlags) const override
 
bool analyzeBranch(MachineBasicBlock &MBB, MachineBasicBlock *&TBB, MachineBasicBlock *&FBB, SmallVectorImpl< MachineOperand > &Cond, bool AllowModify) const override
 
ArrayRef< std::pair< unsigned, const char * > > getSerializableDirectMachineOperandTargetFlags() const override
 
bool expandPostRAPseudo(MachineInstr &MI) const override
 
unsigned insertBranch(MachineBasicBlock &MBB, MachineBasicBlock *TBB, MachineBasicBlock *FBB, ArrayRef< MachineOperand > Cond, const DebugLoc &DL, int *BytesAdded=nullptr) const override
 
void copyPhysReg(MachineBasicBlock &MBB, MachineBasicBlock::iterator MI, const DebugLoc &DL, Register DestReg, Register SrcReg, bool KillSrc, bool RenamableDest=false, bool RenamableSrc=false) const override
 
std::pair< unsigned, unsigned > decomposeMachineOperandsTargetFlags(unsigned TF) const override
 
bool AnalyzeBranchImpl(MachineBasicBlock &MBB, MachineBasicBlock *&TBB, MachineBasicBlock *&FBB, SmallVectorImpl< MachineOperand > &Cond, bool AllowModify) const
 
bool isPCRelRegisterOperandLegal(const MachineOperand &MO) const override
 
bool ExpandMOVX_RR(MachineInstrBuilder &MIB, MVT MVTDst, MVT MVTSrc) const
Move across register classes without extension.
 
bool ExpandMOVEM(MachineInstrBuilder &MIB, const MCInstrDesc &Desc, bool IsRM) const
Expand all MOVEM pseudos into real MOVEMs.
 
unsigned removeBranch(MachineBasicBlock &MBB, int *BytesRemoved=nullptr) const override
 
bool ExpandPUSH_POP(MachineInstrBuilder &MIB, const MCInstrDesc &Desc, bool IsPush) const
Push/Pop to/from stack.
 
M68kInstrInfo(const M68kSubtarget &STI)
 
void AddZExt(MachineBasicBlock &MBB, MachineBasicBlock::iterator I, DebugLoc DL, unsigned Reg, MVT From, MVT To) const
Add appropriate ZExt nodes.
 
void storeRegToStackSlot(MachineBasicBlock &MBB, MachineBasicBlock::iterator MI, Register SrcReg, bool IsKill, int FrameIndex, const TargetRegisterClass *RC, const TargetRegisterInfo *TRI, Register VReg, MachineInstr::MIFlag Flags=MachineInstr::NoFlags) const override
 
bool ExpandCCR(MachineInstrBuilder &MIB, bool IsToCCR) const
Moves to/from CCR.
 
bool ExpandMOVSZX_RM(MachineInstrBuilder &MIB, bool IsSigned, const MCInstrDesc &Desc, MVT MVTDst, MVT MVTSrc) const
Move from memory and extend.
 
bool getStackSlotRange(const TargetRegisterClass *RC, unsigned SubIdx, unsigned &Size, unsigned &Offset, const MachineFunction &MF) const override
 
void AddSExt(MachineBasicBlock &MBB, MachineBasicBlock::iterator I, DebugLoc DL, unsigned Reg, MVT From, MVT To) const
Add appropriate SExt nodes.
 
void setGlobalBaseReg(unsigned Reg)
 
unsigned getGlobalBaseReg() const
 
const M68kInstrInfo * getInstrInfo() const override
 
Describe properties that are true of each instruction in the target description file.
 
LLVM_ABI DebugLoc findDebugLoc(instr_iterator MBBI)
Find the next valid DebugLoc starting at MBBI, skipping any debug instructions.
 
MachineInstrBundleIterator< MachineInstr > iterator
 
The MachineFrameInfo class represents an abstract stack frame until prolog/epilog code is inserted.
 
int64_t getObjectSize(int ObjectIdx) const
Return the size of the specified object.
 
MachineFunctionPass - This class adapts the FunctionPass interface to allow convenient creation of pa...
 
void getAnalysisUsage(AnalysisUsage &AU) const override
getAnalysisUsage - Subclasses that override getAnalysisUsage must call this.
 
const TargetSubtargetInfo & getSubtarget() const
getSubtarget - Return the subtarget for which this machine code is being compiled.
 
MachineRegisterInfo & getRegInfo()
getRegInfo - Return information about the registers currently in use.
 
Ty * getInfo()
getInfo - Keep track of various per-function pieces of information for backends that would like to do...
 
const MachineBasicBlock & front() const
 
const MachineInstrBuilder & addExternalSymbol(const char *FnName, unsigned TargetFlags=0) const
 
const MachineInstrBuilder & addImm(int64_t Val) const
Add a new immediate operand.
 
const MachineInstrBuilder & add(const MachineOperand &MO) const
 
const MachineInstrBuilder & addReg(Register RegNo, unsigned flags=0, unsigned SubReg=0) const
Add a new virtual register operand.
 
const MachineInstrBuilder & addMBB(MachineBasicBlock *MBB, unsigned TargetFlags=0) const
 
const MachineInstrBuilder & copyImplicitOps(const MachineInstr &OtherMI) const
Copy all the implicit operands from OtherMI onto this one.
 
MachineInstr * getInstr() const
If conversion operators fail, use this method to get the MachineInstr explicitly.
 
Representation of each machine instruction.
 
unsigned getOpcode() const
Returns the opcode of this MachineInstr.
 
LLVM_ABI MachineInstr * removeFromParent()
Unlink 'this' from the containing basic block, and return it without deleting it.
 
const MachineBasicBlock * getParent() const
 
LLVM_ABI void setDesc(const MCInstrDesc &TID)
Replace the instruction descriptor (thus opcode) of the current instruction with a new one.
 
const DebugLoc & getDebugLoc() const
Returns the debug location id of this MachineInstr.
 
LLVM_ABI void eraseFromParent()
Unlink 'this' from the containing basic block and delete it.
 
const MachineOperand & getOperand(unsigned i) const
 
MachineOperand class - Representation of each machine instruction operand.
 
LLVM_ABI unsigned getOperandNo() const
Returns the index of this operand in the instruction that it belongs to.
 
bool isReg() const
isReg - Tests if this is a MO_Register operand.
 
LLVM_ABI void setReg(Register Reg)
Change the register this operand corresponds to.
 
MachineInstr * getParent()
getParent - Return the instruction that this operand belongs to.
 
static MachineOperand CreateImm(int64_t Val)
 
Register getReg() const
getReg - Returns the register number.
 
MachineRegisterInfo - Keep track of information for virtual and physical registers,...
 
LLVM_ABI bool match(StringRef String, SmallVectorImpl< StringRef > *Matches=nullptr, std::string *Error=nullptr) const
matches - Match the regex against a given String.
 
Wrapper class representing virtual and physical registers.
 
This class consists of common code factored out of the SmallVector class to reduce code duplication b...
 
StringRef - Represent a constant reference to a string, i.e.
 
TargetRegisterInfo base class - We assume that the target defines a static array of TargetRegisterDes...
 
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
 
unsigned ID
LLVM IR allows to use arbitrary numbers as calling convention identifiers.
 
This namespace holds all of the target specific flags that instruction info tracks.
 
@ MO_GOTPCREL
On a symbol operand this indicates that the immediate is offset to the GOT entry for the symbol name ...
 
Define some predicates that are used for node matching.
 
static const MachineInstrBuilder & addFrameReference(const MachineInstrBuilder &MIB, int FI, int Offset=0)
addFrameReference - This function is used to add a reference to the base of an abstract object on the...
 
static M68k::CondCode GetCondFromBranchOpc(unsigned Opcode)
 
@ Implicit
Not emitted register (e.g. carry, or temporary result).
 
@ Undef
Value of the register doesn't matter.
 
This is an optimization pass for GlobalISel generic memory operations.
 
MachineInstrBuilder BuildMI(MachineFunction &MF, const MIMetadata &MIMD, const MCInstrDesc &MCID)
Builder interface. Specify how to create the initial instruction itself.
 
detail::scope_exit< std::decay_t< Callable > > make_scope_exit(Callable &&F)
 
FunctionPass * createM68kGlobalBaseRegPass()
This pass initializes a global base register for PIC on M68k.
 
MachineInstr * getImm(const MachineOperand &MO, const MachineRegisterInfo *MRI)
 
decltype(auto) get(const PointerIntPair< PointerTy, IntBits, IntType, PtrTraits, Info > &Pair)
 
LLVM_ABI raw_ostream & dbgs()
dbgs() - This returns a reference to a raw_ostream for debugging messages.
 
FunctionAddr VTableAddr Count
 
constexpr bool isUInt(uint64_t x)
Checks if an unsigned integer fits into the given bit width.
 
@ Ref
The access may reference the value stored in memory.
 
unsigned getKillRegState(bool B)
 
ArrayRef(const T &OneElt) -> ArrayRef< T >