qemu/tests/tcg/xtensa/test_windowed.S
<<
>>
Prefs
   1#include "macros.inc"
   2
   3test_suite windowed
   4
   5.altmacro
   6
   7.macro reset_window start
   8    movi    a2, 0xff
   9    wsr     a2, windowstart
  10    rsync
  11    movi    a2, 0
  12    wsr     a2, windowbase
  13    rsync
  14    movi    a2, \start
  15    wsr     a2, windowstart
  16    rsync
  17.endm
  18
  19.macro overflow_test shift, window, probe_ok, probe_ex
  20    set_vector window_overflow_4, 0
  21    set_vector window_overflow_8, 0
  22    set_vector window_overflow_12, 0
  23
  24    movi    a2, 1 | (((1 << ((\window) / 4)) | 1) << ((\shift) / 4))
  25    wsr     a2, windowstart
  26    reset_ps
  27
  28    mov     a2, a\probe_ok
  29    set_vector window_overflow_\window, 10f
  301:
  31    mov     a2, a\probe_ex
  32    test_fail
  3310:
  34    rsr     a2, epc1
  35    movi    a3, 1b
  36    assert  eq, a2, a3
  37    movi    a2, 2f
  38    wsr     a2, epc1
  39
  40    rsr     a2, windowbase
  41    movi    a3, (\shift) / 4
  42    assert  eq, a2, a3
  43    rsr     a2, ps
  44    movi    a3, 0x4001f
  45    assert  eq, a2, a3
  46    rfwo
  47    test_fail
  482:
  49    rsr     a2, windowbase
  50    assert  eqi, a2, 0
  51    rsr     a2, windowstart
  52    movi    a3, 1 | ((1 << ((\window) / 4)) << ((\shift) / 4))
  53    assert  eq, a2, a3
  54    rsr     a2, ps
  55    movi    a3, 0x4000f
  56    assert  eq, a2, a3
  57.endm
  58
  59.macro overflow_tests shift, window, probe
  60    .if \probe < 15
  61    overflow_test \shift, \window, %((\shift) - 1), \probe
  62    overflow_tests \shift, \window, %((\probe) + 1)
  63    .endif
  64.endm
  65
  66.macro all_overflow_tests
  67    .irp shift, 4, 8, 12
  68    .irp window, 4, 8, 12
  69    overflow_tests \shift, \window, \shift
  70    .endr
  71    .endr
  72.endm
  73
  74test overflow
  75    all_overflow_tests
  76test_end
  77
  78
  79.macro underflow_test window
  80    set_vector window_underflow_4, 0
  81    set_vector window_underflow_8, 0
  82    set_vector window_underflow_12, 0
  83
  84    set_vector window_underflow_\window, 10f
  85
  86    reset_window 1
  87    reset_ps
  88
  89    ssai    2
  90    movi    a2, 2f
  91    slli    a2, a2, 2
  92    movi    a3, (\window) / 4
  93    src     a0, a3, a2
  941:
  95    retw
  96    test_fail
  9710:
  98    rsr     a2, epc1
  99    movi    a3, 1b
 100    assert  eq, a2, a3
 101    movi    a2, 2f
 102    wsr     a2, epc1
 103
 104    rsr     a2, ps
 105    movi    a3, 0x4001f
 106    assert  eq, a2, a3
 107    rsr     a2, windowbase
 108    assert  eqi, a2, 8 - ((\window) / 4)
 109    rsr     a2, windowstart
 110    assert  eqi, a2, 1
 111    rfwu
 1122:
 113    rsr     a2, ps
 114    movi    a3, 0x4000f
 115    assert  eq, a2, a3
 116    rsr     a2, windowbase
 117    assert  eqi, a2, 0
 118    rsr     a2, windowstart
 119    assert  bsi, a2, 0
 120    assert  bsi, a2, 8 - ((\window) / 4)
 121.endm
 122
 123test underflow
 124    set_vector window_overflow_4, 0
 125    set_vector window_overflow_8, 0
 126    set_vector window_overflow_12, 0
 127
 128    underflow_test 4
 129    underflow_test 8
 130    underflow_test 12
 131test_end
 132
 133
 134.macro retw_test window
 135    reset_window %(1 | (1 << (8 - (\window) / 4)))
 136    reset_ps
 137
 138    ssai    2
 139    movi    a2, 1f
 140    slli    a2, a2, 2
 141    movi    a3, (\window) / 4
 142    src     a0, a3, a2
 143    retw
 144    test_fail
 1451:
 146    rsr     a2, ps
 147    movi    a3, 0x4000f
 148    assert  eq, a2, a3
 149    rsr     a2, windowbase
 150    assert  eqi, a2, 8 - ((\window) / 4)
 151    rsr     a2, windowstart
 152    assert  bci, a2, 0
 153    assert  bsi, a2, 8 - ((\window) / 4)
 154.endm
 155
 156test retw
 157    set_vector window_underflow_4, 0
 158    set_vector window_underflow_8, 0
 159    set_vector window_underflow_12, 0
 160
 161    retw_test 4
 162    retw_test 8
 163    retw_test 12
 164test_end
 165
 166test movsp
 167    set_vector kernel, 2f
 168
 169    reset_window 1
 170    reset_ps
 1711:
 172    movsp   a2, a3
 173    test_fail
 1742:
 175    rsr     a2, exccause
 176    assert  eqi, a2, 5
 177    rsr     a2, epc1
 178    movi    a3, 1b
 179    assert  eq, a2, a3
 180
 181    set_vector kernel, 0
 182
 183    reset_window 0x81
 184    reset_ps
 185
 186    movsp   a2, a3
 187test_end
 188
 189test rotw
 190    reset_window 0x4b
 191    reset_ps
 192
 193    movi    a3, 0x10
 194
 195    rotw    1
 196    rsr     a2, windowbase
 197    assert  eqi, a2, 1
 198    movi    a3, 0x11
 199    movi    a7, 0x12
 200
 201    rotw    2
 202    rsr     a2, windowbase
 203    assert  eqi, a2, 3
 204    movi    a3, 0x13
 205    movi    a7, 0x14
 206    movi    a11, 0x15
 207
 208    rotw    3
 209    rsr     a2, windowbase
 210    assert  eqi, a2, 6
 211    movi    a3, 0x16
 212    movi    a7, 0x17
 213
 214    movi    a2, 0x44
 215    wsr     a2, windowstart
 216    rsync
 217
 218    movi    a2, 0x10
 219    assert  eq, a2, a11
 220    movi    a11, 0x18
 221    movi    a2, 0x11
 222    assert  eq, a2, a15
 223    movi    a15, 0x19
 224
 225    rotw    4
 226    movi    a2, 0x12
 227    assert  eq, a2, a3
 228    movi    a2, 0x13
 229    assert  eq, a2, a7
 230    movi    a2, 0x14
 231    assert  eq, a2, a11
 232    movi    a2, 0x15
 233    assert  eq, a2, a15
 234
 235    movi    a2, 0x5
 236    wsr     a2, windowstart
 237    rsync
 238
 239    rotw    -2
 240    movi    a2, 0x18
 241    assert  eq, a2, a3
 242    movi    a2, 0x19
 243    assert  eq, a2, a7
 244test_end
 245
 246.macro callw_test window
 247    call\window 2f
 2481:
 249    test_fail
 250    .align  4
 2512:
 252    rsr     a2, windowbase
 253    assert  eqi, a2, 0
 254    rsr     a2, ps
 255    movi    a3, 0x4000f | ((\window) << 14)
 256    assert  eq, a2, a3
 257    movi    a2, 1b
 258    slli    a2, a2, 2
 259    ssai    2
 260    movi    a3, (\window) / 4
 261    src     a2, a3, a2
 262    assert  eq, a2, a\window
 263.endm
 264
 265test callw
 266    reset_window 0x1
 267    reset_ps
 268
 269    callw_test 4
 270    callw_test 8
 271    callw_test 12
 272test_end
 273
 274
 275.macro entry_test window
 276    reset_window 0x1
 277    reset_ps
 278    movi    a2, 0x4000f | ((\window) << 14)
 279    wsr     a2, ps
 280    isync
 281    movi    a3, 0x12345678
 282    j       1f
 283    .align  4
 2841:
 285    entry   a3, 0x5678
 286    movi    a2, 0x12340000
 287    assert  eq, a2, a3
 288    rsr     a2, windowbase
 289    assert  eqi, a2, (\window) / 4
 290    rsr     a2, windowstart
 291    movi    a3, 1 | (1 << ((\window) / 4))
 292    assert  eq, a2, a3
 293    rotw    -(\window) / 4
 294.endm
 295
 296test entry
 297    entry_test 4
 298    entry_test 8
 299    entry_test 12
 300test_end
 301
 302.macro entry_overflow_test window, free, next_window
 303    set_vector window_overflow_4, 0
 304    set_vector window_overflow_8, 0
 305    set_vector window_overflow_12, 0
 306    set_vector window_overflow_\next_window, 10f
 307
 308    movi    a2, \window
 309    movi    a2, \free
 310    movi    a2, \next_window
 311    reset_window %(1 | ((1 | (1 << ((\next_window) / 4))) << ((\free) / 4)))
 312    reset_ps
 313    movi    a2, 0x4000f | ((\window) << 14)
 314    wsr     a2, ps
 315    isync
 316    movi    a3, 0x12345678
 317    j       1f
 318    .align  4
 3191:
 320    entry   a3, 0x5678
 321    test_fail
 322    .align  4
 32310:
 324    rsr     a2, epc1
 325    movi    a3, 1b
 326    assert  eq, a2, a3
 327    movi    a2, 2f
 328    wsr     a2, epc1
 329
 330    rsr     a2, windowbase
 331    movi    a3, (\free) / 4
 332    assert  eq, a2, a3
 333    rfwo
 3342:
 335.endm
 336
 337.macro all_entry_overflow_tests
 338    .irp window, 4, 8, 12
 339    .irp next_window, 4, 8, 12
 340    .irp free, 4, 8, 12
 341    .if \free <= \window
 342    entry_overflow_test \window, \free, \next_window
 343    .endif
 344    .endr
 345    .endr
 346    .endr
 347.endm
 348
 349test entry_overflow
 350    all_entry_overflow_tests
 351test_end
 352
 353test_suite_end
 354