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);
72 case X86::PALIGNR128rr:
73 case X86::VPALIGNR128rr:
74 Src1Name = getRegName(MI->getOperand(2).getReg());
76 case X86::PALIGNR128rm:
77 case X86::VPALIGNR128rm:
78 Src2Name = getRegName(MI->getOperand(1).getReg());
79 DestName = getRegName(MI->getOperand(0).getReg());
80 DecodePALIGNRMask(MVT::v16i8,
81 MI->getOperand(MI->getNumOperands()-1).getImm(),
84 case X86::VPALIGNR256rr:
85 Src1Name = getRegName(MI->getOperand(2).getReg());
87 case X86::VPALIGNR256rm:
88 Src2Name = getRegName(MI->getOperand(1).getReg());
89 DestName = getRegName(MI->getOperand(0).getReg());
90 DecodePALIGNRMask(MVT::v32i8,
91 MI->getOperand(MI->getNumOperands()-1).getImm(),
96 Src1Name = getRegName(MI->getOperand(1).getReg());
100 DestName = getRegName(MI->getOperand(0).getReg());
101 DecodePSHUFMask(MVT::v4i32, MI->getOperand(MI->getNumOperands()-1).getImm(),
104 case X86::VPSHUFDYri:
105 Src1Name = getRegName(MI->getOperand(1).getReg());
107 case X86::VPSHUFDYmi:
108 DestName = getRegName(MI->getOperand(0).getReg());
109 DecodePSHUFMask(MVT::v8i32, MI->getOperand(MI->getNumOperands()-1).getImm(),
115 case X86::VPSHUFHWri:
116 Src1Name = getRegName(MI->getOperand(1).getReg());
119 case X86::VPSHUFHWmi:
120 DestName = getRegName(MI->getOperand(0).getReg());
121 DecodePSHUFHWMask(MVT::v8i16,
122 MI->getOperand(MI->getNumOperands()-1).getImm(),
125 case X86::VPSHUFHWYri:
126 Src1Name = getRegName(MI->getOperand(1).getReg());
128 case X86::VPSHUFHWYmi:
129 DestName = getRegName(MI->getOperand(0).getReg());
130 DecodePSHUFHWMask(MVT::v16i16,
131 MI->getOperand(MI->getNumOperands()-1).getImm(),
135 case X86::VPSHUFLWri:
136 Src1Name = getRegName(MI->getOperand(1).getReg());
139 case X86::VPSHUFLWmi:
140 DestName = getRegName(MI->getOperand(0).getReg());
141 DecodePSHUFLWMask(MVT::v8i16,
142 MI->getOperand(MI->getNumOperands()-1).getImm(),
145 case X86::VPSHUFLWYri:
146 Src1Name = getRegName(MI->getOperand(1).getReg());
148 case X86::VPSHUFLWYmi:
149 DestName = getRegName(MI->getOperand(0).getReg());
150 DecodePSHUFLWMask(MVT::v16i16,
151 MI->getOperand(MI->getNumOperands()-1).getImm(),
155 case X86::PUNPCKHBWrr:
156 Src2Name = getRegName(MI->getOperand(2).getReg());
158 case X86::PUNPCKHBWrm:
159 Src1Name = getRegName(MI->getOperand(0).getReg());
160 DecodeUNPCKHMask(MVT::v16i8, ShuffleMask);
162 case X86::VPUNPCKHBWrr:
163 Src2Name = getRegName(MI->getOperand(2).getReg());
165 case X86::VPUNPCKHBWrm:
166 Src1Name = getRegName(MI->getOperand(1).getReg());
167 DestName = getRegName(MI->getOperand(0).getReg());
168 DecodeUNPCKHMask(MVT::v16i8, ShuffleMask);
170 case X86::VPUNPCKHBWYrr:
171 Src2Name = getRegName(MI->getOperand(2).getReg());
173 case X86::VPUNPCKHBWYrm:
174 Src1Name = getRegName(MI->getOperand(1).getReg());
175 DestName = getRegName(MI->getOperand(0).getReg());
176 DecodeUNPCKHMask(MVT::v32i8, ShuffleMask);
178 case X86::PUNPCKHWDrr:
179 Src2Name = getRegName(MI->getOperand(2).getReg());
181 case X86::PUNPCKHWDrm:
182 Src1Name = getRegName(MI->getOperand(0).getReg());
183 DecodeUNPCKHMask(MVT::v8i16, ShuffleMask);
185 case X86::VPUNPCKHWDrr:
186 Src2Name = getRegName(MI->getOperand(2).getReg());
188 case X86::VPUNPCKHWDrm:
189 Src1Name = getRegName(MI->getOperand(1).getReg());
190 DestName = getRegName(MI->getOperand(0).getReg());
191 DecodeUNPCKHMask(MVT::v8i16, ShuffleMask);
193 case X86::VPUNPCKHWDYrr:
194 Src2Name = getRegName(MI->getOperand(2).getReg());
196 case X86::VPUNPCKHWDYrm:
197 Src1Name = getRegName(MI->getOperand(1).getReg());
198 DestName = getRegName(MI->getOperand(0).getReg());
199 DecodeUNPCKHMask(MVT::v16i16, ShuffleMask);
201 case X86::PUNPCKHDQrr:
202 Src2Name = getRegName(MI->getOperand(2).getReg());
204 case X86::PUNPCKHDQrm:
205 Src1Name = getRegName(MI->getOperand(0).getReg());
206 DecodeUNPCKHMask(MVT::v4i32, ShuffleMask);
208 case X86::VPUNPCKHDQrr:
209 Src2Name = getRegName(MI->getOperand(2).getReg());
211 case X86::VPUNPCKHDQrm:
212 Src1Name = getRegName(MI->getOperand(1).getReg());
213 DestName = getRegName(MI->getOperand(0).getReg());
214 DecodeUNPCKHMask(MVT::v4i32, ShuffleMask);
216 case X86::VPUNPCKHDQYrr:
217 Src2Name = getRegName(MI->getOperand(2).getReg());
219 case X86::VPUNPCKHDQYrm:
220 Src1Name = getRegName(MI->getOperand(1).getReg());
221 DestName = getRegName(MI->getOperand(0).getReg());
222 DecodeUNPCKHMask(MVT::v8i32, ShuffleMask);
224 case X86::PUNPCKHQDQrr:
225 Src2Name = getRegName(MI->getOperand(2).getReg());
227 case X86::PUNPCKHQDQrm:
228 Src1Name = getRegName(MI->getOperand(0).getReg());
229 DecodeUNPCKHMask(MVT::v2i64, ShuffleMask);
231 case X86::VPUNPCKHQDQrr:
232 Src2Name = getRegName(MI->getOperand(2).getReg());
234 case X86::VPUNPCKHQDQrm:
235 Src1Name = getRegName(MI->getOperand(1).getReg());
236 DestName = getRegName(MI->getOperand(0).getReg());
237 DecodeUNPCKHMask(MVT::v2i64, ShuffleMask);
239 case X86::VPUNPCKHQDQYrr:
240 Src2Name = getRegName(MI->getOperand(2).getReg());
242 case X86::VPUNPCKHQDQYrm:
243 Src1Name = getRegName(MI->getOperand(1).getReg());
244 DestName = getRegName(MI->getOperand(0).getReg());
245 DecodeUNPCKHMask(MVT::v4i64, ShuffleMask);
248 case X86::PUNPCKLBWrr:
249 Src2Name = getRegName(MI->getOperand(2).getReg());
251 case X86::PUNPCKLBWrm:
252 Src1Name = getRegName(MI->getOperand(0).getReg());
253 DecodeUNPCKLMask(MVT::v16i8, ShuffleMask);
255 case X86::VPUNPCKLBWrr:
256 Src2Name = getRegName(MI->getOperand(2).getReg());
258 case X86::VPUNPCKLBWrm:
259 Src1Name = getRegName(MI->getOperand(1).getReg());
260 DestName = getRegName(MI->getOperand(0).getReg());
261 DecodeUNPCKLMask(MVT::v16i8, ShuffleMask);
263 case X86::VPUNPCKLBWYrr:
264 Src2Name = getRegName(MI->getOperand(2).getReg());
266 case X86::VPUNPCKLBWYrm:
267 Src1Name = getRegName(MI->getOperand(1).getReg());
268 DestName = getRegName(MI->getOperand(0).getReg());
269 DecodeUNPCKLMask(MVT::v32i8, ShuffleMask);
271 case X86::PUNPCKLWDrr:
272 Src2Name = getRegName(MI->getOperand(2).getReg());
274 case X86::PUNPCKLWDrm:
275 Src1Name = getRegName(MI->getOperand(0).getReg());
276 DecodeUNPCKLMask(MVT::v8i16, ShuffleMask);
278 case X86::VPUNPCKLWDrr:
279 Src2Name = getRegName(MI->getOperand(2).getReg());
281 case X86::VPUNPCKLWDrm:
282 Src1Name = getRegName(MI->getOperand(1).getReg());
283 DestName = getRegName(MI->getOperand(0).getReg());
284 DecodeUNPCKLMask(MVT::v8i16, ShuffleMask);
286 case X86::VPUNPCKLWDYrr:
287 Src2Name = getRegName(MI->getOperand(2).getReg());
289 case X86::VPUNPCKLWDYrm:
290 Src1Name = getRegName(MI->getOperand(1).getReg());
291 DestName = getRegName(MI->getOperand(0).getReg());
292 DecodeUNPCKLMask(MVT::v16i16, ShuffleMask);
294 case X86::PUNPCKLDQrr:
295 Src2Name = getRegName(MI->getOperand(2).getReg());
297 case X86::PUNPCKLDQrm:
298 Src1Name = getRegName(MI->getOperand(0).getReg());
299 DecodeUNPCKLMask(MVT::v4i32, ShuffleMask);
301 case X86::VPUNPCKLDQrr:
302 Src2Name = getRegName(MI->getOperand(2).getReg());
304 case X86::VPUNPCKLDQrm:
305 Src1Name = getRegName(MI->getOperand(1).getReg());
306 DestName = getRegName(MI->getOperand(0).getReg());
307 DecodeUNPCKLMask(MVT::v4i32, ShuffleMask);
309 case X86::VPUNPCKLDQYrr:
310 Src2Name = getRegName(MI->getOperand(2).getReg());
312 case X86::VPUNPCKLDQYrm:
313 Src1Name = getRegName(MI->getOperand(1).getReg());
314 DestName = getRegName(MI->getOperand(0).getReg());
315 DecodeUNPCKLMask(MVT::v8i32, ShuffleMask);
317 case X86::PUNPCKLQDQrr:
318 Src2Name = getRegName(MI->getOperand(2).getReg());
320 case X86::PUNPCKLQDQrm:
321 Src1Name = getRegName(MI->getOperand(0).getReg());
322 DecodeUNPCKLMask(MVT::v2i64, ShuffleMask);
324 case X86::VPUNPCKLQDQrr:
325 Src2Name = getRegName(MI->getOperand(2).getReg());
327 case X86::VPUNPCKLQDQrm:
328 Src1Name = getRegName(MI->getOperand(1).getReg());
329 DestName = getRegName(MI->getOperand(0).getReg());
330 DecodeUNPCKLMask(MVT::v2i64, ShuffleMask);
332 case X86::VPUNPCKLQDQYrr:
333 Src2Name = getRegName(MI->getOperand(2).getReg());
335 case X86::VPUNPCKLQDQYrm:
336 Src1Name = getRegName(MI->getOperand(1).getReg());
337 DestName = getRegName(MI->getOperand(0).getReg());
338 DecodeUNPCKLMask(MVT::v4i64, ShuffleMask);
342 Src2Name = getRegName(MI->getOperand(2).getReg());
345 DecodeSHUFPMask(MVT::v2f64, MI->getOperand(MI->getNumOperands()-1).getImm(),
347 Src1Name = getRegName(MI->getOperand(0).getReg());
349 case X86::VSHUFPDrri:
350 Src2Name = getRegName(MI->getOperand(2).getReg());
352 case X86::VSHUFPDrmi:
353 DecodeSHUFPMask(MVT::v2f64, MI->getOperand(MI->getNumOperands()-1).getImm(),
355 Src1Name = getRegName(MI->getOperand(1).getReg());
356 DestName = getRegName(MI->getOperand(0).getReg());
358 case X86::VSHUFPDYrri:
359 Src2Name = getRegName(MI->getOperand(2).getReg());
361 case X86::VSHUFPDYrmi:
362 DecodeSHUFPMask(MVT::v4f64, MI->getOperand(MI->getNumOperands()-1).getImm(),
364 Src1Name = getRegName(MI->getOperand(1).getReg());
365 DestName = getRegName(MI->getOperand(0).getReg());
369 Src2Name = getRegName(MI->getOperand(2).getReg());
372 DecodeSHUFPMask(MVT::v4f32, MI->getOperand(MI->getNumOperands()-1).getImm(),
374 Src1Name = getRegName(MI->getOperand(0).getReg());
376 case X86::VSHUFPSrri:
377 Src2Name = getRegName(MI->getOperand(2).getReg());
379 case X86::VSHUFPSrmi:
380 DecodeSHUFPMask(MVT::v4f32, MI->getOperand(MI->getNumOperands()-1).getImm(),
382 Src1Name = getRegName(MI->getOperand(1).getReg());
383 DestName = getRegName(MI->getOperand(0).getReg());
385 case X86::VSHUFPSYrri:
386 Src2Name = getRegName(MI->getOperand(2).getReg());
388 case X86::VSHUFPSYrmi:
389 DecodeSHUFPMask(MVT::v8f32, MI->getOperand(MI->getNumOperands()-1).getImm(),
391 Src1Name = getRegName(MI->getOperand(1).getReg());
392 DestName = getRegName(MI->getOperand(0).getReg());
395 case X86::UNPCKLPDrr:
396 Src2Name = getRegName(MI->getOperand(2).getReg());
398 case X86::UNPCKLPDrm:
399 DecodeUNPCKLMask(MVT::v2f64, ShuffleMask);
400 Src1Name = getRegName(MI->getOperand(0).getReg());
402 case X86::VUNPCKLPDrr:
403 Src2Name = getRegName(MI->getOperand(2).getReg());
405 case X86::VUNPCKLPDrm:
406 DecodeUNPCKLMask(MVT::v2f64, ShuffleMask);
407 Src1Name = getRegName(MI->getOperand(1).getReg());
408 DestName = getRegName(MI->getOperand(0).getReg());
410 case X86::VUNPCKLPDYrr:
411 Src2Name = getRegName(MI->getOperand(2).getReg());
413 case X86::VUNPCKLPDYrm:
414 DecodeUNPCKLMask(MVT::v4f64, ShuffleMask);
415 Src1Name = getRegName(MI->getOperand(1).getReg());
416 DestName = getRegName(MI->getOperand(0).getReg());
418 case X86::UNPCKLPSrr:
419 Src2Name = getRegName(MI->getOperand(2).getReg());
421 case X86::UNPCKLPSrm:
422 DecodeUNPCKLMask(MVT::v4f32, ShuffleMask);
423 Src1Name = getRegName(MI->getOperand(0).getReg());
425 case X86::VUNPCKLPSrr:
426 Src2Name = getRegName(MI->getOperand(2).getReg());
428 case X86::VUNPCKLPSrm:
429 DecodeUNPCKLMask(MVT::v4f32, ShuffleMask);
430 Src1Name = getRegName(MI->getOperand(1).getReg());
431 DestName = getRegName(MI->getOperand(0).getReg());
433 case X86::VUNPCKLPSYrr:
434 Src2Name = getRegName(MI->getOperand(2).getReg());
436 case X86::VUNPCKLPSYrm:
437 DecodeUNPCKLMask(MVT::v8f32, ShuffleMask);
438 Src1Name = getRegName(MI->getOperand(1).getReg());
439 DestName = getRegName(MI->getOperand(0).getReg());
441 case X86::UNPCKHPDrr:
442 Src2Name = getRegName(MI->getOperand(2).getReg());
444 case X86::UNPCKHPDrm:
445 DecodeUNPCKHMask(MVT::v2f64, ShuffleMask);
446 Src1Name = getRegName(MI->getOperand(0).getReg());
448 case X86::VUNPCKHPDrr:
449 Src2Name = getRegName(MI->getOperand(2).getReg());
451 case X86::VUNPCKHPDrm:
452 DecodeUNPCKHMask(MVT::v2f64, ShuffleMask);
453 Src1Name = getRegName(MI->getOperand(1).getReg());
454 DestName = getRegName(MI->getOperand(0).getReg());
456 case X86::VUNPCKHPDYrr:
457 Src2Name = getRegName(MI->getOperand(2).getReg());
459 case X86::VUNPCKHPDYrm:
460 DecodeUNPCKHMask(MVT::v4f64, ShuffleMask);
461 Src1Name = getRegName(MI->getOperand(1).getReg());
462 DestName = getRegName(MI->getOperand(0).getReg());
464 case X86::UNPCKHPSrr:
465 Src2Name = getRegName(MI->getOperand(2).getReg());
467 case X86::UNPCKHPSrm:
468 DecodeUNPCKHMask(MVT::v4f32, ShuffleMask);
469 Src1Name = getRegName(MI->getOperand(0).getReg());
471 case X86::VUNPCKHPSrr:
472 Src2Name = getRegName(MI->getOperand(2).getReg());
474 case X86::VUNPCKHPSrm:
475 DecodeUNPCKHMask(MVT::v4f32, ShuffleMask);
476 Src1Name = getRegName(MI->getOperand(1).getReg());
477 DestName = getRegName(MI->getOperand(0).getReg());
479 case X86::VUNPCKHPSYrr:
480 Src2Name = getRegName(MI->getOperand(2).getReg());
482 case X86::VUNPCKHPSYrm:
483 DecodeUNPCKHMask(MVT::v8f32, ShuffleMask);
484 Src1Name = getRegName(MI->getOperand(1).getReg());
485 DestName = getRegName(MI->getOperand(0).getReg());
487 case X86::VPERMILPSri:
488 Src1Name = getRegName(MI->getOperand(1).getReg());
490 case X86::VPERMILPSmi:
491 DecodePSHUFMask(MVT::v4f32, MI->getOperand(MI->getNumOperands()-1).getImm(),
493 DestName = getRegName(MI->getOperand(0).getReg());
495 case X86::VPERMILPSYri:
496 Src1Name = getRegName(MI->getOperand(1).getReg());
498 case X86::VPERMILPSYmi:
499 DecodePSHUFMask(MVT::v8f32, MI->getOperand(MI->getNumOperands()-1).getImm(),
501 DestName = getRegName(MI->getOperand(0).getReg());
503 case X86::VPERMILPDri:
504 Src1Name = getRegName(MI->getOperand(1).getReg());
506 case X86::VPERMILPDmi:
507 DecodePSHUFMask(MVT::v2f64, MI->getOperand(MI->getNumOperands()-1).getImm(),
509 DestName = getRegName(MI->getOperand(0).getReg());
511 case X86::VPERMILPDYri:
512 Src1Name = getRegName(MI->getOperand(1).getReg());
514 case X86::VPERMILPDYmi:
515 DecodePSHUFMask(MVT::v4f64, MI->getOperand(MI->getNumOperands()-1).getImm(),
517 DestName = getRegName(MI->getOperand(0).getReg());
519 case X86::VPERM2F128rr:
520 case X86::VPERM2I128rr:
521 Src2Name = getRegName(MI->getOperand(2).getReg());
523 case X86::VPERM2F128rm:
524 case X86::VPERM2I128rm:
525 // For instruction comments purpose, assume the 256-bit vector is v4i64.
526 DecodeVPERM2X128Mask(MVT::v4i64,
527 MI->getOperand(MI->getNumOperands()-1).getImm(),
529 Src1Name = getRegName(MI->getOperand(1).getReg());
530 DestName = getRegName(MI->getOperand(0).getReg());
533 case X86::VPERMPDYri:
534 Src1Name = getRegName(MI->getOperand(1).getReg());
537 case X86::VPERMPDYmi:
538 DecodeVPERMMask(MI->getOperand(MI->getNumOperands()-1).getImm(),
540 DestName = getRegName(MI->getOperand(0).getReg());
545 // If this was a shuffle operation, print the shuffle mask.
546 if (!ShuffleMask.empty()) {
547 if (DestName == 0) DestName = Src1Name;
548 OS << (DestName ? DestName : "mem") << " = ";
550 // If the two sources are the same, canonicalize the input elements to be
551 // from the first src so that we get larger element spans.
552 if (Src1Name == Src2Name) {
553 for (unsigned i = 0, e = ShuffleMask.size(); i != e; ++i) {
554 if ((int)ShuffleMask[i] >= 0 && // Not sentinel.
555 ShuffleMask[i] >= (int)e) // From second mask.
560 // The shuffle mask specifies which elements of the src1/src2 fill in the
561 // destination, with a few sentinel values. Loop through and print them
563 for (unsigned i = 0, e = ShuffleMask.size(); i != e; ++i) {
566 if (ShuffleMask[i] == SM_SentinelZero) {
571 // Otherwise, it must come from src1 or src2. Print the span of elements
572 // that comes from this src.
573 bool isSrc1 = ShuffleMask[i] < (int)ShuffleMask.size();
574 const char *SrcName = isSrc1 ? Src1Name : Src2Name;
575 OS << (SrcName ? SrcName : "mem") << '[';
578 (int)ShuffleMask[i] >= 0 &&
579 (ShuffleMask[i] < (int)ShuffleMask.size()) == isSrc1) {
584 OS << ShuffleMask[i] % ShuffleMask.size();
588 --i; // For loop increments element #.