/* setjmp/longjmp routines.
 *
 * Written by Michael Hayes <m.hayes@elec.canterbury.ac.nz>.
 *
 * The author hereby grant permission to use, copy, modify, distribute,
 * and license this software and its documentation for any purpose, provided
 * that existing copyright notices are retained in all copies and that this
 * notice is included verbatim in any distributions. No written agreement,
 * license, or royalty fee is required for any of the authorized uses.
 * Modifications to this software may be copyrighted by their authors
 * and need not follow the licensing terms described here, provided that
 * the new terms are clearly indicated on the first page of each file where
 * they apply.
 */

	.sect .text
	.global setjmp
	.global longjmp

setjmp:
	pop	r1	   
	ldi	sp, ar0
#ifndef _REGPARM
	ldi	*ar0, ar2	
#endif

	sti	r4, *ar2++
	sti	r5, *ar2++
	stf	r6, *ar2++
	stf	r7, *ar2++
#ifdef _TMS320C4x
	sti	r8, *ar2++
#endif
	sti	ar3, *ar2++
	sti	ar4, *ar2++
	sti	ar5, *ar2++
	sti	ar6, *ar2++
	sti	ar7, *ar2++
	bd	r1	
	sti	r1, *ar2++ 
	sti	ar0, *ar2  
	ldi	0, r0	

	
longjmp:
#ifndef _REGPARM
	ldi	sp, ar0
	ldi	*-ar0(1), ar2  
	ldi	*-ar0(2), r0   
	ldiz	1, r0	
#else
	ldi	r2, r0	 
	ldiz	1, r0	
#endif
 
	ldi	*ar2++, r4 
	ldi	*ar2++, r5 
	ldf	*ar2++, r6 
	ldf	*ar2++, r7
#ifdef _TMS320C4x
	ldi	*ar2++, r8
#endif
	ldi	*ar2++, ar3
	ldi	*ar2++, ar4 
	ldi	*ar2++, ar5 
	ldi	*ar2++, ar6 
	ldi	*ar2++, ar7 
	ldi	*ar2++, r1 
	ldi	*ar2, sp	
    
	b	 r1	
	.end