blob: 1cbb180cd2d0abb41a0fd26748e5857e4a5f2a5b [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"
16#include "MCTargetDesc/X86MCTargetDesc.h"
17#include "Utils/X86ShuffleDecode.h"
18#include "llvm/MC/MCInst.h"
19#include "llvm/CodeGen/MachineValueType.h"
20#include "llvm/Support/raw_ostream.h"
21
22using namespace llvm;
23
Simon Pilgrim41c05c02016-05-11 11:55:12 +000024#define CASE_SSE_INS_COMMON(Inst, src) \
Simon Pilgrimbfa5f232016-02-06 17:02:15 +000025 case X86::Inst##src:
26
Simon Pilgrim41c05c02016-05-11 11:55:12 +000027#define CASE_AVX_INS_COMMON(Inst, Suffix, src) \
Simon Pilgrimbfa5f232016-02-06 17:02:15 +000028 case X86::V##Inst##Suffix##src:
29
Simon Pilgrim41c05c02016-05-11 11:55:12 +000030#define CASE_MASK_INS_COMMON(Inst, Suffix, src) \
31 case X86::V##Inst##Suffix##src##k:
32
33#define CASE_MASKZ_INS_COMMON(Inst, Suffix, src) \
34 case X86::V##Inst##Suffix##src##kz:
35
36#define CASE_AVX512_INS_COMMON(Inst, Suffix, src) \
37 CASE_AVX_INS_COMMON(Inst, Suffix, src) \
38 CASE_MASK_INS_COMMON(Inst, Suffix, src) \
39 CASE_MASKZ_INS_COMMON(Inst, Suffix, src)
40
41#define CASE_MOVDUP(Inst, src) \
42 CASE_AVX512_INS_COMMON(Inst, Z, r##src) \
43 CASE_AVX512_INS_COMMON(Inst, Z256, r##src) \
44 CASE_AVX512_INS_COMMON(Inst, Z128, r##src) \
45 CASE_AVX_INS_COMMON(Inst, , r##src) \
46 CASE_AVX_INS_COMMON(Inst, Y, r##src) \
Simon Pilgrimbfa5f232016-02-06 17:02:15 +000047 CASE_SSE_INS_COMMON(Inst, r##src)
48
Simon Pilgrim7c2fbdc2016-07-03 13:08:29 +000049#define CASE_MASK_MOVDUP(Inst, src) \
50 CASE_MASK_INS_COMMON(Inst, Z, r##src) \
51 CASE_MASK_INS_COMMON(Inst, Z256, r##src) \
52 CASE_MASK_INS_COMMON(Inst, Z128, r##src)
53
54#define CASE_MASKZ_MOVDUP(Inst, src) \
55 CASE_MASKZ_INS_COMMON(Inst, Z, r##src) \
56 CASE_MASKZ_INS_COMMON(Inst, Z256, r##src) \
57 CASE_MASKZ_INS_COMMON(Inst, Z128, r##src)
58
Simon Pilgrim41c05c02016-05-11 11:55:12 +000059#define CASE_PMOVZX(Inst, src) \
60 CASE_AVX512_INS_COMMON(Inst, Z, r##src) \
61 CASE_AVX512_INS_COMMON(Inst, Z256, r##src) \
62 CASE_AVX512_INS_COMMON(Inst, Z128, r##src) \
63 CASE_AVX_INS_COMMON(Inst, , r##src) \
64 CASE_AVX_INS_COMMON(Inst, Y, r##src) \
Simon Pilgrim0acc32a2016-02-06 19:51:21 +000065 CASE_SSE_INS_COMMON(Inst, r##src)
66
Simon Pilgrim68f438a2016-07-03 13:33:28 +000067#define CASE_MASK_PMOVZX(Inst, src) \
68 CASE_MASK_INS_COMMON(Inst, Z, r##src) \
69 CASE_MASK_INS_COMMON(Inst, Z256, r##src) \
70 CASE_MASK_INS_COMMON(Inst, Z128, r##src)
71
72#define CASE_MASKZ_PMOVZX(Inst, src) \
73 CASE_MASKZ_INS_COMMON(Inst, Z, r##src) \
74 CASE_MASKZ_INS_COMMON(Inst, Z256, r##src) \
75 CASE_MASKZ_INS_COMMON(Inst, Z128, r##src)
76
Simon Pilgrim41c05c02016-05-11 11:55:12 +000077#define CASE_UNPCK(Inst, src) \
78 CASE_AVX512_INS_COMMON(Inst, Z, r##src) \
79 CASE_AVX512_INS_COMMON(Inst, Z256, r##src) \
80 CASE_AVX512_INS_COMMON(Inst, Z128, r##src) \
81 CASE_AVX_INS_COMMON(Inst, , r##src) \
82 CASE_AVX_INS_COMMON(Inst, Y, r##src) \
Simon Pilgrimbfa5f232016-02-06 17:02:15 +000083 CASE_SSE_INS_COMMON(Inst, r##src)
84
Simon Pilgrim598bdb62016-07-03 14:26:21 +000085#define CASE_MASK_UNPCK(Inst, src) \
86 CASE_MASK_INS_COMMON(Inst, Z, r##src) \
87 CASE_MASK_INS_COMMON(Inst, Z256, r##src) \
88 CASE_MASK_INS_COMMON(Inst, Z128, r##src)
89
90#define CASE_MASKZ_UNPCK(Inst, src) \
91 CASE_MASKZ_INS_COMMON(Inst, Z, r##src) \
92 CASE_MASKZ_INS_COMMON(Inst, Z256, r##src) \
93 CASE_MASKZ_INS_COMMON(Inst, Z128, r##src)
94
95#define CASE_SHUF(Inst, suf) \
Craig Topper01f53b12016-06-03 05:31:00 +000096 CASE_AVX512_INS_COMMON(Inst, Z, suf) \
97 CASE_AVX512_INS_COMMON(Inst, Z256, suf) \
98 CASE_AVX512_INS_COMMON(Inst, Z128, suf) \
99 CASE_AVX_INS_COMMON(Inst, , suf) \
100 CASE_AVX_INS_COMMON(Inst, Y, suf) \
101 CASE_SSE_INS_COMMON(Inst, suf)
Simon Pilgrimbfa5f232016-02-06 17:02:15 +0000102
Simon Pilgrim1f590762016-07-03 13:55:41 +0000103#define CASE_MASK_SHUF(Inst, src) \
104 CASE_MASK_INS_COMMON(Inst, Z, r##src##i) \
105 CASE_MASK_INS_COMMON(Inst, Z256, r##src##i) \
106 CASE_MASK_INS_COMMON(Inst, Z128, r##src##i)
107
108#define CASE_MASKZ_SHUF(Inst, src) \
109 CASE_MASKZ_INS_COMMON(Inst, Z, r##src##i) \
110 CASE_MASKZ_INS_COMMON(Inst, Z256, r##src##i) \
111 CASE_MASKZ_INS_COMMON(Inst, Z128, r##src##i)
112
Simon Pilgrim5080e7f2016-07-03 18:02:43 +0000113#define CASE_VPERMILPI(Inst, src) \
Simon Pilgrim41c05c02016-05-11 11:55:12 +0000114 CASE_AVX512_INS_COMMON(Inst, Z, src##i) \
115 CASE_AVX512_INS_COMMON(Inst, Z256, src##i) \
116 CASE_AVX512_INS_COMMON(Inst, Z128, src##i) \
117 CASE_AVX_INS_COMMON(Inst, , src##i) \
Simon Pilgrimbfa5f232016-02-06 17:02:15 +0000118 CASE_AVX_INS_COMMON(Inst, Y, src##i)
119
Simon Pilgrim5080e7f2016-07-03 18:02:43 +0000120#define CASE_MASK_VPERMILPI(Inst, src) \
Simon Pilgrim1f590762016-07-03 13:55:41 +0000121 CASE_MASK_INS_COMMON(Inst, Z, src##i) \
122 CASE_MASK_INS_COMMON(Inst, Z256, src##i) \
123 CASE_MASK_INS_COMMON(Inst, Z128, src##i)
124
Simon Pilgrim5080e7f2016-07-03 18:02:43 +0000125#define CASE_MASKZ_VPERMILPI(Inst, src) \
Simon Pilgrim1f590762016-07-03 13:55:41 +0000126 CASE_MASKZ_INS_COMMON(Inst, Z, src##i) \
127 CASE_MASKZ_INS_COMMON(Inst, Z256, src##i) \
128 CASE_MASKZ_INS_COMMON(Inst, Z128, src##i)
129
Simon Pilgrima0d73832016-07-03 18:27:37 +0000130#define CASE_VPERM(Inst, src) \
131 CASE_AVX512_INS_COMMON(Inst, Z, src##i) \
132 CASE_AVX512_INS_COMMON(Inst, Z256, src##i) \
133 CASE_AVX_INS_COMMON(Inst, Y, src##i)
134
Simon Pilgrim68ea8062016-07-03 18:40:24 +0000135#define CASE_MASK_VPERM(Inst, src) \
136 CASE_MASK_INS_COMMON(Inst, Z, src##i) \
137 CASE_MASK_INS_COMMON(Inst, Z256, src##i)
138
139#define CASE_MASKZ_VPERM(Inst, src) \
140 CASE_MASKZ_INS_COMMON(Inst, Z, src##i) \
141 CASE_MASKZ_INS_COMMON(Inst, Z256, src##i)
142
Simon Pilgrimbfa5f232016-02-06 17:02:15 +0000143#define CASE_VSHUF(Inst, src) \
Simon Pilgrim41c05c02016-05-11 11:55:12 +0000144 CASE_AVX512_INS_COMMON(SHUFF##Inst, Z, r##src##i) \
145 CASE_AVX512_INS_COMMON(SHUFI##Inst, Z, r##src##i) \
146 CASE_AVX512_INS_COMMON(SHUFF##Inst, Z256, r##src##i) \
147 CASE_AVX512_INS_COMMON(SHUFI##Inst, Z256, r##src##i)
Simon Pilgrimbfa5f232016-02-06 17:02:15 +0000148
Simon Pilgrim1f590762016-07-03 13:55:41 +0000149#define CASE_MASK_VSHUF(Inst, src) \
150 CASE_MASK_INS_COMMON(SHUFF##Inst, Z, r##src##i) \
151 CASE_MASK_INS_COMMON(SHUFI##Inst, Z, r##src##i) \
152 CASE_MASK_INS_COMMON(SHUFF##Inst, Z256, r##src##i) \
153 CASE_MASK_INS_COMMON(SHUFI##Inst, Z256, r##src##i)
154
155#define CASE_MASKZ_VSHUF(Inst, src) \
156 CASE_MASKZ_INS_COMMON(SHUFF##Inst, Z, r##src##i) \
157 CASE_MASKZ_INS_COMMON(SHUFI##Inst, Z, r##src##i) \
158 CASE_MASKZ_INS_COMMON(SHUFF##Inst, Z256, r##src##i) \
159 CASE_MASKZ_INS_COMMON(SHUFI##Inst, Z256, r##src##i)
160
Igor Breger24cab0f2015-11-16 07:22:00 +0000161static unsigned getVectorRegSize(unsigned RegNo) {
Igor Breger24cab0f2015-11-16 07:22:00 +0000162 if (X86::ZMM0 <= RegNo && RegNo <= X86::ZMM31)
163 return 512;
164 if (X86::YMM0 <= RegNo && RegNo <= X86::YMM31)
165 return 256;
166 if (X86::XMM0 <= RegNo && RegNo <= X86::XMM31)
167 return 128;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000168 if (X86::MM0 <= RegNo && RegNo <= X86::MM7)
169 return 64;
Igor Breger24cab0f2015-11-16 07:22:00 +0000170
171 llvm_unreachable("Unknown vector reg!");
Igor Breger24cab0f2015-11-16 07:22:00 +0000172}
173
174static MVT getRegOperandVectorVT(const MCInst *MI, const MVT &ScalarVT,
175 unsigned OperandIndex) {
176 unsigned OpReg = MI->getOperand(OperandIndex).getReg();
177 return MVT::getVectorVT(ScalarVT,
178 getVectorRegSize(OpReg)/ScalarVT.getSizeInBits());
179}
180
Simon Pilgrime1b6db92016-02-06 16:33:42 +0000181/// \brief Extracts the dst type for a given zero extension instruction.
182static MVT getZeroExtensionResultType(const MCInst *MI) {
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000183 switch (MI->getOpcode()) {
184 default:
185 llvm_unreachable("Unknown zero extension instruction");
Simon Pilgrime1b6db92016-02-06 16:33:42 +0000186 // zero extension to i16
Simon Pilgrim0acc32a2016-02-06 19:51:21 +0000187 CASE_PMOVZX(PMOVZXBW, m)
188 CASE_PMOVZX(PMOVZXBW, r)
Simon Pilgrime1b6db92016-02-06 16:33:42 +0000189 return getRegOperandVectorVT(MI, MVT::i16, 0);
190 // zero extension to i32
Simon Pilgrim0acc32a2016-02-06 19:51:21 +0000191 CASE_PMOVZX(PMOVZXBD, m)
192 CASE_PMOVZX(PMOVZXBD, r)
193 CASE_PMOVZX(PMOVZXWD, m)
194 CASE_PMOVZX(PMOVZXWD, r)
Simon Pilgrime1b6db92016-02-06 16:33:42 +0000195 return getRegOperandVectorVT(MI, MVT::i32, 0);
196 // zero extension to i64
Simon Pilgrim0acc32a2016-02-06 19:51:21 +0000197 CASE_PMOVZX(PMOVZXBQ, m)
198 CASE_PMOVZX(PMOVZXBQ, r)
199 CASE_PMOVZX(PMOVZXWQ, m)
200 CASE_PMOVZX(PMOVZXWQ, r)
201 CASE_PMOVZX(PMOVZXDQ, m)
202 CASE_PMOVZX(PMOVZXDQ, r)
Simon Pilgrime1b6db92016-02-06 16:33:42 +0000203 return getRegOperandVectorVT(MI, MVT::i64, 0);
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000204 }
205}
206
Simon Pilgrim7c2fbdc2016-07-03 13:08:29 +0000207/// Wraps the destination register name with AVX512 mask/maskz filtering.
208static std::string getMaskName(const MCInst *MI, const char *DestName,
209 const char *(*getRegName)(unsigned)) {
210 std::string OpMaskName(DestName);
211
212 bool MaskWithZero = false;
213 const char *MaskRegName = nullptr;
214
215 switch (MI->getOpcode()) {
216 default:
217 return OpMaskName;
218 CASE_MASKZ_MOVDUP(MOVDDUP, m)
219 CASE_MASKZ_MOVDUP(MOVDDUP, r)
220 CASE_MASKZ_MOVDUP(MOVSHDUP, m)
221 CASE_MASKZ_MOVDUP(MOVSHDUP, r)
222 CASE_MASKZ_MOVDUP(MOVSLDUP, m)
223 CASE_MASKZ_MOVDUP(MOVSLDUP, r)
Simon Pilgrim68f438a2016-07-03 13:33:28 +0000224 CASE_MASKZ_PMOVZX(PMOVZXBD, m)
225 CASE_MASKZ_PMOVZX(PMOVZXBD, r)
226 CASE_MASKZ_PMOVZX(PMOVZXBQ, m)
227 CASE_MASKZ_PMOVZX(PMOVZXBQ, r)
228 CASE_MASKZ_PMOVZX(PMOVZXBW, m)
229 CASE_MASKZ_PMOVZX(PMOVZXBW, r)
230 CASE_MASKZ_PMOVZX(PMOVZXDQ, m)
231 CASE_MASKZ_PMOVZX(PMOVZXDQ, r)
232 CASE_MASKZ_PMOVZX(PMOVZXWD, m)
233 CASE_MASKZ_PMOVZX(PMOVZXWD, r)
234 CASE_MASKZ_PMOVZX(PMOVZXWQ, m)
235 CASE_MASKZ_PMOVZX(PMOVZXWQ, r)
Simon Pilgrim598bdb62016-07-03 14:26:21 +0000236 CASE_MASKZ_UNPCK(PUNPCKHBW, m)
237 CASE_MASKZ_UNPCK(PUNPCKHBW, r)
238 CASE_MASKZ_UNPCK(PUNPCKHWD, m)
239 CASE_MASKZ_UNPCK(PUNPCKHWD, r)
240 CASE_MASKZ_UNPCK(PUNPCKHDQ, m)
241 CASE_MASKZ_UNPCK(PUNPCKHDQ, r)
242 CASE_MASKZ_UNPCK(PUNPCKLBW, m)
243 CASE_MASKZ_UNPCK(PUNPCKLBW, r)
244 CASE_MASKZ_UNPCK(PUNPCKLWD, m)
245 CASE_MASKZ_UNPCK(PUNPCKLWD, r)
246 CASE_MASKZ_UNPCK(PUNPCKLDQ, m)
247 CASE_MASKZ_UNPCK(PUNPCKLDQ, r)
248 CASE_MASKZ_UNPCK(UNPCKHPD, m)
249 CASE_MASKZ_UNPCK(UNPCKHPD, r)
250 CASE_MASKZ_UNPCK(UNPCKHPS, m)
251 CASE_MASKZ_UNPCK(UNPCKHPS, r)
252 CASE_MASKZ_UNPCK(UNPCKLPD, m)
253 CASE_MASKZ_UNPCK(UNPCKLPD, r)
254 CASE_MASKZ_UNPCK(UNPCKLPS, m)
255 CASE_MASKZ_UNPCK(UNPCKLPS, r)
Simon Pilgrimdbd6db02016-07-03 15:00:51 +0000256 CASE_MASKZ_SHUF(PALIGNR, r)
257 CASE_MASKZ_SHUF(PALIGNR, m)
Simon Pilgrim1f590762016-07-03 13:55:41 +0000258 CASE_MASKZ_SHUF(SHUFPD, m)
259 CASE_MASKZ_SHUF(SHUFPD, r)
260 CASE_MASKZ_SHUF(SHUFPS, m)
261 CASE_MASKZ_SHUF(SHUFPS, r)
Simon Pilgrim5080e7f2016-07-03 18:02:43 +0000262 CASE_MASKZ_VPERMILPI(PERMILPD, m)
263 CASE_MASKZ_VPERMILPI(PERMILPD, r)
264 CASE_MASKZ_VPERMILPI(PERMILPS, m)
265 CASE_MASKZ_VPERMILPI(PERMILPS, r)
266 CASE_MASKZ_VPERMILPI(PSHUFD, m)
267 CASE_MASKZ_VPERMILPI(PSHUFD, r)
268 CASE_MASKZ_VPERMILPI(PSHUFHW, m)
269 CASE_MASKZ_VPERMILPI(PSHUFHW, r)
270 CASE_MASKZ_VPERMILPI(PSHUFLW, m)
271 CASE_MASKZ_VPERMILPI(PSHUFLW, r)
Simon Pilgrim68ea8062016-07-03 18:40:24 +0000272 CASE_MASKZ_VPERM(PERMPD, m)
273 CASE_MASKZ_VPERM(PERMPD, r)
274 CASE_MASKZ_VPERM(PERMQ, m)
275 CASE_MASKZ_VPERM(PERMQ, r)
Simon Pilgrim1f590762016-07-03 13:55:41 +0000276 CASE_MASKZ_VSHUF(64X2, m)
277 CASE_MASKZ_VSHUF(64X2, r)
278 CASE_MASKZ_VSHUF(32X4, m)
279 CASE_MASKZ_VSHUF(32X4, r)
Simon Pilgrim7c2fbdc2016-07-03 13:08:29 +0000280 MaskWithZero = true;
281 MaskRegName = getRegName(MI->getOperand(1).getReg());
282 break;
283 CASE_MASK_MOVDUP(MOVDDUP, m)
284 CASE_MASK_MOVDUP(MOVDDUP, r)
285 CASE_MASK_MOVDUP(MOVSHDUP, m)
286 CASE_MASK_MOVDUP(MOVSHDUP, r)
287 CASE_MASK_MOVDUP(MOVSLDUP, m)
288 CASE_MASK_MOVDUP(MOVSLDUP, r)
Simon Pilgrim68f438a2016-07-03 13:33:28 +0000289 CASE_MASK_PMOVZX(PMOVZXBD, m)
290 CASE_MASK_PMOVZX(PMOVZXBD, r)
291 CASE_MASK_PMOVZX(PMOVZXBQ, m)
292 CASE_MASK_PMOVZX(PMOVZXBQ, r)
293 CASE_MASK_PMOVZX(PMOVZXBW, m)
294 CASE_MASK_PMOVZX(PMOVZXBW, r)
295 CASE_MASK_PMOVZX(PMOVZXDQ, m)
296 CASE_MASK_PMOVZX(PMOVZXDQ, r)
297 CASE_MASK_PMOVZX(PMOVZXWD, m)
298 CASE_MASK_PMOVZX(PMOVZXWD, r)
299 CASE_MASK_PMOVZX(PMOVZXWQ, m)
300 CASE_MASK_PMOVZX(PMOVZXWQ, r)
Simon Pilgrim598bdb62016-07-03 14:26:21 +0000301 CASE_MASK_UNPCK(PUNPCKHBW, m)
302 CASE_MASK_UNPCK(PUNPCKHBW, r)
303 CASE_MASK_UNPCK(PUNPCKHWD, m)
304 CASE_MASK_UNPCK(PUNPCKHWD, r)
305 CASE_MASK_UNPCK(PUNPCKHDQ, m)
306 CASE_MASK_UNPCK(PUNPCKHDQ, r)
307 CASE_MASK_UNPCK(PUNPCKLBW, m)
308 CASE_MASK_UNPCK(PUNPCKLBW, r)
309 CASE_MASK_UNPCK(PUNPCKLWD, m)
310 CASE_MASK_UNPCK(PUNPCKLWD, r)
311 CASE_MASK_UNPCK(PUNPCKLDQ, m)
312 CASE_MASK_UNPCK(PUNPCKLDQ, r)
313 CASE_MASK_UNPCK(UNPCKHPD, m)
314 CASE_MASK_UNPCK(UNPCKHPD, r)
315 CASE_MASK_UNPCK(UNPCKHPS, m)
316 CASE_MASK_UNPCK(UNPCKHPS, r)
317 CASE_MASK_UNPCK(UNPCKLPD, m)
318 CASE_MASK_UNPCK(UNPCKLPD, r)
319 CASE_MASK_UNPCK(UNPCKLPS, m)
320 CASE_MASK_UNPCK(UNPCKLPS, r)
Simon Pilgrimdbd6db02016-07-03 15:00:51 +0000321 CASE_MASK_SHUF(PALIGNR, r)
322 CASE_MASK_SHUF(PALIGNR, m)
Simon Pilgrim1f590762016-07-03 13:55:41 +0000323 CASE_MASK_SHUF(SHUFPD, m)
324 CASE_MASK_SHUF(SHUFPD, r)
325 CASE_MASK_SHUF(SHUFPS, m)
326 CASE_MASK_SHUF(SHUFPS, r)
Simon Pilgrim5080e7f2016-07-03 18:02:43 +0000327 CASE_MASK_VPERMILPI(PERMILPD, m)
328 CASE_MASK_VPERMILPI(PERMILPD, r)
329 CASE_MASK_VPERMILPI(PERMILPS, m)
330 CASE_MASK_VPERMILPI(PERMILPS, r)
331 CASE_MASK_VPERMILPI(PSHUFD, m)
332 CASE_MASK_VPERMILPI(PSHUFD, r)
333 CASE_MASK_VPERMILPI(PSHUFHW, m)
334 CASE_MASK_VPERMILPI(PSHUFHW, r)
335 CASE_MASK_VPERMILPI(PSHUFLW, m)
336 CASE_MASK_VPERMILPI(PSHUFLW, r)
Simon Pilgrim68ea8062016-07-03 18:40:24 +0000337 CASE_MASK_VPERM(PERMPD, m)
338 CASE_MASK_VPERM(PERMPD, r)
339 CASE_MASK_VPERM(PERMQ, m)
340 CASE_MASK_VPERM(PERMQ, r)
Simon Pilgrim1f590762016-07-03 13:55:41 +0000341 CASE_MASK_VSHUF(64X2, m)
342 CASE_MASK_VSHUF(64X2, r)
343 CASE_MASK_VSHUF(32X4, m)
344 CASE_MASK_VSHUF(32X4, r)
Simon Pilgrim7c2fbdc2016-07-03 13:08:29 +0000345 MaskRegName = getRegName(MI->getOperand(2).getReg());
346 break;
347 }
348
349 // MASK: zmmX {%kY}
350 OpMaskName += " {%";
351 OpMaskName += MaskRegName;
352 OpMaskName += "}";
353
354 // MASKZ: zmmX {%kY} {z}
355 if (MaskWithZero)
356 OpMaskName += " {z}";
357
358 return OpMaskName;
359}
360
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000361//===----------------------------------------------------------------------===//
362// Top Level Entrypoint
363//===----------------------------------------------------------------------===//
364
365/// EmitAnyX86InstComments - This function decodes x86 instructions and prints
366/// newline terminated strings to the specified string if desired. This
367/// information is shown in disassembly dumps when verbose assembly is enabled.
368bool llvm::EmitAnyX86InstComments(const MCInst *MI, raw_ostream &OS,
369 const char *(*getRegName)(unsigned)) {
370 // If this is a shuffle operation, the switch should fill in this state.
371 SmallVector<int, 8> ShuffleMask;
372 const char *DestName = nullptr, *Src1Name = nullptr, *Src2Name = nullptr;
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000373 unsigned NumOperands = MI->getNumOperands();
Craig Topper89c17612016-06-10 04:48:05 +0000374 bool RegForm = false;
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000375
376 switch (MI->getOpcode()) {
377 default:
378 // Not an instruction for which we can decode comments.
379 return false;
380
381 case X86::BLENDPDrri:
382 case X86::VBLENDPDrri:
Simon Pilgrim13d3a202015-11-16 23:03:18 +0000383 case X86::VBLENDPDYrri:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000384 Src2Name = getRegName(MI->getOperand(2).getReg());
Justin Bognercd1d5aa2016-08-17 20:30:52 +0000385 LLVM_FALLTHROUGH;
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000386 case X86::BLENDPDrmi:
387 case X86::VBLENDPDrmi:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000388 case X86::VBLENDPDYrmi:
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000389 if (MI->getOperand(NumOperands - 1).isImm())
Simon Pilgrim13d3a202015-11-16 23:03:18 +0000390 DecodeBLENDMask(getRegOperandVectorVT(MI, MVT::f64, 0),
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000391 MI->getOperand(NumOperands - 1).getImm(),
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000392 ShuffleMask);
393 Src1Name = getRegName(MI->getOperand(1).getReg());
394 DestName = getRegName(MI->getOperand(0).getReg());
395 break;
396
397 case X86::BLENDPSrri:
398 case X86::VBLENDPSrri:
Simon Pilgrim13d3a202015-11-16 23:03:18 +0000399 case X86::VBLENDPSYrri:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000400 Src2Name = getRegName(MI->getOperand(2).getReg());
Justin Bognercd1d5aa2016-08-17 20:30:52 +0000401 LLVM_FALLTHROUGH;
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000402 case X86::BLENDPSrmi:
403 case X86::VBLENDPSrmi:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000404 case X86::VBLENDPSYrmi:
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000405 if (MI->getOperand(NumOperands - 1).isImm())
Simon Pilgrim13d3a202015-11-16 23:03:18 +0000406 DecodeBLENDMask(getRegOperandVectorVT(MI, MVT::f32, 0),
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000407 MI->getOperand(NumOperands - 1).getImm(),
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000408 ShuffleMask);
409 Src1Name = getRegName(MI->getOperand(1).getReg());
410 DestName = getRegName(MI->getOperand(0).getReg());
411 break;
412
413 case X86::PBLENDWrri:
414 case X86::VPBLENDWrri:
Simon Pilgrim13d3a202015-11-16 23:03:18 +0000415 case X86::VPBLENDWYrri:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000416 Src2Name = getRegName(MI->getOperand(2).getReg());
Justin Bognercd1d5aa2016-08-17 20:30:52 +0000417 LLVM_FALLTHROUGH;
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000418 case X86::PBLENDWrmi:
419 case X86::VPBLENDWrmi:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000420 case X86::VPBLENDWYrmi:
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000421 if (MI->getOperand(NumOperands - 1).isImm())
Simon Pilgrim13d3a202015-11-16 23:03:18 +0000422 DecodeBLENDMask(getRegOperandVectorVT(MI, MVT::i16, 0),
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000423 MI->getOperand(NumOperands - 1).getImm(),
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000424 ShuffleMask);
425 Src1Name = getRegName(MI->getOperand(1).getReg());
426 DestName = getRegName(MI->getOperand(0).getReg());
427 break;
428
429 case X86::VPBLENDDrri:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000430 case X86::VPBLENDDYrri:
431 Src2Name = getRegName(MI->getOperand(2).getReg());
Justin Bognercd1d5aa2016-08-17 20:30:52 +0000432 LLVM_FALLTHROUGH;
Simon Pilgrim13d3a202015-11-16 23:03:18 +0000433 case X86::VPBLENDDrmi:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000434 case X86::VPBLENDDYrmi:
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000435 if (MI->getOperand(NumOperands - 1).isImm())
Simon Pilgrim13d3a202015-11-16 23:03:18 +0000436 DecodeBLENDMask(getRegOperandVectorVT(MI, MVT::i32, 0),
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000437 MI->getOperand(NumOperands - 1).getImm(),
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000438 ShuffleMask);
439 Src1Name = getRegName(MI->getOperand(1).getReg());
440 DestName = getRegName(MI->getOperand(0).getReg());
441 break;
442
443 case X86::INSERTPSrr:
444 case X86::VINSERTPSrr:
Craig Topper6189d3e2016-07-19 01:26:19 +0000445 case X86::VINSERTPSZrr:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000446 Src2Name = getRegName(MI->getOperand(2).getReg());
Justin Bognercd1d5aa2016-08-17 20:30:52 +0000447 LLVM_FALLTHROUGH;
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000448 case X86::INSERTPSrm:
449 case X86::VINSERTPSrm:
Craig Topper6189d3e2016-07-19 01:26:19 +0000450 case X86::VINSERTPSZrm:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000451 DestName = getRegName(MI->getOperand(0).getReg());
452 Src1Name = getRegName(MI->getOperand(1).getReg());
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000453 if (MI->getOperand(NumOperands - 1).isImm())
454 DecodeINSERTPSMask(MI->getOperand(NumOperands - 1).getImm(),
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000455 ShuffleMask);
456 break;
457
458 case X86::MOVLHPSrr:
459 case X86::VMOVLHPSrr:
Simon Pilgrimd5a15442015-11-21 13:04:42 +0000460 case X86::VMOVLHPSZrr:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000461 Src2Name = getRegName(MI->getOperand(2).getReg());
462 Src1Name = getRegName(MI->getOperand(1).getReg());
463 DestName = getRegName(MI->getOperand(0).getReg());
464 DecodeMOVLHPSMask(2, ShuffleMask);
465 break;
466
467 case X86::MOVHLPSrr:
468 case X86::VMOVHLPSrr:
Simon Pilgrimd5a15442015-11-21 13:04:42 +0000469 case X86::VMOVHLPSZrr:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000470 Src2Name = getRegName(MI->getOperand(2).getReg());
471 Src1Name = getRegName(MI->getOperand(1).getReg());
472 DestName = getRegName(MI->getOperand(0).getReg());
473 DecodeMOVHLPSMask(2, ShuffleMask);
474 break;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000475
Simon Pilgrima3d67442016-02-07 15:39:22 +0000476 case X86::MOVHPDrm:
477 case X86::VMOVHPDrm:
478 case X86::VMOVHPDZ128rm:
479 Src1Name = getRegName(MI->getOperand(1).getReg());
480 DestName = getRegName(MI->getOperand(0).getReg());
481 DecodeInsertElementMask(MVT::v2f64, 1, 1, ShuffleMask);
482 break;
483
484 case X86::MOVHPSrm:
485 case X86::VMOVHPSrm:
486 case X86::VMOVHPSZ128rm:
487 Src1Name = getRegName(MI->getOperand(1).getReg());
488 DestName = getRegName(MI->getOperand(0).getReg());
489 DecodeInsertElementMask(MVT::v4f32, 2, 2, ShuffleMask);
490 break;
491
492 case X86::MOVLPDrm:
493 case X86::VMOVLPDrm:
494 case X86::VMOVLPDZ128rm:
495 Src1Name = getRegName(MI->getOperand(1).getReg());
496 DestName = getRegName(MI->getOperand(0).getReg());
497 DecodeInsertElementMask(MVT::v2f64, 0, 1, ShuffleMask);
498 break;
499
500 case X86::MOVLPSrm:
501 case X86::VMOVLPSrm:
502 case X86::VMOVLPSZ128rm:
503 Src1Name = getRegName(MI->getOperand(1).getReg());
504 DestName = getRegName(MI->getOperand(0).getReg());
505 DecodeInsertElementMask(MVT::v4f32, 0, 2, ShuffleMask);
506 break;
507
Igor Breger24cab0f2015-11-16 07:22:00 +0000508 CASE_MOVDUP(MOVSLDUP, r)
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000509 Src1Name = getRegName(MI->getOperand(NumOperands - 1).getReg());
Justin Bognercd1d5aa2016-08-17 20:30:52 +0000510 LLVM_FALLTHROUGH;
511
Igor Breger1f782962015-11-19 08:26:56 +0000512 CASE_MOVDUP(MOVSLDUP, m)
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000513 DestName = getRegName(MI->getOperand(0).getReg());
Igor Breger1f782962015-11-19 08:26:56 +0000514 DecodeMOVSLDUPMask(getRegOperandVectorVT(MI, MVT::f32, 0), ShuffleMask);
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000515 break;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000516
Igor Breger24cab0f2015-11-16 07:22:00 +0000517 CASE_MOVDUP(MOVSHDUP, r)
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000518 Src1Name = getRegName(MI->getOperand(NumOperands - 1).getReg());
Justin Bognercd1d5aa2016-08-17 20:30:52 +0000519 LLVM_FALLTHROUGH;
520
Igor Breger1f782962015-11-19 08:26:56 +0000521 CASE_MOVDUP(MOVSHDUP, m)
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000522 DestName = getRegName(MI->getOperand(0).getReg());
Igor Breger1f782962015-11-19 08:26:56 +0000523 DecodeMOVSHDUPMask(getRegOperandVectorVT(MI, MVT::f32, 0), ShuffleMask);
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000524 break;
525
Igor Breger1f782962015-11-19 08:26:56 +0000526 CASE_MOVDUP(MOVDDUP, r)
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000527 Src1Name = getRegName(MI->getOperand(NumOperands - 1).getReg());
Justin Bognercd1d5aa2016-08-17 20:30:52 +0000528 LLVM_FALLTHROUGH;
529
Igor Breger1f782962015-11-19 08:26:56 +0000530 CASE_MOVDUP(MOVDDUP, m)
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000531 DestName = getRegName(MI->getOperand(0).getReg());
Igor Breger1f782962015-11-19 08:26:56 +0000532 DecodeMOVDDUPMask(getRegOperandVectorVT(MI, MVT::f64, 0), ShuffleMask);
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000533 break;
534
535 case X86::PSLLDQri:
536 case X86::VPSLLDQri:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000537 case X86::VPSLLDQYri:
Simon Pilgrim643734c2016-06-09 22:03:15 +0000538 case X86::VPSLLDQZ128rr:
539 case X86::VPSLLDQZ256rr:
540 case X86::VPSLLDQZ512rr:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000541 Src1Name = getRegName(MI->getOperand(1).getReg());
Simon Pilgrim643734c2016-06-09 22:03:15 +0000542 case X86::VPSLLDQZ128rm:
543 case X86::VPSLLDQZ256rm:
544 case X86::VPSLLDQZ512rm:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000545 DestName = getRegName(MI->getOperand(0).getReg());
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000546 if (MI->getOperand(NumOperands - 1).isImm())
Simon Pilgrimb9ada272015-11-16 22:54:41 +0000547 DecodePSLLDQMask(getRegOperandVectorVT(MI, MVT::i8, 0),
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000548 MI->getOperand(NumOperands - 1).getImm(),
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000549 ShuffleMask);
550 break;
551
552 case X86::PSRLDQri:
553 case X86::VPSRLDQri:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000554 case X86::VPSRLDQYri:
Simon Pilgrim643734c2016-06-09 22:03:15 +0000555 case X86::VPSRLDQZ128rr:
556 case X86::VPSRLDQZ256rr:
557 case X86::VPSRLDQZ512rr:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000558 Src1Name = getRegName(MI->getOperand(1).getReg());
Simon Pilgrim643734c2016-06-09 22:03:15 +0000559 case X86::VPSRLDQZ128rm:
560 case X86::VPSRLDQZ256rm:
561 case X86::VPSRLDQZ512rm:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000562 DestName = getRegName(MI->getOperand(0).getReg());
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000563 if (MI->getOperand(NumOperands - 1).isImm())
Simon Pilgrimb9ada272015-11-16 22:54:41 +0000564 DecodePSRLDQMask(getRegOperandVectorVT(MI, MVT::i8, 0),
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000565 MI->getOperand(NumOperands - 1).getImm(),
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000566 ShuffleMask);
567 break;
568
Craig Topper7a299302016-06-09 07:06:38 +0000569 CASE_SHUF(PALIGNR, rri)
Craig Topper89c17612016-06-10 04:48:05 +0000570 Src1Name = getRegName(MI->getOperand(NumOperands - 2).getReg());
571 RegForm = true;
Justin Bognercd1d5aa2016-08-17 20:30:52 +0000572 LLVM_FALLTHROUGH;
573
Craig Topper7a299302016-06-09 07:06:38 +0000574 CASE_SHUF(PALIGNR, rmi)
Craig Topper89c17612016-06-10 04:48:05 +0000575 Src2Name = getRegName(MI->getOperand(NumOperands-(RegForm?3:7)).getReg());
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000576 DestName = getRegName(MI->getOperand(0).getReg());
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000577 if (MI->getOperand(NumOperands - 1).isImm())
Simon Pilgrimb9ada272015-11-16 22:54:41 +0000578 DecodePALIGNRMask(getRegOperandVectorVT(MI, MVT::i8, 0),
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000579 MI->getOperand(NumOperands - 1).getImm(),
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000580 ShuffleMask);
581 break;
582
Craig Topper01f53b12016-06-03 05:31:00 +0000583 CASE_SHUF(PSHUFD, ri)
Craig Topper6f7288d2016-06-09 07:49:08 +0000584 Src1Name = getRegName(MI->getOperand(NumOperands - 2).getReg());
Justin Bognercd1d5aa2016-08-17 20:30:52 +0000585 LLVM_FALLTHROUGH;
586
Craig Topper01f53b12016-06-03 05:31:00 +0000587 CASE_SHUF(PSHUFD, mi)
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000588 DestName = getRegName(MI->getOperand(0).getReg());
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000589 if (MI->getOperand(NumOperands - 1).isImm())
Simon Pilgrim5883a732015-11-16 22:39:27 +0000590 DecodePSHUFMask(getRegOperandVectorVT(MI, MVT::i32, 0),
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000591 MI->getOperand(NumOperands - 1).getImm(),
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000592 ShuffleMask);
593 break;
594
Craig Topper01f53b12016-06-03 05:31:00 +0000595 CASE_SHUF(PSHUFHW, ri)
Craig Topper6f7288d2016-06-09 07:49:08 +0000596 Src1Name = getRegName(MI->getOperand(NumOperands - 2).getReg());
Justin Bognercd1d5aa2016-08-17 20:30:52 +0000597 LLVM_FALLTHROUGH;
598
Craig Topper01f53b12016-06-03 05:31:00 +0000599 CASE_SHUF(PSHUFHW, mi)
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000600 DestName = getRegName(MI->getOperand(0).getReg());
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000601 if (MI->getOperand(NumOperands - 1).isImm())
Simon Pilgrim5883a732015-11-16 22:39:27 +0000602 DecodePSHUFHWMask(getRegOperandVectorVT(MI, MVT::i16, 0),
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000603 MI->getOperand(NumOperands - 1).getImm(),
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000604 ShuffleMask);
605 break;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000606
Craig Topper01f53b12016-06-03 05:31:00 +0000607 CASE_SHUF(PSHUFLW, ri)
Craig Topper6f7288d2016-06-09 07:49:08 +0000608 Src1Name = getRegName(MI->getOperand(NumOperands - 2).getReg());
Justin Bognercd1d5aa2016-08-17 20:30:52 +0000609 LLVM_FALLTHROUGH;
610
Craig Topper01f53b12016-06-03 05:31:00 +0000611 CASE_SHUF(PSHUFLW, mi)
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000612 DestName = getRegName(MI->getOperand(0).getReg());
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000613 if (MI->getOperand(NumOperands - 1).isImm())
Simon Pilgrim5883a732015-11-16 22:39:27 +0000614 DecodePSHUFLWMask(getRegOperandVectorVT(MI, MVT::i16, 0),
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000615 MI->getOperand(NumOperands - 1).getImm(),
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000616 ShuffleMask);
617 break;
618
Simon Pilgrimf8f86ab2015-09-13 11:28:45 +0000619 case X86::MMX_PSHUFWri:
620 Src1Name = getRegName(MI->getOperand(1).getReg());
Justin Bognercd1d5aa2016-08-17 20:30:52 +0000621 LLVM_FALLTHROUGH;
622
Simon Pilgrimf8f86ab2015-09-13 11:28:45 +0000623 case X86::MMX_PSHUFWmi:
624 DestName = getRegName(MI->getOperand(0).getReg());
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000625 if (MI->getOperand(NumOperands - 1).isImm())
Simon Pilgrimf8f86ab2015-09-13 11:28:45 +0000626 DecodePSHUFMask(MVT::v4i16,
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000627 MI->getOperand(NumOperands - 1).getImm(),
Simon Pilgrimf8f86ab2015-09-13 11:28:45 +0000628 ShuffleMask);
629 break;
630
631 case X86::PSWAPDrr:
632 Src1Name = getRegName(MI->getOperand(1).getReg());
Justin Bognercd1d5aa2016-08-17 20:30:52 +0000633 LLVM_FALLTHROUGH;
634
Simon Pilgrimf8f86ab2015-09-13 11:28:45 +0000635 case X86::PSWAPDrm:
636 DestName = getRegName(MI->getOperand(0).getReg());
637 DecodePSWAPMask(MVT::v2i32, ShuffleMask);
638 break;
639
Simon Pilgrim8483df62015-11-17 22:35:45 +0000640 CASE_UNPCK(PUNPCKHBW, r)
Simon Pilgrimf8f86ab2015-09-13 11:28:45 +0000641 case X86::MMX_PUNPCKHBWirr:
Craig Topper89c17612016-06-10 04:48:05 +0000642 Src2Name = getRegName(MI->getOperand(NumOperands - 1).getReg());
643 RegForm = true;
Justin Bognercd1d5aa2016-08-17 20:30:52 +0000644 LLVM_FALLTHROUGH;
645
Simon Pilgrim8483df62015-11-17 22:35:45 +0000646 CASE_UNPCK(PUNPCKHBW, m)
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000647 case X86::MMX_PUNPCKHBWirm:
Craig Topper89c17612016-06-10 04:48:05 +0000648 Src1Name = getRegName(MI->getOperand(NumOperands-(RegForm?2:6)).getReg());
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000649 DestName = getRegName(MI->getOperand(0).getReg());
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000650 DecodeUNPCKHMask(getRegOperandVectorVT(MI, MVT::i8, 0), ShuffleMask);
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000651 break;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000652
Simon Pilgrim8483df62015-11-17 22:35:45 +0000653 CASE_UNPCK(PUNPCKHWD, r)
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000654 case X86::MMX_PUNPCKHWDirr:
Craig Topper89c17612016-06-10 04:48:05 +0000655 Src2Name = getRegName(MI->getOperand(NumOperands - 1).getReg());
656 RegForm = true;
Justin Bognercd1d5aa2016-08-17 20:30:52 +0000657 LLVM_FALLTHROUGH;
658
Simon Pilgrim8483df62015-11-17 22:35:45 +0000659 CASE_UNPCK(PUNPCKHWD, m)
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000660 case X86::MMX_PUNPCKHWDirm:
Craig Topper89c17612016-06-10 04:48:05 +0000661 Src1Name = getRegName(MI->getOperand(NumOperands-(RegForm?2:6)).getReg());
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000662 DestName = getRegName(MI->getOperand(0).getReg());
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000663 DecodeUNPCKHMask(getRegOperandVectorVT(MI, MVT::i16, 0), ShuffleMask);
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000664 break;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000665
Simon Pilgrim8483df62015-11-17 22:35:45 +0000666 CASE_UNPCK(PUNPCKHDQ, r)
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000667 case X86::MMX_PUNPCKHDQirr:
Craig Topper89c17612016-06-10 04:48:05 +0000668 Src2Name = getRegName(MI->getOperand(NumOperands - 1).getReg());
669 RegForm = true;
Justin Bognercd1d5aa2016-08-17 20:30:52 +0000670 LLVM_FALLTHROUGH;
671
Simon Pilgrim8483df62015-11-17 22:35:45 +0000672 CASE_UNPCK(PUNPCKHDQ, m)
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000673 case X86::MMX_PUNPCKHDQirm:
Craig Topper89c17612016-06-10 04:48:05 +0000674 Src1Name = getRegName(MI->getOperand(NumOperands-(RegForm?2:6)).getReg());
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000675 DestName = getRegName(MI->getOperand(0).getReg());
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000676 DecodeUNPCKHMask(getRegOperandVectorVT(MI, MVT::i32, 0), ShuffleMask);
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000677 break;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000678
Simon Pilgrim8483df62015-11-17 22:35:45 +0000679 CASE_UNPCK(PUNPCKHQDQ, r)
Craig Topper89c17612016-06-10 04:48:05 +0000680 Src2Name = getRegName(MI->getOperand(NumOperands - 1).getReg());
681 RegForm = true;
Justin Bognercd1d5aa2016-08-17 20:30:52 +0000682 LLVM_FALLTHROUGH;
683
Simon Pilgrim8483df62015-11-17 22:35:45 +0000684 CASE_UNPCK(PUNPCKHQDQ, m)
Craig Topper89c17612016-06-10 04:48:05 +0000685 Src1Name = getRegName(MI->getOperand(NumOperands-(RegForm?2:6)).getReg());
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000686 DestName = getRegName(MI->getOperand(0).getReg());
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000687 DecodeUNPCKHMask(getRegOperandVectorVT(MI, MVT::i64, 0), ShuffleMask);
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000688 break;
689
Simon Pilgrim8483df62015-11-17 22:35:45 +0000690 CASE_UNPCK(PUNPCKLBW, r)
Simon Pilgrimf8f86ab2015-09-13 11:28:45 +0000691 case X86::MMX_PUNPCKLBWirr:
Craig Topper89c17612016-06-10 04:48:05 +0000692 Src2Name = getRegName(MI->getOperand(NumOperands - 1).getReg());
693 RegForm = true;
Justin Bognercd1d5aa2016-08-17 20:30:52 +0000694 LLVM_FALLTHROUGH;
695
Simon Pilgrim8483df62015-11-17 22:35:45 +0000696 CASE_UNPCK(PUNPCKLBW, m)
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000697 case X86::MMX_PUNPCKLBWirm:
Craig Topper89c17612016-06-10 04:48:05 +0000698 Src1Name = getRegName(MI->getOperand(NumOperands-(RegForm?2:6)).getReg());
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000699 DestName = getRegName(MI->getOperand(0).getReg());
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000700 DecodeUNPCKLMask(getRegOperandVectorVT(MI, MVT::i8, 0), ShuffleMask);
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000701 break;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000702
Simon Pilgrim8483df62015-11-17 22:35:45 +0000703 CASE_UNPCK(PUNPCKLWD, r)
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000704 case X86::MMX_PUNPCKLWDirr:
Craig Topper89c17612016-06-10 04:48:05 +0000705 Src2Name = getRegName(MI->getOperand(NumOperands - 1).getReg());
706 RegForm = true;
Justin Bognercd1d5aa2016-08-17 20:30:52 +0000707 LLVM_FALLTHROUGH;
708
Simon Pilgrim8483df62015-11-17 22:35:45 +0000709 CASE_UNPCK(PUNPCKLWD, m)
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000710 case X86::MMX_PUNPCKLWDirm:
Craig Topper89c17612016-06-10 04:48:05 +0000711 Src1Name = getRegName(MI->getOperand(NumOperands-(RegForm?2:6)).getReg());
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000712 DestName = getRegName(MI->getOperand(0).getReg());
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000713 DecodeUNPCKLMask(getRegOperandVectorVT(MI, MVT::i16, 0), ShuffleMask);
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000714 break;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000715
Simon Pilgrim8483df62015-11-17 22:35:45 +0000716 CASE_UNPCK(PUNPCKLDQ, r)
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000717 case X86::MMX_PUNPCKLDQirr:
Craig Topper89c17612016-06-10 04:48:05 +0000718 Src2Name = getRegName(MI->getOperand(NumOperands - 1).getReg());
719 RegForm = true;
Justin Bognercd1d5aa2016-08-17 20:30:52 +0000720 LLVM_FALLTHROUGH;
721
Simon Pilgrim8483df62015-11-17 22:35:45 +0000722 CASE_UNPCK(PUNPCKLDQ, m)
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000723 case X86::MMX_PUNPCKLDQirm:
Craig Topper89c17612016-06-10 04:48:05 +0000724 Src1Name = getRegName(MI->getOperand(NumOperands-(RegForm?2:6)).getReg());
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000725 DestName = getRegName(MI->getOperand(0).getReg());
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000726 DecodeUNPCKLMask(getRegOperandVectorVT(MI, MVT::i32, 0), ShuffleMask);
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000727 break;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000728
Simon Pilgrim8483df62015-11-17 22:35:45 +0000729 CASE_UNPCK(PUNPCKLQDQ, r)
Craig Topper89c17612016-06-10 04:48:05 +0000730 Src2Name = getRegName(MI->getOperand(NumOperands - 1).getReg());
731 RegForm = true;
Justin Bognercd1d5aa2016-08-17 20:30:52 +0000732 LLVM_FALLTHROUGH;
733
Simon Pilgrim8483df62015-11-17 22:35:45 +0000734 CASE_UNPCK(PUNPCKLQDQ, m)
Craig Topper89c17612016-06-10 04:48:05 +0000735 Src1Name = getRegName(MI->getOperand(NumOperands-(RegForm?2:6)).getReg());
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000736 DestName = getRegName(MI->getOperand(0).getReg());
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000737 DecodeUNPCKLMask(getRegOperandVectorVT(MI, MVT::i64, 0), ShuffleMask);
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000738 break;
739
Craig Topper01f53b12016-06-03 05:31:00 +0000740 CASE_SHUF(SHUFPD, rri)
Craig Topper89c17612016-06-10 04:48:05 +0000741 Src2Name = getRegName(MI->getOperand(NumOperands - 2).getReg());
742 RegForm = true;
Justin Bognercd1d5aa2016-08-17 20:30:52 +0000743 LLVM_FALLTHROUGH;
744
Craig Topper01f53b12016-06-03 05:31:00 +0000745 CASE_SHUF(SHUFPD, rmi)
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000746 if (MI->getOperand(NumOperands - 1).isImm())
Simon Pilgrim5883a732015-11-16 22:39:27 +0000747 DecodeSHUFPMask(getRegOperandVectorVT(MI, MVT::f64, 0),
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000748 MI->getOperand(NumOperands - 1).getImm(),
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000749 ShuffleMask);
Craig Topper89c17612016-06-10 04:48:05 +0000750 Src1Name = getRegName(MI->getOperand(NumOperands-(RegForm?3:7)).getReg());
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000751 DestName = getRegName(MI->getOperand(0).getReg());
752 break;
753
Craig Topper01f53b12016-06-03 05:31:00 +0000754 CASE_SHUF(SHUFPS, rri)
Craig Topper89c17612016-06-10 04:48:05 +0000755 Src2Name = getRegName(MI->getOperand(NumOperands - 2).getReg());
756 RegForm = true;
Justin Bognercd1d5aa2016-08-17 20:30:52 +0000757 LLVM_FALLTHROUGH;
758
Craig Topper01f53b12016-06-03 05:31:00 +0000759 CASE_SHUF(SHUFPS, rmi)
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000760 if (MI->getOperand(NumOperands - 1).isImm())
Simon Pilgrim5883a732015-11-16 22:39:27 +0000761 DecodeSHUFPMask(getRegOperandVectorVT(MI, MVT::f32, 0),
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000762 MI->getOperand(NumOperands - 1).getImm(),
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000763 ShuffleMask);
Craig Topper89c17612016-06-10 04:48:05 +0000764 Src1Name = getRegName(MI->getOperand(NumOperands-(RegForm?3:7)).getReg());
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000765 DestName = getRegName(MI->getOperand(0).getReg());
766 break;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000767
Igor Breger24cab0f2015-11-16 07:22:00 +0000768 CASE_VSHUF(64X2, r)
Simon Pilgrimd3869412016-06-11 11:18:38 +0000769 Src2Name = getRegName(MI->getOperand(NumOperands - 2).getReg());
770 RegForm = true;
Justin Bognercd1d5aa2016-08-17 20:30:52 +0000771 LLVM_FALLTHROUGH;
772
Igor Breger24cab0f2015-11-16 07:22:00 +0000773 CASE_VSHUF(64X2, m)
Simon Pilgrimd3869412016-06-11 11:18:38 +0000774 decodeVSHUF64x2FamilyMask(getRegOperandVectorVT(MI, MVT::i64, 0),
775 MI->getOperand(NumOperands - 1).getImm(),
Igor Bregerd7bae452015-10-15 13:29:07 +0000776 ShuffleMask);
Simon Pilgrimd3869412016-06-11 11:18:38 +0000777 Src1Name = getRegName(MI->getOperand(NumOperands-(RegForm?3:7)).getReg());
Igor Bregerd7bae452015-10-15 13:29:07 +0000778 DestName = getRegName(MI->getOperand(0).getReg());
Igor Bregerd7bae452015-10-15 13:29:07 +0000779 break;
Simon Pilgrimd3869412016-06-11 11:18:38 +0000780
781 CASE_VSHUF(32X4, r)
782 Src2Name = getRegName(MI->getOperand(NumOperands - 2).getReg());
783 RegForm = true;
Justin Bognercd1d5aa2016-08-17 20:30:52 +0000784 LLVM_FALLTHROUGH;
785
Simon Pilgrimd3869412016-06-11 11:18:38 +0000786 CASE_VSHUF(32X4, m)
787 decodeVSHUF64x2FamilyMask(getRegOperandVectorVT(MI, MVT::i32, 0),
788 MI->getOperand(NumOperands - 1).getImm(),
789 ShuffleMask);
790 Src1Name = getRegName(MI->getOperand(NumOperands-(RegForm?3:7)).getReg());
791 DestName = getRegName(MI->getOperand(0).getReg());
792 break;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000793
Simon Pilgrim8483df62015-11-17 22:35:45 +0000794 CASE_UNPCK(UNPCKLPD, r)
Craig Topper89c17612016-06-10 04:48:05 +0000795 Src2Name = getRegName(MI->getOperand(NumOperands - 1).getReg());
796 RegForm = true;
Justin Bognercd1d5aa2016-08-17 20:30:52 +0000797 LLVM_FALLTHROUGH;
798
Simon Pilgrim8483df62015-11-17 22:35:45 +0000799 CASE_UNPCK(UNPCKLPD, m)
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000800 DecodeUNPCKLMask(getRegOperandVectorVT(MI, MVT::f64, 0), ShuffleMask);
Craig Topper89c17612016-06-10 04:48:05 +0000801 Src1Name = getRegName(MI->getOperand(NumOperands-(RegForm?2:6)).getReg());
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000802 DestName = getRegName(MI->getOperand(0).getReg());
803 break;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000804
Simon Pilgrim8483df62015-11-17 22:35:45 +0000805 CASE_UNPCK(UNPCKLPS, r)
Craig Topper89c17612016-06-10 04:48:05 +0000806 Src2Name = getRegName(MI->getOperand(NumOperands - 1).getReg());
807 RegForm = true;
Justin Bognercd1d5aa2016-08-17 20:30:52 +0000808 LLVM_FALLTHROUGH;
809
Simon Pilgrim8483df62015-11-17 22:35:45 +0000810 CASE_UNPCK(UNPCKLPS, m)
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000811 DecodeUNPCKLMask(getRegOperandVectorVT(MI, MVT::f32, 0), ShuffleMask);
Craig Topper89c17612016-06-10 04:48:05 +0000812 Src1Name = getRegName(MI->getOperand(NumOperands-(RegForm?2:6)).getReg());
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000813 DestName = getRegName(MI->getOperand(0).getReg());
814 break;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000815
Simon Pilgrim8483df62015-11-17 22:35:45 +0000816 CASE_UNPCK(UNPCKHPD, r)
Craig Topper89c17612016-06-10 04:48:05 +0000817 Src2Name = getRegName(MI->getOperand(NumOperands - 1).getReg());
818 RegForm = true;
Justin Bognercd1d5aa2016-08-17 20:30:52 +0000819 LLVM_FALLTHROUGH;
820
Simon Pilgrim8483df62015-11-17 22:35:45 +0000821 CASE_UNPCK(UNPCKHPD, m)
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000822 DecodeUNPCKHMask(getRegOperandVectorVT(MI, MVT::f64, 0), ShuffleMask);
Craig Topper89c17612016-06-10 04:48:05 +0000823 Src1Name = getRegName(MI->getOperand(NumOperands-(RegForm?2:6)).getReg());
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000824 DestName = getRegName(MI->getOperand(0).getReg());
825 break;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000826
Simon Pilgrim8483df62015-11-17 22:35:45 +0000827 CASE_UNPCK(UNPCKHPS, r)
Craig Topper89c17612016-06-10 04:48:05 +0000828 Src2Name = getRegName(MI->getOperand(NumOperands - 1).getReg());
829 RegForm = true;
Justin Bognercd1d5aa2016-08-17 20:30:52 +0000830 LLVM_FALLTHROUGH;
831
Simon Pilgrim8483df62015-11-17 22:35:45 +0000832 CASE_UNPCK(UNPCKHPS, m)
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000833 DecodeUNPCKHMask(getRegOperandVectorVT(MI, MVT::f32, 0), ShuffleMask);
Craig Topper89c17612016-06-10 04:48:05 +0000834 Src1Name = getRegName(MI->getOperand(NumOperands-(RegForm?2:6)).getReg());
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000835 DestName = getRegName(MI->getOperand(0).getReg());
836 break;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000837
Simon Pilgrim5080e7f2016-07-03 18:02:43 +0000838 CASE_VPERMILPI(PERMILPS, r)
Simon Pilgrim6ce35dd2016-05-11 18:53:44 +0000839 Src1Name = getRegName(MI->getOperand(NumOperands - 2).getReg());
Justin Bognercd1d5aa2016-08-17 20:30:52 +0000840 LLVM_FALLTHROUGH;
841
Simon Pilgrim5080e7f2016-07-03 18:02:43 +0000842 CASE_VPERMILPI(PERMILPS, m)
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000843 if (MI->getOperand(NumOperands - 1).isImm())
Simon Pilgrim5883a732015-11-16 22:39:27 +0000844 DecodePSHUFMask(getRegOperandVectorVT(MI, MVT::f32, 0),
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000845 MI->getOperand(NumOperands - 1).getImm(),
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000846 ShuffleMask);
847 DestName = getRegName(MI->getOperand(0).getReg());
848 break;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000849
Simon Pilgrim5080e7f2016-07-03 18:02:43 +0000850 CASE_VPERMILPI(PERMILPD, r)
Simon Pilgrim6ce35dd2016-05-11 18:53:44 +0000851 Src1Name = getRegName(MI->getOperand(NumOperands - 2).getReg());
Justin Bognercd1d5aa2016-08-17 20:30:52 +0000852 LLVM_FALLTHROUGH;
853
Simon Pilgrim5080e7f2016-07-03 18:02:43 +0000854 CASE_VPERMILPI(PERMILPD, m)
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000855 if (MI->getOperand(NumOperands - 1).isImm())
Simon Pilgrim5883a732015-11-16 22:39:27 +0000856 DecodePSHUFMask(getRegOperandVectorVT(MI, MVT::f64, 0),
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000857 MI->getOperand(NumOperands - 1).getImm(),
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000858 ShuffleMask);
859 DestName = getRegName(MI->getOperand(0).getReg());
860 break;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000861
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000862 case X86::VPERM2F128rr:
863 case X86::VPERM2I128rr:
864 Src2Name = getRegName(MI->getOperand(2).getReg());
Justin Bognercd1d5aa2016-08-17 20:30:52 +0000865 LLVM_FALLTHROUGH;
866
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000867 case X86::VPERM2F128rm:
868 case X86::VPERM2I128rm:
869 // For instruction comments purpose, assume the 256-bit vector is v4i64.
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000870 if (MI->getOperand(NumOperands - 1).isImm())
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000871 DecodeVPERM2X128Mask(MVT::v4i64,
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000872 MI->getOperand(NumOperands - 1).getImm(),
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000873 ShuffleMask);
874 Src1Name = getRegName(MI->getOperand(1).getReg());
875 DestName = getRegName(MI->getOperand(0).getReg());
876 break;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000877
Simon Pilgrima0d73832016-07-03 18:27:37 +0000878 CASE_VPERM(PERMPD, r)
Craig Topper200d2372016-06-10 05:12:40 +0000879 Src1Name = getRegName(MI->getOperand(NumOperands - 2).getReg());
Justin Bognercd1d5aa2016-08-17 20:30:52 +0000880 LLVM_FALLTHROUGH;
881
Simon Pilgrima0d73832016-07-03 18:27:37 +0000882 CASE_VPERM(PERMPD, m)
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000883 if (MI->getOperand(NumOperands - 1).isImm())
Simon Pilgrima0d73832016-07-03 18:27:37 +0000884 DecodeVPERMMask(getRegOperandVectorVT(MI, MVT::f64, 0),
885 MI->getOperand(NumOperands - 1).getImm(),
886 ShuffleMask);
887 DestName = getRegName(MI->getOperand(0).getReg());
888 break;
889
890 CASE_VPERM(PERMQ, r)
891 Src1Name = getRegName(MI->getOperand(NumOperands - 2).getReg());
Justin Bognercd1d5aa2016-08-17 20:30:52 +0000892 LLVM_FALLTHROUGH;
893
Simon Pilgrima0d73832016-07-03 18:27:37 +0000894 CASE_VPERM(PERMQ, m)
895 if (MI->getOperand(NumOperands - 1).isImm())
896 DecodeVPERMMask(getRegOperandVectorVT(MI, MVT::i64, 0),
897 MI->getOperand(NumOperands - 1).getImm(),
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000898 ShuffleMask);
899 DestName = getRegName(MI->getOperand(0).getReg());
900 break;
901
902 case X86::MOVSDrr:
903 case X86::VMOVSDrr:
Simon Pilgrimf5c23ad2016-02-01 22:26:28 +0000904 case X86::VMOVSDZrr:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000905 Src2Name = getRegName(MI->getOperand(2).getReg());
906 Src1Name = getRegName(MI->getOperand(1).getReg());
Justin Bognercd1d5aa2016-08-17 20:30:52 +0000907 LLVM_FALLTHROUGH;
908
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000909 case X86::MOVSDrm:
910 case X86::VMOVSDrm:
Simon Pilgrimf5c23ad2016-02-01 22:26:28 +0000911 case X86::VMOVSDZrm:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000912 DecodeScalarMoveMask(MVT::v2f64, nullptr == Src2Name, ShuffleMask);
913 DestName = getRegName(MI->getOperand(0).getReg());
914 break;
Simon Pilgrimd5a15442015-11-21 13:04:42 +0000915
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000916 case X86::MOVSSrr:
917 case X86::VMOVSSrr:
Simon Pilgrimf5c23ad2016-02-01 22:26:28 +0000918 case X86::VMOVSSZrr:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000919 Src2Name = getRegName(MI->getOperand(2).getReg());
920 Src1Name = getRegName(MI->getOperand(1).getReg());
Justin Bognercd1d5aa2016-08-17 20:30:52 +0000921 LLVM_FALLTHROUGH;
922
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000923 case X86::MOVSSrm:
924 case X86::VMOVSSrm:
Simon Pilgrimf5c23ad2016-02-01 22:26:28 +0000925 case X86::VMOVSSZrm:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000926 DecodeScalarMoveMask(MVT::v4f32, nullptr == Src2Name, ShuffleMask);
927 DestName = getRegName(MI->getOperand(0).getReg());
928 break;
929
930 case X86::MOVPQI2QIrr:
Simon Pilgrim3e0c0222015-12-13 12:49:48 +0000931 case X86::MOVZPQILo2PQIrr:
932 case X86::VMOVPQI2QIrr:
933 case X86::VMOVZPQILo2PQIrr:
934 case X86::VMOVZPQILo2PQIZrr:
935 Src1Name = getRegName(MI->getOperand(1).getReg());
Justin Bognercd1d5aa2016-08-17 20:30:52 +0000936 LLVM_FALLTHROUGH;
937
Simon Pilgrim3e0c0222015-12-13 12:49:48 +0000938 case X86::MOVQI2PQIrm:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000939 case X86::MOVZQI2PQIrm:
940 case X86::MOVZPQILo2PQIrm:
Simon Pilgrim3e0c0222015-12-13 12:49:48 +0000941 case X86::VMOVQI2PQIrm:
Simon Pilgrim96fe4ef2016-02-02 13:32:56 +0000942 case X86::VMOVQI2PQIZrm:
Simon Pilgrim3e0c0222015-12-13 12:49:48 +0000943 case X86::VMOVZQI2PQIrm:
944 case X86::VMOVZPQILo2PQIrm:
945 case X86::VMOVZPQILo2PQIZrm:
946 DecodeZeroMoveLowMask(MVT::v2i64, ShuffleMask);
947 DestName = getRegName(MI->getOperand(0).getReg());
948 break;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000949
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000950 case X86::MOVDI2PDIrm:
951 case X86::VMOVDI2PDIrm:
Simon Pilgrim5be17b62016-02-01 23:04:05 +0000952 case X86::VMOVDI2PDIZrm:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000953 DecodeZeroMoveLowMask(MVT::v4i32, ShuffleMask);
954 DestName = getRegName(MI->getOperand(0).getReg());
955 break;
956
Simon Pilgrimd85cae32015-07-06 20:46:41 +0000957 case X86::EXTRQI:
958 if (MI->getOperand(2).isImm() &&
959 MI->getOperand(3).isImm())
960 DecodeEXTRQIMask(MI->getOperand(2).getImm(),
961 MI->getOperand(3).getImm(),
962 ShuffleMask);
963
964 DestName = getRegName(MI->getOperand(0).getReg());
965 Src1Name = getRegName(MI->getOperand(1).getReg());
966 break;
967
968 case X86::INSERTQI:
969 if (MI->getOperand(3).isImm() &&
970 MI->getOperand(4).isImm())
971 DecodeINSERTQIMask(MI->getOperand(3).getImm(),
972 MI->getOperand(4).getImm(),
973 ShuffleMask);
974
975 DestName = getRegName(MI->getOperand(0).getReg());
976 Src1Name = getRegName(MI->getOperand(1).getReg());
977 Src2Name = getRegName(MI->getOperand(2).getReg());
978 break;
979
Simon Pilgrima76a8e52016-07-14 12:07:43 +0000980 case X86::VBROADCASTF128:
981 case X86::VBROADCASTI128:
Craig Topperdde865a2016-10-15 16:26:07 +0000982 CASE_AVX512_INS_COMMON(BROADCASTF64X2, Z128, rm)
983 CASE_AVX512_INS_COMMON(BROADCASTI64X2, Z128, rm)
Simon Pilgrima76a8e52016-07-14 12:07:43 +0000984 DecodeSubVectorBroadcast(MVT::v4f64, MVT::v2f64, ShuffleMask);
985 DestName = getRegName(MI->getOperand(0).getReg());
986 break;
Craig Topperdde865a2016-10-15 16:26:07 +0000987 CASE_AVX512_INS_COMMON(BROADCASTF64X2, , rm)
988 CASE_AVX512_INS_COMMON(BROADCASTI64X2, , rm)
989 DecodeSubVectorBroadcast(MVT::v8f64, MVT::v2f64, ShuffleMask);
990 DestName = getRegName(MI->getOperand(0).getReg());
991 break;
992 CASE_AVX512_INS_COMMON(BROADCASTF64X4, , rm)
993 CASE_AVX512_INS_COMMON(BROADCASTI64X4, , rm)
994 DecodeSubVectorBroadcast(MVT::v8f64, MVT::v4f64, ShuffleMask);
995 DestName = getRegName(MI->getOperand(0).getReg());
996 break;
997 CASE_AVX512_INS_COMMON(BROADCASTF32X4, Z256, rm)
998 CASE_AVX512_INS_COMMON(BROADCASTI32X4, Z256, rm)
999 DecodeSubVectorBroadcast(MVT::v8f32, MVT::v4f32, ShuffleMask);
1000 DestName = getRegName(MI->getOperand(0).getReg());
1001 break;
1002 CASE_AVX512_INS_COMMON(BROADCASTF32X4, , rm)
1003 CASE_AVX512_INS_COMMON(BROADCASTI32X4, , rm)
1004 DecodeSubVectorBroadcast(MVT::v16f32, MVT::v4f32, ShuffleMask);
1005 DestName = getRegName(MI->getOperand(0).getReg());
1006 break;
1007 CASE_AVX512_INS_COMMON(BROADCASTF32X8, , rm)
1008 CASE_AVX512_INS_COMMON(BROADCASTI32X8, , rm)
1009 DecodeSubVectorBroadcast(MVT::v16f32, MVT::v8f32, ShuffleMask);
1010 DestName = getRegName(MI->getOperand(0).getReg());
1011 break;
1012 CASE_AVX512_INS_COMMON(BROADCASTF32X2, Z256, r)
1013 CASE_AVX512_INS_COMMON(BROADCASTI32X2, Z256, r)
1014 Src1Name = getRegName(MI->getOperand(NumOperands - 1).getReg());
1015 CASE_AVX512_INS_COMMON(BROADCASTF32X2, Z256, m)
1016 CASE_AVX512_INS_COMMON(BROADCASTI32X2, Z256, m)
1017 DecodeSubVectorBroadcast(MVT::v8f32, MVT::v2f32, ShuffleMask);
1018 DestName = getRegName(MI->getOperand(0).getReg());
1019 break;
1020 CASE_AVX512_INS_COMMON(BROADCASTF32X2, Z, r)
1021 CASE_AVX512_INS_COMMON(BROADCASTI32X2, Z, r)
1022 Src1Name = getRegName(MI->getOperand(NumOperands - 1).getReg());
1023 CASE_AVX512_INS_COMMON(BROADCASTF32X2, Z, m)
1024 CASE_AVX512_INS_COMMON(BROADCASTI32X2, Z, m)
1025 DecodeSubVectorBroadcast(MVT::v16f32, MVT::v2f32, ShuffleMask);
1026 DestName = getRegName(MI->getOperand(0).getReg());
1027 break;
Simon Pilgrima76a8e52016-07-14 12:07:43 +00001028
Simon Pilgrim0acc32a2016-02-06 19:51:21 +00001029 CASE_PMOVZX(PMOVZXBW, r)
1030 CASE_PMOVZX(PMOVZXBD, r)
1031 CASE_PMOVZX(PMOVZXBQ, r)
Simon Pilgrim3016d9e2016-05-11 17:36:32 +00001032 Src1Name = getRegName(MI->getOperand(NumOperands - 1).getReg());
Justin Bognercd1d5aa2016-08-17 20:30:52 +00001033 LLVM_FALLTHROUGH;
1034
Simon Pilgrim0acc32a2016-02-06 19:51:21 +00001035 CASE_PMOVZX(PMOVZXBW, m)
1036 CASE_PMOVZX(PMOVZXBD, m)
1037 CASE_PMOVZX(PMOVZXBQ, m)
Simon Pilgrime1b6db92016-02-06 16:33:42 +00001038 DecodeZeroExtendMask(MVT::i8, getZeroExtensionResultType(MI), ShuffleMask);
1039 DestName = getRegName(MI->getOperand(0).getReg());
1040 break;
1041
Simon Pilgrim0acc32a2016-02-06 19:51:21 +00001042 CASE_PMOVZX(PMOVZXWD, r)
1043 CASE_PMOVZX(PMOVZXWQ, r)
Simon Pilgrim3016d9e2016-05-11 17:36:32 +00001044 Src1Name = getRegName(MI->getOperand(NumOperands - 1).getReg());
Justin Bognercd1d5aa2016-08-17 20:30:52 +00001045 LLVM_FALLTHROUGH;
1046
Simon Pilgrim0acc32a2016-02-06 19:51:21 +00001047 CASE_PMOVZX(PMOVZXWD, m)
1048 CASE_PMOVZX(PMOVZXWQ, m)
Simon Pilgrime1b6db92016-02-06 16:33:42 +00001049 DecodeZeroExtendMask(MVT::i16, getZeroExtensionResultType(MI), ShuffleMask);
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +00001050 DestName = getRegName(MI->getOperand(0).getReg());
Simon Pilgrime1b6db92016-02-06 16:33:42 +00001051 break;
1052
Simon Pilgrim0acc32a2016-02-06 19:51:21 +00001053 CASE_PMOVZX(PMOVZXDQ, r)
Simon Pilgrim3016d9e2016-05-11 17:36:32 +00001054 Src1Name = getRegName(MI->getOperand(NumOperands - 1).getReg());
Justin Bognercd1d5aa2016-08-17 20:30:52 +00001055 LLVM_FALLTHROUGH;
1056
Simon Pilgrim0acc32a2016-02-06 19:51:21 +00001057 CASE_PMOVZX(PMOVZXDQ, m)
Simon Pilgrime1b6db92016-02-06 16:33:42 +00001058 DecodeZeroExtendMask(MVT::i32, getZeroExtensionResultType(MI), ShuffleMask);
1059 DestName = getRegName(MI->getOperand(0).getReg());
1060 break;
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +00001061 }
1062
1063 // The only comments we decode are shuffles, so give up if we were unable to
1064 // decode a shuffle mask.
1065 if (ShuffleMask.empty())
1066 return false;
1067
1068 if (!DestName) DestName = Src1Name;
Simon Pilgrim7c2fbdc2016-07-03 13:08:29 +00001069 OS << (DestName ? getMaskName(MI, DestName, getRegName) : "mem") << " = ";
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +00001070
1071 // If the two sources are the same, canonicalize the input elements to be
1072 // from the first src so that we get larger element spans.
1073 if (Src1Name == Src2Name) {
1074 for (unsigned i = 0, e = ShuffleMask.size(); i != e; ++i) {
1075 if ((int)ShuffleMask[i] >= 0 && // Not sentinel.
NAKAMURA Takumi5582a6a2015-05-25 01:43:34 +00001076 ShuffleMask[i] >= (int)e) // From second mask.
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +00001077 ShuffleMask[i] -= e;
1078 }
1079 }
1080
1081 // The shuffle mask specifies which elements of the src1/src2 fill in the
1082 // destination, with a few sentinel values. Loop through and print them
1083 // out.
1084 for (unsigned i = 0, e = ShuffleMask.size(); i != e; ++i) {
1085 if (i != 0)
1086 OS << ',';
1087 if (ShuffleMask[i] == SM_SentinelZero) {
1088 OS << "zero";
1089 continue;
1090 }
1091
1092 // Otherwise, it must come from src1 or src2. Print the span of elements
1093 // that comes from this src.
1094 bool isSrc1 = ShuffleMask[i] < (int)ShuffleMask.size();
1095 const char *SrcName = isSrc1 ? Src1Name : Src2Name;
1096 OS << (SrcName ? SrcName : "mem") << '[';
1097 bool IsFirst = true;
1098 while (i != e && (int)ShuffleMask[i] != SM_SentinelZero &&
1099 (ShuffleMask[i] < (int)ShuffleMask.size()) == isSrc1) {
1100 if (!IsFirst)
1101 OS << ',';
1102 else
1103 IsFirst = false;
1104 if (ShuffleMask[i] == SM_SentinelUndef)
1105 OS << "u";
1106 else
1107 OS << ShuffleMask[i] % ShuffleMask.size();
1108 ++i;
1109 }
1110 OS << ']';
NAKAMURA Takumi5582a6a2015-05-25 01:43:34 +00001111 --i; // For loop increments element #.
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +00001112 }
1113 //MI->print(OS, 0);
1114 OS << "\n";
1115
1116 // We successfully added a comment to this instruction.
1117 return true;
1118}