xref: /llvm-project/llvm/utils/TableGen/CodeEmitterGen.cpp (revision 4e8c9d28132039a98feb97cec2759cddeb37d934)
1 //===- CodeEmitterGen.cpp - Code Emitter Generator ------------------------===//
2 //
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 //
7 //===----------------------------------------------------------------------===//
8 //
9 // CodeEmitterGen uses the descriptions of instructions and their fields to
10 // construct an automated code emitter: a function called
11 // getBinaryCodeForInstr() that, given a MCInst, returns the value of the
12 // instruction - either as an uint64_t or as an APInt, depending on the
13 // maximum bit width of all Inst definitions.
14 //
15 // In addition, it generates another function called getOperandBitOffset()
16 // that, given a MCInst and an operand index, returns the minimum of indices of
17 // all bits that carry some portion of the respective operand. When the target's
18 // encodeInstruction() stores the instruction in a little-endian byte order, the
19 // returned value is the offset of the start of the operand in the encoded
20 // instruction. Other targets might need to adjust the returned value according
21 // to their encodeInstruction() implementation.
22 //
23 //===----------------------------------------------------------------------===//
24 
25 #include "Common/CodeGenHwModes.h"
26 #include "Common/CodeGenInstruction.h"
27 #include "Common/CodeGenTarget.h"
28 #include "Common/InfoByHwMode.h"
29 #include "Common/VarLenCodeEmitterGen.h"
30 #include "llvm/ADT/APInt.h"
31 #include "llvm/ADT/ArrayRef.h"
32 #include "llvm/ADT/StringExtras.h"
33 #include "llvm/Support/Casting.h"
34 #include "llvm/Support/raw_ostream.h"
35 #include "llvm/TableGen/Error.h"
36 #include "llvm/TableGen/Record.h"
37 #include "llvm/TableGen/TableGenBackend.h"
38 #include <cstdint>
39 #include <map>
40 #include <set>
41 #include <string>
42 #include <utility>
43 #include <vector>
44 
45 using namespace llvm;
46 
47 namespace {
48 
49 class CodeEmitterGen {
50   const RecordKeeper &Records;
51 
52 public:
53   CodeEmitterGen(const RecordKeeper &R) : Records(R) {}
54 
55   void run(raw_ostream &O);
56 
57 private:
58   int getVariableBit(const std::string &VarName, const BitsInit *BI, int Bit);
59   std::pair<std::string, std::string>
60   getInstructionCases(const Record *R, const CodeGenTarget &Target);
61   void addInstructionCasesForEncoding(const Record *R,
62                                       const Record *EncodingDef,
63                                       const CodeGenTarget &Target,
64                                       std::string &Case,
65                                       std::string &BitOffsetCase);
66   bool addCodeToMergeInOperand(const Record *R, const BitsInit *BI,
67                                const std::string &VarName, std::string &Case,
68                                std::string &BitOffsetCase,
69                                const CodeGenTarget &Target);
70 
71   void emitInstructionBaseValues(
72       raw_ostream &O, ArrayRef<const CodeGenInstruction *> NumberedInstructions,
73       const CodeGenTarget &Target, unsigned HwMode = DefaultMode);
74   void
75   emitCaseMap(raw_ostream &O,
76               const std::map<std::string, std::vector<std::string>> &CaseMap);
77   unsigned BitWidth = 0u;
78   bool UseAPInt = false;
79 };
80 
81 // If the VarBitInit at position 'bit' matches the specified variable then
82 // return the variable bit position.  Otherwise return -1.
83 int CodeEmitterGen::getVariableBit(const std::string &VarName,
84                                    const BitsInit *BI, int Bit) {
85   if (const VarBitInit *VBI = dyn_cast<VarBitInit>(BI->getBit(Bit))) {
86     if (const VarInit *VI = dyn_cast<VarInit>(VBI->getBitVar()))
87       if (VI->getName() == VarName)
88         return VBI->getBitNum();
89   } else if (const VarInit *VI = dyn_cast<VarInit>(BI->getBit(Bit))) {
90     if (VI->getName() == VarName)
91       return 0;
92   }
93 
94   return -1;
95 }
96 
97 // Returns true if it succeeds, false if an error.
98 bool CodeEmitterGen::addCodeToMergeInOperand(const Record *R,
99                                              const BitsInit *BI,
100                                              const std::string &VarName,
101                                              std::string &Case,
102                                              std::string &BitOffsetCase,
103                                              const CodeGenTarget &Target) {
104   CodeGenInstruction &CGI = Target.getInstruction(R);
105 
106   // Determine if VarName actually contributes to the Inst encoding.
107   int Bit = BI->getNumBits() - 1;
108 
109   // Scan for a bit that this contributed to.
110   for (; Bit >= 0;) {
111     if (getVariableBit(VarName, BI, Bit) != -1)
112       break;
113 
114     --Bit;
115   }
116 
117   // If we found no bits, ignore this value, otherwise emit the call to get the
118   // operand encoding.
119   if (Bit < 0)
120     return true;
121 
122   // If the operand matches by name, reference according to that
123   // operand number. Non-matching operands are assumed to be in
124   // order.
125   unsigned OpIdx;
126   std::pair<unsigned, unsigned> SubOp;
127   if (CGI.Operands.hasSubOperandAlias(VarName, SubOp)) {
128     OpIdx = CGI.Operands[SubOp.first].MIOperandNo + SubOp.second;
129   } else if (CGI.Operands.hasOperandNamed(VarName, OpIdx)) {
130     // Get the machine operand number for the indicated operand.
131     OpIdx = CGI.Operands[OpIdx].MIOperandNo;
132   } else {
133     PrintError(R, Twine("No operand named ") + VarName + " in record " +
134                       R->getName());
135     return false;
136   }
137 
138   if (CGI.Operands.isFlatOperandNotEmitted(OpIdx)) {
139     PrintError(R,
140                "Operand " + VarName + " used but also marked as not emitted!");
141     return false;
142   }
143 
144   std::pair<unsigned, unsigned> SO = CGI.Operands.getSubOperandNumber(OpIdx);
145   std::string &EncoderMethodName =
146       CGI.Operands[SO.first].EncoderMethodNames[SO.second];
147 
148   if (UseAPInt)
149     Case += "      op.clearAllBits();\n";
150 
151   Case += "      // op: " + VarName + "\n";
152 
153   // If the source operand has a custom encoder, use it.
154   if (!EncoderMethodName.empty()) {
155     if (UseAPInt) {
156       Case += "      " + EncoderMethodName + "(MI, " + utostr(OpIdx);
157       Case += ", op";
158     } else {
159       Case += "      op = " + EncoderMethodName + "(MI, " + utostr(OpIdx);
160     }
161     Case += ", Fixups, STI);\n";
162   } else {
163     if (UseAPInt) {
164       Case +=
165           "      getMachineOpValue(MI, MI.getOperand(" + utostr(OpIdx) + ")";
166       Case += ", op, Fixups, STI";
167     } else {
168       Case += "      op = getMachineOpValue(MI, MI.getOperand(" +
169               utostr(OpIdx) + ")";
170       Case += ", Fixups, STI";
171     }
172     Case += ");\n";
173   }
174 
175   // Precalculate the number of lits this variable contributes to in the
176   // operand. If there is a single lit (consecutive range of bits) we can use a
177   // destructive sequence on APInt that reduces memory allocations.
178   int NumOperandLits = 0;
179   for (int TmpBit = Bit; TmpBit >= 0;) {
180     int VarBit = getVariableBit(VarName, BI, TmpBit);
181 
182     // If this bit isn't from a variable, skip it.
183     if (VarBit == -1) {
184       --TmpBit;
185       continue;
186     }
187 
188     // Figure out the consecutive range of bits covered by this operand, in
189     // order to generate better encoding code.
190     int BeginVarBit = VarBit;
191     int N = 1;
192     for (--TmpBit; TmpBit >= 0;) {
193       VarBit = getVariableBit(VarName, BI, TmpBit);
194       if (VarBit == -1 || VarBit != (BeginVarBit - N))
195         break;
196       ++N;
197       --TmpBit;
198     }
199     ++NumOperandLits;
200   }
201 
202   unsigned BitOffset = -1;
203   for (; Bit >= 0;) {
204     int VarBit = getVariableBit(VarName, BI, Bit);
205 
206     // If this bit isn't from a variable, skip it.
207     if (VarBit == -1) {
208       --Bit;
209       continue;
210     }
211 
212     // Figure out the consecutive range of bits covered by this operand, in
213     // order to generate better encoding code.
214     int BeginInstBit = Bit;
215     int BeginVarBit = VarBit;
216     int N = 1;
217     for (--Bit; Bit >= 0;) {
218       VarBit = getVariableBit(VarName, BI, Bit);
219       if (VarBit == -1 || VarBit != (BeginVarBit - N))
220         break;
221       ++N;
222       --Bit;
223     }
224 
225     std::string MaskStr;
226     int OpShift;
227 
228     unsigned LoBit = BeginVarBit - N + 1;
229     unsigned HiBit = LoBit + N;
230     unsigned LoInstBit = BeginInstBit - N + 1;
231     BitOffset = LoInstBit;
232     if (UseAPInt) {
233       std::string ExtractStr;
234       if (N >= 64) {
235         ExtractStr = "op.extractBits(" + itostr(HiBit - LoBit) + ", " +
236                      itostr(LoBit) + ")";
237         Case += "      Value.insertBits(" + ExtractStr + ", " +
238                 itostr(LoInstBit) + ");\n";
239       } else {
240         ExtractStr = "op.extractBitsAsZExtValue(" + itostr(HiBit - LoBit) +
241                      ", " + itostr(LoBit) + ")";
242         Case += "      Value.insertBits(" + ExtractStr + ", " +
243                 itostr(LoInstBit) + ", " + itostr(HiBit - LoBit) + ");\n";
244       }
245     } else {
246       uint64_t OpMask = ~(uint64_t)0 >> (64 - N);
247       OpShift = BeginVarBit - N + 1;
248       OpMask <<= OpShift;
249       MaskStr = "UINT64_C(" + utostr(OpMask) + ")";
250       OpShift = BeginInstBit - BeginVarBit;
251 
252       if (NumOperandLits == 1) {
253         Case += "      op &= " + MaskStr + ";\n";
254         if (OpShift > 0) {
255           Case += "      op <<= " + itostr(OpShift) + ";\n";
256         } else if (OpShift < 0) {
257           Case += "      op >>= " + itostr(-OpShift) + ";\n";
258         }
259         Case += "      Value |= op;\n";
260       } else {
261         if (OpShift > 0) {
262           Case += "      Value |= (op & " + MaskStr + ") << " +
263                   itostr(OpShift) + ";\n";
264         } else if (OpShift < 0) {
265           Case += "      Value |= (op & " + MaskStr + ") >> " +
266                   itostr(-OpShift) + ";\n";
267         } else {
268           Case += "      Value |= (op & " + MaskStr + ");\n";
269         }
270       }
271     }
272   }
273 
274   if (BitOffset != (unsigned)-1) {
275     BitOffsetCase += "      case " + utostr(OpIdx) + ":\n";
276     BitOffsetCase += "        // op: " + VarName + "\n";
277     BitOffsetCase += "        return " + utostr(BitOffset) + ";\n";
278   }
279 
280   return true;
281 }
282 
283 std::pair<std::string, std::string>
284 CodeEmitterGen::getInstructionCases(const Record *R,
285                                     const CodeGenTarget &Target) {
286   std::string Case, BitOffsetCase;
287 
288   auto Append = [&](const std::string &S) {
289     Case += S;
290     BitOffsetCase += S;
291   };
292 
293   if (const RecordVal *RV = R->getValue("EncodingInfos")) {
294     if (const auto *DI = dyn_cast_or_null<DefInit>(RV->getValue())) {
295       const CodeGenHwModes &HWM = Target.getHwModes();
296       EncodingInfoByHwMode EBM(DI->getDef(), HWM);
297 
298       // Invoke the interface to obtain the HwMode ID controlling the
299       // EncodingInfo for the current subtarget. This interface will
300       // mask off irrelevant HwMode IDs.
301       Append("      unsigned HwMode = "
302              "STI.getHwMode(MCSubtargetInfo::HwMode_EncodingInfo);\n");
303       Case += "      switch (HwMode) {\n";
304       Case += "      default: llvm_unreachable(\"Unknown hardware mode!\"); "
305               "break;\n";
306       for (auto &[ModeId, Encoding] : EBM) {
307         if (ModeId == DefaultMode) {
308           Case +=
309               "      case " + itostr(DefaultMode) + ": InstBitsByHw = InstBits";
310         } else {
311           Case += "      case " + itostr(ModeId) +
312                   ": InstBitsByHw = InstBits_" +
313                   std::string(HWM.getMode(ModeId).Name);
314         }
315         Case += "; break;\n";
316       }
317       Case += "      };\n";
318 
319       // We need to remodify the 'Inst' value from the table we found above.
320       if (UseAPInt) {
321         int NumWords = APInt::getNumWords(BitWidth);
322         Case += "      Inst = APInt(" + itostr(BitWidth);
323         Case += ", ArrayRef(InstBitsByHw + opcode * " + itostr(NumWords) +
324                 ", " + itostr(NumWords);
325         Case += "));\n";
326         Case += "      Value = Inst;\n";
327       } else {
328         Case += "      Value = InstBitsByHw[opcode];\n";
329       }
330 
331       Append("      switch (HwMode) {\n");
332       Append("      default: llvm_unreachable(\"Unhandled HwMode\");\n");
333       for (auto &[ModeId, Encoding] : EBM) {
334         Append("      case " + itostr(ModeId) + ": {\n");
335         addInstructionCasesForEncoding(R, Encoding, Target, Case,
336                                        BitOffsetCase);
337         Append("      break;\n");
338         Append("      }\n");
339       }
340       Append("      }\n");
341       return {std::move(Case), std::move(BitOffsetCase)};
342     }
343   }
344   addInstructionCasesForEncoding(R, R, Target, Case, BitOffsetCase);
345   return {std::move(Case), std::move(BitOffsetCase)};
346 }
347 
348 void CodeEmitterGen::addInstructionCasesForEncoding(
349     const Record *R, const Record *EncodingDef, const CodeGenTarget &Target,
350     std::string &Case, std::string &BitOffsetCase) {
351   const BitsInit *BI = EncodingDef->getValueAsBitsInit("Inst");
352 
353   // Loop over all of the fields in the instruction, determining which are the
354   // operands to the instruction.
355   bool Success = true;
356   size_t OrigBitOffsetCaseSize = BitOffsetCase.size();
357   BitOffsetCase += "      switch (OpNum) {\n";
358   size_t BitOffsetCaseSizeBeforeLoop = BitOffsetCase.size();
359   for (const RecordVal &RV : EncodingDef->getValues()) {
360     // Ignore fixed fields in the record, we're looking for values like:
361     //    bits<5> RST = { ?, ?, ?, ?, ? };
362     if (RV.isNonconcreteOK() || RV.getValue()->isComplete())
363       continue;
364 
365     Success &= addCodeToMergeInOperand(R, BI, std::string(RV.getName()), Case,
366                                        BitOffsetCase, Target);
367   }
368   // Avoid empty switches.
369   if (BitOffsetCase.size() == BitOffsetCaseSizeBeforeLoop)
370     BitOffsetCase.resize(OrigBitOffsetCaseSize);
371   else
372     BitOffsetCase += "      }\n";
373 
374   if (!Success) {
375     // Dump the record, so we can see what's going on...
376     std::string E;
377     raw_string_ostream S(E);
378     S << "Dumping record for previous error:\n";
379     S << *R;
380     PrintNote(E);
381   }
382 
383   StringRef PostEmitter = R->getValueAsString("PostEncoderMethod");
384   if (!PostEmitter.empty()) {
385     Case += "      Value = ";
386     Case += PostEmitter;
387     Case += "(MI, Value";
388     Case += ", STI";
389     Case += ");\n";
390   }
391 }
392 
393 static void emitInstBits(raw_ostream &OS, const APInt &Bits) {
394   for (unsigned I = 0; I < Bits.getNumWords(); ++I)
395     OS << ((I > 0) ? ", " : "") << "UINT64_C(" << utostr(Bits.getRawData()[I])
396        << ")";
397 }
398 
399 void CodeEmitterGen::emitInstructionBaseValues(
400     raw_ostream &O, ArrayRef<const CodeGenInstruction *> NumberedInstructions,
401     const CodeGenTarget &Target, unsigned HwMode) {
402   const CodeGenHwModes &HWM = Target.getHwModes();
403   if (HwMode == DefaultMode)
404     O << "  static const uint64_t InstBits[] = {\n";
405   else
406     O << "  static const uint64_t InstBits_"
407       << HWM.getModeName(HwMode, /*IncludeDefault=*/true) << "[] = {\n";
408 
409   for (const CodeGenInstruction *CGI : NumberedInstructions) {
410     const Record *R = CGI->TheDef;
411 
412     if (R->getValueAsString("Namespace") == "TargetOpcode" ||
413         R->getValueAsBit("isPseudo")) {
414       O << "    ";
415       emitInstBits(O, APInt(BitWidth, 0));
416       O << ",\n";
417       continue;
418     }
419 
420     const Record *EncodingDef = R;
421     if (const RecordVal *RV = R->getValue("EncodingInfos")) {
422       if (auto *DI = dyn_cast_or_null<DefInit>(RV->getValue())) {
423         EncodingInfoByHwMode EBM(DI->getDef(), HWM);
424         if (EBM.hasMode(HwMode)) {
425           EncodingDef = EBM.get(HwMode);
426         } else {
427           // If the HwMode does not match, then Encoding '0'
428           // should be generated.
429           APInt Value(BitWidth, 0);
430           O << "    ";
431           emitInstBits(O, Value);
432           O << "," << '\t' << "// " << R->getName() << "\n";
433           continue;
434         }
435       }
436     }
437     const BitsInit *BI = EncodingDef->getValueAsBitsInit("Inst");
438 
439     // Start by filling in fixed values.
440     APInt Value(BitWidth, 0);
441     for (unsigned I = 0, E = BI->getNumBits(); I != E; ++I) {
442       if (const auto *B = dyn_cast<BitInit>(BI->getBit(I)); B && B->getValue())
443         Value.setBit(I);
444     }
445     O << "    ";
446     emitInstBits(O, Value);
447     O << "," << '\t' << "// " << R->getName() << "\n";
448   }
449   O << "    UINT64_C(0)\n  };\n";
450 }
451 
452 void CodeEmitterGen::emitCaseMap(
453     raw_ostream &O,
454     const std::map<std::string, std::vector<std::string>> &CaseMap) {
455   for (const auto &[Case, InstList] : CaseMap) {
456     bool First = true;
457     for (const auto &Inst : InstList) {
458       if (!First)
459         O << "\n";
460       O << "    case " << Inst << ":";
461       First = false;
462     }
463     O << " {\n";
464     O << Case;
465     O << "      break;\n"
466       << "    }\n";
467   }
468 }
469 
470 void CodeEmitterGen::run(raw_ostream &O) {
471   emitSourceFileHeader("Machine Code Emitter", O);
472 
473   CodeGenTarget Target(Records);
474 
475   // For little-endian instruction bit encodings, reverse the bit order
476   Target.reverseBitsForLittleEndianEncoding();
477 
478   ArrayRef<const CodeGenInstruction *> NumberedInstructions =
479       Target.getInstructionsByEnumValue();
480 
481   if (Target.hasVariableLengthEncodings()) {
482     emitVarLenCodeEmitter(Records, O);
483   } else {
484     const CodeGenHwModes &HWM = Target.getHwModes();
485     // The set of HwModes used by instruction encodings.
486     std::set<unsigned> HwModes;
487     BitWidth = 0;
488     for (const CodeGenInstruction *CGI : NumberedInstructions) {
489       const Record *R = CGI->TheDef;
490       if (R->getValueAsString("Namespace") == "TargetOpcode" ||
491           R->getValueAsBit("isPseudo"))
492         continue;
493 
494       if (const RecordVal *RV = R->getValue("EncodingInfos")) {
495         if (const DefInit *DI = dyn_cast_or_null<DefInit>(RV->getValue())) {
496           EncodingInfoByHwMode EBM(DI->getDef(), HWM);
497           for (const auto &[Key, Value] : EBM) {
498             const BitsInit *BI = Value->getValueAsBitsInit("Inst");
499             BitWidth = std::max(BitWidth, BI->getNumBits());
500             HwModes.insert(Key);
501           }
502           continue;
503         }
504       }
505       const BitsInit *BI = R->getValueAsBitsInit("Inst");
506       BitWidth = std::max(BitWidth, BI->getNumBits());
507     }
508     UseAPInt = BitWidth > 64;
509 
510     // Emit function declaration
511     if (UseAPInt) {
512       O << "void " << Target.getName()
513         << "MCCodeEmitter::getBinaryCodeForInstr(const MCInst &MI,\n"
514         << "    SmallVectorImpl<MCFixup> &Fixups,\n"
515         << "    APInt &Inst,\n"
516         << "    APInt &Scratch,\n"
517         << "    const MCSubtargetInfo &STI) const {\n";
518     } else {
519       O << "uint64_t " << Target.getName();
520       O << "MCCodeEmitter::getBinaryCodeForInstr(const MCInst &MI,\n"
521         << "    SmallVectorImpl<MCFixup> &Fixups,\n"
522         << "    const MCSubtargetInfo &STI) const {\n";
523     }
524 
525     // Emit instruction base values
526     emitInstructionBaseValues(O, NumberedInstructions, Target, DefaultMode);
527     if (!HwModes.empty()) {
528       // Emit table for instrs whose encodings are controlled by HwModes.
529       for (unsigned HwMode : HwModes) {
530         if (HwMode == DefaultMode)
531           continue;
532         emitInstructionBaseValues(O, NumberedInstructions, Target, HwMode);
533       }
534 
535       // This pointer will be assigned to the HwMode table later.
536       O << "  const uint64_t *InstBitsByHw;\n";
537     }
538 
539     // Map to accumulate all the cases.
540     std::map<std::string, std::vector<std::string>> CaseMap;
541     std::map<std::string, std::vector<std::string>> BitOffsetCaseMap;
542 
543     // Construct all cases statement for each opcode
544     for (const Record *R : Records.getAllDerivedDefinitions("Instruction")) {
545       if (R->getValueAsString("Namespace") == "TargetOpcode" ||
546           R->getValueAsBit("isPseudo"))
547         continue;
548       std::string InstName =
549           (R->getValueAsString("Namespace") + "::" + R->getName()).str();
550       std::string Case, BitOffsetCase;
551       std::tie(Case, BitOffsetCase) = getInstructionCases(R, Target);
552 
553       CaseMap[Case].push_back(InstName);
554       BitOffsetCaseMap[BitOffsetCase].push_back(std::move(InstName));
555     }
556 
557     // Emit initial function code
558     if (UseAPInt) {
559       int NumWords = APInt::getNumWords(BitWidth);
560       O << "  const unsigned opcode = MI.getOpcode();\n"
561         << "  if (Scratch.getBitWidth() != " << BitWidth << ")\n"
562         << "    Scratch = Scratch.zext(" << BitWidth << ");\n"
563         << "  Inst = APInt(" << BitWidth << ", ArrayRef(InstBits + opcode * "
564         << NumWords << ", " << NumWords << "));\n"
565         << "  APInt &Value = Inst;\n"
566         << "  APInt &op = Scratch;\n"
567         << "  switch (opcode) {\n";
568     } else {
569       O << "  const unsigned opcode = MI.getOpcode();\n"
570         << "  uint64_t Value = InstBits[opcode];\n"
571         << "  uint64_t op = 0;\n"
572         << "  (void)op;  // suppress warning\n"
573         << "  switch (opcode) {\n";
574     }
575 
576     // Emit each case statement
577     emitCaseMap(O, CaseMap);
578 
579     // Default case: unhandled opcode
580     O << "  default:\n"
581       << "    std::string msg;\n"
582       << "    raw_string_ostream Msg(msg);\n"
583       << "    Msg << \"Not supported instr: \" << MI;\n"
584       << "    report_fatal_error(Msg.str().c_str());\n"
585       << "  }\n";
586     if (UseAPInt)
587       O << "  Inst = Value;\n";
588     else
589       O << "  return Value;\n";
590     O << "}\n\n";
591 
592     O << "#ifdef GET_OPERAND_BIT_OFFSET\n"
593       << "#undef GET_OPERAND_BIT_OFFSET\n\n"
594       << "uint32_t " << Target.getName()
595       << "MCCodeEmitter::getOperandBitOffset(const MCInst &MI,\n"
596       << "    unsigned OpNum,\n"
597       << "    const MCSubtargetInfo &STI) const {\n"
598       << "  switch (MI.getOpcode()) {\n";
599     emitCaseMap(O, BitOffsetCaseMap);
600     O << "  }\n"
601       << "  std::string msg;\n"
602       << "  raw_string_ostream Msg(msg);\n"
603       << "  Msg << \"Not supported instr[opcode]: \" << MI << \"[\" << OpNum "
604          "<< \"]\";\n"
605       << "  report_fatal_error(Msg.str().c_str());\n"
606       << "}\n\n"
607       << "#endif // GET_OPERAND_BIT_OFFSET\n\n";
608   }
609 }
610 
611 } // end anonymous namespace
612 
613 static TableGen::Emitter::OptClass<CodeEmitterGen>
614     X("gen-emitter", "Generate machine code emitter");
615