1//===-- X86InstComments.cpp - Generate verbose-asm comments for instrs ----===//
2//
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
6//
7//===----------------------------------------------------------------------===//
8//
9// This defines functionality used to emit comments about X86 instructions to
10// an output stream for -fverbose-asm.
11//
12//===----------------------------------------------------------------------===//
13
14#include "X86InstComments.h"
15#include "X86ATTInstPrinter.h"
16#include "X86BaseInfo.h"
17#include "X86MCTargetDesc.h"
18#include "X86ShuffleDecode.h"
19#include "llvm/MC/MCInst.h"
20#include "llvm/MC/MCInstrInfo.h"
21#include "llvm/Support/raw_ostream.h"
22
23using namespace llvm;
24
25#define CASE_SSE_INS_COMMON(Inst, src) \
26 case X86::Inst##src:
27
28#define CASE_AVX_INS_COMMON(Inst, Suffix, src) \
29 case X86::V##Inst##Suffix##src:
30
31#define CASE_MASK_INS_COMMON(Inst, Suffix, src) \
32 case X86::V##Inst##Suffix##src##k:
33
34#define CASE_MASKZ_INS_COMMON(Inst, Suffix, src) \
35 case X86::V##Inst##Suffix##src##kz:
36
37#define CASE_AVX512_INS_COMMON(Inst, Suffix, src) \
38 CASE_AVX_INS_COMMON(Inst, Suffix, src) \
39 CASE_MASK_INS_COMMON(Inst, Suffix, src) \
40 CASE_MASKZ_INS_COMMON(Inst, Suffix, src)
41
42#define CASE_MOVDUP(Inst, src) \
43 CASE_AVX512_INS_COMMON(Inst, Z, r##src) \
44 CASE_AVX512_INS_COMMON(Inst, Z256, r##src) \
45 CASE_AVX512_INS_COMMON(Inst, Z128, r##src) \
46 CASE_AVX_INS_COMMON(Inst, , r##src) \
47 CASE_AVX_INS_COMMON(Inst, Y, r##src) \
48 CASE_SSE_INS_COMMON(Inst, r##src)
49
50#define CASE_MASK_MOVDUP(Inst, src) \
51 CASE_MASK_INS_COMMON(Inst, Z, r##src) \
52 CASE_MASK_INS_COMMON(Inst, Z256, r##src) \
53 CASE_MASK_INS_COMMON(Inst, Z128, r##src)
54
55#define CASE_MASKZ_MOVDUP(Inst, src) \
56 CASE_MASKZ_INS_COMMON(Inst, Z, r##src) \
57 CASE_MASKZ_INS_COMMON(Inst, Z256, r##src) \
58 CASE_MASKZ_INS_COMMON(Inst, Z128, r##src)
59
60#define CASE_PMOVZX(Inst, src) \
61 CASE_AVX512_INS_COMMON(Inst, Z, r##src) \
62 CASE_AVX512_INS_COMMON(Inst, Z256, r##src) \
63 CASE_AVX512_INS_COMMON(Inst, Z128, r##src) \
64 CASE_AVX_INS_COMMON(Inst, , r##src) \
65 CASE_AVX_INS_COMMON(Inst, Y, r##src) \
66 CASE_SSE_INS_COMMON(Inst, r##src)
67
68#define CASE_UNPCK(Inst, src) \
69 CASE_AVX512_INS_COMMON(Inst, Z, r##src) \
70 CASE_AVX512_INS_COMMON(Inst, Z256, r##src) \
71 CASE_AVX512_INS_COMMON(Inst, Z128, r##src) \
72 CASE_AVX_INS_COMMON(Inst, , r##src) \
73 CASE_AVX_INS_COMMON(Inst, Y, r##src) \
74 CASE_SSE_INS_COMMON(Inst, r##src)
75
76#define CASE_MASK_UNPCK(Inst, src) \
77 CASE_MASK_INS_COMMON(Inst, Z, r##src) \
78 CASE_MASK_INS_COMMON(Inst, Z256, r##src) \
79 CASE_MASK_INS_COMMON(Inst, Z128, r##src)
80
81#define CASE_MASKZ_UNPCK(Inst, src) \
82 CASE_MASKZ_INS_COMMON(Inst, Z, r##src) \
83 CASE_MASKZ_INS_COMMON(Inst, Z256, r##src) \
84 CASE_MASKZ_INS_COMMON(Inst, Z128, r##src)
85
86#define CASE_SHUF(Inst, suf) \
87 CASE_AVX512_INS_COMMON(Inst, Z, suf) \
88 CASE_AVX512_INS_COMMON(Inst, Z256, suf) \
89 CASE_AVX512_INS_COMMON(Inst, Z128, suf) \
90 CASE_AVX_INS_COMMON(Inst, , suf) \
91 CASE_AVX_INS_COMMON(Inst, Y, suf) \
92 CASE_SSE_INS_COMMON(Inst, suf)
93
94#define CASE_MASK_SHUF(Inst, src) \
95 CASE_MASK_INS_COMMON(Inst, Z, r##src##i) \
96 CASE_MASK_INS_COMMON(Inst, Z256, r##src##i) \
97 CASE_MASK_INS_COMMON(Inst, Z128, r##src##i)
98
99#define CASE_MASKZ_SHUF(Inst, src) \
100 CASE_MASKZ_INS_COMMON(Inst, Z, r##src##i) \
101 CASE_MASKZ_INS_COMMON(Inst, Z256, r##src##i) \
102 CASE_MASKZ_INS_COMMON(Inst, Z128, r##src##i)
103
104#define CASE_VPERMILPI(Inst, src) \
105 CASE_AVX512_INS_COMMON(Inst, Z, src##i) \
106 CASE_AVX512_INS_COMMON(Inst, Z256, src##i) \
107 CASE_AVX512_INS_COMMON(Inst, Z128, src##i) \
108 CASE_AVX_INS_COMMON(Inst, , src##i) \
109 CASE_AVX_INS_COMMON(Inst, Y, src##i)
110
111#define CASE_MASK_VPERMILPI(Inst, src) \
112 CASE_MASK_INS_COMMON(Inst, Z, src##i) \
113 CASE_MASK_INS_COMMON(Inst, Z256, src##i) \
114 CASE_MASK_INS_COMMON(Inst, Z128, src##i)
115
116#define CASE_MASKZ_VPERMILPI(Inst, src) \
117 CASE_MASKZ_INS_COMMON(Inst, Z, src##i) \
118 CASE_MASKZ_INS_COMMON(Inst, Z256, src##i) \
119 CASE_MASKZ_INS_COMMON(Inst, Z128, src##i)
120
121#define CASE_VPERM(Inst, src) \
122 CASE_AVX512_INS_COMMON(Inst, Z, src##i) \
123 CASE_AVX512_INS_COMMON(Inst, Z256, src##i) \
124 CASE_AVX_INS_COMMON(Inst, Y, src##i)
125
126#define CASE_MASK_VPERM(Inst, src) \
127 CASE_MASK_INS_COMMON(Inst, Z, src##i) \
128 CASE_MASK_INS_COMMON(Inst, Z256, src##i)
129
130#define CASE_MASKZ_VPERM(Inst, src) \
131 CASE_MASKZ_INS_COMMON(Inst, Z, src##i) \
132 CASE_MASKZ_INS_COMMON(Inst, Z256, src##i)
133
134#define CASE_VSHUF(Inst, src) \
135 CASE_AVX512_INS_COMMON(SHUFF##Inst, Z, r##src##i) \
136 CASE_AVX512_INS_COMMON(SHUFI##Inst, Z, r##src##i) \
137 CASE_AVX512_INS_COMMON(SHUFF##Inst, Z256, r##src##i) \
138 CASE_AVX512_INS_COMMON(SHUFI##Inst, Z256, r##src##i)
139
140#define CASE_MASK_VSHUF(Inst, src) \
141 CASE_MASK_INS_COMMON(SHUFF##Inst, Z, r##src##i) \
142 CASE_MASK_INS_COMMON(SHUFI##Inst, Z, r##src##i) \
143 CASE_MASK_INS_COMMON(SHUFF##Inst, Z256, r##src##i) \
144 CASE_MASK_INS_COMMON(SHUFI##Inst, Z256, r##src##i)
145
146#define CASE_MASKZ_VSHUF(Inst, src) \
147 CASE_MASKZ_INS_COMMON(SHUFF##Inst, Z, r##src##i) \
148 CASE_MASKZ_INS_COMMON(SHUFI##Inst, Z, r##src##i) \
149 CASE_MASKZ_INS_COMMON(SHUFF##Inst, Z256, r##src##i) \
150 CASE_MASKZ_INS_COMMON(SHUFI##Inst, Z256, r##src##i)
151
152#define CASE_AVX512_FMA(Inst, suf) \
153 CASE_AVX512_INS_COMMON(Inst, Z, suf) \
154 CASE_AVX512_INS_COMMON(Inst, Z256, suf) \
155 CASE_AVX512_INS_COMMON(Inst, Z128, suf)
156
157#define CASE_FMA(Inst, suf) \
158 CASE_AVX512_FMA(Inst, suf) \
159 CASE_AVX_INS_COMMON(Inst, , suf) \
160 CASE_AVX_INS_COMMON(Inst, Y, suf)
161
162#define CASE_FMA_PACKED_REG(Inst) \
163 CASE_FMA(Inst##PD, r) \
164 CASE_FMA(Inst##PS, r)
165
166#define CASE_FMA_PACKED_MEM(Inst) \
167 CASE_FMA(Inst##PD, m) \
168 CASE_FMA(Inst##PS, m) \
169 CASE_AVX512_FMA(Inst##PD, mb) \
170 CASE_AVX512_FMA(Inst##PS, mb)
171
172#define CASE_FMA_SCALAR_REG(Inst) \
173 CASE_AVX_INS_COMMON(Inst##SD, , r) \
174 CASE_AVX_INS_COMMON(Inst##SS, , r) \
175 CASE_AVX_INS_COMMON(Inst##SD, , r_Int) \
176 CASE_AVX_INS_COMMON(Inst##SS, , r_Int) \
177 CASE_AVX_INS_COMMON(Inst##SD, Z, r) \
178 CASE_AVX_INS_COMMON(Inst##SS, Z, r) \
179 CASE_AVX512_INS_COMMON(Inst##SD, Z, r_Int) \
180 CASE_AVX512_INS_COMMON(Inst##SS, Z, r_Int)
181
182#define CASE_FMA_SCALAR_MEM(Inst) \
183 CASE_AVX_INS_COMMON(Inst##SD, , m) \
184 CASE_AVX_INS_COMMON(Inst##SS, , m) \
185 CASE_AVX_INS_COMMON(Inst##SD, , m_Int) \
186 CASE_AVX_INS_COMMON(Inst##SS, , m_Int) \
187 CASE_AVX_INS_COMMON(Inst##SD, Z, m) \
188 CASE_AVX_INS_COMMON(Inst##SS, Z, m) \
189 CASE_AVX512_INS_COMMON(Inst##SD, Z, m_Int) \
190 CASE_AVX512_INS_COMMON(Inst##SS, Z, m_Int)
191
192#define CASE_FMA4(Inst, suf) \
193 CASE_AVX_INS_COMMON(Inst, 4, suf) \
194 CASE_AVX_INS_COMMON(Inst, 4Y, suf)
195
196#define CASE_FMA4_PACKED_RR(Inst) \
197 CASE_FMA4(Inst##PD, rr) \
198 CASE_FMA4(Inst##PS, rr)
199
200#define CASE_FMA4_PACKED_RM(Inst) \
201 CASE_FMA4(Inst##PD, rm) \
202 CASE_FMA4(Inst##PS, rm)
203
204#define CASE_FMA4_PACKED_MR(Inst) \
205 CASE_FMA4(Inst##PD, mr) \
206 CASE_FMA4(Inst##PS, mr)
207
208#define CASE_FMA4_SCALAR_RR(Inst) \
209 CASE_AVX_INS_COMMON(Inst##SD4, , rr) \
210 CASE_AVX_INS_COMMON(Inst##SS4, , rr) \
211 CASE_AVX_INS_COMMON(Inst##SD4, , rr_Int) \
212 CASE_AVX_INS_COMMON(Inst##SS4, , rr_Int)
213
214#define CASE_FMA4_SCALAR_RM(Inst) \
215 CASE_AVX_INS_COMMON(Inst##SD4, , rm) \
216 CASE_AVX_INS_COMMON(Inst##SS4, , rm) \
217 CASE_AVX_INS_COMMON(Inst##SD4, , rm_Int) \
218 CASE_AVX_INS_COMMON(Inst##SS4, , rm_Int)
219
220#define CASE_FMA4_SCALAR_MR(Inst) \
221 CASE_AVX_INS_COMMON(Inst##SD4, , mr) \
222 CASE_AVX_INS_COMMON(Inst##SS4, , mr) \
223 CASE_AVX_INS_COMMON(Inst##SD4, , mr_Int) \
224 CASE_AVX_INS_COMMON(Inst##SS4, , mr_Int)
225
226static unsigned getVectorRegSize(unsigned RegNo) {
227 if (X86II::isZMMReg(RegNo))
228 return 512;
229 if (X86II::isYMMReg(RegNo))
230 return 256;
231 if (X86II::isXMMReg(RegNo))
232 return 128;
233 if (X86::MM0 <= RegNo && RegNo <= X86::MM7)
234 return 64;
235
236 llvm_unreachable("Unknown vector reg!");
237}
238
239static unsigned getRegOperandNumElts(const MCInst *MI, unsigned ScalarSize,
240 unsigned OperandIndex) {
241 unsigned OpReg = MI->getOperand(i: OperandIndex).getReg();
242 return getVectorRegSize(RegNo: OpReg) / ScalarSize;
243}
244
245static const char *getRegName(MCRegister Reg) {
246 return X86ATTInstPrinter::getRegisterName(Reg);
247}
248
249/// Wraps the destination register name with AVX512 mask/maskz filtering.
250static void printMasking(raw_ostream &OS, const MCInst *MI,
251 const MCInstrInfo &MCII) {
252 const MCInstrDesc &Desc = MCII.get(Opcode: MI->getOpcode());
253 uint64_t TSFlags = Desc.TSFlags;
254
255 if (!(TSFlags & X86II::EVEX_K))
256 return;
257
258 bool MaskWithZero = (TSFlags & X86II::EVEX_Z);
259 unsigned MaskOp = Desc.getNumDefs();
260
261 if (Desc.getOperandConstraint(OpNum: MaskOp, Constraint: MCOI::TIED_TO) != -1)
262 ++MaskOp;
263
264 const char *MaskRegName = getRegName(Reg: MI->getOperand(i: MaskOp).getReg());
265
266 // MASK: zmmX {%kY}
267 OS << " {%" << MaskRegName << "}";
268
269 // MASKZ: zmmX {%kY} {z}
270 if (MaskWithZero)
271 OS << " {z}";
272}
273
274static bool printFMAComments(const MCInst *MI, raw_ostream &OS,
275 const MCInstrInfo &MCII) {
276 const char *Mul1Name = nullptr, *Mul2Name = nullptr, *AccName = nullptr;
277 unsigned NumOperands = MI->getNumOperands();
278 bool RegForm = false;
279 bool Negate = false;
280 StringRef AccStr = "+";
281
282 // The operands for FMA3 instructions without rounding fall into two forms:
283 // dest, src1, src2, src3
284 // dest, src1, mask, src2, src3
285 // Where src3 is either a register or 5 memory address operands. So to find
286 // dest and src1 we can index from the front. To find src2 and src3 we can
287 // index from the end by taking into account memory vs register form when
288 // finding src2.
289
290 // The operands for FMA4 instructions:
291 // dest, src1, src2, src3
292 // Where src2 OR src3 are either a register or 5 memory address operands. So
293 // to find dest and src1 we can index from the front, src2 (reg/mem) follows
294 // and then src3 (reg) will be at the end.
295
296 switch (MI->getOpcode()) {
297 default:
298 return false;
299
300 CASE_FMA4_PACKED_RR(FMADD)
301 CASE_FMA4_SCALAR_RR(FMADD)
302 AccName = getRegName(Reg: MI->getOperand(i: NumOperands - 1).getReg());
303 [[fallthrough]];
304 CASE_FMA4_PACKED_RM(FMADD)
305 CASE_FMA4_SCALAR_RM(FMADD)
306 Mul2Name = getRegName(Reg: MI->getOperand(i: 2).getReg());
307 Mul1Name = getRegName(Reg: MI->getOperand(i: 1).getReg());
308 break;
309 CASE_FMA4_PACKED_MR(FMADD)
310 CASE_FMA4_SCALAR_MR(FMADD)
311 AccName = getRegName(Reg: MI->getOperand(i: NumOperands - 1).getReg());
312 Mul1Name = getRegName(Reg: MI->getOperand(i: 1).getReg());
313 break;
314
315 CASE_FMA4_PACKED_RR(FMSUB)
316 CASE_FMA4_SCALAR_RR(FMSUB)
317 AccName = getRegName(Reg: MI->getOperand(i: NumOperands - 1).getReg());
318 [[fallthrough]];
319 CASE_FMA4_PACKED_RM(FMSUB)
320 CASE_FMA4_SCALAR_RM(FMSUB)
321 Mul2Name = getRegName(Reg: MI->getOperand(i: 2).getReg());
322 Mul1Name = getRegName(Reg: MI->getOperand(i: 1).getReg());
323 AccStr = "-";
324 break;
325 CASE_FMA4_PACKED_MR(FMSUB)
326 CASE_FMA4_SCALAR_MR(FMSUB)
327 AccName = getRegName(Reg: MI->getOperand(i: NumOperands - 1).getReg());
328 Mul1Name = getRegName(Reg: MI->getOperand(i: 1).getReg());
329 AccStr = "-";
330 break;
331
332 CASE_FMA4_PACKED_RR(FNMADD)
333 CASE_FMA4_SCALAR_RR(FNMADD)
334 AccName = getRegName(Reg: MI->getOperand(i: NumOperands - 1).getReg());
335 [[fallthrough]];
336 CASE_FMA4_PACKED_RM(FNMADD)
337 CASE_FMA4_SCALAR_RM(FNMADD)
338 Mul2Name = getRegName(Reg: MI->getOperand(i: 2).getReg());
339 Mul1Name = getRegName(Reg: MI->getOperand(i: 1).getReg());
340 Negate = true;
341 break;
342 CASE_FMA4_PACKED_MR(FNMADD)
343 CASE_FMA4_SCALAR_MR(FNMADD)
344 AccName = getRegName(Reg: MI->getOperand(i: NumOperands - 1).getReg());
345 Mul1Name = getRegName(Reg: MI->getOperand(i: 1).getReg());
346 Negate = true;
347 break;
348
349 CASE_FMA4_PACKED_RR(FNMSUB)
350 CASE_FMA4_SCALAR_RR(FNMSUB)
351 AccName = getRegName(Reg: MI->getOperand(i: NumOperands - 1).getReg());
352 [[fallthrough]];
353 CASE_FMA4_PACKED_RM(FNMSUB)
354 CASE_FMA4_SCALAR_RM(FNMSUB)
355 Mul2Name = getRegName(Reg: MI->getOperand(i: 2).getReg());
356 Mul1Name = getRegName(Reg: MI->getOperand(i: 1).getReg());
357 AccStr = "-";
358 Negate = true;
359 break;
360 CASE_FMA4_PACKED_MR(FNMSUB)
361 CASE_FMA4_SCALAR_MR(FNMSUB)
362 AccName = getRegName(Reg: MI->getOperand(i: NumOperands - 1).getReg());
363 Mul1Name = getRegName(Reg: MI->getOperand(i: 1).getReg());
364 AccStr = "-";
365 Negate = true;
366 break;
367
368 CASE_FMA4_PACKED_RR(FMADDSUB)
369 AccName = getRegName(Reg: MI->getOperand(i: NumOperands - 1).getReg());
370 [[fallthrough]];
371 CASE_FMA4_PACKED_RM(FMADDSUB)
372 Mul2Name = getRegName(Reg: MI->getOperand(i: 2).getReg());
373 Mul1Name = getRegName(Reg: MI->getOperand(i: 1).getReg());
374 AccStr = "+/-";
375 break;
376 CASE_FMA4_PACKED_MR(FMADDSUB)
377 AccName = getRegName(Reg: MI->getOperand(i: NumOperands - 1).getReg());
378 Mul1Name = getRegName(Reg: MI->getOperand(i: 1).getReg());
379 AccStr = "+/-";
380 break;
381
382 CASE_FMA4_PACKED_RR(FMSUBADD)
383 AccName = getRegName(Reg: MI->getOperand(i: NumOperands - 1).getReg());
384 [[fallthrough]];
385 CASE_FMA4_PACKED_RM(FMSUBADD)
386 Mul2Name = getRegName(Reg: MI->getOperand(i: 2).getReg());
387 Mul1Name = getRegName(Reg: MI->getOperand(i: 1).getReg());
388 AccStr = "-/+";
389 break;
390 CASE_FMA4_PACKED_MR(FMSUBADD)
391 AccName = getRegName(Reg: MI->getOperand(i: NumOperands - 1).getReg());
392 Mul1Name = getRegName(Reg: MI->getOperand(i: 1).getReg());
393 AccStr = "-/+";
394 break;
395
396 CASE_FMA_PACKED_REG(FMADD132)
397 CASE_FMA_SCALAR_REG(FMADD132)
398 Mul2Name = getRegName(Reg: MI->getOperand(i: NumOperands - 1).getReg());
399 RegForm = true;
400 [[fallthrough]];
401 CASE_FMA_PACKED_MEM(FMADD132)
402 CASE_FMA_SCALAR_MEM(FMADD132)
403 AccName = getRegName(Reg: MI->getOperand(i: NumOperands-(RegForm?2:6)).getReg());
404 Mul1Name = getRegName(Reg: MI->getOperand(i: 1).getReg());
405 break;
406
407 CASE_FMA_PACKED_REG(FMADD213)
408 CASE_FMA_SCALAR_REG(FMADD213)
409 AccName = getRegName(Reg: MI->getOperand(i: NumOperands - 1).getReg());
410 RegForm = true;
411 [[fallthrough]];
412 CASE_FMA_PACKED_MEM(FMADD213)
413 CASE_FMA_SCALAR_MEM(FMADD213)
414 Mul1Name = getRegName(Reg: MI->getOperand(i: NumOperands-(RegForm?2:6)).getReg());
415 Mul2Name = getRegName(Reg: MI->getOperand(i: 1).getReg());
416 break;
417
418 CASE_FMA_PACKED_REG(FMADD231)
419 CASE_FMA_SCALAR_REG(FMADD231)
420 Mul2Name = getRegName(Reg: MI->getOperand(i: NumOperands - 1).getReg());
421 RegForm = true;
422 [[fallthrough]];
423 CASE_FMA_PACKED_MEM(FMADD231)
424 CASE_FMA_SCALAR_MEM(FMADD231)
425 Mul1Name = getRegName(Reg: MI->getOperand(i: NumOperands-(RegForm?2:6)).getReg());
426 AccName = getRegName(Reg: MI->getOperand(i: 1).getReg());
427 break;
428
429 CASE_FMA_PACKED_REG(FMSUB132)
430 CASE_FMA_SCALAR_REG(FMSUB132)
431 Mul2Name = getRegName(Reg: MI->getOperand(i: NumOperands - 1).getReg());
432 RegForm = true;
433 [[fallthrough]];
434 CASE_FMA_PACKED_MEM(FMSUB132)
435 CASE_FMA_SCALAR_MEM(FMSUB132)
436 AccName = getRegName(Reg: MI->getOperand(i: NumOperands-(RegForm?2:6)).getReg());
437 Mul1Name = getRegName(Reg: MI->getOperand(i: 1).getReg());
438 AccStr = "-";
439 break;
440
441 CASE_FMA_PACKED_REG(FMSUB213)
442 CASE_FMA_SCALAR_REG(FMSUB213)
443 AccName = getRegName(Reg: MI->getOperand(i: NumOperands - 1).getReg());
444 RegForm = true;
445 [[fallthrough]];
446 CASE_FMA_PACKED_MEM(FMSUB213)
447 CASE_FMA_SCALAR_MEM(FMSUB213)
448 Mul1Name = getRegName(Reg: MI->getOperand(i: NumOperands-(RegForm?2:6)).getReg());
449 Mul2Name = getRegName(Reg: MI->getOperand(i: 1).getReg());
450 AccStr = "-";
451 break;
452
453 CASE_FMA_PACKED_REG(FMSUB231)
454 CASE_FMA_SCALAR_REG(FMSUB231)
455 Mul2Name = getRegName(Reg: MI->getOperand(i: NumOperands - 1).getReg());
456 RegForm = true;
457 [[fallthrough]];
458 CASE_FMA_PACKED_MEM(FMSUB231)
459 CASE_FMA_SCALAR_MEM(FMSUB231)
460 Mul1Name = getRegName(Reg: MI->getOperand(i: NumOperands-(RegForm?2:6)).getReg());
461 AccName = getRegName(Reg: MI->getOperand(i: 1).getReg());
462 AccStr = "-";
463 break;
464
465 CASE_FMA_PACKED_REG(FNMADD132)
466 CASE_FMA_SCALAR_REG(FNMADD132)
467 Mul2Name = getRegName(Reg: MI->getOperand(i: NumOperands - 1).getReg());
468 RegForm = true;
469 [[fallthrough]];
470 CASE_FMA_PACKED_MEM(FNMADD132)
471 CASE_FMA_SCALAR_MEM(FNMADD132)
472 AccName = getRegName(Reg: MI->getOperand(i: NumOperands-(RegForm?2:6)).getReg());
473 Mul1Name = getRegName(Reg: MI->getOperand(i: 1).getReg());
474 Negate = true;
475 break;
476
477 CASE_FMA_PACKED_REG(FNMADD213)
478 CASE_FMA_SCALAR_REG(FNMADD213)
479 AccName = getRegName(Reg: MI->getOperand(i: NumOperands - 1).getReg());
480 RegForm = true;
481 [[fallthrough]];
482 CASE_FMA_PACKED_MEM(FNMADD213)
483 CASE_FMA_SCALAR_MEM(FNMADD213)
484 Mul1Name = getRegName(Reg: MI->getOperand(i: NumOperands-(RegForm?2:6)).getReg());
485 Mul2Name = getRegName(Reg: MI->getOperand(i: 1).getReg());
486 Negate = true;
487 break;
488
489 CASE_FMA_PACKED_REG(FNMADD231)
490 CASE_FMA_SCALAR_REG(FNMADD231)
491 Mul2Name = getRegName(Reg: MI->getOperand(i: NumOperands - 1).getReg());
492 RegForm = true;
493 [[fallthrough]];
494 CASE_FMA_PACKED_MEM(FNMADD231)
495 CASE_FMA_SCALAR_MEM(FNMADD231)
496 Mul1Name = getRegName(Reg: MI->getOperand(i: NumOperands-(RegForm?2:6)).getReg());
497 AccName = getRegName(Reg: MI->getOperand(i: 1).getReg());
498 Negate = true;
499 break;
500
501 CASE_FMA_PACKED_REG(FNMSUB132)
502 CASE_FMA_SCALAR_REG(FNMSUB132)
503 Mul2Name = getRegName(Reg: MI->getOperand(i: NumOperands - 1).getReg());
504 RegForm = true;
505 [[fallthrough]];
506 CASE_FMA_PACKED_MEM(FNMSUB132)
507 CASE_FMA_SCALAR_MEM(FNMSUB132)
508 AccName = getRegName(Reg: MI->getOperand(i: NumOperands-(RegForm?2:6)).getReg());
509 Mul1Name = getRegName(Reg: MI->getOperand(i: 1).getReg());
510 AccStr = "-";
511 Negate = true;
512 break;
513
514 CASE_FMA_PACKED_REG(FNMSUB213)
515 CASE_FMA_SCALAR_REG(FNMSUB213)
516 AccName = getRegName(Reg: MI->getOperand(i: NumOperands - 1).getReg());
517 RegForm = true;
518 [[fallthrough]];
519 CASE_FMA_PACKED_MEM(FNMSUB213)
520 CASE_FMA_SCALAR_MEM(FNMSUB213)
521 Mul1Name = getRegName(Reg: MI->getOperand(i: NumOperands-(RegForm?2:6)).getReg());
522 Mul2Name = getRegName(Reg: MI->getOperand(i: 1).getReg());
523 AccStr = "-";
524 Negate = true;
525 break;
526
527 CASE_FMA_PACKED_REG(FNMSUB231)
528 CASE_FMA_SCALAR_REG(FNMSUB231)
529 Mul2Name = getRegName(Reg: MI->getOperand(i: NumOperands - 1).getReg());
530 RegForm = true;
531 [[fallthrough]];
532 CASE_FMA_PACKED_MEM(FNMSUB231)
533 CASE_FMA_SCALAR_MEM(FNMSUB231)
534 Mul1Name = getRegName(Reg: MI->getOperand(i: NumOperands-(RegForm?2:6)).getReg());
535 AccName = getRegName(Reg: MI->getOperand(i: 1).getReg());
536 AccStr = "-";
537 Negate = true;
538 break;
539
540 CASE_FMA_PACKED_REG(FMADDSUB132)
541 Mul2Name = getRegName(Reg: MI->getOperand(i: NumOperands - 1).getReg());
542 RegForm = true;
543 [[fallthrough]];
544 CASE_FMA_PACKED_MEM(FMADDSUB132)
545 AccName = getRegName(Reg: MI->getOperand(i: NumOperands-(RegForm?2:6)).getReg());
546 Mul1Name = getRegName(Reg: MI->getOperand(i: 1).getReg());
547 AccStr = "+/-";
548 break;
549
550 CASE_FMA_PACKED_REG(FMADDSUB213)
551 AccName = getRegName(Reg: MI->getOperand(i: NumOperands - 1).getReg());
552 RegForm = true;
553 [[fallthrough]];
554 CASE_FMA_PACKED_MEM(FMADDSUB213)
555 Mul1Name = getRegName(Reg: MI->getOperand(i: NumOperands-(RegForm?2:6)).getReg());
556 Mul2Name = getRegName(Reg: MI->getOperand(i: 1).getReg());
557 AccStr = "+/-";
558 break;
559
560 CASE_FMA_PACKED_REG(FMADDSUB231)
561 Mul2Name = getRegName(Reg: MI->getOperand(i: NumOperands - 1).getReg());
562 RegForm = true;
563 [[fallthrough]];
564 CASE_FMA_PACKED_MEM(FMADDSUB231)
565 Mul1Name = getRegName(Reg: MI->getOperand(i: NumOperands-(RegForm?2:6)).getReg());
566 AccName = getRegName(Reg: MI->getOperand(i: 1).getReg());
567 AccStr = "+/-";
568 break;
569
570 CASE_FMA_PACKED_REG(FMSUBADD132)
571 Mul2Name = getRegName(Reg: MI->getOperand(i: NumOperands - 1).getReg());
572 RegForm = true;
573 [[fallthrough]];
574 CASE_FMA_PACKED_MEM(FMSUBADD132)
575 AccName = getRegName(Reg: MI->getOperand(i: NumOperands-(RegForm?2:6)).getReg());
576 Mul1Name = getRegName(Reg: MI->getOperand(i: 1).getReg());
577 AccStr = "-/+";
578 break;
579
580 CASE_FMA_PACKED_REG(FMSUBADD213)
581 AccName = getRegName(Reg: MI->getOperand(i: NumOperands - 1).getReg());
582 RegForm = true;
583 [[fallthrough]];
584 CASE_FMA_PACKED_MEM(FMSUBADD213)
585 Mul1Name = getRegName(Reg: MI->getOperand(i: NumOperands-(RegForm?2:6)).getReg());
586 Mul2Name = getRegName(Reg: MI->getOperand(i: 1).getReg());
587 AccStr = "-/+";
588 break;
589
590 CASE_FMA_PACKED_REG(FMSUBADD231)
591 Mul2Name = getRegName(Reg: MI->getOperand(i: NumOperands - 1).getReg());
592 RegForm = true;
593 [[fallthrough]];
594 CASE_FMA_PACKED_MEM(FMSUBADD231)
595 Mul1Name = getRegName(Reg: MI->getOperand(i: NumOperands-(RegForm?2:6)).getReg());
596 AccName = getRegName(Reg: MI->getOperand(i: 1).getReg());
597 AccStr = "-/+";
598 break;
599 }
600
601 const char *DestName = getRegName(Reg: MI->getOperand(i: 0).getReg());
602
603 if (!Mul1Name) Mul1Name = "mem";
604 if (!Mul2Name) Mul2Name = "mem";
605 if (!AccName) AccName = "mem";
606
607 OS << DestName;
608 printMasking(OS, MI, MCII);
609 OS << " = ";
610
611 if (Negate)
612 OS << '-';
613
614 OS << '(' << Mul1Name << " * " << Mul2Name << ") " << AccStr << ' '
615 << AccName << '\n';
616
617 return true;
618}
619
620
621//===----------------------------------------------------------------------===//
622// Top Level Entrypoint
623//===----------------------------------------------------------------------===//
624
625/// EmitAnyX86InstComments - This function decodes x86 instructions and prints
626/// newline terminated strings to the specified string if desired. This
627/// information is shown in disassembly dumps when verbose assembly is enabled.
628bool llvm::EmitAnyX86InstComments(const MCInst *MI, raw_ostream &OS,
629 const MCInstrInfo &MCII) {
630 // If this is a shuffle operation, the switch should fill in this state.
631 SmallVector<int, 8> ShuffleMask;
632 const char *DestName = nullptr, *Src1Name = nullptr, *Src2Name = nullptr;
633 unsigned NumOperands = MI->getNumOperands();
634 bool RegForm = false;
635
636 if (printFMAComments(MI, OS, MCII))
637 return true;
638
639 switch (MI->getOpcode()) {
640 default:
641 // Not an instruction for which we can decode comments.
642 return false;
643
644 case X86::BLENDPDrri:
645 case X86::VBLENDPDrri:
646 case X86::VBLENDPDYrri:
647 Src2Name = getRegName(Reg: MI->getOperand(i: 2).getReg());
648 [[fallthrough]];
649 case X86::BLENDPDrmi:
650 case X86::VBLENDPDrmi:
651 case X86::VBLENDPDYrmi:
652 if (MI->getOperand(i: NumOperands - 1).isImm())
653 DecodeBLENDMask(NumElts: getRegOperandNumElts(MI, ScalarSize: 64, OperandIndex: 0),
654 Imm: MI->getOperand(i: NumOperands - 1).getImm(),
655 ShuffleMask);
656 Src1Name = getRegName(Reg: MI->getOperand(i: 1).getReg());
657 DestName = getRegName(Reg: MI->getOperand(i: 0).getReg());
658 break;
659
660 case X86::BLENDPSrri:
661 case X86::VBLENDPSrri:
662 case X86::VBLENDPSYrri:
663 Src2Name = getRegName(Reg: MI->getOperand(i: 2).getReg());
664 [[fallthrough]];
665 case X86::BLENDPSrmi:
666 case X86::VBLENDPSrmi:
667 case X86::VBLENDPSYrmi:
668 if (MI->getOperand(i: NumOperands - 1).isImm())
669 DecodeBLENDMask(NumElts: getRegOperandNumElts(MI, ScalarSize: 32, OperandIndex: 0),
670 Imm: MI->getOperand(i: NumOperands - 1).getImm(),
671 ShuffleMask);
672 Src1Name = getRegName(Reg: MI->getOperand(i: 1).getReg());
673 DestName = getRegName(Reg: MI->getOperand(i: 0).getReg());
674 break;
675
676 case X86::PBLENDWrri:
677 case X86::VPBLENDWrri:
678 case X86::VPBLENDWYrri:
679 Src2Name = getRegName(Reg: MI->getOperand(i: 2).getReg());
680 [[fallthrough]];
681 case X86::PBLENDWrmi:
682 case X86::VPBLENDWrmi:
683 case X86::VPBLENDWYrmi:
684 if (MI->getOperand(i: NumOperands - 1).isImm())
685 DecodeBLENDMask(NumElts: getRegOperandNumElts(MI, ScalarSize: 16, OperandIndex: 0),
686 Imm: MI->getOperand(i: NumOperands - 1).getImm(),
687 ShuffleMask);
688 Src1Name = getRegName(Reg: MI->getOperand(i: 1).getReg());
689 DestName = getRegName(Reg: MI->getOperand(i: 0).getReg());
690 break;
691
692 case X86::VPBLENDDrri:
693 case X86::VPBLENDDYrri:
694 Src2Name = getRegName(Reg: MI->getOperand(i: 2).getReg());
695 [[fallthrough]];
696 case X86::VPBLENDDrmi:
697 case X86::VPBLENDDYrmi:
698 if (MI->getOperand(i: NumOperands - 1).isImm())
699 DecodeBLENDMask(NumElts: getRegOperandNumElts(MI, ScalarSize: 32, OperandIndex: 0),
700 Imm: MI->getOperand(i: NumOperands - 1).getImm(),
701 ShuffleMask);
702 Src1Name = getRegName(Reg: MI->getOperand(i: 1).getReg());
703 DestName = getRegName(Reg: MI->getOperand(i: 0).getReg());
704 break;
705
706 case X86::INSERTPSrr:
707 case X86::VINSERTPSrr:
708 case X86::VINSERTPSZrr:
709 Src2Name = getRegName(Reg: MI->getOperand(i: 2).getReg());
710 [[fallthrough]];
711 case X86::INSERTPSrm:
712 case X86::VINSERTPSrm:
713 case X86::VINSERTPSZrm:
714 DestName = getRegName(Reg: MI->getOperand(i: 0).getReg());
715 Src1Name = getRegName(Reg: MI->getOperand(i: 1).getReg());
716 if (MI->getOperand(i: NumOperands - 1).isImm())
717 DecodeINSERTPSMask(Imm: MI->getOperand(i: NumOperands - 1).getImm(),
718 ShuffleMask);
719 break;
720
721 case X86::MOVLHPSrr:
722 case X86::VMOVLHPSrr:
723 case X86::VMOVLHPSZrr:
724 Src2Name = getRegName(Reg: MI->getOperand(i: 2).getReg());
725 Src1Name = getRegName(Reg: MI->getOperand(i: 1).getReg());
726 DestName = getRegName(Reg: MI->getOperand(i: 0).getReg());
727 DecodeMOVLHPSMask(NElts: 2, ShuffleMask);
728 break;
729
730 case X86::MOVHLPSrr:
731 case X86::VMOVHLPSrr:
732 case X86::VMOVHLPSZrr:
733 Src2Name = getRegName(Reg: MI->getOperand(i: 2).getReg());
734 Src1Name = getRegName(Reg: MI->getOperand(i: 1).getReg());
735 DestName = getRegName(Reg: MI->getOperand(i: 0).getReg());
736 DecodeMOVHLPSMask(NElts: 2, ShuffleMask);
737 break;
738
739 case X86::MOVHPDrm:
740 case X86::VMOVHPDrm:
741 case X86::VMOVHPDZ128rm:
742 Src1Name = getRegName(Reg: MI->getOperand(i: 1).getReg());
743 DestName = getRegName(Reg: MI->getOperand(i: 0).getReg());
744 DecodeInsertElementMask(NumElts: 2, Idx: 1, Len: 1, ShuffleMask);
745 break;
746
747 case X86::MOVHPSrm:
748 case X86::VMOVHPSrm:
749 case X86::VMOVHPSZ128rm:
750 Src1Name = getRegName(Reg: MI->getOperand(i: 1).getReg());
751 DestName = getRegName(Reg: MI->getOperand(i: 0).getReg());
752 DecodeInsertElementMask(NumElts: 4, Idx: 2, Len: 2, ShuffleMask);
753 break;
754
755 case X86::MOVLPDrm:
756 case X86::VMOVLPDrm:
757 case X86::VMOVLPDZ128rm:
758 Src1Name = getRegName(Reg: MI->getOperand(i: 1).getReg());
759 DestName = getRegName(Reg: MI->getOperand(i: 0).getReg());
760 DecodeInsertElementMask(NumElts: 2, Idx: 0, Len: 1, ShuffleMask);
761 break;
762
763 case X86::MOVLPSrm:
764 case X86::VMOVLPSrm:
765 case X86::VMOVLPSZ128rm:
766 Src1Name = getRegName(Reg: MI->getOperand(i: 1).getReg());
767 DestName = getRegName(Reg: MI->getOperand(i: 0).getReg());
768 DecodeInsertElementMask(NumElts: 4, Idx: 0, Len: 2, ShuffleMask);
769 break;
770
771 CASE_MOVDUP(MOVSLDUP, r)
772 Src1Name = getRegName(Reg: MI->getOperand(i: NumOperands - 1).getReg());
773 [[fallthrough]];
774
775 CASE_MOVDUP(MOVSLDUP, m)
776 DestName = getRegName(Reg: MI->getOperand(i: 0).getReg());
777 DecodeMOVSLDUPMask(NumElts: getRegOperandNumElts(MI, ScalarSize: 32, OperandIndex: 0), ShuffleMask);
778 break;
779
780 CASE_MOVDUP(MOVSHDUP, r)
781 Src1Name = getRegName(Reg: MI->getOperand(i: NumOperands - 1).getReg());
782 [[fallthrough]];
783
784 CASE_MOVDUP(MOVSHDUP, m)
785 DestName = getRegName(Reg: MI->getOperand(i: 0).getReg());
786 DecodeMOVSHDUPMask(NumElts: getRegOperandNumElts(MI, ScalarSize: 32, OperandIndex: 0), ShuffleMask);
787 break;
788
789 CASE_MOVDUP(MOVDDUP, r)
790 Src1Name = getRegName(Reg: MI->getOperand(i: NumOperands - 1).getReg());
791 [[fallthrough]];
792
793 CASE_MOVDUP(MOVDDUP, m)
794 DestName = getRegName(Reg: MI->getOperand(i: 0).getReg());
795 DecodeMOVDDUPMask(NumElts: getRegOperandNumElts(MI, ScalarSize: 64, OperandIndex: 0), ShuffleMask);
796 break;
797
798 case X86::PSLLDQri:
799 case X86::VPSLLDQri:
800 case X86::VPSLLDQYri:
801 case X86::VPSLLDQZ128ri:
802 case X86::VPSLLDQZ256ri:
803 case X86::VPSLLDQZri:
804 Src1Name = getRegName(Reg: MI->getOperand(i: 1).getReg());
805 [[fallthrough]];
806 case X86::VPSLLDQZ128mi:
807 case X86::VPSLLDQZ256mi:
808 case X86::VPSLLDQZmi:
809 DestName = getRegName(Reg: MI->getOperand(i: 0).getReg());
810 if (MI->getOperand(i: NumOperands - 1).isImm())
811 DecodePSLLDQMask(NumElts: getRegOperandNumElts(MI, ScalarSize: 8, OperandIndex: 0),
812 Imm: MI->getOperand(i: NumOperands - 1).getImm(),
813 ShuffleMask);
814 break;
815
816 case X86::PSRLDQri:
817 case X86::VPSRLDQri:
818 case X86::VPSRLDQYri:
819 case X86::VPSRLDQZ128ri:
820 case X86::VPSRLDQZ256ri:
821 case X86::VPSRLDQZri:
822 Src1Name = getRegName(Reg: MI->getOperand(i: 1).getReg());
823 [[fallthrough]];
824 case X86::VPSRLDQZ128mi:
825 case X86::VPSRLDQZ256mi:
826 case X86::VPSRLDQZmi:
827 DestName = getRegName(Reg: MI->getOperand(i: 0).getReg());
828 if (MI->getOperand(i: NumOperands - 1).isImm())
829 DecodePSRLDQMask(NumElts: getRegOperandNumElts(MI, ScalarSize: 8, OperandIndex: 0),
830 Imm: MI->getOperand(i: NumOperands - 1).getImm(),
831 ShuffleMask);
832 break;
833
834 CASE_SHUF(PALIGNR, rri)
835 Src1Name = getRegName(Reg: MI->getOperand(i: NumOperands - 2).getReg());
836 RegForm = true;
837 [[fallthrough]];
838
839 CASE_SHUF(PALIGNR, rmi)
840 Src2Name = getRegName(Reg: MI->getOperand(i: NumOperands-(RegForm?3:7)).getReg());
841 DestName = getRegName(Reg: MI->getOperand(i: 0).getReg());
842 if (MI->getOperand(i: NumOperands - 1).isImm())
843 DecodePALIGNRMask(NumElts: getRegOperandNumElts(MI, ScalarSize: 8, OperandIndex: 0),
844 Imm: MI->getOperand(i: NumOperands - 1).getImm(),
845 ShuffleMask);
846 break;
847
848 CASE_AVX512_INS_COMMON(ALIGNQ, Z, rri)
849 CASE_AVX512_INS_COMMON(ALIGNQ, Z256, rri)
850 CASE_AVX512_INS_COMMON(ALIGNQ, Z128, rri)
851 Src1Name = getRegName(Reg: MI->getOperand(i: NumOperands - 2).getReg());
852 RegForm = true;
853 [[fallthrough]];
854
855 CASE_AVX512_INS_COMMON(ALIGNQ, Z, rmi)
856 CASE_AVX512_INS_COMMON(ALIGNQ, Z256, rmi)
857 CASE_AVX512_INS_COMMON(ALIGNQ, Z128, rmi)
858 Src2Name = getRegName(Reg: MI->getOperand(i: NumOperands-(RegForm?3:7)).getReg());
859 DestName = getRegName(Reg: MI->getOperand(i: 0).getReg());
860 if (MI->getOperand(i: NumOperands - 1).isImm())
861 DecodeVALIGNMask(NumElts: getRegOperandNumElts(MI, ScalarSize: 64, OperandIndex: 0),
862 Imm: MI->getOperand(i: NumOperands - 1).getImm(),
863 ShuffleMask);
864 break;
865
866 CASE_AVX512_INS_COMMON(ALIGND, Z, rri)
867 CASE_AVX512_INS_COMMON(ALIGND, Z256, rri)
868 CASE_AVX512_INS_COMMON(ALIGND, Z128, rri)
869 Src1Name = getRegName(Reg: MI->getOperand(i: NumOperands - 2).getReg());
870 RegForm = true;
871 [[fallthrough]];
872
873 CASE_AVX512_INS_COMMON(ALIGND, Z, rmi)
874 CASE_AVX512_INS_COMMON(ALIGND, Z256, rmi)
875 CASE_AVX512_INS_COMMON(ALIGND, Z128, rmi)
876 Src2Name = getRegName(Reg: MI->getOperand(i: NumOperands-(RegForm?3:7)).getReg());
877 DestName = getRegName(Reg: MI->getOperand(i: 0).getReg());
878 if (MI->getOperand(i: NumOperands - 1).isImm())
879 DecodeVALIGNMask(NumElts: getRegOperandNumElts(MI, ScalarSize: 32, OperandIndex: 0),
880 Imm: MI->getOperand(i: NumOperands - 1).getImm(),
881 ShuffleMask);
882 break;
883
884 CASE_SHUF(PSHUFD, ri)
885 Src1Name = getRegName(Reg: MI->getOperand(i: NumOperands - 2).getReg());
886 [[fallthrough]];
887
888 CASE_SHUF(PSHUFD, mi)
889 DestName = getRegName(Reg: MI->getOperand(i: 0).getReg());
890 if (MI->getOperand(i: NumOperands - 1).isImm())
891 DecodePSHUFMask(NumElts: getRegOperandNumElts(MI, ScalarSize: 32, OperandIndex: 0), ScalarBits: 32,
892 Imm: MI->getOperand(i: NumOperands - 1).getImm(),
893 ShuffleMask);
894 break;
895
896 CASE_SHUF(PSHUFHW, ri)
897 Src1Name = getRegName(Reg: MI->getOperand(i: NumOperands - 2).getReg());
898 [[fallthrough]];
899
900 CASE_SHUF(PSHUFHW, mi)
901 DestName = getRegName(Reg: MI->getOperand(i: 0).getReg());
902 if (MI->getOperand(i: NumOperands - 1).isImm())
903 DecodePSHUFHWMask(NumElts: getRegOperandNumElts(MI, ScalarSize: 16, OperandIndex: 0),
904 Imm: MI->getOperand(i: NumOperands - 1).getImm(),
905 ShuffleMask);
906 break;
907
908 CASE_SHUF(PSHUFLW, ri)
909 Src1Name = getRegName(Reg: MI->getOperand(i: NumOperands - 2).getReg());
910 [[fallthrough]];
911
912 CASE_SHUF(PSHUFLW, mi)
913 DestName = getRegName(Reg: MI->getOperand(i: 0).getReg());
914 if (MI->getOperand(i: NumOperands - 1).isImm())
915 DecodePSHUFLWMask(NumElts: getRegOperandNumElts(MI, ScalarSize: 16, OperandIndex: 0),
916 Imm: MI->getOperand(i: NumOperands - 1).getImm(),
917 ShuffleMask);
918 break;
919
920 case X86::MMX_PSHUFWri:
921 Src1Name = getRegName(Reg: MI->getOperand(i: 1).getReg());
922 [[fallthrough]];
923
924 case X86::MMX_PSHUFWmi:
925 DestName = getRegName(Reg: MI->getOperand(i: 0).getReg());
926 if (MI->getOperand(i: NumOperands - 1).isImm())
927 DecodePSHUFMask(NumElts: 4, ScalarBits: 16, Imm: MI->getOperand(i: NumOperands - 1).getImm(),
928 ShuffleMask);
929 break;
930
931 case X86::PSWAPDrr:
932 Src1Name = getRegName(Reg: MI->getOperand(i: 1).getReg());
933 [[fallthrough]];
934
935 case X86::PSWAPDrm:
936 DestName = getRegName(Reg: MI->getOperand(i: 0).getReg());
937 DecodePSWAPMask(NumElts: 2, ShuffleMask);
938 break;
939
940 CASE_UNPCK(PUNPCKHBW, r)
941 case X86::MMX_PUNPCKHBWrr:
942 Src2Name = getRegName(Reg: MI->getOperand(i: NumOperands - 1).getReg());
943 RegForm = true;
944 [[fallthrough]];
945
946 CASE_UNPCK(PUNPCKHBW, m)
947 case X86::MMX_PUNPCKHBWrm:
948 Src1Name = getRegName(Reg: MI->getOperand(i: NumOperands-(RegForm?2:6)).getReg());
949 DestName = getRegName(Reg: MI->getOperand(i: 0).getReg());
950 DecodeUNPCKHMask(NumElts: getRegOperandNumElts(MI, ScalarSize: 8, OperandIndex: 0), ScalarBits: 8, ShuffleMask);
951 break;
952
953 CASE_UNPCK(PUNPCKHWD, r)
954 case X86::MMX_PUNPCKHWDrr:
955 Src2Name = getRegName(Reg: MI->getOperand(i: NumOperands - 1).getReg());
956 RegForm = true;
957 [[fallthrough]];
958
959 CASE_UNPCK(PUNPCKHWD, m)
960 case X86::MMX_PUNPCKHWDrm:
961 Src1Name = getRegName(Reg: MI->getOperand(i: NumOperands-(RegForm?2:6)).getReg());
962 DestName = getRegName(Reg: MI->getOperand(i: 0).getReg());
963 DecodeUNPCKHMask(NumElts: getRegOperandNumElts(MI, ScalarSize: 16, OperandIndex: 0), ScalarBits: 16, ShuffleMask);
964 break;
965
966 CASE_UNPCK(PUNPCKHDQ, r)
967 case X86::MMX_PUNPCKHDQrr:
968 Src2Name = getRegName(Reg: MI->getOperand(i: NumOperands - 1).getReg());
969 RegForm = true;
970 [[fallthrough]];
971
972 CASE_UNPCK(PUNPCKHDQ, m)
973 case X86::MMX_PUNPCKHDQrm:
974 Src1Name = getRegName(Reg: MI->getOperand(i: NumOperands-(RegForm?2:6)).getReg());
975 DestName = getRegName(Reg: MI->getOperand(i: 0).getReg());
976 DecodeUNPCKHMask(NumElts: getRegOperandNumElts(MI, ScalarSize: 32, OperandIndex: 0), ScalarBits: 32, ShuffleMask);
977 break;
978
979 CASE_UNPCK(PUNPCKHQDQ, r)
980 Src2Name = getRegName(Reg: MI->getOperand(i: NumOperands - 1).getReg());
981 RegForm = true;
982 [[fallthrough]];
983
984 CASE_UNPCK(PUNPCKHQDQ, m)
985 Src1Name = getRegName(Reg: MI->getOperand(i: NumOperands-(RegForm?2:6)).getReg());
986 DestName = getRegName(Reg: MI->getOperand(i: 0).getReg());
987 DecodeUNPCKHMask(NumElts: getRegOperandNumElts(MI, ScalarSize: 64, OperandIndex: 0), ScalarBits: 64, ShuffleMask);
988 break;
989
990 CASE_UNPCK(PUNPCKLBW, r)
991 case X86::MMX_PUNPCKLBWrr:
992 Src2Name = getRegName(Reg: MI->getOperand(i: NumOperands - 1).getReg());
993 RegForm = true;
994 [[fallthrough]];
995
996 CASE_UNPCK(PUNPCKLBW, m)
997 case X86::MMX_PUNPCKLBWrm:
998 Src1Name = getRegName(Reg: MI->getOperand(i: NumOperands-(RegForm?2:6)).getReg());
999 DestName = getRegName(Reg: MI->getOperand(i: 0).getReg());
1000 DecodeUNPCKLMask(NumElts: getRegOperandNumElts(MI, ScalarSize: 8, OperandIndex: 0), ScalarBits: 8, ShuffleMask);
1001 break;
1002
1003 CASE_UNPCK(PUNPCKLWD, r)
1004 case X86::MMX_PUNPCKLWDrr:
1005 Src2Name = getRegName(Reg: MI->getOperand(i: NumOperands - 1).getReg());
1006 RegForm = true;
1007 [[fallthrough]];
1008
1009 CASE_UNPCK(PUNPCKLWD, m)
1010 case X86::MMX_PUNPCKLWDrm:
1011 Src1Name = getRegName(Reg: MI->getOperand(i: NumOperands-(RegForm?2:6)).getReg());
1012 DestName = getRegName(Reg: MI->getOperand(i: 0).getReg());
1013 DecodeUNPCKLMask(NumElts: getRegOperandNumElts(MI, ScalarSize: 16, OperandIndex: 0), ScalarBits: 16, ShuffleMask);
1014 break;
1015
1016 CASE_UNPCK(PUNPCKLDQ, r)
1017 case X86::MMX_PUNPCKLDQrr:
1018 Src2Name = getRegName(Reg: MI->getOperand(i: NumOperands - 1).getReg());
1019 RegForm = true;
1020 [[fallthrough]];
1021
1022 CASE_UNPCK(PUNPCKLDQ, m)
1023 case X86::MMX_PUNPCKLDQrm:
1024 Src1Name = getRegName(Reg: MI->getOperand(i: NumOperands-(RegForm?2:6)).getReg());
1025 DestName = getRegName(Reg: MI->getOperand(i: 0).getReg());
1026 DecodeUNPCKLMask(NumElts: getRegOperandNumElts(MI, ScalarSize: 32, OperandIndex: 0), ScalarBits: 32, ShuffleMask);
1027 break;
1028
1029 CASE_UNPCK(PUNPCKLQDQ, r)
1030 Src2Name = getRegName(Reg: MI->getOperand(i: NumOperands - 1).getReg());
1031 RegForm = true;
1032 [[fallthrough]];
1033
1034 CASE_UNPCK(PUNPCKLQDQ, m)
1035 Src1Name = getRegName(Reg: MI->getOperand(i: NumOperands-(RegForm?2:6)).getReg());
1036 DestName = getRegName(Reg: MI->getOperand(i: 0).getReg());
1037 DecodeUNPCKLMask(NumElts: getRegOperandNumElts(MI, ScalarSize: 64, OperandIndex: 0), ScalarBits: 64, ShuffleMask);
1038 break;
1039
1040 CASE_SHUF(SHUFPD, rri)
1041 Src2Name = getRegName(Reg: MI->getOperand(i: NumOperands - 2).getReg());
1042 RegForm = true;
1043 [[fallthrough]];
1044
1045 CASE_SHUF(SHUFPD, rmi)
1046 if (MI->getOperand(i: NumOperands - 1).isImm())
1047 DecodeSHUFPMask(NumElts: getRegOperandNumElts(MI, ScalarSize: 64, OperandIndex: 0), ScalarBits: 64,
1048 Imm: MI->getOperand(i: NumOperands - 1).getImm(), ShuffleMask);
1049 Src1Name = getRegName(Reg: MI->getOperand(i: NumOperands-(RegForm?3:7)).getReg());
1050 DestName = getRegName(Reg: MI->getOperand(i: 0).getReg());
1051 break;
1052
1053 CASE_SHUF(SHUFPS, rri)
1054 Src2Name = getRegName(Reg: MI->getOperand(i: NumOperands - 2).getReg());
1055 RegForm = true;
1056 [[fallthrough]];
1057
1058 CASE_SHUF(SHUFPS, rmi)
1059 if (MI->getOperand(i: NumOperands - 1).isImm())
1060 DecodeSHUFPMask(NumElts: getRegOperandNumElts(MI, ScalarSize: 32, OperandIndex: 0), ScalarBits: 32,
1061 Imm: MI->getOperand(i: NumOperands - 1).getImm(),
1062 ShuffleMask);
1063 Src1Name = getRegName(Reg: MI->getOperand(i: NumOperands-(RegForm?3:7)).getReg());
1064 DestName = getRegName(Reg: MI->getOperand(i: 0).getReg());
1065 break;
1066
1067 CASE_VSHUF(64X2, r)
1068 Src2Name = getRegName(Reg: MI->getOperand(i: NumOperands - 2).getReg());
1069 RegForm = true;
1070 [[fallthrough]];
1071
1072 CASE_VSHUF(64X2, m)
1073 decodeVSHUF64x2FamilyMask(NumElts: getRegOperandNumElts(MI, ScalarSize: 64, OperandIndex: 0), ScalarSize: 64,
1074 Imm: MI->getOperand(i: NumOperands - 1).getImm(),
1075 ShuffleMask);
1076 Src1Name = getRegName(Reg: MI->getOperand(i: NumOperands-(RegForm?3:7)).getReg());
1077 DestName = getRegName(Reg: MI->getOperand(i: 0).getReg());
1078 break;
1079
1080 CASE_VSHUF(32X4, r)
1081 Src2Name = getRegName(Reg: MI->getOperand(i: NumOperands - 2).getReg());
1082 RegForm = true;
1083 [[fallthrough]];
1084
1085 CASE_VSHUF(32X4, m)
1086 decodeVSHUF64x2FamilyMask(NumElts: getRegOperandNumElts(MI, ScalarSize: 32, OperandIndex: 0), ScalarSize: 32,
1087 Imm: MI->getOperand(i: NumOperands - 1).getImm(),
1088 ShuffleMask);
1089 Src1Name = getRegName(Reg: MI->getOperand(i: NumOperands-(RegForm?3:7)).getReg());
1090 DestName = getRegName(Reg: MI->getOperand(i: 0).getReg());
1091 break;
1092
1093 CASE_UNPCK(UNPCKLPD, r)
1094 Src2Name = getRegName(Reg: MI->getOperand(i: NumOperands - 1).getReg());
1095 RegForm = true;
1096 [[fallthrough]];
1097
1098 CASE_UNPCK(UNPCKLPD, m)
1099 DecodeUNPCKLMask(NumElts: getRegOperandNumElts(MI, ScalarSize: 64, OperandIndex: 0), ScalarBits: 64, ShuffleMask);
1100 Src1Name = getRegName(Reg: MI->getOperand(i: NumOperands-(RegForm?2:6)).getReg());
1101 DestName = getRegName(Reg: MI->getOperand(i: 0).getReg());
1102 break;
1103
1104 CASE_UNPCK(UNPCKLPS, r)
1105 Src2Name = getRegName(Reg: MI->getOperand(i: NumOperands - 1).getReg());
1106 RegForm = true;
1107 [[fallthrough]];
1108
1109 CASE_UNPCK(UNPCKLPS, m)
1110 DecodeUNPCKLMask(NumElts: getRegOperandNumElts(MI, ScalarSize: 32, OperandIndex: 0), ScalarBits: 32, ShuffleMask);
1111 Src1Name = getRegName(Reg: MI->getOperand(i: NumOperands-(RegForm?2:6)).getReg());
1112 DestName = getRegName(Reg: MI->getOperand(i: 0).getReg());
1113 break;
1114
1115 CASE_UNPCK(UNPCKHPD, r)
1116 Src2Name = getRegName(Reg: MI->getOperand(i: NumOperands - 1).getReg());
1117 RegForm = true;
1118 [[fallthrough]];
1119
1120 CASE_UNPCK(UNPCKHPD, m)
1121 DecodeUNPCKHMask(NumElts: getRegOperandNumElts(MI, ScalarSize: 64, OperandIndex: 0), ScalarBits: 64, ShuffleMask);
1122 Src1Name = getRegName(Reg: MI->getOperand(i: NumOperands-(RegForm?2:6)).getReg());
1123 DestName = getRegName(Reg: MI->getOperand(i: 0).getReg());
1124 break;
1125
1126 CASE_UNPCK(UNPCKHPS, r)
1127 Src2Name = getRegName(Reg: MI->getOperand(i: NumOperands - 1).getReg());
1128 RegForm = true;
1129 [[fallthrough]];
1130
1131 CASE_UNPCK(UNPCKHPS, m)
1132 DecodeUNPCKHMask(NumElts: getRegOperandNumElts(MI, ScalarSize: 32, OperandIndex: 0), ScalarBits: 32, ShuffleMask);
1133 Src1Name = getRegName(Reg: MI->getOperand(i: NumOperands-(RegForm?2:6)).getReg());
1134 DestName = getRegName(Reg: MI->getOperand(i: 0).getReg());
1135 break;
1136
1137 CASE_VPERMILPI(PERMILPS, r)
1138 Src1Name = getRegName(Reg: MI->getOperand(i: NumOperands - 2).getReg());
1139 [[fallthrough]];
1140
1141 CASE_VPERMILPI(PERMILPS, m)
1142 if (MI->getOperand(i: NumOperands - 1).isImm())
1143 DecodePSHUFMask(NumElts: getRegOperandNumElts(MI, ScalarSize: 32, OperandIndex: 0), ScalarBits: 32,
1144 Imm: MI->getOperand(i: NumOperands - 1).getImm(),
1145 ShuffleMask);
1146 DestName = getRegName(Reg: MI->getOperand(i: 0).getReg());
1147 break;
1148
1149 CASE_VPERMILPI(PERMILPD, r)
1150 Src1Name = getRegName(Reg: MI->getOperand(i: NumOperands - 2).getReg());
1151 [[fallthrough]];
1152
1153 CASE_VPERMILPI(PERMILPD, m)
1154 if (MI->getOperand(i: NumOperands - 1).isImm())
1155 DecodePSHUFMask(NumElts: getRegOperandNumElts(MI, ScalarSize: 64, OperandIndex: 0), ScalarBits: 64,
1156 Imm: MI->getOperand(i: NumOperands - 1).getImm(),
1157 ShuffleMask);
1158 DestName = getRegName(Reg: MI->getOperand(i: 0).getReg());
1159 break;
1160
1161 case X86::VPERM2F128rr:
1162 case X86::VPERM2I128rr:
1163 Src2Name = getRegName(Reg: MI->getOperand(i: 2).getReg());
1164 [[fallthrough]];
1165
1166 case X86::VPERM2F128rm:
1167 case X86::VPERM2I128rm:
1168 // For instruction comments purpose, assume the 256-bit vector is v4i64.
1169 if (MI->getOperand(i: NumOperands - 1).isImm())
1170 DecodeVPERM2X128Mask(NumElts: 4, Imm: MI->getOperand(i: NumOperands - 1).getImm(),
1171 ShuffleMask);
1172 Src1Name = getRegName(Reg: MI->getOperand(i: 1).getReg());
1173 DestName = getRegName(Reg: MI->getOperand(i: 0).getReg());
1174 break;
1175
1176 CASE_VPERM(PERMPD, r)
1177 Src1Name = getRegName(Reg: MI->getOperand(i: NumOperands - 2).getReg());
1178 [[fallthrough]];
1179
1180 CASE_VPERM(PERMPD, m)
1181 if (MI->getOperand(i: NumOperands - 1).isImm())
1182 DecodeVPERMMask(NumElts: getRegOperandNumElts(MI, ScalarSize: 64, OperandIndex: 0),
1183 Imm: MI->getOperand(i: NumOperands - 1).getImm(),
1184 ShuffleMask);
1185 DestName = getRegName(Reg: MI->getOperand(i: 0).getReg());
1186 break;
1187
1188 CASE_VPERM(PERMQ, r)
1189 Src1Name = getRegName(Reg: MI->getOperand(i: NumOperands - 2).getReg());
1190 [[fallthrough]];
1191
1192 CASE_VPERM(PERMQ, m)
1193 if (MI->getOperand(i: NumOperands - 1).isImm())
1194 DecodeVPERMMask(NumElts: getRegOperandNumElts(MI, ScalarSize: 64, OperandIndex: 0),
1195 Imm: MI->getOperand(i: NumOperands - 1).getImm(),
1196 ShuffleMask);
1197 DestName = getRegName(Reg: MI->getOperand(i: 0).getReg());
1198 break;
1199
1200 case X86::MOVSDrr:
1201 case X86::VMOVSDrr:
1202 case X86::VMOVSDZrr:
1203 Src2Name = getRegName(Reg: MI->getOperand(i: 2).getReg());
1204 Src1Name = getRegName(Reg: MI->getOperand(i: 1).getReg());
1205 DecodeScalarMoveMask(NumElts: 2, IsLoad: false, ShuffleMask);
1206 DestName = getRegName(Reg: MI->getOperand(i: 0).getReg());
1207 break;
1208
1209 case X86::MOVSSrr:
1210 case X86::VMOVSSrr:
1211 case X86::VMOVSSZrr:
1212 Src2Name = getRegName(Reg: MI->getOperand(i: 2).getReg());
1213 Src1Name = getRegName(Reg: MI->getOperand(i: 1).getReg());
1214 DecodeScalarMoveMask(NumElts: 4, IsLoad: false, ShuffleMask);
1215 DestName = getRegName(Reg: MI->getOperand(i: 0).getReg());
1216 break;
1217
1218 case X86::MOVPQI2QIrr:
1219 case X86::MOVZPQILo2PQIrr:
1220 case X86::VMOVPQI2QIrr:
1221 case X86::VMOVPQI2QIZrr:
1222 case X86::VMOVZPQILo2PQIrr:
1223 case X86::VMOVZPQILo2PQIZrr:
1224 Src1Name = getRegName(Reg: MI->getOperand(i: 1).getReg());
1225 DecodeZeroMoveLowMask(NumElts: 2, ShuffleMask);
1226 DestName = getRegName(Reg: MI->getOperand(i: 0).getReg());
1227 break;
1228
1229 case X86::EXTRQI:
1230 if (MI->getOperand(i: 2).isImm() &&
1231 MI->getOperand(i: 3).isImm())
1232 DecodeEXTRQIMask(NumElts: 16, EltSize: 8, Len: MI->getOperand(i: 2).getImm(),
1233 Idx: MI->getOperand(i: 3).getImm(), ShuffleMask);
1234
1235 DestName = getRegName(Reg: MI->getOperand(i: 0).getReg());
1236 Src1Name = getRegName(Reg: MI->getOperand(i: 1).getReg());
1237 break;
1238
1239 case X86::INSERTQI:
1240 if (MI->getOperand(i: 3).isImm() &&
1241 MI->getOperand(i: 4).isImm())
1242 DecodeINSERTQIMask(NumElts: 16, EltSize: 8, Len: MI->getOperand(i: 3).getImm(),
1243 Idx: MI->getOperand(i: 4).getImm(), ShuffleMask);
1244
1245 DestName = getRegName(Reg: MI->getOperand(i: 0).getReg());
1246 Src1Name = getRegName(Reg: MI->getOperand(i: 1).getReg());
1247 Src2Name = getRegName(Reg: MI->getOperand(i: 2).getReg());
1248 break;
1249
1250 case X86::VBROADCASTF128rm:
1251 case X86::VBROADCASTI128rm:
1252 CASE_AVX512_INS_COMMON(BROADCASTF64X2, Z128, rm)
1253 CASE_AVX512_INS_COMMON(BROADCASTI64X2, Z128, rm)
1254 DecodeSubVectorBroadcast(DstNumElts: 4, SrcNumElts: 2, ShuffleMask);
1255 DestName = getRegName(Reg: MI->getOperand(i: 0).getReg());
1256 break;
1257 CASE_AVX512_INS_COMMON(BROADCASTF64X2, , rm)
1258 CASE_AVX512_INS_COMMON(BROADCASTI64X2, , rm)
1259 DecodeSubVectorBroadcast(DstNumElts: 8, SrcNumElts: 2, ShuffleMask);
1260 DestName = getRegName(Reg: MI->getOperand(i: 0).getReg());
1261 break;
1262 CASE_AVX512_INS_COMMON(BROADCASTF64X4, , rm)
1263 CASE_AVX512_INS_COMMON(BROADCASTI64X4, , rm)
1264 DecodeSubVectorBroadcast(DstNumElts: 8, SrcNumElts: 4, ShuffleMask);
1265 DestName = getRegName(Reg: MI->getOperand(i: 0).getReg());
1266 break;
1267 CASE_AVX512_INS_COMMON(BROADCASTF32X4, Z256, rm)
1268 CASE_AVX512_INS_COMMON(BROADCASTI32X4, Z256, rm)
1269 DecodeSubVectorBroadcast(DstNumElts: 8, SrcNumElts: 4, ShuffleMask);
1270 DestName = getRegName(Reg: MI->getOperand(i: 0).getReg());
1271 break;
1272 CASE_AVX512_INS_COMMON(BROADCASTF32X4, , rm)
1273 CASE_AVX512_INS_COMMON(BROADCASTI32X4, , rm)
1274 DecodeSubVectorBroadcast(DstNumElts: 16, SrcNumElts: 4, ShuffleMask);
1275 DestName = getRegName(Reg: MI->getOperand(i: 0).getReg());
1276 break;
1277 CASE_AVX512_INS_COMMON(BROADCASTF32X8, , rm)
1278 CASE_AVX512_INS_COMMON(BROADCASTI32X8, , rm)
1279 DecodeSubVectorBroadcast(DstNumElts: 16, SrcNumElts: 8, ShuffleMask);
1280 DestName = getRegName(Reg: MI->getOperand(i: 0).getReg());
1281 break;
1282 CASE_AVX512_INS_COMMON(BROADCASTI32X2, Z128, rr)
1283 Src1Name = getRegName(Reg: MI->getOperand(i: NumOperands - 1).getReg());
1284 [[fallthrough]];
1285 CASE_AVX512_INS_COMMON(BROADCASTI32X2, Z128, rm)
1286 DecodeSubVectorBroadcast(DstNumElts: 4, SrcNumElts: 2, ShuffleMask);
1287 DestName = getRegName(Reg: MI->getOperand(i: 0).getReg());
1288 break;
1289 CASE_AVX512_INS_COMMON(BROADCASTF32X2, Z256, rr)
1290 CASE_AVX512_INS_COMMON(BROADCASTI32X2, Z256, rr)
1291 Src1Name = getRegName(Reg: MI->getOperand(i: NumOperands - 1).getReg());
1292 [[fallthrough]];
1293 CASE_AVX512_INS_COMMON(BROADCASTF32X2, Z256, rm)
1294 CASE_AVX512_INS_COMMON(BROADCASTI32X2, Z256, rm)
1295 DecodeSubVectorBroadcast(DstNumElts: 8, SrcNumElts: 2, ShuffleMask);
1296 DestName = getRegName(Reg: MI->getOperand(i: 0).getReg());
1297 break;
1298 CASE_AVX512_INS_COMMON(BROADCASTF32X2, Z, rr)
1299 CASE_AVX512_INS_COMMON(BROADCASTI32X2, Z, rr)
1300 Src1Name = getRegName(Reg: MI->getOperand(i: NumOperands - 1).getReg());
1301 [[fallthrough]];
1302 CASE_AVX512_INS_COMMON(BROADCASTF32X2, Z, rm)
1303 CASE_AVX512_INS_COMMON(BROADCASTI32X2, Z, rm)
1304 DecodeSubVectorBroadcast(DstNumElts: 16, SrcNumElts: 2, ShuffleMask);
1305 DestName = getRegName(Reg: MI->getOperand(i: 0).getReg());
1306 break;
1307
1308 CASE_PMOVZX(PMOVZXBW, r)
1309 Src1Name = getRegName(Reg: MI->getOperand(i: NumOperands - 1).getReg());
1310 DecodeZeroExtendMask(SrcScalarBits: 8, DstScalarBits: 16, NumDstElts: getRegOperandNumElts(MI, ScalarSize: 16, OperandIndex: 0), IsAnyExtend: false,
1311 ShuffleMask);
1312 DestName = getRegName(Reg: MI->getOperand(i: 0).getReg());
1313 break;
1314
1315 CASE_PMOVZX(PMOVZXBD, r)
1316 Src1Name = getRegName(Reg: MI->getOperand(i: NumOperands - 1).getReg());
1317 DecodeZeroExtendMask(SrcScalarBits: 8, DstScalarBits: 32, NumDstElts: getRegOperandNumElts(MI, ScalarSize: 32, OperandIndex: 0), IsAnyExtend: false,
1318 ShuffleMask);
1319 DestName = getRegName(Reg: MI->getOperand(i: 0).getReg());
1320 break;
1321
1322 CASE_PMOVZX(PMOVZXBQ, r)
1323 Src1Name = getRegName(Reg: MI->getOperand(i: NumOperands - 1).getReg());
1324 DecodeZeroExtendMask(SrcScalarBits: 8, DstScalarBits: 64, NumDstElts: getRegOperandNumElts(MI, ScalarSize: 64, OperandIndex: 0), IsAnyExtend: false,
1325 ShuffleMask);
1326 DestName = getRegName(Reg: MI->getOperand(i: 0).getReg());
1327 break;
1328
1329 CASE_PMOVZX(PMOVZXWD, r)
1330 Src1Name = getRegName(Reg: MI->getOperand(i: NumOperands - 1).getReg());
1331 DecodeZeroExtendMask(SrcScalarBits: 16, DstScalarBits: 32, NumDstElts: getRegOperandNumElts(MI, ScalarSize: 32, OperandIndex: 0), IsAnyExtend: false,
1332 ShuffleMask);
1333 DestName = getRegName(Reg: MI->getOperand(i: 0).getReg());
1334 break;
1335
1336 CASE_PMOVZX(PMOVZXWQ, r)
1337 Src1Name = getRegName(Reg: MI->getOperand(i: NumOperands - 1).getReg());
1338 DecodeZeroExtendMask(SrcScalarBits: 16, DstScalarBits: 64, NumDstElts: getRegOperandNumElts(MI, ScalarSize: 64, OperandIndex: 0), IsAnyExtend: false,
1339 ShuffleMask);
1340 DestName = getRegName(Reg: MI->getOperand(i: 0).getReg());
1341 break;
1342
1343 CASE_PMOVZX(PMOVZXDQ, r)
1344 Src1Name = getRegName(Reg: MI->getOperand(i: NumOperands - 1).getReg());
1345 DecodeZeroExtendMask(SrcScalarBits: 32, DstScalarBits: 64, NumDstElts: getRegOperandNumElts(MI, ScalarSize: 64, OperandIndex: 0), IsAnyExtend: false,
1346 ShuffleMask);
1347 DestName = getRegName(Reg: MI->getOperand(i: 0).getReg());
1348 break;
1349 }
1350
1351 // The only comments we decode are shuffles, so give up if we were unable to
1352 // decode a shuffle mask.
1353 if (ShuffleMask.empty())
1354 return false;
1355
1356 if (!DestName) DestName = Src1Name;
1357 if (DestName) {
1358 OS << DestName;
1359 printMasking(OS, MI, MCII);
1360 } else
1361 OS << "mem";
1362
1363 OS << " = ";
1364
1365 // If the two sources are the same, canonicalize the input elements to be
1366 // from the first src so that we get larger element spans.
1367 if (Src1Name == Src2Name) {
1368 for (unsigned i = 0, e = ShuffleMask.size(); i != e; ++i) {
1369 if ((int)ShuffleMask[i] >= 0 && // Not sentinel.
1370 ShuffleMask[i] >= (int)e) // From second mask.
1371 ShuffleMask[i] -= e;
1372 }
1373 }
1374
1375 // The shuffle mask specifies which elements of the src1/src2 fill in the
1376 // destination, with a few sentinel values. Loop through and print them
1377 // out.
1378 for (unsigned i = 0, e = ShuffleMask.size(); i != e; ++i) {
1379 if (i != 0)
1380 OS << ',';
1381 if (ShuffleMask[i] == SM_SentinelZero) {
1382 OS << "zero";
1383 continue;
1384 }
1385
1386 // Otherwise, it must come from src1 or src2. Print the span of elements
1387 // that comes from this src.
1388 bool isSrc1 = ShuffleMask[i] < (int)ShuffleMask.size();
1389 const char *SrcName = isSrc1 ? Src1Name : Src2Name;
1390 OS << (SrcName ? SrcName : "mem") << '[';
1391 bool IsFirst = true;
1392 while (i != e && (int)ShuffleMask[i] != SM_SentinelZero &&
1393 (ShuffleMask[i] < (int)ShuffleMask.size()) == isSrc1) {
1394 if (!IsFirst)
1395 OS << ',';
1396 else
1397 IsFirst = false;
1398 if (ShuffleMask[i] == SM_SentinelUndef)
1399 OS << "u";
1400 else
1401 OS << ShuffleMask[i] % ShuffleMask.size();
1402 ++i;
1403 }
1404 OS << ']';
1405 --i; // For loop increments element #.
1406 }
1407 OS << '\n';
1408
1409 // We successfully added a comment to this instruction.
1410 return true;
1411}
1412