Fixup of some headers.
[barrelfish] / include / bitmacros.h
1 /*
2  * Macros for bit manipulation: masks, etc.
3  *
4  * Copyright (c) 2015-2016 ETH Zurich.
5  * All rights reserved.
6  *
7  * This file is distributed under the terms in the attached LICENSE file.
8  * If you do not find this file, copies can be found by writing to:
9  * ETH Zurich D-INFK, Universitaetstr. 6, CH-8092 Zurich. Attn: Systems Group.
10  */
11
12 #ifndef __BITMACROS_H
13 #define __BITMACROS_H
14
15 #include <stdint.h>
16 #include <sys/param.h>
17
18 /* A one-bit mask at bit n of type t */
19 #define BIT_T(t, n) ((t)1 << (n))
20
21 /* A one-bit mask at bit n */
22 #define BIT(n) BIT_T(uint64_t, n)
23
24 /* An n-bit mask, beginning at bit 0 of type t */
25 #define MASK_T(t, n) (BIT_T(t, n) - 1)
26
27 /* An n-bit mask, beginning at bit 0 */
28 #define MASK(n) MASK_T(uint64_t, n)
29
30 /* An n-bit field selector, beginning at bit m */
31 #define FIELD(m,n,x) (((x) >> m) & MASK(n))
32
33 /* Round n up to the next multiple of size */
34 #define ROUND_UP(n, size) ((((n) + (size) - 1)) & (~((size) - 1)))
35
36 /* Divide n by size, rounding up */
37 #define DIVIDE_ROUND_UP(n, size) (((n) + (size) - 1) / (size))
38
39 /* Round n down to the nearest multiple of size */
40 #define ROUND_DOWN(n, size) ((n) & (~((size) - 1)))
41
42 /* Return the number of entries in a statically-allocated array */
43 #define ARRAY_LENGTH(x) (sizeof(x) / sizeof((x)[0]))
44
45
46 /* Compute the floor of log_2 of the given number */
47 static inline uint8_t
48 log2floor(uintptr_t num) {
49     uint8_t l = 0;
50     uintptr_t n;
51     for (n = num; n > 1; n >>= 1, l++);
52     return l;
53 }
54
55 /* Compute the ceiling of log_2 of the given number */
56 static inline uint8_t
57 log2ceil(uintptr_t num) {
58     uint8_t l = log2floor(num);
59     if (num == ((uintptr_t)1) << l) { /* fencepost case */
60         return l;
61     } else {
62         return l + 1;
63     }
64 }
65
66 #endif /* __BITMACROS_H */