| #include "core-isa.h" |
| |
| .macro test_suite name |
| .data |
| status: .word result |
| result: .space 1024 |
| .text |
| .global main |
| .align 4 |
| main: |
| .endm |
| |
| .macro reset_ps |
| movi a2, 0x4000f |
| wsr a2, ps |
| isync |
| .endm |
| |
| .macro test_suite_end |
| reset_ps |
| movi a0, status |
| l32i a2, a0, 0 |
| movi a0, result |
| sub a2, a2, a0 |
| movi a3, 0 |
| beqz a2, 2f |
| 1: |
| l32i a1, a0, 0 |
| or a3, a3, a1 |
| addi a0, a0, 4 |
| addi a2, a2, -1 |
| bnez a2, 1b |
| 2: |
| exit |
| .endm |
| |
| .macro print text |
| .data |
| 97: .ascii "\text\n" |
| 98: |
| .align 4 |
| .text |
| movi a2, 4 |
| movi a3, 2 |
| movi a4, 97b |
| movi a5, 98b |
| sub a5, a5, a4 |
| simcall |
| .endm |
| |
| .macro test_init |
| .endm |
| |
| .macro test name |
| #ifdef DEBUG |
| print test_\name |
| #endif |
| test_init |
| test_\name: |
| .global test_\name |
| .endm |
| |
| .macro test_end |
| 99: |
| reset_ps |
| movi a2, status |
| l32i a3, a2, 0 |
| addi a3, a3, 4 |
| s32i a3, a2, 0 |
| .endm |
| |
| .macro exit |
| movi a2, 1 |
| simcall |
| .endm |
| |
| .macro test_fail |
| movi a2, status |
| l32i a2, a2, 0 |
| movi a3, 1 |
| s32i a3, a2, 0 |
| #ifdef DEBUG |
| print failed |
| #endif |
| j 99f |
| .endm |
| |
| .macro assert cond, arg1, arg2 |
| b\cond \arg1, \arg2, 90f |
| test_fail |
| 90: |
| nop |
| .endm |
| |
| .macro set_vector vector, addr |
| movi a2, handler_\vector |
| movi a3, \addr |
| s32i a3, a2, 0 |
| .endm |
| |
| .macro dump r |
| #ifdef DEBUG |
| .data |
| .align 4 |
| 1: .word 0 |
| .text |
| movi a4, 1b |
| s32i a2, a4, 0 |
| movi a2, 4 |
| movi a3, 1 |
| movi a5, 4 |
| simcall |
| movi a4, 1b |
| l32i a2, a4, 0 |
| #endif |
| .endm |
| |
| #define glue(a, b) _glue(a, b) |
| #define _glue(a, b) a ## b |
| |
| #define glue3(a, b, c) _glue3(a, b, c) |
| #define _glue3(a, b, c) a ## b ## c |