blob: 04a937807ea6324eaf0abac35b6a6ac3440f9a1e [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
Igor Breger24cab0f2015-11-16 07:22:00 +0000260 CASE_MOVDUP(MOVSLDUP, r)
261 Src1Name = getRegName(MI->getOperand(MI->getNumOperands() - 1).getReg());
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000262 // FALL THROUGH.
Igor Breger1f782962015-11-19 08:26:56 +0000263 CASE_MOVDUP(MOVSLDUP, m)
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000264 DestName = getRegName(MI->getOperand(0).getReg());
Igor Breger1f782962015-11-19 08:26:56 +0000265 DecodeMOVSLDUPMask(getRegOperandVectorVT(MI, MVT::f32, 0), ShuffleMask);
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000266 break;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000267
Igor Breger24cab0f2015-11-16 07:22:00 +0000268 CASE_MOVDUP(MOVSHDUP, r)
269 Src1Name = getRegName(MI->getOperand(MI->getNumOperands() - 1).getReg());
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000270 // FALL THROUGH.
Igor Breger1f782962015-11-19 08:26:56 +0000271 CASE_MOVDUP(MOVSHDUP, m)
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000272 DestName = getRegName(MI->getOperand(0).getReg());
Igor Breger1f782962015-11-19 08:26:56 +0000273 DecodeMOVSHDUPMask(getRegOperandVectorVT(MI, MVT::f32, 0), ShuffleMask);
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000274 break;
275
Igor Breger1f782962015-11-19 08:26:56 +0000276 CASE_MOVDUP(MOVDDUP, r)
277 Src1Name = getRegName(MI->getOperand(MI->getNumOperands() - 1).getReg());
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000278 // FALL THROUGH.
Igor Breger1f782962015-11-19 08:26:56 +0000279 CASE_MOVDUP(MOVDDUP, m)
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000280 DestName = getRegName(MI->getOperand(0).getReg());
Igor Breger1f782962015-11-19 08:26:56 +0000281 DecodeMOVDDUPMask(getRegOperandVectorVT(MI, MVT::f64, 0), ShuffleMask);
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000282 break;
283
284 case X86::PSLLDQri:
285 case X86::VPSLLDQri:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000286 case X86::VPSLLDQYri:
287 Src1Name = getRegName(MI->getOperand(1).getReg());
288 DestName = getRegName(MI->getOperand(0).getReg());
NAKAMURA Takumi5582a6a2015-05-25 01:43:34 +0000289 if (MI->getOperand(MI->getNumOperands() - 1).isImm())
Simon Pilgrimb9ada272015-11-16 22:54:41 +0000290 DecodePSLLDQMask(getRegOperandVectorVT(MI, MVT::i8, 0),
NAKAMURA Takumi5582a6a2015-05-25 01:43:34 +0000291 MI->getOperand(MI->getNumOperands() - 1).getImm(),
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000292 ShuffleMask);
293 break;
294
295 case X86::PSRLDQri:
296 case X86::VPSRLDQri:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000297 case X86::VPSRLDQYri:
298 Src1Name = getRegName(MI->getOperand(1).getReg());
299 DestName = getRegName(MI->getOperand(0).getReg());
NAKAMURA Takumi5582a6a2015-05-25 01:43:34 +0000300 if (MI->getOperand(MI->getNumOperands() - 1).isImm())
Simon Pilgrimb9ada272015-11-16 22:54:41 +0000301 DecodePSRLDQMask(getRegOperandVectorVT(MI, MVT::i8, 0),
NAKAMURA Takumi5582a6a2015-05-25 01:43:34 +0000302 MI->getOperand(MI->getNumOperands() - 1).getImm(),
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000303 ShuffleMask);
304 break;
305
306 case X86::PALIGNR128rr:
307 case X86::VPALIGNR128rr:
Simon Pilgrimb9ada272015-11-16 22:54:41 +0000308 case X86::VPALIGNR256rr:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000309 Src1Name = getRegName(MI->getOperand(2).getReg());
310 // FALL THROUGH.
311 case X86::PALIGNR128rm:
312 case X86::VPALIGNR128rm:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000313 case X86::VPALIGNR256rm:
314 Src2Name = getRegName(MI->getOperand(1).getReg());
315 DestName = getRegName(MI->getOperand(0).getReg());
NAKAMURA Takumi5582a6a2015-05-25 01:43:34 +0000316 if (MI->getOperand(MI->getNumOperands() - 1).isImm())
Simon Pilgrimb9ada272015-11-16 22:54:41 +0000317 DecodePALIGNRMask(getRegOperandVectorVT(MI, MVT::i8, 0),
NAKAMURA Takumi5582a6a2015-05-25 01:43:34 +0000318 MI->getOperand(MI->getNumOperands() - 1).getImm(),
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000319 ShuffleMask);
320 break;
321
322 case X86::PSHUFDri:
323 case X86::VPSHUFDri:
Simon Pilgrim5883a732015-11-16 22:39:27 +0000324 case X86::VPSHUFDYri:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000325 Src1Name = getRegName(MI->getOperand(1).getReg());
326 // FALL THROUGH.
327 case X86::PSHUFDmi:
328 case X86::VPSHUFDmi:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000329 case X86::VPSHUFDYmi:
330 DestName = getRegName(MI->getOperand(0).getReg());
NAKAMURA Takumi5582a6a2015-05-25 01:43:34 +0000331 if (MI->getOperand(MI->getNumOperands() - 1).isImm())
Simon Pilgrim5883a732015-11-16 22:39:27 +0000332 DecodePSHUFMask(getRegOperandVectorVT(MI, MVT::i32, 0),
NAKAMURA Takumi5582a6a2015-05-25 01:43:34 +0000333 MI->getOperand(MI->getNumOperands() - 1).getImm(),
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000334 ShuffleMask);
335 break;
336
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000337 case X86::PSHUFHWri:
338 case X86::VPSHUFHWri:
Simon Pilgrim5883a732015-11-16 22:39:27 +0000339 case X86::VPSHUFHWYri:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000340 Src1Name = getRegName(MI->getOperand(1).getReg());
341 // FALL THROUGH.
342 case X86::PSHUFHWmi:
343 case X86::VPSHUFHWmi:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000344 case X86::VPSHUFHWYmi:
345 DestName = getRegName(MI->getOperand(0).getReg());
NAKAMURA Takumi5582a6a2015-05-25 01:43:34 +0000346 if (MI->getOperand(MI->getNumOperands() - 1).isImm())
Simon Pilgrim5883a732015-11-16 22:39:27 +0000347 DecodePSHUFHWMask(getRegOperandVectorVT(MI, MVT::i16, 0),
NAKAMURA Takumi5582a6a2015-05-25 01:43:34 +0000348 MI->getOperand(MI->getNumOperands() - 1).getImm(),
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000349 ShuffleMask);
350 break;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000351
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000352 case X86::PSHUFLWri:
353 case X86::VPSHUFLWri:
Simon Pilgrim5883a732015-11-16 22:39:27 +0000354 case X86::VPSHUFLWYri:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000355 Src1Name = getRegName(MI->getOperand(1).getReg());
356 // FALL THROUGH.
357 case X86::PSHUFLWmi:
358 case X86::VPSHUFLWmi:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000359 case X86::VPSHUFLWYmi:
360 DestName = getRegName(MI->getOperand(0).getReg());
NAKAMURA Takumi5582a6a2015-05-25 01:43:34 +0000361 if (MI->getOperand(MI->getNumOperands() - 1).isImm())
Simon Pilgrim5883a732015-11-16 22:39:27 +0000362 DecodePSHUFLWMask(getRegOperandVectorVT(MI, MVT::i16, 0),
NAKAMURA Takumi5582a6a2015-05-25 01:43:34 +0000363 MI->getOperand(MI->getNumOperands() - 1).getImm(),
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000364 ShuffleMask);
365 break;
366
Simon Pilgrimf8f86ab2015-09-13 11:28:45 +0000367 case X86::MMX_PSHUFWri:
368 Src1Name = getRegName(MI->getOperand(1).getReg());
369 // FALL THROUGH.
370 case X86::MMX_PSHUFWmi:
371 DestName = getRegName(MI->getOperand(0).getReg());
372 if (MI->getOperand(MI->getNumOperands() - 1).isImm())
373 DecodePSHUFMask(MVT::v4i16,
374 MI->getOperand(MI->getNumOperands() - 1).getImm(),
375 ShuffleMask);
376 break;
377
378 case X86::PSWAPDrr:
379 Src1Name = getRegName(MI->getOperand(1).getReg());
380 // FALL THROUGH.
381 case X86::PSWAPDrm:
382 DestName = getRegName(MI->getOperand(0).getReg());
383 DecodePSWAPMask(MVT::v2i32, ShuffleMask);
384 break;
385
Simon Pilgrim8483df62015-11-17 22:35:45 +0000386 CASE_UNPCK(PUNPCKHBW, r)
Simon Pilgrimf8f86ab2015-09-13 11:28:45 +0000387 case X86::MMX_PUNPCKHBWirr:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000388 Src2Name = getRegName(MI->getOperand(2).getReg());
389 // FALL THROUGH.
Simon Pilgrim8483df62015-11-17 22:35:45 +0000390 CASE_UNPCK(PUNPCKHBW, m)
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000391 case X86::MMX_PUNPCKHBWirm:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000392 Src1Name = getRegName(MI->getOperand(1).getReg());
393 DestName = getRegName(MI->getOperand(0).getReg());
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000394 DecodeUNPCKHMask(getRegOperandVectorVT(MI, MVT::i8, 0), ShuffleMask);
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000395 break;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000396
Simon Pilgrim8483df62015-11-17 22:35:45 +0000397 CASE_UNPCK(PUNPCKHWD, r)
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000398 case X86::MMX_PUNPCKHWDirr:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000399 Src2Name = getRegName(MI->getOperand(2).getReg());
400 // FALL THROUGH.
Simon Pilgrim8483df62015-11-17 22:35:45 +0000401 CASE_UNPCK(PUNPCKHWD, m)
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000402 case X86::MMX_PUNPCKHWDirm:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000403 Src1Name = getRegName(MI->getOperand(1).getReg());
404 DestName = getRegName(MI->getOperand(0).getReg());
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000405 DecodeUNPCKHMask(getRegOperandVectorVT(MI, MVT::i16, 0), ShuffleMask);
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000406 break;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000407
Simon Pilgrim8483df62015-11-17 22:35:45 +0000408 CASE_UNPCK(PUNPCKHDQ, r)
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000409 case X86::MMX_PUNPCKHDQirr:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000410 Src2Name = getRegName(MI->getOperand(2).getReg());
411 // FALL THROUGH.
Simon Pilgrim8483df62015-11-17 22:35:45 +0000412 CASE_UNPCK(PUNPCKHDQ, m)
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000413 case X86::MMX_PUNPCKHDQirm:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000414 Src1Name = getRegName(MI->getOperand(1).getReg());
415 DestName = getRegName(MI->getOperand(0).getReg());
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000416 DecodeUNPCKHMask(getRegOperandVectorVT(MI, MVT::i32, 0), ShuffleMask);
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000417 break;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000418
Simon Pilgrim8483df62015-11-17 22:35:45 +0000419 CASE_UNPCK(PUNPCKHQDQ, r)
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(PUNPCKHQDQ, m)
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000423 Src1Name = getRegName(MI->getOperand(1).getReg());
424 DestName = getRegName(MI->getOperand(0).getReg());
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000425 DecodeUNPCKHMask(getRegOperandVectorVT(MI, MVT::i64, 0), ShuffleMask);
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000426 break;
427
Simon Pilgrim8483df62015-11-17 22:35:45 +0000428 CASE_UNPCK(PUNPCKLBW, r)
Simon Pilgrimf8f86ab2015-09-13 11:28:45 +0000429 case X86::MMX_PUNPCKLBWirr:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000430 Src2Name = getRegName(MI->getOperand(2).getReg());
431 // FALL THROUGH.
Simon Pilgrim8483df62015-11-17 22:35:45 +0000432 CASE_UNPCK(PUNPCKLBW, m)
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000433 case X86::MMX_PUNPCKLBWirm:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000434 Src1Name = getRegName(MI->getOperand(1).getReg());
435 DestName = getRegName(MI->getOperand(0).getReg());
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000436 DecodeUNPCKLMask(getRegOperandVectorVT(MI, MVT::i8, 0), ShuffleMask);
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000437 break;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000438
Simon Pilgrim8483df62015-11-17 22:35:45 +0000439 CASE_UNPCK(PUNPCKLWD, r)
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000440 case X86::MMX_PUNPCKLWDirr:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000441 Src2Name = getRegName(MI->getOperand(2).getReg());
442 // FALL THROUGH.
Simon Pilgrim8483df62015-11-17 22:35:45 +0000443 CASE_UNPCK(PUNPCKLWD, m)
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000444 case X86::MMX_PUNPCKLWDirm:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000445 Src1Name = getRegName(MI->getOperand(1).getReg());
446 DestName = getRegName(MI->getOperand(0).getReg());
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000447 DecodeUNPCKLMask(getRegOperandVectorVT(MI, MVT::i16, 0), ShuffleMask);
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000448 break;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000449
Simon Pilgrim8483df62015-11-17 22:35:45 +0000450 CASE_UNPCK(PUNPCKLDQ, r)
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000451 case X86::MMX_PUNPCKLDQirr:
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(PUNPCKLDQ, m)
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000455 case X86::MMX_PUNPCKLDQirm:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000456 Src1Name = getRegName(MI->getOperand(1).getReg());
457 DestName = getRegName(MI->getOperand(0).getReg());
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000458 DecodeUNPCKLMask(getRegOperandVectorVT(MI, MVT::i32, 0), ShuffleMask);
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000459 break;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000460
Simon Pilgrim8483df62015-11-17 22:35:45 +0000461 CASE_UNPCK(PUNPCKLQDQ, r)
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(PUNPCKLQDQ, m)
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000465 Src1Name = getRegName(MI->getOperand(1).getReg());
466 DestName = getRegName(MI->getOperand(0).getReg());
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000467 DecodeUNPCKLMask(getRegOperandVectorVT(MI, MVT::i64, 0), ShuffleMask);
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000468 break;
469
Simon Pilgrim2da41782015-11-17 23:29:49 +0000470 CASE_SHUF(SHUFPD, r)
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000471 Src2Name = getRegName(MI->getOperand(2).getReg());
472 // FALL THROUGH.
Simon Pilgrim2da41782015-11-17 23:29:49 +0000473 CASE_SHUF(SHUFPD, m)
NAKAMURA Takumi5582a6a2015-05-25 01:43:34 +0000474 if (MI->getOperand(MI->getNumOperands() - 1).isImm())
Simon Pilgrim5883a732015-11-16 22:39:27 +0000475 DecodeSHUFPMask(getRegOperandVectorVT(MI, MVT::f64, 0),
NAKAMURA Takumi5582a6a2015-05-25 01:43:34 +0000476 MI->getOperand(MI->getNumOperands() - 1).getImm(),
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000477 ShuffleMask);
478 Src1Name = getRegName(MI->getOperand(1).getReg());
479 DestName = getRegName(MI->getOperand(0).getReg());
480 break;
481
Simon Pilgrim2da41782015-11-17 23:29:49 +0000482 CASE_SHUF(SHUFPS, r)
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000483 Src2Name = getRegName(MI->getOperand(2).getReg());
484 // FALL THROUGH.
Simon Pilgrim2da41782015-11-17 23:29:49 +0000485 CASE_SHUF(SHUFPS, m)
NAKAMURA Takumi5582a6a2015-05-25 01:43:34 +0000486 if (MI->getOperand(MI->getNumOperands() - 1).isImm())
Simon Pilgrim5883a732015-11-16 22:39:27 +0000487 DecodeSHUFPMask(getRegOperandVectorVT(MI, MVT::f32, 0),
NAKAMURA Takumi5582a6a2015-05-25 01:43:34 +0000488 MI->getOperand(MI->getNumOperands() - 1).getImm(),
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000489 ShuffleMask);
490 Src1Name = getRegName(MI->getOperand(1).getReg());
491 DestName = getRegName(MI->getOperand(0).getReg());
492 break;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000493
Igor Breger24cab0f2015-11-16 07:22:00 +0000494 CASE_VSHUF(64X2, r)
495 CASE_VSHUF(64X2, m)
496 CASE_VSHUF(32X4, r)
497 CASE_VSHUF(32X4, m) {
Igor Bregerd7bae452015-10-15 13:29:07 +0000498 MVT VT;
499 bool HasMemOp;
500 unsigned NumOp = MI->getNumOperands();
501 getVSHUF64x2FamilyInfo(MI, VT, HasMemOp);
502 decodeVSHUF64x2FamilyMask(VT, MI->getOperand(NumOp - 1).getImm(),
503 ShuffleMask);
504 DestName = getRegName(MI->getOperand(0).getReg());
505 if (HasMemOp) {
506 assert((NumOp >= 8) && "Expected at least 8 operands!");
507 Src1Name = getRegName(MI->getOperand(NumOp - 7).getReg());
508 } else {
509 assert((NumOp >= 4) && "Expected at least 4 operands!");
510 Src2Name = getRegName(MI->getOperand(NumOp - 2).getReg());
511 Src1Name = getRegName(MI->getOperand(NumOp - 3).getReg());
512 }
513 break;
514 }
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000515
Simon Pilgrim8483df62015-11-17 22:35:45 +0000516 CASE_UNPCK(UNPCKLPD, r)
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000517 Src2Name = getRegName(MI->getOperand(2).getReg());
518 // FALL THROUGH.
Simon Pilgrim8483df62015-11-17 22:35:45 +0000519 CASE_UNPCK(UNPCKLPD, m)
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000520 DecodeUNPCKLMask(getRegOperandVectorVT(MI, MVT::f64, 0), ShuffleMask);
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000521 Src1Name = getRegName(MI->getOperand(1).getReg());
522 DestName = getRegName(MI->getOperand(0).getReg());
523 break;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000524
Simon Pilgrim8483df62015-11-17 22:35:45 +0000525 CASE_UNPCK(UNPCKLPS, r)
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000526 Src2Name = getRegName(MI->getOperand(2).getReg());
527 // FALL THROUGH.
Simon Pilgrim8483df62015-11-17 22:35:45 +0000528 CASE_UNPCK(UNPCKLPS, m)
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000529 DecodeUNPCKLMask(getRegOperandVectorVT(MI, MVT::f32, 0), ShuffleMask);
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000530 Src1Name = getRegName(MI->getOperand(1).getReg());
531 DestName = getRegName(MI->getOperand(0).getReg());
532 break;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000533
Simon Pilgrim8483df62015-11-17 22:35:45 +0000534 CASE_UNPCK(UNPCKHPD, r)
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000535 Src2Name = getRegName(MI->getOperand(2).getReg());
536 // FALL THROUGH.
Simon Pilgrim8483df62015-11-17 22:35:45 +0000537 CASE_UNPCK(UNPCKHPD, m)
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000538 DecodeUNPCKHMask(getRegOperandVectorVT(MI, MVT::f64, 0), ShuffleMask);
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000539 Src1Name = getRegName(MI->getOperand(1).getReg());
540 DestName = getRegName(MI->getOperand(0).getReg());
541 break;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000542
Simon Pilgrim8483df62015-11-17 22:35:45 +0000543 CASE_UNPCK(UNPCKHPS, r)
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000544 Src2Name = getRegName(MI->getOperand(2).getReg());
545 // FALL THROUGH.
Simon Pilgrim8483df62015-11-17 22:35:45 +0000546 CASE_UNPCK(UNPCKHPS, m)
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000547 DecodeUNPCKHMask(getRegOperandVectorVT(MI, MVT::f32, 0), ShuffleMask);
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000548 Src1Name = getRegName(MI->getOperand(1).getReg());
549 DestName = getRegName(MI->getOperand(0).getReg());
550 break;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000551
Simon Pilgrim2da41782015-11-17 23:29:49 +0000552 CASE_VPERM(PERMILPS, r)
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000553 Src1Name = getRegName(MI->getOperand(1).getReg());
554 // FALL THROUGH.
Simon Pilgrim2da41782015-11-17 23:29:49 +0000555 CASE_VPERM(PERMILPS, m)
NAKAMURA Takumi5582a6a2015-05-25 01:43:34 +0000556 if (MI->getOperand(MI->getNumOperands() - 1).isImm())
Simon Pilgrim5883a732015-11-16 22:39:27 +0000557 DecodePSHUFMask(getRegOperandVectorVT(MI, MVT::f32, 0),
NAKAMURA Takumi5582a6a2015-05-25 01:43:34 +0000558 MI->getOperand(MI->getNumOperands() - 1).getImm(),
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000559 ShuffleMask);
560 DestName = getRegName(MI->getOperand(0).getReg());
561 break;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000562
Simon Pilgrim2da41782015-11-17 23:29:49 +0000563 CASE_VPERM(PERMILPD, r)
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000564 Src1Name = getRegName(MI->getOperand(1).getReg());
565 // FALL THROUGH.
Simon Pilgrim2da41782015-11-17 23:29:49 +0000566 CASE_VPERM(PERMILPD, m)
NAKAMURA Takumi5582a6a2015-05-25 01:43:34 +0000567 if (MI->getOperand(MI->getNumOperands() - 1).isImm())
Simon Pilgrim5883a732015-11-16 22:39:27 +0000568 DecodePSHUFMask(getRegOperandVectorVT(MI, MVT::f64, 0),
NAKAMURA Takumi5582a6a2015-05-25 01:43:34 +0000569 MI->getOperand(MI->getNumOperands() - 1).getImm(),
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000570 ShuffleMask);
571 DestName = getRegName(MI->getOperand(0).getReg());
572 break;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000573
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000574 case X86::VPERM2F128rr:
575 case X86::VPERM2I128rr:
576 Src2Name = getRegName(MI->getOperand(2).getReg());
577 // FALL THROUGH.
578 case X86::VPERM2F128rm:
579 case X86::VPERM2I128rm:
580 // For instruction comments purpose, assume the 256-bit vector is v4i64.
NAKAMURA Takumi5582a6a2015-05-25 01:43:34 +0000581 if (MI->getOperand(MI->getNumOperands() - 1).isImm())
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000582 DecodeVPERM2X128Mask(MVT::v4i64,
NAKAMURA Takumi5582a6a2015-05-25 01:43:34 +0000583 MI->getOperand(MI->getNumOperands() - 1).getImm(),
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000584 ShuffleMask);
585 Src1Name = getRegName(MI->getOperand(1).getReg());
586 DestName = getRegName(MI->getOperand(0).getReg());
587 break;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000588
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000589 case X86::VPERMQYri:
590 case X86::VPERMPDYri:
591 Src1Name = getRegName(MI->getOperand(1).getReg());
592 // FALL THROUGH.
593 case X86::VPERMQYmi:
594 case X86::VPERMPDYmi:
NAKAMURA Takumi5582a6a2015-05-25 01:43:34 +0000595 if (MI->getOperand(MI->getNumOperands() - 1).isImm())
596 DecodeVPERMMask(MI->getOperand(MI->getNumOperands() - 1).getImm(),
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000597 ShuffleMask);
598 DestName = getRegName(MI->getOperand(0).getReg());
599 break;
600
601 case X86::MOVSDrr:
602 case X86::VMOVSDrr:
Simon Pilgrimf5c23ad2016-02-01 22:26:28 +0000603 case X86::VMOVSDZrr:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000604 Src2Name = getRegName(MI->getOperand(2).getReg());
605 Src1Name = getRegName(MI->getOperand(1).getReg());
606 // FALL THROUGH.
607 case X86::MOVSDrm:
608 case X86::VMOVSDrm:
Simon Pilgrimf5c23ad2016-02-01 22:26:28 +0000609 case X86::VMOVSDZrm:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000610 DecodeScalarMoveMask(MVT::v2f64, nullptr == Src2Name, ShuffleMask);
611 DestName = getRegName(MI->getOperand(0).getReg());
612 break;
Simon Pilgrimd5a15442015-11-21 13:04:42 +0000613
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000614 case X86::MOVSSrr:
615 case X86::VMOVSSrr:
Simon Pilgrimf5c23ad2016-02-01 22:26:28 +0000616 case X86::VMOVSSZrr:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000617 Src2Name = getRegName(MI->getOperand(2).getReg());
618 Src1Name = getRegName(MI->getOperand(1).getReg());
619 // FALL THROUGH.
620 case X86::MOVSSrm:
621 case X86::VMOVSSrm:
Simon Pilgrimf5c23ad2016-02-01 22:26:28 +0000622 case X86::VMOVSSZrm:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000623 DecodeScalarMoveMask(MVT::v4f32, nullptr == Src2Name, ShuffleMask);
624 DestName = getRegName(MI->getOperand(0).getReg());
625 break;
626
627 case X86::MOVPQI2QIrr:
Simon Pilgrim3e0c0222015-12-13 12:49:48 +0000628 case X86::MOVZPQILo2PQIrr:
629 case X86::VMOVPQI2QIrr:
630 case X86::VMOVZPQILo2PQIrr:
631 case X86::VMOVZPQILo2PQIZrr:
632 Src1Name = getRegName(MI->getOperand(1).getReg());
633 // FALL THROUGH.
634 case X86::MOVQI2PQIrm:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000635 case X86::MOVZQI2PQIrm:
636 case X86::MOVZPQILo2PQIrm:
Simon Pilgrim3e0c0222015-12-13 12:49:48 +0000637 case X86::VMOVQI2PQIrm:
Simon Pilgrim96fe4ef2016-02-02 13:32:56 +0000638 case X86::VMOVQI2PQIZrm:
Simon Pilgrim3e0c0222015-12-13 12:49:48 +0000639 case X86::VMOVZQI2PQIrm:
640 case X86::VMOVZPQILo2PQIrm:
641 case X86::VMOVZPQILo2PQIZrm:
642 DecodeZeroMoveLowMask(MVT::v2i64, ShuffleMask);
643 DestName = getRegName(MI->getOperand(0).getReg());
644 break;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000645
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000646 case X86::MOVDI2PDIrm:
647 case X86::VMOVDI2PDIrm:
Simon Pilgrim5be17b62016-02-01 23:04:05 +0000648 case X86::VMOVDI2PDIZrm:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000649 DecodeZeroMoveLowMask(MVT::v4i32, ShuffleMask);
650 DestName = getRegName(MI->getOperand(0).getReg());
651 break;
652
Simon Pilgrimd85cae32015-07-06 20:46:41 +0000653 case X86::EXTRQI:
654 if (MI->getOperand(2).isImm() &&
655 MI->getOperand(3).isImm())
656 DecodeEXTRQIMask(MI->getOperand(2).getImm(),
657 MI->getOperand(3).getImm(),
658 ShuffleMask);
659
660 DestName = getRegName(MI->getOperand(0).getReg());
661 Src1Name = getRegName(MI->getOperand(1).getReg());
662 break;
663
664 case X86::INSERTQI:
665 if (MI->getOperand(3).isImm() &&
666 MI->getOperand(4).isImm())
667 DecodeINSERTQIMask(MI->getOperand(3).getImm(),
668 MI->getOperand(4).getImm(),
669 ShuffleMask);
670
671 DestName = getRegName(MI->getOperand(0).getReg());
672 Src1Name = getRegName(MI->getOperand(1).getReg());
673 Src2Name = getRegName(MI->getOperand(2).getReg());
674 break;
675
Simon Pilgrim0acc32a2016-02-06 19:51:21 +0000676 CASE_PMOVZX(PMOVZXBW, r)
677 CASE_PMOVZX(PMOVZXBD, r)
678 CASE_PMOVZX(PMOVZXBQ, r)
679 Src1Name = getRegName(MI->getOperand(MI->getNumOperands() - 1).getReg());
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000680 // FALL THROUGH.
Simon Pilgrim0acc32a2016-02-06 19:51:21 +0000681 CASE_PMOVZX(PMOVZXBW, m)
682 CASE_PMOVZX(PMOVZXBD, m)
683 CASE_PMOVZX(PMOVZXBQ, m)
Simon Pilgrime1b6db92016-02-06 16:33:42 +0000684 DecodeZeroExtendMask(MVT::i8, getZeroExtensionResultType(MI), ShuffleMask);
685 DestName = getRegName(MI->getOperand(0).getReg());
686 break;
687
Simon Pilgrim0acc32a2016-02-06 19:51:21 +0000688 CASE_PMOVZX(PMOVZXWD, r)
689 CASE_PMOVZX(PMOVZXWQ, r)
690 Src1Name = getRegName(MI->getOperand(MI->getNumOperands() - 1).getReg());
Simon Pilgrime1b6db92016-02-06 16:33:42 +0000691 // FALL THROUGH.
Simon Pilgrim0acc32a2016-02-06 19:51:21 +0000692 CASE_PMOVZX(PMOVZXWD, m)
693 CASE_PMOVZX(PMOVZXWQ, m)
Simon Pilgrime1b6db92016-02-06 16:33:42 +0000694 DecodeZeroExtendMask(MVT::i16, getZeroExtensionResultType(MI), ShuffleMask);
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000695 DestName = getRegName(MI->getOperand(0).getReg());
Simon Pilgrime1b6db92016-02-06 16:33:42 +0000696 break;
697
Simon Pilgrim0acc32a2016-02-06 19:51:21 +0000698 CASE_PMOVZX(PMOVZXDQ, r)
699 Src1Name = getRegName(MI->getOperand(MI->getNumOperands() - 1).getReg());
Simon Pilgrime1b6db92016-02-06 16:33:42 +0000700 // FALL THROUGH.
Simon Pilgrim0acc32a2016-02-06 19:51:21 +0000701 CASE_PMOVZX(PMOVZXDQ, m)
Simon Pilgrime1b6db92016-02-06 16:33:42 +0000702 DecodeZeroExtendMask(MVT::i32, getZeroExtensionResultType(MI), ShuffleMask);
703 DestName = getRegName(MI->getOperand(0).getReg());
704 break;
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000705 }
706
707 // The only comments we decode are shuffles, so give up if we were unable to
708 // decode a shuffle mask.
709 if (ShuffleMask.empty())
710 return false;
711
712 if (!DestName) DestName = Src1Name;
713 OS << (DestName ? DestName : "mem") << " = ";
714
715 // If the two sources are the same, canonicalize the input elements to be
716 // from the first src so that we get larger element spans.
717 if (Src1Name == Src2Name) {
718 for (unsigned i = 0, e = ShuffleMask.size(); i != e; ++i) {
719 if ((int)ShuffleMask[i] >= 0 && // Not sentinel.
NAKAMURA Takumi5582a6a2015-05-25 01:43:34 +0000720 ShuffleMask[i] >= (int)e) // From second mask.
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000721 ShuffleMask[i] -= e;
722 }
723 }
724
725 // The shuffle mask specifies which elements of the src1/src2 fill in the
726 // destination, with a few sentinel values. Loop through and print them
727 // out.
728 for (unsigned i = 0, e = ShuffleMask.size(); i != e; ++i) {
729 if (i != 0)
730 OS << ',';
731 if (ShuffleMask[i] == SM_SentinelZero) {
732 OS << "zero";
733 continue;
734 }
735
736 // Otherwise, it must come from src1 or src2. Print the span of elements
737 // that comes from this src.
738 bool isSrc1 = ShuffleMask[i] < (int)ShuffleMask.size();
739 const char *SrcName = isSrc1 ? Src1Name : Src2Name;
740 OS << (SrcName ? SrcName : "mem") << '[';
741 bool IsFirst = true;
742 while (i != e && (int)ShuffleMask[i] != SM_SentinelZero &&
743 (ShuffleMask[i] < (int)ShuffleMask.size()) == isSrc1) {
744 if (!IsFirst)
745 OS << ',';
746 else
747 IsFirst = false;
748 if (ShuffleMask[i] == SM_SentinelUndef)
749 OS << "u";
750 else
751 OS << ShuffleMask[i] % ShuffleMask.size();
752 ++i;
753 }
754 OS << ']';
NAKAMURA Takumi5582a6a2015-05-25 01:43:34 +0000755 --i; // For loop increments element #.
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000756 }
757 //MI->print(OS, 0);
758 OS << "\n";
759
760 // We successfully added a comment to this instruction.
761 return true;
762}