Linux Kernel
3.7.1
Main Page
Related Pages
Modules
Namespaces
Data Structures
Files
File List
Globals
All
Data Structures
Namespaces
Files
Functions
Variables
Typedefs
Enumerations
Enumerator
Macros
Groups
Pages
include
linux
math64.h
Go to the documentation of this file.
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
17
static
inline
u64
div_u64_rem(
u64
dividend,
u32
divisor
,
u32
*remainder)
18
{
19
*remainder = dividend %
divisor
;
20
return
dividend /
divisor
;
21
}
22
26
static
inline
s64
div_s64_rem(
s64
dividend,
s32
divisor
,
s32
*remainder)
27
{
28
*remainder = dividend %
divisor
;
29
return
dividend /
divisor
;
30
}
31
35
static
inline
u64
div64_u64(
u64
dividend,
u64
divisor
)
36
{
37
return
dividend /
divisor
;
38
}
39
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
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
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 */
Generated on Thu Jan 10 2013 14:51:49 for Linux Kernel by
1.8.2