diff options
Diffstat (limited to 'llvm/lib/Target/Hexagon/MCTargetDesc/HexagonMCInstrInfo.h')
-rw-r--r-- | llvm/lib/Target/Hexagon/MCTargetDesc/HexagonMCInstrInfo.h | 43 |
1 files changed, 40 insertions, 3 deletions
diff --git a/llvm/lib/Target/Hexagon/MCTargetDesc/HexagonMCInstrInfo.h b/llvm/lib/Target/Hexagon/MCTargetDesc/HexagonMCInstrInfo.h index 829f872c453e..7b3c079880f8 100644 --- a/llvm/lib/Target/Hexagon/MCTargetDesc/HexagonMCInstrInfo.h +++ b/llvm/lib/Target/Hexagon/MCTargetDesc/HexagonMCInstrInfo.h @@ -28,6 +28,7 @@ class MCContext; class MCExpr; class MCInstrDesc; class MCInstrInfo; +class MCRegisterInfo; class MCSubtargetInfo; class DuplexCandidate { @@ -91,7 +92,8 @@ size_t bundleSize(MCInst const &MCI); // Put the packet in to canonical form, compound, duplex, pad, and shuffle bool canonicalizePacket(MCInstrInfo const &MCII, MCSubtargetInfo const &STI, MCContext &Context, MCInst &MCB, - HexagonMCChecker *Checker); + HexagonMCChecker *Checker, + bool AttemptCompatibility = false); // Create a duplex instruction given the two subinsts MCInst *deriveDuplex(MCContext &Context, unsigned iClass, MCInst const &inst0, @@ -165,6 +167,11 @@ MCOperand const &getNewValueOperand2(MCInstrInfo const &MCII, // Return the Hexagon ISA class for the insn. unsigned getType(MCInstrInfo const &MCII, MCInst const &MCI); +/// Return the resources used by this instruction +unsigned getCVIResources(MCInstrInfo const &MCII, + MCSubtargetInfo const &STI, + MCInst const &MCI); + /// Return the slots used by the insn. unsigned getUnits(MCInstrInfo const &MCII, MCSubtargetInfo const &STI, MCInst const &MCI); @@ -252,6 +259,8 @@ bool isMemReorderDisabled(MCInst const &MCI); // Return whether the insn is a new-value consumer. bool isNewValue(MCInstrInfo const &MCII, MCInst const &MCI); +/// Return true if the operand is a new-value store insn. +bool isNewValueStore(MCInstrInfo const &MCII, MCInst const &MCI); bool isOpExtendable(MCInstrInfo const &MCII, MCInst const &MCI, unsigned short); // Can these two instructions be duplexed @@ -270,8 +279,11 @@ bool isPredicatedNew(MCInstrInfo const &MCII, MCInst const &MCI); // Return whether the predicate sense is true bool isPredicatedTrue(MCInstrInfo const &MCII, MCInst const &MCI); -// Is this a predicate register -bool isPredReg(unsigned Reg); +// Return true if this is a scalar predicate register. +bool isPredReg(MCRegisterInfo const &MRI, unsigned Reg); + +// Returns true if the Ith operand is a predicate register. +bool isPredRegister(MCInstrInfo const &MCII, MCInst const &Inst, unsigned I); // Return whether the insn is a prefix. bool isPrefix(MCInstrInfo const &MCII, MCInst const &MCI); @@ -290,6 +302,21 @@ bool isVector(MCInstrInfo const &MCII, MCInst const &MCI); bool mustExtend(MCExpr const &Expr); bool mustNotExtend(MCExpr const &Expr); +// Returns true if this instruction requires a slot to execute. +bool requiresSlot(MCSubtargetInfo const &STI, MCInst const &MCI); + +unsigned packetSize(StringRef CPU); + +// Returns the maximum number of slots available in the given +// subtarget's packets. +unsigned packetSizeSlots(MCSubtargetInfo const &STI); + +// Returns the number of slots consumed by this packet, considering duplexed +// and compound instructions. +unsigned slotsConsumed(MCInstrInfo const &MCII, MCSubtargetInfo const &STI, + MCInst const &MCI); + + // Pad the bundle with nops to satisfy endloop requirements void padEndloop(MCInst &MCI, MCContext &Context); class PredicateInfo { @@ -324,6 +351,16 @@ bool subInstWouldBeExtended(MCInst const &potentialDuplex); unsigned SubregisterBit(unsigned Consumer, unsigned Producer, unsigned Producer2); +bool IsVecRegSingle(unsigned VecReg); +bool IsVecRegPair(unsigned VecReg); +bool IsReverseVecRegPair(unsigned VecReg); +bool IsSingleConsumerRefPairProducer(unsigned Producer, unsigned Consumer); + +/// Returns an ordered pair of the constituent register ordinals for +/// each of the elements of \a VecRegPair. For example, Hexagon::W0 ("v0:1") +/// returns { 0, 1 } and Hexagon::W1 ("v3:2") returns { 3, 2 }. +std::pair<unsigned, unsigned> GetVecRegPairIndices(unsigned VecRegPair); + // Attempt to find and replace compound pairs void tryCompound(MCInstrInfo const &MCII, MCSubtargetInfo const &STI, MCContext &Context, MCInst &MCI); |