Line 33... |
Line 33... |
.set TEST_BREAK, 1 # BREAK instruction
|
.set TEST_BREAK, 1 # BREAK instruction
|
# WARNING: the assembler expands div instructions, see 'as' manual
|
# WARNING: the assembler expands div instructions, see 'as' manual
|
.set TEST_DIV, 1 # DIV* instructions
|
.set TEST_DIV, 1 # DIV* instructions
|
.set TEST_MUL, 1 # MUL* instructions
|
.set TEST_MUL, 1 # MUL* instructions
|
.set USE_CACHE, 1 # Initialize and enable cache
|
.set USE_CACHE, 1 # Initialize and enable cache
|
|
.set EMU_MIPS32, 1 # Emulates selected MIPS32 opcodes
|
|
|
.set ICACHE_NUM_LINES, 256 # no. of lines in the I-Cache
|
.set ICACHE_NUM_LINES, 256 # no. of lines in the I-Cache
|
.set DCACHE_NUM_LINES, 256 # no. of lines in the D-Cache
|
.set DCACHE_NUM_LINES, 256 # no. of lines in the D-Cache
|
.set DCACHE_LINE_SIZE, 4 # D-Cache line size in words
|
.set DCACHE_LINE_SIZE, 4 # D-Cache line size in words
|
|
|
Line 80... |
Line 81... |
bne $k0,$k1,trap_invalid
|
bne $k0,$k1,trap_invalid
|
nop
|
nop
|
|
|
# Unimplemented instruction
|
# Unimplemented instruction
|
trap_unimplemented:
|
trap_unimplemented:
|
|
.ifgt EMU_MIPS32
|
|
# jump to mips32 opcode emulator with c0_cause in $k0
|
|
j opcode_emu
|
|
nop
|
|
.else
|
|
# just do some simple arith so the opcode tester knows we were here
|
j trap_return
|
j trap_return
|
add $4,$4,4
|
add $4,$4,4
|
|
.endif
|
|
|
# Break instruction
|
# Break instruction
|
trap_break:
|
trap_break:
|
j trap_return
|
j trap_return
|
add $4,$4,5
|
add $4,$4,5
|
|
|
# Syscall instruction
|
# Syscall instruction
|
trap_syscall:
|
trap_syscall:
|
|
mfc0 $k0,$12 # test behavior of rfe: invert bit IE of SR...
|
|
xori $k0,0x01
|
|
mtc0 $k0,$12 # ...and see (in the @log) if rfe recovers it
|
j trap_return
|
j trap_return
|
add $4,$4,6
|
add $4,$4,6
|
|
|
# Invalid trap cause code, most likely hardware bug
|
# Invalid trap cause code, most likely hardware bug
|
trap_invalid:
|
trap_invalid:
|
Line 110... |
Line 121... |
jr $k1
|
jr $k1
|
nop
|
nop
|
trap_return_delay_slot:
|
trap_return_delay_slot:
|
addi $k1,$k1,4 # skip jump instruction too
|
addi $k1,$k1,4 # skip jump instruction too
|
jr $k1 # (we just added 8 to epc)
|
jr $k1 # (we just added 8 to epc)
|
nop
|
rfe
|
|
|
|
|
StartTest:
|
StartTest:
|
.ifgt USE_CACHE
|
.ifgt USE_CACHE
|
jal setup_cache
|
jal setup_cache
|
nop
|
nop
|
.else
|
.else
|
mtc0 $0,$12 # disable interrupts, disable cache
|
ori $k0,$zero,0x1
|
|
mtc0 $k0,$12 # disable interrupts and cache, stay in kernel
|
.endif
|
.endif
|
|
|
li $k0,0x00020000 # enter user mode
|
li $k0,0x00020000 # enter user mode...
|
mtc0 $k0,$12
|
mtc0 $k0,$12 # ...NOW
|
|
mfc0 $k0,$12 # verify COP* in user mode triggers trap (@log)
|
ori $k0,0x01
|
ori $k0,0x01
|
mtc0 $k0,$12 # verify COP* in user mode triggers trap (@log)
|
mtc0 $k0,$12 # verify COP* in user mode triggers trap (@log)
|
|
# The two above COP0s should trigger a trap. The 1st one tests the delay in
|
|
# entering user mode.
|
|
|
|
# The rest of the tests proceed in user mode (not that there's much
|
|
# difference...)
|
|
|
|
lui $20,0x2000 # serial port write address
|
|
ori $21,$0,'\n' # <CR> character
|
|
ori $22,$0,'X' # 'X' letter
|
|
ori $23,$0,'\r'
|
|
ori $24,$0,0x0f80 # temp memory
|
|
|
|
sb $23,0($20) # Write a message to console
|
|
sb $21,0($20)
|
|
sb $23,0($20)
|
|
sb $21,0($20)
|
|
sb $23,0($20)
|
|
sb $21,0($20)
|
|
sb $23,0($20)
|
|
sb $21,0($20)
|
|
|
lui $20,0x2000 # serial port write address
|
|
ori $21,$0,'\n' # <CR> character
|
|
ori $22,$0,'X' # 'X' letter
|
|
ori $23,$0,'\r'
|
|
ori $24,$0,0x0f80 # temp memory
|
|
|
|
sb $23,0($20) # test a bunch of byte-wide stores
|
|
sb $21,0($20)
|
|
sb $23,0($20)
|
|
sb $21,0($20)
|
|
sb $23,0($20)
|
|
sb $21,0($20)
|
|
sb $23,0($20)
|
|
sb $21,0($20)
|
|
|
|
######################################
|
######################################
|
#Arithmetic Instructions
|
#Arithmetic Instructions
|
######################################
|
######################################
|
ArthmeticTest:
|
ArthmeticTest:
|
ori $2,$0,'A'
|
ori $2,$0,'A'
|
sb $2,0($20)
|
sb $2,0($20)
|
ori $2,$0,'r'
|
ori $2,$0,'r'
|
sb $2,0($20)
|
sb $2,0($20)
|
ori $2,$0,'i'
|
ori $2,$0,'i'
|
sb $2,0($20)
|
sb $2,0($20)
|
ori $2,$0,'t'
|
ori $2,$0,'t'
|
sb $2,0($20)
|
sb $2,0($20)
|
ori $2,$0,'h'
|
ori $2,$0,'h'
|
sb $2,0($20)
|
sb $2,0($20)
|
sb $23,0($20)
|
sb $23,0($20)
|
sb $21,0($20)
|
sb $21,0($20)
|
|
|
#a: ADD
|
#a: ADD
|
ori $2,$0,'a'
|
ori $2,$0,'a'
|
sb $2,0($20)
|
sb $2,0($20)
|
ori $3,$0,5
|
ori $3,$0,5
|
ori $4,$0,60
|
ori $4,$0,60
|
add $2,$3,$4
|
add $2,$3,$4
|
sb $2,0($20) #A
|
sb $2,0($20) #A
|
sb $23,0($20)
|
sb $23,0($20)
|
sb $21,0($20)
|
sb $21,0($20)
|
|
|
#b: ADDI
|
#b: ADDI
|
ori $2,$0,'b'
|
ori $2,$0,'b'
|
sb $2,0($20)
|
sb $2,0($20)
|
ori $4,$0,60
|
ori $4,$0,60
|
addi $2,$4,5
|
addi $2,$4,5
|
sb $2,0($20) #A
|
sb $2,0($20) #A
|
sb $23,0($20)
|
sb $23,0($20)
|
sb $21,0($20)
|
sb $21,0($20)
|
|
|
#c: ADDIU
|
#c: ADDIU
|
ori $2,$0,'c'
|
ori $2,$0,'c'
|
sb $2,0($20)
|
sb $2,0($20)
|
ori $4,$0,50
|
ori $4,$0,50
|
addiu $5,$4,15
|
addiu $5,$4,15
|
sb $5,0($20) #A
|
sb $5,0($20) #A
|
sb $23,0($20)
|
sb $23,0($20)
|
sb $21,0($20)
|
sb $21,0($20)
|
|
|
#d: ADDU
|
#d: ADDU
|
ori $2,$0,'d'
|
ori $2,$0,'d'
|
sb $2,0($20)
|
sb $2,0($20)
|
ori $3,$0,5
|
ori $3,$0,5
|
ori $4,$0,60
|
ori $4,$0,60
|
add $2,$3,$4
|
add $2,$3,$4
|
sb $2,0($20) #A
|
sb $2,0($20) #A
|
sb $23,0($20)
|
sb $23,0($20)
|
sb $21,0($20)
|
sb $21,0($20)
|
|
|
# DIV tests, skip conditionally
|
# DIV tests, skip conditionally
|
.ifgt TEST_DIV
|
.ifgt TEST_DIV
|
|
|
#e: DIV
|
#e: DIV
|
ori $2,$0,'e'
|
ori $2,$0,'e'
|
sb $2,0($20)
|
sb $2,0($20)
|
ori $2,$0,65*117+41
|
ori $2,$0,65*117+41
|
ori $3,$0,117
|
ori $3,$0,117
|
div $2,$3
|
div $2,$3
|
nop
|
nop
|
mflo $4
|
mflo $4
|
sb $4,0($20) #A
|
sb $4,0($20) #A
|
mfhi $4
|
mfhi $4
|
addi $4,$4,66-41
|
addi $4,$4,66-41
|
sb $4,0($20) #B
|
sb $4,0($20) #B
|
li $2,-67*19
|
li $2,-67*19
|
ori $3,$0,19
|
ori $3,$0,19
|
div $2,$3
|
div $2,$3
|
nop
|
nop
|
mflo $4
|
mflo $4
|
sub $4,$0,$4
|
sub $4,$0,$4
|
sb $4,0($20) #C
|
sb $4,0($20) #C
|
ori $2,$0,68*23
|
ori $2,$0,68*23
|
li $3,-23
|
li $3,-23
|
div $2,$3
|
div $2,$3
|
nop
|
nop
|
mflo $4
|
mflo $4
|
sub $4,$0,$4
|
sub $4,$0,$4
|
sb $4,0($20) #D
|
sb $4,0($20) #D
|
li $2,-69*13
|
li $2,-69*13
|
li $3,-13
|
li $3,-13
|
div $2,$3
|
div $2,$3
|
mflo $4
|
mflo $4
|
sb $4,0($20) #E
|
sb $4,0($20) #E
|
sb $23,0($20)
|
sb $23,0($20)
|
sb $21,0($20)
|
sb $21,0($20)
|
|
|
#f: DIVU
|
#f: DIVU
|
ori $2,$0,'f'
|
ori $2,$0,'f'
|
sb $2,0($20)
|
sb $2,0($20)
|
ori $2,$0,65*13
|
ori $2,$0,65*13
|
ori $3,$0,13
|
ori $3,$0,13
|
divu $2,$3
|
divu $2,$3
|
nop
|
nop
|
mflo $4
|
mflo $4
|
sb $4,0($20) #A
|
sb $4,0($20) #A
|
sb $23,0($20)
|
sb $23,0($20)
|
sb $21,0($20)
|
sb $21,0($20)
|
.endif
|
.endif
|
|
|
# MUL tests, skip conditionally
|
# MUL tests, skip conditionally
|
.ifgt TEST_MUL
|
.ifgt TEST_MUL
|
|
|
#g: MULT
|
#g: MULT
|
ori $2,$0,'g'
|
ori $2,$0,'g'
|
sb $2,0($20)
|
sb $2,0($20)
|
ori $2,$0,5
|
ori $2,$0,5
|
ori $3,$0,13
|
ori $3,$0,13
|
mult $2,$3
|
mult $2,$3
|
nop
|
nop
|
mflo $4
|
mflo $4
|
sb $4,0($20) #A
|
sb $4,0($20) #A
|
li $2,-5
|
li $2,-5
|
ori $3,$0,13
|
ori $3,$0,13
|
mult $2,$3
|
mult $2,$3
|
mfhi $5
|
mfhi $5
|
mflo $4
|
mflo $4
|
sub $4,$0,$4
|
sub $4,$0,$4
|
addu $4,$4,$5
|
addu $4,$4,$5
|
addi $4,$4,2
|
addi $4,$4,2
|
sb $4,0($20) #B
|
sb $4,0($20) #B
|
ori $2,$0,5
|
ori $2,$0,5
|
li $3,-13
|
li $3,-13
|
mult $2,$3
|
mult $2,$3
|
mfhi $5
|
mfhi $5
|
mflo $4
|
mflo $4
|
sub $4,$0,$4
|
sub $4,$0,$4
|
addu $4,$4,$5
|
addu $4,$4,$5
|
addi $4,$4,3
|
addi $4,$4,3
|
sb $4,0($20) #C
|
sb $4,0($20) #C
|
li $2,-5
|
li $2,-5
|
li $3,-13
|
li $3,-13
|
mult $2,$3
|
mult $2,$3
|
mfhi $5
|
mfhi $5
|
mflo $4
|
mflo $4
|
addu $4,$4,$5
|
addu $4,$4,$5
|
addi $4,$4,3
|
addi $4,$4,3
|
sb $4,0($20) #D
|
sb $4,0($20) #D
|
lui $4,0xfe98
|
lui $4,0xfe98
|
ori $4,$4,0x62e5
|
ori $4,$4,0x62e5
|
lui $5,0x6
|
lui $5,0x6
|
ori $5,0x8db8
|
ori $5,0x8db8
|
mult $4,$5
|
mult $4,$5
|
mfhi $6
|
mfhi $6
|
addiu $7,$6,2356+1+'E' #E
|
addiu $7,$6,2356+1+'E' #E
|
sb $7,0($20)
|
sb $7,0($20)
|
sb $23,0($20)
|
sb $23,0($20)
|
sb $21,0($20)
|
sb $21,0($20)
|
|
|
#h: MULTU
|
#h: MULTU
|
ori $2,$0,'h'
|
ori $2,$0,'h'
|
sb $2,0($20)
|
sb $2,0($20)
|
ori $2,$0,5
|
ori $2,$0,5
|
ori $3,$0,13
|
ori $3,$0,13
|
multu $2,$3
|
multu $2,$3
|
nop
|
nop
|
mflo $4
|
mflo $4
|
sb $4,0($20) #A
|
sb $4,0($20) #A
|
sb $23,0($20)
|
sb $23,0($20)
|
sb $21,0($20)
|
sb $21,0($20)
|
.endif
|
.endif
|
|
|
#i: SLT
|
#i: SLT
|
ori $2,$0,'i'
|
ori $2,$0,'i'
|
sb $2,0($20)
|
sb $2,0($20)
|
ori $2,$0,10
|
ori $2,$0,10
|
ori $3,$0,12
|
ori $3,$0,12
|
slt $4,$2,$3
|
slt $4,$2,$3
|
addi $5,$4,64
|
addi $5,$4,64
|
sb $5,0($20) #A
|
sb $5,0($20) #A
|
slt $4,$3,$2
|
slt $4,$3,$2
|
addi $5,$4,66
|
addi $5,$4,66
|
sb $5,0($20) #B
|
sb $5,0($20) #B
|
li $2,0xfffffff0
|
li $2,0xfffffff0
|
slt $4,$2,$3
|
slt $4,$2,$3
|
addi $5,$4,66
|
addi $5,$4,66
|
sb $5,0($20) #C
|
sb $5,0($20) #C
|
slt $4,$3,$2
|
slt $4,$3,$2
|
addi $5,$4,68
|
addi $5,$4,68
|
sb $5,0($20) #D
|
sb $5,0($20) #D
|
li $3,0xffffffff
|
li $3,0xffffffff
|
slt $4,$2,$3
|
slt $4,$2,$3
|
addi $5,$4,68
|
addi $5,$4,68
|
sb $5,0($20) #E
|
sb $5,0($20) #E
|
slt $4,$3,$2
|
slt $4,$3,$2
|
addi $5,$4,70
|
addi $5,$4,70
|
sb $5,0($20) #F
|
sb $5,0($20) #F
|
sb $23,0($20)
|
sb $23,0($20)
|
sb $21,0($20)
|
sb $21,0($20)
|
|
|
#j: SLTI
|
#j: SLTI
|
ori $2,$0,'j'
|
ori $2,$0,'j'
|
sb $2,0($20)
|
sb $2,0($20)
|
ori $2,$0,10
|
ori $2,$0,10
|
slti $4,$2,12
|
slti $4,$2,12
|
addi $5,$4,64
|
addi $5,$4,64
|
sb $5,0($20) #A
|
sb $5,0($20) #A
|
slti $4,$2,8
|
slti $4,$2,8
|
addi $5,$4,66
|
addi $5,$4,66
|
sb $5,0($20) #B
|
sb $5,0($20) #B
|
sb $23,0($20)
|
sb $23,0($20)
|
sb $21,0($20)
|
sb $21,0($20)
|
|
|
#k: SLTIU
|
#k: SLTIU
|
ori $2,$0,'k'
|
ori $2,$0,'k'
|
sb $2,0($20)
|
sb $2,0($20)
|
ori $2,$0,10
|
ori $2,$0,10
|
sltiu $4,$2,12
|
sltiu $4,$2,12
|
addi $5,$4,64
|
addi $5,$4,64
|
sb $5,0($20) #A
|
sb $5,0($20) #A
|
sltiu $4,$2,8
|
sltiu $4,$2,8
|
addi $5,$4,66
|
addi $5,$4,66
|
sb $5,0($20) #B
|
sb $5,0($20) #B
|
sb $23,0($20)
|
sb $23,0($20)
|
sb $21,0($20)
|
sb $21,0($20)
|
|
|
#l: SLTU
|
#l: SLTU
|
ori $2,$0,'l'
|
ori $2,$0,'l'
|
sb $2,0($20)
|
sb $2,0($20)
|
ori $2,$0,10
|
ori $2,$0,10
|
ori $3,$0,12
|
ori $3,$0,12
|
slt $4,$2,$3
|
slt $4,$2,$3
|
addi $5,$4,64
|
addi $5,$4,64
|
sb $5,0($20) #A
|
sb $5,0($20) #A
|
slt $4,$3,$2
|
slt $4,$3,$2
|
addi $5,$4,66
|
addi $5,$4,66
|
sb $5,0($20) #B
|
sb $5,0($20) #B
|
sb $23,0($20)
|
sb $23,0($20)
|
sb $21,0($20)
|
sb $21,0($20)
|
|
|
#m: SUB
|
#m: SUB
|
ori $2,$0,'m'
|
ori $2,$0,'m'
|
sb $2,0($20)
|
sb $2,0($20)
|
ori $3,$0,70
|
ori $3,$0,70
|
ori $4,$0,5
|
ori $4,$0,5
|
sub $2,$3,$4
|
sub $2,$3,$4
|
sb $2,0($20) #A
|
sb $2,0($20) #A
|
sb $23,0($20)
|
sb $23,0($20)
|
sb $21,0($20)
|
sb $21,0($20)
|
|
|
#n: SUBU
|
#n: SUBU
|
ori $2,$0,'n'
|
ori $2,$0,'n'
|
sb $2,0($20)
|
sb $2,0($20)
|
ori $3,$0,70
|
ori $3,$0,70
|
ori $4,$0,5
|
ori $4,$0,5
|
sub $2,$3,$4
|
sub $2,$3,$4
|
sb $2,0($20) #A
|
sb $2,0($20) #A
|
sb $23,0($20)
|
sb $23,0($20)
|
sb $21,0($20)
|
sb $21,0($20)
|
|
|
######################################
|
######################################
|
#Branch and Jump Instructions
|
#Branch and Jump Instructions
|
######################################
|
######################################
|
BranchTest:
|
BranchTest:
|
ori $2,$0,'B'
|
ori $2,$0,'B'
|
sb $2,0($20)
|
sb $2,0($20)
|
ori $2,$0,'r'
|
ori $2,$0,'r'
|
sb $2,0($20)
|
sb $2,0($20)
|
ori $2,$0,'a'
|
ori $2,$0,'a'
|
sb $2,0($20)
|
sb $2,0($20)
|
ori $2,$0,'n'
|
ori $2,$0,'n'
|
sb $2,0($20)
|
sb $2,0($20)
|
ori $2,$0,'c'
|
ori $2,$0,'c'
|
sb $2,0($20)
|
sb $2,0($20)
|
ori $2,$0,'h'
|
ori $2,$0,'h'
|
sb $2,0($20)
|
sb $2,0($20)
|
sb $23,0($20)
|
sb $23,0($20)
|
sb $21,0($20)
|
sb $21,0($20)
|
|
|
#a: B
|
#a: B
|
ori $2,$0,'a'
|
ori $2,$0,'a'
|
sb $2,0($20)
|
sb $2,0($20)
|
ori $10,$0,'A'
|
ori $10,$0,'A'
|
ori $11,$0,'B'
|
ori $11,$0,'B'
|
b $B1
|
b $B1
|
sb $10,0($20)
|
sb $10,0($20)
|
sb $22,0($20)
|
sb $22,0($20)
|
$B1:
|
$B1:
|
sb $11,0($20)
|
sb $11,0($20)
|
sb $23,0($20)
|
sb $23,0($20)
|
sb $21,0($20)
|
sb $21,0($20)
|
|
|
#b: BAL
|
#b: BAL
|
ori $2,$0,'b'
|
ori $2,$0,'b'
|
sb $2,0($20)
|
sb $2,0($20)
|
ori $10,$0,'A'
|
ori $10,$0,'A'
|
ori $11,$0,'B'
|
ori $11,$0,'B'
|
ori $12,$0,'C'
|
ori $12,$0,'C'
|
ori $13,$0,'D'
|
ori $13,$0,'D'
|
ori $14,$0,'E'
|
ori $14,$0,'E'
|
ori $15,$0,'X'
|
ori $15,$0,'X'
|
bal $BAL1
|
bal $BAL1
|
sb $10,0($20)
|
sb $10,0($20)
|
sb $13,0($20)
|
sb $13,0($20)
|
b $BAL2
|
b $BAL2
|
sb $14,0($20)
|
sb $14,0($20)
|
sb $15,0($20)
|
sb $15,0($20)
|
$BAL1:
|
$BAL1:
|
sb $11,0($20)
|
sb $11,0($20)
|
jr $31
|
jr $31
|
sb $12,0($20)
|
sb $12,0($20)
|
sb $22,0($20)
|
sb $22,0($20)
|
$BAL2:
|
$BAL2:
|
sb $23,0($20)
|
sb $23,0($20)
|
sb $21,0($20)
|
sb $21,0($20)
|
|
|
#c: BEQ
|
#c: BEQ
|
ori $2,$0,'c'
|
ori $2,$0,'c'
|
sb $2,0($20)
|
sb $2,0($20)
|
ori $10,$0,'A'
|
ori $10,$0,'A'
|
ori $11,$0,'B'
|
ori $11,$0,'B'
|
ori $12,$0,'C'
|
ori $12,$0,'C'
|
ori $13,$0,'D'
|
ori $13,$0,'D'
|
ori $2,$0,100
|
ori $2,$0,100
|
ori $3,$0,123
|
ori $3,$0,123
|
ori $4,$0,123
|
ori $4,$0,123
|
beq $2,$3,$BEQ1
|
beq $2,$3,$BEQ1
|
sb $10,0($20)
|
sb $10,0($20)
|
sb $11,0($20)
|
sb $11,0($20)
|
beq $3,$4,$BEQ1
|
beq $3,$4,$BEQ1
|
sb $12,0($20)
|
sb $12,0($20)
|
sb $22,0($20)
|
sb $22,0($20)
|
$BEQ1:
|
$BEQ1:
|
sb $13,0($20)
|
sb $13,0($20)
|
sb $23,0($20)
|
sb $23,0($20)
|
sb $21,0($20)
|
sb $21,0($20)
|
|
|
#d: BGEZ
|
#d: BGEZ
|
ori $2,$0,'d'
|
ori $2,$0,'d'
|
sb $2,0($20)
|
sb $2,0($20)
|
ori $10,$0,'A'
|
ori $10,$0,'A'
|
ori $11,$0,'B'
|
ori $11,$0,'B'
|
ori $12,$0,'C'
|
ori $12,$0,'C'
|
ori $13,$0,'D'
|
ori $13,$0,'D'
|
or $15,$0,'X'
|
or $15,$0,'X'
|
ori $2,$0,100
|
ori $2,$0,100
|
li $3,0xffff1234
|
li $3,0xffff1234
|
ori $4,$0,123
|
ori $4,$0,123
|
bgez $3,$BGEZ1
|
bgez $3,$BGEZ1
|
sb $10,0($20)
|
sb $10,0($20)
|
sb $11,0($20)
|
sb $11,0($20)
|
bgez $2,$BGEZ1
|
bgez $2,$BGEZ1
|
sb $12,0($20)
|
sb $12,0($20)
|
sb $22,0($20)
|
sb $22,0($20)
|
$BGEZ1:
|
$BGEZ1:
|
bgez $0,$BGEZ2
|
bgez $0,$BGEZ2
|
nop
|
nop
|
sb $15,0($20)
|
sb $15,0($20)
|
$BGEZ2:
|
$BGEZ2:
|
sb $13,0($20)
|
sb $13,0($20)
|
sb $23,0($20)
|
sb $23,0($20)
|
sb $21,0($20)
|
sb $21,0($20)
|
|
|
#e: BGEZAL
|
#e: BGEZAL
|
ori $2,$0,'e'
|
ori $2,$0,'e'
|
sb $2,0($20)
|
sb $2,0($20)
|
ori $10,$0,'A'
|
ori $10,$0,'A'
|
ori $11,$0,'B'
|
ori $11,$0,'B'
|
ori $12,$0,'C'
|
ori $12,$0,'C'
|
ori $13,$0,'D'
|
ori $13,$0,'D'
|
ori $14,$0,'E'
|
ori $14,$0,'E'
|
ori $15,$0,'X'
|
ori $15,$0,'X'
|
li $3,0xffff1234
|
li $3,0xffff1234
|
bgezal $3,$BGEZAL1
|
bgezal $3,$BGEZAL1
|
nop
|
nop
|
sb $10,0($20)
|
sb $10,0($20)
|
bgezal $0,$BGEZAL1
|
bgezal $0,$BGEZAL1
|
nop
|
nop
|
sb $13,0($20)
|
sb $13,0($20)
|
b $BGEZAL2
|
b $BGEZAL2
|
sb $14,0($20)
|
sb $14,0($20)
|
sb $15,0($20)
|
sb $15,0($20)
|
$BGEZAL1:
|
$BGEZAL1:
|
sb $11,0($20)
|
sb $11,0($20)
|
jr $31
|
jr $31
|
sb $12,0($20)
|
sb $12,0($20)
|
sb $22,0($20)
|
sb $22,0($20)
|
$BGEZAL2:
|
$BGEZAL2:
|
sb $23,0($20)
|
sb $23,0($20)
|
sb $21,0($20)
|
sb $21,0($20)
|
|
|
#f: BGTZ
|
#f: BGTZ
|
ori $2,$0,'f'
|
ori $2,$0,'f'
|
sb $2,0($20)
|
sb $2,0($20)
|
ori $10,$0,'A'
|
ori $10,$0,'A'
|
ori $11,$0,'B'
|
ori $11,$0,'B'
|
ori $12,$0,'C'
|
ori $12,$0,'C'
|
ori $13,$0,'D'
|
ori $13,$0,'D'
|
ori $2,$0,100
|
ori $2,$0,100
|
li $3,0xffff1234
|
li $3,0xffff1234
|
bgtz $3,$BGTZ1
|
bgtz $3,$BGTZ1
|
sb $10,0($20)
|
sb $10,0($20)
|
sb $11,0($20)
|
sb $11,0($20)
|
bgtz $2,$BGTZ1
|
bgtz $2,$BGTZ1
|
sb $12,0($20)
|
sb $12,0($20)
|
sb $22,0($20)
|
sb $22,0($20)
|
$BGTZ1:
|
$BGTZ1:
|
sb $13,0($20)
|
sb $13,0($20)
|
sb $23,0($20)
|
sb $23,0($20)
|
sb $21,0($20)
|
sb $21,0($20)
|
|
|
#g: BLEZ
|
#g: BLEZ
|
ori $2,$0,'g'
|
ori $2,$0,'g'
|
sb $2,0($20)
|
sb $2,0($20)
|
ori $10,$0,'A'
|
ori $10,$0,'A'
|
ori $11,$0,'B'
|
ori $11,$0,'B'
|
ori $12,$0,'C'
|
ori $12,$0,'C'
|
ori $13,$0,'D'
|
ori $13,$0,'D'
|
ori $2,$0,100
|
ori $2,$0,100
|
li $3,0xffff1234
|
li $3,0xffff1234
|
blez $2,$BLEZ1
|
blez $2,$BLEZ1
|
sb $10,0($20)
|
sb $10,0($20)
|
sb $11,0($20)
|
sb $11,0($20)
|
blez $3,$BLEZ1
|
blez $3,$BLEZ1
|
sb $12,0($20)
|
sb $12,0($20)
|
sb $22,0($20)
|
sb $22,0($20)
|
$BLEZ1:
|
$BLEZ1:
|
blez $0,$BLEZ2
|
blez $0,$BLEZ2
|
nop
|
nop
|
sb $22,0($20)
|
sb $22,0($20)
|
$BLEZ2:
|
$BLEZ2:
|
sb $13,0($20)
|
sb $13,0($20)
|
sb $23,0($20)
|
sb $23,0($20)
|
sb $21,0($20)
|
sb $21,0($20)
|
|
|
#h: BLTZ
|
#h: BLTZ
|
ori $2,$0,'h'
|
ori $2,$0,'h'
|
sb $2,0($20)
|
sb $2,0($20)
|
ori $10,$0,'A'
|
ori $10,$0,'A'
|
ori $11,$0,'B'
|
ori $11,$0,'B'
|
ori $12,$0,'C'
|
ori $12,$0,'C'
|
ori $13,$0,'D'
|
ori $13,$0,'D'
|
ori $14,$0,'E'
|
ori $14,$0,'E'
|
ori $2,$0,100
|
ori $2,$0,100
|
li $3,0xffff1234
|
li $3,0xffff1234
|
ori $4,$0,0
|
ori $4,$0,0
|
bltz $2,$BLTZ1
|
bltz $2,$BLTZ1
|
sb $10,0($20)
|
sb $10,0($20)
|
sb $11,0($20)
|
sb $11,0($20)
|
bltz $3,$BLTZ1
|
bltz $3,$BLTZ1
|
sb $12,0($20)
|
sb $12,0($20)
|
sb $22,0($20)
|
sb $22,0($20)
|
$BLTZ1:
|
$BLTZ1:
|
bltz $4,$BLTZ2
|
bltz $4,$BLTZ2
|
nop
|
nop
|
sb $13,0($20)
|
sb $13,0($20)
|
$BLTZ2:
|
$BLTZ2:
|
sb $14,0($20)
|
sb $14,0($20)
|
sb $23,0($20)
|
sb $23,0($20)
|
sb $21,0($20)
|
sb $21,0($20)
|
|
|
#i: BLTZAL
|
#i: BLTZAL
|
ori $2,$0,'i'
|
ori $2,$0,'i'
|
sb $2,0($20)
|
sb $2,0($20)
|
ori $10,$0,'A'
|
ori $10,$0,'A'
|
ori $11,$0,'B'
|
ori $11,$0,'B'
|
ori $12,$0,'C'
|
ori $12,$0,'C'
|
ori $13,$0,'D'
|
ori $13,$0,'D'
|
ori $14,$0,'E'
|
ori $14,$0,'E'
|
ori $15,$0,'X'
|
ori $15,$0,'X'
|
li $3,0xffff1234
|
li $3,0xffff1234
|
bltzal $0,$BLTZAL1
|
bltzal $0,$BLTZAL1
|
nop
|
nop
|
sb $10,0($20)
|
sb $10,0($20)
|
bltzal $3,$BLTZAL1
|
bltzal $3,$BLTZAL1
|
nop
|
nop
|
sb $13,0($20)
|
sb $13,0($20)
|
b $BLTZAL2
|
b $BLTZAL2
|
sb $14,0($20)
|
sb $14,0($20)
|
sb $15,0($20)
|
sb $15,0($20)
|
$BLTZAL1:
|
$BLTZAL1:
|
sb $11,0($20)
|
sb $11,0($20)
|
jr $31
|
jr $31
|
sb $12,0($20)
|
sb $12,0($20)
|
sb $22,0($20)
|
sb $22,0($20)
|
$BLTZAL2:
|
$BLTZAL2:
|
sb $23,0($20)
|
sb $23,0($20)
|
sb $21,0($20)
|
sb $21,0($20)
|
|
|
#j: BNE
|
#j: BNE
|
ori $2,$0,'j'
|
ori $2,$0,'j'
|
sb $2,0($20)
|
sb $2,0($20)
|
ori $10,$0,'A'
|
ori $10,$0,'A'
|
ori $11,$0,'B'
|
ori $11,$0,'B'
|
ori $12,$0,'C'
|
ori $12,$0,'C'
|
ori $13,$0,'D'
|
ori $13,$0,'D'
|
ori $2,$0,100
|
ori $2,$0,100
|
ori $3,$0,123
|
ori $3,$0,123
|
ori $4,$0,123
|
ori $4,$0,123
|
bne $3,$4,$BNE1
|
bne $3,$4,$BNE1
|
sb $10,0($20)
|
sb $10,0($20)
|
sb $11,0($20)
|
sb $11,0($20)
|
bne $2,$3,$BNE1
|
bne $2,$3,$BNE1
|
sb $12,0($20)
|
sb $12,0($20)
|
sb $22,0($20)
|
sb $22,0($20)
|
$BNE1:
|
$BNE1:
|
sb $13,0($20)
|
sb $13,0($20)
|
sb $23,0($20)
|
sb $23,0($20)
|
sb $21,0($20)
|
sb $21,0($20)
|
|
|
#k: J
|
#k: J
|
ori $2,$0,'k'
|
ori $2,$0,'k'
|
sb $2,0($20)
|
sb $2,0($20)
|
ori $10,$0,'A'
|
ori $10,$0,'A'
|
ori $11,$0,'B'
|
ori $11,$0,'B'
|
ori $15,$0,'X'
|
ori $15,$0,'X'
|
j $J1
|
j $J1
|
sb $10,0($20)
|
sb $10,0($20)
|
sb $15,0($20)
|
sb $15,0($20)
|
$J1:
|
$J1:
|
sb $11,0($20)
|
sb $11,0($20)
|
sb $23,0($20)
|
sb $23,0($20)
|
sb $21,0($20)
|
sb $21,0($20)
|
|
|
#l: JAL
|
#l: JAL
|
ori $2,$0,'l'
|
ori $2,$0,'l'
|
sb $2,0($20)
|
sb $2,0($20)
|
ori $10,$0,'A'
|
ori $10,$0,'A'
|
ori $11,$0,'B'
|
ori $11,$0,'B'
|
ori $12,$0,'C'
|
ori $12,$0,'C'
|
ori $13,$0,'D'
|
ori $13,$0,'D'
|
ori $14,$0,'E'
|
ori $14,$0,'E'
|
ori $15,$0,'X'
|
ori $15,$0,'X'
|
jal $JAL1
|
jal $JAL1
|
sb $10,0($20)
|
sb $10,0($20)
|
sb $13,0($20)
|
sb $13,0($20)
|
b $JAL2
|
b $JAL2
|
sb $14,0($20)
|
sb $14,0($20)
|
sb $15,0($20)
|
sb $15,0($20)
|
$JAL1:
|
$JAL1:
|
sb $11,0($20)
|
sb $11,0($20)
|
jr $31
|
jr $31
|
sb $12,0($20)
|
sb $12,0($20)
|
sb $22,0($20)
|
sb $22,0($20)
|
$JAL2:
|
$JAL2:
|
sb $23,0($20)
|
sb $23,0($20)
|
sb $21,0($20)
|
sb $21,0($20)
|
|
|
#m: JALR
|
#m: JALR
|
ori $2,$0,'m'
|
ori $2,$0,'m'
|
sb $2,0($20)
|
sb $2,0($20)
|
ori $10,$0,'A'
|
ori $10,$0,'A'
|
ori $11,$0,'B'
|
ori $11,$0,'B'
|
ori $12,$0,'C'
|
ori $12,$0,'C'
|
ori $13,$0,'D'
|
ori $13,$0,'D'
|
ori $14,$0,'E'
|
ori $14,$0,'E'
|
ori $15,$0,'X'
|
ori $15,$0,'X'
|
la $3,$JALR1
|
la $3,$JALR1
|
jalr $3
|
jalr $3
|
sb $10,0($20)
|
sb $10,0($20)
|
sb $13,0($20)
|
sb $13,0($20)
|
b $JALR2
|
b $JALR2
|
sb $14,0($20)
|
sb $14,0($20)
|
sb $15,0($20)
|
sb $15,0($20)
|
$JALR1:
|
$JALR1:
|
sb $11,0($20)
|
sb $11,0($20)
|
jr $31
|
jr $31
|
sb $12,0($20)
|
sb $12,0($20)
|
sb $22,0($20)
|
sb $22,0($20)
|
$JALR2:
|
$JALR2:
|
sb $23,0($20)
|
sb $23,0($20)
|
sb $21,0($20)
|
sb $21,0($20)
|
|
|
#n: JR
|
#n: JR
|
ori $2,$0,'n'
|
ori $2,$0,'n'
|
sb $2,0($20)
|
sb $2,0($20)
|
ori $10,$0,'A'
|
ori $10,$0,'A'
|
ori $11,$0,'B'
|
ori $11,$0,'B'
|
ori $15,$0,'X'
|
ori $15,$0,'X'
|
la $3,$JR1
|
la $3,$JR1
|
jr $3
|
jr $3
|
sb $10,0($20)
|
sb $10,0($20)
|
sb $15,0($20)
|
sb $15,0($20)
|
$JR1:
|
$JR1:
|
sb $11,0($20)
|
sb $11,0($20)
|
sb $23,0($20)
|
sb $23,0($20)
|
sb $21,0($20)
|
sb $21,0($20)
|
|
|
#o: NOP
|
#o: NOP
|
ori $2,$0,'o'
|
ori $2,$0,'o'
|
sb $2,0($20)
|
sb $2,0($20)
|
ori $2,$0,65
|
ori $2,$0,65
|
nop
|
nop
|
sb $2,0($20)
|
sb $2,0($20)
|
sb $23,0($20)
|
sb $23,0($20)
|
sb $21,0($20)
|
sb $21,0($20)
|
|
|
# b LoadTest
|
# b LoadTest
|
|
|
|
|
BreakTest:
|
BreakTest:
|
.ifgt TEST_BREAK
|
.ifgt TEST_BREAK
|
#p: BREAK
|
#p: BREAK
|
ori $2,$0,'p' # check if it jumps to break address and comes back
|
ori $2,$0,'p' # check if it jumps to break address and comes back
|
sb $2,0($20)
|
sb $2,0($20)
|
ori $2,$0,'z'
|
ori $2,$0,'z'
|
ori $4,$0,59
|
ori $4,$0,59
|
break 0
|
break 0
|
addi $4,$4,1
|
addi $4,$4,1
|
sb $4,0($20)
|
sb $4,0($20)
|
|
|
break 0 # check if load instruction is aborted (@log)
|
break 0 # check if load instruction is aborted (@log)
|
lb $2,16($2)
|
lb $2,16($2)
|
|
|
break 0 # check if jump instruction is aborted (@log)
|
break 0 # check if jump instruction is aborted (@log)
|
j break_jump_test1
|
j break_jump_test1
|
add $4,$4,5
|
add $4,$4,5
|
|
|
break_jump_test1:
|
break_jump_test1:
|
add $4,$4,1 # make sure the jump shows in the log (@log)
|
add $4,$4,1 # make sure the jump shows in the log (@log)
|
|
|
break 0 # check if store instruction is aborted
|
break 0 # check if store instruction is aborted
|
sb $4,0($20)
|
sb $4,0($20)
|
|
|
j break_jump_test2 # check if break works in delay slot of jump
|
j break_jump_test2 # check if break works in delay slot of jump
|
break 0
|
break 0
|
nop
|
nop
|
j break_continue
|
j break_continue
|
nop
|
nop
|
|
|
break_jump_test2:
|
|
add $4,$4,1
|
|
|
|
break_continue:
|
break_jump_test2:
|
sb $23,0($20)
|
add $4,$4,1
|
sb $21,0($20)
|
|
.endif
|
|
|
|
#q: SYSCALL
|
break_continue:
|
ori $2,$0,'q' # check if it jumpts to trap vector and comes back
|
sb $23,0($20)
|
sb $2,0($20)
|
sb $21,0($20)
|
ori $4,$0,61
|
.endif
|
syscall 0
|
|
addi $4,$4,-1
|
#q: SYSCALL
|
sb $4,0($20)
|
ori $2,$0,'q' # check if it jumpts to trap vector and comes back
|
|
sb $2,0($20)
|
|
ori $4,$0,61
|
|
syscall 0
|
|
addi $4,$4,-1
|
|
sb $4,0($20)
|
|
|
syscall 0 # check if load instruction is aborted (@log)
|
syscall 0 # check if load instruction is aborted (@log)
|
lb $2,16($2)
|
lb $2,16($2)
|
|
|
syscall 0 # check if jump instruction is aborted (@log)
|
syscall 0 # check if jump instruction is aborted (@log)
|
j syscall_jump_test1
|
j syscall_jump_test1
|
add $4,$4,5
|
add $4,$4,5
|
|
|
syscall_jump_test1:
|
syscall_jump_test1:
|
add $4,$4,1 # make sure the jump shows in the log (@log)
|
add $4,$4,1 # make sure the jump shows in the log (@log)
|
|
|
j syscall_jump_test2 # check if syscall works in delay slot of jump
|
j syscall_jump_test2 # check if syscall works in delay slot of jump
|
syscall 0
|
syscall 0
|
nop
|
nop
|
j syscall_continue
|
j syscall_continue
|
nop
|
nop
|
|
|
syscall_jump_test2:
|
syscall_jump_test2:
|
add $4,$4,1
|
add $4,$4,1
|
|
|
syscall_continue:
|
syscall_continue:
|
sb $23,0($20)
|
sb $23,0($20)
|
sb $21,0($20)
|
sb $21,0($20)
|
|
|
|
|
######################################
|
######################################
|
#Load, Store, and Memory Control Instructions
|
#Load, Store, and Memory Control Instructions
|
######################################
|
######################################
|
LoadTest:
|
LoadTest:
|
ori $2,$0,'L'
|
ori $2,$0,'L'
|
sb $2,0($20)
|
sb $2,0($20)
|
ori $2,$0,'o'
|
ori $2,$0,'o'
|
sb $2,0($20)
|
sb $2,0($20)
|
ori $2,$0,'a'
|
ori $2,$0,'a'
|
sb $2,0($20)
|
sb $2,0($20)
|
ori $2,$0,'d'
|
ori $2,$0,'d'
|
sb $2,0($20)
|
sb $2,0($20)
|
sb $23,0($20)
|
sb $23,0($20)
|
sb $21,0($20)
|
sb $21,0($20)
|
|
|
#a: LB
|
#a: LB
|
ori $2,$0,'a'
|
ori $2,$0,'a'
|
sb $2,0($20)
|
sb $2,0($20)
|
or $2,$0,$24
|
or $2,$0,$24
|
li $3,0x414243fc
|
li $3,0x414243fc
|
sw $3,16($2) # 16($2) = 0x414243fc
|
sw $3,16($2) # 16($2) = 0x414243fc
|
lb $4,16($2) # $4 = 0x41
|
lb $4,16($2) # $4 = 0x41
|
sb $4,0($20) # UART = 0x41
|
sb $4,0($20) # UART = 0x41
|
lb $4,17($2) # $4 = 0x42
|
lb $4,17($2) # $4 = 0x42
|
nop
|
nop
|
sb $4,0($20) # UART = 0x42
|
sb $4,0($20) # UART = 0x42
|
lb $4,18($2) # $4 = 0x43
|
lb $4,18($2) # $4 = 0x43
|
nop
|
nop
|
sb $4,0($20) # UART = 0x43
|
sb $4,0($20) # UART = 0x43
|
lb $2,19($2) # $2 = 0xffff.fffc
|
lb $2,19($2) # $2 = 0xffff.fffc
|
nop
|
nop
|
sra $3,$2,8 # $3 = 0xffff.ffff
|
sra $3,$2,8 # $3 = 0xffff.ffff
|
addi $3,$3,0x45 # $3 = 0x44
|
addi $3,$3,0x45 # $3 = 0x44
|
sb $3,0($20) # UART = 0x44
|
sb $3,0($20) # UART = 0x44
|
addi $2,$2,0x49 # $4 = 0x45, overflow
|
addi $2,$2,0x49 # $4 = 0x45, overflow
|
sb $2,0($20) # UART = 0x45
|
sb $2,0($20) # UART = 0x45
|
sb $23,0($20) # UART = CR
|
sb $23,0($20) # UART = CR
|
sb $21,0($20) # UART = LF
|
sb $21,0($20) # UART = LF
|
|
|
#b: LBU
|
#b: LBU
|
ori $2,$0,'b'
|
ori $2,$0,'b'
|
sb $2,0($20)
|
sb $2,0($20)
|
or $2,$0,$24
|
or $2,$0,$24
|
li $3,0x41424344
|
li $3,0x41424344
|
sw $3,16($2)
|
sw $3,16($2)
|
lb $4,16($2)
|
lb $4,16($2)
|
sb $4,0($20)
|
sb $4,0($20)
|
lb $4,17($2)
|
lb $4,17($2)
|
sb $4,0($20)
|
sb $4,0($20)
|
lb $4,18($2)
|
lb $4,18($2)
|
sb $4,0($20)
|
sb $4,0($20)
|
lb $2,19($2)
|
lb $2,19($2)
|
sb $2,0($20)
|
sb $2,0($20)
|
sb $23,0($20)
|
sb $23,0($20)
|
sb $21,0($20)
|
sb $21,0($20)
|
|
|
#c: LH
|
#c: LH
|
ori $2,$0,'c'
|
ori $2,$0,'c'
|
sb $2,0($20)
|
sb $2,0($20)
|
or $2,$0,$24
|
or $2,$0,$24
|
li $3,0x00410042
|
li $3,0x00410042
|
sw $3,16($2)
|
sw $3,16($2)
|
lh $4,16($2)
|
lh $4,16($2)
|
sb $4,0($20)
|
sb $4,0($20)
|
lh $2,18($2)
|
lh $2,18($2)
|
sb $2,0($20)
|
sb $2,0($20)
|
sb $23,0($20)
|
sb $23,0($20)
|
sb $21,0($20)
|
sb $21,0($20)
|
|
|
#d: LHU
|
#d: LHU
|
ori $2,$0,'d'
|
ori $2,$0,'d'
|
sb $2,0($20)
|
sb $2,0($20)
|
or $2,$0,$24
|
or $2,$0,$24
|
li $3,0x00410042
|
li $3,0x00410042
|
sw $3,16($2)
|
sw $3,16($2)
|
lh $4,16($2)
|
lh $4,16($2)
|
sb $4,0($20)
|
sb $4,0($20)
|
lh $2,18($2)
|
lh $2,18($2)
|
sb $2,0($20)
|
sb $2,0($20)
|
sb $23,0($20)
|
sb $23,0($20)
|
sb $21,0($20)
|
sb $21,0($20)
|
|
|
#e: LW
|
#e: LW
|
ori $2,$0,'e'
|
ori $2,$0,'e'
|
sb $2,0($20)
|
sb $2,0($20)
|
or $2,$0,$24
|
or $2,$0,$24
|
li $3,'A'
|
li $3,'A'
|
sw $3,16($2)
|
sw $3,16($2)
|
ori $3,$0,0
|
ori $3,$0,0
|
lw $2,16($2)
|
lw $2,16($2)
|
sb $2,0($20)
|
sb $2,0($20)
|
sb $23,0($20)
|
sb $23,0($20)
|
sb $21,0($20)
|
sb $21,0($20)
|
|
|
.ifgt TEST_UNALIGNED_LOADS
|
.ifgt TEST_UNALIGNED_LOADS
|
#f: LWL & LWR
|
#f: LWL & LWR
|
ori $2,$0,'f'
|
ori $2,$0,'f'
|
sb $2,0($20)
|
sb $2,0($20)
|
or $2,$0,$24
|
or $2,$0,$24
|
li $3,'A'
|
li $3,'A'
|
sw $3,16($2)
|
sw $3,16($2)
|
ori $3,$0,0
|
ori $3,$0,0
|
lwl $2,16($2)
|
lwl $2,16($2)
|
lwr $2,16($2)
|
lwr $2,16($2)
|
sb $2,0($20)
|
sb $2,0($20)
|
sb $23,0($20)
|
sb $23,0($20)
|
sb $21,0($20)
|
sb $21,0($20)
|
.endif
|
.endif
|
|
|
#g: SB
|
#g: SB
|
ori $2,$0,'g'
|
ori $2,$0,'g'
|
sb $2,0($20)
|
sb $2,0($20)
|
ori $2,$0,'A'
|
ori $2,$0,'A'
|
sb $2,0($20)
|
sb $2,0($20)
|
sb $23,0($20)
|
sb $23,0($20)
|
sb $21,0($20)
|
sb $21,0($20)
|
|
|
#h: SH
|
#h: SH
|
ori $2,$0,'h'
|
ori $2,$0,'h'
|
sb $2,0($20)
|
sb $2,0($20)
|
or $4,$0,$24
|
or $4,$0,$24
|
ori $2,$0,0x4142
|
ori $2,$0,0x4142
|
sh $2,16($4)
|
sh $2,16($4)
|
lb $3,16($4)
|
lb $3,16($4)
|
sb $3,0($20)
|
sb $3,0($20)
|
lb $2,17($4)
|
lb $2,17($4)
|
sb $2,0($20)
|
sb $2,0($20)
|
sb $23,0($20)
|
sb $23,0($20)
|
sb $21,0($20)
|
sb $21,0($20)
|
|
|
#i: SW
|
#i: SW
|
ori $2,$0,'i'
|
ori $2,$0,'i'
|
sb $2,0($20)
|
sb $2,0($20)
|
or $2,$0,$24
|
or $2,$0,$24
|
li $3,0x41424344
|
li $3,0x41424344
|
sw $3,16($2)
|
sw $3,16($2)
|
lb $4,16($2)
|
lb $4,16($2)
|
sb $4,0($20)
|
sb $4,0($20)
|
lb $4,17($2)
|
lb $4,17($2)
|
sb $4,0($20)
|
sb $4,0($20)
|
lb $4,18($2)
|
lb $4,18($2)
|
sb $4,0($20)
|
sb $4,0($20)
|
lb $2,19($2)
|
lb $2,19($2)
|
sb $2,0($20)
|
sb $2,0($20)
|
sb $23,0($20)
|
sb $23,0($20)
|
sb $21,0($20)
|
sb $21,0($20)
|
|
|
.ifgt TEST_UNALIGNED_STORES
|
.ifgt TEST_UNALIGNED_STORES
|
#j: SWL & SWR
|
#j: SWL & SWR
|
ori $2,$0,'j'
|
ori $2,$0,'j'
|
sb $2,0($20)
|
sb $2,0($20)
|
or $2,$0,$24
|
or $2,$0,$24
|
li $3,0x41424344
|
li $3,0x41424344
|
swl $3,16($2)
|
swl $3,16($2)
|
swr $3,16($2)
|
swr $3,16($2)
|
lb $4,16($2)
|
lb $4,16($2)
|
sb $4,0($20)
|
sb $4,0($20)
|
lb $4,17($2)
|
lb $4,17($2)
|
sb $4,0($20)
|
sb $4,0($20)
|
lb $4,18($2)
|
lb $4,18($2)
|
sb $4,0($20)
|
sb $4,0($20)
|
lb $2,19($2)
|
lb $2,19($2)
|
sb $2,0($20)
|
sb $2,0($20)
|
sb $23,0($20)
|
sb $23,0($20)
|
sb $21,0($20)
|
sb $21,0($20)
|
.endif
|
.endif
|
|
|
######################################
|
######################################
|
#Logical Instructions
|
#Logical Instructions
|
######################################
|
######################################
|
LogicalTest:
|
LogicalTest:
|
ori $2,$0,'L'
|
ori $2,$0,'L'
|
sb $2,0($20)
|
sb $2,0($20)
|
ori $2,$0,'o'
|
ori $2,$0,'o'
|
sb $2,0($20)
|
sb $2,0($20)
|
ori $2,$0,'g'
|
ori $2,$0,'g'
|
sb $2,0($20)
|
sb $2,0($20)
|
ori $2,$0,'i'
|
ori $2,$0,'i'
|
sb $2,0($20)
|
sb $2,0($20)
|
ori $2,$0,'c'
|
ori $2,$0,'c'
|
sb $2,0($20)
|
sb $2,0($20)
|
sb $23,0($20)
|
sb $23,0($20)
|
sb $21,0($20)
|
sb $21,0($20)
|
|
|
#a: AND
|
#a: AND
|
ori $2,$0,'a'
|
ori $2,$0,'a'
|
sb $2,0($20)
|
sb $2,0($20)
|
ori $2,$0,0x0741
|
ori $2,$0,0x0741
|
ori $3,$0,0x60f3
|
ori $3,$0,0x60f3
|
and $4,$2,$3
|
and $4,$2,$3
|
sb $4,0($20)
|
sb $4,0($20)
|
sb $23,0($20)
|
sb $23,0($20)
|
sb $21,0($20)
|
sb $21,0($20)
|
|
|
#b: ANDI
|
#b: ANDI
|
ori $2,$0,'b'
|
ori $2,$0,'b'
|
sb $2,0($20)
|
sb $2,0($20)
|
ori $2,$0,0x0741
|
ori $2,$0,0x0741
|
andi $4,$2,0x60f3
|
andi $4,$2,0x60f3
|
sb $4,0($20)
|
sb $4,0($20)
|
sb $23,0($20)
|
sb $23,0($20)
|
sb $21,0($20)
|
sb $21,0($20)
|
|
|
#c: LUI
|
#c: LUI
|
ori $2,$0,'c'
|
ori $2,$0,'c'
|
sb $2,0($20)
|
sb $2,0($20)
|
lui $2,0x41
|
lui $2,0x41
|
srl $3,$2,16
|
srl $3,$2,16
|
sb $3,0($20)
|
sb $3,0($20)
|
sb $23,0($20)
|
sb $23,0($20)
|
sb $21,0($20)
|
sb $21,0($20)
|
|
|
#d: NOR
|
#d: NOR
|
ori $2,$0,'d'
|
ori $2,$0,'d'
|
sb $2,0($20)
|
sb $2,0($20)
|
li $2,0xf0fff08e
|
li $2,0xf0fff08e
|
li $3,0x0f0f0f30
|
li $3,0x0f0f0f30
|
nor $4,$2,$3
|
nor $4,$2,$3
|
sb $4,0($20)
|
sb $4,0($20)
|
sb $23,0($20)
|
sb $23,0($20)
|
sb $21,0($20)
|
sb $21,0($20)
|
|
|
#e: OR
|
#e: OR
|
ori $2,$0,'e'
|
ori $2,$0,'e'
|
sb $2,0($20)
|
sb $2,0($20)
|
ori $2,$0,0x40
|
ori $2,$0,0x40
|
ori $3,$0,0x01
|
ori $3,$0,0x01
|
or $4,$2,$3
|
or $4,$2,$3
|
sb $4,0($20)
|
sb $4,0($20)
|
sb $23,0($20)
|
sb $23,0($20)
|
sb $21,0($20)
|
sb $21,0($20)
|
|
|
#f: ORI
|
#f: ORI
|
ori $2,$0,'f'
|
ori $2,$0,'f'
|
sb $2,0($20)
|
sb $2,0($20)
|
ori $2,$0,0x40
|
ori $2,$0,0x40
|
ori $4,$2,0x01
|
ori $4,$2,0x01
|
sb $4,0($20)
|
sb $4,0($20)
|
sb $23,0($20)
|
sb $23,0($20)
|
sb $21,0($20)
|
sb $21,0($20)
|
|
|
#g: XOR
|
#g: XOR
|
ori $2,$0,'g'
|
ori $2,$0,'g'
|
sb $2,0($20)
|
sb $2,0($20)
|
ori $2,$0,0xf043
|
ori $2,$0,0xf043
|
ori $3,$0,0xf002
|
ori $3,$0,0xf002
|
xor $4,$2,$3
|
xor $4,$2,$3
|
sb $4,0($20)
|
sb $4,0($20)
|
sb $23,0($20)
|
sb $23,0($20)
|
sb $21,0($20)
|
sb $21,0($20)
|
|
|
#h: XORI
|
#h: XORI
|
ori $2,$0,'h'
|
ori $2,$0,'h'
|
sb $2,0($20)
|
sb $2,0($20)
|
ori $2,$0,0xf043
|
ori $2,$0,0xf043
|
xor $4,$2,0xf002
|
xor $4,$2,0xf002
|
sb $4,0($20)
|
sb $4,0($20)
|
sb $23,0($20)
|
sb $23,0($20)
|
sb $21,0($20)
|
sb $21,0($20)
|
|
|
|
|
######################################
|
######################################
|
#Move Instructions
|
#Move Instructions
|
######################################
|
######################################
|
MoveTest:
|
MoveTest:
|
ori $2,$0,'M'
|
ori $2,$0,'M'
|
sb $2,0($20)
|
sb $2,0($20)
|
ori $2,$0,'o'
|
ori $2,$0,'o'
|
sb $2,0($20)
|
sb $2,0($20)
|
ori $2,$0,'v'
|
ori $2,$0,'v'
|
sb $2,0($20)
|
sb $2,0($20)
|
ori $2,$0,'e'
|
ori $2,$0,'e'
|
sb $2,0($20)
|
sb $2,0($20)
|
sb $23,0($20)
|
sb $23,0($20)
|
sb $21,0($20)
|
sb $21,0($20)
|
|
|
# HI and LO are only implemented if the mul/div block is
|
# HI and LO are only implemented if the mul/div block is
|
.ifgt (TEST_DIV + TEST_MUL)
|
.ifgt (TEST_DIV + TEST_MUL)
|
#a: MFHI
|
#a: MFHI
|
ori $2,$0,'a'
|
ori $2,$0,'a'
|
sb $2,0($20)
|
sb $2,0($20)
|
ori $2,$0,65
|
ori $2,$0,65
|
mthi $2
|
mthi $2
|
mfhi $3
|
mfhi $3
|
sb $3,0($20)
|
sb $3,0($20)
|
sb $23,0($20)
|
sb $23,0($20)
|
sb $21,0($20)
|
sb $21,0($20)
|
|
|
#b: MFLO
|
#b: MFLO
|
ori $2,$0,'b'
|
ori $2,$0,'b'
|
sb $2,0($20)
|
sb $2,0($20)
|
ori $2,$0,65
|
ori $2,$0,65
|
mtlo $2
|
mtlo $2
|
mflo $3
|
mflo $3
|
sb $3,0($20)
|
sb $3,0($20)
|
sb $23,0($20)
|
sb $23,0($20)
|
sb $21,0($20)
|
sb $21,0($20)
|
|
|
#c: MTHI
|
#c: MTHI
|
ori $2,$0,'c'
|
ori $2,$0,'c'
|
sb $2,0($20)
|
sb $2,0($20)
|
ori $2,$0,65
|
ori $2,$0,65
|
mthi $2
|
mthi $2
|
mfhi $3
|
mfhi $3
|
sb $3,0($20)
|
sb $3,0($20)
|
sb $23,0($20)
|
sb $23,0($20)
|
sb $21,0($20)
|
sb $21,0($20)
|
|
|
#d: MTLO
|
#d: MTLO
|
ori $2,$0,'d'
|
ori $2,$0,'d'
|
sb $2,0($20)
|
sb $2,0($20)
|
ori $2,$0,66 # use 'B' instead of 'A' to cach change in HI and LO
|
ori $2,$0,66 # use 'B' instead of 'A' to cach change in HI and LO
|
mtlo $2
|
mtlo $2
|
mflo $3
|
mflo $3
|
sb $3,0($20)
|
sb $3,0($20)
|
sb $23,0($20)
|
sb $23,0($20)
|
sb $21,0($20)
|
sb $21,0($20)
|
.endif
|
.endif
|
|
|
######################################
|
######################################
|
#Shift Instructions
|
#Shift Instructions
|
######################################
|
######################################
|
ShiftTest:
|
ShiftTest:
|
ori $2,$0,'S'
|
ori $2,$0,'S'
|
sb $2,0($20)
|
sb $2,0($20)
|
ori $2,$0,'h'
|
ori $2,$0,'h'
|
sb $2,0($20)
|
sb $2,0($20)
|
ori $2,$0,'i'
|
ori $2,$0,'i'
|
sb $2,0($20)
|
sb $2,0($20)
|
ori $2,$0,'f'
|
ori $2,$0,'f'
|
sb $2,0($20)
|
sb $2,0($20)
|
ori $2,$0,'t'
|
ori $2,$0,'t'
|
sb $2,0($20)
|
sb $2,0($20)
|
sb $23,0($20)
|
sb $23,0($20)
|
sb $21,0($20)
|
sb $21,0($20)
|
|
|
#a: SLL
|
#a: SLL
|
ori $2,$0,'a'
|
ori $2,$0,'a'
|
sb $2,0($20)
|
sb $2,0($20)
|
li $2,0x40414243
|
li $2,0x40414243
|
sll $3,$2,8
|
sll $3,$2,8
|
srl $3,$3,24
|
srl $3,$3,24
|
sb $3,0($20)
|
sb $3,0($20)
|
sb $23,0($20)
|
sb $23,0($20)
|
sb $21,0($20)
|
sb $21,0($20)
|
|
|
#b: SLLV
|
#b: SLLV
|
ori $2,$0,'b'
|
ori $2,$0,'b'
|
sb $2,0($20)
|
sb $2,0($20)
|
li $2,0x40414243
|
li $2,0x40414243
|
ori $3,$0,8
|
ori $3,$0,8
|
sllv $3,$2,$3
|
sllv $3,$2,$3
|
srl $3,$3,24
|
srl $3,$3,24
|
sb $3,0($20)
|
sb $3,0($20)
|
sb $23,0($20)
|
sb $23,0($20)
|
sb $21,0($20)
|
sb $21,0($20)
|
|
|
#c: SRA
|
#c: SRA
|
ori $2,$0,'c'
|
ori $2,$0,'c'
|
sb $2,0($20)
|
sb $2,0($20)
|
li $2,0x40414243
|
li $2,0x40414243
|
sra $3,$2,16
|
sra $3,$2,16
|
sb $3,0($20)
|
sb $3,0($20)
|
li $2,0x84000000
|
li $2,0x84000000
|
sra $3,$2,25
|
sra $3,$2,25
|
sub $3,$3,0x80
|
sub $3,$3,0x80
|
sb $3,0($20)
|
sb $3,0($20)
|
sb $23,0($20)
|
sb $23,0($20)
|
sb $21,0($20)
|
sb $21,0($20)
|
|
|
#d: SRAV
|
#d: SRAV
|
ori $2,$0,'d'
|
ori $2,$0,'d'
|
sb $2,0($20)
|
sb $2,0($20)
|
li $2,0x40414243
|
li $2,0x40414243
|
ori $3,$0,16
|
ori $3,$0,16
|
srav $3,$2,$3
|
srav $3,$2,$3
|
sb $3,0($20)
|
sb $3,0($20)
|
ori $3,$0,25
|
ori $3,$0,25
|
li $2,0x84000000
|
li $2,0x84000000
|
srav $3,$2,$3
|
srav $3,$2,$3
|
sub $3,$3,0x80
|
sub $3,$3,0x80
|
sb $3,0($20)
|
sb $3,0($20)
|
sb $23,0($20)
|
sb $23,0($20)
|
sb $21,0($20)
|
sb $21,0($20)
|
|
|
#e: SRL
|
#e: SRL
|
ori $2,$0,'e'
|
ori $2,$0,'e'
|
sb $2,0($20)
|
sb $2,0($20)
|
li $2,0x40414243
|
li $2,0x40414243
|
srl $3,$2,16
|
srl $3,$2,16
|
sb $3,0($20)
|
sb $3,0($20)
|
li $2,0x84000000
|
li $2,0x84000000
|
srl $3,$2,25
|
srl $3,$2,25
|
sb $3,0($20)
|
sb $3,0($20)
|
sb $23,0($20)
|
sb $23,0($20)
|
sb $21,0($20)
|
sb $21,0($20)
|
|
|
#f: SRLV
|
#f: SRLV
|
ori $2,$0,'f'
|
ori $2,$0,'f'
|
sb $2,0($20)
|
sb $2,0($20)
|
li $2,0x40414243
|
li $2,0x40414243
|
ori $3,$0,16
|
ori $3,$0,16
|
srlv $4,$2,$3
|
srlv $4,$2,$3
|
sb $4,0($20)
|
sb $4,0($20)
|
ori $3,$0,25
|
ori $3,$0,25
|
li $2,0x84000000
|
li $2,0x84000000
|
srlv $3,$2,$3
|
srlv $3,$2,$3
|
sb $3,0($20)
|
sb $3,0($20)
|
sb $23,0($20)
|
sb $23,0($20)
|
sb $21,0($20)
|
sb $21,0($20)
|
|
|
|
|
ori $2,$0,'D'
|
|
sb $2,0($20)
|
|
ori $2,$0,'o'
|
|
sb $2,0($20)
|
|
ori $2,$0,'n'
|
|
sb $2,0($20)
|
|
ori $2,$0,'e'
|
|
sb $2,0($20)
|
|
sb $23,0($20)
|
|
sb $21,0($20)
|
|
|
|
# These tests are to be evaluated by matching logs with the software
|
######################################
|
# simulator. There is no need to perform any actual tests here, if there is
|
#Emulated MIPS32r2 Instructions
|
# any error it will show up as a mismatch in the logs.
|
######################################
|
|
.ifgt EMU_MIPS32
|
|
ori $2,$0,'M'
|
|
sb $2,0($20)
|
|
ori $2,$0,'i'
|
|
sb $2,0($20)
|
|
ori $2,$0,'p'
|
|
sb $2,0($20)
|
|
ori $2,$0,'s'
|
|
sb $2,0($20)
|
|
ori $2,$0,'3'
|
|
sb $2,0($20)
|
|
ori $2,$0,'2'
|
|
sb $2,0($20)
|
|
ori $2,$0,'r'
|
|
sb $2,0($20)
|
|
ori $2,$0,'2'
|
|
sb $2,0($20)
|
|
sb $23,0($20)
|
|
sb $21,0($20)
|
|
|
|
#-- EXT ---------------------------
|
|
ori $a1,$zero,'a'
|
|
sb $a1,0($20)
|
|
li $a0,0x01234567
|
|
ext $a1,$a0,12,8
|
|
addi $a1,$a1,'A' - 0x34
|
|
sb $a1,0($20)
|
|
ext $a1,$a0,0,8
|
|
addi $a1,$a1,'B' - 0x67
|
|
sb $a1,0($20)
|
|
ext $a1,$a0,0,4
|
|
addi $a1,$a1,'C' - 0x7
|
|
sb $a1,0($20)
|
|
ext $a2,$a0,20,12
|
|
addi $a2,$a2,'D' - 0x012
|
|
sb $a2,0($20)
|
|
|
|
sb $23,0($20)
|
|
sb $21,0($20)
|
|
|
|
#-- INS ---------------------------
|
|
ori $a1,$zero,'b'
|
|
sb $a1,0($20)
|
|
li $a0,0x01234567
|
|
ori $a2,$zero,0xc35a
|
|
test_ins_1:
|
|
move $a1,$a0
|
|
ins $a1,$a2,0,8
|
|
li $a3,0x0123455a
|
|
bne $a3,$a1,test_ins_2
|
|
ori $a1,$zero,'A'
|
|
sb $a1,0($20)
|
|
test_ins_2:
|
|
move $a1,$a0
|
|
ins $a1,$a2,4,8
|
|
li $a3,0x012345a7
|
|
bne $a3,$a1,test_ins_3
|
|
ori $a1,$zero,'B'
|
|
sb $a1,0($20)
|
|
test_ins_3:
|
|
move $a1,$a0
|
|
ins $a1,$a2,24,8
|
|
li $a3,0x5a234567
|
|
bne $a3,$a1,test_ins_4
|
|
ori $a1,$zero,'C'
|
|
sb $a1,0($20)
|
|
test_ins_4:
|
|
move $a1,$a0
|
|
ins $a1,$a2,30,2
|
|
li $a3,0x81234567
|
|
bne $a3,$a1,test_ins_5
|
|
ori $a1,$zero,'D'
|
|
sb $a1,0($20)
|
|
test_ins_5:
|
|
sb $23,0($20)
|
|
sb $21,0($20)
|
|
|
|
#-- CLZ ---------------------------
|
|
ori $a1,$zero,'c'
|
|
sb $a1,0($20)
|
|
|
|
li $a1,0x00080000
|
|
clz $a1,$a1
|
|
addiu $a1,$a1,'A'-12
|
|
sb $a1,0($20)
|
|
|
|
li $a1,0x40000000
|
|
clz $a1,$a1
|
|
addiu $a1,$a1,'B'-1
|
|
sb $a1,0($20)
|
|
|
|
clz $a1,$zero
|
|
addiu $a1,$a1,'C'-32
|
|
sb $a1,0($20)
|
|
|
|
li $k1,0x80000000
|
|
clz $k0,$k1
|
|
addiu $a1,$k0,'D'-0
|
|
sb $a1,0($20)
|
|
|
|
sb $23,0($20)
|
|
sb $21,0($20)
|
|
|
|
#-- CLO ---------------------------
|
|
ori $a1,$zero,'d'
|
|
sb $a1,0($20)
|
|
|
|
li $a1,0xfff7ffff
|
|
clo $a1,$a1
|
|
addiu $a1,$a1,'A'-12
|
|
sb $a1,0($20)
|
|
|
|
li $a1,0xbfffffff
|
|
clo $a1,$a1
|
|
addiu $a1,$a1,'B'-1
|
|
sb $a1,0($20)
|
|
|
|
li $a1,0xffffffff
|
|
clo $a1,$a1
|
|
addiu $a1,$a1,'C'-32
|
|
sb $a1,0($20)
|
|
|
|
li $k1,0x7fffffff
|
|
clo $k0,$k1
|
|
addiu $a1,$k0,'D'-0
|
|
sb $a1,0($20)
|
|
|
|
sb $23,0($20)
|
|
sb $21,0($20)
|
|
.endif
|
|
|
|
# Print 'Done'; the rest of the tests are for log matching only
|
|
ori $2,$0,'D'
|
|
sb $2,0($20)
|
|
ori $2,$0,'o'
|
|
sb $2,0($20)
|
|
ori $2,$0,'n'
|
|
sb $2,0($20)
|
|
ori $2,$0,'e'
|
|
sb $2,0($20)
|
|
sb $23,0($20)
|
|
sb $21,0($20)
|
|
|
#-- Arithmetic --------------------------------------------------
|
|
ori $s0,$zero,0xa5a5
|
|
ori $s1,$zero,15
|
|
ori $s2,$zero,1
|
|
li $s3,-1
|
|
li $s4,-1000
|
|
li $s5,0x80000000
|
|
li $s6,0x7fffffff
|
|
|
|
#-- ADD ---------------------------
|
|
move $t0,$s0 # P + P = P
|
|
move $t1,$s1
|
|
add $t0,$t1,$s1
|
|
move $t0,$s0 # P + N = P
|
|
move $t1,$s1
|
|
add $t0,$t1,$s3
|
|
move $t0,$s0 # P + N = N
|
|
move $t1,$s1
|
|
add $t0,$t1,$s4
|
|
move $t0,$s0 # P + P = N (overflow)
|
|
move $t1,$s6
|
|
add $t0,$t1,$s6
|
|
move $t0,$s0 # N + N = P (overflow)
|
|
move $t1,$s5
|
|
add $t0,$t1,$s5
|
|
|
|
#-- ADDI --------------------------
|
|
move $t0,$s0 # N + N = P (overflow)
|
|
move $t1,$s5
|
|
addi $t0,$t1,-1
|
|
move $t0,$s0 # N + P = N
|
|
move $t1,$s5
|
|
addi $t0,$t1,15
|
|
move $t0,$s0 # N + P = P
|
|
move $t1,$s3
|
|
addi $t0,$t1,2
|
|
move $t0,$s0 # P + P = P
|
|
move $t1,$s1
|
|
addi $t0,$t1,2
|
|
move $t0,$s0 # P + P = N (overflow)
|
|
move $t1,$s6
|
|
addi $t0,$t1,2
|
|
|
|
#-- ADDIU -------------------------
|
|
move $t0,$s0 # N + N = P (overflow)
|
|
move $t1,$s5
|
|
addiu $t0,$t1,-1
|
|
move $t0,$s0 # N + P = N
|
|
move $t1,$s5
|
|
addiu $t0,$t1,15
|
|
move $t0,$s0 # N + P = P
|
|
move $t1,$s3
|
|
addiu $t0,$t1,2
|
|
move $t0,$s0 # P + P = P
|
|
move $t1,$s1
|
|
addiu $t0,$t1,2
|
|
move $t0,$s0 # P + P = N (overflow)
|
|
move $t1,$s6
|
|
addiu $t0,$t1,2
|
|
|
|
#-- ADDU --------------------------
|
|
move $t0,$s0 # P + P = P
|
|
move $t1,$s1
|
|
addu $t0,$t1,$s1
|
|
move $t0,$s0 # P + N = P
|
|
move $t1,$s1
|
|
addu $t0,$t1,$s3
|
|
move $t0,$s0 # P + N = N
|
|
move $t1,$s1
|
|
addu $t0,$t1,$s4
|
|
move $t0,$s0 # P + P = N (overflow)
|
|
move $t1,$s6
|
|
addu $t0,$t1,$s6
|
|
move $t0,$s0 # N + N = P (overflow)
|
|
move $t1,$s5
|
|
addu $t0,$t1,$s5
|
|
|
|
#-- SUB ---------------------------
|
|
move $t0,$s0 # P - P = P
|
|
move $t1,$s2
|
|
sub $t0,$t1,$s1
|
|
move $t0,$s0 # P - N = P
|
|
move $t1,$s1
|
|
add $t0,$t1,$s3
|
|
move $t0,$s0 # P + N = N
|
|
move $t1,$s1
|
|
add $t0,$t1,$s4
|
|
move $t0,$s0 # P + P = N (overflow)
|
|
move $t1,$s6
|
|
add $t0,$t1,$s6
|
|
move $t0,$s0 # N + N = P (overflow)
|
|
move $t1,$s5
|
|
add $t0,$t1,$s5
|
|
|
|
# SLT, SLTI, SLTIU
|
|
ori $a2,$zero,0xa5a5
|
|
ori $a0,$zero,15
|
|
ori $a1,$zero,1
|
|
move $v0,$a3
|
|
slt $v0,$a0,$a1
|
|
move $v0,$a3
|
|
slt $v0,$a1,$a0
|
|
move $v0,$a3
|
|
slti $v0,$a0,1
|
|
move $v0,$a3
|
|
slti $v0,$a1,15
|
|
move $v0,$a3
|
|
sltiu $v0,$a0,1
|
|
move $v0,$a3
|
|
sltiu $v0,$a1,15
|
|
li $a1,0xa5a5
|
|
li $a0,1029
|
|
addiu $a0,$a0,-2000
|
|
sltu $a1,$a0,1000
|
|
|
|
|
|
#-- Relative jumps ----------------------------------------------
|
|
li $s0,0x7fffffff
|
|
ori $s1,1000
|
|
ori $s1,15
|
|
ori $s1,2
|
|
li $s4,0x80000000
|
|
li $s5,-1001
|
|
li $s6,-16
|
|
li $s7,-3
|
|
|
|
bgtz $s1,test_b0
|
# These tests are to be evaluated by matching logs with the software
|
nop
|
# simulator. There is no need to perform any actual tests here, if there is
|
ori $v0,0x5500
|
# any error it will show up as a mismatch in the logs.
|
test_b0:
|
|
bgtz $s7,test_b1
|
|
nop
|
|
ori $v0,0x5501
|
|
test_b1:
|
|
bgtz $s0,test_b2
|
|
nop
|
|
ori $v0,0x5502
|
|
test_b2:
|
|
bgtz $s4,test_b3
|
|
nop
|
|
ori $v0,0x5503
|
|
test_b3:
|
|
bgez $s1,test_b4
|
|
nop
|
|
ori $v0,0x5500
|
|
test_b4:
|
|
bgez $s7,test_b5
|
|
nop
|
|
ori $v0,0x5501
|
|
test_b5:
|
|
bgez $s0,test_b6
|
|
nop
|
|
ori $v0,0x5502
|
|
test_b6:
|
|
bgez $s4,test_b7
|
|
nop
|
|
ori $v0,0x5503
|
|
test_b7:
|
|
bltz $s1,test_b8
|
|
nop
|
|
ori $v0,0x5500
|
|
test_b8:
|
|
bltz $s7,test_b9
|
|
nop
|
|
ori $v0,0x5501
|
|
test_b9:
|
|
bltz $s0,test_b10
|
|
nop
|
|
ori $v0,0x5502
|
|
test_b10:
|
|
bltz $s4,test_b11
|
|
nop
|
|
ori $v0,0x5503
|
|
test_b11:
|
|
|
|
$DONE:
|
#-- Arithmetic --------------------------------------------------
|
|
ori $s0,$zero,0xa5a5
|
|
ori $s1,$zero,15
|
|
ori $s2,$zero,1
|
|
li $s3,-1
|
|
li $s4,-1000
|
|
li $s5,0x80000000
|
|
li $s6,0x7fffffff
|
|
|
|
#-- ADD ---------------------------
|
|
move $t0,$s0 # P + P = P
|
|
move $t1,$s1
|
|
add $t0,$t1,$s1
|
|
move $t0,$s0 # P + N = P
|
|
move $t1,$s1
|
|
add $t0,$t1,$s3
|
|
move $t0,$s0 # P + N = N
|
|
move $t1,$s1
|
|
add $t0,$t1,$s4
|
|
move $t0,$s0 # P + P = N (overflow)
|
|
move $t1,$s6
|
|
add $t0,$t1,$s6
|
|
move $t0,$s0 # N + N = P (overflow)
|
|
move $t1,$s5
|
|
add $t0,$t1,$s5
|
|
|
|
#-- ADDI --------------------------
|
|
move $t0,$s0 # N + N = P (overflow)
|
|
move $t1,$s5
|
|
addi $t0,$t1,-1
|
|
move $t0,$s0 # N + P = N
|
|
move $t1,$s5
|
|
addi $t0,$t1,15
|
|
move $t0,$s0 # N + P = P
|
|
move $t1,$s3
|
|
addi $t0,$t1,2
|
|
move $t0,$s0 # P + P = P
|
|
move $t1,$s1
|
|
addi $t0,$t1,2
|
|
move $t0,$s0 # P + P = N (overflow)
|
|
move $t1,$s6
|
|
addi $t0,$t1,2
|
|
|
|
#-- ADDIU -------------------------
|
|
move $t0,$s0 # N + N = P (overflow)
|
|
move $t1,$s5
|
|
addiu $t0,$t1,-1
|
|
move $t0,$s0 # N + P = N
|
|
move $t1,$s5
|
|
addiu $t0,$t1,15
|
|
move $t0,$s0 # N + P = P
|
|
move $t1,$s3
|
|
addiu $t0,$t1,2
|
|
move $t0,$s0 # P + P = P
|
|
move $t1,$s1
|
|
addiu $t0,$t1,2
|
|
move $t0,$s0 # P + P = N (overflow)
|
|
move $t1,$s6
|
|
addiu $t0,$t1,2
|
|
|
|
#-- ADDU --------------------------
|
|
move $t0,$s0 # P + P = P
|
|
move $t1,$s1
|
|
addu $t0,$t1,$s1
|
|
move $t0,$s0 # P + N = P
|
|
move $t1,$s1
|
|
addu $t0,$t1,$s3
|
|
move $t0,$s0 # P + N = N
|
|
move $t1,$s1
|
|
addu $t0,$t1,$s4
|
|
move $t0,$s0 # P + P = N (overflow)
|
|
move $t1,$s6
|
|
addu $t0,$t1,$s6
|
|
move $t0,$s0 # N + N = P (overflow)
|
|
move $t1,$s5
|
|
addu $t0,$t1,$s5
|
|
|
|
#-- SUB ---------------------------
|
|
move $t0,$s0 # P - P = P
|
|
move $t1,$s2
|
|
sub $t0,$t1,$s1
|
|
move $t0,$s0 # P - N = P
|
|
move $t1,$s1
|
|
add $t0,$t1,$s3
|
|
move $t0,$s0 # P + N = N
|
|
move $t1,$s1
|
|
add $t0,$t1,$s4
|
|
move $t0,$s0 # P + P = N (overflow)
|
|
move $t1,$s6
|
|
add $t0,$t1,$s6
|
|
move $t0,$s0 # N + N = P (overflow)
|
|
move $t1,$s5
|
|
add $t0,$t1,$s5
|
|
|
|
# SLT, SLTI, SLTIU
|
|
ori $a2,$zero,0xa5a5
|
|
ori $a0,$zero,15
|
|
ori $a1,$zero,1
|
|
move $v0,$a3
|
|
slt $v0,$a0,$a1
|
|
move $v0,$a3
|
|
slt $v0,$a1,$a0
|
|
move $v0,$a3
|
|
slti $v0,$a0,1
|
|
move $v0,$a3
|
|
slti $v0,$a1,15
|
|
move $v0,$a3
|
|
sltiu $v0,$a0,1
|
|
move $v0,$a3
|
|
sltiu $v0,$a1,15
|
|
li $a1,0xa5a5
|
|
li $a0,1029
|
|
addiu $a0,$a0,-2000
|
|
sltu $a1,$a0,1000
|
|
|
|
|
|
#-- Relative jumps ----------------------------------------------
|
|
li $s0,0x7fffffff
|
|
ori $s1,1000
|
|
ori $s1,15
|
|
ori $s1,2
|
|
li $s4,0x80000000
|
|
li $s5,-1001
|
|
li $s6,-16
|
|
li $s7,-3
|
|
|
|
bgtz $s1,test_b0
|
|
nop
|
|
ori $v0,0x5500
|
|
test_b0:
|
|
bgtz $s7,test_b1
|
|
nop
|
|
ori $v0,0x5501
|
|
test_b1:
|
|
bgtz $s0,test_b2
|
|
nop
|
|
ori $v0,0x5502
|
|
test_b2:
|
|
bgtz $s4,test_b3
|
|
nop
|
|
ori $v0,0x5503
|
|
test_b3:
|
|
bgez $s1,test_b4
|
|
nop
|
|
ori $v0,0x5500
|
|
test_b4:
|
|
bgez $s7,test_b5
|
|
nop
|
|
ori $v0,0x5501
|
|
test_b5:
|
|
bgez $s0,test_b6
|
|
nop
|
|
ori $v0,0x5502
|
|
test_b6:
|
|
bgez $s4,test_b7
|
|
nop
|
|
ori $v0,0x5503
|
|
test_b7:
|
|
bltz $s1,test_b8
|
|
nop
|
|
ori $v0,0x5500
|
|
test_b8:
|
|
bltz $s7,test_b9
|
|
nop
|
|
ori $v0,0x5501
|
|
test_b9:
|
|
bltz $s0,test_b10
|
|
nop
|
|
ori $v0,0x5502
|
|
test_b10:
|
|
bltz $s4,test_b11
|
|
nop
|
|
ori $v0,0x5503
|
|
test_b11:
|
|
|
|
$DONE:
|
j $DONE
|
j $DONE
|
nop
|
nop
|
|
|
# void setup_cache(void) -- invalidates all I- and D-Cache lines (uses no RAM)
|
# void setup_cache(void) -- invalidates all I- and D-Cache lines (uses no RAM)
|
setup_cache:
|
setup_cache:
|
li $a0,0x00010002 # Enable I-cache line invalidation
|
li $a0,0x00010002 # Enable I-cache line invalidation
|
mtc0 $a0,$12
|
mtc0 $a0,$12
|
|
|
# In order to invalidate a I-Cache line we have to write its tag number to
|
# In order to invalidate a I-Cache line we have to write its tag number to
|
# any address while bits CP0[12].17:16=01. The write will be executed as a
|
# any address while bits CP0[12].17:16=01. The write will be executed as a
|
# regular write too, as a side effect, so we need to choose a harmless
|
# regular write too, as a side effect, so we need to choose a harmless
|
# target address. The BSS will do -- it will be cleared later.
|
# target address. The BSS will do -- it will be cleared later.
|
# We'll cover all ICACHE_NUM_LINES lines no matter what the starting
|
# We'll cover all ICACHE_NUM_LINES lines no matter what the starting
|
# address is, anyway.
|
# address is, anyway.
|
|
|
la $a0,__bss_start
|
la $a0,__bss_start
|
li $a2,0
|
li $a2,0
|
li $a1,ICACHE_NUM_LINES-1
|
li $a1,ICACHE_NUM_LINES-1
|
|
|
inv_i_cache_loop:
|
inv_i_cache_loop:
|
sw $a2,0($a0)
|
sw $a2,0($a0)
|
blt $a2,$a1,inv_i_cache_loop
|
blt $a2,$a1,inv_i_cache_loop
|
addi $a2,1
|
addi $a2,1
|
|
|
# Now, the D-Cache is different. To invalidate a D-Cache line you just
|
# Now, the D-Cache is different. To invalidate a D-Cache line you just
|
# read from it (by proper selection of a dummy target address) while bits
|
# read from it (by proper selection of a dummy target address) while bits
|
# CP0[12].17:16=01. The data read is undefined and should be discarded.
|
# CP0[12].17:16=01. The data read is undefined and should be discarded.
|
|
|
li $a0,0 # Use any base address that is mapped
|
li $a0,0 # Use any base address that is mapped
|
li $a2,0
|
li $a2,0
|
li $a1,DCACHE_NUM_LINES-1
|
li $a1,DCACHE_NUM_LINES-1
|
|
|
inv_d_cache_loop:
|
inv_d_cache_loop:
|
lw $zero,0($a0)
|
lw $zero,0($a0)
|
addi $a0,DCACHE_LINE_SIZE*4
|
addi $a0,DCACHE_LINE_SIZE*4
|
blt $a2,$a1,inv_d_cache_loop
|
blt $a2,$a1,inv_d_cache_loop
|
addi $a2,1
|
addi $a2,1
|
|
|
li $a1,0x00020002 # Leave with cache enabled
|
li $a1,0x00020002 # Leave with cache enabled
|
jr $ra
|
jr $ra
|
mtc0 $a1,$12
|
mtc0 $a1,$12
|
.set reorder
|
.set reorder
|
.end entry
|
.end entry
|
|
|
|
|
|
|
No newline at end of file
|
No newline at end of file
|