xref: /netbsd-src/external/gpl3/gdb/dist/sim/common/sim-bits.c (revision 0d3e0572e40d81edb4fdbff937458d47b685c34c)
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