[AVX512] Add pretty-printing of shuffle mask for unpacks
[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 //===----------------------------------------------------------------------===//
25 // Top Level Entrypoint
26 //===----------------------------------------------------------------------===//
27
28 /// EmitAnyX86InstComments - This function decodes x86 instructions and prints
29 /// newline terminated strings to the specified string if desired.  This
30 /// information is shown in disassembly dumps when verbose assembly is enabled.
31 bool llvm::EmitAnyX86InstComments(const MCInst *MI, raw_ostream &OS,
32                                   const char *(*getRegName)(unsigned)) {
33   // If this is a shuffle operation, the switch should fill in this state.
34   SmallVector<int, 8> ShuffleMask;
35   const char *DestName = nullptr, *Src1Name = nullptr, *Src2Name = nullptr;
36
37   switch (MI->getOpcode()) {
38   default:
39     // Not an instruction for which we can decode comments.
40     return false;
41
42   case X86::BLENDPDrri:
43   case X86::VBLENDPDrri:
44     Src2Name = getRegName(MI->getOperand(2).getReg());
45     // FALL THROUGH.
46   case X86::BLENDPDrmi:
47   case X86::VBLENDPDrmi:
48     if(MI->getOperand(MI->getNumOperands()-1).isImm())
49       DecodeBLENDMask(MVT::v2f64,
50                       MI->getOperand(MI->getNumOperands()-1).getImm(),
51                       ShuffleMask);
52     Src1Name = getRegName(MI->getOperand(1).getReg());
53     DestName = getRegName(MI->getOperand(0).getReg());
54     break;
55   case X86::VBLENDPDYrri:
56     Src2Name = getRegName(MI->getOperand(2).getReg());
57     // FALL THROUGH.
58   case X86::VBLENDPDYrmi:
59     if(MI->getOperand(MI->getNumOperands()-1).isImm())
60       DecodeBLENDMask(MVT::v4f64,
61                       MI->getOperand(MI->getNumOperands()-1).getImm(),
62                       ShuffleMask);
63     Src1Name = getRegName(MI->getOperand(1).getReg());
64     DestName = getRegName(MI->getOperand(0).getReg());
65     break;
66
67   case X86::BLENDPSrri:
68   case X86::VBLENDPSrri:
69     Src2Name = getRegName(MI->getOperand(2).getReg());
70     // FALL THROUGH.
71   case X86::BLENDPSrmi:
72   case X86::VBLENDPSrmi:
73     if(MI->getOperand(MI->getNumOperands()-1).isImm())
74       DecodeBLENDMask(MVT::v4f32,
75                       MI->getOperand(MI->getNumOperands()-1).getImm(),
76                       ShuffleMask);
77     Src1Name = getRegName(MI->getOperand(1).getReg());
78     DestName = getRegName(MI->getOperand(0).getReg());
79     break;
80   case X86::VBLENDPSYrri:
81     Src2Name = getRegName(MI->getOperand(2).getReg());
82     // FALL THROUGH.
83   case X86::VBLENDPSYrmi:
84     if(MI->getOperand(MI->getNumOperands()-1).isImm())
85       DecodeBLENDMask(MVT::v8f32,
86                       MI->getOperand(MI->getNumOperands()-1).getImm(),
87                       ShuffleMask);
88     Src1Name = getRegName(MI->getOperand(1).getReg());
89     DestName = getRegName(MI->getOperand(0).getReg());
90     break;
91
92   case X86::PBLENDWrri:
93   case X86::VPBLENDWrri:
94     Src2Name = getRegName(MI->getOperand(2).getReg());
95     // FALL THROUGH.
96   case X86::PBLENDWrmi:
97   case X86::VPBLENDWrmi:
98     if(MI->getOperand(MI->getNumOperands()-1).isImm())
99       DecodeBLENDMask(MVT::v8i16,
100                       MI->getOperand(MI->getNumOperands()-1).getImm(),
101                       ShuffleMask);
102     Src1Name = getRegName(MI->getOperand(1).getReg());
103     DestName = getRegName(MI->getOperand(0).getReg());
104     break;
105   case X86::VPBLENDWYrri:
106     Src2Name = getRegName(MI->getOperand(2).getReg());
107     // FALL THROUGH.
108   case X86::VPBLENDWYrmi:
109     if(MI->getOperand(MI->getNumOperands()-1).isImm())
110       DecodeBLENDMask(MVT::v16i16,
111                       MI->getOperand(MI->getNumOperands()-1).getImm(),
112                       ShuffleMask);
113     Src1Name = getRegName(MI->getOperand(1).getReg());
114     DestName = getRegName(MI->getOperand(0).getReg());
115     break;
116
117   case X86::VPBLENDDrri:
118     Src2Name = getRegName(MI->getOperand(2).getReg());
119     // FALL THROUGH.
120   case X86::VPBLENDDrmi:
121     if(MI->getOperand(MI->getNumOperands()-1).isImm())
122       DecodeBLENDMask(MVT::v4i32,
123                       MI->getOperand(MI->getNumOperands()-1).getImm(),
124                       ShuffleMask);
125     Src1Name = getRegName(MI->getOperand(1).getReg());
126     DestName = getRegName(MI->getOperand(0).getReg());
127     break;
128
129   case X86::VPBLENDDYrri:
130     Src2Name = getRegName(MI->getOperand(2).getReg());
131     // FALL THROUGH.
132   case X86::VPBLENDDYrmi:
133     if(MI->getOperand(MI->getNumOperands()-1).isImm())
134       DecodeBLENDMask(MVT::v8i32,
135                       MI->getOperand(MI->getNumOperands()-1).getImm(),
136                       ShuffleMask);
137     Src1Name = getRegName(MI->getOperand(1).getReg());
138     DestName = getRegName(MI->getOperand(0).getReg());
139     break;
140
141   case X86::INSERTPSrr:
142   case X86::VINSERTPSrr:
143     Src2Name = getRegName(MI->getOperand(2).getReg());
144     // FALL THROUGH.
145   case X86::INSERTPSrm:
146   case X86::VINSERTPSrm:
147     DestName = getRegName(MI->getOperand(0).getReg());
148     Src1Name = getRegName(MI->getOperand(1).getReg());
149     if(MI->getOperand(MI->getNumOperands()-1).isImm())
150       DecodeINSERTPSMask(MI->getOperand(MI->getNumOperands()-1).getImm(),
151                          ShuffleMask);
152     break;
153
154   case X86::MOVLHPSrr:
155   case X86::VMOVLHPSrr:
156     Src2Name = getRegName(MI->getOperand(2).getReg());
157     Src1Name = getRegName(MI->getOperand(1).getReg());
158     DestName = getRegName(MI->getOperand(0).getReg());
159     DecodeMOVLHPSMask(2, ShuffleMask);
160     break;
161
162   case X86::MOVHLPSrr:
163   case X86::VMOVHLPSrr:
164     Src2Name = getRegName(MI->getOperand(2).getReg());
165     Src1Name = getRegName(MI->getOperand(1).getReg());
166     DestName = getRegName(MI->getOperand(0).getReg());
167     DecodeMOVHLPSMask(2, ShuffleMask);
168     break;
169
170   case X86::MOVSLDUPrr:
171   case X86::VMOVSLDUPrr:
172     Src1Name = getRegName(MI->getOperand(1).getReg());
173     // FALL THROUGH.
174   case X86::MOVSLDUPrm:
175   case X86::VMOVSLDUPrm:
176     DestName = getRegName(MI->getOperand(0).getReg());
177     DecodeMOVSLDUPMask(MVT::v4f32, ShuffleMask);
178     break;
179
180   case X86::VMOVSHDUPYrr:
181     Src1Name = getRegName(MI->getOperand(1).getReg());
182     // FALL THROUGH.
183   case X86::VMOVSHDUPYrm:
184     DestName = getRegName(MI->getOperand(0).getReg());
185     DecodeMOVSHDUPMask(MVT::v8f32, ShuffleMask);
186     break;
187
188   case X86::VMOVSLDUPYrr:
189     Src1Name = getRegName(MI->getOperand(1).getReg());
190     // FALL THROUGH.
191   case X86::VMOVSLDUPYrm:
192     DestName = getRegName(MI->getOperand(0).getReg());
193     DecodeMOVSLDUPMask(MVT::v8f32, ShuffleMask);
194     break;
195
196   case X86::MOVSHDUPrr:
197   case X86::VMOVSHDUPrr:
198     Src1Name = getRegName(MI->getOperand(1).getReg());
199     // FALL THROUGH.
200   case X86::MOVSHDUPrm:
201   case X86::VMOVSHDUPrm:
202     DestName = getRegName(MI->getOperand(0).getReg());
203     DecodeMOVSHDUPMask(MVT::v4f32, ShuffleMask);
204     break;
205
206   case X86::PSLLDQri:
207   case X86::VPSLLDQri:
208     Src1Name = getRegName(MI->getOperand(1).getReg());
209     DestName = getRegName(MI->getOperand(0).getReg());
210     if(MI->getOperand(MI->getNumOperands()-1).isImm())
211       DecodePSLLDQMask(MVT::v16i8,
212                        MI->getOperand(MI->getNumOperands()-1).getImm(),
213                        ShuffleMask);
214     break;
215
216   case X86::VPSLLDQYri:
217     Src1Name = getRegName(MI->getOperand(1).getReg());
218     DestName = getRegName(MI->getOperand(0).getReg());
219     if(MI->getOperand(MI->getNumOperands()-1).isImm())
220       DecodePSLLDQMask(MVT::v32i8,
221                        MI->getOperand(MI->getNumOperands()-1).getImm(),
222                        ShuffleMask);
223     break;
224
225   case X86::PSRLDQri:
226   case X86::VPSRLDQri:
227     Src1Name = getRegName(MI->getOperand(1).getReg());
228     DestName = getRegName(MI->getOperand(0).getReg());
229     if(MI->getOperand(MI->getNumOperands()-1).isImm())
230       DecodePSRLDQMask(MVT::v16i8,
231                        MI->getOperand(MI->getNumOperands()-1).getImm(),
232                        ShuffleMask);
233     break;
234
235   case X86::VPSRLDQYri:
236     Src1Name = getRegName(MI->getOperand(1).getReg());
237     DestName = getRegName(MI->getOperand(0).getReg());
238     if(MI->getOperand(MI->getNumOperands()-1).isImm())
239       DecodePSRLDQMask(MVT::v32i8,
240                        MI->getOperand(MI->getNumOperands()-1).getImm(),
241                        ShuffleMask);
242     break;
243
244   case X86::PALIGNR128rr:
245   case X86::VPALIGNR128rr:
246     Src1Name = getRegName(MI->getOperand(2).getReg());
247     // FALL THROUGH.
248   case X86::PALIGNR128rm:
249   case X86::VPALIGNR128rm:
250     Src2Name = getRegName(MI->getOperand(1).getReg());
251     DestName = getRegName(MI->getOperand(0).getReg());
252     if(MI->getOperand(MI->getNumOperands()-1).isImm())
253       DecodePALIGNRMask(MVT::v16i8,
254                         MI->getOperand(MI->getNumOperands()-1).getImm(),
255                         ShuffleMask);
256     break;
257   case X86::VPALIGNR256rr:
258     Src1Name = getRegName(MI->getOperand(2).getReg());
259     // FALL THROUGH.
260   case X86::VPALIGNR256rm:
261     Src2Name = getRegName(MI->getOperand(1).getReg());
262     DestName = getRegName(MI->getOperand(0).getReg());
263     if(MI->getOperand(MI->getNumOperands()-1).isImm())
264       DecodePALIGNRMask(MVT::v32i8,
265                         MI->getOperand(MI->getNumOperands()-1).getImm(),
266                         ShuffleMask);
267     break;
268
269   case X86::PSHUFDri:
270   case X86::VPSHUFDri:
271     Src1Name = getRegName(MI->getOperand(1).getReg());
272     // FALL THROUGH.
273   case X86::PSHUFDmi:
274   case X86::VPSHUFDmi:
275     DestName = getRegName(MI->getOperand(0).getReg());
276     if(MI->getOperand(MI->getNumOperands()-1).isImm())
277       DecodePSHUFMask(MVT::v4i32,
278                       MI->getOperand(MI->getNumOperands()-1).getImm(),
279                       ShuffleMask);
280     break;
281   case X86::VPSHUFDYri:
282     Src1Name = getRegName(MI->getOperand(1).getReg());
283     // FALL THROUGH.
284   case X86::VPSHUFDYmi:
285     DestName = getRegName(MI->getOperand(0).getReg());
286     if(MI->getOperand(MI->getNumOperands()-1).isImm())
287       DecodePSHUFMask(MVT::v8i32,
288                       MI->getOperand(MI->getNumOperands()-1).getImm(),
289                       ShuffleMask);
290     break;
291
292
293   case X86::PSHUFHWri:
294   case X86::VPSHUFHWri:
295     Src1Name = getRegName(MI->getOperand(1).getReg());
296     // FALL THROUGH.
297   case X86::PSHUFHWmi:
298   case X86::VPSHUFHWmi:
299     DestName = getRegName(MI->getOperand(0).getReg());
300     if(MI->getOperand(MI->getNumOperands()-1).isImm())
301       DecodePSHUFHWMask(MVT::v8i16,
302                         MI->getOperand(MI->getNumOperands()-1).getImm(),
303                         ShuffleMask);
304     break;
305   case X86::VPSHUFHWYri:
306     Src1Name = getRegName(MI->getOperand(1).getReg());
307     // FALL THROUGH.
308   case X86::VPSHUFHWYmi:
309     DestName = getRegName(MI->getOperand(0).getReg());
310     if(MI->getOperand(MI->getNumOperands()-1).isImm())
311       DecodePSHUFHWMask(MVT::v16i16,
312                         MI->getOperand(MI->getNumOperands()-1).getImm(),
313                         ShuffleMask);
314     break;
315   case X86::PSHUFLWri:
316   case X86::VPSHUFLWri:
317     Src1Name = getRegName(MI->getOperand(1).getReg());
318     // FALL THROUGH.
319   case X86::PSHUFLWmi:
320   case X86::VPSHUFLWmi:
321     DestName = getRegName(MI->getOperand(0).getReg());
322     if(MI->getOperand(MI->getNumOperands()-1).isImm())
323       DecodePSHUFLWMask(MVT::v8i16,
324                         MI->getOperand(MI->getNumOperands()-1).getImm(),
325                         ShuffleMask);
326     break;
327   case X86::VPSHUFLWYri:
328     Src1Name = getRegName(MI->getOperand(1).getReg());
329     // FALL THROUGH.
330   case X86::VPSHUFLWYmi:
331     DestName = getRegName(MI->getOperand(0).getReg());
332     if(MI->getOperand(MI->getNumOperands()-1).isImm())
333       DecodePSHUFLWMask(MVT::v16i16,
334                         MI->getOperand(MI->getNumOperands()-1).getImm(),
335                         ShuffleMask);
336     break;
337
338   case X86::PUNPCKHBWrr:
339   case X86::VPUNPCKHBWrr:
340     Src2Name = getRegName(MI->getOperand(2).getReg());
341     // FALL THROUGH.
342   case X86::PUNPCKHBWrm:
343   case X86::VPUNPCKHBWrm:
344     Src1Name = getRegName(MI->getOperand(1).getReg());
345     DestName = getRegName(MI->getOperand(0).getReg());
346     DecodeUNPCKHMask(MVT::v16i8, ShuffleMask);
347     break;
348   case X86::VPUNPCKHBWYrr:
349     Src2Name = getRegName(MI->getOperand(2).getReg());
350     // FALL THROUGH.
351   case X86::VPUNPCKHBWYrm:
352     Src1Name = getRegName(MI->getOperand(1).getReg());
353     DestName = getRegName(MI->getOperand(0).getReg());
354     DecodeUNPCKHMask(MVT::v32i8, ShuffleMask);
355     break;
356   case X86::PUNPCKHWDrr:
357   case X86::VPUNPCKHWDrr:
358     Src2Name = getRegName(MI->getOperand(2).getReg());
359     // FALL THROUGH.
360   case X86::PUNPCKHWDrm:
361   case X86::VPUNPCKHWDrm:
362     Src1Name = getRegName(MI->getOperand(1).getReg());
363     DestName = getRegName(MI->getOperand(0).getReg());
364     DecodeUNPCKHMask(MVT::v8i16, ShuffleMask);
365     break;
366   case X86::VPUNPCKHWDYrr:
367     Src2Name = getRegName(MI->getOperand(2).getReg());
368     // FALL THROUGH.
369   case X86::VPUNPCKHWDYrm:
370     Src1Name = getRegName(MI->getOperand(1).getReg());
371     DestName = getRegName(MI->getOperand(0).getReg());
372     DecodeUNPCKHMask(MVT::v16i16, ShuffleMask);
373     break;
374   case X86::PUNPCKHDQrr:
375   case X86::VPUNPCKHDQrr:
376     Src2Name = getRegName(MI->getOperand(2).getReg());
377     // FALL THROUGH.
378   case X86::PUNPCKHDQrm:
379   case X86::VPUNPCKHDQrm:
380     Src1Name = getRegName(MI->getOperand(1).getReg());
381     DestName = getRegName(MI->getOperand(0).getReg());
382     DecodeUNPCKHMask(MVT::v4i32, ShuffleMask);
383     break;
384   case X86::VPUNPCKHDQYrr:
385     Src2Name = getRegName(MI->getOperand(2).getReg());
386     // FALL THROUGH.
387   case X86::VPUNPCKHDQYrm:
388     Src1Name = getRegName(MI->getOperand(1).getReg());
389     DestName = getRegName(MI->getOperand(0).getReg());
390     DecodeUNPCKHMask(MVT::v8i32, ShuffleMask);
391     break;
392   case X86::VPUNPCKHDQZrr:
393     Src2Name = getRegName(MI->getOperand(2).getReg());
394     // FALL THROUGH.
395   case X86::VPUNPCKHDQZrm:
396     Src1Name = getRegName(MI->getOperand(1).getReg());
397     DestName = getRegName(MI->getOperand(0).getReg());
398     DecodeUNPCKHMask(MVT::v16i32, ShuffleMask);
399     break;
400   case X86::PUNPCKHQDQrr:
401   case X86::VPUNPCKHQDQrr:
402     Src2Name = getRegName(MI->getOperand(2).getReg());
403     // FALL THROUGH.
404   case X86::PUNPCKHQDQrm:
405   case X86::VPUNPCKHQDQrm:
406     Src1Name = getRegName(MI->getOperand(1).getReg());
407     DestName = getRegName(MI->getOperand(0).getReg());
408     DecodeUNPCKHMask(MVT::v2i64, ShuffleMask);
409     break;
410   case X86::VPUNPCKHQDQYrr:
411     Src2Name = getRegName(MI->getOperand(2).getReg());
412     // FALL THROUGH.
413   case X86::VPUNPCKHQDQYrm:
414     Src1Name = getRegName(MI->getOperand(1).getReg());
415     DestName = getRegName(MI->getOperand(0).getReg());
416     DecodeUNPCKHMask(MVT::v4i64, ShuffleMask);
417     break;
418   case X86::VPUNPCKHQDQZrr:
419     Src2Name = getRegName(MI->getOperand(2).getReg());
420     // FALL THROUGH.
421   case X86::VPUNPCKHQDQZrm:
422     Src1Name = getRegName(MI->getOperand(1).getReg());
423     DestName = getRegName(MI->getOperand(0).getReg());
424     DecodeUNPCKHMask(MVT::v8i64, ShuffleMask);
425     break;
426
427   case X86::PUNPCKLBWrr:
428   case X86::VPUNPCKLBWrr:
429     Src2Name = getRegName(MI->getOperand(2).getReg());
430     // FALL THROUGH.
431   case X86::PUNPCKLBWrm:
432   case X86::VPUNPCKLBWrm:
433     Src1Name = getRegName(MI->getOperand(1).getReg());
434     DestName = getRegName(MI->getOperand(0).getReg());
435     DecodeUNPCKLMask(MVT::v16i8, ShuffleMask);
436     break;
437   case X86::VPUNPCKLBWYrr:
438     Src2Name = getRegName(MI->getOperand(2).getReg());
439     // FALL THROUGH.
440   case X86::VPUNPCKLBWYrm:
441     Src1Name = getRegName(MI->getOperand(1).getReg());
442     DestName = getRegName(MI->getOperand(0).getReg());
443     DecodeUNPCKLMask(MVT::v32i8, ShuffleMask);
444     break;
445   case X86::PUNPCKLWDrr:
446   case X86::VPUNPCKLWDrr:
447     Src2Name = getRegName(MI->getOperand(2).getReg());
448     // FALL THROUGH.
449   case X86::PUNPCKLWDrm:
450   case X86::VPUNPCKLWDrm:
451     Src1Name = getRegName(MI->getOperand(1).getReg());
452     DestName = getRegName(MI->getOperand(0).getReg());
453     DecodeUNPCKLMask(MVT::v8i16, ShuffleMask);
454     break;
455   case X86::VPUNPCKLWDYrr:
456     Src2Name = getRegName(MI->getOperand(2).getReg());
457     // FALL THROUGH.
458   case X86::VPUNPCKLWDYrm:
459     Src1Name = getRegName(MI->getOperand(1).getReg());
460     DestName = getRegName(MI->getOperand(0).getReg());
461     DecodeUNPCKLMask(MVT::v16i16, ShuffleMask);
462     break;
463   case X86::PUNPCKLDQrr:
464   case X86::VPUNPCKLDQrr:
465     Src2Name = getRegName(MI->getOperand(2).getReg());
466     // FALL THROUGH.
467   case X86::PUNPCKLDQrm:
468   case X86::VPUNPCKLDQrm:
469     Src1Name = getRegName(MI->getOperand(1).getReg());
470     DestName = getRegName(MI->getOperand(0).getReg());
471     DecodeUNPCKLMask(MVT::v4i32, ShuffleMask);
472     break;
473   case X86::VPUNPCKLDQYrr:
474     Src2Name = getRegName(MI->getOperand(2).getReg());
475     // FALL THROUGH.
476   case X86::VPUNPCKLDQYrm:
477     Src1Name = getRegName(MI->getOperand(1).getReg());
478     DestName = getRegName(MI->getOperand(0).getReg());
479     DecodeUNPCKLMask(MVT::v8i32, ShuffleMask);
480     break;
481   case X86::VPUNPCKLDQZrr:
482     Src2Name = getRegName(MI->getOperand(2).getReg());
483     // FALL THROUGH.
484   case X86::VPUNPCKLDQZrm:
485     Src1Name = getRegName(MI->getOperand(1).getReg());
486     DestName = getRegName(MI->getOperand(0).getReg());
487     DecodeUNPCKLMask(MVT::v16i32, ShuffleMask);
488     break;
489   case X86::PUNPCKLQDQrr:
490   case X86::VPUNPCKLQDQrr:
491     Src2Name = getRegName(MI->getOperand(2).getReg());
492     // FALL THROUGH.
493   case X86::PUNPCKLQDQrm:
494   case X86::VPUNPCKLQDQrm:
495     Src1Name = getRegName(MI->getOperand(1).getReg());
496     DestName = getRegName(MI->getOperand(0).getReg());
497     DecodeUNPCKLMask(MVT::v2i64, ShuffleMask);
498     break;
499   case X86::VPUNPCKLQDQYrr:
500     Src2Name = getRegName(MI->getOperand(2).getReg());
501     // FALL THROUGH.
502   case X86::VPUNPCKLQDQYrm:
503     Src1Name = getRegName(MI->getOperand(1).getReg());
504     DestName = getRegName(MI->getOperand(0).getReg());
505     DecodeUNPCKLMask(MVT::v4i64, ShuffleMask);
506     break;
507   case X86::VPUNPCKLQDQZrr:
508     Src2Name = getRegName(MI->getOperand(2).getReg());
509     // FALL THROUGH.
510   case X86::VPUNPCKLQDQZrm:
511     Src1Name = getRegName(MI->getOperand(1).getReg());
512     DestName = getRegName(MI->getOperand(0).getReg());
513     DecodeUNPCKLMask(MVT::v8i64, ShuffleMask);
514     break;
515
516   case X86::SHUFPDrri:
517   case X86::VSHUFPDrri:
518     Src2Name = getRegName(MI->getOperand(2).getReg());
519     // FALL THROUGH.
520   case X86::SHUFPDrmi:
521   case X86::VSHUFPDrmi:
522     if(MI->getOperand(MI->getNumOperands()-1).isImm())
523       DecodeSHUFPMask(MVT::v2f64,
524                       MI->getOperand(MI->getNumOperands()-1).getImm(),
525                       ShuffleMask);
526     Src1Name = getRegName(MI->getOperand(1).getReg());
527     DestName = getRegName(MI->getOperand(0).getReg());
528     break;
529   case X86::VSHUFPDYrri:
530     Src2Name = getRegName(MI->getOperand(2).getReg());
531     // FALL THROUGH.
532   case X86::VSHUFPDYrmi:
533     if(MI->getOperand(MI->getNumOperands()-1).isImm())
534       DecodeSHUFPMask(MVT::v4f64,
535                       MI->getOperand(MI->getNumOperands()-1).getImm(),
536                       ShuffleMask);
537     Src1Name = getRegName(MI->getOperand(1).getReg());
538     DestName = getRegName(MI->getOperand(0).getReg());
539     break;
540
541   case X86::SHUFPSrri:
542   case X86::VSHUFPSrri:
543     Src2Name = getRegName(MI->getOperand(2).getReg());
544     // FALL THROUGH.
545   case X86::SHUFPSrmi:
546   case X86::VSHUFPSrmi:
547     if(MI->getOperand(MI->getNumOperands()-1).isImm())
548       DecodeSHUFPMask(MVT::v4f32,
549                       MI->getOperand(MI->getNumOperands()-1).getImm(),
550                       ShuffleMask);
551     Src1Name = getRegName(MI->getOperand(1).getReg());
552     DestName = getRegName(MI->getOperand(0).getReg());
553     break;
554   case X86::VSHUFPSYrri:
555     Src2Name = getRegName(MI->getOperand(2).getReg());
556     // FALL THROUGH.
557   case X86::VSHUFPSYrmi:
558     if(MI->getOperand(MI->getNumOperands()-1).isImm())
559       DecodeSHUFPMask(MVT::v8f32,
560                       MI->getOperand(MI->getNumOperands()-1).getImm(),
561                       ShuffleMask);
562     Src1Name = getRegName(MI->getOperand(1).getReg());
563     DestName = getRegName(MI->getOperand(0).getReg());
564     break;
565
566   case X86::UNPCKLPDrr:
567   case X86::VUNPCKLPDrr:
568     Src2Name = getRegName(MI->getOperand(2).getReg());
569     // FALL THROUGH.
570   case X86::UNPCKLPDrm:
571   case X86::VUNPCKLPDrm:
572     DecodeUNPCKLMask(MVT::v2f64, ShuffleMask);
573     Src1Name = getRegName(MI->getOperand(1).getReg());
574     DestName = getRegName(MI->getOperand(0).getReg());
575     break;
576   case X86::VUNPCKLPDYrr:
577     Src2Name = getRegName(MI->getOperand(2).getReg());
578     // FALL THROUGH.
579   case X86::VUNPCKLPDYrm:
580     DecodeUNPCKLMask(MVT::v4f64, ShuffleMask);
581     Src1Name = getRegName(MI->getOperand(1).getReg());
582     DestName = getRegName(MI->getOperand(0).getReg());
583     break;
584   case X86::VUNPCKLPDZrr:
585     Src2Name = getRegName(MI->getOperand(2).getReg());
586     // FALL THROUGH.
587   case X86::VUNPCKLPDZrm:
588     DecodeUNPCKLMask(MVT::v8f64, ShuffleMask);
589     Src1Name = getRegName(MI->getOperand(1).getReg());
590     DestName = getRegName(MI->getOperand(0).getReg());
591     break;
592   case X86::UNPCKLPSrr:
593   case X86::VUNPCKLPSrr:
594     Src2Name = getRegName(MI->getOperand(2).getReg());
595     // FALL THROUGH.
596   case X86::UNPCKLPSrm:
597   case X86::VUNPCKLPSrm:
598     DecodeUNPCKLMask(MVT::v4f32, ShuffleMask);
599     Src1Name = getRegName(MI->getOperand(1).getReg());
600     DestName = getRegName(MI->getOperand(0).getReg());
601     break;
602   case X86::VUNPCKLPSYrr:
603     Src2Name = getRegName(MI->getOperand(2).getReg());
604     // FALL THROUGH.
605   case X86::VUNPCKLPSYrm:
606     DecodeUNPCKLMask(MVT::v8f32, ShuffleMask);
607     Src1Name = getRegName(MI->getOperand(1).getReg());
608     DestName = getRegName(MI->getOperand(0).getReg());
609     break;
610   case X86::VUNPCKLPSZrr:
611     Src2Name = getRegName(MI->getOperand(2).getReg());
612     // FALL THROUGH.
613   case X86::VUNPCKLPSZrm:
614     DecodeUNPCKLMask(MVT::v16f32, ShuffleMask);
615     Src1Name = getRegName(MI->getOperand(1).getReg());
616     DestName = getRegName(MI->getOperand(0).getReg());
617     break;
618   case X86::UNPCKHPDrr:
619   case X86::VUNPCKHPDrr:
620     Src2Name = getRegName(MI->getOperand(2).getReg());
621     // FALL THROUGH.
622   case X86::UNPCKHPDrm:
623   case X86::VUNPCKHPDrm:
624     DecodeUNPCKHMask(MVT::v2f64, ShuffleMask);
625     Src1Name = getRegName(MI->getOperand(1).getReg());
626     DestName = getRegName(MI->getOperand(0).getReg());
627     break;
628   case X86::VUNPCKHPDYrr:
629     Src2Name = getRegName(MI->getOperand(2).getReg());
630     // FALL THROUGH.
631   case X86::VUNPCKHPDYrm:
632     DecodeUNPCKHMask(MVT::v4f64, ShuffleMask);
633     Src1Name = getRegName(MI->getOperand(1).getReg());
634     DestName = getRegName(MI->getOperand(0).getReg());
635     break;
636   case X86::VUNPCKHPDZrr:
637     Src2Name = getRegName(MI->getOperand(2).getReg());
638     // FALL THROUGH.
639   case X86::VUNPCKHPDZrm:
640     DecodeUNPCKHMask(MVT::v8f64, ShuffleMask);
641     Src1Name = getRegName(MI->getOperand(1).getReg());
642     DestName = getRegName(MI->getOperand(0).getReg());
643     break;
644   case X86::UNPCKHPSrr:
645   case X86::VUNPCKHPSrr:
646     Src2Name = getRegName(MI->getOperand(2).getReg());
647     // FALL THROUGH.
648   case X86::UNPCKHPSrm:
649   case X86::VUNPCKHPSrm:
650     DecodeUNPCKHMask(MVT::v4f32, ShuffleMask);
651     Src1Name = getRegName(MI->getOperand(1).getReg());
652     DestName = getRegName(MI->getOperand(0).getReg());
653     break;
654   case X86::VUNPCKHPSYrr:
655     Src2Name = getRegName(MI->getOperand(2).getReg());
656     // FALL THROUGH.
657   case X86::VUNPCKHPSYrm:
658     DecodeUNPCKHMask(MVT::v8f32, ShuffleMask);
659     Src1Name = getRegName(MI->getOperand(1).getReg());
660     DestName = getRegName(MI->getOperand(0).getReg());
661     break;
662   case X86::VUNPCKHPSZrr:
663     Src2Name = getRegName(MI->getOperand(2).getReg());
664     // FALL THROUGH.
665   case X86::VUNPCKHPSZrm:
666     DecodeUNPCKHMask(MVT::v16f32, ShuffleMask);
667     Src1Name = getRegName(MI->getOperand(1).getReg());
668     DestName = getRegName(MI->getOperand(0).getReg());
669     break;
670   case X86::VPERMILPSri:
671     Src1Name = getRegName(MI->getOperand(1).getReg());
672     // FALL THROUGH.
673   case X86::VPERMILPSmi:
674     if(MI->getOperand(MI->getNumOperands()-1).isImm())
675       DecodePSHUFMask(MVT::v4f32,
676                       MI->getOperand(MI->getNumOperands()-1).getImm(),
677                       ShuffleMask);
678     DestName = getRegName(MI->getOperand(0).getReg());
679     break;
680   case X86::VPERMILPSYri:
681     Src1Name = getRegName(MI->getOperand(1).getReg());
682     // FALL THROUGH.
683   case X86::VPERMILPSYmi:
684     if(MI->getOperand(MI->getNumOperands()-1).isImm())
685       DecodePSHUFMask(MVT::v8f32,
686                       MI->getOperand(MI->getNumOperands()-1).getImm(),
687                       ShuffleMask);
688     DestName = getRegName(MI->getOperand(0).getReg());
689     break;
690   case X86::VPERMILPDri:
691     Src1Name = getRegName(MI->getOperand(1).getReg());
692     // FALL THROUGH.
693   case X86::VPERMILPDmi:
694     if(MI->getOperand(MI->getNumOperands()-1).isImm())
695       DecodePSHUFMask(MVT::v2f64,
696                       MI->getOperand(MI->getNumOperands()-1).getImm(),
697                       ShuffleMask);
698     DestName = getRegName(MI->getOperand(0).getReg());
699     break;
700   case X86::VPERMILPDYri:
701     Src1Name = getRegName(MI->getOperand(1).getReg());
702     // FALL THROUGH.
703   case X86::VPERMILPDYmi:
704     if(MI->getOperand(MI->getNumOperands()-1).isImm())
705       DecodePSHUFMask(MVT::v4f64,
706                       MI->getOperand(MI->getNumOperands()-1).getImm(),
707                       ShuffleMask);
708     DestName = getRegName(MI->getOperand(0).getReg());
709     break;
710   case X86::VPERM2F128rr:
711   case X86::VPERM2I128rr:
712     Src2Name = getRegName(MI->getOperand(2).getReg());
713     // FALL THROUGH.
714   case X86::VPERM2F128rm:
715   case X86::VPERM2I128rm:
716     // For instruction comments purpose, assume the 256-bit vector is v4i64.
717     if(MI->getOperand(MI->getNumOperands()-1).isImm())
718       DecodeVPERM2X128Mask(MVT::v4i64,
719                            MI->getOperand(MI->getNumOperands()-1).getImm(),
720                            ShuffleMask);
721     Src1Name = getRegName(MI->getOperand(1).getReg());
722     DestName = getRegName(MI->getOperand(0).getReg());
723     break;
724   case X86::VPERMQYri:
725   case X86::VPERMPDYri:
726     Src1Name = getRegName(MI->getOperand(1).getReg());
727     // FALL THROUGH.
728   case X86::VPERMQYmi:
729   case X86::VPERMPDYmi:
730     if(MI->getOperand(MI->getNumOperands()-1).isImm())
731       DecodeVPERMMask(MI->getOperand(MI->getNumOperands()-1).getImm(),
732                       ShuffleMask);
733     DestName = getRegName(MI->getOperand(0).getReg());
734     break;
735   }
736
737   // The only comments we decode are shuffles, so give up if we were unable to
738   // decode a shuffle mask.
739   if (ShuffleMask.empty())
740     return false;
741
742   if (!DestName) DestName = Src1Name;
743   OS << (DestName ? DestName : "mem") << " = ";
744
745   // If the two sources are the same, canonicalize the input elements to be
746   // from the first src so that we get larger element spans.
747   if (Src1Name == Src2Name) {
748     for (unsigned i = 0, e = ShuffleMask.size(); i != e; ++i) {
749       if ((int)ShuffleMask[i] >= 0 && // Not sentinel.
750           ShuffleMask[i] >= (int)e)        // From second mask.
751         ShuffleMask[i] -= e;
752     }
753   }
754
755   // The shuffle mask specifies which elements of the src1/src2 fill in the
756   // destination, with a few sentinel values.  Loop through and print them
757   // out.
758   for (unsigned i = 0, e = ShuffleMask.size(); i != e; ++i) {
759     if (i != 0)
760       OS << ',';
761     if (ShuffleMask[i] == SM_SentinelZero) {
762       OS << "zero";
763       continue;
764     }
765
766     // Otherwise, it must come from src1 or src2.  Print the span of elements
767     // that comes from this src.
768     bool isSrc1 = ShuffleMask[i] < (int)ShuffleMask.size();
769     const char *SrcName = isSrc1 ? Src1Name : Src2Name;
770     OS << (SrcName ? SrcName : "mem") << '[';
771     bool IsFirst = true;
772     while (i != e && (int)ShuffleMask[i] != SM_SentinelZero &&
773            (ShuffleMask[i] < (int)ShuffleMask.size()) == isSrc1) {
774       if (!IsFirst)
775         OS << ',';
776       else
777         IsFirst = false;
778       if (ShuffleMask[i] == SM_SentinelUndef)
779         OS << "u";
780       else
781         OS << ShuffleMask[i] % ShuffleMask.size();
782       ++i;
783     }
784     OS << ']';
785     --i;  // For loop increments element #.
786   }
787   //MI->print(OS, 0);
788   OS << "\n";
789
790   // We successfully added a comment to this instruction.
791   return true;
792 }