#include "R600InstrInfo.h"
#include "AMDGPU.h"
#include "MCTargetDesc/R600MCTargetDesc.h"
#include "R600.h"
#include "R600Defines.h"
#include "R600Subtarget.h"
#include "llvm/ADT/SmallSet.h"
#include "llvm/CodeGen/MachineFrameInfo.h"
usingnamespacellvm;
#define GET_INSTRINFO_CTOR_DTOR
#include "R600GenDFAPacketizer.inc"
#define GET_INSTRINFO_CTOR_DTOR
#define GET_INSTRMAP_INFO
#define GET_INSTRINFO_NAMED_OPS
#include "R600GenInstrInfo.inc"
R600InstrInfo::R600InstrInfo(const R600Subtarget &ST)
: … { … }
bool R600InstrInfo::isVector(const MachineInstr &MI) const { … }
void R600InstrInfo::copyPhysReg(MachineBasicBlock &MBB,
MachineBasicBlock::iterator MI,
const DebugLoc &DL, MCRegister DestReg,
MCRegister SrcReg, bool KillSrc,
bool RenamableDest, bool RenamableSrc) const { … }
bool R600InstrInfo::isLegalToSplitMBBAt(MachineBasicBlock &MBB,
MachineBasicBlock::iterator MBBI) const { … }
bool R600InstrInfo::isMov(unsigned Opcode) const { … }
bool R600InstrInfo::isReductionOp(unsigned Opcode) const { … }
bool R600InstrInfo::isCubeOp(unsigned Opcode) const { … }
bool R600InstrInfo::isALUInstr(unsigned Opcode) const { … }
bool R600InstrInfo::hasInstrModifiers(unsigned Opcode) const { … }
bool R600InstrInfo::isLDSInstr(unsigned Opcode) const { … }
bool R600InstrInfo::isLDSRetInstr(unsigned Opcode) const { … }
bool R600InstrInfo::canBeConsideredALU(const MachineInstr &MI) const { … }
bool R600InstrInfo::isTransOnly(unsigned Opcode) const { … }
bool R600InstrInfo::isTransOnly(const MachineInstr &MI) const { … }
bool R600InstrInfo::isVectorOnly(unsigned Opcode) const { … }
bool R600InstrInfo::isVectorOnly(const MachineInstr &MI) const { … }
bool R600InstrInfo::isExport(unsigned Opcode) const { … }
bool R600InstrInfo::usesVertexCache(unsigned Opcode) const { … }
bool R600InstrInfo::usesVertexCache(const MachineInstr &MI) const { … }
bool R600InstrInfo::usesTextureCache(unsigned Opcode) const { … }
bool R600InstrInfo::usesTextureCache(const MachineInstr &MI) const { … }
bool R600InstrInfo::mustBeLastInClause(unsigned Opcode) const { … }
bool R600InstrInfo::usesAddressRegister(MachineInstr &MI) const { … }
bool R600InstrInfo::definesAddressRegister(MachineInstr &MI) const { … }
bool R600InstrInfo::readsLDSSrcReg(const MachineInstr &MI) const { … }
int R600InstrInfo::getSelIdx(unsigned Opcode, unsigned SrcIdx) const { … }
SmallVector<std::pair<MachineOperand *, int64_t>, 3>
R600InstrInfo::getSrcs(MachineInstr &MI) const { … }
std::vector<std::pair<int, unsigned>>
R600InstrInfo::ExtractSrcs(MachineInstr &MI,
const DenseMap<unsigned, unsigned> &PV,
unsigned &ConstCount) const { … }
static std::vector<std::pair<int, unsigned>>
Swizzle(std::vector<std::pair<int, unsigned>> Src,
R600InstrInfo::BankSwizzle Swz) { … }
static unsigned getTransSwizzle(R600InstrInfo::BankSwizzle Swz, unsigned Op) { … }
unsigned R600InstrInfo::isLegalUpTo(
const std::vector<std::vector<std::pair<int, unsigned>>> &IGSrcs,
const std::vector<R600InstrInfo::BankSwizzle> &Swz,
const std::vector<std::pair<int, unsigned>> &TransSrcs,
R600InstrInfo::BankSwizzle TransSwz) const { … }
static bool
NextPossibleSolution(
std::vector<R600InstrInfo::BankSwizzle> &SwzCandidate,
unsigned Idx) { … }
bool R600InstrInfo::FindSwizzleForVectorSlot(
const std::vector<std::vector<std::pair<int, unsigned>>> &IGSrcs,
std::vector<R600InstrInfo::BankSwizzle> &SwzCandidate,
const std::vector<std::pair<int, unsigned>> &TransSrcs,
R600InstrInfo::BankSwizzle TransSwz) const { … }
static bool
isConstCompatible(R600InstrInfo::BankSwizzle TransSwz,
const std::vector<std::pair<int, unsigned>> &TransOps,
unsigned ConstCount) { … }
bool
R600InstrInfo::fitsReadPortLimitations(const std::vector<MachineInstr *> &IG,
const DenseMap<unsigned, unsigned> &PV,
std::vector<BankSwizzle> &ValidSwizzle,
bool isLastAluTrans)
const { … }
bool
R600InstrInfo::fitsConstReadLimitations(const std::vector<unsigned> &Consts)
const { … }
bool
R600InstrInfo::fitsConstReadLimitations(const std::vector<MachineInstr *> &MIs)
const { … }
DFAPacketizer *
R600InstrInfo::CreateTargetScheduleState(const TargetSubtargetInfo &STI) const { … }
static bool
isPredicateSetter(unsigned Opcode) { … }
static MachineInstr *
findFirstPredicateSetterFrom(MachineBasicBlock &MBB,
MachineBasicBlock::iterator I) { … }
static
bool isJump(unsigned Opcode) { … }
static bool isBranch(unsigned Opcode) { … }
bool R600InstrInfo::analyzeBranch(MachineBasicBlock &MBB,
MachineBasicBlock *&TBB,
MachineBasicBlock *&FBB,
SmallVectorImpl<MachineOperand> &Cond,
bool AllowModify) const { … }
static
MachineBasicBlock::iterator FindLastAluClause(MachineBasicBlock &MBB) { … }
unsigned R600InstrInfo::insertBranch(MachineBasicBlock &MBB,
MachineBasicBlock *TBB,
MachineBasicBlock *FBB,
ArrayRef<MachineOperand> Cond,
const DebugLoc &DL,
int *BytesAdded) const { … }
unsigned R600InstrInfo::removeBranch(MachineBasicBlock &MBB,
int *BytesRemoved) const { … }
bool R600InstrInfo::isPredicated(const MachineInstr &MI) const { … }
bool R600InstrInfo::isPredicable(const MachineInstr &MI) const { … }
bool
R600InstrInfo::isProfitableToIfCvt(MachineBasicBlock &MBB,
unsigned NumCycles,
unsigned ExtraPredCycles,
BranchProbability Probability) const{ … }
bool
R600InstrInfo::isProfitableToIfCvt(MachineBasicBlock &TMBB,
unsigned NumTCycles,
unsigned ExtraTCycles,
MachineBasicBlock &FMBB,
unsigned NumFCycles,
unsigned ExtraFCycles,
BranchProbability Probability) const { … }
bool
R600InstrInfo::isProfitableToDupForIfCvt(MachineBasicBlock &MBB,
unsigned NumCycles,
BranchProbability Probability)
const { … }
bool
R600InstrInfo::isProfitableToUnpredicate(MachineBasicBlock &TMBB,
MachineBasicBlock &FMBB) const { … }
bool
R600InstrInfo::reverseBranchCondition(SmallVectorImpl<MachineOperand> &Cond) const { … }
bool R600InstrInfo::ClobbersPredicate(MachineInstr &MI,
std::vector<MachineOperand> &Pred,
bool SkipDead) const { … }
bool R600InstrInfo::PredicateInstruction(MachineInstr &MI,
ArrayRef<MachineOperand> Pred) const { … }
unsigned int R600InstrInfo::getPredicationCost(const MachineInstr &) const { … }
unsigned int R600InstrInfo::getInstrLatency(const InstrItineraryData *ItinData,
const MachineInstr &,
unsigned *PredCost) const { … }
unsigned R600InstrInfo::calculateIndirectAddress(unsigned RegIndex,
unsigned Channel) const { … }
bool R600InstrInfo::expandPostRAPseudo(MachineInstr &MI) const { … }
void R600InstrInfo::reserveIndirectRegisters(BitVector &Reserved,
const MachineFunction &MF,
const R600RegisterInfo &TRI) const { … }
const TargetRegisterClass *R600InstrInfo::getIndirectAddrRegClass() const { … }
MachineInstrBuilder R600InstrInfo::buildIndirectWrite(MachineBasicBlock *MBB,
MachineBasicBlock::iterator I,
unsigned ValueReg, unsigned Address,
unsigned OffsetReg) const { … }
MachineInstrBuilder R600InstrInfo::buildIndirectWrite(MachineBasicBlock *MBB,
MachineBasicBlock::iterator I,
unsigned ValueReg, unsigned Address,
unsigned OffsetReg,
unsigned AddrChan) const { … }
MachineInstrBuilder R600InstrInfo::buildIndirectRead(MachineBasicBlock *MBB,
MachineBasicBlock::iterator I,
unsigned ValueReg, unsigned Address,
unsigned OffsetReg) const { … }
MachineInstrBuilder R600InstrInfo::buildIndirectRead(MachineBasicBlock *MBB,
MachineBasicBlock::iterator I,
unsigned ValueReg, unsigned Address,
unsigned OffsetReg,
unsigned AddrChan) const { … }
int R600InstrInfo::getIndirectIndexBegin(const MachineFunction &MF) const { … }
int R600InstrInfo::getIndirectIndexEnd(const MachineFunction &MF) const { … }
unsigned R600InstrInfo::getMaxAlusPerClause() const { … }
MachineInstrBuilder R600InstrInfo::buildDefaultInstruction(MachineBasicBlock &MBB,
MachineBasicBlock::iterator I,
unsigned Opcode,
unsigned DstReg,
unsigned Src0Reg,
unsigned Src1Reg) const { … }
#define OPERAND_CASE …
static unsigned getSlotedOps(unsigned Op, unsigned Slot) { … }
#undef OPERAND_CASE
MachineInstr *R600InstrInfo::buildSlotOfVectorInstruction(
MachineBasicBlock &MBB, MachineInstr *MI, unsigned Slot, unsigned DstReg)
const { … }
MachineInstr *R600InstrInfo::buildMovImm(MachineBasicBlock &BB,
MachineBasicBlock::iterator I,
unsigned DstReg,
uint64_t Imm) const { … }
MachineInstr *R600InstrInfo::buildMovInstr(MachineBasicBlock *MBB,
MachineBasicBlock::iterator I,
unsigned DstReg, unsigned SrcReg) const { … }
int R600InstrInfo::getOperandIdx(const MachineInstr &MI, unsigned Op) const { … }
int R600InstrInfo::getOperandIdx(unsigned Opcode, unsigned Op) const { … }
void R600InstrInfo::setImmOperand(MachineInstr &MI, unsigned Op,
int64_t Imm) const { … }
MachineOperand &R600InstrInfo::getFlagOp(MachineInstr &MI, unsigned SrcIdx,
unsigned Flag) const { … }
void R600InstrInfo::addFlag(MachineInstr &MI, unsigned Operand,
unsigned Flag) const { … }
void R600InstrInfo::clearFlag(MachineInstr &MI, unsigned Operand,
unsigned Flag) const { … }