forked from len0rd/rockbox
Add setjmp implementation for MIPS targets from newlib
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@20713 a1c6a512-1295-4272-9138-f99709370657
This commit is contained in:
parent
493d3a03b3
commit
66b078f643
2 changed files with 102 additions and 0 deletions
|
@ -15,6 +15,10 @@ udiv32_armv4.S
|
|||
setjmp_cf.S
|
||||
#endif
|
||||
|
||||
#ifdef CPU_MIPS
|
||||
setjmp_mips.S
|
||||
#endif
|
||||
|
||||
#elif defined(SIMULATOR) && defined(__APPLE__)
|
||||
osx.dummy.c
|
||||
#endif
|
||||
|
|
98
apps/codecs/lib/setjmp_mips.S
Normal file
98
apps/codecs/lib/setjmp_mips.S
Normal file
|
@ -0,0 +1,98 @@
|
|||
/* 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
|
||||
|
||||
/* volatile void longjmp (jmp_buf, int); */
|
||||
.globl longjmp
|
||||
.ent longjmp
|
||||
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
|
||||
|
Loading…
Add table
Add a link
Reference in a new issue