/* Copyright (c) 2003 Anthony Green <green@moxielogic.com> */
/* This is a simple version of setjmp and longjmp for iq2000. */


/* int setjmp (jmp_buf);  */
#include <picolibc.h>

	.globl	setjmp
	.ent	setjmp
setjmp:
	sw	r16,0(r4)	/* rs0 */
	sw	r17,4(r4)	/* rs1 */
	sw	r18,8(r4)	/* rs2 */
	sw	r19,12(r4)	/* rs3 */
	sw	r20,16(r4)	/* rs4 */
	sw	r21,20(r4)	/* rs5 */
	sw	r22,24(r4)	/* rs6 */
	sw	r23,28(r4)	/* rs7 */
	sw	r30,32(r4)	/* rs8 */

	sw	r29,36(r4)
	sw	r31,40(r4)

	move	r2,r0

	j	r31

	.end	setjmp

/* volatile void longjmp (jmp_buf, int);  */
	.globl	longjmp
	.ent	longjmp
longjmp:
	lw	r16,0(r4)	/* rs0 */
	lw	r17,4(r4)	/* rs1 */
	lw	r18,8(r4)	/* rs2 */
	lw	r19,12(r4)	/* rs3 */
	lw	r20,16(r4)	/* rs4 */
	lw	r21,20(r4)	/* rs5 */
	lw	r22,24(r4)	/* rs6 */
	lw	r23,28(r4)	/* rs7 */
	lw	r30,32(r4)	/* rs8 */

	lw	r29,36(r4)
	lw	r31,40(r4)

	bne	r5,r0,1f
	li	r5,1
1:
	move	r2,r5

	j	r31

	.end longjmp
