#include "HexagonInstrInfo.h"
#include "Hexagon.h"
#include "HexagonFrameLowering.h"
#include "HexagonHazardRecognizer.h"
#include "HexagonRegisterInfo.h"
#include "HexagonSubtarget.h"
#include "llvm/ADT/ArrayRef.h"
#include "llvm/ADT/SmallPtrSet.h"
#include "llvm/ADT/SmallVector.h"
#include "llvm/ADT/StringExtras.h"
#include "llvm/ADT/StringRef.h"
#include "llvm/CodeGen/DFAPacketizer.h"
#include "llvm/CodeGen/LivePhysRegs.h"
#include "llvm/CodeGen/MachineBasicBlock.h"
#include "llvm/CodeGen/MachineBranchProbabilityInfo.h"
#include "llvm/CodeGen/MachineFrameInfo.h"
#include "llvm/CodeGen/MachineFunction.h"
#include "llvm/CodeGen/MachineInstr.h"
#include "llvm/CodeGen/MachineInstrBuilder.h"
#include "llvm/CodeGen/MachineInstrBundle.h"
#include "llvm/CodeGen/MachineLoopInfo.h"
#include "llvm/CodeGen/MachineMemOperand.h"
#include "llvm/CodeGen/MachineOperand.h"
#include "llvm/CodeGen/MachineRegisterInfo.h"
#include "llvm/CodeGen/ScheduleDAG.h"
#include "llvm/CodeGen/TargetInstrInfo.h"
#include "llvm/CodeGen/TargetOpcodes.h"
#include "llvm/CodeGen/TargetRegisterInfo.h"
#include "llvm/CodeGen/TargetSubtargetInfo.h"
#include "llvm/CodeGenTypes/MachineValueType.h"
#include "llvm/IR/DebugLoc.h"
#include "llvm/IR/GlobalVariable.h"
#include "llvm/MC/MCAsmInfo.h"
#include "llvm/MC/MCInstBuilder.h"
#include "llvm/MC/MCInstrDesc.h"
#include "llvm/MC/MCInstrItineraries.h"
#include "llvm/MC/MCRegisterInfo.h"
#include "llvm/Support/BranchProbability.h"
#include "llvm/Support/CommandLine.h"
#include "llvm/Support/Debug.h"
#include "llvm/Support/ErrorHandling.h"
#include "llvm/Support/MathExtras.h"
#include "llvm/Support/raw_ostream.h"
#include "llvm/Target/TargetMachine.h"
#include <cassert>
#include <cctype>
#include <cstdint>
#include <cstring>
#include <iterator>
#include <optional>
#include <string>
#include <utility>
usingnamespacellvm;
#define DEBUG_TYPE …
#define GET_INSTRINFO_CTOR_DTOR
#define GET_INSTRMAP_INFO
#include "HexagonDepTimingClasses.h"
#include "HexagonGenDFAPacketizer.inc"
#include "HexagonGenInstrInfo.inc"
cl::opt<bool> ScheduleInlineAsm("hexagon-sched-inline-asm", cl::Hidden,
cl::init(false), cl::desc("Do not consider inline-asm a scheduling/"
"packetization boundary."));
static cl::opt<bool> EnableBranchPrediction("hexagon-enable-branch-prediction",
cl::Hidden, cl::init(true), cl::desc("Enable branch prediction"));
static cl::opt<bool> DisableNVSchedule(
"disable-hexagon-nv-schedule", cl::Hidden,
cl::desc("Disable schedule adjustment for new value stores."));
static cl::opt<bool> EnableTimingClassLatency(
"enable-timing-class-latency", cl::Hidden, cl::init(false),
cl::desc("Enable timing class latency"));
static cl::opt<bool> EnableALUForwarding(
"enable-alu-forwarding", cl::Hidden, cl::init(true),
cl::desc("Enable vec alu forwarding"));
static cl::opt<bool> EnableACCForwarding(
"enable-acc-forwarding", cl::Hidden, cl::init(true),
cl::desc("Enable vec acc forwarding"));
static cl::opt<bool> BranchRelaxAsmLarge("branch-relax-asm-large",
cl::init(true), cl::Hidden,
cl::desc("branch relax asm"));
static cl::opt<bool>
UseDFAHazardRec("dfa-hazard-rec", cl::init(true), cl::Hidden,
cl::desc("Use the DFA based hazard recognizer."));
const int Hexagon_MEMW_OFFSET_MAX = …;
const int Hexagon_MEMW_OFFSET_MIN = …;
const int Hexagon_MEMD_OFFSET_MAX = …;
const int Hexagon_MEMD_OFFSET_MIN = …;
const int Hexagon_MEMH_OFFSET_MAX = …;
const int Hexagon_MEMH_OFFSET_MIN = …;
const int Hexagon_MEMB_OFFSET_MAX = …;
const int Hexagon_MEMB_OFFSET_MIN = …;
const int Hexagon_ADDI_OFFSET_MAX = …;
const int Hexagon_ADDI_OFFSET_MIN = …;
void HexagonInstrInfo::anchor() { … }
HexagonInstrInfo::HexagonInstrInfo(HexagonSubtarget &ST)
: … { … }
namespace llvm {
namespace HexagonFUnits {
bool isSlot0Only(unsigned units);
}
}
static bool isIntRegForSubInst(Register Reg) { … }
static bool isDblRegForSubInst(Register Reg, const HexagonRegisterInfo &HRI) { … }
static unsigned nonDbgMICount(MachineBasicBlock::const_instr_iterator MIB,
MachineBasicBlock::const_instr_iterator MIE) { … }
bool HexagonInstrInfo::isAsCheapAsAMove(const MachineInstr &MI) const { … }
bool HexagonInstrInfo::shouldSink(const MachineInstr &MI) const { … }
MachineInstr *HexagonInstrInfo::findLoopInstr(MachineBasicBlock *BB,
unsigned EndLoopOp, MachineBasicBlock *TargetBB,
SmallPtrSet<MachineBasicBlock *, 8> &Visited) const { … }
static inline void parseOperands(const MachineInstr &MI,
SmallVectorImpl<Register> &Defs, SmallVectorImpl<Register> &Uses) { … }
static bool isDuplexPairMatch(unsigned Ga, unsigned Gb) { … }
Register HexagonInstrInfo::isLoadFromStackSlot(const MachineInstr &MI,
int &FrameIndex) const { … }
Register HexagonInstrInfo::isStoreToStackSlot(const MachineInstr &MI,
int &FrameIndex) const { … }
bool HexagonInstrInfo::hasLoadFromStackSlot(
const MachineInstr &MI,
SmallVectorImpl<const MachineMemOperand *> &Accesses) const { … }
bool HexagonInstrInfo::hasStoreToStackSlot(
const MachineInstr &MI,
SmallVectorImpl<const MachineMemOperand *> &Accesses) const { … }
bool HexagonInstrInfo::analyzeBranch(MachineBasicBlock &MBB,
MachineBasicBlock *&TBB,
MachineBasicBlock *&FBB,
SmallVectorImpl<MachineOperand> &Cond,
bool AllowModify) const { … }
unsigned HexagonInstrInfo::removeBranch(MachineBasicBlock &MBB,
int *BytesRemoved) const { … }
unsigned HexagonInstrInfo::insertBranch(MachineBasicBlock &MBB,
MachineBasicBlock *TBB,
MachineBasicBlock *FBB,
ArrayRef<MachineOperand> Cond,
const DebugLoc &DL,
int *BytesAdded) const { … }
namespace {
class HexagonPipelinerLoopInfo : public TargetInstrInfo::PipelinerLoopInfo { … };
}
std::unique_ptr<TargetInstrInfo::PipelinerLoopInfo>
HexagonInstrInfo::analyzeLoopForPipelining(MachineBasicBlock *LoopBB) const { … }
bool HexagonInstrInfo::isProfitableToIfCvt(MachineBasicBlock &MBB,
unsigned NumCycles, unsigned ExtraPredCycles,
BranchProbability Probability) const { … }
bool HexagonInstrInfo::isProfitableToIfCvt(MachineBasicBlock &TMBB,
unsigned NumTCycles, unsigned ExtraTCycles, MachineBasicBlock &FMBB,
unsigned NumFCycles, unsigned ExtraFCycles, BranchProbability Probability)
const { … }
bool HexagonInstrInfo::isProfitableToDupForIfCvt(MachineBasicBlock &MBB,
unsigned NumInstrs, BranchProbability Probability) const { … }
static void getLiveInRegsAt(LivePhysRegs &Regs, const MachineInstr &MI) { … }
static void getLiveOutRegsAt(LivePhysRegs &Regs, const MachineInstr &MI) { … }
void HexagonInstrInfo::copyPhysReg(MachineBasicBlock &MBB,
MachineBasicBlock::iterator I,
const DebugLoc &DL, MCRegister DestReg,
MCRegister SrcReg, bool KillSrc,
bool RenamableDest,
bool RenamableSrc) const { … }
void HexagonInstrInfo::storeRegToStackSlot(MachineBasicBlock &MBB,
MachineBasicBlock::iterator I,
Register SrcReg, bool isKill, int FI,
const TargetRegisterClass *RC,
const TargetRegisterInfo *TRI,
Register VReg) const { … }
void HexagonInstrInfo::loadRegFromStackSlot(MachineBasicBlock &MBB,
MachineBasicBlock::iterator I,
Register DestReg, int FI,
const TargetRegisterClass *RC,
const TargetRegisterInfo *TRI,
Register VReg) const { … }
bool HexagonInstrInfo::expandPostRAPseudo(MachineInstr &MI) const { … }
MachineBasicBlock::instr_iterator
HexagonInstrInfo::expandVGatherPseudo(MachineInstr &MI) const { … }
bool HexagonInstrInfo::reverseBranchCondition(
SmallVectorImpl<MachineOperand> &Cond) const { … }
void HexagonInstrInfo::insertNoop(MachineBasicBlock &MBB,
MachineBasicBlock::iterator MI) const { … }
bool HexagonInstrInfo::isPostIncrement(const MachineInstr &MI) const { … }
bool HexagonInstrInfo::isPredicated(const MachineInstr &MI) const { … }
bool HexagonInstrInfo::PredicateInstruction(
MachineInstr &MI, ArrayRef<MachineOperand> Cond) const { … }
bool HexagonInstrInfo::SubsumesPredicate(ArrayRef<MachineOperand> Pred1,
ArrayRef<MachineOperand> Pred2) const { … }
bool HexagonInstrInfo::ClobbersPredicate(MachineInstr &MI,
std::vector<MachineOperand> &Pred,
bool SkipDead) const { … }
bool HexagonInstrInfo::isPredicable(const MachineInstr &MI) const { … }
bool HexagonInstrInfo::isSchedulingBoundary(const MachineInstr &MI,
const MachineBasicBlock *MBB,
const MachineFunction &MF) const { … }
unsigned HexagonInstrInfo::getInlineAsmLength(const char *Str,
const MCAsmInfo &MAI,
const TargetSubtargetInfo *STI) const { … }
ScheduleHazardRecognizer*
HexagonInstrInfo::CreateTargetPostRAHazardRecognizer(
const InstrItineraryData *II, const ScheduleDAG *DAG) const { … }
bool HexagonInstrInfo::analyzeCompare(const MachineInstr &MI, Register &SrcReg,
Register &SrcReg2, int64_t &Mask,
int64_t &Value) const { … }
unsigned HexagonInstrInfo::getInstrLatency(const InstrItineraryData *ItinData,
const MachineInstr &MI,
unsigned *PredCost) const { … }
DFAPacketizer *HexagonInstrInfo::CreateTargetScheduleState(
const TargetSubtargetInfo &STI) const { … }
bool HexagonInstrInfo::areMemAccessesTriviallyDisjoint(
const MachineInstr &MIa, const MachineInstr &MIb) const { … }
bool HexagonInstrInfo::getIncrementValue(const MachineInstr &MI,
int &Value) const { … }
std::pair<unsigned, unsigned>
HexagonInstrInfo::decomposeMachineOperandsTargetFlags(unsigned TF) const { … }
ArrayRef<std::pair<unsigned, const char*>>
HexagonInstrInfo::getSerializableDirectMachineOperandTargetFlags() const { … }
ArrayRef<std::pair<unsigned, const char*>>
HexagonInstrInfo::getSerializableBitmaskMachineOperandTargetFlags() const { … }
Register HexagonInstrInfo::createVR(MachineFunction *MF, MVT VT) const { … }
bool HexagonInstrInfo::isAbsoluteSet(const MachineInstr &MI) const { … }
bool HexagonInstrInfo::isAccumulator(const MachineInstr &MI) const { … }
bool HexagonInstrInfo::isBaseImmOffset(const MachineInstr &MI) const { … }
bool HexagonInstrInfo::isComplex(const MachineInstr &MI) const { … }
bool HexagonInstrInfo::isCompoundBranchInstr(const MachineInstr &MI) const { … }
bool HexagonInstrInfo::isConstExtended(const MachineInstr &MI) const { … }
bool HexagonInstrInfo::isDeallocRet(const MachineInstr &MI) const { … }
bool HexagonInstrInfo::isDependent(const MachineInstr &ProdMI,
const MachineInstr &ConsMI) const { … }
bool HexagonInstrInfo::isDotCurInst(const MachineInstr &MI) const { … }
bool HexagonInstrInfo::isDotNewInst(const MachineInstr &MI) const { … }
bool HexagonInstrInfo::isDuplexPair(const MachineInstr &MIa,
const MachineInstr &MIb) const { … }
bool HexagonInstrInfo::isEndLoopN(unsigned Opcode) const { … }
bool HexagonInstrInfo::isExpr(unsigned OpType) const { … }
bool HexagonInstrInfo::isExtendable(const MachineInstr &MI) const { … }
bool HexagonInstrInfo::isExtended(const MachineInstr &MI) const { … }
bool HexagonInstrInfo::isFloat(const MachineInstr &MI) const { … }
bool HexagonInstrInfo::isHVXMemWithAIndirect(const MachineInstr &I,
const MachineInstr &J) const { … }
bool HexagonInstrInfo::isIndirectCall(const MachineInstr &MI) const { … }
bool HexagonInstrInfo::isIndirectL4Return(const MachineInstr &MI) const { … }
bool HexagonInstrInfo::isJumpR(const MachineInstr &MI) const { … }
bool HexagonInstrInfo::isJumpWithinBranchRange(const MachineInstr &MI,
unsigned offset) const { … }
bool HexagonInstrInfo::isLateSourceInstr(const MachineInstr &MI) const { … }
bool HexagonInstrInfo::isLoopN(const MachineInstr &MI) const { … }
bool HexagonInstrInfo::isMemOp(const MachineInstr &MI) const { … }
bool HexagonInstrInfo::isNewValue(const MachineInstr &MI) const { … }
bool HexagonInstrInfo::isNewValue(unsigned Opcode) const { … }
bool HexagonInstrInfo::isNewValueInst(const MachineInstr &MI) const { … }
bool HexagonInstrInfo::isNewValueJump(const MachineInstr &MI) const { … }
bool HexagonInstrInfo::isNewValueJump(unsigned Opcode) const { … }
bool HexagonInstrInfo::isNewValueStore(const MachineInstr &MI) const { … }
bool HexagonInstrInfo::isNewValueStore(unsigned Opcode) const { … }
bool HexagonInstrInfo::isOperandExtended(const MachineInstr &MI,
unsigned OperandNum) const { … }
bool HexagonInstrInfo::isPredicatedNew(const MachineInstr &MI) const { … }
bool HexagonInstrInfo::isPredicatedNew(unsigned Opcode) const { … }
bool HexagonInstrInfo::isPredicatedTrue(const MachineInstr &MI) const { … }
bool HexagonInstrInfo::isPredicatedTrue(unsigned Opcode) const { … }
bool HexagonInstrInfo::isPredicated(unsigned Opcode) const { … }
bool HexagonInstrInfo::isPredicateLate(unsigned Opcode) const { … }
bool HexagonInstrInfo::isPredictedTaken(unsigned Opcode) const { … }
bool HexagonInstrInfo::isSaveCalleeSavedRegsCall(const MachineInstr &MI) const { … }
bool HexagonInstrInfo::isSignExtendingLoad(const MachineInstr &MI) const { … }
bool HexagonInstrInfo::isSolo(const MachineInstr &MI) const { … }
bool HexagonInstrInfo::isSpillPredRegOp(const MachineInstr &MI) const { … }
bool HexagonInstrInfo::isTailCall(const MachineInstr &MI) const { … }
bool HexagonInstrInfo::isTC1(const MachineInstr &MI) const { … }
bool HexagonInstrInfo::isTC2(const MachineInstr &MI) const { … }
bool HexagonInstrInfo::isTC2Early(const MachineInstr &MI) const { … }
bool HexagonInstrInfo::isTC4x(const MachineInstr &MI) const { … }
bool HexagonInstrInfo::isToBeScheduledASAP(const MachineInstr &MI1,
const MachineInstr &MI2) const { … }
bool HexagonInstrInfo::isHVXVec(const MachineInstr &MI) const { … }
bool HexagonInstrInfo::isValidAutoIncImm(const EVT VT, int Offset) const { … }
bool HexagonInstrInfo::isValidOffset(unsigned Opcode, int Offset,
const TargetRegisterInfo *TRI, bool Extend) const { … }
bool HexagonInstrInfo::isVecAcc(const MachineInstr &MI) const { … }
bool HexagonInstrInfo::isVecALU(const MachineInstr &MI) const { … }
bool HexagonInstrInfo::isVecUsableNextPacket(const MachineInstr &ProdMI,
const MachineInstr &ConsMI) const { … }
bool HexagonInstrInfo::isZeroExtendingLoad(const MachineInstr &MI) const { … }
bool HexagonInstrInfo::addLatencyToSchedule(const MachineInstr &MI1,
const MachineInstr &MI2) const { … }
bool HexagonInstrInfo::getMemOperandsWithOffsetWidth(
const MachineInstr &LdSt, SmallVectorImpl<const MachineOperand *> &BaseOps,
int64_t &Offset, bool &OffsetIsScalable, LocationSize &Width,
const TargetRegisterInfo *TRI) const { … }
bool HexagonInstrInfo::canExecuteInBundle(const MachineInstr &First,
const MachineInstr &Second) const { … }
bool HexagonInstrInfo::doesNotReturn(const MachineInstr &CallMI) const { … }
bool HexagonInstrInfo::hasEHLabel(const MachineBasicBlock *B) const { … }
bool HexagonInstrInfo::hasNonExtEquivalent(const MachineInstr &MI) const { … }
bool HexagonInstrInfo::hasPseudoInstrPair(const MachineInstr &MI) const { … }
bool HexagonInstrInfo::hasUncondBranch(const MachineBasicBlock *B)
const { … }
bool HexagonInstrInfo::mayBeCurLoad(const MachineInstr &MI) const { … }
bool HexagonInstrInfo::mayBeNewStore(const MachineInstr &MI) const { … }
bool HexagonInstrInfo::producesStall(const MachineInstr &ProdMI,
const MachineInstr &ConsMI) const { … }
bool HexagonInstrInfo::producesStall(const MachineInstr &MI,
MachineBasicBlock::const_instr_iterator BII) const { … }
bool HexagonInstrInfo::predCanBeUsedAsDotNew(const MachineInstr &MI,
Register PredReg) const { … }
bool HexagonInstrInfo::PredOpcodeHasJMP_c(unsigned Opcode) const { … }
bool HexagonInstrInfo::predOpcodeHasNot(ArrayRef<MachineOperand> Cond) const { … }
unsigned HexagonInstrInfo::getAddrMode(const MachineInstr &MI) const { … }
MachineOperand *
HexagonInstrInfo::getBaseAndOffset(const MachineInstr &MI, int64_t &Offset,
LocationSize &AccessSize) const { … }
bool HexagonInstrInfo::getBaseAndOffsetPosition(const MachineInstr &MI,
unsigned &BasePos, unsigned &OffsetPos) const { … }
SmallVector<MachineInstr*, 2> HexagonInstrInfo::getBranchingInstrs(
MachineBasicBlock& MBB) const { … }
unsigned HexagonInstrInfo::getCExtOpNum(const MachineInstr &MI) const { … }
HexagonII::CompoundGroup HexagonInstrInfo::getCompoundCandidateGroup(
const MachineInstr &MI) const { … }
unsigned HexagonInstrInfo::getCompoundOpcode(const MachineInstr &GA,
const MachineInstr &GB) const { … }
int HexagonInstrInfo::getDuplexOpcode(const MachineInstr &MI,
bool ForBigCore) const { … }
int HexagonInstrInfo::getCondOpcode(int Opc, bool invertPredicate) const { … }
int HexagonInstrInfo::getDotCurOp(const MachineInstr &MI) const { … }
int HexagonInstrInfo::getNonDotCurOp(const MachineInstr &MI) const { … }
int HexagonInstrInfo::getDotNewOp(const MachineInstr &MI) const { … }
int HexagonInstrInfo::getDotNewPredJumpOp(const MachineInstr &MI,
const MachineBranchProbabilityInfo *MBPI) const { … }
int HexagonInstrInfo::getDotNewPredOp(const MachineInstr &MI,
const MachineBranchProbabilityInfo *MBPI) const { … }
int HexagonInstrInfo::getDotOldOp(const MachineInstr &MI) const { … }
HexagonII::SubInstructionGroup HexagonInstrInfo::getDuplexCandidateGroup(
const MachineInstr &MI) const { … }
short HexagonInstrInfo::getEquivalentHWInstr(const MachineInstr &MI) const { … }
unsigned HexagonInstrInfo::getInstrTimingClassLatency(
const InstrItineraryData *ItinData, const MachineInstr &MI) const { … }
std::optional<unsigned> HexagonInstrInfo::getOperandLatency(
const InstrItineraryData *ItinData, const MachineInstr &DefMI,
unsigned DefIdx, const MachineInstr &UseMI, unsigned UseIdx) const { … }
bool HexagonInstrInfo::getInvertedPredSense(
SmallVectorImpl<MachineOperand> &Cond) const { … }
unsigned HexagonInstrInfo::getInvertedPredicatedOpcode(const int Opc) const { … }
int HexagonInstrInfo::getMaxValue(const MachineInstr &MI) const { … }
bool HexagonInstrInfo::isAddrModeWithOffset(const MachineInstr &MI) const { … }
bool HexagonInstrInfo::isPureSlot0(const MachineInstr &MI) const { … }
bool HexagonInstrInfo::isRestrictNoSlot1Store(const MachineInstr &MI) const { … }
void HexagonInstrInfo::changeDuplexOpcode(MachineBasicBlock::instr_iterator MII,
bool ToBigInstrs) const { … }
void HexagonInstrInfo::translateInstrsForDup(MachineFunction &MF,
bool ToBigInstrs) const { … }
void HexagonInstrInfo::translateInstrsForDup(
MachineBasicBlock::instr_iterator MII, bool ToBigInstrs) const { … }
unsigned HexagonInstrInfo::getMemAccessSize(const MachineInstr &MI) const { … }
int HexagonInstrInfo::getMinValue(const MachineInstr &MI) const { … }
short HexagonInstrInfo::getNonExtOpcode(const MachineInstr &MI) const { … }
bool HexagonInstrInfo::getPredReg(ArrayRef<MachineOperand> Cond,
Register &PredReg, unsigned &PredRegPos, unsigned &PredRegFlags) const { … }
short HexagonInstrInfo::getPseudoInstrPair(const MachineInstr &MI) const { … }
short HexagonInstrInfo::getRegForm(const MachineInstr &MI) const { … }
unsigned HexagonInstrInfo::getSize(const MachineInstr &MI) const { … }
uint64_t HexagonInstrInfo::getType(const MachineInstr &MI) const { … }
InstrStage::FuncUnits HexagonInstrInfo::getUnits(const MachineInstr &MI) const { … }
unsigned HexagonInstrInfo::nonDbgBBSize(const MachineBasicBlock *BB) const { … }
unsigned HexagonInstrInfo::nonDbgBundleSize(
MachineBasicBlock::const_iterator BundleHead) const { … }
void HexagonInstrInfo::immediateExtend(MachineInstr &MI) const { … }
bool HexagonInstrInfo::invertAndChangeJumpTarget(
MachineInstr &MI, MachineBasicBlock *NewTarget) const { … }
void HexagonInstrInfo::genAllInsnTimingClasses(MachineFunction &MF) const { … }
bool HexagonInstrInfo::reversePredSense(MachineInstr &MI) const { … }
unsigned HexagonInstrInfo::reversePrediction(unsigned Opcode) const { … }
bool HexagonInstrInfo::validateBranchCond(const ArrayRef<MachineOperand> &Cond)
const { … }
void HexagonInstrInfo::
setBundleNoShuf(MachineBasicBlock::instr_iterator MIB) const { … }
bool HexagonInstrInfo::getBundleNoShuf(const MachineInstr &MIB) const { … }
short HexagonInstrInfo::changeAddrMode_abs_io(short Opc) const { … }
short HexagonInstrInfo::changeAddrMode_io_abs(short Opc) const { … }
short HexagonInstrInfo::changeAddrMode_io_pi(short Opc) const { … }
short HexagonInstrInfo::changeAddrMode_io_rr(short Opc) const { … }
short HexagonInstrInfo::changeAddrMode_pi_io(short Opc) const { … }
short HexagonInstrInfo::changeAddrMode_rr_io(short Opc) const { … }
short HexagonInstrInfo::changeAddrMode_rr_ur(short Opc) const { … }
short HexagonInstrInfo::changeAddrMode_ur_rr(short Opc) const { … }
MCInst HexagonInstrInfo::getNop() const { … }