.include "macros.inc"

test_suite quo

test quou_pp
    movi    a2, 0x5a5a137f
    mov     a3, a2
    movi    a4, 0x137f5a5a
    movi    a6, 0x4
    quou    a5, a2, a4
    assert  eq, a5, a6
    quou    a2, a2, a4
    assert  eq, a2, a6
    quou    a4, a3, a4
    assert  eq, a4, a6
test_end

test quou_np
    movi    a2, 0xa5a5137f
    mov     a3, a2
    movi    a4, 0x137f5a5a
    movi    a6, 0x8
    quou    a5, a2, a4
    assert  eq, a5, a6
    quou    a2, a2, a4
    assert  eq, a2, a6
    quou    a4, a3, a4
    assert  eq, a4, a6
test_end

test quou_pn
    movi    a2, 0x5a5a137f
    mov     a3, a2
    movi    a4, 0xf7315a5a
    movi    a6, 0
    quou    a5, a2, a4
    assert  eq, a5, a6
    quou    a2, a2, a4
    assert  eq, a2, a6
    quou    a4, a3, a4
    assert  eq, a4, a6
test_end

test quou_nn
    movi    a2, 0xf7315a5a
    mov     a3, a2
    movi    a4, 0xa5a5137f
    movi    a6, 0x1
    quou    a5, a2, a4
    assert  eq, a5, a6
    quou    a2, a2, a4
    assert  eq, a2, a6
    quou    a4, a3, a4
    assert  eq, a4, a6
test_end

test quou_exc
    set_vector kernel, 2f
    movi    a2, 0xf7315a5a
    movi    a4, 0x00000000
1:
    quou    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 quos_pp
    movi    a2, 0x5a5a137f
    mov     a3, a2
    movi    a4, 0x137f5a5a
    movi    a6, 0x4
    quos    a5, a2, a4
    assert  eq, a5, a6
    quos    a2, a2, a4
    assert  eq, a2, a6
    quos    a4, a3, a4
    assert  eq, a4, a6
test_end

test quos_np
    movi    a2, 0xa5a5137f
    mov     a3, a2
    movi    a4, 0x137f5a5a
    movi    a6, 0xfffffffc
    quos    a5, a2, a4
    assert  eq, a5, a6
    quos    a2, a2, a4
    assert  eq, a2, a6
    quos    a4, a3, a4
    assert  eq, a4, a6
test_end

test quos_pn
    movi    a2, 0x5a5a137f
    mov     a3, a2
    movi    a4, 0xf7315a5a
    movi    a6, 0xfffffff6
    quos    a5, a2, a4
    assert  eq, a5, a6
    quos    a2, a2, a4
    assert  eq, a2, a6
    quos    a4, a3, a4
    assert  eq, a4, a6
test_end

test quos_nn
    movi    a2, 0xf7315a5a
    mov     a3, a2
    movi    a4, 0xa5a5137f
    movi    a6, 0
    quos    a5, a2, a4
    assert  eq, a5, a6
    quos    a2, a2, a4
    assert  eq, a2, a6
    quos    a4, a3, a4
    assert  eq, a4, a6
test_end

test quos_over
    movi    a2, 0x80000000
    movi    a4, 0xffffffff
    movi    a6, 0x80000000
    quos    a5, a2, a4
    assert  eq, a5, a6
test_end

test quos_exc
    set_vector kernel, 2f
    movi    a2, 0xf7315a5a
    movi    a4, 0x00000000
1:
    quos    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
