blob: 37bed37b09946bfa807d434af920b0f55dc20356 [file] [log] [blame]
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +00001//===-- X86InstComments.cpp - Generate verbose-asm comments for instrs ----===//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9//
10// This defines functionality used to emit comments about X86 instructions to
11// an output stream for -fverbose-asm.
12//
13//===----------------------------------------------------------------------===//
14
15#include "X86InstComments.h"
Craig Toppera21758f2018-03-29 04:14:04 +000016#include "X86ATTInstPrinter.h"
Craig Topper9804c672018-03-10 03:12:00 +000017#include "MCTargetDesc/X86BaseInfo.h"
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +000018#include "MCTargetDesc/X86MCTargetDesc.h"
19#include "Utils/X86ShuffleDecode.h"
Chandler Carruth6bda14b2017-06-06 11:49:48 +000020#include "llvm/MC/MCInst.h"
Craig Topper9804c672018-03-10 03:12:00 +000021#include "llvm/MC/MCInstrInfo.h"
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +000022#include "llvm/Support/raw_ostream.h"
23
24using namespace llvm;
25
Simon Pilgrim41c05c02016-05-11 11:55:12 +000026#define CASE_SSE_INS_COMMON(Inst, src) \
Simon Pilgrimbfa5f232016-02-06 17:02:15 +000027 case X86::Inst##src:
28
Simon Pilgrim41c05c02016-05-11 11:55:12 +000029#define CASE_AVX_INS_COMMON(Inst, Suffix, src) \
Simon Pilgrimbfa5f232016-02-06 17:02:15 +000030 case X86::V##Inst##Suffix##src:
31
Simon Pilgrim41c05c02016-05-11 11:55:12 +000032#define CASE_MASK_INS_COMMON(Inst, Suffix, src) \
33 case X86::V##Inst##Suffix##src##k:
34
35#define CASE_MASKZ_INS_COMMON(Inst, Suffix, src) \
36 case X86::V##Inst##Suffix##src##kz:
37
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)
42
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) \
Simon Pilgrimbfa5f232016-02-06 17:02:15 +000049 CASE_SSE_INS_COMMON(Inst, r##src)
50
Simon Pilgrim7c2fbdc2016-07-03 13:08:29 +000051#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)
55
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)
60
Simon Pilgrim41c05c02016-05-11 11:55:12 +000061#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) \
Simon Pilgrim0acc32a2016-02-06 19:51:21 +000067 CASE_SSE_INS_COMMON(Inst, r##src)
68
Simon Pilgrim68f438a2016-07-03 13:33:28 +000069#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)
73
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)
78
Simon Pilgrim41c05c02016-05-11 11:55:12 +000079#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) \
Simon Pilgrimbfa5f232016-02-06 17:02:15 +000085 CASE_SSE_INS_COMMON(Inst, r##src)
86
Simon Pilgrim598bdb62016-07-03 14:26:21 +000087#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)
91
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)
96
97#define CASE_SHUF(Inst, suf) \
Craig Topper01f53b12016-06-03 05:31:00 +000098 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)
Simon Pilgrimbfa5f232016-02-06 17:02:15 +0000104
Simon Pilgrim1f590762016-07-03 13:55:41 +0000105#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)
109
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)
114
Simon Pilgrim5080e7f2016-07-03 18:02:43 +0000115#define CASE_VPERMILPI(Inst, src) \
Simon Pilgrim41c05c02016-05-11 11:55:12 +0000116 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) \
Simon Pilgrimbfa5f232016-02-06 17:02:15 +0000120 CASE_AVX_INS_COMMON(Inst, Y, src##i)
121
Simon Pilgrim5080e7f2016-07-03 18:02:43 +0000122#define CASE_MASK_VPERMILPI(Inst, src) \
Simon Pilgrim1f590762016-07-03 13:55:41 +0000123 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)
126
Simon Pilgrim5080e7f2016-07-03 18:02:43 +0000127#define CASE_MASKZ_VPERMILPI(Inst, src) \
Simon Pilgrim1f590762016-07-03 13:55:41 +0000128 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)
131
Simon Pilgrima0d73832016-07-03 18:27:37 +0000132#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)
136
Simon Pilgrim68ea8062016-07-03 18:40:24 +0000137#define CASE_MASK_VPERM(Inst, src) \
138 CASE_MASK_INS_COMMON(Inst, Z, src##i) \
139 CASE_MASK_INS_COMMON(Inst, Z256, src##i)
140
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)
144
Simon Pilgrimbfa5f232016-02-06 17:02:15 +0000145#define CASE_VSHUF(Inst, src) \
Simon Pilgrim41c05c02016-05-11 11:55:12 +0000146 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)
Simon Pilgrimbfa5f232016-02-06 17:02:15 +0000150
Simon Pilgrim1f590762016-07-03 13:55:41 +0000151#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)
156
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)
162
Craig Topperd88204f2018-03-10 21:30:46 +0000163#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)
167
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)
172
173#define CASE_FMA_PACKED_REG(Inst) \
174 CASE_FMA(Inst##PD, r) \
175 CASE_FMA(Inst##PS, r)
176
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)
182
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)
192
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)
202
Igor Breger24cab0f2015-11-16 07:22:00 +0000203static unsigned getVectorRegSize(unsigned RegNo) {
Igor Breger24cab0f2015-11-16 07:22:00 +0000204 if (X86::ZMM0 <= RegNo && RegNo <= X86::ZMM31)
205 return 512;
206 if (X86::YMM0 <= RegNo && RegNo <= X86::YMM31)
207 return 256;
208 if (X86::XMM0 <= RegNo && RegNo <= X86::XMM31)
209 return 128;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000210 if (X86::MM0 <= RegNo && RegNo <= X86::MM7)
211 return 64;
Igor Breger24cab0f2015-11-16 07:22:00 +0000212
213 llvm_unreachable("Unknown vector reg!");
Igor Breger24cab0f2015-11-16 07:22:00 +0000214}
215
Craig Topperacaba3b2018-03-12 16:43:11 +0000216static unsigned getRegOperandNumElts(const MCInst *MI, unsigned ScalarSize,
217 unsigned OperandIndex) {
Igor Breger24cab0f2015-11-16 07:22:00 +0000218 unsigned OpReg = MI->getOperand(OperandIndex).getReg();
Craig Topperacaba3b2018-03-12 16:43:11 +0000219 return getVectorRegSize(OpReg) / ScalarSize;
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000220}
221
Craig Toppera21758f2018-03-29 04:14:04 +0000222static const char *getRegName(unsigned Reg) {
223 return X86ATTInstPrinter::getRegisterName(Reg);
224}
225
Simon Pilgrim7c2fbdc2016-07-03 13:08:29 +0000226/// Wraps the destination register name with AVX512 mask/maskz filtering.
Craig Topper85b1da12017-10-11 00:46:09 +0000227static void printMasking(raw_ostream &OS, const MCInst *MI,
Craig Toppera21758f2018-03-29 04:14:04 +0000228 const MCInstrInfo &MCII) {
Craig Topper9804c672018-03-10 03:12:00 +0000229 const MCInstrDesc &Desc = MCII.get(MI->getOpcode());
230 uint64_t TSFlags = Desc.TSFlags;
Simon Pilgrim7c2fbdc2016-07-03 13:08:29 +0000231
Craig Topper9804c672018-03-10 03:12:00 +0000232 if (!(TSFlags & X86II::EVEX_K))
Craig Topper85b1da12017-10-11 00:46:09 +0000233 return;
Craig Topper9804c672018-03-10 03:12:00 +0000234
235 bool MaskWithZero = (TSFlags & X86II::EVEX_Z);
236 unsigned MaskOp = Desc.getNumDefs();
237
238 if (Desc.getOperandConstraint(MaskOp, MCOI::TIED_TO) != -1)
239 ++MaskOp;
240
241 const char *MaskRegName = getRegName(MI->getOperand(MaskOp).getReg());
Simon Pilgrim7c2fbdc2016-07-03 13:08:29 +0000242
243 // MASK: zmmX {%kY}
Craig Topper85b1da12017-10-11 00:46:09 +0000244 OS << " {%" << MaskRegName << "}";
Simon Pilgrim7c2fbdc2016-07-03 13:08:29 +0000245
246 // MASKZ: zmmX {%kY} {z}
247 if (MaskWithZero)
Craig Topper85b1da12017-10-11 00:46:09 +0000248 OS << " {z}";
Simon Pilgrim7c2fbdc2016-07-03 13:08:29 +0000249}
250
Craig Toppera21758f2018-03-29 04:14:04 +0000251static bool printFMA3Comments(const MCInst *MI, raw_ostream &OS) {
Craig Topperd88204f2018-03-10 21:30:46 +0000252 const char *Mul1Name = nullptr, *Mul2Name = nullptr, *AccName = nullptr;
253 unsigned NumOperands = MI->getNumOperands();
254 bool RegForm = false;
255 bool Negate = false;
256 StringRef AccStr = "+";
257
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
264 // finding src2.
265
266 switch (MI->getOpcode()) {
267 default:
268 return false;
269 CASE_FMA_PACKED_REG(FMADD132)
270 CASE_FMA_SCALAR_REG(FMADD132)
271 Mul2Name = getRegName(MI->getOperand(NumOperands - 1).getReg());
272 RegForm = true;
273 LLVM_FALLTHROUGH;
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());
278 break;
279
280 CASE_FMA_PACKED_REG(FMADD213)
281 CASE_FMA_SCALAR_REG(FMADD213)
282 AccName = getRegName(MI->getOperand(NumOperands - 1).getReg());
283 RegForm = true;
284 LLVM_FALLTHROUGH;
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());
289 break;
290
291 CASE_FMA_PACKED_REG(FMADD231)
292 CASE_FMA_SCALAR_REG(FMADD231)
293 Mul2Name = getRegName(MI->getOperand(NumOperands - 1).getReg());
294 RegForm = true;
295 LLVM_FALLTHROUGH;
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());
300 break;
301
302 CASE_FMA_PACKED_REG(FMSUB132)
303 CASE_FMA_SCALAR_REG(FMSUB132)
304 Mul2Name = getRegName(MI->getOperand(NumOperands - 1).getReg());
305 RegForm = true;
306 LLVM_FALLTHROUGH;
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());
311 AccStr = "-";
312 break;
313
314 CASE_FMA_PACKED_REG(FMSUB213)
315 CASE_FMA_SCALAR_REG(FMSUB213)
316 AccName = getRegName(MI->getOperand(NumOperands - 1).getReg());
317 RegForm = true;
318 LLVM_FALLTHROUGH;
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());
323 AccStr = "-";
324 break;
325
326 CASE_FMA_PACKED_REG(FMSUB231)
327 CASE_FMA_SCALAR_REG(FMSUB231)
328 Mul2Name = getRegName(MI->getOperand(NumOperands - 1).getReg());
329 RegForm = true;
330 LLVM_FALLTHROUGH;
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());
335 AccStr = "-";
336 break;
337
338 CASE_FMA_PACKED_REG(FNMADD132)
339 CASE_FMA_SCALAR_REG(FNMADD132)
340 Mul2Name = getRegName(MI->getOperand(NumOperands - 1).getReg());
341 RegForm = true;
342 LLVM_FALLTHROUGH;
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());
347 Negate = true;
348 break;
349
350 CASE_FMA_PACKED_REG(FNMADD213)
351 CASE_FMA_SCALAR_REG(FNMADD213)
352 AccName = getRegName(MI->getOperand(NumOperands - 1).getReg());
353 RegForm = true;
354 LLVM_FALLTHROUGH;
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());
359 Negate = true;
360 break;
361
362 CASE_FMA_PACKED_REG(FNMADD231)
363 CASE_FMA_SCALAR_REG(FNMADD231)
364 Mul2Name = getRegName(MI->getOperand(NumOperands - 1).getReg());
365 RegForm = true;
366 LLVM_FALLTHROUGH;
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());
371 Negate = true;
372 break;
373
374 CASE_FMA_PACKED_REG(FNMSUB132)
375 CASE_FMA_SCALAR_REG(FNMSUB132)
376 Mul2Name = getRegName(MI->getOperand(NumOperands - 1).getReg());
377 RegForm = true;
378 LLVM_FALLTHROUGH;
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());
383 AccStr = "-";
384 Negate = true;
385 break;
386
387 CASE_FMA_PACKED_REG(FNMSUB213)
388 CASE_FMA_SCALAR_REG(FNMSUB213)
389 AccName = getRegName(MI->getOperand(NumOperands - 1).getReg());
390 RegForm = true;
391 LLVM_FALLTHROUGH;
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());
396 AccStr = "-";
397 Negate = true;
398 break;
399
400 CASE_FMA_PACKED_REG(FNMSUB231)
401 CASE_FMA_SCALAR_REG(FNMSUB231)
402 Mul2Name = getRegName(MI->getOperand(NumOperands - 1).getReg());
403 RegForm = true;
404 LLVM_FALLTHROUGH;
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());
409 AccStr = "-";
410 Negate = true;
411 break;
412
413 CASE_FMA_PACKED_REG(FMADDSUB132)
414 Mul2Name = getRegName(MI->getOperand(NumOperands - 1).getReg());
415 RegForm = true;
416 LLVM_FALLTHROUGH;
417 CASE_FMA_PACKED_MEM(FMADDSUB132)
418 AccName = getRegName(MI->getOperand(NumOperands-(RegForm?2:6)).getReg());
419 Mul1Name = getRegName(MI->getOperand(1).getReg());
420 AccStr = "+/-";
421 break;
422
423 CASE_FMA_PACKED_REG(FMADDSUB213)
424 AccName = getRegName(MI->getOperand(NumOperands - 1).getReg());
425 RegForm = true;
426 LLVM_FALLTHROUGH;
427 CASE_FMA_PACKED_MEM(FMADDSUB213)
428 Mul1Name = getRegName(MI->getOperand(NumOperands-(RegForm?2:6)).getReg());
429 Mul2Name = getRegName(MI->getOperand(1).getReg());
430 AccStr = "+/-";
431 break;
432
433 CASE_FMA_PACKED_REG(FMADDSUB231)
434 Mul2Name = getRegName(MI->getOperand(NumOperands - 1).getReg());
435 RegForm = true;
436 LLVM_FALLTHROUGH;
437 CASE_FMA_PACKED_MEM(FMADDSUB231)
438 Mul1Name = getRegName(MI->getOperand(NumOperands-(RegForm?2:6)).getReg());
439 AccName = getRegName(MI->getOperand(1).getReg());
440 AccStr = "+/-";
441 break;
442
443 CASE_FMA_PACKED_REG(FMSUBADD132)
444 Mul2Name = getRegName(MI->getOperand(NumOperands - 1).getReg());
445 RegForm = true;
446 LLVM_FALLTHROUGH;
447 CASE_FMA_PACKED_MEM(FMSUBADD132)
448 AccName = getRegName(MI->getOperand(NumOperands-(RegForm?2:6)).getReg());
449 Mul1Name = getRegName(MI->getOperand(1).getReg());
450 AccStr = "-/+";
451 break;
452
453 CASE_FMA_PACKED_REG(FMSUBADD213)
454 AccName = getRegName(MI->getOperand(NumOperands - 1).getReg());
455 RegForm = true;
456 LLVM_FALLTHROUGH;
457 CASE_FMA_PACKED_MEM(FMSUBADD213)
458 Mul1Name = getRegName(MI->getOperand(NumOperands-(RegForm?2:6)).getReg());
459 Mul2Name = getRegName(MI->getOperand(1).getReg());
460 AccStr = "-/+";
461 break;
462
463 CASE_FMA_PACKED_REG(FMSUBADD231)
464 Mul2Name = getRegName(MI->getOperand(NumOperands - 1).getReg());
465 RegForm = true;
466 LLVM_FALLTHROUGH;
467 CASE_FMA_PACKED_MEM(FMSUBADD231)
468 Mul1Name = getRegName(MI->getOperand(NumOperands-(RegForm?2:6)).getReg());
469 AccName = getRegName(MI->getOperand(1).getReg());
470 AccStr = "-/+";
471 break;
472 }
473
474 const char *DestName = getRegName(MI->getOperand(0).getReg());
475
476 if (!Mul1Name) Mul1Name = "mem";
477 if (!Mul2Name) Mul2Name = "mem";
478 if (!AccName) AccName = "mem";
479
480 OS << DestName << " = ";
481 // TODO: Print masking information?
482
483 if (Negate)
484 OS << '-';
485
486 OS << '(' << Mul1Name << " * " << Mul2Name << ") " << AccStr << ' '
487 << AccName;
488
489 return true;
490}
491
492
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000493//===----------------------------------------------------------------------===//
494// Top Level Entrypoint
495//===----------------------------------------------------------------------===//
496
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.
500bool llvm::EmitAnyX86InstComments(const MCInst *MI, raw_ostream &OS,
Craig Toppera21758f2018-03-29 04:14:04 +0000501 const MCInstrInfo &MCII) {
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000502 // 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;
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000505 unsigned NumOperands = MI->getNumOperands();
Craig Topper89c17612016-06-10 04:48:05 +0000506 bool RegForm = false;
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000507
Craig Toppera21758f2018-03-29 04:14:04 +0000508 if (printFMA3Comments(MI, OS))
Craig Topperd88204f2018-03-10 21:30:46 +0000509 return true;
510
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000511 switch (MI->getOpcode()) {
512 default:
513 // Not an instruction for which we can decode comments.
514 return false;
515
516 case X86::BLENDPDrri:
517 case X86::VBLENDPDrri:
Simon Pilgrim13d3a202015-11-16 23:03:18 +0000518 case X86::VBLENDPDYrri:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000519 Src2Name = getRegName(MI->getOperand(2).getReg());
Justin Bognercd1d5aa2016-08-17 20:30:52 +0000520 LLVM_FALLTHROUGH;
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000521 case X86::BLENDPDrmi:
522 case X86::VBLENDPDrmi:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000523 case X86::VBLENDPDYrmi:
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000524 if (MI->getOperand(NumOperands - 1).isImm())
Craig Topperacaba3b2018-03-12 16:43:11 +0000525 DecodeBLENDMask(getRegOperandNumElts(MI, 64, 0),
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000526 MI->getOperand(NumOperands - 1).getImm(),
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000527 ShuffleMask);
528 Src1Name = getRegName(MI->getOperand(1).getReg());
529 DestName = getRegName(MI->getOperand(0).getReg());
530 break;
531
532 case X86::BLENDPSrri:
533 case X86::VBLENDPSrri:
Simon Pilgrim13d3a202015-11-16 23:03:18 +0000534 case X86::VBLENDPSYrri:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000535 Src2Name = getRegName(MI->getOperand(2).getReg());
Justin Bognercd1d5aa2016-08-17 20:30:52 +0000536 LLVM_FALLTHROUGH;
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000537 case X86::BLENDPSrmi:
538 case X86::VBLENDPSrmi:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000539 case X86::VBLENDPSYrmi:
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000540 if (MI->getOperand(NumOperands - 1).isImm())
Craig Topperacaba3b2018-03-12 16:43:11 +0000541 DecodeBLENDMask(getRegOperandNumElts(MI, 32, 0),
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000542 MI->getOperand(NumOperands - 1).getImm(),
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000543 ShuffleMask);
544 Src1Name = getRegName(MI->getOperand(1).getReg());
545 DestName = getRegName(MI->getOperand(0).getReg());
546 break;
547
548 case X86::PBLENDWrri:
549 case X86::VPBLENDWrri:
Simon Pilgrim13d3a202015-11-16 23:03:18 +0000550 case X86::VPBLENDWYrri:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000551 Src2Name = getRegName(MI->getOperand(2).getReg());
Justin Bognercd1d5aa2016-08-17 20:30:52 +0000552 LLVM_FALLTHROUGH;
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000553 case X86::PBLENDWrmi:
554 case X86::VPBLENDWrmi:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000555 case X86::VPBLENDWYrmi:
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000556 if (MI->getOperand(NumOperands - 1).isImm())
Craig Topperacaba3b2018-03-12 16:43:11 +0000557 DecodeBLENDMask(getRegOperandNumElts(MI, 16, 0),
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000558 MI->getOperand(NumOperands - 1).getImm(),
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000559 ShuffleMask);
560 Src1Name = getRegName(MI->getOperand(1).getReg());
561 DestName = getRegName(MI->getOperand(0).getReg());
562 break;
563
564 case X86::VPBLENDDrri:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000565 case X86::VPBLENDDYrri:
566 Src2Name = getRegName(MI->getOperand(2).getReg());
Justin Bognercd1d5aa2016-08-17 20:30:52 +0000567 LLVM_FALLTHROUGH;
Simon Pilgrim13d3a202015-11-16 23:03:18 +0000568 case X86::VPBLENDDrmi:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000569 case X86::VPBLENDDYrmi:
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000570 if (MI->getOperand(NumOperands - 1).isImm())
Craig Topperacaba3b2018-03-12 16:43:11 +0000571 DecodeBLENDMask(getRegOperandNumElts(MI, 32, 0),
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000572 MI->getOperand(NumOperands - 1).getImm(),
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000573 ShuffleMask);
574 Src1Name = getRegName(MI->getOperand(1).getReg());
575 DestName = getRegName(MI->getOperand(0).getReg());
576 break;
577
578 case X86::INSERTPSrr:
579 case X86::VINSERTPSrr:
Craig Topper6189d3e2016-07-19 01:26:19 +0000580 case X86::VINSERTPSZrr:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000581 Src2Name = getRegName(MI->getOperand(2).getReg());
Justin Bognercd1d5aa2016-08-17 20:30:52 +0000582 LLVM_FALLTHROUGH;
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000583 case X86::INSERTPSrm:
584 case X86::VINSERTPSrm:
Craig Topper6189d3e2016-07-19 01:26:19 +0000585 case X86::VINSERTPSZrm:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000586 DestName = getRegName(MI->getOperand(0).getReg());
587 Src1Name = getRegName(MI->getOperand(1).getReg());
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000588 if (MI->getOperand(NumOperands - 1).isImm())
589 DecodeINSERTPSMask(MI->getOperand(NumOperands - 1).getImm(),
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000590 ShuffleMask);
591 break;
592
593 case X86::MOVLHPSrr:
594 case X86::VMOVLHPSrr:
Simon Pilgrimd5a15442015-11-21 13:04:42 +0000595 case X86::VMOVLHPSZrr:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000596 Src2Name = getRegName(MI->getOperand(2).getReg());
597 Src1Name = getRegName(MI->getOperand(1).getReg());
598 DestName = getRegName(MI->getOperand(0).getReg());
599 DecodeMOVLHPSMask(2, ShuffleMask);
600 break;
601
602 case X86::MOVHLPSrr:
603 case X86::VMOVHLPSrr:
Simon Pilgrimd5a15442015-11-21 13:04:42 +0000604 case X86::VMOVHLPSZrr:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000605 Src2Name = getRegName(MI->getOperand(2).getReg());
606 Src1Name = getRegName(MI->getOperand(1).getReg());
607 DestName = getRegName(MI->getOperand(0).getReg());
608 DecodeMOVHLPSMask(2, ShuffleMask);
609 break;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000610
Simon Pilgrima3d67442016-02-07 15:39:22 +0000611 case X86::MOVHPDrm:
612 case X86::VMOVHPDrm:
613 case X86::VMOVHPDZ128rm:
614 Src1Name = getRegName(MI->getOperand(1).getReg());
615 DestName = getRegName(MI->getOperand(0).getReg());
Craig Topperacaba3b2018-03-12 16:43:11 +0000616 DecodeInsertElementMask(2, 1, 1, ShuffleMask);
Simon Pilgrima3d67442016-02-07 15:39:22 +0000617 break;
618
619 case X86::MOVHPSrm:
620 case X86::VMOVHPSrm:
621 case X86::VMOVHPSZ128rm:
622 Src1Name = getRegName(MI->getOperand(1).getReg());
623 DestName = getRegName(MI->getOperand(0).getReg());
Craig Topperacaba3b2018-03-12 16:43:11 +0000624 DecodeInsertElementMask(4, 2, 2, ShuffleMask);
Simon Pilgrima3d67442016-02-07 15:39:22 +0000625 break;
626
627 case X86::MOVLPDrm:
628 case X86::VMOVLPDrm:
629 case X86::VMOVLPDZ128rm:
630 Src1Name = getRegName(MI->getOperand(1).getReg());
631 DestName = getRegName(MI->getOperand(0).getReg());
Craig Topperacaba3b2018-03-12 16:43:11 +0000632 DecodeInsertElementMask(2, 0, 1, ShuffleMask);
Simon Pilgrima3d67442016-02-07 15:39:22 +0000633 break;
634
635 case X86::MOVLPSrm:
636 case X86::VMOVLPSrm:
637 case X86::VMOVLPSZ128rm:
638 Src1Name = getRegName(MI->getOperand(1).getReg());
639 DestName = getRegName(MI->getOperand(0).getReg());
Craig Topperacaba3b2018-03-12 16:43:11 +0000640 DecodeInsertElementMask(4, 0, 2, ShuffleMask);
Simon Pilgrima3d67442016-02-07 15:39:22 +0000641 break;
642
Igor Breger24cab0f2015-11-16 07:22:00 +0000643 CASE_MOVDUP(MOVSLDUP, r)
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000644 Src1Name = getRegName(MI->getOperand(NumOperands - 1).getReg());
Justin Bognercd1d5aa2016-08-17 20:30:52 +0000645 LLVM_FALLTHROUGH;
646
Igor Breger1f782962015-11-19 08:26:56 +0000647 CASE_MOVDUP(MOVSLDUP, m)
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000648 DestName = getRegName(MI->getOperand(0).getReg());
Craig Topperacaba3b2018-03-12 16:43:11 +0000649 DecodeMOVSLDUPMask(getRegOperandNumElts(MI, 32, 0), ShuffleMask);
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000650 break;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000651
Igor Breger24cab0f2015-11-16 07:22:00 +0000652 CASE_MOVDUP(MOVSHDUP, r)
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000653 Src1Name = getRegName(MI->getOperand(NumOperands - 1).getReg());
Justin Bognercd1d5aa2016-08-17 20:30:52 +0000654 LLVM_FALLTHROUGH;
655
Igor Breger1f782962015-11-19 08:26:56 +0000656 CASE_MOVDUP(MOVSHDUP, m)
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000657 DestName = getRegName(MI->getOperand(0).getReg());
Craig Topperacaba3b2018-03-12 16:43:11 +0000658 DecodeMOVSHDUPMask(getRegOperandNumElts(MI, 32, 0), ShuffleMask);
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000659 break;
660
Igor Breger1f782962015-11-19 08:26:56 +0000661 CASE_MOVDUP(MOVDDUP, r)
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000662 Src1Name = getRegName(MI->getOperand(NumOperands - 1).getReg());
Justin Bognercd1d5aa2016-08-17 20:30:52 +0000663 LLVM_FALLTHROUGH;
664
Igor Breger1f782962015-11-19 08:26:56 +0000665 CASE_MOVDUP(MOVDDUP, m)
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000666 DestName = getRegName(MI->getOperand(0).getReg());
Craig Topperacaba3b2018-03-12 16:43:11 +0000667 DecodeMOVDDUPMask(getRegOperandNumElts(MI, 64, 0), ShuffleMask);
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000668 break;
669
670 case X86::PSLLDQri:
671 case X86::VPSLLDQri:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000672 case X86::VPSLLDQYri:
Simon Pilgrim643734c2016-06-09 22:03:15 +0000673 case X86::VPSLLDQZ128rr:
674 case X86::VPSLLDQZ256rr:
Craig Topperaa904d52017-12-10 17:42:39 +0000675 case X86::VPSLLDQZrr:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000676 Src1Name = getRegName(MI->getOperand(1).getReg());
Galina Kistanovab2c01162017-05-31 19:41:33 +0000677 LLVM_FALLTHROUGH;
Simon Pilgrim643734c2016-06-09 22:03:15 +0000678 case X86::VPSLLDQZ128rm:
679 case X86::VPSLLDQZ256rm:
Craig Topperaa904d52017-12-10 17:42:39 +0000680 case X86::VPSLLDQZrm:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000681 DestName = getRegName(MI->getOperand(0).getReg());
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000682 if (MI->getOperand(NumOperands - 1).isImm())
Craig Topperacaba3b2018-03-12 16:43:11 +0000683 DecodePSLLDQMask(getRegOperandNumElts(MI, 8, 0),
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000684 MI->getOperand(NumOperands - 1).getImm(),
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000685 ShuffleMask);
686 break;
687
688 case X86::PSRLDQri:
689 case X86::VPSRLDQri:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000690 case X86::VPSRLDQYri:
Simon Pilgrim643734c2016-06-09 22:03:15 +0000691 case X86::VPSRLDQZ128rr:
692 case X86::VPSRLDQZ256rr:
Craig Topperaa904d52017-12-10 17:42:39 +0000693 case X86::VPSRLDQZrr:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000694 Src1Name = getRegName(MI->getOperand(1).getReg());
Galina Kistanovab2c01162017-05-31 19:41:33 +0000695 LLVM_FALLTHROUGH;
Simon Pilgrim643734c2016-06-09 22:03:15 +0000696 case X86::VPSRLDQZ128rm:
697 case X86::VPSRLDQZ256rm:
Craig Topperaa904d52017-12-10 17:42:39 +0000698 case X86::VPSRLDQZrm:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000699 DestName = getRegName(MI->getOperand(0).getReg());
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000700 if (MI->getOperand(NumOperands - 1).isImm())
Craig Topperacaba3b2018-03-12 16:43:11 +0000701 DecodePSRLDQMask(getRegOperandNumElts(MI, 8, 0),
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000702 MI->getOperand(NumOperands - 1).getImm(),
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000703 ShuffleMask);
704 break;
705
Craig Topper7a299302016-06-09 07:06:38 +0000706 CASE_SHUF(PALIGNR, rri)
Craig Topper89c17612016-06-10 04:48:05 +0000707 Src1Name = getRegName(MI->getOperand(NumOperands - 2).getReg());
708 RegForm = true;
Justin Bognercd1d5aa2016-08-17 20:30:52 +0000709 LLVM_FALLTHROUGH;
710
Craig Topper7a299302016-06-09 07:06:38 +0000711 CASE_SHUF(PALIGNR, rmi)
Craig Topper89c17612016-06-10 04:48:05 +0000712 Src2Name = getRegName(MI->getOperand(NumOperands-(RegForm?3:7)).getReg());
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000713 DestName = getRegName(MI->getOperand(0).getReg());
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000714 if (MI->getOperand(NumOperands - 1).isImm())
Craig Topperacaba3b2018-03-12 16:43:11 +0000715 DecodePALIGNRMask(getRegOperandNumElts(MI, 8, 0),
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000716 MI->getOperand(NumOperands - 1).getImm(),
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000717 ShuffleMask);
718 break;
719
Craig Topperb084c902016-10-22 06:51:56 +0000720 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());
724 RegForm = true;
725 LLVM_FALLTHROUGH;
726
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())
Craig Topperacaba3b2018-03-12 16:43:11 +0000733 DecodeVALIGNMask(getRegOperandNumElts(MI, 64, 0),
Craig Topperb084c902016-10-22 06:51:56 +0000734 MI->getOperand(NumOperands - 1).getImm(),
735 ShuffleMask);
736 break;
737
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());
742 RegForm = true;
743 LLVM_FALLTHROUGH;
744
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())
Craig Topperacaba3b2018-03-12 16:43:11 +0000751 DecodeVALIGNMask(getRegOperandNumElts(MI, 32, 0),
Craig Topperb084c902016-10-22 06:51:56 +0000752 MI->getOperand(NumOperands - 1).getImm(),
753 ShuffleMask);
754 break;
755
Craig Topper01f53b12016-06-03 05:31:00 +0000756 CASE_SHUF(PSHUFD, ri)
Craig Topper6f7288d2016-06-09 07:49:08 +0000757 Src1Name = getRegName(MI->getOperand(NumOperands - 2).getReg());
Justin Bognercd1d5aa2016-08-17 20:30:52 +0000758 LLVM_FALLTHROUGH;
759
Craig Topper01f53b12016-06-03 05:31:00 +0000760 CASE_SHUF(PSHUFD, mi)
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000761 DestName = getRegName(MI->getOperand(0).getReg());
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000762 if (MI->getOperand(NumOperands - 1).isImm())
Craig Topperacaba3b2018-03-12 16:43:11 +0000763 DecodePSHUFMask(getRegOperandNumElts(MI, 32, 0), 32,
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000764 MI->getOperand(NumOperands - 1).getImm(),
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000765 ShuffleMask);
766 break;
767
Craig Topper01f53b12016-06-03 05:31:00 +0000768 CASE_SHUF(PSHUFHW, ri)
Craig Topper6f7288d2016-06-09 07:49:08 +0000769 Src1Name = getRegName(MI->getOperand(NumOperands - 2).getReg());
Justin Bognercd1d5aa2016-08-17 20:30:52 +0000770 LLVM_FALLTHROUGH;
771
Craig Topper01f53b12016-06-03 05:31:00 +0000772 CASE_SHUF(PSHUFHW, mi)
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000773 DestName = getRegName(MI->getOperand(0).getReg());
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000774 if (MI->getOperand(NumOperands - 1).isImm())
Craig Topperacaba3b2018-03-12 16:43:11 +0000775 DecodePSHUFHWMask(getRegOperandNumElts(MI, 16, 0),
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000776 MI->getOperand(NumOperands - 1).getImm(),
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000777 ShuffleMask);
778 break;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000779
Craig Topper01f53b12016-06-03 05:31:00 +0000780 CASE_SHUF(PSHUFLW, ri)
Craig Topper6f7288d2016-06-09 07:49:08 +0000781 Src1Name = getRegName(MI->getOperand(NumOperands - 2).getReg());
Justin Bognercd1d5aa2016-08-17 20:30:52 +0000782 LLVM_FALLTHROUGH;
783
Craig Topper01f53b12016-06-03 05:31:00 +0000784 CASE_SHUF(PSHUFLW, mi)
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000785 DestName = getRegName(MI->getOperand(0).getReg());
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000786 if (MI->getOperand(NumOperands - 1).isImm())
Craig Topperacaba3b2018-03-12 16:43:11 +0000787 DecodePSHUFLWMask(getRegOperandNumElts(MI, 16, 0),
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000788 MI->getOperand(NumOperands - 1).getImm(),
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000789 ShuffleMask);
790 break;
791
Simon Pilgrimf8f86ab2015-09-13 11:28:45 +0000792 case X86::MMX_PSHUFWri:
793 Src1Name = getRegName(MI->getOperand(1).getReg());
Justin Bognercd1d5aa2016-08-17 20:30:52 +0000794 LLVM_FALLTHROUGH;
795
Simon Pilgrimf8f86ab2015-09-13 11:28:45 +0000796 case X86::MMX_PSHUFWmi:
797 DestName = getRegName(MI->getOperand(0).getReg());
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000798 if (MI->getOperand(NumOperands - 1).isImm())
Craig Topperacaba3b2018-03-12 16:43:11 +0000799 DecodePSHUFMask(4, 16, MI->getOperand(NumOperands - 1).getImm(),
Simon Pilgrimf8f86ab2015-09-13 11:28:45 +0000800 ShuffleMask);
801 break;
802
803 case X86::PSWAPDrr:
804 Src1Name = getRegName(MI->getOperand(1).getReg());
Justin Bognercd1d5aa2016-08-17 20:30:52 +0000805 LLVM_FALLTHROUGH;
806
Simon Pilgrimf8f86ab2015-09-13 11:28:45 +0000807 case X86::PSWAPDrm:
808 DestName = getRegName(MI->getOperand(0).getReg());
Craig Topperacaba3b2018-03-12 16:43:11 +0000809 DecodePSWAPMask(2, ShuffleMask);
Simon Pilgrimf8f86ab2015-09-13 11:28:45 +0000810 break;
811
Simon Pilgrim8483df62015-11-17 22:35:45 +0000812 CASE_UNPCK(PUNPCKHBW, r)
Simon Pilgrimf8f86ab2015-09-13 11:28:45 +0000813 case X86::MMX_PUNPCKHBWirr:
Craig Topper89c17612016-06-10 04:48:05 +0000814 Src2Name = getRegName(MI->getOperand(NumOperands - 1).getReg());
815 RegForm = true;
Justin Bognercd1d5aa2016-08-17 20:30:52 +0000816 LLVM_FALLTHROUGH;
817
Simon Pilgrim8483df62015-11-17 22:35:45 +0000818 CASE_UNPCK(PUNPCKHBW, m)
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000819 case X86::MMX_PUNPCKHBWirm:
Craig Topper89c17612016-06-10 04:48:05 +0000820 Src1Name = getRegName(MI->getOperand(NumOperands-(RegForm?2:6)).getReg());
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000821 DestName = getRegName(MI->getOperand(0).getReg());
Craig Topperacaba3b2018-03-12 16:43:11 +0000822 DecodeUNPCKHMask(getRegOperandNumElts(MI, 8, 0), 8, ShuffleMask);
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000823 break;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000824
Simon Pilgrim8483df62015-11-17 22:35:45 +0000825 CASE_UNPCK(PUNPCKHWD, r)
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000826 case X86::MMX_PUNPCKHWDirr:
Craig Topper89c17612016-06-10 04:48:05 +0000827 Src2Name = getRegName(MI->getOperand(NumOperands - 1).getReg());
828 RegForm = true;
Justin Bognercd1d5aa2016-08-17 20:30:52 +0000829 LLVM_FALLTHROUGH;
830
Simon Pilgrim8483df62015-11-17 22:35:45 +0000831 CASE_UNPCK(PUNPCKHWD, m)
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000832 case X86::MMX_PUNPCKHWDirm:
Craig Topper89c17612016-06-10 04:48:05 +0000833 Src1Name = getRegName(MI->getOperand(NumOperands-(RegForm?2:6)).getReg());
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000834 DestName = getRegName(MI->getOperand(0).getReg());
Craig Topperacaba3b2018-03-12 16:43:11 +0000835 DecodeUNPCKHMask(getRegOperandNumElts(MI, 16, 0), 16, ShuffleMask);
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000836 break;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000837
Simon Pilgrim8483df62015-11-17 22:35:45 +0000838 CASE_UNPCK(PUNPCKHDQ, r)
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000839 case X86::MMX_PUNPCKHDQirr:
Craig Topper89c17612016-06-10 04:48:05 +0000840 Src2Name = getRegName(MI->getOperand(NumOperands - 1).getReg());
841 RegForm = true;
Justin Bognercd1d5aa2016-08-17 20:30:52 +0000842 LLVM_FALLTHROUGH;
843
Simon Pilgrim8483df62015-11-17 22:35:45 +0000844 CASE_UNPCK(PUNPCKHDQ, m)
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000845 case X86::MMX_PUNPCKHDQirm:
Craig Topper89c17612016-06-10 04:48:05 +0000846 Src1Name = getRegName(MI->getOperand(NumOperands-(RegForm?2:6)).getReg());
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000847 DestName = getRegName(MI->getOperand(0).getReg());
Craig Topperacaba3b2018-03-12 16:43:11 +0000848 DecodeUNPCKHMask(getRegOperandNumElts(MI, 32, 0), 32, ShuffleMask);
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000849 break;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000850
Simon Pilgrim8483df62015-11-17 22:35:45 +0000851 CASE_UNPCK(PUNPCKHQDQ, r)
Craig Topper89c17612016-06-10 04:48:05 +0000852 Src2Name = getRegName(MI->getOperand(NumOperands - 1).getReg());
853 RegForm = true;
Justin Bognercd1d5aa2016-08-17 20:30:52 +0000854 LLVM_FALLTHROUGH;
855
Simon Pilgrim8483df62015-11-17 22:35:45 +0000856 CASE_UNPCK(PUNPCKHQDQ, m)
Craig Topper89c17612016-06-10 04:48:05 +0000857 Src1Name = getRegName(MI->getOperand(NumOperands-(RegForm?2:6)).getReg());
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000858 DestName = getRegName(MI->getOperand(0).getReg());
Craig Topperacaba3b2018-03-12 16:43:11 +0000859 DecodeUNPCKHMask(getRegOperandNumElts(MI, 64, 0), 64, ShuffleMask);
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000860 break;
861
Simon Pilgrim8483df62015-11-17 22:35:45 +0000862 CASE_UNPCK(PUNPCKLBW, r)
Simon Pilgrimf8f86ab2015-09-13 11:28:45 +0000863 case X86::MMX_PUNPCKLBWirr:
Craig Topper89c17612016-06-10 04:48:05 +0000864 Src2Name = getRegName(MI->getOperand(NumOperands - 1).getReg());
865 RegForm = true;
Justin Bognercd1d5aa2016-08-17 20:30:52 +0000866 LLVM_FALLTHROUGH;
867
Simon Pilgrim8483df62015-11-17 22:35:45 +0000868 CASE_UNPCK(PUNPCKLBW, m)
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000869 case X86::MMX_PUNPCKLBWirm:
Craig Topper89c17612016-06-10 04:48:05 +0000870 Src1Name = getRegName(MI->getOperand(NumOperands-(RegForm?2:6)).getReg());
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000871 DestName = getRegName(MI->getOperand(0).getReg());
Craig Topperacaba3b2018-03-12 16:43:11 +0000872 DecodeUNPCKLMask(getRegOperandNumElts(MI, 8, 0), 8, ShuffleMask);
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000873 break;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000874
Simon Pilgrim8483df62015-11-17 22:35:45 +0000875 CASE_UNPCK(PUNPCKLWD, r)
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000876 case X86::MMX_PUNPCKLWDirr:
Craig Topper89c17612016-06-10 04:48:05 +0000877 Src2Name = getRegName(MI->getOperand(NumOperands - 1).getReg());
878 RegForm = true;
Justin Bognercd1d5aa2016-08-17 20:30:52 +0000879 LLVM_FALLTHROUGH;
880
Simon Pilgrim8483df62015-11-17 22:35:45 +0000881 CASE_UNPCK(PUNPCKLWD, m)
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000882 case X86::MMX_PUNPCKLWDirm:
Craig Topper89c17612016-06-10 04:48:05 +0000883 Src1Name = getRegName(MI->getOperand(NumOperands-(RegForm?2:6)).getReg());
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000884 DestName = getRegName(MI->getOperand(0).getReg());
Craig Topperacaba3b2018-03-12 16:43:11 +0000885 DecodeUNPCKLMask(getRegOperandNumElts(MI, 16, 0), 16, ShuffleMask);
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000886 break;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000887
Simon Pilgrim8483df62015-11-17 22:35:45 +0000888 CASE_UNPCK(PUNPCKLDQ, r)
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000889 case X86::MMX_PUNPCKLDQirr:
Craig Topper89c17612016-06-10 04:48:05 +0000890 Src2Name = getRegName(MI->getOperand(NumOperands - 1).getReg());
891 RegForm = true;
Justin Bognercd1d5aa2016-08-17 20:30:52 +0000892 LLVM_FALLTHROUGH;
893
Simon Pilgrim8483df62015-11-17 22:35:45 +0000894 CASE_UNPCK(PUNPCKLDQ, m)
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000895 case X86::MMX_PUNPCKLDQirm:
Craig Topper89c17612016-06-10 04:48:05 +0000896 Src1Name = getRegName(MI->getOperand(NumOperands-(RegForm?2:6)).getReg());
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000897 DestName = getRegName(MI->getOperand(0).getReg());
Craig Topperacaba3b2018-03-12 16:43:11 +0000898 DecodeUNPCKLMask(getRegOperandNumElts(MI, 32, 0), 32, ShuffleMask);
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000899 break;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000900
Simon Pilgrim8483df62015-11-17 22:35:45 +0000901 CASE_UNPCK(PUNPCKLQDQ, r)
Craig Topper89c17612016-06-10 04:48:05 +0000902 Src2Name = getRegName(MI->getOperand(NumOperands - 1).getReg());
903 RegForm = true;
Justin Bognercd1d5aa2016-08-17 20:30:52 +0000904 LLVM_FALLTHROUGH;
905
Simon Pilgrim8483df62015-11-17 22:35:45 +0000906 CASE_UNPCK(PUNPCKLQDQ, m)
Craig Topper89c17612016-06-10 04:48:05 +0000907 Src1Name = getRegName(MI->getOperand(NumOperands-(RegForm?2:6)).getReg());
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000908 DestName = getRegName(MI->getOperand(0).getReg());
Craig Topperacaba3b2018-03-12 16:43:11 +0000909 DecodeUNPCKLMask(getRegOperandNumElts(MI, 64, 0), 64, ShuffleMask);
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000910 break;
911
Craig Topper01f53b12016-06-03 05:31:00 +0000912 CASE_SHUF(SHUFPD, rri)
Craig Topper89c17612016-06-10 04:48:05 +0000913 Src2Name = getRegName(MI->getOperand(NumOperands - 2).getReg());
914 RegForm = true;
Justin Bognercd1d5aa2016-08-17 20:30:52 +0000915 LLVM_FALLTHROUGH;
916
Craig Topper01f53b12016-06-03 05:31:00 +0000917 CASE_SHUF(SHUFPD, rmi)
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000918 if (MI->getOperand(NumOperands - 1).isImm())
Craig Topperacaba3b2018-03-12 16:43:11 +0000919 DecodeSHUFPMask(getRegOperandNumElts(MI, 64, 0), 64,
920 MI->getOperand(NumOperands - 1).getImm(), ShuffleMask);
Craig Topper89c17612016-06-10 04:48:05 +0000921 Src1Name = getRegName(MI->getOperand(NumOperands-(RegForm?3:7)).getReg());
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000922 DestName = getRegName(MI->getOperand(0).getReg());
923 break;
924
Craig Topper01f53b12016-06-03 05:31:00 +0000925 CASE_SHUF(SHUFPS, rri)
Craig Topper89c17612016-06-10 04:48:05 +0000926 Src2Name = getRegName(MI->getOperand(NumOperands - 2).getReg());
927 RegForm = true;
Justin Bognercd1d5aa2016-08-17 20:30:52 +0000928 LLVM_FALLTHROUGH;
929
Craig Topper01f53b12016-06-03 05:31:00 +0000930 CASE_SHUF(SHUFPS, rmi)
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000931 if (MI->getOperand(NumOperands - 1).isImm())
Craig Topperacaba3b2018-03-12 16:43:11 +0000932 DecodeSHUFPMask(getRegOperandNumElts(MI, 32, 0), 32,
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000933 MI->getOperand(NumOperands - 1).getImm(),
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000934 ShuffleMask);
Craig Topper89c17612016-06-10 04:48:05 +0000935 Src1Name = getRegName(MI->getOperand(NumOperands-(RegForm?3:7)).getReg());
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000936 DestName = getRegName(MI->getOperand(0).getReg());
937 break;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000938
Igor Breger24cab0f2015-11-16 07:22:00 +0000939 CASE_VSHUF(64X2, r)
Simon Pilgrimd3869412016-06-11 11:18:38 +0000940 Src2Name = getRegName(MI->getOperand(NumOperands - 2).getReg());
941 RegForm = true;
Justin Bognercd1d5aa2016-08-17 20:30:52 +0000942 LLVM_FALLTHROUGH;
943
Igor Breger24cab0f2015-11-16 07:22:00 +0000944 CASE_VSHUF(64X2, m)
Craig Topperacaba3b2018-03-12 16:43:11 +0000945 decodeVSHUF64x2FamilyMask(getRegOperandNumElts(MI, 64, 0), 64,
Simon Pilgrimd3869412016-06-11 11:18:38 +0000946 MI->getOperand(NumOperands - 1).getImm(),
Igor Bregerd7bae452015-10-15 13:29:07 +0000947 ShuffleMask);
Simon Pilgrimd3869412016-06-11 11:18:38 +0000948 Src1Name = getRegName(MI->getOperand(NumOperands-(RegForm?3:7)).getReg());
Igor Bregerd7bae452015-10-15 13:29:07 +0000949 DestName = getRegName(MI->getOperand(0).getReg());
Igor Bregerd7bae452015-10-15 13:29:07 +0000950 break;
Simon Pilgrimd3869412016-06-11 11:18:38 +0000951
952 CASE_VSHUF(32X4, r)
953 Src2Name = getRegName(MI->getOperand(NumOperands - 2).getReg());
954 RegForm = true;
Justin Bognercd1d5aa2016-08-17 20:30:52 +0000955 LLVM_FALLTHROUGH;
956
Simon Pilgrimd3869412016-06-11 11:18:38 +0000957 CASE_VSHUF(32X4, m)
Craig Topperacaba3b2018-03-12 16:43:11 +0000958 decodeVSHUF64x2FamilyMask(getRegOperandNumElts(MI, 32, 0), 32,
Simon Pilgrimd3869412016-06-11 11:18:38 +0000959 MI->getOperand(NumOperands - 1).getImm(),
960 ShuffleMask);
961 Src1Name = getRegName(MI->getOperand(NumOperands-(RegForm?3:7)).getReg());
962 DestName = getRegName(MI->getOperand(0).getReg());
963 break;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000964
Simon Pilgrim8483df62015-11-17 22:35:45 +0000965 CASE_UNPCK(UNPCKLPD, r)
Craig Topper89c17612016-06-10 04:48:05 +0000966 Src2Name = getRegName(MI->getOperand(NumOperands - 1).getReg());
967 RegForm = true;
Justin Bognercd1d5aa2016-08-17 20:30:52 +0000968 LLVM_FALLTHROUGH;
969
Simon Pilgrim8483df62015-11-17 22:35:45 +0000970 CASE_UNPCK(UNPCKLPD, m)
Craig Topperacaba3b2018-03-12 16:43:11 +0000971 DecodeUNPCKLMask(getRegOperandNumElts(MI, 64, 0), 64, ShuffleMask);
Craig Topper89c17612016-06-10 04:48:05 +0000972 Src1Name = getRegName(MI->getOperand(NumOperands-(RegForm?2:6)).getReg());
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000973 DestName = getRegName(MI->getOperand(0).getReg());
974 break;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000975
Simon Pilgrim8483df62015-11-17 22:35:45 +0000976 CASE_UNPCK(UNPCKLPS, r)
Craig Topper89c17612016-06-10 04:48:05 +0000977 Src2Name = getRegName(MI->getOperand(NumOperands - 1).getReg());
978 RegForm = true;
Justin Bognercd1d5aa2016-08-17 20:30:52 +0000979 LLVM_FALLTHROUGH;
980
Simon Pilgrim8483df62015-11-17 22:35:45 +0000981 CASE_UNPCK(UNPCKLPS, m)
Craig Topperacaba3b2018-03-12 16:43:11 +0000982 DecodeUNPCKLMask(getRegOperandNumElts(MI, 32, 0), 32, ShuffleMask);
Craig Topper89c17612016-06-10 04:48:05 +0000983 Src1Name = getRegName(MI->getOperand(NumOperands-(RegForm?2:6)).getReg());
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000984 DestName = getRegName(MI->getOperand(0).getReg());
985 break;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000986
Simon Pilgrim8483df62015-11-17 22:35:45 +0000987 CASE_UNPCK(UNPCKHPD, r)
Craig Topper89c17612016-06-10 04:48:05 +0000988 Src2Name = getRegName(MI->getOperand(NumOperands - 1).getReg());
989 RegForm = true;
Justin Bognercd1d5aa2016-08-17 20:30:52 +0000990 LLVM_FALLTHROUGH;
991
Simon Pilgrim8483df62015-11-17 22:35:45 +0000992 CASE_UNPCK(UNPCKHPD, m)
Craig Topperacaba3b2018-03-12 16:43:11 +0000993 DecodeUNPCKHMask(getRegOperandNumElts(MI, 64, 0), 64, ShuffleMask);
Craig Topper89c17612016-06-10 04:48:05 +0000994 Src1Name = getRegName(MI->getOperand(NumOperands-(RegForm?2:6)).getReg());
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000995 DestName = getRegName(MI->getOperand(0).getReg());
996 break;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000997
Simon Pilgrim8483df62015-11-17 22:35:45 +0000998 CASE_UNPCK(UNPCKHPS, r)
Craig Topper89c17612016-06-10 04:48:05 +0000999 Src2Name = getRegName(MI->getOperand(NumOperands - 1).getReg());
1000 RegForm = true;
Justin Bognercd1d5aa2016-08-17 20:30:52 +00001001 LLVM_FALLTHROUGH;
1002
Simon Pilgrim8483df62015-11-17 22:35:45 +00001003 CASE_UNPCK(UNPCKHPS, m)
Craig Topperacaba3b2018-03-12 16:43:11 +00001004 DecodeUNPCKHMask(getRegOperandNumElts(MI, 32, 0), 32, ShuffleMask);
Craig Topper89c17612016-06-10 04:48:05 +00001005 Src1Name = getRegName(MI->getOperand(NumOperands-(RegForm?2:6)).getReg());
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +00001006 DestName = getRegName(MI->getOperand(0).getReg());
1007 break;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +00001008
Simon Pilgrim5080e7f2016-07-03 18:02:43 +00001009 CASE_VPERMILPI(PERMILPS, r)
Simon Pilgrim6ce35dd2016-05-11 18:53:44 +00001010 Src1Name = getRegName(MI->getOperand(NumOperands - 2).getReg());
Justin Bognercd1d5aa2016-08-17 20:30:52 +00001011 LLVM_FALLTHROUGH;
1012
Simon Pilgrim5080e7f2016-07-03 18:02:43 +00001013 CASE_VPERMILPI(PERMILPS, m)
Simon Pilgrim3016d9e2016-05-11 17:36:32 +00001014 if (MI->getOperand(NumOperands - 1).isImm())
Craig Topperacaba3b2018-03-12 16:43:11 +00001015 DecodePSHUFMask(getRegOperandNumElts(MI, 32, 0), 32,
Simon Pilgrim3016d9e2016-05-11 17:36:32 +00001016 MI->getOperand(NumOperands - 1).getImm(),
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +00001017 ShuffleMask);
1018 DestName = getRegName(MI->getOperand(0).getReg());
1019 break;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +00001020
Simon Pilgrim5080e7f2016-07-03 18:02:43 +00001021 CASE_VPERMILPI(PERMILPD, r)
Simon Pilgrim6ce35dd2016-05-11 18:53:44 +00001022 Src1Name = getRegName(MI->getOperand(NumOperands - 2).getReg());
Justin Bognercd1d5aa2016-08-17 20:30:52 +00001023 LLVM_FALLTHROUGH;
1024
Simon Pilgrim5080e7f2016-07-03 18:02:43 +00001025 CASE_VPERMILPI(PERMILPD, m)
Simon Pilgrim3016d9e2016-05-11 17:36:32 +00001026 if (MI->getOperand(NumOperands - 1).isImm())
Craig Topperacaba3b2018-03-12 16:43:11 +00001027 DecodePSHUFMask(getRegOperandNumElts(MI, 64, 0), 64,
Simon Pilgrim3016d9e2016-05-11 17:36:32 +00001028 MI->getOperand(NumOperands - 1).getImm(),
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +00001029 ShuffleMask);
1030 DestName = getRegName(MI->getOperand(0).getReg());
1031 break;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +00001032
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +00001033 case X86::VPERM2F128rr:
1034 case X86::VPERM2I128rr:
1035 Src2Name = getRegName(MI->getOperand(2).getReg());
Justin Bognercd1d5aa2016-08-17 20:30:52 +00001036 LLVM_FALLTHROUGH;
1037
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +00001038 case X86::VPERM2F128rm:
1039 case X86::VPERM2I128rm:
1040 // For instruction comments purpose, assume the 256-bit vector is v4i64.
Simon Pilgrim3016d9e2016-05-11 17:36:32 +00001041 if (MI->getOperand(NumOperands - 1).isImm())
Craig Topperacaba3b2018-03-12 16:43:11 +00001042 DecodeVPERM2X128Mask(4, MI->getOperand(NumOperands - 1).getImm(),
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +00001043 ShuffleMask);
1044 Src1Name = getRegName(MI->getOperand(1).getReg());
1045 DestName = getRegName(MI->getOperand(0).getReg());
1046 break;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +00001047
Simon Pilgrima0d73832016-07-03 18:27:37 +00001048 CASE_VPERM(PERMPD, r)
Craig Topper200d2372016-06-10 05:12:40 +00001049 Src1Name = getRegName(MI->getOperand(NumOperands - 2).getReg());
Justin Bognercd1d5aa2016-08-17 20:30:52 +00001050 LLVM_FALLTHROUGH;
1051
Simon Pilgrima0d73832016-07-03 18:27:37 +00001052 CASE_VPERM(PERMPD, m)
Simon Pilgrim3016d9e2016-05-11 17:36:32 +00001053 if (MI->getOperand(NumOperands - 1).isImm())
Craig Topperacaba3b2018-03-12 16:43:11 +00001054 DecodeVPERMMask(getRegOperandNumElts(MI, 64, 0),
Simon Pilgrima0d73832016-07-03 18:27:37 +00001055 MI->getOperand(NumOperands - 1).getImm(),
1056 ShuffleMask);
1057 DestName = getRegName(MI->getOperand(0).getReg());
1058 break;
1059
1060 CASE_VPERM(PERMQ, r)
1061 Src1Name = getRegName(MI->getOperand(NumOperands - 2).getReg());
Justin Bognercd1d5aa2016-08-17 20:30:52 +00001062 LLVM_FALLTHROUGH;
1063
Simon Pilgrima0d73832016-07-03 18:27:37 +00001064 CASE_VPERM(PERMQ, m)
1065 if (MI->getOperand(NumOperands - 1).isImm())
Craig Topperacaba3b2018-03-12 16:43:11 +00001066 DecodeVPERMMask(getRegOperandNumElts(MI, 64, 0),
Simon Pilgrima0d73832016-07-03 18:27:37 +00001067 MI->getOperand(NumOperands - 1).getImm(),
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +00001068 ShuffleMask);
1069 DestName = getRegName(MI->getOperand(0).getReg());
1070 break;
1071
1072 case X86::MOVSDrr:
1073 case X86::VMOVSDrr:
Simon Pilgrimf5c23ad2016-02-01 22:26:28 +00001074 case X86::VMOVSDZrr:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +00001075 Src2Name = getRegName(MI->getOperand(2).getReg());
1076 Src1Name = getRegName(MI->getOperand(1).getReg());
Justin Bognercd1d5aa2016-08-17 20:30:52 +00001077 LLVM_FALLTHROUGH;
1078
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +00001079 case X86::MOVSDrm:
1080 case X86::VMOVSDrm:
Simon Pilgrimf5c23ad2016-02-01 22:26:28 +00001081 case X86::VMOVSDZrm:
Craig Topperacaba3b2018-03-12 16:43:11 +00001082 DecodeScalarMoveMask(2, nullptr == Src2Name, ShuffleMask);
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +00001083 DestName = getRegName(MI->getOperand(0).getReg());
1084 break;
Simon Pilgrimd5a15442015-11-21 13:04:42 +00001085
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +00001086 case X86::MOVSSrr:
1087 case X86::VMOVSSrr:
Simon Pilgrimf5c23ad2016-02-01 22:26:28 +00001088 case X86::VMOVSSZrr:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +00001089 Src2Name = getRegName(MI->getOperand(2).getReg());
1090 Src1Name = getRegName(MI->getOperand(1).getReg());
Justin Bognercd1d5aa2016-08-17 20:30:52 +00001091 LLVM_FALLTHROUGH;
1092
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +00001093 case X86::MOVSSrm:
1094 case X86::VMOVSSrm:
Simon Pilgrimf5c23ad2016-02-01 22:26:28 +00001095 case X86::VMOVSSZrm:
Craig Topperacaba3b2018-03-12 16:43:11 +00001096 DecodeScalarMoveMask(4, nullptr == Src2Name, ShuffleMask);
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +00001097 DestName = getRegName(MI->getOperand(0).getReg());
1098 break;
1099
1100 case X86::MOVPQI2QIrr:
Simon Pilgrim3e0c0222015-12-13 12:49:48 +00001101 case X86::MOVZPQILo2PQIrr:
1102 case X86::VMOVPQI2QIrr:
Craig Topperb76ed822018-03-10 06:05:13 +00001103 case X86::VMOVPQI2QIZrr:
Simon Pilgrim3e0c0222015-12-13 12:49:48 +00001104 case X86::VMOVZPQILo2PQIrr:
1105 case X86::VMOVZPQILo2PQIZrr:
1106 Src1Name = getRegName(MI->getOperand(1).getReg());
Justin Bognercd1d5aa2016-08-17 20:30:52 +00001107 LLVM_FALLTHROUGH;
1108
Simon Pilgrim3e0c0222015-12-13 12:49:48 +00001109 case X86::MOVQI2PQIrm:
Simon Pilgrim3e0c0222015-12-13 12:49:48 +00001110 case X86::VMOVQI2PQIrm:
Simon Pilgrim96fe4ef2016-02-02 13:32:56 +00001111 case X86::VMOVQI2PQIZrm:
Craig Topperacaba3b2018-03-12 16:43:11 +00001112 DecodeZeroMoveLowMask(2, ShuffleMask);
Simon Pilgrim3e0c0222015-12-13 12:49:48 +00001113 DestName = getRegName(MI->getOperand(0).getReg());
1114 break;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +00001115
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +00001116 case X86::MOVDI2PDIrm:
1117 case X86::VMOVDI2PDIrm:
Simon Pilgrim5be17b62016-02-01 23:04:05 +00001118 case X86::VMOVDI2PDIZrm:
Craig Topperacaba3b2018-03-12 16:43:11 +00001119 DecodeZeroMoveLowMask(4, ShuffleMask);
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +00001120 DestName = getRegName(MI->getOperand(0).getReg());
1121 break;
1122
Simon Pilgrimd85cae32015-07-06 20:46:41 +00001123 case X86::EXTRQI:
1124 if (MI->getOperand(2).isImm() &&
1125 MI->getOperand(3).isImm())
Craig Topperacaba3b2018-03-12 16:43:11 +00001126 DecodeEXTRQIMask(16, 8, MI->getOperand(2).getImm(),
1127 MI->getOperand(3).getImm(), ShuffleMask);
Simon Pilgrimd85cae32015-07-06 20:46:41 +00001128
1129 DestName = getRegName(MI->getOperand(0).getReg());
1130 Src1Name = getRegName(MI->getOperand(1).getReg());
1131 break;
1132
1133 case X86::INSERTQI:
1134 if (MI->getOperand(3).isImm() &&
1135 MI->getOperand(4).isImm())
Craig Topperacaba3b2018-03-12 16:43:11 +00001136 DecodeINSERTQIMask(16, 8, MI->getOperand(3).getImm(),
1137 MI->getOperand(4).getImm(), ShuffleMask);
Simon Pilgrimd85cae32015-07-06 20:46:41 +00001138
1139 DestName = getRegName(MI->getOperand(0).getReg());
1140 Src1Name = getRegName(MI->getOperand(1).getReg());
1141 Src2Name = getRegName(MI->getOperand(2).getReg());
1142 break;
1143
Simon Pilgrima76a8e52016-07-14 12:07:43 +00001144 case X86::VBROADCASTF128:
1145 case X86::VBROADCASTI128:
Craig Topperdde865a2016-10-15 16:26:07 +00001146 CASE_AVX512_INS_COMMON(BROADCASTF64X2, Z128, rm)
1147 CASE_AVX512_INS_COMMON(BROADCASTI64X2, Z128, rm)
Craig Topperacaba3b2018-03-12 16:43:11 +00001148 DecodeSubVectorBroadcast(4, 2, ShuffleMask);
Simon Pilgrima76a8e52016-07-14 12:07:43 +00001149 DestName = getRegName(MI->getOperand(0).getReg());
1150 break;
Craig Topperdde865a2016-10-15 16:26:07 +00001151 CASE_AVX512_INS_COMMON(BROADCASTF64X2, , rm)
1152 CASE_AVX512_INS_COMMON(BROADCASTI64X2, , rm)
Craig Topperacaba3b2018-03-12 16:43:11 +00001153 DecodeSubVectorBroadcast(8, 2, ShuffleMask);
Craig Topperdde865a2016-10-15 16:26:07 +00001154 DestName = getRegName(MI->getOperand(0).getReg());
1155 break;
1156 CASE_AVX512_INS_COMMON(BROADCASTF64X4, , rm)
1157 CASE_AVX512_INS_COMMON(BROADCASTI64X4, , rm)
Craig Topperacaba3b2018-03-12 16:43:11 +00001158 DecodeSubVectorBroadcast(8, 4, ShuffleMask);
Craig Topperdde865a2016-10-15 16:26:07 +00001159 DestName = getRegName(MI->getOperand(0).getReg());
1160 break;
1161 CASE_AVX512_INS_COMMON(BROADCASTF32X4, Z256, rm)
1162 CASE_AVX512_INS_COMMON(BROADCASTI32X4, Z256, rm)
Craig Topperacaba3b2018-03-12 16:43:11 +00001163 DecodeSubVectorBroadcast(8, 4, ShuffleMask);
Craig Topperdde865a2016-10-15 16:26:07 +00001164 DestName = getRegName(MI->getOperand(0).getReg());
1165 break;
1166 CASE_AVX512_INS_COMMON(BROADCASTF32X4, , rm)
1167 CASE_AVX512_INS_COMMON(BROADCASTI32X4, , rm)
Craig Topperacaba3b2018-03-12 16:43:11 +00001168 DecodeSubVectorBroadcast(16, 4, ShuffleMask);
Craig Topperdde865a2016-10-15 16:26:07 +00001169 DestName = getRegName(MI->getOperand(0).getReg());
1170 break;
1171 CASE_AVX512_INS_COMMON(BROADCASTF32X8, , rm)
1172 CASE_AVX512_INS_COMMON(BROADCASTI32X8, , rm)
Craig Topperacaba3b2018-03-12 16:43:11 +00001173 DecodeSubVectorBroadcast(16, 8, ShuffleMask);
Craig Topperdde865a2016-10-15 16:26:07 +00001174 DestName = getRegName(MI->getOperand(0).getReg());
1175 break;
Craig Topper6ce20bd2017-10-11 00:11:53 +00001176 CASE_AVX512_INS_COMMON(BROADCASTI32X2, Z128, r)
1177 Src1Name = getRegName(MI->getOperand(NumOperands - 1).getReg());
1178 LLVM_FALLTHROUGH;
1179 CASE_AVX512_INS_COMMON(BROADCASTI32X2, Z128, m)
Craig Topperacaba3b2018-03-12 16:43:11 +00001180 DecodeSubVectorBroadcast(4, 2, ShuffleMask);
Craig Topper6ce20bd2017-10-11 00:11:53 +00001181 DestName = getRegName(MI->getOperand(0).getReg());
1182 break;
Craig Topperdde865a2016-10-15 16:26:07 +00001183 CASE_AVX512_INS_COMMON(BROADCASTF32X2, Z256, r)
1184 CASE_AVX512_INS_COMMON(BROADCASTI32X2, Z256, r)
1185 Src1Name = getRegName(MI->getOperand(NumOperands - 1).getReg());
Galina Kistanovab2c01162017-05-31 19:41:33 +00001186 LLVM_FALLTHROUGH;
Craig Topperdde865a2016-10-15 16:26:07 +00001187 CASE_AVX512_INS_COMMON(BROADCASTF32X2, Z256, m)
1188 CASE_AVX512_INS_COMMON(BROADCASTI32X2, Z256, m)
Craig Topperacaba3b2018-03-12 16:43:11 +00001189 DecodeSubVectorBroadcast(8, 2, ShuffleMask);
Craig Topperdde865a2016-10-15 16:26:07 +00001190 DestName = getRegName(MI->getOperand(0).getReg());
1191 break;
1192 CASE_AVX512_INS_COMMON(BROADCASTF32X2, Z, r)
1193 CASE_AVX512_INS_COMMON(BROADCASTI32X2, Z, r)
1194 Src1Name = getRegName(MI->getOperand(NumOperands - 1).getReg());
Galina Kistanovab2c01162017-05-31 19:41:33 +00001195 LLVM_FALLTHROUGH;
Craig Topperdde865a2016-10-15 16:26:07 +00001196 CASE_AVX512_INS_COMMON(BROADCASTF32X2, Z, m)
1197 CASE_AVX512_INS_COMMON(BROADCASTI32X2, Z, m)
Craig Topperacaba3b2018-03-12 16:43:11 +00001198 DecodeSubVectorBroadcast(16, 2, ShuffleMask);
Craig Topperdde865a2016-10-15 16:26:07 +00001199 DestName = getRegName(MI->getOperand(0).getReg());
1200 break;
Simon Pilgrima76a8e52016-07-14 12:07:43 +00001201
Simon Pilgrim0acc32a2016-02-06 19:51:21 +00001202 CASE_PMOVZX(PMOVZXBW, r)
Craig Topperacaba3b2018-03-12 16:43:11 +00001203 Src1Name = getRegName(MI->getOperand(NumOperands - 1).getReg());
1204 LLVM_FALLTHROUGH;
1205 CASE_PMOVZX(PMOVZXBW, m)
1206 DecodeZeroExtendMask(8, 16, getRegOperandNumElts(MI, 16, 0), ShuffleMask);
1207 DestName = getRegName(MI->getOperand(0).getReg());
1208 break;
1209
Simon Pilgrim0acc32a2016-02-06 19:51:21 +00001210 CASE_PMOVZX(PMOVZXBD, r)
Craig Topperacaba3b2018-03-12 16:43:11 +00001211 Src1Name = getRegName(MI->getOperand(NumOperands - 1).getReg());
1212 LLVM_FALLTHROUGH;
1213 CASE_PMOVZX(PMOVZXBD, m)
1214 DecodeZeroExtendMask(8, 32, getRegOperandNumElts(MI, 32, 0), ShuffleMask);
1215 DestName = getRegName(MI->getOperand(0).getReg());
1216 break;
1217
Simon Pilgrim0acc32a2016-02-06 19:51:21 +00001218 CASE_PMOVZX(PMOVZXBQ, r)
Simon Pilgrim3016d9e2016-05-11 17:36:32 +00001219 Src1Name = getRegName(MI->getOperand(NumOperands - 1).getReg());
Justin Bognercd1d5aa2016-08-17 20:30:52 +00001220 LLVM_FALLTHROUGH;
Simon Pilgrim0acc32a2016-02-06 19:51:21 +00001221 CASE_PMOVZX(PMOVZXBQ, m)
Craig Topperacaba3b2018-03-12 16:43:11 +00001222 DecodeZeroExtendMask(8, 64, getRegOperandNumElts(MI, 64, 0), ShuffleMask);
Simon Pilgrime1b6db92016-02-06 16:33:42 +00001223 DestName = getRegName(MI->getOperand(0).getReg());
1224 break;
1225
Simon Pilgrim0acc32a2016-02-06 19:51:21 +00001226 CASE_PMOVZX(PMOVZXWD, r)
Craig Topperacaba3b2018-03-12 16:43:11 +00001227 Src1Name = getRegName(MI->getOperand(NumOperands - 1).getReg());
1228 LLVM_FALLTHROUGH;
1229 CASE_PMOVZX(PMOVZXWD, m)
1230 DecodeZeroExtendMask(16, 32, getRegOperandNumElts(MI, 32, 0), ShuffleMask);
1231 DestName = getRegName(MI->getOperand(0).getReg());
1232 break;
1233
Simon Pilgrim0acc32a2016-02-06 19:51:21 +00001234 CASE_PMOVZX(PMOVZXWQ, r)
Simon Pilgrim3016d9e2016-05-11 17:36:32 +00001235 Src1Name = getRegName(MI->getOperand(NumOperands - 1).getReg());
Justin Bognercd1d5aa2016-08-17 20:30:52 +00001236 LLVM_FALLTHROUGH;
Simon Pilgrim0acc32a2016-02-06 19:51:21 +00001237 CASE_PMOVZX(PMOVZXWQ, m)
Craig Topperacaba3b2018-03-12 16:43:11 +00001238 DecodeZeroExtendMask(16, 64, getRegOperandNumElts(MI, 64, 0), ShuffleMask);
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +00001239 DestName = getRegName(MI->getOperand(0).getReg());
Simon Pilgrime1b6db92016-02-06 16:33:42 +00001240 break;
1241
Simon Pilgrim0acc32a2016-02-06 19:51:21 +00001242 CASE_PMOVZX(PMOVZXDQ, r)
Simon Pilgrim3016d9e2016-05-11 17:36:32 +00001243 Src1Name = getRegName(MI->getOperand(NumOperands - 1).getReg());
Justin Bognercd1d5aa2016-08-17 20:30:52 +00001244 LLVM_FALLTHROUGH;
Simon Pilgrim0acc32a2016-02-06 19:51:21 +00001245 CASE_PMOVZX(PMOVZXDQ, m)
Craig Topperacaba3b2018-03-12 16:43:11 +00001246 DecodeZeroExtendMask(32, 64, getRegOperandNumElts(MI, 64, 0), ShuffleMask);
Simon Pilgrime1b6db92016-02-06 16:33:42 +00001247 DestName = getRegName(MI->getOperand(0).getReg());
1248 break;
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +00001249 }
1250
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())
1254 return false;
1255
1256 if (!DestName) DestName = Src1Name;
Craig Topper85b1da12017-10-11 00:46:09 +00001257 if (DestName) {
1258 OS << DestName;
Craig Toppera21758f2018-03-29 04:14:04 +00001259 printMasking(OS, MI, MCII);
Craig Topper85b1da12017-10-11 00:46:09 +00001260 } else
1261 OS << "mem";
1262
1263 OS << " = ";
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +00001264
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.
NAKAMURA Takumi5582a6a2015-05-25 01:43:34 +00001270 ShuffleMask[i] >= (int)e) // From second mask.
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +00001271 ShuffleMask[i] -= e;
1272 }
1273 }
1274
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
1277 // out.
1278 for (unsigned i = 0, e = ShuffleMask.size(); i != e; ++i) {
1279 if (i != 0)
1280 OS << ',';
1281 if (ShuffleMask[i] == SM_SentinelZero) {
1282 OS << "zero";
1283 continue;
1284 }
1285
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) {
1294 if (!IsFirst)
1295 OS << ',';
1296 else
1297 IsFirst = false;
1298 if (ShuffleMask[i] == SM_SentinelUndef)
1299 OS << "u";
1300 else
1301 OS << ShuffleMask[i] % ShuffleMask.size();
1302 ++i;
1303 }
1304 OS << ']';
NAKAMURA Takumi5582a6a2015-05-25 01:43:34 +00001305 --i; // For loop increments element #.
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +00001306 }
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +00001307
1308 // We successfully added a comment to this instruction.
1309 return true;
1310}