This is the mail archive of the newlib@sources.redhat.com mailing list for the newlib project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Patch to MIPS setjmp.S


The MIPS implementation of setjmp() and longjmp() will save float
registers for 64-bit code, but not for 32-bit code.  This patch
provides hard and soft versions of both.  __mips_soft_float decides
which is needed.

Tested by building a mips-elf cross-compiler, and by trying
various gcc option combinations by hand.  OK to install?

Richard


	* libc/include/machine/setjmp.h: For mips, define _JBLEN based
	based on __mips_soft_float rather than __mips64.
	* libc/machine/mips/setjmp.S: Provide hard and soft float versions
	of both 32-bit and 64-bit code.

Index: libc/include/machine/setjmp.h
===================================================================
RCS file: /cvs/src/src/newlib/libc/include/machine/setjmp.h,v
retrieving revision 1.12
diff -c -p -d -r1.12 setjmp.h
*** libc/include/machine/setjmp.h	24 Jul 2002 15:44:24 -0000	1.12
--- libc/include/machine/setjmp.h	1 Aug 2002 10:07:40 -0000
*************** _BEGIN_STD_C
*** 71,80 ****
  
  #ifdef __mips__
  #ifdef __mips64
- #define _JBLEN 23
  #define _JBTYPE long long
! #else
  #define _JBLEN 11
  #endif
  #endif
  
--- 71,82 ----
  
  #ifdef __mips__
  #ifdef __mips64
  #define _JBTYPE long long
! #endif
! #ifdef __mips_soft_float
  #define _JBLEN 11
+ #else
+ #define _JBLEN 23
  #endif
  #endif
  
Index: libc/machine/mips/setjmp.S
===================================================================
RCS file: /cvs/src/src/newlib/libc/machine/mips/setjmp.S,v
retrieving revision 1.3
diff -c -p -d -r1.3 setjmp.S
*** libc/machine/mips/setjmp.S	13 Jul 2001 15:41:39 -0000	1.3
--- libc/machine/mips/setjmp.S	1 Aug 2002 10:07:40 -0000
***************
*** 1,72 ****
  /* This is a simple version of setjmp and longjmp for MIPS 32 and 64.
  
!    The MIPS 32 version does NOT save the floating point register, which is
!    wrong, but I don't know how to cleanly handle machines without a
!    floating point coprocessor.
! 
!    Ian Lance Taylor, Cygnus Support, 13 May 1993.
! 
!    The MIPS 64 version saves registers fp20 to fp31.  23 registers
!    are saved in all.  */
  
  #ifdef __mips16
  /* This file contains 32 bit assembly code.  */
  	.set nomips16
  #endif
  
! /* int setjmp (jmp_buf);  */
! 	.globl	setjmp
! 	.ent	setjmp
! setjmp:
! 	.frame	$sp,0,$31
! 
! #ifdef __mips64
! 
! 	sd      $16, 000($4)    /* s0 */
! 	sd      $17, 010($4)    /* s1 */
! 	sd      $18, 020($4)    /* s2 */
! 	sd      $19, 030($4)    /* s3 */
! 	sd      $20, 040($4)    /* s4 */
! 	sd      $21, 050($4)    /* s5 */
! 	sd      $22, 060($4)    /* s6 */
! 	sd      $23, 070($4)    /* s7 */
  
! 	sdc1    $f20, 0100($4)
! 	sdc1    $f21, 0110($4)
! 	sdc1    $f22, 0120($4)
! 	sdc1    $f23, 0130($4)
! 	sdc1    $f24, 0140($4)
! 	sdc1    $f25, 0150($4)
! 	sdc1    $f26, 0160($4)
! 	sdc1    $f27, 0170($4)
! 	sdc1    $f28, 0200($4)
! 	sdc1    $f29, 0210($4)
! 	sdc1    $f30, 0220($4)
! 	sdc1    $f31, 0230($4)
  
! 	sd      $29, 0240($4)   /* sp */
! 	sd      $30, 0250($4)   /* fp */
! 	sd      $31, 0260($4)   /* ra */
  
! #else /* not __mips64 */
  
! 	sw	$16,0($4)	/* $s0 */
! 	sw	$17,4($4)	/* $s1 */
! 	sw	$18,8($4)	/* $s2 */
! 	sw	$19,12($4)	/* $s3 */
! 	sw	$20,16($4)	/* $s4 */
! 	sw	$21,20($4)	/* $s5 */
! 	sw	$22,24($4)	/* $s6 */
! 	sw	$23,28($4)	/* $s7 */
! 	sw	$30,32($4)	/* $s8 */
  
! 	sw	$sp,36($4)
! 	sw	$31,40($4)
  
! #endif /* not __mips64 */
  
  	move	$2,$0
- 
  	j	$31
  
  	.end	setjmp
--- 1,76 ----
  /* 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	setjmp
! setjmp:
! 	.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
*************** setjmp:
*** 77,132 ****
  longjmp:
  	.frame	$sp,0,$31
  
! #ifdef __mips64
! 
! 	ld      $16, 000($4)    /* s0 */
! 	ld      $17, 010($4)    /* s1 */
! 	ld      $18, 020($4)    /* s2 */
! 	ld      $19, 030($4)    /* s3 */
! 	ld      $20, 040($4)    /* s4 */
! 	ld      $21, 050($4)    /* s5 */
! 	ld      $22, 060($4)    /* s6 */
! 	ld      $23, 070($4)    /* s7 */
! 
! 	ldc1    $f20, 0100($4)
! 	ldc1    $f21, 0110($4)
! 	ldc1    $f22, 0120($4)
! 	ldc1    $f23, 0130($4)
! 	ldc1    $f24, 0140($4)
! 	ldc1    $f25, 0150($4)
! 	ldc1    $f26, 0160($4)
! 	ldc1    $f27, 0170($4)
! 	ldc1    $f28, 0200($4)
! 	ldc1    $f29, 0210($4)
! 	ldc1    $f30, 0220($4)
! 	ldc1    $f31, 0230($4)
! 
! 	ld      $29, 0240($4)   /* sp */
! 	ld      $30, 0250($4)   /* fp */
! 	ld      $31, 0260($4)   /* ra */
! 
! #else /* not __mips64 */
! 
! 	lw	$16,0($4)	/* $s0 */
! 	lw	$17,4($4)	/* $s1 */
! 	lw	$18,8($4)	/* $s2 */
! 	lw	$19,12($4)	/* $s3 */
! 	lw	$20,16($4)	/* $s4 */
! 	lw	$21,20($4)	/* $s5 */
! 	lw	$22,24($4)	/* $s6 */
! 	lw	$23,28($4)	/* $s7 */
! 	lw	$30,32($4)	/* $s8 */
! 
! 	lw	$sp,36($4)
! 	lw	$31,40($4)
! 
! #endif /* not __mips64 */
  
  	bne	$5,$0,1f
  	li	$5,1
  1:
  	move	$2,$5
- 
  	j	$31
  
  	.end longjmp
--- 81,97 ----
  longjmp:
  	.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,1
  1:
  	move	$2,$5
  	j	$31
  
  	.end longjmp


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]