blob: 09e599c8472060c6698d54e5f7fccb39cde0cee6 [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
Craig Topper01f53b12016-06-03 05:31:00 +000065#define CASE_SHUF(Inst, suf) \
66 CASE_AVX512_INS_COMMON(Inst, Z, suf) \
67 CASE_AVX512_INS_COMMON(Inst, Z256, suf) \
68 CASE_AVX512_INS_COMMON(Inst, Z128, suf) \
69 CASE_AVX_INS_COMMON(Inst, , suf) \
70 CASE_AVX_INS_COMMON(Inst, Y, suf) \
71 CASE_SSE_INS_COMMON(Inst, suf)
Simon Pilgrimbfa5f232016-02-06 17:02:15 +000072
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();
Craig Topper89c17612016-06-10 04:48:05 +0000166 bool RegForm = false;
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000167
168 switch (MI->getOpcode()) {
169 default:
170 // Not an instruction for which we can decode comments.
171 return false;
172
173 case X86::BLENDPDrri:
174 case X86::VBLENDPDrri:
Simon Pilgrim13d3a202015-11-16 23:03:18 +0000175 case X86::VBLENDPDYrri:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000176 Src2Name = getRegName(MI->getOperand(2).getReg());
177 // FALL THROUGH.
178 case X86::BLENDPDrmi:
179 case X86::VBLENDPDrmi:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000180 case X86::VBLENDPDYrmi:
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000181 if (MI->getOperand(NumOperands - 1).isImm())
Simon Pilgrim13d3a202015-11-16 23:03:18 +0000182 DecodeBLENDMask(getRegOperandVectorVT(MI, MVT::f64, 0),
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000183 MI->getOperand(NumOperands - 1).getImm(),
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000184 ShuffleMask);
185 Src1Name = getRegName(MI->getOperand(1).getReg());
186 DestName = getRegName(MI->getOperand(0).getReg());
187 break;
188
189 case X86::BLENDPSrri:
190 case X86::VBLENDPSrri:
Simon Pilgrim13d3a202015-11-16 23:03:18 +0000191 case X86::VBLENDPSYrri:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000192 Src2Name = getRegName(MI->getOperand(2).getReg());
193 // FALL THROUGH.
194 case X86::BLENDPSrmi:
195 case X86::VBLENDPSrmi:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000196 case X86::VBLENDPSYrmi:
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000197 if (MI->getOperand(NumOperands - 1).isImm())
Simon Pilgrim13d3a202015-11-16 23:03:18 +0000198 DecodeBLENDMask(getRegOperandVectorVT(MI, MVT::f32, 0),
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000199 MI->getOperand(NumOperands - 1).getImm(),
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000200 ShuffleMask);
201 Src1Name = getRegName(MI->getOperand(1).getReg());
202 DestName = getRegName(MI->getOperand(0).getReg());
203 break;
204
205 case X86::PBLENDWrri:
206 case X86::VPBLENDWrri:
Simon Pilgrim13d3a202015-11-16 23:03:18 +0000207 case X86::VPBLENDWYrri:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000208 Src2Name = getRegName(MI->getOperand(2).getReg());
209 // FALL THROUGH.
210 case X86::PBLENDWrmi:
211 case X86::VPBLENDWrmi:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000212 case X86::VPBLENDWYrmi:
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000213 if (MI->getOperand(NumOperands - 1).isImm())
Simon Pilgrim13d3a202015-11-16 23:03:18 +0000214 DecodeBLENDMask(getRegOperandVectorVT(MI, MVT::i16, 0),
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000215 MI->getOperand(NumOperands - 1).getImm(),
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000216 ShuffleMask);
217 Src1Name = getRegName(MI->getOperand(1).getReg());
218 DestName = getRegName(MI->getOperand(0).getReg());
219 break;
220
221 case X86::VPBLENDDrri:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000222 case X86::VPBLENDDYrri:
223 Src2Name = getRegName(MI->getOperand(2).getReg());
224 // FALL THROUGH.
Simon Pilgrim13d3a202015-11-16 23:03:18 +0000225 case X86::VPBLENDDrmi:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000226 case X86::VPBLENDDYrmi:
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000227 if (MI->getOperand(NumOperands - 1).isImm())
Simon Pilgrim13d3a202015-11-16 23:03:18 +0000228 DecodeBLENDMask(getRegOperandVectorVT(MI, MVT::i32, 0),
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000229 MI->getOperand(NumOperands - 1).getImm(),
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000230 ShuffleMask);
231 Src1Name = getRegName(MI->getOperand(1).getReg());
232 DestName = getRegName(MI->getOperand(0).getReg());
233 break;
234
235 case X86::INSERTPSrr:
236 case X86::VINSERTPSrr:
Simon Pilgrim025a3d852016-02-01 22:05:50 +0000237 case X86::VINSERTPSzrr:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000238 Src2Name = getRegName(MI->getOperand(2).getReg());
239 // FALL THROUGH.
240 case X86::INSERTPSrm:
241 case X86::VINSERTPSrm:
Simon Pilgrim025a3d852016-02-01 22:05:50 +0000242 case X86::VINSERTPSzrm:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000243 DestName = getRegName(MI->getOperand(0).getReg());
244 Src1Name = getRegName(MI->getOperand(1).getReg());
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000245 if (MI->getOperand(NumOperands - 1).isImm())
246 DecodeINSERTPSMask(MI->getOperand(NumOperands - 1).getImm(),
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000247 ShuffleMask);
248 break;
249
250 case X86::MOVLHPSrr:
251 case X86::VMOVLHPSrr:
Simon Pilgrimd5a15442015-11-21 13:04:42 +0000252 case X86::VMOVLHPSZrr:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000253 Src2Name = getRegName(MI->getOperand(2).getReg());
254 Src1Name = getRegName(MI->getOperand(1).getReg());
255 DestName = getRegName(MI->getOperand(0).getReg());
256 DecodeMOVLHPSMask(2, ShuffleMask);
257 break;
258
259 case X86::MOVHLPSrr:
260 case X86::VMOVHLPSrr:
Simon Pilgrimd5a15442015-11-21 13:04:42 +0000261 case X86::VMOVHLPSZrr:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000262 Src2Name = getRegName(MI->getOperand(2).getReg());
263 Src1Name = getRegName(MI->getOperand(1).getReg());
264 DestName = getRegName(MI->getOperand(0).getReg());
265 DecodeMOVHLPSMask(2, ShuffleMask);
266 break;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000267
Simon Pilgrima3d67442016-02-07 15:39:22 +0000268 case X86::MOVHPDrm:
269 case X86::VMOVHPDrm:
270 case X86::VMOVHPDZ128rm:
271 Src1Name = getRegName(MI->getOperand(1).getReg());
272 DestName = getRegName(MI->getOperand(0).getReg());
273 DecodeInsertElementMask(MVT::v2f64, 1, 1, ShuffleMask);
274 break;
275
276 case X86::MOVHPSrm:
277 case X86::VMOVHPSrm:
278 case X86::VMOVHPSZ128rm:
279 Src1Name = getRegName(MI->getOperand(1).getReg());
280 DestName = getRegName(MI->getOperand(0).getReg());
281 DecodeInsertElementMask(MVT::v4f32, 2, 2, ShuffleMask);
282 break;
283
284 case X86::MOVLPDrm:
285 case X86::VMOVLPDrm:
286 case X86::VMOVLPDZ128rm:
287 Src1Name = getRegName(MI->getOperand(1).getReg());
288 DestName = getRegName(MI->getOperand(0).getReg());
289 DecodeInsertElementMask(MVT::v2f64, 0, 1, ShuffleMask);
290 break;
291
292 case X86::MOVLPSrm:
293 case X86::VMOVLPSrm:
294 case X86::VMOVLPSZ128rm:
295 Src1Name = getRegName(MI->getOperand(1).getReg());
296 DestName = getRegName(MI->getOperand(0).getReg());
297 DecodeInsertElementMask(MVT::v4f32, 0, 2, ShuffleMask);
298 break;
299
Igor Breger24cab0f2015-11-16 07:22:00 +0000300 CASE_MOVDUP(MOVSLDUP, r)
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000301 Src1Name = getRegName(MI->getOperand(NumOperands - 1).getReg());
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000302 // FALL THROUGH.
Igor Breger1f782962015-11-19 08:26:56 +0000303 CASE_MOVDUP(MOVSLDUP, m)
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000304 DestName = getRegName(MI->getOperand(0).getReg());
Igor Breger1f782962015-11-19 08:26:56 +0000305 DecodeMOVSLDUPMask(getRegOperandVectorVT(MI, MVT::f32, 0), ShuffleMask);
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000306 break;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000307
Igor Breger24cab0f2015-11-16 07:22:00 +0000308 CASE_MOVDUP(MOVSHDUP, r)
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000309 Src1Name = getRegName(MI->getOperand(NumOperands - 1).getReg());
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000310 // FALL THROUGH.
Igor Breger1f782962015-11-19 08:26:56 +0000311 CASE_MOVDUP(MOVSHDUP, m)
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000312 DestName = getRegName(MI->getOperand(0).getReg());
Igor Breger1f782962015-11-19 08:26:56 +0000313 DecodeMOVSHDUPMask(getRegOperandVectorVT(MI, MVT::f32, 0), ShuffleMask);
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000314 break;
315
Igor Breger1f782962015-11-19 08:26:56 +0000316 CASE_MOVDUP(MOVDDUP, r)
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000317 Src1Name = getRegName(MI->getOperand(NumOperands - 1).getReg());
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000318 // FALL THROUGH.
Igor Breger1f782962015-11-19 08:26:56 +0000319 CASE_MOVDUP(MOVDDUP, m)
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000320 DestName = getRegName(MI->getOperand(0).getReg());
Igor Breger1f782962015-11-19 08:26:56 +0000321 DecodeMOVDDUPMask(getRegOperandVectorVT(MI, MVT::f64, 0), ShuffleMask);
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000322 break;
323
324 case X86::PSLLDQri:
325 case X86::VPSLLDQri:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000326 case X86::VPSLLDQYri:
Simon Pilgrim643734c2016-06-09 22:03:15 +0000327 case X86::VPSLLDQZ128rr:
328 case X86::VPSLLDQZ256rr:
329 case X86::VPSLLDQZ512rr:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000330 Src1Name = getRegName(MI->getOperand(1).getReg());
Simon Pilgrim643734c2016-06-09 22:03:15 +0000331 case X86::VPSLLDQZ128rm:
332 case X86::VPSLLDQZ256rm:
333 case X86::VPSLLDQZ512rm:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000334 DestName = getRegName(MI->getOperand(0).getReg());
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000335 if (MI->getOperand(NumOperands - 1).isImm())
Simon Pilgrimb9ada272015-11-16 22:54:41 +0000336 DecodePSLLDQMask(getRegOperandVectorVT(MI, MVT::i8, 0),
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000337 MI->getOperand(NumOperands - 1).getImm(),
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000338 ShuffleMask);
339 break;
340
341 case X86::PSRLDQri:
342 case X86::VPSRLDQri:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000343 case X86::VPSRLDQYri:
Simon Pilgrim643734c2016-06-09 22:03:15 +0000344 case X86::VPSRLDQZ128rr:
345 case X86::VPSRLDQZ256rr:
346 case X86::VPSRLDQZ512rr:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000347 Src1Name = getRegName(MI->getOperand(1).getReg());
Simon Pilgrim643734c2016-06-09 22:03:15 +0000348 case X86::VPSRLDQZ128rm:
349 case X86::VPSRLDQZ256rm:
350 case X86::VPSRLDQZ512rm:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000351 DestName = getRegName(MI->getOperand(0).getReg());
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000352 if (MI->getOperand(NumOperands - 1).isImm())
Simon Pilgrimb9ada272015-11-16 22:54:41 +0000353 DecodePSRLDQMask(getRegOperandVectorVT(MI, MVT::i8, 0),
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000354 MI->getOperand(NumOperands - 1).getImm(),
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000355 ShuffleMask);
356 break;
357
Craig Topper7a299302016-06-09 07:06:38 +0000358 CASE_SHUF(PALIGNR, rri)
Craig Topper89c17612016-06-10 04:48:05 +0000359 Src1Name = getRegName(MI->getOperand(NumOperands - 2).getReg());
360 RegForm = true;
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000361 // FALL THROUGH.
Craig Topper7a299302016-06-09 07:06:38 +0000362 CASE_SHUF(PALIGNR, rmi)
Craig Topper89c17612016-06-10 04:48:05 +0000363 Src2Name = getRegName(MI->getOperand(NumOperands-(RegForm?3:7)).getReg());
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000364 DestName = getRegName(MI->getOperand(0).getReg());
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000365 if (MI->getOperand(NumOperands - 1).isImm())
Simon Pilgrimb9ada272015-11-16 22:54:41 +0000366 DecodePALIGNRMask(getRegOperandVectorVT(MI, MVT::i8, 0),
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000367 MI->getOperand(NumOperands - 1).getImm(),
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000368 ShuffleMask);
369 break;
370
Craig Topper01f53b12016-06-03 05:31:00 +0000371 CASE_SHUF(PSHUFD, ri)
Craig Topper6f7288d2016-06-09 07:49:08 +0000372 Src1Name = getRegName(MI->getOperand(NumOperands - 2).getReg());
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000373 // FALL THROUGH.
Craig Topper01f53b12016-06-03 05:31:00 +0000374 CASE_SHUF(PSHUFD, mi)
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000375 DestName = getRegName(MI->getOperand(0).getReg());
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000376 if (MI->getOperand(NumOperands - 1).isImm())
Simon Pilgrim5883a732015-11-16 22:39:27 +0000377 DecodePSHUFMask(getRegOperandVectorVT(MI, MVT::i32, 0),
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000378 MI->getOperand(NumOperands - 1).getImm(),
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000379 ShuffleMask);
380 break;
381
Craig Topper01f53b12016-06-03 05:31:00 +0000382 CASE_SHUF(PSHUFHW, ri)
Craig Topper6f7288d2016-06-09 07:49:08 +0000383 Src1Name = getRegName(MI->getOperand(NumOperands - 2).getReg());
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000384 // FALL THROUGH.
Craig Topper01f53b12016-06-03 05:31:00 +0000385 CASE_SHUF(PSHUFHW, mi)
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000386 DestName = getRegName(MI->getOperand(0).getReg());
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000387 if (MI->getOperand(NumOperands - 1).isImm())
Simon Pilgrim5883a732015-11-16 22:39:27 +0000388 DecodePSHUFHWMask(getRegOperandVectorVT(MI, MVT::i16, 0),
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000389 MI->getOperand(NumOperands - 1).getImm(),
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000390 ShuffleMask);
391 break;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000392
Craig Topper01f53b12016-06-03 05:31:00 +0000393 CASE_SHUF(PSHUFLW, ri)
Craig Topper6f7288d2016-06-09 07:49:08 +0000394 Src1Name = getRegName(MI->getOperand(NumOperands - 2).getReg());
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000395 // FALL THROUGH.
Craig Topper01f53b12016-06-03 05:31:00 +0000396 CASE_SHUF(PSHUFLW, mi)
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000397 DestName = getRegName(MI->getOperand(0).getReg());
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000398 if (MI->getOperand(NumOperands - 1).isImm())
Simon Pilgrim5883a732015-11-16 22:39:27 +0000399 DecodePSHUFLWMask(getRegOperandVectorVT(MI, MVT::i16, 0),
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000400 MI->getOperand(NumOperands - 1).getImm(),
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000401 ShuffleMask);
402 break;
403
Simon Pilgrimf8f86ab2015-09-13 11:28:45 +0000404 case X86::MMX_PSHUFWri:
405 Src1Name = getRegName(MI->getOperand(1).getReg());
406 // FALL THROUGH.
407 case X86::MMX_PSHUFWmi:
408 DestName = getRegName(MI->getOperand(0).getReg());
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000409 if (MI->getOperand(NumOperands - 1).isImm())
Simon Pilgrimf8f86ab2015-09-13 11:28:45 +0000410 DecodePSHUFMask(MVT::v4i16,
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000411 MI->getOperand(NumOperands - 1).getImm(),
Simon Pilgrimf8f86ab2015-09-13 11:28:45 +0000412 ShuffleMask);
413 break;
414
415 case X86::PSWAPDrr:
416 Src1Name = getRegName(MI->getOperand(1).getReg());
417 // FALL THROUGH.
418 case X86::PSWAPDrm:
419 DestName = getRegName(MI->getOperand(0).getReg());
420 DecodePSWAPMask(MVT::v2i32, ShuffleMask);
421 break;
422
Simon Pilgrim8483df62015-11-17 22:35:45 +0000423 CASE_UNPCK(PUNPCKHBW, r)
Simon Pilgrimf8f86ab2015-09-13 11:28:45 +0000424 case X86::MMX_PUNPCKHBWirr:
Craig Topper89c17612016-06-10 04:48:05 +0000425 Src2Name = getRegName(MI->getOperand(NumOperands - 1).getReg());
426 RegForm = true;
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000427 // FALL THROUGH.
Simon Pilgrim8483df62015-11-17 22:35:45 +0000428 CASE_UNPCK(PUNPCKHBW, m)
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000429 case X86::MMX_PUNPCKHBWirm:
Craig Topper89c17612016-06-10 04:48:05 +0000430 Src1Name = getRegName(MI->getOperand(NumOperands-(RegForm?2:6)).getReg());
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000431 DestName = getRegName(MI->getOperand(0).getReg());
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000432 DecodeUNPCKHMask(getRegOperandVectorVT(MI, MVT::i8, 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(PUNPCKHWD, r)
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000436 case X86::MMX_PUNPCKHWDirr:
Craig Topper89c17612016-06-10 04:48:05 +0000437 Src2Name = getRegName(MI->getOperand(NumOperands - 1).getReg());
438 RegForm = true;
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000439 // 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:
Craig Topper89c17612016-06-10 04:48:05 +0000442 Src1Name = getRegName(MI->getOperand(NumOperands-(RegForm?2:6)).getReg());
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000443 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:
Craig Topper89c17612016-06-10 04:48:05 +0000449 Src2Name = getRegName(MI->getOperand(NumOperands - 1).getReg());
450 RegForm = true;
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000451 // FALL THROUGH.
Simon Pilgrim8483df62015-11-17 22:35:45 +0000452 CASE_UNPCK(PUNPCKHDQ, m)
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000453 case X86::MMX_PUNPCKHDQirm:
Craig Topper89c17612016-06-10 04:48:05 +0000454 Src1Name = getRegName(MI->getOperand(NumOperands-(RegForm?2:6)).getReg());
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000455 DestName = getRegName(MI->getOperand(0).getReg());
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000456 DecodeUNPCKHMask(getRegOperandVectorVT(MI, MVT::i32, 0), ShuffleMask);
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000457 break;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000458
Simon Pilgrim8483df62015-11-17 22:35:45 +0000459 CASE_UNPCK(PUNPCKHQDQ, r)
Craig Topper89c17612016-06-10 04:48:05 +0000460 Src2Name = getRegName(MI->getOperand(NumOperands - 1).getReg());
461 RegForm = true;
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000462 // FALL THROUGH.
Simon Pilgrim8483df62015-11-17 22:35:45 +0000463 CASE_UNPCK(PUNPCKHQDQ, m)
Craig Topper89c17612016-06-10 04:48:05 +0000464 Src1Name = getRegName(MI->getOperand(NumOperands-(RegForm?2:6)).getReg());
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000465 DestName = getRegName(MI->getOperand(0).getReg());
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000466 DecodeUNPCKHMask(getRegOperandVectorVT(MI, MVT::i64, 0), ShuffleMask);
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000467 break;
468
Simon Pilgrim8483df62015-11-17 22:35:45 +0000469 CASE_UNPCK(PUNPCKLBW, r)
Simon Pilgrimf8f86ab2015-09-13 11:28:45 +0000470 case X86::MMX_PUNPCKLBWirr:
Craig Topper89c17612016-06-10 04:48:05 +0000471 Src2Name = getRegName(MI->getOperand(NumOperands - 1).getReg());
472 RegForm = true;
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000473 // FALL THROUGH.
Simon Pilgrim8483df62015-11-17 22:35:45 +0000474 CASE_UNPCK(PUNPCKLBW, m)
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000475 case X86::MMX_PUNPCKLBWirm:
Craig Topper89c17612016-06-10 04:48:05 +0000476 Src1Name = getRegName(MI->getOperand(NumOperands-(RegForm?2:6)).getReg());
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000477 DestName = getRegName(MI->getOperand(0).getReg());
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000478 DecodeUNPCKLMask(getRegOperandVectorVT(MI, MVT::i8, 0), ShuffleMask);
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000479 break;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000480
Simon Pilgrim8483df62015-11-17 22:35:45 +0000481 CASE_UNPCK(PUNPCKLWD, r)
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000482 case X86::MMX_PUNPCKLWDirr:
Craig Topper89c17612016-06-10 04:48:05 +0000483 Src2Name = getRegName(MI->getOperand(NumOperands - 1).getReg());
484 RegForm = true;
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000485 // FALL THROUGH.
Simon Pilgrim8483df62015-11-17 22:35:45 +0000486 CASE_UNPCK(PUNPCKLWD, m)
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000487 case X86::MMX_PUNPCKLWDirm:
Craig Topper89c17612016-06-10 04:48:05 +0000488 Src1Name = getRegName(MI->getOperand(NumOperands-(RegForm?2:6)).getReg());
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000489 DestName = getRegName(MI->getOperand(0).getReg());
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000490 DecodeUNPCKLMask(getRegOperandVectorVT(MI, MVT::i16, 0), ShuffleMask);
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000491 break;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000492
Simon Pilgrim8483df62015-11-17 22:35:45 +0000493 CASE_UNPCK(PUNPCKLDQ, r)
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000494 case X86::MMX_PUNPCKLDQirr:
Craig Topper89c17612016-06-10 04:48:05 +0000495 Src2Name = getRegName(MI->getOperand(NumOperands - 1).getReg());
496 RegForm = true;
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000497 // FALL THROUGH.
Simon Pilgrim8483df62015-11-17 22:35:45 +0000498 CASE_UNPCK(PUNPCKLDQ, m)
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000499 case X86::MMX_PUNPCKLDQirm:
Craig Topper89c17612016-06-10 04:48:05 +0000500 Src1Name = getRegName(MI->getOperand(NumOperands-(RegForm?2:6)).getReg());
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000501 DestName = getRegName(MI->getOperand(0).getReg());
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000502 DecodeUNPCKLMask(getRegOperandVectorVT(MI, MVT::i32, 0), ShuffleMask);
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000503 break;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000504
Simon Pilgrim8483df62015-11-17 22:35:45 +0000505 CASE_UNPCK(PUNPCKLQDQ, r)
Craig Topper89c17612016-06-10 04:48:05 +0000506 Src2Name = getRegName(MI->getOperand(NumOperands - 1).getReg());
507 RegForm = true;
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000508 // FALL THROUGH.
Simon Pilgrim8483df62015-11-17 22:35:45 +0000509 CASE_UNPCK(PUNPCKLQDQ, m)
Craig Topper89c17612016-06-10 04:48:05 +0000510 Src1Name = getRegName(MI->getOperand(NumOperands-(RegForm?2:6)).getReg());
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000511 DestName = getRegName(MI->getOperand(0).getReg());
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000512 DecodeUNPCKLMask(getRegOperandVectorVT(MI, MVT::i64, 0), ShuffleMask);
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000513 break;
514
Craig Topper01f53b12016-06-03 05:31:00 +0000515 CASE_SHUF(SHUFPD, rri)
Craig Topper89c17612016-06-10 04:48:05 +0000516 Src2Name = getRegName(MI->getOperand(NumOperands - 2).getReg());
517 RegForm = true;
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000518 // FALL THROUGH.
Craig Topper01f53b12016-06-03 05:31:00 +0000519 CASE_SHUF(SHUFPD, rmi)
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000520 if (MI->getOperand(NumOperands - 1).isImm())
Simon Pilgrim5883a732015-11-16 22:39:27 +0000521 DecodeSHUFPMask(getRegOperandVectorVT(MI, MVT::f64, 0),
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000522 MI->getOperand(NumOperands - 1).getImm(),
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000523 ShuffleMask);
Craig Topper89c17612016-06-10 04:48:05 +0000524 Src1Name = getRegName(MI->getOperand(NumOperands-(RegForm?3:7)).getReg());
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000525 DestName = getRegName(MI->getOperand(0).getReg());
526 break;
527
Craig Topper01f53b12016-06-03 05:31:00 +0000528 CASE_SHUF(SHUFPS, rri)
Craig Topper89c17612016-06-10 04:48:05 +0000529 Src2Name = getRegName(MI->getOperand(NumOperands - 2).getReg());
530 RegForm = true;
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000531 // FALL THROUGH.
Craig Topper01f53b12016-06-03 05:31:00 +0000532 CASE_SHUF(SHUFPS, rmi)
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000533 if (MI->getOperand(NumOperands - 1).isImm())
Simon Pilgrim5883a732015-11-16 22:39:27 +0000534 DecodeSHUFPMask(getRegOperandVectorVT(MI, MVT::f32, 0),
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000535 MI->getOperand(NumOperands - 1).getImm(),
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000536 ShuffleMask);
Craig Topper89c17612016-06-10 04:48:05 +0000537 Src1Name = getRegName(MI->getOperand(NumOperands-(RegForm?3:7)).getReg());
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000538 DestName = getRegName(MI->getOperand(0).getReg());
539 break;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000540
Igor Breger24cab0f2015-11-16 07:22:00 +0000541 CASE_VSHUF(64X2, r)
542 CASE_VSHUF(64X2, m)
543 CASE_VSHUF(32X4, r)
544 CASE_VSHUF(32X4, m) {
Igor Bregerd7bae452015-10-15 13:29:07 +0000545 MVT VT;
546 bool HasMemOp;
Igor Bregerd7bae452015-10-15 13:29:07 +0000547 getVSHUF64x2FamilyInfo(MI, VT, HasMemOp);
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000548 decodeVSHUF64x2FamilyMask(VT, MI->getOperand(NumOperands - 1).getImm(),
Igor Bregerd7bae452015-10-15 13:29:07 +0000549 ShuffleMask);
550 DestName = getRegName(MI->getOperand(0).getReg());
551 if (HasMemOp) {
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000552 assert((NumOperands >= 8) && "Expected at least 8 operands!");
553 Src1Name = getRegName(MI->getOperand(NumOperands - 7).getReg());
Igor Bregerd7bae452015-10-15 13:29:07 +0000554 } else {
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000555 assert((NumOperands >= 4) && "Expected at least 4 operands!");
556 Src2Name = getRegName(MI->getOperand(NumOperands - 2).getReg());
557 Src1Name = getRegName(MI->getOperand(NumOperands - 3).getReg());
Igor Bregerd7bae452015-10-15 13:29:07 +0000558 }
559 break;
560 }
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000561
Simon Pilgrim8483df62015-11-17 22:35:45 +0000562 CASE_UNPCK(UNPCKLPD, r)
Craig Topper89c17612016-06-10 04:48:05 +0000563 Src2Name = getRegName(MI->getOperand(NumOperands - 1).getReg());
564 RegForm = true;
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000565 // FALL THROUGH.
Simon Pilgrim8483df62015-11-17 22:35:45 +0000566 CASE_UNPCK(UNPCKLPD, m)
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000567 DecodeUNPCKLMask(getRegOperandVectorVT(MI, MVT::f64, 0), ShuffleMask);
Craig Topper89c17612016-06-10 04:48:05 +0000568 Src1Name = getRegName(MI->getOperand(NumOperands-(RegForm?2:6)).getReg());
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000569 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(UNPCKLPS, r)
Craig Topper89c17612016-06-10 04:48:05 +0000573 Src2Name = getRegName(MI->getOperand(NumOperands - 1).getReg());
574 RegForm = true;
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000575 // FALL THROUGH.
Simon Pilgrim8483df62015-11-17 22:35:45 +0000576 CASE_UNPCK(UNPCKLPS, m)
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000577 DecodeUNPCKLMask(getRegOperandVectorVT(MI, MVT::f32, 0), ShuffleMask);
Craig Topper89c17612016-06-10 04:48:05 +0000578 Src1Name = getRegName(MI->getOperand(NumOperands-(RegForm?2:6)).getReg());
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000579 DestName = getRegName(MI->getOperand(0).getReg());
580 break;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000581
Simon Pilgrim8483df62015-11-17 22:35:45 +0000582 CASE_UNPCK(UNPCKHPD, r)
Craig Topper89c17612016-06-10 04:48:05 +0000583 Src2Name = getRegName(MI->getOperand(NumOperands - 1).getReg());
584 RegForm = true;
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000585 // FALL THROUGH.
Simon Pilgrim8483df62015-11-17 22:35:45 +0000586 CASE_UNPCK(UNPCKHPD, m)
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000587 DecodeUNPCKHMask(getRegOperandVectorVT(MI, MVT::f64, 0), ShuffleMask);
Craig Topper89c17612016-06-10 04:48:05 +0000588 Src1Name = getRegName(MI->getOperand(NumOperands-(RegForm?2:6)).getReg());
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000589 DestName = getRegName(MI->getOperand(0).getReg());
590 break;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000591
Simon Pilgrim8483df62015-11-17 22:35:45 +0000592 CASE_UNPCK(UNPCKHPS, r)
Craig Topper89c17612016-06-10 04:48:05 +0000593 Src2Name = getRegName(MI->getOperand(NumOperands - 1).getReg());
594 RegForm = true;
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000595 // FALL THROUGH.
Simon Pilgrim8483df62015-11-17 22:35:45 +0000596 CASE_UNPCK(UNPCKHPS, m)
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000597 DecodeUNPCKHMask(getRegOperandVectorVT(MI, MVT::f32, 0), ShuffleMask);
Craig Topper89c17612016-06-10 04:48:05 +0000598 Src1Name = getRegName(MI->getOperand(NumOperands-(RegForm?2:6)).getReg());
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000599 DestName = getRegName(MI->getOperand(0).getReg());
600 break;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000601
Simon Pilgrim2da41782015-11-17 23:29:49 +0000602 CASE_VPERM(PERMILPS, r)
Simon Pilgrim6ce35dd2016-05-11 18:53:44 +0000603 Src1Name = getRegName(MI->getOperand(NumOperands - 2).getReg());
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000604 // FALL THROUGH.
Simon Pilgrim2da41782015-11-17 23:29:49 +0000605 CASE_VPERM(PERMILPS, m)
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000606 if (MI->getOperand(NumOperands - 1).isImm())
Simon Pilgrim5883a732015-11-16 22:39:27 +0000607 DecodePSHUFMask(getRegOperandVectorVT(MI, MVT::f32, 0),
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000608 MI->getOperand(NumOperands - 1).getImm(),
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000609 ShuffleMask);
610 DestName = getRegName(MI->getOperand(0).getReg());
611 break;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000612
Simon Pilgrim2da41782015-11-17 23:29:49 +0000613 CASE_VPERM(PERMILPD, r)
Simon Pilgrim6ce35dd2016-05-11 18:53:44 +0000614 Src1Name = getRegName(MI->getOperand(NumOperands - 2).getReg());
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000615 // FALL THROUGH.
Simon Pilgrim2da41782015-11-17 23:29:49 +0000616 CASE_VPERM(PERMILPD, m)
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000617 if (MI->getOperand(NumOperands - 1).isImm())
Simon Pilgrim5883a732015-11-16 22:39:27 +0000618 DecodePSHUFMask(getRegOperandVectorVT(MI, MVT::f64, 0),
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000619 MI->getOperand(NumOperands - 1).getImm(),
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000620 ShuffleMask);
621 DestName = getRegName(MI->getOperand(0).getReg());
622 break;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000623
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000624 case X86::VPERM2F128rr:
625 case X86::VPERM2I128rr:
626 Src2Name = getRegName(MI->getOperand(2).getReg());
627 // FALL THROUGH.
628 case X86::VPERM2F128rm:
629 case X86::VPERM2I128rm:
630 // For instruction comments purpose, assume the 256-bit vector is v4i64.
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000631 if (MI->getOperand(NumOperands - 1).isImm())
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000632 DecodeVPERM2X128Mask(MVT::v4i64,
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000633 MI->getOperand(NumOperands - 1).getImm(),
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000634 ShuffleMask);
635 Src1Name = getRegName(MI->getOperand(1).getReg());
636 DestName = getRegName(MI->getOperand(0).getReg());
637 break;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000638
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000639 case X86::VPERMQYri:
Craig Topper22ae3532016-05-21 06:07:18 +0000640 case X86::VPERMQZ256ri:
Craig Topper200d2372016-06-10 05:12:40 +0000641 case X86::VPERMQZ256rik:
642 case X86::VPERMQZ256rikz:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000643 case X86::VPERMPDYri:
Craig Topper22ae3532016-05-21 06:07:18 +0000644 case X86::VPERMPDZ256ri:
Craig Topper200d2372016-06-10 05:12:40 +0000645 case X86::VPERMPDZ256rik:
646 case X86::VPERMPDZ256rikz:
647 Src1Name = getRegName(MI->getOperand(NumOperands - 2).getReg());
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000648 // FALL THROUGH.
649 case X86::VPERMQYmi:
Craig Topper22ae3532016-05-21 06:07:18 +0000650 case X86::VPERMQZ256mi:
Craig Topper200d2372016-06-10 05:12:40 +0000651 case X86::VPERMQZ256mik:
652 case X86::VPERMQZ256mikz:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000653 case X86::VPERMPDYmi:
Craig Topper22ae3532016-05-21 06:07:18 +0000654 case X86::VPERMPDZ256mi:
Craig Topper200d2372016-06-10 05:12:40 +0000655 case X86::VPERMPDZ256mik:
656 case X86::VPERMPDZ256mikz:
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000657 if (MI->getOperand(NumOperands - 1).isImm())
658 DecodeVPERMMask(MI->getOperand(NumOperands - 1).getImm(),
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000659 ShuffleMask);
660 DestName = getRegName(MI->getOperand(0).getReg());
661 break;
662
663 case X86::MOVSDrr:
664 case X86::VMOVSDrr:
Simon Pilgrimf5c23ad2016-02-01 22:26:28 +0000665 case X86::VMOVSDZrr:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000666 Src2Name = getRegName(MI->getOperand(2).getReg());
667 Src1Name = getRegName(MI->getOperand(1).getReg());
668 // FALL THROUGH.
669 case X86::MOVSDrm:
670 case X86::VMOVSDrm:
Simon Pilgrimf5c23ad2016-02-01 22:26:28 +0000671 case X86::VMOVSDZrm:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000672 DecodeScalarMoveMask(MVT::v2f64, nullptr == Src2Name, ShuffleMask);
673 DestName = getRegName(MI->getOperand(0).getReg());
674 break;
Simon Pilgrimd5a15442015-11-21 13:04:42 +0000675
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000676 case X86::MOVSSrr:
677 case X86::VMOVSSrr:
Simon Pilgrimf5c23ad2016-02-01 22:26:28 +0000678 case X86::VMOVSSZrr:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000679 Src2Name = getRegName(MI->getOperand(2).getReg());
680 Src1Name = getRegName(MI->getOperand(1).getReg());
681 // FALL THROUGH.
682 case X86::MOVSSrm:
683 case X86::VMOVSSrm:
Simon Pilgrimf5c23ad2016-02-01 22:26:28 +0000684 case X86::VMOVSSZrm:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000685 DecodeScalarMoveMask(MVT::v4f32, nullptr == Src2Name, ShuffleMask);
686 DestName = getRegName(MI->getOperand(0).getReg());
687 break;
688
689 case X86::MOVPQI2QIrr:
Simon Pilgrim3e0c0222015-12-13 12:49:48 +0000690 case X86::MOVZPQILo2PQIrr:
691 case X86::VMOVPQI2QIrr:
692 case X86::VMOVZPQILo2PQIrr:
693 case X86::VMOVZPQILo2PQIZrr:
694 Src1Name = getRegName(MI->getOperand(1).getReg());
695 // FALL THROUGH.
696 case X86::MOVQI2PQIrm:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000697 case X86::MOVZQI2PQIrm:
698 case X86::MOVZPQILo2PQIrm:
Simon Pilgrim3e0c0222015-12-13 12:49:48 +0000699 case X86::VMOVQI2PQIrm:
Simon Pilgrim96fe4ef2016-02-02 13:32:56 +0000700 case X86::VMOVQI2PQIZrm:
Simon Pilgrim3e0c0222015-12-13 12:49:48 +0000701 case X86::VMOVZQI2PQIrm:
702 case X86::VMOVZPQILo2PQIrm:
703 case X86::VMOVZPQILo2PQIZrm:
704 DecodeZeroMoveLowMask(MVT::v2i64, ShuffleMask);
705 DestName = getRegName(MI->getOperand(0).getReg());
706 break;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000707
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000708 case X86::MOVDI2PDIrm:
709 case X86::VMOVDI2PDIrm:
Simon Pilgrim5be17b62016-02-01 23:04:05 +0000710 case X86::VMOVDI2PDIZrm:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000711 DecodeZeroMoveLowMask(MVT::v4i32, ShuffleMask);
712 DestName = getRegName(MI->getOperand(0).getReg());
713 break;
714
Simon Pilgrimd85cae32015-07-06 20:46:41 +0000715 case X86::EXTRQI:
716 if (MI->getOperand(2).isImm() &&
717 MI->getOperand(3).isImm())
718 DecodeEXTRQIMask(MI->getOperand(2).getImm(),
719 MI->getOperand(3).getImm(),
720 ShuffleMask);
721
722 DestName = getRegName(MI->getOperand(0).getReg());
723 Src1Name = getRegName(MI->getOperand(1).getReg());
724 break;
725
726 case X86::INSERTQI:
727 if (MI->getOperand(3).isImm() &&
728 MI->getOperand(4).isImm())
729 DecodeINSERTQIMask(MI->getOperand(3).getImm(),
730 MI->getOperand(4).getImm(),
731 ShuffleMask);
732
733 DestName = getRegName(MI->getOperand(0).getReg());
734 Src1Name = getRegName(MI->getOperand(1).getReg());
735 Src2Name = getRegName(MI->getOperand(2).getReg());
736 break;
737
Simon Pilgrim0acc32a2016-02-06 19:51:21 +0000738 CASE_PMOVZX(PMOVZXBW, r)
739 CASE_PMOVZX(PMOVZXBD, r)
740 CASE_PMOVZX(PMOVZXBQ, r)
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000741 Src1Name = getRegName(MI->getOperand(NumOperands - 1).getReg());
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000742 // FALL THROUGH.
Simon Pilgrim0acc32a2016-02-06 19:51:21 +0000743 CASE_PMOVZX(PMOVZXBW, m)
744 CASE_PMOVZX(PMOVZXBD, m)
745 CASE_PMOVZX(PMOVZXBQ, m)
Simon Pilgrime1b6db92016-02-06 16:33:42 +0000746 DecodeZeroExtendMask(MVT::i8, getZeroExtensionResultType(MI), ShuffleMask);
747 DestName = getRegName(MI->getOperand(0).getReg());
748 break;
749
Simon Pilgrim0acc32a2016-02-06 19:51:21 +0000750 CASE_PMOVZX(PMOVZXWD, r)
751 CASE_PMOVZX(PMOVZXWQ, r)
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000752 Src1Name = getRegName(MI->getOperand(NumOperands - 1).getReg());
Simon Pilgrime1b6db92016-02-06 16:33:42 +0000753 // FALL THROUGH.
Simon Pilgrim0acc32a2016-02-06 19:51:21 +0000754 CASE_PMOVZX(PMOVZXWD, m)
755 CASE_PMOVZX(PMOVZXWQ, m)
Simon Pilgrime1b6db92016-02-06 16:33:42 +0000756 DecodeZeroExtendMask(MVT::i16, getZeroExtensionResultType(MI), ShuffleMask);
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000757 DestName = getRegName(MI->getOperand(0).getReg());
Simon Pilgrime1b6db92016-02-06 16:33:42 +0000758 break;
759
Simon Pilgrim0acc32a2016-02-06 19:51:21 +0000760 CASE_PMOVZX(PMOVZXDQ, r)
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000761 Src1Name = getRegName(MI->getOperand(NumOperands - 1).getReg());
Simon Pilgrime1b6db92016-02-06 16:33:42 +0000762 // FALL THROUGH.
Simon Pilgrim0acc32a2016-02-06 19:51:21 +0000763 CASE_PMOVZX(PMOVZXDQ, m)
Simon Pilgrime1b6db92016-02-06 16:33:42 +0000764 DecodeZeroExtendMask(MVT::i32, getZeroExtensionResultType(MI), ShuffleMask);
765 DestName = getRegName(MI->getOperand(0).getReg());
766 break;
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000767 }
768
769 // The only comments we decode are shuffles, so give up if we were unable to
770 // decode a shuffle mask.
771 if (ShuffleMask.empty())
772 return false;
773
Simon Pilgrimaf742d52016-05-09 13:30:16 +0000774 // TODO: Add support for specifying an AVX512 style mask register in the comment.
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000775 if (!DestName) DestName = Src1Name;
776 OS << (DestName ? DestName : "mem") << " = ";
777
778 // If the two sources are the same, canonicalize the input elements to be
779 // from the first src so that we get larger element spans.
780 if (Src1Name == Src2Name) {
781 for (unsigned i = 0, e = ShuffleMask.size(); i != e; ++i) {
782 if ((int)ShuffleMask[i] >= 0 && // Not sentinel.
NAKAMURA Takumi5582a6a2015-05-25 01:43:34 +0000783 ShuffleMask[i] >= (int)e) // From second mask.
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000784 ShuffleMask[i] -= e;
785 }
786 }
787
788 // The shuffle mask specifies which elements of the src1/src2 fill in the
789 // destination, with a few sentinel values. Loop through and print them
790 // out.
791 for (unsigned i = 0, e = ShuffleMask.size(); i != e; ++i) {
792 if (i != 0)
793 OS << ',';
794 if (ShuffleMask[i] == SM_SentinelZero) {
795 OS << "zero";
796 continue;
797 }
798
799 // Otherwise, it must come from src1 or src2. Print the span of elements
800 // that comes from this src.
801 bool isSrc1 = ShuffleMask[i] < (int)ShuffleMask.size();
802 const char *SrcName = isSrc1 ? Src1Name : Src2Name;
803 OS << (SrcName ? SrcName : "mem") << '[';
804 bool IsFirst = true;
805 while (i != e && (int)ShuffleMask[i] != SM_SentinelZero &&
806 (ShuffleMask[i] < (int)ShuffleMask.size()) == isSrc1) {
807 if (!IsFirst)
808 OS << ',';
809 else
810 IsFirst = false;
811 if (ShuffleMask[i] == SM_SentinelUndef)
812 OS << "u";
813 else
814 OS << ShuffleMask[i] % ShuffleMask.size();
815 ++i;
816 }
817 OS << ']';
NAKAMURA Takumi5582a6a2015-05-25 01:43:34 +0000818 --i; // For loop increments element #.
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000819 }
820 //MI->print(OS, 0);
821 OS << "\n";
822
823 // We successfully added a comment to this instruction.
824 return true;
825}