1 //===- CodeEmitterGen.cpp - Code Emitter Generator ------------------------===//
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
7 //===----------------------------------------------------------------------===//
9 // CodeEmitterGen uses the descriptions of instructions and their fields to
10 // construct an automated code emitter: a function that, given a MachineInstr,
11 // returns the (currently, 32-bit unsigned) value of the instruction.
13 //===----------------------------------------------------------------------===//
15 #include "CodeGenInstruction.h"
16 #include "CodeGenTarget.h"
17 #include "SubtargetFeatureInfo.h"
19 #include "llvm/ADT/ArrayRef.h"
20 #include "llvm/ADT/StringExtras.h"
21 #include "llvm/Support/Casting.h"
22 #include "llvm/Support/raw_ostream.h"
23 #include "llvm/TableGen/Record.h"
24 #include "llvm/TableGen/TableGenBackend.h"
37 class CodeEmitterGen
{
38 RecordKeeper
&Records
;
41 CodeEmitterGen(RecordKeeper
&R
) : Records(R
) {}
43 void run(raw_ostream
&o
);
46 int getVariableBit(const std::string
&VarName
, BitsInit
*BI
, int bit
);
47 std::string
getInstructionCase(Record
*R
, CodeGenTarget
&Target
);
48 void AddCodeToMergeInOperand(Record
*R
, BitsInit
*BI
,
49 const std::string
&VarName
,
51 std::set
<unsigned> &NamedOpIndices
,
52 std::string
&Case
, CodeGenTarget
&Target
);
56 // If the VarBitInit at position 'bit' matches the specified variable then
57 // return the variable bit position. Otherwise return -1.
58 int CodeEmitterGen::getVariableBit(const std::string
&VarName
,
59 BitsInit
*BI
, int bit
) {
60 if (VarBitInit
*VBI
= dyn_cast
<VarBitInit
>(BI
->getBit(bit
))) {
61 if (VarInit
*VI
= dyn_cast
<VarInit
>(VBI
->getBitVar()))
62 if (VI
->getName() == VarName
)
63 return VBI
->getBitNum();
64 } else if (VarInit
*VI
= dyn_cast
<VarInit
>(BI
->getBit(bit
))) {
65 if (VI
->getName() == VarName
)
73 AddCodeToMergeInOperand(Record
*R
, BitsInit
*BI
, const std::string
&VarName
,
75 std::set
<unsigned> &NamedOpIndices
,
76 std::string
&Case
, CodeGenTarget
&Target
) {
77 CodeGenInstruction
&CGI
= Target
.getInstruction(R
);
79 // Determine if VarName actually contributes to the Inst encoding.
80 int bit
= BI
->getNumBits()-1;
82 // Scan for a bit that this contributed to.
84 if (getVariableBit(VarName
, BI
, bit
) != -1)
90 // If we found no bits, ignore this value, otherwise emit the call to get the
94 // If the operand matches by name, reference according to that
95 // operand number. Non-matching operands are assumed to be in
98 if (CGI
.Operands
.hasOperandNamed(VarName
, OpIdx
)) {
99 // Get the machine operand number for the indicated operand.
100 OpIdx
= CGI
.Operands
[OpIdx
].MIOperandNo
;
101 assert(!CGI
.Operands
.isFlatOperandNotEmitted(OpIdx
) &&
102 "Explicitly used operand also marked as not emitted!");
104 unsigned NumberOps
= CGI
.Operands
.size();
105 /// If this operand is not supposed to be emitted by the
106 /// generated emitter, skip it.
107 while (NumberedOp
< NumberOps
&&
108 (CGI
.Operands
.isFlatOperandNotEmitted(NumberedOp
) ||
109 (!NamedOpIndices
.empty() && NamedOpIndices
.count(
110 CGI
.Operands
.getSubOperandNumber(NumberedOp
).first
)))) {
113 if (NumberedOp
>= CGI
.Operands
.back().MIOperandNo
+
114 CGI
.Operands
.back().MINumOperands
) {
115 errs() << "Too few operands in record " << R
->getName() <<
116 " (no match for variable " << VarName
<< "):\n";
124 OpIdx
= NumberedOp
++;
127 std::pair
<unsigned, unsigned> SO
= CGI
.Operands
.getSubOperandNumber(OpIdx
);
128 std::string
&EncoderMethodName
= CGI
.Operands
[SO
.first
].EncoderMethodName
;
130 // If the source operand has a custom encoder, use it. This will
131 // get the encoding for all of the suboperands.
132 if (!EncoderMethodName
.empty()) {
133 // A custom encoder has all of the information for the
134 // sub-operands, if there are more than one, so only
135 // query the encoder once per source operand.
136 if (SO
.second
== 0) {
137 Case
+= " // op: " + VarName
+ "\n" +
138 " op = " + EncoderMethodName
+ "(MI, " + utostr(OpIdx
);
139 Case
+= ", Fixups, STI";
143 Case
+= " // op: " + VarName
+ "\n" +
144 " op = getMachineOpValue(MI, MI.getOperand(" + utostr(OpIdx
) + ")";
145 Case
+= ", Fixups, STI";
150 int varBit
= getVariableBit(VarName
, BI
, bit
);
152 // If this bit isn't from a variable, skip it.
158 // Figure out the consecutive range of bits covered by this operand, in
159 // order to generate better encoding code.
160 int beginInstBit
= bit
;
161 int beginVarBit
= varBit
;
163 for (--bit
; bit
>= 0;) {
164 varBit
= getVariableBit(VarName
, BI
, bit
);
165 if (varBit
== -1 || varBit
!= (beginVarBit
- N
)) break;
170 uint64_t opMask
= ~(uint64_t)0 >> (64-N
);
171 int opShift
= beginVarBit
- N
+ 1;
173 opShift
= beginInstBit
- beginVarBit
;
176 Case
+= " Value |= (op & UINT64_C(" + utostr(opMask
) + ")) << " +
177 itostr(opShift
) + ";\n";
178 } else if (opShift
< 0) {
179 Case
+= " Value |= (op & UINT64_C(" + utostr(opMask
) + ")) >> " +
180 itostr(-opShift
) + ";\n";
182 Case
+= " Value |= op & UINT64_C(" + utostr(opMask
) + ");\n";
187 std::string
CodeEmitterGen::getInstructionCase(Record
*R
,
188 CodeGenTarget
&Target
) {
190 BitsInit
*BI
= R
->getValueAsBitsInit("Inst");
191 unsigned NumberedOp
= 0;
192 std::set
<unsigned> NamedOpIndices
;
194 // Collect the set of operand indices that might correspond to named
195 // operand, and skip these when assigning operands based on position.
196 if (Target
.getInstructionSet()->
197 getValueAsBit("noNamedPositionallyEncodedOperands")) {
198 CodeGenInstruction
&CGI
= Target
.getInstruction(R
);
199 for (const RecordVal
&RV
: R
->getValues()) {
201 if (!CGI
.Operands
.hasOperandNamed(RV
.getName(), OpIdx
))
204 NamedOpIndices
.insert(OpIdx
);
208 // Loop over all of the fields in the instruction, determining which are the
209 // operands to the instruction.
210 for (const RecordVal
&RV
: R
->getValues()) {
211 // Ignore fixed fields in the record, we're looking for values like:
212 // bits<5> RST = { ?, ?, ?, ?, ? };
213 if (RV
.getPrefix() || RV
.getValue()->isComplete())
216 AddCodeToMergeInOperand(R
, BI
, RV
.getName(), NumberedOp
,
217 NamedOpIndices
, Case
, Target
);
220 StringRef PostEmitter
= R
->getValueAsString("PostEncoderMethod");
221 if (!PostEmitter
.empty()) {
224 Case
+= "(MI, Value";
233 getNameForFeatureBitset(const std::vector
<Record
*> &FeatureBitset
) {
234 std::string Name
= "CEFBS";
235 for (const auto &Feature
: FeatureBitset
)
236 Name
+= ("_" + Feature
->getName()).str();
240 void CodeEmitterGen::run(raw_ostream
&o
) {
241 CodeGenTarget
Target(Records
);
242 std::vector
<Record
*> Insts
= Records
.getAllDerivedDefinitions("Instruction");
244 // For little-endian instruction bit encodings, reverse the bit order
245 Target
.reverseBitsForLittleEndianEncoding();
247 ArrayRef
<const CodeGenInstruction
*> NumberedInstructions
=
248 Target
.getInstructionsByEnumValue();
250 // Emit function declaration
251 o
<< "uint64_t " << Target
.getName();
252 o
<< "MCCodeEmitter::getBinaryCodeForInstr(const MCInst &MI,\n"
253 << " SmallVectorImpl<MCFixup> &Fixups,\n"
254 << " const MCSubtargetInfo &STI) const {\n";
256 // Emit instruction base values
257 o
<< " static const uint64_t InstBits[] = {\n";
258 for (const CodeGenInstruction
*CGI
: NumberedInstructions
) {
259 Record
*R
= CGI
->TheDef
;
261 if (R
->getValueAsString("Namespace") == "TargetOpcode" ||
262 R
->getValueAsBit("isPseudo")) {
263 o
<< " UINT64_C(0),\n";
267 BitsInit
*BI
= R
->getValueAsBitsInit("Inst");
269 // Start by filling in fixed values.
271 for (unsigned i
= 0, e
= BI
->getNumBits(); i
!= e
; ++i
) {
272 if (BitInit
*B
= dyn_cast
<BitInit
>(BI
->getBit(e
-i
-1)))
273 Value
|= (uint64_t)B
->getValue() << (e
-i
-1);
275 o
<< " UINT64_C(" << Value
<< ")," << '\t' << "// " << R
->getName() << "\n";
277 o
<< " UINT64_C(0)\n };\n";
279 // Map to accumulate all the cases.
280 std::map
<std::string
, std::vector
<std::string
>> CaseMap
;
282 // Construct all cases statement for each opcode
283 for (std::vector
<Record
*>::iterator IC
= Insts
.begin(), EC
= Insts
.end();
286 if (R
->getValueAsString("Namespace") == "TargetOpcode" ||
287 R
->getValueAsBit("isPseudo"))
289 std::string InstName
=
290 (R
->getValueAsString("Namespace") + "::" + R
->getName()).str();
291 std::string Case
= getInstructionCase(R
, Target
);
293 CaseMap
[Case
].push_back(std::move(InstName
));
296 // Emit initial function code
297 o
<< " const unsigned opcode = MI.getOpcode();\n"
298 << " uint64_t Value = InstBits[opcode];\n"
299 << " uint64_t op = 0;\n"
300 << " (void)op; // suppress warning\n"
301 << " switch (opcode) {\n";
303 // Emit each case statement
304 std::map
<std::string
, std::vector
<std::string
>>::iterator IE
, EE
;
305 for (IE
= CaseMap
.begin(), EE
= CaseMap
.end(); IE
!= EE
; ++IE
) {
306 const std::string
&Case
= IE
->first
;
307 std::vector
<std::string
> &InstList
= IE
->second
;
309 for (int i
= 0, N
= InstList
.size(); i
< N
; i
++) {
311 o
<< " case " << InstList
[i
] << ":";
319 // Default case: unhandled opcode
321 << " std::string msg;\n"
322 << " raw_string_ostream Msg(msg);\n"
323 << " Msg << \"Not supported instr: \" << MI;\n"
324 << " report_fatal_error(Msg.str());\n"
326 << " return Value;\n"
329 const auto &All
= SubtargetFeatureInfo::getAll(Records
);
330 std::map
<Record
*, SubtargetFeatureInfo
, LessRecordByID
> SubtargetFeatures
;
331 SubtargetFeatures
.insert(All
.begin(), All
.end());
333 o
<< "#ifdef ENABLE_INSTR_PREDICATE_VERIFIER\n"
334 << "#undef ENABLE_INSTR_PREDICATE_VERIFIER\n"
335 << "#include <sstream>\n\n";
337 // Emit the subtarget feature enumeration.
338 SubtargetFeatureInfo::emitSubtargetFeatureBitEnumeration(SubtargetFeatures
,
341 // Emit the name table for error messages.
342 o
<< "#ifndef NDEBUG\n";
343 SubtargetFeatureInfo::emitNameTable(SubtargetFeatures
, o
);
344 o
<< "#endif // NDEBUG\n";
346 // Emit the available features compute function.
347 SubtargetFeatureInfo::emitComputeAssemblerAvailableFeatures(
348 Target
.getName(), "MCCodeEmitter", "computeAvailableFeatures",
349 SubtargetFeatures
, o
);
351 std::vector
<std::vector
<Record
*>> FeatureBitsets
;
352 for (const CodeGenInstruction
*Inst
: Target
.getInstructionsByEnumValue()) {
353 FeatureBitsets
.emplace_back();
354 for (Record
*Predicate
: Inst
->TheDef
->getValueAsListOfDefs("Predicates")) {
355 const auto &I
= SubtargetFeatures
.find(Predicate
);
356 if (I
!= SubtargetFeatures
.end())
357 FeatureBitsets
.back().push_back(I
->second
.TheDef
);
361 llvm::sort(FeatureBitsets
, [&](const std::vector
<Record
*> &A
,
362 const std::vector
<Record
*> &B
) {
363 if (A
.size() < B
.size())
365 if (A
.size() > B
.size())
367 for (const auto &Pair
: zip(A
, B
)) {
368 if (std::get
<0>(Pair
)->getName() < std::get
<1>(Pair
)->getName())
370 if (std::get
<0>(Pair
)->getName() > std::get
<1>(Pair
)->getName())
375 FeatureBitsets
.erase(
376 std::unique(FeatureBitsets
.begin(), FeatureBitsets
.end()),
377 FeatureBitsets
.end());
378 o
<< "#ifndef NDEBUG\n"
379 << "// Feature bitsets.\n"
380 << "enum : " << getMinimalTypeForRange(FeatureBitsets
.size()) << " {\n"
382 for (const auto &FeatureBitset
: FeatureBitsets
) {
383 if (FeatureBitset
.empty())
385 o
<< " " << getNameForFeatureBitset(FeatureBitset
) << ",\n";
388 << "const static FeatureBitset FeatureBitsets[] {\n"
389 << " {}, // CEFBS_None\n";
390 for (const auto &FeatureBitset
: FeatureBitsets
) {
391 if (FeatureBitset
.empty())
394 for (const auto &Feature
: FeatureBitset
) {
395 const auto &I
= SubtargetFeatures
.find(Feature
);
396 assert(I
!= SubtargetFeatures
.end() && "Didn't import predicate?");
397 o
<< I
->second
.getEnumBitName() << ", ";
402 << "#endif // NDEBUG\n\n";
405 // Emit the predicate verifier.
406 o
<< "void " << Target
.getName()
407 << "MCCodeEmitter::verifyInstructionPredicates(\n"
408 << " const MCInst &Inst, const FeatureBitset &AvailableFeatures) const {\n"
409 << "#ifndef NDEBUG\n"
410 << " static " << getMinimalTypeForRange(FeatureBitsets
.size())
411 << " RequiredFeaturesRefs[] = {\n";
412 unsigned InstIdx
= 0;
413 for (const CodeGenInstruction
*Inst
: Target
.getInstructionsByEnumValue()) {
415 unsigned NumPredicates
= 0;
416 for (Record
*Predicate
: Inst
->TheDef
->getValueAsListOfDefs("Predicates")) {
417 const auto &I
= SubtargetFeatures
.find(Predicate
);
418 if (I
!= SubtargetFeatures
.end()) {
419 o
<< '_' << I
->second
.TheDef
->getName();
425 o
<< ", // " << Inst
->TheDef
->getName() << " = " << InstIdx
<< "\n";
429 o
<< " assert(Inst.getOpcode() < " << InstIdx
<< ");\n";
430 o
<< " const FeatureBitset &RequiredFeatures = "
431 "FeatureBitsets[RequiredFeaturesRefs[Inst.getOpcode()]];\n";
432 o
<< " FeatureBitset MissingFeatures =\n"
433 << " (AvailableFeatures & RequiredFeatures) ^\n"
434 << " RequiredFeatures;\n"
435 << " if (MissingFeatures.any()) {\n"
436 << " std::ostringstream Msg;\n"
437 << " Msg << \"Attempting to emit \" << "
438 "MCII.getName(Inst.getOpcode()).str()\n"
439 << " << \" instruction but the \";\n"
440 << " for (unsigned i = 0, e = MissingFeatures.size(); i != e; ++i)\n"
441 << " if (MissingFeatures.test(i))\n"
442 << " Msg << SubtargetFeatureNames[i] << \" \";\n"
443 << " Msg << \"predicate(s) are not met\";\n"
444 << " report_fatal_error(Msg.str());\n"
447 << "// Silence unused variable warning on targets that don't use MCII for "
448 "other purposes (e.g. BPF).\n"
450 << "#endif // NDEBUG\n";
455 } // end anonymous namespace
459 void EmitCodeEmitter(RecordKeeper
&RK
, raw_ostream
&OS
) {
460 emitSourceFileHeader("Machine Code Emitter", OS
);
461 CodeEmitterGen(RK
).run(OS
);
464 } // end namespace llvm