blob: 3bf33dc22a9bef10ffdbe708aa13b6727ac7c7f2 [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
Simon Pilgrim8483df62015-11-17 22:35:45 +0000150#define CASE_UNPCK(Inst, src) \
151 CASE_MASK_INS_COMMON(Inst, Z, r##src) \
152 CASE_MASK_INS_COMMON(Inst, Z256, r##src) \
153 CASE_MASK_INS_COMMON(Inst, Z128, r##src) \
154 CASE_AVX_INS_COMMON(Inst, , r##src) \
155 CASE_AVX_INS_COMMON(Inst, Y, r##src) \
156 CASE_SSE_INS_COMMON(Inst, r##src) \
157
Simon Pilgrim2da41782015-11-17 23:29:49 +0000158#define CASE_SHUF(Inst, src) \
159 CASE_MASK_INS_COMMON(Inst, Z, r##src##i) \
160 CASE_MASK_INS_COMMON(Inst, Z256, r##src##i) \
161 CASE_MASK_INS_COMMON(Inst, Z128, r##src##i) \
162 CASE_AVX_INS_COMMON(Inst, , r##src##i) \
163 CASE_AVX_INS_COMMON(Inst, Y, r##src##i) \
164 CASE_SSE_INS_COMMON(Inst, r##src##i) \
165
166#define CASE_VPERM(Inst, src) \
167 CASE_MASK_INS_COMMON(Inst, Z, src##i) \
168 CASE_MASK_INS_COMMON(Inst, Z256, src##i) \
169 CASE_MASK_INS_COMMON(Inst, Z128, src##i) \
170 CASE_AVX_INS_COMMON(Inst, , src##i) \
171 CASE_AVX_INS_COMMON(Inst, Y, src##i) \
172
Igor Breger24cab0f2015-11-16 07:22:00 +0000173#define CASE_VSHUF(Inst, src) \
174 CASE_MASK_INS_COMMON(SHUFF##Inst, Z, r##src##i) \
175 CASE_MASK_INS_COMMON(SHUFI##Inst, Z, r##src##i) \
176 CASE_MASK_INS_COMMON(SHUFF##Inst, Z256, r##src##i) \
177 CASE_MASK_INS_COMMON(SHUFI##Inst, Z256, r##src##i) \
Igor Bregerd7bae452015-10-15 13:29:07 +0000178
179/// \brief Extracts the types and if it has memory operand for a given
180/// (SHUFF32x4/SHUFF64x2/SHUFI32x4/SHUFI64x2) instruction.
181static void getVSHUF64x2FamilyInfo(const MCInst *MI, MVT &VT, bool &HasMemOp) {
182 HasMemOp = false;
183 switch (MI->getOpcode()) {
184 default:
185 llvm_unreachable("Unknown VSHUF64x2 family instructions.");
186 break;
Igor Breger24cab0f2015-11-16 07:22:00 +0000187 CASE_VSHUF(64X2, m)
Igor Bregerd7bae452015-10-15 13:29:07 +0000188 HasMemOp = true; // FALL THROUGH.
Igor Breger24cab0f2015-11-16 07:22:00 +0000189 CASE_VSHUF(64X2, r)
190 VT = getRegOperandVectorVT(MI, MVT::i64, 0);
Igor Bregerd7bae452015-10-15 13:29:07 +0000191 break;
Igor Breger24cab0f2015-11-16 07:22:00 +0000192 CASE_VSHUF(32X4, m)
Igor Bregerd7bae452015-10-15 13:29:07 +0000193 HasMemOp = true; // FALL THROUGH.
Igor Breger24cab0f2015-11-16 07:22:00 +0000194 CASE_VSHUF(32X4, r)
195 VT = getRegOperandVectorVT(MI, MVT::i32, 0);
Igor Bregerd7bae452015-10-15 13:29:07 +0000196 break;
197 }
198}
199
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000200//===----------------------------------------------------------------------===//
201// Top Level Entrypoint
202//===----------------------------------------------------------------------===//
203
204/// EmitAnyX86InstComments - This function decodes x86 instructions and prints
205/// newline terminated strings to the specified string if desired. This
206/// information is shown in disassembly dumps when verbose assembly is enabled.
207bool llvm::EmitAnyX86InstComments(const MCInst *MI, raw_ostream &OS,
208 const char *(*getRegName)(unsigned)) {
209 // If this is a shuffle operation, the switch should fill in this state.
210 SmallVector<int, 8> ShuffleMask;
211 const char *DestName = nullptr, *Src1Name = nullptr, *Src2Name = nullptr;
212
213 switch (MI->getOpcode()) {
214 default:
215 // Not an instruction for which we can decode comments.
216 return false;
217
218 case X86::BLENDPDrri:
219 case X86::VBLENDPDrri:
Simon Pilgrim13d3a202015-11-16 23:03:18 +0000220 case X86::VBLENDPDYrri:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000221 Src2Name = getRegName(MI->getOperand(2).getReg());
222 // FALL THROUGH.
223 case X86::BLENDPDrmi:
224 case X86::VBLENDPDrmi:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000225 case X86::VBLENDPDYrmi:
NAKAMURA Takumi5582a6a2015-05-25 01:43:34 +0000226 if (MI->getOperand(MI->getNumOperands() - 1).isImm())
Simon Pilgrim13d3a202015-11-16 23:03:18 +0000227 DecodeBLENDMask(getRegOperandVectorVT(MI, MVT::f64, 0),
NAKAMURA Takumi5582a6a2015-05-25 01:43:34 +0000228 MI->getOperand(MI->getNumOperands() - 1).getImm(),
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000229 ShuffleMask);
230 Src1Name = getRegName(MI->getOperand(1).getReg());
231 DestName = getRegName(MI->getOperand(0).getReg());
232 break;
233
234 case X86::BLENDPSrri:
235 case X86::VBLENDPSrri:
Simon Pilgrim13d3a202015-11-16 23:03:18 +0000236 case X86::VBLENDPSYrri:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000237 Src2Name = getRegName(MI->getOperand(2).getReg());
238 // FALL THROUGH.
239 case X86::BLENDPSrmi:
240 case X86::VBLENDPSrmi:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000241 case X86::VBLENDPSYrmi:
NAKAMURA Takumi5582a6a2015-05-25 01:43:34 +0000242 if (MI->getOperand(MI->getNumOperands() - 1).isImm())
Simon Pilgrim13d3a202015-11-16 23:03:18 +0000243 DecodeBLENDMask(getRegOperandVectorVT(MI, MVT::f32, 0),
NAKAMURA Takumi5582a6a2015-05-25 01:43:34 +0000244 MI->getOperand(MI->getNumOperands() - 1).getImm(),
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000245 ShuffleMask);
246 Src1Name = getRegName(MI->getOperand(1).getReg());
247 DestName = getRegName(MI->getOperand(0).getReg());
248 break;
249
250 case X86::PBLENDWrri:
251 case X86::VPBLENDWrri:
Simon Pilgrim13d3a202015-11-16 23:03:18 +0000252 case X86::VPBLENDWYrri:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000253 Src2Name = getRegName(MI->getOperand(2).getReg());
254 // FALL THROUGH.
255 case X86::PBLENDWrmi:
256 case X86::VPBLENDWrmi:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000257 case X86::VPBLENDWYrmi:
NAKAMURA Takumi5582a6a2015-05-25 01:43:34 +0000258 if (MI->getOperand(MI->getNumOperands() - 1).isImm())
Simon Pilgrim13d3a202015-11-16 23:03:18 +0000259 DecodeBLENDMask(getRegOperandVectorVT(MI, MVT::i16, 0),
NAKAMURA Takumi5582a6a2015-05-25 01:43:34 +0000260 MI->getOperand(MI->getNumOperands() - 1).getImm(),
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000261 ShuffleMask);
262 Src1Name = getRegName(MI->getOperand(1).getReg());
263 DestName = getRegName(MI->getOperand(0).getReg());
264 break;
265
266 case X86::VPBLENDDrri:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000267 case X86::VPBLENDDYrri:
268 Src2Name = getRegName(MI->getOperand(2).getReg());
269 // FALL THROUGH.
Simon Pilgrim13d3a202015-11-16 23:03:18 +0000270 case X86::VPBLENDDrmi:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000271 case X86::VPBLENDDYrmi:
NAKAMURA Takumi5582a6a2015-05-25 01:43:34 +0000272 if (MI->getOperand(MI->getNumOperands() - 1).isImm())
Simon Pilgrim13d3a202015-11-16 23:03:18 +0000273 DecodeBLENDMask(getRegOperandVectorVT(MI, MVT::i32, 0),
NAKAMURA Takumi5582a6a2015-05-25 01:43:34 +0000274 MI->getOperand(MI->getNumOperands() - 1).getImm(),
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000275 ShuffleMask);
276 Src1Name = getRegName(MI->getOperand(1).getReg());
277 DestName = getRegName(MI->getOperand(0).getReg());
278 break;
279
280 case X86::INSERTPSrr:
281 case X86::VINSERTPSrr:
282 Src2Name = getRegName(MI->getOperand(2).getReg());
283 // FALL THROUGH.
284 case X86::INSERTPSrm:
285 case X86::VINSERTPSrm:
286 DestName = getRegName(MI->getOperand(0).getReg());
287 Src1Name = getRegName(MI->getOperand(1).getReg());
NAKAMURA Takumi5582a6a2015-05-25 01:43:34 +0000288 if (MI->getOperand(MI->getNumOperands() - 1).isImm())
289 DecodeINSERTPSMask(MI->getOperand(MI->getNumOperands() - 1).getImm(),
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000290 ShuffleMask);
291 break;
292
293 case X86::MOVLHPSrr:
294 case X86::VMOVLHPSrr:
295 Src2Name = getRegName(MI->getOperand(2).getReg());
296 Src1Name = getRegName(MI->getOperand(1).getReg());
297 DestName = getRegName(MI->getOperand(0).getReg());
298 DecodeMOVLHPSMask(2, ShuffleMask);
299 break;
300
301 case X86::MOVHLPSrr:
302 case X86::VMOVHLPSrr:
303 Src2Name = getRegName(MI->getOperand(2).getReg());
304 Src1Name = getRegName(MI->getOperand(1).getReg());
305 DestName = getRegName(MI->getOperand(0).getReg());
306 DecodeMOVHLPSMask(2, ShuffleMask);
307 break;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000308
Igor Breger24cab0f2015-11-16 07:22:00 +0000309 CASE_MOVDUP(MOVSLDUP, r)
310 Src1Name = getRegName(MI->getOperand(MI->getNumOperands() - 1).getReg());
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000311 // FALL THROUGH.
Igor Breger1f782962015-11-19 08:26:56 +0000312 CASE_MOVDUP(MOVSLDUP, m)
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000313 DestName = getRegName(MI->getOperand(0).getReg());
Igor Breger1f782962015-11-19 08:26:56 +0000314 DecodeMOVSLDUPMask(getRegOperandVectorVT(MI, MVT::f32, 0), ShuffleMask);
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000315 break;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000316
Igor Breger24cab0f2015-11-16 07:22:00 +0000317 CASE_MOVDUP(MOVSHDUP, r)
318 Src1Name = getRegName(MI->getOperand(MI->getNumOperands() - 1).getReg());
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000319 // FALL THROUGH.
Igor Breger1f782962015-11-19 08:26:56 +0000320 CASE_MOVDUP(MOVSHDUP, m)
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000321 DestName = getRegName(MI->getOperand(0).getReg());
Igor Breger1f782962015-11-19 08:26:56 +0000322 DecodeMOVSHDUPMask(getRegOperandVectorVT(MI, MVT::f32, 0), ShuffleMask);
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000323 break;
324
Igor Breger1f782962015-11-19 08:26:56 +0000325 CASE_MOVDUP(MOVDDUP, r)
326 Src1Name = getRegName(MI->getOperand(MI->getNumOperands() - 1).getReg());
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000327 // FALL THROUGH.
Igor Breger1f782962015-11-19 08:26:56 +0000328 CASE_MOVDUP(MOVDDUP, m)
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000329 DestName = getRegName(MI->getOperand(0).getReg());
Igor Breger1f782962015-11-19 08:26:56 +0000330 DecodeMOVDDUPMask(getRegOperandVectorVT(MI, MVT::f64, 0), ShuffleMask);
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000331 break;
332
333 case X86::PSLLDQri:
334 case X86::VPSLLDQri:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000335 case X86::VPSLLDQYri:
336 Src1Name = getRegName(MI->getOperand(1).getReg());
337 DestName = getRegName(MI->getOperand(0).getReg());
NAKAMURA Takumi5582a6a2015-05-25 01:43:34 +0000338 if (MI->getOperand(MI->getNumOperands() - 1).isImm())
Simon Pilgrimb9ada272015-11-16 22:54:41 +0000339 DecodePSLLDQMask(getRegOperandVectorVT(MI, MVT::i8, 0),
NAKAMURA Takumi5582a6a2015-05-25 01:43:34 +0000340 MI->getOperand(MI->getNumOperands() - 1).getImm(),
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000341 ShuffleMask);
342 break;
343
344 case X86::PSRLDQri:
345 case X86::VPSRLDQri:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000346 case X86::VPSRLDQYri:
347 Src1Name = getRegName(MI->getOperand(1).getReg());
348 DestName = getRegName(MI->getOperand(0).getReg());
NAKAMURA Takumi5582a6a2015-05-25 01:43:34 +0000349 if (MI->getOperand(MI->getNumOperands() - 1).isImm())
Simon Pilgrimb9ada272015-11-16 22:54:41 +0000350 DecodePSRLDQMask(getRegOperandVectorVT(MI, MVT::i8, 0),
NAKAMURA Takumi5582a6a2015-05-25 01:43:34 +0000351 MI->getOperand(MI->getNumOperands() - 1).getImm(),
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000352 ShuffleMask);
353 break;
354
355 case X86::PALIGNR128rr:
356 case X86::VPALIGNR128rr:
Simon Pilgrimb9ada272015-11-16 22:54:41 +0000357 case X86::VPALIGNR256rr:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000358 Src1Name = getRegName(MI->getOperand(2).getReg());
359 // FALL THROUGH.
360 case X86::PALIGNR128rm:
361 case X86::VPALIGNR128rm:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000362 case X86::VPALIGNR256rm:
363 Src2Name = getRegName(MI->getOperand(1).getReg());
364 DestName = getRegName(MI->getOperand(0).getReg());
NAKAMURA Takumi5582a6a2015-05-25 01:43:34 +0000365 if (MI->getOperand(MI->getNumOperands() - 1).isImm())
Simon Pilgrimb9ada272015-11-16 22:54:41 +0000366 DecodePALIGNRMask(getRegOperandVectorVT(MI, MVT::i8, 0),
NAKAMURA Takumi5582a6a2015-05-25 01:43:34 +0000367 MI->getOperand(MI->getNumOperands() - 1).getImm(),
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000368 ShuffleMask);
369 break;
370
371 case X86::PSHUFDri:
372 case X86::VPSHUFDri:
Simon Pilgrim5883a732015-11-16 22:39:27 +0000373 case X86::VPSHUFDYri:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000374 Src1Name = getRegName(MI->getOperand(1).getReg());
375 // FALL THROUGH.
376 case X86::PSHUFDmi:
377 case X86::VPSHUFDmi:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000378 case X86::VPSHUFDYmi:
379 DestName = getRegName(MI->getOperand(0).getReg());
NAKAMURA Takumi5582a6a2015-05-25 01:43:34 +0000380 if (MI->getOperand(MI->getNumOperands() - 1).isImm())
Simon Pilgrim5883a732015-11-16 22:39:27 +0000381 DecodePSHUFMask(getRegOperandVectorVT(MI, MVT::i32, 0),
NAKAMURA Takumi5582a6a2015-05-25 01:43:34 +0000382 MI->getOperand(MI->getNumOperands() - 1).getImm(),
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000383 ShuffleMask);
384 break;
385
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000386 case X86::PSHUFHWri:
387 case X86::VPSHUFHWri:
Simon Pilgrim5883a732015-11-16 22:39:27 +0000388 case X86::VPSHUFHWYri:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000389 Src1Name = getRegName(MI->getOperand(1).getReg());
390 // FALL THROUGH.
391 case X86::PSHUFHWmi:
392 case X86::VPSHUFHWmi:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000393 case X86::VPSHUFHWYmi:
394 DestName = getRegName(MI->getOperand(0).getReg());
NAKAMURA Takumi5582a6a2015-05-25 01:43:34 +0000395 if (MI->getOperand(MI->getNumOperands() - 1).isImm())
Simon Pilgrim5883a732015-11-16 22:39:27 +0000396 DecodePSHUFHWMask(getRegOperandVectorVT(MI, MVT::i16, 0),
NAKAMURA Takumi5582a6a2015-05-25 01:43:34 +0000397 MI->getOperand(MI->getNumOperands() - 1).getImm(),
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000398 ShuffleMask);
399 break;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000400
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000401 case X86::PSHUFLWri:
402 case X86::VPSHUFLWri:
Simon Pilgrim5883a732015-11-16 22:39:27 +0000403 case X86::VPSHUFLWYri:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000404 Src1Name = getRegName(MI->getOperand(1).getReg());
405 // FALL THROUGH.
406 case X86::PSHUFLWmi:
407 case X86::VPSHUFLWmi:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000408 case X86::VPSHUFLWYmi:
409 DestName = getRegName(MI->getOperand(0).getReg());
NAKAMURA Takumi5582a6a2015-05-25 01:43:34 +0000410 if (MI->getOperand(MI->getNumOperands() - 1).isImm())
Simon Pilgrim5883a732015-11-16 22:39:27 +0000411 DecodePSHUFLWMask(getRegOperandVectorVT(MI, MVT::i16, 0),
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;
415
Simon Pilgrimf8f86ab2015-09-13 11:28:45 +0000416 case X86::MMX_PSHUFWri:
417 Src1Name = getRegName(MI->getOperand(1).getReg());
418 // FALL THROUGH.
419 case X86::MMX_PSHUFWmi:
420 DestName = getRegName(MI->getOperand(0).getReg());
421 if (MI->getOperand(MI->getNumOperands() - 1).isImm())
422 DecodePSHUFMask(MVT::v4i16,
423 MI->getOperand(MI->getNumOperands() - 1).getImm(),
424 ShuffleMask);
425 break;
426
427 case X86::PSWAPDrr:
428 Src1Name = getRegName(MI->getOperand(1).getReg());
429 // FALL THROUGH.
430 case X86::PSWAPDrm:
431 DestName = getRegName(MI->getOperand(0).getReg());
432 DecodePSWAPMask(MVT::v2i32, ShuffleMask);
433 break;
434
Simon Pilgrim8483df62015-11-17 22:35:45 +0000435 CASE_UNPCK(PUNPCKHBW, r)
Simon Pilgrimf8f86ab2015-09-13 11:28:45 +0000436 case X86::MMX_PUNPCKHBWirr:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000437 Src2Name = getRegName(MI->getOperand(2).getReg());
438 // FALL THROUGH.
Simon Pilgrim8483df62015-11-17 22:35:45 +0000439 CASE_UNPCK(PUNPCKHBW, m)
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000440 case X86::MMX_PUNPCKHBWirm:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000441 Src1Name = getRegName(MI->getOperand(1).getReg());
442 DestName = getRegName(MI->getOperand(0).getReg());
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000443 DecodeUNPCKHMask(getRegOperandVectorVT(MI, MVT::i8, 0), ShuffleMask);
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000444 break;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000445
Simon Pilgrim8483df62015-11-17 22:35:45 +0000446 CASE_UNPCK(PUNPCKHWD, r)
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000447 case X86::MMX_PUNPCKHWDirr:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000448 Src2Name = getRegName(MI->getOperand(2).getReg());
449 // FALL THROUGH.
Simon Pilgrim8483df62015-11-17 22:35:45 +0000450 CASE_UNPCK(PUNPCKHWD, m)
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000451 case X86::MMX_PUNPCKHWDirm:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000452 Src1Name = getRegName(MI->getOperand(1).getReg());
453 DestName = getRegName(MI->getOperand(0).getReg());
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000454 DecodeUNPCKHMask(getRegOperandVectorVT(MI, MVT::i16, 0), ShuffleMask);
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000455 break;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000456
Simon Pilgrim8483df62015-11-17 22:35:45 +0000457 CASE_UNPCK(PUNPCKHDQ, r)
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000458 case X86::MMX_PUNPCKHDQirr:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000459 Src2Name = getRegName(MI->getOperand(2).getReg());
460 // FALL THROUGH.
Simon Pilgrim8483df62015-11-17 22:35:45 +0000461 CASE_UNPCK(PUNPCKHDQ, m)
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000462 case X86::MMX_PUNPCKHDQirm:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000463 Src1Name = getRegName(MI->getOperand(1).getReg());
464 DestName = getRegName(MI->getOperand(0).getReg());
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000465 DecodeUNPCKHMask(getRegOperandVectorVT(MI, MVT::i32, 0), ShuffleMask);
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000466 break;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000467
Simon Pilgrim8483df62015-11-17 22:35:45 +0000468 CASE_UNPCK(PUNPCKHQDQ, r)
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000469 Src2Name = getRegName(MI->getOperand(2).getReg());
470 // FALL THROUGH.
Simon Pilgrim8483df62015-11-17 22:35:45 +0000471 CASE_UNPCK(PUNPCKHQDQ, m)
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000472 Src1Name = getRegName(MI->getOperand(1).getReg());
473 DestName = getRegName(MI->getOperand(0).getReg());
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000474 DecodeUNPCKHMask(getRegOperandVectorVT(MI, MVT::i64, 0), ShuffleMask);
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000475 break;
476
Simon Pilgrim8483df62015-11-17 22:35:45 +0000477 CASE_UNPCK(PUNPCKLBW, r)
Simon Pilgrimf8f86ab2015-09-13 11:28:45 +0000478 case X86::MMX_PUNPCKLBWirr:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000479 Src2Name = getRegName(MI->getOperand(2).getReg());
480 // FALL THROUGH.
Simon Pilgrim8483df62015-11-17 22:35:45 +0000481 CASE_UNPCK(PUNPCKLBW, m)
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000482 case X86::MMX_PUNPCKLBWirm:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000483 Src1Name = getRegName(MI->getOperand(1).getReg());
484 DestName = getRegName(MI->getOperand(0).getReg());
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000485 DecodeUNPCKLMask(getRegOperandVectorVT(MI, MVT::i8, 0), ShuffleMask);
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000486 break;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000487
Simon Pilgrim8483df62015-11-17 22:35:45 +0000488 CASE_UNPCK(PUNPCKLWD, r)
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000489 case X86::MMX_PUNPCKLWDirr:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000490 Src2Name = getRegName(MI->getOperand(2).getReg());
491 // FALL THROUGH.
Simon Pilgrim8483df62015-11-17 22:35:45 +0000492 CASE_UNPCK(PUNPCKLWD, m)
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000493 case X86::MMX_PUNPCKLWDirm:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000494 Src1Name = getRegName(MI->getOperand(1).getReg());
495 DestName = getRegName(MI->getOperand(0).getReg());
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000496 DecodeUNPCKLMask(getRegOperandVectorVT(MI, MVT::i16, 0), ShuffleMask);
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000497 break;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000498
Simon Pilgrim8483df62015-11-17 22:35:45 +0000499 CASE_UNPCK(PUNPCKLDQ, r)
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000500 case X86::MMX_PUNPCKLDQirr:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000501 Src2Name = getRegName(MI->getOperand(2).getReg());
502 // FALL THROUGH.
Simon Pilgrim8483df62015-11-17 22:35:45 +0000503 CASE_UNPCK(PUNPCKLDQ, m)
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000504 case X86::MMX_PUNPCKLDQirm:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000505 Src1Name = getRegName(MI->getOperand(1).getReg());
506 DestName = getRegName(MI->getOperand(0).getReg());
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000507 DecodeUNPCKLMask(getRegOperandVectorVT(MI, MVT::i32, 0), ShuffleMask);
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000508 break;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000509
Simon Pilgrim8483df62015-11-17 22:35:45 +0000510 CASE_UNPCK(PUNPCKLQDQ, r)
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000511 Src2Name = getRegName(MI->getOperand(2).getReg());
512 // FALL THROUGH.
Simon Pilgrim8483df62015-11-17 22:35:45 +0000513 CASE_UNPCK(PUNPCKLQDQ, m)
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000514 Src1Name = getRegName(MI->getOperand(1).getReg());
515 DestName = getRegName(MI->getOperand(0).getReg());
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000516 DecodeUNPCKLMask(getRegOperandVectorVT(MI, MVT::i64, 0), ShuffleMask);
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000517 break;
518
Simon Pilgrim2da41782015-11-17 23:29:49 +0000519 CASE_SHUF(SHUFPD, r)
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000520 Src2Name = getRegName(MI->getOperand(2).getReg());
521 // FALL THROUGH.
Simon Pilgrim2da41782015-11-17 23:29:49 +0000522 CASE_SHUF(SHUFPD, m)
NAKAMURA Takumi5582a6a2015-05-25 01:43:34 +0000523 if (MI->getOperand(MI->getNumOperands() - 1).isImm())
Simon Pilgrim5883a732015-11-16 22:39:27 +0000524 DecodeSHUFPMask(getRegOperandVectorVT(MI, MVT::f64, 0),
NAKAMURA Takumi5582a6a2015-05-25 01:43:34 +0000525 MI->getOperand(MI->getNumOperands() - 1).getImm(),
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000526 ShuffleMask);
527 Src1Name = getRegName(MI->getOperand(1).getReg());
528 DestName = getRegName(MI->getOperand(0).getReg());
529 break;
530
Simon Pilgrim2da41782015-11-17 23:29:49 +0000531 CASE_SHUF(SHUFPS, r)
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000532 Src2Name = getRegName(MI->getOperand(2).getReg());
533 // FALL THROUGH.
Simon Pilgrim2da41782015-11-17 23:29:49 +0000534 CASE_SHUF(SHUFPS, m)
NAKAMURA Takumi5582a6a2015-05-25 01:43:34 +0000535 if (MI->getOperand(MI->getNumOperands() - 1).isImm())
Simon Pilgrim5883a732015-11-16 22:39:27 +0000536 DecodeSHUFPMask(getRegOperandVectorVT(MI, MVT::f32, 0),
NAKAMURA Takumi5582a6a2015-05-25 01:43:34 +0000537 MI->getOperand(MI->getNumOperands() - 1).getImm(),
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000538 ShuffleMask);
539 Src1Name = getRegName(MI->getOperand(1).getReg());
540 DestName = getRegName(MI->getOperand(0).getReg());
541 break;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000542
Igor Breger24cab0f2015-11-16 07:22:00 +0000543 CASE_VSHUF(64X2, r)
544 CASE_VSHUF(64X2, m)
545 CASE_VSHUF(32X4, r)
546 CASE_VSHUF(32X4, m) {
Igor Bregerd7bae452015-10-15 13:29:07 +0000547 MVT VT;
548 bool HasMemOp;
549 unsigned NumOp = MI->getNumOperands();
550 getVSHUF64x2FamilyInfo(MI, VT, HasMemOp);
551 decodeVSHUF64x2FamilyMask(VT, MI->getOperand(NumOp - 1).getImm(),
552 ShuffleMask);
553 DestName = getRegName(MI->getOperand(0).getReg());
554 if (HasMemOp) {
555 assert((NumOp >= 8) && "Expected at least 8 operands!");
556 Src1Name = getRegName(MI->getOperand(NumOp - 7).getReg());
557 } else {
558 assert((NumOp >= 4) && "Expected at least 4 operands!");
559 Src2Name = getRegName(MI->getOperand(NumOp - 2).getReg());
560 Src1Name = getRegName(MI->getOperand(NumOp - 3).getReg());
561 }
562 break;
563 }
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000564
Simon Pilgrim8483df62015-11-17 22:35:45 +0000565 CASE_UNPCK(UNPCKLPD, r)
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000566 Src2Name = getRegName(MI->getOperand(2).getReg());
567 // FALL THROUGH.
Simon Pilgrim8483df62015-11-17 22:35:45 +0000568 CASE_UNPCK(UNPCKLPD, m)
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000569 DecodeUNPCKLMask(getRegOperandVectorVT(MI, MVT::f64, 0), ShuffleMask);
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000570 Src1Name = getRegName(MI->getOperand(1).getReg());
571 DestName = getRegName(MI->getOperand(0).getReg());
572 break;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000573
Simon Pilgrim8483df62015-11-17 22:35:45 +0000574 CASE_UNPCK(UNPCKLPS, r)
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000575 Src2Name = getRegName(MI->getOperand(2).getReg());
576 // FALL THROUGH.
Simon Pilgrim8483df62015-11-17 22:35:45 +0000577 CASE_UNPCK(UNPCKLPS, m)
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000578 DecodeUNPCKLMask(getRegOperandVectorVT(MI, MVT::f32, 0), ShuffleMask);
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000579 Src1Name = getRegName(MI->getOperand(1).getReg());
580 DestName = getRegName(MI->getOperand(0).getReg());
581 break;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000582
Simon Pilgrim8483df62015-11-17 22:35:45 +0000583 CASE_UNPCK(UNPCKHPD, r)
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000584 Src2Name = getRegName(MI->getOperand(2).getReg());
585 // FALL THROUGH.
Simon Pilgrim8483df62015-11-17 22:35:45 +0000586 CASE_UNPCK(UNPCKHPD, m)
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000587 DecodeUNPCKHMask(getRegOperandVectorVT(MI, MVT::f64, 0), ShuffleMask);
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000588 Src1Name = getRegName(MI->getOperand(1).getReg());
589 DestName = getRegName(MI->getOperand(0).getReg());
590 break;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000591
Simon Pilgrim8483df62015-11-17 22:35:45 +0000592 CASE_UNPCK(UNPCKHPS, r)
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000593 Src2Name = getRegName(MI->getOperand(2).getReg());
594 // FALL THROUGH.
Simon Pilgrim8483df62015-11-17 22:35:45 +0000595 CASE_UNPCK(UNPCKHPS, m)
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000596 DecodeUNPCKHMask(getRegOperandVectorVT(MI, MVT::f32, 0), ShuffleMask);
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000597 Src1Name = getRegName(MI->getOperand(1).getReg());
598 DestName = getRegName(MI->getOperand(0).getReg());
599 break;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000600
Simon Pilgrim2da41782015-11-17 23:29:49 +0000601 CASE_VPERM(PERMILPS, r)
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000602 Src1Name = getRegName(MI->getOperand(1).getReg());
603 // FALL THROUGH.
Simon Pilgrim2da41782015-11-17 23:29:49 +0000604 CASE_VPERM(PERMILPS, m)
NAKAMURA Takumi5582a6a2015-05-25 01:43:34 +0000605 if (MI->getOperand(MI->getNumOperands() - 1).isImm())
Simon Pilgrim5883a732015-11-16 22:39:27 +0000606 DecodePSHUFMask(getRegOperandVectorVT(MI, MVT::f32, 0),
NAKAMURA Takumi5582a6a2015-05-25 01:43:34 +0000607 MI->getOperand(MI->getNumOperands() - 1).getImm(),
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000608 ShuffleMask);
609 DestName = getRegName(MI->getOperand(0).getReg());
610 break;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000611
Simon Pilgrim2da41782015-11-17 23:29:49 +0000612 CASE_VPERM(PERMILPD, r)
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000613 Src1Name = getRegName(MI->getOperand(1).getReg());
614 // FALL THROUGH.
Simon Pilgrim2da41782015-11-17 23:29:49 +0000615 CASE_VPERM(PERMILPD, m)
NAKAMURA Takumi5582a6a2015-05-25 01:43:34 +0000616 if (MI->getOperand(MI->getNumOperands() - 1).isImm())
Simon Pilgrim5883a732015-11-16 22:39:27 +0000617 DecodePSHUFMask(getRegOperandVectorVT(MI, MVT::f64, 0),
NAKAMURA Takumi5582a6a2015-05-25 01:43:34 +0000618 MI->getOperand(MI->getNumOperands() - 1).getImm(),
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000619 ShuffleMask);
620 DestName = getRegName(MI->getOperand(0).getReg());
621 break;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000622
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000623 case X86::VPERM2F128rr:
624 case X86::VPERM2I128rr:
625 Src2Name = getRegName(MI->getOperand(2).getReg());
626 // FALL THROUGH.
627 case X86::VPERM2F128rm:
628 case X86::VPERM2I128rm:
629 // For instruction comments purpose, assume the 256-bit vector is v4i64.
NAKAMURA Takumi5582a6a2015-05-25 01:43:34 +0000630 if (MI->getOperand(MI->getNumOperands() - 1).isImm())
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000631 DecodeVPERM2X128Mask(MVT::v4i64,
NAKAMURA Takumi5582a6a2015-05-25 01:43:34 +0000632 MI->getOperand(MI->getNumOperands() - 1).getImm(),
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000633 ShuffleMask);
634 Src1Name = getRegName(MI->getOperand(1).getReg());
635 DestName = getRegName(MI->getOperand(0).getReg());
636 break;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000637
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000638 case X86::VPERMQYri:
639 case X86::VPERMPDYri:
640 Src1Name = getRegName(MI->getOperand(1).getReg());
641 // FALL THROUGH.
642 case X86::VPERMQYmi:
643 case X86::VPERMPDYmi:
NAKAMURA Takumi5582a6a2015-05-25 01:43:34 +0000644 if (MI->getOperand(MI->getNumOperands() - 1).isImm())
645 DecodeVPERMMask(MI->getOperand(MI->getNumOperands() - 1).getImm(),
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000646 ShuffleMask);
647 DestName = getRegName(MI->getOperand(0).getReg());
648 break;
649
650 case X86::MOVSDrr:
651 case X86::VMOVSDrr:
652 Src2Name = getRegName(MI->getOperand(2).getReg());
653 Src1Name = getRegName(MI->getOperand(1).getReg());
654 // FALL THROUGH.
655 case X86::MOVSDrm:
656 case X86::VMOVSDrm:
657 DecodeScalarMoveMask(MVT::v2f64, nullptr == Src2Name, ShuffleMask);
658 DestName = getRegName(MI->getOperand(0).getReg());
659 break;
660 case X86::MOVSSrr:
661 case X86::VMOVSSrr:
662 Src2Name = getRegName(MI->getOperand(2).getReg());
663 Src1Name = getRegName(MI->getOperand(1).getReg());
664 // FALL THROUGH.
665 case X86::MOVSSrm:
666 case X86::VMOVSSrm:
667 DecodeScalarMoveMask(MVT::v4f32, nullptr == Src2Name, ShuffleMask);
668 DestName = getRegName(MI->getOperand(0).getReg());
669 break;
670
671 case X86::MOVPQI2QIrr:
672 case X86::MOVZPQILo2PQIrr:
673 case X86::VMOVPQI2QIrr:
674 case X86::VMOVZPQILo2PQIrr:
675 Src1Name = getRegName(MI->getOperand(1).getReg());
676 // FALL THROUGH.
677 case X86::MOVQI2PQIrm:
678 case X86::MOVZQI2PQIrm:
679 case X86::MOVZPQILo2PQIrm:
680 case X86::VMOVQI2PQIrm:
681 case X86::VMOVZQI2PQIrm:
682 case X86::VMOVZPQILo2PQIrm:
683 DecodeZeroMoveLowMask(MVT::v2i64, ShuffleMask);
684 DestName = getRegName(MI->getOperand(0).getReg());
685 break;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000686
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000687 case X86::MOVDI2PDIrm:
688 case X86::VMOVDI2PDIrm:
689 DecodeZeroMoveLowMask(MVT::v4i32, ShuffleMask);
690 DestName = getRegName(MI->getOperand(0).getReg());
691 break;
692
Simon Pilgrimd85cae32015-07-06 20:46:41 +0000693 case X86::EXTRQI:
694 if (MI->getOperand(2).isImm() &&
695 MI->getOperand(3).isImm())
696 DecodeEXTRQIMask(MI->getOperand(2).getImm(),
697 MI->getOperand(3).getImm(),
698 ShuffleMask);
699
700 DestName = getRegName(MI->getOperand(0).getReg());
701 Src1Name = getRegName(MI->getOperand(1).getReg());
702 break;
703
704 case X86::INSERTQI:
705 if (MI->getOperand(3).isImm() &&
706 MI->getOperand(4).isImm())
707 DecodeINSERTQIMask(MI->getOperand(3).getImm(),
708 MI->getOperand(4).getImm(),
709 ShuffleMask);
710
711 DestName = getRegName(MI->getOperand(0).getReg());
712 Src1Name = getRegName(MI->getOperand(1).getReg());
713 Src2Name = getRegName(MI->getOperand(2).getReg());
714 break;
715
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000716 case X86::PMOVZXBWrr:
717 case X86::PMOVZXBDrr:
718 case X86::PMOVZXBQrr:
719 case X86::PMOVZXWDrr:
720 case X86::PMOVZXWQrr:
721 case X86::PMOVZXDQrr:
722 case X86::VPMOVZXBWrr:
723 case X86::VPMOVZXBDrr:
724 case X86::VPMOVZXBQrr:
725 case X86::VPMOVZXWDrr:
726 case X86::VPMOVZXWQrr:
727 case X86::VPMOVZXDQrr:
728 case X86::VPMOVZXBWYrr:
729 case X86::VPMOVZXBDYrr:
730 case X86::VPMOVZXBQYrr:
731 case X86::VPMOVZXWDYrr:
732 case X86::VPMOVZXWQYrr:
733 case X86::VPMOVZXDQYrr:
734 Src1Name = getRegName(MI->getOperand(1).getReg());
735 // FALL THROUGH.
736 case X86::PMOVZXBWrm:
737 case X86::PMOVZXBDrm:
738 case X86::PMOVZXBQrm:
739 case X86::PMOVZXWDrm:
740 case X86::PMOVZXWQrm:
741 case X86::PMOVZXDQrm:
742 case X86::VPMOVZXBWrm:
743 case X86::VPMOVZXBDrm:
744 case X86::VPMOVZXBQrm:
745 case X86::VPMOVZXWDrm:
746 case X86::VPMOVZXWQrm:
747 case X86::VPMOVZXDQrm:
748 case X86::VPMOVZXBWYrm:
749 case X86::VPMOVZXBDYrm:
750 case X86::VPMOVZXBQYrm:
751 case X86::VPMOVZXWDYrm:
752 case X86::VPMOVZXWQYrm:
753 case X86::VPMOVZXDQYrm: {
754 MVT SrcVT, DstVT;
755 getZeroExtensionTypes(MI, SrcVT, DstVT);
756 DecodeZeroExtendMask(SrcVT, DstVT, ShuffleMask);
757 DestName = getRegName(MI->getOperand(0).getReg());
758 } break;
759 }
760
761 // The only comments we decode are shuffles, so give up if we were unable to
762 // decode a shuffle mask.
763 if (ShuffleMask.empty())
764 return false;
765
766 if (!DestName) DestName = Src1Name;
767 OS << (DestName ? DestName : "mem") << " = ";
768
769 // If the two sources are the same, canonicalize the input elements to be
770 // from the first src so that we get larger element spans.
771 if (Src1Name == Src2Name) {
772 for (unsigned i = 0, e = ShuffleMask.size(); i != e; ++i) {
773 if ((int)ShuffleMask[i] >= 0 && // Not sentinel.
NAKAMURA Takumi5582a6a2015-05-25 01:43:34 +0000774 ShuffleMask[i] >= (int)e) // From second mask.
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000775 ShuffleMask[i] -= e;
776 }
777 }
778
779 // The shuffle mask specifies which elements of the src1/src2 fill in the
780 // destination, with a few sentinel values. Loop through and print them
781 // out.
782 for (unsigned i = 0, e = ShuffleMask.size(); i != e; ++i) {
783 if (i != 0)
784 OS << ',';
785 if (ShuffleMask[i] == SM_SentinelZero) {
786 OS << "zero";
787 continue;
788 }
789
790 // Otherwise, it must come from src1 or src2. Print the span of elements
791 // that comes from this src.
792 bool isSrc1 = ShuffleMask[i] < (int)ShuffleMask.size();
793 const char *SrcName = isSrc1 ? Src1Name : Src2Name;
794 OS << (SrcName ? SrcName : "mem") << '[';
795 bool IsFirst = true;
796 while (i != e && (int)ShuffleMask[i] != SM_SentinelZero &&
797 (ShuffleMask[i] < (int)ShuffleMask.size()) == isSrc1) {
798 if (!IsFirst)
799 OS << ',';
800 else
801 IsFirst = false;
802 if (ShuffleMask[i] == SM_SentinelUndef)
803 OS << "u";
804 else
805 OS << ShuffleMask[i] % ShuffleMask.size();
806 ++i;
807 }
808 OS << ']';
NAKAMURA Takumi5582a6a2015-05-25 01:43:34 +0000809 --i; // For loop increments element #.
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000810 }
811 //MI->print(OS, 0);
812 OS << "\n";
813
814 // We successfully added a comment to this instruction.
815 return true;
816}