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