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 bool 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 // Not an instruction for which we can decode comments.
43 case X86::VBLENDPDrri:
44 Src2Name = getRegName(MI->getOperand(2).getReg());
47 case X86::VBLENDPDrmi:
48 if(MI->getOperand(MI->getNumOperands()-1).isImm())
49 DecodeBLENDMask(MVT::v2f64,
50 MI->getOperand(MI->getNumOperands()-1).getImm(),
52 Src1Name = getRegName(MI->getOperand(1).getReg());
53 DestName = getRegName(MI->getOperand(0).getReg());
55 case X86::VBLENDPDYrri:
56 Src2Name = getRegName(MI->getOperand(2).getReg());
58 case X86::VBLENDPDYrmi:
59 if(MI->getOperand(MI->getNumOperands()-1).isImm())
60 DecodeBLENDMask(MVT::v4f64,
61 MI->getOperand(MI->getNumOperands()-1).getImm(),
63 Src1Name = getRegName(MI->getOperand(1).getReg());
64 DestName = getRegName(MI->getOperand(0).getReg());
68 case X86::VBLENDPSrri:
69 Src2Name = getRegName(MI->getOperand(2).getReg());
72 case X86::VBLENDPSrmi:
73 if(MI->getOperand(MI->getNumOperands()-1).isImm())
74 DecodeBLENDMask(MVT::v4f32,
75 MI->getOperand(MI->getNumOperands()-1).getImm(),
77 Src1Name = getRegName(MI->getOperand(1).getReg());
78 DestName = getRegName(MI->getOperand(0).getReg());
80 case X86::VBLENDPSYrri:
81 Src2Name = getRegName(MI->getOperand(2).getReg());
83 case X86::VBLENDPSYrmi:
84 if(MI->getOperand(MI->getNumOperands()-1).isImm())
85 DecodeBLENDMask(MVT::v8f32,
86 MI->getOperand(MI->getNumOperands()-1).getImm(),
88 Src1Name = getRegName(MI->getOperand(1).getReg());
89 DestName = getRegName(MI->getOperand(0).getReg());
93 case X86::VPBLENDWrri:
94 Src2Name = getRegName(MI->getOperand(2).getReg());
97 case X86::VPBLENDWrmi:
98 if(MI->getOperand(MI->getNumOperands()-1).isImm())
99 DecodeBLENDMask(MVT::v8i16,
100 MI->getOperand(MI->getNumOperands()-1).getImm(),
102 Src1Name = getRegName(MI->getOperand(1).getReg());
103 DestName = getRegName(MI->getOperand(0).getReg());
106 case X86::INSERTPSrr:
107 case X86::VINSERTPSrr:
108 DestName = getRegName(MI->getOperand(0).getReg());
109 Src1Name = getRegName(MI->getOperand(1).getReg());
110 Src2Name = getRegName(MI->getOperand(2).getReg());
111 if(MI->getOperand(3).isImm())
112 DecodeINSERTPSMask(MI->getOperand(3).getImm(), ShuffleMask);
116 case X86::VMOVLHPSrr:
117 Src2Name = getRegName(MI->getOperand(2).getReg());
118 Src1Name = getRegName(MI->getOperand(1).getReg());
119 DestName = getRegName(MI->getOperand(0).getReg());
120 DecodeMOVLHPSMask(2, ShuffleMask);
124 case X86::VMOVHLPSrr:
125 Src2Name = getRegName(MI->getOperand(2).getReg());
126 Src1Name = getRegName(MI->getOperand(1).getReg());
127 DestName = getRegName(MI->getOperand(0).getReg());
128 DecodeMOVHLPSMask(2, ShuffleMask);
131 case X86::PALIGNR128rr:
132 case X86::VPALIGNR128rr:
133 Src1Name = getRegName(MI->getOperand(2).getReg());
135 case X86::PALIGNR128rm:
136 case X86::VPALIGNR128rm:
137 Src2Name = getRegName(MI->getOperand(1).getReg());
138 DestName = getRegName(MI->getOperand(0).getReg());
139 if(MI->getOperand(MI->getNumOperands()-1).isImm())
140 DecodePALIGNRMask(MVT::v16i8,
141 MI->getOperand(MI->getNumOperands()-1).getImm(),
144 case X86::VPALIGNR256rr:
145 Src1Name = getRegName(MI->getOperand(2).getReg());
147 case X86::VPALIGNR256rm:
148 Src2Name = getRegName(MI->getOperand(1).getReg());
149 DestName = getRegName(MI->getOperand(0).getReg());
150 if(MI->getOperand(MI->getNumOperands()-1).isImm())
151 DecodePALIGNRMask(MVT::v32i8,
152 MI->getOperand(MI->getNumOperands()-1).getImm(),
158 Src1Name = getRegName(MI->getOperand(1).getReg());
162 DestName = getRegName(MI->getOperand(0).getReg());
163 if(MI->getOperand(MI->getNumOperands()-1).isImm())
164 DecodePSHUFMask(MVT::v4i32,
165 MI->getOperand(MI->getNumOperands()-1).getImm(),
168 case X86::VPSHUFDYri:
169 Src1Name = getRegName(MI->getOperand(1).getReg());
171 case X86::VPSHUFDYmi:
172 DestName = getRegName(MI->getOperand(0).getReg());
173 if(MI->getOperand(MI->getNumOperands()-1).isImm())
174 DecodePSHUFMask(MVT::v8i32,
175 MI->getOperand(MI->getNumOperands()-1).getImm(),
181 case X86::VPSHUFHWri:
182 Src1Name = getRegName(MI->getOperand(1).getReg());
185 case X86::VPSHUFHWmi:
186 DestName = getRegName(MI->getOperand(0).getReg());
187 if(MI->getOperand(MI->getNumOperands()-1).isImm())
188 DecodePSHUFHWMask(MVT::v8i16,
189 MI->getOperand(MI->getNumOperands()-1).getImm(),
192 case X86::VPSHUFHWYri:
193 Src1Name = getRegName(MI->getOperand(1).getReg());
195 case X86::VPSHUFHWYmi:
196 DestName = getRegName(MI->getOperand(0).getReg());
197 if(MI->getOperand(MI->getNumOperands()-1).isImm())
198 DecodePSHUFHWMask(MVT::v16i16,
199 MI->getOperand(MI->getNumOperands()-1).getImm(),
203 case X86::VPSHUFLWri:
204 Src1Name = getRegName(MI->getOperand(1).getReg());
207 case X86::VPSHUFLWmi:
208 DestName = getRegName(MI->getOperand(0).getReg());
209 if(MI->getOperand(MI->getNumOperands()-1).isImm())
210 DecodePSHUFLWMask(MVT::v8i16,
211 MI->getOperand(MI->getNumOperands()-1).getImm(),
214 case X86::VPSHUFLWYri:
215 Src1Name = getRegName(MI->getOperand(1).getReg());
217 case X86::VPSHUFLWYmi:
218 DestName = getRegName(MI->getOperand(0).getReg());
219 if(MI->getOperand(MI->getNumOperands()-1).isImm())
220 DecodePSHUFLWMask(MVT::v16i16,
221 MI->getOperand(MI->getNumOperands()-1).getImm(),
225 case X86::PUNPCKHBWrr:
226 case X86::VPUNPCKHBWrr:
227 Src2Name = getRegName(MI->getOperand(2).getReg());
229 case X86::PUNPCKHBWrm:
230 case X86::VPUNPCKHBWrm:
231 Src1Name = getRegName(MI->getOperand(1).getReg());
232 DestName = getRegName(MI->getOperand(0).getReg());
233 DecodeUNPCKHMask(MVT::v16i8, ShuffleMask);
235 case X86::VPUNPCKHBWYrr:
236 Src2Name = getRegName(MI->getOperand(2).getReg());
238 case X86::VPUNPCKHBWYrm:
239 Src1Name = getRegName(MI->getOperand(1).getReg());
240 DestName = getRegName(MI->getOperand(0).getReg());
241 DecodeUNPCKHMask(MVT::v32i8, ShuffleMask);
243 case X86::PUNPCKHWDrr:
244 case X86::VPUNPCKHWDrr:
245 Src2Name = getRegName(MI->getOperand(2).getReg());
247 case X86::PUNPCKHWDrm:
248 case X86::VPUNPCKHWDrm:
249 Src1Name = getRegName(MI->getOperand(1).getReg());
250 DestName = getRegName(MI->getOperand(0).getReg());
251 DecodeUNPCKHMask(MVT::v8i16, ShuffleMask);
253 case X86::VPUNPCKHWDYrr:
254 Src2Name = getRegName(MI->getOperand(2).getReg());
256 case X86::VPUNPCKHWDYrm:
257 Src1Name = getRegName(MI->getOperand(1).getReg());
258 DestName = getRegName(MI->getOperand(0).getReg());
259 DecodeUNPCKHMask(MVT::v16i16, ShuffleMask);
261 case X86::PUNPCKHDQrr:
262 case X86::VPUNPCKHDQrr:
263 Src2Name = getRegName(MI->getOperand(2).getReg());
265 case X86::PUNPCKHDQrm:
266 case X86::VPUNPCKHDQrm:
267 Src1Name = getRegName(MI->getOperand(1).getReg());
268 DestName = getRegName(MI->getOperand(0).getReg());
269 DecodeUNPCKHMask(MVT::v4i32, ShuffleMask);
271 case X86::VPUNPCKHDQYrr:
272 Src2Name = getRegName(MI->getOperand(2).getReg());
274 case X86::VPUNPCKHDQYrm:
275 Src1Name = getRegName(MI->getOperand(1).getReg());
276 DestName = getRegName(MI->getOperand(0).getReg());
277 DecodeUNPCKHMask(MVT::v8i32, ShuffleMask);
279 case X86::PUNPCKHQDQrr:
280 case X86::VPUNPCKHQDQrr:
281 Src2Name = getRegName(MI->getOperand(2).getReg());
283 case X86::PUNPCKHQDQrm:
284 case X86::VPUNPCKHQDQrm:
285 Src1Name = getRegName(MI->getOperand(1).getReg());
286 DestName = getRegName(MI->getOperand(0).getReg());
287 DecodeUNPCKHMask(MVT::v2i64, ShuffleMask);
289 case X86::VPUNPCKHQDQYrr:
290 Src2Name = getRegName(MI->getOperand(2).getReg());
292 case X86::VPUNPCKHQDQYrm:
293 Src1Name = getRegName(MI->getOperand(1).getReg());
294 DestName = getRegName(MI->getOperand(0).getReg());
295 DecodeUNPCKHMask(MVT::v4i64, ShuffleMask);
298 case X86::PUNPCKLBWrr:
299 case X86::VPUNPCKLBWrr:
300 Src2Name = getRegName(MI->getOperand(2).getReg());
302 case X86::PUNPCKLBWrm:
303 case X86::VPUNPCKLBWrm:
304 Src1Name = getRegName(MI->getOperand(1).getReg());
305 DestName = getRegName(MI->getOperand(0).getReg());
306 DecodeUNPCKLMask(MVT::v16i8, ShuffleMask);
308 case X86::VPUNPCKLBWYrr:
309 Src2Name = getRegName(MI->getOperand(2).getReg());
311 case X86::VPUNPCKLBWYrm:
312 Src1Name = getRegName(MI->getOperand(1).getReg());
313 DestName = getRegName(MI->getOperand(0).getReg());
314 DecodeUNPCKLMask(MVT::v32i8, ShuffleMask);
316 case X86::PUNPCKLWDrr:
317 case X86::VPUNPCKLWDrr:
318 Src2Name = getRegName(MI->getOperand(2).getReg());
320 case X86::PUNPCKLWDrm:
321 case X86::VPUNPCKLWDrm:
322 Src1Name = getRegName(MI->getOperand(1).getReg());
323 DestName = getRegName(MI->getOperand(0).getReg());
324 DecodeUNPCKLMask(MVT::v8i16, ShuffleMask);
326 case X86::VPUNPCKLWDYrr:
327 Src2Name = getRegName(MI->getOperand(2).getReg());
329 case X86::VPUNPCKLWDYrm:
330 Src1Name = getRegName(MI->getOperand(1).getReg());
331 DestName = getRegName(MI->getOperand(0).getReg());
332 DecodeUNPCKLMask(MVT::v16i16, ShuffleMask);
334 case X86::PUNPCKLDQrr:
335 case X86::VPUNPCKLDQrr:
336 Src2Name = getRegName(MI->getOperand(2).getReg());
338 case X86::PUNPCKLDQrm:
339 case X86::VPUNPCKLDQrm:
340 Src1Name = getRegName(MI->getOperand(1).getReg());
341 DestName = getRegName(MI->getOperand(0).getReg());
342 DecodeUNPCKLMask(MVT::v4i32, ShuffleMask);
344 case X86::VPUNPCKLDQYrr:
345 Src2Name = getRegName(MI->getOperand(2).getReg());
347 case X86::VPUNPCKLDQYrm:
348 Src1Name = getRegName(MI->getOperand(1).getReg());
349 DestName = getRegName(MI->getOperand(0).getReg());
350 DecodeUNPCKLMask(MVT::v8i32, ShuffleMask);
352 case X86::PUNPCKLQDQrr:
353 case X86::VPUNPCKLQDQrr:
354 Src2Name = getRegName(MI->getOperand(2).getReg());
356 case X86::PUNPCKLQDQrm:
357 case X86::VPUNPCKLQDQrm:
358 Src1Name = getRegName(MI->getOperand(1).getReg());
359 DestName = getRegName(MI->getOperand(0).getReg());
360 DecodeUNPCKLMask(MVT::v2i64, ShuffleMask);
362 case X86::VPUNPCKLQDQYrr:
363 Src2Name = getRegName(MI->getOperand(2).getReg());
365 case X86::VPUNPCKLQDQYrm:
366 Src1Name = getRegName(MI->getOperand(1).getReg());
367 DestName = getRegName(MI->getOperand(0).getReg());
368 DecodeUNPCKLMask(MVT::v4i64, ShuffleMask);
372 case X86::VSHUFPDrri:
373 Src2Name = getRegName(MI->getOperand(2).getReg());
376 case X86::VSHUFPDrmi:
377 if(MI->getOperand(MI->getNumOperands()-1).isImm())
378 DecodeSHUFPMask(MVT::v2f64,
379 MI->getOperand(MI->getNumOperands()-1).getImm(),
381 Src1Name = getRegName(MI->getOperand(1).getReg());
382 DestName = getRegName(MI->getOperand(0).getReg());
384 case X86::VSHUFPDYrri:
385 Src2Name = getRegName(MI->getOperand(2).getReg());
387 case X86::VSHUFPDYrmi:
388 if(MI->getOperand(MI->getNumOperands()-1).isImm())
389 DecodeSHUFPMask(MVT::v4f64,
390 MI->getOperand(MI->getNumOperands()-1).getImm(),
392 Src1Name = getRegName(MI->getOperand(1).getReg());
393 DestName = getRegName(MI->getOperand(0).getReg());
397 case X86::VSHUFPSrri:
398 Src2Name = getRegName(MI->getOperand(2).getReg());
401 case X86::VSHUFPSrmi:
402 if(MI->getOperand(MI->getNumOperands()-1).isImm())
403 DecodeSHUFPMask(MVT::v4f32,
404 MI->getOperand(MI->getNumOperands()-1).getImm(),
406 Src1Name = getRegName(MI->getOperand(1).getReg());
407 DestName = getRegName(MI->getOperand(0).getReg());
409 case X86::VSHUFPSYrri:
410 Src2Name = getRegName(MI->getOperand(2).getReg());
412 case X86::VSHUFPSYrmi:
413 if(MI->getOperand(MI->getNumOperands()-1).isImm())
414 DecodeSHUFPMask(MVT::v8f32,
415 MI->getOperand(MI->getNumOperands()-1).getImm(),
417 Src1Name = getRegName(MI->getOperand(1).getReg());
418 DestName = getRegName(MI->getOperand(0).getReg());
421 case X86::UNPCKLPDrr:
422 case X86::VUNPCKLPDrr:
423 Src2Name = getRegName(MI->getOperand(2).getReg());
425 case X86::UNPCKLPDrm:
426 case X86::VUNPCKLPDrm:
427 DecodeUNPCKLMask(MVT::v2f64, ShuffleMask);
428 Src1Name = getRegName(MI->getOperand(1).getReg());
429 DestName = getRegName(MI->getOperand(0).getReg());
431 case X86::VUNPCKLPDYrr:
432 Src2Name = getRegName(MI->getOperand(2).getReg());
434 case X86::VUNPCKLPDYrm:
435 DecodeUNPCKLMask(MVT::v4f64, ShuffleMask);
436 Src1Name = getRegName(MI->getOperand(1).getReg());
437 DestName = getRegName(MI->getOperand(0).getReg());
439 case X86::UNPCKLPSrr:
440 case X86::VUNPCKLPSrr:
441 Src2Name = getRegName(MI->getOperand(2).getReg());
443 case X86::UNPCKLPSrm:
444 case X86::VUNPCKLPSrm:
445 DecodeUNPCKLMask(MVT::v4f32, ShuffleMask);
446 Src1Name = getRegName(MI->getOperand(1).getReg());
447 DestName = getRegName(MI->getOperand(0).getReg());
449 case X86::VUNPCKLPSYrr:
450 Src2Name = getRegName(MI->getOperand(2).getReg());
452 case X86::VUNPCKLPSYrm:
453 DecodeUNPCKLMask(MVT::v8f32, ShuffleMask);
454 Src1Name = getRegName(MI->getOperand(1).getReg());
455 DestName = getRegName(MI->getOperand(0).getReg());
457 case X86::UNPCKHPDrr:
458 case X86::VUNPCKHPDrr:
459 Src2Name = getRegName(MI->getOperand(2).getReg());
461 case X86::UNPCKHPDrm:
462 case X86::VUNPCKHPDrm:
463 DecodeUNPCKHMask(MVT::v2f64, ShuffleMask);
464 Src1Name = getRegName(MI->getOperand(1).getReg());
465 DestName = getRegName(MI->getOperand(0).getReg());
467 case X86::VUNPCKHPDYrr:
468 Src2Name = getRegName(MI->getOperand(2).getReg());
470 case X86::VUNPCKHPDYrm:
471 DecodeUNPCKHMask(MVT::v4f64, ShuffleMask);
472 Src1Name = getRegName(MI->getOperand(1).getReg());
473 DestName = getRegName(MI->getOperand(0).getReg());
475 case X86::UNPCKHPSrr:
476 case X86::VUNPCKHPSrr:
477 Src2Name = getRegName(MI->getOperand(2).getReg());
479 case X86::UNPCKHPSrm:
480 case X86::VUNPCKHPSrm:
481 DecodeUNPCKHMask(MVT::v4f32, ShuffleMask);
482 Src1Name = getRegName(MI->getOperand(1).getReg());
483 DestName = getRegName(MI->getOperand(0).getReg());
485 case X86::VUNPCKHPSYrr:
486 Src2Name = getRegName(MI->getOperand(2).getReg());
488 case X86::VUNPCKHPSYrm:
489 DecodeUNPCKHMask(MVT::v8f32, ShuffleMask);
490 Src1Name = getRegName(MI->getOperand(1).getReg());
491 DestName = getRegName(MI->getOperand(0).getReg());
493 case X86::VPERMILPSri:
494 Src1Name = getRegName(MI->getOperand(1).getReg());
496 case X86::VPERMILPSmi:
497 if(MI->getOperand(MI->getNumOperands()-1).isImm())
498 DecodePSHUFMask(MVT::v4f32,
499 MI->getOperand(MI->getNumOperands()-1).getImm(),
501 DestName = getRegName(MI->getOperand(0).getReg());
503 case X86::VPERMILPSYri:
504 Src1Name = getRegName(MI->getOperand(1).getReg());
506 case X86::VPERMILPSYmi:
507 if(MI->getOperand(MI->getNumOperands()-1).isImm())
508 DecodePSHUFMask(MVT::v8f32,
509 MI->getOperand(MI->getNumOperands()-1).getImm(),
511 DestName = getRegName(MI->getOperand(0).getReg());
513 case X86::VPERMILPDri:
514 Src1Name = getRegName(MI->getOperand(1).getReg());
516 case X86::VPERMILPDmi:
517 if(MI->getOperand(MI->getNumOperands()-1).isImm())
518 DecodePSHUFMask(MVT::v2f64,
519 MI->getOperand(MI->getNumOperands()-1).getImm(),
521 DestName = getRegName(MI->getOperand(0).getReg());
523 case X86::VPERMILPDYri:
524 Src1Name = getRegName(MI->getOperand(1).getReg());
526 case X86::VPERMILPDYmi:
527 if(MI->getOperand(MI->getNumOperands()-1).isImm())
528 DecodePSHUFMask(MVT::v4f64,
529 MI->getOperand(MI->getNumOperands()-1).getImm(),
531 DestName = getRegName(MI->getOperand(0).getReg());
533 case X86::VPERM2F128rr:
534 case X86::VPERM2I128rr:
535 Src2Name = getRegName(MI->getOperand(2).getReg());
537 case X86::VPERM2F128rm:
538 case X86::VPERM2I128rm:
539 // For instruction comments purpose, assume the 256-bit vector is v4i64.
540 if(MI->getOperand(MI->getNumOperands()-1).isImm())
541 DecodeVPERM2X128Mask(MVT::v4i64,
542 MI->getOperand(MI->getNumOperands()-1).getImm(),
544 Src1Name = getRegName(MI->getOperand(1).getReg());
545 DestName = getRegName(MI->getOperand(0).getReg());
548 case X86::VPERMPDYri:
549 Src1Name = getRegName(MI->getOperand(1).getReg());
552 case X86::VPERMPDYmi:
553 if(MI->getOperand(MI->getNumOperands()-1).isImm())
554 DecodeVPERMMask(MI->getOperand(MI->getNumOperands()-1).getImm(),
556 DestName = getRegName(MI->getOperand(0).getReg());
560 // The only comments we decode are shuffles, so give up if we were unable to
561 // decode a shuffle mask.
562 if (ShuffleMask.empty())
565 if (!DestName) DestName = Src1Name;
566 OS << (DestName ? DestName : "mem") << " = ";
568 // If the two sources are the same, canonicalize the input elements to be
569 // from the first src so that we get larger element spans.
570 if (Src1Name == Src2Name) {
571 for (unsigned i = 0, e = ShuffleMask.size(); i != e; ++i) {
572 if ((int)ShuffleMask[i] >= 0 && // Not sentinel.
573 ShuffleMask[i] >= (int)e) // From second mask.
578 // The shuffle mask specifies which elements of the src1/src2 fill in the
579 // destination, with a few sentinel values. Loop through and print them
581 for (unsigned i = 0, e = ShuffleMask.size(); i != e; ++i) {
584 if (ShuffleMask[i] == SM_SentinelZero) {
589 // Otherwise, it must come from src1 or src2. Print the span of elements
590 // that comes from this src.
591 bool isSrc1 = ShuffleMask[i] < (int)ShuffleMask.size();
592 const char *SrcName = isSrc1 ? Src1Name : Src2Name;
593 OS << (SrcName ? SrcName : "mem") << '[';
596 (int)ShuffleMask[i] >= 0 &&
597 (ShuffleMask[i] < (int)ShuffleMask.size()) == isSrc1) {
602 OS << ShuffleMask[i] % ShuffleMask.size();
606 --i; // For loop increments element #.
611 // We successfully added a comment to this instruction.