206 lines
2.3 KiB
PHP
206 lines
2.3 KiB
PHP
|
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:
|