Loading arch/mips/math-emu/dp_sqrt.c +3 −3 Original line number Diff line number Diff line Loading @@ -110,13 +110,13 @@ union ieee754dp ieee754dp_sqrt(union ieee754dp x) /* triple to almost 56 sig. bits: y ~= sqrt(x) to within 1 ulp */ /* t=y*y; z=t; pt[n0]+=0x00100000; t+=z; z=(x-z)*y; */ z = t = ieee754dp_mul(y, y); t.parts.bexp += 0x001; t.bexp += 0x001; t = ieee754dp_add(t, z); z = ieee754dp_mul(ieee754dp_sub(x, z), y); /* t=z/(t+x) ; pt[n0]+=0x00100000; y+=t; */ t = ieee754dp_div(z, ieee754dp_add(t, x)); t.parts.bexp += 0x001; t.bexp += 0x001; y = ieee754dp_add(y, t); /* twiddle last bit to force y correctly rounded */ Loading Loading @@ -155,7 +155,7 @@ union ieee754dp ieee754dp_sqrt(union ieee754dp x) } /* py[n0]=py[n0]+scalx; ...scale back y */ y.parts.bexp += scalx; y.bexp += scalx; /* restore rounding mode, possibly set inexact */ ieee754_csr = oldcsr; Loading arch/mips/math-emu/ieee754.c +42 −43 Original line number Diff line number Diff line Loading @@ -30,64 +30,63 @@ #include <linux/compiler.h> #include "ieee754int.h" #include "ieee754.h" #include "ieee754sp.h" #include "ieee754dp.h" /* special constants */ #define DPSTR(s, b, mh, ml) \ #define DPCNST(s, b, m) \ { \ .sign = (s), \ .bexp = (b), \ .manthi = (mh), \ .mantlo = (ml) \ .bexp = (b) + DP_EBIAS, \ .mant = (m) \ } const struct ieee754dp_const __ieee754dp_spcvals[] = { DPSTR(0, DP_EMIN - 1 + DP_EBIAS, 0, 0), /* + zero */ DPSTR(1, DP_EMIN - 1 + DP_EBIAS, 0, 0), /* - zero */ DPSTR(0, DP_EBIAS, 0, 0), /* + 1.0 */ DPSTR(1, DP_EBIAS, 0, 0), /* - 1.0 */ DPSTR(0, 3 + DP_EBIAS, 0x40000, 0), /* + 10.0 */ DPSTR(1, 3 + DP_EBIAS, 0x40000, 0), /* - 10.0 */ DPSTR(0, DP_EMAX + 1 + DP_EBIAS, 0, 0), /* + infinity */ DPSTR(1, DP_EMAX + 1 + DP_EBIAS, 0, 0), /* - infinity */ DPSTR(0, DP_EMAX+1+DP_EBIAS, 0x7FFFF, 0xFFFFFFFF), /* + indef quiet Nan */ DPSTR(0, DP_EMAX + DP_EBIAS, 0xFFFFF, 0xFFFFFFFF), /* + max */ DPSTR(1, DP_EMAX + DP_EBIAS, 0xFFFFF, 0xFFFFFFFF), /* - max */ DPSTR(0, DP_EMIN + DP_EBIAS, 0, 0), /* + min normal */ DPSTR(1, DP_EMIN + DP_EBIAS, 0, 0), /* - min normal */ DPSTR(0, DP_EMIN - 1 + DP_EBIAS, 0, 1), /* + min denormal */ DPSTR(1, DP_EMIN - 1 + DP_EBIAS, 0, 1), /* - min denormal */ DPSTR(0, 31 + DP_EBIAS, 0, 0), /* + 1.0e31 */ DPSTR(0, 63 + DP_EBIAS, 0, 0), /* + 1.0e63 */ const union ieee754dp __ieee754dp_spcvals[] = { DPCNST(0, DP_EMIN - 1, 0x0000000000000ULL), /* + zero */ DPCNST(1, DP_EMIN - 1, 0x0000000000000ULL), /* - zero */ DPCNST(0, 0, 0x0000000000000ULL), /* + 1.0 */ DPCNST(1, 0, 0x0000000000000ULL), /* - 1.0 */ DPCNST(0, 3, 0x4000000000000ULL), /* + 10.0 */ DPCNST(1, 3, 0x4000000000000ULL), /* - 10.0 */ DPCNST(0, DP_EMAX + 1, 0x0000000000000ULL), /* + infinity */ DPCNST(1, DP_EMAX + 1, 0x0000000000000ULL), /* - infinity */ DPCNST(0, DP_EMAX + 1, 0x7FFFFFFFFFFFFULL), /* + indef quiet Nan */ DPCNST(0, DP_EMAX, 0xFFFFFFFFFFFFFULL), /* + max */ DPCNST(1, DP_EMAX, 0xFFFFFFFFFFFFFULL), /* - max */ DPCNST(0, DP_EMIN, 0x0000000000000ULL), /* + min normal */ DPCNST(1, DP_EMIN, 0x0000000000000ULL), /* - min normal */ DPCNST(0, DP_EMIN - 1, 0x0000000000001ULL), /* + min denormal */ DPCNST(1, DP_EMIN - 1, 0x0000000000001ULL), /* - min denormal */ DPCNST(0, 31, 0x0000000000000ULL), /* + 1.0e31 */ DPCNST(0, 63, 0x0000000000000ULL), /* + 1.0e63 */ }; #define SPSTR(s, b, m) \ #define SPCNST(s, b, m) \ { \ .sign = (s), \ .bexp = (b), \ .bexp = (b) + SP_EBIAS, \ .mant = (m) \ } const struct ieee754sp_const __ieee754sp_spcvals[] = { SPSTR(0, SP_EMIN - 1 + SP_EBIAS, 0), /* + zero */ SPSTR(1, SP_EMIN - 1 + SP_EBIAS, 0), /* - zero */ SPSTR(0, SP_EBIAS, 0), /* + 1.0 */ SPSTR(1, SP_EBIAS, 0), /* - 1.0 */ SPSTR(0, 3 + SP_EBIAS, 0x200000), /* + 10.0 */ SPSTR(1, 3 + SP_EBIAS, 0x200000), /* - 10.0 */ SPSTR(0, SP_EMAX + 1 + SP_EBIAS, 0), /* + infinity */ SPSTR(1, SP_EMAX + 1 + SP_EBIAS, 0), /* - infinity */ SPSTR(0, SP_EMAX+1+SP_EBIAS, 0x3FFFFF), /* + indef quiet Nan */ SPSTR(0, SP_EMAX + SP_EBIAS, 0x7FFFFF), /* + max normal */ SPSTR(1, SP_EMAX + SP_EBIAS, 0x7FFFFF), /* - max normal */ SPSTR(0, SP_EMIN + SP_EBIAS, 0), /* + min normal */ SPSTR(1, SP_EMIN + SP_EBIAS, 0), /* - min normal */ SPSTR(0, SP_EMIN - 1 + SP_EBIAS, 1), /* + min denormal */ SPSTR(1, SP_EMIN - 1 + SP_EBIAS, 1), /* - min denormal */ SPSTR(0, 31 + SP_EBIAS, 0), /* + 1.0e31 */ SPSTR(0, 63 + SP_EBIAS, 0), /* + 1.0e63 */ const union ieee754sp __ieee754sp_spcvals[] = { SPCNST(0, SP_EMIN - 1, 0x000000), /* + zero */ SPCNST(1, SP_EMIN - 1, 0x000000), /* - zero */ SPCNST(0, 0, 0x000000), /* + 1.0 */ SPCNST(1, 0, 0x000000), /* - 1.0 */ SPCNST(0, 3, 0x200000), /* + 10.0 */ SPCNST(1, 3, 0x200000), /* - 10.0 */ SPCNST(0, SP_EMAX + 1, 0x000000), /* + infinity */ SPCNST(1, SP_EMAX + 1, 0x000000), /* - infinity */ SPCNST(0, SP_EMAX + 1, 0x3FFFFF), /* + indef quiet Nan */ SPCNST(0, SP_EMAX, 0x7FFFFF), /* + max normal */ SPCNST(1, SP_EMAX, 0x7FFFFF), /* - max normal */ SPCNST(0, SP_EMIN, 0x000000), /* + min normal */ SPCNST(1, SP_EMIN, 0x000000), /* - min normal */ SPCNST(0, SP_EMIN - 1, 0x000001), /* + min denormal */ SPCNST(1, SP_EMIN - 1, 0x000001), /* - min denormal */ SPCNST(0, 31, 0x000000), /* + 1.0e31 */ SPCNST(0, 63, 0x000000), /* + 1.0e63 */ }; arch/mips/math-emu/ieee754.h +9 −22 Original line number Diff line number Diff line Loading @@ -31,36 +31,23 @@ #include <linux/sched.h> #include <asm/bitfield.h> struct ieee754dp_const { __BITFIELD_FIELD(unsigned sign:1, __BITFIELD_FIELD(unsigned bexp:11, __BITFIELD_FIELD(unsigned manthi:20, __BITFIELD_FIELD(unsigned mantlo:32, ;)))) }; union ieee754dp { struct ieee754dp_const oparts; struct { __BITFIELD_FIELD(unsigned int sign:1, __BITFIELD_FIELD(unsigned int bexp:11, __BITFIELD_FIELD(u64 mant:52, ;))) } parts; double d; }; u64 bits; }; struct ieee754sp_const { union ieee754sp { struct { __BITFIELD_FIELD(unsigned sign:1, __BITFIELD_FIELD(unsigned bexp:8, __BITFIELD_FIELD(unsigned mant:23, ;))) }; union ieee754sp { struct ieee754sp_const parts; float f; u32 bits; }; Loading Loading @@ -299,8 +286,8 @@ union ieee754dp ieee754dp_dump(char *s, union ieee754dp x); #define IEEE754_SPCVAL_P1E31 15 /* + 1.0e31 */ #define IEEE754_SPCVAL_P1E63 16 /* + 1.0e63 */ extern const struct ieee754dp_const __ieee754dp_spcvals[]; extern const struct ieee754sp_const __ieee754sp_spcvals[]; extern const union ieee754dp __ieee754dp_spcvals[]; extern const union ieee754sp __ieee754sp_spcvals[]; #define ieee754dp_spcvals ((const union ieee754dp *)__ieee754dp_spcvals) #define ieee754sp_spcvals ((const union ieee754sp *)__ieee754sp_spcvals) Loading arch/mips/math-emu/ieee754dp.h +7 −6 Original line number Diff line number Diff line Loading @@ -40,9 +40,9 @@ #define DP_HIDDEN_BIT DP_MBIT(DP_FBITS) #define DP_SIGN_BIT DP_MBIT(63) #define DPSIGN(dp) (dp.parts.sign) #define DPBEXP(dp) (dp.parts.bexp) #define DPMANT(dp) (dp.parts.mant) #define DPSIGN(dp) (dp.sign) #define DPBEXP(dp) (dp.bexp) #define DPMANT(dp) (dp.mant) static inline int ieee754dp_finite(union ieee754dp x) { Loading Loading @@ -74,9 +74,10 @@ static inline union ieee754dp builddp(int s, int bx, u64 m) && (bx) <= DP_EMAX + 1 + DP_EBIAS); assert(((m) >> DP_FBITS) == 0); r.parts.sign = s; r.parts.bexp = bx; r.parts.mant = m; r.sign = s; r.bexp = bx; r.mant = m; return r; } Loading arch/mips/math-emu/ieee754sp.h +6 −6 Original line number Diff line number Diff line Loading @@ -40,9 +40,9 @@ #define SP_HIDDEN_BIT SP_MBIT(SP_FBITS) #define SP_SIGN_BIT SP_MBIT(31) #define SPSIGN(sp) (sp.parts.sign) #define SPBEXP(sp) (sp.parts.bexp) #define SPMANT(sp) (sp.parts.mant) #define SPSIGN(sp) (sp.sign) #define SPBEXP(sp) (sp.bexp) #define SPMANT(sp) (sp.mant) static inline int ieee754sp_finite(union ieee754sp x) { Loading Loading @@ -79,9 +79,9 @@ static inline union ieee754sp buildsp(int s, int bx, unsigned m) && (bx) <= SP_EMAX + 1 + SP_EBIAS); assert(((m) >> SP_FBITS) == 0); r.parts.sign = s; r.parts.bexp = bx; r.parts.mant = m; r.sign = s; r.bexp = bx; r.mant = m; return r; } Loading Loading
arch/mips/math-emu/dp_sqrt.c +3 −3 Original line number Diff line number Diff line Loading @@ -110,13 +110,13 @@ union ieee754dp ieee754dp_sqrt(union ieee754dp x) /* triple to almost 56 sig. bits: y ~= sqrt(x) to within 1 ulp */ /* t=y*y; z=t; pt[n0]+=0x00100000; t+=z; z=(x-z)*y; */ z = t = ieee754dp_mul(y, y); t.parts.bexp += 0x001; t.bexp += 0x001; t = ieee754dp_add(t, z); z = ieee754dp_mul(ieee754dp_sub(x, z), y); /* t=z/(t+x) ; pt[n0]+=0x00100000; y+=t; */ t = ieee754dp_div(z, ieee754dp_add(t, x)); t.parts.bexp += 0x001; t.bexp += 0x001; y = ieee754dp_add(y, t); /* twiddle last bit to force y correctly rounded */ Loading Loading @@ -155,7 +155,7 @@ union ieee754dp ieee754dp_sqrt(union ieee754dp x) } /* py[n0]=py[n0]+scalx; ...scale back y */ y.parts.bexp += scalx; y.bexp += scalx; /* restore rounding mode, possibly set inexact */ ieee754_csr = oldcsr; Loading
arch/mips/math-emu/ieee754.c +42 −43 Original line number Diff line number Diff line Loading @@ -30,64 +30,63 @@ #include <linux/compiler.h> #include "ieee754int.h" #include "ieee754.h" #include "ieee754sp.h" #include "ieee754dp.h" /* special constants */ #define DPSTR(s, b, mh, ml) \ #define DPCNST(s, b, m) \ { \ .sign = (s), \ .bexp = (b), \ .manthi = (mh), \ .mantlo = (ml) \ .bexp = (b) + DP_EBIAS, \ .mant = (m) \ } const struct ieee754dp_const __ieee754dp_spcvals[] = { DPSTR(0, DP_EMIN - 1 + DP_EBIAS, 0, 0), /* + zero */ DPSTR(1, DP_EMIN - 1 + DP_EBIAS, 0, 0), /* - zero */ DPSTR(0, DP_EBIAS, 0, 0), /* + 1.0 */ DPSTR(1, DP_EBIAS, 0, 0), /* - 1.0 */ DPSTR(0, 3 + DP_EBIAS, 0x40000, 0), /* + 10.0 */ DPSTR(1, 3 + DP_EBIAS, 0x40000, 0), /* - 10.0 */ DPSTR(0, DP_EMAX + 1 + DP_EBIAS, 0, 0), /* + infinity */ DPSTR(1, DP_EMAX + 1 + DP_EBIAS, 0, 0), /* - infinity */ DPSTR(0, DP_EMAX+1+DP_EBIAS, 0x7FFFF, 0xFFFFFFFF), /* + indef quiet Nan */ DPSTR(0, DP_EMAX + DP_EBIAS, 0xFFFFF, 0xFFFFFFFF), /* + max */ DPSTR(1, DP_EMAX + DP_EBIAS, 0xFFFFF, 0xFFFFFFFF), /* - max */ DPSTR(0, DP_EMIN + DP_EBIAS, 0, 0), /* + min normal */ DPSTR(1, DP_EMIN + DP_EBIAS, 0, 0), /* - min normal */ DPSTR(0, DP_EMIN - 1 + DP_EBIAS, 0, 1), /* + min denormal */ DPSTR(1, DP_EMIN - 1 + DP_EBIAS, 0, 1), /* - min denormal */ DPSTR(0, 31 + DP_EBIAS, 0, 0), /* + 1.0e31 */ DPSTR(0, 63 + DP_EBIAS, 0, 0), /* + 1.0e63 */ const union ieee754dp __ieee754dp_spcvals[] = { DPCNST(0, DP_EMIN - 1, 0x0000000000000ULL), /* + zero */ DPCNST(1, DP_EMIN - 1, 0x0000000000000ULL), /* - zero */ DPCNST(0, 0, 0x0000000000000ULL), /* + 1.0 */ DPCNST(1, 0, 0x0000000000000ULL), /* - 1.0 */ DPCNST(0, 3, 0x4000000000000ULL), /* + 10.0 */ DPCNST(1, 3, 0x4000000000000ULL), /* - 10.0 */ DPCNST(0, DP_EMAX + 1, 0x0000000000000ULL), /* + infinity */ DPCNST(1, DP_EMAX + 1, 0x0000000000000ULL), /* - infinity */ DPCNST(0, DP_EMAX + 1, 0x7FFFFFFFFFFFFULL), /* + indef quiet Nan */ DPCNST(0, DP_EMAX, 0xFFFFFFFFFFFFFULL), /* + max */ DPCNST(1, DP_EMAX, 0xFFFFFFFFFFFFFULL), /* - max */ DPCNST(0, DP_EMIN, 0x0000000000000ULL), /* + min normal */ DPCNST(1, DP_EMIN, 0x0000000000000ULL), /* - min normal */ DPCNST(0, DP_EMIN - 1, 0x0000000000001ULL), /* + min denormal */ DPCNST(1, DP_EMIN - 1, 0x0000000000001ULL), /* - min denormal */ DPCNST(0, 31, 0x0000000000000ULL), /* + 1.0e31 */ DPCNST(0, 63, 0x0000000000000ULL), /* + 1.0e63 */ }; #define SPSTR(s, b, m) \ #define SPCNST(s, b, m) \ { \ .sign = (s), \ .bexp = (b), \ .bexp = (b) + SP_EBIAS, \ .mant = (m) \ } const struct ieee754sp_const __ieee754sp_spcvals[] = { SPSTR(0, SP_EMIN - 1 + SP_EBIAS, 0), /* + zero */ SPSTR(1, SP_EMIN - 1 + SP_EBIAS, 0), /* - zero */ SPSTR(0, SP_EBIAS, 0), /* + 1.0 */ SPSTR(1, SP_EBIAS, 0), /* - 1.0 */ SPSTR(0, 3 + SP_EBIAS, 0x200000), /* + 10.0 */ SPSTR(1, 3 + SP_EBIAS, 0x200000), /* - 10.0 */ SPSTR(0, SP_EMAX + 1 + SP_EBIAS, 0), /* + infinity */ SPSTR(1, SP_EMAX + 1 + SP_EBIAS, 0), /* - infinity */ SPSTR(0, SP_EMAX+1+SP_EBIAS, 0x3FFFFF), /* + indef quiet Nan */ SPSTR(0, SP_EMAX + SP_EBIAS, 0x7FFFFF), /* + max normal */ SPSTR(1, SP_EMAX + SP_EBIAS, 0x7FFFFF), /* - max normal */ SPSTR(0, SP_EMIN + SP_EBIAS, 0), /* + min normal */ SPSTR(1, SP_EMIN + SP_EBIAS, 0), /* - min normal */ SPSTR(0, SP_EMIN - 1 + SP_EBIAS, 1), /* + min denormal */ SPSTR(1, SP_EMIN - 1 + SP_EBIAS, 1), /* - min denormal */ SPSTR(0, 31 + SP_EBIAS, 0), /* + 1.0e31 */ SPSTR(0, 63 + SP_EBIAS, 0), /* + 1.0e63 */ const union ieee754sp __ieee754sp_spcvals[] = { SPCNST(0, SP_EMIN - 1, 0x000000), /* + zero */ SPCNST(1, SP_EMIN - 1, 0x000000), /* - zero */ SPCNST(0, 0, 0x000000), /* + 1.0 */ SPCNST(1, 0, 0x000000), /* - 1.0 */ SPCNST(0, 3, 0x200000), /* + 10.0 */ SPCNST(1, 3, 0x200000), /* - 10.0 */ SPCNST(0, SP_EMAX + 1, 0x000000), /* + infinity */ SPCNST(1, SP_EMAX + 1, 0x000000), /* - infinity */ SPCNST(0, SP_EMAX + 1, 0x3FFFFF), /* + indef quiet Nan */ SPCNST(0, SP_EMAX, 0x7FFFFF), /* + max normal */ SPCNST(1, SP_EMAX, 0x7FFFFF), /* - max normal */ SPCNST(0, SP_EMIN, 0x000000), /* + min normal */ SPCNST(1, SP_EMIN, 0x000000), /* - min normal */ SPCNST(0, SP_EMIN - 1, 0x000001), /* + min denormal */ SPCNST(1, SP_EMIN - 1, 0x000001), /* - min denormal */ SPCNST(0, 31, 0x000000), /* + 1.0e31 */ SPCNST(0, 63, 0x000000), /* + 1.0e63 */ };
arch/mips/math-emu/ieee754.h +9 −22 Original line number Diff line number Diff line Loading @@ -31,36 +31,23 @@ #include <linux/sched.h> #include <asm/bitfield.h> struct ieee754dp_const { __BITFIELD_FIELD(unsigned sign:1, __BITFIELD_FIELD(unsigned bexp:11, __BITFIELD_FIELD(unsigned manthi:20, __BITFIELD_FIELD(unsigned mantlo:32, ;)))) }; union ieee754dp { struct ieee754dp_const oparts; struct { __BITFIELD_FIELD(unsigned int sign:1, __BITFIELD_FIELD(unsigned int bexp:11, __BITFIELD_FIELD(u64 mant:52, ;))) } parts; double d; }; u64 bits; }; struct ieee754sp_const { union ieee754sp { struct { __BITFIELD_FIELD(unsigned sign:1, __BITFIELD_FIELD(unsigned bexp:8, __BITFIELD_FIELD(unsigned mant:23, ;))) }; union ieee754sp { struct ieee754sp_const parts; float f; u32 bits; }; Loading Loading @@ -299,8 +286,8 @@ union ieee754dp ieee754dp_dump(char *s, union ieee754dp x); #define IEEE754_SPCVAL_P1E31 15 /* + 1.0e31 */ #define IEEE754_SPCVAL_P1E63 16 /* + 1.0e63 */ extern const struct ieee754dp_const __ieee754dp_spcvals[]; extern const struct ieee754sp_const __ieee754sp_spcvals[]; extern const union ieee754dp __ieee754dp_spcvals[]; extern const union ieee754sp __ieee754sp_spcvals[]; #define ieee754dp_spcvals ((const union ieee754dp *)__ieee754dp_spcvals) #define ieee754sp_spcvals ((const union ieee754sp *)__ieee754sp_spcvals) Loading
arch/mips/math-emu/ieee754dp.h +7 −6 Original line number Diff line number Diff line Loading @@ -40,9 +40,9 @@ #define DP_HIDDEN_BIT DP_MBIT(DP_FBITS) #define DP_SIGN_BIT DP_MBIT(63) #define DPSIGN(dp) (dp.parts.sign) #define DPBEXP(dp) (dp.parts.bexp) #define DPMANT(dp) (dp.parts.mant) #define DPSIGN(dp) (dp.sign) #define DPBEXP(dp) (dp.bexp) #define DPMANT(dp) (dp.mant) static inline int ieee754dp_finite(union ieee754dp x) { Loading Loading @@ -74,9 +74,10 @@ static inline union ieee754dp builddp(int s, int bx, u64 m) && (bx) <= DP_EMAX + 1 + DP_EBIAS); assert(((m) >> DP_FBITS) == 0); r.parts.sign = s; r.parts.bexp = bx; r.parts.mant = m; r.sign = s; r.bexp = bx; r.mant = m; return r; } Loading
arch/mips/math-emu/ieee754sp.h +6 −6 Original line number Diff line number Diff line Loading @@ -40,9 +40,9 @@ #define SP_HIDDEN_BIT SP_MBIT(SP_FBITS) #define SP_SIGN_BIT SP_MBIT(31) #define SPSIGN(sp) (sp.parts.sign) #define SPBEXP(sp) (sp.parts.bexp) #define SPMANT(sp) (sp.parts.mant) #define SPSIGN(sp) (sp.sign) #define SPBEXP(sp) (sp.bexp) #define SPMANT(sp) (sp.mant) static inline int ieee754sp_finite(union ieee754sp x) { Loading Loading @@ -79,9 +79,9 @@ static inline union ieee754sp buildsp(int s, int bx, unsigned m) && (bx) <= SP_EMAX + 1 + SP_EBIAS); assert(((m) >> SP_FBITS) == 0); r.parts.sign = s; r.parts.bexp = bx; r.parts.mant = m; r.sign = s; r.bexp = bx; r.mant = m; return r; } Loading