xref: /qemu/tests/tcg/cris/libc/check_lz.c (revision d4f6e58f)
1*d4f6e58fSAlex Bennée #include <stdio.h>
2*d4f6e58fSAlex Bennée #include <stdlib.h>
3*d4f6e58fSAlex Bennée #include <stdint.h>
4*d4f6e58fSAlex Bennée #include "sys.h"
5*d4f6e58fSAlex Bennée 
cris_lz(int x)6*d4f6e58fSAlex Bennée static always_inline int cris_lz(int x)
7*d4f6e58fSAlex Bennée {
8*d4f6e58fSAlex Bennée 	int r;
9*d4f6e58fSAlex Bennée 	asm ("lz\t%1, %0\n" : "=r" (r) : "r" (x));
10*d4f6e58fSAlex Bennée 	return r;
11*d4f6e58fSAlex Bennée }
12*d4f6e58fSAlex Bennée 
check_lz(void)13*d4f6e58fSAlex Bennée void check_lz(void)
14*d4f6e58fSAlex Bennée {
15*d4f6e58fSAlex Bennée 	int i;
16*d4f6e58fSAlex Bennée 
17*d4f6e58fSAlex Bennée 	if (cris_lz(0) != 32)
18*d4f6e58fSAlex Bennée 		err();
19*d4f6e58fSAlex Bennée 	if (cris_lz(1) != 31)
20*d4f6e58fSAlex Bennée 		err();
21*d4f6e58fSAlex Bennée 	if (cris_lz(2) != 30)
22*d4f6e58fSAlex Bennée 		err();
23*d4f6e58fSAlex Bennée 	if (cris_lz(4) != 29)
24*d4f6e58fSAlex Bennée 		err();
25*d4f6e58fSAlex Bennée 	if (cris_lz(8) != 28)
26*d4f6e58fSAlex Bennée 		err();
27*d4f6e58fSAlex Bennée 
28*d4f6e58fSAlex Bennée 	/* try all positions with a single bit.  */
29*d4f6e58fSAlex Bennée 	for (i = 1; i < 32; i++) {
30*d4f6e58fSAlex Bennée 		if (cris_lz(1 << (i-1)) != (32 - i))
31*d4f6e58fSAlex Bennée 			err();
32*d4f6e58fSAlex Bennée 	}
33*d4f6e58fSAlex Bennée 
34*d4f6e58fSAlex Bennée 	/* try all positions with all bits.  */
35*d4f6e58fSAlex Bennée 	for (i = 1; i < 32; i++) {
36*d4f6e58fSAlex Bennée 		/* split up this computation to clarify it.  */
37*d4f6e58fSAlex Bennée 		uint32_t val;
38*d4f6e58fSAlex Bennée 		val = (unsigned int)-1 >> (32 - i);
39*d4f6e58fSAlex Bennée 		if (cris_lz(val) != (32 - i))
40*d4f6e58fSAlex Bennée 			err();
41*d4f6e58fSAlex Bennée 	}
42*d4f6e58fSAlex Bennée }
43*d4f6e58fSAlex Bennée 
main(void)44*d4f6e58fSAlex Bennée int main(void)
45*d4f6e58fSAlex Bennée {
46*d4f6e58fSAlex Bennée 	check_lz();
47*d4f6e58fSAlex Bennée 	pass();
48*d4f6e58fSAlex Bennée 	exit(0);
49*d4f6e58fSAlex Bennée }
50