Revert r354244 "[DAGCombiner] Eliminate dead stores to stack."
[llvm-complete.git] / test / CodeGen / Hexagon / intrinsics-v60-vcmp.ll
blob588b0270902d63bcff3289b1c360da190eeec1c4
1 ; RUN: llc -march=hexagon < %s | FileCheck %s
3 @d = external global <16 x i32>
5 ; CHECK-LABEL: test1:
6 ; CHECK: q{{[0-9]}} &= vcmp.eq(v{{[0-9]+}}.b,v{{[0-9]+}}.b)
7 define void @test1(<16 x i32> %a, <16 x i32> %b) #0 {
8 entry:
9   %0 = load <512 x i1>, <512 x i1>* bitcast (<16 x i32>* @d to <512 x i1>*), align 64
10   %1 = tail call <512 x i1> @llvm.hexagon.V6.veqb.and(<512 x i1> %0, <16 x i32> %a, <16 x i32> %b)
11   %2 = bitcast <512 x i1> %1 to <16 x i32>
12   store <16 x i32> %2, <16 x i32>* @d, align 64
13   ret void
16 ; CHECK-LABEL: test2:
17 ; CHECK: q{{[0-9]}} &= vcmp.eq(v{{[0-9]+}}.h,v{{[0-9]+}}.h)
18 define void @test2(<16 x i32> %a, <16 x i32> %b) #0 {
19 entry:
20   %0 = load <512 x i1>, <512 x i1>* bitcast (<16 x i32>* @d to <512 x i1>*), align 64
21   %1 = tail call <512 x i1> @llvm.hexagon.V6.veqh.and(<512 x i1> %0, <16 x i32> %a, <16 x i32> %b)
22   %2 = bitcast <512 x i1> %1 to <16 x i32>
23   store <16 x i32> %2, <16 x i32>* @d, align 64
24   ret void
27 ; CHECK-LABEL: test3:
28 ; CHECK: q{{[0-9]}} &= vcmp.eq(v{{[0-9]+}}.w,v{{[0-9]+}}.w)
29 define void @test3(<16 x i32> %a, <16 x i32> %b) #0 {
30 entry:
31   %0 = load <512 x i1>, <512 x i1>* bitcast (<16 x i32>* @d to <512 x i1>*), align 64
32   %1 = tail call <512 x i1> @llvm.hexagon.V6.veqw.and(<512 x i1> %0, <16 x i32> %a, <16 x i32> %b)
33   %2 = bitcast <512 x i1> %1 to <16 x i32>
34   store <16 x i32> %2, <16 x i32>* @d, align 64
35   ret void
38 ; CHECK-LABEL: test4:
39 ; CHECK: q{{[0-9]}} &= vcmp.gt(v{{[0-9]+}}.b,v{{[0-9]+}}.b)
40 define void @test4(<16 x i32> %a, <16 x i32> %b) #0 {
41 entry:
42   %0 = load <512 x i1>, <512 x i1>* bitcast (<16 x i32>* @d to <512 x i1>*), align 64
43   %1 = tail call <512 x i1> @llvm.hexagon.V6.vgtb.and(<512 x i1> %0, <16 x i32> %a, <16 x i32> %b)
44   %2 = bitcast <512 x i1> %1 to <16 x i32>
45   store <16 x i32> %2, <16 x i32>* @d, align 64
46   ret void
49 ; CHECK-LABEL: test5:
50 ; CHECK: q{{[0-9]}} &= vcmp.gt(v{{[0-9]+}}.h,v{{[0-9]+}}.h)
51 define void @test5(<16 x i32> %a, <16 x i32> %b) #0 {
52 entry:
53   %0 = load <512 x i1>, <512 x i1>* bitcast (<16 x i32>* @d to <512 x i1>*), align 64
54   %1 = tail call <512 x i1> @llvm.hexagon.V6.vgth.and(<512 x i1> %0, <16 x i32> %a, <16 x i32> %b)
55   %2 = bitcast <512 x i1> %1 to <16 x i32>
56   store <16 x i32> %2, <16 x i32>* @d, align 64
57   ret void
60 ; CHECK-LABEL: test6:
61 ; CHECK: q{{[0-9]}} &= vcmp.gt(v{{[0-9]+}}.w,v{{[0-9]+}}.w)
62 define void @test6(<16 x i32> %a, <16 x i32> %b) #0 {
63 entry:
64   %0 = load <512 x i1>, <512 x i1>* bitcast (<16 x i32>* @d to <512 x i1>*), align 64
65   %1 = tail call <512 x i1> @llvm.hexagon.V6.vgtw.and(<512 x i1> %0, <16 x i32> %a, <16 x i32> %b)
66   %2 = bitcast <512 x i1> %1 to <16 x i32>
67   store <16 x i32> %2, <16 x i32>* @d, align 64
68   ret void
71 ; CHECK-LABEL: test7:
72 ; CHECK: q{{[0-9]}} &= vcmp.gt(v{{[0-9]+}}.ub,v{{[0-9]+}}.ub)
73 define void @test7(<16 x i32> %a, <16 x i32> %b) #0 {
74 entry:
75   %0 = load <512 x i1>, <512 x i1>* bitcast (<16 x i32>* @d to <512 x i1>*), align 64
76   %1 = tail call <512 x i1> @llvm.hexagon.V6.vgtub.and(<512 x i1> %0, <16 x i32> %a, <16 x i32> %b)
77   %2 = bitcast <512 x i1> %1 to <16 x i32>
78   store <16 x i32> %2, <16 x i32>* @d, align 64
79   ret void
82 ; CHECK-LABEL: test8:
83 ; CHECK: q{{[0-9]}} &= vcmp.gt(v{{[0-9]+}}.uh,v{{[0-9]+}}.uh)
84 define void @test8(<16 x i32> %a, <16 x i32> %b) #0 {
85 entry:
86   %0 = load <512 x i1>, <512 x i1>* bitcast (<16 x i32>* @d to <512 x i1>*), align 64
87   %1 = tail call <512 x i1> @llvm.hexagon.V6.vgtuh.and(<512 x i1> %0, <16 x i32> %a, <16 x i32> %b)
88   %2 = bitcast <512 x i1> %1 to <16 x i32>
89   store <16 x i32> %2, <16 x i32>* @d, align 64
90   ret void
93 ; CHECK-LABEL: test9:
94 ; CHECK: q{{[0-9]}} &= vcmp.gt(v{{[0-9]+}}.uw,v{{[0-9]+}}.uw)
95 define void @test9(<16 x i32> %a, <16 x i32> %b) #0 {
96 entry:
97   %0 = load <512 x i1>, <512 x i1>* bitcast (<16 x i32>* @d to <512 x i1>*), align 64
98   %1 = tail call <512 x i1> @llvm.hexagon.V6.vgtuw.and(<512 x i1> %0, <16 x i32> %a, <16 x i32> %b)
99   %2 = bitcast <512 x i1> %1 to <16 x i32>
100   store <16 x i32> %2, <16 x i32>* @d, align 64
101   ret void
104 ; CHECK-LABEL: test10:
105 ; CHECK: q{{[0-9]}} |= vcmp.eq(v{{[0-9]+}}.b,v{{[0-9]+}}.b)
106 define void @test10(<16 x i32> %a, <16 x i32> %b) #0 {
107 entry:
108   %0 = load <512 x i1>, <512 x i1>* bitcast (<16 x i32>* @d to <512 x i1>*), align 64
109   %1 = tail call <512 x i1> @llvm.hexagon.V6.veqb.or(<512 x i1> %0, <16 x i32> %a, <16 x i32> %b)
110   %2 = bitcast <512 x i1> %1 to <16 x i32>
111   store <16 x i32> %2, <16 x i32>* @d, align 64
112   ret void
115 ; CHECK-LABEL: test11:
116 ; CHECK: q{{[0-9]}} |= vcmp.eq(v{{[0-9]+}}.h,v{{[0-9]+}}.h)
117 define void @test11(<16 x i32> %a, <16 x i32> %b) #0 {
118 entry:
119   %0 = load <512 x i1>, <512 x i1>* bitcast (<16 x i32>* @d to <512 x i1>*), align 64
120   %1 = tail call <512 x i1> @llvm.hexagon.V6.veqh.or(<512 x i1> %0, <16 x i32> %a, <16 x i32> %b)
121   %2 = bitcast <512 x i1> %1 to <16 x i32>
122   store <16 x i32> %2, <16 x i32>* @d, align 64
123   ret void
126 ; CHECK-LABEL: test12:
127 ; CHECK: q{{[0-9]}} |= vcmp.eq(v{{[0-9]+}}.w,v{{[0-9]+}}.w)
128 define void @test12(<16 x i32> %a, <16 x i32> %b) #0 {
129 entry:
130   %0 = load <512 x i1>, <512 x i1>* bitcast (<16 x i32>* @d to <512 x i1>*), align 64
131   %1 = tail call <512 x i1> @llvm.hexagon.V6.veqw.or(<512 x i1> %0, <16 x i32> %a, <16 x i32> %b)
132   %2 = bitcast <512 x i1> %1 to <16 x i32>
133   store <16 x i32> %2, <16 x i32>* @d, align 64
134   ret void
137 ; CHECK-LABEL: test13:
138 ; CHECK: q{{[0-9]}} |= vcmp.gt(v{{[0-9]+}}.b,v{{[0-9]+}}.b)
139 define void @test13(<16 x i32> %a, <16 x i32> %b) #0 {
140 entry:
141   %0 = load <512 x i1>, <512 x i1>* bitcast (<16 x i32>* @d to <512 x i1>*), align 64
142   %1 = tail call <512 x i1> @llvm.hexagon.V6.vgtb.or(<512 x i1> %0, <16 x i32> %a, <16 x i32> %b)
143   %2 = bitcast <512 x i1> %1 to <16 x i32>
144   store <16 x i32> %2, <16 x i32>* @d, align 64
145   ret void
148 ; CHECK-LABEL: test14:
149 ; CHECK: q{{[0-9]}} |= vcmp.gt(v{{[0-9]+}}.h,v{{[0-9]+}}.h)
150 define void @test14(<16 x i32> %a, <16 x i32> %b) #0 {
151 entry:
152   %0 = load <512 x i1>, <512 x i1>* bitcast (<16 x i32>* @d to <512 x i1>*), align 64
153   %1 = tail call <512 x i1> @llvm.hexagon.V6.vgth.or(<512 x i1> %0, <16 x i32> %a, <16 x i32> %b)
154   %2 = bitcast <512 x i1> %1 to <16 x i32>
155   store <16 x i32> %2, <16 x i32>* @d, align 64
156   ret void
159 ; CHECK-LABEL: test15:
160 ; CHECK: q{{[0-9]}} |= vcmp.gt(v{{[0-9]+}}.w,v{{[0-9]+}}.w)
161 define void @test15(<16 x i32> %a, <16 x i32> %b) #0 {
162 entry:
163   %0 = load <512 x i1>, <512 x i1>* bitcast (<16 x i32>* @d to <512 x i1>*), align 64
164   %1 = tail call <512 x i1> @llvm.hexagon.V6.vgtw.or(<512 x i1> %0, <16 x i32> %a, <16 x i32> %b)
165   %2 = bitcast <512 x i1> %1 to <16 x i32>
166   store <16 x i32> %2, <16 x i32>* @d, align 64
167   ret void
170 ; CHECK-LABEL: test16:
171 ; CHECK: q{{[0-9]}} |= vcmp.gt(v{{[0-9]+}}.ub,v{{[0-9]+}}.ub)
172 define void @test16(<16 x i32> %a, <16 x i32> %b) #0 {
173 entry:
174   %0 = load <512 x i1>, <512 x i1>* bitcast (<16 x i32>* @d to <512 x i1>*), align 64
175   %1 = tail call <512 x i1> @llvm.hexagon.V6.vgtub.or(<512 x i1> %0, <16 x i32> %a, <16 x i32> %b)
176   %2 = bitcast <512 x i1> %1 to <16 x i32>
177   store <16 x i32> %2, <16 x i32>* @d, align 64
178   ret void
181 ; CHECK-LABEL: test17:
182 ; CHECK: q{{[0-9]}} |= vcmp.gt(v{{[0-9]+}}.uh,v{{[0-9]+}}.uh)
183 define void @test17(<16 x i32> %a, <16 x i32> %b) #0 {
184 entry:
185   %0 = load <512 x i1>, <512 x i1>* bitcast (<16 x i32>* @d to <512 x i1>*), align 64
186   %1 = tail call <512 x i1> @llvm.hexagon.V6.vgtuh.or(<512 x i1> %0, <16 x i32> %a, <16 x i32> %b)
187   %2 = bitcast <512 x i1> %1 to <16 x i32>
188   store <16 x i32> %2, <16 x i32>* @d, align 64
189   ret void
192 ; CHECK-LABEL: test18:
193 ; CHECK: q{{[0-9]}} |= vcmp.gt(v{{[0-9]+}}.uw,v{{[0-9]+}}.uw)
194 define void @test18(<16 x i32> %a, <16 x i32> %b) #0 {
195 entry:
196   %0 = load <512 x i1>, <512 x i1>* bitcast (<16 x i32>* @d to <512 x i1>*), align 64
197   %1 = tail call <512 x i1> @llvm.hexagon.V6.vgtuw.or(<512 x i1> %0, <16 x i32> %a, <16 x i32> %b)
198   %2 = bitcast <512 x i1> %1 to <16 x i32>
199   store <16 x i32> %2, <16 x i32>* @d, align 64
200   ret void
203 ; CHECK-LABEL: test19:
204 ; CHECK: q{{[0-9]}} ^= vcmp.eq(v{{[0-9]+}}.b,v{{[0-9]+}}.b)
205 define void @test19(<16 x i32> %a, <16 x i32> %b) #0 {
206 entry:
207   %0 = load <512 x i1>, <512 x i1>* bitcast (<16 x i32>* @d to <512 x i1>*), align 64
208   %1 = tail call <512 x i1> @llvm.hexagon.V6.veqb.xor(<512 x i1> %0, <16 x i32> %a, <16 x i32> %b)
209   %2 = bitcast <512 x i1> %1 to <16 x i32>
210   store <16 x i32> %2, <16 x i32>* @d, align 64
211   ret void
214 ; CHECK-LABEL: test20:
215 ; CHECK: q{{[0-9]}} ^= vcmp.eq(v{{[0-9]+}}.h,v{{[0-9]+}}.h)
216 define void @test20(<16 x i32> %a, <16 x i32> %b) #0 {
217 entry:
218   %0 = load <512 x i1>, <512 x i1>* bitcast (<16 x i32>* @d to <512 x i1>*), align 64
219   %1 = tail call <512 x i1> @llvm.hexagon.V6.veqh.xor(<512 x i1> %0, <16 x i32> %a, <16 x i32> %b)
220   %2 = bitcast <512 x i1> %1 to <16 x i32>
221   store <16 x i32> %2, <16 x i32>* @d, align 64
222   ret void
225 ; CHECK-LABEL: test21:
226 ; CHECK: q{{[0-9]}} ^= vcmp.eq(v{{[0-9]+}}.w,v{{[0-9]+}}.w)
227 define void @test21(<16 x i32> %a, <16 x i32> %b) #0 {
228 entry:
229   %0 = load <512 x i1>, <512 x i1>* bitcast (<16 x i32>* @d to <512 x i1>*), align 64
230   %1 = tail call <512 x i1> @llvm.hexagon.V6.veqw.xor(<512 x i1> %0, <16 x i32> %a, <16 x i32> %b)
231   %2 = bitcast <512 x i1> %1 to <16 x i32>
232   store <16 x i32> %2, <16 x i32>* @d, align 64
233   ret void
236 ; CHECK-LABEL: test22:
237 ; CHECK: q{{[0-9]}} ^= vcmp.gt(v{{[0-9]+}}.b,v{{[0-9]+}}.b)
238 define void @test22(<16 x i32> %a, <16 x i32> %b) #0 {
239 entry:
240   %0 = load <512 x i1>, <512 x i1>* bitcast (<16 x i32>* @d to <512 x i1>*), align 64
241   %1 = tail call <512 x i1> @llvm.hexagon.V6.vgtb.xor(<512 x i1> %0, <16 x i32> %a, <16 x i32> %b)
242   %2 = bitcast <512 x i1> %1 to <16 x i32>
243   store <16 x i32> %2, <16 x i32>* @d, align 64
244   ret void
247 ; CHECK-LABEL: test23:
248 ; CHECK: q{{[0-9]}} ^= vcmp.gt(v{{[0-9]+}}.h,v{{[0-9]+}}.h)
249 define void @test23(<16 x i32> %a, <16 x i32> %b) #0 {
250 entry:
251   %0 = load <512 x i1>, <512 x i1>* bitcast (<16 x i32>* @d to <512 x i1>*), align 64
252   %1 = tail call <512 x i1> @llvm.hexagon.V6.vgth.xor(<512 x i1> %0, <16 x i32> %a, <16 x i32> %b)
253   %2 = bitcast <512 x i1> %1 to <16 x i32>
254   store <16 x i32> %2, <16 x i32>* @d, align 64
255   ret void
258 ; CHECK-LABEL: test24:
259 ; CHECK: q{{[0-9]}} ^= vcmp.gt(v{{[0-9]+}}.w,v{{[0-9]+}}.w)
260 define void @test24(<16 x i32> %a, <16 x i32> %b) #0 {
261 entry:
262   %0 = load <512 x i1>, <512 x i1>* bitcast (<16 x i32>* @d to <512 x i1>*), align 64
263   %1 = tail call <512 x i1> @llvm.hexagon.V6.vgtw.xor(<512 x i1> %0, <16 x i32> %a, <16 x i32> %b)
264   %2 = bitcast <512 x i1> %1 to <16 x i32>
265   store <16 x i32> %2, <16 x i32>* @d, align 64
266   ret void
269 ; CHECK-LABEL: test25:
270 ; CHECK: q{{[0-9]}} ^= vcmp.gt(v{{[0-9]+}}.ub,v{{[0-9]+}}.ub)
271 define void @test25(<16 x i32> %a, <16 x i32> %b) #0 {
272 entry:
273   %0 = load <512 x i1>, <512 x i1>* bitcast (<16 x i32>* @d to <512 x i1>*), align 64
274   %1 = tail call <512 x i1> @llvm.hexagon.V6.vgtub.xor(<512 x i1> %0, <16 x i32> %a, <16 x i32> %b)
275   %2 = bitcast <512 x i1> %1 to <16 x i32>
276   store <16 x i32> %2, <16 x i32>* @d, align 64
277   ret void
280 ; CHECK-LABEL: test26:
281 ; CHECK: q{{[0-9]}} ^= vcmp.gt(v{{[0-9]+}}.uh,v{{[0-9]+}}.uh)
282 define void @test26(<16 x i32> %a, <16 x i32> %b) #0 {
283 entry:
284   %0 = load <512 x i1>, <512 x i1>* bitcast (<16 x i32>* @d to <512 x i1>*), align 64
285   %1 = tail call <512 x i1> @llvm.hexagon.V6.vgtuh.xor(<512 x i1> %0, <16 x i32> %a, <16 x i32> %b)
286   %2 = bitcast <512 x i1> %1 to <16 x i32>
287   store <16 x i32> %2, <16 x i32>* @d, align 64
288   ret void
291 ; CHECK-LABEL: test27:
292 ; CHECK: q{{[0-9]}} ^= vcmp.gt(v{{[0-9]+}}.uw,v{{[0-9]+}}.uw)
293 define void @test27(<16 x i32> %a, <16 x i32> %b) #0 {
294 entry:
295   %0 = load <512 x i1>, <512 x i1>* bitcast (<16 x i32>* @d to <512 x i1>*), align 64
296   %1 = tail call <512 x i1> @llvm.hexagon.V6.vgtuw.xor(<512 x i1> %0, <16 x i32> %a, <16 x i32> %b)
297   %2 = bitcast <512 x i1> %1 to <16 x i32>
298   store <16 x i32> %2, <16 x i32>* @d, align 64
299   ret void
302 declare <512 x i1> @llvm.hexagon.V6.veqb.and(<512 x i1>, <16 x i32>, <16 x i32>) #0
303 declare <512 x i1> @llvm.hexagon.V6.veqh.and(<512 x i1>, <16 x i32>, <16 x i32>) #0
304 declare <512 x i1> @llvm.hexagon.V6.veqw.and(<512 x i1>, <16 x i32>, <16 x i32>) #0
305 declare <512 x i1> @llvm.hexagon.V6.vgtb.and(<512 x i1>, <16 x i32>, <16 x i32>) #0
306 declare <512 x i1> @llvm.hexagon.V6.vgth.and(<512 x i1>, <16 x i32>, <16 x i32>) #0
307 declare <512 x i1> @llvm.hexagon.V6.vgtw.and(<512 x i1>, <16 x i32>, <16 x i32>) #0
308 declare <512 x i1> @llvm.hexagon.V6.vgtub.and(<512 x i1>, <16 x i32>, <16 x i32>) #0
309 declare <512 x i1> @llvm.hexagon.V6.vgtuh.and(<512 x i1>, <16 x i32>, <16 x i32>) #0
310 declare <512 x i1> @llvm.hexagon.V6.vgtuw.and(<512 x i1>, <16 x i32>, <16 x i32>) #0
311 declare <512 x i1> @llvm.hexagon.V6.veqb.or(<512 x i1>, <16 x i32>, <16 x i32>) #0
312 declare <512 x i1> @llvm.hexagon.V6.veqh.or(<512 x i1>, <16 x i32>, <16 x i32>) #0
313 declare <512 x i1> @llvm.hexagon.V6.veqw.or(<512 x i1>, <16 x i32>, <16 x i32>) #0
314 declare <512 x i1> @llvm.hexagon.V6.vgtb.or(<512 x i1>, <16 x i32>, <16 x i32>) #0
315 declare <512 x i1> @llvm.hexagon.V6.vgth.or(<512 x i1>, <16 x i32>, <16 x i32>) #0
316 declare <512 x i1> @llvm.hexagon.V6.vgtw.or(<512 x i1>, <16 x i32>, <16 x i32>) #0
317 declare <512 x i1> @llvm.hexagon.V6.vgtub.or(<512 x i1>, <16 x i32>, <16 x i32>) #0
318 declare <512 x i1> @llvm.hexagon.V6.vgtuh.or(<512 x i1>, <16 x i32>, <16 x i32>) #0
319 declare <512 x i1> @llvm.hexagon.V6.vgtuw.or(<512 x i1>, <16 x i32>, <16 x i32>) #0
320 declare <512 x i1> @llvm.hexagon.V6.veqb.xor(<512 x i1>, <16 x i32>, <16 x i32>) #0
321 declare <512 x i1> @llvm.hexagon.V6.veqh.xor(<512 x i1>, <16 x i32>, <16 x i32>) #0
322 declare <512 x i1> @llvm.hexagon.V6.veqw.xor(<512 x i1>, <16 x i32>, <16 x i32>) #0
323 declare <512 x i1> @llvm.hexagon.V6.vgtb.xor(<512 x i1>, <16 x i32>, <16 x i32>) #0
324 declare <512 x i1> @llvm.hexagon.V6.vgth.xor(<512 x i1>, <16 x i32>, <16 x i32>) #0
325 declare <512 x i1> @llvm.hexagon.V6.vgtw.xor(<512 x i1>, <16 x i32>, <16 x i32>) #0
326 declare <512 x i1> @llvm.hexagon.V6.vgtub.xor(<512 x i1>, <16 x i32>, <16 x i32>) #0
327 declare <512 x i1> @llvm.hexagon.V6.vgtuh.xor(<512 x i1>, <16 x i32>, <16 x i32>) #0
328 declare <512 x i1> @llvm.hexagon.V6.vgtuw.xor(<512 x i1>, <16 x i32>, <16 x i32>) #0
330 attributes #0 = { nounwind readnone "target-cpu"="hexagonv60" "target-features"="+hvxv60,+hvx-length64b" }