1 //====- X86InstrXOP.td - Describe the X86 Instruction Set --*- tablegen -*-====//
3 // The LLVM Compiler Infrastructure
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
8 //===-----------------------------------------------------------------------===//
10 // This file describes XOP (eXtended OPerations)
12 //===-----------------------------------------------------------------------===//
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;
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>;
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,
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,
53 !strconcat(OpcodeStr, "\t{$src2, $dst|$dst, $src2}"),
54 [(set VR128:$dst, (Int VR128:$src1,
55 (bitconvert mem_cpat:$src2)))]>, VEX;
58 } // Constraints = "$src1 = $dst"
60 let isAsmParserOnly = 1 in {
61 defm VFRCZSS : xop2opsld<0x82, "vfrczss", int_x86_xop_vfrcz_ss,
63 defm VFRCZSD : xop2opsld<0x83, "vfrczsd", int_x86_xop_vfrcz_sd,
68 multiclass xop2op256<bits<8> opc, string OpcodeStr, Intrinsic Int,
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;
78 let isAsmParserOnly = 1 in {
79 defm VFRCZPS : xop2op256<0x80, "vfrczps", int_x86_xop_vfrcz_ps_256,
81 defm VFRCZPD : xop2op256<0x81, "vfrczpd", int_x86_xop_vfrcz_pd_256,
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}"),
94 (Int VR128:$src1, (bitconvert (memopv2i64 addr:$src2))))]>,
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}"),
100 (Int (bitconvert (memopv2i64 addr:$src1)), VR128:$src2))]>,
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>;
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}"),
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}"),
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">;
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}"),
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}"),
150 (Int VR128:$src1, (bitconvert (memopv2i64 addr:$src2)),
151 VR128:$src3))]>, VEX_4V, VEX_I8IMM;
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>;
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}"),
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}"),
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">;
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;
213 let isAsmParserOnly = 1 in {
214 defm VPPERM : xop4op<0xA3, "vpperm">;
215 defm VPCMOV : xop4op<0xA2, "vpcmov">;
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;
236 let isAsmParserOnly = 1 in {
237 defm VPCMOV : xop4op256<0xA2, "vpcmov">;
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}"),
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}"),
253 (Int128 VR128:$src1, VR128:$src2, (ld_128 addr:$src3), imm:$src4))]>,
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}"),
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}"),
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}"),
272 (Int256 VR256:$src1, VR256:$src2, (ld_256 addr:$src3), imm:$src4))]>,
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}"),
279 (Int256 VR256:$src1, (ld_256 addr:$src2), VR256:$src3, imm:$src4))]>;
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>;
287 // XOP Intrinsics patterns
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))>;
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))>;
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))>;
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))>;
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))>;
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))>;
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))>;
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))>;
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))>;
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))>;
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))>;
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))>;
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))>;
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))>;
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))>;
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))>;
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))>;
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))>;
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))>;
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))>;
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))>;
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))>;
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))>;
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))>;
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))>;
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))>;
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))>;
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))>;
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))>;
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))>;
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))>;
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))>;
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))>;
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))>;
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))>;
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))>;
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))>;
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))>;
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))>;
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))>;
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))>;
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))>;
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))>;
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))>;
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))>;
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))>;
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))>;
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))>;
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))>;
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))>;
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))>;
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))>;
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))>;
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))>;
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))>;
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))>;
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))>;
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))>;
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))>;
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))>;
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))>;
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))>;
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))>;
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))>;
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)),
689 (VPPERMmr VR128:$src1, addr:$src2, VR128:$src3)>;
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)),
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)),
708 (VPCMOVmrY VR256:$src1, addr:$src2, VR256:$src3)>;
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)),
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)),
728 (VPCMOVmrY VR256:$src1, addr:$src2, VR256:$src3)>;
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)),
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)),
748 (VPCMOVmrY VR256:$src1, addr:$src2, VR256:$src3)>;
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)),
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)),
769 (VPCMOVmrY VR256:$src1, addr:$src2, VR256:$src3)>;
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)),
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)),
789 (VPCMOVmrY VR256:$src1, addr:$src2, VR256:$src3)>;
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)),
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)),
809 (VPCMOVmrY VR256:$src1, addr:$src2, VR256:$src3)>;
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)),
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)),
829 (VPCMOVmrY VR256:$src1, addr:$src2, VR256:$src3)>;