Home | History | Annotate | Line # | Download | only in common
      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