📄 setjmp.s
字号:
/* *---------------------------------------------------------------------- * T-Kernel / Standard Extension * * Copyright (C) 2006 by Ken Sakamura. All rights reserved. * T-Kernel / Standard Extension is distributed * under the T-License for T-Kernel / Standard Extension. *---------------------------------------------------------------------- * * Version: 1.00.00 * Released by T-Engine Forum(http://www.t-engine.org) at 2006/8/11. * *---------------------------------------------------------------------- *//* * setjmp.S (libtkse) * * setjmp/longjmp (MIPS) */#include <machine.h>#include <tk/asm.h>/* * typedef long long jmp_buf[25] * * Registers to be saved in jmp_buf * jmp_buf[0] $16 s0 * jmp_buf[1] $17 s1 * jmp_buf[2] $18 s2 * jmp_buf[3] $19 s3 * jmp_buf[4] $20 s4 * jmp_buf[5] $21 s5 * jmp_buf[6] $22 s6 * jmp_buf[7] $23 s7 * jmp_buf[8] $28 gp * jmp_buf[9] $29 sp * jmp_buf[10] $30 fp * jmp_buf[11] $31 ra * * jmp_buf[12] $f20 * jmp_buf[13] $f21 * jmp_buf[14] $f22 * jmp_buf[15] $f23 * jmp_buf[16] $f24 * jmp_buf[17] $f25 * jmp_buf[18] $f26 * jmp_buf[19] $f27 * jmp_buf[20] $f28 * jmp_buf[21] $f29 * jmp_buf[22] $f30 * jmp_buf[23] $f31 * jmp_buf[24] FCR31 *//* * int __setjmp( jmp_buf env ) */ .text .balign 4 .globl Csym(__setjmp) .type Csym(__setjmp), @functionCsym(__setjmp): sd $s0, 0*8($a0) // Save general purpose register sd $s1, 1*8($a0) sd $s2, 2*8($a0) sd $s3, 3*8($a0) sd $s4, 4*8($a0) sd $s5, 5*8($a0) sd $s6, 6*8($a0) sd $s7, 7*8($a0) sd $gp, 8*8($a0) sd $sp, 9*8($a0) sd $fp, 10*8($a0) sd $ra, 11*8($a0) sdc1 $f20, 12*8($a0) // Save FPU register sdc1 $f21, 13*8($a0) sdc1 $f22, 14*8($a0) sdc1 $f23, 15*8($a0) sdc1 $f24, 16*8($a0) sdc1 $f25, 17*8($a0) sdc1 $f26, 18*8($a0) sdc1 $f27, 19*8($a0) sdc1 $f28, 20*8($a0) sdc1 $f29, 21*8($a0) sdc1 $f30, 22*8($a0) sdc1 $f31, 23*8($a0) cfc1 $t0, $31 sd $t0, 24*8($a0) // Save FPU control register li $v0, 0 jr $ra/* * void longjmp( jmp_buf env, int rval ) */ .text .align 4 .globl Csym(longjmp) .type Csym(longjmp), @functionCsym(longjmp): ld $s0, 0*8($a0) // Restore general purpose register ld $s1, 1*8($a0) ld $s2, 2*8($a0) ld $s3, 3*8($a0) ld $s4, 4*8($a0) ld $s5, 5*8($a0) ld $s6, 6*8($a0) ld $s7, 7*8($a0) ld $gp, 8*8($a0) ld $sp, 9*8($a0) ld $fp, 10*8($a0) ld $ra, 11*8($a0) ldc1 $f20, 12*8($a0) // Reset FPU register ldc1 $f21, 13*8($a0) ldc1 $f22, 14*8($a0) ldc1 $f23, 15*8($a0) ldc1 $f24, 16*8($a0) ldc1 $f25, 17*8($a0) ldc1 $f26, 18*8($a0) ldc1 $f27, 19*8($a0) ldc1 $f28, 20*8($a0) ldc1 $f29, 21*8($a0) ldc1 $f30, 22*8($a0) ldc1 $f31, 23*8($a0) ld $t0, 24*8($a0) // Reset FPU control register ctc1 $t0, $31 move $v0, $a1 bnez $a1, l1 // if ( rval == 0 ) rval = 1 li $v0, 1 l1: jr $ra
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -