@@ -49,11 +49,11 @@ struct DXILOperationDesc {
49
49
StringRef Doc; // the documentation description of this instruction
50
50
51
51
SmallVector<DXILParameter> Params; // the operands that this instruction takes
52
- StringRef OverloadTypes; // overload types if applicable
53
- StringRef FnAttr; // attribute shorthands: rn=does not access
54
- // memory,ro=only reads from memory
52
+ SmallVector<ParameterKind> OverloadTypes; // overload types if applicable
53
+ StringRef Attr; // operation attribute; reference to string representation
54
+ // of llvm::Attribute::AttrKind
55
55
StringRef Intrinsic; // The llvm intrinsic map to OpName. Default is "" which
56
- // means no map exist
56
+ // means no map exists
57
57
bool IsDeriv = false ; // whether this is some kind of derivative
58
58
bool IsGradient = false ; // whether this requires a gradient calculation
59
59
bool IsFeedback = false ; // whether this is a sampler feedback op
@@ -70,37 +70,32 @@ struct DXILOperationDesc {
70
70
int OverloadParamIndex; // parameter index which control the overload.
71
71
// When < 0, should be only 1 overload type.
72
72
SmallVector<StringRef, 4 > counters; // counters for this inst.
73
- DXILOperationDesc (const Record *R) {
74
- OpName = R->getValueAsString (" OpName" );
75
- OpCode = R->getValueAsInt (" OpCode" );
76
- OpClass = R->getValueAsDef (" OpClass" )->getValueAsString (" Name" );
77
- Category = R->getValueAsDef (" OpCategory" )->getValueAsString (" Name" );
78
-
79
- if (R->getValue (" llvm_intrinsic" )) {
80
- auto *IntrinsicDef = R->getValueAsDef (" llvm_intrinsic" );
81
- auto DefName = IntrinsicDef->getName ();
82
- assert (DefName.starts_with (" int_" ) && " invalid intrinsic name" );
83
- // Remove the int_ from intrinsic name.
84
- Intrinsic = DefName.substr (4 );
85
- }
86
-
87
- Doc = R->getValueAsString (" Doc" );
88
-
89
- ListInit *ParamList = R->getValueAsListInit (" Params" );
90
- OverloadParamIndex = -1 ;
91
- for (unsigned I = 0 ; I < ParamList->size (); ++I) {
92
- Record *Param = ParamList->getElementAsRecord (I);
93
- Params.emplace_back (DXILParameter (Param));
94
- auto &CurParam = Params.back ();
95
- if (CurParam.Kind >= ParameterKind::OVERLOAD)
96
- OverloadParamIndex = I;
97
- }
98
- OverloadTypes = R->getValueAsString (" OverloadTypes" );
99
- FnAttr = R->getValueAsString (" Attributes" );
100
- }
73
+ DXILOperationDesc (const Record *);
101
74
};
102
75
} // end anonymous namespace
103
76
77
+ // Convert DXIL type name string to dxil::ParameterKind
78
+ //
79
+ // @param typeNameStr Type name string
80
+ // @return ParameterKind as defined in llvm/Support/DXILABI.h
81
+ static ParameterKind getDXILTypeNameToKind (StringRef typeNameStr) {
82
+ return StringSwitch<ParameterKind>(typeNameStr)
83
+ .Case (" voidTy" , ParameterKind::VOID)
84
+ .Case (" f16Ty" , ParameterKind::HALF)
85
+ .Case (" f32Ty" , ParameterKind::FLOAT)
86
+ .Case (" f64Ty" , ParameterKind::DOUBLE)
87
+ .Case (" i1Ty" , ParameterKind::I1)
88
+ .Case (" i8Ty" , ParameterKind::I8)
89
+ .Case (" i16Ty" , ParameterKind::I16)
90
+ .Case (" i32Ty" , ParameterKind::I32)
91
+ .Case (" i64Ty" , ParameterKind::I64)
92
+ .Case (" overloadTy" , ParameterKind::OVERLOAD)
93
+ .Case (" handleTy" , ParameterKind::DXIL_HANDLE)
94
+ .Case (" cbufferRetTy" , ParameterKind::CBUFFER_RET)
95
+ .Case (" resourceRetTy" , ParameterKind::RESOURCE_RET)
96
+ .Default (ParameterKind::INVALID);
97
+ }
98
+
104
99
static ParameterKind parameterTypeNameToKind (StringRef Name) {
105
100
return StringSwitch<ParameterKind>(Name)
106
101
.Case (" void" , ParameterKind::VOID)
@@ -119,10 +114,44 @@ static ParameterKind parameterTypeNameToKind(StringRef Name) {
119
114
.Default (ParameterKind::INVALID);
120
115
}
121
116
117
+ DXILOperationDesc::DXILOperationDesc (const Record *R) {
118
+ OpName = R->getValueAsString (" OpName" );
119
+ OpCode = R->getValueAsInt (" OpCode" );
120
+ OpClass = R->getValueAsDef (" OpClass" )->getValueAsString (" Name" );
121
+ Category = R->getValueAsDef (" OpCategory" )->getValueAsString (" Name" );
122
+
123
+ if (R->getValue (" llvm_intrinsic" )) {
124
+ auto *IntrinsicDef = R->getValueAsDef (" llvm_intrinsic" );
125
+ auto DefName = IntrinsicDef->getName ();
126
+ assert (DefName.starts_with (" int_" ) && " invalid intrinsic name" );
127
+ // Remove the int_ from intrinsic name.
128
+ Intrinsic = DefName.substr (4 );
129
+ }
130
+
131
+ Doc = R->getValueAsString (" Doc" );
132
+
133
+ ListInit *ParamList = R->getValueAsListInit (" Params" );
134
+ OverloadParamIndex = -1 ;
135
+ for (unsigned I = 0 ; I < ParamList->size (); ++I) {
136
+ Record *Param = ParamList->getElementAsRecord (I);
137
+ Params.emplace_back (DXILParameter (Param));
138
+ auto &CurParam = Params.back ();
139
+ if (CurParam.Kind >= ParameterKind::OVERLOAD)
140
+ OverloadParamIndex = I;
141
+ }
142
+ ListInit *OverloadTypeList = R->getValueAsListInit (" OverloadTypes" );
143
+
144
+ for (unsigned I = 0 ; I < OverloadTypeList->size (); ++I) {
145
+ Record *R = OverloadTypeList->getElementAsRecord (I);
146
+ OverloadTypes.emplace_back (getDXILTypeNameToKind (R->getNameInitAsString ()));
147
+ }
148
+ Attr = StringRef (R->getValue (" Attribute" )->getNameInitAsString ());
149
+ }
150
+
122
151
DXILParameter::DXILParameter (const Record *R) {
123
152
Name = R->getValueAsString (" Name" );
124
153
Pos = R->getValueAsInt (" Pos" );
125
- Kind = parameterTypeNameToKind (R->getValueAsString (" LLVMType " ));
154
+ Kind = parameterTypeNameToKind (R->getValueAsString (" Type " ));
126
155
if (R->getValue (" Doc" ))
127
156
Doc = R->getValueAsString (" Doc" );
128
157
IsConst = R->getValueAsBit (" IsConstant" );
@@ -267,38 +296,51 @@ static void emitDXILIntrinsicMap(std::vector<DXILOperationDesc> &Ops,
267
296
OS << " \n " ;
268
297
}
269
298
270
- static std::string emitDXILOperationFnAttr (StringRef FnAttr) {
271
- return StringSwitch<std::string>(FnAttr)
272
- .Case (" rn" , " Attribute::ReadNone" )
273
- .Case (" ro" , " Attribute::ReadOnly" )
299
+ // Convert operation attribute string to Attribute enum
300
+ //
301
+ // @param Attr string reference
302
+ // @return std::string Attribute enum string
303
+ static std::string emitDXILOperationAttr (StringRef Attr) {
304
+ return StringSwitch<std::string>(Attr)
305
+ .Case (" ReadNone" , " Attribute::ReadNone" )
306
+ .Case (" ReadOnly" , " Attribute::ReadOnly" )
274
307
.Default (" Attribute::None" );
275
308
}
276
309
277
- static std::string getOverloadKind (StringRef Overload) {
278
- return StringSwitch<std::string>(Overload)
279
- .Case (" half" , " OverloadKind::HALF" )
280
- .Case (" float" , " OverloadKind::FLOAT" )
281
- .Case (" double" , " OverloadKind::DOUBLE" )
282
- .Case (" i1" , " OverloadKind::I1" )
283
- .Case (" i16" , " OverloadKind::I16" )
284
- .Case (" i32" , " OverloadKind::I32" )
285
- .Case (" i64" , " OverloadKind::I64" )
286
- .Case (" udt" , " OverloadKind::UserDefineType" )
287
- .Case (" obj" , " OverloadKind::ObjectType" )
288
- .Default (" OverloadKind::VOID" );
310
+ static std::string overloadKindStr (ParameterKind Overload) {
311
+ switch (Overload) {
312
+ case ParameterKind::HALF:
313
+ return " OverloadKind::HALF" ;
314
+ case ParameterKind::FLOAT:
315
+ return " OverloadKind::FLOAT" ;
316
+ case ParameterKind::DOUBLE:
317
+ return " OverloadKind::DOUBLE" ;
318
+ case ParameterKind::I1:
319
+ return " OverloadKind::I1" ;
320
+ case ParameterKind::I8:
321
+ return " OverloadKind::I8" ;
322
+ case ParameterKind::I16:
323
+ return " OverloadKind::I16" ;
324
+ case ParameterKind::I32:
325
+ return " OverloadKind::I32" ;
326
+ case ParameterKind::I64:
327
+ return " OverloadKind::I64" ;
328
+ case ParameterKind::VOID:
329
+ return " OverloadKind::VOID" ;
330
+ default :
331
+ return " OverloadKind::UNKNOWN" ;
332
+ }
289
333
}
290
334
291
- static std::string getDXILOperationOverload (StringRef Overloads) {
292
- SmallVector<StringRef> OverloadStrs;
293
- Overloads.split (OverloadStrs, ' ;' , /* MaxSplit*/ -1 , /* KeepEmpty*/ false );
335
+ static std::string
336
+ getDXILOperationOverloads (SmallVector<ParameterKind> Overloads) {
294
337
// Format is: OverloadKind::FLOAT | OverloadKind::HALF
295
- assert (!OverloadStrs.empty () && " Invalid overloads" );
296
- auto It = OverloadStrs.begin ();
338
+ auto It = Overloads.begin ();
297
339
std::string Result;
298
340
raw_string_ostream OS (Result);
299
- OS << getOverloadKind (*It);
300
- for (++It; It != OverloadStrs .end (); ++It) {
301
- OS << " | " << getOverloadKind (*It);
341
+ OS << overloadKindStr (*It);
342
+ for (++It; It != Overloads .end (); ++It) {
343
+ OS << " | " << overloadKindStr (*It);
302
344
}
303
345
return OS.str ();
304
346
}
@@ -368,8 +410,8 @@ static void emitDXILOperationTable(std::vector<DXILOperationDesc> &Ops,
368
410
OS << " { dxil::OpCode::" << Op.OpName << " , "
369
411
<< OpStrings.get (Op.OpName .str ()) << " , OpCodeClass::" << Op.OpClass
370
412
<< " , " << OpClassStrings.get (getDXILOpClassName (Op.OpClass )) << " , "
371
- << getDXILOperationOverload (Op.OverloadTypes ) << " , "
372
- << emitDXILOperationFnAttr (Op.FnAttr ) << " , " << Op.OverloadParamIndex
413
+ << getDXILOperationOverloads (Op.OverloadTypes ) << " , "
414
+ << emitDXILOperationAttr (Op.Attr ) << " , " << Op.OverloadParamIndex
373
415
<< " , " << Op.Params .size () << " , "
374
416
<< Parameters.get (ParameterMap[Op.OpClass ]) << " },\n " ;
375
417
}
0 commit comments