1*7827cba2SAaron LI /* $NetBSD: bitops.h,v 1.11 2012/12/07 02:27:58 christos Exp $ */
2*7827cba2SAaron LI
3*7827cba2SAaron LI /*-
4*7827cba2SAaron LI * Copyright (c) 2007, 2010 The NetBSD Foundation, Inc.
5*7827cba2SAaron LI * All rights reserved.
6*7827cba2SAaron LI *
7*7827cba2SAaron LI * This code is derived from software contributed to The NetBSD Foundation
8*7827cba2SAaron LI * by Christos Zoulas and Joerg Sonnenberger.
9*7827cba2SAaron LI *
10*7827cba2SAaron LI * Redistribution and use in source and binary forms, with or without
11*7827cba2SAaron LI * modification, are permitted provided that the following conditions
12*7827cba2SAaron LI * are met:
13*7827cba2SAaron LI * 1. Redistributions of source code must retain the above copyright
14*7827cba2SAaron LI * notice, this list of conditions and the following disclaimer.
15*7827cba2SAaron LI * 2. Redistributions in binary form must reproduce the above copyright
16*7827cba2SAaron LI * notice, this list of conditions and the following disclaimer in the
17*7827cba2SAaron LI * documentation and/or other materials provided with the distribution.
18*7827cba2SAaron LI *
19*7827cba2SAaron LI * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
20*7827cba2SAaron LI * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
21*7827cba2SAaron LI * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
22*7827cba2SAaron LI * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
23*7827cba2SAaron LI * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
24*7827cba2SAaron LI * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
25*7827cba2SAaron LI * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
26*7827cba2SAaron LI * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
27*7827cba2SAaron LI * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
28*7827cba2SAaron LI * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
29*7827cba2SAaron LI * POSSIBILITY OF SUCH DAMAGE.
30*7827cba2SAaron LI */
31*7827cba2SAaron LI
32*7827cba2SAaron LI #ifndef COMPAT_BITOPS_H
33*7827cba2SAaron LI #define COMPAT_BITOPS_H
34*7827cba2SAaron LI
35*7827cba2SAaron LI #include <stdint.h>
36*7827cba2SAaron LI #include "common.h"
37*7827cba2SAaron LI
38*7827cba2SAaron LI /*
39*7827cba2SAaron LI * Find First Set functions
40*7827cba2SAaron LI */
41*7827cba2SAaron LI #ifndef ffs32
42*7827cba2SAaron LI static inline int __unused
ffs32(uint32_t _n)43*7827cba2SAaron LI ffs32(uint32_t _n)
44*7827cba2SAaron LI {
45*7827cba2SAaron LI int _v;
46*7827cba2SAaron LI
47*7827cba2SAaron LI if (!_n)
48*7827cba2SAaron LI return 0;
49*7827cba2SAaron LI
50*7827cba2SAaron LI _v = 1;
51*7827cba2SAaron LI if ((_n & 0x0000FFFFU) == 0) {
52*7827cba2SAaron LI _n >>= 16;
53*7827cba2SAaron LI _v += 16;
54*7827cba2SAaron LI }
55*7827cba2SAaron LI if ((_n & 0x000000FFU) == 0) {
56*7827cba2SAaron LI _n >>= 8;
57*7827cba2SAaron LI _v += 8;
58*7827cba2SAaron LI }
59*7827cba2SAaron LI if ((_n & 0x0000000FU) == 0) {
60*7827cba2SAaron LI _n >>= 4;
61*7827cba2SAaron LI _v += 4;
62*7827cba2SAaron LI }
63*7827cba2SAaron LI if ((_n & 0x00000003U) == 0) {
64*7827cba2SAaron LI _n >>= 2;
65*7827cba2SAaron LI _v += 2;
66*7827cba2SAaron LI }
67*7827cba2SAaron LI if ((_n & 0x00000001U) == 0) {
68*7827cba2SAaron LI //_n >>= 1;
69*7827cba2SAaron LI _v += 1;
70*7827cba2SAaron LI }
71*7827cba2SAaron LI return _v;
72*7827cba2SAaron LI }
73*7827cba2SAaron LI #endif
74*7827cba2SAaron LI
75*7827cba2SAaron LI #ifndef ffs64
76*7827cba2SAaron LI static inline int __unused
ffs64(uint64_t _n)77*7827cba2SAaron LI ffs64(uint64_t _n)
78*7827cba2SAaron LI {
79*7827cba2SAaron LI int _v;
80*7827cba2SAaron LI
81*7827cba2SAaron LI if (!_n)
82*7827cba2SAaron LI return 0;
83*7827cba2SAaron LI
84*7827cba2SAaron LI _v = 1;
85*7827cba2SAaron LI if ((_n & 0x00000000FFFFFFFFULL) == 0) {
86*7827cba2SAaron LI _n >>= 32;
87*7827cba2SAaron LI _v += 32;
88*7827cba2SAaron LI }
89*7827cba2SAaron LI if ((_n & 0x000000000000FFFFULL) == 0) {
90*7827cba2SAaron LI _n >>= 16;
91*7827cba2SAaron LI _v += 16;
92*7827cba2SAaron LI }
93*7827cba2SAaron LI if ((_n & 0x00000000000000FFULL) == 0) {
94*7827cba2SAaron LI _n >>= 8;
95*7827cba2SAaron LI _v += 8;
96*7827cba2SAaron LI }
97*7827cba2SAaron LI if ((_n & 0x000000000000000FULL) == 0) {
98*7827cba2SAaron LI _n >>= 4;
99*7827cba2SAaron LI _v += 4;
100*7827cba2SAaron LI }
101*7827cba2SAaron LI if ((_n & 0x0000000000000003ULL) == 0) {
102*7827cba2SAaron LI _n >>= 2;
103*7827cba2SAaron LI _v += 2;
104*7827cba2SAaron LI }
105*7827cba2SAaron LI if ((_n & 0x0000000000000001ULL) == 0) {
106*7827cba2SAaron LI //_n >>= 1;
107*7827cba2SAaron LI _v += 1;
108*7827cba2SAaron LI }
109*7827cba2SAaron LI return _v;
110*7827cba2SAaron LI }
111*7827cba2SAaron LI #endif
112*7827cba2SAaron LI
113*7827cba2SAaron LI /*
114*7827cba2SAaron LI * Find Last Set functions
115*7827cba2SAaron LI */
116*7827cba2SAaron LI #ifndef fls32
117*7827cba2SAaron LI static __inline int __unused
fls32(uint32_t _n)118*7827cba2SAaron LI fls32(uint32_t _n)
119*7827cba2SAaron LI {
120*7827cba2SAaron LI int _v;
121*7827cba2SAaron LI
122*7827cba2SAaron LI if (!_n)
123*7827cba2SAaron LI return 0;
124*7827cba2SAaron LI
125*7827cba2SAaron LI _v = 32;
126*7827cba2SAaron LI if ((_n & 0xFFFF0000U) == 0) {
127*7827cba2SAaron LI _n <<= 16;
128*7827cba2SAaron LI _v -= 16;
129*7827cba2SAaron LI }
130*7827cba2SAaron LI if ((_n & 0xFF000000U) == 0) {
131*7827cba2SAaron LI _n <<= 8;
132*7827cba2SAaron LI _v -= 8;
133*7827cba2SAaron LI }
134*7827cba2SAaron LI if ((_n & 0xF0000000U) == 0) {
135*7827cba2SAaron LI _n <<= 4;
136*7827cba2SAaron LI _v -= 4;
137*7827cba2SAaron LI }
138*7827cba2SAaron LI if ((_n & 0xC0000000U) == 0) {
139*7827cba2SAaron LI _n <<= 2;
140*7827cba2SAaron LI _v -= 2;
141*7827cba2SAaron LI }
142*7827cba2SAaron LI if ((_n & 0x80000000U) == 0) {
143*7827cba2SAaron LI //_n <<= 1;
144*7827cba2SAaron LI _v -= 1;
145*7827cba2SAaron LI }
146*7827cba2SAaron LI return _v;
147*7827cba2SAaron LI }
148*7827cba2SAaron LI #endif
149*7827cba2SAaron LI
150*7827cba2SAaron LI #ifndef fls64
151*7827cba2SAaron LI static int __unused
fls64(uint64_t _n)152*7827cba2SAaron LI fls64(uint64_t _n)
153*7827cba2SAaron LI {
154*7827cba2SAaron LI int _v;
155*7827cba2SAaron LI
156*7827cba2SAaron LI if (!_n)
157*7827cba2SAaron LI return 0;
158*7827cba2SAaron LI
159*7827cba2SAaron LI _v = 64;
160*7827cba2SAaron LI if ((_n & 0xFFFFFFFF00000000ULL) == 0) {
161*7827cba2SAaron LI _n <<= 32;
162*7827cba2SAaron LI _v -= 32;
163*7827cba2SAaron LI }
164*7827cba2SAaron LI if ((_n & 0xFFFF000000000000ULL) == 0) {
165*7827cba2SAaron LI _n <<= 16;
166*7827cba2SAaron LI _v -= 16;
167*7827cba2SAaron LI }
168*7827cba2SAaron LI if ((_n & 0xFF00000000000000ULL) == 0) {
169*7827cba2SAaron LI _n <<= 8;
170*7827cba2SAaron LI _v -= 8;
171*7827cba2SAaron LI }
172*7827cba2SAaron LI if ((_n & 0xF000000000000000ULL) == 0) {
173*7827cba2SAaron LI _n <<= 4;
174*7827cba2SAaron LI _v -= 4;
175*7827cba2SAaron LI }
176*7827cba2SAaron LI if ((_n & 0xC000000000000000ULL) == 0) {
177*7827cba2SAaron LI _n <<= 2;
178*7827cba2SAaron LI _v -= 2;
179*7827cba2SAaron LI }
180*7827cba2SAaron LI if ((_n & 0x8000000000000000ULL) == 0) {
181*7827cba2SAaron LI //_n <<= 1;
182*7827cba2SAaron LI _v -= 1;
183*7827cba2SAaron LI }
184*7827cba2SAaron LI return _v;
185*7827cba2SAaron LI }
186*7827cba2SAaron LI #endif
187*7827cba2SAaron LI
188*7827cba2SAaron LI #endif /* COMPAT_BITOPS_H_ */
189