#include "macros.inc"

.purgem test
.macro test name
    movi    a2, 1f
    movi    a3, 99f
0:
    ipf     a2, 0
    ipf     a2, 4
    ipf     a2, 8
    ipf     a2, 12
    addi    a2, a2, 16
    blt     a2, a3, 0b
    j       1f
    .align 4
1:
.endm

test_suite pipeline

test register_no_stall
    rsr     a3, ccount
    add     a5, a6, a6
    add     a6, a5, a5
    rsr     a4, ccount
    sub     a3, a4, a3
    assert  eqi, a3, 3
test_end

test register_stall
    l32i    a5, a1, 0   /* data cache preload */
    nop
    rsr     a3, ccount
    l32i    a5, a1, 0
    add     a6, a5, a5  /* M-to-E interlock */
    rsr     a4, ccount
    sub     a3, a4, a3
    assert  eqi, a3, 4
test_end

test j0_stall
    rsr     a3, ccount
    j       1f          /* E + 2-cycle penalty */
1:
    rsr     a4, ccount  /* E */
    sub     a3, a4, a3
    assert  eqi, a3, 4
test_end

test j1_stall
    rsr     a3, ccount
    j       1f
    nop
1:
    rsr     a4, ccount
    sub     a3, a4, a3
    assert  eqi, a3, 4
test_end

test j5_stall
    rsr     a3, ccount
    j       1f
    nop
    nop
    nop
    nop
    nop
1:
    rsr     a4, ccount
    sub     a3, a4, a3
    assert  eqi, a3, 4
test_end

test b_no_stall
    movi    a5, 1
    rsr     a3, ccount
    beqi    a5, 2, 1f
    rsr     a4, ccount
    sub     a3, a4, a3
    assert  eqi, a3, 2
1:
test_end

test b1_stall
    movi    a5, 1
    rsr     a3, ccount
    beqi    a5, 1, 1f
    nop
1:
    rsr     a4, ccount
    sub     a3, a4, a3
    assert  eqi, a3, 4
test_end

test b5_stall
    movi    a5, 1
    rsr     a3, ccount
    beqi    a5, 1, 1f
    nop
    nop
    nop
    nop
    nop
1:
    rsr     a4, ccount
    sub     a3, a4, a3
    assert  eqi, a3, 4
test_end

/* PS *SYNC */

test ps_dsync
    rsr     a5, ps
    isync
    rsr     a3, ccount
    wsr     a5, ps
    dsync
    rsr     a4, ccount
    sub     a3, a4, a3
    assert  eqi, a3, 5
test_end

test ps_esync
    rsr     a5, ps
    isync
    rsr     a3, ccount
    wsr     a5, ps
    esync
    rsr     a4, ccount
    sub     a3, a4, a3
    assert  eqi, a3, 5
test_end

test ps_rsync
    rsr     a5, ps
    isync
    rsr     a3, ccount
    wsr     a5, ps
    rsync
    rsr     a4, ccount
    sub     a3, a4, a3
    assert  eqi, a3, 5
test_end

test ps_isync
    rsr     a5, ps
    isync
    rsr     a3, ccount
    wsr     a5, ps
    isync
    rsr     a4, ccount
    sub     a3, a4, a3
    movi    a4, 9
    assert  eq, a3, a4
test_end

test_suite_end