xref: /dflybsd-src/contrib/dhcpcd/compat/bitops.h (revision 7827cba26aeab13d7807ed685c58314f5058cf86)
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