Lines Matching full:os
61 void run(raw_ostream &OS);
64 void emitEnums(raw_ostream &OS);
82 void emitTIIHelperMethods(raw_ostream &OS, StringRef TargetName,
87 void emitMCIIHelperMethods(raw_ostream &OS, StringRef TargetName);
90 void emitFeatureVerifier(raw_ostream &OS, const CodeGenTarget &Target);
94 const OperandInfoMapTy &OperandInfo, raw_ostream &OS);
96 raw_ostream &OS, const CodeGenTarget &Target,
104 raw_ostream &OS, const CodeGenTarget &Target,
108 raw_ostream &OS, StringRef Namespace,
111 raw_ostream &OS, StringRef Namespace,
117 void EmitOperandInfo(raw_ostream &OS, OperandInfoListTy &OperandInfoList);
230 void InstrInfoEmitter::EmitOperandInfo(raw_ostream &OS,
234 OS << " /* " << Offset << " */";
236 OS << " { " << Info << " },";
237 OS << '\n';
283 raw_ostream &OS, const CodeGenTarget &Target,
293 OS << "#ifdef GET_INSTRINFO_OPERAND_ENUM\n";
294 OS << "#undef GET_INSTRINFO_OPERAND_ENUM\n";
295 OS << "namespace llvm::" << Namespace << "::OpName {\n";
296 OS << "enum {\n";
298 OS << " " << Op.first << " = " << Op.second << ",\n";
300 OS << " OPERAND_LAST";
301 OS << "\n};\n";
302 OS << "} // end namespace llvm::" << Namespace << "::OpName\n";
303 OS << "#endif //GET_INSTRINFO_OPERAND_ENUM\n\n";
305 OS << "#ifdef GET_INSTRINFO_NAMED_OPS\n";
306 OS << "#undef GET_INSTRINFO_NAMED_OPS\n";
307 OS << "namespace llvm::" << Namespace << " {\n";
308 OS << "LLVM_READONLY\n";
309 OS << "int16_t getNamedOperandIdx(uint16_t Opcode, uint16_t NamedIdx) {\n";
311 OS << " static const int16_t OperandMap [][" << Operands.size()
315 OS << "{";
319 OS << (OpList.count(i) == 0 ? -1 : (int)OpList.find(i)->second) << ", ";
321 OS << "},\n";
323 OS << "};\n";
325 OS << " switch(Opcode) {\n";
329 OS << " case " << Name << ":\n";
331 OS << " return OperandMap[" << TableIndex++ << "][NamedIdx];\n";
333 OS << " default: return -1;\n";
334 OS << " }\n";
337 OS << " return -1;\n";
339 OS << "}\n";
340 OS << "} // end namespace llvm::" << Namespace << "\n";
341 OS << "#endif //GET_INSTRINFO_NAMED_OPS\n\n";
348 raw_ostream &OS, const CodeGenTarget &Target,
359 OS << "#ifdef GET_INSTRINFO_OPERAND_TYPES_ENUM\n";
360 OS << "#undef GET_INSTRINFO_OPERAND_TYPES_ENUM\n";
361 OS << "namespace llvm::" << Namespace << "::OpTypes {\n";
362 OS << "enum OperandType {\n";
369 OS << " " << Op->getName() << " = " << EnumVal << ",\n";
374 OS << " OPERAND_TYPE_LIST_END"
376 OS << "} // end namespace llvm::" << Namespace << "::OpTypes\n";
377 OS << "#endif // GET_INSTRINFO_OPERAND_TYPES_ENUM\n\n";
379 OS << "#ifdef GET_INSTRINFO_OPERAND_TYPE\n";
380 OS << "#undef GET_INSTRINFO_OPERAND_TYPE\n";
381 OS << "namespace llvm::" << Namespace << " {\n";
382 OS << "LLVM_READONLY\n";
383 OS << "static int getOperandType(uint16_t Opcode, uint16_t OpIdx) {\n";
413 OS << " static const " << getMinimalTypeForRange(OperandRecords.size());
414 OS << " Offsets[] = {\n";
416 OS << " /* " << getInstrName(I) << " */\n";
417 OS << " " << OperandOffsets[I] << ",\n";
419 OS << " };\n";
428 OS << "\n using namespace OpTypes;\n";
429 OS << " static";
430 OS << ((EnumVal <= INT8_MAX) ? " const int8_t" : " const int16_t");
431 OS << " OpcodeOperandTypes[] = {\n ";
435 OS << "\n /* " << getInstrName(CurOffset) << " */\n ";
437 OS << "/* " << getInstrName(CurOffset) << " */\n ";
444 OS << OpR->getName();
446 OS << -1;
447 OS << ", ";
449 OS << "\n };\n";
451 OS << " return OpcodeOperandTypes[Offsets[Opcode] + OpIdx];\n";
453 OS << " llvm_unreachable(\"No instructions defined\");\n";
455 OS << "}\n";
456 OS << "} // end namespace llvm::" << Namespace << "\n";
457 OS << "#endif // GET_INSTRINFO_OPERAND_TYPE\n\n";
459 OS << "#ifdef GET_INSTRINFO_MEM_OPERAND_SIZE\n";
460 OS << "#undef GET_INSTRINFO_MEM_OPERAND_SIZE\n";
461 OS << "namespace llvm::" << Namespace << " {\n";
462 OS << "LLVM_READONLY\n";
463 OS << "static int getMemOperandSize(int OpType) {\n";
464 OS << " switch (OpType) {\n";
472 OS << " default: return 0;\n";
475 OS << " case OpTypes::" << OperandName << ":\n";
476 OS << " return " << KV.first << ";\n\n";
478 OS << " }\n}\n";
479 OS << "} // end namespace llvm::" << Namespace << "\n";
480 OS << "#endif // GET_INSTRINFO_MEM_OPERAND_SIZE\n\n";
484 raw_ostream &OS, StringRef Namespace,
512 OS << "#ifdef GET_INSTRINFO_LOGICAL_OPERAND_SIZE_MAP\n";
513 OS << "#undef GET_INSTRINFO_LOGICAL_OPERAND_SIZE_MAP\n";
514 OS << "namespace llvm::" << Namespace << " {\n";
515 OS << "LLVM_READONLY static unsigned\n";
516 OS << "getLogicalOperandSize(uint16_t Opcode, uint16_t LogicalOpIdx) {\n";
523 OS << " static const unsigned SizeMap[][" << LogicalOpListSize
527 OS << " {";
530 OS << Row[i] << ", ";
533 OS << "0, ";
535 OS << "}, ";
536 OS << "\n";
538 OS << " };\n";
540 OS << " switch (Opcode) {\n";
541 OS << " default: return LogicalOpIdx;\n";
546 OS << " case " << Inst << ":\n";
548 OS << " return SizeMap[" << OpMapIdx << "][LogicalOpIdx];\n";
550 OS << " }\n";
552 OS << " return LogicalOpIdx;\n";
554 OS << "}\n";
556 OS << "LLVM_READONLY static inline unsigned\n";
557 OS << "getLogicalOperandIdx(uint16_t Opcode, uint16_t LogicalOpIdx) {\n";
558 OS << " auto S = 0U;\n";
559 OS << " for (auto i = 0U; i < LogicalOpIdx; ++i)\n";
560 OS << " S += getLogicalOperandSize(Opcode, i);\n";
561 OS << " return S;\n";
562 OS << "}\n";
564 OS << "} // end namespace llvm::" << Namespace << "\n";
565 OS << "#endif // GET_INSTRINFO_LOGICAL_OPERAND_SIZE_MAP\n\n";
569 raw_ostream &OS, StringRef Namespace,
603 OS << "#ifdef GET_INSTRINFO_LOGICAL_OPERAND_TYPE_MAP\n";
604 OS << "#undef GET_INSTRINFO_LOGICAL_OPERAND_TYPE_MAP\n";
605 OS << "namespace llvm::" << Namespace << " {\n";
606 OS << "LLVM_READONLY static int\n";
607 OS << "getLogicalOperandType(uint16_t Opcode, uint16_t LogicalOpIdx) {\n";
614 OS << " static const int TypeMap[][" << OpTypeListSize << "] = {\n";
617 OS << " {";
621 OS << ", ";
622 OS << Row[i];
626 OS << ", ";
627 OS << "-1";
629 OS << "}";
631 OS << ",";
632 OS << "\n";
634 OS << " };\n";
636 OS << " switch (Opcode) {\n";
637 OS << " default: return -1;\n";
642 OS << " case " << Inst << ":\n";
644 OS << " return TypeMap[" << OpMapIdx << "][LogicalOpIdx];\n";
646 OS << " }\n";
648 OS << " return -1;\n";
650 OS << "}\n";
651 OS << "} // end namespace llvm::" << Namespace << "\n";
652 OS << "#endif // GET_INSTRINFO_LOGICAL_OPERAND_TYPE_MAP\n\n";
655 void InstrInfoEmitter::emitMCIIHelperMethods(raw_ostream &OS,
660 OS << "#ifdef GET_INSTRINFO_MC_HELPER_DECLS\n";
661 OS << "#undef GET_INSTRINFO_MC_HELPER_DECLS\n\n";
663 OS << "namespace llvm {\n";
664 OS << "class MCInst;\n";
665 OS << "class FeatureBitset;\n\n";
667 OS << "namespace " << TargetName << "_MC {\n\n";
670 OS << "bool " << Rec->getValueAsString("FunctionName")
674 OS << "void verifyInstructionPredicates(unsigned Opcode, const FeatureBitset "
677 OS << "\n} // end namespace " << TargetName << "_MC\n";
678 OS << "} // end namespace llvm\n\n";
680 OS << "#endif // GET_INSTRINFO_MC_HELPER_DECLS\n\n";
682 OS << "#ifdef GET_INSTRINFO_MC_HELPERS\n";
683 OS << "#undef GET_INSTRINFO_MC_HELPERS\n\n";
685 OS << "namespace llvm::" << TargetName << "_MC {\n";
691 OS << "bool " << Rec->getValueAsString("FunctionName");
692 OS << "(const MCInst &MI) {\n";
694 OS << PE.getIndent();
695 PE.expandStatement(OS, Rec->getValueAsDef("Body"));
696 OS << "\n}\n\n";
699 OS << "} // end namespace llvm::" << TargetName << "_MC\n";
701 OS << "#endif // GET_GENISTRINFO_MC_HELPERS\n\n";
712 void InstrInfoEmitter::emitFeatureVerifier(raw_ostream &OS,
718 OS << "#if (defined(ENABLE_INSTR_PREDICATE_VERIFIER) && !defined(NDEBUG)) "
723 OS << "#ifdef GET_COMPUTE_FEATURES\n"
729 OS);
731 OS << "inline ";
733 Target.getName(), "", "computeAvailableFeatures", SubtargetFeatures, OS);
761 OS << "inline FeatureBitset computeRequiredFeatures(unsigned Opcode) {\n"
767 OS << " " << getNameForFeatureBitset(FeatureBitset) << ",\n";
769 OS << " };\n\n"
775 OS << " {";
779 OS << I->second.getEnumBitName() << ", ";
781 OS << "},\n";
783 OS << " };\n"
788 OS << " CEFBS";
794 OS << '_' << I->second.TheDef->getName();
799 OS << "_None";
800 OS << ", // " << Inst->TheDef->getName() << " = " << InstIdx << "\n";
803 OS << " };\n\n"
808 OS << "} // end namespace llvm::" << Target.getName() << "_MC\n"
811 OS << "#ifdef GET_AVAILABLE_OPCODE_CHECKER\n"
814 OS << "bool isOpcodeAvailable("
825 OS << "} // end namespace llvm::" << Target.getName() << "_MC\n"
828 OS << "#ifdef ENABLE_INSTR_PREDICATE_VERIFIER\n"
832 OS << "namespace llvm::" << Target.getName() << "_MC {\n";
835 OS << "#ifndef NDEBUG\n";
836 SubtargetFeatureInfo::emitNameTable(SubtargetFeatures, OS);
837 OS << "#endif // NDEBUG\n\n";
840 OS << "void verifyInstructionPredicates(\n"
843 OS << " FeatureBitset AvailableFeatures = "
845 OS << " FeatureBitset RequiredFeatures = "
847 OS << " FeatureBitset MissingFeatures =\n"
862 OS << "}\n";
863 OS << "} // end namespace llvm::" << Target.getName() << "_MC\n";
864 OS << "#endif // ENABLE_INSTR_PREDICATE_VERIFIER\n\n";
867 void InstrInfoEmitter::emitTIIHelperMethods(raw_ostream &OS,
879 OS << (ExpandDefinition ? "" : "static ") << "bool ";
881 OS << TargetName << "InstrInfo::";
882 OS << Rec->getValueAsString("FunctionName");
883 OS << "(const MachineInstr &MI)";
885 OS << ";\n";
889 OS << " {\n";
890 OS << PE.getIndent();
891 PE.expandStatement(OS, Rec->getValueAsDef("Body"));
892 OS << "\n}\n\n";
901 void InstrInfoEmitter::run(raw_ostream &OS) {
902 emitSourceFileHeader("Target Instruction Enum Values and Descriptors", OS);
903 emitEnums(OS);
933 OS << "#if defined(GET_INSTRINFO_MC_DESC) || "
935 OS << "namespace llvm {\n\n";
937 OS << "struct " << TargetName << "InstrTable {\n";
938 OS << " MCInstrDesc Insts[" << NumberedInstructions.size() << "];\n";
939 OS << " static_assert(alignof(MCInstrDesc) >= alignof(MCOperandInfo), "
941 OS << " MCOperandInfo OperandInfo[" << OperandInfoSize << "];\n";
942 OS << " static_assert(alignof(MCOperandInfo) >= alignof(MCPhysReg), "
944 OS << " MCPhysReg ImplicitOps[" << std::max(ImplicitListSize, 1U) << "];\n";
945 OS << "};\n\n";
947 OS << "} // end namespace llvm\n";
948 OS << "#endif // defined(GET_INSTRINFO_MC_DESC) || "
951 OS << "#ifdef GET_INSTRINFO_MC_DESC\n";
952 OS << "#undef GET_INSTRINFO_MC_DESC\n";
953 OS << "namespace llvm {\n\n";
957 OS << "static_assert(sizeof(MCOperandInfo) % sizeof(MCPhysReg) == 0);\n";
958 OS << "static constexpr unsigned " << TargetName << "ImpOpBase = sizeof "
961 OS << "extern const " << TargetName << "InstrTable " << TargetName
969 emitRecord(*Inst, --Num, InstrInfo, EmittedLists, OperandInfoMap, OS);
972 OS << " }, {\n";
976 EmitOperandInfo(OS, OperandInfoList);
978 OS << " }, {\n";
983 OS << " /* " << EmittedLists[List] << " */";
985 OS << ' ' << getQualifiedName(Reg) << ',';
986 OS << '\n';
989 OS << " }\n};\n\n";
994 InstrNames.emitStringLiteralDef(OS, Twine("extern const char ") + TargetName +
997 OS << "extern const unsigned " << TargetName << "InstrNameIndices[] = {";
1002 OS << "\n ";
1003 OS << InstrNames.get(std::string(Inst->TheDef->getName())) << "U, ";
1006 OS << "\n};\n\n";
1014 OS << "extern const uint8_t " << TargetName
1019 OS << "\n ";
1022 OS << Target.getInstNamespace() << "::" << Inst->DeprecatedReason
1025 OS << "uint8_t(-1), ";
1028 OS << "\n};\n\n";
1036 OS << "extern const MCInstrInfo::ComplexDeprecationPredicate " << TargetName
1041 OS << "\n ";
1044 OS << "&get" << Inst->DeprecatedReason << "DeprecationInfo, ";
1046 OS << "nullptr, ";
1049 OS << "\n};\n\n";
1054 OS << "static inline void Init" << TargetName
1056 OS << " II->InitMCInstrInfo(" << TargetName << "Descs.Insts, " << TargetName
1059 OS << TargetName << "InstrDeprecationFeatures, ";
1061 OS << "nullptr, ";
1063 OS << TargetName << "InstrComplexDeprecationInfos, ";
1065 OS << "nullptr, ";
1066 OS << NumberedInstructions.size() << ");\n}\n\n";
1068 OS << "} // end namespace llvm\n";
1070 OS << "#endif // GET_INSTRINFO_MC_DESC\n\n";
1073 OS << "#ifdef GET_INSTRINFO_HEADER\n";
1074 OS << "#undef GET_INSTRINFO_HEADER\n";
1077 OS << "namespace llvm {\n";
1078 OS << "struct " << ClassName << " : public TargetInstrInfo {\n"
1084 OS << "\n};\n} // end namespace llvm\n";
1086 OS << "#endif // GET_INSTRINFO_HEADER\n\n";
1088 OS << "#ifdef GET_INSTRINFO_HELPER_DECLS\n";
1089 OS << "#undef GET_INSTRINFO_HELPER_DECLS\n\n";
1090 emitTIIHelperMethods(OS, TargetName, /* ExpandDefinition = */ false);
1091 OS << "\n";
1092 OS << "#endif // GET_INSTRINFO_HELPER_DECLS\n\n";
1094 OS << "#ifdef GET_INSTRINFO_HELPERS\n";
1095 OS << "#undef GET_INSTRINFO_HELPERS\n\n";
1096 emitTIIHelperMethods(OS, TargetName, /* ExpandDefinition = */ true);
1097 OS << "#endif // GET_INSTRINFO_HELPERS\n\n";
1099 OS << "#ifdef GET_INSTRINFO_CTOR_DTOR\n";
1100 OS << "#undef GET_INSTRINFO_CTOR_DTOR\n";
1102 OS << "namespace llvm {\n";
1103 OS << "extern const " << TargetName << "InstrTable " << TargetName
1105 OS << "extern const unsigned " << TargetName << "InstrNameIndices[];\n";
1106 OS << "extern const char " << TargetName << "InstrNameData[];\n";
1108 OS << "extern const uint8_t " << TargetName
1111 OS << "extern const MCInstrInfo::ComplexDeprecationPredicate " << TargetName
1113 OS << ClassName << "::" << ClassName
1121 OS << TargetName << "InstrDeprecationFeatures, ";
1123 OS << "nullptr, ";
1125 OS << TargetName << "InstrComplexDeprecationInfos, ";
1127 OS << "nullptr, ";
1128 OS << NumberedInstructions.size() << ");\n}\n";
1129 OS << "} // end namespace llvm\n";
1131 OS << "#endif // GET_INSTRINFO_CTOR_DTOR\n\n";
1134 emitOperandNameMappings(OS, Target, NumberedInstructions);
1137 emitOperandTypeMappings(OS, Target, NumberedInstructions);
1140 emitLogicalOperandSizeMappings(OS, TargetName, NumberedInstructions);
1143 emitLogicalOperandTypeMappings(OS, TargetName, NumberedInstructions);
1146 emitMCIIHelperMethods(OS, TargetName);
1149 emitFeatureVerifier(OS, Target);
1155 const OperandInfoMapTy &OperandInfoMap, raw_ostream &OS) {
1168 OS << " { ";
1169 OS << Num << ",\t" << MinOperands << ",\t" << DefOperands << ",\t"
1176 OS << Inst.ImplicitUses.size() << ",\t" << Inst.ImplicitDefs.size() << ",\t";
1179 OS << Target.getName() << "ImpOpBase + " << EmittedLists[ImplicitOps]
1184 OS << OperandInfoMap.find(OperandInfo)->second << ",\t0";
1188 OS << "|(1ULL<<MCID::PreISelOpcode)";
1190 OS << "|(1ULL<<MCID::Pseudo)";
1192 OS << "|(1ULL<<MCID::Meta)";
1194 OS << "|(1ULL<<MCID::Return)";
1196 OS << "|(1ULL<<MCID::EHScopeReturn)";
1198 OS << "|(1ULL<<MCID::Branch)";
1200 OS << "|(1ULL<<MCID::IndirectBranch)";
1202 OS << "|(1ULL<<MCID::Compare)";
1204 OS << "|(1ULL<<MCID::MoveImm)";
1206 OS << "|(1ULL<<MCID::MoveReg)";
1208 OS << "|(1ULL<<MCID::Bitcast)";
1210 OS << "|(1ULL<<MCID::Add)";
1212 OS << "|(1ULL<<MCID::Trap)";
1214 OS << "|(1ULL<<MCID::Select)";
1216 OS << "|(1ULL<<MCID::Barrier)";
1218 OS << "|(1ULL<<MCID::DelaySlot)";
1220 OS << "|(1ULL<<MCID::Call)";
1222 OS << "|(1ULL<<MCID::FoldableAsLoad)";
1224 OS << "|(1ULL<<MCID::MayLoad)";
1226 OS << "|(1ULL<<MCID::MayStore)";
1228 OS << "|(1ULL<<MCID::MayRaiseFPException)";
1230 OS << "|(1ULL<<MCID::Predicable)";
1232 OS << "|(1ULL<<MCID::ConvertibleTo3Addr)";
1234 OS << "|(1ULL<<MCID::Commutable)";
1236 OS << "|(1ULL<<MCID::Terminator)";
1238 OS << "|(1ULL<<MCID::Rematerializable)";
1240 OS << "|(1ULL<<MCID::NotDuplicable)";
1242 OS << "|(1ULL<<MCID::HasOptionalDef)";
1244 OS << "|(1ULL<<MCID::UsesCustomInserter)";
1246 OS << "|(1ULL<<MCID::HasPostISelHook)";
1248 OS << "|(1ULL<<MCID::Variadic)";
1250 OS << "|(1ULL<<MCID::UnmodeledSideEffects)";
1252 OS << "|(1ULL<<MCID::CheapAsAMove)";
1254 OS << "|(1ULL<<MCID::ExtraSrcRegAllocReq)";
1256 OS << "|(1ULL<<MCID::ExtraDefRegAllocReq)";
1258 OS << "|(1ULL<<MCID::RegSequence)";
1260 OS << "|(1ULL<<MCID::ExtractSubreg)";
1262 OS << "|(1ULL<<MCID::InsertSubreg)";
1264 OS << "|(1ULL<<MCID::Convergent)";
1266 OS << "|(1ULL<<MCID::VariadicOpsAreDefs)";
1268 OS << "|(1ULL<<MCID::Authenticated)";
1282 OS << ", 0x";
1283 OS.write_hex(Value);
1284 OS << "ULL";
1286 OS << " }, // Inst #" << Num << " = " << Inst.TheDef->getName() << "\n";
1290 void InstrInfoEmitter::emitEnums(raw_ostream &OS) {
1291 OS << "#ifdef GET_INSTRINFO_ENUM\n";
1292 OS << "#undef GET_INSTRINFO_ENUM\n";
1300 OS << "namespace llvm::" << Namespace << " {\n";
1302 OS << " enum {\n";
1305 OS << " " << Inst->TheDef->getName()
1307 OS << " INSTRUCTION_LIST_END = " << Num + 1 << "\n";
1308 OS << " };\n\n";
1309 OS << "} // end namespace llvm::" << Namespace << "\n";
1310 OS << "#endif // GET_INSTRINFO_ENUM\n\n";
1312 OS << "#ifdef GET_INSTRINFO_SCHED_ENUM\n";
1313 OS << "#undef GET_INSTRINFO_SCHED_ENUM\n";
1314 OS << "namespace llvm::" << Namespace << "::Sched {\n\n";
1315 OS << " enum {\n";
1318 OS << " " << Class.Name << "\t= " << Num++ << ",\n";
1319 OS << " SCHED_LIST_END = " << Num << "\n";
1320 OS << " };\n";
1321 OS << "} // end namespace llvm::" << Namespace << "::Sched\n";
1323 OS << "#endif // GET_INSTRINFO_SCHED_ENUM\n\n";
1326 static void EmitInstrInfo(const RecordKeeper &Records, raw_ostream &OS) {
1329 InstrInfoEmitter(Records).run(OS);
1331 EmitMapTable(Records, OS);