📄 setjmp.s
字号:
/* This is a simple version of setjmp and longjmp for MIPS 32 and 64. Ian Lance Taylor, Cygnus Support, 13 May 1993. */#ifdef __mips16/* This file contains 32 bit assembly code. */ .set nomips16#endif#define GPR_LAYOUT \ GPR_OFFSET ($16, 0); \ GPR_OFFSET ($17, 1); \ GPR_OFFSET ($18, 2); \ GPR_OFFSET ($19, 3); \ GPR_OFFSET ($20, 4); \ GPR_OFFSET ($21, 5); \ GPR_OFFSET ($22, 6); \ GPR_OFFSET ($23, 7); \ GPR_OFFSET ($29, 8); \ GPR_OFFSET ($30, 9); \ GPR_OFFSET ($31, 10)#define NUM_GPRS_SAVED 11#ifdef __mips_hard_float#define FPR_LAYOUT \ FPR_OFFSET ($f20, 0); \ FPR_OFFSET ($f21, 1); \ FPR_OFFSET ($f22, 2); \ FPR_OFFSET ($f23, 3); \ FPR_OFFSET ($f24, 4); \ FPR_OFFSET ($f25, 5); \ FPR_OFFSET ($f26, 6); \ FPR_OFFSET ($f27, 7); \ FPR_OFFSET ($f28, 8); \ FPR_OFFSET ($f29, 9); \ FPR_OFFSET ($f30, 10); \ FPR_OFFSET ($f31, 11)#else#define FPR_LAYOUT#endif#ifdef __mips64#define BYTES_PER_WORD 8#define LOAD_GPR ld#define LOAD_FPR ldc1#define STORE_GPR sd#define STORE_FPR sdc1#else#define BYTES_PER_WORD 4#define LOAD_GPR lw#define LOAD_FPR lwc1#define STORE_GPR sw#define STORE_FPR swc1#endif#define GPOFF(INDEX) (INDEX * BYTES_PER_WORD)#define FPOFF(INDEX) ((INDEX + NUM_GPRS_SAVED) * BYTES_PER_WORD)/* int setjmp (jmp_buf); */ .globl setjmp .ent setjmpsetjmp: .frame $sp,0,$31#define GPR_OFFSET(REG, INDEX) STORE_GPR REG,GPOFF(INDEX)($4)#define FPR_OFFSET(REG, INDEX) STORE_FPR REG,FPOFF(INDEX)($4) GPR_LAYOUT FPR_LAYOUT#undef GPR_OFFSET#undef FPR_OFFSET move $2,$0 j $31 .end setjmp/* volatile void longjmp (jmp_buf, int); */ .globl longjmp .ent longjmplongjmp: .frame $sp,0,$31#define GPR_OFFSET(REG, INDEX) LOAD_GPR REG,GPOFF(INDEX)($4)#define FPR_OFFSET(REG, INDEX) LOAD_FPR REG,FPOFF(INDEX)($4) GPR_LAYOUT FPR_LAYOUT#undef GPR_OFFSET#undef FPR_OFFSET bne $5,$0,1f li $5,11: move $2,$5 j $31 .end longjmp
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -