1f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar//===----- HexagonMCChecker.h - Instruction bundle checking ---------------===//
2f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar//
3f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar//                     The LLVM Compiler Infrastructure
4f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar//
5f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar// This file is distributed under the University of Illinois Open Source
6f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar// License. See LICENSE.TXT for details.
7f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar//
8f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar//===----------------------------------------------------------------------===//
9f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar//
10f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar// This implements the checking of insns inside a bundle according to the
11f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar// packet constraint rules of the Hexagon ISA.
12f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar//
13f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar//===----------------------------------------------------------------------===//
14f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar
15f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar#ifndef HEXAGONMCCHECKER_H
16f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar#define HEXAGONMCCHECKER_H
17f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar
18f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar#include "MCTargetDesc/HexagonMCShuffler.h"
19de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar#include <queue>
20de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar#include <set>
21f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar
22f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainarusing namespace llvm;
23f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar
24f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainarnamespace llvm {
25f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainarclass MCOperandInfo;
26f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar
27f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainartypedef struct {
28f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  unsigned Error, Warning, ShuffleError;
29f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  unsigned Register;
30f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar} ErrInfo_T;
31f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar
32f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainarclass HexagonMCErrInfo {
33f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainarpublic:
34f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  enum {
35f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    CHECK_SUCCESS         = 0,
36f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    // Errors.
37f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    CHECK_ERROR_BRANCHES  = 0x00001,
38f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    CHECK_ERROR_NEWP      = 0x00002,
39f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    CHECK_ERROR_NEWV      = 0x00004,
40f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    CHECK_ERROR_REGISTERS = 0x00008,
41f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    CHECK_ERROR_READONLY  = 0x00010,
42f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    CHECK_ERROR_LOOP      = 0x00020,
43f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    CHECK_ERROR_ENDLOOP   = 0x00040,
44f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    CHECK_ERROR_SOLO      = 0x00080,
45f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    CHECK_ERROR_SHUFFLE   = 0x00100,
46f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    CHECK_ERROR_NOSLOTS   = 0x00200,
47f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    CHECK_ERROR_UNKNOWN   = 0x00400,
48f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    // Warnings.
49f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    CHECK_WARN_CURRENT    = 0x10000,
50f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    CHECK_WARN_TEMPORARY  = 0x20000
51f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  };
52f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  ErrInfo_T s;
53f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar
54f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  void reset() {
55f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    s.Error = CHECK_SUCCESS;
56f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    s.Warning = CHECK_SUCCESS;
57f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    s.ShuffleError = HexagonShuffler::SHUFFLE_SUCCESS;
58f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    s.Register = Hexagon::NoRegister;
59f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  };
60f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  HexagonMCErrInfo() {
61f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    reset();
62f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  };
63f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar
64f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  void setError(unsigned e, unsigned r = Hexagon::NoRegister)
65f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    { s.Error = e; s.Register = r; };
66f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  void setWarning(unsigned w, unsigned r = Hexagon::NoRegister)
67f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    { s.Warning = w; s.Register = r; };
68f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  void setShuffleError(unsigned e) { s.ShuffleError = e; };
69f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar};
70f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar
71f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar/// Check for a valid bundle.
72f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainarclass HexagonMCChecker {
73f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  /// Insn bundle.
74f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  MCInst& MCB;
75f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  MCInst& MCBDX;
76f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  const MCRegisterInfo& RI;
77f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  MCInstrInfo const &MCII;
78f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  MCSubtargetInfo const &STI;
79f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  bool bLoadErrInfo;
80f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar
81f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  /// Set of definitions: register #, if predicated, if predicated true.
82f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  typedef std::pair<unsigned, bool> PredSense;
83f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  static const PredSense Unconditional;
84f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  typedef std::multiset<PredSense> PredSet;
85f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  typedef std::multiset<PredSense>::iterator PredSetIterator;
86f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar
87f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  typedef llvm::DenseMap<unsigned, PredSet>::iterator DefsIterator;
88f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  llvm::DenseMap<unsigned, PredSet> Defs;
89f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar
90f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  /// Information about how a new-value register is defined or used:
91f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  ///   PredReg = predicate register, 0 if use/def not predicated,
92f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  ///   Cond    = true/false for if(PredReg)/if(!PredReg) respectively,
93f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  ///   IsFloat = true if definition produces a floating point value
94f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  ///             (not valid for uses),
95f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  ///   IsNVJ   = true if the use is a new-value branch (not valid for
96f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  ///             definitions).
97f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  struct NewSense {
98f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    unsigned PredReg;
99f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    bool IsFloat, IsNVJ, Cond;
100f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    // The special-case "constructors":
101f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    static NewSense Jmp(bool isNVJ) {
102f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar      NewSense NS = { /*PredReg=*/ 0, /*IsFloat=*/ false, /*IsNVJ=*/ isNVJ,
103f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar                      /*Cond=*/ false };
104f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar      return NS;
105f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    }
106f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    static NewSense Use(unsigned PR, bool True) {
107f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar      NewSense NS = { /*PredReg=*/ PR, /*IsFloat=*/ false, /*IsNVJ=*/ false,
108f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar                      /*Cond=*/ True };
109f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar      return NS;
110f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    }
111f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    static NewSense Def(unsigned PR, bool True, bool Float) {
112f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar      NewSense NS = { /*PredReg=*/ PR, /*IsFloat=*/ Float, /*IsNVJ=*/ false,
113f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar                      /*Cond=*/ True };
114f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar      return NS;
115f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    }
116f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  };
117f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  /// Set of definitions that produce new register:
118f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  typedef llvm::SmallVector<NewSense,2> NewSenseList;
119f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  typedef llvm::DenseMap<unsigned, NewSenseList>::iterator NewDefsIterator;
120f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  llvm::DenseMap<unsigned, NewSenseList> NewDefs;
121f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar
122f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  /// Set of weak definitions whose clashes should be enforced selectively.
123f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  typedef std::set<unsigned>::iterator SoftDefsIterator;
124f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  std::set<unsigned> SoftDefs;
125f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar
126f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  /// Set of current definitions committed to the register file.
127f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  typedef std::set<unsigned>::iterator CurDefsIterator;
128f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  std::set<unsigned> CurDefs;
129f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar
130f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  /// Set of temporary definitions not committed to the register file.
131f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  typedef std::set<unsigned>::iterator TmpDefsIterator;
132f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  std::set<unsigned> TmpDefs;
133f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar
134f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  /// Set of new predicates used.
135f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  typedef std::set<unsigned>::iterator NewPredsIterator;
136f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  std::set<unsigned> NewPreds;
137f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar
138f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  /// Set of predicates defined late.
139f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  typedef std::multiset<unsigned>::iterator LatePredsIterator;
140f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  std::multiset<unsigned> LatePreds;
141f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar
142f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  /// Set of uses.
143f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  typedef std::set<unsigned>::iterator UsesIterator;
144f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  std::set<unsigned> Uses;
145f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar
146f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  /// Set of new values used: new register, if new-value jump.
147f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  typedef llvm::DenseMap<unsigned, NewSense>::iterator NewUsesIterator;
148f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  llvm::DenseMap<unsigned, NewSense> NewUses;
149f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar
150f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  /// Pre-defined set of read-only registers.
151f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  typedef std::set<unsigned>::iterator ReadOnlyIterator;
152f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  std::set<unsigned> ReadOnly;
153f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar
154f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  std::queue<ErrInfo_T> ErrInfoQ;
155f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  HexagonMCErrInfo CrntErrInfo;
156f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar
157f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  void getErrInfo() {
158f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    if (bLoadErrInfo == true) {
159f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar      if (ErrInfoQ.empty()) {
160f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar        CrntErrInfo.reset();
161f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar      } else {
162f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar        CrntErrInfo.s = ErrInfoQ.front();
163f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar        ErrInfoQ.pop();
164f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar      }
165f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    }
166f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    bLoadErrInfo = false;
167f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  }
168f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar
169f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  void init();
170f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  void init(MCInst const&);
171f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar
172f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  // Checks performed.
173f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  bool checkBranches();
174f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  bool checkPredicates();
175f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  bool checkNewValues();
176f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  bool checkRegisters();
177f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  bool checkSolo();
178f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  bool checkShuffle();
179f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  bool checkSlots();
180f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar
181f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  static void compoundRegisterMap(unsigned&);
182f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar
183f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  bool isPredicateRegister(unsigned R) const {
184f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    return (Hexagon::P0 == R || Hexagon::P1 == R ||
185f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar            Hexagon::P2 == R || Hexagon::P3 == R);
186f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  };
187f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  bool isLoopRegister(unsigned R) const {
188f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    return (Hexagon::SA0 == R || Hexagon::LC0 == R ||
189f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar            Hexagon::SA1 == R || Hexagon::LC1 == R);
190f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  };
191f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar
192f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  bool hasValidNewValueDef(const NewSense &Use,
193f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar                           const NewSenseList &Defs) const;
194f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar
195f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  public:
196f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  explicit HexagonMCChecker(MCInstrInfo const &MCII, MCSubtargetInfo const &STI, MCInst& mcb, MCInst &mcbdx,
197f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar                            const MCRegisterInfo& ri);
198f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar
199f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  bool check();
200f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar
201f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  /// add a new error/warning
202f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  void addErrInfo(HexagonMCErrInfo &err) { ErrInfoQ.push(err.s); };
203f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar
204f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  /// Return the error code for the last operation in the insn bundle.
205f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  unsigned getError() { getErrInfo(); return CrntErrInfo.s.Error; };
206f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  unsigned getWarning() { getErrInfo(); return CrntErrInfo.s.Warning; };
207f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  unsigned getShuffleError() { getErrInfo(); return CrntErrInfo.s.ShuffleError; };
208f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  unsigned getErrRegister() { getErrInfo(); return CrntErrInfo.s.Register; };
209f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  bool getNextErrInfo() {
210f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    bLoadErrInfo = true;
211f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    return (ErrInfoQ.empty()) ? false : (getErrInfo(), true);
212f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  }
213f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar};
214f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar
215f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar}
216f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar
217f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar#endif // HEXAGONMCCHECKER_H
218