root / tests / test-mul64.c @ 34b5d2c6
History | View | Annotate | Download (1.7 kB)
1 | f4c0f986 | Richard Henderson | /*
|
---|---|---|---|
2 | f4c0f986 | Richard Henderson | * Test 64x64 -> 128 multiply subroutines
|
3 | f4c0f986 | Richard Henderson | *
|
4 | f4c0f986 | Richard Henderson | * This work is licensed under the terms of the GNU LGPL, version 2 or later.
|
5 | f4c0f986 | Richard Henderson | * See the COPYING.LIB file in the top-level directory.
|
6 | f4c0f986 | Richard Henderson | *
|
7 | f4c0f986 | Richard Henderson | */
|
8 | f4c0f986 | Richard Henderson | |
9 | f4c0f986 | Richard Henderson | #include <glib.h> |
10 | f4c0f986 | Richard Henderson | #include <stdint.h> |
11 | f4c0f986 | Richard Henderson | #include "qemu/host-utils.h" |
12 | f4c0f986 | Richard Henderson | #include "qemu/osdep.h" |
13 | f4c0f986 | Richard Henderson | |
14 | f4c0f986 | Richard Henderson | |
15 | f4c0f986 | Richard Henderson | typedef struct { |
16 | f4c0f986 | Richard Henderson | uint64_t a, b; |
17 | f4c0f986 | Richard Henderson | uint64_t rh, rl; |
18 | f4c0f986 | Richard Henderson | } Test; |
19 | f4c0f986 | Richard Henderson | |
20 | f4c0f986 | Richard Henderson | static const Test test_u_data[] = { |
21 | f4c0f986 | Richard Henderson | { 1, 1, 0, 1 }, |
22 | f4c0f986 | Richard Henderson | { 10000, 10000, 0, 100000000 }, |
23 | f4c0f986 | Richard Henderson | { 0xffffffffffffffffULL, 2, 1, 0xfffffffffffffffeULL }, |
24 | f4c0f986 | Richard Henderson | { 0xffffffffffffffffULL, 0xffffffffffffffffULL, |
25 | f4c0f986 | Richard Henderson | 0xfffffffffffffffeULL, 0x0000000000000001ULL }, |
26 | f4c0f986 | Richard Henderson | { 0x1122334455667788ull, 0x8877665544332211ull, |
27 | f4c0f986 | Richard Henderson | 0x092228fb777ae38full, 0x0a3e963337c60008ull }, |
28 | f4c0f986 | Richard Henderson | }; |
29 | f4c0f986 | Richard Henderson | |
30 | f4c0f986 | Richard Henderson | static const Test test_s_data[] = { |
31 | f4c0f986 | Richard Henderson | { 1, 1, 0, 1 }, |
32 | f4c0f986 | Richard Henderson | { 1, -1, -1, -1 }, |
33 | f4c0f986 | Richard Henderson | { -10, -10, 0, 100 }, |
34 | f4c0f986 | Richard Henderson | { 10000, 10000, 0, 100000000 }, |
35 | f4c0f986 | Richard Henderson | { -1, 2, -1, -2 }, |
36 | f4c0f986 | Richard Henderson | { 0x1122334455667788ULL, 0x1122334455667788ULL, |
37 | f4c0f986 | Richard Henderson | 0x01258f60bbc2975cULL, 0x1eace4a3c82fb840ULL }, |
38 | f4c0f986 | Richard Henderson | }; |
39 | f4c0f986 | Richard Henderson | |
40 | f4c0f986 | Richard Henderson | static void test_u(void) |
41 | f4c0f986 | Richard Henderson | { |
42 | f4c0f986 | Richard Henderson | int i;
|
43 | f4c0f986 | Richard Henderson | |
44 | f4c0f986 | Richard Henderson | for (i = 0; i < ARRAY_SIZE(test_u_data); ++i) { |
45 | f4c0f986 | Richard Henderson | uint64_t rl, rh; |
46 | f4c0f986 | Richard Henderson | mulu64(&rl, &rh, test_u_data[i].a, test_u_data[i].b); |
47 | f4c0f986 | Richard Henderson | g_assert_cmpuint(rl, ==, test_u_data[i].rl); |
48 | f4c0f986 | Richard Henderson | g_assert_cmpuint(rh, ==, test_u_data[i].rh); |
49 | f4c0f986 | Richard Henderson | } |
50 | f4c0f986 | Richard Henderson | } |
51 | f4c0f986 | Richard Henderson | |
52 | f4c0f986 | Richard Henderson | static void test_s(void) |
53 | f4c0f986 | Richard Henderson | { |
54 | f4c0f986 | Richard Henderson | int i;
|
55 | f4c0f986 | Richard Henderson | |
56 | f4c0f986 | Richard Henderson | for (i = 0; i < ARRAY_SIZE(test_s_data); ++i) { |
57 | f4c0f986 | Richard Henderson | uint64_t rl, rh; |
58 | f4c0f986 | Richard Henderson | muls64(&rl, &rh, test_s_data[i].a, test_s_data[i].b); |
59 | f4c0f986 | Richard Henderson | g_assert_cmpuint(rl, ==, test_s_data[i].rl); |
60 | f4c0f986 | Richard Henderson | g_assert_cmpint(rh, ==, test_s_data[i].rh); |
61 | f4c0f986 | Richard Henderson | } |
62 | f4c0f986 | Richard Henderson | } |
63 | f4c0f986 | Richard Henderson | |
64 | f4c0f986 | Richard Henderson | int main(int argc, char **argv) |
65 | f4c0f986 | Richard Henderson | { |
66 | f4c0f986 | Richard Henderson | g_test_init(&argc, &argv, NULL);
|
67 | f4c0f986 | Richard Henderson | g_test_add_func("/host-utils/mulu64", test_u);
|
68 | f4c0f986 | Richard Henderson | g_test_add_func("/host-utils/muls64", test_s);
|
69 | f4c0f986 | Richard Henderson | return g_test_run();
|
70 | f4c0f986 | Richard Henderson | } |