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 /// \brief Extracts the src/dst types for a given zero extension instruction.
25 /// \note While the number of elements in DstVT type correct, the
26 /// number in the SrcVT type is expanded to fill the src xmm register and the
27 /// upper elements may not be included in the dst xmm/ymm register.
28 static void getZeroExtensionTypes(const MCInst *MI, MVT &SrcVT, MVT &DstVT) {
29 switch (MI->getOpcode()) {
31 llvm_unreachable("Unknown zero extension instruction");
35 case X86::VPMOVZXBWrm:
36 case X86::VPMOVZXBWrr:
40 case X86::VPMOVZXBWYrm:
41 case X86::VPMOVZXBWYrr:
47 case X86::VPMOVZXBDrm:
48 case X86::VPMOVZXBDrr:
52 case X86::VPMOVZXBDYrm:
53 case X86::VPMOVZXBDYrr:
59 case X86::VPMOVZXBQrm:
60 case X86::VPMOVZXBQrr:
64 case X86::VPMOVZXBQYrm:
65 case X86::VPMOVZXBQYrr:
72 case X86::VPMOVZXWDrm:
73 case X86::VPMOVZXWDrr:
77 case X86::VPMOVZXWDYrm:
78 case X86::VPMOVZXWDYrr:
84 case X86::VPMOVZXWQrm:
85 case X86::VPMOVZXWQrr:
89 case X86::VPMOVZXWQYrm:
90 case X86::VPMOVZXWQYrr:
97 case X86::VPMOVZXDQrm:
98 case X86::VPMOVZXDQrr:
102 case X86::VPMOVZXDQYrm:
103 case X86::VPMOVZXDQYrr:
110 //===----------------------------------------------------------------------===//
111 // Top Level Entrypoint
112 //===----------------------------------------------------------------------===//
114 /// EmitAnyX86InstComments - This function decodes x86 instructions and prints
115 /// newline terminated strings to the specified string if desired. This
116 /// information is shown in disassembly dumps when verbose assembly is enabled.
117 bool llvm::EmitAnyX86InstComments(const MCInst *MI, raw_ostream &OS,
118 const char *(*getRegName)(unsigned)) {
119 // If this is a shuffle operation, the switch should fill in this state.
120 SmallVector<int, 8> ShuffleMask;
121 const char *DestName = nullptr, *Src1Name = nullptr, *Src2Name = nullptr;
123 switch (MI->getOpcode()) {
125 // Not an instruction for which we can decode comments.
128 case X86::BLENDPDrri:
129 case X86::VBLENDPDrri:
130 Src2Name = getRegName(MI->getOperand(2).getReg());
132 case X86::BLENDPDrmi:
133 case X86::VBLENDPDrmi:
134 if(MI->getOperand(MI->getNumOperands()-1).isImm())
135 DecodeBLENDMask(MVT::v2f64,
136 MI->getOperand(MI->getNumOperands()-1).getImm(),
138 Src1Name = getRegName(MI->getOperand(1).getReg());
139 DestName = getRegName(MI->getOperand(0).getReg());
141 case X86::VBLENDPDYrri:
142 Src2Name = getRegName(MI->getOperand(2).getReg());
144 case X86::VBLENDPDYrmi:
145 if(MI->getOperand(MI->getNumOperands()-1).isImm())
146 DecodeBLENDMask(MVT::v4f64,
147 MI->getOperand(MI->getNumOperands()-1).getImm(),
149 Src1Name = getRegName(MI->getOperand(1).getReg());
150 DestName = getRegName(MI->getOperand(0).getReg());
153 case X86::BLENDPSrri:
154 case X86::VBLENDPSrri:
155 Src2Name = getRegName(MI->getOperand(2).getReg());
157 case X86::BLENDPSrmi:
158 case X86::VBLENDPSrmi:
159 if(MI->getOperand(MI->getNumOperands()-1).isImm())
160 DecodeBLENDMask(MVT::v4f32,
161 MI->getOperand(MI->getNumOperands()-1).getImm(),
163 Src1Name = getRegName(MI->getOperand(1).getReg());
164 DestName = getRegName(MI->getOperand(0).getReg());
166 case X86::VBLENDPSYrri:
167 Src2Name = getRegName(MI->getOperand(2).getReg());
169 case X86::VBLENDPSYrmi:
170 if(MI->getOperand(MI->getNumOperands()-1).isImm())
171 DecodeBLENDMask(MVT::v8f32,
172 MI->getOperand(MI->getNumOperands()-1).getImm(),
174 Src1Name = getRegName(MI->getOperand(1).getReg());
175 DestName = getRegName(MI->getOperand(0).getReg());
178 case X86::PBLENDWrri:
179 case X86::VPBLENDWrri:
180 Src2Name = getRegName(MI->getOperand(2).getReg());
182 case X86::PBLENDWrmi:
183 case X86::VPBLENDWrmi:
184 if(MI->getOperand(MI->getNumOperands()-1).isImm())
185 DecodeBLENDMask(MVT::v8i16,
186 MI->getOperand(MI->getNumOperands()-1).getImm(),
188 Src1Name = getRegName(MI->getOperand(1).getReg());
189 DestName = getRegName(MI->getOperand(0).getReg());
191 case X86::VPBLENDWYrri:
192 Src2Name = getRegName(MI->getOperand(2).getReg());
194 case X86::VPBLENDWYrmi:
195 if(MI->getOperand(MI->getNumOperands()-1).isImm())
196 DecodeBLENDMask(MVT::v16i16,
197 MI->getOperand(MI->getNumOperands()-1).getImm(),
199 Src1Name = getRegName(MI->getOperand(1).getReg());
200 DestName = getRegName(MI->getOperand(0).getReg());
203 case X86::VPBLENDDrri:
204 Src2Name = getRegName(MI->getOperand(2).getReg());
206 case X86::VPBLENDDrmi:
207 if(MI->getOperand(MI->getNumOperands()-1).isImm())
208 DecodeBLENDMask(MVT::v4i32,
209 MI->getOperand(MI->getNumOperands()-1).getImm(),
211 Src1Name = getRegName(MI->getOperand(1).getReg());
212 DestName = getRegName(MI->getOperand(0).getReg());
215 case X86::VPBLENDDYrri:
216 Src2Name = getRegName(MI->getOperand(2).getReg());
218 case X86::VPBLENDDYrmi:
219 if(MI->getOperand(MI->getNumOperands()-1).isImm())
220 DecodeBLENDMask(MVT::v8i32,
221 MI->getOperand(MI->getNumOperands()-1).getImm(),
223 Src1Name = getRegName(MI->getOperand(1).getReg());
224 DestName = getRegName(MI->getOperand(0).getReg());
227 case X86::INSERTPSrr:
228 case X86::VINSERTPSrr:
229 Src2Name = getRegName(MI->getOperand(2).getReg());
231 case X86::INSERTPSrm:
232 case X86::VINSERTPSrm:
233 DestName = getRegName(MI->getOperand(0).getReg());
234 Src1Name = getRegName(MI->getOperand(1).getReg());
235 if(MI->getOperand(MI->getNumOperands()-1).isImm())
236 DecodeINSERTPSMask(MI->getOperand(MI->getNumOperands()-1).getImm(),
241 case X86::VMOVLHPSrr:
242 Src2Name = getRegName(MI->getOperand(2).getReg());
243 Src1Name = getRegName(MI->getOperand(1).getReg());
244 DestName = getRegName(MI->getOperand(0).getReg());
245 DecodeMOVLHPSMask(2, ShuffleMask);
249 case X86::VMOVHLPSrr:
250 Src2Name = getRegName(MI->getOperand(2).getReg());
251 Src1Name = getRegName(MI->getOperand(1).getReg());
252 DestName = getRegName(MI->getOperand(0).getReg());
253 DecodeMOVHLPSMask(2, ShuffleMask);
256 case X86::MOVSLDUPrr:
257 case X86::VMOVSLDUPrr:
258 Src1Name = getRegName(MI->getOperand(1).getReg());
260 case X86::MOVSLDUPrm:
261 case X86::VMOVSLDUPrm:
262 DestName = getRegName(MI->getOperand(0).getReg());
263 DecodeMOVSLDUPMask(MVT::v4f32, ShuffleMask);
266 case X86::VMOVSHDUPYrr:
267 Src1Name = getRegName(MI->getOperand(1).getReg());
269 case X86::VMOVSHDUPYrm:
270 DestName = getRegName(MI->getOperand(0).getReg());
271 DecodeMOVSHDUPMask(MVT::v8f32, ShuffleMask);
274 case X86::VMOVSLDUPYrr:
275 Src1Name = getRegName(MI->getOperand(1).getReg());
277 case X86::VMOVSLDUPYrm:
278 DestName = getRegName(MI->getOperand(0).getReg());
279 DecodeMOVSLDUPMask(MVT::v8f32, ShuffleMask);
282 case X86::MOVSHDUPrr:
283 case X86::VMOVSHDUPrr:
284 Src1Name = getRegName(MI->getOperand(1).getReg());
286 case X86::MOVSHDUPrm:
287 case X86::VMOVSHDUPrm:
288 DestName = getRegName(MI->getOperand(0).getReg());
289 DecodeMOVSHDUPMask(MVT::v4f32, ShuffleMask);
292 case X86::VMOVDDUPYrr:
293 Src1Name = getRegName(MI->getOperand(1).getReg());
295 case X86::VMOVDDUPYrm:
296 DestName = getRegName(MI->getOperand(0).getReg());
297 DecodeMOVDDUPMask(MVT::v4f64, ShuffleMask);
301 case X86::VMOVDDUPrr:
302 Src1Name = getRegName(MI->getOperand(1).getReg());
305 case X86::VMOVDDUPrm:
306 DestName = getRegName(MI->getOperand(0).getReg());
307 DecodeMOVDDUPMask(MVT::v2f64, ShuffleMask);
312 Src1Name = getRegName(MI->getOperand(1).getReg());
313 DestName = getRegName(MI->getOperand(0).getReg());
314 if(MI->getOperand(MI->getNumOperands()-1).isImm())
315 DecodePSLLDQMask(MVT::v16i8,
316 MI->getOperand(MI->getNumOperands()-1).getImm(),
320 case X86::VPSLLDQYri:
321 Src1Name = getRegName(MI->getOperand(1).getReg());
322 DestName = getRegName(MI->getOperand(0).getReg());
323 if(MI->getOperand(MI->getNumOperands()-1).isImm())
324 DecodePSLLDQMask(MVT::v32i8,
325 MI->getOperand(MI->getNumOperands()-1).getImm(),
331 Src1Name = getRegName(MI->getOperand(1).getReg());
332 DestName = getRegName(MI->getOperand(0).getReg());
333 if(MI->getOperand(MI->getNumOperands()-1).isImm())
334 DecodePSRLDQMask(MVT::v16i8,
335 MI->getOperand(MI->getNumOperands()-1).getImm(),
339 case X86::VPSRLDQYri:
340 Src1Name = getRegName(MI->getOperand(1).getReg());
341 DestName = getRegName(MI->getOperand(0).getReg());
342 if(MI->getOperand(MI->getNumOperands()-1).isImm())
343 DecodePSRLDQMask(MVT::v32i8,
344 MI->getOperand(MI->getNumOperands()-1).getImm(),
348 case X86::PALIGNR128rr:
349 case X86::VPALIGNR128rr:
350 Src1Name = getRegName(MI->getOperand(2).getReg());
352 case X86::PALIGNR128rm:
353 case X86::VPALIGNR128rm:
354 Src2Name = getRegName(MI->getOperand(1).getReg());
355 DestName = getRegName(MI->getOperand(0).getReg());
356 if(MI->getOperand(MI->getNumOperands()-1).isImm())
357 DecodePALIGNRMask(MVT::v16i8,
358 MI->getOperand(MI->getNumOperands()-1).getImm(),
361 case X86::VPALIGNR256rr:
362 Src1Name = getRegName(MI->getOperand(2).getReg());
364 case X86::VPALIGNR256rm:
365 Src2Name = getRegName(MI->getOperand(1).getReg());
366 DestName = getRegName(MI->getOperand(0).getReg());
367 if(MI->getOperand(MI->getNumOperands()-1).isImm())
368 DecodePALIGNRMask(MVT::v32i8,
369 MI->getOperand(MI->getNumOperands()-1).getImm(),
375 Src1Name = getRegName(MI->getOperand(1).getReg());
379 DestName = getRegName(MI->getOperand(0).getReg());
380 if(MI->getOperand(MI->getNumOperands()-1).isImm())
381 DecodePSHUFMask(MVT::v4i32,
382 MI->getOperand(MI->getNumOperands()-1).getImm(),
385 case X86::VPSHUFDYri:
386 Src1Name = getRegName(MI->getOperand(1).getReg());
388 case X86::VPSHUFDYmi:
389 DestName = getRegName(MI->getOperand(0).getReg());
390 if(MI->getOperand(MI->getNumOperands()-1).isImm())
391 DecodePSHUFMask(MVT::v8i32,
392 MI->getOperand(MI->getNumOperands()-1).getImm(),
398 case X86::VPSHUFHWri:
399 Src1Name = getRegName(MI->getOperand(1).getReg());
402 case X86::VPSHUFHWmi:
403 DestName = getRegName(MI->getOperand(0).getReg());
404 if(MI->getOperand(MI->getNumOperands()-1).isImm())
405 DecodePSHUFHWMask(MVT::v8i16,
406 MI->getOperand(MI->getNumOperands()-1).getImm(),
409 case X86::VPSHUFHWYri:
410 Src1Name = getRegName(MI->getOperand(1).getReg());
412 case X86::VPSHUFHWYmi:
413 DestName = getRegName(MI->getOperand(0).getReg());
414 if(MI->getOperand(MI->getNumOperands()-1).isImm())
415 DecodePSHUFHWMask(MVT::v16i16,
416 MI->getOperand(MI->getNumOperands()-1).getImm(),
420 case X86::VPSHUFLWri:
421 Src1Name = getRegName(MI->getOperand(1).getReg());
424 case X86::VPSHUFLWmi:
425 DestName = getRegName(MI->getOperand(0).getReg());
426 if(MI->getOperand(MI->getNumOperands()-1).isImm())
427 DecodePSHUFLWMask(MVT::v8i16,
428 MI->getOperand(MI->getNumOperands()-1).getImm(),
431 case X86::VPSHUFLWYri:
432 Src1Name = getRegName(MI->getOperand(1).getReg());
434 case X86::VPSHUFLWYmi:
435 DestName = getRegName(MI->getOperand(0).getReg());
436 if(MI->getOperand(MI->getNumOperands()-1).isImm())
437 DecodePSHUFLWMask(MVT::v16i16,
438 MI->getOperand(MI->getNumOperands()-1).getImm(),
442 case X86::PUNPCKHBWrr:
443 case X86::VPUNPCKHBWrr:
444 Src2Name = getRegName(MI->getOperand(2).getReg());
446 case X86::PUNPCKHBWrm:
447 case X86::VPUNPCKHBWrm:
448 Src1Name = getRegName(MI->getOperand(1).getReg());
449 DestName = getRegName(MI->getOperand(0).getReg());
450 DecodeUNPCKHMask(MVT::v16i8, ShuffleMask);
452 case X86::VPUNPCKHBWYrr:
453 Src2Name = getRegName(MI->getOperand(2).getReg());
455 case X86::VPUNPCKHBWYrm:
456 Src1Name = getRegName(MI->getOperand(1).getReg());
457 DestName = getRegName(MI->getOperand(0).getReg());
458 DecodeUNPCKHMask(MVT::v32i8, ShuffleMask);
460 case X86::PUNPCKHWDrr:
461 case X86::VPUNPCKHWDrr:
462 Src2Name = getRegName(MI->getOperand(2).getReg());
464 case X86::PUNPCKHWDrm:
465 case X86::VPUNPCKHWDrm:
466 Src1Name = getRegName(MI->getOperand(1).getReg());
467 DestName = getRegName(MI->getOperand(0).getReg());
468 DecodeUNPCKHMask(MVT::v8i16, ShuffleMask);
470 case X86::VPUNPCKHWDYrr:
471 Src2Name = getRegName(MI->getOperand(2).getReg());
473 case X86::VPUNPCKHWDYrm:
474 Src1Name = getRegName(MI->getOperand(1).getReg());
475 DestName = getRegName(MI->getOperand(0).getReg());
476 DecodeUNPCKHMask(MVT::v16i16, ShuffleMask);
478 case X86::PUNPCKHDQrr:
479 case X86::VPUNPCKHDQrr:
480 Src2Name = getRegName(MI->getOperand(2).getReg());
482 case X86::PUNPCKHDQrm:
483 case X86::VPUNPCKHDQrm:
484 Src1Name = getRegName(MI->getOperand(1).getReg());
485 DestName = getRegName(MI->getOperand(0).getReg());
486 DecodeUNPCKHMask(MVT::v4i32, ShuffleMask);
488 case X86::VPUNPCKHDQYrr:
489 Src2Name = getRegName(MI->getOperand(2).getReg());
491 case X86::VPUNPCKHDQYrm:
492 Src1Name = getRegName(MI->getOperand(1).getReg());
493 DestName = getRegName(MI->getOperand(0).getReg());
494 DecodeUNPCKHMask(MVT::v8i32, ShuffleMask);
496 case X86::VPUNPCKHDQZrr:
497 Src2Name = getRegName(MI->getOperand(2).getReg());
499 case X86::VPUNPCKHDQZrm:
500 Src1Name = getRegName(MI->getOperand(1).getReg());
501 DestName = getRegName(MI->getOperand(0).getReg());
502 DecodeUNPCKHMask(MVT::v16i32, ShuffleMask);
504 case X86::PUNPCKHQDQrr:
505 case X86::VPUNPCKHQDQrr:
506 Src2Name = getRegName(MI->getOperand(2).getReg());
508 case X86::PUNPCKHQDQrm:
509 case X86::VPUNPCKHQDQrm:
510 Src1Name = getRegName(MI->getOperand(1).getReg());
511 DestName = getRegName(MI->getOperand(0).getReg());
512 DecodeUNPCKHMask(MVT::v2i64, ShuffleMask);
514 case X86::VPUNPCKHQDQYrr:
515 Src2Name = getRegName(MI->getOperand(2).getReg());
517 case X86::VPUNPCKHQDQYrm:
518 Src1Name = getRegName(MI->getOperand(1).getReg());
519 DestName = getRegName(MI->getOperand(0).getReg());
520 DecodeUNPCKHMask(MVT::v4i64, ShuffleMask);
522 case X86::VPUNPCKHQDQZrr:
523 Src2Name = getRegName(MI->getOperand(2).getReg());
525 case X86::VPUNPCKHQDQZrm:
526 Src1Name = getRegName(MI->getOperand(1).getReg());
527 DestName = getRegName(MI->getOperand(0).getReg());
528 DecodeUNPCKHMask(MVT::v8i64, ShuffleMask);
531 case X86::PUNPCKLBWrr:
532 case X86::VPUNPCKLBWrr:
533 Src2Name = getRegName(MI->getOperand(2).getReg());
535 case X86::PUNPCKLBWrm:
536 case X86::VPUNPCKLBWrm:
537 Src1Name = getRegName(MI->getOperand(1).getReg());
538 DestName = getRegName(MI->getOperand(0).getReg());
539 DecodeUNPCKLMask(MVT::v16i8, ShuffleMask);
541 case X86::VPUNPCKLBWYrr:
542 Src2Name = getRegName(MI->getOperand(2).getReg());
544 case X86::VPUNPCKLBWYrm:
545 Src1Name = getRegName(MI->getOperand(1).getReg());
546 DestName = getRegName(MI->getOperand(0).getReg());
547 DecodeUNPCKLMask(MVT::v32i8, ShuffleMask);
549 case X86::PUNPCKLWDrr:
550 case X86::VPUNPCKLWDrr:
551 Src2Name = getRegName(MI->getOperand(2).getReg());
553 case X86::PUNPCKLWDrm:
554 case X86::VPUNPCKLWDrm:
555 Src1Name = getRegName(MI->getOperand(1).getReg());
556 DestName = getRegName(MI->getOperand(0).getReg());
557 DecodeUNPCKLMask(MVT::v8i16, ShuffleMask);
559 case X86::VPUNPCKLWDYrr:
560 Src2Name = getRegName(MI->getOperand(2).getReg());
562 case X86::VPUNPCKLWDYrm:
563 Src1Name = getRegName(MI->getOperand(1).getReg());
564 DestName = getRegName(MI->getOperand(0).getReg());
565 DecodeUNPCKLMask(MVT::v16i16, ShuffleMask);
567 case X86::PUNPCKLDQrr:
568 case X86::VPUNPCKLDQrr:
569 Src2Name = getRegName(MI->getOperand(2).getReg());
571 case X86::PUNPCKLDQrm:
572 case X86::VPUNPCKLDQrm:
573 Src1Name = getRegName(MI->getOperand(1).getReg());
574 DestName = getRegName(MI->getOperand(0).getReg());
575 DecodeUNPCKLMask(MVT::v4i32, ShuffleMask);
577 case X86::VPUNPCKLDQYrr:
578 Src2Name = getRegName(MI->getOperand(2).getReg());
580 case X86::VPUNPCKLDQYrm:
581 Src1Name = getRegName(MI->getOperand(1).getReg());
582 DestName = getRegName(MI->getOperand(0).getReg());
583 DecodeUNPCKLMask(MVT::v8i32, ShuffleMask);
585 case X86::VPUNPCKLDQZrr:
586 Src2Name = getRegName(MI->getOperand(2).getReg());
588 case X86::VPUNPCKLDQZrm:
589 Src1Name = getRegName(MI->getOperand(1).getReg());
590 DestName = getRegName(MI->getOperand(0).getReg());
591 DecodeUNPCKLMask(MVT::v16i32, ShuffleMask);
593 case X86::PUNPCKLQDQrr:
594 case X86::VPUNPCKLQDQrr:
595 Src2Name = getRegName(MI->getOperand(2).getReg());
597 case X86::PUNPCKLQDQrm:
598 case X86::VPUNPCKLQDQrm:
599 Src1Name = getRegName(MI->getOperand(1).getReg());
600 DestName = getRegName(MI->getOperand(0).getReg());
601 DecodeUNPCKLMask(MVT::v2i64, ShuffleMask);
603 case X86::VPUNPCKLQDQYrr:
604 Src2Name = getRegName(MI->getOperand(2).getReg());
606 case X86::VPUNPCKLQDQYrm:
607 Src1Name = getRegName(MI->getOperand(1).getReg());
608 DestName = getRegName(MI->getOperand(0).getReg());
609 DecodeUNPCKLMask(MVT::v4i64, ShuffleMask);
611 case X86::VPUNPCKLQDQZrr:
612 Src2Name = getRegName(MI->getOperand(2).getReg());
614 case X86::VPUNPCKLQDQZrm:
615 Src1Name = getRegName(MI->getOperand(1).getReg());
616 DestName = getRegName(MI->getOperand(0).getReg());
617 DecodeUNPCKLMask(MVT::v8i64, ShuffleMask);
621 case X86::VSHUFPDrri:
622 Src2Name = getRegName(MI->getOperand(2).getReg());
625 case X86::VSHUFPDrmi:
626 if(MI->getOperand(MI->getNumOperands()-1).isImm())
627 DecodeSHUFPMask(MVT::v2f64,
628 MI->getOperand(MI->getNumOperands()-1).getImm(),
630 Src1Name = getRegName(MI->getOperand(1).getReg());
631 DestName = getRegName(MI->getOperand(0).getReg());
633 case X86::VSHUFPDYrri:
634 Src2Name = getRegName(MI->getOperand(2).getReg());
636 case X86::VSHUFPDYrmi:
637 if(MI->getOperand(MI->getNumOperands()-1).isImm())
638 DecodeSHUFPMask(MVT::v4f64,
639 MI->getOperand(MI->getNumOperands()-1).getImm(),
641 Src1Name = getRegName(MI->getOperand(1).getReg());
642 DestName = getRegName(MI->getOperand(0).getReg());
646 case X86::VSHUFPSrri:
647 Src2Name = getRegName(MI->getOperand(2).getReg());
650 case X86::VSHUFPSrmi:
651 if(MI->getOperand(MI->getNumOperands()-1).isImm())
652 DecodeSHUFPMask(MVT::v4f32,
653 MI->getOperand(MI->getNumOperands()-1).getImm(),
655 Src1Name = getRegName(MI->getOperand(1).getReg());
656 DestName = getRegName(MI->getOperand(0).getReg());
658 case X86::VSHUFPSYrri:
659 Src2Name = getRegName(MI->getOperand(2).getReg());
661 case X86::VSHUFPSYrmi:
662 if(MI->getOperand(MI->getNumOperands()-1).isImm())
663 DecodeSHUFPMask(MVT::v8f32,
664 MI->getOperand(MI->getNumOperands()-1).getImm(),
666 Src1Name = getRegName(MI->getOperand(1).getReg());
667 DestName = getRegName(MI->getOperand(0).getReg());
670 case X86::UNPCKLPDrr:
671 case X86::VUNPCKLPDrr:
672 Src2Name = getRegName(MI->getOperand(2).getReg());
674 case X86::UNPCKLPDrm:
675 case X86::VUNPCKLPDrm:
676 DecodeUNPCKLMask(MVT::v2f64, ShuffleMask);
677 Src1Name = getRegName(MI->getOperand(1).getReg());
678 DestName = getRegName(MI->getOperand(0).getReg());
680 case X86::VUNPCKLPDYrr:
681 Src2Name = getRegName(MI->getOperand(2).getReg());
683 case X86::VUNPCKLPDYrm:
684 DecodeUNPCKLMask(MVT::v4f64, ShuffleMask);
685 Src1Name = getRegName(MI->getOperand(1).getReg());
686 DestName = getRegName(MI->getOperand(0).getReg());
688 case X86::VUNPCKLPDZrr:
689 Src2Name = getRegName(MI->getOperand(2).getReg());
691 case X86::VUNPCKLPDZrm:
692 DecodeUNPCKLMask(MVT::v8f64, ShuffleMask);
693 Src1Name = getRegName(MI->getOperand(1).getReg());
694 DestName = getRegName(MI->getOperand(0).getReg());
696 case X86::UNPCKLPSrr:
697 case X86::VUNPCKLPSrr:
698 Src2Name = getRegName(MI->getOperand(2).getReg());
700 case X86::UNPCKLPSrm:
701 case X86::VUNPCKLPSrm:
702 DecodeUNPCKLMask(MVT::v4f32, ShuffleMask);
703 Src1Name = getRegName(MI->getOperand(1).getReg());
704 DestName = getRegName(MI->getOperand(0).getReg());
706 case X86::VUNPCKLPSYrr:
707 Src2Name = getRegName(MI->getOperand(2).getReg());
709 case X86::VUNPCKLPSYrm:
710 DecodeUNPCKLMask(MVT::v8f32, ShuffleMask);
711 Src1Name = getRegName(MI->getOperand(1).getReg());
712 DestName = getRegName(MI->getOperand(0).getReg());
714 case X86::VUNPCKLPSZrr:
715 Src2Name = getRegName(MI->getOperand(2).getReg());
717 case X86::VUNPCKLPSZrm:
718 DecodeUNPCKLMask(MVT::v16f32, ShuffleMask);
719 Src1Name = getRegName(MI->getOperand(1).getReg());
720 DestName = getRegName(MI->getOperand(0).getReg());
722 case X86::UNPCKHPDrr:
723 case X86::VUNPCKHPDrr:
724 Src2Name = getRegName(MI->getOperand(2).getReg());
726 case X86::UNPCKHPDrm:
727 case X86::VUNPCKHPDrm:
728 DecodeUNPCKHMask(MVT::v2f64, ShuffleMask);
729 Src1Name = getRegName(MI->getOperand(1).getReg());
730 DestName = getRegName(MI->getOperand(0).getReg());
732 case X86::VUNPCKHPDYrr:
733 Src2Name = getRegName(MI->getOperand(2).getReg());
735 case X86::VUNPCKHPDYrm:
736 DecodeUNPCKHMask(MVT::v4f64, ShuffleMask);
737 Src1Name = getRegName(MI->getOperand(1).getReg());
738 DestName = getRegName(MI->getOperand(0).getReg());
740 case X86::VUNPCKHPDZrr:
741 Src2Name = getRegName(MI->getOperand(2).getReg());
743 case X86::VUNPCKHPDZrm:
744 DecodeUNPCKHMask(MVT::v8f64, ShuffleMask);
745 Src1Name = getRegName(MI->getOperand(1).getReg());
746 DestName = getRegName(MI->getOperand(0).getReg());
748 case X86::UNPCKHPSrr:
749 case X86::VUNPCKHPSrr:
750 Src2Name = getRegName(MI->getOperand(2).getReg());
752 case X86::UNPCKHPSrm:
753 case X86::VUNPCKHPSrm:
754 DecodeUNPCKHMask(MVT::v4f32, ShuffleMask);
755 Src1Name = getRegName(MI->getOperand(1).getReg());
756 DestName = getRegName(MI->getOperand(0).getReg());
758 case X86::VUNPCKHPSYrr:
759 Src2Name = getRegName(MI->getOperand(2).getReg());
761 case X86::VUNPCKHPSYrm:
762 DecodeUNPCKHMask(MVT::v8f32, ShuffleMask);
763 Src1Name = getRegName(MI->getOperand(1).getReg());
764 DestName = getRegName(MI->getOperand(0).getReg());
766 case X86::VUNPCKHPSZrr:
767 Src2Name = getRegName(MI->getOperand(2).getReg());
769 case X86::VUNPCKHPSZrm:
770 DecodeUNPCKHMask(MVT::v16f32, ShuffleMask);
771 Src1Name = getRegName(MI->getOperand(1).getReg());
772 DestName = getRegName(MI->getOperand(0).getReg());
774 case X86::VPERMILPSri:
775 Src1Name = getRegName(MI->getOperand(1).getReg());
777 case X86::VPERMILPSmi:
778 if(MI->getOperand(MI->getNumOperands()-1).isImm())
779 DecodePSHUFMask(MVT::v4f32,
780 MI->getOperand(MI->getNumOperands()-1).getImm(),
782 DestName = getRegName(MI->getOperand(0).getReg());
784 case X86::VPERMILPSYri:
785 Src1Name = getRegName(MI->getOperand(1).getReg());
787 case X86::VPERMILPSYmi:
788 if(MI->getOperand(MI->getNumOperands()-1).isImm())
789 DecodePSHUFMask(MVT::v8f32,
790 MI->getOperand(MI->getNumOperands()-1).getImm(),
792 DestName = getRegName(MI->getOperand(0).getReg());
794 case X86::VPERMILPDri:
795 Src1Name = getRegName(MI->getOperand(1).getReg());
797 case X86::VPERMILPDmi:
798 if(MI->getOperand(MI->getNumOperands()-1).isImm())
799 DecodePSHUFMask(MVT::v2f64,
800 MI->getOperand(MI->getNumOperands()-1).getImm(),
802 DestName = getRegName(MI->getOperand(0).getReg());
804 case X86::VPERMILPDYri:
805 Src1Name = getRegName(MI->getOperand(1).getReg());
807 case X86::VPERMILPDYmi:
808 if(MI->getOperand(MI->getNumOperands()-1).isImm())
809 DecodePSHUFMask(MVT::v4f64,
810 MI->getOperand(MI->getNumOperands()-1).getImm(),
812 DestName = getRegName(MI->getOperand(0).getReg());
814 case X86::VPERM2F128rr:
815 case X86::VPERM2I128rr:
816 Src2Name = getRegName(MI->getOperand(2).getReg());
818 case X86::VPERM2F128rm:
819 case X86::VPERM2I128rm:
820 // For instruction comments purpose, assume the 256-bit vector is v4i64.
821 if(MI->getOperand(MI->getNumOperands()-1).isImm())
822 DecodeVPERM2X128Mask(MVT::v4i64,
823 MI->getOperand(MI->getNumOperands()-1).getImm(),
825 Src1Name = getRegName(MI->getOperand(1).getReg());
826 DestName = getRegName(MI->getOperand(0).getReg());
829 case X86::VPERMPDYri:
830 Src1Name = getRegName(MI->getOperand(1).getReg());
833 case X86::VPERMPDYmi:
834 if(MI->getOperand(MI->getNumOperands()-1).isImm())
835 DecodeVPERMMask(MI->getOperand(MI->getNumOperands()-1).getImm(),
837 DestName = getRegName(MI->getOperand(0).getReg());
842 Src2Name = getRegName(MI->getOperand(2).getReg());
843 Src1Name = getRegName(MI->getOperand(1).getReg());
847 DecodeScalarMoveMask(MVT::v2f64, nullptr == Src2Name, ShuffleMask);
848 DestName = getRegName(MI->getOperand(0).getReg());
852 Src2Name = getRegName(MI->getOperand(2).getReg());
853 Src1Name = getRegName(MI->getOperand(1).getReg());
857 DecodeScalarMoveMask(MVT::v4f32, nullptr == Src2Name, ShuffleMask);
858 DestName = getRegName(MI->getOperand(0).getReg());
861 case X86::MOVPQI2QIrr:
862 case X86::MOVZPQILo2PQIrr:
863 case X86::VMOVPQI2QIrr:
864 case X86::VMOVZPQILo2PQIrr:
865 Src1Name = getRegName(MI->getOperand(1).getReg());
867 case X86::MOVQI2PQIrm:
868 case X86::MOVZQI2PQIrm:
869 case X86::MOVZPQILo2PQIrm:
870 case X86::VMOVQI2PQIrm:
871 case X86::VMOVZQI2PQIrm:
872 case X86::VMOVZPQILo2PQIrm:
873 DecodeZeroMoveLowMask(MVT::v2i64, ShuffleMask);
874 DestName = getRegName(MI->getOperand(0).getReg());
876 case X86::MOVDI2PDIrm:
877 case X86::VMOVDI2PDIrm:
878 DecodeZeroMoveLowMask(MVT::v4i32, ShuffleMask);
879 DestName = getRegName(MI->getOperand(0).getReg());
882 case X86::PMOVZXBWrr:
883 case X86::PMOVZXBDrr:
884 case X86::PMOVZXBQrr:
885 case X86::PMOVZXWDrr:
886 case X86::PMOVZXWQrr:
887 case X86::PMOVZXDQrr:
888 case X86::VPMOVZXBWrr:
889 case X86::VPMOVZXBDrr:
890 case X86::VPMOVZXBQrr:
891 case X86::VPMOVZXWDrr:
892 case X86::VPMOVZXWQrr:
893 case X86::VPMOVZXDQrr:
894 case X86::VPMOVZXBWYrr:
895 case X86::VPMOVZXBDYrr:
896 case X86::VPMOVZXBQYrr:
897 case X86::VPMOVZXWDYrr:
898 case X86::VPMOVZXWQYrr:
899 case X86::VPMOVZXDQYrr:
900 Src1Name = getRegName(MI->getOperand(1).getReg());
902 case X86::PMOVZXBWrm:
903 case X86::PMOVZXBDrm:
904 case X86::PMOVZXBQrm:
905 case X86::PMOVZXWDrm:
906 case X86::PMOVZXWQrm:
907 case X86::PMOVZXDQrm:
908 case X86::VPMOVZXBWrm:
909 case X86::VPMOVZXBDrm:
910 case X86::VPMOVZXBQrm:
911 case X86::VPMOVZXWDrm:
912 case X86::VPMOVZXWQrm:
913 case X86::VPMOVZXDQrm:
914 case X86::VPMOVZXBWYrm:
915 case X86::VPMOVZXBDYrm:
916 case X86::VPMOVZXBQYrm:
917 case X86::VPMOVZXWDYrm:
918 case X86::VPMOVZXWQYrm:
919 case X86::VPMOVZXDQYrm: {
921 getZeroExtensionTypes(MI, SrcVT, DstVT);
922 DecodeZeroExtendMask(SrcVT, DstVT, ShuffleMask);
923 DestName = getRegName(MI->getOperand(0).getReg());
927 // The only comments we decode are shuffles, so give up if we were unable to
928 // decode a shuffle mask.
929 if (ShuffleMask.empty())
932 if (!DestName) DestName = Src1Name;
933 OS << (DestName ? DestName : "mem") << " = ";
935 // If the two sources are the same, canonicalize the input elements to be
936 // from the first src so that we get larger element spans.
937 if (Src1Name == Src2Name) {
938 for (unsigned i = 0, e = ShuffleMask.size(); i != e; ++i) {
939 if ((int)ShuffleMask[i] >= 0 && // Not sentinel.
940 ShuffleMask[i] >= (int)e) // From second mask.
945 // The shuffle mask specifies which elements of the src1/src2 fill in the
946 // destination, with a few sentinel values. Loop through and print them
948 for (unsigned i = 0, e = ShuffleMask.size(); i != e; ++i) {
951 if (ShuffleMask[i] == SM_SentinelZero) {
956 // Otherwise, it must come from src1 or src2. Print the span of elements
957 // that comes from this src.
958 bool isSrc1 = ShuffleMask[i] < (int)ShuffleMask.size();
959 const char *SrcName = isSrc1 ? Src1Name : Src2Name;
960 OS << (SrcName ? SrcName : "mem") << '[';
962 while (i != e && (int)ShuffleMask[i] != SM_SentinelZero &&
963 (ShuffleMask[i] < (int)ShuffleMask.size()) == isSrc1) {
968 if (ShuffleMask[i] == SM_SentinelUndef)
971 OS << ShuffleMask[i] % ShuffleMask.size();
975 --i; // For loop increments element #.
980 // We successfully added a comment to this instruction.