blob: 98c3a03dfe943d3cd1eacea3897133209a8b994e [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 Pilgrimbfa5f232016-02-06 17:02:15 +0000135#define CASE_VSHUF(Inst, src) \
Simon Pilgrim41c05c02016-05-11 11:55:12 +0000136 CASE_AVX512_INS_COMMON(SHUFF##Inst, Z, r##src##i) \
137 CASE_AVX512_INS_COMMON(SHUFI##Inst, Z, r##src##i) \
138 CASE_AVX512_INS_COMMON(SHUFF##Inst, Z256, r##src##i) \
139 CASE_AVX512_INS_COMMON(SHUFI##Inst, Z256, r##src##i)
Simon Pilgrimbfa5f232016-02-06 17:02:15 +0000140
Simon Pilgrim1f590762016-07-03 13:55:41 +0000141#define CASE_MASK_VSHUF(Inst, src) \
142 CASE_MASK_INS_COMMON(SHUFF##Inst, Z, r##src##i) \
143 CASE_MASK_INS_COMMON(SHUFI##Inst, Z, r##src##i) \
144 CASE_MASK_INS_COMMON(SHUFF##Inst, Z256, r##src##i) \
145 CASE_MASK_INS_COMMON(SHUFI##Inst, Z256, r##src##i)
146
147#define CASE_MASKZ_VSHUF(Inst, src) \
148 CASE_MASKZ_INS_COMMON(SHUFF##Inst, Z, r##src##i) \
149 CASE_MASKZ_INS_COMMON(SHUFI##Inst, Z, r##src##i) \
150 CASE_MASKZ_INS_COMMON(SHUFF##Inst, Z256, r##src##i) \
151 CASE_MASKZ_INS_COMMON(SHUFI##Inst, Z256, r##src##i)
152
Igor Breger24cab0f2015-11-16 07:22:00 +0000153static unsigned getVectorRegSize(unsigned RegNo) {
Igor Breger24cab0f2015-11-16 07:22:00 +0000154 if (X86::ZMM0 <= RegNo && RegNo <= X86::ZMM31)
155 return 512;
156 if (X86::YMM0 <= RegNo && RegNo <= X86::YMM31)
157 return 256;
158 if (X86::XMM0 <= RegNo && RegNo <= X86::XMM31)
159 return 128;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000160 if (X86::MM0 <= RegNo && RegNo <= X86::MM7)
161 return 64;
Igor Breger24cab0f2015-11-16 07:22:00 +0000162
163 llvm_unreachable("Unknown vector reg!");
Igor Breger24cab0f2015-11-16 07:22:00 +0000164}
165
166static MVT getRegOperandVectorVT(const MCInst *MI, const MVT &ScalarVT,
167 unsigned OperandIndex) {
168 unsigned OpReg = MI->getOperand(OperandIndex).getReg();
169 return MVT::getVectorVT(ScalarVT,
170 getVectorRegSize(OpReg)/ScalarVT.getSizeInBits());
171}
172
Simon Pilgrime1b6db92016-02-06 16:33:42 +0000173/// \brief Extracts the dst type for a given zero extension instruction.
174static MVT getZeroExtensionResultType(const MCInst *MI) {
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000175 switch (MI->getOpcode()) {
176 default:
177 llvm_unreachable("Unknown zero extension instruction");
Simon Pilgrime1b6db92016-02-06 16:33:42 +0000178 // zero extension to i16
Simon Pilgrim0acc32a2016-02-06 19:51:21 +0000179 CASE_PMOVZX(PMOVZXBW, m)
180 CASE_PMOVZX(PMOVZXBW, r)
Simon Pilgrime1b6db92016-02-06 16:33:42 +0000181 return getRegOperandVectorVT(MI, MVT::i16, 0);
182 // zero extension to i32
Simon Pilgrim0acc32a2016-02-06 19:51:21 +0000183 CASE_PMOVZX(PMOVZXBD, m)
184 CASE_PMOVZX(PMOVZXBD, r)
185 CASE_PMOVZX(PMOVZXWD, m)
186 CASE_PMOVZX(PMOVZXWD, r)
Simon Pilgrime1b6db92016-02-06 16:33:42 +0000187 return getRegOperandVectorVT(MI, MVT::i32, 0);
188 // zero extension to i64
Simon Pilgrim0acc32a2016-02-06 19:51:21 +0000189 CASE_PMOVZX(PMOVZXBQ, m)
190 CASE_PMOVZX(PMOVZXBQ, r)
191 CASE_PMOVZX(PMOVZXWQ, m)
192 CASE_PMOVZX(PMOVZXWQ, r)
193 CASE_PMOVZX(PMOVZXDQ, m)
194 CASE_PMOVZX(PMOVZXDQ, r)
Simon Pilgrime1b6db92016-02-06 16:33:42 +0000195 return getRegOperandVectorVT(MI, MVT::i64, 0);
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000196 }
197}
198
Simon Pilgrim7c2fbdc2016-07-03 13:08:29 +0000199/// Wraps the destination register name with AVX512 mask/maskz filtering.
200static std::string getMaskName(const MCInst *MI, const char *DestName,
201 const char *(*getRegName)(unsigned)) {
202 std::string OpMaskName(DestName);
203
204 bool MaskWithZero = false;
205 const char *MaskRegName = nullptr;
206
207 switch (MI->getOpcode()) {
208 default:
209 return OpMaskName;
210 CASE_MASKZ_MOVDUP(MOVDDUP, m)
211 CASE_MASKZ_MOVDUP(MOVDDUP, r)
212 CASE_MASKZ_MOVDUP(MOVSHDUP, m)
213 CASE_MASKZ_MOVDUP(MOVSHDUP, r)
214 CASE_MASKZ_MOVDUP(MOVSLDUP, m)
215 CASE_MASKZ_MOVDUP(MOVSLDUP, r)
Simon Pilgrim68f438a2016-07-03 13:33:28 +0000216 CASE_MASKZ_PMOVZX(PMOVZXBD, m)
217 CASE_MASKZ_PMOVZX(PMOVZXBD, r)
218 CASE_MASKZ_PMOVZX(PMOVZXBQ, m)
219 CASE_MASKZ_PMOVZX(PMOVZXBQ, r)
220 CASE_MASKZ_PMOVZX(PMOVZXBW, m)
221 CASE_MASKZ_PMOVZX(PMOVZXBW, r)
222 CASE_MASKZ_PMOVZX(PMOVZXDQ, m)
223 CASE_MASKZ_PMOVZX(PMOVZXDQ, r)
224 CASE_MASKZ_PMOVZX(PMOVZXWD, m)
225 CASE_MASKZ_PMOVZX(PMOVZXWD, r)
226 CASE_MASKZ_PMOVZX(PMOVZXWQ, m)
227 CASE_MASKZ_PMOVZX(PMOVZXWQ, r)
Simon Pilgrim598bdb62016-07-03 14:26:21 +0000228 CASE_MASKZ_UNPCK(PUNPCKHBW, m)
229 CASE_MASKZ_UNPCK(PUNPCKHBW, r)
230 CASE_MASKZ_UNPCK(PUNPCKHWD, m)
231 CASE_MASKZ_UNPCK(PUNPCKHWD, r)
232 CASE_MASKZ_UNPCK(PUNPCKHDQ, m)
233 CASE_MASKZ_UNPCK(PUNPCKHDQ, r)
234 CASE_MASKZ_UNPCK(PUNPCKLBW, m)
235 CASE_MASKZ_UNPCK(PUNPCKLBW, r)
236 CASE_MASKZ_UNPCK(PUNPCKLWD, m)
237 CASE_MASKZ_UNPCK(PUNPCKLWD, r)
238 CASE_MASKZ_UNPCK(PUNPCKLDQ, m)
239 CASE_MASKZ_UNPCK(PUNPCKLDQ, r)
240 CASE_MASKZ_UNPCK(UNPCKHPD, m)
241 CASE_MASKZ_UNPCK(UNPCKHPD, r)
242 CASE_MASKZ_UNPCK(UNPCKHPS, m)
243 CASE_MASKZ_UNPCK(UNPCKHPS, r)
244 CASE_MASKZ_UNPCK(UNPCKLPD, m)
245 CASE_MASKZ_UNPCK(UNPCKLPD, r)
246 CASE_MASKZ_UNPCK(UNPCKLPS, m)
247 CASE_MASKZ_UNPCK(UNPCKLPS, r)
Simon Pilgrimdbd6db02016-07-03 15:00:51 +0000248 CASE_MASKZ_SHUF(PALIGNR, r)
249 CASE_MASKZ_SHUF(PALIGNR, m)
Simon Pilgrim1f590762016-07-03 13:55:41 +0000250 CASE_MASKZ_SHUF(SHUFPD, m)
251 CASE_MASKZ_SHUF(SHUFPD, r)
252 CASE_MASKZ_SHUF(SHUFPS, m)
253 CASE_MASKZ_SHUF(SHUFPS, r)
Simon Pilgrim5080e7f2016-07-03 18:02:43 +0000254 CASE_MASKZ_VPERMILPI(PERMILPD, m)
255 CASE_MASKZ_VPERMILPI(PERMILPD, r)
256 CASE_MASKZ_VPERMILPI(PERMILPS, m)
257 CASE_MASKZ_VPERMILPI(PERMILPS, r)
258 CASE_MASKZ_VPERMILPI(PSHUFD, m)
259 CASE_MASKZ_VPERMILPI(PSHUFD, r)
260 CASE_MASKZ_VPERMILPI(PSHUFHW, m)
261 CASE_MASKZ_VPERMILPI(PSHUFHW, r)
262 CASE_MASKZ_VPERMILPI(PSHUFLW, m)
263 CASE_MASKZ_VPERMILPI(PSHUFLW, r)
Simon Pilgrim1f590762016-07-03 13:55:41 +0000264 CASE_MASKZ_VSHUF(64X2, m)
265 CASE_MASKZ_VSHUF(64X2, r)
266 CASE_MASKZ_VSHUF(32X4, m)
267 CASE_MASKZ_VSHUF(32X4, r)
Simon Pilgrim7c2fbdc2016-07-03 13:08:29 +0000268 MaskWithZero = true;
269 MaskRegName = getRegName(MI->getOperand(1).getReg());
270 break;
271 CASE_MASK_MOVDUP(MOVDDUP, m)
272 CASE_MASK_MOVDUP(MOVDDUP, r)
273 CASE_MASK_MOVDUP(MOVSHDUP, m)
274 CASE_MASK_MOVDUP(MOVSHDUP, r)
275 CASE_MASK_MOVDUP(MOVSLDUP, m)
276 CASE_MASK_MOVDUP(MOVSLDUP, r)
Simon Pilgrim68f438a2016-07-03 13:33:28 +0000277 CASE_MASK_PMOVZX(PMOVZXBD, m)
278 CASE_MASK_PMOVZX(PMOVZXBD, r)
279 CASE_MASK_PMOVZX(PMOVZXBQ, m)
280 CASE_MASK_PMOVZX(PMOVZXBQ, r)
281 CASE_MASK_PMOVZX(PMOVZXBW, m)
282 CASE_MASK_PMOVZX(PMOVZXBW, r)
283 CASE_MASK_PMOVZX(PMOVZXDQ, m)
284 CASE_MASK_PMOVZX(PMOVZXDQ, r)
285 CASE_MASK_PMOVZX(PMOVZXWD, m)
286 CASE_MASK_PMOVZX(PMOVZXWD, r)
287 CASE_MASK_PMOVZX(PMOVZXWQ, m)
288 CASE_MASK_PMOVZX(PMOVZXWQ, r)
Simon Pilgrim598bdb62016-07-03 14:26:21 +0000289 CASE_MASK_UNPCK(PUNPCKHBW, m)
290 CASE_MASK_UNPCK(PUNPCKHBW, r)
291 CASE_MASK_UNPCK(PUNPCKHWD, m)
292 CASE_MASK_UNPCK(PUNPCKHWD, r)
293 CASE_MASK_UNPCK(PUNPCKHDQ, m)
294 CASE_MASK_UNPCK(PUNPCKHDQ, r)
295 CASE_MASK_UNPCK(PUNPCKLBW, m)
296 CASE_MASK_UNPCK(PUNPCKLBW, r)
297 CASE_MASK_UNPCK(PUNPCKLWD, m)
298 CASE_MASK_UNPCK(PUNPCKLWD, r)
299 CASE_MASK_UNPCK(PUNPCKLDQ, m)
300 CASE_MASK_UNPCK(PUNPCKLDQ, r)
301 CASE_MASK_UNPCK(UNPCKHPD, m)
302 CASE_MASK_UNPCK(UNPCKHPD, r)
303 CASE_MASK_UNPCK(UNPCKHPS, m)
304 CASE_MASK_UNPCK(UNPCKHPS, r)
305 CASE_MASK_UNPCK(UNPCKLPD, m)
306 CASE_MASK_UNPCK(UNPCKLPD, r)
307 CASE_MASK_UNPCK(UNPCKLPS, m)
308 CASE_MASK_UNPCK(UNPCKLPS, r)
Simon Pilgrimdbd6db02016-07-03 15:00:51 +0000309 CASE_MASK_SHUF(PALIGNR, r)
310 CASE_MASK_SHUF(PALIGNR, m)
Simon Pilgrim1f590762016-07-03 13:55:41 +0000311 CASE_MASK_SHUF(SHUFPD, m)
312 CASE_MASK_SHUF(SHUFPD, r)
313 CASE_MASK_SHUF(SHUFPS, m)
314 CASE_MASK_SHUF(SHUFPS, r)
Simon Pilgrim5080e7f2016-07-03 18:02:43 +0000315 CASE_MASK_VPERMILPI(PERMILPD, m)
316 CASE_MASK_VPERMILPI(PERMILPD, r)
317 CASE_MASK_VPERMILPI(PERMILPS, m)
318 CASE_MASK_VPERMILPI(PERMILPS, r)
319 CASE_MASK_VPERMILPI(PSHUFD, m)
320 CASE_MASK_VPERMILPI(PSHUFD, r)
321 CASE_MASK_VPERMILPI(PSHUFHW, m)
322 CASE_MASK_VPERMILPI(PSHUFHW, r)
323 CASE_MASK_VPERMILPI(PSHUFLW, m)
324 CASE_MASK_VPERMILPI(PSHUFLW, r)
Simon Pilgrim1f590762016-07-03 13:55:41 +0000325 CASE_MASK_VSHUF(64X2, m)
326 CASE_MASK_VSHUF(64X2, r)
327 CASE_MASK_VSHUF(32X4, m)
328 CASE_MASK_VSHUF(32X4, r)
Simon Pilgrim7c2fbdc2016-07-03 13:08:29 +0000329 MaskRegName = getRegName(MI->getOperand(2).getReg());
330 break;
331 }
332
333 // MASK: zmmX {%kY}
334 OpMaskName += " {%";
335 OpMaskName += MaskRegName;
336 OpMaskName += "}";
337
338 // MASKZ: zmmX {%kY} {z}
339 if (MaskWithZero)
340 OpMaskName += " {z}";
341
342 return OpMaskName;
343}
344
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000345//===----------------------------------------------------------------------===//
346// Top Level Entrypoint
347//===----------------------------------------------------------------------===//
348
349/// EmitAnyX86InstComments - This function decodes x86 instructions and prints
350/// newline terminated strings to the specified string if desired. This
351/// information is shown in disassembly dumps when verbose assembly is enabled.
352bool llvm::EmitAnyX86InstComments(const MCInst *MI, raw_ostream &OS,
353 const char *(*getRegName)(unsigned)) {
354 // If this is a shuffle operation, the switch should fill in this state.
355 SmallVector<int, 8> ShuffleMask;
356 const char *DestName = nullptr, *Src1Name = nullptr, *Src2Name = nullptr;
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000357 unsigned NumOperands = MI->getNumOperands();
Craig Topper89c17612016-06-10 04:48:05 +0000358 bool RegForm = false;
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000359
360 switch (MI->getOpcode()) {
361 default:
362 // Not an instruction for which we can decode comments.
363 return false;
364
365 case X86::BLENDPDrri:
366 case X86::VBLENDPDrri:
Simon Pilgrim13d3a202015-11-16 23:03:18 +0000367 case X86::VBLENDPDYrri:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000368 Src2Name = getRegName(MI->getOperand(2).getReg());
369 // FALL THROUGH.
370 case X86::BLENDPDrmi:
371 case X86::VBLENDPDrmi:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000372 case X86::VBLENDPDYrmi:
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000373 if (MI->getOperand(NumOperands - 1).isImm())
Simon Pilgrim13d3a202015-11-16 23:03:18 +0000374 DecodeBLENDMask(getRegOperandVectorVT(MI, MVT::f64, 0),
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000375 MI->getOperand(NumOperands - 1).getImm(),
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000376 ShuffleMask);
377 Src1Name = getRegName(MI->getOperand(1).getReg());
378 DestName = getRegName(MI->getOperand(0).getReg());
379 break;
380
381 case X86::BLENDPSrri:
382 case X86::VBLENDPSrri:
Simon Pilgrim13d3a202015-11-16 23:03:18 +0000383 case X86::VBLENDPSYrri:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000384 Src2Name = getRegName(MI->getOperand(2).getReg());
385 // FALL THROUGH.
386 case X86::BLENDPSrmi:
387 case X86::VBLENDPSrmi:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000388 case X86::VBLENDPSYrmi:
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::f32, 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::PBLENDWrri:
398 case X86::VPBLENDWrri:
Simon Pilgrim13d3a202015-11-16 23:03:18 +0000399 case X86::VPBLENDWYrri:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000400 Src2Name = getRegName(MI->getOperand(2).getReg());
401 // FALL THROUGH.
402 case X86::PBLENDWrmi:
403 case X86::VPBLENDWrmi:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000404 case X86::VPBLENDWYrmi:
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::i16, 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::VPBLENDDrri:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000414 case X86::VPBLENDDYrri:
415 Src2Name = getRegName(MI->getOperand(2).getReg());
416 // FALL THROUGH.
Simon Pilgrim13d3a202015-11-16 23:03:18 +0000417 case X86::VPBLENDDrmi:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000418 case X86::VPBLENDDYrmi:
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000419 if (MI->getOperand(NumOperands - 1).isImm())
Simon Pilgrim13d3a202015-11-16 23:03:18 +0000420 DecodeBLENDMask(getRegOperandVectorVT(MI, MVT::i32, 0),
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000421 MI->getOperand(NumOperands - 1).getImm(),
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000422 ShuffleMask);
423 Src1Name = getRegName(MI->getOperand(1).getReg());
424 DestName = getRegName(MI->getOperand(0).getReg());
425 break;
426
427 case X86::INSERTPSrr:
428 case X86::VINSERTPSrr:
Simon Pilgrim025a3d852016-02-01 22:05:50 +0000429 case X86::VINSERTPSzrr:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000430 Src2Name = getRegName(MI->getOperand(2).getReg());
431 // FALL THROUGH.
432 case X86::INSERTPSrm:
433 case X86::VINSERTPSrm:
Simon Pilgrim025a3d852016-02-01 22:05:50 +0000434 case X86::VINSERTPSzrm:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000435 DestName = getRegName(MI->getOperand(0).getReg());
436 Src1Name = getRegName(MI->getOperand(1).getReg());
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000437 if (MI->getOperand(NumOperands - 1).isImm())
438 DecodeINSERTPSMask(MI->getOperand(NumOperands - 1).getImm(),
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000439 ShuffleMask);
440 break;
441
442 case X86::MOVLHPSrr:
443 case X86::VMOVLHPSrr:
Simon Pilgrimd5a15442015-11-21 13:04:42 +0000444 case X86::VMOVLHPSZrr:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000445 Src2Name = getRegName(MI->getOperand(2).getReg());
446 Src1Name = getRegName(MI->getOperand(1).getReg());
447 DestName = getRegName(MI->getOperand(0).getReg());
448 DecodeMOVLHPSMask(2, ShuffleMask);
449 break;
450
451 case X86::MOVHLPSrr:
452 case X86::VMOVHLPSrr:
Simon Pilgrimd5a15442015-11-21 13:04:42 +0000453 case X86::VMOVHLPSZrr:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000454 Src2Name = getRegName(MI->getOperand(2).getReg());
455 Src1Name = getRegName(MI->getOperand(1).getReg());
456 DestName = getRegName(MI->getOperand(0).getReg());
457 DecodeMOVHLPSMask(2, ShuffleMask);
458 break;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000459
Simon Pilgrima3d67442016-02-07 15:39:22 +0000460 case X86::MOVHPDrm:
461 case X86::VMOVHPDrm:
462 case X86::VMOVHPDZ128rm:
463 Src1Name = getRegName(MI->getOperand(1).getReg());
464 DestName = getRegName(MI->getOperand(0).getReg());
465 DecodeInsertElementMask(MVT::v2f64, 1, 1, ShuffleMask);
466 break;
467
468 case X86::MOVHPSrm:
469 case X86::VMOVHPSrm:
470 case X86::VMOVHPSZ128rm:
471 Src1Name = getRegName(MI->getOperand(1).getReg());
472 DestName = getRegName(MI->getOperand(0).getReg());
473 DecodeInsertElementMask(MVT::v4f32, 2, 2, ShuffleMask);
474 break;
475
476 case X86::MOVLPDrm:
477 case X86::VMOVLPDrm:
478 case X86::VMOVLPDZ128rm:
479 Src1Name = getRegName(MI->getOperand(1).getReg());
480 DestName = getRegName(MI->getOperand(0).getReg());
481 DecodeInsertElementMask(MVT::v2f64, 0, 1, ShuffleMask);
482 break;
483
484 case X86::MOVLPSrm:
485 case X86::VMOVLPSrm:
486 case X86::VMOVLPSZ128rm:
487 Src1Name = getRegName(MI->getOperand(1).getReg());
488 DestName = getRegName(MI->getOperand(0).getReg());
489 DecodeInsertElementMask(MVT::v4f32, 0, 2, ShuffleMask);
490 break;
491
Igor Breger24cab0f2015-11-16 07:22:00 +0000492 CASE_MOVDUP(MOVSLDUP, r)
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000493 Src1Name = getRegName(MI->getOperand(NumOperands - 1).getReg());
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000494 // FALL THROUGH.
Igor Breger1f782962015-11-19 08:26:56 +0000495 CASE_MOVDUP(MOVSLDUP, m)
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000496 DestName = getRegName(MI->getOperand(0).getReg());
Igor Breger1f782962015-11-19 08:26:56 +0000497 DecodeMOVSLDUPMask(getRegOperandVectorVT(MI, MVT::f32, 0), ShuffleMask);
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000498 break;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000499
Igor Breger24cab0f2015-11-16 07:22:00 +0000500 CASE_MOVDUP(MOVSHDUP, r)
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000501 Src1Name = getRegName(MI->getOperand(NumOperands - 1).getReg());
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000502 // FALL THROUGH.
Igor Breger1f782962015-11-19 08:26:56 +0000503 CASE_MOVDUP(MOVSHDUP, m)
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000504 DestName = getRegName(MI->getOperand(0).getReg());
Igor Breger1f782962015-11-19 08:26:56 +0000505 DecodeMOVSHDUPMask(getRegOperandVectorVT(MI, MVT::f32, 0), ShuffleMask);
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000506 break;
507
Igor Breger1f782962015-11-19 08:26:56 +0000508 CASE_MOVDUP(MOVDDUP, r)
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000509 Src1Name = getRegName(MI->getOperand(NumOperands - 1).getReg());
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000510 // FALL THROUGH.
Igor Breger1f782962015-11-19 08:26:56 +0000511 CASE_MOVDUP(MOVDDUP, m)
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000512 DestName = getRegName(MI->getOperand(0).getReg());
Igor Breger1f782962015-11-19 08:26:56 +0000513 DecodeMOVDDUPMask(getRegOperandVectorVT(MI, MVT::f64, 0), ShuffleMask);
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000514 break;
515
516 case X86::PSLLDQri:
517 case X86::VPSLLDQri:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000518 case X86::VPSLLDQYri:
Simon Pilgrim643734c2016-06-09 22:03:15 +0000519 case X86::VPSLLDQZ128rr:
520 case X86::VPSLLDQZ256rr:
521 case X86::VPSLLDQZ512rr:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000522 Src1Name = getRegName(MI->getOperand(1).getReg());
Simon Pilgrim643734c2016-06-09 22:03:15 +0000523 case X86::VPSLLDQZ128rm:
524 case X86::VPSLLDQZ256rm:
525 case X86::VPSLLDQZ512rm:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000526 DestName = getRegName(MI->getOperand(0).getReg());
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000527 if (MI->getOperand(NumOperands - 1).isImm())
Simon Pilgrimb9ada272015-11-16 22:54:41 +0000528 DecodePSLLDQMask(getRegOperandVectorVT(MI, MVT::i8, 0),
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000529 MI->getOperand(NumOperands - 1).getImm(),
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000530 ShuffleMask);
531 break;
532
533 case X86::PSRLDQri:
534 case X86::VPSRLDQri:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000535 case X86::VPSRLDQYri:
Simon Pilgrim643734c2016-06-09 22:03:15 +0000536 case X86::VPSRLDQZ128rr:
537 case X86::VPSRLDQZ256rr:
538 case X86::VPSRLDQZ512rr:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000539 Src1Name = getRegName(MI->getOperand(1).getReg());
Simon Pilgrim643734c2016-06-09 22:03:15 +0000540 case X86::VPSRLDQZ128rm:
541 case X86::VPSRLDQZ256rm:
542 case X86::VPSRLDQZ512rm:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000543 DestName = getRegName(MI->getOperand(0).getReg());
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000544 if (MI->getOperand(NumOperands - 1).isImm())
Simon Pilgrimb9ada272015-11-16 22:54:41 +0000545 DecodePSRLDQMask(getRegOperandVectorVT(MI, MVT::i8, 0),
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000546 MI->getOperand(NumOperands - 1).getImm(),
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000547 ShuffleMask);
548 break;
549
Craig Topper7a299302016-06-09 07:06:38 +0000550 CASE_SHUF(PALIGNR, rri)
Craig Topper89c17612016-06-10 04:48:05 +0000551 Src1Name = getRegName(MI->getOperand(NumOperands - 2).getReg());
552 RegForm = true;
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000553 // FALL THROUGH.
Craig Topper7a299302016-06-09 07:06:38 +0000554 CASE_SHUF(PALIGNR, rmi)
Craig Topper89c17612016-06-10 04:48:05 +0000555 Src2Name = getRegName(MI->getOperand(NumOperands-(RegForm?3:7)).getReg());
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000556 DestName = getRegName(MI->getOperand(0).getReg());
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000557 if (MI->getOperand(NumOperands - 1).isImm())
Simon Pilgrimb9ada272015-11-16 22:54:41 +0000558 DecodePALIGNRMask(getRegOperandVectorVT(MI, MVT::i8, 0),
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000559 MI->getOperand(NumOperands - 1).getImm(),
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000560 ShuffleMask);
561 break;
562
Craig Topper01f53b12016-06-03 05:31:00 +0000563 CASE_SHUF(PSHUFD, ri)
Craig Topper6f7288d2016-06-09 07:49:08 +0000564 Src1Name = getRegName(MI->getOperand(NumOperands - 2).getReg());
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000565 // FALL THROUGH.
Craig Topper01f53b12016-06-03 05:31:00 +0000566 CASE_SHUF(PSHUFD, mi)
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000567 DestName = getRegName(MI->getOperand(0).getReg());
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000568 if (MI->getOperand(NumOperands - 1).isImm())
Simon Pilgrim5883a732015-11-16 22:39:27 +0000569 DecodePSHUFMask(getRegOperandVectorVT(MI, MVT::i32, 0),
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000570 MI->getOperand(NumOperands - 1).getImm(),
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000571 ShuffleMask);
572 break;
573
Craig Topper01f53b12016-06-03 05:31:00 +0000574 CASE_SHUF(PSHUFHW, ri)
Craig Topper6f7288d2016-06-09 07:49:08 +0000575 Src1Name = getRegName(MI->getOperand(NumOperands - 2).getReg());
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000576 // FALL THROUGH.
Craig Topper01f53b12016-06-03 05:31:00 +0000577 CASE_SHUF(PSHUFHW, mi)
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000578 DestName = getRegName(MI->getOperand(0).getReg());
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000579 if (MI->getOperand(NumOperands - 1).isImm())
Simon Pilgrim5883a732015-11-16 22:39:27 +0000580 DecodePSHUFHWMask(getRegOperandVectorVT(MI, MVT::i16, 0),
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000581 MI->getOperand(NumOperands - 1).getImm(),
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000582 ShuffleMask);
583 break;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000584
Craig Topper01f53b12016-06-03 05:31:00 +0000585 CASE_SHUF(PSHUFLW, ri)
Craig Topper6f7288d2016-06-09 07:49:08 +0000586 Src1Name = getRegName(MI->getOperand(NumOperands - 2).getReg());
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000587 // FALL THROUGH.
Craig Topper01f53b12016-06-03 05:31:00 +0000588 CASE_SHUF(PSHUFLW, mi)
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000589 DestName = getRegName(MI->getOperand(0).getReg());
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000590 if (MI->getOperand(NumOperands - 1).isImm())
Simon Pilgrim5883a732015-11-16 22:39:27 +0000591 DecodePSHUFLWMask(getRegOperandVectorVT(MI, MVT::i16, 0),
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000592 MI->getOperand(NumOperands - 1).getImm(),
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000593 ShuffleMask);
594 break;
595
Simon Pilgrimf8f86ab2015-09-13 11:28:45 +0000596 case X86::MMX_PSHUFWri:
597 Src1Name = getRegName(MI->getOperand(1).getReg());
598 // FALL THROUGH.
599 case X86::MMX_PSHUFWmi:
600 DestName = getRegName(MI->getOperand(0).getReg());
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000601 if (MI->getOperand(NumOperands - 1).isImm())
Simon Pilgrimf8f86ab2015-09-13 11:28:45 +0000602 DecodePSHUFMask(MVT::v4i16,
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000603 MI->getOperand(NumOperands - 1).getImm(),
Simon Pilgrimf8f86ab2015-09-13 11:28:45 +0000604 ShuffleMask);
605 break;
606
607 case X86::PSWAPDrr:
608 Src1Name = getRegName(MI->getOperand(1).getReg());
609 // FALL THROUGH.
610 case X86::PSWAPDrm:
611 DestName = getRegName(MI->getOperand(0).getReg());
612 DecodePSWAPMask(MVT::v2i32, ShuffleMask);
613 break;
614
Simon Pilgrim8483df62015-11-17 22:35:45 +0000615 CASE_UNPCK(PUNPCKHBW, r)
Simon Pilgrimf8f86ab2015-09-13 11:28:45 +0000616 case X86::MMX_PUNPCKHBWirr:
Craig Topper89c17612016-06-10 04:48:05 +0000617 Src2Name = getRegName(MI->getOperand(NumOperands - 1).getReg());
618 RegForm = true;
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000619 // FALL THROUGH.
Simon Pilgrim8483df62015-11-17 22:35:45 +0000620 CASE_UNPCK(PUNPCKHBW, m)
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000621 case X86::MMX_PUNPCKHBWirm:
Craig Topper89c17612016-06-10 04:48:05 +0000622 Src1Name = getRegName(MI->getOperand(NumOperands-(RegForm?2:6)).getReg());
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000623 DestName = getRegName(MI->getOperand(0).getReg());
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000624 DecodeUNPCKHMask(getRegOperandVectorVT(MI, MVT::i8, 0), ShuffleMask);
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000625 break;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000626
Simon Pilgrim8483df62015-11-17 22:35:45 +0000627 CASE_UNPCK(PUNPCKHWD, r)
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000628 case X86::MMX_PUNPCKHWDirr:
Craig Topper89c17612016-06-10 04:48:05 +0000629 Src2Name = getRegName(MI->getOperand(NumOperands - 1).getReg());
630 RegForm = true;
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000631 // FALL THROUGH.
Simon Pilgrim8483df62015-11-17 22:35:45 +0000632 CASE_UNPCK(PUNPCKHWD, m)
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000633 case X86::MMX_PUNPCKHWDirm:
Craig Topper89c17612016-06-10 04:48:05 +0000634 Src1Name = getRegName(MI->getOperand(NumOperands-(RegForm?2:6)).getReg());
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000635 DestName = getRegName(MI->getOperand(0).getReg());
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000636 DecodeUNPCKHMask(getRegOperandVectorVT(MI, MVT::i16, 0), ShuffleMask);
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000637 break;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000638
Simon Pilgrim8483df62015-11-17 22:35:45 +0000639 CASE_UNPCK(PUNPCKHDQ, r)
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000640 case X86::MMX_PUNPCKHDQirr:
Craig Topper89c17612016-06-10 04:48:05 +0000641 Src2Name = getRegName(MI->getOperand(NumOperands - 1).getReg());
642 RegForm = true;
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000643 // FALL THROUGH.
Simon Pilgrim8483df62015-11-17 22:35:45 +0000644 CASE_UNPCK(PUNPCKHDQ, m)
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000645 case X86::MMX_PUNPCKHDQirm:
Craig Topper89c17612016-06-10 04:48:05 +0000646 Src1Name = getRegName(MI->getOperand(NumOperands-(RegForm?2:6)).getReg());
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000647 DestName = getRegName(MI->getOperand(0).getReg());
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000648 DecodeUNPCKHMask(getRegOperandVectorVT(MI, MVT::i32, 0), ShuffleMask);
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000649 break;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000650
Simon Pilgrim8483df62015-11-17 22:35:45 +0000651 CASE_UNPCK(PUNPCKHQDQ, r)
Craig Topper89c17612016-06-10 04:48:05 +0000652 Src2Name = getRegName(MI->getOperand(NumOperands - 1).getReg());
653 RegForm = true;
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000654 // FALL THROUGH.
Simon Pilgrim8483df62015-11-17 22:35:45 +0000655 CASE_UNPCK(PUNPCKHQDQ, m)
Craig Topper89c17612016-06-10 04:48:05 +0000656 Src1Name = getRegName(MI->getOperand(NumOperands-(RegForm?2:6)).getReg());
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000657 DestName = getRegName(MI->getOperand(0).getReg());
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000658 DecodeUNPCKHMask(getRegOperandVectorVT(MI, MVT::i64, 0), ShuffleMask);
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000659 break;
660
Simon Pilgrim8483df62015-11-17 22:35:45 +0000661 CASE_UNPCK(PUNPCKLBW, r)
Simon Pilgrimf8f86ab2015-09-13 11:28:45 +0000662 case X86::MMX_PUNPCKLBWirr:
Craig Topper89c17612016-06-10 04:48:05 +0000663 Src2Name = getRegName(MI->getOperand(NumOperands - 1).getReg());
664 RegForm = true;
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000665 // FALL THROUGH.
Simon Pilgrim8483df62015-11-17 22:35:45 +0000666 CASE_UNPCK(PUNPCKLBW, m)
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000667 case X86::MMX_PUNPCKLBWirm:
Craig Topper89c17612016-06-10 04:48:05 +0000668 Src1Name = getRegName(MI->getOperand(NumOperands-(RegForm?2:6)).getReg());
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000669 DestName = getRegName(MI->getOperand(0).getReg());
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000670 DecodeUNPCKLMask(getRegOperandVectorVT(MI, MVT::i8, 0), ShuffleMask);
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000671 break;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000672
Simon Pilgrim8483df62015-11-17 22:35:45 +0000673 CASE_UNPCK(PUNPCKLWD, r)
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000674 case X86::MMX_PUNPCKLWDirr:
Craig Topper89c17612016-06-10 04:48:05 +0000675 Src2Name = getRegName(MI->getOperand(NumOperands - 1).getReg());
676 RegForm = true;
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000677 // FALL THROUGH.
Simon Pilgrim8483df62015-11-17 22:35:45 +0000678 CASE_UNPCK(PUNPCKLWD, m)
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000679 case X86::MMX_PUNPCKLWDirm:
Craig Topper89c17612016-06-10 04:48:05 +0000680 Src1Name = getRegName(MI->getOperand(NumOperands-(RegForm?2:6)).getReg());
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000681 DestName = getRegName(MI->getOperand(0).getReg());
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000682 DecodeUNPCKLMask(getRegOperandVectorVT(MI, MVT::i16, 0), ShuffleMask);
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000683 break;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000684
Simon Pilgrim8483df62015-11-17 22:35:45 +0000685 CASE_UNPCK(PUNPCKLDQ, r)
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000686 case X86::MMX_PUNPCKLDQirr:
Craig Topper89c17612016-06-10 04:48:05 +0000687 Src2Name = getRegName(MI->getOperand(NumOperands - 1).getReg());
688 RegForm = true;
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000689 // FALL THROUGH.
Simon Pilgrim8483df62015-11-17 22:35:45 +0000690 CASE_UNPCK(PUNPCKLDQ, m)
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000691 case X86::MMX_PUNPCKLDQirm:
Craig Topper89c17612016-06-10 04:48:05 +0000692 Src1Name = getRegName(MI->getOperand(NumOperands-(RegForm?2:6)).getReg());
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000693 DestName = getRegName(MI->getOperand(0).getReg());
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000694 DecodeUNPCKLMask(getRegOperandVectorVT(MI, MVT::i32, 0), ShuffleMask);
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000695 break;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000696
Simon Pilgrim8483df62015-11-17 22:35:45 +0000697 CASE_UNPCK(PUNPCKLQDQ, r)
Craig Topper89c17612016-06-10 04:48:05 +0000698 Src2Name = getRegName(MI->getOperand(NumOperands - 1).getReg());
699 RegForm = true;
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000700 // FALL THROUGH.
Simon Pilgrim8483df62015-11-17 22:35:45 +0000701 CASE_UNPCK(PUNPCKLQDQ, m)
Craig Topper89c17612016-06-10 04:48:05 +0000702 Src1Name = getRegName(MI->getOperand(NumOperands-(RegForm?2:6)).getReg());
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000703 DestName = getRegName(MI->getOperand(0).getReg());
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000704 DecodeUNPCKLMask(getRegOperandVectorVT(MI, MVT::i64, 0), ShuffleMask);
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000705 break;
706
Craig Topper01f53b12016-06-03 05:31:00 +0000707 CASE_SHUF(SHUFPD, rri)
Craig Topper89c17612016-06-10 04:48:05 +0000708 Src2Name = getRegName(MI->getOperand(NumOperands - 2).getReg());
709 RegForm = true;
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000710 // FALL THROUGH.
Craig Topper01f53b12016-06-03 05:31:00 +0000711 CASE_SHUF(SHUFPD, rmi)
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000712 if (MI->getOperand(NumOperands - 1).isImm())
Simon Pilgrim5883a732015-11-16 22:39:27 +0000713 DecodeSHUFPMask(getRegOperandVectorVT(MI, MVT::f64, 0),
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000714 MI->getOperand(NumOperands - 1).getImm(),
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000715 ShuffleMask);
Craig Topper89c17612016-06-10 04:48:05 +0000716 Src1Name = getRegName(MI->getOperand(NumOperands-(RegForm?3:7)).getReg());
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000717 DestName = getRegName(MI->getOperand(0).getReg());
718 break;
719
Craig Topper01f53b12016-06-03 05:31:00 +0000720 CASE_SHUF(SHUFPS, rri)
Craig Topper89c17612016-06-10 04:48:05 +0000721 Src2Name = getRegName(MI->getOperand(NumOperands - 2).getReg());
722 RegForm = true;
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000723 // FALL THROUGH.
Craig Topper01f53b12016-06-03 05:31:00 +0000724 CASE_SHUF(SHUFPS, rmi)
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000725 if (MI->getOperand(NumOperands - 1).isImm())
Simon Pilgrim5883a732015-11-16 22:39:27 +0000726 DecodeSHUFPMask(getRegOperandVectorVT(MI, MVT::f32, 0),
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000727 MI->getOperand(NumOperands - 1).getImm(),
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000728 ShuffleMask);
Craig Topper89c17612016-06-10 04:48:05 +0000729 Src1Name = getRegName(MI->getOperand(NumOperands-(RegForm?3:7)).getReg());
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000730 DestName = getRegName(MI->getOperand(0).getReg());
731 break;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000732
Igor Breger24cab0f2015-11-16 07:22:00 +0000733 CASE_VSHUF(64X2, r)
Simon Pilgrimd3869412016-06-11 11:18:38 +0000734 Src2Name = getRegName(MI->getOperand(NumOperands - 2).getReg());
735 RegForm = true;
736 // FALL THROUGH.
Igor Breger24cab0f2015-11-16 07:22:00 +0000737 CASE_VSHUF(64X2, m)
Simon Pilgrimd3869412016-06-11 11:18:38 +0000738 decodeVSHUF64x2FamilyMask(getRegOperandVectorVT(MI, MVT::i64, 0),
739 MI->getOperand(NumOperands - 1).getImm(),
Igor Bregerd7bae452015-10-15 13:29:07 +0000740 ShuffleMask);
Simon Pilgrimd3869412016-06-11 11:18:38 +0000741 Src1Name = getRegName(MI->getOperand(NumOperands-(RegForm?3:7)).getReg());
Igor Bregerd7bae452015-10-15 13:29:07 +0000742 DestName = getRegName(MI->getOperand(0).getReg());
Igor Bregerd7bae452015-10-15 13:29:07 +0000743 break;
Simon Pilgrimd3869412016-06-11 11:18:38 +0000744
745 CASE_VSHUF(32X4, r)
746 Src2Name = getRegName(MI->getOperand(NumOperands - 2).getReg());
747 RegForm = true;
748 // FALL THROUGH.
749 CASE_VSHUF(32X4, m)
750 decodeVSHUF64x2FamilyMask(getRegOperandVectorVT(MI, MVT::i32, 0),
751 MI->getOperand(NumOperands - 1).getImm(),
752 ShuffleMask);
753 Src1Name = getRegName(MI->getOperand(NumOperands-(RegForm?3:7)).getReg());
754 DestName = getRegName(MI->getOperand(0).getReg());
755 break;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000756
Simon Pilgrim8483df62015-11-17 22:35:45 +0000757 CASE_UNPCK(UNPCKLPD, r)
Craig Topper89c17612016-06-10 04:48:05 +0000758 Src2Name = getRegName(MI->getOperand(NumOperands - 1).getReg());
759 RegForm = true;
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000760 // FALL THROUGH.
Simon Pilgrim8483df62015-11-17 22:35:45 +0000761 CASE_UNPCK(UNPCKLPD, m)
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000762 DecodeUNPCKLMask(getRegOperandVectorVT(MI, MVT::f64, 0), ShuffleMask);
Craig Topper89c17612016-06-10 04:48:05 +0000763 Src1Name = getRegName(MI->getOperand(NumOperands-(RegForm?2:6)).getReg());
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000764 DestName = getRegName(MI->getOperand(0).getReg());
765 break;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000766
Simon Pilgrim8483df62015-11-17 22:35:45 +0000767 CASE_UNPCK(UNPCKLPS, r)
Craig Topper89c17612016-06-10 04:48:05 +0000768 Src2Name = getRegName(MI->getOperand(NumOperands - 1).getReg());
769 RegForm = true;
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000770 // FALL THROUGH.
Simon Pilgrim8483df62015-11-17 22:35:45 +0000771 CASE_UNPCK(UNPCKLPS, m)
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000772 DecodeUNPCKLMask(getRegOperandVectorVT(MI, MVT::f32, 0), ShuffleMask);
Craig Topper89c17612016-06-10 04:48:05 +0000773 Src1Name = getRegName(MI->getOperand(NumOperands-(RegForm?2:6)).getReg());
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000774 DestName = getRegName(MI->getOperand(0).getReg());
775 break;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000776
Simon Pilgrim8483df62015-11-17 22:35:45 +0000777 CASE_UNPCK(UNPCKHPD, r)
Craig Topper89c17612016-06-10 04:48:05 +0000778 Src2Name = getRegName(MI->getOperand(NumOperands - 1).getReg());
779 RegForm = true;
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000780 // FALL THROUGH.
Simon Pilgrim8483df62015-11-17 22:35:45 +0000781 CASE_UNPCK(UNPCKHPD, m)
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000782 DecodeUNPCKHMask(getRegOperandVectorVT(MI, MVT::f64, 0), ShuffleMask);
Craig Topper89c17612016-06-10 04:48:05 +0000783 Src1Name = getRegName(MI->getOperand(NumOperands-(RegForm?2:6)).getReg());
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000784 DestName = getRegName(MI->getOperand(0).getReg());
785 break;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000786
Simon Pilgrim8483df62015-11-17 22:35:45 +0000787 CASE_UNPCK(UNPCKHPS, r)
Craig Topper89c17612016-06-10 04:48:05 +0000788 Src2Name = getRegName(MI->getOperand(NumOperands - 1).getReg());
789 RegForm = true;
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000790 // FALL THROUGH.
Simon Pilgrim8483df62015-11-17 22:35:45 +0000791 CASE_UNPCK(UNPCKHPS, m)
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000792 DecodeUNPCKHMask(getRegOperandVectorVT(MI, MVT::f32, 0), ShuffleMask);
Craig Topper89c17612016-06-10 04:48:05 +0000793 Src1Name = getRegName(MI->getOperand(NumOperands-(RegForm?2:6)).getReg());
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000794 DestName = getRegName(MI->getOperand(0).getReg());
795 break;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000796
Simon Pilgrim5080e7f2016-07-03 18:02:43 +0000797 CASE_VPERMILPI(PERMILPS, r)
Simon Pilgrim6ce35dd2016-05-11 18:53:44 +0000798 Src1Name = getRegName(MI->getOperand(NumOperands - 2).getReg());
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000799 // FALL THROUGH.
Simon Pilgrim5080e7f2016-07-03 18:02:43 +0000800 CASE_VPERMILPI(PERMILPS, m)
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000801 if (MI->getOperand(NumOperands - 1).isImm())
Simon Pilgrim5883a732015-11-16 22:39:27 +0000802 DecodePSHUFMask(getRegOperandVectorVT(MI, MVT::f32, 0),
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000803 MI->getOperand(NumOperands - 1).getImm(),
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000804 ShuffleMask);
805 DestName = getRegName(MI->getOperand(0).getReg());
806 break;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000807
Simon Pilgrim5080e7f2016-07-03 18:02:43 +0000808 CASE_VPERMILPI(PERMILPD, r)
Simon Pilgrim6ce35dd2016-05-11 18:53:44 +0000809 Src1Name = getRegName(MI->getOperand(NumOperands - 2).getReg());
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000810 // FALL THROUGH.
Simon Pilgrim5080e7f2016-07-03 18:02:43 +0000811 CASE_VPERMILPI(PERMILPD, m)
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000812 if (MI->getOperand(NumOperands - 1).isImm())
Simon Pilgrim5883a732015-11-16 22:39:27 +0000813 DecodePSHUFMask(getRegOperandVectorVT(MI, MVT::f64, 0),
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000814 MI->getOperand(NumOperands - 1).getImm(),
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000815 ShuffleMask);
816 DestName = getRegName(MI->getOperand(0).getReg());
817 break;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000818
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000819 case X86::VPERM2F128rr:
820 case X86::VPERM2I128rr:
821 Src2Name = getRegName(MI->getOperand(2).getReg());
822 // FALL THROUGH.
823 case X86::VPERM2F128rm:
824 case X86::VPERM2I128rm:
825 // For instruction comments purpose, assume the 256-bit vector is v4i64.
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000826 if (MI->getOperand(NumOperands - 1).isImm())
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000827 DecodeVPERM2X128Mask(MVT::v4i64,
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000828 MI->getOperand(NumOperands - 1).getImm(),
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000829 ShuffleMask);
830 Src1Name = getRegName(MI->getOperand(1).getReg());
831 DestName = getRegName(MI->getOperand(0).getReg());
832 break;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000833
Simon Pilgrima0d73832016-07-03 18:27:37 +0000834 CASE_VPERM(PERMPD, r)
Craig Topper200d2372016-06-10 05:12:40 +0000835 Src1Name = getRegName(MI->getOperand(NumOperands - 2).getReg());
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000836 // FALL THROUGH.
Simon Pilgrima0d73832016-07-03 18:27:37 +0000837 CASE_VPERM(PERMPD, m)
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000838 if (MI->getOperand(NumOperands - 1).isImm())
Simon Pilgrima0d73832016-07-03 18:27:37 +0000839 DecodeVPERMMask(getRegOperandVectorVT(MI, MVT::f64, 0),
840 MI->getOperand(NumOperands - 1).getImm(),
841 ShuffleMask);
842 DestName = getRegName(MI->getOperand(0).getReg());
843 break;
844
845 CASE_VPERM(PERMQ, r)
846 Src1Name = getRegName(MI->getOperand(NumOperands - 2).getReg());
847 // FALL THROUGH.
848 CASE_VPERM(PERMQ, m)
849 if (MI->getOperand(NumOperands - 1).isImm())
850 DecodeVPERMMask(getRegOperandVectorVT(MI, MVT::i64, 0),
851 MI->getOperand(NumOperands - 1).getImm(),
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000852 ShuffleMask);
853 DestName = getRegName(MI->getOperand(0).getReg());
854 break;
855
856 case X86::MOVSDrr:
857 case X86::VMOVSDrr:
Simon Pilgrimf5c23ad2016-02-01 22:26:28 +0000858 case X86::VMOVSDZrr:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000859 Src2Name = getRegName(MI->getOperand(2).getReg());
860 Src1Name = getRegName(MI->getOperand(1).getReg());
861 // FALL THROUGH.
862 case X86::MOVSDrm:
863 case X86::VMOVSDrm:
Simon Pilgrimf5c23ad2016-02-01 22:26:28 +0000864 case X86::VMOVSDZrm:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000865 DecodeScalarMoveMask(MVT::v2f64, nullptr == Src2Name, ShuffleMask);
866 DestName = getRegName(MI->getOperand(0).getReg());
867 break;
Simon Pilgrimd5a15442015-11-21 13:04:42 +0000868
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000869 case X86::MOVSSrr:
870 case X86::VMOVSSrr:
Simon Pilgrimf5c23ad2016-02-01 22:26:28 +0000871 case X86::VMOVSSZrr:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000872 Src2Name = getRegName(MI->getOperand(2).getReg());
873 Src1Name = getRegName(MI->getOperand(1).getReg());
874 // FALL THROUGH.
875 case X86::MOVSSrm:
876 case X86::VMOVSSrm:
Simon Pilgrimf5c23ad2016-02-01 22:26:28 +0000877 case X86::VMOVSSZrm:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000878 DecodeScalarMoveMask(MVT::v4f32, nullptr == Src2Name, ShuffleMask);
879 DestName = getRegName(MI->getOperand(0).getReg());
880 break;
881
882 case X86::MOVPQI2QIrr:
Simon Pilgrim3e0c0222015-12-13 12:49:48 +0000883 case X86::MOVZPQILo2PQIrr:
884 case X86::VMOVPQI2QIrr:
885 case X86::VMOVZPQILo2PQIrr:
886 case X86::VMOVZPQILo2PQIZrr:
887 Src1Name = getRegName(MI->getOperand(1).getReg());
888 // FALL THROUGH.
889 case X86::MOVQI2PQIrm:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000890 case X86::MOVZQI2PQIrm:
891 case X86::MOVZPQILo2PQIrm:
Simon Pilgrim3e0c0222015-12-13 12:49:48 +0000892 case X86::VMOVQI2PQIrm:
Simon Pilgrim96fe4ef2016-02-02 13:32:56 +0000893 case X86::VMOVQI2PQIZrm:
Simon Pilgrim3e0c0222015-12-13 12:49:48 +0000894 case X86::VMOVZQI2PQIrm:
895 case X86::VMOVZPQILo2PQIrm:
896 case X86::VMOVZPQILo2PQIZrm:
897 DecodeZeroMoveLowMask(MVT::v2i64, ShuffleMask);
898 DestName = getRegName(MI->getOperand(0).getReg());
899 break;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000900
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000901 case X86::MOVDI2PDIrm:
902 case X86::VMOVDI2PDIrm:
Simon Pilgrim5be17b62016-02-01 23:04:05 +0000903 case X86::VMOVDI2PDIZrm:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000904 DecodeZeroMoveLowMask(MVT::v4i32, ShuffleMask);
905 DestName = getRegName(MI->getOperand(0).getReg());
906 break;
907
Simon Pilgrimd85cae32015-07-06 20:46:41 +0000908 case X86::EXTRQI:
909 if (MI->getOperand(2).isImm() &&
910 MI->getOperand(3).isImm())
911 DecodeEXTRQIMask(MI->getOperand(2).getImm(),
912 MI->getOperand(3).getImm(),
913 ShuffleMask);
914
915 DestName = getRegName(MI->getOperand(0).getReg());
916 Src1Name = getRegName(MI->getOperand(1).getReg());
917 break;
918
919 case X86::INSERTQI:
920 if (MI->getOperand(3).isImm() &&
921 MI->getOperand(4).isImm())
922 DecodeINSERTQIMask(MI->getOperand(3).getImm(),
923 MI->getOperand(4).getImm(),
924 ShuffleMask);
925
926 DestName = getRegName(MI->getOperand(0).getReg());
927 Src1Name = getRegName(MI->getOperand(1).getReg());
928 Src2Name = getRegName(MI->getOperand(2).getReg());
929 break;
930
Simon Pilgrim0acc32a2016-02-06 19:51:21 +0000931 CASE_PMOVZX(PMOVZXBW, r)
932 CASE_PMOVZX(PMOVZXBD, r)
933 CASE_PMOVZX(PMOVZXBQ, r)
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000934 Src1Name = getRegName(MI->getOperand(NumOperands - 1).getReg());
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000935 // FALL THROUGH.
Simon Pilgrim0acc32a2016-02-06 19:51:21 +0000936 CASE_PMOVZX(PMOVZXBW, m)
937 CASE_PMOVZX(PMOVZXBD, m)
938 CASE_PMOVZX(PMOVZXBQ, m)
Simon Pilgrime1b6db92016-02-06 16:33:42 +0000939 DecodeZeroExtendMask(MVT::i8, getZeroExtensionResultType(MI), ShuffleMask);
940 DestName = getRegName(MI->getOperand(0).getReg());
941 break;
942
Simon Pilgrim0acc32a2016-02-06 19:51:21 +0000943 CASE_PMOVZX(PMOVZXWD, r)
944 CASE_PMOVZX(PMOVZXWQ, r)
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000945 Src1Name = getRegName(MI->getOperand(NumOperands - 1).getReg());
Simon Pilgrime1b6db92016-02-06 16:33:42 +0000946 // FALL THROUGH.
Simon Pilgrim0acc32a2016-02-06 19:51:21 +0000947 CASE_PMOVZX(PMOVZXWD, m)
948 CASE_PMOVZX(PMOVZXWQ, m)
Simon Pilgrime1b6db92016-02-06 16:33:42 +0000949 DecodeZeroExtendMask(MVT::i16, getZeroExtensionResultType(MI), ShuffleMask);
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000950 DestName = getRegName(MI->getOperand(0).getReg());
Simon Pilgrime1b6db92016-02-06 16:33:42 +0000951 break;
952
Simon Pilgrim0acc32a2016-02-06 19:51:21 +0000953 CASE_PMOVZX(PMOVZXDQ, r)
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000954 Src1Name = getRegName(MI->getOperand(NumOperands - 1).getReg());
Simon Pilgrime1b6db92016-02-06 16:33:42 +0000955 // FALL THROUGH.
Simon Pilgrim0acc32a2016-02-06 19:51:21 +0000956 CASE_PMOVZX(PMOVZXDQ, m)
Simon Pilgrime1b6db92016-02-06 16:33:42 +0000957 DecodeZeroExtendMask(MVT::i32, getZeroExtensionResultType(MI), ShuffleMask);
958 DestName = getRegName(MI->getOperand(0).getReg());
959 break;
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000960 }
961
962 // The only comments we decode are shuffles, so give up if we were unable to
963 // decode a shuffle mask.
964 if (ShuffleMask.empty())
965 return false;
966
967 if (!DestName) DestName = Src1Name;
Simon Pilgrim7c2fbdc2016-07-03 13:08:29 +0000968 OS << (DestName ? getMaskName(MI, DestName, getRegName) : "mem") << " = ";
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000969
970 // If the two sources are the same, canonicalize the input elements to be
971 // from the first src so that we get larger element spans.
972 if (Src1Name == Src2Name) {
973 for (unsigned i = 0, e = ShuffleMask.size(); i != e; ++i) {
974 if ((int)ShuffleMask[i] >= 0 && // Not sentinel.
NAKAMURA Takumi5582a6a2015-05-25 01:43:34 +0000975 ShuffleMask[i] >= (int)e) // From second mask.
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000976 ShuffleMask[i] -= e;
977 }
978 }
979
980 // The shuffle mask specifies which elements of the src1/src2 fill in the
981 // destination, with a few sentinel values. Loop through and print them
982 // out.
983 for (unsigned i = 0, e = ShuffleMask.size(); i != e; ++i) {
984 if (i != 0)
985 OS << ',';
986 if (ShuffleMask[i] == SM_SentinelZero) {
987 OS << "zero";
988 continue;
989 }
990
991 // Otherwise, it must come from src1 or src2. Print the span of elements
992 // that comes from this src.
993 bool isSrc1 = ShuffleMask[i] < (int)ShuffleMask.size();
994 const char *SrcName = isSrc1 ? Src1Name : Src2Name;
995 OS << (SrcName ? SrcName : "mem") << '[';
996 bool IsFirst = true;
997 while (i != e && (int)ShuffleMask[i] != SM_SentinelZero &&
998 (ShuffleMask[i] < (int)ShuffleMask.size()) == isSrc1) {
999 if (!IsFirst)
1000 OS << ',';
1001 else
1002 IsFirst = false;
1003 if (ShuffleMask[i] == SM_SentinelUndef)
1004 OS << "u";
1005 else
1006 OS << ShuffleMask[i] % ShuffleMask.size();
1007 ++i;
1008 }
1009 OS << ']';
NAKAMURA Takumi5582a6a2015-05-25 01:43:34 +00001010 --i; // For loop increments element #.
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +00001011 }
1012 //MI->print(OS, 0);
1013 OS << "\n";
1014
1015 // We successfully added a comment to this instruction.
1016 return true;
1017}