OSDN Git Service

Update aosp/master LLVM for rebase to r239765
[android-x86/external-llvm.git] / test / CodeGen / Hexagon / intrinsics / xtype_bit.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.2 XTYPE/BIT
4
5 ; CHECK-CALL-NOT: call
6
7 ; Count leading
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)
11   ret i32 %z
12 }
13 ; CHECK: = clb({{.*}})
14
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)
18   ret i32 %z
19 }
20 ; CHECK: = cl0({{.*}})
21
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)
25   ret i32 %z
26 }
27 ; CHECK: = cl1({{.*}})
28
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)
32   ret i32 %z
33 }
34 ; CHECK: = normamt({{.*}})
35
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)
39   ret i32 %z
40 }
41 ; CHECK: = add(clb({{.*}}), #0)
42
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)
46   ret i32 %z
47 }
48 ; CHECK: = add(clb({{.*}}), #0)
49
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)
53   ret i32 %z
54 }
55 ; CHECK: = cl0({{.*}})
56
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)
60   ret i32 %z
61 }
62 ; CHECK: = cl1({{.*}})
63
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)
67   ret i32 %z
68 }
69 ; CHECK: = normamt({{.*}})
70
71 ; Count population
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)
75   ret i32 %z
76 }
77 ; CHECK: = popcount({{.*}})
78
79 ; Count trailing
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)
83   ret i32 %z
84 }
85 ; CHECK: = ct0({{.*}})
86
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)
90   ret i32 %z
91 }
92 ; CHECK: = ct1({{.*}})
93
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)
97   ret i32 %z
98 }
99 ; CHECK: = ct0({{.*}})
100
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)
104   ret i32 %z
105 }
106 ; CHECK: = ct1({{.*}})
107
108 ; Extract bitfield
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)
112   ret i64 %z
113 }
114 ; CHECK: = extractu({{.*}}, #0, #0)
115
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)
119   ret i64 %z
120 }
121 ; CHECK: = extract({{.*}}, #0, #0)
122
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)
126   ret i32 %z
127 }
128 ; CHECK: = extractu({{.*}}, #0, #0)
129
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)
133   ret i32 %z
134 }
135 ; CHECK: = extract({{.*}}, #0, #0)
136
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)
140   ret i64 %z
141 }
142 ; CHECK: = extractu({{.*}}, {{.*}})
143
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)
147   ret i64 %z
148 }
149 ; CHECK: = extract({{.*}}, {{.*}})
150
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)
154   ret i32 %z
155 }
156 ; CHECK: = extractu({{.*}}, {{.*}})
157
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)
161   ret i32 %z
162 }
163 ; CHECK: = extract({{.*}}, {{.*}})
164
165 ; Insert bitfield
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)
169   ret i64 %z
170 }
171 ; CHECK: = insert({{.*}}, #0, #0)
172
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)
176   ret i32 %z
177 }
178 ; CHECK: = insert({{.*}}, #0, #0)
179
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)
183   ret i32 %z
184 }
185 ; CHECK: = insert({{.*}}, {{.*}})
186
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)
190   ret i64 %z
191 }
192 ; CHECK: = insert({{.*}}, r5:4)
193
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)
198   ret i64 %z
199 }
200 ; CHECK: = deinterleave({{.*}})
201
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)
205   ret i64 %z
206 }
207 ; CHECK: = interleave({{.*}})
208
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)
213   ret i64 %z
214 }
215 ; CHECK: = lfs({{.*}}, {{.*}})
216
217 ; Masked parity
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)
221   ret i32 %z
222 }
223 ; CHECK: = parity({{.*}}, {{.*}})
224
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)
228   ret i32 %z
229 }
230 ; CHECK: = parity({{.*}}, {{.*}})
231
232 ; Bit reverse
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)
236   ret i64 %z
237 }
238 ; CHECK: = brev({{.*}})
239
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)
243   ret i32 %z
244 }
245 ; CHECK: = brev({{.*}})
246
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)
251   ret i32 %z
252 }
253 ; CHECK: = setbit({{.*}}, #0)
254
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)
258   ret i32 %z
259 }
260 ; CHECK: = clrbit({{.*}}, #0)
261
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)
265   ret i32 %z
266 }
267 ; CHECK: = togglebit({{.*}}, #0)
268
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)
272   ret i32 %z
273 }
274 ; CHECK: = setbit({{.*}}, {{.*}})
275
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)
279   ret i32 %z
280 }
281 ; CHECK: = clrbit({{.*}}, {{.*}})
282
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)
286   ret i32 %z
287 }
288 ; CHECK: = togglebit({{.*}}, {{.*}})
289
290 ; Split bitfield
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)
294   ret i64 %z
295 }
296 ; CHECK: = bitsplit({{.*}}, #0)
297
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)
301   ret i64 %z
302 }
303 ; CHECK: = bitsplit({{.*}}, {{.*}})
304
305 ; Table index
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)
309   ret i32 %z
310 }
311 ; CHECK: = tableidxb({{.*}}, #0, #0)
312
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)
316   ret i32 %z
317 }
318 ; CHECK: = tableidxh({{.*}}, #0, #-1)
319
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)
323   ret i32 %z
324 }
325 ; CHECK: = tableidxw({{.*}}, #0, #-2)
326
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)
330   ret i32 %z
331 }
332 ; CHECK: = tableidxd({{.*}}, #0, #-3)