# 0($fp) s0 # s1 # -8($fp) s2 # s3 # -16($fp) s4 # s5 # -24($fp) s6 # s7 # -32($fp) s8/fp # old-ra # ($sp) .text bsy_tmain: subu $sp, $sp, 48 # 16 + 4*8 = 16 + 32 = 48 sw $fp, 8($sp) addu $fp, $sp, 48 sw $ra, -36($fp) sw $s0, 0($fp) sw $s1, -4($fp) sw $s2, -8($fp) sw $s3, -12($fp) sw $s4, -16($fp) sw $s5, -20($fp) sw $s6, -24($fp) sw $s7, -28($fp) sw $a0, 0($fp) li $s0, 0 li $s1, 1 li $s2, 2 li $s3, 3 li $s4, 4 li $s5, 5 li $s6, 6 li $s7, 7 li $t0, 0 b bsy_tmain_test .data bsy_tmain_msg: .asciiz "tmain: S register(s) trashed!\n" .text bsy_tmain_bod: sw $t0, -4($fp) jal thr_yield # # rather unlikely to be trashed if my templates were # used # move $t0, $zero bne $t0, $s0, bsy_bad addi $t0, $t0, 1 bne $t0, $s1, bsy_bad addi $t0, $t0, 1 bne $t0, $s2, bsy_bad addi $t0, $t0, 1 bne $t0, $s3, bsy_bad addi $t0, $t0, 1 bne $t0, $s4, bsy_bad addi $t0, $t0, 1 bne $t0, $s5, bsy_bad addi $t0, $t0, 1 bne $t0, $s6, bsy_bad addi $t0, $t0, 1 beq $t0, $s7, bsy_good bsy_bad: li $v0, 4 la $a0, bsy_tmain_msg syscall bsy_good: lw $t0, -4($fp) addiu $t0, $t0, 1 sw $t0, -4($fp) bsy_tmain_test: blt $t0, 10, bsy_tmain_bod # # Make sure that the thread yield function does not # depend on any of the caller-saved registers being # preserved by the thread functions between yields. # # This "shouldn't" happen, since the thread functions # are supposedly generated in a manner that is # unaware of how the coroutine threads work, e.g., # by a compiler. # li $t0, 0 li $t1, 0 li $t2, 0 li $t3, 0 li $t4, 0 li $t5, 0 li $t6, 0 li $t7, 0 li $t8, 0 li $t9, 0 li $a0, 0 li $a1, 0 li $a2, 0 li $a3, 0 lw $s0, 0($fp) lw $s1, -4($fp) lw $s2, -8($fp) lw $s3, -12($fp) lw $s4, -16($fp) lw $s5, -20($fp) lw $s6, -24($fp) lw $s7, -28($fp) lw $ra, -36($fp) lw $fp, -32($fp) addu $sp, $sp, 48 jr $ra .text .globl main # # 8 + 3 * THR_STATE_SIZE + 3 * 4 * 512 # = 8 + 3 * 60 + 3 * 2048 # = 8 + 180 + 6144 # = 6332 # # fp -> t2stk -2044($fp) # t1stk -4092($fp) # t0stk -6140($fp) # t2 -6200($fp) # t1 -6260($fp) # t0 -6320($fp) # old-ra -6324($fp) # old-fp -6328($fp) # sp -> main: subu $sp, $sp, 6332 sw $fp, 4($sp) sw $ra, 8($sp) addu $fp, $sp, 6332 li $t0, 2048 subu $sp, $sp, 4 sw $t0, 4($sp) # push shared 4th arg la $a3, -6140($fp) li $a2, 0 la $a1, bsy_tmain la $a0, -6320($fp) jal thr_init la $a3, -4092($fp) li $a2, 1 la $a1, bsy_tmain la $a0, -6260($fp) jal thr_init la $a3, -2044($fp) li $a2, 2 la $a1, bsy_tmain la $a0, -6200($fp) jal thr_init addu $sp, $sp, 4 # pop shared 4th arg jal thr_go .data bsy_done_msg: .asciiz "All done!\n" .text la $a0, bsy_done_msg li $v0, 4 syscall lw $ra, -6324($fp) lw $fp, -6328($fp) addu $sp, $sp, 6332 jr $ra