[llvm] [DXIL] Add GroupMemoryBarrierWithGroupSync intrinsic (PR #114349)
Adam Yang via llvm-commits
llvm-commits at lists.llvm.org
Thu Nov 14 16:40:51 PST 2024
================
@@ -374,19 +411,51 @@ static void emitDXILOpFunctionTypes(ArrayRef<DXILOperationDesc> Ops,
/// \param Output stream
static void emitDXILIntrinsicMap(ArrayRef<DXILOperationDesc> Ops,
raw_ostream &OS) {
+
OS << "#ifdef DXIL_OP_INTRINSIC\n";
OS << "\n";
for (const auto &Op : Ops) {
- if (Op.Intrinsic.empty())
+ if (Op.IntrinsicSelects.empty()) {
continue;
- OS << "DXIL_OP_INTRINSIC(dxil::OpCode::" << Op.OpName
- << ", Intrinsic::" << Op.Intrinsic << ")\n";
+ }
+ for (const DXILIntrinsicSelect &MappedIntr : Op.IntrinsicSelects) {
+ OS << "DXIL_OP_INTRINSIC(dxil::OpCode::" << Op.OpName
+ << ", Intrinsic::" << MappedIntr.Intrinsic << ", ";
+ for (const Record *ArgSelect : MappedIntr.ArgSelectRecords) {
+ std::string Type =
+ ArgSelect->getValueAsDef("type")->getNameInitAsString();
+ int Value = ArgSelect->getValueAsInt("value");
+ OS << "(IntrinArgSelect{"
+ << "IntrinArgSelect::Type::" << StripIntrinArgSelectTypePrefix(Type)
+ << "," << Value << "}), ";
+ }
+ OS << ")\n";
+ }
}
OS << "\n";
OS << "#undef DXIL_OP_INTRINSIC\n";
OS << "#endif\n\n";
}
+/// Emit the IntrinArgSelect type for DirectX intrinsic to DXIL Op lowering
+static void emitDXILIntrinsicArgSelectTypes(const RecordKeeper &Records,
+ raw_ostream &OS) {
+ OS << "#ifdef DXIL_OP_INTRINSIC_ARG_SELECT_TYPES\n";
+ OS << "struct IntrinArgSelect {\n";
+ OS << " enum class Type {\n";
+ for (const Record *Records :
+ Records.getAllDerivedDefinitions("IntrinArgSelectType")) {
+ StringRef StrippedName = StripIntrinArgSelectTypePrefix(Records->getName());
+ OS << " " << StrippedName << ",\n";
+ }
+ OS << " };\n";
+ OS << " Type Type;\n";
+ OS << " int Value;\n";
+ OS << "};\n";
----------------
adam-yang wrote:
Fixed it, except the enums aren't given explicit values, since it doesn't matter.
https://github.com/llvm/llvm-project/pull/114349
More information about the llvm-commits
mailing list