[WebAssembly] Switch to MC for instruction printing.
[oota-llvm.git] / test / CodeGen / Hexagon / intrinsics / xtype_shift.ll
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
4
5 ; CHECK-CALL-NOT: call
6
7 ; Shift by immediate
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)
11   ret i64 %z
12 }
13 ; CHECK: = asr({{.*}}, #0)
14
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)
18   ret i64 %z
19 }
20 ; CHECK: = lsr({{.*}}, #0)
21
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)
25   ret i64 %z
26 }
27 ; CHECK: = asl({{.*}}, #0)
28
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)
32   ret i32 %z
33 }
34 ; CHECK: = asr({{.*}}, #0)
35
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)
39   ret i32 %z
40 }
41 ; CHECK: = lsr({{.*}}, #0)
42
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)
46   ret i32 %z
47 }
48 ; CHECK: = asl({{.*}}, #0)
49
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)
54   ret i64 %z
55 }
56 ; CHECK: -= asr({{.*}}, #0)
57
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)
61   ret i64 %z
62 }
63 ; CHECK: -= lsr({{.*}}, #0)
64
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)
68   ret i64 %z
69 }
70 ; CHECK: -= asl({{.*}}, #0)
71
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)
75   ret i64 %z
76 }
77 ; CHECK: += asr({{.*}}, #0)
78
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)
82   ret i64 %z
83 }
84 ; CHECK: += lsr({{.*}}, #0)
85
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)
89   ret i64 %z
90 }
91 ; CHECK: += asl({{.*}}, #0)
92
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)
96   ret i32 %z
97 }
98 ; CHECK: -= asr({{.*}}, #0)
99
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)
103   ret i32 %z
104 }
105 ; CHECK: -= lsr({{.*}}, #0)
106
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)
110   ret i32 %z
111 }
112 ; CHECK: -= asl({{.*}}, #0)
113
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)
117   ret i32 %z
118 }
119 ; CHECK: += asr({{.*}}, #0)
120
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)
124   ret i32 %z
125 }
126 ; CHECK: += lsr({{.*}}, #0)
127
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)
131   ret i32 %z
132 }
133 ; CHECK: += asl({{.*}}, #0)
134
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)
139   ret i32 %z
140 }
141 ; CHECK: = add(#0, asl({{.*}}, #0))
142
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)
146   ret i32 %z
147 }
148 ; CHECK: = sub(#0, asl({{.*}}, #0))
149
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)
153   ret i32 %z
154 }
155 ; CHECK: = add(#0, lsr({{.*}}, #0))
156
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)
160   ret i32 %z
161 }
162 ; CHECK: = sub(#0, lsr({{.*}}, #0))
163
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)
167   ret i32 %z
168 }
169 ; CHECK: = addasl({{.*}}, {{.*}}, #0)
170
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)
175   ret i64 %z
176 }
177 ; CHECK: &= asr({{.*}}, #0)
178
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)
182   ret i64 %z
183 }
184 ; CHECK: {{.*}} &= lsr({{.*}}, #0)
185
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)
189   ret i64 %z
190 }
191 ; CHECK: &= asl({{.*}}, #0)
192
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)
196   ret i64 %z
197 }
198 ; CHECK: |= asr({{.*}}, #0)
199
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)
203   ret i64 %z
204 }
205 ; CHECK: |= lsr({{.*}}, #0)
206
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)
210   ret i64 %z
211 }
212 ; CHECK: |= asl({{.*}}, #0)
213
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)
217   ret i64 %z
218 }
219 ; CHECK: ^= lsr({{.*}}, #0)
220
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)
224   ret i64 %z
225 }
226 ; CHECK: ^= asl({{.*}}, #0)
227
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)
231   ret i32 %z
232 }
233 ; CHECK: &= asr({{.*}}, #0)
234
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)
238   ret i32 %z
239 }
240 ; CHECK: &= lsr({{.*}}, #0)
241
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)
245   ret i32 %z
246 }
247 ; CHECK: &= asl({{.*}}, #0)
248
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)
252   ret i32 %z
253 }
254 ; CHECK: |= asr({{.*}}, #0)
255
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)
259   ret i32 %z
260 }
261 ; CHECK: |= lsr({{.*}}, #0)
262
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)
266   ret i32 %z
267 }
268 ; CHECK: |= asl({{.*}}, #0)
269
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)
273   ret i32 %z
274 }
275 ; CHECK: ^= lsr({{.*}}, #0)
276
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)
280   ret i32 %z
281 }
282 ; CHECK: ^= asl({{.*}}, #0)
283
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)
287   ret i32 %z
288 }
289 ; CHECK: = and(#0, asl({{.*}}, #0))
290
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)
294   ret i32 %z
295 }
296 ; CHECK: = or(#0, asl({{.*}}, #0))
297
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)
301   ret i32 %z
302 }
303 ; CHECK: = and(#0, lsr({{.*}}, #0))
304
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)
308   ret i32 %z
309 }
310 ; CHECK: = or(#0, lsr({{.*}}, #0))
311
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)
316   ret i64 %z
317 }
318 ; CHECK: = asr({{.*}}, #0):rnd
319
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)
323   ret i32 %z
324 }
325 ; CHECK: = asr({{.*}}, #0):rnd
326
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)
331   ret i32 %z
332 }
333 ; CHECK: = asl({{.*}}, #0):sat
334
335 ; Shift by register
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)
339   ret i64 %z
340 }
341 ; CHECK: = asr({{.*}}, {{.*}})
342
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)
346   ret i64 %z
347 }
348 ; CHECK: = lsr({{.*}}, {{.*}})
349
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)
353   ret i64 %z
354 }
355 ; CHECK: = asl({{.*}}, {{.*}})
356
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)
360   ret i64 %z
361 }
362 ; CHECK: = lsl({{.*}}, {{.*}})
363
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)
367   ret i32 %z
368 }
369 ; CHECK: = asr({{.*}}, {{.*}})
370
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)
374   ret i32 %z
375 }
376 ; CHECK: = lsr({{.*}}, {{.*}})
377
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)
381   ret i32 %z
382 }
383 ; CHECK: = asl({{.*}}, {{.*}})
384
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)
388   ret i32 %z
389 }
390 ; CHECK: = lsl({{.*}}, {{.*}})
391
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)
395   ret i32 %z
396 }
397 ; CHECK: = lsl(#0, {{.*}})
398
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)
403   ret i64 %z
404 }
405 ; CHECK: -= asr({{.*}}, r4)
406
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)
410   ret i64 %z
411 }
412 ; CHECK: -= lsr({{.*}}, r4)
413
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)
417   ret i64 %z
418 }
419 ; CHECK: -= asl({{.*}}, r4)
420
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)
424   ret i64 %z
425 }
426 ; CHECK: -= lsl({{.*}}, r4)
427
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)
431   ret i64 %z
432 }
433 ; CHECK: += asr({{.*}}, r4)
434
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)
438   ret i64 %z
439 }
440 ; CHECK: += lsr({{.*}}, r4)
441
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)
445   ret i64 %z
446 }
447 ; CHECK: += asl({{.*}}, r4)
448
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)
452   ret i64 %z
453 }
454 ; CHECK: += lsl({{.*}}, r4)
455
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)
459   ret i32 %z
460 }
461 ; CHECK: -= asr({{.*}}, {{.*}})
462
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)
466   ret i32 %z
467 }
468 ; CHECK: -= lsr({{.*}}, {{.*}})
469
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)
473   ret i32 %z
474 }
475 ; CHECK: -= asl({{.*}}, {{.*}})
476
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)
480   ret i32 %z
481 }
482 ; CHECK: -= lsl({{.*}}, {{.*}})
483
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)
487   ret i32 %z
488 }
489 ; CHECK: += asr({{.*}}, {{.*}})
490
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)
494   ret i32 %z
495 }
496 ; CHECK: += lsr({{.*}}, {{.*}})
497
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)
501   ret i32 %z
502 }
503 ; CHECK: += asl({{.*}}, {{.*}})
504
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)
508   ret i32 %z
509 }
510 ; CHECK: += lsl({{.*}}, {{.*}})
511
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)
516   ret i64 %z
517 }
518 ; CHECK: |= asr({{.*}}, r4)
519
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)
523   ret i64 %z
524 }
525 ; CHECK: |= lsr({{.*}}, r4)
526
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)
530   ret i64 %z
531 }
532 ; CHECK: |= asl({{.*}}, r4)
533
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)
537   ret i64 %z
538 }
539 ; CHECK: |= lsl({{.*}}, r4)
540
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)
544   ret i64 %z
545 }
546 ; CHECK: &= asr({{.*}}, r4)
547
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)
551   ret i64 %z
552 }
553 ; CHECK: &= lsr({{.*}}, r4)
554
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)
558   ret i64 %z
559 }
560 ; CHECK: &= asl({{.*}}, r4)
561
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)
565   ret i64 %z
566 }
567 ; CHECK: &= lsl({{.*}}, r4)
568
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)
572   ret i32 %z
573 }
574 ; CHECK: |= asr({{.*}}, {{.*}})
575
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)
579   ret i32 %z
580 }
581 ; CHECK: |= lsr({{.*}}, {{.*}})
582
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)
586   ret i32 %z
587 }
588 ; CHECK: |= asl({{.*}}, {{.*}})
589
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)
593   ret i32 %z
594 }
595 ; CHECK: |= lsl({{.*}}, {{.*}})
596
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)
600   ret i32 %z
601 }
602 ; CHECK: &= asr({{.*}}, {{.*}})
603
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)
607   ret i32 %z
608 }
609 ; CHECK: &= lsr({{.*}}, {{.*}})
610
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)
614   ret i32 %z
615 }
616 ; CHECK: &= asl({{.*}}, {{.*}})
617
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)
621   ret i32 %z
622 }
623 ; CHECK: &= lsl({{.*}}, {{.*}})
624
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)
629   ret i32 %z
630 }
631 ; CHECK: = asr({{.*}}, {{.*}}):sat
632
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)
636   ret i32 %z
637 }
638 ; CHECK: = asl({{.*}}, {{.*}}):sat
639
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)
644   ret i64 %z
645 }
646 ; CHECK: = vasrh({{.*}}, #0)
647
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)
651   ret i64 %z
652 }
653 ; CHECK: = vlsrh({{.*}}, #0)
654
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)
658   ret i64 %z
659 }
660 ; CHECK: = vaslh({{.*}}, #0)
661
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)
666   ret i64 %z
667 }
668 ; CHECK: = vasrh({{.*}}, {{.*}})
669
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)
673   ret i64 %z
674 }
675 ; CHECK: = vlsrh({{.*}}, {{.*}})
676
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)
680   ret i64 %z
681 }
682 ; CHECK: = vaslh({{.*}}, {{.*}})
683
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)
687   ret i64 %z
688 }
689 ; CHECK: = vlslh({{.*}}, {{.*}})
690
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)
695   ret i64 %z
696 }
697 ; CHECK: = vasrw({{.*}}, #0)
698
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)
702   ret i64 %z
703 }
704 ; CHECK: = vlsrw({{.*}}, #0)
705
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)
709   ret i64 %z
710 }
711 ; CHECK: = vaslw({{.*}}, #0)
712
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)
717   ret i32 %z
718 }
719 ; CHECK: = vasrw({{.*}}, #0)
720
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)
724   ret i32 %z
725 }
726 ; CHECK: = vasrw({{.*}}, {{.*}})