blob: 73b1969b4e8227d5a83ade934e1dc05aab64952a [file] [log] [blame]
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +00001//===-- X86InstComments.cpp - Generate verbose-asm comments for instrs ----===//
2//
Chandler Carruth2946cd72019-01-19 08:50:56 +00003// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +00006//
7//===----------------------------------------------------------------------===//
8//
9// This defines functionality used to emit comments about X86 instructions to
10// an output stream for -fverbose-asm.
11//
12//===----------------------------------------------------------------------===//
13
14#include "X86InstComments.h"
Craig Toppera21758f2018-03-29 04:14:04 +000015#include "X86ATTInstPrinter.h"
Richard Trieub28b8b72019-05-10 23:24:38 +000016#include "X86BaseInfo.h"
17#include "X86MCTargetDesc.h"
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +000018#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
Craig Toppera21758f2018-03-29 04:14:04 +0000221static const char *getRegName(unsigned Reg) {
222 return X86ATTInstPrinter::getRegisterName(Reg);
223}
224
Simon Pilgrim7c2fbdc2016-07-03 13:08:29 +0000225/// Wraps the destination register name with AVX512 mask/maskz filtering.
Craig Topper85b1da12017-10-11 00:46:09 +0000226static void printMasking(raw_ostream &OS, const MCInst *MI,
Craig Toppera21758f2018-03-29 04:14:04 +0000227 const MCInstrInfo &MCII) {
Craig Topper9804c672018-03-10 03:12:00 +0000228 const MCInstrDesc &Desc = MCII.get(MI->getOpcode());
229 uint64_t TSFlags = Desc.TSFlags;
Simon Pilgrim7c2fbdc2016-07-03 13:08:29 +0000230
Craig Topper9804c672018-03-10 03:12:00 +0000231 if (!(TSFlags & X86II::EVEX_K))
Craig Topper85b1da12017-10-11 00:46:09 +0000232 return;
Craig Topper9804c672018-03-10 03:12:00 +0000233
234 bool MaskWithZero = (TSFlags & X86II::EVEX_Z);
235 unsigned MaskOp = Desc.getNumDefs();
236
237 if (Desc.getOperandConstraint(MaskOp, MCOI::TIED_TO) != -1)
238 ++MaskOp;
239
240 const char *MaskRegName = getRegName(MI->getOperand(MaskOp).getReg());
Simon Pilgrim7c2fbdc2016-07-03 13:08:29 +0000241
242 // MASK: zmmX {%kY}
Craig Topper85b1da12017-10-11 00:46:09 +0000243 OS << " {%" << MaskRegName << "}";
Simon Pilgrim7c2fbdc2016-07-03 13:08:29 +0000244
245 // MASKZ: zmmX {%kY} {z}
246 if (MaskWithZero)
Craig Topper85b1da12017-10-11 00:46:09 +0000247 OS << " {z}";
Simon Pilgrim7c2fbdc2016-07-03 13:08:29 +0000248}
249
Craig Toppera21758f2018-03-29 04:14:04 +0000250static bool printFMA3Comments(const MCInst *MI, raw_ostream &OS) {
Craig Topperd88204f2018-03-10 21:30:46 +0000251 const char *Mul1Name = nullptr, *Mul2Name = nullptr, *AccName = nullptr;
252 unsigned NumOperands = MI->getNumOperands();
253 bool RegForm = false;
254 bool Negate = false;
255 StringRef AccStr = "+";
256
257 // The operands for FMA instructions without rounding fall into two forms.
258 // dest, src1, src2, src3
259 // dest, src1, mask, src2, src3
260 // Where src3 is either a register or 5 memory address operands. So to find
261 // dest and src1 we can index from the front. To find src2 and src3 we can
262 // index from the end by taking into account memory vs register form when
263 // finding src2.
264
265 switch (MI->getOpcode()) {
266 default:
267 return false;
268 CASE_FMA_PACKED_REG(FMADD132)
269 CASE_FMA_SCALAR_REG(FMADD132)
270 Mul2Name = getRegName(MI->getOperand(NumOperands - 1).getReg());
271 RegForm = true;
272 LLVM_FALLTHROUGH;
273 CASE_FMA_PACKED_MEM(FMADD132)
274 CASE_FMA_SCALAR_MEM(FMADD132)
275 AccName = getRegName(MI->getOperand(NumOperands-(RegForm?2:6)).getReg());
276 Mul1Name = getRegName(MI->getOperand(1).getReg());
277 break;
278
279 CASE_FMA_PACKED_REG(FMADD213)
280 CASE_FMA_SCALAR_REG(FMADD213)
281 AccName = getRegName(MI->getOperand(NumOperands - 1).getReg());
282 RegForm = true;
283 LLVM_FALLTHROUGH;
284 CASE_FMA_PACKED_MEM(FMADD213)
285 CASE_FMA_SCALAR_MEM(FMADD213)
286 Mul1Name = getRegName(MI->getOperand(NumOperands-(RegForm?2:6)).getReg());
287 Mul2Name = getRegName(MI->getOperand(1).getReg());
288 break;
289
290 CASE_FMA_PACKED_REG(FMADD231)
291 CASE_FMA_SCALAR_REG(FMADD231)
292 Mul2Name = getRegName(MI->getOperand(NumOperands - 1).getReg());
293 RegForm = true;
294 LLVM_FALLTHROUGH;
295 CASE_FMA_PACKED_MEM(FMADD231)
296 CASE_FMA_SCALAR_MEM(FMADD231)
297 Mul1Name = getRegName(MI->getOperand(NumOperands-(RegForm?2:6)).getReg());
298 AccName = getRegName(MI->getOperand(1).getReg());
299 break;
300
301 CASE_FMA_PACKED_REG(FMSUB132)
302 CASE_FMA_SCALAR_REG(FMSUB132)
303 Mul2Name = getRegName(MI->getOperand(NumOperands - 1).getReg());
304 RegForm = true;
305 LLVM_FALLTHROUGH;
306 CASE_FMA_PACKED_MEM(FMSUB132)
307 CASE_FMA_SCALAR_MEM(FMSUB132)
308 AccName = getRegName(MI->getOperand(NumOperands-(RegForm?2:6)).getReg());
309 Mul1Name = getRegName(MI->getOperand(1).getReg());
310 AccStr = "-";
311 break;
312
313 CASE_FMA_PACKED_REG(FMSUB213)
314 CASE_FMA_SCALAR_REG(FMSUB213)
315 AccName = getRegName(MI->getOperand(NumOperands - 1).getReg());
316 RegForm = true;
317 LLVM_FALLTHROUGH;
318 CASE_FMA_PACKED_MEM(FMSUB213)
319 CASE_FMA_SCALAR_MEM(FMSUB213)
320 Mul1Name = getRegName(MI->getOperand(NumOperands-(RegForm?2:6)).getReg());
321 Mul2Name = getRegName(MI->getOperand(1).getReg());
322 AccStr = "-";
323 break;
324
325 CASE_FMA_PACKED_REG(FMSUB231)
326 CASE_FMA_SCALAR_REG(FMSUB231)
327 Mul2Name = getRegName(MI->getOperand(NumOperands - 1).getReg());
328 RegForm = true;
329 LLVM_FALLTHROUGH;
330 CASE_FMA_PACKED_MEM(FMSUB231)
331 CASE_FMA_SCALAR_MEM(FMSUB231)
332 Mul1Name = getRegName(MI->getOperand(NumOperands-(RegForm?2:6)).getReg());
333 AccName = getRegName(MI->getOperand(1).getReg());
334 AccStr = "-";
335 break;
336
337 CASE_FMA_PACKED_REG(FNMADD132)
338 CASE_FMA_SCALAR_REG(FNMADD132)
339 Mul2Name = getRegName(MI->getOperand(NumOperands - 1).getReg());
340 RegForm = true;
341 LLVM_FALLTHROUGH;
342 CASE_FMA_PACKED_MEM(FNMADD132)
343 CASE_FMA_SCALAR_MEM(FNMADD132)
344 AccName = getRegName(MI->getOperand(NumOperands-(RegForm?2:6)).getReg());
345 Mul1Name = getRegName(MI->getOperand(1).getReg());
346 Negate = true;
347 break;
348
349 CASE_FMA_PACKED_REG(FNMADD213)
350 CASE_FMA_SCALAR_REG(FNMADD213)
351 AccName = getRegName(MI->getOperand(NumOperands - 1).getReg());
352 RegForm = true;
353 LLVM_FALLTHROUGH;
354 CASE_FMA_PACKED_MEM(FNMADD213)
355 CASE_FMA_SCALAR_MEM(FNMADD213)
356 Mul1Name = getRegName(MI->getOperand(NumOperands-(RegForm?2:6)).getReg());
357 Mul2Name = getRegName(MI->getOperand(1).getReg());
358 Negate = true;
359 break;
360
361 CASE_FMA_PACKED_REG(FNMADD231)
362 CASE_FMA_SCALAR_REG(FNMADD231)
363 Mul2Name = getRegName(MI->getOperand(NumOperands - 1).getReg());
364 RegForm = true;
365 LLVM_FALLTHROUGH;
366 CASE_FMA_PACKED_MEM(FNMADD231)
367 CASE_FMA_SCALAR_MEM(FNMADD231)
368 Mul1Name = getRegName(MI->getOperand(NumOperands-(RegForm?2:6)).getReg());
369 AccName = getRegName(MI->getOperand(1).getReg());
370 Negate = true;
371 break;
372
373 CASE_FMA_PACKED_REG(FNMSUB132)
374 CASE_FMA_SCALAR_REG(FNMSUB132)
375 Mul2Name = getRegName(MI->getOperand(NumOperands - 1).getReg());
376 RegForm = true;
377 LLVM_FALLTHROUGH;
378 CASE_FMA_PACKED_MEM(FNMSUB132)
379 CASE_FMA_SCALAR_MEM(FNMSUB132)
380 AccName = getRegName(MI->getOperand(NumOperands-(RegForm?2:6)).getReg());
381 Mul1Name = getRegName(MI->getOperand(1).getReg());
382 AccStr = "-";
383 Negate = true;
384 break;
385
386 CASE_FMA_PACKED_REG(FNMSUB213)
387 CASE_FMA_SCALAR_REG(FNMSUB213)
388 AccName = getRegName(MI->getOperand(NumOperands - 1).getReg());
389 RegForm = true;
390 LLVM_FALLTHROUGH;
391 CASE_FMA_PACKED_MEM(FNMSUB213)
392 CASE_FMA_SCALAR_MEM(FNMSUB213)
393 Mul1Name = getRegName(MI->getOperand(NumOperands-(RegForm?2:6)).getReg());
394 Mul2Name = getRegName(MI->getOperand(1).getReg());
395 AccStr = "-";
396 Negate = true;
397 break;
398
399 CASE_FMA_PACKED_REG(FNMSUB231)
400 CASE_FMA_SCALAR_REG(FNMSUB231)
401 Mul2Name = getRegName(MI->getOperand(NumOperands - 1).getReg());
402 RegForm = true;
403 LLVM_FALLTHROUGH;
404 CASE_FMA_PACKED_MEM(FNMSUB231)
405 CASE_FMA_SCALAR_MEM(FNMSUB231)
406 Mul1Name = getRegName(MI->getOperand(NumOperands-(RegForm?2:6)).getReg());
407 AccName = getRegName(MI->getOperand(1).getReg());
408 AccStr = "-";
409 Negate = true;
410 break;
411
412 CASE_FMA_PACKED_REG(FMADDSUB132)
413 Mul2Name = getRegName(MI->getOperand(NumOperands - 1).getReg());
414 RegForm = true;
415 LLVM_FALLTHROUGH;
416 CASE_FMA_PACKED_MEM(FMADDSUB132)
417 AccName = getRegName(MI->getOperand(NumOperands-(RegForm?2:6)).getReg());
418 Mul1Name = getRegName(MI->getOperand(1).getReg());
419 AccStr = "+/-";
420 break;
421
422 CASE_FMA_PACKED_REG(FMADDSUB213)
423 AccName = getRegName(MI->getOperand(NumOperands - 1).getReg());
424 RegForm = true;
425 LLVM_FALLTHROUGH;
426 CASE_FMA_PACKED_MEM(FMADDSUB213)
427 Mul1Name = getRegName(MI->getOperand(NumOperands-(RegForm?2:6)).getReg());
428 Mul2Name = getRegName(MI->getOperand(1).getReg());
429 AccStr = "+/-";
430 break;
431
432 CASE_FMA_PACKED_REG(FMADDSUB231)
433 Mul2Name = getRegName(MI->getOperand(NumOperands - 1).getReg());
434 RegForm = true;
435 LLVM_FALLTHROUGH;
436 CASE_FMA_PACKED_MEM(FMADDSUB231)
437 Mul1Name = getRegName(MI->getOperand(NumOperands-(RegForm?2:6)).getReg());
438 AccName = getRegName(MI->getOperand(1).getReg());
439 AccStr = "+/-";
440 break;
441
442 CASE_FMA_PACKED_REG(FMSUBADD132)
443 Mul2Name = getRegName(MI->getOperand(NumOperands - 1).getReg());
444 RegForm = true;
445 LLVM_FALLTHROUGH;
446 CASE_FMA_PACKED_MEM(FMSUBADD132)
447 AccName = getRegName(MI->getOperand(NumOperands-(RegForm?2:6)).getReg());
448 Mul1Name = getRegName(MI->getOperand(1).getReg());
449 AccStr = "-/+";
450 break;
451
452 CASE_FMA_PACKED_REG(FMSUBADD213)
453 AccName = getRegName(MI->getOperand(NumOperands - 1).getReg());
454 RegForm = true;
455 LLVM_FALLTHROUGH;
456 CASE_FMA_PACKED_MEM(FMSUBADD213)
457 Mul1Name = getRegName(MI->getOperand(NumOperands-(RegForm?2:6)).getReg());
458 Mul2Name = getRegName(MI->getOperand(1).getReg());
459 AccStr = "-/+";
460 break;
461
462 CASE_FMA_PACKED_REG(FMSUBADD231)
463 Mul2Name = getRegName(MI->getOperand(NumOperands - 1).getReg());
464 RegForm = true;
465 LLVM_FALLTHROUGH;
466 CASE_FMA_PACKED_MEM(FMSUBADD231)
467 Mul1Name = getRegName(MI->getOperand(NumOperands-(RegForm?2:6)).getReg());
468 AccName = getRegName(MI->getOperand(1).getReg());
469 AccStr = "-/+";
470 break;
471 }
472
473 const char *DestName = getRegName(MI->getOperand(0).getReg());
474
475 if (!Mul1Name) Mul1Name = "mem";
476 if (!Mul2Name) Mul2Name = "mem";
477 if (!AccName) AccName = "mem";
478
479 OS << DestName << " = ";
480 // TODO: Print masking information?
481
482 if (Negate)
483 OS << '-';
484
485 OS << '(' << Mul1Name << " * " << Mul2Name << ") " << AccStr << ' '
486 << AccName;
487
488 return true;
489}
490
491
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000492//===----------------------------------------------------------------------===//
493// Top Level Entrypoint
494//===----------------------------------------------------------------------===//
495
496/// EmitAnyX86InstComments - This function decodes x86 instructions and prints
497/// newline terminated strings to the specified string if desired. This
498/// information is shown in disassembly dumps when verbose assembly is enabled.
499bool llvm::EmitAnyX86InstComments(const MCInst *MI, raw_ostream &OS,
Craig Toppera21758f2018-03-29 04:14:04 +0000500 const MCInstrInfo &MCII) {
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000501 // If this is a shuffle operation, the switch should fill in this state.
502 SmallVector<int, 8> ShuffleMask;
503 const char *DestName = nullptr, *Src1Name = nullptr, *Src2Name = nullptr;
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000504 unsigned NumOperands = MI->getNumOperands();
Craig Topper89c17612016-06-10 04:48:05 +0000505 bool RegForm = false;
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000506
Craig Toppera21758f2018-03-29 04:14:04 +0000507 if (printFMA3Comments(MI, OS))
Craig Topperd88204f2018-03-10 21:30:46 +0000508 return true;
509
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000510 switch (MI->getOpcode()) {
511 default:
512 // Not an instruction for which we can decode comments.
513 return false;
514
515 case X86::BLENDPDrri:
516 case X86::VBLENDPDrri:
Simon Pilgrim13d3a202015-11-16 23:03:18 +0000517 case X86::VBLENDPDYrri:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000518 Src2Name = getRegName(MI->getOperand(2).getReg());
Justin Bognercd1d5aa2016-08-17 20:30:52 +0000519 LLVM_FALLTHROUGH;
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000520 case X86::BLENDPDrmi:
521 case X86::VBLENDPDrmi:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000522 case X86::VBLENDPDYrmi:
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000523 if (MI->getOperand(NumOperands - 1).isImm())
Craig Topperacaba3b2018-03-12 16:43:11 +0000524 DecodeBLENDMask(getRegOperandNumElts(MI, 64, 0),
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000525 MI->getOperand(NumOperands - 1).getImm(),
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000526 ShuffleMask);
527 Src1Name = getRegName(MI->getOperand(1).getReg());
528 DestName = getRegName(MI->getOperand(0).getReg());
529 break;
530
531 case X86::BLENDPSrri:
532 case X86::VBLENDPSrri:
Simon Pilgrim13d3a202015-11-16 23:03:18 +0000533 case X86::VBLENDPSYrri:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000534 Src2Name = getRegName(MI->getOperand(2).getReg());
Justin Bognercd1d5aa2016-08-17 20:30:52 +0000535 LLVM_FALLTHROUGH;
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000536 case X86::BLENDPSrmi:
537 case X86::VBLENDPSrmi:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000538 case X86::VBLENDPSYrmi:
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000539 if (MI->getOperand(NumOperands - 1).isImm())
Craig Topperacaba3b2018-03-12 16:43:11 +0000540 DecodeBLENDMask(getRegOperandNumElts(MI, 32, 0),
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000541 MI->getOperand(NumOperands - 1).getImm(),
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000542 ShuffleMask);
543 Src1Name = getRegName(MI->getOperand(1).getReg());
544 DestName = getRegName(MI->getOperand(0).getReg());
545 break;
546
547 case X86::PBLENDWrri:
548 case X86::VPBLENDWrri:
Simon Pilgrim13d3a202015-11-16 23:03:18 +0000549 case X86::VPBLENDWYrri:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000550 Src2Name = getRegName(MI->getOperand(2).getReg());
Justin Bognercd1d5aa2016-08-17 20:30:52 +0000551 LLVM_FALLTHROUGH;
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000552 case X86::PBLENDWrmi:
553 case X86::VPBLENDWrmi:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000554 case X86::VPBLENDWYrmi:
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000555 if (MI->getOperand(NumOperands - 1).isImm())
Craig Topperacaba3b2018-03-12 16:43:11 +0000556 DecodeBLENDMask(getRegOperandNumElts(MI, 16, 0),
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000557 MI->getOperand(NumOperands - 1).getImm(),
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000558 ShuffleMask);
559 Src1Name = getRegName(MI->getOperand(1).getReg());
560 DestName = getRegName(MI->getOperand(0).getReg());
561 break;
562
563 case X86::VPBLENDDrri:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000564 case X86::VPBLENDDYrri:
565 Src2Name = getRegName(MI->getOperand(2).getReg());
Justin Bognercd1d5aa2016-08-17 20:30:52 +0000566 LLVM_FALLTHROUGH;
Simon Pilgrim13d3a202015-11-16 23:03:18 +0000567 case X86::VPBLENDDrmi:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000568 case X86::VPBLENDDYrmi:
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000569 if (MI->getOperand(NumOperands - 1).isImm())
Craig Topperacaba3b2018-03-12 16:43:11 +0000570 DecodeBLENDMask(getRegOperandNumElts(MI, 32, 0),
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000571 MI->getOperand(NumOperands - 1).getImm(),
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000572 ShuffleMask);
573 Src1Name = getRegName(MI->getOperand(1).getReg());
574 DestName = getRegName(MI->getOperand(0).getReg());
575 break;
576
577 case X86::INSERTPSrr:
578 case X86::VINSERTPSrr:
Craig Topper6189d3e2016-07-19 01:26:19 +0000579 case X86::VINSERTPSZrr:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000580 Src2Name = getRegName(MI->getOperand(2).getReg());
Justin Bognercd1d5aa2016-08-17 20:30:52 +0000581 LLVM_FALLTHROUGH;
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000582 case X86::INSERTPSrm:
583 case X86::VINSERTPSrm:
Craig Topper6189d3e2016-07-19 01:26:19 +0000584 case X86::VINSERTPSZrm:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000585 DestName = getRegName(MI->getOperand(0).getReg());
586 Src1Name = getRegName(MI->getOperand(1).getReg());
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000587 if (MI->getOperand(NumOperands - 1).isImm())
588 DecodeINSERTPSMask(MI->getOperand(NumOperands - 1).getImm(),
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000589 ShuffleMask);
590 break;
591
592 case X86::MOVLHPSrr:
593 case X86::VMOVLHPSrr:
Simon Pilgrimd5a15442015-11-21 13:04:42 +0000594 case X86::VMOVLHPSZrr:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000595 Src2Name = getRegName(MI->getOperand(2).getReg());
596 Src1Name = getRegName(MI->getOperand(1).getReg());
597 DestName = getRegName(MI->getOperand(0).getReg());
598 DecodeMOVLHPSMask(2, ShuffleMask);
599 break;
600
601 case X86::MOVHLPSrr:
602 case X86::VMOVHLPSrr:
Simon Pilgrimd5a15442015-11-21 13:04:42 +0000603 case X86::VMOVHLPSZrr:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000604 Src2Name = getRegName(MI->getOperand(2).getReg());
605 Src1Name = getRegName(MI->getOperand(1).getReg());
606 DestName = getRegName(MI->getOperand(0).getReg());
607 DecodeMOVHLPSMask(2, ShuffleMask);
608 break;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000609
Simon Pilgrima3d67442016-02-07 15:39:22 +0000610 case X86::MOVHPDrm:
611 case X86::VMOVHPDrm:
612 case X86::VMOVHPDZ128rm:
613 Src1Name = getRegName(MI->getOperand(1).getReg());
614 DestName = getRegName(MI->getOperand(0).getReg());
Craig Topperacaba3b2018-03-12 16:43:11 +0000615 DecodeInsertElementMask(2, 1, 1, ShuffleMask);
Simon Pilgrima3d67442016-02-07 15:39:22 +0000616 break;
617
618 case X86::MOVHPSrm:
619 case X86::VMOVHPSrm:
620 case X86::VMOVHPSZ128rm:
621 Src1Name = getRegName(MI->getOperand(1).getReg());
622 DestName = getRegName(MI->getOperand(0).getReg());
Craig Topperacaba3b2018-03-12 16:43:11 +0000623 DecodeInsertElementMask(4, 2, 2, ShuffleMask);
Simon Pilgrima3d67442016-02-07 15:39:22 +0000624 break;
625
626 case X86::MOVLPDrm:
627 case X86::VMOVLPDrm:
628 case X86::VMOVLPDZ128rm:
629 Src1Name = getRegName(MI->getOperand(1).getReg());
630 DestName = getRegName(MI->getOperand(0).getReg());
Craig Topperacaba3b2018-03-12 16:43:11 +0000631 DecodeInsertElementMask(2, 0, 1, ShuffleMask);
Simon Pilgrima3d67442016-02-07 15:39:22 +0000632 break;
633
634 case X86::MOVLPSrm:
635 case X86::VMOVLPSrm:
636 case X86::VMOVLPSZ128rm:
637 Src1Name = getRegName(MI->getOperand(1).getReg());
638 DestName = getRegName(MI->getOperand(0).getReg());
Craig Topperacaba3b2018-03-12 16:43:11 +0000639 DecodeInsertElementMask(4, 0, 2, ShuffleMask);
Simon Pilgrima3d67442016-02-07 15:39:22 +0000640 break;
641
Igor Breger24cab0f2015-11-16 07:22:00 +0000642 CASE_MOVDUP(MOVSLDUP, r)
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000643 Src1Name = getRegName(MI->getOperand(NumOperands - 1).getReg());
Justin Bognercd1d5aa2016-08-17 20:30:52 +0000644 LLVM_FALLTHROUGH;
645
Igor Breger1f782962015-11-19 08:26:56 +0000646 CASE_MOVDUP(MOVSLDUP, m)
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000647 DestName = getRegName(MI->getOperand(0).getReg());
Craig Topperacaba3b2018-03-12 16:43:11 +0000648 DecodeMOVSLDUPMask(getRegOperandNumElts(MI, 32, 0), ShuffleMask);
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000649 break;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000650
Igor Breger24cab0f2015-11-16 07:22:00 +0000651 CASE_MOVDUP(MOVSHDUP, r)
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000652 Src1Name = getRegName(MI->getOperand(NumOperands - 1).getReg());
Justin Bognercd1d5aa2016-08-17 20:30:52 +0000653 LLVM_FALLTHROUGH;
654
Igor Breger1f782962015-11-19 08:26:56 +0000655 CASE_MOVDUP(MOVSHDUP, m)
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000656 DestName = getRegName(MI->getOperand(0).getReg());
Craig Topperacaba3b2018-03-12 16:43:11 +0000657 DecodeMOVSHDUPMask(getRegOperandNumElts(MI, 32, 0), ShuffleMask);
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000658 break;
659
Igor Breger1f782962015-11-19 08:26:56 +0000660 CASE_MOVDUP(MOVDDUP, r)
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000661 Src1Name = getRegName(MI->getOperand(NumOperands - 1).getReg());
Justin Bognercd1d5aa2016-08-17 20:30:52 +0000662 LLVM_FALLTHROUGH;
663
Igor Breger1f782962015-11-19 08:26:56 +0000664 CASE_MOVDUP(MOVDDUP, m)
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000665 DestName = getRegName(MI->getOperand(0).getReg());
Craig Topperacaba3b2018-03-12 16:43:11 +0000666 DecodeMOVDDUPMask(getRegOperandNumElts(MI, 64, 0), ShuffleMask);
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000667 break;
668
669 case X86::PSLLDQri:
670 case X86::VPSLLDQri:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000671 case X86::VPSLLDQYri:
Simon Pilgrim643734c2016-06-09 22:03:15 +0000672 case X86::VPSLLDQZ128rr:
673 case X86::VPSLLDQZ256rr:
Craig Topperaa904d52017-12-10 17:42:39 +0000674 case X86::VPSLLDQZrr:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000675 Src1Name = getRegName(MI->getOperand(1).getReg());
Galina Kistanovab2c01162017-05-31 19:41:33 +0000676 LLVM_FALLTHROUGH;
Simon Pilgrim643734c2016-06-09 22:03:15 +0000677 case X86::VPSLLDQZ128rm:
678 case X86::VPSLLDQZ256rm:
Craig Topperaa904d52017-12-10 17:42:39 +0000679 case X86::VPSLLDQZrm:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000680 DestName = getRegName(MI->getOperand(0).getReg());
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000681 if (MI->getOperand(NumOperands - 1).isImm())
Craig Topperacaba3b2018-03-12 16:43:11 +0000682 DecodePSLLDQMask(getRegOperandNumElts(MI, 8, 0),
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000683 MI->getOperand(NumOperands - 1).getImm(),
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000684 ShuffleMask);
685 break;
686
687 case X86::PSRLDQri:
688 case X86::VPSRLDQri:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000689 case X86::VPSRLDQYri:
Simon Pilgrim643734c2016-06-09 22:03:15 +0000690 case X86::VPSRLDQZ128rr:
691 case X86::VPSRLDQZ256rr:
Craig Topperaa904d52017-12-10 17:42:39 +0000692 case X86::VPSRLDQZrr:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000693 Src1Name = getRegName(MI->getOperand(1).getReg());
Galina Kistanovab2c01162017-05-31 19:41:33 +0000694 LLVM_FALLTHROUGH;
Simon Pilgrim643734c2016-06-09 22:03:15 +0000695 case X86::VPSRLDQZ128rm:
696 case X86::VPSRLDQZ256rm:
Craig Topperaa904d52017-12-10 17:42:39 +0000697 case X86::VPSRLDQZrm:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000698 DestName = getRegName(MI->getOperand(0).getReg());
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000699 if (MI->getOperand(NumOperands - 1).isImm())
Craig Topperacaba3b2018-03-12 16:43:11 +0000700 DecodePSRLDQMask(getRegOperandNumElts(MI, 8, 0),
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000701 MI->getOperand(NumOperands - 1).getImm(),
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000702 ShuffleMask);
703 break;
704
Craig Topper7a299302016-06-09 07:06:38 +0000705 CASE_SHUF(PALIGNR, rri)
Craig Topper89c17612016-06-10 04:48:05 +0000706 Src1Name = getRegName(MI->getOperand(NumOperands - 2).getReg());
707 RegForm = true;
Justin Bognercd1d5aa2016-08-17 20:30:52 +0000708 LLVM_FALLTHROUGH;
709
Craig Topper7a299302016-06-09 07:06:38 +0000710 CASE_SHUF(PALIGNR, rmi)
Craig Topper89c17612016-06-10 04:48:05 +0000711 Src2Name = getRegName(MI->getOperand(NumOperands-(RegForm?3:7)).getReg());
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000712 DestName = getRegName(MI->getOperand(0).getReg());
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000713 if (MI->getOperand(NumOperands - 1).isImm())
Craig Topperacaba3b2018-03-12 16:43:11 +0000714 DecodePALIGNRMask(getRegOperandNumElts(MI, 8, 0),
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000715 MI->getOperand(NumOperands - 1).getImm(),
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000716 ShuffleMask);
717 break;
718
Craig Topperb084c902016-10-22 06:51:56 +0000719 CASE_AVX512_INS_COMMON(ALIGNQ, Z, rri)
720 CASE_AVX512_INS_COMMON(ALIGNQ, Z256, rri)
721 CASE_AVX512_INS_COMMON(ALIGNQ, Z128, rri)
722 Src1Name = getRegName(MI->getOperand(NumOperands - 2).getReg());
723 RegForm = true;
724 LLVM_FALLTHROUGH;
725
726 CASE_AVX512_INS_COMMON(ALIGNQ, Z, rmi)
727 CASE_AVX512_INS_COMMON(ALIGNQ, Z256, rmi)
728 CASE_AVX512_INS_COMMON(ALIGNQ, Z128, rmi)
729 Src2Name = getRegName(MI->getOperand(NumOperands-(RegForm?3:7)).getReg());
730 DestName = getRegName(MI->getOperand(0).getReg());
731 if (MI->getOperand(NumOperands - 1).isImm())
Craig Topperacaba3b2018-03-12 16:43:11 +0000732 DecodeVALIGNMask(getRegOperandNumElts(MI, 64, 0),
Craig Topperb084c902016-10-22 06:51:56 +0000733 MI->getOperand(NumOperands - 1).getImm(),
734 ShuffleMask);
735 break;
736
737 CASE_AVX512_INS_COMMON(ALIGND, Z, rri)
738 CASE_AVX512_INS_COMMON(ALIGND, Z256, rri)
739 CASE_AVX512_INS_COMMON(ALIGND, Z128, rri)
740 Src1Name = getRegName(MI->getOperand(NumOperands - 2).getReg());
741 RegForm = true;
742 LLVM_FALLTHROUGH;
743
744 CASE_AVX512_INS_COMMON(ALIGND, Z, rmi)
745 CASE_AVX512_INS_COMMON(ALIGND, Z256, rmi)
746 CASE_AVX512_INS_COMMON(ALIGND, Z128, rmi)
747 Src2Name = getRegName(MI->getOperand(NumOperands-(RegForm?3:7)).getReg());
748 DestName = getRegName(MI->getOperand(0).getReg());
749 if (MI->getOperand(NumOperands - 1).isImm())
Craig Topperacaba3b2018-03-12 16:43:11 +0000750 DecodeVALIGNMask(getRegOperandNumElts(MI, 32, 0),
Craig Topperb084c902016-10-22 06:51:56 +0000751 MI->getOperand(NumOperands - 1).getImm(),
752 ShuffleMask);
753 break;
754
Craig Topper01f53b12016-06-03 05:31:00 +0000755 CASE_SHUF(PSHUFD, ri)
Craig Topper6f7288d2016-06-09 07:49:08 +0000756 Src1Name = getRegName(MI->getOperand(NumOperands - 2).getReg());
Justin Bognercd1d5aa2016-08-17 20:30:52 +0000757 LLVM_FALLTHROUGH;
758
Craig Topper01f53b12016-06-03 05:31:00 +0000759 CASE_SHUF(PSHUFD, mi)
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000760 DestName = getRegName(MI->getOperand(0).getReg());
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000761 if (MI->getOperand(NumOperands - 1).isImm())
Craig Topperacaba3b2018-03-12 16:43:11 +0000762 DecodePSHUFMask(getRegOperandNumElts(MI, 32, 0), 32,
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000763 MI->getOperand(NumOperands - 1).getImm(),
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000764 ShuffleMask);
765 break;
766
Craig Topper01f53b12016-06-03 05:31:00 +0000767 CASE_SHUF(PSHUFHW, ri)
Craig Topper6f7288d2016-06-09 07:49:08 +0000768 Src1Name = getRegName(MI->getOperand(NumOperands - 2).getReg());
Justin Bognercd1d5aa2016-08-17 20:30:52 +0000769 LLVM_FALLTHROUGH;
770
Craig Topper01f53b12016-06-03 05:31:00 +0000771 CASE_SHUF(PSHUFHW, mi)
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000772 DestName = getRegName(MI->getOperand(0).getReg());
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000773 if (MI->getOperand(NumOperands - 1).isImm())
Craig Topperacaba3b2018-03-12 16:43:11 +0000774 DecodePSHUFHWMask(getRegOperandNumElts(MI, 16, 0),
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000775 MI->getOperand(NumOperands - 1).getImm(),
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000776 ShuffleMask);
777 break;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000778
Craig Topper01f53b12016-06-03 05:31:00 +0000779 CASE_SHUF(PSHUFLW, ri)
Craig Topper6f7288d2016-06-09 07:49:08 +0000780 Src1Name = getRegName(MI->getOperand(NumOperands - 2).getReg());
Justin Bognercd1d5aa2016-08-17 20:30:52 +0000781 LLVM_FALLTHROUGH;
782
Craig Topper01f53b12016-06-03 05:31:00 +0000783 CASE_SHUF(PSHUFLW, mi)
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000784 DestName = getRegName(MI->getOperand(0).getReg());
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000785 if (MI->getOperand(NumOperands - 1).isImm())
Craig Topperacaba3b2018-03-12 16:43:11 +0000786 DecodePSHUFLWMask(getRegOperandNumElts(MI, 16, 0),
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000787 MI->getOperand(NumOperands - 1).getImm(),
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000788 ShuffleMask);
789 break;
790
Simon Pilgrimf8f86ab2015-09-13 11:28:45 +0000791 case X86::MMX_PSHUFWri:
792 Src1Name = getRegName(MI->getOperand(1).getReg());
Justin Bognercd1d5aa2016-08-17 20:30:52 +0000793 LLVM_FALLTHROUGH;
794
Simon Pilgrimf8f86ab2015-09-13 11:28:45 +0000795 case X86::MMX_PSHUFWmi:
796 DestName = getRegName(MI->getOperand(0).getReg());
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000797 if (MI->getOperand(NumOperands - 1).isImm())
Craig Topperacaba3b2018-03-12 16:43:11 +0000798 DecodePSHUFMask(4, 16, MI->getOperand(NumOperands - 1).getImm(),
Simon Pilgrimf8f86ab2015-09-13 11:28:45 +0000799 ShuffleMask);
800 break;
801
802 case X86::PSWAPDrr:
803 Src1Name = getRegName(MI->getOperand(1).getReg());
Justin Bognercd1d5aa2016-08-17 20:30:52 +0000804 LLVM_FALLTHROUGH;
805
Simon Pilgrimf8f86ab2015-09-13 11:28:45 +0000806 case X86::PSWAPDrm:
807 DestName = getRegName(MI->getOperand(0).getReg());
Craig Topperacaba3b2018-03-12 16:43:11 +0000808 DecodePSWAPMask(2, ShuffleMask);
Simon Pilgrimf8f86ab2015-09-13 11:28:45 +0000809 break;
810
Simon Pilgrim8483df62015-11-17 22:35:45 +0000811 CASE_UNPCK(PUNPCKHBW, r)
Simon Pilgrimf8f86ab2015-09-13 11:28:45 +0000812 case X86::MMX_PUNPCKHBWirr:
Craig Topper89c17612016-06-10 04:48:05 +0000813 Src2Name = getRegName(MI->getOperand(NumOperands - 1).getReg());
814 RegForm = true;
Justin Bognercd1d5aa2016-08-17 20:30:52 +0000815 LLVM_FALLTHROUGH;
816
Simon Pilgrim8483df62015-11-17 22:35:45 +0000817 CASE_UNPCK(PUNPCKHBW, m)
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000818 case X86::MMX_PUNPCKHBWirm:
Craig Topper89c17612016-06-10 04:48:05 +0000819 Src1Name = getRegName(MI->getOperand(NumOperands-(RegForm?2:6)).getReg());
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000820 DestName = getRegName(MI->getOperand(0).getReg());
Craig Topperacaba3b2018-03-12 16:43:11 +0000821 DecodeUNPCKHMask(getRegOperandNumElts(MI, 8, 0), 8, ShuffleMask);
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000822 break;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000823
Simon Pilgrim8483df62015-11-17 22:35:45 +0000824 CASE_UNPCK(PUNPCKHWD, r)
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000825 case X86::MMX_PUNPCKHWDirr:
Craig Topper89c17612016-06-10 04:48:05 +0000826 Src2Name = getRegName(MI->getOperand(NumOperands - 1).getReg());
827 RegForm = true;
Justin Bognercd1d5aa2016-08-17 20:30:52 +0000828 LLVM_FALLTHROUGH;
829
Simon Pilgrim8483df62015-11-17 22:35:45 +0000830 CASE_UNPCK(PUNPCKHWD, m)
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000831 case X86::MMX_PUNPCKHWDirm:
Craig Topper89c17612016-06-10 04:48:05 +0000832 Src1Name = getRegName(MI->getOperand(NumOperands-(RegForm?2:6)).getReg());
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000833 DestName = getRegName(MI->getOperand(0).getReg());
Craig Topperacaba3b2018-03-12 16:43:11 +0000834 DecodeUNPCKHMask(getRegOperandNumElts(MI, 16, 0), 16, ShuffleMask);
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000835 break;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000836
Simon Pilgrim8483df62015-11-17 22:35:45 +0000837 CASE_UNPCK(PUNPCKHDQ, r)
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000838 case X86::MMX_PUNPCKHDQirr:
Craig Topper89c17612016-06-10 04:48:05 +0000839 Src2Name = getRegName(MI->getOperand(NumOperands - 1).getReg());
840 RegForm = true;
Justin Bognercd1d5aa2016-08-17 20:30:52 +0000841 LLVM_FALLTHROUGH;
842
Simon Pilgrim8483df62015-11-17 22:35:45 +0000843 CASE_UNPCK(PUNPCKHDQ, m)
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000844 case X86::MMX_PUNPCKHDQirm:
Craig Topper89c17612016-06-10 04:48:05 +0000845 Src1Name = getRegName(MI->getOperand(NumOperands-(RegForm?2:6)).getReg());
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000846 DestName = getRegName(MI->getOperand(0).getReg());
Craig Topperacaba3b2018-03-12 16:43:11 +0000847 DecodeUNPCKHMask(getRegOperandNumElts(MI, 32, 0), 32, ShuffleMask);
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000848 break;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000849
Simon Pilgrim8483df62015-11-17 22:35:45 +0000850 CASE_UNPCK(PUNPCKHQDQ, r)
Craig Topper89c17612016-06-10 04:48:05 +0000851 Src2Name = getRegName(MI->getOperand(NumOperands - 1).getReg());
852 RegForm = true;
Justin Bognercd1d5aa2016-08-17 20:30:52 +0000853 LLVM_FALLTHROUGH;
854
Simon Pilgrim8483df62015-11-17 22:35:45 +0000855 CASE_UNPCK(PUNPCKHQDQ, m)
Craig Topper89c17612016-06-10 04:48:05 +0000856 Src1Name = getRegName(MI->getOperand(NumOperands-(RegForm?2:6)).getReg());
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000857 DestName = getRegName(MI->getOperand(0).getReg());
Craig Topperacaba3b2018-03-12 16:43:11 +0000858 DecodeUNPCKHMask(getRegOperandNumElts(MI, 64, 0), 64, ShuffleMask);
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000859 break;
860
Simon Pilgrim8483df62015-11-17 22:35:45 +0000861 CASE_UNPCK(PUNPCKLBW, r)
Simon Pilgrimf8f86ab2015-09-13 11:28:45 +0000862 case X86::MMX_PUNPCKLBWirr:
Craig Topper89c17612016-06-10 04:48:05 +0000863 Src2Name = getRegName(MI->getOperand(NumOperands - 1).getReg());
864 RegForm = true;
Justin Bognercd1d5aa2016-08-17 20:30:52 +0000865 LLVM_FALLTHROUGH;
866
Simon Pilgrim8483df62015-11-17 22:35:45 +0000867 CASE_UNPCK(PUNPCKLBW, m)
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000868 case X86::MMX_PUNPCKLBWirm:
Craig Topper89c17612016-06-10 04:48:05 +0000869 Src1Name = getRegName(MI->getOperand(NumOperands-(RegForm?2:6)).getReg());
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000870 DestName = getRegName(MI->getOperand(0).getReg());
Craig Topperacaba3b2018-03-12 16:43:11 +0000871 DecodeUNPCKLMask(getRegOperandNumElts(MI, 8, 0), 8, ShuffleMask);
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000872 break;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000873
Simon Pilgrim8483df62015-11-17 22:35:45 +0000874 CASE_UNPCK(PUNPCKLWD, r)
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000875 case X86::MMX_PUNPCKLWDirr:
Craig Topper89c17612016-06-10 04:48:05 +0000876 Src2Name = getRegName(MI->getOperand(NumOperands - 1).getReg());
877 RegForm = true;
Justin Bognercd1d5aa2016-08-17 20:30:52 +0000878 LLVM_FALLTHROUGH;
879
Simon Pilgrim8483df62015-11-17 22:35:45 +0000880 CASE_UNPCK(PUNPCKLWD, m)
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000881 case X86::MMX_PUNPCKLWDirm:
Craig Topper89c17612016-06-10 04:48:05 +0000882 Src1Name = getRegName(MI->getOperand(NumOperands-(RegForm?2:6)).getReg());
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000883 DestName = getRegName(MI->getOperand(0).getReg());
Craig Topperacaba3b2018-03-12 16:43:11 +0000884 DecodeUNPCKLMask(getRegOperandNumElts(MI, 16, 0), 16, ShuffleMask);
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000885 break;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000886
Simon Pilgrim8483df62015-11-17 22:35:45 +0000887 CASE_UNPCK(PUNPCKLDQ, r)
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000888 case X86::MMX_PUNPCKLDQirr:
Craig Topper89c17612016-06-10 04:48:05 +0000889 Src2Name = getRegName(MI->getOperand(NumOperands - 1).getReg());
890 RegForm = true;
Justin Bognercd1d5aa2016-08-17 20:30:52 +0000891 LLVM_FALLTHROUGH;
892
Simon Pilgrim8483df62015-11-17 22:35:45 +0000893 CASE_UNPCK(PUNPCKLDQ, m)
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000894 case X86::MMX_PUNPCKLDQirm:
Craig Topper89c17612016-06-10 04:48:05 +0000895 Src1Name = getRegName(MI->getOperand(NumOperands-(RegForm?2:6)).getReg());
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000896 DestName = getRegName(MI->getOperand(0).getReg());
Craig Topperacaba3b2018-03-12 16:43:11 +0000897 DecodeUNPCKLMask(getRegOperandNumElts(MI, 32, 0), 32, ShuffleMask);
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000898 break;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000899
Simon Pilgrim8483df62015-11-17 22:35:45 +0000900 CASE_UNPCK(PUNPCKLQDQ, r)
Craig Topper89c17612016-06-10 04:48:05 +0000901 Src2Name = getRegName(MI->getOperand(NumOperands - 1).getReg());
902 RegForm = true;
Justin Bognercd1d5aa2016-08-17 20:30:52 +0000903 LLVM_FALLTHROUGH;
904
Simon Pilgrim8483df62015-11-17 22:35:45 +0000905 CASE_UNPCK(PUNPCKLQDQ, m)
Craig Topper89c17612016-06-10 04:48:05 +0000906 Src1Name = getRegName(MI->getOperand(NumOperands-(RegForm?2:6)).getReg());
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000907 DestName = getRegName(MI->getOperand(0).getReg());
Craig Topperacaba3b2018-03-12 16:43:11 +0000908 DecodeUNPCKLMask(getRegOperandNumElts(MI, 64, 0), 64, ShuffleMask);
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000909 break;
910
Craig Topper01f53b12016-06-03 05:31:00 +0000911 CASE_SHUF(SHUFPD, rri)
Craig Topper89c17612016-06-10 04:48:05 +0000912 Src2Name = getRegName(MI->getOperand(NumOperands - 2).getReg());
913 RegForm = true;
Justin Bognercd1d5aa2016-08-17 20:30:52 +0000914 LLVM_FALLTHROUGH;
915
Craig Topper01f53b12016-06-03 05:31:00 +0000916 CASE_SHUF(SHUFPD, rmi)
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000917 if (MI->getOperand(NumOperands - 1).isImm())
Craig Topperacaba3b2018-03-12 16:43:11 +0000918 DecodeSHUFPMask(getRegOperandNumElts(MI, 64, 0), 64,
919 MI->getOperand(NumOperands - 1).getImm(), ShuffleMask);
Craig Topper89c17612016-06-10 04:48:05 +0000920 Src1Name = getRegName(MI->getOperand(NumOperands-(RegForm?3:7)).getReg());
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000921 DestName = getRegName(MI->getOperand(0).getReg());
922 break;
923
Craig Topper01f53b12016-06-03 05:31:00 +0000924 CASE_SHUF(SHUFPS, rri)
Craig Topper89c17612016-06-10 04:48:05 +0000925 Src2Name = getRegName(MI->getOperand(NumOperands - 2).getReg());
926 RegForm = true;
Justin Bognercd1d5aa2016-08-17 20:30:52 +0000927 LLVM_FALLTHROUGH;
928
Craig Topper01f53b12016-06-03 05:31:00 +0000929 CASE_SHUF(SHUFPS, rmi)
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000930 if (MI->getOperand(NumOperands - 1).isImm())
Craig Topperacaba3b2018-03-12 16:43:11 +0000931 DecodeSHUFPMask(getRegOperandNumElts(MI, 32, 0), 32,
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000932 MI->getOperand(NumOperands - 1).getImm(),
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000933 ShuffleMask);
Craig Topper89c17612016-06-10 04:48:05 +0000934 Src1Name = getRegName(MI->getOperand(NumOperands-(RegForm?3:7)).getReg());
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000935 DestName = getRegName(MI->getOperand(0).getReg());
936 break;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000937
Igor Breger24cab0f2015-11-16 07:22:00 +0000938 CASE_VSHUF(64X2, r)
Simon Pilgrimd3869412016-06-11 11:18:38 +0000939 Src2Name = getRegName(MI->getOperand(NumOperands - 2).getReg());
940 RegForm = true;
Justin Bognercd1d5aa2016-08-17 20:30:52 +0000941 LLVM_FALLTHROUGH;
942
Igor Breger24cab0f2015-11-16 07:22:00 +0000943 CASE_VSHUF(64X2, m)
Craig Topperacaba3b2018-03-12 16:43:11 +0000944 decodeVSHUF64x2FamilyMask(getRegOperandNumElts(MI, 64, 0), 64,
Simon Pilgrimd3869412016-06-11 11:18:38 +0000945 MI->getOperand(NumOperands - 1).getImm(),
Igor Bregerd7bae452015-10-15 13:29:07 +0000946 ShuffleMask);
Simon Pilgrimd3869412016-06-11 11:18:38 +0000947 Src1Name = getRegName(MI->getOperand(NumOperands-(RegForm?3:7)).getReg());
Igor Bregerd7bae452015-10-15 13:29:07 +0000948 DestName = getRegName(MI->getOperand(0).getReg());
Igor Bregerd7bae452015-10-15 13:29:07 +0000949 break;
Simon Pilgrimd3869412016-06-11 11:18:38 +0000950
951 CASE_VSHUF(32X4, r)
952 Src2Name = getRegName(MI->getOperand(NumOperands - 2).getReg());
953 RegForm = true;
Justin Bognercd1d5aa2016-08-17 20:30:52 +0000954 LLVM_FALLTHROUGH;
955
Simon Pilgrimd3869412016-06-11 11:18:38 +0000956 CASE_VSHUF(32X4, m)
Craig Topperacaba3b2018-03-12 16:43:11 +0000957 decodeVSHUF64x2FamilyMask(getRegOperandNumElts(MI, 32, 0), 32,
Simon Pilgrimd3869412016-06-11 11:18:38 +0000958 MI->getOperand(NumOperands - 1).getImm(),
959 ShuffleMask);
960 Src1Name = getRegName(MI->getOperand(NumOperands-(RegForm?3:7)).getReg());
961 DestName = getRegName(MI->getOperand(0).getReg());
962 break;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000963
Simon Pilgrim8483df62015-11-17 22:35:45 +0000964 CASE_UNPCK(UNPCKLPD, r)
Craig Topper89c17612016-06-10 04:48:05 +0000965 Src2Name = getRegName(MI->getOperand(NumOperands - 1).getReg());
966 RegForm = true;
Justin Bognercd1d5aa2016-08-17 20:30:52 +0000967 LLVM_FALLTHROUGH;
968
Simon Pilgrim8483df62015-11-17 22:35:45 +0000969 CASE_UNPCK(UNPCKLPD, m)
Craig Topperacaba3b2018-03-12 16:43:11 +0000970 DecodeUNPCKLMask(getRegOperandNumElts(MI, 64, 0), 64, ShuffleMask);
Craig Topper89c17612016-06-10 04:48:05 +0000971 Src1Name = getRegName(MI->getOperand(NumOperands-(RegForm?2:6)).getReg());
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000972 DestName = getRegName(MI->getOperand(0).getReg());
973 break;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000974
Simon Pilgrim8483df62015-11-17 22:35:45 +0000975 CASE_UNPCK(UNPCKLPS, r)
Craig Topper89c17612016-06-10 04:48:05 +0000976 Src2Name = getRegName(MI->getOperand(NumOperands - 1).getReg());
977 RegForm = true;
Justin Bognercd1d5aa2016-08-17 20:30:52 +0000978 LLVM_FALLTHROUGH;
979
Simon Pilgrim8483df62015-11-17 22:35:45 +0000980 CASE_UNPCK(UNPCKLPS, m)
Craig Topperacaba3b2018-03-12 16:43:11 +0000981 DecodeUNPCKLMask(getRegOperandNumElts(MI, 32, 0), 32, ShuffleMask);
Craig Topper89c17612016-06-10 04:48:05 +0000982 Src1Name = getRegName(MI->getOperand(NumOperands-(RegForm?2:6)).getReg());
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000983 DestName = getRegName(MI->getOperand(0).getReg());
984 break;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000985
Simon Pilgrim8483df62015-11-17 22:35:45 +0000986 CASE_UNPCK(UNPCKHPD, r)
Craig Topper89c17612016-06-10 04:48:05 +0000987 Src2Name = getRegName(MI->getOperand(NumOperands - 1).getReg());
988 RegForm = true;
Justin Bognercd1d5aa2016-08-17 20:30:52 +0000989 LLVM_FALLTHROUGH;
990
Simon Pilgrim8483df62015-11-17 22:35:45 +0000991 CASE_UNPCK(UNPCKHPD, m)
Craig Topperacaba3b2018-03-12 16:43:11 +0000992 DecodeUNPCKHMask(getRegOperandNumElts(MI, 64, 0), 64, ShuffleMask);
Craig Topper89c17612016-06-10 04:48:05 +0000993 Src1Name = getRegName(MI->getOperand(NumOperands-(RegForm?2:6)).getReg());
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000994 DestName = getRegName(MI->getOperand(0).getReg());
995 break;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000996
Simon Pilgrim8483df62015-11-17 22:35:45 +0000997 CASE_UNPCK(UNPCKHPS, r)
Craig Topper89c17612016-06-10 04:48:05 +0000998 Src2Name = getRegName(MI->getOperand(NumOperands - 1).getReg());
999 RegForm = true;
Justin Bognercd1d5aa2016-08-17 20:30:52 +00001000 LLVM_FALLTHROUGH;
1001
Simon Pilgrim8483df62015-11-17 22:35:45 +00001002 CASE_UNPCK(UNPCKHPS, m)
Craig Topperacaba3b2018-03-12 16:43:11 +00001003 DecodeUNPCKHMask(getRegOperandNumElts(MI, 32, 0), 32, ShuffleMask);
Craig Topper89c17612016-06-10 04:48:05 +00001004 Src1Name = getRegName(MI->getOperand(NumOperands-(RegForm?2:6)).getReg());
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +00001005 DestName = getRegName(MI->getOperand(0).getReg());
1006 break;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +00001007
Simon Pilgrim5080e7f2016-07-03 18:02:43 +00001008 CASE_VPERMILPI(PERMILPS, r)
Simon Pilgrim6ce35dd2016-05-11 18:53:44 +00001009 Src1Name = getRegName(MI->getOperand(NumOperands - 2).getReg());
Justin Bognercd1d5aa2016-08-17 20:30:52 +00001010 LLVM_FALLTHROUGH;
1011
Simon Pilgrim5080e7f2016-07-03 18:02:43 +00001012 CASE_VPERMILPI(PERMILPS, m)
Simon Pilgrim3016d9e2016-05-11 17:36:32 +00001013 if (MI->getOperand(NumOperands - 1).isImm())
Craig Topperacaba3b2018-03-12 16:43:11 +00001014 DecodePSHUFMask(getRegOperandNumElts(MI, 32, 0), 32,
Simon Pilgrim3016d9e2016-05-11 17:36:32 +00001015 MI->getOperand(NumOperands - 1).getImm(),
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +00001016 ShuffleMask);
1017 DestName = getRegName(MI->getOperand(0).getReg());
1018 break;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +00001019
Simon Pilgrim5080e7f2016-07-03 18:02:43 +00001020 CASE_VPERMILPI(PERMILPD, r)
Simon Pilgrim6ce35dd2016-05-11 18:53:44 +00001021 Src1Name = getRegName(MI->getOperand(NumOperands - 2).getReg());
Justin Bognercd1d5aa2016-08-17 20:30:52 +00001022 LLVM_FALLTHROUGH;
1023
Simon Pilgrim5080e7f2016-07-03 18:02:43 +00001024 CASE_VPERMILPI(PERMILPD, m)
Simon Pilgrim3016d9e2016-05-11 17:36:32 +00001025 if (MI->getOperand(NumOperands - 1).isImm())
Craig Topperacaba3b2018-03-12 16:43:11 +00001026 DecodePSHUFMask(getRegOperandNumElts(MI, 64, 0), 64,
Simon Pilgrim3016d9e2016-05-11 17:36:32 +00001027 MI->getOperand(NumOperands - 1).getImm(),
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +00001028 ShuffleMask);
1029 DestName = getRegName(MI->getOperand(0).getReg());
1030 break;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +00001031
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +00001032 case X86::VPERM2F128rr:
1033 case X86::VPERM2I128rr:
1034 Src2Name = getRegName(MI->getOperand(2).getReg());
Justin Bognercd1d5aa2016-08-17 20:30:52 +00001035 LLVM_FALLTHROUGH;
1036
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +00001037 case X86::VPERM2F128rm:
1038 case X86::VPERM2I128rm:
1039 // For instruction comments purpose, assume the 256-bit vector is v4i64.
Simon Pilgrim3016d9e2016-05-11 17:36:32 +00001040 if (MI->getOperand(NumOperands - 1).isImm())
Craig Topperacaba3b2018-03-12 16:43:11 +00001041 DecodeVPERM2X128Mask(4, MI->getOperand(NumOperands - 1).getImm(),
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +00001042 ShuffleMask);
1043 Src1Name = getRegName(MI->getOperand(1).getReg());
1044 DestName = getRegName(MI->getOperand(0).getReg());
1045 break;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +00001046
Simon Pilgrima0d73832016-07-03 18:27:37 +00001047 CASE_VPERM(PERMPD, r)
Craig Topper200d2372016-06-10 05:12:40 +00001048 Src1Name = getRegName(MI->getOperand(NumOperands - 2).getReg());
Justin Bognercd1d5aa2016-08-17 20:30:52 +00001049 LLVM_FALLTHROUGH;
1050
Simon Pilgrima0d73832016-07-03 18:27:37 +00001051 CASE_VPERM(PERMPD, m)
Simon Pilgrim3016d9e2016-05-11 17:36:32 +00001052 if (MI->getOperand(NumOperands - 1).isImm())
Craig Topperacaba3b2018-03-12 16:43:11 +00001053 DecodeVPERMMask(getRegOperandNumElts(MI, 64, 0),
Simon Pilgrima0d73832016-07-03 18:27:37 +00001054 MI->getOperand(NumOperands - 1).getImm(),
1055 ShuffleMask);
1056 DestName = getRegName(MI->getOperand(0).getReg());
1057 break;
1058
1059 CASE_VPERM(PERMQ, r)
1060 Src1Name = getRegName(MI->getOperand(NumOperands - 2).getReg());
Justin Bognercd1d5aa2016-08-17 20:30:52 +00001061 LLVM_FALLTHROUGH;
1062
Simon Pilgrima0d73832016-07-03 18:27:37 +00001063 CASE_VPERM(PERMQ, m)
1064 if (MI->getOperand(NumOperands - 1).isImm())
Craig Topperacaba3b2018-03-12 16:43:11 +00001065 DecodeVPERMMask(getRegOperandNumElts(MI, 64, 0),
Simon Pilgrima0d73832016-07-03 18:27:37 +00001066 MI->getOperand(NumOperands - 1).getImm(),
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +00001067 ShuffleMask);
1068 DestName = getRegName(MI->getOperand(0).getReg());
1069 break;
1070
1071 case X86::MOVSDrr:
1072 case X86::VMOVSDrr:
Simon Pilgrimf5c23ad2016-02-01 22:26:28 +00001073 case X86::VMOVSDZrr:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +00001074 Src2Name = getRegName(MI->getOperand(2).getReg());
1075 Src1Name = getRegName(MI->getOperand(1).getReg());
Justin Bognercd1d5aa2016-08-17 20:30:52 +00001076 LLVM_FALLTHROUGH;
1077
Craig Topper8582ecd2019-06-18 03:23:11 +00001078 case X86::MOVSDrm_alt:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +00001079 case X86::MOVSDrm:
Craig Topper8582ecd2019-06-18 03:23:11 +00001080 case X86::VMOVSDrm_alt:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +00001081 case X86::VMOVSDrm:
Simon Pilgrimf5c23ad2016-02-01 22:26:28 +00001082 case X86::VMOVSDZrm:
Craig Topper8582ecd2019-06-18 03:23:11 +00001083 case X86::VMOVSDZrm_alt:
Craig Topperacaba3b2018-03-12 16:43:11 +00001084 DecodeScalarMoveMask(2, nullptr == Src2Name, ShuffleMask);
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +00001085 DestName = getRegName(MI->getOperand(0).getReg());
1086 break;
Simon Pilgrimd5a15442015-11-21 13:04:42 +00001087
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +00001088 case X86::MOVSSrr:
1089 case X86::VMOVSSrr:
Simon Pilgrimf5c23ad2016-02-01 22:26:28 +00001090 case X86::VMOVSSZrr:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +00001091 Src2Name = getRegName(MI->getOperand(2).getReg());
1092 Src1Name = getRegName(MI->getOperand(1).getReg());
Justin Bognercd1d5aa2016-08-17 20:30:52 +00001093 LLVM_FALLTHROUGH;
1094
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +00001095 case X86::MOVSSrm:
Craig Topper8582ecd2019-06-18 03:23:11 +00001096 case X86::MOVSSrm_alt:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +00001097 case X86::VMOVSSrm:
Craig Topper8582ecd2019-06-18 03:23:11 +00001098 case X86::VMOVSSrm_alt:
Simon Pilgrimf5c23ad2016-02-01 22:26:28 +00001099 case X86::VMOVSSZrm:
Craig Topper8582ecd2019-06-18 03:23:11 +00001100 case X86::VMOVSSZrm_alt:
Craig Topperacaba3b2018-03-12 16:43:11 +00001101 DecodeScalarMoveMask(4, nullptr == Src2Name, ShuffleMask);
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +00001102 DestName = getRegName(MI->getOperand(0).getReg());
1103 break;
1104
1105 case X86::MOVPQI2QIrr:
Simon Pilgrim3e0c0222015-12-13 12:49:48 +00001106 case X86::MOVZPQILo2PQIrr:
1107 case X86::VMOVPQI2QIrr:
Craig Topperb76ed822018-03-10 06:05:13 +00001108 case X86::VMOVPQI2QIZrr:
Simon Pilgrim3e0c0222015-12-13 12:49:48 +00001109 case X86::VMOVZPQILo2PQIrr:
1110 case X86::VMOVZPQILo2PQIZrr:
1111 Src1Name = getRegName(MI->getOperand(1).getReg());
Justin Bognercd1d5aa2016-08-17 20:30:52 +00001112 LLVM_FALLTHROUGH;
1113
Simon Pilgrim3e0c0222015-12-13 12:49:48 +00001114 case X86::MOVQI2PQIrm:
Simon Pilgrim3e0c0222015-12-13 12:49:48 +00001115 case X86::VMOVQI2PQIrm:
Simon Pilgrim96fe4ef2016-02-02 13:32:56 +00001116 case X86::VMOVQI2PQIZrm:
Craig Topperacaba3b2018-03-12 16:43:11 +00001117 DecodeZeroMoveLowMask(2, ShuffleMask);
Simon Pilgrim3e0c0222015-12-13 12:49:48 +00001118 DestName = getRegName(MI->getOperand(0).getReg());
1119 break;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +00001120
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +00001121 case X86::MOVDI2PDIrm:
1122 case X86::VMOVDI2PDIrm:
Simon Pilgrim5be17b62016-02-01 23:04:05 +00001123 case X86::VMOVDI2PDIZrm:
Craig Topperacaba3b2018-03-12 16:43:11 +00001124 DecodeZeroMoveLowMask(4, ShuffleMask);
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +00001125 DestName = getRegName(MI->getOperand(0).getReg());
1126 break;
1127
Simon Pilgrimd85cae32015-07-06 20:46:41 +00001128 case X86::EXTRQI:
1129 if (MI->getOperand(2).isImm() &&
1130 MI->getOperand(3).isImm())
Craig Topperacaba3b2018-03-12 16:43:11 +00001131 DecodeEXTRQIMask(16, 8, MI->getOperand(2).getImm(),
1132 MI->getOperand(3).getImm(), ShuffleMask);
Simon Pilgrimd85cae32015-07-06 20:46:41 +00001133
1134 DestName = getRegName(MI->getOperand(0).getReg());
1135 Src1Name = getRegName(MI->getOperand(1).getReg());
1136 break;
1137
1138 case X86::INSERTQI:
1139 if (MI->getOperand(3).isImm() &&
1140 MI->getOperand(4).isImm())
Craig Topperacaba3b2018-03-12 16:43:11 +00001141 DecodeINSERTQIMask(16, 8, MI->getOperand(3).getImm(),
1142 MI->getOperand(4).getImm(), ShuffleMask);
Simon Pilgrimd85cae32015-07-06 20:46:41 +00001143
1144 DestName = getRegName(MI->getOperand(0).getReg());
1145 Src1Name = getRegName(MI->getOperand(1).getReg());
1146 Src2Name = getRegName(MI->getOperand(2).getReg());
1147 break;
1148
Simon Pilgrima76a8e52016-07-14 12:07:43 +00001149 case X86::VBROADCASTF128:
1150 case X86::VBROADCASTI128:
Craig Topperdde865a2016-10-15 16:26:07 +00001151 CASE_AVX512_INS_COMMON(BROADCASTF64X2, Z128, rm)
1152 CASE_AVX512_INS_COMMON(BROADCASTI64X2, Z128, rm)
Craig Topperacaba3b2018-03-12 16:43:11 +00001153 DecodeSubVectorBroadcast(4, 2, ShuffleMask);
Simon Pilgrima76a8e52016-07-14 12:07:43 +00001154 DestName = getRegName(MI->getOperand(0).getReg());
1155 break;
Craig Topperdde865a2016-10-15 16:26:07 +00001156 CASE_AVX512_INS_COMMON(BROADCASTF64X2, , rm)
1157 CASE_AVX512_INS_COMMON(BROADCASTI64X2, , rm)
Craig Topperacaba3b2018-03-12 16:43:11 +00001158 DecodeSubVectorBroadcast(8, 2, ShuffleMask);
Craig Topperdde865a2016-10-15 16:26:07 +00001159 DestName = getRegName(MI->getOperand(0).getReg());
1160 break;
1161 CASE_AVX512_INS_COMMON(BROADCASTF64X4, , rm)
1162 CASE_AVX512_INS_COMMON(BROADCASTI64X4, , 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, Z256, rm)
1167 CASE_AVX512_INS_COMMON(BROADCASTI32X4, Z256, rm)
Craig Topperacaba3b2018-03-12 16:43:11 +00001168 DecodeSubVectorBroadcast(8, 4, ShuffleMask);
Craig Topperdde865a2016-10-15 16:26:07 +00001169 DestName = getRegName(MI->getOperand(0).getReg());
1170 break;
1171 CASE_AVX512_INS_COMMON(BROADCASTF32X4, , rm)
1172 CASE_AVX512_INS_COMMON(BROADCASTI32X4, , rm)
Craig Topperacaba3b2018-03-12 16:43:11 +00001173 DecodeSubVectorBroadcast(16, 4, ShuffleMask);
Craig Topperdde865a2016-10-15 16:26:07 +00001174 DestName = getRegName(MI->getOperand(0).getReg());
1175 break;
1176 CASE_AVX512_INS_COMMON(BROADCASTF32X8, , rm)
1177 CASE_AVX512_INS_COMMON(BROADCASTI32X8, , rm)
Craig Topperacaba3b2018-03-12 16:43:11 +00001178 DecodeSubVectorBroadcast(16, 8, ShuffleMask);
Craig Topperdde865a2016-10-15 16:26:07 +00001179 DestName = getRegName(MI->getOperand(0).getReg());
1180 break;
Craig Topper6ce20bd2017-10-11 00:11:53 +00001181 CASE_AVX512_INS_COMMON(BROADCASTI32X2, Z128, r)
1182 Src1Name = getRegName(MI->getOperand(NumOperands - 1).getReg());
1183 LLVM_FALLTHROUGH;
1184 CASE_AVX512_INS_COMMON(BROADCASTI32X2, Z128, m)
Craig Topperacaba3b2018-03-12 16:43:11 +00001185 DecodeSubVectorBroadcast(4, 2, ShuffleMask);
Craig Topper6ce20bd2017-10-11 00:11:53 +00001186 DestName = getRegName(MI->getOperand(0).getReg());
1187 break;
Craig Topperdde865a2016-10-15 16:26:07 +00001188 CASE_AVX512_INS_COMMON(BROADCASTF32X2, Z256, r)
1189 CASE_AVX512_INS_COMMON(BROADCASTI32X2, Z256, r)
1190 Src1Name = getRegName(MI->getOperand(NumOperands - 1).getReg());
Galina Kistanovab2c01162017-05-31 19:41:33 +00001191 LLVM_FALLTHROUGH;
Craig Topperdde865a2016-10-15 16:26:07 +00001192 CASE_AVX512_INS_COMMON(BROADCASTF32X2, Z256, m)
1193 CASE_AVX512_INS_COMMON(BROADCASTI32X2, Z256, m)
Craig Topperacaba3b2018-03-12 16:43:11 +00001194 DecodeSubVectorBroadcast(8, 2, ShuffleMask);
Craig Topperdde865a2016-10-15 16:26:07 +00001195 DestName = getRegName(MI->getOperand(0).getReg());
1196 break;
1197 CASE_AVX512_INS_COMMON(BROADCASTF32X2, Z, r)
1198 CASE_AVX512_INS_COMMON(BROADCASTI32X2, Z, r)
1199 Src1Name = getRegName(MI->getOperand(NumOperands - 1).getReg());
Galina Kistanovab2c01162017-05-31 19:41:33 +00001200 LLVM_FALLTHROUGH;
Craig Topperdde865a2016-10-15 16:26:07 +00001201 CASE_AVX512_INS_COMMON(BROADCASTF32X2, Z, m)
1202 CASE_AVX512_INS_COMMON(BROADCASTI32X2, Z, m)
Craig Topperacaba3b2018-03-12 16:43:11 +00001203 DecodeSubVectorBroadcast(16, 2, ShuffleMask);
Craig Topperdde865a2016-10-15 16:26:07 +00001204 DestName = getRegName(MI->getOperand(0).getReg());
1205 break;
Simon Pilgrima76a8e52016-07-14 12:07:43 +00001206
Simon Pilgrim0acc32a2016-02-06 19:51:21 +00001207 CASE_PMOVZX(PMOVZXBW, r)
Craig Topperacaba3b2018-03-12 16:43:11 +00001208 Src1Name = getRegName(MI->getOperand(NumOperands - 1).getReg());
1209 LLVM_FALLTHROUGH;
1210 CASE_PMOVZX(PMOVZXBW, m)
Simon Pilgrima0444102019-05-26 16:00:35 +00001211 DecodeZeroExtendMask(8, 16, getRegOperandNumElts(MI, 16, 0), false,
1212 ShuffleMask);
Craig Topperacaba3b2018-03-12 16:43:11 +00001213 DestName = getRegName(MI->getOperand(0).getReg());
1214 break;
1215
Simon Pilgrim0acc32a2016-02-06 19:51:21 +00001216 CASE_PMOVZX(PMOVZXBD, r)
Craig Topperacaba3b2018-03-12 16:43:11 +00001217 Src1Name = getRegName(MI->getOperand(NumOperands - 1).getReg());
1218 LLVM_FALLTHROUGH;
1219 CASE_PMOVZX(PMOVZXBD, m)
Simon Pilgrima0444102019-05-26 16:00:35 +00001220 DecodeZeroExtendMask(8, 32, getRegOperandNumElts(MI, 32, 0), false,
1221 ShuffleMask);
Craig Topperacaba3b2018-03-12 16:43:11 +00001222 DestName = getRegName(MI->getOperand(0).getReg());
1223 break;
1224
Simon Pilgrim0acc32a2016-02-06 19:51:21 +00001225 CASE_PMOVZX(PMOVZXBQ, r)
Simon Pilgrim3016d9e2016-05-11 17:36:32 +00001226 Src1Name = getRegName(MI->getOperand(NumOperands - 1).getReg());
Justin Bognercd1d5aa2016-08-17 20:30:52 +00001227 LLVM_FALLTHROUGH;
Simon Pilgrim0acc32a2016-02-06 19:51:21 +00001228 CASE_PMOVZX(PMOVZXBQ, m)
Simon Pilgrima0444102019-05-26 16:00:35 +00001229 DecodeZeroExtendMask(8, 64, getRegOperandNumElts(MI, 64, 0), false,
1230 ShuffleMask);
Simon Pilgrime1b6db92016-02-06 16:33:42 +00001231 DestName = getRegName(MI->getOperand(0).getReg());
1232 break;
1233
Simon Pilgrim0acc32a2016-02-06 19:51:21 +00001234 CASE_PMOVZX(PMOVZXWD, r)
Craig Topperacaba3b2018-03-12 16:43:11 +00001235 Src1Name = getRegName(MI->getOperand(NumOperands - 1).getReg());
1236 LLVM_FALLTHROUGH;
1237 CASE_PMOVZX(PMOVZXWD, m)
Simon Pilgrima0444102019-05-26 16:00:35 +00001238 DecodeZeroExtendMask(16, 32, getRegOperandNumElts(MI, 32, 0), false,
1239 ShuffleMask);
Craig Topperacaba3b2018-03-12 16:43:11 +00001240 DestName = getRegName(MI->getOperand(0).getReg());
1241 break;
1242
Simon Pilgrim0acc32a2016-02-06 19:51:21 +00001243 CASE_PMOVZX(PMOVZXWQ, r)
Simon Pilgrim3016d9e2016-05-11 17:36:32 +00001244 Src1Name = getRegName(MI->getOperand(NumOperands - 1).getReg());
Justin Bognercd1d5aa2016-08-17 20:30:52 +00001245 LLVM_FALLTHROUGH;
Simon Pilgrim0acc32a2016-02-06 19:51:21 +00001246 CASE_PMOVZX(PMOVZXWQ, m)
Simon Pilgrima0444102019-05-26 16:00:35 +00001247 DecodeZeroExtendMask(16, 64, getRegOperandNumElts(MI, 64, 0), false,
1248 ShuffleMask);
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +00001249 DestName = getRegName(MI->getOperand(0).getReg());
Simon Pilgrime1b6db92016-02-06 16:33:42 +00001250 break;
1251
Simon Pilgrim0acc32a2016-02-06 19:51:21 +00001252 CASE_PMOVZX(PMOVZXDQ, r)
Simon Pilgrim3016d9e2016-05-11 17:36:32 +00001253 Src1Name = getRegName(MI->getOperand(NumOperands - 1).getReg());
Justin Bognercd1d5aa2016-08-17 20:30:52 +00001254 LLVM_FALLTHROUGH;
Simon Pilgrim0acc32a2016-02-06 19:51:21 +00001255 CASE_PMOVZX(PMOVZXDQ, m)
Simon Pilgrima0444102019-05-26 16:00:35 +00001256 DecodeZeroExtendMask(32, 64, getRegOperandNumElts(MI, 64, 0), false,
1257 ShuffleMask);
Simon Pilgrime1b6db92016-02-06 16:33:42 +00001258 DestName = getRegName(MI->getOperand(0).getReg());
1259 break;
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +00001260 }
1261
1262 // The only comments we decode are shuffles, so give up if we were unable to
1263 // decode a shuffle mask.
1264 if (ShuffleMask.empty())
1265 return false;
1266
1267 if (!DestName) DestName = Src1Name;
Craig Topper85b1da12017-10-11 00:46:09 +00001268 if (DestName) {
1269 OS << DestName;
Craig Toppera21758f2018-03-29 04:14:04 +00001270 printMasking(OS, MI, MCII);
Craig Topper85b1da12017-10-11 00:46:09 +00001271 } else
1272 OS << "mem";
1273
1274 OS << " = ";
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +00001275
1276 // If the two sources are the same, canonicalize the input elements to be
1277 // from the first src so that we get larger element spans.
1278 if (Src1Name == Src2Name) {
1279 for (unsigned i = 0, e = ShuffleMask.size(); i != e; ++i) {
1280 if ((int)ShuffleMask[i] >= 0 && // Not sentinel.
NAKAMURA Takumi5582a6a2015-05-25 01:43:34 +00001281 ShuffleMask[i] >= (int)e) // From second mask.
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +00001282 ShuffleMask[i] -= e;
1283 }
1284 }
1285
1286 // The shuffle mask specifies which elements of the src1/src2 fill in the
1287 // destination, with a few sentinel values. Loop through and print them
1288 // out.
1289 for (unsigned i = 0, e = ShuffleMask.size(); i != e; ++i) {
1290 if (i != 0)
1291 OS << ',';
1292 if (ShuffleMask[i] == SM_SentinelZero) {
1293 OS << "zero";
1294 continue;
1295 }
1296
1297 // Otherwise, it must come from src1 or src2. Print the span of elements
1298 // that comes from this src.
1299 bool isSrc1 = ShuffleMask[i] < (int)ShuffleMask.size();
1300 const char *SrcName = isSrc1 ? Src1Name : Src2Name;
1301 OS << (SrcName ? SrcName : "mem") << '[';
1302 bool IsFirst = true;
1303 while (i != e && (int)ShuffleMask[i] != SM_SentinelZero &&
1304 (ShuffleMask[i] < (int)ShuffleMask.size()) == isSrc1) {
1305 if (!IsFirst)
1306 OS << ',';
1307 else
1308 IsFirst = false;
1309 if (ShuffleMask[i] == SM_SentinelUndef)
1310 OS << "u";
1311 else
1312 OS << ShuffleMask[i] % ShuffleMask.size();
1313 ++i;
1314 }
1315 OS << ']';
NAKAMURA Takumi5582a6a2015-05-25 01:43:34 +00001316 --i; // For loop increments element #.
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +00001317 }
Andrea Di Biagioedbf06a2019-02-04 12:51:26 +00001318 OS << '\n';
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +00001319
1320 // We successfully added a comment to this instruction.
1321 return true;
1322}