blob: 9369dfa8e3a5a3f9e2b347d9b8a04aac51bbb295 [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 Pilgrim41c05c02016-05-11 11:55:12 +000067#define CASE_UNPCK(Inst, src) \
68 CASE_AVX512_INS_COMMON(Inst, Z, r##src) \
69 CASE_AVX512_INS_COMMON(Inst, Z256, r##src) \
70 CASE_AVX512_INS_COMMON(Inst, Z128, r##src) \
71 CASE_AVX_INS_COMMON(Inst, , r##src) \
72 CASE_AVX_INS_COMMON(Inst, Y, r##src) \
Simon Pilgrimbfa5f232016-02-06 17:02:15 +000073 CASE_SSE_INS_COMMON(Inst, r##src)
74
Craig Topper01f53b12016-06-03 05:31:00 +000075#define CASE_SHUF(Inst, suf) \
76 CASE_AVX512_INS_COMMON(Inst, Z, suf) \
77 CASE_AVX512_INS_COMMON(Inst, Z256, suf) \
78 CASE_AVX512_INS_COMMON(Inst, Z128, suf) \
79 CASE_AVX_INS_COMMON(Inst, , suf) \
80 CASE_AVX_INS_COMMON(Inst, Y, suf) \
81 CASE_SSE_INS_COMMON(Inst, suf)
Simon Pilgrimbfa5f232016-02-06 17:02:15 +000082
Simon Pilgrim41c05c02016-05-11 11:55:12 +000083#define CASE_VPERM(Inst, src) \
84 CASE_AVX512_INS_COMMON(Inst, Z, src##i) \
85 CASE_AVX512_INS_COMMON(Inst, Z256, src##i) \
86 CASE_AVX512_INS_COMMON(Inst, Z128, src##i) \
87 CASE_AVX_INS_COMMON(Inst, , src##i) \
Simon Pilgrimbfa5f232016-02-06 17:02:15 +000088 CASE_AVX_INS_COMMON(Inst, Y, src##i)
89
90#define CASE_VSHUF(Inst, src) \
Simon Pilgrim41c05c02016-05-11 11:55:12 +000091 CASE_AVX512_INS_COMMON(SHUFF##Inst, Z, r##src##i) \
92 CASE_AVX512_INS_COMMON(SHUFI##Inst, Z, r##src##i) \
93 CASE_AVX512_INS_COMMON(SHUFF##Inst, Z256, r##src##i) \
94 CASE_AVX512_INS_COMMON(SHUFI##Inst, Z256, r##src##i)
Simon Pilgrimbfa5f232016-02-06 17:02:15 +000095
Igor Breger24cab0f2015-11-16 07:22:00 +000096static unsigned getVectorRegSize(unsigned RegNo) {
Igor Breger24cab0f2015-11-16 07:22:00 +000097 if (X86::ZMM0 <= RegNo && RegNo <= X86::ZMM31)
98 return 512;
99 if (X86::YMM0 <= RegNo && RegNo <= X86::YMM31)
100 return 256;
101 if (X86::XMM0 <= RegNo && RegNo <= X86::XMM31)
102 return 128;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000103 if (X86::MM0 <= RegNo && RegNo <= X86::MM7)
104 return 64;
Igor Breger24cab0f2015-11-16 07:22:00 +0000105
106 llvm_unreachable("Unknown vector reg!");
Igor Breger24cab0f2015-11-16 07:22:00 +0000107}
108
109static MVT getRegOperandVectorVT(const MCInst *MI, const MVT &ScalarVT,
110 unsigned OperandIndex) {
111 unsigned OpReg = MI->getOperand(OperandIndex).getReg();
112 return MVT::getVectorVT(ScalarVT,
113 getVectorRegSize(OpReg)/ScalarVT.getSizeInBits());
114}
115
Simon Pilgrime1b6db92016-02-06 16:33:42 +0000116/// \brief Extracts the dst type for a given zero extension instruction.
117static MVT getZeroExtensionResultType(const MCInst *MI) {
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000118 switch (MI->getOpcode()) {
119 default:
120 llvm_unreachable("Unknown zero extension instruction");
Simon Pilgrime1b6db92016-02-06 16:33:42 +0000121 // zero extension to i16
Simon Pilgrim0acc32a2016-02-06 19:51:21 +0000122 CASE_PMOVZX(PMOVZXBW, m)
123 CASE_PMOVZX(PMOVZXBW, r)
Simon Pilgrime1b6db92016-02-06 16:33:42 +0000124 return getRegOperandVectorVT(MI, MVT::i16, 0);
125 // zero extension to i32
Simon Pilgrim0acc32a2016-02-06 19:51:21 +0000126 CASE_PMOVZX(PMOVZXBD, m)
127 CASE_PMOVZX(PMOVZXBD, r)
128 CASE_PMOVZX(PMOVZXWD, m)
129 CASE_PMOVZX(PMOVZXWD, r)
Simon Pilgrime1b6db92016-02-06 16:33:42 +0000130 return getRegOperandVectorVT(MI, MVT::i32, 0);
131 // zero extension to i64
Simon Pilgrim0acc32a2016-02-06 19:51:21 +0000132 CASE_PMOVZX(PMOVZXBQ, m)
133 CASE_PMOVZX(PMOVZXBQ, r)
134 CASE_PMOVZX(PMOVZXWQ, m)
135 CASE_PMOVZX(PMOVZXWQ, r)
136 CASE_PMOVZX(PMOVZXDQ, m)
137 CASE_PMOVZX(PMOVZXDQ, r)
Simon Pilgrime1b6db92016-02-06 16:33:42 +0000138 return getRegOperandVectorVT(MI, MVT::i64, 0);
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000139 }
140}
141
Simon Pilgrim7c2fbdc2016-07-03 13:08:29 +0000142/// Wraps the destination register name with AVX512 mask/maskz filtering.
143static std::string getMaskName(const MCInst *MI, const char *DestName,
144 const char *(*getRegName)(unsigned)) {
145 std::string OpMaskName(DestName);
146
147 bool MaskWithZero = false;
148 const char *MaskRegName = nullptr;
149
150 switch (MI->getOpcode()) {
151 default:
152 return OpMaskName;
153 CASE_MASKZ_MOVDUP(MOVDDUP, m)
154 CASE_MASKZ_MOVDUP(MOVDDUP, r)
155 CASE_MASKZ_MOVDUP(MOVSHDUP, m)
156 CASE_MASKZ_MOVDUP(MOVSHDUP, r)
157 CASE_MASKZ_MOVDUP(MOVSLDUP, m)
158 CASE_MASKZ_MOVDUP(MOVSLDUP, r)
159 MaskWithZero = true;
160 MaskRegName = getRegName(MI->getOperand(1).getReg());
161 break;
162 CASE_MASK_MOVDUP(MOVDDUP, m)
163 CASE_MASK_MOVDUP(MOVDDUP, r)
164 CASE_MASK_MOVDUP(MOVSHDUP, m)
165 CASE_MASK_MOVDUP(MOVSHDUP, r)
166 CASE_MASK_MOVDUP(MOVSLDUP, m)
167 CASE_MASK_MOVDUP(MOVSLDUP, r)
168 MaskRegName = getRegName(MI->getOperand(2).getReg());
169 break;
170 }
171
172 // MASK: zmmX {%kY}
173 OpMaskName += " {%";
174 OpMaskName += MaskRegName;
175 OpMaskName += "}";
176
177 // MASKZ: zmmX {%kY} {z}
178 if (MaskWithZero)
179 OpMaskName += " {z}";
180
181 return OpMaskName;
182}
183
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000184//===----------------------------------------------------------------------===//
185// Top Level Entrypoint
186//===----------------------------------------------------------------------===//
187
188/// EmitAnyX86InstComments - This function decodes x86 instructions and prints
189/// newline terminated strings to the specified string if desired. This
190/// information is shown in disassembly dumps when verbose assembly is enabled.
191bool llvm::EmitAnyX86InstComments(const MCInst *MI, raw_ostream &OS,
192 const char *(*getRegName)(unsigned)) {
193 // If this is a shuffle operation, the switch should fill in this state.
194 SmallVector<int, 8> ShuffleMask;
195 const char *DestName = nullptr, *Src1Name = nullptr, *Src2Name = nullptr;
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000196 unsigned NumOperands = MI->getNumOperands();
Craig Topper89c17612016-06-10 04:48:05 +0000197 bool RegForm = false;
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000198
199 switch (MI->getOpcode()) {
200 default:
201 // Not an instruction for which we can decode comments.
202 return false;
203
204 case X86::BLENDPDrri:
205 case X86::VBLENDPDrri:
Simon Pilgrim13d3a202015-11-16 23:03:18 +0000206 case X86::VBLENDPDYrri:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000207 Src2Name = getRegName(MI->getOperand(2).getReg());
208 // FALL THROUGH.
209 case X86::BLENDPDrmi:
210 case X86::VBLENDPDrmi:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000211 case X86::VBLENDPDYrmi:
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000212 if (MI->getOperand(NumOperands - 1).isImm())
Simon Pilgrim13d3a202015-11-16 23:03:18 +0000213 DecodeBLENDMask(getRegOperandVectorVT(MI, MVT::f64, 0),
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000214 MI->getOperand(NumOperands - 1).getImm(),
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000215 ShuffleMask);
216 Src1Name = getRegName(MI->getOperand(1).getReg());
217 DestName = getRegName(MI->getOperand(0).getReg());
218 break;
219
220 case X86::BLENDPSrri:
221 case X86::VBLENDPSrri:
Simon Pilgrim13d3a202015-11-16 23:03:18 +0000222 case X86::VBLENDPSYrri:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000223 Src2Name = getRegName(MI->getOperand(2).getReg());
224 // FALL THROUGH.
225 case X86::BLENDPSrmi:
226 case X86::VBLENDPSrmi:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000227 case X86::VBLENDPSYrmi:
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000228 if (MI->getOperand(NumOperands - 1).isImm())
Simon Pilgrim13d3a202015-11-16 23:03:18 +0000229 DecodeBLENDMask(getRegOperandVectorVT(MI, MVT::f32, 0),
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000230 MI->getOperand(NumOperands - 1).getImm(),
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000231 ShuffleMask);
232 Src1Name = getRegName(MI->getOperand(1).getReg());
233 DestName = getRegName(MI->getOperand(0).getReg());
234 break;
235
236 case X86::PBLENDWrri:
237 case X86::VPBLENDWrri:
Simon Pilgrim13d3a202015-11-16 23:03:18 +0000238 case X86::VPBLENDWYrri:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000239 Src2Name = getRegName(MI->getOperand(2).getReg());
240 // FALL THROUGH.
241 case X86::PBLENDWrmi:
242 case X86::VPBLENDWrmi:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000243 case X86::VPBLENDWYrmi:
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000244 if (MI->getOperand(NumOperands - 1).isImm())
Simon Pilgrim13d3a202015-11-16 23:03:18 +0000245 DecodeBLENDMask(getRegOperandVectorVT(MI, MVT::i16, 0),
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000246 MI->getOperand(NumOperands - 1).getImm(),
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000247 ShuffleMask);
248 Src1Name = getRegName(MI->getOperand(1).getReg());
249 DestName = getRegName(MI->getOperand(0).getReg());
250 break;
251
252 case X86::VPBLENDDrri:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000253 case X86::VPBLENDDYrri:
254 Src2Name = getRegName(MI->getOperand(2).getReg());
255 // FALL THROUGH.
Simon Pilgrim13d3a202015-11-16 23:03:18 +0000256 case X86::VPBLENDDrmi:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000257 case X86::VPBLENDDYrmi:
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000258 if (MI->getOperand(NumOperands - 1).isImm())
Simon Pilgrim13d3a202015-11-16 23:03:18 +0000259 DecodeBLENDMask(getRegOperandVectorVT(MI, MVT::i32, 0),
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000260 MI->getOperand(NumOperands - 1).getImm(),
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000261 ShuffleMask);
262 Src1Name = getRegName(MI->getOperand(1).getReg());
263 DestName = getRegName(MI->getOperand(0).getReg());
264 break;
265
266 case X86::INSERTPSrr:
267 case X86::VINSERTPSrr:
Simon Pilgrim025a3d852016-02-01 22:05:50 +0000268 case X86::VINSERTPSzrr:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000269 Src2Name = getRegName(MI->getOperand(2).getReg());
270 // FALL THROUGH.
271 case X86::INSERTPSrm:
272 case X86::VINSERTPSrm:
Simon Pilgrim025a3d852016-02-01 22:05:50 +0000273 case X86::VINSERTPSzrm:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000274 DestName = getRegName(MI->getOperand(0).getReg());
275 Src1Name = getRegName(MI->getOperand(1).getReg());
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000276 if (MI->getOperand(NumOperands - 1).isImm())
277 DecodeINSERTPSMask(MI->getOperand(NumOperands - 1).getImm(),
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000278 ShuffleMask);
279 break;
280
281 case X86::MOVLHPSrr:
282 case X86::VMOVLHPSrr:
Simon Pilgrimd5a15442015-11-21 13:04:42 +0000283 case X86::VMOVLHPSZrr:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000284 Src2Name = getRegName(MI->getOperand(2).getReg());
285 Src1Name = getRegName(MI->getOperand(1).getReg());
286 DestName = getRegName(MI->getOperand(0).getReg());
287 DecodeMOVLHPSMask(2, ShuffleMask);
288 break;
289
290 case X86::MOVHLPSrr:
291 case X86::VMOVHLPSrr:
Simon Pilgrimd5a15442015-11-21 13:04:42 +0000292 case X86::VMOVHLPSZrr:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000293 Src2Name = getRegName(MI->getOperand(2).getReg());
294 Src1Name = getRegName(MI->getOperand(1).getReg());
295 DestName = getRegName(MI->getOperand(0).getReg());
296 DecodeMOVHLPSMask(2, ShuffleMask);
297 break;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000298
Simon Pilgrima3d67442016-02-07 15:39:22 +0000299 case X86::MOVHPDrm:
300 case X86::VMOVHPDrm:
301 case X86::VMOVHPDZ128rm:
302 Src1Name = getRegName(MI->getOperand(1).getReg());
303 DestName = getRegName(MI->getOperand(0).getReg());
304 DecodeInsertElementMask(MVT::v2f64, 1, 1, ShuffleMask);
305 break;
306
307 case X86::MOVHPSrm:
308 case X86::VMOVHPSrm:
309 case X86::VMOVHPSZ128rm:
310 Src1Name = getRegName(MI->getOperand(1).getReg());
311 DestName = getRegName(MI->getOperand(0).getReg());
312 DecodeInsertElementMask(MVT::v4f32, 2, 2, ShuffleMask);
313 break;
314
315 case X86::MOVLPDrm:
316 case X86::VMOVLPDrm:
317 case X86::VMOVLPDZ128rm:
318 Src1Name = getRegName(MI->getOperand(1).getReg());
319 DestName = getRegName(MI->getOperand(0).getReg());
320 DecodeInsertElementMask(MVT::v2f64, 0, 1, ShuffleMask);
321 break;
322
323 case X86::MOVLPSrm:
324 case X86::VMOVLPSrm:
325 case X86::VMOVLPSZ128rm:
326 Src1Name = getRegName(MI->getOperand(1).getReg());
327 DestName = getRegName(MI->getOperand(0).getReg());
328 DecodeInsertElementMask(MVT::v4f32, 0, 2, ShuffleMask);
329 break;
330
Igor Breger24cab0f2015-11-16 07:22:00 +0000331 CASE_MOVDUP(MOVSLDUP, r)
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000332 Src1Name = getRegName(MI->getOperand(NumOperands - 1).getReg());
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000333 // FALL THROUGH.
Igor Breger1f782962015-11-19 08:26:56 +0000334 CASE_MOVDUP(MOVSLDUP, m)
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000335 DestName = getRegName(MI->getOperand(0).getReg());
Igor Breger1f782962015-11-19 08:26:56 +0000336 DecodeMOVSLDUPMask(getRegOperandVectorVT(MI, MVT::f32, 0), ShuffleMask);
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000337 break;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000338
Igor Breger24cab0f2015-11-16 07:22:00 +0000339 CASE_MOVDUP(MOVSHDUP, r)
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000340 Src1Name = getRegName(MI->getOperand(NumOperands - 1).getReg());
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000341 // FALL THROUGH.
Igor Breger1f782962015-11-19 08:26:56 +0000342 CASE_MOVDUP(MOVSHDUP, m)
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000343 DestName = getRegName(MI->getOperand(0).getReg());
Igor Breger1f782962015-11-19 08:26:56 +0000344 DecodeMOVSHDUPMask(getRegOperandVectorVT(MI, MVT::f32, 0), ShuffleMask);
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000345 break;
346
Igor Breger1f782962015-11-19 08:26:56 +0000347 CASE_MOVDUP(MOVDDUP, r)
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000348 Src1Name = getRegName(MI->getOperand(NumOperands - 1).getReg());
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000349 // FALL THROUGH.
Igor Breger1f782962015-11-19 08:26:56 +0000350 CASE_MOVDUP(MOVDDUP, m)
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000351 DestName = getRegName(MI->getOperand(0).getReg());
Igor Breger1f782962015-11-19 08:26:56 +0000352 DecodeMOVDDUPMask(getRegOperandVectorVT(MI, MVT::f64, 0), ShuffleMask);
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000353 break;
354
355 case X86::PSLLDQri:
356 case X86::VPSLLDQri:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000357 case X86::VPSLLDQYri:
Simon Pilgrim643734c2016-06-09 22:03:15 +0000358 case X86::VPSLLDQZ128rr:
359 case X86::VPSLLDQZ256rr:
360 case X86::VPSLLDQZ512rr:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000361 Src1Name = getRegName(MI->getOperand(1).getReg());
Simon Pilgrim643734c2016-06-09 22:03:15 +0000362 case X86::VPSLLDQZ128rm:
363 case X86::VPSLLDQZ256rm:
364 case X86::VPSLLDQZ512rm:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000365 DestName = getRegName(MI->getOperand(0).getReg());
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000366 if (MI->getOperand(NumOperands - 1).isImm())
Simon Pilgrimb9ada272015-11-16 22:54:41 +0000367 DecodePSLLDQMask(getRegOperandVectorVT(MI, MVT::i8, 0),
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000368 MI->getOperand(NumOperands - 1).getImm(),
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000369 ShuffleMask);
370 break;
371
372 case X86::PSRLDQri:
373 case X86::VPSRLDQri:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000374 case X86::VPSRLDQYri:
Simon Pilgrim643734c2016-06-09 22:03:15 +0000375 case X86::VPSRLDQZ128rr:
376 case X86::VPSRLDQZ256rr:
377 case X86::VPSRLDQZ512rr:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000378 Src1Name = getRegName(MI->getOperand(1).getReg());
Simon Pilgrim643734c2016-06-09 22:03:15 +0000379 case X86::VPSRLDQZ128rm:
380 case X86::VPSRLDQZ256rm:
381 case X86::VPSRLDQZ512rm:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000382 DestName = getRegName(MI->getOperand(0).getReg());
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000383 if (MI->getOperand(NumOperands - 1).isImm())
Simon Pilgrimb9ada272015-11-16 22:54:41 +0000384 DecodePSRLDQMask(getRegOperandVectorVT(MI, MVT::i8, 0),
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000385 MI->getOperand(NumOperands - 1).getImm(),
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000386 ShuffleMask);
387 break;
388
Craig Topper7a299302016-06-09 07:06:38 +0000389 CASE_SHUF(PALIGNR, rri)
Craig Topper89c17612016-06-10 04:48:05 +0000390 Src1Name = getRegName(MI->getOperand(NumOperands - 2).getReg());
391 RegForm = true;
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000392 // FALL THROUGH.
Craig Topper7a299302016-06-09 07:06:38 +0000393 CASE_SHUF(PALIGNR, rmi)
Craig Topper89c17612016-06-10 04:48:05 +0000394 Src2Name = getRegName(MI->getOperand(NumOperands-(RegForm?3:7)).getReg());
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000395 DestName = getRegName(MI->getOperand(0).getReg());
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000396 if (MI->getOperand(NumOperands - 1).isImm())
Simon Pilgrimb9ada272015-11-16 22:54:41 +0000397 DecodePALIGNRMask(getRegOperandVectorVT(MI, MVT::i8, 0),
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000398 MI->getOperand(NumOperands - 1).getImm(),
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000399 ShuffleMask);
400 break;
401
Craig Topper01f53b12016-06-03 05:31:00 +0000402 CASE_SHUF(PSHUFD, ri)
Craig Topper6f7288d2016-06-09 07:49:08 +0000403 Src1Name = getRegName(MI->getOperand(NumOperands - 2).getReg());
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000404 // FALL THROUGH.
Craig Topper01f53b12016-06-03 05:31:00 +0000405 CASE_SHUF(PSHUFD, mi)
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000406 DestName = getRegName(MI->getOperand(0).getReg());
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000407 if (MI->getOperand(NumOperands - 1).isImm())
Simon Pilgrim5883a732015-11-16 22:39:27 +0000408 DecodePSHUFMask(getRegOperandVectorVT(MI, MVT::i32, 0),
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000409 MI->getOperand(NumOperands - 1).getImm(),
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000410 ShuffleMask);
411 break;
412
Craig Topper01f53b12016-06-03 05:31:00 +0000413 CASE_SHUF(PSHUFHW, ri)
Craig Topper6f7288d2016-06-09 07:49:08 +0000414 Src1Name = getRegName(MI->getOperand(NumOperands - 2).getReg());
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000415 // FALL THROUGH.
Craig Topper01f53b12016-06-03 05:31:00 +0000416 CASE_SHUF(PSHUFHW, mi)
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000417 DestName = getRegName(MI->getOperand(0).getReg());
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000418 if (MI->getOperand(NumOperands - 1).isImm())
Simon Pilgrim5883a732015-11-16 22:39:27 +0000419 DecodePSHUFHWMask(getRegOperandVectorVT(MI, MVT::i16, 0),
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000420 MI->getOperand(NumOperands - 1).getImm(),
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000421 ShuffleMask);
422 break;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000423
Craig Topper01f53b12016-06-03 05:31:00 +0000424 CASE_SHUF(PSHUFLW, ri)
Craig Topper6f7288d2016-06-09 07:49:08 +0000425 Src1Name = getRegName(MI->getOperand(NumOperands - 2).getReg());
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000426 // FALL THROUGH.
Craig Topper01f53b12016-06-03 05:31:00 +0000427 CASE_SHUF(PSHUFLW, mi)
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000428 DestName = getRegName(MI->getOperand(0).getReg());
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000429 if (MI->getOperand(NumOperands - 1).isImm())
Simon Pilgrim5883a732015-11-16 22:39:27 +0000430 DecodePSHUFLWMask(getRegOperandVectorVT(MI, MVT::i16, 0),
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000431 MI->getOperand(NumOperands - 1).getImm(),
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000432 ShuffleMask);
433 break;
434
Simon Pilgrimf8f86ab2015-09-13 11:28:45 +0000435 case X86::MMX_PSHUFWri:
436 Src1Name = getRegName(MI->getOperand(1).getReg());
437 // FALL THROUGH.
438 case X86::MMX_PSHUFWmi:
439 DestName = getRegName(MI->getOperand(0).getReg());
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000440 if (MI->getOperand(NumOperands - 1).isImm())
Simon Pilgrimf8f86ab2015-09-13 11:28:45 +0000441 DecodePSHUFMask(MVT::v4i16,
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000442 MI->getOperand(NumOperands - 1).getImm(),
Simon Pilgrimf8f86ab2015-09-13 11:28:45 +0000443 ShuffleMask);
444 break;
445
446 case X86::PSWAPDrr:
447 Src1Name = getRegName(MI->getOperand(1).getReg());
448 // FALL THROUGH.
449 case X86::PSWAPDrm:
450 DestName = getRegName(MI->getOperand(0).getReg());
451 DecodePSWAPMask(MVT::v2i32, ShuffleMask);
452 break;
453
Simon Pilgrim8483df62015-11-17 22:35:45 +0000454 CASE_UNPCK(PUNPCKHBW, r)
Simon Pilgrimf8f86ab2015-09-13 11:28:45 +0000455 case X86::MMX_PUNPCKHBWirr:
Craig Topper89c17612016-06-10 04:48:05 +0000456 Src2Name = getRegName(MI->getOperand(NumOperands - 1).getReg());
457 RegForm = true;
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000458 // FALL THROUGH.
Simon Pilgrim8483df62015-11-17 22:35:45 +0000459 CASE_UNPCK(PUNPCKHBW, m)
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000460 case X86::MMX_PUNPCKHBWirm:
Craig Topper89c17612016-06-10 04:48:05 +0000461 Src1Name = getRegName(MI->getOperand(NumOperands-(RegForm?2:6)).getReg());
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000462 DestName = getRegName(MI->getOperand(0).getReg());
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000463 DecodeUNPCKHMask(getRegOperandVectorVT(MI, MVT::i8, 0), ShuffleMask);
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000464 break;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000465
Simon Pilgrim8483df62015-11-17 22:35:45 +0000466 CASE_UNPCK(PUNPCKHWD, r)
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000467 case X86::MMX_PUNPCKHWDirr:
Craig Topper89c17612016-06-10 04:48:05 +0000468 Src2Name = getRegName(MI->getOperand(NumOperands - 1).getReg());
469 RegForm = true;
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000470 // FALL THROUGH.
Simon Pilgrim8483df62015-11-17 22:35:45 +0000471 CASE_UNPCK(PUNPCKHWD, m)
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000472 case X86::MMX_PUNPCKHWDirm:
Craig Topper89c17612016-06-10 04:48:05 +0000473 Src1Name = getRegName(MI->getOperand(NumOperands-(RegForm?2:6)).getReg());
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000474 DestName = getRegName(MI->getOperand(0).getReg());
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000475 DecodeUNPCKHMask(getRegOperandVectorVT(MI, MVT::i16, 0), ShuffleMask);
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000476 break;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000477
Simon Pilgrim8483df62015-11-17 22:35:45 +0000478 CASE_UNPCK(PUNPCKHDQ, r)
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000479 case X86::MMX_PUNPCKHDQirr:
Craig Topper89c17612016-06-10 04:48:05 +0000480 Src2Name = getRegName(MI->getOperand(NumOperands - 1).getReg());
481 RegForm = true;
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000482 // FALL THROUGH.
Simon Pilgrim8483df62015-11-17 22:35:45 +0000483 CASE_UNPCK(PUNPCKHDQ, m)
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000484 case X86::MMX_PUNPCKHDQirm:
Craig Topper89c17612016-06-10 04:48:05 +0000485 Src1Name = getRegName(MI->getOperand(NumOperands-(RegForm?2:6)).getReg());
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000486 DestName = getRegName(MI->getOperand(0).getReg());
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000487 DecodeUNPCKHMask(getRegOperandVectorVT(MI, MVT::i32, 0), ShuffleMask);
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000488 break;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000489
Simon Pilgrim8483df62015-11-17 22:35:45 +0000490 CASE_UNPCK(PUNPCKHQDQ, r)
Craig Topper89c17612016-06-10 04:48:05 +0000491 Src2Name = getRegName(MI->getOperand(NumOperands - 1).getReg());
492 RegForm = true;
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000493 // FALL THROUGH.
Simon Pilgrim8483df62015-11-17 22:35:45 +0000494 CASE_UNPCK(PUNPCKHQDQ, m)
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::i64, 0), ShuffleMask);
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000498 break;
499
Simon Pilgrim8483df62015-11-17 22:35:45 +0000500 CASE_UNPCK(PUNPCKLBW, r)
Simon Pilgrimf8f86ab2015-09-13 11:28:45 +0000501 case X86::MMX_PUNPCKLBWirr:
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(PUNPCKLBW, m)
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000506 case X86::MMX_PUNPCKLBWirm:
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 DecodeUNPCKLMask(getRegOperandVectorVT(MI, MVT::i8, 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(PUNPCKLWD, r)
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000513 case X86::MMX_PUNPCKLWDirr:
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(PUNPCKLWD, m)
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000518 case X86::MMX_PUNPCKLWDirm:
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 DecodeUNPCKLMask(getRegOperandVectorVT(MI, MVT::i16, 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(PUNPCKLDQ, r)
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000525 case X86::MMX_PUNPCKLDQirr:
Craig Topper89c17612016-06-10 04:48:05 +0000526 Src2Name = getRegName(MI->getOperand(NumOperands - 1).getReg());
527 RegForm = true;
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000528 // FALL THROUGH.
Simon Pilgrim8483df62015-11-17 22:35:45 +0000529 CASE_UNPCK(PUNPCKLDQ, m)
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000530 case X86::MMX_PUNPCKLDQirm:
Craig Topper89c17612016-06-10 04:48:05 +0000531 Src1Name = getRegName(MI->getOperand(NumOperands-(RegForm?2:6)).getReg());
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000532 DestName = getRegName(MI->getOperand(0).getReg());
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000533 DecodeUNPCKLMask(getRegOperandVectorVT(MI, MVT::i32, 0), ShuffleMask);
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000534 break;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000535
Simon Pilgrim8483df62015-11-17 22:35:45 +0000536 CASE_UNPCK(PUNPCKLQDQ, r)
Craig Topper89c17612016-06-10 04:48:05 +0000537 Src2Name = getRegName(MI->getOperand(NumOperands - 1).getReg());
538 RegForm = true;
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000539 // FALL THROUGH.
Simon Pilgrim8483df62015-11-17 22:35:45 +0000540 CASE_UNPCK(PUNPCKLQDQ, m)
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::i64, 0), ShuffleMask);
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000544 break;
545
Craig Topper01f53b12016-06-03 05:31:00 +0000546 CASE_SHUF(SHUFPD, rri)
Craig Topper89c17612016-06-10 04:48:05 +0000547 Src2Name = getRegName(MI->getOperand(NumOperands - 2).getReg());
548 RegForm = true;
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000549 // FALL THROUGH.
Craig Topper01f53b12016-06-03 05:31:00 +0000550 CASE_SHUF(SHUFPD, rmi)
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000551 if (MI->getOperand(NumOperands - 1).isImm())
Simon Pilgrim5883a732015-11-16 22:39:27 +0000552 DecodeSHUFPMask(getRegOperandVectorVT(MI, MVT::f64, 0),
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000553 MI->getOperand(NumOperands - 1).getImm(),
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000554 ShuffleMask);
Craig Topper89c17612016-06-10 04:48:05 +0000555 Src1Name = getRegName(MI->getOperand(NumOperands-(RegForm?3:7)).getReg());
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000556 DestName = getRegName(MI->getOperand(0).getReg());
557 break;
558
Craig Topper01f53b12016-06-03 05:31:00 +0000559 CASE_SHUF(SHUFPS, rri)
Craig Topper89c17612016-06-10 04:48:05 +0000560 Src2Name = getRegName(MI->getOperand(NumOperands - 2).getReg());
561 RegForm = true;
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000562 // FALL THROUGH.
Craig Topper01f53b12016-06-03 05:31:00 +0000563 CASE_SHUF(SHUFPS, rmi)
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000564 if (MI->getOperand(NumOperands - 1).isImm())
Simon Pilgrim5883a732015-11-16 22:39:27 +0000565 DecodeSHUFPMask(getRegOperandVectorVT(MI, MVT::f32, 0),
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000566 MI->getOperand(NumOperands - 1).getImm(),
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000567 ShuffleMask);
Craig Topper89c17612016-06-10 04:48:05 +0000568 Src1Name = getRegName(MI->getOperand(NumOperands-(RegForm?3:7)).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
Igor Breger24cab0f2015-11-16 07:22:00 +0000572 CASE_VSHUF(64X2, r)
Simon Pilgrimd3869412016-06-11 11:18:38 +0000573 Src2Name = getRegName(MI->getOperand(NumOperands - 2).getReg());
574 RegForm = true;
575 // FALL THROUGH.
Igor Breger24cab0f2015-11-16 07:22:00 +0000576 CASE_VSHUF(64X2, m)
Simon Pilgrimd3869412016-06-11 11:18:38 +0000577 decodeVSHUF64x2FamilyMask(getRegOperandVectorVT(MI, MVT::i64, 0),
578 MI->getOperand(NumOperands - 1).getImm(),
Igor Bregerd7bae452015-10-15 13:29:07 +0000579 ShuffleMask);
Simon Pilgrimd3869412016-06-11 11:18:38 +0000580 Src1Name = getRegName(MI->getOperand(NumOperands-(RegForm?3:7)).getReg());
Igor Bregerd7bae452015-10-15 13:29:07 +0000581 DestName = getRegName(MI->getOperand(0).getReg());
Igor Bregerd7bae452015-10-15 13:29:07 +0000582 break;
Simon Pilgrimd3869412016-06-11 11:18:38 +0000583
584 CASE_VSHUF(32X4, r)
585 Src2Name = getRegName(MI->getOperand(NumOperands - 2).getReg());
586 RegForm = true;
587 // FALL THROUGH.
588 CASE_VSHUF(32X4, m)
589 decodeVSHUF64x2FamilyMask(getRegOperandVectorVT(MI, MVT::i32, 0),
590 MI->getOperand(NumOperands - 1).getImm(),
591 ShuffleMask);
592 Src1Name = getRegName(MI->getOperand(NumOperands-(RegForm?3:7)).getReg());
593 DestName = getRegName(MI->getOperand(0).getReg());
594 break;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000595
Simon Pilgrim8483df62015-11-17 22:35:45 +0000596 CASE_UNPCK(UNPCKLPD, r)
Craig Topper89c17612016-06-10 04:48:05 +0000597 Src2Name = getRegName(MI->getOperand(NumOperands - 1).getReg());
598 RegForm = true;
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000599 // FALL THROUGH.
Simon Pilgrim8483df62015-11-17 22:35:45 +0000600 CASE_UNPCK(UNPCKLPD, m)
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000601 DecodeUNPCKLMask(getRegOperandVectorVT(MI, MVT::f64, 0), ShuffleMask);
Craig Topper89c17612016-06-10 04:48:05 +0000602 Src1Name = getRegName(MI->getOperand(NumOperands-(RegForm?2:6)).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
Simon Pilgrim8483df62015-11-17 22:35:45 +0000606 CASE_UNPCK(UNPCKLPS, r)
Craig Topper89c17612016-06-10 04:48:05 +0000607 Src2Name = getRegName(MI->getOperand(NumOperands - 1).getReg());
608 RegForm = true;
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000609 // FALL THROUGH.
Simon Pilgrim8483df62015-11-17 22:35:45 +0000610 CASE_UNPCK(UNPCKLPS, m)
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000611 DecodeUNPCKLMask(getRegOperandVectorVT(MI, MVT::f32, 0), ShuffleMask);
Craig Topper89c17612016-06-10 04:48:05 +0000612 Src1Name = getRegName(MI->getOperand(NumOperands-(RegForm?2:6)).getReg());
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000613 DestName = getRegName(MI->getOperand(0).getReg());
614 break;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000615
Simon Pilgrim8483df62015-11-17 22:35:45 +0000616 CASE_UNPCK(UNPCKHPD, r)
Craig Topper89c17612016-06-10 04:48:05 +0000617 Src2Name = getRegName(MI->getOperand(NumOperands - 1).getReg());
618 RegForm = true;
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000619 // FALL THROUGH.
Simon Pilgrim8483df62015-11-17 22:35:45 +0000620 CASE_UNPCK(UNPCKHPD, m)
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000621 DecodeUNPCKHMask(getRegOperandVectorVT(MI, MVT::f64, 0), ShuffleMask);
Craig Topper89c17612016-06-10 04:48:05 +0000622 Src1Name = getRegName(MI->getOperand(NumOperands-(RegForm?2:6)).getReg());
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000623 DestName = getRegName(MI->getOperand(0).getReg());
624 break;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000625
Simon Pilgrim8483df62015-11-17 22:35:45 +0000626 CASE_UNPCK(UNPCKHPS, r)
Craig Topper89c17612016-06-10 04:48:05 +0000627 Src2Name = getRegName(MI->getOperand(NumOperands - 1).getReg());
628 RegForm = true;
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000629 // FALL THROUGH.
Simon Pilgrim8483df62015-11-17 22:35:45 +0000630 CASE_UNPCK(UNPCKHPS, m)
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000631 DecodeUNPCKHMask(getRegOperandVectorVT(MI, MVT::f32, 0), ShuffleMask);
Craig Topper89c17612016-06-10 04:48:05 +0000632 Src1Name = getRegName(MI->getOperand(NumOperands-(RegForm?2:6)).getReg());
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000633 DestName = getRegName(MI->getOperand(0).getReg());
634 break;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000635
Simon Pilgrim2da41782015-11-17 23:29:49 +0000636 CASE_VPERM(PERMILPS, r)
Simon Pilgrim6ce35dd2016-05-11 18:53:44 +0000637 Src1Name = getRegName(MI->getOperand(NumOperands - 2).getReg());
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000638 // FALL THROUGH.
Simon Pilgrim2da41782015-11-17 23:29:49 +0000639 CASE_VPERM(PERMILPS, m)
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000640 if (MI->getOperand(NumOperands - 1).isImm())
Simon Pilgrim5883a732015-11-16 22:39:27 +0000641 DecodePSHUFMask(getRegOperandVectorVT(MI, MVT::f32, 0),
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000642 MI->getOperand(NumOperands - 1).getImm(),
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000643 ShuffleMask);
644 DestName = getRegName(MI->getOperand(0).getReg());
645 break;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000646
Simon Pilgrim2da41782015-11-17 23:29:49 +0000647 CASE_VPERM(PERMILPD, r)
Simon Pilgrim6ce35dd2016-05-11 18:53:44 +0000648 Src1Name = getRegName(MI->getOperand(NumOperands - 2).getReg());
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000649 // FALL THROUGH.
Simon Pilgrim2da41782015-11-17 23:29:49 +0000650 CASE_VPERM(PERMILPD, m)
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000651 if (MI->getOperand(NumOperands - 1).isImm())
Simon Pilgrim5883a732015-11-16 22:39:27 +0000652 DecodePSHUFMask(getRegOperandVectorVT(MI, MVT::f64, 0),
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000653 MI->getOperand(NumOperands - 1).getImm(),
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000654 ShuffleMask);
655 DestName = getRegName(MI->getOperand(0).getReg());
656 break;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000657
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000658 case X86::VPERM2F128rr:
659 case X86::VPERM2I128rr:
660 Src2Name = getRegName(MI->getOperand(2).getReg());
661 // FALL THROUGH.
662 case X86::VPERM2F128rm:
663 case X86::VPERM2I128rm:
664 // For instruction comments purpose, assume the 256-bit vector is v4i64.
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000665 if (MI->getOperand(NumOperands - 1).isImm())
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000666 DecodeVPERM2X128Mask(MVT::v4i64,
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000667 MI->getOperand(NumOperands - 1).getImm(),
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000668 ShuffleMask);
669 Src1Name = getRegName(MI->getOperand(1).getReg());
670 DestName = getRegName(MI->getOperand(0).getReg());
671 break;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000672
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000673 case X86::VPERMQYri:
Craig Topper22ae3532016-05-21 06:07:18 +0000674 case X86::VPERMQZ256ri:
Craig Topper200d2372016-06-10 05:12:40 +0000675 case X86::VPERMQZ256rik:
676 case X86::VPERMQZ256rikz:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000677 case X86::VPERMPDYri:
Craig Topper22ae3532016-05-21 06:07:18 +0000678 case X86::VPERMPDZ256ri:
Craig Topper200d2372016-06-10 05:12:40 +0000679 case X86::VPERMPDZ256rik:
680 case X86::VPERMPDZ256rikz:
681 Src1Name = getRegName(MI->getOperand(NumOperands - 2).getReg());
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000682 // FALL THROUGH.
683 case X86::VPERMQYmi:
Craig Topper22ae3532016-05-21 06:07:18 +0000684 case X86::VPERMQZ256mi:
Craig Topper200d2372016-06-10 05:12:40 +0000685 case X86::VPERMQZ256mik:
686 case X86::VPERMQZ256mikz:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000687 case X86::VPERMPDYmi:
Craig Topper22ae3532016-05-21 06:07:18 +0000688 case X86::VPERMPDZ256mi:
Craig Topper200d2372016-06-10 05:12:40 +0000689 case X86::VPERMPDZ256mik:
690 case X86::VPERMPDZ256mikz:
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000691 if (MI->getOperand(NumOperands - 1).isImm())
692 DecodeVPERMMask(MI->getOperand(NumOperands - 1).getImm(),
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000693 ShuffleMask);
694 DestName = getRegName(MI->getOperand(0).getReg());
695 break;
696
697 case X86::MOVSDrr:
698 case X86::VMOVSDrr:
Simon Pilgrimf5c23ad2016-02-01 22:26:28 +0000699 case X86::VMOVSDZrr:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000700 Src2Name = getRegName(MI->getOperand(2).getReg());
701 Src1Name = getRegName(MI->getOperand(1).getReg());
702 // FALL THROUGH.
703 case X86::MOVSDrm:
704 case X86::VMOVSDrm:
Simon Pilgrimf5c23ad2016-02-01 22:26:28 +0000705 case X86::VMOVSDZrm:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000706 DecodeScalarMoveMask(MVT::v2f64, nullptr == Src2Name, ShuffleMask);
707 DestName = getRegName(MI->getOperand(0).getReg());
708 break;
Simon Pilgrimd5a15442015-11-21 13:04:42 +0000709
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000710 case X86::MOVSSrr:
711 case X86::VMOVSSrr:
Simon Pilgrimf5c23ad2016-02-01 22:26:28 +0000712 case X86::VMOVSSZrr:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000713 Src2Name = getRegName(MI->getOperand(2).getReg());
714 Src1Name = getRegName(MI->getOperand(1).getReg());
715 // FALL THROUGH.
716 case X86::MOVSSrm:
717 case X86::VMOVSSrm:
Simon Pilgrimf5c23ad2016-02-01 22:26:28 +0000718 case X86::VMOVSSZrm:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000719 DecodeScalarMoveMask(MVT::v4f32, nullptr == Src2Name, ShuffleMask);
720 DestName = getRegName(MI->getOperand(0).getReg());
721 break;
722
723 case X86::MOVPQI2QIrr:
Simon Pilgrim3e0c0222015-12-13 12:49:48 +0000724 case X86::MOVZPQILo2PQIrr:
725 case X86::VMOVPQI2QIrr:
726 case X86::VMOVZPQILo2PQIrr:
727 case X86::VMOVZPQILo2PQIZrr:
728 Src1Name = getRegName(MI->getOperand(1).getReg());
729 // FALL THROUGH.
730 case X86::MOVQI2PQIrm:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000731 case X86::MOVZQI2PQIrm:
732 case X86::MOVZPQILo2PQIrm:
Simon Pilgrim3e0c0222015-12-13 12:49:48 +0000733 case X86::VMOVQI2PQIrm:
Simon Pilgrim96fe4ef2016-02-02 13:32:56 +0000734 case X86::VMOVQI2PQIZrm:
Simon Pilgrim3e0c0222015-12-13 12:49:48 +0000735 case X86::VMOVZQI2PQIrm:
736 case X86::VMOVZPQILo2PQIrm:
737 case X86::VMOVZPQILo2PQIZrm:
738 DecodeZeroMoveLowMask(MVT::v2i64, ShuffleMask);
739 DestName = getRegName(MI->getOperand(0).getReg());
740 break;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000741
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000742 case X86::MOVDI2PDIrm:
743 case X86::VMOVDI2PDIrm:
Simon Pilgrim5be17b62016-02-01 23:04:05 +0000744 case X86::VMOVDI2PDIZrm:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000745 DecodeZeroMoveLowMask(MVT::v4i32, ShuffleMask);
746 DestName = getRegName(MI->getOperand(0).getReg());
747 break;
748
Simon Pilgrimd85cae32015-07-06 20:46:41 +0000749 case X86::EXTRQI:
750 if (MI->getOperand(2).isImm() &&
751 MI->getOperand(3).isImm())
752 DecodeEXTRQIMask(MI->getOperand(2).getImm(),
753 MI->getOperand(3).getImm(),
754 ShuffleMask);
755
756 DestName = getRegName(MI->getOperand(0).getReg());
757 Src1Name = getRegName(MI->getOperand(1).getReg());
758 break;
759
760 case X86::INSERTQI:
761 if (MI->getOperand(3).isImm() &&
762 MI->getOperand(4).isImm())
763 DecodeINSERTQIMask(MI->getOperand(3).getImm(),
764 MI->getOperand(4).getImm(),
765 ShuffleMask);
766
767 DestName = getRegName(MI->getOperand(0).getReg());
768 Src1Name = getRegName(MI->getOperand(1).getReg());
769 Src2Name = getRegName(MI->getOperand(2).getReg());
770 break;
771
Simon Pilgrim0acc32a2016-02-06 19:51:21 +0000772 CASE_PMOVZX(PMOVZXBW, r)
773 CASE_PMOVZX(PMOVZXBD, r)
774 CASE_PMOVZX(PMOVZXBQ, r)
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000775 Src1Name = getRegName(MI->getOperand(NumOperands - 1).getReg());
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000776 // FALL THROUGH.
Simon Pilgrim0acc32a2016-02-06 19:51:21 +0000777 CASE_PMOVZX(PMOVZXBW, m)
778 CASE_PMOVZX(PMOVZXBD, m)
779 CASE_PMOVZX(PMOVZXBQ, m)
Simon Pilgrime1b6db92016-02-06 16:33:42 +0000780 DecodeZeroExtendMask(MVT::i8, getZeroExtensionResultType(MI), ShuffleMask);
781 DestName = getRegName(MI->getOperand(0).getReg());
782 break;
783
Simon Pilgrim0acc32a2016-02-06 19:51:21 +0000784 CASE_PMOVZX(PMOVZXWD, r)
785 CASE_PMOVZX(PMOVZXWQ, r)
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000786 Src1Name = getRegName(MI->getOperand(NumOperands - 1).getReg());
Simon Pilgrime1b6db92016-02-06 16:33:42 +0000787 // FALL THROUGH.
Simon Pilgrim0acc32a2016-02-06 19:51:21 +0000788 CASE_PMOVZX(PMOVZXWD, m)
789 CASE_PMOVZX(PMOVZXWQ, m)
Simon Pilgrime1b6db92016-02-06 16:33:42 +0000790 DecodeZeroExtendMask(MVT::i16, getZeroExtensionResultType(MI), ShuffleMask);
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000791 DestName = getRegName(MI->getOperand(0).getReg());
Simon Pilgrime1b6db92016-02-06 16:33:42 +0000792 break;
793
Simon Pilgrim0acc32a2016-02-06 19:51:21 +0000794 CASE_PMOVZX(PMOVZXDQ, r)
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000795 Src1Name = getRegName(MI->getOperand(NumOperands - 1).getReg());
Simon Pilgrime1b6db92016-02-06 16:33:42 +0000796 // FALL THROUGH.
Simon Pilgrim0acc32a2016-02-06 19:51:21 +0000797 CASE_PMOVZX(PMOVZXDQ, m)
Simon Pilgrime1b6db92016-02-06 16:33:42 +0000798 DecodeZeroExtendMask(MVT::i32, getZeroExtensionResultType(MI), ShuffleMask);
799 DestName = getRegName(MI->getOperand(0).getReg());
800 break;
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000801 }
802
803 // The only comments we decode are shuffles, so give up if we were unable to
804 // decode a shuffle mask.
805 if (ShuffleMask.empty())
806 return false;
807
808 if (!DestName) DestName = Src1Name;
Simon Pilgrim7c2fbdc2016-07-03 13:08:29 +0000809 OS << (DestName ? getMaskName(MI, DestName, getRegName) : "mem") << " = ";
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000810
811 // If the two sources are the same, canonicalize the input elements to be
812 // from the first src so that we get larger element spans.
813 if (Src1Name == Src2Name) {
814 for (unsigned i = 0, e = ShuffleMask.size(); i != e; ++i) {
815 if ((int)ShuffleMask[i] >= 0 && // Not sentinel.
NAKAMURA Takumi5582a6a2015-05-25 01:43:34 +0000816 ShuffleMask[i] >= (int)e) // From second mask.
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000817 ShuffleMask[i] -= e;
818 }
819 }
820
821 // The shuffle mask specifies which elements of the src1/src2 fill in the
822 // destination, with a few sentinel values. Loop through and print them
823 // out.
824 for (unsigned i = 0, e = ShuffleMask.size(); i != e; ++i) {
825 if (i != 0)
826 OS << ',';
827 if (ShuffleMask[i] == SM_SentinelZero) {
828 OS << "zero";
829 continue;
830 }
831
832 // Otherwise, it must come from src1 or src2. Print the span of elements
833 // that comes from this src.
834 bool isSrc1 = ShuffleMask[i] < (int)ShuffleMask.size();
835 const char *SrcName = isSrc1 ? Src1Name : Src2Name;
836 OS << (SrcName ? SrcName : "mem") << '[';
837 bool IsFirst = true;
838 while (i != e && (int)ShuffleMask[i] != SM_SentinelZero &&
839 (ShuffleMask[i] < (int)ShuffleMask.size()) == isSrc1) {
840 if (!IsFirst)
841 OS << ',';
842 else
843 IsFirst = false;
844 if (ShuffleMask[i] == SM_SentinelUndef)
845 OS << "u";
846 else
847 OS << ShuffleMask[i] % ShuffleMask.size();
848 ++i;
849 }
850 OS << ']';
NAKAMURA Takumi5582a6a2015-05-25 01:43:34 +0000851 --i; // For loop increments element #.
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000852 }
853 //MI->print(OS, 0);
854 OS << "\n";
855
856 // We successfully added a comment to this instruction.
857 return true;
858}