Add XOP Intrinsics and tests
[oota-llvm.git] / lib / Target / X86 / X86InstrXOP.td
1 //====- X86InstrXOP.td - Describe the X86 Instruction Set --*- tablegen -*-====//
2 //
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===-----------------------------------------------------------------------===//
9 //
10 // This file describes XOP (eXtended OPerations)
11 //
12 //===-----------------------------------------------------------------------===//
13
14 multiclass xop2op<bits<8> opc, string OpcodeStr, Intrinsic Int, PatFrag memop> {
15   def rr : IXOP<opc, MRMSrcReg, (outs VR128:$dst), (ins VR128:$src),
16            !strconcat(OpcodeStr, "\t{$src, $dst|$dst, $src}"),
17            [(set VR128:$dst, (Int VR128:$src))]>, VEX;
18   def rm : IXOP<opc, MRMSrcMem, (outs VR128:$dst), (ins f128mem:$src),
19            !strconcat(OpcodeStr, "\t{$src, $dst|$dst, $src}"),
20            [(set VR128:$dst, (Int (bitconvert (memop addr:$src))))]>, VEX;
21 }
22
23 let isAsmParserOnly = 1 in {
24   defm VPHSUBWD  : xop2op<0xE2, "vphsubwd", int_x86_xop_vphsubwd, memopv2i64>;
25   defm VPHSUBDQ  : xop2op<0xE3, "vphsubdq", int_x86_xop_vphsubdq, memopv2i64>;
26   defm VPHSUBBW  : xop2op<0xE1, "vphsubbw", int_x86_xop_vphsubbw, memopv2i64>;
27   defm VPHADDWQ  : xop2op<0xC7, "vphaddwq", int_x86_xop_vphaddwq, memopv2i64>;
28   defm VPHADDWD  : xop2op<0xC6, "vphaddwd", int_x86_xop_vphaddwd, memopv2i64>;
29   defm VPHADDUWQ : xop2op<0xD7, "vphadduwq", int_x86_xop_vphadduwq, memopv2i64>;
30   defm VPHADDUWD : xop2op<0xD6, "vphadduwd", int_x86_xop_vphadduwd, memopv2i64>;
31   defm VPHADDUDQ : xop2op<0xDB, "vphaddudq", int_x86_xop_vphaddudq, memopv2i64>;
32   defm VPHADDUBW : xop2op<0xD1, "vphaddubw", int_x86_xop_vphaddubw, memopv2i64>;
33   defm VPHADDUBQ : xop2op<0xD3, "vphaddubq", int_x86_xop_vphaddubq, memopv2i64>;
34   defm VPHADDUBD : xop2op<0xD2, "vphaddubd", int_x86_xop_vphaddubd, memopv2i64>;
35   defm VPHADDDQ  : xop2op<0xCB, "vphadddq", int_x86_xop_vphadddq, memopv2i64>;
36   defm VPHADDBW  : xop2op<0xC1, "vphaddbw", int_x86_xop_vphaddbw, memopv2i64>;
37   defm VPHADDBQ  : xop2op<0xC3, "vphaddbq", int_x86_xop_vphaddbq, memopv2i64>;
38   defm VPHADDBD  : xop2op<0xC2, "vphaddbd", int_x86_xop_vphaddbd, memopv2i64>;
39   defm VFRCZPS   : xop2op<0x80, "vfrczps", int_x86_xop_vfrcz_ps, memopv4f32>;
40   defm VFRCZPD   : xop2op<0x81, "vfrczpd", int_x86_xop_vfrcz_pd, memopv2f64>;
41 }
42
43 // Scalar load 2 addr operand instructions
44 let Constraints = "$src1 = $dst" in {
45 multiclass xop2opsld<bits<8> opc, string OpcodeStr, Intrinsic Int,
46                      Operand memop, ComplexPattern mem_cpat> {
47   def rr : IXOP<opc, MRMSrcReg, (outs VR128:$dst), (ins VR128:$src1,
48                                                         VR128:$src2),
49            !strconcat(OpcodeStr, "\t{$src2, $dst|$dst, $src2}"),
50            [(set VR128:$dst, (Int VR128:$src1, VR128:$src2))]>, VEX;
51   def rm : IXOP<opc, MRMSrcMem, (outs VR128:$dst), (ins VR128:$src1,
52                                                         memop:$src2),
53            !strconcat(OpcodeStr, "\t{$src2, $dst|$dst, $src2}"),
54            [(set VR128:$dst, (Int VR128:$src1,
55                                   (bitconvert mem_cpat:$src2)))]>, VEX;
56 }
57
58 } // Constraints = "$src1 = $dst"
59
60 let isAsmParserOnly = 1 in {
61   defm VFRCZSS   : xop2opsld<0x82, "vfrczss", int_x86_xop_vfrcz_ss,
62                    ssmem, sse_load_f32>;
63   defm VFRCZSD   : xop2opsld<0x83, "vfrczsd", int_x86_xop_vfrcz_sd,
64                    sdmem, sse_load_f64>;
65 }
66
67
68 multiclass xop2op256<bits<8> opc, string OpcodeStr, Intrinsic Int,
69                      PatFrag memop> {
70   def rrY : IXOP<opc, MRMSrcReg, (outs VR256:$dst), (ins VR256:$src),
71            !strconcat(OpcodeStr, "\t{$src, $dst|$dst, $src}"),
72            [(set VR256:$dst, (Int VR256:$src))]>, VEX, VEX_L;
73   def rmY : IXOP<opc, MRMSrcMem, (outs VR256:$dst), (ins f256mem:$src),
74            !strconcat(OpcodeStr, "\t{$src, $dst|$dst, $src}"),
75            [(set VR256:$dst, (Int (bitconvert (memop addr:$src))))]>, VEX;
76 }
77
78 let isAsmParserOnly = 1 in {
79   defm VFRCZPS : xop2op256<0x80, "vfrczps", int_x86_xop_vfrcz_ps_256,
80                            memopv8f32>;
81   defm VFRCZPD : xop2op256<0x81, "vfrczpd", int_x86_xop_vfrcz_pd_256,
82                            memopv4f64>;
83 }
84
85 multiclass xop3op<bits<8> opc, string OpcodeStr, Intrinsic Int> {
86   def rr : IXOP<opc, MRMSrcReg, (outs VR128:$dst),
87            (ins VR128:$src1, VR128:$src2),
88            !strconcat(OpcodeStr, "\t{$src2, $src1, $dst|$dst, $src1, $src2}"),
89            [(set VR128:$dst, (Int VR128:$src1, VR128:$src2))]>, VEX_4VOp3;
90   def rm : IXOP<opc, MRMSrcMem, (outs VR128:$dst),
91            (ins VR128:$src1, f128mem:$src2),
92            !strconcat(OpcodeStr, "\t{$src2, $src1, $dst|$dst, $src1, $src2}"),
93            [(set VR128:$dst,
94               (Int VR128:$src1, (bitconvert (memopv2i64 addr:$src2))))]>,
95            VEX_4V, VEX_W;
96   def mr : IXOP<opc, MRMSrcMem, (outs VR128:$dst),
97            (ins f128mem:$src1, VR128:$src2),
98            !strconcat(OpcodeStr, "\t{$src2, $src1, $dst|$dst, $src1, $src2}"),
99            [(set VR128:$dst,
100               (Int (bitconvert (memopv2i64 addr:$src1)), VR128:$src2))]>,
101              VEX_4VOp3;
102 }
103
104 let isAsmParserOnly = 1 in {
105   defm VPSHLW : xop3op<0x95, "vpshlw", int_x86_xop_vpshlw>;
106   defm VPSHLQ : xop3op<0x97, "vpshlq", int_x86_xop_vpshlq>;
107   defm VPSHLD : xop3op<0x96, "vpshld", int_x86_xop_vpshld>;
108   defm VPSHLB : xop3op<0x94, "vpshlb", int_x86_xop_vpshlb>;
109   defm VPSHAW : xop3op<0x99, "vpshaw", int_x86_xop_vpshaw>;
110   defm VPSHAQ : xop3op<0x9B, "vpshaq", int_x86_xop_vpshaq>;
111   defm VPSHAD : xop3op<0x9A, "vpshad", int_x86_xop_vpshad>;
112   defm VPSHAB : xop3op<0x98, "vpshab", int_x86_xop_vpshab>;
113   defm VPROTW : xop3op<0x91, "vprotw", int_x86_xop_vprotw>;
114   defm VPROTQ : xop3op<0x93, "vprotq", int_x86_xop_vprotq>;
115   defm VPROTD : xop3op<0x92, "vprotd", int_x86_xop_vprotd>;
116   defm VPROTB : xop3op<0x90, "vprotb", int_x86_xop_vprotb>;
117 }
118
119 multiclass xop3opimm<bits<8> opc, string OpcodeStr> {
120   def ri : IXOPi8<opc, MRMSrcReg, (outs VR128:$dst),
121            (ins VR128:$src1, i8imm:$src2),
122            !strconcat(OpcodeStr, "\t{$src2, $src1, $dst|$dst, $src1, $src2}"),
123            []>, VEX;
124   def mi : IXOPi8<opc, MRMSrcMem, (outs VR128:$dst),
125            (ins f128mem:$src1, i8imm:$src2),
126            !strconcat(OpcodeStr, "\t{$src2, $src1, $dst|$dst, $src1, $src2}"),
127            []>, VEX;
128 }
129
130 let isAsmParserOnly = 1 in {
131   defm VPROTW : xop3opimm<0xC1, "vprotw">;
132   defm VPROTQ : xop3opimm<0xC3, "vprotq">;
133   defm VPROTD : xop3opimm<0xC2, "vprotd">;
134   defm VPROTB : xop3opimm<0xC0, "vprotb">;
135 }
136
137 // Instruction where second source can be memory, but third must be register
138 multiclass xop4opm2<bits<8> opc, string OpcodeStr, Intrinsic Int> {
139   def rr : IXOPi8<opc, MRMSrcReg, (outs VR128:$dst),
140            (ins VR128:$src1, VR128:$src2, VR128:$src3),
141            !strconcat(OpcodeStr,
142            "\t{$src3, $src2, $src1, $dst|$dst, $src1, $src2, $src3}"),
143            [(set VR128:$dst,
144               (Int VR128:$src1, VR128:$src2, VR128:$src3))]>, VEX_4V, VEX_I8IMM;
145   def rm : IXOPi8<opc, MRMSrcMem, (outs VR128:$dst),
146            (ins VR128:$src1, f128mem:$src2, VR128:$src3),
147            !strconcat(OpcodeStr,
148            "\t{$src3, $src2, $src1, $dst|$dst, $src1, $src2, $src3}"),
149            [(set VR128:$dst,
150               (Int VR128:$src1, (bitconvert (memopv2i64 addr:$src2)),
151               VR128:$src3))]>, VEX_4V, VEX_I8IMM;
152 }
153
154 let isAsmParserOnly = 1 in {
155   defm VPMADCSWD  : xop4opm2<0xB6, "vpmadcswd", int_x86_xop_vpmadcswd>;
156   defm VPMADCSSWD : xop4opm2<0xA6, "vpmadcsswd", int_x86_xop_vpmadcsswd>;
157   defm VPMACSWW   : xop4opm2<0x95, "vpmacsww", int_x86_xop_vpmacsww>;
158   defm VPMACSWD   : xop4opm2<0x96, "vpmacswd", int_x86_xop_vpmacswd>;
159   defm VPMACSSWW  : xop4opm2<0x85, "vpmacssww", int_x86_xop_vpmacssww>;
160   defm VPMACSSWD  : xop4opm2<0x86, "vpmacsswd", int_x86_xop_vpmacsswd>;
161   defm VPMACSSDQL : xop4opm2<0x87, "vpmacssdql", int_x86_xop_vpmacssdql>;
162   defm VPMACSSDQH : xop4opm2<0x8F, "vpmacssdqh", int_x86_xop_vpmacssdqh>;
163   defm VPMACSSDD  : xop4opm2<0x8E, "vpmacssdd", int_x86_xop_vpmacssdd>;
164   defm VPMACSDQL  : xop4opm2<0x97, "vpmacsdql", int_x86_xop_vpmacsdql>;
165   defm VPMACSDQH  : xop4opm2<0x9F, "vpmacsdqh", int_x86_xop_vpmacsdqh>;
166   defm VPMACSDD   : xop4opm2<0x9E, "vpmacsdd", int_x86_xop_vpmacsdd>;
167 }
168
169 // Instruction where second source can be memory, third must be imm8
170 multiclass xop4opimm<bits<8> opc, string OpcodeStr> {
171   def ri : IXOPi8<opc, MRMSrcReg, (outs VR128:$dst),
172            (ins VR128:$src1, VR128:$src2, i8imm:$src3),
173            !strconcat(OpcodeStr,
174            "\t{$src3, $src2, $src1, $dst|$dst, $src1, $src2, $src3}"),
175            []>, VEX_4V;
176   def mi : IXOPi8<opc, MRMSrcMem, (outs VR128:$dst),
177            (ins VR128:$src1, f128mem:$src2, i8imm:$src3),
178            !strconcat(OpcodeStr,
179            "\t{$src3, $src2, $src1, $dst|$dst, $src1, $src2, $src3}"),
180            []>, VEX_4V;
181 }
182
183 let isAsmParserOnly = 1 in {
184   defm VPCOMW  : xop4opimm<0xCD, "vpcomw">;
185   defm VPCOMUW : xop4opimm<0xED, "vpcomuw">;
186   defm VPCOMUQ : xop4opimm<0xEF, "vpcomuq">;
187   defm VPCOMUD : xop4opimm<0xEE, "vpcomud">;
188   defm VPCOMUB : xop4opimm<0xEC, "vpcomub">;
189   defm VPCOMQ  : xop4opimm<0xCF, "vpcomq">;
190   defm VPCOMD  : xop4opimm<0xCE, "vpcomd">;
191   defm VPCOMB  : xop4opimm<0xCC, "vpcomb">;
192 }
193
194 // Instruction where either second or third source can be memory
195 multiclass xop4op<bits<8> opc, string OpcodeStr> {
196   def rr : IXOPi8<opc, MRMSrcReg, (outs VR128:$dst),
197            (ins VR128:$src1, VR128:$src2, VR128:$src3),
198            !strconcat(OpcodeStr,
199            "\t{$src3, $src2, $src1, $dst|$dst, $src1, $src2, $src3}"),
200            []>, VEX_4V, VEX_I8IMM;
201   def rm : IXOPi8<opc, MRMSrcMem, (outs VR128:$dst),
202            (ins VR128:$src1, VR128:$src2, f128mem:$src3),
203            !strconcat(OpcodeStr,
204            "\t{$src3, $src2, $src1, $dst|$dst, $src1, $src2, $src3}"),
205            []>, VEX_4V, VEX_I8IMM, VEX_W, MemOp4;
206   def mr : IXOPi8<opc, MRMSrcMem, (outs VR128:$dst),
207            (ins VR128:$src1, f128mem:$src2, VR128:$src3),
208            !strconcat(OpcodeStr,
209            "\t{$src3, $src2, $src1, $dst|$dst, $src1, $src2, $src3}"),
210            []>, VEX_4V, VEX_I8IMM;
211 }
212
213 let isAsmParserOnly = 1 in {
214   defm VPPERM : xop4op<0xA3, "vpperm">;
215   defm VPCMOV : xop4op<0xA2, "vpcmov">;
216 }
217
218 multiclass xop4op256<bits<8> opc, string OpcodeStr> {
219   def rrY : IXOPi8<opc, MRMSrcReg, (outs VR256:$dst),
220            (ins VR256:$src1, VR256:$src2, VR256:$src3),
221            !strconcat(OpcodeStr,
222            "\t{$src3, $src2, $src1, $dst|$dst, $src1, $src2, $src3}"),
223            []>, VEX_4V, VEX_I8IMM;
224   def rmY : IXOPi8<opc, MRMSrcMem, (outs VR256:$dst),
225            (ins VR256:$src1, VR256:$src2, f256mem:$src3),
226            !strconcat(OpcodeStr,
227            "\t{$src3, $src2, $src1, $dst|$dst, $src1, $src2, $src3}"),
228            []>, VEX_4V, VEX_I8IMM, VEX_W, MemOp4;
229   def mrY : IXOPi8<opc, MRMSrcMem, (outs VR256:$dst),
230            (ins VR256:$src1, f256mem:$src2, VR256:$src3),
231            !strconcat(OpcodeStr,
232            "\t{$src3, $src2, $src1, $dst|$dst, $src1, $src2, $src3}"),
233            []>, VEX_4V, VEX_I8IMM;
234 }
235
236 let isAsmParserOnly = 1 in {
237   defm VPCMOV : xop4op256<0xA2, "vpcmov">;
238 }
239
240 multiclass xop5op<bits<8> opc, string OpcodeStr, Intrinsic Int128,
241                   Intrinsic Int256, PatFrag ld_128, PatFrag ld_256> {
242   def rr : IXOP5<opc, MRMSrcReg, (outs VR128:$dst),
243         (ins VR128:$src1, VR128:$src2, VR128:$src3, i8imm:$src4),
244         !strconcat(OpcodeStr,
245         "\t{$src4, $src3, $src2, $src1, $dst|$dst, $src1, $src2, $src3, $src4}"),
246         [(set VR128:$dst,
247            (Int128 VR128:$src1, VR128:$src2, VR128:$src3, imm:$src4))]>;
248   def rm : IXOP5<opc, MRMSrcMem, (outs VR128:$dst),
249         (ins VR128:$src1, VR128:$src2, f128mem:$src3, i8imm:$src4),
250         !strconcat(OpcodeStr,
251         "\t{$src4, $src3, $src2, $src1, $dst|$dst, $src1, $src2, $src3, $src4}"),
252         [(set VR128:$dst,
253            (Int128 VR128:$src1, VR128:$src2, (ld_128 addr:$src3), imm:$src4))]>,
254         VEX_W, MemOp4;
255   def mr : IXOP5<opc, MRMSrcMem, (outs VR128:$dst),
256         (ins VR128:$src1, f128mem:$src2, VR128:$src3, i8imm:$src4),
257         !strconcat(OpcodeStr,
258         "\t{$src4, $src3, $src2, $src1, $dst|$dst, $src1, $src2, $src3, $src4}"),
259         [(set VR128:$dst,
260            (Int128 VR128:$src1, (ld_128 addr:$src2), VR128:$src3, imm:$src4))]>;
261   def rrY : IXOP5<opc, MRMSrcReg, (outs VR256:$dst),
262         (ins VR256:$src1, VR256:$src2, VR256:$src3, i8imm:$src4),
263         !strconcat(OpcodeStr,
264         "\t{$src4, $src3, $src2, $src1, $dst|$dst, $src1, $src2, $src3, $src4}"),
265         [(set VR256:$dst,
266           (Int256 VR256:$src1, VR256:$src2, VR256:$src3, imm:$src4))]>;
267   def rmY : IXOP5<opc, MRMSrcMem, (outs VR256:$dst),
268         (ins VR256:$src1, VR256:$src2, f256mem:$src3, i8imm:$src4),
269         !strconcat(OpcodeStr,
270         "\t{$src4, $src3, $src2, $src1, $dst|$dst, $src1, $src2, $src3, $src4}"),
271         [(set VR256:$dst,
272           (Int256 VR256:$src1, VR256:$src2, (ld_256 addr:$src3), imm:$src4))]>,
273         VEX_W, MemOp4;
274   def mrY : IXOP5<opc, MRMSrcMem, (outs VR256:$dst),
275         (ins VR256:$src1, f256mem:$src2, VR256:$src3, i8imm:$src4),
276         !strconcat(OpcodeStr,
277         "\t{$src4, $src3, $src2, $src1, $dst|$dst, $src1, $src2, $src3, $src4}"),
278         [(set VR256:$dst,
279            (Int256 VR256:$src1, (ld_256 addr:$src2), VR256:$src3, imm:$src4))]>;
280 }
281
282 defm VPERMIL2PD : xop5op<0x49, "vpermil2pd", int_x86_xop_vpermil2pd,
283                          int_x86_xop_vpermil2pd_256, memopv2f64, memopv4f64>;
284 defm VPERMIL2PS : xop5op<0x48, "vpermil2ps", int_x86_xop_vpermil2ps,
285                          int_x86_xop_vpermil2ps_256, memopv4f32, memopv8f32>;
286
287 // XOP Intrinsics patterns
288
289 // VPCOM EQ
290 def : Pat<(int_x86_xop_vpcomeqw VR128:$src1, VR128:$src2),
291           (VPCOMWri VR128:$src1, VR128:$src2, (i8 4))>;
292 def : Pat<(int_x86_xop_vpcomeqw VR128:$src1,
293           (bitconvert (memopv2i64 addr:$src2))),
294           (VPCOMWmi VR128:$src1, addr:$src2, (i8 4))>;
295
296 def : Pat<(int_x86_xop_vpcomequw VR128:$src1, VR128:$src2),
297           (VPCOMUWri VR128:$src1, VR128:$src2, (i8 4))>;
298 def : Pat<(int_x86_xop_vpcomequw VR128:$src1,
299           (bitconvert (memopv2i64 addr:$src2))),
300           (VPCOMUWmi VR128:$src1, addr:$src2, (i8 4))>;
301
302 def : Pat<(int_x86_xop_vpcomequq VR128:$src1, VR128:$src2),
303           (VPCOMUQri VR128:$src1, VR128:$src2, (i8 4))>;
304 def : Pat<(int_x86_xop_vpcomequq VR128:$src1,
305           (bitconvert (memopv2i64 addr:$src2))),
306           (VPCOMUQmi VR128:$src1, addr:$src2, (i8 4))>;
307
308 def : Pat<(int_x86_xop_vpcomequd VR128:$src1, VR128:$src2),
309           (VPCOMUDri VR128:$src1, VR128:$src2, (i8 4))>;
310 def : Pat<(int_x86_xop_vpcomequd VR128:$src1,
311           (bitconvert (memopv2i64 addr:$src2))),
312           (VPCOMUDmi VR128:$src1, addr:$src2, (i8 4))>;
313
314 def : Pat<(int_x86_xop_vpcomequb VR128:$src1, VR128:$src2),
315           (VPCOMUBri VR128:$src1, VR128:$src2, (i8 4))>;
316 def : Pat<(int_x86_xop_vpcomequb VR128:$src1,
317           (bitconvert (memopv2i64 addr:$src2))),
318           (VPCOMUBmi VR128:$src1, addr:$src2, (i8 4))>;
319
320 def : Pat<(int_x86_xop_vpcomeqq VR128:$src1, VR128:$src2),
321           (VPCOMQri VR128:$src1, VR128:$src2, (i8 4))>;
322 def : Pat<(int_x86_xop_vpcomeqq VR128:$src1,
323           (bitconvert (memopv2i64 addr:$src2))),
324           (VPCOMQmi VR128:$src1, addr:$src2, (i8 4))>;
325
326 def : Pat<(int_x86_xop_vpcomeqd VR128:$src1, VR128:$src2),
327           (VPCOMDri VR128:$src1, VR128:$src2, (i8 4))>;
328 def : Pat<(int_x86_xop_vpcomeqd VR128:$src1,
329           (bitconvert (memopv2i64 addr:$src2))),
330           (VPCOMDmi VR128:$src1, addr:$src2, (i8 4))>;
331
332 def : Pat<(int_x86_xop_vpcomeqb VR128:$src1, VR128:$src2),
333           (VPCOMBri VR128:$src1, VR128:$src2, (i8 4))>;
334 def : Pat<(int_x86_xop_vpcomeqb VR128:$src1,
335           (bitconvert (memopv2i64 addr:$src2))),
336           (VPCOMBmi VR128:$src1, addr:$src2, (i8 4))>;
337
338 // VPCOM FALSE
339 def : Pat<(int_x86_xop_vpcomfalsew VR128:$src1, VR128:$src2),
340           (VPCOMWri VR128:$src1, VR128:$src2, (i8 6))>;
341 def : Pat<(int_x86_xop_vpcomfalsew VR128:$src1,
342           (bitconvert (memopv2i64 addr:$src2))),
343           (VPCOMWmi VR128:$src1, addr:$src2, (i8 6))>;
344
345 def : Pat<(int_x86_xop_vpcomfalseuw VR128:$src1, VR128:$src2),
346           (VPCOMUWri VR128:$src1, VR128:$src2, (i8 6))>;
347 def : Pat<(int_x86_xop_vpcomfalseuw VR128:$src1,
348           (bitconvert (memopv2i64 addr:$src2))),
349           (VPCOMUWmi VR128:$src1, addr:$src2, (i8 6))>;
350
351 def : Pat<(int_x86_xop_vpcomfalseuq VR128:$src1, VR128:$src2),
352           (VPCOMUQri VR128:$src1, VR128:$src2, (i8 6))>;
353 def : Pat<(int_x86_xop_vpcomfalseuq VR128:$src1,
354           (bitconvert (memopv2i64 addr:$src2))),
355           (VPCOMUQmi VR128:$src1, addr:$src2, (i8 6))>;
356
357 def : Pat<(int_x86_xop_vpcomfalseud VR128:$src1, VR128:$src2),
358           (VPCOMUDri VR128:$src1, VR128:$src2, (i8 6))>;
359 def : Pat<(int_x86_xop_vpcomfalseud VR128:$src1,
360           (bitconvert (memopv2i64 addr:$src2))),
361           (VPCOMUDmi VR128:$src1, addr:$src2, (i8 6))>;
362
363 def : Pat<(int_x86_xop_vpcomfalseub VR128:$src1, VR128:$src2),
364           (VPCOMUBri VR128:$src1, VR128:$src2, (i8 6))>;
365 def : Pat<(int_x86_xop_vpcomfalseub VR128:$src1,
366           (bitconvert (memopv2i64 addr:$src2))),
367           (VPCOMUBmi VR128:$src1, addr:$src2, (i8 6))>;
368
369 def : Pat<(int_x86_xop_vpcomfalseq VR128:$src1, VR128:$src2),
370           (VPCOMQri VR128:$src1, VR128:$src2, (i8 6))>;
371 def : Pat<(int_x86_xop_vpcomfalseq VR128:$src1,
372           (bitconvert (memopv2i64 addr:$src2))),
373           (VPCOMQmi VR128:$src1, addr:$src2, (i8 6))>;
374
375 def : Pat<(int_x86_xop_vpcomfalsed VR128:$src1, VR128:$src2),
376           (VPCOMDri VR128:$src1, VR128:$src2, (i8 6))>;
377 def : Pat<(int_x86_xop_vpcomfalsed VR128:$src1,
378           (bitconvert (memopv2i64 addr:$src2))),
379           (VPCOMDmi VR128:$src1, addr:$src2, (i8 6))>;
380
381 def : Pat<(int_x86_xop_vpcomfalseb VR128:$src1, VR128:$src2),
382           (VPCOMBri VR128:$src1, VR128:$src2, (i8 6))>;
383 def : Pat<(int_x86_xop_vpcomfalseb VR128:$src1,
384           (bitconvert (memopv2i64 addr:$src2))),
385           (VPCOMBmi VR128:$src1, addr:$src2, (i8 6))>;
386
387 // VPCOM GE
388 def : Pat<(int_x86_xop_vpcomgew VR128:$src1, VR128:$src2),
389           (VPCOMWri VR128:$src1, VR128:$src2, (i8 3))>;
390 def : Pat<(int_x86_xop_vpcomgew VR128:$src1,
391           (bitconvert (memopv2i64 addr:$src2))),
392           (VPCOMWmi VR128:$src1, addr:$src2, (i8 3))>;
393
394 def : Pat<(int_x86_xop_vpcomgeuw VR128:$src1, VR128:$src2),
395           (VPCOMUWri VR128:$src1, VR128:$src2, (i8 3))>;
396 def : Pat<(int_x86_xop_vpcomgeuw VR128:$src1,
397           (bitconvert (memopv2i64 addr:$src2))),
398           (VPCOMUWmi VR128:$src1, addr:$src2, (i8 3))>;
399
400 def : Pat<(int_x86_xop_vpcomgeuq VR128:$src1, VR128:$src2),
401           (VPCOMUQri VR128:$src1, VR128:$src2, (i8 3))>;
402 def : Pat<(int_x86_xop_vpcomgeuq VR128:$src1,
403           (bitconvert (memopv2i64 addr:$src2))),
404           (VPCOMUQmi VR128:$src1, addr:$src2, (i8 3))>;
405
406 def : Pat<(int_x86_xop_vpcomgeud VR128:$src1, VR128:$src2),
407           (VPCOMUDri VR128:$src1, VR128:$src2, (i8 3))>;
408 def : Pat<(int_x86_xop_vpcomgeud VR128:$src1,
409           (bitconvert (memopv2i64 addr:$src2))),
410           (VPCOMUDmi VR128:$src1, addr:$src2, (i8 3))>;
411
412 def : Pat<(int_x86_xop_vpcomgeub VR128:$src1, VR128:$src2),
413           (VPCOMUBri VR128:$src1, VR128:$src2, (i8 3))>;
414 def : Pat<(int_x86_xop_vpcomgeub VR128:$src1,
415           (bitconvert (memopv2i64 addr:$src2))),
416           (VPCOMUBmi VR128:$src1, addr:$src2, (i8 3))>;
417
418 def : Pat<(int_x86_xop_vpcomgeq VR128:$src1, VR128:$src2),
419           (VPCOMQri VR128:$src1, VR128:$src2, (i8 3))>;
420 def : Pat<(int_x86_xop_vpcomgeq VR128:$src1,
421           (bitconvert (memopv2i64 addr:$src2))),
422           (VPCOMQmi VR128:$src1, addr:$src2, (i8 3))>;
423
424 def : Pat<(int_x86_xop_vpcomged VR128:$src1, VR128:$src2),
425           (VPCOMDri VR128:$src1, VR128:$src2, (i8 3))>;
426 def : Pat<(int_x86_xop_vpcomged VR128:$src1,
427           (bitconvert (memopv2i64 addr:$src2))),
428           (VPCOMDmi VR128:$src1, addr:$src2, (i8 3))>;
429
430 def : Pat<(int_x86_xop_vpcomgeb VR128:$src1, VR128:$src2),
431           (VPCOMBri VR128:$src1, VR128:$src2, (i8 3))>;
432 def : Pat<(int_x86_xop_vpcomgeb VR128:$src1,
433           (bitconvert (memopv2i64 addr:$src2))),
434           (VPCOMBmi VR128:$src1, addr:$src2, (i8 3))>;
435
436 // VPCOM GT
437 def : Pat<(int_x86_xop_vpcomgtw VR128:$src1, VR128:$src2),
438           (VPCOMWri VR128:$src1, VR128:$src2, (i8 2))>;
439 def : Pat<(int_x86_xop_vpcomgtw VR128:$src1,
440           (bitconvert (memopv2i64 addr:$src2))),
441           (VPCOMWmi VR128:$src1, addr:$src2, (i8 2))>;
442
443 def : Pat<(int_x86_xop_vpcomgtuw VR128:$src1, VR128:$src2),
444           (VPCOMUWri VR128:$src1, VR128:$src2, (i8 2))>;
445 def : Pat<(int_x86_xop_vpcomgtuw VR128:$src1,
446           (bitconvert (memopv2i64 addr:$src2))),
447           (VPCOMUWmi VR128:$src1, addr:$src2, (i8 2))>;
448
449 def : Pat<(int_x86_xop_vpcomgtuq VR128:$src1, VR128:$src2),
450           (VPCOMUQri VR128:$src1, VR128:$src2, (i8 2))>;
451 def : Pat<(int_x86_xop_vpcomgtuq VR128:$src1,
452           (bitconvert (memopv2i64 addr:$src2))),
453           (VPCOMUQmi VR128:$src1, addr:$src2, (i8 2))>;
454
455 def : Pat<(int_x86_xop_vpcomgtud VR128:$src1, VR128:$src2),
456           (VPCOMUDri VR128:$src1, VR128:$src2, (i8 2))>;
457 def : Pat<(int_x86_xop_vpcomgtud VR128:$src1,
458           (bitconvert (memopv2i64 addr:$src2))),
459           (VPCOMUDmi VR128:$src1, addr:$src2, (i8 2))>;
460
461 def : Pat<(int_x86_xop_vpcomgtub VR128:$src1, VR128:$src2),
462           (VPCOMUBri VR128:$src1, VR128:$src2, (i8 2))>;
463 def : Pat<(int_x86_xop_vpcomgtub VR128:$src1,
464           (bitconvert (memopv2i64 addr:$src2))),
465           (VPCOMUBmi VR128:$src1, addr:$src2, (i8 2))>;
466
467 def : Pat<(int_x86_xop_vpcomgtq VR128:$src1, VR128:$src2),
468           (VPCOMQri VR128:$src1, VR128:$src2, (i8 2))>;
469 def : Pat<(int_x86_xop_vpcomgtq VR128:$src1,
470           (bitconvert (memopv2i64 addr:$src2))),
471           (VPCOMQmi VR128:$src1, addr:$src2, (i8 2))>;
472
473 def : Pat<(int_x86_xop_vpcomgtd VR128:$src1, VR128:$src2),
474           (VPCOMDri VR128:$src1, VR128:$src2, (i8 2))>;
475 def : Pat<(int_x86_xop_vpcomgtd VR128:$src1,
476           (bitconvert (memopv2i64 addr:$src2))),
477           (VPCOMDmi VR128:$src1, addr:$src2, (i8 2))>;
478
479 def : Pat<(int_x86_xop_vpcomgtb VR128:$src1, VR128:$src2),
480           (VPCOMBri VR128:$src1, VR128:$src2, (i8 2))>;
481 def : Pat<(int_x86_xop_vpcomgtb VR128:$src1,
482           (bitconvert (memopv2i64 addr:$src2))),
483           (VPCOMBmi VR128:$src1, addr:$src2, (i8 2))>;
484
485 // VPCOM LE
486 def : Pat<(int_x86_xop_vpcomlew VR128:$src1, VR128:$src2),
487           (VPCOMWri VR128:$src1, VR128:$src2, (i8 1))>;
488 def : Pat<(int_x86_xop_vpcomlew VR128:$src1,
489           (bitconvert (memopv2i64 addr:$src2))),
490           (VPCOMWmi VR128:$src1, addr:$src2, (i8 1))>;
491
492 def : Pat<(int_x86_xop_vpcomleuw VR128:$src1, VR128:$src2),
493           (VPCOMUWri VR128:$src1, VR128:$src2, (i8 1))>;
494 def : Pat<(int_x86_xop_vpcomleuw VR128:$src1,
495           (bitconvert (memopv2i64 addr:$src2))),
496           (VPCOMUWmi VR128:$src1, addr:$src2, (i8 1))>;
497
498 def : Pat<(int_x86_xop_vpcomleuq VR128:$src1, VR128:$src2),
499           (VPCOMUQri VR128:$src1, VR128:$src2, (i8 1))>;
500 def : Pat<(int_x86_xop_vpcomleuq VR128:$src1,
501           (bitconvert (memopv2i64 addr:$src2))),
502           (VPCOMUQmi VR128:$src1, addr:$src2, (i8 1))>;
503
504 def : Pat<(int_x86_xop_vpcomleud VR128:$src1, VR128:$src2),
505           (VPCOMUDri VR128:$src1, VR128:$src2, (i8 1))>;
506 def : Pat<(int_x86_xop_vpcomleud VR128:$src1,
507           (bitconvert (memopv2i64 addr:$src2))),
508           (VPCOMUDmi VR128:$src1, addr:$src2, (i8 1))>;
509
510 def : Pat<(int_x86_xop_vpcomleub VR128:$src1, VR128:$src2),
511           (VPCOMUBri VR128:$src1, VR128:$src2, (i8 1))>;
512 def : Pat<(int_x86_xop_vpcomleub VR128:$src1,
513           (bitconvert (memopv2i64 addr:$src2))),
514           (VPCOMUBmi VR128:$src1, addr:$src2, (i8 1))>;
515
516 def : Pat<(int_x86_xop_vpcomleq VR128:$src1, VR128:$src2),
517           (VPCOMQri VR128:$src1, VR128:$src2, (i8 1))>;
518 def : Pat<(int_x86_xop_vpcomleq VR128:$src1,
519           (bitconvert (memopv2i64 addr:$src2))),
520           (VPCOMQmi VR128:$src1, addr:$src2, (i8 1))>;
521
522 def : Pat<(int_x86_xop_vpcomled VR128:$src1, VR128:$src2),
523           (VPCOMDri VR128:$src1, VR128:$src2, (i8 1))>;
524 def : Pat<(int_x86_xop_vpcomled VR128:$src1,
525           (bitconvert (memopv2i64 addr:$src2))),
526           (VPCOMDmi VR128:$src1, addr:$src2, (i8 1))>;
527
528 def : Pat<(int_x86_xop_vpcomleb VR128:$src1, VR128:$src2),
529           (VPCOMBri VR128:$src1, VR128:$src2, (i8 1))>;
530 def : Pat<(int_x86_xop_vpcomleb VR128:$src1,
531           (bitconvert (memopv2i64 addr:$src2))),
532           (VPCOMBmi VR128:$src1, addr:$src2, (i8 1))>;
533
534 // VPCOM LT
535 def : Pat<(int_x86_xop_vpcomltw VR128:$src1, VR128:$src2),
536           (VPCOMWri VR128:$src1, VR128:$src2, (i8 0))>;
537 def : Pat<(int_x86_xop_vpcomltw VR128:$src1,
538           (bitconvert (memopv2i64 addr:$src2))),
539           (VPCOMWmi VR128:$src1, addr:$src2, (i8 0))>;
540
541 def : Pat<(int_x86_xop_vpcomltuw VR128:$src1, VR128:$src2),
542           (VPCOMUWri VR128:$src1, VR128:$src2, (i8 0))>;
543 def : Pat<(int_x86_xop_vpcomltuw VR128:$src1,
544           (bitconvert (memopv2i64 addr:$src2))),
545           (VPCOMUWmi VR128:$src1, addr:$src2, (i8 0))>;
546
547 def : Pat<(int_x86_xop_vpcomltuq VR128:$src1, VR128:$src2),
548           (VPCOMUQri VR128:$src1, VR128:$src2, (i8 0))>;
549 def : Pat<(int_x86_xop_vpcomltuq VR128:$src1,
550           (bitconvert (memopv2i64 addr:$src2))),
551           (VPCOMUQmi VR128:$src1, addr:$src2, (i8 0))>;
552
553 def : Pat<(int_x86_xop_vpcomltud VR128:$src1, VR128:$src2),
554           (VPCOMUDri VR128:$src1, VR128:$src2, (i8 0))>;
555 def : Pat<(int_x86_xop_vpcomltud VR128:$src1,
556           (bitconvert (memopv2i64 addr:$src2))),
557           (VPCOMUDmi VR128:$src1, addr:$src2, (i8 0))>;
558
559 def : Pat<(int_x86_xop_vpcomltub VR128:$src1, VR128:$src2),
560           (VPCOMUBri VR128:$src1, VR128:$src2, (i8 0))>;
561 def : Pat<(int_x86_xop_vpcomltub VR128:$src1,
562           (bitconvert (memopv2i64 addr:$src2))),
563           (VPCOMUBmi VR128:$src1, addr:$src2, (i8 0))>;
564
565 def : Pat<(int_x86_xop_vpcomltq VR128:$src1, VR128:$src2),
566           (VPCOMQri VR128:$src1, VR128:$src2, (i8 0))>;
567 def : Pat<(int_x86_xop_vpcomltq VR128:$src1,
568           (bitconvert (memopv2i64 addr:$src2))),
569           (VPCOMQmi VR128:$src1, addr:$src2, (i8 0))>;
570
571 def : Pat<(int_x86_xop_vpcomltd VR128:$src1, VR128:$src2),
572           (VPCOMDri VR128:$src1, VR128:$src2, (i8 0))>;
573 def : Pat<(int_x86_xop_vpcomltd VR128:$src1,
574           (bitconvert (memopv2i64 addr:$src2))),
575           (VPCOMDmi VR128:$src1, addr:$src2, (i8 0))>;
576
577 def : Pat<(int_x86_xop_vpcomltb VR128:$src1, VR128:$src2),
578           (VPCOMBri VR128:$src1, VR128:$src2, (i8 0))>;
579 def : Pat<(int_x86_xop_vpcomltb VR128:$src1,
580           (bitconvert (memopv2i64 addr:$src2))),
581           (VPCOMBmi VR128:$src1, addr:$src2, (i8 0))>;
582
583 // VPCOM NE
584 def : Pat<(int_x86_xop_vpcomnew VR128:$src1, VR128:$src2),
585           (VPCOMWri VR128:$src1, VR128:$src2, (i8 5))>;
586 def : Pat<(int_x86_xop_vpcomnew VR128:$src1,
587           (bitconvert (memopv2i64 addr:$src2))),
588           (VPCOMWmi VR128:$src1, addr:$src2, (i8 5))>;
589
590 def : Pat<(int_x86_xop_vpcomneuw VR128:$src1, VR128:$src2),
591           (VPCOMUWri VR128:$src1, VR128:$src2, (i8 5))>;
592 def : Pat<(int_x86_xop_vpcomneuw VR128:$src1,
593           (bitconvert (memopv2i64 addr:$src2))),
594           (VPCOMUWmi VR128:$src1, addr:$src2, (i8 5))>;
595
596 def : Pat<(int_x86_xop_vpcomneuq VR128:$src1, VR128:$src2),
597           (VPCOMUQri VR128:$src1, VR128:$src2, (i8 5))>;
598 def : Pat<(int_x86_xop_vpcomneuq VR128:$src1,
599           (bitconvert (memopv2i64 addr:$src2))),
600           (VPCOMUQmi VR128:$src1, addr:$src2, (i8 5))>;
601
602 def : Pat<(int_x86_xop_vpcomneud VR128:$src1, VR128:$src2),
603           (VPCOMUDri VR128:$src1, VR128:$src2, (i8 5))>;
604 def : Pat<(int_x86_xop_vpcomneud VR128:$src1,
605           (bitconvert (memopv2i64 addr:$src2))),
606           (VPCOMUDmi VR128:$src1, addr:$src2, (i8 5))>;
607
608 def : Pat<(int_x86_xop_vpcomneub VR128:$src1, VR128:$src2),
609           (VPCOMUBri VR128:$src1, VR128:$src2, (i8 5))>;
610 def : Pat<(int_x86_xop_vpcomneub VR128:$src1,
611           (bitconvert (memopv2i64 addr:$src2))),
612           (VPCOMUBmi VR128:$src1, addr:$src2, (i8 5))>;
613
614 def : Pat<(int_x86_xop_vpcomneq VR128:$src1, VR128:$src2),
615           (VPCOMQri VR128:$src1, VR128:$src2, (i8 5))>;
616 def : Pat<(int_x86_xop_vpcomneq VR128:$src1,
617           (bitconvert (memopv2i64 addr:$src2))),
618           (VPCOMQmi VR128:$src1, addr:$src2, (i8 5))>;
619
620 def : Pat<(int_x86_xop_vpcomned VR128:$src1, VR128:$src2),
621           (VPCOMDri VR128:$src1, VR128:$src2, (i8 5))>;
622 def : Pat<(int_x86_xop_vpcomned VR128:$src1,
623           (bitconvert (memopv2i64 addr:$src2))),
624           (VPCOMDmi VR128:$src1, addr:$src2, (i8 5))>;
625
626 def : Pat<(int_x86_xop_vpcomneb VR128:$src1, VR128:$src2),
627           (VPCOMBri VR128:$src1, VR128:$src2, (i8 5))>;
628 def : Pat<(int_x86_xop_vpcomneb VR128:$src1,
629           (bitconvert (memopv2i64 addr:$src2))),
630           (VPCOMBmi VR128:$src1, addr:$src2, (i8 5))>;
631
632 // VPCOM TRUE
633 def : Pat<(int_x86_xop_vpcomtruew VR128:$src1, VR128:$src2),
634           (VPCOMWri VR128:$src1, VR128:$src2, (i8 6))>;
635 def : Pat<(int_x86_xop_vpcomtruew VR128:$src1,
636           (bitconvert (memopv2i64 addr:$src2))),
637           (VPCOMWmi VR128:$src1, addr:$src2, (i8 6))>;
638
639 def : Pat<(int_x86_xop_vpcomtrueuw VR128:$src1, VR128:$src2),
640           (VPCOMUWri VR128:$src1, VR128:$src2, (i8 6))>;
641 def : Pat<(int_x86_xop_vpcomtrueuw VR128:$src1,
642           (bitconvert (memopv2i64 addr:$src2))),
643           (VPCOMUWmi VR128:$src1, addr:$src2, (i8 6))>;
644
645 def : Pat<(int_x86_xop_vpcomtrueuq VR128:$src1, VR128:$src2),
646           (VPCOMUQri VR128:$src1, VR128:$src2, (i8 6))>;
647 def : Pat<(int_x86_xop_vpcomtrueuq VR128:$src1,
648           (bitconvert (memopv2i64 addr:$src2))),
649           (VPCOMUQmi VR128:$src1, addr:$src2, (i8 6))>;
650
651 def : Pat<(int_x86_xop_vpcomtrueud VR128:$src1, VR128:$src2),
652           (VPCOMUDri VR128:$src1, VR128:$src2, (i8 6))>;
653 def : Pat<(int_x86_xop_vpcomtrueud VR128:$src1,
654           (bitconvert (memopv2i64 addr:$src2))),
655           (VPCOMUDmi VR128:$src1, addr:$src2, (i8 6))>;
656
657 def : Pat<(int_x86_xop_vpcomtrueub VR128:$src1, VR128:$src2),
658           (VPCOMUBri VR128:$src1, VR128:$src2, (i8 6))>;
659 def : Pat<(int_x86_xop_vpcomtrueub VR128:$src1,
660           (bitconvert (memopv2i64 addr:$src2))),
661           (VPCOMUBmi VR128:$src1, addr:$src2, (i8 6))>;
662
663 def : Pat<(int_x86_xop_vpcomtrueq VR128:$src1, VR128:$src2),
664           (VPCOMQri VR128:$src1, VR128:$src2, (i8 6))>;
665 def : Pat<(int_x86_xop_vpcomtrueq VR128:$src1,
666           (bitconvert (memopv2i64 addr:$src2))),
667           (VPCOMQmi VR128:$src1, addr:$src2, (i8 6))>;
668
669 def : Pat<(int_x86_xop_vpcomtrued VR128:$src1, VR128:$src2),
670           (VPCOMDri VR128:$src1, VR128:$src2, (i8 6))>;
671 def : Pat<(int_x86_xop_vpcomtrued VR128:$src1,
672           (bitconvert (memopv2i64 addr:$src2))),
673           (VPCOMDmi VR128:$src1, addr:$src2, (i8 6))>;
674
675 def : Pat<(int_x86_xop_vpcomtrueb VR128:$src1, VR128:$src2),
676           (VPCOMBri VR128:$src1, VR128:$src2, (i8 6))>;
677 def : Pat<(int_x86_xop_vpcomtrueb VR128:$src1,
678           (bitconvert (memopv2i64 addr:$src2))),
679           (VPCOMBmi VR128:$src1, addr:$src2, (i8 6))>;
680
681 // VPPERM
682 def : Pat<(int_x86_xop_vpperm VR128:$src1, VR128:$src2, VR128:$src3),
683           (VPPERMrr VR128:$src1, VR128:$src2, VR128:$src3)>;
684 def : Pat<(int_x86_xop_vpperm VR128:$src1, VR128:$src2,
685                                   (bitconvert (memopv2i64 addr:$src3))),
686           (VPPERMrm VR128:$src1, VR128:$src2, addr:$src3)>;
687 def : Pat<(int_x86_xop_vpperm VR128:$src1, (bitconvert (memopv2i64 addr:$src2)),
688                                   VR128:$src3),
689           (VPPERMmr VR128:$src1, addr:$src2, VR128:$src3)>;
690
691 // VPCMOV
692 def : Pat<(int_x86_xop_vpcmov VR128:$src1, VR128:$src2, VR128:$src3),
693           (VPCMOVrr VR128:$src1, VR128:$src2, VR128:$src3)>;
694 def : Pat<(int_x86_xop_vpcmov VR128:$src1, VR128:$src2,
695                                   (bitconvert (memopv2i64 addr:$src3))),
696           (VPCMOVrm VR128:$src1, VR128:$src2, addr:$src3)>;
697 def : Pat<(int_x86_xop_vpcmov VR128:$src1, (bitconvert (memopv2i64 addr:$src2)),
698                                   VR128:$src3),
699           (VPCMOVmr VR128:$src1, addr:$src2, VR128:$src3)>;
700 def : Pat<(int_x86_xop_vpcmov_256 VR256:$src1, VR256:$src2, VR256:$src3),
701           (VPCMOVrrY VR256:$src1, VR256:$src2, VR256:$src3)>;
702 def : Pat<(int_x86_xop_vpcmov_256 VR256:$src1, VR256:$src2,
703                                   (bitconvert (memopv4i64 addr:$src3))),
704           (VPCMOVrmY VR256:$src1, VR256:$src2, addr:$src3)>;
705 def : Pat<(int_x86_xop_vpcmov_256 VR256:$src1,
706                                   (bitconvert (memopv4i64 addr:$src2)),
707                                   VR256:$src3),
708           (VPCMOVmrY VR256:$src1, addr:$src2, VR256:$src3)>;
709
710 // VPCMOV di
711 def : Pat<(int_x86_xop_vpcmov_v2di VR128:$src1, VR128:$src2, VR128:$src3),
712           (VPCMOVrr VR128:$src1, VR128:$src2, VR128:$src3)>;
713 def : Pat<(int_x86_xop_vpcmov_v2di VR128:$src1, VR128:$src2,
714                                   (bitconvert (memopv2i64 addr:$src3))),
715           (VPCMOVrm VR128:$src1, VR128:$src2, addr:$src3)>;
716 def : Pat<(int_x86_xop_vpcmov_v2di VR128:$src1,
717                                    (bitconvert (memopv2i64 addr:$src2)),
718                                    VR128:$src3),
719           (VPCMOVmr VR128:$src1, addr:$src2, VR128:$src3)>;
720 def : Pat<(int_x86_xop_vpcmov_v4di_256 VR256:$src1, VR256:$src2, VR256:$src3),
721           (VPCMOVrrY VR256:$src1, VR256:$src2, VR256:$src3)>;
722 def : Pat<(int_x86_xop_vpcmov_v4di_256 VR256:$src1, VR256:$src2,
723                                   (bitconvert (memopv2i64 addr:$src3))),
724           (VPCMOVrmY VR256:$src1, VR256:$src2, addr:$src3)>;
725 def : Pat<(int_x86_xop_vpcmov_v4di_256 VR256:$src1,
726                                       (bitconvert (memopv2i64 addr:$src2)),
727                                       VR256:$src3),
728           (VPCMOVmrY VR256:$src1, addr:$src2, VR256:$src3)>;
729
730 // VPCMOV si
731 def : Pat<(int_x86_xop_vpcmov_v4si VR128:$src1, VR128:$src2, VR128:$src3),
732           (VPCMOVrr VR128:$src1, VR128:$src2, VR128:$src3)>;
733 def : Pat<(int_x86_xop_vpcmov_v4si VR128:$src1, VR128:$src2,
734                                   (bitconvert (memopv2i64 addr:$src3))),
735           (VPCMOVrm VR128:$src1, VR128:$src2, addr:$src3)>;
736 def : Pat<(int_x86_xop_vpcmov_v4si VR128:$src1,
737                                    (bitconvert (memopv2i64 addr:$src2)),
738                                    VR128:$src3),
739           (VPCMOVmr VR128:$src1, addr:$src2, VR128:$src3)>;
740 def : Pat<(int_x86_xop_vpcmov_v8si_256 VR256:$src1, VR256:$src2, VR256:$src3),
741           (VPCMOVrrY VR256:$src1, VR256:$src2, VR256:$src3)>;
742 def : Pat<(int_x86_xop_vpcmov_v8si_256 VR256:$src1, VR256:$src2,
743                                   (bitconvert (memopv2i64 addr:$src3))),
744           (VPCMOVrmY VR256:$src1, VR256:$src2, addr:$src3)>;
745 def : Pat<(int_x86_xop_vpcmov_v8si_256 VR256:$src1,
746                                       (bitconvert (memopv2i64 addr:$src2)),
747                                       VR256:$src3),
748           (VPCMOVmrY VR256:$src1, addr:$src2, VR256:$src3)>;
749
750
751 // VPCMOV hi
752 def : Pat<(int_x86_xop_vpcmov_v8hi VR128:$src1, VR128:$src2, VR128:$src3),
753           (VPCMOVrr VR128:$src1, VR128:$src2, VR128:$src3)>;
754 def : Pat<(int_x86_xop_vpcmov_v8hi VR128:$src1, VR128:$src2,
755                                   (bitconvert (memopv2i64 addr:$src3))),
756           (VPCMOVrm VR128:$src1, VR128:$src2, addr:$src3)>;
757 def : Pat<(int_x86_xop_vpcmov_v8hi VR128:$src1,
758                                    (bitconvert (memopv2i64 addr:$src2)),
759                                    VR128:$src3),
760           (VPCMOVmr VR128:$src1, addr:$src2, VR128:$src3)>;
761 def : Pat<(int_x86_xop_vpcmov_v16hi_256 VR256:$src1, VR256:$src2, VR256:$src3),
762           (VPCMOVrrY VR256:$src1, VR256:$src2, VR256:$src3)>;
763 def : Pat<(int_x86_xop_vpcmov_v16hi_256 VR256:$src1, VR256:$src2,
764                                   (bitconvert (memopv2i64 addr:$src3))),
765           (VPCMOVrmY VR256:$src1, VR256:$src2, addr:$src3)>;
766 def : Pat<(int_x86_xop_vpcmov_v16hi_256 VR256:$src1,
767                                       (bitconvert (memopv2i64 addr:$src2)),
768                                       VR256:$src3),
769           (VPCMOVmrY VR256:$src1, addr:$src2, VR256:$src3)>;
770
771 // VPCMOV qi
772 def : Pat<(int_x86_xop_vpcmov_v16qi VR128:$src1, VR128:$src2, VR128:$src3),
773           (VPCMOVrr VR128:$src1, VR128:$src2, VR128:$src3)>;
774 def : Pat<(int_x86_xop_vpcmov_v16qi VR128:$src1, VR128:$src2,
775                                   (bitconvert (memopv2i64 addr:$src3))),
776           (VPCMOVrm VR128:$src1, VR128:$src2, addr:$src3)>;
777 def : Pat<(int_x86_xop_vpcmov_v16qi VR128:$src1,
778                                     (bitconvert (memopv2i64 addr:$src2)),
779                                     VR128:$src3),
780           (VPCMOVmr VR128:$src1, addr:$src2, VR128:$src3)>;
781 def : Pat<(int_x86_xop_vpcmov_v32qi_256 VR256:$src1, VR256:$src2, VR256:$src3),
782           (VPCMOVrrY VR256:$src1, VR256:$src2, VR256:$src3)>;
783 def : Pat<(int_x86_xop_vpcmov_v32qi_256 VR256:$src1, VR256:$src2,
784                                   (bitconvert (memopv2i64 addr:$src3))),
785           (VPCMOVrmY VR256:$src1, VR256:$src2, addr:$src3)>;
786 def : Pat<(int_x86_xop_vpcmov_v32qi_256 VR256:$src1,
787                                       (bitconvert (memopv2i64 addr:$src2)),
788                                       VR256:$src3),
789           (VPCMOVmrY VR256:$src1, addr:$src2, VR256:$src3)>;
790
791 // VPCMOV df
792 def : Pat<(int_x86_xop_vpcmov_v2df VR128:$src1, VR128:$src2, VR128:$src3),
793           (VPCMOVrr VR128:$src1, VR128:$src2, VR128:$src3)>;
794 def : Pat<(int_x86_xop_vpcmov_v2df VR128:$src1, VR128:$src2,
795                                   (bitconvert (memopv2i64 addr:$src3))),
796           (VPCMOVrm VR128:$src1, VR128:$src2, addr:$src3)>;
797 def : Pat<(int_x86_xop_vpcmov_v2df VR128:$src1,
798                                    (bitconvert (memopv2i64 addr:$src2)),
799                                    VR128:$src3),
800           (VPCMOVmr VR128:$src1, addr:$src2, VR128:$src3)>;
801 def : Pat<(int_x86_xop_vpcmov_v4df_256 VR256:$src1, VR256:$src2, VR256:$src3),
802           (VPCMOVrrY VR256:$src1, VR256:$src2, VR256:$src3)>;
803 def : Pat<(int_x86_xop_vpcmov_v4df_256 VR256:$src1, VR256:$src2,
804                                   (bitconvert (memopv2i64 addr:$src3))),
805           (VPCMOVrmY VR256:$src1, VR256:$src2, addr:$src3)>;
806 def : Pat<(int_x86_xop_vpcmov_v4df_256 VR256:$src1,
807                                       (bitconvert (memopv2i64 addr:$src2)),
808                                       VR256:$src3),
809           (VPCMOVmrY VR256:$src1, addr:$src2, VR256:$src3)>;
810
811 // VPCMOV sf
812 def : Pat<(int_x86_xop_vpcmov_v4sf VR128:$src1, VR128:$src2, VR128:$src3),
813           (VPCMOVrr VR128:$src1, VR128:$src2, VR128:$src3)>;
814 def : Pat<(int_x86_xop_vpcmov_v4sf VR128:$src1, VR128:$src2,
815                                   (bitconvert (memopv2i64 addr:$src3))),
816           (VPCMOVrm VR128:$src1, VR128:$src2, addr:$src3)>;
817 def : Pat<(int_x86_xop_vpcmov_v4sf VR128:$src1,
818                                    (bitconvert (memopv2i64 addr:$src2)),
819                                    VR128:$src3),
820           (VPCMOVmr VR128:$src1, addr:$src2, VR128:$src3)>;
821 def : Pat<(int_x86_xop_vpcmov_v8sf_256 VR256:$src1, VR256:$src2, VR256:$src3),
822           (VPCMOVrrY VR256:$src1, VR256:$src2, VR256:$src3)>;
823 def : Pat<(int_x86_xop_vpcmov_v8sf_256 VR256:$src1, VR256:$src2,
824                                   (bitconvert (memopv2i64 addr:$src3))),
825           (VPCMOVrmY VR256:$src1, VR256:$src2, addr:$src3)>;
826 def : Pat<(int_x86_xop_vpcmov_v8sf_256 VR256:$src1,
827                                       (bitconvert (memopv2i64 addr:$src2)),
828                                       VR256:$src3),
829           (VPCMOVmrY VR256:$src1, addr:$src2, VR256:$src3)>;
830