1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205
|
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:
|