xref: /qemu/tests/unit/test-bitops.c (revision a5ebc0ebae1d2283cfec4170b1a04317f2faee74)
13464700fSPeter Maydell /*
23464700fSPeter Maydell  * Test bitops routines
33464700fSPeter Maydell  *
43464700fSPeter Maydell  * This work is licensed under the terms of the GNU LGPL, version 2 or later.
53464700fSPeter Maydell  * See the COPYING.LIB file in the top-level directory.
63464700fSPeter Maydell  *
73464700fSPeter Maydell  */
83464700fSPeter Maydell 
93464700fSPeter Maydell #include <glib.h>
103464700fSPeter Maydell #include <stdint.h>
11*a5ebc0ebSEduardo Habkost #include "qemu/osdep.h"
123464700fSPeter Maydell #include "qemu/bitops.h"
133464700fSPeter Maydell 
143464700fSPeter Maydell typedef struct {
153464700fSPeter Maydell     uint32_t value;
163464700fSPeter Maydell     int start;
173464700fSPeter Maydell     int length;
183464700fSPeter Maydell     int32_t result;
193464700fSPeter Maydell } S32Test;
203464700fSPeter Maydell 
213464700fSPeter Maydell typedef struct {
223464700fSPeter Maydell     uint64_t value;
233464700fSPeter Maydell     int start;
243464700fSPeter Maydell     int length;
253464700fSPeter Maydell     int64_t result;
263464700fSPeter Maydell } S64Test;
273464700fSPeter Maydell 
283464700fSPeter Maydell static const S32Test test_s32_data[] = {
293464700fSPeter Maydell     { 0x38463983, 4, 4, -8 },
303464700fSPeter Maydell     { 0x38463983, 12, 8, 0x63 },
313464700fSPeter Maydell     { 0x38463983, 0, 32, 0x38463983 },
323464700fSPeter Maydell };
333464700fSPeter Maydell 
343464700fSPeter Maydell static const S64Test test_s64_data[] = {
355cb6be2cSStefan Hajnoczi     { 0x8459826734967223ULL, 60, 4, -8 },
365cb6be2cSStefan Hajnoczi     { 0x8459826734967223ULL, 0, 64, 0x8459826734967223LL },
373464700fSPeter Maydell };
383464700fSPeter Maydell 
393464700fSPeter Maydell static void test_sextract32(void)
403464700fSPeter Maydell {
413464700fSPeter Maydell     int i;
423464700fSPeter Maydell 
433464700fSPeter Maydell     for (i = 0; i < ARRAY_SIZE(test_s32_data); i++) {
443464700fSPeter Maydell         const S32Test *test = &test_s32_data[i];
453464700fSPeter Maydell         int32_t r = sextract32(test->value, test->start, test->length);
463464700fSPeter Maydell 
473464700fSPeter Maydell         g_assert_cmpint(r, ==, test->result);
483464700fSPeter Maydell     }
493464700fSPeter Maydell }
503464700fSPeter Maydell 
513464700fSPeter Maydell static void test_sextract64(void)
523464700fSPeter Maydell {
533464700fSPeter Maydell     int i;
543464700fSPeter Maydell 
553464700fSPeter Maydell     for (i = 0; i < ARRAY_SIZE(test_s32_data); i++) {
563464700fSPeter Maydell         const S32Test *test = &test_s32_data[i];
573464700fSPeter Maydell         int64_t r = sextract64(test->value, test->start, test->length);
583464700fSPeter Maydell 
593464700fSPeter Maydell         g_assert_cmpint(r, ==, test->result);
603464700fSPeter Maydell     }
613464700fSPeter Maydell 
623464700fSPeter Maydell     for (i = 0; i < ARRAY_SIZE(test_s64_data); i++) {
633464700fSPeter Maydell         const S64Test *test = &test_s64_data[i];
643464700fSPeter Maydell         int64_t r = sextract64(test->value, test->start, test->length);
653464700fSPeter Maydell 
663464700fSPeter Maydell         g_assert_cmpint(r, ==, test->result);
673464700fSPeter Maydell     }
683464700fSPeter Maydell }
693464700fSPeter Maydell 
703464700fSPeter Maydell int main(int argc, char **argv)
713464700fSPeter Maydell {
723464700fSPeter Maydell     g_test_init(&argc, &argv, NULL);
733464700fSPeter Maydell     g_test_add_func("/bitops/sextract32", test_sextract32);
743464700fSPeter Maydell     g_test_add_func("/bitops/sextract64", test_sextract64);
753464700fSPeter Maydell     return g_test_run();
763464700fSPeter Maydell }
77