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.2 XTYPE/BIT
8 declare i32 @llvm.hexagon.S2.clbp(i64)
9 define i32 @S2_clbp(i64 %a) {
10 %z = call i32 @llvm.hexagon.S2.clbp(i64 %a)
13 ; CHECK: = clb({{.*}})
15 declare i32 @llvm.hexagon.S2.cl0p(i64)
16 define i32 @S2_cl0p(i64 %a) {
17 %z = call i32 @llvm.hexagon.S2.cl0p(i64 %a)
20 ; CHECK: = cl0({{.*}})
22 declare i32 @llvm.hexagon.S2.cl1p(i64)
23 define i32 @S2_cl1p(i64 %a) {
24 %z = call i32 @llvm.hexagon.S2.cl1p(i64 %a)
27 ; CHECK: = cl1({{.*}})
29 declare i32 @llvm.hexagon.S4.clbpnorm(i64)
30 define i32 @S4_clbpnorm(i64 %a) {
31 %z = call i32 @llvm.hexagon.S4.clbpnorm(i64 %a)
34 ; CHECK: = normamt({{.*}})
36 declare i32 @llvm.hexagon.S4.clbpaddi(i64, i32)
37 define i32 @S4_clbpaddi(i64 %a) {
38 %z = call i32 @llvm.hexagon.S4.clbpaddi(i64 %a, i32 0)
41 ; CHECK: = add(clb({{.*}}), #0)
43 declare i32 @llvm.hexagon.S4.clbaddi(i32, i32)
44 define i32 @S4_clbaddi(i32 %a) {
45 %z = call i32 @llvm.hexagon.S4.clbaddi(i32 %a, i32 0)
48 ; CHECK: = add(clb({{.*}}), #0)
50 declare i32 @llvm.hexagon.S2.cl0(i32)
51 define i32 @S2_cl0(i32 %a) {
52 %z = call i32 @llvm.hexagon.S2.cl0(i32 %a)
55 ; CHECK: = cl0({{.*}})
57 declare i32 @llvm.hexagon.S2.cl1(i32)
58 define i32 @S2_cl1(i32 %a) {
59 %z = call i32 @llvm.hexagon.S2.cl1(i32 %a)
62 ; CHECK: = cl1({{.*}})
64 declare i32 @llvm.hexagon.S2.clbnorm(i32)
65 define i32 @S4_clbnorm(i32 %a) {
66 %z = call i32 @llvm.hexagon.S2.clbnorm(i32 %a)
69 ; CHECK: = normamt({{.*}})
72 declare i32 @llvm.hexagon.S5.popcountp(i64)
73 define i32 @S5_popcountp(i64 %a) {
74 %z = call i32 @llvm.hexagon.S5.popcountp(i64 %a)
77 ; CHECK: = popcount({{.*}})
80 declare i32 @llvm.hexagon.S2.ct0p(i64)
81 define i32 @S2_ct0p(i64 %a) {
82 %z = call i32 @llvm.hexagon.S2.ct0p(i64 %a)
85 ; CHECK: = ct0({{.*}})
87 declare i32 @llvm.hexagon.S2.ct1p(i64)
88 define i32 @S2_ct1p(i64 %a) {
89 %z = call i32 @llvm.hexagon.S2.ct1p(i64 %a)
92 ; CHECK: = ct1({{.*}})
94 declare i32 @llvm.hexagon.S2.ct0(i32)
95 define i32 @S2_ct0(i32 %a) {
96 %z = call i32 @llvm.hexagon.S2.ct0(i32 %a)
99 ; CHECK: = ct0({{.*}})
101 declare i32 @llvm.hexagon.S2.ct1(i32)
102 define i32 @S2_ct1(i32 %a) {
103 %z = call i32 @llvm.hexagon.S2.ct1(i32 %a)
106 ; CHECK: = ct1({{.*}})
109 declare i64 @llvm.hexagon.S2.extractup(i64, i32, i32)
110 define i64 @S2_extractup(i64 %a) {
111 %z = call i64 @llvm.hexagon.S2.extractup(i64 %a, i32 0, i32 0)
114 ; CHECK: = extractu({{.*}}, #0, #0)
116 declare i64 @llvm.hexagon.S4.extractp(i64, i32, i32)
117 define i64 @S2_extractp(i64 %a) {
118 %z = call i64 @llvm.hexagon.S4.extractp(i64 %a, i32 0, i32 0)
121 ; CHECK: = extract({{.*}}, #0, #0)
123 declare i32 @llvm.hexagon.S2.extractu(i32, i32, i32)
124 define i32 @S2_extractu(i32 %a) {
125 %z = call i32 @llvm.hexagon.S2.extractu(i32 %a, i32 0, i32 0)
128 ; CHECK: = extractu({{.*}}, #0, #0)
130 declare i32 @llvm.hexagon.S4.extract(i32, i32, i32)
131 define i32 @S2_extract(i32 %a) {
132 %z = call i32 @llvm.hexagon.S4.extract(i32 %a, i32 0, i32 0)
135 ; CHECK: = extract({{.*}}, #0, #0)
137 declare i64 @llvm.hexagon.S2.extractup.rp(i64, i64)
138 define i64 @S2_extractup_rp(i64 %a, i64 %b) {
139 %z = call i64 @llvm.hexagon.S2.extractup.rp(i64 %a, i64 %b)
142 ; CHECK: = extractu({{.*}}, {{.*}})
144 declare i64 @llvm.hexagon.S4.extractp.rp(i64, i64)
145 define i64 @S4_extractp_rp(i64 %a, i64 %b) {
146 %z = call i64 @llvm.hexagon.S4.extractp.rp(i64 %a, i64 %b)
149 ; CHECK: = extract({{.*}}, {{.*}})
151 declare i32 @llvm.hexagon.S2.extractu.rp(i32, i64)
152 define i32 @S2_extractu_rp(i32 %a, i64 %b) {
153 %z = call i32 @llvm.hexagon.S2.extractu.rp(i32 %a, i64 %b)
156 ; CHECK: = extractu({{.*}}, {{.*}})
158 declare i32 @llvm.hexagon.S4.extract.rp(i32, i64)
159 define i32 @S4_extract_rp(i32 %a, i64 %b) {
160 %z = call i32 @llvm.hexagon.S4.extract.rp(i32 %a, i64 %b)
163 ; CHECK: = extract({{.*}}, {{.*}})
166 declare i64 @llvm.hexagon.S2.insertp(i64, i64, i32, i32)
167 define i64 @S2_insertp(i64 %a, i64 %b) {
168 %z = call i64 @llvm.hexagon.S2.insertp(i64 %a, i64 %b, i32 0, i32 0)
171 ; CHECK: = insert({{.*}}, #0, #0)
173 declare i32 @llvm.hexagon.S2.insert(i32, i32, i32, i32)
174 define i32 @S2_insert(i32 %a, i32 %b) {
175 %z = call i32 @llvm.hexagon.S2.insert(i32 %a, i32 %b, i32 0, i32 0)
178 ; CHECK: = insert({{.*}}, #0, #0)
180 declare i32 @llvm.hexagon.S2.insert.rp(i32, i32, i64)
181 define i32 @S2_insert_rp(i32 %a, i32 %b, i64 %c) {
182 %z = call i32 @llvm.hexagon.S2.insert.rp(i32 %a, i32 %b, i64 %c)
185 ; CHECK: = insert({{.*}}, {{.*}})
187 declare i64 @llvm.hexagon.S2.insertp.rp(i64, i64, i64)
188 define i64 @S2_insertp_rp(i64 %a, i64 %b, i64 %c) {
189 %z = call i64 @llvm.hexagon.S2.insertp.rp(i64 %a, i64 %b, i64 %c)
192 ; CHECK: = insert({{.*}}, r5:4)
194 ; Interleave/deinterleave
195 declare i64 @llvm.hexagon.S2.deinterleave(i64)
196 define i64 @S2_deinterleave(i64 %a) {
197 %z = call i64 @llvm.hexagon.S2.deinterleave(i64 %a)
200 ; CHECK: = deinterleave({{.*}})
202 declare i64 @llvm.hexagon.S2.interleave(i64)
203 define i64 @S2_interleave(i64 %a) {
204 %z = call i64 @llvm.hexagon.S2.interleave(i64 %a)
207 ; CHECK: = interleave({{.*}})
209 ; Linear feedback-shift operation
210 declare i64 @llvm.hexagon.S2.lfsp(i64, i64)
211 define i64 @S2_lfsp(i64 %a, i64 %b) {
212 %z = call i64 @llvm.hexagon.S2.lfsp(i64 %a, i64 %b)
215 ; CHECK: = lfs({{.*}}, {{.*}})
218 declare i32 @llvm.hexagon.S2.parityp(i64, i64)
219 define i32 @S2_parityp(i64 %a, i64 %b) {
220 %z = call i32 @llvm.hexagon.S2.parityp(i64 %a, i64 %b)
223 ; CHECK: = parity({{.*}}, {{.*}})
225 declare i32 @llvm.hexagon.S4.parity(i32, i32)
226 define i32 @S4_parity(i32 %a, i32 %b) {
227 %z = call i32 @llvm.hexagon.S4.parity(i32 %a, i32 %b)
230 ; CHECK: = parity({{.*}}, {{.*}})
233 declare i64 @llvm.hexagon.S2.brevp(i64)
234 define i64 @S2_brevp(i64 %a) {
235 %z = call i64 @llvm.hexagon.S2.brevp(i64 %a)
238 ; CHECK: = brev({{.*}})
240 declare i32 @llvm.hexagon.S2.brev(i32)
241 define i32 @S2_brev(i32 %a) {
242 %z = call i32 @llvm.hexagon.S2.brev(i32 %a)
245 ; CHECK: = brev({{.*}})
247 ; Set/clear/toggle bit
248 declare i32 @llvm.hexagon.S2.setbit.i(i32, i32)
249 define i32 @S2_setbit_i(i32 %a) {
250 %z = call i32 @llvm.hexagon.S2.setbit.i(i32 %a, i32 0)
253 ; CHECK: = setbit({{.*}}, #0)
255 declare i32 @llvm.hexagon.S2.clrbit.i(i32, i32)
256 define i32 @S2_clrbit_i(i32 %a) {
257 %z = call i32 @llvm.hexagon.S2.clrbit.i(i32 %a, i32 0)
260 ; CHECK: = clrbit({{.*}}, #0)
262 declare i32 @llvm.hexagon.S2.togglebit.i(i32, i32)
263 define i32 @S2_togglebit_i(i32 %a) {
264 %z = call i32 @llvm.hexagon.S2.togglebit.i(i32 %a, i32 0)
267 ; CHECK: = togglebit({{.*}}, #0)
269 declare i32 @llvm.hexagon.S2.setbit.r(i32, i32)
270 define i32 @S2_setbit_r(i32 %a, i32 %b) {
271 %z = call i32 @llvm.hexagon.S2.setbit.r(i32 %a, i32 %b)
274 ; CHECK: = setbit({{.*}}, {{.*}})
276 declare i32 @llvm.hexagon.S2.clrbit.r(i32, i32)
277 define i32 @S2_clrbit_r(i32 %a, i32 %b) {
278 %z = call i32 @llvm.hexagon.S2.clrbit.r(i32 %a, i32 %b)
281 ; CHECK: = clrbit({{.*}}, {{.*}})
283 declare i32 @llvm.hexagon.S2.togglebit.r(i32, i32)
284 define i32 @S2_togglebit_r(i32 %a, i32 %b) {
285 %z = call i32 @llvm.hexagon.S2.togglebit.r(i32 %a, i32 %b)
288 ; CHECK: = togglebit({{.*}}, {{.*}})
291 declare i64 @llvm.hexagon.A4.bitspliti(i32, i32)
292 define i64 @A4_bitspliti(i32 %a) {
293 %z = call i64 @llvm.hexagon.A4.bitspliti(i32 %a, i32 0)
296 ; CHECK: = bitsplit({{.*}}, #0)
298 declare i64 @llvm.hexagon.A4.bitsplit(i32, i32)
299 define i64 @A4_bitsplit(i32 %a, i32 %b) {
300 %z = call i64 @llvm.hexagon.A4.bitsplit(i32 %a, i32 %b)
303 ; CHECK: = bitsplit({{.*}}, {{.*}})
306 declare i32 @llvm.hexagon.S2.tableidxb.goodsyntax(i32, i32, i32, i32)
307 define i32 @S2_tableidxb_goodsyntax(i32 %a, i32 %b) {
308 %z = call i32 @llvm.hexagon.S2.tableidxb.goodsyntax(i32 %a, i32 %b, i32 0, i32 0)
311 ; CHECK: = tableidxb({{.*}}, #0, #0)
313 declare i32 @llvm.hexagon.S2.tableidxh.goodsyntax(i32, i32, i32, i32)
314 define i32 @S2_tableidxh_goodsyntax(i32 %a, i32 %b) {
315 %z = call i32 @llvm.hexagon.S2.tableidxh.goodsyntax(i32 %a, i32 %b, i32 0, i32 0)
318 ; CHECK: = tableidxh({{.*}}, #0, #-1)
320 declare i32 @llvm.hexagon.S2.tableidxw.goodsyntax(i32, i32, i32, i32)
321 define i32 @S2_tableidxw_goodsyntax(i32 %a, i32 %b) {
322 %z = call i32 @llvm.hexagon.S2.tableidxw.goodsyntax(i32 %a, i32 %b, i32 0, i32 0)
325 ; CHECK: = tableidxw({{.*}}, #0, #-2)
327 declare i32 @llvm.hexagon.S2.tableidxd.goodsyntax(i32, i32, i32, i32)
328 define i32 @S2_tableidxd_goodsyntax(i32 %a, i32 %b) {
329 %z = call i32 @llvm.hexagon.S2.tableidxd.goodsyntax(i32 %a, i32 %b, i32 0, i32 0)
332 ; CHECK: = tableidxd({{.*}}, #0, #-3)