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
4
5; CHECK-CALL-NOT: call
6
7; Count leading
8declare i32 @llvm.hexagon.S2.clbp(i64)
9define i32 @S2_clbp(i64 %a) {
10  %z = call i32 @llvm.hexagon.S2.clbp(i64 %a)
11  ret i32 %z
12}
13; CHECK: = clb({{.*}})
14
15declare i32 @llvm.hexagon.S2.cl0p(i64)
16define i32 @S2_cl0p(i64 %a) {
17  %z = call i32 @llvm.hexagon.S2.cl0p(i64 %a)
18  ret i32 %z
19}
20; CHECK: = cl0({{.*}})
21
22declare i32 @llvm.hexagon.S2.cl1p(i64)
23define i32 @S2_cl1p(i64 %a) {
24  %z = call i32 @llvm.hexagon.S2.cl1p(i64 %a)
25  ret i32 %z
26}
27; CHECK: = cl1({{.*}})
28
29declare i32 @llvm.hexagon.S4.clbpnorm(i64)
30define i32 @S4_clbpnorm(i64 %a) {
31  %z = call i32 @llvm.hexagon.S4.clbpnorm(i64 %a)
32  ret i32 %z
33}
34; CHECK: = normamt({{.*}})
35
36declare i32 @llvm.hexagon.S4.clbpaddi(i64, i32)
37define i32 @S4_clbpaddi(i64 %a) {
38  %z = call i32 @llvm.hexagon.S4.clbpaddi(i64 %a, i32 0)
39  ret i32 %z
40}
41; CHECK: = add(clb({{.*}}),#0)
42
43declare i32 @llvm.hexagon.S4.clbaddi(i32, i32)
44define i32 @S4_clbaddi(i32 %a) {
45  %z = call i32 @llvm.hexagon.S4.clbaddi(i32 %a, i32 0)
46  ret i32 %z
47}
48; CHECK: = add(clb({{.*}}),#0)
49
50declare i32 @llvm.hexagon.S2.cl0(i32)
51define i32 @S2_cl0(i32 %a) {
52  %z = call i32 @llvm.hexagon.S2.cl0(i32 %a)
53  ret i32 %z
54}
55; CHECK: = cl0({{.*}})
56
57declare i32 @llvm.hexagon.S2.cl1(i32)
58define i32 @S2_cl1(i32 %a) {
59  %z = call i32 @llvm.hexagon.S2.cl1(i32 %a)
60  ret i32 %z
61}
62; CHECK: = cl1({{.*}})
63
64declare i32 @llvm.hexagon.S2.clbnorm(i32)
65define i32 @S4_clbnorm(i32 %a) {
66  %z = call i32 @llvm.hexagon.S2.clbnorm(i32 %a)
67  ret i32 %z
68}
69; CHECK: = normamt({{.*}})
70
71; Count population
72declare i32 @llvm.hexagon.S5.popcountp(i64)
73define i32 @S5_popcountp(i64 %a) {
74  %z = call i32 @llvm.hexagon.S5.popcountp(i64 %a)
75  ret i32 %z
76}
77; CHECK: = popcount({{.*}})
78
79; Count trailing
80declare i32 @llvm.hexagon.S2.ct0p(i64)
81define i32 @S2_ct0p(i64 %a) {
82  %z = call i32 @llvm.hexagon.S2.ct0p(i64 %a)
83  ret i32 %z
84}
85; CHECK: = ct0({{.*}})
86
87declare i32 @llvm.hexagon.S2.ct1p(i64)
88define i32 @S2_ct1p(i64 %a) {
89  %z = call i32 @llvm.hexagon.S2.ct1p(i64 %a)
90  ret i32 %z
91}
92; CHECK: = ct1({{.*}})
93
94declare i32 @llvm.hexagon.S2.ct0(i32)
95define i32 @S2_ct0(i32 %a) {
96  %z = call i32 @llvm.hexagon.S2.ct0(i32 %a)
97  ret i32 %z
98}
99; CHECK: = ct0({{.*}})
100
101declare i32 @llvm.hexagon.S2.ct1(i32)
102define i32 @S2_ct1(i32 %a) {
103  %z = call i32 @llvm.hexagon.S2.ct1(i32 %a)
104  ret i32 %z
105}
106; CHECK: = ct1({{.*}})
107
108; Extract bitfield
109declare i64 @llvm.hexagon.S2.extractup(i64, i32, i32)
110define i64 @S2_extractup(i64 %a) {
111  %z = call i64 @llvm.hexagon.S2.extractup(i64 %a, i32 0, i32 0)
112  ret i64 %z
113}
114; CHECK: = extractu({{.*}},#0,#0)
115
116declare i64 @llvm.hexagon.S4.extractp(i64, i32, i32)
117define i64 @S2_extractp(i64 %a) {
118  %z = call i64 @llvm.hexagon.S4.extractp(i64 %a, i32 0, i32 0)
119  ret i64 %z
120}
121; CHECK: = extract({{.*}},#0,#0)
122
123declare i32 @llvm.hexagon.S2.extractu(i32, i32, i32)
124define i32 @S2_extractu(i32 %a) {
125  %z = call i32 @llvm.hexagon.S2.extractu(i32 %a, i32 0, i32 0)
126  ret i32 %z
127}
128; CHECK: = extractu({{.*}},#0,#0)
129
130declare i32 @llvm.hexagon.S4.extract(i32, i32, i32)
131define i32 @S2_extract(i32 %a) {
132  %z = call i32 @llvm.hexagon.S4.extract(i32 %a, i32 0, i32 0)
133  ret i32 %z
134}
135; CHECK: = extract({{.*}},#0,#0)
136
137declare i64 @llvm.hexagon.S2.extractup.rp(i64, i64)
138define i64 @S2_extractup_rp(i64 %a, i64 %b) {
139  %z = call i64 @llvm.hexagon.S2.extractup.rp(i64 %a, i64 %b)
140  ret i64 %z
141}
142; CHECK: = extractu({{.*}},{{.*}})
143
144declare i64 @llvm.hexagon.S4.extractp.rp(i64, i64)
145define i64 @S4_extractp_rp(i64 %a, i64 %b) {
146  %z = call i64 @llvm.hexagon.S4.extractp.rp(i64 %a, i64 %b)
147  ret i64 %z
148}
149; CHECK: = extract({{.*}},{{.*}})
150
151declare i32 @llvm.hexagon.S2.extractu.rp(i32, i64)
152define i32 @S2_extractu_rp(i32 %a, i64 %b) {
153  %z = call i32 @llvm.hexagon.S2.extractu.rp(i32 %a, i64 %b)
154  ret i32 %z
155}
156; CHECK: = extractu({{.*}},{{.*}})
157
158declare i32 @llvm.hexagon.S4.extract.rp(i32, i64)
159define i32 @S4_extract_rp(i32 %a, i64 %b) {
160  %z = call i32 @llvm.hexagon.S4.extract.rp(i32 %a, i64 %b)
161  ret i32 %z
162}
163; CHECK: = extract({{.*}},{{.*}})
164
165; Insert bitfield
166declare i64 @llvm.hexagon.S2.insertp(i64, i64, i32, i32)
167define i64 @S2_insertp(i64 %a, i64 %b) {
168  %z = call i64 @llvm.hexagon.S2.insertp(i64 %a, i64 %b, i32 0, i32 0)
169  ret i64 %z
170}
171; CHECK: = insert({{.*}},#0,#0)
172
173declare i32 @llvm.hexagon.S2.insert(i32, i32, i32, i32)
174define i32 @S2_insert(i32 %a, i32 %b) {
175  %z = call i32 @llvm.hexagon.S2.insert(i32 %a, i32 %b, i32 0, i32 0)
176  ret i32 %z
177}
178; CHECK: = insert({{.*}},#0,#0)
179
180declare i32 @llvm.hexagon.S2.insert.rp(i32, i32, i64)
181define 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)
183  ret i32 %z
184}
185; CHECK: = insert({{.*}},{{.*}})
186
187declare i64 @llvm.hexagon.S2.insertp.rp(i64, i64, i64)
188define 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)
190  ret i64 %z
191}
192; CHECK: = insert({{.*}},r5:4)
193
194; Interleave/deinterleave
195declare i64 @llvm.hexagon.S2.deinterleave(i64)
196define i64 @S2_deinterleave(i64 %a) {
197  %z = call i64 @llvm.hexagon.S2.deinterleave(i64 %a)
198  ret i64 %z
199}
200; CHECK: = deinterleave({{.*}})
201
202declare i64 @llvm.hexagon.S2.interleave(i64)
203define i64 @S2_interleave(i64 %a) {
204  %z = call i64 @llvm.hexagon.S2.interleave(i64 %a)
205  ret i64 %z
206}
207; CHECK: = interleave({{.*}})
208
209; Linear feedback-shift operation
210declare i64 @llvm.hexagon.S2.lfsp(i64, i64)
211define i64 @S2_lfsp(i64 %a, i64 %b) {
212  %z = call i64 @llvm.hexagon.S2.lfsp(i64 %a, i64 %b)
213  ret i64 %z
214}
215; CHECK: = lfs({{.*}},{{.*}})
216
217; Masked parity
218declare i32 @llvm.hexagon.S2.parityp(i64, i64)
219define i32 @S2_parityp(i64 %a, i64 %b) {
220  %z = call i32 @llvm.hexagon.S2.parityp(i64 %a, i64 %b)
221  ret i32 %z
222}
223; CHECK: = parity({{.*}},{{.*}})
224
225declare i32 @llvm.hexagon.S4.parity(i32, i32)
226define i32 @S4_parity(i32 %a, i32 %b) {
227  %z = call i32 @llvm.hexagon.S4.parity(i32 %a, i32 %b)
228  ret i32 %z
229}
230; CHECK: = parity({{.*}},{{.*}})
231
232; Bit reverse
233declare i64 @llvm.hexagon.S2.brevp(i64)
234define i64 @S2_brevp(i64 %a) {
235  %z = call i64 @llvm.hexagon.S2.brevp(i64 %a)
236  ret i64 %z
237}
238; CHECK: = brev({{.*}})
239
240declare i32 @llvm.hexagon.S2.brev(i32)
241define i32 @S2_brev(i32 %a) {
242  %z = call i32 @llvm.hexagon.S2.brev(i32 %a)
243  ret i32 %z
244}
245; CHECK: = brev({{.*}})
246
247; Set/clear/toggle bit
248declare i32 @llvm.hexagon.S2.setbit.i(i32, i32)
249define i32 @S2_setbit_i(i32 %a) {
250  %z = call i32 @llvm.hexagon.S2.setbit.i(i32 %a, i32 0)
251  ret i32 %z
252}
253; CHECK: = setbit({{.*}},#0)
254
255declare i32 @llvm.hexagon.S2.clrbit.i(i32, i32)
256define i32 @S2_clrbit_i(i32 %a) {
257  %z = call i32 @llvm.hexagon.S2.clrbit.i(i32 %a, i32 0)
258  ret i32 %z
259}
260; CHECK: = clrbit({{.*}},#0)
261
262declare i32 @llvm.hexagon.S2.togglebit.i(i32, i32)
263define i32 @S2_togglebit_i(i32 %a) {
264  %z = call i32 @llvm.hexagon.S2.togglebit.i(i32 %a, i32 0)
265  ret i32 %z
266}
267; CHECK: = togglebit({{.*}},#0)
268
269declare i32 @llvm.hexagon.S2.setbit.r(i32, i32)
270define i32 @S2_setbit_r(i32 %a, i32 %b) {
271  %z = call i32 @llvm.hexagon.S2.setbit.r(i32 %a, i32 %b)
272  ret i32 %z
273}
274; CHECK: = setbit({{.*}},{{.*}})
275
276declare i32 @llvm.hexagon.S2.clrbit.r(i32, i32)
277define i32 @S2_clrbit_r(i32 %a, i32 %b) {
278  %z = call i32 @llvm.hexagon.S2.clrbit.r(i32 %a, i32 %b)
279  ret i32 %z
280}
281; CHECK: = clrbit({{.*}},{{.*}})
282
283declare i32 @llvm.hexagon.S2.togglebit.r(i32, i32)
284define i32 @S2_togglebit_r(i32 %a, i32 %b) {
285  %z = call i32 @llvm.hexagon.S2.togglebit.r(i32 %a, i32 %b)
286  ret i32 %z
287}
288; CHECK: = togglebit({{.*}},{{.*}})
289
290; Split bitfield
291declare i64 @llvm.hexagon.A4.bitspliti(i32, i32)
292define i64 @A4_bitspliti(i32 %a) {
293  %z = call i64 @llvm.hexagon.A4.bitspliti(i32 %a, i32 0)
294  ret i64 %z
295}
296; CHECK: = bitsplit({{.*}},#0)
297
298declare i64 @llvm.hexagon.A4.bitsplit(i32, i32)
299define i64 @A4_bitsplit(i32 %a, i32 %b) {
300  %z = call i64 @llvm.hexagon.A4.bitsplit(i32 %a, i32 %b)
301  ret i64 %z
302}
303; CHECK: = bitsplit({{.*}},{{.*}})
304
305; Table index
306declare i32 @llvm.hexagon.S2.tableidxb.goodsyntax(i32, i32, i32, i32)
307define 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)
309  ret i32 %z
310}
311; CHECK: = tableidxb({{.*}},#0,#0)
312
313declare i32 @llvm.hexagon.S2.tableidxh.goodsyntax(i32, i32, i32, i32)
314define 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)
316  ret i32 %z
317}
318; CHECK: = tableidxh({{.*}},#0,#-1)
319
320declare i32 @llvm.hexagon.S2.tableidxw.goodsyntax(i32, i32, i32, i32)
321define 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)
323  ret i32 %z
324}
325; CHECK: = tableidxw({{.*}},#0,#-2)
326
327declare i32 @llvm.hexagon.S2.tableidxd.goodsyntax(i32, i32, i32, i32)
328define 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)
330  ret i32 %z
331}
332; CHECK: = tableidxd({{.*}},#0,#-3)
333