blob: ca2f990d9725719f388bf666730a12735441a365 [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
Igor Breger24cab0f2015-11-16 07:22:00 +000024static unsigned getVectorRegSize(unsigned RegNo) {
Igor Breger24cab0f2015-11-16 07:22:00 +000025 if (X86::ZMM0 <= RegNo && RegNo <= X86::ZMM31)
26 return 512;
27 if (X86::YMM0 <= RegNo && RegNo <= X86::YMM31)
28 return 256;
29 if (X86::XMM0 <= RegNo && RegNo <= X86::XMM31)
30 return 128;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +000031 if (X86::MM0 <= RegNo && RegNo <= X86::MM7)
32 return 64;
Igor Breger24cab0f2015-11-16 07:22:00 +000033
34 llvm_unreachable("Unknown vector reg!");
35 return 0;
36}
37
38static MVT getRegOperandVectorVT(const MCInst *MI, const MVT &ScalarVT,
39 unsigned OperandIndex) {
40 unsigned OpReg = MI->getOperand(OperandIndex).getReg();
41 return MVT::getVectorVT(ScalarVT,
42 getVectorRegSize(OpReg)/ScalarVT.getSizeInBits());
43}
44
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +000045/// \brief Extracts the src/dst types for a given zero extension instruction.
46/// \note While the number of elements in DstVT type correct, the
47/// number in the SrcVT type is expanded to fill the src xmm register and the
48/// upper elements may not be included in the dst xmm/ymm register.
49static void getZeroExtensionTypes(const MCInst *MI, MVT &SrcVT, MVT &DstVT) {
50 switch (MI->getOpcode()) {
51 default:
52 llvm_unreachable("Unknown zero extension instruction");
53 // i8 zero extension
54 case X86::PMOVZXBWrm:
55 case X86::PMOVZXBWrr:
56 case X86::VPMOVZXBWrm:
57 case X86::VPMOVZXBWrr:
58 SrcVT = MVT::v16i8;
59 DstVT = MVT::v8i16;
60 break;
61 case X86::VPMOVZXBWYrm:
62 case X86::VPMOVZXBWYrr:
63 SrcVT = MVT::v16i8;
64 DstVT = MVT::v16i16;
65 break;
66 case X86::PMOVZXBDrm:
67 case X86::PMOVZXBDrr:
68 case X86::VPMOVZXBDrm:
69 case X86::VPMOVZXBDrr:
70 SrcVT = MVT::v16i8;
71 DstVT = MVT::v4i32;
72 break;
73 case X86::VPMOVZXBDYrm:
74 case X86::VPMOVZXBDYrr:
75 SrcVT = MVT::v16i8;
76 DstVT = MVT::v8i32;
77 break;
78 case X86::PMOVZXBQrm:
79 case X86::PMOVZXBQrr:
80 case X86::VPMOVZXBQrm:
81 case X86::VPMOVZXBQrr:
82 SrcVT = MVT::v16i8;
83 DstVT = MVT::v2i64;
84 break;
85 case X86::VPMOVZXBQYrm:
86 case X86::VPMOVZXBQYrr:
87 SrcVT = MVT::v16i8;
88 DstVT = MVT::v4i64;
89 break;
90 // i16 zero extension
91 case X86::PMOVZXWDrm:
92 case X86::PMOVZXWDrr:
93 case X86::VPMOVZXWDrm:
94 case X86::VPMOVZXWDrr:
95 SrcVT = MVT::v8i16;
96 DstVT = MVT::v4i32;
97 break;
98 case X86::VPMOVZXWDYrm:
99 case X86::VPMOVZXWDYrr:
100 SrcVT = MVT::v8i16;
101 DstVT = MVT::v8i32;
102 break;
103 case X86::PMOVZXWQrm:
104 case X86::PMOVZXWQrr:
105 case X86::VPMOVZXWQrm:
106 case X86::VPMOVZXWQrr:
107 SrcVT = MVT::v8i16;
108 DstVT = MVT::v2i64;
109 break;
110 case X86::VPMOVZXWQYrm:
111 case X86::VPMOVZXWQYrr:
112 SrcVT = MVT::v8i16;
113 DstVT = MVT::v4i64;
114 break;
115 // i32 zero extension
116 case X86::PMOVZXDQrm:
117 case X86::PMOVZXDQrr:
118 case X86::VPMOVZXDQrm:
119 case X86::VPMOVZXDQrr:
120 SrcVT = MVT::v4i32;
121 DstVT = MVT::v2i64;
122 break;
123 case X86::VPMOVZXDQYrm:
124 case X86::VPMOVZXDQYrr:
125 SrcVT = MVT::v4i32;
126 DstVT = MVT::v4i64;
127 break;
128 }
129}
130
Igor Breger24cab0f2015-11-16 07:22:00 +0000131#define CASE_MASK_INS_COMMON(Inst, Suffix, src) \
132 case X86::V##Inst##Suffix##src: \
133 case X86::V##Inst##Suffix##src##k: \
134 case X86::V##Inst##Suffix##src##kz:
Igor Bregerd7bae452015-10-15 13:29:07 +0000135
Igor Breger24cab0f2015-11-16 07:22:00 +0000136#define CASE_SSE_INS_COMMON(Inst, src) \
137 case X86::Inst##src:
138
139#define CASE_AVX_INS_COMMON(Inst, Suffix, src) \
140 case X86::V##Inst##Suffix##src:
141
142#define CASE_MOVDUP(Inst, src) \
143 CASE_MASK_INS_COMMON(Inst, Z, r##src) \
144 CASE_MASK_INS_COMMON(Inst, Z256, r##src) \
145 CASE_MASK_INS_COMMON(Inst, Z128, r##src) \
146 CASE_AVX_INS_COMMON(Inst, , r##src) \
147 CASE_AVX_INS_COMMON(Inst, Y, r##src) \
148 CASE_SSE_INS_COMMON(Inst, r##src) \
149
150#define CASE_VSHUF(Inst, src) \
151 CASE_MASK_INS_COMMON(SHUFF##Inst, Z, r##src##i) \
152 CASE_MASK_INS_COMMON(SHUFI##Inst, Z, r##src##i) \
153 CASE_MASK_INS_COMMON(SHUFF##Inst, Z256, r##src##i) \
154 CASE_MASK_INS_COMMON(SHUFI##Inst, Z256, r##src##i) \
Igor Bregerd7bae452015-10-15 13:29:07 +0000155
156/// \brief Extracts the types and if it has memory operand for a given
157/// (SHUFF32x4/SHUFF64x2/SHUFI32x4/SHUFI64x2) instruction.
158static void getVSHUF64x2FamilyInfo(const MCInst *MI, MVT &VT, bool &HasMemOp) {
159 HasMemOp = false;
160 switch (MI->getOpcode()) {
161 default:
162 llvm_unreachable("Unknown VSHUF64x2 family instructions.");
163 break;
Igor Breger24cab0f2015-11-16 07:22:00 +0000164 CASE_VSHUF(64X2, m)
Igor Bregerd7bae452015-10-15 13:29:07 +0000165 HasMemOp = true; // FALL THROUGH.
Igor Breger24cab0f2015-11-16 07:22:00 +0000166 CASE_VSHUF(64X2, r)
167 VT = getRegOperandVectorVT(MI, MVT::i64, 0);
Igor Bregerd7bae452015-10-15 13:29:07 +0000168 break;
Igor Breger24cab0f2015-11-16 07:22:00 +0000169 CASE_VSHUF(32X4, m)
Igor Bregerd7bae452015-10-15 13:29:07 +0000170 HasMemOp = true; // FALL THROUGH.
Igor Breger24cab0f2015-11-16 07:22:00 +0000171 CASE_VSHUF(32X4, r)
172 VT = getRegOperandVectorVT(MI, MVT::i32, 0);
Igor Bregerd7bae452015-10-15 13:29:07 +0000173 break;
174 }
175}
176
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000177//===----------------------------------------------------------------------===//
178// Top Level Entrypoint
179//===----------------------------------------------------------------------===//
180
181/// EmitAnyX86InstComments - This function decodes x86 instructions and prints
182/// newline terminated strings to the specified string if desired. This
183/// information is shown in disassembly dumps when verbose assembly is enabled.
184bool llvm::EmitAnyX86InstComments(const MCInst *MI, raw_ostream &OS,
185 const char *(*getRegName)(unsigned)) {
186 // If this is a shuffle operation, the switch should fill in this state.
187 SmallVector<int, 8> ShuffleMask;
188 const char *DestName = nullptr, *Src1Name = nullptr, *Src2Name = nullptr;
189
190 switch (MI->getOpcode()) {
191 default:
192 // Not an instruction for which we can decode comments.
193 return false;
194
195 case X86::BLENDPDrri:
196 case X86::VBLENDPDrri:
197 Src2Name = getRegName(MI->getOperand(2).getReg());
198 // FALL THROUGH.
199 case X86::BLENDPDrmi:
200 case X86::VBLENDPDrmi:
NAKAMURA Takumi5582a6a2015-05-25 01:43:34 +0000201 if (MI->getOperand(MI->getNumOperands() - 1).isImm())
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000202 DecodeBLENDMask(MVT::v2f64,
NAKAMURA Takumi5582a6a2015-05-25 01:43:34 +0000203 MI->getOperand(MI->getNumOperands() - 1).getImm(),
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000204 ShuffleMask);
205 Src1Name = getRegName(MI->getOperand(1).getReg());
206 DestName = getRegName(MI->getOperand(0).getReg());
207 break;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000208
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000209 case X86::VBLENDPDYrri:
210 Src2Name = getRegName(MI->getOperand(2).getReg());
211 // FALL THROUGH.
212 case X86::VBLENDPDYrmi:
NAKAMURA Takumi5582a6a2015-05-25 01:43:34 +0000213 if (MI->getOperand(MI->getNumOperands() - 1).isImm())
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000214 DecodeBLENDMask(MVT::v4f64,
NAKAMURA Takumi5582a6a2015-05-25 01:43:34 +0000215 MI->getOperand(MI->getNumOperands() - 1).getImm(),
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000216 ShuffleMask);
217 Src1Name = getRegName(MI->getOperand(1).getReg());
218 DestName = getRegName(MI->getOperand(0).getReg());
219 break;
220
221 case X86::BLENDPSrri:
222 case X86::VBLENDPSrri:
223 Src2Name = getRegName(MI->getOperand(2).getReg());
224 // FALL THROUGH.
225 case X86::BLENDPSrmi:
226 case X86::VBLENDPSrmi:
NAKAMURA Takumi5582a6a2015-05-25 01:43:34 +0000227 if (MI->getOperand(MI->getNumOperands() - 1).isImm())
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000228 DecodeBLENDMask(MVT::v4f32,
NAKAMURA Takumi5582a6a2015-05-25 01:43:34 +0000229 MI->getOperand(MI->getNumOperands() - 1).getImm(),
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000230 ShuffleMask);
231 Src1Name = getRegName(MI->getOperand(1).getReg());
232 DestName = getRegName(MI->getOperand(0).getReg());
233 break;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000234
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000235 case X86::VBLENDPSYrri:
236 Src2Name = getRegName(MI->getOperand(2).getReg());
237 // FALL THROUGH.
238 case X86::VBLENDPSYrmi:
NAKAMURA Takumi5582a6a2015-05-25 01:43:34 +0000239 if (MI->getOperand(MI->getNumOperands() - 1).isImm())
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000240 DecodeBLENDMask(MVT::v8f32,
NAKAMURA Takumi5582a6a2015-05-25 01:43:34 +0000241 MI->getOperand(MI->getNumOperands() - 1).getImm(),
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000242 ShuffleMask);
243 Src1Name = getRegName(MI->getOperand(1).getReg());
244 DestName = getRegName(MI->getOperand(0).getReg());
245 break;
246
247 case X86::PBLENDWrri:
248 case X86::VPBLENDWrri:
249 Src2Name = getRegName(MI->getOperand(2).getReg());
250 // FALL THROUGH.
251 case X86::PBLENDWrmi:
252 case X86::VPBLENDWrmi:
NAKAMURA Takumi5582a6a2015-05-25 01:43:34 +0000253 if (MI->getOperand(MI->getNumOperands() - 1).isImm())
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000254 DecodeBLENDMask(MVT::v8i16,
NAKAMURA Takumi5582a6a2015-05-25 01:43:34 +0000255 MI->getOperand(MI->getNumOperands() - 1).getImm(),
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000256 ShuffleMask);
257 Src1Name = getRegName(MI->getOperand(1).getReg());
258 DestName = getRegName(MI->getOperand(0).getReg());
259 break;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000260
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000261 case X86::VPBLENDWYrri:
262 Src2Name = getRegName(MI->getOperand(2).getReg());
263 // FALL THROUGH.
264 case X86::VPBLENDWYrmi:
NAKAMURA Takumi5582a6a2015-05-25 01:43:34 +0000265 if (MI->getOperand(MI->getNumOperands() - 1).isImm())
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000266 DecodeBLENDMask(MVT::v16i16,
NAKAMURA Takumi5582a6a2015-05-25 01:43:34 +0000267 MI->getOperand(MI->getNumOperands() - 1).getImm(),
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000268 ShuffleMask);
269 Src1Name = getRegName(MI->getOperand(1).getReg());
270 DestName = getRegName(MI->getOperand(0).getReg());
271 break;
272
273 case X86::VPBLENDDrri:
274 Src2Name = getRegName(MI->getOperand(2).getReg());
275 // FALL THROUGH.
276 case X86::VPBLENDDrmi:
NAKAMURA Takumi5582a6a2015-05-25 01:43:34 +0000277 if (MI->getOperand(MI->getNumOperands() - 1).isImm())
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000278 DecodeBLENDMask(MVT::v4i32,
NAKAMURA Takumi5582a6a2015-05-25 01:43:34 +0000279 MI->getOperand(MI->getNumOperands() - 1).getImm(),
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000280 ShuffleMask);
281 Src1Name = getRegName(MI->getOperand(1).getReg());
282 DestName = getRegName(MI->getOperand(0).getReg());
283 break;
284
285 case X86::VPBLENDDYrri:
286 Src2Name = getRegName(MI->getOperand(2).getReg());
287 // FALL THROUGH.
288 case X86::VPBLENDDYrmi:
NAKAMURA Takumi5582a6a2015-05-25 01:43:34 +0000289 if (MI->getOperand(MI->getNumOperands() - 1).isImm())
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000290 DecodeBLENDMask(MVT::v8i32,
NAKAMURA Takumi5582a6a2015-05-25 01:43:34 +0000291 MI->getOperand(MI->getNumOperands() - 1).getImm(),
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000292 ShuffleMask);
293 Src1Name = getRegName(MI->getOperand(1).getReg());
294 DestName = getRegName(MI->getOperand(0).getReg());
295 break;
296
297 case X86::INSERTPSrr:
298 case X86::VINSERTPSrr:
299 Src2Name = getRegName(MI->getOperand(2).getReg());
300 // FALL THROUGH.
301 case X86::INSERTPSrm:
302 case X86::VINSERTPSrm:
303 DestName = getRegName(MI->getOperand(0).getReg());
304 Src1Name = getRegName(MI->getOperand(1).getReg());
NAKAMURA Takumi5582a6a2015-05-25 01:43:34 +0000305 if (MI->getOperand(MI->getNumOperands() - 1).isImm())
306 DecodeINSERTPSMask(MI->getOperand(MI->getNumOperands() - 1).getImm(),
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000307 ShuffleMask);
308 break;
309
310 case X86::MOVLHPSrr:
311 case X86::VMOVLHPSrr:
312 Src2Name = getRegName(MI->getOperand(2).getReg());
313 Src1Name = getRegName(MI->getOperand(1).getReg());
314 DestName = getRegName(MI->getOperand(0).getReg());
315 DecodeMOVLHPSMask(2, ShuffleMask);
316 break;
317
318 case X86::MOVHLPSrr:
319 case X86::VMOVHLPSrr:
320 Src2Name = getRegName(MI->getOperand(2).getReg());
321 Src1Name = getRegName(MI->getOperand(1).getReg());
322 DestName = getRegName(MI->getOperand(0).getReg());
323 DecodeMOVHLPSMask(2, ShuffleMask);
324 break;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000325
Igor Breger24cab0f2015-11-16 07:22:00 +0000326 CASE_MOVDUP(MOVSLDUP, r)
327 Src1Name = getRegName(MI->getOperand(MI->getNumOperands() - 1).getReg());
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000328 // FALL THROUGH.
Igor Breger24cab0f2015-11-16 07:22:00 +0000329 CASE_MOVDUP(MOVSLDUP, m) {
330 MVT VT = getRegOperandVectorVT(MI, MVT::f32, 0);
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000331 DestName = getRegName(MI->getOperand(0).getReg());
Igor Breger24cab0f2015-11-16 07:22:00 +0000332 DecodeMOVSLDUPMask(VT, ShuffleMask);
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000333 break;
Igor Breger24cab0f2015-11-16 07:22:00 +0000334 }
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000335
Igor Breger24cab0f2015-11-16 07:22:00 +0000336 CASE_MOVDUP(MOVSHDUP, r)
337 Src1Name = getRegName(MI->getOperand(MI->getNumOperands() - 1).getReg());
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000338 // FALL THROUGH.
Igor Breger24cab0f2015-11-16 07:22:00 +0000339 CASE_MOVDUP(MOVSHDUP, m) {
340 MVT VT = getRegOperandVectorVT(MI, MVT::f32, 0);
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000341 DestName = getRegName(MI->getOperand(0).getReg());
Igor Breger24cab0f2015-11-16 07:22:00 +0000342 DecodeMOVSHDUPMask(VT, ShuffleMask);
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000343 break;
Igor Breger24cab0f2015-11-16 07:22:00 +0000344 }
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000345
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000346 case X86::VMOVDDUPYrr:
347 Src1Name = getRegName(MI->getOperand(1).getReg());
348 // FALL THROUGH.
349 case X86::VMOVDDUPYrm:
350 DestName = getRegName(MI->getOperand(0).getReg());
351 DecodeMOVDDUPMask(MVT::v4f64, ShuffleMask);
352 break;
353
354 case X86::MOVDDUPrr:
355 case X86::VMOVDDUPrr:
356 Src1Name = getRegName(MI->getOperand(1).getReg());
357 // FALL THROUGH.
358 case X86::MOVDDUPrm:
359 case X86::VMOVDDUPrm:
360 DestName = getRegName(MI->getOperand(0).getReg());
361 DecodeMOVDDUPMask(MVT::v2f64, ShuffleMask);
362 break;
363
364 case X86::PSLLDQri:
365 case X86::VPSLLDQri:
366 Src1Name = getRegName(MI->getOperand(1).getReg());
367 DestName = getRegName(MI->getOperand(0).getReg());
NAKAMURA Takumi5582a6a2015-05-25 01:43:34 +0000368 if (MI->getOperand(MI->getNumOperands() - 1).isImm())
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000369 DecodePSLLDQMask(MVT::v16i8,
NAKAMURA Takumi5582a6a2015-05-25 01:43:34 +0000370 MI->getOperand(MI->getNumOperands() - 1).getImm(),
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000371 ShuffleMask);
372 break;
373
374 case X86::VPSLLDQYri:
375 Src1Name = getRegName(MI->getOperand(1).getReg());
376 DestName = getRegName(MI->getOperand(0).getReg());
NAKAMURA Takumi5582a6a2015-05-25 01:43:34 +0000377 if (MI->getOperand(MI->getNumOperands() - 1).isImm())
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000378 DecodePSLLDQMask(MVT::v32i8,
NAKAMURA Takumi5582a6a2015-05-25 01:43:34 +0000379 MI->getOperand(MI->getNumOperands() - 1).getImm(),
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000380 ShuffleMask);
381 break;
382
383 case X86::PSRLDQri:
384 case X86::VPSRLDQri:
385 Src1Name = getRegName(MI->getOperand(1).getReg());
386 DestName = getRegName(MI->getOperand(0).getReg());
NAKAMURA Takumi5582a6a2015-05-25 01:43:34 +0000387 if (MI->getOperand(MI->getNumOperands() - 1).isImm())
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000388 DecodePSRLDQMask(MVT::v16i8,
NAKAMURA Takumi5582a6a2015-05-25 01:43:34 +0000389 MI->getOperand(MI->getNumOperands() - 1).getImm(),
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000390 ShuffleMask);
391 break;
392
393 case X86::VPSRLDQYri:
394 Src1Name = getRegName(MI->getOperand(1).getReg());
395 DestName = getRegName(MI->getOperand(0).getReg());
NAKAMURA Takumi5582a6a2015-05-25 01:43:34 +0000396 if (MI->getOperand(MI->getNumOperands() - 1).isImm())
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000397 DecodePSRLDQMask(MVT::v32i8,
NAKAMURA Takumi5582a6a2015-05-25 01:43:34 +0000398 MI->getOperand(MI->getNumOperands() - 1).getImm(),
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000399 ShuffleMask);
400 break;
401
402 case X86::PALIGNR128rr:
403 case X86::VPALIGNR128rr:
404 Src1Name = getRegName(MI->getOperand(2).getReg());
405 // FALL THROUGH.
406 case X86::PALIGNR128rm:
407 case X86::VPALIGNR128rm:
408 Src2Name = getRegName(MI->getOperand(1).getReg());
409 DestName = getRegName(MI->getOperand(0).getReg());
NAKAMURA Takumi5582a6a2015-05-25 01:43:34 +0000410 if (MI->getOperand(MI->getNumOperands() - 1).isImm())
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000411 DecodePALIGNRMask(MVT::v16i8,
NAKAMURA Takumi5582a6a2015-05-25 01:43:34 +0000412 MI->getOperand(MI->getNumOperands() - 1).getImm(),
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000413 ShuffleMask);
414 break;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000415
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000416 case X86::VPALIGNR256rr:
417 Src1Name = getRegName(MI->getOperand(2).getReg());
418 // FALL THROUGH.
419 case X86::VPALIGNR256rm:
420 Src2Name = getRegName(MI->getOperand(1).getReg());
421 DestName = getRegName(MI->getOperand(0).getReg());
NAKAMURA Takumi5582a6a2015-05-25 01:43:34 +0000422 if (MI->getOperand(MI->getNumOperands() - 1).isImm())
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000423 DecodePALIGNRMask(MVT::v32i8,
NAKAMURA Takumi5582a6a2015-05-25 01:43:34 +0000424 MI->getOperand(MI->getNumOperands() - 1).getImm(),
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000425 ShuffleMask);
426 break;
427
428 case X86::PSHUFDri:
429 case X86::VPSHUFDri:
430 Src1Name = getRegName(MI->getOperand(1).getReg());
431 // FALL THROUGH.
432 case X86::PSHUFDmi:
433 case X86::VPSHUFDmi:
434 DestName = getRegName(MI->getOperand(0).getReg());
NAKAMURA Takumi5582a6a2015-05-25 01:43:34 +0000435 if (MI->getOperand(MI->getNumOperands() - 1).isImm())
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000436 DecodePSHUFMask(MVT::v4i32,
NAKAMURA Takumi5582a6a2015-05-25 01:43:34 +0000437 MI->getOperand(MI->getNumOperands() - 1).getImm(),
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000438 ShuffleMask);
439 break;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000440
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000441 case X86::VPSHUFDYri:
442 Src1Name = getRegName(MI->getOperand(1).getReg());
443 // FALL THROUGH.
444 case X86::VPSHUFDYmi:
445 DestName = getRegName(MI->getOperand(0).getReg());
NAKAMURA Takumi5582a6a2015-05-25 01:43:34 +0000446 if (MI->getOperand(MI->getNumOperands() - 1).isImm())
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000447 DecodePSHUFMask(MVT::v8i32,
NAKAMURA Takumi5582a6a2015-05-25 01:43:34 +0000448 MI->getOperand(MI->getNumOperands() - 1).getImm(),
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000449 ShuffleMask);
450 break;
451
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000452 case X86::PSHUFHWri:
453 case X86::VPSHUFHWri:
454 Src1Name = getRegName(MI->getOperand(1).getReg());
455 // FALL THROUGH.
456 case X86::PSHUFHWmi:
457 case X86::VPSHUFHWmi:
458 DestName = getRegName(MI->getOperand(0).getReg());
NAKAMURA Takumi5582a6a2015-05-25 01:43:34 +0000459 if (MI->getOperand(MI->getNumOperands() - 1).isImm())
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000460 DecodePSHUFHWMask(MVT::v8i16,
NAKAMURA Takumi5582a6a2015-05-25 01:43:34 +0000461 MI->getOperand(MI->getNumOperands() - 1).getImm(),
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000462 ShuffleMask);
463 break;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000464
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000465 case X86::VPSHUFHWYri:
466 Src1Name = getRegName(MI->getOperand(1).getReg());
467 // FALL THROUGH.
468 case X86::VPSHUFHWYmi:
469 DestName = getRegName(MI->getOperand(0).getReg());
NAKAMURA Takumi5582a6a2015-05-25 01:43:34 +0000470 if (MI->getOperand(MI->getNumOperands() - 1).isImm())
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000471 DecodePSHUFHWMask(MVT::v16i16,
NAKAMURA Takumi5582a6a2015-05-25 01:43:34 +0000472 MI->getOperand(MI->getNumOperands() - 1).getImm(),
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000473 ShuffleMask);
474 break;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000475
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000476 case X86::PSHUFLWri:
477 case X86::VPSHUFLWri:
478 Src1Name = getRegName(MI->getOperand(1).getReg());
479 // FALL THROUGH.
480 case X86::PSHUFLWmi:
481 case X86::VPSHUFLWmi:
482 DestName = getRegName(MI->getOperand(0).getReg());
NAKAMURA Takumi5582a6a2015-05-25 01:43:34 +0000483 if (MI->getOperand(MI->getNumOperands() - 1).isImm())
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000484 DecodePSHUFLWMask(MVT::v8i16,
NAKAMURA Takumi5582a6a2015-05-25 01:43:34 +0000485 MI->getOperand(MI->getNumOperands() - 1).getImm(),
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000486 ShuffleMask);
487 break;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000488
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000489 case X86::VPSHUFLWYri:
490 Src1Name = getRegName(MI->getOperand(1).getReg());
491 // FALL THROUGH.
492 case X86::VPSHUFLWYmi:
493 DestName = getRegName(MI->getOperand(0).getReg());
NAKAMURA Takumi5582a6a2015-05-25 01:43:34 +0000494 if (MI->getOperand(MI->getNumOperands() - 1).isImm())
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000495 DecodePSHUFLWMask(MVT::v16i16,
NAKAMURA Takumi5582a6a2015-05-25 01:43:34 +0000496 MI->getOperand(MI->getNumOperands() - 1).getImm(),
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000497 ShuffleMask);
498 break;
499
Simon Pilgrimf8f86ab2015-09-13 11:28:45 +0000500 case X86::MMX_PSHUFWri:
501 Src1Name = getRegName(MI->getOperand(1).getReg());
502 // FALL THROUGH.
503 case X86::MMX_PSHUFWmi:
504 DestName = getRegName(MI->getOperand(0).getReg());
505 if (MI->getOperand(MI->getNumOperands() - 1).isImm())
506 DecodePSHUFMask(MVT::v4i16,
507 MI->getOperand(MI->getNumOperands() - 1).getImm(),
508 ShuffleMask);
509 break;
510
511 case X86::PSWAPDrr:
512 Src1Name = getRegName(MI->getOperand(1).getReg());
513 // FALL THROUGH.
514 case X86::PSWAPDrm:
515 DestName = getRegName(MI->getOperand(0).getReg());
516 DecodePSWAPMask(MVT::v2i32, ShuffleMask);
517 break;
518
519 case X86::MMX_PUNPCKHBWirr:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000520 case X86::PUNPCKHBWrr:
521 case X86::VPUNPCKHBWrr:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000522 case X86::VPUNPCKHBWYrr:
523 Src2Name = getRegName(MI->getOperand(2).getReg());
524 // FALL THROUGH.
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000525 case X86::MMX_PUNPCKHBWirm:
526 case X86::PUNPCKHBWrm:
527 case X86::VPUNPCKHBWrm:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000528 case X86::VPUNPCKHBWYrm:
529 Src1Name = getRegName(MI->getOperand(1).getReg());
530 DestName = getRegName(MI->getOperand(0).getReg());
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000531 DecodeUNPCKHMask(getRegOperandVectorVT(MI, MVT::i8, 0), ShuffleMask);
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000532 break;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000533
534 case X86::MMX_PUNPCKHWDirr:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000535 case X86::PUNPCKHWDrr:
536 case X86::VPUNPCKHWDrr:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000537 case X86::VPUNPCKHWDYrr:
538 Src2Name = getRegName(MI->getOperand(2).getReg());
539 // FALL THROUGH.
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000540 case X86::MMX_PUNPCKHWDirm:
541 case X86::PUNPCKHWDrm:
542 case X86::VPUNPCKHWDrm:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000543 case X86::VPUNPCKHWDYrm:
544 Src1Name = getRegName(MI->getOperand(1).getReg());
545 DestName = getRegName(MI->getOperand(0).getReg());
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000546 DecodeUNPCKHMask(getRegOperandVectorVT(MI, MVT::i16, 0), ShuffleMask);
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000547 break;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000548
549 case X86::MMX_PUNPCKHDQirr:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000550 case X86::PUNPCKHDQrr:
551 case X86::VPUNPCKHDQrr:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000552 case X86::VPUNPCKHDQYrr:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000553 case X86::VPUNPCKHDQZrr:
554 Src2Name = getRegName(MI->getOperand(2).getReg());
555 // FALL THROUGH.
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000556 case X86::MMX_PUNPCKHDQirm:
557 case X86::PUNPCKHDQrm:
558 case X86::VPUNPCKHDQrm:
559 case X86::VPUNPCKHDQYrm:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000560 case X86::VPUNPCKHDQZrm:
561 Src1Name = getRegName(MI->getOperand(1).getReg());
562 DestName = getRegName(MI->getOperand(0).getReg());
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000563 DecodeUNPCKHMask(getRegOperandVectorVT(MI, MVT::i32, 0), ShuffleMask);
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000564 break;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000565
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000566 case X86::PUNPCKHQDQrr:
567 case X86::VPUNPCKHQDQrr:
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000568 case X86::VPUNPCKHQDQYrr:
569 case X86::VPUNPCKHQDQZrr:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000570 Src2Name = getRegName(MI->getOperand(2).getReg());
571 // FALL THROUGH.
572 case X86::PUNPCKHQDQrm:
573 case X86::VPUNPCKHQDQrm:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000574 case X86::VPUNPCKHQDQYrm:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000575 case X86::VPUNPCKHQDQZrm:
576 Src1Name = getRegName(MI->getOperand(1).getReg());
577 DestName = getRegName(MI->getOperand(0).getReg());
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000578 DecodeUNPCKHMask(getRegOperandVectorVT(MI, MVT::i64, 0), ShuffleMask);
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000579 break;
580
Simon Pilgrimf8f86ab2015-09-13 11:28:45 +0000581 case X86::MMX_PUNPCKLBWirr:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000582 case X86::PUNPCKLBWrr:
583 case X86::VPUNPCKLBWrr:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000584 case X86::VPUNPCKLBWYrr:
585 Src2Name = getRegName(MI->getOperand(2).getReg());
586 // FALL THROUGH.
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000587 case X86::MMX_PUNPCKLBWirm:
588 case X86::PUNPCKLBWrm:
589 case X86::VPUNPCKLBWrm:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000590 case X86::VPUNPCKLBWYrm:
591 Src1Name = getRegName(MI->getOperand(1).getReg());
592 DestName = getRegName(MI->getOperand(0).getReg());
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000593 DecodeUNPCKLMask(getRegOperandVectorVT(MI, MVT::i8, 0), ShuffleMask);
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000594 break;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000595
596 case X86::MMX_PUNPCKLWDirr:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000597 case X86::PUNPCKLWDrr:
598 case X86::VPUNPCKLWDrr:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000599 case X86::VPUNPCKLWDYrr:
600 Src2Name = getRegName(MI->getOperand(2).getReg());
601 // FALL THROUGH.
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000602 case X86::MMX_PUNPCKLWDirm:
603 case X86::PUNPCKLWDrm:
604 case X86::VPUNPCKLWDrm:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000605 case X86::VPUNPCKLWDYrm:
606 Src1Name = getRegName(MI->getOperand(1).getReg());
607 DestName = getRegName(MI->getOperand(0).getReg());
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000608 DecodeUNPCKLMask(getRegOperandVectorVT(MI, MVT::i16, 0), ShuffleMask);
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000609 break;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000610
611 case X86::MMX_PUNPCKLDQirr:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000612 case X86::PUNPCKLDQrr:
613 case X86::VPUNPCKLDQrr:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000614 case X86::VPUNPCKLDQYrr:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000615 case X86::VPUNPCKLDQZrr:
616 Src2Name = getRegName(MI->getOperand(2).getReg());
617 // FALL THROUGH.
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000618 case X86::MMX_PUNPCKLDQirm:
619 case X86::PUNPCKLDQrm:
620 case X86::VPUNPCKLDQrm:
621 case X86::VPUNPCKLDQYrm:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000622 case X86::VPUNPCKLDQZrm:
623 Src1Name = getRegName(MI->getOperand(1).getReg());
624 DestName = getRegName(MI->getOperand(0).getReg());
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000625 DecodeUNPCKLMask(getRegOperandVectorVT(MI, MVT::i32, 0), ShuffleMask);
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000626 break;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000627
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000628 case X86::PUNPCKLQDQrr:
629 case X86::VPUNPCKLQDQrr:
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000630 case X86::VPUNPCKLQDQYrr:
631 case X86::VPUNPCKLQDQZrr:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000632 Src2Name = getRegName(MI->getOperand(2).getReg());
633 // FALL THROUGH.
634 case X86::PUNPCKLQDQrm:
635 case X86::VPUNPCKLQDQrm:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000636 case X86::VPUNPCKLQDQYrm:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000637 case X86::VPUNPCKLQDQZrm:
638 Src1Name = getRegName(MI->getOperand(1).getReg());
639 DestName = getRegName(MI->getOperand(0).getReg());
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000640 DecodeUNPCKLMask(getRegOperandVectorVT(MI, MVT::i64, 0), ShuffleMask);
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000641 break;
642
643 case X86::SHUFPDrri:
644 case X86::VSHUFPDrri:
645 Src2Name = getRegName(MI->getOperand(2).getReg());
646 // FALL THROUGH.
647 case X86::SHUFPDrmi:
648 case X86::VSHUFPDrmi:
NAKAMURA Takumi5582a6a2015-05-25 01:43:34 +0000649 if (MI->getOperand(MI->getNumOperands() - 1).isImm())
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000650 DecodeSHUFPMask(MVT::v2f64,
NAKAMURA Takumi5582a6a2015-05-25 01:43:34 +0000651 MI->getOperand(MI->getNumOperands() - 1).getImm(),
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000652 ShuffleMask);
653 Src1Name = getRegName(MI->getOperand(1).getReg());
654 DestName = getRegName(MI->getOperand(0).getReg());
655 break;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000656
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000657 case X86::VSHUFPDYrri:
658 Src2Name = getRegName(MI->getOperand(2).getReg());
659 // FALL THROUGH.
660 case X86::VSHUFPDYrmi:
NAKAMURA Takumi5582a6a2015-05-25 01:43:34 +0000661 if (MI->getOperand(MI->getNumOperands() - 1).isImm())
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000662 DecodeSHUFPMask(MVT::v4f64,
NAKAMURA Takumi5582a6a2015-05-25 01:43:34 +0000663 MI->getOperand(MI->getNumOperands() - 1).getImm(),
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000664 ShuffleMask);
665 Src1Name = getRegName(MI->getOperand(1).getReg());
666 DestName = getRegName(MI->getOperand(0).getReg());
667 break;
668
669 case X86::SHUFPSrri:
670 case X86::VSHUFPSrri:
671 Src2Name = getRegName(MI->getOperand(2).getReg());
672 // FALL THROUGH.
673 case X86::SHUFPSrmi:
674 case X86::VSHUFPSrmi:
NAKAMURA Takumi5582a6a2015-05-25 01:43:34 +0000675 if (MI->getOperand(MI->getNumOperands() - 1).isImm())
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000676 DecodeSHUFPMask(MVT::v4f32,
NAKAMURA Takumi5582a6a2015-05-25 01:43:34 +0000677 MI->getOperand(MI->getNumOperands() - 1).getImm(),
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000678 ShuffleMask);
679 Src1Name = getRegName(MI->getOperand(1).getReg());
680 DestName = getRegName(MI->getOperand(0).getReg());
681 break;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000682
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000683 case X86::VSHUFPSYrri:
684 Src2Name = getRegName(MI->getOperand(2).getReg());
685 // FALL THROUGH.
686 case X86::VSHUFPSYrmi:
NAKAMURA Takumi5582a6a2015-05-25 01:43:34 +0000687 if (MI->getOperand(MI->getNumOperands() - 1).isImm())
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000688 DecodeSHUFPMask(MVT::v8f32,
NAKAMURA Takumi5582a6a2015-05-25 01:43:34 +0000689 MI->getOperand(MI->getNumOperands() - 1).getImm(),
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000690 ShuffleMask);
691 Src1Name = getRegName(MI->getOperand(1).getReg());
692 DestName = getRegName(MI->getOperand(0).getReg());
693 break;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000694
Igor Breger24cab0f2015-11-16 07:22:00 +0000695 CASE_VSHUF(64X2, r)
696 CASE_VSHUF(64X2, m)
697 CASE_VSHUF(32X4, r)
698 CASE_VSHUF(32X4, m) {
Igor Bregerd7bae452015-10-15 13:29:07 +0000699 MVT VT;
700 bool HasMemOp;
701 unsigned NumOp = MI->getNumOperands();
702 getVSHUF64x2FamilyInfo(MI, VT, HasMemOp);
703 decodeVSHUF64x2FamilyMask(VT, MI->getOperand(NumOp - 1).getImm(),
704 ShuffleMask);
705 DestName = getRegName(MI->getOperand(0).getReg());
706 if (HasMemOp) {
707 assert((NumOp >= 8) && "Expected at least 8 operands!");
708 Src1Name = getRegName(MI->getOperand(NumOp - 7).getReg());
709 } else {
710 assert((NumOp >= 4) && "Expected at least 4 operands!");
711 Src2Name = getRegName(MI->getOperand(NumOp - 2).getReg());
712 Src1Name = getRegName(MI->getOperand(NumOp - 3).getReg());
713 }
714 break;
715 }
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000716
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000717 case X86::UNPCKLPDrr:
718 case X86::VUNPCKLPDrr:
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000719 case X86::VUNPCKLPDYrr:
720 case X86::VUNPCKLPDZrr:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000721 Src2Name = getRegName(MI->getOperand(2).getReg());
722 // FALL THROUGH.
723 case X86::UNPCKLPDrm:
724 case X86::VUNPCKLPDrm:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000725 case X86::VUNPCKLPDYrm:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000726 case X86::VUNPCKLPDZrm:
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000727 DecodeUNPCKLMask(getRegOperandVectorVT(MI, MVT::f64, 0), ShuffleMask);
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000728 Src1Name = getRegName(MI->getOperand(1).getReg());
729 DestName = getRegName(MI->getOperand(0).getReg());
730 break;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000731
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000732 case X86::UNPCKLPSrr:
733 case X86::VUNPCKLPSrr:
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000734 case X86::VUNPCKLPSYrr:
735 case X86::VUNPCKLPSZrr:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000736 Src2Name = getRegName(MI->getOperand(2).getReg());
737 // FALL THROUGH.
738 case X86::UNPCKLPSrm:
739 case X86::VUNPCKLPSrm:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000740 case X86::VUNPCKLPSYrm:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000741 case X86::VUNPCKLPSZrm:
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000742 DecodeUNPCKLMask(getRegOperandVectorVT(MI, MVT::f32, 0), ShuffleMask);
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000743 Src1Name = getRegName(MI->getOperand(1).getReg());
744 DestName = getRegName(MI->getOperand(0).getReg());
745 break;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000746
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000747 case X86::UNPCKHPDrr:
748 case X86::VUNPCKHPDrr:
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000749 case X86::VUNPCKHPDYrr:
750 case X86::VUNPCKHPDZrr:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000751 Src2Name = getRegName(MI->getOperand(2).getReg());
752 // FALL THROUGH.
753 case X86::UNPCKHPDrm:
754 case X86::VUNPCKHPDrm:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000755 case X86::VUNPCKHPDYrm:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000756 case X86::VUNPCKHPDZrm:
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000757 DecodeUNPCKHMask(getRegOperandVectorVT(MI, MVT::f64, 0), ShuffleMask);
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000758 Src1Name = getRegName(MI->getOperand(1).getReg());
759 DestName = getRegName(MI->getOperand(0).getReg());
760 break;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000761
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000762 case X86::UNPCKHPSrr:
763 case X86::VUNPCKHPSrr:
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000764 case X86::VUNPCKHPSYrr:
765 case X86::VUNPCKHPSZrr:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000766 Src2Name = getRegName(MI->getOperand(2).getReg());
767 // FALL THROUGH.
768 case X86::UNPCKHPSrm:
769 case X86::VUNPCKHPSrm:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000770 case X86::VUNPCKHPSYrm:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000771 case X86::VUNPCKHPSZrm:
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000772 DecodeUNPCKHMask(getRegOperandVectorVT(MI, MVT::f32, 0), ShuffleMask);
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000773 Src1Name = getRegName(MI->getOperand(1).getReg());
774 DestName = getRegName(MI->getOperand(0).getReg());
775 break;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000776
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000777 case X86::VPERMILPSri:
778 Src1Name = getRegName(MI->getOperand(1).getReg());
779 // FALL THROUGH.
780 case X86::VPERMILPSmi:
NAKAMURA Takumi5582a6a2015-05-25 01:43:34 +0000781 if (MI->getOperand(MI->getNumOperands() - 1).isImm())
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000782 DecodePSHUFMask(MVT::v4f32,
NAKAMURA Takumi5582a6a2015-05-25 01:43:34 +0000783 MI->getOperand(MI->getNumOperands() - 1).getImm(),
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000784 ShuffleMask);
785 DestName = getRegName(MI->getOperand(0).getReg());
786 break;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000787
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000788 case X86::VPERMILPSYri:
789 Src1Name = getRegName(MI->getOperand(1).getReg());
790 // FALL THROUGH.
791 case X86::VPERMILPSYmi:
NAKAMURA Takumi5582a6a2015-05-25 01:43:34 +0000792 if (MI->getOperand(MI->getNumOperands() - 1).isImm())
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000793 DecodePSHUFMask(MVT::v8f32,
NAKAMURA Takumi5582a6a2015-05-25 01:43:34 +0000794 MI->getOperand(MI->getNumOperands() - 1).getImm(),
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000795 ShuffleMask);
796 DestName = getRegName(MI->getOperand(0).getReg());
797 break;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000798
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000799 case X86::VPERMILPDri:
800 Src1Name = getRegName(MI->getOperand(1).getReg());
801 // FALL THROUGH.
802 case X86::VPERMILPDmi:
NAKAMURA Takumi5582a6a2015-05-25 01:43:34 +0000803 if (MI->getOperand(MI->getNumOperands() - 1).isImm())
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000804 DecodePSHUFMask(MVT::v2f64,
NAKAMURA Takumi5582a6a2015-05-25 01:43:34 +0000805 MI->getOperand(MI->getNumOperands() - 1).getImm(),
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000806 ShuffleMask);
807 DestName = getRegName(MI->getOperand(0).getReg());
808 break;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000809
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000810 case X86::VPERMILPDYri:
811 Src1Name = getRegName(MI->getOperand(1).getReg());
812 // FALL THROUGH.
813 case X86::VPERMILPDYmi:
NAKAMURA Takumi5582a6a2015-05-25 01:43:34 +0000814 if (MI->getOperand(MI->getNumOperands() - 1).isImm())
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000815 DecodePSHUFMask(MVT::v4f64,
NAKAMURA Takumi5582a6a2015-05-25 01:43:34 +0000816 MI->getOperand(MI->getNumOperands() - 1).getImm(),
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000817 ShuffleMask);
818 DestName = getRegName(MI->getOperand(0).getReg());
819 break;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000820
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000821 case X86::VPERM2F128rr:
822 case X86::VPERM2I128rr:
823 Src2Name = getRegName(MI->getOperand(2).getReg());
824 // FALL THROUGH.
825 case X86::VPERM2F128rm:
826 case X86::VPERM2I128rm:
827 // For instruction comments purpose, assume the 256-bit vector is v4i64.
NAKAMURA Takumi5582a6a2015-05-25 01:43:34 +0000828 if (MI->getOperand(MI->getNumOperands() - 1).isImm())
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000829 DecodeVPERM2X128Mask(MVT::v4i64,
NAKAMURA Takumi5582a6a2015-05-25 01:43:34 +0000830 MI->getOperand(MI->getNumOperands() - 1).getImm(),
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000831 ShuffleMask);
832 Src1Name = getRegName(MI->getOperand(1).getReg());
833 DestName = getRegName(MI->getOperand(0).getReg());
834 break;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000835
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000836 case X86::VPERMQYri:
837 case X86::VPERMPDYri:
838 Src1Name = getRegName(MI->getOperand(1).getReg());
839 // FALL THROUGH.
840 case X86::VPERMQYmi:
841 case X86::VPERMPDYmi:
NAKAMURA Takumi5582a6a2015-05-25 01:43:34 +0000842 if (MI->getOperand(MI->getNumOperands() - 1).isImm())
843 DecodeVPERMMask(MI->getOperand(MI->getNumOperands() - 1).getImm(),
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000844 ShuffleMask);
845 DestName = getRegName(MI->getOperand(0).getReg());
846 break;
847
848 case X86::MOVSDrr:
849 case X86::VMOVSDrr:
850 Src2Name = getRegName(MI->getOperand(2).getReg());
851 Src1Name = getRegName(MI->getOperand(1).getReg());
852 // FALL THROUGH.
853 case X86::MOVSDrm:
854 case X86::VMOVSDrm:
855 DecodeScalarMoveMask(MVT::v2f64, nullptr == Src2Name, ShuffleMask);
856 DestName = getRegName(MI->getOperand(0).getReg());
857 break;
858 case X86::MOVSSrr:
859 case X86::VMOVSSrr:
860 Src2Name = getRegName(MI->getOperand(2).getReg());
861 Src1Name = getRegName(MI->getOperand(1).getReg());
862 // FALL THROUGH.
863 case X86::MOVSSrm:
864 case X86::VMOVSSrm:
865 DecodeScalarMoveMask(MVT::v4f32, nullptr == Src2Name, ShuffleMask);
866 DestName = getRegName(MI->getOperand(0).getReg());
867 break;
868
869 case X86::MOVPQI2QIrr:
870 case X86::MOVZPQILo2PQIrr:
871 case X86::VMOVPQI2QIrr:
872 case X86::VMOVZPQILo2PQIrr:
873 Src1Name = getRegName(MI->getOperand(1).getReg());
874 // FALL THROUGH.
875 case X86::MOVQI2PQIrm:
876 case X86::MOVZQI2PQIrm:
877 case X86::MOVZPQILo2PQIrm:
878 case X86::VMOVQI2PQIrm:
879 case X86::VMOVZQI2PQIrm:
880 case X86::VMOVZPQILo2PQIrm:
881 DecodeZeroMoveLowMask(MVT::v2i64, ShuffleMask);
882 DestName = getRegName(MI->getOperand(0).getReg());
883 break;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000884
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000885 case X86::MOVDI2PDIrm:
886 case X86::VMOVDI2PDIrm:
887 DecodeZeroMoveLowMask(MVT::v4i32, ShuffleMask);
888 DestName = getRegName(MI->getOperand(0).getReg());
889 break;
890
Simon Pilgrimd85cae32015-07-06 20:46:41 +0000891 case X86::EXTRQI:
892 if (MI->getOperand(2).isImm() &&
893 MI->getOperand(3).isImm())
894 DecodeEXTRQIMask(MI->getOperand(2).getImm(),
895 MI->getOperand(3).getImm(),
896 ShuffleMask);
897
898 DestName = getRegName(MI->getOperand(0).getReg());
899 Src1Name = getRegName(MI->getOperand(1).getReg());
900 break;
901
902 case X86::INSERTQI:
903 if (MI->getOperand(3).isImm() &&
904 MI->getOperand(4).isImm())
905 DecodeINSERTQIMask(MI->getOperand(3).getImm(),
906 MI->getOperand(4).getImm(),
907 ShuffleMask);
908
909 DestName = getRegName(MI->getOperand(0).getReg());
910 Src1Name = getRegName(MI->getOperand(1).getReg());
911 Src2Name = getRegName(MI->getOperand(2).getReg());
912 break;
913
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000914 case X86::PMOVZXBWrr:
915 case X86::PMOVZXBDrr:
916 case X86::PMOVZXBQrr:
917 case X86::PMOVZXWDrr:
918 case X86::PMOVZXWQrr:
919 case X86::PMOVZXDQrr:
920 case X86::VPMOVZXBWrr:
921 case X86::VPMOVZXBDrr:
922 case X86::VPMOVZXBQrr:
923 case X86::VPMOVZXWDrr:
924 case X86::VPMOVZXWQrr:
925 case X86::VPMOVZXDQrr:
926 case X86::VPMOVZXBWYrr:
927 case X86::VPMOVZXBDYrr:
928 case X86::VPMOVZXBQYrr:
929 case X86::VPMOVZXWDYrr:
930 case X86::VPMOVZXWQYrr:
931 case X86::VPMOVZXDQYrr:
932 Src1Name = getRegName(MI->getOperand(1).getReg());
933 // FALL THROUGH.
934 case X86::PMOVZXBWrm:
935 case X86::PMOVZXBDrm:
936 case X86::PMOVZXBQrm:
937 case X86::PMOVZXWDrm:
938 case X86::PMOVZXWQrm:
939 case X86::PMOVZXDQrm:
940 case X86::VPMOVZXBWrm:
941 case X86::VPMOVZXBDrm:
942 case X86::VPMOVZXBQrm:
943 case X86::VPMOVZXWDrm:
944 case X86::VPMOVZXWQrm:
945 case X86::VPMOVZXDQrm:
946 case X86::VPMOVZXBWYrm:
947 case X86::VPMOVZXBDYrm:
948 case X86::VPMOVZXBQYrm:
949 case X86::VPMOVZXWDYrm:
950 case X86::VPMOVZXWQYrm:
951 case X86::VPMOVZXDQYrm: {
952 MVT SrcVT, DstVT;
953 getZeroExtensionTypes(MI, SrcVT, DstVT);
954 DecodeZeroExtendMask(SrcVT, DstVT, ShuffleMask);
955 DestName = getRegName(MI->getOperand(0).getReg());
956 } break;
957 }
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;
965 OS << (DestName ? DestName : "mem") << " = ";
966
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}