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