Home | History | Annotate | Line # | Download | only in common
      1 /* The common simulator framework for GDB, the GNU Debugger.
      2 
      3    Copyright 2002-2024 Free Software Foundation, Inc.
      4 
      5    Contributed by Andrew Cagney and Red Hat.
      6 
      7    This file is part of GDB.
      8 
      9    This program is free software; you can redistribute it and/or modify
     10    it under the terms of the GNU General Public License as published by
     11    the Free Software Foundation; either version 3 of the License, or
     12    (at your option) any later version.
     13 
     14    This program is distributed in the hope that it will be useful,
     15    but WITHOUT ANY WARRANTY; without even the implied warranty of
     16    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     17    GNU General Public License for more details.
     18 
     19    You should have received a copy of the GNU General Public License
     20    along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
     21 
     22 
     23 #ifndef N
     24 #error "N must be #defined"
     25 #endif
     26 
     27 #include "symcat.h"
     28 
     29 #if defined(__STDC__) && defined(signed)
     30 /* If signed were defined to be say __signed (ie, some versions of Linux),
     31    then the signedN macro would not work correctly.  If we have a standard
     32    compiler, we have signed.  */
     33 #undef signed
     34 #endif
     35 
     36 /* NOTE: See end of file for #undef */
     37 #define unsignedN XCONCAT3(uint,N,_t)
     38 #define signedN XCONCAT3(int,N,_t)
     39 #define LSMASKn XCONCAT2(LSMASK,N)
     40 #define MSMASKn XCONCAT2(MSMASK,N)
     41 #define LSMASKEDn XCONCAT2(LSMASKED,N)
     42 #define MSMASKEDn XCONCAT2(MSMASKED,N)
     43 #define LSEXTRACTEDn XCONCAT2(LSEXTRACTED,N)
     44 #define MSEXTRACTEDn XCONCAT2(MSEXTRACTED,N)
     45 #define LSINSERTEDn XCONCAT2(LSINSERTED,N)
     46 #define MSINSERTEDn XCONCAT2(MSINSERTED,N)
     47 #define ROTn XCONCAT2(ROT,N)
     48 #define ROTLn XCONCAT2(ROTL,N)
     49 #define ROTRn XCONCAT2(ROTR,N)
     50 #define MSSEXTn XCONCAT2(MSSEXT,N)
     51 #define LSSEXTn XCONCAT2(LSSEXT,N)
     52 
     53 /* TAGS: LSMASKED16 LSMASKED32 LSMASKED64 */
     54 
     55 INLINE_SIM_BITS\
     56 (unsignedN)
     57 LSMASKEDn (unsignedN word,
     58 	   int start,
     59 	   int stop)
     60 {
     61   word &= LSMASKn (start, stop);
     62   return word;
     63 }
     64 
     65 /* TAGS: MSMASKED16 MSMASKED32 MSMASKED64 */
     66 
     67 INLINE_SIM_BITS\
     68 (unsignedN)
     69 MSMASKEDn (unsignedN word,
     70 	   int start,
     71 	   int stop)
     72 {
     73   word &= MSMASKn (start, stop);
     74   return word;
     75 }
     76 
     77 /* TAGS: LSEXTRACTED16 LSEXTRACTED32 LSEXTRACTED64 */
     78 
     79 INLINE_SIM_BITS\
     80 (unsignedN)
     81 LSEXTRACTEDn (unsignedN val,
     82 	      int start,
     83 	      int stop)
     84 {
     85   val <<= (N - 1 - start); /* drop high bits */
     86   val >>= (N - 1 - start) + (stop); /* drop low bits */
     87   return val;
     88 }
     89 
     90 /* TAGS: MSEXTRACTED16 MSEXTRACTED32 MSEXTRACTED64 */
     91 
     92 INLINE_SIM_BITS\
     93 (unsignedN)
     94 MSEXTRACTEDn (unsignedN val,
     95 	      int start,
     96 	      int stop)
     97 {
     98   val <<= (start); /* drop high bits */
     99   val >>= (start) + (N - 1 - stop); /* drop low bits */
    100   return val;
    101 }
    102 
    103 /* TAGS: LSINSERTED16 LSINSERTED32 LSINSERTED64 */
    104 
    105 INLINE_SIM_BITS\
    106 (unsignedN)
    107 LSINSERTEDn (unsignedN val,
    108 	     int start,
    109 	     int stop)
    110 {
    111   val <<= stop;
    112   val &= LSMASKn (start, stop);
    113   return val;
    114 }
    115 
    116 /* TAGS: MSINSERTED16 MSINSERTED32 MSINSERTED64 */
    117 
    118 INLINE_SIM_BITS\
    119 (unsignedN)
    120 MSINSERTEDn (unsignedN val,
    121 	     int start,
    122 	     int stop)
    123 {
    124   val <<= ((N - 1) - stop);
    125   val &= MSMASKn (start, stop);
    126   return val;
    127 }
    128 
    129 /* TAGS: ROT16 ROT32 ROT64 */
    130 
    131 INLINE_SIM_BITS\
    132 (unsignedN)
    133 ROTn (unsignedN val,
    134       int shift)
    135 {
    136   if (shift > 0)
    137     return ROTRn (val, shift);
    138   else if (shift < 0)
    139     return ROTLn (val, -shift);
    140   else
    141     return val;
    142 }
    143 
    144 /* TAGS: ROTL16 ROTL32 ROTL64 */
    145 
    146 INLINE_SIM_BITS\
    147 (unsignedN)
    148 ROTLn (unsignedN val,
    149        int shift)
    150 {
    151   unsignedN result;
    152   ASSERT (shift <= N);
    153   result = (((val) << (shift)) | ((val) >> ((N)-(shift))));
    154   return result;
    155 }
    156 
    157 /* TAGS: ROTR16 ROTR32 ROTR64 */
    158 
    159 INLINE_SIM_BITS\
    160 (unsignedN)
    161 ROTRn (unsignedN val,
    162        int shift)
    163 {
    164   unsignedN result;
    165   ASSERT (shift <= N);
    166   result = (((val) >> (shift)) | ((val) << ((N)-(shift))));
    167   return result;
    168 }
    169 
    170 /* TAGS: LSSEXT16 LSSEXT32 LSSEXT64 */
    171 
    172 INLINE_SIM_BITS\
    173 (unsignedN)
    174 LSSEXTn (signedN val,
    175 	 int sign_bit)
    176 {
    177   int shift;
    178   /* make the sign-bit most significant and then smear it back into
    179      position */
    180   ASSERT (sign_bit < N);
    181   shift = ((N - 1) - sign_bit);
    182   val <<= shift;
    183   val >>= shift;
    184   return val;
    185 }
    186 
    187 /* TAGS: MSSEXT16 MSSEXT32 MSSEXT64 */
    188 
    189 INLINE_SIM_BITS\
    190 (unsignedN)
    191 MSSEXTn (signedN val,
    192 	 int sign_bit)
    193 {
    194   /* make the sign-bit most significant and then smear it back into
    195      position */
    196   ASSERT (sign_bit < N);
    197   val <<= sign_bit;
    198   val >>= sign_bit;
    199   return val;
    200 }
    201 
    202 
    203 /* NOTE: See start of file for #define */
    204 #undef LSSEXTn
    205 #undef MSSEXTn
    206 #undef ROTLn
    207 #undef ROTRn
    208 #undef ROTn
    209 #undef LSINSERTEDn
    210 #undef MSINSERTEDn
    211 #undef LSEXTRACTEDn
    212 #undef MSEXTRACTEDn
    213 #undef LSMASKEDn
    214 #undef LSMASKn
    215 #undef MSMASKEDn
    216 #undef MSMASKn
    217 #undef signedN
    218 #undef unsignedN
    219