diff options
Diffstat (limited to 'newlib/libc/machine/mips/setjmp.S')
-rw-r--r-- | newlib/libc/machine/mips/setjmp.S | 33 |
1 files changed, 29 insertions, 4 deletions
diff --git a/newlib/libc/machine/mips/setjmp.S b/newlib/libc/machine/mips/setjmp.S index 268cb1862..f2155ca04 100644 --- a/newlib/libc/machine/mips/setjmp.S +++ b/newlib/libc/machine/mips/setjmp.S @@ -23,6 +23,24 @@ #define NUM_GPRS_SAVED 11 #ifdef __mips_hard_float +#if _MIPS_SIM == _ABIN32 + FPR_OFFSET ($f20, 0); \ + FPR_OFFSET ($f22, 1); \ + FPR_OFFSET ($f24, 2); \ + FPR_OFFSET ($f26, 3); \ + FPR_OFFSET ($f28, 4); \ + FPR_OFFSET ($f30, 5); +#elif _MIPS_SIM == _ABI64 +#define FPR_LAYOUT \ + FPR_OFFSET ($f24, 0); \ + FPR_OFFSET ($f25, 1); \ + FPR_OFFSET ($f26, 2); \ + FPR_OFFSET ($f27, 3); \ + FPR_OFFSET ($f28, 4); \ + FPR_OFFSET ($f29, 5); \ + FPR_OFFSET ($f30, 6); \ + FPR_OFFSET ($f31, 7); +#else /* Assuming _MIPS_SIM == _ABIO32 */ #define FPR_LAYOUT \ FPR_OFFSET ($f20, 0); \ FPR_OFFSET ($f21, 1); \ @@ -35,11 +53,12 @@ FPR_OFFSET ($f28, 8); \ FPR_OFFSET ($f29, 9); \ FPR_OFFSET ($f30, 10); \ - FPR_OFFSET ($f31, 11) + FPR_OFFSET ($f31, 11); +#endif #else #define FPR_LAYOUT #endif - + #ifdef __mips64 #define BYTES_PER_WORD 8 #define LOAD_GPR ld @@ -47,12 +66,18 @@ #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 +#if __mips_fpr == 64 +#define BYTES_PER_WORD 8 +#define LOAD_FPR l.d +#define STORE_FPR s.d +#else +#define BYTES_PER_WORD 4 +#define LOAD_FPR lwc1 #define STORE_FPR swc1 #endif +#endif #define GPOFF(INDEX) (INDEX * BYTES_PER_WORD) #define FPOFF(INDEX) ((INDEX + NUM_GPRS_SAVED) * BYTES_PER_WORD) |