blob: ddf12791c0b33ef0ebd83209d883ef2dd7de0325 [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 Pilgrim41c05c02016-05-11 11:55:12 +0000113#define CASE_VPERM(Inst, src) \
114 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 Pilgrim1f590762016-07-03 13:55:41 +0000120#define CASE_MASK_VPERM(Inst, src) \
121 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
125#define CASE_MASKZ_VPERM(Inst, src) \
126 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 Pilgrimbfa5f232016-02-06 17:02:15 +0000130#define CASE_VSHUF(Inst, src) \
Simon Pilgrim41c05c02016-05-11 11:55:12 +0000131 CASE_AVX512_INS_COMMON(SHUFF##Inst, Z, r##src##i) \
132 CASE_AVX512_INS_COMMON(SHUFI##Inst, Z, r##src##i) \
133 CASE_AVX512_INS_COMMON(SHUFF##Inst, Z256, r##src##i) \
134 CASE_AVX512_INS_COMMON(SHUFI##Inst, Z256, r##src##i)
Simon Pilgrimbfa5f232016-02-06 17:02:15 +0000135
Simon Pilgrim1f590762016-07-03 13:55:41 +0000136#define CASE_MASK_VSHUF(Inst, src) \
137 CASE_MASK_INS_COMMON(SHUFF##Inst, Z, r##src##i) \
138 CASE_MASK_INS_COMMON(SHUFI##Inst, Z, r##src##i) \
139 CASE_MASK_INS_COMMON(SHUFF##Inst, Z256, r##src##i) \
140 CASE_MASK_INS_COMMON(SHUFI##Inst, Z256, r##src##i)
141
142#define CASE_MASKZ_VSHUF(Inst, src) \
143 CASE_MASKZ_INS_COMMON(SHUFF##Inst, Z, r##src##i) \
144 CASE_MASKZ_INS_COMMON(SHUFI##Inst, Z, r##src##i) \
145 CASE_MASKZ_INS_COMMON(SHUFF##Inst, Z256, r##src##i) \
146 CASE_MASKZ_INS_COMMON(SHUFI##Inst, Z256, r##src##i)
147
Igor Breger24cab0f2015-11-16 07:22:00 +0000148static unsigned getVectorRegSize(unsigned RegNo) {
Igor Breger24cab0f2015-11-16 07:22:00 +0000149 if (X86::ZMM0 <= RegNo && RegNo <= X86::ZMM31)
150 return 512;
151 if (X86::YMM0 <= RegNo && RegNo <= X86::YMM31)
152 return 256;
153 if (X86::XMM0 <= RegNo && RegNo <= X86::XMM31)
154 return 128;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000155 if (X86::MM0 <= RegNo && RegNo <= X86::MM7)
156 return 64;
Igor Breger24cab0f2015-11-16 07:22:00 +0000157
158 llvm_unreachable("Unknown vector reg!");
Igor Breger24cab0f2015-11-16 07:22:00 +0000159}
160
161static MVT getRegOperandVectorVT(const MCInst *MI, const MVT &ScalarVT,
162 unsigned OperandIndex) {
163 unsigned OpReg = MI->getOperand(OperandIndex).getReg();
164 return MVT::getVectorVT(ScalarVT,
165 getVectorRegSize(OpReg)/ScalarVT.getSizeInBits());
166}
167
Simon Pilgrime1b6db92016-02-06 16:33:42 +0000168/// \brief Extracts the dst type for a given zero extension instruction.
169static MVT getZeroExtensionResultType(const MCInst *MI) {
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000170 switch (MI->getOpcode()) {
171 default:
172 llvm_unreachable("Unknown zero extension instruction");
Simon Pilgrime1b6db92016-02-06 16:33:42 +0000173 // zero extension to i16
Simon Pilgrim0acc32a2016-02-06 19:51:21 +0000174 CASE_PMOVZX(PMOVZXBW, m)
175 CASE_PMOVZX(PMOVZXBW, r)
Simon Pilgrime1b6db92016-02-06 16:33:42 +0000176 return getRegOperandVectorVT(MI, MVT::i16, 0);
177 // zero extension to i32
Simon Pilgrim0acc32a2016-02-06 19:51:21 +0000178 CASE_PMOVZX(PMOVZXBD, m)
179 CASE_PMOVZX(PMOVZXBD, r)
180 CASE_PMOVZX(PMOVZXWD, m)
181 CASE_PMOVZX(PMOVZXWD, r)
Simon Pilgrime1b6db92016-02-06 16:33:42 +0000182 return getRegOperandVectorVT(MI, MVT::i32, 0);
183 // zero extension to i64
Simon Pilgrim0acc32a2016-02-06 19:51:21 +0000184 CASE_PMOVZX(PMOVZXBQ, m)
185 CASE_PMOVZX(PMOVZXBQ, r)
186 CASE_PMOVZX(PMOVZXWQ, m)
187 CASE_PMOVZX(PMOVZXWQ, r)
188 CASE_PMOVZX(PMOVZXDQ, m)
189 CASE_PMOVZX(PMOVZXDQ, r)
Simon Pilgrime1b6db92016-02-06 16:33:42 +0000190 return getRegOperandVectorVT(MI, MVT::i64, 0);
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000191 }
192}
193
Simon Pilgrim7c2fbdc2016-07-03 13:08:29 +0000194/// Wraps the destination register name with AVX512 mask/maskz filtering.
195static std::string getMaskName(const MCInst *MI, const char *DestName,
196 const char *(*getRegName)(unsigned)) {
197 std::string OpMaskName(DestName);
198
199 bool MaskWithZero = false;
200 const char *MaskRegName = nullptr;
201
202 switch (MI->getOpcode()) {
203 default:
204 return OpMaskName;
205 CASE_MASKZ_MOVDUP(MOVDDUP, m)
206 CASE_MASKZ_MOVDUP(MOVDDUP, r)
207 CASE_MASKZ_MOVDUP(MOVSHDUP, m)
208 CASE_MASKZ_MOVDUP(MOVSHDUP, r)
209 CASE_MASKZ_MOVDUP(MOVSLDUP, m)
210 CASE_MASKZ_MOVDUP(MOVSLDUP, r)
Simon Pilgrim68f438a2016-07-03 13:33:28 +0000211 CASE_MASKZ_PMOVZX(PMOVZXBD, m)
212 CASE_MASKZ_PMOVZX(PMOVZXBD, r)
213 CASE_MASKZ_PMOVZX(PMOVZXBQ, m)
214 CASE_MASKZ_PMOVZX(PMOVZXBQ, r)
215 CASE_MASKZ_PMOVZX(PMOVZXBW, m)
216 CASE_MASKZ_PMOVZX(PMOVZXBW, r)
217 CASE_MASKZ_PMOVZX(PMOVZXDQ, m)
218 CASE_MASKZ_PMOVZX(PMOVZXDQ, r)
219 CASE_MASKZ_PMOVZX(PMOVZXWD, m)
220 CASE_MASKZ_PMOVZX(PMOVZXWD, r)
221 CASE_MASKZ_PMOVZX(PMOVZXWQ, m)
222 CASE_MASKZ_PMOVZX(PMOVZXWQ, r)
Simon Pilgrim598bdb62016-07-03 14:26:21 +0000223 CASE_MASKZ_UNPCK(PUNPCKHBW, m)
224 CASE_MASKZ_UNPCK(PUNPCKHBW, r)
225 CASE_MASKZ_UNPCK(PUNPCKHWD, m)
226 CASE_MASKZ_UNPCK(PUNPCKHWD, r)
227 CASE_MASKZ_UNPCK(PUNPCKHDQ, m)
228 CASE_MASKZ_UNPCK(PUNPCKHDQ, r)
229 CASE_MASKZ_UNPCK(PUNPCKLBW, m)
230 CASE_MASKZ_UNPCK(PUNPCKLBW, r)
231 CASE_MASKZ_UNPCK(PUNPCKLWD, m)
232 CASE_MASKZ_UNPCK(PUNPCKLWD, r)
233 CASE_MASKZ_UNPCK(PUNPCKLDQ, m)
234 CASE_MASKZ_UNPCK(PUNPCKLDQ, r)
235 CASE_MASKZ_UNPCK(UNPCKHPD, m)
236 CASE_MASKZ_UNPCK(UNPCKHPD, r)
237 CASE_MASKZ_UNPCK(UNPCKHPS, m)
238 CASE_MASKZ_UNPCK(UNPCKHPS, r)
239 CASE_MASKZ_UNPCK(UNPCKLPD, m)
240 CASE_MASKZ_UNPCK(UNPCKLPD, r)
241 CASE_MASKZ_UNPCK(UNPCKLPS, m)
242 CASE_MASKZ_UNPCK(UNPCKLPS, r)
Simon Pilgrimdbd6db02016-07-03 15:00:51 +0000243 CASE_MASKZ_SHUF(PALIGNR, r)
244 CASE_MASKZ_SHUF(PALIGNR, m)
Simon Pilgrim1f590762016-07-03 13:55:41 +0000245 CASE_MASKZ_SHUF(SHUFPD, m)
246 CASE_MASKZ_SHUF(SHUFPD, r)
247 CASE_MASKZ_SHUF(SHUFPS, m)
248 CASE_MASKZ_SHUF(SHUFPS, r)
249 CASE_MASKZ_VPERM(PERMILPD, m)
250 CASE_MASKZ_VPERM(PERMILPD, r)
251 CASE_MASKZ_VPERM(PERMILPS, m)
252 CASE_MASKZ_VPERM(PERMILPS, r)
Simon Pilgrimdbd6db02016-07-03 15:00:51 +0000253 CASE_MASKZ_VPERM(PSHUFD, m)
254 CASE_MASKZ_VPERM(PSHUFD, r)
255 CASE_MASKZ_VPERM(PSHUFHW, m)
256 CASE_MASKZ_VPERM(PSHUFHW, r)
257 CASE_MASKZ_VPERM(PSHUFLW, m)
258 CASE_MASKZ_VPERM(PSHUFLW, r)
Simon Pilgrim1f590762016-07-03 13:55:41 +0000259 CASE_MASKZ_VSHUF(64X2, m)
260 CASE_MASKZ_VSHUF(64X2, r)
261 CASE_MASKZ_VSHUF(32X4, m)
262 CASE_MASKZ_VSHUF(32X4, r)
Simon Pilgrim7c2fbdc2016-07-03 13:08:29 +0000263 MaskWithZero = true;
264 MaskRegName = getRegName(MI->getOperand(1).getReg());
265 break;
266 CASE_MASK_MOVDUP(MOVDDUP, m)
267 CASE_MASK_MOVDUP(MOVDDUP, r)
268 CASE_MASK_MOVDUP(MOVSHDUP, m)
269 CASE_MASK_MOVDUP(MOVSHDUP, r)
270 CASE_MASK_MOVDUP(MOVSLDUP, m)
271 CASE_MASK_MOVDUP(MOVSLDUP, r)
Simon Pilgrim68f438a2016-07-03 13:33:28 +0000272 CASE_MASK_PMOVZX(PMOVZXBD, m)
273 CASE_MASK_PMOVZX(PMOVZXBD, r)
274 CASE_MASK_PMOVZX(PMOVZXBQ, m)
275 CASE_MASK_PMOVZX(PMOVZXBQ, r)
276 CASE_MASK_PMOVZX(PMOVZXBW, m)
277 CASE_MASK_PMOVZX(PMOVZXBW, r)
278 CASE_MASK_PMOVZX(PMOVZXDQ, m)
279 CASE_MASK_PMOVZX(PMOVZXDQ, r)
280 CASE_MASK_PMOVZX(PMOVZXWD, m)
281 CASE_MASK_PMOVZX(PMOVZXWD, r)
282 CASE_MASK_PMOVZX(PMOVZXWQ, m)
283 CASE_MASK_PMOVZX(PMOVZXWQ, r)
Simon Pilgrim598bdb62016-07-03 14:26:21 +0000284 CASE_MASK_UNPCK(PUNPCKHBW, m)
285 CASE_MASK_UNPCK(PUNPCKHBW, r)
286 CASE_MASK_UNPCK(PUNPCKHWD, m)
287 CASE_MASK_UNPCK(PUNPCKHWD, r)
288 CASE_MASK_UNPCK(PUNPCKHDQ, m)
289 CASE_MASK_UNPCK(PUNPCKHDQ, r)
290 CASE_MASK_UNPCK(PUNPCKLBW, m)
291 CASE_MASK_UNPCK(PUNPCKLBW, r)
292 CASE_MASK_UNPCK(PUNPCKLWD, m)
293 CASE_MASK_UNPCK(PUNPCKLWD, r)
294 CASE_MASK_UNPCK(PUNPCKLDQ, m)
295 CASE_MASK_UNPCK(PUNPCKLDQ, r)
296 CASE_MASK_UNPCK(UNPCKHPD, m)
297 CASE_MASK_UNPCK(UNPCKHPD, r)
298 CASE_MASK_UNPCK(UNPCKHPS, m)
299 CASE_MASK_UNPCK(UNPCKHPS, r)
300 CASE_MASK_UNPCK(UNPCKLPD, m)
301 CASE_MASK_UNPCK(UNPCKLPD, r)
302 CASE_MASK_UNPCK(UNPCKLPS, m)
303 CASE_MASK_UNPCK(UNPCKLPS, r)
Simon Pilgrimdbd6db02016-07-03 15:00:51 +0000304 CASE_MASK_SHUF(PALIGNR, r)
305 CASE_MASK_SHUF(PALIGNR, m)
Simon Pilgrim1f590762016-07-03 13:55:41 +0000306 CASE_MASK_SHUF(SHUFPD, m)
307 CASE_MASK_SHUF(SHUFPD, r)
308 CASE_MASK_SHUF(SHUFPS, m)
309 CASE_MASK_SHUF(SHUFPS, r)
310 CASE_MASK_VPERM(PERMILPD, m)
311 CASE_MASK_VPERM(PERMILPD, r)
312 CASE_MASK_VPERM(PERMILPS, m)
313 CASE_MASK_VPERM(PERMILPS, r)
Simon Pilgrimdbd6db02016-07-03 15:00:51 +0000314 CASE_MASK_VPERM(PSHUFD, m)
315 CASE_MASK_VPERM(PSHUFD, r)
316 CASE_MASK_VPERM(PSHUFHW, m)
317 CASE_MASK_VPERM(PSHUFHW, r)
318 CASE_MASK_VPERM(PSHUFLW, m)
319 CASE_MASK_VPERM(PSHUFLW, r)
Simon Pilgrim1f590762016-07-03 13:55:41 +0000320 CASE_MASK_VSHUF(64X2, m)
321 CASE_MASK_VSHUF(64X2, r)
322 CASE_MASK_VSHUF(32X4, m)
323 CASE_MASK_VSHUF(32X4, r)
Simon Pilgrim7c2fbdc2016-07-03 13:08:29 +0000324 MaskRegName = getRegName(MI->getOperand(2).getReg());
325 break;
326 }
327
328 // MASK: zmmX {%kY}
329 OpMaskName += " {%";
330 OpMaskName += MaskRegName;
331 OpMaskName += "}";
332
333 // MASKZ: zmmX {%kY} {z}
334 if (MaskWithZero)
335 OpMaskName += " {z}";
336
337 return OpMaskName;
338}
339
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000340//===----------------------------------------------------------------------===//
341// Top Level Entrypoint
342//===----------------------------------------------------------------------===//
343
344/// EmitAnyX86InstComments - This function decodes x86 instructions and prints
345/// newline terminated strings to the specified string if desired. This
346/// information is shown in disassembly dumps when verbose assembly is enabled.
347bool llvm::EmitAnyX86InstComments(const MCInst *MI, raw_ostream &OS,
348 const char *(*getRegName)(unsigned)) {
349 // If this is a shuffle operation, the switch should fill in this state.
350 SmallVector<int, 8> ShuffleMask;
351 const char *DestName = nullptr, *Src1Name = nullptr, *Src2Name = nullptr;
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000352 unsigned NumOperands = MI->getNumOperands();
Craig Topper89c17612016-06-10 04:48:05 +0000353 bool RegForm = false;
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000354
355 switch (MI->getOpcode()) {
356 default:
357 // Not an instruction for which we can decode comments.
358 return false;
359
360 case X86::BLENDPDrri:
361 case X86::VBLENDPDrri:
Simon Pilgrim13d3a202015-11-16 23:03:18 +0000362 case X86::VBLENDPDYrri:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000363 Src2Name = getRegName(MI->getOperand(2).getReg());
364 // FALL THROUGH.
365 case X86::BLENDPDrmi:
366 case X86::VBLENDPDrmi:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000367 case X86::VBLENDPDYrmi:
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000368 if (MI->getOperand(NumOperands - 1).isImm())
Simon Pilgrim13d3a202015-11-16 23:03:18 +0000369 DecodeBLENDMask(getRegOperandVectorVT(MI, MVT::f64, 0),
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000370 MI->getOperand(NumOperands - 1).getImm(),
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000371 ShuffleMask);
372 Src1Name = getRegName(MI->getOperand(1).getReg());
373 DestName = getRegName(MI->getOperand(0).getReg());
374 break;
375
376 case X86::BLENDPSrri:
377 case X86::VBLENDPSrri:
Simon Pilgrim13d3a202015-11-16 23:03:18 +0000378 case X86::VBLENDPSYrri:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000379 Src2Name = getRegName(MI->getOperand(2).getReg());
380 // FALL THROUGH.
381 case X86::BLENDPSrmi:
382 case X86::VBLENDPSrmi:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000383 case X86::VBLENDPSYrmi:
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000384 if (MI->getOperand(NumOperands - 1).isImm())
Simon Pilgrim13d3a202015-11-16 23:03:18 +0000385 DecodeBLENDMask(getRegOperandVectorVT(MI, MVT::f32, 0),
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000386 MI->getOperand(NumOperands - 1).getImm(),
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000387 ShuffleMask);
388 Src1Name = getRegName(MI->getOperand(1).getReg());
389 DestName = getRegName(MI->getOperand(0).getReg());
390 break;
391
392 case X86::PBLENDWrri:
393 case X86::VPBLENDWrri:
Simon Pilgrim13d3a202015-11-16 23:03:18 +0000394 case X86::VPBLENDWYrri:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000395 Src2Name = getRegName(MI->getOperand(2).getReg());
396 // FALL THROUGH.
397 case X86::PBLENDWrmi:
398 case X86::VPBLENDWrmi:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000399 case X86::VPBLENDWYrmi:
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000400 if (MI->getOperand(NumOperands - 1).isImm())
Simon Pilgrim13d3a202015-11-16 23:03:18 +0000401 DecodeBLENDMask(getRegOperandVectorVT(MI, MVT::i16, 0),
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000402 MI->getOperand(NumOperands - 1).getImm(),
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000403 ShuffleMask);
404 Src1Name = getRegName(MI->getOperand(1).getReg());
405 DestName = getRegName(MI->getOperand(0).getReg());
406 break;
407
408 case X86::VPBLENDDrri:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000409 case X86::VPBLENDDYrri:
410 Src2Name = getRegName(MI->getOperand(2).getReg());
411 // FALL THROUGH.
Simon Pilgrim13d3a202015-11-16 23:03:18 +0000412 case X86::VPBLENDDrmi:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000413 case X86::VPBLENDDYrmi:
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000414 if (MI->getOperand(NumOperands - 1).isImm())
Simon Pilgrim13d3a202015-11-16 23:03:18 +0000415 DecodeBLENDMask(getRegOperandVectorVT(MI, MVT::i32, 0),
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000416 MI->getOperand(NumOperands - 1).getImm(),
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000417 ShuffleMask);
418 Src1Name = getRegName(MI->getOperand(1).getReg());
419 DestName = getRegName(MI->getOperand(0).getReg());
420 break;
421
422 case X86::INSERTPSrr:
423 case X86::VINSERTPSrr:
Simon Pilgrim025a3d852016-02-01 22:05:50 +0000424 case X86::VINSERTPSzrr:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000425 Src2Name = getRegName(MI->getOperand(2).getReg());
426 // FALL THROUGH.
427 case X86::INSERTPSrm:
428 case X86::VINSERTPSrm:
Simon Pilgrim025a3d852016-02-01 22:05:50 +0000429 case X86::VINSERTPSzrm:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000430 DestName = getRegName(MI->getOperand(0).getReg());
431 Src1Name = getRegName(MI->getOperand(1).getReg());
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000432 if (MI->getOperand(NumOperands - 1).isImm())
433 DecodeINSERTPSMask(MI->getOperand(NumOperands - 1).getImm(),
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000434 ShuffleMask);
435 break;
436
437 case X86::MOVLHPSrr:
438 case X86::VMOVLHPSrr:
Simon Pilgrimd5a15442015-11-21 13:04:42 +0000439 case X86::VMOVLHPSZrr:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000440 Src2Name = getRegName(MI->getOperand(2).getReg());
441 Src1Name = getRegName(MI->getOperand(1).getReg());
442 DestName = getRegName(MI->getOperand(0).getReg());
443 DecodeMOVLHPSMask(2, ShuffleMask);
444 break;
445
446 case X86::MOVHLPSrr:
447 case X86::VMOVHLPSrr:
Simon Pilgrimd5a15442015-11-21 13:04:42 +0000448 case X86::VMOVHLPSZrr:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000449 Src2Name = getRegName(MI->getOperand(2).getReg());
450 Src1Name = getRegName(MI->getOperand(1).getReg());
451 DestName = getRegName(MI->getOperand(0).getReg());
452 DecodeMOVHLPSMask(2, ShuffleMask);
453 break;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000454
Simon Pilgrima3d67442016-02-07 15:39:22 +0000455 case X86::MOVHPDrm:
456 case X86::VMOVHPDrm:
457 case X86::VMOVHPDZ128rm:
458 Src1Name = getRegName(MI->getOperand(1).getReg());
459 DestName = getRegName(MI->getOperand(0).getReg());
460 DecodeInsertElementMask(MVT::v2f64, 1, 1, ShuffleMask);
461 break;
462
463 case X86::MOVHPSrm:
464 case X86::VMOVHPSrm:
465 case X86::VMOVHPSZ128rm:
466 Src1Name = getRegName(MI->getOperand(1).getReg());
467 DestName = getRegName(MI->getOperand(0).getReg());
468 DecodeInsertElementMask(MVT::v4f32, 2, 2, ShuffleMask);
469 break;
470
471 case X86::MOVLPDrm:
472 case X86::VMOVLPDrm:
473 case X86::VMOVLPDZ128rm:
474 Src1Name = getRegName(MI->getOperand(1).getReg());
475 DestName = getRegName(MI->getOperand(0).getReg());
476 DecodeInsertElementMask(MVT::v2f64, 0, 1, ShuffleMask);
477 break;
478
479 case X86::MOVLPSrm:
480 case X86::VMOVLPSrm:
481 case X86::VMOVLPSZ128rm:
482 Src1Name = getRegName(MI->getOperand(1).getReg());
483 DestName = getRegName(MI->getOperand(0).getReg());
484 DecodeInsertElementMask(MVT::v4f32, 0, 2, ShuffleMask);
485 break;
486
Igor Breger24cab0f2015-11-16 07:22:00 +0000487 CASE_MOVDUP(MOVSLDUP, r)
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000488 Src1Name = getRegName(MI->getOperand(NumOperands - 1).getReg());
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000489 // FALL THROUGH.
Igor Breger1f782962015-11-19 08:26:56 +0000490 CASE_MOVDUP(MOVSLDUP, m)
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000491 DestName = getRegName(MI->getOperand(0).getReg());
Igor Breger1f782962015-11-19 08:26:56 +0000492 DecodeMOVSLDUPMask(getRegOperandVectorVT(MI, MVT::f32, 0), ShuffleMask);
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000493 break;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000494
Igor Breger24cab0f2015-11-16 07:22:00 +0000495 CASE_MOVDUP(MOVSHDUP, r)
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000496 Src1Name = getRegName(MI->getOperand(NumOperands - 1).getReg());
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000497 // FALL THROUGH.
Igor Breger1f782962015-11-19 08:26:56 +0000498 CASE_MOVDUP(MOVSHDUP, m)
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000499 DestName = getRegName(MI->getOperand(0).getReg());
Igor Breger1f782962015-11-19 08:26:56 +0000500 DecodeMOVSHDUPMask(getRegOperandVectorVT(MI, MVT::f32, 0), ShuffleMask);
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000501 break;
502
Igor Breger1f782962015-11-19 08:26:56 +0000503 CASE_MOVDUP(MOVDDUP, r)
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000504 Src1Name = getRegName(MI->getOperand(NumOperands - 1).getReg());
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000505 // FALL THROUGH.
Igor Breger1f782962015-11-19 08:26:56 +0000506 CASE_MOVDUP(MOVDDUP, m)
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000507 DestName = getRegName(MI->getOperand(0).getReg());
Igor Breger1f782962015-11-19 08:26:56 +0000508 DecodeMOVDDUPMask(getRegOperandVectorVT(MI, MVT::f64, 0), ShuffleMask);
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000509 break;
510
511 case X86::PSLLDQri:
512 case X86::VPSLLDQri:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000513 case X86::VPSLLDQYri:
Simon Pilgrim643734c2016-06-09 22:03:15 +0000514 case X86::VPSLLDQZ128rr:
515 case X86::VPSLLDQZ256rr:
516 case X86::VPSLLDQZ512rr:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000517 Src1Name = getRegName(MI->getOperand(1).getReg());
Simon Pilgrim643734c2016-06-09 22:03:15 +0000518 case X86::VPSLLDQZ128rm:
519 case X86::VPSLLDQZ256rm:
520 case X86::VPSLLDQZ512rm:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000521 DestName = getRegName(MI->getOperand(0).getReg());
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000522 if (MI->getOperand(NumOperands - 1).isImm())
Simon Pilgrimb9ada272015-11-16 22:54:41 +0000523 DecodePSLLDQMask(getRegOperandVectorVT(MI, MVT::i8, 0),
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000524 MI->getOperand(NumOperands - 1).getImm(),
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000525 ShuffleMask);
526 break;
527
528 case X86::PSRLDQri:
529 case X86::VPSRLDQri:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000530 case X86::VPSRLDQYri:
Simon Pilgrim643734c2016-06-09 22:03:15 +0000531 case X86::VPSRLDQZ128rr:
532 case X86::VPSRLDQZ256rr:
533 case X86::VPSRLDQZ512rr:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000534 Src1Name = getRegName(MI->getOperand(1).getReg());
Simon Pilgrim643734c2016-06-09 22:03:15 +0000535 case X86::VPSRLDQZ128rm:
536 case X86::VPSRLDQZ256rm:
537 case X86::VPSRLDQZ512rm:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000538 DestName = getRegName(MI->getOperand(0).getReg());
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000539 if (MI->getOperand(NumOperands - 1).isImm())
Simon Pilgrimb9ada272015-11-16 22:54:41 +0000540 DecodePSRLDQMask(getRegOperandVectorVT(MI, MVT::i8, 0),
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000541 MI->getOperand(NumOperands - 1).getImm(),
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000542 ShuffleMask);
543 break;
544
Craig Topper7a299302016-06-09 07:06:38 +0000545 CASE_SHUF(PALIGNR, rri)
Craig Topper89c17612016-06-10 04:48:05 +0000546 Src1Name = getRegName(MI->getOperand(NumOperands - 2).getReg());
547 RegForm = true;
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000548 // FALL THROUGH.
Craig Topper7a299302016-06-09 07:06:38 +0000549 CASE_SHUF(PALIGNR, rmi)
Craig Topper89c17612016-06-10 04:48:05 +0000550 Src2Name = getRegName(MI->getOperand(NumOperands-(RegForm?3:7)).getReg());
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000551 DestName = getRegName(MI->getOperand(0).getReg());
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000552 if (MI->getOperand(NumOperands - 1).isImm())
Simon Pilgrimb9ada272015-11-16 22:54:41 +0000553 DecodePALIGNRMask(getRegOperandVectorVT(MI, MVT::i8, 0),
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000554 MI->getOperand(NumOperands - 1).getImm(),
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000555 ShuffleMask);
556 break;
557
Craig Topper01f53b12016-06-03 05:31:00 +0000558 CASE_SHUF(PSHUFD, ri)
Craig Topper6f7288d2016-06-09 07:49:08 +0000559 Src1Name = getRegName(MI->getOperand(NumOperands - 2).getReg());
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000560 // FALL THROUGH.
Craig Topper01f53b12016-06-03 05:31:00 +0000561 CASE_SHUF(PSHUFD, mi)
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 Pilgrim5883a732015-11-16 22:39:27 +0000564 DecodePSHUFMask(getRegOperandVectorVT(MI, MVT::i32, 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 Topper01f53b12016-06-03 05:31:00 +0000569 CASE_SHUF(PSHUFHW, ri)
Craig Topper6f7288d2016-06-09 07:49:08 +0000570 Src1Name = getRegName(MI->getOperand(NumOperands - 2).getReg());
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000571 // FALL THROUGH.
Craig Topper01f53b12016-06-03 05:31:00 +0000572 CASE_SHUF(PSHUFHW, mi)
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000573 DestName = getRegName(MI->getOperand(0).getReg());
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000574 if (MI->getOperand(NumOperands - 1).isImm())
Simon Pilgrim5883a732015-11-16 22:39:27 +0000575 DecodePSHUFHWMask(getRegOperandVectorVT(MI, MVT::i16, 0),
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000576 MI->getOperand(NumOperands - 1).getImm(),
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000577 ShuffleMask);
578 break;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000579
Craig Topper01f53b12016-06-03 05:31:00 +0000580 CASE_SHUF(PSHUFLW, ri)
Craig Topper6f7288d2016-06-09 07:49:08 +0000581 Src1Name = getRegName(MI->getOperand(NumOperands - 2).getReg());
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000582 // FALL THROUGH.
Craig Topper01f53b12016-06-03 05:31:00 +0000583 CASE_SHUF(PSHUFLW, mi)
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000584 DestName = getRegName(MI->getOperand(0).getReg());
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000585 if (MI->getOperand(NumOperands - 1).isImm())
Simon Pilgrim5883a732015-11-16 22:39:27 +0000586 DecodePSHUFLWMask(getRegOperandVectorVT(MI, MVT::i16, 0),
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000587 MI->getOperand(NumOperands - 1).getImm(),
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000588 ShuffleMask);
589 break;
590
Simon Pilgrimf8f86ab2015-09-13 11:28:45 +0000591 case X86::MMX_PSHUFWri:
592 Src1Name = getRegName(MI->getOperand(1).getReg());
593 // FALL THROUGH.
594 case X86::MMX_PSHUFWmi:
595 DestName = getRegName(MI->getOperand(0).getReg());
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000596 if (MI->getOperand(NumOperands - 1).isImm())
Simon Pilgrimf8f86ab2015-09-13 11:28:45 +0000597 DecodePSHUFMask(MVT::v4i16,
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000598 MI->getOperand(NumOperands - 1).getImm(),
Simon Pilgrimf8f86ab2015-09-13 11:28:45 +0000599 ShuffleMask);
600 break;
601
602 case X86::PSWAPDrr:
603 Src1Name = getRegName(MI->getOperand(1).getReg());
604 // FALL THROUGH.
605 case X86::PSWAPDrm:
606 DestName = getRegName(MI->getOperand(0).getReg());
607 DecodePSWAPMask(MVT::v2i32, ShuffleMask);
608 break;
609
Simon Pilgrim8483df62015-11-17 22:35:45 +0000610 CASE_UNPCK(PUNPCKHBW, r)
Simon Pilgrimf8f86ab2015-09-13 11:28:45 +0000611 case X86::MMX_PUNPCKHBWirr:
Craig Topper89c17612016-06-10 04:48:05 +0000612 Src2Name = getRegName(MI->getOperand(NumOperands - 1).getReg());
613 RegForm = true;
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000614 // FALL THROUGH.
Simon Pilgrim8483df62015-11-17 22:35:45 +0000615 CASE_UNPCK(PUNPCKHBW, m)
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000616 case X86::MMX_PUNPCKHBWirm:
Craig Topper89c17612016-06-10 04:48:05 +0000617 Src1Name = getRegName(MI->getOperand(NumOperands-(RegForm?2:6)).getReg());
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000618 DestName = getRegName(MI->getOperand(0).getReg());
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000619 DecodeUNPCKHMask(getRegOperandVectorVT(MI, MVT::i8, 0), ShuffleMask);
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000620 break;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000621
Simon Pilgrim8483df62015-11-17 22:35:45 +0000622 CASE_UNPCK(PUNPCKHWD, r)
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000623 case X86::MMX_PUNPCKHWDirr:
Craig Topper89c17612016-06-10 04:48:05 +0000624 Src2Name = getRegName(MI->getOperand(NumOperands - 1).getReg());
625 RegForm = true;
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000626 // FALL THROUGH.
Simon Pilgrim8483df62015-11-17 22:35:45 +0000627 CASE_UNPCK(PUNPCKHWD, m)
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000628 case X86::MMX_PUNPCKHWDirm:
Craig Topper89c17612016-06-10 04:48:05 +0000629 Src1Name = getRegName(MI->getOperand(NumOperands-(RegForm?2:6)).getReg());
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000630 DestName = getRegName(MI->getOperand(0).getReg());
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000631 DecodeUNPCKHMask(getRegOperandVectorVT(MI, MVT::i16, 0), ShuffleMask);
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000632 break;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000633
Simon Pilgrim8483df62015-11-17 22:35:45 +0000634 CASE_UNPCK(PUNPCKHDQ, r)
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000635 case X86::MMX_PUNPCKHDQirr:
Craig Topper89c17612016-06-10 04:48:05 +0000636 Src2Name = getRegName(MI->getOperand(NumOperands - 1).getReg());
637 RegForm = true;
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000638 // FALL THROUGH.
Simon Pilgrim8483df62015-11-17 22:35:45 +0000639 CASE_UNPCK(PUNPCKHDQ, m)
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000640 case X86::MMX_PUNPCKHDQirm:
Craig Topper89c17612016-06-10 04:48:05 +0000641 Src1Name = getRegName(MI->getOperand(NumOperands-(RegForm?2:6)).getReg());
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000642 DestName = getRegName(MI->getOperand(0).getReg());
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000643 DecodeUNPCKHMask(getRegOperandVectorVT(MI, MVT::i32, 0), ShuffleMask);
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000644 break;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000645
Simon Pilgrim8483df62015-11-17 22:35:45 +0000646 CASE_UNPCK(PUNPCKHQDQ, r)
Craig Topper89c17612016-06-10 04:48:05 +0000647 Src2Name = getRegName(MI->getOperand(NumOperands - 1).getReg());
648 RegForm = true;
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000649 // FALL THROUGH.
Simon Pilgrim8483df62015-11-17 22:35:45 +0000650 CASE_UNPCK(PUNPCKHQDQ, m)
Craig Topper89c17612016-06-10 04:48:05 +0000651 Src1Name = getRegName(MI->getOperand(NumOperands-(RegForm?2:6)).getReg());
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000652 DestName = getRegName(MI->getOperand(0).getReg());
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000653 DecodeUNPCKHMask(getRegOperandVectorVT(MI, MVT::i64, 0), ShuffleMask);
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000654 break;
655
Simon Pilgrim8483df62015-11-17 22:35:45 +0000656 CASE_UNPCK(PUNPCKLBW, r)
Simon Pilgrimf8f86ab2015-09-13 11:28:45 +0000657 case X86::MMX_PUNPCKLBWirr:
Craig Topper89c17612016-06-10 04:48:05 +0000658 Src2Name = getRegName(MI->getOperand(NumOperands - 1).getReg());
659 RegForm = true;
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000660 // FALL THROUGH.
Simon Pilgrim8483df62015-11-17 22:35:45 +0000661 CASE_UNPCK(PUNPCKLBW, m)
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000662 case X86::MMX_PUNPCKLBWirm:
Craig Topper89c17612016-06-10 04:48:05 +0000663 Src1Name = getRegName(MI->getOperand(NumOperands-(RegForm?2:6)).getReg());
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000664 DestName = getRegName(MI->getOperand(0).getReg());
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000665 DecodeUNPCKLMask(getRegOperandVectorVT(MI, MVT::i8, 0), ShuffleMask);
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000666 break;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000667
Simon Pilgrim8483df62015-11-17 22:35:45 +0000668 CASE_UNPCK(PUNPCKLWD, r)
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000669 case X86::MMX_PUNPCKLWDirr:
Craig Topper89c17612016-06-10 04:48:05 +0000670 Src2Name = getRegName(MI->getOperand(NumOperands - 1).getReg());
671 RegForm = true;
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000672 // FALL THROUGH.
Simon Pilgrim8483df62015-11-17 22:35:45 +0000673 CASE_UNPCK(PUNPCKLWD, m)
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000674 case X86::MMX_PUNPCKLWDirm:
Craig Topper89c17612016-06-10 04:48:05 +0000675 Src1Name = getRegName(MI->getOperand(NumOperands-(RegForm?2:6)).getReg());
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000676 DestName = getRegName(MI->getOperand(0).getReg());
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000677 DecodeUNPCKLMask(getRegOperandVectorVT(MI, MVT::i16, 0), ShuffleMask);
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000678 break;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000679
Simon Pilgrim8483df62015-11-17 22:35:45 +0000680 CASE_UNPCK(PUNPCKLDQ, r)
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000681 case X86::MMX_PUNPCKLDQirr:
Craig Topper89c17612016-06-10 04:48:05 +0000682 Src2Name = getRegName(MI->getOperand(NumOperands - 1).getReg());
683 RegForm = true;
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000684 // FALL THROUGH.
Simon Pilgrim8483df62015-11-17 22:35:45 +0000685 CASE_UNPCK(PUNPCKLDQ, m)
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000686 case X86::MMX_PUNPCKLDQirm:
Craig Topper89c17612016-06-10 04:48:05 +0000687 Src1Name = getRegName(MI->getOperand(NumOperands-(RegForm?2:6)).getReg());
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000688 DestName = getRegName(MI->getOperand(0).getReg());
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000689 DecodeUNPCKLMask(getRegOperandVectorVT(MI, MVT::i32, 0), ShuffleMask);
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000690 break;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000691
Simon Pilgrim8483df62015-11-17 22:35:45 +0000692 CASE_UNPCK(PUNPCKLQDQ, r)
Craig Topper89c17612016-06-10 04:48:05 +0000693 Src2Name = getRegName(MI->getOperand(NumOperands - 1).getReg());
694 RegForm = true;
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000695 // FALL THROUGH.
Simon Pilgrim8483df62015-11-17 22:35:45 +0000696 CASE_UNPCK(PUNPCKLQDQ, m)
Craig Topper89c17612016-06-10 04:48:05 +0000697 Src1Name = getRegName(MI->getOperand(NumOperands-(RegForm?2:6)).getReg());
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000698 DestName = getRegName(MI->getOperand(0).getReg());
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000699 DecodeUNPCKLMask(getRegOperandVectorVT(MI, MVT::i64, 0), ShuffleMask);
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000700 break;
701
Craig Topper01f53b12016-06-03 05:31:00 +0000702 CASE_SHUF(SHUFPD, rri)
Craig Topper89c17612016-06-10 04:48:05 +0000703 Src2Name = getRegName(MI->getOperand(NumOperands - 2).getReg());
704 RegForm = true;
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000705 // FALL THROUGH.
Craig Topper01f53b12016-06-03 05:31:00 +0000706 CASE_SHUF(SHUFPD, rmi)
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000707 if (MI->getOperand(NumOperands - 1).isImm())
Simon Pilgrim5883a732015-11-16 22:39:27 +0000708 DecodeSHUFPMask(getRegOperandVectorVT(MI, MVT::f64, 0),
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000709 MI->getOperand(NumOperands - 1).getImm(),
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000710 ShuffleMask);
Craig Topper89c17612016-06-10 04:48:05 +0000711 Src1Name = getRegName(MI->getOperand(NumOperands-(RegForm?3:7)).getReg());
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000712 DestName = getRegName(MI->getOperand(0).getReg());
713 break;
714
Craig Topper01f53b12016-06-03 05:31:00 +0000715 CASE_SHUF(SHUFPS, rri)
Craig Topper89c17612016-06-10 04:48:05 +0000716 Src2Name = getRegName(MI->getOperand(NumOperands - 2).getReg());
717 RegForm = true;
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000718 // FALL THROUGH.
Craig Topper01f53b12016-06-03 05:31:00 +0000719 CASE_SHUF(SHUFPS, rmi)
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000720 if (MI->getOperand(NumOperands - 1).isImm())
Simon Pilgrim5883a732015-11-16 22:39:27 +0000721 DecodeSHUFPMask(getRegOperandVectorVT(MI, MVT::f32, 0),
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000722 MI->getOperand(NumOperands - 1).getImm(),
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000723 ShuffleMask);
Craig Topper89c17612016-06-10 04:48:05 +0000724 Src1Name = getRegName(MI->getOperand(NumOperands-(RegForm?3:7)).getReg());
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000725 DestName = getRegName(MI->getOperand(0).getReg());
726 break;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000727
Igor Breger24cab0f2015-11-16 07:22:00 +0000728 CASE_VSHUF(64X2, r)
Simon Pilgrimd3869412016-06-11 11:18:38 +0000729 Src2Name = getRegName(MI->getOperand(NumOperands - 2).getReg());
730 RegForm = true;
731 // FALL THROUGH.
Igor Breger24cab0f2015-11-16 07:22:00 +0000732 CASE_VSHUF(64X2, m)
Simon Pilgrimd3869412016-06-11 11:18:38 +0000733 decodeVSHUF64x2FamilyMask(getRegOperandVectorVT(MI, MVT::i64, 0),
734 MI->getOperand(NumOperands - 1).getImm(),
Igor Bregerd7bae452015-10-15 13:29:07 +0000735 ShuffleMask);
Simon Pilgrimd3869412016-06-11 11:18:38 +0000736 Src1Name = getRegName(MI->getOperand(NumOperands-(RegForm?3:7)).getReg());
Igor Bregerd7bae452015-10-15 13:29:07 +0000737 DestName = getRegName(MI->getOperand(0).getReg());
Igor Bregerd7bae452015-10-15 13:29:07 +0000738 break;
Simon Pilgrimd3869412016-06-11 11:18:38 +0000739
740 CASE_VSHUF(32X4, r)
741 Src2Name = getRegName(MI->getOperand(NumOperands - 2).getReg());
742 RegForm = true;
743 // FALL THROUGH.
744 CASE_VSHUF(32X4, m)
745 decodeVSHUF64x2FamilyMask(getRegOperandVectorVT(MI, MVT::i32, 0),
746 MI->getOperand(NumOperands - 1).getImm(),
747 ShuffleMask);
748 Src1Name = getRegName(MI->getOperand(NumOperands-(RegForm?3:7)).getReg());
749 DestName = getRegName(MI->getOperand(0).getReg());
750 break;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000751
Simon Pilgrim8483df62015-11-17 22:35:45 +0000752 CASE_UNPCK(UNPCKLPD, r)
Craig Topper89c17612016-06-10 04:48:05 +0000753 Src2Name = getRegName(MI->getOperand(NumOperands - 1).getReg());
754 RegForm = true;
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000755 // FALL THROUGH.
Simon Pilgrim8483df62015-11-17 22:35:45 +0000756 CASE_UNPCK(UNPCKLPD, m)
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000757 DecodeUNPCKLMask(getRegOperandVectorVT(MI, MVT::f64, 0), ShuffleMask);
Craig Topper89c17612016-06-10 04:48:05 +0000758 Src1Name = getRegName(MI->getOperand(NumOperands-(RegForm?2:6)).getReg());
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000759 DestName = getRegName(MI->getOperand(0).getReg());
760 break;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000761
Simon Pilgrim8483df62015-11-17 22:35:45 +0000762 CASE_UNPCK(UNPCKLPS, r)
Craig Topper89c17612016-06-10 04:48:05 +0000763 Src2Name = getRegName(MI->getOperand(NumOperands - 1).getReg());
764 RegForm = true;
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000765 // FALL THROUGH.
Simon Pilgrim8483df62015-11-17 22:35:45 +0000766 CASE_UNPCK(UNPCKLPS, m)
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000767 DecodeUNPCKLMask(getRegOperandVectorVT(MI, MVT::f32, 0), ShuffleMask);
Craig Topper89c17612016-06-10 04:48:05 +0000768 Src1Name = getRegName(MI->getOperand(NumOperands-(RegForm?2:6)).getReg());
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000769 DestName = getRegName(MI->getOperand(0).getReg());
770 break;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000771
Simon Pilgrim8483df62015-11-17 22:35:45 +0000772 CASE_UNPCK(UNPCKHPD, r)
Craig Topper89c17612016-06-10 04:48:05 +0000773 Src2Name = getRegName(MI->getOperand(NumOperands - 1).getReg());
774 RegForm = true;
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000775 // FALL THROUGH.
Simon Pilgrim8483df62015-11-17 22:35:45 +0000776 CASE_UNPCK(UNPCKHPD, m)
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000777 DecodeUNPCKHMask(getRegOperandVectorVT(MI, MVT::f64, 0), ShuffleMask);
Craig Topper89c17612016-06-10 04:48:05 +0000778 Src1Name = getRegName(MI->getOperand(NumOperands-(RegForm?2:6)).getReg());
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000779 DestName = getRegName(MI->getOperand(0).getReg());
780 break;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000781
Simon Pilgrim8483df62015-11-17 22:35:45 +0000782 CASE_UNPCK(UNPCKHPS, r)
Craig Topper89c17612016-06-10 04:48:05 +0000783 Src2Name = getRegName(MI->getOperand(NumOperands - 1).getReg());
784 RegForm = true;
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000785 // FALL THROUGH.
Simon Pilgrim8483df62015-11-17 22:35:45 +0000786 CASE_UNPCK(UNPCKHPS, m)
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000787 DecodeUNPCKHMask(getRegOperandVectorVT(MI, MVT::f32, 0), ShuffleMask);
Craig Topper89c17612016-06-10 04:48:05 +0000788 Src1Name = getRegName(MI->getOperand(NumOperands-(RegForm?2:6)).getReg());
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000789 DestName = getRegName(MI->getOperand(0).getReg());
790 break;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000791
Simon Pilgrim2da41782015-11-17 23:29:49 +0000792 CASE_VPERM(PERMILPS, r)
Simon Pilgrim6ce35dd2016-05-11 18:53:44 +0000793 Src1Name = getRegName(MI->getOperand(NumOperands - 2).getReg());
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000794 // FALL THROUGH.
Simon Pilgrim2da41782015-11-17 23:29:49 +0000795 CASE_VPERM(PERMILPS, m)
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000796 if (MI->getOperand(NumOperands - 1).isImm())
Simon Pilgrim5883a732015-11-16 22:39:27 +0000797 DecodePSHUFMask(getRegOperandVectorVT(MI, MVT::f32, 0),
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000798 MI->getOperand(NumOperands - 1).getImm(),
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000799 ShuffleMask);
800 DestName = getRegName(MI->getOperand(0).getReg());
801 break;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000802
Simon Pilgrim2da41782015-11-17 23:29:49 +0000803 CASE_VPERM(PERMILPD, r)
Simon Pilgrim6ce35dd2016-05-11 18:53:44 +0000804 Src1Name = getRegName(MI->getOperand(NumOperands - 2).getReg());
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000805 // FALL THROUGH.
Simon Pilgrim2da41782015-11-17 23:29:49 +0000806 CASE_VPERM(PERMILPD, m)
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000807 if (MI->getOperand(NumOperands - 1).isImm())
Simon Pilgrim5883a732015-11-16 22:39:27 +0000808 DecodePSHUFMask(getRegOperandVectorVT(MI, MVT::f64, 0),
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000809 MI->getOperand(NumOperands - 1).getImm(),
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000810 ShuffleMask);
811 DestName = getRegName(MI->getOperand(0).getReg());
812 break;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000813
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000814 case X86::VPERM2F128rr:
815 case X86::VPERM2I128rr:
816 Src2Name = getRegName(MI->getOperand(2).getReg());
817 // FALL THROUGH.
818 case X86::VPERM2F128rm:
819 case X86::VPERM2I128rm:
820 // For instruction comments purpose, assume the 256-bit vector is v4i64.
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000821 if (MI->getOperand(NumOperands - 1).isImm())
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000822 DecodeVPERM2X128Mask(MVT::v4i64,
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000823 MI->getOperand(NumOperands - 1).getImm(),
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000824 ShuffleMask);
825 Src1Name = getRegName(MI->getOperand(1).getReg());
826 DestName = getRegName(MI->getOperand(0).getReg());
827 break;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000828
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000829 case X86::VPERMQYri:
Craig Topper22ae3532016-05-21 06:07:18 +0000830 case X86::VPERMQZ256ri:
Craig Topper200d2372016-06-10 05:12:40 +0000831 case X86::VPERMQZ256rik:
832 case X86::VPERMQZ256rikz:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000833 case X86::VPERMPDYri:
Craig Topper22ae3532016-05-21 06:07:18 +0000834 case X86::VPERMPDZ256ri:
Craig Topper200d2372016-06-10 05:12:40 +0000835 case X86::VPERMPDZ256rik:
836 case X86::VPERMPDZ256rikz:
837 Src1Name = getRegName(MI->getOperand(NumOperands - 2).getReg());
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000838 // FALL THROUGH.
839 case X86::VPERMQYmi:
Craig Topper22ae3532016-05-21 06:07:18 +0000840 case X86::VPERMQZ256mi:
Craig Topper200d2372016-06-10 05:12:40 +0000841 case X86::VPERMQZ256mik:
842 case X86::VPERMQZ256mikz:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000843 case X86::VPERMPDYmi:
Craig Topper22ae3532016-05-21 06:07:18 +0000844 case X86::VPERMPDZ256mi:
Craig Topper200d2372016-06-10 05:12:40 +0000845 case X86::VPERMPDZ256mik:
846 case X86::VPERMPDZ256mikz:
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000847 if (MI->getOperand(NumOperands - 1).isImm())
848 DecodeVPERMMask(MI->getOperand(NumOperands - 1).getImm(),
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000849 ShuffleMask);
850 DestName = getRegName(MI->getOperand(0).getReg());
851 break;
852
853 case X86::MOVSDrr:
854 case X86::VMOVSDrr:
Simon Pilgrimf5c23ad2016-02-01 22:26:28 +0000855 case X86::VMOVSDZrr:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000856 Src2Name = getRegName(MI->getOperand(2).getReg());
857 Src1Name = getRegName(MI->getOperand(1).getReg());
858 // FALL THROUGH.
859 case X86::MOVSDrm:
860 case X86::VMOVSDrm:
Simon Pilgrimf5c23ad2016-02-01 22:26:28 +0000861 case X86::VMOVSDZrm:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000862 DecodeScalarMoveMask(MVT::v2f64, nullptr == Src2Name, ShuffleMask);
863 DestName = getRegName(MI->getOperand(0).getReg());
864 break;
Simon Pilgrimd5a15442015-11-21 13:04:42 +0000865
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000866 case X86::MOVSSrr:
867 case X86::VMOVSSrr:
Simon Pilgrimf5c23ad2016-02-01 22:26:28 +0000868 case X86::VMOVSSZrr:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000869 Src2Name = getRegName(MI->getOperand(2).getReg());
870 Src1Name = getRegName(MI->getOperand(1).getReg());
871 // FALL THROUGH.
872 case X86::MOVSSrm:
873 case X86::VMOVSSrm:
Simon Pilgrimf5c23ad2016-02-01 22:26:28 +0000874 case X86::VMOVSSZrm:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000875 DecodeScalarMoveMask(MVT::v4f32, nullptr == Src2Name, ShuffleMask);
876 DestName = getRegName(MI->getOperand(0).getReg());
877 break;
878
879 case X86::MOVPQI2QIrr:
Simon Pilgrim3e0c0222015-12-13 12:49:48 +0000880 case X86::MOVZPQILo2PQIrr:
881 case X86::VMOVPQI2QIrr:
882 case X86::VMOVZPQILo2PQIrr:
883 case X86::VMOVZPQILo2PQIZrr:
884 Src1Name = getRegName(MI->getOperand(1).getReg());
885 // FALL THROUGH.
886 case X86::MOVQI2PQIrm:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000887 case X86::MOVZQI2PQIrm:
888 case X86::MOVZPQILo2PQIrm:
Simon Pilgrim3e0c0222015-12-13 12:49:48 +0000889 case X86::VMOVQI2PQIrm:
Simon Pilgrim96fe4ef2016-02-02 13:32:56 +0000890 case X86::VMOVQI2PQIZrm:
Simon Pilgrim3e0c0222015-12-13 12:49:48 +0000891 case X86::VMOVZQI2PQIrm:
892 case X86::VMOVZPQILo2PQIrm:
893 case X86::VMOVZPQILo2PQIZrm:
894 DecodeZeroMoveLowMask(MVT::v2i64, ShuffleMask);
895 DestName = getRegName(MI->getOperand(0).getReg());
896 break;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000897
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000898 case X86::MOVDI2PDIrm:
899 case X86::VMOVDI2PDIrm:
Simon Pilgrim5be17b62016-02-01 23:04:05 +0000900 case X86::VMOVDI2PDIZrm:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000901 DecodeZeroMoveLowMask(MVT::v4i32, ShuffleMask);
902 DestName = getRegName(MI->getOperand(0).getReg());
903 break;
904
Simon Pilgrimd85cae32015-07-06 20:46:41 +0000905 case X86::EXTRQI:
906 if (MI->getOperand(2).isImm() &&
907 MI->getOperand(3).isImm())
908 DecodeEXTRQIMask(MI->getOperand(2).getImm(),
909 MI->getOperand(3).getImm(),
910 ShuffleMask);
911
912 DestName = getRegName(MI->getOperand(0).getReg());
913 Src1Name = getRegName(MI->getOperand(1).getReg());
914 break;
915
916 case X86::INSERTQI:
917 if (MI->getOperand(3).isImm() &&
918 MI->getOperand(4).isImm())
919 DecodeINSERTQIMask(MI->getOperand(3).getImm(),
920 MI->getOperand(4).getImm(),
921 ShuffleMask);
922
923 DestName = getRegName(MI->getOperand(0).getReg());
924 Src1Name = getRegName(MI->getOperand(1).getReg());
925 Src2Name = getRegName(MI->getOperand(2).getReg());
926 break;
927
Simon Pilgrim0acc32a2016-02-06 19:51:21 +0000928 CASE_PMOVZX(PMOVZXBW, r)
929 CASE_PMOVZX(PMOVZXBD, r)
930 CASE_PMOVZX(PMOVZXBQ, r)
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000931 Src1Name = getRegName(MI->getOperand(NumOperands - 1).getReg());
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000932 // FALL THROUGH.
Simon Pilgrim0acc32a2016-02-06 19:51:21 +0000933 CASE_PMOVZX(PMOVZXBW, m)
934 CASE_PMOVZX(PMOVZXBD, m)
935 CASE_PMOVZX(PMOVZXBQ, m)
Simon Pilgrime1b6db92016-02-06 16:33:42 +0000936 DecodeZeroExtendMask(MVT::i8, getZeroExtensionResultType(MI), ShuffleMask);
937 DestName = getRegName(MI->getOperand(0).getReg());
938 break;
939
Simon Pilgrim0acc32a2016-02-06 19:51:21 +0000940 CASE_PMOVZX(PMOVZXWD, r)
941 CASE_PMOVZX(PMOVZXWQ, r)
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000942 Src1Name = getRegName(MI->getOperand(NumOperands - 1).getReg());
Simon Pilgrime1b6db92016-02-06 16:33:42 +0000943 // FALL THROUGH.
Simon Pilgrim0acc32a2016-02-06 19:51:21 +0000944 CASE_PMOVZX(PMOVZXWD, m)
945 CASE_PMOVZX(PMOVZXWQ, m)
Simon Pilgrime1b6db92016-02-06 16:33:42 +0000946 DecodeZeroExtendMask(MVT::i16, getZeroExtensionResultType(MI), ShuffleMask);
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000947 DestName = getRegName(MI->getOperand(0).getReg());
Simon Pilgrime1b6db92016-02-06 16:33:42 +0000948 break;
949
Simon Pilgrim0acc32a2016-02-06 19:51:21 +0000950 CASE_PMOVZX(PMOVZXDQ, r)
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000951 Src1Name = getRegName(MI->getOperand(NumOperands - 1).getReg());
Simon Pilgrime1b6db92016-02-06 16:33:42 +0000952 // FALL THROUGH.
Simon Pilgrim0acc32a2016-02-06 19:51:21 +0000953 CASE_PMOVZX(PMOVZXDQ, m)
Simon Pilgrime1b6db92016-02-06 16:33:42 +0000954 DecodeZeroExtendMask(MVT::i32, getZeroExtensionResultType(MI), ShuffleMask);
955 DestName = getRegName(MI->getOperand(0).getReg());
956 break;
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000957 }
958
959 // The only comments we decode are shuffles, so give up if we were unable to
960 // decode a shuffle mask.
961 if (ShuffleMask.empty())
962 return false;
963
964 if (!DestName) DestName = Src1Name;
Simon Pilgrim7c2fbdc2016-07-03 13:08:29 +0000965 OS << (DestName ? getMaskName(MI, DestName, getRegName) : "mem") << " = ";
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000966
967 // If the two sources are the same, canonicalize the input elements to be
968 // from the first src so that we get larger element spans.
969 if (Src1Name == Src2Name) {
970 for (unsigned i = 0, e = ShuffleMask.size(); i != e; ++i) {
971 if ((int)ShuffleMask[i] >= 0 && // Not sentinel.
NAKAMURA Takumi5582a6a2015-05-25 01:43:34 +0000972 ShuffleMask[i] >= (int)e) // From second mask.
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000973 ShuffleMask[i] -= e;
974 }
975 }
976
977 // The shuffle mask specifies which elements of the src1/src2 fill in the
978 // destination, with a few sentinel values. Loop through and print them
979 // out.
980 for (unsigned i = 0, e = ShuffleMask.size(); i != e; ++i) {
981 if (i != 0)
982 OS << ',';
983 if (ShuffleMask[i] == SM_SentinelZero) {
984 OS << "zero";
985 continue;
986 }
987
988 // Otherwise, it must come from src1 or src2. Print the span of elements
989 // that comes from this src.
990 bool isSrc1 = ShuffleMask[i] < (int)ShuffleMask.size();
991 const char *SrcName = isSrc1 ? Src1Name : Src2Name;
992 OS << (SrcName ? SrcName : "mem") << '[';
993 bool IsFirst = true;
994 while (i != e && (int)ShuffleMask[i] != SM_SentinelZero &&
995 (ShuffleMask[i] < (int)ShuffleMask.size()) == isSrc1) {
996 if (!IsFirst)
997 OS << ',';
998 else
999 IsFirst = false;
1000 if (ShuffleMask[i] == SM_SentinelUndef)
1001 OS << "u";
1002 else
1003 OS << ShuffleMask[i] % ShuffleMask.size();
1004 ++i;
1005 }
1006 OS << ']';
NAKAMURA Takumi5582a6a2015-05-25 01:43:34 +00001007 --i; // For loop increments element #.
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +00001008 }
1009 //MI->print(OS, 0);
1010 OS << "\n";
1011
1012 // We successfully added a comment to this instruction.
1013 return true;
1014}