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);
208 Src1Name = getRegName(MI->getOperand(1).getReg());
209 DestName = getRegName(MI->getOperand(0).getReg());
210 if(MI->getOperand(MI->getNumOperands()-1).isImm())
211 DecodePSLLDQMask(MVT::v16i8,
212 MI->getOperand(MI->getNumOperands()-1).getImm(),
216 case X86::VPSLLDQYri:
217 Src1Name = getRegName(MI->getOperand(1).getReg());
218 DestName = getRegName(MI->getOperand(0).getReg());
219 if(MI->getOperand(MI->getNumOperands()-1).isImm())
220 DecodePSLLDQMask(MVT::v32i8,
221 MI->getOperand(MI->getNumOperands()-1).getImm(),
227 Src1Name = getRegName(MI->getOperand(1).getReg());
228 DestName = getRegName(MI->getOperand(0).getReg());
229 if(MI->getOperand(MI->getNumOperands()-1).isImm())
230 DecodePSRLDQMask(MVT::v16i8,
231 MI->getOperand(MI->getNumOperands()-1).getImm(),
235 case X86::VPSRLDQYri:
236 Src1Name = getRegName(MI->getOperand(1).getReg());
237 DestName = getRegName(MI->getOperand(0).getReg());
238 if(MI->getOperand(MI->getNumOperands()-1).isImm())
239 DecodePSRLDQMask(MVT::v32i8,
240 MI->getOperand(MI->getNumOperands()-1).getImm(),
244 case X86::PALIGNR128rr:
245 case X86::VPALIGNR128rr:
246 Src1Name = getRegName(MI->getOperand(2).getReg());
248 case X86::PALIGNR128rm:
249 case X86::VPALIGNR128rm:
250 Src2Name = getRegName(MI->getOperand(1).getReg());
251 DestName = getRegName(MI->getOperand(0).getReg());
252 if(MI->getOperand(MI->getNumOperands()-1).isImm())
253 DecodePALIGNRMask(MVT::v16i8,
254 MI->getOperand(MI->getNumOperands()-1).getImm(),
257 case X86::VPALIGNR256rr:
258 Src1Name = getRegName(MI->getOperand(2).getReg());
260 case X86::VPALIGNR256rm:
261 Src2Name = getRegName(MI->getOperand(1).getReg());
262 DestName = getRegName(MI->getOperand(0).getReg());
263 if(MI->getOperand(MI->getNumOperands()-1).isImm())
264 DecodePALIGNRMask(MVT::v32i8,
265 MI->getOperand(MI->getNumOperands()-1).getImm(),
271 Src1Name = getRegName(MI->getOperand(1).getReg());
275 DestName = getRegName(MI->getOperand(0).getReg());
276 if(MI->getOperand(MI->getNumOperands()-1).isImm())
277 DecodePSHUFMask(MVT::v4i32,
278 MI->getOperand(MI->getNumOperands()-1).getImm(),
281 case X86::VPSHUFDYri:
282 Src1Name = getRegName(MI->getOperand(1).getReg());
284 case X86::VPSHUFDYmi:
285 DestName = getRegName(MI->getOperand(0).getReg());
286 if(MI->getOperand(MI->getNumOperands()-1).isImm())
287 DecodePSHUFMask(MVT::v8i32,
288 MI->getOperand(MI->getNumOperands()-1).getImm(),
294 case X86::VPSHUFHWri:
295 Src1Name = getRegName(MI->getOperand(1).getReg());
298 case X86::VPSHUFHWmi:
299 DestName = getRegName(MI->getOperand(0).getReg());
300 if(MI->getOperand(MI->getNumOperands()-1).isImm())
301 DecodePSHUFHWMask(MVT::v8i16,
302 MI->getOperand(MI->getNumOperands()-1).getImm(),
305 case X86::VPSHUFHWYri:
306 Src1Name = getRegName(MI->getOperand(1).getReg());
308 case X86::VPSHUFHWYmi:
309 DestName = getRegName(MI->getOperand(0).getReg());
310 if(MI->getOperand(MI->getNumOperands()-1).isImm())
311 DecodePSHUFHWMask(MVT::v16i16,
312 MI->getOperand(MI->getNumOperands()-1).getImm(),
316 case X86::VPSHUFLWri:
317 Src1Name = getRegName(MI->getOperand(1).getReg());
320 case X86::VPSHUFLWmi:
321 DestName = getRegName(MI->getOperand(0).getReg());
322 if(MI->getOperand(MI->getNumOperands()-1).isImm())
323 DecodePSHUFLWMask(MVT::v8i16,
324 MI->getOperand(MI->getNumOperands()-1).getImm(),
327 case X86::VPSHUFLWYri:
328 Src1Name = getRegName(MI->getOperand(1).getReg());
330 case X86::VPSHUFLWYmi:
331 DestName = getRegName(MI->getOperand(0).getReg());
332 if(MI->getOperand(MI->getNumOperands()-1).isImm())
333 DecodePSHUFLWMask(MVT::v16i16,
334 MI->getOperand(MI->getNumOperands()-1).getImm(),
338 case X86::PUNPCKHBWrr:
339 case X86::VPUNPCKHBWrr:
340 Src2Name = getRegName(MI->getOperand(2).getReg());
342 case X86::PUNPCKHBWrm:
343 case X86::VPUNPCKHBWrm:
344 Src1Name = getRegName(MI->getOperand(1).getReg());
345 DestName = getRegName(MI->getOperand(0).getReg());
346 DecodeUNPCKHMask(MVT::v16i8, ShuffleMask);
348 case X86::VPUNPCKHBWYrr:
349 Src2Name = getRegName(MI->getOperand(2).getReg());
351 case X86::VPUNPCKHBWYrm:
352 Src1Name = getRegName(MI->getOperand(1).getReg());
353 DestName = getRegName(MI->getOperand(0).getReg());
354 DecodeUNPCKHMask(MVT::v32i8, ShuffleMask);
356 case X86::PUNPCKHWDrr:
357 case X86::VPUNPCKHWDrr:
358 Src2Name = getRegName(MI->getOperand(2).getReg());
360 case X86::PUNPCKHWDrm:
361 case X86::VPUNPCKHWDrm:
362 Src1Name = getRegName(MI->getOperand(1).getReg());
363 DestName = getRegName(MI->getOperand(0).getReg());
364 DecodeUNPCKHMask(MVT::v8i16, ShuffleMask);
366 case X86::VPUNPCKHWDYrr:
367 Src2Name = getRegName(MI->getOperand(2).getReg());
369 case X86::VPUNPCKHWDYrm:
370 Src1Name = getRegName(MI->getOperand(1).getReg());
371 DestName = getRegName(MI->getOperand(0).getReg());
372 DecodeUNPCKHMask(MVT::v16i16, ShuffleMask);
374 case X86::PUNPCKHDQrr:
375 case X86::VPUNPCKHDQrr:
376 Src2Name = getRegName(MI->getOperand(2).getReg());
378 case X86::PUNPCKHDQrm:
379 case X86::VPUNPCKHDQrm:
380 Src1Name = getRegName(MI->getOperand(1).getReg());
381 DestName = getRegName(MI->getOperand(0).getReg());
382 DecodeUNPCKHMask(MVT::v4i32, ShuffleMask);
384 case X86::VPUNPCKHDQYrr:
385 Src2Name = getRegName(MI->getOperand(2).getReg());
387 case X86::VPUNPCKHDQYrm:
388 Src1Name = getRegName(MI->getOperand(1).getReg());
389 DestName = getRegName(MI->getOperand(0).getReg());
390 DecodeUNPCKHMask(MVT::v8i32, ShuffleMask);
392 case X86::VPUNPCKHDQZrr:
393 Src2Name = getRegName(MI->getOperand(2).getReg());
395 case X86::VPUNPCKHDQZrm:
396 Src1Name = getRegName(MI->getOperand(1).getReg());
397 DestName = getRegName(MI->getOperand(0).getReg());
398 DecodeUNPCKHMask(MVT::v16i32, ShuffleMask);
400 case X86::PUNPCKHQDQrr:
401 case X86::VPUNPCKHQDQrr:
402 Src2Name = getRegName(MI->getOperand(2).getReg());
404 case X86::PUNPCKHQDQrm:
405 case X86::VPUNPCKHQDQrm:
406 Src1Name = getRegName(MI->getOperand(1).getReg());
407 DestName = getRegName(MI->getOperand(0).getReg());
408 DecodeUNPCKHMask(MVT::v2i64, ShuffleMask);
410 case X86::VPUNPCKHQDQYrr:
411 Src2Name = getRegName(MI->getOperand(2).getReg());
413 case X86::VPUNPCKHQDQYrm:
414 Src1Name = getRegName(MI->getOperand(1).getReg());
415 DestName = getRegName(MI->getOperand(0).getReg());
416 DecodeUNPCKHMask(MVT::v4i64, ShuffleMask);
418 case X86::VPUNPCKHQDQZrr:
419 Src2Name = getRegName(MI->getOperand(2).getReg());
421 case X86::VPUNPCKHQDQZrm:
422 Src1Name = getRegName(MI->getOperand(1).getReg());
423 DestName = getRegName(MI->getOperand(0).getReg());
424 DecodeUNPCKHMask(MVT::v8i64, ShuffleMask);
427 case X86::PUNPCKLBWrr:
428 case X86::VPUNPCKLBWrr:
429 Src2Name = getRegName(MI->getOperand(2).getReg());
431 case X86::PUNPCKLBWrm:
432 case X86::VPUNPCKLBWrm:
433 Src1Name = getRegName(MI->getOperand(1).getReg());
434 DestName = getRegName(MI->getOperand(0).getReg());
435 DecodeUNPCKLMask(MVT::v16i8, ShuffleMask);
437 case X86::VPUNPCKLBWYrr:
438 Src2Name = getRegName(MI->getOperand(2).getReg());
440 case X86::VPUNPCKLBWYrm:
441 Src1Name = getRegName(MI->getOperand(1).getReg());
442 DestName = getRegName(MI->getOperand(0).getReg());
443 DecodeUNPCKLMask(MVT::v32i8, ShuffleMask);
445 case X86::PUNPCKLWDrr:
446 case X86::VPUNPCKLWDrr:
447 Src2Name = getRegName(MI->getOperand(2).getReg());
449 case X86::PUNPCKLWDrm:
450 case X86::VPUNPCKLWDrm:
451 Src1Name = getRegName(MI->getOperand(1).getReg());
452 DestName = getRegName(MI->getOperand(0).getReg());
453 DecodeUNPCKLMask(MVT::v8i16, ShuffleMask);
455 case X86::VPUNPCKLWDYrr:
456 Src2Name = getRegName(MI->getOperand(2).getReg());
458 case X86::VPUNPCKLWDYrm:
459 Src1Name = getRegName(MI->getOperand(1).getReg());
460 DestName = getRegName(MI->getOperand(0).getReg());
461 DecodeUNPCKLMask(MVT::v16i16, ShuffleMask);
463 case X86::PUNPCKLDQrr:
464 case X86::VPUNPCKLDQrr:
465 Src2Name = getRegName(MI->getOperand(2).getReg());
467 case X86::PUNPCKLDQrm:
468 case X86::VPUNPCKLDQrm:
469 Src1Name = getRegName(MI->getOperand(1).getReg());
470 DestName = getRegName(MI->getOperand(0).getReg());
471 DecodeUNPCKLMask(MVT::v4i32, ShuffleMask);
473 case X86::VPUNPCKLDQYrr:
474 Src2Name = getRegName(MI->getOperand(2).getReg());
476 case X86::VPUNPCKLDQYrm:
477 Src1Name = getRegName(MI->getOperand(1).getReg());
478 DestName = getRegName(MI->getOperand(0).getReg());
479 DecodeUNPCKLMask(MVT::v8i32, ShuffleMask);
481 case X86::VPUNPCKLDQZrr:
482 Src2Name = getRegName(MI->getOperand(2).getReg());
484 case X86::VPUNPCKLDQZrm:
485 Src1Name = getRegName(MI->getOperand(1).getReg());
486 DestName = getRegName(MI->getOperand(0).getReg());
487 DecodeUNPCKLMask(MVT::v16i32, ShuffleMask);
489 case X86::PUNPCKLQDQrr:
490 case X86::VPUNPCKLQDQrr:
491 Src2Name = getRegName(MI->getOperand(2).getReg());
493 case X86::PUNPCKLQDQrm:
494 case X86::VPUNPCKLQDQrm:
495 Src1Name = getRegName(MI->getOperand(1).getReg());
496 DestName = getRegName(MI->getOperand(0).getReg());
497 DecodeUNPCKLMask(MVT::v2i64, ShuffleMask);
499 case X86::VPUNPCKLQDQYrr:
500 Src2Name = getRegName(MI->getOperand(2).getReg());
502 case X86::VPUNPCKLQDQYrm:
503 Src1Name = getRegName(MI->getOperand(1).getReg());
504 DestName = getRegName(MI->getOperand(0).getReg());
505 DecodeUNPCKLMask(MVT::v4i64, ShuffleMask);
507 case X86::VPUNPCKLQDQZrr:
508 Src2Name = getRegName(MI->getOperand(2).getReg());
510 case X86::VPUNPCKLQDQZrm:
511 Src1Name = getRegName(MI->getOperand(1).getReg());
512 DestName = getRegName(MI->getOperand(0).getReg());
513 DecodeUNPCKLMask(MVT::v8i64, ShuffleMask);
517 case X86::VSHUFPDrri:
518 Src2Name = getRegName(MI->getOperand(2).getReg());
521 case X86::VSHUFPDrmi:
522 if(MI->getOperand(MI->getNumOperands()-1).isImm())
523 DecodeSHUFPMask(MVT::v2f64,
524 MI->getOperand(MI->getNumOperands()-1).getImm(),
526 Src1Name = getRegName(MI->getOperand(1).getReg());
527 DestName = getRegName(MI->getOperand(0).getReg());
529 case X86::VSHUFPDYrri:
530 Src2Name = getRegName(MI->getOperand(2).getReg());
532 case X86::VSHUFPDYrmi:
533 if(MI->getOperand(MI->getNumOperands()-1).isImm())
534 DecodeSHUFPMask(MVT::v4f64,
535 MI->getOperand(MI->getNumOperands()-1).getImm(),
537 Src1Name = getRegName(MI->getOperand(1).getReg());
538 DestName = getRegName(MI->getOperand(0).getReg());
542 case X86::VSHUFPSrri:
543 Src2Name = getRegName(MI->getOperand(2).getReg());
546 case X86::VSHUFPSrmi:
547 if(MI->getOperand(MI->getNumOperands()-1).isImm())
548 DecodeSHUFPMask(MVT::v4f32,
549 MI->getOperand(MI->getNumOperands()-1).getImm(),
551 Src1Name = getRegName(MI->getOperand(1).getReg());
552 DestName = getRegName(MI->getOperand(0).getReg());
554 case X86::VSHUFPSYrri:
555 Src2Name = getRegName(MI->getOperand(2).getReg());
557 case X86::VSHUFPSYrmi:
558 if(MI->getOperand(MI->getNumOperands()-1).isImm())
559 DecodeSHUFPMask(MVT::v8f32,
560 MI->getOperand(MI->getNumOperands()-1).getImm(),
562 Src1Name = getRegName(MI->getOperand(1).getReg());
563 DestName = getRegName(MI->getOperand(0).getReg());
566 case X86::UNPCKLPDrr:
567 case X86::VUNPCKLPDrr:
568 Src2Name = getRegName(MI->getOperand(2).getReg());
570 case X86::UNPCKLPDrm:
571 case X86::VUNPCKLPDrm:
572 DecodeUNPCKLMask(MVT::v2f64, ShuffleMask);
573 Src1Name = getRegName(MI->getOperand(1).getReg());
574 DestName = getRegName(MI->getOperand(0).getReg());
576 case X86::VUNPCKLPDYrr:
577 Src2Name = getRegName(MI->getOperand(2).getReg());
579 case X86::VUNPCKLPDYrm:
580 DecodeUNPCKLMask(MVT::v4f64, ShuffleMask);
581 Src1Name = getRegName(MI->getOperand(1).getReg());
582 DestName = getRegName(MI->getOperand(0).getReg());
584 case X86::VUNPCKLPDZrr:
585 Src2Name = getRegName(MI->getOperand(2).getReg());
587 case X86::VUNPCKLPDZrm:
588 DecodeUNPCKLMask(MVT::v8f64, ShuffleMask);
589 Src1Name = getRegName(MI->getOperand(1).getReg());
590 DestName = getRegName(MI->getOperand(0).getReg());
592 case X86::UNPCKLPSrr:
593 case X86::VUNPCKLPSrr:
594 Src2Name = getRegName(MI->getOperand(2).getReg());
596 case X86::UNPCKLPSrm:
597 case X86::VUNPCKLPSrm:
598 DecodeUNPCKLMask(MVT::v4f32, ShuffleMask);
599 Src1Name = getRegName(MI->getOperand(1).getReg());
600 DestName = getRegName(MI->getOperand(0).getReg());
602 case X86::VUNPCKLPSYrr:
603 Src2Name = getRegName(MI->getOperand(2).getReg());
605 case X86::VUNPCKLPSYrm:
606 DecodeUNPCKLMask(MVT::v8f32, ShuffleMask);
607 Src1Name = getRegName(MI->getOperand(1).getReg());
608 DestName = getRegName(MI->getOperand(0).getReg());
610 case X86::VUNPCKLPSZrr:
611 Src2Name = getRegName(MI->getOperand(2).getReg());
613 case X86::VUNPCKLPSZrm:
614 DecodeUNPCKLMask(MVT::v16f32, ShuffleMask);
615 Src1Name = getRegName(MI->getOperand(1).getReg());
616 DestName = getRegName(MI->getOperand(0).getReg());
618 case X86::UNPCKHPDrr:
619 case X86::VUNPCKHPDrr:
620 Src2Name = getRegName(MI->getOperand(2).getReg());
622 case X86::UNPCKHPDrm:
623 case X86::VUNPCKHPDrm:
624 DecodeUNPCKHMask(MVT::v2f64, ShuffleMask);
625 Src1Name = getRegName(MI->getOperand(1).getReg());
626 DestName = getRegName(MI->getOperand(0).getReg());
628 case X86::VUNPCKHPDYrr:
629 Src2Name = getRegName(MI->getOperand(2).getReg());
631 case X86::VUNPCKHPDYrm:
632 DecodeUNPCKHMask(MVT::v4f64, ShuffleMask);
633 Src1Name = getRegName(MI->getOperand(1).getReg());
634 DestName = getRegName(MI->getOperand(0).getReg());
636 case X86::VUNPCKHPDZrr:
637 Src2Name = getRegName(MI->getOperand(2).getReg());
639 case X86::VUNPCKHPDZrm:
640 DecodeUNPCKHMask(MVT::v8f64, ShuffleMask);
641 Src1Name = getRegName(MI->getOperand(1).getReg());
642 DestName = getRegName(MI->getOperand(0).getReg());
644 case X86::UNPCKHPSrr:
645 case X86::VUNPCKHPSrr:
646 Src2Name = getRegName(MI->getOperand(2).getReg());
648 case X86::UNPCKHPSrm:
649 case X86::VUNPCKHPSrm:
650 DecodeUNPCKHMask(MVT::v4f32, ShuffleMask);
651 Src1Name = getRegName(MI->getOperand(1).getReg());
652 DestName = getRegName(MI->getOperand(0).getReg());
654 case X86::VUNPCKHPSYrr:
655 Src2Name = getRegName(MI->getOperand(2).getReg());
657 case X86::VUNPCKHPSYrm:
658 DecodeUNPCKHMask(MVT::v8f32, ShuffleMask);
659 Src1Name = getRegName(MI->getOperand(1).getReg());
660 DestName = getRegName(MI->getOperand(0).getReg());
662 case X86::VUNPCKHPSZrr:
663 Src2Name = getRegName(MI->getOperand(2).getReg());
665 case X86::VUNPCKHPSZrm:
666 DecodeUNPCKHMask(MVT::v16f32, ShuffleMask);
667 Src1Name = getRegName(MI->getOperand(1).getReg());
668 DestName = getRegName(MI->getOperand(0).getReg());
670 case X86::VPERMILPSri:
671 Src1Name = getRegName(MI->getOperand(1).getReg());
673 case X86::VPERMILPSmi:
674 if(MI->getOperand(MI->getNumOperands()-1).isImm())
675 DecodePSHUFMask(MVT::v4f32,
676 MI->getOperand(MI->getNumOperands()-1).getImm(),
678 DestName = getRegName(MI->getOperand(0).getReg());
680 case X86::VPERMILPSYri:
681 Src1Name = getRegName(MI->getOperand(1).getReg());
683 case X86::VPERMILPSYmi:
684 if(MI->getOperand(MI->getNumOperands()-1).isImm())
685 DecodePSHUFMask(MVT::v8f32,
686 MI->getOperand(MI->getNumOperands()-1).getImm(),
688 DestName = getRegName(MI->getOperand(0).getReg());
690 case X86::VPERMILPDri:
691 Src1Name = getRegName(MI->getOperand(1).getReg());
693 case X86::VPERMILPDmi:
694 if(MI->getOperand(MI->getNumOperands()-1).isImm())
695 DecodePSHUFMask(MVT::v2f64,
696 MI->getOperand(MI->getNumOperands()-1).getImm(),
698 DestName = getRegName(MI->getOperand(0).getReg());
700 case X86::VPERMILPDYri:
701 Src1Name = getRegName(MI->getOperand(1).getReg());
703 case X86::VPERMILPDYmi:
704 if(MI->getOperand(MI->getNumOperands()-1).isImm())
705 DecodePSHUFMask(MVT::v4f64,
706 MI->getOperand(MI->getNumOperands()-1).getImm(),
708 DestName = getRegName(MI->getOperand(0).getReg());
710 case X86::VPERM2F128rr:
711 case X86::VPERM2I128rr:
712 Src2Name = getRegName(MI->getOperand(2).getReg());
714 case X86::VPERM2F128rm:
715 case X86::VPERM2I128rm:
716 // For instruction comments purpose, assume the 256-bit vector is v4i64.
717 if(MI->getOperand(MI->getNumOperands()-1).isImm())
718 DecodeVPERM2X128Mask(MVT::v4i64,
719 MI->getOperand(MI->getNumOperands()-1).getImm(),
721 Src1Name = getRegName(MI->getOperand(1).getReg());
722 DestName = getRegName(MI->getOperand(0).getReg());
725 case X86::VPERMPDYri:
726 Src1Name = getRegName(MI->getOperand(1).getReg());
729 case X86::VPERMPDYmi:
730 if(MI->getOperand(MI->getNumOperands()-1).isImm())
731 DecodeVPERMMask(MI->getOperand(MI->getNumOperands()-1).getImm(),
733 DestName = getRegName(MI->getOperand(0).getReg());
737 // The only comments we decode are shuffles, so give up if we were unable to
738 // decode a shuffle mask.
739 if (ShuffleMask.empty())
742 if (!DestName) DestName = Src1Name;
743 OS << (DestName ? DestName : "mem") << " = ";
745 // If the two sources are the same, canonicalize the input elements to be
746 // from the first src so that we get larger element spans.
747 if (Src1Name == Src2Name) {
748 for (unsigned i = 0, e = ShuffleMask.size(); i != e; ++i) {
749 if ((int)ShuffleMask[i] >= 0 && // Not sentinel.
750 ShuffleMask[i] >= (int)e) // From second mask.
755 // The shuffle mask specifies which elements of the src1/src2 fill in the
756 // destination, with a few sentinel values. Loop through and print them
758 for (unsigned i = 0, e = ShuffleMask.size(); i != e; ++i) {
761 if (ShuffleMask[i] == SM_SentinelZero) {
766 // Otherwise, it must come from src1 or src2. Print the span of elements
767 // that comes from this src.
768 bool isSrc1 = ShuffleMask[i] < (int)ShuffleMask.size();
769 const char *SrcName = isSrc1 ? Src1Name : Src2Name;
770 OS << (SrcName ? SrcName : "mem") << '[';
772 while (i != e && (int)ShuffleMask[i] != SM_SentinelZero &&
773 (ShuffleMask[i] < (int)ShuffleMask.size()) == isSrc1) {
778 if (ShuffleMask[i] == SM_SentinelUndef)
781 OS << ShuffleMask[i] % ShuffleMask.size();
785 --i; // For loop increments element #.
790 // We successfully added a comment to this instruction.