1218885Sdim//===-- X86InstComments.cpp - Generate verbose-asm comments for instrs ----===//
2218885Sdim//
3218885Sdim//                     The LLVM Compiler Infrastructure
4218885Sdim//
5218885Sdim// This file is distributed under the University of Illinois Open Source
6218885Sdim// License. See LICENSE.TXT for details.
7218885Sdim//
8218885Sdim//===----------------------------------------------------------------------===//
9218885Sdim//
10218885Sdim// This defines functionality used to emit comments about X86 instructions to
11218885Sdim// an output stream for -fverbose-asm.
12218885Sdim//
13218885Sdim//===----------------------------------------------------------------------===//
14218885Sdim
15218885Sdim#include "X86InstComments.h"
16224145Sdim#include "MCTargetDesc/X86MCTargetDesc.h"
17226633Sdim#include "Utils/X86ShuffleDecode.h"
18218885Sdim#include "llvm/MC/MCInst.h"
19218885Sdim#include "llvm/Support/raw_ostream.h"
20218885Sdimusing namespace llvm;
21218885Sdim
22218885Sdim//===----------------------------------------------------------------------===//
23218885Sdim// Top Level Entrypoint
24218885Sdim//===----------------------------------------------------------------------===//
25218885Sdim
26218885Sdim/// EmitAnyX86InstComments - This function decodes x86 instructions and prints
27218885Sdim/// newline terminated strings to the specified string if desired.  This
28218885Sdim/// information is shown in disassembly dumps when verbose assembly is enabled.
29218885Sdimvoid llvm::EmitAnyX86InstComments(const MCInst *MI, raw_ostream &OS,
30218885Sdim                                  const char *(*getRegName)(unsigned)) {
31218885Sdim  // If this is a shuffle operation, the switch should fill in this state.
32234353Sdim  SmallVector<int, 8> ShuffleMask;
33218885Sdim  const char *DestName = 0, *Src1Name = 0, *Src2Name = 0;
34218885Sdim
35218885Sdim  switch (MI->getOpcode()) {
36218885Sdim  case X86::INSERTPSrr:
37234353Sdim  case X86::VINSERTPSrr:
38234353Sdim    DestName = getRegName(MI->getOperand(0).getReg());
39218885Sdim    Src1Name = getRegName(MI->getOperand(1).getReg());
40218885Sdim    Src2Name = getRegName(MI->getOperand(2).getReg());
41218885Sdim    DecodeINSERTPSMask(MI->getOperand(3).getImm(), ShuffleMask);
42218885Sdim    break;
43218885Sdim
44218885Sdim  case X86::MOVLHPSrr:
45234353Sdim  case X86::VMOVLHPSrr:
46234353Sdim    Src2Name = getRegName(MI->getOperand(2).getReg());
47234353Sdim    Src1Name = getRegName(MI->getOperand(1).getReg());
48234353Sdim    DestName = getRegName(MI->getOperand(0).getReg());
49234353Sdim    DecodeMOVLHPSMask(2, ShuffleMask);
50234353Sdim    break;
51218885Sdim
52218885Sdim  case X86::MOVHLPSrr:
53234353Sdim  case X86::VMOVHLPSrr:
54234353Sdim    Src2Name = getRegName(MI->getOperand(2).getReg());
55234353Sdim    Src1Name = getRegName(MI->getOperand(1).getReg());
56234353Sdim    DestName = getRegName(MI->getOperand(0).getReg());
57234353Sdim    DecodeMOVHLPSMask(2, ShuffleMask);
58234353Sdim    break;
59218885Sdim
60249423Sdim  case X86::PALIGNR128rr:
61249423Sdim  case X86::VPALIGNR128rr:
62249423Sdim    Src1Name = getRegName(MI->getOperand(2).getReg());
63249423Sdim    // FALL THROUGH.
64249423Sdim  case X86::PALIGNR128rm:
65249423Sdim  case X86::VPALIGNR128rm:
66249423Sdim    Src2Name = getRegName(MI->getOperand(1).getReg());
67249423Sdim    DestName = getRegName(MI->getOperand(0).getReg());
68249423Sdim    DecodePALIGNRMask(MVT::v16i8,
69249423Sdim                      MI->getOperand(MI->getNumOperands()-1).getImm(),
70249423Sdim                      ShuffleMask);
71249423Sdim    break;
72249423Sdim  case X86::VPALIGNR256rr:
73249423Sdim    Src1Name = getRegName(MI->getOperand(2).getReg());
74249423Sdim    // FALL THROUGH.
75249423Sdim  case X86::VPALIGNR256rm:
76249423Sdim    Src2Name = getRegName(MI->getOperand(1).getReg());
77249423Sdim    DestName = getRegName(MI->getOperand(0).getReg());
78249423Sdim    DecodePALIGNRMask(MVT::v32i8,
79249423Sdim                      MI->getOperand(MI->getNumOperands()-1).getImm(),
80249423Sdim                      ShuffleMask);
81249423Sdim    break;
82249423Sdim
83218885Sdim  case X86::PSHUFDri:
84234353Sdim  case X86::VPSHUFDri:
85218885Sdim    Src1Name = getRegName(MI->getOperand(1).getReg());
86218885Sdim    // FALL THROUGH.
87218885Sdim  case X86::PSHUFDmi:
88234353Sdim  case X86::VPSHUFDmi:
89218885Sdim    DestName = getRegName(MI->getOperand(0).getReg());
90234353Sdim    DecodePSHUFMask(MVT::v4i32, MI->getOperand(MI->getNumOperands()-1).getImm(),
91234353Sdim                     ShuffleMask);
92234353Sdim    break;
93234353Sdim  case X86::VPSHUFDYri:
94234353Sdim    Src1Name = getRegName(MI->getOperand(1).getReg());
95234353Sdim    // FALL THROUGH.
96234353Sdim  case X86::VPSHUFDYmi:
97234353Sdim    DestName = getRegName(MI->getOperand(0).getReg());
98234353Sdim    DecodePSHUFMask(MVT::v8i32, MI->getOperand(MI->getNumOperands()-1).getImm(),
99218885Sdim                    ShuffleMask);
100218885Sdim    break;
101218885Sdim
102234353Sdim
103218885Sdim  case X86::PSHUFHWri:
104234353Sdim  case X86::VPSHUFHWri:
105218885Sdim    Src1Name = getRegName(MI->getOperand(1).getReg());
106218885Sdim    // FALL THROUGH.
107218885Sdim  case X86::PSHUFHWmi:
108234353Sdim  case X86::VPSHUFHWmi:
109218885Sdim    DestName = getRegName(MI->getOperand(0).getReg());
110239462Sdim    DecodePSHUFHWMask(MVT::v8i16,
111239462Sdim                      MI->getOperand(MI->getNumOperands()-1).getImm(),
112218885Sdim                      ShuffleMask);
113218885Sdim    break;
114239462Sdim  case X86::VPSHUFHWYri:
115239462Sdim    Src1Name = getRegName(MI->getOperand(1).getReg());
116239462Sdim    // FALL THROUGH.
117239462Sdim  case X86::VPSHUFHWYmi:
118239462Sdim    DestName = getRegName(MI->getOperand(0).getReg());
119239462Sdim    DecodePSHUFHWMask(MVT::v16i16,
120239462Sdim                      MI->getOperand(MI->getNumOperands()-1).getImm(),
121239462Sdim                      ShuffleMask);
122239462Sdim    break;
123218885Sdim  case X86::PSHUFLWri:
124234353Sdim  case X86::VPSHUFLWri:
125218885Sdim    Src1Name = getRegName(MI->getOperand(1).getReg());
126218885Sdim    // FALL THROUGH.
127218885Sdim  case X86::PSHUFLWmi:
128234353Sdim  case X86::VPSHUFLWmi:
129218885Sdim    DestName = getRegName(MI->getOperand(0).getReg());
130239462Sdim    DecodePSHUFLWMask(MVT::v8i16,
131239462Sdim                      MI->getOperand(MI->getNumOperands()-1).getImm(),
132218885Sdim                      ShuffleMask);
133218885Sdim    break;
134239462Sdim  case X86::VPSHUFLWYri:
135239462Sdim    Src1Name = getRegName(MI->getOperand(1).getReg());
136239462Sdim    // FALL THROUGH.
137239462Sdim  case X86::VPSHUFLWYmi:
138239462Sdim    DestName = getRegName(MI->getOperand(0).getReg());
139239462Sdim    DecodePSHUFLWMask(MVT::v16i16,
140239462Sdim                      MI->getOperand(MI->getNumOperands()-1).getImm(),
141239462Sdim                      ShuffleMask);
142239462Sdim    break;
143218885Sdim
144218885Sdim  case X86::PUNPCKHBWrr:
145249423Sdim  case X86::VPUNPCKHBWrr:
146218885Sdim    Src2Name = getRegName(MI->getOperand(2).getReg());
147218885Sdim    // FALL THROUGH.
148218885Sdim  case X86::PUNPCKHBWrm:
149234353Sdim  case X86::VPUNPCKHBWrm:
150234353Sdim    Src1Name = getRegName(MI->getOperand(1).getReg());
151234353Sdim    DestName = getRegName(MI->getOperand(0).getReg());
152234353Sdim    DecodeUNPCKHMask(MVT::v16i8, ShuffleMask);
153234353Sdim    break;
154234353Sdim  case X86::VPUNPCKHBWYrr:
155234353Sdim    Src2Name = getRegName(MI->getOperand(2).getReg());
156234353Sdim    // FALL THROUGH.
157234353Sdim  case X86::VPUNPCKHBWYrm:
158234353Sdim    Src1Name = getRegName(MI->getOperand(1).getReg());
159234353Sdim    DestName = getRegName(MI->getOperand(0).getReg());
160234353Sdim    DecodeUNPCKHMask(MVT::v32i8, ShuffleMask);
161234353Sdim    break;
162218885Sdim  case X86::PUNPCKHWDrr:
163249423Sdim  case X86::VPUNPCKHWDrr:
164218885Sdim    Src2Name = getRegName(MI->getOperand(2).getReg());
165218885Sdim    // FALL THROUGH.
166218885Sdim  case X86::PUNPCKHWDrm:
167234353Sdim  case X86::VPUNPCKHWDrm:
168234353Sdim    Src1Name = getRegName(MI->getOperand(1).getReg());
169234353Sdim    DestName = getRegName(MI->getOperand(0).getReg());
170234353Sdim    DecodeUNPCKHMask(MVT::v8i16, ShuffleMask);
171234353Sdim    break;
172234353Sdim  case X86::VPUNPCKHWDYrr:
173234353Sdim    Src2Name = getRegName(MI->getOperand(2).getReg());
174234353Sdim    // FALL THROUGH.
175234353Sdim  case X86::VPUNPCKHWDYrm:
176234353Sdim    Src1Name = getRegName(MI->getOperand(1).getReg());
177234353Sdim    DestName = getRegName(MI->getOperand(0).getReg());
178234353Sdim    DecodeUNPCKHMask(MVT::v16i16, ShuffleMask);
179234353Sdim    break;
180218885Sdim  case X86::PUNPCKHDQrr:
181249423Sdim  case X86::VPUNPCKHDQrr:
182218885Sdim    Src2Name = getRegName(MI->getOperand(2).getReg());
183218885Sdim    // FALL THROUGH.
184218885Sdim  case X86::PUNPCKHDQrm:
185234353Sdim  case X86::VPUNPCKHDQrm:
186234353Sdim    Src1Name = getRegName(MI->getOperand(1).getReg());
187234353Sdim    DestName = getRegName(MI->getOperand(0).getReg());
188234353Sdim    DecodeUNPCKHMask(MVT::v4i32, ShuffleMask);
189234353Sdim    break;
190234353Sdim  case X86::VPUNPCKHDQYrr:
191234353Sdim    Src2Name = getRegName(MI->getOperand(2).getReg());
192234353Sdim    // FALL THROUGH.
193234353Sdim  case X86::VPUNPCKHDQYrm:
194234353Sdim    Src1Name = getRegName(MI->getOperand(1).getReg());
195234353Sdim    DestName = getRegName(MI->getOperand(0).getReg());
196234353Sdim    DecodeUNPCKHMask(MVT::v8i32, ShuffleMask);
197234353Sdim    break;
198218885Sdim  case X86::PUNPCKHQDQrr:
199249423Sdim  case X86::VPUNPCKHQDQrr:
200218885Sdim    Src2Name = getRegName(MI->getOperand(2).getReg());
201218885Sdim    // FALL THROUGH.
202218885Sdim  case X86::PUNPCKHQDQrm:
203234353Sdim  case X86::VPUNPCKHQDQrm:
204234353Sdim    Src1Name = getRegName(MI->getOperand(1).getReg());
205234353Sdim    DestName = getRegName(MI->getOperand(0).getReg());
206234353Sdim    DecodeUNPCKHMask(MVT::v2i64, ShuffleMask);
207234353Sdim    break;
208234353Sdim  case X86::VPUNPCKHQDQYrr:
209234353Sdim    Src2Name = getRegName(MI->getOperand(2).getReg());
210234353Sdim    // FALL THROUGH.
211234353Sdim  case X86::VPUNPCKHQDQYrm:
212234353Sdim    Src1Name = getRegName(MI->getOperand(1).getReg());
213234353Sdim    DestName = getRegName(MI->getOperand(0).getReg());
214234353Sdim    DecodeUNPCKHMask(MVT::v4i64, ShuffleMask);
215234353Sdim    break;
216218885Sdim
217218885Sdim  case X86::PUNPCKLBWrr:
218249423Sdim  case X86::VPUNPCKLBWrr:
219218885Sdim    Src2Name = getRegName(MI->getOperand(2).getReg());
220218885Sdim    // FALL THROUGH.
221218885Sdim  case X86::PUNPCKLBWrm:
222234353Sdim  case X86::VPUNPCKLBWrm:
223234353Sdim    Src1Name = getRegName(MI->getOperand(1).getReg());
224234353Sdim    DestName = getRegName(MI->getOperand(0).getReg());
225234353Sdim    DecodeUNPCKLMask(MVT::v16i8, ShuffleMask);
226234353Sdim    break;
227234353Sdim  case X86::VPUNPCKLBWYrr:
228234353Sdim    Src2Name = getRegName(MI->getOperand(2).getReg());
229234353Sdim    // FALL THROUGH.
230234353Sdim  case X86::VPUNPCKLBWYrm:
231234353Sdim    Src1Name = getRegName(MI->getOperand(1).getReg());
232234353Sdim    DestName = getRegName(MI->getOperand(0).getReg());
233234353Sdim    DecodeUNPCKLMask(MVT::v32i8, ShuffleMask);
234234353Sdim    break;
235218885Sdim  case X86::PUNPCKLWDrr:
236249423Sdim  case X86::VPUNPCKLWDrr:
237218885Sdim    Src2Name = getRegName(MI->getOperand(2).getReg());
238218885Sdim    // FALL THROUGH.
239218885Sdim  case X86::PUNPCKLWDrm:
240234353Sdim  case X86::VPUNPCKLWDrm:
241234353Sdim    Src1Name = getRegName(MI->getOperand(1).getReg());
242234353Sdim    DestName = getRegName(MI->getOperand(0).getReg());
243234353Sdim    DecodeUNPCKLMask(MVT::v8i16, ShuffleMask);
244234353Sdim    break;
245234353Sdim  case X86::VPUNPCKLWDYrr:
246234353Sdim    Src2Name = getRegName(MI->getOperand(2).getReg());
247234353Sdim    // FALL THROUGH.
248234353Sdim  case X86::VPUNPCKLWDYrm:
249234353Sdim    Src1Name = getRegName(MI->getOperand(1).getReg());
250234353Sdim    DestName = getRegName(MI->getOperand(0).getReg());
251234353Sdim    DecodeUNPCKLMask(MVT::v16i16, ShuffleMask);
252234353Sdim    break;
253218885Sdim  case X86::PUNPCKLDQrr:
254249423Sdim  case X86::VPUNPCKLDQrr:
255218885Sdim    Src2Name = getRegName(MI->getOperand(2).getReg());
256218885Sdim    // FALL THROUGH.
257218885Sdim  case X86::PUNPCKLDQrm:
258234353Sdim  case X86::VPUNPCKLDQrm:
259234353Sdim    Src1Name = getRegName(MI->getOperand(1).getReg());
260234353Sdim    DestName = getRegName(MI->getOperand(0).getReg());
261234353Sdim    DecodeUNPCKLMask(MVT::v4i32, ShuffleMask);
262234353Sdim    break;
263234353Sdim  case X86::VPUNPCKLDQYrr:
264234353Sdim    Src2Name = getRegName(MI->getOperand(2).getReg());
265234353Sdim    // FALL THROUGH.
266234353Sdim  case X86::VPUNPCKLDQYrm:
267234353Sdim    Src1Name = getRegName(MI->getOperand(1).getReg());
268234353Sdim    DestName = getRegName(MI->getOperand(0).getReg());
269234353Sdim    DecodeUNPCKLMask(MVT::v8i32, ShuffleMask);
270234353Sdim    break;
271218885Sdim  case X86::PUNPCKLQDQrr:
272249423Sdim  case X86::VPUNPCKLQDQrr:
273218885Sdim    Src2Name = getRegName(MI->getOperand(2).getReg());
274218885Sdim    // FALL THROUGH.
275218885Sdim  case X86::PUNPCKLQDQrm:
276234353Sdim  case X86::VPUNPCKLQDQrm:
277234353Sdim    Src1Name = getRegName(MI->getOperand(1).getReg());
278234353Sdim    DestName = getRegName(MI->getOperand(0).getReg());
279234353Sdim    DecodeUNPCKLMask(MVT::v2i64, ShuffleMask);
280234353Sdim    break;
281234353Sdim  case X86::VPUNPCKLQDQYrr:
282234353Sdim    Src2Name = getRegName(MI->getOperand(2).getReg());
283234353Sdim    // FALL THROUGH.
284234353Sdim  case X86::VPUNPCKLQDQYrm:
285234353Sdim    Src1Name = getRegName(MI->getOperand(1).getReg());
286234353Sdim    DestName = getRegName(MI->getOperand(0).getReg());
287234353Sdim    DecodeUNPCKLMask(MVT::v4i64, ShuffleMask);
288234353Sdim    break;
289218885Sdim
290218885Sdim  case X86::SHUFPDrri:
291249423Sdim  case X86::VSHUFPDrri:
292226633Sdim    Src2Name = getRegName(MI->getOperand(2).getReg());
293226633Sdim    // FALL THROUGH.
294226633Sdim  case X86::SHUFPDrmi:
295234353Sdim  case X86::VSHUFPDrmi:
296234353Sdim    DecodeSHUFPMask(MVT::v2f64, MI->getOperand(MI->getNumOperands()-1).getImm(),
297234353Sdim                    ShuffleMask);
298234353Sdim    Src1Name = getRegName(MI->getOperand(1).getReg());
299234353Sdim    DestName = getRegName(MI->getOperand(0).getReg());
300234353Sdim    break;
301234353Sdim  case X86::VSHUFPDYrri:
302234353Sdim    Src2Name = getRegName(MI->getOperand(2).getReg());
303234353Sdim    // FALL THROUGH.
304234353Sdim  case X86::VSHUFPDYrmi:
305234353Sdim    DecodeSHUFPMask(MVT::v4f64, MI->getOperand(MI->getNumOperands()-1).getImm(),
306234353Sdim                    ShuffleMask);
307234353Sdim    Src1Name = getRegName(MI->getOperand(1).getReg());
308234353Sdim    DestName = getRegName(MI->getOperand(0).getReg());
309234353Sdim    break;
310218885Sdim
311218885Sdim  case X86::SHUFPSrri:
312249423Sdim  case X86::VSHUFPSrri:
313218885Sdim    Src2Name = getRegName(MI->getOperand(2).getReg());
314218885Sdim    // FALL THROUGH.
315218885Sdim  case X86::SHUFPSrmi:
316234353Sdim  case X86::VSHUFPSrmi:
317234353Sdim    DecodeSHUFPMask(MVT::v4f32, MI->getOperand(MI->getNumOperands()-1).getImm(),
318234353Sdim                    ShuffleMask);
319234353Sdim    Src1Name = getRegName(MI->getOperand(1).getReg());
320234353Sdim    DestName = getRegName(MI->getOperand(0).getReg());
321234353Sdim    break;
322234353Sdim  case X86::VSHUFPSYrri:
323234353Sdim    Src2Name = getRegName(MI->getOperand(2).getReg());
324234353Sdim    // FALL THROUGH.
325234353Sdim  case X86::VSHUFPSYrmi:
326234353Sdim    DecodeSHUFPMask(MVT::v8f32, MI->getOperand(MI->getNumOperands()-1).getImm(),
327234353Sdim                    ShuffleMask);
328234353Sdim    Src1Name = getRegName(MI->getOperand(1).getReg());
329234353Sdim    DestName = getRegName(MI->getOperand(0).getReg());
330234353Sdim    break;
331218885Sdim
332218885Sdim  case X86::UNPCKLPDrr:
333249423Sdim  case X86::VUNPCKLPDrr:
334218885Sdim    Src2Name = getRegName(MI->getOperand(2).getReg());
335218885Sdim    // FALL THROUGH.
336218885Sdim  case X86::UNPCKLPDrm:
337221345Sdim  case X86::VUNPCKLPDrm:
338234353Sdim    DecodeUNPCKLMask(MVT::v2f64, ShuffleMask);
339221345Sdim    Src1Name = getRegName(MI->getOperand(1).getReg());
340234353Sdim    DestName = getRegName(MI->getOperand(0).getReg());
341221345Sdim    break;
342221345Sdim  case X86::VUNPCKLPDYrr:
343221345Sdim    Src2Name = getRegName(MI->getOperand(2).getReg());
344221345Sdim    // FALL THROUGH.
345221345Sdim  case X86::VUNPCKLPDYrm:
346234353Sdim    DecodeUNPCKLMask(MVT::v4f64, ShuffleMask);
347221345Sdim    Src1Name = getRegName(MI->getOperand(1).getReg());
348234353Sdim    DestName = getRegName(MI->getOperand(0).getReg());
349221345Sdim    break;
350218885Sdim  case X86::UNPCKLPSrr:
351249423Sdim  case X86::VUNPCKLPSrr:
352218885Sdim    Src2Name = getRegName(MI->getOperand(2).getReg());
353218885Sdim    // FALL THROUGH.
354218885Sdim  case X86::UNPCKLPSrm:
355221345Sdim  case X86::VUNPCKLPSrm:
356234353Sdim    DecodeUNPCKLMask(MVT::v4f32, ShuffleMask);
357221345Sdim    Src1Name = getRegName(MI->getOperand(1).getReg());
358234353Sdim    DestName = getRegName(MI->getOperand(0).getReg());
359221345Sdim    break;
360221345Sdim  case X86::VUNPCKLPSYrr:
361221345Sdim    Src2Name = getRegName(MI->getOperand(2).getReg());
362221345Sdim    // FALL THROUGH.
363221345Sdim  case X86::VUNPCKLPSYrm:
364234353Sdim    DecodeUNPCKLMask(MVT::v8f32, ShuffleMask);
365221345Sdim    Src1Name = getRegName(MI->getOperand(1).getReg());
366234353Sdim    DestName = getRegName(MI->getOperand(0).getReg());
367221345Sdim    break;
368218885Sdim  case X86::UNPCKHPDrr:
369249423Sdim  case X86::VUNPCKHPDrr:
370218885Sdim    Src2Name = getRegName(MI->getOperand(2).getReg());
371218885Sdim    // FALL THROUGH.
372218885Sdim  case X86::UNPCKHPDrm:
373234353Sdim  case X86::VUNPCKHPDrm:
374234353Sdim    DecodeUNPCKHMask(MVT::v2f64, ShuffleMask);
375234353Sdim    Src1Name = getRegName(MI->getOperand(1).getReg());
376234353Sdim    DestName = getRegName(MI->getOperand(0).getReg());
377234353Sdim    break;
378234353Sdim  case X86::VUNPCKHPDYrr:
379234353Sdim    Src2Name = getRegName(MI->getOperand(2).getReg());
380234353Sdim    // FALL THROUGH.
381234353Sdim  case X86::VUNPCKHPDYrm:
382234353Sdim    DecodeUNPCKHMask(MVT::v4f64, ShuffleMask);
383234353Sdim    Src1Name = getRegName(MI->getOperand(1).getReg());
384234353Sdim    DestName = getRegName(MI->getOperand(0).getReg());
385234353Sdim    break;
386218885Sdim  case X86::UNPCKHPSrr:
387249423Sdim  case X86::VUNPCKHPSrr:
388218885Sdim    Src2Name = getRegName(MI->getOperand(2).getReg());
389218885Sdim    // FALL THROUGH.
390218885Sdim  case X86::UNPCKHPSrm:
391234353Sdim  case X86::VUNPCKHPSrm:
392234353Sdim    DecodeUNPCKHMask(MVT::v4f32, ShuffleMask);
393234353Sdim    Src1Name = getRegName(MI->getOperand(1).getReg());
394234353Sdim    DestName = getRegName(MI->getOperand(0).getReg());
395234353Sdim    break;
396234353Sdim  case X86::VUNPCKHPSYrr:
397234353Sdim    Src2Name = getRegName(MI->getOperand(2).getReg());
398234353Sdim    // FALL THROUGH.
399234353Sdim  case X86::VUNPCKHPSYrm:
400234353Sdim    DecodeUNPCKHMask(MVT::v8f32, ShuffleMask);
401234353Sdim    Src1Name = getRegName(MI->getOperand(1).getReg());
402234353Sdim    DestName = getRegName(MI->getOperand(0).getReg());
403234353Sdim    break;
404226633Sdim  case X86::VPERMILPSri:
405234353Sdim    Src1Name = getRegName(MI->getOperand(1).getReg());
406234353Sdim    // FALL THROUGH.
407234353Sdim  case X86::VPERMILPSmi:
408234353Sdim    DecodePSHUFMask(MVT::v4f32, MI->getOperand(MI->getNumOperands()-1).getImm(),
409234353Sdim                    ShuffleMask);
410234353Sdim    DestName = getRegName(MI->getOperand(0).getReg());
411226633Sdim    break;
412226633Sdim  case X86::VPERMILPSYri:
413234353Sdim    Src1Name = getRegName(MI->getOperand(1).getReg());
414234353Sdim    // FALL THROUGH.
415234353Sdim  case X86::VPERMILPSYmi:
416234353Sdim    DecodePSHUFMask(MVT::v8f32, MI->getOperand(MI->getNumOperands()-1).getImm(),
417234353Sdim                    ShuffleMask);
418234353Sdim    DestName = getRegName(MI->getOperand(0).getReg());
419226633Sdim    break;
420226633Sdim  case X86::VPERMILPDri:
421234353Sdim    Src1Name = getRegName(MI->getOperand(1).getReg());
422234353Sdim    // FALL THROUGH.
423234353Sdim  case X86::VPERMILPDmi:
424234353Sdim    DecodePSHUFMask(MVT::v2f64, MI->getOperand(MI->getNumOperands()-1).getImm(),
425234353Sdim                    ShuffleMask);
426234353Sdim    DestName = getRegName(MI->getOperand(0).getReg());
427226633Sdim    break;
428226633Sdim  case X86::VPERMILPDYri:
429234353Sdim    Src1Name = getRegName(MI->getOperand(1).getReg());
430234353Sdim    // FALL THROUGH.
431234353Sdim  case X86::VPERMILPDYmi:
432234353Sdim    DecodePSHUFMask(MVT::v4f64, MI->getOperand(MI->getNumOperands()-1).getImm(),
433234353Sdim                       ShuffleMask);
434234353Sdim    DestName = getRegName(MI->getOperand(0).getReg());
435226633Sdim    break;
436226633Sdim  case X86::VPERM2F128rr:
437234353Sdim  case X86::VPERM2I128rr:
438234353Sdim    Src2Name = getRegName(MI->getOperand(2).getReg());
439234353Sdim    // FALL THROUGH.
440234353Sdim  case X86::VPERM2F128rm:
441234353Sdim  case X86::VPERM2I128rm:
442234353Sdim    // For instruction comments purpose, assume the 256-bit vector is v4i64.
443234353Sdim    DecodeVPERM2X128Mask(MVT::v4i64,
444234353Sdim                         MI->getOperand(MI->getNumOperands()-1).getImm(),
445234353Sdim                         ShuffleMask);
446226633Sdim    Src1Name = getRegName(MI->getOperand(1).getReg());
447234353Sdim    DestName = getRegName(MI->getOperand(0).getReg());
448226633Sdim    break;
449239462Sdim  case X86::VPERMQYri:
450239462Sdim  case X86::VPERMPDYri:
451239462Sdim    Src1Name = getRegName(MI->getOperand(1).getReg());
452239462Sdim    // FALL THROUGH.
453239462Sdim  case X86::VPERMQYmi:
454239462Sdim  case X86::VPERMPDYmi:
455239462Sdim    DecodeVPERMMask(MI->getOperand(MI->getNumOperands()-1).getImm(),
456239462Sdim                    ShuffleMask);
457239462Sdim    DestName = getRegName(MI->getOperand(0).getReg());
458239462Sdim    break;
459218885Sdim  }
460218885Sdim
461218885Sdim
462218885Sdim  // If this was a shuffle operation, print the shuffle mask.
463218885Sdim  if (!ShuffleMask.empty()) {
464218885Sdim    if (DestName == 0) DestName = Src1Name;
465218885Sdim    OS << (DestName ? DestName : "mem") << " = ";
466218885Sdim
467218885Sdim    // If the two sources are the same, canonicalize the input elements to be
468218885Sdim    // from the first src so that we get larger element spans.
469218885Sdim    if (Src1Name == Src2Name) {
470218885Sdim      for (unsigned i = 0, e = ShuffleMask.size(); i != e; ++i) {
471218885Sdim        if ((int)ShuffleMask[i] >= 0 && // Not sentinel.
472234353Sdim            ShuffleMask[i] >= (int)e)        // From second mask.
473218885Sdim          ShuffleMask[i] -= e;
474218885Sdim      }
475218885Sdim    }
476218885Sdim
477218885Sdim    // The shuffle mask specifies which elements of the src1/src2 fill in the
478218885Sdim    // destination, with a few sentinel values.  Loop through and print them
479218885Sdim    // out.
480218885Sdim    for (unsigned i = 0, e = ShuffleMask.size(); i != e; ++i) {
481218885Sdim      if (i != 0)
482218885Sdim        OS << ',';
483218885Sdim      if (ShuffleMask[i] == SM_SentinelZero) {
484218885Sdim        OS << "zero";
485218885Sdim        continue;
486218885Sdim      }
487218885Sdim
488218885Sdim      // Otherwise, it must come from src1 or src2.  Print the span of elements
489218885Sdim      // that comes from this src.
490234353Sdim      bool isSrc1 = ShuffleMask[i] < (int)ShuffleMask.size();
491218885Sdim      const char *SrcName = isSrc1 ? Src1Name : Src2Name;
492218885Sdim      OS << (SrcName ? SrcName : "mem") << '[';
493218885Sdim      bool IsFirst = true;
494218885Sdim      while (i != e &&
495218885Sdim             (int)ShuffleMask[i] >= 0 &&
496234353Sdim             (ShuffleMask[i] < (int)ShuffleMask.size()) == isSrc1) {
497218885Sdim        if (!IsFirst)
498218885Sdim          OS << ',';
499218885Sdim        else
500218885Sdim          IsFirst = false;
501218885Sdim        OS << ShuffleMask[i] % ShuffleMask.size();
502218885Sdim        ++i;
503218885Sdim      }
504218885Sdim      OS << ']';
505218885Sdim      --i;  // For loop increments element #.
506218885Sdim    }
507218885Sdim    //MI->print(OS, 0);
508218885Sdim    OS << "\n";
509218885Sdim  }
510218885Sdim
511218885Sdim}
512