[x86] Teach the asm comment printing to only print the clarification of
[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
106   case X86::INSERTPSrr:
107   case X86::VINSERTPSrr:
108     DestName = getRegName(MI->getOperand(0).getReg());
109     Src1Name = getRegName(MI->getOperand(1).getReg());
110     Src2Name = getRegName(MI->getOperand(2).getReg());
111     if(MI->getOperand(3).isImm())
112       DecodeINSERTPSMask(MI->getOperand(3).getImm(), ShuffleMask);
113     break;
114
115   case X86::MOVLHPSrr:
116   case X86::VMOVLHPSrr:
117     Src2Name = getRegName(MI->getOperand(2).getReg());
118     Src1Name = getRegName(MI->getOperand(1).getReg());
119     DestName = getRegName(MI->getOperand(0).getReg());
120     DecodeMOVLHPSMask(2, ShuffleMask);
121     break;
122
123   case X86::MOVHLPSrr:
124   case X86::VMOVHLPSrr:
125     Src2Name = getRegName(MI->getOperand(2).getReg());
126     Src1Name = getRegName(MI->getOperand(1).getReg());
127     DestName = getRegName(MI->getOperand(0).getReg());
128     DecodeMOVHLPSMask(2, ShuffleMask);
129     break;
130
131   case X86::PALIGNR128rr:
132   case X86::VPALIGNR128rr:
133     Src1Name = getRegName(MI->getOperand(2).getReg());
134     // FALL THROUGH.
135   case X86::PALIGNR128rm:
136   case X86::VPALIGNR128rm:
137     Src2Name = getRegName(MI->getOperand(1).getReg());
138     DestName = getRegName(MI->getOperand(0).getReg());
139     if(MI->getOperand(MI->getNumOperands()-1).isImm())
140       DecodePALIGNRMask(MVT::v16i8,
141                         MI->getOperand(MI->getNumOperands()-1).getImm(),
142                         ShuffleMask);
143     break;
144   case X86::VPALIGNR256rr:
145     Src1Name = getRegName(MI->getOperand(2).getReg());
146     // FALL THROUGH.
147   case X86::VPALIGNR256rm:
148     Src2Name = getRegName(MI->getOperand(1).getReg());
149     DestName = getRegName(MI->getOperand(0).getReg());
150     if(MI->getOperand(MI->getNumOperands()-1).isImm())
151       DecodePALIGNRMask(MVT::v32i8,
152                         MI->getOperand(MI->getNumOperands()-1).getImm(),
153                         ShuffleMask);
154     break;
155
156   case X86::PSHUFDri:
157   case X86::VPSHUFDri:
158     Src1Name = getRegName(MI->getOperand(1).getReg());
159     // FALL THROUGH.
160   case X86::PSHUFDmi:
161   case X86::VPSHUFDmi:
162     DestName = getRegName(MI->getOperand(0).getReg());
163     if(MI->getOperand(MI->getNumOperands()-1).isImm())
164       DecodePSHUFMask(MVT::v4i32,
165                       MI->getOperand(MI->getNumOperands()-1).getImm(),
166                       ShuffleMask);
167     break;
168   case X86::VPSHUFDYri:
169     Src1Name = getRegName(MI->getOperand(1).getReg());
170     // FALL THROUGH.
171   case X86::VPSHUFDYmi:
172     DestName = getRegName(MI->getOperand(0).getReg());
173     if(MI->getOperand(MI->getNumOperands()-1).isImm())
174       DecodePSHUFMask(MVT::v8i32,
175                       MI->getOperand(MI->getNumOperands()-1).getImm(),
176                       ShuffleMask);
177     break;
178
179
180   case X86::PSHUFHWri:
181   case X86::VPSHUFHWri:
182     Src1Name = getRegName(MI->getOperand(1).getReg());
183     // FALL THROUGH.
184   case X86::PSHUFHWmi:
185   case X86::VPSHUFHWmi:
186     DestName = getRegName(MI->getOperand(0).getReg());
187     if(MI->getOperand(MI->getNumOperands()-1).isImm())
188       DecodePSHUFHWMask(MVT::v8i16,
189                         MI->getOperand(MI->getNumOperands()-1).getImm(),
190                         ShuffleMask);
191     break;
192   case X86::VPSHUFHWYri:
193     Src1Name = getRegName(MI->getOperand(1).getReg());
194     // FALL THROUGH.
195   case X86::VPSHUFHWYmi:
196     DestName = getRegName(MI->getOperand(0).getReg());
197     if(MI->getOperand(MI->getNumOperands()-1).isImm())
198       DecodePSHUFHWMask(MVT::v16i16,
199                         MI->getOperand(MI->getNumOperands()-1).getImm(),
200                         ShuffleMask);
201     break;
202   case X86::PSHUFLWri:
203   case X86::VPSHUFLWri:
204     Src1Name = getRegName(MI->getOperand(1).getReg());
205     // FALL THROUGH.
206   case X86::PSHUFLWmi:
207   case X86::VPSHUFLWmi:
208     DestName = getRegName(MI->getOperand(0).getReg());
209     if(MI->getOperand(MI->getNumOperands()-1).isImm())
210       DecodePSHUFLWMask(MVT::v8i16,
211                         MI->getOperand(MI->getNumOperands()-1).getImm(),
212                         ShuffleMask);
213     break;
214   case X86::VPSHUFLWYri:
215     Src1Name = getRegName(MI->getOperand(1).getReg());
216     // FALL THROUGH.
217   case X86::VPSHUFLWYmi:
218     DestName = getRegName(MI->getOperand(0).getReg());
219     if(MI->getOperand(MI->getNumOperands()-1).isImm())
220       DecodePSHUFLWMask(MVT::v16i16,
221                         MI->getOperand(MI->getNumOperands()-1).getImm(),
222                         ShuffleMask);
223     break;
224
225   case X86::PUNPCKHBWrr:
226   case X86::VPUNPCKHBWrr:
227     Src2Name = getRegName(MI->getOperand(2).getReg());
228     // FALL THROUGH.
229   case X86::PUNPCKHBWrm:
230   case X86::VPUNPCKHBWrm:
231     Src1Name = getRegName(MI->getOperand(1).getReg());
232     DestName = getRegName(MI->getOperand(0).getReg());
233     DecodeUNPCKHMask(MVT::v16i8, ShuffleMask);
234     break;
235   case X86::VPUNPCKHBWYrr:
236     Src2Name = getRegName(MI->getOperand(2).getReg());
237     // FALL THROUGH.
238   case X86::VPUNPCKHBWYrm:
239     Src1Name = getRegName(MI->getOperand(1).getReg());
240     DestName = getRegName(MI->getOperand(0).getReg());
241     DecodeUNPCKHMask(MVT::v32i8, ShuffleMask);
242     break;
243   case X86::PUNPCKHWDrr:
244   case X86::VPUNPCKHWDrr:
245     Src2Name = getRegName(MI->getOperand(2).getReg());
246     // FALL THROUGH.
247   case X86::PUNPCKHWDrm:
248   case X86::VPUNPCKHWDrm:
249     Src1Name = getRegName(MI->getOperand(1).getReg());
250     DestName = getRegName(MI->getOperand(0).getReg());
251     DecodeUNPCKHMask(MVT::v8i16, ShuffleMask);
252     break;
253   case X86::VPUNPCKHWDYrr:
254     Src2Name = getRegName(MI->getOperand(2).getReg());
255     // FALL THROUGH.
256   case X86::VPUNPCKHWDYrm:
257     Src1Name = getRegName(MI->getOperand(1).getReg());
258     DestName = getRegName(MI->getOperand(0).getReg());
259     DecodeUNPCKHMask(MVT::v16i16, ShuffleMask);
260     break;
261   case X86::PUNPCKHDQrr:
262   case X86::VPUNPCKHDQrr:
263     Src2Name = getRegName(MI->getOperand(2).getReg());
264     // FALL THROUGH.
265   case X86::PUNPCKHDQrm:
266   case X86::VPUNPCKHDQrm:
267     Src1Name = getRegName(MI->getOperand(1).getReg());
268     DestName = getRegName(MI->getOperand(0).getReg());
269     DecodeUNPCKHMask(MVT::v4i32, ShuffleMask);
270     break;
271   case X86::VPUNPCKHDQYrr:
272     Src2Name = getRegName(MI->getOperand(2).getReg());
273     // FALL THROUGH.
274   case X86::VPUNPCKHDQYrm:
275     Src1Name = getRegName(MI->getOperand(1).getReg());
276     DestName = getRegName(MI->getOperand(0).getReg());
277     DecodeUNPCKHMask(MVT::v8i32, ShuffleMask);
278     break;
279   case X86::PUNPCKHQDQrr:
280   case X86::VPUNPCKHQDQrr:
281     Src2Name = getRegName(MI->getOperand(2).getReg());
282     // FALL THROUGH.
283   case X86::PUNPCKHQDQrm:
284   case X86::VPUNPCKHQDQrm:
285     Src1Name = getRegName(MI->getOperand(1).getReg());
286     DestName = getRegName(MI->getOperand(0).getReg());
287     DecodeUNPCKHMask(MVT::v2i64, ShuffleMask);
288     break;
289   case X86::VPUNPCKHQDQYrr:
290     Src2Name = getRegName(MI->getOperand(2).getReg());
291     // FALL THROUGH.
292   case X86::VPUNPCKHQDQYrm:
293     Src1Name = getRegName(MI->getOperand(1).getReg());
294     DestName = getRegName(MI->getOperand(0).getReg());
295     DecodeUNPCKHMask(MVT::v4i64, ShuffleMask);
296     break;
297
298   case X86::PUNPCKLBWrr:
299   case X86::VPUNPCKLBWrr:
300     Src2Name = getRegName(MI->getOperand(2).getReg());
301     // FALL THROUGH.
302   case X86::PUNPCKLBWrm:
303   case X86::VPUNPCKLBWrm:
304     Src1Name = getRegName(MI->getOperand(1).getReg());
305     DestName = getRegName(MI->getOperand(0).getReg());
306     DecodeUNPCKLMask(MVT::v16i8, ShuffleMask);
307     break;
308   case X86::VPUNPCKLBWYrr:
309     Src2Name = getRegName(MI->getOperand(2).getReg());
310     // FALL THROUGH.
311   case X86::VPUNPCKLBWYrm:
312     Src1Name = getRegName(MI->getOperand(1).getReg());
313     DestName = getRegName(MI->getOperand(0).getReg());
314     DecodeUNPCKLMask(MVT::v32i8, ShuffleMask);
315     break;
316   case X86::PUNPCKLWDrr:
317   case X86::VPUNPCKLWDrr:
318     Src2Name = getRegName(MI->getOperand(2).getReg());
319     // FALL THROUGH.
320   case X86::PUNPCKLWDrm:
321   case X86::VPUNPCKLWDrm:
322     Src1Name = getRegName(MI->getOperand(1).getReg());
323     DestName = getRegName(MI->getOperand(0).getReg());
324     DecodeUNPCKLMask(MVT::v8i16, ShuffleMask);
325     break;
326   case X86::VPUNPCKLWDYrr:
327     Src2Name = getRegName(MI->getOperand(2).getReg());
328     // FALL THROUGH.
329   case X86::VPUNPCKLWDYrm:
330     Src1Name = getRegName(MI->getOperand(1).getReg());
331     DestName = getRegName(MI->getOperand(0).getReg());
332     DecodeUNPCKLMask(MVT::v16i16, ShuffleMask);
333     break;
334   case X86::PUNPCKLDQrr:
335   case X86::VPUNPCKLDQrr:
336     Src2Name = getRegName(MI->getOperand(2).getReg());
337     // FALL THROUGH.
338   case X86::PUNPCKLDQrm:
339   case X86::VPUNPCKLDQrm:
340     Src1Name = getRegName(MI->getOperand(1).getReg());
341     DestName = getRegName(MI->getOperand(0).getReg());
342     DecodeUNPCKLMask(MVT::v4i32, ShuffleMask);
343     break;
344   case X86::VPUNPCKLDQYrr:
345     Src2Name = getRegName(MI->getOperand(2).getReg());
346     // FALL THROUGH.
347   case X86::VPUNPCKLDQYrm:
348     Src1Name = getRegName(MI->getOperand(1).getReg());
349     DestName = getRegName(MI->getOperand(0).getReg());
350     DecodeUNPCKLMask(MVT::v8i32, ShuffleMask);
351     break;
352   case X86::PUNPCKLQDQrr:
353   case X86::VPUNPCKLQDQrr:
354     Src2Name = getRegName(MI->getOperand(2).getReg());
355     // FALL THROUGH.
356   case X86::PUNPCKLQDQrm:
357   case X86::VPUNPCKLQDQrm:
358     Src1Name = getRegName(MI->getOperand(1).getReg());
359     DestName = getRegName(MI->getOperand(0).getReg());
360     DecodeUNPCKLMask(MVT::v2i64, ShuffleMask);
361     break;
362   case X86::VPUNPCKLQDQYrr:
363     Src2Name = getRegName(MI->getOperand(2).getReg());
364     // FALL THROUGH.
365   case X86::VPUNPCKLQDQYrm:
366     Src1Name = getRegName(MI->getOperand(1).getReg());
367     DestName = getRegName(MI->getOperand(0).getReg());
368     DecodeUNPCKLMask(MVT::v4i64, ShuffleMask);
369     break;
370
371   case X86::SHUFPDrri:
372   case X86::VSHUFPDrri:
373     Src2Name = getRegName(MI->getOperand(2).getReg());
374     // FALL THROUGH.
375   case X86::SHUFPDrmi:
376   case X86::VSHUFPDrmi:
377     if(MI->getOperand(MI->getNumOperands()-1).isImm())
378       DecodeSHUFPMask(MVT::v2f64,
379                       MI->getOperand(MI->getNumOperands()-1).getImm(),
380                       ShuffleMask);
381     Src1Name = getRegName(MI->getOperand(1).getReg());
382     DestName = getRegName(MI->getOperand(0).getReg());
383     break;
384   case X86::VSHUFPDYrri:
385     Src2Name = getRegName(MI->getOperand(2).getReg());
386     // FALL THROUGH.
387   case X86::VSHUFPDYrmi:
388     if(MI->getOperand(MI->getNumOperands()-1).isImm())
389       DecodeSHUFPMask(MVT::v4f64,
390                       MI->getOperand(MI->getNumOperands()-1).getImm(),
391                       ShuffleMask);
392     Src1Name = getRegName(MI->getOperand(1).getReg());
393     DestName = getRegName(MI->getOperand(0).getReg());
394     break;
395
396   case X86::SHUFPSrri:
397   case X86::VSHUFPSrri:
398     Src2Name = getRegName(MI->getOperand(2).getReg());
399     // FALL THROUGH.
400   case X86::SHUFPSrmi:
401   case X86::VSHUFPSrmi:
402     if(MI->getOperand(MI->getNumOperands()-1).isImm())
403       DecodeSHUFPMask(MVT::v4f32,
404                       MI->getOperand(MI->getNumOperands()-1).getImm(),
405                       ShuffleMask);
406     Src1Name = getRegName(MI->getOperand(1).getReg());
407     DestName = getRegName(MI->getOperand(0).getReg());
408     break;
409   case X86::VSHUFPSYrri:
410     Src2Name = getRegName(MI->getOperand(2).getReg());
411     // FALL THROUGH.
412   case X86::VSHUFPSYrmi:
413     if(MI->getOperand(MI->getNumOperands()-1).isImm())
414       DecodeSHUFPMask(MVT::v8f32,
415                       MI->getOperand(MI->getNumOperands()-1).getImm(),
416                       ShuffleMask);
417     Src1Name = getRegName(MI->getOperand(1).getReg());
418     DestName = getRegName(MI->getOperand(0).getReg());
419     break;
420
421   case X86::UNPCKLPDrr:
422   case X86::VUNPCKLPDrr:
423     Src2Name = getRegName(MI->getOperand(2).getReg());
424     // FALL THROUGH.
425   case X86::UNPCKLPDrm:
426   case X86::VUNPCKLPDrm:
427     DecodeUNPCKLMask(MVT::v2f64, ShuffleMask);
428     Src1Name = getRegName(MI->getOperand(1).getReg());
429     DestName = getRegName(MI->getOperand(0).getReg());
430     break;
431   case X86::VUNPCKLPDYrr:
432     Src2Name = getRegName(MI->getOperand(2).getReg());
433     // FALL THROUGH.
434   case X86::VUNPCKLPDYrm:
435     DecodeUNPCKLMask(MVT::v4f64, ShuffleMask);
436     Src1Name = getRegName(MI->getOperand(1).getReg());
437     DestName = getRegName(MI->getOperand(0).getReg());
438     break;
439   case X86::UNPCKLPSrr:
440   case X86::VUNPCKLPSrr:
441     Src2Name = getRegName(MI->getOperand(2).getReg());
442     // FALL THROUGH.
443   case X86::UNPCKLPSrm:
444   case X86::VUNPCKLPSrm:
445     DecodeUNPCKLMask(MVT::v4f32, ShuffleMask);
446     Src1Name = getRegName(MI->getOperand(1).getReg());
447     DestName = getRegName(MI->getOperand(0).getReg());
448     break;
449   case X86::VUNPCKLPSYrr:
450     Src2Name = getRegName(MI->getOperand(2).getReg());
451     // FALL THROUGH.
452   case X86::VUNPCKLPSYrm:
453     DecodeUNPCKLMask(MVT::v8f32, ShuffleMask);
454     Src1Name = getRegName(MI->getOperand(1).getReg());
455     DestName = getRegName(MI->getOperand(0).getReg());
456     break;
457   case X86::UNPCKHPDrr:
458   case X86::VUNPCKHPDrr:
459     Src2Name = getRegName(MI->getOperand(2).getReg());
460     // FALL THROUGH.
461   case X86::UNPCKHPDrm:
462   case X86::VUNPCKHPDrm:
463     DecodeUNPCKHMask(MVT::v2f64, ShuffleMask);
464     Src1Name = getRegName(MI->getOperand(1).getReg());
465     DestName = getRegName(MI->getOperand(0).getReg());
466     break;
467   case X86::VUNPCKHPDYrr:
468     Src2Name = getRegName(MI->getOperand(2).getReg());
469     // FALL THROUGH.
470   case X86::VUNPCKHPDYrm:
471     DecodeUNPCKHMask(MVT::v4f64, ShuffleMask);
472     Src1Name = getRegName(MI->getOperand(1).getReg());
473     DestName = getRegName(MI->getOperand(0).getReg());
474     break;
475   case X86::UNPCKHPSrr:
476   case X86::VUNPCKHPSrr:
477     Src2Name = getRegName(MI->getOperand(2).getReg());
478     // FALL THROUGH.
479   case X86::UNPCKHPSrm:
480   case X86::VUNPCKHPSrm:
481     DecodeUNPCKHMask(MVT::v4f32, ShuffleMask);
482     Src1Name = getRegName(MI->getOperand(1).getReg());
483     DestName = getRegName(MI->getOperand(0).getReg());
484     break;
485   case X86::VUNPCKHPSYrr:
486     Src2Name = getRegName(MI->getOperand(2).getReg());
487     // FALL THROUGH.
488   case X86::VUNPCKHPSYrm:
489     DecodeUNPCKHMask(MVT::v8f32, ShuffleMask);
490     Src1Name = getRegName(MI->getOperand(1).getReg());
491     DestName = getRegName(MI->getOperand(0).getReg());
492     break;
493   case X86::VPERMILPSri:
494     Src1Name = getRegName(MI->getOperand(1).getReg());
495     // FALL THROUGH.
496   case X86::VPERMILPSmi:
497     if(MI->getOperand(MI->getNumOperands()-1).isImm())
498       DecodePSHUFMask(MVT::v4f32,
499                       MI->getOperand(MI->getNumOperands()-1).getImm(),
500                       ShuffleMask);
501     DestName = getRegName(MI->getOperand(0).getReg());
502     break;
503   case X86::VPERMILPSYri:
504     Src1Name = getRegName(MI->getOperand(1).getReg());
505     // FALL THROUGH.
506   case X86::VPERMILPSYmi:
507     if(MI->getOperand(MI->getNumOperands()-1).isImm())
508       DecodePSHUFMask(MVT::v8f32,
509                       MI->getOperand(MI->getNumOperands()-1).getImm(),
510                       ShuffleMask);
511     DestName = getRegName(MI->getOperand(0).getReg());
512     break;
513   case X86::VPERMILPDri:
514     Src1Name = getRegName(MI->getOperand(1).getReg());
515     // FALL THROUGH.
516   case X86::VPERMILPDmi:
517     if(MI->getOperand(MI->getNumOperands()-1).isImm())
518       DecodePSHUFMask(MVT::v2f64,
519                       MI->getOperand(MI->getNumOperands()-1).getImm(),
520                       ShuffleMask);
521     DestName = getRegName(MI->getOperand(0).getReg());
522     break;
523   case X86::VPERMILPDYri:
524     Src1Name = getRegName(MI->getOperand(1).getReg());
525     // FALL THROUGH.
526   case X86::VPERMILPDYmi:
527     if(MI->getOperand(MI->getNumOperands()-1).isImm())
528       DecodePSHUFMask(MVT::v4f64,
529                       MI->getOperand(MI->getNumOperands()-1).getImm(),
530                       ShuffleMask);
531     DestName = getRegName(MI->getOperand(0).getReg());
532     break;
533   case X86::VPERM2F128rr:
534   case X86::VPERM2I128rr:
535     Src2Name = getRegName(MI->getOperand(2).getReg());
536     // FALL THROUGH.
537   case X86::VPERM2F128rm:
538   case X86::VPERM2I128rm:
539     // For instruction comments purpose, assume the 256-bit vector is v4i64.
540     if(MI->getOperand(MI->getNumOperands()-1).isImm())
541       DecodeVPERM2X128Mask(MVT::v4i64,
542                            MI->getOperand(MI->getNumOperands()-1).getImm(),
543                            ShuffleMask);
544     Src1Name = getRegName(MI->getOperand(1).getReg());
545     DestName = getRegName(MI->getOperand(0).getReg());
546     break;
547   case X86::VPERMQYri:
548   case X86::VPERMPDYri:
549     Src1Name = getRegName(MI->getOperand(1).getReg());
550     // FALL THROUGH.
551   case X86::VPERMQYmi:
552   case X86::VPERMPDYmi:
553     if(MI->getOperand(MI->getNumOperands()-1).isImm())
554       DecodeVPERMMask(MI->getOperand(MI->getNumOperands()-1).getImm(),
555                       ShuffleMask);
556     DestName = getRegName(MI->getOperand(0).getReg());
557     break;
558   }
559
560   // The only comments we decode are shuffles, so give up if we were unable to
561   // decode a shuffle mask.
562   if (ShuffleMask.empty())
563     return false;
564
565   if (!DestName) DestName = Src1Name;
566   OS << (DestName ? DestName : "mem") << " = ";
567
568   // If the two sources are the same, canonicalize the input elements to be
569   // from the first src so that we get larger element spans.
570   if (Src1Name == Src2Name) {
571     for (unsigned i = 0, e = ShuffleMask.size(); i != e; ++i) {
572       if ((int)ShuffleMask[i] >= 0 && // Not sentinel.
573           ShuffleMask[i] >= (int)e)        // From second mask.
574         ShuffleMask[i] -= e;
575     }
576   }
577
578   // The shuffle mask specifies which elements of the src1/src2 fill in the
579   // destination, with a few sentinel values.  Loop through and print them
580   // out.
581   for (unsigned i = 0, e = ShuffleMask.size(); i != e; ++i) {
582     if (i != 0)
583       OS << ',';
584     if (ShuffleMask[i] == SM_SentinelZero) {
585       OS << "zero";
586       continue;
587     }
588
589     // Otherwise, it must come from src1 or src2.  Print the span of elements
590     // that comes from this src.
591     bool isSrc1 = ShuffleMask[i] < (int)ShuffleMask.size();
592     const char *SrcName = isSrc1 ? Src1Name : Src2Name;
593     OS << (SrcName ? SrcName : "mem") << '[';
594     bool IsFirst = true;
595     while (i != e &&
596            (int)ShuffleMask[i] >= 0 &&
597            (ShuffleMask[i] < (int)ShuffleMask.size()) == isSrc1) {
598       if (!IsFirst)
599         OS << ',';
600       else
601         IsFirst = false;
602       OS << ShuffleMask[i] % ShuffleMask.size();
603       ++i;
604     }
605     OS << ']';
606     --i;  // For loop increments element #.
607   }
608   //MI->print(OS, 0);
609   OS << "\n";
610
611   // We successfully added a comment to this instruction.
612   return true;
613 }