1*a5661c3aSSong Gao #include <assert.h>
2*a5661c3aSSong Gao #include <inttypes.h>
3*a5661c3aSSong Gao
4*a5661c3aSSong Gao #define ARRAY_SIZE(X) (sizeof(X) / sizeof(*(X)))
5*a5661c3aSSong Gao #define TEST_CLO(N) \
6*a5661c3aSSong Gao static uint64_t test_clo_##N(uint64_t rj) \
7*a5661c3aSSong Gao { \
8*a5661c3aSSong Gao uint64_t rd = 0; \
9*a5661c3aSSong Gao \
10*a5661c3aSSong Gao asm volatile("clo."#N" %0, %1\n\t" \
11*a5661c3aSSong Gao : "=r"(rd) \
12*a5661c3aSSong Gao : "r"(rj) \
13*a5661c3aSSong Gao : ); \
14*a5661c3aSSong Gao return rd; \
15*a5661c3aSSong Gao }
16*a5661c3aSSong Gao
17*a5661c3aSSong Gao #define TEST_CLZ(N) \
18*a5661c3aSSong Gao static uint64_t test_clz_##N(uint64_t rj) \
19*a5661c3aSSong Gao { \
20*a5661c3aSSong Gao uint64_t rd = 0; \
21*a5661c3aSSong Gao \
22*a5661c3aSSong Gao asm volatile("clz."#N" %0, %1\n\t" \
23*a5661c3aSSong Gao : "=r"(rd) \
24*a5661c3aSSong Gao : "r"(rj) \
25*a5661c3aSSong Gao : ); \
26*a5661c3aSSong Gao return rd; \
27*a5661c3aSSong Gao }
28*a5661c3aSSong Gao
29*a5661c3aSSong Gao #define TEST_CTO(N) \
30*a5661c3aSSong Gao static uint64_t test_cto_##N(uint64_t rj) \
31*a5661c3aSSong Gao { \
32*a5661c3aSSong Gao uint64_t rd = 0; \
33*a5661c3aSSong Gao \
34*a5661c3aSSong Gao asm volatile("cto."#N" %0, %1\n\t" \
35*a5661c3aSSong Gao : "=r"(rd) \
36*a5661c3aSSong Gao : "r"(rj) \
37*a5661c3aSSong Gao : ); \
38*a5661c3aSSong Gao return rd; \
39*a5661c3aSSong Gao }
40*a5661c3aSSong Gao
41*a5661c3aSSong Gao #define TEST_CTZ(N) \
42*a5661c3aSSong Gao static uint64_t test_ctz_##N(uint64_t rj) \
43*a5661c3aSSong Gao { \
44*a5661c3aSSong Gao uint64_t rd = 0; \
45*a5661c3aSSong Gao \
46*a5661c3aSSong Gao asm volatile("ctz."#N" %0, %1\n\t" \
47*a5661c3aSSong Gao : "=r"(rd) \
48*a5661c3aSSong Gao : "r"(rj) \
49*a5661c3aSSong Gao : ); \
50*a5661c3aSSong Gao return rd; \
51*a5661c3aSSong Gao }
52*a5661c3aSSong Gao
53*a5661c3aSSong Gao TEST_CLO(w)
54*a5661c3aSSong Gao TEST_CLO(d)
55*a5661c3aSSong Gao TEST_CLZ(w)
56*a5661c3aSSong Gao TEST_CLZ(d)
57*a5661c3aSSong Gao TEST_CTO(w)
58*a5661c3aSSong Gao TEST_CTO(d)
59*a5661c3aSSong Gao TEST_CTZ(w)
60*a5661c3aSSong Gao TEST_CTZ(d)
61*a5661c3aSSong Gao
62*a5661c3aSSong Gao struct vector {
63*a5661c3aSSong Gao uint64_t (*func)(uint64_t);
64*a5661c3aSSong Gao uint64_t u;
65*a5661c3aSSong Gao uint64_t r;
66*a5661c3aSSong Gao };
67*a5661c3aSSong Gao
68*a5661c3aSSong Gao static struct vector vectors[] = {
69*a5661c3aSSong Gao {test_clo_w, 0xfff11fff392476ab, 0},
70*a5661c3aSSong Gao {test_clo_d, 0xabd28a64000000, 0},
71*a5661c3aSSong Gao {test_clz_w, 0xfaffff42392476ab, 2},
72*a5661c3aSSong Gao {test_clz_d, 0xabd28a64000000, 8},
73*a5661c3aSSong Gao {test_cto_w, 0xfff11fff392476ab, 2},
74*a5661c3aSSong Gao {test_cto_d, 0xabd28a64000000, 0},
75*a5661c3aSSong Gao {test_ctz_w, 0xfaffff42392476ab, 0},
76*a5661c3aSSong Gao {test_ctz_d, 0xabd28a64000000, 26},
77*a5661c3aSSong Gao };
78*a5661c3aSSong Gao
main()79*a5661c3aSSong Gao int main()
80*a5661c3aSSong Gao {
81*a5661c3aSSong Gao int i;
82*a5661c3aSSong Gao
83*a5661c3aSSong Gao for (i = 0; i < ARRAY_SIZE(vectors); i++) {
84*a5661c3aSSong Gao assert((*vectors[i].func)(vectors[i].u) == vectors[i].r);
85*a5661c3aSSong Gao }
86*a5661c3aSSong Gao
87*a5661c3aSSong Gao return 0;
88*a5661c3aSSong Gao }
89