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