#include "macros.inc"

test_suite rem

test remu_pp
    movi    a2, 0x5a5a137f
    mov     a3, a2
    movi    a4, 0x137f5a5a
    movi    a6, 0x0c5caa17
    remu    a5, a2, a4
    assert  eq, a5, a6
    remu    a2, a2, a4
    assert  eq, a2, a6
    remu    a4, a3, a4
    assert  eq, a4, a6
test_end

test remu_np
    movi    a2, 0xa5a5137f
    mov     a3, a2
    movi    a4, 0x137f5a5a
    movi    a6, 0x9aa40af
    remu    a5, a2, a4
    assert  eq, a5, a6
    remu    a2, a2, a4
    assert  eq, a2, a6
    remu    a4, a3, a4
    assert  eq, a4, a6
test_end

test remu_pn
    movi    a2, 0x5a5a137f
    mov     a3, a2
    movi    a4, 0xf7315a5a
    movi    a6, 0x5a5a137f
    remu    a5, a2, a4
    assert  eq, a5, a6
    remu    a2, a2, a4
    assert  eq, a2, a6
    remu    a4, a3, a4
    assert  eq, a4, a6
test_end

test remu_nn
    movi    a2, 0xf7315a5a
    mov     a3, a2
    movi    a4, 0xa5a5137f
    movi    a6, 0x518c46db
    remu    a5, a2, a4
    assert  eq, a5, a6
    remu    a2, a2, a4
    assert  eq, a2, a6
    remu    a4, a3, a4
    assert  eq, a4, a6
test_end

test remu_exc
    set_vector kernel, 2f
    movi    a2, 0xf7315a5a
    movi    a4, 0x00000000
1:
    remu    a5, a2, a4
    test_fail
2:
    rsr     a2, exccause
    assert  eqi, a2, 6 /* INTEGER_DIVIDE_BY_ZERO_CAUSE */
    rsr     a2, epc1
    movi    a3, 1b
    assert  eq, a2, a3
test_end

test rems_pp
    movi    a2, 0x5a5a137f
    mov     a3, a2
    movi    a4, 0x137f5a5a
    movi    a6, 0x0c5caa17
    rems    a5, a2, a4
    assert  eq, a5, a6
    rems    a2, a2, a4
    assert  eq, a2, a6
    rems    a4, a3, a4
    assert  eq, a4, a6
test_end

test rems_np
    movi    a2, 0xa5a5137f
    mov     a3, a2
    movi    a4, 0x137f5a5a
    movi    a6, 0xf3a27ce7
    rems    a5, a2, a4
    assert  eq, a5, a6
    rems    a2, a2, a4
    assert  eq, a2, a6
    rems    a4, a3, a4
    assert  eq, a4, a6
test_end

test rems_pn
    movi    a2, 0x5a5a137f
    mov     a3, a2
    movi    a4, 0xf7315a5a
    movi    a6, 0x02479b03
    rems    a5, a2, a4
    assert  eq, a5, a6
    rems    a2, a2, a4
    assert  eq, a2, a6
    rems    a4, a3, a4
    assert  eq, a4, a6
test_end

test rems_nn
    movi    a2, 0xf7315a5a
    mov     a3, a2
    movi    a4, 0xa5a5137f
    movi    a6, 0xf7315a5a
    rems    a5, a2, a4
    assert  eq, a5, a6
    rems    a2, a2, a4
    assert  eq, a2, a6
    rems    a4, a3, a4
    assert  eq, a4, a6
test_end

test rems_over
    movi    a2, 0x80000000
    movi    a4, 0xffffffff
    movi    a6, 0
    rems    a5, a2, a4
    assert  eq, a5, a6
test_end

test rems_exc
    set_vector kernel, 2f
    movi    a2, 0xf7315a5a
    movi    a4, 0x00000000
1:
    rems    a5, a2, a4
    test_fail
2:
    rsr     a2, exccause
    assert  eqi, a2, 6 /* INTEGER_DIVIDE_BY_ZERO_CAUSE */
    rsr     a2, epc1
    movi    a3, 1b
    assert  eq, a2, a3
test_end

test_suite_end
