blob: 4519fe22ef7ad5344485c3daa91a55ac6c9ca1a2 [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
Igor Breger24cab0f2015-11-16 07:22:00 +0000158#define CASE_VSHUF(Inst, src) \
159 CASE_MASK_INS_COMMON(SHUFF##Inst, Z, r##src##i) \
160 CASE_MASK_INS_COMMON(SHUFI##Inst, Z, r##src##i) \
161 CASE_MASK_INS_COMMON(SHUFF##Inst, Z256, r##src##i) \
162 CASE_MASK_INS_COMMON(SHUFI##Inst, Z256, r##src##i) \
Igor Bregerd7bae452015-10-15 13:29:07 +0000163
164/// \brief Extracts the types and if it has memory operand for a given
165/// (SHUFF32x4/SHUFF64x2/SHUFI32x4/SHUFI64x2) instruction.
166static void getVSHUF64x2FamilyInfo(const MCInst *MI, MVT &VT, bool &HasMemOp) {
167 HasMemOp = false;
168 switch (MI->getOpcode()) {
169 default:
170 llvm_unreachable("Unknown VSHUF64x2 family instructions.");
171 break;
Igor Breger24cab0f2015-11-16 07:22:00 +0000172 CASE_VSHUF(64X2, m)
Igor Bregerd7bae452015-10-15 13:29:07 +0000173 HasMemOp = true; // FALL THROUGH.
Igor Breger24cab0f2015-11-16 07:22:00 +0000174 CASE_VSHUF(64X2, r)
175 VT = getRegOperandVectorVT(MI, MVT::i64, 0);
Igor Bregerd7bae452015-10-15 13:29:07 +0000176 break;
Igor Breger24cab0f2015-11-16 07:22:00 +0000177 CASE_VSHUF(32X4, m)
Igor Bregerd7bae452015-10-15 13:29:07 +0000178 HasMemOp = true; // FALL THROUGH.
Igor Breger24cab0f2015-11-16 07:22:00 +0000179 CASE_VSHUF(32X4, r)
180 VT = getRegOperandVectorVT(MI, MVT::i32, 0);
Igor Bregerd7bae452015-10-15 13:29:07 +0000181 break;
182 }
183}
184
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000185//===----------------------------------------------------------------------===//
186// Top Level Entrypoint
187//===----------------------------------------------------------------------===//
188
189/// EmitAnyX86InstComments - This function decodes x86 instructions and prints
190/// newline terminated strings to the specified string if desired. This
191/// information is shown in disassembly dumps when verbose assembly is enabled.
192bool llvm::EmitAnyX86InstComments(const MCInst *MI, raw_ostream &OS,
193 const char *(*getRegName)(unsigned)) {
194 // If this is a shuffle operation, the switch should fill in this state.
195 SmallVector<int, 8> ShuffleMask;
196 const char *DestName = nullptr, *Src1Name = nullptr, *Src2Name = nullptr;
197
198 switch (MI->getOpcode()) {
199 default:
200 // Not an instruction for which we can decode comments.
201 return false;
202
203 case X86::BLENDPDrri:
204 case X86::VBLENDPDrri:
Simon Pilgrim13d3a202015-11-16 23:03:18 +0000205 case X86::VBLENDPDYrri:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000206 Src2Name = getRegName(MI->getOperand(2).getReg());
207 // FALL THROUGH.
208 case X86::BLENDPDrmi:
209 case X86::VBLENDPDrmi:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000210 case X86::VBLENDPDYrmi:
NAKAMURA Takumi5582a6a2015-05-25 01:43:34 +0000211 if (MI->getOperand(MI->getNumOperands() - 1).isImm())
Simon Pilgrim13d3a202015-11-16 23:03:18 +0000212 DecodeBLENDMask(getRegOperandVectorVT(MI, MVT::f64, 0),
NAKAMURA Takumi5582a6a2015-05-25 01:43:34 +0000213 MI->getOperand(MI->getNumOperands() - 1).getImm(),
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000214 ShuffleMask);
215 Src1Name = getRegName(MI->getOperand(1).getReg());
216 DestName = getRegName(MI->getOperand(0).getReg());
217 break;
218
219 case X86::BLENDPSrri:
220 case X86::VBLENDPSrri:
Simon Pilgrim13d3a202015-11-16 23:03:18 +0000221 case X86::VBLENDPSYrri:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000222 Src2Name = getRegName(MI->getOperand(2).getReg());
223 // FALL THROUGH.
224 case X86::BLENDPSrmi:
225 case X86::VBLENDPSrmi:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000226 case X86::VBLENDPSYrmi:
NAKAMURA Takumi5582a6a2015-05-25 01:43:34 +0000227 if (MI->getOperand(MI->getNumOperands() - 1).isImm())
Simon Pilgrim13d3a202015-11-16 23:03:18 +0000228 DecodeBLENDMask(getRegOperandVectorVT(MI, MVT::f32, 0),
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;
234
235 case X86::PBLENDWrri:
236 case X86::VPBLENDWrri:
Simon Pilgrim13d3a202015-11-16 23:03:18 +0000237 case X86::VPBLENDWYrri:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000238 Src2Name = getRegName(MI->getOperand(2).getReg());
239 // FALL THROUGH.
240 case X86::PBLENDWrmi:
241 case X86::VPBLENDWrmi:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000242 case X86::VPBLENDWYrmi:
NAKAMURA Takumi5582a6a2015-05-25 01:43:34 +0000243 if (MI->getOperand(MI->getNumOperands() - 1).isImm())
Simon Pilgrim13d3a202015-11-16 23:03:18 +0000244 DecodeBLENDMask(getRegOperandVectorVT(MI, MVT::i16, 0),
NAKAMURA Takumi5582a6a2015-05-25 01:43:34 +0000245 MI->getOperand(MI->getNumOperands() - 1).getImm(),
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000246 ShuffleMask);
247 Src1Name = getRegName(MI->getOperand(1).getReg());
248 DestName = getRegName(MI->getOperand(0).getReg());
249 break;
250
251 case X86::VPBLENDDrri:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000252 case X86::VPBLENDDYrri:
253 Src2Name = getRegName(MI->getOperand(2).getReg());
254 // FALL THROUGH.
Simon Pilgrim13d3a202015-11-16 23:03:18 +0000255 case X86::VPBLENDDrmi:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000256 case X86::VPBLENDDYrmi:
NAKAMURA Takumi5582a6a2015-05-25 01:43:34 +0000257 if (MI->getOperand(MI->getNumOperands() - 1).isImm())
Simon Pilgrim13d3a202015-11-16 23:03:18 +0000258 DecodeBLENDMask(getRegOperandVectorVT(MI, MVT::i32, 0),
NAKAMURA Takumi5582a6a2015-05-25 01:43:34 +0000259 MI->getOperand(MI->getNumOperands() - 1).getImm(),
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000260 ShuffleMask);
261 Src1Name = getRegName(MI->getOperand(1).getReg());
262 DestName = getRegName(MI->getOperand(0).getReg());
263 break;
264
265 case X86::INSERTPSrr:
266 case X86::VINSERTPSrr:
267 Src2Name = getRegName(MI->getOperand(2).getReg());
268 // FALL THROUGH.
269 case X86::INSERTPSrm:
270 case X86::VINSERTPSrm:
271 DestName = getRegName(MI->getOperand(0).getReg());
272 Src1Name = getRegName(MI->getOperand(1).getReg());
NAKAMURA Takumi5582a6a2015-05-25 01:43:34 +0000273 if (MI->getOperand(MI->getNumOperands() - 1).isImm())
274 DecodeINSERTPSMask(MI->getOperand(MI->getNumOperands() - 1).getImm(),
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000275 ShuffleMask);
276 break;
277
278 case X86::MOVLHPSrr:
279 case X86::VMOVLHPSrr:
280 Src2Name = getRegName(MI->getOperand(2).getReg());
281 Src1Name = getRegName(MI->getOperand(1).getReg());
282 DestName = getRegName(MI->getOperand(0).getReg());
283 DecodeMOVLHPSMask(2, ShuffleMask);
284 break;
285
286 case X86::MOVHLPSrr:
287 case X86::VMOVHLPSrr:
288 Src2Name = getRegName(MI->getOperand(2).getReg());
289 Src1Name = getRegName(MI->getOperand(1).getReg());
290 DestName = getRegName(MI->getOperand(0).getReg());
291 DecodeMOVHLPSMask(2, ShuffleMask);
292 break;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000293
Igor Breger24cab0f2015-11-16 07:22:00 +0000294 CASE_MOVDUP(MOVSLDUP, r)
295 Src1Name = getRegName(MI->getOperand(MI->getNumOperands() - 1).getReg());
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000296 // FALL THROUGH.
Igor Breger24cab0f2015-11-16 07:22:00 +0000297 CASE_MOVDUP(MOVSLDUP, m) {
298 MVT VT = getRegOperandVectorVT(MI, MVT::f32, 0);
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000299 DestName = getRegName(MI->getOperand(0).getReg());
Igor Breger24cab0f2015-11-16 07:22:00 +0000300 DecodeMOVSLDUPMask(VT, ShuffleMask);
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000301 break;
Igor Breger24cab0f2015-11-16 07:22:00 +0000302 }
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000303
Igor Breger24cab0f2015-11-16 07:22:00 +0000304 CASE_MOVDUP(MOVSHDUP, r)
305 Src1Name = getRegName(MI->getOperand(MI->getNumOperands() - 1).getReg());
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000306 // FALL THROUGH.
Igor Breger24cab0f2015-11-16 07:22:00 +0000307 CASE_MOVDUP(MOVSHDUP, m) {
308 MVT VT = getRegOperandVectorVT(MI, MVT::f32, 0);
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000309 DestName = getRegName(MI->getOperand(0).getReg());
Igor Breger24cab0f2015-11-16 07:22:00 +0000310 DecodeMOVSHDUPMask(VT, ShuffleMask);
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000311 break;
Igor Breger24cab0f2015-11-16 07:22:00 +0000312 }
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000313
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000314 case X86::VMOVDDUPYrr:
315 Src1Name = getRegName(MI->getOperand(1).getReg());
316 // FALL THROUGH.
317 case X86::VMOVDDUPYrm:
318 DestName = getRegName(MI->getOperand(0).getReg());
319 DecodeMOVDDUPMask(MVT::v4f64, ShuffleMask);
320 break;
321
322 case X86::MOVDDUPrr:
323 case X86::VMOVDDUPrr:
324 Src1Name = getRegName(MI->getOperand(1).getReg());
325 // FALL THROUGH.
326 case X86::MOVDDUPrm:
327 case X86::VMOVDDUPrm:
328 DestName = getRegName(MI->getOperand(0).getReg());
329 DecodeMOVDDUPMask(MVT::v2f64, ShuffleMask);
330 break;
331
332 case X86::PSLLDQri:
333 case X86::VPSLLDQri:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000334 case X86::VPSLLDQYri:
335 Src1Name = getRegName(MI->getOperand(1).getReg());
336 DestName = getRegName(MI->getOperand(0).getReg());
NAKAMURA Takumi5582a6a2015-05-25 01:43:34 +0000337 if (MI->getOperand(MI->getNumOperands() - 1).isImm())
Simon Pilgrimb9ada272015-11-16 22:54:41 +0000338 DecodePSLLDQMask(getRegOperandVectorVT(MI, MVT::i8, 0),
NAKAMURA Takumi5582a6a2015-05-25 01:43:34 +0000339 MI->getOperand(MI->getNumOperands() - 1).getImm(),
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000340 ShuffleMask);
341 break;
342
343 case X86::PSRLDQri:
344 case X86::VPSRLDQri:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000345 case X86::VPSRLDQYri:
346 Src1Name = getRegName(MI->getOperand(1).getReg());
347 DestName = getRegName(MI->getOperand(0).getReg());
NAKAMURA Takumi5582a6a2015-05-25 01:43:34 +0000348 if (MI->getOperand(MI->getNumOperands() - 1).isImm())
Simon Pilgrimb9ada272015-11-16 22:54:41 +0000349 DecodePSRLDQMask(getRegOperandVectorVT(MI, MVT::i8, 0),
NAKAMURA Takumi5582a6a2015-05-25 01:43:34 +0000350 MI->getOperand(MI->getNumOperands() - 1).getImm(),
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000351 ShuffleMask);
352 break;
353
354 case X86::PALIGNR128rr:
355 case X86::VPALIGNR128rr:
Simon Pilgrimb9ada272015-11-16 22:54:41 +0000356 case X86::VPALIGNR256rr:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000357 Src1Name = getRegName(MI->getOperand(2).getReg());
358 // FALL THROUGH.
359 case X86::PALIGNR128rm:
360 case X86::VPALIGNR128rm:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000361 case X86::VPALIGNR256rm:
362 Src2Name = getRegName(MI->getOperand(1).getReg());
363 DestName = getRegName(MI->getOperand(0).getReg());
NAKAMURA Takumi5582a6a2015-05-25 01:43:34 +0000364 if (MI->getOperand(MI->getNumOperands() - 1).isImm())
Simon Pilgrimb9ada272015-11-16 22:54:41 +0000365 DecodePALIGNRMask(getRegOperandVectorVT(MI, MVT::i8, 0),
NAKAMURA Takumi5582a6a2015-05-25 01:43:34 +0000366 MI->getOperand(MI->getNumOperands() - 1).getImm(),
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000367 ShuffleMask);
368 break;
369
370 case X86::PSHUFDri:
371 case X86::VPSHUFDri:
Simon Pilgrim5883a732015-11-16 22:39:27 +0000372 case X86::VPSHUFDYri:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000373 Src1Name = getRegName(MI->getOperand(1).getReg());
374 // FALL THROUGH.
375 case X86::PSHUFDmi:
376 case X86::VPSHUFDmi:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000377 case X86::VPSHUFDYmi:
378 DestName = getRegName(MI->getOperand(0).getReg());
NAKAMURA Takumi5582a6a2015-05-25 01:43:34 +0000379 if (MI->getOperand(MI->getNumOperands() - 1).isImm())
Simon Pilgrim5883a732015-11-16 22:39:27 +0000380 DecodePSHUFMask(getRegOperandVectorVT(MI, MVT::i32, 0),
NAKAMURA Takumi5582a6a2015-05-25 01:43:34 +0000381 MI->getOperand(MI->getNumOperands() - 1).getImm(),
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000382 ShuffleMask);
383 break;
384
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000385 case X86::PSHUFHWri:
386 case X86::VPSHUFHWri:
Simon Pilgrim5883a732015-11-16 22:39:27 +0000387 case X86::VPSHUFHWYri:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000388 Src1Name = getRegName(MI->getOperand(1).getReg());
389 // FALL THROUGH.
390 case X86::PSHUFHWmi:
391 case X86::VPSHUFHWmi:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000392 case X86::VPSHUFHWYmi:
393 DestName = getRegName(MI->getOperand(0).getReg());
NAKAMURA Takumi5582a6a2015-05-25 01:43:34 +0000394 if (MI->getOperand(MI->getNumOperands() - 1).isImm())
Simon Pilgrim5883a732015-11-16 22:39:27 +0000395 DecodePSHUFHWMask(getRegOperandVectorVT(MI, MVT::i16, 0),
NAKAMURA Takumi5582a6a2015-05-25 01:43:34 +0000396 MI->getOperand(MI->getNumOperands() - 1).getImm(),
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000397 ShuffleMask);
398 break;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000399
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000400 case X86::PSHUFLWri:
401 case X86::VPSHUFLWri:
Simon Pilgrim5883a732015-11-16 22:39:27 +0000402 case X86::VPSHUFLWYri:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000403 Src1Name = getRegName(MI->getOperand(1).getReg());
404 // FALL THROUGH.
405 case X86::PSHUFLWmi:
406 case X86::VPSHUFLWmi:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000407 case X86::VPSHUFLWYmi:
408 DestName = getRegName(MI->getOperand(0).getReg());
NAKAMURA Takumi5582a6a2015-05-25 01:43:34 +0000409 if (MI->getOperand(MI->getNumOperands() - 1).isImm())
Simon Pilgrim5883a732015-11-16 22:39:27 +0000410 DecodePSHUFLWMask(getRegOperandVectorVT(MI, MVT::i16, 0),
NAKAMURA Takumi5582a6a2015-05-25 01:43:34 +0000411 MI->getOperand(MI->getNumOperands() - 1).getImm(),
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000412 ShuffleMask);
413 break;
414
Simon Pilgrimf8f86ab2015-09-13 11:28:45 +0000415 case X86::MMX_PSHUFWri:
416 Src1Name = getRegName(MI->getOperand(1).getReg());
417 // FALL THROUGH.
418 case X86::MMX_PSHUFWmi:
419 DestName = getRegName(MI->getOperand(0).getReg());
420 if (MI->getOperand(MI->getNumOperands() - 1).isImm())
421 DecodePSHUFMask(MVT::v4i16,
422 MI->getOperand(MI->getNumOperands() - 1).getImm(),
423 ShuffleMask);
424 break;
425
426 case X86::PSWAPDrr:
427 Src1Name = getRegName(MI->getOperand(1).getReg());
428 // FALL THROUGH.
429 case X86::PSWAPDrm:
430 DestName = getRegName(MI->getOperand(0).getReg());
431 DecodePSWAPMask(MVT::v2i32, ShuffleMask);
432 break;
433
Simon Pilgrim8483df62015-11-17 22:35:45 +0000434 CASE_UNPCK(PUNPCKHBW, r)
Simon Pilgrimf8f86ab2015-09-13 11:28:45 +0000435 case X86::MMX_PUNPCKHBWirr:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000436 Src2Name = getRegName(MI->getOperand(2).getReg());
437 // FALL THROUGH.
Simon Pilgrim8483df62015-11-17 22:35:45 +0000438 CASE_UNPCK(PUNPCKHBW, m)
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000439 case X86::MMX_PUNPCKHBWirm:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000440 Src1Name = getRegName(MI->getOperand(1).getReg());
441 DestName = getRegName(MI->getOperand(0).getReg());
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000442 DecodeUNPCKHMask(getRegOperandVectorVT(MI, MVT::i8, 0), ShuffleMask);
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000443 break;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000444
Simon Pilgrim8483df62015-11-17 22:35:45 +0000445 CASE_UNPCK(PUNPCKHWD, r)
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000446 case X86::MMX_PUNPCKHWDirr:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000447 Src2Name = getRegName(MI->getOperand(2).getReg());
448 // FALL THROUGH.
Simon Pilgrim8483df62015-11-17 22:35:45 +0000449 CASE_UNPCK(PUNPCKHWD, m)
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000450 case X86::MMX_PUNPCKHWDirm:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000451 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
Simon Pilgrim8483df62015-11-17 22:35:45 +0000456 CASE_UNPCK(PUNPCKHDQ, r)
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000457 case X86::MMX_PUNPCKHDQirr:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000458 Src2Name = getRegName(MI->getOperand(2).getReg());
459 // FALL THROUGH.
Simon Pilgrim8483df62015-11-17 22:35:45 +0000460 CASE_UNPCK(PUNPCKHDQ, m)
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000461 case X86::MMX_PUNPCKHDQirm:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000462 Src1Name = getRegName(MI->getOperand(1).getReg());
463 DestName = getRegName(MI->getOperand(0).getReg());
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000464 DecodeUNPCKHMask(getRegOperandVectorVT(MI, MVT::i32, 0), ShuffleMask);
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000465 break;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000466
Simon Pilgrim8483df62015-11-17 22:35:45 +0000467 CASE_UNPCK(PUNPCKHQDQ, r)
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000468 Src2Name = getRegName(MI->getOperand(2).getReg());
469 // FALL THROUGH.
Simon Pilgrim8483df62015-11-17 22:35:45 +0000470 CASE_UNPCK(PUNPCKHQDQ, m)
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000471 Src1Name = getRegName(MI->getOperand(1).getReg());
472 DestName = getRegName(MI->getOperand(0).getReg());
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000473 DecodeUNPCKHMask(getRegOperandVectorVT(MI, MVT::i64, 0), ShuffleMask);
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000474 break;
475
Simon Pilgrim8483df62015-11-17 22:35:45 +0000476 CASE_UNPCK(PUNPCKLBW, r)
Simon Pilgrimf8f86ab2015-09-13 11:28:45 +0000477 case X86::MMX_PUNPCKLBWirr:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000478 Src2Name = getRegName(MI->getOperand(2).getReg());
479 // FALL THROUGH.
Simon Pilgrim8483df62015-11-17 22:35:45 +0000480 CASE_UNPCK(PUNPCKLBW, m)
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000481 case X86::MMX_PUNPCKLBWirm:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000482 Src1Name = getRegName(MI->getOperand(1).getReg());
483 DestName = getRegName(MI->getOperand(0).getReg());
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000484 DecodeUNPCKLMask(getRegOperandVectorVT(MI, MVT::i8, 0), ShuffleMask);
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000485 break;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000486
Simon Pilgrim8483df62015-11-17 22:35:45 +0000487 CASE_UNPCK(PUNPCKLWD, r)
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000488 case X86::MMX_PUNPCKLWDirr:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000489 Src2Name = getRegName(MI->getOperand(2).getReg());
490 // FALL THROUGH.
Simon Pilgrim8483df62015-11-17 22:35:45 +0000491 CASE_UNPCK(PUNPCKLWD, m)
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000492 case X86::MMX_PUNPCKLWDirm:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000493 Src1Name = getRegName(MI->getOperand(1).getReg());
494 DestName = getRegName(MI->getOperand(0).getReg());
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000495 DecodeUNPCKLMask(getRegOperandVectorVT(MI, MVT::i16, 0), ShuffleMask);
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000496 break;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000497
Simon Pilgrim8483df62015-11-17 22:35:45 +0000498 CASE_UNPCK(PUNPCKLDQ, r)
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000499 case X86::MMX_PUNPCKLDQirr:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000500 Src2Name = getRegName(MI->getOperand(2).getReg());
501 // FALL THROUGH.
Simon Pilgrim8483df62015-11-17 22:35:45 +0000502 CASE_UNPCK(PUNPCKLDQ, m)
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000503 case X86::MMX_PUNPCKLDQirm:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000504 Src1Name = getRegName(MI->getOperand(1).getReg());
505 DestName = getRegName(MI->getOperand(0).getReg());
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000506 DecodeUNPCKLMask(getRegOperandVectorVT(MI, MVT::i32, 0), ShuffleMask);
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000507 break;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000508
Simon Pilgrim8483df62015-11-17 22:35:45 +0000509 CASE_UNPCK(PUNPCKLQDQ, r)
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000510 Src2Name = getRegName(MI->getOperand(2).getReg());
511 // FALL THROUGH.
Simon Pilgrim8483df62015-11-17 22:35:45 +0000512 CASE_UNPCK(PUNPCKLQDQ, m)
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000513 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::i64, 0), ShuffleMask);
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000516 break;
517
518 case X86::SHUFPDrri:
519 case X86::VSHUFPDrri:
Simon Pilgrim5883a732015-11-16 22:39:27 +0000520 case X86::VSHUFPDYrri:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000521 Src2Name = getRegName(MI->getOperand(2).getReg());
522 // FALL THROUGH.
523 case X86::SHUFPDrmi:
524 case X86::VSHUFPDrmi:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000525 case X86::VSHUFPDYrmi:
NAKAMURA Takumi5582a6a2015-05-25 01:43:34 +0000526 if (MI->getOperand(MI->getNumOperands() - 1).isImm())
Simon Pilgrim5883a732015-11-16 22:39:27 +0000527 DecodeSHUFPMask(getRegOperandVectorVT(MI, MVT::f64, 0),
NAKAMURA Takumi5582a6a2015-05-25 01:43:34 +0000528 MI->getOperand(MI->getNumOperands() - 1).getImm(),
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000529 ShuffleMask);
530 Src1Name = getRegName(MI->getOperand(1).getReg());
531 DestName = getRegName(MI->getOperand(0).getReg());
532 break;
533
534 case X86::SHUFPSrri:
535 case X86::VSHUFPSrri:
Simon Pilgrim5883a732015-11-16 22:39:27 +0000536 case X86::VSHUFPSYrri:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000537 Src2Name = getRegName(MI->getOperand(2).getReg());
538 // FALL THROUGH.
539 case X86::SHUFPSrmi:
540 case X86::VSHUFPSrmi:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000541 case X86::VSHUFPSYrmi:
NAKAMURA Takumi5582a6a2015-05-25 01:43:34 +0000542 if (MI->getOperand(MI->getNumOperands() - 1).isImm())
Simon Pilgrim5883a732015-11-16 22:39:27 +0000543 DecodeSHUFPMask(getRegOperandVectorVT(MI, MVT::f32, 0),
NAKAMURA Takumi5582a6a2015-05-25 01:43:34 +0000544 MI->getOperand(MI->getNumOperands() - 1).getImm(),
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000545 ShuffleMask);
546 Src1Name = getRegName(MI->getOperand(1).getReg());
547 DestName = getRegName(MI->getOperand(0).getReg());
548 break;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000549
Igor Breger24cab0f2015-11-16 07:22:00 +0000550 CASE_VSHUF(64X2, r)
551 CASE_VSHUF(64X2, m)
552 CASE_VSHUF(32X4, r)
553 CASE_VSHUF(32X4, m) {
Igor Bregerd7bae452015-10-15 13:29:07 +0000554 MVT VT;
555 bool HasMemOp;
556 unsigned NumOp = MI->getNumOperands();
557 getVSHUF64x2FamilyInfo(MI, VT, HasMemOp);
558 decodeVSHUF64x2FamilyMask(VT, MI->getOperand(NumOp - 1).getImm(),
559 ShuffleMask);
560 DestName = getRegName(MI->getOperand(0).getReg());
561 if (HasMemOp) {
562 assert((NumOp >= 8) && "Expected at least 8 operands!");
563 Src1Name = getRegName(MI->getOperand(NumOp - 7).getReg());
564 } else {
565 assert((NumOp >= 4) && "Expected at least 4 operands!");
566 Src2Name = getRegName(MI->getOperand(NumOp - 2).getReg());
567 Src1Name = getRegName(MI->getOperand(NumOp - 3).getReg());
568 }
569 break;
570 }
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000571
Simon Pilgrim8483df62015-11-17 22:35:45 +0000572 CASE_UNPCK(UNPCKLPD, r)
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000573 Src2Name = getRegName(MI->getOperand(2).getReg());
574 // FALL THROUGH.
Simon Pilgrim8483df62015-11-17 22:35:45 +0000575 CASE_UNPCK(UNPCKLPD, m)
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000576 DecodeUNPCKLMask(getRegOperandVectorVT(MI, MVT::f64, 0), ShuffleMask);
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000577 Src1Name = getRegName(MI->getOperand(1).getReg());
578 DestName = getRegName(MI->getOperand(0).getReg());
579 break;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000580
Simon Pilgrim8483df62015-11-17 22:35:45 +0000581 CASE_UNPCK(UNPCKLPS, r)
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000582 Src2Name = getRegName(MI->getOperand(2).getReg());
583 // FALL THROUGH.
Simon Pilgrim8483df62015-11-17 22:35:45 +0000584 CASE_UNPCK(UNPCKLPS, m)
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000585 DecodeUNPCKLMask(getRegOperandVectorVT(MI, MVT::f32, 0), ShuffleMask);
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000586 Src1Name = getRegName(MI->getOperand(1).getReg());
587 DestName = getRegName(MI->getOperand(0).getReg());
588 break;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000589
Simon Pilgrim8483df62015-11-17 22:35:45 +0000590 CASE_UNPCK(UNPCKHPD, r)
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000591 Src2Name = getRegName(MI->getOperand(2).getReg());
592 // FALL THROUGH.
Simon Pilgrim8483df62015-11-17 22:35:45 +0000593 CASE_UNPCK(UNPCKHPD, m)
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000594 DecodeUNPCKHMask(getRegOperandVectorVT(MI, MVT::f64, 0), ShuffleMask);
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000595 Src1Name = getRegName(MI->getOperand(1).getReg());
596 DestName = getRegName(MI->getOperand(0).getReg());
597 break;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000598
Simon Pilgrim8483df62015-11-17 22:35:45 +0000599 CASE_UNPCK(UNPCKHPS, r)
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000600 Src2Name = getRegName(MI->getOperand(2).getReg());
601 // FALL THROUGH.
Simon Pilgrim8483df62015-11-17 22:35:45 +0000602 CASE_UNPCK(UNPCKHPS, m)
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000603 DecodeUNPCKHMask(getRegOperandVectorVT(MI, MVT::f32, 0), ShuffleMask);
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000604 Src1Name = getRegName(MI->getOperand(1).getReg());
605 DestName = getRegName(MI->getOperand(0).getReg());
606 break;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000607
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000608 case X86::VPERMILPSri:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000609 case X86::VPERMILPSYri:
610 Src1Name = getRegName(MI->getOperand(1).getReg());
611 // FALL THROUGH.
Simon Pilgrim5883a732015-11-16 22:39:27 +0000612 case X86::VPERMILPSmi:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000613 case X86::VPERMILPSYmi:
NAKAMURA Takumi5582a6a2015-05-25 01:43:34 +0000614 if (MI->getOperand(MI->getNumOperands() - 1).isImm())
Simon Pilgrim5883a732015-11-16 22:39:27 +0000615 DecodePSHUFMask(getRegOperandVectorVT(MI, MVT::f32, 0),
NAKAMURA Takumi5582a6a2015-05-25 01:43:34 +0000616 MI->getOperand(MI->getNumOperands() - 1).getImm(),
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000617 ShuffleMask);
618 DestName = getRegName(MI->getOperand(0).getReg());
619 break;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000620
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000621 case X86::VPERMILPDri:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000622 case X86::VPERMILPDYri:
623 Src1Name = getRegName(MI->getOperand(1).getReg());
624 // FALL THROUGH.
Simon Pilgrim5883a732015-11-16 22:39:27 +0000625 case X86::VPERMILPDmi:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000626 case X86::VPERMILPDYmi:
NAKAMURA Takumi5582a6a2015-05-25 01:43:34 +0000627 if (MI->getOperand(MI->getNumOperands() - 1).isImm())
Simon Pilgrim5883a732015-11-16 22:39:27 +0000628 DecodePSHUFMask(getRegOperandVectorVT(MI, MVT::f64, 0),
NAKAMURA Takumi5582a6a2015-05-25 01:43:34 +0000629 MI->getOperand(MI->getNumOperands() - 1).getImm(),
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000630 ShuffleMask);
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::VPERM2F128rr:
635 case X86::VPERM2I128rr:
636 Src2Name = getRegName(MI->getOperand(2).getReg());
637 // FALL THROUGH.
638 case X86::VPERM2F128rm:
639 case X86::VPERM2I128rm:
640 // For instruction comments purpose, assume the 256-bit vector is v4i64.
NAKAMURA Takumi5582a6a2015-05-25 01:43:34 +0000641 if (MI->getOperand(MI->getNumOperands() - 1).isImm())
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000642 DecodeVPERM2X128Mask(MVT::v4i64,
NAKAMURA Takumi5582a6a2015-05-25 01:43:34 +0000643 MI->getOperand(MI->getNumOperands() - 1).getImm(),
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000644 ShuffleMask);
645 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::VPERMQYri:
650 case X86::VPERMPDYri:
651 Src1Name = getRegName(MI->getOperand(1).getReg());
652 // FALL THROUGH.
653 case X86::VPERMQYmi:
654 case X86::VPERMPDYmi:
NAKAMURA Takumi5582a6a2015-05-25 01:43:34 +0000655 if (MI->getOperand(MI->getNumOperands() - 1).isImm())
656 DecodeVPERMMask(MI->getOperand(MI->getNumOperands() - 1).getImm(),
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000657 ShuffleMask);
658 DestName = getRegName(MI->getOperand(0).getReg());
659 break;
660
661 case X86::MOVSDrr:
662 case X86::VMOVSDrr:
663 Src2Name = getRegName(MI->getOperand(2).getReg());
664 Src1Name = getRegName(MI->getOperand(1).getReg());
665 // FALL THROUGH.
666 case X86::MOVSDrm:
667 case X86::VMOVSDrm:
668 DecodeScalarMoveMask(MVT::v2f64, nullptr == Src2Name, ShuffleMask);
669 DestName = getRegName(MI->getOperand(0).getReg());
670 break;
671 case X86::MOVSSrr:
672 case X86::VMOVSSrr:
673 Src2Name = getRegName(MI->getOperand(2).getReg());
674 Src1Name = getRegName(MI->getOperand(1).getReg());
675 // FALL THROUGH.
676 case X86::MOVSSrm:
677 case X86::VMOVSSrm:
678 DecodeScalarMoveMask(MVT::v4f32, nullptr == Src2Name, ShuffleMask);
679 DestName = getRegName(MI->getOperand(0).getReg());
680 break;
681
682 case X86::MOVPQI2QIrr:
683 case X86::MOVZPQILo2PQIrr:
684 case X86::VMOVPQI2QIrr:
685 case X86::VMOVZPQILo2PQIrr:
686 Src1Name = getRegName(MI->getOperand(1).getReg());
687 // FALL THROUGH.
688 case X86::MOVQI2PQIrm:
689 case X86::MOVZQI2PQIrm:
690 case X86::MOVZPQILo2PQIrm:
691 case X86::VMOVQI2PQIrm:
692 case X86::VMOVZQI2PQIrm:
693 case X86::VMOVZPQILo2PQIrm:
694 DecodeZeroMoveLowMask(MVT::v2i64, ShuffleMask);
695 DestName = getRegName(MI->getOperand(0).getReg());
696 break;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000697
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000698 case X86::MOVDI2PDIrm:
699 case X86::VMOVDI2PDIrm:
700 DecodeZeroMoveLowMask(MVT::v4i32, ShuffleMask);
701 DestName = getRegName(MI->getOperand(0).getReg());
702 break;
703
Simon Pilgrimd85cae32015-07-06 20:46:41 +0000704 case X86::EXTRQI:
705 if (MI->getOperand(2).isImm() &&
706 MI->getOperand(3).isImm())
707 DecodeEXTRQIMask(MI->getOperand(2).getImm(),
708 MI->getOperand(3).getImm(),
709 ShuffleMask);
710
711 DestName = getRegName(MI->getOperand(0).getReg());
712 Src1Name = getRegName(MI->getOperand(1).getReg());
713 break;
714
715 case X86::INSERTQI:
716 if (MI->getOperand(3).isImm() &&
717 MI->getOperand(4).isImm())
718 DecodeINSERTQIMask(MI->getOperand(3).getImm(),
719 MI->getOperand(4).getImm(),
720 ShuffleMask);
721
722 DestName = getRegName(MI->getOperand(0).getReg());
723 Src1Name = getRegName(MI->getOperand(1).getReg());
724 Src2Name = getRegName(MI->getOperand(2).getReg());
725 break;
726
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000727 case X86::PMOVZXBWrr:
728 case X86::PMOVZXBDrr:
729 case X86::PMOVZXBQrr:
730 case X86::PMOVZXWDrr:
731 case X86::PMOVZXWQrr:
732 case X86::PMOVZXDQrr:
733 case X86::VPMOVZXBWrr:
734 case X86::VPMOVZXBDrr:
735 case X86::VPMOVZXBQrr:
736 case X86::VPMOVZXWDrr:
737 case X86::VPMOVZXWQrr:
738 case X86::VPMOVZXDQrr:
739 case X86::VPMOVZXBWYrr:
740 case X86::VPMOVZXBDYrr:
741 case X86::VPMOVZXBQYrr:
742 case X86::VPMOVZXWDYrr:
743 case X86::VPMOVZXWQYrr:
744 case X86::VPMOVZXDQYrr:
745 Src1Name = getRegName(MI->getOperand(1).getReg());
746 // FALL THROUGH.
747 case X86::PMOVZXBWrm:
748 case X86::PMOVZXBDrm:
749 case X86::PMOVZXBQrm:
750 case X86::PMOVZXWDrm:
751 case X86::PMOVZXWQrm:
752 case X86::PMOVZXDQrm:
753 case X86::VPMOVZXBWrm:
754 case X86::VPMOVZXBDrm:
755 case X86::VPMOVZXBQrm:
756 case X86::VPMOVZXWDrm:
757 case X86::VPMOVZXWQrm:
758 case X86::VPMOVZXDQrm:
759 case X86::VPMOVZXBWYrm:
760 case X86::VPMOVZXBDYrm:
761 case X86::VPMOVZXBQYrm:
762 case X86::VPMOVZXWDYrm:
763 case X86::VPMOVZXWQYrm:
764 case X86::VPMOVZXDQYrm: {
765 MVT SrcVT, DstVT;
766 getZeroExtensionTypes(MI, SrcVT, DstVT);
767 DecodeZeroExtendMask(SrcVT, DstVT, ShuffleMask);
768 DestName = getRegName(MI->getOperand(0).getReg());
769 } break;
770 }
771
772 // The only comments we decode are shuffles, so give up if we were unable to
773 // decode a shuffle mask.
774 if (ShuffleMask.empty())
775 return false;
776
777 if (!DestName) DestName = Src1Name;
778 OS << (DestName ? DestName : "mem") << " = ";
779
780 // If the two sources are the same, canonicalize the input elements to be
781 // from the first src so that we get larger element spans.
782 if (Src1Name == Src2Name) {
783 for (unsigned i = 0, e = ShuffleMask.size(); i != e; ++i) {
784 if ((int)ShuffleMask[i] >= 0 && // Not sentinel.
NAKAMURA Takumi5582a6a2015-05-25 01:43:34 +0000785 ShuffleMask[i] >= (int)e) // From second mask.
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000786 ShuffleMask[i] -= e;
787 }
788 }
789
790 // The shuffle mask specifies which elements of the src1/src2 fill in the
791 // destination, with a few sentinel values. Loop through and print them
792 // out.
793 for (unsigned i = 0, e = ShuffleMask.size(); i != e; ++i) {
794 if (i != 0)
795 OS << ',';
796 if (ShuffleMask[i] == SM_SentinelZero) {
797 OS << "zero";
798 continue;
799 }
800
801 // Otherwise, it must come from src1 or src2. Print the span of elements
802 // that comes from this src.
803 bool isSrc1 = ShuffleMask[i] < (int)ShuffleMask.size();
804 const char *SrcName = isSrc1 ? Src1Name : Src2Name;
805 OS << (SrcName ? SrcName : "mem") << '[';
806 bool IsFirst = true;
807 while (i != e && (int)ShuffleMask[i] != SM_SentinelZero &&
808 (ShuffleMask[i] < (int)ShuffleMask.size()) == isSrc1) {
809 if (!IsFirst)
810 OS << ',';
811 else
812 IsFirst = false;
813 if (ShuffleMask[i] == SM_SentinelUndef)
814 OS << "u";
815 else
816 OS << ShuffleMask[i] % ShuffleMask.size();
817 ++i;
818 }
819 OS << ']';
NAKAMURA Takumi5582a6a2015-05-25 01:43:34 +0000820 --i; // For loop increments element #.
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000821 }
822 //MI->print(OS, 0);
823 OS << "\n";
824
825 // We successfully added a comment to this instruction.
826 return true;
827}