1 //===-- X86InstComments.cpp - Generate verbose-asm comments for instrs ----===//
3 // The LLVM Compiler Infrastructure
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
10 // This defines functionality used to emit comments about X86 instructions to
11 // an output stream for -fverbose-asm.
13 //===----------------------------------------------------------------------===//
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"
22 //===----------------------------------------------------------------------===//
23 // Top Level Entrypoint
24 //===----------------------------------------------------------------------===//
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;
35 switch (MI->getOpcode()) {
37 Src1Name = getRegName(MI->getOperand(0).getReg());
38 Src2Name = getRegName(MI->getOperand(2).getReg());
39 DecodeINSERTPSMask(MI->getOperand(3).getImm(), ShuffleMask);
41 case X86::VINSERTPSrr:
42 DestName = getRegName(MI->getOperand(0).getReg());
43 Src1Name = getRegName(MI->getOperand(1).getReg());
44 Src2Name = getRegName(MI->getOperand(2).getReg());
45 DecodeINSERTPSMask(MI->getOperand(3).getImm(), ShuffleMask);
49 Src2Name = getRegName(MI->getOperand(2).getReg());
50 Src1Name = getRegName(MI->getOperand(0).getReg());
51 DecodeMOVLHPSMask(2, ShuffleMask);
54 Src2Name = getRegName(MI->getOperand(2).getReg());
55 Src1Name = getRegName(MI->getOperand(1).getReg());
56 DestName = getRegName(MI->getOperand(0).getReg());
57 DecodeMOVLHPSMask(2, ShuffleMask);
61 Src2Name = getRegName(MI->getOperand(2).getReg());
62 Src1Name = getRegName(MI->getOperand(0).getReg());
63 DecodeMOVHLPSMask(2, ShuffleMask);
66 Src2Name = getRegName(MI->getOperand(2).getReg());
67 Src1Name = getRegName(MI->getOperand(1).getReg());
68 DestName = getRegName(MI->getOperand(0).getReg());
69 DecodeMOVHLPSMask(2, ShuffleMask);
74 Src1Name = getRegName(MI->getOperand(1).getReg());
78 DestName = getRegName(MI->getOperand(0).getReg());
79 DecodePSHUFMask(MVT::v4i32, MI->getOperand(MI->getNumOperands()-1).getImm(),
83 Src1Name = getRegName(MI->getOperand(1).getReg());
86 DestName = getRegName(MI->getOperand(0).getReg());
87 DecodePSHUFMask(MVT::v8i32, MI->getOperand(MI->getNumOperands()-1).getImm(),
94 Src1Name = getRegName(MI->getOperand(1).getReg());
98 DestName = getRegName(MI->getOperand(0).getReg());
99 DecodePSHUFHWMask(MI->getOperand(MI->getNumOperands()-1).getImm(),
103 case X86::VPSHUFLWri:
104 Src1Name = getRegName(MI->getOperand(1).getReg());
107 case X86::VPSHUFLWmi:
108 DestName = getRegName(MI->getOperand(0).getReg());
109 DecodePSHUFLWMask(MI->getOperand(MI->getNumOperands()-1).getImm(),
113 case X86::PUNPCKHBWrr:
114 Src2Name = getRegName(MI->getOperand(2).getReg());
116 case X86::PUNPCKHBWrm:
117 Src1Name = getRegName(MI->getOperand(0).getReg());
118 DecodeUNPCKHMask(MVT::v16i8, ShuffleMask);
120 case X86::VPUNPCKHBWrr:
121 Src2Name = getRegName(MI->getOperand(2).getReg());
123 case X86::VPUNPCKHBWrm:
124 Src1Name = getRegName(MI->getOperand(1).getReg());
125 DestName = getRegName(MI->getOperand(0).getReg());
126 DecodeUNPCKHMask(MVT::v16i8, ShuffleMask);
128 case X86::VPUNPCKHBWYrr:
129 Src2Name = getRegName(MI->getOperand(2).getReg());
131 case X86::VPUNPCKHBWYrm:
132 Src1Name = getRegName(MI->getOperand(1).getReg());
133 DestName = getRegName(MI->getOperand(0).getReg());
134 DecodeUNPCKHMask(MVT::v32i8, ShuffleMask);
136 case X86::PUNPCKHWDrr:
137 Src2Name = getRegName(MI->getOperand(2).getReg());
139 case X86::PUNPCKHWDrm:
140 Src1Name = getRegName(MI->getOperand(0).getReg());
141 DecodeUNPCKHMask(MVT::v8i16, ShuffleMask);
143 case X86::VPUNPCKHWDrr:
144 Src2Name = getRegName(MI->getOperand(2).getReg());
146 case X86::VPUNPCKHWDrm:
147 Src1Name = getRegName(MI->getOperand(1).getReg());
148 DestName = getRegName(MI->getOperand(0).getReg());
149 DecodeUNPCKHMask(MVT::v8i16, ShuffleMask);
151 case X86::VPUNPCKHWDYrr:
152 Src2Name = getRegName(MI->getOperand(2).getReg());
154 case X86::VPUNPCKHWDYrm:
155 Src1Name = getRegName(MI->getOperand(1).getReg());
156 DestName = getRegName(MI->getOperand(0).getReg());
157 DecodeUNPCKHMask(MVT::v16i16, ShuffleMask);
159 case X86::PUNPCKHDQrr:
160 Src2Name = getRegName(MI->getOperand(2).getReg());
162 case X86::PUNPCKHDQrm:
163 Src1Name = getRegName(MI->getOperand(0).getReg());
164 DecodeUNPCKHMask(MVT::v4i32, ShuffleMask);
166 case X86::VPUNPCKHDQrr:
167 Src2Name = getRegName(MI->getOperand(2).getReg());
169 case X86::VPUNPCKHDQrm:
170 Src1Name = getRegName(MI->getOperand(1).getReg());
171 DestName = getRegName(MI->getOperand(0).getReg());
172 DecodeUNPCKHMask(MVT::v4i32, ShuffleMask);
174 case X86::VPUNPCKHDQYrr:
175 Src2Name = getRegName(MI->getOperand(2).getReg());
177 case X86::VPUNPCKHDQYrm:
178 Src1Name = getRegName(MI->getOperand(1).getReg());
179 DestName = getRegName(MI->getOperand(0).getReg());
180 DecodeUNPCKHMask(MVT::v8i32, ShuffleMask);
182 case X86::PUNPCKHQDQrr:
183 Src2Name = getRegName(MI->getOperand(2).getReg());
185 case X86::PUNPCKHQDQrm:
186 Src1Name = getRegName(MI->getOperand(0).getReg());
187 DecodeUNPCKHMask(MVT::v2i64, ShuffleMask);
189 case X86::VPUNPCKHQDQrr:
190 Src2Name = getRegName(MI->getOperand(2).getReg());
192 case X86::VPUNPCKHQDQrm:
193 Src1Name = getRegName(MI->getOperand(1).getReg());
194 DestName = getRegName(MI->getOperand(0).getReg());
195 DecodeUNPCKHMask(MVT::v2i64, ShuffleMask);
197 case X86::VPUNPCKHQDQYrr:
198 Src2Name = getRegName(MI->getOperand(2).getReg());
200 case X86::VPUNPCKHQDQYrm:
201 Src1Name = getRegName(MI->getOperand(1).getReg());
202 DestName = getRegName(MI->getOperand(0).getReg());
203 DecodeUNPCKHMask(MVT::v4i64, ShuffleMask);
206 case X86::PUNPCKLBWrr:
207 Src2Name = getRegName(MI->getOperand(2).getReg());
209 case X86::PUNPCKLBWrm:
210 Src1Name = getRegName(MI->getOperand(0).getReg());
211 DecodeUNPCKLMask(MVT::v16i8, ShuffleMask);
213 case X86::VPUNPCKLBWrr:
214 Src2Name = getRegName(MI->getOperand(2).getReg());
216 case X86::VPUNPCKLBWrm:
217 Src1Name = getRegName(MI->getOperand(1).getReg());
218 DestName = getRegName(MI->getOperand(0).getReg());
219 DecodeUNPCKLMask(MVT::v16i8, ShuffleMask);
221 case X86::VPUNPCKLBWYrr:
222 Src2Name = getRegName(MI->getOperand(2).getReg());
224 case X86::VPUNPCKLBWYrm:
225 Src1Name = getRegName(MI->getOperand(1).getReg());
226 DestName = getRegName(MI->getOperand(0).getReg());
227 DecodeUNPCKLMask(MVT::v32i8, ShuffleMask);
229 case X86::PUNPCKLWDrr:
230 Src2Name = getRegName(MI->getOperand(2).getReg());
232 case X86::PUNPCKLWDrm:
233 Src1Name = getRegName(MI->getOperand(0).getReg());
234 DecodeUNPCKLMask(MVT::v8i16, ShuffleMask);
236 case X86::VPUNPCKLWDrr:
237 Src2Name = getRegName(MI->getOperand(2).getReg());
239 case X86::VPUNPCKLWDrm:
240 Src1Name = getRegName(MI->getOperand(1).getReg());
241 DestName = getRegName(MI->getOperand(0).getReg());
242 DecodeUNPCKLMask(MVT::v8i16, ShuffleMask);
244 case X86::VPUNPCKLWDYrr:
245 Src2Name = getRegName(MI->getOperand(2).getReg());
247 case X86::VPUNPCKLWDYrm:
248 Src1Name = getRegName(MI->getOperand(1).getReg());
249 DestName = getRegName(MI->getOperand(0).getReg());
250 DecodeUNPCKLMask(MVT::v16i16, ShuffleMask);
252 case X86::PUNPCKLDQrr:
253 Src2Name = getRegName(MI->getOperand(2).getReg());
255 case X86::PUNPCKLDQrm:
256 Src1Name = getRegName(MI->getOperand(0).getReg());
257 DecodeUNPCKLMask(MVT::v4i32, ShuffleMask);
259 case X86::VPUNPCKLDQrr:
260 Src2Name = getRegName(MI->getOperand(2).getReg());
262 case X86::VPUNPCKLDQrm:
263 Src1Name = getRegName(MI->getOperand(1).getReg());
264 DestName = getRegName(MI->getOperand(0).getReg());
265 DecodeUNPCKLMask(MVT::v4i32, ShuffleMask);
267 case X86::VPUNPCKLDQYrr:
268 Src2Name = getRegName(MI->getOperand(2).getReg());
270 case X86::VPUNPCKLDQYrm:
271 Src1Name = getRegName(MI->getOperand(1).getReg());
272 DestName = getRegName(MI->getOperand(0).getReg());
273 DecodeUNPCKLMask(MVT::v8i32, ShuffleMask);
275 case X86::PUNPCKLQDQrr:
276 Src2Name = getRegName(MI->getOperand(2).getReg());
278 case X86::PUNPCKLQDQrm:
279 Src1Name = getRegName(MI->getOperand(0).getReg());
280 DecodeUNPCKLMask(MVT::v2i64, ShuffleMask);
282 case X86::VPUNPCKLQDQrr:
283 Src2Name = getRegName(MI->getOperand(2).getReg());
285 case X86::VPUNPCKLQDQrm:
286 Src1Name = getRegName(MI->getOperand(1).getReg());
287 DestName = getRegName(MI->getOperand(0).getReg());
288 DecodeUNPCKLMask(MVT::v2i64, ShuffleMask);
290 case X86::VPUNPCKLQDQYrr:
291 Src2Name = getRegName(MI->getOperand(2).getReg());
293 case X86::VPUNPCKLQDQYrm:
294 Src1Name = getRegName(MI->getOperand(1).getReg());
295 DestName = getRegName(MI->getOperand(0).getReg());
296 DecodeUNPCKLMask(MVT::v4i64, ShuffleMask);
300 Src2Name = getRegName(MI->getOperand(2).getReg());
303 DecodeSHUFPMask(MVT::v2f64, MI->getOperand(MI->getNumOperands()-1).getImm(),
305 Src1Name = getRegName(MI->getOperand(0).getReg());
307 case X86::VSHUFPDrri:
308 Src2Name = getRegName(MI->getOperand(2).getReg());
310 case X86::VSHUFPDrmi:
311 DecodeSHUFPMask(MVT::v2f64, MI->getOperand(MI->getNumOperands()-1).getImm(),
313 Src1Name = getRegName(MI->getOperand(1).getReg());
314 DestName = getRegName(MI->getOperand(0).getReg());
316 case X86::VSHUFPDYrri:
317 Src2Name = getRegName(MI->getOperand(2).getReg());
319 case X86::VSHUFPDYrmi:
320 DecodeSHUFPMask(MVT::v4f64, MI->getOperand(MI->getNumOperands()-1).getImm(),
322 Src1Name = getRegName(MI->getOperand(1).getReg());
323 DestName = getRegName(MI->getOperand(0).getReg());
327 Src2Name = getRegName(MI->getOperand(2).getReg());
330 DecodeSHUFPMask(MVT::v4f32, MI->getOperand(MI->getNumOperands()-1).getImm(),
332 Src1Name = getRegName(MI->getOperand(0).getReg());
334 case X86::VSHUFPSrri:
335 Src2Name = getRegName(MI->getOperand(2).getReg());
337 case X86::VSHUFPSrmi:
338 DecodeSHUFPMask(MVT::v4f32, MI->getOperand(MI->getNumOperands()-1).getImm(),
340 Src1Name = getRegName(MI->getOperand(1).getReg());
341 DestName = getRegName(MI->getOperand(0).getReg());
343 case X86::VSHUFPSYrri:
344 Src2Name = getRegName(MI->getOperand(2).getReg());
346 case X86::VSHUFPSYrmi:
347 DecodeSHUFPMask(MVT::v8f32, MI->getOperand(MI->getNumOperands()-1).getImm(),
349 Src1Name = getRegName(MI->getOperand(1).getReg());
350 DestName = getRegName(MI->getOperand(0).getReg());
353 case X86::UNPCKLPDrr:
354 Src2Name = getRegName(MI->getOperand(2).getReg());
356 case X86::UNPCKLPDrm:
357 DecodeUNPCKLMask(MVT::v2f64, ShuffleMask);
358 Src1Name = getRegName(MI->getOperand(0).getReg());
360 case X86::VUNPCKLPDrr:
361 Src2Name = getRegName(MI->getOperand(2).getReg());
363 case X86::VUNPCKLPDrm:
364 DecodeUNPCKLMask(MVT::v2f64, ShuffleMask);
365 Src1Name = getRegName(MI->getOperand(1).getReg());
366 DestName = getRegName(MI->getOperand(0).getReg());
368 case X86::VUNPCKLPDYrr:
369 Src2Name = getRegName(MI->getOperand(2).getReg());
371 case X86::VUNPCKLPDYrm:
372 DecodeUNPCKLMask(MVT::v4f64, ShuffleMask);
373 Src1Name = getRegName(MI->getOperand(1).getReg());
374 DestName = getRegName(MI->getOperand(0).getReg());
376 case X86::UNPCKLPSrr:
377 Src2Name = getRegName(MI->getOperand(2).getReg());
379 case X86::UNPCKLPSrm:
380 DecodeUNPCKLMask(MVT::v4f32, ShuffleMask);
381 Src1Name = getRegName(MI->getOperand(0).getReg());
383 case X86::VUNPCKLPSrr:
384 Src2Name = getRegName(MI->getOperand(2).getReg());
386 case X86::VUNPCKLPSrm:
387 DecodeUNPCKLMask(MVT::v4f32, ShuffleMask);
388 Src1Name = getRegName(MI->getOperand(1).getReg());
389 DestName = getRegName(MI->getOperand(0).getReg());
391 case X86::VUNPCKLPSYrr:
392 Src2Name = getRegName(MI->getOperand(2).getReg());
394 case X86::VUNPCKLPSYrm:
395 DecodeUNPCKLMask(MVT::v8f32, ShuffleMask);
396 Src1Name = getRegName(MI->getOperand(1).getReg());
397 DestName = getRegName(MI->getOperand(0).getReg());
399 case X86::UNPCKHPDrr:
400 Src2Name = getRegName(MI->getOperand(2).getReg());
402 case X86::UNPCKHPDrm:
403 DecodeUNPCKHMask(MVT::v2f64, ShuffleMask);
404 Src1Name = getRegName(MI->getOperand(0).getReg());
406 case X86::VUNPCKHPDrr:
407 Src2Name = getRegName(MI->getOperand(2).getReg());
409 case X86::VUNPCKHPDrm:
410 DecodeUNPCKHMask(MVT::v2f64, ShuffleMask);
411 Src1Name = getRegName(MI->getOperand(1).getReg());
412 DestName = getRegName(MI->getOperand(0).getReg());
414 case X86::VUNPCKHPDYrr:
415 Src2Name = getRegName(MI->getOperand(2).getReg());
417 case X86::VUNPCKHPDYrm:
418 DecodeUNPCKHMask(MVT::v4f64, ShuffleMask);
419 Src1Name = getRegName(MI->getOperand(1).getReg());
420 DestName = getRegName(MI->getOperand(0).getReg());
422 case X86::UNPCKHPSrr:
423 Src2Name = getRegName(MI->getOperand(2).getReg());
425 case X86::UNPCKHPSrm:
426 DecodeUNPCKHMask(MVT::v4f32, ShuffleMask);
427 Src1Name = getRegName(MI->getOperand(0).getReg());
429 case X86::VUNPCKHPSrr:
430 Src2Name = getRegName(MI->getOperand(2).getReg());
432 case X86::VUNPCKHPSrm:
433 DecodeUNPCKHMask(MVT::v4f32, ShuffleMask);
434 Src1Name = getRegName(MI->getOperand(1).getReg());
435 DestName = getRegName(MI->getOperand(0).getReg());
437 case X86::VUNPCKHPSYrr:
438 Src2Name = getRegName(MI->getOperand(2).getReg());
440 case X86::VUNPCKHPSYrm:
441 DecodeUNPCKHMask(MVT::v8f32, ShuffleMask);
442 Src1Name = getRegName(MI->getOperand(1).getReg());
443 DestName = getRegName(MI->getOperand(0).getReg());
445 case X86::VPERMILPSri:
446 Src1Name = getRegName(MI->getOperand(1).getReg());
448 case X86::VPERMILPSmi:
449 DecodePSHUFMask(MVT::v4f32, MI->getOperand(MI->getNumOperands()-1).getImm(),
451 DestName = getRegName(MI->getOperand(0).getReg());
453 case X86::VPERMILPSYri:
454 Src1Name = getRegName(MI->getOperand(1).getReg());
456 case X86::VPERMILPSYmi:
457 DecodePSHUFMask(MVT::v8f32, MI->getOperand(MI->getNumOperands()-1).getImm(),
459 DestName = getRegName(MI->getOperand(0).getReg());
461 case X86::VPERMILPDri:
462 Src1Name = getRegName(MI->getOperand(1).getReg());
464 case X86::VPERMILPDmi:
465 DecodePSHUFMask(MVT::v2f64, MI->getOperand(MI->getNumOperands()-1).getImm(),
467 DestName = getRegName(MI->getOperand(0).getReg());
469 case X86::VPERMILPDYri:
470 Src1Name = getRegName(MI->getOperand(1).getReg());
472 case X86::VPERMILPDYmi:
473 DecodePSHUFMask(MVT::v4f64, MI->getOperand(MI->getNumOperands()-1).getImm(),
475 DestName = getRegName(MI->getOperand(0).getReg());
477 case X86::VPERM2F128rr:
478 case X86::VPERM2I128rr:
479 Src2Name = getRegName(MI->getOperand(2).getReg());
481 case X86::VPERM2F128rm:
482 case X86::VPERM2I128rm:
483 // For instruction comments purpose, assume the 256-bit vector is v4i64.
484 DecodeVPERM2X128Mask(MVT::v4i64,
485 MI->getOperand(MI->getNumOperands()-1).getImm(),
487 Src1Name = getRegName(MI->getOperand(1).getReg());
488 DestName = getRegName(MI->getOperand(0).getReg());
493 // If this was a shuffle operation, print the shuffle mask.
494 if (!ShuffleMask.empty()) {
495 if (DestName == 0) DestName = Src1Name;
496 OS << (DestName ? DestName : "mem") << " = ";
498 // If the two sources are the same, canonicalize the input elements to be
499 // from the first src so that we get larger element spans.
500 if (Src1Name == Src2Name) {
501 for (unsigned i = 0, e = ShuffleMask.size(); i != e; ++i) {
502 if ((int)ShuffleMask[i] >= 0 && // Not sentinel.
503 ShuffleMask[i] >= (int)e) // From second mask.
508 // The shuffle mask specifies which elements of the src1/src2 fill in the
509 // destination, with a few sentinel values. Loop through and print them
511 for (unsigned i = 0, e = ShuffleMask.size(); i != e; ++i) {
514 if (ShuffleMask[i] == SM_SentinelZero) {
519 // Otherwise, it must come from src1 or src2. Print the span of elements
520 // that comes from this src.
521 bool isSrc1 = ShuffleMask[i] < (int)ShuffleMask.size();
522 const char *SrcName = isSrc1 ? Src1Name : Src2Name;
523 OS << (SrcName ? SrcName : "mem") << '[';
526 (int)ShuffleMask[i] >= 0 &&
527 (ShuffleMask[i] < (int)ShuffleMask.size()) == isSrc1) {
532 OS << ShuffleMask[i] % ShuffleMask.size();
536 --i; // For loop increments element #.