diff options
-rw-r--r-- | apps/codecs/lib/SOURCES | 4 | ||||
-rw-r--r-- | apps/codecs/lib/setjmp_mips.S | 98 |
2 files changed, 102 insertions, 0 deletions
diff --git a/apps/codecs/lib/SOURCES b/apps/codecs/lib/SOURCES index b0ebbc5441..cbb8e60372 100644 --- a/apps/codecs/lib/SOURCES +++ b/apps/codecs/lib/SOURCES @@ -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 diff --git a/apps/codecs/lib/setjmp_mips.S b/apps/codecs/lib/setjmp_mips.S new file mode 100644 index 0000000000..69799a005c --- /dev/null +++ b/apps/codecs/lib/setjmp_mips.S @@ -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 + |