Add Linux's math64.h
[akaros.git] / kern / arch / x86 / div64.h
1 #ifndef _ASM_GENERIC_DIV64_H
2 #define _ASM_GENERIC_DIV64_H
3 /*
4  * Copyright (C) 2003 Bernardo Innocenti <bernie@develer.com>
5  * Based on former asm-ppc/div64.h and asm-m68knommu/div64.h
6  *
7  * Optimization for constant divisors on 32-bit machines:
8  * Copyright (C) 2006-2015 Nicolas Pitre
9  *
10  * The semantics of do_div() are:
11  *
12  * uint32_t do_div(uint64_t *n, uint32_t base)
13  * {
14  *      uint32_t remainder = *n % base;
15  *      *n = *n / base;
16  *      return remainder;
17  * }
18  *
19  * NOTE: macro parameter n is evaluated multiple times,
20  *       beware of side effects!
21  */
22
23 #include <linux/types.h>
24 #include <linux/compiler.h>
25
26 #if BITS_PER_LONG == 64
27
28 # define do_div(n,base) ({                                      \
29         uint32_t __base = (base);                               \
30         uint32_t __rem;                                         \
31         __rem = ((uint64_t)(n)) % __base;                       \
32         (n) = ((uint64_t)(n)) / __base;                         \
33         __rem;                                                  \
34  })
35
36 #else /* BITS_PER_LONG == ?? */
37
38 # error do_div() does not yet support the C64
39
40 #endif /* BITS_PER_LONG */
41
42 #endif /* _ASM_GENERIC_DIV64_H */