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/CodeGen/MachineValueType.h"
20 #include "llvm/Support/raw_ostream.h"
24 //===----------------------------------------------------------------------===//
25 // Top Level Entrypoint
26 //===----------------------------------------------------------------------===//
28 /// EmitAnyX86InstComments - This function decodes x86 instructions and prints
29 /// newline terminated strings to the specified string if desired. This
30 /// information is shown in disassembly dumps when verbose assembly is enabled.
31 void llvm::EmitAnyX86InstComments(const MCInst *MI, raw_ostream &OS,
32 const char *(*getRegName)(unsigned)) {
33 // If this is a shuffle operation, the switch should fill in this state.
34 SmallVector<int, 8> ShuffleMask;
35 const char *DestName = nullptr, *Src1Name = nullptr, *Src2Name = nullptr;
37 switch (MI->getOpcode()) {
39 case X86::VBLENDPDrri:
40 Src2Name = getRegName(MI->getOperand(2).getReg());
43 case X86::VBLENDPDrmi:
44 if(MI->getOperand(MI->getNumOperands()-1).isImm())
45 DecodeBLENDMask(MVT::v2f64,
46 MI->getOperand(MI->getNumOperands()-1).getImm(),
48 Src1Name = getRegName(MI->getOperand(1).getReg());
49 DestName = getRegName(MI->getOperand(0).getReg());
51 case X86::VBLENDPDYrri:
52 Src2Name = getRegName(MI->getOperand(2).getReg());
54 case X86::VBLENDPDYrmi:
55 if(MI->getOperand(MI->getNumOperands()-1).isImm())
56 DecodeBLENDMask(MVT::v4f64,
57 MI->getOperand(MI->getNumOperands()-1).getImm(),
59 Src1Name = getRegName(MI->getOperand(1).getReg());
60 DestName = getRegName(MI->getOperand(0).getReg());
64 case X86::VBLENDPSrri:
65 Src2Name = getRegName(MI->getOperand(2).getReg());
68 case X86::VBLENDPSrmi:
69 if(MI->getOperand(MI->getNumOperands()-1).isImm())
70 DecodeBLENDMask(MVT::v4f32,
71 MI->getOperand(MI->getNumOperands()-1).getImm(),
73 Src1Name = getRegName(MI->getOperand(1).getReg());
74 DestName = getRegName(MI->getOperand(0).getReg());
76 case X86::VBLENDPSYrri:
77 Src2Name = getRegName(MI->getOperand(2).getReg());
79 case X86::VBLENDPSYrmi:
80 if(MI->getOperand(MI->getNumOperands()-1).isImm())
81 DecodeBLENDMask(MVT::v8f32,
82 MI->getOperand(MI->getNumOperands()-1).getImm(),
84 Src1Name = getRegName(MI->getOperand(1).getReg());
85 DestName = getRegName(MI->getOperand(0).getReg());
89 case X86::VPBLENDWrri:
90 Src2Name = getRegName(MI->getOperand(2).getReg());
93 case X86::VPBLENDWrmi:
94 if(MI->getOperand(MI->getNumOperands()-1).isImm())
95 DecodeBLENDMask(MVT::v8i16,
96 MI->getOperand(MI->getNumOperands()-1).getImm(),
98 Src1Name = getRegName(MI->getOperand(1).getReg());
99 DestName = getRegName(MI->getOperand(0).getReg());
102 case X86::INSERTPSrr:
103 case X86::VINSERTPSrr:
104 DestName = getRegName(MI->getOperand(0).getReg());
105 Src1Name = getRegName(MI->getOperand(1).getReg());
106 Src2Name = getRegName(MI->getOperand(2).getReg());
107 if(MI->getOperand(3).isImm())
108 DecodeINSERTPSMask(MI->getOperand(3).getImm(), ShuffleMask);
112 case X86::VMOVLHPSrr:
113 Src2Name = getRegName(MI->getOperand(2).getReg());
114 Src1Name = getRegName(MI->getOperand(1).getReg());
115 DestName = getRegName(MI->getOperand(0).getReg());
116 DecodeMOVLHPSMask(2, ShuffleMask);
120 case X86::VMOVHLPSrr:
121 Src2Name = getRegName(MI->getOperand(2).getReg());
122 Src1Name = getRegName(MI->getOperand(1).getReg());
123 DestName = getRegName(MI->getOperand(0).getReg());
124 DecodeMOVHLPSMask(2, ShuffleMask);
127 case X86::PALIGNR128rr:
128 case X86::VPALIGNR128rr:
129 Src1Name = getRegName(MI->getOperand(2).getReg());
131 case X86::PALIGNR128rm:
132 case X86::VPALIGNR128rm:
133 Src2Name = getRegName(MI->getOperand(1).getReg());
134 DestName = getRegName(MI->getOperand(0).getReg());
135 if(MI->getOperand(MI->getNumOperands()-1).isImm())
136 DecodePALIGNRMask(MVT::v16i8,
137 MI->getOperand(MI->getNumOperands()-1).getImm(),
140 case X86::VPALIGNR256rr:
141 Src1Name = getRegName(MI->getOperand(2).getReg());
143 case X86::VPALIGNR256rm:
144 Src2Name = getRegName(MI->getOperand(1).getReg());
145 DestName = getRegName(MI->getOperand(0).getReg());
146 if(MI->getOperand(MI->getNumOperands()-1).isImm())
147 DecodePALIGNRMask(MVT::v32i8,
148 MI->getOperand(MI->getNumOperands()-1).getImm(),
154 Src1Name = getRegName(MI->getOperand(1).getReg());
158 DestName = getRegName(MI->getOperand(0).getReg());
159 if(MI->getOperand(MI->getNumOperands()-1).isImm())
160 DecodePSHUFMask(MVT::v4i32,
161 MI->getOperand(MI->getNumOperands()-1).getImm(),
164 case X86::VPSHUFDYri:
165 Src1Name = getRegName(MI->getOperand(1).getReg());
167 case X86::VPSHUFDYmi:
168 DestName = getRegName(MI->getOperand(0).getReg());
169 if(MI->getOperand(MI->getNumOperands()-1).isImm())
170 DecodePSHUFMask(MVT::v8i32,
171 MI->getOperand(MI->getNumOperands()-1).getImm(),
177 case X86::VPSHUFHWri:
178 Src1Name = getRegName(MI->getOperand(1).getReg());
181 case X86::VPSHUFHWmi:
182 DestName = getRegName(MI->getOperand(0).getReg());
183 if(MI->getOperand(MI->getNumOperands()-1).isImm())
184 DecodePSHUFHWMask(MVT::v8i16,
185 MI->getOperand(MI->getNumOperands()-1).getImm(),
188 case X86::VPSHUFHWYri:
189 Src1Name = getRegName(MI->getOperand(1).getReg());
191 case X86::VPSHUFHWYmi:
192 DestName = getRegName(MI->getOperand(0).getReg());
193 if(MI->getOperand(MI->getNumOperands()-1).isImm())
194 DecodePSHUFHWMask(MVT::v16i16,
195 MI->getOperand(MI->getNumOperands()-1).getImm(),
199 case X86::VPSHUFLWri:
200 Src1Name = getRegName(MI->getOperand(1).getReg());
203 case X86::VPSHUFLWmi:
204 DestName = getRegName(MI->getOperand(0).getReg());
205 if(MI->getOperand(MI->getNumOperands()-1).isImm())
206 DecodePSHUFLWMask(MVT::v8i16,
207 MI->getOperand(MI->getNumOperands()-1).getImm(),
210 case X86::VPSHUFLWYri:
211 Src1Name = getRegName(MI->getOperand(1).getReg());
213 case X86::VPSHUFLWYmi:
214 DestName = getRegName(MI->getOperand(0).getReg());
215 if(MI->getOperand(MI->getNumOperands()-1).isImm())
216 DecodePSHUFLWMask(MVT::v16i16,
217 MI->getOperand(MI->getNumOperands()-1).getImm(),
221 case X86::PUNPCKHBWrr:
222 case X86::VPUNPCKHBWrr:
223 Src2Name = getRegName(MI->getOperand(2).getReg());
225 case X86::PUNPCKHBWrm:
226 case X86::VPUNPCKHBWrm:
227 Src1Name = getRegName(MI->getOperand(1).getReg());
228 DestName = getRegName(MI->getOperand(0).getReg());
229 DecodeUNPCKHMask(MVT::v16i8, ShuffleMask);
231 case X86::VPUNPCKHBWYrr:
232 Src2Name = getRegName(MI->getOperand(2).getReg());
234 case X86::VPUNPCKHBWYrm:
235 Src1Name = getRegName(MI->getOperand(1).getReg());
236 DestName = getRegName(MI->getOperand(0).getReg());
237 DecodeUNPCKHMask(MVT::v32i8, ShuffleMask);
239 case X86::PUNPCKHWDrr:
240 case X86::VPUNPCKHWDrr:
241 Src2Name = getRegName(MI->getOperand(2).getReg());
243 case X86::PUNPCKHWDrm:
244 case X86::VPUNPCKHWDrm:
245 Src1Name = getRegName(MI->getOperand(1).getReg());
246 DestName = getRegName(MI->getOperand(0).getReg());
247 DecodeUNPCKHMask(MVT::v8i16, ShuffleMask);
249 case X86::VPUNPCKHWDYrr:
250 Src2Name = getRegName(MI->getOperand(2).getReg());
252 case X86::VPUNPCKHWDYrm:
253 Src1Name = getRegName(MI->getOperand(1).getReg());
254 DestName = getRegName(MI->getOperand(0).getReg());
255 DecodeUNPCKHMask(MVT::v16i16, ShuffleMask);
257 case X86::PUNPCKHDQrr:
258 case X86::VPUNPCKHDQrr:
259 Src2Name = getRegName(MI->getOperand(2).getReg());
261 case X86::PUNPCKHDQrm:
262 case X86::VPUNPCKHDQrm:
263 Src1Name = getRegName(MI->getOperand(1).getReg());
264 DestName = getRegName(MI->getOperand(0).getReg());
265 DecodeUNPCKHMask(MVT::v4i32, ShuffleMask);
267 case X86::VPUNPCKHDQYrr:
268 Src2Name = getRegName(MI->getOperand(2).getReg());
270 case X86::VPUNPCKHDQYrm:
271 Src1Name = getRegName(MI->getOperand(1).getReg());
272 DestName = getRegName(MI->getOperand(0).getReg());
273 DecodeUNPCKHMask(MVT::v8i32, ShuffleMask);
275 case X86::PUNPCKHQDQrr:
276 case X86::VPUNPCKHQDQrr:
277 Src2Name = getRegName(MI->getOperand(2).getReg());
279 case X86::PUNPCKHQDQrm:
280 case X86::VPUNPCKHQDQrm:
281 Src1Name = getRegName(MI->getOperand(1).getReg());
282 DestName = getRegName(MI->getOperand(0).getReg());
283 DecodeUNPCKHMask(MVT::v2i64, ShuffleMask);
285 case X86::VPUNPCKHQDQYrr:
286 Src2Name = getRegName(MI->getOperand(2).getReg());
288 case X86::VPUNPCKHQDQYrm:
289 Src1Name = getRegName(MI->getOperand(1).getReg());
290 DestName = getRegName(MI->getOperand(0).getReg());
291 DecodeUNPCKHMask(MVT::v4i64, ShuffleMask);
294 case X86::PUNPCKLBWrr:
295 case X86::VPUNPCKLBWrr:
296 Src2Name = getRegName(MI->getOperand(2).getReg());
298 case X86::PUNPCKLBWrm:
299 case X86::VPUNPCKLBWrm:
300 Src1Name = getRegName(MI->getOperand(1).getReg());
301 DestName = getRegName(MI->getOperand(0).getReg());
302 DecodeUNPCKLMask(MVT::v16i8, ShuffleMask);
304 case X86::VPUNPCKLBWYrr:
305 Src2Name = getRegName(MI->getOperand(2).getReg());
307 case X86::VPUNPCKLBWYrm:
308 Src1Name = getRegName(MI->getOperand(1).getReg());
309 DestName = getRegName(MI->getOperand(0).getReg());
310 DecodeUNPCKLMask(MVT::v32i8, ShuffleMask);
312 case X86::PUNPCKLWDrr:
313 case X86::VPUNPCKLWDrr:
314 Src2Name = getRegName(MI->getOperand(2).getReg());
316 case X86::PUNPCKLWDrm:
317 case X86::VPUNPCKLWDrm:
318 Src1Name = getRegName(MI->getOperand(1).getReg());
319 DestName = getRegName(MI->getOperand(0).getReg());
320 DecodeUNPCKLMask(MVT::v8i16, ShuffleMask);
322 case X86::VPUNPCKLWDYrr:
323 Src2Name = getRegName(MI->getOperand(2).getReg());
325 case X86::VPUNPCKLWDYrm:
326 Src1Name = getRegName(MI->getOperand(1).getReg());
327 DestName = getRegName(MI->getOperand(0).getReg());
328 DecodeUNPCKLMask(MVT::v16i16, ShuffleMask);
330 case X86::PUNPCKLDQrr:
331 case X86::VPUNPCKLDQrr:
332 Src2Name = getRegName(MI->getOperand(2).getReg());
334 case X86::PUNPCKLDQrm:
335 case X86::VPUNPCKLDQrm:
336 Src1Name = getRegName(MI->getOperand(1).getReg());
337 DestName = getRegName(MI->getOperand(0).getReg());
338 DecodeUNPCKLMask(MVT::v4i32, ShuffleMask);
340 case X86::VPUNPCKLDQYrr:
341 Src2Name = getRegName(MI->getOperand(2).getReg());
343 case X86::VPUNPCKLDQYrm:
344 Src1Name = getRegName(MI->getOperand(1).getReg());
345 DestName = getRegName(MI->getOperand(0).getReg());
346 DecodeUNPCKLMask(MVT::v8i32, ShuffleMask);
348 case X86::PUNPCKLQDQrr:
349 case X86::VPUNPCKLQDQrr:
350 Src2Name = getRegName(MI->getOperand(2).getReg());
352 case X86::PUNPCKLQDQrm:
353 case X86::VPUNPCKLQDQrm:
354 Src1Name = getRegName(MI->getOperand(1).getReg());
355 DestName = getRegName(MI->getOperand(0).getReg());
356 DecodeUNPCKLMask(MVT::v2i64, ShuffleMask);
358 case X86::VPUNPCKLQDQYrr:
359 Src2Name = getRegName(MI->getOperand(2).getReg());
361 case X86::VPUNPCKLQDQYrm:
362 Src1Name = getRegName(MI->getOperand(1).getReg());
363 DestName = getRegName(MI->getOperand(0).getReg());
364 DecodeUNPCKLMask(MVT::v4i64, ShuffleMask);
368 case X86::VSHUFPDrri:
369 Src2Name = getRegName(MI->getOperand(2).getReg());
372 case X86::VSHUFPDrmi:
373 if(MI->getOperand(MI->getNumOperands()-1).isImm())
374 DecodeSHUFPMask(MVT::v2f64,
375 MI->getOperand(MI->getNumOperands()-1).getImm(),
377 Src1Name = getRegName(MI->getOperand(1).getReg());
378 DestName = getRegName(MI->getOperand(0).getReg());
380 case X86::VSHUFPDYrri:
381 Src2Name = getRegName(MI->getOperand(2).getReg());
383 case X86::VSHUFPDYrmi:
384 if(MI->getOperand(MI->getNumOperands()-1).isImm())
385 DecodeSHUFPMask(MVT::v4f64,
386 MI->getOperand(MI->getNumOperands()-1).getImm(),
388 Src1Name = getRegName(MI->getOperand(1).getReg());
389 DestName = getRegName(MI->getOperand(0).getReg());
393 case X86::VSHUFPSrri:
394 Src2Name = getRegName(MI->getOperand(2).getReg());
397 case X86::VSHUFPSrmi:
398 if(MI->getOperand(MI->getNumOperands()-1).isImm())
399 DecodeSHUFPMask(MVT::v4f32,
400 MI->getOperand(MI->getNumOperands()-1).getImm(),
402 Src1Name = getRegName(MI->getOperand(1).getReg());
403 DestName = getRegName(MI->getOperand(0).getReg());
405 case X86::VSHUFPSYrri:
406 Src2Name = getRegName(MI->getOperand(2).getReg());
408 case X86::VSHUFPSYrmi:
409 if(MI->getOperand(MI->getNumOperands()-1).isImm())
410 DecodeSHUFPMask(MVT::v8f32,
411 MI->getOperand(MI->getNumOperands()-1).getImm(),
413 Src1Name = getRegName(MI->getOperand(1).getReg());
414 DestName = getRegName(MI->getOperand(0).getReg());
417 case X86::UNPCKLPDrr:
418 case X86::VUNPCKLPDrr:
419 Src2Name = getRegName(MI->getOperand(2).getReg());
421 case X86::UNPCKLPDrm:
422 case X86::VUNPCKLPDrm:
423 DecodeUNPCKLMask(MVT::v2f64, ShuffleMask);
424 Src1Name = getRegName(MI->getOperand(1).getReg());
425 DestName = getRegName(MI->getOperand(0).getReg());
427 case X86::VUNPCKLPDYrr:
428 Src2Name = getRegName(MI->getOperand(2).getReg());
430 case X86::VUNPCKLPDYrm:
431 DecodeUNPCKLMask(MVT::v4f64, ShuffleMask);
432 Src1Name = getRegName(MI->getOperand(1).getReg());
433 DestName = getRegName(MI->getOperand(0).getReg());
435 case X86::UNPCKLPSrr:
436 case X86::VUNPCKLPSrr:
437 Src2Name = getRegName(MI->getOperand(2).getReg());
439 case X86::UNPCKLPSrm:
440 case X86::VUNPCKLPSrm:
441 DecodeUNPCKLMask(MVT::v4f32, ShuffleMask);
442 Src1Name = getRegName(MI->getOperand(1).getReg());
443 DestName = getRegName(MI->getOperand(0).getReg());
445 case X86::VUNPCKLPSYrr:
446 Src2Name = getRegName(MI->getOperand(2).getReg());
448 case X86::VUNPCKLPSYrm:
449 DecodeUNPCKLMask(MVT::v8f32, ShuffleMask);
450 Src1Name = getRegName(MI->getOperand(1).getReg());
451 DestName = getRegName(MI->getOperand(0).getReg());
453 case X86::UNPCKHPDrr:
454 case X86::VUNPCKHPDrr:
455 Src2Name = getRegName(MI->getOperand(2).getReg());
457 case X86::UNPCKHPDrm:
458 case X86::VUNPCKHPDrm:
459 DecodeUNPCKHMask(MVT::v2f64, ShuffleMask);
460 Src1Name = getRegName(MI->getOperand(1).getReg());
461 DestName = getRegName(MI->getOperand(0).getReg());
463 case X86::VUNPCKHPDYrr:
464 Src2Name = getRegName(MI->getOperand(2).getReg());
466 case X86::VUNPCKHPDYrm:
467 DecodeUNPCKHMask(MVT::v4f64, ShuffleMask);
468 Src1Name = getRegName(MI->getOperand(1).getReg());
469 DestName = getRegName(MI->getOperand(0).getReg());
471 case X86::UNPCKHPSrr:
472 case X86::VUNPCKHPSrr:
473 Src2Name = getRegName(MI->getOperand(2).getReg());
475 case X86::UNPCKHPSrm:
476 case X86::VUNPCKHPSrm:
477 DecodeUNPCKHMask(MVT::v4f32, ShuffleMask);
478 Src1Name = getRegName(MI->getOperand(1).getReg());
479 DestName = getRegName(MI->getOperand(0).getReg());
481 case X86::VUNPCKHPSYrr:
482 Src2Name = getRegName(MI->getOperand(2).getReg());
484 case X86::VUNPCKHPSYrm:
485 DecodeUNPCKHMask(MVT::v8f32, ShuffleMask);
486 Src1Name = getRegName(MI->getOperand(1).getReg());
487 DestName = getRegName(MI->getOperand(0).getReg());
489 case X86::VPERMILPSri:
490 Src1Name = getRegName(MI->getOperand(1).getReg());
492 case X86::VPERMILPSmi:
493 if(MI->getOperand(MI->getNumOperands()-1).isImm())
494 DecodePSHUFMask(MVT::v4f32,
495 MI->getOperand(MI->getNumOperands()-1).getImm(),
497 DestName = getRegName(MI->getOperand(0).getReg());
499 case X86::VPERMILPSYri:
500 Src1Name = getRegName(MI->getOperand(1).getReg());
502 case X86::VPERMILPSYmi:
503 if(MI->getOperand(MI->getNumOperands()-1).isImm())
504 DecodePSHUFMask(MVT::v8f32,
505 MI->getOperand(MI->getNumOperands()-1).getImm(),
507 DestName = getRegName(MI->getOperand(0).getReg());
509 case X86::VPERMILPDri:
510 Src1Name = getRegName(MI->getOperand(1).getReg());
512 case X86::VPERMILPDmi:
513 if(MI->getOperand(MI->getNumOperands()-1).isImm())
514 DecodePSHUFMask(MVT::v2f64,
515 MI->getOperand(MI->getNumOperands()-1).getImm(),
517 DestName = getRegName(MI->getOperand(0).getReg());
519 case X86::VPERMILPDYri:
520 Src1Name = getRegName(MI->getOperand(1).getReg());
522 case X86::VPERMILPDYmi:
523 if(MI->getOperand(MI->getNumOperands()-1).isImm())
524 DecodePSHUFMask(MVT::v4f64,
525 MI->getOperand(MI->getNumOperands()-1).getImm(),
527 DestName = getRegName(MI->getOperand(0).getReg());
529 case X86::VPERM2F128rr:
530 case X86::VPERM2I128rr:
531 Src2Name = getRegName(MI->getOperand(2).getReg());
533 case X86::VPERM2F128rm:
534 case X86::VPERM2I128rm:
535 // For instruction comments purpose, assume the 256-bit vector is v4i64.
536 if(MI->getOperand(MI->getNumOperands()-1).isImm())
537 DecodeVPERM2X128Mask(MVT::v4i64,
538 MI->getOperand(MI->getNumOperands()-1).getImm(),
540 Src1Name = getRegName(MI->getOperand(1).getReg());
541 DestName = getRegName(MI->getOperand(0).getReg());
544 case X86::VPERMPDYri:
545 Src1Name = getRegName(MI->getOperand(1).getReg());
548 case X86::VPERMPDYmi:
549 if(MI->getOperand(MI->getNumOperands()-1).isImm())
550 DecodeVPERMMask(MI->getOperand(MI->getNumOperands()-1).getImm(),
552 DestName = getRegName(MI->getOperand(0).getReg());
557 // If this was a shuffle operation, print the shuffle mask.
558 if (!ShuffleMask.empty()) {
559 if (!DestName) DestName = Src1Name;
560 OS << (DestName ? DestName : "mem") << " = ";
562 // If the two sources are the same, canonicalize the input elements to be
563 // from the first src so that we get larger element spans.
564 if (Src1Name == Src2Name) {
565 for (unsigned i = 0, e = ShuffleMask.size(); i != e; ++i) {
566 if ((int)ShuffleMask[i] >= 0 && // Not sentinel.
567 ShuffleMask[i] >= (int)e) // From second mask.
572 // The shuffle mask specifies which elements of the src1/src2 fill in the
573 // destination, with a few sentinel values. Loop through and print them
575 for (unsigned i = 0, e = ShuffleMask.size(); i != e; ++i) {
578 if (ShuffleMask[i] == SM_SentinelZero) {
583 // Otherwise, it must come from src1 or src2. Print the span of elements
584 // that comes from this src.
585 bool isSrc1 = ShuffleMask[i] < (int)ShuffleMask.size();
586 const char *SrcName = isSrc1 ? Src1Name : Src2Name;
587 OS << (SrcName ? SrcName : "mem") << '[';
590 (int)ShuffleMask[i] >= 0 &&
591 (ShuffleMask[i] < (int)ShuffleMask.size()) == isSrc1) {
596 OS << ShuffleMask[i] % ShuffleMask.size();
600 --i; // For loop increments element #.