29 #define DEBUG_TYPE "asm-printer"
32 #include "SPIRVGenAsmWriter.inc"
38 bool SkipImmediates) {
39 const unsigned NumOps =
MI->getNumOperands();
40 for (
unsigned i = StartIndex;
i < NumOps; ++
i) {
41 if (!SkipImmediates || !
MI->getOperand(
i).isImm()) {
42 if (!SkipFirstSpace ||
i != StartIndex)
53 if (
MI->getNumOperands() - StartIndex == 2) {
55 Imm |= (
MI->getOperand(StartIndex + 1).getImm() << 32);
58 printRemainingVariableOps(
MI, StartIndex,
O,
true,
false);
62 void SPIRVInstPrinter::recordOpExtInstImport(
const MCInst *
MI) {
69 const unsigned OpCode =
MI->getOpcode();
70 printInstruction(
MI, Address, OS);
72 if (OpCode == SPIRV::OpDecorate) {
73 printOpDecorate(
MI, OS);
74 }
else if (OpCode == SPIRV::OpExtInstImport) {
75 recordOpExtInstImport(
MI);
76 }
else if (OpCode == SPIRV::OpExtInst) {
77 printOpExtInst(
MI, OS);
83 const unsigned LastFixedIndex = NumFixedOps - 1;
84 const int FirstVariableIndex = NumFixedOps;
85 if (NumFixedOps > 0 &&
91 case SPIRV::OpTypeImage:
93 printSymbolicOperand<OperandCategory::AccessQualifierOperand>(
94 MI, FirstVariableIndex, OS);
96 case SPIRV::OpVariable:
100 case SPIRV::OpEntryPoint: {
103 printRemainingVariableOps(
MI, NumFixedOps, OS,
false,
true);
106 case SPIRV::OpExecutionMode:
107 case SPIRV::OpExecutionModeId:
108 case SPIRV::OpLoopMerge: {
110 printRemainingVariableOps(
MI, NumFixedOps, OS);
124 printSymbolicOperand<OperandCategory::MemoryOperandOperand>(
125 MI, FirstVariableIndex, OS);
126 printRemainingVariableOps(
MI, FirstVariableIndex + 1, OS);
128 case SPIRV::OpImageSampleImplicitLod:
129 case SPIRV::OpImageSampleDrefImplicitLod:
130 case SPIRV::OpImageSampleProjImplicitLod:
131 case SPIRV::OpImageSampleProjDrefImplicitLod:
132 case SPIRV::OpImageFetch:
133 case SPIRV::OpImageGather:
134 case SPIRV::OpImageDrefGather:
135 case SPIRV::OpImageRead:
136 case SPIRV::OpImageWrite:
137 case SPIRV::OpImageSparseSampleImplicitLod:
138 case SPIRV::OpImageSparseSampleDrefImplicitLod:
139 case SPIRV::OpImageSparseSampleProjImplicitLod:
140 case SPIRV::OpImageSparseSampleProjDrefImplicitLod:
141 case SPIRV::OpImageSparseFetch:
142 case SPIRV::OpImageSparseGather:
143 case SPIRV::OpImageSparseDrefGather:
144 case SPIRV::OpImageSparseRead:
145 case SPIRV::OpImageSampleFootprintNV:
147 printSymbolicOperand<OperandCategory::ImageOperandOperand>(
148 MI, FirstVariableIndex, OS);
149 printRemainingVariableOps(
MI, NumFixedOps + 1, OS);
151 case SPIRV::OpCopyMemory:
152 case SPIRV::OpCopyMemorySized: {
153 const unsigned NumOps =
MI->getNumOperands();
154 for (
unsigned i = NumFixedOps;
i < NumOps; ++
i) {
156 printSymbolicOperand<OperandCategory::MemoryOperandOperand>(
MI,
i,
158 if (
MI->getOperand(
i).getImm() & MemoryOperand::Aligned) {
159 assert(
i + 1 < NumOps &&
"Missing alignment operand");
167 case SPIRV::OpConstantI:
168 case SPIRV::OpConstantF:
169 printOpConstantVarOps(
MI, NumFixedOps, OS);
172 printRemainingVariableOps(
MI, NumFixedOps, OS);
179 printAnnotation(OS, Annot);
187 const auto NumOps =
MI->getNumOperands();
188 if (NumOps == NumFixedOps)
194 printRemainingVariableOps(
MI, NumFixedOps,
O,
true);
203 if (NumFixedOps !=
MI->getNumOperands()) {
204 auto DecOp =
MI->getOperand(NumFixedOps - 1);
205 auto Dec =
static_cast<Decoration::Decoration
>(DecOp.getImm());
210 case Decoration::BuiltIn:
211 printSymbolicOperand<OperandCategory::BuiltInOperand>(
MI, NumFixedOps,
O);
213 case Decoration::UniformId:
214 printSymbolicOperand<OperandCategory::ScopeOperand>(
MI, NumFixedOps,
O);
216 case Decoration::FuncParamAttr:
217 printSymbolicOperand<OperandCategory::FunctionParameterAttributeOperand>(
220 case Decoration::FPRoundingMode:
221 printSymbolicOperand<OperandCategory::FPRoundingModeOperand>(
224 case Decoration::FPFastMathMode:
225 printSymbolicOperand<OperandCategory::FPFastMathModeOperand>(
228 case Decoration::LinkageAttributes:
229 case Decoration::UserSemantic:
230 printStringImm(
MI, NumFixedOps,
O);
233 printRemainingVariableOps(
MI, NumFixedOps,
O,
true);
243 if (
const MCBinaryExpr *BE = dyn_cast<MCBinaryExpr>(Expr))
244 SRE = cast<MCSymbolRefExpr>(BE->getLHS());
246 SRE = cast<MCSymbolRefExpr>(Expr);
257 assert((Modifier == 0 || Modifier[0] == 0) &&
"No modifiers supported");
258 if (OpNo < MI->getNumOperands()) {
263 O << formatImm((int64_t)
Op.getImm());
264 else if (
Op.isDFPImm())
265 O << formatImm((
double)
Op.getDFPImm());
266 else if (
Op.isExpr())
275 const unsigned NumOps =
MI->getNumOperands();
276 unsigned StrStartIndex = OpNo;
277 while (StrStartIndex < NumOps) {
278 if (
MI->getOperand(StrStartIndex).isReg())
282 if (StrStartIndex != OpNo)
292 unsigned numOpsInString = (Str.size() / 4) + 1;
293 StrStartIndex += numOpsInString;
296 if (
MI->getOpcode() == SPIRV::OpDecorate &&
297 MI->getOperand(1).getImm() ==
298 static_cast<unsigned>(Decoration::LinkageAttributes)) {
300 printSymbolicOperand<OperandCategory::LinkageTypeOperand>(
301 MI, StrStartIndex,
O);
312 template <OperandCategory::OperandCategory category>
315 if (OpNo < MI->getNumOperands()) {