[X86][AVX512] Added support for VMOVQ shuffle comments
[oota-llvm.git] / lib / Target / X86 / InstPrinter / X86InstComments.cpp
1 //===-- 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
22 using namespace llvm;
23
24 static unsigned getVectorRegSize(unsigned RegNo) {
25   if (X86::ZMM0 <= RegNo && RegNo <= X86::ZMM31)
26     return 512;
27   if (X86::YMM0 <= RegNo && RegNo <= X86::YMM31)
28     return 256;
29   if (X86::XMM0 <= RegNo && RegNo <= X86::XMM31)
30     return 128;
31   if (X86::MM0 <= RegNo && RegNo <= X86::MM7)
32     return 64;
33
34   llvm_unreachable("Unknown vector reg!");
35   return 0;
36 }
37
38 static MVT getRegOperandVectorVT(const MCInst *MI, const MVT &ScalarVT,
39                                  unsigned OperandIndex) {
40   unsigned OpReg = MI->getOperand(OperandIndex).getReg();
41   return MVT::getVectorVT(ScalarVT,
42                           getVectorRegSize(OpReg)/ScalarVT.getSizeInBits());
43 }
44
45 /// \brief Extracts the src/dst types for a given zero extension instruction.
46 /// \note While the number of elements in DstVT type correct, the
47 /// number in the SrcVT type is expanded to fill the src xmm register and the
48 /// upper elements may not be included in the dst xmm/ymm register.
49 static void getZeroExtensionTypes(const MCInst *MI, MVT &SrcVT, MVT &DstVT) {
50   switch (MI->getOpcode()) {
51   default:
52     llvm_unreachable("Unknown zero extension instruction");
53   // i8 zero extension
54   case X86::PMOVZXBWrm:
55   case X86::PMOVZXBWrr:
56   case X86::VPMOVZXBWrm:
57   case X86::VPMOVZXBWrr:
58     SrcVT = MVT::v16i8;
59     DstVT = MVT::v8i16;
60     break;
61   case X86::VPMOVZXBWYrm:
62   case X86::VPMOVZXBWYrr:
63     SrcVT = MVT::v16i8;
64     DstVT = MVT::v16i16;
65     break;
66   case X86::PMOVZXBDrm:
67   case X86::PMOVZXBDrr:
68   case X86::VPMOVZXBDrm:
69   case X86::VPMOVZXBDrr:
70     SrcVT = MVT::v16i8;
71     DstVT = MVT::v4i32;
72     break;
73   case X86::VPMOVZXBDYrm:
74   case X86::VPMOVZXBDYrr:
75     SrcVT = MVT::v16i8;
76     DstVT = MVT::v8i32;
77     break;
78   case X86::PMOVZXBQrm:
79   case X86::PMOVZXBQrr:
80   case X86::VPMOVZXBQrm:
81   case X86::VPMOVZXBQrr:
82     SrcVT = MVT::v16i8;
83     DstVT = MVT::v2i64;
84     break;
85   case X86::VPMOVZXBQYrm:
86   case X86::VPMOVZXBQYrr:
87     SrcVT = MVT::v16i8;
88     DstVT = MVT::v4i64;
89     break;
90   // i16 zero extension
91   case X86::PMOVZXWDrm:
92   case X86::PMOVZXWDrr:
93   case X86::VPMOVZXWDrm:
94   case X86::VPMOVZXWDrr:
95     SrcVT = MVT::v8i16;
96     DstVT = MVT::v4i32;
97     break;
98   case X86::VPMOVZXWDYrm:
99   case X86::VPMOVZXWDYrr:
100     SrcVT = MVT::v8i16;
101     DstVT = MVT::v8i32;
102     break;
103   case X86::PMOVZXWQrm:
104   case X86::PMOVZXWQrr:
105   case X86::VPMOVZXWQrm:
106   case X86::VPMOVZXWQrr:
107     SrcVT = MVT::v8i16;
108     DstVT = MVT::v2i64;
109     break;
110   case X86::VPMOVZXWQYrm:
111   case X86::VPMOVZXWQYrr:
112     SrcVT = MVT::v8i16;
113     DstVT = MVT::v4i64;
114     break;
115   // i32 zero extension
116   case X86::PMOVZXDQrm:
117   case X86::PMOVZXDQrr:
118   case X86::VPMOVZXDQrm:
119   case X86::VPMOVZXDQrr:
120     SrcVT = MVT::v4i32;
121     DstVT = MVT::v2i64;
122     break;
123   case X86::VPMOVZXDQYrm:
124   case X86::VPMOVZXDQYrr:
125     SrcVT = MVT::v4i32;
126     DstVT = MVT::v4i64;
127     break;
128   }
129 }
130
131 #define CASE_MASK_INS_COMMON(Inst, Suffix, src)  \
132   case X86::V##Inst##Suffix##src:                \
133   case X86::V##Inst##Suffix##src##k:             \
134   case X86::V##Inst##Suffix##src##kz:
135
136 #define CASE_SSE_INS_COMMON(Inst, src)           \
137   case X86::Inst##src:
138
139 #define CASE_AVX_INS_COMMON(Inst, Suffix, src)  \
140   case X86::V##Inst##Suffix##src:
141
142 #define CASE_MOVDUP(Inst, src)                  \
143   CASE_MASK_INS_COMMON(Inst, Z, r##src)         \
144   CASE_MASK_INS_COMMON(Inst, Z256, r##src)      \
145   CASE_MASK_INS_COMMON(Inst, Z128, r##src)      \
146   CASE_AVX_INS_COMMON(Inst, , r##src)           \
147   CASE_AVX_INS_COMMON(Inst, Y, r##src)          \
148   CASE_SSE_INS_COMMON(Inst, r##src)             \
149
150 #define CASE_UNPCK(Inst, src)                   \
151   CASE_MASK_INS_COMMON(Inst, Z, r##src)         \
152   CASE_MASK_INS_COMMON(Inst, Z256, r##src)      \
153   CASE_MASK_INS_COMMON(Inst, Z128, r##src)      \
154   CASE_AVX_INS_COMMON(Inst, , r##src)           \
155   CASE_AVX_INS_COMMON(Inst, Y, r##src)          \
156   CASE_SSE_INS_COMMON(Inst, r##src)             \
157
158 #define CASE_SHUF(Inst, src)                    \
159   CASE_MASK_INS_COMMON(Inst, Z, r##src##i)      \
160   CASE_MASK_INS_COMMON(Inst, Z256, r##src##i)   \
161   CASE_MASK_INS_COMMON(Inst, Z128, r##src##i)   \
162   CASE_AVX_INS_COMMON(Inst, , r##src##i)        \
163   CASE_AVX_INS_COMMON(Inst, Y, r##src##i)       \
164   CASE_SSE_INS_COMMON(Inst, r##src##i)          \
165
166 #define CASE_VPERM(Inst, src)                   \
167   CASE_MASK_INS_COMMON(Inst, Z, src##i)         \
168   CASE_MASK_INS_COMMON(Inst, Z256, src##i)      \
169   CASE_MASK_INS_COMMON(Inst, Z128, src##i)      \
170   CASE_AVX_INS_COMMON(Inst, , src##i)           \
171   CASE_AVX_INS_COMMON(Inst, Y, src##i)          \
172
173 #define CASE_VSHUF(Inst, src)                          \
174   CASE_MASK_INS_COMMON(SHUFF##Inst, Z, r##src##i)      \
175   CASE_MASK_INS_COMMON(SHUFI##Inst, Z, r##src##i)      \
176   CASE_MASK_INS_COMMON(SHUFF##Inst, Z256, r##src##i)   \
177   CASE_MASK_INS_COMMON(SHUFI##Inst, Z256, r##src##i)   \
178
179 /// \brief Extracts the types and if it has memory operand for a given
180 /// (SHUFF32x4/SHUFF64x2/SHUFI32x4/SHUFI64x2) instruction.
181 static void getVSHUF64x2FamilyInfo(const MCInst *MI, MVT &VT, bool &HasMemOp) {
182   HasMemOp = false;
183   switch (MI->getOpcode()) {
184   default:
185     llvm_unreachable("Unknown VSHUF64x2 family instructions.");
186     break;
187   CASE_VSHUF(64X2, m)
188     HasMemOp = true;        // FALL THROUGH.
189   CASE_VSHUF(64X2, r)
190     VT = getRegOperandVectorVT(MI, MVT::i64, 0);
191     break;
192   CASE_VSHUF(32X4, m)
193     HasMemOp = true;        // FALL THROUGH.
194   CASE_VSHUF(32X4, r)
195     VT = getRegOperandVectorVT(MI, MVT::i32, 0);
196     break;
197   }
198 }
199
200 //===----------------------------------------------------------------------===//
201 // Top Level Entrypoint
202 //===----------------------------------------------------------------------===//
203
204 /// EmitAnyX86InstComments - This function decodes x86 instructions and prints
205 /// newline terminated strings to the specified string if desired.  This
206 /// information is shown in disassembly dumps when verbose assembly is enabled.
207 bool llvm::EmitAnyX86InstComments(const MCInst *MI, raw_ostream &OS,
208                                   const char *(*getRegName)(unsigned)) {
209   // If this is a shuffle operation, the switch should fill in this state.
210   SmallVector<int, 8> ShuffleMask;
211   const char *DestName = nullptr, *Src1Name = nullptr, *Src2Name = nullptr;
212
213   switch (MI->getOpcode()) {
214   default:
215     // Not an instruction for which we can decode comments.
216     return false;
217
218   case X86::BLENDPDrri:
219   case X86::VBLENDPDrri:
220   case X86::VBLENDPDYrri:
221     Src2Name = getRegName(MI->getOperand(2).getReg());
222     // FALL THROUGH.
223   case X86::BLENDPDrmi:
224   case X86::VBLENDPDrmi:
225   case X86::VBLENDPDYrmi:
226     if (MI->getOperand(MI->getNumOperands() - 1).isImm())
227       DecodeBLENDMask(getRegOperandVectorVT(MI, MVT::f64, 0),
228                       MI->getOperand(MI->getNumOperands() - 1).getImm(),
229                       ShuffleMask);
230     Src1Name = getRegName(MI->getOperand(1).getReg());
231     DestName = getRegName(MI->getOperand(0).getReg());
232     break;
233
234   case X86::BLENDPSrri:
235   case X86::VBLENDPSrri:
236   case X86::VBLENDPSYrri:
237     Src2Name = getRegName(MI->getOperand(2).getReg());
238     // FALL THROUGH.
239   case X86::BLENDPSrmi:
240   case X86::VBLENDPSrmi:
241   case X86::VBLENDPSYrmi:
242     if (MI->getOperand(MI->getNumOperands() - 1).isImm())
243       DecodeBLENDMask(getRegOperandVectorVT(MI, MVT::f32, 0),
244                       MI->getOperand(MI->getNumOperands() - 1).getImm(),
245                       ShuffleMask);
246     Src1Name = getRegName(MI->getOperand(1).getReg());
247     DestName = getRegName(MI->getOperand(0).getReg());
248     break;
249
250   case X86::PBLENDWrri:
251   case X86::VPBLENDWrri:
252   case X86::VPBLENDWYrri:
253     Src2Name = getRegName(MI->getOperand(2).getReg());
254     // FALL THROUGH.
255   case X86::PBLENDWrmi:
256   case X86::VPBLENDWrmi:
257   case X86::VPBLENDWYrmi:
258     if (MI->getOperand(MI->getNumOperands() - 1).isImm())
259       DecodeBLENDMask(getRegOperandVectorVT(MI, MVT::i16, 0),
260                       MI->getOperand(MI->getNumOperands() - 1).getImm(),
261                       ShuffleMask);
262     Src1Name = getRegName(MI->getOperand(1).getReg());
263     DestName = getRegName(MI->getOperand(0).getReg());
264     break;
265
266   case X86::VPBLENDDrri:
267   case X86::VPBLENDDYrri:
268     Src2Name = getRegName(MI->getOperand(2).getReg());
269     // FALL THROUGH.
270   case X86::VPBLENDDrmi:
271   case X86::VPBLENDDYrmi:
272     if (MI->getOperand(MI->getNumOperands() - 1).isImm())
273       DecodeBLENDMask(getRegOperandVectorVT(MI, MVT::i32, 0),
274                       MI->getOperand(MI->getNumOperands() - 1).getImm(),
275                       ShuffleMask);
276     Src1Name = getRegName(MI->getOperand(1).getReg());
277     DestName = getRegName(MI->getOperand(0).getReg());
278     break;
279
280   case X86::INSERTPSrr:
281   case X86::VINSERTPSrr:
282     Src2Name = getRegName(MI->getOperand(2).getReg());
283     // FALL THROUGH.
284   case X86::INSERTPSrm:
285   case X86::VINSERTPSrm:
286     DestName = getRegName(MI->getOperand(0).getReg());
287     Src1Name = getRegName(MI->getOperand(1).getReg());
288     if (MI->getOperand(MI->getNumOperands() - 1).isImm())
289       DecodeINSERTPSMask(MI->getOperand(MI->getNumOperands() - 1).getImm(),
290                          ShuffleMask);
291     break;
292
293   case X86::MOVLHPSrr:
294   case X86::VMOVLHPSrr:
295   case X86::VMOVLHPSZrr:
296     Src2Name = getRegName(MI->getOperand(2).getReg());
297     Src1Name = getRegName(MI->getOperand(1).getReg());
298     DestName = getRegName(MI->getOperand(0).getReg());
299     DecodeMOVLHPSMask(2, ShuffleMask);
300     break;
301
302   case X86::MOVHLPSrr:
303   case X86::VMOVHLPSrr:
304   case X86::VMOVHLPSZrr:
305     Src2Name = getRegName(MI->getOperand(2).getReg());
306     Src1Name = getRegName(MI->getOperand(1).getReg());
307     DestName = getRegName(MI->getOperand(0).getReg());
308     DecodeMOVHLPSMask(2, ShuffleMask);
309     break;
310
311   CASE_MOVDUP(MOVSLDUP, r)
312     Src1Name = getRegName(MI->getOperand(MI->getNumOperands() - 1).getReg());
313     // FALL THROUGH.
314   CASE_MOVDUP(MOVSLDUP, m)
315     DestName = getRegName(MI->getOperand(0).getReg());
316     DecodeMOVSLDUPMask(getRegOperandVectorVT(MI, MVT::f32, 0), ShuffleMask);
317     break;
318
319   CASE_MOVDUP(MOVSHDUP, r)
320     Src1Name = getRegName(MI->getOperand(MI->getNumOperands() - 1).getReg());
321     // FALL THROUGH.
322   CASE_MOVDUP(MOVSHDUP, m)
323     DestName = getRegName(MI->getOperand(0).getReg());
324     DecodeMOVSHDUPMask(getRegOperandVectorVT(MI, MVT::f32, 0), ShuffleMask);
325     break;
326
327   CASE_MOVDUP(MOVDDUP, r)
328     Src1Name = getRegName(MI->getOperand(MI->getNumOperands() - 1).getReg());
329     // FALL THROUGH.
330   CASE_MOVDUP(MOVDDUP, m)
331     DestName = getRegName(MI->getOperand(0).getReg());
332     DecodeMOVDDUPMask(getRegOperandVectorVT(MI, MVT::f64, 0), ShuffleMask);
333     break;
334
335   case X86::PSLLDQri:
336   case X86::VPSLLDQri:
337   case X86::VPSLLDQYri:
338     Src1Name = getRegName(MI->getOperand(1).getReg());
339     DestName = getRegName(MI->getOperand(0).getReg());
340     if (MI->getOperand(MI->getNumOperands() - 1).isImm())
341       DecodePSLLDQMask(getRegOperandVectorVT(MI, MVT::i8, 0),
342                        MI->getOperand(MI->getNumOperands() - 1).getImm(),
343                        ShuffleMask);
344     break;
345
346   case X86::PSRLDQri:
347   case X86::VPSRLDQri:
348   case X86::VPSRLDQYri:
349     Src1Name = getRegName(MI->getOperand(1).getReg());
350     DestName = getRegName(MI->getOperand(0).getReg());
351     if (MI->getOperand(MI->getNumOperands() - 1).isImm())
352       DecodePSRLDQMask(getRegOperandVectorVT(MI, MVT::i8, 0),
353                        MI->getOperand(MI->getNumOperands() - 1).getImm(),
354                        ShuffleMask);
355     break;
356
357   case X86::PALIGNR128rr:
358   case X86::VPALIGNR128rr:
359   case X86::VPALIGNR256rr:
360     Src1Name = getRegName(MI->getOperand(2).getReg());
361     // FALL THROUGH.
362   case X86::PALIGNR128rm:
363   case X86::VPALIGNR128rm:
364   case X86::VPALIGNR256rm:
365     Src2Name = getRegName(MI->getOperand(1).getReg());
366     DestName = getRegName(MI->getOperand(0).getReg());
367     if (MI->getOperand(MI->getNumOperands() - 1).isImm())
368       DecodePALIGNRMask(getRegOperandVectorVT(MI, MVT::i8, 0),
369                         MI->getOperand(MI->getNumOperands() - 1).getImm(),
370                         ShuffleMask);
371     break;
372
373   case X86::PSHUFDri:
374   case X86::VPSHUFDri:
375   case X86::VPSHUFDYri:
376     Src1Name = getRegName(MI->getOperand(1).getReg());
377     // FALL THROUGH.
378   case X86::PSHUFDmi:
379   case X86::VPSHUFDmi:
380   case X86::VPSHUFDYmi:
381     DestName = getRegName(MI->getOperand(0).getReg());
382     if (MI->getOperand(MI->getNumOperands() - 1).isImm())
383       DecodePSHUFMask(getRegOperandVectorVT(MI, MVT::i32, 0),
384                       MI->getOperand(MI->getNumOperands() - 1).getImm(),
385                       ShuffleMask);
386     break;
387
388   case X86::PSHUFHWri:
389   case X86::VPSHUFHWri:
390   case X86::VPSHUFHWYri:
391     Src1Name = getRegName(MI->getOperand(1).getReg());
392     // FALL THROUGH.
393   case X86::PSHUFHWmi:
394   case X86::VPSHUFHWmi:
395   case X86::VPSHUFHWYmi:
396     DestName = getRegName(MI->getOperand(0).getReg());
397     if (MI->getOperand(MI->getNumOperands() - 1).isImm())
398       DecodePSHUFHWMask(getRegOperandVectorVT(MI, MVT::i16, 0),
399                         MI->getOperand(MI->getNumOperands() - 1).getImm(),
400                         ShuffleMask);
401     break;
402
403   case X86::PSHUFLWri:
404   case X86::VPSHUFLWri:
405   case X86::VPSHUFLWYri:
406     Src1Name = getRegName(MI->getOperand(1).getReg());
407     // FALL THROUGH.
408   case X86::PSHUFLWmi:
409   case X86::VPSHUFLWmi:
410   case X86::VPSHUFLWYmi:
411     DestName = getRegName(MI->getOperand(0).getReg());
412     if (MI->getOperand(MI->getNumOperands() - 1).isImm())
413       DecodePSHUFLWMask(getRegOperandVectorVT(MI, MVT::i16, 0),
414                         MI->getOperand(MI->getNumOperands() - 1).getImm(),
415                         ShuffleMask);
416     break;
417
418   case X86::MMX_PSHUFWri:
419     Src1Name = getRegName(MI->getOperand(1).getReg());
420     // FALL THROUGH.
421   case X86::MMX_PSHUFWmi:
422     DestName = getRegName(MI->getOperand(0).getReg());
423     if (MI->getOperand(MI->getNumOperands() - 1).isImm())
424       DecodePSHUFMask(MVT::v4i16,
425                       MI->getOperand(MI->getNumOperands() - 1).getImm(),
426                       ShuffleMask);
427     break;
428
429   case X86::PSWAPDrr:
430     Src1Name = getRegName(MI->getOperand(1).getReg());
431     // FALL THROUGH.
432   case X86::PSWAPDrm:
433     DestName = getRegName(MI->getOperand(0).getReg());
434     DecodePSWAPMask(MVT::v2i32, ShuffleMask);
435     break;
436
437   CASE_UNPCK(PUNPCKHBW, r)
438   case X86::MMX_PUNPCKHBWirr:
439     Src2Name = getRegName(MI->getOperand(2).getReg());
440     // FALL THROUGH.
441   CASE_UNPCK(PUNPCKHBW, m)
442   case X86::MMX_PUNPCKHBWirm:
443     Src1Name = getRegName(MI->getOperand(1).getReg());
444     DestName = getRegName(MI->getOperand(0).getReg());
445     DecodeUNPCKHMask(getRegOperandVectorVT(MI, MVT::i8, 0), ShuffleMask);
446     break;
447
448   CASE_UNPCK(PUNPCKHWD, r)
449   case X86::MMX_PUNPCKHWDirr:
450     Src2Name = getRegName(MI->getOperand(2).getReg());
451     // FALL THROUGH.
452   CASE_UNPCK(PUNPCKHWD, m)
453   case X86::MMX_PUNPCKHWDirm:
454     Src1Name = getRegName(MI->getOperand(1).getReg());
455     DestName = getRegName(MI->getOperand(0).getReg());
456     DecodeUNPCKHMask(getRegOperandVectorVT(MI, MVT::i16, 0), ShuffleMask);
457     break;
458
459   CASE_UNPCK(PUNPCKHDQ, r)
460   case X86::MMX_PUNPCKHDQirr:
461     Src2Name = getRegName(MI->getOperand(2).getReg());
462     // FALL THROUGH.
463   CASE_UNPCK(PUNPCKHDQ, m)
464   case X86::MMX_PUNPCKHDQirm:
465     Src1Name = getRegName(MI->getOperand(1).getReg());
466     DestName = getRegName(MI->getOperand(0).getReg());
467     DecodeUNPCKHMask(getRegOperandVectorVT(MI, MVT::i32, 0), ShuffleMask);
468     break;
469
470   CASE_UNPCK(PUNPCKHQDQ, r)
471     Src2Name = getRegName(MI->getOperand(2).getReg());
472     // FALL THROUGH.
473   CASE_UNPCK(PUNPCKHQDQ, m)
474     Src1Name = getRegName(MI->getOperand(1).getReg());
475     DestName = getRegName(MI->getOperand(0).getReg());
476     DecodeUNPCKHMask(getRegOperandVectorVT(MI, MVT::i64, 0), ShuffleMask);
477     break;
478
479   CASE_UNPCK(PUNPCKLBW, r)
480   case X86::MMX_PUNPCKLBWirr:
481     Src2Name = getRegName(MI->getOperand(2).getReg());
482     // FALL THROUGH.
483   CASE_UNPCK(PUNPCKLBW, m)
484   case X86::MMX_PUNPCKLBWirm:
485     Src1Name = getRegName(MI->getOperand(1).getReg());
486     DestName = getRegName(MI->getOperand(0).getReg());
487     DecodeUNPCKLMask(getRegOperandVectorVT(MI, MVT::i8, 0), ShuffleMask);
488     break;
489
490   CASE_UNPCK(PUNPCKLWD, r)
491   case X86::MMX_PUNPCKLWDirr:
492     Src2Name = getRegName(MI->getOperand(2).getReg());
493     // FALL THROUGH.
494   CASE_UNPCK(PUNPCKLWD, m)
495   case X86::MMX_PUNPCKLWDirm:
496     Src1Name = getRegName(MI->getOperand(1).getReg());
497     DestName = getRegName(MI->getOperand(0).getReg());
498     DecodeUNPCKLMask(getRegOperandVectorVT(MI, MVT::i16, 0), ShuffleMask);
499     break;
500
501   CASE_UNPCK(PUNPCKLDQ, r)
502   case X86::MMX_PUNPCKLDQirr:
503     Src2Name = getRegName(MI->getOperand(2).getReg());
504     // FALL THROUGH.
505   CASE_UNPCK(PUNPCKLDQ, m)
506   case X86::MMX_PUNPCKLDQirm:
507     Src1Name = getRegName(MI->getOperand(1).getReg());
508     DestName = getRegName(MI->getOperand(0).getReg());
509     DecodeUNPCKLMask(getRegOperandVectorVT(MI, MVT::i32, 0), ShuffleMask);
510     break;
511
512   CASE_UNPCK(PUNPCKLQDQ, r)
513     Src2Name = getRegName(MI->getOperand(2).getReg());
514     // FALL THROUGH.
515   CASE_UNPCK(PUNPCKLQDQ, m)
516     Src1Name = getRegName(MI->getOperand(1).getReg());
517     DestName = getRegName(MI->getOperand(0).getReg());
518     DecodeUNPCKLMask(getRegOperandVectorVT(MI, MVT::i64, 0), ShuffleMask);
519     break;
520
521   CASE_SHUF(SHUFPD, r)
522     Src2Name = getRegName(MI->getOperand(2).getReg());
523     // FALL THROUGH.
524   CASE_SHUF(SHUFPD, m)
525     if (MI->getOperand(MI->getNumOperands() - 1).isImm())
526       DecodeSHUFPMask(getRegOperandVectorVT(MI, MVT::f64, 0),
527                       MI->getOperand(MI->getNumOperands() - 1).getImm(),
528                       ShuffleMask);
529     Src1Name = getRegName(MI->getOperand(1).getReg());
530     DestName = getRegName(MI->getOperand(0).getReg());
531     break;
532
533   CASE_SHUF(SHUFPS, r)
534     Src2Name = getRegName(MI->getOperand(2).getReg());
535     // FALL THROUGH.
536   CASE_SHUF(SHUFPS, m)
537     if (MI->getOperand(MI->getNumOperands() - 1).isImm())
538       DecodeSHUFPMask(getRegOperandVectorVT(MI, MVT::f32, 0),
539                       MI->getOperand(MI->getNumOperands() - 1).getImm(),
540                       ShuffleMask);
541     Src1Name = getRegName(MI->getOperand(1).getReg());
542     DestName = getRegName(MI->getOperand(0).getReg());
543     break;
544
545   CASE_VSHUF(64X2, r)
546   CASE_VSHUF(64X2, m)
547   CASE_VSHUF(32X4, r)
548   CASE_VSHUF(32X4, m) {
549     MVT VT;
550     bool HasMemOp;
551     unsigned NumOp = MI->getNumOperands();
552     getVSHUF64x2FamilyInfo(MI, VT, HasMemOp);
553     decodeVSHUF64x2FamilyMask(VT, MI->getOperand(NumOp - 1).getImm(),
554                               ShuffleMask);
555     DestName = getRegName(MI->getOperand(0).getReg());
556     if (HasMemOp) {
557       assert((NumOp >= 8) && "Expected at least 8 operands!");
558       Src1Name = getRegName(MI->getOperand(NumOp - 7).getReg());
559     } else {
560       assert((NumOp >= 4) && "Expected at least 4 operands!");
561       Src2Name = getRegName(MI->getOperand(NumOp - 2).getReg());
562       Src1Name = getRegName(MI->getOperand(NumOp - 3).getReg());
563     }
564     break;
565   }
566
567   CASE_UNPCK(UNPCKLPD, r)
568     Src2Name = getRegName(MI->getOperand(2).getReg());
569     // FALL THROUGH.
570   CASE_UNPCK(UNPCKLPD, m)
571     DecodeUNPCKLMask(getRegOperandVectorVT(MI, MVT::f64, 0), ShuffleMask);
572     Src1Name = getRegName(MI->getOperand(1).getReg());
573     DestName = getRegName(MI->getOperand(0).getReg());
574     break;
575
576   CASE_UNPCK(UNPCKLPS, r)
577     Src2Name = getRegName(MI->getOperand(2).getReg());
578     // FALL THROUGH.
579   CASE_UNPCK(UNPCKLPS, m)
580     DecodeUNPCKLMask(getRegOperandVectorVT(MI, MVT::f32, 0), ShuffleMask);
581     Src1Name = getRegName(MI->getOperand(1).getReg());
582     DestName = getRegName(MI->getOperand(0).getReg());
583     break;
584
585   CASE_UNPCK(UNPCKHPD, r)
586     Src2Name = getRegName(MI->getOperand(2).getReg());
587     // FALL THROUGH.
588   CASE_UNPCK(UNPCKHPD, m)
589     DecodeUNPCKHMask(getRegOperandVectorVT(MI, MVT::f64, 0), ShuffleMask);
590     Src1Name = getRegName(MI->getOperand(1).getReg());
591     DestName = getRegName(MI->getOperand(0).getReg());
592     break;
593
594   CASE_UNPCK(UNPCKHPS, r)
595     Src2Name = getRegName(MI->getOperand(2).getReg());
596     // FALL THROUGH.
597   CASE_UNPCK(UNPCKHPS, m)
598     DecodeUNPCKHMask(getRegOperandVectorVT(MI, MVT::f32, 0), ShuffleMask);
599     Src1Name = getRegName(MI->getOperand(1).getReg());
600     DestName = getRegName(MI->getOperand(0).getReg());
601     break;
602
603   CASE_VPERM(PERMILPS, r)
604     Src1Name = getRegName(MI->getOperand(1).getReg());
605     // FALL THROUGH.
606   CASE_VPERM(PERMILPS, m)
607     if (MI->getOperand(MI->getNumOperands() - 1).isImm())
608       DecodePSHUFMask(getRegOperandVectorVT(MI, MVT::f32, 0),
609                       MI->getOperand(MI->getNumOperands() - 1).getImm(),
610                       ShuffleMask);
611     DestName = getRegName(MI->getOperand(0).getReg());
612     break;
613
614   CASE_VPERM(PERMILPD, r)
615     Src1Name = getRegName(MI->getOperand(1).getReg());
616     // FALL THROUGH.
617   CASE_VPERM(PERMILPD, m)
618     if (MI->getOperand(MI->getNumOperands() - 1).isImm())
619       DecodePSHUFMask(getRegOperandVectorVT(MI, MVT::f64, 0),
620                       MI->getOperand(MI->getNumOperands() - 1).getImm(),
621                       ShuffleMask);
622     DestName = getRegName(MI->getOperand(0).getReg());
623     break;
624
625   case X86::VPERM2F128rr:
626   case X86::VPERM2I128rr:
627     Src2Name = getRegName(MI->getOperand(2).getReg());
628     // FALL THROUGH.
629   case X86::VPERM2F128rm:
630   case X86::VPERM2I128rm:
631     // For instruction comments purpose, assume the 256-bit vector is v4i64.
632     if (MI->getOperand(MI->getNumOperands() - 1).isImm())
633       DecodeVPERM2X128Mask(MVT::v4i64,
634                            MI->getOperand(MI->getNumOperands() - 1).getImm(),
635                            ShuffleMask);
636     Src1Name = getRegName(MI->getOperand(1).getReg());
637     DestName = getRegName(MI->getOperand(0).getReg());
638     break;
639
640   case X86::VPERMQYri:
641   case X86::VPERMPDYri:
642     Src1Name = getRegName(MI->getOperand(1).getReg());
643     // FALL THROUGH.
644   case X86::VPERMQYmi:
645   case X86::VPERMPDYmi:
646     if (MI->getOperand(MI->getNumOperands() - 1).isImm())
647       DecodeVPERMMask(MI->getOperand(MI->getNumOperands() - 1).getImm(),
648                       ShuffleMask);
649     DestName = getRegName(MI->getOperand(0).getReg());
650     break;
651
652   case X86::MOVSDrr:
653   case X86::VMOVSDrr:
654     Src2Name = getRegName(MI->getOperand(2).getReg());
655     Src1Name = getRegName(MI->getOperand(1).getReg());
656     // FALL THROUGH.
657   case X86::MOVSDrm:
658   case X86::VMOVSDrm:
659     DecodeScalarMoveMask(MVT::v2f64, nullptr == Src2Name, ShuffleMask);
660     DestName = getRegName(MI->getOperand(0).getReg());
661     break;
662
663   case X86::MOVSSrr:
664   case X86::VMOVSSrr:
665     Src2Name = getRegName(MI->getOperand(2).getReg());
666     Src1Name = getRegName(MI->getOperand(1).getReg());
667     // FALL THROUGH.
668   case X86::MOVSSrm:
669   case X86::VMOVSSrm:
670     DecodeScalarMoveMask(MVT::v4f32, nullptr == Src2Name, ShuffleMask);
671     DestName = getRegName(MI->getOperand(0).getReg());
672     break;
673
674   case X86::MOVPQI2QIrr:
675   case X86::MOVZPQILo2PQIrr:\r
676   case X86::VMOVPQI2QIrr:\r
677   case X86::VMOVZPQILo2PQIrr:\r
678   case X86::VMOVZPQILo2PQIZrr:\r
679     Src1Name = getRegName(MI->getOperand(1).getReg());\r
680   // FALL THROUGH.\r
681   case X86::MOVQI2PQIrm:\r
682   case X86::MOVZQI2PQIrm:
683   case X86::MOVZPQILo2PQIrm:
684   case X86::VMOVQI2PQIrm:\r
685   case X86::VMOVZQI2PQIrm:\r
686   case X86::VMOVZPQILo2PQIrm:\r
687   case X86::VMOVZPQILo2PQIZrm:\r
688     DecodeZeroMoveLowMask(MVT::v2i64, ShuffleMask);\r
689     DestName = getRegName(MI->getOperand(0).getReg());\r
690     break;\r
691
692   case X86::MOVDI2PDIrm:
693   case X86::VMOVDI2PDIrm:
694     DecodeZeroMoveLowMask(MVT::v4i32, ShuffleMask);
695     DestName = getRegName(MI->getOperand(0).getReg());
696     break;
697
698   case X86::EXTRQI:
699     if (MI->getOperand(2).isImm() &&
700         MI->getOperand(3).isImm())
701       DecodeEXTRQIMask(MI->getOperand(2).getImm(),
702                        MI->getOperand(3).getImm(),
703                        ShuffleMask);
704
705     DestName = getRegName(MI->getOperand(0).getReg());
706     Src1Name = getRegName(MI->getOperand(1).getReg());
707     break;
708
709   case X86::INSERTQI:
710     if (MI->getOperand(3).isImm() &&
711         MI->getOperand(4).isImm())
712       DecodeINSERTQIMask(MI->getOperand(3).getImm(),
713                          MI->getOperand(4).getImm(),
714                          ShuffleMask);
715
716     DestName = getRegName(MI->getOperand(0).getReg());
717     Src1Name = getRegName(MI->getOperand(1).getReg());
718     Src2Name = getRegName(MI->getOperand(2).getReg());
719     break;
720
721   case X86::PMOVZXBWrr:
722   case X86::PMOVZXBDrr:
723   case X86::PMOVZXBQrr:
724   case X86::PMOVZXWDrr:
725   case X86::PMOVZXWQrr:
726   case X86::PMOVZXDQrr:
727   case X86::VPMOVZXBWrr:
728   case X86::VPMOVZXBDrr:
729   case X86::VPMOVZXBQrr:
730   case X86::VPMOVZXWDrr:
731   case X86::VPMOVZXWQrr:
732   case X86::VPMOVZXDQrr:
733   case X86::VPMOVZXBWYrr:
734   case X86::VPMOVZXBDYrr:
735   case X86::VPMOVZXBQYrr:
736   case X86::VPMOVZXWDYrr:
737   case X86::VPMOVZXWQYrr:
738   case X86::VPMOVZXDQYrr:
739     Src1Name = getRegName(MI->getOperand(1).getReg());
740   // FALL THROUGH.
741   case X86::PMOVZXBWrm:
742   case X86::PMOVZXBDrm:
743   case X86::PMOVZXBQrm:
744   case X86::PMOVZXWDrm:
745   case X86::PMOVZXWQrm:
746   case X86::PMOVZXDQrm:
747   case X86::VPMOVZXBWrm:
748   case X86::VPMOVZXBDrm:
749   case X86::VPMOVZXBQrm:
750   case X86::VPMOVZXWDrm:
751   case X86::VPMOVZXWQrm:
752   case X86::VPMOVZXDQrm:
753   case X86::VPMOVZXBWYrm:
754   case X86::VPMOVZXBDYrm:
755   case X86::VPMOVZXBQYrm:
756   case X86::VPMOVZXWDYrm:
757   case X86::VPMOVZXWQYrm:
758   case X86::VPMOVZXDQYrm: {
759     MVT SrcVT, DstVT;
760     getZeroExtensionTypes(MI, SrcVT, DstVT);
761     DecodeZeroExtendMask(SrcVT, DstVT, ShuffleMask);
762     DestName = getRegName(MI->getOperand(0).getReg());
763   } break;
764   }
765
766   // The only comments we decode are shuffles, so give up if we were unable to
767   // decode a shuffle mask.
768   if (ShuffleMask.empty())
769     return false;
770
771   if (!DestName) DestName = Src1Name;
772   OS << (DestName ? DestName : "mem") << " = ";
773
774   // If the two sources are the same, canonicalize the input elements to be
775   // from the first src so that we get larger element spans.
776   if (Src1Name == Src2Name) {
777     for (unsigned i = 0, e = ShuffleMask.size(); i != e; ++i) {
778       if ((int)ShuffleMask[i] >= 0 && // Not sentinel.
779           ShuffleMask[i] >= (int)e)   // From second mask.
780         ShuffleMask[i] -= e;
781     }
782   }
783
784   // The shuffle mask specifies which elements of the src1/src2 fill in the
785   // destination, with a few sentinel values.  Loop through and print them
786   // out.
787   for (unsigned i = 0, e = ShuffleMask.size(); i != e; ++i) {
788     if (i != 0)
789       OS << ',';
790     if (ShuffleMask[i] == SM_SentinelZero) {
791       OS << "zero";
792       continue;
793     }
794
795     // Otherwise, it must come from src1 or src2.  Print the span of elements
796     // that comes from this src.
797     bool isSrc1 = ShuffleMask[i] < (int)ShuffleMask.size();
798     const char *SrcName = isSrc1 ? Src1Name : Src2Name;
799     OS << (SrcName ? SrcName : "mem") << '[';
800     bool IsFirst = true;
801     while (i != e && (int)ShuffleMask[i] != SM_SentinelZero &&
802            (ShuffleMask[i] < (int)ShuffleMask.size()) == isSrc1) {
803       if (!IsFirst)
804         OS << ',';
805       else
806         IsFirst = false;
807       if (ShuffleMask[i] == SM_SentinelUndef)
808         OS << "u";
809       else
810         OS << ShuffleMask[i] % ShuffleMask.size();
811       ++i;
812     }
813     OS << ']';
814     --i; // For loop increments element #.
815   }
816   //MI->print(OS, 0);
817   OS << "\n";
818
819   // We successfully added a comment to this instruction.
820   return true;
821 }