blob: 36fd7d633bfe1c712568f39bb64d543dca6975a6 [file] [log] [blame]
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +00001//===-- X86InstComments.cpp - Generate verbose-asm comments for instrs ----===//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9//
10// This defines functionality used to emit comments about X86 instructions to
11// an output stream for -fverbose-asm.
12//
13//===----------------------------------------------------------------------===//
14
15#include "X86InstComments.h"
16#include "MCTargetDesc/X86MCTargetDesc.h"
17#include "Utils/X86ShuffleDecode.h"
18#include "llvm/MC/MCInst.h"
19#include "llvm/CodeGen/MachineValueType.h"
20#include "llvm/Support/raw_ostream.h"
21
22using namespace llvm;
23
Simon Pilgrim41c05c02016-05-11 11:55:12 +000024#define CASE_SSE_INS_COMMON(Inst, src) \
Simon Pilgrimbfa5f232016-02-06 17:02:15 +000025 case X86::Inst##src:
26
Simon Pilgrim41c05c02016-05-11 11:55:12 +000027#define CASE_AVX_INS_COMMON(Inst, Suffix, src) \
Simon Pilgrimbfa5f232016-02-06 17:02:15 +000028 case X86::V##Inst##Suffix##src:
29
Simon Pilgrim41c05c02016-05-11 11:55:12 +000030#define CASE_MASK_INS_COMMON(Inst, Suffix, src) \
31 case X86::V##Inst##Suffix##src##k:
32
33#define CASE_MASKZ_INS_COMMON(Inst, Suffix, src) \
34 case X86::V##Inst##Suffix##src##kz:
35
36#define CASE_AVX512_INS_COMMON(Inst, Suffix, src) \
37 CASE_AVX_INS_COMMON(Inst, Suffix, src) \
38 CASE_MASK_INS_COMMON(Inst, Suffix, src) \
39 CASE_MASKZ_INS_COMMON(Inst, Suffix, src)
40
41#define CASE_MOVDUP(Inst, src) \
42 CASE_AVX512_INS_COMMON(Inst, Z, r##src) \
43 CASE_AVX512_INS_COMMON(Inst, Z256, r##src) \
44 CASE_AVX512_INS_COMMON(Inst, Z128, r##src) \
45 CASE_AVX_INS_COMMON(Inst, , r##src) \
46 CASE_AVX_INS_COMMON(Inst, Y, r##src) \
Simon Pilgrimbfa5f232016-02-06 17:02:15 +000047 CASE_SSE_INS_COMMON(Inst, r##src)
48
Simon Pilgrim41c05c02016-05-11 11:55:12 +000049#define CASE_PMOVZX(Inst, src) \
50 CASE_AVX512_INS_COMMON(Inst, Z, r##src) \
51 CASE_AVX512_INS_COMMON(Inst, Z256, r##src) \
52 CASE_AVX512_INS_COMMON(Inst, Z128, r##src) \
53 CASE_AVX_INS_COMMON(Inst, , r##src) \
54 CASE_AVX_INS_COMMON(Inst, Y, r##src) \
Simon Pilgrim0acc32a2016-02-06 19:51:21 +000055 CASE_SSE_INS_COMMON(Inst, r##src)
56
Simon Pilgrim41c05c02016-05-11 11:55:12 +000057#define CASE_UNPCK(Inst, src) \
58 CASE_AVX512_INS_COMMON(Inst, Z, r##src) \
59 CASE_AVX512_INS_COMMON(Inst, Z256, r##src) \
60 CASE_AVX512_INS_COMMON(Inst, Z128, r##src) \
61 CASE_AVX_INS_COMMON(Inst, , r##src) \
62 CASE_AVX_INS_COMMON(Inst, Y, r##src) \
Simon Pilgrimbfa5f232016-02-06 17:02:15 +000063 CASE_SSE_INS_COMMON(Inst, r##src)
64
Craig Topper01f53b12016-06-03 05:31:00 +000065#define CASE_SHUF(Inst, suf) \
66 CASE_AVX512_INS_COMMON(Inst, Z, suf) \
67 CASE_AVX512_INS_COMMON(Inst, Z256, suf) \
68 CASE_AVX512_INS_COMMON(Inst, Z128, suf) \
69 CASE_AVX_INS_COMMON(Inst, , suf) \
70 CASE_AVX_INS_COMMON(Inst, Y, suf) \
71 CASE_SSE_INS_COMMON(Inst, suf)
Simon Pilgrimbfa5f232016-02-06 17:02:15 +000072
Simon Pilgrim41c05c02016-05-11 11:55:12 +000073#define CASE_VPERM(Inst, src) \
74 CASE_AVX512_INS_COMMON(Inst, Z, src##i) \
75 CASE_AVX512_INS_COMMON(Inst, Z256, src##i) \
76 CASE_AVX512_INS_COMMON(Inst, Z128, src##i) \
77 CASE_AVX_INS_COMMON(Inst, , src##i) \
Simon Pilgrimbfa5f232016-02-06 17:02:15 +000078 CASE_AVX_INS_COMMON(Inst, Y, src##i)
79
80#define CASE_VSHUF(Inst, src) \
Simon Pilgrim41c05c02016-05-11 11:55:12 +000081 CASE_AVX512_INS_COMMON(SHUFF##Inst, Z, r##src##i) \
82 CASE_AVX512_INS_COMMON(SHUFI##Inst, Z, r##src##i) \
83 CASE_AVX512_INS_COMMON(SHUFF##Inst, Z256, r##src##i) \
84 CASE_AVX512_INS_COMMON(SHUFI##Inst, Z256, r##src##i)
Simon Pilgrimbfa5f232016-02-06 17:02:15 +000085
Igor Breger24cab0f2015-11-16 07:22:00 +000086static unsigned getVectorRegSize(unsigned RegNo) {
Igor Breger24cab0f2015-11-16 07:22:00 +000087 if (X86::ZMM0 <= RegNo && RegNo <= X86::ZMM31)
88 return 512;
89 if (X86::YMM0 <= RegNo && RegNo <= X86::YMM31)
90 return 256;
91 if (X86::XMM0 <= RegNo && RegNo <= X86::XMM31)
92 return 128;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +000093 if (X86::MM0 <= RegNo && RegNo <= X86::MM7)
94 return 64;
Igor Breger24cab0f2015-11-16 07:22:00 +000095
96 llvm_unreachable("Unknown vector reg!");
Igor Breger24cab0f2015-11-16 07:22:00 +000097}
98
99static MVT getRegOperandVectorVT(const MCInst *MI, const MVT &ScalarVT,
100 unsigned OperandIndex) {
101 unsigned OpReg = MI->getOperand(OperandIndex).getReg();
102 return MVT::getVectorVT(ScalarVT,
103 getVectorRegSize(OpReg)/ScalarVT.getSizeInBits());
104}
105
Simon Pilgrime1b6db92016-02-06 16:33:42 +0000106/// \brief Extracts the dst type for a given zero extension instruction.
107static MVT getZeroExtensionResultType(const MCInst *MI) {
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000108 switch (MI->getOpcode()) {
109 default:
110 llvm_unreachable("Unknown zero extension instruction");
Simon Pilgrime1b6db92016-02-06 16:33:42 +0000111 // zero extension to i16
Simon Pilgrim0acc32a2016-02-06 19:51:21 +0000112 CASE_PMOVZX(PMOVZXBW, m)
113 CASE_PMOVZX(PMOVZXBW, r)
Simon Pilgrime1b6db92016-02-06 16:33:42 +0000114 return getRegOperandVectorVT(MI, MVT::i16, 0);
115 // zero extension to i32
Simon Pilgrim0acc32a2016-02-06 19:51:21 +0000116 CASE_PMOVZX(PMOVZXBD, m)
117 CASE_PMOVZX(PMOVZXBD, r)
118 CASE_PMOVZX(PMOVZXWD, m)
119 CASE_PMOVZX(PMOVZXWD, r)
Simon Pilgrime1b6db92016-02-06 16:33:42 +0000120 return getRegOperandVectorVT(MI, MVT::i32, 0);
121 // zero extension to i64
Simon Pilgrim0acc32a2016-02-06 19:51:21 +0000122 CASE_PMOVZX(PMOVZXBQ, m)
123 CASE_PMOVZX(PMOVZXBQ, r)
124 CASE_PMOVZX(PMOVZXWQ, m)
125 CASE_PMOVZX(PMOVZXWQ, r)
126 CASE_PMOVZX(PMOVZXDQ, m)
127 CASE_PMOVZX(PMOVZXDQ, r)
Simon Pilgrime1b6db92016-02-06 16:33:42 +0000128 return getRegOperandVectorVT(MI, MVT::i64, 0);
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000129 }
130}
131
132//===----------------------------------------------------------------------===//
133// Top Level Entrypoint
134//===----------------------------------------------------------------------===//
135
136/// EmitAnyX86InstComments - This function decodes x86 instructions and prints
137/// newline terminated strings to the specified string if desired. This
138/// information is shown in disassembly dumps when verbose assembly is enabled.
139bool llvm::EmitAnyX86InstComments(const MCInst *MI, raw_ostream &OS,
140 const char *(*getRegName)(unsigned)) {
141 // If this is a shuffle operation, the switch should fill in this state.
142 SmallVector<int, 8> ShuffleMask;
143 const char *DestName = nullptr, *Src1Name = nullptr, *Src2Name = nullptr;
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000144 unsigned NumOperands = MI->getNumOperands();
Craig Topper89c17612016-06-10 04:48:05 +0000145 bool RegForm = false;
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000146
147 switch (MI->getOpcode()) {
148 default:
149 // Not an instruction for which we can decode comments.
150 return false;
151
152 case X86::BLENDPDrri:
153 case X86::VBLENDPDrri:
Simon Pilgrim13d3a202015-11-16 23:03:18 +0000154 case X86::VBLENDPDYrri:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000155 Src2Name = getRegName(MI->getOperand(2).getReg());
156 // FALL THROUGH.
157 case X86::BLENDPDrmi:
158 case X86::VBLENDPDrmi:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000159 case X86::VBLENDPDYrmi:
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000160 if (MI->getOperand(NumOperands - 1).isImm())
Simon Pilgrim13d3a202015-11-16 23:03:18 +0000161 DecodeBLENDMask(getRegOperandVectorVT(MI, MVT::f64, 0),
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000162 MI->getOperand(NumOperands - 1).getImm(),
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000163 ShuffleMask);
164 Src1Name = getRegName(MI->getOperand(1).getReg());
165 DestName = getRegName(MI->getOperand(0).getReg());
166 break;
167
168 case X86::BLENDPSrri:
169 case X86::VBLENDPSrri:
Simon Pilgrim13d3a202015-11-16 23:03:18 +0000170 case X86::VBLENDPSYrri:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000171 Src2Name = getRegName(MI->getOperand(2).getReg());
172 // FALL THROUGH.
173 case X86::BLENDPSrmi:
174 case X86::VBLENDPSrmi:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000175 case X86::VBLENDPSYrmi:
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000176 if (MI->getOperand(NumOperands - 1).isImm())
Simon Pilgrim13d3a202015-11-16 23:03:18 +0000177 DecodeBLENDMask(getRegOperandVectorVT(MI, MVT::f32, 0),
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000178 MI->getOperand(NumOperands - 1).getImm(),
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000179 ShuffleMask);
180 Src1Name = getRegName(MI->getOperand(1).getReg());
181 DestName = getRegName(MI->getOperand(0).getReg());
182 break;
183
184 case X86::PBLENDWrri:
185 case X86::VPBLENDWrri:
Simon Pilgrim13d3a202015-11-16 23:03:18 +0000186 case X86::VPBLENDWYrri:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000187 Src2Name = getRegName(MI->getOperand(2).getReg());
188 // FALL THROUGH.
189 case X86::PBLENDWrmi:
190 case X86::VPBLENDWrmi:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000191 case X86::VPBLENDWYrmi:
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000192 if (MI->getOperand(NumOperands - 1).isImm())
Simon Pilgrim13d3a202015-11-16 23:03:18 +0000193 DecodeBLENDMask(getRegOperandVectorVT(MI, MVT::i16, 0),
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000194 MI->getOperand(NumOperands - 1).getImm(),
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000195 ShuffleMask);
196 Src1Name = getRegName(MI->getOperand(1).getReg());
197 DestName = getRegName(MI->getOperand(0).getReg());
198 break;
199
200 case X86::VPBLENDDrri:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000201 case X86::VPBLENDDYrri:
202 Src2Name = getRegName(MI->getOperand(2).getReg());
203 // FALL THROUGH.
Simon Pilgrim13d3a202015-11-16 23:03:18 +0000204 case X86::VPBLENDDrmi:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000205 case X86::VPBLENDDYrmi:
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000206 if (MI->getOperand(NumOperands - 1).isImm())
Simon Pilgrim13d3a202015-11-16 23:03:18 +0000207 DecodeBLENDMask(getRegOperandVectorVT(MI, MVT::i32, 0),
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000208 MI->getOperand(NumOperands - 1).getImm(),
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000209 ShuffleMask);
210 Src1Name = getRegName(MI->getOperand(1).getReg());
211 DestName = getRegName(MI->getOperand(0).getReg());
212 break;
213
214 case X86::INSERTPSrr:
215 case X86::VINSERTPSrr:
Simon Pilgrim025a3d852016-02-01 22:05:50 +0000216 case X86::VINSERTPSzrr:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000217 Src2Name = getRegName(MI->getOperand(2).getReg());
218 // FALL THROUGH.
219 case X86::INSERTPSrm:
220 case X86::VINSERTPSrm:
Simon Pilgrim025a3d852016-02-01 22:05:50 +0000221 case X86::VINSERTPSzrm:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000222 DestName = getRegName(MI->getOperand(0).getReg());
223 Src1Name = getRegName(MI->getOperand(1).getReg());
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000224 if (MI->getOperand(NumOperands - 1).isImm())
225 DecodeINSERTPSMask(MI->getOperand(NumOperands - 1).getImm(),
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000226 ShuffleMask);
227 break;
228
229 case X86::MOVLHPSrr:
230 case X86::VMOVLHPSrr:
Simon Pilgrimd5a15442015-11-21 13:04:42 +0000231 case X86::VMOVLHPSZrr:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000232 Src2Name = getRegName(MI->getOperand(2).getReg());
233 Src1Name = getRegName(MI->getOperand(1).getReg());
234 DestName = getRegName(MI->getOperand(0).getReg());
235 DecodeMOVLHPSMask(2, ShuffleMask);
236 break;
237
238 case X86::MOVHLPSrr:
239 case X86::VMOVHLPSrr:
Simon Pilgrimd5a15442015-11-21 13:04:42 +0000240 case X86::VMOVHLPSZrr:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000241 Src2Name = getRegName(MI->getOperand(2).getReg());
242 Src1Name = getRegName(MI->getOperand(1).getReg());
243 DestName = getRegName(MI->getOperand(0).getReg());
244 DecodeMOVHLPSMask(2, ShuffleMask);
245 break;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000246
Simon Pilgrima3d67442016-02-07 15:39:22 +0000247 case X86::MOVHPDrm:
248 case X86::VMOVHPDrm:
249 case X86::VMOVHPDZ128rm:
250 Src1Name = getRegName(MI->getOperand(1).getReg());
251 DestName = getRegName(MI->getOperand(0).getReg());
252 DecodeInsertElementMask(MVT::v2f64, 1, 1, ShuffleMask);
253 break;
254
255 case X86::MOVHPSrm:
256 case X86::VMOVHPSrm:
257 case X86::VMOVHPSZ128rm:
258 Src1Name = getRegName(MI->getOperand(1).getReg());
259 DestName = getRegName(MI->getOperand(0).getReg());
260 DecodeInsertElementMask(MVT::v4f32, 2, 2, ShuffleMask);
261 break;
262
263 case X86::MOVLPDrm:
264 case X86::VMOVLPDrm:
265 case X86::VMOVLPDZ128rm:
266 Src1Name = getRegName(MI->getOperand(1).getReg());
267 DestName = getRegName(MI->getOperand(0).getReg());
268 DecodeInsertElementMask(MVT::v2f64, 0, 1, ShuffleMask);
269 break;
270
271 case X86::MOVLPSrm:
272 case X86::VMOVLPSrm:
273 case X86::VMOVLPSZ128rm:
274 Src1Name = getRegName(MI->getOperand(1).getReg());
275 DestName = getRegName(MI->getOperand(0).getReg());
276 DecodeInsertElementMask(MVT::v4f32, 0, 2, ShuffleMask);
277 break;
278
Igor Breger24cab0f2015-11-16 07:22:00 +0000279 CASE_MOVDUP(MOVSLDUP, r)
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000280 Src1Name = getRegName(MI->getOperand(NumOperands - 1).getReg());
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000281 // FALL THROUGH.
Igor Breger1f782962015-11-19 08:26:56 +0000282 CASE_MOVDUP(MOVSLDUP, m)
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000283 DestName = getRegName(MI->getOperand(0).getReg());
Igor Breger1f782962015-11-19 08:26:56 +0000284 DecodeMOVSLDUPMask(getRegOperandVectorVT(MI, MVT::f32, 0), ShuffleMask);
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000285 break;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000286
Igor Breger24cab0f2015-11-16 07:22:00 +0000287 CASE_MOVDUP(MOVSHDUP, r)
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000288 Src1Name = getRegName(MI->getOperand(NumOperands - 1).getReg());
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000289 // FALL THROUGH.
Igor Breger1f782962015-11-19 08:26:56 +0000290 CASE_MOVDUP(MOVSHDUP, m)
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000291 DestName = getRegName(MI->getOperand(0).getReg());
Igor Breger1f782962015-11-19 08:26:56 +0000292 DecodeMOVSHDUPMask(getRegOperandVectorVT(MI, MVT::f32, 0), ShuffleMask);
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000293 break;
294
Igor Breger1f782962015-11-19 08:26:56 +0000295 CASE_MOVDUP(MOVDDUP, r)
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000296 Src1Name = getRegName(MI->getOperand(NumOperands - 1).getReg());
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000297 // FALL THROUGH.
Igor Breger1f782962015-11-19 08:26:56 +0000298 CASE_MOVDUP(MOVDDUP, m)
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000299 DestName = getRegName(MI->getOperand(0).getReg());
Igor Breger1f782962015-11-19 08:26:56 +0000300 DecodeMOVDDUPMask(getRegOperandVectorVT(MI, MVT::f64, 0), ShuffleMask);
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000301 break;
302
303 case X86::PSLLDQri:
304 case X86::VPSLLDQri:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000305 case X86::VPSLLDQYri:
Simon Pilgrim643734c2016-06-09 22:03:15 +0000306 case X86::VPSLLDQZ128rr:
307 case X86::VPSLLDQZ256rr:
308 case X86::VPSLLDQZ512rr:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000309 Src1Name = getRegName(MI->getOperand(1).getReg());
Simon Pilgrim643734c2016-06-09 22:03:15 +0000310 case X86::VPSLLDQZ128rm:
311 case X86::VPSLLDQZ256rm:
312 case X86::VPSLLDQZ512rm:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000313 DestName = getRegName(MI->getOperand(0).getReg());
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000314 if (MI->getOperand(NumOperands - 1).isImm())
Simon Pilgrimb9ada272015-11-16 22:54:41 +0000315 DecodePSLLDQMask(getRegOperandVectorVT(MI, MVT::i8, 0),
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000316 MI->getOperand(NumOperands - 1).getImm(),
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000317 ShuffleMask);
318 break;
319
320 case X86::PSRLDQri:
321 case X86::VPSRLDQri:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000322 case X86::VPSRLDQYri:
Simon Pilgrim643734c2016-06-09 22:03:15 +0000323 case X86::VPSRLDQZ128rr:
324 case X86::VPSRLDQZ256rr:
325 case X86::VPSRLDQZ512rr:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000326 Src1Name = getRegName(MI->getOperand(1).getReg());
Simon Pilgrim643734c2016-06-09 22:03:15 +0000327 case X86::VPSRLDQZ128rm:
328 case X86::VPSRLDQZ256rm:
329 case X86::VPSRLDQZ512rm:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000330 DestName = getRegName(MI->getOperand(0).getReg());
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000331 if (MI->getOperand(NumOperands - 1).isImm())
Simon Pilgrimb9ada272015-11-16 22:54:41 +0000332 DecodePSRLDQMask(getRegOperandVectorVT(MI, MVT::i8, 0),
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000333 MI->getOperand(NumOperands - 1).getImm(),
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000334 ShuffleMask);
335 break;
336
Craig Topper7a299302016-06-09 07:06:38 +0000337 CASE_SHUF(PALIGNR, rri)
Craig Topper89c17612016-06-10 04:48:05 +0000338 Src1Name = getRegName(MI->getOperand(NumOperands - 2).getReg());
339 RegForm = true;
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000340 // FALL THROUGH.
Craig Topper7a299302016-06-09 07:06:38 +0000341 CASE_SHUF(PALIGNR, rmi)
Craig Topper89c17612016-06-10 04:48:05 +0000342 Src2Name = getRegName(MI->getOperand(NumOperands-(RegForm?3:7)).getReg());
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000343 DestName = getRegName(MI->getOperand(0).getReg());
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000344 if (MI->getOperand(NumOperands - 1).isImm())
Simon Pilgrimb9ada272015-11-16 22:54:41 +0000345 DecodePALIGNRMask(getRegOperandVectorVT(MI, MVT::i8, 0),
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000346 MI->getOperand(NumOperands - 1).getImm(),
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000347 ShuffleMask);
348 break;
349
Craig Topper01f53b12016-06-03 05:31:00 +0000350 CASE_SHUF(PSHUFD, ri)
Craig Topper6f7288d2016-06-09 07:49:08 +0000351 Src1Name = getRegName(MI->getOperand(NumOperands - 2).getReg());
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000352 // FALL THROUGH.
Craig Topper01f53b12016-06-03 05:31:00 +0000353 CASE_SHUF(PSHUFD, mi)
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000354 DestName = getRegName(MI->getOperand(0).getReg());
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000355 if (MI->getOperand(NumOperands - 1).isImm())
Simon Pilgrim5883a732015-11-16 22:39:27 +0000356 DecodePSHUFMask(getRegOperandVectorVT(MI, MVT::i32, 0),
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000357 MI->getOperand(NumOperands - 1).getImm(),
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000358 ShuffleMask);
359 break;
360
Craig Topper01f53b12016-06-03 05:31:00 +0000361 CASE_SHUF(PSHUFHW, ri)
Craig Topper6f7288d2016-06-09 07:49:08 +0000362 Src1Name = getRegName(MI->getOperand(NumOperands - 2).getReg());
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000363 // FALL THROUGH.
Craig Topper01f53b12016-06-03 05:31:00 +0000364 CASE_SHUF(PSHUFHW, mi)
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 Pilgrim5883a732015-11-16 22:39:27 +0000367 DecodePSHUFHWMask(getRegOperandVectorVT(MI, MVT::i16, 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;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000371
Craig Topper01f53b12016-06-03 05:31:00 +0000372 CASE_SHUF(PSHUFLW, ri)
Craig Topper6f7288d2016-06-09 07:49:08 +0000373 Src1Name = getRegName(MI->getOperand(NumOperands - 2).getReg());
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000374 // FALL THROUGH.
Craig Topper01f53b12016-06-03 05:31:00 +0000375 CASE_SHUF(PSHUFLW, mi)
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000376 DestName = getRegName(MI->getOperand(0).getReg());
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000377 if (MI->getOperand(NumOperands - 1).isImm())
Simon Pilgrim5883a732015-11-16 22:39:27 +0000378 DecodePSHUFLWMask(getRegOperandVectorVT(MI, MVT::i16, 0),
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000379 MI->getOperand(NumOperands - 1).getImm(),
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000380 ShuffleMask);
381 break;
382
Simon Pilgrimf8f86ab2015-09-13 11:28:45 +0000383 case X86::MMX_PSHUFWri:
384 Src1Name = getRegName(MI->getOperand(1).getReg());
385 // FALL THROUGH.
386 case X86::MMX_PSHUFWmi:
387 DestName = getRegName(MI->getOperand(0).getReg());
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000388 if (MI->getOperand(NumOperands - 1).isImm())
Simon Pilgrimf8f86ab2015-09-13 11:28:45 +0000389 DecodePSHUFMask(MVT::v4i16,
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000390 MI->getOperand(NumOperands - 1).getImm(),
Simon Pilgrimf8f86ab2015-09-13 11:28:45 +0000391 ShuffleMask);
392 break;
393
394 case X86::PSWAPDrr:
395 Src1Name = getRegName(MI->getOperand(1).getReg());
396 // FALL THROUGH.
397 case X86::PSWAPDrm:
398 DestName = getRegName(MI->getOperand(0).getReg());
399 DecodePSWAPMask(MVT::v2i32, ShuffleMask);
400 break;
401
Simon Pilgrim8483df62015-11-17 22:35:45 +0000402 CASE_UNPCK(PUNPCKHBW, r)
Simon Pilgrimf8f86ab2015-09-13 11:28:45 +0000403 case X86::MMX_PUNPCKHBWirr:
Craig Topper89c17612016-06-10 04:48:05 +0000404 Src2Name = getRegName(MI->getOperand(NumOperands - 1).getReg());
405 RegForm = true;
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000406 // FALL THROUGH.
Simon Pilgrim8483df62015-11-17 22:35:45 +0000407 CASE_UNPCK(PUNPCKHBW, m)
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000408 case X86::MMX_PUNPCKHBWirm:
Craig Topper89c17612016-06-10 04:48:05 +0000409 Src1Name = getRegName(MI->getOperand(NumOperands-(RegForm?2:6)).getReg());
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000410 DestName = getRegName(MI->getOperand(0).getReg());
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000411 DecodeUNPCKHMask(getRegOperandVectorVT(MI, MVT::i8, 0), ShuffleMask);
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000412 break;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000413
Simon Pilgrim8483df62015-11-17 22:35:45 +0000414 CASE_UNPCK(PUNPCKHWD, r)
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000415 case X86::MMX_PUNPCKHWDirr:
Craig Topper89c17612016-06-10 04:48:05 +0000416 Src2Name = getRegName(MI->getOperand(NumOperands - 1).getReg());
417 RegForm = true;
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000418 // FALL THROUGH.
Simon Pilgrim8483df62015-11-17 22:35:45 +0000419 CASE_UNPCK(PUNPCKHWD, m)
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000420 case X86::MMX_PUNPCKHWDirm:
Craig Topper89c17612016-06-10 04:48:05 +0000421 Src1Name = getRegName(MI->getOperand(NumOperands-(RegForm?2:6)).getReg());
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000422 DestName = getRegName(MI->getOperand(0).getReg());
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000423 DecodeUNPCKHMask(getRegOperandVectorVT(MI, MVT::i16, 0), ShuffleMask);
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000424 break;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000425
Simon Pilgrim8483df62015-11-17 22:35:45 +0000426 CASE_UNPCK(PUNPCKHDQ, r)
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000427 case X86::MMX_PUNPCKHDQirr:
Craig Topper89c17612016-06-10 04:48:05 +0000428 Src2Name = getRegName(MI->getOperand(NumOperands - 1).getReg());
429 RegForm = true;
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000430 // FALL THROUGH.
Simon Pilgrim8483df62015-11-17 22:35:45 +0000431 CASE_UNPCK(PUNPCKHDQ, m)
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000432 case X86::MMX_PUNPCKHDQirm:
Craig Topper89c17612016-06-10 04:48:05 +0000433 Src1Name = getRegName(MI->getOperand(NumOperands-(RegForm?2:6)).getReg());
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000434 DestName = getRegName(MI->getOperand(0).getReg());
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000435 DecodeUNPCKHMask(getRegOperandVectorVT(MI, MVT::i32, 0), ShuffleMask);
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000436 break;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000437
Simon Pilgrim8483df62015-11-17 22:35:45 +0000438 CASE_UNPCK(PUNPCKHQDQ, r)
Craig Topper89c17612016-06-10 04:48:05 +0000439 Src2Name = getRegName(MI->getOperand(NumOperands - 1).getReg());
440 RegForm = true;
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000441 // FALL THROUGH.
Simon Pilgrim8483df62015-11-17 22:35:45 +0000442 CASE_UNPCK(PUNPCKHQDQ, m)
Craig Topper89c17612016-06-10 04:48:05 +0000443 Src1Name = getRegName(MI->getOperand(NumOperands-(RegForm?2:6)).getReg());
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000444 DestName = getRegName(MI->getOperand(0).getReg());
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000445 DecodeUNPCKHMask(getRegOperandVectorVT(MI, MVT::i64, 0), ShuffleMask);
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000446 break;
447
Simon Pilgrim8483df62015-11-17 22:35:45 +0000448 CASE_UNPCK(PUNPCKLBW, r)
Simon Pilgrimf8f86ab2015-09-13 11:28:45 +0000449 case X86::MMX_PUNPCKLBWirr:
Craig Topper89c17612016-06-10 04:48:05 +0000450 Src2Name = getRegName(MI->getOperand(NumOperands - 1).getReg());
451 RegForm = true;
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000452 // FALL THROUGH.
Simon Pilgrim8483df62015-11-17 22:35:45 +0000453 CASE_UNPCK(PUNPCKLBW, m)
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000454 case X86::MMX_PUNPCKLBWirm:
Craig Topper89c17612016-06-10 04:48:05 +0000455 Src1Name = getRegName(MI->getOperand(NumOperands-(RegForm?2:6)).getReg());
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000456 DestName = getRegName(MI->getOperand(0).getReg());
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000457 DecodeUNPCKLMask(getRegOperandVectorVT(MI, MVT::i8, 0), ShuffleMask);
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000458 break;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000459
Simon Pilgrim8483df62015-11-17 22:35:45 +0000460 CASE_UNPCK(PUNPCKLWD, r)
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000461 case X86::MMX_PUNPCKLWDirr:
Craig Topper89c17612016-06-10 04:48:05 +0000462 Src2Name = getRegName(MI->getOperand(NumOperands - 1).getReg());
463 RegForm = true;
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000464 // FALL THROUGH.
Simon Pilgrim8483df62015-11-17 22:35:45 +0000465 CASE_UNPCK(PUNPCKLWD, m)
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000466 case X86::MMX_PUNPCKLWDirm:
Craig Topper89c17612016-06-10 04:48:05 +0000467 Src1Name = getRegName(MI->getOperand(NumOperands-(RegForm?2:6)).getReg());
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000468 DestName = getRegName(MI->getOperand(0).getReg());
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000469 DecodeUNPCKLMask(getRegOperandVectorVT(MI, MVT::i16, 0), ShuffleMask);
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000470 break;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000471
Simon Pilgrim8483df62015-11-17 22:35:45 +0000472 CASE_UNPCK(PUNPCKLDQ, r)
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000473 case X86::MMX_PUNPCKLDQirr:
Craig Topper89c17612016-06-10 04:48:05 +0000474 Src2Name = getRegName(MI->getOperand(NumOperands - 1).getReg());
475 RegForm = true;
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000476 // FALL THROUGH.
Simon Pilgrim8483df62015-11-17 22:35:45 +0000477 CASE_UNPCK(PUNPCKLDQ, m)
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000478 case X86::MMX_PUNPCKLDQirm:
Craig Topper89c17612016-06-10 04:48:05 +0000479 Src1Name = getRegName(MI->getOperand(NumOperands-(RegForm?2:6)).getReg());
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000480 DestName = getRegName(MI->getOperand(0).getReg());
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000481 DecodeUNPCKLMask(getRegOperandVectorVT(MI, MVT::i32, 0), ShuffleMask);
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000482 break;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000483
Simon Pilgrim8483df62015-11-17 22:35:45 +0000484 CASE_UNPCK(PUNPCKLQDQ, r)
Craig Topper89c17612016-06-10 04:48:05 +0000485 Src2Name = getRegName(MI->getOperand(NumOperands - 1).getReg());
486 RegForm = true;
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000487 // FALL THROUGH.
Simon Pilgrim8483df62015-11-17 22:35:45 +0000488 CASE_UNPCK(PUNPCKLQDQ, m)
Craig Topper89c17612016-06-10 04:48:05 +0000489 Src1Name = getRegName(MI->getOperand(NumOperands-(RegForm?2:6)).getReg());
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000490 DestName = getRegName(MI->getOperand(0).getReg());
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000491 DecodeUNPCKLMask(getRegOperandVectorVT(MI, MVT::i64, 0), ShuffleMask);
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000492 break;
493
Craig Topper01f53b12016-06-03 05:31:00 +0000494 CASE_SHUF(SHUFPD, rri)
Craig Topper89c17612016-06-10 04:48:05 +0000495 Src2Name = getRegName(MI->getOperand(NumOperands - 2).getReg());
496 RegForm = true;
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000497 // FALL THROUGH.
Craig Topper01f53b12016-06-03 05:31:00 +0000498 CASE_SHUF(SHUFPD, rmi)
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000499 if (MI->getOperand(NumOperands - 1).isImm())
Simon Pilgrim5883a732015-11-16 22:39:27 +0000500 DecodeSHUFPMask(getRegOperandVectorVT(MI, MVT::f64, 0),
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000501 MI->getOperand(NumOperands - 1).getImm(),
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000502 ShuffleMask);
Craig Topper89c17612016-06-10 04:48:05 +0000503 Src1Name = getRegName(MI->getOperand(NumOperands-(RegForm?3:7)).getReg());
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000504 DestName = getRegName(MI->getOperand(0).getReg());
505 break;
506
Craig Topper01f53b12016-06-03 05:31:00 +0000507 CASE_SHUF(SHUFPS, rri)
Craig Topper89c17612016-06-10 04:48:05 +0000508 Src2Name = getRegName(MI->getOperand(NumOperands - 2).getReg());
509 RegForm = true;
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000510 // FALL THROUGH.
Craig Topper01f53b12016-06-03 05:31:00 +0000511 CASE_SHUF(SHUFPS, rmi)
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000512 if (MI->getOperand(NumOperands - 1).isImm())
Simon Pilgrim5883a732015-11-16 22:39:27 +0000513 DecodeSHUFPMask(getRegOperandVectorVT(MI, MVT::f32, 0),
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000514 MI->getOperand(NumOperands - 1).getImm(),
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000515 ShuffleMask);
Craig Topper89c17612016-06-10 04:48:05 +0000516 Src1Name = getRegName(MI->getOperand(NumOperands-(RegForm?3:7)).getReg());
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000517 DestName = getRegName(MI->getOperand(0).getReg());
518 break;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000519
Igor Breger24cab0f2015-11-16 07:22:00 +0000520 CASE_VSHUF(64X2, r)
Simon Pilgrimd3869412016-06-11 11:18:38 +0000521 Src2Name = getRegName(MI->getOperand(NumOperands - 2).getReg());
522 RegForm = true;
523 // FALL THROUGH.
Igor Breger24cab0f2015-11-16 07:22:00 +0000524 CASE_VSHUF(64X2, m)
Simon Pilgrimd3869412016-06-11 11:18:38 +0000525 decodeVSHUF64x2FamilyMask(getRegOperandVectorVT(MI, MVT::i64, 0),
526 MI->getOperand(NumOperands - 1).getImm(),
Igor Bregerd7bae452015-10-15 13:29:07 +0000527 ShuffleMask);
Simon Pilgrimd3869412016-06-11 11:18:38 +0000528 Src1Name = getRegName(MI->getOperand(NumOperands-(RegForm?3:7)).getReg());
Igor Bregerd7bae452015-10-15 13:29:07 +0000529 DestName = getRegName(MI->getOperand(0).getReg());
Igor Bregerd7bae452015-10-15 13:29:07 +0000530 break;
Simon Pilgrimd3869412016-06-11 11:18:38 +0000531
532 CASE_VSHUF(32X4, r)
533 Src2Name = getRegName(MI->getOperand(NumOperands - 2).getReg());
534 RegForm = true;
535 // FALL THROUGH.
536 CASE_VSHUF(32X4, m)
537 decodeVSHUF64x2FamilyMask(getRegOperandVectorVT(MI, MVT::i32, 0),
538 MI->getOperand(NumOperands - 1).getImm(),
539 ShuffleMask);
540 Src1Name = getRegName(MI->getOperand(NumOperands-(RegForm?3:7)).getReg());
541 DestName = getRegName(MI->getOperand(0).getReg());
542 break;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000543
Simon Pilgrim8483df62015-11-17 22:35:45 +0000544 CASE_UNPCK(UNPCKLPD, r)
Craig Topper89c17612016-06-10 04:48:05 +0000545 Src2Name = getRegName(MI->getOperand(NumOperands - 1).getReg());
546 RegForm = true;
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000547 // FALL THROUGH.
Simon Pilgrim8483df62015-11-17 22:35:45 +0000548 CASE_UNPCK(UNPCKLPD, m)
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000549 DecodeUNPCKLMask(getRegOperandVectorVT(MI, MVT::f64, 0), ShuffleMask);
Craig Topper89c17612016-06-10 04:48:05 +0000550 Src1Name = getRegName(MI->getOperand(NumOperands-(RegForm?2:6)).getReg());
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000551 DestName = getRegName(MI->getOperand(0).getReg());
552 break;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000553
Simon Pilgrim8483df62015-11-17 22:35:45 +0000554 CASE_UNPCK(UNPCKLPS, r)
Craig Topper89c17612016-06-10 04:48:05 +0000555 Src2Name = getRegName(MI->getOperand(NumOperands - 1).getReg());
556 RegForm = true;
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000557 // FALL THROUGH.
Simon Pilgrim8483df62015-11-17 22:35:45 +0000558 CASE_UNPCK(UNPCKLPS, m)
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000559 DecodeUNPCKLMask(getRegOperandVectorVT(MI, MVT::f32, 0), ShuffleMask);
Craig Topper89c17612016-06-10 04:48:05 +0000560 Src1Name = getRegName(MI->getOperand(NumOperands-(RegForm?2:6)).getReg());
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000561 DestName = getRegName(MI->getOperand(0).getReg());
562 break;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000563
Simon Pilgrim8483df62015-11-17 22:35:45 +0000564 CASE_UNPCK(UNPCKHPD, r)
Craig Topper89c17612016-06-10 04:48:05 +0000565 Src2Name = getRegName(MI->getOperand(NumOperands - 1).getReg());
566 RegForm = true;
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000567 // FALL THROUGH.
Simon Pilgrim8483df62015-11-17 22:35:45 +0000568 CASE_UNPCK(UNPCKHPD, m)
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000569 DecodeUNPCKHMask(getRegOperandVectorVT(MI, MVT::f64, 0), ShuffleMask);
Craig Topper89c17612016-06-10 04:48:05 +0000570 Src1Name = getRegName(MI->getOperand(NumOperands-(RegForm?2:6)).getReg());
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000571 DestName = getRegName(MI->getOperand(0).getReg());
572 break;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000573
Simon Pilgrim8483df62015-11-17 22:35:45 +0000574 CASE_UNPCK(UNPCKHPS, r)
Craig Topper89c17612016-06-10 04:48:05 +0000575 Src2Name = getRegName(MI->getOperand(NumOperands - 1).getReg());
576 RegForm = true;
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000577 // FALL THROUGH.
Simon Pilgrim8483df62015-11-17 22:35:45 +0000578 CASE_UNPCK(UNPCKHPS, m)
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000579 DecodeUNPCKHMask(getRegOperandVectorVT(MI, MVT::f32, 0), ShuffleMask);
Craig Topper89c17612016-06-10 04:48:05 +0000580 Src1Name = getRegName(MI->getOperand(NumOperands-(RegForm?2:6)).getReg());
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000581 DestName = getRegName(MI->getOperand(0).getReg());
582 break;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000583
Simon Pilgrim2da41782015-11-17 23:29:49 +0000584 CASE_VPERM(PERMILPS, r)
Simon Pilgrim6ce35dd2016-05-11 18:53:44 +0000585 Src1Name = getRegName(MI->getOperand(NumOperands - 2).getReg());
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000586 // FALL THROUGH.
Simon Pilgrim2da41782015-11-17 23:29:49 +0000587 CASE_VPERM(PERMILPS, m)
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000588 if (MI->getOperand(NumOperands - 1).isImm())
Simon Pilgrim5883a732015-11-16 22:39:27 +0000589 DecodePSHUFMask(getRegOperandVectorVT(MI, MVT::f32, 0),
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000590 MI->getOperand(NumOperands - 1).getImm(),
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000591 ShuffleMask);
592 DestName = getRegName(MI->getOperand(0).getReg());
593 break;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000594
Simon Pilgrim2da41782015-11-17 23:29:49 +0000595 CASE_VPERM(PERMILPD, r)
Simon Pilgrim6ce35dd2016-05-11 18:53:44 +0000596 Src1Name = getRegName(MI->getOperand(NumOperands - 2).getReg());
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000597 // FALL THROUGH.
Simon Pilgrim2da41782015-11-17 23:29:49 +0000598 CASE_VPERM(PERMILPD, m)
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000599 if (MI->getOperand(NumOperands - 1).isImm())
Simon Pilgrim5883a732015-11-16 22:39:27 +0000600 DecodePSHUFMask(getRegOperandVectorVT(MI, MVT::f64, 0),
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000601 MI->getOperand(NumOperands - 1).getImm(),
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000602 ShuffleMask);
603 DestName = getRegName(MI->getOperand(0).getReg());
604 break;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000605
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000606 case X86::VPERM2F128rr:
607 case X86::VPERM2I128rr:
608 Src2Name = getRegName(MI->getOperand(2).getReg());
609 // FALL THROUGH.
610 case X86::VPERM2F128rm:
611 case X86::VPERM2I128rm:
612 // For instruction comments purpose, assume the 256-bit vector is v4i64.
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000613 if (MI->getOperand(NumOperands - 1).isImm())
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000614 DecodeVPERM2X128Mask(MVT::v4i64,
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000615 MI->getOperand(NumOperands - 1).getImm(),
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000616 ShuffleMask);
617 Src1Name = getRegName(MI->getOperand(1).getReg());
618 DestName = getRegName(MI->getOperand(0).getReg());
619 break;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000620
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000621 case X86::VPERMQYri:
Craig Topper22ae3532016-05-21 06:07:18 +0000622 case X86::VPERMQZ256ri:
Craig Topper200d2372016-06-10 05:12:40 +0000623 case X86::VPERMQZ256rik:
624 case X86::VPERMQZ256rikz:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000625 case X86::VPERMPDYri:
Craig Topper22ae3532016-05-21 06:07:18 +0000626 case X86::VPERMPDZ256ri:
Craig Topper200d2372016-06-10 05:12:40 +0000627 case X86::VPERMPDZ256rik:
628 case X86::VPERMPDZ256rikz:
629 Src1Name = getRegName(MI->getOperand(NumOperands - 2).getReg());
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000630 // FALL THROUGH.
631 case X86::VPERMQYmi:
Craig Topper22ae3532016-05-21 06:07:18 +0000632 case X86::VPERMQZ256mi:
Craig Topper200d2372016-06-10 05:12:40 +0000633 case X86::VPERMQZ256mik:
634 case X86::VPERMQZ256mikz:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000635 case X86::VPERMPDYmi:
Craig Topper22ae3532016-05-21 06:07:18 +0000636 case X86::VPERMPDZ256mi:
Craig Topper200d2372016-06-10 05:12:40 +0000637 case X86::VPERMPDZ256mik:
638 case X86::VPERMPDZ256mikz:
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000639 if (MI->getOperand(NumOperands - 1).isImm())
640 DecodeVPERMMask(MI->getOperand(NumOperands - 1).getImm(),
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000641 ShuffleMask);
642 DestName = getRegName(MI->getOperand(0).getReg());
643 break;
644
645 case X86::MOVSDrr:
646 case X86::VMOVSDrr:
Simon Pilgrimf5c23ad2016-02-01 22:26:28 +0000647 case X86::VMOVSDZrr:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000648 Src2Name = getRegName(MI->getOperand(2).getReg());
649 Src1Name = getRegName(MI->getOperand(1).getReg());
650 // FALL THROUGH.
651 case X86::MOVSDrm:
652 case X86::VMOVSDrm:
Simon Pilgrimf5c23ad2016-02-01 22:26:28 +0000653 case X86::VMOVSDZrm:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000654 DecodeScalarMoveMask(MVT::v2f64, nullptr == Src2Name, ShuffleMask);
655 DestName = getRegName(MI->getOperand(0).getReg());
656 break;
Simon Pilgrimd5a15442015-11-21 13:04:42 +0000657
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000658 case X86::MOVSSrr:
659 case X86::VMOVSSrr:
Simon Pilgrimf5c23ad2016-02-01 22:26:28 +0000660 case X86::VMOVSSZrr:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000661 Src2Name = getRegName(MI->getOperand(2).getReg());
662 Src1Name = getRegName(MI->getOperand(1).getReg());
663 // FALL THROUGH.
664 case X86::MOVSSrm:
665 case X86::VMOVSSrm:
Simon Pilgrimf5c23ad2016-02-01 22:26:28 +0000666 case X86::VMOVSSZrm:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000667 DecodeScalarMoveMask(MVT::v4f32, nullptr == Src2Name, ShuffleMask);
668 DestName = getRegName(MI->getOperand(0).getReg());
669 break;
670
671 case X86::MOVPQI2QIrr:
Simon Pilgrim3e0c0222015-12-13 12:49:48 +0000672 case X86::MOVZPQILo2PQIrr:
673 case X86::VMOVPQI2QIrr:
674 case X86::VMOVZPQILo2PQIrr:
675 case X86::VMOVZPQILo2PQIZrr:
676 Src1Name = getRegName(MI->getOperand(1).getReg());
677 // FALL THROUGH.
678 case X86::MOVQI2PQIrm:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000679 case X86::MOVZQI2PQIrm:
680 case X86::MOVZPQILo2PQIrm:
Simon Pilgrim3e0c0222015-12-13 12:49:48 +0000681 case X86::VMOVQI2PQIrm:
Simon Pilgrim96fe4ef2016-02-02 13:32:56 +0000682 case X86::VMOVQI2PQIZrm:
Simon Pilgrim3e0c0222015-12-13 12:49:48 +0000683 case X86::VMOVZQI2PQIrm:
684 case X86::VMOVZPQILo2PQIrm:
685 case X86::VMOVZPQILo2PQIZrm:
686 DecodeZeroMoveLowMask(MVT::v2i64, ShuffleMask);
687 DestName = getRegName(MI->getOperand(0).getReg());
688 break;
Simon Pilgrim66e43ee2015-11-16 22:21:10 +0000689
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000690 case X86::MOVDI2PDIrm:
691 case X86::VMOVDI2PDIrm:
Simon Pilgrim5be17b62016-02-01 23:04:05 +0000692 case X86::VMOVDI2PDIZrm:
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000693 DecodeZeroMoveLowMask(MVT::v4i32, ShuffleMask);
694 DestName = getRegName(MI->getOperand(0).getReg());
695 break;
696
Simon Pilgrimd85cae32015-07-06 20:46:41 +0000697 case X86::EXTRQI:
698 if (MI->getOperand(2).isImm() &&
699 MI->getOperand(3).isImm())
700 DecodeEXTRQIMask(MI->getOperand(2).getImm(),
701 MI->getOperand(3).getImm(),
702 ShuffleMask);
703
704 DestName = getRegName(MI->getOperand(0).getReg());
705 Src1Name = getRegName(MI->getOperand(1).getReg());
706 break;
707
708 case X86::INSERTQI:
709 if (MI->getOperand(3).isImm() &&
710 MI->getOperand(4).isImm())
711 DecodeINSERTQIMask(MI->getOperand(3).getImm(),
712 MI->getOperand(4).getImm(),
713 ShuffleMask);
714
715 DestName = getRegName(MI->getOperand(0).getReg());
716 Src1Name = getRegName(MI->getOperand(1).getReg());
717 Src2Name = getRegName(MI->getOperand(2).getReg());
718 break;
719
Simon Pilgrim0acc32a2016-02-06 19:51:21 +0000720 CASE_PMOVZX(PMOVZXBW, r)
721 CASE_PMOVZX(PMOVZXBD, r)
722 CASE_PMOVZX(PMOVZXBQ, r)
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000723 Src1Name = getRegName(MI->getOperand(NumOperands - 1).getReg());
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000724 // FALL THROUGH.
Simon Pilgrim0acc32a2016-02-06 19:51:21 +0000725 CASE_PMOVZX(PMOVZXBW, m)
726 CASE_PMOVZX(PMOVZXBD, m)
727 CASE_PMOVZX(PMOVZXBQ, m)
Simon Pilgrime1b6db92016-02-06 16:33:42 +0000728 DecodeZeroExtendMask(MVT::i8, getZeroExtensionResultType(MI), ShuffleMask);
729 DestName = getRegName(MI->getOperand(0).getReg());
730 break;
731
Simon Pilgrim0acc32a2016-02-06 19:51:21 +0000732 CASE_PMOVZX(PMOVZXWD, r)
733 CASE_PMOVZX(PMOVZXWQ, r)
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000734 Src1Name = getRegName(MI->getOperand(NumOperands - 1).getReg());
Simon Pilgrime1b6db92016-02-06 16:33:42 +0000735 // FALL THROUGH.
Simon Pilgrim0acc32a2016-02-06 19:51:21 +0000736 CASE_PMOVZX(PMOVZXWD, m)
737 CASE_PMOVZX(PMOVZXWQ, m)
Simon Pilgrime1b6db92016-02-06 16:33:42 +0000738 DecodeZeroExtendMask(MVT::i16, getZeroExtensionResultType(MI), ShuffleMask);
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000739 DestName = getRegName(MI->getOperand(0).getReg());
Simon Pilgrime1b6db92016-02-06 16:33:42 +0000740 break;
741
Simon Pilgrim0acc32a2016-02-06 19:51:21 +0000742 CASE_PMOVZX(PMOVZXDQ, r)
Simon Pilgrim3016d9e2016-05-11 17:36:32 +0000743 Src1Name = getRegName(MI->getOperand(NumOperands - 1).getReg());
Simon Pilgrime1b6db92016-02-06 16:33:42 +0000744 // FALL THROUGH.
Simon Pilgrim0acc32a2016-02-06 19:51:21 +0000745 CASE_PMOVZX(PMOVZXDQ, m)
Simon Pilgrime1b6db92016-02-06 16:33:42 +0000746 DecodeZeroExtendMask(MVT::i32, getZeroExtensionResultType(MI), ShuffleMask);
747 DestName = getRegName(MI->getOperand(0).getReg());
748 break;
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000749 }
750
751 // The only comments we decode are shuffles, so give up if we were unable to
752 // decode a shuffle mask.
753 if (ShuffleMask.empty())
754 return false;
755
Simon Pilgrimaf742d52016-05-09 13:30:16 +0000756 // TODO: Add support for specifying an AVX512 style mask register in the comment.
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000757 if (!DestName) DestName = Src1Name;
758 OS << (DestName ? DestName : "mem") << " = ";
759
760 // If the two sources are the same, canonicalize the input elements to be
761 // from the first src so that we get larger element spans.
762 if (Src1Name == Src2Name) {
763 for (unsigned i = 0, e = ShuffleMask.size(); i != e; ++i) {
764 if ((int)ShuffleMask[i] >= 0 && // Not sentinel.
NAKAMURA Takumi5582a6a2015-05-25 01:43:34 +0000765 ShuffleMask[i] >= (int)e) // From second mask.
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000766 ShuffleMask[i] -= e;
767 }
768 }
769
770 // The shuffle mask specifies which elements of the src1/src2 fill in the
771 // destination, with a few sentinel values. Loop through and print them
772 // out.
773 for (unsigned i = 0, e = ShuffleMask.size(); i != e; ++i) {
774 if (i != 0)
775 OS << ',';
776 if (ShuffleMask[i] == SM_SentinelZero) {
777 OS << "zero";
778 continue;
779 }
780
781 // Otherwise, it must come from src1 or src2. Print the span of elements
782 // that comes from this src.
783 bool isSrc1 = ShuffleMask[i] < (int)ShuffleMask.size();
784 const char *SrcName = isSrc1 ? Src1Name : Src2Name;
785 OS << (SrcName ? SrcName : "mem") << '[';
786 bool IsFirst = true;
787 while (i != e && (int)ShuffleMask[i] != SM_SentinelZero &&
788 (ShuffleMask[i] < (int)ShuffleMask.size()) == isSrc1) {
789 if (!IsFirst)
790 OS << ',';
791 else
792 IsFirst = false;
793 if (ShuffleMask[i] == SM_SentinelUndef)
794 OS << "u";
795 else
796 OS << ShuffleMask[i] % ShuffleMask.size();
797 ++i;
798 }
799 OS << ']';
NAKAMURA Takumi5582a6a2015-05-25 01:43:34 +0000800 --i; // For loop increments element #.
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +0000801 }
802 //MI->print(OS, 0);
803 OS << "\n";
804
805 // We successfully added a comment to this instruction.
806 return true;
807}