@@ -82,6 +82,9 @@
#define _FP_MUL_MEAT_S(R,X,Y) _FP_MUL_MEAT_1_wide(_FP_WFRACBITS_S,R,X,Y,umul_ppmm)
#define _FP_MUL_MEAT_D(R,X,Y) _FP_MUL_MEAT_2_wide(_FP_WFRACBITS_D,R,X,Y,umul_ppmm)
+#define _FP_MUL_MEAT_DW_S(R,X,Y) _FP_MUL_MEAT_DW_1_wide(_FP_WFRACBITS_S,R,X,Y,umul_ppmm)
+#define _FP_MUL_MEAT_DW_D(R,X,Y) _FP_MUL_MEAT_DW_2_wide(_FP_WFRACBITS_D,R,X,Y,umul_ppmm)
+
#define _FP_DIV_MEAT_S(R,X,Y) _FP_DIV_MEAT_1_udiv_norm(S,R,X,Y)
#define _FP_DIV_MEAT_D(R,X,Y) _FP_DIV_MEAT_2_udiv(D,R,X,Y)
@@ -96,6 +99,7 @@
#define _FP_NANSIGN_Q 0
#define _FP_KEEPNANFRACP 1
+#define _FP_QNANNEGATEDP 0
#ifdef FP_EX_BOOKE_E500_SPE
#define FP_EX_INEXACT (1 << 21)
@@ -178,15 +182,40 @@
_FP_PACK_RAW_2_P(D, val, X); \
} while (0)
+#define __FP_PACK_SEMIRAW_D(val,X) \
+ do { \
+ _FP_PACK_SEMIRAW(D, 2, X); \
+ if (!FP_CUR_EXCEPTIONS || !__FPU_TRAP_P(FP_CUR_EXCEPTIONS)) \
+ _FP_PACK_RAW_2_P(D, val, X); \
+ } while (0)
+
#define __FP_PACK_DS(val,X) \
do { \
FP_DECL_S(__X); \
- FP_CONV(S, D, 1, 2, __X, X); \
+ if (X##_c != FP_CLS_NAN) \
+ _FP_FRAC_SRS_2(X, _FP_WFRACBITS_D - _FP_WFRACBITS_S, \
+ _FP_WFRACBITS_D); \
+ else \
+ _FP_FRAC_SRL_2(X, _FP_WFRACBITS_D - _FP_WFRACBITS_S); \
+ _FP_FRAC_COPY_1_2(__X, X); \
+ __X##_e = X##_e; \
+ __X##_c = X##_c; \
+ __X##_s = X##_s; \
_FP_PACK_CANONICAL(S, 1, __X); \
if (!FP_CUR_EXCEPTIONS || !__FPU_TRAP_P(FP_CUR_EXCEPTIONS)) { \
- _FP_UNPACK_CANONICAL(S, 1, __X); \
- FP_CONV(D, S, 2, 1, X, __X); \
- _FP_PACK_CANONICAL(D, 2, X); \
+ FP_EXTEND(D, S, 2, 1, X, __X); \
+ if (!FP_CUR_EXCEPTIONS || !__FPU_TRAP_P(FP_CUR_EXCEPTIONS)) \
+ _FP_PACK_RAW_2_P(D, val, X); \
+ } \
+ } while (0)
+
+#define __FP_PACK_SEMIRAW_DS(val,X) \
+ do { \
+ FP_DECL_S(__X); \
+ FP_TRUNC(S, D, 1, 2, __X, X); \
+ _FP_PACK_SEMIRAW(S, 1, __X); \
+ if (!FP_CUR_EXCEPTIONS || !__FPU_TRAP_P(FP_CUR_EXCEPTIONS)) { \
+ FP_EXTEND(D, S, 2, 1, X, __X); \
if (!FP_CUR_EXCEPTIONS || !__FPU_TRAP_P(FP_CUR_EXCEPTIONS)) \
_FP_PACK_RAW_2_P(D, val, X); \
} \
@@ -198,6 +227,8 @@
__FPU_FPSCR & 0x3; \
})
+#define _FP_TININESS_AFTER_ROUNDING 0
+
/* the asm fragments go here: all these are taken from glibc-2.0.5's
* stdlib/longlong.h
*/
@@ -3,8 +3,8 @@
#include <asm/uaccess.h>
#include <asm/sfp-machine.h>
-#include <math-emu-old/soft-fp.h>
-#include <math-emu-old/double.h>
+#include <math-emu/soft-fp.h>
+#include <math-emu/double.h>
int
fadd(void *frD, void *frA, void *frB)
@@ -18,8 +18,8 @@ fadd(void *frD, void *frA, void *frB)
printk("%s: %p %p %p\n", __func__, frD, frA, frB);
#endif
- FP_UNPACK_DP(A, frA);
- FP_UNPACK_DP(B, frB);
+ FP_UNPACK_SEMIRAW_DP(A, frA);
+ FP_UNPACK_SEMIRAW_DP(B, frB);
#ifdef DEBUG
printk("A: %ld %lu %lu %ld (%ld)\n", A_s, A_f1, A_f0, A_e, A_c);
@@ -32,7 +32,7 @@ fadd(void *frD, void *frA, void *frB)
printk("D: %ld %lu %lu %ld (%ld)\n", R_s, R_f1, R_f0, R_e, R_c);
#endif
- __FP_PACK_D(frD, R);
+ __FP_PACK_SEMIRAW_D(frD, R);
return FP_CUR_EXCEPTIONS;
}
@@ -3,9 +3,9 @@
#include <asm/uaccess.h>
#include <asm/sfp-machine.h>
-#include <math-emu-old/soft-fp.h>
-#include <math-emu-old/double.h>
-#include <math-emu-old/single.h>
+#include <math-emu/soft-fp.h>
+#include <math-emu/double.h>
+#include <math-emu/single.h>
int
fadds(void *frD, void *frA, void *frB)
@@ -19,8 +19,8 @@ fadds(void *frD, void *frA, void *frB)
printk("%s: %p %p %p\n", __func__, frD, frA, frB);
#endif
- FP_UNPACK_DP(A, frA);
- FP_UNPACK_DP(B, frB);
+ FP_UNPACK_SEMIRAW_DP(A, frA);
+ FP_UNPACK_SEMIRAW_DP(B, frB);
#ifdef DEBUG
printk("A: %ld %lu %lu %ld (%ld)\n", A_s, A_f1, A_f0, A_e, A_c);
@@ -33,7 +33,7 @@ fadds(void *frD, void *frA, void *frB)
printk("D: %ld %lu %lu %ld (%ld)\n", R_s, R_f1, R_f0, R_e, R_c);
#endif
- __FP_PACK_DS(frD, R);
+ __FP_PACK_SEMIRAW_DS(frD, R);
return FP_CUR_EXCEPTIONS;
}
@@ -3,8 +3,8 @@
#include <asm/uaccess.h>
#include <asm/sfp-machine.h>
-#include <math-emu-old/soft-fp.h>
-#include <math-emu-old/double.h>
+#include <math-emu/soft-fp.h>
+#include <math-emu/double.h>
int
fcmpo(u32 *ccr, int crfD, void *frA, void *frB)
@@ -30,7 +30,7 @@ fcmpo(u32 *ccr, int crfD, void *frA, void *frB)
if (A_c == FP_CLS_NAN || B_c == FP_CLS_NAN)
FP_SET_EXCEPTION(EFLAG_VXVC);
- FP_CMP_D(cmp, A, B, 2);
+ FP_CMP_D(cmp, A, B, 2, 0);
cmp = code[(cmp + 1) & 3];
__FPU_FPSCR &= ~(0x1f000);
@@ -3,8 +3,8 @@
#include <asm/uaccess.h>
#include <asm/sfp-machine.h>
-#include <math-emu-old/soft-fp.h>
-#include <math-emu-old/double.h>
+#include <math-emu/soft-fp.h>
+#include <math-emu/double.h>
int
fcmpu(u32 *ccr, int crfD, void *frA, void *frB)
@@ -27,7 +27,7 @@ fcmpu(u32 *ccr, int crfD, void *frA, void *frB)
printk("B: %ld %lu %lu %ld (%ld)\n", B_s, B_f1, B_f0, B_e, B_c);
#endif
- FP_CMP_D(cmp, A, B, 2);
+ FP_CMP_D(cmp, A, B, 2, 0);
cmp = code[(cmp + 1) & 3];
__FPU_FPSCR &= ~(0x1f000);
@@ -3,8 +3,8 @@
#include <asm/uaccess.h>
#include <asm/sfp-machine.h>
-#include <math-emu-old/soft-fp.h>
-#include <math-emu-old/double.h>
+#include <math-emu/soft-fp.h>
+#include <math-emu/double.h>
int
fctiw(u32 *frD, void *frB)
@@ -13,7 +13,7 @@ fctiw(u32 *frD, void *frB)
FP_DECL_EX;
unsigned int r;
- FP_UNPACK_DP(B, frB);
+ FP_UNPACK_RAW_DP(B, frB);
FP_TO_INT_D(r, B, 32, 1);
frD[1] = r;
@@ -3,8 +3,8 @@
#include <asm/uaccess.h>
#include <asm/sfp-machine.h>
-#include <math-emu-old/soft-fp.h>
-#include <math-emu-old/double.h>
+#include <math-emu/soft-fp.h>
+#include <math-emu/double.h>
int
fctiwz(u32 *frD, void *frB)
@@ -18,7 +18,7 @@ fctiwz(u32 *frD, void *frB)
__FPU_FPSCR &= ~(3);
__FPU_FPSCR |= FP_RND_ZERO;
- FP_UNPACK_DP(B, frB);
+ FP_UNPACK_RAW_DP(B, frB);
FP_TO_INT_D(r, B, 32, 1);
frD[1] = r;
@@ -3,8 +3,8 @@
#include <asm/uaccess.h>
#include <asm/sfp-machine.h>
-#include <math-emu-old/soft-fp.h>
-#include <math-emu-old/double.h>
+#include <math-emu/soft-fp.h>
+#include <math-emu/double.h>
int
fdiv(void *frD, void *frA, void *frB)
@@ -3,9 +3,9 @@
#include <asm/uaccess.h>
#include <asm/sfp-machine.h>
-#include <math-emu-old/soft-fp.h>
-#include <math-emu-old/double.h>
-#include <math-emu-old/single.h>
+#include <math-emu/soft-fp.h>
+#include <math-emu/double.h>
+#include <math-emu/single.h>
int
fdivs(void *frD, void *frA, void *frB)
@@ -3,8 +3,8 @@
#include <asm/uaccess.h>
#include <asm/sfp-machine.h>
-#include <math-emu-old/soft-fp.h>
-#include <math-emu-old/double.h>
+#include <math-emu/soft-fp.h>
+#include <math-emu/double.h>
int
fmadd(void *frD, void *frA, void *frB, void *frC)
@@ -13,7 +13,6 @@ fmadd(void *frD, void *frA, void *frB, void *frC)
FP_DECL_D(A);
FP_DECL_D(B);
FP_DECL_D(C);
- FP_DECL_D(T);
FP_DECL_EX;
#ifdef DEBUG
@@ -34,12 +33,7 @@ fmadd(void *frD, void *frA, void *frB, void *frC)
(A_c == FP_CLS_ZERO && C_c == FP_CLS_INF))
FP_SET_EXCEPTION(EFLAG_VXIMZ);
- FP_MUL_D(T, A, C);
-
- if (T_s != B_s && T_c == FP_CLS_INF && B_c == FP_CLS_INF)
- FP_SET_EXCEPTION(EFLAG_VXISI);
-
- FP_ADD_D(R, T, B);
+ FP_FMA_D(R, A, C, B);
#ifdef DEBUG
printk("D: %ld %lu %lu %ld (%ld)\n", R_s, R_f1, R_f0, R_e, R_c);
@@ -3,9 +3,9 @@
#include <asm/uaccess.h>
#include <asm/sfp-machine.h>
-#include <math-emu-old/soft-fp.h>
-#include <math-emu-old/double.h>
-#include <math-emu-old/single.h>
+#include <math-emu/soft-fp.h>
+#include <math-emu/double.h>
+#include <math-emu/single.h>
int
fmadds(void *frD, void *frA, void *frB, void *frC)
@@ -14,7 +14,6 @@ fmadds(void *frD, void *frA, void *frB, void *frC)
FP_DECL_D(A);
FP_DECL_D(B);
FP_DECL_D(C);
- FP_DECL_D(T);
FP_DECL_EX;
#ifdef DEBUG
@@ -35,12 +34,7 @@ fmadds(void *frD, void *frA, void *frB, void *frC)
(A_c == FP_CLS_ZERO && C_c == FP_CLS_INF))
FP_SET_EXCEPTION(EFLAG_VXIMZ);
- FP_MUL_D(T, A, C);
-
- if (T_s != B_s && T_c == FP_CLS_INF && B_c == FP_CLS_INF)
- FP_SET_EXCEPTION(EFLAG_VXISI);
-
- FP_ADD_D(R, T, B);
+ FP_FMA_D(R, A, C, B);
#ifdef DEBUG
printk("D: %ld %lu %lu %ld (%ld)\n", R_s, R_f1, R_f0, R_e, R_c);
@@ -3,8 +3,8 @@
#include <asm/uaccess.h>
#include <asm/sfp-machine.h>
-#include <math-emu-old/soft-fp.h>
-#include <math-emu-old/double.h>
+#include <math-emu/soft-fp.h>
+#include <math-emu/double.h>
int
fmsub(void *frD, void *frA, void *frB, void *frC)
@@ -13,7 +13,6 @@ fmsub(void *frD, void *frA, void *frB, void *frC)
FP_DECL_D(A);
FP_DECL_D(B);
FP_DECL_D(C);
- FP_DECL_D(T);
FP_DECL_EX;
#ifdef DEBUG
@@ -34,15 +33,10 @@ fmsub(void *frD, void *frA, void *frB, void *frC)
(A_c == FP_CLS_ZERO && C_c == FP_CLS_INF))
FP_SET_EXCEPTION(EFLAG_VXIMZ);
- FP_MUL_D(T, A, C);
-
if (B_c != FP_CLS_NAN)
B_s ^= 1;
- if (T_s != B_s && T_c == FP_CLS_INF && B_c == FP_CLS_INF)
- FP_SET_EXCEPTION(EFLAG_VXISI);
-
- FP_ADD_D(R, T, B);
+ FP_FMA_D(R, A, C, B);
#ifdef DEBUG
printk("D: %ld %lu %lu %ld (%ld)\n", R_s, R_f1, R_f0, R_e, R_c);
@@ -3,9 +3,9 @@
#include <asm/uaccess.h>
#include <asm/sfp-machine.h>
-#include <math-emu-old/soft-fp.h>
-#include <math-emu-old/double.h>
-#include <math-emu-old/single.h>
+#include <math-emu/soft-fp.h>
+#include <math-emu/double.h>
+#include <math-emu/single.h>
int
fmsubs(void *frD, void *frA, void *frB, void *frC)
@@ -14,7 +14,6 @@ fmsubs(void *frD, void *frA, void *frB, void *frC)
FP_DECL_D(A);
FP_DECL_D(B);
FP_DECL_D(C);
- FP_DECL_D(T);
FP_DECL_EX;
#ifdef DEBUG
@@ -35,15 +34,10 @@ fmsubs(void *frD, void *frA, void *frB, void *frC)
(A_c == FP_CLS_ZERO && C_c == FP_CLS_INF))
FP_SET_EXCEPTION(EFLAG_VXIMZ);
- FP_MUL_D(T, A, C);
-
if (B_c != FP_CLS_NAN)
B_s ^= 1;
- if (T_s != B_s && T_c == FP_CLS_INF && B_c == FP_CLS_INF)
- FP_SET_EXCEPTION(EFLAG_VXISI);
-
- FP_ADD_D(R, T, B);
+ FP_FMA_D(R, A, C, B);
#ifdef DEBUG
printk("D: %ld %lu %lu %ld (%ld)\n", R_s, R_f1, R_f0, R_e, R_c);
@@ -3,8 +3,8 @@
#include <asm/uaccess.h>
#include <asm/sfp-machine.h>
-#include <math-emu-old/soft-fp.h>
-#include <math-emu-old/double.h>
+#include <math-emu/soft-fp.h>
+#include <math-emu/double.h>
int
fmul(void *frD, void *frA, void *frB)
@@ -3,9 +3,9 @@
#include <asm/uaccess.h>
#include <asm/sfp-machine.h>
-#include <math-emu-old/soft-fp.h>
-#include <math-emu-old/double.h>
-#include <math-emu-old/single.h>
+#include <math-emu/soft-fp.h>
+#include <math-emu/double.h>
+#include <math-emu/single.h>
int
fmuls(void *frD, void *frA, void *frB)
@@ -3,8 +3,8 @@
#include <asm/uaccess.h>
#include <asm/sfp-machine.h>
-#include <math-emu-old/soft-fp.h>
-#include <math-emu-old/double.h>
+#include <math-emu/soft-fp.h>
+#include <math-emu/double.h>
int
fnmadd(void *frD, void *frA, void *frB, void *frC)
@@ -13,7 +13,6 @@ fnmadd(void *frD, void *frA, void *frB, void *frC)
FP_DECL_D(A);
FP_DECL_D(B);
FP_DECL_D(C);
- FP_DECL_D(T);
FP_DECL_EX;
#ifdef DEBUG
@@ -34,12 +33,7 @@ fnmadd(void *frD, void *frA, void *frB, void *frC)
(A_c == FP_CLS_ZERO && C_c == FP_CLS_INF))
FP_SET_EXCEPTION(EFLAG_VXIMZ);
- FP_MUL_D(T, A, C);
-
- if (T_s != B_s && T_c == FP_CLS_INF && B_c == FP_CLS_INF)
- FP_SET_EXCEPTION(EFLAG_VXISI);
-
- FP_ADD_D(R, T, B);
+ FP_FMA_D(R, A, C, B);
if (R_c != FP_CLS_NAN)
R_s ^= 1;
@@ -3,9 +3,9 @@
#include <asm/uaccess.h>
#include <asm/sfp-machine.h>
-#include <math-emu-old/soft-fp.h>
-#include <math-emu-old/double.h>
-#include <math-emu-old/single.h>
+#include <math-emu/soft-fp.h>
+#include <math-emu/double.h>
+#include <math-emu/single.h>
int
fnmadds(void *frD, void *frA, void *frB, void *frC)
@@ -14,7 +14,6 @@ fnmadds(void *frD, void *frA, void *frB, void *frC)
FP_DECL_D(A);
FP_DECL_D(B);
FP_DECL_D(C);
- FP_DECL_D(T);
FP_DECL_EX;
#ifdef DEBUG
@@ -35,12 +34,7 @@ fnmadds(void *frD, void *frA, void *frB, void *frC)
(A_c == FP_CLS_ZERO && C_c == FP_CLS_INF))
FP_SET_EXCEPTION(EFLAG_VXIMZ);
- FP_MUL_D(T, A, C);
-
- if (T_s != B_s && T_c == FP_CLS_INF && B_c == FP_CLS_INF)
- FP_SET_EXCEPTION(EFLAG_VXISI);
-
- FP_ADD_D(R, T, B);
+ FP_FMA_D(R, A, C, B);
if (R_c != FP_CLS_NAN)
R_s ^= 1;
@@ -3,8 +3,8 @@
#include <asm/uaccess.h>
#include <asm/sfp-machine.h>
-#include <math-emu-old/soft-fp.h>
-#include <math-emu-old/double.h>
+#include <math-emu/soft-fp.h>
+#include <math-emu/double.h>
int
fnmsub(void *frD, void *frA, void *frB, void *frC)
@@ -13,7 +13,6 @@ fnmsub(void *frD, void *frA, void *frB, void *frC)
FP_DECL_D(A);
FP_DECL_D(B);
FP_DECL_D(C);
- FP_DECL_D(T);
FP_DECL_EX;
#ifdef DEBUG
@@ -34,15 +33,10 @@ fnmsub(void *frD, void *frA, void *frB, void *frC)
(A_c == FP_CLS_ZERO && C_c == FP_CLS_INF))
FP_SET_EXCEPTION(EFLAG_VXIMZ);
- FP_MUL_D(T, A, C);
-
if (B_c != FP_CLS_NAN)
B_s ^= 1;
- if (T_s != B_s && T_c == FP_CLS_INF && B_c == FP_CLS_INF)
- FP_SET_EXCEPTION(EFLAG_VXISI);
-
- FP_ADD_D(R, T, B);
+ FP_FMA_D(R, A, C, B);
if (R_c != FP_CLS_NAN)
R_s ^= 1;
@@ -3,9 +3,9 @@
#include <asm/uaccess.h>
#include <asm/sfp-machine.h>
-#include <math-emu-old/soft-fp.h>
-#include <math-emu-old/double.h>
-#include <math-emu-old/single.h>
+#include <math-emu/soft-fp.h>
+#include <math-emu/double.h>
+#include <math-emu/single.h>
int
fnmsubs(void *frD, void *frA, void *frB, void *frC)
@@ -14,7 +14,6 @@ fnmsubs(void *frD, void *frA, void *frB, void *frC)
FP_DECL_D(A);
FP_DECL_D(B);
FP_DECL_D(C);
- FP_DECL_D(T);
FP_DECL_EX;
#ifdef DEBUG
@@ -35,15 +34,10 @@ fnmsubs(void *frD, void *frA, void *frB, void *frC)
(A_c == FP_CLS_ZERO && C_c == FP_CLS_INF))
FP_SET_EXCEPTION(EFLAG_VXIMZ);
- FP_MUL_D(T, A, C);
-
if (B_c != FP_CLS_NAN)
B_s ^= 1;
- if (T_s != B_s && T_c == FP_CLS_INF && B_c == FP_CLS_INF)
- FP_SET_EXCEPTION(EFLAG_VXISI);
-
- FP_ADD_D(R, T, B);
+ FP_FMA_D(R, A, C, B);
if (R_c != FP_CLS_NAN)
R_s ^= 1;
@@ -3,9 +3,9 @@
#include <asm/uaccess.h>
#include <asm/sfp-machine.h>
-#include <math-emu-old/soft-fp.h>
-#include <math-emu-old/double.h>
-#include <math-emu-old/single.h>
+#include <math-emu/soft-fp.h>
+#include <math-emu/double.h>
+#include <math-emu/single.h>
int
frsp(void *frD, void *frB)
@@ -3,8 +3,8 @@
#include <asm/uaccess.h>
#include <asm/sfp-machine.h>
-#include <math-emu-old/soft-fp.h>
-#include <math-emu-old/double.h>
+#include <math-emu/soft-fp.h>
+#include <math-emu/double.h>
int
fsel(u32 *frD, void *frA, u32 *frB, u32 *frC)
@@ -3,8 +3,8 @@
#include <asm/uaccess.h>
#include <asm/sfp-machine.h>
-#include <math-emu-old/soft-fp.h>
-#include <math-emu-old/double.h>
+#include <math-emu/soft-fp.h>
+#include <math-emu/double.h>
int
fsqrt(void *frD, void *frB)
@@ -3,9 +3,9 @@
#include <asm/uaccess.h>
#include <asm/sfp-machine.h>
-#include <math-emu-old/soft-fp.h>
-#include <math-emu-old/double.h>
-#include <math-emu-old/single.h>
+#include <math-emu/soft-fp.h>
+#include <math-emu/double.h>
+#include <math-emu/single.h>
int
fsqrts(void *frD, void *frB)
@@ -3,8 +3,8 @@
#include <asm/uaccess.h>
#include <asm/sfp-machine.h>
-#include <math-emu-old/soft-fp.h>
-#include <math-emu-old/double.h>
+#include <math-emu/soft-fp.h>
+#include <math-emu/double.h>
int
fsub(void *frD, void *frA, void *frB)
@@ -18,8 +18,8 @@ fsub(void *frD, void *frA, void *frB)
printk("%s: %p %p %p\n", __func__, frD, frA, frB);
#endif
- FP_UNPACK_DP(A, frA);
- FP_UNPACK_DP(B, frB);
+ FP_UNPACK_SEMIRAW_DP(A, frA);
+ FP_UNPACK_SEMIRAW_DP(B, frB);
#ifdef DEBUG
printk("A: %ld %lu %lu %ld (%ld)\n", A_s, A_f1, A_f0, A_e, A_c);
@@ -38,7 +38,7 @@ fsub(void *frD, void *frA, void *frB)
printk("D: %ld %lu %lu %ld (%ld)\n", R_s, R_f1, R_f0, R_e, R_c);
#endif
- __FP_PACK_D(frD, R);
+ __FP_PACK_SEMIRAW_D(frD, R);
return FP_CUR_EXCEPTIONS;
}
@@ -3,9 +3,9 @@
#include <asm/uaccess.h>
#include <asm/sfp-machine.h>
-#include <math-emu-old/soft-fp.h>
-#include <math-emu-old/double.h>
-#include <math-emu-old/single.h>
+#include <math-emu/soft-fp.h>
+#include <math-emu/double.h>
+#include <math-emu/single.h>
int
fsubs(void *frD, void *frA, void *frB)
@@ -19,8 +19,8 @@ fsubs(void *frD, void *frA, void *frB)
printk("%s: %p %p %p\n", __func__, frD, frA, frB);
#endif
- FP_UNPACK_DP(A, frA);
- FP_UNPACK_DP(B, frB);
+ FP_UNPACK_SEMIRAW_DP(A, frA);
+ FP_UNPACK_SEMIRAW_DP(B, frB);
#ifdef DEBUG
printk("A: %ld %lu %lu %ld (%ld)\n", A_s, A_f1, A_f0, A_e, A_c);
@@ -39,7 +39,7 @@ fsubs(void *frD, void *frA, void *frB)
printk("D: %ld %lu %lu %ld (%ld)\n", R_s, R_f1, R_f0, R_e, R_c);
#endif
- __FP_PACK_DS(frD, R);
+ __FP_PACK_SEMIRAW_DS(frD, R);
return FP_CUR_EXCEPTIONS;
}
@@ -3,7 +3,7 @@
#include <asm/uaccess.h>
#include <asm/sfp-machine.h>
-#include <math-emu-old/double.h>
+#include <math-emu/double.h>
int
lfd(void *frD, void *ea)
@@ -3,9 +3,9 @@
#include <asm/uaccess.h>
#include <asm/sfp-machine.h>
-#include <math-emu-old/soft-fp.h>
-#include <math-emu-old/double.h>
-#include <math-emu-old/single.h>
+#include <math-emu/soft-fp.h>
+#include <math-emu/double.h>
+#include <math-emu/single.h>
int
lfs(void *frD, void *ea)
@@ -22,25 +22,20 @@ lfs(void *frD, void *ea)
if (copy_from_user(&f, ea, sizeof(float)))
return -EFAULT;
- FP_UNPACK_S(A, f);
+ FP_UNPACK_RAW_S(A, f);
#ifdef DEBUG
printk("A: %ld %lu %ld (%ld) [%08lx]\n", A_s, A_f, A_e, A_c,
*(unsigned long *)&f);
#endif
- FP_CONV(D, S, 2, 1, R, A);
+ _FP_EXTEND_CNAN(D, S, 2, 1, R, A, 0);
#ifdef DEBUG
printk("R: %ld %lu %lu %ld (%ld)\n", R_s, R_f1, R_f0, R_e, R_c);
#endif
- if (R_c == FP_CLS_NAN) {
- R_e = _FP_EXPMAX_D;
- _FP_PACK_RAW_2_P(D, frD, R);
- } else {
- __FP_PACK_D(frD, R);
- }
+ FP_PACK_RAW_DP(frD, R);
return 0;
}
@@ -10,7 +10,7 @@
#include <asm/switch_to.h>
#include <asm/sfp-machine.h>
-#include <math-emu-old/double.h>
+#include <math-emu/double.h>
#define FLOATFUNC(x) extern int x(void *, void *, void *, void *)
@@ -28,9 +28,9 @@
#define FP_EX_BOOKE_E500_SPE
#include <asm/sfp-machine.h>
-#include <math-emu-old/soft-fp.h>
-#include <math-emu-old/single.h>
-#include <math-emu-old/double.h>
+#include <math-emu/soft-fp.h>
+#include <math-emu/single.h>
+#include <math-emu/double.h>
#define EFAPU 0x4
@@ -99,6 +99,11 @@
#define XB 4
#define XCR 5
#define NOTYPE 0
+#define TYPE_MASK 7
+#define UNONE 0
+#define URAW 8
+#define USEMI 16
+#define UCOOK 24
#define SIGN_BIT_S (1UL << 31)
#define SIGN_BIT_D (1ULL << 63)
@@ -114,64 +119,64 @@ union dw_union {
static unsigned long insn_type(unsigned long speinsn)
{
- unsigned long ret = NOTYPE;
+ unsigned long ret = NOTYPE|UNONE;
switch (speinsn & 0x7ff) {
- case EFSABS: ret = XA; break;
- case EFSADD: ret = AB; break;
- case EFSCFD: ret = XB; break;
- case EFSCMPEQ: ret = XCR; break;
- case EFSCMPGT: ret = XCR; break;
- case EFSCMPLT: ret = XCR; break;
- case EFSCTSF: ret = XB; break;
- case EFSCTSI: ret = XB; break;
- case EFSCTSIZ: ret = XB; break;
- case EFSCTUF: ret = XB; break;
- case EFSCTUI: ret = XB; break;
- case EFSCTUIZ: ret = XB; break;
- case EFSDIV: ret = AB; break;
- case EFSMUL: ret = AB; break;
- case EFSNABS: ret = XA; break;
- case EFSNEG: ret = XA; break;
- case EFSSUB: ret = AB; break;
- case EFSCFSI: ret = XB; break;
-
- case EVFSABS: ret = XA; break;
- case EVFSADD: ret = AB; break;
- case EVFSCMPEQ: ret = XCR; break;
- case EVFSCMPGT: ret = XCR; break;
- case EVFSCMPLT: ret = XCR; break;
- case EVFSCTSF: ret = XB; break;
- case EVFSCTSI: ret = XB; break;
- case EVFSCTSIZ: ret = XB; break;
- case EVFSCTUF: ret = XB; break;
- case EVFSCTUI: ret = XB; break;
- case EVFSCTUIZ: ret = XB; break;
- case EVFSDIV: ret = AB; break;
- case EVFSMUL: ret = AB; break;
- case EVFSNABS: ret = XA; break;
- case EVFSNEG: ret = XA; break;
- case EVFSSUB: ret = AB; break;
-
- case EFDABS: ret = XA; break;
- case EFDADD: ret = AB; break;
- case EFDCFS: ret = XB; break;
- case EFDCMPEQ: ret = XCR; break;
- case EFDCMPGT: ret = XCR; break;
- case EFDCMPLT: ret = XCR; break;
- case EFDCTSF: ret = XB; break;
- case EFDCTSI: ret = XB; break;
- case EFDCTSIDZ: ret = XB; break;
- case EFDCTSIZ: ret = XB; break;
- case EFDCTUF: ret = XB; break;
- case EFDCTUI: ret = XB; break;
- case EFDCTUIDZ: ret = XB; break;
- case EFDCTUIZ: ret = XB; break;
- case EFDDIV: ret = AB; break;
- case EFDMUL: ret = AB; break;
- case EFDNABS: ret = XA; break;
- case EFDNEG: ret = XA; break;
- case EFDSUB: ret = AB; break;
+ case EFSABS: ret = XA|UNONE; break;
+ case EFSADD: ret = AB|USEMI; break;
+ case EFSCFD: ret = XB|UNONE; break;
+ case EFSCMPEQ: ret = XCR|URAW; break;
+ case EFSCMPGT: ret = XCR|URAW; break;
+ case EFSCMPLT: ret = XCR|URAW; break;
+ case EFSCTSF: ret = XB|URAW; break;
+ case EFSCTSI: ret = XB|URAW; break;
+ case EFSCTSIZ: ret = XB|URAW; break;
+ case EFSCTUF: ret = XB|URAW; break;
+ case EFSCTUI: ret = XB|URAW; break;
+ case EFSCTUIZ: ret = XB|URAW; break;
+ case EFSDIV: ret = AB|UCOOK; break;
+ case EFSMUL: ret = AB|UCOOK; break;
+ case EFSNABS: ret = XA|UNONE; break;
+ case EFSNEG: ret = XA|UNONE; break;
+ case EFSSUB: ret = AB|USEMI; break;
+ case EFSCFSI: ret = XB|UNONE; break;
+
+ case EVFSABS: ret = XA|UNONE; break;
+ case EVFSADD: ret = AB|USEMI; break;
+ case EVFSCMPEQ: ret = XCR|URAW; break;
+ case EVFSCMPGT: ret = XCR|URAW; break;
+ case EVFSCMPLT: ret = XCR|URAW; break;
+ case EVFSCTSF: ret = XB|URAW; break;
+ case EVFSCTSI: ret = XB|URAW; break;
+ case EVFSCTSIZ: ret = XB|URAW; break;
+ case EVFSCTUF: ret = XB|URAW; break;
+ case EVFSCTUI: ret = XB|URAW; break;
+ case EVFSCTUIZ: ret = XB|URAW; break;
+ case EVFSDIV: ret = AB|UCOOK; break;
+ case EVFSMUL: ret = AB|UCOOK; break;
+ case EVFSNABS: ret = XA|UNONE; break;
+ case EVFSNEG: ret = XA|UNONE; break;
+ case EVFSSUB: ret = AB|USEMI; break;
+
+ case EFDABS: ret = XA|UNONE; break;
+ case EFDADD: ret = AB|USEMI; break;
+ case EFDCFS: ret = XB|UNONE; break;
+ case EFDCMPEQ: ret = XCR|URAW; break;
+ case EFDCMPGT: ret = XCR|URAW; break;
+ case EFDCMPLT: ret = XCR|URAW; break;
+ case EFDCTSF: ret = XB|URAW; break;
+ case EFDCTSI: ret = XB|URAW; break;
+ case EFDCTSIDZ: ret = XB|URAW; break;
+ case EFDCTSIZ: ret = XB|URAW; break;
+ case EFDCTUF: ret = XB|URAW; break;
+ case EFDCTUI: ret = XB|URAW; break;
+ case EFDCTUIDZ: ret = XB|URAW; break;
+ case EFDCTUIZ: ret = XB|URAW; break;
+ case EFDDIV: ret = AB|UCOOK; break;
+ case EFDMUL: ret = AB|UCOOK; break;
+ case EFDNABS: ret = XA|UNONE; break;
+ case EFDNEG: ret = XA|UNONE; break;
+ case EFDSUB: ret = AB|USEMI; break;
}
return ret;
@@ -191,7 +196,7 @@ int do_spe_mathemu(struct pt_regs *regs)
return -EINVAL; /* not an spe instruction */
type = insn_type(speinsn);
- if (type == NOTYPE)
+ if (type == (NOTYPE|UNONE))
goto illegal;
func = speinsn & 0x7ff;
@@ -219,14 +224,18 @@ int do_spe_mathemu(struct pt_regs *regs)
FP_DECL_S(SA); FP_DECL_S(SB); FP_DECL_S(SR);
switch (type) {
- case AB:
- case XCR:
- FP_UNPACK_SP(SA, va.wp + 1);
- case XB:
- FP_UNPACK_SP(SB, vb.wp + 1);
+ case XCR|URAW:
+ FP_UNPACK_RAW_SP(SA, va.wp + 1);
+ case XB|URAW:
+ FP_UNPACK_RAW_SP(SB, vb.wp + 1);
+ break;
+ case AB|USEMI:
+ FP_UNPACK_SEMIRAW_SP(SA, va.wp + 1);
+ FP_UNPACK_SEMIRAW_SP(SB, vb.wp + 1);
break;
- case XA:
+ case AB|UCOOK:
FP_UNPACK_SP(SA, va.wp + 1);
+ FP_UNPACK_SP(SB, vb.wp + 1);
break;
}
@@ -248,11 +257,11 @@ int do_spe_mathemu(struct pt_regs *regs)
case EFSADD:
FP_ADD_S(SR, SA, SB);
- goto pack_s;
+ goto pack_semiraw_s;
case EFSSUB:
FP_SUB_S(SR, SA, SB);
- goto pack_s;
+ goto pack_semiraw_s;
case EFSMUL:
FP_MUL_S(SR, SA, SB);
@@ -288,14 +297,13 @@ int do_spe_mathemu(struct pt_regs *regs)
case EFSCFD: {
FP_DECL_D(DB);
- FP_CLEAR_EXCEPTIONS;
- FP_UNPACK_DP(DB, vb.dp);
+ FP_UNPACK_SEMIRAW_DP(DB, vb.dp);
- pr_debug("DB: %ld %08lx %08lx %ld (%ld)\n",
- DB_s, DB_f1, DB_f0, DB_e, DB_c);
+ pr_debug("DB: %ld %08lx %08lx %ld\n",
+ DB_s, DB_f1, DB_f0, DB_e);
- FP_CONV(S, D, 1, 2, SR, DB);
- goto pack_s;
+ FP_TRUNC(S, D, 1, 2, SR, DB);
+ goto pack_semiraw_s;
}
case EFSCTSI:
@@ -325,6 +333,12 @@ int do_spe_mathemu(struct pt_regs *regs)
}
break;
+pack_semiraw_s:
+ pr_debug("SR: %ld %08lx %ld\n", SR_s, SR_f, SR_e);
+
+ FP_PACK_SEMIRAW_SP(vc.wp + 1, SR);
+ goto update_regs;
+
pack_s:
pr_debug("SR: %ld %08lx %ld (%ld)\n", SR_s, SR_f, SR_e, SR_c);
@@ -332,9 +346,7 @@ pack_s:
goto update_regs;
cmp_s:
- FP_CMP_S(IR, SA, SB, 3);
- if (IR == 3 && (FP_ISSIGNAN_S(SA) || FP_ISSIGNAN_S(SB)))
- FP_SET_EXCEPTION(FP_EX_INVALID);
+ FP_CMP_S(IR, SA, SB, 3, 1);
if (IR == cmp) {
IR = 0x4;
} else {
@@ -347,14 +359,18 @@ cmp_s:
FP_DECL_D(DA); FP_DECL_D(DB); FP_DECL_D(DR);
switch (type) {
- case AB:
- case XCR:
- FP_UNPACK_DP(DA, va.dp);
- case XB:
- FP_UNPACK_DP(DB, vb.dp);
+ case XCR|URAW:
+ FP_UNPACK_RAW_DP(DA, va.dp);
+ case XB|URAW:
+ FP_UNPACK_RAW_DP(DB, vb.dp);
break;
- case XA:
+ case AB|USEMI:
+ FP_UNPACK_SEMIRAW_DP(DA, va.dp);
+ FP_UNPACK_SEMIRAW_DP(DB, vb.dp);
+ break;
+ case AB|UCOOK:
FP_UNPACK_DP(DA, va.dp);
+ FP_UNPACK_DP(DB, vb.dp);
break;
}
@@ -378,11 +394,11 @@ cmp_s:
case EFDADD:
FP_ADD_D(DR, DA, DB);
- goto pack_d;
+ goto pack_semiraw_d;
case EFDSUB:
FP_SUB_D(DR, DA, DB);
- goto pack_d;
+ goto pack_semiraw_d;
case EFDMUL:
FP_MUL_D(DR, DA, DB);
@@ -418,14 +434,13 @@ cmp_s:
case EFDCFS: {
FP_DECL_S(SB);
- FP_CLEAR_EXCEPTIONS;
- FP_UNPACK_SP(SB, vb.wp + 1);
+ FP_UNPACK_RAW_SP(SB, vb.wp + 1);
- pr_debug("SB: %ld %08lx %ld (%ld)\n",
- SB_s, SB_f, SB_e, SB_c);
+ pr_debug("SB: %ld %08lx %ld\n",
+ SB_s, SB_f, SB_e);
- FP_CONV(D, S, 2, 1, DR, SB);
- goto pack_d;
+ FP_EXTEND(D, S, 2, 1, DR, SB);
+ goto pack_raw_d;
}
case EFDCTUIDZ:
@@ -466,6 +481,20 @@ cmp_s:
}
break;
+pack_raw_d:
+ pr_debug("DR: %ld %08lx %08lx %ld\n",
+ DR_s, DR_f1, DR_f0, DR_e);
+
+ FP_PACK_RAW_DP(vc.dp, DR);
+ goto update_regs;
+
+pack_semiraw_d:
+ pr_debug("DR: %ld %08lx %08lx %ld\n",
+ DR_s, DR_f1, DR_f0, DR_e);
+
+ FP_PACK_SEMIRAW_DP(vc.dp, DR);
+ goto update_regs;
+
pack_d:
pr_debug("DR: %ld %08lx %08lx %ld (%ld)\n",
DR_s, DR_f1, DR_f0, DR_e, DR_c);
@@ -474,9 +503,7 @@ pack_d:
goto update_regs;
cmp_d:
- FP_CMP_D(IR, DA, DB, 3);
- if (IR == 3 && (FP_ISSIGNAN_D(DA) || FP_ISSIGNAN_D(DB)))
- FP_SET_EXCEPTION(FP_EX_INVALID);
+ FP_CMP_D(IR, DA, DB, 3, 1);
if (IR == cmp) {
IR = 0x4;
} else {
@@ -492,18 +519,25 @@ cmp_d:
int IR0, IR1;
switch (type) {
- case AB:
- case XCR:
+ case XCR|URAW:
+ FP_UNPACK_RAW_SP(SA0, va.wp);
+ FP_UNPACK_RAW_SP(SA1, va.wp + 1);
+ case XB|URAW:
+ FP_UNPACK_RAW_SP(SB0, vb.wp);
+ FP_UNPACK_RAW_SP(SB1, vb.wp + 1);
+ break;
+ case AB|USEMI:
+ FP_UNPACK_SEMIRAW_SP(SA0, va.wp);
+ FP_UNPACK_SEMIRAW_SP(SA1, va.wp + 1);
+ FP_UNPACK_SEMIRAW_SP(SB0, vb.wp);
+ FP_UNPACK_SEMIRAW_SP(SB1, vb.wp + 1);
+ break;
+ case AB|UCOOK:
FP_UNPACK_SP(SA0, va.wp);
FP_UNPACK_SP(SA1, va.wp + 1);
- case XB:
FP_UNPACK_SP(SB0, vb.wp);
FP_UNPACK_SP(SB1, vb.wp + 1);
break;
- case XA:
- FP_UNPACK_SP(SA0, va.wp);
- FP_UNPACK_SP(SA1, va.wp + 1);
- break;
}
pr_debug("SA0: %ld %08lx %ld (%ld)\n",
@@ -534,12 +568,12 @@ cmp_d:
case EVFSADD:
FP_ADD_S(SR0, SA0, SB0);
FP_ADD_S(SR1, SA1, SB1);
- goto pack_vs;
+ goto pack_semiraw_vs;
case EVFSSUB:
FP_SUB_S(SR0, SA0, SB0);
FP_SUB_S(SR1, SA1, SB1);
- goto pack_vs;
+ goto pack_semiraw_vs;
case EVFSMUL:
FP_MUL_S(SR0, SA0, SB0);
@@ -624,6 +658,16 @@ cmp_d:
}
break;
+pack_semiraw_vs:
+ pr_debug("SR0: %ld %08lx %ld\n",
+ SR0_s, SR0_f, SR0_e);
+ pr_debug("SR1: %ld %08lx %ld\n",
+ SR1_s, SR1_f, SR1_e);
+
+ FP_PACK_SEMIRAW_SP(vc.wp, SR0);
+ FP_PACK_SEMIRAW_SP(vc.wp + 1, SR1);
+ goto update_regs;
+
pack_vs:
pr_debug("SR0: %ld %08lx %ld (%ld)\n",
SR0_s, SR0_f, SR0_e, SR0_c);
@@ -638,12 +682,8 @@ cmp_vs:
{
int ch, cl;
- FP_CMP_S(IR0, SA0, SB0, 3);
- FP_CMP_S(IR1, SA1, SB1, 3);
- if (IR0 == 3 && (FP_ISSIGNAN_S(SA0) || FP_ISSIGNAN_S(SB0)))
- FP_SET_EXCEPTION(FP_EX_INVALID);
- if (IR1 == 3 && (FP_ISSIGNAN_S(SA1) || FP_ISSIGNAN_S(SB1)))
- FP_SET_EXCEPTION(FP_EX_INVALID);
+ FP_CMP_S(IR0, SA0, SB0, 3, 1);
+ FP_CMP_S(IR1, SA1, SB1, 3, 1);
ch = (IR0 == cmp) ? 1 : 0;
cl = (IR1 == cmp) ? 1 : 0;
IR = (ch << 3) | (cl << 2) | ((ch | cl) << 1) |
@@ -737,7 +777,7 @@ int speround_handler(struct pt_regs *regs)
return -EINVAL; /* not an spe instruction */
func = speinsn & 0x7ff;
- type = insn_type(func);
+ type = insn_type(func) & TYPE_MASK;
if (type == XCR) return -ENOSYS;
__FPU_FPSCR = mfspr(SPRN_SPEFSCR);
@@ -3,7 +3,7 @@
#include <asm/uaccess.h>
#include <asm/sfp-machine.h>
-#include <math-emu-old/soft-fp.h>
+#include <math-emu/soft-fp.h>
int
mcrfs(u32 *ccr, u32 crfD, u32 crfS)
@@ -3,7 +3,7 @@
#include <asm/uaccess.h>
#include <asm/sfp-machine.h>
-#include <math-emu-old/soft-fp.h>
+#include <math-emu/soft-fp.h>
int
mffs(u32 *frD)
@@ -3,7 +3,7 @@
#include <asm/uaccess.h>
#include <asm/sfp-machine.h>
-#include <math-emu-old/soft-fp.h>
+#include <math-emu/soft-fp.h>
int
mtfsb0(int crbD)
@@ -3,7 +3,7 @@
#include <asm/uaccess.h>
#include <asm/sfp-machine.h>
-#include <math-emu-old/soft-fp.h>
+#include <math-emu/soft-fp.h>
int
mtfsb1(int crbD)
@@ -3,7 +3,7 @@
#include <asm/uaccess.h>
#include <asm/sfp-machine.h>
-#include <math-emu-old/soft-fp.h>
+#include <math-emu/soft-fp.h>
int
mtfsf(unsigned int FM, u32 *frB)
@@ -3,7 +3,7 @@
#include <asm/uaccess.h>
#include <asm/sfp-machine.h>
-#include <math-emu-old/soft-fp.h>
+#include <math-emu/soft-fp.h>
int
mtfsfi(unsigned int crfD, unsigned int IMM)
@@ -3,9 +3,9 @@
#include <asm/uaccess.h>
#include <asm/sfp-machine.h>
-#include <math-emu-old/soft-fp.h>
-#include <math-emu-old/double.h>
-#include <math-emu-old/single.h>
+#include <math-emu/soft-fp.h>
+#include <math-emu/double.h>
+#include <math-emu/single.h>
int
stfs(void *frS, void *ea)
@@ -19,19 +19,19 @@ stfs(void *frS, void *ea)
printk("%s: S %p, ea %p\n", __func__, frS, ea);
#endif
- FP_UNPACK_DP(A, frS);
+ FP_UNPACK_SEMIRAW_DP(A, frS);
#ifdef DEBUG
printk("A: %ld %lu %lu %ld (%ld)\n", A_s, A_f1, A_f0, A_e, A_c);
#endif
- FP_CONV(S, D, 1, 2, R, A);
+ FP_TRUNC(S, D, 1, 2, R, A);
#ifdef DEBUG
printk("R: %ld %lu %ld (%ld)\n", R_s, R_f, R_e, R_c);
#endif
- _FP_PACK_CANONICAL(S, 1, R);
+ _FP_PACK_SEMIRAW(S, 1, R);
if (!FP_CUR_EXCEPTIONS || !__FPU_TRAP_P(FP_CUR_EXCEPTIONS)) {
_FP_PACK_RAW_1_P(S, &f, R);
if (copy_to_user(ea, &f, sizeof(float)))
@@ -1,6 +1,6 @@
/* This has so very few changes over libgcc2's __udivmoddi4 it isn't funny. */
-#include <math-emu-old/soft-fp.h>
+#include <math-emu/soft-fp.h>
#undef count_leading_zeros
#define count_leading_zeros __FP_CLZ