Merge SSE and AVX shuffle instructions in the comment printer.
[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/Support/raw_ostream.h"
20 using namespace llvm;
21
22 //===----------------------------------------------------------------------===//
23 // Top Level Entrypoint
24 //===----------------------------------------------------------------------===//
25
26 /// EmitAnyX86InstComments - This function decodes x86 instructions and prints
27 /// newline terminated strings to the specified string if desired.  This
28 /// information is shown in disassembly dumps when verbose assembly is enabled.
29 void llvm::EmitAnyX86InstComments(const MCInst *MI, raw_ostream &OS,
30                                   const char *(*getRegName)(unsigned)) {
31   // If this is a shuffle operation, the switch should fill in this state.
32   SmallVector<int, 8> ShuffleMask;
33   const char *DestName = 0, *Src1Name = 0, *Src2Name = 0;
34
35   switch (MI->getOpcode()) {
36   case X86::INSERTPSrr:
37   case X86::VINSERTPSrr:
38     DestName = getRegName(MI->getOperand(0).getReg());
39     Src1Name = getRegName(MI->getOperand(1).getReg());
40     Src2Name = getRegName(MI->getOperand(2).getReg());
41     DecodeINSERTPSMask(MI->getOperand(3).getImm(), ShuffleMask);
42     break;
43
44   case X86::MOVLHPSrr:
45   case X86::VMOVLHPSrr:
46     Src2Name = getRegName(MI->getOperand(2).getReg());
47     Src1Name = getRegName(MI->getOperand(1).getReg());
48     DestName = getRegName(MI->getOperand(0).getReg());
49     DecodeMOVLHPSMask(2, ShuffleMask);
50     break;
51
52   case X86::MOVHLPSrr:
53   case X86::VMOVHLPSrr:
54     Src2Name = getRegName(MI->getOperand(2).getReg());
55     Src1Name = getRegName(MI->getOperand(1).getReg());
56     DestName = getRegName(MI->getOperand(0).getReg());
57     DecodeMOVHLPSMask(2, ShuffleMask);
58     break;
59
60   case X86::PALIGNR128rr:
61   case X86::VPALIGNR128rr:
62     Src1Name = getRegName(MI->getOperand(2).getReg());
63     // FALL THROUGH.
64   case X86::PALIGNR128rm:
65   case X86::VPALIGNR128rm:
66     Src2Name = getRegName(MI->getOperand(1).getReg());
67     DestName = getRegName(MI->getOperand(0).getReg());
68     DecodePALIGNRMask(MVT::v16i8,
69                       MI->getOperand(MI->getNumOperands()-1).getImm(),
70                       ShuffleMask);
71     break;
72   case X86::VPALIGNR256rr:
73     Src1Name = getRegName(MI->getOperand(2).getReg());
74     // FALL THROUGH.
75   case X86::VPALIGNR256rm:
76     Src2Name = getRegName(MI->getOperand(1).getReg());
77     DestName = getRegName(MI->getOperand(0).getReg());
78     DecodePALIGNRMask(MVT::v32i8,
79                       MI->getOperand(MI->getNumOperands()-1).getImm(),
80                       ShuffleMask);
81     break;
82
83   case X86::PSHUFDri:
84   case X86::VPSHUFDri:
85     Src1Name = getRegName(MI->getOperand(1).getReg());
86     // FALL THROUGH.
87   case X86::PSHUFDmi:
88   case X86::VPSHUFDmi:
89     DestName = getRegName(MI->getOperand(0).getReg());
90     DecodePSHUFMask(MVT::v4i32, MI->getOperand(MI->getNumOperands()-1).getImm(),
91                      ShuffleMask);
92     break;
93   case X86::VPSHUFDYri:
94     Src1Name = getRegName(MI->getOperand(1).getReg());
95     // FALL THROUGH.
96   case X86::VPSHUFDYmi:
97     DestName = getRegName(MI->getOperand(0).getReg());
98     DecodePSHUFMask(MVT::v8i32, MI->getOperand(MI->getNumOperands()-1).getImm(),
99                     ShuffleMask);
100     break;
101
102
103   case X86::PSHUFHWri:
104   case X86::VPSHUFHWri:
105     Src1Name = getRegName(MI->getOperand(1).getReg());
106     // FALL THROUGH.
107   case X86::PSHUFHWmi:
108   case X86::VPSHUFHWmi:
109     DestName = getRegName(MI->getOperand(0).getReg());
110     DecodePSHUFHWMask(MVT::v8i16,
111                       MI->getOperand(MI->getNumOperands()-1).getImm(),
112                       ShuffleMask);
113     break;
114   case X86::VPSHUFHWYri:
115     Src1Name = getRegName(MI->getOperand(1).getReg());
116     // FALL THROUGH.
117   case X86::VPSHUFHWYmi:
118     DestName = getRegName(MI->getOperand(0).getReg());
119     DecodePSHUFHWMask(MVT::v16i16,
120                       MI->getOperand(MI->getNumOperands()-1).getImm(),
121                       ShuffleMask);
122     break;
123   case X86::PSHUFLWri:
124   case X86::VPSHUFLWri:
125     Src1Name = getRegName(MI->getOperand(1).getReg());
126     // FALL THROUGH.
127   case X86::PSHUFLWmi:
128   case X86::VPSHUFLWmi:
129     DestName = getRegName(MI->getOperand(0).getReg());
130     DecodePSHUFLWMask(MVT::v8i16,
131                       MI->getOperand(MI->getNumOperands()-1).getImm(),
132                       ShuffleMask);
133     break;
134   case X86::VPSHUFLWYri:
135     Src1Name = getRegName(MI->getOperand(1).getReg());
136     // FALL THROUGH.
137   case X86::VPSHUFLWYmi:
138     DestName = getRegName(MI->getOperand(0).getReg());
139     DecodePSHUFLWMask(MVT::v16i16,
140                       MI->getOperand(MI->getNumOperands()-1).getImm(),
141                       ShuffleMask);
142     break;
143
144   case X86::PUNPCKHBWrr:
145   case X86::VPUNPCKHBWrr:
146     Src2Name = getRegName(MI->getOperand(2).getReg());
147     // FALL THROUGH.
148   case X86::PUNPCKHBWrm:
149   case X86::VPUNPCKHBWrm:
150     Src1Name = getRegName(MI->getOperand(1).getReg());
151     DestName = getRegName(MI->getOperand(0).getReg());
152     DecodeUNPCKHMask(MVT::v16i8, ShuffleMask);
153     break;
154   case X86::VPUNPCKHBWYrr:
155     Src2Name = getRegName(MI->getOperand(2).getReg());
156     // FALL THROUGH.
157   case X86::VPUNPCKHBWYrm:
158     Src1Name = getRegName(MI->getOperand(1).getReg());
159     DestName = getRegName(MI->getOperand(0).getReg());
160     DecodeUNPCKHMask(MVT::v32i8, ShuffleMask);
161     break;
162   case X86::PUNPCKHWDrr:
163   case X86::VPUNPCKHWDrr:
164     Src2Name = getRegName(MI->getOperand(2).getReg());
165     // FALL THROUGH.
166   case X86::PUNPCKHWDrm:
167   case X86::VPUNPCKHWDrm:
168     Src1Name = getRegName(MI->getOperand(1).getReg());
169     DestName = getRegName(MI->getOperand(0).getReg());
170     DecodeUNPCKHMask(MVT::v8i16, ShuffleMask);
171     break;
172   case X86::VPUNPCKHWDYrr:
173     Src2Name = getRegName(MI->getOperand(2).getReg());
174     // FALL THROUGH.
175   case X86::VPUNPCKHWDYrm:
176     Src1Name = getRegName(MI->getOperand(1).getReg());
177     DestName = getRegName(MI->getOperand(0).getReg());
178     DecodeUNPCKHMask(MVT::v16i16, ShuffleMask);
179     break;
180   case X86::PUNPCKHDQrr:
181   case X86::VPUNPCKHDQrr:
182     Src2Name = getRegName(MI->getOperand(2).getReg());
183     // FALL THROUGH.
184   case X86::PUNPCKHDQrm:
185   case X86::VPUNPCKHDQrm:
186     Src1Name = getRegName(MI->getOperand(1).getReg());
187     DestName = getRegName(MI->getOperand(0).getReg());
188     DecodeUNPCKHMask(MVT::v4i32, ShuffleMask);
189     break;
190   case X86::VPUNPCKHDQYrr:
191     Src2Name = getRegName(MI->getOperand(2).getReg());
192     // FALL THROUGH.
193   case X86::VPUNPCKHDQYrm:
194     Src1Name = getRegName(MI->getOperand(1).getReg());
195     DestName = getRegName(MI->getOperand(0).getReg());
196     DecodeUNPCKHMask(MVT::v8i32, ShuffleMask);
197     break;
198   case X86::PUNPCKHQDQrr:
199   case X86::VPUNPCKHQDQrr:
200     Src2Name = getRegName(MI->getOperand(2).getReg());
201     // FALL THROUGH.
202   case X86::PUNPCKHQDQrm:
203   case X86::VPUNPCKHQDQrm:
204     Src1Name = getRegName(MI->getOperand(1).getReg());
205     DestName = getRegName(MI->getOperand(0).getReg());
206     DecodeUNPCKHMask(MVT::v2i64, ShuffleMask);
207     break;
208   case X86::VPUNPCKHQDQYrr:
209     Src2Name = getRegName(MI->getOperand(2).getReg());
210     // FALL THROUGH.
211   case X86::VPUNPCKHQDQYrm:
212     Src1Name = getRegName(MI->getOperand(1).getReg());
213     DestName = getRegName(MI->getOperand(0).getReg());
214     DecodeUNPCKHMask(MVT::v4i64, ShuffleMask);
215     break;
216
217   case X86::PUNPCKLBWrr:
218   case X86::VPUNPCKLBWrr:
219     Src2Name = getRegName(MI->getOperand(2).getReg());
220     // FALL THROUGH.
221   case X86::PUNPCKLBWrm:
222   case X86::VPUNPCKLBWrm:
223     Src1Name = getRegName(MI->getOperand(1).getReg());
224     DestName = getRegName(MI->getOperand(0).getReg());
225     DecodeUNPCKLMask(MVT::v16i8, ShuffleMask);
226     break;
227   case X86::VPUNPCKLBWYrr:
228     Src2Name = getRegName(MI->getOperand(2).getReg());
229     // FALL THROUGH.
230   case X86::VPUNPCKLBWYrm:
231     Src1Name = getRegName(MI->getOperand(1).getReg());
232     DestName = getRegName(MI->getOperand(0).getReg());
233     DecodeUNPCKLMask(MVT::v32i8, ShuffleMask);
234     break;
235   case X86::PUNPCKLWDrr:
236   case X86::VPUNPCKLWDrr:
237     Src2Name = getRegName(MI->getOperand(2).getReg());
238     // FALL THROUGH.
239   case X86::PUNPCKLWDrm:
240   case X86::VPUNPCKLWDrm:
241     Src1Name = getRegName(MI->getOperand(1).getReg());
242     DestName = getRegName(MI->getOperand(0).getReg());
243     DecodeUNPCKLMask(MVT::v8i16, ShuffleMask);
244     break;
245   case X86::VPUNPCKLWDYrr:
246     Src2Name = getRegName(MI->getOperand(2).getReg());
247     // FALL THROUGH.
248   case X86::VPUNPCKLWDYrm:
249     Src1Name = getRegName(MI->getOperand(1).getReg());
250     DestName = getRegName(MI->getOperand(0).getReg());
251     DecodeUNPCKLMask(MVT::v16i16, ShuffleMask);
252     break;
253   case X86::PUNPCKLDQrr:
254   case X86::VPUNPCKLDQrr:
255     Src2Name = getRegName(MI->getOperand(2).getReg());
256     // FALL THROUGH.
257   case X86::PUNPCKLDQrm:
258   case X86::VPUNPCKLDQrm:
259     Src1Name = getRegName(MI->getOperand(1).getReg());
260     DestName = getRegName(MI->getOperand(0).getReg());
261     DecodeUNPCKLMask(MVT::v4i32, ShuffleMask);
262     break;
263   case X86::VPUNPCKLDQYrr:
264     Src2Name = getRegName(MI->getOperand(2).getReg());
265     // FALL THROUGH.
266   case X86::VPUNPCKLDQYrm:
267     Src1Name = getRegName(MI->getOperand(1).getReg());
268     DestName = getRegName(MI->getOperand(0).getReg());
269     DecodeUNPCKLMask(MVT::v8i32, ShuffleMask);
270     break;
271   case X86::PUNPCKLQDQrr:
272   case X86::VPUNPCKLQDQrr:
273     Src2Name = getRegName(MI->getOperand(2).getReg());
274     // FALL THROUGH.
275   case X86::PUNPCKLQDQrm:
276   case X86::VPUNPCKLQDQrm:
277     Src1Name = getRegName(MI->getOperand(1).getReg());
278     DestName = getRegName(MI->getOperand(0).getReg());
279     DecodeUNPCKLMask(MVT::v2i64, ShuffleMask);
280     break;
281   case X86::VPUNPCKLQDQYrr:
282     Src2Name = getRegName(MI->getOperand(2).getReg());
283     // FALL THROUGH.
284   case X86::VPUNPCKLQDQYrm:
285     Src1Name = getRegName(MI->getOperand(1).getReg());
286     DestName = getRegName(MI->getOperand(0).getReg());
287     DecodeUNPCKLMask(MVT::v4i64, ShuffleMask);
288     break;
289
290   case X86::SHUFPDrri:
291   case X86::VSHUFPDrri:
292     Src2Name = getRegName(MI->getOperand(2).getReg());
293     // FALL THROUGH.
294   case X86::SHUFPDrmi:
295   case X86::VSHUFPDrmi:
296     DecodeSHUFPMask(MVT::v2f64, MI->getOperand(MI->getNumOperands()-1).getImm(),
297                     ShuffleMask);
298     Src1Name = getRegName(MI->getOperand(1).getReg());
299     DestName = getRegName(MI->getOperand(0).getReg());
300     break;
301   case X86::VSHUFPDYrri:
302     Src2Name = getRegName(MI->getOperand(2).getReg());
303     // FALL THROUGH.
304   case X86::VSHUFPDYrmi:
305     DecodeSHUFPMask(MVT::v4f64, MI->getOperand(MI->getNumOperands()-1).getImm(),
306                     ShuffleMask);
307     Src1Name = getRegName(MI->getOperand(1).getReg());
308     DestName = getRegName(MI->getOperand(0).getReg());
309     break;
310
311   case X86::SHUFPSrri:
312   case X86::VSHUFPSrri:
313     Src2Name = getRegName(MI->getOperand(2).getReg());
314     // FALL THROUGH.
315   case X86::SHUFPSrmi:
316   case X86::VSHUFPSrmi:
317     DecodeSHUFPMask(MVT::v4f32, MI->getOperand(MI->getNumOperands()-1).getImm(),
318                     ShuffleMask);
319     Src1Name = getRegName(MI->getOperand(1).getReg());
320     DestName = getRegName(MI->getOperand(0).getReg());
321     break;
322   case X86::VSHUFPSYrri:
323     Src2Name = getRegName(MI->getOperand(2).getReg());
324     // FALL THROUGH.
325   case X86::VSHUFPSYrmi:
326     DecodeSHUFPMask(MVT::v8f32, MI->getOperand(MI->getNumOperands()-1).getImm(),
327                     ShuffleMask);
328     Src1Name = getRegName(MI->getOperand(1).getReg());
329     DestName = getRegName(MI->getOperand(0).getReg());
330     break;
331
332   case X86::UNPCKLPDrr:
333   case X86::VUNPCKLPDrr:
334     Src2Name = getRegName(MI->getOperand(2).getReg());
335     // FALL THROUGH.
336   case X86::UNPCKLPDrm:
337   case X86::VUNPCKLPDrm:
338     DecodeUNPCKLMask(MVT::v2f64, ShuffleMask);
339     Src1Name = getRegName(MI->getOperand(1).getReg());
340     DestName = getRegName(MI->getOperand(0).getReg());
341     break;
342   case X86::VUNPCKLPDYrr:
343     Src2Name = getRegName(MI->getOperand(2).getReg());
344     // FALL THROUGH.
345   case X86::VUNPCKLPDYrm:
346     DecodeUNPCKLMask(MVT::v4f64, ShuffleMask);
347     Src1Name = getRegName(MI->getOperand(1).getReg());
348     DestName = getRegName(MI->getOperand(0).getReg());
349     break;
350   case X86::UNPCKLPSrr:
351   case X86::VUNPCKLPSrr:
352     Src2Name = getRegName(MI->getOperand(2).getReg());
353     // FALL THROUGH.
354   case X86::UNPCKLPSrm:
355   case X86::VUNPCKLPSrm:
356     DecodeUNPCKLMask(MVT::v4f32, ShuffleMask);
357     Src1Name = getRegName(MI->getOperand(1).getReg());
358     DestName = getRegName(MI->getOperand(0).getReg());
359     break;
360   case X86::VUNPCKLPSYrr:
361     Src2Name = getRegName(MI->getOperand(2).getReg());
362     // FALL THROUGH.
363   case X86::VUNPCKLPSYrm:
364     DecodeUNPCKLMask(MVT::v8f32, ShuffleMask);
365     Src1Name = getRegName(MI->getOperand(1).getReg());
366     DestName = getRegName(MI->getOperand(0).getReg());
367     break;
368   case X86::UNPCKHPDrr:
369   case X86::VUNPCKHPDrr:
370     Src2Name = getRegName(MI->getOperand(2).getReg());
371     // FALL THROUGH.
372   case X86::UNPCKHPDrm:
373   case X86::VUNPCKHPDrm:
374     DecodeUNPCKHMask(MVT::v2f64, ShuffleMask);
375     Src1Name = getRegName(MI->getOperand(1).getReg());
376     DestName = getRegName(MI->getOperand(0).getReg());
377     break;
378   case X86::VUNPCKHPDYrr:
379     Src2Name = getRegName(MI->getOperand(2).getReg());
380     // FALL THROUGH.
381   case X86::VUNPCKHPDYrm:
382     DecodeUNPCKHMask(MVT::v4f64, ShuffleMask);
383     Src1Name = getRegName(MI->getOperand(1).getReg());
384     DestName = getRegName(MI->getOperand(0).getReg());
385     break;
386   case X86::UNPCKHPSrr:
387   case X86::VUNPCKHPSrr:
388     Src2Name = getRegName(MI->getOperand(2).getReg());
389     // FALL THROUGH.
390   case X86::UNPCKHPSrm:
391   case X86::VUNPCKHPSrm:
392     DecodeUNPCKHMask(MVT::v4f32, ShuffleMask);
393     Src1Name = getRegName(MI->getOperand(1).getReg());
394     DestName = getRegName(MI->getOperand(0).getReg());
395     break;
396   case X86::VUNPCKHPSYrr:
397     Src2Name = getRegName(MI->getOperand(2).getReg());
398     // FALL THROUGH.
399   case X86::VUNPCKHPSYrm:
400     DecodeUNPCKHMask(MVT::v8f32, ShuffleMask);
401     Src1Name = getRegName(MI->getOperand(1).getReg());
402     DestName = getRegName(MI->getOperand(0).getReg());
403     break;
404   case X86::VPERMILPSri:
405     Src1Name = getRegName(MI->getOperand(1).getReg());
406     // FALL THROUGH.
407   case X86::VPERMILPSmi:
408     DecodePSHUFMask(MVT::v4f32, MI->getOperand(MI->getNumOperands()-1).getImm(),
409                     ShuffleMask);
410     DestName = getRegName(MI->getOperand(0).getReg());
411     break;
412   case X86::VPERMILPSYri:
413     Src1Name = getRegName(MI->getOperand(1).getReg());
414     // FALL THROUGH.
415   case X86::VPERMILPSYmi:
416     DecodePSHUFMask(MVT::v8f32, MI->getOperand(MI->getNumOperands()-1).getImm(),
417                     ShuffleMask);
418     DestName = getRegName(MI->getOperand(0).getReg());
419     break;
420   case X86::VPERMILPDri:
421     Src1Name = getRegName(MI->getOperand(1).getReg());
422     // FALL THROUGH.
423   case X86::VPERMILPDmi:
424     DecodePSHUFMask(MVT::v2f64, MI->getOperand(MI->getNumOperands()-1).getImm(),
425                     ShuffleMask);
426     DestName = getRegName(MI->getOperand(0).getReg());
427     break;
428   case X86::VPERMILPDYri:
429     Src1Name = getRegName(MI->getOperand(1).getReg());
430     // FALL THROUGH.
431   case X86::VPERMILPDYmi:
432     DecodePSHUFMask(MVT::v4f64, MI->getOperand(MI->getNumOperands()-1).getImm(),
433                        ShuffleMask);
434     DestName = getRegName(MI->getOperand(0).getReg());
435     break;
436   case X86::VPERM2F128rr:
437   case X86::VPERM2I128rr:
438     Src2Name = getRegName(MI->getOperand(2).getReg());
439     // FALL THROUGH.
440   case X86::VPERM2F128rm:
441   case X86::VPERM2I128rm:
442     // For instruction comments purpose, assume the 256-bit vector is v4i64.
443     DecodeVPERM2X128Mask(MVT::v4i64,
444                          MI->getOperand(MI->getNumOperands()-1).getImm(),
445                          ShuffleMask);
446     Src1Name = getRegName(MI->getOperand(1).getReg());
447     DestName = getRegName(MI->getOperand(0).getReg());
448     break;
449   case X86::VPERMQYri:
450   case X86::VPERMPDYri:
451     Src1Name = getRegName(MI->getOperand(1).getReg());
452     // FALL THROUGH.
453   case X86::VPERMQYmi:
454   case X86::VPERMPDYmi:
455     DecodeVPERMMask(MI->getOperand(MI->getNumOperands()-1).getImm(),
456                     ShuffleMask);
457     DestName = getRegName(MI->getOperand(0).getReg());
458     break;
459   }
460
461
462   // If this was a shuffle operation, print the shuffle mask.
463   if (!ShuffleMask.empty()) {
464     if (DestName == 0) DestName = Src1Name;
465     OS << (DestName ? DestName : "mem") << " = ";
466
467     // If the two sources are the same, canonicalize the input elements to be
468     // from the first src so that we get larger element spans.
469     if (Src1Name == Src2Name) {
470       for (unsigned i = 0, e = ShuffleMask.size(); i != e; ++i) {
471         if ((int)ShuffleMask[i] >= 0 && // Not sentinel.
472             ShuffleMask[i] >= (int)e)        // From second mask.
473           ShuffleMask[i] -= e;
474       }
475     }
476
477     // The shuffle mask specifies which elements of the src1/src2 fill in the
478     // destination, with a few sentinel values.  Loop through and print them
479     // out.
480     for (unsigned i = 0, e = ShuffleMask.size(); i != e; ++i) {
481       if (i != 0)
482         OS << ',';
483       if (ShuffleMask[i] == SM_SentinelZero) {
484         OS << "zero";
485         continue;
486       }
487
488       // Otherwise, it must come from src1 or src2.  Print the span of elements
489       // that comes from this src.
490       bool isSrc1 = ShuffleMask[i] < (int)ShuffleMask.size();
491       const char *SrcName = isSrc1 ? Src1Name : Src2Name;
492       OS << (SrcName ? SrcName : "mem") << '[';
493       bool IsFirst = true;
494       while (i != e &&
495              (int)ShuffleMask[i] >= 0 &&
496              (ShuffleMask[i] < (int)ShuffleMask.size()) == isSrc1) {
497         if (!IsFirst)
498           OS << ',';
499         else
500           IsFirst = false;
501         OS << ShuffleMask[i] % ShuffleMask.size();
502         ++i;
503       }
504       OS << ']';
505       --i;  // For loop increments element #.
506     }
507     //MI->print(OS, 0);
508     OS << "\n";
509   }
510
511 }