blob: 72117cd231dc9d19d9baf21b1bc69e22d6e1b085 [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 Topper9804c672018-03-10 03:12:00 +000016#include "MCTargetDesc/X86BaseInfo.h"
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +000017#include "MCTargetDesc/X86MCTargetDesc.h"
18#include "Utils/X86ShuffleDecode.h"
Chandler Carruth6bda14b2017-06-06 11:49:48 +000019#include "llvm/MC/MCInst.h"
Craig Topper9804c672018-03-10 03:12:00 +000020#include "llvm/MC/MCInstrInfo.h"
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +000021#include "llvm/Support/raw_ostream.h"
22
23using namespace llvm;
24
Simon Pilgrim41c05c02016-05-11 11:55:12 +000025#define CASE_SSE_INS_COMMON(Inst, src) \
Simon Pilgrimbfa5f232016-02-06 17:02:15 +000026 case X86::Inst##src:
27
Simon Pilgrim41c05c02016-05-11 11:55:12 +000028#define CASE_AVX_INS_COMMON(Inst, Suffix, src) \
Simon Pilgrimbfa5f232016-02-06 17:02:15 +000029 case X86::V##Inst##Suffix##src:
30
Simon Pilgrim41c05c02016-05-11 11:55:12 +000031#define CASE_MASK_INS_COMMON(Inst, Suffix, src) \
32 case X86::V##Inst##Suffix##src##k:
33
34#define CASE_MASKZ_INS_COMMON(Inst, Suffix, src) \
35 case X86::V##Inst##Suffix##src##kz:
36
37#define CASE_AVX512_INS_COMMON(Inst, Suffix, src) \
38 CASE_AVX_INS_COMMON(Inst, Suffix, src) \
39 CASE_MASK_INS_COMMON(Inst, Suffix, src) \
40 CASE_MASKZ_INS_COMMON(Inst, Suffix, src)
41
42#define CASE_MOVDUP(Inst, src) \
43 CASE_AVX512_INS_COMMON(Inst, Z, r##src) \
44 CASE_AVX512_INS_COMMON(Inst, Z256, r##src) \
45 CASE_AVX512_INS_COMMON(Inst, Z128, r##src) \
46 CASE_AVX_INS_COMMON(Inst, , r##src) \
47 CASE_AVX_INS_COMMON(Inst, Y, r##src) \
Simon Pilgrimbfa5f232016-02-06 17:02:15 +000048 CASE_SSE_INS_COMMON(Inst, r##src)
49
Simon Pilgrim7c2fbdc2016-07-03 13:08:29 +000050#define CASE_MASK_MOVDUP(Inst, src) \
51 CASE_MASK_INS_COMMON(Inst, Z, r##src) \
52 CASE_MASK_INS_COMMON(Inst, Z256, r##src) \
53 CASE_MASK_INS_COMMON(Inst, Z128, r##src)
54
55#define CASE_MASKZ_MOVDUP(Inst, src) \
56 CASE_MASKZ_INS_COMMON(Inst, Z, r##src) \
57 CASE_MASKZ_INS_COMMON(Inst, Z256, r##src) \
58 CASE_MASKZ_INS_COMMON(Inst, Z128, r##src)
59
Simon Pilgrim41c05c02016-05-11 11:55:12 +000060#define CASE_PMOVZX(Inst, src) \
61 CASE_AVX512_INS_COMMON(Inst, Z, r##src) \
62 CASE_AVX512_INS_COMMON(Inst, Z256, r##src) \
63 CASE_AVX512_INS_COMMON(Inst, Z128, r##src) \
64 CASE_AVX_INS_COMMON(Inst, , r##src) \
65 CASE_AVX_INS_COMMON(Inst, Y, r##src) \
Simon Pilgrim0acc32a2016-02-06 19:51:21 +000066 CASE_SSE_INS_COMMON(Inst, r##src)
67
Simon Pilgrim68f438a2016-07-03 13:33:28 +000068#define CASE_MASK_PMOVZX(Inst, src) \
69 CASE_MASK_INS_COMMON(Inst, Z, r##src) \
70 CASE_MASK_INS_COMMON(Inst, Z256, r##src) \
71 CASE_MASK_INS_COMMON(Inst, Z128, r##src)
72
73#define CASE_MASKZ_PMOVZX(Inst, src) \
74 CASE_MASKZ_INS_COMMON(Inst, Z, r##src) \
75 CASE_MASKZ_INS_COMMON(Inst, Z256, r##src) \
76 CASE_MASKZ_INS_COMMON(Inst, Z128, r##src)
77
Simon Pilgrim41c05c02016-05-11 11:55:12 +000078#define CASE_UNPCK(Inst, src) \
79 CASE_AVX512_INS_COMMON(Inst, Z, r##src) \
80 CASE_AVX512_INS_COMMON(Inst, Z256, r##src) \
81 CASE_AVX512_INS_COMMON(Inst, Z128, r##src) \
82 CASE_AVX_INS_COMMON(Inst, , r##src) \
83 CASE_AVX_INS_COMMON(Inst, Y, r##src) \
Simon Pilgrimbfa5f232016-02-06 17:02:15 +000084 CASE_SSE_INS_COMMON(Inst, r##src)
85
Simon Pilgrim598bdb62016-07-03 14:26:21 +000086#define CASE_MASK_UNPCK(Inst, src) \
87 CASE_MASK_INS_COMMON(Inst, Z, r##src) \
88 CASE_MASK_INS_COMMON(Inst, Z256, r##src) \
89 CASE_MASK_INS_COMMON(Inst, Z128, r##src)
90
91#define CASE_MASKZ_UNPCK(Inst, src) \
92 CASE_MASKZ_INS_COMMON(Inst, Z, r##src) \
93 CASE_MASKZ_INS_COMMON(Inst, Z256, r##src) \
94 CASE_MASKZ_INS_COMMON(Inst, Z128, r##src)
95
96#define CASE_SHUF(Inst, suf) \
Craig Topper01f53b12016-06-03 05:31:00 +000097 CASE_AVX512_INS_COMMON(Inst, Z, suf) \
98 CASE_AVX512_INS_COMMON(Inst, Z256, suf) \
99 CASE_AVX512_INS_COMMON(Inst, Z128, suf) \
100 CASE_AVX_INS_COMMON(Inst, , suf) \
101 CASE_AVX_INS_COMMON(Inst, Y, suf) \
102 CASE_SSE_INS_COMMON(Inst, suf)
Simon Pilgrimbfa5f232016-02-06 17:02:15 +0000103
Simon Pilgrim1f590762016-07-03 13:55:41 +0000104#define CASE_MASK_SHUF(Inst, src) \
105 CASE_MASK_INS_COMMON(Inst, Z, r##src##i) \
106 CASE_MASK_INS_COMMON(Inst, Z256, r##src##i) \
107 CASE_MASK_INS_COMMON(Inst, Z128, r##src##i)
108
109#define CASE_MASKZ_SHUF(Inst, src) \
110 CASE_MASKZ_INS_COMMON(Inst, Z, r##src##i) \
111 CASE_MASKZ_INS_COMMON(Inst, Z256, r##src##i) \
112 CASE_MASKZ_INS_COMMON(Inst, Z128, r##src##i)
113
Simon Pilgrim5080e7f2016-07-03 18:02:43 +0000114#define CASE_VPERMILPI(Inst, src) \
Simon Pilgrim41c05c02016-05-11 11:55:12 +0000115 CASE_AVX512_INS_COMMON(Inst, Z, src##i) \
116 CASE_AVX512_INS_COMMON(Inst, Z256, src##i) \
117 CASE_AVX512_INS_COMMON(Inst, Z128, src##i) \
118 CASE_AVX_INS_COMMON(Inst, , src##i) \
Simon Pilgrimbfa5f232016-02-06 17:02:15 +0000119 CASE_AVX_INS_COMMON(Inst, Y, src##i)
120
Simon Pilgrim5080e7f2016-07-03 18:02:43 +0000121#define CASE_MASK_VPERMILPI(Inst, src) \
Simon Pilgrim1f590762016-07-03 13:55:41 +0000122 CASE_MASK_INS_COMMON(Inst, Z, src##i) \
123 CASE_MASK_INS_COMMON(Inst, Z256, src##i) \
124 CASE_MASK_INS_COMMON(Inst, Z128, src##i)
125
Simon Pilgrim5080e7f2016-07-03 18:02:43 +0000126#define CASE_MASKZ_VPERMILPI(Inst, src) \
Simon Pilgrim1f590762016-07-03 13:55:41 +0000127 CASE_MASKZ_INS_COMMON(Inst, Z, src##i) \
128 CASE_MASKZ_INS_COMMON(Inst, Z256, src##i) \
129 CASE_MASKZ_INS_COMMON(Inst, Z128, src##i)
130
Simon Pilgrima0d73832016-07-03 18:27:37 +0000131#define CASE_VPERM(Inst, src) \
132 CASE_AVX512_INS_COMMON(Inst, Z, src##i) \
133 CASE_AVX512_INS_COMMON(Inst, Z256, src##i) \
134 CASE_AVX_INS_COMMON(Inst, Y, src##i)
135
Simon Pilgrim68ea8062016-07-03 18:40:24 +0000136#define CASE_MASK_VPERM(Inst, src) \
137 CASE_MASK_INS_COMMON(Inst, Z, src##i) \
138 CASE_MASK_INS_COMMON(Inst, Z256, src##i)
139
140#define CASE_MASKZ_VPERM(Inst, src) \
141 CASE_MASKZ_INS_COMMON(Inst, Z, src##i) \
142 CASE_MASKZ_INS_COMMON(Inst, Z256, src##i)
143
Simon Pilgrimbfa5f232016-02-06 17:02:15 +0000144#define CASE_VSHUF(Inst, src) \
Simon Pilgrim41c05c02016-05-11 11:55:12 +0000145 CASE_AVX512_INS_COMMON(SHUFF##Inst, Z, r##src##i) \
146 CASE_AVX512_INS_COMMON(SHUFI##Inst, Z, r##src##i) \
147 CASE_AVX512_INS_COMMON(SHUFF##Inst, Z256, r##src##i) \
148 CASE_AVX512_INS_COMMON(SHUFI##Inst, Z256, r##src##i)
Simon Pilgrimbfa5f232016-02-06 17:02:15 +0000149
Simon Pilgrim1f590762016-07-03 13:55:41 +0000150#define CASE_MASK_VSHUF(Inst, src) \
151 CASE_MASK_INS_COMMON(SHUFF##Inst, Z, r##src##i) \
152 CASE_MASK_INS_COMMON(SHUFI##Inst, Z, r##src##i) \
153 CASE_MASK_INS_COMMON(SHUFF##Inst, Z256, r##src##i) \
154 CASE_MASK_INS_COMMON(SHUFI##Inst, Z256, r##src##i)
155
156#define CASE_MASKZ_VSHUF(Inst, src) \
157 CASE_MASKZ_INS_COMMON(SHUFF##Inst, Z, r##src##i) \
158 CASE_MASKZ_INS_COMMON(SHUFI##Inst, Z, r##src##i) \
159 CASE_MASKZ_INS_COMMON(SHUFF##Inst, Z256, r##src##i) \
160 CASE_MASKZ_INS_COMMON(SHUFI##Inst, Z256, r##src##i)
161
Craig Topperd88204f2018-03-10 21:30:46 +0000162#define CASE_AVX512_FMA(Inst, suf) \
163 CASE_AVX512_INS_COMMON(Inst, Z, suf) \
164 CASE_AVX512_INS_COMMON(Inst, Z256, suf) \
165 CASE_AVX512_INS_COMMON(Inst, Z128, suf)
166
167#define CASE_FMA(Inst, suf) \
168 CASE_AVX512_FMA(Inst, suf) \
169 CASE_AVX_INS_COMMON(Inst, , suf) \
170 CASE_AVX_INS_COMMON(Inst, Y, suf)
171
172#define CASE_FMA_PACKED_REG(Inst) \
173 CASE_FMA(Inst##PD, r) \
174 CASE_FMA(Inst##PS, r)
175
176#define CASE_FMA_PACKED_MEM(Inst) \
177 CASE_FMA(Inst##PD, m) \
178 CASE_FMA(Inst##PS, m) \
179 CASE_AVX512_FMA(Inst##PD, mb) \
180 CASE_AVX512_FMA(Inst##PS, mb)
181
182#define CASE_FMA_SCALAR_REG(Inst) \
183 CASE_AVX_INS_COMMON(Inst##SD, , r) \
184 CASE_AVX_INS_COMMON(Inst##SS, , r) \
185 CASE_AVX_INS_COMMON(Inst##SD, , r_Int) \
186 CASE_AVX_INS_COMMON(Inst##SS, , r_Int) \
187 CASE_AVX_INS_COMMON(Inst##SD, Z, r) \
188 CASE_AVX_INS_COMMON(Inst##SS, Z, r) \
189 CASE_AVX512_INS_COMMON(Inst##SD, Z, r_Int) \
190 CASE_AVX512_INS_COMMON(Inst##SS, Z, r_Int)
191
192#define CASE_FMA_SCALAR_MEM(Inst) \
193 CASE_AVX_INS_COMMON(Inst##SD, , m) \
194 CASE_AVX_INS_COMMON(Inst##SS, , m) \
195 CASE_AVX_INS_COMMON(Inst##SD, , m_Int) \
196 CASE_AVX_INS_COMMON(Inst##SS, , m_Int) \
197 CASE_AVX_INS_COMMON(Inst##SD, Z, m) \
198 CASE_AVX_INS_COMMON(Inst##SS, Z, m) \
199 CASE_AVX512_INS_COMMON(Inst##SD, Z, m_Int) \
200 CASE_AVX512_INS_COMMON(Inst##SS, Z, m_Int)
201
Igor Breger24cab0f2015-11-16 07:22:00 +0000202static unsigned getVectorRegSize(unsigned RegNo) {
Igor Breger24cab0f2015-11-16 07:22:00 +0000203 if (X86::ZMM0 <= RegNo && RegNo <= X86::ZMM31)
204 return 512;
205 if (X86::YMM0 <= RegNo && RegNo <= X86::YMM31)
206 return 256;
207 if (X86::XMM0 <= RegNo && RegNo <= X86::XMM31)
208 return 128;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000209 if (X86::MM0 <= RegNo && RegNo <= X86::MM7)
210 return 64;
Igor Breger24cab0f2015-11-16 07:22:00 +0000211
212 llvm_unreachable("Unknown vector reg!");
Igor Breger24cab0f2015-11-16 07:22:00 +0000213}
214
Craig Topperacaba3b2018-03-12 16:43:11 +0000215static unsigned getRegOperandNumElts(const MCInst *MI, unsigned ScalarSize,
216 unsigned OperandIndex) {
Igor Breger24cab0f2015-11-16 07:22:00 +0000217 unsigned OpReg = MI->getOperand(OperandIndex).getReg();
Craig Topperacaba3b2018-03-12 16:43:11 +0000218 return getVectorRegSize(OpReg) / ScalarSize;
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000219}
220
Simon Pilgrim7c2fbdc2016-07-03 13:08:29 +0000221/// Wraps the destination register name with AVX512 mask/maskz filtering.
Craig Topper85b1da12017-10-11 00:46:09 +0000222static void printMasking(raw_ostream &OS, const MCInst *MI,
Craig Topper9804c672018-03-10 03:12:00 +0000223 const MCInstrInfo &MCII,
Craig Topper85b1da12017-10-11 00:46:09 +0000224 const char *(*getRegName)(unsigned)) {
Craig Topper9804c672018-03-10 03:12:00 +0000225 const MCInstrDesc &Desc = MCII.get(MI->getOpcode());
226 uint64_t TSFlags = Desc.TSFlags;
Simon Pilgrim7c2fbdc2016-07-03 13:08:29 +0000227
Craig Topper9804c672018-03-10 03:12:00 +0000228 if (!(TSFlags & X86II::EVEX_K))
Craig Topper85b1da12017-10-11 00:46:09 +0000229 return;
Craig Topper9804c672018-03-10 03:12:00 +0000230
231 bool MaskWithZero = (TSFlags & X86II::EVEX_Z);
232 unsigned MaskOp = Desc.getNumDefs();
233
234 if (Desc.getOperandConstraint(MaskOp, MCOI::TIED_TO) != -1)
235 ++MaskOp;
236
237 const char *MaskRegName = getRegName(MI->getOperand(MaskOp).getReg());
Simon Pilgrim7c2fbdc2016-07-03 13:08:29 +0000238
239 // MASK: zmmX {%kY}
Craig Topper85b1da12017-10-11 00:46:09 +0000240 OS << " {%" << MaskRegName << "}";
Simon Pilgrim7c2fbdc2016-07-03 13:08:29 +0000241
242 // MASKZ: zmmX {%kY} {z}
243 if (MaskWithZero)
Craig Topper85b1da12017-10-11 00:46:09 +0000244 OS << " {z}";
Simon Pilgrim7c2fbdc2016-07-03 13:08:29 +0000245}
246
Craig Topperd88204f2018-03-10 21:30:46 +0000247static bool printFMA3Comments(const MCInst *MI, raw_ostream &OS,
248 const char *(*getRegName)(unsigned)) {
249 const char *Mul1Name = nullptr, *Mul2Name = nullptr, *AccName = nullptr;
250 unsigned NumOperands = MI->getNumOperands();
251 bool RegForm = false;
252 bool Negate = false;
253 StringRef AccStr = "+";
254
255 // The operands for FMA instructions without rounding fall into two forms.
256 // dest, src1, src2, src3
257 // dest, src1, mask, src2, src3
258 // Where src3 is either a register or 5 memory address operands. So to find
259 // dest and src1 we can index from the front. To find src2 and src3 we can
260 // index from the end by taking into account memory vs register form when
261 // finding src2.
262
263 switch (MI->getOpcode()) {
264 default:
265 return false;
266 CASE_FMA_PACKED_REG(FMADD132)
267 CASE_FMA_SCALAR_REG(FMADD132)
268 Mul2Name = getRegName(MI->getOperand(NumOperands - 1).getReg());
269 RegForm = true;
270 LLVM_FALLTHROUGH;
271 CASE_FMA_PACKED_MEM(FMADD132)
272 CASE_FMA_SCALAR_MEM(FMADD132)
273 AccName = getRegName(MI->getOperand(NumOperands-(RegForm?2:6)).getReg());
274 Mul1Name = getRegName(MI->getOperand(1).getReg());
275 break;
276
277 CASE_FMA_PACKED_REG(FMADD213)
278 CASE_FMA_SCALAR_REG(FMADD213)
279 AccName = getRegName(MI->getOperand(NumOperands - 1).getReg());
280 RegForm = true;
281 LLVM_FALLTHROUGH;
282 CASE_FMA_PACKED_MEM(FMADD213)
283 CASE_FMA_SCALAR_MEM(FMADD213)
284 Mul1Name = getRegName(MI->getOperand(NumOperands-(RegForm?2:6)).getReg());
285 Mul2Name = getRegName(MI->getOperand(1).getReg());
286 break;
287
288 CASE_FMA_PACKED_REG(FMADD231)
289 CASE_FMA_SCALAR_REG(FMADD231)
290 Mul2Name = getRegName(MI->getOperand(NumOperands - 1).getReg());
291 RegForm = true;
292 LLVM_FALLTHROUGH;
293 CASE_FMA_PACKED_MEM(FMADD231)
294 CASE_FMA_SCALAR_MEM(FMADD231)
295 Mul1Name = getRegName(MI->getOperand(NumOperands-(RegForm?2:6)).getReg());
296 AccName = getRegName(MI->getOperand(1).getReg());
297 break;
298
299 CASE_FMA_PACKED_REG(FMSUB132)
300 CASE_FMA_SCALAR_REG(FMSUB132)
301 Mul2Name = getRegName(MI->getOperand(NumOperands - 1).getReg());
302 RegForm = true;
303 LLVM_FALLTHROUGH;
304 CASE_FMA_PACKED_MEM(FMSUB132)
305 CASE_FMA_SCALAR_MEM(FMSUB132)
306 AccName = getRegName(MI->getOperand(NumOperands-(RegForm?2:6)).getReg());
307 Mul1Name = getRegName(MI->getOperand(1).getReg());
308 AccStr = "-";
309 break;
310
311 CASE_FMA_PACKED_REG(FMSUB213)
312 CASE_FMA_SCALAR_REG(FMSUB213)
313 AccName = getRegName(MI->getOperand(NumOperands - 1).getReg());
314 RegForm = true;
315 LLVM_FALLTHROUGH;
316 CASE_FMA_PACKED_MEM(FMSUB213)
317 CASE_FMA_SCALAR_MEM(FMSUB213)
318 Mul1Name = getRegName(MI->getOperand(NumOperands-(RegForm?2:6)).getReg());
319 Mul2Name = getRegName(MI->getOperand(1).getReg());
320 AccStr = "-";
321 break;
322
323 CASE_FMA_PACKED_REG(FMSUB231)
324 CASE_FMA_SCALAR_REG(FMSUB231)
325 Mul2Name = getRegName(MI->getOperand(NumOperands - 1).getReg());
326 RegForm = true;
327 LLVM_FALLTHROUGH;
328 CASE_FMA_PACKED_MEM(FMSUB231)
329 CASE_FMA_SCALAR_MEM(FMSUB231)
330 Mul1Name = getRegName(MI->getOperand(NumOperands-(RegForm?2:6)).getReg());
331 AccName = getRegName(MI->getOperand(1).getReg());
332 AccStr = "-";
333 break;
334
335 CASE_FMA_PACKED_REG(FNMADD132)
336 CASE_FMA_SCALAR_REG(FNMADD132)
337 Mul2Name = getRegName(MI->getOperand(NumOperands - 1).getReg());
338 RegForm = true;
339 LLVM_FALLTHROUGH;
340 CASE_FMA_PACKED_MEM(FNMADD132)
341 CASE_FMA_SCALAR_MEM(FNMADD132)
342 AccName = getRegName(MI->getOperand(NumOperands-(RegForm?2:6)).getReg());
343 Mul1Name = getRegName(MI->getOperand(1).getReg());
344 Negate = true;
345 break;
346
347 CASE_FMA_PACKED_REG(FNMADD213)
348 CASE_FMA_SCALAR_REG(FNMADD213)
349 AccName = getRegName(MI->getOperand(NumOperands - 1).getReg());
350 RegForm = true;
351 LLVM_FALLTHROUGH;
352 CASE_FMA_PACKED_MEM(FNMADD213)
353 CASE_FMA_SCALAR_MEM(FNMADD213)
354 Mul1Name = getRegName(MI->getOperand(NumOperands-(RegForm?2:6)).getReg());
355 Mul2Name = getRegName(MI->getOperand(1).getReg());
356 Negate = true;
357 break;
358
359 CASE_FMA_PACKED_REG(FNMADD231)
360 CASE_FMA_SCALAR_REG(FNMADD231)
361 Mul2Name = getRegName(MI->getOperand(NumOperands - 1).getReg());
362 RegForm = true;
363 LLVM_FALLTHROUGH;
364 CASE_FMA_PACKED_MEM(FNMADD231)
365 CASE_FMA_SCALAR_MEM(FNMADD231)
366 Mul1Name = getRegName(MI->getOperand(NumOperands-(RegForm?2:6)).getReg());
367 AccName = getRegName(MI->getOperand(1).getReg());
368 Negate = true;
369 break;
370
371 CASE_FMA_PACKED_REG(FNMSUB132)
372 CASE_FMA_SCALAR_REG(FNMSUB132)
373 Mul2Name = getRegName(MI->getOperand(NumOperands - 1).getReg());
374 RegForm = true;
375 LLVM_FALLTHROUGH;
376 CASE_FMA_PACKED_MEM(FNMSUB132)
377 CASE_FMA_SCALAR_MEM(FNMSUB132)
378 AccName = getRegName(MI->getOperand(NumOperands-(RegForm?2:6)).getReg());
379 Mul1Name = getRegName(MI->getOperand(1).getReg());
380 AccStr = "-";
381 Negate = true;
382 break;
383
384 CASE_FMA_PACKED_REG(FNMSUB213)
385 CASE_FMA_SCALAR_REG(FNMSUB213)
386 AccName = getRegName(MI->getOperand(NumOperands - 1).getReg());
387 RegForm = true;
388 LLVM_FALLTHROUGH;
389 CASE_FMA_PACKED_MEM(FNMSUB213)
390 CASE_FMA_SCALAR_MEM(FNMSUB213)
391 Mul1Name = getRegName(MI->getOperand(NumOperands-(RegForm?2:6)).getReg());
392 Mul2Name = getRegName(MI->getOperand(1).getReg());
393 AccStr = "-";
394 Negate = true;
395 break;
396
397 CASE_FMA_PACKED_REG(FNMSUB231)
398 CASE_FMA_SCALAR_REG(FNMSUB231)
399 Mul2Name = getRegName(MI->getOperand(NumOperands - 1).getReg());
400 RegForm = true;
401 LLVM_FALLTHROUGH;
402 CASE_FMA_PACKED_MEM(FNMSUB231)
403 CASE_FMA_SCALAR_MEM(FNMSUB231)
404 Mul1Name = getRegName(MI->getOperand(NumOperands-(RegForm?2:6)).getReg());
405 AccName = getRegName(MI->getOperand(1).getReg());
406 AccStr = "-";
407 Negate = true;
408 break;
409
410 CASE_FMA_PACKED_REG(FMADDSUB132)
411 Mul2Name = getRegName(MI->getOperand(NumOperands - 1).getReg());
412 RegForm = true;
413 LLVM_FALLTHROUGH;
414 CASE_FMA_PACKED_MEM(FMADDSUB132)
415 AccName = getRegName(MI->getOperand(NumOperands-(RegForm?2:6)).getReg());
416 Mul1Name = getRegName(MI->getOperand(1).getReg());
417 AccStr = "+/-";
418 break;
419
420 CASE_FMA_PACKED_REG(FMADDSUB213)
421 AccName = getRegName(MI->getOperand(NumOperands - 1).getReg());
422 RegForm = true;
423 LLVM_FALLTHROUGH;
424 CASE_FMA_PACKED_MEM(FMADDSUB213)
425 Mul1Name = getRegName(MI->getOperand(NumOperands-(RegForm?2:6)).getReg());
426 Mul2Name = getRegName(MI->getOperand(1).getReg());
427 AccStr = "+/-";
428 break;
429
430 CASE_FMA_PACKED_REG(FMADDSUB231)
431 Mul2Name = getRegName(MI->getOperand(NumOperands - 1).getReg());
432 RegForm = true;
433 LLVM_FALLTHROUGH;
434 CASE_FMA_PACKED_MEM(FMADDSUB231)
435 Mul1Name = getRegName(MI->getOperand(NumOperands-(RegForm?2:6)).getReg());
436 AccName = getRegName(MI->getOperand(1).getReg());
437 AccStr = "+/-";
438 break;
439
440 CASE_FMA_PACKED_REG(FMSUBADD132)
441 Mul2Name = getRegName(MI->getOperand(NumOperands - 1).getReg());
442 RegForm = true;
443 LLVM_FALLTHROUGH;
444 CASE_FMA_PACKED_MEM(FMSUBADD132)
445 AccName = getRegName(MI->getOperand(NumOperands-(RegForm?2:6)).getReg());
446 Mul1Name = getRegName(MI->getOperand(1).getReg());
447 AccStr = "-/+";
448 break;
449
450 CASE_FMA_PACKED_REG(FMSUBADD213)
451 AccName = getRegName(MI->getOperand(NumOperands - 1).getReg());
452 RegForm = true;
453 LLVM_FALLTHROUGH;
454 CASE_FMA_PACKED_MEM(FMSUBADD213)
455 Mul1Name = getRegName(MI->getOperand(NumOperands-(RegForm?2:6)).getReg());
456 Mul2Name = getRegName(MI->getOperand(1).getReg());
457 AccStr = "-/+";
458 break;
459
460 CASE_FMA_PACKED_REG(FMSUBADD231)
461 Mul2Name = getRegName(MI->getOperand(NumOperands - 1).getReg());
462 RegForm = true;
463 LLVM_FALLTHROUGH;
464 CASE_FMA_PACKED_MEM(FMSUBADD231)
465 Mul1Name = getRegName(MI->getOperand(NumOperands-(RegForm?2:6)).getReg());
466 AccName = getRegName(MI->getOperand(1).getReg());
467 AccStr = "-/+";
468 break;
469 }
470
471 const char *DestName = getRegName(MI->getOperand(0).getReg());
472
473 if (!Mul1Name) Mul1Name = "mem";
474 if (!Mul2Name) Mul2Name = "mem";
475 if (!AccName) AccName = "mem";
476
477 OS << DestName << " = ";
478 // TODO: Print masking information?
479
480 if (Negate)
481 OS << '-';
482
483 OS << '(' << Mul1Name << " * " << Mul2Name << ") " << AccStr << ' '
484 << AccName;
485
486 return true;
487}
488
489
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000490//===----------------------------------------------------------------------===//
491// Top Level Entrypoint
492//===----------------------------------------------------------------------===//
493
494/// EmitAnyX86InstComments - This function decodes x86 instructions and prints
495/// newline terminated strings to the specified string if desired. This
496/// information is shown in disassembly dumps when verbose assembly is enabled.
497bool llvm::EmitAnyX86InstComments(const MCInst *MI, raw_ostream &OS,
Craig Topper9804c672018-03-10 03:12:00 +0000498 const MCInstrInfo &MCII,
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000499 const char *(*getRegName)(unsigned)) {
500 // If this is a shuffle operation, the switch should fill in this state.
501 SmallVector<int, 8> ShuffleMask;
502 const char *DestName = nullptr, *Src1Name = nullptr, *Src2Name = nullptr;
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000503 unsigned NumOperands = MI->getNumOperands();
Craig Topper89c17612016-06-10 04:48:05 +0000504 bool RegForm = false;
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000505
Craig Topperd88204f2018-03-10 21:30:46 +0000506 if (printFMA3Comments(MI, OS, getRegName))
507 return true;
508
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000509 switch (MI->getOpcode()) {
510 default:
511 // Not an instruction for which we can decode comments.
512 return false;
513
514 case X86::BLENDPDrri:
515 case X86::VBLENDPDrri:
Simon Pilgrim13d3a202015-11-16 23:03:18 +0000516 case X86::VBLENDPDYrri:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000517 Src2Name = getRegName(MI->getOperand(2).getReg());
Justin Bognercd1d5aa2016-08-17 20:30:52 +0000518 LLVM_FALLTHROUGH;
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000519 case X86::BLENDPDrmi:
520 case X86::VBLENDPDrmi:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000521 case X86::VBLENDPDYrmi:
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000522 if (MI->getOperand(NumOperands - 1).isImm())
Craig Topperacaba3b2018-03-12 16:43:11 +0000523 DecodeBLENDMask(getRegOperandNumElts(MI, 64, 0),
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000524 MI->getOperand(NumOperands - 1).getImm(),
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000525 ShuffleMask);
526 Src1Name = getRegName(MI->getOperand(1).getReg());
527 DestName = getRegName(MI->getOperand(0).getReg());
528 break;
529
530 case X86::BLENDPSrri:
531 case X86::VBLENDPSrri:
Simon Pilgrim13d3a202015-11-16 23:03:18 +0000532 case X86::VBLENDPSYrri:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000533 Src2Name = getRegName(MI->getOperand(2).getReg());
Justin Bognercd1d5aa2016-08-17 20:30:52 +0000534 LLVM_FALLTHROUGH;
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000535 case X86::BLENDPSrmi:
536 case X86::VBLENDPSrmi:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000537 case X86::VBLENDPSYrmi:
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000538 if (MI->getOperand(NumOperands - 1).isImm())
Craig Topperacaba3b2018-03-12 16:43:11 +0000539 DecodeBLENDMask(getRegOperandNumElts(MI, 32, 0),
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000540 MI->getOperand(NumOperands - 1).getImm(),
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000541 ShuffleMask);
542 Src1Name = getRegName(MI->getOperand(1).getReg());
543 DestName = getRegName(MI->getOperand(0).getReg());
544 break;
545
546 case X86::PBLENDWrri:
547 case X86::VPBLENDWrri:
Simon Pilgrim13d3a202015-11-16 23:03:18 +0000548 case X86::VPBLENDWYrri:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000549 Src2Name = getRegName(MI->getOperand(2).getReg());
Justin Bognercd1d5aa2016-08-17 20:30:52 +0000550 LLVM_FALLTHROUGH;
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000551 case X86::PBLENDWrmi:
552 case X86::VPBLENDWrmi:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000553 case X86::VPBLENDWYrmi:
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000554 if (MI->getOperand(NumOperands - 1).isImm())
Craig Topperacaba3b2018-03-12 16:43:11 +0000555 DecodeBLENDMask(getRegOperandNumElts(MI, 16, 0),
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000556 MI->getOperand(NumOperands - 1).getImm(),
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000557 ShuffleMask);
558 Src1Name = getRegName(MI->getOperand(1).getReg());
559 DestName = getRegName(MI->getOperand(0).getReg());
560 break;
561
562 case X86::VPBLENDDrri:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000563 case X86::VPBLENDDYrri:
564 Src2Name = getRegName(MI->getOperand(2).getReg());
Justin Bognercd1d5aa2016-08-17 20:30:52 +0000565 LLVM_FALLTHROUGH;
Simon Pilgrim13d3a202015-11-16 23:03:18 +0000566 case X86::VPBLENDDrmi:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000567 case X86::VPBLENDDYrmi:
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000568 if (MI->getOperand(NumOperands - 1).isImm())
Craig Topperacaba3b2018-03-12 16:43:11 +0000569 DecodeBLENDMask(getRegOperandNumElts(MI, 32, 0),
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000570 MI->getOperand(NumOperands - 1).getImm(),
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000571 ShuffleMask);
572 Src1Name = getRegName(MI->getOperand(1).getReg());
573 DestName = getRegName(MI->getOperand(0).getReg());
574 break;
575
576 case X86::INSERTPSrr:
577 case X86::VINSERTPSrr:
Craig Topper6189d3e2016-07-19 01:26:19 +0000578 case X86::VINSERTPSZrr:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000579 Src2Name = getRegName(MI->getOperand(2).getReg());
Justin Bognercd1d5aa2016-08-17 20:30:52 +0000580 LLVM_FALLTHROUGH;
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000581 case X86::INSERTPSrm:
582 case X86::VINSERTPSrm:
Craig Topper6189d3e2016-07-19 01:26:19 +0000583 case X86::VINSERTPSZrm:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000584 DestName = getRegName(MI->getOperand(0).getReg());
585 Src1Name = getRegName(MI->getOperand(1).getReg());
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000586 if (MI->getOperand(NumOperands - 1).isImm())
587 DecodeINSERTPSMask(MI->getOperand(NumOperands - 1).getImm(),
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000588 ShuffleMask);
589 break;
590
591 case X86::MOVLHPSrr:
592 case X86::VMOVLHPSrr:
Simon Pilgrimd5a15442015-11-21 13:04:42 +0000593 case X86::VMOVLHPSZrr:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000594 Src2Name = getRegName(MI->getOperand(2).getReg());
595 Src1Name = getRegName(MI->getOperand(1).getReg());
596 DestName = getRegName(MI->getOperand(0).getReg());
597 DecodeMOVLHPSMask(2, ShuffleMask);
598 break;
599
600 case X86::MOVHLPSrr:
601 case X86::VMOVHLPSrr:
Simon Pilgrimd5a15442015-11-21 13:04:42 +0000602 case X86::VMOVHLPSZrr:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000603 Src2Name = getRegName(MI->getOperand(2).getReg());
604 Src1Name = getRegName(MI->getOperand(1).getReg());
605 DestName = getRegName(MI->getOperand(0).getReg());
606 DecodeMOVHLPSMask(2, ShuffleMask);
607 break;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000608
Simon Pilgrima3d67442016-02-07 15:39:22 +0000609 case X86::MOVHPDrm:
610 case X86::VMOVHPDrm:
611 case X86::VMOVHPDZ128rm:
612 Src1Name = getRegName(MI->getOperand(1).getReg());
613 DestName = getRegName(MI->getOperand(0).getReg());
Craig Topperacaba3b2018-03-12 16:43:11 +0000614 DecodeInsertElementMask(2, 1, 1, ShuffleMask);
Simon Pilgrima3d67442016-02-07 15:39:22 +0000615 break;
616
617 case X86::MOVHPSrm:
618 case X86::VMOVHPSrm:
619 case X86::VMOVHPSZ128rm:
620 Src1Name = getRegName(MI->getOperand(1).getReg());
621 DestName = getRegName(MI->getOperand(0).getReg());
Craig Topperacaba3b2018-03-12 16:43:11 +0000622 DecodeInsertElementMask(4, 2, 2, ShuffleMask);
Simon Pilgrima3d67442016-02-07 15:39:22 +0000623 break;
624
625 case X86::MOVLPDrm:
626 case X86::VMOVLPDrm:
627 case X86::VMOVLPDZ128rm:
628 Src1Name = getRegName(MI->getOperand(1).getReg());
629 DestName = getRegName(MI->getOperand(0).getReg());
Craig Topperacaba3b2018-03-12 16:43:11 +0000630 DecodeInsertElementMask(2, 0, 1, ShuffleMask);
Simon Pilgrima3d67442016-02-07 15:39:22 +0000631 break;
632
633 case X86::MOVLPSrm:
634 case X86::VMOVLPSrm:
635 case X86::VMOVLPSZ128rm:
636 Src1Name = getRegName(MI->getOperand(1).getReg());
637 DestName = getRegName(MI->getOperand(0).getReg());
Craig Topperacaba3b2018-03-12 16:43:11 +0000638 DecodeInsertElementMask(4, 0, 2, ShuffleMask);
Simon Pilgrima3d67442016-02-07 15:39:22 +0000639 break;
640
Igor Breger24cab0f2015-11-16 07:22:00 +0000641 CASE_MOVDUP(MOVSLDUP, r)
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000642 Src1Name = getRegName(MI->getOperand(NumOperands - 1).getReg());
Justin Bognercd1d5aa2016-08-17 20:30:52 +0000643 LLVM_FALLTHROUGH;
644
Igor Breger1f782962015-11-19 08:26:56 +0000645 CASE_MOVDUP(MOVSLDUP, m)
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000646 DestName = getRegName(MI->getOperand(0).getReg());
Craig Topperacaba3b2018-03-12 16:43:11 +0000647 DecodeMOVSLDUPMask(getRegOperandNumElts(MI, 32, 0), ShuffleMask);
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000648 break;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000649
Igor Breger24cab0f2015-11-16 07:22:00 +0000650 CASE_MOVDUP(MOVSHDUP, r)
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000651 Src1Name = getRegName(MI->getOperand(NumOperands - 1).getReg());
Justin Bognercd1d5aa2016-08-17 20:30:52 +0000652 LLVM_FALLTHROUGH;
653
Igor Breger1f782962015-11-19 08:26:56 +0000654 CASE_MOVDUP(MOVSHDUP, m)
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000655 DestName = getRegName(MI->getOperand(0).getReg());
Craig Topperacaba3b2018-03-12 16:43:11 +0000656 DecodeMOVSHDUPMask(getRegOperandNumElts(MI, 32, 0), ShuffleMask);
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000657 break;
658
Igor Breger1f782962015-11-19 08:26:56 +0000659 CASE_MOVDUP(MOVDDUP, r)
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000660 Src1Name = getRegName(MI->getOperand(NumOperands - 1).getReg());
Justin Bognercd1d5aa2016-08-17 20:30:52 +0000661 LLVM_FALLTHROUGH;
662
Igor Breger1f782962015-11-19 08:26:56 +0000663 CASE_MOVDUP(MOVDDUP, m)
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000664 DestName = getRegName(MI->getOperand(0).getReg());
Craig Topperacaba3b2018-03-12 16:43:11 +0000665 DecodeMOVDDUPMask(getRegOperandNumElts(MI, 64, 0), ShuffleMask);
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000666 break;
667
668 case X86::PSLLDQri:
669 case X86::VPSLLDQri:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000670 case X86::VPSLLDQYri:
Simon Pilgrim643734c2016-06-09 22:03:15 +0000671 case X86::VPSLLDQZ128rr:
672 case X86::VPSLLDQZ256rr:
Craig Topperaa904d52017-12-10 17:42:39 +0000673 case X86::VPSLLDQZrr:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000674 Src1Name = getRegName(MI->getOperand(1).getReg());
Galina Kistanovab2c01162017-05-31 19:41:33 +0000675 LLVM_FALLTHROUGH;
Simon Pilgrim643734c2016-06-09 22:03:15 +0000676 case X86::VPSLLDQZ128rm:
677 case X86::VPSLLDQZ256rm:
Craig Topperaa904d52017-12-10 17:42:39 +0000678 case X86::VPSLLDQZrm:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000679 DestName = getRegName(MI->getOperand(0).getReg());
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000680 if (MI->getOperand(NumOperands - 1).isImm())
Craig Topperacaba3b2018-03-12 16:43:11 +0000681 DecodePSLLDQMask(getRegOperandNumElts(MI, 8, 0),
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000682 MI->getOperand(NumOperands - 1).getImm(),
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000683 ShuffleMask);
684 break;
685
686 case X86::PSRLDQri:
687 case X86::VPSRLDQri:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000688 case X86::VPSRLDQYri:
Simon Pilgrim643734c2016-06-09 22:03:15 +0000689 case X86::VPSRLDQZ128rr:
690 case X86::VPSRLDQZ256rr:
Craig Topperaa904d52017-12-10 17:42:39 +0000691 case X86::VPSRLDQZrr:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000692 Src1Name = getRegName(MI->getOperand(1).getReg());
Galina Kistanovab2c01162017-05-31 19:41:33 +0000693 LLVM_FALLTHROUGH;
Simon Pilgrim643734c2016-06-09 22:03:15 +0000694 case X86::VPSRLDQZ128rm:
695 case X86::VPSRLDQZ256rm:
Craig Topperaa904d52017-12-10 17:42:39 +0000696 case X86::VPSRLDQZrm:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000697 DestName = getRegName(MI->getOperand(0).getReg());
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000698 if (MI->getOperand(NumOperands - 1).isImm())
Craig Topperacaba3b2018-03-12 16:43:11 +0000699 DecodePSRLDQMask(getRegOperandNumElts(MI, 8, 0),
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000700 MI->getOperand(NumOperands - 1).getImm(),
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000701 ShuffleMask);
702 break;
703
Craig Topper7a299302016-06-09 07:06:38 +0000704 CASE_SHUF(PALIGNR, rri)
Craig Topper89c17612016-06-10 04:48:05 +0000705 Src1Name = getRegName(MI->getOperand(NumOperands - 2).getReg());
706 RegForm = true;
Justin Bognercd1d5aa2016-08-17 20:30:52 +0000707 LLVM_FALLTHROUGH;
708
Craig Topper7a299302016-06-09 07:06:38 +0000709 CASE_SHUF(PALIGNR, rmi)
Craig Topper89c17612016-06-10 04:48:05 +0000710 Src2Name = getRegName(MI->getOperand(NumOperands-(RegForm?3:7)).getReg());
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000711 DestName = getRegName(MI->getOperand(0).getReg());
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000712 if (MI->getOperand(NumOperands - 1).isImm())
Craig Topperacaba3b2018-03-12 16:43:11 +0000713 DecodePALIGNRMask(getRegOperandNumElts(MI, 8, 0),
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000714 MI->getOperand(NumOperands - 1).getImm(),
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000715 ShuffleMask);
716 break;
717
Craig Topperb084c902016-10-22 06:51:56 +0000718 CASE_AVX512_INS_COMMON(ALIGNQ, Z, rri)
719 CASE_AVX512_INS_COMMON(ALIGNQ, Z256, rri)
720 CASE_AVX512_INS_COMMON(ALIGNQ, Z128, rri)
721 Src1Name = getRegName(MI->getOperand(NumOperands - 2).getReg());
722 RegForm = true;
723 LLVM_FALLTHROUGH;
724
725 CASE_AVX512_INS_COMMON(ALIGNQ, Z, rmi)
726 CASE_AVX512_INS_COMMON(ALIGNQ, Z256, rmi)
727 CASE_AVX512_INS_COMMON(ALIGNQ, Z128, rmi)
728 Src2Name = getRegName(MI->getOperand(NumOperands-(RegForm?3:7)).getReg());
729 DestName = getRegName(MI->getOperand(0).getReg());
730 if (MI->getOperand(NumOperands - 1).isImm())
Craig Topperacaba3b2018-03-12 16:43:11 +0000731 DecodeVALIGNMask(getRegOperandNumElts(MI, 64, 0),
Craig Topperb084c902016-10-22 06:51:56 +0000732 MI->getOperand(NumOperands - 1).getImm(),
733 ShuffleMask);
734 break;
735
736 CASE_AVX512_INS_COMMON(ALIGND, Z, rri)
737 CASE_AVX512_INS_COMMON(ALIGND, Z256, rri)
738 CASE_AVX512_INS_COMMON(ALIGND, Z128, rri)
739 Src1Name = getRegName(MI->getOperand(NumOperands - 2).getReg());
740 RegForm = true;
741 LLVM_FALLTHROUGH;
742
743 CASE_AVX512_INS_COMMON(ALIGND, Z, rmi)
744 CASE_AVX512_INS_COMMON(ALIGND, Z256, rmi)
745 CASE_AVX512_INS_COMMON(ALIGND, Z128, rmi)
746 Src2Name = getRegName(MI->getOperand(NumOperands-(RegForm?3:7)).getReg());
747 DestName = getRegName(MI->getOperand(0).getReg());
748 if (MI->getOperand(NumOperands - 1).isImm())
Craig Topperacaba3b2018-03-12 16:43:11 +0000749 DecodeVALIGNMask(getRegOperandNumElts(MI, 32, 0),
Craig Topperb084c902016-10-22 06:51:56 +0000750 MI->getOperand(NumOperands - 1).getImm(),
751 ShuffleMask);
752 break;
753
Craig Topper01f53b12016-06-03 05:31:00 +0000754 CASE_SHUF(PSHUFD, ri)
Craig Topper6f7288d2016-06-09 07:49:08 +0000755 Src1Name = getRegName(MI->getOperand(NumOperands - 2).getReg());
Justin Bognercd1d5aa2016-08-17 20:30:52 +0000756 LLVM_FALLTHROUGH;
757
Craig Topper01f53b12016-06-03 05:31:00 +0000758 CASE_SHUF(PSHUFD, mi)
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000759 DestName = getRegName(MI->getOperand(0).getReg());
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000760 if (MI->getOperand(NumOperands - 1).isImm())
Craig Topperacaba3b2018-03-12 16:43:11 +0000761 DecodePSHUFMask(getRegOperandNumElts(MI, 32, 0), 32,
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000762 MI->getOperand(NumOperands - 1).getImm(),
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000763 ShuffleMask);
764 break;
765
Craig Topper01f53b12016-06-03 05:31:00 +0000766 CASE_SHUF(PSHUFHW, ri)
Craig Topper6f7288d2016-06-09 07:49:08 +0000767 Src1Name = getRegName(MI->getOperand(NumOperands - 2).getReg());
Justin Bognercd1d5aa2016-08-17 20:30:52 +0000768 LLVM_FALLTHROUGH;
769
Craig Topper01f53b12016-06-03 05:31:00 +0000770 CASE_SHUF(PSHUFHW, mi)
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000771 DestName = getRegName(MI->getOperand(0).getReg());
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000772 if (MI->getOperand(NumOperands - 1).isImm())
Craig Topperacaba3b2018-03-12 16:43:11 +0000773 DecodePSHUFHWMask(getRegOperandNumElts(MI, 16, 0),
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000774 MI->getOperand(NumOperands - 1).getImm(),
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000775 ShuffleMask);
776 break;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000777
Craig Topper01f53b12016-06-03 05:31:00 +0000778 CASE_SHUF(PSHUFLW, ri)
Craig Topper6f7288d2016-06-09 07:49:08 +0000779 Src1Name = getRegName(MI->getOperand(NumOperands - 2).getReg());
Justin Bognercd1d5aa2016-08-17 20:30:52 +0000780 LLVM_FALLTHROUGH;
781
Craig Topper01f53b12016-06-03 05:31:00 +0000782 CASE_SHUF(PSHUFLW, mi)
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000783 DestName = getRegName(MI->getOperand(0).getReg());
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000784 if (MI->getOperand(NumOperands - 1).isImm())
Craig Topperacaba3b2018-03-12 16:43:11 +0000785 DecodePSHUFLWMask(getRegOperandNumElts(MI, 16, 0),
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000786 MI->getOperand(NumOperands - 1).getImm(),
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000787 ShuffleMask);
788 break;
789
Simon Pilgrimf8f86ab2015-09-13 11:28:45 +0000790 case X86::MMX_PSHUFWri:
791 Src1Name = getRegName(MI->getOperand(1).getReg());
Justin Bognercd1d5aa2016-08-17 20:30:52 +0000792 LLVM_FALLTHROUGH;
793
Simon Pilgrimf8f86ab2015-09-13 11:28:45 +0000794 case X86::MMX_PSHUFWmi:
795 DestName = getRegName(MI->getOperand(0).getReg());
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000796 if (MI->getOperand(NumOperands - 1).isImm())
Craig Topperacaba3b2018-03-12 16:43:11 +0000797 DecodePSHUFMask(4, 16, MI->getOperand(NumOperands - 1).getImm(),
Simon Pilgrimf8f86ab2015-09-13 11:28:45 +0000798 ShuffleMask);
799 break;
800
801 case X86::PSWAPDrr:
802 Src1Name = getRegName(MI->getOperand(1).getReg());
Justin Bognercd1d5aa2016-08-17 20:30:52 +0000803 LLVM_FALLTHROUGH;
804
Simon Pilgrimf8f86ab2015-09-13 11:28:45 +0000805 case X86::PSWAPDrm:
806 DestName = getRegName(MI->getOperand(0).getReg());
Craig Topperacaba3b2018-03-12 16:43:11 +0000807 DecodePSWAPMask(2, ShuffleMask);
Simon Pilgrimf8f86ab2015-09-13 11:28:45 +0000808 break;
809
Simon Pilgrim8483df62015-11-17 22:35:45 +0000810 CASE_UNPCK(PUNPCKHBW, r)
Simon Pilgrimf8f86ab2015-09-13 11:28:45 +0000811 case X86::MMX_PUNPCKHBWirr:
Craig Topper89c17612016-06-10 04:48:05 +0000812 Src2Name = getRegName(MI->getOperand(NumOperands - 1).getReg());
813 RegForm = true;
Justin Bognercd1d5aa2016-08-17 20:30:52 +0000814 LLVM_FALLTHROUGH;
815
Simon Pilgrim8483df62015-11-17 22:35:45 +0000816 CASE_UNPCK(PUNPCKHBW, m)
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000817 case X86::MMX_PUNPCKHBWirm:
Craig Topper89c17612016-06-10 04:48:05 +0000818 Src1Name = getRegName(MI->getOperand(NumOperands-(RegForm?2:6)).getReg());
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000819 DestName = getRegName(MI->getOperand(0).getReg());
Craig Topperacaba3b2018-03-12 16:43:11 +0000820 DecodeUNPCKHMask(getRegOperandNumElts(MI, 8, 0), 8, ShuffleMask);
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000821 break;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000822
Simon Pilgrim8483df62015-11-17 22:35:45 +0000823 CASE_UNPCK(PUNPCKHWD, r)
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000824 case X86::MMX_PUNPCKHWDirr:
Craig Topper89c17612016-06-10 04:48:05 +0000825 Src2Name = getRegName(MI->getOperand(NumOperands - 1).getReg());
826 RegForm = true;
Justin Bognercd1d5aa2016-08-17 20:30:52 +0000827 LLVM_FALLTHROUGH;
828
Simon Pilgrim8483df62015-11-17 22:35:45 +0000829 CASE_UNPCK(PUNPCKHWD, m)
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000830 case X86::MMX_PUNPCKHWDirm:
Craig Topper89c17612016-06-10 04:48:05 +0000831 Src1Name = getRegName(MI->getOperand(NumOperands-(RegForm?2:6)).getReg());
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000832 DestName = getRegName(MI->getOperand(0).getReg());
Craig Topperacaba3b2018-03-12 16:43:11 +0000833 DecodeUNPCKHMask(getRegOperandNumElts(MI, 16, 0), 16, ShuffleMask);
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000834 break;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000835
Simon Pilgrim8483df62015-11-17 22:35:45 +0000836 CASE_UNPCK(PUNPCKHDQ, r)
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000837 case X86::MMX_PUNPCKHDQirr:
Craig Topper89c17612016-06-10 04:48:05 +0000838 Src2Name = getRegName(MI->getOperand(NumOperands - 1).getReg());
839 RegForm = true;
Justin Bognercd1d5aa2016-08-17 20:30:52 +0000840 LLVM_FALLTHROUGH;
841
Simon Pilgrim8483df62015-11-17 22:35:45 +0000842 CASE_UNPCK(PUNPCKHDQ, m)
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000843 case X86::MMX_PUNPCKHDQirm:
Craig Topper89c17612016-06-10 04:48:05 +0000844 Src1Name = getRegName(MI->getOperand(NumOperands-(RegForm?2:6)).getReg());
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000845 DestName = getRegName(MI->getOperand(0).getReg());
Craig Topperacaba3b2018-03-12 16:43:11 +0000846 DecodeUNPCKHMask(getRegOperandNumElts(MI, 32, 0), 32, ShuffleMask);
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000847 break;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000848
Simon Pilgrim8483df62015-11-17 22:35:45 +0000849 CASE_UNPCK(PUNPCKHQDQ, r)
Craig Topper89c17612016-06-10 04:48:05 +0000850 Src2Name = getRegName(MI->getOperand(NumOperands - 1).getReg());
851 RegForm = true;
Justin Bognercd1d5aa2016-08-17 20:30:52 +0000852 LLVM_FALLTHROUGH;
853
Simon Pilgrim8483df62015-11-17 22:35:45 +0000854 CASE_UNPCK(PUNPCKHQDQ, m)
Craig Topper89c17612016-06-10 04:48:05 +0000855 Src1Name = getRegName(MI->getOperand(NumOperands-(RegForm?2:6)).getReg());
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000856 DestName = getRegName(MI->getOperand(0).getReg());
Craig Topperacaba3b2018-03-12 16:43:11 +0000857 DecodeUNPCKHMask(getRegOperandNumElts(MI, 64, 0), 64, ShuffleMask);
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000858 break;
859
Simon Pilgrim8483df62015-11-17 22:35:45 +0000860 CASE_UNPCK(PUNPCKLBW, r)
Simon Pilgrimf8f86ab2015-09-13 11:28:45 +0000861 case X86::MMX_PUNPCKLBWirr:
Craig Topper89c17612016-06-10 04:48:05 +0000862 Src2Name = getRegName(MI->getOperand(NumOperands - 1).getReg());
863 RegForm = true;
Justin Bognercd1d5aa2016-08-17 20:30:52 +0000864 LLVM_FALLTHROUGH;
865
Simon Pilgrim8483df62015-11-17 22:35:45 +0000866 CASE_UNPCK(PUNPCKLBW, m)
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000867 case X86::MMX_PUNPCKLBWirm:
Craig Topper89c17612016-06-10 04:48:05 +0000868 Src1Name = getRegName(MI->getOperand(NumOperands-(RegForm?2:6)).getReg());
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000869 DestName = getRegName(MI->getOperand(0).getReg());
Craig Topperacaba3b2018-03-12 16:43:11 +0000870 DecodeUNPCKLMask(getRegOperandNumElts(MI, 8, 0), 8, ShuffleMask);
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000871 break;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000872
Simon Pilgrim8483df62015-11-17 22:35:45 +0000873 CASE_UNPCK(PUNPCKLWD, r)
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000874 case X86::MMX_PUNPCKLWDirr:
Craig Topper89c17612016-06-10 04:48:05 +0000875 Src2Name = getRegName(MI->getOperand(NumOperands - 1).getReg());
876 RegForm = true;
Justin Bognercd1d5aa2016-08-17 20:30:52 +0000877 LLVM_FALLTHROUGH;
878
Simon Pilgrim8483df62015-11-17 22:35:45 +0000879 CASE_UNPCK(PUNPCKLWD, m)
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000880 case X86::MMX_PUNPCKLWDirm:
Craig Topper89c17612016-06-10 04:48:05 +0000881 Src1Name = getRegName(MI->getOperand(NumOperands-(RegForm?2:6)).getReg());
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000882 DestName = getRegName(MI->getOperand(0).getReg());
Craig Topperacaba3b2018-03-12 16:43:11 +0000883 DecodeUNPCKLMask(getRegOperandNumElts(MI, 16, 0), 16, ShuffleMask);
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000884 break;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000885
Simon Pilgrim8483df62015-11-17 22:35:45 +0000886 CASE_UNPCK(PUNPCKLDQ, r)
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000887 case X86::MMX_PUNPCKLDQirr:
Craig Topper89c17612016-06-10 04:48:05 +0000888 Src2Name = getRegName(MI->getOperand(NumOperands - 1).getReg());
889 RegForm = true;
Justin Bognercd1d5aa2016-08-17 20:30:52 +0000890 LLVM_FALLTHROUGH;
891
Simon Pilgrim8483df62015-11-17 22:35:45 +0000892 CASE_UNPCK(PUNPCKLDQ, m)
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000893 case X86::MMX_PUNPCKLDQirm:
Craig Topper89c17612016-06-10 04:48:05 +0000894 Src1Name = getRegName(MI->getOperand(NumOperands-(RegForm?2:6)).getReg());
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000895 DestName = getRegName(MI->getOperand(0).getReg());
Craig Topperacaba3b2018-03-12 16:43:11 +0000896 DecodeUNPCKLMask(getRegOperandNumElts(MI, 32, 0), 32, ShuffleMask);
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000897 break;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000898
Simon Pilgrim8483df62015-11-17 22:35:45 +0000899 CASE_UNPCK(PUNPCKLQDQ, r)
Craig Topper89c17612016-06-10 04:48:05 +0000900 Src2Name = getRegName(MI->getOperand(NumOperands - 1).getReg());
901 RegForm = true;
Justin Bognercd1d5aa2016-08-17 20:30:52 +0000902 LLVM_FALLTHROUGH;
903
Simon Pilgrim8483df62015-11-17 22:35:45 +0000904 CASE_UNPCK(PUNPCKLQDQ, m)
Craig Topper89c17612016-06-10 04:48:05 +0000905 Src1Name = getRegName(MI->getOperand(NumOperands-(RegForm?2:6)).getReg());
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000906 DestName = getRegName(MI->getOperand(0).getReg());
Craig Topperacaba3b2018-03-12 16:43:11 +0000907 DecodeUNPCKLMask(getRegOperandNumElts(MI, 64, 0), 64, ShuffleMask);
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000908 break;
909
Craig Topper01f53b12016-06-03 05:31:00 +0000910 CASE_SHUF(SHUFPD, rri)
Craig Topper89c17612016-06-10 04:48:05 +0000911 Src2Name = getRegName(MI->getOperand(NumOperands - 2).getReg());
912 RegForm = true;
Justin Bognercd1d5aa2016-08-17 20:30:52 +0000913 LLVM_FALLTHROUGH;
914
Craig Topper01f53b12016-06-03 05:31:00 +0000915 CASE_SHUF(SHUFPD, rmi)
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000916 if (MI->getOperand(NumOperands - 1).isImm())
Craig Topperacaba3b2018-03-12 16:43:11 +0000917 DecodeSHUFPMask(getRegOperandNumElts(MI, 64, 0), 64,
918 MI->getOperand(NumOperands - 1).getImm(), ShuffleMask);
Craig Topper89c17612016-06-10 04:48:05 +0000919 Src1Name = getRegName(MI->getOperand(NumOperands-(RegForm?3:7)).getReg());
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000920 DestName = getRegName(MI->getOperand(0).getReg());
921 break;
922
Craig Topper01f53b12016-06-03 05:31:00 +0000923 CASE_SHUF(SHUFPS, rri)
Craig Topper89c17612016-06-10 04:48:05 +0000924 Src2Name = getRegName(MI->getOperand(NumOperands - 2).getReg());
925 RegForm = true;
Justin Bognercd1d5aa2016-08-17 20:30:52 +0000926 LLVM_FALLTHROUGH;
927
Craig Topper01f53b12016-06-03 05:31:00 +0000928 CASE_SHUF(SHUFPS, rmi)
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000929 if (MI->getOperand(NumOperands - 1).isImm())
Craig Topperacaba3b2018-03-12 16:43:11 +0000930 DecodeSHUFPMask(getRegOperandNumElts(MI, 32, 0), 32,
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000931 MI->getOperand(NumOperands - 1).getImm(),
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000932 ShuffleMask);
Craig Topper89c17612016-06-10 04:48:05 +0000933 Src1Name = getRegName(MI->getOperand(NumOperands-(RegForm?3:7)).getReg());
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000934 DestName = getRegName(MI->getOperand(0).getReg());
935 break;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000936
Igor Breger24cab0f2015-11-16 07:22:00 +0000937 CASE_VSHUF(64X2, r)
Simon Pilgrimd3869412016-06-11 11:18:38 +0000938 Src2Name = getRegName(MI->getOperand(NumOperands - 2).getReg());
939 RegForm = true;
Justin Bognercd1d5aa2016-08-17 20:30:52 +0000940 LLVM_FALLTHROUGH;
941
Igor Breger24cab0f2015-11-16 07:22:00 +0000942 CASE_VSHUF(64X2, m)
Craig Topperacaba3b2018-03-12 16:43:11 +0000943 decodeVSHUF64x2FamilyMask(getRegOperandNumElts(MI, 64, 0), 64,
Simon Pilgrimd3869412016-06-11 11:18:38 +0000944 MI->getOperand(NumOperands - 1).getImm(),
Igor Bregerd7bae452015-10-15 13:29:07 +0000945 ShuffleMask);
Simon Pilgrimd3869412016-06-11 11:18:38 +0000946 Src1Name = getRegName(MI->getOperand(NumOperands-(RegForm?3:7)).getReg());
Igor Bregerd7bae452015-10-15 13:29:07 +0000947 DestName = getRegName(MI->getOperand(0).getReg());
Igor Bregerd7bae452015-10-15 13:29:07 +0000948 break;
Simon Pilgrimd3869412016-06-11 11:18:38 +0000949
950 CASE_VSHUF(32X4, r)
951 Src2Name = getRegName(MI->getOperand(NumOperands - 2).getReg());
952 RegForm = true;
Justin Bognercd1d5aa2016-08-17 20:30:52 +0000953 LLVM_FALLTHROUGH;
954
Simon Pilgrimd3869412016-06-11 11:18:38 +0000955 CASE_VSHUF(32X4, m)
Craig Topperacaba3b2018-03-12 16:43:11 +0000956 decodeVSHUF64x2FamilyMask(getRegOperandNumElts(MI, 32, 0), 32,
Simon Pilgrimd3869412016-06-11 11:18:38 +0000957 MI->getOperand(NumOperands - 1).getImm(),
958 ShuffleMask);
959 Src1Name = getRegName(MI->getOperand(NumOperands-(RegForm?3:7)).getReg());
960 DestName = getRegName(MI->getOperand(0).getReg());
961 break;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000962
Simon Pilgrim8483df62015-11-17 22:35:45 +0000963 CASE_UNPCK(UNPCKLPD, r)
Craig Topper89c17612016-06-10 04:48:05 +0000964 Src2Name = getRegName(MI->getOperand(NumOperands - 1).getReg());
965 RegForm = true;
Justin Bognercd1d5aa2016-08-17 20:30:52 +0000966 LLVM_FALLTHROUGH;
967
Simon Pilgrim8483df62015-11-17 22:35:45 +0000968 CASE_UNPCK(UNPCKLPD, m)
Craig Topperacaba3b2018-03-12 16:43:11 +0000969 DecodeUNPCKLMask(getRegOperandNumElts(MI, 64, 0), 64, ShuffleMask);
Craig Topper89c17612016-06-10 04:48:05 +0000970 Src1Name = getRegName(MI->getOperand(NumOperands-(RegForm?2:6)).getReg());
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000971 DestName = getRegName(MI->getOperand(0).getReg());
972 break;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000973
Simon Pilgrim8483df62015-11-17 22:35:45 +0000974 CASE_UNPCK(UNPCKLPS, r)
Craig Topper89c17612016-06-10 04:48:05 +0000975 Src2Name = getRegName(MI->getOperand(NumOperands - 1).getReg());
976 RegForm = true;
Justin Bognercd1d5aa2016-08-17 20:30:52 +0000977 LLVM_FALLTHROUGH;
978
Simon Pilgrim8483df62015-11-17 22:35:45 +0000979 CASE_UNPCK(UNPCKLPS, m)
Craig Topperacaba3b2018-03-12 16:43:11 +0000980 DecodeUNPCKLMask(getRegOperandNumElts(MI, 32, 0), 32, ShuffleMask);
Craig Topper89c17612016-06-10 04:48:05 +0000981 Src1Name = getRegName(MI->getOperand(NumOperands-(RegForm?2:6)).getReg());
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000982 DestName = getRegName(MI->getOperand(0).getReg());
983 break;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000984
Simon Pilgrim8483df62015-11-17 22:35:45 +0000985 CASE_UNPCK(UNPCKHPD, r)
Craig Topper89c17612016-06-10 04:48:05 +0000986 Src2Name = getRegName(MI->getOperand(NumOperands - 1).getReg());
987 RegForm = true;
Justin Bognercd1d5aa2016-08-17 20:30:52 +0000988 LLVM_FALLTHROUGH;
989
Simon Pilgrim8483df62015-11-17 22:35:45 +0000990 CASE_UNPCK(UNPCKHPD, m)
Craig Topperacaba3b2018-03-12 16:43:11 +0000991 DecodeUNPCKHMask(getRegOperandNumElts(MI, 64, 0), 64, ShuffleMask);
Craig Topper89c17612016-06-10 04:48:05 +0000992 Src1Name = getRegName(MI->getOperand(NumOperands-(RegForm?2:6)).getReg());
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000993 DestName = getRegName(MI->getOperand(0).getReg());
994 break;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000995
Simon Pilgrim8483df62015-11-17 22:35:45 +0000996 CASE_UNPCK(UNPCKHPS, r)
Craig Topper89c17612016-06-10 04:48:05 +0000997 Src2Name = getRegName(MI->getOperand(NumOperands - 1).getReg());
998 RegForm = true;
Justin Bognercd1d5aa2016-08-17 20:30:52 +0000999 LLVM_FALLTHROUGH;
1000
Simon Pilgrim8483df62015-11-17 22:35:45 +00001001 CASE_UNPCK(UNPCKHPS, m)
Craig Topperacaba3b2018-03-12 16:43:11 +00001002 DecodeUNPCKHMask(getRegOperandNumElts(MI, 32, 0), 32, ShuffleMask);
Craig Topper89c17612016-06-10 04:48:05 +00001003 Src1Name = getRegName(MI->getOperand(NumOperands-(RegForm?2:6)).getReg());
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +00001004 DestName = getRegName(MI->getOperand(0).getReg());
1005 break;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +00001006
Simon Pilgrim5080e7f2016-07-03 18:02:43 +00001007 CASE_VPERMILPI(PERMILPS, r)
Simon Pilgrim6ce35dd2016-05-11 18:53:44 +00001008 Src1Name = getRegName(MI->getOperand(NumOperands - 2).getReg());
Justin Bognercd1d5aa2016-08-17 20:30:52 +00001009 LLVM_FALLTHROUGH;
1010
Simon Pilgrim5080e7f2016-07-03 18:02:43 +00001011 CASE_VPERMILPI(PERMILPS, m)
Simon Pilgrim3016d9e2016-05-11 17:36:32 +00001012 if (MI->getOperand(NumOperands - 1).isImm())
Craig Topperacaba3b2018-03-12 16:43:11 +00001013 DecodePSHUFMask(getRegOperandNumElts(MI, 32, 0), 32,
Simon Pilgrim3016d9e2016-05-11 17:36:32 +00001014 MI->getOperand(NumOperands - 1).getImm(),
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +00001015 ShuffleMask);
1016 DestName = getRegName(MI->getOperand(0).getReg());
1017 break;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +00001018
Simon Pilgrim5080e7f2016-07-03 18:02:43 +00001019 CASE_VPERMILPI(PERMILPD, r)
Simon Pilgrim6ce35dd2016-05-11 18:53:44 +00001020 Src1Name = getRegName(MI->getOperand(NumOperands - 2).getReg());
Justin Bognercd1d5aa2016-08-17 20:30:52 +00001021 LLVM_FALLTHROUGH;
1022
Simon Pilgrim5080e7f2016-07-03 18:02:43 +00001023 CASE_VPERMILPI(PERMILPD, m)
Simon Pilgrim3016d9e2016-05-11 17:36:32 +00001024 if (MI->getOperand(NumOperands - 1).isImm())
Craig Topperacaba3b2018-03-12 16:43:11 +00001025 DecodePSHUFMask(getRegOperandNumElts(MI, 64, 0), 64,
Simon Pilgrim3016d9e2016-05-11 17:36:32 +00001026 MI->getOperand(NumOperands - 1).getImm(),
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +00001027 ShuffleMask);
1028 DestName = getRegName(MI->getOperand(0).getReg());
1029 break;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +00001030
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +00001031 case X86::VPERM2F128rr:
1032 case X86::VPERM2I128rr:
1033 Src2Name = getRegName(MI->getOperand(2).getReg());
Justin Bognercd1d5aa2016-08-17 20:30:52 +00001034 LLVM_FALLTHROUGH;
1035
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +00001036 case X86::VPERM2F128rm:
1037 case X86::VPERM2I128rm:
1038 // For instruction comments purpose, assume the 256-bit vector is v4i64.
Simon Pilgrim3016d9e2016-05-11 17:36:32 +00001039 if (MI->getOperand(NumOperands - 1).isImm())
Craig Topperacaba3b2018-03-12 16:43:11 +00001040 DecodeVPERM2X128Mask(4, MI->getOperand(NumOperands - 1).getImm(),
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +00001041 ShuffleMask);
1042 Src1Name = getRegName(MI->getOperand(1).getReg());
1043 DestName = getRegName(MI->getOperand(0).getReg());
1044 break;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +00001045
Simon Pilgrima0d73832016-07-03 18:27:37 +00001046 CASE_VPERM(PERMPD, r)
Craig Topper200d2372016-06-10 05:12:40 +00001047 Src1Name = getRegName(MI->getOperand(NumOperands - 2).getReg());
Justin Bognercd1d5aa2016-08-17 20:30:52 +00001048 LLVM_FALLTHROUGH;
1049
Simon Pilgrima0d73832016-07-03 18:27:37 +00001050 CASE_VPERM(PERMPD, m)
Simon Pilgrim3016d9e2016-05-11 17:36:32 +00001051 if (MI->getOperand(NumOperands - 1).isImm())
Craig Topperacaba3b2018-03-12 16:43:11 +00001052 DecodeVPERMMask(getRegOperandNumElts(MI, 64, 0),
Simon Pilgrima0d73832016-07-03 18:27:37 +00001053 MI->getOperand(NumOperands - 1).getImm(),
1054 ShuffleMask);
1055 DestName = getRegName(MI->getOperand(0).getReg());
1056 break;
1057
1058 CASE_VPERM(PERMQ, r)
1059 Src1Name = getRegName(MI->getOperand(NumOperands - 2).getReg());
Justin Bognercd1d5aa2016-08-17 20:30:52 +00001060 LLVM_FALLTHROUGH;
1061
Simon Pilgrima0d73832016-07-03 18:27:37 +00001062 CASE_VPERM(PERMQ, m)
1063 if (MI->getOperand(NumOperands - 1).isImm())
Craig Topperacaba3b2018-03-12 16:43:11 +00001064 DecodeVPERMMask(getRegOperandNumElts(MI, 64, 0),
Simon Pilgrima0d73832016-07-03 18:27:37 +00001065 MI->getOperand(NumOperands - 1).getImm(),
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +00001066 ShuffleMask);
1067 DestName = getRegName(MI->getOperand(0).getReg());
1068 break;
1069
1070 case X86::MOVSDrr:
1071 case X86::VMOVSDrr:
Simon Pilgrimf5c23ad2016-02-01 22:26:28 +00001072 case X86::VMOVSDZrr:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +00001073 Src2Name = getRegName(MI->getOperand(2).getReg());
1074 Src1Name = getRegName(MI->getOperand(1).getReg());
Justin Bognercd1d5aa2016-08-17 20:30:52 +00001075 LLVM_FALLTHROUGH;
1076
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +00001077 case X86::MOVSDrm:
1078 case X86::VMOVSDrm:
Simon Pilgrimf5c23ad2016-02-01 22:26:28 +00001079 case X86::VMOVSDZrm:
Craig Topperacaba3b2018-03-12 16:43:11 +00001080 DecodeScalarMoveMask(2, nullptr == Src2Name, ShuffleMask);
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +00001081 DestName = getRegName(MI->getOperand(0).getReg());
1082 break;
Simon Pilgrimd5a15442015-11-21 13:04:42 +00001083
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +00001084 case X86::MOVSSrr:
1085 case X86::VMOVSSrr:
Simon Pilgrimf5c23ad2016-02-01 22:26:28 +00001086 case X86::VMOVSSZrr:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +00001087 Src2Name = getRegName(MI->getOperand(2).getReg());
1088 Src1Name = getRegName(MI->getOperand(1).getReg());
Justin Bognercd1d5aa2016-08-17 20:30:52 +00001089 LLVM_FALLTHROUGH;
1090
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +00001091 case X86::MOVSSrm:
1092 case X86::VMOVSSrm:
Simon Pilgrimf5c23ad2016-02-01 22:26:28 +00001093 case X86::VMOVSSZrm:
Craig Topperacaba3b2018-03-12 16:43:11 +00001094 DecodeScalarMoveMask(4, nullptr == Src2Name, ShuffleMask);
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +00001095 DestName = getRegName(MI->getOperand(0).getReg());
1096 break;
1097
1098 case X86::MOVPQI2QIrr:
Simon Pilgrim3e0c0222015-12-13 12:49:48 +00001099 case X86::MOVZPQILo2PQIrr:
1100 case X86::VMOVPQI2QIrr:
Craig Topperb76ed822018-03-10 06:05:13 +00001101 case X86::VMOVPQI2QIZrr:
Simon Pilgrim3e0c0222015-12-13 12:49:48 +00001102 case X86::VMOVZPQILo2PQIrr:
1103 case X86::VMOVZPQILo2PQIZrr:
1104 Src1Name = getRegName(MI->getOperand(1).getReg());
Justin Bognercd1d5aa2016-08-17 20:30:52 +00001105 LLVM_FALLTHROUGH;
1106
Simon Pilgrim3e0c0222015-12-13 12:49:48 +00001107 case X86::MOVQI2PQIrm:
Simon Pilgrim3e0c0222015-12-13 12:49:48 +00001108 case X86::VMOVQI2PQIrm:
Simon Pilgrim96fe4ef2016-02-02 13:32:56 +00001109 case X86::VMOVQI2PQIZrm:
Craig Topperacaba3b2018-03-12 16:43:11 +00001110 DecodeZeroMoveLowMask(2, ShuffleMask);
Simon Pilgrim3e0c0222015-12-13 12:49:48 +00001111 DestName = getRegName(MI->getOperand(0).getReg());
1112 break;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +00001113
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +00001114 case X86::MOVDI2PDIrm:
1115 case X86::VMOVDI2PDIrm:
Simon Pilgrim5be17b62016-02-01 23:04:05 +00001116 case X86::VMOVDI2PDIZrm:
Craig Topperacaba3b2018-03-12 16:43:11 +00001117 DecodeZeroMoveLowMask(4, ShuffleMask);
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +00001118 DestName = getRegName(MI->getOperand(0).getReg());
1119 break;
1120
Simon Pilgrimd85cae32015-07-06 20:46:41 +00001121 case X86::EXTRQI:
1122 if (MI->getOperand(2).isImm() &&
1123 MI->getOperand(3).isImm())
Craig Topperacaba3b2018-03-12 16:43:11 +00001124 DecodeEXTRQIMask(16, 8, MI->getOperand(2).getImm(),
1125 MI->getOperand(3).getImm(), ShuffleMask);
Simon Pilgrimd85cae32015-07-06 20:46:41 +00001126
1127 DestName = getRegName(MI->getOperand(0).getReg());
1128 Src1Name = getRegName(MI->getOperand(1).getReg());
1129 break;
1130
1131 case X86::INSERTQI:
1132 if (MI->getOperand(3).isImm() &&
1133 MI->getOperand(4).isImm())
Craig Topperacaba3b2018-03-12 16:43:11 +00001134 DecodeINSERTQIMask(16, 8, MI->getOperand(3).getImm(),
1135 MI->getOperand(4).getImm(), ShuffleMask);
Simon Pilgrimd85cae32015-07-06 20:46:41 +00001136
1137 DestName = getRegName(MI->getOperand(0).getReg());
1138 Src1Name = getRegName(MI->getOperand(1).getReg());
1139 Src2Name = getRegName(MI->getOperand(2).getReg());
1140 break;
1141
Simon Pilgrima76a8e52016-07-14 12:07:43 +00001142 case X86::VBROADCASTF128:
1143 case X86::VBROADCASTI128:
Craig Topperdde865a2016-10-15 16:26:07 +00001144 CASE_AVX512_INS_COMMON(BROADCASTF64X2, Z128, rm)
1145 CASE_AVX512_INS_COMMON(BROADCASTI64X2, Z128, rm)
Craig Topperacaba3b2018-03-12 16:43:11 +00001146 DecodeSubVectorBroadcast(4, 2, ShuffleMask);
Simon Pilgrima76a8e52016-07-14 12:07:43 +00001147 DestName = getRegName(MI->getOperand(0).getReg());
1148 break;
Craig Topperdde865a2016-10-15 16:26:07 +00001149 CASE_AVX512_INS_COMMON(BROADCASTF64X2, , rm)
1150 CASE_AVX512_INS_COMMON(BROADCASTI64X2, , rm)
Craig Topperacaba3b2018-03-12 16:43:11 +00001151 DecodeSubVectorBroadcast(8, 2, ShuffleMask);
Craig Topperdde865a2016-10-15 16:26:07 +00001152 DestName = getRegName(MI->getOperand(0).getReg());
1153 break;
1154 CASE_AVX512_INS_COMMON(BROADCASTF64X4, , rm)
1155 CASE_AVX512_INS_COMMON(BROADCASTI64X4, , rm)
Craig Topperacaba3b2018-03-12 16:43:11 +00001156 DecodeSubVectorBroadcast(8, 4, ShuffleMask);
Craig Topperdde865a2016-10-15 16:26:07 +00001157 DestName = getRegName(MI->getOperand(0).getReg());
1158 break;
1159 CASE_AVX512_INS_COMMON(BROADCASTF32X4, Z256, rm)
1160 CASE_AVX512_INS_COMMON(BROADCASTI32X4, Z256, rm)
Craig Topperacaba3b2018-03-12 16:43:11 +00001161 DecodeSubVectorBroadcast(8, 4, ShuffleMask);
Craig Topperdde865a2016-10-15 16:26:07 +00001162 DestName = getRegName(MI->getOperand(0).getReg());
1163 break;
1164 CASE_AVX512_INS_COMMON(BROADCASTF32X4, , rm)
1165 CASE_AVX512_INS_COMMON(BROADCASTI32X4, , rm)
Craig Topperacaba3b2018-03-12 16:43:11 +00001166 DecodeSubVectorBroadcast(16, 4, ShuffleMask);
Craig Topperdde865a2016-10-15 16:26:07 +00001167 DestName = getRegName(MI->getOperand(0).getReg());
1168 break;
1169 CASE_AVX512_INS_COMMON(BROADCASTF32X8, , rm)
1170 CASE_AVX512_INS_COMMON(BROADCASTI32X8, , rm)
Craig Topperacaba3b2018-03-12 16:43:11 +00001171 DecodeSubVectorBroadcast(16, 8, ShuffleMask);
Craig Topperdde865a2016-10-15 16:26:07 +00001172 DestName = getRegName(MI->getOperand(0).getReg());
1173 break;
Craig Topper6ce20bd2017-10-11 00:11:53 +00001174 CASE_AVX512_INS_COMMON(BROADCASTI32X2, Z128, r)
1175 Src1Name = getRegName(MI->getOperand(NumOperands - 1).getReg());
1176 LLVM_FALLTHROUGH;
1177 CASE_AVX512_INS_COMMON(BROADCASTI32X2, Z128, m)
Craig Topperacaba3b2018-03-12 16:43:11 +00001178 DecodeSubVectorBroadcast(4, 2, ShuffleMask);
Craig Topper6ce20bd2017-10-11 00:11:53 +00001179 DestName = getRegName(MI->getOperand(0).getReg());
1180 break;
Craig Topperdde865a2016-10-15 16:26:07 +00001181 CASE_AVX512_INS_COMMON(BROADCASTF32X2, Z256, r)
1182 CASE_AVX512_INS_COMMON(BROADCASTI32X2, Z256, r)
1183 Src1Name = getRegName(MI->getOperand(NumOperands - 1).getReg());
Galina Kistanovab2c01162017-05-31 19:41:33 +00001184 LLVM_FALLTHROUGH;
Craig Topperdde865a2016-10-15 16:26:07 +00001185 CASE_AVX512_INS_COMMON(BROADCASTF32X2, Z256, m)
1186 CASE_AVX512_INS_COMMON(BROADCASTI32X2, Z256, m)
Craig Topperacaba3b2018-03-12 16:43:11 +00001187 DecodeSubVectorBroadcast(8, 2, ShuffleMask);
Craig Topperdde865a2016-10-15 16:26:07 +00001188 DestName = getRegName(MI->getOperand(0).getReg());
1189 break;
1190 CASE_AVX512_INS_COMMON(BROADCASTF32X2, Z, r)
1191 CASE_AVX512_INS_COMMON(BROADCASTI32X2, Z, r)
1192 Src1Name = getRegName(MI->getOperand(NumOperands - 1).getReg());
Galina Kistanovab2c01162017-05-31 19:41:33 +00001193 LLVM_FALLTHROUGH;
Craig Topperdde865a2016-10-15 16:26:07 +00001194 CASE_AVX512_INS_COMMON(BROADCASTF32X2, Z, m)
1195 CASE_AVX512_INS_COMMON(BROADCASTI32X2, Z, m)
Craig Topperacaba3b2018-03-12 16:43:11 +00001196 DecodeSubVectorBroadcast(16, 2, ShuffleMask);
Craig Topperdde865a2016-10-15 16:26:07 +00001197 DestName = getRegName(MI->getOperand(0).getReg());
1198 break;
Simon Pilgrima76a8e52016-07-14 12:07:43 +00001199
Simon Pilgrim0acc32a2016-02-06 19:51:21 +00001200 CASE_PMOVZX(PMOVZXBW, r)
Craig Topperacaba3b2018-03-12 16:43:11 +00001201 Src1Name = getRegName(MI->getOperand(NumOperands - 1).getReg());
1202 LLVM_FALLTHROUGH;
1203 CASE_PMOVZX(PMOVZXBW, m)
1204 DecodeZeroExtendMask(8, 16, getRegOperandNumElts(MI, 16, 0), ShuffleMask);
1205 DestName = getRegName(MI->getOperand(0).getReg());
1206 break;
1207
Simon Pilgrim0acc32a2016-02-06 19:51:21 +00001208 CASE_PMOVZX(PMOVZXBD, r)
Craig Topperacaba3b2018-03-12 16:43:11 +00001209 Src1Name = getRegName(MI->getOperand(NumOperands - 1).getReg());
1210 LLVM_FALLTHROUGH;
1211 CASE_PMOVZX(PMOVZXBD, m)
1212 DecodeZeroExtendMask(8, 32, getRegOperandNumElts(MI, 32, 0), ShuffleMask);
1213 DestName = getRegName(MI->getOperand(0).getReg());
1214 break;
1215
Simon Pilgrim0acc32a2016-02-06 19:51:21 +00001216 CASE_PMOVZX(PMOVZXBQ, r)
Simon Pilgrim3016d9e2016-05-11 17:36:32 +00001217 Src1Name = getRegName(MI->getOperand(NumOperands - 1).getReg());
Justin Bognercd1d5aa2016-08-17 20:30:52 +00001218 LLVM_FALLTHROUGH;
Simon Pilgrim0acc32a2016-02-06 19:51:21 +00001219 CASE_PMOVZX(PMOVZXBQ, m)
Craig Topperacaba3b2018-03-12 16:43:11 +00001220 DecodeZeroExtendMask(8, 64, getRegOperandNumElts(MI, 64, 0), ShuffleMask);
Simon Pilgrime1b6db92016-02-06 16:33:42 +00001221 DestName = getRegName(MI->getOperand(0).getReg());
1222 break;
1223
Simon Pilgrim0acc32a2016-02-06 19:51:21 +00001224 CASE_PMOVZX(PMOVZXWD, r)
Craig Topperacaba3b2018-03-12 16:43:11 +00001225 Src1Name = getRegName(MI->getOperand(NumOperands - 1).getReg());
1226 LLVM_FALLTHROUGH;
1227 CASE_PMOVZX(PMOVZXWD, m)
1228 DecodeZeroExtendMask(16, 32, getRegOperandNumElts(MI, 32, 0), ShuffleMask);
1229 DestName = getRegName(MI->getOperand(0).getReg());
1230 break;
1231
Simon Pilgrim0acc32a2016-02-06 19:51:21 +00001232 CASE_PMOVZX(PMOVZXWQ, r)
Simon Pilgrim3016d9e2016-05-11 17:36:32 +00001233 Src1Name = getRegName(MI->getOperand(NumOperands - 1).getReg());
Justin Bognercd1d5aa2016-08-17 20:30:52 +00001234 LLVM_FALLTHROUGH;
Simon Pilgrim0acc32a2016-02-06 19:51:21 +00001235 CASE_PMOVZX(PMOVZXWQ, m)
Craig Topperacaba3b2018-03-12 16:43:11 +00001236 DecodeZeroExtendMask(16, 64, getRegOperandNumElts(MI, 64, 0), ShuffleMask);
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +00001237 DestName = getRegName(MI->getOperand(0).getReg());
Simon Pilgrime1b6db92016-02-06 16:33:42 +00001238 break;
1239
Simon Pilgrim0acc32a2016-02-06 19:51:21 +00001240 CASE_PMOVZX(PMOVZXDQ, r)
Simon Pilgrim3016d9e2016-05-11 17:36:32 +00001241 Src1Name = getRegName(MI->getOperand(NumOperands - 1).getReg());
Justin Bognercd1d5aa2016-08-17 20:30:52 +00001242 LLVM_FALLTHROUGH;
Simon Pilgrim0acc32a2016-02-06 19:51:21 +00001243 CASE_PMOVZX(PMOVZXDQ, m)
Craig Topperacaba3b2018-03-12 16:43:11 +00001244 DecodeZeroExtendMask(32, 64, getRegOperandNumElts(MI, 64, 0), ShuffleMask);
Simon Pilgrime1b6db92016-02-06 16:33:42 +00001245 DestName = getRegName(MI->getOperand(0).getReg());
1246 break;
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +00001247 }
1248
1249 // The only comments we decode are shuffles, so give up if we were unable to
1250 // decode a shuffle mask.
1251 if (ShuffleMask.empty())
1252 return false;
1253
1254 if (!DestName) DestName = Src1Name;
Craig Topper85b1da12017-10-11 00:46:09 +00001255 if (DestName) {
1256 OS << DestName;
Craig Topper9804c672018-03-10 03:12:00 +00001257 printMasking(OS, MI, MCII, getRegName);
Craig Topper85b1da12017-10-11 00:46:09 +00001258 } else
1259 OS << "mem";
1260
1261 OS << " = ";
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +00001262
1263 // If the two sources are the same, canonicalize the input elements to be
1264 // from the first src so that we get larger element spans.
1265 if (Src1Name == Src2Name) {
1266 for (unsigned i = 0, e = ShuffleMask.size(); i != e; ++i) {
1267 if ((int)ShuffleMask[i] >= 0 && // Not sentinel.
NAKAMURA Takumi5582a6a2015-05-25 01:43:34 +00001268 ShuffleMask[i] >= (int)e) // From second mask.
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +00001269 ShuffleMask[i] -= e;
1270 }
1271 }
1272
1273 // The shuffle mask specifies which elements of the src1/src2 fill in the
1274 // destination, with a few sentinel values. Loop through and print them
1275 // out.
1276 for (unsigned i = 0, e = ShuffleMask.size(); i != e; ++i) {
1277 if (i != 0)
1278 OS << ',';
1279 if (ShuffleMask[i] == SM_SentinelZero) {
1280 OS << "zero";
1281 continue;
1282 }
1283
1284 // Otherwise, it must come from src1 or src2. Print the span of elements
1285 // that comes from this src.
1286 bool isSrc1 = ShuffleMask[i] < (int)ShuffleMask.size();
1287 const char *SrcName = isSrc1 ? Src1Name : Src2Name;
1288 OS << (SrcName ? SrcName : "mem") << '[';
1289 bool IsFirst = true;
1290 while (i != e && (int)ShuffleMask[i] != SM_SentinelZero &&
1291 (ShuffleMask[i] < (int)ShuffleMask.size()) == isSrc1) {
1292 if (!IsFirst)
1293 OS << ',';
1294 else
1295 IsFirst = false;
1296 if (ShuffleMask[i] == SM_SentinelUndef)
1297 OS << "u";
1298 else
1299 OS << ShuffleMask[i] % ShuffleMask.size();
1300 ++i;
1301 }
1302 OS << ']';
NAKAMURA Takumi5582a6a2015-05-25 01:43:34 +00001303 --i; // For loop increments element #.
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +00001304 }
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +00001305
1306 // We successfully added a comment to this instruction.
1307 return true;
1308}