14e98e3e1Schristos /* The common simulator framework for GDB, the GNU Debugger. 24e98e3e1Schristos 3*0d3e0572Schristos Copyright 2002-2024 Free Software Foundation, Inc. 44e98e3e1Schristos 54e98e3e1Schristos Contributed by Andrew Cagney and Red Hat. 64e98e3e1Schristos 74e98e3e1Schristos This file is part of GDB. 84e98e3e1Schristos 94e98e3e1Schristos This program is free software; you can redistribute it and/or modify 104e98e3e1Schristos it under the terms of the GNU General Public License as published by 114e98e3e1Schristos the Free Software Foundation; either version 3 of the License, or 124e98e3e1Schristos (at your option) any later version. 134e98e3e1Schristos 144e98e3e1Schristos This program is distributed in the hope that it will be useful, 154e98e3e1Schristos but WITHOUT ANY WARRANTY; without even the implied warranty of 164e98e3e1Schristos MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 174e98e3e1Schristos GNU General Public License for more details. 184e98e3e1Schristos 194e98e3e1Schristos You should have received a copy of the GNU General Public License 204e98e3e1Schristos along with this program. If not, see <http://www.gnu.org/licenses/>. */ 214e98e3e1Schristos 224e98e3e1Schristos 234e98e3e1Schristos #ifndef _SIM_BITS_C_ 244e98e3e1Schristos #define _SIM_BITS_C_ 254e98e3e1Schristos 264b169a6bSchristos /* This must come before any other includes. */ 274b169a6bSchristos #include "defs.h" 284b169a6bSchristos 294e98e3e1Schristos #include "sim-basics.h" 304e98e3e1Schristos #include "sim-assert.h" 314e98e3e1Schristos #include "sim-io.h" 324e98e3e1Schristos 334e98e3e1Schristos 344e98e3e1Schristos INLINE_SIM_BITS\ 354e98e3e1Schristos (unsigned_word) 364e98e3e1Schristos LSMASKED (unsigned_word val, 374e98e3e1Schristos int start, 384e98e3e1Schristos int stop) 394e98e3e1Schristos { 404e98e3e1Schristos /* NOTE - start, stop can wrap */ 414e98e3e1Schristos val &= LSMASK (start, stop); 424e98e3e1Schristos return val; 434e98e3e1Schristos } 444e98e3e1Schristos 454e98e3e1Schristos 464e98e3e1Schristos INLINE_SIM_BITS\ 474e98e3e1Schristos (unsigned_word) 484e98e3e1Schristos MSMASKED (unsigned_word val, 494e98e3e1Schristos int start, 504e98e3e1Schristos int stop) 514e98e3e1Schristos { 524e98e3e1Schristos /* NOTE - start, stop can wrap */ 534e98e3e1Schristos val &= MSMASK (start, stop); 544e98e3e1Schristos return val; 554e98e3e1Schristos } 564e98e3e1Schristos 574e98e3e1Schristos 584e98e3e1Schristos INLINE_SIM_BITS\ 594e98e3e1Schristos (unsigned_word) 604e98e3e1Schristos LSEXTRACTED (unsigned_word val, 614e98e3e1Schristos int start, 624e98e3e1Schristos int stop) 634e98e3e1Schristos { 644e98e3e1Schristos ASSERT (start >= stop); 654e98e3e1Schristos #if (WITH_TARGET_WORD_BITSIZE == 64) 664e98e3e1Schristos return LSEXTRACTED64 (val, start, stop); 674e98e3e1Schristos #endif 684e98e3e1Schristos #if (WITH_TARGET_WORD_BITSIZE == 32) 694e98e3e1Schristos if (stop >= 32) 704e98e3e1Schristos return 0; 714e98e3e1Schristos else 724e98e3e1Schristos { 734e98e3e1Schristos if (start < 32) 744e98e3e1Schristos val &= LSMASK (start, 0); 754e98e3e1Schristos val >>= stop; 764e98e3e1Schristos return val; 774e98e3e1Schristos } 784e98e3e1Schristos #endif 794e98e3e1Schristos #if (WITH_TARGET_WORD_BITSIZE == 16) 804e98e3e1Schristos if (stop >= 16) 814e98e3e1Schristos return 0; 824e98e3e1Schristos else 834e98e3e1Schristos { 844e98e3e1Schristos if (start < 16) 854e98e3e1Schristos val &= LSMASK (start, 0); 864e98e3e1Schristos val >>= stop; 874e98e3e1Schristos return val; 884e98e3e1Schristos } 894e98e3e1Schristos #endif 904e98e3e1Schristos } 914e98e3e1Schristos 924e98e3e1Schristos 934e98e3e1Schristos INLINE_SIM_BITS\ 944e98e3e1Schristos (unsigned_word) 954e98e3e1Schristos MSEXTRACTED (unsigned_word val, 964e98e3e1Schristos int start, 974e98e3e1Schristos int stop) 984e98e3e1Schristos { 994e98e3e1Schristos ASSERT (start <= stop); 1004e98e3e1Schristos #if (WITH_TARGET_WORD_BITSIZE == 64) 1014e98e3e1Schristos return MSEXTRACTED64 (val, start, stop); 1024e98e3e1Schristos #endif 1034e98e3e1Schristos #if (WITH_TARGET_WORD_BITSIZE == 32) 1044e98e3e1Schristos if (stop < 32) 1054e98e3e1Schristos return 0; 1064e98e3e1Schristos else 1074e98e3e1Schristos { 1084e98e3e1Schristos if (start >= 32) 1094e98e3e1Schristos val &= MSMASK (start, 64 - 1); 1104e98e3e1Schristos val >>= (64 - stop - 1); 1114e98e3e1Schristos return val; 1124e98e3e1Schristos } 1134e98e3e1Schristos #endif 1144e98e3e1Schristos #if (WITH_TARGET_WORD_BITSIZE == 16) 1154e98e3e1Schristos if (stop < 16) 1164e98e3e1Schristos return 0; 1174e98e3e1Schristos else 1184e98e3e1Schristos { 1194e98e3e1Schristos if (start >= 16) 1204e98e3e1Schristos val &= MSMASK (start, 64 - 1); 1214e98e3e1Schristos val >>= (64 - stop - 1); 1224e98e3e1Schristos return val; 1234e98e3e1Schristos } 1244e98e3e1Schristos #endif 1254e98e3e1Schristos } 1264e98e3e1Schristos 1274e98e3e1Schristos 1284e98e3e1Schristos INLINE_SIM_BITS\ 1294e98e3e1Schristos (unsigned_word) 1304e98e3e1Schristos LSINSERTED (unsigned_word val, 1314e98e3e1Schristos int start, 1324e98e3e1Schristos int stop) 1334e98e3e1Schristos { 1344e98e3e1Schristos ASSERT (start >= stop); 1354e98e3e1Schristos #if (WITH_TARGET_WORD_BITSIZE == 64) 1364e98e3e1Schristos return LSINSERTED64 (val, start, stop); 1374e98e3e1Schristos #endif 1384e98e3e1Schristos #if (WITH_TARGET_WORD_BITSIZE == 32) 1394e98e3e1Schristos /* Bit numbers are 63..0, even for 32 bit targets. 1404e98e3e1Schristos On 32 bit targets we ignore 63..32 */ 1414e98e3e1Schristos if (stop >= 32) 1424e98e3e1Schristos return 0; 1434e98e3e1Schristos else 1444e98e3e1Schristos { 1454e98e3e1Schristos val <<= stop; 1464e98e3e1Schristos val &= LSMASK (start, stop); 1474e98e3e1Schristos return val; 1484e98e3e1Schristos } 1494e98e3e1Schristos #endif 1504e98e3e1Schristos #if (WITH_TARGET_WORD_BITSIZE == 16) 1514e98e3e1Schristos /* Bit numbers are 63..0, even for 16 bit targets. 1524e98e3e1Schristos On 16 bit targets we ignore 63..16 */ 1534e98e3e1Schristos if (stop >= 16) 1544e98e3e1Schristos return 0; 1554e98e3e1Schristos else 1564e98e3e1Schristos { 1574e98e3e1Schristos val <<= stop; 1584e98e3e1Schristos val &= LSMASK (start, stop); 1594e98e3e1Schristos return val; 1604e98e3e1Schristos } 1614e98e3e1Schristos #endif 1624e98e3e1Schristos } 1634e98e3e1Schristos 1644e98e3e1Schristos INLINE_SIM_BITS\ 1654e98e3e1Schristos (unsigned_word) 1664e98e3e1Schristos MSINSERTED (unsigned_word val, 1674e98e3e1Schristos int start, 1684e98e3e1Schristos int stop) 1694e98e3e1Schristos { 1704e98e3e1Schristos ASSERT (start <= stop); 1714e98e3e1Schristos #if (WITH_TARGET_WORD_BITSIZE == 64) 1724e98e3e1Schristos return MSINSERTED64 (val, start, stop); 1734e98e3e1Schristos #endif 1744e98e3e1Schristos #if (WITH_TARGET_WORD_BITSIZE == 32) 1754e98e3e1Schristos /* Bit numbers are 0..63, even for 32 bit targets. 1764e98e3e1Schristos On 32 bit targets we ignore 0..31. */ 1774e98e3e1Schristos if (stop < 32) 1784e98e3e1Schristos return 0; 1794e98e3e1Schristos else 1804e98e3e1Schristos { 1814e98e3e1Schristos val <<= ((64 - 1) - stop); 1824e98e3e1Schristos val &= MSMASK (start, stop); 1834e98e3e1Schristos return val; 1844e98e3e1Schristos } 1854e98e3e1Schristos #endif 1864e98e3e1Schristos #if (WITH_TARGET_WORD_BITSIZE == 16) 1874e98e3e1Schristos /* Bit numbers are 0..63, even for 16 bit targets. 1884e98e3e1Schristos On 16 bit targets we ignore 0..47. */ 1894e98e3e1Schristos if (stop < 32 + 16) 1904e98e3e1Schristos return 0; 1914e98e3e1Schristos else 1924e98e3e1Schristos { 1934e98e3e1Schristos val <<= ((64 - 1) - stop); 1944e98e3e1Schristos val &= MSMASK (start, stop); 1954e98e3e1Schristos return val; 1964e98e3e1Schristos } 1974e98e3e1Schristos #endif 1984e98e3e1Schristos } 1994e98e3e1Schristos 2004e98e3e1Schristos 2014e98e3e1Schristos 2024e98e3e1Schristos INLINE_SIM_BITS\ 2034e98e3e1Schristos (unsigned_word) 2044e98e3e1Schristos LSSEXT (signed_word val, 2054e98e3e1Schristos int sign_bit) 2064e98e3e1Schristos { 2074e98e3e1Schristos ASSERT (sign_bit < 64); 2084e98e3e1Schristos #if (WITH_TARGET_WORD_BITSIZE == 64) 2094e98e3e1Schristos return LSSEXT64 (val, sign_bit); 2104e98e3e1Schristos #endif 2114e98e3e1Schristos #if (WITH_TARGET_WORD_BITSIZE == 32) 2124e98e3e1Schristos if (sign_bit >= 32) 2134e98e3e1Schristos return val; 2144e98e3e1Schristos else { 2154e98e3e1Schristos val = LSSEXT32 (val, sign_bit); 2164e98e3e1Schristos return val; 2174e98e3e1Schristos } 2184e98e3e1Schristos #endif 2194e98e3e1Schristos #if (WITH_TARGET_WORD_BITSIZE == 16) 2204e98e3e1Schristos if (sign_bit >= 16) 2214e98e3e1Schristos return val; 2224e98e3e1Schristos else { 2234e98e3e1Schristos val = LSSEXT16 (val, sign_bit); 2244e98e3e1Schristos return val; 2254e98e3e1Schristos } 2264e98e3e1Schristos #endif 2274e98e3e1Schristos } 2284e98e3e1Schristos 2294e98e3e1Schristos INLINE_SIM_BITS\ 2304e98e3e1Schristos (unsigned_word) 2314e98e3e1Schristos MSSEXT (signed_word val, 2324e98e3e1Schristos int sign_bit) 2334e98e3e1Schristos { 2344e98e3e1Schristos ASSERT (sign_bit < 64); 2354e98e3e1Schristos #if (WITH_TARGET_WORD_BITSIZE == 64) 2364e98e3e1Schristos return MSSEXT64 (val, sign_bit); 2374e98e3e1Schristos #endif 2384e98e3e1Schristos #if (WITH_TARGET_WORD_BITSIZE == 32) 2394e98e3e1Schristos if (sign_bit < 32) 2404e98e3e1Schristos return val; 2414e98e3e1Schristos else { 2424e98e3e1Schristos val = MSSEXT32 (val, sign_bit - 32); 2434e98e3e1Schristos return val; 2444e98e3e1Schristos } 2454e98e3e1Schristos #endif 2464e98e3e1Schristos #if (WITH_TARGET_WORD_BITSIZE == 16) 2474e98e3e1Schristos if (sign_bit < 32 + 16) 2484e98e3e1Schristos return val; 2494e98e3e1Schristos else { 2504e98e3e1Schristos val = MSSEXT16 (val, sign_bit - 32 - 16); 2514e98e3e1Schristos return val; 2524e98e3e1Schristos } 2534e98e3e1Schristos #endif 2544e98e3e1Schristos } 2554e98e3e1Schristos 2564e98e3e1Schristos 2574e98e3e1Schristos 2584e98e3e1Schristos #define N 8 2594e98e3e1Schristos #include "sim-n-bits.h" 2604e98e3e1Schristos #undef N 2614e98e3e1Schristos 2624e98e3e1Schristos #define N 16 2634e98e3e1Schristos #include "sim-n-bits.h" 2644e98e3e1Schristos #undef N 2654e98e3e1Schristos 2664e98e3e1Schristos #define N 32 2674e98e3e1Schristos #include "sim-n-bits.h" 2684e98e3e1Schristos #undef N 2694e98e3e1Schristos 2704e98e3e1Schristos #define N 64 2714e98e3e1Schristos #include "sim-n-bits.h" 2724e98e3e1Schristos #undef N 2734e98e3e1Schristos 2744e98e3e1Schristos #endif /* _SIM_BITS_C_ */ 275