1 1.1 christos /* The common simulator framework for GDB, the GNU Debugger. 2 1.1 christos 3 1.11 christos Copyright 2002-2024 Free Software Foundation, Inc. 4 1.1 christos 5 1.1 christos Contributed by Andrew Cagney and Red Hat. 6 1.1 christos 7 1.1 christos This file is part of GDB. 8 1.1 christos 9 1.1 christos This program is free software; you can redistribute it and/or modify 10 1.1 christos it under the terms of the GNU General Public License as published by 11 1.1 christos the Free Software Foundation; either version 3 of the License, or 12 1.1 christos (at your option) any later version. 13 1.1 christos 14 1.1 christos This program is distributed in the hope that it will be useful, 15 1.1 christos but WITHOUT ANY WARRANTY; without even the implied warranty of 16 1.1 christos MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 17 1.1 christos GNU General Public License for more details. 18 1.1 christos 19 1.1 christos You should have received a copy of the GNU General Public License 20 1.1 christos along with this program. If not, see <http://www.gnu.org/licenses/>. */ 21 1.1 christos 22 1.1 christos 23 1.1 christos #ifndef _SIM_BITS_C_ 24 1.1 christos #define _SIM_BITS_C_ 25 1.1 christos 26 1.10 christos /* This must come before any other includes. */ 27 1.10 christos #include "defs.h" 28 1.10 christos 29 1.1 christos #include "sim-basics.h" 30 1.1 christos #include "sim-assert.h" 31 1.1 christos #include "sim-io.h" 32 1.1 christos 33 1.1 christos 34 1.1 christos INLINE_SIM_BITS\ 35 1.1 christos (unsigned_word) 36 1.1 christos LSMASKED (unsigned_word val, 37 1.1 christos int start, 38 1.1 christos int stop) 39 1.1 christos { 40 1.1 christos /* NOTE - start, stop can wrap */ 41 1.1 christos val &= LSMASK (start, stop); 42 1.1 christos return val; 43 1.1 christos } 44 1.1 christos 45 1.1 christos 46 1.1 christos INLINE_SIM_BITS\ 47 1.1 christos (unsigned_word) 48 1.1 christos MSMASKED (unsigned_word val, 49 1.1 christos int start, 50 1.1 christos int stop) 51 1.1 christos { 52 1.1 christos /* NOTE - start, stop can wrap */ 53 1.1 christos val &= MSMASK (start, stop); 54 1.1 christos return val; 55 1.1 christos } 56 1.1 christos 57 1.1 christos 58 1.1 christos INLINE_SIM_BITS\ 59 1.1 christos (unsigned_word) 60 1.1 christos LSEXTRACTED (unsigned_word val, 61 1.1 christos int start, 62 1.1 christos int stop) 63 1.1 christos { 64 1.1 christos ASSERT (start >= stop); 65 1.1 christos #if (WITH_TARGET_WORD_BITSIZE == 64) 66 1.1 christos return LSEXTRACTED64 (val, start, stop); 67 1.1 christos #endif 68 1.1 christos #if (WITH_TARGET_WORD_BITSIZE == 32) 69 1.1 christos if (stop >= 32) 70 1.1 christos return 0; 71 1.1 christos else 72 1.1 christos { 73 1.1 christos if (start < 32) 74 1.1 christos val &= LSMASK (start, 0); 75 1.1 christos val >>= stop; 76 1.1 christos return val; 77 1.1 christos } 78 1.1 christos #endif 79 1.1 christos #if (WITH_TARGET_WORD_BITSIZE == 16) 80 1.1 christos if (stop >= 16) 81 1.1 christos return 0; 82 1.1 christos else 83 1.1 christos { 84 1.1 christos if (start < 16) 85 1.1 christos val &= LSMASK (start, 0); 86 1.1 christos val >>= stop; 87 1.1 christos return val; 88 1.1 christos } 89 1.1 christos #endif 90 1.1 christos } 91 1.1 christos 92 1.1 christos 93 1.1 christos INLINE_SIM_BITS\ 94 1.1 christos (unsigned_word) 95 1.1 christos MSEXTRACTED (unsigned_word val, 96 1.1 christos int start, 97 1.1 christos int stop) 98 1.1 christos { 99 1.1 christos ASSERT (start <= stop); 100 1.1 christos #if (WITH_TARGET_WORD_BITSIZE == 64) 101 1.1 christos return MSEXTRACTED64 (val, start, stop); 102 1.1 christos #endif 103 1.1 christos #if (WITH_TARGET_WORD_BITSIZE == 32) 104 1.1 christos if (stop < 32) 105 1.1 christos return 0; 106 1.1 christos else 107 1.1 christos { 108 1.1 christos if (start >= 32) 109 1.1 christos val &= MSMASK (start, 64 - 1); 110 1.1 christos val >>= (64 - stop - 1); 111 1.1 christos return val; 112 1.1 christos } 113 1.1 christos #endif 114 1.1 christos #if (WITH_TARGET_WORD_BITSIZE == 16) 115 1.1 christos if (stop < 16) 116 1.1 christos return 0; 117 1.1 christos else 118 1.1 christos { 119 1.1 christos if (start >= 16) 120 1.1 christos val &= MSMASK (start, 64 - 1); 121 1.1 christos val >>= (64 - stop - 1); 122 1.1 christos return val; 123 1.1 christos } 124 1.1 christos #endif 125 1.1 christos } 126 1.1 christos 127 1.1 christos 128 1.1 christos INLINE_SIM_BITS\ 129 1.1 christos (unsigned_word) 130 1.1 christos LSINSERTED (unsigned_word val, 131 1.1 christos int start, 132 1.1 christos int stop) 133 1.1 christos { 134 1.1 christos ASSERT (start >= stop); 135 1.1 christos #if (WITH_TARGET_WORD_BITSIZE == 64) 136 1.1 christos return LSINSERTED64 (val, start, stop); 137 1.1 christos #endif 138 1.1 christos #if (WITH_TARGET_WORD_BITSIZE == 32) 139 1.1 christos /* Bit numbers are 63..0, even for 32 bit targets. 140 1.1 christos On 32 bit targets we ignore 63..32 */ 141 1.1 christos if (stop >= 32) 142 1.1 christos return 0; 143 1.1 christos else 144 1.1 christos { 145 1.1 christos val <<= stop; 146 1.1 christos val &= LSMASK (start, stop); 147 1.1 christos return val; 148 1.1 christos } 149 1.1 christos #endif 150 1.1 christos #if (WITH_TARGET_WORD_BITSIZE == 16) 151 1.1 christos /* Bit numbers are 63..0, even for 16 bit targets. 152 1.1 christos On 16 bit targets we ignore 63..16 */ 153 1.1 christos if (stop >= 16) 154 1.1 christos return 0; 155 1.1 christos else 156 1.1 christos { 157 1.1 christos val <<= stop; 158 1.1 christos val &= LSMASK (start, stop); 159 1.1 christos return val; 160 1.1 christos } 161 1.1 christos #endif 162 1.1 christos } 163 1.1 christos 164 1.1 christos INLINE_SIM_BITS\ 165 1.1 christos (unsigned_word) 166 1.1 christos MSINSERTED (unsigned_word val, 167 1.1 christos int start, 168 1.1 christos int stop) 169 1.1 christos { 170 1.1 christos ASSERT (start <= stop); 171 1.1 christos #if (WITH_TARGET_WORD_BITSIZE == 64) 172 1.1 christos return MSINSERTED64 (val, start, stop); 173 1.1 christos #endif 174 1.1 christos #if (WITH_TARGET_WORD_BITSIZE == 32) 175 1.1 christos /* Bit numbers are 0..63, even for 32 bit targets. 176 1.1 christos On 32 bit targets we ignore 0..31. */ 177 1.1 christos if (stop < 32) 178 1.1 christos return 0; 179 1.1 christos else 180 1.1 christos { 181 1.1 christos val <<= ((64 - 1) - stop); 182 1.1 christos val &= MSMASK (start, stop); 183 1.1 christos return val; 184 1.1 christos } 185 1.1 christos #endif 186 1.1 christos #if (WITH_TARGET_WORD_BITSIZE == 16) 187 1.1 christos /* Bit numbers are 0..63, even for 16 bit targets. 188 1.1 christos On 16 bit targets we ignore 0..47. */ 189 1.1 christos if (stop < 32 + 16) 190 1.1 christos return 0; 191 1.1 christos else 192 1.1 christos { 193 1.1 christos val <<= ((64 - 1) - stop); 194 1.1 christos val &= MSMASK (start, stop); 195 1.1 christos return val; 196 1.1 christos } 197 1.1 christos #endif 198 1.1 christos } 199 1.1 christos 200 1.1 christos 201 1.1 christos 202 1.1 christos INLINE_SIM_BITS\ 203 1.1 christos (unsigned_word) 204 1.1 christos LSSEXT (signed_word val, 205 1.1 christos int sign_bit) 206 1.1 christos { 207 1.1 christos ASSERT (sign_bit < 64); 208 1.1 christos #if (WITH_TARGET_WORD_BITSIZE == 64) 209 1.1 christos return LSSEXT64 (val, sign_bit); 210 1.1 christos #endif 211 1.1 christos #if (WITH_TARGET_WORD_BITSIZE == 32) 212 1.1 christos if (sign_bit >= 32) 213 1.1 christos return val; 214 1.1 christos else { 215 1.1 christos val = LSSEXT32 (val, sign_bit); 216 1.1 christos return val; 217 1.1 christos } 218 1.1 christos #endif 219 1.1 christos #if (WITH_TARGET_WORD_BITSIZE == 16) 220 1.1 christos if (sign_bit >= 16) 221 1.1 christos return val; 222 1.1 christos else { 223 1.1 christos val = LSSEXT16 (val, sign_bit); 224 1.1 christos return val; 225 1.1 christos } 226 1.1 christos #endif 227 1.1 christos } 228 1.1 christos 229 1.1 christos INLINE_SIM_BITS\ 230 1.1 christos (unsigned_word) 231 1.1 christos MSSEXT (signed_word val, 232 1.1 christos int sign_bit) 233 1.1 christos { 234 1.1 christos ASSERT (sign_bit < 64); 235 1.1 christos #if (WITH_TARGET_WORD_BITSIZE == 64) 236 1.1 christos return MSSEXT64 (val, sign_bit); 237 1.1 christos #endif 238 1.1 christos #if (WITH_TARGET_WORD_BITSIZE == 32) 239 1.1 christos if (sign_bit < 32) 240 1.1 christos return val; 241 1.1 christos else { 242 1.1 christos val = MSSEXT32 (val, sign_bit - 32); 243 1.1 christos return val; 244 1.1 christos } 245 1.1 christos #endif 246 1.1 christos #if (WITH_TARGET_WORD_BITSIZE == 16) 247 1.1 christos if (sign_bit < 32 + 16) 248 1.1 christos return val; 249 1.1 christos else { 250 1.1 christos val = MSSEXT16 (val, sign_bit - 32 - 16); 251 1.1 christos return val; 252 1.1 christos } 253 1.1 christos #endif 254 1.1 christos } 255 1.1 christos 256 1.1 christos 257 1.1 christos 258 1.1 christos #define N 8 259 1.1 christos #include "sim-n-bits.h" 260 1.1 christos #undef N 261 1.1 christos 262 1.1 christos #define N 16 263 1.1 christos #include "sim-n-bits.h" 264 1.1 christos #undef N 265 1.1 christos 266 1.1 christos #define N 32 267 1.1 christos #include "sim-n-bits.h" 268 1.1 christos #undef N 269 1.1 christos 270 1.1 christos #define N 64 271 1.1 christos #include "sim-n-bits.h" 272 1.1 christos #undef N 273 1.1 christos 274 1.1 christos #endif /* _SIM_BITS_C_ */ 275