Home | History | Annotate | Line # | Download | only in common
sim-endian.h revision 1.1.1.9
      1      1.1  christos /* The common simulator framework for GDB, the GNU Debugger.
      2      1.1  christos 
      3  1.1.1.9  christos    Copyright 2002-2020 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.1.5  christos #ifndef SIM_ENDIAN_H
     24  1.1.1.5  christos #define SIM_ENDIAN_H
     25      1.1  christos 
     26      1.1  christos 
     27      1.1  christos /* C byte conversion functions */
     28      1.1  christos 
     29      1.1  christos INLINE_SIM_ENDIAN(unsigned_1) endian_h2t_1(unsigned_1 x);
     30      1.1  christos INLINE_SIM_ENDIAN(unsigned_2) endian_h2t_2(unsigned_2 x);
     31      1.1  christos INLINE_SIM_ENDIAN(unsigned_4) endian_h2t_4(unsigned_4 x);
     32      1.1  christos INLINE_SIM_ENDIAN(unsigned_8) endian_h2t_8(unsigned_8 x);
     33      1.1  christos INLINE_SIM_ENDIAN(unsigned_16) endian_h2t_16(unsigned_16 x);
     34      1.1  christos 
     35      1.1  christos INLINE_SIM_ENDIAN(unsigned_1) endian_t2h_1(unsigned_1 x);
     36      1.1  christos INLINE_SIM_ENDIAN(unsigned_2) endian_t2h_2(unsigned_2 x);
     37      1.1  christos INLINE_SIM_ENDIAN(unsigned_4) endian_t2h_4(unsigned_4 x);
     38      1.1  christos INLINE_SIM_ENDIAN(unsigned_8) endian_t2h_8(unsigned_8 x);
     39      1.1  christos INLINE_SIM_ENDIAN(unsigned_16) endian_t2h_16(unsigned_16 x);
     40      1.1  christos 
     41      1.1  christos INLINE_SIM_ENDIAN(unsigned_1) swap_1(unsigned_1 x);
     42      1.1  christos INLINE_SIM_ENDIAN(unsigned_2) swap_2(unsigned_2 x);
     43      1.1  christos INLINE_SIM_ENDIAN(unsigned_4) swap_4(unsigned_4 x);
     44      1.1  christos INLINE_SIM_ENDIAN(unsigned_8) swap_8(unsigned_8 x);
     45      1.1  christos INLINE_SIM_ENDIAN(unsigned_16) swap_16(unsigned_16 x);
     46      1.1  christos 
     47      1.1  christos INLINE_SIM_ENDIAN(unsigned_1) endian_h2be_1(unsigned_1 x);
     48      1.1  christos INLINE_SIM_ENDIAN(unsigned_2) endian_h2be_2(unsigned_2 x);
     49      1.1  christos INLINE_SIM_ENDIAN(unsigned_4) endian_h2be_4(unsigned_4 x);
     50      1.1  christos INLINE_SIM_ENDIAN(unsigned_8) endian_h2be_8(unsigned_8 x);
     51      1.1  christos INLINE_SIM_ENDIAN(unsigned_16) endian_h2be_16(unsigned_16 x);
     52      1.1  christos 
     53      1.1  christos INLINE_SIM_ENDIAN(unsigned_1) endian_be2h_1(unsigned_1 x);
     54      1.1  christos INLINE_SIM_ENDIAN(unsigned_2) endian_be2h_2(unsigned_2 x);
     55      1.1  christos INLINE_SIM_ENDIAN(unsigned_4) endian_be2h_4(unsigned_4 x);
     56      1.1  christos INLINE_SIM_ENDIAN(unsigned_8) endian_be2h_8(unsigned_8 x);
     57      1.1  christos INLINE_SIM_ENDIAN(unsigned_16) endian_be2h_16(unsigned_16 x);
     58      1.1  christos 
     59      1.1  christos INLINE_SIM_ENDIAN(unsigned_1) endian_h2le_1(unsigned_1 x);
     60      1.1  christos INLINE_SIM_ENDIAN(unsigned_2) endian_h2le_2(unsigned_2 x);
     61      1.1  christos INLINE_SIM_ENDIAN(unsigned_4) endian_h2le_4(unsigned_4 x);
     62      1.1  christos INLINE_SIM_ENDIAN(unsigned_8) endian_h2le_8(unsigned_8 x);
     63      1.1  christos INLINE_SIM_ENDIAN(unsigned_16) endian_h2le_16(unsigned_16 x);
     64      1.1  christos 
     65      1.1  christos INLINE_SIM_ENDIAN(unsigned_1) endian_le2h_1(unsigned_1 x);
     66      1.1  christos INLINE_SIM_ENDIAN(unsigned_2) endian_le2h_2(unsigned_2 x);
     67      1.1  christos INLINE_SIM_ENDIAN(unsigned_4) endian_le2h_4(unsigned_4 x);
     68      1.1  christos INLINE_SIM_ENDIAN(unsigned_8) endian_le2h_8(unsigned_8 x);
     69      1.1  christos INLINE_SIM_ENDIAN(unsigned_16) endian_le2h_16(unsigned_16 x);
     70      1.1  christos 
     71      1.1  christos INLINE_SIM_ENDIAN(void*) offset_1(unsigned_1 *x, unsigned ws, unsigned w);
     72      1.1  christos INLINE_SIM_ENDIAN(void*) offset_2(unsigned_2 *x, unsigned ws, unsigned w);
     73      1.1  christos INLINE_SIM_ENDIAN(void*) offset_4(unsigned_4 *x, unsigned ws, unsigned w);
     74      1.1  christos INLINE_SIM_ENDIAN(void*) offset_8(unsigned_8 *x, unsigned ws, unsigned w);
     75      1.1  christos INLINE_SIM_ENDIAN(void*) offset_16(unsigned_16 *x, unsigned ws, unsigned w);
     76      1.1  christos 
     77      1.1  christos INLINE_SIM_ENDIAN(unsigned_16) sim_endian_join_16 (unsigned_8 h, unsigned_8 l);
     78      1.1  christos INLINE_SIM_ENDIAN(unsigned_8) sim_endian_split_16 (unsigned_16 word, int w);
     79      1.1  christos 
     80      1.1  christos 
     81      1.1  christos /* SWAP */
     82      1.1  christos 
     83      1.1  christos #define SWAP_1 swap_1
     84      1.1  christos #define SWAP_2 swap_2
     85      1.1  christos #define SWAP_4 swap_4
     86      1.1  christos #define SWAP_8 swap_8
     87      1.1  christos #define SWAP_16 swap_16
     88      1.1  christos 
     89      1.1  christos 
     90      1.1  christos /* HOST to BE */
     91      1.1  christos 
     92      1.1  christos #define H2BE_1 endian_h2be_1
     93      1.1  christos #define H2BE_2 endian_h2be_2
     94      1.1  christos #define H2BE_4 endian_h2be_4
     95      1.1  christos #define H2BE_8 endian_h2be_8
     96      1.1  christos #define H2BE_16 endian_h2be_16
     97      1.1  christos #define BE2H_1 endian_be2h_1
     98      1.1  christos #define BE2H_2 endian_be2h_2
     99      1.1  christos #define BE2H_4 endian_be2h_4
    100      1.1  christos #define BE2H_8 endian_be2h_8
    101      1.1  christos #define BE2H_16 endian_be2h_16
    102      1.1  christos 
    103      1.1  christos 
    104      1.1  christos /* HOST to LE */
    105      1.1  christos 
    106      1.1  christos #define H2LE_1 endian_h2le_1
    107      1.1  christos #define H2LE_2 endian_h2le_2
    108      1.1  christos #define H2LE_4 endian_h2le_4
    109      1.1  christos #define H2LE_8 endian_h2le_8
    110      1.1  christos #define H2LE_16 endian_h2le_16
    111      1.1  christos #define LE2H_1 endian_le2h_1
    112      1.1  christos #define LE2H_2 endian_le2h_2
    113      1.1  christos #define LE2H_4 endian_le2h_4
    114      1.1  christos #define LE2H_8 endian_le2h_8
    115      1.1  christos #define LE2H_16 endian_le2h_16
    116      1.1  christos 
    117      1.1  christos 
    118      1.1  christos /* HOST to TARGET */
    119      1.1  christos 
    120      1.1  christos #define H2T_1 endian_h2t_1
    121      1.1  christos #define H2T_2 endian_h2t_2
    122      1.1  christos #define H2T_4 endian_h2t_4
    123      1.1  christos #define H2T_8 endian_h2t_8
    124      1.1  christos #define H2T_16 endian_h2t_16
    125      1.1  christos #define T2H_1 endian_t2h_1
    126      1.1  christos #define T2H_2 endian_t2h_2
    127      1.1  christos #define T2H_4 endian_t2h_4
    128      1.1  christos #define T2H_8 endian_t2h_8
    129      1.1  christos #define T2H_16 endian_t2h_16
    130      1.1  christos 
    131      1.1  christos 
    132      1.1  christos /* CONVERT IN PLACE
    133      1.1  christos 
    134      1.1  christos    These macros, given an argument of unknown size, swap its value in
    135      1.1  christos    place if a host/target conversion is required. */
    136      1.1  christos 
    137      1.1  christos #define H2T(VARIABLE) \
    138      1.1  christos do { \
    139      1.1  christos   void *vp = &(VARIABLE); \
    140      1.1  christos   switch (sizeof (VARIABLE)) { \
    141      1.1  christos   case 1: *(unsigned_1*)vp = H2T_1(*(unsigned_1*)vp); break; \
    142      1.1  christos   case 2: *(unsigned_2*)vp = H2T_2(*(unsigned_2*)vp); break; \
    143      1.1  christos   case 4: *(unsigned_4*)vp = H2T_4(*(unsigned_4*)vp); break; \
    144      1.1  christos   case 8: *(unsigned_8*)vp = H2T_8(*(unsigned_8*)vp); break; \
    145      1.1  christos   case 16: *(unsigned_16*)vp = H2T_16(*(unsigned_16*)vp); break; \
    146      1.1  christos   } \
    147      1.1  christos } while (0)
    148      1.1  christos 
    149      1.1  christos #define T2H(VARIABLE) \
    150      1.1  christos do { \
    151      1.1  christos   switch (sizeof(VARIABLE)) { \
    152      1.1  christos   case 1: VARIABLE = T2H_1(VARIABLE); break; \
    153      1.1  christos   case 2: VARIABLE = T2H_2(VARIABLE); break; \
    154      1.1  christos   case 4: VARIABLE = T2H_4(VARIABLE); break; \
    155      1.1  christos   case 8: VARIABLE = T2H_8(VARIABLE); break; \
    156      1.1  christos   /*case 16: VARIABLE = T2H_16(VARIABLE); break;*/ \
    157      1.1  christos   } \
    158      1.1  christos } while (0)
    159      1.1  christos 
    160      1.1  christos #define SWAP(VARIABLE) \
    161      1.1  christos do { \
    162      1.1  christos   switch (sizeof(VARIABLE)) { \
    163      1.1  christos   case 1: VARIABLE = SWAP_1(VARIABLE); break; \
    164      1.1  christos   case 2: VARIABLE = SWAP_2(VARIABLE); break; \
    165      1.1  christos   case 4: VARIABLE = SWAP_4(VARIABLE); break; \
    166      1.1  christos   case 8: VARIABLE = SWAP_8(VARIABLE); break; \
    167      1.1  christos   /*case 16: VARIABLE = SWAP_16(VARIABLE); break;*/ \
    168      1.1  christos   } \
    169      1.1  christos } while (0)
    170      1.1  christos 
    171      1.1  christos #define H2BE(VARIABLE) \
    172      1.1  christos do { \
    173      1.1  christos   switch (sizeof(VARIABLE)) { \
    174      1.1  christos   case 1: VARIABLE = H2BE_1(VARIABLE); break; \
    175      1.1  christos   case 2: VARIABLE = H2BE_2(VARIABLE); break; \
    176      1.1  christos   case 4: VARIABLE = H2BE_4(VARIABLE); break; \
    177      1.1  christos   case 8: VARIABLE = H2BE_8(VARIABLE); break; \
    178      1.1  christos   /*case 16: VARIABLE = H2BE_16(VARIABLE); break;*/ \
    179      1.1  christos   } \
    180      1.1  christos } while (0)
    181      1.1  christos 
    182      1.1  christos #define BE2H(VARIABLE) \
    183      1.1  christos do { \
    184      1.1  christos   switch (sizeof(VARIABLE)) { \
    185      1.1  christos   case 1: VARIABLE = BE2H_1(VARIABLE); break; \
    186      1.1  christos   case 2: VARIABLE = BE2H_2(VARIABLE); break; \
    187      1.1  christos   case 4: VARIABLE = BE2H_4(VARIABLE); break; \
    188      1.1  christos   case 8: VARIABLE = BE2H_8(VARIABLE); break; \
    189      1.1  christos   /*case 16: VARIABLE = BE2H_16(VARIABLE); break;*/ \
    190      1.1  christos   } \
    191      1.1  christos } while (0)
    192      1.1  christos 
    193      1.1  christos #define H2LE(VARIABLE) \
    194      1.1  christos do { \
    195      1.1  christos   switch (sizeof(VARIABLE)) { \
    196      1.1  christos   case 1: VARIABLE = H2LE_1(VARIABLE); break; \
    197      1.1  christos   case 2: VARIABLE = H2LE_2(VARIABLE); break; \
    198      1.1  christos   case 4: VARIABLE = H2LE_4(VARIABLE); break; \
    199      1.1  christos   case 8: VARIABLE = H2LE_8(VARIABLE); break; \
    200      1.1  christos   /*case 16: VARIABLE = H2LE_16(VARIABLE); break;*/ \
    201      1.1  christos   } \
    202      1.1  christos } while (0)
    203      1.1  christos 
    204      1.1  christos #define LE2H(VARIABLE) \
    205      1.1  christos do { \
    206      1.1  christos   switch (sizeof(VARIABLE)) { \
    207      1.1  christos   case 1: VARIABLE = LE2H_1(VARIABLE); break; \
    208      1.1  christos   case 2: VARIABLE = LE2H_2(VARIABLE); break; \
    209      1.1  christos   case 4: VARIABLE = LE2H_4(VARIABLE); break; \
    210      1.1  christos   case 8: VARIABLE = LE2H_8(VARIABLE); break; \
    211      1.1  christos   /*case 16: VARIABLE = LE2H_16(VARIABLE); break;*/ \
    212      1.1  christos   } \
    213      1.1  christos } while (0)
    214      1.1  christos 
    215      1.1  christos 
    216      1.1  christos 
    217      1.1  christos /* TARGET WORD:
    218      1.1  christos 
    219      1.1  christos    Byte swap a quantity the size of the targets word */
    220      1.1  christos 
    221      1.1  christos #if (WITH_TARGET_WORD_BITSIZE == 64)
    222      1.1  christos #define H2T_word H2T_8
    223      1.1  christos #define T2H_word T2H_8
    224      1.1  christos #define H2BE_word H2BE_8
    225      1.1  christos #define BE2H_word BE2H_8
    226      1.1  christos #define H2LE_word H2LE_8
    227      1.1  christos #define LE2H_word LE2H_8
    228      1.1  christos #define SWAP_word SWAP_8
    229      1.1  christos #endif
    230      1.1  christos #if (WITH_TARGET_WORD_BITSIZE == 32)
    231      1.1  christos #define H2T_word H2T_4
    232      1.1  christos #define T2H_word T2H_4
    233      1.1  christos #define H2BE_word H2BE_4
    234      1.1  christos #define BE2H_word BE2H_4
    235      1.1  christos #define H2LE_word H2LE_4
    236      1.1  christos #define LE2H_word LE2H_4
    237      1.1  christos #define SWAP_word SWAP_4
    238      1.1  christos #endif
    239      1.1  christos 
    240      1.1  christos 
    241      1.1  christos 
    242      1.1  christos /* TARGET CELL:
    243      1.1  christos 
    244      1.1  christos    Byte swap a quantity the size of the targets IEEE 1275 memory cell */
    245      1.1  christos 
    246      1.1  christos #define H2T_cell H2T_4
    247      1.1  christos #define T2H_cell T2H_4
    248      1.1  christos #define H2BE_cell H2BE_4
    249      1.1  christos #define BE2H_cell BE2H_4
    250      1.1  christos #define H2LE_cell H2LE_4
    251      1.1  christos #define LE2H_cell LE2H_4
    252      1.1  christos #define SWAP_cell SWAP_4
    253      1.1  christos 
    254      1.1  christos 
    255      1.1  christos 
    256      1.1  christos /* HOST Offsets:
    257      1.1  christos 
    258      1.1  christos    Address of high/low sub-word within a host word quantity.
    259      1.1  christos 
    260      1.1  christos    Address of sub-word N within a host word quantity.  NOTE: Numbering
    261      1.1  christos    is BIG endian always. */
    262      1.1  christos 
    263      1.1  christos #define AH1_2(X) (unsigned_1*)offset_2((X), 1, 0)
    264      1.1  christos #define AL1_2(X) (unsigned_1*)offset_2((X), 1, 1)
    265      1.1  christos 
    266      1.1  christos #define AH2_4(X) (unsigned_2*)offset_4((X), 2, 0)
    267      1.1  christos #define AL2_4(X) (unsigned_2*)offset_4((X), 2, 1)
    268      1.1  christos 
    269      1.1  christos #define AH4_8(X) (unsigned_4*)offset_8((X), 4, 0)
    270      1.1  christos #define AL4_8(X) (unsigned_4*)offset_8((X), 4, 1)
    271      1.1  christos 
    272      1.1  christos #define AH8_16(X) (unsigned_8*)offset_16((X), 8, 0)
    273      1.1  christos #define AL8_16(X) (unsigned_8*)offset_16((X), 8, 1)
    274      1.1  christos 
    275      1.1  christos #if (WITH_TARGET_WORD_BITSIZE == 64)
    276      1.1  christos #define AH_word(X) AH4_8(X)
    277      1.1  christos #define AL_word(X) AL4_8(X)
    278      1.1  christos #endif
    279      1.1  christos #if (WITH_TARGET_WORD_BITSIZE == 32)
    280      1.1  christos #define AH_word(X) AH2_4(X)
    281      1.1  christos #define AL_word(X) AL2_4(X)
    282      1.1  christos #endif
    283      1.1  christos 
    284      1.1  christos 
    285      1.1  christos #define A1_2(X,N) (unsigned_1*)offset_2((X), 1, (N))
    286      1.1  christos 
    287      1.1  christos #define A1_4(X,N) (unsigned_1*)offset_4((X), 1, (N))
    288      1.1  christos #define A2_4(X,N) (unsigned_2*)offset_4((X), 2, (N))
    289      1.1  christos 
    290      1.1  christos #define A1_8(X,N) (unsigned_1*)offset_8((X), 1, (N))
    291      1.1  christos #define A2_8(X,N) (unsigned_2*)offset_8((X), 2, (N))
    292      1.1  christos #define A4_8(X,N) (unsigned_4*)offset_8((X), 4, (N))
    293      1.1  christos 
    294      1.1  christos #define A1_16(X,N) (unsigned_1*)offset_16((X), 1, (N))
    295      1.1  christos #define A2_16(X,N) (unsigned_2*)offset_16((X), 2, (N))
    296      1.1  christos #define A4_16(X,N) (unsigned_4*)offset_16((X), 4, (N))
    297      1.1  christos #define A8_16(X,N) (unsigned_8*)offset_16((X), 8, (N))
    298      1.1  christos 
    299      1.1  christos 
    300      1.1  christos 
    301      1.1  christos 
    302      1.1  christos /* HOST Components:
    303      1.1  christos 
    304      1.1  christos    Value of sub-word within a host word quantity */
    305      1.1  christos 
    306      1.1  christos #define VH1_2(X) ((unsigned_1)((unsigned_2)(X) >> 8))
    307      1.1  christos #define VL1_2(X) (unsigned_1)(X)
    308      1.1  christos 
    309      1.1  christos #define VH2_4(X) ((unsigned_2)((unsigned_4)(X) >> 16))
    310      1.1  christos #define VL2_4(X) ((unsigned_2)(X))
    311      1.1  christos 
    312      1.1  christos #define VH4_8(X) ((unsigned_4)((unsigned_8)(X) >> 32))
    313      1.1  christos #define VL4_8(X) ((unsigned_4)(X))
    314      1.1  christos 
    315      1.1  christos #define VH8_16(X) (sim_endian_split_16 ((X), 0))
    316      1.1  christos #define VL8_16(X) (sim_endian_split_16 ((X), 1))
    317      1.1  christos 
    318      1.1  christos #if (WITH_TARGET_WORD_BITSIZE == 64)
    319      1.1  christos #define VH_word(X) VH4_8(X)
    320      1.1  christos #define VL_word(X) VL4_8(X)
    321      1.1  christos #endif
    322      1.1  christos #if (WITH_TARGET_WORD_BITSIZE == 32)
    323      1.1  christos #define VH_word(X) VH2_4(X)
    324      1.1  christos #define VL_word(X) VL2_4(X)
    325      1.1  christos #endif
    326      1.1  christos 
    327      1.1  christos 
    328      1.1  christos #define V1_2(X,N) ((unsigned_1)((unsigned_2)(X) >> ( 8 * (1 - (N)))))
    329      1.1  christos 
    330      1.1  christos #define V1_4(X,N) ((unsigned_1)((unsigned_4)(X) >> ( 8 * (3 - (N)))))
    331      1.1  christos #define V2_4(X,N) ((unsigned_2)((unsigned_4)(X) >> (16 * (1 - (N)))))
    332      1.1  christos 
    333      1.1  christos #define V1_8(X,N) ((unsigned_1)((unsigned_8)(X) >> ( 8 * (7 - (N)))))
    334      1.1  christos #define V2_8(X,N) ((unsigned_2)((unsigned_8)(X) >> (16 * (3 - (N)))))
    335      1.1  christos #define V4_8(X,N) ((unsigned_4)((unsigned_8)(X) >> (32 * (1 - (N)))))
    336      1.1  christos 
    337      1.1  christos #define V1_16(X,N) (*A1_16 (&(X),N))
    338      1.1  christos #define V2_16(X,N) (*A2_16 (&(X),N))
    339      1.1  christos #define V4_16(X,N) (*A4_16 (&(X),N))
    340      1.1  christos #define V8_16(X,N) (*A8_16 (&(X),N))
    341      1.1  christos 
    342      1.1  christos 
    343      1.1  christos /* Reverse - insert sub-word into word quantity */
    344      1.1  christos 
    345      1.1  christos #define V2_H1(X) ((unsigned_2)(unsigned_1)(X) <<  8)
    346      1.1  christos #define V2_L1(X) ((unsigned_2)(unsigned_1)(X))
    347      1.1  christos 
    348      1.1  christos #define V4_H2(X) ((unsigned_4)(unsigned_2)(X) << 16)
    349      1.1  christos #define V4_L2(X) ((unsigned_4)(unsigned_2)(X))
    350      1.1  christos 
    351      1.1  christos #define V8_H4(X) ((unsigned_8)(unsigned_4)(X) << 32)
    352      1.1  christos #define V8_L4(X) ((unsigned_8)(unsigned_4)(X))
    353      1.1  christos 
    354      1.1  christos #define V16_H8(X) ((unsigned_16)(unsigned_8)(X) << 64)
    355      1.1  christos #define V16_L8(X) ((unsigned_16)(unsigned_8)(X))
    356      1.1  christos 
    357      1.1  christos 
    358      1.1  christos #define V2_1(X,N) ((unsigned_2)(unsigned_1)(X) << ( 8 * (1 - (N))))
    359      1.1  christos 
    360      1.1  christos #define V4_1(X,N) ((unsigned_4)(unsigned_1)(X) << ( 8 * (3 - (N))))
    361      1.1  christos #define V4_2(X,N) ((unsigned_4)(unsigned_2)(X) << (16 * (1 - (N))))
    362      1.1  christos 
    363      1.1  christos #define V8_1(X,N) ((unsigned_8)(unsigned_1)(X) << ( 8 * (7 - (N))))
    364      1.1  christos #define V8_2(X,N) ((unsigned_8)(unsigned_2)(X) << (16 * (3 - (N))))
    365      1.1  christos #define V8_4(X,N) ((unsigned_8)(unsigned_4)(X) << (32 * (1 - (N))))
    366      1.1  christos 
    367      1.1  christos #define V16_1(X,N) ((unsigned_16)(unsigned_1)(X) << ( 8 * (15 - (N))))
    368      1.1  christos #define V16_2(X,N) ((unsigned_16)(unsigned_2)(X) << (16 * (7 - (N))))
    369      1.1  christos #define V16_4(X,N) ((unsigned_16)(unsigned_4)(X) << (32 * (3 - (N))))
    370      1.1  christos #define V16_8(X,N) ((unsigned_16)(unsigned_8)(X) << (64 * (1 - (N))))
    371      1.1  christos 
    372      1.1  christos 
    373      1.1  christos /* Reverse - insert N sub-words into single word quantity */
    374      1.1  christos 
    375      1.1  christos #define U2_1(I0,I1) (V2_1(I0,0) | V2_1(I1,1))
    376      1.1  christos #define U4_1(I0,I1,I2,I3) (V4_1(I0,0) | V4_1(I1,1) | V4_1(I2,2) | V4_1(I3,3))
    377      1.1  christos #define U8_1(I0,I1,I2,I3,I4,I5,I6,I7) \
    378      1.1  christos (V8_1(I0,0) | V8_1(I1,1) | V8_1(I2,2) | V8_1(I3,3) \
    379      1.1  christos  | V8_1(I4,4) | V8_1(I5,5) | V8_1(I6,6) | V8_1(I7,7))
    380      1.1  christos #define U16_1(I0,I1,I2,I3,I4,I5,I6,I7,I8,I9,I10,I11,I12,I13,I14,I15) \
    381      1.1  christos (V16_1(I0,0) | V16_1(I1,1) | V16_1(I2,2) | V16_1(I3,3) \
    382      1.1  christos  | V16_1(I4,4) | V16_1(I5,5) | V16_1(I6,6) | V16_1(I7,7) \
    383      1.1  christos  | V16_1(I8,8) | V16_1(I9,9) | V16_1(I10,10) | V16_1(I11,11) \
    384      1.1  christos  | V16_1(I12,12) | V16_1(I13,13) | V16_1(I14,14) | V16_1(I15,15))
    385      1.1  christos 
    386      1.1  christos #define U4_2(I0,I1) (V4_2(I0,0) | V4_2(I1,1))
    387      1.1  christos #define U8_2(I0,I1,I2,I3) (V8_2(I0,0) | V8_2(I1,1) | V8_2(I2,2) | V8_2(I3,3))
    388      1.1  christos #define U16_2(I0,I1,I2,I3,I4,I5,I6,I7) \
    389      1.1  christos (V16_2(I0,0) | V16_2(I1,1) | V16_2(I2,2) | V16_2(I3,3) \
    390      1.1  christos  | V16_2(I4,4) | V16_2(I5,5) | V16_2(I6,6) | V16_2(I7,7) )
    391      1.1  christos 
    392      1.1  christos #define U8_4(I0,I1) (V8_4(I0,0) | V8_4(I1,1))
    393      1.1  christos #define U16_4(I0,I1,I2,I3) (V16_4(I0,0) | V16_4(I1,1) | V16_4(I2,2) | V16_4(I3,3))
    394      1.1  christos 
    395      1.1  christos #define U16_8(I0,I1) (sim_endian_join_16 (I0, I1))
    396      1.1  christos 
    397      1.1  christos 
    398      1.1  christos #if (WITH_TARGET_WORD_BITSIZE == 64)
    399      1.1  christos #define Vword_H(X) V8_H4(X)
    400      1.1  christos #define Vword_L(X) V8_L4(X)
    401      1.1  christos #endif
    402      1.1  christos #if (WITH_TARGET_WORD_BITSIZE == 32)
    403      1.1  christos #define Vword_H(X) V4_H2(X)
    404      1.1  christos #define Vword_L(X) V4_L2(X)
    405      1.1  christos #endif
    406      1.1  christos 
    407      1.1  christos 
    408      1.1  christos 
    409      1.1  christos 
    410      1.1  christos #if H_REVEALS_MODULE_P (SIM_ENDIAN_INLINE)
    411      1.1  christos #include "sim-endian.c"
    412      1.1  christos #endif
    413      1.1  christos 
    414  1.1.1.5  christos #endif /* SIM_ENDIAN_H */
    415