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