7dfb7ed0196abcce9d835bd0fb1ef0f0e6a1d21a
[openwrt/svn-archive/archive.git] / toolchain / musl / patches / 010-Add-PowerPC-soft-float-support.patch
1 From: Felix Fietkau <nbd@openwrt.org>
2 Date: Wed, 8 Jul 2015 13:56:37 +0200
3 Subject: [PATCH] Add PowerPC soft-float support
4
5 Some PowerPC CPUs (e.g. Freescale MPC85xx) have a completely different
6 instruction set for floating point operations (SPE).
7 Executing regular PowerPC floating point instructions results in
8 "Illegal instruction" errors.
9
10 Until support for SPE FPU is added, make it possible to run these
11 devices in soft-float mode.
12
13 Signed-off-by: Felix Fietkau <nbd@openwrt.org>
14 ---
15 create mode 100644 src/fenv/powerpc-sf/fenv.sub
16 create mode 100644 src/setjmp/powerpc-sf/longjmp.s
17 create mode 100644 src/setjmp/powerpc-sf/longjmp.sub
18 create mode 100644 src/setjmp/powerpc-sf/setjmp.s
19 create mode 100644 src/setjmp/powerpc-sf/setjmp.sub
20
21 --- a/configure
22 +++ b/configure
23 @@ -498,6 +498,10 @@ trycppif "_MIPSEL || __MIPSEL || __MIPSE
24 trycppif __mips_soft_float "$t" && SUBARCH=${SUBARCH}-sf
25 fi
26
27 +if test "$ARCH" = "powerpc" ; then
28 +trycppif _SOFT_FLOAT "$t" && SUBARCH=${SUBARCH}-sf
29 +fi
30 +
31 test "$ARCH" = "microblaze" && trycppif __MICROBLAZEEL__ "$t" \
32 && SUBARCH=${SUBARCH}el
33
34 --- /dev/null
35 +++ b/src/fenv/powerpc-sf/fenv.sub
36 @@ -0,0 +1 @@
37 +../fenv.c
38 --- /dev/null
39 +++ b/src/setjmp/powerpc-sf/longjmp.s
40 @@ -0,0 +1,47 @@
41 + .global _longjmp
42 + .global longjmp
43 + .type _longjmp,@function
44 + .type longjmp,@function
45 +_longjmp:
46 +longjmp:
47 +# void longjmp(jmp_buf env, int val);
48 +# put val into return register and restore the env saved in setjmp
49 +# if val(r4) is 0, put 1 there.
50 + # 0) move old return address into r0
51 + lwz 0, 0(3)
52 + # 1) put it into link reg
53 + mtlr 0
54 + #2 ) restore stack ptr
55 + lwz 1, 4(3)
56 + #3) restore control reg
57 + lwz 0, 8(3)
58 + mtcr 0
59 + #4) restore r14-r31
60 + lwz 14, 12(3)
61 + lwz 15, 16(3)
62 + lwz 16, 20(3)
63 + lwz 17, 24(3)
64 + lwz 18, 28(3)
65 + lwz 19, 32(3)
66 + lwz 20, 36(3)
67 + lwz 21, 40(3)
68 + lwz 22, 44(3)
69 + lwz 23, 48(3)
70 + lwz 24, 52(3)
71 + lwz 25, 56(3)
72 + lwz 26, 60(3)
73 + lwz 27, 64(3)
74 + lwz 28, 68(3)
75 + lwz 29, 72(3)
76 + lwz 30, 76(3)
77 + lwz 31, 80(3)
78 + #5) put val into return reg r3
79 + mr 3, 4
80 +
81 + #6) check if return value is 0, make it 1 in that case
82 + cmpwi cr7, 4, 0
83 + bne cr7, 1f
84 + li 3, 1
85 +1:
86 + blr
87 +
88 --- /dev/null
89 +++ b/src/setjmp/powerpc-sf/longjmp.sub
90 @@ -0,0 +1 @@
91 +longjmp.s
92 --- /dev/null
93 +++ b/src/setjmp/powerpc-sf/setjmp.s
94 @@ -0,0 +1,43 @@
95 + .global ___setjmp
96 + .hidden ___setjmp
97 + .global __setjmp
98 + .global _setjmp
99 + .global setjmp
100 + .type __setjmp,@function
101 + .type _setjmp,@function
102 + .type setjmp,@function
103 +___setjmp:
104 +__setjmp:
105 +_setjmp:
106 +setjmp:
107 + # 0) store IP int 0, then into the jmpbuf pointed to by r3 (first arg)
108 + mflr 0
109 + stw 0, 0(3)
110 + # 1) store reg1 (SP)
111 + stw 1, 4(3)
112 + # 2) store cr
113 + mfcr 0
114 + stw 0, 8(3)
115 + # 3) store r14-31
116 + stw 14, 12(3)
117 + stw 15, 16(3)
118 + stw 16, 20(3)
119 + stw 17, 24(3)
120 + stw 18, 28(3)
121 + stw 19, 32(3)
122 + stw 20, 36(3)
123 + stw 21, 40(3)
124 + stw 22, 44(3)
125 + stw 23, 48(3)
126 + stw 24, 52(3)
127 + stw 25, 56(3)
128 + stw 26, 60(3)
129 + stw 27, 64(3)
130 + stw 28, 68(3)
131 + stw 29, 72(3)
132 + stw 30, 76(3)
133 + stw 31, 80(3)
134 + # 4) set return value to 0
135 + li 3, 0
136 + # 5) return
137 + blr
138 --- /dev/null
139 +++ b/src/setjmp/powerpc-sf/setjmp.sub
140 @@ -0,0 +1 @@
141 +setjmp.s