~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

TOMOYO Linux Cross Reference
Linux/include/linux/math64.h

Version: ~ [ linux-5.3 ] ~ [ linux-5.2.15 ] ~ [ linux-5.1.21 ] ~ [ linux-5.0.21 ] ~ [ linux-4.20.17 ] ~ [ linux-4.19.73 ] ~ [ linux-4.18.20 ] ~ [ linux-4.17.19 ] ~ [ linux-4.16.18 ] ~ [ linux-4.15.18 ] ~ [ linux-4.14.144 ] ~ [ linux-4.13.16 ] ~ [ linux-4.12.14 ] ~ [ linux-4.11.12 ] ~ [ linux-4.10.17 ] ~ [ linux-4.9.193 ] ~ [ linux-4.8.17 ] ~ [ linux-4.7.10 ] ~ [ linux-4.6.7 ] ~ [ linux-4.5.7 ] ~ [ linux-4.4.193 ] ~ [ linux-4.3.6 ] ~ [ linux-4.2.8 ] ~ [ linux-4.1.52 ] ~ [ linux-4.0.9 ] ~ [ linux-3.19.8 ] ~ [ linux-3.18.140 ] ~ [ linux-3.17.8 ] ~ [ linux-3.16.73 ] ~ [ linux-3.15.10 ] ~ [ linux-3.14.79 ] ~ [ linux-3.13.11 ] ~ [ linux-3.12.74 ] ~ [ linux-3.11.10 ] ~ [ linux-3.10.108 ] ~ [ linux-3.9.11 ] ~ [ linux-3.8.13 ] ~ [ linux-3.7.10 ] ~ [ linux-3.6.11 ] ~ [ linux-3.5.7 ] ~ [ linux-3.4.113 ] ~ [ linux-3.3.8 ] ~ [ linux-3.2.102 ] ~ [ linux-3.1.10 ] ~ [ linux-3.0.101 ] ~ [ linux-2.6.32.71 ] ~ [ linux-2.6.0 ] ~ [ linux-2.4.37.11 ] ~ [ unix-v6-master ] ~ [ ccs-tools-1.8.5 ] ~ [ policy-sample ] ~
Architecture: ~ [ i386 ] ~ [ alpha ] ~ [ m68k ] ~ [ mips ] ~ [ ppc ] ~ [ sparc ] ~ [ sparc64 ] ~

  1 #ifndef _LINUX_MATH64_H
  2 #define _LINUX_MATH64_H
  3 
  4 #include <linux/types.h>
  5 #include <asm/div64.h>
  6 
  7 #if BITS_PER_LONG == 64
  8 
  9 #define div64_long(x,y) div64_s64((x),(y))
 10 
 11 /**
 12  * div_u64_rem - unsigned 64bit divide with 32bit divisor with remainder
 13  *
 14  * This is commonly provided by 32bit archs to provide an optimized 64bit
 15  * divide.
 16  */
 17 static inline u64 div_u64_rem(u64 dividend, u32 divisor, u32 *remainder)
 18 {
 19         *remainder = dividend % divisor;
 20         return dividend / divisor;
 21 }
 22 
 23 /**
 24  * div_s64_rem - signed 64bit divide with 32bit divisor with remainder
 25  */
 26 static inline s64 div_s64_rem(s64 dividend, s32 divisor, s32 *remainder)
 27 {
 28         *remainder = dividend % divisor;
 29         return dividend / divisor;
 30 }
 31 
 32 /**
 33  * div64_u64 - unsigned 64bit divide with 64bit divisor
 34  */
 35 static inline u64 div64_u64(u64 dividend, u64 divisor)
 36 {
 37         return dividend / divisor;
 38 }
 39 
 40 /**
 41  * div64_s64 - signed 64bit divide with 64bit divisor
 42  */
 43 static inline s64 div64_s64(s64 dividend, s64 divisor)
 44 {
 45         return dividend / divisor;
 46 }
 47 
 48 #elif BITS_PER_LONG == 32
 49 
 50 #define div64_long(x,y) div_s64((x),(y))
 51 
 52 #ifndef div_u64_rem
 53 static inline u64 div_u64_rem(u64 dividend, u32 divisor, u32 *remainder)
 54 {
 55         *remainder = do_div(dividend, divisor);
 56         return dividend;
 57 }
 58 #endif
 59 
 60 #ifndef div_s64_rem
 61 extern s64 div_s64_rem(s64 dividend, s32 divisor, s32 *remainder);
 62 #endif
 63 
 64 #ifndef div64_u64
 65 extern u64 div64_u64(u64 dividend, u64 divisor);
 66 #endif
 67 
 68 #ifndef div64_s64
 69 extern s64 div64_s64(s64 dividend, s64 divisor);
 70 #endif
 71 
 72 #endif /* BITS_PER_LONG */
 73 
 74 /**
 75  * div_u64 - unsigned 64bit divide with 32bit divisor
 76  *
 77  * This is the most common 64bit divide and should be used if possible,
 78  * as many 32bit archs can optimize this variant better than a full 64bit
 79  * divide.
 80  */
 81 #ifndef div_u64
 82 static inline u64 div_u64(u64 dividend, u32 divisor)
 83 {
 84         u32 remainder;
 85         return div_u64_rem(dividend, divisor, &remainder);
 86 }
 87 #endif
 88 
 89 /**
 90  * div_s64 - signed 64bit divide with 32bit divisor
 91  */
 92 #ifndef div_s64
 93 static inline s64 div_s64(s64 dividend, s32 divisor)
 94 {
 95         s32 remainder;
 96         return div_s64_rem(dividend, divisor, &remainder);
 97 }
 98 #endif
 99 
100 u32 iter_div_u64_rem(u64 dividend, u32 divisor, u64 *remainder);
101 
102 static __always_inline u32
103 __iter_div_u64_rem(u64 dividend, u32 divisor, u64 *remainder)
104 {
105         u32 ret = 0;
106 
107         while (dividend >= divisor) {
108                 /* The following asm() prevents the compiler from
109                    optimising this loop into a modulo operation.  */
110                 asm("" : "+rm"(dividend));
111 
112                 dividend -= divisor;
113                 ret++;
114         }
115 
116         *remainder = dividend;
117 
118         return ret;
119 }
120 
121 #endif /* _LINUX_MATH64_H */
122 

~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

kernel.org | git.kernel.org | LWN.net | Project Home | Wiki (Japanese) | Wiki (English) | SVN repository | Mail admin

Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.

osdn.jp