xref: /qemu/tests/tcg/loongarch64/test_div.c (revision 68e26e1e812c8b09313d7929271f6cbd47ef4c07)
1*fa50579aSSong Gao #include <assert.h>
2*fa50579aSSong Gao #include <inttypes.h>
3*fa50579aSSong Gao #include <stdio.h>
4*fa50579aSSong Gao 
5*fa50579aSSong Gao #define TEST_DIV(N, M)                               \
6*fa50579aSSong Gao static void test_div_ ##N(uint ## M ## _t rj,        \
7*fa50579aSSong Gao                           uint ## M ## _t rk,        \
8*fa50579aSSong Gao                           uint64_t rm)               \
9*fa50579aSSong Gao {                                                    \
10*fa50579aSSong Gao     uint64_t rd = 0;                                 \
11*fa50579aSSong Gao                                                      \
12*fa50579aSSong Gao     asm volatile("div."#N" %0,%1,%2\n\t"             \
13*fa50579aSSong Gao                  : "=r"(rd)                          \
14*fa50579aSSong Gao                  : "r"(rj), "r"(rk)                  \
15*fa50579aSSong Gao                  : );                                \
16*fa50579aSSong Gao     assert(rd == rm);                                \
17*fa50579aSSong Gao }
18*fa50579aSSong Gao 
19*fa50579aSSong Gao #define TEST_MOD(N, M)                               \
20*fa50579aSSong Gao static void test_mod_ ##N(uint ## M ## _t rj,        \
21*fa50579aSSong Gao                           uint ## M ## _t rk,        \
22*fa50579aSSong Gao                           uint64_t rm)               \
23*fa50579aSSong Gao {                                                    \
24*fa50579aSSong Gao     uint64_t rd = 0;                                 \
25*fa50579aSSong Gao                                                      \
26*fa50579aSSong Gao     asm volatile("mod."#N" %0,%1,%2\n\t"             \
27*fa50579aSSong Gao                  : "=r"(rd)                          \
28*fa50579aSSong Gao                  : "r"(rj), "r"(rk)                  \
29*fa50579aSSong Gao                  : );                                \
30*fa50579aSSong Gao     assert(rd == rm);                                \
31*fa50579aSSong Gao }
32*fa50579aSSong Gao 
33*fa50579aSSong Gao TEST_DIV(w, 32)
34*fa50579aSSong Gao TEST_DIV(wu, 32)
35*fa50579aSSong Gao TEST_DIV(d, 64)
36*fa50579aSSong Gao TEST_DIV(du, 64)
37*fa50579aSSong Gao TEST_MOD(w, 32)
38*fa50579aSSong Gao TEST_MOD(wu, 32)
39*fa50579aSSong Gao TEST_MOD(d, 64)
40*fa50579aSSong Gao TEST_MOD(du, 64)
41*fa50579aSSong Gao 
main(void)42*fa50579aSSong Gao int main(void)
43*fa50579aSSong Gao {
44*fa50579aSSong Gao     test_div_w(0xffaced97, 0xc36abcde, 0x0);
45*fa50579aSSong Gao     test_div_wu(0xffaced97, 0xc36abcde, 0x1);
46*fa50579aSSong Gao     test_div_d(0xffaced973582005f, 0xef56832a358b, 0xffffffffffffffa8);
47*fa50579aSSong Gao     test_div_du(0xffaced973582005f, 0xef56832a358b, 0x11179);
48*fa50579aSSong Gao     test_mod_w(0x7cf18c32, 0xa04da650, 0x1d3f3282);
49*fa50579aSSong Gao     test_mod_wu(0x7cf18c32, 0xc04da650, 0x7cf18c32);
50*fa50579aSSong Gao     test_mod_d(0x7cf18c3200000000, 0xa04da65000000000, 0x1d3f328200000000);
51*fa50579aSSong Gao     test_mod_du(0x7cf18c3200000000, 0xc04da65000000000, 0x7cf18c3200000000);
52*fa50579aSSong Gao 
53*fa50579aSSong Gao     return 0;
54*fa50579aSSong Gao }
55