Green shading in the line number column means the source is part of the translation unit, red means it is conditionally excluded. Highlighted line numbers link to the translation unit page. Highlighted macros link to the macro page.
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: #define div64_ul(x, y) div64_u64((x), (y)) 11: 12: /** 13: * div_u64_rem - unsigned 64bit divide with 32bit divisor with remainder 14: * 15: * This is commonly provided by 32bit archs to provide an optimized 64bit 16: * divide. 17: */ 18: static inline u64 div_u64_rem(u64 dividend, u32 divisor, u32 *remainder) 19: { 20: *remainder = dividend % divisor; 21: return dividend / divisor; 22: } 23: 24: /** 25: * div_s64_rem - signed 64bit divide with 32bit divisor with remainder 26: */ 27: static inline s64 div_s64_rem(s64 dividend, s32 divisor, s32 *remainder) 28: { 29: *remainder = dividend % divisor; 30: return dividend / divisor; 31: } 32: 33: /** 34: * div64_u64_rem - unsigned 64bit divide with 64bit divisor and remainder 35: */ 36: static inline u64 div64_u64_rem(u64 dividend, u64 divisor, u64 *remainder) 37: { 38: *remainder = dividend % divisor; 39: return dividend / divisor; 40: } 41: 42: /** 43: * div64_u64 - unsigned 64bit divide with 64bit divisor 44: */ 45: static inline u64 div64_u64(u64 dividend, u64 divisor) 46: { 47: return dividend / divisor; 48: } 49: 50: /** 51: * div64_s64 - signed 64bit divide with 64bit divisor 52: */ 53: static inline s64 div64_s64(s64 dividend, s64 divisor) 54: { 55: return dividend / divisor; 56: } 57: 58: #elif BITS_PER_LONG == 32 59: 60: #define div64_long(x, y) div_s64((x), (y)) 61: #define div64_ul(x, y) div_u64((x), (y)) 62: 63: #ifndef div_u64_rem 64: static inline u64 div_u64_rem(u64 dividend, u32 divisor, u32 *remainder) 65: { 66: *remainder = do_div(dividend, divisor); 67: return dividend; 68: } 69: #endif 70: 71: #ifndef div_s64_rem 72: extern s64 div_s64_rem(s64 dividend, s32 divisor, s32 *remainder); 73: #endif 74: 75: #ifndef div64_u64_rem 76: extern u64 div64_u64_rem(u64 dividend, u64 divisor, u64 *remainder); 77: #endif 78: 79: #ifndef div64_u64 80: extern u64 div64_u64(u64 dividend, u64 divisor); 81: #endif 82: 83: #ifndef div64_s64 84: extern s64 div64_s64(s64 dividend, s64 divisor); 85: #endif 86: 87: #endif /* BITS_PER_LONG */ 88: 89: /** 90: * div_u64 - unsigned 64bit divide with 32bit divisor 91: * 92: * This is the most common 64bit divide and should be used if possible, 93: * as many 32bit archs can optimize this variant better than a full 64bit 94: * divide. 95: */ 96: #ifndef div_u64 97: static inline u64 div_u64(u64 dividend, u32 divisor) 98: { 99: u32 remainder; 100: return div_u64_rem(dividend, divisor, &remainder); 101: } 102: #endif 103: 104: /** 105: * div_s64 - signed 64bit divide with 32bit divisor 106: */ 107: #ifndef div_s64 108: static inline s64 div_s64(s64 dividend, s32 divisor) 109: { 110: s32 remainder; 111: return div_s64_rem(dividend, divisor, &remainder); 112: } 113: #endif 114: 115: u32 iter_div_u64_rem(u64 dividend, u32 divisor, u64 *remainder); 116: 117: static __always_inline u32 118: __iter_div_u64_rem(u64 dividend, u32 divisor, u64 *remainder) 119: { 120: u32 ret = 0; 121: 122: while (dividend >= divisor) { 123: /* The following asm() prevents the compiler from 124: optimising this loop into a modulo operation. */ 125: asm("" : "+rm"(dividend)); 126: 127: dividend -= divisor; 128: ret++; 129: } 130: 131: *remainder = dividend; 132: 133: return ret; 134: } 135: 136: #if defined(CONFIG_ARCH_SUPPORTS_INT128) && defined(__SIZEOF_INT128__) 137: 138: #ifndef mul_u64_u32_shr 139: static inline u64 mul_u64_u32_shr(u64 a, u32 mul, unsigned int shift) 140: { 141: return (u64)(((unsigned __int128)a * mul) >> shift); 142: } 143: #endif /* mul_u64_u32_shr */ 144: 145: #else 146: 147: #ifndef mul_u64_u32_shr 148: static inline u64 mul_u64_u32_shr(u64 a, u32 mul, unsigned int shift) 149: { 150: u32 ah, al; 151: u64 ret; 152: 153: al = a; 154: ah = a >> 32; 155: 156: ret = ((u64)al * mul) >> shift; 157: if (ah) 158: ret += ((u64)ah * mul) << (32 - shift); 159: 160: return ret; 161: } 162: #endif /* mul_u64_u32_shr */ 163: 164: #endif 165: 166: #endif /* _LINUX_MATH64_H */ 167: