* libc/include/machine/setjmp.h [__mips__]: Remove __mips_fpr == 64
from the 64-bit _JBTYPE definition. * libc/machine/mips/setjmp.S: Re-work the o32 FP64 support to match the now one-and-only supported o32 FP64 ABI extension. Also support o32 FPXX.
This commit is contained in:
parent
3bde24b892
commit
d37bfe1da2
|
@ -1,3 +1,11 @@
|
|||
2014-11-28 Matthew Fortune <matthew.fortune@imgtec.com>
|
||||
|
||||
* libc/include/machine/setjmp.h [__mips__]: Remove __mips_fpr == 64
|
||||
from the 64-bit _JBTYPE definition.
|
||||
* libc/machine/mips/setjmp.S: Re-work the o32 FP64 support to match
|
||||
the now one-and-only supported o32 FP64 ABI extension. Also
|
||||
support o32 FPXX.
|
||||
|
||||
2014-11-26 Hale Wang <hale.wang@arm.com>
|
||||
|
||||
* libc/machine/arm/strcmp-armv6m.S: New file.
|
||||
|
|
|
@ -111,7 +111,7 @@ _BEGIN_STD_C
|
|||
#endif
|
||||
|
||||
#ifdef __mips__
|
||||
# if defined(__mips64) || (__mips_fpr == 64)
|
||||
# if defined(__mips64)
|
||||
# define _JBTYPE long long
|
||||
# endif
|
||||
# ifdef __mips_soft_float
|
||||
|
|
|
@ -41,6 +41,43 @@
|
|||
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); \
|
||||
|
@ -69,12 +106,11 @@
|
|||
#else
|
||||
#define LOAD_GPR lw
|
||||
#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
|
||||
#if __mips_fpr == 0 || __mips_fpr == 64
|
||||
#define LOAD_FPR ldc1
|
||||
#define STORE_FPR sdc1
|
||||
#else
|
||||
#define LOAD_FPR lwc1
|
||||
#define STORE_FPR swc1
|
||||
#endif
|
||||
|
|
Loading…
Reference in New Issue