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