Date: Mon, 19 Oct 2015 11:16:38 +0000 (UTC) From: Hans Petter Selasky <hselasky@FreeBSD.org> To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: svn commit: r289569 - head/sys/ofed/include/linux Message-ID: <201510191116.t9JBGcwT058404@repo.freebsd.org>
next in thread | raw e-mail | index | archive | help
Author: hselasky Date: Mon Oct 19 11:16:38 2015 New Revision: 289569 URL: https://svnweb.freebsd.org/changeset/base/289569 Log: Merge LinuxKPI changes from DragonflyBSD: - Reimplement math64 header file to distinguish more from Linux. Sponsored by: Mellanox Technologies Modified: head/sys/ofed/include/linux/math64.h Modified: head/sys/ofed/include/linux/math64.h ============================================================================== --- head/sys/ofed/include/linux/math64.h Mon Oct 19 11:11:15 2015 (r289568) +++ head/sys/ofed/include/linux/math64.h Mon Oct 19 11:16:38 2015 (r289569) @@ -1,6 +1,6 @@ /*- * Copyright (c) 2007 Cisco Systems, Inc. All rights reserved. - * Copyright (c) 2014 Mellanox Technologies, Ltd. All rights reserved. + * Copyright (c) 2014-2015 Mellanox Technologies, Ltd. All rights reserved. * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -26,108 +26,29 @@ */ #ifndef _LINUX_MATH64_H -#define _LINUX_MATH64_H +#define _LINUX_MATH64_H -#include <linux/types.h> -#include <linux/bitops.h> +#include <sys/stdint.h> -#if BITS_PER_LONG == 64 - -# define do_div(n, base) ({ \ - uint32_t __base = (base); \ - uint32_t __rem; \ - __rem = ((uint64_t)(n)) % __base; \ - (n) = ((uint64_t)(n)) / __base; \ - __rem; \ +#define do_div(n, base) ({ \ + uint32_t __base = (base); \ + uint32_t __rem; \ + __rem = ((uint64_t)(n)) % __base; \ + (n) = ((uint64_t)(n)) / __base; \ + __rem; \ }) -/** -* div_u64_rem - unsigned 64bit divide with 32bit divisor with remainder -* -* This is commonly provided by 32bit archs to provide an optimized 64bit -* divide. -*/ -static inline u64 div_u64_rem(u64 dividend, u32 divisor, u32 *remainder) +static inline uint64_t +div_u64_rem(uint64_t dividend, uint32_t divisor, uint32_t *remainder) { - *remainder = dividend % divisor; - return dividend / divisor; + *remainder = dividend % divisor; + return (dividend / divisor); } - -#elif BITS_PER_LONG == 32 - -static uint32_t __div64_32(uint64_t *n, uint32_t base) -{ - uint64_t rem = *n; - uint64_t b = base; - uint64_t res, d = 1; - uint32_t high = rem >> 32; - - /* Reduce the thing a bit first */ - res = 0; - if (high >= base) { - high /= base; - res = (uint64_t) high << 32; - rem -= (uint64_t) (high*base) << 32; - } - - while ((int64_t)b > 0 && b < rem) { - b = b+b; - d = d+d; - } - - do { - if (rem >= b) { - rem -= b; - res += d; - } - b >>= 1; - d >>= 1; - } while (d); - - *n = res; - return rem; -} - -# define do_div(n, base) ({ \ - uint32_t __base = (base); \ - uint32_t __rem; \ - (void)(((typeof((n)) *)0) == ((uint64_t *)0)); \ - if (likely(((n) >> 32) == 0)) { \ - __rem = (uint32_t)(n) % __base; \ - (n) = (uint32_t)(n) / __base; \ - } else \ - __rem = __div64_32(&(n), __base); \ - __rem; \ -}) - -#ifndef div_u64_rem -static inline u64 div_u64_rem(u64 dividend, u32 divisor, u32 *remainder) -{ - *remainder = do_div(dividend, divisor); - return dividend; -} -#endif - - -#endif /* BITS_PER_LONG */ - - - -/** - ** div_u64 - unsigned 64bit divide with 32bit divisor - ** - ** This is the most common 64bit divide and should be used if possible, - ** as many 32bit archs can optimize this variant better than a full 64bit - ** divide. - * */ -#ifndef div_u64 - -static inline u64 div_u64(u64 dividend, u32 divisor) +static inline uint64_t +div_u64(uint64_t dividend, uint32_t divisor) { - u32 remainder; - return div_u64_rem(dividend, divisor, &remainder); + return (dividend / divisor); } -#endif -#endif /* _LINUX_MATH64_H */ +#endif /* _LINUX_MATH64_H */
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201510191116.t9JBGcwT058404>