1# SPIM S20 MIPS simulator.
2# A torture test for the SPIM simulator.
3# Tests for little-endian systems.
4# Run in conjunction with tt.core.s
5#
6# Copyright (c) 1990-2010, James R. Larus.
7# All rights reserved.
8#
9# Redistribution and use in source and binary forms, with or without modification,
10# are permitted provided that the following conditions are met:
11#
12# Redistributions of source code must retain the above copyright notice,
13# this list of conditions and the following disclaimer.
14#
15# Redistributions in binary form must reproduce the above copyright notice,
16# this list of conditions and the following disclaimer in the documentation and/or
17# other materials provided with the distribution.
18#
19# Neither the name of the James R. Larus nor the names of its contributors may be
20# used to endorse or promote products derived from this software without specific
21# prior written permission.
22#
23# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
24# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
25# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
26# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
27# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
28# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
29# GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
30# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
31# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
32# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
33#
34
35
36	.data
37saved_ret_pc:	.word 0		# Holds PC to return from main
38m3:	.asciiz "The next few lines should contain exception error messages\n"
39m4:	.asciiz "Done with exceptions\n\n"
40m5:	.asciiz "Expect an address error exception:\n	"
41m6:	.asciiz "Expect two address error exceptions:\n"
42	.text
43	.globl main
44main:
45	sw $31 saved_ret_pc
46
47	.data
48lb_:	.asciiz "Testing LB\n"
49lbd_:	.byte 1, -1, 0, 128
50lbd1_:	.word 0x76543210, 0xfedcba98
51	.text
52	li $v0 4	# syscall 4 (print_str)
53	la $a0 lb_
54	syscall
55
56	la $2 lbd_
57	lb $3 0($2)
58	bne $3 1 fail
59	lb $3 1($2)
60	bne $3 -1 fail
61	lb $3 2($2)
62	bne $3 0 fail
63	lb $3 3($2)
64	bne $3 0xffffff80 fail
65
66	la $t0 lbd1_
67	lb $t1 0($t0)
68	bne $t1 0x10 fail
69	lb $t1 1($t0)
70	bne $t1 0x32 fail
71	lb $t1 2($t0)
72	bne $t1 0x54 fail
73	lb $t1 3($t0)
74	bne $t1 0x76 fail
75	lb $t1 4($t0)
76	bne $t1 0xffffff98 fail
77	lb $t1 5($t0)
78	bne $t1 0xffffffba fail
79	lb $t1 6($t0)
80	bne $t1 0xffffffdc fail
81	lb $t1 7($t0)
82	bne $t1 0xfffffffe fail
83
84	li $v0 4	# syscall 4 (print_str)
85	la $a0 m5
86	syscall
87
88	li $t5 0x7fffffff
89	lb $3 1000($t5)
90
91
92	.data
93lbu_:	.asciiz "Testing LBU\n"
94	.text
95	li $v0 4	# syscall 4 (print_str)
96	la $a0 lbu_
97	syscall
98
99	la $2 lbd_
100	lbu $3 0($2)
101	bne $3 1 fail
102	lbu $3 1($2)
103	bne $3 0xff fail
104	lbu $3 2($2)
105	bne $3 0 fail
106	lbu $3 3($2)
107	bne $3 128 fail
108
109	la $t0 lbd1_
110	lbu $t1 0($t0)
111	bne $t1 0x10 fail
112	lbu $t1 1($t0)
113	bne $t1 0x32 fail
114	lbu $t1 2($t0)
115	bne $t1 0x54 fail
116	lbu $t1 3($t0)
117	bne $t1 0x76 fail
118	lbu $t1 4($t0)
119	bne $t1 0x98 fail
120	lbu $t1 5($t0)
121	bne $t1 0xba fail
122	lbu $t1 6($t0)
123	bne $t1 0xdc fail
124	lbu $t1 7($t0)
125	bne $t1 0xfe fail
126
127	li $v0 4	# syscall 4 (print_str)
128	la $a0 m5
129	syscall
130
131	li $t5 0x7fffffff
132	lbu $3 1000($t5)
133
134
135	.data
136lwl_:	.asciiz "Testing LWL\n"
137	.align 2
138lwld_:	.byte 0 1 2 3 4 5 6 7
139	.text
140	li $v0 4	# syscall 4 (print_str)
141	la $a0 lwl_
142	syscall
143
144	la $2 lwld_
145	move $3 $0
146	lwl $3 0($2)
147	bne $3 0 fail
148	move $3 $0
149	lwl $3 1($2)
150	bne $3 0x01000000 fail
151	li $3 5
152	lwl $3 1($2)
153	bne $3 0x01000005 fail
154	move $3 $0
155	lwl $3 2($2)
156	bne $3 0x02010000 fail
157	li $3 5
158	lwl $3 2($2)
159	bne $3 0x02010005 fail
160	move $3 $0
161	lwl $3 3($2)
162	bne $3 0x03020100 fail
163	li $3 5
164	lwl $3 3($2)
165	bne $3 0x03020100 fail
166
167	li $v0 4	# syscall 4 (print_str)
168	la $a0 m6
169	syscall
170
171	li $t5 0x7fffffff
172	lwl $3 1000($t5)
173	lwl $3 1001($t5)
174
175
176	.data
177lwr_:	.asciiz "Testing LWR\n"
178	.align 2
179lwrd_:	.byte 0 1 2 3 4 5 6 7
180	.text
181	li $v0 4	# syscall 4 (print_str)
182	la $a0 lwr_
183	syscall
184
185	la $2 lwrd_
186	li $3 0x00000500
187	lwr $3 0($2)
188	bne $3 0x3020100 fail
189	move $3 $0
190	lwr $3 1($2)
191	bne $3 0x30201 fail
192	li $3 0x50000000
193	lwr $3 1($2)
194	bne $3 0x50030201 fail
195	move $3 $0
196	lwr $3 2($2)
197	bne $3 0x0302 fail
198	li $3 0x50000000
199	lwr $3 2($2)
200	bne $3 0x50000302 fail
201
202	li $v0 4	# syscall 4 (print_str)
203	la $a0 m6
204	syscall
205
206	li $t5 0x7fffffff
207	lwr $3 1000($t5)
208	lwr $3 1001($t5)
209
210
211	.data
212sb_:	.asciiz "Testing SB\n"
213	.align 2
214sbd_:	.byte 0, 0, 0, 0
215	.text
216	li $v0 4	# syscall 4 (print_str)
217	la $a0 sb_
218	syscall
219
220	li $3, 1
221	la $2 sbd_
222	sb $3 0($2)
223	lw $4 0($2)
224	bne $4 0x1 fail
225	li $3 2
226	sb $3 1($2)
227	lw $4 0($2)
228	bne $4 0x201 fail
229	li $3 3
230	sb $3 2($2)
231	lw $4 0($2)
232	bne $4 0x30201 fail
233	li $3 4
234	sb $3 3($2)
235	lw $4 0($2)
236	bne $4 0x4030201 fail
237
238
239	li $v0 4	# syscall 4 (print_str)
240	la $a0 m5
241	syscall
242
243	li $t5 0x7fffffff
244	sb $3 1000($t5)
245
246
247	.data
248sh_:	.asciiz "Testing SH\n"
249sh2_:	.asciiz "Expect two address error exceptions:\n"
250	.align 2
251shd_:	.byte 0, 0, 0, 0
252	.text
253	li $v0 4	# syscall 4 (print_str)
254	la $a0 sh_
255	syscall
256
257	li $3, 1
258	la $2 shd_
259	sh $3 0($2)
260	lw $4 0($2)
261	bne $4 0x1 fail
262	li $3 2
263	sh $3 2($2)
264	lw $4 0($2)
265	bne $4 0x20001 fail
266
267	li $v0 4	# syscall 4 (print_str)
268	la $a0 sh2_
269	syscall
270
271	li $t5 0x7fffffff
272	sh $3 1000($t5)
273	sh $3 1001($t5)
274
275
276	.data
277swl_:	.asciiz "Testing SWL\n"
278	.align 2
279swld_:	.word 0 0
280	.text
281	li $v0 4	# syscall 4 (print_str)
282	la $a0 swl_
283	syscall
284
285	la $2 swld_
286	li $3 0x01000000
287	swl $3 0($2)
288	lw $4 0($2)
289	bne $4 0x1 fail
290
291	li $3 0x01020000
292	swl $3 1($2)
293	lw $4 0($2)
294	bne $4 0x0102 fail
295
296	li $3 0x01020300
297	swl $3 2($2)
298	lw $4 0($2)
299	bne $4 0x010203 fail
300
301	li $3 0x01020304
302	swl $3 3($2)
303	lw $4 0($2)
304	bne $4 0x01020304 fail
305
306
307	.data
308swr_:	.asciiz "Testing SWR\n"
309	.align 2
310swrd_:	.word 0 0
311	.text
312	li $v0 4	# syscall 4 (print_str)
313	la $a0 swr_
314	syscall
315
316	la $2 swrd_
317	li $3 1
318	swr $3 0($2)
319	lw $4 0($2)
320	bne $4 1 fail
321
322	li $3 0x0102
323	swr $3 1($2)
324	lw $4 0($2)
325	bne $4 0x10201 fail
326
327	li $3 0x010203
328	swr $3 2($2)
329	lw $4 0($2)
330	bne $4 0x2030201 fail
331
332	li $3 0x01020304
333	swr $3 3($2)
334	lw $4 0($2)
335	bne $4 0x4030201 fail
336
337
338	.data
339ulh_:	.asciiz "Testing ULH\n"
340ulh1_:	.byte 1 2 3 4 5 6 7 8
341ulh2_:	.byte 0xff 0xff
342	.text
343
344	li $v0 4	# syscall 4 (print_str)
345	la $a0 ulh_
346	syscall
347	la $2 ulh1_
348	ulh $3 0($2)
349	bne $3 0x0201 fail
350	ulh $3 1($2)
351	bne $3 0x0302 fail
352	ulh $3 2($2)
353	bne $3 0x0403 fail
354	ulh $3 3($2)
355	bne $3 0x0504 fail
356	ulh $3 4($2)
357	bne $3 0x0605 fail
358	la $2 ulh2_
359	ulh $3 0($2)
360	bne $3 -1 fail
361
362
363	.data
364ulhu_:	.asciiz "Testing ULHU\n"
365	.text
366	li $v0 4	# syscall 4 (print_str)
367	la $a0 ulhu_
368	syscall
369
370	li $v0 4	# syscall 4 (print_str)
371	la $a0 ulhu_
372	syscall
373	la $2 ulh1_
374	ulhu $3 0($2)
375	bne $3 0x0201 fail
376	ulhu $3 1($2)
377	bne $3 0x0302 fail
378	ulhu $3 2($2)
379	bne $3 0x0403 fail
380	ulhu $3 3($2)
381	bne $3 0x0504 fail
382	ulhu $3 4($2)
383	bne $3 0x0605 fail
384	la $2 ulh2_
385	ulhu $3 0($2)
386	bne $3 0xffff fail
387
388
389	.data
390ulw_:	.asciiz "Testing ULW\n"
391	.text
392	li $v0 4	# syscall 4 (print_str)
393	la $a0 ulw_
394	syscall
395
396	la $2 ulh1_
397	ulw $3 0($2)
398	bne $3 0x04030201 fail
399	ulw $3 1($2)
400	bne $3 0x05040302 fail
401	ulw $3 2($2)
402	bne $3 0x06050403 fail
403	ulw $3 3($2)
404	bne $3 0x07060504 fail
405
406
407	.data
408ush_:	.asciiz "Testing USH\n"
409ushd:	.word 0 0
410	.text
411	li $v0 4	# syscall 4 (print_str)
412	la $a0 ush_
413	syscall
414
415	la $2 ushd
416	sw $0 0($2)
417	sw $0 4($2)
418	li $3 0x01020304
419	ush $3 0($2)
420	lw $4 0($2)
421	bne $4 0x0304 fail
422	lw $4 4($2)
423	bne $4 0 fail
424
425	sw $0 0($2)
426	sw $0 4($2)
427	li $3 0x01020304
428	ush $3 1($2)
429	lw $4 0($2)
430	bne $4 0x030400 fail
431	lw $4 4($2)
432	bne $4 0 fail
433
434	sw $0 0($2)
435	sw $0 4($2)
436	li $3 0x01020304
437	ush $3 2($2)
438	lw $4 0($2)
439	bne $4 0x03040000 fail
440	lw $4 4($2)
441	bne $4 0 fail
442
443	sw $0 0($2)
444	sw $0 4($2)
445	li $3 0x01020304
446	ush $3 3($2)
447	lw $4 0($2)
448	bne $4 0x04000000 fail
449	lw $4 4($2)
450	bne $4 0x03 fail
451
452
453	.data
454usw_:	.asciiz "Testing USW\n"
455	.text
456	li $v0 4	# syscall 4 (print_str)
457	la $a0 usw_
458	syscall
459
460	la $2 ushd
461	sw $0 0($2)
462	sw $0 4($2)
463	li $3 -1
464	usw $3 0($2)
465	lw $4 0($2)
466	bne $4 -1 fail
467	lw $4 4($2)
468	bne $4 0 fail
469
470	sw $0 0($2)
471	sw $0 4($2)
472	li $3 -1
473	usw $3 1($2)
474	lw $4 0($2)
475	bne $4 0xffffff00 fail
476	lw $4 4($2)
477	bne $4 0xff fail
478
479	sw $0 0($2)
480	sw $0 4($2)
481	li $3 -1
482	usw $3 2($2)
483	lw $4 0($2)
484	bne $4 0xffff0000 fail
485	lw $4 4($2)
486	bne $4 0xffff fail
487
488	sw $0 0($2)
489	sw $0 4($2)
490	li $3 -1
491	usw $3 3($2)
492	lw $4 0($2)
493	bne $4 0xff000000 fail
494	lw $4 4($2)
495	bne $4 0xffffff fail
496
497
498	.data
499word_:	.asciiz "Testing .WORD\n"
500	.text
501	li $v0 4	# syscall 4 (print_str)
502	la $a0 word_
503	syscall
504
505	.data
506	.align 0
507wordd:	.byte 0x1
508	.word 0x2345678
509	.word 0x9abcdef
510	.text
511	la $2 wordd
512	lwr $3 1($2)
513	lwl $3 4($2)
514	bne $3 0x2345678 fail
515	lwr $3 5($2)
516	lwl $3 8($2)
517	bne $3 0x9abcdef fail
518
519	.data
520	.byte 0
521x:	.word OK	# Forward reference in unaligned data!
522	.text
523	lw $8 x
524	beq $8 $0 fail
525OK:
526
527
528# Done !!!
529	.data
530sm:	.asciiz "\nPassed all tests\n"
531	.text
532	li $v0 4	# syscall 4 (print_str)
533	la $a0 sm
534	syscall
535	lw $31 saved_ret_pc
536	jr $31		# Return from main
537
538
539	.data
540fm:	.asciiz "Failed test\n"
541	.text
542fail:	li $v0 4	# syscall 4 (print_str)
543	la $a0 fm
544	syscall
545	li $v0, 10	# syscall 10 (exit)
546	syscall
547