blob: 5e0dd4f7bfc5de06af88e8ec99a74fdd798d79fa [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
Simon Pilgrimbfa5f232016-02-06 17:02:15 +000024#define CASE_MASK_INS_COMMON(Inst, Suffix, src) \
25 case X86::V##Inst##Suffix##src: \
26 case X86::V##Inst##Suffix##src##k: \
27 case X86::V##Inst##Suffix##src##kz:
28
29#define CASE_SSE_INS_COMMON(Inst, src) \
30 case X86::Inst##src:
31
32#define CASE_AVX_INS_COMMON(Inst, Suffix, src) \
33 case X86::V##Inst##Suffix##src:
34
35#define CASE_MOVDUP(Inst, src) \
36 CASE_MASK_INS_COMMON(Inst, Z, r##src) \
37 CASE_MASK_INS_COMMON(Inst, Z256, r##src) \
38 CASE_MASK_INS_COMMON(Inst, Z128, r##src) \
39 CASE_AVX_INS_COMMON(Inst, , r##src) \
40 CASE_AVX_INS_COMMON(Inst, Y, r##src) \
41 CASE_SSE_INS_COMMON(Inst, r##src)
42
Simon Pilgrim0acc32a2016-02-06 19:51:21 +000043#define CASE_PMOVZX(Inst, src) \
44 CASE_MASK_INS_COMMON(Inst, Z, r##src) \
45 CASE_MASK_INS_COMMON(Inst, Z256, r##src) \
46 CASE_MASK_INS_COMMON(Inst, Z128, r##src) \
47 CASE_AVX_INS_COMMON(Inst, , r##src) \
48 CASE_AVX_INS_COMMON(Inst, Y, r##src) \
49 CASE_SSE_INS_COMMON(Inst, r##src)
50
Simon Pilgrimbfa5f232016-02-06 17:02:15 +000051#define CASE_UNPCK(Inst, src) \
52 CASE_MASK_INS_COMMON(Inst, Z, r##src) \
53 CASE_MASK_INS_COMMON(Inst, Z256, r##src) \
54 CASE_MASK_INS_COMMON(Inst, Z128, r##src) \
55 CASE_AVX_INS_COMMON(Inst, , r##src) \
56 CASE_AVX_INS_COMMON(Inst, Y, r##src) \
57 CASE_SSE_INS_COMMON(Inst, r##src)
58
59#define CASE_SHUF(Inst, src) \
60 CASE_MASK_INS_COMMON(Inst, Z, r##src##i) \
61 CASE_MASK_INS_COMMON(Inst, Z256, r##src##i) \
62 CASE_MASK_INS_COMMON(Inst, Z128, r##src##i) \
63 CASE_AVX_INS_COMMON(Inst, , r##src##i) \
64 CASE_AVX_INS_COMMON(Inst, Y, r##src##i) \
65 CASE_SSE_INS_COMMON(Inst, r##src##i)
66
67#define CASE_VPERM(Inst, src) \
68 CASE_MASK_INS_COMMON(Inst, Z, src##i) \
69 CASE_MASK_INS_COMMON(Inst, Z256, src##i) \
70 CASE_MASK_INS_COMMON(Inst, Z128, src##i) \
71 CASE_AVX_INS_COMMON(Inst, , src##i) \
72 CASE_AVX_INS_COMMON(Inst, Y, src##i)
73
74#define CASE_VSHUF(Inst, src) \
75 CASE_MASK_INS_COMMON(SHUFF##Inst, Z, r##src##i) \
76 CASE_MASK_INS_COMMON(SHUFI##Inst, Z, r##src##i) \
77 CASE_MASK_INS_COMMON(SHUFF##Inst, Z256, r##src##i) \
78 CASE_MASK_INS_COMMON(SHUFI##Inst, Z256, r##src##i)
79
Igor Breger24cab0f2015-11-16 07:22:00 +000080static unsigned getVectorRegSize(unsigned RegNo) {
Igor Breger24cab0f2015-11-16 07:22:00 +000081 if (X86::ZMM0 <= RegNo && RegNo <= X86::ZMM31)
82 return 512;
83 if (X86::YMM0 <= RegNo && RegNo <= X86::YMM31)
84 return 256;
85 if (X86::XMM0 <= RegNo && RegNo <= X86::XMM31)
86 return 128;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +000087 if (X86::MM0 <= RegNo && RegNo <= X86::MM7)
88 return 64;
Igor Breger24cab0f2015-11-16 07:22:00 +000089
90 llvm_unreachable("Unknown vector reg!");
Igor Breger24cab0f2015-11-16 07:22:00 +000091}
92
93static MVT getRegOperandVectorVT(const MCInst *MI, const MVT &ScalarVT,
94 unsigned OperandIndex) {
95 unsigned OpReg = MI->getOperand(OperandIndex).getReg();
96 return MVT::getVectorVT(ScalarVT,
97 getVectorRegSize(OpReg)/ScalarVT.getSizeInBits());
98}
99
Simon Pilgrime1b6db92016-02-06 16:33:42 +0000100/// \brief Extracts the dst type for a given zero extension instruction.
101static MVT getZeroExtensionResultType(const MCInst *MI) {
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000102 switch (MI->getOpcode()) {
103 default:
104 llvm_unreachable("Unknown zero extension instruction");
Simon Pilgrime1b6db92016-02-06 16:33:42 +0000105 // zero extension to i16
Simon Pilgrim0acc32a2016-02-06 19:51:21 +0000106 CASE_PMOVZX(PMOVZXBW, m)
107 CASE_PMOVZX(PMOVZXBW, r)
Simon Pilgrime1b6db92016-02-06 16:33:42 +0000108 return getRegOperandVectorVT(MI, MVT::i16, 0);
109 // zero extension to i32
Simon Pilgrim0acc32a2016-02-06 19:51:21 +0000110 CASE_PMOVZX(PMOVZXBD, m)
111 CASE_PMOVZX(PMOVZXBD, r)
112 CASE_PMOVZX(PMOVZXWD, m)
113 CASE_PMOVZX(PMOVZXWD, r)
Simon Pilgrime1b6db92016-02-06 16:33:42 +0000114 return getRegOperandVectorVT(MI, MVT::i32, 0);
115 // zero extension to i64
Simon Pilgrim0acc32a2016-02-06 19:51:21 +0000116 CASE_PMOVZX(PMOVZXBQ, m)
117 CASE_PMOVZX(PMOVZXBQ, r)
118 CASE_PMOVZX(PMOVZXWQ, m)
119 CASE_PMOVZX(PMOVZXWQ, r)
120 CASE_PMOVZX(PMOVZXDQ, m)
121 CASE_PMOVZX(PMOVZXDQ, r)
Simon Pilgrime1b6db92016-02-06 16:33:42 +0000122 return getRegOperandVectorVT(MI, MVT::i64, 0);
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000123 }
124}
125
Igor Bregerd7bae452015-10-15 13:29:07 +0000126/// \brief Extracts the types and if it has memory operand for a given
127/// (SHUFF32x4/SHUFF64x2/SHUFI32x4/SHUFI64x2) instruction.
128static void getVSHUF64x2FamilyInfo(const MCInst *MI, MVT &VT, bool &HasMemOp) {
129 HasMemOp = false;
130 switch (MI->getOpcode()) {
131 default:
132 llvm_unreachable("Unknown VSHUF64x2 family instructions.");
133 break;
Igor Breger24cab0f2015-11-16 07:22:00 +0000134 CASE_VSHUF(64X2, m)
Igor Bregerd7bae452015-10-15 13:29:07 +0000135 HasMemOp = true; // FALL THROUGH.
Igor Breger24cab0f2015-11-16 07:22:00 +0000136 CASE_VSHUF(64X2, r)
137 VT = getRegOperandVectorVT(MI, MVT::i64, 0);
Igor Bregerd7bae452015-10-15 13:29:07 +0000138 break;
Igor Breger24cab0f2015-11-16 07:22:00 +0000139 CASE_VSHUF(32X4, m)
Igor Bregerd7bae452015-10-15 13:29:07 +0000140 HasMemOp = true; // FALL THROUGH.
Igor Breger24cab0f2015-11-16 07:22:00 +0000141 CASE_VSHUF(32X4, r)
142 VT = getRegOperandVectorVT(MI, MVT::i32, 0);
Igor Bregerd7bae452015-10-15 13:29:07 +0000143 break;
144 }
145}
146
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000147//===----------------------------------------------------------------------===//
148// Top Level Entrypoint
149//===----------------------------------------------------------------------===//
150
151/// EmitAnyX86InstComments - This function decodes x86 instructions and prints
152/// newline terminated strings to the specified string if desired. This
153/// information is shown in disassembly dumps when verbose assembly is enabled.
154bool llvm::EmitAnyX86InstComments(const MCInst *MI, raw_ostream &OS,
155 const char *(*getRegName)(unsigned)) {
156 // If this is a shuffle operation, the switch should fill in this state.
157 SmallVector<int, 8> ShuffleMask;
158 const char *DestName = nullptr, *Src1Name = nullptr, *Src2Name = nullptr;
159
160 switch (MI->getOpcode()) {
161 default:
162 // Not an instruction for which we can decode comments.
163 return false;
164
165 case X86::BLENDPDrri:
166 case X86::VBLENDPDrri:
Simon Pilgrim13d3a202015-11-16 23:03:18 +0000167 case X86::VBLENDPDYrri:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000168 Src2Name = getRegName(MI->getOperand(2).getReg());
169 // FALL THROUGH.
170 case X86::BLENDPDrmi:
171 case X86::VBLENDPDrmi:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000172 case X86::VBLENDPDYrmi:
NAKAMURA Takumi5582a6a2015-05-25 01:43:34 +0000173 if (MI->getOperand(MI->getNumOperands() - 1).isImm())
Simon Pilgrim13d3a202015-11-16 23:03:18 +0000174 DecodeBLENDMask(getRegOperandVectorVT(MI, MVT::f64, 0),
NAKAMURA Takumi5582a6a2015-05-25 01:43:34 +0000175 MI->getOperand(MI->getNumOperands() - 1).getImm(),
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000176 ShuffleMask);
177 Src1Name = getRegName(MI->getOperand(1).getReg());
178 DestName = getRegName(MI->getOperand(0).getReg());
179 break;
180
181 case X86::BLENDPSrri:
182 case X86::VBLENDPSrri:
Simon Pilgrim13d3a202015-11-16 23:03:18 +0000183 case X86::VBLENDPSYrri:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000184 Src2Name = getRegName(MI->getOperand(2).getReg());
185 // FALL THROUGH.
186 case X86::BLENDPSrmi:
187 case X86::VBLENDPSrmi:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000188 case X86::VBLENDPSYrmi:
NAKAMURA Takumi5582a6a2015-05-25 01:43:34 +0000189 if (MI->getOperand(MI->getNumOperands() - 1).isImm())
Simon Pilgrim13d3a202015-11-16 23:03:18 +0000190 DecodeBLENDMask(getRegOperandVectorVT(MI, MVT::f32, 0),
NAKAMURA Takumi5582a6a2015-05-25 01:43:34 +0000191 MI->getOperand(MI->getNumOperands() - 1).getImm(),
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000192 ShuffleMask);
193 Src1Name = getRegName(MI->getOperand(1).getReg());
194 DestName = getRegName(MI->getOperand(0).getReg());
195 break;
196
197 case X86::PBLENDWrri:
198 case X86::VPBLENDWrri:
Simon Pilgrim13d3a202015-11-16 23:03:18 +0000199 case X86::VPBLENDWYrri:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000200 Src2Name = getRegName(MI->getOperand(2).getReg());
201 // FALL THROUGH.
202 case X86::PBLENDWrmi:
203 case X86::VPBLENDWrmi:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000204 case X86::VPBLENDWYrmi:
NAKAMURA Takumi5582a6a2015-05-25 01:43:34 +0000205 if (MI->getOperand(MI->getNumOperands() - 1).isImm())
Simon Pilgrim13d3a202015-11-16 23:03:18 +0000206 DecodeBLENDMask(getRegOperandVectorVT(MI, MVT::i16, 0),
NAKAMURA Takumi5582a6a2015-05-25 01:43:34 +0000207 MI->getOperand(MI->getNumOperands() - 1).getImm(),
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000208 ShuffleMask);
209 Src1Name = getRegName(MI->getOperand(1).getReg());
210 DestName = getRegName(MI->getOperand(0).getReg());
211 break;
212
213 case X86::VPBLENDDrri:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000214 case X86::VPBLENDDYrri:
215 Src2Name = getRegName(MI->getOperand(2).getReg());
216 // FALL THROUGH.
Simon Pilgrim13d3a202015-11-16 23:03:18 +0000217 case X86::VPBLENDDrmi:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000218 case X86::VPBLENDDYrmi:
NAKAMURA Takumi5582a6a2015-05-25 01:43:34 +0000219 if (MI->getOperand(MI->getNumOperands() - 1).isImm())
Simon Pilgrim13d3a202015-11-16 23:03:18 +0000220 DecodeBLENDMask(getRegOperandVectorVT(MI, MVT::i32, 0),
NAKAMURA Takumi5582a6a2015-05-25 01:43:34 +0000221 MI->getOperand(MI->getNumOperands() - 1).getImm(),
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000222 ShuffleMask);
223 Src1Name = getRegName(MI->getOperand(1).getReg());
224 DestName = getRegName(MI->getOperand(0).getReg());
225 break;
226
227 case X86::INSERTPSrr:
228 case X86::VINSERTPSrr:
Simon Pilgrim025a3d852016-02-01 22:05:50 +0000229 case X86::VINSERTPSzrr:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000230 Src2Name = getRegName(MI->getOperand(2).getReg());
231 // FALL THROUGH.
232 case X86::INSERTPSrm:
233 case X86::VINSERTPSrm:
Simon Pilgrim025a3d852016-02-01 22:05:50 +0000234 case X86::VINSERTPSzrm:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000235 DestName = getRegName(MI->getOperand(0).getReg());
236 Src1Name = getRegName(MI->getOperand(1).getReg());
NAKAMURA Takumi5582a6a2015-05-25 01:43:34 +0000237 if (MI->getOperand(MI->getNumOperands() - 1).isImm())
238 DecodeINSERTPSMask(MI->getOperand(MI->getNumOperands() - 1).getImm(),
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000239 ShuffleMask);
240 break;
241
242 case X86::MOVLHPSrr:
243 case X86::VMOVLHPSrr:
Simon Pilgrimd5a15442015-11-21 13:04:42 +0000244 case X86::VMOVLHPSZrr:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000245 Src2Name = getRegName(MI->getOperand(2).getReg());
246 Src1Name = getRegName(MI->getOperand(1).getReg());
247 DestName = getRegName(MI->getOperand(0).getReg());
248 DecodeMOVLHPSMask(2, ShuffleMask);
249 break;
250
251 case X86::MOVHLPSrr:
252 case X86::VMOVHLPSrr:
Simon Pilgrimd5a15442015-11-21 13:04:42 +0000253 case X86::VMOVHLPSZrr:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000254 Src2Name = getRegName(MI->getOperand(2).getReg());
255 Src1Name = getRegName(MI->getOperand(1).getReg());
256 DestName = getRegName(MI->getOperand(0).getReg());
257 DecodeMOVHLPSMask(2, ShuffleMask);
258 break;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000259
Simon Pilgrima3d67442016-02-07 15:39:22 +0000260 case X86::MOVHPDrm:
261 case X86::VMOVHPDrm:
262 case X86::VMOVHPDZ128rm:
263 Src1Name = getRegName(MI->getOperand(1).getReg());
264 DestName = getRegName(MI->getOperand(0).getReg());
265 DecodeInsertElementMask(MVT::v2f64, 1, 1, ShuffleMask);
266 break;
267
268 case X86::MOVHPSrm:
269 case X86::VMOVHPSrm:
270 case X86::VMOVHPSZ128rm:
271 Src1Name = getRegName(MI->getOperand(1).getReg());
272 DestName = getRegName(MI->getOperand(0).getReg());
273 DecodeInsertElementMask(MVT::v4f32, 2, 2, ShuffleMask);
274 break;
275
276 case X86::MOVLPDrm:
277 case X86::VMOVLPDrm:
278 case X86::VMOVLPDZ128rm:
279 Src1Name = getRegName(MI->getOperand(1).getReg());
280 DestName = getRegName(MI->getOperand(0).getReg());
281 DecodeInsertElementMask(MVT::v2f64, 0, 1, ShuffleMask);
282 break;
283
284 case X86::MOVLPSrm:
285 case X86::VMOVLPSrm:
286 case X86::VMOVLPSZ128rm:
287 Src1Name = getRegName(MI->getOperand(1).getReg());
288 DestName = getRegName(MI->getOperand(0).getReg());
289 DecodeInsertElementMask(MVT::v4f32, 0, 2, ShuffleMask);
290 break;
291
Igor Breger24cab0f2015-11-16 07:22:00 +0000292 CASE_MOVDUP(MOVSLDUP, r)
293 Src1Name = getRegName(MI->getOperand(MI->getNumOperands() - 1).getReg());
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000294 // FALL THROUGH.
Igor Breger1f782962015-11-19 08:26:56 +0000295 CASE_MOVDUP(MOVSLDUP, m)
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000296 DestName = getRegName(MI->getOperand(0).getReg());
Igor Breger1f782962015-11-19 08:26:56 +0000297 DecodeMOVSLDUPMask(getRegOperandVectorVT(MI, MVT::f32, 0), ShuffleMask);
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000298 break;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000299
Igor Breger24cab0f2015-11-16 07:22:00 +0000300 CASE_MOVDUP(MOVSHDUP, r)
301 Src1Name = getRegName(MI->getOperand(MI->getNumOperands() - 1).getReg());
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000302 // FALL THROUGH.
Igor Breger1f782962015-11-19 08:26:56 +0000303 CASE_MOVDUP(MOVSHDUP, m)
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000304 DestName = getRegName(MI->getOperand(0).getReg());
Igor Breger1f782962015-11-19 08:26:56 +0000305 DecodeMOVSHDUPMask(getRegOperandVectorVT(MI, MVT::f32, 0), ShuffleMask);
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000306 break;
307
Igor Breger1f782962015-11-19 08:26:56 +0000308 CASE_MOVDUP(MOVDDUP, r)
309 Src1Name = getRegName(MI->getOperand(MI->getNumOperands() - 1).getReg());
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000310 // FALL THROUGH.
Igor Breger1f782962015-11-19 08:26:56 +0000311 CASE_MOVDUP(MOVDDUP, m)
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000312 DestName = getRegName(MI->getOperand(0).getReg());
Igor Breger1f782962015-11-19 08:26:56 +0000313 DecodeMOVDDUPMask(getRegOperandVectorVT(MI, MVT::f64, 0), ShuffleMask);
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000314 break;
315
316 case X86::PSLLDQri:
317 case X86::VPSLLDQri:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000318 case X86::VPSLLDQYri:
319 Src1Name = getRegName(MI->getOperand(1).getReg());
320 DestName = getRegName(MI->getOperand(0).getReg());
NAKAMURA Takumi5582a6a2015-05-25 01:43:34 +0000321 if (MI->getOperand(MI->getNumOperands() - 1).isImm())
Simon Pilgrimb9ada272015-11-16 22:54:41 +0000322 DecodePSLLDQMask(getRegOperandVectorVT(MI, MVT::i8, 0),
NAKAMURA Takumi5582a6a2015-05-25 01:43:34 +0000323 MI->getOperand(MI->getNumOperands() - 1).getImm(),
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000324 ShuffleMask);
325 break;
326
327 case X86::PSRLDQri:
328 case X86::VPSRLDQri:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000329 case X86::VPSRLDQYri:
330 Src1Name = getRegName(MI->getOperand(1).getReg());
331 DestName = getRegName(MI->getOperand(0).getReg());
NAKAMURA Takumi5582a6a2015-05-25 01:43:34 +0000332 if (MI->getOperand(MI->getNumOperands() - 1).isImm())
Simon Pilgrimb9ada272015-11-16 22:54:41 +0000333 DecodePSRLDQMask(getRegOperandVectorVT(MI, MVT::i8, 0),
NAKAMURA Takumi5582a6a2015-05-25 01:43:34 +0000334 MI->getOperand(MI->getNumOperands() - 1).getImm(),
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000335 ShuffleMask);
336 break;
337
338 case X86::PALIGNR128rr:
339 case X86::VPALIGNR128rr:
Simon Pilgrimb9ada272015-11-16 22:54:41 +0000340 case X86::VPALIGNR256rr:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000341 Src1Name = getRegName(MI->getOperand(2).getReg());
342 // FALL THROUGH.
343 case X86::PALIGNR128rm:
344 case X86::VPALIGNR128rm:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000345 case X86::VPALIGNR256rm:
346 Src2Name = 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 DecodePALIGNRMask(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::PSHUFDri:
355 case X86::VPSHUFDri:
Simon Pilgrim5883a732015-11-16 22:39:27 +0000356 case X86::VPSHUFDYri:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000357 Src1Name = getRegName(MI->getOperand(1).getReg());
358 // FALL THROUGH.
359 case X86::PSHUFDmi:
360 case X86::VPSHUFDmi:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000361 case X86::VPSHUFDYmi:
362 DestName = getRegName(MI->getOperand(0).getReg());
NAKAMURA Takumi5582a6a2015-05-25 01:43:34 +0000363 if (MI->getOperand(MI->getNumOperands() - 1).isImm())
Simon Pilgrim5883a732015-11-16 22:39:27 +0000364 DecodePSHUFMask(getRegOperandVectorVT(MI, MVT::i32, 0),
NAKAMURA Takumi5582a6a2015-05-25 01:43:34 +0000365 MI->getOperand(MI->getNumOperands() - 1).getImm(),
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000366 ShuffleMask);
367 break;
368
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000369 case X86::PSHUFHWri:
370 case X86::VPSHUFHWri:
Simon Pilgrim5883a732015-11-16 22:39:27 +0000371 case X86::VPSHUFHWYri:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000372 Src1Name = getRegName(MI->getOperand(1).getReg());
373 // FALL THROUGH.
374 case X86::PSHUFHWmi:
375 case X86::VPSHUFHWmi:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000376 case X86::VPSHUFHWYmi:
377 DestName = getRegName(MI->getOperand(0).getReg());
NAKAMURA Takumi5582a6a2015-05-25 01:43:34 +0000378 if (MI->getOperand(MI->getNumOperands() - 1).isImm())
Simon Pilgrim5883a732015-11-16 22:39:27 +0000379 DecodePSHUFHWMask(getRegOperandVectorVT(MI, MVT::i16, 0),
NAKAMURA Takumi5582a6a2015-05-25 01:43:34 +0000380 MI->getOperand(MI->getNumOperands() - 1).getImm(),
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000381 ShuffleMask);
382 break;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000383
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000384 case X86::PSHUFLWri:
385 case X86::VPSHUFLWri:
Simon Pilgrim5883a732015-11-16 22:39:27 +0000386 case X86::VPSHUFLWYri:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000387 Src1Name = getRegName(MI->getOperand(1).getReg());
388 // FALL THROUGH.
389 case X86::PSHUFLWmi:
390 case X86::VPSHUFLWmi:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000391 case X86::VPSHUFLWYmi:
392 DestName = getRegName(MI->getOperand(0).getReg());
NAKAMURA Takumi5582a6a2015-05-25 01:43:34 +0000393 if (MI->getOperand(MI->getNumOperands() - 1).isImm())
Simon Pilgrim5883a732015-11-16 22:39:27 +0000394 DecodePSHUFLWMask(getRegOperandVectorVT(MI, MVT::i16, 0),
NAKAMURA Takumi5582a6a2015-05-25 01:43:34 +0000395 MI->getOperand(MI->getNumOperands() - 1).getImm(),
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000396 ShuffleMask);
397 break;
398
Simon Pilgrimf8f86ab2015-09-13 11:28:45 +0000399 case X86::MMX_PSHUFWri:
400 Src1Name = getRegName(MI->getOperand(1).getReg());
401 // FALL THROUGH.
402 case X86::MMX_PSHUFWmi:
403 DestName = getRegName(MI->getOperand(0).getReg());
404 if (MI->getOperand(MI->getNumOperands() - 1).isImm())
405 DecodePSHUFMask(MVT::v4i16,
406 MI->getOperand(MI->getNumOperands() - 1).getImm(),
407 ShuffleMask);
408 break;
409
410 case X86::PSWAPDrr:
411 Src1Name = getRegName(MI->getOperand(1).getReg());
412 // FALL THROUGH.
413 case X86::PSWAPDrm:
414 DestName = getRegName(MI->getOperand(0).getReg());
415 DecodePSWAPMask(MVT::v2i32, ShuffleMask);
416 break;
417
Simon Pilgrim8483df62015-11-17 22:35:45 +0000418 CASE_UNPCK(PUNPCKHBW, r)
Simon Pilgrimf8f86ab2015-09-13 11:28:45 +0000419 case X86::MMX_PUNPCKHBWirr:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000420 Src2Name = getRegName(MI->getOperand(2).getReg());
421 // FALL THROUGH.
Simon Pilgrim8483df62015-11-17 22:35:45 +0000422 CASE_UNPCK(PUNPCKHBW, m)
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000423 case X86::MMX_PUNPCKHBWirm:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000424 Src1Name = getRegName(MI->getOperand(1).getReg());
425 DestName = getRegName(MI->getOperand(0).getReg());
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000426 DecodeUNPCKHMask(getRegOperandVectorVT(MI, MVT::i8, 0), ShuffleMask);
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000427 break;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000428
Simon Pilgrim8483df62015-11-17 22:35:45 +0000429 CASE_UNPCK(PUNPCKHWD, r)
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000430 case X86::MMX_PUNPCKHWDirr:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000431 Src2Name = getRegName(MI->getOperand(2).getReg());
432 // FALL THROUGH.
Simon Pilgrim8483df62015-11-17 22:35:45 +0000433 CASE_UNPCK(PUNPCKHWD, m)
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000434 case X86::MMX_PUNPCKHWDirm:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000435 Src1Name = getRegName(MI->getOperand(1).getReg());
436 DestName = getRegName(MI->getOperand(0).getReg());
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000437 DecodeUNPCKHMask(getRegOperandVectorVT(MI, MVT::i16, 0), ShuffleMask);
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000438 break;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000439
Simon Pilgrim8483df62015-11-17 22:35:45 +0000440 CASE_UNPCK(PUNPCKHDQ, r)
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000441 case X86::MMX_PUNPCKHDQirr:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000442 Src2Name = getRegName(MI->getOperand(2).getReg());
443 // FALL THROUGH.
Simon Pilgrim8483df62015-11-17 22:35:45 +0000444 CASE_UNPCK(PUNPCKHDQ, m)
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000445 case X86::MMX_PUNPCKHDQirm:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000446 Src1Name = getRegName(MI->getOperand(1).getReg());
447 DestName = getRegName(MI->getOperand(0).getReg());
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000448 DecodeUNPCKHMask(getRegOperandVectorVT(MI, MVT::i32, 0), ShuffleMask);
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000449 break;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000450
Simon Pilgrim8483df62015-11-17 22:35:45 +0000451 CASE_UNPCK(PUNPCKHQDQ, r)
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000452 Src2Name = getRegName(MI->getOperand(2).getReg());
453 // FALL THROUGH.
Simon Pilgrim8483df62015-11-17 22:35:45 +0000454 CASE_UNPCK(PUNPCKHQDQ, m)
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::i64, 0), ShuffleMask);
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000458 break;
459
Simon Pilgrim8483df62015-11-17 22:35:45 +0000460 CASE_UNPCK(PUNPCKLBW, r)
Simon Pilgrimf8f86ab2015-09-13 11:28:45 +0000461 case X86::MMX_PUNPCKLBWirr:
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(PUNPCKLBW, m)
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000465 case X86::MMX_PUNPCKLBWirm:
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 DecodeUNPCKLMask(getRegOperandVectorVT(MI, MVT::i8, 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(PUNPCKLWD, r)
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000472 case X86::MMX_PUNPCKLWDirr:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000473 Src2Name = getRegName(MI->getOperand(2).getReg());
474 // FALL THROUGH.
Simon Pilgrim8483df62015-11-17 22:35:45 +0000475 CASE_UNPCK(PUNPCKLWD, m)
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000476 case X86::MMX_PUNPCKLWDirm:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000477 Src1Name = getRegName(MI->getOperand(1).getReg());
478 DestName = getRegName(MI->getOperand(0).getReg());
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000479 DecodeUNPCKLMask(getRegOperandVectorVT(MI, MVT::i16, 0), ShuffleMask);
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000480 break;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000481
Simon Pilgrim8483df62015-11-17 22:35:45 +0000482 CASE_UNPCK(PUNPCKLDQ, r)
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000483 case X86::MMX_PUNPCKLDQirr:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000484 Src2Name = getRegName(MI->getOperand(2).getReg());
485 // FALL THROUGH.
Simon Pilgrim8483df62015-11-17 22:35:45 +0000486 CASE_UNPCK(PUNPCKLDQ, m)
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000487 case X86::MMX_PUNPCKLDQirm:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000488 Src1Name = getRegName(MI->getOperand(1).getReg());
489 DestName = getRegName(MI->getOperand(0).getReg());
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000490 DecodeUNPCKLMask(getRegOperandVectorVT(MI, MVT::i32, 0), ShuffleMask);
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000491 break;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000492
Simon Pilgrim8483df62015-11-17 22:35:45 +0000493 CASE_UNPCK(PUNPCKLQDQ, r)
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000494 Src2Name = getRegName(MI->getOperand(2).getReg());
495 // FALL THROUGH.
Simon Pilgrim8483df62015-11-17 22:35:45 +0000496 CASE_UNPCK(PUNPCKLQDQ, m)
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::i64, 0), ShuffleMask);
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000500 break;
501
Simon Pilgrim2da41782015-11-17 23:29:49 +0000502 CASE_SHUF(SHUFPD, r)
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000503 Src2Name = getRegName(MI->getOperand(2).getReg());
504 // FALL THROUGH.
Simon Pilgrim2da41782015-11-17 23:29:49 +0000505 CASE_SHUF(SHUFPD, m)
NAKAMURA Takumi5582a6a2015-05-25 01:43:34 +0000506 if (MI->getOperand(MI->getNumOperands() - 1).isImm())
Simon Pilgrim5883a732015-11-16 22:39:27 +0000507 DecodeSHUFPMask(getRegOperandVectorVT(MI, MVT::f64, 0),
NAKAMURA Takumi5582a6a2015-05-25 01:43:34 +0000508 MI->getOperand(MI->getNumOperands() - 1).getImm(),
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000509 ShuffleMask);
510 Src1Name = getRegName(MI->getOperand(1).getReg());
511 DestName = getRegName(MI->getOperand(0).getReg());
512 break;
513
Simon Pilgrim2da41782015-11-17 23:29:49 +0000514 CASE_SHUF(SHUFPS, r)
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000515 Src2Name = getRegName(MI->getOperand(2).getReg());
516 // FALL THROUGH.
Simon Pilgrim2da41782015-11-17 23:29:49 +0000517 CASE_SHUF(SHUFPS, m)
NAKAMURA Takumi5582a6a2015-05-25 01:43:34 +0000518 if (MI->getOperand(MI->getNumOperands() - 1).isImm())
Simon Pilgrim5883a732015-11-16 22:39:27 +0000519 DecodeSHUFPMask(getRegOperandVectorVT(MI, MVT::f32, 0),
NAKAMURA Takumi5582a6a2015-05-25 01:43:34 +0000520 MI->getOperand(MI->getNumOperands() - 1).getImm(),
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000521 ShuffleMask);
522 Src1Name = getRegName(MI->getOperand(1).getReg());
523 DestName = getRegName(MI->getOperand(0).getReg());
524 break;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000525
Igor Breger24cab0f2015-11-16 07:22:00 +0000526 CASE_VSHUF(64X2, r)
527 CASE_VSHUF(64X2, m)
528 CASE_VSHUF(32X4, r)
529 CASE_VSHUF(32X4, m) {
Igor Bregerd7bae452015-10-15 13:29:07 +0000530 MVT VT;
531 bool HasMemOp;
532 unsigned NumOp = MI->getNumOperands();
533 getVSHUF64x2FamilyInfo(MI, VT, HasMemOp);
534 decodeVSHUF64x2FamilyMask(VT, MI->getOperand(NumOp - 1).getImm(),
535 ShuffleMask);
536 DestName = getRegName(MI->getOperand(0).getReg());
537 if (HasMemOp) {
538 assert((NumOp >= 8) && "Expected at least 8 operands!");
539 Src1Name = getRegName(MI->getOperand(NumOp - 7).getReg());
540 } else {
541 assert((NumOp >= 4) && "Expected at least 4 operands!");
542 Src2Name = getRegName(MI->getOperand(NumOp - 2).getReg());
543 Src1Name = getRegName(MI->getOperand(NumOp - 3).getReg());
544 }
545 break;
546 }
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000547
Simon Pilgrim8483df62015-11-17 22:35:45 +0000548 CASE_UNPCK(UNPCKLPD, r)
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000549 Src2Name = getRegName(MI->getOperand(2).getReg());
550 // FALL THROUGH.
Simon Pilgrim8483df62015-11-17 22:35:45 +0000551 CASE_UNPCK(UNPCKLPD, m)
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000552 DecodeUNPCKLMask(getRegOperandVectorVT(MI, MVT::f64, 0), ShuffleMask);
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000553 Src1Name = getRegName(MI->getOperand(1).getReg());
554 DestName = getRegName(MI->getOperand(0).getReg());
555 break;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000556
Simon Pilgrim8483df62015-11-17 22:35:45 +0000557 CASE_UNPCK(UNPCKLPS, r)
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000558 Src2Name = getRegName(MI->getOperand(2).getReg());
559 // FALL THROUGH.
Simon Pilgrim8483df62015-11-17 22:35:45 +0000560 CASE_UNPCK(UNPCKLPS, m)
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000561 DecodeUNPCKLMask(getRegOperandVectorVT(MI, MVT::f32, 0), ShuffleMask);
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000562 Src1Name = getRegName(MI->getOperand(1).getReg());
563 DestName = getRegName(MI->getOperand(0).getReg());
564 break;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000565
Simon Pilgrim8483df62015-11-17 22:35:45 +0000566 CASE_UNPCK(UNPCKHPD, r)
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000567 Src2Name = getRegName(MI->getOperand(2).getReg());
568 // FALL THROUGH.
Simon Pilgrim8483df62015-11-17 22:35:45 +0000569 CASE_UNPCK(UNPCKHPD, m)
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000570 DecodeUNPCKHMask(getRegOperandVectorVT(MI, MVT::f64, 0), ShuffleMask);
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000571 Src1Name = getRegName(MI->getOperand(1).getReg());
572 DestName = getRegName(MI->getOperand(0).getReg());
573 break;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000574
Simon Pilgrim8483df62015-11-17 22:35:45 +0000575 CASE_UNPCK(UNPCKHPS, r)
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000576 Src2Name = getRegName(MI->getOperand(2).getReg());
577 // FALL THROUGH.
Simon Pilgrim8483df62015-11-17 22:35:45 +0000578 CASE_UNPCK(UNPCKHPS, m)
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000579 DecodeUNPCKHMask(getRegOperandVectorVT(MI, MVT::f32, 0), ShuffleMask);
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000580 Src1Name = getRegName(MI->getOperand(1).getReg());
581 DestName = getRegName(MI->getOperand(0).getReg());
582 break;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000583
Simon Pilgrim2da41782015-11-17 23:29:49 +0000584 CASE_VPERM(PERMILPS, r)
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000585 Src1Name = getRegName(MI->getOperand(1).getReg());
586 // FALL THROUGH.
Simon Pilgrim2da41782015-11-17 23:29:49 +0000587 CASE_VPERM(PERMILPS, m)
NAKAMURA Takumi5582a6a2015-05-25 01:43:34 +0000588 if (MI->getOperand(MI->getNumOperands() - 1).isImm())
Simon Pilgrim5883a732015-11-16 22:39:27 +0000589 DecodePSHUFMask(getRegOperandVectorVT(MI, MVT::f32, 0),
NAKAMURA Takumi5582a6a2015-05-25 01:43:34 +0000590 MI->getOperand(MI->getNumOperands() - 1).getImm(),
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000591 ShuffleMask);
592 DestName = getRegName(MI->getOperand(0).getReg());
593 break;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000594
Simon Pilgrim2da41782015-11-17 23:29:49 +0000595 CASE_VPERM(PERMILPD, r)
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000596 Src1Name = getRegName(MI->getOperand(1).getReg());
597 // FALL THROUGH.
Simon Pilgrim2da41782015-11-17 23:29:49 +0000598 CASE_VPERM(PERMILPD, m)
NAKAMURA Takumi5582a6a2015-05-25 01:43:34 +0000599 if (MI->getOperand(MI->getNumOperands() - 1).isImm())
Simon Pilgrim5883a732015-11-16 22:39:27 +0000600 DecodePSHUFMask(getRegOperandVectorVT(MI, MVT::f64, 0),
NAKAMURA Takumi5582a6a2015-05-25 01:43:34 +0000601 MI->getOperand(MI->getNumOperands() - 1).getImm(),
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000602 ShuffleMask);
603 DestName = getRegName(MI->getOperand(0).getReg());
604 break;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000605
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000606 case X86::VPERM2F128rr:
607 case X86::VPERM2I128rr:
608 Src2Name = getRegName(MI->getOperand(2).getReg());
609 // FALL THROUGH.
610 case X86::VPERM2F128rm:
611 case X86::VPERM2I128rm:
612 // For instruction comments purpose, assume the 256-bit vector is v4i64.
NAKAMURA Takumi5582a6a2015-05-25 01:43:34 +0000613 if (MI->getOperand(MI->getNumOperands() - 1).isImm())
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000614 DecodeVPERM2X128Mask(MVT::v4i64,
NAKAMURA Takumi5582a6a2015-05-25 01:43:34 +0000615 MI->getOperand(MI->getNumOperands() - 1).getImm(),
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000616 ShuffleMask);
617 Src1Name = getRegName(MI->getOperand(1).getReg());
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::VPERMQYri:
622 case X86::VPERMPDYri:
623 Src1Name = getRegName(MI->getOperand(1).getReg());
624 // FALL THROUGH.
625 case X86::VPERMQYmi:
626 case X86::VPERMPDYmi:
NAKAMURA Takumi5582a6a2015-05-25 01:43:34 +0000627 if (MI->getOperand(MI->getNumOperands() - 1).isImm())
628 DecodeVPERMMask(MI->getOperand(MI->getNumOperands() - 1).getImm(),
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000629 ShuffleMask);
630 DestName = getRegName(MI->getOperand(0).getReg());
631 break;
632
633 case X86::MOVSDrr:
634 case X86::VMOVSDrr:
Simon Pilgrimf5c23ad2016-02-01 22:26:28 +0000635 case X86::VMOVSDZrr:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000636 Src2Name = getRegName(MI->getOperand(2).getReg());
637 Src1Name = getRegName(MI->getOperand(1).getReg());
638 // FALL THROUGH.
639 case X86::MOVSDrm:
640 case X86::VMOVSDrm:
Simon Pilgrimf5c23ad2016-02-01 22:26:28 +0000641 case X86::VMOVSDZrm:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000642 DecodeScalarMoveMask(MVT::v2f64, nullptr == Src2Name, ShuffleMask);
643 DestName = getRegName(MI->getOperand(0).getReg());
644 break;
Simon Pilgrimd5a15442015-11-21 13:04:42 +0000645
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000646 case X86::MOVSSrr:
647 case X86::VMOVSSrr:
Simon Pilgrimf5c23ad2016-02-01 22:26:28 +0000648 case X86::VMOVSSZrr:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000649 Src2Name = getRegName(MI->getOperand(2).getReg());
650 Src1Name = getRegName(MI->getOperand(1).getReg());
651 // FALL THROUGH.
652 case X86::MOVSSrm:
653 case X86::VMOVSSrm:
Simon Pilgrimf5c23ad2016-02-01 22:26:28 +0000654 case X86::VMOVSSZrm:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000655 DecodeScalarMoveMask(MVT::v4f32, nullptr == Src2Name, ShuffleMask);
656 DestName = getRegName(MI->getOperand(0).getReg());
657 break;
658
659 case X86::MOVPQI2QIrr:
Simon Pilgrim3e0c0222015-12-13 12:49:48 +0000660 case X86::MOVZPQILo2PQIrr:
661 case X86::VMOVPQI2QIrr:
662 case X86::VMOVZPQILo2PQIrr:
663 case X86::VMOVZPQILo2PQIZrr:
664 Src1Name = getRegName(MI->getOperand(1).getReg());
665 // FALL THROUGH.
666 case X86::MOVQI2PQIrm:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000667 case X86::MOVZQI2PQIrm:
668 case X86::MOVZPQILo2PQIrm:
Simon Pilgrim3e0c0222015-12-13 12:49:48 +0000669 case X86::VMOVQI2PQIrm:
Simon Pilgrim96fe4ef2016-02-02 13:32:56 +0000670 case X86::VMOVQI2PQIZrm:
Simon Pilgrim3e0c0222015-12-13 12:49:48 +0000671 case X86::VMOVZQI2PQIrm:
672 case X86::VMOVZPQILo2PQIrm:
673 case X86::VMOVZPQILo2PQIZrm:
674 DecodeZeroMoveLowMask(MVT::v2i64, ShuffleMask);
675 DestName = getRegName(MI->getOperand(0).getReg());
676 break;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000677
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000678 case X86::MOVDI2PDIrm:
679 case X86::VMOVDI2PDIrm:
Simon Pilgrim5be17b62016-02-01 23:04:05 +0000680 case X86::VMOVDI2PDIZrm:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000681 DecodeZeroMoveLowMask(MVT::v4i32, ShuffleMask);
682 DestName = getRegName(MI->getOperand(0).getReg());
683 break;
684
Simon Pilgrimd85cae32015-07-06 20:46:41 +0000685 case X86::EXTRQI:
686 if (MI->getOperand(2).isImm() &&
687 MI->getOperand(3).isImm())
688 DecodeEXTRQIMask(MI->getOperand(2).getImm(),
689 MI->getOperand(3).getImm(),
690 ShuffleMask);
691
692 DestName = getRegName(MI->getOperand(0).getReg());
693 Src1Name = getRegName(MI->getOperand(1).getReg());
694 break;
695
696 case X86::INSERTQI:
697 if (MI->getOperand(3).isImm() &&
698 MI->getOperand(4).isImm())
699 DecodeINSERTQIMask(MI->getOperand(3).getImm(),
700 MI->getOperand(4).getImm(),
701 ShuffleMask);
702
703 DestName = getRegName(MI->getOperand(0).getReg());
704 Src1Name = getRegName(MI->getOperand(1).getReg());
705 Src2Name = getRegName(MI->getOperand(2).getReg());
706 break;
707
Simon Pilgrim0acc32a2016-02-06 19:51:21 +0000708 CASE_PMOVZX(PMOVZXBW, r)
709 CASE_PMOVZX(PMOVZXBD, r)
710 CASE_PMOVZX(PMOVZXBQ, r)
711 Src1Name = getRegName(MI->getOperand(MI->getNumOperands() - 1).getReg());
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000712 // FALL THROUGH.
Simon Pilgrim0acc32a2016-02-06 19:51:21 +0000713 CASE_PMOVZX(PMOVZXBW, m)
714 CASE_PMOVZX(PMOVZXBD, m)
715 CASE_PMOVZX(PMOVZXBQ, m)
Simon Pilgrime1b6db92016-02-06 16:33:42 +0000716 DecodeZeroExtendMask(MVT::i8, getZeroExtensionResultType(MI), ShuffleMask);
717 DestName = getRegName(MI->getOperand(0).getReg());
718 break;
719
Simon Pilgrim0acc32a2016-02-06 19:51:21 +0000720 CASE_PMOVZX(PMOVZXWD, r)
721 CASE_PMOVZX(PMOVZXWQ, r)
722 Src1Name = getRegName(MI->getOperand(MI->getNumOperands() - 1).getReg());
Simon Pilgrime1b6db92016-02-06 16:33:42 +0000723 // FALL THROUGH.
Simon Pilgrim0acc32a2016-02-06 19:51:21 +0000724 CASE_PMOVZX(PMOVZXWD, m)
725 CASE_PMOVZX(PMOVZXWQ, m)
Simon Pilgrime1b6db92016-02-06 16:33:42 +0000726 DecodeZeroExtendMask(MVT::i16, getZeroExtensionResultType(MI), ShuffleMask);
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000727 DestName = getRegName(MI->getOperand(0).getReg());
Simon Pilgrime1b6db92016-02-06 16:33:42 +0000728 break;
729
Simon Pilgrim0acc32a2016-02-06 19:51:21 +0000730 CASE_PMOVZX(PMOVZXDQ, r)
731 Src1Name = getRegName(MI->getOperand(MI->getNumOperands() - 1).getReg());
Simon Pilgrime1b6db92016-02-06 16:33:42 +0000732 // FALL THROUGH.
Simon Pilgrim0acc32a2016-02-06 19:51:21 +0000733 CASE_PMOVZX(PMOVZXDQ, m)
Simon Pilgrime1b6db92016-02-06 16:33:42 +0000734 DecodeZeroExtendMask(MVT::i32, getZeroExtensionResultType(MI), ShuffleMask);
735 DestName = getRegName(MI->getOperand(0).getReg());
736 break;
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000737 }
738
739 // The only comments we decode are shuffles, so give up if we were unable to
740 // decode a shuffle mask.
741 if (ShuffleMask.empty())
742 return false;
743
744 if (!DestName) DestName = Src1Name;
745 OS << (DestName ? DestName : "mem") << " = ";
746
747 // If the two sources are the same, canonicalize the input elements to be
748 // from the first src so that we get larger element spans.
749 if (Src1Name == Src2Name) {
750 for (unsigned i = 0, e = ShuffleMask.size(); i != e; ++i) {
751 if ((int)ShuffleMask[i] >= 0 && // Not sentinel.
NAKAMURA Takumi5582a6a2015-05-25 01:43:34 +0000752 ShuffleMask[i] >= (int)e) // From second mask.
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000753 ShuffleMask[i] -= e;
754 }
755 }
756
757 // The shuffle mask specifies which elements of the src1/src2 fill in the
758 // destination, with a few sentinel values. Loop through and print them
759 // out.
760 for (unsigned i = 0, e = ShuffleMask.size(); i != e; ++i) {
761 if (i != 0)
762 OS << ',';
763 if (ShuffleMask[i] == SM_SentinelZero) {
764 OS << "zero";
765 continue;
766 }
767
768 // Otherwise, it must come from src1 or src2. Print the span of elements
769 // that comes from this src.
770 bool isSrc1 = ShuffleMask[i] < (int)ShuffleMask.size();
771 const char *SrcName = isSrc1 ? Src1Name : Src2Name;
772 OS << (SrcName ? SrcName : "mem") << '[';
773 bool IsFirst = true;
774 while (i != e && (int)ShuffleMask[i] != SM_SentinelZero &&
775 (ShuffleMask[i] < (int)ShuffleMask.size()) == isSrc1) {
776 if (!IsFirst)
777 OS << ',';
778 else
779 IsFirst = false;
780 if (ShuffleMask[i] == SM_SentinelUndef)
781 OS << "u";
782 else
783 OS << ShuffleMask[i] % ShuffleMask.size();
784 ++i;
785 }
786 OS << ']';
NAKAMURA Takumi5582a6a2015-05-25 01:43:34 +0000787 --i; // For loop increments element #.
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000788 }
789 //MI->print(OS, 0);
790 OS << "\n";
791
792 // We successfully added a comment to this instruction.
793 return true;
794}