blob: a901fba1707538ea3d28a6d56513805b0131854a [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!");
Igor Breger24cab0f2015-11-16 07:22:00 +000035}
36
37static MVT getRegOperandVectorVT(const MCInst *MI, const MVT &ScalarVT,
38 unsigned OperandIndex) {
39 unsigned OpReg = MI->getOperand(OperandIndex).getReg();
40 return MVT::getVectorVT(ScalarVT,
41 getVectorRegSize(OpReg)/ScalarVT.getSizeInBits());
42}
43
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +000044/// \brief Extracts the src/dst types for a given zero extension instruction.
45/// \note While the number of elements in DstVT type correct, the
46/// number in the SrcVT type is expanded to fill the src xmm register and the
47/// upper elements may not be included in the dst xmm/ymm register.
48static void getZeroExtensionTypes(const MCInst *MI, MVT &SrcVT, MVT &DstVT) {
49 switch (MI->getOpcode()) {
50 default:
51 llvm_unreachable("Unknown zero extension instruction");
52 // i8 zero extension
53 case X86::PMOVZXBWrm:
54 case X86::PMOVZXBWrr:
55 case X86::VPMOVZXBWrm:
56 case X86::VPMOVZXBWrr:
57 SrcVT = MVT::v16i8;
58 DstVT = MVT::v8i16;
59 break;
60 case X86::VPMOVZXBWYrm:
61 case X86::VPMOVZXBWYrr:
62 SrcVT = MVT::v16i8;
63 DstVT = MVT::v16i16;
64 break;
65 case X86::PMOVZXBDrm:
66 case X86::PMOVZXBDrr:
67 case X86::VPMOVZXBDrm:
68 case X86::VPMOVZXBDrr:
69 SrcVT = MVT::v16i8;
70 DstVT = MVT::v4i32;
71 break;
72 case X86::VPMOVZXBDYrm:
73 case X86::VPMOVZXBDYrr:
74 SrcVT = MVT::v16i8;
75 DstVT = MVT::v8i32;
76 break;
77 case X86::PMOVZXBQrm:
78 case X86::PMOVZXBQrr:
79 case X86::VPMOVZXBQrm:
80 case X86::VPMOVZXBQrr:
81 SrcVT = MVT::v16i8;
82 DstVT = MVT::v2i64;
83 break;
84 case X86::VPMOVZXBQYrm:
85 case X86::VPMOVZXBQYrr:
86 SrcVT = MVT::v16i8;
87 DstVT = MVT::v4i64;
88 break;
89 // i16 zero extension
90 case X86::PMOVZXWDrm:
91 case X86::PMOVZXWDrr:
92 case X86::VPMOVZXWDrm:
93 case X86::VPMOVZXWDrr:
94 SrcVT = MVT::v8i16;
95 DstVT = MVT::v4i32;
96 break;
97 case X86::VPMOVZXWDYrm:
98 case X86::VPMOVZXWDYrr:
99 SrcVT = MVT::v8i16;
100 DstVT = MVT::v8i32;
101 break;
102 case X86::PMOVZXWQrm:
103 case X86::PMOVZXWQrr:
104 case X86::VPMOVZXWQrm:
105 case X86::VPMOVZXWQrr:
106 SrcVT = MVT::v8i16;
107 DstVT = MVT::v2i64;
108 break;
109 case X86::VPMOVZXWQYrm:
110 case X86::VPMOVZXWQYrr:
111 SrcVT = MVT::v8i16;
112 DstVT = MVT::v4i64;
113 break;
114 // i32 zero extension
115 case X86::PMOVZXDQrm:
116 case X86::PMOVZXDQrr:
117 case X86::VPMOVZXDQrm:
118 case X86::VPMOVZXDQrr:
119 SrcVT = MVT::v4i32;
120 DstVT = MVT::v2i64;
121 break;
122 case X86::VPMOVZXDQYrm:
123 case X86::VPMOVZXDQYrr:
124 SrcVT = MVT::v4i32;
125 DstVT = MVT::v4i64;
126 break;
127 }
128}
129
Igor Breger24cab0f2015-11-16 07:22:00 +0000130#define CASE_MASK_INS_COMMON(Inst, Suffix, src) \
131 case X86::V##Inst##Suffix##src: \
132 case X86::V##Inst##Suffix##src##k: \
133 case X86::V##Inst##Suffix##src##kz:
Igor Bregerd7bae452015-10-15 13:29:07 +0000134
Igor Breger24cab0f2015-11-16 07:22:00 +0000135#define CASE_SSE_INS_COMMON(Inst, src) \
136 case X86::Inst##src:
137
138#define CASE_AVX_INS_COMMON(Inst, Suffix, src) \
139 case X86::V##Inst##Suffix##src:
140
141#define CASE_MOVDUP(Inst, src) \
142 CASE_MASK_INS_COMMON(Inst, Z, r##src) \
143 CASE_MASK_INS_COMMON(Inst, Z256, r##src) \
144 CASE_MASK_INS_COMMON(Inst, Z128, r##src) \
145 CASE_AVX_INS_COMMON(Inst, , r##src) \
146 CASE_AVX_INS_COMMON(Inst, Y, r##src) \
147 CASE_SSE_INS_COMMON(Inst, r##src) \
148
Simon Pilgrim8483df62015-11-17 22:35:45 +0000149#define CASE_UNPCK(Inst, src) \
150 CASE_MASK_INS_COMMON(Inst, Z, r##src) \
151 CASE_MASK_INS_COMMON(Inst, Z256, r##src) \
152 CASE_MASK_INS_COMMON(Inst, Z128, r##src) \
153 CASE_AVX_INS_COMMON(Inst, , r##src) \
154 CASE_AVX_INS_COMMON(Inst, Y, r##src) \
155 CASE_SSE_INS_COMMON(Inst, r##src) \
156
Simon Pilgrim2da41782015-11-17 23:29:49 +0000157#define CASE_SHUF(Inst, src) \
158 CASE_MASK_INS_COMMON(Inst, Z, r##src##i) \
159 CASE_MASK_INS_COMMON(Inst, Z256, r##src##i) \
160 CASE_MASK_INS_COMMON(Inst, Z128, r##src##i) \
161 CASE_AVX_INS_COMMON(Inst, , r##src##i) \
162 CASE_AVX_INS_COMMON(Inst, Y, r##src##i) \
163 CASE_SSE_INS_COMMON(Inst, r##src##i) \
164
165#define CASE_VPERM(Inst, src) \
166 CASE_MASK_INS_COMMON(Inst, Z, src##i) \
167 CASE_MASK_INS_COMMON(Inst, Z256, src##i) \
168 CASE_MASK_INS_COMMON(Inst, Z128, src##i) \
169 CASE_AVX_INS_COMMON(Inst, , src##i) \
170 CASE_AVX_INS_COMMON(Inst, Y, src##i) \
171
Igor Breger24cab0f2015-11-16 07:22:00 +0000172#define CASE_VSHUF(Inst, src) \
173 CASE_MASK_INS_COMMON(SHUFF##Inst, Z, r##src##i) \
174 CASE_MASK_INS_COMMON(SHUFI##Inst, Z, r##src##i) \
175 CASE_MASK_INS_COMMON(SHUFF##Inst, Z256, r##src##i) \
176 CASE_MASK_INS_COMMON(SHUFI##Inst, Z256, r##src##i) \
Igor Bregerd7bae452015-10-15 13:29:07 +0000177
178/// \brief Extracts the types and if it has memory operand for a given
179/// (SHUFF32x4/SHUFF64x2/SHUFI32x4/SHUFI64x2) instruction.
180static void getVSHUF64x2FamilyInfo(const MCInst *MI, MVT &VT, bool &HasMemOp) {
181 HasMemOp = false;
182 switch (MI->getOpcode()) {
183 default:
184 llvm_unreachable("Unknown VSHUF64x2 family instructions.");
185 break;
Igor Breger24cab0f2015-11-16 07:22:00 +0000186 CASE_VSHUF(64X2, m)
Igor Bregerd7bae452015-10-15 13:29:07 +0000187 HasMemOp = true; // FALL THROUGH.
Igor Breger24cab0f2015-11-16 07:22:00 +0000188 CASE_VSHUF(64X2, r)
189 VT = getRegOperandVectorVT(MI, MVT::i64, 0);
Igor Bregerd7bae452015-10-15 13:29:07 +0000190 break;
Igor Breger24cab0f2015-11-16 07:22:00 +0000191 CASE_VSHUF(32X4, m)
Igor Bregerd7bae452015-10-15 13:29:07 +0000192 HasMemOp = true; // FALL THROUGH.
Igor Breger24cab0f2015-11-16 07:22:00 +0000193 CASE_VSHUF(32X4, r)
194 VT = getRegOperandVectorVT(MI, MVT::i32, 0);
Igor Bregerd7bae452015-10-15 13:29:07 +0000195 break;
196 }
197}
198
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000199//===----------------------------------------------------------------------===//
200// Top Level Entrypoint
201//===----------------------------------------------------------------------===//
202
203/// EmitAnyX86InstComments - This function decodes x86 instructions and prints
204/// newline terminated strings to the specified string if desired. This
205/// information is shown in disassembly dumps when verbose assembly is enabled.
206bool llvm::EmitAnyX86InstComments(const MCInst *MI, raw_ostream &OS,
207 const char *(*getRegName)(unsigned)) {
208 // If this is a shuffle operation, the switch should fill in this state.
209 SmallVector<int, 8> ShuffleMask;
210 const char *DestName = nullptr, *Src1Name = nullptr, *Src2Name = nullptr;
211
212 switch (MI->getOpcode()) {
213 default:
214 // Not an instruction for which we can decode comments.
215 return false;
216
217 case X86::BLENDPDrri:
218 case X86::VBLENDPDrri:
Simon Pilgrim13d3a202015-11-16 23:03:18 +0000219 case X86::VBLENDPDYrri:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000220 Src2Name = getRegName(MI->getOperand(2).getReg());
221 // FALL THROUGH.
222 case X86::BLENDPDrmi:
223 case X86::VBLENDPDrmi:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000224 case X86::VBLENDPDYrmi:
NAKAMURA Takumi5582a6a2015-05-25 01:43:34 +0000225 if (MI->getOperand(MI->getNumOperands() - 1).isImm())
Simon Pilgrim13d3a202015-11-16 23:03:18 +0000226 DecodeBLENDMask(getRegOperandVectorVT(MI, MVT::f64, 0),
NAKAMURA Takumi5582a6a2015-05-25 01:43:34 +0000227 MI->getOperand(MI->getNumOperands() - 1).getImm(),
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000228 ShuffleMask);
229 Src1Name = getRegName(MI->getOperand(1).getReg());
230 DestName = getRegName(MI->getOperand(0).getReg());
231 break;
232
233 case X86::BLENDPSrri:
234 case X86::VBLENDPSrri:
Simon Pilgrim13d3a202015-11-16 23:03:18 +0000235 case X86::VBLENDPSYrri:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000236 Src2Name = getRegName(MI->getOperand(2).getReg());
237 // FALL THROUGH.
238 case X86::BLENDPSrmi:
239 case X86::VBLENDPSrmi:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000240 case X86::VBLENDPSYrmi:
NAKAMURA Takumi5582a6a2015-05-25 01:43:34 +0000241 if (MI->getOperand(MI->getNumOperands() - 1).isImm())
Simon Pilgrim13d3a202015-11-16 23:03:18 +0000242 DecodeBLENDMask(getRegOperandVectorVT(MI, MVT::f32, 0),
NAKAMURA Takumi5582a6a2015-05-25 01:43:34 +0000243 MI->getOperand(MI->getNumOperands() - 1).getImm(),
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000244 ShuffleMask);
245 Src1Name = getRegName(MI->getOperand(1).getReg());
246 DestName = getRegName(MI->getOperand(0).getReg());
247 break;
248
249 case X86::PBLENDWrri:
250 case X86::VPBLENDWrri:
Simon Pilgrim13d3a202015-11-16 23:03:18 +0000251 case X86::VPBLENDWYrri:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000252 Src2Name = getRegName(MI->getOperand(2).getReg());
253 // FALL THROUGH.
254 case X86::PBLENDWrmi:
255 case X86::VPBLENDWrmi:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000256 case X86::VPBLENDWYrmi:
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::i16, 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::VPBLENDDrri:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000266 case X86::VPBLENDDYrri:
267 Src2Name = getRegName(MI->getOperand(2).getReg());
268 // FALL THROUGH.
Simon Pilgrim13d3a202015-11-16 23:03:18 +0000269 case X86::VPBLENDDrmi:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000270 case X86::VPBLENDDYrmi:
NAKAMURA Takumi5582a6a2015-05-25 01:43:34 +0000271 if (MI->getOperand(MI->getNumOperands() - 1).isImm())
Simon Pilgrim13d3a202015-11-16 23:03:18 +0000272 DecodeBLENDMask(getRegOperandVectorVT(MI, MVT::i32, 0),
NAKAMURA Takumi5582a6a2015-05-25 01:43:34 +0000273 MI->getOperand(MI->getNumOperands() - 1).getImm(),
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000274 ShuffleMask);
275 Src1Name = getRegName(MI->getOperand(1).getReg());
276 DestName = getRegName(MI->getOperand(0).getReg());
277 break;
278
279 case X86::INSERTPSrr:
280 case X86::VINSERTPSrr:
Simon Pilgrim025a3d852016-02-01 22:05:50 +0000281 case X86::VINSERTPSzrr:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000282 Src2Name = getRegName(MI->getOperand(2).getReg());
283 // FALL THROUGH.
284 case X86::INSERTPSrm:
285 case X86::VINSERTPSrm:
Simon Pilgrim025a3d852016-02-01 22:05:50 +0000286 case X86::VINSERTPSzrm:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000287 DestName = getRegName(MI->getOperand(0).getReg());
288 Src1Name = getRegName(MI->getOperand(1).getReg());
NAKAMURA Takumi5582a6a2015-05-25 01:43:34 +0000289 if (MI->getOperand(MI->getNumOperands() - 1).isImm())
290 DecodeINSERTPSMask(MI->getOperand(MI->getNumOperands() - 1).getImm(),
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000291 ShuffleMask);
292 break;
293
294 case X86::MOVLHPSrr:
295 case X86::VMOVLHPSrr:
Simon Pilgrimd5a15442015-11-21 13:04:42 +0000296 case X86::VMOVLHPSZrr:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000297 Src2Name = getRegName(MI->getOperand(2).getReg());
298 Src1Name = getRegName(MI->getOperand(1).getReg());
299 DestName = getRegName(MI->getOperand(0).getReg());
300 DecodeMOVLHPSMask(2, ShuffleMask);
301 break;
302
303 case X86::MOVHLPSrr:
304 case X86::VMOVHLPSrr:
Simon Pilgrimd5a15442015-11-21 13:04:42 +0000305 case X86::VMOVHLPSZrr:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000306 Src2Name = getRegName(MI->getOperand(2).getReg());
307 Src1Name = getRegName(MI->getOperand(1).getReg());
308 DestName = getRegName(MI->getOperand(0).getReg());
309 DecodeMOVHLPSMask(2, ShuffleMask);
310 break;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000311
Igor Breger24cab0f2015-11-16 07:22:00 +0000312 CASE_MOVDUP(MOVSLDUP, r)
313 Src1Name = getRegName(MI->getOperand(MI->getNumOperands() - 1).getReg());
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000314 // FALL THROUGH.
Igor Breger1f782962015-11-19 08:26:56 +0000315 CASE_MOVDUP(MOVSLDUP, m)
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000316 DestName = getRegName(MI->getOperand(0).getReg());
Igor Breger1f782962015-11-19 08:26:56 +0000317 DecodeMOVSLDUPMask(getRegOperandVectorVT(MI, MVT::f32, 0), ShuffleMask);
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000318 break;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000319
Igor Breger24cab0f2015-11-16 07:22:00 +0000320 CASE_MOVDUP(MOVSHDUP, r)
321 Src1Name = getRegName(MI->getOperand(MI->getNumOperands() - 1).getReg());
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000322 // FALL THROUGH.
Igor Breger1f782962015-11-19 08:26:56 +0000323 CASE_MOVDUP(MOVSHDUP, m)
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000324 DestName = getRegName(MI->getOperand(0).getReg());
Igor Breger1f782962015-11-19 08:26:56 +0000325 DecodeMOVSHDUPMask(getRegOperandVectorVT(MI, MVT::f32, 0), ShuffleMask);
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000326 break;
327
Igor Breger1f782962015-11-19 08:26:56 +0000328 CASE_MOVDUP(MOVDDUP, r)
329 Src1Name = getRegName(MI->getOperand(MI->getNumOperands() - 1).getReg());
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000330 // FALL THROUGH.
Igor Breger1f782962015-11-19 08:26:56 +0000331 CASE_MOVDUP(MOVDDUP, m)
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000332 DestName = getRegName(MI->getOperand(0).getReg());
Igor Breger1f782962015-11-19 08:26:56 +0000333 DecodeMOVDDUPMask(getRegOperandVectorVT(MI, MVT::f64, 0), ShuffleMask);
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000334 break;
335
336 case X86::PSLLDQri:
337 case X86::VPSLLDQri:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000338 case X86::VPSLLDQYri:
339 Src1Name = getRegName(MI->getOperand(1).getReg());
340 DestName = getRegName(MI->getOperand(0).getReg());
NAKAMURA Takumi5582a6a2015-05-25 01:43:34 +0000341 if (MI->getOperand(MI->getNumOperands() - 1).isImm())
Simon Pilgrimb9ada272015-11-16 22:54:41 +0000342 DecodePSLLDQMask(getRegOperandVectorVT(MI, MVT::i8, 0),
NAKAMURA Takumi5582a6a2015-05-25 01:43:34 +0000343 MI->getOperand(MI->getNumOperands() - 1).getImm(),
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000344 ShuffleMask);
345 break;
346
347 case X86::PSRLDQri:
348 case X86::VPSRLDQri:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000349 case X86::VPSRLDQYri:
350 Src1Name = getRegName(MI->getOperand(1).getReg());
351 DestName = getRegName(MI->getOperand(0).getReg());
NAKAMURA Takumi5582a6a2015-05-25 01:43:34 +0000352 if (MI->getOperand(MI->getNumOperands() - 1).isImm())
Simon Pilgrimb9ada272015-11-16 22:54:41 +0000353 DecodePSRLDQMask(getRegOperandVectorVT(MI, MVT::i8, 0),
NAKAMURA Takumi5582a6a2015-05-25 01:43:34 +0000354 MI->getOperand(MI->getNumOperands() - 1).getImm(),
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000355 ShuffleMask);
356 break;
357
358 case X86::PALIGNR128rr:
359 case X86::VPALIGNR128rr:
Simon Pilgrimb9ada272015-11-16 22:54:41 +0000360 case X86::VPALIGNR256rr:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000361 Src1Name = getRegName(MI->getOperand(2).getReg());
362 // FALL THROUGH.
363 case X86::PALIGNR128rm:
364 case X86::VPALIGNR128rm:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000365 case X86::VPALIGNR256rm:
366 Src2Name = getRegName(MI->getOperand(1).getReg());
367 DestName = getRegName(MI->getOperand(0).getReg());
NAKAMURA Takumi5582a6a2015-05-25 01:43:34 +0000368 if (MI->getOperand(MI->getNumOperands() - 1).isImm())
Simon Pilgrimb9ada272015-11-16 22:54:41 +0000369 DecodePALIGNRMask(getRegOperandVectorVT(MI, MVT::i8, 0),
NAKAMURA Takumi5582a6a2015-05-25 01:43:34 +0000370 MI->getOperand(MI->getNumOperands() - 1).getImm(),
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000371 ShuffleMask);
372 break;
373
374 case X86::PSHUFDri:
375 case X86::VPSHUFDri:
Simon Pilgrim5883a732015-11-16 22:39:27 +0000376 case X86::VPSHUFDYri:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000377 Src1Name = getRegName(MI->getOperand(1).getReg());
378 // FALL THROUGH.
379 case X86::PSHUFDmi:
380 case X86::VPSHUFDmi:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000381 case X86::VPSHUFDYmi:
382 DestName = getRegName(MI->getOperand(0).getReg());
NAKAMURA Takumi5582a6a2015-05-25 01:43:34 +0000383 if (MI->getOperand(MI->getNumOperands() - 1).isImm())
Simon Pilgrim5883a732015-11-16 22:39:27 +0000384 DecodePSHUFMask(getRegOperandVectorVT(MI, MVT::i32, 0),
NAKAMURA Takumi5582a6a2015-05-25 01:43:34 +0000385 MI->getOperand(MI->getNumOperands() - 1).getImm(),
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000386 ShuffleMask);
387 break;
388
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000389 case X86::PSHUFHWri:
390 case X86::VPSHUFHWri:
Simon Pilgrim5883a732015-11-16 22:39:27 +0000391 case X86::VPSHUFHWYri:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000392 Src1Name = getRegName(MI->getOperand(1).getReg());
393 // FALL THROUGH.
394 case X86::PSHUFHWmi:
395 case X86::VPSHUFHWmi:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000396 case X86::VPSHUFHWYmi:
397 DestName = getRegName(MI->getOperand(0).getReg());
NAKAMURA Takumi5582a6a2015-05-25 01:43:34 +0000398 if (MI->getOperand(MI->getNumOperands() - 1).isImm())
Simon Pilgrim5883a732015-11-16 22:39:27 +0000399 DecodePSHUFHWMask(getRegOperandVectorVT(MI, MVT::i16, 0),
NAKAMURA Takumi5582a6a2015-05-25 01:43:34 +0000400 MI->getOperand(MI->getNumOperands() - 1).getImm(),
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000401 ShuffleMask);
402 break;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000403
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000404 case X86::PSHUFLWri:
405 case X86::VPSHUFLWri:
Simon Pilgrim5883a732015-11-16 22:39:27 +0000406 case X86::VPSHUFLWYri:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000407 Src1Name = getRegName(MI->getOperand(1).getReg());
408 // FALL THROUGH.
409 case X86::PSHUFLWmi:
410 case X86::VPSHUFLWmi:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000411 case X86::VPSHUFLWYmi:
412 DestName = getRegName(MI->getOperand(0).getReg());
NAKAMURA Takumi5582a6a2015-05-25 01:43:34 +0000413 if (MI->getOperand(MI->getNumOperands() - 1).isImm())
Simon Pilgrim5883a732015-11-16 22:39:27 +0000414 DecodePSHUFLWMask(getRegOperandVectorVT(MI, MVT::i16, 0),
NAKAMURA Takumi5582a6a2015-05-25 01:43:34 +0000415 MI->getOperand(MI->getNumOperands() - 1).getImm(),
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000416 ShuffleMask);
417 break;
418
Simon Pilgrimf8f86ab2015-09-13 11:28:45 +0000419 case X86::MMX_PSHUFWri:
420 Src1Name = getRegName(MI->getOperand(1).getReg());
421 // FALL THROUGH.
422 case X86::MMX_PSHUFWmi:
423 DestName = getRegName(MI->getOperand(0).getReg());
424 if (MI->getOperand(MI->getNumOperands() - 1).isImm())
425 DecodePSHUFMask(MVT::v4i16,
426 MI->getOperand(MI->getNumOperands() - 1).getImm(),
427 ShuffleMask);
428 break;
429
430 case X86::PSWAPDrr:
431 Src1Name = getRegName(MI->getOperand(1).getReg());
432 // FALL THROUGH.
433 case X86::PSWAPDrm:
434 DestName = getRegName(MI->getOperand(0).getReg());
435 DecodePSWAPMask(MVT::v2i32, ShuffleMask);
436 break;
437
Simon Pilgrim8483df62015-11-17 22:35:45 +0000438 CASE_UNPCK(PUNPCKHBW, r)
Simon Pilgrimf8f86ab2015-09-13 11:28:45 +0000439 case X86::MMX_PUNPCKHBWirr:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000440 Src2Name = getRegName(MI->getOperand(2).getReg());
441 // FALL THROUGH.
Simon Pilgrim8483df62015-11-17 22:35:45 +0000442 CASE_UNPCK(PUNPCKHBW, m)
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000443 case X86::MMX_PUNPCKHBWirm:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000444 Src1Name = getRegName(MI->getOperand(1).getReg());
445 DestName = getRegName(MI->getOperand(0).getReg());
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000446 DecodeUNPCKHMask(getRegOperandVectorVT(MI, MVT::i8, 0), ShuffleMask);
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000447 break;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000448
Simon Pilgrim8483df62015-11-17 22:35:45 +0000449 CASE_UNPCK(PUNPCKHWD, r)
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000450 case X86::MMX_PUNPCKHWDirr:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000451 Src2Name = getRegName(MI->getOperand(2).getReg());
452 // FALL THROUGH.
Simon Pilgrim8483df62015-11-17 22:35:45 +0000453 CASE_UNPCK(PUNPCKHWD, m)
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000454 case X86::MMX_PUNPCKHWDirm:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000455 Src1Name = getRegName(MI->getOperand(1).getReg());
456 DestName = getRegName(MI->getOperand(0).getReg());
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000457 DecodeUNPCKHMask(getRegOperandVectorVT(MI, MVT::i16, 0), ShuffleMask);
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000458 break;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000459
Simon Pilgrim8483df62015-11-17 22:35:45 +0000460 CASE_UNPCK(PUNPCKHDQ, r)
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000461 case X86::MMX_PUNPCKHDQirr:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000462 Src2Name = getRegName(MI->getOperand(2).getReg());
463 // FALL THROUGH.
Simon Pilgrim8483df62015-11-17 22:35:45 +0000464 CASE_UNPCK(PUNPCKHDQ, m)
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000465 case X86::MMX_PUNPCKHDQirm:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000466 Src1Name = getRegName(MI->getOperand(1).getReg());
467 DestName = getRegName(MI->getOperand(0).getReg());
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000468 DecodeUNPCKHMask(getRegOperandVectorVT(MI, MVT::i32, 0), ShuffleMask);
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000469 break;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000470
Simon Pilgrim8483df62015-11-17 22:35:45 +0000471 CASE_UNPCK(PUNPCKHQDQ, r)
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000472 Src2Name = getRegName(MI->getOperand(2).getReg());
473 // FALL THROUGH.
Simon Pilgrim8483df62015-11-17 22:35:45 +0000474 CASE_UNPCK(PUNPCKHQDQ, m)
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000475 Src1Name = getRegName(MI->getOperand(1).getReg());
476 DestName = getRegName(MI->getOperand(0).getReg());
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000477 DecodeUNPCKHMask(getRegOperandVectorVT(MI, MVT::i64, 0), ShuffleMask);
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000478 break;
479
Simon Pilgrim8483df62015-11-17 22:35:45 +0000480 CASE_UNPCK(PUNPCKLBW, r)
Simon Pilgrimf8f86ab2015-09-13 11:28:45 +0000481 case X86::MMX_PUNPCKLBWirr:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000482 Src2Name = getRegName(MI->getOperand(2).getReg());
483 // FALL THROUGH.
Simon Pilgrim8483df62015-11-17 22:35:45 +0000484 CASE_UNPCK(PUNPCKLBW, m)
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000485 case X86::MMX_PUNPCKLBWirm:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000486 Src1Name = getRegName(MI->getOperand(1).getReg());
487 DestName = getRegName(MI->getOperand(0).getReg());
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000488 DecodeUNPCKLMask(getRegOperandVectorVT(MI, MVT::i8, 0), ShuffleMask);
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000489 break;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000490
Simon Pilgrim8483df62015-11-17 22:35:45 +0000491 CASE_UNPCK(PUNPCKLWD, r)
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000492 case X86::MMX_PUNPCKLWDirr:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000493 Src2Name = getRegName(MI->getOperand(2).getReg());
494 // FALL THROUGH.
Simon Pilgrim8483df62015-11-17 22:35:45 +0000495 CASE_UNPCK(PUNPCKLWD, m)
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000496 case X86::MMX_PUNPCKLWDirm:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000497 Src1Name = getRegName(MI->getOperand(1).getReg());
498 DestName = getRegName(MI->getOperand(0).getReg());
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000499 DecodeUNPCKLMask(getRegOperandVectorVT(MI, MVT::i16, 0), ShuffleMask);
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000500 break;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000501
Simon Pilgrim8483df62015-11-17 22:35:45 +0000502 CASE_UNPCK(PUNPCKLDQ, r)
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000503 case X86::MMX_PUNPCKLDQirr:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000504 Src2Name = getRegName(MI->getOperand(2).getReg());
505 // FALL THROUGH.
Simon Pilgrim8483df62015-11-17 22:35:45 +0000506 CASE_UNPCK(PUNPCKLDQ, m)
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000507 case X86::MMX_PUNPCKLDQirm:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000508 Src1Name = getRegName(MI->getOperand(1).getReg());
509 DestName = getRegName(MI->getOperand(0).getReg());
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000510 DecodeUNPCKLMask(getRegOperandVectorVT(MI, MVT::i32, 0), ShuffleMask);
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000511 break;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000512
Simon Pilgrim8483df62015-11-17 22:35:45 +0000513 CASE_UNPCK(PUNPCKLQDQ, r)
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000514 Src2Name = getRegName(MI->getOperand(2).getReg());
515 // FALL THROUGH.
Simon Pilgrim8483df62015-11-17 22:35:45 +0000516 CASE_UNPCK(PUNPCKLQDQ, m)
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000517 Src1Name = getRegName(MI->getOperand(1).getReg());
518 DestName = getRegName(MI->getOperand(0).getReg());
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000519 DecodeUNPCKLMask(getRegOperandVectorVT(MI, MVT::i64, 0), ShuffleMask);
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000520 break;
521
Simon Pilgrim2da41782015-11-17 23:29:49 +0000522 CASE_SHUF(SHUFPD, r)
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000523 Src2Name = getRegName(MI->getOperand(2).getReg());
524 // FALL THROUGH.
Simon Pilgrim2da41782015-11-17 23:29:49 +0000525 CASE_SHUF(SHUFPD, m)
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
Simon Pilgrim2da41782015-11-17 23:29:49 +0000534 CASE_SHUF(SHUFPS, r)
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000535 Src2Name = getRegName(MI->getOperand(2).getReg());
536 // FALL THROUGH.
Simon Pilgrim2da41782015-11-17 23:29:49 +0000537 CASE_SHUF(SHUFPS, m)
NAKAMURA Takumi5582a6a2015-05-25 01:43:34 +0000538 if (MI->getOperand(MI->getNumOperands() - 1).isImm())
Simon Pilgrim5883a732015-11-16 22:39:27 +0000539 DecodeSHUFPMask(getRegOperandVectorVT(MI, MVT::f32, 0),
NAKAMURA Takumi5582a6a2015-05-25 01:43:34 +0000540 MI->getOperand(MI->getNumOperands() - 1).getImm(),
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000541 ShuffleMask);
542 Src1Name = getRegName(MI->getOperand(1).getReg());
543 DestName = getRegName(MI->getOperand(0).getReg());
544 break;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000545
Igor Breger24cab0f2015-11-16 07:22:00 +0000546 CASE_VSHUF(64X2, r)
547 CASE_VSHUF(64X2, m)
548 CASE_VSHUF(32X4, r)
549 CASE_VSHUF(32X4, m) {
Igor Bregerd7bae452015-10-15 13:29:07 +0000550 MVT VT;
551 bool HasMemOp;
552 unsigned NumOp = MI->getNumOperands();
553 getVSHUF64x2FamilyInfo(MI, VT, HasMemOp);
554 decodeVSHUF64x2FamilyMask(VT, MI->getOperand(NumOp - 1).getImm(),
555 ShuffleMask);
556 DestName = getRegName(MI->getOperand(0).getReg());
557 if (HasMemOp) {
558 assert((NumOp >= 8) && "Expected at least 8 operands!");
559 Src1Name = getRegName(MI->getOperand(NumOp - 7).getReg());
560 } else {
561 assert((NumOp >= 4) && "Expected at least 4 operands!");
562 Src2Name = getRegName(MI->getOperand(NumOp - 2).getReg());
563 Src1Name = getRegName(MI->getOperand(NumOp - 3).getReg());
564 }
565 break;
566 }
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000567
Simon Pilgrim8483df62015-11-17 22:35:45 +0000568 CASE_UNPCK(UNPCKLPD, r)
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000569 Src2Name = getRegName(MI->getOperand(2).getReg());
570 // FALL THROUGH.
Simon Pilgrim8483df62015-11-17 22:35:45 +0000571 CASE_UNPCK(UNPCKLPD, m)
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000572 DecodeUNPCKLMask(getRegOperandVectorVT(MI, MVT::f64, 0), ShuffleMask);
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000573 Src1Name = getRegName(MI->getOperand(1).getReg());
574 DestName = getRegName(MI->getOperand(0).getReg());
575 break;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000576
Simon Pilgrim8483df62015-11-17 22:35:45 +0000577 CASE_UNPCK(UNPCKLPS, r)
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000578 Src2Name = getRegName(MI->getOperand(2).getReg());
579 // FALL THROUGH.
Simon Pilgrim8483df62015-11-17 22:35:45 +0000580 CASE_UNPCK(UNPCKLPS, m)
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000581 DecodeUNPCKLMask(getRegOperandVectorVT(MI, MVT::f32, 0), ShuffleMask);
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000582 Src1Name = getRegName(MI->getOperand(1).getReg());
583 DestName = getRegName(MI->getOperand(0).getReg());
584 break;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000585
Simon Pilgrim8483df62015-11-17 22:35:45 +0000586 CASE_UNPCK(UNPCKHPD, r)
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000587 Src2Name = getRegName(MI->getOperand(2).getReg());
588 // FALL THROUGH.
Simon Pilgrim8483df62015-11-17 22:35:45 +0000589 CASE_UNPCK(UNPCKHPD, m)
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000590 DecodeUNPCKHMask(getRegOperandVectorVT(MI, MVT::f64, 0), ShuffleMask);
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000591 Src1Name = getRegName(MI->getOperand(1).getReg());
592 DestName = getRegName(MI->getOperand(0).getReg());
593 break;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000594
Simon Pilgrim8483df62015-11-17 22:35:45 +0000595 CASE_UNPCK(UNPCKHPS, r)
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000596 Src2Name = getRegName(MI->getOperand(2).getReg());
597 // FALL THROUGH.
Simon Pilgrim8483df62015-11-17 22:35:45 +0000598 CASE_UNPCK(UNPCKHPS, m)
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000599 DecodeUNPCKHMask(getRegOperandVectorVT(MI, MVT::f32, 0), ShuffleMask);
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000600 Src1Name = getRegName(MI->getOperand(1).getReg());
601 DestName = getRegName(MI->getOperand(0).getReg());
602 break;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000603
Simon Pilgrim2da41782015-11-17 23:29:49 +0000604 CASE_VPERM(PERMILPS, r)
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000605 Src1Name = getRegName(MI->getOperand(1).getReg());
606 // FALL THROUGH.
Simon Pilgrim2da41782015-11-17 23:29:49 +0000607 CASE_VPERM(PERMILPS, m)
NAKAMURA Takumi5582a6a2015-05-25 01:43:34 +0000608 if (MI->getOperand(MI->getNumOperands() - 1).isImm())
Simon Pilgrim5883a732015-11-16 22:39:27 +0000609 DecodePSHUFMask(getRegOperandVectorVT(MI, MVT::f32, 0),
NAKAMURA Takumi5582a6a2015-05-25 01:43:34 +0000610 MI->getOperand(MI->getNumOperands() - 1).getImm(),
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000611 ShuffleMask);
612 DestName = getRegName(MI->getOperand(0).getReg());
613 break;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000614
Simon Pilgrim2da41782015-11-17 23:29:49 +0000615 CASE_VPERM(PERMILPD, r)
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000616 Src1Name = getRegName(MI->getOperand(1).getReg());
617 // FALL THROUGH.
Simon Pilgrim2da41782015-11-17 23:29:49 +0000618 CASE_VPERM(PERMILPD, m)
NAKAMURA Takumi5582a6a2015-05-25 01:43:34 +0000619 if (MI->getOperand(MI->getNumOperands() - 1).isImm())
Simon Pilgrim5883a732015-11-16 22:39:27 +0000620 DecodePSHUFMask(getRegOperandVectorVT(MI, MVT::f64, 0),
NAKAMURA Takumi5582a6a2015-05-25 01:43:34 +0000621 MI->getOperand(MI->getNumOperands() - 1).getImm(),
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000622 ShuffleMask);
623 DestName = getRegName(MI->getOperand(0).getReg());
624 break;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000625
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000626 case X86::VPERM2F128rr:
627 case X86::VPERM2I128rr:
628 Src2Name = getRegName(MI->getOperand(2).getReg());
629 // FALL THROUGH.
630 case X86::VPERM2F128rm:
631 case X86::VPERM2I128rm:
632 // For instruction comments purpose, assume the 256-bit vector is v4i64.
NAKAMURA Takumi5582a6a2015-05-25 01:43:34 +0000633 if (MI->getOperand(MI->getNumOperands() - 1).isImm())
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000634 DecodeVPERM2X128Mask(MVT::v4i64,
NAKAMURA Takumi5582a6a2015-05-25 01:43:34 +0000635 MI->getOperand(MI->getNumOperands() - 1).getImm(),
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000636 ShuffleMask);
637 Src1Name = getRegName(MI->getOperand(1).getReg());
638 DestName = getRegName(MI->getOperand(0).getReg());
639 break;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000640
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000641 case X86::VPERMQYri:
642 case X86::VPERMPDYri:
643 Src1Name = getRegName(MI->getOperand(1).getReg());
644 // FALL THROUGH.
645 case X86::VPERMQYmi:
646 case X86::VPERMPDYmi:
NAKAMURA Takumi5582a6a2015-05-25 01:43:34 +0000647 if (MI->getOperand(MI->getNumOperands() - 1).isImm())
648 DecodeVPERMMask(MI->getOperand(MI->getNumOperands() - 1).getImm(),
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000649 ShuffleMask);
650 DestName = getRegName(MI->getOperand(0).getReg());
651 break;
652
653 case X86::MOVSDrr:
654 case X86::VMOVSDrr:
Simon Pilgrimf5c23ad2016-02-01 22:26:28 +0000655 case X86::VMOVSDZrr:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000656 Src2Name = getRegName(MI->getOperand(2).getReg());
657 Src1Name = getRegName(MI->getOperand(1).getReg());
658 // FALL THROUGH.
659 case X86::MOVSDrm:
660 case X86::VMOVSDrm:
Simon Pilgrimf5c23ad2016-02-01 22:26:28 +0000661 case X86::VMOVSDZrm:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000662 DecodeScalarMoveMask(MVT::v2f64, nullptr == Src2Name, ShuffleMask);
663 DestName = getRegName(MI->getOperand(0).getReg());
664 break;
Simon Pilgrimd5a15442015-11-21 13:04:42 +0000665
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000666 case X86::MOVSSrr:
667 case X86::VMOVSSrr:
Simon Pilgrimf5c23ad2016-02-01 22:26:28 +0000668 case X86::VMOVSSZrr:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000669 Src2Name = getRegName(MI->getOperand(2).getReg());
670 Src1Name = getRegName(MI->getOperand(1).getReg());
671 // FALL THROUGH.
672 case X86::MOVSSrm:
673 case X86::VMOVSSrm:
Simon Pilgrimf5c23ad2016-02-01 22:26:28 +0000674 case X86::VMOVSSZrm:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000675 DecodeScalarMoveMask(MVT::v4f32, nullptr == Src2Name, ShuffleMask);
676 DestName = getRegName(MI->getOperand(0).getReg());
677 break;
678
679 case X86::MOVPQI2QIrr:
Simon Pilgrim3e0c0222015-12-13 12:49:48 +0000680 case X86::MOVZPQILo2PQIrr:
681 case X86::VMOVPQI2QIrr:
682 case X86::VMOVZPQILo2PQIrr:
683 case X86::VMOVZPQILo2PQIZrr:
684 Src1Name = getRegName(MI->getOperand(1).getReg());
685 // FALL THROUGH.
686 case X86::MOVQI2PQIrm:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000687 case X86::MOVZQI2PQIrm:
688 case X86::MOVZPQILo2PQIrm:
Simon Pilgrim3e0c0222015-12-13 12:49:48 +0000689 case X86::VMOVQI2PQIrm:
690 case X86::VMOVZQI2PQIrm:
691 case X86::VMOVZPQILo2PQIrm:
692 case X86::VMOVZPQILo2PQIZrm:
693 DecodeZeroMoveLowMask(MVT::v2i64, ShuffleMask);
694 DestName = getRegName(MI->getOperand(0).getReg());
695 break;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000696
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000697 case X86::MOVDI2PDIrm:
698 case X86::VMOVDI2PDIrm:
Simon Pilgrim5be17b62016-02-01 23:04:05 +0000699 case X86::VMOVDI2PDIZrm:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000700 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}