• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright 2016 Google Inc.
3  *
4  * Use of this source code is governed by a BSD-style license that can be
5  * found in the LICENSE file.
6  *
7  */
8 
9 #ifdef _MSC_VER
10 
11 #include <intrin.h>
12 
13 #else
14 
15 
16 
17 #endif
18 
19 //
20 //
21 //
22 
23 #include "util.h"
24 
25 //
26 //
27 //
28 
29 bool
is_pow2_u32(uint32_t n)30 is_pow2_u32(uint32_t n)
31 {
32   return (n & (n-1)) == 0;
33 }
34 
35 //
36 //
37 //
38 
39 uint32_t
pow2_ru_u32(uint32_t n)40 pow2_ru_u32(uint32_t n)
41 {
42   n--;
43   n |= n >> 1;
44   n |= n >> 2;
45   n |= n >> 4;
46   n |= n >> 8;
47   n |= n >> 16;
48   n++;
49 
50   return n;
51 }
52 
53 //
54 //
55 //
56 
57 uint32_t
pow2_rd_u32(uint32_t n)58 pow2_rd_u32(uint32_t n)
59 {
60   return 1u << msb_idx_u32(n);
61 }
62 
63 //
64 // ASSUMES NON-ZERO
65 //
66 
67 uint32_t
msb_idx_u32(uint32_t n)68 msb_idx_u32(uint32_t n)
69 {
70 #if defined( _MSC_VER )
71 
72   uint32_t index;
73 
74   _BitScanReverse((unsigned long *)&index,n);
75 
76   return index;
77 
78 #elif defined( __GNUC__ )
79 
80   return __builtin_clz(n) ^ 31;
81 
82 #else
83 
84 #error "No msb_index()"
85 
86 #endif
87 }
88 
89 //
90 //
91 //
92