1/* 2 * Copyright (c) 2017 ARM Limited 3 * All rights reserved 4 * 5 * The license below extends only to copyright in the software and shall 6 * not be construed as granting a license to any other intellectual 7 * property including but not limited to intellectual property relating 8 * to a hardware implementation of the functionality of the software --- 25 unchanged lines hidden (view full) --- 34 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 35 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 36 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 37 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 38 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 39 * 40 * Authors: Steve Reinhardt 41 * Nathan Binkert |
42 * Giacomo Travaglini |
43 */ 44 45#ifndef __BASE_BITFIELD_HH__ 46#define __BASE_BITFIELD_HH__ 47 48#include <inttypes.h> |
49#include <cassert> 50#include <cstddef> 51#include <type_traits> |
52 |
53/** Lookup table used for High Speed bit reversing */ 54extern const uint8_t reverseLookUpTable[]; 55 |
56/** 57 * Generate a 64-bit mask of 'nbits' 1s, right justified. 58 */ 59inline uint64_t 60mask(int nbits) 61{ 62 return (nbits == 64) ? (uint64_t)-1LL : (1ULL << nbits) - 1; 63} 64 |
65/** 66 * Extract the bitfield from position 'first' to 'last' (inclusive) 67 * from 'val' and right justify it. MSB is numbered 63, LSB is 0. 68 */ 69template <class T> 70inline 71T 72bits(T val, int first, int last) --- 82 unchanged lines hidden (view full) --- 155/** Overloaded function to allow to access only 1 bit*/ 156template <class T, class B> 157inline 158void 159replaceBits(T& val, int bit, B bit_val) 160{ 161 val = insertBits(val, bit, bit, bit_val); 162} |
163 |
164/** |
165 * Takes a variable lenght word and returns the mirrored version 166 * (Bit by bit, LSB=>MSB). 167 * 168 * algorithm from 169 * http://graphics.stanford.edu/~seander/bithacks.html 170 * #ReverseBitsByLookupTable 171 * 172 * @param val: variable lenght word 173 * @param size: number of bytes to mirror 174 * @return mirrored word 175 */ 176template <class T> 177T 178reverseBits(T val, std::size_t size = sizeof(T)) 179{ 180 static_assert(std::is_integral<T>::value, "Expecting an integer type"); 181 182 assert(size <= sizeof(T)); 183 184 T output = 0; 185 for (auto byte = 0; byte < size; byte++, val >>= 8) { 186 output = (output << 8) | reverseLookUpTable[val & 0xFF]; 187 } 188 189 return output; 190} 191 192/** |
193 * Returns the bit position of the MSB that is set in the input 194 */ 195inline 196int 197findMsbSet(uint64_t val) { 198 int msb = 0; 199 if (!val) 200 return 0; --- 85 unchanged lines hidden --- |