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