1 //===-- X86InstComments.cpp - Generate verbose-asm comments for instrs ----===//
3 // The LLVM Compiler Infrastructure
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
10 // This defines functionality used to emit comments about X86 instructions to
11 // an output stream for -fverbose-asm.
13 //===----------------------------------------------------------------------===//
15 #include "X86InstComments.h"
16 #include "X86ATTInstPrinter.h"
17 #include "MCTargetDesc/X86BaseInfo.h"
18 #include "MCTargetDesc/X86MCTargetDesc.h"
19 #include "Utils/X86ShuffleDecode.h"
20 #include "llvm/MC/MCInst.h"
21 #include "llvm/MC/MCInstrInfo.h"
22 #include "llvm/Support/raw_ostream.h"
26 #define CASE_SSE_INS_COMMON(Inst, src) \
29 #define CASE_AVX_INS_COMMON(Inst, Suffix, src) \
30 case X86::V##Inst##Suffix##src:
32 #define CASE_MASK_INS_COMMON(Inst, Suffix, src) \
33 case X86::V##Inst##Suffix##src##k:
35 #define CASE_MASKZ_INS_COMMON(Inst, Suffix, src) \
36 case X86::V##Inst##Suffix##src##kz:
38 #define CASE_AVX512_INS_COMMON(Inst, Suffix, src) \
39 CASE_AVX_INS_COMMON(Inst, Suffix, src) \
40 CASE_MASK_INS_COMMON(Inst, Suffix, src) \
41 CASE_MASKZ_INS_COMMON(Inst, Suffix, src)
43 #define CASE_MOVDUP(Inst, src) \
44 CASE_AVX512_INS_COMMON(Inst, Z, r##src) \
45 CASE_AVX512_INS_COMMON(Inst, Z256, r##src) \
46 CASE_AVX512_INS_COMMON(Inst, Z128, r##src) \
47 CASE_AVX_INS_COMMON(Inst, , r##src) \
48 CASE_AVX_INS_COMMON(Inst, Y, r##src) \
49 CASE_SSE_INS_COMMON(Inst, r##src)
51 #define CASE_MASK_MOVDUP(Inst, src) \
52 CASE_MASK_INS_COMMON(Inst, Z, r##src) \
53 CASE_MASK_INS_COMMON(Inst, Z256, r##src) \
54 CASE_MASK_INS_COMMON(Inst, Z128, r##src)
56 #define CASE_MASKZ_MOVDUP(Inst, src) \
57 CASE_MASKZ_INS_COMMON(Inst, Z, r##src) \
58 CASE_MASKZ_INS_COMMON(Inst, Z256, r##src) \
59 CASE_MASKZ_INS_COMMON(Inst, Z128, r##src)
61 #define CASE_PMOVZX(Inst, src) \
62 CASE_AVX512_INS_COMMON(Inst, Z, r##src) \
63 CASE_AVX512_INS_COMMON(Inst, Z256, r##src) \
64 CASE_AVX512_INS_COMMON(Inst, Z128, r##src) \
65 CASE_AVX_INS_COMMON(Inst, , r##src) \
66 CASE_AVX_INS_COMMON(Inst, Y, r##src) \
67 CASE_SSE_INS_COMMON(Inst, r##src)
69 #define CASE_MASK_PMOVZX(Inst, src) \
70 CASE_MASK_INS_COMMON(Inst, Z, r##src) \
71 CASE_MASK_INS_COMMON(Inst, Z256, r##src) \
72 CASE_MASK_INS_COMMON(Inst, Z128, r##src)
74 #define CASE_MASKZ_PMOVZX(Inst, src) \
75 CASE_MASKZ_INS_COMMON(Inst, Z, r##src) \
76 CASE_MASKZ_INS_COMMON(Inst, Z256, r##src) \
77 CASE_MASKZ_INS_COMMON(Inst, Z128, r##src)
79 #define CASE_UNPCK(Inst, src) \
80 CASE_AVX512_INS_COMMON(Inst, Z, r##src) \
81 CASE_AVX512_INS_COMMON(Inst, Z256, r##src) \
82 CASE_AVX512_INS_COMMON(Inst, Z128, r##src) \
83 CASE_AVX_INS_COMMON(Inst, , r##src) \
84 CASE_AVX_INS_COMMON(Inst, Y, r##src) \
85 CASE_SSE_INS_COMMON(Inst, r##src)
87 #define CASE_MASK_UNPCK(Inst, src) \
88 CASE_MASK_INS_COMMON(Inst, Z, r##src) \
89 CASE_MASK_INS_COMMON(Inst, Z256, r##src) \
90 CASE_MASK_INS_COMMON(Inst, Z128, r##src)
92 #define CASE_MASKZ_UNPCK(Inst, src) \
93 CASE_MASKZ_INS_COMMON(Inst, Z, r##src) \
94 CASE_MASKZ_INS_COMMON(Inst, Z256, r##src) \
95 CASE_MASKZ_INS_COMMON(Inst, Z128, r##src)
97 #define CASE_SHUF(Inst, suf) \
98 CASE_AVX512_INS_COMMON(Inst, Z, suf) \
99 CASE_AVX512_INS_COMMON(Inst, Z256, suf) \
100 CASE_AVX512_INS_COMMON(Inst, Z128, suf) \
101 CASE_AVX_INS_COMMON(Inst, , suf) \
102 CASE_AVX_INS_COMMON(Inst, Y, suf) \
103 CASE_SSE_INS_COMMON(Inst, suf)
105 #define CASE_MASK_SHUF(Inst, src) \
106 CASE_MASK_INS_COMMON(Inst, Z, r##src##i) \
107 CASE_MASK_INS_COMMON(Inst, Z256, r##src##i) \
108 CASE_MASK_INS_COMMON(Inst, Z128, r##src##i)
110 #define CASE_MASKZ_SHUF(Inst, src) \
111 CASE_MASKZ_INS_COMMON(Inst, Z, r##src##i) \
112 CASE_MASKZ_INS_COMMON(Inst, Z256, r##src##i) \
113 CASE_MASKZ_INS_COMMON(Inst, Z128, r##src##i)
115 #define CASE_VPERMILPI(Inst, src) \
116 CASE_AVX512_INS_COMMON(Inst, Z, src##i) \
117 CASE_AVX512_INS_COMMON(Inst, Z256, src##i) \
118 CASE_AVX512_INS_COMMON(Inst, Z128, src##i) \
119 CASE_AVX_INS_COMMON(Inst, , src##i) \
120 CASE_AVX_INS_COMMON(Inst, Y, src##i)
122 #define CASE_MASK_VPERMILPI(Inst, src) \
123 CASE_MASK_INS_COMMON(Inst, Z, src##i) \
124 CASE_MASK_INS_COMMON(Inst, Z256, src##i) \
125 CASE_MASK_INS_COMMON(Inst, Z128, src##i)
127 #define CASE_MASKZ_VPERMILPI(Inst, src) \
128 CASE_MASKZ_INS_COMMON(Inst, Z, src##i) \
129 CASE_MASKZ_INS_COMMON(Inst, Z256, src##i) \
130 CASE_MASKZ_INS_COMMON(Inst, Z128, src##i)
132 #define CASE_VPERM(Inst, src) \
133 CASE_AVX512_INS_COMMON(Inst, Z, src##i) \
134 CASE_AVX512_INS_COMMON(Inst, Z256, src##i) \
135 CASE_AVX_INS_COMMON(Inst, Y, src##i)
137 #define CASE_MASK_VPERM(Inst, src) \
138 CASE_MASK_INS_COMMON(Inst, Z, src##i) \
139 CASE_MASK_INS_COMMON(Inst, Z256, src##i)
141 #define CASE_MASKZ_VPERM(Inst, src) \
142 CASE_MASKZ_INS_COMMON(Inst, Z, src##i) \
143 CASE_MASKZ_INS_COMMON(Inst, Z256, src##i)
145 #define CASE_VSHUF(Inst, src) \
146 CASE_AVX512_INS_COMMON(SHUFF##Inst, Z, r##src##i) \
147 CASE_AVX512_INS_COMMON(SHUFI##Inst, Z, r##src##i) \
148 CASE_AVX512_INS_COMMON(SHUFF##Inst, Z256, r##src##i) \
149 CASE_AVX512_INS_COMMON(SHUFI##Inst, Z256, r##src##i)
151 #define CASE_MASK_VSHUF(Inst, src) \
152 CASE_MASK_INS_COMMON(SHUFF##Inst, Z, r##src##i) \
153 CASE_MASK_INS_COMMON(SHUFI##Inst, Z, r##src##i) \
154 CASE_MASK_INS_COMMON(SHUFF##Inst, Z256, r##src##i) \
155 CASE_MASK_INS_COMMON(SHUFI##Inst, Z256, r##src##i)
157 #define CASE_MASKZ_VSHUF(Inst, src) \
158 CASE_MASKZ_INS_COMMON(SHUFF##Inst, Z, r##src##i) \
159 CASE_MASKZ_INS_COMMON(SHUFI##Inst, Z, r##src##i) \
160 CASE_MASKZ_INS_COMMON(SHUFF##Inst, Z256, r##src##i) \
161 CASE_MASKZ_INS_COMMON(SHUFI##Inst, Z256, r##src##i)
163 #define CASE_AVX512_FMA(Inst, suf) \
164 CASE_AVX512_INS_COMMON(Inst, Z, suf) \
165 CASE_AVX512_INS_COMMON(Inst, Z256, suf) \
166 CASE_AVX512_INS_COMMON(Inst, Z128, suf)
168 #define CASE_FMA(Inst, suf) \
169 CASE_AVX512_FMA(Inst, suf) \
170 CASE_AVX_INS_COMMON(Inst, , suf) \
171 CASE_AVX_INS_COMMON(Inst, Y, suf)
173 #define CASE_FMA_PACKED_REG(Inst) \
174 CASE_FMA(Inst##PD, r) \
175 CASE_FMA(Inst##PS, r)
177 #define CASE_FMA_PACKED_MEM(Inst) \
178 CASE_FMA(Inst##PD, m) \
179 CASE_FMA(Inst##PS, m) \
180 CASE_AVX512_FMA(Inst##PD, mb) \
181 CASE_AVX512_FMA(Inst##PS, mb)
183 #define CASE_FMA_SCALAR_REG(Inst) \
184 CASE_AVX_INS_COMMON(Inst##SD, , r) \
185 CASE_AVX_INS_COMMON(Inst##SS, , r) \
186 CASE_AVX_INS_COMMON(Inst##SD, , r_Int) \
187 CASE_AVX_INS_COMMON(Inst##SS, , r_Int) \
188 CASE_AVX_INS_COMMON(Inst##SD, Z, r) \
189 CASE_AVX_INS_COMMON(Inst##SS, Z, r) \
190 CASE_AVX512_INS_COMMON(Inst##SD, Z, r_Int) \
191 CASE_AVX512_INS_COMMON(Inst##SS, Z, r_Int)
193 #define CASE_FMA_SCALAR_MEM(Inst) \
194 CASE_AVX_INS_COMMON(Inst##SD, , m) \
195 CASE_AVX_INS_COMMON(Inst##SS, , m) \
196 CASE_AVX_INS_COMMON(Inst##SD, , m_Int) \
197 CASE_AVX_INS_COMMON(Inst##SS, , m_Int) \
198 CASE_AVX_INS_COMMON(Inst##SD, Z, m) \
199 CASE_AVX_INS_COMMON(Inst##SS, Z, m) \
200 CASE_AVX512_INS_COMMON(Inst##SD, Z, m_Int) \
201 CASE_AVX512_INS_COMMON(Inst##SS, Z, m_Int)
203 static unsigned getVectorRegSize(unsigned RegNo) {
204 if (X86::ZMM0 <= RegNo && RegNo <= X86::ZMM31)
206 if (X86::YMM0 <= RegNo && RegNo <= X86::YMM31)
208 if (X86::XMM0 <= RegNo && RegNo <= X86::XMM31)
210 if (X86::MM0 <= RegNo && RegNo <= X86::MM7)
213 llvm_unreachable("Unknown vector reg!");
216 static unsigned getRegOperandNumElts(const MCInst *MI, unsigned ScalarSize,
217 unsigned OperandIndex) {
218 unsigned OpReg = MI->getOperand(OperandIndex).getReg();
219 return getVectorRegSize(OpReg) / ScalarSize;
222 static const char *getRegName(unsigned Reg) {
223 return X86ATTInstPrinter::getRegisterName(Reg);
226 /// Wraps the destination register name with AVX512 mask/maskz filtering.
227 static void printMasking(raw_ostream &OS, const MCInst *MI,
228 const MCInstrInfo &MCII) {
229 const MCInstrDesc &Desc = MCII.get(MI->getOpcode());
230 uint64_t TSFlags = Desc.TSFlags;
232 if (!(TSFlags & X86II::EVEX_K))
235 bool MaskWithZero = (TSFlags & X86II::EVEX_Z);
236 unsigned MaskOp = Desc.getNumDefs();
238 if (Desc.getOperandConstraint(MaskOp, MCOI::TIED_TO) != -1)
241 const char *MaskRegName = getRegName(MI->getOperand(MaskOp).getReg());
244 OS << " {%" << MaskRegName << "}";
246 // MASKZ: zmmX {%kY} {z}
251 static bool printFMA3Comments(const MCInst *MI, raw_ostream &OS) {
252 const char *Mul1Name = nullptr, *Mul2Name = nullptr, *AccName = nullptr;
253 unsigned NumOperands = MI->getNumOperands();
254 bool RegForm = false;
256 StringRef AccStr = "+";
258 // The operands for FMA instructions without rounding fall into two forms.
259 // dest, src1, src2, src3
260 // dest, src1, mask, src2, src3
261 // Where src3 is either a register or 5 memory address operands. So to find
262 // dest and src1 we can index from the front. To find src2 and src3 we can
263 // index from the end by taking into account memory vs register form when
266 switch (MI->getOpcode()) {
269 CASE_FMA_PACKED_REG(FMADD132)
270 CASE_FMA_SCALAR_REG(FMADD132)
271 Mul2Name = getRegName(MI->getOperand(NumOperands - 1).getReg());
274 CASE_FMA_PACKED_MEM(FMADD132)
275 CASE_FMA_SCALAR_MEM(FMADD132)
276 AccName = getRegName(MI->getOperand(NumOperands-(RegForm?2:6)).getReg());
277 Mul1Name = getRegName(MI->getOperand(1).getReg());
280 CASE_FMA_PACKED_REG(FMADD213)
281 CASE_FMA_SCALAR_REG(FMADD213)
282 AccName = getRegName(MI->getOperand(NumOperands - 1).getReg());
285 CASE_FMA_PACKED_MEM(FMADD213)
286 CASE_FMA_SCALAR_MEM(FMADD213)
287 Mul1Name = getRegName(MI->getOperand(NumOperands-(RegForm?2:6)).getReg());
288 Mul2Name = getRegName(MI->getOperand(1).getReg());
291 CASE_FMA_PACKED_REG(FMADD231)
292 CASE_FMA_SCALAR_REG(FMADD231)
293 Mul2Name = getRegName(MI->getOperand(NumOperands - 1).getReg());
296 CASE_FMA_PACKED_MEM(FMADD231)
297 CASE_FMA_SCALAR_MEM(FMADD231)
298 Mul1Name = getRegName(MI->getOperand(NumOperands-(RegForm?2:6)).getReg());
299 AccName = getRegName(MI->getOperand(1).getReg());
302 CASE_FMA_PACKED_REG(FMSUB132)
303 CASE_FMA_SCALAR_REG(FMSUB132)
304 Mul2Name = getRegName(MI->getOperand(NumOperands - 1).getReg());
307 CASE_FMA_PACKED_MEM(FMSUB132)
308 CASE_FMA_SCALAR_MEM(FMSUB132)
309 AccName = getRegName(MI->getOperand(NumOperands-(RegForm?2:6)).getReg());
310 Mul1Name = getRegName(MI->getOperand(1).getReg());
314 CASE_FMA_PACKED_REG(FMSUB213)
315 CASE_FMA_SCALAR_REG(FMSUB213)
316 AccName = getRegName(MI->getOperand(NumOperands - 1).getReg());
319 CASE_FMA_PACKED_MEM(FMSUB213)
320 CASE_FMA_SCALAR_MEM(FMSUB213)
321 Mul1Name = getRegName(MI->getOperand(NumOperands-(RegForm?2:6)).getReg());
322 Mul2Name = getRegName(MI->getOperand(1).getReg());
326 CASE_FMA_PACKED_REG(FMSUB231)
327 CASE_FMA_SCALAR_REG(FMSUB231)
328 Mul2Name = getRegName(MI->getOperand(NumOperands - 1).getReg());
331 CASE_FMA_PACKED_MEM(FMSUB231)
332 CASE_FMA_SCALAR_MEM(FMSUB231)
333 Mul1Name = getRegName(MI->getOperand(NumOperands-(RegForm?2:6)).getReg());
334 AccName = getRegName(MI->getOperand(1).getReg());
338 CASE_FMA_PACKED_REG(FNMADD132)
339 CASE_FMA_SCALAR_REG(FNMADD132)
340 Mul2Name = getRegName(MI->getOperand(NumOperands - 1).getReg());
343 CASE_FMA_PACKED_MEM(FNMADD132)
344 CASE_FMA_SCALAR_MEM(FNMADD132)
345 AccName = getRegName(MI->getOperand(NumOperands-(RegForm?2:6)).getReg());
346 Mul1Name = getRegName(MI->getOperand(1).getReg());
350 CASE_FMA_PACKED_REG(FNMADD213)
351 CASE_FMA_SCALAR_REG(FNMADD213)
352 AccName = getRegName(MI->getOperand(NumOperands - 1).getReg());
355 CASE_FMA_PACKED_MEM(FNMADD213)
356 CASE_FMA_SCALAR_MEM(FNMADD213)
357 Mul1Name = getRegName(MI->getOperand(NumOperands-(RegForm?2:6)).getReg());
358 Mul2Name = getRegName(MI->getOperand(1).getReg());
362 CASE_FMA_PACKED_REG(FNMADD231)
363 CASE_FMA_SCALAR_REG(FNMADD231)
364 Mul2Name = getRegName(MI->getOperand(NumOperands - 1).getReg());
367 CASE_FMA_PACKED_MEM(FNMADD231)
368 CASE_FMA_SCALAR_MEM(FNMADD231)
369 Mul1Name = getRegName(MI->getOperand(NumOperands-(RegForm?2:6)).getReg());
370 AccName = getRegName(MI->getOperand(1).getReg());
374 CASE_FMA_PACKED_REG(FNMSUB132)
375 CASE_FMA_SCALAR_REG(FNMSUB132)
376 Mul2Name = getRegName(MI->getOperand(NumOperands - 1).getReg());
379 CASE_FMA_PACKED_MEM(FNMSUB132)
380 CASE_FMA_SCALAR_MEM(FNMSUB132)
381 AccName = getRegName(MI->getOperand(NumOperands-(RegForm?2:6)).getReg());
382 Mul1Name = getRegName(MI->getOperand(1).getReg());
387 CASE_FMA_PACKED_REG(FNMSUB213)
388 CASE_FMA_SCALAR_REG(FNMSUB213)
389 AccName = getRegName(MI->getOperand(NumOperands - 1).getReg());
392 CASE_FMA_PACKED_MEM(FNMSUB213)
393 CASE_FMA_SCALAR_MEM(FNMSUB213)
394 Mul1Name = getRegName(MI->getOperand(NumOperands-(RegForm?2:6)).getReg());
395 Mul2Name = getRegName(MI->getOperand(1).getReg());
400 CASE_FMA_PACKED_REG(FNMSUB231)
401 CASE_FMA_SCALAR_REG(FNMSUB231)
402 Mul2Name = getRegName(MI->getOperand(NumOperands - 1).getReg());
405 CASE_FMA_PACKED_MEM(FNMSUB231)
406 CASE_FMA_SCALAR_MEM(FNMSUB231)
407 Mul1Name = getRegName(MI->getOperand(NumOperands-(RegForm?2:6)).getReg());
408 AccName = getRegName(MI->getOperand(1).getReg());
413 CASE_FMA_PACKED_REG(FMADDSUB132)
414 Mul2Name = getRegName(MI->getOperand(NumOperands - 1).getReg());
417 CASE_FMA_PACKED_MEM(FMADDSUB132)
418 AccName = getRegName(MI->getOperand(NumOperands-(RegForm?2:6)).getReg());
419 Mul1Name = getRegName(MI->getOperand(1).getReg());
423 CASE_FMA_PACKED_REG(FMADDSUB213)
424 AccName = getRegName(MI->getOperand(NumOperands - 1).getReg());
427 CASE_FMA_PACKED_MEM(FMADDSUB213)
428 Mul1Name = getRegName(MI->getOperand(NumOperands-(RegForm?2:6)).getReg());
429 Mul2Name = getRegName(MI->getOperand(1).getReg());
433 CASE_FMA_PACKED_REG(FMADDSUB231)
434 Mul2Name = getRegName(MI->getOperand(NumOperands - 1).getReg());
437 CASE_FMA_PACKED_MEM(FMADDSUB231)
438 Mul1Name = getRegName(MI->getOperand(NumOperands-(RegForm?2:6)).getReg());
439 AccName = getRegName(MI->getOperand(1).getReg());
443 CASE_FMA_PACKED_REG(FMSUBADD132)
444 Mul2Name = getRegName(MI->getOperand(NumOperands - 1).getReg());
447 CASE_FMA_PACKED_MEM(FMSUBADD132)
448 AccName = getRegName(MI->getOperand(NumOperands-(RegForm?2:6)).getReg());
449 Mul1Name = getRegName(MI->getOperand(1).getReg());
453 CASE_FMA_PACKED_REG(FMSUBADD213)
454 AccName = getRegName(MI->getOperand(NumOperands - 1).getReg());
457 CASE_FMA_PACKED_MEM(FMSUBADD213)
458 Mul1Name = getRegName(MI->getOperand(NumOperands-(RegForm?2:6)).getReg());
459 Mul2Name = getRegName(MI->getOperand(1).getReg());
463 CASE_FMA_PACKED_REG(FMSUBADD231)
464 Mul2Name = getRegName(MI->getOperand(NumOperands - 1).getReg());
467 CASE_FMA_PACKED_MEM(FMSUBADD231)
468 Mul1Name = getRegName(MI->getOperand(NumOperands-(RegForm?2:6)).getReg());
469 AccName = getRegName(MI->getOperand(1).getReg());
474 const char *DestName = getRegName(MI->getOperand(0).getReg());
476 if (!Mul1Name) Mul1Name = "mem";
477 if (!Mul2Name) Mul2Name = "mem";
478 if (!AccName) AccName = "mem";
480 OS << DestName << " = ";
481 // TODO: Print masking information?
486 OS << '(' << Mul1Name << " * " << Mul2Name << ") " << AccStr << ' '
493 //===----------------------------------------------------------------------===//
494 // Top Level Entrypoint
495 //===----------------------------------------------------------------------===//
497 /// EmitAnyX86InstComments - This function decodes x86 instructions and prints
498 /// newline terminated strings to the specified string if desired. This
499 /// information is shown in disassembly dumps when verbose assembly is enabled.
500 bool llvm::EmitAnyX86InstComments(const MCInst *MI, raw_ostream &OS,
501 const MCInstrInfo &MCII) {
502 // If this is a shuffle operation, the switch should fill in this state.
503 SmallVector<int, 8> ShuffleMask;
504 const char *DestName = nullptr, *Src1Name = nullptr, *Src2Name = nullptr;
505 unsigned NumOperands = MI->getNumOperands();
506 bool RegForm = false;
508 if (printFMA3Comments(MI, OS))
511 switch (MI->getOpcode()) {
513 // Not an instruction for which we can decode comments.
516 case X86::BLENDPDrri:
517 case X86::VBLENDPDrri:
518 case X86::VBLENDPDYrri:
519 Src2Name = getRegName(MI->getOperand(2).getReg());
521 case X86::BLENDPDrmi:
522 case X86::VBLENDPDrmi:
523 case X86::VBLENDPDYrmi:
524 if (MI->getOperand(NumOperands - 1).isImm())
525 DecodeBLENDMask(getRegOperandNumElts(MI, 64, 0),
526 MI->getOperand(NumOperands - 1).getImm(),
528 Src1Name = getRegName(MI->getOperand(1).getReg());
529 DestName = getRegName(MI->getOperand(0).getReg());
532 case X86::BLENDPSrri:
533 case X86::VBLENDPSrri:
534 case X86::VBLENDPSYrri:
535 Src2Name = getRegName(MI->getOperand(2).getReg());
537 case X86::BLENDPSrmi:
538 case X86::VBLENDPSrmi:
539 case X86::VBLENDPSYrmi:
540 if (MI->getOperand(NumOperands - 1).isImm())
541 DecodeBLENDMask(getRegOperandNumElts(MI, 32, 0),
542 MI->getOperand(NumOperands - 1).getImm(),
544 Src1Name = getRegName(MI->getOperand(1).getReg());
545 DestName = getRegName(MI->getOperand(0).getReg());
548 case X86::PBLENDWrri:
549 case X86::VPBLENDWrri:
550 case X86::VPBLENDWYrri:
551 Src2Name = getRegName(MI->getOperand(2).getReg());
553 case X86::PBLENDWrmi:
554 case X86::VPBLENDWrmi:
555 case X86::VPBLENDWYrmi:
556 if (MI->getOperand(NumOperands - 1).isImm())
557 DecodeBLENDMask(getRegOperandNumElts(MI, 16, 0),
558 MI->getOperand(NumOperands - 1).getImm(),
560 Src1Name = getRegName(MI->getOperand(1).getReg());
561 DestName = getRegName(MI->getOperand(0).getReg());
564 case X86::VPBLENDDrri:
565 case X86::VPBLENDDYrri:
566 Src2Name = getRegName(MI->getOperand(2).getReg());
568 case X86::VPBLENDDrmi:
569 case X86::VPBLENDDYrmi:
570 if (MI->getOperand(NumOperands - 1).isImm())
571 DecodeBLENDMask(getRegOperandNumElts(MI, 32, 0),
572 MI->getOperand(NumOperands - 1).getImm(),
574 Src1Name = getRegName(MI->getOperand(1).getReg());
575 DestName = getRegName(MI->getOperand(0).getReg());
578 case X86::INSERTPSrr:
579 case X86::VINSERTPSrr:
580 case X86::VINSERTPSZrr:
581 Src2Name = getRegName(MI->getOperand(2).getReg());
583 case X86::INSERTPSrm:
584 case X86::VINSERTPSrm:
585 case X86::VINSERTPSZrm:
586 DestName = getRegName(MI->getOperand(0).getReg());
587 Src1Name = getRegName(MI->getOperand(1).getReg());
588 if (MI->getOperand(NumOperands - 1).isImm())
589 DecodeINSERTPSMask(MI->getOperand(NumOperands - 1).getImm(),
594 case X86::VMOVLHPSrr:
595 case X86::VMOVLHPSZrr:
596 Src2Name = getRegName(MI->getOperand(2).getReg());
597 Src1Name = getRegName(MI->getOperand(1).getReg());
598 DestName = getRegName(MI->getOperand(0).getReg());
599 DecodeMOVLHPSMask(2, ShuffleMask);
603 case X86::VMOVHLPSrr:
604 case X86::VMOVHLPSZrr:
605 Src2Name = getRegName(MI->getOperand(2).getReg());
606 Src1Name = getRegName(MI->getOperand(1).getReg());
607 DestName = getRegName(MI->getOperand(0).getReg());
608 DecodeMOVHLPSMask(2, ShuffleMask);
613 case X86::VMOVHPDZ128rm:
614 Src1Name = getRegName(MI->getOperand(1).getReg());
615 DestName = getRegName(MI->getOperand(0).getReg());
616 DecodeInsertElementMask(2, 1, 1, ShuffleMask);
621 case X86::VMOVHPSZ128rm:
622 Src1Name = getRegName(MI->getOperand(1).getReg());
623 DestName = getRegName(MI->getOperand(0).getReg());
624 DecodeInsertElementMask(4, 2, 2, ShuffleMask);
629 case X86::VMOVLPDZ128rm:
630 Src1Name = getRegName(MI->getOperand(1).getReg());
631 DestName = getRegName(MI->getOperand(0).getReg());
632 DecodeInsertElementMask(2, 0, 1, ShuffleMask);
637 case X86::VMOVLPSZ128rm:
638 Src1Name = getRegName(MI->getOperand(1).getReg());
639 DestName = getRegName(MI->getOperand(0).getReg());
640 DecodeInsertElementMask(4, 0, 2, ShuffleMask);
643 CASE_MOVDUP(MOVSLDUP, r)
644 Src1Name = getRegName(MI->getOperand(NumOperands - 1).getReg());
647 CASE_MOVDUP(MOVSLDUP, m)
648 DestName = getRegName(MI->getOperand(0).getReg());
649 DecodeMOVSLDUPMask(getRegOperandNumElts(MI, 32, 0), ShuffleMask);
652 CASE_MOVDUP(MOVSHDUP, r)
653 Src1Name = getRegName(MI->getOperand(NumOperands - 1).getReg());
656 CASE_MOVDUP(MOVSHDUP, m)
657 DestName = getRegName(MI->getOperand(0).getReg());
658 DecodeMOVSHDUPMask(getRegOperandNumElts(MI, 32, 0), ShuffleMask);
661 CASE_MOVDUP(MOVDDUP, r)
662 Src1Name = getRegName(MI->getOperand(NumOperands - 1).getReg());
665 CASE_MOVDUP(MOVDDUP, m)
666 DestName = getRegName(MI->getOperand(0).getReg());
667 DecodeMOVDDUPMask(getRegOperandNumElts(MI, 64, 0), ShuffleMask);
672 case X86::VPSLLDQYri:
673 case X86::VPSLLDQZ128rr:
674 case X86::VPSLLDQZ256rr:
675 case X86::VPSLLDQZrr:
676 Src1Name = getRegName(MI->getOperand(1).getReg());
678 case X86::VPSLLDQZ128rm:
679 case X86::VPSLLDQZ256rm:
680 case X86::VPSLLDQZrm:
681 DestName = getRegName(MI->getOperand(0).getReg());
682 if (MI->getOperand(NumOperands - 1).isImm())
683 DecodePSLLDQMask(getRegOperandNumElts(MI, 8, 0),
684 MI->getOperand(NumOperands - 1).getImm(),
690 case X86::VPSRLDQYri:
691 case X86::VPSRLDQZ128rr:
692 case X86::VPSRLDQZ256rr:
693 case X86::VPSRLDQZrr:
694 Src1Name = getRegName(MI->getOperand(1).getReg());
696 case X86::VPSRLDQZ128rm:
697 case X86::VPSRLDQZ256rm:
698 case X86::VPSRLDQZrm:
699 DestName = getRegName(MI->getOperand(0).getReg());
700 if (MI->getOperand(NumOperands - 1).isImm())
701 DecodePSRLDQMask(getRegOperandNumElts(MI, 8, 0),
702 MI->getOperand(NumOperands - 1).getImm(),
706 CASE_SHUF(PALIGNR, rri)
707 Src1Name = getRegName(MI->getOperand(NumOperands - 2).getReg());
711 CASE_SHUF(PALIGNR, rmi)
712 Src2Name = getRegName(MI->getOperand(NumOperands-(RegForm?3:7)).getReg());
713 DestName = getRegName(MI->getOperand(0).getReg());
714 if (MI->getOperand(NumOperands - 1).isImm())
715 DecodePALIGNRMask(getRegOperandNumElts(MI, 8, 0),
716 MI->getOperand(NumOperands - 1).getImm(),
720 CASE_AVX512_INS_COMMON(ALIGNQ, Z, rri)
721 CASE_AVX512_INS_COMMON(ALIGNQ, Z256, rri)
722 CASE_AVX512_INS_COMMON(ALIGNQ, Z128, rri)
723 Src1Name = getRegName(MI->getOperand(NumOperands - 2).getReg());
727 CASE_AVX512_INS_COMMON(ALIGNQ, Z, rmi)
728 CASE_AVX512_INS_COMMON(ALIGNQ, Z256, rmi)
729 CASE_AVX512_INS_COMMON(ALIGNQ, Z128, rmi)
730 Src2Name = getRegName(MI->getOperand(NumOperands-(RegForm?3:7)).getReg());
731 DestName = getRegName(MI->getOperand(0).getReg());
732 if (MI->getOperand(NumOperands - 1).isImm())
733 DecodeVALIGNMask(getRegOperandNumElts(MI, 64, 0),
734 MI->getOperand(NumOperands - 1).getImm(),
738 CASE_AVX512_INS_COMMON(ALIGND, Z, rri)
739 CASE_AVX512_INS_COMMON(ALIGND, Z256, rri)
740 CASE_AVX512_INS_COMMON(ALIGND, Z128, rri)
741 Src1Name = getRegName(MI->getOperand(NumOperands - 2).getReg());
745 CASE_AVX512_INS_COMMON(ALIGND, Z, rmi)
746 CASE_AVX512_INS_COMMON(ALIGND, Z256, rmi)
747 CASE_AVX512_INS_COMMON(ALIGND, Z128, rmi)
748 Src2Name = getRegName(MI->getOperand(NumOperands-(RegForm?3:7)).getReg());
749 DestName = getRegName(MI->getOperand(0).getReg());
750 if (MI->getOperand(NumOperands - 1).isImm())
751 DecodeVALIGNMask(getRegOperandNumElts(MI, 32, 0),
752 MI->getOperand(NumOperands - 1).getImm(),
756 CASE_SHUF(PSHUFD, ri)
757 Src1Name = getRegName(MI->getOperand(NumOperands - 2).getReg());
760 CASE_SHUF(PSHUFD, mi)
761 DestName = getRegName(MI->getOperand(0).getReg());
762 if (MI->getOperand(NumOperands - 1).isImm())
763 DecodePSHUFMask(getRegOperandNumElts(MI, 32, 0), 32,
764 MI->getOperand(NumOperands - 1).getImm(),
768 CASE_SHUF(PSHUFHW, ri)
769 Src1Name = getRegName(MI->getOperand(NumOperands - 2).getReg());
772 CASE_SHUF(PSHUFHW, mi)
773 DestName = getRegName(MI->getOperand(0).getReg());
774 if (MI->getOperand(NumOperands - 1).isImm())
775 DecodePSHUFHWMask(getRegOperandNumElts(MI, 16, 0),
776 MI->getOperand(NumOperands - 1).getImm(),
780 CASE_SHUF(PSHUFLW, ri)
781 Src1Name = getRegName(MI->getOperand(NumOperands - 2).getReg());
784 CASE_SHUF(PSHUFLW, mi)
785 DestName = getRegName(MI->getOperand(0).getReg());
786 if (MI->getOperand(NumOperands - 1).isImm())
787 DecodePSHUFLWMask(getRegOperandNumElts(MI, 16, 0),
788 MI->getOperand(NumOperands - 1).getImm(),
792 case X86::MMX_PSHUFWri:
793 Src1Name = getRegName(MI->getOperand(1).getReg());
796 case X86::MMX_PSHUFWmi:
797 DestName = getRegName(MI->getOperand(0).getReg());
798 if (MI->getOperand(NumOperands - 1).isImm())
799 DecodePSHUFMask(4, 16, MI->getOperand(NumOperands - 1).getImm(),
804 Src1Name = getRegName(MI->getOperand(1).getReg());
808 DestName = getRegName(MI->getOperand(0).getReg());
809 DecodePSWAPMask(2, ShuffleMask);
812 CASE_UNPCK(PUNPCKHBW, r)
813 case X86::MMX_PUNPCKHBWirr:
814 Src2Name = getRegName(MI->getOperand(NumOperands - 1).getReg());
818 CASE_UNPCK(PUNPCKHBW, m)
819 case X86::MMX_PUNPCKHBWirm:
820 Src1Name = getRegName(MI->getOperand(NumOperands-(RegForm?2:6)).getReg());
821 DestName = getRegName(MI->getOperand(0).getReg());
822 DecodeUNPCKHMask(getRegOperandNumElts(MI, 8, 0), 8, ShuffleMask);
825 CASE_UNPCK(PUNPCKHWD, r)
826 case X86::MMX_PUNPCKHWDirr:
827 Src2Name = getRegName(MI->getOperand(NumOperands - 1).getReg());
831 CASE_UNPCK(PUNPCKHWD, m)
832 case X86::MMX_PUNPCKHWDirm:
833 Src1Name = getRegName(MI->getOperand(NumOperands-(RegForm?2:6)).getReg());
834 DestName = getRegName(MI->getOperand(0).getReg());
835 DecodeUNPCKHMask(getRegOperandNumElts(MI, 16, 0), 16, ShuffleMask);
838 CASE_UNPCK(PUNPCKHDQ, r)
839 case X86::MMX_PUNPCKHDQirr:
840 Src2Name = getRegName(MI->getOperand(NumOperands - 1).getReg());
844 CASE_UNPCK(PUNPCKHDQ, m)
845 case X86::MMX_PUNPCKHDQirm:
846 Src1Name = getRegName(MI->getOperand(NumOperands-(RegForm?2:6)).getReg());
847 DestName = getRegName(MI->getOperand(0).getReg());
848 DecodeUNPCKHMask(getRegOperandNumElts(MI, 32, 0), 32, ShuffleMask);
851 CASE_UNPCK(PUNPCKHQDQ, r)
852 Src2Name = getRegName(MI->getOperand(NumOperands - 1).getReg());
856 CASE_UNPCK(PUNPCKHQDQ, m)
857 Src1Name = getRegName(MI->getOperand(NumOperands-(RegForm?2:6)).getReg());
858 DestName = getRegName(MI->getOperand(0).getReg());
859 DecodeUNPCKHMask(getRegOperandNumElts(MI, 64, 0), 64, ShuffleMask);
862 CASE_UNPCK(PUNPCKLBW, r)
863 case X86::MMX_PUNPCKLBWirr:
864 Src2Name = getRegName(MI->getOperand(NumOperands - 1).getReg());
868 CASE_UNPCK(PUNPCKLBW, m)
869 case X86::MMX_PUNPCKLBWirm:
870 Src1Name = getRegName(MI->getOperand(NumOperands-(RegForm?2:6)).getReg());
871 DestName = getRegName(MI->getOperand(0).getReg());
872 DecodeUNPCKLMask(getRegOperandNumElts(MI, 8, 0), 8, ShuffleMask);
875 CASE_UNPCK(PUNPCKLWD, r)
876 case X86::MMX_PUNPCKLWDirr:
877 Src2Name = getRegName(MI->getOperand(NumOperands - 1).getReg());
881 CASE_UNPCK(PUNPCKLWD, m)
882 case X86::MMX_PUNPCKLWDirm:
883 Src1Name = getRegName(MI->getOperand(NumOperands-(RegForm?2:6)).getReg());
884 DestName = getRegName(MI->getOperand(0).getReg());
885 DecodeUNPCKLMask(getRegOperandNumElts(MI, 16, 0), 16, ShuffleMask);
888 CASE_UNPCK(PUNPCKLDQ, r)
889 case X86::MMX_PUNPCKLDQirr:
890 Src2Name = getRegName(MI->getOperand(NumOperands - 1).getReg());
894 CASE_UNPCK(PUNPCKLDQ, m)
895 case X86::MMX_PUNPCKLDQirm:
896 Src1Name = getRegName(MI->getOperand(NumOperands-(RegForm?2:6)).getReg());
897 DestName = getRegName(MI->getOperand(0).getReg());
898 DecodeUNPCKLMask(getRegOperandNumElts(MI, 32, 0), 32, ShuffleMask);
901 CASE_UNPCK(PUNPCKLQDQ, r)
902 Src2Name = getRegName(MI->getOperand(NumOperands - 1).getReg());
906 CASE_UNPCK(PUNPCKLQDQ, m)
907 Src1Name = getRegName(MI->getOperand(NumOperands-(RegForm?2:6)).getReg());
908 DestName = getRegName(MI->getOperand(0).getReg());
909 DecodeUNPCKLMask(getRegOperandNumElts(MI, 64, 0), 64, ShuffleMask);
912 CASE_SHUF(SHUFPD, rri)
913 Src2Name = getRegName(MI->getOperand(NumOperands - 2).getReg());
917 CASE_SHUF(SHUFPD, rmi)
918 if (MI->getOperand(NumOperands - 1).isImm())
919 DecodeSHUFPMask(getRegOperandNumElts(MI, 64, 0), 64,
920 MI->getOperand(NumOperands - 1).getImm(), ShuffleMask);
921 Src1Name = getRegName(MI->getOperand(NumOperands-(RegForm?3:7)).getReg());
922 DestName = getRegName(MI->getOperand(0).getReg());
925 CASE_SHUF(SHUFPS, rri)
926 Src2Name = getRegName(MI->getOperand(NumOperands - 2).getReg());
930 CASE_SHUF(SHUFPS, rmi)
931 if (MI->getOperand(NumOperands - 1).isImm())
932 DecodeSHUFPMask(getRegOperandNumElts(MI, 32, 0), 32,
933 MI->getOperand(NumOperands - 1).getImm(),
935 Src1Name = getRegName(MI->getOperand(NumOperands-(RegForm?3:7)).getReg());
936 DestName = getRegName(MI->getOperand(0).getReg());
940 Src2Name = getRegName(MI->getOperand(NumOperands - 2).getReg());
945 decodeVSHUF64x2FamilyMask(getRegOperandNumElts(MI, 64, 0), 64,
946 MI->getOperand(NumOperands - 1).getImm(),
948 Src1Name = getRegName(MI->getOperand(NumOperands-(RegForm?3:7)).getReg());
949 DestName = getRegName(MI->getOperand(0).getReg());
953 Src2Name = getRegName(MI->getOperand(NumOperands - 2).getReg());
958 decodeVSHUF64x2FamilyMask(getRegOperandNumElts(MI, 32, 0), 32,
959 MI->getOperand(NumOperands - 1).getImm(),
961 Src1Name = getRegName(MI->getOperand(NumOperands-(RegForm?3:7)).getReg());
962 DestName = getRegName(MI->getOperand(0).getReg());
965 CASE_UNPCK(UNPCKLPD, r)
966 Src2Name = getRegName(MI->getOperand(NumOperands - 1).getReg());
970 CASE_UNPCK(UNPCKLPD, m)
971 DecodeUNPCKLMask(getRegOperandNumElts(MI, 64, 0), 64, ShuffleMask);
972 Src1Name = getRegName(MI->getOperand(NumOperands-(RegForm?2:6)).getReg());
973 DestName = getRegName(MI->getOperand(0).getReg());
976 CASE_UNPCK(UNPCKLPS, r)
977 Src2Name = getRegName(MI->getOperand(NumOperands - 1).getReg());
981 CASE_UNPCK(UNPCKLPS, m)
982 DecodeUNPCKLMask(getRegOperandNumElts(MI, 32, 0), 32, ShuffleMask);
983 Src1Name = getRegName(MI->getOperand(NumOperands-(RegForm?2:6)).getReg());
984 DestName = getRegName(MI->getOperand(0).getReg());
987 CASE_UNPCK(UNPCKHPD, r)
988 Src2Name = getRegName(MI->getOperand(NumOperands - 1).getReg());
992 CASE_UNPCK(UNPCKHPD, m)
993 DecodeUNPCKHMask(getRegOperandNumElts(MI, 64, 0), 64, ShuffleMask);
994 Src1Name = getRegName(MI->getOperand(NumOperands-(RegForm?2:6)).getReg());
995 DestName = getRegName(MI->getOperand(0).getReg());
998 CASE_UNPCK(UNPCKHPS, r)
999 Src2Name = getRegName(MI->getOperand(NumOperands - 1).getReg());
1003 CASE_UNPCK(UNPCKHPS, m)
1004 DecodeUNPCKHMask(getRegOperandNumElts(MI, 32, 0), 32, ShuffleMask);
1005 Src1Name = getRegName(MI->getOperand(NumOperands-(RegForm?2:6)).getReg());
1006 DestName = getRegName(MI->getOperand(0).getReg());
1009 CASE_VPERMILPI(PERMILPS, r)
1010 Src1Name = getRegName(MI->getOperand(NumOperands - 2).getReg());
1013 CASE_VPERMILPI(PERMILPS, m)
1014 if (MI->getOperand(NumOperands - 1).isImm())
1015 DecodePSHUFMask(getRegOperandNumElts(MI, 32, 0), 32,
1016 MI->getOperand(NumOperands - 1).getImm(),
1018 DestName = getRegName(MI->getOperand(0).getReg());
1021 CASE_VPERMILPI(PERMILPD, r)
1022 Src1Name = getRegName(MI->getOperand(NumOperands - 2).getReg());
1025 CASE_VPERMILPI(PERMILPD, m)
1026 if (MI->getOperand(NumOperands - 1).isImm())
1027 DecodePSHUFMask(getRegOperandNumElts(MI, 64, 0), 64,
1028 MI->getOperand(NumOperands - 1).getImm(),
1030 DestName = getRegName(MI->getOperand(0).getReg());
1033 case X86::VPERM2F128rr:
1034 case X86::VPERM2I128rr:
1035 Src2Name = getRegName(MI->getOperand(2).getReg());
1038 case X86::VPERM2F128rm:
1039 case X86::VPERM2I128rm:
1040 // For instruction comments purpose, assume the 256-bit vector is v4i64.
1041 if (MI->getOperand(NumOperands - 1).isImm())
1042 DecodeVPERM2X128Mask(4, MI->getOperand(NumOperands - 1).getImm(),
1044 Src1Name = getRegName(MI->getOperand(1).getReg());
1045 DestName = getRegName(MI->getOperand(0).getReg());
1048 CASE_VPERM(PERMPD, r)
1049 Src1Name = getRegName(MI->getOperand(NumOperands - 2).getReg());
1052 CASE_VPERM(PERMPD, m)
1053 if (MI->getOperand(NumOperands - 1).isImm())
1054 DecodeVPERMMask(getRegOperandNumElts(MI, 64, 0),
1055 MI->getOperand(NumOperands - 1).getImm(),
1057 DestName = getRegName(MI->getOperand(0).getReg());
1060 CASE_VPERM(PERMQ, r)
1061 Src1Name = getRegName(MI->getOperand(NumOperands - 2).getReg());
1064 CASE_VPERM(PERMQ, m)
1065 if (MI->getOperand(NumOperands - 1).isImm())
1066 DecodeVPERMMask(getRegOperandNumElts(MI, 64, 0),
1067 MI->getOperand(NumOperands - 1).getImm(),
1069 DestName = getRegName(MI->getOperand(0).getReg());
1074 case X86::VMOVSDZrr:
1075 Src2Name = getRegName(MI->getOperand(2).getReg());
1076 Src1Name = getRegName(MI->getOperand(1).getReg());
1081 case X86::VMOVSDZrm:
1082 DecodeScalarMoveMask(2, nullptr == Src2Name, ShuffleMask);
1083 DestName = getRegName(MI->getOperand(0).getReg());
1088 case X86::VMOVSSZrr:
1089 Src2Name = getRegName(MI->getOperand(2).getReg());
1090 Src1Name = getRegName(MI->getOperand(1).getReg());
1095 case X86::VMOVSSZrm:
1096 DecodeScalarMoveMask(4, nullptr == Src2Name, ShuffleMask);
1097 DestName = getRegName(MI->getOperand(0).getReg());
1100 case X86::MOVPQI2QIrr:
1101 case X86::MOVZPQILo2PQIrr:
1102 case X86::VMOVPQI2QIrr:
1103 case X86::VMOVPQI2QIZrr:
1104 case X86::VMOVZPQILo2PQIrr:
1105 case X86::VMOVZPQILo2PQIZrr:
1106 Src1Name = getRegName(MI->getOperand(1).getReg());
1109 case X86::MOVQI2PQIrm:
1110 case X86::VMOVQI2PQIrm:
1111 case X86::VMOVQI2PQIZrm:
1112 DecodeZeroMoveLowMask(2, ShuffleMask);
1113 DestName = getRegName(MI->getOperand(0).getReg());
1116 case X86::MOVDI2PDIrm:
1117 case X86::VMOVDI2PDIrm:
1118 case X86::VMOVDI2PDIZrm:
1119 DecodeZeroMoveLowMask(4, ShuffleMask);
1120 DestName = getRegName(MI->getOperand(0).getReg());
1124 if (MI->getOperand(2).isImm() &&
1125 MI->getOperand(3).isImm())
1126 DecodeEXTRQIMask(16, 8, MI->getOperand(2).getImm(),
1127 MI->getOperand(3).getImm(), ShuffleMask);
1129 DestName = getRegName(MI->getOperand(0).getReg());
1130 Src1Name = getRegName(MI->getOperand(1).getReg());
1134 if (MI->getOperand(3).isImm() &&
1135 MI->getOperand(4).isImm())
1136 DecodeINSERTQIMask(16, 8, MI->getOperand(3).getImm(),
1137 MI->getOperand(4).getImm(), ShuffleMask);
1139 DestName = getRegName(MI->getOperand(0).getReg());
1140 Src1Name = getRegName(MI->getOperand(1).getReg());
1141 Src2Name = getRegName(MI->getOperand(2).getReg());
1144 case X86::VBROADCASTF128:
1145 case X86::VBROADCASTI128:
1146 CASE_AVX512_INS_COMMON(BROADCASTF64X2, Z128, rm)
1147 CASE_AVX512_INS_COMMON(BROADCASTI64X2, Z128, rm)
1148 DecodeSubVectorBroadcast(4, 2, ShuffleMask);
1149 DestName = getRegName(MI->getOperand(0).getReg());
1151 CASE_AVX512_INS_COMMON(BROADCASTF64X2, , rm)
1152 CASE_AVX512_INS_COMMON(BROADCASTI64X2, , rm)
1153 DecodeSubVectorBroadcast(8, 2, ShuffleMask);
1154 DestName = getRegName(MI->getOperand(0).getReg());
1156 CASE_AVX512_INS_COMMON(BROADCASTF64X4, , rm)
1157 CASE_AVX512_INS_COMMON(BROADCASTI64X4, , rm)
1158 DecodeSubVectorBroadcast(8, 4, ShuffleMask);
1159 DestName = getRegName(MI->getOperand(0).getReg());
1161 CASE_AVX512_INS_COMMON(BROADCASTF32X4, Z256, rm)
1162 CASE_AVX512_INS_COMMON(BROADCASTI32X4, Z256, rm)
1163 DecodeSubVectorBroadcast(8, 4, ShuffleMask);
1164 DestName = getRegName(MI->getOperand(0).getReg());
1166 CASE_AVX512_INS_COMMON(BROADCASTF32X4, , rm)
1167 CASE_AVX512_INS_COMMON(BROADCASTI32X4, , rm)
1168 DecodeSubVectorBroadcast(16, 4, ShuffleMask);
1169 DestName = getRegName(MI->getOperand(0).getReg());
1171 CASE_AVX512_INS_COMMON(BROADCASTF32X8, , rm)
1172 CASE_AVX512_INS_COMMON(BROADCASTI32X8, , rm)
1173 DecodeSubVectorBroadcast(16, 8, ShuffleMask);
1174 DestName = getRegName(MI->getOperand(0).getReg());
1176 CASE_AVX512_INS_COMMON(BROADCASTI32X2, Z128, r)
1177 Src1Name = getRegName(MI->getOperand(NumOperands - 1).getReg());
1179 CASE_AVX512_INS_COMMON(BROADCASTI32X2, Z128, m)
1180 DecodeSubVectorBroadcast(4, 2, ShuffleMask);
1181 DestName = getRegName(MI->getOperand(0).getReg());
1183 CASE_AVX512_INS_COMMON(BROADCASTF32X2, Z256, r)
1184 CASE_AVX512_INS_COMMON(BROADCASTI32X2, Z256, r)
1185 Src1Name = getRegName(MI->getOperand(NumOperands - 1).getReg());
1187 CASE_AVX512_INS_COMMON(BROADCASTF32X2, Z256, m)
1188 CASE_AVX512_INS_COMMON(BROADCASTI32X2, Z256, m)
1189 DecodeSubVectorBroadcast(8, 2, ShuffleMask);
1190 DestName = getRegName(MI->getOperand(0).getReg());
1192 CASE_AVX512_INS_COMMON(BROADCASTF32X2, Z, r)
1193 CASE_AVX512_INS_COMMON(BROADCASTI32X2, Z, r)
1194 Src1Name = getRegName(MI->getOperand(NumOperands - 1).getReg());
1196 CASE_AVX512_INS_COMMON(BROADCASTF32X2, Z, m)
1197 CASE_AVX512_INS_COMMON(BROADCASTI32X2, Z, m)
1198 DecodeSubVectorBroadcast(16, 2, ShuffleMask);
1199 DestName = getRegName(MI->getOperand(0).getReg());
1202 CASE_PMOVZX(PMOVZXBW, r)
1203 Src1Name = getRegName(MI->getOperand(NumOperands - 1).getReg());
1205 CASE_PMOVZX(PMOVZXBW, m)
1206 DecodeZeroExtendMask(8, 16, getRegOperandNumElts(MI, 16, 0), ShuffleMask);
1207 DestName = getRegName(MI->getOperand(0).getReg());
1210 CASE_PMOVZX(PMOVZXBD, r)
1211 Src1Name = getRegName(MI->getOperand(NumOperands - 1).getReg());
1213 CASE_PMOVZX(PMOVZXBD, m)
1214 DecodeZeroExtendMask(8, 32, getRegOperandNumElts(MI, 32, 0), ShuffleMask);
1215 DestName = getRegName(MI->getOperand(0).getReg());
1218 CASE_PMOVZX(PMOVZXBQ, r)
1219 Src1Name = getRegName(MI->getOperand(NumOperands - 1).getReg());
1221 CASE_PMOVZX(PMOVZXBQ, m)
1222 DecodeZeroExtendMask(8, 64, getRegOperandNumElts(MI, 64, 0), ShuffleMask);
1223 DestName = getRegName(MI->getOperand(0).getReg());
1226 CASE_PMOVZX(PMOVZXWD, r)
1227 Src1Name = getRegName(MI->getOperand(NumOperands - 1).getReg());
1229 CASE_PMOVZX(PMOVZXWD, m)
1230 DecodeZeroExtendMask(16, 32, getRegOperandNumElts(MI, 32, 0), ShuffleMask);
1231 DestName = getRegName(MI->getOperand(0).getReg());
1234 CASE_PMOVZX(PMOVZXWQ, r)
1235 Src1Name = getRegName(MI->getOperand(NumOperands - 1).getReg());
1237 CASE_PMOVZX(PMOVZXWQ, m)
1238 DecodeZeroExtendMask(16, 64, getRegOperandNumElts(MI, 64, 0), ShuffleMask);
1239 DestName = getRegName(MI->getOperand(0).getReg());
1242 CASE_PMOVZX(PMOVZXDQ, r)
1243 Src1Name = getRegName(MI->getOperand(NumOperands - 1).getReg());
1245 CASE_PMOVZX(PMOVZXDQ, m)
1246 DecodeZeroExtendMask(32, 64, getRegOperandNumElts(MI, 64, 0), ShuffleMask);
1247 DestName = getRegName(MI->getOperand(0).getReg());
1251 // The only comments we decode are shuffles, so give up if we were unable to
1252 // decode a shuffle mask.
1253 if (ShuffleMask.empty())
1256 if (!DestName) DestName = Src1Name;
1259 printMasking(OS, MI, MCII);
1265 // If the two sources are the same, canonicalize the input elements to be
1266 // from the first src so that we get larger element spans.
1267 if (Src1Name == Src2Name) {
1268 for (unsigned i = 0, e = ShuffleMask.size(); i != e; ++i) {
1269 if ((int)ShuffleMask[i] >= 0 && // Not sentinel.
1270 ShuffleMask[i] >= (int)e) // From second mask.
1271 ShuffleMask[i] -= e;
1275 // The shuffle mask specifies which elements of the src1/src2 fill in the
1276 // destination, with a few sentinel values. Loop through and print them
1278 for (unsigned i = 0, e = ShuffleMask.size(); i != e; ++i) {
1281 if (ShuffleMask[i] == SM_SentinelZero) {
1286 // Otherwise, it must come from src1 or src2. Print the span of elements
1287 // that comes from this src.
1288 bool isSrc1 = ShuffleMask[i] < (int)ShuffleMask.size();
1289 const char *SrcName = isSrc1 ? Src1Name : Src2Name;
1290 OS << (SrcName ? SrcName : "mem") << '[';
1291 bool IsFirst = true;
1292 while (i != e && (int)ShuffleMask[i] != SM_SentinelZero &&
1293 (ShuffleMask[i] < (int)ShuffleMask.size()) == isSrc1) {
1298 if (ShuffleMask[i] == SM_SentinelUndef)
1301 OS << ShuffleMask[i] % ShuffleMask.size();
1305 --i; // For loop increments element #.
1308 // We successfully added a comment to this instruction.