16aa928d57a73a557d838f62af84e929bed0f276eChris Lattner//===-- X86InstComments.cpp - Generate verbose-asm comments for instrs ----===//
26aa928d57a73a557d838f62af84e929bed0f276eChris Lattner//
36aa928d57a73a557d838f62af84e929bed0f276eChris Lattner//                     The LLVM Compiler Infrastructure
46aa928d57a73a557d838f62af84e929bed0f276eChris Lattner//
56aa928d57a73a557d838f62af84e929bed0f276eChris Lattner// This file is distributed under the University of Illinois Open Source
66aa928d57a73a557d838f62af84e929bed0f276eChris Lattner// License. See LICENSE.TXT for details.
76aa928d57a73a557d838f62af84e929bed0f276eChris Lattner//
86aa928d57a73a557d838f62af84e929bed0f276eChris Lattner//===----------------------------------------------------------------------===//
96aa928d57a73a557d838f62af84e929bed0f276eChris Lattner//
106aa928d57a73a557d838f62af84e929bed0f276eChris Lattner// This defines functionality used to emit comments about X86 instructions to
116aa928d57a73a557d838f62af84e929bed0f276eChris Lattner// an output stream for -fverbose-asm.
126aa928d57a73a557d838f62af84e929bed0f276eChris Lattner//
136aa928d57a73a557d838f62af84e929bed0f276eChris Lattner//===----------------------------------------------------------------------===//
146aa928d57a73a557d838f62af84e929bed0f276eChris Lattner
156aa928d57a73a557d838f62af84e929bed0f276eChris Lattner#include "X86InstComments.h"
16ed5e3552147830159a1d48d067dfbb49ac9cccfdEvan Cheng#include "MCTargetDesc/X86MCTargetDesc.h"
1794b9550a32d189704a8eae55505edf62662c0534Evan Cheng#include "Utils/X86ShuffleDecode.h"
186aa928d57a73a557d838f62af84e929bed0f276eChris Lattner#include "llvm/MC/MCInst.h"
1936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#include "llvm/CodeGen/MachineValueType.h"
206aa928d57a73a557d838f62af84e929bed0f276eChris Lattner#include "llvm/Support/raw_ostream.h"
2136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
226aa928d57a73a557d838f62af84e929bed0f276eChris Lattnerusing namespace llvm;
236aa928d57a73a557d838f62af84e929bed0f276eChris Lattner
246aa928d57a73a557d838f62af84e929bed0f276eChris Lattner//===----------------------------------------------------------------------===//
256aa928d57a73a557d838f62af84e929bed0f276eChris Lattner// Top Level Entrypoint
266aa928d57a73a557d838f62af84e929bed0f276eChris Lattner//===----------------------------------------------------------------------===//
276aa928d57a73a557d838f62af84e929bed0f276eChris Lattner
286aa928d57a73a557d838f62af84e929bed0f276eChris Lattner/// EmitAnyX86InstComments - This function decodes x86 instructions and prints
296aa928d57a73a557d838f62af84e929bed0f276eChris Lattner/// newline terminated strings to the specified string if desired.  This
306aa928d57a73a557d838f62af84e929bed0f276eChris Lattner/// information is shown in disassembly dumps when verbose assembly is enabled.
316aa928d57a73a557d838f62af84e929bed0f276eChris Lattnervoid llvm::EmitAnyX86InstComments(const MCInst *MI, raw_ostream &OS,
326aa928d57a73a557d838f62af84e929bed0f276eChris Lattner                                  const char *(*getRegName)(unsigned)) {
336aa928d57a73a557d838f62af84e929bed0f276eChris Lattner  // If this is a shuffle operation, the switch should fill in this state.
34a1ffc681ed7372bd371c44a6e186291b6416fe47Craig Topper  SmallVector<int, 8> ShuffleMask;
35dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  const char *DestName = nullptr, *Src1Name = nullptr, *Src2Name = nullptr;
366b1d0a3b366a637c0c96ea5cf7cfd8769469e6f3Bruno Cardoso Lopes
376aa928d57a73a557d838f62af84e929bed0f276eChris Lattner  switch (MI->getOpcode()) {
386aa928d57a73a557d838f62af84e929bed0f276eChris Lattner  case X86::INSERTPSrr:
39796c193768547459cd6cbd667c8a43fedd601022Craig Topper  case X86::VINSERTPSrr:
40796c193768547459cd6cbd667c8a43fedd601022Craig Topper    DestName = getRegName(MI->getOperand(0).getReg());
416aa928d57a73a557d838f62af84e929bed0f276eChris Lattner    Src1Name = getRegName(MI->getOperand(1).getReg());
426aa928d57a73a557d838f62af84e929bed0f276eChris Lattner    Src2Name = getRegName(MI->getOperand(2).getReg());
4336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    if(MI->getOperand(3).isImm())
4436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines      DecodeINSERTPSMask(MI->getOperand(3).getImm(), ShuffleMask);
456aa928d57a73a557d838f62af84e929bed0f276eChris Lattner    break;
466b1d0a3b366a637c0c96ea5cf7cfd8769469e6f3Bruno Cardoso Lopes
474644a936dc2e90d24c22c0cdbbf5038eef7830a9Chris Lattner  case X86::MOVLHPSrr:
48796c193768547459cd6cbd667c8a43fedd601022Craig Topper  case X86::VMOVLHPSrr:
49796c193768547459cd6cbd667c8a43fedd601022Craig Topper    Src2Name = getRegName(MI->getOperand(2).getReg());
50796c193768547459cd6cbd667c8a43fedd601022Craig Topper    Src1Name = getRegName(MI->getOperand(1).getReg());
51796c193768547459cd6cbd667c8a43fedd601022Craig Topper    DestName = getRegName(MI->getOperand(0).getReg());
52796c193768547459cd6cbd667c8a43fedd601022Craig Topper    DecodeMOVLHPSMask(2, ShuffleMask);
53796c193768547459cd6cbd667c8a43fedd601022Craig Topper    break;
546b1d0a3b366a637c0c96ea5cf7cfd8769469e6f3Bruno Cardoso Lopes
554644a936dc2e90d24c22c0cdbbf5038eef7830a9Chris Lattner  case X86::MOVHLPSrr:
56796c193768547459cd6cbd667c8a43fedd601022Craig Topper  case X86::VMOVHLPSrr:
57796c193768547459cd6cbd667c8a43fedd601022Craig Topper    Src2Name = getRegName(MI->getOperand(2).getReg());
58796c193768547459cd6cbd667c8a43fedd601022Craig Topper    Src1Name = getRegName(MI->getOperand(1).getReg());
59796c193768547459cd6cbd667c8a43fedd601022Craig Topper    DestName = getRegName(MI->getOperand(0).getReg());
60796c193768547459cd6cbd667c8a43fedd601022Craig Topper    DecodeMOVHLPSMask(2, ShuffleMask);
61796c193768547459cd6cbd667c8a43fedd601022Craig Topper    break;
626b1d0a3b366a637c0c96ea5cf7cfd8769469e6f3Bruno Cardoso Lopes
63200b306f2006533a0e7a0ca75cb3103620e7aa84Benjamin Kramer  case X86::PALIGNR128rr:
64200b306f2006533a0e7a0ca75cb3103620e7aa84Benjamin Kramer  case X86::VPALIGNR128rr:
65200b306f2006533a0e7a0ca75cb3103620e7aa84Benjamin Kramer    Src1Name = getRegName(MI->getOperand(2).getReg());
66200b306f2006533a0e7a0ca75cb3103620e7aa84Benjamin Kramer    // FALL THROUGH.
67200b306f2006533a0e7a0ca75cb3103620e7aa84Benjamin Kramer  case X86::PALIGNR128rm:
68200b306f2006533a0e7a0ca75cb3103620e7aa84Benjamin Kramer  case X86::VPALIGNR128rm:
69200b306f2006533a0e7a0ca75cb3103620e7aa84Benjamin Kramer    Src2Name = getRegName(MI->getOperand(1).getReg());
70200b306f2006533a0e7a0ca75cb3103620e7aa84Benjamin Kramer    DestName = getRegName(MI->getOperand(0).getReg());
7136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    if(MI->getOperand(MI->getNumOperands()-1).isImm())
7236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines      DecodePALIGNRMask(MVT::v16i8,
7336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines                        MI->getOperand(MI->getNumOperands()-1).getImm(),
7436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines                        ShuffleMask);
75200b306f2006533a0e7a0ca75cb3103620e7aa84Benjamin Kramer    break;
76200b306f2006533a0e7a0ca75cb3103620e7aa84Benjamin Kramer  case X86::VPALIGNR256rr:
77200b306f2006533a0e7a0ca75cb3103620e7aa84Benjamin Kramer    Src1Name = getRegName(MI->getOperand(2).getReg());
78200b306f2006533a0e7a0ca75cb3103620e7aa84Benjamin Kramer    // FALL THROUGH.
79200b306f2006533a0e7a0ca75cb3103620e7aa84Benjamin Kramer  case X86::VPALIGNR256rm:
80200b306f2006533a0e7a0ca75cb3103620e7aa84Benjamin Kramer    Src2Name = getRegName(MI->getOperand(1).getReg());
81200b306f2006533a0e7a0ca75cb3103620e7aa84Benjamin Kramer    DestName = getRegName(MI->getOperand(0).getReg());
8236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    if(MI->getOperand(MI->getNumOperands()-1).isImm())
8336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines      DecodePALIGNRMask(MVT::v32i8,
8436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines                        MI->getOperand(MI->getNumOperands()-1).getImm(),
8536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines                        ShuffleMask);
8653597b2c5cd0ace8683fd7aab33f8d40c085a49dCraig Topper    break;
87200b306f2006533a0e7a0ca75cb3103620e7aa84Benjamin Kramer
886aa928d57a73a557d838f62af84e929bed0f276eChris Lattner  case X86::PSHUFDri:
89796c193768547459cd6cbd667c8a43fedd601022Craig Topper  case X86::VPSHUFDri:
906aa928d57a73a557d838f62af84e929bed0f276eChris Lattner    Src1Name = getRegName(MI->getOperand(1).getReg());
916aa928d57a73a557d838f62af84e929bed0f276eChris Lattner    // FALL THROUGH.
926aa928d57a73a557d838f62af84e929bed0f276eChris Lattner  case X86::PSHUFDmi:
93796c193768547459cd6cbd667c8a43fedd601022Craig Topper  case X86::VPSHUFDmi:
946aa928d57a73a557d838f62af84e929bed0f276eChris Lattner    DestName = getRegName(MI->getOperand(0).getReg());
9536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    if(MI->getOperand(MI->getNumOperands()-1).isImm())
9636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines      DecodePSHUFMask(MVT::v4i32,
9736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines                      MI->getOperand(MI->getNumOperands()-1).getImm(),
9836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines                      ShuffleMask);
99d156dc11f9acd83e3369c069d5006a0203be13d6Craig Topper    break;
100d156dc11f9acd83e3369c069d5006a0203be13d6Craig Topper  case X86::VPSHUFDYri:
101d156dc11f9acd83e3369c069d5006a0203be13d6Craig Topper    Src1Name = getRegName(MI->getOperand(1).getReg());
102d156dc11f9acd83e3369c069d5006a0203be13d6Craig Topper    // FALL THROUGH.
103d156dc11f9acd83e3369c069d5006a0203be13d6Craig Topper  case X86::VPSHUFDYmi:
104d156dc11f9acd83e3369c069d5006a0203be13d6Craig Topper    DestName = getRegName(MI->getOperand(0).getReg());
10536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    if(MI->getOperand(MI->getNumOperands()-1).isImm())
10636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines      DecodePSHUFMask(MVT::v8i32,
10736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines                      MI->getOperand(MI->getNumOperands()-1).getImm(),
10836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines                      ShuffleMask);
1096aa928d57a73a557d838f62af84e929bed0f276eChris Lattner    break;
1106b1d0a3b366a637c0c96ea5cf7cfd8769469e6f3Bruno Cardoso Lopes
111d156dc11f9acd83e3369c069d5006a0203be13d6Craig Topper
1124644a936dc2e90d24c22c0cdbbf5038eef7830a9Chris Lattner  case X86::PSHUFHWri:
113796c193768547459cd6cbd667c8a43fedd601022Craig Topper  case X86::VPSHUFHWri:
1144644a936dc2e90d24c22c0cdbbf5038eef7830a9Chris Lattner    Src1Name = getRegName(MI->getOperand(1).getReg());
1154644a936dc2e90d24c22c0cdbbf5038eef7830a9Chris Lattner    // FALL THROUGH.
1164644a936dc2e90d24c22c0cdbbf5038eef7830a9Chris Lattner  case X86::PSHUFHWmi:
117796c193768547459cd6cbd667c8a43fedd601022Craig Topper  case X86::VPSHUFHWmi:
1184644a936dc2e90d24c22c0cdbbf5038eef7830a9Chris Lattner    DestName = getRegName(MI->getOperand(0).getReg());
11936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    if(MI->getOperand(MI->getNumOperands()-1).isImm())
12036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines      DecodePSHUFHWMask(MVT::v8i16,
12136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines                        MI->getOperand(MI->getNumOperands()-1).getImm(),
12236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines                        ShuffleMask);
123a9a568a79dbaf7315db863b4808d31ad9f5f91dcCraig Topper    break;
124a9a568a79dbaf7315db863b4808d31ad9f5f91dcCraig Topper  case X86::VPSHUFHWYri:
125a9a568a79dbaf7315db863b4808d31ad9f5f91dcCraig Topper    Src1Name = getRegName(MI->getOperand(1).getReg());
126a9a568a79dbaf7315db863b4808d31ad9f5f91dcCraig Topper    // FALL THROUGH.
127a9a568a79dbaf7315db863b4808d31ad9f5f91dcCraig Topper  case X86::VPSHUFHWYmi:
128a9a568a79dbaf7315db863b4808d31ad9f5f91dcCraig Topper    DestName = getRegName(MI->getOperand(0).getReg());
12936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    if(MI->getOperand(MI->getNumOperands()-1).isImm())
13036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines      DecodePSHUFHWMask(MVT::v16i16,
13136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines                        MI->getOperand(MI->getNumOperands()-1).getImm(),
13236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines                        ShuffleMask);
1334644a936dc2e90d24c22c0cdbbf5038eef7830a9Chris Lattner    break;
1344644a936dc2e90d24c22c0cdbbf5038eef7830a9Chris Lattner  case X86::PSHUFLWri:
135796c193768547459cd6cbd667c8a43fedd601022Craig Topper  case X86::VPSHUFLWri:
1364644a936dc2e90d24c22c0cdbbf5038eef7830a9Chris Lattner    Src1Name = getRegName(MI->getOperand(1).getReg());
1374644a936dc2e90d24c22c0cdbbf5038eef7830a9Chris Lattner    // FALL THROUGH.
1384644a936dc2e90d24c22c0cdbbf5038eef7830a9Chris Lattner  case X86::PSHUFLWmi:
139796c193768547459cd6cbd667c8a43fedd601022Craig Topper  case X86::VPSHUFLWmi:
1404644a936dc2e90d24c22c0cdbbf5038eef7830a9Chris Lattner    DestName = getRegName(MI->getOperand(0).getReg());
14136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    if(MI->getOperand(MI->getNumOperands()-1).isImm())
14236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines      DecodePSHUFLWMask(MVT::v8i16,
14336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines                        MI->getOperand(MI->getNumOperands()-1).getImm(),
14436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines                        ShuffleMask);
145a9a568a79dbaf7315db863b4808d31ad9f5f91dcCraig Topper    break;
146a9a568a79dbaf7315db863b4808d31ad9f5f91dcCraig Topper  case X86::VPSHUFLWYri:
147a9a568a79dbaf7315db863b4808d31ad9f5f91dcCraig Topper    Src1Name = getRegName(MI->getOperand(1).getReg());
148a9a568a79dbaf7315db863b4808d31ad9f5f91dcCraig Topper    // FALL THROUGH.
149a9a568a79dbaf7315db863b4808d31ad9f5f91dcCraig Topper  case X86::VPSHUFLWYmi:
150a9a568a79dbaf7315db863b4808d31ad9f5f91dcCraig Topper    DestName = getRegName(MI->getOperand(0).getReg());
15136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    if(MI->getOperand(MI->getNumOperands()-1).isImm())
15236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines      DecodePSHUFLWMask(MVT::v16i16,
15336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines                        MI->getOperand(MI->getNumOperands()-1).getImm(),
15436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines                        ShuffleMask);
1554644a936dc2e90d24c22c0cdbbf5038eef7830a9Chris Lattner    break;
1566b1d0a3b366a637c0c96ea5cf7cfd8769469e6f3Bruno Cardoso Lopes
1574644a936dc2e90d24c22c0cdbbf5038eef7830a9Chris Lattner  case X86::PUNPCKHBWrr:
1583d8c2ce3e44bc161118a8922e7aa412ef00f6034Craig Topper  case X86::VPUNPCKHBWrr:
1593d8c2ce3e44bc161118a8922e7aa412ef00f6034Craig Topper    Src2Name = getRegName(MI->getOperand(2).getReg());
1603d8c2ce3e44bc161118a8922e7aa412ef00f6034Craig Topper    // FALL THROUGH.
161e6482fabd20a2a5b4f81aff55812782f3b617514Craig Topper  case X86::PUNPCKHBWrm:
1623d8c2ce3e44bc161118a8922e7aa412ef00f6034Craig Topper  case X86::VPUNPCKHBWrm:
1633d8c2ce3e44bc161118a8922e7aa412ef00f6034Craig Topper    Src1Name = getRegName(MI->getOperand(1).getReg());
1643d8c2ce3e44bc161118a8922e7aa412ef00f6034Craig Topper    DestName = getRegName(MI->getOperand(0).getReg());
1653d8c2ce3e44bc161118a8922e7aa412ef00f6034Craig Topper    DecodeUNPCKHMask(MVT::v16i8, ShuffleMask);
1663d8c2ce3e44bc161118a8922e7aa412ef00f6034Craig Topper    break;
1673d8c2ce3e44bc161118a8922e7aa412ef00f6034Craig Topper  case X86::VPUNPCKHBWYrr:
1683d8c2ce3e44bc161118a8922e7aa412ef00f6034Craig Topper    Src2Name = getRegName(MI->getOperand(2).getReg());
1693d8c2ce3e44bc161118a8922e7aa412ef00f6034Craig Topper    // FALL THROUGH.
1703d8c2ce3e44bc161118a8922e7aa412ef00f6034Craig Topper  case X86::VPUNPCKHBWYrm:
1713d8c2ce3e44bc161118a8922e7aa412ef00f6034Craig Topper    Src1Name = getRegName(MI->getOperand(1).getReg());
1723d8c2ce3e44bc161118a8922e7aa412ef00f6034Craig Topper    DestName = getRegName(MI->getOperand(0).getReg());
1733d8c2ce3e44bc161118a8922e7aa412ef00f6034Craig Topper    DecodeUNPCKHMask(MVT::v32i8, ShuffleMask);
1744644a936dc2e90d24c22c0cdbbf5038eef7830a9Chris Lattner    break;
1754644a936dc2e90d24c22c0cdbbf5038eef7830a9Chris Lattner  case X86::PUNPCKHWDrr:
1763d8c2ce3e44bc161118a8922e7aa412ef00f6034Craig Topper  case X86::VPUNPCKHWDrr:
1773d8c2ce3e44bc161118a8922e7aa412ef00f6034Craig Topper    Src2Name = getRegName(MI->getOperand(2).getReg());
1783d8c2ce3e44bc161118a8922e7aa412ef00f6034Craig Topper    // FALL THROUGH.
179e6482fabd20a2a5b4f81aff55812782f3b617514Craig Topper  case X86::PUNPCKHWDrm:
1803d8c2ce3e44bc161118a8922e7aa412ef00f6034Craig Topper  case X86::VPUNPCKHWDrm:
1813d8c2ce3e44bc161118a8922e7aa412ef00f6034Craig Topper    Src1Name = getRegName(MI->getOperand(1).getReg());
1823d8c2ce3e44bc161118a8922e7aa412ef00f6034Craig Topper    DestName = getRegName(MI->getOperand(0).getReg());
1833d8c2ce3e44bc161118a8922e7aa412ef00f6034Craig Topper    DecodeUNPCKHMask(MVT::v8i16, ShuffleMask);
1843d8c2ce3e44bc161118a8922e7aa412ef00f6034Craig Topper    break;
1853d8c2ce3e44bc161118a8922e7aa412ef00f6034Craig Topper  case X86::VPUNPCKHWDYrr:
1863d8c2ce3e44bc161118a8922e7aa412ef00f6034Craig Topper    Src2Name = getRegName(MI->getOperand(2).getReg());
1873d8c2ce3e44bc161118a8922e7aa412ef00f6034Craig Topper    // FALL THROUGH.
1883d8c2ce3e44bc161118a8922e7aa412ef00f6034Craig Topper  case X86::VPUNPCKHWDYrm:
1893d8c2ce3e44bc161118a8922e7aa412ef00f6034Craig Topper    Src1Name = getRegName(MI->getOperand(1).getReg());
1903d8c2ce3e44bc161118a8922e7aa412ef00f6034Craig Topper    DestName = getRegName(MI->getOperand(0).getReg());
1913d8c2ce3e44bc161118a8922e7aa412ef00f6034Craig Topper    DecodeUNPCKHMask(MVT::v16i16, ShuffleMask);
1924644a936dc2e90d24c22c0cdbbf5038eef7830a9Chris Lattner    break;
1934644a936dc2e90d24c22c0cdbbf5038eef7830a9Chris Lattner  case X86::PUNPCKHDQrr:
1943d8c2ce3e44bc161118a8922e7aa412ef00f6034Craig Topper  case X86::VPUNPCKHDQrr:
1953d8c2ce3e44bc161118a8922e7aa412ef00f6034Craig Topper    Src2Name = getRegName(MI->getOperand(2).getReg());
1963d8c2ce3e44bc161118a8922e7aa412ef00f6034Craig Topper    // FALL THROUGH.
197e6482fabd20a2a5b4f81aff55812782f3b617514Craig Topper  case X86::PUNPCKHDQrm:
1983d8c2ce3e44bc161118a8922e7aa412ef00f6034Craig Topper  case X86::VPUNPCKHDQrm:
1993d8c2ce3e44bc161118a8922e7aa412ef00f6034Craig Topper    Src1Name = getRegName(MI->getOperand(1).getReg());
2003d8c2ce3e44bc161118a8922e7aa412ef00f6034Craig Topper    DestName = getRegName(MI->getOperand(0).getReg());
2013d8c2ce3e44bc161118a8922e7aa412ef00f6034Craig Topper    DecodeUNPCKHMask(MVT::v4i32, ShuffleMask);
2023d8c2ce3e44bc161118a8922e7aa412ef00f6034Craig Topper    break;
2033d8c2ce3e44bc161118a8922e7aa412ef00f6034Craig Topper  case X86::VPUNPCKHDQYrr:
2043d8c2ce3e44bc161118a8922e7aa412ef00f6034Craig Topper    Src2Name = getRegName(MI->getOperand(2).getReg());
2053d8c2ce3e44bc161118a8922e7aa412ef00f6034Craig Topper    // FALL THROUGH.
2063d8c2ce3e44bc161118a8922e7aa412ef00f6034Craig Topper  case X86::VPUNPCKHDQYrm:
2073d8c2ce3e44bc161118a8922e7aa412ef00f6034Craig Topper    Src1Name = getRegName(MI->getOperand(1).getReg());
2083d8c2ce3e44bc161118a8922e7aa412ef00f6034Craig Topper    DestName = getRegName(MI->getOperand(0).getReg());
2093d8c2ce3e44bc161118a8922e7aa412ef00f6034Craig Topper    DecodeUNPCKHMask(MVT::v8i32, ShuffleMask);
2104644a936dc2e90d24c22c0cdbbf5038eef7830a9Chris Lattner    break;
2114644a936dc2e90d24c22c0cdbbf5038eef7830a9Chris Lattner  case X86::PUNPCKHQDQrr:
2123d8c2ce3e44bc161118a8922e7aa412ef00f6034Craig Topper  case X86::VPUNPCKHQDQrr:
2133d8c2ce3e44bc161118a8922e7aa412ef00f6034Craig Topper    Src2Name = getRegName(MI->getOperand(2).getReg());
2143d8c2ce3e44bc161118a8922e7aa412ef00f6034Craig Topper    // FALL THROUGH.
215e6482fabd20a2a5b4f81aff55812782f3b617514Craig Topper  case X86::PUNPCKHQDQrm:
2163d8c2ce3e44bc161118a8922e7aa412ef00f6034Craig Topper  case X86::VPUNPCKHQDQrm:
2173d8c2ce3e44bc161118a8922e7aa412ef00f6034Craig Topper    Src1Name = getRegName(MI->getOperand(1).getReg());
2183d8c2ce3e44bc161118a8922e7aa412ef00f6034Craig Topper    DestName = getRegName(MI->getOperand(0).getReg());
2193d8c2ce3e44bc161118a8922e7aa412ef00f6034Craig Topper    DecodeUNPCKHMask(MVT::v2i64, ShuffleMask);
2203d8c2ce3e44bc161118a8922e7aa412ef00f6034Craig Topper    break;
2213d8c2ce3e44bc161118a8922e7aa412ef00f6034Craig Topper  case X86::VPUNPCKHQDQYrr:
2223d8c2ce3e44bc161118a8922e7aa412ef00f6034Craig Topper    Src2Name = getRegName(MI->getOperand(2).getReg());
2233d8c2ce3e44bc161118a8922e7aa412ef00f6034Craig Topper    // FALL THROUGH.
2243d8c2ce3e44bc161118a8922e7aa412ef00f6034Craig Topper  case X86::VPUNPCKHQDQYrm:
2253d8c2ce3e44bc161118a8922e7aa412ef00f6034Craig Topper    Src1Name = getRegName(MI->getOperand(1).getReg());
2263d8c2ce3e44bc161118a8922e7aa412ef00f6034Craig Topper    DestName = getRegName(MI->getOperand(0).getReg());
2273d8c2ce3e44bc161118a8922e7aa412ef00f6034Craig Topper    DecodeUNPCKHMask(MVT::v4i64, ShuffleMask);
2284644a936dc2e90d24c22c0cdbbf5038eef7830a9Chris Lattner    break;
2296b1d0a3b366a637c0c96ea5cf7cfd8769469e6f3Bruno Cardoso Lopes
2304644a936dc2e90d24c22c0cdbbf5038eef7830a9Chris Lattner  case X86::PUNPCKLBWrr:
2313d8c2ce3e44bc161118a8922e7aa412ef00f6034Craig Topper  case X86::VPUNPCKLBWrr:
2323d8c2ce3e44bc161118a8922e7aa412ef00f6034Craig Topper    Src2Name = getRegName(MI->getOperand(2).getReg());
2333d8c2ce3e44bc161118a8922e7aa412ef00f6034Craig Topper    // FALL THROUGH.
234e6482fabd20a2a5b4f81aff55812782f3b617514Craig Topper  case X86::PUNPCKLBWrm:
2353d8c2ce3e44bc161118a8922e7aa412ef00f6034Craig Topper  case X86::VPUNPCKLBWrm:
2363d8c2ce3e44bc161118a8922e7aa412ef00f6034Craig Topper    Src1Name = getRegName(MI->getOperand(1).getReg());
2373d8c2ce3e44bc161118a8922e7aa412ef00f6034Craig Topper    DestName = getRegName(MI->getOperand(0).getReg());
2383d8c2ce3e44bc161118a8922e7aa412ef00f6034Craig Topper    DecodeUNPCKLMask(MVT::v16i8, ShuffleMask);
2393d8c2ce3e44bc161118a8922e7aa412ef00f6034Craig Topper    break;
2403d8c2ce3e44bc161118a8922e7aa412ef00f6034Craig Topper  case X86::VPUNPCKLBWYrr:
2413d8c2ce3e44bc161118a8922e7aa412ef00f6034Craig Topper    Src2Name = getRegName(MI->getOperand(2).getReg());
2423d8c2ce3e44bc161118a8922e7aa412ef00f6034Craig Topper    // FALL THROUGH.
2433d8c2ce3e44bc161118a8922e7aa412ef00f6034Craig Topper  case X86::VPUNPCKLBWYrm:
2443d8c2ce3e44bc161118a8922e7aa412ef00f6034Craig Topper    Src1Name = getRegName(MI->getOperand(1).getReg());
2453d8c2ce3e44bc161118a8922e7aa412ef00f6034Craig Topper    DestName = getRegName(MI->getOperand(0).getReg());
2463d8c2ce3e44bc161118a8922e7aa412ef00f6034Craig Topper    DecodeUNPCKLMask(MVT::v32i8, ShuffleMask);
2474644a936dc2e90d24c22c0cdbbf5038eef7830a9Chris Lattner    break;
2484644a936dc2e90d24c22c0cdbbf5038eef7830a9Chris Lattner  case X86::PUNPCKLWDrr:
2493d8c2ce3e44bc161118a8922e7aa412ef00f6034Craig Topper  case X86::VPUNPCKLWDrr:
2503d8c2ce3e44bc161118a8922e7aa412ef00f6034Craig Topper    Src2Name = getRegName(MI->getOperand(2).getReg());
2513d8c2ce3e44bc161118a8922e7aa412ef00f6034Craig Topper    // FALL THROUGH.
252e6482fabd20a2a5b4f81aff55812782f3b617514Craig Topper  case X86::PUNPCKLWDrm:
2533d8c2ce3e44bc161118a8922e7aa412ef00f6034Craig Topper  case X86::VPUNPCKLWDrm:
2543d8c2ce3e44bc161118a8922e7aa412ef00f6034Craig Topper    Src1Name = getRegName(MI->getOperand(1).getReg());
2553d8c2ce3e44bc161118a8922e7aa412ef00f6034Craig Topper    DestName = getRegName(MI->getOperand(0).getReg());
2563d8c2ce3e44bc161118a8922e7aa412ef00f6034Craig Topper    DecodeUNPCKLMask(MVT::v8i16, ShuffleMask);
2573d8c2ce3e44bc161118a8922e7aa412ef00f6034Craig Topper    break;
2583d8c2ce3e44bc161118a8922e7aa412ef00f6034Craig Topper  case X86::VPUNPCKLWDYrr:
2593d8c2ce3e44bc161118a8922e7aa412ef00f6034Craig Topper    Src2Name = getRegName(MI->getOperand(2).getReg());
2603d8c2ce3e44bc161118a8922e7aa412ef00f6034Craig Topper    // FALL THROUGH.
2613d8c2ce3e44bc161118a8922e7aa412ef00f6034Craig Topper  case X86::VPUNPCKLWDYrm:
2623d8c2ce3e44bc161118a8922e7aa412ef00f6034Craig Topper    Src1Name = getRegName(MI->getOperand(1).getReg());
2633d8c2ce3e44bc161118a8922e7aa412ef00f6034Craig Topper    DestName = getRegName(MI->getOperand(0).getReg());
2643d8c2ce3e44bc161118a8922e7aa412ef00f6034Craig Topper    DecodeUNPCKLMask(MVT::v16i16, ShuffleMask);
2654644a936dc2e90d24c22c0cdbbf5038eef7830a9Chris Lattner    break;
2664644a936dc2e90d24c22c0cdbbf5038eef7830a9Chris Lattner  case X86::PUNPCKLDQrr:
2673d8c2ce3e44bc161118a8922e7aa412ef00f6034Craig Topper  case X86::VPUNPCKLDQrr:
2683d8c2ce3e44bc161118a8922e7aa412ef00f6034Craig Topper    Src2Name = getRegName(MI->getOperand(2).getReg());
2693d8c2ce3e44bc161118a8922e7aa412ef00f6034Craig Topper    // FALL THROUGH.
270e6482fabd20a2a5b4f81aff55812782f3b617514Craig Topper  case X86::PUNPCKLDQrm:
2713d8c2ce3e44bc161118a8922e7aa412ef00f6034Craig Topper  case X86::VPUNPCKLDQrm:
2723d8c2ce3e44bc161118a8922e7aa412ef00f6034Craig Topper    Src1Name = getRegName(MI->getOperand(1).getReg());
2733d8c2ce3e44bc161118a8922e7aa412ef00f6034Craig Topper    DestName = getRegName(MI->getOperand(0).getReg());
2743d8c2ce3e44bc161118a8922e7aa412ef00f6034Craig Topper    DecodeUNPCKLMask(MVT::v4i32, ShuffleMask);
2753d8c2ce3e44bc161118a8922e7aa412ef00f6034Craig Topper    break;
2763d8c2ce3e44bc161118a8922e7aa412ef00f6034Craig Topper  case X86::VPUNPCKLDQYrr:
2773d8c2ce3e44bc161118a8922e7aa412ef00f6034Craig Topper    Src2Name = getRegName(MI->getOperand(2).getReg());
2783d8c2ce3e44bc161118a8922e7aa412ef00f6034Craig Topper    // FALL THROUGH.
2793d8c2ce3e44bc161118a8922e7aa412ef00f6034Craig Topper  case X86::VPUNPCKLDQYrm:
2803d8c2ce3e44bc161118a8922e7aa412ef00f6034Craig Topper    Src1Name = getRegName(MI->getOperand(1).getReg());
2813d8c2ce3e44bc161118a8922e7aa412ef00f6034Craig Topper    DestName = getRegName(MI->getOperand(0).getReg());
2823d8c2ce3e44bc161118a8922e7aa412ef00f6034Craig Topper    DecodeUNPCKLMask(MVT::v8i32, ShuffleMask);
2834644a936dc2e90d24c22c0cdbbf5038eef7830a9Chris Lattner    break;
2844644a936dc2e90d24c22c0cdbbf5038eef7830a9Chris Lattner  case X86::PUNPCKLQDQrr:
2853d8c2ce3e44bc161118a8922e7aa412ef00f6034Craig Topper  case X86::VPUNPCKLQDQrr:
2863d8c2ce3e44bc161118a8922e7aa412ef00f6034Craig Topper    Src2Name = getRegName(MI->getOperand(2).getReg());
2873d8c2ce3e44bc161118a8922e7aa412ef00f6034Craig Topper    // FALL THROUGH.
288e6482fabd20a2a5b4f81aff55812782f3b617514Craig Topper  case X86::PUNPCKLQDQrm:
2893d8c2ce3e44bc161118a8922e7aa412ef00f6034Craig Topper  case X86::VPUNPCKLQDQrm:
2903d8c2ce3e44bc161118a8922e7aa412ef00f6034Craig Topper    Src1Name = getRegName(MI->getOperand(1).getReg());
2913d8c2ce3e44bc161118a8922e7aa412ef00f6034Craig Topper    DestName = getRegName(MI->getOperand(0).getReg());
2923d8c2ce3e44bc161118a8922e7aa412ef00f6034Craig Topper    DecodeUNPCKLMask(MVT::v2i64, ShuffleMask);
2933d8c2ce3e44bc161118a8922e7aa412ef00f6034Craig Topper    break;
2943d8c2ce3e44bc161118a8922e7aa412ef00f6034Craig Topper  case X86::VPUNPCKLQDQYrr:
2953d8c2ce3e44bc161118a8922e7aa412ef00f6034Craig Topper    Src2Name = getRegName(MI->getOperand(2).getReg());
2963d8c2ce3e44bc161118a8922e7aa412ef00f6034Craig Topper    // FALL THROUGH.
2973d8c2ce3e44bc161118a8922e7aa412ef00f6034Craig Topper  case X86::VPUNPCKLQDQYrm:
2983d8c2ce3e44bc161118a8922e7aa412ef00f6034Craig Topper    Src1Name = getRegName(MI->getOperand(1).getReg());
2993d8c2ce3e44bc161118a8922e7aa412ef00f6034Craig Topper    DestName = getRegName(MI->getOperand(0).getReg());
3003d8c2ce3e44bc161118a8922e7aa412ef00f6034Craig Topper    DecodeUNPCKLMask(MVT::v4i64, ShuffleMask);
3014644a936dc2e90d24c22c0cdbbf5038eef7830a9Chris Lattner    break;
3026b1d0a3b366a637c0c96ea5cf7cfd8769469e6f3Bruno Cardoso Lopes
3036aa928d57a73a557d838f62af84e929bed0f276eChris Lattner  case X86::SHUFPDrri:
304796c193768547459cd6cbd667c8a43fedd601022Craig Topper  case X86::VSHUFPDrri:
305796c193768547459cd6cbd667c8a43fedd601022Craig Topper    Src2Name = getRegName(MI->getOperand(2).getReg());
306796c193768547459cd6cbd667c8a43fedd601022Craig Topper    // FALL THROUGH.
307e6482fabd20a2a5b4f81aff55812782f3b617514Craig Topper  case X86::SHUFPDrmi:
308796c193768547459cd6cbd667c8a43fedd601022Craig Topper  case X86::VSHUFPDrmi:
30936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    if(MI->getOperand(MI->getNumOperands()-1).isImm())
31036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines      DecodeSHUFPMask(MVT::v2f64,
31136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines                      MI->getOperand(MI->getNumOperands()-1).getImm(),
31236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines                      ShuffleMask);
31336e36ace77cf84d7c8326957925550624b3fc89cCraig Topper    Src1Name = getRegName(MI->getOperand(1).getReg());
31436e36ace77cf84d7c8326957925550624b3fc89cCraig Topper    DestName = getRegName(MI->getOperand(0).getReg());
31536e36ace77cf84d7c8326957925550624b3fc89cCraig Topper    break;
31636e36ace77cf84d7c8326957925550624b3fc89cCraig Topper  case X86::VSHUFPDYrri:
31736e36ace77cf84d7c8326957925550624b3fc89cCraig Topper    Src2Name = getRegName(MI->getOperand(2).getReg());
31836e36ace77cf84d7c8326957925550624b3fc89cCraig Topper    // FALL THROUGH.
31936e36ace77cf84d7c8326957925550624b3fc89cCraig Topper  case X86::VSHUFPDYrmi:
32036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    if(MI->getOperand(MI->getNumOperands()-1).isImm())
32136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines      DecodeSHUFPMask(MVT::v4f64,
32236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines                      MI->getOperand(MI->getNumOperands()-1).getImm(),
32336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines                      ShuffleMask);
324796c193768547459cd6cbd667c8a43fedd601022Craig Topper    Src1Name = getRegName(MI->getOperand(1).getReg());
325796c193768547459cd6cbd667c8a43fedd601022Craig Topper    DestName = getRegName(MI->getOperand(0).getReg());
326796c193768547459cd6cbd667c8a43fedd601022Craig Topper    break;
3276b1d0a3b366a637c0c96ea5cf7cfd8769469e6f3Bruno Cardoso Lopes
3286aa928d57a73a557d838f62af84e929bed0f276eChris Lattner  case X86::SHUFPSrri:
329796c193768547459cd6cbd667c8a43fedd601022Craig Topper  case X86::VSHUFPSrri:
330796c193768547459cd6cbd667c8a43fedd601022Craig Topper    Src2Name = getRegName(MI->getOperand(2).getReg());
331796c193768547459cd6cbd667c8a43fedd601022Craig Topper    // FALL THROUGH.
332e6482fabd20a2a5b4f81aff55812782f3b617514Craig Topper  case X86::SHUFPSrmi:
333796c193768547459cd6cbd667c8a43fedd601022Craig Topper  case X86::VSHUFPSrmi:
33436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    if(MI->getOperand(MI->getNumOperands()-1).isImm())
33536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines      DecodeSHUFPMask(MVT::v4f32,
33636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines                      MI->getOperand(MI->getNumOperands()-1).getImm(),
33736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines                      ShuffleMask);
33836e36ace77cf84d7c8326957925550624b3fc89cCraig Topper    Src1Name = getRegName(MI->getOperand(1).getReg());
33936e36ace77cf84d7c8326957925550624b3fc89cCraig Topper    DestName = getRegName(MI->getOperand(0).getReg());
34036e36ace77cf84d7c8326957925550624b3fc89cCraig Topper    break;
34136e36ace77cf84d7c8326957925550624b3fc89cCraig Topper  case X86::VSHUFPSYrri:
34236e36ace77cf84d7c8326957925550624b3fc89cCraig Topper    Src2Name = getRegName(MI->getOperand(2).getReg());
34336e36ace77cf84d7c8326957925550624b3fc89cCraig Topper    // FALL THROUGH.
34436e36ace77cf84d7c8326957925550624b3fc89cCraig Topper  case X86::VSHUFPSYrmi:
34536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    if(MI->getOperand(MI->getNumOperands()-1).isImm())
34636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines      DecodeSHUFPMask(MVT::v8f32,
34736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines                      MI->getOperand(MI->getNumOperands()-1).getImm(),
34836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines                      ShuffleMask);
349796c193768547459cd6cbd667c8a43fedd601022Craig Topper    Src1Name = getRegName(MI->getOperand(1).getReg());
350796c193768547459cd6cbd667c8a43fedd601022Craig Topper    DestName = getRegName(MI->getOperand(0).getReg());
351796c193768547459cd6cbd667c8a43fedd601022Craig Topper    break;
3526b1d0a3b366a637c0c96ea5cf7cfd8769469e6f3Bruno Cardoso Lopes
3534644a936dc2e90d24c22c0cdbbf5038eef7830a9Chris Lattner  case X86::UNPCKLPDrr:
354c4db4e5105ccd82df19f141957511f735a9be2d0David Greene  case X86::VUNPCKLPDrr:
355c4db4e5105ccd82df19f141957511f735a9be2d0David Greene    Src2Name = getRegName(MI->getOperand(2).getReg());
356c4db4e5105ccd82df19f141957511f735a9be2d0David Greene    // FALL THROUGH.
357e6482fabd20a2a5b4f81aff55812782f3b617514Craig Topper  case X86::UNPCKLPDrm:
358c4db4e5105ccd82df19f141957511f735a9be2d0David Greene  case X86::VUNPCKLPDrm:
3593d8c2ce3e44bc161118a8922e7aa412ef00f6034Craig Topper    DecodeUNPCKLMask(MVT::v2f64, ShuffleMask);
360c4db4e5105ccd82df19f141957511f735a9be2d0David Greene    Src1Name = getRegName(MI->getOperand(1).getReg());
361796c193768547459cd6cbd667c8a43fedd601022Craig Topper    DestName = getRegName(MI->getOperand(0).getReg());
362c4db4e5105ccd82df19f141957511f735a9be2d0David Greene    break;
363c4db4e5105ccd82df19f141957511f735a9be2d0David Greene  case X86::VUNPCKLPDYrr:
364c4db4e5105ccd82df19f141957511f735a9be2d0David Greene    Src2Name = getRegName(MI->getOperand(2).getReg());
365c4db4e5105ccd82df19f141957511f735a9be2d0David Greene    // FALL THROUGH.
366c4db4e5105ccd82df19f141957511f735a9be2d0David Greene  case X86::VUNPCKLPDYrm:
3673d8c2ce3e44bc161118a8922e7aa412ef00f6034Craig Topper    DecodeUNPCKLMask(MVT::v4f64, ShuffleMask);
368c4db4e5105ccd82df19f141957511f735a9be2d0David Greene    Src1Name = getRegName(MI->getOperand(1).getReg());
369796c193768547459cd6cbd667c8a43fedd601022Craig Topper    DestName = getRegName(MI->getOperand(0).getReg());
370c4db4e5105ccd82df19f141957511f735a9be2d0David Greene    break;
3716aa928d57a73a557d838f62af84e929bed0f276eChris Lattner  case X86::UNPCKLPSrr:
372c4db4e5105ccd82df19f141957511f735a9be2d0David Greene  case X86::VUNPCKLPSrr:
373c4db4e5105ccd82df19f141957511f735a9be2d0David Greene    Src2Name = getRegName(MI->getOperand(2).getReg());
374c4db4e5105ccd82df19f141957511f735a9be2d0David Greene    // FALL THROUGH.
375e6482fabd20a2a5b4f81aff55812782f3b617514Craig Topper  case X86::UNPCKLPSrm:
376c4db4e5105ccd82df19f141957511f735a9be2d0David Greene  case X86::VUNPCKLPSrm:
3773d8c2ce3e44bc161118a8922e7aa412ef00f6034Craig Topper    DecodeUNPCKLMask(MVT::v4f32, ShuffleMask);
378c4db4e5105ccd82df19f141957511f735a9be2d0David Greene    Src1Name = getRegName(MI->getOperand(1).getReg());
379796c193768547459cd6cbd667c8a43fedd601022Craig Topper    DestName = getRegName(MI->getOperand(0).getReg());
380c4db4e5105ccd82df19f141957511f735a9be2d0David Greene    break;
381c4db4e5105ccd82df19f141957511f735a9be2d0David Greene  case X86::VUNPCKLPSYrr:
382c4db4e5105ccd82df19f141957511f735a9be2d0David Greene    Src2Name = getRegName(MI->getOperand(2).getReg());
383c4db4e5105ccd82df19f141957511f735a9be2d0David Greene    // FALL THROUGH.
384c4db4e5105ccd82df19f141957511f735a9be2d0David Greene  case X86::VUNPCKLPSYrm:
3853d8c2ce3e44bc161118a8922e7aa412ef00f6034Craig Topper    DecodeUNPCKLMask(MVT::v8f32, ShuffleMask);
386c4db4e5105ccd82df19f141957511f735a9be2d0David Greene    Src1Name = getRegName(MI->getOperand(1).getReg());
387796c193768547459cd6cbd667c8a43fedd601022Craig Topper    DestName = getRegName(MI->getOperand(0).getReg());
388c4db4e5105ccd82df19f141957511f735a9be2d0David Greene    break;
3894644a936dc2e90d24c22c0cdbbf5038eef7830a9Chris Lattner  case X86::UNPCKHPDrr:
390f7de577a08a705970f0fd8f3c1bb40f7040e4476Craig Topper  case X86::VUNPCKHPDrr:
391f7de577a08a705970f0fd8f3c1bb40f7040e4476Craig Topper    Src2Name = getRegName(MI->getOperand(2).getReg());
392f7de577a08a705970f0fd8f3c1bb40f7040e4476Craig Topper    // FALL THROUGH.
393e6482fabd20a2a5b4f81aff55812782f3b617514Craig Topper  case X86::UNPCKHPDrm:
394f7de577a08a705970f0fd8f3c1bb40f7040e4476Craig Topper  case X86::VUNPCKHPDrm:
3953d8c2ce3e44bc161118a8922e7aa412ef00f6034Craig Topper    DecodeUNPCKHMask(MVT::v2f64, ShuffleMask);
396f7de577a08a705970f0fd8f3c1bb40f7040e4476Craig Topper    Src1Name = getRegName(MI->getOperand(1).getReg());
397796c193768547459cd6cbd667c8a43fedd601022Craig Topper    DestName = getRegName(MI->getOperand(0).getReg());
398f7de577a08a705970f0fd8f3c1bb40f7040e4476Craig Topper    break;
399f7de577a08a705970f0fd8f3c1bb40f7040e4476Craig Topper  case X86::VUNPCKHPDYrr:
400f7de577a08a705970f0fd8f3c1bb40f7040e4476Craig Topper    Src2Name = getRegName(MI->getOperand(2).getReg());
401f7de577a08a705970f0fd8f3c1bb40f7040e4476Craig Topper    // FALL THROUGH.
402f7de577a08a705970f0fd8f3c1bb40f7040e4476Craig Topper  case X86::VUNPCKHPDYrm:
4033d8c2ce3e44bc161118a8922e7aa412ef00f6034Craig Topper    DecodeUNPCKHMask(MVT::v4f64, ShuffleMask);
404f7de577a08a705970f0fd8f3c1bb40f7040e4476Craig Topper    Src1Name = getRegName(MI->getOperand(1).getReg());
405796c193768547459cd6cbd667c8a43fedd601022Craig Topper    DestName = getRegName(MI->getOperand(0).getReg());
406f7de577a08a705970f0fd8f3c1bb40f7040e4476Craig Topper    break;
4074644a936dc2e90d24c22c0cdbbf5038eef7830a9Chris Lattner  case X86::UNPCKHPSrr:
408f7de577a08a705970f0fd8f3c1bb40f7040e4476Craig Topper  case X86::VUNPCKHPSrr:
409f7de577a08a705970f0fd8f3c1bb40f7040e4476Craig Topper    Src2Name = getRegName(MI->getOperand(2).getReg());
410f7de577a08a705970f0fd8f3c1bb40f7040e4476Craig Topper    // FALL THROUGH.
411e6482fabd20a2a5b4f81aff55812782f3b617514Craig Topper  case X86::UNPCKHPSrm:
412f7de577a08a705970f0fd8f3c1bb40f7040e4476Craig Topper  case X86::VUNPCKHPSrm:
4133d8c2ce3e44bc161118a8922e7aa412ef00f6034Craig Topper    DecodeUNPCKHMask(MVT::v4f32, ShuffleMask);
414f7de577a08a705970f0fd8f3c1bb40f7040e4476Craig Topper    Src1Name = getRegName(MI->getOperand(1).getReg());
415796c193768547459cd6cbd667c8a43fedd601022Craig Topper    DestName = getRegName(MI->getOperand(0).getReg());
416f7de577a08a705970f0fd8f3c1bb40f7040e4476Craig Topper    break;
417f7de577a08a705970f0fd8f3c1bb40f7040e4476Craig Topper  case X86::VUNPCKHPSYrr:
418f7de577a08a705970f0fd8f3c1bb40f7040e4476Craig Topper    Src2Name = getRegName(MI->getOperand(2).getReg());
419f7de577a08a705970f0fd8f3c1bb40f7040e4476Craig Topper    // FALL THROUGH.
420f7de577a08a705970f0fd8f3c1bb40f7040e4476Craig Topper  case X86::VUNPCKHPSYrm:
4213d8c2ce3e44bc161118a8922e7aa412ef00f6034Craig Topper    DecodeUNPCKHMask(MVT::v8f32, ShuffleMask);
422f7de577a08a705970f0fd8f3c1bb40f7040e4476Craig Topper    Src1Name = getRegName(MI->getOperand(1).getReg());
423796c193768547459cd6cbd667c8a43fedd601022Craig Topper    DestName = getRegName(MI->getOperand(0).getReg());
424f7de577a08a705970f0fd8f3c1bb40f7040e4476Craig Topper    break;
4252eb4c2bcadfbef9d3c4e2fbb6478ed5dc3d65524Bruno Cardoso Lopes  case X86::VPERMILPSri:
42636e36ace77cf84d7c8326957925550624b3fc89cCraig Topper    Src1Name = getRegName(MI->getOperand(1).getReg());
42736e36ace77cf84d7c8326957925550624b3fc89cCraig Topper    // FALL THROUGH.
42836e36ace77cf84d7c8326957925550624b3fc89cCraig Topper  case X86::VPERMILPSmi:
42936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    if(MI->getOperand(MI->getNumOperands()-1).isImm())
43036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines      DecodePSHUFMask(MVT::v4f32,
43136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines                      MI->getOperand(MI->getNumOperands()-1).getImm(),
43236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines                      ShuffleMask);
43336e36ace77cf84d7c8326957925550624b3fc89cCraig Topper    DestName = getRegName(MI->getOperand(0).getReg());
4348036586229e3e2eac29af435ab325b89019a1097Duncan Sands    break;
43565b74e1d00eef81b596b4c207fba069aa1eb8214Bruno Cardoso Lopes  case X86::VPERMILPSYri:
43636e36ace77cf84d7c8326957925550624b3fc89cCraig Topper    Src1Name = getRegName(MI->getOperand(1).getReg());
43736e36ace77cf84d7c8326957925550624b3fc89cCraig Topper    // FALL THROUGH.
43836e36ace77cf84d7c8326957925550624b3fc89cCraig Topper  case X86::VPERMILPSYmi:
43936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    if(MI->getOperand(MI->getNumOperands()-1).isImm())
44036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines      DecodePSHUFMask(MVT::v8f32,
44136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines                      MI->getOperand(MI->getNumOperands()-1).getImm(),
44236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines                      ShuffleMask);
44336e36ace77cf84d7c8326957925550624b3fc89cCraig Topper    DestName = getRegName(MI->getOperand(0).getReg());
44465b74e1d00eef81b596b4c207fba069aa1eb8214Bruno Cardoso Lopes    break;
4452eb4c2bcadfbef9d3c4e2fbb6478ed5dc3d65524Bruno Cardoso Lopes  case X86::VPERMILPDri:
44636e36ace77cf84d7c8326957925550624b3fc89cCraig Topper    Src1Name = getRegName(MI->getOperand(1).getReg());
44736e36ace77cf84d7c8326957925550624b3fc89cCraig Topper    // FALL THROUGH.
44836e36ace77cf84d7c8326957925550624b3fc89cCraig Topper  case X86::VPERMILPDmi:
44936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    if(MI->getOperand(MI->getNumOperands()-1).isImm())
45036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines      DecodePSHUFMask(MVT::v2f64,
45136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines                      MI->getOperand(MI->getNumOperands()-1).getImm(),
45236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines                      ShuffleMask);
45336e36ace77cf84d7c8326957925550624b3fc89cCraig Topper    DestName = getRegName(MI->getOperand(0).getReg());
4542eb4c2bcadfbef9d3c4e2fbb6478ed5dc3d65524Bruno Cardoso Lopes    break;
45565b74e1d00eef81b596b4c207fba069aa1eb8214Bruno Cardoso Lopes  case X86::VPERMILPDYri:
45636e36ace77cf84d7c8326957925550624b3fc89cCraig Topper    Src1Name = getRegName(MI->getOperand(1).getReg());
45736e36ace77cf84d7c8326957925550624b3fc89cCraig Topper    // FALL THROUGH.
45836e36ace77cf84d7c8326957925550624b3fc89cCraig Topper  case X86::VPERMILPDYmi:
45936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    if(MI->getOperand(MI->getNumOperands()-1).isImm())
46036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines      DecodePSHUFMask(MVT::v4f64,
46136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines                      MI->getOperand(MI->getNumOperands()-1).getImm(),
46236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines                      ShuffleMask);
46336e36ace77cf84d7c8326957925550624b3fc89cCraig Topper    DestName = getRegName(MI->getOperand(0).getReg());
46465b74e1d00eef81b596b4c207fba069aa1eb8214Bruno Cardoso Lopes    break;
46553cae1362dca8aa312c3e36c10b106ea7d349f93Bruno Cardoso Lopes  case X86::VPERM2F128rr:
46636e36ace77cf84d7c8326957925550624b3fc89cCraig Topper  case X86::VPERM2I128rr:
46753cae1362dca8aa312c3e36c10b106ea7d349f93Bruno Cardoso Lopes    Src2Name = getRegName(MI->getOperand(2).getReg());
46836e36ace77cf84d7c8326957925550624b3fc89cCraig Topper    // FALL THROUGH.
46936e36ace77cf84d7c8326957925550624b3fc89cCraig Topper  case X86::VPERM2F128rm:
47036e36ace77cf84d7c8326957925550624b3fc89cCraig Topper  case X86::VPERM2I128rm:
471d156dc11f9acd83e3369c069d5006a0203be13d6Craig Topper    // For instruction comments purpose, assume the 256-bit vector is v4i64.
47236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    if(MI->getOperand(MI->getNumOperands()-1).isImm())
47336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines      DecodeVPERM2X128Mask(MVT::v4i64,
47436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines                           MI->getOperand(MI->getNumOperands()-1).getImm(),
47536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines                           ShuffleMask);
47636e36ace77cf84d7c8326957925550624b3fc89cCraig Topper    Src1Name = getRegName(MI->getOperand(1).getReg());
47736e36ace77cf84d7c8326957925550624b3fc89cCraig Topper    DestName = getRegName(MI->getOperand(0).getReg());
47853cae1362dca8aa312c3e36c10b106ea7d349f93Bruno Cardoso Lopes    break;
479156f5bb56e2730013fcddf90e8cad0e5e3ee1928Craig Topper  case X86::VPERMQYri:
480156f5bb56e2730013fcddf90e8cad0e5e3ee1928Craig Topper  case X86::VPERMPDYri:
481156f5bb56e2730013fcddf90e8cad0e5e3ee1928Craig Topper    Src1Name = getRegName(MI->getOperand(1).getReg());
482156f5bb56e2730013fcddf90e8cad0e5e3ee1928Craig Topper    // FALL THROUGH.
483156f5bb56e2730013fcddf90e8cad0e5e3ee1928Craig Topper  case X86::VPERMQYmi:
484156f5bb56e2730013fcddf90e8cad0e5e3ee1928Craig Topper  case X86::VPERMPDYmi:
48536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    if(MI->getOperand(MI->getNumOperands()-1).isImm())
48636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines      DecodeVPERMMask(MI->getOperand(MI->getNumOperands()-1).getImm(),
48736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines                      ShuffleMask);
488156f5bb56e2730013fcddf90e8cad0e5e3ee1928Craig Topper    DestName = getRegName(MI->getOperand(0).getReg());
489156f5bb56e2730013fcddf90e8cad0e5e3ee1928Craig Topper    break;
4906aa928d57a73a557d838f62af84e929bed0f276eChris Lattner  }
4916aa928d57a73a557d838f62af84e929bed0f276eChris Lattner
4926b1d0a3b366a637c0c96ea5cf7cfd8769469e6f3Bruno Cardoso Lopes
4936aa928d57a73a557d838f62af84e929bed0f276eChris Lattner  // If this was a shuffle operation, print the shuffle mask.
4946aa928d57a73a557d838f62af84e929bed0f276eChris Lattner  if (!ShuffleMask.empty()) {
495dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    if (!DestName) DestName = Src1Name;
4966aa928d57a73a557d838f62af84e929bed0f276eChris Lattner    OS << (DestName ? DestName : "mem") << " = ";
4976b1d0a3b366a637c0c96ea5cf7cfd8769469e6f3Bruno Cardoso Lopes
4986aa928d57a73a557d838f62af84e929bed0f276eChris Lattner    // If the two sources are the same, canonicalize the input elements to be
4996aa928d57a73a557d838f62af84e929bed0f276eChris Lattner    // from the first src so that we get larger element spans.
5006aa928d57a73a557d838f62af84e929bed0f276eChris Lattner    if (Src1Name == Src2Name) {
5016aa928d57a73a557d838f62af84e929bed0f276eChris Lattner      for (unsigned i = 0, e = ShuffleMask.size(); i != e; ++i) {
5026aa928d57a73a557d838f62af84e929bed0f276eChris Lattner        if ((int)ShuffleMask[i] >= 0 && // Not sentinel.
503a1ffc681ed7372bd371c44a6e186291b6416fe47Craig Topper            ShuffleMask[i] >= (int)e)        // From second mask.
5046aa928d57a73a557d838f62af84e929bed0f276eChris Lattner          ShuffleMask[i] -= e;
5056aa928d57a73a557d838f62af84e929bed0f276eChris Lattner      }
5066aa928d57a73a557d838f62af84e929bed0f276eChris Lattner    }
5076b1d0a3b366a637c0c96ea5cf7cfd8769469e6f3Bruno Cardoso Lopes
5086aa928d57a73a557d838f62af84e929bed0f276eChris Lattner    // The shuffle mask specifies which elements of the src1/src2 fill in the
5096aa928d57a73a557d838f62af84e929bed0f276eChris Lattner    // destination, with a few sentinel values.  Loop through and print them
5106aa928d57a73a557d838f62af84e929bed0f276eChris Lattner    // out.
5116aa928d57a73a557d838f62af84e929bed0f276eChris Lattner    for (unsigned i = 0, e = ShuffleMask.size(); i != e; ++i) {
5126aa928d57a73a557d838f62af84e929bed0f276eChris Lattner      if (i != 0)
5136aa928d57a73a557d838f62af84e929bed0f276eChris Lattner        OS << ',';
51447817f30f28118ba278ab11740fa9f0adcfb462dBenjamin Kramer      if (ShuffleMask[i] == SM_SentinelZero) {
5156aa928d57a73a557d838f62af84e929bed0f276eChris Lattner        OS << "zero";
5166aa928d57a73a557d838f62af84e929bed0f276eChris Lattner        continue;
5176aa928d57a73a557d838f62af84e929bed0f276eChris Lattner      }
5186b1d0a3b366a637c0c96ea5cf7cfd8769469e6f3Bruno Cardoso Lopes
5196aa928d57a73a557d838f62af84e929bed0f276eChris Lattner      // Otherwise, it must come from src1 or src2.  Print the span of elements
5206aa928d57a73a557d838f62af84e929bed0f276eChris Lattner      // that comes from this src.
521a1ffc681ed7372bd371c44a6e186291b6416fe47Craig Topper      bool isSrc1 = ShuffleMask[i] < (int)ShuffleMask.size();
5226aa928d57a73a557d838f62af84e929bed0f276eChris Lattner      const char *SrcName = isSrc1 ? Src1Name : Src2Name;
5236aa928d57a73a557d838f62af84e929bed0f276eChris Lattner      OS << (SrcName ? SrcName : "mem") << '[';
5246aa928d57a73a557d838f62af84e929bed0f276eChris Lattner      bool IsFirst = true;
5256aa928d57a73a557d838f62af84e929bed0f276eChris Lattner      while (i != e &&
5266aa928d57a73a557d838f62af84e929bed0f276eChris Lattner             (int)ShuffleMask[i] >= 0 &&
527a1ffc681ed7372bd371c44a6e186291b6416fe47Craig Topper             (ShuffleMask[i] < (int)ShuffleMask.size()) == isSrc1) {
5286aa928d57a73a557d838f62af84e929bed0f276eChris Lattner        if (!IsFirst)
5296aa928d57a73a557d838f62af84e929bed0f276eChris Lattner          OS << ',';
5306aa928d57a73a557d838f62af84e929bed0f276eChris Lattner        else
5316aa928d57a73a557d838f62af84e929bed0f276eChris Lattner          IsFirst = false;
5326aa928d57a73a557d838f62af84e929bed0f276eChris Lattner        OS << ShuffleMask[i] % ShuffleMask.size();
5336aa928d57a73a557d838f62af84e929bed0f276eChris Lattner        ++i;
5346aa928d57a73a557d838f62af84e929bed0f276eChris Lattner      }
5356aa928d57a73a557d838f62af84e929bed0f276eChris Lattner      OS << ']';
5366aa928d57a73a557d838f62af84e929bed0f276eChris Lattner      --i;  // For loop increments element #.
5376aa928d57a73a557d838f62af84e929bed0f276eChris Lattner    }
5386aa928d57a73a557d838f62af84e929bed0f276eChris Lattner    //MI->print(OS, 0);
5396aa928d57a73a557d838f62af84e929bed0f276eChris Lattner    OS << "\n";
5406aa928d57a73a557d838f62af84e929bed0f276eChris Lattner  }
5416b1d0a3b366a637c0c96ea5cf7cfd8769469e6f3Bruno Cardoso Lopes
5426aa928d57a73a557d838f62af84e929bed0f276eChris Lattner}
543