Prune CRLFs.
[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 /// \brief Extracts the src/dst types for a given zero extension instruction.
25 /// \note While the number of elements in DstVT type correct, the
26 /// number in the SrcVT type is expanded to fill the src xmm register and the
27 /// upper elements may not be included in the dst xmm/ymm register.
28 static void getZeroExtensionTypes(const MCInst *MI, MVT &SrcVT, MVT &DstVT) {
29   switch (MI->getOpcode()) {
30   default:
31     llvm_unreachable("Unknown zero extension instruction");
32   // i8 zero extension
33   case X86::PMOVZXBWrm:
34   case X86::PMOVZXBWrr:
35   case X86::VPMOVZXBWrm:
36   case X86::VPMOVZXBWrr:
37     SrcVT = MVT::v16i8;
38     DstVT = MVT::v8i16;
39     break;
40   case X86::VPMOVZXBWYrm:
41   case X86::VPMOVZXBWYrr:
42     SrcVT = MVT::v16i8;
43     DstVT = MVT::v16i16;
44     break;
45   case X86::PMOVZXBDrm:
46   case X86::PMOVZXBDrr:
47   case X86::VPMOVZXBDrm:
48   case X86::VPMOVZXBDrr:
49     SrcVT = MVT::v16i8;
50     DstVT = MVT::v4i32;
51     break;
52   case X86::VPMOVZXBDYrm:
53   case X86::VPMOVZXBDYrr:
54     SrcVT = MVT::v16i8;
55     DstVT = MVT::v8i32;
56     break;
57   case X86::PMOVZXBQrm:
58   case X86::PMOVZXBQrr:
59   case X86::VPMOVZXBQrm:
60   case X86::VPMOVZXBQrr:
61     SrcVT = MVT::v16i8;
62     DstVT = MVT::v2i64;
63     break;
64   case X86::VPMOVZXBQYrm:
65   case X86::VPMOVZXBQYrr:
66     SrcVT = MVT::v16i8;
67     DstVT = MVT::v4i64;
68     break;
69   // i16 zero extension
70   case X86::PMOVZXWDrm:
71   case X86::PMOVZXWDrr:
72   case X86::VPMOVZXWDrm:
73   case X86::VPMOVZXWDrr:
74     SrcVT = MVT::v8i16;
75     DstVT = MVT::v4i32;
76     break;
77   case X86::VPMOVZXWDYrm:
78   case X86::VPMOVZXWDYrr:
79     SrcVT = MVT::v8i16;
80     DstVT = MVT::v8i32;
81     break;
82   case X86::PMOVZXWQrm:
83   case X86::PMOVZXWQrr:
84   case X86::VPMOVZXWQrm:
85   case X86::VPMOVZXWQrr:
86     SrcVT = MVT::v8i16;
87     DstVT = MVT::v2i64;
88     break;
89   case X86::VPMOVZXWQYrm:
90   case X86::VPMOVZXWQYrr:
91     SrcVT = MVT::v8i16;
92     DstVT = MVT::v4i64;
93     break;
94   // i32 zero extension
95   case X86::PMOVZXDQrm:
96   case X86::PMOVZXDQrr:
97   case X86::VPMOVZXDQrm:
98   case X86::VPMOVZXDQrr:
99     SrcVT = MVT::v4i32;
100     DstVT = MVT::v2i64;
101     break;
102   case X86::VPMOVZXDQYrm:
103   case X86::VPMOVZXDQYrr:
104     SrcVT = MVT::v4i32;
105     DstVT = MVT::v4i64;
106     break;
107   }
108 }
109
110 //===----------------------------------------------------------------------===//
111 // Top Level Entrypoint
112 //===----------------------------------------------------------------------===//
113
114 /// EmitAnyX86InstComments - This function decodes x86 instructions and prints
115 /// newline terminated strings to the specified string if desired.  This
116 /// information is shown in disassembly dumps when verbose assembly is enabled.
117 bool llvm::EmitAnyX86InstComments(const MCInst *MI, raw_ostream &OS,
118                                   const char *(*getRegName)(unsigned)) {
119   // If this is a shuffle operation, the switch should fill in this state.
120   SmallVector<int, 8> ShuffleMask;
121   const char *DestName = nullptr, *Src1Name = nullptr, *Src2Name = nullptr;
122
123   switch (MI->getOpcode()) {
124   default:
125     // Not an instruction for which we can decode comments.
126     return false;
127
128   case X86::BLENDPDrri:
129   case X86::VBLENDPDrri:
130     Src2Name = getRegName(MI->getOperand(2).getReg());
131     // FALL THROUGH.
132   case X86::BLENDPDrmi:
133   case X86::VBLENDPDrmi:
134     if(MI->getOperand(MI->getNumOperands()-1).isImm())
135       DecodeBLENDMask(MVT::v2f64,
136                       MI->getOperand(MI->getNumOperands()-1).getImm(),
137                       ShuffleMask);
138     Src1Name = getRegName(MI->getOperand(1).getReg());
139     DestName = getRegName(MI->getOperand(0).getReg());
140     break;
141   case X86::VBLENDPDYrri:
142     Src2Name = getRegName(MI->getOperand(2).getReg());
143     // FALL THROUGH.
144   case X86::VBLENDPDYrmi:
145     if(MI->getOperand(MI->getNumOperands()-1).isImm())
146       DecodeBLENDMask(MVT::v4f64,
147                       MI->getOperand(MI->getNumOperands()-1).getImm(),
148                       ShuffleMask);
149     Src1Name = getRegName(MI->getOperand(1).getReg());
150     DestName = getRegName(MI->getOperand(0).getReg());
151     break;
152
153   case X86::BLENDPSrri:
154   case X86::VBLENDPSrri:
155     Src2Name = getRegName(MI->getOperand(2).getReg());
156     // FALL THROUGH.
157   case X86::BLENDPSrmi:
158   case X86::VBLENDPSrmi:
159     if(MI->getOperand(MI->getNumOperands()-1).isImm())
160       DecodeBLENDMask(MVT::v4f32,
161                       MI->getOperand(MI->getNumOperands()-1).getImm(),
162                       ShuffleMask);
163     Src1Name = getRegName(MI->getOperand(1).getReg());
164     DestName = getRegName(MI->getOperand(0).getReg());
165     break;
166   case X86::VBLENDPSYrri:
167     Src2Name = getRegName(MI->getOperand(2).getReg());
168     // FALL THROUGH.
169   case X86::VBLENDPSYrmi:
170     if(MI->getOperand(MI->getNumOperands()-1).isImm())
171       DecodeBLENDMask(MVT::v8f32,
172                       MI->getOperand(MI->getNumOperands()-1).getImm(),
173                       ShuffleMask);
174     Src1Name = getRegName(MI->getOperand(1).getReg());
175     DestName = getRegName(MI->getOperand(0).getReg());
176     break;
177
178   case X86::PBLENDWrri:
179   case X86::VPBLENDWrri:
180     Src2Name = getRegName(MI->getOperand(2).getReg());
181     // FALL THROUGH.
182   case X86::PBLENDWrmi:
183   case X86::VPBLENDWrmi:
184     if(MI->getOperand(MI->getNumOperands()-1).isImm())
185       DecodeBLENDMask(MVT::v8i16,
186                       MI->getOperand(MI->getNumOperands()-1).getImm(),
187                       ShuffleMask);
188     Src1Name = getRegName(MI->getOperand(1).getReg());
189     DestName = getRegName(MI->getOperand(0).getReg());
190     break;
191   case X86::VPBLENDWYrri:
192     Src2Name = getRegName(MI->getOperand(2).getReg());
193     // FALL THROUGH.
194   case X86::VPBLENDWYrmi:
195     if(MI->getOperand(MI->getNumOperands()-1).isImm())
196       DecodeBLENDMask(MVT::v16i16,
197                       MI->getOperand(MI->getNumOperands()-1).getImm(),
198                       ShuffleMask);
199     Src1Name = getRegName(MI->getOperand(1).getReg());
200     DestName = getRegName(MI->getOperand(0).getReg());
201     break;
202
203   case X86::VPBLENDDrri:
204     Src2Name = getRegName(MI->getOperand(2).getReg());
205     // FALL THROUGH.
206   case X86::VPBLENDDrmi:
207     if(MI->getOperand(MI->getNumOperands()-1).isImm())
208       DecodeBLENDMask(MVT::v4i32,
209                       MI->getOperand(MI->getNumOperands()-1).getImm(),
210                       ShuffleMask);
211     Src1Name = getRegName(MI->getOperand(1).getReg());
212     DestName = getRegName(MI->getOperand(0).getReg());
213     break;
214
215   case X86::VPBLENDDYrri:
216     Src2Name = getRegName(MI->getOperand(2).getReg());
217     // FALL THROUGH.
218   case X86::VPBLENDDYrmi:
219     if(MI->getOperand(MI->getNumOperands()-1).isImm())
220       DecodeBLENDMask(MVT::v8i32,
221                       MI->getOperand(MI->getNumOperands()-1).getImm(),
222                       ShuffleMask);
223     Src1Name = getRegName(MI->getOperand(1).getReg());
224     DestName = getRegName(MI->getOperand(0).getReg());
225     break;
226
227   case X86::INSERTPSrr:
228   case X86::VINSERTPSrr:
229     Src2Name = getRegName(MI->getOperand(2).getReg());
230     // FALL THROUGH.
231   case X86::INSERTPSrm:
232   case X86::VINSERTPSrm:
233     DestName = getRegName(MI->getOperand(0).getReg());
234     Src1Name = getRegName(MI->getOperand(1).getReg());
235     if(MI->getOperand(MI->getNumOperands()-1).isImm())
236       DecodeINSERTPSMask(MI->getOperand(MI->getNumOperands()-1).getImm(),
237                          ShuffleMask);
238     break;
239
240   case X86::MOVLHPSrr:
241   case X86::VMOVLHPSrr:
242     Src2Name = getRegName(MI->getOperand(2).getReg());
243     Src1Name = getRegName(MI->getOperand(1).getReg());
244     DestName = getRegName(MI->getOperand(0).getReg());
245     DecodeMOVLHPSMask(2, ShuffleMask);
246     break;
247
248   case X86::MOVHLPSrr:
249   case X86::VMOVHLPSrr:
250     Src2Name = getRegName(MI->getOperand(2).getReg());
251     Src1Name = getRegName(MI->getOperand(1).getReg());
252     DestName = getRegName(MI->getOperand(0).getReg());
253     DecodeMOVHLPSMask(2, ShuffleMask);
254     break;
255
256   case X86::MOVSLDUPrr:
257   case X86::VMOVSLDUPrr:
258     Src1Name = getRegName(MI->getOperand(1).getReg());
259     // FALL THROUGH.
260   case X86::MOVSLDUPrm:
261   case X86::VMOVSLDUPrm:
262     DestName = getRegName(MI->getOperand(0).getReg());
263     DecodeMOVSLDUPMask(MVT::v4f32, ShuffleMask);
264     break;
265
266   case X86::VMOVSHDUPYrr:
267     Src1Name = getRegName(MI->getOperand(1).getReg());
268     // FALL THROUGH.
269   case X86::VMOVSHDUPYrm:
270     DestName = getRegName(MI->getOperand(0).getReg());
271     DecodeMOVSHDUPMask(MVT::v8f32, ShuffleMask);
272     break;
273
274   case X86::VMOVSLDUPYrr:
275     Src1Name = getRegName(MI->getOperand(1).getReg());
276     // FALL THROUGH.
277   case X86::VMOVSLDUPYrm:
278     DestName = getRegName(MI->getOperand(0).getReg());
279     DecodeMOVSLDUPMask(MVT::v8f32, ShuffleMask);
280     break;
281
282   case X86::MOVSHDUPrr:
283   case X86::VMOVSHDUPrr:
284     Src1Name = getRegName(MI->getOperand(1).getReg());
285     // FALL THROUGH.
286   case X86::MOVSHDUPrm:
287   case X86::VMOVSHDUPrm:
288     DestName = getRegName(MI->getOperand(0).getReg());
289     DecodeMOVSHDUPMask(MVT::v4f32, ShuffleMask);
290     break;
291
292   case X86::VMOVDDUPYrr:
293     Src1Name = getRegName(MI->getOperand(1).getReg());
294     // FALL THROUGH.
295   case X86::VMOVDDUPYrm:
296     DestName = getRegName(MI->getOperand(0).getReg());
297     DecodeMOVDDUPMask(MVT::v4f64, ShuffleMask);
298     break;
299
300   case X86::MOVDDUPrr:
301   case X86::VMOVDDUPrr:
302     Src1Name = getRegName(MI->getOperand(1).getReg());
303     // FALL THROUGH.
304   case X86::MOVDDUPrm:
305   case X86::VMOVDDUPrm:
306     DestName = getRegName(MI->getOperand(0).getReg());
307     DecodeMOVDDUPMask(MVT::v2f64, ShuffleMask);
308     break;
309
310   case X86::PSLLDQri:
311   case X86::VPSLLDQri:
312     Src1Name = getRegName(MI->getOperand(1).getReg());
313     DestName = getRegName(MI->getOperand(0).getReg());
314     if(MI->getOperand(MI->getNumOperands()-1).isImm())
315       DecodePSLLDQMask(MVT::v16i8,
316                        MI->getOperand(MI->getNumOperands()-1).getImm(),
317                        ShuffleMask);
318     break;
319
320   case X86::VPSLLDQYri:
321     Src1Name = getRegName(MI->getOperand(1).getReg());
322     DestName = getRegName(MI->getOperand(0).getReg());
323     if(MI->getOperand(MI->getNumOperands()-1).isImm())
324       DecodePSLLDQMask(MVT::v32i8,
325                        MI->getOperand(MI->getNumOperands()-1).getImm(),
326                        ShuffleMask);
327     break;
328
329   case X86::PSRLDQri:
330   case X86::VPSRLDQri:
331     Src1Name = getRegName(MI->getOperand(1).getReg());
332     DestName = getRegName(MI->getOperand(0).getReg());
333     if(MI->getOperand(MI->getNumOperands()-1).isImm())
334       DecodePSRLDQMask(MVT::v16i8,
335                        MI->getOperand(MI->getNumOperands()-1).getImm(),
336                        ShuffleMask);
337     break;
338
339   case X86::VPSRLDQYri:
340     Src1Name = getRegName(MI->getOperand(1).getReg());
341     DestName = getRegName(MI->getOperand(0).getReg());
342     if(MI->getOperand(MI->getNumOperands()-1).isImm())
343       DecodePSRLDQMask(MVT::v32i8,
344                        MI->getOperand(MI->getNumOperands()-1).getImm(),
345                        ShuffleMask);
346     break;
347
348   case X86::PALIGNR128rr:
349   case X86::VPALIGNR128rr:
350     Src1Name = getRegName(MI->getOperand(2).getReg());
351     // FALL THROUGH.
352   case X86::PALIGNR128rm:
353   case X86::VPALIGNR128rm:
354     Src2Name = getRegName(MI->getOperand(1).getReg());
355     DestName = getRegName(MI->getOperand(0).getReg());
356     if(MI->getOperand(MI->getNumOperands()-1).isImm())
357       DecodePALIGNRMask(MVT::v16i8,
358                         MI->getOperand(MI->getNumOperands()-1).getImm(),
359                         ShuffleMask);
360     break;
361   case X86::VPALIGNR256rr:
362     Src1Name = getRegName(MI->getOperand(2).getReg());
363     // FALL THROUGH.
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(MVT::v32i8,
369                         MI->getOperand(MI->getNumOperands()-1).getImm(),
370                         ShuffleMask);
371     break;
372
373   case X86::PSHUFDri:
374   case X86::VPSHUFDri:
375     Src1Name = getRegName(MI->getOperand(1).getReg());
376     // FALL THROUGH.
377   case X86::PSHUFDmi:
378   case X86::VPSHUFDmi:
379     DestName = getRegName(MI->getOperand(0).getReg());
380     if(MI->getOperand(MI->getNumOperands()-1).isImm())
381       DecodePSHUFMask(MVT::v4i32,
382                       MI->getOperand(MI->getNumOperands()-1).getImm(),
383                       ShuffleMask);
384     break;
385   case X86::VPSHUFDYri:
386     Src1Name = getRegName(MI->getOperand(1).getReg());
387     // FALL THROUGH.
388   case X86::VPSHUFDYmi:
389     DestName = getRegName(MI->getOperand(0).getReg());
390     if(MI->getOperand(MI->getNumOperands()-1).isImm())
391       DecodePSHUFMask(MVT::v8i32,
392                       MI->getOperand(MI->getNumOperands()-1).getImm(),
393                       ShuffleMask);
394     break;
395
396
397   case X86::PSHUFHWri:
398   case X86::VPSHUFHWri:
399     Src1Name = getRegName(MI->getOperand(1).getReg());
400     // FALL THROUGH.
401   case X86::PSHUFHWmi:
402   case X86::VPSHUFHWmi:
403     DestName = getRegName(MI->getOperand(0).getReg());
404     if(MI->getOperand(MI->getNumOperands()-1).isImm())
405       DecodePSHUFHWMask(MVT::v8i16,
406                         MI->getOperand(MI->getNumOperands()-1).getImm(),
407                         ShuffleMask);
408     break;
409   case X86::VPSHUFHWYri:
410     Src1Name = getRegName(MI->getOperand(1).getReg());
411     // FALL THROUGH.
412   case X86::VPSHUFHWYmi:
413     DestName = getRegName(MI->getOperand(0).getReg());
414     if(MI->getOperand(MI->getNumOperands()-1).isImm())
415       DecodePSHUFHWMask(MVT::v16i16,
416                         MI->getOperand(MI->getNumOperands()-1).getImm(),
417                         ShuffleMask);
418     break;
419   case X86::PSHUFLWri:
420   case X86::VPSHUFLWri:
421     Src1Name = getRegName(MI->getOperand(1).getReg());
422     // FALL THROUGH.
423   case X86::PSHUFLWmi:
424   case X86::VPSHUFLWmi:
425     DestName = getRegName(MI->getOperand(0).getReg());
426     if(MI->getOperand(MI->getNumOperands()-1).isImm())
427       DecodePSHUFLWMask(MVT::v8i16,
428                         MI->getOperand(MI->getNumOperands()-1).getImm(),
429                         ShuffleMask);
430     break;
431   case X86::VPSHUFLWYri:
432     Src1Name = getRegName(MI->getOperand(1).getReg());
433     // FALL THROUGH.
434   case X86::VPSHUFLWYmi:
435     DestName = getRegName(MI->getOperand(0).getReg());
436     if(MI->getOperand(MI->getNumOperands()-1).isImm())
437       DecodePSHUFLWMask(MVT::v16i16,
438                         MI->getOperand(MI->getNumOperands()-1).getImm(),
439                         ShuffleMask);
440     break;
441
442   case X86::PUNPCKHBWrr:
443   case X86::VPUNPCKHBWrr:
444     Src2Name = getRegName(MI->getOperand(2).getReg());
445     // FALL THROUGH.
446   case X86::PUNPCKHBWrm:
447   case X86::VPUNPCKHBWrm:
448     Src1Name = getRegName(MI->getOperand(1).getReg());
449     DestName = getRegName(MI->getOperand(0).getReg());
450     DecodeUNPCKHMask(MVT::v16i8, ShuffleMask);
451     break;
452   case X86::VPUNPCKHBWYrr:
453     Src2Name = getRegName(MI->getOperand(2).getReg());
454     // FALL THROUGH.
455   case X86::VPUNPCKHBWYrm:
456     Src1Name = getRegName(MI->getOperand(1).getReg());
457     DestName = getRegName(MI->getOperand(0).getReg());
458     DecodeUNPCKHMask(MVT::v32i8, ShuffleMask);
459     break;
460   case X86::PUNPCKHWDrr:
461   case X86::VPUNPCKHWDrr:
462     Src2Name = getRegName(MI->getOperand(2).getReg());
463     // FALL THROUGH.
464   case X86::PUNPCKHWDrm:
465   case X86::VPUNPCKHWDrm:
466     Src1Name = getRegName(MI->getOperand(1).getReg());
467     DestName = getRegName(MI->getOperand(0).getReg());
468     DecodeUNPCKHMask(MVT::v8i16, ShuffleMask);
469     break;
470   case X86::VPUNPCKHWDYrr:
471     Src2Name = getRegName(MI->getOperand(2).getReg());
472     // FALL THROUGH.
473   case X86::VPUNPCKHWDYrm:
474     Src1Name = getRegName(MI->getOperand(1).getReg());
475     DestName = getRegName(MI->getOperand(0).getReg());
476     DecodeUNPCKHMask(MVT::v16i16, ShuffleMask);
477     break;
478   case X86::PUNPCKHDQrr:
479   case X86::VPUNPCKHDQrr:
480     Src2Name = getRegName(MI->getOperand(2).getReg());
481     // FALL THROUGH.
482   case X86::PUNPCKHDQrm:
483   case X86::VPUNPCKHDQrm:
484     Src1Name = getRegName(MI->getOperand(1).getReg());
485     DestName = getRegName(MI->getOperand(0).getReg());
486     DecodeUNPCKHMask(MVT::v4i32, ShuffleMask);
487     break;
488   case X86::VPUNPCKHDQYrr:
489     Src2Name = getRegName(MI->getOperand(2).getReg());
490     // FALL THROUGH.
491   case X86::VPUNPCKHDQYrm:
492     Src1Name = getRegName(MI->getOperand(1).getReg());
493     DestName = getRegName(MI->getOperand(0).getReg());
494     DecodeUNPCKHMask(MVT::v8i32, ShuffleMask);
495     break;
496   case X86::VPUNPCKHDQZrr:
497     Src2Name = getRegName(MI->getOperand(2).getReg());
498     // FALL THROUGH.
499   case X86::VPUNPCKHDQZrm:
500     Src1Name = getRegName(MI->getOperand(1).getReg());
501     DestName = getRegName(MI->getOperand(0).getReg());
502     DecodeUNPCKHMask(MVT::v16i32, ShuffleMask);
503     break;
504   case X86::PUNPCKHQDQrr:
505   case X86::VPUNPCKHQDQrr:
506     Src2Name = getRegName(MI->getOperand(2).getReg());
507     // FALL THROUGH.
508   case X86::PUNPCKHQDQrm:
509   case X86::VPUNPCKHQDQrm:
510     Src1Name = getRegName(MI->getOperand(1).getReg());
511     DestName = getRegName(MI->getOperand(0).getReg());
512     DecodeUNPCKHMask(MVT::v2i64, ShuffleMask);
513     break;
514   case X86::VPUNPCKHQDQYrr:
515     Src2Name = getRegName(MI->getOperand(2).getReg());
516     // FALL THROUGH.
517   case X86::VPUNPCKHQDQYrm:
518     Src1Name = getRegName(MI->getOperand(1).getReg());
519     DestName = getRegName(MI->getOperand(0).getReg());
520     DecodeUNPCKHMask(MVT::v4i64, ShuffleMask);
521     break;
522   case X86::VPUNPCKHQDQZrr:
523     Src2Name = getRegName(MI->getOperand(2).getReg());
524     // FALL THROUGH.
525   case X86::VPUNPCKHQDQZrm:
526     Src1Name = getRegName(MI->getOperand(1).getReg());
527     DestName = getRegName(MI->getOperand(0).getReg());
528     DecodeUNPCKHMask(MVT::v8i64, ShuffleMask);
529     break;
530
531   case X86::PUNPCKLBWrr:
532   case X86::VPUNPCKLBWrr:
533     Src2Name = getRegName(MI->getOperand(2).getReg());
534     // FALL THROUGH.
535   case X86::PUNPCKLBWrm:
536   case X86::VPUNPCKLBWrm:
537     Src1Name = getRegName(MI->getOperand(1).getReg());
538     DestName = getRegName(MI->getOperand(0).getReg());
539     DecodeUNPCKLMask(MVT::v16i8, ShuffleMask);
540     break;
541   case X86::VPUNPCKLBWYrr:
542     Src2Name = getRegName(MI->getOperand(2).getReg());
543     // FALL THROUGH.
544   case X86::VPUNPCKLBWYrm:
545     Src1Name = getRegName(MI->getOperand(1).getReg());
546     DestName = getRegName(MI->getOperand(0).getReg());
547     DecodeUNPCKLMask(MVT::v32i8, ShuffleMask);
548     break;
549   case X86::PUNPCKLWDrr:
550   case X86::VPUNPCKLWDrr:
551     Src2Name = getRegName(MI->getOperand(2).getReg());
552     // FALL THROUGH.
553   case X86::PUNPCKLWDrm:
554   case X86::VPUNPCKLWDrm:
555     Src1Name = getRegName(MI->getOperand(1).getReg());
556     DestName = getRegName(MI->getOperand(0).getReg());
557     DecodeUNPCKLMask(MVT::v8i16, ShuffleMask);
558     break;
559   case X86::VPUNPCKLWDYrr:
560     Src2Name = getRegName(MI->getOperand(2).getReg());
561     // FALL THROUGH.
562   case X86::VPUNPCKLWDYrm:
563     Src1Name = getRegName(MI->getOperand(1).getReg());
564     DestName = getRegName(MI->getOperand(0).getReg());
565     DecodeUNPCKLMask(MVT::v16i16, ShuffleMask);
566     break;
567   case X86::PUNPCKLDQrr:
568   case X86::VPUNPCKLDQrr:
569     Src2Name = getRegName(MI->getOperand(2).getReg());
570     // FALL THROUGH.
571   case X86::PUNPCKLDQrm:
572   case X86::VPUNPCKLDQrm:
573     Src1Name = getRegName(MI->getOperand(1).getReg());
574     DestName = getRegName(MI->getOperand(0).getReg());
575     DecodeUNPCKLMask(MVT::v4i32, ShuffleMask);
576     break;
577   case X86::VPUNPCKLDQYrr:
578     Src2Name = getRegName(MI->getOperand(2).getReg());
579     // FALL THROUGH.
580   case X86::VPUNPCKLDQYrm:
581     Src1Name = getRegName(MI->getOperand(1).getReg());
582     DestName = getRegName(MI->getOperand(0).getReg());
583     DecodeUNPCKLMask(MVT::v8i32, ShuffleMask);
584     break;
585   case X86::VPUNPCKLDQZrr:
586     Src2Name = getRegName(MI->getOperand(2).getReg());
587     // FALL THROUGH.
588   case X86::VPUNPCKLDQZrm:
589     Src1Name = getRegName(MI->getOperand(1).getReg());
590     DestName = getRegName(MI->getOperand(0).getReg());
591     DecodeUNPCKLMask(MVT::v16i32, ShuffleMask);
592     break;
593   case X86::PUNPCKLQDQrr:
594   case X86::VPUNPCKLQDQrr:
595     Src2Name = getRegName(MI->getOperand(2).getReg());
596     // FALL THROUGH.
597   case X86::PUNPCKLQDQrm:
598   case X86::VPUNPCKLQDQrm:
599     Src1Name = getRegName(MI->getOperand(1).getReg());
600     DestName = getRegName(MI->getOperand(0).getReg());
601     DecodeUNPCKLMask(MVT::v2i64, ShuffleMask);
602     break;
603   case X86::VPUNPCKLQDQYrr:
604     Src2Name = getRegName(MI->getOperand(2).getReg());
605     // FALL THROUGH.
606   case X86::VPUNPCKLQDQYrm:
607     Src1Name = getRegName(MI->getOperand(1).getReg());
608     DestName = getRegName(MI->getOperand(0).getReg());
609     DecodeUNPCKLMask(MVT::v4i64, ShuffleMask);
610     break;
611   case X86::VPUNPCKLQDQZrr:
612     Src2Name = getRegName(MI->getOperand(2).getReg());
613     // FALL THROUGH.
614   case X86::VPUNPCKLQDQZrm:
615     Src1Name = getRegName(MI->getOperand(1).getReg());
616     DestName = getRegName(MI->getOperand(0).getReg());
617     DecodeUNPCKLMask(MVT::v8i64, ShuffleMask);
618     break;
619
620   case X86::SHUFPDrri:
621   case X86::VSHUFPDrri:
622     Src2Name = getRegName(MI->getOperand(2).getReg());
623     // FALL THROUGH.
624   case X86::SHUFPDrmi:
625   case X86::VSHUFPDrmi:
626     if(MI->getOperand(MI->getNumOperands()-1).isImm())
627       DecodeSHUFPMask(MVT::v2f64,
628                       MI->getOperand(MI->getNumOperands()-1).getImm(),
629                       ShuffleMask);
630     Src1Name = getRegName(MI->getOperand(1).getReg());
631     DestName = getRegName(MI->getOperand(0).getReg());
632     break;
633   case X86::VSHUFPDYrri:
634     Src2Name = getRegName(MI->getOperand(2).getReg());
635     // FALL THROUGH.
636   case X86::VSHUFPDYrmi:
637     if(MI->getOperand(MI->getNumOperands()-1).isImm())
638       DecodeSHUFPMask(MVT::v4f64,
639                       MI->getOperand(MI->getNumOperands()-1).getImm(),
640                       ShuffleMask);
641     Src1Name = getRegName(MI->getOperand(1).getReg());
642     DestName = getRegName(MI->getOperand(0).getReg());
643     break;
644
645   case X86::SHUFPSrri:
646   case X86::VSHUFPSrri:
647     Src2Name = getRegName(MI->getOperand(2).getReg());
648     // FALL THROUGH.
649   case X86::SHUFPSrmi:
650   case X86::VSHUFPSrmi:
651     if(MI->getOperand(MI->getNumOperands()-1).isImm())
652       DecodeSHUFPMask(MVT::v4f32,
653                       MI->getOperand(MI->getNumOperands()-1).getImm(),
654                       ShuffleMask);
655     Src1Name = getRegName(MI->getOperand(1).getReg());
656     DestName = getRegName(MI->getOperand(0).getReg());
657     break;
658   case X86::VSHUFPSYrri:
659     Src2Name = getRegName(MI->getOperand(2).getReg());
660     // FALL THROUGH.
661   case X86::VSHUFPSYrmi:
662     if(MI->getOperand(MI->getNumOperands()-1).isImm())
663       DecodeSHUFPMask(MVT::v8f32,
664                       MI->getOperand(MI->getNumOperands()-1).getImm(),
665                       ShuffleMask);
666     Src1Name = getRegName(MI->getOperand(1).getReg());
667     DestName = getRegName(MI->getOperand(0).getReg());
668     break;
669
670   case X86::UNPCKLPDrr:
671   case X86::VUNPCKLPDrr:
672     Src2Name = getRegName(MI->getOperand(2).getReg());
673     // FALL THROUGH.
674   case X86::UNPCKLPDrm:
675   case X86::VUNPCKLPDrm:
676     DecodeUNPCKLMask(MVT::v2f64, ShuffleMask);
677     Src1Name = getRegName(MI->getOperand(1).getReg());
678     DestName = getRegName(MI->getOperand(0).getReg());
679     break;
680   case X86::VUNPCKLPDYrr:
681     Src2Name = getRegName(MI->getOperand(2).getReg());
682     // FALL THROUGH.
683   case X86::VUNPCKLPDYrm:
684     DecodeUNPCKLMask(MVT::v4f64, ShuffleMask);
685     Src1Name = getRegName(MI->getOperand(1).getReg());
686     DestName = getRegName(MI->getOperand(0).getReg());
687     break;
688   case X86::VUNPCKLPDZrr:
689     Src2Name = getRegName(MI->getOperand(2).getReg());
690     // FALL THROUGH.
691   case X86::VUNPCKLPDZrm:
692     DecodeUNPCKLMask(MVT::v8f64, ShuffleMask);
693     Src1Name = getRegName(MI->getOperand(1).getReg());
694     DestName = getRegName(MI->getOperand(0).getReg());
695     break;
696   case X86::UNPCKLPSrr:
697   case X86::VUNPCKLPSrr:
698     Src2Name = getRegName(MI->getOperand(2).getReg());
699     // FALL THROUGH.
700   case X86::UNPCKLPSrm:
701   case X86::VUNPCKLPSrm:
702     DecodeUNPCKLMask(MVT::v4f32, ShuffleMask);
703     Src1Name = getRegName(MI->getOperand(1).getReg());
704     DestName = getRegName(MI->getOperand(0).getReg());
705     break;
706   case X86::VUNPCKLPSYrr:
707     Src2Name = getRegName(MI->getOperand(2).getReg());
708     // FALL THROUGH.
709   case X86::VUNPCKLPSYrm:
710     DecodeUNPCKLMask(MVT::v8f32, ShuffleMask);
711     Src1Name = getRegName(MI->getOperand(1).getReg());
712     DestName = getRegName(MI->getOperand(0).getReg());
713     break;
714   case X86::VUNPCKLPSZrr:
715     Src2Name = getRegName(MI->getOperand(2).getReg());
716     // FALL THROUGH.
717   case X86::VUNPCKLPSZrm:
718     DecodeUNPCKLMask(MVT::v16f32, ShuffleMask);
719     Src1Name = getRegName(MI->getOperand(1).getReg());
720     DestName = getRegName(MI->getOperand(0).getReg());
721     break;
722   case X86::UNPCKHPDrr:
723   case X86::VUNPCKHPDrr:
724     Src2Name = getRegName(MI->getOperand(2).getReg());
725     // FALL THROUGH.
726   case X86::UNPCKHPDrm:
727   case X86::VUNPCKHPDrm:
728     DecodeUNPCKHMask(MVT::v2f64, ShuffleMask);
729     Src1Name = getRegName(MI->getOperand(1).getReg());
730     DestName = getRegName(MI->getOperand(0).getReg());
731     break;
732   case X86::VUNPCKHPDYrr:
733     Src2Name = getRegName(MI->getOperand(2).getReg());
734     // FALL THROUGH.
735   case X86::VUNPCKHPDYrm:
736     DecodeUNPCKHMask(MVT::v4f64, ShuffleMask);
737     Src1Name = getRegName(MI->getOperand(1).getReg());
738     DestName = getRegName(MI->getOperand(0).getReg());
739     break;
740   case X86::VUNPCKHPDZrr:
741     Src2Name = getRegName(MI->getOperand(2).getReg());
742     // FALL THROUGH.
743   case X86::VUNPCKHPDZrm:
744     DecodeUNPCKHMask(MVT::v8f64, ShuffleMask);
745     Src1Name = getRegName(MI->getOperand(1).getReg());
746     DestName = getRegName(MI->getOperand(0).getReg());
747     break;
748   case X86::UNPCKHPSrr:
749   case X86::VUNPCKHPSrr:
750     Src2Name = getRegName(MI->getOperand(2).getReg());
751     // FALL THROUGH.
752   case X86::UNPCKHPSrm:
753   case X86::VUNPCKHPSrm:
754     DecodeUNPCKHMask(MVT::v4f32, ShuffleMask);
755     Src1Name = getRegName(MI->getOperand(1).getReg());
756     DestName = getRegName(MI->getOperand(0).getReg());
757     break;
758   case X86::VUNPCKHPSYrr:
759     Src2Name = getRegName(MI->getOperand(2).getReg());
760     // FALL THROUGH.
761   case X86::VUNPCKHPSYrm:
762     DecodeUNPCKHMask(MVT::v8f32, ShuffleMask);
763     Src1Name = getRegName(MI->getOperand(1).getReg());
764     DestName = getRegName(MI->getOperand(0).getReg());
765     break;
766   case X86::VUNPCKHPSZrr:
767     Src2Name = getRegName(MI->getOperand(2).getReg());
768     // FALL THROUGH.
769   case X86::VUNPCKHPSZrm:
770     DecodeUNPCKHMask(MVT::v16f32, ShuffleMask);
771     Src1Name = getRegName(MI->getOperand(1).getReg());
772     DestName = getRegName(MI->getOperand(0).getReg());
773     break;
774   case X86::VPERMILPSri:
775     Src1Name = getRegName(MI->getOperand(1).getReg());
776     // FALL THROUGH.
777   case X86::VPERMILPSmi:
778     if(MI->getOperand(MI->getNumOperands()-1).isImm())
779       DecodePSHUFMask(MVT::v4f32,
780                       MI->getOperand(MI->getNumOperands()-1).getImm(),
781                       ShuffleMask);
782     DestName = getRegName(MI->getOperand(0).getReg());
783     break;
784   case X86::VPERMILPSYri:
785     Src1Name = getRegName(MI->getOperand(1).getReg());
786     // FALL THROUGH.
787   case X86::VPERMILPSYmi:
788     if(MI->getOperand(MI->getNumOperands()-1).isImm())
789       DecodePSHUFMask(MVT::v8f32,
790                       MI->getOperand(MI->getNumOperands()-1).getImm(),
791                       ShuffleMask);
792     DestName = getRegName(MI->getOperand(0).getReg());
793     break;
794   case X86::VPERMILPDri:
795     Src1Name = getRegName(MI->getOperand(1).getReg());
796     // FALL THROUGH.
797   case X86::VPERMILPDmi:
798     if(MI->getOperand(MI->getNumOperands()-1).isImm())
799       DecodePSHUFMask(MVT::v2f64,
800                       MI->getOperand(MI->getNumOperands()-1).getImm(),
801                       ShuffleMask);
802     DestName = getRegName(MI->getOperand(0).getReg());
803     break;
804   case X86::VPERMILPDYri:
805     Src1Name = getRegName(MI->getOperand(1).getReg());
806     // FALL THROUGH.
807   case X86::VPERMILPDYmi:
808     if(MI->getOperand(MI->getNumOperands()-1).isImm())
809       DecodePSHUFMask(MVT::v4f64,
810                       MI->getOperand(MI->getNumOperands()-1).getImm(),
811                       ShuffleMask);
812     DestName = getRegName(MI->getOperand(0).getReg());
813     break;
814   case X86::VPERM2F128rr:
815   case X86::VPERM2I128rr:
816     Src2Name = getRegName(MI->getOperand(2).getReg());
817     // FALL THROUGH.
818   case X86::VPERM2F128rm:
819   case X86::VPERM2I128rm:
820     // For instruction comments purpose, assume the 256-bit vector is v4i64.
821     if(MI->getOperand(MI->getNumOperands()-1).isImm())
822       DecodeVPERM2X128Mask(MVT::v4i64,
823                            MI->getOperand(MI->getNumOperands()-1).getImm(),
824                            ShuffleMask);
825     Src1Name = getRegName(MI->getOperand(1).getReg());
826     DestName = getRegName(MI->getOperand(0).getReg());
827     break;
828   case X86::VPERMQYri:
829   case X86::VPERMPDYri:
830     Src1Name = getRegName(MI->getOperand(1).getReg());
831     // FALL THROUGH.
832   case X86::VPERMQYmi:
833   case X86::VPERMPDYmi:
834     if(MI->getOperand(MI->getNumOperands()-1).isImm())
835       DecodeVPERMMask(MI->getOperand(MI->getNumOperands()-1).getImm(),
836                       ShuffleMask);
837     DestName = getRegName(MI->getOperand(0).getReg());
838     break;
839
840   case X86::MOVSDrr:
841   case X86::VMOVSDrr:
842     Src2Name = getRegName(MI->getOperand(2).getReg());
843     Src1Name = getRegName(MI->getOperand(1).getReg());
844     // FALL THROUGH.
845   case X86::MOVSDrm:
846   case X86::VMOVSDrm:
847     DecodeScalarMoveMask(MVT::v2f64, nullptr == Src2Name, ShuffleMask);
848     DestName = getRegName(MI->getOperand(0).getReg());
849     break;
850   case X86::MOVSSrr:
851   case X86::VMOVSSrr:
852     Src2Name = getRegName(MI->getOperand(2).getReg());
853     Src1Name = getRegName(MI->getOperand(1).getReg());
854     // FALL THROUGH.
855   case X86::MOVSSrm:
856   case X86::VMOVSSrm:
857     DecodeScalarMoveMask(MVT::v4f32, nullptr == Src2Name, ShuffleMask);
858     DestName = getRegName(MI->getOperand(0).getReg());
859     break;
860
861   case X86::MOVPQI2QIrr:
862   case X86::MOVZPQILo2PQIrr:
863   case X86::VMOVPQI2QIrr:
864   case X86::VMOVZPQILo2PQIrr:
865     Src1Name = getRegName(MI->getOperand(1).getReg());
866   // FALL THROUGH.
867   case X86::MOVQI2PQIrm:
868   case X86::MOVZQI2PQIrm:
869   case X86::MOVZPQILo2PQIrm:
870   case X86::VMOVQI2PQIrm:
871   case X86::VMOVZQI2PQIrm:
872   case X86::VMOVZPQILo2PQIrm:
873     DecodeZeroMoveLowMask(MVT::v2i64, ShuffleMask);
874     DestName = getRegName(MI->getOperand(0).getReg());
875     break;
876   case X86::MOVDI2PDIrm:
877   case X86::VMOVDI2PDIrm:
878     DecodeZeroMoveLowMask(MVT::v4i32, ShuffleMask);
879     DestName = getRegName(MI->getOperand(0).getReg());
880     break;
881
882   case X86::PMOVZXBWrr:
883   case X86::PMOVZXBDrr:
884   case X86::PMOVZXBQrr:
885   case X86::PMOVZXWDrr:
886   case X86::PMOVZXWQrr:
887   case X86::PMOVZXDQrr:
888   case X86::VPMOVZXBWrr:
889   case X86::VPMOVZXBDrr:
890   case X86::VPMOVZXBQrr:
891   case X86::VPMOVZXWDrr:
892   case X86::VPMOVZXWQrr:
893   case X86::VPMOVZXDQrr:
894   case X86::VPMOVZXBWYrr:
895   case X86::VPMOVZXBDYrr:
896   case X86::VPMOVZXBQYrr:
897   case X86::VPMOVZXWDYrr:
898   case X86::VPMOVZXWQYrr:
899   case X86::VPMOVZXDQYrr:
900     Src1Name = getRegName(MI->getOperand(1).getReg());
901   // FALL THROUGH.
902   case X86::PMOVZXBWrm:
903   case X86::PMOVZXBDrm:
904   case X86::PMOVZXBQrm:
905   case X86::PMOVZXWDrm:
906   case X86::PMOVZXWQrm:
907   case X86::PMOVZXDQrm:
908   case X86::VPMOVZXBWrm:
909   case X86::VPMOVZXBDrm:
910   case X86::VPMOVZXBQrm:
911   case X86::VPMOVZXWDrm:
912   case X86::VPMOVZXWQrm:
913   case X86::VPMOVZXDQrm:
914   case X86::VPMOVZXBWYrm:
915   case X86::VPMOVZXBDYrm:
916   case X86::VPMOVZXBQYrm:
917   case X86::VPMOVZXWDYrm:
918   case X86::VPMOVZXWQYrm:
919   case X86::VPMOVZXDQYrm: {
920     MVT SrcVT, DstVT;
921     getZeroExtensionTypes(MI, SrcVT, DstVT);
922     DecodeZeroExtendMask(SrcVT, DstVT, ShuffleMask);
923     DestName = getRegName(MI->getOperand(0).getReg());
924   } break;
925   }
926
927   // The only comments we decode are shuffles, so give up if we were unable to
928   // decode a shuffle mask.
929   if (ShuffleMask.empty())
930     return false;
931
932   if (!DestName) DestName = Src1Name;
933   OS << (DestName ? DestName : "mem") << " = ";
934
935   // If the two sources are the same, canonicalize the input elements to be
936   // from the first src so that we get larger element spans.
937   if (Src1Name == Src2Name) {
938     for (unsigned i = 0, e = ShuffleMask.size(); i != e; ++i) {
939       if ((int)ShuffleMask[i] >= 0 && // Not sentinel.
940           ShuffleMask[i] >= (int)e)        // From second mask.
941         ShuffleMask[i] -= e;
942     }
943   }
944
945   // The shuffle mask specifies which elements of the src1/src2 fill in the
946   // destination, with a few sentinel values.  Loop through and print them
947   // out.
948   for (unsigned i = 0, e = ShuffleMask.size(); i != e; ++i) {
949     if (i != 0)
950       OS << ',';
951     if (ShuffleMask[i] == SM_SentinelZero) {
952       OS << "zero";
953       continue;
954     }
955
956     // Otherwise, it must come from src1 or src2.  Print the span of elements
957     // that comes from this src.
958     bool isSrc1 = ShuffleMask[i] < (int)ShuffleMask.size();
959     const char *SrcName = isSrc1 ? Src1Name : Src2Name;
960     OS << (SrcName ? SrcName : "mem") << '[';
961     bool IsFirst = true;
962     while (i != e && (int)ShuffleMask[i] != SM_SentinelZero &&
963            (ShuffleMask[i] < (int)ShuffleMask.size()) == isSrc1) {
964       if (!IsFirst)
965         OS << ',';
966       else
967         IsFirst = false;
968       if (ShuffleMask[i] == SM_SentinelUndef)
969         OS << "u";
970       else
971         OS << ShuffleMask[i] % ShuffleMask.size();
972       ++i;
973     }
974     OS << ']';
975     --i;  // For loop increments element #.
976   }
977   //MI->print(OS, 0);
978   OS << "\n";
979
980   // We successfully added a comment to this instruction.
981   return true;
982 }