1*df3765bfSSheng //===---------------- DecoderEmitter.cpp - Decoder Generator --------------===// 2*df3765bfSSheng // 3*df3765bfSSheng // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4*df3765bfSSheng // See https://llvm.org/LICENSE.txt for license information. 5*df3765bfSSheng // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6*df3765bfSSheng // 7*df3765bfSSheng //===----------------------------------------------------------------------===// 8*df3765bfSSheng // 9*df3765bfSSheng // It contains the tablegen backend that emits the decoder functions for 10*df3765bfSSheng // targets with fixed/variable length instruction set. 11*df3765bfSSheng // 12*df3765bfSSheng //===----------------------------------------------------------------------===// 13*df3765bfSSheng 14*df3765bfSSheng #include "CodeGenInstruction.h" 15*df3765bfSSheng #include "CodeGenTarget.h" 16*df3765bfSSheng #include "InfoByHwMode.h" 17*df3765bfSSheng #include "VarLenCodeEmitterGen.h" 18*df3765bfSSheng #include "llvm/ADT/APInt.h" 19*df3765bfSSheng #include "llvm/ADT/ArrayRef.h" 20*df3765bfSSheng #include "llvm/ADT/CachedHashString.h" 21*df3765bfSSheng #include "llvm/ADT/STLExtras.h" 22*df3765bfSSheng #include "llvm/ADT/SetVector.h" 23*df3765bfSSheng #include "llvm/ADT/SmallString.h" 24*df3765bfSSheng #include "llvm/ADT/Statistic.h" 25*df3765bfSSheng #include "llvm/ADT/StringExtras.h" 26*df3765bfSSheng #include "llvm/ADT/StringRef.h" 27*df3765bfSSheng #include "llvm/MC/MCFixedLenDisassembler.h" 28*df3765bfSSheng #include "llvm/Support/Casting.h" 29*df3765bfSSheng #include "llvm/Support/Debug.h" 30*df3765bfSSheng #include "llvm/Support/ErrorHandling.h" 31*df3765bfSSheng #include "llvm/Support/FormattedStream.h" 32*df3765bfSSheng #include "llvm/Support/LEB128.h" 33*df3765bfSSheng #include "llvm/Support/raw_ostream.h" 34*df3765bfSSheng #include "llvm/TableGen/Error.h" 35*df3765bfSSheng #include "llvm/TableGen/Record.h" 36*df3765bfSSheng #include <algorithm> 37*df3765bfSSheng #include <cassert> 38*df3765bfSSheng #include <cstddef> 39*df3765bfSSheng #include <cstdint> 40*df3765bfSSheng #include <map> 41*df3765bfSSheng #include <memory> 42*df3765bfSSheng #include <set> 43*df3765bfSSheng #include <string> 44*df3765bfSSheng #include <utility> 45*df3765bfSSheng #include <vector> 46*df3765bfSSheng 47*df3765bfSSheng using namespace llvm; 48*df3765bfSSheng 49*df3765bfSSheng #define DEBUG_TYPE "decoder-emitter" 50*df3765bfSSheng 51*df3765bfSSheng namespace { 52*df3765bfSSheng 53*df3765bfSSheng STATISTIC(NumEncodings, "Number of encodings considered"); 54*df3765bfSSheng STATISTIC(NumEncodingsLackingDisasm, "Number of encodings without disassembler info"); 55*df3765bfSSheng STATISTIC(NumInstructions, "Number of instructions considered"); 56*df3765bfSSheng STATISTIC(NumEncodingsSupported, "Number of encodings supported"); 57*df3765bfSSheng STATISTIC(NumEncodingsOmitted, "Number of encodings omitted"); 58*df3765bfSSheng 59*df3765bfSSheng struct EncodingField { 60*df3765bfSSheng unsigned Base, Width, Offset; 61*df3765bfSSheng EncodingField(unsigned B, unsigned W, unsigned O) 62*df3765bfSSheng : Base(B), Width(W), Offset(O) { } 63*df3765bfSSheng }; 64*df3765bfSSheng 65*df3765bfSSheng struct OperandInfo { 66*df3765bfSSheng std::vector<EncodingField> Fields; 67*df3765bfSSheng std::string Decoder; 68*df3765bfSSheng bool HasCompleteDecoder; 69*df3765bfSSheng uint64_t InitValue; 70*df3765bfSSheng 71*df3765bfSSheng OperandInfo(std::string D, bool HCD) 72*df3765bfSSheng : Decoder(std::move(D)), HasCompleteDecoder(HCD), InitValue(0) {} 73*df3765bfSSheng 74*df3765bfSSheng void addField(unsigned Base, unsigned Width, unsigned Offset) { 75*df3765bfSSheng Fields.push_back(EncodingField(Base, Width, Offset)); 76*df3765bfSSheng } 77*df3765bfSSheng 78*df3765bfSSheng unsigned numFields() const { return Fields.size(); } 79*df3765bfSSheng 80*df3765bfSSheng typedef std::vector<EncodingField>::const_iterator const_iterator; 81*df3765bfSSheng 82*df3765bfSSheng const_iterator begin() const { return Fields.begin(); } 83*df3765bfSSheng const_iterator end() const { return Fields.end(); } 84*df3765bfSSheng }; 85*df3765bfSSheng 86*df3765bfSSheng typedef std::vector<uint8_t> DecoderTable; 87*df3765bfSSheng typedef uint32_t DecoderFixup; 88*df3765bfSSheng typedef std::vector<DecoderFixup> FixupList; 89*df3765bfSSheng typedef std::vector<FixupList> FixupScopeList; 90*df3765bfSSheng typedef SmallSetVector<CachedHashString, 16> PredicateSet; 91*df3765bfSSheng typedef SmallSetVector<CachedHashString, 16> DecoderSet; 92*df3765bfSSheng struct DecoderTableInfo { 93*df3765bfSSheng DecoderTable Table; 94*df3765bfSSheng FixupScopeList FixupStack; 95*df3765bfSSheng PredicateSet Predicates; 96*df3765bfSSheng DecoderSet Decoders; 97*df3765bfSSheng }; 98*df3765bfSSheng 99*df3765bfSSheng struct EncodingAndInst { 100*df3765bfSSheng const Record *EncodingDef; 101*df3765bfSSheng const CodeGenInstruction *Inst; 102*df3765bfSSheng StringRef HwModeName; 103*df3765bfSSheng 104*df3765bfSSheng EncodingAndInst(const Record *EncodingDef, const CodeGenInstruction *Inst, 105*df3765bfSSheng StringRef HwModeName = "") 106*df3765bfSSheng : EncodingDef(EncodingDef), Inst(Inst), HwModeName(HwModeName) {} 107*df3765bfSSheng }; 108*df3765bfSSheng 109*df3765bfSSheng struct EncodingIDAndOpcode { 110*df3765bfSSheng unsigned EncodingID; 111*df3765bfSSheng unsigned Opcode; 112*df3765bfSSheng 113*df3765bfSSheng EncodingIDAndOpcode() : EncodingID(0), Opcode(0) {} 114*df3765bfSSheng EncodingIDAndOpcode(unsigned EncodingID, unsigned Opcode) 115*df3765bfSSheng : EncodingID(EncodingID), Opcode(Opcode) {} 116*df3765bfSSheng }; 117*df3765bfSSheng 118*df3765bfSSheng raw_ostream &operator<<(raw_ostream &OS, const EncodingAndInst &Value) { 119*df3765bfSSheng if (Value.EncodingDef != Value.Inst->TheDef) 120*df3765bfSSheng OS << Value.EncodingDef->getName() << ":"; 121*df3765bfSSheng OS << Value.Inst->TheDef->getName(); 122*df3765bfSSheng return OS; 123*df3765bfSSheng } 124*df3765bfSSheng 125*df3765bfSSheng class DecoderEmitter { 126*df3765bfSSheng RecordKeeper &RK; 127*df3765bfSSheng std::vector<EncodingAndInst> NumberedEncodings; 128*df3765bfSSheng 129*df3765bfSSheng public: 130*df3765bfSSheng // Defaults preserved here for documentation, even though they aren't 131*df3765bfSSheng // strictly necessary given the way that this is currently being called. 132*df3765bfSSheng DecoderEmitter(RecordKeeper &R, std::string PredicateNamespace, 133*df3765bfSSheng std::string GPrefix = "if (", 134*df3765bfSSheng std::string GPostfix = " == MCDisassembler::Fail)", 135*df3765bfSSheng std::string ROK = "MCDisassembler::Success", 136*df3765bfSSheng std::string RFail = "MCDisassembler::Fail", std::string L = "") 137*df3765bfSSheng : RK(R), Target(R), PredicateNamespace(std::move(PredicateNamespace)), 138*df3765bfSSheng GuardPrefix(std::move(GPrefix)), GuardPostfix(std::move(GPostfix)), 139*df3765bfSSheng ReturnOK(std::move(ROK)), ReturnFail(std::move(RFail)), 140*df3765bfSSheng Locals(std::move(L)) {} 141*df3765bfSSheng 142*df3765bfSSheng // Emit the decoder state machine table. 143*df3765bfSSheng void emitTable(formatted_raw_ostream &o, DecoderTable &Table, 144*df3765bfSSheng unsigned Indentation, unsigned BitWidth, 145*df3765bfSSheng StringRef Namespace) const; 146*df3765bfSSheng void emitInstrLenTable(formatted_raw_ostream &OS, 147*df3765bfSSheng std::vector<unsigned> &InstrLen) const; 148*df3765bfSSheng void emitPredicateFunction(formatted_raw_ostream &OS, 149*df3765bfSSheng PredicateSet &Predicates, 150*df3765bfSSheng unsigned Indentation) const; 151*df3765bfSSheng void emitDecoderFunction(formatted_raw_ostream &OS, 152*df3765bfSSheng DecoderSet &Decoders, 153*df3765bfSSheng unsigned Indentation) const; 154*df3765bfSSheng 155*df3765bfSSheng // run - Output the code emitter 156*df3765bfSSheng void run(raw_ostream &o); 157*df3765bfSSheng 158*df3765bfSSheng private: 159*df3765bfSSheng CodeGenTarget Target; 160*df3765bfSSheng 161*df3765bfSSheng public: 162*df3765bfSSheng std::string PredicateNamespace; 163*df3765bfSSheng std::string GuardPrefix, GuardPostfix; 164*df3765bfSSheng std::string ReturnOK, ReturnFail; 165*df3765bfSSheng std::string Locals; 166*df3765bfSSheng }; 167*df3765bfSSheng 168*df3765bfSSheng } // end anonymous namespace 169*df3765bfSSheng 170*df3765bfSSheng // The set (BIT_TRUE, BIT_FALSE, BIT_UNSET) represents a ternary logic system 171*df3765bfSSheng // for a bit value. 172*df3765bfSSheng // 173*df3765bfSSheng // BIT_UNFILTERED is used as the init value for a filter position. It is used 174*df3765bfSSheng // only for filter processings. 175*df3765bfSSheng typedef enum { 176*df3765bfSSheng BIT_TRUE, // '1' 177*df3765bfSSheng BIT_FALSE, // '0' 178*df3765bfSSheng BIT_UNSET, // '?' 179*df3765bfSSheng BIT_UNFILTERED // unfiltered 180*df3765bfSSheng } bit_value_t; 181*df3765bfSSheng 182*df3765bfSSheng static bool ValueSet(bit_value_t V) { 183*df3765bfSSheng return (V == BIT_TRUE || V == BIT_FALSE); 184*df3765bfSSheng } 185*df3765bfSSheng 186*df3765bfSSheng static bool ValueNotSet(bit_value_t V) { 187*df3765bfSSheng return (V == BIT_UNSET); 188*df3765bfSSheng } 189*df3765bfSSheng 190*df3765bfSSheng static int Value(bit_value_t V) { 191*df3765bfSSheng return ValueNotSet(V) ? -1 : (V == BIT_FALSE ? 0 : 1); 192*df3765bfSSheng } 193*df3765bfSSheng 194*df3765bfSSheng static bit_value_t bitFromBits(const BitsInit &bits, unsigned index) { 195*df3765bfSSheng if (BitInit *bit = dyn_cast<BitInit>(bits.getBit(index))) 196*df3765bfSSheng return bit->getValue() ? BIT_TRUE : BIT_FALSE; 197*df3765bfSSheng 198*df3765bfSSheng // The bit is uninitialized. 199*df3765bfSSheng return BIT_UNSET; 200*df3765bfSSheng } 201*df3765bfSSheng 202*df3765bfSSheng // Prints the bit value for each position. 203*df3765bfSSheng static void dumpBits(raw_ostream &o, const BitsInit &bits) { 204*df3765bfSSheng for (unsigned index = bits.getNumBits(); index > 0; --index) { 205*df3765bfSSheng switch (bitFromBits(bits, index - 1)) { 206*df3765bfSSheng case BIT_TRUE: 207*df3765bfSSheng o << "1"; 208*df3765bfSSheng break; 209*df3765bfSSheng case BIT_FALSE: 210*df3765bfSSheng o << "0"; 211*df3765bfSSheng break; 212*df3765bfSSheng case BIT_UNSET: 213*df3765bfSSheng o << "_"; 214*df3765bfSSheng break; 215*df3765bfSSheng default: 216*df3765bfSSheng llvm_unreachable("unexpected return value from bitFromBits"); 217*df3765bfSSheng } 218*df3765bfSSheng } 219*df3765bfSSheng } 220*df3765bfSSheng 221*df3765bfSSheng static BitsInit &getBitsField(const Record &def, StringRef str) { 222*df3765bfSSheng const RecordVal *RV = def.getValue(str); 223*df3765bfSSheng if (BitsInit *Bits = dyn_cast<BitsInit>(RV->getValue())) 224*df3765bfSSheng return *Bits; 225*df3765bfSSheng 226*df3765bfSSheng // variable length instruction 227*df3765bfSSheng VarLenInst VLI = VarLenInst(cast<DagInit>(RV->getValue()), RV); 228*df3765bfSSheng SmallVector<Init *, 16> Bits; 229*df3765bfSSheng 230*df3765bfSSheng for (auto &SI : VLI) { 231*df3765bfSSheng if (const BitsInit *BI = dyn_cast<BitsInit>(SI.Value)) { 232*df3765bfSSheng for (unsigned Idx = 0U; Idx < BI->getNumBits(); ++Idx) { 233*df3765bfSSheng Bits.push_back(BI->getBit(Idx)); 234*df3765bfSSheng } 235*df3765bfSSheng } else if (const BitInit *BI = dyn_cast<BitInit>(SI.Value)) { 236*df3765bfSSheng Bits.push_back(const_cast<BitInit *>(BI)); 237*df3765bfSSheng } else { 238*df3765bfSSheng for (unsigned Idx = 0U; Idx < SI.BitWidth; ++Idx) 239*df3765bfSSheng Bits.push_back(UnsetInit::get()); 240*df3765bfSSheng } 241*df3765bfSSheng } 242*df3765bfSSheng 243*df3765bfSSheng return *BitsInit::get(Bits); 244*df3765bfSSheng } 245*df3765bfSSheng 246*df3765bfSSheng // Representation of the instruction to work on. 247*df3765bfSSheng typedef std::vector<bit_value_t> insn_t; 248*df3765bfSSheng 249*df3765bfSSheng namespace { 250*df3765bfSSheng 251*df3765bfSSheng static const uint64_t NO_FIXED_SEGMENTS_SENTINEL = -1ULL; 252*df3765bfSSheng 253*df3765bfSSheng class FilterChooser; 254*df3765bfSSheng 255*df3765bfSSheng /// Filter - Filter works with FilterChooser to produce the decoding tree for 256*df3765bfSSheng /// the ISA. 257*df3765bfSSheng /// 258*df3765bfSSheng /// It is useful to think of a Filter as governing the switch stmts of the 259*df3765bfSSheng /// decoding tree in a certain level. Each case stmt delegates to an inferior 260*df3765bfSSheng /// FilterChooser to decide what further decoding logic to employ, or in another 261*df3765bfSSheng /// words, what other remaining bits to look at. The FilterChooser eventually 262*df3765bfSSheng /// chooses a best Filter to do its job. 263*df3765bfSSheng /// 264*df3765bfSSheng /// This recursive scheme ends when the number of Opcodes assigned to the 265*df3765bfSSheng /// FilterChooser becomes 1 or if there is a conflict. A conflict happens when 266*df3765bfSSheng /// the Filter/FilterChooser combo does not know how to distinguish among the 267*df3765bfSSheng /// Opcodes assigned. 268*df3765bfSSheng /// 269*df3765bfSSheng /// An example of a conflict is 270*df3765bfSSheng /// 271*df3765bfSSheng /// Conflict: 272*df3765bfSSheng /// 111101000.00........00010000.... 273*df3765bfSSheng /// 111101000.00........0001........ 274*df3765bfSSheng /// 1111010...00........0001........ 275*df3765bfSSheng /// 1111010...00.................... 276*df3765bfSSheng /// 1111010......................... 277*df3765bfSSheng /// 1111............................ 278*df3765bfSSheng /// ................................ 279*df3765bfSSheng /// VST4q8a 111101000_00________00010000____ 280*df3765bfSSheng /// VST4q8b 111101000_00________00010000____ 281*df3765bfSSheng /// 282*df3765bfSSheng /// The Debug output shows the path that the decoding tree follows to reach the 283*df3765bfSSheng /// the conclusion that there is a conflict. VST4q8a is a vst4 to double-spaced 284*df3765bfSSheng /// even registers, while VST4q8b is a vst4 to double-spaced odd registers. 285*df3765bfSSheng /// 286*df3765bfSSheng /// The encoding info in the .td files does not specify this meta information, 287*df3765bfSSheng /// which could have been used by the decoder to resolve the conflict. The 288*df3765bfSSheng /// decoder could try to decode the even/odd register numbering and assign to 289*df3765bfSSheng /// VST4q8a or VST4q8b, but for the time being, the decoder chooses the "a" 290*df3765bfSSheng /// version and return the Opcode since the two have the same Asm format string. 291*df3765bfSSheng class Filter { 292*df3765bfSSheng protected: 293*df3765bfSSheng const FilterChooser *Owner;// points to the FilterChooser who owns this filter 294*df3765bfSSheng unsigned StartBit; // the starting bit position 295*df3765bfSSheng unsigned NumBits; // number of bits to filter 296*df3765bfSSheng bool Mixed; // a mixed region contains both set and unset bits 297*df3765bfSSheng 298*df3765bfSSheng // Map of well-known segment value to the set of uid's with that value. 299*df3765bfSSheng std::map<uint64_t, std::vector<EncodingIDAndOpcode>> 300*df3765bfSSheng FilteredInstructions; 301*df3765bfSSheng 302*df3765bfSSheng // Set of uid's with non-constant segment values. 303*df3765bfSSheng std::vector<EncodingIDAndOpcode> VariableInstructions; 304*df3765bfSSheng 305*df3765bfSSheng // Map of well-known segment value to its delegate. 306*df3765bfSSheng std::map<uint64_t, std::unique_ptr<const FilterChooser>> FilterChooserMap; 307*df3765bfSSheng 308*df3765bfSSheng // Number of instructions which fall under FilteredInstructions category. 309*df3765bfSSheng unsigned NumFiltered; 310*df3765bfSSheng 311*df3765bfSSheng // Keeps track of the last opcode in the filtered bucket. 312*df3765bfSSheng EncodingIDAndOpcode LastOpcFiltered; 313*df3765bfSSheng 314*df3765bfSSheng public: 315*df3765bfSSheng Filter(Filter &&f); 316*df3765bfSSheng Filter(FilterChooser &owner, unsigned startBit, unsigned numBits, bool mixed); 317*df3765bfSSheng 318*df3765bfSSheng ~Filter() = default; 319*df3765bfSSheng 320*df3765bfSSheng unsigned getNumFiltered() const { return NumFiltered; } 321*df3765bfSSheng 322*df3765bfSSheng EncodingIDAndOpcode getSingletonOpc() const { 323*df3765bfSSheng assert(NumFiltered == 1); 324*df3765bfSSheng return LastOpcFiltered; 325*df3765bfSSheng } 326*df3765bfSSheng 327*df3765bfSSheng // Return the filter chooser for the group of instructions without constant 328*df3765bfSSheng // segment values. 329*df3765bfSSheng const FilterChooser &getVariableFC() const { 330*df3765bfSSheng assert(NumFiltered == 1); 331*df3765bfSSheng assert(FilterChooserMap.size() == 1); 332*df3765bfSSheng return *(FilterChooserMap.find(NO_FIXED_SEGMENTS_SENTINEL)->second); 333*df3765bfSSheng } 334*df3765bfSSheng 335*df3765bfSSheng // Divides the decoding task into sub tasks and delegates them to the 336*df3765bfSSheng // inferior FilterChooser's. 337*df3765bfSSheng // 338*df3765bfSSheng // A special case arises when there's only one entry in the filtered 339*df3765bfSSheng // instructions. In order to unambiguously decode the singleton, we need to 340*df3765bfSSheng // match the remaining undecoded encoding bits against the singleton. 341*df3765bfSSheng void recurse(); 342*df3765bfSSheng 343*df3765bfSSheng // Emit table entries to decode instructions given a segment or segments of 344*df3765bfSSheng // bits. 345*df3765bfSSheng void emitTableEntry(DecoderTableInfo &TableInfo) const; 346*df3765bfSSheng 347*df3765bfSSheng // Returns the number of fanout produced by the filter. More fanout implies 348*df3765bfSSheng // the filter distinguishes more categories of instructions. 349*df3765bfSSheng unsigned usefulness() const; 350*df3765bfSSheng }; // end class Filter 351*df3765bfSSheng 352*df3765bfSSheng } // end anonymous namespace 353*df3765bfSSheng 354*df3765bfSSheng // These are states of our finite state machines used in FilterChooser's 355*df3765bfSSheng // filterProcessor() which produces the filter candidates to use. 356*df3765bfSSheng typedef enum { 357*df3765bfSSheng ATTR_NONE, 358*df3765bfSSheng ATTR_FILTERED, 359*df3765bfSSheng ATTR_ALL_SET, 360*df3765bfSSheng ATTR_ALL_UNSET, 361*df3765bfSSheng ATTR_MIXED 362*df3765bfSSheng } bitAttr_t; 363*df3765bfSSheng 364*df3765bfSSheng /// FilterChooser - FilterChooser chooses the best filter among a set of Filters 365*df3765bfSSheng /// in order to perform the decoding of instructions at the current level. 366*df3765bfSSheng /// 367*df3765bfSSheng /// Decoding proceeds from the top down. Based on the well-known encoding bits 368*df3765bfSSheng /// of instructions available, FilterChooser builds up the possible Filters that 369*df3765bfSSheng /// can further the task of decoding by distinguishing among the remaining 370*df3765bfSSheng /// candidate instructions. 371*df3765bfSSheng /// 372*df3765bfSSheng /// Once a filter has been chosen, it is called upon to divide the decoding task 373*df3765bfSSheng /// into sub-tasks and delegates them to its inferior FilterChoosers for further 374*df3765bfSSheng /// processings. 375*df3765bfSSheng /// 376*df3765bfSSheng /// It is useful to think of a Filter as governing the switch stmts of the 377*df3765bfSSheng /// decoding tree. And each case is delegated to an inferior FilterChooser to 378*df3765bfSSheng /// decide what further remaining bits to look at. 379*df3765bfSSheng namespace { 380*df3765bfSSheng 381*df3765bfSSheng class FilterChooser { 382*df3765bfSSheng protected: 383*df3765bfSSheng friend class Filter; 384*df3765bfSSheng 385*df3765bfSSheng // Vector of codegen instructions to choose our filter. 386*df3765bfSSheng ArrayRef<EncodingAndInst> AllInstructions; 387*df3765bfSSheng 388*df3765bfSSheng // Vector of uid's for this filter chooser to work on. 389*df3765bfSSheng // The first member of the pair is the opcode id being decoded, the second is 390*df3765bfSSheng // the opcode id that should be emitted. 391*df3765bfSSheng const std::vector<EncodingIDAndOpcode> &Opcodes; 392*df3765bfSSheng 393*df3765bfSSheng // Lookup table for the operand decoding of instructions. 394*df3765bfSSheng const std::map<unsigned, std::vector<OperandInfo>> &Operands; 395*df3765bfSSheng 396*df3765bfSSheng // Vector of candidate filters. 397*df3765bfSSheng std::vector<Filter> Filters; 398*df3765bfSSheng 399*df3765bfSSheng // Array of bit values passed down from our parent. 400*df3765bfSSheng // Set to all BIT_UNFILTERED's for Parent == NULL. 401*df3765bfSSheng std::vector<bit_value_t> FilterBitValues; 402*df3765bfSSheng 403*df3765bfSSheng // Links to the FilterChooser above us in the decoding tree. 404*df3765bfSSheng const FilterChooser *Parent; 405*df3765bfSSheng 406*df3765bfSSheng // Index of the best filter from Filters. 407*df3765bfSSheng int BestIndex; 408*df3765bfSSheng 409*df3765bfSSheng // Width of instructions 410*df3765bfSSheng unsigned BitWidth; 411*df3765bfSSheng 412*df3765bfSSheng // Parent emitter 413*df3765bfSSheng const DecoderEmitter *Emitter; 414*df3765bfSSheng 415*df3765bfSSheng public: 416*df3765bfSSheng FilterChooser(ArrayRef<EncodingAndInst> Insts, 417*df3765bfSSheng const std::vector<EncodingIDAndOpcode> &IDs, 418*df3765bfSSheng const std::map<unsigned, std::vector<OperandInfo>> &Ops, 419*df3765bfSSheng unsigned BW, const DecoderEmitter *E) 420*df3765bfSSheng : AllInstructions(Insts), Opcodes(IDs), Operands(Ops), 421*df3765bfSSheng FilterBitValues(BW, BIT_UNFILTERED), Parent(nullptr), BestIndex(-1), 422*df3765bfSSheng BitWidth(BW), Emitter(E) { 423*df3765bfSSheng doFilter(); 424*df3765bfSSheng } 425*df3765bfSSheng 426*df3765bfSSheng FilterChooser(ArrayRef<EncodingAndInst> Insts, 427*df3765bfSSheng const std::vector<EncodingIDAndOpcode> &IDs, 428*df3765bfSSheng const std::map<unsigned, std::vector<OperandInfo>> &Ops, 429*df3765bfSSheng const std::vector<bit_value_t> &ParentFilterBitValues, 430*df3765bfSSheng const FilterChooser &parent) 431*df3765bfSSheng : AllInstructions(Insts), Opcodes(IDs), Operands(Ops), 432*df3765bfSSheng FilterBitValues(ParentFilterBitValues), Parent(&parent), BestIndex(-1), 433*df3765bfSSheng BitWidth(parent.BitWidth), Emitter(parent.Emitter) { 434*df3765bfSSheng doFilter(); 435*df3765bfSSheng } 436*df3765bfSSheng 437*df3765bfSSheng FilterChooser(const FilterChooser &) = delete; 438*df3765bfSSheng void operator=(const FilterChooser &) = delete; 439*df3765bfSSheng 440*df3765bfSSheng unsigned getBitWidth() const { return BitWidth; } 441*df3765bfSSheng 442*df3765bfSSheng protected: 443*df3765bfSSheng // Populates the insn given the uid. 444*df3765bfSSheng void insnWithID(insn_t &Insn, unsigned Opcode) const { 445*df3765bfSSheng BitsInit &Bits = getBitsField(*AllInstructions[Opcode].EncodingDef, "Inst"); 446*df3765bfSSheng Insn.resize(BitWidth > Bits.getNumBits() ? BitWidth : Bits.getNumBits(), 447*df3765bfSSheng BIT_UNSET); 448*df3765bfSSheng // We may have a SoftFail bitmask, which specifies a mask where an encoding 449*df3765bfSSheng // may differ from the value in "Inst" and yet still be valid, but the 450*df3765bfSSheng // disassembler should return SoftFail instead of Success. 451*df3765bfSSheng // 452*df3765bfSSheng // This is used for marking UNPREDICTABLE instructions in the ARM world. 453*df3765bfSSheng const RecordVal *RV = 454*df3765bfSSheng AllInstructions[Opcode].EncodingDef->getValue("SoftFail"); 455*df3765bfSSheng const BitsInit *SFBits = RV ? dyn_cast<BitsInit>(RV->getValue()) : nullptr; 456*df3765bfSSheng for (unsigned i = 0; i < Bits.getNumBits(); ++i) { 457*df3765bfSSheng if (SFBits && bitFromBits(*SFBits, i) == BIT_TRUE) 458*df3765bfSSheng Insn[i] = BIT_UNSET; 459*df3765bfSSheng else 460*df3765bfSSheng Insn[i] = bitFromBits(Bits, i); 461*df3765bfSSheng } 462*df3765bfSSheng } 463*df3765bfSSheng 464*df3765bfSSheng // Emit the name of the encoding/instruction pair. 465*df3765bfSSheng void emitNameWithID(raw_ostream &OS, unsigned Opcode) const { 466*df3765bfSSheng const Record *EncodingDef = AllInstructions[Opcode].EncodingDef; 467*df3765bfSSheng const Record *InstDef = AllInstructions[Opcode].Inst->TheDef; 468*df3765bfSSheng if (EncodingDef != InstDef) 469*df3765bfSSheng OS << EncodingDef->getName() << ":"; 470*df3765bfSSheng OS << InstDef->getName(); 471*df3765bfSSheng } 472*df3765bfSSheng 473*df3765bfSSheng // Populates the field of the insn given the start position and the number of 474*df3765bfSSheng // consecutive bits to scan for. 475*df3765bfSSheng // 476*df3765bfSSheng // Returns false if there exists any uninitialized bit value in the range. 477*df3765bfSSheng // Returns true, otherwise. 478*df3765bfSSheng bool fieldFromInsn(uint64_t &Field, insn_t &Insn, unsigned StartBit, 479*df3765bfSSheng unsigned NumBits) const; 480*df3765bfSSheng 481*df3765bfSSheng /// dumpFilterArray - dumpFilterArray prints out debugging info for the given 482*df3765bfSSheng /// filter array as a series of chars. 483*df3765bfSSheng void dumpFilterArray(raw_ostream &o, 484*df3765bfSSheng const std::vector<bit_value_t> & filter) const; 485*df3765bfSSheng 486*df3765bfSSheng /// dumpStack - dumpStack traverses the filter chooser chain and calls 487*df3765bfSSheng /// dumpFilterArray on each filter chooser up to the top level one. 488*df3765bfSSheng void dumpStack(raw_ostream &o, const char *prefix) const; 489*df3765bfSSheng 490*df3765bfSSheng Filter &bestFilter() { 491*df3765bfSSheng assert(BestIndex != -1 && "BestIndex not set"); 492*df3765bfSSheng return Filters[BestIndex]; 493*df3765bfSSheng } 494*df3765bfSSheng 495*df3765bfSSheng bool PositionFiltered(unsigned i) const { 496*df3765bfSSheng return ValueSet(FilterBitValues[i]); 497*df3765bfSSheng } 498*df3765bfSSheng 499*df3765bfSSheng // Calculates the island(s) needed to decode the instruction. 500*df3765bfSSheng // This returns a lit of undecoded bits of an instructions, for example, 501*df3765bfSSheng // Inst{20} = 1 && Inst{3-0} == 0b1111 represents two islands of yet-to-be 502*df3765bfSSheng // decoded bits in order to verify that the instruction matches the Opcode. 503*df3765bfSSheng unsigned getIslands(std::vector<unsigned> &StartBits, 504*df3765bfSSheng std::vector<unsigned> &EndBits, 505*df3765bfSSheng std::vector<uint64_t> &FieldVals, 506*df3765bfSSheng const insn_t &Insn) const; 507*df3765bfSSheng 508*df3765bfSSheng // Emits code to check the Predicates member of an instruction are true. 509*df3765bfSSheng // Returns true if predicate matches were emitted, false otherwise. 510*df3765bfSSheng bool emitPredicateMatch(raw_ostream &o, unsigned &Indentation, 511*df3765bfSSheng unsigned Opc) const; 512*df3765bfSSheng 513*df3765bfSSheng bool doesOpcodeNeedPredicate(unsigned Opc) const; 514*df3765bfSSheng unsigned getPredicateIndex(DecoderTableInfo &TableInfo, StringRef P) const; 515*df3765bfSSheng void emitPredicateTableEntry(DecoderTableInfo &TableInfo, 516*df3765bfSSheng unsigned Opc) const; 517*df3765bfSSheng 518*df3765bfSSheng void emitSoftFailTableEntry(DecoderTableInfo &TableInfo, 519*df3765bfSSheng unsigned Opc) const; 520*df3765bfSSheng 521*df3765bfSSheng // Emits table entries to decode the singleton. 522*df3765bfSSheng void emitSingletonTableEntry(DecoderTableInfo &TableInfo, 523*df3765bfSSheng EncodingIDAndOpcode Opc) const; 524*df3765bfSSheng 525*df3765bfSSheng // Emits code to decode the singleton, and then to decode the rest. 526*df3765bfSSheng void emitSingletonTableEntry(DecoderTableInfo &TableInfo, 527*df3765bfSSheng const Filter &Best) const; 528*df3765bfSSheng 529*df3765bfSSheng void emitBinaryParser(raw_ostream &o, unsigned &Indentation, 530*df3765bfSSheng const OperandInfo &OpInfo, 531*df3765bfSSheng bool &OpHasCompleteDecoder) const; 532*df3765bfSSheng 533*df3765bfSSheng void emitDecoder(raw_ostream &OS, unsigned Indentation, unsigned Opc, 534*df3765bfSSheng bool &HasCompleteDecoder) const; 535*df3765bfSSheng unsigned getDecoderIndex(DecoderSet &Decoders, unsigned Opc, 536*df3765bfSSheng bool &HasCompleteDecoder) const; 537*df3765bfSSheng 538*df3765bfSSheng // Assign a single filter and run with it. 539*df3765bfSSheng void runSingleFilter(unsigned startBit, unsigned numBit, bool mixed); 540*df3765bfSSheng 541*df3765bfSSheng // reportRegion is a helper function for filterProcessor to mark a region as 542*df3765bfSSheng // eligible for use as a filter region. 543*df3765bfSSheng void reportRegion(bitAttr_t RA, unsigned StartBit, unsigned BitIndex, 544*df3765bfSSheng bool AllowMixed); 545*df3765bfSSheng 546*df3765bfSSheng // FilterProcessor scans the well-known encoding bits of the instructions and 547*df3765bfSSheng // builds up a list of candidate filters. It chooses the best filter and 548*df3765bfSSheng // recursively descends down the decoding tree. 549*df3765bfSSheng bool filterProcessor(bool AllowMixed, bool Greedy = true); 550*df3765bfSSheng 551*df3765bfSSheng // Decides on the best configuration of filter(s) to use in order to decode 552*df3765bfSSheng // the instructions. A conflict of instructions may occur, in which case we 553*df3765bfSSheng // dump the conflict set to the standard error. 554*df3765bfSSheng void doFilter(); 555*df3765bfSSheng 556*df3765bfSSheng public: 557*df3765bfSSheng // emitTableEntries - Emit state machine entries to decode our share of 558*df3765bfSSheng // instructions. 559*df3765bfSSheng void emitTableEntries(DecoderTableInfo &TableInfo) const; 560*df3765bfSSheng }; 561*df3765bfSSheng 562*df3765bfSSheng } // end anonymous namespace 563*df3765bfSSheng 564*df3765bfSSheng /////////////////////////// 565*df3765bfSSheng // // 566*df3765bfSSheng // Filter Implementation // 567*df3765bfSSheng // // 568*df3765bfSSheng /////////////////////////// 569*df3765bfSSheng 570*df3765bfSSheng Filter::Filter(Filter &&f) 571*df3765bfSSheng : Owner(f.Owner), StartBit(f.StartBit), NumBits(f.NumBits), Mixed(f.Mixed), 572*df3765bfSSheng FilteredInstructions(std::move(f.FilteredInstructions)), 573*df3765bfSSheng VariableInstructions(std::move(f.VariableInstructions)), 574*df3765bfSSheng FilterChooserMap(std::move(f.FilterChooserMap)), NumFiltered(f.NumFiltered), 575*df3765bfSSheng LastOpcFiltered(f.LastOpcFiltered) { 576*df3765bfSSheng } 577*df3765bfSSheng 578*df3765bfSSheng Filter::Filter(FilterChooser &owner, unsigned startBit, unsigned numBits, 579*df3765bfSSheng bool mixed) 580*df3765bfSSheng : Owner(&owner), StartBit(startBit), NumBits(numBits), Mixed(mixed) { 581*df3765bfSSheng assert(StartBit + NumBits - 1 < Owner->BitWidth); 582*df3765bfSSheng 583*df3765bfSSheng NumFiltered = 0; 584*df3765bfSSheng LastOpcFiltered = {0, 0}; 585*df3765bfSSheng 586*df3765bfSSheng for (unsigned i = 0, e = Owner->Opcodes.size(); i != e; ++i) { 587*df3765bfSSheng insn_t Insn; 588*df3765bfSSheng 589*df3765bfSSheng // Populates the insn given the uid. 590*df3765bfSSheng Owner->insnWithID(Insn, Owner->Opcodes[i].EncodingID); 591*df3765bfSSheng 592*df3765bfSSheng uint64_t Field; 593*df3765bfSSheng // Scans the segment for possibly well-specified encoding bits. 594*df3765bfSSheng bool ok = Owner->fieldFromInsn(Field, Insn, StartBit, NumBits); 595*df3765bfSSheng 596*df3765bfSSheng if (ok) { 597*df3765bfSSheng // The encoding bits are well-known. Lets add the uid of the 598*df3765bfSSheng // instruction into the bucket keyed off the constant field value. 599*df3765bfSSheng LastOpcFiltered = Owner->Opcodes[i]; 600*df3765bfSSheng FilteredInstructions[Field].push_back(LastOpcFiltered); 601*df3765bfSSheng ++NumFiltered; 602*df3765bfSSheng } else { 603*df3765bfSSheng // Some of the encoding bit(s) are unspecified. This contributes to 604*df3765bfSSheng // one additional member of "Variable" instructions. 605*df3765bfSSheng VariableInstructions.push_back(Owner->Opcodes[i]); 606*df3765bfSSheng } 607*df3765bfSSheng } 608*df3765bfSSheng 609*df3765bfSSheng assert((FilteredInstructions.size() + VariableInstructions.size() > 0) 610*df3765bfSSheng && "Filter returns no instruction categories"); 611*df3765bfSSheng } 612*df3765bfSSheng 613*df3765bfSSheng // Divides the decoding task into sub tasks and delegates them to the 614*df3765bfSSheng // inferior FilterChooser's. 615*df3765bfSSheng // 616*df3765bfSSheng // A special case arises when there's only one entry in the filtered 617*df3765bfSSheng // instructions. In order to unambiguously decode the singleton, we need to 618*df3765bfSSheng // match the remaining undecoded encoding bits against the singleton. 619*df3765bfSSheng void Filter::recurse() { 620*df3765bfSSheng // Starts by inheriting our parent filter chooser's filter bit values. 621*df3765bfSSheng std::vector<bit_value_t> BitValueArray(Owner->FilterBitValues); 622*df3765bfSSheng 623*df3765bfSSheng if (!VariableInstructions.empty()) { 624*df3765bfSSheng // Conservatively marks each segment position as BIT_UNSET. 625*df3765bfSSheng for (unsigned bitIndex = 0; bitIndex < NumBits; ++bitIndex) 626*df3765bfSSheng BitValueArray[StartBit + bitIndex] = BIT_UNSET; 627*df3765bfSSheng 628*df3765bfSSheng // Delegates to an inferior filter chooser for further processing on this 629*df3765bfSSheng // group of instructions whose segment values are variable. 630*df3765bfSSheng FilterChooserMap.insert(std::make_pair(NO_FIXED_SEGMENTS_SENTINEL, 631*df3765bfSSheng std::make_unique<FilterChooser>(Owner->AllInstructions, 632*df3765bfSSheng VariableInstructions, Owner->Operands, BitValueArray, *Owner))); 633*df3765bfSSheng } 634*df3765bfSSheng 635*df3765bfSSheng // No need to recurse for a singleton filtered instruction. 636*df3765bfSSheng // See also Filter::emit*(). 637*df3765bfSSheng if (getNumFiltered() == 1) { 638*df3765bfSSheng assert(FilterChooserMap.size() == 1); 639*df3765bfSSheng return; 640*df3765bfSSheng } 641*df3765bfSSheng 642*df3765bfSSheng // Otherwise, create sub choosers. 643*df3765bfSSheng for (const auto &Inst : FilteredInstructions) { 644*df3765bfSSheng 645*df3765bfSSheng // Marks all the segment positions with either BIT_TRUE or BIT_FALSE. 646*df3765bfSSheng for (unsigned bitIndex = 0; bitIndex < NumBits; ++bitIndex) { 647*df3765bfSSheng if (Inst.first & (1ULL << bitIndex)) 648*df3765bfSSheng BitValueArray[StartBit + bitIndex] = BIT_TRUE; 649*df3765bfSSheng else 650*df3765bfSSheng BitValueArray[StartBit + bitIndex] = BIT_FALSE; 651*df3765bfSSheng } 652*df3765bfSSheng 653*df3765bfSSheng // Delegates to an inferior filter chooser for further processing on this 654*df3765bfSSheng // category of instructions. 655*df3765bfSSheng FilterChooserMap.insert(std::make_pair( 656*df3765bfSSheng Inst.first, std::make_unique<FilterChooser>( 657*df3765bfSSheng Owner->AllInstructions, Inst.second, 658*df3765bfSSheng Owner->Operands, BitValueArray, *Owner))); 659*df3765bfSSheng } 660*df3765bfSSheng } 661*df3765bfSSheng 662*df3765bfSSheng static void resolveTableFixups(DecoderTable &Table, const FixupList &Fixups, 663*df3765bfSSheng uint32_t DestIdx) { 664*df3765bfSSheng // Any NumToSkip fixups in the current scope can resolve to the 665*df3765bfSSheng // current location. 666*df3765bfSSheng for (FixupList::const_reverse_iterator I = Fixups.rbegin(), 667*df3765bfSSheng E = Fixups.rend(); 668*df3765bfSSheng I != E; ++I) { 669*df3765bfSSheng // Calculate the distance from the byte following the fixup entry byte 670*df3765bfSSheng // to the destination. The Target is calculated from after the 16-bit 671*df3765bfSSheng // NumToSkip entry itself, so subtract two from the displacement here 672*df3765bfSSheng // to account for that. 673*df3765bfSSheng uint32_t FixupIdx = *I; 674*df3765bfSSheng uint32_t Delta = DestIdx - FixupIdx - 3; 675*df3765bfSSheng // Our NumToSkip entries are 24-bits. Make sure our table isn't too 676*df3765bfSSheng // big. 677*df3765bfSSheng assert(Delta < (1u << 24)); 678*df3765bfSSheng Table[FixupIdx] = (uint8_t)Delta; 679*df3765bfSSheng Table[FixupIdx + 1] = (uint8_t)(Delta >> 8); 680*df3765bfSSheng Table[FixupIdx + 2] = (uint8_t)(Delta >> 16); 681*df3765bfSSheng } 682*df3765bfSSheng } 683*df3765bfSSheng 684*df3765bfSSheng // Emit table entries to decode instructions given a segment or segments 685*df3765bfSSheng // of bits. 686*df3765bfSSheng void Filter::emitTableEntry(DecoderTableInfo &TableInfo) const { 687*df3765bfSSheng TableInfo.Table.push_back(MCD::OPC_ExtractField); 688*df3765bfSSheng TableInfo.Table.push_back(StartBit); 689*df3765bfSSheng TableInfo.Table.push_back(NumBits); 690*df3765bfSSheng 691*df3765bfSSheng // A new filter entry begins a new scope for fixup resolution. 692*df3765bfSSheng TableInfo.FixupStack.emplace_back(); 693*df3765bfSSheng 694*df3765bfSSheng DecoderTable &Table = TableInfo.Table; 695*df3765bfSSheng 696*df3765bfSSheng size_t PrevFilter = 0; 697*df3765bfSSheng bool HasFallthrough = false; 698*df3765bfSSheng for (auto &Filter : FilterChooserMap) { 699*df3765bfSSheng // Field value -1 implies a non-empty set of variable instructions. 700*df3765bfSSheng // See also recurse(). 701*df3765bfSSheng if (Filter.first == NO_FIXED_SEGMENTS_SENTINEL) { 702*df3765bfSSheng HasFallthrough = true; 703*df3765bfSSheng 704*df3765bfSSheng // Each scope should always have at least one filter value to check 705*df3765bfSSheng // for. 706*df3765bfSSheng assert(PrevFilter != 0 && "empty filter set!"); 707*df3765bfSSheng FixupList &CurScope = TableInfo.FixupStack.back(); 708*df3765bfSSheng // Resolve any NumToSkip fixups in the current scope. 709*df3765bfSSheng resolveTableFixups(Table, CurScope, Table.size()); 710*df3765bfSSheng CurScope.clear(); 711*df3765bfSSheng PrevFilter = 0; // Don't re-process the filter's fallthrough. 712*df3765bfSSheng } else { 713*df3765bfSSheng Table.push_back(MCD::OPC_FilterValue); 714*df3765bfSSheng // Encode and emit the value to filter against. 715*df3765bfSSheng uint8_t Buffer[16]; 716*df3765bfSSheng unsigned Len = encodeULEB128(Filter.first, Buffer); 717*df3765bfSSheng Table.insert(Table.end(), Buffer, Buffer + Len); 718*df3765bfSSheng // Reserve space for the NumToSkip entry. We'll backpatch the value 719*df3765bfSSheng // later. 720*df3765bfSSheng PrevFilter = Table.size(); 721*df3765bfSSheng Table.push_back(0); 722*df3765bfSSheng Table.push_back(0); 723*df3765bfSSheng Table.push_back(0); 724*df3765bfSSheng } 725*df3765bfSSheng 726*df3765bfSSheng // We arrive at a category of instructions with the same segment value. 727*df3765bfSSheng // Now delegate to the sub filter chooser for further decodings. 728*df3765bfSSheng // The case may fallthrough, which happens if the remaining well-known 729*df3765bfSSheng // encoding bits do not match exactly. 730*df3765bfSSheng Filter.second->emitTableEntries(TableInfo); 731*df3765bfSSheng 732*df3765bfSSheng // Now that we've emitted the body of the handler, update the NumToSkip 733*df3765bfSSheng // of the filter itself to be able to skip forward when false. Subtract 734*df3765bfSSheng // two as to account for the width of the NumToSkip field itself. 735*df3765bfSSheng if (PrevFilter) { 736*df3765bfSSheng uint32_t NumToSkip = Table.size() - PrevFilter - 3; 737*df3765bfSSheng assert(NumToSkip < (1u << 24) && "disassembler decoding table too large!"); 738*df3765bfSSheng Table[PrevFilter] = (uint8_t)NumToSkip; 739*df3765bfSSheng Table[PrevFilter + 1] = (uint8_t)(NumToSkip >> 8); 740*df3765bfSSheng Table[PrevFilter + 2] = (uint8_t)(NumToSkip >> 16); 741*df3765bfSSheng } 742*df3765bfSSheng } 743*df3765bfSSheng 744*df3765bfSSheng // Any remaining unresolved fixups bubble up to the parent fixup scope. 745*df3765bfSSheng assert(TableInfo.FixupStack.size() > 1 && "fixup stack underflow!"); 746*df3765bfSSheng FixupScopeList::iterator Source = TableInfo.FixupStack.end() - 1; 747*df3765bfSSheng FixupScopeList::iterator Dest = Source - 1; 748*df3765bfSSheng llvm::append_range(*Dest, *Source); 749*df3765bfSSheng TableInfo.FixupStack.pop_back(); 750*df3765bfSSheng 751*df3765bfSSheng // If there is no fallthrough, then the final filter should get fixed 752*df3765bfSSheng // up according to the enclosing scope rather than the current position. 753*df3765bfSSheng if (!HasFallthrough) 754*df3765bfSSheng TableInfo.FixupStack.back().push_back(PrevFilter); 755*df3765bfSSheng } 756*df3765bfSSheng 757*df3765bfSSheng // Returns the number of fanout produced by the filter. More fanout implies 758*df3765bfSSheng // the filter distinguishes more categories of instructions. 759*df3765bfSSheng unsigned Filter::usefulness() const { 760*df3765bfSSheng if (!VariableInstructions.empty()) 761*df3765bfSSheng return FilteredInstructions.size(); 762*df3765bfSSheng else 763*df3765bfSSheng return FilteredInstructions.size() + 1; 764*df3765bfSSheng } 765*df3765bfSSheng 766*df3765bfSSheng ////////////////////////////////// 767*df3765bfSSheng // // 768*df3765bfSSheng // Filterchooser Implementation // 769*df3765bfSSheng // // 770*df3765bfSSheng ////////////////////////////////// 771*df3765bfSSheng 772*df3765bfSSheng // Emit the decoder state machine table. 773*df3765bfSSheng void DecoderEmitter::emitTable(formatted_raw_ostream &OS, DecoderTable &Table, 774*df3765bfSSheng unsigned Indentation, unsigned BitWidth, 775*df3765bfSSheng StringRef Namespace) const { 776*df3765bfSSheng OS.indent(Indentation) << "static const uint8_t DecoderTable" << Namespace 777*df3765bfSSheng << BitWidth << "[] = {\n"; 778*df3765bfSSheng 779*df3765bfSSheng Indentation += 2; 780*df3765bfSSheng 781*df3765bfSSheng // FIXME: We may be able to use the NumToSkip values to recover 782*df3765bfSSheng // appropriate indentation levels. 783*df3765bfSSheng DecoderTable::const_iterator I = Table.begin(); 784*df3765bfSSheng DecoderTable::const_iterator E = Table.end(); 785*df3765bfSSheng while (I != E) { 786*df3765bfSSheng assert (I < E && "incomplete decode table entry!"); 787*df3765bfSSheng 788*df3765bfSSheng uint64_t Pos = I - Table.begin(); 789*df3765bfSSheng OS << "/* " << Pos << " */"; 790*df3765bfSSheng OS.PadToColumn(12); 791*df3765bfSSheng 792*df3765bfSSheng switch (*I) { 793*df3765bfSSheng default: 794*df3765bfSSheng PrintFatalError("invalid decode table opcode"); 795*df3765bfSSheng case MCD::OPC_ExtractField: { 796*df3765bfSSheng ++I; 797*df3765bfSSheng unsigned Start = *I++; 798*df3765bfSSheng unsigned Len = *I++; 799*df3765bfSSheng OS.indent(Indentation) << "MCD::OPC_ExtractField, " << Start << ", " 800*df3765bfSSheng << Len << ", // Inst{"; 801*df3765bfSSheng if (Len > 1) 802*df3765bfSSheng OS << (Start + Len - 1) << "-"; 803*df3765bfSSheng OS << Start << "} ...\n"; 804*df3765bfSSheng break; 805*df3765bfSSheng } 806*df3765bfSSheng case MCD::OPC_FilterValue: { 807*df3765bfSSheng ++I; 808*df3765bfSSheng OS.indent(Indentation) << "MCD::OPC_FilterValue, "; 809*df3765bfSSheng // The filter value is ULEB128 encoded. 810*df3765bfSSheng while (*I >= 128) 811*df3765bfSSheng OS << (unsigned)*I++ << ", "; 812*df3765bfSSheng OS << (unsigned)*I++ << ", "; 813*df3765bfSSheng 814*df3765bfSSheng // 24-bit numtoskip value. 815*df3765bfSSheng uint8_t Byte = *I++; 816*df3765bfSSheng uint32_t NumToSkip = Byte; 817*df3765bfSSheng OS << (unsigned)Byte << ", "; 818*df3765bfSSheng Byte = *I++; 819*df3765bfSSheng OS << (unsigned)Byte << ", "; 820*df3765bfSSheng NumToSkip |= Byte << 8; 821*df3765bfSSheng Byte = *I++; 822*df3765bfSSheng OS << utostr(Byte) << ", "; 823*df3765bfSSheng NumToSkip |= Byte << 16; 824*df3765bfSSheng OS << "// Skip to: " << ((I - Table.begin()) + NumToSkip) << "\n"; 825*df3765bfSSheng break; 826*df3765bfSSheng } 827*df3765bfSSheng case MCD::OPC_CheckField: { 828*df3765bfSSheng ++I; 829*df3765bfSSheng unsigned Start = *I++; 830*df3765bfSSheng unsigned Len = *I++; 831*df3765bfSSheng OS.indent(Indentation) << "MCD::OPC_CheckField, " << Start << ", " 832*df3765bfSSheng << Len << ", ";// << Val << ", " << NumToSkip << ",\n"; 833*df3765bfSSheng // ULEB128 encoded field value. 834*df3765bfSSheng for (; *I >= 128; ++I) 835*df3765bfSSheng OS << (unsigned)*I << ", "; 836*df3765bfSSheng OS << (unsigned)*I++ << ", "; 837*df3765bfSSheng // 24-bit numtoskip value. 838*df3765bfSSheng uint8_t Byte = *I++; 839*df3765bfSSheng uint32_t NumToSkip = Byte; 840*df3765bfSSheng OS << (unsigned)Byte << ", "; 841*df3765bfSSheng Byte = *I++; 842*df3765bfSSheng OS << (unsigned)Byte << ", "; 843*df3765bfSSheng NumToSkip |= Byte << 8; 844*df3765bfSSheng Byte = *I++; 845*df3765bfSSheng OS << utostr(Byte) << ", "; 846*df3765bfSSheng NumToSkip |= Byte << 16; 847*df3765bfSSheng OS << "// Skip to: " << ((I - Table.begin()) + NumToSkip) << "\n"; 848*df3765bfSSheng break; 849*df3765bfSSheng } 850*df3765bfSSheng case MCD::OPC_CheckPredicate: { 851*df3765bfSSheng ++I; 852*df3765bfSSheng OS.indent(Indentation) << "MCD::OPC_CheckPredicate, "; 853*df3765bfSSheng for (; *I >= 128; ++I) 854*df3765bfSSheng OS << (unsigned)*I << ", "; 855*df3765bfSSheng OS << (unsigned)*I++ << ", "; 856*df3765bfSSheng 857*df3765bfSSheng // 24-bit numtoskip value. 858*df3765bfSSheng uint8_t Byte = *I++; 859*df3765bfSSheng uint32_t NumToSkip = Byte; 860*df3765bfSSheng OS << (unsigned)Byte << ", "; 861*df3765bfSSheng Byte = *I++; 862*df3765bfSSheng OS << (unsigned)Byte << ", "; 863*df3765bfSSheng NumToSkip |= Byte << 8; 864*df3765bfSSheng Byte = *I++; 865*df3765bfSSheng OS << utostr(Byte) << ", "; 866*df3765bfSSheng NumToSkip |= Byte << 16; 867*df3765bfSSheng OS << "// Skip to: " << ((I - Table.begin()) + NumToSkip) << "\n"; 868*df3765bfSSheng break; 869*df3765bfSSheng } 870*df3765bfSSheng case MCD::OPC_Decode: 871*df3765bfSSheng case MCD::OPC_TryDecode: { 872*df3765bfSSheng bool IsTry = *I == MCD::OPC_TryDecode; 873*df3765bfSSheng ++I; 874*df3765bfSSheng // Extract the ULEB128 encoded Opcode to a buffer. 875*df3765bfSSheng uint8_t Buffer[16], *p = Buffer; 876*df3765bfSSheng while ((*p++ = *I++) >= 128) 877*df3765bfSSheng assert((p - Buffer) <= (ptrdiff_t)sizeof(Buffer) 878*df3765bfSSheng && "ULEB128 value too large!"); 879*df3765bfSSheng // Decode the Opcode value. 880*df3765bfSSheng unsigned Opc = decodeULEB128(Buffer); 881*df3765bfSSheng OS.indent(Indentation) << "MCD::OPC_" << (IsTry ? "Try" : "") 882*df3765bfSSheng << "Decode, "; 883*df3765bfSSheng for (p = Buffer; *p >= 128; ++p) 884*df3765bfSSheng OS << (unsigned)*p << ", "; 885*df3765bfSSheng OS << (unsigned)*p << ", "; 886*df3765bfSSheng 887*df3765bfSSheng // Decoder index. 888*df3765bfSSheng for (; *I >= 128; ++I) 889*df3765bfSSheng OS << (unsigned)*I << ", "; 890*df3765bfSSheng OS << (unsigned)*I++ << ", "; 891*df3765bfSSheng 892*df3765bfSSheng if (!IsTry) { 893*df3765bfSSheng OS << "// Opcode: " << NumberedEncodings[Opc] << "\n"; 894*df3765bfSSheng break; 895*df3765bfSSheng } 896*df3765bfSSheng 897*df3765bfSSheng // Fallthrough for OPC_TryDecode. 898*df3765bfSSheng 899*df3765bfSSheng // 24-bit numtoskip value. 900*df3765bfSSheng uint8_t Byte = *I++; 901*df3765bfSSheng uint32_t NumToSkip = Byte; 902*df3765bfSSheng OS << (unsigned)Byte << ", "; 903*df3765bfSSheng Byte = *I++; 904*df3765bfSSheng OS << (unsigned)Byte << ", "; 905*df3765bfSSheng NumToSkip |= Byte << 8; 906*df3765bfSSheng Byte = *I++; 907*df3765bfSSheng OS << utostr(Byte) << ", "; 908*df3765bfSSheng NumToSkip |= Byte << 16; 909*df3765bfSSheng 910*df3765bfSSheng OS << "// Opcode: " << NumberedEncodings[Opc] 911*df3765bfSSheng << ", skip to: " << ((I - Table.begin()) + NumToSkip) << "\n"; 912*df3765bfSSheng break; 913*df3765bfSSheng } 914*df3765bfSSheng case MCD::OPC_SoftFail: { 915*df3765bfSSheng ++I; 916*df3765bfSSheng OS.indent(Indentation) << "MCD::OPC_SoftFail"; 917*df3765bfSSheng // Positive mask 918*df3765bfSSheng uint64_t Value = 0; 919*df3765bfSSheng unsigned Shift = 0; 920*df3765bfSSheng do { 921*df3765bfSSheng OS << ", " << (unsigned)*I; 922*df3765bfSSheng Value += (*I & 0x7f) << Shift; 923*df3765bfSSheng Shift += 7; 924*df3765bfSSheng } while (*I++ >= 128); 925*df3765bfSSheng if (Value > 127) { 926*df3765bfSSheng OS << " /* 0x"; 927*df3765bfSSheng OS.write_hex(Value); 928*df3765bfSSheng OS << " */"; 929*df3765bfSSheng } 930*df3765bfSSheng // Negative mask 931*df3765bfSSheng Value = 0; 932*df3765bfSSheng Shift = 0; 933*df3765bfSSheng do { 934*df3765bfSSheng OS << ", " << (unsigned)*I; 935*df3765bfSSheng Value += (*I & 0x7f) << Shift; 936*df3765bfSSheng Shift += 7; 937*df3765bfSSheng } while (*I++ >= 128); 938*df3765bfSSheng if (Value > 127) { 939*df3765bfSSheng OS << " /* 0x"; 940*df3765bfSSheng OS.write_hex(Value); 941*df3765bfSSheng OS << " */"; 942*df3765bfSSheng } 943*df3765bfSSheng OS << ",\n"; 944*df3765bfSSheng break; 945*df3765bfSSheng } 946*df3765bfSSheng case MCD::OPC_Fail: { 947*df3765bfSSheng ++I; 948*df3765bfSSheng OS.indent(Indentation) << "MCD::OPC_Fail,\n"; 949*df3765bfSSheng break; 950*df3765bfSSheng } 951*df3765bfSSheng } 952*df3765bfSSheng } 953*df3765bfSSheng OS.indent(Indentation) << "0\n"; 954*df3765bfSSheng 955*df3765bfSSheng Indentation -= 2; 956*df3765bfSSheng 957*df3765bfSSheng OS.indent(Indentation) << "};\n\n"; 958*df3765bfSSheng } 959*df3765bfSSheng 960*df3765bfSSheng void DecoderEmitter::emitInstrLenTable(formatted_raw_ostream &OS, 961*df3765bfSSheng std::vector<unsigned> &InstrLen) const { 962*df3765bfSSheng OS << "static const uint8_t InstrLenTable[] = {\n"; 963*df3765bfSSheng for (unsigned &Len : InstrLen) { 964*df3765bfSSheng OS << Len << ",\n"; 965*df3765bfSSheng } 966*df3765bfSSheng OS << "};\n\n"; 967*df3765bfSSheng } 968*df3765bfSSheng 969*df3765bfSSheng void DecoderEmitter::emitPredicateFunction(formatted_raw_ostream &OS, 970*df3765bfSSheng PredicateSet &Predicates, 971*df3765bfSSheng unsigned Indentation) const { 972*df3765bfSSheng // The predicate function is just a big switch statement based on the 973*df3765bfSSheng // input predicate index. 974*df3765bfSSheng OS.indent(Indentation) << "static bool checkDecoderPredicate(unsigned Idx, " 975*df3765bfSSheng << "const FeatureBitset &Bits) {\n"; 976*df3765bfSSheng Indentation += 2; 977*df3765bfSSheng if (!Predicates.empty()) { 978*df3765bfSSheng OS.indent(Indentation) << "switch (Idx) {\n"; 979*df3765bfSSheng OS.indent(Indentation) << "default: llvm_unreachable(\"Invalid index!\");\n"; 980*df3765bfSSheng unsigned Index = 0; 981*df3765bfSSheng for (const auto &Predicate : Predicates) { 982*df3765bfSSheng OS.indent(Indentation) << "case " << Index++ << ":\n"; 983*df3765bfSSheng OS.indent(Indentation+2) << "return (" << Predicate << ");\n"; 984*df3765bfSSheng } 985*df3765bfSSheng OS.indent(Indentation) << "}\n"; 986*df3765bfSSheng } else { 987*df3765bfSSheng // No case statement to emit 988*df3765bfSSheng OS.indent(Indentation) << "llvm_unreachable(\"Invalid index!\");\n"; 989*df3765bfSSheng } 990*df3765bfSSheng Indentation -= 2; 991*df3765bfSSheng OS.indent(Indentation) << "}\n\n"; 992*df3765bfSSheng } 993*df3765bfSSheng 994*df3765bfSSheng void DecoderEmitter::emitDecoderFunction(formatted_raw_ostream &OS, 995*df3765bfSSheng DecoderSet &Decoders, 996*df3765bfSSheng unsigned Indentation) const { 997*df3765bfSSheng // The decoder function is just a big switch statement based on the 998*df3765bfSSheng // input decoder index. 999*df3765bfSSheng OS.indent(Indentation) << "template <typename InsnType>\n"; 1000*df3765bfSSheng OS.indent(Indentation) << "static DecodeStatus decodeToMCInst(DecodeStatus S," 1001*df3765bfSSheng << " unsigned Idx, InsnType insn, MCInst &MI,\n"; 1002*df3765bfSSheng OS.indent(Indentation) 1003*df3765bfSSheng << " uint64_t " 1004*df3765bfSSheng << "Address, const MCDisassembler *Decoder, bool &DecodeComplete) {\n"; 1005*df3765bfSSheng Indentation += 2; 1006*df3765bfSSheng OS.indent(Indentation) << "DecodeComplete = true;\n"; 1007*df3765bfSSheng // TODO: When InsnType is large, using uint64_t limits all fields to 64 bits 1008*df3765bfSSheng // It would be better for emitBinaryParser to use a 64-bit tmp whenever 1009*df3765bfSSheng // possible but fall back to an InsnType-sized tmp for truly large fields. 1010*df3765bfSSheng OS.indent(Indentation) << "using TmpType = " 1011*df3765bfSSheng "std::conditional_t<std::is_integral<InsnType>::" 1012*df3765bfSSheng "value, InsnType, uint64_t>;\n"; 1013*df3765bfSSheng OS.indent(Indentation) << "TmpType tmp;\n"; 1014*df3765bfSSheng OS.indent(Indentation) << "switch (Idx) {\n"; 1015*df3765bfSSheng OS.indent(Indentation) << "default: llvm_unreachable(\"Invalid index!\");\n"; 1016*df3765bfSSheng unsigned Index = 0; 1017*df3765bfSSheng for (const auto &Decoder : Decoders) { 1018*df3765bfSSheng OS.indent(Indentation) << "case " << Index++ << ":\n"; 1019*df3765bfSSheng OS << Decoder; 1020*df3765bfSSheng OS.indent(Indentation+2) << "return S;\n"; 1021*df3765bfSSheng } 1022*df3765bfSSheng OS.indent(Indentation) << "}\n"; 1023*df3765bfSSheng Indentation -= 2; 1024*df3765bfSSheng OS.indent(Indentation) << "}\n\n"; 1025*df3765bfSSheng } 1026*df3765bfSSheng 1027*df3765bfSSheng // Populates the field of the insn given the start position and the number of 1028*df3765bfSSheng // consecutive bits to scan for. 1029*df3765bfSSheng // 1030*df3765bfSSheng // Returns false if and on the first uninitialized bit value encountered. 1031*df3765bfSSheng // Returns true, otherwise. 1032*df3765bfSSheng bool FilterChooser::fieldFromInsn(uint64_t &Field, insn_t &Insn, 1033*df3765bfSSheng unsigned StartBit, unsigned NumBits) const { 1034*df3765bfSSheng Field = 0; 1035*df3765bfSSheng 1036*df3765bfSSheng for (unsigned i = 0; i < NumBits; ++i) { 1037*df3765bfSSheng if (Insn[StartBit + i] == BIT_UNSET) 1038*df3765bfSSheng return false; 1039*df3765bfSSheng 1040*df3765bfSSheng if (Insn[StartBit + i] == BIT_TRUE) 1041*df3765bfSSheng Field = Field | (1ULL << i); 1042*df3765bfSSheng } 1043*df3765bfSSheng 1044*df3765bfSSheng return true; 1045*df3765bfSSheng } 1046*df3765bfSSheng 1047*df3765bfSSheng /// dumpFilterArray - dumpFilterArray prints out debugging info for the given 1048*df3765bfSSheng /// filter array as a series of chars. 1049*df3765bfSSheng void FilterChooser::dumpFilterArray(raw_ostream &o, 1050*df3765bfSSheng const std::vector<bit_value_t> &filter) const { 1051*df3765bfSSheng for (unsigned bitIndex = BitWidth; bitIndex > 0; bitIndex--) { 1052*df3765bfSSheng switch (filter[bitIndex - 1]) { 1053*df3765bfSSheng case BIT_UNFILTERED: 1054*df3765bfSSheng o << "."; 1055*df3765bfSSheng break; 1056*df3765bfSSheng case BIT_UNSET: 1057*df3765bfSSheng o << "_"; 1058*df3765bfSSheng break; 1059*df3765bfSSheng case BIT_TRUE: 1060*df3765bfSSheng o << "1"; 1061*df3765bfSSheng break; 1062*df3765bfSSheng case BIT_FALSE: 1063*df3765bfSSheng o << "0"; 1064*df3765bfSSheng break; 1065*df3765bfSSheng } 1066*df3765bfSSheng } 1067*df3765bfSSheng } 1068*df3765bfSSheng 1069*df3765bfSSheng /// dumpStack - dumpStack traverses the filter chooser chain and calls 1070*df3765bfSSheng /// dumpFilterArray on each filter chooser up to the top level one. 1071*df3765bfSSheng void FilterChooser::dumpStack(raw_ostream &o, const char *prefix) const { 1072*df3765bfSSheng const FilterChooser *current = this; 1073*df3765bfSSheng 1074*df3765bfSSheng while (current) { 1075*df3765bfSSheng o << prefix; 1076*df3765bfSSheng dumpFilterArray(o, current->FilterBitValues); 1077*df3765bfSSheng o << '\n'; 1078*df3765bfSSheng current = current->Parent; 1079*df3765bfSSheng } 1080*df3765bfSSheng } 1081*df3765bfSSheng 1082*df3765bfSSheng // Calculates the island(s) needed to decode the instruction. 1083*df3765bfSSheng // This returns a list of undecoded bits of an instructions, for example, 1084*df3765bfSSheng // Inst{20} = 1 && Inst{3-0} == 0b1111 represents two islands of yet-to-be 1085*df3765bfSSheng // decoded bits in order to verify that the instruction matches the Opcode. 1086*df3765bfSSheng unsigned FilterChooser::getIslands(std::vector<unsigned> &StartBits, 1087*df3765bfSSheng std::vector<unsigned> &EndBits, 1088*df3765bfSSheng std::vector<uint64_t> &FieldVals, 1089*df3765bfSSheng const insn_t &Insn) const { 1090*df3765bfSSheng unsigned Num, BitNo; 1091*df3765bfSSheng Num = BitNo = 0; 1092*df3765bfSSheng 1093*df3765bfSSheng uint64_t FieldVal = 0; 1094*df3765bfSSheng 1095*df3765bfSSheng // 0: Init 1096*df3765bfSSheng // 1: Water (the bit value does not affect decoding) 1097*df3765bfSSheng // 2: Island (well-known bit value needed for decoding) 1098*df3765bfSSheng int State = 0; 1099*df3765bfSSheng 1100*df3765bfSSheng for (unsigned i = 0; i < BitWidth; ++i) { 1101*df3765bfSSheng int64_t Val = Value(Insn[i]); 1102*df3765bfSSheng bool Filtered = PositionFiltered(i); 1103*df3765bfSSheng switch (State) { 1104*df3765bfSSheng default: llvm_unreachable("Unreachable code!"); 1105*df3765bfSSheng case 0: 1106*df3765bfSSheng case 1: 1107*df3765bfSSheng if (Filtered || Val == -1) 1108*df3765bfSSheng State = 1; // Still in Water 1109*df3765bfSSheng else { 1110*df3765bfSSheng State = 2; // Into the Island 1111*df3765bfSSheng BitNo = 0; 1112*df3765bfSSheng StartBits.push_back(i); 1113*df3765bfSSheng FieldVal = Val; 1114*df3765bfSSheng } 1115*df3765bfSSheng break; 1116*df3765bfSSheng case 2: 1117*df3765bfSSheng if (Filtered || Val == -1) { 1118*df3765bfSSheng State = 1; // Into the Water 1119*df3765bfSSheng EndBits.push_back(i - 1); 1120*df3765bfSSheng FieldVals.push_back(FieldVal); 1121*df3765bfSSheng ++Num; 1122*df3765bfSSheng } else { 1123*df3765bfSSheng State = 2; // Still in Island 1124*df3765bfSSheng ++BitNo; 1125*df3765bfSSheng FieldVal = FieldVal | Val << BitNo; 1126*df3765bfSSheng } 1127*df3765bfSSheng break; 1128*df3765bfSSheng } 1129*df3765bfSSheng } 1130*df3765bfSSheng // If we are still in Island after the loop, do some housekeeping. 1131*df3765bfSSheng if (State == 2) { 1132*df3765bfSSheng EndBits.push_back(BitWidth - 1); 1133*df3765bfSSheng FieldVals.push_back(FieldVal); 1134*df3765bfSSheng ++Num; 1135*df3765bfSSheng } 1136*df3765bfSSheng 1137*df3765bfSSheng assert(StartBits.size() == Num && EndBits.size() == Num && 1138*df3765bfSSheng FieldVals.size() == Num); 1139*df3765bfSSheng return Num; 1140*df3765bfSSheng } 1141*df3765bfSSheng 1142*df3765bfSSheng void FilterChooser::emitBinaryParser(raw_ostream &o, unsigned &Indentation, 1143*df3765bfSSheng const OperandInfo &OpInfo, 1144*df3765bfSSheng bool &OpHasCompleteDecoder) const { 1145*df3765bfSSheng const std::string &Decoder = OpInfo.Decoder; 1146*df3765bfSSheng 1147*df3765bfSSheng bool UseInsertBits = OpInfo.numFields() != 1 || OpInfo.InitValue != 0; 1148*df3765bfSSheng 1149*df3765bfSSheng if (UseInsertBits) { 1150*df3765bfSSheng o.indent(Indentation) << "tmp = 0x"; 1151*df3765bfSSheng o.write_hex(OpInfo.InitValue); 1152*df3765bfSSheng o << ";\n"; 1153*df3765bfSSheng } 1154*df3765bfSSheng 1155*df3765bfSSheng for (const EncodingField &EF : OpInfo) { 1156*df3765bfSSheng o.indent(Indentation); 1157*df3765bfSSheng if (UseInsertBits) 1158*df3765bfSSheng o << "insertBits(tmp, "; 1159*df3765bfSSheng else 1160*df3765bfSSheng o << "tmp = "; 1161*df3765bfSSheng o << "fieldFromInstruction(insn, " << EF.Base << ", " << EF.Width << ')'; 1162*df3765bfSSheng if (UseInsertBits) 1163*df3765bfSSheng o << ", " << EF.Offset << ", " << EF.Width << ')'; 1164*df3765bfSSheng else if (EF.Offset != 0) 1165*df3765bfSSheng o << " << " << EF.Offset; 1166*df3765bfSSheng o << ";\n"; 1167*df3765bfSSheng } 1168*df3765bfSSheng 1169*df3765bfSSheng if (Decoder != "") { 1170*df3765bfSSheng OpHasCompleteDecoder = OpInfo.HasCompleteDecoder; 1171*df3765bfSSheng o.indent(Indentation) << Emitter->GuardPrefix << Decoder 1172*df3765bfSSheng << "(MI, tmp, Address, Decoder)" 1173*df3765bfSSheng << Emitter->GuardPostfix 1174*df3765bfSSheng << " { " << (OpHasCompleteDecoder ? "" : "DecodeComplete = false; ") 1175*df3765bfSSheng << "return MCDisassembler::Fail; }\n"; 1176*df3765bfSSheng } else { 1177*df3765bfSSheng OpHasCompleteDecoder = true; 1178*df3765bfSSheng o.indent(Indentation) << "MI.addOperand(MCOperand::createImm(tmp));\n"; 1179*df3765bfSSheng } 1180*df3765bfSSheng } 1181*df3765bfSSheng 1182*df3765bfSSheng void FilterChooser::emitDecoder(raw_ostream &OS, unsigned Indentation, 1183*df3765bfSSheng unsigned Opc, bool &HasCompleteDecoder) const { 1184*df3765bfSSheng HasCompleteDecoder = true; 1185*df3765bfSSheng 1186*df3765bfSSheng for (const auto &Op : Operands.find(Opc)->second) { 1187*df3765bfSSheng // If a custom instruction decoder was specified, use that. 1188*df3765bfSSheng if (Op.numFields() == 0 && !Op.Decoder.empty()) { 1189*df3765bfSSheng HasCompleteDecoder = Op.HasCompleteDecoder; 1190*df3765bfSSheng OS.indent(Indentation) << Emitter->GuardPrefix << Op.Decoder 1191*df3765bfSSheng << "(MI, insn, Address, Decoder)" 1192*df3765bfSSheng << Emitter->GuardPostfix 1193*df3765bfSSheng << " { " << (HasCompleteDecoder ? "" : "DecodeComplete = false; ") 1194*df3765bfSSheng << "return MCDisassembler::Fail; }\n"; 1195*df3765bfSSheng break; 1196*df3765bfSSheng } 1197*df3765bfSSheng 1198*df3765bfSSheng bool OpHasCompleteDecoder; 1199*df3765bfSSheng emitBinaryParser(OS, Indentation, Op, OpHasCompleteDecoder); 1200*df3765bfSSheng if (!OpHasCompleteDecoder) 1201*df3765bfSSheng HasCompleteDecoder = false; 1202*df3765bfSSheng } 1203*df3765bfSSheng } 1204*df3765bfSSheng 1205*df3765bfSSheng unsigned FilterChooser::getDecoderIndex(DecoderSet &Decoders, 1206*df3765bfSSheng unsigned Opc, 1207*df3765bfSSheng bool &HasCompleteDecoder) const { 1208*df3765bfSSheng // Build up the predicate string. 1209*df3765bfSSheng SmallString<256> Decoder; 1210*df3765bfSSheng // FIXME: emitDecoder() function can take a buffer directly rather than 1211*df3765bfSSheng // a stream. 1212*df3765bfSSheng raw_svector_ostream S(Decoder); 1213*df3765bfSSheng unsigned I = 4; 1214*df3765bfSSheng emitDecoder(S, I, Opc, HasCompleteDecoder); 1215*df3765bfSSheng 1216*df3765bfSSheng // Using the full decoder string as the key value here is a bit 1217*df3765bfSSheng // heavyweight, but is effective. If the string comparisons become a 1218*df3765bfSSheng // performance concern, we can implement a mangling of the predicate 1219*df3765bfSSheng // data easily enough with a map back to the actual string. That's 1220*df3765bfSSheng // overkill for now, though. 1221*df3765bfSSheng 1222*df3765bfSSheng // Make sure the predicate is in the table. 1223*df3765bfSSheng Decoders.insert(CachedHashString(Decoder)); 1224*df3765bfSSheng // Now figure out the index for when we write out the table. 1225*df3765bfSSheng DecoderSet::const_iterator P = find(Decoders, Decoder.str()); 1226*df3765bfSSheng return (unsigned)(P - Decoders.begin()); 1227*df3765bfSSheng } 1228*df3765bfSSheng 1229*df3765bfSSheng bool FilterChooser::emitPredicateMatch(raw_ostream &o, unsigned &Indentation, 1230*df3765bfSSheng unsigned Opc) const { 1231*df3765bfSSheng ListInit *Predicates = 1232*df3765bfSSheng AllInstructions[Opc].EncodingDef->getValueAsListInit("Predicates"); 1233*df3765bfSSheng bool IsFirstEmission = true; 1234*df3765bfSSheng for (unsigned i = 0; i < Predicates->size(); ++i) { 1235*df3765bfSSheng Record *Pred = Predicates->getElementAsRecord(i); 1236*df3765bfSSheng if (!Pred->getValue("AssemblerMatcherPredicate")) 1237*df3765bfSSheng continue; 1238*df3765bfSSheng 1239*df3765bfSSheng if (!isa<DagInit>(Pred->getValue("AssemblerCondDag")->getValue())) 1240*df3765bfSSheng continue; 1241*df3765bfSSheng 1242*df3765bfSSheng const DagInit *D = Pred->getValueAsDag("AssemblerCondDag"); 1243*df3765bfSSheng std::string CombineType = D->getOperator()->getAsString(); 1244*df3765bfSSheng if (CombineType != "any_of" && CombineType != "all_of") 1245*df3765bfSSheng PrintFatalError(Pred->getLoc(), "Invalid AssemblerCondDag!"); 1246*df3765bfSSheng if (D->getNumArgs() == 0) 1247*df3765bfSSheng PrintFatalError(Pred->getLoc(), "Invalid AssemblerCondDag!"); 1248*df3765bfSSheng bool IsOr = CombineType == "any_of"; 1249*df3765bfSSheng 1250*df3765bfSSheng if (!IsFirstEmission) 1251*df3765bfSSheng o << " && "; 1252*df3765bfSSheng 1253*df3765bfSSheng if (IsOr) 1254*df3765bfSSheng o << "("; 1255*df3765bfSSheng 1256*df3765bfSSheng ListSeparator LS(IsOr ? " || " : " && "); 1257*df3765bfSSheng for (auto *Arg : D->getArgs()) { 1258*df3765bfSSheng o << LS; 1259*df3765bfSSheng if (auto *NotArg = dyn_cast<DagInit>(Arg)) { 1260*df3765bfSSheng if (NotArg->getOperator()->getAsString() != "not" || 1261*df3765bfSSheng NotArg->getNumArgs() != 1) 1262*df3765bfSSheng PrintFatalError(Pred->getLoc(), "Invalid AssemblerCondDag!"); 1263*df3765bfSSheng Arg = NotArg->getArg(0); 1264*df3765bfSSheng o << "!"; 1265*df3765bfSSheng } 1266*df3765bfSSheng if (!isa<DefInit>(Arg) || 1267*df3765bfSSheng !cast<DefInit>(Arg)->getDef()->isSubClassOf("SubtargetFeature")) 1268*df3765bfSSheng PrintFatalError(Pred->getLoc(), "Invalid AssemblerCondDag!"); 1269*df3765bfSSheng o << "Bits[" << Emitter->PredicateNamespace << "::" << Arg->getAsString() 1270*df3765bfSSheng << "]"; 1271*df3765bfSSheng } 1272*df3765bfSSheng 1273*df3765bfSSheng if (IsOr) 1274*df3765bfSSheng o << ")"; 1275*df3765bfSSheng 1276*df3765bfSSheng IsFirstEmission = false; 1277*df3765bfSSheng } 1278*df3765bfSSheng return !Predicates->empty(); 1279*df3765bfSSheng } 1280*df3765bfSSheng 1281*df3765bfSSheng bool FilterChooser::doesOpcodeNeedPredicate(unsigned Opc) const { 1282*df3765bfSSheng ListInit *Predicates = 1283*df3765bfSSheng AllInstructions[Opc].EncodingDef->getValueAsListInit("Predicates"); 1284*df3765bfSSheng for (unsigned i = 0; i < Predicates->size(); ++i) { 1285*df3765bfSSheng Record *Pred = Predicates->getElementAsRecord(i); 1286*df3765bfSSheng if (!Pred->getValue("AssemblerMatcherPredicate")) 1287*df3765bfSSheng continue; 1288*df3765bfSSheng 1289*df3765bfSSheng if (isa<DagInit>(Pred->getValue("AssemblerCondDag")->getValue())) 1290*df3765bfSSheng return true; 1291*df3765bfSSheng } 1292*df3765bfSSheng return false; 1293*df3765bfSSheng } 1294*df3765bfSSheng 1295*df3765bfSSheng unsigned FilterChooser::getPredicateIndex(DecoderTableInfo &TableInfo, 1296*df3765bfSSheng StringRef Predicate) const { 1297*df3765bfSSheng // Using the full predicate string as the key value here is a bit 1298*df3765bfSSheng // heavyweight, but is effective. If the string comparisons become a 1299*df3765bfSSheng // performance concern, we can implement a mangling of the predicate 1300*df3765bfSSheng // data easily enough with a map back to the actual string. That's 1301*df3765bfSSheng // overkill for now, though. 1302*df3765bfSSheng 1303*df3765bfSSheng // Make sure the predicate is in the table. 1304*df3765bfSSheng TableInfo.Predicates.insert(CachedHashString(Predicate)); 1305*df3765bfSSheng // Now figure out the index for when we write out the table. 1306*df3765bfSSheng PredicateSet::const_iterator P = find(TableInfo.Predicates, Predicate); 1307*df3765bfSSheng return (unsigned)(P - TableInfo.Predicates.begin()); 1308*df3765bfSSheng } 1309*df3765bfSSheng 1310*df3765bfSSheng void FilterChooser::emitPredicateTableEntry(DecoderTableInfo &TableInfo, 1311*df3765bfSSheng unsigned Opc) const { 1312*df3765bfSSheng if (!doesOpcodeNeedPredicate(Opc)) 1313*df3765bfSSheng return; 1314*df3765bfSSheng 1315*df3765bfSSheng // Build up the predicate string. 1316*df3765bfSSheng SmallString<256> Predicate; 1317*df3765bfSSheng // FIXME: emitPredicateMatch() functions can take a buffer directly rather 1318*df3765bfSSheng // than a stream. 1319*df3765bfSSheng raw_svector_ostream PS(Predicate); 1320*df3765bfSSheng unsigned I = 0; 1321*df3765bfSSheng emitPredicateMatch(PS, I, Opc); 1322*df3765bfSSheng 1323*df3765bfSSheng // Figure out the index into the predicate table for the predicate just 1324*df3765bfSSheng // computed. 1325*df3765bfSSheng unsigned PIdx = getPredicateIndex(TableInfo, PS.str()); 1326*df3765bfSSheng SmallString<16> PBytes; 1327*df3765bfSSheng raw_svector_ostream S(PBytes); 1328*df3765bfSSheng encodeULEB128(PIdx, S); 1329*df3765bfSSheng 1330*df3765bfSSheng TableInfo.Table.push_back(MCD::OPC_CheckPredicate); 1331*df3765bfSSheng // Predicate index 1332*df3765bfSSheng for (unsigned i = 0, e = PBytes.size(); i != e; ++i) 1333*df3765bfSSheng TableInfo.Table.push_back(PBytes[i]); 1334*df3765bfSSheng // Push location for NumToSkip backpatching. 1335*df3765bfSSheng TableInfo.FixupStack.back().push_back(TableInfo.Table.size()); 1336*df3765bfSSheng TableInfo.Table.push_back(0); 1337*df3765bfSSheng TableInfo.Table.push_back(0); 1338*df3765bfSSheng TableInfo.Table.push_back(0); 1339*df3765bfSSheng } 1340*df3765bfSSheng 1341*df3765bfSSheng void FilterChooser::emitSoftFailTableEntry(DecoderTableInfo &TableInfo, 1342*df3765bfSSheng unsigned Opc) const { 1343*df3765bfSSheng const RecordVal *RV = AllInstructions[Opc].EncodingDef->getValue("SoftFail"); 1344*df3765bfSSheng BitsInit *SFBits = RV ? dyn_cast<BitsInit>(RV->getValue()) : nullptr; 1345*df3765bfSSheng 1346*df3765bfSSheng if (!SFBits) return; 1347*df3765bfSSheng BitsInit *InstBits = 1348*df3765bfSSheng AllInstructions[Opc].EncodingDef->getValueAsBitsInit("Inst"); 1349*df3765bfSSheng 1350*df3765bfSSheng APInt PositiveMask(BitWidth, 0ULL); 1351*df3765bfSSheng APInt NegativeMask(BitWidth, 0ULL); 1352*df3765bfSSheng for (unsigned i = 0; i < BitWidth; ++i) { 1353*df3765bfSSheng bit_value_t B = bitFromBits(*SFBits, i); 1354*df3765bfSSheng bit_value_t IB = bitFromBits(*InstBits, i); 1355*df3765bfSSheng 1356*df3765bfSSheng if (B != BIT_TRUE) continue; 1357*df3765bfSSheng 1358*df3765bfSSheng switch (IB) { 1359*df3765bfSSheng case BIT_FALSE: 1360*df3765bfSSheng // The bit is meant to be false, so emit a check to see if it is true. 1361*df3765bfSSheng PositiveMask.setBit(i); 1362*df3765bfSSheng break; 1363*df3765bfSSheng case BIT_TRUE: 1364*df3765bfSSheng // The bit is meant to be true, so emit a check to see if it is false. 1365*df3765bfSSheng NegativeMask.setBit(i); 1366*df3765bfSSheng break; 1367*df3765bfSSheng default: 1368*df3765bfSSheng // The bit is not set; this must be an error! 1369*df3765bfSSheng errs() << "SoftFail Conflict: bit SoftFail{" << i << "} in " 1370*df3765bfSSheng << AllInstructions[Opc] << " is set but Inst{" << i 1371*df3765bfSSheng << "} is unset!\n" 1372*df3765bfSSheng << " - You can only mark a bit as SoftFail if it is fully defined" 1373*df3765bfSSheng << " (1/0 - not '?') in Inst\n"; 1374*df3765bfSSheng return; 1375*df3765bfSSheng } 1376*df3765bfSSheng } 1377*df3765bfSSheng 1378*df3765bfSSheng bool NeedPositiveMask = PositiveMask.getBoolValue(); 1379*df3765bfSSheng bool NeedNegativeMask = NegativeMask.getBoolValue(); 1380*df3765bfSSheng 1381*df3765bfSSheng if (!NeedPositiveMask && !NeedNegativeMask) 1382*df3765bfSSheng return; 1383*df3765bfSSheng 1384*df3765bfSSheng TableInfo.Table.push_back(MCD::OPC_SoftFail); 1385*df3765bfSSheng 1386*df3765bfSSheng SmallString<16> MaskBytes; 1387*df3765bfSSheng raw_svector_ostream S(MaskBytes); 1388*df3765bfSSheng if (NeedPositiveMask) { 1389*df3765bfSSheng encodeULEB128(PositiveMask.getZExtValue(), S); 1390*df3765bfSSheng for (unsigned i = 0, e = MaskBytes.size(); i != e; ++i) 1391*df3765bfSSheng TableInfo.Table.push_back(MaskBytes[i]); 1392*df3765bfSSheng } else 1393*df3765bfSSheng TableInfo.Table.push_back(0); 1394*df3765bfSSheng if (NeedNegativeMask) { 1395*df3765bfSSheng MaskBytes.clear(); 1396*df3765bfSSheng encodeULEB128(NegativeMask.getZExtValue(), S); 1397*df3765bfSSheng for (unsigned i = 0, e = MaskBytes.size(); i != e; ++i) 1398*df3765bfSSheng TableInfo.Table.push_back(MaskBytes[i]); 1399*df3765bfSSheng } else 1400*df3765bfSSheng TableInfo.Table.push_back(0); 1401*df3765bfSSheng } 1402*df3765bfSSheng 1403*df3765bfSSheng // Emits table entries to decode the singleton. 1404*df3765bfSSheng void FilterChooser::emitSingletonTableEntry(DecoderTableInfo &TableInfo, 1405*df3765bfSSheng EncodingIDAndOpcode Opc) const { 1406*df3765bfSSheng std::vector<unsigned> StartBits; 1407*df3765bfSSheng std::vector<unsigned> EndBits; 1408*df3765bfSSheng std::vector<uint64_t> FieldVals; 1409*df3765bfSSheng insn_t Insn; 1410*df3765bfSSheng insnWithID(Insn, Opc.EncodingID); 1411*df3765bfSSheng 1412*df3765bfSSheng // Look for islands of undecoded bits of the singleton. 1413*df3765bfSSheng getIslands(StartBits, EndBits, FieldVals, Insn); 1414*df3765bfSSheng 1415*df3765bfSSheng unsigned Size = StartBits.size(); 1416*df3765bfSSheng 1417*df3765bfSSheng // Emit the predicate table entry if one is needed. 1418*df3765bfSSheng emitPredicateTableEntry(TableInfo, Opc.EncodingID); 1419*df3765bfSSheng 1420*df3765bfSSheng // Check any additional encoding fields needed. 1421*df3765bfSSheng for (unsigned I = Size; I != 0; --I) { 1422*df3765bfSSheng unsigned NumBits = EndBits[I-1] - StartBits[I-1] + 1; 1423*df3765bfSSheng TableInfo.Table.push_back(MCD::OPC_CheckField); 1424*df3765bfSSheng TableInfo.Table.push_back(StartBits[I-1]); 1425*df3765bfSSheng TableInfo.Table.push_back(NumBits); 1426*df3765bfSSheng uint8_t Buffer[16], *p; 1427*df3765bfSSheng encodeULEB128(FieldVals[I-1], Buffer); 1428*df3765bfSSheng for (p = Buffer; *p >= 128 ; ++p) 1429*df3765bfSSheng TableInfo.Table.push_back(*p); 1430*df3765bfSSheng TableInfo.Table.push_back(*p); 1431*df3765bfSSheng // Push location for NumToSkip backpatching. 1432*df3765bfSSheng TableInfo.FixupStack.back().push_back(TableInfo.Table.size()); 1433*df3765bfSSheng // The fixup is always 24-bits, so go ahead and allocate the space 1434*df3765bfSSheng // in the table so all our relative position calculations work OK even 1435*df3765bfSSheng // before we fully resolve the real value here. 1436*df3765bfSSheng TableInfo.Table.push_back(0); 1437*df3765bfSSheng TableInfo.Table.push_back(0); 1438*df3765bfSSheng TableInfo.Table.push_back(0); 1439*df3765bfSSheng } 1440*df3765bfSSheng 1441*df3765bfSSheng // Check for soft failure of the match. 1442*df3765bfSSheng emitSoftFailTableEntry(TableInfo, Opc.EncodingID); 1443*df3765bfSSheng 1444*df3765bfSSheng bool HasCompleteDecoder; 1445*df3765bfSSheng unsigned DIdx = 1446*df3765bfSSheng getDecoderIndex(TableInfo.Decoders, Opc.EncodingID, HasCompleteDecoder); 1447*df3765bfSSheng 1448*df3765bfSSheng // Produce OPC_Decode or OPC_TryDecode opcode based on the information 1449*df3765bfSSheng // whether the instruction decoder is complete or not. If it is complete 1450*df3765bfSSheng // then it handles all possible values of remaining variable/unfiltered bits 1451*df3765bfSSheng // and for any value can determine if the bitpattern is a valid instruction 1452*df3765bfSSheng // or not. This means OPC_Decode will be the final step in the decoding 1453*df3765bfSSheng // process. If it is not complete, then the Fail return code from the 1454*df3765bfSSheng // decoder method indicates that additional processing should be done to see 1455*df3765bfSSheng // if there is any other instruction that also matches the bitpattern and 1456*df3765bfSSheng // can decode it. 1457*df3765bfSSheng TableInfo.Table.push_back(HasCompleteDecoder ? MCD::OPC_Decode : 1458*df3765bfSSheng MCD::OPC_TryDecode); 1459*df3765bfSSheng NumEncodingsSupported++; 1460*df3765bfSSheng uint8_t Buffer[16], *p; 1461*df3765bfSSheng encodeULEB128(Opc.Opcode, Buffer); 1462*df3765bfSSheng for (p = Buffer; *p >= 128 ; ++p) 1463*df3765bfSSheng TableInfo.Table.push_back(*p); 1464*df3765bfSSheng TableInfo.Table.push_back(*p); 1465*df3765bfSSheng 1466*df3765bfSSheng SmallString<16> Bytes; 1467*df3765bfSSheng raw_svector_ostream S(Bytes); 1468*df3765bfSSheng encodeULEB128(DIdx, S); 1469*df3765bfSSheng 1470*df3765bfSSheng // Decoder index 1471*df3765bfSSheng for (unsigned i = 0, e = Bytes.size(); i != e; ++i) 1472*df3765bfSSheng TableInfo.Table.push_back(Bytes[i]); 1473*df3765bfSSheng 1474*df3765bfSSheng if (!HasCompleteDecoder) { 1475*df3765bfSSheng // Push location for NumToSkip backpatching. 1476*df3765bfSSheng TableInfo.FixupStack.back().push_back(TableInfo.Table.size()); 1477*df3765bfSSheng // Allocate the space for the fixup. 1478*df3765bfSSheng TableInfo.Table.push_back(0); 1479*df3765bfSSheng TableInfo.Table.push_back(0); 1480*df3765bfSSheng TableInfo.Table.push_back(0); 1481*df3765bfSSheng } 1482*df3765bfSSheng } 1483*df3765bfSSheng 1484*df3765bfSSheng // Emits table entries to decode the singleton, and then to decode the rest. 1485*df3765bfSSheng void FilterChooser::emitSingletonTableEntry(DecoderTableInfo &TableInfo, 1486*df3765bfSSheng const Filter &Best) const { 1487*df3765bfSSheng EncodingIDAndOpcode Opc = Best.getSingletonOpc(); 1488*df3765bfSSheng 1489*df3765bfSSheng // complex singletons need predicate checks from the first singleton 1490*df3765bfSSheng // to refer forward to the variable filterchooser that follows. 1491*df3765bfSSheng TableInfo.FixupStack.emplace_back(); 1492*df3765bfSSheng 1493*df3765bfSSheng emitSingletonTableEntry(TableInfo, Opc); 1494*df3765bfSSheng 1495*df3765bfSSheng resolveTableFixups(TableInfo.Table, TableInfo.FixupStack.back(), 1496*df3765bfSSheng TableInfo.Table.size()); 1497*df3765bfSSheng TableInfo.FixupStack.pop_back(); 1498*df3765bfSSheng 1499*df3765bfSSheng Best.getVariableFC().emitTableEntries(TableInfo); 1500*df3765bfSSheng } 1501*df3765bfSSheng 1502*df3765bfSSheng // Assign a single filter and run with it. Top level API client can initialize 1503*df3765bfSSheng // with a single filter to start the filtering process. 1504*df3765bfSSheng void FilterChooser::runSingleFilter(unsigned startBit, unsigned numBit, 1505*df3765bfSSheng bool mixed) { 1506*df3765bfSSheng Filters.clear(); 1507*df3765bfSSheng Filters.emplace_back(*this, startBit, numBit, true); 1508*df3765bfSSheng BestIndex = 0; // Sole Filter instance to choose from. 1509*df3765bfSSheng bestFilter().recurse(); 1510*df3765bfSSheng } 1511*df3765bfSSheng 1512*df3765bfSSheng // reportRegion is a helper function for filterProcessor to mark a region as 1513*df3765bfSSheng // eligible for use as a filter region. 1514*df3765bfSSheng void FilterChooser::reportRegion(bitAttr_t RA, unsigned StartBit, 1515*df3765bfSSheng unsigned BitIndex, bool AllowMixed) { 1516*df3765bfSSheng if (RA == ATTR_MIXED && AllowMixed) 1517*df3765bfSSheng Filters.emplace_back(*this, StartBit, BitIndex - StartBit, true); 1518*df3765bfSSheng else if (RA == ATTR_ALL_SET && !AllowMixed) 1519*df3765bfSSheng Filters.emplace_back(*this, StartBit, BitIndex - StartBit, false); 1520*df3765bfSSheng } 1521*df3765bfSSheng 1522*df3765bfSSheng // FilterProcessor scans the well-known encoding bits of the instructions and 1523*df3765bfSSheng // builds up a list of candidate filters. It chooses the best filter and 1524*df3765bfSSheng // recursively descends down the decoding tree. 1525*df3765bfSSheng bool FilterChooser::filterProcessor(bool AllowMixed, bool Greedy) { 1526*df3765bfSSheng Filters.clear(); 1527*df3765bfSSheng BestIndex = -1; 1528*df3765bfSSheng unsigned numInstructions = Opcodes.size(); 1529*df3765bfSSheng 1530*df3765bfSSheng assert(numInstructions && "Filter created with no instructions"); 1531*df3765bfSSheng 1532*df3765bfSSheng // No further filtering is necessary. 1533*df3765bfSSheng if (numInstructions == 1) 1534*df3765bfSSheng return true; 1535*df3765bfSSheng 1536*df3765bfSSheng // Heuristics. See also doFilter()'s "Heuristics" comment when num of 1537*df3765bfSSheng // instructions is 3. 1538*df3765bfSSheng if (AllowMixed && !Greedy) { 1539*df3765bfSSheng assert(numInstructions == 3); 1540*df3765bfSSheng 1541*df3765bfSSheng for (auto Opcode : Opcodes) { 1542*df3765bfSSheng std::vector<unsigned> StartBits; 1543*df3765bfSSheng std::vector<unsigned> EndBits; 1544*df3765bfSSheng std::vector<uint64_t> FieldVals; 1545*df3765bfSSheng insn_t Insn; 1546*df3765bfSSheng 1547*df3765bfSSheng insnWithID(Insn, Opcode.EncodingID); 1548*df3765bfSSheng 1549*df3765bfSSheng // Look for islands of undecoded bits of any instruction. 1550*df3765bfSSheng if (getIslands(StartBits, EndBits, FieldVals, Insn) > 0) { 1551*df3765bfSSheng // Found an instruction with island(s). Now just assign a filter. 1552*df3765bfSSheng runSingleFilter(StartBits[0], EndBits[0] - StartBits[0] + 1, true); 1553*df3765bfSSheng return true; 1554*df3765bfSSheng } 1555*df3765bfSSheng } 1556*df3765bfSSheng } 1557*df3765bfSSheng 1558*df3765bfSSheng unsigned BitIndex; 1559*df3765bfSSheng 1560*df3765bfSSheng // We maintain BIT_WIDTH copies of the bitAttrs automaton. 1561*df3765bfSSheng // The automaton consumes the corresponding bit from each 1562*df3765bfSSheng // instruction. 1563*df3765bfSSheng // 1564*df3765bfSSheng // Input symbols: 0, 1, and _ (unset). 1565*df3765bfSSheng // States: NONE, FILTERED, ALL_SET, ALL_UNSET, and MIXED. 1566*df3765bfSSheng // Initial state: NONE. 1567*df3765bfSSheng // 1568*df3765bfSSheng // (NONE) ------- [01] -> (ALL_SET) 1569*df3765bfSSheng // (NONE) ------- _ ----> (ALL_UNSET) 1570*df3765bfSSheng // (ALL_SET) ---- [01] -> (ALL_SET) 1571*df3765bfSSheng // (ALL_SET) ---- _ ----> (MIXED) 1572*df3765bfSSheng // (ALL_UNSET) -- [01] -> (MIXED) 1573*df3765bfSSheng // (ALL_UNSET) -- _ ----> (ALL_UNSET) 1574*df3765bfSSheng // (MIXED) ------ . ----> (MIXED) 1575*df3765bfSSheng // (FILTERED)---- . ----> (FILTERED) 1576*df3765bfSSheng 1577*df3765bfSSheng std::vector<bitAttr_t> bitAttrs; 1578*df3765bfSSheng 1579*df3765bfSSheng // FILTERED bit positions provide no entropy and are not worthy of pursuing. 1580*df3765bfSSheng // Filter::recurse() set either BIT_TRUE or BIT_FALSE for each position. 1581*df3765bfSSheng for (BitIndex = 0; BitIndex < BitWidth; ++BitIndex) 1582*df3765bfSSheng if (FilterBitValues[BitIndex] == BIT_TRUE || 1583*df3765bfSSheng FilterBitValues[BitIndex] == BIT_FALSE) 1584*df3765bfSSheng bitAttrs.push_back(ATTR_FILTERED); 1585*df3765bfSSheng else 1586*df3765bfSSheng bitAttrs.push_back(ATTR_NONE); 1587*df3765bfSSheng 1588*df3765bfSSheng for (unsigned InsnIndex = 0; InsnIndex < numInstructions; ++InsnIndex) { 1589*df3765bfSSheng insn_t insn; 1590*df3765bfSSheng 1591*df3765bfSSheng insnWithID(insn, Opcodes[InsnIndex].EncodingID); 1592*df3765bfSSheng 1593*df3765bfSSheng for (BitIndex = 0; BitIndex < BitWidth; ++BitIndex) { 1594*df3765bfSSheng switch (bitAttrs[BitIndex]) { 1595*df3765bfSSheng case ATTR_NONE: 1596*df3765bfSSheng if (insn[BitIndex] == BIT_UNSET) 1597*df3765bfSSheng bitAttrs[BitIndex] = ATTR_ALL_UNSET; 1598*df3765bfSSheng else 1599*df3765bfSSheng bitAttrs[BitIndex] = ATTR_ALL_SET; 1600*df3765bfSSheng break; 1601*df3765bfSSheng case ATTR_ALL_SET: 1602*df3765bfSSheng if (insn[BitIndex] == BIT_UNSET) 1603*df3765bfSSheng bitAttrs[BitIndex] = ATTR_MIXED; 1604*df3765bfSSheng break; 1605*df3765bfSSheng case ATTR_ALL_UNSET: 1606*df3765bfSSheng if (insn[BitIndex] != BIT_UNSET) 1607*df3765bfSSheng bitAttrs[BitIndex] = ATTR_MIXED; 1608*df3765bfSSheng break; 1609*df3765bfSSheng case ATTR_MIXED: 1610*df3765bfSSheng case ATTR_FILTERED: 1611*df3765bfSSheng break; 1612*df3765bfSSheng } 1613*df3765bfSSheng } 1614*df3765bfSSheng } 1615*df3765bfSSheng 1616*df3765bfSSheng // The regionAttr automaton consumes the bitAttrs automatons' state, 1617*df3765bfSSheng // lowest-to-highest. 1618*df3765bfSSheng // 1619*df3765bfSSheng // Input symbols: F(iltered), (all_)S(et), (all_)U(nset), M(ixed) 1620*df3765bfSSheng // States: NONE, ALL_SET, MIXED 1621*df3765bfSSheng // Initial state: NONE 1622*df3765bfSSheng // 1623*df3765bfSSheng // (NONE) ----- F --> (NONE) 1624*df3765bfSSheng // (NONE) ----- S --> (ALL_SET) ; and set region start 1625*df3765bfSSheng // (NONE) ----- U --> (NONE) 1626*df3765bfSSheng // (NONE) ----- M --> (MIXED) ; and set region start 1627*df3765bfSSheng // (ALL_SET) -- F --> (NONE) ; and report an ALL_SET region 1628*df3765bfSSheng // (ALL_SET) -- S --> (ALL_SET) 1629*df3765bfSSheng // (ALL_SET) -- U --> (NONE) ; and report an ALL_SET region 1630*df3765bfSSheng // (ALL_SET) -- M --> (MIXED) ; and report an ALL_SET region 1631*df3765bfSSheng // (MIXED) ---- F --> (NONE) ; and report a MIXED region 1632*df3765bfSSheng // (MIXED) ---- S --> (ALL_SET) ; and report a MIXED region 1633*df3765bfSSheng // (MIXED) ---- U --> (NONE) ; and report a MIXED region 1634*df3765bfSSheng // (MIXED) ---- M --> (MIXED) 1635*df3765bfSSheng 1636*df3765bfSSheng bitAttr_t RA = ATTR_NONE; 1637*df3765bfSSheng unsigned StartBit = 0; 1638*df3765bfSSheng 1639*df3765bfSSheng for (BitIndex = 0; BitIndex < BitWidth; ++BitIndex) { 1640*df3765bfSSheng bitAttr_t bitAttr = bitAttrs[BitIndex]; 1641*df3765bfSSheng 1642*df3765bfSSheng assert(bitAttr != ATTR_NONE && "Bit without attributes"); 1643*df3765bfSSheng 1644*df3765bfSSheng switch (RA) { 1645*df3765bfSSheng case ATTR_NONE: 1646*df3765bfSSheng switch (bitAttr) { 1647*df3765bfSSheng case ATTR_FILTERED: 1648*df3765bfSSheng break; 1649*df3765bfSSheng case ATTR_ALL_SET: 1650*df3765bfSSheng StartBit = BitIndex; 1651*df3765bfSSheng RA = ATTR_ALL_SET; 1652*df3765bfSSheng break; 1653*df3765bfSSheng case ATTR_ALL_UNSET: 1654*df3765bfSSheng break; 1655*df3765bfSSheng case ATTR_MIXED: 1656*df3765bfSSheng StartBit = BitIndex; 1657*df3765bfSSheng RA = ATTR_MIXED; 1658*df3765bfSSheng break; 1659*df3765bfSSheng default: 1660*df3765bfSSheng llvm_unreachable("Unexpected bitAttr!"); 1661*df3765bfSSheng } 1662*df3765bfSSheng break; 1663*df3765bfSSheng case ATTR_ALL_SET: 1664*df3765bfSSheng switch (bitAttr) { 1665*df3765bfSSheng case ATTR_FILTERED: 1666*df3765bfSSheng reportRegion(RA, StartBit, BitIndex, AllowMixed); 1667*df3765bfSSheng RA = ATTR_NONE; 1668*df3765bfSSheng break; 1669*df3765bfSSheng case ATTR_ALL_SET: 1670*df3765bfSSheng break; 1671*df3765bfSSheng case ATTR_ALL_UNSET: 1672*df3765bfSSheng reportRegion(RA, StartBit, BitIndex, AllowMixed); 1673*df3765bfSSheng RA = ATTR_NONE; 1674*df3765bfSSheng break; 1675*df3765bfSSheng case ATTR_MIXED: 1676*df3765bfSSheng reportRegion(RA, StartBit, BitIndex, AllowMixed); 1677*df3765bfSSheng StartBit = BitIndex; 1678*df3765bfSSheng RA = ATTR_MIXED; 1679*df3765bfSSheng break; 1680*df3765bfSSheng default: 1681*df3765bfSSheng llvm_unreachable("Unexpected bitAttr!"); 1682*df3765bfSSheng } 1683*df3765bfSSheng break; 1684*df3765bfSSheng case ATTR_MIXED: 1685*df3765bfSSheng switch (bitAttr) { 1686*df3765bfSSheng case ATTR_FILTERED: 1687*df3765bfSSheng reportRegion(RA, StartBit, BitIndex, AllowMixed); 1688*df3765bfSSheng StartBit = BitIndex; 1689*df3765bfSSheng RA = ATTR_NONE; 1690*df3765bfSSheng break; 1691*df3765bfSSheng case ATTR_ALL_SET: 1692*df3765bfSSheng reportRegion(RA, StartBit, BitIndex, AllowMixed); 1693*df3765bfSSheng StartBit = BitIndex; 1694*df3765bfSSheng RA = ATTR_ALL_SET; 1695*df3765bfSSheng break; 1696*df3765bfSSheng case ATTR_ALL_UNSET: 1697*df3765bfSSheng reportRegion(RA, StartBit, BitIndex, AllowMixed); 1698*df3765bfSSheng RA = ATTR_NONE; 1699*df3765bfSSheng break; 1700*df3765bfSSheng case ATTR_MIXED: 1701*df3765bfSSheng break; 1702*df3765bfSSheng default: 1703*df3765bfSSheng llvm_unreachable("Unexpected bitAttr!"); 1704*df3765bfSSheng } 1705*df3765bfSSheng break; 1706*df3765bfSSheng case ATTR_ALL_UNSET: 1707*df3765bfSSheng llvm_unreachable("regionAttr state machine has no ATTR_UNSET state"); 1708*df3765bfSSheng case ATTR_FILTERED: 1709*df3765bfSSheng llvm_unreachable("regionAttr state machine has no ATTR_FILTERED state"); 1710*df3765bfSSheng } 1711*df3765bfSSheng } 1712*df3765bfSSheng 1713*df3765bfSSheng // At the end, if we're still in ALL_SET or MIXED states, report a region 1714*df3765bfSSheng switch (RA) { 1715*df3765bfSSheng case ATTR_NONE: 1716*df3765bfSSheng break; 1717*df3765bfSSheng case ATTR_FILTERED: 1718*df3765bfSSheng break; 1719*df3765bfSSheng case ATTR_ALL_SET: 1720*df3765bfSSheng reportRegion(RA, StartBit, BitIndex, AllowMixed); 1721*df3765bfSSheng break; 1722*df3765bfSSheng case ATTR_ALL_UNSET: 1723*df3765bfSSheng break; 1724*df3765bfSSheng case ATTR_MIXED: 1725*df3765bfSSheng reportRegion(RA, StartBit, BitIndex, AllowMixed); 1726*df3765bfSSheng break; 1727*df3765bfSSheng } 1728*df3765bfSSheng 1729*df3765bfSSheng // We have finished with the filter processings. Now it's time to choose 1730*df3765bfSSheng // the best performing filter. 1731*df3765bfSSheng BestIndex = 0; 1732*df3765bfSSheng bool AllUseless = true; 1733*df3765bfSSheng unsigned BestScore = 0; 1734*df3765bfSSheng 1735*df3765bfSSheng for (unsigned i = 0, e = Filters.size(); i != e; ++i) { 1736*df3765bfSSheng unsigned Usefulness = Filters[i].usefulness(); 1737*df3765bfSSheng 1738*df3765bfSSheng if (Usefulness) 1739*df3765bfSSheng AllUseless = false; 1740*df3765bfSSheng 1741*df3765bfSSheng if (Usefulness > BestScore) { 1742*df3765bfSSheng BestIndex = i; 1743*df3765bfSSheng BestScore = Usefulness; 1744*df3765bfSSheng } 1745*df3765bfSSheng } 1746*df3765bfSSheng 1747*df3765bfSSheng if (!AllUseless) 1748*df3765bfSSheng bestFilter().recurse(); 1749*df3765bfSSheng 1750*df3765bfSSheng return !AllUseless; 1751*df3765bfSSheng } // end of FilterChooser::filterProcessor(bool) 1752*df3765bfSSheng 1753*df3765bfSSheng // Decides on the best configuration of filter(s) to use in order to decode 1754*df3765bfSSheng // the instructions. A conflict of instructions may occur, in which case we 1755*df3765bfSSheng // dump the conflict set to the standard error. 1756*df3765bfSSheng void FilterChooser::doFilter() { 1757*df3765bfSSheng unsigned Num = Opcodes.size(); 1758*df3765bfSSheng assert(Num && "FilterChooser created with no instructions"); 1759*df3765bfSSheng 1760*df3765bfSSheng // Try regions of consecutive known bit values first. 1761*df3765bfSSheng if (filterProcessor(false)) 1762*df3765bfSSheng return; 1763*df3765bfSSheng 1764*df3765bfSSheng // Then regions of mixed bits (both known and unitialized bit values allowed). 1765*df3765bfSSheng if (filterProcessor(true)) 1766*df3765bfSSheng return; 1767*df3765bfSSheng 1768*df3765bfSSheng // Heuristics to cope with conflict set {t2CMPrs, t2SUBSrr, t2SUBSrs} where 1769*df3765bfSSheng // no single instruction for the maximum ATTR_MIXED region Inst{14-4} has a 1770*df3765bfSSheng // well-known encoding pattern. In such case, we backtrack and scan for the 1771*df3765bfSSheng // the very first consecutive ATTR_ALL_SET region and assign a filter to it. 1772*df3765bfSSheng if (Num == 3 && filterProcessor(true, false)) 1773*df3765bfSSheng return; 1774*df3765bfSSheng 1775*df3765bfSSheng // If we come to here, the instruction decoding has failed. 1776*df3765bfSSheng // Set the BestIndex to -1 to indicate so. 1777*df3765bfSSheng BestIndex = -1; 1778*df3765bfSSheng } 1779*df3765bfSSheng 1780*df3765bfSSheng // emitTableEntries - Emit state machine entries to decode our share of 1781*df3765bfSSheng // instructions. 1782*df3765bfSSheng void FilterChooser::emitTableEntries(DecoderTableInfo &TableInfo) const { 1783*df3765bfSSheng if (Opcodes.size() == 1) { 1784*df3765bfSSheng // There is only one instruction in the set, which is great! 1785*df3765bfSSheng // Call emitSingletonDecoder() to see whether there are any remaining 1786*df3765bfSSheng // encodings bits. 1787*df3765bfSSheng emitSingletonTableEntry(TableInfo, Opcodes[0]); 1788*df3765bfSSheng return; 1789*df3765bfSSheng } 1790*df3765bfSSheng 1791*df3765bfSSheng // Choose the best filter to do the decodings! 1792*df3765bfSSheng if (BestIndex != -1) { 1793*df3765bfSSheng const Filter &Best = Filters[BestIndex]; 1794*df3765bfSSheng if (Best.getNumFiltered() == 1) 1795*df3765bfSSheng emitSingletonTableEntry(TableInfo, Best); 1796*df3765bfSSheng else 1797*df3765bfSSheng Best.emitTableEntry(TableInfo); 1798*df3765bfSSheng return; 1799*df3765bfSSheng } 1800*df3765bfSSheng 1801*df3765bfSSheng // We don't know how to decode these instructions! Dump the 1802*df3765bfSSheng // conflict set and bail. 1803*df3765bfSSheng 1804*df3765bfSSheng // Print out useful conflict information for postmortem analysis. 1805*df3765bfSSheng errs() << "Decoding Conflict:\n"; 1806*df3765bfSSheng 1807*df3765bfSSheng dumpStack(errs(), "\t\t"); 1808*df3765bfSSheng 1809*df3765bfSSheng for (auto Opcode : Opcodes) { 1810*df3765bfSSheng errs() << '\t'; 1811*df3765bfSSheng emitNameWithID(errs(), Opcode.EncodingID); 1812*df3765bfSSheng errs() << " "; 1813*df3765bfSSheng dumpBits( 1814*df3765bfSSheng errs(), 1815*df3765bfSSheng getBitsField(*AllInstructions[Opcode.EncodingID].EncodingDef, "Inst")); 1816*df3765bfSSheng errs() << '\n'; 1817*df3765bfSSheng } 1818*df3765bfSSheng } 1819*df3765bfSSheng 1820*df3765bfSSheng static std::string findOperandDecoderMethod(Record *Record) { 1821*df3765bfSSheng std::string Decoder; 1822*df3765bfSSheng 1823*df3765bfSSheng RecordVal *DecoderString = Record->getValue("DecoderMethod"); 1824*df3765bfSSheng StringInit *String = DecoderString ? 1825*df3765bfSSheng dyn_cast<StringInit>(DecoderString->getValue()) : nullptr; 1826*df3765bfSSheng if (String) { 1827*df3765bfSSheng Decoder = std::string(String->getValue()); 1828*df3765bfSSheng if (!Decoder.empty()) 1829*df3765bfSSheng return Decoder; 1830*df3765bfSSheng } 1831*df3765bfSSheng 1832*df3765bfSSheng if (Record->isSubClassOf("RegisterOperand")) 1833*df3765bfSSheng Record = Record->getValueAsDef("RegClass"); 1834*df3765bfSSheng 1835*df3765bfSSheng if (Record->isSubClassOf("RegisterClass")) { 1836*df3765bfSSheng Decoder = "Decode" + Record->getName().str() + "RegisterClass"; 1837*df3765bfSSheng } else if (Record->isSubClassOf("PointerLikeRegClass")) { 1838*df3765bfSSheng Decoder = "DecodePointerLikeRegClass" + 1839*df3765bfSSheng utostr(Record->getValueAsInt("RegClassKind")); 1840*df3765bfSSheng } 1841*df3765bfSSheng 1842*df3765bfSSheng return Decoder; 1843*df3765bfSSheng } 1844*df3765bfSSheng 1845*df3765bfSSheng OperandInfo getOpInfo(Record *TypeRecord) { 1846*df3765bfSSheng std::string Decoder = findOperandDecoderMethod(TypeRecord); 1847*df3765bfSSheng 1848*df3765bfSSheng RecordVal *HasCompleteDecoderVal = TypeRecord->getValue("hasCompleteDecoder"); 1849*df3765bfSSheng BitInit *HasCompleteDecoderBit = 1850*df3765bfSSheng HasCompleteDecoderVal 1851*df3765bfSSheng ? dyn_cast<BitInit>(HasCompleteDecoderVal->getValue()) 1852*df3765bfSSheng : nullptr; 1853*df3765bfSSheng bool HasCompleteDecoder = 1854*df3765bfSSheng HasCompleteDecoderBit ? HasCompleteDecoderBit->getValue() : true; 1855*df3765bfSSheng 1856*df3765bfSSheng return OperandInfo(Decoder, HasCompleteDecoder); 1857*df3765bfSSheng } 1858*df3765bfSSheng 1859*df3765bfSSheng void parseVarLenInstOperand(const Record &Def, 1860*df3765bfSSheng std::vector<OperandInfo> &Operands, 1861*df3765bfSSheng const CodeGenInstruction &CGI) { 1862*df3765bfSSheng 1863*df3765bfSSheng const RecordVal *RV = Def.getValue("Inst"); 1864*df3765bfSSheng VarLenInst VLI(cast<DagInit>(RV->getValue()), RV); 1865*df3765bfSSheng SmallVector<int> TiedTo; 1866*df3765bfSSheng 1867*df3765bfSSheng for (unsigned Idx = 0; Idx < CGI.Operands.size(); ++Idx) { 1868*df3765bfSSheng auto &Op = CGI.Operands[Idx]; 1869*df3765bfSSheng if (Op.MIOperandInfo && Op.MIOperandInfo->getNumArgs() > 0) 1870*df3765bfSSheng for (auto *Arg : Op.MIOperandInfo->getArgs()) 1871*df3765bfSSheng Operands.push_back(getOpInfo(cast<DefInit>(Arg)->getDef())); 1872*df3765bfSSheng else 1873*df3765bfSSheng Operands.push_back(getOpInfo(Op.Rec)); 1874*df3765bfSSheng 1875*df3765bfSSheng int TiedReg = Op.getTiedRegister(); 1876*df3765bfSSheng TiedTo.push_back(-1); 1877*df3765bfSSheng if (TiedReg != -1) { 1878*df3765bfSSheng TiedTo[Idx] = TiedReg; 1879*df3765bfSSheng TiedTo[TiedReg] = Idx; 1880*df3765bfSSheng } 1881*df3765bfSSheng } 1882*df3765bfSSheng 1883*df3765bfSSheng unsigned CurrBitPos = 0; 1884*df3765bfSSheng for (auto &EncodingSegment : VLI) { 1885*df3765bfSSheng unsigned Offset = 0; 1886*df3765bfSSheng StringRef OpName; 1887*df3765bfSSheng 1888*df3765bfSSheng if (const StringInit *SI = dyn_cast<StringInit>(EncodingSegment.Value)) { 1889*df3765bfSSheng OpName = SI->getValue(); 1890*df3765bfSSheng } else if (const DagInit *DI = dyn_cast<DagInit>(EncodingSegment.Value)) { 1891*df3765bfSSheng OpName = cast<StringInit>(DI->getArg(0))->getValue(); 1892*df3765bfSSheng Offset = cast<IntInit>(DI->getArg(2))->getValue(); 1893*df3765bfSSheng } 1894*df3765bfSSheng 1895*df3765bfSSheng if (!OpName.empty()) { 1896*df3765bfSSheng auto OpSubOpPair = 1897*df3765bfSSheng const_cast<CodeGenInstruction &>(CGI).Operands.ParseOperandName( 1898*df3765bfSSheng OpName); 1899*df3765bfSSheng unsigned OpIdx = CGI.Operands.getFlattenedOperandNumber(OpSubOpPair); 1900*df3765bfSSheng Operands[OpIdx].addField(CurrBitPos, EncodingSegment.BitWidth, Offset); 1901*df3765bfSSheng 1902*df3765bfSSheng int TiedReg = TiedTo[OpSubOpPair.first]; 1903*df3765bfSSheng if (TiedReg != -1) { 1904*df3765bfSSheng unsigned OpIdx = CGI.Operands.getFlattenedOperandNumber( 1905*df3765bfSSheng std::make_pair(TiedReg, OpSubOpPair.second)); 1906*df3765bfSSheng Operands[OpIdx].addField(CurrBitPos, EncodingSegment.BitWidth, Offset); 1907*df3765bfSSheng } 1908*df3765bfSSheng } 1909*df3765bfSSheng 1910*df3765bfSSheng CurrBitPos += EncodingSegment.BitWidth; 1911*df3765bfSSheng } 1912*df3765bfSSheng } 1913*df3765bfSSheng 1914*df3765bfSSheng static unsigned 1915*df3765bfSSheng populateInstruction(CodeGenTarget &Target, const Record &EncodingDef, 1916*df3765bfSSheng const CodeGenInstruction &CGI, unsigned Opc, 1917*df3765bfSSheng std::map<unsigned, std::vector<OperandInfo>> &Operands, 1918*df3765bfSSheng bool IsVarLenInst) { 1919*df3765bfSSheng const Record &Def = *CGI.TheDef; 1920*df3765bfSSheng // If all the bit positions are not specified; do not decode this instruction. 1921*df3765bfSSheng // We are bound to fail! For proper disassembly, the well-known encoding bits 1922*df3765bfSSheng // of the instruction must be fully specified. 1923*df3765bfSSheng 1924*df3765bfSSheng BitsInit &Bits = getBitsField(EncodingDef, "Inst"); 1925*df3765bfSSheng if (Bits.allInComplete()) 1926*df3765bfSSheng return 0; 1927*df3765bfSSheng 1928*df3765bfSSheng std::vector<OperandInfo> InsnOperands; 1929*df3765bfSSheng 1930*df3765bfSSheng // If the instruction has specified a custom decoding hook, use that instead 1931*df3765bfSSheng // of trying to auto-generate the decoder. 1932*df3765bfSSheng StringRef InstDecoder = EncodingDef.getValueAsString("DecoderMethod"); 1933*df3765bfSSheng if (InstDecoder != "") { 1934*df3765bfSSheng bool HasCompleteInstDecoder = EncodingDef.getValueAsBit("hasCompleteDecoder"); 1935*df3765bfSSheng InsnOperands.push_back( 1936*df3765bfSSheng OperandInfo(std::string(InstDecoder), HasCompleteInstDecoder)); 1937*df3765bfSSheng Operands[Opc] = InsnOperands; 1938*df3765bfSSheng return Bits.getNumBits(); 1939*df3765bfSSheng } 1940*df3765bfSSheng 1941*df3765bfSSheng // Generate a description of the operand of the instruction that we know 1942*df3765bfSSheng // how to decode automatically. 1943*df3765bfSSheng // FIXME: We'll need to have a way to manually override this as needed. 1944*df3765bfSSheng 1945*df3765bfSSheng // Gather the outputs/inputs of the instruction, so we can find their 1946*df3765bfSSheng // positions in the encoding. This assumes for now that they appear in the 1947*df3765bfSSheng // MCInst in the order that they're listed. 1948*df3765bfSSheng std::vector<std::pair<Init*, StringRef>> InOutOperands; 1949*df3765bfSSheng DagInit *Out = Def.getValueAsDag("OutOperandList"); 1950*df3765bfSSheng DagInit *In = Def.getValueAsDag("InOperandList"); 1951*df3765bfSSheng for (unsigned i = 0; i < Out->getNumArgs(); ++i) 1952*df3765bfSSheng InOutOperands.push_back( 1953*df3765bfSSheng std::make_pair(Out->getArg(i), Out->getArgNameStr(i))); 1954*df3765bfSSheng for (unsigned i = 0; i < In->getNumArgs(); ++i) 1955*df3765bfSSheng InOutOperands.push_back( 1956*df3765bfSSheng std::make_pair(In->getArg(i), In->getArgNameStr(i))); 1957*df3765bfSSheng 1958*df3765bfSSheng // Search for tied operands, so that we can correctly instantiate 1959*df3765bfSSheng // operands that are not explicitly represented in the encoding. 1960*df3765bfSSheng std::map<std::string, std::string> TiedNames; 1961*df3765bfSSheng for (unsigned i = 0; i < CGI.Operands.size(); ++i) { 1962*df3765bfSSheng int tiedTo = CGI.Operands[i].getTiedRegister(); 1963*df3765bfSSheng if (tiedTo != -1) { 1964*df3765bfSSheng std::pair<unsigned, unsigned> SO = 1965*df3765bfSSheng CGI.Operands.getSubOperandNumber(tiedTo); 1966*df3765bfSSheng TiedNames[std::string(InOutOperands[i].second)] = 1967*df3765bfSSheng std::string(InOutOperands[SO.first].second); 1968*df3765bfSSheng TiedNames[std::string(InOutOperands[SO.first].second)] = 1969*df3765bfSSheng std::string(InOutOperands[i].second); 1970*df3765bfSSheng } 1971*df3765bfSSheng } 1972*df3765bfSSheng 1973*df3765bfSSheng if (IsVarLenInst) { 1974*df3765bfSSheng parseVarLenInstOperand(EncodingDef, InsnOperands, CGI); 1975*df3765bfSSheng } else { 1976*df3765bfSSheng std::map<std::string, std::vector<OperandInfo>> NumberedInsnOperands; 1977*df3765bfSSheng std::set<std::string> NumberedInsnOperandsNoTie; 1978*df3765bfSSheng if (Target.getInstructionSet()->getValueAsBit( 1979*df3765bfSSheng "decodePositionallyEncodedOperands")) { 1980*df3765bfSSheng const std::vector<RecordVal> &Vals = Def.getValues(); 1981*df3765bfSSheng unsigned NumberedOp = 0; 1982*df3765bfSSheng 1983*df3765bfSSheng std::set<unsigned> NamedOpIndices; 1984*df3765bfSSheng if (Target.getInstructionSet()->getValueAsBit( 1985*df3765bfSSheng "noNamedPositionallyEncodedOperands")) 1986*df3765bfSSheng // Collect the set of operand indices that might correspond to named 1987*df3765bfSSheng // operand, and skip these when assigning operands based on position. 1988*df3765bfSSheng for (unsigned i = 0, e = Vals.size(); i != e; ++i) { 1989*df3765bfSSheng unsigned OpIdx; 1990*df3765bfSSheng if (!CGI.Operands.hasOperandNamed(Vals[i].getName(), OpIdx)) 1991*df3765bfSSheng continue; 1992*df3765bfSSheng 1993*df3765bfSSheng NamedOpIndices.insert(OpIdx); 1994*df3765bfSSheng } 1995*df3765bfSSheng 1996*df3765bfSSheng for (unsigned i = 0, e = Vals.size(); i != e; ++i) { 1997*df3765bfSSheng // Ignore fixed fields in the record, we're looking for values like: 1998*df3765bfSSheng // bits<5> RST = { ?, ?, ?, ?, ? }; 1999*df3765bfSSheng if (Vals[i].isNonconcreteOK() || Vals[i].getValue()->isComplete()) 2000*df3765bfSSheng continue; 2001*df3765bfSSheng 2002*df3765bfSSheng // Determine if Vals[i] actually contributes to the Inst encoding. 2003*df3765bfSSheng unsigned bi = 0; 2004*df3765bfSSheng for (; bi < Bits.getNumBits(); ++bi) { 2005*df3765bfSSheng VarInit *Var = nullptr; 2006*df3765bfSSheng VarBitInit *BI = dyn_cast<VarBitInit>(Bits.getBit(bi)); 2007*df3765bfSSheng if (BI) 2008*df3765bfSSheng Var = dyn_cast<VarInit>(BI->getBitVar()); 2009*df3765bfSSheng else 2010*df3765bfSSheng Var = dyn_cast<VarInit>(Bits.getBit(bi)); 2011*df3765bfSSheng 2012*df3765bfSSheng if (Var && Var->getName() == Vals[i].getName()) 2013*df3765bfSSheng break; 2014*df3765bfSSheng } 2015*df3765bfSSheng 2016*df3765bfSSheng if (bi == Bits.getNumBits()) 2017*df3765bfSSheng continue; 2018*df3765bfSSheng 2019*df3765bfSSheng // Skip variables that correspond to explicitly-named operands. 2020*df3765bfSSheng unsigned OpIdx; 2021*df3765bfSSheng if (CGI.Operands.hasOperandNamed(Vals[i].getName(), OpIdx)) 2022*df3765bfSSheng continue; 2023*df3765bfSSheng 2024*df3765bfSSheng // Get the bit range for this operand: 2025*df3765bfSSheng unsigned bitStart = bi++, bitWidth = 1; 2026*df3765bfSSheng for (; bi < Bits.getNumBits(); ++bi) { 2027*df3765bfSSheng VarInit *Var = nullptr; 2028*df3765bfSSheng VarBitInit *BI = dyn_cast<VarBitInit>(Bits.getBit(bi)); 2029*df3765bfSSheng if (BI) 2030*df3765bfSSheng Var = dyn_cast<VarInit>(BI->getBitVar()); 2031*df3765bfSSheng else 2032*df3765bfSSheng Var = dyn_cast<VarInit>(Bits.getBit(bi)); 2033*df3765bfSSheng 2034*df3765bfSSheng if (!Var) 2035*df3765bfSSheng break; 2036*df3765bfSSheng 2037*df3765bfSSheng if (Var->getName() != Vals[i].getName()) 2038*df3765bfSSheng break; 2039*df3765bfSSheng 2040*df3765bfSSheng ++bitWidth; 2041*df3765bfSSheng } 2042*df3765bfSSheng 2043*df3765bfSSheng unsigned NumberOps = CGI.Operands.size(); 2044*df3765bfSSheng while (NumberedOp < NumberOps && 2045*df3765bfSSheng (CGI.Operands.isFlatOperandNotEmitted(NumberedOp) || 2046*df3765bfSSheng (!NamedOpIndices.empty() && 2047*df3765bfSSheng NamedOpIndices.count( 2048*df3765bfSSheng CGI.Operands.getSubOperandNumber(NumberedOp).first)))) 2049*df3765bfSSheng ++NumberedOp; 2050*df3765bfSSheng 2051*df3765bfSSheng OpIdx = NumberedOp++; 2052*df3765bfSSheng 2053*df3765bfSSheng // OpIdx now holds the ordered operand number of Vals[i]. 2054*df3765bfSSheng std::pair<unsigned, unsigned> SO = 2055*df3765bfSSheng CGI.Operands.getSubOperandNumber(OpIdx); 2056*df3765bfSSheng const std::string &Name = CGI.Operands[SO.first].Name; 2057*df3765bfSSheng 2058*df3765bfSSheng LLVM_DEBUG(dbgs() << "Numbered operand mapping for " << Def.getName() 2059*df3765bfSSheng << ": " << Name << "(" << SO.first << ", " 2060*df3765bfSSheng << SO.second << ") => " << Vals[i].getName() << "\n"); 2061*df3765bfSSheng 2062*df3765bfSSheng std::string Decoder; 2063*df3765bfSSheng Record *TypeRecord = CGI.Operands[SO.first].Rec; 2064*df3765bfSSheng 2065*df3765bfSSheng RecordVal *DecoderString = TypeRecord->getValue("DecoderMethod"); 2066*df3765bfSSheng StringInit *String = 2067*df3765bfSSheng DecoderString ? dyn_cast<StringInit>(DecoderString->getValue()) 2068*df3765bfSSheng : nullptr; 2069*df3765bfSSheng if (String && String->getValue() != "") 2070*df3765bfSSheng Decoder = std::string(String->getValue()); 2071*df3765bfSSheng 2072*df3765bfSSheng if (Decoder == "" && CGI.Operands[SO.first].MIOperandInfo && 2073*df3765bfSSheng CGI.Operands[SO.first].MIOperandInfo->getNumArgs()) { 2074*df3765bfSSheng Init *Arg = CGI.Operands[SO.first].MIOperandInfo->getArg(SO.second); 2075*df3765bfSSheng if (DefInit *DI = cast<DefInit>(Arg)) 2076*df3765bfSSheng TypeRecord = DI->getDef(); 2077*df3765bfSSheng } 2078*df3765bfSSheng 2079*df3765bfSSheng bool isReg = false; 2080*df3765bfSSheng if (TypeRecord->isSubClassOf("RegisterOperand")) 2081*df3765bfSSheng TypeRecord = TypeRecord->getValueAsDef("RegClass"); 2082*df3765bfSSheng if (TypeRecord->isSubClassOf("RegisterClass")) { 2083*df3765bfSSheng Decoder = "Decode" + TypeRecord->getName().str() + "RegisterClass"; 2084*df3765bfSSheng isReg = true; 2085*df3765bfSSheng } else if (TypeRecord->isSubClassOf("PointerLikeRegClass")) { 2086*df3765bfSSheng Decoder = "DecodePointerLikeRegClass" + 2087*df3765bfSSheng utostr(TypeRecord->getValueAsInt("RegClassKind")); 2088*df3765bfSSheng isReg = true; 2089*df3765bfSSheng } 2090*df3765bfSSheng 2091*df3765bfSSheng DecoderString = TypeRecord->getValue("DecoderMethod"); 2092*df3765bfSSheng String = DecoderString ? dyn_cast<StringInit>(DecoderString->getValue()) 2093*df3765bfSSheng : nullptr; 2094*df3765bfSSheng if (!isReg && String && String->getValue() != "") 2095*df3765bfSSheng Decoder = std::string(String->getValue()); 2096*df3765bfSSheng 2097*df3765bfSSheng RecordVal *HasCompleteDecoderVal = 2098*df3765bfSSheng TypeRecord->getValue("hasCompleteDecoder"); 2099*df3765bfSSheng BitInit *HasCompleteDecoderBit = 2100*df3765bfSSheng HasCompleteDecoderVal 2101*df3765bfSSheng ? dyn_cast<BitInit>(HasCompleteDecoderVal->getValue()) 2102*df3765bfSSheng : nullptr; 2103*df3765bfSSheng bool HasCompleteDecoder = 2104*df3765bfSSheng HasCompleteDecoderBit ? HasCompleteDecoderBit->getValue() : true; 2105*df3765bfSSheng 2106*df3765bfSSheng OperandInfo OpInfo(Decoder, HasCompleteDecoder); 2107*df3765bfSSheng OpInfo.addField(bitStart, bitWidth, 0); 2108*df3765bfSSheng 2109*df3765bfSSheng NumberedInsnOperands[Name].push_back(OpInfo); 2110*df3765bfSSheng 2111*df3765bfSSheng // FIXME: For complex operands with custom decoders we can't handle tied 2112*df3765bfSSheng // sub-operands automatically. Skip those here and assume that this is 2113*df3765bfSSheng // fixed up elsewhere. 2114*df3765bfSSheng if (CGI.Operands[SO.first].MIOperandInfo && 2115*df3765bfSSheng CGI.Operands[SO.first].MIOperandInfo->getNumArgs() > 1 && String && 2116*df3765bfSSheng String->getValue() != "") 2117*df3765bfSSheng NumberedInsnOperandsNoTie.insert(Name); 2118*df3765bfSSheng } 2119*df3765bfSSheng } 2120*df3765bfSSheng 2121*df3765bfSSheng // For each operand, see if we can figure out where it is encoded. 2122*df3765bfSSheng for (const auto &Op : InOutOperands) { 2123*df3765bfSSheng if (!NumberedInsnOperands[std::string(Op.second)].empty()) { 2124*df3765bfSSheng llvm::append_range(InsnOperands, 2125*df3765bfSSheng NumberedInsnOperands[std::string(Op.second)]); 2126*df3765bfSSheng continue; 2127*df3765bfSSheng } 2128*df3765bfSSheng if (!NumberedInsnOperands[TiedNames[std::string(Op.second)]].empty()) { 2129*df3765bfSSheng if (!NumberedInsnOperandsNoTie.count( 2130*df3765bfSSheng TiedNames[std::string(Op.second)])) { 2131*df3765bfSSheng // Figure out to which (sub)operand we're tied. 2132*df3765bfSSheng unsigned i = 2133*df3765bfSSheng CGI.Operands.getOperandNamed(TiedNames[std::string(Op.second)]); 2134*df3765bfSSheng int tiedTo = CGI.Operands[i].getTiedRegister(); 2135*df3765bfSSheng if (tiedTo == -1) { 2136*df3765bfSSheng i = CGI.Operands.getOperandNamed(Op.second); 2137*df3765bfSSheng tiedTo = CGI.Operands[i].getTiedRegister(); 2138*df3765bfSSheng } 2139*df3765bfSSheng 2140*df3765bfSSheng if (tiedTo != -1) { 2141*df3765bfSSheng std::pair<unsigned, unsigned> SO = 2142*df3765bfSSheng CGI.Operands.getSubOperandNumber(tiedTo); 2143*df3765bfSSheng 2144*df3765bfSSheng InsnOperands.push_back( 2145*df3765bfSSheng NumberedInsnOperands[TiedNames[std::string(Op.second)]] 2146*df3765bfSSheng [SO.second]); 2147*df3765bfSSheng } 2148*df3765bfSSheng } 2149*df3765bfSSheng continue; 2150*df3765bfSSheng } 2151*df3765bfSSheng 2152*df3765bfSSheng // At this point, we can locate the decoder field, but we need to know how 2153*df3765bfSSheng // to interpret it. As a first step, require the target to provide 2154*df3765bfSSheng // callbacks for decoding register classes. 2155*df3765bfSSheng 2156*df3765bfSSheng OperandInfo OpInfo = getOpInfo(cast<DefInit>(Op.first)->getDef()); 2157*df3765bfSSheng 2158*df3765bfSSheng // Some bits of the operand may be required to be 1 depending on the 2159*df3765bfSSheng // instruction's encoding. Collect those bits. 2160*df3765bfSSheng if (const RecordVal *EncodedValue = EncodingDef.getValue(Op.second)) 2161*df3765bfSSheng if (const BitsInit *OpBits = 2162*df3765bfSSheng dyn_cast<BitsInit>(EncodedValue->getValue())) 2163*df3765bfSSheng for (unsigned I = 0; I < OpBits->getNumBits(); ++I) 2164*df3765bfSSheng if (const BitInit *OpBit = dyn_cast<BitInit>(OpBits->getBit(I))) 2165*df3765bfSSheng if (OpBit->getValue()) 2166*df3765bfSSheng OpInfo.InitValue |= 1ULL << I; 2167*df3765bfSSheng 2168*df3765bfSSheng unsigned Base = ~0U; 2169*df3765bfSSheng unsigned Width = 0; 2170*df3765bfSSheng unsigned Offset = 0; 2171*df3765bfSSheng 2172*df3765bfSSheng for (unsigned bi = 0; bi < Bits.getNumBits(); ++bi) { 2173*df3765bfSSheng VarInit *Var = nullptr; 2174*df3765bfSSheng VarBitInit *BI = dyn_cast<VarBitInit>(Bits.getBit(bi)); 2175*df3765bfSSheng if (BI) 2176*df3765bfSSheng Var = dyn_cast<VarInit>(BI->getBitVar()); 2177*df3765bfSSheng else 2178*df3765bfSSheng Var = dyn_cast<VarInit>(Bits.getBit(bi)); 2179*df3765bfSSheng 2180*df3765bfSSheng if (!Var) { 2181*df3765bfSSheng if (Base != ~0U) { 2182*df3765bfSSheng OpInfo.addField(Base, Width, Offset); 2183*df3765bfSSheng Base = ~0U; 2184*df3765bfSSheng Width = 0; 2185*df3765bfSSheng Offset = 0; 2186*df3765bfSSheng } 2187*df3765bfSSheng continue; 2188*df3765bfSSheng } 2189*df3765bfSSheng 2190*df3765bfSSheng if ((Var->getName() != Op.second && 2191*df3765bfSSheng Var->getName() != TiedNames[std::string(Op.second)])) { 2192*df3765bfSSheng if (Base != ~0U) { 2193*df3765bfSSheng OpInfo.addField(Base, Width, Offset); 2194*df3765bfSSheng Base = ~0U; 2195*df3765bfSSheng Width = 0; 2196*df3765bfSSheng Offset = 0; 2197*df3765bfSSheng } 2198*df3765bfSSheng continue; 2199*df3765bfSSheng } 2200*df3765bfSSheng 2201*df3765bfSSheng if (Base == ~0U) { 2202*df3765bfSSheng Base = bi; 2203*df3765bfSSheng Width = 1; 2204*df3765bfSSheng Offset = BI ? BI->getBitNum() : 0; 2205*df3765bfSSheng } else if (BI && BI->getBitNum() != Offset + Width) { 2206*df3765bfSSheng OpInfo.addField(Base, Width, Offset); 2207*df3765bfSSheng Base = bi; 2208*df3765bfSSheng Width = 1; 2209*df3765bfSSheng Offset = BI->getBitNum(); 2210*df3765bfSSheng } else { 2211*df3765bfSSheng ++Width; 2212*df3765bfSSheng } 2213*df3765bfSSheng } 2214*df3765bfSSheng 2215*df3765bfSSheng if (Base != ~0U) 2216*df3765bfSSheng OpInfo.addField(Base, Width, Offset); 2217*df3765bfSSheng 2218*df3765bfSSheng if (OpInfo.numFields() > 0) 2219*df3765bfSSheng InsnOperands.push_back(OpInfo); 2220*df3765bfSSheng } 2221*df3765bfSSheng } 2222*df3765bfSSheng 2223*df3765bfSSheng Operands[Opc] = InsnOperands; 2224*df3765bfSSheng 2225*df3765bfSSheng #if 0 2226*df3765bfSSheng LLVM_DEBUG({ 2227*df3765bfSSheng // Dumps the instruction encoding bits. 2228*df3765bfSSheng dumpBits(errs(), Bits); 2229*df3765bfSSheng 2230*df3765bfSSheng errs() << '\n'; 2231*df3765bfSSheng 2232*df3765bfSSheng // Dumps the list of operand info. 2233*df3765bfSSheng for (unsigned i = 0, e = CGI.Operands.size(); i != e; ++i) { 2234*df3765bfSSheng const CGIOperandList::OperandInfo &Info = CGI.Operands[i]; 2235*df3765bfSSheng const std::string &OperandName = Info.Name; 2236*df3765bfSSheng const Record &OperandDef = *Info.Rec; 2237*df3765bfSSheng 2238*df3765bfSSheng errs() << "\t" << OperandName << " (" << OperandDef.getName() << ")\n"; 2239*df3765bfSSheng } 2240*df3765bfSSheng }); 2241*df3765bfSSheng #endif 2242*df3765bfSSheng 2243*df3765bfSSheng return Bits.getNumBits(); 2244*df3765bfSSheng } 2245*df3765bfSSheng 2246*df3765bfSSheng // emitFieldFromInstruction - Emit the templated helper function 2247*df3765bfSSheng // fieldFromInstruction(). 2248*df3765bfSSheng // On Windows we make sure that this function is not inlined when 2249*df3765bfSSheng // using the VS compiler. It has a bug which causes the function 2250*df3765bfSSheng // to be optimized out in some circustances. See llvm.org/pr38292 2251*df3765bfSSheng static void emitFieldFromInstruction(formatted_raw_ostream &OS) { 2252*df3765bfSSheng OS << "// Helper functions for extracting fields from encoded instructions.\n" 2253*df3765bfSSheng << "// InsnType must either be integral or an APInt-like object that " 2254*df3765bfSSheng "must:\n" 2255*df3765bfSSheng << "// * be default-constructible and copy-constructible\n" 2256*df3765bfSSheng << "// * be constructible from a uint64_t\n" 2257*df3765bfSSheng << "// * be constructible from an APInt (this can be private)\n" 2258*df3765bfSSheng << "// * Support insertBits(bits, startBit, numBits)\n" 2259*df3765bfSSheng << "// * Support extractBitsAsZExtValue(numBits, startBit)\n" 2260*df3765bfSSheng << "// * be convertible to bool\n" 2261*df3765bfSSheng << "// * Support the ~, &, ==, and != operators with other objects of " 2262*df3765bfSSheng "the same type\n" 2263*df3765bfSSheng << "// * Support put (<<) to raw_ostream&\n" 2264*df3765bfSSheng << "template <typename InsnType>\n" 2265*df3765bfSSheng << "#if defined(_MSC_VER) && !defined(__clang__)\n" 2266*df3765bfSSheng << "__declspec(noinline)\n" 2267*df3765bfSSheng << "#endif\n" 2268*df3765bfSSheng << "static std::enable_if_t<std::is_integral<InsnType>::value, InsnType>\n" 2269*df3765bfSSheng << "fieldFromInstruction(const InsnType &insn, unsigned startBit,\n" 2270*df3765bfSSheng << " unsigned numBits) {\n" 2271*df3765bfSSheng << " assert(startBit + numBits <= 64 && \"Cannot support >64-bit " 2272*df3765bfSSheng "extractions!\");\n" 2273*df3765bfSSheng << " assert(startBit + numBits <= (sizeof(InsnType) * 8) &&\n" 2274*df3765bfSSheng << " \"Instruction field out of bounds!\");\n" 2275*df3765bfSSheng << " InsnType fieldMask;\n" 2276*df3765bfSSheng << " if (numBits == sizeof(InsnType) * 8)\n" 2277*df3765bfSSheng << " fieldMask = (InsnType)(-1LL);\n" 2278*df3765bfSSheng << " else\n" 2279*df3765bfSSheng << " fieldMask = (((InsnType)1 << numBits) - 1) << startBit;\n" 2280*df3765bfSSheng << " return (insn & fieldMask) >> startBit;\n" 2281*df3765bfSSheng << "}\n" 2282*df3765bfSSheng << "\n" 2283*df3765bfSSheng << "template <typename InsnType>\n" 2284*df3765bfSSheng << "static std::enable_if_t<!std::is_integral<InsnType>::value, " 2285*df3765bfSSheng "uint64_t>\n" 2286*df3765bfSSheng << "fieldFromInstruction(const InsnType &insn, unsigned startBit,\n" 2287*df3765bfSSheng << " unsigned numBits) {\n" 2288*df3765bfSSheng << " return insn.extractBitsAsZExtValue(numBits, startBit);\n" 2289*df3765bfSSheng << "}\n\n"; 2290*df3765bfSSheng } 2291*df3765bfSSheng 2292*df3765bfSSheng // emitInsertBits - Emit the templated helper function insertBits(). 2293*df3765bfSSheng static void emitInsertBits(formatted_raw_ostream &OS) { 2294*df3765bfSSheng OS << "// Helper function for inserting bits extracted from an encoded " 2295*df3765bfSSheng "instruction into\n" 2296*df3765bfSSheng << "// a field.\n" 2297*df3765bfSSheng << "template <typename InsnType>\n" 2298*df3765bfSSheng << "static std::enable_if_t<std::is_integral<InsnType>::value>\n" 2299*df3765bfSSheng << "insertBits(InsnType &field, InsnType bits, unsigned startBit, " 2300*df3765bfSSheng "unsigned numBits) {\n" 2301*df3765bfSSheng << " assert(startBit + numBits <= sizeof field * 8);\n" 2302*df3765bfSSheng << " field |= (InsnType)bits << startBit;\n" 2303*df3765bfSSheng << "}\n" 2304*df3765bfSSheng << "\n" 2305*df3765bfSSheng << "template <typename InsnType>\n" 2306*df3765bfSSheng << "static std::enable_if_t<!std::is_integral<InsnType>::value>\n" 2307*df3765bfSSheng << "insertBits(InsnType &field, uint64_t bits, unsigned startBit, " 2308*df3765bfSSheng "unsigned numBits) {\n" 2309*df3765bfSSheng << " field.insertBits(bits, startBit, numBits);\n" 2310*df3765bfSSheng << "}\n\n"; 2311*df3765bfSSheng } 2312*df3765bfSSheng 2313*df3765bfSSheng // emitDecodeInstruction - Emit the templated helper function 2314*df3765bfSSheng // decodeInstruction(). 2315*df3765bfSSheng static void emitDecodeInstruction(formatted_raw_ostream &OS, 2316*df3765bfSSheng bool IsVarLenInst) { 2317*df3765bfSSheng OS << "template <typename InsnType>\n" 2318*df3765bfSSheng << "static DecodeStatus decodeInstruction(const uint8_t DecodeTable[], " 2319*df3765bfSSheng "MCInst &MI,\n" 2320*df3765bfSSheng << " InsnType insn, uint64_t " 2321*df3765bfSSheng "Address,\n" 2322*df3765bfSSheng << " const MCDisassembler *DisAsm,\n" 2323*df3765bfSSheng << " const MCSubtargetInfo &STI"; 2324*df3765bfSSheng if (IsVarLenInst) { 2325*df3765bfSSheng OS << ",\n" 2326*df3765bfSSheng << " llvm::function_ref<void(APInt " 2327*df3765bfSSheng "&," 2328*df3765bfSSheng << " uint64_t)> makeUp"; 2329*df3765bfSSheng } 2330*df3765bfSSheng OS << ") {\n" 2331*df3765bfSSheng << " const FeatureBitset &Bits = STI.getFeatureBits();\n" 2332*df3765bfSSheng << "\n" 2333*df3765bfSSheng << " const uint8_t *Ptr = DecodeTable;\n" 2334*df3765bfSSheng << " uint64_t CurFieldValue = 0;\n" 2335*df3765bfSSheng << " DecodeStatus S = MCDisassembler::Success;\n" 2336*df3765bfSSheng << " while (true) {\n" 2337*df3765bfSSheng << " ptrdiff_t Loc = Ptr - DecodeTable;\n" 2338*df3765bfSSheng << " switch (*Ptr) {\n" 2339*df3765bfSSheng << " default:\n" 2340*df3765bfSSheng << " errs() << Loc << \": Unexpected decode table opcode!\\n\";\n" 2341*df3765bfSSheng << " return MCDisassembler::Fail;\n" 2342*df3765bfSSheng << " case MCD::OPC_ExtractField: {\n" 2343*df3765bfSSheng << " unsigned Start = *++Ptr;\n" 2344*df3765bfSSheng << " unsigned Len = *++Ptr;\n" 2345*df3765bfSSheng << " ++Ptr;\n"; 2346*df3765bfSSheng if (IsVarLenInst) 2347*df3765bfSSheng OS << " makeUp(insn, Start + Len);\n"; 2348*df3765bfSSheng OS << " CurFieldValue = fieldFromInstruction(insn, Start, Len);\n" 2349*df3765bfSSheng << " LLVM_DEBUG(dbgs() << Loc << \": OPC_ExtractField(\" << Start << " 2350*df3765bfSSheng "\", \"\n" 2351*df3765bfSSheng << " << Len << \"): \" << CurFieldValue << \"\\n\");\n" 2352*df3765bfSSheng << " break;\n" 2353*df3765bfSSheng << " }\n" 2354*df3765bfSSheng << " case MCD::OPC_FilterValue: {\n" 2355*df3765bfSSheng << " // Decode the field value.\n" 2356*df3765bfSSheng << " unsigned Len;\n" 2357*df3765bfSSheng << " uint64_t Val = decodeULEB128(++Ptr, &Len);\n" 2358*df3765bfSSheng << " Ptr += Len;\n" 2359*df3765bfSSheng << " // NumToSkip is a plain 24-bit integer.\n" 2360*df3765bfSSheng << " unsigned NumToSkip = *Ptr++;\n" 2361*df3765bfSSheng << " NumToSkip |= (*Ptr++) << 8;\n" 2362*df3765bfSSheng << " NumToSkip |= (*Ptr++) << 16;\n" 2363*df3765bfSSheng << "\n" 2364*df3765bfSSheng << " // Perform the filter operation.\n" 2365*df3765bfSSheng << " if (Val != CurFieldValue)\n" 2366*df3765bfSSheng << " Ptr += NumToSkip;\n" 2367*df3765bfSSheng << " LLVM_DEBUG(dbgs() << Loc << \": OPC_FilterValue(\" << Val << " 2368*df3765bfSSheng "\", \" << NumToSkip\n" 2369*df3765bfSSheng << " << \"): \" << ((Val != CurFieldValue) ? \"FAIL:\" " 2370*df3765bfSSheng ": \"PASS:\")\n" 2371*df3765bfSSheng << " << \" continuing at \" << (Ptr - DecodeTable) << " 2372*df3765bfSSheng "\"\\n\");\n" 2373*df3765bfSSheng << "\n" 2374*df3765bfSSheng << " break;\n" 2375*df3765bfSSheng << " }\n" 2376*df3765bfSSheng << " case MCD::OPC_CheckField: {\n" 2377*df3765bfSSheng << " unsigned Start = *++Ptr;\n" 2378*df3765bfSSheng << " unsigned Len = *++Ptr;\n"; 2379*df3765bfSSheng if (IsVarLenInst) 2380*df3765bfSSheng OS << " makeUp(insn, Start + Len);\n"; 2381*df3765bfSSheng OS << " uint64_t FieldValue = fieldFromInstruction(insn, Start, Len);\n" 2382*df3765bfSSheng << " // Decode the field value.\n" 2383*df3765bfSSheng << " unsigned PtrLen = 0;\n" 2384*df3765bfSSheng << " uint64_t ExpectedValue = decodeULEB128(++Ptr, &PtrLen);\n" 2385*df3765bfSSheng << " Ptr += PtrLen;\n" 2386*df3765bfSSheng << " // NumToSkip is a plain 24-bit integer.\n" 2387*df3765bfSSheng << " unsigned NumToSkip = *Ptr++;\n" 2388*df3765bfSSheng << " NumToSkip |= (*Ptr++) << 8;\n" 2389*df3765bfSSheng << " NumToSkip |= (*Ptr++) << 16;\n" 2390*df3765bfSSheng << "\n" 2391*df3765bfSSheng << " // If the actual and expected values don't match, skip.\n" 2392*df3765bfSSheng << " if (ExpectedValue != FieldValue)\n" 2393*df3765bfSSheng << " Ptr += NumToSkip;\n" 2394*df3765bfSSheng << " LLVM_DEBUG(dbgs() << Loc << \": OPC_CheckField(\" << Start << " 2395*df3765bfSSheng "\", \"\n" 2396*df3765bfSSheng << " << Len << \", \" << ExpectedValue << \", \" << " 2397*df3765bfSSheng "NumToSkip\n" 2398*df3765bfSSheng << " << \"): FieldValue = \" << FieldValue << \", " 2399*df3765bfSSheng "ExpectedValue = \"\n" 2400*df3765bfSSheng << " << ExpectedValue << \": \"\n" 2401*df3765bfSSheng << " << ((ExpectedValue == FieldValue) ? \"PASS\\n\" : " 2402*df3765bfSSheng "\"FAIL\\n\"));\n" 2403*df3765bfSSheng << " break;\n" 2404*df3765bfSSheng << " }\n" 2405*df3765bfSSheng << " case MCD::OPC_CheckPredicate: {\n" 2406*df3765bfSSheng << " unsigned Len;\n" 2407*df3765bfSSheng << " // Decode the Predicate Index value.\n" 2408*df3765bfSSheng << " unsigned PIdx = decodeULEB128(++Ptr, &Len);\n" 2409*df3765bfSSheng << " Ptr += Len;\n" 2410*df3765bfSSheng << " // NumToSkip is a plain 24-bit integer.\n" 2411*df3765bfSSheng << " unsigned NumToSkip = *Ptr++;\n" 2412*df3765bfSSheng << " NumToSkip |= (*Ptr++) << 8;\n" 2413*df3765bfSSheng << " NumToSkip |= (*Ptr++) << 16;\n" 2414*df3765bfSSheng << " // Check the predicate.\n" 2415*df3765bfSSheng << " bool Pred;\n" 2416*df3765bfSSheng << " if (!(Pred = checkDecoderPredicate(PIdx, Bits)))\n" 2417*df3765bfSSheng << " Ptr += NumToSkip;\n" 2418*df3765bfSSheng << " (void)Pred;\n" 2419*df3765bfSSheng << " LLVM_DEBUG(dbgs() << Loc << \": OPC_CheckPredicate(\" << PIdx " 2420*df3765bfSSheng "<< \"): \"\n" 2421*df3765bfSSheng << " << (Pred ? \"PASS\\n\" : \"FAIL\\n\"));\n" 2422*df3765bfSSheng << "\n" 2423*df3765bfSSheng << " break;\n" 2424*df3765bfSSheng << " }\n" 2425*df3765bfSSheng << " case MCD::OPC_Decode: {\n" 2426*df3765bfSSheng << " unsigned Len;\n" 2427*df3765bfSSheng << " // Decode the Opcode value.\n" 2428*df3765bfSSheng << " unsigned Opc = decodeULEB128(++Ptr, &Len);\n" 2429*df3765bfSSheng << " Ptr += Len;\n" 2430*df3765bfSSheng << " unsigned DecodeIdx = decodeULEB128(Ptr, &Len);\n" 2431*df3765bfSSheng << " Ptr += Len;\n" 2432*df3765bfSSheng << "\n" 2433*df3765bfSSheng << " MI.clear();\n" 2434*df3765bfSSheng << " MI.setOpcode(Opc);\n" 2435*df3765bfSSheng << " bool DecodeComplete;\n"; 2436*df3765bfSSheng if (IsVarLenInst) { 2437*df3765bfSSheng OS << " Len = InstrLenTable[Opc];\n" 2438*df3765bfSSheng << " makeUp(insn, Len);\n"; 2439*df3765bfSSheng } 2440*df3765bfSSheng OS << " S = decodeToMCInst(S, DecodeIdx, insn, MI, Address, DisAsm, " 2441*df3765bfSSheng "DecodeComplete);\n" 2442*df3765bfSSheng << " assert(DecodeComplete);\n" 2443*df3765bfSSheng << "\n" 2444*df3765bfSSheng << " LLVM_DEBUG(dbgs() << Loc << \": OPC_Decode: opcode \" << Opc\n" 2445*df3765bfSSheng << " << \", using decoder \" << DecodeIdx << \": \"\n" 2446*df3765bfSSheng << " << (S != MCDisassembler::Fail ? \"PASS\" : " 2447*df3765bfSSheng "\"FAIL\") << \"\\n\");\n" 2448*df3765bfSSheng << " return S;\n" 2449*df3765bfSSheng << " }\n" 2450*df3765bfSSheng << " case MCD::OPC_TryDecode: {\n" 2451*df3765bfSSheng << " unsigned Len;\n" 2452*df3765bfSSheng << " // Decode the Opcode value.\n" 2453*df3765bfSSheng << " unsigned Opc = decodeULEB128(++Ptr, &Len);\n" 2454*df3765bfSSheng << " Ptr += Len;\n" 2455*df3765bfSSheng << " unsigned DecodeIdx = decodeULEB128(Ptr, &Len);\n" 2456*df3765bfSSheng << " Ptr += Len;\n" 2457*df3765bfSSheng << " // NumToSkip is a plain 24-bit integer.\n" 2458*df3765bfSSheng << " unsigned NumToSkip = *Ptr++;\n" 2459*df3765bfSSheng << " NumToSkip |= (*Ptr++) << 8;\n" 2460*df3765bfSSheng << " NumToSkip |= (*Ptr++) << 16;\n" 2461*df3765bfSSheng << "\n" 2462*df3765bfSSheng << " // Perform the decode operation.\n" 2463*df3765bfSSheng << " MCInst TmpMI;\n" 2464*df3765bfSSheng << " TmpMI.setOpcode(Opc);\n" 2465*df3765bfSSheng << " bool DecodeComplete;\n" 2466*df3765bfSSheng << " S = decodeToMCInst(S, DecodeIdx, insn, TmpMI, Address, DisAsm, " 2467*df3765bfSSheng "DecodeComplete);\n" 2468*df3765bfSSheng << " LLVM_DEBUG(dbgs() << Loc << \": OPC_TryDecode: opcode \" << " 2469*df3765bfSSheng "Opc\n" 2470*df3765bfSSheng << " << \", using decoder \" << DecodeIdx << \": \");\n" 2471*df3765bfSSheng << "\n" 2472*df3765bfSSheng << " if (DecodeComplete) {\n" 2473*df3765bfSSheng << " // Decoding complete.\n" 2474*df3765bfSSheng << " LLVM_DEBUG(dbgs() << (S != MCDisassembler::Fail ? \"PASS\" : " 2475*df3765bfSSheng "\"FAIL\") << \"\\n\");\n" 2476*df3765bfSSheng << " MI = TmpMI;\n" 2477*df3765bfSSheng << " return S;\n" 2478*df3765bfSSheng << " } else {\n" 2479*df3765bfSSheng << " assert(S == MCDisassembler::Fail);\n" 2480*df3765bfSSheng << " // If the decoding was incomplete, skip.\n" 2481*df3765bfSSheng << " Ptr += NumToSkip;\n" 2482*df3765bfSSheng << " LLVM_DEBUG(dbgs() << \"FAIL: continuing at \" << (Ptr - " 2483*df3765bfSSheng "DecodeTable) << \"\\n\");\n" 2484*df3765bfSSheng << " // Reset decode status. This also drops a SoftFail status " 2485*df3765bfSSheng "that could be\n" 2486*df3765bfSSheng << " // set before the decode attempt.\n" 2487*df3765bfSSheng << " S = MCDisassembler::Success;\n" 2488*df3765bfSSheng << " }\n" 2489*df3765bfSSheng << " break;\n" 2490*df3765bfSSheng << " }\n" 2491*df3765bfSSheng << " case MCD::OPC_SoftFail: {\n" 2492*df3765bfSSheng << " // Decode the mask values.\n" 2493*df3765bfSSheng << " unsigned Len;\n" 2494*df3765bfSSheng << " uint64_t PositiveMask = decodeULEB128(++Ptr, &Len);\n" 2495*df3765bfSSheng << " Ptr += Len;\n" 2496*df3765bfSSheng << " uint64_t NegativeMask = decodeULEB128(Ptr, &Len);\n" 2497*df3765bfSSheng << " Ptr += Len;\n" 2498*df3765bfSSheng << " bool Fail = (insn & PositiveMask) != 0 || (~insn & " 2499*df3765bfSSheng "NegativeMask) != 0;\n" 2500*df3765bfSSheng << " if (Fail)\n" 2501*df3765bfSSheng << " S = MCDisassembler::SoftFail;\n" 2502*df3765bfSSheng << " LLVM_DEBUG(dbgs() << Loc << \": OPC_SoftFail: \" << (Fail ? " 2503*df3765bfSSheng "\"FAIL\\n\" : \"PASS\\n\"));\n" 2504*df3765bfSSheng << " break;\n" 2505*df3765bfSSheng << " }\n" 2506*df3765bfSSheng << " case MCD::OPC_Fail: {\n" 2507*df3765bfSSheng << " LLVM_DEBUG(dbgs() << Loc << \": OPC_Fail\\n\");\n" 2508*df3765bfSSheng << " return MCDisassembler::Fail;\n" 2509*df3765bfSSheng << " }\n" 2510*df3765bfSSheng << " }\n" 2511*df3765bfSSheng << " }\n" 2512*df3765bfSSheng << " llvm_unreachable(\"bogosity detected in disassembler state " 2513*df3765bfSSheng "machine!\");\n" 2514*df3765bfSSheng << "}\n\n"; 2515*df3765bfSSheng } 2516*df3765bfSSheng 2517*df3765bfSSheng // Emits disassembler code for instruction decoding. 2518*df3765bfSSheng void DecoderEmitter::run(raw_ostream &o) { 2519*df3765bfSSheng formatted_raw_ostream OS(o); 2520*df3765bfSSheng OS << "#include \"llvm/MC/MCInst.h\"\n"; 2521*df3765bfSSheng OS << "#include \"llvm/MC/MCSubtargetInfo.h\"\n"; 2522*df3765bfSSheng OS << "#include \"llvm/MC/SubtargetFeature.h\"\n"; 2523*df3765bfSSheng OS << "#include \"llvm/Support/DataTypes.h\"\n"; 2524*df3765bfSSheng OS << "#include \"llvm/Support/Debug.h\"\n"; 2525*df3765bfSSheng OS << "#include \"llvm/Support/LEB128.h\"\n"; 2526*df3765bfSSheng OS << "#include \"llvm/Support/raw_ostream.h\"\n"; 2527*df3765bfSSheng OS << "#include <assert.h>\n"; 2528*df3765bfSSheng OS << '\n'; 2529*df3765bfSSheng OS << "namespace llvm {\n\n"; 2530*df3765bfSSheng 2531*df3765bfSSheng emitFieldFromInstruction(OS); 2532*df3765bfSSheng emitInsertBits(OS); 2533*df3765bfSSheng 2534*df3765bfSSheng Target.reverseBitsForLittleEndianEncoding(); 2535*df3765bfSSheng 2536*df3765bfSSheng // Parameterize the decoders based on namespace and instruction width. 2537*df3765bfSSheng std::set<StringRef> HwModeNames; 2538*df3765bfSSheng const auto &NumberedInstructions = Target.getInstructionsByEnumValue(); 2539*df3765bfSSheng NumberedEncodings.reserve(NumberedInstructions.size()); 2540*df3765bfSSheng DenseMap<Record *, unsigned> IndexOfInstruction; 2541*df3765bfSSheng // First, collect all HwModes referenced by the target. 2542*df3765bfSSheng for (const auto &NumberedInstruction : NumberedInstructions) { 2543*df3765bfSSheng IndexOfInstruction[NumberedInstruction->TheDef] = NumberedEncodings.size(); 2544*df3765bfSSheng 2545*df3765bfSSheng if (const RecordVal *RV = 2546*df3765bfSSheng NumberedInstruction->TheDef->getValue("EncodingInfos")) { 2547*df3765bfSSheng if (auto *DI = dyn_cast_or_null<DefInit>(RV->getValue())) { 2548*df3765bfSSheng const CodeGenHwModes &HWM = Target.getHwModes(); 2549*df3765bfSSheng EncodingInfoByHwMode EBM(DI->getDef(), HWM); 2550*df3765bfSSheng for (auto &KV : EBM) 2551*df3765bfSSheng HwModeNames.insert(HWM.getMode(KV.first).Name); 2552*df3765bfSSheng } 2553*df3765bfSSheng } 2554*df3765bfSSheng } 2555*df3765bfSSheng 2556*df3765bfSSheng // If HwModeNames is empty, add the empty string so we always have one HwMode. 2557*df3765bfSSheng if (HwModeNames.empty()) 2558*df3765bfSSheng HwModeNames.insert(""); 2559*df3765bfSSheng 2560*df3765bfSSheng for (const auto &NumberedInstruction : NumberedInstructions) { 2561*df3765bfSSheng IndexOfInstruction[NumberedInstruction->TheDef] = NumberedEncodings.size(); 2562*df3765bfSSheng 2563*df3765bfSSheng if (const RecordVal *RV = 2564*df3765bfSSheng NumberedInstruction->TheDef->getValue("EncodingInfos")) { 2565*df3765bfSSheng if (DefInit *DI = dyn_cast_or_null<DefInit>(RV->getValue())) { 2566*df3765bfSSheng const CodeGenHwModes &HWM = Target.getHwModes(); 2567*df3765bfSSheng EncodingInfoByHwMode EBM(DI->getDef(), HWM); 2568*df3765bfSSheng for (auto &KV : EBM) { 2569*df3765bfSSheng NumberedEncodings.emplace_back(KV.second, NumberedInstruction, 2570*df3765bfSSheng HWM.getMode(KV.first).Name); 2571*df3765bfSSheng HwModeNames.insert(HWM.getMode(KV.first).Name); 2572*df3765bfSSheng } 2573*df3765bfSSheng continue; 2574*df3765bfSSheng } 2575*df3765bfSSheng } 2576*df3765bfSSheng // This instruction is encoded the same on all HwModes. Emit it for all 2577*df3765bfSSheng // HwModes. 2578*df3765bfSSheng for (StringRef HwModeName : HwModeNames) 2579*df3765bfSSheng NumberedEncodings.emplace_back(NumberedInstruction->TheDef, 2580*df3765bfSSheng NumberedInstruction, HwModeName); 2581*df3765bfSSheng } 2582*df3765bfSSheng for (const auto &NumberedAlias : RK.getAllDerivedDefinitions("AdditionalEncoding")) 2583*df3765bfSSheng NumberedEncodings.emplace_back( 2584*df3765bfSSheng NumberedAlias, 2585*df3765bfSSheng &Target.getInstruction(NumberedAlias->getValueAsDef("AliasOf"))); 2586*df3765bfSSheng 2587*df3765bfSSheng std::map<std::pair<std::string, unsigned>, std::vector<EncodingIDAndOpcode>> 2588*df3765bfSSheng OpcMap; 2589*df3765bfSSheng std::map<unsigned, std::vector<OperandInfo>> Operands; 2590*df3765bfSSheng std::vector<unsigned> InstrLen; 2591*df3765bfSSheng 2592*df3765bfSSheng bool IsVarLenInst = 2593*df3765bfSSheng any_of(NumberedInstructions, [](const CodeGenInstruction *CGI) { 2594*df3765bfSSheng RecordVal *RV = CGI->TheDef->getValue("Inst"); 2595*df3765bfSSheng return RV && isa<DagInit>(RV->getValue()); 2596*df3765bfSSheng }); 2597*df3765bfSSheng unsigned MaxInstLen = 0; 2598*df3765bfSSheng 2599*df3765bfSSheng for (unsigned i = 0; i < NumberedEncodings.size(); ++i) { 2600*df3765bfSSheng const Record *EncodingDef = NumberedEncodings[i].EncodingDef; 2601*df3765bfSSheng const CodeGenInstruction *Inst = NumberedEncodings[i].Inst; 2602*df3765bfSSheng const Record *Def = Inst->TheDef; 2603*df3765bfSSheng unsigned Size = EncodingDef->getValueAsInt("Size"); 2604*df3765bfSSheng if (Def->getValueAsString("Namespace") == "TargetOpcode" || 2605*df3765bfSSheng Def->getValueAsBit("isPseudo") || 2606*df3765bfSSheng Def->getValueAsBit("isAsmParserOnly") || 2607*df3765bfSSheng Def->getValueAsBit("isCodeGenOnly")) { 2608*df3765bfSSheng NumEncodingsLackingDisasm++; 2609*df3765bfSSheng continue; 2610*df3765bfSSheng } 2611*df3765bfSSheng 2612*df3765bfSSheng if (i < NumberedInstructions.size()) 2613*df3765bfSSheng NumInstructions++; 2614*df3765bfSSheng NumEncodings++; 2615*df3765bfSSheng 2616*df3765bfSSheng if (!Size && !IsVarLenInst) 2617*df3765bfSSheng continue; 2618*df3765bfSSheng 2619*df3765bfSSheng if (IsVarLenInst) 2620*df3765bfSSheng InstrLen.resize(NumberedInstructions.size(), 0); 2621*df3765bfSSheng 2622*df3765bfSSheng if (unsigned Len = populateInstruction(Target, *EncodingDef, *Inst, i, 2623*df3765bfSSheng Operands, IsVarLenInst)) { 2624*df3765bfSSheng if (IsVarLenInst) { 2625*df3765bfSSheng MaxInstLen = std::max(MaxInstLen, Len); 2626*df3765bfSSheng InstrLen[i] = Len; 2627*df3765bfSSheng } 2628*df3765bfSSheng std::string DecoderNamespace = 2629*df3765bfSSheng std::string(EncodingDef->getValueAsString("DecoderNamespace")); 2630*df3765bfSSheng if (!NumberedEncodings[i].HwModeName.empty()) 2631*df3765bfSSheng DecoderNamespace += 2632*df3765bfSSheng std::string("_") + NumberedEncodings[i].HwModeName.str(); 2633*df3765bfSSheng OpcMap[std::make_pair(DecoderNamespace, Size)].emplace_back( 2634*df3765bfSSheng i, IndexOfInstruction.find(Def)->second); 2635*df3765bfSSheng } else { 2636*df3765bfSSheng NumEncodingsOmitted++; 2637*df3765bfSSheng } 2638*df3765bfSSheng } 2639*df3765bfSSheng 2640*df3765bfSSheng DecoderTableInfo TableInfo; 2641*df3765bfSSheng for (const auto &Opc : OpcMap) { 2642*df3765bfSSheng // Emit the decoder for this namespace+width combination. 2643*df3765bfSSheng ArrayRef<EncodingAndInst> NumberedEncodingsRef( 2644*df3765bfSSheng NumberedEncodings.data(), NumberedEncodings.size()); 2645*df3765bfSSheng FilterChooser FC(NumberedEncodingsRef, Opc.second, Operands, 2646*df3765bfSSheng IsVarLenInst ? MaxInstLen : 8 * Opc.first.second, this); 2647*df3765bfSSheng 2648*df3765bfSSheng // The decode table is cleared for each top level decoder function. The 2649*df3765bfSSheng // predicates and decoders themselves, however, are shared across all 2650*df3765bfSSheng // decoders to give more opportunities for uniqueing. 2651*df3765bfSSheng TableInfo.Table.clear(); 2652*df3765bfSSheng TableInfo.FixupStack.clear(); 2653*df3765bfSSheng TableInfo.Table.reserve(16384); 2654*df3765bfSSheng TableInfo.FixupStack.emplace_back(); 2655*df3765bfSSheng FC.emitTableEntries(TableInfo); 2656*df3765bfSSheng // Any NumToSkip fixups in the top level scope can resolve to the 2657*df3765bfSSheng // OPC_Fail at the end of the table. 2658*df3765bfSSheng assert(TableInfo.FixupStack.size() == 1 && "fixup stack phasing error!"); 2659*df3765bfSSheng // Resolve any NumToSkip fixups in the current scope. 2660*df3765bfSSheng resolveTableFixups(TableInfo.Table, TableInfo.FixupStack.back(), 2661*df3765bfSSheng TableInfo.Table.size()); 2662*df3765bfSSheng TableInfo.FixupStack.clear(); 2663*df3765bfSSheng 2664*df3765bfSSheng TableInfo.Table.push_back(MCD::OPC_Fail); 2665*df3765bfSSheng 2666*df3765bfSSheng // Print the table to the output stream. 2667*df3765bfSSheng emitTable(OS, TableInfo.Table, 0, FC.getBitWidth(), Opc.first.first); 2668*df3765bfSSheng OS.flush(); 2669*df3765bfSSheng } 2670*df3765bfSSheng 2671*df3765bfSSheng // For variable instruction, we emit a instruction length table 2672*df3765bfSSheng // to let the decoder know how long the instructions are. 2673*df3765bfSSheng // You can see example usage in M68k's disassembler. 2674*df3765bfSSheng if (IsVarLenInst) 2675*df3765bfSSheng emitInstrLenTable(OS, InstrLen); 2676*df3765bfSSheng // Emit the predicate function. 2677*df3765bfSSheng emitPredicateFunction(OS, TableInfo.Predicates, 0); 2678*df3765bfSSheng 2679*df3765bfSSheng // Emit the decoder function. 2680*df3765bfSSheng emitDecoderFunction(OS, TableInfo.Decoders, 0); 2681*df3765bfSSheng 2682*df3765bfSSheng // Emit the main entry point for the decoder, decodeInstruction(). 2683*df3765bfSSheng emitDecodeInstruction(OS, IsVarLenInst); 2684*df3765bfSSheng 2685*df3765bfSSheng OS << "\n} // end namespace llvm\n"; 2686*df3765bfSSheng } 2687*df3765bfSSheng 2688*df3765bfSSheng namespace llvm { 2689*df3765bfSSheng 2690*df3765bfSSheng void EmitDecoder(RecordKeeper &RK, raw_ostream &OS, 2691*df3765bfSSheng const std::string &PredicateNamespace, 2692*df3765bfSSheng const std::string &GPrefix, const std::string &GPostfix, 2693*df3765bfSSheng const std::string &ROK, const std::string &RFail, 2694*df3765bfSSheng const std::string &L) { 2695*df3765bfSSheng DecoderEmitter(RK, PredicateNamespace, GPrefix, GPostfix, ROK, RFail, L) 2696*df3765bfSSheng .run(OS); 2697*df3765bfSSheng } 2698*df3765bfSSheng 2699*df3765bfSSheng } // end namespace llvm 2700