blob: f670e3ec43ad9cec65a7906544ebe6f8c764a3f2 [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:
Simon Pilgrim13d3a202015-11-16 23:03:18 +0000197 case X86::VBLENDPDYrri:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000198 Src2Name = getRegName(MI->getOperand(2).getReg());
199 // FALL THROUGH.
200 case X86::BLENDPDrmi:
201 case X86::VBLENDPDrmi:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000202 case X86::VBLENDPDYrmi:
NAKAMURA Takumi5582a6a2015-05-25 01:43:34 +0000203 if (MI->getOperand(MI->getNumOperands() - 1).isImm())
Simon Pilgrim13d3a202015-11-16 23:03:18 +0000204 DecodeBLENDMask(getRegOperandVectorVT(MI, MVT::f64, 0),
NAKAMURA Takumi5582a6a2015-05-25 01:43:34 +0000205 MI->getOperand(MI->getNumOperands() - 1).getImm(),
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000206 ShuffleMask);
207 Src1Name = getRegName(MI->getOperand(1).getReg());
208 DestName = getRegName(MI->getOperand(0).getReg());
209 break;
210
211 case X86::BLENDPSrri:
212 case X86::VBLENDPSrri:
Simon Pilgrim13d3a202015-11-16 23:03:18 +0000213 case X86::VBLENDPSYrri:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000214 Src2Name = getRegName(MI->getOperand(2).getReg());
215 // FALL THROUGH.
216 case X86::BLENDPSrmi:
217 case X86::VBLENDPSrmi:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000218 case X86::VBLENDPSYrmi:
NAKAMURA Takumi5582a6a2015-05-25 01:43:34 +0000219 if (MI->getOperand(MI->getNumOperands() - 1).isImm())
Simon Pilgrim13d3a202015-11-16 23:03:18 +0000220 DecodeBLENDMask(getRegOperandVectorVT(MI, MVT::f32, 0),
NAKAMURA Takumi5582a6a2015-05-25 01:43:34 +0000221 MI->getOperand(MI->getNumOperands() - 1).getImm(),
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000222 ShuffleMask);
223 Src1Name = getRegName(MI->getOperand(1).getReg());
224 DestName = getRegName(MI->getOperand(0).getReg());
225 break;
226
227 case X86::PBLENDWrri:
228 case X86::VPBLENDWrri:
Simon Pilgrim13d3a202015-11-16 23:03:18 +0000229 case X86::VPBLENDWYrri:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000230 Src2Name = getRegName(MI->getOperand(2).getReg());
231 // FALL THROUGH.
232 case X86::PBLENDWrmi:
233 case X86::VPBLENDWrmi:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000234 case X86::VPBLENDWYrmi:
NAKAMURA Takumi5582a6a2015-05-25 01:43:34 +0000235 if (MI->getOperand(MI->getNumOperands() - 1).isImm())
Simon Pilgrim13d3a202015-11-16 23:03:18 +0000236 DecodeBLENDMask(getRegOperandVectorVT(MI, MVT::i16, 0),
NAKAMURA Takumi5582a6a2015-05-25 01:43:34 +0000237 MI->getOperand(MI->getNumOperands() - 1).getImm(),
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000238 ShuffleMask);
239 Src1Name = getRegName(MI->getOperand(1).getReg());
240 DestName = getRegName(MI->getOperand(0).getReg());
241 break;
242
243 case X86::VPBLENDDrri:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000244 case X86::VPBLENDDYrri:
245 Src2Name = getRegName(MI->getOperand(2).getReg());
246 // FALL THROUGH.
Simon Pilgrim13d3a202015-11-16 23:03:18 +0000247 case X86::VPBLENDDrmi:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000248 case X86::VPBLENDDYrmi:
NAKAMURA Takumi5582a6a2015-05-25 01:43:34 +0000249 if (MI->getOperand(MI->getNumOperands() - 1).isImm())
Simon Pilgrim13d3a202015-11-16 23:03:18 +0000250 DecodeBLENDMask(getRegOperandVectorVT(MI, MVT::i32, 0),
NAKAMURA Takumi5582a6a2015-05-25 01:43:34 +0000251 MI->getOperand(MI->getNumOperands() - 1).getImm(),
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000252 ShuffleMask);
253 Src1Name = getRegName(MI->getOperand(1).getReg());
254 DestName = getRegName(MI->getOperand(0).getReg());
255 break;
256
257 case X86::INSERTPSrr:
258 case X86::VINSERTPSrr:
259 Src2Name = getRegName(MI->getOperand(2).getReg());
260 // FALL THROUGH.
261 case X86::INSERTPSrm:
262 case X86::VINSERTPSrm:
263 DestName = getRegName(MI->getOperand(0).getReg());
264 Src1Name = getRegName(MI->getOperand(1).getReg());
NAKAMURA Takumi5582a6a2015-05-25 01:43:34 +0000265 if (MI->getOperand(MI->getNumOperands() - 1).isImm())
266 DecodeINSERTPSMask(MI->getOperand(MI->getNumOperands() - 1).getImm(),
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000267 ShuffleMask);
268 break;
269
270 case X86::MOVLHPSrr:
271 case X86::VMOVLHPSrr:
272 Src2Name = getRegName(MI->getOperand(2).getReg());
273 Src1Name = getRegName(MI->getOperand(1).getReg());
274 DestName = getRegName(MI->getOperand(0).getReg());
275 DecodeMOVLHPSMask(2, ShuffleMask);
276 break;
277
278 case X86::MOVHLPSrr:
279 case X86::VMOVHLPSrr:
280 Src2Name = getRegName(MI->getOperand(2).getReg());
281 Src1Name = getRegName(MI->getOperand(1).getReg());
282 DestName = getRegName(MI->getOperand(0).getReg());
283 DecodeMOVHLPSMask(2, ShuffleMask);
284 break;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000285
Igor Breger24cab0f2015-11-16 07:22:00 +0000286 CASE_MOVDUP(MOVSLDUP, r)
287 Src1Name = getRegName(MI->getOperand(MI->getNumOperands() - 1).getReg());
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000288 // FALL THROUGH.
Igor Breger24cab0f2015-11-16 07:22:00 +0000289 CASE_MOVDUP(MOVSLDUP, m) {
290 MVT VT = getRegOperandVectorVT(MI, MVT::f32, 0);
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000291 DestName = getRegName(MI->getOperand(0).getReg());
Igor Breger24cab0f2015-11-16 07:22:00 +0000292 DecodeMOVSLDUPMask(VT, ShuffleMask);
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000293 break;
Igor Breger24cab0f2015-11-16 07:22:00 +0000294 }
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000295
Igor Breger24cab0f2015-11-16 07:22:00 +0000296 CASE_MOVDUP(MOVSHDUP, r)
297 Src1Name = getRegName(MI->getOperand(MI->getNumOperands() - 1).getReg());
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000298 // FALL THROUGH.
Igor Breger24cab0f2015-11-16 07:22:00 +0000299 CASE_MOVDUP(MOVSHDUP, m) {
300 MVT VT = getRegOperandVectorVT(MI, MVT::f32, 0);
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000301 DestName = getRegName(MI->getOperand(0).getReg());
Igor Breger24cab0f2015-11-16 07:22:00 +0000302 DecodeMOVSHDUPMask(VT, ShuffleMask);
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000303 break;
Igor Breger24cab0f2015-11-16 07:22:00 +0000304 }
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000305
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000306 case X86::VMOVDDUPYrr:
307 Src1Name = getRegName(MI->getOperand(1).getReg());
308 // FALL THROUGH.
309 case X86::VMOVDDUPYrm:
310 DestName = getRegName(MI->getOperand(0).getReg());
311 DecodeMOVDDUPMask(MVT::v4f64, ShuffleMask);
312 break;
313
314 case X86::MOVDDUPrr:
315 case X86::VMOVDDUPrr:
316 Src1Name = getRegName(MI->getOperand(1).getReg());
317 // FALL THROUGH.
318 case X86::MOVDDUPrm:
319 case X86::VMOVDDUPrm:
320 DestName = getRegName(MI->getOperand(0).getReg());
321 DecodeMOVDDUPMask(MVT::v2f64, ShuffleMask);
322 break;
323
324 case X86::PSLLDQri:
325 case X86::VPSLLDQri:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000326 case X86::VPSLLDQYri:
327 Src1Name = getRegName(MI->getOperand(1).getReg());
328 DestName = getRegName(MI->getOperand(0).getReg());
NAKAMURA Takumi5582a6a2015-05-25 01:43:34 +0000329 if (MI->getOperand(MI->getNumOperands() - 1).isImm())
Simon Pilgrimb9ada272015-11-16 22:54:41 +0000330 DecodePSLLDQMask(getRegOperandVectorVT(MI, MVT::i8, 0),
NAKAMURA Takumi5582a6a2015-05-25 01:43:34 +0000331 MI->getOperand(MI->getNumOperands() - 1).getImm(),
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000332 ShuffleMask);
333 break;
334
335 case X86::PSRLDQri:
336 case X86::VPSRLDQri:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000337 case X86::VPSRLDQYri:
338 Src1Name = getRegName(MI->getOperand(1).getReg());
339 DestName = getRegName(MI->getOperand(0).getReg());
NAKAMURA Takumi5582a6a2015-05-25 01:43:34 +0000340 if (MI->getOperand(MI->getNumOperands() - 1).isImm())
Simon Pilgrimb9ada272015-11-16 22:54:41 +0000341 DecodePSRLDQMask(getRegOperandVectorVT(MI, MVT::i8, 0),
NAKAMURA Takumi5582a6a2015-05-25 01:43:34 +0000342 MI->getOperand(MI->getNumOperands() - 1).getImm(),
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000343 ShuffleMask);
344 break;
345
346 case X86::PALIGNR128rr:
347 case X86::VPALIGNR128rr:
Simon Pilgrimb9ada272015-11-16 22:54:41 +0000348 case X86::VPALIGNR256rr:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000349 Src1Name = getRegName(MI->getOperand(2).getReg());
350 // FALL THROUGH.
351 case X86::PALIGNR128rm:
352 case X86::VPALIGNR128rm:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000353 case X86::VPALIGNR256rm:
354 Src2Name = getRegName(MI->getOperand(1).getReg());
355 DestName = getRegName(MI->getOperand(0).getReg());
NAKAMURA Takumi5582a6a2015-05-25 01:43:34 +0000356 if (MI->getOperand(MI->getNumOperands() - 1).isImm())
Simon Pilgrimb9ada272015-11-16 22:54:41 +0000357 DecodePALIGNRMask(getRegOperandVectorVT(MI, MVT::i8, 0),
NAKAMURA Takumi5582a6a2015-05-25 01:43:34 +0000358 MI->getOperand(MI->getNumOperands() - 1).getImm(),
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000359 ShuffleMask);
360 break;
361
362 case X86::PSHUFDri:
363 case X86::VPSHUFDri:
Simon Pilgrim5883a732015-11-16 22:39:27 +0000364 case X86::VPSHUFDYri:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000365 Src1Name = getRegName(MI->getOperand(1).getReg());
366 // FALL THROUGH.
367 case X86::PSHUFDmi:
368 case X86::VPSHUFDmi:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000369 case X86::VPSHUFDYmi:
370 DestName = getRegName(MI->getOperand(0).getReg());
NAKAMURA Takumi5582a6a2015-05-25 01:43:34 +0000371 if (MI->getOperand(MI->getNumOperands() - 1).isImm())
Simon Pilgrim5883a732015-11-16 22:39:27 +0000372 DecodePSHUFMask(getRegOperandVectorVT(MI, MVT::i32, 0),
NAKAMURA Takumi5582a6a2015-05-25 01:43:34 +0000373 MI->getOperand(MI->getNumOperands() - 1).getImm(),
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000374 ShuffleMask);
375 break;
376
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000377 case X86::PSHUFHWri:
378 case X86::VPSHUFHWri:
Simon Pilgrim5883a732015-11-16 22:39:27 +0000379 case X86::VPSHUFHWYri:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000380 Src1Name = getRegName(MI->getOperand(1).getReg());
381 // FALL THROUGH.
382 case X86::PSHUFHWmi:
383 case X86::VPSHUFHWmi:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000384 case X86::VPSHUFHWYmi:
385 DestName = getRegName(MI->getOperand(0).getReg());
NAKAMURA Takumi5582a6a2015-05-25 01:43:34 +0000386 if (MI->getOperand(MI->getNumOperands() - 1).isImm())
Simon Pilgrim5883a732015-11-16 22:39:27 +0000387 DecodePSHUFHWMask(getRegOperandVectorVT(MI, MVT::i16, 0),
NAKAMURA Takumi5582a6a2015-05-25 01:43:34 +0000388 MI->getOperand(MI->getNumOperands() - 1).getImm(),
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000389 ShuffleMask);
390 break;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000391
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000392 case X86::PSHUFLWri:
393 case X86::VPSHUFLWri:
Simon Pilgrim5883a732015-11-16 22:39:27 +0000394 case X86::VPSHUFLWYri:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000395 Src1Name = getRegName(MI->getOperand(1).getReg());
396 // FALL THROUGH.
397 case X86::PSHUFLWmi:
398 case X86::VPSHUFLWmi:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000399 case X86::VPSHUFLWYmi:
400 DestName = getRegName(MI->getOperand(0).getReg());
NAKAMURA Takumi5582a6a2015-05-25 01:43:34 +0000401 if (MI->getOperand(MI->getNumOperands() - 1).isImm())
Simon Pilgrim5883a732015-11-16 22:39:27 +0000402 DecodePSHUFLWMask(getRegOperandVectorVT(MI, MVT::i16, 0),
NAKAMURA Takumi5582a6a2015-05-25 01:43:34 +0000403 MI->getOperand(MI->getNumOperands() - 1).getImm(),
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000404 ShuffleMask);
405 break;
406
Simon Pilgrimf8f86ab2015-09-13 11:28:45 +0000407 case X86::MMX_PSHUFWri:
408 Src1Name = getRegName(MI->getOperand(1).getReg());
409 // FALL THROUGH.
410 case X86::MMX_PSHUFWmi:
411 DestName = getRegName(MI->getOperand(0).getReg());
412 if (MI->getOperand(MI->getNumOperands() - 1).isImm())
413 DecodePSHUFMask(MVT::v4i16,
414 MI->getOperand(MI->getNumOperands() - 1).getImm(),
415 ShuffleMask);
416 break;
417
418 case X86::PSWAPDrr:
419 Src1Name = getRegName(MI->getOperand(1).getReg());
420 // FALL THROUGH.
421 case X86::PSWAPDrm:
422 DestName = getRegName(MI->getOperand(0).getReg());
423 DecodePSWAPMask(MVT::v2i32, ShuffleMask);
424 break;
425
426 case X86::MMX_PUNPCKHBWirr:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000427 case X86::PUNPCKHBWrr:
428 case X86::VPUNPCKHBWrr:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000429 case X86::VPUNPCKHBWYrr:
430 Src2Name = getRegName(MI->getOperand(2).getReg());
431 // FALL THROUGH.
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000432 case X86::MMX_PUNPCKHBWirm:
433 case X86::PUNPCKHBWrm:
434 case X86::VPUNPCKHBWrm:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000435 case X86::VPUNPCKHBWYrm:
436 Src1Name = getRegName(MI->getOperand(1).getReg());
437 DestName = getRegName(MI->getOperand(0).getReg());
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000438 DecodeUNPCKHMask(getRegOperandVectorVT(MI, MVT::i8, 0), ShuffleMask);
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000439 break;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000440
441 case X86::MMX_PUNPCKHWDirr:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000442 case X86::PUNPCKHWDrr:
443 case X86::VPUNPCKHWDrr:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000444 case X86::VPUNPCKHWDYrr:
445 Src2Name = getRegName(MI->getOperand(2).getReg());
446 // FALL THROUGH.
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000447 case X86::MMX_PUNPCKHWDirm:
448 case X86::PUNPCKHWDrm:
449 case X86::VPUNPCKHWDrm:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000450 case X86::VPUNPCKHWDYrm:
451 Src1Name = getRegName(MI->getOperand(1).getReg());
452 DestName = getRegName(MI->getOperand(0).getReg());
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000453 DecodeUNPCKHMask(getRegOperandVectorVT(MI, MVT::i16, 0), ShuffleMask);
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000454 break;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000455
456 case X86::MMX_PUNPCKHDQirr:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000457 case X86::PUNPCKHDQrr:
458 case X86::VPUNPCKHDQrr:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000459 case X86::VPUNPCKHDQYrr:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000460 case X86::VPUNPCKHDQZrr:
461 Src2Name = getRegName(MI->getOperand(2).getReg());
462 // FALL THROUGH.
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000463 case X86::MMX_PUNPCKHDQirm:
464 case X86::PUNPCKHDQrm:
465 case X86::VPUNPCKHDQrm:
466 case X86::VPUNPCKHDQYrm:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000467 case X86::VPUNPCKHDQZrm:
468 Src1Name = getRegName(MI->getOperand(1).getReg());
469 DestName = getRegName(MI->getOperand(0).getReg());
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000470 DecodeUNPCKHMask(getRegOperandVectorVT(MI, MVT::i32, 0), ShuffleMask);
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000471 break;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000472
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000473 case X86::PUNPCKHQDQrr:
474 case X86::VPUNPCKHQDQrr:
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000475 case X86::VPUNPCKHQDQYrr:
476 case X86::VPUNPCKHQDQZrr:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000477 Src2Name = getRegName(MI->getOperand(2).getReg());
478 // FALL THROUGH.
479 case X86::PUNPCKHQDQrm:
480 case X86::VPUNPCKHQDQrm:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000481 case X86::VPUNPCKHQDQYrm:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000482 case X86::VPUNPCKHQDQZrm:
483 Src1Name = getRegName(MI->getOperand(1).getReg());
484 DestName = getRegName(MI->getOperand(0).getReg());
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000485 DecodeUNPCKHMask(getRegOperandVectorVT(MI, MVT::i64, 0), ShuffleMask);
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000486 break;
487
Simon Pilgrimf8f86ab2015-09-13 11:28:45 +0000488 case X86::MMX_PUNPCKLBWirr:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000489 case X86::PUNPCKLBWrr:
490 case X86::VPUNPCKLBWrr:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000491 case X86::VPUNPCKLBWYrr:
492 Src2Name = getRegName(MI->getOperand(2).getReg());
493 // FALL THROUGH.
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000494 case X86::MMX_PUNPCKLBWirm:
495 case X86::PUNPCKLBWrm:
496 case X86::VPUNPCKLBWrm:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000497 case X86::VPUNPCKLBWYrm:
498 Src1Name = getRegName(MI->getOperand(1).getReg());
499 DestName = getRegName(MI->getOperand(0).getReg());
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000500 DecodeUNPCKLMask(getRegOperandVectorVT(MI, MVT::i8, 0), ShuffleMask);
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000501 break;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000502
503 case X86::MMX_PUNPCKLWDirr:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000504 case X86::PUNPCKLWDrr:
505 case X86::VPUNPCKLWDrr:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000506 case X86::VPUNPCKLWDYrr:
507 Src2Name = getRegName(MI->getOperand(2).getReg());
508 // FALL THROUGH.
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000509 case X86::MMX_PUNPCKLWDirm:
510 case X86::PUNPCKLWDrm:
511 case X86::VPUNPCKLWDrm:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000512 case X86::VPUNPCKLWDYrm:
513 Src1Name = getRegName(MI->getOperand(1).getReg());
514 DestName = getRegName(MI->getOperand(0).getReg());
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000515 DecodeUNPCKLMask(getRegOperandVectorVT(MI, MVT::i16, 0), ShuffleMask);
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000516 break;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000517
518 case X86::MMX_PUNPCKLDQirr:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000519 case X86::PUNPCKLDQrr:
520 case X86::VPUNPCKLDQrr:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000521 case X86::VPUNPCKLDQYrr:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000522 case X86::VPUNPCKLDQZrr:
523 Src2Name = getRegName(MI->getOperand(2).getReg());
524 // FALL THROUGH.
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000525 case X86::MMX_PUNPCKLDQirm:
526 case X86::PUNPCKLDQrm:
527 case X86::VPUNPCKLDQrm:
528 case X86::VPUNPCKLDQYrm:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000529 case X86::VPUNPCKLDQZrm:
530 Src1Name = getRegName(MI->getOperand(1).getReg());
531 DestName = getRegName(MI->getOperand(0).getReg());
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000532 DecodeUNPCKLMask(getRegOperandVectorVT(MI, MVT::i32, 0), ShuffleMask);
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000533 break;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000534
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000535 case X86::PUNPCKLQDQrr:
536 case X86::VPUNPCKLQDQrr:
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000537 case X86::VPUNPCKLQDQYrr:
538 case X86::VPUNPCKLQDQZrr:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000539 Src2Name = getRegName(MI->getOperand(2).getReg());
540 // FALL THROUGH.
541 case X86::PUNPCKLQDQrm:
542 case X86::VPUNPCKLQDQrm:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000543 case X86::VPUNPCKLQDQYrm:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000544 case X86::VPUNPCKLQDQZrm:
545 Src1Name = getRegName(MI->getOperand(1).getReg());
546 DestName = getRegName(MI->getOperand(0).getReg());
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000547 DecodeUNPCKLMask(getRegOperandVectorVT(MI, MVT::i64, 0), ShuffleMask);
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000548 break;
549
550 case X86::SHUFPDrri:
551 case X86::VSHUFPDrri:
Simon Pilgrim5883a732015-11-16 22:39:27 +0000552 case X86::VSHUFPDYrri:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000553 Src2Name = getRegName(MI->getOperand(2).getReg());
554 // FALL THROUGH.
555 case X86::SHUFPDrmi:
556 case X86::VSHUFPDrmi:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000557 case X86::VSHUFPDYrmi:
NAKAMURA Takumi5582a6a2015-05-25 01:43:34 +0000558 if (MI->getOperand(MI->getNumOperands() - 1).isImm())
Simon Pilgrim5883a732015-11-16 22:39:27 +0000559 DecodeSHUFPMask(getRegOperandVectorVT(MI, MVT::f64, 0),
NAKAMURA Takumi5582a6a2015-05-25 01:43:34 +0000560 MI->getOperand(MI->getNumOperands() - 1).getImm(),
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000561 ShuffleMask);
562 Src1Name = getRegName(MI->getOperand(1).getReg());
563 DestName = getRegName(MI->getOperand(0).getReg());
564 break;
565
566 case X86::SHUFPSrri:
567 case X86::VSHUFPSrri:
Simon Pilgrim5883a732015-11-16 22:39:27 +0000568 case X86::VSHUFPSYrri:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000569 Src2Name = getRegName(MI->getOperand(2).getReg());
570 // FALL THROUGH.
571 case X86::SHUFPSrmi:
572 case X86::VSHUFPSrmi:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000573 case X86::VSHUFPSYrmi:
NAKAMURA Takumi5582a6a2015-05-25 01:43:34 +0000574 if (MI->getOperand(MI->getNumOperands() - 1).isImm())
Simon Pilgrim5883a732015-11-16 22:39:27 +0000575 DecodeSHUFPMask(getRegOperandVectorVT(MI, MVT::f32, 0),
NAKAMURA Takumi5582a6a2015-05-25 01:43:34 +0000576 MI->getOperand(MI->getNumOperands() - 1).getImm(),
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000577 ShuffleMask);
578 Src1Name = getRegName(MI->getOperand(1).getReg());
579 DestName = getRegName(MI->getOperand(0).getReg());
580 break;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000581
Igor Breger24cab0f2015-11-16 07:22:00 +0000582 CASE_VSHUF(64X2, r)
583 CASE_VSHUF(64X2, m)
584 CASE_VSHUF(32X4, r)
585 CASE_VSHUF(32X4, m) {
Igor Bregerd7bae452015-10-15 13:29:07 +0000586 MVT VT;
587 bool HasMemOp;
588 unsigned NumOp = MI->getNumOperands();
589 getVSHUF64x2FamilyInfo(MI, VT, HasMemOp);
590 decodeVSHUF64x2FamilyMask(VT, MI->getOperand(NumOp - 1).getImm(),
591 ShuffleMask);
592 DestName = getRegName(MI->getOperand(0).getReg());
593 if (HasMemOp) {
594 assert((NumOp >= 8) && "Expected at least 8 operands!");
595 Src1Name = getRegName(MI->getOperand(NumOp - 7).getReg());
596 } else {
597 assert((NumOp >= 4) && "Expected at least 4 operands!");
598 Src2Name = getRegName(MI->getOperand(NumOp - 2).getReg());
599 Src1Name = getRegName(MI->getOperand(NumOp - 3).getReg());
600 }
601 break;
602 }
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000603
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000604 case X86::UNPCKLPDrr:
605 case X86::VUNPCKLPDrr:
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000606 case X86::VUNPCKLPDYrr:
607 case X86::VUNPCKLPDZrr:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000608 Src2Name = getRegName(MI->getOperand(2).getReg());
609 // FALL THROUGH.
610 case X86::UNPCKLPDrm:
611 case X86::VUNPCKLPDrm:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000612 case X86::VUNPCKLPDYrm:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000613 case X86::VUNPCKLPDZrm:
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000614 DecodeUNPCKLMask(getRegOperandVectorVT(MI, MVT::f64, 0), ShuffleMask);
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000615 Src1Name = getRegName(MI->getOperand(1).getReg());
616 DestName = getRegName(MI->getOperand(0).getReg());
617 break;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000618
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000619 case X86::UNPCKLPSrr:
620 case X86::VUNPCKLPSrr:
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000621 case X86::VUNPCKLPSYrr:
622 case X86::VUNPCKLPSZrr:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000623 Src2Name = getRegName(MI->getOperand(2).getReg());
624 // FALL THROUGH.
625 case X86::UNPCKLPSrm:
626 case X86::VUNPCKLPSrm:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000627 case X86::VUNPCKLPSYrm:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000628 case X86::VUNPCKLPSZrm:
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000629 DecodeUNPCKLMask(getRegOperandVectorVT(MI, MVT::f32, 0), ShuffleMask);
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000630 Src1Name = getRegName(MI->getOperand(1).getReg());
631 DestName = getRegName(MI->getOperand(0).getReg());
632 break;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000633
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000634 case X86::UNPCKHPDrr:
635 case X86::VUNPCKHPDrr:
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000636 case X86::VUNPCKHPDYrr:
637 case X86::VUNPCKHPDZrr:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000638 Src2Name = getRegName(MI->getOperand(2).getReg());
639 // FALL THROUGH.
640 case X86::UNPCKHPDrm:
641 case X86::VUNPCKHPDrm:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000642 case X86::VUNPCKHPDYrm:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000643 case X86::VUNPCKHPDZrm:
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000644 DecodeUNPCKHMask(getRegOperandVectorVT(MI, MVT::f64, 0), ShuffleMask);
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000645 Src1Name = getRegName(MI->getOperand(1).getReg());
646 DestName = getRegName(MI->getOperand(0).getReg());
647 break;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000648
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000649 case X86::UNPCKHPSrr:
650 case X86::VUNPCKHPSrr:
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000651 case X86::VUNPCKHPSYrr:
652 case X86::VUNPCKHPSZrr:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000653 Src2Name = getRegName(MI->getOperand(2).getReg());
654 // FALL THROUGH.
655 case X86::UNPCKHPSrm:
656 case X86::VUNPCKHPSrm:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000657 case X86::VUNPCKHPSYrm:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000658 case X86::VUNPCKHPSZrm:
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000659 DecodeUNPCKHMask(getRegOperandVectorVT(MI, MVT::f32, 0), ShuffleMask);
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000660 Src1Name = getRegName(MI->getOperand(1).getReg());
661 DestName = getRegName(MI->getOperand(0).getReg());
662 break;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000663
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000664 case X86::VPERMILPSri:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000665 case X86::VPERMILPSYri:
666 Src1Name = getRegName(MI->getOperand(1).getReg());
667 // FALL THROUGH.
Simon Pilgrim5883a732015-11-16 22:39:27 +0000668 case X86::VPERMILPSmi:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000669 case X86::VPERMILPSYmi:
NAKAMURA Takumi5582a6a2015-05-25 01:43:34 +0000670 if (MI->getOperand(MI->getNumOperands() - 1).isImm())
Simon Pilgrim5883a732015-11-16 22:39:27 +0000671 DecodePSHUFMask(getRegOperandVectorVT(MI, MVT::f32, 0),
NAKAMURA Takumi5582a6a2015-05-25 01:43:34 +0000672 MI->getOperand(MI->getNumOperands() - 1).getImm(),
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000673 ShuffleMask);
674 DestName = getRegName(MI->getOperand(0).getReg());
675 break;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000676
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000677 case X86::VPERMILPDri:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000678 case X86::VPERMILPDYri:
679 Src1Name = getRegName(MI->getOperand(1).getReg());
680 // FALL THROUGH.
Simon Pilgrim5883a732015-11-16 22:39:27 +0000681 case X86::VPERMILPDmi:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000682 case X86::VPERMILPDYmi:
NAKAMURA Takumi5582a6a2015-05-25 01:43:34 +0000683 if (MI->getOperand(MI->getNumOperands() - 1).isImm())
Simon Pilgrim5883a732015-11-16 22:39:27 +0000684 DecodePSHUFMask(getRegOperandVectorVT(MI, MVT::f64, 0),
NAKAMURA Takumi5582a6a2015-05-25 01:43:34 +0000685 MI->getOperand(MI->getNumOperands() - 1).getImm(),
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000686 ShuffleMask);
687 DestName = getRegName(MI->getOperand(0).getReg());
688 break;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000689
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000690 case X86::VPERM2F128rr:
691 case X86::VPERM2I128rr:
692 Src2Name = getRegName(MI->getOperand(2).getReg());
693 // FALL THROUGH.
694 case X86::VPERM2F128rm:
695 case X86::VPERM2I128rm:
696 // For instruction comments purpose, assume the 256-bit vector is v4i64.
NAKAMURA Takumi5582a6a2015-05-25 01:43:34 +0000697 if (MI->getOperand(MI->getNumOperands() - 1).isImm())
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000698 DecodeVPERM2X128Mask(MVT::v4i64,
NAKAMURA Takumi5582a6a2015-05-25 01:43:34 +0000699 MI->getOperand(MI->getNumOperands() - 1).getImm(),
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000700 ShuffleMask);
701 Src1Name = getRegName(MI->getOperand(1).getReg());
702 DestName = getRegName(MI->getOperand(0).getReg());
703 break;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000704
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000705 case X86::VPERMQYri:
706 case X86::VPERMPDYri:
707 Src1Name = getRegName(MI->getOperand(1).getReg());
708 // FALL THROUGH.
709 case X86::VPERMQYmi:
710 case X86::VPERMPDYmi:
NAKAMURA Takumi5582a6a2015-05-25 01:43:34 +0000711 if (MI->getOperand(MI->getNumOperands() - 1).isImm())
712 DecodeVPERMMask(MI->getOperand(MI->getNumOperands() - 1).getImm(),
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000713 ShuffleMask);
714 DestName = getRegName(MI->getOperand(0).getReg());
715 break;
716
717 case X86::MOVSDrr:
718 case X86::VMOVSDrr:
719 Src2Name = getRegName(MI->getOperand(2).getReg());
720 Src1Name = getRegName(MI->getOperand(1).getReg());
721 // FALL THROUGH.
722 case X86::MOVSDrm:
723 case X86::VMOVSDrm:
724 DecodeScalarMoveMask(MVT::v2f64, nullptr == Src2Name, ShuffleMask);
725 DestName = getRegName(MI->getOperand(0).getReg());
726 break;
727 case X86::MOVSSrr:
728 case X86::VMOVSSrr:
729 Src2Name = getRegName(MI->getOperand(2).getReg());
730 Src1Name = getRegName(MI->getOperand(1).getReg());
731 // FALL THROUGH.
732 case X86::MOVSSrm:
733 case X86::VMOVSSrm:
734 DecodeScalarMoveMask(MVT::v4f32, nullptr == Src2Name, ShuffleMask);
735 DestName = getRegName(MI->getOperand(0).getReg());
736 break;
737
738 case X86::MOVPQI2QIrr:
739 case X86::MOVZPQILo2PQIrr:
740 case X86::VMOVPQI2QIrr:
741 case X86::VMOVZPQILo2PQIrr:
742 Src1Name = getRegName(MI->getOperand(1).getReg());
743 // FALL THROUGH.
744 case X86::MOVQI2PQIrm:
745 case X86::MOVZQI2PQIrm:
746 case X86::MOVZPQILo2PQIrm:
747 case X86::VMOVQI2PQIrm:
748 case X86::VMOVZQI2PQIrm:
749 case X86::VMOVZPQILo2PQIrm:
750 DecodeZeroMoveLowMask(MVT::v2i64, ShuffleMask);
751 DestName = getRegName(MI->getOperand(0).getReg());
752 break;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000753
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000754 case X86::MOVDI2PDIrm:
755 case X86::VMOVDI2PDIrm:
756 DecodeZeroMoveLowMask(MVT::v4i32, ShuffleMask);
757 DestName = getRegName(MI->getOperand(0).getReg());
758 break;
759
Simon Pilgrimd85cae32015-07-06 20:46:41 +0000760 case X86::EXTRQI:
761 if (MI->getOperand(2).isImm() &&
762 MI->getOperand(3).isImm())
763 DecodeEXTRQIMask(MI->getOperand(2).getImm(),
764 MI->getOperand(3).getImm(),
765 ShuffleMask);
766
767 DestName = getRegName(MI->getOperand(0).getReg());
768 Src1Name = getRegName(MI->getOperand(1).getReg());
769 break;
770
771 case X86::INSERTQI:
772 if (MI->getOperand(3).isImm() &&
773 MI->getOperand(4).isImm())
774 DecodeINSERTQIMask(MI->getOperand(3).getImm(),
775 MI->getOperand(4).getImm(),
776 ShuffleMask);
777
778 DestName = getRegName(MI->getOperand(0).getReg());
779 Src1Name = getRegName(MI->getOperand(1).getReg());
780 Src2Name = getRegName(MI->getOperand(2).getReg());
781 break;
782
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000783 case X86::PMOVZXBWrr:
784 case X86::PMOVZXBDrr:
785 case X86::PMOVZXBQrr:
786 case X86::PMOVZXWDrr:
787 case X86::PMOVZXWQrr:
788 case X86::PMOVZXDQrr:
789 case X86::VPMOVZXBWrr:
790 case X86::VPMOVZXBDrr:
791 case X86::VPMOVZXBQrr:
792 case X86::VPMOVZXWDrr:
793 case X86::VPMOVZXWQrr:
794 case X86::VPMOVZXDQrr:
795 case X86::VPMOVZXBWYrr:
796 case X86::VPMOVZXBDYrr:
797 case X86::VPMOVZXBQYrr:
798 case X86::VPMOVZXWDYrr:
799 case X86::VPMOVZXWQYrr:
800 case X86::VPMOVZXDQYrr:
801 Src1Name = getRegName(MI->getOperand(1).getReg());
802 // FALL THROUGH.
803 case X86::PMOVZXBWrm:
804 case X86::PMOVZXBDrm:
805 case X86::PMOVZXBQrm:
806 case X86::PMOVZXWDrm:
807 case X86::PMOVZXWQrm:
808 case X86::PMOVZXDQrm:
809 case X86::VPMOVZXBWrm:
810 case X86::VPMOVZXBDrm:
811 case X86::VPMOVZXBQrm:
812 case X86::VPMOVZXWDrm:
813 case X86::VPMOVZXWQrm:
814 case X86::VPMOVZXDQrm:
815 case X86::VPMOVZXBWYrm:
816 case X86::VPMOVZXBDYrm:
817 case X86::VPMOVZXBQYrm:
818 case X86::VPMOVZXWDYrm:
819 case X86::VPMOVZXWQYrm:
820 case X86::VPMOVZXDQYrm: {
821 MVT SrcVT, DstVT;
822 getZeroExtensionTypes(MI, SrcVT, DstVT);
823 DecodeZeroExtendMask(SrcVT, DstVT, ShuffleMask);
824 DestName = getRegName(MI->getOperand(0).getReg());
825 } break;
826 }
827
828 // The only comments we decode are shuffles, so give up if we were unable to
829 // decode a shuffle mask.
830 if (ShuffleMask.empty())
831 return false;
832
833 if (!DestName) DestName = Src1Name;
834 OS << (DestName ? DestName : "mem") << " = ";
835
836 // If the two sources are the same, canonicalize the input elements to be
837 // from the first src so that we get larger element spans.
838 if (Src1Name == Src2Name) {
839 for (unsigned i = 0, e = ShuffleMask.size(); i != e; ++i) {
840 if ((int)ShuffleMask[i] >= 0 && // Not sentinel.
NAKAMURA Takumi5582a6a2015-05-25 01:43:34 +0000841 ShuffleMask[i] >= (int)e) // From second mask.
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000842 ShuffleMask[i] -= e;
843 }
844 }
845
846 // The shuffle mask specifies which elements of the src1/src2 fill in the
847 // destination, with a few sentinel values. Loop through and print them
848 // out.
849 for (unsigned i = 0, e = ShuffleMask.size(); i != e; ++i) {
850 if (i != 0)
851 OS << ',';
852 if (ShuffleMask[i] == SM_SentinelZero) {
853 OS << "zero";
854 continue;
855 }
856
857 // Otherwise, it must come from src1 or src2. Print the span of elements
858 // that comes from this src.
859 bool isSrc1 = ShuffleMask[i] < (int)ShuffleMask.size();
860 const char *SrcName = isSrc1 ? Src1Name : Src2Name;
861 OS << (SrcName ? SrcName : "mem") << '[';
862 bool IsFirst = true;
863 while (i != e && (int)ShuffleMask[i] != SM_SentinelZero &&
864 (ShuffleMask[i] < (int)ShuffleMask.size()) == isSrc1) {
865 if (!IsFirst)
866 OS << ',';
867 else
868 IsFirst = false;
869 if (ShuffleMask[i] == SM_SentinelUndef)
870 OS << "u";
871 else
872 OS << ShuffleMask[i] % ShuffleMask.size();
873 ++i;
874 }
875 OS << ']';
NAKAMURA Takumi5582a6a2015-05-25 01:43:34 +0000876 --i; // For loop increments element #.
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000877 }
878 //MI->print(OS, 0);
879 OS << "\n";
880
881 // We successfully added a comment to this instruction.
882 return true;
883}