blob: 35aff6989717692e78a57965aa32b9c7c996ebaf [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
43#define CASE_UNPCK(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
51#define CASE_SHUF(Inst, src) \
52 CASE_MASK_INS_COMMON(Inst, Z, r##src##i) \
53 CASE_MASK_INS_COMMON(Inst, Z256, r##src##i) \
54 CASE_MASK_INS_COMMON(Inst, Z128, r##src##i) \
55 CASE_AVX_INS_COMMON(Inst, , r##src##i) \
56 CASE_AVX_INS_COMMON(Inst, Y, r##src##i) \
57 CASE_SSE_INS_COMMON(Inst, r##src##i)
58
59#define CASE_VPERM(Inst, src) \
60 CASE_MASK_INS_COMMON(Inst, Z, src##i) \
61 CASE_MASK_INS_COMMON(Inst, Z256, src##i) \
62 CASE_MASK_INS_COMMON(Inst, Z128, src##i) \
63 CASE_AVX_INS_COMMON(Inst, , src##i) \
64 CASE_AVX_INS_COMMON(Inst, Y, src##i)
65
66#define CASE_VSHUF(Inst, src) \
67 CASE_MASK_INS_COMMON(SHUFF##Inst, Z, r##src##i) \
68 CASE_MASK_INS_COMMON(SHUFI##Inst, Z, r##src##i) \
69 CASE_MASK_INS_COMMON(SHUFF##Inst, Z256, r##src##i) \
70 CASE_MASK_INS_COMMON(SHUFI##Inst, Z256, r##src##i)
71
Igor Breger24cab0f2015-11-16 07:22:00 +000072static unsigned getVectorRegSize(unsigned RegNo) {
Igor Breger24cab0f2015-11-16 07:22:00 +000073 if (X86::ZMM0 <= RegNo && RegNo <= X86::ZMM31)
74 return 512;
75 if (X86::YMM0 <= RegNo && RegNo <= X86::YMM31)
76 return 256;
77 if (X86::XMM0 <= RegNo && RegNo <= X86::XMM31)
78 return 128;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +000079 if (X86::MM0 <= RegNo && RegNo <= X86::MM7)
80 return 64;
Igor Breger24cab0f2015-11-16 07:22:00 +000081
82 llvm_unreachable("Unknown vector reg!");
Igor Breger24cab0f2015-11-16 07:22:00 +000083}
84
85static MVT getRegOperandVectorVT(const MCInst *MI, const MVT &ScalarVT,
86 unsigned OperandIndex) {
87 unsigned OpReg = MI->getOperand(OperandIndex).getReg();
88 return MVT::getVectorVT(ScalarVT,
89 getVectorRegSize(OpReg)/ScalarVT.getSizeInBits());
90}
91
Simon Pilgrime1b6db92016-02-06 16:33:42 +000092/// \brief Extracts the dst type for a given zero extension instruction.
93static MVT getZeroExtensionResultType(const MCInst *MI) {
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +000094 switch (MI->getOpcode()) {
95 default:
96 llvm_unreachable("Unknown zero extension instruction");
Simon Pilgrime1b6db92016-02-06 16:33:42 +000097 // zero extension to i16
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +000098 case X86::PMOVZXBWrm:
99 case X86::PMOVZXBWrr:
100 case X86::VPMOVZXBWrm:
101 case X86::VPMOVZXBWrr:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000102 case X86::VPMOVZXBWYrm:
103 case X86::VPMOVZXBWYrr:
Simon Pilgrime1b6db92016-02-06 16:33:42 +0000104 return getRegOperandVectorVT(MI, MVT::i16, 0);
105 // zero extension to i32
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000106 case X86::PMOVZXBDrm:
107 case X86::PMOVZXBDrr:
108 case X86::VPMOVZXBDrm:
109 case X86::VPMOVZXBDrr:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000110 case X86::VPMOVZXBDYrm:
111 case X86::VPMOVZXBDYrr:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000112 case X86::PMOVZXWDrm:
113 case X86::PMOVZXWDrr:
114 case X86::VPMOVZXWDrm:
115 case X86::VPMOVZXWDrr:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000116 case X86::VPMOVZXWDYrm:
117 case X86::VPMOVZXWDYrr:
Simon Pilgrime1b6db92016-02-06 16:33:42 +0000118 return getRegOperandVectorVT(MI, MVT::i32, 0);
119 // zero extension to i64
120 case X86::PMOVZXBQrm:
121 case X86::PMOVZXBQrr:
122 case X86::VPMOVZXBQrm:
123 case X86::VPMOVZXBQrr:
124 case X86::VPMOVZXBQYrm:
125 case X86::VPMOVZXBQYrr:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000126 case X86::PMOVZXWQrm:
127 case X86::PMOVZXWQrr:
128 case X86::VPMOVZXWQrm:
129 case X86::VPMOVZXWQrr:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000130 case X86::VPMOVZXWQYrm:
131 case X86::VPMOVZXWQYrr:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000132 case X86::PMOVZXDQrm:
133 case X86::PMOVZXDQrr:
134 case X86::VPMOVZXDQrm:
135 case X86::VPMOVZXDQrr:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000136 case X86::VPMOVZXDQYrm:
137 case X86::VPMOVZXDQYrr:
Simon Pilgrime1b6db92016-02-06 16:33:42 +0000138 return getRegOperandVectorVT(MI, MVT::i64, 0);
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000139 }
140}
141
Igor Bregerd7bae452015-10-15 13:29:07 +0000142/// \brief Extracts the types and if it has memory operand for a given
143/// (SHUFF32x4/SHUFF64x2/SHUFI32x4/SHUFI64x2) instruction.
144static void getVSHUF64x2FamilyInfo(const MCInst *MI, MVT &VT, bool &HasMemOp) {
145 HasMemOp = false;
146 switch (MI->getOpcode()) {
147 default:
148 llvm_unreachable("Unknown VSHUF64x2 family instructions.");
149 break;
Igor Breger24cab0f2015-11-16 07:22:00 +0000150 CASE_VSHUF(64X2, m)
Igor Bregerd7bae452015-10-15 13:29:07 +0000151 HasMemOp = true; // FALL THROUGH.
Igor Breger24cab0f2015-11-16 07:22:00 +0000152 CASE_VSHUF(64X2, r)
153 VT = getRegOperandVectorVT(MI, MVT::i64, 0);
Igor Bregerd7bae452015-10-15 13:29:07 +0000154 break;
Igor Breger24cab0f2015-11-16 07:22:00 +0000155 CASE_VSHUF(32X4, m)
Igor Bregerd7bae452015-10-15 13:29:07 +0000156 HasMemOp = true; // FALL THROUGH.
Igor Breger24cab0f2015-11-16 07:22:00 +0000157 CASE_VSHUF(32X4, r)
158 VT = getRegOperandVectorVT(MI, MVT::i32, 0);
Igor Bregerd7bae452015-10-15 13:29:07 +0000159 break;
160 }
161}
162
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000163//===----------------------------------------------------------------------===//
164// Top Level Entrypoint
165//===----------------------------------------------------------------------===//
166
167/// EmitAnyX86InstComments - This function decodes x86 instructions and prints
168/// newline terminated strings to the specified string if desired. This
169/// information is shown in disassembly dumps when verbose assembly is enabled.
170bool llvm::EmitAnyX86InstComments(const MCInst *MI, raw_ostream &OS,
171 const char *(*getRegName)(unsigned)) {
172 // If this is a shuffle operation, the switch should fill in this state.
173 SmallVector<int, 8> ShuffleMask;
174 const char *DestName = nullptr, *Src1Name = nullptr, *Src2Name = nullptr;
175
176 switch (MI->getOpcode()) {
177 default:
178 // Not an instruction for which we can decode comments.
179 return false;
180
181 case X86::BLENDPDrri:
182 case X86::VBLENDPDrri:
Simon Pilgrim13d3a202015-11-16 23:03:18 +0000183 case X86::VBLENDPDYrri:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000184 Src2Name = getRegName(MI->getOperand(2).getReg());
185 // FALL THROUGH.
186 case X86::BLENDPDrmi:
187 case X86::VBLENDPDrmi:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000188 case X86::VBLENDPDYrmi:
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::f64, 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::BLENDPSrri:
198 case X86::VBLENDPSrri:
Simon Pilgrim13d3a202015-11-16 23:03:18 +0000199 case X86::VBLENDPSYrri:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000200 Src2Name = getRegName(MI->getOperand(2).getReg());
201 // FALL THROUGH.
202 case X86::BLENDPSrmi:
203 case X86::VBLENDPSrmi:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000204 case X86::VBLENDPSYrmi:
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::f32, 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::PBLENDWrri:
214 case X86::VPBLENDWrri:
Simon Pilgrim13d3a202015-11-16 23:03:18 +0000215 case X86::VPBLENDWYrri:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000216 Src2Name = getRegName(MI->getOperand(2).getReg());
217 // FALL THROUGH.
218 case X86::PBLENDWrmi:
219 case X86::VPBLENDWrmi:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000220 case X86::VPBLENDWYrmi:
NAKAMURA Takumi5582a6a2015-05-25 01:43:34 +0000221 if (MI->getOperand(MI->getNumOperands() - 1).isImm())
Simon Pilgrim13d3a202015-11-16 23:03:18 +0000222 DecodeBLENDMask(getRegOperandVectorVT(MI, MVT::i16, 0),
NAKAMURA Takumi5582a6a2015-05-25 01:43:34 +0000223 MI->getOperand(MI->getNumOperands() - 1).getImm(),
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000224 ShuffleMask);
225 Src1Name = getRegName(MI->getOperand(1).getReg());
226 DestName = getRegName(MI->getOperand(0).getReg());
227 break;
228
229 case X86::VPBLENDDrri:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000230 case X86::VPBLENDDYrri:
231 Src2Name = getRegName(MI->getOperand(2).getReg());
232 // FALL THROUGH.
Simon Pilgrim13d3a202015-11-16 23:03:18 +0000233 case X86::VPBLENDDrmi:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000234 case X86::VPBLENDDYrmi:
NAKAMURA Takumi5582a6a2015-05-25 01:43:34 +0000235 if (MI->getOperand(MI->getNumOperands() - 1).isImm())
Simon Pilgrim13d3a202015-11-16 23:03:18 +0000236 DecodeBLENDMask(getRegOperandVectorVT(MI, MVT::i32, 0),
NAKAMURA Takumi5582a6a2015-05-25 01:43:34 +0000237 MI->getOperand(MI->getNumOperands() - 1).getImm(),
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000238 ShuffleMask);
239 Src1Name = getRegName(MI->getOperand(1).getReg());
240 DestName = getRegName(MI->getOperand(0).getReg());
241 break;
242
243 case X86::INSERTPSrr:
244 case X86::VINSERTPSrr:
Simon Pilgrim025a3d852016-02-01 22:05:50 +0000245 case X86::VINSERTPSzrr:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000246 Src2Name = getRegName(MI->getOperand(2).getReg());
247 // FALL THROUGH.
248 case X86::INSERTPSrm:
249 case X86::VINSERTPSrm:
Simon Pilgrim025a3d852016-02-01 22:05:50 +0000250 case X86::VINSERTPSzrm:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000251 DestName = getRegName(MI->getOperand(0).getReg());
252 Src1Name = getRegName(MI->getOperand(1).getReg());
NAKAMURA Takumi5582a6a2015-05-25 01:43:34 +0000253 if (MI->getOperand(MI->getNumOperands() - 1).isImm())
254 DecodeINSERTPSMask(MI->getOperand(MI->getNumOperands() - 1).getImm(),
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000255 ShuffleMask);
256 break;
257
258 case X86::MOVLHPSrr:
259 case X86::VMOVLHPSrr:
Simon Pilgrimd5a15442015-11-21 13:04:42 +0000260 case X86::VMOVLHPSZrr:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000261 Src2Name = getRegName(MI->getOperand(2).getReg());
262 Src1Name = getRegName(MI->getOperand(1).getReg());
263 DestName = getRegName(MI->getOperand(0).getReg());
264 DecodeMOVLHPSMask(2, ShuffleMask);
265 break;
266
267 case X86::MOVHLPSrr:
268 case X86::VMOVHLPSrr:
Simon Pilgrimd5a15442015-11-21 13:04:42 +0000269 case X86::VMOVHLPSZrr:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000270 Src2Name = getRegName(MI->getOperand(2).getReg());
271 Src1Name = getRegName(MI->getOperand(1).getReg());
272 DestName = getRegName(MI->getOperand(0).getReg());
273 DecodeMOVHLPSMask(2, ShuffleMask);
274 break;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000275
Igor Breger24cab0f2015-11-16 07:22:00 +0000276 CASE_MOVDUP(MOVSLDUP, 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(MOVSLDUP, m)
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000280 DestName = getRegName(MI->getOperand(0).getReg());
Igor Breger1f782962015-11-19 08:26:56 +0000281 DecodeMOVSLDUPMask(getRegOperandVectorVT(MI, MVT::f32, 0), ShuffleMask);
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000282 break;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000283
Igor Breger24cab0f2015-11-16 07:22:00 +0000284 CASE_MOVDUP(MOVSHDUP, r)
285 Src1Name = getRegName(MI->getOperand(MI->getNumOperands() - 1).getReg());
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000286 // FALL THROUGH.
Igor Breger1f782962015-11-19 08:26:56 +0000287 CASE_MOVDUP(MOVSHDUP, m)
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000288 DestName = getRegName(MI->getOperand(0).getReg());
Igor Breger1f782962015-11-19 08:26:56 +0000289 DecodeMOVSHDUPMask(getRegOperandVectorVT(MI, MVT::f32, 0), ShuffleMask);
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000290 break;
291
Igor Breger1f782962015-11-19 08:26:56 +0000292 CASE_MOVDUP(MOVDDUP, 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(MOVDDUP, m)
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000296 DestName = getRegName(MI->getOperand(0).getReg());
Igor Breger1f782962015-11-19 08:26:56 +0000297 DecodeMOVDDUPMask(getRegOperandVectorVT(MI, MVT::f64, 0), ShuffleMask);
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000298 break;
299
300 case X86::PSLLDQri:
301 case X86::VPSLLDQri:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000302 case X86::VPSLLDQYri:
303 Src1Name = getRegName(MI->getOperand(1).getReg());
304 DestName = getRegName(MI->getOperand(0).getReg());
NAKAMURA Takumi5582a6a2015-05-25 01:43:34 +0000305 if (MI->getOperand(MI->getNumOperands() - 1).isImm())
Simon Pilgrimb9ada272015-11-16 22:54:41 +0000306 DecodePSLLDQMask(getRegOperandVectorVT(MI, MVT::i8, 0),
NAKAMURA Takumi5582a6a2015-05-25 01:43:34 +0000307 MI->getOperand(MI->getNumOperands() - 1).getImm(),
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000308 ShuffleMask);
309 break;
310
311 case X86::PSRLDQri:
312 case X86::VPSRLDQri:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000313 case X86::VPSRLDQYri:
314 Src1Name = 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 DecodePSRLDQMask(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::PALIGNR128rr:
323 case X86::VPALIGNR128rr:
Simon Pilgrimb9ada272015-11-16 22:54:41 +0000324 case X86::VPALIGNR256rr:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000325 Src1Name = getRegName(MI->getOperand(2).getReg());
326 // FALL THROUGH.
327 case X86::PALIGNR128rm:
328 case X86::VPALIGNR128rm:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000329 case X86::VPALIGNR256rm:
330 Src2Name = 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 DecodePALIGNRMask(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::PSHUFDri:
339 case X86::VPSHUFDri:
Simon Pilgrim5883a732015-11-16 22:39:27 +0000340 case X86::VPSHUFDYri:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000341 Src1Name = getRegName(MI->getOperand(1).getReg());
342 // FALL THROUGH.
343 case X86::PSHUFDmi:
344 case X86::VPSHUFDmi:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000345 case X86::VPSHUFDYmi:
346 DestName = getRegName(MI->getOperand(0).getReg());
NAKAMURA Takumi5582a6a2015-05-25 01:43:34 +0000347 if (MI->getOperand(MI->getNumOperands() - 1).isImm())
Simon Pilgrim5883a732015-11-16 22:39:27 +0000348 DecodePSHUFMask(getRegOperandVectorVT(MI, MVT::i32, 0),
NAKAMURA Takumi5582a6a2015-05-25 01:43:34 +0000349 MI->getOperand(MI->getNumOperands() - 1).getImm(),
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000350 ShuffleMask);
351 break;
352
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000353 case X86::PSHUFHWri:
354 case X86::VPSHUFHWri:
Simon Pilgrim5883a732015-11-16 22:39:27 +0000355 case X86::VPSHUFHWYri:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000356 Src1Name = getRegName(MI->getOperand(1).getReg());
357 // FALL THROUGH.
358 case X86::PSHUFHWmi:
359 case X86::VPSHUFHWmi:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000360 case X86::VPSHUFHWYmi:
361 DestName = getRegName(MI->getOperand(0).getReg());
NAKAMURA Takumi5582a6a2015-05-25 01:43:34 +0000362 if (MI->getOperand(MI->getNumOperands() - 1).isImm())
Simon Pilgrim5883a732015-11-16 22:39:27 +0000363 DecodePSHUFHWMask(getRegOperandVectorVT(MI, MVT::i16, 0),
NAKAMURA Takumi5582a6a2015-05-25 01:43:34 +0000364 MI->getOperand(MI->getNumOperands() - 1).getImm(),
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000365 ShuffleMask);
366 break;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000367
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000368 case X86::PSHUFLWri:
369 case X86::VPSHUFLWri:
Simon Pilgrim5883a732015-11-16 22:39:27 +0000370 case X86::VPSHUFLWYri:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000371 Src1Name = getRegName(MI->getOperand(1).getReg());
372 // FALL THROUGH.
373 case X86::PSHUFLWmi:
374 case X86::VPSHUFLWmi:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000375 case X86::VPSHUFLWYmi:
376 DestName = getRegName(MI->getOperand(0).getReg());
NAKAMURA Takumi5582a6a2015-05-25 01:43:34 +0000377 if (MI->getOperand(MI->getNumOperands() - 1).isImm())
Simon Pilgrim5883a732015-11-16 22:39:27 +0000378 DecodePSHUFLWMask(getRegOperandVectorVT(MI, MVT::i16, 0),
NAKAMURA Takumi5582a6a2015-05-25 01:43:34 +0000379 MI->getOperand(MI->getNumOperands() - 1).getImm(),
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000380 ShuffleMask);
381 break;
382
Simon Pilgrimf8f86ab2015-09-13 11:28:45 +0000383 case X86::MMX_PSHUFWri:
384 Src1Name = getRegName(MI->getOperand(1).getReg());
385 // FALL THROUGH.
386 case X86::MMX_PSHUFWmi:
387 DestName = getRegName(MI->getOperand(0).getReg());
388 if (MI->getOperand(MI->getNumOperands() - 1).isImm())
389 DecodePSHUFMask(MVT::v4i16,
390 MI->getOperand(MI->getNumOperands() - 1).getImm(),
391 ShuffleMask);
392 break;
393
394 case X86::PSWAPDrr:
395 Src1Name = getRegName(MI->getOperand(1).getReg());
396 // FALL THROUGH.
397 case X86::PSWAPDrm:
398 DestName = getRegName(MI->getOperand(0).getReg());
399 DecodePSWAPMask(MVT::v2i32, ShuffleMask);
400 break;
401
Simon Pilgrim8483df62015-11-17 22:35:45 +0000402 CASE_UNPCK(PUNPCKHBW, r)
Simon Pilgrimf8f86ab2015-09-13 11:28:45 +0000403 case X86::MMX_PUNPCKHBWirr:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000404 Src2Name = getRegName(MI->getOperand(2).getReg());
405 // FALL THROUGH.
Simon Pilgrim8483df62015-11-17 22:35:45 +0000406 CASE_UNPCK(PUNPCKHBW, m)
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000407 case X86::MMX_PUNPCKHBWirm:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000408 Src1Name = getRegName(MI->getOperand(1).getReg());
409 DestName = getRegName(MI->getOperand(0).getReg());
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000410 DecodeUNPCKHMask(getRegOperandVectorVT(MI, MVT::i8, 0), ShuffleMask);
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000411 break;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000412
Simon Pilgrim8483df62015-11-17 22:35:45 +0000413 CASE_UNPCK(PUNPCKHWD, r)
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000414 case X86::MMX_PUNPCKHWDirr:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000415 Src2Name = getRegName(MI->getOperand(2).getReg());
416 // FALL THROUGH.
Simon Pilgrim8483df62015-11-17 22:35:45 +0000417 CASE_UNPCK(PUNPCKHWD, m)
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000418 case X86::MMX_PUNPCKHWDirm:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000419 Src1Name = getRegName(MI->getOperand(1).getReg());
420 DestName = getRegName(MI->getOperand(0).getReg());
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000421 DecodeUNPCKHMask(getRegOperandVectorVT(MI, MVT::i16, 0), ShuffleMask);
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000422 break;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000423
Simon Pilgrim8483df62015-11-17 22:35:45 +0000424 CASE_UNPCK(PUNPCKHDQ, r)
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000425 case X86::MMX_PUNPCKHDQirr:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000426 Src2Name = getRegName(MI->getOperand(2).getReg());
427 // FALL THROUGH.
Simon Pilgrim8483df62015-11-17 22:35:45 +0000428 CASE_UNPCK(PUNPCKHDQ, m)
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000429 case X86::MMX_PUNPCKHDQirm:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000430 Src1Name = getRegName(MI->getOperand(1).getReg());
431 DestName = getRegName(MI->getOperand(0).getReg());
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000432 DecodeUNPCKHMask(getRegOperandVectorVT(MI, MVT::i32, 0), ShuffleMask);
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000433 break;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000434
Simon Pilgrim8483df62015-11-17 22:35:45 +0000435 CASE_UNPCK(PUNPCKHQDQ, r)
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000436 Src2Name = getRegName(MI->getOperand(2).getReg());
437 // FALL THROUGH.
Simon Pilgrim8483df62015-11-17 22:35:45 +0000438 CASE_UNPCK(PUNPCKHQDQ, m)
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000439 Src1Name = getRegName(MI->getOperand(1).getReg());
440 DestName = getRegName(MI->getOperand(0).getReg());
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000441 DecodeUNPCKHMask(getRegOperandVectorVT(MI, MVT::i64, 0), ShuffleMask);
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000442 break;
443
Simon Pilgrim8483df62015-11-17 22:35:45 +0000444 CASE_UNPCK(PUNPCKLBW, r)
Simon Pilgrimf8f86ab2015-09-13 11:28:45 +0000445 case X86::MMX_PUNPCKLBWirr:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000446 Src2Name = getRegName(MI->getOperand(2).getReg());
447 // FALL THROUGH.
Simon Pilgrim8483df62015-11-17 22:35:45 +0000448 CASE_UNPCK(PUNPCKLBW, m)
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000449 case X86::MMX_PUNPCKLBWirm:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000450 Src1Name = getRegName(MI->getOperand(1).getReg());
451 DestName = getRegName(MI->getOperand(0).getReg());
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000452 DecodeUNPCKLMask(getRegOperandVectorVT(MI, MVT::i8, 0), ShuffleMask);
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000453 break;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000454
Simon Pilgrim8483df62015-11-17 22:35:45 +0000455 CASE_UNPCK(PUNPCKLWD, r)
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000456 case X86::MMX_PUNPCKLWDirr:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000457 Src2Name = getRegName(MI->getOperand(2).getReg());
458 // FALL THROUGH.
Simon Pilgrim8483df62015-11-17 22:35:45 +0000459 CASE_UNPCK(PUNPCKLWD, m)
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000460 case X86::MMX_PUNPCKLWDirm:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000461 Src1Name = getRegName(MI->getOperand(1).getReg());
462 DestName = getRegName(MI->getOperand(0).getReg());
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000463 DecodeUNPCKLMask(getRegOperandVectorVT(MI, MVT::i16, 0), ShuffleMask);
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000464 break;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000465
Simon Pilgrim8483df62015-11-17 22:35:45 +0000466 CASE_UNPCK(PUNPCKLDQ, r)
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000467 case X86::MMX_PUNPCKLDQirr:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000468 Src2Name = getRegName(MI->getOperand(2).getReg());
469 // FALL THROUGH.
Simon Pilgrim8483df62015-11-17 22:35:45 +0000470 CASE_UNPCK(PUNPCKLDQ, m)
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000471 case X86::MMX_PUNPCKLDQirm:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000472 Src1Name = getRegName(MI->getOperand(1).getReg());
473 DestName = getRegName(MI->getOperand(0).getReg());
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000474 DecodeUNPCKLMask(getRegOperandVectorVT(MI, MVT::i32, 0), ShuffleMask);
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000475 break;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000476
Simon Pilgrim8483df62015-11-17 22:35:45 +0000477 CASE_UNPCK(PUNPCKLQDQ, r)
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000478 Src2Name = getRegName(MI->getOperand(2).getReg());
479 // FALL THROUGH.
Simon Pilgrim8483df62015-11-17 22:35:45 +0000480 CASE_UNPCK(PUNPCKLQDQ, m)
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000481 Src1Name = getRegName(MI->getOperand(1).getReg());
482 DestName = getRegName(MI->getOperand(0).getReg());
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000483 DecodeUNPCKLMask(getRegOperandVectorVT(MI, MVT::i64, 0), ShuffleMask);
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000484 break;
485
Simon Pilgrim2da41782015-11-17 23:29:49 +0000486 CASE_SHUF(SHUFPD, r)
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000487 Src2Name = getRegName(MI->getOperand(2).getReg());
488 // FALL THROUGH.
Simon Pilgrim2da41782015-11-17 23:29:49 +0000489 CASE_SHUF(SHUFPD, m)
NAKAMURA Takumi5582a6a2015-05-25 01:43:34 +0000490 if (MI->getOperand(MI->getNumOperands() - 1).isImm())
Simon Pilgrim5883a732015-11-16 22:39:27 +0000491 DecodeSHUFPMask(getRegOperandVectorVT(MI, MVT::f64, 0),
NAKAMURA Takumi5582a6a2015-05-25 01:43:34 +0000492 MI->getOperand(MI->getNumOperands() - 1).getImm(),
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000493 ShuffleMask);
494 Src1Name = getRegName(MI->getOperand(1).getReg());
495 DestName = getRegName(MI->getOperand(0).getReg());
496 break;
497
Simon Pilgrim2da41782015-11-17 23:29:49 +0000498 CASE_SHUF(SHUFPS, r)
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000499 Src2Name = getRegName(MI->getOperand(2).getReg());
500 // FALL THROUGH.
Simon Pilgrim2da41782015-11-17 23:29:49 +0000501 CASE_SHUF(SHUFPS, m)
NAKAMURA Takumi5582a6a2015-05-25 01:43:34 +0000502 if (MI->getOperand(MI->getNumOperands() - 1).isImm())
Simon Pilgrim5883a732015-11-16 22:39:27 +0000503 DecodeSHUFPMask(getRegOperandVectorVT(MI, MVT::f32, 0),
NAKAMURA Takumi5582a6a2015-05-25 01:43:34 +0000504 MI->getOperand(MI->getNumOperands() - 1).getImm(),
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000505 ShuffleMask);
506 Src1Name = getRegName(MI->getOperand(1).getReg());
507 DestName = getRegName(MI->getOperand(0).getReg());
508 break;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000509
Igor Breger24cab0f2015-11-16 07:22:00 +0000510 CASE_VSHUF(64X2, r)
511 CASE_VSHUF(64X2, m)
512 CASE_VSHUF(32X4, r)
513 CASE_VSHUF(32X4, m) {
Igor Bregerd7bae452015-10-15 13:29:07 +0000514 MVT VT;
515 bool HasMemOp;
516 unsigned NumOp = MI->getNumOperands();
517 getVSHUF64x2FamilyInfo(MI, VT, HasMemOp);
518 decodeVSHUF64x2FamilyMask(VT, MI->getOperand(NumOp - 1).getImm(),
519 ShuffleMask);
520 DestName = getRegName(MI->getOperand(0).getReg());
521 if (HasMemOp) {
522 assert((NumOp >= 8) && "Expected at least 8 operands!");
523 Src1Name = getRegName(MI->getOperand(NumOp - 7).getReg());
524 } else {
525 assert((NumOp >= 4) && "Expected at least 4 operands!");
526 Src2Name = getRegName(MI->getOperand(NumOp - 2).getReg());
527 Src1Name = getRegName(MI->getOperand(NumOp - 3).getReg());
528 }
529 break;
530 }
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000531
Simon Pilgrim8483df62015-11-17 22:35:45 +0000532 CASE_UNPCK(UNPCKLPD, r)
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000533 Src2Name = getRegName(MI->getOperand(2).getReg());
534 // FALL THROUGH.
Simon Pilgrim8483df62015-11-17 22:35:45 +0000535 CASE_UNPCK(UNPCKLPD, m)
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000536 DecodeUNPCKLMask(getRegOperandVectorVT(MI, MVT::f64, 0), ShuffleMask);
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000537 Src1Name = getRegName(MI->getOperand(1).getReg());
538 DestName = getRegName(MI->getOperand(0).getReg());
539 break;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000540
Simon Pilgrim8483df62015-11-17 22:35:45 +0000541 CASE_UNPCK(UNPCKLPS, r)
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000542 Src2Name = getRegName(MI->getOperand(2).getReg());
543 // FALL THROUGH.
Simon Pilgrim8483df62015-11-17 22:35:45 +0000544 CASE_UNPCK(UNPCKLPS, m)
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000545 DecodeUNPCKLMask(getRegOperandVectorVT(MI, MVT::f32, 0), ShuffleMask);
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000546 Src1Name = getRegName(MI->getOperand(1).getReg());
547 DestName = getRegName(MI->getOperand(0).getReg());
548 break;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000549
Simon Pilgrim8483df62015-11-17 22:35:45 +0000550 CASE_UNPCK(UNPCKHPD, r)
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000551 Src2Name = getRegName(MI->getOperand(2).getReg());
552 // FALL THROUGH.
Simon Pilgrim8483df62015-11-17 22:35:45 +0000553 CASE_UNPCK(UNPCKHPD, m)
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000554 DecodeUNPCKHMask(getRegOperandVectorVT(MI, MVT::f64, 0), ShuffleMask);
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000555 Src1Name = getRegName(MI->getOperand(1).getReg());
556 DestName = getRegName(MI->getOperand(0).getReg());
557 break;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000558
Simon Pilgrim8483df62015-11-17 22:35:45 +0000559 CASE_UNPCK(UNPCKHPS, r)
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000560 Src2Name = getRegName(MI->getOperand(2).getReg());
561 // FALL THROUGH.
Simon Pilgrim8483df62015-11-17 22:35:45 +0000562 CASE_UNPCK(UNPCKHPS, m)
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000563 DecodeUNPCKHMask(getRegOperandVectorVT(MI, MVT::f32, 0), ShuffleMask);
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000564 Src1Name = getRegName(MI->getOperand(1).getReg());
565 DestName = getRegName(MI->getOperand(0).getReg());
566 break;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000567
Simon Pilgrim2da41782015-11-17 23:29:49 +0000568 CASE_VPERM(PERMILPS, r)
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000569 Src1Name = getRegName(MI->getOperand(1).getReg());
570 // FALL THROUGH.
Simon Pilgrim2da41782015-11-17 23:29:49 +0000571 CASE_VPERM(PERMILPS, m)
NAKAMURA Takumi5582a6a2015-05-25 01:43:34 +0000572 if (MI->getOperand(MI->getNumOperands() - 1).isImm())
Simon Pilgrim5883a732015-11-16 22:39:27 +0000573 DecodePSHUFMask(getRegOperandVectorVT(MI, MVT::f32, 0),
NAKAMURA Takumi5582a6a2015-05-25 01:43:34 +0000574 MI->getOperand(MI->getNumOperands() - 1).getImm(),
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000575 ShuffleMask);
576 DestName = getRegName(MI->getOperand(0).getReg());
577 break;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000578
Simon Pilgrim2da41782015-11-17 23:29:49 +0000579 CASE_VPERM(PERMILPD, r)
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000580 Src1Name = getRegName(MI->getOperand(1).getReg());
581 // FALL THROUGH.
Simon Pilgrim2da41782015-11-17 23:29:49 +0000582 CASE_VPERM(PERMILPD, m)
NAKAMURA Takumi5582a6a2015-05-25 01:43:34 +0000583 if (MI->getOperand(MI->getNumOperands() - 1).isImm())
Simon Pilgrim5883a732015-11-16 22:39:27 +0000584 DecodePSHUFMask(getRegOperandVectorVT(MI, MVT::f64, 0),
NAKAMURA Takumi5582a6a2015-05-25 01:43:34 +0000585 MI->getOperand(MI->getNumOperands() - 1).getImm(),
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000586 ShuffleMask);
587 DestName = getRegName(MI->getOperand(0).getReg());
588 break;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000589
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000590 case X86::VPERM2F128rr:
591 case X86::VPERM2I128rr:
592 Src2Name = getRegName(MI->getOperand(2).getReg());
593 // FALL THROUGH.
594 case X86::VPERM2F128rm:
595 case X86::VPERM2I128rm:
596 // For instruction comments purpose, assume the 256-bit vector is v4i64.
NAKAMURA Takumi5582a6a2015-05-25 01:43:34 +0000597 if (MI->getOperand(MI->getNumOperands() - 1).isImm())
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000598 DecodeVPERM2X128Mask(MVT::v4i64,
NAKAMURA Takumi5582a6a2015-05-25 01:43:34 +0000599 MI->getOperand(MI->getNumOperands() - 1).getImm(),
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000600 ShuffleMask);
601 Src1Name = getRegName(MI->getOperand(1).getReg());
602 DestName = getRegName(MI->getOperand(0).getReg());
603 break;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000604
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000605 case X86::VPERMQYri:
606 case X86::VPERMPDYri:
607 Src1Name = getRegName(MI->getOperand(1).getReg());
608 // FALL THROUGH.
609 case X86::VPERMQYmi:
610 case X86::VPERMPDYmi:
NAKAMURA Takumi5582a6a2015-05-25 01:43:34 +0000611 if (MI->getOperand(MI->getNumOperands() - 1).isImm())
612 DecodeVPERMMask(MI->getOperand(MI->getNumOperands() - 1).getImm(),
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000613 ShuffleMask);
614 DestName = getRegName(MI->getOperand(0).getReg());
615 break;
616
617 case X86::MOVSDrr:
618 case X86::VMOVSDrr:
Simon Pilgrimf5c23ad2016-02-01 22:26:28 +0000619 case X86::VMOVSDZrr:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000620 Src2Name = getRegName(MI->getOperand(2).getReg());
621 Src1Name = getRegName(MI->getOperand(1).getReg());
622 // FALL THROUGH.
623 case X86::MOVSDrm:
624 case X86::VMOVSDrm:
Simon Pilgrimf5c23ad2016-02-01 22:26:28 +0000625 case X86::VMOVSDZrm:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000626 DecodeScalarMoveMask(MVT::v2f64, nullptr == Src2Name, ShuffleMask);
627 DestName = getRegName(MI->getOperand(0).getReg());
628 break;
Simon Pilgrimd5a15442015-11-21 13:04:42 +0000629
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000630 case X86::MOVSSrr:
631 case X86::VMOVSSrr:
Simon Pilgrimf5c23ad2016-02-01 22:26:28 +0000632 case X86::VMOVSSZrr:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000633 Src2Name = getRegName(MI->getOperand(2).getReg());
634 Src1Name = getRegName(MI->getOperand(1).getReg());
635 // FALL THROUGH.
636 case X86::MOVSSrm:
637 case X86::VMOVSSrm:
Simon Pilgrimf5c23ad2016-02-01 22:26:28 +0000638 case X86::VMOVSSZrm:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000639 DecodeScalarMoveMask(MVT::v4f32, nullptr == Src2Name, ShuffleMask);
640 DestName = getRegName(MI->getOperand(0).getReg());
641 break;
642
643 case X86::MOVPQI2QIrr:
Simon Pilgrim3e0c0222015-12-13 12:49:48 +0000644 case X86::MOVZPQILo2PQIrr:
645 case X86::VMOVPQI2QIrr:
646 case X86::VMOVZPQILo2PQIrr:
647 case X86::VMOVZPQILo2PQIZrr:
648 Src1Name = getRegName(MI->getOperand(1).getReg());
649 // FALL THROUGH.
650 case X86::MOVQI2PQIrm:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000651 case X86::MOVZQI2PQIrm:
652 case X86::MOVZPQILo2PQIrm:
Simon Pilgrim3e0c0222015-12-13 12:49:48 +0000653 case X86::VMOVQI2PQIrm:
Simon Pilgrim96fe4ef2016-02-02 13:32:56 +0000654 case X86::VMOVQI2PQIZrm:
Simon Pilgrim3e0c0222015-12-13 12:49:48 +0000655 case X86::VMOVZQI2PQIrm:
656 case X86::VMOVZPQILo2PQIrm:
657 case X86::VMOVZPQILo2PQIZrm:
658 DecodeZeroMoveLowMask(MVT::v2i64, ShuffleMask);
659 DestName = getRegName(MI->getOperand(0).getReg());
660 break;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000661
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000662 case X86::MOVDI2PDIrm:
663 case X86::VMOVDI2PDIrm:
Simon Pilgrim5be17b62016-02-01 23:04:05 +0000664 case X86::VMOVDI2PDIZrm:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000665 DecodeZeroMoveLowMask(MVT::v4i32, ShuffleMask);
666 DestName = getRegName(MI->getOperand(0).getReg());
667 break;
668
Simon Pilgrimd85cae32015-07-06 20:46:41 +0000669 case X86::EXTRQI:
670 if (MI->getOperand(2).isImm() &&
671 MI->getOperand(3).isImm())
672 DecodeEXTRQIMask(MI->getOperand(2).getImm(),
673 MI->getOperand(3).getImm(),
674 ShuffleMask);
675
676 DestName = getRegName(MI->getOperand(0).getReg());
677 Src1Name = getRegName(MI->getOperand(1).getReg());
678 break;
679
680 case X86::INSERTQI:
681 if (MI->getOperand(3).isImm() &&
682 MI->getOperand(4).isImm())
683 DecodeINSERTQIMask(MI->getOperand(3).getImm(),
684 MI->getOperand(4).getImm(),
685 ShuffleMask);
686
687 DestName = getRegName(MI->getOperand(0).getReg());
688 Src1Name = getRegName(MI->getOperand(1).getReg());
689 Src2Name = getRegName(MI->getOperand(2).getReg());
690 break;
691
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000692 case X86::PMOVZXBWrr:
693 case X86::PMOVZXBDrr:
694 case X86::PMOVZXBQrr:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000695 case X86::VPMOVZXBWrr:
696 case X86::VPMOVZXBDrr:
697 case X86::VPMOVZXBQrr:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000698 case X86::VPMOVZXBWYrr:
699 case X86::VPMOVZXBDYrr:
700 case X86::VPMOVZXBQYrr:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000701 Src1Name = getRegName(MI->getOperand(1).getReg());
702 // FALL THROUGH.
703 case X86::PMOVZXBWrm:
704 case X86::PMOVZXBDrm:
705 case X86::PMOVZXBQrm:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000706 case X86::VPMOVZXBWrm:
707 case X86::VPMOVZXBDrm:
708 case X86::VPMOVZXBQrm:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000709 case X86::VPMOVZXBWYrm:
710 case X86::VPMOVZXBDYrm:
711 case X86::VPMOVZXBQYrm:
Simon Pilgrime1b6db92016-02-06 16:33:42 +0000712 DecodeZeroExtendMask(MVT::i8, getZeroExtensionResultType(MI), ShuffleMask);
713 DestName = getRegName(MI->getOperand(0).getReg());
714 break;
715
716 case X86::PMOVZXWDrr:
717 case X86::PMOVZXWQrr:
718 case X86::VPMOVZXWDrr:
719 case X86::VPMOVZXWQrr:
720 case X86::VPMOVZXWDYrr:
721 case X86::VPMOVZXWQYrr:
722 Src1Name = getRegName(MI->getOperand(1).getReg());
723 // FALL THROUGH.
724 case X86::PMOVZXWDrm:
725 case X86::PMOVZXWQrm:
726 case X86::VPMOVZXWDrm:
727 case X86::VPMOVZXWQrm:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000728 case X86::VPMOVZXWDYrm:
729 case X86::VPMOVZXWQYrm:
Simon Pilgrime1b6db92016-02-06 16:33:42 +0000730 DecodeZeroExtendMask(MVT::i16, getZeroExtensionResultType(MI), ShuffleMask);
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000731 DestName = getRegName(MI->getOperand(0).getReg());
Simon Pilgrime1b6db92016-02-06 16:33:42 +0000732 break;
733
734 case X86::PMOVZXDQrr:
735 case X86::VPMOVZXDQrr:
736 case X86::VPMOVZXDQYrr:
737 Src1Name = getRegName(MI->getOperand(1).getReg());
738 // FALL THROUGH.
739 case X86::PMOVZXDQrm:
740 case X86::VPMOVZXDQrm:
741 case X86::VPMOVZXDQYrm:
742 DecodeZeroExtendMask(MVT::i32, getZeroExtensionResultType(MI), ShuffleMask);
743 DestName = getRegName(MI->getOperand(0).getReg());
744 break;
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000745 }
746
747 // The only comments we decode are shuffles, so give up if we were unable to
748 // decode a shuffle mask.
749 if (ShuffleMask.empty())
750 return false;
751
752 if (!DestName) DestName = Src1Name;
753 OS << (DestName ? DestName : "mem") << " = ";
754
755 // If the two sources are the same, canonicalize the input elements to be
756 // from the first src so that we get larger element spans.
757 if (Src1Name == Src2Name) {
758 for (unsigned i = 0, e = ShuffleMask.size(); i != e; ++i) {
759 if ((int)ShuffleMask[i] >= 0 && // Not sentinel.
NAKAMURA Takumi5582a6a2015-05-25 01:43:34 +0000760 ShuffleMask[i] >= (int)e) // From second mask.
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000761 ShuffleMask[i] -= e;
762 }
763 }
764
765 // The shuffle mask specifies which elements of the src1/src2 fill in the
766 // destination, with a few sentinel values. Loop through and print them
767 // out.
768 for (unsigned i = 0, e = ShuffleMask.size(); i != e; ++i) {
769 if (i != 0)
770 OS << ',';
771 if (ShuffleMask[i] == SM_SentinelZero) {
772 OS << "zero";
773 continue;
774 }
775
776 // Otherwise, it must come from src1 or src2. Print the span of elements
777 // that comes from this src.
778 bool isSrc1 = ShuffleMask[i] < (int)ShuffleMask.size();
779 const char *SrcName = isSrc1 ? Src1Name : Src2Name;
780 OS << (SrcName ? SrcName : "mem") << '[';
781 bool IsFirst = true;
782 while (i != e && (int)ShuffleMask[i] != SM_SentinelZero &&
783 (ShuffleMask[i] < (int)ShuffleMask.size()) == isSrc1) {
784 if (!IsFirst)
785 OS << ',';
786 else
787 IsFirst = false;
788 if (ShuffleMask[i] == SM_SentinelUndef)
789 OS << "u";
790 else
791 OS << ShuffleMask[i] % ShuffleMask.size();
792 ++i;
793 }
794 OS << ']';
NAKAMURA Takumi5582a6a2015-05-25 01:43:34 +0000795 --i; // For loop increments element #.
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000796 }
797 //MI->print(OS, 0);
798 OS << "\n";
799
800 // We successfully added a comment to this instruction.
801 return true;
802}