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