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 27 INLINE_BITS\ 28 (unsigned64) 29 LSMASKED64 (unsigned64 word, 30 int start, 31 int stop) 32 { 33 word &= LSMASK64 (start, stop); 34 return word; 35 } 36 37 INLINE_BITS\ 38 (unsigned64) 39 LSEXTRACTED64 (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 48 INLINE_BITS\ 49 (unsigned32) 50 MASKED32(unsigned32 word, 51 unsigned start, 52 unsigned stop) 53 { 54 return (word & MASK32(start, stop)); 55 } 56 57 INLINE_BITS\ 58 (unsigned64) 59 MASKED64(unsigned64 word, 60 unsigned start, 61 unsigned stop) 62 { 63 return (word & MASK64(start, stop)); 64 } 65 66 INLINE_BITS\ 67 (unsigned_word) 68 MASKED(unsigned_word word, 69 unsigned start, 70 unsigned stop) 71 { 72 return ((word) & MASK(start, stop)); 73 } 74 75 76 77 INLINE_BITS\ 78 (unsigned_word) 79 EXTRACTED(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 96 INLINE_BITS\ 97 (unsigned_word) 98 INSERTED(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 115 INLINE_BITS\ 116 (unsigned32) 117 ROTL32(unsigned32 val, 118 long shift) 119 { 120 ASSERT(shift >= 0 && shift <= 32); 121 return _ROTLn(32, val, shift); 122 } 123 124 125 INLINE_BITS\ 126 (unsigned64) 127 ROTL64(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