xref: /qemu/tests/tcg/xtensa/test_windowed.S (revision 4179575898fcc17c5e67306a357b8dfe64122e8e)
1a2e67072SMax Filippov#include "macros.inc"
27d890b40SMax Filippov
37d890b40SMax Filippovtest_suite windowed
47d890b40SMax Filippov
5*c20e10eaSMax Filippov#if XCHAL_HAVE_WINDOWED
6*c20e10eaSMax Filippov
77d890b40SMax Filippov.altmacro
87d890b40SMax Filippov
97d890b40SMax Filippov.macro reset_window start
10*c20e10eaSMax Filippov    movi    a2, 0xffff
117d890b40SMax Filippov    wsr     a2, windowstart
127d890b40SMax Filippov    rsync
137d890b40SMax Filippov    movi    a2, 0
147d890b40SMax Filippov    wsr     a2, windowbase
157d890b40SMax Filippov    rsync
167d890b40SMax Filippov    movi    a2, \start
177d890b40SMax Filippov    wsr     a2, windowstart
187d890b40SMax Filippov    rsync
197d890b40SMax Filippov.endm
207d890b40SMax Filippov
217d890b40SMax Filippov.macro overflow_test shift, window, probe_ok, probe_ex
227d890b40SMax Filippov    set_vector window_overflow_4, 0
237d890b40SMax Filippov    set_vector window_overflow_8, 0
247d890b40SMax Filippov    set_vector window_overflow_12, 0
257d890b40SMax Filippov
267d890b40SMax Filippov    movi    a2, 1 | (((1 << ((\window) / 4)) | 1) << ((\shift) / 4))
277d890b40SMax Filippov    wsr     a2, windowstart
287d890b40SMax Filippov    reset_ps
297d890b40SMax Filippov
307d890b40SMax Filippov    mov     a2, a\probe_ok
317d890b40SMax Filippov    set_vector window_overflow_\window, 10f
327d890b40SMax Filippov1:
337d890b40SMax Filippov    mov     a2, a\probe_ex
347d890b40SMax Filippov    test_fail
357d890b40SMax Filippov10:
367d890b40SMax Filippov    rsr     a2, epc1
377d890b40SMax Filippov    movi    a3, 1b
387d890b40SMax Filippov    assert  eq, a2, a3
397d890b40SMax Filippov    movi    a2, 2f
407d890b40SMax Filippov    wsr     a2, epc1
417d890b40SMax Filippov
427d890b40SMax Filippov    rsr     a2, windowbase
437d890b40SMax Filippov    movi    a3, (\shift) / 4
447d890b40SMax Filippov    assert  eq, a2, a3
457d890b40SMax Filippov    rsr     a2, ps
467d890b40SMax Filippov    movi    a3, 0x4001f
477d890b40SMax Filippov    assert  eq, a2, a3
487d890b40SMax Filippov    rfwo
497d890b40SMax Filippov    test_fail
507d890b40SMax Filippov2:
517d890b40SMax Filippov    rsr     a2, windowbase
527d890b40SMax Filippov    assert  eqi, a2, 0
537d890b40SMax Filippov    rsr     a2, windowstart
547d890b40SMax Filippov    movi    a3, 1 | ((1 << ((\window) / 4)) << ((\shift) / 4))
557d890b40SMax Filippov    assert  eq, a2, a3
567d890b40SMax Filippov    rsr     a2, ps
577d890b40SMax Filippov    movi    a3, 0x4000f
587d890b40SMax Filippov    assert  eq, a2, a3
597d890b40SMax Filippov.endm
607d890b40SMax Filippov
617d890b40SMax Filippov.macro overflow_tests shift, window, probe
627d890b40SMax Filippov    .if \probe < 15
637d890b40SMax Filippov    overflow_test \shift, \window, %((\shift) - 1), \probe
647d890b40SMax Filippov    overflow_tests \shift, \window, %((\probe) + 1)
657d890b40SMax Filippov    .endif
667d890b40SMax Filippov.endm
677d890b40SMax Filippov
687d890b40SMax Filippov.macro all_overflow_tests
697d890b40SMax Filippov    .irp shift, 4, 8, 12
707d890b40SMax Filippov    .irp window, 4, 8, 12
717d890b40SMax Filippov    overflow_tests \shift, \window, \shift
727d890b40SMax Filippov    .endr
737d890b40SMax Filippov    .endr
747d890b40SMax Filippov.endm
757d890b40SMax Filippov
767d890b40SMax Filippovtest overflow
777d890b40SMax Filippov    all_overflow_tests
787d890b40SMax Filippovtest_end
797d890b40SMax Filippov
807d890b40SMax Filippov
817d890b40SMax Filippov.macro underflow_test window
827d890b40SMax Filippov    set_vector window_underflow_4, 0
837d890b40SMax Filippov    set_vector window_underflow_8, 0
847d890b40SMax Filippov    set_vector window_underflow_12, 0
857d890b40SMax Filippov
867d890b40SMax Filippov    set_vector window_underflow_\window, 10f
877d890b40SMax Filippov
887d890b40SMax Filippov    reset_window 1
897d890b40SMax Filippov    reset_ps
907d890b40SMax Filippov
917d890b40SMax Filippov    ssai    2
927d890b40SMax Filippov    movi    a2, 2f
937d890b40SMax Filippov    slli    a2, a2, 2
947d890b40SMax Filippov    movi    a3, (\window) / 4
957d890b40SMax Filippov    src     a0, a3, a2
967d890b40SMax Filippov1:
977d890b40SMax Filippov    retw
987d890b40SMax Filippov    test_fail
997d890b40SMax Filippov10:
1007d890b40SMax Filippov    rsr     a2, epc1
1017d890b40SMax Filippov    movi    a3, 1b
1027d890b40SMax Filippov    assert  eq, a2, a3
1037d890b40SMax Filippov    movi    a2, 2f
1047d890b40SMax Filippov    wsr     a2, epc1
1057d890b40SMax Filippov
1067d890b40SMax Filippov    rsr     a2, ps
1077d890b40SMax Filippov    movi    a3, 0x4001f
1087d890b40SMax Filippov    assert  eq, a2, a3
1097d890b40SMax Filippov    rsr     a2, windowbase
110*c20e10eaSMax Filippov    movi    a3, (XCHAL_NUM_AREGS - (\window)) / 4
111*c20e10eaSMax Filippov    assert  eq, a2, a3
1127d890b40SMax Filippov    rsr     a2, windowstart
1137d890b40SMax Filippov    assert  eqi, a2, 1
1147d890b40SMax Filippov    rfwu
1157d890b40SMax Filippov2:
1167d890b40SMax Filippov    rsr     a2, ps
1177d890b40SMax Filippov    movi    a3, 0x4000f
1187d890b40SMax Filippov    assert  eq, a2, a3
1197d890b40SMax Filippov    rsr     a2, windowbase
1207d890b40SMax Filippov    assert  eqi, a2, 0
1217d890b40SMax Filippov    rsr     a2, windowstart
122*c20e10eaSMax Filippov    assert  bsi.l, a2, 0
123*c20e10eaSMax Filippov    assert  bsi.l, a2, (XCHAL_NUM_AREGS - (\window)) / 4
1247d890b40SMax Filippov.endm
1257d890b40SMax Filippov
1267d890b40SMax Filippovtest underflow
1277d890b40SMax Filippov    set_vector window_overflow_4, 0
1287d890b40SMax Filippov    set_vector window_overflow_8, 0
1297d890b40SMax Filippov    set_vector window_overflow_12, 0
1307d890b40SMax Filippov
1317d890b40SMax Filippov    underflow_test 4
1327d890b40SMax Filippov    underflow_test 8
1337d890b40SMax Filippov    underflow_test 12
1347d890b40SMax Filippovtest_end
1357d890b40SMax Filippov
1367d890b40SMax Filippov
1377d890b40SMax Filippov.macro retw_test window
138*c20e10eaSMax Filippov    reset_window %(1 | (1 << ((XCHAL_NUM_AREGS - \window) / 4)))
1397d890b40SMax Filippov    reset_ps
1407d890b40SMax Filippov
1417d890b40SMax Filippov    ssai    2
1427d890b40SMax Filippov    movi    a2, 1f
1437d890b40SMax Filippov    slli    a2, a2, 2
1447d890b40SMax Filippov    movi    a3, (\window) / 4
1457d890b40SMax Filippov    src     a0, a3, a2
1467d890b40SMax Filippov    retw
1477d890b40SMax Filippov    test_fail
1487d890b40SMax Filippov1:
1497d890b40SMax Filippov    rsr     a2, ps
1507d890b40SMax Filippov    movi    a3, 0x4000f
1517d890b40SMax Filippov    assert  eq, a2, a3
1527d890b40SMax Filippov    rsr     a2, windowbase
153*c20e10eaSMax Filippov    movi    a3, (XCHAL_NUM_AREGS - (\window)) / 4
154*c20e10eaSMax Filippov    assert  eq, a2, a3
1557d890b40SMax Filippov    rsr     a2, windowstart
156*c20e10eaSMax Filippov    assert  bci.l, a2, 0
157*c20e10eaSMax Filippov    assert  bsi.l, a2, (XCHAL_NUM_AREGS - (\window)) / 4
1587d890b40SMax Filippov.endm
1597d890b40SMax Filippov
1607d890b40SMax Filippovtest retw
1617d890b40SMax Filippov    set_vector window_underflow_4, 0
1627d890b40SMax Filippov    set_vector window_underflow_8, 0
1637d890b40SMax Filippov    set_vector window_underflow_12, 0
1647d890b40SMax Filippov
1657d890b40SMax Filippov    retw_test 4
1667d890b40SMax Filippov    retw_test 8
1677d890b40SMax Filippov    retw_test 12
1687d890b40SMax Filippovtest_end
1697d890b40SMax Filippov
1707d890b40SMax Filippovtest movsp
1717d890b40SMax Filippov    set_vector kernel, 2f
1727d890b40SMax Filippov
1737d890b40SMax Filippov    reset_window 1
1747d890b40SMax Filippov    reset_ps
1757d890b40SMax Filippov1:
1767d890b40SMax Filippov    movsp   a2, a3
1777d890b40SMax Filippov    test_fail
1787d890b40SMax Filippov2:
1797d890b40SMax Filippov    rsr     a2, exccause
1807d890b40SMax Filippov    assert  eqi, a2, 5
1817d890b40SMax Filippov    rsr     a2, epc1
1827d890b40SMax Filippov    movi    a3, 1b
1837d890b40SMax Filippov    assert  eq, a2, a3
1847d890b40SMax Filippov
1857d890b40SMax Filippov    set_vector kernel, 0
1867d890b40SMax Filippov
187*c20e10eaSMax Filippov    reset_window %(0x1 | (1 << ((XCHAL_NUM_AREGS / 4) - 1)))
1887d890b40SMax Filippov    reset_ps
1897d890b40SMax Filippov
1907d890b40SMax Filippov    movsp   a2, a3
1917d890b40SMax Filippovtest_end
1927d890b40SMax Filippov
1937d890b40SMax Filippovtest rotw
1947d890b40SMax Filippov    reset_window 0x4b
1957d890b40SMax Filippov    reset_ps
1967d890b40SMax Filippov
1977d890b40SMax Filippov    movi    a3, 0x10
1987d890b40SMax Filippov
1997d890b40SMax Filippov    rotw    1
2007d890b40SMax Filippov    rsr     a2, windowbase
2017d890b40SMax Filippov    assert  eqi, a2, 1
2027d890b40SMax Filippov    movi    a3, 0x11
2037d890b40SMax Filippov    movi    a7, 0x12
2047d890b40SMax Filippov
2057d890b40SMax Filippov    rotw    2
2067d890b40SMax Filippov    rsr     a2, windowbase
2077d890b40SMax Filippov    assert  eqi, a2, 3
2087d890b40SMax Filippov    movi    a3, 0x13
2097d890b40SMax Filippov    movi    a7, 0x14
2107d890b40SMax Filippov    movi    a11, 0x15
2117d890b40SMax Filippov
2127d890b40SMax Filippov    rotw    3
2137d890b40SMax Filippov    rsr     a2, windowbase
2147d890b40SMax Filippov    assert  eqi, a2, 6
2157d890b40SMax Filippov    movi    a3, 0x16
2167d890b40SMax Filippov    movi    a7, 0x17
2177d890b40SMax Filippov
218*c20e10eaSMax Filippov#if XCHAL_NUM_AREGS == 32
2197d890b40SMax Filippov    movi    a2, 0x44
2207d890b40SMax Filippov    wsr     a2, windowstart
221*c20e10eaSMax Filippov#elif XCHAL_NUM_AREGS == 64
222*c20e10eaSMax Filippov    movi    a2, 0x4004
223*c20e10eaSMax Filippov    wsr     a2, windowstart
224*c20e10eaSMax Filippov    rotw    -8
225*c20e10eaSMax Filippov#else
226*c20e10eaSMax Filippov#error XCHAL_NUM_AREGS unsupported
227*c20e10eaSMax Filippov#endif
2287d890b40SMax Filippov    rsync
2297d890b40SMax Filippov
2307d890b40SMax Filippov    movi    a2, 0x10
2317d890b40SMax Filippov    assert  eq, a2, a11
2327d890b40SMax Filippov    movi    a11, 0x18
2337d890b40SMax Filippov    movi    a2, 0x11
2347d890b40SMax Filippov    assert  eq, a2, a15
2357d890b40SMax Filippov    movi    a15, 0x19
2367d890b40SMax Filippov
2377d890b40SMax Filippov    rotw    4
2387d890b40SMax Filippov    movi    a2, 0x12
2397d890b40SMax Filippov    assert  eq, a2, a3
2407d890b40SMax Filippov    movi    a2, 0x13
2417d890b40SMax Filippov    assert  eq, a2, a7
2427d890b40SMax Filippov    movi    a2, 0x14
2437d890b40SMax Filippov    assert  eq, a2, a11
2447d890b40SMax Filippov    movi    a2, 0x15
2457d890b40SMax Filippov    assert  eq, a2, a15
2467d890b40SMax Filippov
2477d890b40SMax Filippov    movi    a2, 0x5
2487d890b40SMax Filippov    wsr     a2, windowstart
2497d890b40SMax Filippov    rsync
2507d890b40SMax Filippov
2517d890b40SMax Filippov    rotw    -2
2527d890b40SMax Filippov    movi    a2, 0x18
2537d890b40SMax Filippov    assert  eq, a2, a3
2547d890b40SMax Filippov    movi    a2, 0x19
2557d890b40SMax Filippov    assert  eq, a2, a7
2567d890b40SMax Filippovtest_end
2577d890b40SMax Filippov
2587d890b40SMax Filippov.macro callw_test window
2597d890b40SMax Filippov    call\window 2f
2607d890b40SMax Filippov1:
2617d890b40SMax Filippov    test_fail
2627d890b40SMax Filippov    .align  4
2637d890b40SMax Filippov2:
2647d890b40SMax Filippov    rsr     a2, windowbase
2657d890b40SMax Filippov    assert  eqi, a2, 0
2667d890b40SMax Filippov    rsr     a2, ps
2677d890b40SMax Filippov    movi    a3, 0x4000f | ((\window) << 14)
2687d890b40SMax Filippov    assert  eq, a2, a3
2697d890b40SMax Filippov    movi    a2, 1b
2707d890b40SMax Filippov    slli    a2, a2, 2
2717d890b40SMax Filippov    ssai    2
2727d890b40SMax Filippov    movi    a3, (\window) / 4
2737d890b40SMax Filippov    src     a2, a3, a2
2747d890b40SMax Filippov    assert  eq, a2, a\window
2757d890b40SMax Filippov.endm
2767d890b40SMax Filippov
2777d890b40SMax Filippovtest callw
2787d890b40SMax Filippov    reset_window 0x1
2797d890b40SMax Filippov    reset_ps
2807d890b40SMax Filippov
2817d890b40SMax Filippov    callw_test 4
2827d890b40SMax Filippov    callw_test 8
2837d890b40SMax Filippov    callw_test 12
2847d890b40SMax Filippovtest_end
2857d890b40SMax Filippov
2867d890b40SMax Filippov
2877d890b40SMax Filippov.macro entry_test window
2887d890b40SMax Filippov    reset_window 0x1
2897d890b40SMax Filippov    reset_ps
2907d890b40SMax Filippov    movi    a2, 0x4000f | ((\window) << 14)
2917d890b40SMax Filippov    wsr     a2, ps
2927d890b40SMax Filippov    isync
2937d890b40SMax Filippov    movi    a3, 0x12345678
2947d890b40SMax Filippov    j       1f
2957d890b40SMax Filippov    .align  4
2967d890b40SMax Filippov1:
2977d890b40SMax Filippov    entry   a3, 0x5678
2987d890b40SMax Filippov    movi    a2, 0x12340000
2997d890b40SMax Filippov    assert  eq, a2, a3
3007d890b40SMax Filippov    rsr     a2, windowbase
3017d890b40SMax Filippov    assert  eqi, a2, (\window) / 4
3027d890b40SMax Filippov    rsr     a2, windowstart
3037d890b40SMax Filippov    movi    a3, 1 | (1 << ((\window) / 4))
3047d890b40SMax Filippov    assert  eq, a2, a3
3057d890b40SMax Filippov    rotw    -(\window) / 4
3067d890b40SMax Filippov.endm
3077d890b40SMax Filippov
3087d890b40SMax Filippovtest entry
3097d890b40SMax Filippov    entry_test 4
3107d890b40SMax Filippov    entry_test 8
3117d890b40SMax Filippov    entry_test 12
3127d890b40SMax Filippovtest_end
3137d890b40SMax Filippov
31409c7fbefSMax Filippov.macro entry_overflow_test window, free, next_window
31509c7fbefSMax Filippov    set_vector window_overflow_4, 0
31609c7fbefSMax Filippov    set_vector window_overflow_8, 0
31709c7fbefSMax Filippov    set_vector window_overflow_12, 0
31809c7fbefSMax Filippov    set_vector window_overflow_\next_window, 10f
31909c7fbefSMax Filippov
32009c7fbefSMax Filippov    movi    a2, \window
32109c7fbefSMax Filippov    movi    a2, \free
32209c7fbefSMax Filippov    movi    a2, \next_window
32309c7fbefSMax Filippov    reset_window %(1 | ((1 | (1 << ((\next_window) / 4))) << ((\free) / 4)))
32409c7fbefSMax Filippov    reset_ps
32509c7fbefSMax Filippov    movi    a2, 0x4000f | ((\window) << 14)
32609c7fbefSMax Filippov    wsr     a2, ps
32709c7fbefSMax Filippov    isync
32809c7fbefSMax Filippov    movi    a3, 0x12345678
32909c7fbefSMax Filippov    j       1f
33009c7fbefSMax Filippov    .align  4
33109c7fbefSMax Filippov1:
33209c7fbefSMax Filippov    entry   a3, 0x5678
33309c7fbefSMax Filippov    test_fail
33409c7fbefSMax Filippov    .align  4
33509c7fbefSMax Filippov10:
33609c7fbefSMax Filippov    rsr     a2, epc1
33709c7fbefSMax Filippov    movi    a3, 1b
33809c7fbefSMax Filippov    assert  eq, a2, a3
33909c7fbefSMax Filippov    movi    a2, 2f
34009c7fbefSMax Filippov    wsr     a2, epc1
34109c7fbefSMax Filippov
34209c7fbefSMax Filippov    rsr     a2, windowbase
34309c7fbefSMax Filippov    movi    a3, (\free) / 4
34409c7fbefSMax Filippov    assert  eq, a2, a3
34509c7fbefSMax Filippov    rfwo
34609c7fbefSMax Filippov2:
34709c7fbefSMax Filippov.endm
34809c7fbefSMax Filippov
34909c7fbefSMax Filippov.macro all_entry_overflow_tests
35009c7fbefSMax Filippov    .irp window, 4, 8, 12
35109c7fbefSMax Filippov    .irp next_window, 4, 8, 12
35209c7fbefSMax Filippov    .irp free, 4, 8, 12
35309c7fbefSMax Filippov    .if \free <= \window
35409c7fbefSMax Filippov    entry_overflow_test \window, \free, \next_window
35509c7fbefSMax Filippov    .endif
35609c7fbefSMax Filippov    .endr
35709c7fbefSMax Filippov    .endr
35809c7fbefSMax Filippov    .endr
35909c7fbefSMax Filippov.endm
36009c7fbefSMax Filippov
36109c7fbefSMax Filippovtest entry_overflow
36209c7fbefSMax Filippov    all_entry_overflow_tests
36309c7fbefSMax Filippovtest_end
36409c7fbefSMax Filippov
365*c20e10eaSMax Filippov#endif
366*c20e10eaSMax Filippov
3677d890b40SMax Filippovtest_suite_end
368