lib: div64: sync with Linux
PATCH 1/1 lib: div64: sync with Linux
Sync with Linux commit ad0376eb1483b ("Merge tag 'edac_for_4.11_2'").
--- include/linux/math64.h | 172 +++++++++++++++++++++++++++++++++++++++++++++++++ lib/div64.c | 141 ++++++++++++++++++++++++++++++++++++++-- 2 files changed, 308 insertions(+), 5 deletions(-)
include/linux/math64.h +172 -0
@@ -1,10 +1,15 @@#ifndef _LINUX_MATH64_H#define _LINUX_MATH64_H +#include <div64.h> +#include <linux/bitops.h> #include <linux/types.h> #if BITS_PER_LONG ==64 +#define div64_long (x, y) div64_s64((x), (y)) +#define div64_ul (x, y) div64_u64((x), (y)) +/** * div_u64_rem - unsigned 64bit divide with 32bit divisor with remainder *
@@ -27,6 +32,15 @@ static inline s64 div_s64_rem(s64 dividend, s32 divisor, s32 *remainder) }/** +* div64_u64_rem - unsigned 64bit divide with 64bit divisor and remainder +*/ +static inline u64 div64_u64_rem (u64 dividend,u64 divisor,u64 *remainder) +{ + *remainder = dividend % divisor; +return dividend / divisor; +} + +/** * div64_u64 - unsigned 64bit divide with 64bit divisor */ static inline u64 div64_u64 (u64 dividend,u64 divisor)
@@ -34,8 +48,19 @@ static inline u64 div64_u64(u64 dividend, u64 divisor) return dividend / divisor; } +/** +* div64_s64 - signed 64bit divide with 64bit divisor +*/ +static inline s64 div64_s64 (s64 dividend,s64 divisor) +{ +return dividend / divisor; +} +#elif BITS_PER_LONG == 32 +#define div64_long (x, y) div_s64((x), (y)) +#define div64_ul (x, y) div_u64((x), (y)) +#ifndef div_u64_remstatic inline u64 div_u64_rem (u64 dividend,u32 divisor,u32 *remainder) {
@@ -48,10 +73,18 @@ static inline u64 div_u64_rem(u64 dividend, u32 divisor, u32 *remainder)extern s64 div_s64_rem (s64 dividend,s32 divisor,s32 *remainder);#endif +#ifndef div64_u64_rem +extern u64 div64_u64_rem (u64 dividend,u64 divisor,u64 *remainder); +#endif +#ifndef div64_u64extern u64 div64_u64 (u64 dividend,u64 divisor);#endif +#ifndef div64_s64 +extern s64 div64_s64 (s64 dividend,s64 divisor); +#endif +#endif /* BITS_PER_LONG */ /**
@@ -82,4 +115,143 @@ static inline s64 div_s64(s64 dividend, s32 divisor)u32 iter_div_u64_rem (u64 dividend,u32 divisor,u64 *remainder); +static __always_inline u32 +__iter_div_u64_rem (u64 dividend,u32 divisor,u64 *remainder) +{ +u32 ret =0 ; + +while (dividend >= divisor) { +/* The following asm() prevents the compiler from +optimising this loop into a modulo operation. */ + asm("" :"+rm" (dividend)); + + dividend -= divisor; + ret++; + } + + *remainder = dividend; + +return ret; +} + +#ifndef mul_u32_u32 +/* +* Many a GCC version messes this up and generates a 64x64 mult :-( +*/ +static inline u64 mul_u32_u32 (u32 a,u32 b) +{ +return (u64 )a * b; +} +#endif + +#if defined(CONFIG_ARCH_SUPPORTS_INT128 ) && defined(__SIZEOF_INT128__) + +#ifndef mul_u64_u32_shr +static inline u64 mul_u64_u32_shr (u64 a,u32 mul,unsigned int shift) +{ +return (u64)(((unsigned __int128 )a * mul) >> shift); +} +#endif /* mul_u64_u32_shr */ + +#ifndef mul_u64_u64_shr +static inline u64 mul_u64_u64_shr (u64 a,u64 mul,unsigned int shift) +{ +return (u64)(((unsigned __int128 )a * mul) >> shift); +} +#endif /* mul_u64_u64_shr */ + +#else + +#ifndef mul_u64_u32_shr +static inline u64 mul_u64_u32_shr (u64 a,u32 mul,unsigned int shift) +{ +u32 ah, al; +u64 ret; + + al = a; + ah = a >>32 ; + + ret =mul_u32_u32 (al, mul) >> shift; +if (ah) + ret +=mul_u32_u32 (ah, mul) << (32 - shift); + +return ret; +} +#endif /* mul_u64_u32_shr */ + +#ifndef mul_u64_u64_shr +static inline u64 mul_u64_u64_shr (u64 a,u64 b,unsigned int shift) +{ +union { +u64 ll; +struct { +#ifdef __BIG_ENDIAN +u32 high, low; +#else +u32 low, high; +#endif + } l; + } rl, rm, rn, rh, a0, b0; +u64 c; + + a0.ll = a; + b0.ll = b; + + rl.ll =mul_u32_u32 (a0.l.low, b0.l.low); + rm.ll =mul_u32_u32 (a0.l.low, b0.l.high); + rn.ll =mul_u32_u32 (a0.l.high, b0.l.low); + rh.ll =mul_u32_u32 (a0.l.high, b0.l.high); + +/* +* Each of these lines computes a 64-bit intermediate result into "c", +* starting@bits 32-95. The low 32-bits go into the result of the +* multiplication, the high 32-bits are carried into the next step. +*/ + rl.l.high = c = (u64 )rl.l.high + rm.l.low + rn.l.low; + rh.l.low = c = (c >>32 ) + rm.l.high + rn.l.high + rh.l.low; + rh.l.high = (c >>32 ) + rh.l.high; + +/* +* The 128-bit result of the multiplication is in rl.ll and rh.ll, +* shift it right and throw away the high part of the result. +*/ +if (shift ==0 ) +return rl.ll; +if (shift <64 ) +return (rl.ll >> shift) | (rh.ll << (64 - shift)); +return rh.ll >> (shift &63 ); +} +#endif /* mul_u64_u64_shr */ + +#endif + +#ifndef mul_u64_u32_div +static inline u64 mul_u64_u32_div (u64 a,u32 mul,u32 divisor) +{ +union { +u64 ll; +struct { +#ifdef __BIG_ENDIAN +u32 high, low; +#else +u32 low, high; +#endif + } l; + } u, rl, rh; + + u.ll = a; + rl.ll =mul_u32_u32 (u.l.low, mul); + rh.ll =mul_u32_u32 (u.l.high, mul) + rl.l.high; + +/* Bits 32-63 of the result will be in rh.l.low. */ + rl.l.high =do_div (rh.ll, divisor); + +/* Bits 0-31 of the result will be in rl.l.low. */ +do_div (rl.ll, divisor); + + rl.l.high = rh.l.low; +return rl.ll; +} +#endif /* mul_u64_u32_div */ +#endif /* _LINUX_MATH64_H */
lib/div64.c +136 -5
153 lines not on this page · raw message
Signature · 1 line
2.6.6
PATCH 1/1 lib: div64: sync with Linux
Quoted 8 lines · Peng Fan
Sync with Linux commit
ad0376eb1483b("Merge tag 'edac_for_4.11_2'").Signed-off-by Peng Fan <[email protected]>Cc Tom Rini <[email protected]>--- include/linux/math64.h | 172 +++++++++++++++++++++++++++++++++++++++++++++++++ lib/div64.c | 141 ++++++++++++++++++++++++++++++++++++++-- 2 files changed, 308 insertions(+), 5 deletions(-)
This seems fine. What would help would be a link to a travis-ci job with this particular patch applied showing everything still builds too :) Thanks!
Signature · 8 lines
Tom -------------- next part -------------- A non-text attachment was scrubbed... Name: signature.asc Type: application/pgp-signature Size: 819 bytes Desc: Digital signature URL: <http://lists.denx.de/pipermail/u-boot/attachments/20170405/60a266eb/attachment.sig>
PATCH 1/1 lib: div64: sync with Linux
Hi Tom,
Quoted 11 lines · Tom Rini
Quoted 8 lines · Peng Fan
Sync with Linux commit
ad0376eb1483b("Merge tag 'edac_for_4.11_2'").Signed-off-by Peng Fan <[email protected]>Cc Tom Rini <[email protected]>--- include/linux/math64.h | 172 +++++++++++++++++++++++++++++++++++++++++++++++++ lib/div64.c | 141 ++++++++++++++++++++++++++++++++++++++-- 2 files changed, 308 insertions(+), 5 deletions(-)
Quoted 3 lines
This seems fine. What would help would be a link to a travis-ci job with this particular patch applied showing everything still builds too :) Thanks!
Do you mean I need to put a travis-ci job link in the commit log? I just use buildman to do the build on my local PC, I do not have travis-ci building.
Thanks,
Peng.
Quoted 10 lines
Signature · 9 lines
-- Tom _______________________________________________ U-Boot mailing list U-Boot at lists.denx.de https://lists.denx.de/listinfo/u-boot
PATCH 1/1 lib: div64: sync with Linux
Quoted 14 lines · Peng Fan
Hi Tom,
Quoted 11 lines · Tom Rini
Quoted 8 lines · Peng Fan
Sync with Linux commit
ad0376eb1483b("Merge tag 'edac_for_4.11_2'").Signed-off-by Peng Fan <[email protected]>Cc Tom Rini <[email protected]>--- include/linux/math64.h | 172 +++++++++++++++++++++++++++++++++++++++++++++++++ lib/div64.c | 141 ++++++++++++++++++++++++++++++++++++++-- 2 files changed, 308 insertions(+), 5 deletions(-)
Quoted 7 lines
Quoted 3 lines
This seems fine. What would help would be a link to a travis-ci job with this particular patch applied showing everything still builds too :) Thanks!
Do you mean I need to put a travis-ci job link in the commit log? I just use buildman to do the build on my local PC, I do not have travis-ci building.
Below the '---' is better probably. Did you buildman everything or just arm/powerpc? Thanks!
Signature · 8 lines
Tom -------------- next part -------------- A non-text attachment was scrubbed... Name: signature.asc Type: application/pgp-signature Size: 819 bytes Desc: Digital signature URL: <http://lists.denx.de/pipermail/u-boot/attachments/20170406/ac117919/attachment.sig>
Quoted 4 lines · Peng Fan
Sync with Linux commit
ad0376eb1483b("Merge tag 'edac_for_4.11_2'").Signed-off-by Peng Fan <[email protected]>Cc Tom Rini <[email protected]>
aarch64: + uniphier_v8
+(uniphier_v8) cmd/built-in.o: In function `lldiv':
+(uniphier_v8) include/div64.h:45: undefined reference to
`__div64_32'
+(uniphier_v8) drivers/mmc/built-in.o: In function `lldiv':
+(uniphier_v8) lib/built-in.o: In function `lldiv':
+(uniphier_v8) lib/built-in.o:include/div64.h:45: more undefined
references to `__div64_32' follow
+(uniphier_v8) make[1]: *** [u-boot] Error 139 +(uniphier_v8) make: *** [sub-make] Error 2
Signature · 8 lines
Tom -------------- next part -------------- A non-text attachment was scrubbed... Name: signature.asc Type: application/pgp-signature Size: 819 bytes Desc: Digital signature URL: <http://lists.denx.de/pipermail/u-boot/attachments/20170407/b0de7957/attachment.sig>