diff options
Diffstat (limited to 'firmware/multest.c')
-rw-r--r-- | firmware/multest.c | 74 |
1 files changed, 70 insertions, 4 deletions
diff --git a/firmware/multest.c b/firmware/multest.c index 93e48df..1706400 100644 --- a/firmware/multest.c +++ b/firmware/multest.c @@ -17,15 +17,35 @@ static uint32_t xorshift32(void) { void multest(void) { - for (int i = 0; i < 10; i++) + for (int i = 0; i < 15; i++) { uint32_t a = xorshift32(); uint32_t b = xorshift32(); + switch (i) + { + case 0: + a = 0x80000000; + b = 0xFFFFFFFF; + break; + case 1: + a = 0; + b = 0; + break; + case 2: + a |= 0x80000000; + b = 0; + break; + case 3: + a &= 0x7FFFFFFF; + b = 0; + break; + } + uint64_t au = a, bu = b; int64_t as = (int32_t)a, bs = (int32_t)b; - print_str("input ["); + print_str("input ["); print_hex(as >> 32, 8); print_str("] "); print_hex(a, 8); @@ -36,7 +56,7 @@ void multest(void) print_chr('\n'); uint32_t h_mul, h_mulh, h_mulhsu, h_mulhu; - print_str("hard "); + print_str("hard mul "); h_mul = hard_mul(a, b); print_hex(h_mul, 8); @@ -55,7 +75,7 @@ void multest(void) print_chr('\n'); uint32_t s_mul, s_mulh, s_mulhsu, s_mulhu; - print_str("soft "); + print_str("soft mul "); s_mul = a * b; print_hex(s_mul, 8); @@ -80,6 +100,52 @@ void multest(void) } print_str(" OK\n"); + + uint32_t h_div, h_divu, h_rem, h_remu; + print_str("hard div "); + + h_div = hard_div(a, b); + print_hex(h_div, 8); + print_str(" "); + + h_divu = hard_divu(a, b); + print_hex(h_divu, 8); + print_str(" "); + + h_rem = hard_rem(a, b); + print_hex(h_rem, 8); + print_str(" "); + + h_remu = hard_remu(a, b); + print_hex(h_remu, 8); + print_chr('\n'); + + uint32_t s_div, s_divu, s_rem, s_remu; + print_str("soft div "); + + s_div = b ? as / bs : 0xffffffff; + print_hex(s_div, 8); + print_str(" "); + + s_divu = b ? au / bu : 0xffffffff; + print_hex(s_divu, 8); + print_str(" "); + + s_rem = b ? as % bs : a; + print_hex(s_rem, 8); + print_str(" "); + + s_remu = b ? au % bu : a; + print_hex(s_remu, 8); + print_str(" "); + + if (s_div != h_div || s_divu != h_divu || s_rem != h_rem || s_remu != h_remu) { + print_str("ERROR!\n"); + __asm__ volatile ("ebreak"); + return; + } + + print_str(" OK\n"); } } |