1d6c98ae63824854ea2175b362a10985cac7cfb32Jyotsna Verma//===- HexagonMCInst.cpp - Hexagon sub-class of MCInst --------------------===// 2d6c98ae63824854ea2175b362a10985cac7cfb32Jyotsna Verma// 3d6c98ae63824854ea2175b362a10985cac7cfb32Jyotsna Verma// The LLVM Compiler Infrastructure 4d6c98ae63824854ea2175b362a10985cac7cfb32Jyotsna Verma// 5d6c98ae63824854ea2175b362a10985cac7cfb32Jyotsna Verma// This file is distributed under the University of Illinois Open Source 6d6c98ae63824854ea2175b362a10985cac7cfb32Jyotsna Verma// License. See LICENSE.TXT for details. 7d6c98ae63824854ea2175b362a10985cac7cfb32Jyotsna Verma// 8d6c98ae63824854ea2175b362a10985cac7cfb32Jyotsna Verma//===----------------------------------------------------------------------===// 9d6c98ae63824854ea2175b362a10985cac7cfb32Jyotsna Verma// 10d6c98ae63824854ea2175b362a10985cac7cfb32Jyotsna Verma// This class extends MCInst to allow some Hexagon VLIW annotations. 11d6c98ae63824854ea2175b362a10985cac7cfb32Jyotsna Verma// 12d6c98ae63824854ea2175b362a10985cac7cfb32Jyotsna Verma//===----------------------------------------------------------------------===// 13d6c98ae63824854ea2175b362a10985cac7cfb32Jyotsna Verma 14d6c98ae63824854ea2175b362a10985cac7cfb32Jyotsna Verma#include "HexagonInstrInfo.h" 15d6c98ae63824854ea2175b362a10985cac7cfb32Jyotsna Verma#include "MCTargetDesc/HexagonBaseInfo.h" 16d6c98ae63824854ea2175b362a10985cac7cfb32Jyotsna Verma#include "MCTargetDesc/HexagonMCInst.h" 17d6c98ae63824854ea2175b362a10985cac7cfb32Jyotsna Verma#include "MCTargetDesc/HexagonMCTargetDesc.h" 18d6c98ae63824854ea2175b362a10985cac7cfb32Jyotsna Verma 19d6c98ae63824854ea2175b362a10985cac7cfb32Jyotsna Vermausing namespace llvm; 20d6c98ae63824854ea2175b362a10985cac7cfb32Jyotsna Verma 21d6c98ae63824854ea2175b362a10985cac7cfb32Jyotsna Verma// Return the slots used by the insn. 22d6c98ae63824854ea2175b362a10985cac7cfb32Jyotsna Vermaunsigned HexagonMCInst::getUnits(const HexagonTargetMachine* TM) const { 23d6c98ae63824854ea2175b362a10985cac7cfb32Jyotsna Verma const HexagonInstrInfo* QII = TM->getInstrInfo(); 24d6c98ae63824854ea2175b362a10985cac7cfb32Jyotsna Verma const InstrItineraryData* II = TM->getInstrItineraryData(); 25d6c98ae63824854ea2175b362a10985cac7cfb32Jyotsna Verma const InstrStage* 26d6c98ae63824854ea2175b362a10985cac7cfb32Jyotsna Verma IS = II->beginStage(QII->get(this->getOpcode()).getSchedClass()); 27d6c98ae63824854ea2175b362a10985cac7cfb32Jyotsna Verma 28d6c98ae63824854ea2175b362a10985cac7cfb32Jyotsna Verma return (IS->getUnits()); 29d6c98ae63824854ea2175b362a10985cac7cfb32Jyotsna Verma} 30d6c98ae63824854ea2175b362a10985cac7cfb32Jyotsna Verma 31d6c98ae63824854ea2175b362a10985cac7cfb32Jyotsna Verma// Return the Hexagon ISA class for the insn. 32d6c98ae63824854ea2175b362a10985cac7cfb32Jyotsna Vermaunsigned HexagonMCInst::getType() const { 33d6c98ae63824854ea2175b362a10985cac7cfb32Jyotsna Verma const uint64_t F = MCID->TSFlags; 34d6c98ae63824854ea2175b362a10985cac7cfb32Jyotsna Verma 35d6c98ae63824854ea2175b362a10985cac7cfb32Jyotsna Verma return ((F >> HexagonII::TypePos) & HexagonII::TypeMask); 36d6c98ae63824854ea2175b362a10985cac7cfb32Jyotsna Verma} 37d6c98ae63824854ea2175b362a10985cac7cfb32Jyotsna Verma 38d6c98ae63824854ea2175b362a10985cac7cfb32Jyotsna Verma// Return whether the insn is an actual insn. 39d6c98ae63824854ea2175b362a10985cac7cfb32Jyotsna Vermabool HexagonMCInst::isCanon() const { 40d6c98ae63824854ea2175b362a10985cac7cfb32Jyotsna Verma return (!MCID->isPseudo() && 41d6c98ae63824854ea2175b362a10985cac7cfb32Jyotsna Verma !isPrefix() && 42d6c98ae63824854ea2175b362a10985cac7cfb32Jyotsna Verma getType() != HexagonII::TypeENDLOOP); 43d6c98ae63824854ea2175b362a10985cac7cfb32Jyotsna Verma} 44d6c98ae63824854ea2175b362a10985cac7cfb32Jyotsna Verma 45d6c98ae63824854ea2175b362a10985cac7cfb32Jyotsna Verma// Return whether the insn is a prefix. 46d6c98ae63824854ea2175b362a10985cac7cfb32Jyotsna Vermabool HexagonMCInst::isPrefix() const { 47d6c98ae63824854ea2175b362a10985cac7cfb32Jyotsna Verma return (getType() == HexagonII::TypePREFIX); 48d6c98ae63824854ea2175b362a10985cac7cfb32Jyotsna Verma} 49d6c98ae63824854ea2175b362a10985cac7cfb32Jyotsna Verma 50d6c98ae63824854ea2175b362a10985cac7cfb32Jyotsna Verma// Return whether the insn is solo, i.e., cannot be in a packet. 51d6c98ae63824854ea2175b362a10985cac7cfb32Jyotsna Vermabool HexagonMCInst::isSolo() const { 52d6c98ae63824854ea2175b362a10985cac7cfb32Jyotsna Verma const uint64_t F = MCID->TSFlags; 53d6c98ae63824854ea2175b362a10985cac7cfb32Jyotsna Verma return ((F >> HexagonII::SoloPos) & HexagonII::SoloMask); 54d6c98ae63824854ea2175b362a10985cac7cfb32Jyotsna Verma} 55d6c98ae63824854ea2175b362a10985cac7cfb32Jyotsna Verma 56d6c98ae63824854ea2175b362a10985cac7cfb32Jyotsna Verma// Return whether the insn is a new-value consumer. 57d6c98ae63824854ea2175b362a10985cac7cfb32Jyotsna Vermabool HexagonMCInst::isNewValue() const { 58d6c98ae63824854ea2175b362a10985cac7cfb32Jyotsna Verma const uint64_t F = MCID->TSFlags; 59d6c98ae63824854ea2175b362a10985cac7cfb32Jyotsna Verma return ((F >> HexagonII::NewValuePos) & HexagonII::NewValueMask); 60d6c98ae63824854ea2175b362a10985cac7cfb32Jyotsna Verma} 61d6c98ae63824854ea2175b362a10985cac7cfb32Jyotsna Verma 62d6c98ae63824854ea2175b362a10985cac7cfb32Jyotsna Verma// Return whether the instruction is a legal new-value producer. 63d6c98ae63824854ea2175b362a10985cac7cfb32Jyotsna Vermabool HexagonMCInst::hasNewValue() const { 64d6c98ae63824854ea2175b362a10985cac7cfb32Jyotsna Verma const uint64_t F = MCID->TSFlags; 65d6c98ae63824854ea2175b362a10985cac7cfb32Jyotsna Verma return ((F >> HexagonII::hasNewValuePos) & HexagonII::hasNewValueMask); 66d6c98ae63824854ea2175b362a10985cac7cfb32Jyotsna Verma} 67d6c98ae63824854ea2175b362a10985cac7cfb32Jyotsna Verma 68d6c98ae63824854ea2175b362a10985cac7cfb32Jyotsna Verma// Return the operand that consumes or produces a new value. 69d6c98ae63824854ea2175b362a10985cac7cfb32Jyotsna Vermaconst MCOperand& HexagonMCInst::getNewValue() const { 70d6c98ae63824854ea2175b362a10985cac7cfb32Jyotsna Verma const uint64_t F = MCID->TSFlags; 71d6c98ae63824854ea2175b362a10985cac7cfb32Jyotsna Verma const unsigned O = (F >> HexagonII::NewValueOpPos) & 72d6c98ae63824854ea2175b362a10985cac7cfb32Jyotsna Verma HexagonII::NewValueOpMask; 73d6c98ae63824854ea2175b362a10985cac7cfb32Jyotsna Verma const MCOperand& MCO = getOperand(O); 74d6c98ae63824854ea2175b362a10985cac7cfb32Jyotsna Verma 75d6c98ae63824854ea2175b362a10985cac7cfb32Jyotsna Verma assert ((isNewValue() || hasNewValue()) && MCO.isReg()); 76d6c98ae63824854ea2175b362a10985cac7cfb32Jyotsna Verma return (MCO); 77d6c98ae63824854ea2175b362a10985cac7cfb32Jyotsna Verma} 78d6c98ae63824854ea2175b362a10985cac7cfb32Jyotsna Verma 79d6c98ae63824854ea2175b362a10985cac7cfb32Jyotsna Verma// Return whether the instruction needs to be constant extended. 80d6c98ae63824854ea2175b362a10985cac7cfb32Jyotsna Verma// 1) Always return true if the instruction has 'isExtended' flag set. 81d6c98ae63824854ea2175b362a10985cac7cfb32Jyotsna Verma// 82d6c98ae63824854ea2175b362a10985cac7cfb32Jyotsna Verma// isExtendable: 83d6c98ae63824854ea2175b362a10985cac7cfb32Jyotsna Verma// 2) For immediate extended operands, return true only if the value is 84d6c98ae63824854ea2175b362a10985cac7cfb32Jyotsna Verma// out-of-range. 85d6c98ae63824854ea2175b362a10985cac7cfb32Jyotsna Verma// 3) For global address, always return true. 86d6c98ae63824854ea2175b362a10985cac7cfb32Jyotsna Verma 87d6c98ae63824854ea2175b362a10985cac7cfb32Jyotsna Vermabool HexagonMCInst::isConstExtended(void) const { 88d6c98ae63824854ea2175b362a10985cac7cfb32Jyotsna Verma if (isExtended()) 89d6c98ae63824854ea2175b362a10985cac7cfb32Jyotsna Verma return true; 90d6c98ae63824854ea2175b362a10985cac7cfb32Jyotsna Verma 91d6c98ae63824854ea2175b362a10985cac7cfb32Jyotsna Verma if (!isExtendable()) 92d6c98ae63824854ea2175b362a10985cac7cfb32Jyotsna Verma return false; 93d6c98ae63824854ea2175b362a10985cac7cfb32Jyotsna Verma 94d6c98ae63824854ea2175b362a10985cac7cfb32Jyotsna Verma short ExtOpNum = getCExtOpNum(); 95d6c98ae63824854ea2175b362a10985cac7cfb32Jyotsna Verma int MinValue = getMinValue(); 96d6c98ae63824854ea2175b362a10985cac7cfb32Jyotsna Verma int MaxValue = getMaxValue(); 97d6c98ae63824854ea2175b362a10985cac7cfb32Jyotsna Verma const MCOperand& MO = getOperand(ExtOpNum); 98d6c98ae63824854ea2175b362a10985cac7cfb32Jyotsna Verma 99d6c98ae63824854ea2175b362a10985cac7cfb32Jyotsna Verma // We could be using an instruction with an extendable immediate and shoehorn 100d6c98ae63824854ea2175b362a10985cac7cfb32Jyotsna Verma // a global address into it. If it is a global address it will be constant 101d6c98ae63824854ea2175b362a10985cac7cfb32Jyotsna Verma // extended. We do this for COMBINE. 102d6c98ae63824854ea2175b362a10985cac7cfb32Jyotsna Verma // We currently only handle isGlobal() because it is the only kind of 103d6c98ae63824854ea2175b362a10985cac7cfb32Jyotsna Verma // object we are going to end up with here for now. 104d6c98ae63824854ea2175b362a10985cac7cfb32Jyotsna Verma // In the future we probably should add isSymbol(), etc. 105d6c98ae63824854ea2175b362a10985cac7cfb32Jyotsna Verma if (MO.isExpr()) 106d6c98ae63824854ea2175b362a10985cac7cfb32Jyotsna Verma return true; 107d6c98ae63824854ea2175b362a10985cac7cfb32Jyotsna Verma 108d6c98ae63824854ea2175b362a10985cac7cfb32Jyotsna Verma // If the extendable operand is not 'Immediate' type, the instruction should 109d6c98ae63824854ea2175b362a10985cac7cfb32Jyotsna Verma // have 'isExtended' flag set. 110d6c98ae63824854ea2175b362a10985cac7cfb32Jyotsna Verma assert(MO.isImm() && "Extendable operand must be Immediate type"); 111d6c98ae63824854ea2175b362a10985cac7cfb32Jyotsna Verma 112d6c98ae63824854ea2175b362a10985cac7cfb32Jyotsna Verma int ImmValue = MO.getImm(); 113d6c98ae63824854ea2175b362a10985cac7cfb32Jyotsna Verma return (ImmValue < MinValue || ImmValue > MaxValue); 114d6c98ae63824854ea2175b362a10985cac7cfb32Jyotsna Verma} 115d6c98ae63824854ea2175b362a10985cac7cfb32Jyotsna Verma 116d6c98ae63824854ea2175b362a10985cac7cfb32Jyotsna Verma// Return whether the instruction must be always extended. 117d6c98ae63824854ea2175b362a10985cac7cfb32Jyotsna Vermabool HexagonMCInst::isExtended(void) const { 118d6c98ae63824854ea2175b362a10985cac7cfb32Jyotsna Verma const uint64_t F = MCID->TSFlags; 119d6c98ae63824854ea2175b362a10985cac7cfb32Jyotsna Verma return (F >> HexagonII::ExtendedPos) & HexagonII::ExtendedMask; 120d6c98ae63824854ea2175b362a10985cac7cfb32Jyotsna Verma} 121d6c98ae63824854ea2175b362a10985cac7cfb32Jyotsna Verma 122d6c98ae63824854ea2175b362a10985cac7cfb32Jyotsna Verma// Return true if the instruction may be extended based on the operand value. 123d6c98ae63824854ea2175b362a10985cac7cfb32Jyotsna Vermabool HexagonMCInst::isExtendable(void) const { 124d6c98ae63824854ea2175b362a10985cac7cfb32Jyotsna Verma const uint64_t F = MCID->TSFlags; 125d6c98ae63824854ea2175b362a10985cac7cfb32Jyotsna Verma return (F >> HexagonII::ExtendablePos) & HexagonII::ExtendableMask; 126d6c98ae63824854ea2175b362a10985cac7cfb32Jyotsna Verma} 127d6c98ae63824854ea2175b362a10985cac7cfb32Jyotsna Verma 128d6c98ae63824854ea2175b362a10985cac7cfb32Jyotsna Verma// Return number of bits in the constant extended operand. 129d6c98ae63824854ea2175b362a10985cac7cfb32Jyotsna Vermaunsigned HexagonMCInst::getBitCount(void) const { 130d6c98ae63824854ea2175b362a10985cac7cfb32Jyotsna Verma const uint64_t F = MCID->TSFlags; 131d6c98ae63824854ea2175b362a10985cac7cfb32Jyotsna Verma return ((F >> HexagonII::ExtentBitsPos) & HexagonII::ExtentBitsMask); 132d6c98ae63824854ea2175b362a10985cac7cfb32Jyotsna Verma} 133d6c98ae63824854ea2175b362a10985cac7cfb32Jyotsna Verma 134d6c98ae63824854ea2175b362a10985cac7cfb32Jyotsna Verma// Return constant extended operand number. 135d6c98ae63824854ea2175b362a10985cac7cfb32Jyotsna Vermaunsigned short HexagonMCInst::getCExtOpNum(void) const { 136d6c98ae63824854ea2175b362a10985cac7cfb32Jyotsna Verma const uint64_t F = MCID->TSFlags; 137d6c98ae63824854ea2175b362a10985cac7cfb32Jyotsna Verma return ((F >> HexagonII::ExtendableOpPos) & HexagonII::ExtendableOpMask); 138d6c98ae63824854ea2175b362a10985cac7cfb32Jyotsna Verma} 139d6c98ae63824854ea2175b362a10985cac7cfb32Jyotsna Verma 140d6c98ae63824854ea2175b362a10985cac7cfb32Jyotsna Verma// Return whether the operand can be constant extended. 141d6c98ae63824854ea2175b362a10985cac7cfb32Jyotsna Vermabool HexagonMCInst::isOperandExtended(const unsigned short OperandNum) const { 142d6c98ae63824854ea2175b362a10985cac7cfb32Jyotsna Verma const uint64_t F = MCID->TSFlags; 143d6c98ae63824854ea2175b362a10985cac7cfb32Jyotsna Verma return ((F >> HexagonII::ExtendableOpPos) & HexagonII::ExtendableOpMask) 144d6c98ae63824854ea2175b362a10985cac7cfb32Jyotsna Verma == OperandNum; 145d6c98ae63824854ea2175b362a10985cac7cfb32Jyotsna Verma} 146d6c98ae63824854ea2175b362a10985cac7cfb32Jyotsna Verma 147d6c98ae63824854ea2175b362a10985cac7cfb32Jyotsna Verma// Return the min value that a constant extendable operand can have 148d6c98ae63824854ea2175b362a10985cac7cfb32Jyotsna Verma// without being extended. 149d6c98ae63824854ea2175b362a10985cac7cfb32Jyotsna Vermaint HexagonMCInst::getMinValue(void) const { 150d6c98ae63824854ea2175b362a10985cac7cfb32Jyotsna Verma const uint64_t F = MCID->TSFlags; 151d6c98ae63824854ea2175b362a10985cac7cfb32Jyotsna Verma unsigned isSigned = (F >> HexagonII::ExtentSignedPos) 152d6c98ae63824854ea2175b362a10985cac7cfb32Jyotsna Verma & HexagonII::ExtentSignedMask; 153d6c98ae63824854ea2175b362a10985cac7cfb32Jyotsna Verma unsigned bits = (F >> HexagonII::ExtentBitsPos) 154d6c98ae63824854ea2175b362a10985cac7cfb32Jyotsna Verma & HexagonII::ExtentBitsMask; 155d6c98ae63824854ea2175b362a10985cac7cfb32Jyotsna Verma 156d6c98ae63824854ea2175b362a10985cac7cfb32Jyotsna Verma if (isSigned) // if value is signed 157d6c98ae63824854ea2175b362a10985cac7cfb32Jyotsna Verma return -1 << (bits - 1); 158d6c98ae63824854ea2175b362a10985cac7cfb32Jyotsna Verma else 159d6c98ae63824854ea2175b362a10985cac7cfb32Jyotsna Verma return 0; 160d6c98ae63824854ea2175b362a10985cac7cfb32Jyotsna Verma} 161d6c98ae63824854ea2175b362a10985cac7cfb32Jyotsna Verma 162d6c98ae63824854ea2175b362a10985cac7cfb32Jyotsna Verma// Return the max value that a constant extendable operand can have 163d6c98ae63824854ea2175b362a10985cac7cfb32Jyotsna Verma// without being extended. 164d6c98ae63824854ea2175b362a10985cac7cfb32Jyotsna Vermaint HexagonMCInst::getMaxValue(void) const { 165d6c98ae63824854ea2175b362a10985cac7cfb32Jyotsna Verma const uint64_t F = MCID->TSFlags; 166d6c98ae63824854ea2175b362a10985cac7cfb32Jyotsna Verma unsigned isSigned = (F >> HexagonII::ExtentSignedPos) 167d6c98ae63824854ea2175b362a10985cac7cfb32Jyotsna Verma & HexagonII::ExtentSignedMask; 168d6c98ae63824854ea2175b362a10985cac7cfb32Jyotsna Verma unsigned bits = (F >> HexagonII::ExtentBitsPos) 169d6c98ae63824854ea2175b362a10985cac7cfb32Jyotsna Verma & HexagonII::ExtentBitsMask; 170d6c98ae63824854ea2175b362a10985cac7cfb32Jyotsna Verma 171d6c98ae63824854ea2175b362a10985cac7cfb32Jyotsna Verma if (isSigned) // if value is signed 172d6c98ae63824854ea2175b362a10985cac7cfb32Jyotsna Verma return ~(-1 << (bits - 1)); 173d6c98ae63824854ea2175b362a10985cac7cfb32Jyotsna Verma else 174d6c98ae63824854ea2175b362a10985cac7cfb32Jyotsna Verma return ~(-1 << bits); 175d6c98ae63824854ea2175b362a10985cac7cfb32Jyotsna Verma} 176