]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - test/CodeGen/Hexagon/intrinsics/xtype_shift.ll
Vendor import of llvm trunk r238337:
[FreeBSD/FreeBSD.git] / test / CodeGen / Hexagon / intrinsics / xtype_shift.ll
1 ; RUN: llc -march=hexagon -O0 < %s | FileCheck %s
2 ; Hexagon Programmer's Reference Manual 11.10.8 XTYPE/SHIFT
3
4 ; Shift by immediate
5 declare i64 @llvm.hexagon.S2.asr.i.p(i64, i32)
6 define i64 @S2_asr_i_p(i64 %a) {
7   %z = call i64 @llvm.hexagon.S2.asr.i.p(i64 %a, i32 0)
8   ret i64 %z
9 }
10 ; CHECK: r1:0 = asr(r1:0, #0)
11
12 declare i64 @llvm.hexagon.S2.lsr.i.p(i64, i32)
13 define i64 @S2_lsr_i_p(i64 %a) {
14   %z = call i64 @llvm.hexagon.S2.lsr.i.p(i64 %a, i32 0)
15   ret i64 %z
16 }
17 ; CHECK: r1:0 = lsr(r1:0, #0)
18
19 declare i64 @llvm.hexagon.S2.asl.i.p(i64, i32)
20 define i64 @S2_asl_i_p(i64 %a) {
21   %z = call i64 @llvm.hexagon.S2.asl.i.p(i64 %a, i32 0)
22   ret i64 %z
23 }
24 ; CHECK: r1:0 = asl(r1:0, #0)
25
26 declare i32 @llvm.hexagon.S2.asr.i.r(i32, i32)
27 define i32 @S2_asr_i_r(i32 %a) {
28   %z = call i32 @llvm.hexagon.S2.asr.i.r(i32 %a, i32 0)
29   ret i32 %z
30 }
31 ; CHECK: r0 = asr(r0, #0)
32
33 declare i32 @llvm.hexagon.S2.lsr.i.r(i32, i32)
34 define i32 @S2_lsr_i_r(i32 %a) {
35   %z = call i32 @llvm.hexagon.S2.lsr.i.r(i32 %a, i32 0)
36   ret i32 %z
37 }
38 ; CHECK: r0 = lsr(r0, #0)
39
40 declare i32 @llvm.hexagon.S2.asl.i.r(i32, i32)
41 define i32 @S2_asl_i_r(i32 %a) {
42   %z = call i32 @llvm.hexagon.S2.asl.i.r(i32 %a, i32 0)
43   ret i32 %z
44 }
45 ; CHECK: r0 = asl(r0, #0)
46
47 ; Shift by immediate and accumulate
48 declare i64 @llvm.hexagon.S2.asr.i.p.nac(i64, i64, i32)
49 define i64 @S2_asr_i_p_nac(i64 %a, i64 %b) {
50   %z = call i64 @llvm.hexagon.S2.asr.i.p.nac(i64 %a, i64 %b, i32 0)
51   ret i64 %z
52 }
53 ; CHECK: r1:0 -= asr(r3:2, #0)
54
55 declare i64 @llvm.hexagon.S2.lsr.i.p.nac(i64, i64, i32)
56 define i64 @S2_lsr_i_p_nac(i64 %a, i64 %b) {
57   %z = call i64 @llvm.hexagon.S2.lsr.i.p.nac(i64 %a, i64 %b, i32 0)
58   ret i64 %z
59 }
60 ; CHECK: r1:0 -= lsr(r3:2, #0)
61
62 declare i64 @llvm.hexagon.S2.asl.i.p.nac(i64, i64, i32)
63 define i64 @S2_asl_i_p_nac(i64 %a, i64 %b) {
64   %z = call i64 @llvm.hexagon.S2.asl.i.p.nac(i64 %a, i64 %b, i32 0)
65   ret i64 %z
66 }
67 ; CHECK: r1:0 -= asl(r3:2, #0)
68
69 declare i64 @llvm.hexagon.S2.asr.i.p.acc(i64, i64, i32)
70 define i64 @S2_asr_i_p_acc(i64 %a, i64 %b) {
71   %z = call i64 @llvm.hexagon.S2.asr.i.p.acc(i64 %a, i64 %b, i32 0)
72   ret i64 %z
73 }
74 ; CHECK: r1:0 += asr(r3:2, #0)
75
76 declare i64 @llvm.hexagon.S2.lsr.i.p.acc(i64, i64, i32)
77 define i64 @S2_lsr_i_p_acc(i64 %a, i64 %b) {
78   %z = call i64 @llvm.hexagon.S2.lsr.i.p.acc(i64 %a, i64 %b, i32 0)
79   ret i64 %z
80 }
81 ; CHECK: r1:0 += lsr(r3:2, #0)
82
83 declare i64 @llvm.hexagon.S2.asl.i.p.acc(i64, i64, i32)
84 define i64 @S2_asl_i_p_acc(i64 %a, i64 %b) {
85   %z = call i64 @llvm.hexagon.S2.asl.i.p.acc(i64 %a, i64 %b, i32 0)
86   ret i64 %z
87 }
88 ; CHECK: r1:0 += asl(r3:2, #0)
89
90 declare i32 @llvm.hexagon.S2.asr.i.r.nac(i32, i32, i32)
91 define i32 @S2_asr_i_r_nac(i32 %a, i32 %b) {
92   %z = call i32 @llvm.hexagon.S2.asr.i.r.nac(i32 %a, i32 %b, i32 0)
93   ret i32 %z
94 }
95 ; CHECK: r0 -= asr(r1, #0)
96
97 declare i32 @llvm.hexagon.S2.lsr.i.r.nac(i32, i32, i32)
98 define i32 @S2_lsr_i_r_nac(i32 %a, i32 %b) {
99   %z = call i32 @llvm.hexagon.S2.lsr.i.r.nac(i32 %a, i32 %b, i32 0)
100   ret i32 %z
101 }
102 ; CHECK: r0 -= lsr(r1, #0)
103
104 declare i32 @llvm.hexagon.S2.asl.i.r.nac(i32, i32, i32)
105 define i32 @S2_asl_i_r_nac(i32 %a, i32 %b) {
106   %z = call i32 @llvm.hexagon.S2.asl.i.r.nac(i32 %a, i32 %b, i32 0)
107   ret i32 %z
108 }
109 ; CHECK: r0 -= asl(r1, #0)
110
111 declare i32 @llvm.hexagon.S2.asr.i.r.acc(i32, i32, i32)
112 define i32 @S2_asr_i_r_acc(i32 %a, i32 %b) {
113   %z = call i32 @llvm.hexagon.S2.asr.i.r.acc(i32 %a, i32 %b, i32 0)
114   ret i32 %z
115 }
116 ; CHECK: r0 += asr(r1, #0)
117
118 declare i32 @llvm.hexagon.S2.lsr.i.r.acc(i32, i32, i32)
119 define i32 @S2_lsr_i_r_acc(i32 %a, i32 %b) {
120   %z = call i32 @llvm.hexagon.S2.lsr.i.r.acc(i32 %a, i32 %b, i32 0)
121   ret i32 %z
122 }
123 ; CHECK: r0 += lsr(r1, #0)
124
125 declare i32 @llvm.hexagon.S2.asl.i.r.acc(i32, i32, i32)
126 define i32 @S2_asl_i_r_acc(i32 %a, i32 %b) {
127   %z = call i32 @llvm.hexagon.S2.asl.i.r.acc(i32 %a, i32 %b, i32 0)
128   ret i32 %z
129 }
130 ; CHECK: r0 += asl(r1, #0)
131
132 ; Shift by immediate and add
133 declare i32 @llvm.hexagon.S4.addi.asl.ri(i32, i32, i32)
134 define i32 @S4_addi_asl_ri(i32 %a) {
135   %z = call i32 @llvm.hexagon.S4.addi.asl.ri(i32 0, i32 %a, i32 0)
136   ret i32 %z
137 }
138 ; CHECK: r0 = add(#0, asl(r0, #0))
139
140 declare i32 @llvm.hexagon.S4.subi.asl.ri(i32, i32, i32)
141 define i32 @S4_subi_asl_ri(i32 %a) {
142   %z = call i32 @llvm.hexagon.S4.subi.asl.ri(i32 0, i32 %a, i32 0)
143   ret i32 %z
144 }
145 ; CHECK: r0 = sub(#0, asl(r0, #0))
146
147 declare i32 @llvm.hexagon.S4.addi.lsr.ri(i32, i32, i32)
148 define i32 @S4_addi_lsr_ri(i32 %a) {
149   %z = call i32 @llvm.hexagon.S4.addi.lsr.ri(i32 0, i32 %a, i32 0)
150   ret i32 %z
151 }
152 ; CHECK: r0 = add(#0, lsr(r0, #0))
153
154 declare i32 @llvm.hexagon.S4.subi.lsr.ri(i32, i32, i32)
155 define i32 @S4_subi_lsr_ri(i32 %a) {
156   %z = call i32 @llvm.hexagon.S4.subi.lsr.ri(i32 0, i32 %a, i32 0)
157   ret i32 %z
158 }
159 ; CHECK: r0 = sub(#0, lsr(r0, #0))
160
161 declare i32 @llvm.hexagon.S2.addasl.rrri(i32, i32, i32)
162 define i32 @S2_addasl_rrri(i32 %a, i32 %b) {
163   %z = call i32 @llvm.hexagon.S2.addasl.rrri(i32 %a, i32 %b, i32 0)
164   ret i32 %z
165 }
166 ; CHECK: r0 = addasl(r0, r1, #0)
167
168 ; Shift by immediate and logical
169 declare i64 @llvm.hexagon.S2.asr.i.p.and(i64, i64, i32)
170 define i64 @S2_asr_i_p_and(i64 %a, i64 %b) {
171   %z = call i64 @llvm.hexagon.S2.asr.i.p.and(i64 %a, i64 %b, i32 0)
172   ret i64 %z
173 }
174 ; CHECK: r1:0 &= asr(r3:2, #0)
175
176 declare i64 @llvm.hexagon.S2.lsr.i.p.and(i64, i64, i32)
177 define i64 @S2_lsr_i_p_and(i64 %a, i64 %b) {
178   %z = call i64 @llvm.hexagon.S2.lsr.i.p.and(i64 %a, i64 %b, i32 0)
179   ret i64 %z
180 }
181 ; CHECK: r1:0 &= lsr(r3:2, #0)
182
183 declare i64 @llvm.hexagon.S2.asl.i.p.and(i64, i64, i32)
184 define i64 @S2_asl_i_p_and(i64 %a, i64 %b) {
185   %z = call i64 @llvm.hexagon.S2.asl.i.p.and(i64 %a, i64 %b, i32 0)
186   ret i64 %z
187 }
188 ; CHECK: r1:0 &= asl(r3:2, #0)
189
190 declare i64 @llvm.hexagon.S2.asr.i.p.or(i64, i64, i32)
191 define i64 @S2_asr_i_p_or(i64 %a, i64 %b) {
192   %z = call i64 @llvm.hexagon.S2.asr.i.p.or(i64 %a, i64 %b, i32 0)
193   ret i64 %z
194 }
195 ; CHECK: r1:0 |= asr(r3:2, #0)
196
197 declare i64 @llvm.hexagon.S2.lsr.i.p.or(i64, i64, i32)
198 define i64 @S2_lsr_i_p_or(i64 %a, i64 %b) {
199   %z = call i64 @llvm.hexagon.S2.lsr.i.p.or(i64 %a, i64 %b, i32 0)
200   ret i64 %z
201 }
202 ; CHECK: r1:0 |= lsr(r3:2, #0)
203
204 declare i64 @llvm.hexagon.S2.asl.i.p.or(i64, i64, i32)
205 define i64 @S2_asl_i_p_or(i64 %a, i64 %b) {
206   %z = call i64 @llvm.hexagon.S2.asl.i.p.or(i64 %a, i64 %b, i32 0)
207   ret i64 %z
208 }
209 ; CHECK: r1:0 |= asl(r3:2, #0)
210
211 declare i64 @llvm.hexagon.S2.lsr.i.p.xacc(i64, i64, i32)
212 define i64 @S2_lsr_i_p_xacc(i64 %a, i64 %b) {
213   %z = call i64 @llvm.hexagon.S2.lsr.i.p.xacc(i64 %a, i64 %b, i32 0)
214   ret i64 %z
215 }
216 ; CHECK: r1:0 ^= lsr(r3:2, #0)
217
218 declare i64 @llvm.hexagon.S2.asl.i.p.xacc(i64, i64, i32)
219 define i64 @S2_asl_i_p_xacc(i64 %a, i64 %b) {
220   %z = call i64 @llvm.hexagon.S2.asl.i.p.xacc(i64 %a, i64 %b, i32 0)
221   ret i64 %z
222 }
223 ; CHECK: r1:0 ^= asl(r3:2, #0)
224
225 declare i32 @llvm.hexagon.S2.asr.i.r.and(i32, i32, i32)
226 define i32 @S2_asr_i_r_and(i32 %a, i32 %b) {
227   %z = call i32 @llvm.hexagon.S2.asr.i.r.and(i32 %a, i32 %b, i32 0)
228   ret i32 %z
229 }
230 ; CHECK: r0 &= asr(r1, #0)
231
232 declare i32 @llvm.hexagon.S2.lsr.i.r.and(i32, i32, i32)
233 define i32 @S2_lsr_i_r_and(i32 %a, i32 %b) {
234   %z = call i32 @llvm.hexagon.S2.lsr.i.r.and(i32 %a, i32 %b, i32 0)
235   ret i32 %z
236 }
237 ; CHECK: r0 &= lsr(r1, #0)
238
239 declare i32 @llvm.hexagon.S2.asl.i.r.and(i32, i32, i32)
240 define i32 @S2_asl_i_r_and(i32 %a, i32 %b) {
241   %z = call i32 @llvm.hexagon.S2.asl.i.r.and(i32 %a, i32 %b, i32 0)
242   ret i32 %z
243 }
244 ; CHECK: r0 &= asl(r1, #0)
245
246 declare i32 @llvm.hexagon.S2.asr.i.r.or(i32, i32, i32)
247 define i32 @S2_asr_i_r_or(i32 %a, i32 %b) {
248   %z = call i32 @llvm.hexagon.S2.asr.i.r.or(i32 %a, i32 %b, i32 0)
249   ret i32 %z
250 }
251 ; CHECK: r0 |= asr(r1, #0)
252
253 declare i32 @llvm.hexagon.S2.lsr.i.r.or(i32, i32, i32)
254 define i32 @S2_lsr_i_r_or(i32 %a, i32 %b) {
255   %z = call i32 @llvm.hexagon.S2.lsr.i.r.or(i32 %a, i32 %b, i32 0)
256   ret i32 %z
257 }
258 ; CHECK: r0 |= lsr(r1, #0)
259
260 declare i32 @llvm.hexagon.S2.asl.i.r.or(i32, i32, i32)
261 define i32 @S2_asl_i_r_or(i32%a, i32 %b) {
262   %z = call i32 @llvm.hexagon.S2.asl.i.r.or(i32 %a, i32 %b, i32 0)
263   ret i32 %z
264 }
265 ; CHECK: r0 |= asl(r1, #0)
266
267 declare i32 @llvm.hexagon.S2.lsr.i.r.xacc(i32, i32, i32)
268 define i32 @S2_lsr_i_r_xacc(i32 %a, i32 %b) {
269   %z = call i32 @llvm.hexagon.S2.lsr.i.r.xacc(i32%a, i32 %b, i32 0)
270   ret i32 %z
271 }
272 ; CHECK: r0 ^= lsr(r1, #0)
273
274 declare i32 @llvm.hexagon.S2.asl.i.r.xacc(i32, i32, i32)
275 define i32 @S2_asl_i_r_xacc(i32 %a, i32 %b) {
276   %z = call i32 @llvm.hexagon.S2.asl.i.r.xacc(i32 %a, i32 %b, i32 0)
277   ret i32 %z
278 }
279 ; CHECK: r0 ^= asl(r1, #0)
280
281 declare i32 @llvm.hexagon.S4.andi.asl.ri(i32, i32, i32)
282 define i32 @S4_andi_asl_ri(i32 %a) {
283   %z = call i32 @llvm.hexagon.S4.andi.asl.ri(i32 0, i32 %a, i32 0)
284   ret i32 %z
285 }
286 ; CHECK: r0 = and(#0, asl(r0, #0))
287
288 declare i32 @llvm.hexagon.S4.ori.asl.ri(i32, i32, i32)
289 define i32 @S4_ori_asl_ri(i32 %a) {
290   %z = call i32 @llvm.hexagon.S4.ori.asl.ri(i32 0, i32 %a, i32 0)
291   ret i32 %z
292 }
293 ; CHECK: r0 = or(#0, asl(r0, #0))
294
295 declare i32 @llvm.hexagon.S4.andi.lsr.ri(i32, i32, i32)
296 define i32 @S4_andi_lsr_ri(i32 %a) {
297   %z = call i32 @llvm.hexagon.S4.andi.lsr.ri(i32 0, i32 %a, i32 0)
298   ret i32 %z
299 }
300 ; CHECK: r0 = and(#0, lsr(r0, #0))
301
302 declare i32 @llvm.hexagon.S4.ori.lsr.ri(i32, i32, i32)
303 define i32 @S4_ori_lsr_ri(i32 %a) {
304   %z = call i32 @llvm.hexagon.S4.ori.lsr.ri(i32 0, i32 %a, i32 0)
305   ret i32 %z
306 }
307 ; CHECK: r0 = or(#0, lsr(r0, #0))
308
309 ; Shift right by immediate with rounding
310 declare i64 @llvm.hexagon.S2.asr.i.p.rnd(i64, i32)
311 define i64 @S2_asr_i_p_rnd(i64 %a) {
312   %z = call i64 @llvm.hexagon.S2.asr.i.p.rnd(i64 %a, i32 0)
313   ret i64 %z
314 }
315 ; CHECK: r1:0 = asr(r1:0, #0):rnd
316
317 declare i32 @llvm.hexagon.S2.asr.i.r.rnd(i32, i32)
318 define i32 @S2_asr_i_r_rnd(i32 %a) {
319   %z = call i32 @llvm.hexagon.S2.asr.i.r.rnd(i32 %a, i32 0)
320   ret i32 %z
321 }
322 ; CHECK: r0 = asr(r0, #0):rnd
323
324 ; Shift left by immediate with saturation
325 declare i32 @llvm.hexagon.S2.asl.i.r.sat(i32, i32)
326 define i32 @S2_asl_i_r_sat(i32 %a) {
327   %z = call i32 @llvm.hexagon.S2.asl.i.r.sat(i32 %a, i32 0)
328   ret i32 %z
329 }
330 ; CHECK: r0 = asl(r0, #0):sat
331
332 ; Shift by register
333 declare i64 @llvm.hexagon.S2.asr.r.p(i64, i32)
334 define i64 @S2_asr_r_p(i64 %a, i32 %b) {
335   %z = call i64 @llvm.hexagon.S2.asr.r.p(i64 %a, i32 %b)
336   ret i64 %z
337 }
338 ; CHECK: r1:0 = asr(r1:0, r2)
339
340 declare i64 @llvm.hexagon.S2.lsr.r.p(i64, i32)
341 define i64 @S2_lsr_r_p(i64 %a, i32 %b) {
342   %z = call i64 @llvm.hexagon.S2.lsr.r.p(i64 %a, i32 %b)
343   ret i64 %z
344 }
345 ; CHECK: r1:0 = lsr(r1:0, r2)
346
347 declare i64 @llvm.hexagon.S2.asl.r.p(i64, i32)
348 define i64 @S2_asl_r_p(i64 %a, i32 %b) {
349   %z = call i64 @llvm.hexagon.S2.asl.r.p(i64 %a, i32 %b)
350   ret i64 %z
351 }
352 ; CHECK: r1:0 = asl(r1:0, r2)
353
354 declare i64 @llvm.hexagon.S2.lsl.r.p(i64, i32)
355 define i64 @S2_lsl_r_p(i64 %a, i32 %b) {
356   %z = call i64 @llvm.hexagon.S2.lsl.r.p(i64 %a, i32 %b)
357   ret i64 %z
358 }
359 ; CHECK: r1:0 = lsl(r1:0, r2)
360
361 declare i32 @llvm.hexagon.S2.asr.r.r(i32, i32)
362 define i32 @S2_asr_r_r(i32 %a, i32 %b) {
363   %z = call i32 @llvm.hexagon.S2.asr.r.r(i32 %a, i32 %b)
364   ret i32 %z
365 }
366 ; CHECK: r0 = asr(r0, r1)
367
368 declare i32 @llvm.hexagon.S2.lsr.r.r(i32, i32)
369 define i32 @S2_lsr_r_r(i32 %a, i32 %b) {
370   %z = call i32 @llvm.hexagon.S2.lsr.r.r(i32 %a, i32 %b)
371   ret i32 %z
372 }
373 ; CHECK: r0 = lsr(r0, r1)
374
375 declare i32 @llvm.hexagon.S2.asl.r.r(i32, i32)
376 define i32 @S2_asl_r_r(i32 %a, i32 %b) {
377   %z = call i32 @llvm.hexagon.S2.asl.r.r(i32 %a, i32 %b)
378   ret i32 %z
379 }
380 ; CHECK: r0 = asl(r0, r1)
381
382 declare i32 @llvm.hexagon.S2.lsl.r.r(i32, i32)
383 define i32 @S2_lsl_r_r(i32 %a, i32 %b) {
384   %z = call i32 @llvm.hexagon.S2.lsl.r.r(i32 %a, i32 %b)
385   ret i32 %z
386 }
387 ; CHECK: r0 = lsl(r0, r1)
388
389 declare i32 @llvm.hexagon.S4.lsli(i32, i32)
390 define i32 @S4_lsli(i32 %a) {
391   %z = call i32 @llvm.hexagon.S4.lsli(i32 0, i32 %a)
392   ret i32 %z
393 }
394 ; CHECK: r0 = lsl(#0, r0)
395
396 ; Shift by register and accumulate
397 declare i64 @llvm.hexagon.S2.asr.r.p.nac(i64, i64, i32)
398 define i64 @S2_asr_r_p_nac(i64 %a, i64 %b, i32 %c) {
399   %z = call i64 @llvm.hexagon.S2.asr.r.p.nac(i64 %a, i64 %b, i32 %c)
400   ret i64 %z
401 }
402 ; CHECK: r1:0 -= asr(r3:2, r4)
403
404 declare i64 @llvm.hexagon.S2.lsr.r.p.nac(i64, i64, i32)
405 define i64 @S2_lsr_r_p_nac(i64 %a, i64 %b, i32 %c) {
406   %z = call i64 @llvm.hexagon.S2.lsr.r.p.nac(i64 %a, i64 %b, i32 %c)
407   ret i64 %z
408 }
409 ; CHECK: r1:0 -= lsr(r3:2, r4)
410
411 declare i64 @llvm.hexagon.S2.asl.r.p.nac(i64, i64, i32)
412 define i64 @S2_asl_r_p_nac(i64 %a, i64 %b, i32 %c) {
413   %z = call i64 @llvm.hexagon.S2.asl.r.p.nac(i64 %a, i64 %b, i32 %c)
414   ret i64 %z
415 }
416 ; CHECK: r1:0 -= asl(r3:2, r4)
417
418 declare i64 @llvm.hexagon.S2.lsl.r.p.nac(i64, i64, i32)
419 define i64 @S2_lsl_r_p_nac(i64 %a, i64 %b, i32 %c) {
420   %z = call i64 @llvm.hexagon.S2.lsl.r.p.nac(i64 %a, i64 %b, i32 %c)
421   ret i64 %z
422 }
423 ; CHECK: r1:0 -= lsl(r3:2, r4)
424
425 declare i64 @llvm.hexagon.S2.asr.r.p.acc(i64, i64, i32)
426 define i64 @S2_asr_r_p_acc(i64 %a, i64 %b, i32 %c) {
427   %z = call i64 @llvm.hexagon.S2.asr.r.p.acc(i64 %a, i64 %b, i32 %c)
428   ret i64 %z
429 }
430 ; CHECK: r1:0 += asr(r3:2, r4)
431
432 declare i64 @llvm.hexagon.S2.lsr.r.p.acc(i64, i64, i32)
433 define i64 @S2_lsr_r_p_acc(i64 %a, i64 %b, i32 %c) {
434   %z = call i64 @llvm.hexagon.S2.lsr.r.p.acc(i64 %a, i64 %b, i32 %c)
435   ret i64 %z
436 }
437 ; CHECK: r1:0 += lsr(r3:2, r4)
438
439 declare i64 @llvm.hexagon.S2.asl.r.p.acc(i64, i64, i32)
440 define i64 @S2_asl_r_p_acc(i64 %a, i64 %b, i32 %c) {
441   %z = call i64 @llvm.hexagon.S2.asl.r.p.acc(i64 %a, i64 %b, i32 %c)
442   ret i64 %z
443 }
444 ; CHECK: r1:0 += asl(r3:2, r4)
445
446 declare i64 @llvm.hexagon.S2.lsl.r.p.acc(i64, i64, i32)
447 define i64 @S2_lsl_r_p_acc(i64 %a, i64 %b, i32 %c) {
448   %z = call i64 @llvm.hexagon.S2.lsl.r.p.acc(i64 %a, i64 %b, i32 %c)
449   ret i64 %z
450 }
451 ; CHECK: r1:0 += lsl(r3:2, r4)
452
453 declare i32 @llvm.hexagon.S2.asr.r.r.nac(i32, i32, i32)
454 define i32 @S2_asr_r_r_nac(i32 %a, i32 %b, i32 %c) {
455   %z = call i32 @llvm.hexagon.S2.asr.r.r.nac(i32 %a, i32 %b, i32 %c)
456   ret i32 %z
457 }
458 ; CHECK: r0 -= asr(r1, r2)
459
460 declare i32 @llvm.hexagon.S2.lsr.r.r.nac(i32, i32, i32)
461 define i32 @S2_lsr_r_r_nac(i32 %a, i32 %b, i32 %c) {
462   %z = call i32 @llvm.hexagon.S2.lsr.r.r.nac(i32 %a, i32 %b, i32 %c)
463   ret i32 %z
464 }
465 ; CHECK: r0 -= lsr(r1, r2)
466
467 declare i32 @llvm.hexagon.S2.asl.r.r.nac(i32, i32, i32)
468 define i32 @S2_asl_r_r_nac(i32 %a, i32 %b, i32 %c) {
469   %z = call i32 @llvm.hexagon.S2.asl.r.r.nac(i32 %a, i32 %b, i32 %c)
470   ret i32 %z
471 }
472 ; CHECK: r0 -= asl(r1, r2)
473
474 declare i32 @llvm.hexagon.S2.lsl.r.r.nac(i32, i32, i32)
475 define i32 @S2_lsl_r_r_nac(i32 %a, i32 %b, i32 %c) {
476   %z = call i32 @llvm.hexagon.S2.lsl.r.r.nac(i32 %a, i32 %b, i32 %c)
477   ret i32 %z
478 }
479 ; CHECK: r0 -= lsl(r1, r2)
480
481 declare i32 @llvm.hexagon.S2.asr.r.r.acc(i32, i32, i32)
482 define i32 @S2_asr_r_r_acc(i32 %a, i32 %b, i32 %c) {
483   %z = call i32 @llvm.hexagon.S2.asr.r.r.acc(i32 %a, i32 %b, i32 %c)
484   ret i32 %z
485 }
486 ; CHECK: r0 += asr(r1, r2)
487
488 declare i32 @llvm.hexagon.S2.lsr.r.r.acc(i32, i32, i32)
489 define i32 @S2_lsr_r_r_acc(i32 %a, i32 %b, i32 %c) {
490   %z = call i32 @llvm.hexagon.S2.lsr.r.r.acc(i32 %a, i32 %b, i32 %c)
491   ret i32 %z
492 }
493 ; CHECK: r0 += lsr(r1, r2)
494
495 declare i32 @llvm.hexagon.S2.asl.r.r.acc(i32, i32, i32)
496 define i32 @S2_asl_r_r_acc(i32 %a, i32 %b, i32 %c) {
497   %z = call i32 @llvm.hexagon.S2.asl.r.r.acc(i32 %a, i32 %b, i32 %c)
498   ret i32 %z
499 }
500 ; CHECK: r0 += asl(r1, r2)
501
502 declare i32 @llvm.hexagon.S2.lsl.r.r.acc(i32, i32, i32)
503 define i32 @S2_lsl_r_r_acc(i32 %a, i32 %b, i32 %c) {
504   %z = call i32 @llvm.hexagon.S2.lsl.r.r.acc(i32 %a, i32 %b, i32 %c)
505   ret i32 %z
506 }
507 ; CHECK: r0 += lsl(r1, r2)
508
509 ; Shift by register and logical
510 declare i64 @llvm.hexagon.S2.asr.r.p.or(i64, i64, i32)
511 define i64 @S2_asr_r_p_or(i64 %a, i64 %b, i32 %c) {
512   %z = call i64 @llvm.hexagon.S2.asr.r.p.or(i64 %a, i64 %b, i32 %c)
513   ret i64 %z
514 }
515 ; CHECK: r1:0 |= asr(r3:2, r4)
516
517 declare i64 @llvm.hexagon.S2.lsr.r.p.or(i64, i64, i32)
518 define i64 @S2_lsr_r_p_or(i64 %a, i64 %b, i32 %c) {
519   %z = call i64 @llvm.hexagon.S2.lsr.r.p.or(i64 %a, i64 %b, i32 %c)
520   ret i64 %z
521 }
522 ; CHECK: r1:0 |= lsr(r3:2, r4)
523
524 declare i64 @llvm.hexagon.S2.asl.r.p.or(i64, i64, i32)
525 define i64 @S2_asl_r_p_or(i64 %a, i64 %b, i32 %c) {
526   %z = call i64 @llvm.hexagon.S2.asl.r.p.or(i64 %a, i64 %b, i32 %c)
527   ret i64 %z
528 }
529 ; CHECK: r1:0 |= asl(r3:2, r4)
530
531 declare i64 @llvm.hexagon.S2.lsl.r.p.or(i64, i64, i32)
532 define i64 @S2_lsl_r_p_or(i64 %a, i64 %b, i32 %c) {
533   %z = call i64 @llvm.hexagon.S2.lsl.r.p.or(i64 %a, i64 %b, i32 %c)
534   ret i64 %z
535 }
536 ; CHECK: r1:0 |= lsl(r3:2, r4)
537
538 declare i64 @llvm.hexagon.S2.asr.r.p.and(i64, i64, i32)
539 define i64 @S2_asr_r_p_and(i64 %a, i64 %b, i32 %c) {
540   %z = call i64 @llvm.hexagon.S2.asr.r.p.and(i64 %a, i64 %b, i32 %c)
541   ret i64 %z
542 }
543 ; CHECK: r1:0 &= asr(r3:2, r4)
544
545 declare i64 @llvm.hexagon.S2.lsr.r.p.and(i64, i64, i32)
546 define i64 @S2_lsr_r_p_and(i64 %a, i64 %b, i32 %c) {
547   %z = call i64 @llvm.hexagon.S2.lsr.r.p.and(i64 %a, i64 %b, i32 %c)
548   ret i64 %z
549 }
550 ; CHECK: r1:0 &= lsr(r3:2, r4)
551
552 declare i64 @llvm.hexagon.S2.asl.r.p.and(i64, i64, i32)
553 define i64 @S2_asl_r_p_and(i64 %a, i64 %b, i32 %c) {
554   %z = call i64 @llvm.hexagon.S2.asl.r.p.and(i64 %a, i64 %b, i32 %c)
555   ret i64 %z
556 }
557 ; CHECK: r1:0 &= asl(r3:2, r4)
558
559 declare i64 @llvm.hexagon.S2.lsl.r.p.and(i64, i64, i32)
560 define i64 @S2_lsl_r_p_and(i64 %a, i64 %b, i32 %c) {
561   %z = call i64 @llvm.hexagon.S2.lsl.r.p.and(i64 %a, i64 %b, i32 %c)
562   ret i64 %z
563 }
564 ; CHECK: r1:0 &= lsl(r3:2, r4)
565
566 declare i32 @llvm.hexagon.S2.asr.r.r.or(i32, i32, i32)
567 define i32 @S2_asr_r_r_or(i32 %a, i32 %b, i32 %c) {
568   %z = call i32 @llvm.hexagon.S2.asr.r.r.or(i32 %a, i32 %b, i32 %c)
569   ret i32 %z
570 }
571 ; CHECK: r0 |= asr(r1, r2)
572
573 declare i32 @llvm.hexagon.S2.lsr.r.r.or(i32, i32, i32)
574 define i32 @S2_lsr_r_r_or(i32 %a, i32 %b, i32 %c) {
575   %z = call i32 @llvm.hexagon.S2.lsr.r.r.or(i32 %a, i32 %b, i32 %c)
576   ret i32 %z
577 }
578 ; CHECK: r0 |= lsr(r1, r2)
579
580 declare i32 @llvm.hexagon.S2.asl.r.r.or(i32, i32, i32)
581 define i32 @S2_asl_r_r_or(i32%a, i32 %b, i32 %c) {
582   %z = call i32 @llvm.hexagon.S2.asl.r.r.or(i32 %a, i32 %b, i32 %c)
583   ret i32 %z
584 }
585 ; CHECK: r0 |= asl(r1, r2)
586
587 declare i32 @llvm.hexagon.S2.lsl.r.r.or(i32, i32, i32)
588 define i32 @S2_lsl_r_r_or(i32%a, i32 %b, i32 %c) {
589   %z = call i32 @llvm.hexagon.S2.lsl.r.r.or(i32 %a, i32 %b, i32 %c)
590   ret i32 %z
591 }
592 ; CHECK: r0 |= lsl(r1, r2)
593
594 declare i32 @llvm.hexagon.S2.asr.r.r.and(i32, i32, i32)
595 define i32 @S2_asr_r_r_and(i32 %a, i32 %b, i32 %c) {
596   %z = call i32 @llvm.hexagon.S2.asr.r.r.and(i32 %a, i32 %b, i32 %c)
597   ret i32 %z
598 }
599 ; CHECK: r0 &= asr(r1, r2)
600
601 declare i32 @llvm.hexagon.S2.lsr.r.r.and(i32, i32, i32)
602 define i32 @S2_lsr_r_r_and(i32 %a, i32 %b, i32 %c) {
603   %z = call i32 @llvm.hexagon.S2.lsr.r.r.and(i32 %a, i32 %b, i32 %c)
604   ret i32 %z
605 }
606 ; CHECK: r0 &= lsr(r1, r2)
607
608 declare i32 @llvm.hexagon.S2.asl.r.r.and(i32, i32, i32)
609 define i32 @S2_asl_r_r_and(i32 %a, i32 %b, i32 %c) {
610   %z = call i32 @llvm.hexagon.S2.asl.r.r.and(i32 %a, i32 %b, i32 %c)
611   ret i32 %z
612 }
613 ; CHECK: r0 &= asl(r1, r2)
614
615 declare i32 @llvm.hexagon.S2.lsl.r.r.and(i32, i32, i32)
616 define i32 @S2_lsl_r_r_and(i32 %a, i32 %b, i32 %c) {
617   %z = call i32 @llvm.hexagon.S2.lsl.r.r.and(i32 %a, i32 %b, i32 %c)
618   ret i32 %z
619 }
620 ; CHECK: r0 &= lsl(r1, r2)
621
622 ; Shift by register with saturation
623 declare i32 @llvm.hexagon.S2.asr.r.r.sat(i32, i32)
624 define i32 @S2_asr_r_r_sat(i32 %a, i32 %b) {
625   %z = call i32 @llvm.hexagon.S2.asr.r.r.sat(i32 %a, i32 %b)
626   ret i32 %z
627 }
628 ; CHECK: r0 = asr(r0, r1):sat
629
630 declare i32 @llvm.hexagon.S2.asl.r.r.sat(i32, i32)
631 define i32 @S2_asl_r_r_sat(i32 %a, i32 %b) {
632   %z = call i32 @llvm.hexagon.S2.asl.r.r.sat(i32 %a, i32 %b)
633   ret i32 %z
634 }
635 ; CHECK: r0 = asl(r0, r1):sat
636
637 ; Vector shift halfwords by immediate
638 declare i64 @llvm.hexagon.S2.asr.i.vh(i64, i32)
639 define i64 @S2_asr_i_vh(i64 %a) {
640   %z = call i64 @llvm.hexagon.S2.asr.i.vh(i64 %a, i32 0)
641   ret i64 %z
642 }
643 ; CHECK: r1:0 = vasrh(r1:0, #0)
644
645 declare i64 @llvm.hexagon.S2.lsr.i.vh(i64, i32)
646 define i64 @S2_lsr_i_vh(i64 %a) {
647   %z = call i64 @llvm.hexagon.S2.lsr.i.vh(i64 %a, i32 0)
648   ret i64 %z
649 }
650 ; CHECK: r1:0 = vlsrh(r1:0, #0)
651
652 declare i64 @llvm.hexagon.S2.asl.i.vh(i64, i32)
653 define i64 @S2_asl_i_vh(i64 %a) {
654   %z = call i64 @llvm.hexagon.S2.asl.i.vh(i64 %a, i32 0)
655   ret i64 %z
656 }
657 ; CHECK: r1:0 = vaslh(r1:0, #0)
658
659 ; Vector shift halfwords by register
660 declare i64 @llvm.hexagon.S2.asr.r.vh(i64, i32)
661 define i64 @S2_asr_r_vh(i64 %a, i32 %b) {
662   %z = call i64 @llvm.hexagon.S2.asr.r.vh(i64 %a, i32 %b)
663   ret i64 %z
664 }
665 ; CHECK: r1:0 = vasrh(r1:0, r2)
666
667 declare i64 @llvm.hexagon.S2.lsr.r.vh(i64, i32)
668 define i64 @S2_lsr_r_vh(i64 %a, i32 %b) {
669   %z = call i64 @llvm.hexagon.S2.lsr.r.vh(i64 %a, i32 %b)
670   ret i64 %z
671 }
672 ; CHECK: r1:0 = vlsrh(r1:0, r2)
673
674 declare i64 @llvm.hexagon.S2.asl.r.vh(i64, i32)
675 define i64 @S2_asl_r_vh(i64 %a, i32 %b) {
676   %z = call i64 @llvm.hexagon.S2.asl.r.vh(i64 %a, i32 %b)
677   ret i64 %z
678 }
679 ; CHECK: r1:0 = vaslh(r1:0, r2)
680
681 declare i64 @llvm.hexagon.S2.lsl.r.vh(i64, i32)
682 define i64 @S2_lsl_r_vh(i64 %a, i32 %b) {
683   %z = call i64 @llvm.hexagon.S2.lsl.r.vh(i64 %a, i32 %b)
684   ret i64 %z
685 }
686 ; CHECK: r1:0 = vlslh(r1:0, r2)
687
688 ; Vector shift words by immediate
689 declare i64 @llvm.hexagon.S2.asr.i.vw(i64, i32)
690 define i64 @S2_asr_i_vw(i64 %a) {
691   %z = call i64 @llvm.hexagon.S2.asr.i.vw(i64 %a, i32 0)
692   ret i64 %z
693 }
694 ; CHECK: r1:0 = vasrw(r1:0, #0)
695
696 declare i64 @llvm.hexagon.S2.lsr.i.vw(i64, i32)
697 define i64 @S2_lsr_i_vw(i64 %a) {
698   %z = call i64 @llvm.hexagon.S2.lsr.i.vw(i64 %a, i32 0)
699   ret i64 %z
700 }
701 ; CHECK: r1:0 = vlsrw(r1:0, #0)
702
703 declare i64 @llvm.hexagon.S2.asl.i.vw(i64, i32)
704 define i64 @S2_asl_i_vw(i64 %a) {
705   %z = call i64 @llvm.hexagon.S2.asl.i.vw(i64 %a, i32 0)
706   ret i64 %z
707 }
708 ; CHECK: r1:0 = vaslw(r1:0, #0)
709
710 ; Vector shift words by with truncate and pack
711 declare i32 @llvm.hexagon.S2.asr.i.svw.trun(i64, i32)
712 define i32 @S2_asr_i_svw_trun(i64 %a) {
713   %z = call i32 @llvm.hexagon.S2.asr.i.svw.trun(i64 %a, i32 0)
714   ret i32 %z
715 }
716 ; CHECK: r0 = vasrw(r1:0, #0)
717
718 declare i32 @llvm.hexagon.S2.asr.r.svw.trun(i64, i32)
719 define i32 @S2_asr_r_svw_trun(i64 %a, i32 %b) {
720   %z = call i32 @llvm.hexagon.S2.asr.r.svw.trun(i64 %a, i32 %b)
721   ret i32 %z
722 }
723 ; CHECK: r0 = vasrw(r1:0, r2)