56 lines
		
	
	
		
			1.1 KiB
		
	
	
	
		
			ArmAsm
		
	
	
	
			
		
		
	
	
			56 lines
		
	
	
		
			1.1 KiB
		
	
	
	
		
			ArmAsm
		
	
	
	
; setjmp/longjmp for D10V.  The jmpbuf looks like this:
 | 
						|
;
 | 
						|
; Register		jmpbuf offset
 | 
						|
; R6			0x00
 | 
						|
; R7			0x02
 | 
						|
; R8			0x04
 | 
						|
; R9			0x06
 | 
						|
; R10			0x08
 | 
						|
; R11			0x0a
 | 
						|
; R13 (return address)	0x0c
 | 
						|
; R15 (SP)		0x0E
 | 
						|
 | 
						|
	.text
 | 
						|
	.globl	setjmp
 | 
						|
	.type	setjmp,@function
 | 
						|
	.stabs	"setjmp.S",100,0,0,setjmp
 | 
						|
	.stabs	"int:t(0,1)=r(0,1);-65536;65535;",128,0,0,0
 | 
						|
	.stabs	"setjmp:F(0,1)",36,0,1,setjmp
 | 
						|
 | 
						|
setjmp:
 | 
						|
; Address of jmpbuf is passed in R0.  Save the appropriate registers.
 | 
						|
	st2w	r6, @r0+
 | 
						|
	st2w	r8, @r0+
 | 
						|
	st2w	r10, @r0+
 | 
						|
	st	r13, @r0+
 | 
						|
	st	r15, @r0+
 | 
						|
 | 
						|
; Return 0 to caller
 | 
						|
	ldi	r0, 0
 | 
						|
	jmp	r13
 | 
						|
.Lsetjmp:
 | 
						|
	.size	setjmp,.Lsetjmp-setjmp
 | 
						|
	.stabs	"",36,0,0,.Lsetjmp-setjmp
 | 
						|
 | 
						|
	.globl	longjmp
 | 
						|
	.type	longjmp,@function
 | 
						|
	.stabs	"longjmp:F(0,1)",36,0,1,longjmp
 | 
						|
longjmp:
 | 
						|
; Address of jmpbuf is in R0.  Restore the registers.
 | 
						|
	ld2w	r6, @r0+
 | 
						|
	ld2w	r8, @r0+
 | 
						|
	ld2w	r10, @r0+
 | 
						|
	ld	r13, @r0+
 | 
						|
	ld	r15, @r0+
 | 
						|
 | 
						|
; Value to return to caller is in R1.  If caller attemped to return 0,
 | 
						|
; return 1 instead.
 | 
						|
 | 
						|
	mv	r0, r1
 | 
						|
	cmpeqi	r0, 0
 | 
						|
	exef0t || ldi r0,1
 | 
						|
	jmp	r13
 | 
						|
.Llongjmp:
 | 
						|
	.size	longjmp,.Llongjmp-longjmp
 | 
						|
	.stabs	"",36,0,0,.Llongjmp-longjmp
 |