qemu

FORK: QEMU emulator
git clone https://git.neptards.moe/neptards/qemu.git
Log | Files | Refs | Submodules | LICENSE

test_windowed.S (6981B)


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