Welcome to mirror list, hosted at ThFree Co, Russian Federation.

cygwin.com/git/newlib-cygwin.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'newlib/libc/machine/mips/setjmp.S')
-rw-r--r--newlib/libc/machine/mips/setjmp.S46
1 files changed, 5 insertions, 41 deletions
diff --git a/newlib/libc/machine/mips/setjmp.S b/newlib/libc/machine/mips/setjmp.S
index 9a8b31d09..4a9347126 100644
--- a/newlib/libc/machine/mips/setjmp.S
+++ b/newlib/libc/machine/mips/setjmp.S
@@ -41,43 +41,6 @@
FPR_OFFSET ($f29, 5); \
FPR_OFFSET ($f30, 6); \
FPR_OFFSET ($f31, 7);
-#elif __mips_fpr == 0 || __mips_fpr == 64
-
-/* This deals with the o32 FPXX and FP64 cases. Here we must use
- SDC1 and LDC1 to access the FPRs. These instructions require
- 8-byte aligned addresses.
- Unfortunately, the MIPS jmp_buf only guarantees 4-byte alignment
- and this cannot be increased without breaking compatibility with
- pre-existing objects built against newlib. There are 11 GPRS
- saved in the jmp_buf so a buffer that happens to be 8-byte aligned
- ends up leaving the FPR slots 4-byte aligned and an (only) 4-byte
- aligned buffer leads to the FPR slots being 8-byte aligned!
-
- To resolve this, we move the location of $31 to the last slot
- in the jmp_buf when the overall buffer is 8-byte aligned. $31
- is simply loaded/stored twice to avoid adding complexity to the
- GPR_LAYOUT macro above as well as FPR_LAYOUT.
-
- The location of the last slot is index 22 which is calculated
- from there being 11 GPRs saved and then 12 FPRs saved so the
- index of the last FPR is 11+11.
-
- The base of the jmp_buf is modified in $4 to allow the
- FPR_OFFSET macros to just use the usual constant slot numbers
- regardless of whether the realignment happened or not. */
-
-#define FPR_LAYOUT \
- and $8, $4, 4; \
- bne $8, $0, 1f; \
- GPR_OFFSET ($31, 22); \
- addiu $4, $4, -4; \
-1: \
- FPR_OFFSET ($f20, 0); \
- FPR_OFFSET ($f22, 2); \
- FPR_OFFSET ($f24, 4); \
- FPR_OFFSET ($f26, 6); \
- FPR_OFFSET ($f28, 8); \
- FPR_OFFSET ($f30, 10);
#else /* Assuming _MIPS_SIM == _ABIO32 */
#define FPR_LAYOUT \
FPR_OFFSET ($f20, 0); \
@@ -106,11 +69,12 @@
#else
#define LOAD_GPR lw
#define STORE_GPR sw
-#define BYTES_PER_WORD 4
-#if __mips_fpr == 0 || __mips_fpr == 64
-#define LOAD_FPR ldc1
-#define STORE_FPR sdc1
+#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