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

📄 setjmp.s

📁 Newlib 嵌入式 C库 标准实现代码
💻 S
字号:
/* Setjmp and longjmp for mmix.   Copyright (C) 2001 Hans-Peter Nilsson   Permission to use, copy, modify, and distribute this software is   freely granted, provided that the above copyright notice, this notice   and the following disclaimer are preserved with no changes.   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.   jmp_buf[5]:   0:	fp   1:	rJ (return-address)   2:	sp   3:	rO *before* the setjmp call.   4:	temporary storage.  Reserved between setjmp and longjmp.  */#ifdef __MMIX_ABI_GNU__#define arg1 $231#define arg2 $232#define outret $231#define popval 0#else#define arg1 $0#define arg2 $1#define outret $0#define popval 1#endif	.section .text.setjmp,"ax",@progbits	.global setjmpsetjmp:% Store fp, sp and return address.  Recycle the static-chain and% structure-return registers as temporary register, since we need to keep% the jmp_buf (parameter 1) and the return address across a "POP".	SET  $251,arg1	STOU $253,$251,0	GET  $252,rJ	STOU $252,$251,8	STOU $254,$251,16	SETL outret,0% Jump through hoops to get the value of rO *before* the setjmp call.	GETA $255,0f	PUT  rJ,$255	POP  popval,00:	GET  $255,rO	STOU $255,$251,24	GO   $255,$252,0	.size setjmp,.-setjmp	.section .text.longjmp,"ax",@progbits	.global longjmplongjmp:% Reset arg2 to 1 if it is 0 (see longjmp(2)) and store it in jmp_buf.% Save arg1 in a global register, since it will be destroyed by the POPs% (in the mmixware ABI).	CSZ  arg2,arg2,1	STOU arg2,arg1,32	SET  $251,arg1% Loop and "POP 0,0" until rO is the expected value, like% the expansion of nonlocal_goto_receiver, except that we put the return% value in the right register and make sure that the POP causes it to% enter the right return-value register as seen by the caller.  For the% GNU ABI, it is unnecessary to do this in the loop and perhaps the memory% access can be hoisted outside the loop, but this is safe and simple and% I see no need to optimize longjmps.	GETA $255,0f	PUT  rJ,$255	LDOU $255,$251,240:	GET  $252,rO	CMPU $252,$252,$255	BNP  $252,1f	LDOU outret,$251,32	POP  popval,01:	LDOU $253,$251,0	LDOU $255,$251,8	LDOU $254,$251,16	GO   $255,$255,0 	.size longjmp,.-longjmp

⌨️ 快捷键说明

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