[InstCombine] Signed saturation patterns
[llvm-complete.git] / test / CodeGen / X86 / commute-xop.ll
blob789afbb99bc618833a5e239d4d903ece0d0951c6
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc < %s -disable-peephole -mtriple=i686-unknown-unknown -mattr=+avx,+xop | FileCheck %s --check-prefix=X32
3 ; RUN: llc < %s -disable-peephole -mtriple=x86_64-unknown-unknown -mattr=+avx,+xop | FileCheck %s --check-prefix=X64
5 define <16 x i8> @commute_fold_vpcomb(<16 x i8>* %a0, <16 x i8> %a1) {
6 ; X32-LABEL: commute_fold_vpcomb:
7 ; X32:       # %bb.0:
8 ; X32-NEXT:    movl {{[0-9]+}}(%esp), %eax
9 ; X32-NEXT:    vpcomgtb (%eax), %xmm0, %xmm0
10 ; X32-NEXT:    retl
12 ; X64-LABEL: commute_fold_vpcomb:
13 ; X64:       # %bb.0:
14 ; X64-NEXT:    vpcomgtb (%rdi), %xmm0, %xmm0
15 ; X64-NEXT:    retq
16   %1 = load <16 x i8>, <16 x i8>* %a0
17   %2 = call <16 x i8> @llvm.x86.xop.vpcomb(<16 x i8> %1, <16 x i8> %a1, i8 0) ; vpcomltb
18   ret <16 x i8> %2
20 declare <16 x i8> @llvm.x86.xop.vpcomb(<16 x i8>, <16 x i8>, i8) nounwind readnone
22 define <4 x i32> @commute_fold_vpcomd(<4 x i32>* %a0, <4 x i32> %a1) {
23 ; X32-LABEL: commute_fold_vpcomd:
24 ; X32:       # %bb.0:
25 ; X32-NEXT:    movl {{[0-9]+}}(%esp), %eax
26 ; X32-NEXT:    vpcomged (%eax), %xmm0, %xmm0
27 ; X32-NEXT:    retl
29 ; X64-LABEL: commute_fold_vpcomd:
30 ; X64:       # %bb.0:
31 ; X64-NEXT:    vpcomged (%rdi), %xmm0, %xmm0
32 ; X64-NEXT:    retq
33   %1 = load <4 x i32>, <4 x i32>* %a0
34   %2 = call <4 x i32> @llvm.x86.xop.vpcomd(<4 x i32> %1, <4 x i32> %a1, i8 1) ; vpcomled
35   ret <4 x i32> %2
37 declare <4 x i32> @llvm.x86.xop.vpcomd(<4 x i32>, <4 x i32>, i8) nounwind readnone
39 define <2 x i64> @commute_fold_vpcomq(<2 x i64>* %a0, <2 x i64> %a1) {
40 ; X32-LABEL: commute_fold_vpcomq:
41 ; X32:       # %bb.0:
42 ; X32-NEXT:    movl {{[0-9]+}}(%esp), %eax
43 ; X32-NEXT:    vpcomltq (%eax), %xmm0, %xmm0
44 ; X32-NEXT:    retl
46 ; X64-LABEL: commute_fold_vpcomq:
47 ; X64:       # %bb.0:
48 ; X64-NEXT:    vpcomltq (%rdi), %xmm0, %xmm0
49 ; X64-NEXT:    retq
50   %1 = load <2 x i64>, <2 x i64>* %a0
51   %2 = call <2 x i64> @llvm.x86.xop.vpcomq(<2 x i64> %1, <2 x i64> %a1, i8 2) ; vpcomgtq
52   ret <2 x i64> %2
54 declare <2 x i64> @llvm.x86.xop.vpcomq(<2 x i64>, <2 x i64>, i8) nounwind readnone
56 define <16 x i8> @commute_fold_vpcomub(<16 x i8>* %a0, <16 x i8> %a1) {
57 ; X32-LABEL: commute_fold_vpcomub:
58 ; X32:       # %bb.0:
59 ; X32-NEXT:    movl {{[0-9]+}}(%esp), %eax
60 ; X32-NEXT:    vpcomleub (%eax), %xmm0, %xmm0
61 ; X32-NEXT:    retl
63 ; X64-LABEL: commute_fold_vpcomub:
64 ; X64:       # %bb.0:
65 ; X64-NEXT:    vpcomleub (%rdi), %xmm0, %xmm0
66 ; X64-NEXT:    retq
67   %1 = load <16 x i8>, <16 x i8>* %a0
68   %2 = call <16 x i8> @llvm.x86.xop.vpcomub(<16 x i8> %1, <16 x i8> %a1, i8 3) ; vpcomgeub
69   ret <16 x i8> %2
71 declare <16 x i8> @llvm.x86.xop.vpcomub(<16 x i8>, <16 x i8>, i8) nounwind readnone
73 define <4 x i32> @commute_fold_vpcomud(<4 x i32>* %a0, <4 x i32> %a1) {
74 ; X32-LABEL: commute_fold_vpcomud:
75 ; X32:       # %bb.0:
76 ; X32-NEXT:    movl {{[0-9]+}}(%esp), %eax
77 ; X32-NEXT:    vpcomeqd (%eax), %xmm0, %xmm0
78 ; X32-NEXT:    retl
80 ; X64-LABEL: commute_fold_vpcomud:
81 ; X64:       # %bb.0:
82 ; X64-NEXT:    vpcomeqd (%rdi), %xmm0, %xmm0
83 ; X64-NEXT:    retq
84   %1 = load <4 x i32>, <4 x i32>* %a0
85   %2 = call <4 x i32> @llvm.x86.xop.vpcomud(<4 x i32> %1, <4 x i32> %a1, i8 4) ; vpcomequd
86   ret <4 x i32> %2
88 declare <4 x i32> @llvm.x86.xop.vpcomud(<4 x i32>, <4 x i32>, i8) nounwind readnone
90 define <2 x i64> @commute_fold_vpcomuq(<2 x i64>* %a0, <2 x i64> %a1) {
91 ; X32-LABEL: commute_fold_vpcomuq:
92 ; X32:       # %bb.0:
93 ; X32-NEXT:    movl {{[0-9]+}}(%esp), %eax
94 ; X32-NEXT:    vpcomneqq (%eax), %xmm0, %xmm0
95 ; X32-NEXT:    retl
97 ; X64-LABEL: commute_fold_vpcomuq:
98 ; X64:       # %bb.0:
99 ; X64-NEXT:    vpcomneqq (%rdi), %xmm0, %xmm0
100 ; X64-NEXT:    retq
101   %1 = load <2 x i64>, <2 x i64>* %a0
102   %2 = call <2 x i64> @llvm.x86.xop.vpcomuq(<2 x i64> %1, <2 x i64> %a1, i8 5) ; vpcomnequq
103   ret <2 x i64> %2
105 declare <2 x i64> @llvm.x86.xop.vpcomuq(<2 x i64>, <2 x i64>, i8) nounwind readnone
107 define <8 x i16> @commute_fold_vpcomuw(<8 x i16>* %a0, <8 x i16> %a1) {
108 ; X32-LABEL: commute_fold_vpcomuw:
109 ; X32:       # %bb.0:
110 ; X32-NEXT:    vxorps %xmm0, %xmm0, %xmm0
111 ; X32-NEXT:    retl
113 ; X64-LABEL: commute_fold_vpcomuw:
114 ; X64:       # %bb.0:
115 ; X64-NEXT:    vxorps %xmm0, %xmm0, %xmm0
116 ; X64-NEXT:    retq
117   %1 = load <8 x i16>, <8 x i16>* %a0
118   %2 = call <8 x i16> @llvm.x86.xop.vpcomuw(<8 x i16> %1, <8 x i16> %a1, i8 6) ; vpcomfalseuw
119   ret <8 x i16> %2
121 declare <8 x i16> @llvm.x86.xop.vpcomuw(<8 x i16>, <8 x i16>, i8) nounwind readnone
123 define <8 x i16> @commute_fold_vpcomw(<8 x i16>* %a0, <8 x i16> %a1) {
124 ; X32-LABEL: commute_fold_vpcomw:
125 ; X32:       # %bb.0:
126 ; X32-NEXT:    vpcmpeqd %xmm0, %xmm0, %xmm0
127 ; X32-NEXT:    retl
129 ; X64-LABEL: commute_fold_vpcomw:
130 ; X64:       # %bb.0:
131 ; X64-NEXT:    vpcmpeqd %xmm0, %xmm0, %xmm0
132 ; X64-NEXT:    retq
133   %1 = load <8 x i16>, <8 x i16>* %a0
134   %2 = call <8 x i16> @llvm.x86.xop.vpcomw(<8 x i16> %1, <8 x i16> %a1, i8 7) ; vpcomtruew
135   ret <8 x i16> %2
137 declare <8 x i16> @llvm.x86.xop.vpcomw(<8 x i16>, <8 x i16>, i8) nounwind readnone
139 define <4 x i32> @commute_fold_vpmacsdd(<4 x i32>* %a0, <4 x i32> %a1, <4 x i32> %a2) {
140 ; X32-LABEL: commute_fold_vpmacsdd:
141 ; X32:       # %bb.0:
142 ; X32-NEXT:    movl {{[0-9]+}}(%esp), %eax
143 ; X32-NEXT:    vpmacsdd %xmm1, (%eax), %xmm0, %xmm0
144 ; X32-NEXT:    retl
146 ; X64-LABEL: commute_fold_vpmacsdd:
147 ; X64:       # %bb.0:
148 ; X64-NEXT:    vpmacsdd %xmm1, (%rdi), %xmm0, %xmm0
149 ; X64-NEXT:    retq
150   %1 = load <4 x i32>, <4 x i32>* %a0
151   %2 = call <4 x i32> @llvm.x86.xop.vpmacsdd(<4 x i32> %1, <4 x i32> %a1, <4 x i32> %a2)
152   ret <4 x i32> %2
154 declare <4 x i32> @llvm.x86.xop.vpmacsdd(<4 x i32>, <4 x i32>, <4 x i32>) nounwind readnone
156 define <2 x i64> @commute_fold_vpmacsdqh(<4 x i32>* %a0, <4 x i32> %a1, <2 x i64> %a2) {
157 ; X32-LABEL: commute_fold_vpmacsdqh:
158 ; X32:       # %bb.0:
159 ; X32-NEXT:    movl {{[0-9]+}}(%esp), %eax
160 ; X32-NEXT:    vpmacsdqh %xmm1, (%eax), %xmm0, %xmm0
161 ; X32-NEXT:    retl
163 ; X64-LABEL: commute_fold_vpmacsdqh:
164 ; X64:       # %bb.0:
165 ; X64-NEXT:    vpmacsdqh %xmm1, (%rdi), %xmm0, %xmm0
166 ; X64-NEXT:    retq
167   %1 = load <4 x i32>, <4 x i32>* %a0
168   %2 = call <2 x i64> @llvm.x86.xop.vpmacsdqh(<4 x i32> %1, <4 x i32> %a1, <2 x i64> %a2)
169   ret <2 x i64> %2
171 declare <2 x i64> @llvm.x86.xop.vpmacsdqh(<4 x i32>, <4 x i32>, <2 x i64>) nounwind readnone
173 define <2 x i64> @commute_fold_vpmacsdql(<4 x i32>* %a0, <4 x i32> %a1, <2 x i64> %a2) {
174 ; X32-LABEL: commute_fold_vpmacsdql:
175 ; X32:       # %bb.0:
176 ; X32-NEXT:    movl {{[0-9]+}}(%esp), %eax
177 ; X32-NEXT:    vpmacsdql %xmm1, (%eax), %xmm0, %xmm0
178 ; X32-NEXT:    retl
180 ; X64-LABEL: commute_fold_vpmacsdql:
181 ; X64:       # %bb.0:
182 ; X64-NEXT:    vpmacsdql %xmm1, (%rdi), %xmm0, %xmm0
183 ; X64-NEXT:    retq
184   %1 = load <4 x i32>, <4 x i32>* %a0
185   %2 = call <2 x i64> @llvm.x86.xop.vpmacsdql(<4 x i32> %1, <4 x i32> %a1, <2 x i64> %a2)
186   ret <2 x i64> %2
188 declare <2 x i64> @llvm.x86.xop.vpmacsdql(<4 x i32>, <4 x i32>, <2 x i64>) nounwind readnone
190 define <4 x i32> @commute_fold_vpmacssdd(<4 x i32>* %a0, <4 x i32> %a1, <4 x i32> %a2) {
191 ; X32-LABEL: commute_fold_vpmacssdd:
192 ; X32:       # %bb.0:
193 ; X32-NEXT:    movl {{[0-9]+}}(%esp), %eax
194 ; X32-NEXT:    vpmacssdd %xmm1, (%eax), %xmm0, %xmm0
195 ; X32-NEXT:    retl
197 ; X64-LABEL: commute_fold_vpmacssdd:
198 ; X64:       # %bb.0:
199 ; X64-NEXT:    vpmacssdd %xmm1, (%rdi), %xmm0, %xmm0
200 ; X64-NEXT:    retq
201   %1 = load <4 x i32>, <4 x i32>* %a0
202   %2 = call <4 x i32> @llvm.x86.xop.vpmacssdd(<4 x i32> %1, <4 x i32> %a1, <4 x i32> %a2)
203   ret <4 x i32> %2
205 declare <4 x i32> @llvm.x86.xop.vpmacssdd(<4 x i32>, <4 x i32>, <4 x i32>) nounwind readnone
207 define <2 x i64> @commute_fold_vpmacssdqh(<4 x i32>* %a0, <4 x i32> %a1, <2 x i64> %a2) {
208 ; X32-LABEL: commute_fold_vpmacssdqh:
209 ; X32:       # %bb.0:
210 ; X32-NEXT:    movl {{[0-9]+}}(%esp), %eax
211 ; X32-NEXT:    vpmacssdqh %xmm1, (%eax), %xmm0, %xmm0
212 ; X32-NEXT:    retl
214 ; X64-LABEL: commute_fold_vpmacssdqh:
215 ; X64:       # %bb.0:
216 ; X64-NEXT:    vpmacssdqh %xmm1, (%rdi), %xmm0, %xmm0
217 ; X64-NEXT:    retq
218   %1 = load <4 x i32>, <4 x i32>* %a0
219   %2 = call <2 x i64> @llvm.x86.xop.vpmacssdqh(<4 x i32> %1, <4 x i32> %a1, <2 x i64> %a2)
220   ret <2 x i64> %2
222 declare <2 x i64> @llvm.x86.xop.vpmacssdqh(<4 x i32>, <4 x i32>, <2 x i64>) nounwind readnone
224 define <2 x i64> @commute_fold_vpmacssdql(<4 x i32>* %a0, <4 x i32> %a1, <2 x i64> %a2) {
225 ; X32-LABEL: commute_fold_vpmacssdql:
226 ; X32:       # %bb.0:
227 ; X32-NEXT:    movl {{[0-9]+}}(%esp), %eax
228 ; X32-NEXT:    vpmacssdql %xmm1, (%eax), %xmm0, %xmm0
229 ; X32-NEXT:    retl
231 ; X64-LABEL: commute_fold_vpmacssdql:
232 ; X64:       # %bb.0:
233 ; X64-NEXT:    vpmacssdql %xmm1, (%rdi), %xmm0, %xmm0
234 ; X64-NEXT:    retq
235   %1 = load <4 x i32>, <4 x i32>* %a0
236   %2 = call <2 x i64> @llvm.x86.xop.vpmacssdql(<4 x i32> %1, <4 x i32> %a1, <2 x i64> %a2)
237   ret <2 x i64> %2
239 declare <2 x i64> @llvm.x86.xop.vpmacssdql(<4 x i32>, <4 x i32>, <2 x i64>) nounwind readnone
241 define <4 x i32> @commute_fold_vpmacsswd(<8 x i16>* %a0, <8 x i16> %a1, <4 x i32> %a2) {
242 ; X32-LABEL: commute_fold_vpmacsswd:
243 ; X32:       # %bb.0:
244 ; X32-NEXT:    movl {{[0-9]+}}(%esp), %eax
245 ; X32-NEXT:    vpmacsswd %xmm1, (%eax), %xmm0, %xmm0
246 ; X32-NEXT:    retl
248 ; X64-LABEL: commute_fold_vpmacsswd:
249 ; X64:       # %bb.0:
250 ; X64-NEXT:    vpmacsswd %xmm1, (%rdi), %xmm0, %xmm0
251 ; X64-NEXT:    retq
252   %1 = load <8 x i16>, <8 x i16>* %a0
253   %2 = call <4 x i32> @llvm.x86.xop.vpmacsswd(<8 x i16> %1, <8 x i16> %a1, <4 x i32> %a2)
254   ret <4 x i32> %2
256 declare <4 x i32> @llvm.x86.xop.vpmacsswd(<8 x i16>, <8 x i16>, <4 x i32>) nounwind readnone
258 define <8 x i16> @commute_fold_vpmacssww(<8 x i16>* %a0, <8 x i16> %a1, <8 x i16> %a2) {
259 ; X32-LABEL: commute_fold_vpmacssww:
260 ; X32:       # %bb.0:
261 ; X32-NEXT:    movl {{[0-9]+}}(%esp), %eax
262 ; X32-NEXT:    vpmacssww %xmm1, (%eax), %xmm0, %xmm0
263 ; X32-NEXT:    retl
265 ; X64-LABEL: commute_fold_vpmacssww:
266 ; X64:       # %bb.0:
267 ; X64-NEXT:    vpmacssww %xmm1, (%rdi), %xmm0, %xmm0
268 ; X64-NEXT:    retq
269   %1 = load <8 x i16>, <8 x i16>* %a0
270   %2 = call <8 x i16> @llvm.x86.xop.vpmacssww(<8 x i16> %1, <8 x i16> %a1, <8 x i16> %a2)
271   ret <8 x i16> %2
273 declare <8 x i16> @llvm.x86.xop.vpmacssww(<8 x i16>, <8 x i16>, <8 x i16>) nounwind readnone
275 define <4 x i32> @commute_fold_vpmacswd(<8 x i16>* %a0, <8 x i16> %a1, <4 x i32> %a2) {
276 ; X32-LABEL: commute_fold_vpmacswd:
277 ; X32:       # %bb.0:
278 ; X32-NEXT:    movl {{[0-9]+}}(%esp), %eax
279 ; X32-NEXT:    vpmacswd %xmm1, (%eax), %xmm0, %xmm0
280 ; X32-NEXT:    retl
282 ; X64-LABEL: commute_fold_vpmacswd:
283 ; X64:       # %bb.0:
284 ; X64-NEXT:    vpmacswd %xmm1, (%rdi), %xmm0, %xmm0
285 ; X64-NEXT:    retq
286   %1 = load <8 x i16>, <8 x i16>* %a0
287   %2 = call <4 x i32> @llvm.x86.xop.vpmacswd(<8 x i16> %1, <8 x i16> %a1, <4 x i32> %a2)
288   ret <4 x i32> %2
290 declare <4 x i32> @llvm.x86.xop.vpmacswd(<8 x i16>, <8 x i16>, <4 x i32>) nounwind readnone
292 define <8 x i16> @commute_fold_vpmacsww(<8 x i16>* %a0, <8 x i16> %a1, <8 x i16> %a2) {
293 ; X32-LABEL: commute_fold_vpmacsww:
294 ; X32:       # %bb.0:
295 ; X32-NEXT:    movl {{[0-9]+}}(%esp), %eax
296 ; X32-NEXT:    vpmacsww %xmm1, (%eax), %xmm0, %xmm0
297 ; X32-NEXT:    retl
299 ; X64-LABEL: commute_fold_vpmacsww:
300 ; X64:       # %bb.0:
301 ; X64-NEXT:    vpmacsww %xmm1, (%rdi), %xmm0, %xmm0
302 ; X64-NEXT:    retq
303   %1 = load <8 x i16>, <8 x i16>* %a0
304   %2 = call <8 x i16> @llvm.x86.xop.vpmacsww(<8 x i16> %1, <8 x i16> %a1, <8 x i16> %a2)
305   ret <8 x i16> %2
307 declare <8 x i16> @llvm.x86.xop.vpmacsww(<8 x i16>, <8 x i16>, <8 x i16>) nounwind readnone
309 define <4 x i32> @commute_fold_vpmadcsswd(<8 x i16>* %a0, <8 x i16> %a1, <4 x i32> %a2) {
310 ; X32-LABEL: commute_fold_vpmadcsswd:
311 ; X32:       # %bb.0:
312 ; X32-NEXT:    movl {{[0-9]+}}(%esp), %eax
313 ; X32-NEXT:    vpmadcsswd %xmm1, (%eax), %xmm0, %xmm0
314 ; X32-NEXT:    retl
316 ; X64-LABEL: commute_fold_vpmadcsswd:
317 ; X64:       # %bb.0:
318 ; X64-NEXT:    vpmadcsswd %xmm1, (%rdi), %xmm0, %xmm0
319 ; X64-NEXT:    retq
320   %1 = load <8 x i16>, <8 x i16>* %a0
321   %2 = call <4 x i32> @llvm.x86.xop.vpmadcsswd(<8 x i16> %1, <8 x i16> %a1, <4 x i32> %a2)
322   ret <4 x i32> %2
324 declare <4 x i32> @llvm.x86.xop.vpmadcsswd(<8 x i16>, <8 x i16>, <4 x i32>) nounwind readnone
326 define <4 x i32> @commute_fold_vpmadcswd(<8 x i16>* %a0, <8 x i16> %a1, <4 x i32> %a2) {
327 ; X32-LABEL: commute_fold_vpmadcswd:
328 ; X32:       # %bb.0:
329 ; X32-NEXT:    movl {{[0-9]+}}(%esp), %eax
330 ; X32-NEXT:    vpmadcswd %xmm1, (%eax), %xmm0, %xmm0
331 ; X32-NEXT:    retl
333 ; X64-LABEL: commute_fold_vpmadcswd:
334 ; X64:       # %bb.0:
335 ; X64-NEXT:    vpmadcswd %xmm1, (%rdi), %xmm0, %xmm0
336 ; X64-NEXT:    retq
337   %1 = load <8 x i16>, <8 x i16>* %a0
338   %2 = call <4 x i32> @llvm.x86.xop.vpmadcswd(<8 x i16> %1, <8 x i16> %a1, <4 x i32> %a2)
339   ret <4 x i32> %2
341 declare <4 x i32> @llvm.x86.xop.vpmadcswd(<8 x i16>, <8 x i16>, <4 x i32>) nounwind readnone