1 ; RUN: llc -march=hexagon -O0 < %s | FileCheck %s
2 ; RUN: llc -march=hexagon -O0 < %s | FileCheck -check-prefix=CHECK-CALL %s
3 ; Hexagon Programmer's Reference Manual 11.10.8 XTYPE/SHIFT
8 declare i64 @llvm.hexagon.S2.asr.i.p(i64, i32)
9 define i64 @S2_asr_i_p(i64 %a) {
10 %z = call i64 @llvm.hexagon.S2.asr.i.p(i64 %a, i32 0)
13 ; CHECK: = asr({{.*}}, #0)
15 declare i64 @llvm.hexagon.S2.lsr.i.p(i64, i32)
16 define i64 @S2_lsr_i_p(i64 %a) {
17 %z = call i64 @llvm.hexagon.S2.lsr.i.p(i64 %a, i32 0)
20 ; CHECK: = lsr({{.*}}, #0)
22 declare i64 @llvm.hexagon.S2.asl.i.p(i64, i32)
23 define i64 @S2_asl_i_p(i64 %a) {
24 %z = call i64 @llvm.hexagon.S2.asl.i.p(i64 %a, i32 0)
27 ; CHECK: = asl({{.*}}, #0)
29 declare i32 @llvm.hexagon.S2.asr.i.r(i32, i32)
30 define i32 @S2_asr_i_r(i32 %a) {
31 %z = call i32 @llvm.hexagon.S2.asr.i.r(i32 %a, i32 0)
34 ; CHECK: = asr({{.*}}, #0)
36 declare i32 @llvm.hexagon.S2.lsr.i.r(i32, i32)
37 define i32 @S2_lsr_i_r(i32 %a) {
38 %z = call i32 @llvm.hexagon.S2.lsr.i.r(i32 %a, i32 0)
41 ; CHECK: = lsr({{.*}}, #0)
43 declare i32 @llvm.hexagon.S2.asl.i.r(i32, i32)
44 define i32 @S2_asl_i_r(i32 %a) {
45 %z = call i32 @llvm.hexagon.S2.asl.i.r(i32 %a, i32 0)
48 ; CHECK: = asl({{.*}}, #0)
50 ; Shift by immediate and accumulate
51 declare i64 @llvm.hexagon.S2.asr.i.p.nac(i64, i64, i32)
52 define i64 @S2_asr_i_p_nac(i64 %a, i64 %b) {
53 %z = call i64 @llvm.hexagon.S2.asr.i.p.nac(i64 %a, i64 %b, i32 0)
56 ; CHECK: -= asr({{.*}}, #0)
58 declare i64 @llvm.hexagon.S2.lsr.i.p.nac(i64, i64, i32)
59 define i64 @S2_lsr_i_p_nac(i64 %a, i64 %b) {
60 %z = call i64 @llvm.hexagon.S2.lsr.i.p.nac(i64 %a, i64 %b, i32 0)
63 ; CHECK: -= lsr({{.*}}, #0)
65 declare i64 @llvm.hexagon.S2.asl.i.p.nac(i64, i64, i32)
66 define i64 @S2_asl_i_p_nac(i64 %a, i64 %b) {
67 %z = call i64 @llvm.hexagon.S2.asl.i.p.nac(i64 %a, i64 %b, i32 0)
70 ; CHECK: -= asl({{.*}}, #0)
72 declare i64 @llvm.hexagon.S2.asr.i.p.acc(i64, i64, i32)
73 define i64 @S2_asr_i_p_acc(i64 %a, i64 %b) {
74 %z = call i64 @llvm.hexagon.S2.asr.i.p.acc(i64 %a, i64 %b, i32 0)
77 ; CHECK: += asr({{.*}}, #0)
79 declare i64 @llvm.hexagon.S2.lsr.i.p.acc(i64, i64, i32)
80 define i64 @S2_lsr_i_p_acc(i64 %a, i64 %b) {
81 %z = call i64 @llvm.hexagon.S2.lsr.i.p.acc(i64 %a, i64 %b, i32 0)
84 ; CHECK: += lsr({{.*}}, #0)
86 declare i64 @llvm.hexagon.S2.asl.i.p.acc(i64, i64, i32)
87 define i64 @S2_asl_i_p_acc(i64 %a, i64 %b) {
88 %z = call i64 @llvm.hexagon.S2.asl.i.p.acc(i64 %a, i64 %b, i32 0)
91 ; CHECK: += asl({{.*}}, #0)
93 declare i32 @llvm.hexagon.S2.asr.i.r.nac(i32, i32, i32)
94 define i32 @S2_asr_i_r_nac(i32 %a, i32 %b) {
95 %z = call i32 @llvm.hexagon.S2.asr.i.r.nac(i32 %a, i32 %b, i32 0)
98 ; CHECK: -= asr({{.*}}, #0)
100 declare i32 @llvm.hexagon.S2.lsr.i.r.nac(i32, i32, i32)
101 define i32 @S2_lsr_i_r_nac(i32 %a, i32 %b) {
102 %z = call i32 @llvm.hexagon.S2.lsr.i.r.nac(i32 %a, i32 %b, i32 0)
105 ; CHECK: -= lsr({{.*}}, #0)
107 declare i32 @llvm.hexagon.S2.asl.i.r.nac(i32, i32, i32)
108 define i32 @S2_asl_i_r_nac(i32 %a, i32 %b) {
109 %z = call i32 @llvm.hexagon.S2.asl.i.r.nac(i32 %a, i32 %b, i32 0)
112 ; CHECK: -= asl({{.*}}, #0)
114 declare i32 @llvm.hexagon.S2.asr.i.r.acc(i32, i32, i32)
115 define i32 @S2_asr_i_r_acc(i32 %a, i32 %b) {
116 %z = call i32 @llvm.hexagon.S2.asr.i.r.acc(i32 %a, i32 %b, i32 0)
119 ; CHECK: += asr({{.*}}, #0)
121 declare i32 @llvm.hexagon.S2.lsr.i.r.acc(i32, i32, i32)
122 define i32 @S2_lsr_i_r_acc(i32 %a, i32 %b) {
123 %z = call i32 @llvm.hexagon.S2.lsr.i.r.acc(i32 %a, i32 %b, i32 0)
126 ; CHECK: += lsr({{.*}}, #0)
128 declare i32 @llvm.hexagon.S2.asl.i.r.acc(i32, i32, i32)
129 define i32 @S2_asl_i_r_acc(i32 %a, i32 %b) {
130 %z = call i32 @llvm.hexagon.S2.asl.i.r.acc(i32 %a, i32 %b, i32 0)
133 ; CHECK: += asl({{.*}}, #0)
135 ; Shift by immediate and add
136 declare i32 @llvm.hexagon.S4.addi.asl.ri(i32, i32, i32)
137 define i32 @S4_addi_asl_ri(i32 %a) {
138 %z = call i32 @llvm.hexagon.S4.addi.asl.ri(i32 0, i32 %a, i32 0)
141 ; CHECK: = add(#0, asl({{.*}}, #0))
143 declare i32 @llvm.hexagon.S4.subi.asl.ri(i32, i32, i32)
144 define i32 @S4_subi_asl_ri(i32 %a) {
145 %z = call i32 @llvm.hexagon.S4.subi.asl.ri(i32 0, i32 %a, i32 0)
148 ; CHECK: = sub(#0, asl({{.*}}, #0))
150 declare i32 @llvm.hexagon.S4.addi.lsr.ri(i32, i32, i32)
151 define i32 @S4_addi_lsr_ri(i32 %a) {
152 %z = call i32 @llvm.hexagon.S4.addi.lsr.ri(i32 0, i32 %a, i32 0)
155 ; CHECK: = add(#0, lsr({{.*}}, #0))
157 declare i32 @llvm.hexagon.S4.subi.lsr.ri(i32, i32, i32)
158 define i32 @S4_subi_lsr_ri(i32 %a) {
159 %z = call i32 @llvm.hexagon.S4.subi.lsr.ri(i32 0, i32 %a, i32 0)
162 ; CHECK: = sub(#0, lsr({{.*}}, #0))
164 declare i32 @llvm.hexagon.S2.addasl.rrri(i32, i32, i32)
165 define i32 @S2_addasl_rrri(i32 %a, i32 %b) {
166 %z = call i32 @llvm.hexagon.S2.addasl.rrri(i32 %a, i32 %b, i32 0)
169 ; CHECK: = addasl({{.*}}, {{.*}}, #0)
171 ; Shift by immediate and logical
172 declare i64 @llvm.hexagon.S2.asr.i.p.and(i64, i64, i32)
173 define i64 @S2_asr_i_p_and(i64 %a, i64 %b) {
174 %z = call i64 @llvm.hexagon.S2.asr.i.p.and(i64 %a, i64 %b, i32 0)
177 ; CHECK: &= asr({{.*}}, #0)
179 declare i64 @llvm.hexagon.S2.lsr.i.p.and(i64, i64, i32)
180 define i64 @S2_lsr_i_p_and(i64 %a, i64 %b) {
181 %z = call i64 @llvm.hexagon.S2.lsr.i.p.and(i64 %a, i64 %b, i32 0)
184 ; CHECK: {{.*}} &= lsr({{.*}}, #0)
186 declare i64 @llvm.hexagon.S2.asl.i.p.and(i64, i64, i32)
187 define i64 @S2_asl_i_p_and(i64 %a, i64 %b) {
188 %z = call i64 @llvm.hexagon.S2.asl.i.p.and(i64 %a, i64 %b, i32 0)
191 ; CHECK: &= asl({{.*}}, #0)
193 declare i64 @llvm.hexagon.S2.asr.i.p.or(i64, i64, i32)
194 define i64 @S2_asr_i_p_or(i64 %a, i64 %b) {
195 %z = call i64 @llvm.hexagon.S2.asr.i.p.or(i64 %a, i64 %b, i32 0)
198 ; CHECK: |= asr({{.*}}, #0)
200 declare i64 @llvm.hexagon.S2.lsr.i.p.or(i64, i64, i32)
201 define i64 @S2_lsr_i_p_or(i64 %a, i64 %b) {
202 %z = call i64 @llvm.hexagon.S2.lsr.i.p.or(i64 %a, i64 %b, i32 0)
205 ; CHECK: |= lsr({{.*}}, #0)
207 declare i64 @llvm.hexagon.S2.asl.i.p.or(i64, i64, i32)
208 define i64 @S2_asl_i_p_or(i64 %a, i64 %b) {
209 %z = call i64 @llvm.hexagon.S2.asl.i.p.or(i64 %a, i64 %b, i32 0)
212 ; CHECK: |= asl({{.*}}, #0)
214 declare i64 @llvm.hexagon.S2.lsr.i.p.xacc(i64, i64, i32)
215 define i64 @S2_lsr_i_p_xacc(i64 %a, i64 %b) {
216 %z = call i64 @llvm.hexagon.S2.lsr.i.p.xacc(i64 %a, i64 %b, i32 0)
219 ; CHECK: ^= lsr({{.*}}, #0)
221 declare i64 @llvm.hexagon.S2.asl.i.p.xacc(i64, i64, i32)
222 define i64 @S2_asl_i_p_xacc(i64 %a, i64 %b) {
223 %z = call i64 @llvm.hexagon.S2.asl.i.p.xacc(i64 %a, i64 %b, i32 0)
226 ; CHECK: ^= asl({{.*}}, #0)
228 declare i32 @llvm.hexagon.S2.asr.i.r.and(i32, i32, i32)
229 define i32 @S2_asr_i_r_and(i32 %a, i32 %b) {
230 %z = call i32 @llvm.hexagon.S2.asr.i.r.and(i32 %a, i32 %b, i32 0)
233 ; CHECK: &= asr({{.*}}, #0)
235 declare i32 @llvm.hexagon.S2.lsr.i.r.and(i32, i32, i32)
236 define i32 @S2_lsr_i_r_and(i32 %a, i32 %b) {
237 %z = call i32 @llvm.hexagon.S2.lsr.i.r.and(i32 %a, i32 %b, i32 0)
240 ; CHECK: &= lsr({{.*}}, #0)
242 declare i32 @llvm.hexagon.S2.asl.i.r.and(i32, i32, i32)
243 define i32 @S2_asl_i_r_and(i32 %a, i32 %b) {
244 %z = call i32 @llvm.hexagon.S2.asl.i.r.and(i32 %a, i32 %b, i32 0)
247 ; CHECK: &= asl({{.*}}, #0)
249 declare i32 @llvm.hexagon.S2.asr.i.r.or(i32, i32, i32)
250 define i32 @S2_asr_i_r_or(i32 %a, i32 %b) {
251 %z = call i32 @llvm.hexagon.S2.asr.i.r.or(i32 %a, i32 %b, i32 0)
254 ; CHECK: |= asr({{.*}}, #0)
256 declare i32 @llvm.hexagon.S2.lsr.i.r.or(i32, i32, i32)
257 define i32 @S2_lsr_i_r_or(i32 %a, i32 %b) {
258 %z = call i32 @llvm.hexagon.S2.lsr.i.r.or(i32 %a, i32 %b, i32 0)
261 ; CHECK: |= lsr({{.*}}, #0)
263 declare i32 @llvm.hexagon.S2.asl.i.r.or(i32, i32, i32)
264 define i32 @S2_asl_i_r_or(i32%a, i32 %b) {
265 %z = call i32 @llvm.hexagon.S2.asl.i.r.or(i32 %a, i32 %b, i32 0)
268 ; CHECK: |= asl({{.*}}, #0)
270 declare i32 @llvm.hexagon.S2.lsr.i.r.xacc(i32, i32, i32)
271 define i32 @S2_lsr_i_r_xacc(i32 %a, i32 %b) {
272 %z = call i32 @llvm.hexagon.S2.lsr.i.r.xacc(i32%a, i32 %b, i32 0)
275 ; CHECK: ^= lsr({{.*}}, #0)
277 declare i32 @llvm.hexagon.S2.asl.i.r.xacc(i32, i32, i32)
278 define i32 @S2_asl_i_r_xacc(i32 %a, i32 %b) {
279 %z = call i32 @llvm.hexagon.S2.asl.i.r.xacc(i32 %a, i32 %b, i32 0)
282 ; CHECK: ^= asl({{.*}}, #0)
284 declare i32 @llvm.hexagon.S4.andi.asl.ri(i32, i32, i32)
285 define i32 @S4_andi_asl_ri(i32 %a) {
286 %z = call i32 @llvm.hexagon.S4.andi.asl.ri(i32 0, i32 %a, i32 0)
289 ; CHECK: = and(#0, asl({{.*}}, #0))
291 declare i32 @llvm.hexagon.S4.ori.asl.ri(i32, i32, i32)
292 define i32 @S4_ori_asl_ri(i32 %a) {
293 %z = call i32 @llvm.hexagon.S4.ori.asl.ri(i32 0, i32 %a, i32 0)
296 ; CHECK: = or(#0, asl({{.*}}, #0))
298 declare i32 @llvm.hexagon.S4.andi.lsr.ri(i32, i32, i32)
299 define i32 @S4_andi_lsr_ri(i32 %a) {
300 %z = call i32 @llvm.hexagon.S4.andi.lsr.ri(i32 0, i32 %a, i32 0)
303 ; CHECK: = and(#0, lsr({{.*}}, #0))
305 declare i32 @llvm.hexagon.S4.ori.lsr.ri(i32, i32, i32)
306 define i32 @S4_ori_lsr_ri(i32 %a) {
307 %z = call i32 @llvm.hexagon.S4.ori.lsr.ri(i32 0, i32 %a, i32 0)
310 ; CHECK: = or(#0, lsr({{.*}}, #0))
312 ; Shift right by immediate with rounding
313 declare i64 @llvm.hexagon.S2.asr.i.p.rnd(i64, i32)
314 define i64 @S2_asr_i_p_rnd(i64 %a) {
315 %z = call i64 @llvm.hexagon.S2.asr.i.p.rnd(i64 %a, i32 0)
318 ; CHECK: = asr({{.*}}, #0):rnd
320 declare i32 @llvm.hexagon.S2.asr.i.r.rnd(i32, i32)
321 define i32 @S2_asr_i_r_rnd(i32 %a) {
322 %z = call i32 @llvm.hexagon.S2.asr.i.r.rnd(i32 %a, i32 0)
325 ; CHECK: = asr({{.*}}, #0):rnd
327 ; Shift left by immediate with saturation
328 declare i32 @llvm.hexagon.S2.asl.i.r.sat(i32, i32)
329 define i32 @S2_asl_i_r_sat(i32 %a) {
330 %z = call i32 @llvm.hexagon.S2.asl.i.r.sat(i32 %a, i32 0)
333 ; CHECK: = asl({{.*}}, #0):sat
336 declare i64 @llvm.hexagon.S2.asr.r.p(i64, i32)
337 define i64 @S2_asr_r_p(i64 %a, i32 %b) {
338 %z = call i64 @llvm.hexagon.S2.asr.r.p(i64 %a, i32 %b)
341 ; CHECK: = asr({{.*}}, {{.*}})
343 declare i64 @llvm.hexagon.S2.lsr.r.p(i64, i32)
344 define i64 @S2_lsr_r_p(i64 %a, i32 %b) {
345 %z = call i64 @llvm.hexagon.S2.lsr.r.p(i64 %a, i32 %b)
348 ; CHECK: = lsr({{.*}}, {{.*}})
350 declare i64 @llvm.hexagon.S2.asl.r.p(i64, i32)
351 define i64 @S2_asl_r_p(i64 %a, i32 %b) {
352 %z = call i64 @llvm.hexagon.S2.asl.r.p(i64 %a, i32 %b)
355 ; CHECK: = asl({{.*}}, {{.*}})
357 declare i64 @llvm.hexagon.S2.lsl.r.p(i64, i32)
358 define i64 @S2_lsl_r_p(i64 %a, i32 %b) {
359 %z = call i64 @llvm.hexagon.S2.lsl.r.p(i64 %a, i32 %b)
362 ; CHECK: = lsl({{.*}}, {{.*}})
364 declare i32 @llvm.hexagon.S2.asr.r.r(i32, i32)
365 define i32 @S2_asr_r_r(i32 %a, i32 %b) {
366 %z = call i32 @llvm.hexagon.S2.asr.r.r(i32 %a, i32 %b)
369 ; CHECK: = asr({{.*}}, {{.*}})
371 declare i32 @llvm.hexagon.S2.lsr.r.r(i32, i32)
372 define i32 @S2_lsr_r_r(i32 %a, i32 %b) {
373 %z = call i32 @llvm.hexagon.S2.lsr.r.r(i32 %a, i32 %b)
376 ; CHECK: = lsr({{.*}}, {{.*}})
378 declare i32 @llvm.hexagon.S2.asl.r.r(i32, i32)
379 define i32 @S2_asl_r_r(i32 %a, i32 %b) {
380 %z = call i32 @llvm.hexagon.S2.asl.r.r(i32 %a, i32 %b)
383 ; CHECK: = asl({{.*}}, {{.*}})
385 declare i32 @llvm.hexagon.S2.lsl.r.r(i32, i32)
386 define i32 @S2_lsl_r_r(i32 %a, i32 %b) {
387 %z = call i32 @llvm.hexagon.S2.lsl.r.r(i32 %a, i32 %b)
390 ; CHECK: = lsl({{.*}}, {{.*}})
392 declare i32 @llvm.hexagon.S4.lsli(i32, i32)
393 define i32 @S4_lsli(i32 %a) {
394 %z = call i32 @llvm.hexagon.S4.lsli(i32 0, i32 %a)
397 ; CHECK: = lsl(#0, {{.*}})
399 ; Shift by register and accumulate
400 declare i64 @llvm.hexagon.S2.asr.r.p.nac(i64, i64, i32)
401 define i64 @S2_asr_r_p_nac(i64 %a, i64 %b, i32 %c) {
402 %z = call i64 @llvm.hexagon.S2.asr.r.p.nac(i64 %a, i64 %b, i32 %c)
405 ; CHECK: -= asr({{.*}}, r4)
407 declare i64 @llvm.hexagon.S2.lsr.r.p.nac(i64, i64, i32)
408 define i64 @S2_lsr_r_p_nac(i64 %a, i64 %b, i32 %c) {
409 %z = call i64 @llvm.hexagon.S2.lsr.r.p.nac(i64 %a, i64 %b, i32 %c)
412 ; CHECK: -= lsr({{.*}}, r4)
414 declare i64 @llvm.hexagon.S2.asl.r.p.nac(i64, i64, i32)
415 define i64 @S2_asl_r_p_nac(i64 %a, i64 %b, i32 %c) {
416 %z = call i64 @llvm.hexagon.S2.asl.r.p.nac(i64 %a, i64 %b, i32 %c)
419 ; CHECK: -= asl({{.*}}, r4)
421 declare i64 @llvm.hexagon.S2.lsl.r.p.nac(i64, i64, i32)
422 define i64 @S2_lsl_r_p_nac(i64 %a, i64 %b, i32 %c) {
423 %z = call i64 @llvm.hexagon.S2.lsl.r.p.nac(i64 %a, i64 %b, i32 %c)
426 ; CHECK: -= lsl({{.*}}, r4)
428 declare i64 @llvm.hexagon.S2.asr.r.p.acc(i64, i64, i32)
429 define i64 @S2_asr_r_p_acc(i64 %a, i64 %b, i32 %c) {
430 %z = call i64 @llvm.hexagon.S2.asr.r.p.acc(i64 %a, i64 %b, i32 %c)
433 ; CHECK: += asr({{.*}}, r4)
435 declare i64 @llvm.hexagon.S2.lsr.r.p.acc(i64, i64, i32)
436 define i64 @S2_lsr_r_p_acc(i64 %a, i64 %b, i32 %c) {
437 %z = call i64 @llvm.hexagon.S2.lsr.r.p.acc(i64 %a, i64 %b, i32 %c)
440 ; CHECK: += lsr({{.*}}, r4)
442 declare i64 @llvm.hexagon.S2.asl.r.p.acc(i64, i64, i32)
443 define i64 @S2_asl_r_p_acc(i64 %a, i64 %b, i32 %c) {
444 %z = call i64 @llvm.hexagon.S2.asl.r.p.acc(i64 %a, i64 %b, i32 %c)
447 ; CHECK: += asl({{.*}}, r4)
449 declare i64 @llvm.hexagon.S2.lsl.r.p.acc(i64, i64, i32)
450 define i64 @S2_lsl_r_p_acc(i64 %a, i64 %b, i32 %c) {
451 %z = call i64 @llvm.hexagon.S2.lsl.r.p.acc(i64 %a, i64 %b, i32 %c)
454 ; CHECK: += lsl({{.*}}, r4)
456 declare i32 @llvm.hexagon.S2.asr.r.r.nac(i32, i32, i32)
457 define i32 @S2_asr_r_r_nac(i32 %a, i32 %b, i32 %c) {
458 %z = call i32 @llvm.hexagon.S2.asr.r.r.nac(i32 %a, i32 %b, i32 %c)
461 ; CHECK: -= asr({{.*}}, {{.*}})
463 declare i32 @llvm.hexagon.S2.lsr.r.r.nac(i32, i32, i32)
464 define i32 @S2_lsr_r_r_nac(i32 %a, i32 %b, i32 %c) {
465 %z = call i32 @llvm.hexagon.S2.lsr.r.r.nac(i32 %a, i32 %b, i32 %c)
468 ; CHECK: -= lsr({{.*}}, {{.*}})
470 declare i32 @llvm.hexagon.S2.asl.r.r.nac(i32, i32, i32)
471 define i32 @S2_asl_r_r_nac(i32 %a, i32 %b, i32 %c) {
472 %z = call i32 @llvm.hexagon.S2.asl.r.r.nac(i32 %a, i32 %b, i32 %c)
475 ; CHECK: -= asl({{.*}}, {{.*}})
477 declare i32 @llvm.hexagon.S2.lsl.r.r.nac(i32, i32, i32)
478 define i32 @S2_lsl_r_r_nac(i32 %a, i32 %b, i32 %c) {
479 %z = call i32 @llvm.hexagon.S2.lsl.r.r.nac(i32 %a, i32 %b, i32 %c)
482 ; CHECK: -= lsl({{.*}}, {{.*}})
484 declare i32 @llvm.hexagon.S2.asr.r.r.acc(i32, i32, i32)
485 define i32 @S2_asr_r_r_acc(i32 %a, i32 %b, i32 %c) {
486 %z = call i32 @llvm.hexagon.S2.asr.r.r.acc(i32 %a, i32 %b, i32 %c)
489 ; CHECK: += asr({{.*}}, {{.*}})
491 declare i32 @llvm.hexagon.S2.lsr.r.r.acc(i32, i32, i32)
492 define i32 @S2_lsr_r_r_acc(i32 %a, i32 %b, i32 %c) {
493 %z = call i32 @llvm.hexagon.S2.lsr.r.r.acc(i32 %a, i32 %b, i32 %c)
496 ; CHECK: += lsr({{.*}}, {{.*}})
498 declare i32 @llvm.hexagon.S2.asl.r.r.acc(i32, i32, i32)
499 define i32 @S2_asl_r_r_acc(i32 %a, i32 %b, i32 %c) {
500 %z = call i32 @llvm.hexagon.S2.asl.r.r.acc(i32 %a, i32 %b, i32 %c)
503 ; CHECK: += asl({{.*}}, {{.*}})
505 declare i32 @llvm.hexagon.S2.lsl.r.r.acc(i32, i32, i32)
506 define i32 @S2_lsl_r_r_acc(i32 %a, i32 %b, i32 %c) {
507 %z = call i32 @llvm.hexagon.S2.lsl.r.r.acc(i32 %a, i32 %b, i32 %c)
510 ; CHECK: += lsl({{.*}}, {{.*}})
512 ; Shift by register and logical
513 declare i64 @llvm.hexagon.S2.asr.r.p.or(i64, i64, i32)
514 define i64 @S2_asr_r_p_or(i64 %a, i64 %b, i32 %c) {
515 %z = call i64 @llvm.hexagon.S2.asr.r.p.or(i64 %a, i64 %b, i32 %c)
518 ; CHECK: |= asr({{.*}}, r4)
520 declare i64 @llvm.hexagon.S2.lsr.r.p.or(i64, i64, i32)
521 define i64 @S2_lsr_r_p_or(i64 %a, i64 %b, i32 %c) {
522 %z = call i64 @llvm.hexagon.S2.lsr.r.p.or(i64 %a, i64 %b, i32 %c)
525 ; CHECK: |= lsr({{.*}}, r4)
527 declare i64 @llvm.hexagon.S2.asl.r.p.or(i64, i64, i32)
528 define i64 @S2_asl_r_p_or(i64 %a, i64 %b, i32 %c) {
529 %z = call i64 @llvm.hexagon.S2.asl.r.p.or(i64 %a, i64 %b, i32 %c)
532 ; CHECK: |= asl({{.*}}, r4)
534 declare i64 @llvm.hexagon.S2.lsl.r.p.or(i64, i64, i32)
535 define i64 @S2_lsl_r_p_or(i64 %a, i64 %b, i32 %c) {
536 %z = call i64 @llvm.hexagon.S2.lsl.r.p.or(i64 %a, i64 %b, i32 %c)
539 ; CHECK: |= lsl({{.*}}, r4)
541 declare i64 @llvm.hexagon.S2.asr.r.p.and(i64, i64, i32)
542 define i64 @S2_asr_r_p_and(i64 %a, i64 %b, i32 %c) {
543 %z = call i64 @llvm.hexagon.S2.asr.r.p.and(i64 %a, i64 %b, i32 %c)
546 ; CHECK: &= asr({{.*}}, r4)
548 declare i64 @llvm.hexagon.S2.lsr.r.p.and(i64, i64, i32)
549 define i64 @S2_lsr_r_p_and(i64 %a, i64 %b, i32 %c) {
550 %z = call i64 @llvm.hexagon.S2.lsr.r.p.and(i64 %a, i64 %b, i32 %c)
553 ; CHECK: &= lsr({{.*}}, r4)
555 declare i64 @llvm.hexagon.S2.asl.r.p.and(i64, i64, i32)
556 define i64 @S2_asl_r_p_and(i64 %a, i64 %b, i32 %c) {
557 %z = call i64 @llvm.hexagon.S2.asl.r.p.and(i64 %a, i64 %b, i32 %c)
560 ; CHECK: &= asl({{.*}}, r4)
562 declare i64 @llvm.hexagon.S2.lsl.r.p.and(i64, i64, i32)
563 define i64 @S2_lsl_r_p_and(i64 %a, i64 %b, i32 %c) {
564 %z = call i64 @llvm.hexagon.S2.lsl.r.p.and(i64 %a, i64 %b, i32 %c)
567 ; CHECK: &= lsl({{.*}}, r4)
569 declare i32 @llvm.hexagon.S2.asr.r.r.or(i32, i32, i32)
570 define i32 @S2_asr_r_r_or(i32 %a, i32 %b, i32 %c) {
571 %z = call i32 @llvm.hexagon.S2.asr.r.r.or(i32 %a, i32 %b, i32 %c)
574 ; CHECK: |= asr({{.*}}, {{.*}})
576 declare i32 @llvm.hexagon.S2.lsr.r.r.or(i32, i32, i32)
577 define i32 @S2_lsr_r_r_or(i32 %a, i32 %b, i32 %c) {
578 %z = call i32 @llvm.hexagon.S2.lsr.r.r.or(i32 %a, i32 %b, i32 %c)
581 ; CHECK: |= lsr({{.*}}, {{.*}})
583 declare i32 @llvm.hexagon.S2.asl.r.r.or(i32, i32, i32)
584 define i32 @S2_asl_r_r_or(i32%a, i32 %b, i32 %c) {
585 %z = call i32 @llvm.hexagon.S2.asl.r.r.or(i32 %a, i32 %b, i32 %c)
588 ; CHECK: |= asl({{.*}}, {{.*}})
590 declare i32 @llvm.hexagon.S2.lsl.r.r.or(i32, i32, i32)
591 define i32 @S2_lsl_r_r_or(i32%a, i32 %b, i32 %c) {
592 %z = call i32 @llvm.hexagon.S2.lsl.r.r.or(i32 %a, i32 %b, i32 %c)
595 ; CHECK: |= lsl({{.*}}, {{.*}})
597 declare i32 @llvm.hexagon.S2.asr.r.r.and(i32, i32, i32)
598 define i32 @S2_asr_r_r_and(i32 %a, i32 %b, i32 %c) {
599 %z = call i32 @llvm.hexagon.S2.asr.r.r.and(i32 %a, i32 %b, i32 %c)
602 ; CHECK: &= asr({{.*}}, {{.*}})
604 declare i32 @llvm.hexagon.S2.lsr.r.r.and(i32, i32, i32)
605 define i32 @S2_lsr_r_r_and(i32 %a, i32 %b, i32 %c) {
606 %z = call i32 @llvm.hexagon.S2.lsr.r.r.and(i32 %a, i32 %b, i32 %c)
609 ; CHECK: &= lsr({{.*}}, {{.*}})
611 declare i32 @llvm.hexagon.S2.asl.r.r.and(i32, i32, i32)
612 define i32 @S2_asl_r_r_and(i32 %a, i32 %b, i32 %c) {
613 %z = call i32 @llvm.hexagon.S2.asl.r.r.and(i32 %a, i32 %b, i32 %c)
616 ; CHECK: &= asl({{.*}}, {{.*}})
618 declare i32 @llvm.hexagon.S2.lsl.r.r.and(i32, i32, i32)
619 define i32 @S2_lsl_r_r_and(i32 %a, i32 %b, i32 %c) {
620 %z = call i32 @llvm.hexagon.S2.lsl.r.r.and(i32 %a, i32 %b, i32 %c)
623 ; CHECK: &= lsl({{.*}}, {{.*}})
625 ; Shift by register with saturation
626 declare i32 @llvm.hexagon.S2.asr.r.r.sat(i32, i32)
627 define i32 @S2_asr_r_r_sat(i32 %a, i32 %b) {
628 %z = call i32 @llvm.hexagon.S2.asr.r.r.sat(i32 %a, i32 %b)
631 ; CHECK: = asr({{.*}}, {{.*}}):sat
633 declare i32 @llvm.hexagon.S2.asl.r.r.sat(i32, i32)
634 define i32 @S2_asl_r_r_sat(i32 %a, i32 %b) {
635 %z = call i32 @llvm.hexagon.S2.asl.r.r.sat(i32 %a, i32 %b)
638 ; CHECK: = asl({{.*}}, {{.*}}):sat
640 ; Vector shift halfwords by immediate
641 declare i64 @llvm.hexagon.S2.asr.i.vh(i64, i32)
642 define i64 @S2_asr_i_vh(i64 %a) {
643 %z = call i64 @llvm.hexagon.S2.asr.i.vh(i64 %a, i32 0)
646 ; CHECK: = vasrh({{.*}}, #0)
648 declare i64 @llvm.hexagon.S2.lsr.i.vh(i64, i32)
649 define i64 @S2_lsr_i_vh(i64 %a) {
650 %z = call i64 @llvm.hexagon.S2.lsr.i.vh(i64 %a, i32 0)
653 ; CHECK: = vlsrh({{.*}}, #0)
655 declare i64 @llvm.hexagon.S2.asl.i.vh(i64, i32)
656 define i64 @S2_asl_i_vh(i64 %a) {
657 %z = call i64 @llvm.hexagon.S2.asl.i.vh(i64 %a, i32 0)
660 ; CHECK: = vaslh({{.*}}, #0)
662 ; Vector shift halfwords by register
663 declare i64 @llvm.hexagon.S2.asr.r.vh(i64, i32)
664 define i64 @S2_asr_r_vh(i64 %a, i32 %b) {
665 %z = call i64 @llvm.hexagon.S2.asr.r.vh(i64 %a, i32 %b)
668 ; CHECK: = vasrh({{.*}}, {{.*}})
670 declare i64 @llvm.hexagon.S2.lsr.r.vh(i64, i32)
671 define i64 @S2_lsr_r_vh(i64 %a, i32 %b) {
672 %z = call i64 @llvm.hexagon.S2.lsr.r.vh(i64 %a, i32 %b)
675 ; CHECK: = vlsrh({{.*}}, {{.*}})
677 declare i64 @llvm.hexagon.S2.asl.r.vh(i64, i32)
678 define i64 @S2_asl_r_vh(i64 %a, i32 %b) {
679 %z = call i64 @llvm.hexagon.S2.asl.r.vh(i64 %a, i32 %b)
682 ; CHECK: = vaslh({{.*}}, {{.*}})
684 declare i64 @llvm.hexagon.S2.lsl.r.vh(i64, i32)
685 define i64 @S2_lsl_r_vh(i64 %a, i32 %b) {
686 %z = call i64 @llvm.hexagon.S2.lsl.r.vh(i64 %a, i32 %b)
689 ; CHECK: = vlslh({{.*}}, {{.*}})
691 ; Vector shift words by immediate
692 declare i64 @llvm.hexagon.S2.asr.i.vw(i64, i32)
693 define i64 @S2_asr_i_vw(i64 %a) {
694 %z = call i64 @llvm.hexagon.S2.asr.i.vw(i64 %a, i32 0)
697 ; CHECK: = vasrw({{.*}}, #0)
699 declare i64 @llvm.hexagon.S2.lsr.i.vw(i64, i32)
700 define i64 @S2_lsr_i_vw(i64 %a) {
701 %z = call i64 @llvm.hexagon.S2.lsr.i.vw(i64 %a, i32 0)
704 ; CHECK: = vlsrw({{.*}}, #0)
706 declare i64 @llvm.hexagon.S2.asl.i.vw(i64, i32)
707 define i64 @S2_asl_i_vw(i64 %a) {
708 %z = call i64 @llvm.hexagon.S2.asl.i.vw(i64 %a, i32 0)
711 ; CHECK: = vaslw({{.*}}, #0)
713 ; Vector shift words by with truncate and pack
714 declare i32 @llvm.hexagon.S2.asr.i.svw.trun(i64, i32)
715 define i32 @S2_asr_i_svw_trun(i64 %a) {
716 %z = call i32 @llvm.hexagon.S2.asr.i.svw.trun(i64 %a, i32 0)
719 ; CHECK: = vasrw({{.*}}, #0)
721 declare i32 @llvm.hexagon.S2.asr.r.svw.trun(i64, i32)
722 define i32 @S2_asr_r_svw_trun(i64 %a, i32 %b) {
723 %z = call i32 @llvm.hexagon.S2.asr.r.svw.trun(i64 %a, i32 %b)
726 ; CHECK: = vasrw({{.*}}, {{.*}})