blob: 12bfd2fdd4cfb16a74d8d28beefd91b58f0cf386 [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 Pilgrim41c05c02016-05-11 11:55:12 +000024#define CASE_SSE_INS_COMMON(Inst, src) \
Simon Pilgrimbfa5f232016-02-06 17:02:15 +000025 case X86::Inst##src:
26
Simon Pilgrim41c05c02016-05-11 11:55:12 +000027#define CASE_AVX_INS_COMMON(Inst, Suffix, src) \
Simon Pilgrimbfa5f232016-02-06 17:02:15 +000028 case X86::V##Inst##Suffix##src:
29
Simon Pilgrim41c05c02016-05-11 11:55:12 +000030#define CASE_MASK_INS_COMMON(Inst, Suffix, src) \
31 case X86::V##Inst##Suffix##src##k:
32
33#define CASE_MASKZ_INS_COMMON(Inst, Suffix, src) \
34 case X86::V##Inst##Suffix##src##kz:
35
36#define CASE_AVX512_INS_COMMON(Inst, Suffix, src) \
37 CASE_AVX_INS_COMMON(Inst, Suffix, src) \
38 CASE_MASK_INS_COMMON(Inst, Suffix, src) \
39 CASE_MASKZ_INS_COMMON(Inst, Suffix, src)
40
41#define CASE_MOVDUP(Inst, src) \
42 CASE_AVX512_INS_COMMON(Inst, Z, r##src) \
43 CASE_AVX512_INS_COMMON(Inst, Z256, r##src) \
44 CASE_AVX512_INS_COMMON(Inst, Z128, r##src) \
45 CASE_AVX_INS_COMMON(Inst, , r##src) \
46 CASE_AVX_INS_COMMON(Inst, Y, r##src) \
Simon Pilgrimbfa5f232016-02-06 17:02:15 +000047 CASE_SSE_INS_COMMON(Inst, r##src)
48
Simon Pilgrim41c05c02016-05-11 11:55:12 +000049#define CASE_PMOVZX(Inst, src) \
50 CASE_AVX512_INS_COMMON(Inst, Z, r##src) \
51 CASE_AVX512_INS_COMMON(Inst, Z256, r##src) \
52 CASE_AVX512_INS_COMMON(Inst, Z128, r##src) \
53 CASE_AVX_INS_COMMON(Inst, , r##src) \
54 CASE_AVX_INS_COMMON(Inst, Y, r##src) \
Simon Pilgrim0acc32a2016-02-06 19:51:21 +000055 CASE_SSE_INS_COMMON(Inst, r##src)
56
Simon Pilgrim41c05c02016-05-11 11:55:12 +000057#define CASE_UNPCK(Inst, src) \
58 CASE_AVX512_INS_COMMON(Inst, Z, r##src) \
59 CASE_AVX512_INS_COMMON(Inst, Z256, r##src) \
60 CASE_AVX512_INS_COMMON(Inst, Z128, r##src) \
61 CASE_AVX_INS_COMMON(Inst, , r##src) \
62 CASE_AVX_INS_COMMON(Inst, Y, r##src) \
Simon Pilgrimbfa5f232016-02-06 17:02:15 +000063 CASE_SSE_INS_COMMON(Inst, r##src)
64
Simon Pilgrim41c05c02016-05-11 11:55:12 +000065#define CASE_SHUF(Inst, src) \
66 CASE_AVX512_INS_COMMON(Inst, Z, r##src##i) \
67 CASE_AVX512_INS_COMMON(Inst, Z256, r##src##i) \
68 CASE_AVX512_INS_COMMON(Inst, Z128, r##src##i) \
69 CASE_AVX_INS_COMMON(Inst, , r##src##i) \
70 CASE_AVX_INS_COMMON(Inst, Y, r##src##i) \
Simon Pilgrimbfa5f232016-02-06 17:02:15 +000071 CASE_SSE_INS_COMMON(Inst, r##src##i)
72
Simon Pilgrim41c05c02016-05-11 11:55:12 +000073#define CASE_VPERM(Inst, src) \
74 CASE_AVX512_INS_COMMON(Inst, Z, src##i) \
75 CASE_AVX512_INS_COMMON(Inst, Z256, src##i) \
76 CASE_AVX512_INS_COMMON(Inst, Z128, src##i) \
77 CASE_AVX_INS_COMMON(Inst, , src##i) \
Simon Pilgrimbfa5f232016-02-06 17:02:15 +000078 CASE_AVX_INS_COMMON(Inst, Y, src##i)
79
80#define CASE_VSHUF(Inst, src) \
Simon Pilgrim41c05c02016-05-11 11:55:12 +000081 CASE_AVX512_INS_COMMON(SHUFF##Inst, Z, r##src##i) \
82 CASE_AVX512_INS_COMMON(SHUFI##Inst, Z, r##src##i) \
83 CASE_AVX512_INS_COMMON(SHUFF##Inst, Z256, r##src##i) \
84 CASE_AVX512_INS_COMMON(SHUFI##Inst, Z256, r##src##i)
Simon Pilgrimbfa5f232016-02-06 17:02:15 +000085
Igor Breger24cab0f2015-11-16 07:22:00 +000086static unsigned getVectorRegSize(unsigned RegNo) {
Igor Breger24cab0f2015-11-16 07:22:00 +000087 if (X86::ZMM0 <= RegNo && RegNo <= X86::ZMM31)
88 return 512;
89 if (X86::YMM0 <= RegNo && RegNo <= X86::YMM31)
90 return 256;
91 if (X86::XMM0 <= RegNo && RegNo <= X86::XMM31)
92 return 128;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +000093 if (X86::MM0 <= RegNo && RegNo <= X86::MM7)
94 return 64;
Igor Breger24cab0f2015-11-16 07:22:00 +000095
96 llvm_unreachable("Unknown vector reg!");
Igor Breger24cab0f2015-11-16 07:22:00 +000097}
98
99static MVT getRegOperandVectorVT(const MCInst *MI, const MVT &ScalarVT,
100 unsigned OperandIndex) {
101 unsigned OpReg = MI->getOperand(OperandIndex).getReg();
102 return MVT::getVectorVT(ScalarVT,
103 getVectorRegSize(OpReg)/ScalarVT.getSizeInBits());
104}
105
Simon Pilgrime1b6db92016-02-06 16:33:42 +0000106/// \brief Extracts the dst type for a given zero extension instruction.
107static MVT getZeroExtensionResultType(const MCInst *MI) {
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000108 switch (MI->getOpcode()) {
109 default:
110 llvm_unreachable("Unknown zero extension instruction");
Simon Pilgrime1b6db92016-02-06 16:33:42 +0000111 // zero extension to i16
Simon Pilgrim0acc32a2016-02-06 19:51:21 +0000112 CASE_PMOVZX(PMOVZXBW, m)
113 CASE_PMOVZX(PMOVZXBW, r)
Simon Pilgrime1b6db92016-02-06 16:33:42 +0000114 return getRegOperandVectorVT(MI, MVT::i16, 0);
115 // zero extension to i32
Simon Pilgrim0acc32a2016-02-06 19:51:21 +0000116 CASE_PMOVZX(PMOVZXBD, m)
117 CASE_PMOVZX(PMOVZXBD, r)
118 CASE_PMOVZX(PMOVZXWD, m)
119 CASE_PMOVZX(PMOVZXWD, r)
Simon Pilgrime1b6db92016-02-06 16:33:42 +0000120 return getRegOperandVectorVT(MI, MVT::i32, 0);
121 // zero extension to i64
Simon Pilgrim0acc32a2016-02-06 19:51:21 +0000122 CASE_PMOVZX(PMOVZXBQ, m)
123 CASE_PMOVZX(PMOVZXBQ, r)
124 CASE_PMOVZX(PMOVZXWQ, m)
125 CASE_PMOVZX(PMOVZXWQ, r)
126 CASE_PMOVZX(PMOVZXDQ, m)
127 CASE_PMOVZX(PMOVZXDQ, r)
Simon Pilgrime1b6db92016-02-06 16:33:42 +0000128 return getRegOperandVectorVT(MI, MVT::i64, 0);
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000129 }
130}
131
Igor Bregerd7bae452015-10-15 13:29:07 +0000132/// \brief Extracts the types and if it has memory operand for a given
133/// (SHUFF32x4/SHUFF64x2/SHUFI32x4/SHUFI64x2) instruction.
134static void getVSHUF64x2FamilyInfo(const MCInst *MI, MVT &VT, bool &HasMemOp) {
135 HasMemOp = false;
136 switch (MI->getOpcode()) {
137 default:
138 llvm_unreachable("Unknown VSHUF64x2 family instructions.");
139 break;
Igor Breger24cab0f2015-11-16 07:22:00 +0000140 CASE_VSHUF(64X2, m)
Igor Bregerd7bae452015-10-15 13:29:07 +0000141 HasMemOp = true; // FALL THROUGH.
Igor Breger24cab0f2015-11-16 07:22:00 +0000142 CASE_VSHUF(64X2, r)
143 VT = getRegOperandVectorVT(MI, MVT::i64, 0);
Igor Bregerd7bae452015-10-15 13:29:07 +0000144 break;
Igor Breger24cab0f2015-11-16 07:22:00 +0000145 CASE_VSHUF(32X4, m)
Igor Bregerd7bae452015-10-15 13:29:07 +0000146 HasMemOp = true; // FALL THROUGH.
Igor Breger24cab0f2015-11-16 07:22:00 +0000147 CASE_VSHUF(32X4, r)
148 VT = getRegOperandVectorVT(MI, MVT::i32, 0);
Igor Bregerd7bae452015-10-15 13:29:07 +0000149 break;
150 }
151}
152
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000153//===----------------------------------------------------------------------===//
154// Top Level Entrypoint
155//===----------------------------------------------------------------------===//
156
157/// EmitAnyX86InstComments - This function decodes x86 instructions and prints
158/// newline terminated strings to the specified string if desired. This
159/// information is shown in disassembly dumps when verbose assembly is enabled.
160bool llvm::EmitAnyX86InstComments(const MCInst *MI, raw_ostream &OS,
161 const char *(*getRegName)(unsigned)) {
162 // If this is a shuffle operation, the switch should fill in this state.
163 SmallVector<int, 8> ShuffleMask;
164 const char *DestName = nullptr, *Src1Name = nullptr, *Src2Name = nullptr;
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000165 unsigned NumOperands = MI->getNumOperands();
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000166
167 switch (MI->getOpcode()) {
168 default:
169 // Not an instruction for which we can decode comments.
170 return false;
171
172 case X86::BLENDPDrri:
173 case X86::VBLENDPDrri:
Simon Pilgrim13d3a202015-11-16 23:03:18 +0000174 case X86::VBLENDPDYrri:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000175 Src2Name = getRegName(MI->getOperand(2).getReg());
176 // FALL THROUGH.
177 case X86::BLENDPDrmi:
178 case X86::VBLENDPDrmi:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000179 case X86::VBLENDPDYrmi:
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000180 if (MI->getOperand(NumOperands - 1).isImm())
Simon Pilgrim13d3a202015-11-16 23:03:18 +0000181 DecodeBLENDMask(getRegOperandVectorVT(MI, MVT::f64, 0),
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000182 MI->getOperand(NumOperands - 1).getImm(),
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000183 ShuffleMask);
184 Src1Name = getRegName(MI->getOperand(1).getReg());
185 DestName = getRegName(MI->getOperand(0).getReg());
186 break;
187
188 case X86::BLENDPSrri:
189 case X86::VBLENDPSrri:
Simon Pilgrim13d3a202015-11-16 23:03:18 +0000190 case X86::VBLENDPSYrri:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000191 Src2Name = getRegName(MI->getOperand(2).getReg());
192 // FALL THROUGH.
193 case X86::BLENDPSrmi:
194 case X86::VBLENDPSrmi:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000195 case X86::VBLENDPSYrmi:
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000196 if (MI->getOperand(NumOperands - 1).isImm())
Simon Pilgrim13d3a202015-11-16 23:03:18 +0000197 DecodeBLENDMask(getRegOperandVectorVT(MI, MVT::f32, 0),
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000198 MI->getOperand(NumOperands - 1).getImm(),
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000199 ShuffleMask);
200 Src1Name = getRegName(MI->getOperand(1).getReg());
201 DestName = getRegName(MI->getOperand(0).getReg());
202 break;
203
204 case X86::PBLENDWrri:
205 case X86::VPBLENDWrri:
Simon Pilgrim13d3a202015-11-16 23:03:18 +0000206 case X86::VPBLENDWYrri:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000207 Src2Name = getRegName(MI->getOperand(2).getReg());
208 // FALL THROUGH.
209 case X86::PBLENDWrmi:
210 case X86::VPBLENDWrmi:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000211 case X86::VPBLENDWYrmi:
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000212 if (MI->getOperand(NumOperands - 1).isImm())
Simon Pilgrim13d3a202015-11-16 23:03:18 +0000213 DecodeBLENDMask(getRegOperandVectorVT(MI, MVT::i16, 0),
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000214 MI->getOperand(NumOperands - 1).getImm(),
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000215 ShuffleMask);
216 Src1Name = getRegName(MI->getOperand(1).getReg());
217 DestName = getRegName(MI->getOperand(0).getReg());
218 break;
219
220 case X86::VPBLENDDrri:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000221 case X86::VPBLENDDYrri:
222 Src2Name = getRegName(MI->getOperand(2).getReg());
223 // FALL THROUGH.
Simon Pilgrim13d3a202015-11-16 23:03:18 +0000224 case X86::VPBLENDDrmi:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000225 case X86::VPBLENDDYrmi:
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000226 if (MI->getOperand(NumOperands - 1).isImm())
Simon Pilgrim13d3a202015-11-16 23:03:18 +0000227 DecodeBLENDMask(getRegOperandVectorVT(MI, MVT::i32, 0),
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000228 MI->getOperand(NumOperands - 1).getImm(),
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000229 ShuffleMask);
230 Src1Name = getRegName(MI->getOperand(1).getReg());
231 DestName = getRegName(MI->getOperand(0).getReg());
232 break;
233
234 case X86::INSERTPSrr:
235 case X86::VINSERTPSrr:
Simon Pilgrim025a3d852016-02-01 22:05:50 +0000236 case X86::VINSERTPSzrr:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000237 Src2Name = getRegName(MI->getOperand(2).getReg());
238 // FALL THROUGH.
239 case X86::INSERTPSrm:
240 case X86::VINSERTPSrm:
Simon Pilgrim025a3d852016-02-01 22:05:50 +0000241 case X86::VINSERTPSzrm:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000242 DestName = getRegName(MI->getOperand(0).getReg());
243 Src1Name = getRegName(MI->getOperand(1).getReg());
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000244 if (MI->getOperand(NumOperands - 1).isImm())
245 DecodeINSERTPSMask(MI->getOperand(NumOperands - 1).getImm(),
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000246 ShuffleMask);
247 break;
248
249 case X86::MOVLHPSrr:
250 case X86::VMOVLHPSrr:
Simon Pilgrimd5a15442015-11-21 13:04:42 +0000251 case X86::VMOVLHPSZrr:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000252 Src2Name = getRegName(MI->getOperand(2).getReg());
253 Src1Name = getRegName(MI->getOperand(1).getReg());
254 DestName = getRegName(MI->getOperand(0).getReg());
255 DecodeMOVLHPSMask(2, ShuffleMask);
256 break;
257
258 case X86::MOVHLPSrr:
259 case X86::VMOVHLPSrr:
Simon Pilgrimd5a15442015-11-21 13:04:42 +0000260 case X86::VMOVHLPSZrr:
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 DecodeMOVHLPSMask(2, ShuffleMask);
265 break;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000266
Simon Pilgrima3d67442016-02-07 15:39:22 +0000267 case X86::MOVHPDrm:
268 case X86::VMOVHPDrm:
269 case X86::VMOVHPDZ128rm:
270 Src1Name = getRegName(MI->getOperand(1).getReg());
271 DestName = getRegName(MI->getOperand(0).getReg());
272 DecodeInsertElementMask(MVT::v2f64, 1, 1, ShuffleMask);
273 break;
274
275 case X86::MOVHPSrm:
276 case X86::VMOVHPSrm:
277 case X86::VMOVHPSZ128rm:
278 Src1Name = getRegName(MI->getOperand(1).getReg());
279 DestName = getRegName(MI->getOperand(0).getReg());
280 DecodeInsertElementMask(MVT::v4f32, 2, 2, ShuffleMask);
281 break;
282
283 case X86::MOVLPDrm:
284 case X86::VMOVLPDrm:
285 case X86::VMOVLPDZ128rm:
286 Src1Name = getRegName(MI->getOperand(1).getReg());
287 DestName = getRegName(MI->getOperand(0).getReg());
288 DecodeInsertElementMask(MVT::v2f64, 0, 1, ShuffleMask);
289 break;
290
291 case X86::MOVLPSrm:
292 case X86::VMOVLPSrm:
293 case X86::VMOVLPSZ128rm:
294 Src1Name = getRegName(MI->getOperand(1).getReg());
295 DestName = getRegName(MI->getOperand(0).getReg());
296 DecodeInsertElementMask(MVT::v4f32, 0, 2, ShuffleMask);
297 break;
298
Igor Breger24cab0f2015-11-16 07:22:00 +0000299 CASE_MOVDUP(MOVSLDUP, r)
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000300 Src1Name = getRegName(MI->getOperand(NumOperands - 1).getReg());
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000301 // FALL THROUGH.
Igor Breger1f782962015-11-19 08:26:56 +0000302 CASE_MOVDUP(MOVSLDUP, m)
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000303 DestName = getRegName(MI->getOperand(0).getReg());
Igor Breger1f782962015-11-19 08:26:56 +0000304 DecodeMOVSLDUPMask(getRegOperandVectorVT(MI, MVT::f32, 0), ShuffleMask);
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000305 break;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000306
Igor Breger24cab0f2015-11-16 07:22:00 +0000307 CASE_MOVDUP(MOVSHDUP, r)
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000308 Src1Name = getRegName(MI->getOperand(NumOperands - 1).getReg());
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000309 // FALL THROUGH.
Igor Breger1f782962015-11-19 08:26:56 +0000310 CASE_MOVDUP(MOVSHDUP, m)
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000311 DestName = getRegName(MI->getOperand(0).getReg());
Igor Breger1f782962015-11-19 08:26:56 +0000312 DecodeMOVSHDUPMask(getRegOperandVectorVT(MI, MVT::f32, 0), ShuffleMask);
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000313 break;
314
Igor Breger1f782962015-11-19 08:26:56 +0000315 CASE_MOVDUP(MOVDDUP, r)
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000316 Src1Name = getRegName(MI->getOperand(NumOperands - 1).getReg());
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000317 // FALL THROUGH.
Igor Breger1f782962015-11-19 08:26:56 +0000318 CASE_MOVDUP(MOVDDUP, m)
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000319 DestName = getRegName(MI->getOperand(0).getReg());
Igor Breger1f782962015-11-19 08:26:56 +0000320 DecodeMOVDDUPMask(getRegOperandVectorVT(MI, MVT::f64, 0), ShuffleMask);
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000321 break;
322
323 case X86::PSLLDQri:
324 case X86::VPSLLDQri:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000325 case X86::VPSLLDQYri:
326 Src1Name = getRegName(MI->getOperand(1).getReg());
327 DestName = getRegName(MI->getOperand(0).getReg());
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000328 if (MI->getOperand(NumOperands - 1).isImm())
Simon Pilgrimb9ada272015-11-16 22:54:41 +0000329 DecodePSLLDQMask(getRegOperandVectorVT(MI, MVT::i8, 0),
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000330 MI->getOperand(NumOperands - 1).getImm(),
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000331 ShuffleMask);
332 break;
333
334 case X86::PSRLDQri:
335 case X86::VPSRLDQri:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000336 case X86::VPSRLDQYri:
337 Src1Name = getRegName(MI->getOperand(1).getReg());
338 DestName = getRegName(MI->getOperand(0).getReg());
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000339 if (MI->getOperand(NumOperands - 1).isImm())
Simon Pilgrimb9ada272015-11-16 22:54:41 +0000340 DecodePSRLDQMask(getRegOperandVectorVT(MI, MVT::i8, 0),
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000341 MI->getOperand(NumOperands - 1).getImm(),
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000342 ShuffleMask);
343 break;
344
345 case X86::PALIGNR128rr:
346 case X86::VPALIGNR128rr:
Simon Pilgrimb9ada272015-11-16 22:54:41 +0000347 case X86::VPALIGNR256rr:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000348 Src1Name = getRegName(MI->getOperand(2).getReg());
349 // FALL THROUGH.
350 case X86::PALIGNR128rm:
351 case X86::VPALIGNR128rm:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000352 case X86::VPALIGNR256rm:
353 Src2Name = getRegName(MI->getOperand(1).getReg());
354 DestName = getRegName(MI->getOperand(0).getReg());
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000355 if (MI->getOperand(NumOperands - 1).isImm())
Simon Pilgrimb9ada272015-11-16 22:54:41 +0000356 DecodePALIGNRMask(getRegOperandVectorVT(MI, MVT::i8, 0),
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000357 MI->getOperand(NumOperands - 1).getImm(),
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000358 ShuffleMask);
359 break;
360
361 case X86::PSHUFDri:
362 case X86::VPSHUFDri:
Simon Pilgrim5883a732015-11-16 22:39:27 +0000363 case X86::VPSHUFDYri:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000364 Src1Name = getRegName(MI->getOperand(1).getReg());
365 // FALL THROUGH.
366 case X86::PSHUFDmi:
367 case X86::VPSHUFDmi:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000368 case X86::VPSHUFDYmi:
369 DestName = getRegName(MI->getOperand(0).getReg());
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000370 if (MI->getOperand(NumOperands - 1).isImm())
Simon Pilgrim5883a732015-11-16 22:39:27 +0000371 DecodePSHUFMask(getRegOperandVectorVT(MI, MVT::i32, 0),
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000372 MI->getOperand(NumOperands - 1).getImm(),
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000373 ShuffleMask);
374 break;
375
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000376 case X86::PSHUFHWri:
377 case X86::VPSHUFHWri:
Simon Pilgrim5883a732015-11-16 22:39:27 +0000378 case X86::VPSHUFHWYri:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000379 Src1Name = getRegName(MI->getOperand(1).getReg());
380 // FALL THROUGH.
381 case X86::PSHUFHWmi:
382 case X86::VPSHUFHWmi:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000383 case X86::VPSHUFHWYmi:
384 DestName = getRegName(MI->getOperand(0).getReg());
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000385 if (MI->getOperand(NumOperands - 1).isImm())
Simon Pilgrim5883a732015-11-16 22:39:27 +0000386 DecodePSHUFHWMask(getRegOperandVectorVT(MI, MVT::i16, 0),
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000387 MI->getOperand(NumOperands - 1).getImm(),
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000388 ShuffleMask);
389 break;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000390
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000391 case X86::PSHUFLWri:
392 case X86::VPSHUFLWri:
Simon Pilgrim5883a732015-11-16 22:39:27 +0000393 case X86::VPSHUFLWYri:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000394 Src1Name = getRegName(MI->getOperand(1).getReg());
395 // FALL THROUGH.
396 case X86::PSHUFLWmi:
397 case X86::VPSHUFLWmi:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000398 case X86::VPSHUFLWYmi:
399 DestName = getRegName(MI->getOperand(0).getReg());
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000400 if (MI->getOperand(NumOperands - 1).isImm())
Simon Pilgrim5883a732015-11-16 22:39:27 +0000401 DecodePSHUFLWMask(getRegOperandVectorVT(MI, MVT::i16, 0),
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000402 MI->getOperand(NumOperands - 1).getImm(),
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000403 ShuffleMask);
404 break;
405
Simon Pilgrimf8f86ab2015-09-13 11:28:45 +0000406 case X86::MMX_PSHUFWri:
407 Src1Name = getRegName(MI->getOperand(1).getReg());
408 // FALL THROUGH.
409 case X86::MMX_PSHUFWmi:
410 DestName = getRegName(MI->getOperand(0).getReg());
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000411 if (MI->getOperand(NumOperands - 1).isImm())
Simon Pilgrimf8f86ab2015-09-13 11:28:45 +0000412 DecodePSHUFMask(MVT::v4i16,
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000413 MI->getOperand(NumOperands - 1).getImm(),
Simon Pilgrimf8f86ab2015-09-13 11:28:45 +0000414 ShuffleMask);
415 break;
416
417 case X86::PSWAPDrr:
418 Src1Name = getRegName(MI->getOperand(1).getReg());
419 // FALL THROUGH.
420 case X86::PSWAPDrm:
421 DestName = getRegName(MI->getOperand(0).getReg());
422 DecodePSWAPMask(MVT::v2i32, ShuffleMask);
423 break;
424
Simon Pilgrim8483df62015-11-17 22:35:45 +0000425 CASE_UNPCK(PUNPCKHBW, r)
Simon Pilgrimf8f86ab2015-09-13 11:28:45 +0000426 case X86::MMX_PUNPCKHBWirr:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000427 Src2Name = getRegName(MI->getOperand(2).getReg());
428 // FALL THROUGH.
Simon Pilgrim8483df62015-11-17 22:35:45 +0000429 CASE_UNPCK(PUNPCKHBW, m)
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000430 case X86::MMX_PUNPCKHBWirm:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000431 Src1Name = getRegName(MI->getOperand(1).getReg());
432 DestName = getRegName(MI->getOperand(0).getReg());
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000433 DecodeUNPCKHMask(getRegOperandVectorVT(MI, MVT::i8, 0), ShuffleMask);
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000434 break;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000435
Simon Pilgrim8483df62015-11-17 22:35:45 +0000436 CASE_UNPCK(PUNPCKHWD, r)
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000437 case X86::MMX_PUNPCKHWDirr:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000438 Src2Name = getRegName(MI->getOperand(2).getReg());
439 // FALL THROUGH.
Simon Pilgrim8483df62015-11-17 22:35:45 +0000440 CASE_UNPCK(PUNPCKHWD, m)
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000441 case X86::MMX_PUNPCKHWDirm:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000442 Src1Name = getRegName(MI->getOperand(1).getReg());
443 DestName = getRegName(MI->getOperand(0).getReg());
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000444 DecodeUNPCKHMask(getRegOperandVectorVT(MI, MVT::i16, 0), ShuffleMask);
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000445 break;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000446
Simon Pilgrim8483df62015-11-17 22:35:45 +0000447 CASE_UNPCK(PUNPCKHDQ, r)
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000448 case X86::MMX_PUNPCKHDQirr:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000449 Src2Name = getRegName(MI->getOperand(2).getReg());
450 // FALL THROUGH.
Simon Pilgrim8483df62015-11-17 22:35:45 +0000451 CASE_UNPCK(PUNPCKHDQ, m)
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000452 case X86::MMX_PUNPCKHDQirm:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000453 Src1Name = getRegName(MI->getOperand(1).getReg());
454 DestName = getRegName(MI->getOperand(0).getReg());
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000455 DecodeUNPCKHMask(getRegOperandVectorVT(MI, MVT::i32, 0), ShuffleMask);
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000456 break;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000457
Simon Pilgrim8483df62015-11-17 22:35:45 +0000458 CASE_UNPCK(PUNPCKHQDQ, r)
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000459 Src2Name = getRegName(MI->getOperand(2).getReg());
460 // FALL THROUGH.
Simon Pilgrim8483df62015-11-17 22:35:45 +0000461 CASE_UNPCK(PUNPCKHQDQ, m)
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000462 Src1Name = getRegName(MI->getOperand(1).getReg());
463 DestName = getRegName(MI->getOperand(0).getReg());
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000464 DecodeUNPCKHMask(getRegOperandVectorVT(MI, MVT::i64, 0), ShuffleMask);
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000465 break;
466
Simon Pilgrim8483df62015-11-17 22:35:45 +0000467 CASE_UNPCK(PUNPCKLBW, r)
Simon Pilgrimf8f86ab2015-09-13 11:28:45 +0000468 case X86::MMX_PUNPCKLBWirr:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000469 Src2Name = getRegName(MI->getOperand(2).getReg());
470 // FALL THROUGH.
Simon Pilgrim8483df62015-11-17 22:35:45 +0000471 CASE_UNPCK(PUNPCKLBW, m)
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000472 case X86::MMX_PUNPCKLBWirm:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000473 Src1Name = getRegName(MI->getOperand(1).getReg());
474 DestName = getRegName(MI->getOperand(0).getReg());
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000475 DecodeUNPCKLMask(getRegOperandVectorVT(MI, MVT::i8, 0), ShuffleMask);
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000476 break;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000477
Simon Pilgrim8483df62015-11-17 22:35:45 +0000478 CASE_UNPCK(PUNPCKLWD, r)
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000479 case X86::MMX_PUNPCKLWDirr:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000480 Src2Name = getRegName(MI->getOperand(2).getReg());
481 // FALL THROUGH.
Simon Pilgrim8483df62015-11-17 22:35:45 +0000482 CASE_UNPCK(PUNPCKLWD, m)
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000483 case X86::MMX_PUNPCKLWDirm:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000484 Src1Name = getRegName(MI->getOperand(1).getReg());
485 DestName = getRegName(MI->getOperand(0).getReg());
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000486 DecodeUNPCKLMask(getRegOperandVectorVT(MI, MVT::i16, 0), ShuffleMask);
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000487 break;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000488
Simon Pilgrim8483df62015-11-17 22:35:45 +0000489 CASE_UNPCK(PUNPCKLDQ, r)
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000490 case X86::MMX_PUNPCKLDQirr:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000491 Src2Name = getRegName(MI->getOperand(2).getReg());
492 // FALL THROUGH.
Simon Pilgrim8483df62015-11-17 22:35:45 +0000493 CASE_UNPCK(PUNPCKLDQ, m)
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000494 case X86::MMX_PUNPCKLDQirm:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000495 Src1Name = getRegName(MI->getOperand(1).getReg());
496 DestName = getRegName(MI->getOperand(0).getReg());
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000497 DecodeUNPCKLMask(getRegOperandVectorVT(MI, MVT::i32, 0), ShuffleMask);
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000498 break;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000499
Simon Pilgrim8483df62015-11-17 22:35:45 +0000500 CASE_UNPCK(PUNPCKLQDQ, r)
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000501 Src2Name = getRegName(MI->getOperand(2).getReg());
502 // FALL THROUGH.
Simon Pilgrim8483df62015-11-17 22:35:45 +0000503 CASE_UNPCK(PUNPCKLQDQ, m)
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000504 Src1Name = getRegName(MI->getOperand(1).getReg());
505 DestName = getRegName(MI->getOperand(0).getReg());
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000506 DecodeUNPCKLMask(getRegOperandVectorVT(MI, MVT::i64, 0), ShuffleMask);
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000507 break;
508
Simon Pilgrim2da41782015-11-17 23:29:49 +0000509 CASE_SHUF(SHUFPD, r)
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000510 Src2Name = getRegName(MI->getOperand(2).getReg());
511 // FALL THROUGH.
Simon Pilgrim2da41782015-11-17 23:29:49 +0000512 CASE_SHUF(SHUFPD, m)
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000513 if (MI->getOperand(NumOperands - 1).isImm())
Simon Pilgrim5883a732015-11-16 22:39:27 +0000514 DecodeSHUFPMask(getRegOperandVectorVT(MI, MVT::f64, 0),
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000515 MI->getOperand(NumOperands - 1).getImm(),
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000516 ShuffleMask);
517 Src1Name = getRegName(MI->getOperand(1).getReg());
518 DestName = getRegName(MI->getOperand(0).getReg());
519 break;
520
Simon Pilgrim2da41782015-11-17 23:29:49 +0000521 CASE_SHUF(SHUFPS, r)
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000522 Src2Name = getRegName(MI->getOperand(2).getReg());
523 // FALL THROUGH.
Simon Pilgrim2da41782015-11-17 23:29:49 +0000524 CASE_SHUF(SHUFPS, m)
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000525 if (MI->getOperand(NumOperands - 1).isImm())
Simon Pilgrim5883a732015-11-16 22:39:27 +0000526 DecodeSHUFPMask(getRegOperandVectorVT(MI, MVT::f32, 0),
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000527 MI->getOperand(NumOperands - 1).getImm(),
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000528 ShuffleMask);
529 Src1Name = getRegName(MI->getOperand(1).getReg());
530 DestName = getRegName(MI->getOperand(0).getReg());
531 break;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000532
Igor Breger24cab0f2015-11-16 07:22:00 +0000533 CASE_VSHUF(64X2, r)
534 CASE_VSHUF(64X2, m)
535 CASE_VSHUF(32X4, r)
536 CASE_VSHUF(32X4, m) {
Igor Bregerd7bae452015-10-15 13:29:07 +0000537 MVT VT;
538 bool HasMemOp;
Igor Bregerd7bae452015-10-15 13:29:07 +0000539 getVSHUF64x2FamilyInfo(MI, VT, HasMemOp);
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000540 decodeVSHUF64x2FamilyMask(VT, MI->getOperand(NumOperands - 1).getImm(),
Igor Bregerd7bae452015-10-15 13:29:07 +0000541 ShuffleMask);
542 DestName = getRegName(MI->getOperand(0).getReg());
543 if (HasMemOp) {
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000544 assert((NumOperands >= 8) && "Expected at least 8 operands!");
545 Src1Name = getRegName(MI->getOperand(NumOperands - 7).getReg());
Igor Bregerd7bae452015-10-15 13:29:07 +0000546 } else {
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000547 assert((NumOperands >= 4) && "Expected at least 4 operands!");
548 Src2Name = getRegName(MI->getOperand(NumOperands - 2).getReg());
549 Src1Name = getRegName(MI->getOperand(NumOperands - 3).getReg());
Igor Bregerd7bae452015-10-15 13:29:07 +0000550 }
551 break;
552 }
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000553
Simon Pilgrim8483df62015-11-17 22:35:45 +0000554 CASE_UNPCK(UNPCKLPD, r)
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000555 Src2Name = getRegName(MI->getOperand(2).getReg());
556 // FALL THROUGH.
Simon Pilgrim8483df62015-11-17 22:35:45 +0000557 CASE_UNPCK(UNPCKLPD, m)
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000558 DecodeUNPCKLMask(getRegOperandVectorVT(MI, MVT::f64, 0), ShuffleMask);
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000559 Src1Name = getRegName(MI->getOperand(1).getReg());
560 DestName = getRegName(MI->getOperand(0).getReg());
561 break;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000562
Simon Pilgrim8483df62015-11-17 22:35:45 +0000563 CASE_UNPCK(UNPCKLPS, r)
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000564 Src2Name = getRegName(MI->getOperand(2).getReg());
565 // FALL THROUGH.
Simon Pilgrim8483df62015-11-17 22:35:45 +0000566 CASE_UNPCK(UNPCKLPS, m)
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000567 DecodeUNPCKLMask(getRegOperandVectorVT(MI, MVT::f32, 0), ShuffleMask);
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000568 Src1Name = getRegName(MI->getOperand(1).getReg());
569 DestName = getRegName(MI->getOperand(0).getReg());
570 break;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000571
Simon Pilgrim8483df62015-11-17 22:35:45 +0000572 CASE_UNPCK(UNPCKHPD, r)
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000573 Src2Name = getRegName(MI->getOperand(2).getReg());
574 // FALL THROUGH.
Simon Pilgrim8483df62015-11-17 22:35:45 +0000575 CASE_UNPCK(UNPCKHPD, m)
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000576 DecodeUNPCKHMask(getRegOperandVectorVT(MI, MVT::f64, 0), ShuffleMask);
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000577 Src1Name = getRegName(MI->getOperand(1).getReg());
578 DestName = getRegName(MI->getOperand(0).getReg());
579 break;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000580
Simon Pilgrim8483df62015-11-17 22:35:45 +0000581 CASE_UNPCK(UNPCKHPS, r)
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000582 Src2Name = getRegName(MI->getOperand(2).getReg());
583 // FALL THROUGH.
Simon Pilgrim8483df62015-11-17 22:35:45 +0000584 CASE_UNPCK(UNPCKHPS, m)
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000585 DecodeUNPCKHMask(getRegOperandVectorVT(MI, MVT::f32, 0), ShuffleMask);
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000586 Src1Name = getRegName(MI->getOperand(1).getReg());
587 DestName = getRegName(MI->getOperand(0).getReg());
588 break;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000589
Simon Pilgrim2da41782015-11-17 23:29:49 +0000590 CASE_VPERM(PERMILPS, r)
Simon Pilgrim6ce35dd2016-05-11 18:53:44 +0000591 Src1Name = getRegName(MI->getOperand(NumOperands - 2).getReg());
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000592 // FALL THROUGH.
Simon Pilgrim2da41782015-11-17 23:29:49 +0000593 CASE_VPERM(PERMILPS, m)
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000594 if (MI->getOperand(NumOperands - 1).isImm())
Simon Pilgrim5883a732015-11-16 22:39:27 +0000595 DecodePSHUFMask(getRegOperandVectorVT(MI, MVT::f32, 0),
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000596 MI->getOperand(NumOperands - 1).getImm(),
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000597 ShuffleMask);
598 DestName = getRegName(MI->getOperand(0).getReg());
599 break;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000600
Simon Pilgrim2da41782015-11-17 23:29:49 +0000601 CASE_VPERM(PERMILPD, r)
Simon Pilgrim6ce35dd2016-05-11 18:53:44 +0000602 Src1Name = getRegName(MI->getOperand(NumOperands - 2).getReg());
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000603 // FALL THROUGH.
Simon Pilgrim2da41782015-11-17 23:29:49 +0000604 CASE_VPERM(PERMILPD, m)
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000605 if (MI->getOperand(NumOperands - 1).isImm())
Simon Pilgrim5883a732015-11-16 22:39:27 +0000606 DecodePSHUFMask(getRegOperandVectorVT(MI, MVT::f64, 0),
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000607 MI->getOperand(NumOperands - 1).getImm(),
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000608 ShuffleMask);
609 DestName = getRegName(MI->getOperand(0).getReg());
610 break;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000611
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000612 case X86::VPERM2F128rr:
613 case X86::VPERM2I128rr:
614 Src2Name = getRegName(MI->getOperand(2).getReg());
615 // FALL THROUGH.
616 case X86::VPERM2F128rm:
617 case X86::VPERM2I128rm:
618 // For instruction comments purpose, assume the 256-bit vector is v4i64.
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000619 if (MI->getOperand(NumOperands - 1).isImm())
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000620 DecodeVPERM2X128Mask(MVT::v4i64,
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000621 MI->getOperand(NumOperands - 1).getImm(),
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000622 ShuffleMask);
623 Src1Name = getRegName(MI->getOperand(1).getReg());
624 DestName = getRegName(MI->getOperand(0).getReg());
625 break;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000626
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000627 case X86::VPERMQYri:
Craig Topper22ae3532016-05-21 06:07:18 +0000628 case X86::VPERMQZ256ri:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000629 case X86::VPERMPDYri:
Craig Topper22ae3532016-05-21 06:07:18 +0000630 case X86::VPERMPDZ256ri:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000631 Src1Name = getRegName(MI->getOperand(1).getReg());
632 // FALL THROUGH.
633 case X86::VPERMQYmi:
Craig Topper22ae3532016-05-21 06:07:18 +0000634 case X86::VPERMQZ256mi:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000635 case X86::VPERMPDYmi:
Craig Topper22ae3532016-05-21 06:07:18 +0000636 case X86::VPERMPDZ256mi:
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000637 if (MI->getOperand(NumOperands - 1).isImm())
638 DecodeVPERMMask(MI->getOperand(NumOperands - 1).getImm(),
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000639 ShuffleMask);
640 DestName = getRegName(MI->getOperand(0).getReg());
641 break;
642
643 case X86::MOVSDrr:
644 case X86::VMOVSDrr:
Simon Pilgrimf5c23ad2016-02-01 22:26:28 +0000645 case X86::VMOVSDZrr:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000646 Src2Name = getRegName(MI->getOperand(2).getReg());
647 Src1Name = getRegName(MI->getOperand(1).getReg());
648 // FALL THROUGH.
649 case X86::MOVSDrm:
650 case X86::VMOVSDrm:
Simon Pilgrimf5c23ad2016-02-01 22:26:28 +0000651 case X86::VMOVSDZrm:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000652 DecodeScalarMoveMask(MVT::v2f64, nullptr == Src2Name, ShuffleMask);
653 DestName = getRegName(MI->getOperand(0).getReg());
654 break;
Simon Pilgrimd5a15442015-11-21 13:04:42 +0000655
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000656 case X86::MOVSSrr:
657 case X86::VMOVSSrr:
Simon Pilgrimf5c23ad2016-02-01 22:26:28 +0000658 case X86::VMOVSSZrr:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000659 Src2Name = getRegName(MI->getOperand(2).getReg());
660 Src1Name = getRegName(MI->getOperand(1).getReg());
661 // FALL THROUGH.
662 case X86::MOVSSrm:
663 case X86::VMOVSSrm:
Simon Pilgrimf5c23ad2016-02-01 22:26:28 +0000664 case X86::VMOVSSZrm:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000665 DecodeScalarMoveMask(MVT::v4f32, nullptr == Src2Name, ShuffleMask);
666 DestName = getRegName(MI->getOperand(0).getReg());
667 break;
668
669 case X86::MOVPQI2QIrr:
Simon Pilgrim3e0c0222015-12-13 12:49:48 +0000670 case X86::MOVZPQILo2PQIrr:
671 case X86::VMOVPQI2QIrr:
672 case X86::VMOVZPQILo2PQIrr:
673 case X86::VMOVZPQILo2PQIZrr:
674 Src1Name = getRegName(MI->getOperand(1).getReg());
675 // FALL THROUGH.
676 case X86::MOVQI2PQIrm:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000677 case X86::MOVZQI2PQIrm:
678 case X86::MOVZPQILo2PQIrm:
Simon Pilgrim3e0c0222015-12-13 12:49:48 +0000679 case X86::VMOVQI2PQIrm:
Simon Pilgrim96fe4ef2016-02-02 13:32:56 +0000680 case X86::VMOVQI2PQIZrm:
Simon Pilgrim3e0c0222015-12-13 12:49:48 +0000681 case X86::VMOVZQI2PQIrm:
682 case X86::VMOVZPQILo2PQIrm:
683 case X86::VMOVZPQILo2PQIZrm:
684 DecodeZeroMoveLowMask(MVT::v2i64, ShuffleMask);
685 DestName = getRegName(MI->getOperand(0).getReg());
686 break;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000687
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000688 case X86::MOVDI2PDIrm:
689 case X86::VMOVDI2PDIrm:
Simon Pilgrim5be17b62016-02-01 23:04:05 +0000690 case X86::VMOVDI2PDIZrm:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000691 DecodeZeroMoveLowMask(MVT::v4i32, ShuffleMask);
692 DestName = getRegName(MI->getOperand(0).getReg());
693 break;
694
Simon Pilgrimd85cae32015-07-06 20:46:41 +0000695 case X86::EXTRQI:
696 if (MI->getOperand(2).isImm() &&
697 MI->getOperand(3).isImm())
698 DecodeEXTRQIMask(MI->getOperand(2).getImm(),
699 MI->getOperand(3).getImm(),
700 ShuffleMask);
701
702 DestName = getRegName(MI->getOperand(0).getReg());
703 Src1Name = getRegName(MI->getOperand(1).getReg());
704 break;
705
706 case X86::INSERTQI:
707 if (MI->getOperand(3).isImm() &&
708 MI->getOperand(4).isImm())
709 DecodeINSERTQIMask(MI->getOperand(3).getImm(),
710 MI->getOperand(4).getImm(),
711 ShuffleMask);
712
713 DestName = getRegName(MI->getOperand(0).getReg());
714 Src1Name = getRegName(MI->getOperand(1).getReg());
715 Src2Name = getRegName(MI->getOperand(2).getReg());
716 break;
717
Simon Pilgrim0acc32a2016-02-06 19:51:21 +0000718 CASE_PMOVZX(PMOVZXBW, r)
719 CASE_PMOVZX(PMOVZXBD, r)
720 CASE_PMOVZX(PMOVZXBQ, r)
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000721 Src1Name = getRegName(MI->getOperand(NumOperands - 1).getReg());
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000722 // FALL THROUGH.
Simon Pilgrim0acc32a2016-02-06 19:51:21 +0000723 CASE_PMOVZX(PMOVZXBW, m)
724 CASE_PMOVZX(PMOVZXBD, m)
725 CASE_PMOVZX(PMOVZXBQ, m)
Simon Pilgrime1b6db92016-02-06 16:33:42 +0000726 DecodeZeroExtendMask(MVT::i8, getZeroExtensionResultType(MI), ShuffleMask);
727 DestName = getRegName(MI->getOperand(0).getReg());
728 break;
729
Simon Pilgrim0acc32a2016-02-06 19:51:21 +0000730 CASE_PMOVZX(PMOVZXWD, r)
731 CASE_PMOVZX(PMOVZXWQ, r)
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000732 Src1Name = getRegName(MI->getOperand(NumOperands - 1).getReg());
Simon Pilgrime1b6db92016-02-06 16:33:42 +0000733 // FALL THROUGH.
Simon Pilgrim0acc32a2016-02-06 19:51:21 +0000734 CASE_PMOVZX(PMOVZXWD, m)
735 CASE_PMOVZX(PMOVZXWQ, m)
Simon Pilgrime1b6db92016-02-06 16:33:42 +0000736 DecodeZeroExtendMask(MVT::i16, getZeroExtensionResultType(MI), ShuffleMask);
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000737 DestName = getRegName(MI->getOperand(0).getReg());
Simon Pilgrime1b6db92016-02-06 16:33:42 +0000738 break;
739
Simon Pilgrim0acc32a2016-02-06 19:51:21 +0000740 CASE_PMOVZX(PMOVZXDQ, r)
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000741 Src1Name = getRegName(MI->getOperand(NumOperands - 1).getReg());
Simon Pilgrime1b6db92016-02-06 16:33:42 +0000742 // FALL THROUGH.
Simon Pilgrim0acc32a2016-02-06 19:51:21 +0000743 CASE_PMOVZX(PMOVZXDQ, m)
Simon Pilgrime1b6db92016-02-06 16:33:42 +0000744 DecodeZeroExtendMask(MVT::i32, getZeroExtensionResultType(MI), ShuffleMask);
745 DestName = getRegName(MI->getOperand(0).getReg());
746 break;
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000747 }
748
749 // The only comments we decode are shuffles, so give up if we were unable to
750 // decode a shuffle mask.
751 if (ShuffleMask.empty())
752 return false;
753
Simon Pilgrimaf742d52016-05-09 13:30:16 +0000754 // TODO: Add support for specifying an AVX512 style mask register in the comment.
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000755 if (!DestName) DestName = Src1Name;
756 OS << (DestName ? DestName : "mem") << " = ";
757
758 // If the two sources are the same, canonicalize the input elements to be
759 // from the first src so that we get larger element spans.
760 if (Src1Name == Src2Name) {
761 for (unsigned i = 0, e = ShuffleMask.size(); i != e; ++i) {
762 if ((int)ShuffleMask[i] >= 0 && // Not sentinel.
NAKAMURA Takumi5582a6a2015-05-25 01:43:34 +0000763 ShuffleMask[i] >= (int)e) // From second mask.
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000764 ShuffleMask[i] -= e;
765 }
766 }
767
768 // The shuffle mask specifies which elements of the src1/src2 fill in the
769 // destination, with a few sentinel values. Loop through and print them
770 // out.
771 for (unsigned i = 0, e = ShuffleMask.size(); i != e; ++i) {
772 if (i != 0)
773 OS << ',';
774 if (ShuffleMask[i] == SM_SentinelZero) {
775 OS << "zero";
776 continue;
777 }
778
779 // Otherwise, it must come from src1 or src2. Print the span of elements
780 // that comes from this src.
781 bool isSrc1 = ShuffleMask[i] < (int)ShuffleMask.size();
782 const char *SrcName = isSrc1 ? Src1Name : Src2Name;
783 OS << (SrcName ? SrcName : "mem") << '[';
784 bool IsFirst = true;
785 while (i != e && (int)ShuffleMask[i] != SM_SentinelZero &&
786 (ShuffleMask[i] < (int)ShuffleMask.size()) == isSrc1) {
787 if (!IsFirst)
788 OS << ',';
789 else
790 IsFirst = false;
791 if (ShuffleMask[i] == SM_SentinelUndef)
792 OS << "u";
793 else
794 OS << ShuffleMask[i] % ShuffleMask.size();
795 ++i;
796 }
797 OS << ']';
NAKAMURA Takumi5582a6a2015-05-25 01:43:34 +0000798 --i; // For loop increments element #.
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000799 }
800 //MI->print(OS, 0);
801 OS << "\n";
802
803 // We successfully added a comment to this instruction.
804 return true;
805}