⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 tt.core.s

📁 Spim软件的一些源码。其中有Xspim的
💻 S
📖 第 1 页 / 共 5 页
字号:
# SPIM S20 MIPS simulator.# A torture test for the SPIM simulator.# Core tests for instructions that do not differ on big and little endian systems.## Copyright (C) 1990-2004 James Larus, larus@cs.wisc.edu.# ALL RIGHTS RESERVED.## SPIM is distributed under the following conditions:## You may make copies of SPIM for your own use and modify those copies.## All copies of SPIM must retain my name and copyright notice.## You may not sell SPIM or distributed SPIM in conjunction with a commerical# product or service without the expressed written consent of James Larus.## THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR# IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR# PURPOSE.## $Header: $	.datasaved_ret_pc:	.word 0		# Holds PC to return from mainm3:	.asciiz "The next few lines should contain exception error messages\n"m4:	.asciiz "Done with exceptions\n\n"	.text	.globl mainmain:	sw $31 saved_ret_pc## The first thing to do is to test the exceptions:#	li $v0 4	# syscall 4 (print_str)	la $a0 m3	syscall# Exception 1 (INT) -- Not implemented yet# Exception 4 (ADEL)	li $t0 0x400000	lw $3 1($t0)# Exception 5 (ADES)	sw $3 1($t0)# Exception 6 (IBUS) -- Can't test and continue# Exception 7 (DBUS)	lw $3 10000000($t0)# Exception 8 (SYSCALL) -- Not implemented# Exception 9 (BKPT)	break 0# Exception 10 (RI) -- Not implemented (can't enter bad instructions)# Exception 12 (overflow)	li $t0 0x7fffffff	add $t0 $t0 $t0	li $v0 4	# syscall 4 (print_str)	la $a0 m4	syscall## Try modifying R0#	add $0, $0, 1	bnez $0 fail## Test the timer:#	.datatimer_:	.asciiz "Testing timer\n"	.text	li $v0 4	# syscall 4 (print_str)	la $a0 timer_	syscall	mtc0 $0 $9	# Clear count registertimer1_:	mfc0 $9 $9	bne $9 10 timer1_# Count up to 10## Test .ASCIIZ#	.dataasciiz_:.asciiz "Testing .asciiz\n"str0:	.asciiz ""str1:	.asciiz "a"str2:	.asciiz "bb"str3:	.asciiz "ccc"str4:	.asciiz "dddd"str5:	.asciiz "eeeee"str06:	.asciiz "", "a", "bb", "ccc", "dddd", "eeeee"	.text	li $v0 4	# syscall 4 (print_str)	la $a0 asciiz_	syscall	la $a0 str0	li $a1 6	jal ck_strings	la $a0 str06	li $a1 6	jal ck_strings	j over_strlenck_strings:	move $s0 $a0	move $s1 $ra	li $s2 0l_asciiz1:	move $a0 $s0	jal strlen	bne $v0 $s2 fail	add $s0 $s0 $v0	# skip string	add $s0 $s0 1	# skip null byte	add $s2 1	blt $s2 $a1 l_asciiz1	move $ra $s1	jal $rastrlen:	li $v0 0	# num chars	move $t0 $a0	# str pointerl_strlen1:	lb $t1 0($t0)	add $t0 1	add $v0 1	bnez $t1 l_strlen1	sub $v0 $v0 1	# don't count null byte	jr $31over_strlen:## Now, test each instruction#	.dataadd_:	.asciiz "Testing ADD\n"	.text	li $v0 4	# syscall 4 (print_str)	la $a0 add_	syscall	li $2 1	li $3 -1	add $4, $0, $0	bnez $4 fail	add $4, $0, $2	bne $4 1 fail	add $4, $4, $3	bnez $4 fail	.dataaddi_:	.asciiz "Testing ADDI\n"	.text	li $v0 4	# syscall 4 (print_str)	la $a0 addi_	syscall	addi $4, $0, 0	bnez $4 fail	addi $4, $0, 1	bne $4 1 fail	addi $4, $4, -1	bnez $4 fail	.dataaddiu_:	.asciiz "Testing ADDIU\n"	.text	li $v0 4	# syscall 4 (print_str)	la $a0 addiu_	syscall	addiu $4, $0, 0	bnez $4 fail	addiu $4, $0, 1	bne $4 1 fail	addiu $4, $4, -1	bnez $4 fail	li $2 0x7fffffff	addiu $2 $2 2	# should not trap	bne $2 0x80000001 fail	.dataaddu_:	.asciiz "Testing ADDU\n"	.text	li $v0 4	# syscall 4 (print_str)	la $a0 addu_	syscall	li $2 1	li $3 -1	addu $4, $0, $0	bnez $4 fail	addu $4, $0, $2	bne $4 1 fail	addu $4, $4, $3	bnez $4 fail	li $2 0x7fffffff	addu $2 $2 $2		# should not trap	bne $2 -2 fail	.dataand_:	.asciiz "Testing AND\n"	.text	li $v0 4	# syscall 4 (print_str)	la $a0 and_	syscall	li $2 1	li $3 -1	and $4 $0 $0	bnez $4 fail	and $4 $2 $2	beqz $4 fail	and $4 $2 $3	bne $4 1 fail	.dataandi_:	.asciiz "Testing ANDI\n"	.text	li $v0 4	# syscall 4 (print_str)	la $a0 andi_	syscall	li $2 1	li $3 -1	andi $4 $0 0	bnez $4 fail	and $4 $2 1	beqz $4 fail	and $4 $2 -1	bne $4 1 fail	and $4 $3 -1	bne $4 $3 fail	.databeq_:	.asciiz "Testing BEQ\n"	.text	li $v0 4	# syscall 4 (print_str)	la $a0 beq_	syscall	li $2 -1	li $3 1	beq $0 $0 l1	j faill1:	beq $2 $2 l2	j faill2:	beq $3 $2 fail	beq $2 $2 far_away	# Check long branch	j failcome_back:	li $2 3l2_1:	sub $2 $2 1	bnez $2, l2_1	.databgez_:	.asciiz "Testing BGEZ\n"	.text	li $v0 4	# syscall 4 (print_str)	la $a0 bgez_	syscall	li $2 -1	li $3 1	bgez $0 l3	j faill3:	bgez $3 l4	j faill4:	bgez $2 fail	.databgezal_:.asciiz "Testing BGEZAL\n"	.text	li $v0 4	# syscall 4 (print_str)	la $a0 bgezal_	syscall	li $2 -1	li $3 1	bgezal $0 l5	j fail	bgezal $2 faill5:	bgezal $3 l6l55:	j faill6:	la $4 l55	bne $31 $4 fail	.databgtz_:	.asciiz "Testing BGTZ\n"	.text	li $v0 4	# syscall 4 (print_str)	la $a0 bgtz_	syscall	li $2 -1	li $3 1	bgtz $0 faill7:	bgtz $3 l8	j faill8:	bgtz $2 fail	.datablez_:	.asciiz "Testing BLEZ\n"	.text	li $v0 4	# syscall 4 (print_str)	la $a0 blez_	syscall	li $2 -1	li $3 1	blez $0 l9	j faill9:	blez $2 l10	j faill10:	blez $3 fail	.databltz_:	.asciiz "Testing BLTZ\n"	.text	li $v0 4	# syscall 4 (print_str)	la $a0 bltz_	syscall	li $2 -1	li $3 1	bltz $0 faill11:	bltz $2 l12	j faill12:	bltz $3 fail	.databltzal_:.asciiz "Testing BLTZAL\n"	.text	li $v0 4	# syscall 4 (print_str)	la $a0 bltzal_	syscall	li $2 -1	li $3 1	bltzal $0 fail	bltzal $3 faill13:	bltzal $2 l15l14:	j faill15:	la $4 l14	bne $31 $4 fail	.databne_:	.asciiz "Testing BNE\n"	.text	li $v0 4	# syscall 4 (print_str)	la $a0 bne_	syscall	li $2 -1	li $3 1	bne $0 $0 fail	bne $2 $2 fail	bne $3 $2 l16l16:	.databreak_:	.asciiz "Testing BREAK\nExpect a exception message:\n  "	.text	li $v0 4	# syscall 4 (print_str)	la $a0 break_	syscall	break 3# COPz is not checked	.dataccp_:	.asciiz "Testing move to/from coprocessor control 0/1\n"	.text	li $v0 4	# syscall 4 (print_str)	la $a0 ccp_	syscall	li $2 0x7f7f	ctc0 $2 $3	cfc0 $4 $3	bne $2 $4 fail	li $2 0x7f7f	ctc1 $2 $3	cfc1 $4 $3	bne $2 $4 fail	.dataclo_:	.asciiz "Testing CLO\n"	.text	li $v0 4	# syscall 4 (print_str)	la $a0 clo_	syscall	li $2 0	clo $3 $2	bne $3 0 fail	li $2 0xffffffff	clo $3 $2	bne $3 32 fail	li $2 0xf0000000	clo $3 $2	bne $3 4 fail	.dataclz_:	.asciiz "Testing CLZ\n"	.text	li $v0 4	# syscall 4 (print_str)	la $a0 clz_	syscall	li $2 0	clz $3 $2	bne $3 32 fail	li $2 0xffffffff	clz $3 $2	bne $3 0 fail	li $2 0x0fff0000	clz $3 $2	bne $3 4 fail	.datadiv_:	.asciiz "Testing DIV\n"div2_:	.asciiz "Expect exception caused by divide by 0:\n  "	.text	li $v0 4	# syscall 4 (print_str)	la $a0 div_	syscall	li $2 4	li $3 2	li $4 -2	div $5 $2 $3	bne $5 2 fail	mfhi $5	bne $5 0 fail	div $5 $2 $4	bne $5 -2 fail	mfhi $5	bne $5 0 fail	li $2 0x80000000	li $4 0xffffffff	div $5 $2 $4	# Overflows, but should not cause overflow	li $2 1	li $4 0xffffffff	div $5 $2 $4	bne $5 -1 fail	mfhi $5	bne $5 0 fail	li $v0 4	# syscall 4 (print_str)	la $a0 div2_	syscall	div $5 $2 $0	.datadivu_:	.asciiz "Testing DIVU\n"divu2_:	.asciiz "Expect exception caused by divide by 0:\n  "	.text	li $v0 4	# syscall 4 (print_str)	la $a0 divu_	syscall	li $2 4	li $3 2	li $4 -2	divu $5 $2 $3	bne $5 2 fail	mfhi $5	bne $5 0 fail	divu $0 $2 $3	mflo $5	bne $5 2 fail	mfhi $5	bne $5 0 fail	divu $5 $2 $4	bne $5 0 fail	mfhi $5	bne $5 4 fail	li $2 0x80000000	li $4 0xffffffff	divu $5 $2 $4	# Overflows, but should not cause overflow	li $2 1	li $4 0xffffffff	divu $5 $2 $4	bne $5 0 fail	mfhi $5	bne $5 1 fail	li $v0 4	# syscall 4 (print_str)	la $a0 divu2_	syscall	divu $5 $2 $0	.dataj_:	.asciiz "Testing J\n"	.text	li $v0 4	# syscall 4 (print_str)	la $a0 j_	syscall	j l17	j fail	.ktext	nop		# These instructions aren't executed, but	j l17a		# cause parser errors since high 4 bitsl17a:			# don't match	j l17b	.textl17b:	nop	j l17a	# Correctly flagged as error here.l17:	.datajal_:	.asciiz "Testing JAL\n"	.text	li $v0 4	# syscall 4 (print_str)	la $a0 jal_	syscall	jal l18l19:	j l20l18:	la $4 l19	bne $31 $4 fail	jr $31l20:	.datajalr_:	.asciiz "Testing JALR\n"jalr2_:	.asciiz "Expect an non-word boundary exception:\n  "	.text	li $v0 4	# syscall 4 (print_str)	la $a0 jalr_	syscall	la $2 l21	jalr $3, $2l23:	j l22l21:	la $4 l23	bne $3 $4 fail	jr $3l22:	la $2 l21a	jalr $2l23a:	j l22al21a:	la $4 l23a	bne $31 $4 fail	jr $31l22a:	li $v0 4	# syscall 4 (print_str)	la $a0 jalr2_	syscall	la $2 l24	add $2 $2 2l24:	jalr $3 $2	.datajr_:	.asciiz "Testing JR\n"jr2_:	.asciiz "Expect an non-word boundary exception:\n  "	.text	li $v0 4	# syscall 4 (print_str)	la $a0 jr_	syscall	la $2 l25	jr $2	j faill25:	li $v0 4	# syscall 4 (print_str)	la $a0 jr2_	syscall	la $2 l27	add $2 $2 2l27:	jr $2	.datala_:	.asciiz "Testing LA\n"	.text	li $v0 4	# syscall 4 (print_str)	la $a0 la_	syscall	# Simple cases already tested	li $4 101	la $5 10($4)	bne $5 111 fail# LB is endian-specific# LBU is endian-specific	.datald_:	.asciiz "Testing LD\n"ld2_:	.asciiz "Expect four address error exceptions:\n"ldd_:	.word 1, -1, 0, 0x8000000	.text	li $v0 4	# syscall 4 (print_str)	la $a0 ld_	syscall	la $2 ldd_	ld $3 0($2)	bne $3 1 fail	bne $4 -1 fail	ld $3 8($2)	bne $3 0 fail	bne $4 0x8000000 fail	li $v0 4	# syscall 4 (print_str)	la $a0 ld2_	syscall	li $t5 0x7fffffff	ld $3 1000($t5)	ld $3 1001($t5)# LDC2 not tested# LWC2 not tested	.datalh_:	.asciiz "Testing LH\n"lh2_:	.asciiz "Expect two address error exceptions:\n"lhd_:	.half 1, -1, 0, 0x8000	.text	li $v0 4	# syscall 4 (print_str)	la $a0 lh_	syscall	la $2 lhd_	lh $3 0($2)	bne $3 1 fail	lh $3 2($2)	bne $3 -1 fail	lh $3 4($2)	bne $3 0 fail	lh $3 6($2)	bne $3 0xffff8000 fail	li $v0 4	# syscall 4 (print_str)	la $a0 lh2_	syscall	li $t5 0x7fffffff	lh $3 1000($t5)	lh $3 1001($t5)	.datalhu_:	.asciiz "Testing LHU\n"	.text	li $v0 4	# syscall 4 (print_str)	la $a0 lhu_	syscall	la $2 lhd_	lhu $3 0($2)	bne $3 1 fail	lhu $3 2($2)	bne $3 0xffff fail	lhu $3 4($2)	bne $3 0 fail	lhu $3 6($2)	bne $3 0x8000 fail	li $v0 4	# syscall 4 (print_str)	la $a0 lh2_	syscall	li $t5 0x7fffffff	lhu $3 1000($t5)	lhu $3 1001($t5)	.datall_:	.asciiz "Testing LL\n"ll1:	.word 10	.text	li $v0 4	# syscall 4 (print_str)	la $a0 ll_	syscall	ll $2 ll1	bne $2 10 fail	add $2 $2 1	sc $2 ll1	lw $3 ll1	bne $2 $3 fail	.datalui_:	.asciiz "Testing LUI\n"	.text	li $v0 4	# syscall 4 (print_str)	la $a0 lui_	syscall	lui $2 0	bne $2 $0 fail	lui $2 1	srl $2 $2 16	addiu $2 $2 -1	# Don't do compare directly since it uses LUI	bne $2 $0 fail	lui $2 1	andi $2 $2 0xffff	bne $2 $0 fail	lui $2 0xffff	srl $2 $2 16	addiu $2 $2 1	andi $2 $2 0xffff	bne $2 $0 fail	.datalw_:	.asciiz "Testing LW\n"lwd_:	.word 1, -1, 0, 0x8000000	.text	li $v0 4	# syscall 4 (print_str)	la $a0 lw_	syscall	la $2 lwd_	lw $3 0($2)	bne $3 1 fail	lw $3 4($2)	bne $3 -1 fail	lw $3 8($2)	bne $3 0 fail	lw $3 12($2)	bne $3 0x8000000 fail	li $2, 0	lw $3 lwd_($2)	bne $3 1 fail	addi $2, $2, 4	lw $3 lwd_($2)	bne $3 -1 fail	addi $2, $2, 4	lw $3 lwd_($2)	bne $3 0 fail	addi $2, $2, 4	lw $3 lwd_($2)	bne $3 0x8000000 fail	la $2 lwd_	add $2 $2 12	lw $3 -12($2)	bne $3 1 fail	lw $3 -8($2)	bne $3 -1 fail	lw $3 -4($2)	bne $3 0 fail	lw $3 0($2)	bne $3 0x8000000 fail	li $v0 4	# syscall 4 (print_str)	la $a0 lh2_	syscall	li $t5 0x7fffffff	lw $3 1000($t5)	lw $3 1001($t5)# LWL is endian-specific# LWR is endian-specific	.datamadd_:	.asciiz "Testing MADD\n"	.text	li $v0 4	# syscall 4 (print_str)	la $a0 madd_	syscall	mthi $0	mtlo $0	madd $0 $0	mfhi $3	bnez $3 fail	mflo $3	bnez $3 fail	li $4, 1	madd $4 $4	mfhi $3	bnez $3 fail	mflo $3	bne $3 1 fail	li $4, -1	madd $3 $4	mfhi $3	bnez $3 fail	mflo $3	bnez $3 fail	li $4, 0x10000	madd $4 $4	mfhi $3	bne $3 1 fail	mflo $3	bne $3 0 fail	li $4, 0x10000	madd $4 $4	mfhi $3	bne $3 2 fail	mflo $3	bne $3 0 fail	.datamaddu_:	.asciiz "Testing MADDU\n"	.text	li $v0 4	# syscall 4 (print_str)	la $a0 maddu_	syscall	mthi $0	mtlo $0	maddu $0 $0	mfhi $3	bnez $3 fail	mflo $3	bnez $3 fail	li $4, 1	maddu $4 $4	mfhi $3	bnez $3 fail	mflo $3	bne $3 1 fail	li $4, -1	maddu $4 $4	mfhi $3	bne $3 0xfffffffe fail	mflo $3	bne $3 2 fail	.datamcp_:	.asciiz "Testing move to/from coprocessor z\n"	.text	li $v0 4	# syscall 4 (print_str)	la $a0 mcp_	syscall	li $2 0x7f7f	mtc0 $2 $3	mfc0 $4 $3	bne $2 $4 fail	li $2 0x7f7f	mtc1 $2 $3	mfc1 $4 $f3	bne $2 $4 fail	li $2 0x7f7f	li $3 0xf7f7	mtc1.d $2 $4	mfc1.d $6 $4	bne $2 $6 fail	bne $3 $7 fail	.datahilo_:	.asciiz "Testing move to/from HI/LO\n"	.text	li $v0 4	# syscall 4 (print_str)	la $a0 hilo_	syscall

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -