| SYS_exit = 1 |
| SYS_write = 4 |
| |
| .bss |
| .space 64 |
| _stack: |
| |
| .data |
| pass_text: |
| .string "pass\n" |
| fail_text: |
| .string "fail\n" |
| |
| .text |
| .global _start |
| _start: |
| movhi hi(_stack), r0, sp |
| movea lo(_stack), sp, sp |
| jr start_test |
| |
| .macro seti val reg |
| movhi hi(\val),r0,\reg |
| movea lo(\val),\reg,\reg |
| .endm |
| |
| _pass_1: |
| mov SYS_write,r6 |
| mov 1,r7 |
| seti pass_text,r8 |
| mov 5,r9 |
| trap 31 |
| |
| mov 0, r7 |
| jr _exit |
| |
| _fail_1: |
| mov SYS_write,r6 |
| mov 1,r7 |
| seti fail_text,r8 |
| mov 5,r9 |
| trap 31 |
| |
| mov 1, r7 |
| jr _exit |
| |
| _exit: |
| mov SYS_exit, r6 |
| mov 0, r8 |
| mov 0, r9 |
| trap 31 |
| |
| _pass: |
| jr _pass_1 |
| |
| _fail: |
| jr _fail_1 |
| |
| .macro pass |
| jr _pass |
| .endm |
| .macro fail |
| jr _fail |
| .endm |
| |
| # These pass or fail if the given flag is set or not set |
| # Currently, it assumed that the code of any test is going to |
| # be less than 256 bytes. Else, we'll have to use a |
| # branch-around-jump design instead. |
| |
| .macro pass_c |
| bc _pass |
| .endm |
| .macro fail_c |
| bc _fail |
| .endm |
| .macro pass_nc |
| bnc _pass |
| .endm |
| .macro fail_nc |
| bnc _fail |
| .endm |
| |
| .macro pass_z |
| bz _pass |
| .endm |
| .macro fail_z |
| bz _fail |
| .endm |
| .macro pass_nz |
| bnz _pass |
| .endm |
| .macro fail_nz |
| bnz _fail |
| .endm |
| |
| .macro pass_v |
| bv _pass |
| .endm |
| .macro fail_v |
| bv _fail |
| .endm |
| .macro pass_nv |
| bnv _pass |
| .endm |
| .macro fail_nv |
| bnv _fail |
| .endm |
| |
| .macro pass_s |
| bn _pass |
| .endm |
| .macro fail_s |
| bn _fail |
| .endm |
| .macro pass_ns |
| bp _pass |
| .endm |
| .macro fail_ns |
| bp _fail |
| .endm |
| |
| .macro pass_sat |
| bsa _pass |
| .endm |
| .macro fail_sat |
| bsa _fail |
| .endm |
| .macro pass_nsat |
| bsa 1f |
| br _pass |
| 1: |
| .endm |
| .macro fail_nsat |
| bsa 1f |
| br _fail |
| 1: |
| .endm |
| |
| # These pass/fail if the given register has/hasn't the specified value in it. |
| |
| .macro pass_req reg val |
| seti \val,r10 |
| cmp r10,\reg |
| be _pass |
| .endm |
| |
| .macro pass_rne reg val |
| seti \val,r10 |
| cmp r10,\reg |
| bne _pass |
| .endm |
| |
| .macro fail_req reg val |
| seti \val,r10 |
| cmp r10,\reg |
| be _fail |
| .endm |
| |
| .macro fail_rne reg val |
| seti \val,r10 |
| cmp r10,\reg |
| bne _fail |
| .endm |
| |
| # convenience version |
| .macro reg reg val |
| seti \val,r10 |
| cmp r10,\reg |
| bne _fail |
| .endm |
| |
| z = 1 |
| nz = 0 |
| s = 2 |
| ns = 0 |
| v = 4 |
| nv = 0 |
| c = 8 |
| nc = 0 |
| sat = 16 |
| nsat = 0 |
| |
| # sat c v s z |
| |
| .macro flags fval |
| stsr psw, r10 |
| movea +(\fval), r0, r9 |
| andi 31, r10, r10 |
| cmp r9, r10 |
| bne _fail |
| .endm |
| |
| .macro noflags |
| stsr psw, r10 |
| andi ~0x1f, r10, r10 |
| ldsr r10, psw |
| .endm |
| |
| .macro allflags |
| stsr psw, r10 |
| ori 0x1f, r10, r10 |
| ldsr r10, psw |
| .endm |
| |
| start_test: |