xref: /aosp_15_r20/external/llvm/lib/Target/X86/InstPrinter/X86InstComments.cpp (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker //===-- X86InstComments.cpp - Generate verbose-asm comments for instrs ----===//
2*9880d681SAndroid Build Coastguard Worker //
3*9880d681SAndroid Build Coastguard Worker //                     The LLVM Compiler Infrastructure
4*9880d681SAndroid Build Coastguard Worker //
5*9880d681SAndroid Build Coastguard Worker // This file is distributed under the University of Illinois Open Source
6*9880d681SAndroid Build Coastguard Worker // License. See LICENSE.TXT for details.
7*9880d681SAndroid Build Coastguard Worker //
8*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
9*9880d681SAndroid Build Coastguard Worker //
10*9880d681SAndroid Build Coastguard Worker // This defines functionality used to emit comments about X86 instructions to
11*9880d681SAndroid Build Coastguard Worker // an output stream for -fverbose-asm.
12*9880d681SAndroid Build Coastguard Worker //
13*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
14*9880d681SAndroid Build Coastguard Worker 
15*9880d681SAndroid Build Coastguard Worker #include "X86InstComments.h"
16*9880d681SAndroid Build Coastguard Worker #include "MCTargetDesc/X86MCTargetDesc.h"
17*9880d681SAndroid Build Coastguard Worker #include "Utils/X86ShuffleDecode.h"
18*9880d681SAndroid Build Coastguard Worker #include "llvm/MC/MCInst.h"
19*9880d681SAndroid Build Coastguard Worker #include "llvm/CodeGen/MachineValueType.h"
20*9880d681SAndroid Build Coastguard Worker #include "llvm/Support/raw_ostream.h"
21*9880d681SAndroid Build Coastguard Worker 
22*9880d681SAndroid Build Coastguard Worker using namespace llvm;
23*9880d681SAndroid Build Coastguard Worker 
24*9880d681SAndroid Build Coastguard Worker #define CASE_SSE_INS_COMMON(Inst, src)            \
25*9880d681SAndroid Build Coastguard Worker   case X86::Inst##src:
26*9880d681SAndroid Build Coastguard Worker 
27*9880d681SAndroid Build Coastguard Worker #define CASE_AVX_INS_COMMON(Inst, Suffix, src)    \
28*9880d681SAndroid Build Coastguard Worker   case X86::V##Inst##Suffix##src:
29*9880d681SAndroid Build Coastguard Worker 
30*9880d681SAndroid Build Coastguard Worker #define CASE_MASK_INS_COMMON(Inst, Suffix, src)   \
31*9880d681SAndroid Build Coastguard Worker   case X86::V##Inst##Suffix##src##k:
32*9880d681SAndroid Build Coastguard Worker 
33*9880d681SAndroid Build Coastguard Worker #define CASE_MASKZ_INS_COMMON(Inst, Suffix, src)  \
34*9880d681SAndroid Build Coastguard Worker   case X86::V##Inst##Suffix##src##kz:
35*9880d681SAndroid Build Coastguard Worker 
36*9880d681SAndroid Build Coastguard Worker #define CASE_AVX512_INS_COMMON(Inst, Suffix, src) \
37*9880d681SAndroid Build Coastguard Worker   CASE_AVX_INS_COMMON(Inst, Suffix, src)          \
38*9880d681SAndroid Build Coastguard Worker   CASE_MASK_INS_COMMON(Inst, Suffix, src)         \
39*9880d681SAndroid Build Coastguard Worker   CASE_MASKZ_INS_COMMON(Inst, Suffix, src)
40*9880d681SAndroid Build Coastguard Worker 
41*9880d681SAndroid Build Coastguard Worker #define CASE_MOVDUP(Inst, src)                    \
42*9880d681SAndroid Build Coastguard Worker   CASE_AVX512_INS_COMMON(Inst, Z, r##src)         \
43*9880d681SAndroid Build Coastguard Worker   CASE_AVX512_INS_COMMON(Inst, Z256, r##src)      \
44*9880d681SAndroid Build Coastguard Worker   CASE_AVX512_INS_COMMON(Inst, Z128, r##src)      \
45*9880d681SAndroid Build Coastguard Worker   CASE_AVX_INS_COMMON(Inst, , r##src)             \
46*9880d681SAndroid Build Coastguard Worker   CASE_AVX_INS_COMMON(Inst, Y, r##src)            \
47*9880d681SAndroid Build Coastguard Worker   CASE_SSE_INS_COMMON(Inst, r##src)
48*9880d681SAndroid Build Coastguard Worker 
49*9880d681SAndroid Build Coastguard Worker #define CASE_MASK_MOVDUP(Inst, src)               \
50*9880d681SAndroid Build Coastguard Worker   CASE_MASK_INS_COMMON(Inst, Z, r##src)           \
51*9880d681SAndroid Build Coastguard Worker   CASE_MASK_INS_COMMON(Inst, Z256, r##src)        \
52*9880d681SAndroid Build Coastguard Worker   CASE_MASK_INS_COMMON(Inst, Z128, r##src)
53*9880d681SAndroid Build Coastguard Worker 
54*9880d681SAndroid Build Coastguard Worker #define CASE_MASKZ_MOVDUP(Inst, src)              \
55*9880d681SAndroid Build Coastguard Worker   CASE_MASKZ_INS_COMMON(Inst, Z, r##src)          \
56*9880d681SAndroid Build Coastguard Worker   CASE_MASKZ_INS_COMMON(Inst, Z256, r##src)       \
57*9880d681SAndroid Build Coastguard Worker   CASE_MASKZ_INS_COMMON(Inst, Z128, r##src)
58*9880d681SAndroid Build Coastguard Worker 
59*9880d681SAndroid Build Coastguard Worker #define CASE_PMOVZX(Inst, src)                    \
60*9880d681SAndroid Build Coastguard Worker   CASE_AVX512_INS_COMMON(Inst, Z, r##src)         \
61*9880d681SAndroid Build Coastguard Worker   CASE_AVX512_INS_COMMON(Inst, Z256, r##src)      \
62*9880d681SAndroid Build Coastguard Worker   CASE_AVX512_INS_COMMON(Inst, Z128, r##src)      \
63*9880d681SAndroid Build Coastguard Worker   CASE_AVX_INS_COMMON(Inst, , r##src)             \
64*9880d681SAndroid Build Coastguard Worker   CASE_AVX_INS_COMMON(Inst, Y, r##src)            \
65*9880d681SAndroid Build Coastguard Worker   CASE_SSE_INS_COMMON(Inst, r##src)
66*9880d681SAndroid Build Coastguard Worker 
67*9880d681SAndroid Build Coastguard Worker #define CASE_MASK_PMOVZX(Inst, src)               \
68*9880d681SAndroid Build Coastguard Worker   CASE_MASK_INS_COMMON(Inst, Z, r##src)           \
69*9880d681SAndroid Build Coastguard Worker   CASE_MASK_INS_COMMON(Inst, Z256, r##src)        \
70*9880d681SAndroid Build Coastguard Worker   CASE_MASK_INS_COMMON(Inst, Z128, r##src)
71*9880d681SAndroid Build Coastguard Worker 
72*9880d681SAndroid Build Coastguard Worker #define CASE_MASKZ_PMOVZX(Inst, src)              \
73*9880d681SAndroid Build Coastguard Worker   CASE_MASKZ_INS_COMMON(Inst, Z, r##src)          \
74*9880d681SAndroid Build Coastguard Worker   CASE_MASKZ_INS_COMMON(Inst, Z256, r##src)       \
75*9880d681SAndroid Build Coastguard Worker   CASE_MASKZ_INS_COMMON(Inst, Z128, r##src)
76*9880d681SAndroid Build Coastguard Worker 
77*9880d681SAndroid Build Coastguard Worker #define CASE_UNPCK(Inst, src)                     \
78*9880d681SAndroid Build Coastguard Worker   CASE_AVX512_INS_COMMON(Inst, Z, r##src)         \
79*9880d681SAndroid Build Coastguard Worker   CASE_AVX512_INS_COMMON(Inst, Z256, r##src)      \
80*9880d681SAndroid Build Coastguard Worker   CASE_AVX512_INS_COMMON(Inst, Z128, r##src)      \
81*9880d681SAndroid Build Coastguard Worker   CASE_AVX_INS_COMMON(Inst, , r##src)             \
82*9880d681SAndroid Build Coastguard Worker   CASE_AVX_INS_COMMON(Inst, Y, r##src)            \
83*9880d681SAndroid Build Coastguard Worker   CASE_SSE_INS_COMMON(Inst, r##src)
84*9880d681SAndroid Build Coastguard Worker 
85*9880d681SAndroid Build Coastguard Worker #define CASE_MASK_UNPCK(Inst, src)                \
86*9880d681SAndroid Build Coastguard Worker   CASE_MASK_INS_COMMON(Inst, Z, r##src)           \
87*9880d681SAndroid Build Coastguard Worker   CASE_MASK_INS_COMMON(Inst, Z256, r##src)        \
88*9880d681SAndroid Build Coastguard Worker   CASE_MASK_INS_COMMON(Inst, Z128, r##src)
89*9880d681SAndroid Build Coastguard Worker 
90*9880d681SAndroid Build Coastguard Worker #define CASE_MASKZ_UNPCK(Inst, src)               \
91*9880d681SAndroid Build Coastguard Worker   CASE_MASKZ_INS_COMMON(Inst, Z, r##src)          \
92*9880d681SAndroid Build Coastguard Worker   CASE_MASKZ_INS_COMMON(Inst, Z256, r##src)       \
93*9880d681SAndroid Build Coastguard Worker   CASE_MASKZ_INS_COMMON(Inst, Z128, r##src)
94*9880d681SAndroid Build Coastguard Worker 
95*9880d681SAndroid Build Coastguard Worker #define CASE_SHUF(Inst, suf)                      \
96*9880d681SAndroid Build Coastguard Worker   CASE_AVX512_INS_COMMON(Inst, Z, suf)            \
97*9880d681SAndroid Build Coastguard Worker   CASE_AVX512_INS_COMMON(Inst, Z256, suf)         \
98*9880d681SAndroid Build Coastguard Worker   CASE_AVX512_INS_COMMON(Inst, Z128, suf)         \
99*9880d681SAndroid Build Coastguard Worker   CASE_AVX_INS_COMMON(Inst, , suf)                \
100*9880d681SAndroid Build Coastguard Worker   CASE_AVX_INS_COMMON(Inst, Y, suf)               \
101*9880d681SAndroid Build Coastguard Worker   CASE_SSE_INS_COMMON(Inst, suf)
102*9880d681SAndroid Build Coastguard Worker 
103*9880d681SAndroid Build Coastguard Worker #define CASE_MASK_SHUF(Inst, src)                 \
104*9880d681SAndroid Build Coastguard Worker   CASE_MASK_INS_COMMON(Inst, Z, r##src##i)        \
105*9880d681SAndroid Build Coastguard Worker   CASE_MASK_INS_COMMON(Inst, Z256, r##src##i)     \
106*9880d681SAndroid Build Coastguard Worker   CASE_MASK_INS_COMMON(Inst, Z128, r##src##i)
107*9880d681SAndroid Build Coastguard Worker 
108*9880d681SAndroid Build Coastguard Worker #define CASE_MASKZ_SHUF(Inst, src)                \
109*9880d681SAndroid Build Coastguard Worker   CASE_MASKZ_INS_COMMON(Inst, Z, r##src##i)       \
110*9880d681SAndroid Build Coastguard Worker   CASE_MASKZ_INS_COMMON(Inst, Z256, r##src##i)    \
111*9880d681SAndroid Build Coastguard Worker   CASE_MASKZ_INS_COMMON(Inst, Z128, r##src##i)
112*9880d681SAndroid Build Coastguard Worker 
113*9880d681SAndroid Build Coastguard Worker #define CASE_VPERMILPI(Inst, src)                 \
114*9880d681SAndroid Build Coastguard Worker   CASE_AVX512_INS_COMMON(Inst, Z, src##i)         \
115*9880d681SAndroid Build Coastguard Worker   CASE_AVX512_INS_COMMON(Inst, Z256, src##i)      \
116*9880d681SAndroid Build Coastguard Worker   CASE_AVX512_INS_COMMON(Inst, Z128, src##i)      \
117*9880d681SAndroid Build Coastguard Worker   CASE_AVX_INS_COMMON(Inst, , src##i)             \
118*9880d681SAndroid Build Coastguard Worker   CASE_AVX_INS_COMMON(Inst, Y, src##i)
119*9880d681SAndroid Build Coastguard Worker 
120*9880d681SAndroid Build Coastguard Worker #define CASE_MASK_VPERMILPI(Inst, src)            \
121*9880d681SAndroid Build Coastguard Worker   CASE_MASK_INS_COMMON(Inst, Z, src##i)           \
122*9880d681SAndroid Build Coastguard Worker   CASE_MASK_INS_COMMON(Inst, Z256, src##i)        \
123*9880d681SAndroid Build Coastguard Worker   CASE_MASK_INS_COMMON(Inst, Z128, src##i)
124*9880d681SAndroid Build Coastguard Worker 
125*9880d681SAndroid Build Coastguard Worker #define CASE_MASKZ_VPERMILPI(Inst, src)           \
126*9880d681SAndroid Build Coastguard Worker   CASE_MASKZ_INS_COMMON(Inst, Z, src##i)          \
127*9880d681SAndroid Build Coastguard Worker   CASE_MASKZ_INS_COMMON(Inst, Z256, src##i)       \
128*9880d681SAndroid Build Coastguard Worker   CASE_MASKZ_INS_COMMON(Inst, Z128, src##i)
129*9880d681SAndroid Build Coastguard Worker 
130*9880d681SAndroid Build Coastguard Worker #define CASE_VPERM(Inst, src)                     \
131*9880d681SAndroid Build Coastguard Worker   CASE_AVX512_INS_COMMON(Inst, Z, src##i)         \
132*9880d681SAndroid Build Coastguard Worker   CASE_AVX512_INS_COMMON(Inst, Z256, src##i)      \
133*9880d681SAndroid Build Coastguard Worker   CASE_AVX_INS_COMMON(Inst, Y, src##i)
134*9880d681SAndroid Build Coastguard Worker 
135*9880d681SAndroid Build Coastguard Worker #define CASE_MASK_VPERM(Inst, src)                \
136*9880d681SAndroid Build Coastguard Worker   CASE_MASK_INS_COMMON(Inst, Z, src##i)           \
137*9880d681SAndroid Build Coastguard Worker   CASE_MASK_INS_COMMON(Inst, Z256, src##i)
138*9880d681SAndroid Build Coastguard Worker 
139*9880d681SAndroid Build Coastguard Worker #define CASE_MASKZ_VPERM(Inst, src)               \
140*9880d681SAndroid Build Coastguard Worker   CASE_MASKZ_INS_COMMON(Inst, Z, src##i)          \
141*9880d681SAndroid Build Coastguard Worker   CASE_MASKZ_INS_COMMON(Inst, Z256, src##i)
142*9880d681SAndroid Build Coastguard Worker 
143*9880d681SAndroid Build Coastguard Worker #define CASE_VSHUF(Inst, src)                          \
144*9880d681SAndroid Build Coastguard Worker   CASE_AVX512_INS_COMMON(SHUFF##Inst, Z, r##src##i)    \
145*9880d681SAndroid Build Coastguard Worker   CASE_AVX512_INS_COMMON(SHUFI##Inst, Z, r##src##i)    \
146*9880d681SAndroid Build Coastguard Worker   CASE_AVX512_INS_COMMON(SHUFF##Inst, Z256, r##src##i) \
147*9880d681SAndroid Build Coastguard Worker   CASE_AVX512_INS_COMMON(SHUFI##Inst, Z256, r##src##i)
148*9880d681SAndroid Build Coastguard Worker 
149*9880d681SAndroid Build Coastguard Worker #define CASE_MASK_VSHUF(Inst, src)                    \
150*9880d681SAndroid Build Coastguard Worker   CASE_MASK_INS_COMMON(SHUFF##Inst, Z, r##src##i)     \
151*9880d681SAndroid Build Coastguard Worker   CASE_MASK_INS_COMMON(SHUFI##Inst, Z, r##src##i)     \
152*9880d681SAndroid Build Coastguard Worker   CASE_MASK_INS_COMMON(SHUFF##Inst, Z256, r##src##i)  \
153*9880d681SAndroid Build Coastguard Worker   CASE_MASK_INS_COMMON(SHUFI##Inst, Z256, r##src##i)
154*9880d681SAndroid Build Coastguard Worker 
155*9880d681SAndroid Build Coastguard Worker #define CASE_MASKZ_VSHUF(Inst, src)                   \
156*9880d681SAndroid Build Coastguard Worker   CASE_MASKZ_INS_COMMON(SHUFF##Inst, Z, r##src##i)    \
157*9880d681SAndroid Build Coastguard Worker   CASE_MASKZ_INS_COMMON(SHUFI##Inst, Z, r##src##i)    \
158*9880d681SAndroid Build Coastguard Worker   CASE_MASKZ_INS_COMMON(SHUFF##Inst, Z256, r##src##i) \
159*9880d681SAndroid Build Coastguard Worker   CASE_MASKZ_INS_COMMON(SHUFI##Inst, Z256, r##src##i)
160*9880d681SAndroid Build Coastguard Worker 
getVectorRegSize(unsigned RegNo)161*9880d681SAndroid Build Coastguard Worker static unsigned getVectorRegSize(unsigned RegNo) {
162*9880d681SAndroid Build Coastguard Worker   if (X86::ZMM0 <= RegNo && RegNo <= X86::ZMM31)
163*9880d681SAndroid Build Coastguard Worker     return 512;
164*9880d681SAndroid Build Coastguard Worker   if (X86::YMM0 <= RegNo && RegNo <= X86::YMM31)
165*9880d681SAndroid Build Coastguard Worker     return 256;
166*9880d681SAndroid Build Coastguard Worker   if (X86::XMM0 <= RegNo && RegNo <= X86::XMM31)
167*9880d681SAndroid Build Coastguard Worker     return 128;
168*9880d681SAndroid Build Coastguard Worker   if (X86::MM0 <= RegNo && RegNo <= X86::MM7)
169*9880d681SAndroid Build Coastguard Worker     return 64;
170*9880d681SAndroid Build Coastguard Worker 
171*9880d681SAndroid Build Coastguard Worker   llvm_unreachable("Unknown vector reg!");
172*9880d681SAndroid Build Coastguard Worker }
173*9880d681SAndroid Build Coastguard Worker 
getRegOperandVectorVT(const MCInst * MI,const MVT & ScalarVT,unsigned OperandIndex)174*9880d681SAndroid Build Coastguard Worker static MVT getRegOperandVectorVT(const MCInst *MI, const MVT &ScalarVT,
175*9880d681SAndroid Build Coastguard Worker                                  unsigned OperandIndex) {
176*9880d681SAndroid Build Coastguard Worker   unsigned OpReg = MI->getOperand(OperandIndex).getReg();
177*9880d681SAndroid Build Coastguard Worker   return MVT::getVectorVT(ScalarVT,
178*9880d681SAndroid Build Coastguard Worker                           getVectorRegSize(OpReg)/ScalarVT.getSizeInBits());
179*9880d681SAndroid Build Coastguard Worker }
180*9880d681SAndroid Build Coastguard Worker 
181*9880d681SAndroid Build Coastguard Worker /// \brief Extracts the dst type for a given zero extension instruction.
getZeroExtensionResultType(const MCInst * MI)182*9880d681SAndroid Build Coastguard Worker static MVT getZeroExtensionResultType(const MCInst *MI) {
183*9880d681SAndroid Build Coastguard Worker   switch (MI->getOpcode()) {
184*9880d681SAndroid Build Coastguard Worker   default:
185*9880d681SAndroid Build Coastguard Worker     llvm_unreachable("Unknown zero extension instruction");
186*9880d681SAndroid Build Coastguard Worker   // zero extension to i16
187*9880d681SAndroid Build Coastguard Worker   CASE_PMOVZX(PMOVZXBW, m)
188*9880d681SAndroid Build Coastguard Worker   CASE_PMOVZX(PMOVZXBW, r)
189*9880d681SAndroid Build Coastguard Worker     return getRegOperandVectorVT(MI, MVT::i16, 0);
190*9880d681SAndroid Build Coastguard Worker   // zero extension to i32
191*9880d681SAndroid Build Coastguard Worker   CASE_PMOVZX(PMOVZXBD, m)
192*9880d681SAndroid Build Coastguard Worker   CASE_PMOVZX(PMOVZXBD, r)
193*9880d681SAndroid Build Coastguard Worker   CASE_PMOVZX(PMOVZXWD, m)
194*9880d681SAndroid Build Coastguard Worker   CASE_PMOVZX(PMOVZXWD, r)
195*9880d681SAndroid Build Coastguard Worker     return getRegOperandVectorVT(MI, MVT::i32, 0);
196*9880d681SAndroid Build Coastguard Worker   // zero extension to i64
197*9880d681SAndroid Build Coastguard Worker   CASE_PMOVZX(PMOVZXBQ, m)
198*9880d681SAndroid Build Coastguard Worker   CASE_PMOVZX(PMOVZXBQ, r)
199*9880d681SAndroid Build Coastguard Worker   CASE_PMOVZX(PMOVZXWQ, m)
200*9880d681SAndroid Build Coastguard Worker   CASE_PMOVZX(PMOVZXWQ, r)
201*9880d681SAndroid Build Coastguard Worker   CASE_PMOVZX(PMOVZXDQ, m)
202*9880d681SAndroid Build Coastguard Worker   CASE_PMOVZX(PMOVZXDQ, r)
203*9880d681SAndroid Build Coastguard Worker     return getRegOperandVectorVT(MI, MVT::i64, 0);
204*9880d681SAndroid Build Coastguard Worker   }
205*9880d681SAndroid Build Coastguard Worker }
206*9880d681SAndroid Build Coastguard Worker 
207*9880d681SAndroid Build Coastguard Worker /// Wraps the destination register name with AVX512 mask/maskz filtering.
getMaskName(const MCInst * MI,const char * DestName,const char * (* getRegName)(unsigned))208*9880d681SAndroid Build Coastguard Worker static std::string getMaskName(const MCInst *MI, const char *DestName,
209*9880d681SAndroid Build Coastguard Worker                                const char *(*getRegName)(unsigned)) {
210*9880d681SAndroid Build Coastguard Worker   std::string OpMaskName(DestName);
211*9880d681SAndroid Build Coastguard Worker 
212*9880d681SAndroid Build Coastguard Worker   bool MaskWithZero = false;
213*9880d681SAndroid Build Coastguard Worker   const char *MaskRegName = nullptr;
214*9880d681SAndroid Build Coastguard Worker 
215*9880d681SAndroid Build Coastguard Worker   switch (MI->getOpcode()) {
216*9880d681SAndroid Build Coastguard Worker   default:
217*9880d681SAndroid Build Coastguard Worker     return OpMaskName;
218*9880d681SAndroid Build Coastguard Worker   CASE_MASKZ_MOVDUP(MOVDDUP, m)
219*9880d681SAndroid Build Coastguard Worker   CASE_MASKZ_MOVDUP(MOVDDUP, r)
220*9880d681SAndroid Build Coastguard Worker   CASE_MASKZ_MOVDUP(MOVSHDUP, m)
221*9880d681SAndroid Build Coastguard Worker   CASE_MASKZ_MOVDUP(MOVSHDUP, r)
222*9880d681SAndroid Build Coastguard Worker   CASE_MASKZ_MOVDUP(MOVSLDUP, m)
223*9880d681SAndroid Build Coastguard Worker   CASE_MASKZ_MOVDUP(MOVSLDUP, r)
224*9880d681SAndroid Build Coastguard Worker   CASE_MASKZ_PMOVZX(PMOVZXBD, m)
225*9880d681SAndroid Build Coastguard Worker   CASE_MASKZ_PMOVZX(PMOVZXBD, r)
226*9880d681SAndroid Build Coastguard Worker   CASE_MASKZ_PMOVZX(PMOVZXBQ, m)
227*9880d681SAndroid Build Coastguard Worker   CASE_MASKZ_PMOVZX(PMOVZXBQ, r)
228*9880d681SAndroid Build Coastguard Worker   CASE_MASKZ_PMOVZX(PMOVZXBW, m)
229*9880d681SAndroid Build Coastguard Worker   CASE_MASKZ_PMOVZX(PMOVZXBW, r)
230*9880d681SAndroid Build Coastguard Worker   CASE_MASKZ_PMOVZX(PMOVZXDQ, m)
231*9880d681SAndroid Build Coastguard Worker   CASE_MASKZ_PMOVZX(PMOVZXDQ, r)
232*9880d681SAndroid Build Coastguard Worker   CASE_MASKZ_PMOVZX(PMOVZXWD, m)
233*9880d681SAndroid Build Coastguard Worker   CASE_MASKZ_PMOVZX(PMOVZXWD, r)
234*9880d681SAndroid Build Coastguard Worker   CASE_MASKZ_PMOVZX(PMOVZXWQ, m)
235*9880d681SAndroid Build Coastguard Worker   CASE_MASKZ_PMOVZX(PMOVZXWQ, r)
236*9880d681SAndroid Build Coastguard Worker   CASE_MASKZ_UNPCK(PUNPCKHBW, m)
237*9880d681SAndroid Build Coastguard Worker   CASE_MASKZ_UNPCK(PUNPCKHBW, r)
238*9880d681SAndroid Build Coastguard Worker   CASE_MASKZ_UNPCK(PUNPCKHWD, m)
239*9880d681SAndroid Build Coastguard Worker   CASE_MASKZ_UNPCK(PUNPCKHWD, r)
240*9880d681SAndroid Build Coastguard Worker   CASE_MASKZ_UNPCK(PUNPCKHDQ, m)
241*9880d681SAndroid Build Coastguard Worker   CASE_MASKZ_UNPCK(PUNPCKHDQ, r)
242*9880d681SAndroid Build Coastguard Worker   CASE_MASKZ_UNPCK(PUNPCKLBW, m)
243*9880d681SAndroid Build Coastguard Worker   CASE_MASKZ_UNPCK(PUNPCKLBW, r)
244*9880d681SAndroid Build Coastguard Worker   CASE_MASKZ_UNPCK(PUNPCKLWD, m)
245*9880d681SAndroid Build Coastguard Worker   CASE_MASKZ_UNPCK(PUNPCKLWD, r)
246*9880d681SAndroid Build Coastguard Worker   CASE_MASKZ_UNPCK(PUNPCKLDQ, m)
247*9880d681SAndroid Build Coastguard Worker   CASE_MASKZ_UNPCK(PUNPCKLDQ, r)
248*9880d681SAndroid Build Coastguard Worker   CASE_MASKZ_UNPCK(UNPCKHPD, m)
249*9880d681SAndroid Build Coastguard Worker   CASE_MASKZ_UNPCK(UNPCKHPD, r)
250*9880d681SAndroid Build Coastguard Worker   CASE_MASKZ_UNPCK(UNPCKHPS, m)
251*9880d681SAndroid Build Coastguard Worker   CASE_MASKZ_UNPCK(UNPCKHPS, r)
252*9880d681SAndroid Build Coastguard Worker   CASE_MASKZ_UNPCK(UNPCKLPD, m)
253*9880d681SAndroid Build Coastguard Worker   CASE_MASKZ_UNPCK(UNPCKLPD, r)
254*9880d681SAndroid Build Coastguard Worker   CASE_MASKZ_UNPCK(UNPCKLPS, m)
255*9880d681SAndroid Build Coastguard Worker   CASE_MASKZ_UNPCK(UNPCKLPS, r)
256*9880d681SAndroid Build Coastguard Worker   CASE_MASKZ_SHUF(PALIGNR, r)
257*9880d681SAndroid Build Coastguard Worker   CASE_MASKZ_SHUF(PALIGNR, m)
258*9880d681SAndroid Build Coastguard Worker   CASE_MASKZ_SHUF(SHUFPD, m)
259*9880d681SAndroid Build Coastguard Worker   CASE_MASKZ_SHUF(SHUFPD, r)
260*9880d681SAndroid Build Coastguard Worker   CASE_MASKZ_SHUF(SHUFPS, m)
261*9880d681SAndroid Build Coastguard Worker   CASE_MASKZ_SHUF(SHUFPS, r)
262*9880d681SAndroid Build Coastguard Worker   CASE_MASKZ_VPERMILPI(PERMILPD, m)
263*9880d681SAndroid Build Coastguard Worker   CASE_MASKZ_VPERMILPI(PERMILPD, r)
264*9880d681SAndroid Build Coastguard Worker   CASE_MASKZ_VPERMILPI(PERMILPS, m)
265*9880d681SAndroid Build Coastguard Worker   CASE_MASKZ_VPERMILPI(PERMILPS, r)
266*9880d681SAndroid Build Coastguard Worker   CASE_MASKZ_VPERMILPI(PSHUFD, m)
267*9880d681SAndroid Build Coastguard Worker   CASE_MASKZ_VPERMILPI(PSHUFD, r)
268*9880d681SAndroid Build Coastguard Worker   CASE_MASKZ_VPERMILPI(PSHUFHW, m)
269*9880d681SAndroid Build Coastguard Worker   CASE_MASKZ_VPERMILPI(PSHUFHW, r)
270*9880d681SAndroid Build Coastguard Worker   CASE_MASKZ_VPERMILPI(PSHUFLW, m)
271*9880d681SAndroid Build Coastguard Worker   CASE_MASKZ_VPERMILPI(PSHUFLW, r)
272*9880d681SAndroid Build Coastguard Worker   CASE_MASKZ_VPERM(PERMPD, m)
273*9880d681SAndroid Build Coastguard Worker   CASE_MASKZ_VPERM(PERMPD, r)
274*9880d681SAndroid Build Coastguard Worker   CASE_MASKZ_VPERM(PERMQ, m)
275*9880d681SAndroid Build Coastguard Worker   CASE_MASKZ_VPERM(PERMQ, r)
276*9880d681SAndroid Build Coastguard Worker   CASE_MASKZ_VSHUF(64X2, m)
277*9880d681SAndroid Build Coastguard Worker   CASE_MASKZ_VSHUF(64X2, r)
278*9880d681SAndroid Build Coastguard Worker   CASE_MASKZ_VSHUF(32X4, m)
279*9880d681SAndroid Build Coastguard Worker   CASE_MASKZ_VSHUF(32X4, r)
280*9880d681SAndroid Build Coastguard Worker     MaskWithZero = true;
281*9880d681SAndroid Build Coastguard Worker     MaskRegName = getRegName(MI->getOperand(1).getReg());
282*9880d681SAndroid Build Coastguard Worker     break;
283*9880d681SAndroid Build Coastguard Worker   CASE_MASK_MOVDUP(MOVDDUP, m)
284*9880d681SAndroid Build Coastguard Worker   CASE_MASK_MOVDUP(MOVDDUP, r)
285*9880d681SAndroid Build Coastguard Worker   CASE_MASK_MOVDUP(MOVSHDUP, m)
286*9880d681SAndroid Build Coastguard Worker   CASE_MASK_MOVDUP(MOVSHDUP, r)
287*9880d681SAndroid Build Coastguard Worker   CASE_MASK_MOVDUP(MOVSLDUP, m)
288*9880d681SAndroid Build Coastguard Worker   CASE_MASK_MOVDUP(MOVSLDUP, r)
289*9880d681SAndroid Build Coastguard Worker   CASE_MASK_PMOVZX(PMOVZXBD, m)
290*9880d681SAndroid Build Coastguard Worker   CASE_MASK_PMOVZX(PMOVZXBD, r)
291*9880d681SAndroid Build Coastguard Worker   CASE_MASK_PMOVZX(PMOVZXBQ, m)
292*9880d681SAndroid Build Coastguard Worker   CASE_MASK_PMOVZX(PMOVZXBQ, r)
293*9880d681SAndroid Build Coastguard Worker   CASE_MASK_PMOVZX(PMOVZXBW, m)
294*9880d681SAndroid Build Coastguard Worker   CASE_MASK_PMOVZX(PMOVZXBW, r)
295*9880d681SAndroid Build Coastguard Worker   CASE_MASK_PMOVZX(PMOVZXDQ, m)
296*9880d681SAndroid Build Coastguard Worker   CASE_MASK_PMOVZX(PMOVZXDQ, r)
297*9880d681SAndroid Build Coastguard Worker   CASE_MASK_PMOVZX(PMOVZXWD, m)
298*9880d681SAndroid Build Coastguard Worker   CASE_MASK_PMOVZX(PMOVZXWD, r)
299*9880d681SAndroid Build Coastguard Worker   CASE_MASK_PMOVZX(PMOVZXWQ, m)
300*9880d681SAndroid Build Coastguard Worker   CASE_MASK_PMOVZX(PMOVZXWQ, r)
301*9880d681SAndroid Build Coastguard Worker   CASE_MASK_UNPCK(PUNPCKHBW, m)
302*9880d681SAndroid Build Coastguard Worker   CASE_MASK_UNPCK(PUNPCKHBW, r)
303*9880d681SAndroid Build Coastguard Worker   CASE_MASK_UNPCK(PUNPCKHWD, m)
304*9880d681SAndroid Build Coastguard Worker   CASE_MASK_UNPCK(PUNPCKHWD, r)
305*9880d681SAndroid Build Coastguard Worker   CASE_MASK_UNPCK(PUNPCKHDQ, m)
306*9880d681SAndroid Build Coastguard Worker   CASE_MASK_UNPCK(PUNPCKHDQ, r)
307*9880d681SAndroid Build Coastguard Worker   CASE_MASK_UNPCK(PUNPCKLBW, m)
308*9880d681SAndroid Build Coastguard Worker   CASE_MASK_UNPCK(PUNPCKLBW, r)
309*9880d681SAndroid Build Coastguard Worker   CASE_MASK_UNPCK(PUNPCKLWD, m)
310*9880d681SAndroid Build Coastguard Worker   CASE_MASK_UNPCK(PUNPCKLWD, r)
311*9880d681SAndroid Build Coastguard Worker   CASE_MASK_UNPCK(PUNPCKLDQ, m)
312*9880d681SAndroid Build Coastguard Worker   CASE_MASK_UNPCK(PUNPCKLDQ, r)
313*9880d681SAndroid Build Coastguard Worker   CASE_MASK_UNPCK(UNPCKHPD, m)
314*9880d681SAndroid Build Coastguard Worker   CASE_MASK_UNPCK(UNPCKHPD, r)
315*9880d681SAndroid Build Coastguard Worker   CASE_MASK_UNPCK(UNPCKHPS, m)
316*9880d681SAndroid Build Coastguard Worker   CASE_MASK_UNPCK(UNPCKHPS, r)
317*9880d681SAndroid Build Coastguard Worker   CASE_MASK_UNPCK(UNPCKLPD, m)
318*9880d681SAndroid Build Coastguard Worker   CASE_MASK_UNPCK(UNPCKLPD, r)
319*9880d681SAndroid Build Coastguard Worker   CASE_MASK_UNPCK(UNPCKLPS, m)
320*9880d681SAndroid Build Coastguard Worker   CASE_MASK_UNPCK(UNPCKLPS, r)
321*9880d681SAndroid Build Coastguard Worker   CASE_MASK_SHUF(PALIGNR, r)
322*9880d681SAndroid Build Coastguard Worker   CASE_MASK_SHUF(PALIGNR, m)
323*9880d681SAndroid Build Coastguard Worker   CASE_MASK_SHUF(SHUFPD, m)
324*9880d681SAndroid Build Coastguard Worker   CASE_MASK_SHUF(SHUFPD, r)
325*9880d681SAndroid Build Coastguard Worker   CASE_MASK_SHUF(SHUFPS, m)
326*9880d681SAndroid Build Coastguard Worker   CASE_MASK_SHUF(SHUFPS, r)
327*9880d681SAndroid Build Coastguard Worker   CASE_MASK_VPERMILPI(PERMILPD, m)
328*9880d681SAndroid Build Coastguard Worker   CASE_MASK_VPERMILPI(PERMILPD, r)
329*9880d681SAndroid Build Coastguard Worker   CASE_MASK_VPERMILPI(PERMILPS, m)
330*9880d681SAndroid Build Coastguard Worker   CASE_MASK_VPERMILPI(PERMILPS, r)
331*9880d681SAndroid Build Coastguard Worker   CASE_MASK_VPERMILPI(PSHUFD, m)
332*9880d681SAndroid Build Coastguard Worker   CASE_MASK_VPERMILPI(PSHUFD, r)
333*9880d681SAndroid Build Coastguard Worker   CASE_MASK_VPERMILPI(PSHUFHW, m)
334*9880d681SAndroid Build Coastguard Worker   CASE_MASK_VPERMILPI(PSHUFHW, r)
335*9880d681SAndroid Build Coastguard Worker   CASE_MASK_VPERMILPI(PSHUFLW, m)
336*9880d681SAndroid Build Coastguard Worker   CASE_MASK_VPERMILPI(PSHUFLW, r)
337*9880d681SAndroid Build Coastguard Worker   CASE_MASK_VPERM(PERMPD, m)
338*9880d681SAndroid Build Coastguard Worker   CASE_MASK_VPERM(PERMPD, r)
339*9880d681SAndroid Build Coastguard Worker   CASE_MASK_VPERM(PERMQ, m)
340*9880d681SAndroid Build Coastguard Worker   CASE_MASK_VPERM(PERMQ, r)
341*9880d681SAndroid Build Coastguard Worker   CASE_MASK_VSHUF(64X2, m)
342*9880d681SAndroid Build Coastguard Worker   CASE_MASK_VSHUF(64X2, r)
343*9880d681SAndroid Build Coastguard Worker   CASE_MASK_VSHUF(32X4, m)
344*9880d681SAndroid Build Coastguard Worker   CASE_MASK_VSHUF(32X4, r)
345*9880d681SAndroid Build Coastguard Worker     MaskRegName = getRegName(MI->getOperand(2).getReg());
346*9880d681SAndroid Build Coastguard Worker     break;
347*9880d681SAndroid Build Coastguard Worker   }
348*9880d681SAndroid Build Coastguard Worker 
349*9880d681SAndroid Build Coastguard Worker   // MASK: zmmX {%kY}
350*9880d681SAndroid Build Coastguard Worker   OpMaskName += " {%";
351*9880d681SAndroid Build Coastguard Worker   OpMaskName += MaskRegName;
352*9880d681SAndroid Build Coastguard Worker   OpMaskName += "}";
353*9880d681SAndroid Build Coastguard Worker 
354*9880d681SAndroid Build Coastguard Worker   // MASKZ: zmmX {%kY} {z}
355*9880d681SAndroid Build Coastguard Worker   if (MaskWithZero)
356*9880d681SAndroid Build Coastguard Worker     OpMaskName += " {z}";
357*9880d681SAndroid Build Coastguard Worker 
358*9880d681SAndroid Build Coastguard Worker   return OpMaskName;
359*9880d681SAndroid Build Coastguard Worker }
360*9880d681SAndroid Build Coastguard Worker 
361*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
362*9880d681SAndroid Build Coastguard Worker // Top Level Entrypoint
363*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
364*9880d681SAndroid Build Coastguard Worker 
365*9880d681SAndroid Build Coastguard Worker /// EmitAnyX86InstComments - This function decodes x86 instructions and prints
366*9880d681SAndroid Build Coastguard Worker /// newline terminated strings to the specified string if desired.  This
367*9880d681SAndroid Build Coastguard Worker /// information is shown in disassembly dumps when verbose assembly is enabled.
EmitAnyX86InstComments(const MCInst * MI,raw_ostream & OS,const char * (* getRegName)(unsigned))368*9880d681SAndroid Build Coastguard Worker bool llvm::EmitAnyX86InstComments(const MCInst *MI, raw_ostream &OS,
369*9880d681SAndroid Build Coastguard Worker                                   const char *(*getRegName)(unsigned)) {
370*9880d681SAndroid Build Coastguard Worker   // If this is a shuffle operation, the switch should fill in this state.
371*9880d681SAndroid Build Coastguard Worker   SmallVector<int, 8> ShuffleMask;
372*9880d681SAndroid Build Coastguard Worker   const char *DestName = nullptr, *Src1Name = nullptr, *Src2Name = nullptr;
373*9880d681SAndroid Build Coastguard Worker   unsigned NumOperands = MI->getNumOperands();
374*9880d681SAndroid Build Coastguard Worker   bool RegForm = false;
375*9880d681SAndroid Build Coastguard Worker 
376*9880d681SAndroid Build Coastguard Worker   switch (MI->getOpcode()) {
377*9880d681SAndroid Build Coastguard Worker   default:
378*9880d681SAndroid Build Coastguard Worker     // Not an instruction for which we can decode comments.
379*9880d681SAndroid Build Coastguard Worker     return false;
380*9880d681SAndroid Build Coastguard Worker 
381*9880d681SAndroid Build Coastguard Worker   case X86::BLENDPDrri:
382*9880d681SAndroid Build Coastguard Worker   case X86::VBLENDPDrri:
383*9880d681SAndroid Build Coastguard Worker   case X86::VBLENDPDYrri:
384*9880d681SAndroid Build Coastguard Worker     Src2Name = getRegName(MI->getOperand(2).getReg());
385*9880d681SAndroid Build Coastguard Worker     // FALL THROUGH.
386*9880d681SAndroid Build Coastguard Worker   case X86::BLENDPDrmi:
387*9880d681SAndroid Build Coastguard Worker   case X86::VBLENDPDrmi:
388*9880d681SAndroid Build Coastguard Worker   case X86::VBLENDPDYrmi:
389*9880d681SAndroid Build Coastguard Worker     if (MI->getOperand(NumOperands - 1).isImm())
390*9880d681SAndroid Build Coastguard Worker       DecodeBLENDMask(getRegOperandVectorVT(MI, MVT::f64, 0),
391*9880d681SAndroid Build Coastguard Worker                       MI->getOperand(NumOperands - 1).getImm(),
392*9880d681SAndroid Build Coastguard Worker                       ShuffleMask);
393*9880d681SAndroid Build Coastguard Worker     Src1Name = getRegName(MI->getOperand(1).getReg());
394*9880d681SAndroid Build Coastguard Worker     DestName = getRegName(MI->getOperand(0).getReg());
395*9880d681SAndroid Build Coastguard Worker     break;
396*9880d681SAndroid Build Coastguard Worker 
397*9880d681SAndroid Build Coastguard Worker   case X86::BLENDPSrri:
398*9880d681SAndroid Build Coastguard Worker   case X86::VBLENDPSrri:
399*9880d681SAndroid Build Coastguard Worker   case X86::VBLENDPSYrri:
400*9880d681SAndroid Build Coastguard Worker     Src2Name = getRegName(MI->getOperand(2).getReg());
401*9880d681SAndroid Build Coastguard Worker     // FALL THROUGH.
402*9880d681SAndroid Build Coastguard Worker   case X86::BLENDPSrmi:
403*9880d681SAndroid Build Coastguard Worker   case X86::VBLENDPSrmi:
404*9880d681SAndroid Build Coastguard Worker   case X86::VBLENDPSYrmi:
405*9880d681SAndroid Build Coastguard Worker     if (MI->getOperand(NumOperands - 1).isImm())
406*9880d681SAndroid Build Coastguard Worker       DecodeBLENDMask(getRegOperandVectorVT(MI, MVT::f32, 0),
407*9880d681SAndroid Build Coastguard Worker                       MI->getOperand(NumOperands - 1).getImm(),
408*9880d681SAndroid Build Coastguard Worker                       ShuffleMask);
409*9880d681SAndroid Build Coastguard Worker     Src1Name = getRegName(MI->getOperand(1).getReg());
410*9880d681SAndroid Build Coastguard Worker     DestName = getRegName(MI->getOperand(0).getReg());
411*9880d681SAndroid Build Coastguard Worker     break;
412*9880d681SAndroid Build Coastguard Worker 
413*9880d681SAndroid Build Coastguard Worker   case X86::PBLENDWrri:
414*9880d681SAndroid Build Coastguard Worker   case X86::VPBLENDWrri:
415*9880d681SAndroid Build Coastguard Worker   case X86::VPBLENDWYrri:
416*9880d681SAndroid Build Coastguard Worker     Src2Name = getRegName(MI->getOperand(2).getReg());
417*9880d681SAndroid Build Coastguard Worker     // FALL THROUGH.
418*9880d681SAndroid Build Coastguard Worker   case X86::PBLENDWrmi:
419*9880d681SAndroid Build Coastguard Worker   case X86::VPBLENDWrmi:
420*9880d681SAndroid Build Coastguard Worker   case X86::VPBLENDWYrmi:
421*9880d681SAndroid Build Coastguard Worker     if (MI->getOperand(NumOperands - 1).isImm())
422*9880d681SAndroid Build Coastguard Worker       DecodeBLENDMask(getRegOperandVectorVT(MI, MVT::i16, 0),
423*9880d681SAndroid Build Coastguard Worker                       MI->getOperand(NumOperands - 1).getImm(),
424*9880d681SAndroid Build Coastguard Worker                       ShuffleMask);
425*9880d681SAndroid Build Coastguard Worker     Src1Name = getRegName(MI->getOperand(1).getReg());
426*9880d681SAndroid Build Coastguard Worker     DestName = getRegName(MI->getOperand(0).getReg());
427*9880d681SAndroid Build Coastguard Worker     break;
428*9880d681SAndroid Build Coastguard Worker 
429*9880d681SAndroid Build Coastguard Worker   case X86::VPBLENDDrri:
430*9880d681SAndroid Build Coastguard Worker   case X86::VPBLENDDYrri:
431*9880d681SAndroid Build Coastguard Worker     Src2Name = getRegName(MI->getOperand(2).getReg());
432*9880d681SAndroid Build Coastguard Worker     // FALL THROUGH.
433*9880d681SAndroid Build Coastguard Worker   case X86::VPBLENDDrmi:
434*9880d681SAndroid Build Coastguard Worker   case X86::VPBLENDDYrmi:
435*9880d681SAndroid Build Coastguard Worker     if (MI->getOperand(NumOperands - 1).isImm())
436*9880d681SAndroid Build Coastguard Worker       DecodeBLENDMask(getRegOperandVectorVT(MI, MVT::i32, 0),
437*9880d681SAndroid Build Coastguard Worker                       MI->getOperand(NumOperands - 1).getImm(),
438*9880d681SAndroid Build Coastguard Worker                       ShuffleMask);
439*9880d681SAndroid Build Coastguard Worker     Src1Name = getRegName(MI->getOperand(1).getReg());
440*9880d681SAndroid Build Coastguard Worker     DestName = getRegName(MI->getOperand(0).getReg());
441*9880d681SAndroid Build Coastguard Worker     break;
442*9880d681SAndroid Build Coastguard Worker 
443*9880d681SAndroid Build Coastguard Worker   case X86::INSERTPSrr:
444*9880d681SAndroid Build Coastguard Worker   case X86::VINSERTPSrr:
445*9880d681SAndroid Build Coastguard Worker   case X86::VINSERTPSzrr:
446*9880d681SAndroid Build Coastguard Worker     Src2Name = getRegName(MI->getOperand(2).getReg());
447*9880d681SAndroid Build Coastguard Worker     // FALL THROUGH.
448*9880d681SAndroid Build Coastguard Worker   case X86::INSERTPSrm:
449*9880d681SAndroid Build Coastguard Worker   case X86::VINSERTPSrm:
450*9880d681SAndroid Build Coastguard Worker   case X86::VINSERTPSzrm:
451*9880d681SAndroid Build Coastguard Worker     DestName = getRegName(MI->getOperand(0).getReg());
452*9880d681SAndroid Build Coastguard Worker     Src1Name = getRegName(MI->getOperand(1).getReg());
453*9880d681SAndroid Build Coastguard Worker     if (MI->getOperand(NumOperands - 1).isImm())
454*9880d681SAndroid Build Coastguard Worker       DecodeINSERTPSMask(MI->getOperand(NumOperands - 1).getImm(),
455*9880d681SAndroid Build Coastguard Worker                          ShuffleMask);
456*9880d681SAndroid Build Coastguard Worker     break;
457*9880d681SAndroid Build Coastguard Worker 
458*9880d681SAndroid Build Coastguard Worker   case X86::MOVLHPSrr:
459*9880d681SAndroid Build Coastguard Worker   case X86::VMOVLHPSrr:
460*9880d681SAndroid Build Coastguard Worker   case X86::VMOVLHPSZrr:
461*9880d681SAndroid Build Coastguard Worker     Src2Name = getRegName(MI->getOperand(2).getReg());
462*9880d681SAndroid Build Coastguard Worker     Src1Name = getRegName(MI->getOperand(1).getReg());
463*9880d681SAndroid Build Coastguard Worker     DestName = getRegName(MI->getOperand(0).getReg());
464*9880d681SAndroid Build Coastguard Worker     DecodeMOVLHPSMask(2, ShuffleMask);
465*9880d681SAndroid Build Coastguard Worker     break;
466*9880d681SAndroid Build Coastguard Worker 
467*9880d681SAndroid Build Coastguard Worker   case X86::MOVHLPSrr:
468*9880d681SAndroid Build Coastguard Worker   case X86::VMOVHLPSrr:
469*9880d681SAndroid Build Coastguard Worker   case X86::VMOVHLPSZrr:
470*9880d681SAndroid Build Coastguard Worker     Src2Name = getRegName(MI->getOperand(2).getReg());
471*9880d681SAndroid Build Coastguard Worker     Src1Name = getRegName(MI->getOperand(1).getReg());
472*9880d681SAndroid Build Coastguard Worker     DestName = getRegName(MI->getOperand(0).getReg());
473*9880d681SAndroid Build Coastguard Worker     DecodeMOVHLPSMask(2, ShuffleMask);
474*9880d681SAndroid Build Coastguard Worker     break;
475*9880d681SAndroid Build Coastguard Worker 
476*9880d681SAndroid Build Coastguard Worker   case X86::MOVHPDrm:
477*9880d681SAndroid Build Coastguard Worker   case X86::VMOVHPDrm:
478*9880d681SAndroid Build Coastguard Worker   case X86::VMOVHPDZ128rm:
479*9880d681SAndroid Build Coastguard Worker     Src1Name = getRegName(MI->getOperand(1).getReg());
480*9880d681SAndroid Build Coastguard Worker     DestName = getRegName(MI->getOperand(0).getReg());
481*9880d681SAndroid Build Coastguard Worker     DecodeInsertElementMask(MVT::v2f64, 1, 1, ShuffleMask);
482*9880d681SAndroid Build Coastguard Worker     break;
483*9880d681SAndroid Build Coastguard Worker 
484*9880d681SAndroid Build Coastguard Worker   case X86::MOVHPSrm:
485*9880d681SAndroid Build Coastguard Worker   case X86::VMOVHPSrm:
486*9880d681SAndroid Build Coastguard Worker   case X86::VMOVHPSZ128rm:
487*9880d681SAndroid Build Coastguard Worker     Src1Name = getRegName(MI->getOperand(1).getReg());
488*9880d681SAndroid Build Coastguard Worker     DestName = getRegName(MI->getOperand(0).getReg());
489*9880d681SAndroid Build Coastguard Worker     DecodeInsertElementMask(MVT::v4f32, 2, 2, ShuffleMask);
490*9880d681SAndroid Build Coastguard Worker     break;
491*9880d681SAndroid Build Coastguard Worker 
492*9880d681SAndroid Build Coastguard Worker   case X86::MOVLPDrm:
493*9880d681SAndroid Build Coastguard Worker   case X86::VMOVLPDrm:
494*9880d681SAndroid Build Coastguard Worker   case X86::VMOVLPDZ128rm:
495*9880d681SAndroid Build Coastguard Worker     Src1Name = getRegName(MI->getOperand(1).getReg());
496*9880d681SAndroid Build Coastguard Worker     DestName = getRegName(MI->getOperand(0).getReg());
497*9880d681SAndroid Build Coastguard Worker     DecodeInsertElementMask(MVT::v2f64, 0, 1, ShuffleMask);
498*9880d681SAndroid Build Coastguard Worker     break;
499*9880d681SAndroid Build Coastguard Worker 
500*9880d681SAndroid Build Coastguard Worker   case X86::MOVLPSrm:
501*9880d681SAndroid Build Coastguard Worker   case X86::VMOVLPSrm:
502*9880d681SAndroid Build Coastguard Worker   case X86::VMOVLPSZ128rm:
503*9880d681SAndroid Build Coastguard Worker     Src1Name = getRegName(MI->getOperand(1).getReg());
504*9880d681SAndroid Build Coastguard Worker     DestName = getRegName(MI->getOperand(0).getReg());
505*9880d681SAndroid Build Coastguard Worker     DecodeInsertElementMask(MVT::v4f32, 0, 2, ShuffleMask);
506*9880d681SAndroid Build Coastguard Worker     break;
507*9880d681SAndroid Build Coastguard Worker 
508*9880d681SAndroid Build Coastguard Worker   CASE_MOVDUP(MOVSLDUP, r)
509*9880d681SAndroid Build Coastguard Worker     Src1Name = getRegName(MI->getOperand(NumOperands - 1).getReg());
510*9880d681SAndroid Build Coastguard Worker     // FALL THROUGH.
511*9880d681SAndroid Build Coastguard Worker   CASE_MOVDUP(MOVSLDUP, m)
512*9880d681SAndroid Build Coastguard Worker     DestName = getRegName(MI->getOperand(0).getReg());
513*9880d681SAndroid Build Coastguard Worker     DecodeMOVSLDUPMask(getRegOperandVectorVT(MI, MVT::f32, 0), ShuffleMask);
514*9880d681SAndroid Build Coastguard Worker     break;
515*9880d681SAndroid Build Coastguard Worker 
516*9880d681SAndroid Build Coastguard Worker   CASE_MOVDUP(MOVSHDUP, r)
517*9880d681SAndroid Build Coastguard Worker     Src1Name = getRegName(MI->getOperand(NumOperands - 1).getReg());
518*9880d681SAndroid Build Coastguard Worker     // FALL THROUGH.
519*9880d681SAndroid Build Coastguard Worker   CASE_MOVDUP(MOVSHDUP, m)
520*9880d681SAndroid Build Coastguard Worker     DestName = getRegName(MI->getOperand(0).getReg());
521*9880d681SAndroid Build Coastguard Worker     DecodeMOVSHDUPMask(getRegOperandVectorVT(MI, MVT::f32, 0), ShuffleMask);
522*9880d681SAndroid Build Coastguard Worker     break;
523*9880d681SAndroid Build Coastguard Worker 
524*9880d681SAndroid Build Coastguard Worker   CASE_MOVDUP(MOVDDUP, r)
525*9880d681SAndroid Build Coastguard Worker     Src1Name = getRegName(MI->getOperand(NumOperands - 1).getReg());
526*9880d681SAndroid Build Coastguard Worker     // FALL THROUGH.
527*9880d681SAndroid Build Coastguard Worker   CASE_MOVDUP(MOVDDUP, m)
528*9880d681SAndroid Build Coastguard Worker     DestName = getRegName(MI->getOperand(0).getReg());
529*9880d681SAndroid Build Coastguard Worker     DecodeMOVDDUPMask(getRegOperandVectorVT(MI, MVT::f64, 0), ShuffleMask);
530*9880d681SAndroid Build Coastguard Worker     break;
531*9880d681SAndroid Build Coastguard Worker 
532*9880d681SAndroid Build Coastguard Worker   case X86::PSLLDQri:
533*9880d681SAndroid Build Coastguard Worker   case X86::VPSLLDQri:
534*9880d681SAndroid Build Coastguard Worker   case X86::VPSLLDQYri:
535*9880d681SAndroid Build Coastguard Worker   case X86::VPSLLDQZ128rr:
536*9880d681SAndroid Build Coastguard Worker   case X86::VPSLLDQZ256rr:
537*9880d681SAndroid Build Coastguard Worker   case X86::VPSLLDQZ512rr:
538*9880d681SAndroid Build Coastguard Worker     Src1Name = getRegName(MI->getOperand(1).getReg());
539*9880d681SAndroid Build Coastguard Worker   case X86::VPSLLDQZ128rm:
540*9880d681SAndroid Build Coastguard Worker   case X86::VPSLLDQZ256rm:
541*9880d681SAndroid Build Coastguard Worker   case X86::VPSLLDQZ512rm:
542*9880d681SAndroid Build Coastguard Worker     DestName = getRegName(MI->getOperand(0).getReg());
543*9880d681SAndroid Build Coastguard Worker     if (MI->getOperand(NumOperands - 1).isImm())
544*9880d681SAndroid Build Coastguard Worker       DecodePSLLDQMask(getRegOperandVectorVT(MI, MVT::i8, 0),
545*9880d681SAndroid Build Coastguard Worker                        MI->getOperand(NumOperands - 1).getImm(),
546*9880d681SAndroid Build Coastguard Worker                        ShuffleMask);
547*9880d681SAndroid Build Coastguard Worker     break;
548*9880d681SAndroid Build Coastguard Worker 
549*9880d681SAndroid Build Coastguard Worker   case X86::PSRLDQri:
550*9880d681SAndroid Build Coastguard Worker   case X86::VPSRLDQri:
551*9880d681SAndroid Build Coastguard Worker   case X86::VPSRLDQYri:
552*9880d681SAndroid Build Coastguard Worker   case X86::VPSRLDQZ128rr:
553*9880d681SAndroid Build Coastguard Worker   case X86::VPSRLDQZ256rr:
554*9880d681SAndroid Build Coastguard Worker   case X86::VPSRLDQZ512rr:
555*9880d681SAndroid Build Coastguard Worker     Src1Name = getRegName(MI->getOperand(1).getReg());
556*9880d681SAndroid Build Coastguard Worker   case X86::VPSRLDQZ128rm:
557*9880d681SAndroid Build Coastguard Worker   case X86::VPSRLDQZ256rm:
558*9880d681SAndroid Build Coastguard Worker   case X86::VPSRLDQZ512rm:
559*9880d681SAndroid Build Coastguard Worker     DestName = getRegName(MI->getOperand(0).getReg());
560*9880d681SAndroid Build Coastguard Worker     if (MI->getOperand(NumOperands - 1).isImm())
561*9880d681SAndroid Build Coastguard Worker       DecodePSRLDQMask(getRegOperandVectorVT(MI, MVT::i8, 0),
562*9880d681SAndroid Build Coastguard Worker                        MI->getOperand(NumOperands - 1).getImm(),
563*9880d681SAndroid Build Coastguard Worker                        ShuffleMask);
564*9880d681SAndroid Build Coastguard Worker     break;
565*9880d681SAndroid Build Coastguard Worker 
566*9880d681SAndroid Build Coastguard Worker   CASE_SHUF(PALIGNR, rri)
567*9880d681SAndroid Build Coastguard Worker     Src1Name = getRegName(MI->getOperand(NumOperands - 2).getReg());
568*9880d681SAndroid Build Coastguard Worker     RegForm = true;
569*9880d681SAndroid Build Coastguard Worker     // FALL THROUGH.
570*9880d681SAndroid Build Coastguard Worker   CASE_SHUF(PALIGNR, rmi)
571*9880d681SAndroid Build Coastguard Worker     Src2Name = getRegName(MI->getOperand(NumOperands-(RegForm?3:7)).getReg());
572*9880d681SAndroid Build Coastguard Worker     DestName = getRegName(MI->getOperand(0).getReg());
573*9880d681SAndroid Build Coastguard Worker     if (MI->getOperand(NumOperands - 1).isImm())
574*9880d681SAndroid Build Coastguard Worker       DecodePALIGNRMask(getRegOperandVectorVT(MI, MVT::i8, 0),
575*9880d681SAndroid Build Coastguard Worker                         MI->getOperand(NumOperands - 1).getImm(),
576*9880d681SAndroid Build Coastguard Worker                         ShuffleMask);
577*9880d681SAndroid Build Coastguard Worker     break;
578*9880d681SAndroid Build Coastguard Worker 
579*9880d681SAndroid Build Coastguard Worker   CASE_SHUF(PSHUFD, ri)
580*9880d681SAndroid Build Coastguard Worker     Src1Name = getRegName(MI->getOperand(NumOperands - 2).getReg());
581*9880d681SAndroid Build Coastguard Worker     // FALL THROUGH.
582*9880d681SAndroid Build Coastguard Worker   CASE_SHUF(PSHUFD, mi)
583*9880d681SAndroid Build Coastguard Worker     DestName = getRegName(MI->getOperand(0).getReg());
584*9880d681SAndroid Build Coastguard Worker     if (MI->getOperand(NumOperands - 1).isImm())
585*9880d681SAndroid Build Coastguard Worker       DecodePSHUFMask(getRegOperandVectorVT(MI, MVT::i32, 0),
586*9880d681SAndroid Build Coastguard Worker                       MI->getOperand(NumOperands - 1).getImm(),
587*9880d681SAndroid Build Coastguard Worker                       ShuffleMask);
588*9880d681SAndroid Build Coastguard Worker     break;
589*9880d681SAndroid Build Coastguard Worker 
590*9880d681SAndroid Build Coastguard Worker   CASE_SHUF(PSHUFHW, ri)
591*9880d681SAndroid Build Coastguard Worker     Src1Name = getRegName(MI->getOperand(NumOperands - 2).getReg());
592*9880d681SAndroid Build Coastguard Worker     // FALL THROUGH.
593*9880d681SAndroid Build Coastguard Worker   CASE_SHUF(PSHUFHW, mi)
594*9880d681SAndroid Build Coastguard Worker     DestName = getRegName(MI->getOperand(0).getReg());
595*9880d681SAndroid Build Coastguard Worker     if (MI->getOperand(NumOperands - 1).isImm())
596*9880d681SAndroid Build Coastguard Worker       DecodePSHUFHWMask(getRegOperandVectorVT(MI, MVT::i16, 0),
597*9880d681SAndroid Build Coastguard Worker                         MI->getOperand(NumOperands - 1).getImm(),
598*9880d681SAndroid Build Coastguard Worker                         ShuffleMask);
599*9880d681SAndroid Build Coastguard Worker     break;
600*9880d681SAndroid Build Coastguard Worker 
601*9880d681SAndroid Build Coastguard Worker   CASE_SHUF(PSHUFLW, ri)
602*9880d681SAndroid Build Coastguard Worker     Src1Name = getRegName(MI->getOperand(NumOperands - 2).getReg());
603*9880d681SAndroid Build Coastguard Worker     // FALL THROUGH.
604*9880d681SAndroid Build Coastguard Worker   CASE_SHUF(PSHUFLW, mi)
605*9880d681SAndroid Build Coastguard Worker     DestName = getRegName(MI->getOperand(0).getReg());
606*9880d681SAndroid Build Coastguard Worker     if (MI->getOperand(NumOperands - 1).isImm())
607*9880d681SAndroid Build Coastguard Worker       DecodePSHUFLWMask(getRegOperandVectorVT(MI, MVT::i16, 0),
608*9880d681SAndroid Build Coastguard Worker                         MI->getOperand(NumOperands - 1).getImm(),
609*9880d681SAndroid Build Coastguard Worker                         ShuffleMask);
610*9880d681SAndroid Build Coastguard Worker     break;
611*9880d681SAndroid Build Coastguard Worker 
612*9880d681SAndroid Build Coastguard Worker   case X86::MMX_PSHUFWri:
613*9880d681SAndroid Build Coastguard Worker     Src1Name = getRegName(MI->getOperand(1).getReg());
614*9880d681SAndroid Build Coastguard Worker     // FALL THROUGH.
615*9880d681SAndroid Build Coastguard Worker   case X86::MMX_PSHUFWmi:
616*9880d681SAndroid Build Coastguard Worker     DestName = getRegName(MI->getOperand(0).getReg());
617*9880d681SAndroid Build Coastguard Worker     if (MI->getOperand(NumOperands - 1).isImm())
618*9880d681SAndroid Build Coastguard Worker       DecodePSHUFMask(MVT::v4i16,
619*9880d681SAndroid Build Coastguard Worker                       MI->getOperand(NumOperands - 1).getImm(),
620*9880d681SAndroid Build Coastguard Worker                       ShuffleMask);
621*9880d681SAndroid Build Coastguard Worker     break;
622*9880d681SAndroid Build Coastguard Worker 
623*9880d681SAndroid Build Coastguard Worker   case X86::PSWAPDrr:
624*9880d681SAndroid Build Coastguard Worker     Src1Name = getRegName(MI->getOperand(1).getReg());
625*9880d681SAndroid Build Coastguard Worker     // FALL THROUGH.
626*9880d681SAndroid Build Coastguard Worker   case X86::PSWAPDrm:
627*9880d681SAndroid Build Coastguard Worker     DestName = getRegName(MI->getOperand(0).getReg());
628*9880d681SAndroid Build Coastguard Worker     DecodePSWAPMask(MVT::v2i32, ShuffleMask);
629*9880d681SAndroid Build Coastguard Worker     break;
630*9880d681SAndroid Build Coastguard Worker 
631*9880d681SAndroid Build Coastguard Worker   CASE_UNPCK(PUNPCKHBW, r)
632*9880d681SAndroid Build Coastguard Worker   case X86::MMX_PUNPCKHBWirr:
633*9880d681SAndroid Build Coastguard Worker     Src2Name = getRegName(MI->getOperand(NumOperands - 1).getReg());
634*9880d681SAndroid Build Coastguard Worker     RegForm = true;
635*9880d681SAndroid Build Coastguard Worker     // FALL THROUGH.
636*9880d681SAndroid Build Coastguard Worker   CASE_UNPCK(PUNPCKHBW, m)
637*9880d681SAndroid Build Coastguard Worker   case X86::MMX_PUNPCKHBWirm:
638*9880d681SAndroid Build Coastguard Worker     Src1Name = getRegName(MI->getOperand(NumOperands-(RegForm?2:6)).getReg());
639*9880d681SAndroid Build Coastguard Worker     DestName = getRegName(MI->getOperand(0).getReg());
640*9880d681SAndroid Build Coastguard Worker     DecodeUNPCKHMask(getRegOperandVectorVT(MI, MVT::i8, 0), ShuffleMask);
641*9880d681SAndroid Build Coastguard Worker     break;
642*9880d681SAndroid Build Coastguard Worker 
643*9880d681SAndroid Build Coastguard Worker   CASE_UNPCK(PUNPCKHWD, r)
644*9880d681SAndroid Build Coastguard Worker   case X86::MMX_PUNPCKHWDirr:
645*9880d681SAndroid Build Coastguard Worker     Src2Name = getRegName(MI->getOperand(NumOperands - 1).getReg());
646*9880d681SAndroid Build Coastguard Worker     RegForm = true;
647*9880d681SAndroid Build Coastguard Worker     // FALL THROUGH.
648*9880d681SAndroid Build Coastguard Worker   CASE_UNPCK(PUNPCKHWD, m)
649*9880d681SAndroid Build Coastguard Worker   case X86::MMX_PUNPCKHWDirm:
650*9880d681SAndroid Build Coastguard Worker     Src1Name = getRegName(MI->getOperand(NumOperands-(RegForm?2:6)).getReg());
651*9880d681SAndroid Build Coastguard Worker     DestName = getRegName(MI->getOperand(0).getReg());
652*9880d681SAndroid Build Coastguard Worker     DecodeUNPCKHMask(getRegOperandVectorVT(MI, MVT::i16, 0), ShuffleMask);
653*9880d681SAndroid Build Coastguard Worker     break;
654*9880d681SAndroid Build Coastguard Worker 
655*9880d681SAndroid Build Coastguard Worker   CASE_UNPCK(PUNPCKHDQ, r)
656*9880d681SAndroid Build Coastguard Worker   case X86::MMX_PUNPCKHDQirr:
657*9880d681SAndroid Build Coastguard Worker     Src2Name = getRegName(MI->getOperand(NumOperands - 1).getReg());
658*9880d681SAndroid Build Coastguard Worker     RegForm = true;
659*9880d681SAndroid Build Coastguard Worker     // FALL THROUGH.
660*9880d681SAndroid Build Coastguard Worker   CASE_UNPCK(PUNPCKHDQ, m)
661*9880d681SAndroid Build Coastguard Worker   case X86::MMX_PUNPCKHDQirm:
662*9880d681SAndroid Build Coastguard Worker     Src1Name = getRegName(MI->getOperand(NumOperands-(RegForm?2:6)).getReg());
663*9880d681SAndroid Build Coastguard Worker     DestName = getRegName(MI->getOperand(0).getReg());
664*9880d681SAndroid Build Coastguard Worker     DecodeUNPCKHMask(getRegOperandVectorVT(MI, MVT::i32, 0), ShuffleMask);
665*9880d681SAndroid Build Coastguard Worker     break;
666*9880d681SAndroid Build Coastguard Worker 
667*9880d681SAndroid Build Coastguard Worker   CASE_UNPCK(PUNPCKHQDQ, r)
668*9880d681SAndroid Build Coastguard Worker     Src2Name = getRegName(MI->getOperand(NumOperands - 1).getReg());
669*9880d681SAndroid Build Coastguard Worker     RegForm = true;
670*9880d681SAndroid Build Coastguard Worker     // FALL THROUGH.
671*9880d681SAndroid Build Coastguard Worker   CASE_UNPCK(PUNPCKHQDQ, m)
672*9880d681SAndroid Build Coastguard Worker     Src1Name = getRegName(MI->getOperand(NumOperands-(RegForm?2:6)).getReg());
673*9880d681SAndroid Build Coastguard Worker     DestName = getRegName(MI->getOperand(0).getReg());
674*9880d681SAndroid Build Coastguard Worker     DecodeUNPCKHMask(getRegOperandVectorVT(MI, MVT::i64, 0), ShuffleMask);
675*9880d681SAndroid Build Coastguard Worker     break;
676*9880d681SAndroid Build Coastguard Worker 
677*9880d681SAndroid Build Coastguard Worker   CASE_UNPCK(PUNPCKLBW, r)
678*9880d681SAndroid Build Coastguard Worker   case X86::MMX_PUNPCKLBWirr:
679*9880d681SAndroid Build Coastguard Worker     Src2Name = getRegName(MI->getOperand(NumOperands - 1).getReg());
680*9880d681SAndroid Build Coastguard Worker     RegForm = true;
681*9880d681SAndroid Build Coastguard Worker     // FALL THROUGH.
682*9880d681SAndroid Build Coastguard Worker   CASE_UNPCK(PUNPCKLBW, m)
683*9880d681SAndroid Build Coastguard Worker   case X86::MMX_PUNPCKLBWirm:
684*9880d681SAndroid Build Coastguard Worker     Src1Name = getRegName(MI->getOperand(NumOperands-(RegForm?2:6)).getReg());
685*9880d681SAndroid Build Coastguard Worker     DestName = getRegName(MI->getOperand(0).getReg());
686*9880d681SAndroid Build Coastguard Worker     DecodeUNPCKLMask(getRegOperandVectorVT(MI, MVT::i8, 0), ShuffleMask);
687*9880d681SAndroid Build Coastguard Worker     break;
688*9880d681SAndroid Build Coastguard Worker 
689*9880d681SAndroid Build Coastguard Worker   CASE_UNPCK(PUNPCKLWD, r)
690*9880d681SAndroid Build Coastguard Worker   case X86::MMX_PUNPCKLWDirr:
691*9880d681SAndroid Build Coastguard Worker     Src2Name = getRegName(MI->getOperand(NumOperands - 1).getReg());
692*9880d681SAndroid Build Coastguard Worker     RegForm = true;
693*9880d681SAndroid Build Coastguard Worker     // FALL THROUGH.
694*9880d681SAndroid Build Coastguard Worker   CASE_UNPCK(PUNPCKLWD, m)
695*9880d681SAndroid Build Coastguard Worker   case X86::MMX_PUNPCKLWDirm:
696*9880d681SAndroid Build Coastguard Worker     Src1Name = getRegName(MI->getOperand(NumOperands-(RegForm?2:6)).getReg());
697*9880d681SAndroid Build Coastguard Worker     DestName = getRegName(MI->getOperand(0).getReg());
698*9880d681SAndroid Build Coastguard Worker     DecodeUNPCKLMask(getRegOperandVectorVT(MI, MVT::i16, 0), ShuffleMask);
699*9880d681SAndroid Build Coastguard Worker     break;
700*9880d681SAndroid Build Coastguard Worker 
701*9880d681SAndroid Build Coastguard Worker   CASE_UNPCK(PUNPCKLDQ, r)
702*9880d681SAndroid Build Coastguard Worker   case X86::MMX_PUNPCKLDQirr:
703*9880d681SAndroid Build Coastguard Worker     Src2Name = getRegName(MI->getOperand(NumOperands - 1).getReg());
704*9880d681SAndroid Build Coastguard Worker     RegForm = true;
705*9880d681SAndroid Build Coastguard Worker     // FALL THROUGH.
706*9880d681SAndroid Build Coastguard Worker   CASE_UNPCK(PUNPCKLDQ, m)
707*9880d681SAndroid Build Coastguard Worker   case X86::MMX_PUNPCKLDQirm:
708*9880d681SAndroid Build Coastguard Worker     Src1Name = getRegName(MI->getOperand(NumOperands-(RegForm?2:6)).getReg());
709*9880d681SAndroid Build Coastguard Worker     DestName = getRegName(MI->getOperand(0).getReg());
710*9880d681SAndroid Build Coastguard Worker     DecodeUNPCKLMask(getRegOperandVectorVT(MI, MVT::i32, 0), ShuffleMask);
711*9880d681SAndroid Build Coastguard Worker     break;
712*9880d681SAndroid Build Coastguard Worker 
713*9880d681SAndroid Build Coastguard Worker   CASE_UNPCK(PUNPCKLQDQ, r)
714*9880d681SAndroid Build Coastguard Worker     Src2Name = getRegName(MI->getOperand(NumOperands - 1).getReg());
715*9880d681SAndroid Build Coastguard Worker     RegForm = true;
716*9880d681SAndroid Build Coastguard Worker     // FALL THROUGH.
717*9880d681SAndroid Build Coastguard Worker   CASE_UNPCK(PUNPCKLQDQ, m)
718*9880d681SAndroid Build Coastguard Worker     Src1Name = getRegName(MI->getOperand(NumOperands-(RegForm?2:6)).getReg());
719*9880d681SAndroid Build Coastguard Worker     DestName = getRegName(MI->getOperand(0).getReg());
720*9880d681SAndroid Build Coastguard Worker     DecodeUNPCKLMask(getRegOperandVectorVT(MI, MVT::i64, 0), ShuffleMask);
721*9880d681SAndroid Build Coastguard Worker     break;
722*9880d681SAndroid Build Coastguard Worker 
723*9880d681SAndroid Build Coastguard Worker   CASE_SHUF(SHUFPD, rri)
724*9880d681SAndroid Build Coastguard Worker     Src2Name = getRegName(MI->getOperand(NumOperands - 2).getReg());
725*9880d681SAndroid Build Coastguard Worker     RegForm = true;
726*9880d681SAndroid Build Coastguard Worker     // FALL THROUGH.
727*9880d681SAndroid Build Coastguard Worker   CASE_SHUF(SHUFPD, rmi)
728*9880d681SAndroid Build Coastguard Worker     if (MI->getOperand(NumOperands - 1).isImm())
729*9880d681SAndroid Build Coastguard Worker       DecodeSHUFPMask(getRegOperandVectorVT(MI, MVT::f64, 0),
730*9880d681SAndroid Build Coastguard Worker                       MI->getOperand(NumOperands - 1).getImm(),
731*9880d681SAndroid Build Coastguard Worker                       ShuffleMask);
732*9880d681SAndroid Build Coastguard Worker     Src1Name = getRegName(MI->getOperand(NumOperands-(RegForm?3:7)).getReg());
733*9880d681SAndroid Build Coastguard Worker     DestName = getRegName(MI->getOperand(0).getReg());
734*9880d681SAndroid Build Coastguard Worker     break;
735*9880d681SAndroid Build Coastguard Worker 
736*9880d681SAndroid Build Coastguard Worker   CASE_SHUF(SHUFPS, rri)
737*9880d681SAndroid Build Coastguard Worker     Src2Name = getRegName(MI->getOperand(NumOperands - 2).getReg());
738*9880d681SAndroid Build Coastguard Worker     RegForm = true;
739*9880d681SAndroid Build Coastguard Worker     // FALL THROUGH.
740*9880d681SAndroid Build Coastguard Worker   CASE_SHUF(SHUFPS, rmi)
741*9880d681SAndroid Build Coastguard Worker     if (MI->getOperand(NumOperands - 1).isImm())
742*9880d681SAndroid Build Coastguard Worker       DecodeSHUFPMask(getRegOperandVectorVT(MI, MVT::f32, 0),
743*9880d681SAndroid Build Coastguard Worker                       MI->getOperand(NumOperands - 1).getImm(),
744*9880d681SAndroid Build Coastguard Worker                       ShuffleMask);
745*9880d681SAndroid Build Coastguard Worker     Src1Name = getRegName(MI->getOperand(NumOperands-(RegForm?3:7)).getReg());
746*9880d681SAndroid Build Coastguard Worker     DestName = getRegName(MI->getOperand(0).getReg());
747*9880d681SAndroid Build Coastguard Worker     break;
748*9880d681SAndroid Build Coastguard Worker 
749*9880d681SAndroid Build Coastguard Worker   CASE_VSHUF(64X2, r)
750*9880d681SAndroid Build Coastguard Worker     Src2Name = getRegName(MI->getOperand(NumOperands - 2).getReg());
751*9880d681SAndroid Build Coastguard Worker     RegForm = true;
752*9880d681SAndroid Build Coastguard Worker     // FALL THROUGH.
753*9880d681SAndroid Build Coastguard Worker   CASE_VSHUF(64X2, m)
754*9880d681SAndroid Build Coastguard Worker     decodeVSHUF64x2FamilyMask(getRegOperandVectorVT(MI, MVT::i64, 0),
755*9880d681SAndroid Build Coastguard Worker                               MI->getOperand(NumOperands - 1).getImm(),
756*9880d681SAndroid Build Coastguard Worker                               ShuffleMask);
757*9880d681SAndroid Build Coastguard Worker     Src1Name = getRegName(MI->getOperand(NumOperands-(RegForm?3:7)).getReg());
758*9880d681SAndroid Build Coastguard Worker     DestName = getRegName(MI->getOperand(0).getReg());
759*9880d681SAndroid Build Coastguard Worker     break;
760*9880d681SAndroid Build Coastguard Worker 
761*9880d681SAndroid Build Coastguard Worker   CASE_VSHUF(32X4, r)
762*9880d681SAndroid Build Coastguard Worker     Src2Name = getRegName(MI->getOperand(NumOperands - 2).getReg());
763*9880d681SAndroid Build Coastguard Worker     RegForm = true;
764*9880d681SAndroid Build Coastguard Worker     // FALL THROUGH.
765*9880d681SAndroid Build Coastguard Worker   CASE_VSHUF(32X4, m)
766*9880d681SAndroid Build Coastguard Worker     decodeVSHUF64x2FamilyMask(getRegOperandVectorVT(MI, MVT::i32, 0),
767*9880d681SAndroid Build Coastguard Worker                               MI->getOperand(NumOperands - 1).getImm(),
768*9880d681SAndroid Build Coastguard Worker                               ShuffleMask);
769*9880d681SAndroid Build Coastguard Worker     Src1Name = getRegName(MI->getOperand(NumOperands-(RegForm?3:7)).getReg());
770*9880d681SAndroid Build Coastguard Worker     DestName = getRegName(MI->getOperand(0).getReg());
771*9880d681SAndroid Build Coastguard Worker     break;
772*9880d681SAndroid Build Coastguard Worker 
773*9880d681SAndroid Build Coastguard Worker   CASE_UNPCK(UNPCKLPD, r)
774*9880d681SAndroid Build Coastguard Worker     Src2Name = getRegName(MI->getOperand(NumOperands - 1).getReg());
775*9880d681SAndroid Build Coastguard Worker     RegForm = true;
776*9880d681SAndroid Build Coastguard Worker     // FALL THROUGH.
777*9880d681SAndroid Build Coastguard Worker   CASE_UNPCK(UNPCKLPD, m)
778*9880d681SAndroid Build Coastguard Worker     DecodeUNPCKLMask(getRegOperandVectorVT(MI, MVT::f64, 0), ShuffleMask);
779*9880d681SAndroid Build Coastguard Worker     Src1Name = getRegName(MI->getOperand(NumOperands-(RegForm?2:6)).getReg());
780*9880d681SAndroid Build Coastguard Worker     DestName = getRegName(MI->getOperand(0).getReg());
781*9880d681SAndroid Build Coastguard Worker     break;
782*9880d681SAndroid Build Coastguard Worker 
783*9880d681SAndroid Build Coastguard Worker   CASE_UNPCK(UNPCKLPS, r)
784*9880d681SAndroid Build Coastguard Worker     Src2Name = getRegName(MI->getOperand(NumOperands - 1).getReg());
785*9880d681SAndroid Build Coastguard Worker     RegForm = true;
786*9880d681SAndroid Build Coastguard Worker     // FALL THROUGH.
787*9880d681SAndroid Build Coastguard Worker   CASE_UNPCK(UNPCKLPS, m)
788*9880d681SAndroid Build Coastguard Worker     DecodeUNPCKLMask(getRegOperandVectorVT(MI, MVT::f32, 0), ShuffleMask);
789*9880d681SAndroid Build Coastguard Worker     Src1Name = getRegName(MI->getOperand(NumOperands-(RegForm?2:6)).getReg());
790*9880d681SAndroid Build Coastguard Worker     DestName = getRegName(MI->getOperand(0).getReg());
791*9880d681SAndroid Build Coastguard Worker     break;
792*9880d681SAndroid Build Coastguard Worker 
793*9880d681SAndroid Build Coastguard Worker   CASE_UNPCK(UNPCKHPD, r)
794*9880d681SAndroid Build Coastguard Worker     Src2Name = getRegName(MI->getOperand(NumOperands - 1).getReg());
795*9880d681SAndroid Build Coastguard Worker     RegForm = true;
796*9880d681SAndroid Build Coastguard Worker     // FALL THROUGH.
797*9880d681SAndroid Build Coastguard Worker   CASE_UNPCK(UNPCKHPD, m)
798*9880d681SAndroid Build Coastguard Worker     DecodeUNPCKHMask(getRegOperandVectorVT(MI, MVT::f64, 0), ShuffleMask);
799*9880d681SAndroid Build Coastguard Worker     Src1Name = getRegName(MI->getOperand(NumOperands-(RegForm?2:6)).getReg());
800*9880d681SAndroid Build Coastguard Worker     DestName = getRegName(MI->getOperand(0).getReg());
801*9880d681SAndroid Build Coastguard Worker     break;
802*9880d681SAndroid Build Coastguard Worker 
803*9880d681SAndroid Build Coastguard Worker   CASE_UNPCK(UNPCKHPS, r)
804*9880d681SAndroid Build Coastguard Worker     Src2Name = getRegName(MI->getOperand(NumOperands - 1).getReg());
805*9880d681SAndroid Build Coastguard Worker     RegForm = true;
806*9880d681SAndroid Build Coastguard Worker     // FALL THROUGH.
807*9880d681SAndroid Build Coastguard Worker   CASE_UNPCK(UNPCKHPS, m)
808*9880d681SAndroid Build Coastguard Worker     DecodeUNPCKHMask(getRegOperandVectorVT(MI, MVT::f32, 0), ShuffleMask);
809*9880d681SAndroid Build Coastguard Worker     Src1Name = getRegName(MI->getOperand(NumOperands-(RegForm?2:6)).getReg());
810*9880d681SAndroid Build Coastguard Worker     DestName = getRegName(MI->getOperand(0).getReg());
811*9880d681SAndroid Build Coastguard Worker     break;
812*9880d681SAndroid Build Coastguard Worker 
813*9880d681SAndroid Build Coastguard Worker   CASE_VPERMILPI(PERMILPS, r)
814*9880d681SAndroid Build Coastguard Worker     Src1Name = getRegName(MI->getOperand(NumOperands - 2).getReg());
815*9880d681SAndroid Build Coastguard Worker     // FALL THROUGH.
816*9880d681SAndroid Build Coastguard Worker   CASE_VPERMILPI(PERMILPS, m)
817*9880d681SAndroid Build Coastguard Worker     if (MI->getOperand(NumOperands - 1).isImm())
818*9880d681SAndroid Build Coastguard Worker       DecodePSHUFMask(getRegOperandVectorVT(MI, MVT::f32, 0),
819*9880d681SAndroid Build Coastguard Worker                       MI->getOperand(NumOperands - 1).getImm(),
820*9880d681SAndroid Build Coastguard Worker                       ShuffleMask);
821*9880d681SAndroid Build Coastguard Worker     DestName = getRegName(MI->getOperand(0).getReg());
822*9880d681SAndroid Build Coastguard Worker     break;
823*9880d681SAndroid Build Coastguard Worker 
824*9880d681SAndroid Build Coastguard Worker   CASE_VPERMILPI(PERMILPD, r)
825*9880d681SAndroid Build Coastguard Worker     Src1Name = getRegName(MI->getOperand(NumOperands - 2).getReg());
826*9880d681SAndroid Build Coastguard Worker     // FALL THROUGH.
827*9880d681SAndroid Build Coastguard Worker   CASE_VPERMILPI(PERMILPD, m)
828*9880d681SAndroid Build Coastguard Worker     if (MI->getOperand(NumOperands - 1).isImm())
829*9880d681SAndroid Build Coastguard Worker       DecodePSHUFMask(getRegOperandVectorVT(MI, MVT::f64, 0),
830*9880d681SAndroid Build Coastguard Worker                       MI->getOperand(NumOperands - 1).getImm(),
831*9880d681SAndroid Build Coastguard Worker                       ShuffleMask);
832*9880d681SAndroid Build Coastguard Worker     DestName = getRegName(MI->getOperand(0).getReg());
833*9880d681SAndroid Build Coastguard Worker     break;
834*9880d681SAndroid Build Coastguard Worker 
835*9880d681SAndroid Build Coastguard Worker   case X86::VPERM2F128rr:
836*9880d681SAndroid Build Coastguard Worker   case X86::VPERM2I128rr:
837*9880d681SAndroid Build Coastguard Worker     Src2Name = getRegName(MI->getOperand(2).getReg());
838*9880d681SAndroid Build Coastguard Worker     // FALL THROUGH.
839*9880d681SAndroid Build Coastguard Worker   case X86::VPERM2F128rm:
840*9880d681SAndroid Build Coastguard Worker   case X86::VPERM2I128rm:
841*9880d681SAndroid Build Coastguard Worker     // For instruction comments purpose, assume the 256-bit vector is v4i64.
842*9880d681SAndroid Build Coastguard Worker     if (MI->getOperand(NumOperands - 1).isImm())
843*9880d681SAndroid Build Coastguard Worker       DecodeVPERM2X128Mask(MVT::v4i64,
844*9880d681SAndroid Build Coastguard Worker                            MI->getOperand(NumOperands - 1).getImm(),
845*9880d681SAndroid Build Coastguard Worker                            ShuffleMask);
846*9880d681SAndroid Build Coastguard Worker     Src1Name = getRegName(MI->getOperand(1).getReg());
847*9880d681SAndroid Build Coastguard Worker     DestName = getRegName(MI->getOperand(0).getReg());
848*9880d681SAndroid Build Coastguard Worker     break;
849*9880d681SAndroid Build Coastguard Worker 
850*9880d681SAndroid Build Coastguard Worker   CASE_VPERM(PERMPD, r)
851*9880d681SAndroid Build Coastguard Worker     Src1Name = getRegName(MI->getOperand(NumOperands - 2).getReg());
852*9880d681SAndroid Build Coastguard Worker     // FALL THROUGH.
853*9880d681SAndroid Build Coastguard Worker   CASE_VPERM(PERMPD, m)
854*9880d681SAndroid Build Coastguard Worker     if (MI->getOperand(NumOperands - 1).isImm())
855*9880d681SAndroid Build Coastguard Worker       DecodeVPERMMask(getRegOperandVectorVT(MI, MVT::f64, 0),
856*9880d681SAndroid Build Coastguard Worker                       MI->getOperand(NumOperands - 1).getImm(),
857*9880d681SAndroid Build Coastguard Worker                       ShuffleMask);
858*9880d681SAndroid Build Coastguard Worker     DestName = getRegName(MI->getOperand(0).getReg());
859*9880d681SAndroid Build Coastguard Worker     break;
860*9880d681SAndroid Build Coastguard Worker 
861*9880d681SAndroid Build Coastguard Worker   CASE_VPERM(PERMQ, r)
862*9880d681SAndroid Build Coastguard Worker     Src1Name = getRegName(MI->getOperand(NumOperands - 2).getReg());
863*9880d681SAndroid Build Coastguard Worker     // FALL THROUGH.
864*9880d681SAndroid Build Coastguard Worker   CASE_VPERM(PERMQ, m)
865*9880d681SAndroid Build Coastguard Worker     if (MI->getOperand(NumOperands - 1).isImm())
866*9880d681SAndroid Build Coastguard Worker       DecodeVPERMMask(getRegOperandVectorVT(MI, MVT::i64, 0),
867*9880d681SAndroid Build Coastguard Worker                       MI->getOperand(NumOperands - 1).getImm(),
868*9880d681SAndroid Build Coastguard Worker                       ShuffleMask);
869*9880d681SAndroid Build Coastguard Worker     DestName = getRegName(MI->getOperand(0).getReg());
870*9880d681SAndroid Build Coastguard Worker     break;
871*9880d681SAndroid Build Coastguard Worker 
872*9880d681SAndroid Build Coastguard Worker   case X86::MOVSDrr:
873*9880d681SAndroid Build Coastguard Worker   case X86::VMOVSDrr:
874*9880d681SAndroid Build Coastguard Worker   case X86::VMOVSDZrr:
875*9880d681SAndroid Build Coastguard Worker     Src2Name = getRegName(MI->getOperand(2).getReg());
876*9880d681SAndroid Build Coastguard Worker     Src1Name = getRegName(MI->getOperand(1).getReg());
877*9880d681SAndroid Build Coastguard Worker     // FALL THROUGH.
878*9880d681SAndroid Build Coastguard Worker   case X86::MOVSDrm:
879*9880d681SAndroid Build Coastguard Worker   case X86::VMOVSDrm:
880*9880d681SAndroid Build Coastguard Worker   case X86::VMOVSDZrm:
881*9880d681SAndroid Build Coastguard Worker     DecodeScalarMoveMask(MVT::v2f64, nullptr == Src2Name, ShuffleMask);
882*9880d681SAndroid Build Coastguard Worker     DestName = getRegName(MI->getOperand(0).getReg());
883*9880d681SAndroid Build Coastguard Worker     break;
884*9880d681SAndroid Build Coastguard Worker 
885*9880d681SAndroid Build Coastguard Worker   case X86::MOVSSrr:
886*9880d681SAndroid Build Coastguard Worker   case X86::VMOVSSrr:
887*9880d681SAndroid Build Coastguard Worker   case X86::VMOVSSZrr:
888*9880d681SAndroid Build Coastguard Worker     Src2Name = getRegName(MI->getOperand(2).getReg());
889*9880d681SAndroid Build Coastguard Worker     Src1Name = getRegName(MI->getOperand(1).getReg());
890*9880d681SAndroid Build Coastguard Worker     // FALL THROUGH.
891*9880d681SAndroid Build Coastguard Worker   case X86::MOVSSrm:
892*9880d681SAndroid Build Coastguard Worker   case X86::VMOVSSrm:
893*9880d681SAndroid Build Coastguard Worker   case X86::VMOVSSZrm:
894*9880d681SAndroid Build Coastguard Worker     DecodeScalarMoveMask(MVT::v4f32, nullptr == Src2Name, ShuffleMask);
895*9880d681SAndroid Build Coastguard Worker     DestName = getRegName(MI->getOperand(0).getReg());
896*9880d681SAndroid Build Coastguard Worker     break;
897*9880d681SAndroid Build Coastguard Worker 
898*9880d681SAndroid Build Coastguard Worker   case X86::MOVPQI2QIrr:
899*9880d681SAndroid Build Coastguard Worker   case X86::MOVZPQILo2PQIrr:
900*9880d681SAndroid Build Coastguard Worker   case X86::VMOVPQI2QIrr:
901*9880d681SAndroid Build Coastguard Worker   case X86::VMOVZPQILo2PQIrr:
902*9880d681SAndroid Build Coastguard Worker   case X86::VMOVZPQILo2PQIZrr:
903*9880d681SAndroid Build Coastguard Worker     Src1Name = getRegName(MI->getOperand(1).getReg());
904*9880d681SAndroid Build Coastguard Worker   // FALL THROUGH.
905*9880d681SAndroid Build Coastguard Worker   case X86::MOVQI2PQIrm:
906*9880d681SAndroid Build Coastguard Worker   case X86::MOVZQI2PQIrm:
907*9880d681SAndroid Build Coastguard Worker   case X86::MOVZPQILo2PQIrm:
908*9880d681SAndroid Build Coastguard Worker   case X86::VMOVQI2PQIrm:
909*9880d681SAndroid Build Coastguard Worker   case X86::VMOVQI2PQIZrm:
910*9880d681SAndroid Build Coastguard Worker   case X86::VMOVZQI2PQIrm:
911*9880d681SAndroid Build Coastguard Worker   case X86::VMOVZPQILo2PQIrm:
912*9880d681SAndroid Build Coastguard Worker   case X86::VMOVZPQILo2PQIZrm:
913*9880d681SAndroid Build Coastguard Worker     DecodeZeroMoveLowMask(MVT::v2i64, ShuffleMask);
914*9880d681SAndroid Build Coastguard Worker     DestName = getRegName(MI->getOperand(0).getReg());
915*9880d681SAndroid Build Coastguard Worker     break;
916*9880d681SAndroid Build Coastguard Worker 
917*9880d681SAndroid Build Coastguard Worker   case X86::MOVDI2PDIrm:
918*9880d681SAndroid Build Coastguard Worker   case X86::VMOVDI2PDIrm:
919*9880d681SAndroid Build Coastguard Worker   case X86::VMOVDI2PDIZrm:
920*9880d681SAndroid Build Coastguard Worker     DecodeZeroMoveLowMask(MVT::v4i32, ShuffleMask);
921*9880d681SAndroid Build Coastguard Worker     DestName = getRegName(MI->getOperand(0).getReg());
922*9880d681SAndroid Build Coastguard Worker     break;
923*9880d681SAndroid Build Coastguard Worker 
924*9880d681SAndroid Build Coastguard Worker   case X86::EXTRQI:
925*9880d681SAndroid Build Coastguard Worker     if (MI->getOperand(2).isImm() &&
926*9880d681SAndroid Build Coastguard Worker         MI->getOperand(3).isImm())
927*9880d681SAndroid Build Coastguard Worker       DecodeEXTRQIMask(MI->getOperand(2).getImm(),
928*9880d681SAndroid Build Coastguard Worker                        MI->getOperand(3).getImm(),
929*9880d681SAndroid Build Coastguard Worker                        ShuffleMask);
930*9880d681SAndroid Build Coastguard Worker 
931*9880d681SAndroid Build Coastguard Worker     DestName = getRegName(MI->getOperand(0).getReg());
932*9880d681SAndroid Build Coastguard Worker     Src1Name = getRegName(MI->getOperand(1).getReg());
933*9880d681SAndroid Build Coastguard Worker     break;
934*9880d681SAndroid Build Coastguard Worker 
935*9880d681SAndroid Build Coastguard Worker   case X86::INSERTQI:
936*9880d681SAndroid Build Coastguard Worker     if (MI->getOperand(3).isImm() &&
937*9880d681SAndroid Build Coastguard Worker         MI->getOperand(4).isImm())
938*9880d681SAndroid Build Coastguard Worker       DecodeINSERTQIMask(MI->getOperand(3).getImm(),
939*9880d681SAndroid Build Coastguard Worker                          MI->getOperand(4).getImm(),
940*9880d681SAndroid Build Coastguard Worker                          ShuffleMask);
941*9880d681SAndroid Build Coastguard Worker 
942*9880d681SAndroid Build Coastguard Worker     DestName = getRegName(MI->getOperand(0).getReg());
943*9880d681SAndroid Build Coastguard Worker     Src1Name = getRegName(MI->getOperand(1).getReg());
944*9880d681SAndroid Build Coastguard Worker     Src2Name = getRegName(MI->getOperand(2).getReg());
945*9880d681SAndroid Build Coastguard Worker     break;
946*9880d681SAndroid Build Coastguard Worker 
947*9880d681SAndroid Build Coastguard Worker   case X86::VBROADCASTF128:
948*9880d681SAndroid Build Coastguard Worker   case X86::VBROADCASTI128:
949*9880d681SAndroid Build Coastguard Worker     DecodeSubVectorBroadcast(MVT::v4f64, MVT::v2f64, ShuffleMask);
950*9880d681SAndroid Build Coastguard Worker     DestName = getRegName(MI->getOperand(0).getReg());
951*9880d681SAndroid Build Coastguard Worker     break;
952*9880d681SAndroid Build Coastguard Worker 
953*9880d681SAndroid Build Coastguard Worker   CASE_PMOVZX(PMOVZXBW, r)
954*9880d681SAndroid Build Coastguard Worker   CASE_PMOVZX(PMOVZXBD, r)
955*9880d681SAndroid Build Coastguard Worker   CASE_PMOVZX(PMOVZXBQ, r)
956*9880d681SAndroid Build Coastguard Worker     Src1Name = getRegName(MI->getOperand(NumOperands - 1).getReg());
957*9880d681SAndroid Build Coastguard Worker   // FALL THROUGH.
958*9880d681SAndroid Build Coastguard Worker   CASE_PMOVZX(PMOVZXBW, m)
959*9880d681SAndroid Build Coastguard Worker   CASE_PMOVZX(PMOVZXBD, m)
960*9880d681SAndroid Build Coastguard Worker   CASE_PMOVZX(PMOVZXBQ, m)
961*9880d681SAndroid Build Coastguard Worker     DecodeZeroExtendMask(MVT::i8, getZeroExtensionResultType(MI), ShuffleMask);
962*9880d681SAndroid Build Coastguard Worker     DestName = getRegName(MI->getOperand(0).getReg());
963*9880d681SAndroid Build Coastguard Worker     break;
964*9880d681SAndroid Build Coastguard Worker 
965*9880d681SAndroid Build Coastguard Worker   CASE_PMOVZX(PMOVZXWD, r)
966*9880d681SAndroid Build Coastguard Worker   CASE_PMOVZX(PMOVZXWQ, r)
967*9880d681SAndroid Build Coastguard Worker     Src1Name = getRegName(MI->getOperand(NumOperands - 1).getReg());
968*9880d681SAndroid Build Coastguard Worker   // FALL THROUGH.
969*9880d681SAndroid Build Coastguard Worker   CASE_PMOVZX(PMOVZXWD, m)
970*9880d681SAndroid Build Coastguard Worker   CASE_PMOVZX(PMOVZXWQ, m)
971*9880d681SAndroid Build Coastguard Worker     DecodeZeroExtendMask(MVT::i16, getZeroExtensionResultType(MI), ShuffleMask);
972*9880d681SAndroid Build Coastguard Worker     DestName = getRegName(MI->getOperand(0).getReg());
973*9880d681SAndroid Build Coastguard Worker     break;
974*9880d681SAndroid Build Coastguard Worker 
975*9880d681SAndroid Build Coastguard Worker   CASE_PMOVZX(PMOVZXDQ, r)
976*9880d681SAndroid Build Coastguard Worker     Src1Name = getRegName(MI->getOperand(NumOperands - 1).getReg());
977*9880d681SAndroid Build Coastguard Worker   // FALL THROUGH.
978*9880d681SAndroid Build Coastguard Worker   CASE_PMOVZX(PMOVZXDQ, m)
979*9880d681SAndroid Build Coastguard Worker     DecodeZeroExtendMask(MVT::i32, getZeroExtensionResultType(MI), ShuffleMask);
980*9880d681SAndroid Build Coastguard Worker     DestName = getRegName(MI->getOperand(0).getReg());
981*9880d681SAndroid Build Coastguard Worker     break;
982*9880d681SAndroid Build Coastguard Worker   }
983*9880d681SAndroid Build Coastguard Worker 
984*9880d681SAndroid Build Coastguard Worker   // The only comments we decode are shuffles, so give up if we were unable to
985*9880d681SAndroid Build Coastguard Worker   // decode a shuffle mask.
986*9880d681SAndroid Build Coastguard Worker   if (ShuffleMask.empty())
987*9880d681SAndroid Build Coastguard Worker     return false;
988*9880d681SAndroid Build Coastguard Worker 
989*9880d681SAndroid Build Coastguard Worker   if (!DestName) DestName = Src1Name;
990*9880d681SAndroid Build Coastguard Worker   OS << (DestName ? getMaskName(MI, DestName, getRegName) : "mem") << " = ";
991*9880d681SAndroid Build Coastguard Worker 
992*9880d681SAndroid Build Coastguard Worker   // If the two sources are the same, canonicalize the input elements to be
993*9880d681SAndroid Build Coastguard Worker   // from the first src so that we get larger element spans.
994*9880d681SAndroid Build Coastguard Worker   if (Src1Name == Src2Name) {
995*9880d681SAndroid Build Coastguard Worker     for (unsigned i = 0, e = ShuffleMask.size(); i != e; ++i) {
996*9880d681SAndroid Build Coastguard Worker       if ((int)ShuffleMask[i] >= 0 && // Not sentinel.
997*9880d681SAndroid Build Coastguard Worker           ShuffleMask[i] >= (int)e)   // From second mask.
998*9880d681SAndroid Build Coastguard Worker         ShuffleMask[i] -= e;
999*9880d681SAndroid Build Coastguard Worker     }
1000*9880d681SAndroid Build Coastguard Worker   }
1001*9880d681SAndroid Build Coastguard Worker 
1002*9880d681SAndroid Build Coastguard Worker   // The shuffle mask specifies which elements of the src1/src2 fill in the
1003*9880d681SAndroid Build Coastguard Worker   // destination, with a few sentinel values.  Loop through and print them
1004*9880d681SAndroid Build Coastguard Worker   // out.
1005*9880d681SAndroid Build Coastguard Worker   for (unsigned i = 0, e = ShuffleMask.size(); i != e; ++i) {
1006*9880d681SAndroid Build Coastguard Worker     if (i != 0)
1007*9880d681SAndroid Build Coastguard Worker       OS << ',';
1008*9880d681SAndroid Build Coastguard Worker     if (ShuffleMask[i] == SM_SentinelZero) {
1009*9880d681SAndroid Build Coastguard Worker       OS << "zero";
1010*9880d681SAndroid Build Coastguard Worker       continue;
1011*9880d681SAndroid Build Coastguard Worker     }
1012*9880d681SAndroid Build Coastguard Worker 
1013*9880d681SAndroid Build Coastguard Worker     // Otherwise, it must come from src1 or src2.  Print the span of elements
1014*9880d681SAndroid Build Coastguard Worker     // that comes from this src.
1015*9880d681SAndroid Build Coastguard Worker     bool isSrc1 = ShuffleMask[i] < (int)ShuffleMask.size();
1016*9880d681SAndroid Build Coastguard Worker     const char *SrcName = isSrc1 ? Src1Name : Src2Name;
1017*9880d681SAndroid Build Coastguard Worker     OS << (SrcName ? SrcName : "mem") << '[';
1018*9880d681SAndroid Build Coastguard Worker     bool IsFirst = true;
1019*9880d681SAndroid Build Coastguard Worker     while (i != e && (int)ShuffleMask[i] != SM_SentinelZero &&
1020*9880d681SAndroid Build Coastguard Worker            (ShuffleMask[i] < (int)ShuffleMask.size()) == isSrc1) {
1021*9880d681SAndroid Build Coastguard Worker       if (!IsFirst)
1022*9880d681SAndroid Build Coastguard Worker         OS << ',';
1023*9880d681SAndroid Build Coastguard Worker       else
1024*9880d681SAndroid Build Coastguard Worker         IsFirst = false;
1025*9880d681SAndroid Build Coastguard Worker       if (ShuffleMask[i] == SM_SentinelUndef)
1026*9880d681SAndroid Build Coastguard Worker         OS << "u";
1027*9880d681SAndroid Build Coastguard Worker       else
1028*9880d681SAndroid Build Coastguard Worker         OS << ShuffleMask[i] % ShuffleMask.size();
1029*9880d681SAndroid Build Coastguard Worker       ++i;
1030*9880d681SAndroid Build Coastguard Worker     }
1031*9880d681SAndroid Build Coastguard Worker     OS << ']';
1032*9880d681SAndroid Build Coastguard Worker     --i; // For loop increments element #.
1033*9880d681SAndroid Build Coastguard Worker   }
1034*9880d681SAndroid Build Coastguard Worker   //MI->print(OS, 0);
1035*9880d681SAndroid Build Coastguard Worker   OS << "\n";
1036*9880d681SAndroid Build Coastguard Worker 
1037*9880d681SAndroid Build Coastguard Worker   // We successfully added a comment to this instruction.
1038*9880d681SAndroid Build Coastguard Worker   return true;
1039*9880d681SAndroid Build Coastguard Worker }
1040