bitfield.hh revision 4680:09867d787df8
111176Sshingarov@labware.com/* 211274Sshingarov@labware.com * Copyright (c) 2003-2005 The Regents of The University of Michigan 311176Sshingarov@labware.com * All rights reserved. 411176Sshingarov@labware.com * 511176Sshingarov@labware.com * Redistribution and use in source and binary forms, with or without 611176Sshingarov@labware.com * modification, are permitted provided that the following conditions are 711176Sshingarov@labware.com * met: redistributions of source code must retain the above copyright 811176Sshingarov@labware.com * notice, this list of conditions and the following disclaimer; 911176Sshingarov@labware.com * redistributions in binary form must reproduce the above copyright 1011176Sshingarov@labware.com * notice, this list of conditions and the following disclaimer in the 1111176Sshingarov@labware.com * documentation and/or other materials provided with the distribution; 1211176Sshingarov@labware.com * neither the name of the copyright holders nor the names of its 1311176Sshingarov@labware.com * contributors may be used to endorse or promote products derived from 1411176Sshingarov@labware.com * this software without specific prior written permission. 1511176Sshingarov@labware.com * 1611176Sshingarov@labware.com * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 1711176Sshingarov@labware.com * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 1811176Sshingarov@labware.com * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 1911176Sshingarov@labware.com * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 2011176Sshingarov@labware.com * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 2111176Sshingarov@labware.com * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 2211176Sshingarov@labware.com * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 2311176Sshingarov@labware.com * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 2411176Sshingarov@labware.com * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 2511176Sshingarov@labware.com * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 2611176Sshingarov@labware.com * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 2711176Sshingarov@labware.com * 2811176Sshingarov@labware.com * Authors: Steve Reinhardt 2911176Sshingarov@labware.com * Nathan Binkert 3011176Sshingarov@labware.com */ 3111176Sshingarov@labware.com 3211176Sshingarov@labware.com#ifndef __BASE_BITFIELD_HH__ 3311176Sshingarov@labware.com#define __BASE_BITFIELD_HH__ 3411176Sshingarov@labware.com 3511176Sshingarov@labware.com#include <inttypes.h> 3611176Sshingarov@labware.com 3711176Sshingarov@labware.com/** 3811176Sshingarov@labware.com * Generate a 64-bit mask of 'nbits' 1s, right justified. 3911176Sshingarov@labware.com */ 4011176Sshingarov@labware.cominline uint64_t 4111176Sshingarov@labware.commask(int nbits) 4211176Sshingarov@labware.com{ 4311176Sshingarov@labware.com return (nbits == 64) ? (uint64_t)-1LL : (1ULL << nbits) - 1; 4411176Sshingarov@labware.com} 4511176Sshingarov@labware.com 4611176Sshingarov@labware.com 4711176Sshingarov@labware.com 4811176Sshingarov@labware.com/** 4911176Sshingarov@labware.com * Extract the bitfield from position 'first' to 'last' (inclusive) 5011176Sshingarov@labware.com * from 'val' and right justify it. MSB is numbered 63, LSB is 0. 5111176Sshingarov@labware.com */ 5211176Sshingarov@labware.comtemplate <class T> 5311176Sshingarov@labware.cominline 5411176Sshingarov@labware.comT 5511176Sshingarov@labware.combits(T val, int first, int last) 5611176Sshingarov@labware.com{ 5711176Sshingarov@labware.com int nbits = first - last + 1; 5811176Sshingarov@labware.com return (val >> last) & mask(nbits); 5911176Sshingarov@labware.com} 6011176Sshingarov@labware.com 6111176Sshingarov@labware.com/** 6211176Sshingarov@labware.com * Extract the bit from this position from 'val' and right justify it. 6311176Sshingarov@labware.com */ 6411176Sshingarov@labware.comtemplate <class T> 6511176Sshingarov@labware.cominline 6611176Sshingarov@labware.comT 6711176Sshingarov@labware.combits(T val, int bit) 6811176Sshingarov@labware.com{ 6911176Sshingarov@labware.com return bits(val, bit, bit); 7011176Sshingarov@labware.com} 7111176Sshingarov@labware.com 7211176Sshingarov@labware.com/** 7311176Sshingarov@labware.com * Mask off the given bits in place like bits() but without shifting. 7411176Sshingarov@labware.com * msb = 63, lsb = 0 7511176Sshingarov@labware.com */ 7611176Sshingarov@labware.comtemplate <class T> 7711176Sshingarov@labware.cominline 7811176Sshingarov@labware.comT 7911176Sshingarov@labware.commbits(T val, int first, int last) 8011176Sshingarov@labware.com{ 8111176Sshingarov@labware.com return val & (mask(first+1) & ~mask(last)); 8211176Sshingarov@labware.com} 8311176Sshingarov@labware.com 8411176Sshingarov@labware.cominline uint64_t 8511176Sshingarov@labware.commask(int first, int last) 8611176Sshingarov@labware.com{ 8711176Sshingarov@labware.com return mbits((uint64_t)-1LL, first, last); 8811176Sshingarov@labware.com} 8911176Sshingarov@labware.com 9011176Sshingarov@labware.com/** 9111176Sshingarov@labware.com * Sign-extend an N-bit value to 64 bits. 9211176Sshingarov@labware.com */ 9311176Sshingarov@labware.comtemplate <int N> 9411176Sshingarov@labware.cominline 9511176Sshingarov@labware.comint64_t 9611176Sshingarov@labware.comsext(uint64_t val) 9711176Sshingarov@labware.com{ 9811176Sshingarov@labware.com int sign_bit = bits(val, N-1, N-1); 9911176Sshingarov@labware.com return sign_bit ? (val | ~mask(N)) : val; 10011176Sshingarov@labware.com} 10111176Sshingarov@labware.com 10211176Sshingarov@labware.com/** 10311176Sshingarov@labware.com * Return val with bits first to last set to bit_val 10411176Sshingarov@labware.com */ 10511176Sshingarov@labware.comtemplate <class T, class B> 10611176Sshingarov@labware.cominline 10711176Sshingarov@labware.comT 10811176Sshingarov@labware.cominsertBits(T val, int first, int last, B bit_val) 10911176Sshingarov@labware.com{ 11011176Sshingarov@labware.com T t_bit_val = bit_val; 11111176Sshingarov@labware.com T bmask = mask(first - last + 1) << last; 11211176Sshingarov@labware.com return ((t_bit_val << last) & bmask) | (val & ~bmask); 11311176Sshingarov@labware.com} 11411176Sshingarov@labware.com 11511176Sshingarov@labware.com/** 11611176Sshingarov@labware.com * Overloaded for access to only one bit in value 11711176Sshingarov@labware.com */ 11811176Sshingarov@labware.comtemplate <class T, class B> 11911176Sshingarov@labware.cominline 12011176Sshingarov@labware.comT 12111176Sshingarov@labware.cominsertBits(T val, int bit, B bit_val) 12211176Sshingarov@labware.com{ 12311176Sshingarov@labware.com return insertBits(val, bit, bit, bit_val); 12411176Sshingarov@labware.com} 12511176Sshingarov@labware.com 12611176Sshingarov@labware.com/** 12711176Sshingarov@labware.com * A convenience function to replace bits first to last of val with bit_val 12811176Sshingarov@labware.com * in place. 12911176Sshingarov@labware.com */ 13011176Sshingarov@labware.comtemplate <class T, class B> 13111176Sshingarov@labware.cominline 13211176Sshingarov@labware.comvoid 13311176Sshingarov@labware.comreplaceBits(T& val, int first, int last, B bit_val) 13411176Sshingarov@labware.com{ 13511176Sshingarov@labware.com val = insertBits(val, first, last, bit_val); 13611176Sshingarov@labware.com} 13711176Sshingarov@labware.com 13811176Sshingarov@labware.com/** Overloaded function to allow to access only 1 bit*/ 13911176Sshingarov@labware.comtemplate <class T, class B> 14011176Sshingarov@labware.cominline 14111176Sshingarov@labware.comvoid 14211176Sshingarov@labware.comreplaceBits(T& val, int bit, B bit_val) 14311176Sshingarov@labware.com{ 14411176Sshingarov@labware.com val = insertBits(val, bit, bit, bit_val); 14511176Sshingarov@labware.com} 14611176Sshingarov@labware.com/** 14711176Sshingarov@labware.com * Returns the bit position of the MSB that is set in the input 14811176Sshingarov@labware.com */ 14911176Sshingarov@labware.cominline 15011176Sshingarov@labware.comint 15111176Sshingarov@labware.comfindMsbSet(uint64_t val) { 15211176Sshingarov@labware.com int msb = 0; 15311274Sshingarov@labware.com if (!val) 15411176Sshingarov@labware.com return 0; 15511176Sshingarov@labware.com if (bits(val, 63,32)) { msb += 32; val >>= 32; } 15611176Sshingarov@labware.com if (bits(val, 31,16)) { msb += 16; val >>= 16; } 15711176Sshingarov@labware.com if (bits(val, 15,8)) { msb += 8; val >>= 8; } 15811176Sshingarov@labware.com if (bits(val, 7,4)) { msb += 4; val >>= 4; } 15911176Sshingarov@labware.com if (bits(val, 3,2)) { msb += 2; val >>= 2; } 16011176Sshingarov@labware.com if (bits(val, 1,1)) { msb += 1; } 16111176Sshingarov@labware.com return msb; 16211176Sshingarov@labware.com} 16311176Sshingarov@labware.com 16411176Sshingarov@labware.com#endif // __BASE_BITFIELD_HH__ 16511176Sshingarov@labware.com