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());
105 case X86::VPBLENDWYrri:
106 Src2Name = getRegName(MI->getOperand(2).getReg());
108 case X86::VPBLENDWYrmi:
109 if(MI->getOperand(MI->getNumOperands()-1).isImm())
110 DecodeBLENDMask(MVT::v16i16,
111 MI->getOperand(MI->getNumOperands()-1).getImm(),
113 Src1Name = getRegName(MI->getOperand(1).getReg());
114 DestName = getRegName(MI->getOperand(0).getReg());
117 case X86::VPBLENDDrri:
118 Src2Name = getRegName(MI->getOperand(2).getReg());
120 case X86::VPBLENDDrmi:
121 if(MI->getOperand(MI->getNumOperands()-1).isImm())
122 DecodeBLENDMask(MVT::v4i32,
123 MI->getOperand(MI->getNumOperands()-1).getImm(),
125 Src1Name = getRegName(MI->getOperand(1).getReg());
126 DestName = getRegName(MI->getOperand(0).getReg());
129 case X86::VPBLENDDYrri:
130 Src2Name = getRegName(MI->getOperand(2).getReg());
132 case X86::VPBLENDDYrmi:
133 if(MI->getOperand(MI->getNumOperands()-1).isImm())
134 DecodeBLENDMask(MVT::v8i32,
135 MI->getOperand(MI->getNumOperands()-1).getImm(),
137 Src1Name = getRegName(MI->getOperand(1).getReg());
138 DestName = getRegName(MI->getOperand(0).getReg());
141 case X86::INSERTPSrr:
142 case X86::VINSERTPSrr:
143 Src2Name = getRegName(MI->getOperand(2).getReg());
145 case X86::INSERTPSrm:
146 case X86::VINSERTPSrm:
147 DestName = getRegName(MI->getOperand(0).getReg());
148 Src1Name = getRegName(MI->getOperand(1).getReg());
149 if(MI->getOperand(MI->getNumOperands()-1).isImm())
150 DecodeINSERTPSMask(MI->getOperand(MI->getNumOperands()-1).getImm(),
155 case X86::VMOVLHPSrr:
156 Src2Name = getRegName(MI->getOperand(2).getReg());
157 Src1Name = getRegName(MI->getOperand(1).getReg());
158 DestName = getRegName(MI->getOperand(0).getReg());
159 DecodeMOVLHPSMask(2, ShuffleMask);
163 case X86::VMOVHLPSrr:
164 Src2Name = getRegName(MI->getOperand(2).getReg());
165 Src1Name = getRegName(MI->getOperand(1).getReg());
166 DestName = getRegName(MI->getOperand(0).getReg());
167 DecodeMOVHLPSMask(2, ShuffleMask);
170 case X86::MOVSLDUPrr:
171 case X86::VMOVSLDUPrr:
172 Src1Name = getRegName(MI->getOperand(1).getReg());
174 case X86::MOVSLDUPrm:
175 case X86::VMOVSLDUPrm:
176 DestName = getRegName(MI->getOperand(0).getReg());
177 DecodeMOVSLDUPMask(MVT::v4f32, ShuffleMask);
180 case X86::VMOVSHDUPYrr:
181 Src1Name = getRegName(MI->getOperand(1).getReg());
183 case X86::VMOVSHDUPYrm:
184 DestName = getRegName(MI->getOperand(0).getReg());
185 DecodeMOVSHDUPMask(MVT::v8f32, ShuffleMask);
188 case X86::VMOVSLDUPYrr:
189 Src1Name = getRegName(MI->getOperand(1).getReg());
191 case X86::VMOVSLDUPYrm:
192 DestName = getRegName(MI->getOperand(0).getReg());
193 DecodeMOVSLDUPMask(MVT::v8f32, ShuffleMask);
196 case X86::MOVSHDUPrr:
197 case X86::VMOVSHDUPrr:
198 Src1Name = getRegName(MI->getOperand(1).getReg());
200 case X86::MOVSHDUPrm:
201 case X86::VMOVSHDUPrm:
202 DestName = getRegName(MI->getOperand(0).getReg());
203 DecodeMOVSHDUPMask(MVT::v4f32, ShuffleMask);
\r
206 case X86::VMOVDDUPYrr:
\r
207 Src1Name = getRegName(MI->getOperand(1).getReg());
\r
209 case X86::VMOVDDUPYrm:
\r
210 DestName = getRegName(MI->getOperand(0).getReg());
\r
211 DecodeMOVDDUPMask(MVT::v4f64, ShuffleMask);
\r
214 case X86::MOVDDUPrr:
\r
215 case X86::VMOVDDUPrr:
\r
216 Src1Name = getRegName(MI->getOperand(1).getReg());
\r
218 case X86::MOVDDUPrm:
\r
219 case X86::VMOVDDUPrm:
\r
220 DestName = getRegName(MI->getOperand(0).getReg());
\r
221 DecodeMOVDDUPMask(MVT::v2f64, ShuffleMask);
\r
224 case X86::PSLLDQri:
\r
225 case X86::VPSLLDQri:
\r
226 Src1Name = getRegName(MI->getOperand(1).getReg());
\r
227 DestName = getRegName(MI->getOperand(0).getReg());
228 if(MI->getOperand(MI->getNumOperands()-1).isImm())
229 DecodePSLLDQMask(MVT::v16i8,
230 MI->getOperand(MI->getNumOperands()-1).getImm(),
234 case X86::VPSLLDQYri:
235 Src1Name = getRegName(MI->getOperand(1).getReg());
236 DestName = getRegName(MI->getOperand(0).getReg());
237 if(MI->getOperand(MI->getNumOperands()-1).isImm())
238 DecodePSLLDQMask(MVT::v32i8,
239 MI->getOperand(MI->getNumOperands()-1).getImm(),
245 Src1Name = getRegName(MI->getOperand(1).getReg());
246 DestName = getRegName(MI->getOperand(0).getReg());
247 if(MI->getOperand(MI->getNumOperands()-1).isImm())
248 DecodePSRLDQMask(MVT::v16i8,
249 MI->getOperand(MI->getNumOperands()-1).getImm(),
253 case X86::VPSRLDQYri:
254 Src1Name = getRegName(MI->getOperand(1).getReg());
255 DestName = getRegName(MI->getOperand(0).getReg());
256 if(MI->getOperand(MI->getNumOperands()-1).isImm())
257 DecodePSRLDQMask(MVT::v32i8,
258 MI->getOperand(MI->getNumOperands()-1).getImm(),
262 case X86::PALIGNR128rr:
263 case X86::VPALIGNR128rr:
264 Src1Name = getRegName(MI->getOperand(2).getReg());
266 case X86::PALIGNR128rm:
267 case X86::VPALIGNR128rm:
268 Src2Name = getRegName(MI->getOperand(1).getReg());
269 DestName = getRegName(MI->getOperand(0).getReg());
270 if(MI->getOperand(MI->getNumOperands()-1).isImm())
271 DecodePALIGNRMask(MVT::v16i8,
272 MI->getOperand(MI->getNumOperands()-1).getImm(),
275 case X86::VPALIGNR256rr:
276 Src1Name = getRegName(MI->getOperand(2).getReg());
278 case X86::VPALIGNR256rm:
279 Src2Name = getRegName(MI->getOperand(1).getReg());
280 DestName = getRegName(MI->getOperand(0).getReg());
281 if(MI->getOperand(MI->getNumOperands()-1).isImm())
282 DecodePALIGNRMask(MVT::v32i8,
283 MI->getOperand(MI->getNumOperands()-1).getImm(),
289 Src1Name = getRegName(MI->getOperand(1).getReg());
293 DestName = getRegName(MI->getOperand(0).getReg());
294 if(MI->getOperand(MI->getNumOperands()-1).isImm())
295 DecodePSHUFMask(MVT::v4i32,
296 MI->getOperand(MI->getNumOperands()-1).getImm(),
299 case X86::VPSHUFDYri:
300 Src1Name = getRegName(MI->getOperand(1).getReg());
302 case X86::VPSHUFDYmi:
303 DestName = getRegName(MI->getOperand(0).getReg());
304 if(MI->getOperand(MI->getNumOperands()-1).isImm())
305 DecodePSHUFMask(MVT::v8i32,
306 MI->getOperand(MI->getNumOperands()-1).getImm(),
312 case X86::VPSHUFHWri:
313 Src1Name = getRegName(MI->getOperand(1).getReg());
316 case X86::VPSHUFHWmi:
317 DestName = getRegName(MI->getOperand(0).getReg());
318 if(MI->getOperand(MI->getNumOperands()-1).isImm())
319 DecodePSHUFHWMask(MVT::v8i16,
320 MI->getOperand(MI->getNumOperands()-1).getImm(),
323 case X86::VPSHUFHWYri:
324 Src1Name = getRegName(MI->getOperand(1).getReg());
326 case X86::VPSHUFHWYmi:
327 DestName = getRegName(MI->getOperand(0).getReg());
328 if(MI->getOperand(MI->getNumOperands()-1).isImm())
329 DecodePSHUFHWMask(MVT::v16i16,
330 MI->getOperand(MI->getNumOperands()-1).getImm(),
334 case X86::VPSHUFLWri:
335 Src1Name = getRegName(MI->getOperand(1).getReg());
338 case X86::VPSHUFLWmi:
339 DestName = getRegName(MI->getOperand(0).getReg());
340 if(MI->getOperand(MI->getNumOperands()-1).isImm())
341 DecodePSHUFLWMask(MVT::v8i16,
342 MI->getOperand(MI->getNumOperands()-1).getImm(),
345 case X86::VPSHUFLWYri:
346 Src1Name = getRegName(MI->getOperand(1).getReg());
348 case X86::VPSHUFLWYmi:
349 DestName = getRegName(MI->getOperand(0).getReg());
350 if(MI->getOperand(MI->getNumOperands()-1).isImm())
351 DecodePSHUFLWMask(MVT::v16i16,
352 MI->getOperand(MI->getNumOperands()-1).getImm(),
356 case X86::PUNPCKHBWrr:
357 case X86::VPUNPCKHBWrr:
358 Src2Name = getRegName(MI->getOperand(2).getReg());
360 case X86::PUNPCKHBWrm:
361 case X86::VPUNPCKHBWrm:
362 Src1Name = getRegName(MI->getOperand(1).getReg());
363 DestName = getRegName(MI->getOperand(0).getReg());
364 DecodeUNPCKHMask(MVT::v16i8, ShuffleMask);
366 case X86::VPUNPCKHBWYrr:
367 Src2Name = getRegName(MI->getOperand(2).getReg());
369 case X86::VPUNPCKHBWYrm:
370 Src1Name = getRegName(MI->getOperand(1).getReg());
371 DestName = getRegName(MI->getOperand(0).getReg());
372 DecodeUNPCKHMask(MVT::v32i8, ShuffleMask);
374 case X86::PUNPCKHWDrr:
375 case X86::VPUNPCKHWDrr:
376 Src2Name = getRegName(MI->getOperand(2).getReg());
378 case X86::PUNPCKHWDrm:
379 case X86::VPUNPCKHWDrm:
380 Src1Name = getRegName(MI->getOperand(1).getReg());
381 DestName = getRegName(MI->getOperand(0).getReg());
382 DecodeUNPCKHMask(MVT::v8i16, ShuffleMask);
384 case X86::VPUNPCKHWDYrr:
385 Src2Name = getRegName(MI->getOperand(2).getReg());
387 case X86::VPUNPCKHWDYrm:
388 Src1Name = getRegName(MI->getOperand(1).getReg());
389 DestName = getRegName(MI->getOperand(0).getReg());
390 DecodeUNPCKHMask(MVT::v16i16, ShuffleMask);
392 case X86::PUNPCKHDQrr:
393 case X86::VPUNPCKHDQrr:
394 Src2Name = getRegName(MI->getOperand(2).getReg());
396 case X86::PUNPCKHDQrm:
397 case X86::VPUNPCKHDQrm:
398 Src1Name = getRegName(MI->getOperand(1).getReg());
399 DestName = getRegName(MI->getOperand(0).getReg());
400 DecodeUNPCKHMask(MVT::v4i32, ShuffleMask);
402 case X86::VPUNPCKHDQYrr:
403 Src2Name = getRegName(MI->getOperand(2).getReg());
405 case X86::VPUNPCKHDQYrm:
406 Src1Name = getRegName(MI->getOperand(1).getReg());
407 DestName = getRegName(MI->getOperand(0).getReg());
408 DecodeUNPCKHMask(MVT::v8i32, ShuffleMask);
410 case X86::VPUNPCKHDQZrr:
411 Src2Name = getRegName(MI->getOperand(2).getReg());
413 case X86::VPUNPCKHDQZrm:
414 Src1Name = getRegName(MI->getOperand(1).getReg());
415 DestName = getRegName(MI->getOperand(0).getReg());
416 DecodeUNPCKHMask(MVT::v16i32, ShuffleMask);
418 case X86::PUNPCKHQDQrr:
419 case X86::VPUNPCKHQDQrr:
420 Src2Name = getRegName(MI->getOperand(2).getReg());
422 case X86::PUNPCKHQDQrm:
423 case X86::VPUNPCKHQDQrm:
424 Src1Name = getRegName(MI->getOperand(1).getReg());
425 DestName = getRegName(MI->getOperand(0).getReg());
426 DecodeUNPCKHMask(MVT::v2i64, ShuffleMask);
428 case X86::VPUNPCKHQDQYrr:
429 Src2Name = getRegName(MI->getOperand(2).getReg());
431 case X86::VPUNPCKHQDQYrm:
432 Src1Name = getRegName(MI->getOperand(1).getReg());
433 DestName = getRegName(MI->getOperand(0).getReg());
434 DecodeUNPCKHMask(MVT::v4i64, ShuffleMask);
436 case X86::VPUNPCKHQDQZrr:
437 Src2Name = getRegName(MI->getOperand(2).getReg());
439 case X86::VPUNPCKHQDQZrm:
440 Src1Name = getRegName(MI->getOperand(1).getReg());
441 DestName = getRegName(MI->getOperand(0).getReg());
442 DecodeUNPCKHMask(MVT::v8i64, ShuffleMask);
445 case X86::PUNPCKLBWrr:
446 case X86::VPUNPCKLBWrr:
447 Src2Name = getRegName(MI->getOperand(2).getReg());
449 case X86::PUNPCKLBWrm:
450 case X86::VPUNPCKLBWrm:
451 Src1Name = getRegName(MI->getOperand(1).getReg());
452 DestName = getRegName(MI->getOperand(0).getReg());
453 DecodeUNPCKLMask(MVT::v16i8, ShuffleMask);
455 case X86::VPUNPCKLBWYrr:
456 Src2Name = getRegName(MI->getOperand(2).getReg());
458 case X86::VPUNPCKLBWYrm:
459 Src1Name = getRegName(MI->getOperand(1).getReg());
460 DestName = getRegName(MI->getOperand(0).getReg());
461 DecodeUNPCKLMask(MVT::v32i8, ShuffleMask);
463 case X86::PUNPCKLWDrr:
464 case X86::VPUNPCKLWDrr:
465 Src2Name = getRegName(MI->getOperand(2).getReg());
467 case X86::PUNPCKLWDrm:
468 case X86::VPUNPCKLWDrm:
469 Src1Name = getRegName(MI->getOperand(1).getReg());
470 DestName = getRegName(MI->getOperand(0).getReg());
471 DecodeUNPCKLMask(MVT::v8i16, ShuffleMask);
473 case X86::VPUNPCKLWDYrr:
474 Src2Name = getRegName(MI->getOperand(2).getReg());
476 case X86::VPUNPCKLWDYrm:
477 Src1Name = getRegName(MI->getOperand(1).getReg());
478 DestName = getRegName(MI->getOperand(0).getReg());
479 DecodeUNPCKLMask(MVT::v16i16, ShuffleMask);
481 case X86::PUNPCKLDQrr:
482 case X86::VPUNPCKLDQrr:
483 Src2Name = getRegName(MI->getOperand(2).getReg());
485 case X86::PUNPCKLDQrm:
486 case X86::VPUNPCKLDQrm:
487 Src1Name = getRegName(MI->getOperand(1).getReg());
488 DestName = getRegName(MI->getOperand(0).getReg());
489 DecodeUNPCKLMask(MVT::v4i32, ShuffleMask);
491 case X86::VPUNPCKLDQYrr:
492 Src2Name = getRegName(MI->getOperand(2).getReg());
494 case X86::VPUNPCKLDQYrm:
495 Src1Name = getRegName(MI->getOperand(1).getReg());
496 DestName = getRegName(MI->getOperand(0).getReg());
497 DecodeUNPCKLMask(MVT::v8i32, ShuffleMask);
499 case X86::VPUNPCKLDQZrr:
500 Src2Name = getRegName(MI->getOperand(2).getReg());
502 case X86::VPUNPCKLDQZrm:
503 Src1Name = getRegName(MI->getOperand(1).getReg());
504 DestName = getRegName(MI->getOperand(0).getReg());
505 DecodeUNPCKLMask(MVT::v16i32, ShuffleMask);
507 case X86::PUNPCKLQDQrr:
508 case X86::VPUNPCKLQDQrr:
509 Src2Name = getRegName(MI->getOperand(2).getReg());
511 case X86::PUNPCKLQDQrm:
512 case X86::VPUNPCKLQDQrm:
513 Src1Name = getRegName(MI->getOperand(1).getReg());
514 DestName = getRegName(MI->getOperand(0).getReg());
515 DecodeUNPCKLMask(MVT::v2i64, ShuffleMask);
517 case X86::VPUNPCKLQDQYrr:
518 Src2Name = getRegName(MI->getOperand(2).getReg());
520 case X86::VPUNPCKLQDQYrm:
521 Src1Name = getRegName(MI->getOperand(1).getReg());
522 DestName = getRegName(MI->getOperand(0).getReg());
523 DecodeUNPCKLMask(MVT::v4i64, ShuffleMask);
525 case X86::VPUNPCKLQDQZrr:
526 Src2Name = getRegName(MI->getOperand(2).getReg());
528 case X86::VPUNPCKLQDQZrm:
529 Src1Name = getRegName(MI->getOperand(1).getReg());
530 DestName = getRegName(MI->getOperand(0).getReg());
531 DecodeUNPCKLMask(MVT::v8i64, ShuffleMask);
535 case X86::VSHUFPDrri:
536 Src2Name = getRegName(MI->getOperand(2).getReg());
539 case X86::VSHUFPDrmi:
540 if(MI->getOperand(MI->getNumOperands()-1).isImm())
541 DecodeSHUFPMask(MVT::v2f64,
542 MI->getOperand(MI->getNumOperands()-1).getImm(),
544 Src1Name = getRegName(MI->getOperand(1).getReg());
545 DestName = getRegName(MI->getOperand(0).getReg());
547 case X86::VSHUFPDYrri:
548 Src2Name = getRegName(MI->getOperand(2).getReg());
550 case X86::VSHUFPDYrmi:
551 if(MI->getOperand(MI->getNumOperands()-1).isImm())
552 DecodeSHUFPMask(MVT::v4f64,
553 MI->getOperand(MI->getNumOperands()-1).getImm(),
555 Src1Name = getRegName(MI->getOperand(1).getReg());
556 DestName = getRegName(MI->getOperand(0).getReg());
560 case X86::VSHUFPSrri:
561 Src2Name = getRegName(MI->getOperand(2).getReg());
564 case X86::VSHUFPSrmi:
565 if(MI->getOperand(MI->getNumOperands()-1).isImm())
566 DecodeSHUFPMask(MVT::v4f32,
567 MI->getOperand(MI->getNumOperands()-1).getImm(),
569 Src1Name = getRegName(MI->getOperand(1).getReg());
570 DestName = getRegName(MI->getOperand(0).getReg());
572 case X86::VSHUFPSYrri:
573 Src2Name = getRegName(MI->getOperand(2).getReg());
575 case X86::VSHUFPSYrmi:
576 if(MI->getOperand(MI->getNumOperands()-1).isImm())
577 DecodeSHUFPMask(MVT::v8f32,
578 MI->getOperand(MI->getNumOperands()-1).getImm(),
580 Src1Name = getRegName(MI->getOperand(1).getReg());
581 DestName = getRegName(MI->getOperand(0).getReg());
584 case X86::UNPCKLPDrr:
585 case X86::VUNPCKLPDrr:
586 Src2Name = getRegName(MI->getOperand(2).getReg());
588 case X86::UNPCKLPDrm:
589 case X86::VUNPCKLPDrm:
590 DecodeUNPCKLMask(MVT::v2f64, ShuffleMask);
591 Src1Name = getRegName(MI->getOperand(1).getReg());
592 DestName = getRegName(MI->getOperand(0).getReg());
594 case X86::VUNPCKLPDYrr:
595 Src2Name = getRegName(MI->getOperand(2).getReg());
597 case X86::VUNPCKLPDYrm:
598 DecodeUNPCKLMask(MVT::v4f64, ShuffleMask);
599 Src1Name = getRegName(MI->getOperand(1).getReg());
600 DestName = getRegName(MI->getOperand(0).getReg());
602 case X86::VUNPCKLPDZrr:
603 Src2Name = getRegName(MI->getOperand(2).getReg());
605 case X86::VUNPCKLPDZrm:
606 DecodeUNPCKLMask(MVT::v8f64, ShuffleMask);
607 Src1Name = getRegName(MI->getOperand(1).getReg());
608 DestName = getRegName(MI->getOperand(0).getReg());
610 case X86::UNPCKLPSrr:
611 case X86::VUNPCKLPSrr:
612 Src2Name = getRegName(MI->getOperand(2).getReg());
614 case X86::UNPCKLPSrm:
615 case X86::VUNPCKLPSrm:
616 DecodeUNPCKLMask(MVT::v4f32, ShuffleMask);
617 Src1Name = getRegName(MI->getOperand(1).getReg());
618 DestName = getRegName(MI->getOperand(0).getReg());
620 case X86::VUNPCKLPSYrr:
621 Src2Name = getRegName(MI->getOperand(2).getReg());
623 case X86::VUNPCKLPSYrm:
624 DecodeUNPCKLMask(MVT::v8f32, ShuffleMask);
625 Src1Name = getRegName(MI->getOperand(1).getReg());
626 DestName = getRegName(MI->getOperand(0).getReg());
628 case X86::VUNPCKLPSZrr:
629 Src2Name = getRegName(MI->getOperand(2).getReg());
631 case X86::VUNPCKLPSZrm:
632 DecodeUNPCKLMask(MVT::v16f32, ShuffleMask);
633 Src1Name = getRegName(MI->getOperand(1).getReg());
634 DestName = getRegName(MI->getOperand(0).getReg());
636 case X86::UNPCKHPDrr:
637 case X86::VUNPCKHPDrr:
638 Src2Name = getRegName(MI->getOperand(2).getReg());
640 case X86::UNPCKHPDrm:
641 case X86::VUNPCKHPDrm:
642 DecodeUNPCKHMask(MVT::v2f64, ShuffleMask);
643 Src1Name = getRegName(MI->getOperand(1).getReg());
644 DestName = getRegName(MI->getOperand(0).getReg());
646 case X86::VUNPCKHPDYrr:
647 Src2Name = getRegName(MI->getOperand(2).getReg());
649 case X86::VUNPCKHPDYrm:
650 DecodeUNPCKHMask(MVT::v4f64, ShuffleMask);
651 Src1Name = getRegName(MI->getOperand(1).getReg());
652 DestName = getRegName(MI->getOperand(0).getReg());
654 case X86::VUNPCKHPDZrr:
655 Src2Name = getRegName(MI->getOperand(2).getReg());
657 case X86::VUNPCKHPDZrm:
658 DecodeUNPCKHMask(MVT::v8f64, ShuffleMask);
659 Src1Name = getRegName(MI->getOperand(1).getReg());
660 DestName = getRegName(MI->getOperand(0).getReg());
662 case X86::UNPCKHPSrr:
663 case X86::VUNPCKHPSrr:
664 Src2Name = getRegName(MI->getOperand(2).getReg());
666 case X86::UNPCKHPSrm:
667 case X86::VUNPCKHPSrm:
668 DecodeUNPCKHMask(MVT::v4f32, ShuffleMask);
669 Src1Name = getRegName(MI->getOperand(1).getReg());
670 DestName = getRegName(MI->getOperand(0).getReg());
672 case X86::VUNPCKHPSYrr:
673 Src2Name = getRegName(MI->getOperand(2).getReg());
675 case X86::VUNPCKHPSYrm:
676 DecodeUNPCKHMask(MVT::v8f32, ShuffleMask);
677 Src1Name = getRegName(MI->getOperand(1).getReg());
678 DestName = getRegName(MI->getOperand(0).getReg());
680 case X86::VUNPCKHPSZrr:
681 Src2Name = getRegName(MI->getOperand(2).getReg());
683 case X86::VUNPCKHPSZrm:
684 DecodeUNPCKHMask(MVT::v16f32, ShuffleMask);
685 Src1Name = getRegName(MI->getOperand(1).getReg());
686 DestName = getRegName(MI->getOperand(0).getReg());
688 case X86::VPERMILPSri:
689 Src1Name = getRegName(MI->getOperand(1).getReg());
691 case X86::VPERMILPSmi:
692 if(MI->getOperand(MI->getNumOperands()-1).isImm())
693 DecodePSHUFMask(MVT::v4f32,
694 MI->getOperand(MI->getNumOperands()-1).getImm(),
696 DestName = getRegName(MI->getOperand(0).getReg());
698 case X86::VPERMILPSYri:
699 Src1Name = getRegName(MI->getOperand(1).getReg());
701 case X86::VPERMILPSYmi:
702 if(MI->getOperand(MI->getNumOperands()-1).isImm())
703 DecodePSHUFMask(MVT::v8f32,
704 MI->getOperand(MI->getNumOperands()-1).getImm(),
706 DestName = getRegName(MI->getOperand(0).getReg());
708 case X86::VPERMILPDri:
709 Src1Name = getRegName(MI->getOperand(1).getReg());
711 case X86::VPERMILPDmi:
712 if(MI->getOperand(MI->getNumOperands()-1).isImm())
713 DecodePSHUFMask(MVT::v2f64,
714 MI->getOperand(MI->getNumOperands()-1).getImm(),
716 DestName = getRegName(MI->getOperand(0).getReg());
718 case X86::VPERMILPDYri:
719 Src1Name = getRegName(MI->getOperand(1).getReg());
721 case X86::VPERMILPDYmi:
722 if(MI->getOperand(MI->getNumOperands()-1).isImm())
723 DecodePSHUFMask(MVT::v4f64,
724 MI->getOperand(MI->getNumOperands()-1).getImm(),
726 DestName = getRegName(MI->getOperand(0).getReg());
728 case X86::VPERM2F128rr:
729 case X86::VPERM2I128rr:
730 Src2Name = getRegName(MI->getOperand(2).getReg());
732 case X86::VPERM2F128rm:
733 case X86::VPERM2I128rm:
734 // For instruction comments purpose, assume the 256-bit vector is v4i64.
735 if(MI->getOperand(MI->getNumOperands()-1).isImm())
736 DecodeVPERM2X128Mask(MVT::v4i64,
737 MI->getOperand(MI->getNumOperands()-1).getImm(),
739 Src1Name = getRegName(MI->getOperand(1).getReg());
740 DestName = getRegName(MI->getOperand(0).getReg());
743 case X86::VPERMPDYri:
744 Src1Name = getRegName(MI->getOperand(1).getReg());
747 case X86::VPERMPDYmi:
748 if(MI->getOperand(MI->getNumOperands()-1).isImm())
749 DecodeVPERMMask(MI->getOperand(MI->getNumOperands()-1).getImm(),
751 DestName = getRegName(MI->getOperand(0).getReg());
755 // The only comments we decode are shuffles, so give up if we were unable to
756 // decode a shuffle mask.
757 if (ShuffleMask.empty())
760 if (!DestName) DestName = Src1Name;
761 OS << (DestName ? DestName : "mem") << " = ";
763 // If the two sources are the same, canonicalize the input elements to be
764 // from the first src so that we get larger element spans.
765 if (Src1Name == Src2Name) {
766 for (unsigned i = 0, e = ShuffleMask.size(); i != e; ++i) {
767 if ((int)ShuffleMask[i] >= 0 && // Not sentinel.
768 ShuffleMask[i] >= (int)e) // From second mask.
773 // The shuffle mask specifies which elements of the src1/src2 fill in the
774 // destination, with a few sentinel values. Loop through and print them
776 for (unsigned i = 0, e = ShuffleMask.size(); i != e; ++i) {
779 if (ShuffleMask[i] == SM_SentinelZero) {
784 // Otherwise, it must come from src1 or src2. Print the span of elements
785 // that comes from this src.
786 bool isSrc1 = ShuffleMask[i] < (int)ShuffleMask.size();
787 const char *SrcName = isSrc1 ? Src1Name : Src2Name;
788 OS << (SrcName ? SrcName : "mem") << '[';
790 while (i != e && (int)ShuffleMask[i] != SM_SentinelZero &&
791 (ShuffleMask[i] < (int)ShuffleMask.size()) == isSrc1) {
796 if (ShuffleMask[i] == SM_SentinelUndef)
799 OS << ShuffleMask[i] % ShuffleMask.size();
803 --i; // For loop increments element #.
808 // We successfully added a comment to this instruction.