| 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: |