X86InstComments.cpp revision 234353
117658Sjulian//===-- X86InstComments.cpp - Generate verbose-asm comments for instrs ----===//
217658Sjulian//
317658Sjulian//                     The LLVM Compiler Infrastructure
417658Sjulian//
517658Sjulian// This file is distributed under the University of Illinois Open Source
617658Sjulian// License. See LICENSE.TXT for details.
717658Sjulian//
817658Sjulian//===----------------------------------------------------------------------===//
917658Sjulian//
1017658Sjulian// This defines functionality used to emit comments about X86 instructions to
1117658Sjulian// an output stream for -fverbose-asm.
1217658Sjulian//
1317658Sjulian//===----------------------------------------------------------------------===//
1417658Sjulian
1517658Sjulian#include "X86InstComments.h"
1617658Sjulian#include "MCTargetDesc/X86MCTargetDesc.h"
1717658Sjulian#include "Utils/X86ShuffleDecode.h"
1817658Sjulian#include "llvm/MC/MCInst.h"
1917658Sjulian#include "llvm/Support/raw_ostream.h"
2017658Sjulianusing namespace llvm;
2117658Sjulian
2217658Sjulian//===----------------------------------------------------------------------===//
2317658Sjulian// Top Level Entrypoint
2417658Sjulian//===----------------------------------------------------------------------===//
2517658Sjulian
2617658Sjulian/// EmitAnyX86InstComments - This function decodes x86 instructions and prints
2717658Sjulian/// newline terminated strings to the specified string if desired.  This
2817658Sjulian/// information is shown in disassembly dumps when verbose assembly is enabled.
2917658Sjulianvoid llvm::EmitAnyX86InstComments(const MCInst *MI, raw_ostream &OS,
3017658Sjulian                                  const char *(*getRegName)(unsigned)) {
3117658Sjulian  // If this is a shuffle operation, the switch should fill in this state.
3217658Sjulian  SmallVector<int, 8> ShuffleMask;
3317658Sjulian  const char *DestName = 0, *Src1Name = 0, *Src2Name = 0;
3417658Sjulian
3517658Sjulian  switch (MI->getOpcode()) {
3617658Sjulian  case X86::INSERTPSrr:
37116182Sobrien    Src1Name = getRegName(MI->getOperand(0).getReg());
38116182Sobrien    Src2Name = getRegName(MI->getOperand(2).getReg());
39116182Sobrien    DecodeINSERTPSMask(MI->getOperand(3).getImm(), ShuffleMask);
40131927Smarcel    break;
41106024Srwatson  case X86::VINSERTPSrr:
4228976Sbde    DestName = getRegName(MI->getOperand(0).getReg());
4328976Sbde    Src1Name = getRegName(MI->getOperand(1).getReg());
44134649Sscottl    Src2Name = getRegName(MI->getOperand(2).getReg());
4517658Sjulian    DecodeINSERTPSMask(MI->getOperand(3).getImm(), ShuffleMask);
4617658Sjulian    break;
4717658Sjulian
4860041Sphk  case X86::MOVLHPSrr:
4931275Sbde    Src2Name = getRegName(MI->getOperand(2).getReg());
5078767Sjhb    Src1Name = getRegName(MI->getOperand(0).getReg());
5178767Sjhb    DecodeMOVLHPSMask(2, ShuffleMask);
5278767Sjhb    break;
53131927Smarcel  case X86::VMOVLHPSrr:
5417658Sjulian    Src2Name = getRegName(MI->getOperand(2).getReg());
5555539Sluoqi    Src1Name = getRegName(MI->getOperand(1).getReg());
56106024Srwatson    DestName = getRegName(MI->getOperand(0).getReg());
5789601Ssobomax    DecodeMOVLHPSMask(2, ShuffleMask);
5821776Sbde    break;
5978767Sjhb
6078767Sjhb  case X86::MOVHLPSrr:
6178767Sjhb    Src2Name = getRegName(MI->getOperand(2).getReg());
62137263Speter    Src1Name = getRegName(MI->getOperand(0).getReg());
6378767Sjhb    DecodeMOVHLPSMask(2, ShuffleMask);
6417658Sjulian    break;
6517658Sjulian  case X86::VMOVHLPSrr:
6617658Sjulian    Src2Name = getRegName(MI->getOperand(2).getReg());
67118990Smarcel    Src1Name = getRegName(MI->getOperand(1).getReg());
6894169Sphk    DestName = getRegName(MI->getOperand(0).getReg());
6991778Sjake    DecodeMOVHLPSMask(2, ShuffleMask);
7017658Sjulian    break;
7117658Sjulian
7217658Sjulian  case X86::PSHUFDri:
7317658Sjulian  case X86::VPSHUFDri:
7417658Sjulian    Src1Name = getRegName(MI->getOperand(1).getReg());
7517658Sjulian    // FALL THROUGH.
7617658Sjulian  case X86::PSHUFDmi:
7717658Sjulian  case X86::VPSHUFDmi:
7817658Sjulian    DestName = getRegName(MI->getOperand(0).getReg());
7917658Sjulian    DecodePSHUFMask(MVT::v4i32, MI->getOperand(MI->getNumOperands()-1).getImm(),
8017658Sjulian                     ShuffleMask);
8117658Sjulian    break;
8217658Sjulian  case X86::VPSHUFDYri:
83131927Smarcel    Src1Name = getRegName(MI->getOperand(1).getReg());
84131927Smarcel    // FALL THROUGH.
8542135Smsmith  case X86::VPSHUFDYmi:
8617658Sjulian    DestName = getRegName(MI->getOperand(0).getReg());
8742135Smsmith    DecodePSHUFMask(MVT::v8i32, MI->getOperand(MI->getNumOperands()-1).getImm(),
8817658Sjulian                    ShuffleMask);
8917658Sjulian    break;
9046381Sbillf
91103647Sjhb
92131927Smarcel  case X86::PSHUFHWri:
93103647Sjhb  case X86::VPSHUFHWri:
94103647Sjhb    Src1Name = getRegName(MI->getOperand(1).getReg());
95103647Sjhb    // FALL THROUGH.
9617658Sjulian  case X86::PSHUFHWmi:
97103647Sjhb  case X86::VPSHUFHWmi:
98103647Sjhb    DestName = getRegName(MI->getOperand(0).getReg());
99131927Smarcel    DecodePSHUFHWMask(MI->getOperand(MI->getNumOperands()-1).getImm(),
10017658Sjulian                      ShuffleMask);
101132506Srwatson    break;
10285202Speter  case X86::PSHUFLWri:
10385202Speter  case X86::VPSHUFLWri:
10485202Speter    Src1Name = getRegName(MI->getOperand(1).getReg());
10543436Smsmith    // FALL THROUGH.
10643436Smsmith  case X86::PSHUFLWmi:
10717658Sjulian  case X86::VPSHUFLWmi:
10817658Sjulian    DestName = getRegName(MI->getOperand(0).getReg());
10917658Sjulian    DecodePSHUFLWMask(MI->getOperand(MI->getNumOperands()-1).getImm(),
11017658Sjulian                      ShuffleMask);
11117658Sjulian    break;
11217658Sjulian
11393496Sphk  case X86::PUNPCKHBWrr:
114155383Sjeff    Src2Name = getRegName(MI->getOperand(2).getReg());
11593496Sphk    // FALL THROUGH.
11667093Sps  case X86::PUNPCKHBWrm:
117131927Smarcel    Src1Name = getRegName(MI->getOperand(0).getReg());
118131927Smarcel    DecodeUNPCKHMask(MVT::v16i8, ShuffleMask);
119131927Smarcel    break;
120131927Smarcel  case X86::VPUNPCKHBWrr:
12165395Speter    Src2Name = getRegName(MI->getOperand(2).getReg());
12265395Speter    // FALL THROUGH.
12365395Speter  case X86::VPUNPCKHBWrm:
12465395Speter    Src1Name = getRegName(MI->getOperand(1).getReg());
12565395Speter    DestName = getRegName(MI->getOperand(0).getReg());
12617658Sjulian    DecodeUNPCKHMask(MVT::v16i8, ShuffleMask);
12750107Smsmith    break;
128110859Salfred  case X86::VPUNPCKHBWYrr:
12950107Smsmith    Src2Name = getRegName(MI->getOperand(2).getReg());
13050107Smsmith    // FALL THROUGH.
131110859Salfred  case X86::VPUNPCKHBWYrm:
132110859Salfred    Src1Name = getRegName(MI->getOperand(1).getReg());
133110859Salfred    DestName = getRegName(MI->getOperand(0).getReg());
134110859Salfred    DecodeUNPCKHMask(MVT::v32i8, ShuffleMask);
135110859Salfred    break;
136110859Salfred  case X86::PUNPCKHWDrr:
137110859Salfred    Src2Name = getRegName(MI->getOperand(2).getReg());
138110859Salfred    // FALL THROUGH.
139110859Salfred  case X86::PUNPCKHWDrm:
14050107Smsmith    Src1Name = getRegName(MI->getOperand(0).getReg());
14148868Sphk    DecodeUNPCKHMask(MVT::v8i16, ShuffleMask);
14250107Smsmith    break;
14350107Smsmith  case X86::VPUNPCKHWDrr:
14417658Sjulian    Src2Name = getRegName(MI->getOperand(2).getReg());
14517658Sjulian    // FALL THROUGH.
14682749Sdillon  case X86::VPUNPCKHWDrm:
14782749Sdillon    Src1Name = getRegName(MI->getOperand(1).getReg());
14817658Sjulian    DestName = getRegName(MI->getOperand(0).getReg());
14982749Sdillon    DecodeUNPCKHMask(MVT::v8i16, ShuffleMask);
15017658Sjulian    break;
15183366Sjulian  case X86::VPUNPCKHWDYrr:
15217658Sjulian    Src2Name = getRegName(MI->getOperand(2).getReg());
15317658Sjulian    // FALL THROUGH.
15417658Sjulian  case X86::VPUNPCKHWDYrm:
155106024Srwatson    Src1Name = getRegName(MI->getOperand(1).getReg());
156106024Srwatson    DestName = getRegName(MI->getOperand(0).getReg());
157106024Srwatson    DecodeUNPCKHMask(MVT::v16i16, ShuffleMask);
158106024Srwatson    break;
159106024Srwatson  case X86::PUNPCKHDQrr:
160106024Srwatson    Src2Name = getRegName(MI->getOperand(2).getReg());
161106024Srwatson    // FALL THROUGH.
162106024Srwatson  case X86::PUNPCKHDQrm:
16382749Sdillon    Src1Name = getRegName(MI->getOperand(0).getReg());
164106024Srwatson    DecodeUNPCKHMask(MVT::v4i32, ShuffleMask);
165106024Srwatson    break;
16682749Sdillon  case X86::VPUNPCKHDQrr:
16717658Sjulian    Src2Name = getRegName(MI->getOperand(2).getReg());
16817658Sjulian    // FALL THROUGH.
16917658Sjulian  case X86::VPUNPCKHDQrm:
17017658Sjulian    Src1Name = getRegName(MI->getOperand(1).getReg());
17117658Sjulian    DestName = getRegName(MI->getOperand(0).getReg());
17265268Smsmith    DecodeUNPCKHMask(MVT::v4i32, ShuffleMask);
17365268Smsmith    break;
17417658Sjulian  case X86::VPUNPCKHDQYrr:
17565268Smsmith    Src2Name = getRegName(MI->getOperand(2).getReg());
17617658Sjulian    // FALL THROUGH.
177110859Salfred  case X86::VPUNPCKHDQYrm:
17865268Smsmith    Src1Name = getRegName(MI->getOperand(1).getReg());
179110859Salfred    DestName = getRegName(MI->getOperand(0).getReg());
18017658Sjulian    DecodeUNPCKHMask(MVT::v8i32, ShuffleMask);
18117658Sjulian    break;
18273913Sjhb  case X86::PUNPCKHQDQrr:
18317658Sjulian    Src2Name = getRegName(MI->getOperand(2).getReg());
18473913Sjhb    // FALL THROUGH.
18517658Sjulian  case X86::PUNPCKHQDQrm:
18617658Sjulian    Src1Name = getRegName(MI->getOperand(0).getReg());
18717658Sjulian    DecodeUNPCKHMask(MVT::v2i64, ShuffleMask);
18817658Sjulian    break;
18917658Sjulian  case X86::VPUNPCKHQDQrr:
19017658Sjulian    Src2Name = getRegName(MI->getOperand(2).getReg());
19117658Sjulian    // FALL THROUGH.
19217658Sjulian  case X86::VPUNPCKHQDQrm:
19354233Sphk    Src1Name = getRegName(MI->getOperand(1).getReg());
19465395Speter    DestName = getRegName(MI->getOperand(0).getReg());
19554233Sphk    DecodeUNPCKHMask(MVT::v2i64, ShuffleMask);
19654233Sphk    break;
19754233Sphk  case X86::VPUNPCKHQDQYrr:
19854233Sphk    Src2Name = getRegName(MI->getOperand(2).getReg());
19954233Sphk    // FALL THROUGH.
20054233Sphk  case X86::VPUNPCKHQDQYrm:
20154233Sphk    Src1Name = getRegName(MI->getOperand(1).getReg());
20254233Sphk    DestName = getRegName(MI->getOperand(0).getReg());
20365764Sjhb    DecodeUNPCKHMask(MVT::v4i64, ShuffleMask);
20454233Sphk    break;
20554233Sphk
20654233Sphk  case X86::PUNPCKLBWrr:
20754233Sphk    Src2Name = getRegName(MI->getOperand(2).getReg());
20865764Sjhb    // FALL THROUGH.
20954233Sphk  case X86::PUNPCKLBWrm:
21054233Sphk    Src1Name = getRegName(MI->getOperand(0).getReg());
21154233Sphk    DecodeUNPCKLMask(MVT::v16i8, ShuffleMask);
21254233Sphk    break;
21365764Sjhb  case X86::VPUNPCKLBWrr:
21454233Sphk    Src2Name = getRegName(MI->getOperand(2).getReg());
21554233Sphk    // FALL THROUGH.
21654233Sphk  case X86::VPUNPCKLBWrm:
21765764Sjhb    Src1Name = getRegName(MI->getOperand(1).getReg());
21854233Sphk    DestName = getRegName(MI->getOperand(0).getReg());
21954233Sphk    DecodeUNPCKLMask(MVT::v16i8, ShuffleMask);
22094169Sphk    break;
22194169Sphk  case X86::VPUNPCKLBWYrr:
22294169Sphk    Src2Name = getRegName(MI->getOperand(2).getReg());
223110859Salfred    // FALL THROUGH.
224132412Sjulian  case X86::VPUNPCKLBWYrm:
225132412Sjulian    Src1Name = getRegName(MI->getOperand(1).getReg());
226132412Sjulian    DestName = getRegName(MI->getOperand(0).getReg());
227132412Sjulian    DecodeUNPCKLMask(MVT::v32i8, ShuffleMask);
228132412Sjulian    break;
229132412Sjulian  case X86::PUNPCKLWDrr:
230132413Sjulian    Src2Name = getRegName(MI->getOperand(2).getReg());
231132412Sjulian    // FALL THROUGH.
232132412Sjulian  case X86::PUNPCKLWDrm:
233132412Sjulian    Src1Name = getRegName(MI->getOperand(0).getReg());
23494169Sphk    DecodeUNPCKLMask(MVT::v8i16, ShuffleMask);
235131927Smarcel    break;
23694169Sphk  case X86::VPUNPCKLWDrr:
23794169Sphk    Src2Name = getRegName(MI->getOperand(2).getReg());
23894169Sphk    // FALL THROUGH.
23994169Sphk  case X86::VPUNPCKLWDrm:
240149875Struckman    Src1Name = getRegName(MI->getOperand(1).getReg());
241149875Struckman    DestName = getRegName(MI->getOperand(0).getReg());
242149875Struckman    DecodeUNPCKLMask(MVT::v8i16, ShuffleMask);
243149875Struckman    break;
244149875Struckman  case X86::VPUNPCKLWDYrr:
245149875Struckman    Src2Name = getRegName(MI->getOperand(2).getReg());
246149875Struckman    // FALL THROUGH.
247149875Struckman  case X86::VPUNPCKLWDYrm:
248149875Struckman    Src1Name = getRegName(MI->getOperand(1).getReg());
249149875Struckman    DestName = getRegName(MI->getOperand(0).getReg());
25017658Sjulian    DecodeUNPCKLMask(MVT::v16i16, ShuffleMask);
251137329Snjl    break;
25217658Sjulian  case X86::PUNPCKLDQrr:
25331275Sbde    Src2Name = getRegName(MI->getOperand(2).getReg());
25465395Speter    // FALL THROUGH.
25517658Sjulian  case X86::PUNPCKLDQrm:
256133763Struckman    Src1Name = getRegName(MI->getOperand(0).getReg());
25717658Sjulian    DecodeUNPCKLMask(MVT::v4i32, ShuffleMask);
258137375Smarcel    break;
259137329Snjl  case X86::VPUNPCKLDQrr:
260137329Snjl    Src2Name = getRegName(MI->getOperand(2).getReg());
261137329Snjl    // FALL THROUGH.
262137329Snjl  case X86::VPUNPCKLDQrm:
263137329Snjl    Src1Name = getRegName(MI->getOperand(1).getReg());
264137263Speter    DestName = getRegName(MI->getOperand(0).getReg());
265137263Speter    DecodeUNPCKLMask(MVT::v4i32, ShuffleMask);
266137263Speter    break;
267138217Snjl  case X86::VPUNPCKLDQYrr:
268137263Speter    Src2Name = getRegName(MI->getOperand(2).getReg());
269155383Sjeff    // FALL THROUGH.
270155383Sjeff  case X86::VPUNPCKLDQYrm:
271137263Speter    Src1Name = getRegName(MI->getOperand(1).getReg());
27265268Smsmith    DestName = getRegName(MI->getOperand(0).getReg());
27365268Smsmith    DecodeUNPCKLMask(MVT::v8i32, ShuffleMask);
27465268Smsmith    break;
27582119Sjhb  case X86::PUNPCKLQDQrr:
276131927Smarcel    Src2Name = getRegName(MI->getOperand(2).getReg());
27782119Sjhb    // FALL THROUGH.
27827997Sjulian  case X86::PUNPCKLQDQrm:
27927997Sjulian    Src1Name = getRegName(MI->getOperand(0).getReg());
28027997Sjulian    DecodeUNPCKLMask(MVT::v2i64, ShuffleMask);
28150107Smsmith    break;
28227997Sjulian  case X86::VPUNPCKLQDQrr:
28327997Sjulian    Src2Name = getRegName(MI->getOperand(2).getReg());
28427997Sjulian    // FALL THROUGH.
28527997Sjulian  case X86::VPUNPCKLQDQrm:
28617658Sjulian    Src1Name = getRegName(MI->getOperand(1).getReg());
28717658Sjulian    DestName = getRegName(MI->getOperand(0).getReg());
28865707Sjasone    DecodeUNPCKLMask(MVT::v2i64, ShuffleMask);
289131481Sjhb    break;
29065707Sjasone  case X86::VPUNPCKLQDQYrr:
291131481Sjhb    Src2Name = getRegName(MI->getOperand(2).getReg());
29217658Sjulian    // FALL THROUGH.
29317658Sjulian  case X86::VPUNPCKLQDQYrm:
29417658Sjulian    Src1Name = getRegName(MI->getOperand(1).getReg());
295150472Sups    DestName = getRegName(MI->getOperand(0).getReg());
29617658Sjulian    DecodeUNPCKLMask(MVT::v4i64, ShuffleMask);
29734266Sjulian    break;
29834266Sjulian
29934266Sjulian  case X86::SHUFPDrri:
30034266Sjulian    Src2Name = getRegName(MI->getOperand(2).getReg());
30134266Sjulian    // FALL THROUGH.
30265707Sjasone  case X86::SHUFPDrmi:
30317658Sjulian    DecodeSHUFPMask(MVT::v2f64, MI->getOperand(MI->getNumOperands()-1).getImm(),
304149875Struckman                    ShuffleMask);
305149875Struckman    Src1Name = getRegName(MI->getOperand(0).getReg());
30617658Sjulian    break;
307133763Struckman  case X86::VSHUFPDrri:
308133763Struckman    Src2Name = getRegName(MI->getOperand(2).getReg());
309136115Sphk    // FALL THROUGH.
31017658Sjulian  case X86::VSHUFPDrmi:
311133763Struckman    DecodeSHUFPMask(MVT::v2f64, MI->getOperand(MI->getNumOperands()-1).getImm(),
312133763Struckman                    ShuffleMask);
313133763Struckman    Src1Name = getRegName(MI->getOperand(1).getReg());
314133763Struckman    DestName = getRegName(MI->getOperand(0).getReg());
315133763Struckman    break;
31617658Sjulian  case X86::VSHUFPDYrri:
31765707Sjasone    Src2Name = getRegName(MI->getOperand(2).getReg());
31865707Sjasone    // FALL THROUGH.
31965707Sjasone  case X86::VSHUFPDYrmi:
320150472Sups    DecodeSHUFPMask(MVT::v4f64, MI->getOperand(MI->getNumOperands()-1).getImm(),
321131481Sjhb                    ShuffleMask);
322131481Sjhb    Src1Name = getRegName(MI->getOperand(1).getReg());
323131481Sjhb    DestName = getRegName(MI->getOperand(0).getReg());
324131481Sjhb    break;
325131481Sjhb
326131481Sjhb  case X86::SHUFPSrri:
327131481Sjhb    Src2Name = getRegName(MI->getOperand(2).getReg());
32834266Sjulian    // FALL THROUGH.
329131481Sjhb  case X86::SHUFPSrmi:
330131481Sjhb    DecodeSHUFPMask(MVT::v4f32, MI->getOperand(MI->getNumOperands()-1).getImm(),
331131481Sjhb                    ShuffleMask);
332131481Sjhb    Src1Name = getRegName(MI->getOperand(0).getReg());
333131481Sjhb    break;
334131481Sjhb  case X86::VSHUFPSrri:
335131481Sjhb    Src2Name = getRegName(MI->getOperand(2).getReg());
336131481Sjhb    // FALL THROUGH.
337131481Sjhb  case X86::VSHUFPSrmi:
338131481Sjhb    DecodeSHUFPMask(MVT::v4f32, MI->getOperand(MI->getNumOperands()-1).getImm(),
339131481Sjhb                    ShuffleMask);
340131481Sjhb    Src1Name = getRegName(MI->getOperand(1).getReg());
341131481Sjhb    DestName = getRegName(MI->getOperand(0).getReg());
342131481Sjhb    break;
343131481Sjhb  case X86::VSHUFPSYrri:
34417658Sjulian    Src2Name = getRegName(MI->getOperand(2).getReg());
345133418Snjl    // FALL THROUGH.
34641137Smsmith  case X86::VSHUFPSYrmi:
34741137Smsmith    DecodeSHUFPMask(MVT::v8f32, MI->getOperand(MI->getNumOperands()-1).getImm(),
34841137Smsmith                    ShuffleMask);
34941137Smsmith    Src1Name = getRegName(MI->getOperand(1).getReg());
35041137Smsmith    DestName = getRegName(MI->getOperand(0).getReg());
35141137Smsmith    break;
352149875Struckman
353137186Sphk  case X86::UNPCKLPDrr:
354137186Sphk    Src2Name = getRegName(MI->getOperand(2).getReg());
355130640Sphk    // FALL THROUGH.
35653452Sphk  case X86::UNPCKLPDrm:
35748225Smckusick    DecodeUNPCKLMask(MVT::v2f64, ShuffleMask);
35853023Sphk    Src1Name = getRegName(MI->getOperand(0).getReg());
35953023Sphk    break;
360137186Sphk  case X86::VUNPCKLPDrr:
36153023Sphk    Src2Name = getRegName(MI->getOperand(2).getReg());
36253023Sphk    // FALL THROUGH.
36353023Sphk  case X86::VUNPCKLPDrm:
364137186Sphk    DecodeUNPCKLMask(MVT::v2f64, ShuffleMask);
365137186Sphk    Src1Name = getRegName(MI->getOperand(1).getReg());
36653023Sphk    DestName = getRegName(MI->getOperand(0).getReg());
36753023Sphk    break;
36853023Sphk  case X86::VUNPCKLPDYrr:
36946568Speter    Src2Name = getRegName(MI->getOperand(2).getReg());
37041137Smsmith    // FALL THROUGH.
37117658Sjulian  case X86::VUNPCKLPDYrm:
37217658Sjulian    DecodeUNPCKLMask(MVT::v4f64, ShuffleMask);
37317658Sjulian    Src1Name = getRegName(MI->getOperand(1).getReg());
37417658Sjulian    DestName = getRegName(MI->getOperand(0).getReg());
37517658Sjulian    break;
376133763Struckman  case X86::UNPCKLPSrr:
37717658Sjulian    Src2Name = getRegName(MI->getOperand(2).getReg());
37817658Sjulian    // FALL THROUGH.
379133763Struckman  case X86::UNPCKLPSrm:
380133763Struckman    DecodeUNPCKLMask(MVT::v4f32, ShuffleMask);
38117658Sjulian    Src1Name = getRegName(MI->getOperand(0).getReg());
38217658Sjulian    break;
38317658Sjulian  case X86::VUNPCKLPSrr:
38417658Sjulian    Src2Name = getRegName(MI->getOperand(2).getReg());
38517658Sjulian    // FALL THROUGH.
38617658Sjulian  case X86::VUNPCKLPSrm:
38739237Sgibbs    DecodeUNPCKLMask(MVT::v4f32, ShuffleMask);
38817658Sjulian    Src1Name = getRegName(MI->getOperand(1).getReg());
38927997Sjulian    DestName = getRegName(MI->getOperand(0).getReg());
39054233Sphk    break;
39154233Sphk  case X86::VUNPCKLPSYrr:
39227997Sjulian    Src2Name = getRegName(MI->getOperand(2).getReg());
39327997Sjulian    // FALL THROUGH.
39427997Sjulian  case X86::VUNPCKLPSYrm:
39527997Sjulian    DecodeUNPCKLMask(MVT::v8f32, ShuffleMask);
39650107Smsmith    Src1Name = getRegName(MI->getOperand(1).getReg());
397137329Snjl    DestName = getRegName(MI->getOperand(0).getReg());
398137329Snjl    break;
39939237Sgibbs  case X86::UNPCKHPDrr:
400137329Snjl    Src2Name = getRegName(MI->getOperand(2).getReg());
401132412Sjulian    // FALL THROUGH.
40294169Sphk  case X86::UNPCKHPDrm:
40339237Sgibbs    DecodeUNPCKHMask(MVT::v2f64, ShuffleMask);
40439237Sgibbs    Src1Name = getRegName(MI->getOperand(0).getReg());
40550107Smsmith    break;
40639237Sgibbs  case X86::VUNPCKHPDrr:
40750107Smsmith    Src2Name = getRegName(MI->getOperand(2).getReg());
40850107Smsmith    // FALL THROUGH.
40950107Smsmith  case X86::VUNPCKHPDrm:
41050107Smsmith    DecodeUNPCKHMask(MVT::v2f64, ShuffleMask);
41150107Smsmith    Src1Name = getRegName(MI->getOperand(1).getReg());
41250107Smsmith    DestName = getRegName(MI->getOperand(0).getReg());
41350107Smsmith    break;
41450107Smsmith  case X86::VUNPCKHPDYrr:
41550107Smsmith    Src2Name = getRegName(MI->getOperand(2).getReg());
41650107Smsmith    // FALL THROUGH.
417110859Salfred  case X86::VUNPCKHPDYrm:
41817658Sjulian    DecodeUNPCKHMask(MVT::v4f64, ShuffleMask);
41917658Sjulian    Src1Name = getRegName(MI->getOperand(1).getReg());
42017658Sjulian    DestName = getRegName(MI->getOperand(0).getReg());
42117658Sjulian    break;
42219274Sjulian  case X86::UNPCKHPSrr:
42319274Sjulian    Src2Name = getRegName(MI->getOperand(2).getReg());
42419274Sjulian    // FALL THROUGH.
42519274Sjulian  case X86::UNPCKHPSrm:
42619274Sjulian    DecodeUNPCKHMask(MVT::v4f32, ShuffleMask);
42739237Sgibbs    Src1Name = getRegName(MI->getOperand(0).getReg());
42819274Sjulian    break;
42919274Sjulian  case X86::VUNPCKHPSrr:
43050107Smsmith    Src2Name = getRegName(MI->getOperand(2).getReg());
43150107Smsmith    // FALL THROUGH.
43217658Sjulian  case X86::VUNPCKHPSrm:
43350107Smsmith    DecodeUNPCKHMask(MVT::v4f32, ShuffleMask);
43450107Smsmith    Src1Name = getRegName(MI->getOperand(1).getReg());
43550107Smsmith    DestName = getRegName(MI->getOperand(0).getReg());
43650107Smsmith    break;
43750107Smsmith  case X86::VUNPCKHPSYrr:
43850107Smsmith    Src2Name = getRegName(MI->getOperand(2).getReg());
43950107Smsmith    // FALL THROUGH.
44050107Smsmith  case X86::VUNPCKHPSYrm:
44150107Smsmith    DecodeUNPCKHMask(MVT::v8f32, ShuffleMask);
44250107Smsmith    Src1Name = getRegName(MI->getOperand(1).getReg());
44339237Sgibbs    DestName = getRegName(MI->getOperand(0).getReg());
44439237Sgibbs    break;
44539237Sgibbs  case X86::VPERMILPSri:
44639237Sgibbs    Src1Name = getRegName(MI->getOperand(1).getReg());
44739237Sgibbs    // FALL THROUGH.
44839237Sgibbs  case X86::VPERMILPSmi:
44939237Sgibbs    DecodePSHUFMask(MVT::v4f32, MI->getOperand(MI->getNumOperands()-1).getImm(),
45039237Sgibbs                    ShuffleMask);
45139237Sgibbs    DestName = getRegName(MI->getOperand(0).getReg());
45239237Sgibbs    break;
45339237Sgibbs  case X86::VPERMILPSYri:
45417658Sjulian    Src1Name = getRegName(MI->getOperand(1).getReg());
45539237Sgibbs    // FALL THROUGH.
45650107Smsmith  case X86::VPERMILPSYmi:
45717658Sjulian    DecodePSHUFMask(MVT::v8f32, MI->getOperand(MI->getNumOperands()-1).getImm(),
45839237Sgibbs                    ShuffleMask);
45950107Smsmith    DestName = getRegName(MI->getOperand(0).getReg());
46017658Sjulian    break;
46189522Snik  case X86::VPERMILPDri:
46289522Snik    Src1Name = getRegName(MI->getOperand(1).getReg());
46339237Sgibbs    // FALL THROUGH.
46417658Sjulian  case X86::VPERMILPDmi:
46550107Smsmith    DecodePSHUFMask(MVT::v2f64, MI->getOperand(MI->getNumOperands()-1).getImm(),
46650107Smsmith                    ShuffleMask);
46750107Smsmith    DestName = getRegName(MI->getOperand(0).getReg());
46850107Smsmith    break;
46950107Smsmith  case X86::VPERMILPDYri:
47050107Smsmith    Src1Name = getRegName(MI->getOperand(1).getReg());
47150107Smsmith    // FALL THROUGH.
47250107Smsmith  case X86::VPERMILPDYmi:
473110859Salfred    DecodePSHUFMask(MVT::v4f64, MI->getOperand(MI->getNumOperands()-1).getImm(),
47417658Sjulian                       ShuffleMask);
47517658Sjulian    DestName = getRegName(MI->getOperand(0).getReg());
47617677Sjulian    break;
47717658Sjulian  case X86::VPERM2F128rr:
47850107Smsmith  case X86::VPERM2I128rr:
47917658Sjulian    Src2Name = getRegName(MI->getOperand(2).getReg());
48017658Sjulian    // FALL THROUGH.
48175570Sjhb  case X86::VPERM2F128rm:
482101155Sjhb  case X86::VPERM2I128rm:
48375570Sjhb    // For instruction comments purpose, assume the 256-bit vector is v4i64.
48475570Sjhb    DecodeVPERM2X128Mask(MVT::v4i64,
48517658Sjulian                         MI->getOperand(MI->getNumOperands()-1).getImm(),
48617658Sjulian                         ShuffleMask);
48717658Sjulian    Src1Name = getRegName(MI->getOperand(1).getReg());
48817658Sjulian    DestName = getRegName(MI->getOperand(0).getReg());
48982749Sdillon    break;
49082749Sdillon  }
49117658Sjulian
49217658Sjulian
493130164Sphk  // If this was a shuffle operation, print the shuffle mask.
49417658Sjulian  if (!ShuffleMask.empty()) {
495100209Sgallatin    if (DestName == 0) DestName = Src1Name;
496103647Sjhb    OS << (DestName ? DestName : "mem") << " = ";
49717658Sjulian
49838874Sache    // If the two sources are the same, canonicalize the input elements to be
49917658Sjulian    // from the first src so that we get larger element spans.
50065557Sjasone    if (Src1Name == Src2Name) {
50182115Sjhb      for (unsigned i = 0, e = ShuffleMask.size(); i != e; ++i) {
50282115Sjhb        if ((int)ShuffleMask[i] >= 0 && // Not sentinel.
503101155Sjhb            ShuffleMask[i] >= (int)e)        // From second mask.
504101155Sjhb          ShuffleMask[i] -= e;
50582115Sjhb      }
50682115Sjhb    }
507101155Sjhb
508101155Sjhb    // The shuffle mask specifies which elements of the src1/src2 fill in the
509101155Sjhb    // destination, with a few sentinel values.  Loop through and print them
510101155Sjhb    // out.
511101155Sjhb    for (unsigned i = 0, e = ShuffleMask.size(); i != e; ++i) {
51265557Sjasone      if (i != 0)
51365557Sjasone        OS << ',';
51417658Sjulian      if (ShuffleMask[i] == SM_SentinelZero) {
515103647Sjhb        OS << "zero";
51617658Sjulian        continue;
51717658Sjulian      }
518103647Sjhb
51917658Sjulian      // Otherwise, it must come from src1 or src2.  Print the span of elements
520103647Sjhb      // that comes from this src.
521103647Sjhb      bool isSrc1 = ShuffleMask[i] < (int)ShuffleMask.size();
52217658Sjulian      const char *SrcName = isSrc1 ? Src1Name : Src2Name;
52317658Sjulian      OS << (SrcName ? SrcName : "mem") << '[';
524116398Siedowse      bool IsFirst = true;
525116398Siedowse      while (i != e &&
52638874Sache             (int)ShuffleMask[i] >= 0 &&
527130164Sphk             (ShuffleMask[i] < (int)ShuffleMask.size()) == isSrc1) {
528116398Siedowse        if (!IsFirst)
529116398Siedowse          OS << ',';
530116398Siedowse        else
531130164Sphk          IsFirst = false;
532116398Siedowse        OS << ShuffleMask[i] % ShuffleMask.size();
53317658Sjulian        ++i;
53426100Sfsmp      }
535134089Sjhb      OS << ']';
53626100Sfsmp      --i;  // For loop increments element #.
53717658Sjulian    }
538131927Smarcel    //MI->print(OS, 0);
539103647Sjhb    OS << "\n";
540131927Smarcel  }
54117658Sjulian
542131927Smarcel}
54382223Sjhb