xref: /qemu/tests/unit/test-bitops.c (revision da668aa1)
1*da668aa1SThomas Huth /*
2*da668aa1SThomas Huth  * Test bitops routines
3*da668aa1SThomas Huth  *
4*da668aa1SThomas Huth  * This work is licensed under the terms of the GNU LGPL, version 2 or later.
5*da668aa1SThomas Huth  * See the COPYING.LIB file in the top-level directory.
6*da668aa1SThomas Huth  *
7*da668aa1SThomas Huth  */
8*da668aa1SThomas Huth 
9*da668aa1SThomas Huth #include "qemu/osdep.h"
10*da668aa1SThomas Huth #include "qemu/bitops.h"
11*da668aa1SThomas Huth 
12*da668aa1SThomas Huth typedef struct {
13*da668aa1SThomas Huth     uint32_t value;
14*da668aa1SThomas Huth     int start;
15*da668aa1SThomas Huth     int length;
16*da668aa1SThomas Huth     int32_t result;
17*da668aa1SThomas Huth } S32Test;
18*da668aa1SThomas Huth 
19*da668aa1SThomas Huth typedef struct {
20*da668aa1SThomas Huth     uint64_t value;
21*da668aa1SThomas Huth     int start;
22*da668aa1SThomas Huth     int length;
23*da668aa1SThomas Huth     int64_t result;
24*da668aa1SThomas Huth } S64Test;
25*da668aa1SThomas Huth 
26*da668aa1SThomas Huth static const S32Test test_s32_data[] = {
27*da668aa1SThomas Huth     { 0x38463983, 4, 4, -8 },
28*da668aa1SThomas Huth     { 0x38463983, 12, 8, 0x63 },
29*da668aa1SThomas Huth     { 0x38463983, 0, 32, 0x38463983 },
30*da668aa1SThomas Huth };
31*da668aa1SThomas Huth 
32*da668aa1SThomas Huth static const S64Test test_s64_data[] = {
33*da668aa1SThomas Huth     { 0x8459826734967223ULL, 60, 4, -8 },
34*da668aa1SThomas Huth     { 0x8459826734967223ULL, 0, 64, 0x8459826734967223LL },
35*da668aa1SThomas Huth };
36*da668aa1SThomas Huth 
test_sextract32(void)37*da668aa1SThomas Huth static void test_sextract32(void)
38*da668aa1SThomas Huth {
39*da668aa1SThomas Huth     int i;
40*da668aa1SThomas Huth 
41*da668aa1SThomas Huth     for (i = 0; i < ARRAY_SIZE(test_s32_data); i++) {
42*da668aa1SThomas Huth         const S32Test *test = &test_s32_data[i];
43*da668aa1SThomas Huth         int32_t r = sextract32(test->value, test->start, test->length);
44*da668aa1SThomas Huth 
45*da668aa1SThomas Huth         g_assert_cmpint(r, ==, test->result);
46*da668aa1SThomas Huth     }
47*da668aa1SThomas Huth }
48*da668aa1SThomas Huth 
test_sextract64(void)49*da668aa1SThomas Huth static void test_sextract64(void)
50*da668aa1SThomas Huth {
51*da668aa1SThomas Huth     int i;
52*da668aa1SThomas Huth 
53*da668aa1SThomas Huth     for (i = 0; i < ARRAY_SIZE(test_s32_data); i++) {
54*da668aa1SThomas Huth         const S32Test *test = &test_s32_data[i];
55*da668aa1SThomas Huth         int64_t r = sextract64(test->value, test->start, test->length);
56*da668aa1SThomas Huth 
57*da668aa1SThomas Huth         g_assert_cmpint(r, ==, test->result);
58*da668aa1SThomas Huth     }
59*da668aa1SThomas Huth 
60*da668aa1SThomas Huth     for (i = 0; i < ARRAY_SIZE(test_s64_data); i++) {
61*da668aa1SThomas Huth         const S64Test *test = &test_s64_data[i];
62*da668aa1SThomas Huth         int64_t r = sextract64(test->value, test->start, test->length);
63*da668aa1SThomas Huth 
64*da668aa1SThomas Huth         g_assert_cmpint(r, ==, test->result);
65*da668aa1SThomas Huth     }
66*da668aa1SThomas Huth }
67*da668aa1SThomas Huth 
68*da668aa1SThomas Huth typedef struct {
69*da668aa1SThomas Huth     uint32_t unshuffled;
70*da668aa1SThomas Huth     uint32_t shuffled;
71*da668aa1SThomas Huth } Shuffle32Test;
72*da668aa1SThomas Huth 
73*da668aa1SThomas Huth typedef struct {
74*da668aa1SThomas Huth     uint64_t unshuffled;
75*da668aa1SThomas Huth     uint64_t shuffled;
76*da668aa1SThomas Huth } Shuffle64Test;
77*da668aa1SThomas Huth 
78*da668aa1SThomas Huth static const Shuffle32Test test_shuffle32_data[] = {
79*da668aa1SThomas Huth     { 0x0000FFFF, 0x55555555 },
80*da668aa1SThomas Huth     { 0x000081C5, 0x40015011 },
81*da668aa1SThomas Huth };
82*da668aa1SThomas Huth 
83*da668aa1SThomas Huth static const Shuffle64Test test_shuffle64_data[] = {
84*da668aa1SThomas Huth     { 0x00000000FFFFFFFFULL, 0x5555555555555555ULL },
85*da668aa1SThomas Huth     { 0x00000000493AB02CULL, 0x1041054445000450ULL },
86*da668aa1SThomas Huth };
87*da668aa1SThomas Huth 
test_half_shuffle32(void)88*da668aa1SThomas Huth static void test_half_shuffle32(void)
89*da668aa1SThomas Huth {
90*da668aa1SThomas Huth     int i;
91*da668aa1SThomas Huth 
92*da668aa1SThomas Huth     for (i = 0; i < ARRAY_SIZE(test_shuffle32_data); i++) {
93*da668aa1SThomas Huth         const Shuffle32Test *test = &test_shuffle32_data[i];
94*da668aa1SThomas Huth         uint32_t r = half_shuffle32(test->unshuffled);
95*da668aa1SThomas Huth 
96*da668aa1SThomas Huth         g_assert_cmpint(r, ==, test->shuffled);
97*da668aa1SThomas Huth     }
98*da668aa1SThomas Huth }
99*da668aa1SThomas Huth 
test_half_shuffle64(void)100*da668aa1SThomas Huth static void test_half_shuffle64(void)
101*da668aa1SThomas Huth {
102*da668aa1SThomas Huth     int i;
103*da668aa1SThomas Huth 
104*da668aa1SThomas Huth     for (i = 0; i < ARRAY_SIZE(test_shuffle64_data); i++) {
105*da668aa1SThomas Huth         const Shuffle64Test *test = &test_shuffle64_data[i];
106*da668aa1SThomas Huth         uint64_t r = half_shuffle64(test->unshuffled);
107*da668aa1SThomas Huth 
108*da668aa1SThomas Huth         g_assert_cmpint(r, ==, test->shuffled);
109*da668aa1SThomas Huth     }
110*da668aa1SThomas Huth }
111*da668aa1SThomas Huth 
test_half_unshuffle32(void)112*da668aa1SThomas Huth static void test_half_unshuffle32(void)
113*da668aa1SThomas Huth {
114*da668aa1SThomas Huth     int i;
115*da668aa1SThomas Huth 
116*da668aa1SThomas Huth     for (i = 0; i < ARRAY_SIZE(test_shuffle32_data); i++) {
117*da668aa1SThomas Huth         const Shuffle32Test *test = &test_shuffle32_data[i];
118*da668aa1SThomas Huth         uint32_t r = half_unshuffle32(test->shuffled);
119*da668aa1SThomas Huth 
120*da668aa1SThomas Huth         g_assert_cmpint(r, ==, test->unshuffled);
121*da668aa1SThomas Huth     }
122*da668aa1SThomas Huth }
123*da668aa1SThomas Huth 
test_half_unshuffle64(void)124*da668aa1SThomas Huth static void test_half_unshuffle64(void)
125*da668aa1SThomas Huth {
126*da668aa1SThomas Huth     int i;
127*da668aa1SThomas Huth 
128*da668aa1SThomas Huth     for (i = 0; i < ARRAY_SIZE(test_shuffle64_data); i++) {
129*da668aa1SThomas Huth         const Shuffle64Test *test = &test_shuffle64_data[i];
130*da668aa1SThomas Huth         uint64_t r = half_unshuffle64(test->shuffled);
131*da668aa1SThomas Huth 
132*da668aa1SThomas Huth         g_assert_cmpint(r, ==, test->unshuffled);
133*da668aa1SThomas Huth     }
134*da668aa1SThomas Huth }
135*da668aa1SThomas Huth 
main(int argc,char ** argv)136*da668aa1SThomas Huth int main(int argc, char **argv)
137*da668aa1SThomas Huth {
138*da668aa1SThomas Huth     g_test_init(&argc, &argv, NULL);
139*da668aa1SThomas Huth     g_test_add_func("/bitops/sextract32", test_sextract32);
140*da668aa1SThomas Huth     g_test_add_func("/bitops/sextract64", test_sextract64);
141*da668aa1SThomas Huth     g_test_add_func("/bitops/half_shuffle32", test_half_shuffle32);
142*da668aa1SThomas Huth     g_test_add_func("/bitops/half_shuffle64", test_half_shuffle64);
143*da668aa1SThomas Huth     g_test_add_func("/bitops/half_unshuffle32", test_half_unshuffle32);
144*da668aa1SThomas Huth     g_test_add_func("/bitops/half_unshuffle64", test_half_unshuffle64);
145*da668aa1SThomas Huth     return g_test_run();
146*da668aa1SThomas Huth }
147