1 ; RUN: llc -march=hexagon < %s | FileCheck %s
3 @d = external global <16 x i32>
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 {
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
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 {
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
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 {
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
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 {
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
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 {
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
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 {
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
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 {
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
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 {
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
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 {
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
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 {
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
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 {
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
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 {
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
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 {
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
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 {
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
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 {
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
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 {
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
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 {
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
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 {
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
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 {
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
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 {
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
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 {
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
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 {
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
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 {
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
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 {
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
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 {
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
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 {
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
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 {
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
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" }