bitfield.hh revision 1112
113481Sgiacomo.travaglini@arm.com/* 213481Sgiacomo.travaglini@arm.com * Copyright (c) 2003 The Regents of The University of Michigan 313481Sgiacomo.travaglini@arm.com * All rights reserved. 413481Sgiacomo.travaglini@arm.com * 513481Sgiacomo.travaglini@arm.com * Redistribution and use in source and binary forms, with or without 613481Sgiacomo.travaglini@arm.com * modification, are permitted provided that the following conditions are 713481Sgiacomo.travaglini@arm.com * met: redistributions of source code must retain the above copyright 813481Sgiacomo.travaglini@arm.com * notice, this list of conditions and the following disclaimer; 913481Sgiacomo.travaglini@arm.com * redistributions in binary form must reproduce the above copyright 1013481Sgiacomo.travaglini@arm.com * notice, this list of conditions and the following disclaimer in the 1113481Sgiacomo.travaglini@arm.com * documentation and/or other materials provided with the distribution; 1213481Sgiacomo.travaglini@arm.com * neither the name of the copyright holders nor the names of its 1313481Sgiacomo.travaglini@arm.com * contributors may be used to endorse or promote products derived from 1413481Sgiacomo.travaglini@arm.com * this software without specific prior written permission. 1513481Sgiacomo.travaglini@arm.com * 1613481Sgiacomo.travaglini@arm.com * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 1713481Sgiacomo.travaglini@arm.com * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 1813481Sgiacomo.travaglini@arm.com * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 1913481Sgiacomo.travaglini@arm.com * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 2013481Sgiacomo.travaglini@arm.com * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 2113481Sgiacomo.travaglini@arm.com * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 2213481Sgiacomo.travaglini@arm.com * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 2313481Sgiacomo.travaglini@arm.com * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 2413481Sgiacomo.travaglini@arm.com * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 2513481Sgiacomo.travaglini@arm.com * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 2613481Sgiacomo.travaglini@arm.com * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 2713481Sgiacomo.travaglini@arm.com */ 2813481Sgiacomo.travaglini@arm.com 2913481Sgiacomo.travaglini@arm.com#ifndef __BASE_BITFIELD_HH__ 3013481Sgiacomo.travaglini@arm.com#define __BASE_BITFIELD_HH__ 3113481Sgiacomo.travaglini@arm.com 3213481Sgiacomo.travaglini@arm.com#include "sim/host.hh" 3313481Sgiacomo.travaglini@arm.com 3413481Sgiacomo.travaglini@arm.com/** 3513481Sgiacomo.travaglini@arm.com * Generate a 64-bit mask of 'nbits' 1s, right justified. 3613481Sgiacomo.travaglini@arm.com */ 3713481Sgiacomo.travaglini@arm.cominline uint64_t 3813481Sgiacomo.travaglini@arm.commask(int nbits) 3913481Sgiacomo.travaglini@arm.com{ 4013481Sgiacomo.travaglini@arm.com return (nbits == 64) ? (uint64_t)-1LL : (1ULL << nbits) - 1; 4113481Sgiacomo.travaglini@arm.com} 4213481Sgiacomo.travaglini@arm.com 4313481Sgiacomo.travaglini@arm.com 4413481Sgiacomo.travaglini@arm.com/** 4513481Sgiacomo.travaglini@arm.com * Extract the bitfield from position 'first' to 'last' (inclusive) 4613481Sgiacomo.travaglini@arm.com * from 'val' and right justify it. MSB is numbered 63, LSB is 0. 4713481Sgiacomo.travaglini@arm.com */ 4813481Sgiacomo.travaglini@arm.comtemplate <class T> 4913481Sgiacomo.travaglini@arm.cominline 5013481Sgiacomo.travaglini@arm.comT 5113481Sgiacomo.travaglini@arm.combits(T val, int first, int last) 5213481Sgiacomo.travaglini@arm.com{ 5313481Sgiacomo.travaglini@arm.com int nbits = first - last + 1; 5413481Sgiacomo.travaglini@arm.com return (val >> last) & mask(nbits); 5513481Sgiacomo.travaglini@arm.com} 5613481Sgiacomo.travaglini@arm.com 5713481Sgiacomo.travaglini@arm.com/** 5813481Sgiacomo.travaglini@arm.com * Sign-extend an N-bit value to 64 bits. 5913481Sgiacomo.travaglini@arm.com */ 6013481Sgiacomo.travaglini@arm.comtemplate <int N> 6113481Sgiacomo.travaglini@arm.cominline 6213481Sgiacomo.travaglini@arm.comint64_t 6313481Sgiacomo.travaglini@arm.comsext(uint64_t val) 6413481Sgiacomo.travaglini@arm.com{ 6513481Sgiacomo.travaglini@arm.com int sign_bit = bits(val, N-1, N-1); 6613481Sgiacomo.travaglini@arm.com return sign_bit ? (val | ~mask(N)) : val; 6713481Sgiacomo.travaglini@arm.com} 6813481Sgiacomo.travaglini@arm.com 6913481Sgiacomo.travaglini@arm.com#endif // __BASE_BITFIELD_HH__ 7013481Sgiacomo.travaglini@arm.com