1/* This file is part of the program psim. 2 3 Copyright (C) 1994-1995, Andrew Cagney <cagney@highland.com.au> 4 5 This program is free software; you can redistribute it and/or modify 6 it under the terms of the GNU General Public License as published by 7 the Free Software Foundation; either version 2 of the License, or 8 (at your option) any later version. 9 10 This program is distributed in the hope that it will be useful, 11 but WITHOUT ANY WARRANTY; without even the implied warranty of 12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 GNU General Public License for more details. 14 15 You should have received a copy of the GNU General Public License 16 along with this program; if not, write to the Free Software 17 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. 18 19 */ 20 21 22#ifndef _BITS_C_ 23#define _BITS_C_ 24 25#include "basics.h" 26 27INLINE_BITS\ 28(unsigned64) 29LSMASKED64 (unsigned64 word, 30 int start, 31 int stop) 32{ 33 word &= LSMASK64 (start, stop); 34 return word; 35} 36 37INLINE_BITS\ 38(unsigned64) 39LSEXTRACTED64 (unsigned64 val, 40 int start, 41 int stop) 42{ 43 val <<= (64 - 1 - start); /* drop high bits */ 44 val >>= (64 - 1 - start) + (stop); /* drop low bits */ 45 return val; 46} 47 48INLINE_BITS\ 49(unsigned32) 50MASKED32(unsigned32 word, 51 unsigned start, 52 unsigned stop) 53{ 54 return (word & MASK32(start, stop)); 55} 56 57INLINE_BITS\ 58(unsigned64) 59MASKED64(unsigned64 word, 60 unsigned start, 61 unsigned stop) 62{ 63 return (word & MASK64(start, stop)); 64} 65 66INLINE_BITS\ 67(unsigned_word) 68MASKED(unsigned_word word, 69 unsigned start, 70 unsigned stop) 71{ 72 return ((word) & MASK(start, stop)); 73} 74 75 76 77INLINE_BITS\ 78(unsigned_word) 79EXTRACTED(unsigned_word word, 80 unsigned start, 81 unsigned stop) 82{ 83 ASSERT(start <= stop); 84#if (WITH_TARGET_WORD_BITSIZE == 64) 85 return _EXTRACTEDn(64, word, start, stop); 86#else 87 if (stop < 32) 88 return 0; 89 else 90 return ((word >> (63 - stop)) 91 & MASK(start+(63-stop), 63)); 92#endif 93} 94 95 96INLINE_BITS\ 97(unsigned_word) 98INSERTED(unsigned_word word, 99 unsigned start, 100 unsigned stop) 101{ 102 ASSERT(start <= stop); 103#if (WITH_TARGET_WORD_BITSIZE == 64) 104 return _INSERTEDn(64, word, start, stop); 105#else 106 if (stop < 32) 107 return 0; 108 else 109 return ((word & MASK(start+(63-stop), 63)) 110 << (63 - stop)); 111#endif 112} 113 114 115INLINE_BITS\ 116(unsigned32) 117ROTL32(unsigned32 val, 118 long shift) 119{ 120 ASSERT(shift >= 0 && shift <= 32); 121 return _ROTLn(32, val, shift); 122} 123 124 125INLINE_BITS\ 126(unsigned64) 127ROTL64(unsigned64 val, 128 long shift) 129{ 130 ASSERT(shift >= 0 && shift <= 64); 131 return _ROTLn(64, val, shift); 132} 133 134#endif /* _BITS_C_ */ 135