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