summaryrefslogtreecommitdiffstats
path: root/toolchain/musl/patches/010-Add-PowerPC-soft-float-support.patch
diff options
context:
space:
mode:
Diffstat (limited to 'toolchain/musl/patches/010-Add-PowerPC-soft-float-support.patch')
-rw-r--r--toolchain/musl/patches/010-Add-PowerPC-soft-float-support.patch514
1 files changed, 477 insertions, 37 deletions
diff --git a/toolchain/musl/patches/010-Add-PowerPC-soft-float-support.patch b/toolchain/musl/patches/010-Add-PowerPC-soft-float-support.patch
index 195c93337f..4a851571c6 100644
--- a/toolchain/musl/patches/010-Add-PowerPC-soft-float-support.patch
+++ b/toolchain/musl/patches/010-Add-PowerPC-soft-float-support.patch
@@ -11,12 +11,26 @@ Make it possible to run these devices in soft-float mode.
Signed-off-by: Felix Fietkau <nbd@openwrt.org>
---
- create mode 100644 src/fenv/powerpc-sf/fenv.sub
- create mode 100644 src/setjmp/powerpc-sf/longjmp.s
- create mode 100644 src/setjmp/powerpc-sf/longjmp.sub
- create mode 100644 src/setjmp/powerpc-sf/setjmp.s
- create mode 100644 src/setjmp/powerpc-sf/setjmp.sub
+ create mode 100644 src/fenv/powerpc/fenv-sf.c
+--- a/arch/powerpc/bits/fenv.h
++++ b/arch/powerpc/bits/fenv.h
+@@ -1,3 +1,7 @@
++#ifdef _SOFT_FLOAT
++#define FE_ALL_EXCEPT 0
++#define FE_TONEAREST 0
++#else
+ #define FE_TONEAREST 0
+ #define FE_TOWARDZERO 1
+ #define FE_UPWARD 2
+@@ -24,6 +28,7 @@
+
+ #define FE_ALL_INVALID 0x01f80700
+ #endif
++#endif
+
+ typedef unsigned fexcept_t;
+ typedef double fenv_t;
--- a/arch/powerpc/reloc.h
+++ b/arch/powerpc/reloc.h
@@ -1,4 +1,10 @@
@@ -33,7 +47,7 @@ Signed-off-by: Felix Fietkau <nbd@openwrt.org>
--- a/configure
+++ b/configure
-@@ -538,6 +538,10 @@ trycppif "_MIPSEL || __MIPSEL || __MIPSE
+@@ -595,6 +595,10 @@ trycppif "_MIPSEL || __MIPSEL || __MIPSE
trycppif __mips_soft_float "$t" && SUBARCH=${SUBARCH}-sf
fi
@@ -45,31 +59,293 @@ Signed-off-by: Felix Fietkau <nbd@openwrt.org>
&& SUBARCH=${SUBARCH}el
--- /dev/null
-+++ b/src/fenv/powerpc-sf/fenv.sub
-@@ -0,0 +1 @@
-+../fenv.c
++++ b/src/fenv/powerpc/fenv-sf.c
+@@ -0,0 +1,3 @@
++#ifdef _SOFT_FLOAT
++#include "../fenv.c"
++#endif
--- /dev/null
-+++ b/src/setjmp/powerpc-sf/longjmp.s
-@@ -0,0 +1,47 @@
++++ b/src/fenv/powerpc/fenv.S
+@@ -0,0 +1,129 @@
++#ifndef _SOFT_FLOAT
++.global feclearexcept
++.type feclearexcept,@function
++feclearexcept:
++ andis. 3,3,0x3e00
++ /* if (r3 & FE_INVALID) r3 |= all_invalid_flags */
++ andis. 0,3,0x2000
++ stwu 1,-16(1)
++ beq- 0,1f
++ oris 3,3,0x01f8
++ ori 3,3,0x0700
++1:
++ /*
++ * note: fpscr contains various fpu status and control
++ * flags and we dont check if r3 may alter other flags
++ * than the exception related ones
++ * ufpscr &= ~r3
++ */
++ mffs 0
++ stfd 0,8(1)
++ lwz 9,12(1)
++ andc 9,9,3
++ stw 9,12(1)
++ lfd 0,8(1)
++ mtfsf 255,0
++
++ /* return 0 */
++ li 3,0
++ addi 1,1,16
++ blr
++
++.global feraiseexcept
++.type feraiseexcept,@function
++feraiseexcept:
++ andis. 3,3,0x3e00
++ /* if (r3 & FE_INVALID) r3 |= software_invalid_flag */
++ andis. 0,3,0x2000
++ stwu 1,-16(1)
++ beq- 0,1f
++ ori 3,3,0x0400
++1:
++ /* fpscr |= r3 */
++ mffs 0
++ stfd 0,8(1)
++ lwz 9,12(1)
++ or 9,9,3
++ stw 9,12(1)
++ lfd 0,8(1)
++ mtfsf 255,0
++
++ /* return 0 */
++ li 3,0
++ addi 1,1,16
++ blr
++
++.global fetestexcept
++.type fetestexcept,@function
++fetestexcept:
++ andis. 3,3,0x3e00
++ /* return r3 & fpscr */
++ stwu 1,-16(1)
++ mffs 0
++ stfd 0,8(1)
++ lwz 9,12(1)
++ addi 1,1,16
++ and 3,3,9
++ blr
++
++.global fegetround
++.type fegetround,@function
++fegetround:
++ /* return fpscr & 3 */
++ stwu 1,-16(1)
++ mffs 0
++ stfd 0,8(1)
++ lwz 3,12(1)
++ addi 1,1,16
++ clrlwi 3,3,30
++ blr
++
++.global __fesetround
++.type __fesetround,@function
++__fesetround:
++ /*
++ * note: invalid input is not checked, r3 < 4 must hold
++ * fpscr = (fpscr & -4U) | r3
++ */
++ stwu 1,-16(1)
++ mffs 0
++ stfd 0,8(1)
++ lwz 9,12(1)
++ clrrwi 9,9,2
++ or 9,9,3
++ stw 9,12(1)
++ lfd 0,8(1)
++ mtfsf 255,0
++
++ /* return 0 */
++ li 3,0
++ addi 1,1,16
++ blr
++
++.global fegetenv
++.type fegetenv,@function
++fegetenv:
++ /* *r3 = fpscr */
++ mffs 0
++ stfd 0,0(3)
++ /* return 0 */
++ li 3,0
++ blr
++
++.global fesetenv
++.type fesetenv,@function
++fesetenv:
++ cmpwi 3, -1
++ bne 1f
++ mflr 4
++ bl 2f
++ .zero 8
++2: mflr 3
++ mtlr 4
++1: /* fpscr = *r3 */
++ lfd 0,0(3)
++ mtfsf 255,0
++ /* return 0 */
++ li 3,0
++ blr
++#endif
+--- a/src/fenv/powerpc/fenv.s
++++ /dev/null
+@@ -1,123 +0,0 @@
+-.global feclearexcept
+-.type feclearexcept,@function
+-feclearexcept:
+- andis. 3,3,0x3e00
+- # if (r3 & FE_INVALID) r3 |= all_invalid_flags
+- andis. 0,3,0x2000
+- stwu 1,-16(1)
+- beq- 0,1f
+- oris 3,3,0x01f8
+- ori 3,3,0x0700
+-1:
+- # note: fpscr contains various fpu status and control
+- # flags and we dont check if r3 may alter other flags
+- # than the exception related ones
+- # fpscr &= ~r3
+- mffs 0
+- stfd 0,8(1)
+- lwz 9,12(1)
+- andc 9,9,3
+- stw 9,12(1)
+- lfd 0,8(1)
+- mtfsf 255,0
+-
+- # return 0
+- li 3,0
+- addi 1,1,16
+- blr
+-
+-.global feraiseexcept
+-.type feraiseexcept,@function
+-feraiseexcept:
+- andis. 3,3,0x3e00
+- # if (r3 & FE_INVALID) r3 |= software_invalid_flag
+- andis. 0,3,0x2000
+- stwu 1,-16(1)
+- beq- 0,1f
+- ori 3,3,0x0400
+-1:
+- # fpscr |= r3
+- mffs 0
+- stfd 0,8(1)
+- lwz 9,12(1)
+- or 9,9,3
+- stw 9,12(1)
+- lfd 0,8(1)
+- mtfsf 255,0
+-
+- # return 0
+- li 3,0
+- addi 1,1,16
+- blr
+-
+-.global fetestexcept
+-.type fetestexcept,@function
+-fetestexcept:
+- andis. 3,3,0x3e00
+- # return r3 & fpscr
+- stwu 1,-16(1)
+- mffs 0
+- stfd 0,8(1)
+- lwz 9,12(1)
+- addi 1,1,16
+- and 3,3,9
+- blr
+-
+-.global fegetround
+-.type fegetround,@function
+-fegetround:
+- # return fpscr & 3
+- stwu 1,-16(1)
+- mffs 0
+- stfd 0,8(1)
+- lwz 3,12(1)
+- addi 1,1,16
+- clrlwi 3,3,30
+- blr
+-
+-.global __fesetround
+-.type __fesetround,@function
+-__fesetround:
+- # note: invalid input is not checked, r3 < 4 must hold
+- # fpscr = (fpscr & -4U) | r3
+- stwu 1,-16(1)
+- mffs 0
+- stfd 0,8(1)
+- lwz 9,12(1)
+- clrrwi 9,9,2
+- or 9,9,3
+- stw 9,12(1)
+- lfd 0,8(1)
+- mtfsf 255,0
+-
+- # return 0
+- li 3,0
+- addi 1,1,16
+- blr
+-
+-.global fegetenv
+-.type fegetenv,@function
+-fegetenv:
+- # *r3 = fpscr
+- mffs 0
+- stfd 0,0(3)
+- # return 0
+- li 3,0
+- blr
+-
+-.global fesetenv
+-.type fesetenv,@function
+-fesetenv:
+- cmpwi 3, -1
+- bne 1f
+- mflr 4
+- bl 2f
+- .zero 8
+-2: mflr 3
+- mtlr 4
+-1: # fpscr = *r3
+- lfd 0,0(3)
+- mtfsf 255,0
+- # return 0
+- li 3,0
+- blr
+--- /dev/null
++++ b/src/setjmp/powerpc/longjmp.S
+@@ -0,0 +1,69 @@
+ .global _longjmp
+ .global longjmp
+ .type _longjmp,@function
+ .type longjmp,@function
+_longjmp:
+longjmp:
-+# void longjmp(jmp_buf env, int val);
-+# put val into return register and restore the env saved in setjmp
-+# if val(r4) is 0, put 1 there.
-+ # 0) move old return address into r0
++ /*
++ * void longjmp(jmp_buf env, int val);
++ * put val into return register and restore the env saved in setjmp
++ * if val(r4) is 0, put 1 there.
++ */
++ /* 0) move old return address into r0 */
+ lwz 0, 0(3)
-+ # 1) put it into link reg
++ /* 1) put it into link reg */
+ mtlr 0
-+ #2 ) restore stack ptr
++ /* 2 ) restore stack ptr */
+ lwz 1, 4(3)
-+ #3) restore control reg
++ /* 3) restore control reg */
+ lwz 0, 8(3)
+ mtcr 0
-+ #4) restore r14-r31
++ /* 4) restore r14-r31 */
+ lwz 14, 12(3)
+ lwz 15, 16(3)
+ lwz 16, 20(3)
@@ -88,23 +364,107 @@ Signed-off-by: Felix Fietkau <nbd@openwrt.org>
+ lwz 29, 72(3)
+ lwz 30, 76(3)
+ lwz 31, 80(3)
-+ #5) put val into return reg r3
++#ifndef _SOFT_FLOAT
++ lfd 14,88(3)
++ lfd 15,96(3)
++ lfd 16,104(3)
++ lfd 17,112(3)
++ lfd 18,120(3)
++ lfd 19,128(3)
++ lfd 20,136(3)
++ lfd 21,144(3)
++ lfd 22,152(3)
++ lfd 23,160(3)
++ lfd 24,168(3)
++ lfd 25,176(3)
++ lfd 26,184(3)
++ lfd 27,192(3)
++ lfd 28,200(3)
++ lfd 29,208(3)
++ lfd 30,216(3)
++ lfd 31,224(3)
++#endif
++ /* 5) put val into return reg r3 */
+ mr 3, 4
+
-+ #6) check if return value is 0, make it 1 in that case
++ /* 6) check if return value is 0, make it 1 in that case */
+ cmpwi cr7, 4, 0
+ bne cr7, 1f
+ li 3, 1
+1:
+ blr
+
+--- a/src/setjmp/powerpc/longjmp.s
++++ /dev/null
+@@ -1,65 +0,0 @@
+- .global _longjmp
+- .global longjmp
+- .type _longjmp,@function
+- .type longjmp,@function
+-_longjmp:
+-longjmp:
+-# void longjmp(jmp_buf env, int val);
+-# put val into return register and restore the env saved in setjmp
+-# if val(r4) is 0, put 1 there.
+- # 0) move old return address into r0
+- lwz 0, 0(3)
+- # 1) put it into link reg
+- mtlr 0
+- #2 ) restore stack ptr
+- lwz 1, 4(3)
+- #3) restore control reg
+- lwz 0, 8(3)
+- mtcr 0
+- #4) restore r14-r31
+- lwz 14, 12(3)
+- lwz 15, 16(3)
+- lwz 16, 20(3)
+- lwz 17, 24(3)
+- lwz 18, 28(3)
+- lwz 19, 32(3)
+- lwz 20, 36(3)
+- lwz 21, 40(3)
+- lwz 22, 44(3)
+- lwz 23, 48(3)
+- lwz 24, 52(3)
+- lwz 25, 56(3)
+- lwz 26, 60(3)
+- lwz 27, 64(3)
+- lwz 28, 68(3)
+- lwz 29, 72(3)
+- lwz 30, 76(3)
+- lwz 31, 80(3)
+- lfd 14,88(3)
+- lfd 15,96(3)
+- lfd 16,104(3)
+- lfd 17,112(3)
+- lfd 18,120(3)
+- lfd 19,128(3)
+- lfd 20,136(3)
+- lfd 21,144(3)
+- lfd 22,152(3)
+- lfd 23,160(3)
+- lfd 24,168(3)
+- lfd 25,176(3)
+- lfd 26,184(3)
+- lfd 27,192(3)
+- lfd 28,200(3)
+- lfd 29,208(3)
+- lfd 30,216(3)
+- lfd 31,224(3)
+- #5) put val into return reg r3
+- mr 3, 4
+-
+- #6) check if return value is 0, make it 1 in that case
+- cmpwi cr7, 4, 0
+- bne cr7, 1f
+- li 3, 1
+-1:
+- blr
+-
--- /dev/null
-+++ b/src/setjmp/powerpc-sf/longjmp.sub
-@@ -0,0 +1 @@
-+longjmp.s
---- /dev/null
-+++ b/src/setjmp/powerpc-sf/setjmp.s
-@@ -0,0 +1,43 @@
++++ b/src/setjmp/powerpc/setjmp.S
+@@ -0,0 +1,63 @@
+ .global ___setjmp
+ .hidden ___setjmp
+ .global __setjmp
@@ -117,15 +477,15 @@ Signed-off-by: Felix Fietkau <nbd@openwrt.org>
+__setjmp:
+_setjmp:
+setjmp:
-+ # 0) store IP int 0, then into the jmpbuf pointed to by r3 (first arg)
++ /* 0) store IP int 0, then into the jmpbuf pointed to by r3 (first arg) */
+ mflr 0
+ stw 0, 0(3)
-+ # 1) store reg1 (SP)
++ /* 1) store reg1 (SP) */
+ stw 1, 4(3)
-+ # 2) store cr
++ /* 2) store cr */
+ mfcr 0
+ stw 0, 8(3)
-+ # 3) store r14-31
++ /* 3) store r14-31 */
+ stw 14, 12(3)
+ stw 15, 16(3)
+ stw 16, 20(3)
@@ -144,11 +504,91 @@ Signed-off-by: Felix Fietkau <nbd@openwrt.org>
+ stw 29, 72(3)
+ stw 30, 76(3)
+ stw 31, 80(3)
-+ # 4) set return value to 0
++#ifndef _SOFT_FLOAT
++ stfd 14,88(3)
++ stfd 15,96(3)
++ stfd 16,104(3)
++ stfd 17,112(3)
++ stfd 18,120(3)
++ stfd 19,128(3)
++ stfd 20,136(3)
++ stfd 21,144(3)
++ stfd 22,152(3)
++ stfd 23,160(3)
++ stfd 24,168(3)
++ stfd 25,176(3)
++ stfd 26,184(3)
++ stfd 27,192(3)
++ stfd 28,200(3)
++ stfd 29,208(3)
++ stfd 30,216(3)
++ stfd 31,224(3)
++#endif
++ /* 4) set return value to 0 */
+ li 3, 0
-+ # 5) return
++ /* 5) return */
+ blr
---- /dev/null
-+++ b/src/setjmp/powerpc-sf/setjmp.sub
-@@ -0,0 +1 @@
-+setjmp.s
+--- a/src/setjmp/powerpc/setjmp.s
++++ /dev/null
+@@ -1,61 +0,0 @@
+- .global ___setjmp
+- .hidden ___setjmp
+- .global __setjmp
+- .global _setjmp
+- .global setjmp
+- .type __setjmp,@function
+- .type _setjmp,@function
+- .type setjmp,@function
+-___setjmp:
+-__setjmp:
+-_setjmp:
+-setjmp:
+- # 0) store IP int 0, then into the jmpbuf pointed to by r3 (first arg)
+- mflr 0
+- stw 0, 0(3)
+- # 1) store reg1 (SP)
+- stw 1, 4(3)
+- # 2) store cr
+- mfcr 0
+- stw 0, 8(3)
+- # 3) store r14-31
+- stw 14, 12(3)
+- stw 15, 16(3)
+- stw 16, 20(3)
+- stw 17, 24(3)
+- stw 18, 28(3)
+- stw 19, 32(3)
+- stw 20, 36(3)
+- stw 21, 40(3)
+- stw 22, 44(3)
+- stw 23, 48(3)
+- stw 24, 52(3)
+- stw 25, 56(3)
+- stw 26, 60(3)
+- stw 27, 64(3)
+- stw 28, 68(3)
+- stw 29, 72(3)
+- stw 30, 76(3)
+- stw 31, 80(3)
+- stfd 14,88(3)
+- stfd 15,96(3)
+- stfd 16,104(3)
+- stfd 17,112(3)
+- stfd 18,120(3)
+- stfd 19,128(3)
+- stfd 20,136(3)
+- stfd 21,144(3)
+- stfd 22,152(3)
+- stfd 23,160(3)
+- stfd 24,168(3)
+- stfd 25,176(3)
+- stfd 26,184(3)
+- stfd 27,192(3)
+- stfd 28,200(3)
+- stfd 29,208(3)
+- stfd 30,216(3)
+- stfd 31,224(3)
+- # 4) set return value to 0
+- li 3, 0
+- # 5) return
+- blr