doc: Fix typo.
[libgcrypt.git] / cipher / bithelp.h
1 /* bithelp.h  -  Some bit manipulation helpers
2  *      Copyright (C) 1999, 2002 Free Software Foundation, Inc.
3  *
4  * This file is part of Libgcrypt.
5  *
6  * Libgcrypt is free software; you can redistribute it and/or modify
7  * it under the terms of the GNU Lesser General Public License as
8  * published by the Free Software Foundation; either version 2.1 of
9  * the License, or (at your option) any later version.
10  *
11  * Libgcrypt is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  * GNU Lesser General Public License for more details.
15  *
16  * You should have received a copy of the GNU Lesser General Public
17  * License along with this program; if not, see <http://www.gnu.org/licenses/>.
18  */
19 #ifndef GCRYPT_BITHELP_H
20 #define GCRYPT_BITHELP_H
21
22 #include "types.h"
23
24
25 /****************
26  * Rotate the 32 bit unsigned integer X by N bits left/right
27  */
28 static inline u32 rol(u32 x, int n)
29 {
30         return ( (x << (n&(32-1))) | (x >> ((32-n)&(32-1))) );
31 }
32
33 static inline u32 ror(u32 x, int n)
34 {
35         return ( (x >> (n&(32-1))) | (x << ((32-n)&(32-1))) );
36 }
37
38 /* Byte swap for 32-bit and 64-bit integers.  If available, use compiler
39    provided helpers.  */
40 #ifdef HAVE_BUILTIN_BSWAP32
41 # define _gcry_bswap32 __builtin_bswap32
42 #else
43 static inline u32
44 _gcry_bswap32(u32 x)
45 {
46         return ((rol(x, 8) & 0x00ff00ffL) | (ror(x, 8) & 0xff00ff00L));
47 }
48 #endif
49
50 #ifdef HAVE_U64_TYPEDEF
51 # ifdef HAVE_BUILTIN_BSWAP64
52 #  define _gcry_bswap64 __builtin_bswap64
53 # else
54 static inline u64
55 _gcry_bswap64(u64 x)
56 {
57         return ((u64)_gcry_bswap32(x) << 32) | (_gcry_bswap32(x >> 32));
58 }
59 # endif
60 #endif
61
62 /* Endian dependent byte swap operations.  */
63 #ifdef WORDS_BIGENDIAN
64 # define le_bswap32(x) _gcry_bswap32(x)
65 # define be_bswap32(x) ((u32)(x))
66 # ifdef HAVE_U64_TYPEDEF
67 #  define le_bswap64(x) _gcry_bswap64(x)
68 #  define be_bswap64(x) ((u64)(x))
69 # endif
70 #else
71 # define le_bswap32(x) ((u32)(x))
72 # define be_bswap32(x) _gcry_bswap32(x)
73 # ifdef HAVE_U64_TYPEDEF
74 #  define le_bswap64(x) ((u64)(x))
75 #  define be_bswap64(x) _gcry_bswap64(x)
76 # endif
77 #endif
78
79
80 /* Count trailing zero bits in an unsigend int.  We return an int
81    because that is what gcc's builtin does.  Returns the number of
82    bits in X if X is 0. */
83 static inline int
84 _gcry_ctz (unsigned int x)
85 {
86 #if defined (HAVE_BUILTIN_CTZ)
87   return x? __builtin_ctz (x) : 8 * sizeof (x);
88 #else
89   /* See
90    * http://graphics.stanford.edu/~seander/bithacks.html#ZerosOnRightModLookup
91    */
92   static const unsigned char mod37[] =
93     {
94       sizeof (unsigned int)*8,
95           0,  1, 26,  2, 23, 27,  0,  3, 16, 24, 30, 28, 11,  0, 13,
96       4,  7, 17,  0, 25, 22, 31, 15, 29, 10, 12,  6,  0, 21, 14,  9,
97       5, 20,  8, 19, 18
98     };
99   return (int)mod37[(-x & x) % 37];
100 #endif
101 }
102
103
104 /* Count trailing zero bits in an u64.  We return an int because that
105    is what gcc's builtin does.  Returns the number of bits in X if X
106    is 0.  */
107 #ifdef HAVE_U64_TYPEDEF
108 static inline int
109 _gcry_ctz64(u64 x)
110 {
111 #if defined (HAVE_BUILTIN_CTZ) && SIZEOF_UNSIGNED_INT >= 8
112 #warning hello
113   return x? __builtin_ctz (x) : 8 * sizeof (x);
114 #else
115   if ((x & 0xffffffff))
116     return _gcry_ctz (x);
117   else
118     return 32 + _gcry_ctz (x >> 32);
119 #endif
120 }
121 #endif /*HAVE_U64_TYPEDEF*/
122
123
124 #endif /*GCRYPT_BITHELP_H*/