blob: 393ae3c0e1dc9f7b90363f9a3df542bca2c0a680 [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 Pilgrim7c2fbdc2016-07-03 13:08:29 +000049#define CASE_MASK_MOVDUP(Inst, src) \
50 CASE_MASK_INS_COMMON(Inst, Z, r##src) \
51 CASE_MASK_INS_COMMON(Inst, Z256, r##src) \
52 CASE_MASK_INS_COMMON(Inst, Z128, r##src)
53
54#define CASE_MASKZ_MOVDUP(Inst, src) \
55 CASE_MASKZ_INS_COMMON(Inst, Z, r##src) \
56 CASE_MASKZ_INS_COMMON(Inst, Z256, r##src) \
57 CASE_MASKZ_INS_COMMON(Inst, Z128, r##src)
58
Simon Pilgrim41c05c02016-05-11 11:55:12 +000059#define CASE_PMOVZX(Inst, src) \
60 CASE_AVX512_INS_COMMON(Inst, Z, r##src) \
61 CASE_AVX512_INS_COMMON(Inst, Z256, r##src) \
62 CASE_AVX512_INS_COMMON(Inst, Z128, r##src) \
63 CASE_AVX_INS_COMMON(Inst, , r##src) \
64 CASE_AVX_INS_COMMON(Inst, Y, r##src) \
Simon Pilgrim0acc32a2016-02-06 19:51:21 +000065 CASE_SSE_INS_COMMON(Inst, r##src)
66
Simon Pilgrim68f438a2016-07-03 13:33:28 +000067#define CASE_MASK_PMOVZX(Inst, src) \
68 CASE_MASK_INS_COMMON(Inst, Z, r##src) \
69 CASE_MASK_INS_COMMON(Inst, Z256, r##src) \
70 CASE_MASK_INS_COMMON(Inst, Z128, r##src)
71
72#define CASE_MASKZ_PMOVZX(Inst, src) \
73 CASE_MASKZ_INS_COMMON(Inst, Z, r##src) \
74 CASE_MASKZ_INS_COMMON(Inst, Z256, r##src) \
75 CASE_MASKZ_INS_COMMON(Inst, Z128, r##src)
76
Simon Pilgrim41c05c02016-05-11 11:55:12 +000077#define CASE_UNPCK(Inst, src) \
78 CASE_AVX512_INS_COMMON(Inst, Z, r##src) \
79 CASE_AVX512_INS_COMMON(Inst, Z256, r##src) \
80 CASE_AVX512_INS_COMMON(Inst, Z128, r##src) \
81 CASE_AVX_INS_COMMON(Inst, , r##src) \
82 CASE_AVX_INS_COMMON(Inst, Y, r##src) \
Simon Pilgrimbfa5f232016-02-06 17:02:15 +000083 CASE_SSE_INS_COMMON(Inst, r##src)
84
Craig Topper01f53b12016-06-03 05:31:00 +000085#define CASE_SHUF(Inst, suf) \
86 CASE_AVX512_INS_COMMON(Inst, Z, suf) \
87 CASE_AVX512_INS_COMMON(Inst, Z256, suf) \
88 CASE_AVX512_INS_COMMON(Inst, Z128, suf) \
89 CASE_AVX_INS_COMMON(Inst, , suf) \
90 CASE_AVX_INS_COMMON(Inst, Y, suf) \
91 CASE_SSE_INS_COMMON(Inst, suf)
Simon Pilgrimbfa5f232016-02-06 17:02:15 +000092
Simon Pilgrim41c05c02016-05-11 11:55:12 +000093#define CASE_VPERM(Inst, src) \
94 CASE_AVX512_INS_COMMON(Inst, Z, src##i) \
95 CASE_AVX512_INS_COMMON(Inst, Z256, src##i) \
96 CASE_AVX512_INS_COMMON(Inst, Z128, src##i) \
97 CASE_AVX_INS_COMMON(Inst, , src##i) \
Simon Pilgrimbfa5f232016-02-06 17:02:15 +000098 CASE_AVX_INS_COMMON(Inst, Y, src##i)
99
100#define CASE_VSHUF(Inst, src) \
Simon Pilgrim41c05c02016-05-11 11:55:12 +0000101 CASE_AVX512_INS_COMMON(SHUFF##Inst, Z, r##src##i) \
102 CASE_AVX512_INS_COMMON(SHUFI##Inst, Z, r##src##i) \
103 CASE_AVX512_INS_COMMON(SHUFF##Inst, Z256, r##src##i) \
104 CASE_AVX512_INS_COMMON(SHUFI##Inst, Z256, r##src##i)
Simon Pilgrimbfa5f232016-02-06 17:02:15 +0000105
Igor Breger24cab0f2015-11-16 07:22:00 +0000106static unsigned getVectorRegSize(unsigned RegNo) {
Igor Breger24cab0f2015-11-16 07:22:00 +0000107 if (X86::ZMM0 <= RegNo && RegNo <= X86::ZMM31)
108 return 512;
109 if (X86::YMM0 <= RegNo && RegNo <= X86::YMM31)
110 return 256;
111 if (X86::XMM0 <= RegNo && RegNo <= X86::XMM31)
112 return 128;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000113 if (X86::MM0 <= RegNo && RegNo <= X86::MM7)
114 return 64;
Igor Breger24cab0f2015-11-16 07:22:00 +0000115
116 llvm_unreachable("Unknown vector reg!");
Igor Breger24cab0f2015-11-16 07:22:00 +0000117}
118
119static MVT getRegOperandVectorVT(const MCInst *MI, const MVT &ScalarVT,
120 unsigned OperandIndex) {
121 unsigned OpReg = MI->getOperand(OperandIndex).getReg();
122 return MVT::getVectorVT(ScalarVT,
123 getVectorRegSize(OpReg)/ScalarVT.getSizeInBits());
124}
125
Simon Pilgrime1b6db92016-02-06 16:33:42 +0000126/// \brief Extracts the dst type for a given zero extension instruction.
127static MVT getZeroExtensionResultType(const MCInst *MI) {
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000128 switch (MI->getOpcode()) {
129 default:
130 llvm_unreachable("Unknown zero extension instruction");
Simon Pilgrime1b6db92016-02-06 16:33:42 +0000131 // zero extension to i16
Simon Pilgrim0acc32a2016-02-06 19:51:21 +0000132 CASE_PMOVZX(PMOVZXBW, m)
133 CASE_PMOVZX(PMOVZXBW, r)
Simon Pilgrime1b6db92016-02-06 16:33:42 +0000134 return getRegOperandVectorVT(MI, MVT::i16, 0);
135 // zero extension to i32
Simon Pilgrim0acc32a2016-02-06 19:51:21 +0000136 CASE_PMOVZX(PMOVZXBD, m)
137 CASE_PMOVZX(PMOVZXBD, r)
138 CASE_PMOVZX(PMOVZXWD, m)
139 CASE_PMOVZX(PMOVZXWD, r)
Simon Pilgrime1b6db92016-02-06 16:33:42 +0000140 return getRegOperandVectorVT(MI, MVT::i32, 0);
141 // zero extension to i64
Simon Pilgrim0acc32a2016-02-06 19:51:21 +0000142 CASE_PMOVZX(PMOVZXBQ, m)
143 CASE_PMOVZX(PMOVZXBQ, r)
144 CASE_PMOVZX(PMOVZXWQ, m)
145 CASE_PMOVZX(PMOVZXWQ, r)
146 CASE_PMOVZX(PMOVZXDQ, m)
147 CASE_PMOVZX(PMOVZXDQ, r)
Simon Pilgrime1b6db92016-02-06 16:33:42 +0000148 return getRegOperandVectorVT(MI, MVT::i64, 0);
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000149 }
150}
151
Simon Pilgrim7c2fbdc2016-07-03 13:08:29 +0000152/// Wraps the destination register name with AVX512 mask/maskz filtering.
153static std::string getMaskName(const MCInst *MI, const char *DestName,
154 const char *(*getRegName)(unsigned)) {
155 std::string OpMaskName(DestName);
156
157 bool MaskWithZero = false;
158 const char *MaskRegName = nullptr;
159
160 switch (MI->getOpcode()) {
161 default:
162 return OpMaskName;
163 CASE_MASKZ_MOVDUP(MOVDDUP, m)
164 CASE_MASKZ_MOVDUP(MOVDDUP, r)
165 CASE_MASKZ_MOVDUP(MOVSHDUP, m)
166 CASE_MASKZ_MOVDUP(MOVSHDUP, r)
167 CASE_MASKZ_MOVDUP(MOVSLDUP, m)
168 CASE_MASKZ_MOVDUP(MOVSLDUP, r)
Simon Pilgrim68f438a2016-07-03 13:33:28 +0000169 CASE_MASKZ_PMOVZX(PMOVZXBD, m)
170 CASE_MASKZ_PMOVZX(PMOVZXBD, r)
171 CASE_MASKZ_PMOVZX(PMOVZXBQ, m)
172 CASE_MASKZ_PMOVZX(PMOVZXBQ, r)
173 CASE_MASKZ_PMOVZX(PMOVZXBW, m)
174 CASE_MASKZ_PMOVZX(PMOVZXBW, r)
175 CASE_MASKZ_PMOVZX(PMOVZXDQ, m)
176 CASE_MASKZ_PMOVZX(PMOVZXDQ, r)
177 CASE_MASKZ_PMOVZX(PMOVZXWD, m)
178 CASE_MASKZ_PMOVZX(PMOVZXWD, r)
179 CASE_MASKZ_PMOVZX(PMOVZXWQ, m)
180 CASE_MASKZ_PMOVZX(PMOVZXWQ, r)
Simon Pilgrim7c2fbdc2016-07-03 13:08:29 +0000181 MaskWithZero = true;
182 MaskRegName = getRegName(MI->getOperand(1).getReg());
183 break;
184 CASE_MASK_MOVDUP(MOVDDUP, m)
185 CASE_MASK_MOVDUP(MOVDDUP, r)
186 CASE_MASK_MOVDUP(MOVSHDUP, m)
187 CASE_MASK_MOVDUP(MOVSHDUP, r)
188 CASE_MASK_MOVDUP(MOVSLDUP, m)
189 CASE_MASK_MOVDUP(MOVSLDUP, r)
Simon Pilgrim68f438a2016-07-03 13:33:28 +0000190 CASE_MASK_PMOVZX(PMOVZXBD, m)
191 CASE_MASK_PMOVZX(PMOVZXBD, r)
192 CASE_MASK_PMOVZX(PMOVZXBQ, m)
193 CASE_MASK_PMOVZX(PMOVZXBQ, r)
194 CASE_MASK_PMOVZX(PMOVZXBW, m)
195 CASE_MASK_PMOVZX(PMOVZXBW, r)
196 CASE_MASK_PMOVZX(PMOVZXDQ, m)
197 CASE_MASK_PMOVZX(PMOVZXDQ, r)
198 CASE_MASK_PMOVZX(PMOVZXWD, m)
199 CASE_MASK_PMOVZX(PMOVZXWD, r)
200 CASE_MASK_PMOVZX(PMOVZXWQ, m)
201 CASE_MASK_PMOVZX(PMOVZXWQ, r)
Simon Pilgrim7c2fbdc2016-07-03 13:08:29 +0000202 MaskRegName = getRegName(MI->getOperand(2).getReg());
203 break;
204 }
205
206 // MASK: zmmX {%kY}
207 OpMaskName += " {%";
208 OpMaskName += MaskRegName;
209 OpMaskName += "}";
210
211 // MASKZ: zmmX {%kY} {z}
212 if (MaskWithZero)
213 OpMaskName += " {z}";
214
215 return OpMaskName;
216}
217
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000218//===----------------------------------------------------------------------===//
219// Top Level Entrypoint
220//===----------------------------------------------------------------------===//
221
222/// EmitAnyX86InstComments - This function decodes x86 instructions and prints
223/// newline terminated strings to the specified string if desired. This
224/// information is shown in disassembly dumps when verbose assembly is enabled.
225bool llvm::EmitAnyX86InstComments(const MCInst *MI, raw_ostream &OS,
226 const char *(*getRegName)(unsigned)) {
227 // If this is a shuffle operation, the switch should fill in this state.
228 SmallVector<int, 8> ShuffleMask;
229 const char *DestName = nullptr, *Src1Name = nullptr, *Src2Name = nullptr;
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000230 unsigned NumOperands = MI->getNumOperands();
Craig Topper89c17612016-06-10 04:48:05 +0000231 bool RegForm = false;
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000232
233 switch (MI->getOpcode()) {
234 default:
235 // Not an instruction for which we can decode comments.
236 return false;
237
238 case X86::BLENDPDrri:
239 case X86::VBLENDPDrri:
Simon Pilgrim13d3a202015-11-16 23:03:18 +0000240 case X86::VBLENDPDYrri:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000241 Src2Name = getRegName(MI->getOperand(2).getReg());
242 // FALL THROUGH.
243 case X86::BLENDPDrmi:
244 case X86::VBLENDPDrmi:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000245 case X86::VBLENDPDYrmi:
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000246 if (MI->getOperand(NumOperands - 1).isImm())
Simon Pilgrim13d3a202015-11-16 23:03:18 +0000247 DecodeBLENDMask(getRegOperandVectorVT(MI, MVT::f64, 0),
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000248 MI->getOperand(NumOperands - 1).getImm(),
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000249 ShuffleMask);
250 Src1Name = getRegName(MI->getOperand(1).getReg());
251 DestName = getRegName(MI->getOperand(0).getReg());
252 break;
253
254 case X86::BLENDPSrri:
255 case X86::VBLENDPSrri:
Simon Pilgrim13d3a202015-11-16 23:03:18 +0000256 case X86::VBLENDPSYrri:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000257 Src2Name = getRegName(MI->getOperand(2).getReg());
258 // FALL THROUGH.
259 case X86::BLENDPSrmi:
260 case X86::VBLENDPSrmi:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000261 case X86::VBLENDPSYrmi:
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000262 if (MI->getOperand(NumOperands - 1).isImm())
Simon Pilgrim13d3a202015-11-16 23:03:18 +0000263 DecodeBLENDMask(getRegOperandVectorVT(MI, MVT::f32, 0),
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000264 MI->getOperand(NumOperands - 1).getImm(),
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000265 ShuffleMask);
266 Src1Name = getRegName(MI->getOperand(1).getReg());
267 DestName = getRegName(MI->getOperand(0).getReg());
268 break;
269
270 case X86::PBLENDWrri:
271 case X86::VPBLENDWrri:
Simon Pilgrim13d3a202015-11-16 23:03:18 +0000272 case X86::VPBLENDWYrri:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000273 Src2Name = getRegName(MI->getOperand(2).getReg());
274 // FALL THROUGH.
275 case X86::PBLENDWrmi:
276 case X86::VPBLENDWrmi:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000277 case X86::VPBLENDWYrmi:
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000278 if (MI->getOperand(NumOperands - 1).isImm())
Simon Pilgrim13d3a202015-11-16 23:03:18 +0000279 DecodeBLENDMask(getRegOperandVectorVT(MI, MVT::i16, 0),
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000280 MI->getOperand(NumOperands - 1).getImm(),
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000281 ShuffleMask);
282 Src1Name = getRegName(MI->getOperand(1).getReg());
283 DestName = getRegName(MI->getOperand(0).getReg());
284 break;
285
286 case X86::VPBLENDDrri:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000287 case X86::VPBLENDDYrri:
288 Src2Name = getRegName(MI->getOperand(2).getReg());
289 // FALL THROUGH.
Simon Pilgrim13d3a202015-11-16 23:03:18 +0000290 case X86::VPBLENDDrmi:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000291 case X86::VPBLENDDYrmi:
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000292 if (MI->getOperand(NumOperands - 1).isImm())
Simon Pilgrim13d3a202015-11-16 23:03:18 +0000293 DecodeBLENDMask(getRegOperandVectorVT(MI, MVT::i32, 0),
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000294 MI->getOperand(NumOperands - 1).getImm(),
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000295 ShuffleMask);
296 Src1Name = getRegName(MI->getOperand(1).getReg());
297 DestName = getRegName(MI->getOperand(0).getReg());
298 break;
299
300 case X86::INSERTPSrr:
301 case X86::VINSERTPSrr:
Simon Pilgrim025a3d852016-02-01 22:05:50 +0000302 case X86::VINSERTPSzrr:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000303 Src2Name = getRegName(MI->getOperand(2).getReg());
304 // FALL THROUGH.
305 case X86::INSERTPSrm:
306 case X86::VINSERTPSrm:
Simon Pilgrim025a3d852016-02-01 22:05:50 +0000307 case X86::VINSERTPSzrm:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000308 DestName = getRegName(MI->getOperand(0).getReg());
309 Src1Name = getRegName(MI->getOperand(1).getReg());
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000310 if (MI->getOperand(NumOperands - 1).isImm())
311 DecodeINSERTPSMask(MI->getOperand(NumOperands - 1).getImm(),
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000312 ShuffleMask);
313 break;
314
315 case X86::MOVLHPSrr:
316 case X86::VMOVLHPSrr:
Simon Pilgrimd5a15442015-11-21 13:04:42 +0000317 case X86::VMOVLHPSZrr:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000318 Src2Name = getRegName(MI->getOperand(2).getReg());
319 Src1Name = getRegName(MI->getOperand(1).getReg());
320 DestName = getRegName(MI->getOperand(0).getReg());
321 DecodeMOVLHPSMask(2, ShuffleMask);
322 break;
323
324 case X86::MOVHLPSrr:
325 case X86::VMOVHLPSrr:
Simon Pilgrimd5a15442015-11-21 13:04:42 +0000326 case X86::VMOVHLPSZrr:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000327 Src2Name = getRegName(MI->getOperand(2).getReg());
328 Src1Name = getRegName(MI->getOperand(1).getReg());
329 DestName = getRegName(MI->getOperand(0).getReg());
330 DecodeMOVHLPSMask(2, ShuffleMask);
331 break;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000332
Simon Pilgrima3d67442016-02-07 15:39:22 +0000333 case X86::MOVHPDrm:
334 case X86::VMOVHPDrm:
335 case X86::VMOVHPDZ128rm:
336 Src1Name = getRegName(MI->getOperand(1).getReg());
337 DestName = getRegName(MI->getOperand(0).getReg());
338 DecodeInsertElementMask(MVT::v2f64, 1, 1, ShuffleMask);
339 break;
340
341 case X86::MOVHPSrm:
342 case X86::VMOVHPSrm:
343 case X86::VMOVHPSZ128rm:
344 Src1Name = getRegName(MI->getOperand(1).getReg());
345 DestName = getRegName(MI->getOperand(0).getReg());
346 DecodeInsertElementMask(MVT::v4f32, 2, 2, ShuffleMask);
347 break;
348
349 case X86::MOVLPDrm:
350 case X86::VMOVLPDrm:
351 case X86::VMOVLPDZ128rm:
352 Src1Name = getRegName(MI->getOperand(1).getReg());
353 DestName = getRegName(MI->getOperand(0).getReg());
354 DecodeInsertElementMask(MVT::v2f64, 0, 1, ShuffleMask);
355 break;
356
357 case X86::MOVLPSrm:
358 case X86::VMOVLPSrm:
359 case X86::VMOVLPSZ128rm:
360 Src1Name = getRegName(MI->getOperand(1).getReg());
361 DestName = getRegName(MI->getOperand(0).getReg());
362 DecodeInsertElementMask(MVT::v4f32, 0, 2, ShuffleMask);
363 break;
364
Igor Breger24cab0f2015-11-16 07:22:00 +0000365 CASE_MOVDUP(MOVSLDUP, r)
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000366 Src1Name = getRegName(MI->getOperand(NumOperands - 1).getReg());
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000367 // FALL THROUGH.
Igor Breger1f782962015-11-19 08:26:56 +0000368 CASE_MOVDUP(MOVSLDUP, m)
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000369 DestName = getRegName(MI->getOperand(0).getReg());
Igor Breger1f782962015-11-19 08:26:56 +0000370 DecodeMOVSLDUPMask(getRegOperandVectorVT(MI, MVT::f32, 0), ShuffleMask);
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000371 break;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000372
Igor Breger24cab0f2015-11-16 07:22:00 +0000373 CASE_MOVDUP(MOVSHDUP, r)
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000374 Src1Name = getRegName(MI->getOperand(NumOperands - 1).getReg());
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000375 // FALL THROUGH.
Igor Breger1f782962015-11-19 08:26:56 +0000376 CASE_MOVDUP(MOVSHDUP, m)
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000377 DestName = getRegName(MI->getOperand(0).getReg());
Igor Breger1f782962015-11-19 08:26:56 +0000378 DecodeMOVSHDUPMask(getRegOperandVectorVT(MI, MVT::f32, 0), ShuffleMask);
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000379 break;
380
Igor Breger1f782962015-11-19 08:26:56 +0000381 CASE_MOVDUP(MOVDDUP, r)
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000382 Src1Name = getRegName(MI->getOperand(NumOperands - 1).getReg());
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000383 // FALL THROUGH.
Igor Breger1f782962015-11-19 08:26:56 +0000384 CASE_MOVDUP(MOVDDUP, m)
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000385 DestName = getRegName(MI->getOperand(0).getReg());
Igor Breger1f782962015-11-19 08:26:56 +0000386 DecodeMOVDDUPMask(getRegOperandVectorVT(MI, MVT::f64, 0), ShuffleMask);
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000387 break;
388
389 case X86::PSLLDQri:
390 case X86::VPSLLDQri:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000391 case X86::VPSLLDQYri:
Simon Pilgrim643734c2016-06-09 22:03:15 +0000392 case X86::VPSLLDQZ128rr:
393 case X86::VPSLLDQZ256rr:
394 case X86::VPSLLDQZ512rr:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000395 Src1Name = getRegName(MI->getOperand(1).getReg());
Simon Pilgrim643734c2016-06-09 22:03:15 +0000396 case X86::VPSLLDQZ128rm:
397 case X86::VPSLLDQZ256rm:
398 case X86::VPSLLDQZ512rm:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000399 DestName = getRegName(MI->getOperand(0).getReg());
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000400 if (MI->getOperand(NumOperands - 1).isImm())
Simon Pilgrimb9ada272015-11-16 22:54:41 +0000401 DecodePSLLDQMask(getRegOperandVectorVT(MI, MVT::i8, 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
406 case X86::PSRLDQri:
407 case X86::VPSRLDQri:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000408 case X86::VPSRLDQYri:
Simon Pilgrim643734c2016-06-09 22:03:15 +0000409 case X86::VPSRLDQZ128rr:
410 case X86::VPSRLDQZ256rr:
411 case X86::VPSRLDQZ512rr:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000412 Src1Name = getRegName(MI->getOperand(1).getReg());
Simon Pilgrim643734c2016-06-09 22:03:15 +0000413 case X86::VPSRLDQZ128rm:
414 case X86::VPSRLDQZ256rm:
415 case X86::VPSRLDQZ512rm:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000416 DestName = getRegName(MI->getOperand(0).getReg());
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000417 if (MI->getOperand(NumOperands - 1).isImm())
Simon Pilgrimb9ada272015-11-16 22:54:41 +0000418 DecodePSRLDQMask(getRegOperandVectorVT(MI, MVT::i8, 0),
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000419 MI->getOperand(NumOperands - 1).getImm(),
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000420 ShuffleMask);
421 break;
422
Craig Topper7a299302016-06-09 07:06:38 +0000423 CASE_SHUF(PALIGNR, rri)
Craig Topper89c17612016-06-10 04:48:05 +0000424 Src1Name = getRegName(MI->getOperand(NumOperands - 2).getReg());
425 RegForm = true;
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000426 // FALL THROUGH.
Craig Topper7a299302016-06-09 07:06:38 +0000427 CASE_SHUF(PALIGNR, rmi)
Craig Topper89c17612016-06-10 04:48:05 +0000428 Src2Name = getRegName(MI->getOperand(NumOperands-(RegForm?3:7)).getReg());
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000429 DestName = getRegName(MI->getOperand(0).getReg());
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000430 if (MI->getOperand(NumOperands - 1).isImm())
Simon Pilgrimb9ada272015-11-16 22:54:41 +0000431 DecodePALIGNRMask(getRegOperandVectorVT(MI, MVT::i8, 0),
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000432 MI->getOperand(NumOperands - 1).getImm(),
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000433 ShuffleMask);
434 break;
435
Craig Topper01f53b12016-06-03 05:31:00 +0000436 CASE_SHUF(PSHUFD, ri)
Craig Topper6f7288d2016-06-09 07:49:08 +0000437 Src1Name = getRegName(MI->getOperand(NumOperands - 2).getReg());
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000438 // FALL THROUGH.
Craig Topper01f53b12016-06-03 05:31:00 +0000439 CASE_SHUF(PSHUFD, mi)
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000440 DestName = getRegName(MI->getOperand(0).getReg());
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000441 if (MI->getOperand(NumOperands - 1).isImm())
Simon Pilgrim5883a732015-11-16 22:39:27 +0000442 DecodePSHUFMask(getRegOperandVectorVT(MI, MVT::i32, 0),
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000443 MI->getOperand(NumOperands - 1).getImm(),
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000444 ShuffleMask);
445 break;
446
Craig Topper01f53b12016-06-03 05:31:00 +0000447 CASE_SHUF(PSHUFHW, ri)
Craig Topper6f7288d2016-06-09 07:49:08 +0000448 Src1Name = getRegName(MI->getOperand(NumOperands - 2).getReg());
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000449 // FALL THROUGH.
Craig Topper01f53b12016-06-03 05:31:00 +0000450 CASE_SHUF(PSHUFHW, mi)
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000451 DestName = getRegName(MI->getOperand(0).getReg());
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000452 if (MI->getOperand(NumOperands - 1).isImm())
Simon Pilgrim5883a732015-11-16 22:39:27 +0000453 DecodePSHUFHWMask(getRegOperandVectorVT(MI, MVT::i16, 0),
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000454 MI->getOperand(NumOperands - 1).getImm(),
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000455 ShuffleMask);
456 break;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000457
Craig Topper01f53b12016-06-03 05:31:00 +0000458 CASE_SHUF(PSHUFLW, ri)
Craig Topper6f7288d2016-06-09 07:49:08 +0000459 Src1Name = getRegName(MI->getOperand(NumOperands - 2).getReg());
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000460 // FALL THROUGH.
Craig Topper01f53b12016-06-03 05:31:00 +0000461 CASE_SHUF(PSHUFLW, mi)
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000462 DestName = getRegName(MI->getOperand(0).getReg());
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000463 if (MI->getOperand(NumOperands - 1).isImm())
Simon Pilgrim5883a732015-11-16 22:39:27 +0000464 DecodePSHUFLWMask(getRegOperandVectorVT(MI, MVT::i16, 0),
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000465 MI->getOperand(NumOperands - 1).getImm(),
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000466 ShuffleMask);
467 break;
468
Simon Pilgrimf8f86ab2015-09-13 11:28:45 +0000469 case X86::MMX_PSHUFWri:
470 Src1Name = getRegName(MI->getOperand(1).getReg());
471 // FALL THROUGH.
472 case X86::MMX_PSHUFWmi:
473 DestName = getRegName(MI->getOperand(0).getReg());
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000474 if (MI->getOperand(NumOperands - 1).isImm())
Simon Pilgrimf8f86ab2015-09-13 11:28:45 +0000475 DecodePSHUFMask(MVT::v4i16,
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000476 MI->getOperand(NumOperands - 1).getImm(),
Simon Pilgrimf8f86ab2015-09-13 11:28:45 +0000477 ShuffleMask);
478 break;
479
480 case X86::PSWAPDrr:
481 Src1Name = getRegName(MI->getOperand(1).getReg());
482 // FALL THROUGH.
483 case X86::PSWAPDrm:
484 DestName = getRegName(MI->getOperand(0).getReg());
485 DecodePSWAPMask(MVT::v2i32, ShuffleMask);
486 break;
487
Simon Pilgrim8483df62015-11-17 22:35:45 +0000488 CASE_UNPCK(PUNPCKHBW, r)
Simon Pilgrimf8f86ab2015-09-13 11:28:45 +0000489 case X86::MMX_PUNPCKHBWirr:
Craig Topper89c17612016-06-10 04:48:05 +0000490 Src2Name = getRegName(MI->getOperand(NumOperands - 1).getReg());
491 RegForm = true;
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000492 // FALL THROUGH.
Simon Pilgrim8483df62015-11-17 22:35:45 +0000493 CASE_UNPCK(PUNPCKHBW, m)
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000494 case X86::MMX_PUNPCKHBWirm:
Craig Topper89c17612016-06-10 04:48:05 +0000495 Src1Name = getRegName(MI->getOperand(NumOperands-(RegForm?2:6)).getReg());
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000496 DestName = getRegName(MI->getOperand(0).getReg());
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000497 DecodeUNPCKHMask(getRegOperandVectorVT(MI, MVT::i8, 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(PUNPCKHWD, r)
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000501 case X86::MMX_PUNPCKHWDirr:
Craig Topper89c17612016-06-10 04:48:05 +0000502 Src2Name = getRegName(MI->getOperand(NumOperands - 1).getReg());
503 RegForm = true;
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000504 // FALL THROUGH.
Simon Pilgrim8483df62015-11-17 22:35:45 +0000505 CASE_UNPCK(PUNPCKHWD, m)
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000506 case X86::MMX_PUNPCKHWDirm:
Craig Topper89c17612016-06-10 04:48:05 +0000507 Src1Name = getRegName(MI->getOperand(NumOperands-(RegForm?2:6)).getReg());
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000508 DestName = getRegName(MI->getOperand(0).getReg());
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000509 DecodeUNPCKHMask(getRegOperandVectorVT(MI, MVT::i16, 0), ShuffleMask);
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000510 break;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000511
Simon Pilgrim8483df62015-11-17 22:35:45 +0000512 CASE_UNPCK(PUNPCKHDQ, r)
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000513 case X86::MMX_PUNPCKHDQirr:
Craig Topper89c17612016-06-10 04:48:05 +0000514 Src2Name = getRegName(MI->getOperand(NumOperands - 1).getReg());
515 RegForm = true;
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000516 // FALL THROUGH.
Simon Pilgrim8483df62015-11-17 22:35:45 +0000517 CASE_UNPCK(PUNPCKHDQ, m)
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000518 case X86::MMX_PUNPCKHDQirm:
Craig Topper89c17612016-06-10 04:48:05 +0000519 Src1Name = getRegName(MI->getOperand(NumOperands-(RegForm?2:6)).getReg());
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000520 DestName = getRegName(MI->getOperand(0).getReg());
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000521 DecodeUNPCKHMask(getRegOperandVectorVT(MI, MVT::i32, 0), ShuffleMask);
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000522 break;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000523
Simon Pilgrim8483df62015-11-17 22:35:45 +0000524 CASE_UNPCK(PUNPCKHQDQ, r)
Craig Topper89c17612016-06-10 04:48:05 +0000525 Src2Name = getRegName(MI->getOperand(NumOperands - 1).getReg());
526 RegForm = true;
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000527 // FALL THROUGH.
Simon Pilgrim8483df62015-11-17 22:35:45 +0000528 CASE_UNPCK(PUNPCKHQDQ, m)
Craig Topper89c17612016-06-10 04:48:05 +0000529 Src1Name = getRegName(MI->getOperand(NumOperands-(RegForm?2:6)).getReg());
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000530 DestName = getRegName(MI->getOperand(0).getReg());
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000531 DecodeUNPCKHMask(getRegOperandVectorVT(MI, MVT::i64, 0), ShuffleMask);
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000532 break;
533
Simon Pilgrim8483df62015-11-17 22:35:45 +0000534 CASE_UNPCK(PUNPCKLBW, r)
Simon Pilgrimf8f86ab2015-09-13 11:28:45 +0000535 case X86::MMX_PUNPCKLBWirr:
Craig Topper89c17612016-06-10 04:48:05 +0000536 Src2Name = getRegName(MI->getOperand(NumOperands - 1).getReg());
537 RegForm = true;
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000538 // FALL THROUGH.
Simon Pilgrim8483df62015-11-17 22:35:45 +0000539 CASE_UNPCK(PUNPCKLBW, m)
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000540 case X86::MMX_PUNPCKLBWirm:
Craig Topper89c17612016-06-10 04:48:05 +0000541 Src1Name = getRegName(MI->getOperand(NumOperands-(RegForm?2:6)).getReg());
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000542 DestName = getRegName(MI->getOperand(0).getReg());
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000543 DecodeUNPCKLMask(getRegOperandVectorVT(MI, MVT::i8, 0), ShuffleMask);
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000544 break;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000545
Simon Pilgrim8483df62015-11-17 22:35:45 +0000546 CASE_UNPCK(PUNPCKLWD, r)
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000547 case X86::MMX_PUNPCKLWDirr:
Craig Topper89c17612016-06-10 04:48:05 +0000548 Src2Name = getRegName(MI->getOperand(NumOperands - 1).getReg());
549 RegForm = true;
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000550 // FALL THROUGH.
Simon Pilgrim8483df62015-11-17 22:35:45 +0000551 CASE_UNPCK(PUNPCKLWD, m)
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000552 case X86::MMX_PUNPCKLWDirm:
Craig Topper89c17612016-06-10 04:48:05 +0000553 Src1Name = getRegName(MI->getOperand(NumOperands-(RegForm?2:6)).getReg());
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000554 DestName = getRegName(MI->getOperand(0).getReg());
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000555 DecodeUNPCKLMask(getRegOperandVectorVT(MI, MVT::i16, 0), ShuffleMask);
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000556 break;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000557
Simon Pilgrim8483df62015-11-17 22:35:45 +0000558 CASE_UNPCK(PUNPCKLDQ, r)
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000559 case X86::MMX_PUNPCKLDQirr:
Craig Topper89c17612016-06-10 04:48:05 +0000560 Src2Name = getRegName(MI->getOperand(NumOperands - 1).getReg());
561 RegForm = true;
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000562 // FALL THROUGH.
Simon Pilgrim8483df62015-11-17 22:35:45 +0000563 CASE_UNPCK(PUNPCKLDQ, m)
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000564 case X86::MMX_PUNPCKLDQirm:
Craig Topper89c17612016-06-10 04:48:05 +0000565 Src1Name = getRegName(MI->getOperand(NumOperands-(RegForm?2:6)).getReg());
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000566 DestName = getRegName(MI->getOperand(0).getReg());
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000567 DecodeUNPCKLMask(getRegOperandVectorVT(MI, MVT::i32, 0), ShuffleMask);
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000568 break;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000569
Simon Pilgrim8483df62015-11-17 22:35:45 +0000570 CASE_UNPCK(PUNPCKLQDQ, r)
Craig Topper89c17612016-06-10 04:48:05 +0000571 Src2Name = getRegName(MI->getOperand(NumOperands - 1).getReg());
572 RegForm = true;
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000573 // FALL THROUGH.
Simon Pilgrim8483df62015-11-17 22:35:45 +0000574 CASE_UNPCK(PUNPCKLQDQ, m)
Craig Topper89c17612016-06-10 04:48:05 +0000575 Src1Name = getRegName(MI->getOperand(NumOperands-(RegForm?2:6)).getReg());
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000576 DestName = getRegName(MI->getOperand(0).getReg());
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000577 DecodeUNPCKLMask(getRegOperandVectorVT(MI, MVT::i64, 0), ShuffleMask);
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000578 break;
579
Craig Topper01f53b12016-06-03 05:31:00 +0000580 CASE_SHUF(SHUFPD, rri)
Craig Topper89c17612016-06-10 04:48:05 +0000581 Src2Name = getRegName(MI->getOperand(NumOperands - 2).getReg());
582 RegForm = true;
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000583 // FALL THROUGH.
Craig Topper01f53b12016-06-03 05:31:00 +0000584 CASE_SHUF(SHUFPD, rmi)
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000585 if (MI->getOperand(NumOperands - 1).isImm())
Simon Pilgrim5883a732015-11-16 22:39:27 +0000586 DecodeSHUFPMask(getRegOperandVectorVT(MI, MVT::f64, 0),
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000587 MI->getOperand(NumOperands - 1).getImm(),
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000588 ShuffleMask);
Craig Topper89c17612016-06-10 04:48:05 +0000589 Src1Name = getRegName(MI->getOperand(NumOperands-(RegForm?3:7)).getReg());
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000590 DestName = getRegName(MI->getOperand(0).getReg());
591 break;
592
Craig Topper01f53b12016-06-03 05:31:00 +0000593 CASE_SHUF(SHUFPS, rri)
Craig Topper89c17612016-06-10 04:48:05 +0000594 Src2Name = getRegName(MI->getOperand(NumOperands - 2).getReg());
595 RegForm = true;
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000596 // FALL THROUGH.
Craig Topper01f53b12016-06-03 05:31:00 +0000597 CASE_SHUF(SHUFPS, rmi)
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000598 if (MI->getOperand(NumOperands - 1).isImm())
Simon Pilgrim5883a732015-11-16 22:39:27 +0000599 DecodeSHUFPMask(getRegOperandVectorVT(MI, MVT::f32, 0),
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000600 MI->getOperand(NumOperands - 1).getImm(),
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000601 ShuffleMask);
Craig Topper89c17612016-06-10 04:48:05 +0000602 Src1Name = getRegName(MI->getOperand(NumOperands-(RegForm?3:7)).getReg());
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000603 DestName = getRegName(MI->getOperand(0).getReg());
604 break;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000605
Igor Breger24cab0f2015-11-16 07:22:00 +0000606 CASE_VSHUF(64X2, r)
Simon Pilgrimd3869412016-06-11 11:18:38 +0000607 Src2Name = getRegName(MI->getOperand(NumOperands - 2).getReg());
608 RegForm = true;
609 // FALL THROUGH.
Igor Breger24cab0f2015-11-16 07:22:00 +0000610 CASE_VSHUF(64X2, m)
Simon Pilgrimd3869412016-06-11 11:18:38 +0000611 decodeVSHUF64x2FamilyMask(getRegOperandVectorVT(MI, MVT::i64, 0),
612 MI->getOperand(NumOperands - 1).getImm(),
Igor Bregerd7bae452015-10-15 13:29:07 +0000613 ShuffleMask);
Simon Pilgrimd3869412016-06-11 11:18:38 +0000614 Src1Name = getRegName(MI->getOperand(NumOperands-(RegForm?3:7)).getReg());
Igor Bregerd7bae452015-10-15 13:29:07 +0000615 DestName = getRegName(MI->getOperand(0).getReg());
Igor Bregerd7bae452015-10-15 13:29:07 +0000616 break;
Simon Pilgrimd3869412016-06-11 11:18:38 +0000617
618 CASE_VSHUF(32X4, r)
619 Src2Name = getRegName(MI->getOperand(NumOperands - 2).getReg());
620 RegForm = true;
621 // FALL THROUGH.
622 CASE_VSHUF(32X4, m)
623 decodeVSHUF64x2FamilyMask(getRegOperandVectorVT(MI, MVT::i32, 0),
624 MI->getOperand(NumOperands - 1).getImm(),
625 ShuffleMask);
626 Src1Name = getRegName(MI->getOperand(NumOperands-(RegForm?3:7)).getReg());
627 DestName = getRegName(MI->getOperand(0).getReg());
628 break;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000629
Simon Pilgrim8483df62015-11-17 22:35:45 +0000630 CASE_UNPCK(UNPCKLPD, r)
Craig Topper89c17612016-06-10 04:48:05 +0000631 Src2Name = getRegName(MI->getOperand(NumOperands - 1).getReg());
632 RegForm = true;
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000633 // FALL THROUGH.
Simon Pilgrim8483df62015-11-17 22:35:45 +0000634 CASE_UNPCK(UNPCKLPD, m)
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000635 DecodeUNPCKLMask(getRegOperandVectorVT(MI, MVT::f64, 0), ShuffleMask);
Craig Topper89c17612016-06-10 04:48:05 +0000636 Src1Name = getRegName(MI->getOperand(NumOperands-(RegForm?2:6)).getReg());
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000637 DestName = getRegName(MI->getOperand(0).getReg());
638 break;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000639
Simon Pilgrim8483df62015-11-17 22:35:45 +0000640 CASE_UNPCK(UNPCKLPS, r)
Craig Topper89c17612016-06-10 04:48:05 +0000641 Src2Name = getRegName(MI->getOperand(NumOperands - 1).getReg());
642 RegForm = true;
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000643 // FALL THROUGH.
Simon Pilgrim8483df62015-11-17 22:35:45 +0000644 CASE_UNPCK(UNPCKLPS, m)
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000645 DecodeUNPCKLMask(getRegOperandVectorVT(MI, MVT::f32, 0), ShuffleMask);
Craig Topper89c17612016-06-10 04:48:05 +0000646 Src1Name = getRegName(MI->getOperand(NumOperands-(RegForm?2:6)).getReg());
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000647 DestName = getRegName(MI->getOperand(0).getReg());
648 break;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000649
Simon Pilgrim8483df62015-11-17 22:35:45 +0000650 CASE_UNPCK(UNPCKHPD, r)
Craig Topper89c17612016-06-10 04:48:05 +0000651 Src2Name = getRegName(MI->getOperand(NumOperands - 1).getReg());
652 RegForm = true;
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000653 // FALL THROUGH.
Simon Pilgrim8483df62015-11-17 22:35:45 +0000654 CASE_UNPCK(UNPCKHPD, m)
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000655 DecodeUNPCKHMask(getRegOperandVectorVT(MI, MVT::f64, 0), ShuffleMask);
Craig Topper89c17612016-06-10 04:48:05 +0000656 Src1Name = getRegName(MI->getOperand(NumOperands-(RegForm?2:6)).getReg());
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000657 DestName = getRegName(MI->getOperand(0).getReg());
658 break;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000659
Simon Pilgrim8483df62015-11-17 22:35:45 +0000660 CASE_UNPCK(UNPCKHPS, r)
Craig Topper89c17612016-06-10 04:48:05 +0000661 Src2Name = getRegName(MI->getOperand(NumOperands - 1).getReg());
662 RegForm = true;
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000663 // FALL THROUGH.
Simon Pilgrim8483df62015-11-17 22:35:45 +0000664 CASE_UNPCK(UNPCKHPS, m)
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000665 DecodeUNPCKHMask(getRegOperandVectorVT(MI, MVT::f32, 0), ShuffleMask);
Craig Topper89c17612016-06-10 04:48:05 +0000666 Src1Name = getRegName(MI->getOperand(NumOperands-(RegForm?2:6)).getReg());
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000667 DestName = getRegName(MI->getOperand(0).getReg());
668 break;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000669
Simon Pilgrim2da41782015-11-17 23:29:49 +0000670 CASE_VPERM(PERMILPS, r)
Simon Pilgrim6ce35dd2016-05-11 18:53:44 +0000671 Src1Name = getRegName(MI->getOperand(NumOperands - 2).getReg());
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000672 // FALL THROUGH.
Simon Pilgrim2da41782015-11-17 23:29:49 +0000673 CASE_VPERM(PERMILPS, m)
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000674 if (MI->getOperand(NumOperands - 1).isImm())
Simon Pilgrim5883a732015-11-16 22:39:27 +0000675 DecodePSHUFMask(getRegOperandVectorVT(MI, MVT::f32, 0),
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000676 MI->getOperand(NumOperands - 1).getImm(),
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000677 ShuffleMask);
678 DestName = getRegName(MI->getOperand(0).getReg());
679 break;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000680
Simon Pilgrim2da41782015-11-17 23:29:49 +0000681 CASE_VPERM(PERMILPD, r)
Simon Pilgrim6ce35dd2016-05-11 18:53:44 +0000682 Src1Name = getRegName(MI->getOperand(NumOperands - 2).getReg());
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000683 // FALL THROUGH.
Simon Pilgrim2da41782015-11-17 23:29:49 +0000684 CASE_VPERM(PERMILPD, m)
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000685 if (MI->getOperand(NumOperands - 1).isImm())
Simon Pilgrim5883a732015-11-16 22:39:27 +0000686 DecodePSHUFMask(getRegOperandVectorVT(MI, MVT::f64, 0),
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000687 MI->getOperand(NumOperands - 1).getImm(),
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000688 ShuffleMask);
689 DestName = getRegName(MI->getOperand(0).getReg());
690 break;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000691
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000692 case X86::VPERM2F128rr:
693 case X86::VPERM2I128rr:
694 Src2Name = getRegName(MI->getOperand(2).getReg());
695 // FALL THROUGH.
696 case X86::VPERM2F128rm:
697 case X86::VPERM2I128rm:
698 // For instruction comments purpose, assume the 256-bit vector is v4i64.
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000699 if (MI->getOperand(NumOperands - 1).isImm())
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000700 DecodeVPERM2X128Mask(MVT::v4i64,
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000701 MI->getOperand(NumOperands - 1).getImm(),
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000702 ShuffleMask);
703 Src1Name = getRegName(MI->getOperand(1).getReg());
704 DestName = getRegName(MI->getOperand(0).getReg());
705 break;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000706
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000707 case X86::VPERMQYri:
Craig Topper22ae3532016-05-21 06:07:18 +0000708 case X86::VPERMQZ256ri:
Craig Topper200d2372016-06-10 05:12:40 +0000709 case X86::VPERMQZ256rik:
710 case X86::VPERMQZ256rikz:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000711 case X86::VPERMPDYri:
Craig Topper22ae3532016-05-21 06:07:18 +0000712 case X86::VPERMPDZ256ri:
Craig Topper200d2372016-06-10 05:12:40 +0000713 case X86::VPERMPDZ256rik:
714 case X86::VPERMPDZ256rikz:
715 Src1Name = getRegName(MI->getOperand(NumOperands - 2).getReg());
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000716 // FALL THROUGH.
717 case X86::VPERMQYmi:
Craig Topper22ae3532016-05-21 06:07:18 +0000718 case X86::VPERMQZ256mi:
Craig Topper200d2372016-06-10 05:12:40 +0000719 case X86::VPERMQZ256mik:
720 case X86::VPERMQZ256mikz:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000721 case X86::VPERMPDYmi:
Craig Topper22ae3532016-05-21 06:07:18 +0000722 case X86::VPERMPDZ256mi:
Craig Topper200d2372016-06-10 05:12:40 +0000723 case X86::VPERMPDZ256mik:
724 case X86::VPERMPDZ256mikz:
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000725 if (MI->getOperand(NumOperands - 1).isImm())
726 DecodeVPERMMask(MI->getOperand(NumOperands - 1).getImm(),
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000727 ShuffleMask);
728 DestName = getRegName(MI->getOperand(0).getReg());
729 break;
730
731 case X86::MOVSDrr:
732 case X86::VMOVSDrr:
Simon Pilgrimf5c23ad2016-02-01 22:26:28 +0000733 case X86::VMOVSDZrr:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000734 Src2Name = getRegName(MI->getOperand(2).getReg());
735 Src1Name = getRegName(MI->getOperand(1).getReg());
736 // FALL THROUGH.
737 case X86::MOVSDrm:
738 case X86::VMOVSDrm:
Simon Pilgrimf5c23ad2016-02-01 22:26:28 +0000739 case X86::VMOVSDZrm:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000740 DecodeScalarMoveMask(MVT::v2f64, nullptr == Src2Name, ShuffleMask);
741 DestName = getRegName(MI->getOperand(0).getReg());
742 break;
Simon Pilgrimd5a15442015-11-21 13:04:42 +0000743
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000744 case X86::MOVSSrr:
745 case X86::VMOVSSrr:
Simon Pilgrimf5c23ad2016-02-01 22:26:28 +0000746 case X86::VMOVSSZrr:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000747 Src2Name = getRegName(MI->getOperand(2).getReg());
748 Src1Name = getRegName(MI->getOperand(1).getReg());
749 // FALL THROUGH.
750 case X86::MOVSSrm:
751 case X86::VMOVSSrm:
Simon Pilgrimf5c23ad2016-02-01 22:26:28 +0000752 case X86::VMOVSSZrm:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000753 DecodeScalarMoveMask(MVT::v4f32, nullptr == Src2Name, ShuffleMask);
754 DestName = getRegName(MI->getOperand(0).getReg());
755 break;
756
757 case X86::MOVPQI2QIrr:
Simon Pilgrim3e0c0222015-12-13 12:49:48 +0000758 case X86::MOVZPQILo2PQIrr:
759 case X86::VMOVPQI2QIrr:
760 case X86::VMOVZPQILo2PQIrr:
761 case X86::VMOVZPQILo2PQIZrr:
762 Src1Name = getRegName(MI->getOperand(1).getReg());
763 // FALL THROUGH.
764 case X86::MOVQI2PQIrm:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000765 case X86::MOVZQI2PQIrm:
766 case X86::MOVZPQILo2PQIrm:
Simon Pilgrim3e0c0222015-12-13 12:49:48 +0000767 case X86::VMOVQI2PQIrm:
Simon Pilgrim96fe4ef2016-02-02 13:32:56 +0000768 case X86::VMOVQI2PQIZrm:
Simon Pilgrim3e0c0222015-12-13 12:49:48 +0000769 case X86::VMOVZQI2PQIrm:
770 case X86::VMOVZPQILo2PQIrm:
771 case X86::VMOVZPQILo2PQIZrm:
772 DecodeZeroMoveLowMask(MVT::v2i64, ShuffleMask);
773 DestName = getRegName(MI->getOperand(0).getReg());
774 break;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000775
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000776 case X86::MOVDI2PDIrm:
777 case X86::VMOVDI2PDIrm:
Simon Pilgrim5be17b62016-02-01 23:04:05 +0000778 case X86::VMOVDI2PDIZrm:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000779 DecodeZeroMoveLowMask(MVT::v4i32, ShuffleMask);
780 DestName = getRegName(MI->getOperand(0).getReg());
781 break;
782
Simon Pilgrimd85cae32015-07-06 20:46:41 +0000783 case X86::EXTRQI:
784 if (MI->getOperand(2).isImm() &&
785 MI->getOperand(3).isImm())
786 DecodeEXTRQIMask(MI->getOperand(2).getImm(),
787 MI->getOperand(3).getImm(),
788 ShuffleMask);
789
790 DestName = getRegName(MI->getOperand(0).getReg());
791 Src1Name = getRegName(MI->getOperand(1).getReg());
792 break;
793
794 case X86::INSERTQI:
795 if (MI->getOperand(3).isImm() &&
796 MI->getOperand(4).isImm())
797 DecodeINSERTQIMask(MI->getOperand(3).getImm(),
798 MI->getOperand(4).getImm(),
799 ShuffleMask);
800
801 DestName = getRegName(MI->getOperand(0).getReg());
802 Src1Name = getRegName(MI->getOperand(1).getReg());
803 Src2Name = getRegName(MI->getOperand(2).getReg());
804 break;
805
Simon Pilgrim0acc32a2016-02-06 19:51:21 +0000806 CASE_PMOVZX(PMOVZXBW, r)
807 CASE_PMOVZX(PMOVZXBD, r)
808 CASE_PMOVZX(PMOVZXBQ, r)
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000809 Src1Name = getRegName(MI->getOperand(NumOperands - 1).getReg());
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000810 // FALL THROUGH.
Simon Pilgrim0acc32a2016-02-06 19:51:21 +0000811 CASE_PMOVZX(PMOVZXBW, m)
812 CASE_PMOVZX(PMOVZXBD, m)
813 CASE_PMOVZX(PMOVZXBQ, m)
Simon Pilgrime1b6db92016-02-06 16:33:42 +0000814 DecodeZeroExtendMask(MVT::i8, getZeroExtensionResultType(MI), ShuffleMask);
815 DestName = getRegName(MI->getOperand(0).getReg());
816 break;
817
Simon Pilgrim0acc32a2016-02-06 19:51:21 +0000818 CASE_PMOVZX(PMOVZXWD, r)
819 CASE_PMOVZX(PMOVZXWQ, r)
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000820 Src1Name = getRegName(MI->getOperand(NumOperands - 1).getReg());
Simon Pilgrime1b6db92016-02-06 16:33:42 +0000821 // FALL THROUGH.
Simon Pilgrim0acc32a2016-02-06 19:51:21 +0000822 CASE_PMOVZX(PMOVZXWD, m)
823 CASE_PMOVZX(PMOVZXWQ, m)
Simon Pilgrime1b6db92016-02-06 16:33:42 +0000824 DecodeZeroExtendMask(MVT::i16, getZeroExtensionResultType(MI), ShuffleMask);
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000825 DestName = getRegName(MI->getOperand(0).getReg());
Simon Pilgrime1b6db92016-02-06 16:33:42 +0000826 break;
827
Simon Pilgrim0acc32a2016-02-06 19:51:21 +0000828 CASE_PMOVZX(PMOVZXDQ, r)
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000829 Src1Name = getRegName(MI->getOperand(NumOperands - 1).getReg());
Simon Pilgrime1b6db92016-02-06 16:33:42 +0000830 // FALL THROUGH.
Simon Pilgrim0acc32a2016-02-06 19:51:21 +0000831 CASE_PMOVZX(PMOVZXDQ, m)
Simon Pilgrime1b6db92016-02-06 16:33:42 +0000832 DecodeZeroExtendMask(MVT::i32, getZeroExtensionResultType(MI), ShuffleMask);
833 DestName = getRegName(MI->getOperand(0).getReg());
834 break;
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000835 }
836
837 // The only comments we decode are shuffles, so give up if we were unable to
838 // decode a shuffle mask.
839 if (ShuffleMask.empty())
840 return false;
841
842 if (!DestName) DestName = Src1Name;
Simon Pilgrim7c2fbdc2016-07-03 13:08:29 +0000843 OS << (DestName ? getMaskName(MI, DestName, getRegName) : "mem") << " = ";
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000844
845 // If the two sources are the same, canonicalize the input elements to be
846 // from the first src so that we get larger element spans.
847 if (Src1Name == Src2Name) {
848 for (unsigned i = 0, e = ShuffleMask.size(); i != e; ++i) {
849 if ((int)ShuffleMask[i] >= 0 && // Not sentinel.
NAKAMURA Takumi5582a6a2015-05-25 01:43:34 +0000850 ShuffleMask[i] >= (int)e) // From second mask.
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000851 ShuffleMask[i] -= e;
852 }
853 }
854
855 // The shuffle mask specifies which elements of the src1/src2 fill in the
856 // destination, with a few sentinel values. Loop through and print them
857 // out.
858 for (unsigned i = 0, e = ShuffleMask.size(); i != e; ++i) {
859 if (i != 0)
860 OS << ',';
861 if (ShuffleMask[i] == SM_SentinelZero) {
862 OS << "zero";
863 continue;
864 }
865
866 // Otherwise, it must come from src1 or src2. Print the span of elements
867 // that comes from this src.
868 bool isSrc1 = ShuffleMask[i] < (int)ShuffleMask.size();
869 const char *SrcName = isSrc1 ? Src1Name : Src2Name;
870 OS << (SrcName ? SrcName : "mem") << '[';
871 bool IsFirst = true;
872 while (i != e && (int)ShuffleMask[i] != SM_SentinelZero &&
873 (ShuffleMask[i] < (int)ShuffleMask.size()) == isSrc1) {
874 if (!IsFirst)
875 OS << ',';
876 else
877 IsFirst = false;
878 if (ShuffleMask[i] == SM_SentinelUndef)
879 OS << "u";
880 else
881 OS << ShuffleMask[i] % ShuffleMask.size();
882 ++i;
883 }
884 OS << ']';
NAKAMURA Takumi5582a6a2015-05-25 01:43:34 +0000885 --i; // For loop increments element #.
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000886 }
887 //MI->print(OS, 0);
888 OS << "\n";
889
890 // We successfully added a comment to this instruction.
891 return true;
892}