diff options
Diffstat (limited to 'arch/powerpc')
45 files changed, 323 insertions, 2266 deletions
diff --git a/arch/powerpc/math-emu/sfp-machine.h b/arch/powerpc/include/asm/sfp-machine.h index 4b17d83cfcdd..ced34f1dc8f8 100644 --- a/arch/powerpc/math-emu/sfp-machine.h +++ b/arch/powerpc/include/asm/sfp-machine.h | |||
@@ -79,27 +79,44 @@ | |||
79 | * #define _FP_DIV_MEAT_D(R,X,Y) _FP_DIV_MEAT_2_udiv_64(D,R,X,Y) | 79 | * #define _FP_DIV_MEAT_D(R,X,Y) _FP_DIV_MEAT_2_udiv_64(D,R,X,Y) |
80 | */ | 80 | */ |
81 | 81 | ||
82 | #define _FP_MUL_MEAT_S(R,X,Y) _FP_MUL_MEAT_1_wide(S,R,X,Y,umul_ppmm) | 82 | #define _FP_MUL_MEAT_S(R,X,Y) _FP_MUL_MEAT_1_wide(_FP_WFRACBITS_S,R,X,Y,umul_ppmm) |
83 | #define _FP_MUL_MEAT_D(R,X,Y) _FP_MUL_MEAT_2_wide(D,R,X,Y,umul_ppmm) | 83 | #define _FP_MUL_MEAT_D(R,X,Y) _FP_MUL_MEAT_2_wide(_FP_WFRACBITS_D,R,X,Y,umul_ppmm) |
84 | 84 | ||
85 | #define _FP_DIV_MEAT_S(R,X,Y) _FP_DIV_MEAT_1_udiv(S,R,X,Y) | 85 | #define _FP_DIV_MEAT_S(R,X,Y) _FP_DIV_MEAT_1_udiv(S,R,X,Y) |
86 | #define _FP_DIV_MEAT_D(R,X,Y) _FP_DIV_MEAT_2_udiv_64(D,R,X,Y) | 86 | #define _FP_DIV_MEAT_D(R,X,Y) _FP_DIV_MEAT_2_udiv(D,R,X,Y) |
87 | 87 | ||
88 | /* These macros define what NaN looks like. They're supposed to expand to | 88 | /* These macros define what NaN looks like. They're supposed to expand to |
89 | * a comma-separated set of 32bit unsigned ints that encode NaN. | 89 | * a comma-separated set of 32bit unsigned ints that encode NaN. |
90 | */ | 90 | */ |
91 | #define _FP_NANFRAC_S _FP_QNANBIT_S | 91 | #define _FP_NANFRAC_S ((_FP_QNANBIT_S << 1) - 1) |
92 | #define _FP_NANFRAC_D _FP_QNANBIT_D, 0 | 92 | #define _FP_NANFRAC_D ((_FP_QNANBIT_D << 1) - 1), -1 |
93 | #define _FP_NANFRAC_Q _FP_QNANBIT_Q, 0, 0, 0 | 93 | #define _FP_NANFRAC_Q ((_FP_QNANBIT_Q << 1) - 1), -1, -1, -1 |
94 | #define _FP_NANSIGN_S 0 | ||
95 | #define _FP_NANSIGN_D 0 | ||
96 | #define _FP_NANSIGN_Q 0 | ||
94 | 97 | ||
95 | #define _FP_KEEPNANFRACP 1 | 98 | #define _FP_KEEPNANFRACP 1 |
96 | 99 | ||
100 | /* Exception flags. We use the bit positions of the appropriate bits | ||
101 | in the FPSCR, which also correspond to the FE_* bits. This makes | ||
102 | everything easier ;-). */ | ||
103 | #define FP_EX_INVALID (1 << (31 - 2)) | ||
104 | #define FP_EX_INVALID_SNAN EFLAG_VXSNAN | ||
105 | #define FP_EX_INVALID_ISI EFLAG_VXISI | ||
106 | #define FP_EX_INVALID_IDI EFLAG_VXIDI | ||
107 | #define FP_EX_INVALID_ZDZ EFLAG_VXZDZ | ||
108 | #define FP_EX_INVALID_IMZ EFLAG_VXIMZ | ||
109 | #define FP_EX_OVERFLOW (1 << (31 - 3)) | ||
110 | #define FP_EX_UNDERFLOW (1 << (31 - 4)) | ||
111 | #define FP_EX_DIVZERO (1 << (31 - 5)) | ||
112 | #define FP_EX_INEXACT (1 << (31 - 6)) | ||
113 | |||
97 | /* This macro appears to be called when both X and Y are NaNs, and | 114 | /* This macro appears to be called when both X and Y are NaNs, and |
98 | * has to choose one and copy it to R. i386 goes for the larger of the | 115 | * has to choose one and copy it to R. i386 goes for the larger of the |
99 | * two, sparc64 just picks Y. I don't understand this at all so I'll | 116 | * two, sparc64 just picks Y. I don't understand this at all so I'll |
100 | * go with sparc64 because it's shorter :-> -- PMM | 117 | * go with sparc64 because it's shorter :-> -- PMM |
101 | */ | 118 | */ |
102 | #define _FP_CHOOSENAN(fs, wc, R, X, Y) \ | 119 | #define _FP_CHOOSENAN(fs, wc, R, X, Y, OP) \ |
103 | do { \ | 120 | do { \ |
104 | R##_s = Y##_s; \ | 121 | R##_s = Y##_s; \ |
105 | _FP_FRAC_COPY_##wc(R,Y); \ | 122 | _FP_FRAC_COPY_##wc(R,Y); \ |
@@ -107,62 +124,6 @@ | |||
107 | } while (0) | 124 | } while (0) |
108 | 125 | ||
109 | 126 | ||
110 | extern void fp_unpack_d(long *, unsigned long *, unsigned long *, | ||
111 | long *, long *, void *); | ||
112 | extern int fp_pack_d(void *, long, unsigned long, unsigned long, long, long); | ||
113 | extern int fp_pack_ds(void *, long, unsigned long, unsigned long, long, long); | ||
114 | |||
115 | #define __FP_UNPACK_RAW_1(fs, X, val) \ | ||
116 | do { \ | ||
117 | union _FP_UNION_##fs *_flo = \ | ||
118 | (union _FP_UNION_##fs *)val; \ | ||
119 | \ | ||
120 | X##_f = _flo->bits.frac; \ | ||
121 | X##_e = _flo->bits.exp; \ | ||
122 | X##_s = _flo->bits.sign; \ | ||
123 | } while (0) | ||
124 | |||
125 | #define __FP_UNPACK_RAW_2(fs, X, val) \ | ||
126 | do { \ | ||
127 | union _FP_UNION_##fs *_flo = \ | ||
128 | (union _FP_UNION_##fs *)val; \ | ||
129 | \ | ||
130 | X##_f0 = _flo->bits.frac0; \ | ||
131 | X##_f1 = _flo->bits.frac1; \ | ||
132 | X##_e = _flo->bits.exp; \ | ||
133 | X##_s = _flo->bits.sign; \ | ||
134 | } while (0) | ||
135 | |||
136 | #define __FP_UNPACK_S(X,val) \ | ||
137 | do { \ | ||
138 | __FP_UNPACK_RAW_1(S,X,val); \ | ||
139 | _FP_UNPACK_CANONICAL(S,1,X); \ | ||
140 | } while (0) | ||
141 | |||
142 | #define __FP_UNPACK_D(X,val) \ | ||
143 | fp_unpack_d(&X##_s, &X##_f1, &X##_f0, &X##_e, &X##_c, val) | ||
144 | |||
145 | #define __FP_PACK_RAW_1(fs, val, X) \ | ||
146 | do { \ | ||
147 | union _FP_UNION_##fs *_flo = \ | ||
148 | (union _FP_UNION_##fs *)val; \ | ||
149 | \ | ||
150 | _flo->bits.frac = X##_f; \ | ||
151 | _flo->bits.exp = X##_e; \ | ||
152 | _flo->bits.sign = X##_s; \ | ||
153 | } while (0) | ||
154 | |||
155 | #define __FP_PACK_RAW_2(fs, val, X) \ | ||
156 | do { \ | ||
157 | union _FP_UNION_##fs *_flo = \ | ||
158 | (union _FP_UNION_##fs *)val; \ | ||
159 | \ | ||
160 | _flo->bits.frac0 = X##_f0; \ | ||
161 | _flo->bits.frac1 = X##_f1; \ | ||
162 | _flo->bits.exp = X##_e; \ | ||
163 | _flo->bits.sign = X##_s; \ | ||
164 | } while (0) | ||
165 | |||
166 | #include <linux/kernel.h> | 127 | #include <linux/kernel.h> |
167 | #include <linux/sched.h> | 128 | #include <linux/sched.h> |
168 | 129 | ||
@@ -182,15 +143,30 @@ extern int fp_pack_ds(void *, long, unsigned long, unsigned long, long, long); | |||
182 | #define __FP_PACK_S(val,X) \ | 143 | #define __FP_PACK_S(val,X) \ |
183 | ({ int __exc = _FP_PACK_CANONICAL(S,1,X); \ | 144 | ({ int __exc = _FP_PACK_CANONICAL(S,1,X); \ |
184 | if(!__exc || !__FPU_TRAP_P(__exc)) \ | 145 | if(!__exc || !__FPU_TRAP_P(__exc)) \ |
185 | __FP_PACK_RAW_1(S,val,X); \ | 146 | _FP_PACK_RAW_1_P(S,val,X); \ |
186 | __exc; \ | 147 | __exc; \ |
187 | }) | 148 | }) |
188 | 149 | ||
189 | #define __FP_PACK_D(val,X) \ | 150 | #define __FP_PACK_D(val,X) \ |
190 | fp_pack_d(val, X##_s, X##_f1, X##_f0, X##_e, X##_c) | 151 | do { \ |
191 | 152 | _FP_PACK_CANONICAL(D, 2, X); \ | |
192 | #define __FP_PACK_DS(val,X) \ | 153 | if (!FP_CUR_EXCEPTIONS || !__FPU_TRAP_P(FP_CUR_EXCEPTIONS)) \ |
193 | fp_pack_ds(val, X##_s, X##_f1, X##_f0, X##_e, X##_c) | 154 | _FP_PACK_RAW_2_P(D, val, X); \ |
155 | } while (0) | ||
156 | |||
157 | #define __FP_PACK_DS(val,X) \ | ||
158 | do { \ | ||
159 | FP_DECL_S(__X); \ | ||
160 | FP_CONV(S, D, 1, 2, __X, X); \ | ||
161 | _FP_PACK_CANONICAL(S, 1, __X); \ | ||
162 | if (!FP_CUR_EXCEPTIONS || !__FPU_TRAP_P(FP_CUR_EXCEPTIONS)) { \ | ||
163 | _FP_UNPACK_CANONICAL(S, 1, __X); \ | ||
164 | FP_CONV(D, S, 2, 1, X, __X); \ | ||
165 | _FP_PACK_CANONICAL(D, 2, X); \ | ||
166 | if (!FP_CUR_EXCEPTIONS || !__FPU_TRAP_P(FP_CUR_EXCEPTIONS)) \ | ||
167 | _FP_PACK_RAW_2_P(D, val, X); \ | ||
168 | } \ | ||
169 | } while (0) | ||
194 | 170 | ||
195 | /* Obtain the current rounding mode. */ | 171 | /* Obtain the current rounding mode. */ |
196 | #define FP_ROUNDMODE \ | 172 | #define FP_ROUNDMODE \ |
diff --git a/arch/powerpc/math-emu/Makefile b/arch/powerpc/math-emu/Makefile index 29bc9126241b..03aa98dd9f0a 100644 --- a/arch/powerpc/math-emu/Makefile +++ b/arch/powerpc/math-emu/Makefile | |||
@@ -4,13 +4,14 @@ obj-y := math.o fmr.o lfd.o stfd.o | |||
4 | obj-$(CONFIG_MATH_EMULATION) += fabs.o fadd.o fadds.o fcmpo.o fcmpu.o \ | 4 | obj-$(CONFIG_MATH_EMULATION) += fabs.o fadd.o fadds.o fcmpo.o fcmpu.o \ |
5 | fctiw.o fctiwz.o fdiv.o fdivs.o \ | 5 | fctiw.o fctiwz.o fdiv.o fdivs.o \ |
6 | fmadd.o fmadds.o fmsub.o fmsubs.o \ | 6 | fmadd.o fmadds.o fmsub.o fmsubs.o \ |
7 | fmul.o fmuls.o fnabs.o fneg.o types.o \ | 7 | fmul.o fmuls.o fnabs.o fneg.o \ |
8 | fnmadd.o fnmadds.o fnmsub.o fnmsubs.o \ | 8 | fnmadd.o fnmadds.o fnmsub.o fnmsubs.o \ |
9 | fres.o frsp.o frsqrte.o fsel.o lfs.o \ | 9 | fres.o frsp.o frsqrte.o fsel.o lfs.o \ |
10 | fsqrt.o fsqrts.o fsub.o fsubs.o \ | 10 | fsqrt.o fsqrts.o fsub.o fsubs.o \ |
11 | mcrfs.o mffs.o mtfsb0.o mtfsb1.o \ | 11 | mcrfs.o mffs.o mtfsb0.o mtfsb1.o \ |
12 | mtfsf.o mtfsfi.o stfiwx.o stfs.o \ | 12 | mtfsf.o mtfsfi.o stfiwx.o stfs.o |
13 | udivmodti4.o | ||
14 | 13 | ||
15 | CFLAGS_fabs.o = -fno-builtin-fabs | 14 | CFLAGS_fabs.o = -fno-builtin-fabs |
16 | CFLAGS_math.o = -fno-builtin-fabs | 15 | CFLAGS_math.o = -fno-builtin-fabs |
16 | |||
17 | EXTRA_CFLAGS = -I. -Iinclude/math-emu -w | ||
diff --git a/arch/powerpc/math-emu/double.h b/arch/powerpc/math-emu/double.h deleted file mode 100644 index ffba8b67f059..000000000000 --- a/arch/powerpc/math-emu/double.h +++ /dev/null | |||
@@ -1,129 +0,0 @@ | |||
1 | /* | ||
2 | * Definitions for IEEE Double Precision | ||
3 | */ | ||
4 | |||
5 | #if _FP_W_TYPE_SIZE < 32 | ||
6 | #error "Here's a nickel kid. Go buy yourself a real computer." | ||
7 | #endif | ||
8 | |||
9 | #if _FP_W_TYPE_SIZE < 64 | ||
10 | #define _FP_FRACTBITS_D (2 * _FP_W_TYPE_SIZE) | ||
11 | #else | ||
12 | #define _FP_FRACTBITS_D _FP_W_TYPE_SIZE | ||
13 | #endif | ||
14 | |||
15 | #define _FP_FRACBITS_D 53 | ||
16 | #define _FP_FRACXBITS_D (_FP_FRACTBITS_D - _FP_FRACBITS_D) | ||
17 | #define _FP_WFRACBITS_D (_FP_WORKBITS + _FP_FRACBITS_D) | ||
18 | #define _FP_WFRACXBITS_D (_FP_FRACTBITS_D - _FP_WFRACBITS_D) | ||
19 | #define _FP_EXPBITS_D 11 | ||
20 | #define _FP_EXPBIAS_D 1023 | ||
21 | #define _FP_EXPMAX_D 2047 | ||
22 | |||
23 | #define _FP_QNANBIT_D \ | ||
24 | ((_FP_W_TYPE)1 << ((_FP_FRACBITS_D-2) % _FP_W_TYPE_SIZE)) | ||
25 | #define _FP_IMPLBIT_D \ | ||
26 | ((_FP_W_TYPE)1 << ((_FP_FRACBITS_D-1) % _FP_W_TYPE_SIZE)) | ||
27 | #define _FP_OVERFLOW_D \ | ||
28 | ((_FP_W_TYPE)1 << (_FP_WFRACBITS_D % _FP_W_TYPE_SIZE)) | ||
29 | |||
30 | #if _FP_W_TYPE_SIZE < 64 | ||
31 | |||
32 | union _FP_UNION_D | ||
33 | { | ||
34 | double flt; | ||
35 | struct { | ||
36 | #if __BYTE_ORDER == __BIG_ENDIAN | ||
37 | unsigned sign : 1; | ||
38 | unsigned exp : _FP_EXPBITS_D; | ||
39 | unsigned frac1 : _FP_FRACBITS_D - (_FP_IMPLBIT_D != 0) - _FP_W_TYPE_SIZE; | ||
40 | unsigned frac0 : _FP_W_TYPE_SIZE; | ||
41 | #else | ||
42 | unsigned frac0 : _FP_W_TYPE_SIZE; | ||
43 | unsigned frac1 : _FP_FRACBITS_D - (_FP_IMPLBIT_D != 0) - _FP_W_TYPE_SIZE; | ||
44 | unsigned exp : _FP_EXPBITS_D; | ||
45 | unsigned sign : 1; | ||
46 | #endif | ||
47 | } bits __attribute__((packed)); | ||
48 | }; | ||
49 | |||
50 | #define FP_DECL_D(X) _FP_DECL(2,X) | ||
51 | #define FP_UNPACK_RAW_D(X,val) _FP_UNPACK_RAW_2(D,X,val) | ||
52 | #define FP_PACK_RAW_D(val,X) _FP_PACK_RAW_2(D,val,X) | ||
53 | |||
54 | #define FP_UNPACK_D(X,val) \ | ||
55 | do { \ | ||
56 | _FP_UNPACK_RAW_2(D,X,val); \ | ||
57 | _FP_UNPACK_CANONICAL(D,2,X); \ | ||
58 | } while (0) | ||
59 | |||
60 | #define FP_PACK_D(val,X) \ | ||
61 | do { \ | ||
62 | _FP_PACK_CANONICAL(D,2,X); \ | ||
63 | _FP_PACK_RAW_2(D,val,X); \ | ||
64 | } while (0) | ||
65 | |||
66 | #define FP_NEG_D(R,X) _FP_NEG(D,2,R,X) | ||
67 | #define FP_ADD_D(R,X,Y) _FP_ADD(D,2,R,X,Y) | ||
68 | #define FP_SUB_D(R,X,Y) _FP_SUB(D,2,R,X,Y) | ||
69 | #define FP_MUL_D(R,X,Y) _FP_MUL(D,2,R,X,Y) | ||
70 | #define FP_DIV_D(R,X,Y) _FP_DIV(D,2,R,X,Y) | ||
71 | #define FP_SQRT_D(R,X) _FP_SQRT(D,2,R,X) | ||
72 | |||
73 | #define FP_CMP_D(r,X,Y,un) _FP_CMP(D,2,r,X,Y,un) | ||
74 | #define FP_CMP_EQ_D(r,X,Y) _FP_CMP_EQ(D,2,r,X,Y) | ||
75 | |||
76 | #define FP_TO_INT_D(r,X,rsz,rsg) _FP_TO_INT(D,2,r,X,rsz,rsg) | ||
77 | #define FP_FROM_INT_D(X,r,rs,rt) _FP_FROM_INT(D,2,X,r,rs,rt) | ||
78 | |||
79 | #else | ||
80 | |||
81 | union _FP_UNION_D | ||
82 | { | ||
83 | double flt; | ||
84 | struct { | ||
85 | #if __BYTE_ORDER == __BIG_ENDIAN | ||
86 | unsigned sign : 1; | ||
87 | unsigned exp : _FP_EXPBITS_D; | ||
88 | unsigned long frac : _FP_FRACBITS_D - (_FP_IMPLBIT_D != 0); | ||
89 | #else | ||
90 | unsigned long frac : _FP_FRACBITS_D - (_FP_IMPLBIT_D != 0); | ||
91 | unsigned exp : _FP_EXPBITS_D; | ||
92 | unsigned sign : 1; | ||
93 | #endif | ||
94 | } bits __attribute__((packed)); | ||
95 | }; | ||
96 | |||
97 | #define FP_DECL_D(X) _FP_DECL(1,X) | ||
98 | #define FP_UNPACK_RAW_D(X,val) _FP_UNPACK_RAW_1(D,X,val) | ||
99 | #define FP_PACK_RAW_D(val,X) _FP_PACK_RAW_1(D,val,X) | ||
100 | |||
101 | #define FP_UNPACK_D(X,val) \ | ||
102 | do { \ | ||
103 | _FP_UNPACK_RAW_1(D,X,val); \ | ||
104 | _FP_UNPACK_CANONICAL(D,1,X); \ | ||
105 | } while (0) | ||
106 | |||
107 | #define FP_PACK_D(val,X) \ | ||
108 | do { \ | ||
109 | _FP_PACK_CANONICAL(D,1,X); \ | ||
110 | _FP_PACK_RAW_1(D,val,X); \ | ||
111 | } while (0) | ||
112 | |||
113 | #define FP_NEG_D(R,X) _FP_NEG(D,1,R,X) | ||
114 | #define FP_ADD_D(R,X,Y) _FP_ADD(D,1,R,X,Y) | ||
115 | #define FP_SUB_D(R,X,Y) _FP_SUB(D,1,R,X,Y) | ||
116 | #define FP_MUL_D(R,X,Y) _FP_MUL(D,1,R,X,Y) | ||
117 | #define FP_DIV_D(R,X,Y) _FP_DIV(D,1,R,X,Y) | ||
118 | #define FP_SQRT_D(R,X) _FP_SQRT(D,1,R,X) | ||
119 | |||
120 | /* The implementation of _FP_MUL_D and _FP_DIV_D should be chosen by | ||
121 | the target machine. */ | ||
122 | |||
123 | #define FP_CMP_D(r,X,Y,un) _FP_CMP(D,1,r,X,Y,un) | ||
124 | #define FP_CMP_EQ_D(r,X,Y) _FP_CMP_EQ(D,1,r,X,Y) | ||
125 | |||
126 | #define FP_TO_INT_D(r,X,rsz,rsg) _FP_TO_INT(D,1,r,X,rsz,rsg) | ||
127 | #define FP_FROM_INT_D(X,r,rs,rt) _FP_FROM_INT(D,1,X,r,rs,rt) | ||
128 | |||
129 | #endif /* W_TYPE_SIZE < 64 */ | ||
diff --git a/arch/powerpc/math-emu/fadd.c b/arch/powerpc/math-emu/fadd.c index 7befbbf2c332..04d3b4aa32ce 100644 --- a/arch/powerpc/math-emu/fadd.c +++ b/arch/powerpc/math-emu/fadd.c | |||
@@ -2,8 +2,9 @@ | |||
2 | #include <linux/errno.h> | 2 | #include <linux/errno.h> |
3 | #include <asm/uaccess.h> | 3 | #include <asm/uaccess.h> |
4 | 4 | ||
5 | #include "soft-fp.h" | 5 | #include <asm/sfp-machine.h> |
6 | #include "double.h" | 6 | #include <math-emu/soft-fp.h> |
7 | #include <math-emu/double.h> | ||
7 | 8 | ||
8 | int | 9 | int |
9 | fadd(void *frD, void *frA, void *frB) | 10 | fadd(void *frD, void *frA, void *frB) |
@@ -11,28 +12,28 @@ fadd(void *frD, void *frA, void *frB) | |||
11 | FP_DECL_D(A); | 12 | FP_DECL_D(A); |
12 | FP_DECL_D(B); | 13 | FP_DECL_D(B); |
13 | FP_DECL_D(R); | 14 | FP_DECL_D(R); |
15 | FP_DECL_EX; | ||
14 | int ret = 0; | 16 | int ret = 0; |
15 | 17 | ||
16 | #ifdef DEBUG | 18 | #ifdef DEBUG |
17 | printk("%s: %p %p %p\n", __func__, frD, frA, frB); | 19 | printk("%s: %p %p %p\n", __func__, frD, frA, frB); |
18 | #endif | 20 | #endif |
19 | 21 | ||
20 | __FP_UNPACK_D(A, frA); | 22 | FP_UNPACK_DP(A, frA); |
21 | __FP_UNPACK_D(B, frB); | 23 | FP_UNPACK_DP(B, frB); |
22 | 24 | ||
23 | #ifdef DEBUG | 25 | #ifdef DEBUG |
24 | printk("A: %ld %lu %lu %ld (%ld)\n", A_s, A_f1, A_f0, A_e, A_c); | 26 | printk("A: %ld %lu %lu %ld (%ld)\n", A_s, A_f1, A_f0, A_e, A_c); |
25 | printk("B: %ld %lu %lu %ld (%ld)\n", B_s, B_f1, B_f0, B_e, B_c); | 27 | printk("B: %ld %lu %lu %ld (%ld)\n", B_s, B_f1, B_f0, B_e, B_c); |
26 | #endif | 28 | #endif |
27 | 29 | ||
28 | if (A_s != B_s && A_c == FP_CLS_INF && B_c == FP_CLS_INF) | ||
29 | ret |= EFLAG_VXISI; | ||
30 | |||
31 | FP_ADD_D(R, A, B); | 30 | FP_ADD_D(R, A, B); |
32 | 31 | ||
33 | #ifdef DEBUG | 32 | #ifdef DEBUG |
34 | printk("D: %ld %lu %lu %ld (%ld)\n", R_s, R_f1, R_f0, R_e, R_c); | 33 | printk("D: %ld %lu %lu %ld (%ld)\n", R_s, R_f1, R_f0, R_e, R_c); |
35 | #endif | 34 | #endif |
36 | 35 | ||
37 | return (ret | __FP_PACK_D(frD, R)); | 36 | __FP_PACK_D(frD, R); |
37 | |||
38 | return FP_CUR_EXCEPTIONS; | ||
38 | } | 39 | } |
diff --git a/arch/powerpc/math-emu/fadds.c b/arch/powerpc/math-emu/fadds.c index 2b346b38b480..5930f40a8687 100644 --- a/arch/powerpc/math-emu/fadds.c +++ b/arch/powerpc/math-emu/fadds.c | |||
@@ -2,9 +2,10 @@ | |||
2 | #include <linux/errno.h> | 2 | #include <linux/errno.h> |
3 | #include <asm/uaccess.h> | 3 | #include <asm/uaccess.h> |
4 | 4 | ||
5 | #include "soft-fp.h" | 5 | #include <asm/sfp-machine.h> |
6 | #include "double.h" | 6 | #include <math-emu/soft-fp.h> |
7 | #include "single.h" | 7 | #include <math-emu/double.h> |
8 | #include <math-emu/single.h> | ||
8 | 9 | ||
9 | int | 10 | int |
10 | fadds(void *frD, void *frA, void *frB) | 11 | fadds(void *frD, void *frA, void *frB) |
@@ -12,28 +13,27 @@ fadds(void *frD, void *frA, void *frB) | |||
12 | FP_DECL_D(A); | 13 | FP_DECL_D(A); |
13 | FP_DECL_D(B); | 14 | FP_DECL_D(B); |
14 | FP_DECL_D(R); | 15 | FP_DECL_D(R); |
15 | int ret = 0; | 16 | FP_DECL_EX; |
16 | 17 | ||
17 | #ifdef DEBUG | 18 | #ifdef DEBUG |
18 | printk("%s: %p %p %p\n", __func__, frD, frA, frB); | 19 | printk("%s: %p %p %p\n", __func__, frD, frA, frB); |
19 | #endif | 20 | #endif |
20 | 21 | ||
21 | __FP_UNPACK_D(A, frA); | 22 | FP_UNPACK_DP(A, frA); |
22 | __FP_UNPACK_D(B, frB); | 23 | FP_UNPACK_DP(B, frB); |
23 | 24 | ||
24 | #ifdef DEBUG | 25 | #ifdef DEBUG |
25 | printk("A: %ld %lu %lu %ld (%ld)\n", A_s, A_f1, A_f0, A_e, A_c); | 26 | printk("A: %ld %lu %lu %ld (%ld)\n", A_s, A_f1, A_f0, A_e, A_c); |
26 | printk("B: %ld %lu %lu %ld (%ld)\n", B_s, B_f1, B_f0, B_e, B_c); | 27 | printk("B: %ld %lu %lu %ld (%ld)\n", B_s, B_f1, B_f0, B_e, B_c); |
27 | #endif | 28 | #endif |
28 | 29 | ||
29 | if (A_s != B_s && A_c == FP_CLS_INF && B_c == FP_CLS_INF) | ||
30 | ret |= EFLAG_VXISI; | ||
31 | |||
32 | FP_ADD_D(R, A, B); | 30 | FP_ADD_D(R, A, B); |
33 | 31 | ||
34 | #ifdef DEBUG | 32 | #ifdef DEBUG |
35 | printk("D: %ld %lu %lu %ld (%ld)\n", R_s, R_f1, R_f0, R_e, R_c); | 33 | printk("D: %ld %lu %lu %ld (%ld)\n", R_s, R_f1, R_f0, R_e, R_c); |
36 | #endif | 34 | #endif |
37 | 35 | ||
38 | return (ret | __FP_PACK_DS(frD, R)); | 36 | __FP_PACK_DS(frD, R); |
37 | |||
38 | return FP_CUR_EXCEPTIONS; | ||
39 | } | 39 | } |
diff --git a/arch/powerpc/math-emu/fcmpo.c b/arch/powerpc/math-emu/fcmpo.c index 36d689044c63..b5dc4498cd71 100644 --- a/arch/powerpc/math-emu/fcmpo.c +++ b/arch/powerpc/math-emu/fcmpo.c | |||
@@ -2,14 +2,16 @@ | |||
2 | #include <linux/errno.h> | 2 | #include <linux/errno.h> |
3 | #include <asm/uaccess.h> | 3 | #include <asm/uaccess.h> |
4 | 4 | ||
5 | #include "soft-fp.h" | 5 | #include <asm/sfp-machine.h> |
6 | #include "double.h" | 6 | #include <math-emu/soft-fp.h> |
7 | #include <math-emu/double.h> | ||
7 | 8 | ||
8 | int | 9 | int |
9 | fcmpo(u32 *ccr, int crfD, void *frA, void *frB) | 10 | fcmpo(u32 *ccr, int crfD, void *frA, void *frB) |
10 | { | 11 | { |
11 | FP_DECL_D(A); | 12 | FP_DECL_D(A); |
12 | FP_DECL_D(B); | 13 | FP_DECL_D(B); |
14 | FP_DECL_EX; | ||
13 | int code[4] = { (1 << 3), (1 << 1), (1 << 2), (1 << 0) }; | 15 | int code[4] = { (1 << 3), (1 << 1), (1 << 2), (1 << 0) }; |
14 | long cmp; | 16 | long cmp; |
15 | int ret = 0; | 17 | int ret = 0; |
@@ -18,8 +20,8 @@ fcmpo(u32 *ccr, int crfD, void *frA, void *frB) | |||
18 | printk("%s: %p (%08x) %d %p %p\n", __func__, ccr, *ccr, crfD, frA, frB); | 20 | printk("%s: %p (%08x) %d %p %p\n", __func__, ccr, *ccr, crfD, frA, frB); |
19 | #endif | 21 | #endif |
20 | 22 | ||
21 | __FP_UNPACK_D(A, frA); | 23 | FP_UNPACK_DP(A, frA); |
22 | __FP_UNPACK_D(B, frB); | 24 | FP_UNPACK_DP(B, frB); |
23 | 25 | ||
24 | #ifdef DEBUG | 26 | #ifdef DEBUG |
25 | printk("A: %ld %lu %lu %ld (%ld)\n", A_s, A_f1, A_f0, A_e, A_c); | 27 | printk("A: %ld %lu %lu %ld (%ld)\n", A_s, A_f1, A_f0, A_e, A_c); |
diff --git a/arch/powerpc/math-emu/fcmpu.c b/arch/powerpc/math-emu/fcmpu.c index 53d93894f2a6..d4fb1babc6ad 100644 --- a/arch/powerpc/math-emu/fcmpu.c +++ b/arch/powerpc/math-emu/fcmpu.c | |||
@@ -2,14 +2,16 @@ | |||
2 | #include <linux/errno.h> | 2 | #include <linux/errno.h> |
3 | #include <asm/uaccess.h> | 3 | #include <asm/uaccess.h> |
4 | 4 | ||
5 | #include "soft-fp.h" | 5 | #include <asm/sfp-machine.h> |
6 | #include "double.h" | 6 | #include <math-emu/soft-fp.h> |
7 | #include <math-emu/double.h> | ||
7 | 8 | ||
8 | int | 9 | int |
9 | fcmpu(u32 *ccr, int crfD, void *frA, void *frB) | 10 | fcmpu(u32 *ccr, int crfD, void *frA, void *frB) |
10 | { | 11 | { |
11 | FP_DECL_D(A); | 12 | FP_DECL_D(A); |
12 | FP_DECL_D(B); | 13 | FP_DECL_D(B); |
14 | FP_DECL_EX; | ||
13 | int code[4] = { (1 << 3), (1 << 1), (1 << 2), (1 << 0) }; | 15 | int code[4] = { (1 << 3), (1 << 1), (1 << 2), (1 << 0) }; |
14 | long cmp; | 16 | long cmp; |
15 | 17 | ||
@@ -17,8 +19,8 @@ fcmpu(u32 *ccr, int crfD, void *frA, void *frB) | |||
17 | printk("%s: %p (%08x) %d %p %p\n", __func__, ccr, *ccr, crfD, frA, frB); | 19 | printk("%s: %p (%08x) %d %p %p\n", __func__, ccr, *ccr, crfD, frA, frB); |
18 | #endif | 20 | #endif |
19 | 21 | ||
20 | __FP_UNPACK_D(A, frA); | 22 | FP_UNPACK_DP(A, frA); |
21 | __FP_UNPACK_D(B, frB); | 23 | FP_UNPACK_DP(B, frB); |
22 | 24 | ||
23 | #ifdef DEBUG | 25 | #ifdef DEBUG |
24 | printk("A: %ld %lu %lu %ld (%ld)\n", A_s, A_f1, A_f0, A_e, A_c); | 26 | printk("A: %ld %lu %lu %ld (%ld)\n", A_s, A_f1, A_f0, A_e, A_c); |
diff --git a/arch/powerpc/math-emu/fctiw.c b/arch/powerpc/math-emu/fctiw.c index fcd7a95e021d..f694440ddc00 100644 --- a/arch/powerpc/math-emu/fctiw.c +++ b/arch/powerpc/math-emu/fctiw.c | |||
@@ -2,16 +2,18 @@ | |||
2 | #include <linux/errno.h> | 2 | #include <linux/errno.h> |
3 | #include <asm/uaccess.h> | 3 | #include <asm/uaccess.h> |
4 | 4 | ||
5 | #include "soft-fp.h" | 5 | #include <asm/sfp-machine.h> |
6 | #include "double.h" | 6 | #include <math-emu/soft-fp.h> |
7 | #include <math-emu/double.h> | ||
7 | 8 | ||
8 | int | 9 | int |
9 | fctiw(u32 *frD, void *frB) | 10 | fctiw(u32 *frD, void *frB) |
10 | { | 11 | { |
11 | FP_DECL_D(B); | 12 | FP_DECL_D(B); |
13 | FP_DECL_EX; | ||
12 | unsigned int r; | 14 | unsigned int r; |
13 | 15 | ||
14 | __FP_UNPACK_D(B, frB); | 16 | FP_UNPACK_DP(B, frB); |
15 | FP_TO_INT_D(r, B, 32, 1); | 17 | FP_TO_INT_D(r, B, 32, 1); |
16 | frD[1] = r; | 18 | frD[1] = r; |
17 | 19 | ||
diff --git a/arch/powerpc/math-emu/fctiwz.c b/arch/powerpc/math-emu/fctiwz.c index 1514d59e146e..71e782fd4fe3 100644 --- a/arch/powerpc/math-emu/fctiwz.c +++ b/arch/powerpc/math-emu/fctiwz.c | |||
@@ -2,13 +2,15 @@ | |||
2 | #include <linux/errno.h> | 2 | #include <linux/errno.h> |
3 | #include <asm/uaccess.h> | 3 | #include <asm/uaccess.h> |
4 | 4 | ||
5 | #include "soft-fp.h" | 5 | #include <asm/sfp-machine.h> |
6 | #include "double.h" | 6 | #include <math-emu/soft-fp.h> |
7 | #include <math-emu/double.h> | ||
7 | 8 | ||
8 | int | 9 | int |
9 | fctiwz(u32 *frD, void *frB) | 10 | fctiwz(u32 *frD, void *frB) |
10 | { | 11 | { |
11 | FP_DECL_D(B); | 12 | FP_DECL_D(B); |
13 | FP_DECL_EX; | ||
12 | u32 fpscr; | 14 | u32 fpscr; |
13 | unsigned int r; | 15 | unsigned int r; |
14 | 16 | ||
@@ -16,7 +18,7 @@ fctiwz(u32 *frD, void *frB) | |||
16 | __FPU_FPSCR &= ~(3); | 18 | __FPU_FPSCR &= ~(3); |
17 | __FPU_FPSCR |= FP_RND_ZERO; | 19 | __FPU_FPSCR |= FP_RND_ZERO; |
18 | 20 | ||
19 | __FP_UNPACK_D(B, frB); | 21 | FP_UNPACK_DP(B, frB); |
20 | FP_TO_INT_D(r, B, 32, 1); | 22 | FP_TO_INT_D(r, B, 32, 1); |
21 | frD[1] = r; | 23 | frD[1] = r; |
22 | 24 | ||
diff --git a/arch/powerpc/math-emu/fdiv.c b/arch/powerpc/math-emu/fdiv.c index 18a20fe396b0..2db15097d98e 100644 --- a/arch/powerpc/math-emu/fdiv.c +++ b/arch/powerpc/math-emu/fdiv.c | |||
@@ -2,8 +2,9 @@ | |||
2 | #include <linux/errno.h> | 2 | #include <linux/errno.h> |
3 | #include <asm/uaccess.h> | 3 | #include <asm/uaccess.h> |
4 | 4 | ||
5 | #include "soft-fp.h" | 5 | #include <asm/sfp-machine.h> |
6 | #include "double.h" | 6 | #include <math-emu/soft-fp.h> |
7 | #include <math-emu/double.h> | ||
7 | 8 | ||
8 | int | 9 | int |
9 | fdiv(void *frD, void *frA, void *frB) | 10 | fdiv(void *frD, void *frA, void *frB) |
@@ -11,14 +12,15 @@ fdiv(void *frD, void *frA, void *frB) | |||
11 | FP_DECL_D(A); | 12 | FP_DECL_D(A); |
12 | FP_DECL_D(B); | 13 | FP_DECL_D(B); |
13 | FP_DECL_D(R); | 14 | FP_DECL_D(R); |
15 | FP_DECL_EX; | ||
14 | int ret = 0; | 16 | int ret = 0; |
15 | 17 | ||
16 | #ifdef DEBUG | 18 | #ifdef DEBUG |
17 | printk("%s: %p %p %p\n", __func__, frD, frA, frB); | 19 | printk("%s: %p %p %p\n", __func__, frD, frA, frB); |
18 | #endif | 20 | #endif |
19 | 21 | ||
20 | __FP_UNPACK_D(A, frA); | 22 | FP_UNPACK_DP(A, frA); |
21 | __FP_UNPACK_D(B, frB); | 23 | FP_UNPACK_DP(B, frB); |
22 | 24 | ||
23 | #ifdef DEBUG | 25 | #ifdef DEBUG |
24 | printk("A: %ld %lu %lu %ld (%ld)\n", A_s, A_f1, A_f0, A_e, A_c); | 26 | printk("A: %ld %lu %lu %ld (%ld)\n", A_s, A_f1, A_f0, A_e, A_c); |
@@ -49,5 +51,7 @@ fdiv(void *frD, void *frA, void *frB) | |||
49 | printk("D: %ld %lu %lu %ld (%ld)\n", R_s, R_f1, R_f0, R_e, R_c); | 51 | printk("D: %ld %lu %lu %ld (%ld)\n", R_s, R_f1, R_f0, R_e, R_c); |
50 | #endif | 52 | #endif |
51 | 53 | ||
52 | return (ret | __FP_PACK_D(frD, R)); | 54 | __FP_PACK_D(frD, R); |
55 | |||
56 | return FP_CUR_EXCEPTIONS; | ||
53 | } | 57 | } |
diff --git a/arch/powerpc/math-emu/fdivs.c b/arch/powerpc/math-emu/fdivs.c index 24feed689c35..797f6a9a20b5 100644 --- a/arch/powerpc/math-emu/fdivs.c +++ b/arch/powerpc/math-emu/fdivs.c | |||
@@ -2,9 +2,10 @@ | |||
2 | #include <linux/errno.h> | 2 | #include <linux/errno.h> |
3 | #include <asm/uaccess.h> | 3 | #include <asm/uaccess.h> |
4 | 4 | ||
5 | #include "soft-fp.h" | 5 | #include <asm/sfp-machine.h> |
6 | #include "double.h" | 6 | #include <math-emu/soft-fp.h> |
7 | #include "single.h" | 7 | #include <math-emu/double.h> |
8 | #include <math-emu/single.h> | ||
8 | 9 | ||
9 | int | 10 | int |
10 | fdivs(void *frD, void *frA, void *frB) | 11 | fdivs(void *frD, void *frA, void *frB) |
@@ -12,14 +13,15 @@ fdivs(void *frD, void *frA, void *frB) | |||
12 | FP_DECL_D(A); | 13 | FP_DECL_D(A); |
13 | FP_DECL_D(B); | 14 | FP_DECL_D(B); |
14 | FP_DECL_D(R); | 15 | FP_DECL_D(R); |
16 | FP_DECL_EX; | ||
15 | int ret = 0; | 17 | int ret = 0; |
16 | 18 | ||
17 | #ifdef DEBUG | 19 | #ifdef DEBUG |
18 | printk("%s: %p %p %p\n", __func__, frD, frA, frB); | 20 | printk("%s: %p %p %p\n", __func__, frD, frA, frB); |
19 | #endif | 21 | #endif |
20 | 22 | ||
21 | __FP_UNPACK_D(A, frA); | 23 | FP_UNPACK_DP(A, frA); |
22 | __FP_UNPACK_D(B, frB); | 24 | FP_UNPACK_DP(B, frB); |
23 | 25 | ||
24 | #ifdef DEBUG | 26 | #ifdef DEBUG |
25 | printk("A: %ld %lu %lu %ld (%ld)\n", A_s, A_f1, A_f0, A_e, A_c); | 27 | printk("A: %ld %lu %lu %ld (%ld)\n", A_s, A_f1, A_f0, A_e, A_c); |
@@ -51,5 +53,7 @@ fdivs(void *frD, void *frA, void *frB) | |||
51 | printk("D: %ld %lu %lu %ld (%ld)\n", R_s, R_f1, R_f0, R_e, R_c); | 53 | printk("D: %ld %lu %lu %ld (%ld)\n", R_s, R_f1, R_f0, R_e, R_c); |
52 | #endif | 54 | #endif |
53 | 55 | ||
54 | return (ret | __FP_PACK_DS(frD, R)); | 56 | __FP_PACK_DS(frD, R); |
57 | |||
58 | return FP_CUR_EXCEPTIONS; | ||
55 | } | 59 | } |
diff --git a/arch/powerpc/math-emu/fmadd.c b/arch/powerpc/math-emu/fmadd.c index dedb465fdc68..925313aa6f82 100644 --- a/arch/powerpc/math-emu/fmadd.c +++ b/arch/powerpc/math-emu/fmadd.c | |||
@@ -2,8 +2,9 @@ | |||
2 | #include <linux/errno.h> | 2 | #include <linux/errno.h> |
3 | #include <asm/uaccess.h> | 3 | #include <asm/uaccess.h> |
4 | 4 | ||
5 | #include "soft-fp.h" | 5 | #include <asm/sfp-machine.h> |
6 | #include "double.h" | 6 | #include <math-emu/soft-fp.h> |
7 | #include <math-emu/double.h> | ||
7 | 8 | ||
8 | int | 9 | int |
9 | fmadd(void *frD, void *frA, void *frB, void *frC) | 10 | fmadd(void *frD, void *frA, void *frB, void *frC) |
@@ -13,15 +14,16 @@ fmadd(void *frD, void *frA, void *frB, void *frC) | |||
13 | FP_DECL_D(B); | 14 | FP_DECL_D(B); |
14 | FP_DECL_D(C); | 15 | FP_DECL_D(C); |
15 | FP_DECL_D(T); | 16 | FP_DECL_D(T); |
17 | FP_DECL_EX; | ||
16 | int ret = 0; | 18 | int ret = 0; |
17 | 19 | ||
18 | #ifdef DEBUG | 20 | #ifdef DEBUG |
19 | printk("%s: %p %p %p %p\n", __func__, frD, frA, frB, frC); | 21 | printk("%s: %p %p %p %p\n", __func__, frD, frA, frB, frC); |
20 | #endif | 22 | #endif |
21 | 23 | ||
22 | __FP_UNPACK_D(A, frA); | 24 | FP_UNPACK_DP(A, frA); |
23 | __FP_UNPACK_D(B, frB); | 25 | FP_UNPACK_DP(B, frB); |
24 | __FP_UNPACK_D(C, frC); | 26 | FP_UNPACK_DP(C, frC); |
25 | 27 | ||
26 | #ifdef DEBUG | 28 | #ifdef DEBUG |
27 | printk("A: %ld %lu %lu %ld (%ld)\n", A_s, A_f1, A_f0, A_e, A_c); | 29 | printk("A: %ld %lu %lu %ld (%ld)\n", A_s, A_f1, A_f0, A_e, A_c); |
@@ -44,5 +46,7 @@ fmadd(void *frD, void *frA, void *frB, void *frC) | |||
44 | printk("D: %ld %lu %lu %ld (%ld)\n", R_s, R_f1, R_f0, R_e, R_c); | 46 | printk("D: %ld %lu %lu %ld (%ld)\n", R_s, R_f1, R_f0, R_e, R_c); |
45 | #endif | 47 | #endif |
46 | 48 | ||
47 | return (ret | __FP_PACK_D(frD, R)); | 49 | __FP_PACK_D(frD, R); |
50 | |||
51 | return FP_CUR_EXCEPTIONS; | ||
48 | } | 52 | } |
diff --git a/arch/powerpc/math-emu/fmadds.c b/arch/powerpc/math-emu/fmadds.c index 6bbb56d5502c..aea80ef79399 100644 --- a/arch/powerpc/math-emu/fmadds.c +++ b/arch/powerpc/math-emu/fmadds.c | |||
@@ -2,9 +2,10 @@ | |||
2 | #include <linux/errno.h> | 2 | #include <linux/errno.h> |
3 | #include <asm/uaccess.h> | 3 | #include <asm/uaccess.h> |
4 | 4 | ||
5 | #include "soft-fp.h" | 5 | #include <asm/sfp-machine.h> |
6 | #include "double.h" | 6 | #include <math-emu/soft-fp.h> |
7 | #include "single.h" | 7 | #include <math-emu/double.h> |
8 | #include <math-emu/single.h> | ||
8 | 9 | ||
9 | int | 10 | int |
10 | fmadds(void *frD, void *frA, void *frB, void *frC) | 11 | fmadds(void *frD, void *frA, void *frB, void *frC) |
@@ -14,15 +15,16 @@ fmadds(void *frD, void *frA, void *frB, void *frC) | |||
14 | FP_DECL_D(B); | 15 | FP_DECL_D(B); |
15 | FP_DECL_D(C); | 16 | FP_DECL_D(C); |
16 | FP_DECL_D(T); | 17 | FP_DECL_D(T); |
18 | FP_DECL_EX; | ||
17 | int ret = 0; | 19 | int ret = 0; |
18 | 20 | ||
19 | #ifdef DEBUG | 21 | #ifdef DEBUG |
20 | printk("%s: %p %p %p %p\n", __func__, frD, frA, frB, frC); | 22 | printk("%s: %p %p %p %p\n", __func__, frD, frA, frB, frC); |
21 | #endif | 23 | #endif |
22 | 24 | ||
23 | __FP_UNPACK_D(A, frA); | 25 | FP_UNPACK_DP(A, frA); |
24 | __FP_UNPACK_D(B, frB); | 26 | FP_UNPACK_DP(B, frB); |
25 | __FP_UNPACK_D(C, frC); | 27 | FP_UNPACK_DP(C, frC); |
26 | 28 | ||
27 | #ifdef DEBUG | 29 | #ifdef DEBUG |
28 | printk("A: %ld %lu %lu %ld (%ld)\n", A_s, A_f1, A_f0, A_e, A_c); | 30 | printk("A: %ld %lu %lu %ld (%ld)\n", A_s, A_f1, A_f0, A_e, A_c); |
@@ -45,5 +47,7 @@ fmadds(void *frD, void *frA, void *frB, void *frC) | |||
45 | printk("D: %ld %lu %lu %ld (%ld)\n", R_s, R_f1, R_f0, R_e, R_c); | 47 | printk("D: %ld %lu %lu %ld (%ld)\n", R_s, R_f1, R_f0, R_e, R_c); |
46 | #endif | 48 | #endif |
47 | 49 | ||
48 | return (ret | __FP_PACK_DS(frD, R)); | 50 | __FP_PACK_DS(frD, R); |
51 | |||
52 | return FP_CUR_EXCEPTIONS; | ||
49 | } | 53 | } |
diff --git a/arch/powerpc/math-emu/fmsub.c b/arch/powerpc/math-emu/fmsub.c index f311e2c7e67e..a644d525fca6 100644 --- a/arch/powerpc/math-emu/fmsub.c +++ b/arch/powerpc/math-emu/fmsub.c | |||
@@ -2,8 +2,9 @@ | |||
2 | #include <linux/errno.h> | 2 | #include <linux/errno.h> |
3 | #include <asm/uaccess.h> | 3 | #include <asm/uaccess.h> |
4 | 4 | ||
5 | #include "soft-fp.h" | 5 | #include <asm/sfp-machine.h> |
6 | #include "double.h" | 6 | #include <math-emu/soft-fp.h> |
7 | #include <math-emu/double.h> | ||
7 | 8 | ||
8 | int | 9 | int |
9 | fmsub(void *frD, void *frA, void *frB, void *frC) | 10 | fmsub(void *frD, void *frA, void *frB, void *frC) |
@@ -13,15 +14,16 @@ fmsub(void *frD, void *frA, void *frB, void *frC) | |||
13 | FP_DECL_D(B); | 14 | FP_DECL_D(B); |
14 | FP_DECL_D(C); | 15 | FP_DECL_D(C); |
15 | FP_DECL_D(T); | 16 | FP_DECL_D(T); |
17 | FP_DECL_EX; | ||
16 | int ret = 0; | 18 | int ret = 0; |
17 | 19 | ||
18 | #ifdef DEBUG | 20 | #ifdef DEBUG |
19 | printk("%s: %p %p %p %p\n", __func__, frD, frA, frB, frC); | 21 | printk("%s: %p %p %p %p\n", __func__, frD, frA, frB, frC); |
20 | #endif | 22 | #endif |
21 | 23 | ||
22 | __FP_UNPACK_D(A, frA); | 24 | FP_UNPACK_DP(A, frA); |
23 | __FP_UNPACK_D(B, frB); | 25 | FP_UNPACK_DP(B, frB); |
24 | __FP_UNPACK_D(C, frC); | 26 | FP_UNPACK_DP(C, frC); |
25 | 27 | ||
26 | #ifdef DEBUG | 28 | #ifdef DEBUG |
27 | printk("A: %ld %lu %lu %ld (%ld)\n", A_s, A_f1, A_f0, A_e, A_c); | 29 | printk("A: %ld %lu %lu %ld (%ld)\n", A_s, A_f1, A_f0, A_e, A_c); |
@@ -47,5 +49,7 @@ fmsub(void *frD, void *frA, void *frB, void *frC) | |||
47 | printk("D: %ld %lu %lu %ld (%ld)\n", R_s, R_f1, R_f0, R_e, R_c); | 49 | printk("D: %ld %lu %lu %ld (%ld)\n", R_s, R_f1, R_f0, R_e, R_c); |
48 | #endif | 50 | #endif |
49 | 51 | ||
50 | return (ret | __FP_PACK_D(frD, R)); | 52 | __FP_PACK_D(frD, R); |
53 | |||
54 | return FP_CUR_EXCEPTIONS; | ||
51 | } | 55 | } |
diff --git a/arch/powerpc/math-emu/fmsubs.c b/arch/powerpc/math-emu/fmsubs.c index 81a716d3ee2e..2fdeeb9bb569 100644 --- a/arch/powerpc/math-emu/fmsubs.c +++ b/arch/powerpc/math-emu/fmsubs.c | |||
@@ -2,9 +2,10 @@ | |||
2 | #include <linux/errno.h> | 2 | #include <linux/errno.h> |
3 | #include <asm/uaccess.h> | 3 | #include <asm/uaccess.h> |
4 | 4 | ||
5 | #include "soft-fp.h" | 5 | #include <asm/sfp-machine.h> |
6 | #include "double.h" | 6 | #include <math-emu/soft-fp.h> |
7 | #include "single.h" | 7 | #include <math-emu/double.h> |
8 | #include <math-emu/single.h> | ||
8 | 9 | ||
9 | int | 10 | int |
10 | fmsubs(void *frD, void *frA, void *frB, void *frC) | 11 | fmsubs(void *frD, void *frA, void *frB, void *frC) |
@@ -14,15 +15,16 @@ fmsubs(void *frD, void *frA, void *frB, void *frC) | |||
14 | FP_DECL_D(B); | 15 | FP_DECL_D(B); |
15 | FP_DECL_D(C); | 16 | FP_DECL_D(C); |
16 | FP_DECL_D(T); | 17 | FP_DECL_D(T); |
18 | FP_DECL_EX; | ||
17 | int ret = 0; | 19 | int ret = 0; |
18 | 20 | ||
19 | #ifdef DEBUG | 21 | #ifdef DEBUG |
20 | printk("%s: %p %p %p %p\n", __func__, frD, frA, frB, frC); | 22 | printk("%s: %p %p %p %p\n", __func__, frD, frA, frB, frC); |
21 | #endif | 23 | #endif |
22 | 24 | ||
23 | __FP_UNPACK_D(A, frA); | 25 | FP_UNPACK_DP(A, frA); |
24 | __FP_UNPACK_D(B, frB); | 26 | FP_UNPACK_DP(B, frB); |
25 | __FP_UNPACK_D(C, frC); | 27 | FP_UNPACK_DP(C, frC); |
26 | 28 | ||
27 | #ifdef DEBUG | 29 | #ifdef DEBUG |
28 | printk("A: %ld %lu %lu %ld (%ld)\n", A_s, A_f1, A_f0, A_e, A_c); | 30 | printk("A: %ld %lu %lu %ld (%ld)\n", A_s, A_f1, A_f0, A_e, A_c); |
@@ -48,5 +50,7 @@ fmsubs(void *frD, void *frA, void *frB, void *frC) | |||
48 | printk("D: %ld %lu %lu %ld (%ld)\n", R_s, R_f1, R_f0, R_e, R_c); | 50 | printk("D: %ld %lu %lu %ld (%ld)\n", R_s, R_f1, R_f0, R_e, R_c); |
49 | #endif | 51 | #endif |
50 | 52 | ||
51 | return (ret | __FP_PACK_DS(frD, R)); | 53 | __FP_PACK_DS(frD, R); |
54 | |||
55 | return FP_CUR_EXCEPTIONS; | ||
52 | } | 56 | } |
diff --git a/arch/powerpc/math-emu/fmul.c b/arch/powerpc/math-emu/fmul.c index 2f3d32784a04..391fd17d3440 100644 --- a/arch/powerpc/math-emu/fmul.c +++ b/arch/powerpc/math-emu/fmul.c | |||
@@ -2,8 +2,9 @@ | |||
2 | #include <linux/errno.h> | 2 | #include <linux/errno.h> |
3 | #include <asm/uaccess.h> | 3 | #include <asm/uaccess.h> |
4 | 4 | ||
5 | #include "soft-fp.h" | 5 | #include <asm/sfp-machine.h> |
6 | #include "double.h" | 6 | #include <math-emu/soft-fp.h> |
7 | #include <math-emu/double.h> | ||
7 | 8 | ||
8 | int | 9 | int |
9 | fmul(void *frD, void *frA, void *frB) | 10 | fmul(void *frD, void *frA, void *frB) |
@@ -11,14 +12,15 @@ fmul(void *frD, void *frA, void *frB) | |||
11 | FP_DECL_D(A); | 12 | FP_DECL_D(A); |
12 | FP_DECL_D(B); | 13 | FP_DECL_D(B); |
13 | FP_DECL_D(R); | 14 | FP_DECL_D(R); |
15 | FP_DECL_EX; | ||
14 | int ret = 0; | 16 | int ret = 0; |
15 | 17 | ||
16 | #ifdef DEBUG | 18 | #ifdef DEBUG |
17 | printk("%s: %p %p %p\n", __func__, frD, frA, frB); | 19 | printk("%s: %p %p %p\n", __func__, frD, frA, frB); |
18 | #endif | 20 | #endif |
19 | 21 | ||
20 | __FP_UNPACK_D(A, frA); | 22 | FP_UNPACK_DP(A, frA); |
21 | __FP_UNPACK_D(B, frB); | 23 | FP_UNPACK_DP(B, frB); |
22 | 24 | ||
23 | #ifdef DEBUG | 25 | #ifdef DEBUG |
24 | printk("A: %ld %lu %lu %ld (%ld) [%08lx.%08lx %lx]\n", | 26 | printk("A: %ld %lu %lu %ld (%ld) [%08lx.%08lx %lx]\n", |
@@ -38,5 +40,7 @@ fmul(void *frD, void *frA, void *frB) | |||
38 | R_s, R_f1, R_f0, R_e, R_c, R_f1, R_f0, R_e + 1023); | 40 | R_s, R_f1, R_f0, R_e, R_c, R_f1, R_f0, R_e + 1023); |
39 | #endif | 41 | #endif |
40 | 42 | ||
41 | return (ret | __FP_PACK_D(frD, R)); | 43 | __FP_PACK_D(frD, R); |
44 | |||
45 | return FP_CUR_EXCEPTIONS; | ||
42 | } | 46 | } |
diff --git a/arch/powerpc/math-emu/fmuls.c b/arch/powerpc/math-emu/fmuls.c index 962b5883f784..2d3ec5f7da20 100644 --- a/arch/powerpc/math-emu/fmuls.c +++ b/arch/powerpc/math-emu/fmuls.c | |||
@@ -2,9 +2,10 @@ | |||
2 | #include <linux/errno.h> | 2 | #include <linux/errno.h> |
3 | #include <asm/uaccess.h> | 3 | #include <asm/uaccess.h> |
4 | 4 | ||
5 | #include "soft-fp.h" | 5 | #include <asm/sfp-machine.h> |
6 | #include "double.h" | 6 | #include <math-emu/soft-fp.h> |
7 | #include "single.h" | 7 | #include <math-emu/double.h> |
8 | #include <math-emu/single.h> | ||
8 | 9 | ||
9 | int | 10 | int |
10 | fmuls(void *frD, void *frA, void *frB) | 11 | fmuls(void *frD, void *frA, void *frB) |
@@ -12,14 +13,15 @@ fmuls(void *frD, void *frA, void *frB) | |||
12 | FP_DECL_D(A); | 13 | FP_DECL_D(A); |
13 | FP_DECL_D(B); | 14 | FP_DECL_D(B); |
14 | FP_DECL_D(R); | 15 | FP_DECL_D(R); |
16 | FP_DECL_EX; | ||
15 | int ret = 0; | 17 | int ret = 0; |
16 | 18 | ||
17 | #ifdef DEBUG | 19 | #ifdef DEBUG |
18 | printk("%s: %p %p %p\n", __func__, frD, frA, frB); | 20 | printk("%s: %p %p %p\n", __func__, frD, frA, frB); |
19 | #endif | 21 | #endif |
20 | 22 | ||
21 | __FP_UNPACK_D(A, frA); | 23 | FP_UNPACK_DP(A, frA); |
22 | __FP_UNPACK_D(B, frB); | 24 | FP_UNPACK_DP(B, frB); |
23 | 25 | ||
24 | #ifdef DEBUG | 26 | #ifdef DEBUG |
25 | printk("A: %ld %lu %lu %ld (%ld) [%08lx.%08lx %lx]\n", | 27 | printk("A: %ld %lu %lu %ld (%ld) [%08lx.%08lx %lx]\n", |
@@ -39,5 +41,7 @@ fmuls(void *frD, void *frA, void *frB) | |||
39 | R_s, R_f1, R_f0, R_e, R_c, R_f1, R_f0, R_e + 1023); | 41 | R_s, R_f1, R_f0, R_e, R_c, R_f1, R_f0, R_e + 1023); |
40 | #endif | 42 | #endif |
41 | 43 | ||
42 | return (ret | __FP_PACK_DS(frD, R)); | 44 | __FP_PACK_DS(frD, R); |
45 | |||
46 | return FP_CUR_EXCEPTIONS; | ||
43 | } | 47 | } |
diff --git a/arch/powerpc/math-emu/fnmadd.c b/arch/powerpc/math-emu/fnmadd.c index 8cf7827c4fb5..2497b86494e5 100644 --- a/arch/powerpc/math-emu/fnmadd.c +++ b/arch/powerpc/math-emu/fnmadd.c | |||
@@ -2,8 +2,9 @@ | |||
2 | #include <linux/errno.h> | 2 | #include <linux/errno.h> |
3 | #include <asm/uaccess.h> | 3 | #include <asm/uaccess.h> |
4 | 4 | ||
5 | #include "soft-fp.h" | 5 | #include <asm/sfp-machine.h> |
6 | #include "double.h" | 6 | #include <math-emu/soft-fp.h> |
7 | #include <math-emu/double.h> | ||
7 | 8 | ||
8 | int | 9 | int |
9 | fnmadd(void *frD, void *frA, void *frB, void *frC) | 10 | fnmadd(void *frD, void *frA, void *frB, void *frC) |
@@ -13,15 +14,16 @@ fnmadd(void *frD, void *frA, void *frB, void *frC) | |||
13 | FP_DECL_D(B); | 14 | FP_DECL_D(B); |
14 | FP_DECL_D(C); | 15 | FP_DECL_D(C); |
15 | FP_DECL_D(T); | 16 | FP_DECL_D(T); |
17 | FP_DECL_EX; | ||
16 | int ret = 0; | 18 | int ret = 0; |
17 | 19 | ||
18 | #ifdef DEBUG | 20 | #ifdef DEBUG |
19 | printk("%s: %p %p %p %p\n", __func__, frD, frA, frB, frC); | 21 | printk("%s: %p %p %p %p\n", __func__, frD, frA, frB, frC); |
20 | #endif | 22 | #endif |
21 | 23 | ||
22 | __FP_UNPACK_D(A, frA); | 24 | FP_UNPACK_DP(A, frA); |
23 | __FP_UNPACK_D(B, frB); | 25 | FP_UNPACK_DP(B, frB); |
24 | __FP_UNPACK_D(C, frC); | 26 | FP_UNPACK_DP(C, frC); |
25 | 27 | ||
26 | #ifdef DEBUG | 28 | #ifdef DEBUG |
27 | printk("A: %ld %lu %lu %ld (%ld)\n", A_s, A_f1, A_f0, A_e, A_c); | 29 | printk("A: %ld %lu %lu %ld (%ld)\n", A_s, A_f1, A_f0, A_e, A_c); |
@@ -47,5 +49,7 @@ fnmadd(void *frD, void *frA, void *frB, void *frC) | |||
47 | printk("D: %ld %lu %lu %ld (%ld)\n", R_s, R_f1, R_f0, R_e, R_c); | 49 | printk("D: %ld %lu %lu %ld (%ld)\n", R_s, R_f1, R_f0, R_e, R_c); |
48 | #endif | 50 | #endif |
49 | 51 | ||
50 | return (ret | __FP_PACK_D(frD, R)); | 52 | __FP_PACK_D(frD, R); |
53 | |||
54 | return FP_CUR_EXCEPTIONS; | ||
51 | } | 55 | } |
diff --git a/arch/powerpc/math-emu/fnmadds.c b/arch/powerpc/math-emu/fnmadds.c index f1c4f0f0d807..ee9d71e0b376 100644 --- a/arch/powerpc/math-emu/fnmadds.c +++ b/arch/powerpc/math-emu/fnmadds.c | |||
@@ -2,9 +2,10 @@ | |||
2 | #include <linux/errno.h> | 2 | #include <linux/errno.h> |
3 | #include <asm/uaccess.h> | 3 | #include <asm/uaccess.h> |
4 | 4 | ||
5 | #include "soft-fp.h" | 5 | #include <asm/sfp-machine.h> |
6 | #include "double.h" | 6 | #include <math-emu/soft-fp.h> |
7 | #include "single.h" | 7 | #include <math-emu/double.h> |
8 | #include <math-emu/single.h> | ||
8 | 9 | ||
9 | int | 10 | int |
10 | fnmadds(void *frD, void *frA, void *frB, void *frC) | 11 | fnmadds(void *frD, void *frA, void *frB, void *frC) |
@@ -14,15 +15,16 @@ fnmadds(void *frD, void *frA, void *frB, void *frC) | |||
14 | FP_DECL_D(B); | 15 | FP_DECL_D(B); |
15 | FP_DECL_D(C); | 16 | FP_DECL_D(C); |
16 | FP_DECL_D(T); | 17 | FP_DECL_D(T); |
18 | FP_DECL_EX; | ||
17 | int ret = 0; | 19 | int ret = 0; |
18 | 20 | ||
19 | #ifdef DEBUG | 21 | #ifdef DEBUG |
20 | printk("%s: %p %p %p %p\n", __func__, frD, frA, frB, frC); | 22 | printk("%s: %p %p %p %p\n", __func__, frD, frA, frB, frC); |
21 | #endif | 23 | #endif |
22 | 24 | ||
23 | __FP_UNPACK_D(A, frA); | 25 | FP_UNPACK_DP(A, frA); |
24 | __FP_UNPACK_D(B, frB); | 26 | FP_UNPACK_DP(B, frB); |
25 | __FP_UNPACK_D(C, frC); | 27 | FP_UNPACK_DP(C, frC); |
26 | 28 | ||
27 | #ifdef DEBUG | 29 | #ifdef DEBUG |
28 | printk("A: %ld %lu %lu %ld (%ld)\n", A_s, A_f1, A_f0, A_e, A_c); | 30 | printk("A: %ld %lu %lu %ld (%ld)\n", A_s, A_f1, A_f0, A_e, A_c); |
@@ -48,5 +50,7 @@ fnmadds(void *frD, void *frA, void *frB, void *frC) | |||
48 | printk("D: %ld %lu %lu %ld (%ld)\n", R_s, R_f1, R_f0, R_e, R_c); | 50 | printk("D: %ld %lu %lu %ld (%ld)\n", R_s, R_f1, R_f0, R_e, R_c); |
49 | #endif | 51 | #endif |
50 | 52 | ||
51 | return (ret | __FP_PACK_DS(frD, R)); | 53 | __FP_PACK_DS(frD, R); |
54 | |||
55 | return FP_CUR_EXCEPTIONS; | ||
52 | } | 56 | } |
diff --git a/arch/powerpc/math-emu/fnmsub.c b/arch/powerpc/math-emu/fnmsub.c index 98944e6e2601..3885a77acc93 100644 --- a/arch/powerpc/math-emu/fnmsub.c +++ b/arch/powerpc/math-emu/fnmsub.c | |||
@@ -2,8 +2,9 @@ | |||
2 | #include <linux/errno.h> | 2 | #include <linux/errno.h> |
3 | #include <asm/uaccess.h> | 3 | #include <asm/uaccess.h> |
4 | 4 | ||
5 | #include "soft-fp.h" | 5 | #include <asm/sfp-machine.h> |
6 | #include "double.h" | 6 | #include <math-emu/soft-fp.h> |
7 | #include <math-emu/double.h> | ||
7 | 8 | ||
8 | int | 9 | int |
9 | fnmsub(void *frD, void *frA, void *frB, void *frC) | 10 | fnmsub(void *frD, void *frA, void *frB, void *frC) |
@@ -13,15 +14,16 @@ fnmsub(void *frD, void *frA, void *frB, void *frC) | |||
13 | FP_DECL_D(B); | 14 | FP_DECL_D(B); |
14 | FP_DECL_D(C); | 15 | FP_DECL_D(C); |
15 | FP_DECL_D(T); | 16 | FP_DECL_D(T); |
17 | FP_DECL_EX; | ||
16 | int ret = 0; | 18 | int ret = 0; |
17 | 19 | ||
18 | #ifdef DEBUG | 20 | #ifdef DEBUG |
19 | printk("%s: %p %p %p %p\n", __func__, frD, frA, frB, frC); | 21 | printk("%s: %p %p %p %p\n", __func__, frD, frA, frB, frC); |
20 | #endif | 22 | #endif |
21 | 23 | ||
22 | __FP_UNPACK_D(A, frA); | 24 | FP_UNPACK_DP(A, frA); |
23 | __FP_UNPACK_D(B, frB); | 25 | FP_UNPACK_DP(B, frB); |
24 | __FP_UNPACK_D(C, frC); | 26 | FP_UNPACK_DP(C, frC); |
25 | 27 | ||
26 | #ifdef DEBUG | 28 | #ifdef DEBUG |
27 | printk("A: %ld %lu %lu %ld (%ld)\n", A_s, A_f1, A_f0, A_e, A_c); | 29 | printk("A: %ld %lu %lu %ld (%ld)\n", A_s, A_f1, A_f0, A_e, A_c); |
@@ -50,5 +52,7 @@ fnmsub(void *frD, void *frA, void *frB, void *frC) | |||
50 | printk("D: %ld %lu %lu %ld (%ld)\n", R_s, R_f1, R_f0, R_e, R_c); | 52 | printk("D: %ld %lu %lu %ld (%ld)\n", R_s, R_f1, R_f0, R_e, R_c); |
51 | #endif | 53 | #endif |
52 | 54 | ||
53 | return (ret | __FP_PACK_D(frD, R)); | 55 | __FP_PACK_D(frD, R); |
56 | |||
57 | return FP_CUR_EXCEPTIONS; | ||
54 | } | 58 | } |
diff --git a/arch/powerpc/math-emu/fnmsubs.c b/arch/powerpc/math-emu/fnmsubs.c index b20f4eb63fb9..f835dfeb0fd1 100644 --- a/arch/powerpc/math-emu/fnmsubs.c +++ b/arch/powerpc/math-emu/fnmsubs.c | |||
@@ -2,9 +2,10 @@ | |||
2 | #include <linux/errno.h> | 2 | #include <linux/errno.h> |
3 | #include <asm/uaccess.h> | 3 | #include <asm/uaccess.h> |
4 | 4 | ||
5 | #include "soft-fp.h" | 5 | #include <asm/sfp-machine.h> |
6 | #include "double.h" | 6 | #include <math-emu/soft-fp.h> |
7 | #include "single.h" | 7 | #include <math-emu/double.h> |
8 | #include <math-emu/single.h> | ||
8 | 9 | ||
9 | int | 10 | int |
10 | fnmsubs(void *frD, void *frA, void *frB, void *frC) | 11 | fnmsubs(void *frD, void *frA, void *frB, void *frC) |
@@ -14,15 +15,16 @@ fnmsubs(void *frD, void *frA, void *frB, void *frC) | |||
14 | FP_DECL_D(B); | 15 | FP_DECL_D(B); |
15 | FP_DECL_D(C); | 16 | FP_DECL_D(C); |
16 | FP_DECL_D(T); | 17 | FP_DECL_D(T); |
18 | FP_DECL_EX; | ||
17 | int ret = 0; | 19 | int ret = 0; |
18 | 20 | ||
19 | #ifdef DEBUG | 21 | #ifdef DEBUG |
20 | printk("%s: %p %p %p %p\n", __func__, frD, frA, frB, frC); | 22 | printk("%s: %p %p %p %p\n", __func__, frD, frA, frB, frC); |
21 | #endif | 23 | #endif |
22 | 24 | ||
23 | __FP_UNPACK_D(A, frA); | 25 | FP_UNPACK_DP(A, frA); |
24 | __FP_UNPACK_D(B, frB); | 26 | FP_UNPACK_DP(B, frB); |
25 | __FP_UNPACK_D(C, frC); | 27 | FP_UNPACK_DP(C, frC); |
26 | 28 | ||
27 | #ifdef DEBUG | 29 | #ifdef DEBUG |
28 | printk("A: %ld %lu %lu %ld (%ld)\n", A_s, A_f1, A_f0, A_e, A_c); | 30 | printk("A: %ld %lu %lu %ld (%ld)\n", A_s, A_f1, A_f0, A_e, A_c); |
@@ -51,5 +53,7 @@ fnmsubs(void *frD, void *frA, void *frB, void *frC) | |||
51 | printk("D: %ld %lu %lu %ld (%ld)\n", R_s, R_f1, R_f0, R_e, R_c); | 53 | printk("D: %ld %lu %lu %ld (%ld)\n", R_s, R_f1, R_f0, R_e, R_c); |
52 | #endif | 54 | #endif |
53 | 55 | ||
54 | return (ret | __FP_PACK_DS(frD, R)); | 56 | __FP_PACK_DS(frD, R); |
57 | |||
58 | return FP_CUR_EXCEPTIONS; | ||
55 | } | 59 | } |
diff --git a/arch/powerpc/math-emu/frsp.c b/arch/powerpc/math-emu/frsp.c index 724ccbc0468e..ddcc14664b1a 100644 --- a/arch/powerpc/math-emu/frsp.c +++ b/arch/powerpc/math-emu/frsp.c | |||
@@ -2,24 +2,28 @@ | |||
2 | #include <linux/errno.h> | 2 | #include <linux/errno.h> |
3 | #include <asm/uaccess.h> | 3 | #include <asm/uaccess.h> |
4 | 4 | ||
5 | #include "soft-fp.h" | 5 | #include <asm/sfp-machine.h> |
6 | #include "double.h" | 6 | #include <math-emu/soft-fp.h> |
7 | #include "single.h" | 7 | #include <math-emu/double.h> |
8 | #include <math-emu/single.h> | ||
8 | 9 | ||
9 | int | 10 | int |
10 | frsp(void *frD, void *frB) | 11 | frsp(void *frD, void *frB) |
11 | { | 12 | { |
12 | FP_DECL_D(B); | 13 | FP_DECL_D(B); |
14 | FP_DECL_EX; | ||
13 | 15 | ||
14 | #ifdef DEBUG | 16 | #ifdef DEBUG |
15 | printk("%s: D %p, B %p\n", __func__, frD, frB); | 17 | printk("%s: D %p, B %p\n", __func__, frD, frB); |
16 | #endif | 18 | #endif |
17 | 19 | ||
18 | __FP_UNPACK_D(B, frB); | 20 | FP_UNPACK_DP(B, frB); |
19 | 21 | ||
20 | #ifdef DEBUG | 22 | #ifdef DEBUG |
21 | printk("B: %ld %lu %lu %ld (%ld)\n", B_s, B_f1, B_f0, B_e, B_c); | 23 | printk("B: %ld %lu %lu %ld (%ld)\n", B_s, B_f1, B_f0, B_e, B_c); |
22 | #endif | 24 | #endif |
23 | 25 | ||
24 | return __FP_PACK_DS(frD, B); | 26 | __FP_PACK_DS(frD, B); |
27 | |||
28 | return FP_CUR_EXCEPTIONS; | ||
25 | } | 29 | } |
diff --git a/arch/powerpc/math-emu/fsel.c b/arch/powerpc/math-emu/fsel.c index ecb5f28eb1f3..1b0c14498032 100644 --- a/arch/powerpc/math-emu/fsel.c +++ b/arch/powerpc/math-emu/fsel.c | |||
@@ -2,19 +2,21 @@ | |||
2 | #include <linux/errno.h> | 2 | #include <linux/errno.h> |
3 | #include <asm/uaccess.h> | 3 | #include <asm/uaccess.h> |
4 | 4 | ||
5 | #include "soft-fp.h" | 5 | #include <asm/sfp-machine.h> |
6 | #include "double.h" | 6 | #include <math-emu/soft-fp.h> |
7 | #include <math-emu/double.h> | ||
7 | 8 | ||
8 | int | 9 | int |
9 | fsel(u32 *frD, void *frA, u32 *frB, u32 *frC) | 10 | fsel(u32 *frD, void *frA, u32 *frB, u32 *frC) |
10 | { | 11 | { |
11 | FP_DECL_D(A); | 12 | FP_DECL_D(A); |
13 | FP_DECL_EX; | ||
12 | 14 | ||
13 | #ifdef DEBUG | 15 | #ifdef DEBUG |
14 | printk("%s: %p %p %p %p\n", __func__, frD, frA, frB, frC); | 16 | printk("%s: %p %p %p %p\n", __func__, frD, frA, frB, frC); |
15 | #endif | 17 | #endif |
16 | 18 | ||
17 | __FP_UNPACK_D(A, frA); | 19 | FP_UNPACK_DP(A, frA); |
18 | 20 | ||
19 | #ifdef DEBUG | 21 | #ifdef DEBUG |
20 | printk("A: %ld %lu %lu %ld (%ld)\n", A_s, A_f1, A_f0, A_e, A_c); | 22 | printk("A: %ld %lu %lu %ld (%ld)\n", A_s, A_f1, A_f0, A_e, A_c); |
diff --git a/arch/powerpc/math-emu/fsqrt.c b/arch/powerpc/math-emu/fsqrt.c index 38ec2b752e9d..3e90072693a0 100644 --- a/arch/powerpc/math-emu/fsqrt.c +++ b/arch/powerpc/math-emu/fsqrt.c | |||
@@ -2,21 +2,23 @@ | |||
2 | #include <linux/errno.h> | 2 | #include <linux/errno.h> |
3 | #include <asm/uaccess.h> | 3 | #include <asm/uaccess.h> |
4 | 4 | ||
5 | #include "soft-fp.h" | 5 | #include <asm/sfp-machine.h> |
6 | #include "double.h" | 6 | #include <math-emu/soft-fp.h> |
7 | #include <math-emu/double.h> | ||
7 | 8 | ||
8 | int | 9 | int |
9 | fsqrt(void *frD, void *frB) | 10 | fsqrt(void *frD, void *frB) |
10 | { | 11 | { |
11 | FP_DECL_D(B); | 12 | FP_DECL_D(B); |
12 | FP_DECL_D(R); | 13 | FP_DECL_D(R); |
14 | FP_DECL_EX; | ||
13 | int ret = 0; | 15 | int ret = 0; |
14 | 16 | ||
15 | #ifdef DEBUG | 17 | #ifdef DEBUG |
16 | printk("%s: %p %p %p %p\n", __func__, frD, frB); | 18 | printk("%s: %p %p %p %p\n", __func__, frD, frB); |
17 | #endif | 19 | #endif |
18 | 20 | ||
19 | __FP_UNPACK_D(B, frB); | 21 | FP_UNPACK_DP(B, frB); |
20 | 22 | ||
21 | #ifdef DEBUG | 23 | #ifdef DEBUG |
22 | printk("B: %ld %lu %lu %ld (%ld)\n", B_s, B_f1, B_f0, B_e, B_c); | 24 | printk("B: %ld %lu %lu %ld (%ld)\n", B_s, B_f1, B_f0, B_e, B_c); |
@@ -33,5 +35,7 @@ fsqrt(void *frD, void *frB) | |||
33 | printk("R: %ld %lu %lu %ld (%ld)\n", R_s, R_f1, R_f0, R_e, R_c); | 35 | printk("R: %ld %lu %lu %ld (%ld)\n", R_s, R_f1, R_f0, R_e, R_c); |
34 | #endif | 36 | #endif |
35 | 37 | ||
36 | return (ret | __FP_PACK_D(frD, R)); | 38 | __FP_PACK_D(frD, R); |
39 | |||
40 | return FP_CUR_EXCEPTIONS; | ||
37 | } | 41 | } |
diff --git a/arch/powerpc/math-emu/fsqrts.c b/arch/powerpc/math-emu/fsqrts.c index 335263e06ee5..2843be986e2e 100644 --- a/arch/powerpc/math-emu/fsqrts.c +++ b/arch/powerpc/math-emu/fsqrts.c | |||
@@ -2,22 +2,24 @@ | |||
2 | #include <linux/errno.h> | 2 | #include <linux/errno.h> |
3 | #include <asm/uaccess.h> | 3 | #include <asm/uaccess.h> |
4 | 4 | ||
5 | #include "soft-fp.h" | 5 | #include <asm/sfp-machine.h> |
6 | #include "double.h" | 6 | #include <math-emu/soft-fp.h> |
7 | #include "single.h" | 7 | #include <math-emu/double.h> |
8 | #include <math-emu/single.h> | ||
8 | 9 | ||
9 | int | 10 | int |
10 | fsqrts(void *frD, void *frB) | 11 | fsqrts(void *frD, void *frB) |
11 | { | 12 | { |
12 | FP_DECL_D(B); | 13 | FP_DECL_D(B); |
13 | FP_DECL_D(R); | 14 | FP_DECL_D(R); |
15 | FP_DECL_EX; | ||
14 | int ret = 0; | 16 | int ret = 0; |
15 | 17 | ||
16 | #ifdef DEBUG | 18 | #ifdef DEBUG |
17 | printk("%s: %p %p %p %p\n", __func__, frD, frB); | 19 | printk("%s: %p %p %p %p\n", __func__, frD, frB); |
18 | #endif | 20 | #endif |
19 | 21 | ||
20 | __FP_UNPACK_D(B, frB); | 22 | FP_UNPACK_DP(B, frB); |
21 | 23 | ||
22 | #ifdef DEBUG | 24 | #ifdef DEBUG |
23 | printk("B: %ld %lu %lu %ld (%ld)\n", B_s, B_f1, B_f0, B_e, B_c); | 25 | printk("B: %ld %lu %lu %ld (%ld)\n", B_s, B_f1, B_f0, B_e, B_c); |
@@ -34,5 +36,7 @@ fsqrts(void *frD, void *frB) | |||
34 | printk("R: %ld %lu %lu %ld (%ld)\n", R_s, R_f1, R_f0, R_e, R_c); | 36 | printk("R: %ld %lu %lu %ld (%ld)\n", R_s, R_f1, R_f0, R_e, R_c); |
35 | #endif | 37 | #endif |
36 | 38 | ||
37 | return (ret | __FP_PACK_DS(frD, R)); | 39 | __FP_PACK_DS(frD, R); |
40 | |||
41 | return FP_CUR_EXCEPTIONS; | ||
38 | } | 42 | } |
diff --git a/arch/powerpc/math-emu/fsub.c b/arch/powerpc/math-emu/fsub.c index 208d20fc52a5..78b09446a0e1 100644 --- a/arch/powerpc/math-emu/fsub.c +++ b/arch/powerpc/math-emu/fsub.c | |||
@@ -2,8 +2,9 @@ | |||
2 | #include <linux/errno.h> | 2 | #include <linux/errno.h> |
3 | #include <asm/uaccess.h> | 3 | #include <asm/uaccess.h> |
4 | 4 | ||
5 | #include "soft-fp.h" | 5 | #include <asm/sfp-machine.h> |
6 | #include "double.h" | 6 | #include <math-emu/soft-fp.h> |
7 | #include <math-emu/double.h> | ||
7 | 8 | ||
8 | int | 9 | int |
9 | fsub(void *frD, void *frA, void *frB) | 10 | fsub(void *frD, void *frA, void *frB) |
@@ -11,14 +12,15 @@ fsub(void *frD, void *frA, void *frB) | |||
11 | FP_DECL_D(A); | 12 | FP_DECL_D(A); |
12 | FP_DECL_D(B); | 13 | FP_DECL_D(B); |
13 | FP_DECL_D(R); | 14 | FP_DECL_D(R); |
15 | FP_DECL_EX; | ||
14 | int ret = 0; | 16 | int ret = 0; |
15 | 17 | ||
16 | #ifdef DEBUG | 18 | #ifdef DEBUG |
17 | printk("%s: %p %p %p\n", __func__, frD, frA, frB); | 19 | printk("%s: %p %p %p\n", __func__, frD, frA, frB); |
18 | #endif | 20 | #endif |
19 | 21 | ||
20 | __FP_UNPACK_D(A, frA); | 22 | FP_UNPACK_DP(A, frA); |
21 | __FP_UNPACK_D(B, frB); | 23 | FP_UNPACK_DP(B, frB); |
22 | 24 | ||
23 | #ifdef DEBUG | 25 | #ifdef DEBUG |
24 | printk("A: %ld %lu %lu %ld (%ld)\n", A_s, A_f1, A_f0, A_e, A_c); | 26 | printk("A: %ld %lu %lu %ld (%ld)\n", A_s, A_f1, A_f0, A_e, A_c); |
@@ -37,5 +39,7 @@ fsub(void *frD, void *frA, void *frB) | |||
37 | printk("D: %ld %lu %lu %ld (%ld)\n", R_s, R_f1, R_f0, R_e, R_c); | 39 | printk("D: %ld %lu %lu %ld (%ld)\n", R_s, R_f1, R_f0, R_e, R_c); |
38 | #endif | 40 | #endif |
39 | 41 | ||
40 | return (ret | __FP_PACK_D(frD, R)); | 42 | __FP_PACK_D(frD, R); |
43 | |||
44 | return FP_CUR_EXCEPTIONS; | ||
41 | } | 45 | } |
diff --git a/arch/powerpc/math-emu/fsubs.c b/arch/powerpc/math-emu/fsubs.c index 0e61b808c44b..d3bf90863cf2 100644 --- a/arch/powerpc/math-emu/fsubs.c +++ b/arch/powerpc/math-emu/fsubs.c | |||
@@ -2,9 +2,10 @@ | |||
2 | #include <linux/errno.h> | 2 | #include <linux/errno.h> |
3 | #include <asm/uaccess.h> | 3 | #include <asm/uaccess.h> |
4 | 4 | ||
5 | #include "soft-fp.h" | 5 | #include <asm/sfp-machine.h> |
6 | #include "double.h" | 6 | #include <math-emu/soft-fp.h> |
7 | #include "single.h" | 7 | #include <math-emu/double.h> |
8 | #include <math-emu/single.h> | ||
8 | 9 | ||
9 | int | 10 | int |
10 | fsubs(void *frD, void *frA, void *frB) | 11 | fsubs(void *frD, void *frA, void *frB) |
@@ -12,14 +13,15 @@ fsubs(void *frD, void *frA, void *frB) | |||
12 | FP_DECL_D(A); | 13 | FP_DECL_D(A); |
13 | FP_DECL_D(B); | 14 | FP_DECL_D(B); |
14 | FP_DECL_D(R); | 15 | FP_DECL_D(R); |
16 | FP_DECL_EX; | ||
15 | int ret = 0; | 17 | int ret = 0; |
16 | 18 | ||
17 | #ifdef DEBUG | 19 | #ifdef DEBUG |
18 | printk("%s: %p %p %p\n", __func__, frD, frA, frB); | 20 | printk("%s: %p %p %p\n", __func__, frD, frA, frB); |
19 | #endif | 21 | #endif |
20 | 22 | ||
21 | __FP_UNPACK_D(A, frA); | 23 | FP_UNPACK_DP(A, frA); |
22 | __FP_UNPACK_D(B, frB); | 24 | FP_UNPACK_DP(B, frB); |
23 | 25 | ||
24 | #ifdef DEBUG | 26 | #ifdef DEBUG |
25 | printk("A: %ld %lu %lu %ld (%ld)\n", A_s, A_f1, A_f0, A_e, A_c); | 27 | printk("A: %ld %lu %lu %ld (%ld)\n", A_s, A_f1, A_f0, A_e, A_c); |
@@ -38,5 +40,7 @@ fsubs(void *frD, void *frA, void *frB) | |||
38 | printk("D: %ld %lu %lu %ld (%ld)\n", R_s, R_f1, R_f0, R_e, R_c); | 40 | printk("D: %ld %lu %lu %ld (%ld)\n", R_s, R_f1, R_f0, R_e, R_c); |
39 | #endif | 41 | #endif |
40 | 42 | ||
41 | return (ret | __FP_PACK_DS(frD, R)); | 43 | __FP_PACK_DS(frD, R); |
44 | |||
45 | return FP_CUR_EXCEPTIONS; | ||
42 | } | 46 | } |
diff --git a/arch/powerpc/math-emu/lfd.c b/arch/powerpc/math-emu/lfd.c index 6ec90b57c61a..79ac76d596c3 100644 --- a/arch/powerpc/math-emu/lfd.c +++ b/arch/powerpc/math-emu/lfd.c | |||
@@ -2,8 +2,8 @@ | |||
2 | #include <linux/errno.h> | 2 | #include <linux/errno.h> |
3 | #include <asm/uaccess.h> | 3 | #include <asm/uaccess.h> |
4 | 4 | ||
5 | #include "sfp-machine.h" | 5 | #include <asm/sfp-machine.h> |
6 | #include "double.h" | 6 | #include <math-emu/double.h> |
7 | 7 | ||
8 | int | 8 | int |
9 | lfd(void *frD, void *ea) | 9 | lfd(void *frD, void *ea) |
diff --git a/arch/powerpc/math-emu/lfs.c b/arch/powerpc/math-emu/lfs.c index 6f18ebe3a7ff..434ed27be8db 100644 --- a/arch/powerpc/math-emu/lfs.c +++ b/arch/powerpc/math-emu/lfs.c | |||
@@ -2,15 +2,17 @@ | |||
2 | #include <linux/errno.h> | 2 | #include <linux/errno.h> |
3 | #include <asm/uaccess.h> | 3 | #include <asm/uaccess.h> |
4 | 4 | ||
5 | #include "soft-fp.h" | 5 | #include <asm/sfp-machine.h> |
6 | #include "double.h" | 6 | #include <math-emu/soft-fp.h> |
7 | #include "single.h" | 7 | #include <math-emu/double.h> |
8 | #include <math-emu/single.h> | ||
8 | 9 | ||
9 | int | 10 | int |
10 | lfs(void *frD, void *ea) | 11 | lfs(void *frD, void *ea) |
11 | { | 12 | { |
12 | FP_DECL_D(R); | 13 | FP_DECL_D(R); |
13 | FP_DECL_S(A); | 14 | FP_DECL_S(A); |
15 | FP_DECL_EX; | ||
14 | float f; | 16 | float f; |
15 | 17 | ||
16 | #ifdef DEBUG | 18 | #ifdef DEBUG |
@@ -20,7 +22,7 @@ lfs(void *frD, void *ea) | |||
20 | if (copy_from_user(&f, ea, sizeof(float))) | 22 | if (copy_from_user(&f, ea, sizeof(float))) |
21 | return -EFAULT; | 23 | return -EFAULT; |
22 | 24 | ||
23 | __FP_UNPACK_S(A, &f); | 25 | FP_UNPACK_S(A, f); |
24 | 26 | ||
25 | #ifdef DEBUG | 27 | #ifdef DEBUG |
26 | printk("A: %ld %lu %ld (%ld) [%08lx]\n", A_s, A_f, A_e, A_c, | 28 | printk("A: %ld %lu %ld (%ld) [%08lx]\n", A_s, A_f, A_e, A_c, |
@@ -33,5 +35,12 @@ lfs(void *frD, void *ea) | |||
33 | printk("R: %ld %lu %lu %ld (%ld)\n", R_s, R_f1, R_f0, R_e, R_c); | 35 | printk("R: %ld %lu %lu %ld (%ld)\n", R_s, R_f1, R_f0, R_e, R_c); |
34 | #endif | 36 | #endif |
35 | 37 | ||
36 | return __FP_PACK_D(frD, R); | 38 | if (R_c == FP_CLS_NAN) { |
39 | R_e = _FP_EXPMAX_D; | ||
40 | _FP_PACK_RAW_2_P(D, frD, R); | ||
41 | } else { | ||
42 | __FP_PACK_D(frD, R); | ||
43 | } | ||
44 | |||
45 | return 0; | ||
37 | } | 46 | } |
diff --git a/arch/powerpc/math-emu/math.c b/arch/powerpc/math-emu/math.c index 29e545e0272e..164d55935bd8 100644 --- a/arch/powerpc/math-emu/math.c +++ b/arch/powerpc/math-emu/math.c | |||
@@ -8,8 +8,8 @@ | |||
8 | #include <asm/uaccess.h> | 8 | #include <asm/uaccess.h> |
9 | #include <asm/reg.h> | 9 | #include <asm/reg.h> |
10 | 10 | ||
11 | #include "sfp-machine.h" | 11 | #include <asm/sfp-machine.h> |
12 | #include "double.h" | 12 | #include <math-emu/double.h> |
13 | 13 | ||
14 | #define FLOATFUNC(x) extern int x(void *, void *, void *, void *) | 14 | #define FLOATFUNC(x) extern int x(void *, void *, void *, void *) |
15 | 15 | ||
@@ -168,6 +168,8 @@ record_exception(struct pt_regs *regs, int eflag) | |||
168 | fpscr |= FPSCR_ZX; | 168 | fpscr |= FPSCR_ZX; |
169 | if (eflag & EFLAG_INEXACT) | 169 | if (eflag & EFLAG_INEXACT) |
170 | fpscr |= FPSCR_XX; | 170 | fpscr |= FPSCR_XX; |
171 | if (eflag & EFLAG_INVALID) | ||
172 | fpscr |= FPSCR_VX; | ||
171 | if (eflag & EFLAG_VXSNAN) | 173 | if (eflag & EFLAG_VXSNAN) |
172 | fpscr |= FPSCR_VXSNAN; | 174 | fpscr |= FPSCR_VXSNAN; |
173 | if (eflag & EFLAG_VXISI) | 175 | if (eflag & EFLAG_VXISI) |
@@ -188,7 +190,7 @@ record_exception(struct pt_regs *regs, int eflag) | |||
188 | fpscr |= FPSCR_VXCVI; | 190 | fpscr |= FPSCR_VXCVI; |
189 | } | 191 | } |
190 | 192 | ||
191 | fpscr &= ~(FPSCR_VX); | 193 | // fpscr &= ~(FPSCR_VX); |
192 | if (fpscr & (FPSCR_VXSNAN | FPSCR_VXISI | FPSCR_VXIDI | | 194 | if (fpscr & (FPSCR_VXSNAN | FPSCR_VXISI | FPSCR_VXIDI | |
193 | FPSCR_VXZDZ | FPSCR_VXIMZ | FPSCR_VXVC | | 195 | FPSCR_VXZDZ | FPSCR_VXIMZ | FPSCR_VXVC | |
194 | FPSCR_VXSOFT | FPSCR_VXSQRT | FPSCR_VXCVI)) | 196 | FPSCR_VXSOFT | FPSCR_VXSQRT | FPSCR_VXCVI)) |
diff --git a/arch/powerpc/math-emu/mcrfs.c b/arch/powerpc/math-emu/mcrfs.c index 41ba247faf89..e948d5708e2b 100644 --- a/arch/powerpc/math-emu/mcrfs.c +++ b/arch/powerpc/math-emu/mcrfs.c | |||
@@ -2,7 +2,8 @@ | |||
2 | #include <linux/errno.h> | 2 | #include <linux/errno.h> |
3 | #include <asm/uaccess.h> | 3 | #include <asm/uaccess.h> |
4 | 4 | ||
5 | #include "soft-fp.h" | 5 | #include <asm/sfp-machine.h> |
6 | #include <math-emu/soft-fp.h> | ||
6 | 7 | ||
7 | int | 8 | int |
8 | mcrfs(u32 *ccr, u32 crfD, u32 crfS) | 9 | mcrfs(u32 *ccr, u32 crfD, u32 crfS) |
diff --git a/arch/powerpc/math-emu/mffs.c b/arch/powerpc/math-emu/mffs.c index b0e2106e6eb6..5526cf96ede5 100644 --- a/arch/powerpc/math-emu/mffs.c +++ b/arch/powerpc/math-emu/mffs.c | |||
@@ -2,7 +2,8 @@ | |||
2 | #include <linux/errno.h> | 2 | #include <linux/errno.h> |
3 | #include <asm/uaccess.h> | 3 | #include <asm/uaccess.h> |
4 | 4 | ||
5 | #include "soft-fp.h" | 5 | #include <asm/sfp-machine.h> |
6 | #include <math-emu/soft-fp.h> | ||
6 | 7 | ||
7 | int | 8 | int |
8 | mffs(u32 *frD) | 9 | mffs(u32 *frD) |
diff --git a/arch/powerpc/math-emu/mtfsb0.c b/arch/powerpc/math-emu/mtfsb0.c index d3062350ea21..bc985585bca8 100644 --- a/arch/powerpc/math-emu/mtfsb0.c +++ b/arch/powerpc/math-emu/mtfsb0.c | |||
@@ -2,7 +2,8 @@ | |||
2 | #include <linux/errno.h> | 2 | #include <linux/errno.h> |
3 | #include <asm/uaccess.h> | 3 | #include <asm/uaccess.h> |
4 | 4 | ||
5 | #include "soft-fp.h" | 5 | #include <asm/sfp-machine.h> |
6 | #include <math-emu/soft-fp.h> | ||
6 | 7 | ||
7 | int | 8 | int |
8 | mtfsb0(int crbD) | 9 | mtfsb0(int crbD) |
diff --git a/arch/powerpc/math-emu/mtfsb1.c b/arch/powerpc/math-emu/mtfsb1.c index 2e948704b56e..fe6ed5ac85b3 100644 --- a/arch/powerpc/math-emu/mtfsb1.c +++ b/arch/powerpc/math-emu/mtfsb1.c | |||
@@ -2,7 +2,8 @@ | |||
2 | #include <linux/errno.h> | 2 | #include <linux/errno.h> |
3 | #include <asm/uaccess.h> | 3 | #include <asm/uaccess.h> |
4 | 4 | ||
5 | #include "soft-fp.h" | 5 | #include <asm/sfp-machine.h> |
6 | #include <math-emu/soft-fp.h> | ||
6 | 7 | ||
7 | int | 8 | int |
8 | mtfsb1(int crbD) | 9 | mtfsb1(int crbD) |
diff --git a/arch/powerpc/math-emu/mtfsf.c b/arch/powerpc/math-emu/mtfsf.c index 48014d8e3af1..dbce92e4f046 100644 --- a/arch/powerpc/math-emu/mtfsf.c +++ b/arch/powerpc/math-emu/mtfsf.c | |||
@@ -2,12 +2,14 @@ | |||
2 | #include <linux/errno.h> | 2 | #include <linux/errno.h> |
3 | #include <asm/uaccess.h> | 3 | #include <asm/uaccess.h> |
4 | 4 | ||
5 | #include "soft-fp.h" | 5 | #include <asm/sfp-machine.h> |
6 | #include <math-emu/soft-fp.h> | ||
6 | 7 | ||
7 | int | 8 | int |
8 | mtfsf(unsigned int FM, u32 *frB) | 9 | mtfsf(unsigned int FM, u32 *frB) |
9 | { | 10 | { |
10 | u32 mask; | 11 | u32 mask; |
12 | u32 fpscr; | ||
11 | 13 | ||
12 | if (FM == 0) | 14 | if (FM == 0) |
13 | return 0; | 15 | return 0; |
@@ -37,6 +39,22 @@ mtfsf(unsigned int FM, u32 *frB) | |||
37 | __FPU_FPSCR &= ~(mask); | 39 | __FPU_FPSCR &= ~(mask); |
38 | __FPU_FPSCR |= (frB[1] & mask); | 40 | __FPU_FPSCR |= (frB[1] & mask); |
39 | 41 | ||
42 | __FPU_FPSCR &= ~(FPSCR_VX); | ||
43 | if (__FPU_FPSCR & (FPSCR_VXSNAN | FPSCR_VXISI | FPSCR_VXIDI | | ||
44 | FPSCR_VXZDZ | FPSCR_VXIMZ | FPSCR_VXVC | | ||
45 | FPSCR_VXSOFT | FPSCR_VXSQRT | FPSCR_VXCVI)) | ||
46 | __FPU_FPSCR |= FPSCR_VX; | ||
47 | |||
48 | fpscr = __FPU_FPSCR; | ||
49 | fpscr &= ~(FPSCR_FEX); | ||
50 | if (((fpscr & FPSCR_VX) && (fpscr & FPSCR_VE)) || | ||
51 | ((fpscr & FPSCR_OX) && (fpscr & FPSCR_OE)) || | ||
52 | ((fpscr & FPSCR_UX) && (fpscr & FPSCR_UE)) || | ||
53 | ((fpscr & FPSCR_ZX) && (fpscr & FPSCR_ZE)) || | ||
54 | ((fpscr & FPSCR_XX) && (fpscr & FPSCR_XE))) | ||
55 | fpscr |= FPSCR_FEX; | ||
56 | __FPU_FPSCR = fpscr; | ||
57 | |||
40 | #ifdef DEBUG | 58 | #ifdef DEBUG |
41 | printk("%s: %02x %p: %08lx\n", __func__, FM, frB, __FPU_FPSCR); | 59 | printk("%s: %02x %p: %08lx\n", __func__, FM, frB, __FPU_FPSCR); |
42 | #endif | 60 | #endif |
diff --git a/arch/powerpc/math-emu/mtfsfi.c b/arch/powerpc/math-emu/mtfsfi.c index 031e20093549..fd2acc26813b 100644 --- a/arch/powerpc/math-emu/mtfsfi.c +++ b/arch/powerpc/math-emu/mtfsfi.c | |||
@@ -2,7 +2,8 @@ | |||
2 | #include <linux/errno.h> | 2 | #include <linux/errno.h> |
3 | #include <asm/uaccess.h> | 3 | #include <asm/uaccess.h> |
4 | 4 | ||
5 | #include "soft-fp.h" | 5 | #include <asm/sfp-machine.h> |
6 | #include <math-emu/soft-fp.h> | ||
6 | 7 | ||
7 | int | 8 | int |
8 | mtfsfi(unsigned int crfD, unsigned int IMM) | 9 | mtfsfi(unsigned int crfD, unsigned int IMM) |
diff --git a/arch/powerpc/math-emu/op-1.h b/arch/powerpc/math-emu/op-1.h deleted file mode 100644 index c92fa95f562e..000000000000 --- a/arch/powerpc/math-emu/op-1.h +++ /dev/null | |||
@@ -1,245 +0,0 @@ | |||
1 | /* | ||
2 | * Basic one-word fraction declaration and manipulation. | ||
3 | */ | ||
4 | |||
5 | #define _FP_FRAC_DECL_1(X) _FP_W_TYPE X##_f | ||
6 | #define _FP_FRAC_COPY_1(D,S) (D##_f = S##_f) | ||
7 | #define _FP_FRAC_SET_1(X,I) (X##_f = I) | ||
8 | #define _FP_FRAC_HIGH_1(X) (X##_f) | ||
9 | #define _FP_FRAC_LOW_1(X) (X##_f) | ||
10 | #define _FP_FRAC_WORD_1(X,w) (X##_f) | ||
11 | |||
12 | #define _FP_FRAC_ADDI_1(X,I) (X##_f += I) | ||
13 | #define _FP_FRAC_SLL_1(X,N) \ | ||
14 | do { \ | ||
15 | if (__builtin_constant_p(N) && (N) == 1) \ | ||
16 | X##_f += X##_f; \ | ||
17 | else \ | ||
18 | X##_f <<= (N); \ | ||
19 | } while (0) | ||
20 | #define _FP_FRAC_SRL_1(X,N) (X##_f >>= N) | ||
21 | |||
22 | /* Right shift with sticky-lsb. */ | ||
23 | #define _FP_FRAC_SRS_1(X,N,sz) __FP_FRAC_SRS_1(X##_f, N, sz) | ||
24 | |||
25 | #define __FP_FRAC_SRS_1(X,N,sz) \ | ||
26 | (X = (X >> (N) | (__builtin_constant_p(N) && (N) == 1 \ | ||
27 | ? X & 1 : (X << (_FP_W_TYPE_SIZE - (N))) != 0))) | ||
28 | |||
29 | #define _FP_FRAC_ADD_1(R,X,Y) (R##_f = X##_f + Y##_f) | ||
30 | #define _FP_FRAC_SUB_1(R,X,Y) (R##_f = X##_f - Y##_f) | ||
31 | #define _FP_FRAC_CLZ_1(z, X) __FP_CLZ(z, X##_f) | ||
32 | |||
33 | /* Predicates */ | ||
34 | #define _FP_FRAC_NEGP_1(X) ((_FP_WS_TYPE)X##_f < 0) | ||
35 | #define _FP_FRAC_ZEROP_1(X) (X##_f == 0) | ||
36 | #define _FP_FRAC_OVERP_1(fs,X) (X##_f & _FP_OVERFLOW_##fs) | ||
37 | #define _FP_FRAC_EQ_1(X, Y) (X##_f == Y##_f) | ||
38 | #define _FP_FRAC_GE_1(X, Y) (X##_f >= Y##_f) | ||
39 | #define _FP_FRAC_GT_1(X, Y) (X##_f > Y##_f) | ||
40 | |||
41 | #define _FP_ZEROFRAC_1 0 | ||
42 | #define _FP_MINFRAC_1 1 | ||
43 | |||
44 | /* | ||
45 | * Unpack the raw bits of a native fp value. Do not classify or | ||
46 | * normalize the data. | ||
47 | */ | ||
48 | |||
49 | #define _FP_UNPACK_RAW_1(fs, X, val) \ | ||
50 | do { \ | ||
51 | union _FP_UNION_##fs _flo; _flo.flt = (val); \ | ||
52 | \ | ||
53 | X##_f = _flo.bits.frac; \ | ||
54 | X##_e = _flo.bits.exp; \ | ||
55 | X##_s = _flo.bits.sign; \ | ||
56 | } while (0) | ||
57 | |||
58 | |||
59 | /* | ||
60 | * Repack the raw bits of a native fp value. | ||
61 | */ | ||
62 | |||
63 | #define _FP_PACK_RAW_1(fs, val, X) \ | ||
64 | do { \ | ||
65 | union _FP_UNION_##fs _flo; \ | ||
66 | \ | ||
67 | _flo.bits.frac = X##_f; \ | ||
68 | _flo.bits.exp = X##_e; \ | ||
69 | _flo.bits.sign = X##_s; \ | ||
70 | \ | ||
71 | (val) = _flo.flt; \ | ||
72 | } while (0) | ||
73 | |||
74 | |||
75 | /* | ||
76 | * Multiplication algorithms: | ||
77 | */ | ||
78 | |||
79 | /* Basic. Assuming the host word size is >= 2*FRACBITS, we can do the | ||
80 | multiplication immediately. */ | ||
81 | |||
82 | #define _FP_MUL_MEAT_1_imm(fs, R, X, Y) \ | ||
83 | do { \ | ||
84 | R##_f = X##_f * Y##_f; \ | ||
85 | /* Normalize since we know where the msb of the multiplicands \ | ||
86 | were (bit B), we know that the msb of the of the product is \ | ||
87 | at either 2B or 2B-1. */ \ | ||
88 | _FP_FRAC_SRS_1(R, _FP_WFRACBITS_##fs-1, 2*_FP_WFRACBITS_##fs); \ | ||
89 | } while (0) | ||
90 | |||
91 | /* Given a 1W * 1W => 2W primitive, do the extended multiplication. */ | ||
92 | |||
93 | #define _FP_MUL_MEAT_1_wide(fs, R, X, Y, doit) \ | ||
94 | do { \ | ||
95 | _FP_W_TYPE _Z_f0, _Z_f1; \ | ||
96 | doit(_Z_f1, _Z_f0, X##_f, Y##_f); \ | ||
97 | /* Normalize since we know where the msb of the multiplicands \ | ||
98 | were (bit B), we know that the msb of the of the product is \ | ||
99 | at either 2B or 2B-1. */ \ | ||
100 | _FP_FRAC_SRS_2(_Z, _FP_WFRACBITS_##fs-1, 2*_FP_WFRACBITS_##fs); \ | ||
101 | R##_f = _Z_f0; \ | ||
102 | } while (0) | ||
103 | |||
104 | /* Finally, a simple widening multiply algorithm. What fun! */ | ||
105 | |||
106 | #define _FP_MUL_MEAT_1_hard(fs, R, X, Y) \ | ||
107 | do { \ | ||
108 | _FP_W_TYPE _xh, _xl, _yh, _yl, _z_f0, _z_f1, _a_f0, _a_f1; \ | ||
109 | \ | ||
110 | /* split the words in half */ \ | ||
111 | _xh = X##_f >> (_FP_W_TYPE_SIZE/2); \ | ||
112 | _xl = X##_f & (((_FP_W_TYPE)1 << (_FP_W_TYPE_SIZE/2)) - 1); \ | ||
113 | _yh = Y##_f >> (_FP_W_TYPE_SIZE/2); \ | ||
114 | _yl = Y##_f & (((_FP_W_TYPE)1 << (_FP_W_TYPE_SIZE/2)) - 1); \ | ||
115 | \ | ||
116 | /* multiply the pieces */ \ | ||
117 | _z_f0 = _xl * _yl; \ | ||
118 | _a_f0 = _xh * _yl; \ | ||
119 | _a_f1 = _xl * _yh; \ | ||
120 | _z_f1 = _xh * _yh; \ | ||
121 | \ | ||
122 | /* reassemble into two full words */ \ | ||
123 | if ((_a_f0 += _a_f1) < _a_f1) \ | ||
124 | _z_f1 += (_FP_W_TYPE)1 << (_FP_W_TYPE_SIZE/2); \ | ||
125 | _a_f1 = _a_f0 >> (_FP_W_TYPE_SIZE/2); \ | ||
126 | _a_f0 = _a_f0 << (_FP_W_TYPE_SIZE/2); \ | ||
127 | _FP_FRAC_ADD_2(_z, _z, _a); \ | ||
128 | \ | ||
129 | /* normalize */ \ | ||
130 | _FP_FRAC_SRS_2(_z, _FP_WFRACBITS_##fs - 1, 2*_FP_WFRACBITS_##fs); \ | ||
131 | R##_f = _z_f0; \ | ||
132 | } while (0) | ||
133 | |||
134 | |||
135 | /* | ||
136 | * Division algorithms: | ||
137 | */ | ||
138 | |||
139 | /* Basic. Assuming the host word size is >= 2*FRACBITS, we can do the | ||
140 | division immediately. Give this macro either _FP_DIV_HELP_imm for | ||
141 | C primitives or _FP_DIV_HELP_ldiv for the ISO function. Which you | ||
142 | choose will depend on what the compiler does with divrem4. */ | ||
143 | |||
144 | #define _FP_DIV_MEAT_1_imm(fs, R, X, Y, doit) \ | ||
145 | do { \ | ||
146 | _FP_W_TYPE _q, _r; \ | ||
147 | X##_f <<= (X##_f < Y##_f \ | ||
148 | ? R##_e--, _FP_WFRACBITS_##fs \ | ||
149 | : _FP_WFRACBITS_##fs - 1); \ | ||
150 | doit(_q, _r, X##_f, Y##_f); \ | ||
151 | R##_f = _q | (_r != 0); \ | ||
152 | } while (0) | ||
153 | |||
154 | /* GCC's longlong.h defines a 2W / 1W => (1W,1W) primitive udiv_qrnnd | ||
155 | that may be useful in this situation. This first is for a primitive | ||
156 | that requires normalization, the second for one that does not. Look | ||
157 | for UDIV_NEEDS_NORMALIZATION to tell which your machine needs. */ | ||
158 | |||
159 | #define _FP_DIV_MEAT_1_udiv_norm(fs, R, X, Y) \ | ||
160 | do { \ | ||
161 | _FP_W_TYPE _nh, _nl, _q, _r; \ | ||
162 | \ | ||
163 | /* Normalize Y -- i.e. make the most significant bit set. */ \ | ||
164 | Y##_f <<= _FP_WFRACXBITS_##fs - 1; \ | ||
165 | \ | ||
166 | /* Shift X op correspondingly high, that is, up one full word. */ \ | ||
167 | if (X##_f <= Y##_f) \ | ||
168 | { \ | ||
169 | _nl = 0; \ | ||
170 | _nh = X##_f; \ | ||
171 | } \ | ||
172 | else \ | ||
173 | { \ | ||
174 | R##_e++; \ | ||
175 | _nl = X##_f << (_FP_W_TYPE_SIZE-1); \ | ||
176 | _nh = X##_f >> 1; \ | ||
177 | } \ | ||
178 | \ | ||
179 | udiv_qrnnd(_q, _r, _nh, _nl, Y##_f); \ | ||
180 | R##_f = _q | (_r != 0); \ | ||
181 | } while (0) | ||
182 | |||
183 | #define _FP_DIV_MEAT_1_udiv(fs, R, X, Y) \ | ||
184 | do { \ | ||
185 | _FP_W_TYPE _nh, _nl, _q, _r; \ | ||
186 | if (X##_f < Y##_f) \ | ||
187 | { \ | ||
188 | R##_e--; \ | ||
189 | _nl = X##_f << _FP_WFRACBITS_##fs; \ | ||
190 | _nh = X##_f >> _FP_WFRACXBITS_##fs; \ | ||
191 | } \ | ||
192 | else \ | ||
193 | { \ | ||
194 | _nl = X##_f << (_FP_WFRACBITS_##fs - 1); \ | ||
195 | _nh = X##_f >> (_FP_WFRACXBITS_##fs + 1); \ | ||
196 | } \ | ||
197 | udiv_qrnnd(_q, _r, _nh, _nl, Y##_f); \ | ||
198 | R##_f = _q | (_r != 0); \ | ||
199 | } while (0) | ||
200 | |||
201 | |||
202 | /* | ||
203 | * Square root algorithms: | ||
204 | * We have just one right now, maybe Newton approximation | ||
205 | * should be added for those machines where division is fast. | ||
206 | */ | ||
207 | |||
208 | #define _FP_SQRT_MEAT_1(R, S, T, X, q) \ | ||
209 | do { \ | ||
210 | while (q) \ | ||
211 | { \ | ||
212 | T##_f = S##_f + q; \ | ||
213 | if (T##_f <= X##_f) \ | ||
214 | { \ | ||
215 | S##_f = T##_f + q; \ | ||
216 | X##_f -= T##_f; \ | ||
217 | R##_f += q; \ | ||
218 | } \ | ||
219 | _FP_FRAC_SLL_1(X, 1); \ | ||
220 | q >>= 1; \ | ||
221 | } \ | ||
222 | } while (0) | ||
223 | |||
224 | /* | ||
225 | * Assembly/disassembly for converting to/from integral types. | ||
226 | * No shifting or overflow handled here. | ||
227 | */ | ||
228 | |||
229 | #define _FP_FRAC_ASSEMBLE_1(r, X, rsize) (r = X##_f) | ||
230 | #define _FP_FRAC_DISASSEMBLE_1(X, r, rsize) (X##_f = r) | ||
231 | |||
232 | |||
233 | /* | ||
234 | * Convert FP values between word sizes | ||
235 | */ | ||
236 | |||
237 | #define _FP_FRAC_CONV_1_1(dfs, sfs, D, S) \ | ||
238 | do { \ | ||
239 | D##_f = S##_f; \ | ||
240 | if (_FP_WFRACBITS_##sfs > _FP_WFRACBITS_##dfs) \ | ||
241 | _FP_FRAC_SRS_1(D, (_FP_WFRACBITS_##sfs-_FP_WFRACBITS_##dfs), \ | ||
242 | _FP_WFRACBITS_##sfs); \ | ||
243 | else \ | ||
244 | D##_f <<= _FP_WFRACBITS_##dfs - _FP_WFRACBITS_##sfs; \ | ||
245 | } while (0) | ||
diff --git a/arch/powerpc/math-emu/op-2.h b/arch/powerpc/math-emu/op-2.h deleted file mode 100644 index 7d6f17cc2929..000000000000 --- a/arch/powerpc/math-emu/op-2.h +++ /dev/null | |||
@@ -1,434 +0,0 @@ | |||
1 | /* | ||
2 | * Basic two-word fraction declaration and manipulation. | ||
3 | */ | ||
4 | |||
5 | #define _FP_FRAC_DECL_2(X) _FP_W_TYPE X##_f0, X##_f1 | ||
6 | #define _FP_FRAC_COPY_2(D,S) (D##_f0 = S##_f0, D##_f1 = S##_f1) | ||
7 | #define _FP_FRAC_SET_2(X,I) __FP_FRAC_SET_2(X, I) | ||
8 | #define _FP_FRAC_HIGH_2(X) (X##_f1) | ||
9 | #define _FP_FRAC_LOW_2(X) (X##_f0) | ||
10 | #define _FP_FRAC_WORD_2(X,w) (X##_f##w) | ||
11 | |||
12 | #define _FP_FRAC_SLL_2(X,N) \ | ||
13 | do { \ | ||
14 | if ((N) < _FP_W_TYPE_SIZE) \ | ||
15 | { \ | ||
16 | if (__builtin_constant_p(N) && (N) == 1) \ | ||
17 | { \ | ||
18 | X##_f1 = X##_f1 + X##_f1 + (((_FP_WS_TYPE)(X##_f0)) < 0); \ | ||
19 | X##_f0 += X##_f0; \ | ||
20 | } \ | ||
21 | else \ | ||
22 | { \ | ||
23 | X##_f1 = X##_f1 << (N) | X##_f0 >> (_FP_W_TYPE_SIZE - (N)); \ | ||
24 | X##_f0 <<= (N); \ | ||
25 | } \ | ||
26 | } \ | ||
27 | else \ | ||
28 | { \ | ||
29 | X##_f1 = X##_f0 << ((N) - _FP_W_TYPE_SIZE); \ | ||
30 | X##_f0 = 0; \ | ||
31 | } \ | ||
32 | } while (0) | ||
33 | |||
34 | #define _FP_FRAC_SRL_2(X,N) \ | ||
35 | do { \ | ||
36 | if ((N) < _FP_W_TYPE_SIZE) \ | ||
37 | { \ | ||
38 | X##_f0 = X##_f0 >> (N) | X##_f1 << (_FP_W_TYPE_SIZE - (N)); \ | ||
39 | X##_f1 >>= (N); \ | ||
40 | } \ | ||
41 | else \ | ||
42 | { \ | ||
43 | X##_f0 = X##_f1 >> ((N) - _FP_W_TYPE_SIZE); \ | ||
44 | X##_f1 = 0; \ | ||
45 | } \ | ||
46 | } while (0) | ||
47 | |||
48 | /* Right shift with sticky-lsb. */ | ||
49 | #define _FP_FRAC_SRS_2(X,N,sz) \ | ||
50 | do { \ | ||
51 | if ((N) < _FP_W_TYPE_SIZE) \ | ||
52 | { \ | ||
53 | X##_f0 = (X##_f1 << (_FP_W_TYPE_SIZE - (N)) | X##_f0 >> (N) | \ | ||
54 | (__builtin_constant_p(N) && (N) == 1 \ | ||
55 | ? X##_f0 & 1 \ | ||
56 | : (X##_f0 << (_FP_W_TYPE_SIZE - (N))) != 0)); \ | ||
57 | X##_f1 >>= (N); \ | ||
58 | } \ | ||
59 | else \ | ||
60 | { \ | ||
61 | X##_f0 = (X##_f1 >> ((N) - _FP_W_TYPE_SIZE) | \ | ||
62 | (((X##_f1 << (2 * _FP_W_TYPE_SIZE - (N))) | \ | ||
63 | X##_f0) != 0)); \ | ||
64 | X##_f1 = 0; \ | ||
65 | } \ | ||
66 | } while (0) | ||
67 | |||
68 | #define _FP_FRAC_ADDI_2(X,I) \ | ||
69 | __FP_FRAC_ADDI_2(X##_f1, X##_f0, I) | ||
70 | |||
71 | #define _FP_FRAC_ADD_2(R,X,Y) \ | ||
72 | __FP_FRAC_ADD_2(R##_f1, R##_f0, X##_f1, X##_f0, Y##_f1, Y##_f0) | ||
73 | |||
74 | #define _FP_FRAC_SUB_2(R,X,Y) \ | ||
75 | __FP_FRAC_SUB_2(R##_f1, R##_f0, X##_f1, X##_f0, Y##_f1, Y##_f0) | ||
76 | |||
77 | #define _FP_FRAC_CLZ_2(R,X) \ | ||
78 | do { \ | ||
79 | if (X##_f1) \ | ||
80 | __FP_CLZ(R,X##_f1); \ | ||
81 | else \ | ||
82 | { \ | ||
83 | __FP_CLZ(R,X##_f0); \ | ||
84 | R += _FP_W_TYPE_SIZE; \ | ||
85 | } \ | ||
86 | } while(0) | ||
87 | |||
88 | /* Predicates */ | ||
89 | #define _FP_FRAC_NEGP_2(X) ((_FP_WS_TYPE)X##_f1 < 0) | ||
90 | #define _FP_FRAC_ZEROP_2(X) ((X##_f1 | X##_f0) == 0) | ||
91 | #define _FP_FRAC_OVERP_2(fs,X) (X##_f1 & _FP_OVERFLOW_##fs) | ||
92 | #define _FP_FRAC_EQ_2(X, Y) (X##_f1 == Y##_f1 && X##_f0 == Y##_f0) | ||
93 | #define _FP_FRAC_GT_2(X, Y) \ | ||
94 | ((X##_f1 > Y##_f1) || (X##_f1 == Y##_f1 && X##_f0 > Y##_f0)) | ||
95 | #define _FP_FRAC_GE_2(X, Y) \ | ||
96 | ((X##_f1 > Y##_f1) || (X##_f1 == Y##_f1 && X##_f0 >= Y##_f0)) | ||
97 | |||
98 | #define _FP_ZEROFRAC_2 0, 0 | ||
99 | #define _FP_MINFRAC_2 0, 1 | ||
100 | |||
101 | /* | ||
102 | * Internals | ||
103 | */ | ||
104 | |||
105 | #define __FP_FRAC_SET_2(X,I1,I0) (X##_f0 = I0, X##_f1 = I1) | ||
106 | |||
107 | #define __FP_CLZ_2(R, xh, xl) \ | ||
108 | do { \ | ||
109 | if (xh) \ | ||
110 | __FP_CLZ(R,xl); \ | ||
111 | else \ | ||
112 | { \ | ||
113 | __FP_CLZ(R,xl); \ | ||
114 | R += _FP_W_TYPE_SIZE; \ | ||
115 | } \ | ||
116 | } while(0) | ||
117 | |||
118 | #if 0 | ||
119 | |||
120 | #ifndef __FP_FRAC_ADDI_2 | ||
121 | #define __FP_FRAC_ADDI_2(xh, xl, i) \ | ||
122 | (xh += ((xl += i) < i)) | ||
123 | #endif | ||
124 | #ifndef __FP_FRAC_ADD_2 | ||
125 | #define __FP_FRAC_ADD_2(rh, rl, xh, xl, yh, yl) \ | ||
126 | (rh = xh + yh + ((rl = xl + yl) < xl)) | ||
127 | #endif | ||
128 | #ifndef __FP_FRAC_SUB_2 | ||
129 | #define __FP_FRAC_SUB_2(rh, rl, xh, xl, yh, yl) \ | ||
130 | (rh = xh - yh - ((rl = xl - yl) > xl)) | ||
131 | #endif | ||
132 | |||
133 | #else | ||
134 | |||
135 | #undef __FP_FRAC_ADDI_2 | ||
136 | #define __FP_FRAC_ADDI_2(xh, xl, i) add_ssaaaa(xh, xl, xh, xl, 0, i) | ||
137 | #undef __FP_FRAC_ADD_2 | ||
138 | #define __FP_FRAC_ADD_2 add_ssaaaa | ||
139 | #undef __FP_FRAC_SUB_2 | ||
140 | #define __FP_FRAC_SUB_2 sub_ddmmss | ||
141 | |||
142 | #endif | ||
143 | |||
144 | /* | ||
145 | * Unpack the raw bits of a native fp value. Do not classify or | ||
146 | * normalize the data. | ||
147 | */ | ||
148 | |||
149 | #define _FP_UNPACK_RAW_2(fs, X, val) \ | ||
150 | do { \ | ||
151 | union _FP_UNION_##fs _flo; _flo.flt = (val); \ | ||
152 | \ | ||
153 | X##_f0 = _flo.bits.frac0; \ | ||
154 | X##_f1 = _flo.bits.frac1; \ | ||
155 | X##_e = _flo.bits.exp; \ | ||
156 | X##_s = _flo.bits.sign; \ | ||
157 | } while (0) | ||
158 | |||
159 | |||
160 | /* | ||
161 | * Repack the raw bits of a native fp value. | ||
162 | */ | ||
163 | |||
164 | #define _FP_PACK_RAW_2(fs, val, X) \ | ||
165 | do { \ | ||
166 | union _FP_UNION_##fs _flo; \ | ||
167 | \ | ||
168 | _flo.bits.frac0 = X##_f0; \ | ||
169 | _flo.bits.frac1 = X##_f1; \ | ||
170 | _flo.bits.exp = X##_e; \ | ||
171 | _flo.bits.sign = X##_s; \ | ||
172 | \ | ||
173 | (val) = _flo.flt; \ | ||
174 | } while (0) | ||
175 | |||
176 | |||
177 | /* | ||
178 | * Multiplication algorithms: | ||
179 | */ | ||
180 | |||
181 | /* Given a 1W * 1W => 2W primitive, do the extended multiplication. */ | ||
182 | |||
183 | #define _FP_MUL_MEAT_2_wide(fs, R, X, Y, doit) \ | ||
184 | do { \ | ||
185 | _FP_FRAC_DECL_4(_z); _FP_FRAC_DECL_2(_b); _FP_FRAC_DECL_2(_c); \ | ||
186 | \ | ||
187 | doit(_FP_FRAC_WORD_4(_z,1), _FP_FRAC_WORD_4(_z,0), X##_f0, Y##_f0); \ | ||
188 | doit(_b_f1, _b_f0, X##_f0, Y##_f1); \ | ||
189 | doit(_c_f1, _c_f0, X##_f1, Y##_f0); \ | ||
190 | doit(_FP_FRAC_WORD_4(_z,3), _FP_FRAC_WORD_4(_z,2), X##_f1, Y##_f1); \ | ||
191 | \ | ||
192 | __FP_FRAC_ADD_4(_FP_FRAC_WORD_4(_z,3),_FP_FRAC_WORD_4(_z,2), \ | ||
193 | _FP_FRAC_WORD_4(_z,1),_FP_FRAC_WORD_4(_z,0), \ | ||
194 | 0, _b_f1, _b_f0, 0, \ | ||
195 | _FP_FRAC_WORD_4(_z,3),_FP_FRAC_WORD_4(_z,2), \ | ||
196 | _FP_FRAC_WORD_4(_z,1),_FP_FRAC_WORD_4(_z,0)); \ | ||
197 | __FP_FRAC_ADD_4(_FP_FRAC_WORD_4(_z,3),_FP_FRAC_WORD_4(_z,2), \ | ||
198 | _FP_FRAC_WORD_4(_z,1),_FP_FRAC_WORD_4(_z,0), \ | ||
199 | 0, _c_f1, _c_f0, 0, \ | ||
200 | _FP_FRAC_WORD_4(_z,3),_FP_FRAC_WORD_4(_z,2), \ | ||
201 | _FP_FRAC_WORD_4(_z,1),_FP_FRAC_WORD_4(_z,0)); \ | ||
202 | \ | ||
203 | /* Normalize since we know where the msb of the multiplicands \ | ||
204 | were (bit B), we know that the msb of the of the product is \ | ||
205 | at either 2B or 2B-1. */ \ | ||
206 | _FP_FRAC_SRS_4(_z, _FP_WFRACBITS_##fs-1, 2*_FP_WFRACBITS_##fs); \ | ||
207 | R##_f0 = _FP_FRAC_WORD_4(_z,0); \ | ||
208 | R##_f1 = _FP_FRAC_WORD_4(_z,1); \ | ||
209 | } while (0) | ||
210 | |||
211 | /* This next macro appears to be totally broken. Fortunately nowhere | ||
212 | * seems to use it :-> The problem is that we define _z[4] but | ||
213 | * then use it in _FP_FRAC_SRS_4, which will attempt to access | ||
214 | * _z_f[n] which will cause an error. The fix probably involves | ||
215 | * declaring it with _FP_FRAC_DECL_4, see previous macro. -- PMM 02/1998 | ||
216 | */ | ||
217 | #define _FP_MUL_MEAT_2_gmp(fs, R, X, Y) \ | ||
218 | do { \ | ||
219 | _FP_W_TYPE _x[2], _y[2], _z[4]; \ | ||
220 | _x[0] = X##_f0; _x[1] = X##_f1; \ | ||
221 | _y[0] = Y##_f0; _y[1] = Y##_f1; \ | ||
222 | \ | ||
223 | mpn_mul_n(_z, _x, _y, 2); \ | ||
224 | \ | ||
225 | /* Normalize since we know where the msb of the multiplicands \ | ||
226 | were (bit B), we know that the msb of the of the product is \ | ||
227 | at either 2B or 2B-1. */ \ | ||
228 | _FP_FRAC_SRS_4(_z, _FP_WFRACBITS##_fs-1, 2*_FP_WFRACBITS_##fs); \ | ||
229 | R##_f0 = _z[0]; \ | ||
230 | R##_f1 = _z[1]; \ | ||
231 | } while (0) | ||
232 | |||
233 | |||
234 | /* | ||
235 | * Division algorithms: | ||
236 | * This seems to be giving me difficulties -- PMM | ||
237 | * Look, NetBSD seems to be able to comment algorithms. Can't you? | ||
238 | * I've thrown printks at the problem. | ||
239 | * This now appears to work, but I still don't really know why. | ||
240 | * Also, I don't think the result is properly normalised... | ||
241 | */ | ||
242 | |||
243 | #define _FP_DIV_MEAT_2_udiv_64(fs, R, X, Y) \ | ||
244 | do { \ | ||
245 | extern void _fp_udivmodti4(_FP_W_TYPE q[2], _FP_W_TYPE r[2], \ | ||
246 | _FP_W_TYPE n1, _FP_W_TYPE n0, \ | ||
247 | _FP_W_TYPE d1, _FP_W_TYPE d0); \ | ||
248 | _FP_W_TYPE _n_f3, _n_f2, _n_f1, _n_f0, _r_f1, _r_f0; \ | ||
249 | _FP_W_TYPE _q_f1, _q_f0, _m_f1, _m_f0; \ | ||
250 | _FP_W_TYPE _rmem[2], _qmem[2]; \ | ||
251 | /* I think this check is to ensure that the result is normalised. \ | ||
252 | * Assuming X,Y normalised (ie in [1.0,2.0)) X/Y will be in \ | ||
253 | * [0.5,2.0). Furthermore, it will be less than 1.0 iff X < Y. \ | ||
254 | * In this case we tweak things. (this is based on comments in \ | ||
255 | * the NetBSD FPU emulation code. ) \ | ||
256 | * We know X,Y are normalised because we ensure this as part of \ | ||
257 | * the unpacking process. -- PMM \ | ||
258 | */ \ | ||
259 | if (_FP_FRAC_GT_2(X, Y)) \ | ||
260 | { \ | ||
261 | /* R##_e++; */ \ | ||
262 | _n_f3 = X##_f1 >> 1; \ | ||
263 | _n_f2 = X##_f1 << (_FP_W_TYPE_SIZE - 1) | X##_f0 >> 1; \ | ||
264 | _n_f1 = X##_f0 << (_FP_W_TYPE_SIZE - 1); \ | ||
265 | _n_f0 = 0; \ | ||
266 | } \ | ||
267 | else \ | ||
268 | { \ | ||
269 | R##_e--; \ | ||
270 | _n_f3 = X##_f1; \ | ||
271 | _n_f2 = X##_f0; \ | ||
272 | _n_f1 = _n_f0 = 0; \ | ||
273 | } \ | ||
274 | \ | ||
275 | /* Normalize, i.e. make the most significant bit of the \ | ||
276 | denominator set. CHANGED: - 1 to nothing -- PMM */ \ | ||
277 | _FP_FRAC_SLL_2(Y, _FP_WFRACXBITS_##fs /* -1 */); \ | ||
278 | \ | ||
279 | /* Do the 256/128 bit division given the 128-bit _fp_udivmodtf4 \ | ||
280 | primitive snagged from libgcc2.c. */ \ | ||
281 | \ | ||
282 | _fp_udivmodti4(_qmem, _rmem, _n_f3, _n_f2, 0, Y##_f1); \ | ||
283 | _q_f1 = _qmem[0]; \ | ||
284 | umul_ppmm(_m_f1, _m_f0, _q_f1, Y##_f0); \ | ||
285 | _r_f1 = _rmem[0]; \ | ||
286 | _r_f0 = _n_f1; \ | ||
287 | if (_FP_FRAC_GT_2(_m, _r)) \ | ||
288 | { \ | ||
289 | _q_f1--; \ | ||
290 | _FP_FRAC_ADD_2(_r, _r, Y); \ | ||
291 | if (_FP_FRAC_GE_2(_r, Y) && _FP_FRAC_GT_2(_m, _r)) \ | ||
292 | { \ | ||
293 | _q_f1--; \ | ||
294 | _FP_FRAC_ADD_2(_r, _r, Y); \ | ||
295 | } \ | ||
296 | } \ | ||
297 | _FP_FRAC_SUB_2(_r, _r, _m); \ | ||
298 | \ | ||
299 | _fp_udivmodti4(_qmem, _rmem, _r_f1, _r_f0, 0, Y##_f1); \ | ||
300 | _q_f0 = _qmem[0]; \ | ||
301 | umul_ppmm(_m_f1, _m_f0, _q_f0, Y##_f0); \ | ||
302 | _r_f1 = _rmem[0]; \ | ||
303 | _r_f0 = _n_f0; \ | ||
304 | if (_FP_FRAC_GT_2(_m, _r)) \ | ||
305 | { \ | ||
306 | _q_f0--; \ | ||
307 | _FP_FRAC_ADD_2(_r, _r, Y); \ | ||
308 | if (_FP_FRAC_GE_2(_r, Y) && _FP_FRAC_GT_2(_m, _r)) \ | ||
309 | { \ | ||
310 | _q_f0--; \ | ||
311 | _FP_FRAC_ADD_2(_r, _r, Y); \ | ||
312 | } \ | ||
313 | } \ | ||
314 | _FP_FRAC_SUB_2(_r, _r, _m); \ | ||
315 | \ | ||
316 | R##_f1 = _q_f1; \ | ||
317 | R##_f0 = _q_f0 | ((_r_f1 | _r_f0) != 0); \ | ||
318 | /* adjust so answer is normalized again. I'm not sure what the \ | ||
319 | * final sz param should be. In practice it's never used since \ | ||
320 | * N is 1 which is always going to be < _FP_W_TYPE_SIZE... \ | ||
321 | */ \ | ||
322 | /* _FP_FRAC_SRS_2(R,1,_FP_WFRACBITS_##fs); */ \ | ||
323 | } while (0) | ||
324 | |||
325 | |||
326 | #define _FP_DIV_MEAT_2_gmp(fs, R, X, Y) \ | ||
327 | do { \ | ||
328 | _FP_W_TYPE _x[4], _y[2], _z[4]; \ | ||
329 | _y[0] = Y##_f0; _y[1] = Y##_f1; \ | ||
330 | _x[0] = _x[3] = 0; \ | ||
331 | if (_FP_FRAC_GT_2(X, Y)) \ | ||
332 | { \ | ||
333 | R##_e++; \ | ||
334 | _x[1] = (X##_f0 << (_FP_WFRACBITS-1 - _FP_W_TYPE_SIZE) | \ | ||
335 | X##_f1 >> (_FP_W_TYPE_SIZE - \ | ||
336 | (_FP_WFRACBITS-1 - _FP_W_TYPE_SIZE))); \ | ||
337 | _x[2] = X##_f1 << (_FP_WFRACBITS-1 - _FP_W_TYPE_SIZE); \ | ||
338 | } \ | ||
339 | else \ | ||
340 | { \ | ||
341 | _x[1] = (X##_f0 << (_FP_WFRACBITS - _FP_W_TYPE_SIZE) | \ | ||
342 | X##_f1 >> (_FP_W_TYPE_SIZE - \ | ||
343 | (_FP_WFRACBITS - _FP_W_TYPE_SIZE))); \ | ||
344 | _x[2] = X##_f1 << (_FP_WFRACBITS - _FP_W_TYPE_SIZE); \ | ||
345 | } \ | ||
346 | \ | ||
347 | (void) mpn_divrem (_z, 0, _x, 4, _y, 2); \ | ||
348 | R##_f1 = _z[1]; \ | ||
349 | R##_f0 = _z[0] | ((_x[0] | _x[1]) != 0); \ | ||
350 | } while (0) | ||
351 | |||
352 | |||
353 | /* | ||
354 | * Square root algorithms: | ||
355 | * We have just one right now, maybe Newton approximation | ||
356 | * should be added for those machines where division is fast. | ||
357 | */ | ||
358 | |||
359 | #define _FP_SQRT_MEAT_2(R, S, T, X, q) \ | ||
360 | do { \ | ||
361 | while (q) \ | ||
362 | { \ | ||
363 | T##_f1 = S##_f1 + q; \ | ||
364 | if (T##_f1 <= X##_f1) \ | ||
365 | { \ | ||
366 | S##_f1 = T##_f1 + q; \ | ||
367 | X##_f1 -= T##_f1; \ | ||
368 | R##_f1 += q; \ | ||
369 | } \ | ||
370 | _FP_FRAC_SLL_2(X, 1); \ | ||
371 | q >>= 1; \ | ||
372 | } \ | ||
373 | q = (_FP_W_TYPE)1 << (_FP_W_TYPE_SIZE - 1); \ | ||
374 | while (q) \ | ||
375 | { \ | ||
376 | T##_f0 = S##_f0 + q; \ | ||
377 | T##_f1 = S##_f1; \ | ||
378 | if (T##_f1 < X##_f1 || \ | ||
379 | (T##_f1 == X##_f1 && T##_f0 < X##_f0)) \ | ||
380 | { \ | ||
381 | S##_f0 = T##_f0 + q; \ | ||
382 | if (((_FP_WS_TYPE)T##_f0) < 0 && \ | ||
383 | ((_FP_WS_TYPE)S##_f0) >= 0) \ | ||
384 | S##_f1++; \ | ||
385 | _FP_FRAC_SUB_2(X, X, T); \ | ||
386 | R##_f0 += q; \ | ||
387 | } \ | ||
388 | _FP_FRAC_SLL_2(X, 1); \ | ||
389 | q >>= 1; \ | ||
390 | } \ | ||
391 | } while (0) | ||
392 | |||
393 | |||
394 | /* | ||
395 | * Assembly/disassembly for converting to/from integral types. | ||
396 | * No shifting or overflow handled here. | ||
397 | */ | ||
398 | |||
399 | #define _FP_FRAC_ASSEMBLE_2(r, X, rsize) \ | ||
400 | do { \ | ||
401 | if (rsize <= _FP_W_TYPE_SIZE) \ | ||
402 | r = X##_f0; \ | ||
403 | else \ | ||
404 | { \ | ||
405 | r = X##_f1; \ | ||
406 | r <<= _FP_W_TYPE_SIZE; \ | ||
407 | r += X##_f0; \ | ||
408 | } \ | ||
409 | } while (0) | ||
410 | |||
411 | #define _FP_FRAC_DISASSEMBLE_2(X, r, rsize) \ | ||
412 | do { \ | ||
413 | X##_f0 = r; \ | ||
414 | X##_f1 = (rsize <= _FP_W_TYPE_SIZE ? 0 : r >> _FP_W_TYPE_SIZE); \ | ||
415 | } while (0) | ||
416 | |||
417 | /* | ||
418 | * Convert FP values between word sizes | ||
419 | */ | ||
420 | |||
421 | #define _FP_FRAC_CONV_1_2(dfs, sfs, D, S) \ | ||
422 | do { \ | ||
423 | _FP_FRAC_SRS_2(S, (_FP_WFRACBITS_##sfs - _FP_WFRACBITS_##dfs), \ | ||
424 | _FP_WFRACBITS_##sfs); \ | ||
425 | D##_f = S##_f0; \ | ||
426 | } while (0) | ||
427 | |||
428 | #define _FP_FRAC_CONV_2_1(dfs, sfs, D, S) \ | ||
429 | do { \ | ||
430 | D##_f0 = S##_f; \ | ||
431 | D##_f1 = 0; \ | ||
432 | _FP_FRAC_SLL_2(D, (_FP_WFRACBITS_##dfs - _FP_WFRACBITS_##sfs)); \ | ||
433 | } while (0) | ||
434 | |||
diff --git a/arch/powerpc/math-emu/op-4.h b/arch/powerpc/math-emu/op-4.h deleted file mode 100644 index c9ae626070da..000000000000 --- a/arch/powerpc/math-emu/op-4.h +++ /dev/null | |||
@@ -1,317 +0,0 @@ | |||
1 | /* | ||
2 | * Basic four-word fraction declaration and manipulation. | ||
3 | * | ||
4 | * When adding quadword support for 32 bit machines, we need | ||
5 | * to be a little careful as double multiply uses some of these | ||
6 | * macros: (in op-2.h) | ||
7 | * _FP_MUL_MEAT_2_wide() uses _FP_FRAC_DECL_4, _FP_FRAC_WORD_4, | ||
8 | * _FP_FRAC_ADD_4, _FP_FRAC_SRS_4 | ||
9 | * _FP_MUL_MEAT_2_gmp() uses _FP_FRAC_SRS_4 (and should use | ||
10 | * _FP_FRAC_DECL_4: it appears to be broken and is not used | ||
11 | * anywhere anyway. ) | ||
12 | * | ||
13 | * I've now fixed all the macros that were here from the sparc64 code. | ||
14 | * [*none* of the shift macros were correct!] -- PMM 02/1998 | ||
15 | * | ||
16 | * The only quadword stuff that remains to be coded is: | ||
17 | * 1) the conversion to/from ints, which requires | ||
18 | * that we check (in op-common.h) that the following do the right thing | ||
19 | * for quadwords: _FP_TO_INT(Q,4,r,X,rsz,rsg), _FP_FROM_INT(Q,4,X,r,rs,rt) | ||
20 | * 2) multiply, divide and sqrt, which require: | ||
21 | * _FP_MUL_MEAT_4_*(R,X,Y), _FP_DIV_MEAT_4_*(R,X,Y), _FP_SQRT_MEAT_4(R,S,T,X,q), | ||
22 | * This also needs _FP_MUL_MEAT_Q and _FP_DIV_MEAT_Q to be defined to | ||
23 | * some suitable _FP_MUL_MEAT_4_* macros in sfp-machine.h. | ||
24 | * [we're free to choose whatever FP_MUL_MEAT_4_* macros we need for | ||
25 | * these; they are used nowhere else. ] | ||
26 | */ | ||
27 | |||
28 | #define _FP_FRAC_DECL_4(X) _FP_W_TYPE X##_f[4] | ||
29 | #define _FP_FRAC_COPY_4(D,S) \ | ||
30 | (D##_f[0] = S##_f[0], D##_f[1] = S##_f[1], \ | ||
31 | D##_f[2] = S##_f[2], D##_f[3] = S##_f[3]) | ||
32 | /* The _FP_FRAC_SET_n(X,I) macro is intended for use with another | ||
33 | * macro such as _FP_ZEROFRAC_n which returns n comma separated values. | ||
34 | * The result is that we get an expansion of __FP_FRAC_SET_n(X,I0,I1,I2,I3) | ||
35 | * which just assigns the In values to the array X##_f[]. | ||
36 | * This is why the number of parameters doesn't appear to match | ||
37 | * at first glance... -- PMM | ||
38 | */ | ||
39 | #define _FP_FRAC_SET_4(X,I) __FP_FRAC_SET_4(X, I) | ||
40 | #define _FP_FRAC_HIGH_4(X) (X##_f[3]) | ||
41 | #define _FP_FRAC_LOW_4(X) (X##_f[0]) | ||
42 | #define _FP_FRAC_WORD_4(X,w) (X##_f[w]) | ||
43 | |||
44 | #define _FP_FRAC_SLL_4(X,N) \ | ||
45 | do { \ | ||
46 | _FP_I_TYPE _up, _down, _skip, _i; \ | ||
47 | _skip = (N) / _FP_W_TYPE_SIZE; \ | ||
48 | _up = (N) % _FP_W_TYPE_SIZE; \ | ||
49 | _down = _FP_W_TYPE_SIZE - _up; \ | ||
50 | for (_i = 3; _i > _skip; --_i) \ | ||
51 | X##_f[_i] = X##_f[_i-_skip] << _up | X##_f[_i-_skip-1] >> _down; \ | ||
52 | /* bugfixed: was X##_f[_i] <<= _up; -- PMM 02/1998 */ \ | ||
53 | X##_f[_i] = X##_f[0] << _up; \ | ||
54 | for (--_i; _i >= 0; --_i) \ | ||
55 | X##_f[_i] = 0; \ | ||
56 | } while (0) | ||
57 | |||
58 | /* This one was broken too */ | ||
59 | #define _FP_FRAC_SRL_4(X,N) \ | ||
60 | do { \ | ||
61 | _FP_I_TYPE _up, _down, _skip, _i; \ | ||
62 | _skip = (N) / _FP_W_TYPE_SIZE; \ | ||
63 | _down = (N) % _FP_W_TYPE_SIZE; \ | ||
64 | _up = _FP_W_TYPE_SIZE - _down; \ | ||
65 | for (_i = 0; _i < 3-_skip; ++_i) \ | ||
66 | X##_f[_i] = X##_f[_i+_skip] >> _down | X##_f[_i+_skip+1] << _up; \ | ||
67 | X##_f[_i] = X##_f[3] >> _down; \ | ||
68 | for (++_i; _i < 4; ++_i) \ | ||
69 | X##_f[_i] = 0; \ | ||
70 | } while (0) | ||
71 | |||
72 | |||
73 | /* Right shift with sticky-lsb. | ||
74 | * What this actually means is that we do a standard right-shift, | ||
75 | * but that if any of the bits that fall off the right hand side | ||
76 | * were one then we always set the LSbit. | ||
77 | */ | ||
78 | #define _FP_FRAC_SRS_4(X,N,size) \ | ||
79 | do { \ | ||
80 | _FP_I_TYPE _up, _down, _skip, _i; \ | ||
81 | _FP_W_TYPE _s; \ | ||
82 | _skip = (N) / _FP_W_TYPE_SIZE; \ | ||
83 | _down = (N) % _FP_W_TYPE_SIZE; \ | ||
84 | _up = _FP_W_TYPE_SIZE - _down; \ | ||
85 | for (_s = _i = 0; _i < _skip; ++_i) \ | ||
86 | _s |= X##_f[_i]; \ | ||
87 | _s |= X##_f[_i] << _up; \ | ||
88 | /* s is now != 0 if we want to set the LSbit */ \ | ||
89 | for (_i = 0; _i < 3-_skip; ++_i) \ | ||
90 | X##_f[_i] = X##_f[_i+_skip] >> _down | X##_f[_i+_skip+1] << _up; \ | ||
91 | X##_f[_i] = X##_f[3] >> _down; \ | ||
92 | for (++_i; _i < 4; ++_i) \ | ||
93 | X##_f[_i] = 0; \ | ||
94 | /* don't fix the LSB until the very end when we're sure f[0] is stable */ \ | ||
95 | X##_f[0] |= (_s != 0); \ | ||
96 | } while (0) | ||
97 | |||
98 | #define _FP_FRAC_ADD_4(R,X,Y) \ | ||
99 | __FP_FRAC_ADD_4(R##_f[3], R##_f[2], R##_f[1], R##_f[0], \ | ||
100 | X##_f[3], X##_f[2], X##_f[1], X##_f[0], \ | ||
101 | Y##_f[3], Y##_f[2], Y##_f[1], Y##_f[0]) | ||
102 | |||
103 | #define _FP_FRAC_SUB_4(R,X,Y) \ | ||
104 | __FP_FRAC_SUB_4(R##_f[3], R##_f[2], R##_f[1], R##_f[0], \ | ||
105 | X##_f[3], X##_f[2], X##_f[1], X##_f[0], \ | ||
106 | Y##_f[3], Y##_f[2], Y##_f[1], Y##_f[0]) | ||
107 | |||
108 | #define _FP_FRAC_ADDI_4(X,I) \ | ||
109 | __FP_FRAC_ADDI_4(X##_f[3], X##_f[2], X##_f[1], X##_f[0], I) | ||
110 | |||
111 | #define _FP_ZEROFRAC_4 0,0,0,0 | ||
112 | #define _FP_MINFRAC_4 0,0,0,1 | ||
113 | |||
114 | #define _FP_FRAC_ZEROP_4(X) ((X##_f[0] | X##_f[1] | X##_f[2] | X##_f[3]) == 0) | ||
115 | #define _FP_FRAC_NEGP_4(X) ((_FP_WS_TYPE)X##_f[3] < 0) | ||
116 | #define _FP_FRAC_OVERP_4(fs,X) (X##_f[0] & _FP_OVERFLOW_##fs) | ||
117 | |||
118 | #define _FP_FRAC_EQ_4(X,Y) \ | ||
119 | (X##_f[0] == Y##_f[0] && X##_f[1] == Y##_f[1] \ | ||
120 | && X##_f[2] == Y##_f[2] && X##_f[3] == Y##_f[3]) | ||
121 | |||
122 | #define _FP_FRAC_GT_4(X,Y) \ | ||
123 | (X##_f[3] > Y##_f[3] || \ | ||
124 | (X##_f[3] == Y##_f[3] && (X##_f[2] > Y##_f[2] || \ | ||
125 | (X##_f[2] == Y##_f[2] && (X##_f[1] > Y##_f[1] || \ | ||
126 | (X##_f[1] == Y##_f[1] && X##_f[0] > Y##_f[0]) \ | ||
127 | )) \ | ||
128 | )) \ | ||
129 | ) | ||
130 | |||
131 | #define _FP_FRAC_GE_4(X,Y) \ | ||
132 | (X##_f[3] > Y##_f[3] || \ | ||
133 | (X##_f[3] == Y##_f[3] && (X##_f[2] > Y##_f[2] || \ | ||
134 | (X##_f[2] == Y##_f[2] && (X##_f[1] > Y##_f[1] || \ | ||
135 | (X##_f[1] == Y##_f[1] && X##_f[0] >= Y##_f[0]) \ | ||
136 | )) \ | ||
137 | )) \ | ||
138 | ) | ||
139 | |||
140 | |||
141 | #define _FP_FRAC_CLZ_4(R,X) \ | ||
142 | do { \ | ||
143 | if (X##_f[3]) \ | ||
144 | { \ | ||
145 | __FP_CLZ(R,X##_f[3]); \ | ||
146 | } \ | ||
147 | else if (X##_f[2]) \ | ||
148 | { \ | ||
149 | __FP_CLZ(R,X##_f[2]); \ | ||
150 | R += _FP_W_TYPE_SIZE; \ | ||
151 | } \ | ||
152 | else if (X##_f[1]) \ | ||
153 | { \ | ||
154 | __FP_CLZ(R,X##_f[2]); \ | ||
155 | R += _FP_W_TYPE_SIZE*2; \ | ||
156 | } \ | ||
157 | else \ | ||
158 | { \ | ||
159 | __FP_CLZ(R,X##_f[0]); \ | ||
160 | R += _FP_W_TYPE_SIZE*3; \ | ||
161 | } \ | ||
162 | } while(0) | ||
163 | |||
164 | |||
165 | #define _FP_UNPACK_RAW_4(fs, X, val) \ | ||
166 | do { \ | ||
167 | union _FP_UNION_##fs _flo; _flo.flt = (val); \ | ||
168 | X##_f[0] = _flo.bits.frac0; \ | ||
169 | X##_f[1] = _flo.bits.frac1; \ | ||
170 | X##_f[2] = _flo.bits.frac2; \ | ||
171 | X##_f[3] = _flo.bits.frac3; \ | ||
172 | X##_e = _flo.bits.exp; \ | ||
173 | X##_s = _flo.bits.sign; \ | ||
174 | } while (0) | ||
175 | |||
176 | #define _FP_PACK_RAW_4(fs, val, X) \ | ||
177 | do { \ | ||
178 | union _FP_UNION_##fs _flo; \ | ||
179 | _flo.bits.frac0 = X##_f[0]; \ | ||
180 | _flo.bits.frac1 = X##_f[1]; \ | ||
181 | _flo.bits.frac2 = X##_f[2]; \ | ||
182 | _flo.bits.frac3 = X##_f[3]; \ | ||
183 | _flo.bits.exp = X##_e; \ | ||
184 | _flo.bits.sign = X##_s; \ | ||
185 | (val) = _flo.flt; \ | ||
186 | } while (0) | ||
187 | |||
188 | |||
189 | /* | ||
190 | * Internals | ||
191 | */ | ||
192 | |||
193 | #define __FP_FRAC_SET_4(X,I3,I2,I1,I0) \ | ||
194 | (X##_f[3] = I3, X##_f[2] = I2, X##_f[1] = I1, X##_f[0] = I0) | ||
195 | |||
196 | #ifndef __FP_FRAC_ADD_4 | ||
197 | #define __FP_FRAC_ADD_4(r3,r2,r1,r0,x3,x2,x1,x0,y3,y2,y1,y0) \ | ||
198 | do { \ | ||
199 | int _c1, _c2, _c3; \ | ||
200 | r0 = x0 + y0; \ | ||
201 | _c1 = r0 < x0; \ | ||
202 | r1 = x1 + y1; \ | ||
203 | _c2 = r1 < x1; \ | ||
204 | r1 += _c1; \ | ||
205 | _c2 |= r1 < _c1; \ | ||
206 | r2 = x2 + y2; \ | ||
207 | _c3 = r2 < x2; \ | ||
208 | r2 += _c2; \ | ||
209 | _c3 |= r2 < _c2; \ | ||
210 | r3 = x3 + y3 + _c3; \ | ||
211 | } while (0) | ||
212 | #endif | ||
213 | |||
214 | #ifndef __FP_FRAC_SUB_4 | ||
215 | #define __FP_FRAC_SUB_4(r3,r2,r1,r0,x3,x2,x1,x0,y3,y2,y1,y0) \ | ||
216 | do { \ | ||
217 | int _c1, _c2, _c3; \ | ||
218 | r0 = x0 - y0; \ | ||
219 | _c1 = r0 > x0; \ | ||
220 | r1 = x1 - y1; \ | ||
221 | _c2 = r1 > x1; \ | ||
222 | r1 -= _c1; \ | ||
223 | _c2 |= r1 > _c1; \ | ||
224 | r2 = x2 - y2; \ | ||
225 | _c3 = r2 > x2; \ | ||
226 | r2 -= _c2; \ | ||
227 | _c3 |= r2 > _c2; \ | ||
228 | r3 = x3 - y3 - _c3; \ | ||
229 | } while (0) | ||
230 | #endif | ||
231 | |||
232 | #ifndef __FP_FRAC_ADDI_4 | ||
233 | /* I always wanted to be a lisp programmer :-> */ | ||
234 | #define __FP_FRAC_ADDI_4(x3,x2,x1,x0,i) \ | ||
235 | (x3 += ((x2 += ((x1 += ((x0 += i) < x0)) < x1) < x2))) | ||
236 | #endif | ||
237 | |||
238 | /* Convert FP values between word sizes. This appears to be more | ||
239 | * complicated than I'd have expected it to be, so these might be | ||
240 | * wrong... These macros are in any case somewhat bogus because they | ||
241 | * use information about what various FRAC_n variables look like | ||
242 | * internally [eg, that 2 word vars are X_f0 and x_f1]. But so do | ||
243 | * the ones in op-2.h and op-1.h. | ||
244 | */ | ||
245 | #define _FP_FRAC_CONV_1_4(dfs, sfs, D, S) \ | ||
246 | do { \ | ||
247 | _FP_FRAC_SRS_4(S, (_FP_WFRACBITS_##sfs - _FP_WFRACBITS_##dfs), \ | ||
248 | _FP_WFRACBITS_##sfs); \ | ||
249 | D##_f = S##_f[0]; \ | ||
250 | } while (0) | ||
251 | |||
252 | #define _FP_FRAC_CONV_2_4(dfs, sfs, D, S) \ | ||
253 | do { \ | ||
254 | _FP_FRAC_SRS_4(S, (_FP_WFRACBITS_##sfs - _FP_WFRACBITS_##dfs), \ | ||
255 | _FP_WFRACBITS_##sfs); \ | ||
256 | D##_f0 = S##_f[0]; \ | ||
257 | D##_f1 = S##_f[1]; \ | ||
258 | } while (0) | ||
259 | |||
260 | /* Assembly/disassembly for converting to/from integral types. | ||
261 | * No shifting or overflow handled here. | ||
262 | */ | ||
263 | /* Put the FP value X into r, which is an integer of size rsize. */ | ||
264 | #define _FP_FRAC_ASSEMBLE_4(r, X, rsize) \ | ||
265 | do { \ | ||
266 | if (rsize <= _FP_W_TYPE_SIZE) \ | ||
267 | r = X##_f[0]; \ | ||
268 | else if (rsize <= 2*_FP_W_TYPE_SIZE) \ | ||
269 | { \ | ||
270 | r = X##_f[1]; \ | ||
271 | r <<= _FP_W_TYPE_SIZE; \ | ||
272 | r += X##_f[0]; \ | ||
273 | } \ | ||
274 | else \ | ||
275 | { \ | ||
276 | /* I'm feeling lazy so we deal with int == 3words (implausible)*/ \ | ||
277 | /* and int == 4words as a single case. */ \ | ||
278 | r = X##_f[3]; \ | ||
279 | r <<= _FP_W_TYPE_SIZE; \ | ||
280 | r += X##_f[2]; \ | ||
281 | r <<= _FP_W_TYPE_SIZE; \ | ||
282 | r += X##_f[1]; \ | ||
283 | r <<= _FP_W_TYPE_SIZE; \ | ||
284 | r += X##_f[0]; \ | ||
285 | } \ | ||
286 | } while (0) | ||
287 | |||
288 | /* "No disassemble Number Five!" */ | ||
289 | /* move an integer of size rsize into X's fractional part. We rely on | ||
290 | * the _f[] array consisting of words of size _FP_W_TYPE_SIZE to avoid | ||
291 | * having to mask the values we store into it. | ||
292 | */ | ||
293 | #define _FP_FRAC_DISASSEMBLE_4(X, r, rsize) \ | ||
294 | do { \ | ||
295 | X##_f[0] = r; \ | ||
296 | X##_f[1] = (rsize <= _FP_W_TYPE_SIZE ? 0 : r >> _FP_W_TYPE_SIZE); \ | ||
297 | X##_f[2] = (rsize <= 2*_FP_W_TYPE_SIZE ? 0 : r >> 2*_FP_W_TYPE_SIZE); \ | ||
298 | X##_f[3] = (rsize <= 3*_FP_W_TYPE_SIZE ? 0 : r >> 3*_FP_W_TYPE_SIZE); \ | ||
299 | } while (0) | ||
300 | |||
301 | #define _FP_FRAC_CONV_4_1(dfs, sfs, D, S) \ | ||
302 | do { \ | ||
303 | D##_f[0] = S##_f; \ | ||
304 | D##_f[1] = D##_f[2] = D##_f[3] = 0; \ | ||
305 | _FP_FRAC_SLL_4(D, (_FP_WFRACBITS_##dfs - _FP_WFRACBITS_##sfs)); \ | ||
306 | } while (0) | ||
307 | |||
308 | #define _FP_FRAC_CONV_4_2(dfs, sfs, D, S) \ | ||
309 | do { \ | ||
310 | D##_f[0] = S##_f0; \ | ||
311 | D##_f[1] = S##_f1; \ | ||
312 | D##_f[2] = D##_f[3] = 0; \ | ||
313 | _FP_FRAC_SLL_4(D, (_FP_WFRACBITS_##dfs - _FP_WFRACBITS_##sfs)); \ | ||
314 | } while (0) | ||
315 | |||
316 | /* FIXME! This has to be written */ | ||
317 | #define _FP_SQRT_MEAT_4(R, S, T, X, q) | ||
diff --git a/arch/powerpc/math-emu/op-common.h b/arch/powerpc/math-emu/op-common.h deleted file mode 100644 index afb82b6498ce..000000000000 --- a/arch/powerpc/math-emu/op-common.h +++ /dev/null | |||
@@ -1,688 +0,0 @@ | |||
1 | #define _FP_DECL(wc, X) \ | ||
2 | _FP_I_TYPE X##_c, X##_s, X##_e; \ | ||
3 | _FP_FRAC_DECL_##wc(X) | ||
4 | |||
5 | /* | ||
6 | * Finish truely unpacking a native fp value by classifying the kind | ||
7 | * of fp value and normalizing both the exponent and the fraction. | ||
8 | */ | ||
9 | |||
10 | #define _FP_UNPACK_CANONICAL(fs, wc, X) \ | ||
11 | do { \ | ||
12 | switch (X##_e) \ | ||
13 | { \ | ||
14 | default: \ | ||
15 | _FP_FRAC_HIGH_##wc(X) |= _FP_IMPLBIT_##fs; \ | ||
16 | _FP_FRAC_SLL_##wc(X, _FP_WORKBITS); \ | ||
17 | X##_e -= _FP_EXPBIAS_##fs; \ | ||
18 | X##_c = FP_CLS_NORMAL; \ | ||
19 | break; \ | ||
20 | \ | ||
21 | case 0: \ | ||
22 | if (_FP_FRAC_ZEROP_##wc(X)) \ | ||
23 | X##_c = FP_CLS_ZERO; \ | ||
24 | else \ | ||
25 | { \ | ||
26 | /* a denormalized number */ \ | ||
27 | _FP_I_TYPE _shift; \ | ||
28 | _FP_FRAC_CLZ_##wc(_shift, X); \ | ||
29 | _shift -= _FP_FRACXBITS_##fs; \ | ||
30 | _FP_FRAC_SLL_##wc(X, (_shift+_FP_WORKBITS)); \ | ||
31 | X##_e -= _FP_EXPBIAS_##fs - 1 + _shift; \ | ||
32 | X##_c = FP_CLS_NORMAL; \ | ||
33 | } \ | ||
34 | break; \ | ||
35 | \ | ||
36 | case _FP_EXPMAX_##fs: \ | ||
37 | if (_FP_FRAC_ZEROP_##wc(X)) \ | ||
38 | X##_c = FP_CLS_INF; \ | ||
39 | else \ | ||
40 | /* we don't differentiate between signaling and quiet nans */ \ | ||
41 | X##_c = FP_CLS_NAN; \ | ||
42 | break; \ | ||
43 | } \ | ||
44 | } while (0) | ||
45 | |||
46 | |||
47 | /* | ||
48 | * Before packing the bits back into the native fp result, take care | ||
49 | * of such mundane things as rounding and overflow. Also, for some | ||
50 | * kinds of fp values, the original parts may not have been fully | ||
51 | * extracted -- but that is ok, we can regenerate them now. | ||
52 | */ | ||
53 | |||
54 | #define _FP_PACK_CANONICAL(fs, wc, X) \ | ||
55 | ({int __ret = 0; \ | ||
56 | switch (X##_c) \ | ||
57 | { \ | ||
58 | case FP_CLS_NORMAL: \ | ||
59 | X##_e += _FP_EXPBIAS_##fs; \ | ||
60 | if (X##_e > 0) \ | ||
61 | { \ | ||
62 | __ret |= _FP_ROUND(wc, X); \ | ||
63 | if (_FP_FRAC_OVERP_##wc(fs, X)) \ | ||
64 | { \ | ||
65 | _FP_FRAC_SRL_##wc(X, (_FP_WORKBITS+1)); \ | ||
66 | X##_e++; \ | ||
67 | } \ | ||
68 | else \ | ||
69 | _FP_FRAC_SRL_##wc(X, _FP_WORKBITS); \ | ||
70 | if (X##_e >= _FP_EXPMAX_##fs) \ | ||
71 | { \ | ||
72 | /* overflow to infinity */ \ | ||
73 | X##_e = _FP_EXPMAX_##fs; \ | ||
74 | _FP_FRAC_SET_##wc(X, _FP_ZEROFRAC_##wc); \ | ||
75 | __ret |= EFLAG_OVERFLOW; \ | ||
76 | } \ | ||
77 | } \ | ||
78 | else \ | ||
79 | { \ | ||
80 | /* we've got a denormalized number */ \ | ||
81 | X##_e = -X##_e + 1; \ | ||
82 | if (X##_e <= _FP_WFRACBITS_##fs) \ | ||
83 | { \ | ||
84 | _FP_FRAC_SRS_##wc(X, X##_e, _FP_WFRACBITS_##fs); \ | ||
85 | _FP_FRAC_SLL_##wc(X, 1); \ | ||
86 | if (_FP_FRAC_OVERP_##wc(fs, X)) \ | ||
87 | { \ | ||
88 | X##_e = 1; \ | ||
89 | _FP_FRAC_SET_##wc(X, _FP_ZEROFRAC_##wc); \ | ||
90 | } \ | ||
91 | else \ | ||
92 | { \ | ||
93 | X##_e = 0; \ | ||
94 | _FP_FRAC_SRL_##wc(X, _FP_WORKBITS+1); \ | ||
95 | __ret |= EFLAG_UNDERFLOW; \ | ||
96 | } \ | ||
97 | } \ | ||
98 | else \ | ||
99 | { \ | ||
100 | /* underflow to zero */ \ | ||
101 | X##_e = 0; \ | ||
102 | _FP_FRAC_SET_##wc(X, _FP_ZEROFRAC_##wc); \ | ||
103 | __ret |= EFLAG_UNDERFLOW; \ | ||
104 | } \ | ||
105 | } \ | ||
106 | break; \ | ||
107 | \ | ||
108 | case FP_CLS_ZERO: \ | ||
109 | X##_e = 0; \ | ||
110 | _FP_FRAC_SET_##wc(X, _FP_ZEROFRAC_##wc); \ | ||
111 | break; \ | ||
112 | \ | ||
113 | case FP_CLS_INF: \ | ||
114 | X##_e = _FP_EXPMAX_##fs; \ | ||
115 | _FP_FRAC_SET_##wc(X, _FP_ZEROFRAC_##wc); \ | ||
116 | break; \ | ||
117 | \ | ||
118 | case FP_CLS_NAN: \ | ||
119 | X##_e = _FP_EXPMAX_##fs; \ | ||
120 | if (!_FP_KEEPNANFRACP) \ | ||
121 | { \ | ||
122 | _FP_FRAC_SET_##wc(X, _FP_NANFRAC_##fs); \ | ||
123 | X##_s = 0; \ | ||
124 | } \ | ||
125 | else \ | ||
126 | _FP_FRAC_HIGH_##wc(X) |= _FP_QNANBIT_##fs; \ | ||
127 | break; \ | ||
128 | } \ | ||
129 | __ret; \ | ||
130 | }) | ||
131 | |||
132 | |||
133 | /* | ||
134 | * Main addition routine. The input values should be cooked. | ||
135 | */ | ||
136 | |||
137 | #define _FP_ADD(fs, wc, R, X, Y) \ | ||
138 | do { \ | ||
139 | switch (_FP_CLS_COMBINE(X##_c, Y##_c)) \ | ||
140 | { \ | ||
141 | case _FP_CLS_COMBINE(FP_CLS_NORMAL,FP_CLS_NORMAL): \ | ||
142 | { \ | ||
143 | /* shift the smaller number so that its exponent matches the larger */ \ | ||
144 | _FP_I_TYPE diff = X##_e - Y##_e; \ | ||
145 | \ | ||
146 | if (diff < 0) \ | ||
147 | { \ | ||
148 | diff = -diff; \ | ||
149 | if (diff <= _FP_WFRACBITS_##fs) \ | ||
150 | _FP_FRAC_SRS_##wc(X, diff, _FP_WFRACBITS_##fs); \ | ||
151 | else if (!_FP_FRAC_ZEROP_##wc(X)) \ | ||
152 | _FP_FRAC_SET_##wc(X, _FP_MINFRAC_##wc); \ | ||
153 | else \ | ||
154 | _FP_FRAC_SET_##wc(X, _FP_ZEROFRAC_##wc); \ | ||
155 | R##_e = Y##_e; \ | ||
156 | } \ | ||
157 | else \ | ||
158 | { \ | ||
159 | if (diff > 0) \ | ||
160 | { \ | ||
161 | if (diff <= _FP_WFRACBITS_##fs) \ | ||
162 | _FP_FRAC_SRS_##wc(Y, diff, _FP_WFRACBITS_##fs); \ | ||
163 | else if (!_FP_FRAC_ZEROP_##wc(Y)) \ | ||
164 | _FP_FRAC_SET_##wc(Y, _FP_MINFRAC_##wc); \ | ||
165 | else \ | ||
166 | _FP_FRAC_SET_##wc(Y, _FP_ZEROFRAC_##wc); \ | ||
167 | } \ | ||
168 | R##_e = X##_e; \ | ||
169 | } \ | ||
170 | \ | ||
171 | R##_c = FP_CLS_NORMAL; \ | ||
172 | \ | ||
173 | if (X##_s == Y##_s) \ | ||
174 | { \ | ||
175 | R##_s = X##_s; \ | ||
176 | _FP_FRAC_ADD_##wc(R, X, Y); \ | ||
177 | if (_FP_FRAC_OVERP_##wc(fs, R)) \ | ||
178 | { \ | ||
179 | _FP_FRAC_SRS_##wc(R, 1, _FP_WFRACBITS_##fs); \ | ||
180 | R##_e++; \ | ||
181 | } \ | ||
182 | } \ | ||
183 | else \ | ||
184 | { \ | ||
185 | R##_s = X##_s; \ | ||
186 | _FP_FRAC_SUB_##wc(R, X, Y); \ | ||
187 | if (_FP_FRAC_ZEROP_##wc(R)) \ | ||
188 | { \ | ||
189 | /* return an exact zero */ \ | ||
190 | if (FP_ROUNDMODE == FP_RND_MINF) \ | ||
191 | R##_s |= Y##_s; \ | ||
192 | else \ | ||
193 | R##_s &= Y##_s; \ | ||
194 | R##_c = FP_CLS_ZERO; \ | ||
195 | } \ | ||
196 | else \ | ||
197 | { \ | ||
198 | if (_FP_FRAC_NEGP_##wc(R)) \ | ||
199 | { \ | ||
200 | _FP_FRAC_SUB_##wc(R, Y, X); \ | ||
201 | R##_s = Y##_s; \ | ||
202 | } \ | ||
203 | \ | ||
204 | /* renormalize after subtraction */ \ | ||
205 | _FP_FRAC_CLZ_##wc(diff, R); \ | ||
206 | diff -= _FP_WFRACXBITS_##fs; \ | ||
207 | if (diff) \ | ||
208 | { \ | ||
209 | R##_e -= diff; \ | ||
210 | _FP_FRAC_SLL_##wc(R, diff); \ | ||
211 | } \ | ||
212 | } \ | ||
213 | } \ | ||
214 | break; \ | ||
215 | } \ | ||
216 | \ | ||
217 | case _FP_CLS_COMBINE(FP_CLS_NAN,FP_CLS_NAN): \ | ||
218 | _FP_CHOOSENAN(fs, wc, R, X, Y); \ | ||
219 | break; \ | ||
220 | \ | ||
221 | case _FP_CLS_COMBINE(FP_CLS_NORMAL,FP_CLS_ZERO): \ | ||
222 | R##_e = X##_e; \ | ||
223 | case _FP_CLS_COMBINE(FP_CLS_NAN,FP_CLS_NORMAL): \ | ||
224 | case _FP_CLS_COMBINE(FP_CLS_NAN,FP_CLS_INF): \ | ||
225 | case _FP_CLS_COMBINE(FP_CLS_NAN,FP_CLS_ZERO): \ | ||
226 | _FP_FRAC_COPY_##wc(R, X); \ | ||
227 | R##_s = X##_s; \ | ||
228 | R##_c = X##_c; \ | ||
229 | break; \ | ||
230 | \ | ||
231 | case _FP_CLS_COMBINE(FP_CLS_ZERO,FP_CLS_NORMAL): \ | ||
232 | R##_e = Y##_e; \ | ||
233 | case _FP_CLS_COMBINE(FP_CLS_NORMAL,FP_CLS_NAN): \ | ||
234 | case _FP_CLS_COMBINE(FP_CLS_INF,FP_CLS_NAN): \ | ||
235 | case _FP_CLS_COMBINE(FP_CLS_ZERO,FP_CLS_NAN): \ | ||
236 | _FP_FRAC_COPY_##wc(R, Y); \ | ||
237 | R##_s = Y##_s; \ | ||
238 | R##_c = Y##_c; \ | ||
239 | break; \ | ||
240 | \ | ||
241 | case _FP_CLS_COMBINE(FP_CLS_INF,FP_CLS_INF): \ | ||
242 | if (X##_s != Y##_s) \ | ||
243 | { \ | ||
244 | /* +INF + -INF => NAN */ \ | ||
245 | _FP_FRAC_SET_##wc(R, _FP_NANFRAC_##fs); \ | ||
246 | R##_s = X##_s ^ Y##_s; \ | ||
247 | R##_c = FP_CLS_NAN; \ | ||
248 | break; \ | ||
249 | } \ | ||
250 | /* FALLTHRU */ \ | ||
251 | \ | ||
252 | case _FP_CLS_COMBINE(FP_CLS_INF,FP_CLS_NORMAL): \ | ||
253 | case _FP_CLS_COMBINE(FP_CLS_INF,FP_CLS_ZERO): \ | ||
254 | R##_s = X##_s; \ | ||
255 | R##_c = FP_CLS_INF; \ | ||
256 | break; \ | ||
257 | \ | ||
258 | case _FP_CLS_COMBINE(FP_CLS_NORMAL,FP_CLS_INF): \ | ||
259 | case _FP_CLS_COMBINE(FP_CLS_ZERO,FP_CLS_INF): \ | ||
260 | R##_s = Y##_s; \ | ||
261 | R##_c = FP_CLS_INF; \ | ||
262 | break; \ | ||
263 | \ | ||
264 | case _FP_CLS_COMBINE(FP_CLS_ZERO,FP_CLS_ZERO): \ | ||
265 | /* make sure the sign is correct */ \ | ||
266 | if (FP_ROUNDMODE == FP_RND_MINF) \ | ||
267 | R##_s = X##_s | Y##_s; \ | ||
268 | else \ | ||
269 | R##_s = X##_s & Y##_s; \ | ||
270 | R##_c = FP_CLS_ZERO; \ | ||
271 | break; \ | ||
272 | \ | ||
273 | default: \ | ||
274 | abort(); \ | ||
275 | } \ | ||
276 | } while (0) | ||
277 | |||
278 | |||
279 | /* | ||
280 | * Main negation routine. FIXME -- when we care about setting exception | ||
281 | * bits reliably, this will not do. We should examine all of the fp classes. | ||
282 | */ | ||
283 | |||
284 | #define _FP_NEG(fs, wc, R, X) \ | ||
285 | do { \ | ||
286 | _FP_FRAC_COPY_##wc(R, X); \ | ||
287 | R##_c = X##_c; \ | ||
288 | R##_e = X##_e; \ | ||
289 | R##_s = 1 ^ X##_s; \ | ||
290 | } while (0) | ||
291 | |||
292 | |||
293 | /* | ||
294 | * Main multiplication routine. The input values should be cooked. | ||
295 | */ | ||
296 | |||
297 | #define _FP_MUL(fs, wc, R, X, Y) \ | ||
298 | do { \ | ||
299 | R##_s = X##_s ^ Y##_s; \ | ||
300 | switch (_FP_CLS_COMBINE(X##_c, Y##_c)) \ | ||
301 | { \ | ||
302 | case _FP_CLS_COMBINE(FP_CLS_NORMAL,FP_CLS_NORMAL): \ | ||
303 | R##_c = FP_CLS_NORMAL; \ | ||
304 | R##_e = X##_e + Y##_e + 1; \ | ||
305 | \ | ||
306 | _FP_MUL_MEAT_##fs(R,X,Y); \ | ||
307 | \ | ||
308 | if (_FP_FRAC_OVERP_##wc(fs, R)) \ | ||
309 | _FP_FRAC_SRS_##wc(R, 1, _FP_WFRACBITS_##fs); \ | ||
310 | else \ | ||
311 | R##_e--; \ | ||
312 | break; \ | ||
313 | \ | ||
314 | case _FP_CLS_COMBINE(FP_CLS_NAN,FP_CLS_NAN): \ | ||
315 | _FP_CHOOSENAN(fs, wc, R, X, Y); \ | ||
316 | break; \ | ||
317 | \ | ||
318 | case _FP_CLS_COMBINE(FP_CLS_NAN,FP_CLS_NORMAL): \ | ||
319 | case _FP_CLS_COMBINE(FP_CLS_NAN,FP_CLS_INF): \ | ||
320 | case _FP_CLS_COMBINE(FP_CLS_NAN,FP_CLS_ZERO): \ | ||
321 | R##_s = X##_s; \ | ||
322 | \ | ||
323 | case _FP_CLS_COMBINE(FP_CLS_INF,FP_CLS_INF): \ | ||
324 | case _FP_CLS_COMBINE(FP_CLS_INF,FP_CLS_NORMAL): \ | ||
325 | case _FP_CLS_COMBINE(FP_CLS_ZERO,FP_CLS_NORMAL): \ | ||
326 | case _FP_CLS_COMBINE(FP_CLS_ZERO,FP_CLS_ZERO): \ | ||
327 | _FP_FRAC_COPY_##wc(R, X); \ | ||
328 | R##_c = X##_c; \ | ||
329 | break; \ | ||
330 | \ | ||
331 | case _FP_CLS_COMBINE(FP_CLS_NORMAL,FP_CLS_NAN): \ | ||
332 | case _FP_CLS_COMBINE(FP_CLS_INF,FP_CLS_NAN): \ | ||
333 | case _FP_CLS_COMBINE(FP_CLS_ZERO,FP_CLS_NAN): \ | ||
334 | R##_s = Y##_s; \ | ||
335 | \ | ||
336 | case _FP_CLS_COMBINE(FP_CLS_NORMAL,FP_CLS_INF): \ | ||
337 | case _FP_CLS_COMBINE(FP_CLS_NORMAL,FP_CLS_ZERO): \ | ||
338 | _FP_FRAC_COPY_##wc(R, Y); \ | ||
339 | R##_c = Y##_c; \ | ||
340 | break; \ | ||
341 | \ | ||
342 | case _FP_CLS_COMBINE(FP_CLS_INF,FP_CLS_ZERO): \ | ||
343 | case _FP_CLS_COMBINE(FP_CLS_ZERO,FP_CLS_INF): \ | ||
344 | R##_c = FP_CLS_NAN; \ | ||
345 | _FP_FRAC_SET_##wc(R, _FP_NANFRAC_##fs); \ | ||
346 | break; \ | ||
347 | \ | ||
348 | default: \ | ||
349 | abort(); \ | ||
350 | } \ | ||
351 | } while (0) | ||
352 | |||
353 | |||
354 | /* | ||
355 | * Main division routine. The input values should be cooked. | ||
356 | */ | ||
357 | |||
358 | #define _FP_DIV(fs, wc, R, X, Y) \ | ||
359 | do { \ | ||
360 | R##_s = X##_s ^ Y##_s; \ | ||
361 | switch (_FP_CLS_COMBINE(X##_c, Y##_c)) \ | ||
362 | { \ | ||
363 | case _FP_CLS_COMBINE(FP_CLS_NORMAL,FP_CLS_NORMAL): \ | ||
364 | R##_c = FP_CLS_NORMAL; \ | ||
365 | R##_e = X##_e - Y##_e; \ | ||
366 | \ | ||
367 | _FP_DIV_MEAT_##fs(R,X,Y); \ | ||
368 | break; \ | ||
369 | \ | ||
370 | case _FP_CLS_COMBINE(FP_CLS_NAN,FP_CLS_NAN): \ | ||
371 | _FP_CHOOSENAN(fs, wc, R, X, Y); \ | ||
372 | break; \ | ||
373 | \ | ||
374 | case _FP_CLS_COMBINE(FP_CLS_NAN,FP_CLS_NORMAL): \ | ||
375 | case _FP_CLS_COMBINE(FP_CLS_NAN,FP_CLS_INF): \ | ||
376 | case _FP_CLS_COMBINE(FP_CLS_NAN,FP_CLS_ZERO): \ | ||
377 | R##_s = X##_s; \ | ||
378 | _FP_FRAC_COPY_##wc(R, X); \ | ||
379 | R##_c = X##_c; \ | ||
380 | break; \ | ||
381 | \ | ||
382 | case _FP_CLS_COMBINE(FP_CLS_NORMAL,FP_CLS_NAN): \ | ||
383 | case _FP_CLS_COMBINE(FP_CLS_INF,FP_CLS_NAN): \ | ||
384 | case _FP_CLS_COMBINE(FP_CLS_ZERO,FP_CLS_NAN): \ | ||
385 | R##_s = Y##_s; \ | ||
386 | _FP_FRAC_COPY_##wc(R, Y); \ | ||
387 | R##_c = Y##_c; \ | ||
388 | break; \ | ||
389 | \ | ||
390 | case _FP_CLS_COMBINE(FP_CLS_NORMAL,FP_CLS_INF): \ | ||
391 | case _FP_CLS_COMBINE(FP_CLS_ZERO,FP_CLS_INF): \ | ||
392 | case _FP_CLS_COMBINE(FP_CLS_ZERO,FP_CLS_NORMAL): \ | ||
393 | R##_c = FP_CLS_ZERO; \ | ||
394 | break; \ | ||
395 | \ | ||
396 | case _FP_CLS_COMBINE(FP_CLS_NORMAL,FP_CLS_ZERO): \ | ||
397 | case _FP_CLS_COMBINE(FP_CLS_INF,FP_CLS_ZERO): \ | ||
398 | case _FP_CLS_COMBINE(FP_CLS_INF,FP_CLS_NORMAL): \ | ||
399 | R##_c = FP_CLS_INF; \ | ||
400 | break; \ | ||
401 | \ | ||
402 | case _FP_CLS_COMBINE(FP_CLS_INF,FP_CLS_INF): \ | ||
403 | case _FP_CLS_COMBINE(FP_CLS_ZERO,FP_CLS_ZERO): \ | ||
404 | R##_c = FP_CLS_NAN; \ | ||
405 | _FP_FRAC_SET_##wc(R, _FP_NANFRAC_##fs); \ | ||
406 | break; \ | ||
407 | \ | ||
408 | default: \ | ||
409 | abort(); \ | ||
410 | } \ | ||
411 | } while (0) | ||
412 | |||
413 | |||
414 | /* | ||
415 | * Main differential comparison routine. The inputs should be raw not | ||
416 | * cooked. The return is -1,0,1 for normal values, 2 otherwise. | ||
417 | */ | ||
418 | |||
419 | #define _FP_CMP(fs, wc, ret, X, Y, un) \ | ||
420 | do { \ | ||
421 | /* NANs are unordered */ \ | ||
422 | if ((X##_e == _FP_EXPMAX_##fs && !_FP_FRAC_ZEROP_##wc(X)) \ | ||
423 | || (Y##_e == _FP_EXPMAX_##fs && !_FP_FRAC_ZEROP_##wc(Y))) \ | ||
424 | { \ | ||
425 | ret = un; \ | ||
426 | } \ | ||
427 | else \ | ||
428 | { \ | ||
429 | int __x_zero = (!X##_e && _FP_FRAC_ZEROP_##wc(X)) ? 1 : 0; \ | ||
430 | int __y_zero = (!Y##_e && _FP_FRAC_ZEROP_##wc(Y)) ? 1 : 0; \ | ||
431 | \ | ||
432 | if (__x_zero && __y_zero) \ | ||
433 | ret = 0; \ | ||
434 | else if (__x_zero) \ | ||
435 | ret = Y##_s ? 1 : -1; \ | ||
436 | else if (__y_zero) \ | ||
437 | ret = X##_s ? -1 : 1; \ | ||
438 | else if (X##_s != Y##_s) \ | ||
439 | ret = X##_s ? -1 : 1; \ | ||
440 | else if (X##_e > Y##_e) \ | ||
441 | ret = X##_s ? -1 : 1; \ | ||
442 | else if (X##_e < Y##_e) \ | ||
443 | ret = X##_s ? 1 : -1; \ | ||
444 | else if (_FP_FRAC_GT_##wc(X, Y)) \ | ||
445 | ret = X##_s ? -1 : 1; \ | ||
446 | else if (_FP_FRAC_GT_##wc(Y, X)) \ | ||
447 | ret = X##_s ? 1 : -1; \ | ||
448 | else \ | ||
449 | ret = 0; \ | ||
450 | } \ | ||
451 | } while (0) | ||
452 | |||
453 | |||
454 | /* Simplification for strict equality. */ | ||
455 | |||
456 | #define _FP_CMP_EQ(fs, wc, ret, X, Y) \ | ||
457 | do { \ | ||
458 | /* NANs are unordered */ \ | ||
459 | if ((X##_e == _FP_EXPMAX_##fs && !_FP_FRAC_ZEROP_##wc(X)) \ | ||
460 | || (Y##_e == _FP_EXPMAX_##fs && !_FP_FRAC_ZEROP_##wc(Y))) \ | ||
461 | { \ | ||
462 | ret = 1; \ | ||
463 | } \ | ||
464 | else \ | ||
465 | { \ | ||
466 | ret = !(X##_e == Y##_e \ | ||
467 | && _FP_FRAC_EQ_##wc(X, Y) \ | ||
468 | && (X##_s == Y##_s || !X##_e && _FP_FRAC_ZEROP_##wc(X))); \ | ||
469 | } \ | ||
470 | } while (0) | ||
471 | |||
472 | /* | ||
473 | * Main square root routine. The input value should be cooked. | ||
474 | */ | ||
475 | |||
476 | #define _FP_SQRT(fs, wc, R, X) \ | ||
477 | do { \ | ||
478 | _FP_FRAC_DECL_##wc(T); _FP_FRAC_DECL_##wc(S); \ | ||
479 | _FP_W_TYPE q; \ | ||
480 | switch (X##_c) \ | ||
481 | { \ | ||
482 | case FP_CLS_NAN: \ | ||
483 | R##_s = 0; \ | ||
484 | R##_c = FP_CLS_NAN; \ | ||
485 | _FP_FRAC_SET_##wc(X, _FP_ZEROFRAC_##wc); \ | ||
486 | break; \ | ||
487 | case FP_CLS_INF: \ | ||
488 | if (X##_s) \ | ||
489 | { \ | ||
490 | R##_s = 0; \ | ||
491 | R##_c = FP_CLS_NAN; /* sNAN */ \ | ||
492 | } \ | ||
493 | else \ | ||
494 | { \ | ||
495 | R##_s = 0; \ | ||
496 | R##_c = FP_CLS_INF; /* sqrt(+inf) = +inf */ \ | ||
497 | } \ | ||
498 | break; \ | ||
499 | case FP_CLS_ZERO: \ | ||
500 | R##_s = X##_s; \ | ||
501 | R##_c = FP_CLS_ZERO; /* sqrt(+-0) = +-0 */ \ | ||
502 | break; \ | ||
503 | case FP_CLS_NORMAL: \ | ||
504 | R##_s = 0; \ | ||
505 | if (X##_s) \ | ||
506 | { \ | ||
507 | R##_c = FP_CLS_NAN; /* sNAN */ \ | ||
508 | break; \ | ||
509 | } \ | ||
510 | R##_c = FP_CLS_NORMAL; \ | ||
511 | if (X##_e & 1) \ | ||
512 | _FP_FRAC_SLL_##wc(X, 1); \ | ||
513 | R##_e = X##_e >> 1; \ | ||
514 | _FP_FRAC_SET_##wc(S, _FP_ZEROFRAC_##wc); \ | ||
515 | _FP_FRAC_SET_##wc(R, _FP_ZEROFRAC_##wc); \ | ||
516 | q = _FP_OVERFLOW_##fs; \ | ||
517 | _FP_FRAC_SLL_##wc(X, 1); \ | ||
518 | _FP_SQRT_MEAT_##wc(R, S, T, X, q); \ | ||
519 | _FP_FRAC_SRL_##wc(R, 1); \ | ||
520 | } \ | ||
521 | } while (0) | ||
522 | |||
523 | /* | ||
524 | * Convert from FP to integer | ||
525 | */ | ||
526 | |||
527 | /* "When a NaN, infinity, large positive argument >= 2147483648.0, or | ||
528 | * large negative argument <= -2147483649.0 is converted to an integer, | ||
529 | * the invalid_current bit...should be set and fp_exception_IEEE_754 should | ||
530 | * be raised. If the floating point invalid trap is disabled, no trap occurs | ||
531 | * and a numerical result is generated: if the sign bit of the operand | ||
532 | * is 0, the result is 2147483647; if the sign bit of the operand is 1, | ||
533 | * the result is -2147483648." | ||
534 | * Similarly for conversion to extended ints, except that the boundaries | ||
535 | * are >= 2^63, <= -(2^63 + 1), and the results are 2^63 + 1 for s=0 and | ||
536 | * -2^63 for s=1. | ||
537 | * -- SPARC Architecture Manual V9, Appendix B, which specifies how | ||
538 | * SPARCs resolve implementation dependencies in the IEEE-754 spec. | ||
539 | * I don't believe that the code below follows this. I'm not even sure | ||
540 | * it's right! | ||
541 | * It doesn't cope with needing to convert to an n bit integer when there | ||
542 | * is no n bit integer type. Fortunately gcc provides long long so this | ||
543 | * isn't a problem for sparc32. | ||
544 | * I have, however, fixed its NaN handling to conform as above. | ||
545 | * -- PMM 02/1998 | ||
546 | * NB: rsigned is not 'is r declared signed?' but 'should the value stored | ||
547 | * in r be signed or unsigned?'. r is always(?) declared unsigned. | ||
548 | * Comments below are mine, BTW -- PMM | ||
549 | */ | ||
550 | #define _FP_TO_INT(fs, wc, r, X, rsize, rsigned) \ | ||
551 | do { \ | ||
552 | switch (X##_c) \ | ||
553 | { \ | ||
554 | case FP_CLS_NORMAL: \ | ||
555 | if (X##_e < 0) \ | ||
556 | { \ | ||
557 | /* case FP_CLS_NAN: see above! */ \ | ||
558 | case FP_CLS_ZERO: \ | ||
559 | r = 0; \ | ||
560 | } \ | ||
561 | else if (X##_e >= rsize - (rsigned != 0)) \ | ||
562 | { /* overflow */ \ | ||
563 | case FP_CLS_NAN: \ | ||
564 | case FP_CLS_INF: \ | ||
565 | if (rsigned) \ | ||
566 | { \ | ||
567 | r = 1; \ | ||
568 | r <<= rsize - 1; \ | ||
569 | r -= 1 - X##_s; \ | ||
570 | } \ | ||
571 | else \ | ||
572 | { \ | ||
573 | r = 0; \ | ||
574 | if (!X##_s) \ | ||
575 | r = ~r; \ | ||
576 | } \ | ||
577 | } \ | ||
578 | else \ | ||
579 | { \ | ||
580 | if (_FP_W_TYPE_SIZE*wc < rsize) \ | ||
581 | { \ | ||
582 | _FP_FRAC_ASSEMBLE_##wc(r, X, rsize); \ | ||
583 | r <<= X##_e - _FP_WFRACBITS_##fs; \ | ||
584 | } \ | ||
585 | else \ | ||
586 | { \ | ||
587 | if (X##_e >= _FP_WFRACBITS_##fs) \ | ||
588 | _FP_FRAC_SLL_##wc(X, (X##_e - _FP_WFRACBITS_##fs + 1));\ | ||
589 | else \ | ||
590 | _FP_FRAC_SRL_##wc(X, (_FP_WFRACBITS_##fs - X##_e - 1));\ | ||
591 | _FP_FRAC_ASSEMBLE_##wc(r, X, rsize); \ | ||
592 | } \ | ||
593 | if (rsigned && X##_s) \ | ||
594 | r = -r; \ | ||
595 | } \ | ||
596 | break; \ | ||
597 | } \ | ||
598 | } while (0) | ||
599 | |||
600 | #define _FP_FROM_INT(fs, wc, X, r, rsize, rtype) \ | ||
601 | do { \ | ||
602 | if (r) \ | ||
603 | { \ | ||
604 | X##_c = FP_CLS_NORMAL; \ | ||
605 | \ | ||
606 | if ((X##_s = (r < 0))) \ | ||
607 | r = -r; \ | ||
608 | /* Note that `r' is now considered unsigned, so we don't have \ | ||
609 | to worry about the single signed overflow case. */ \ | ||
610 | \ | ||
611 | if (rsize <= _FP_W_TYPE_SIZE) \ | ||
612 | __FP_CLZ(X##_e, r); \ | ||
613 | else \ | ||
614 | __FP_CLZ_2(X##_e, (_FP_W_TYPE)(r >> _FP_W_TYPE_SIZE), \ | ||
615 | (_FP_W_TYPE)r); \ | ||
616 | if (rsize < _FP_W_TYPE_SIZE) \ | ||
617 | X##_e -= (_FP_W_TYPE_SIZE - rsize); \ | ||
618 | X##_e = rsize - X##_e - 1; \ | ||
619 | \ | ||
620 | if (_FP_FRACBITS_##fs < rsize && _FP_WFRACBITS_##fs < X##_e) \ | ||
621 | __FP_FRAC_SRS_1(r, (X##_e - _FP_WFRACBITS_##fs), rsize); \ | ||
622 | r &= ~((_FP_W_TYPE)1 << X##_e); \ | ||
623 | _FP_FRAC_DISASSEMBLE_##wc(X, ((unsigned rtype)r), rsize); \ | ||
624 | _FP_FRAC_SLL_##wc(X, (_FP_WFRACBITS_##fs - X##_e - 1)); \ | ||
625 | } \ | ||
626 | else \ | ||
627 | { \ | ||
628 | X##_c = FP_CLS_ZERO, X##_s = 0; \ | ||
629 | } \ | ||
630 | } while (0) | ||
631 | |||
632 | |||
633 | #define FP_CONV(dfs,sfs,dwc,swc,D,S) \ | ||
634 | do { \ | ||
635 | _FP_FRAC_CONV_##dwc##_##swc(dfs, sfs, D, S); \ | ||
636 | D##_e = S##_e; \ | ||
637 | D##_c = S##_c; \ | ||
638 | D##_s = S##_s; \ | ||
639 | } while (0) | ||
640 | |||
641 | /* | ||
642 | * Helper primitives. | ||
643 | */ | ||
644 | |||
645 | /* Count leading zeros in a word. */ | ||
646 | |||
647 | #ifndef __FP_CLZ | ||
648 | #if _FP_W_TYPE_SIZE < 64 | ||
649 | /* this is just to shut the compiler up about shifts > word length -- PMM 02/1998 */ | ||
650 | #define __FP_CLZ(r, x) \ | ||
651 | do { \ | ||
652 | _FP_W_TYPE _t = (x); \ | ||
653 | r = _FP_W_TYPE_SIZE - 1; \ | ||
654 | if (_t > 0xffff) r -= 16; \ | ||
655 | if (_t > 0xffff) _t >>= 16; \ | ||
656 | if (_t > 0xff) r -= 8; \ | ||
657 | if (_t > 0xff) _t >>= 8; \ | ||
658 | if (_t & 0xf0) r -= 4; \ | ||
659 | if (_t & 0xf0) _t >>= 4; \ | ||
660 | if (_t & 0xc) r -= 2; \ | ||
661 | if (_t & 0xc) _t >>= 2; \ | ||
662 | if (_t & 0x2) r -= 1; \ | ||
663 | } while (0) | ||
664 | #else /* not _FP_W_TYPE_SIZE < 64 */ | ||
665 | #define __FP_CLZ(r, x) \ | ||
666 | do { \ | ||
667 | _FP_W_TYPE _t = (x); \ | ||
668 | r = _FP_W_TYPE_SIZE - 1; \ | ||
669 | if (_t > 0xffffffff) r -= 32; \ | ||
670 | if (_t > 0xffffffff) _t >>= 32; \ | ||
671 | if (_t > 0xffff) r -= 16; \ | ||
672 | if (_t > 0xffff) _t >>= 16; \ | ||
673 | if (_t > 0xff) r -= 8; \ | ||
674 | if (_t > 0xff) _t >>= 8; \ | ||
675 | if (_t & 0xf0) r -= 4; \ | ||
676 | if (_t & 0xf0) _t >>= 4; \ | ||
677 | if (_t & 0xc) r -= 2; \ | ||
678 | if (_t & 0xc) _t >>= 2; \ | ||
679 | if (_t & 0x2) r -= 1; \ | ||
680 | } while (0) | ||
681 | #endif /* not _FP_W_TYPE_SIZE < 64 */ | ||
682 | #endif /* ndef __FP_CLZ */ | ||
683 | |||
684 | #define _FP_DIV_HELP_imm(q, r, n, d) \ | ||
685 | do { \ | ||
686 | q = n / d, r = n % d; \ | ||
687 | } while (0) | ||
688 | |||
diff --git a/arch/powerpc/math-emu/single.h b/arch/powerpc/math-emu/single.h deleted file mode 100644 index f19d99451815..000000000000 --- a/arch/powerpc/math-emu/single.h +++ /dev/null | |||
@@ -1,66 +0,0 @@ | |||
1 | /* | ||
2 | * Definitions for IEEE Single Precision | ||
3 | */ | ||
4 | |||
5 | #if _FP_W_TYPE_SIZE < 32 | ||
6 | #error "Here's a nickel kid. Go buy yourself a real computer." | ||
7 | #endif | ||
8 | |||
9 | #define _FP_FRACBITS_S 24 | ||
10 | #define _FP_FRACXBITS_S (_FP_W_TYPE_SIZE - _FP_FRACBITS_S) | ||
11 | #define _FP_WFRACBITS_S (_FP_WORKBITS + _FP_FRACBITS_S) | ||
12 | #define _FP_WFRACXBITS_S (_FP_W_TYPE_SIZE - _FP_WFRACBITS_S) | ||
13 | #define _FP_EXPBITS_S 8 | ||
14 | #define _FP_EXPBIAS_S 127 | ||
15 | #define _FP_EXPMAX_S 255 | ||
16 | #define _FP_QNANBIT_S ((_FP_W_TYPE)1 << (_FP_FRACBITS_S-2)) | ||
17 | #define _FP_IMPLBIT_S ((_FP_W_TYPE)1 << (_FP_FRACBITS_S-1)) | ||
18 | #define _FP_OVERFLOW_S ((_FP_W_TYPE)1 << (_FP_WFRACBITS_S)) | ||
19 | |||
20 | /* The implementation of _FP_MUL_MEAT_S and _FP_DIV_MEAT_S should be | ||
21 | chosen by the target machine. */ | ||
22 | |||
23 | union _FP_UNION_S | ||
24 | { | ||
25 | float flt; | ||
26 | struct { | ||
27 | #if __BYTE_ORDER == __BIG_ENDIAN | ||
28 | unsigned sign : 1; | ||
29 | unsigned exp : _FP_EXPBITS_S; | ||
30 | unsigned frac : _FP_FRACBITS_S - (_FP_IMPLBIT_S != 0); | ||
31 | #else | ||
32 | unsigned frac : _FP_FRACBITS_S - (_FP_IMPLBIT_S != 0); | ||
33 | unsigned exp : _FP_EXPBITS_S; | ||
34 | unsigned sign : 1; | ||
35 | #endif | ||
36 | } bits __attribute__((packed)); | ||
37 | }; | ||
38 | |||
39 | #define FP_DECL_S(X) _FP_DECL(1,X) | ||
40 | #define FP_UNPACK_RAW_S(X,val) _FP_UNPACK_RAW_1(S,X,val) | ||
41 | #define FP_PACK_RAW_S(val,X) _FP_PACK_RAW_1(S,val,X) | ||
42 | |||
43 | #define FP_UNPACK_S(X,val) \ | ||
44 | do { \ | ||
45 | _FP_UNPACK_RAW_1(S,X,val); \ | ||
46 | _FP_UNPACK_CANONICAL(S,1,X); \ | ||
47 | } while (0) | ||
48 | |||
49 | #define FP_PACK_S(val,X) \ | ||
50 | do { \ | ||
51 | _FP_PACK_CANONICAL(S,1,X); \ | ||
52 | _FP_PACK_RAW_1(S,val,X); \ | ||
53 | } while (0) | ||
54 | |||
55 | #define FP_NEG_S(R,X) _FP_NEG(S,1,R,X) | ||
56 | #define FP_ADD_S(R,X,Y) _FP_ADD(S,1,R,X,Y) | ||
57 | #define FP_SUB_S(R,X,Y) _FP_SUB(S,1,R,X,Y) | ||
58 | #define FP_MUL_S(R,X,Y) _FP_MUL(S,1,R,X,Y) | ||
59 | #define FP_DIV_S(R,X,Y) _FP_DIV(S,1,R,X,Y) | ||
60 | #define FP_SQRT_S(R,X) _FP_SQRT(S,1,R,X) | ||
61 | |||
62 | #define FP_CMP_S(r,X,Y,un) _FP_CMP(S,1,r,X,Y,un) | ||
63 | #define FP_CMP_EQ_S(r,X,Y) _FP_CMP_EQ(S,1,r,X,Y) | ||
64 | |||
65 | #define FP_TO_INT_S(r,X,rsz,rsg) _FP_TO_INT(S,1,r,X,rsz,rsg) | ||
66 | #define FP_FROM_INT_S(X,r,rs,rt) _FP_FROM_INT(S,1,X,r,rs,rt) | ||
diff --git a/arch/powerpc/math-emu/soft-fp.h b/arch/powerpc/math-emu/soft-fp.h deleted file mode 100644 index cca39598f873..000000000000 --- a/arch/powerpc/math-emu/soft-fp.h +++ /dev/null | |||
@@ -1,104 +0,0 @@ | |||
1 | #ifndef SOFT_FP_H | ||
2 | #define SOFT_FP_H | ||
3 | |||
4 | #include "sfp-machine.h" | ||
5 | |||
6 | #define _FP_WORKBITS 3 | ||
7 | #define _FP_WORK_LSB ((_FP_W_TYPE)1 << 3) | ||
8 | #define _FP_WORK_ROUND ((_FP_W_TYPE)1 << 2) | ||
9 | #define _FP_WORK_GUARD ((_FP_W_TYPE)1 << 1) | ||
10 | #define _FP_WORK_STICKY ((_FP_W_TYPE)1 << 0) | ||
11 | |||
12 | #ifndef FP_RND_NEAREST | ||
13 | # define FP_RND_NEAREST 0 | ||
14 | # define FP_RND_ZERO 1 | ||
15 | # define FP_RND_PINF 2 | ||
16 | # define FP_RND_MINF 3 | ||
17 | #ifndef FP_ROUNDMODE | ||
18 | # define FP_ROUNDMODE FP_RND_NEAREST | ||
19 | #endif | ||
20 | #endif | ||
21 | |||
22 | #define _FP_ROUND_NEAREST(wc, X) \ | ||
23 | ({ int __ret = 0; \ | ||
24 | int __frac = _FP_FRAC_LOW_##wc(X) & 15; \ | ||
25 | if (__frac & 7) { \ | ||
26 | __ret = EFLAG_INEXACT; \ | ||
27 | if ((__frac & 7) != _FP_WORK_ROUND) \ | ||
28 | _FP_FRAC_ADDI_##wc(X, _FP_WORK_ROUND); \ | ||
29 | else if (__frac & _FP_WORK_LSB) \ | ||
30 | _FP_FRAC_ADDI_##wc(X, _FP_WORK_ROUND); \ | ||
31 | } \ | ||
32 | __ret; \ | ||
33 | }) | ||
34 | |||
35 | #define _FP_ROUND_ZERO(wc, X) \ | ||
36 | ({ int __ret = 0; \ | ||
37 | if (_FP_FRAC_LOW_##wc(X) & 7) \ | ||
38 | __ret = EFLAG_INEXACT; \ | ||
39 | __ret; \ | ||
40 | }) | ||
41 | |||
42 | #define _FP_ROUND_PINF(wc, X) \ | ||
43 | ({ int __ret = EFLAG_INEXACT; \ | ||
44 | if (!X##_s && (_FP_FRAC_LOW_##wc(X) & 7)) \ | ||
45 | _FP_FRAC_ADDI_##wc(X, _FP_WORK_LSB); \ | ||
46 | else __ret = 0; \ | ||
47 | __ret; \ | ||
48 | }) | ||
49 | |||
50 | #define _FP_ROUND_MINF(wc, X) \ | ||
51 | ({ int __ret = EFLAG_INEXACT; \ | ||
52 | if (X##_s && (_FP_FRAC_LOW_##wc(X) & 7)) \ | ||
53 | _FP_FRAC_ADDI_##wc(X, _FP_WORK_LSB); \ | ||
54 | else __ret = 0; \ | ||
55 | __ret; \ | ||
56 | }) | ||
57 | |||
58 | #define _FP_ROUND(wc, X) \ | ||
59 | ({ int __ret = 0; \ | ||
60 | switch (FP_ROUNDMODE) \ | ||
61 | { \ | ||
62 | case FP_RND_NEAREST: \ | ||
63 | __ret |= _FP_ROUND_NEAREST(wc,X); \ | ||
64 | break; \ | ||
65 | case FP_RND_ZERO: \ | ||
66 | __ret |= _FP_ROUND_ZERO(wc,X); \ | ||
67 | break; \ | ||
68 | case FP_RND_PINF: \ | ||
69 | __ret |= _FP_ROUND_PINF(wc,X); \ | ||
70 | break; \ | ||
71 | case FP_RND_MINF: \ | ||
72 | __ret |= _FP_ROUND_MINF(wc,X); \ | ||
73 | break; \ | ||
74 | }; \ | ||
75 | __ret; \ | ||
76 | }) | ||
77 | |||
78 | #define FP_CLS_NORMAL 0 | ||
79 | #define FP_CLS_ZERO 1 | ||
80 | #define FP_CLS_INF 2 | ||
81 | #define FP_CLS_NAN 3 | ||
82 | |||
83 | #define _FP_CLS_COMBINE(x,y) (((x) << 2) | (y)) | ||
84 | |||
85 | #include "op-1.h" | ||
86 | #include "op-2.h" | ||
87 | #include "op-4.h" | ||
88 | #include "op-common.h" | ||
89 | |||
90 | /* Sigh. Silly things longlong.h needs. */ | ||
91 | #define UWtype _FP_W_TYPE | ||
92 | #define W_TYPE_SIZE _FP_W_TYPE_SIZE | ||
93 | |||
94 | typedef int SItype __attribute__((mode(SI))); | ||
95 | typedef int DItype __attribute__((mode(DI))); | ||
96 | typedef unsigned int USItype __attribute__((mode(SI))); | ||
97 | typedef unsigned int UDItype __attribute__((mode(DI))); | ||
98 | #if _FP_W_TYPE_SIZE == 32 | ||
99 | typedef unsigned int UHWtype __attribute__((mode(HI))); | ||
100 | #elif _FP_W_TYPE_SIZE == 64 | ||
101 | typedef USItype UHWtype; | ||
102 | #endif | ||
103 | |||
104 | #endif | ||
diff --git a/arch/powerpc/math-emu/stfs.c b/arch/powerpc/math-emu/stfs.c index 8689aa48ef69..6122147356d1 100644 --- a/arch/powerpc/math-emu/stfs.c +++ b/arch/powerpc/math-emu/stfs.c | |||
@@ -2,23 +2,24 @@ | |||
2 | #include <linux/errno.h> | 2 | #include <linux/errno.h> |
3 | #include <asm/uaccess.h> | 3 | #include <asm/uaccess.h> |
4 | 4 | ||
5 | #include "soft-fp.h" | 5 | #include <asm/sfp-machine.h> |
6 | #include "double.h" | 6 | #include <math-emu/soft-fp.h> |
7 | #include "single.h" | 7 | #include <math-emu/double.h> |
8 | #include <math-emu/single.h> | ||
8 | 9 | ||
9 | int | 10 | int |
10 | stfs(void *frS, void *ea) | 11 | stfs(void *frS, void *ea) |
11 | { | 12 | { |
12 | FP_DECL_D(A); | 13 | FP_DECL_D(A); |
13 | FP_DECL_S(R); | 14 | FP_DECL_S(R); |
15 | FP_DECL_EX; | ||
14 | float f; | 16 | float f; |
15 | int err; | ||
16 | 17 | ||
17 | #ifdef DEBUG | 18 | #ifdef DEBUG |
18 | printk("%s: S %p, ea %p\n", __func__, frS, ea); | 19 | printk("%s: S %p, ea %p\n", __func__, frS, ea); |
19 | #endif | 20 | #endif |
20 | 21 | ||
21 | __FP_UNPACK_D(A, frS); | 22 | FP_UNPACK_DP(A, frS); |
22 | 23 | ||
23 | #ifdef DEBUG | 24 | #ifdef DEBUG |
24 | printk("A: %ld %lu %lu %ld (%ld)\n", A_s, A_f1, A_f0, A_e, A_c); | 25 | printk("A: %ld %lu %lu %ld (%ld)\n", A_s, A_f1, A_f0, A_e, A_c); |
@@ -30,12 +31,12 @@ stfs(void *frS, void *ea) | |||
30 | printk("R: %ld %lu %ld (%ld)\n", R_s, R_f, R_e, R_c); | 31 | printk("R: %ld %lu %ld (%ld)\n", R_s, R_f, R_e, R_c); |
31 | #endif | 32 | #endif |
32 | 33 | ||
33 | err = _FP_PACK_CANONICAL(S, 1, R); | 34 | _FP_PACK_CANONICAL(S, 1, R); |
34 | if (!err || !__FPU_TRAP_P(err)) { | 35 | if (!FP_CUR_EXCEPTIONS || !__FPU_TRAP_P(FP_CUR_EXCEPTIONS)) { |
35 | __FP_PACK_RAW_1(S, &f, R); | 36 | _FP_PACK_RAW_1_P(S, &f, R); |
36 | if (copy_to_user(ea, &f, sizeof(float))) | 37 | if (copy_to_user(ea, &f, sizeof(float))) |
37 | return -EFAULT; | 38 | return -EFAULT; |
38 | } | 39 | } |
39 | 40 | ||
40 | return err; | 41 | return FP_CUR_EXCEPTIONS; |
41 | } | 42 | } |
diff --git a/arch/powerpc/math-emu/types.c b/arch/powerpc/math-emu/types.c deleted file mode 100644 index e1ed15d829db..000000000000 --- a/arch/powerpc/math-emu/types.c +++ /dev/null | |||
@@ -1,51 +0,0 @@ | |||
1 | #include "soft-fp.h" | ||
2 | #include "double.h" | ||
3 | #include "single.h" | ||
4 | |||
5 | void | ||
6 | fp_unpack_d(long *_s, unsigned long *_f1, unsigned long *_f0, | ||
7 | long *_e, long *_c, void *val) | ||
8 | { | ||
9 | FP_DECL_D(X); | ||
10 | |||
11 | __FP_UNPACK_RAW_2(D, X, val); | ||
12 | |||
13 | _FP_UNPACK_CANONICAL(D, 2, X); | ||
14 | |||
15 | *_s = X_s; | ||
16 | *_f1 = X_f1; | ||
17 | *_f0 = X_f0; | ||
18 | *_e = X_e; | ||
19 | *_c = X_c; | ||
20 | } | ||
21 | |||
22 | int | ||
23 | fp_pack_d(void *val, long X_s, unsigned long X_f1, | ||
24 | unsigned long X_f0, long X_e, long X_c) | ||
25 | { | ||
26 | int exc; | ||
27 | |||
28 | exc = _FP_PACK_CANONICAL(D, 2, X); | ||
29 | if (!exc || !__FPU_TRAP_P(exc)) | ||
30 | __FP_PACK_RAW_2(D, val, X); | ||
31 | return exc; | ||
32 | } | ||
33 | |||
34 | int | ||
35 | fp_pack_ds(void *val, long X_s, unsigned long X_f1, | ||
36 | unsigned long X_f0, long X_e, long X_c) | ||
37 | { | ||
38 | FP_DECL_S(__X); | ||
39 | int exc; | ||
40 | |||
41 | FP_CONV(S, D, 1, 2, __X, X); | ||
42 | exc = _FP_PACK_CANONICAL(S, 1, __X); | ||
43 | if (!exc || !__FPU_TRAP_P(exc)) { | ||
44 | _FP_UNPACK_CANONICAL(S, 1, __X); | ||
45 | FP_CONV(D, S, 2, 1, X, __X); | ||
46 | exc |= _FP_PACK_CANONICAL(D, 2, X); | ||
47 | if (!exc || !__FPU_TRAP_P(exc)) | ||
48 | __FP_PACK_RAW_2(D, val, X); | ||
49 | } | ||
50 | return exc; | ||
51 | } | ||
diff --git a/arch/powerpc/math-emu/udivmodti4.c b/arch/powerpc/math-emu/udivmodti4.c index 7e112dc1e2f2..6172044ab003 100644 --- a/arch/powerpc/math-emu/udivmodti4.c +++ b/arch/powerpc/math-emu/udivmodti4.c | |||
@@ -1,6 +1,6 @@ | |||
1 | /* This has so very few changes over libgcc2's __udivmoddi4 it isn't funny. */ | 1 | /* This has so very few changes over libgcc2's __udivmoddi4 it isn't funny. */ |
2 | 2 | ||
3 | #include "soft-fp.h" | 3 | #include <math-emu/soft-fp.h> |
4 | 4 | ||
5 | #undef count_leading_zeros | 5 | #undef count_leading_zeros |
6 | #define count_leading_zeros __FP_CLZ | 6 | #define count_leading_zeros __FP_CLZ |