xref: /qemu/tests/tcg/loongarch64/test_bit.c (revision a5661c3a)
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