xref: /netbsd-src/external/gpl3/gdb/dist/sim/common/sim-endian.h (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 
23212397c6Schristos #ifndef SIM_ENDIAN_H
24212397c6Schristos #define SIM_ENDIAN_H
254e98e3e1Schristos 
26*0d3e0572Schristos #include "sim-types.h"
274e98e3e1Schristos 
284e98e3e1Schristos /* C byte conversion functions */
294e98e3e1Schristos 
304e98e3e1Schristos INLINE_SIM_ENDIAN(unsigned_1) endian_h2t_1(unsigned_1 x);
314e98e3e1Schristos INLINE_SIM_ENDIAN(unsigned_2) endian_h2t_2(unsigned_2 x);
324e98e3e1Schristos INLINE_SIM_ENDIAN(unsigned_4) endian_h2t_4(unsigned_4 x);
334e98e3e1Schristos INLINE_SIM_ENDIAN(unsigned_8) endian_h2t_8(unsigned_8 x);
344e98e3e1Schristos INLINE_SIM_ENDIAN(unsigned_16) endian_h2t_16(unsigned_16 x);
354e98e3e1Schristos 
364e98e3e1Schristos INLINE_SIM_ENDIAN(unsigned_1) endian_t2h_1(unsigned_1 x);
374e98e3e1Schristos INLINE_SIM_ENDIAN(unsigned_2) endian_t2h_2(unsigned_2 x);
384e98e3e1Schristos INLINE_SIM_ENDIAN(unsigned_4) endian_t2h_4(unsigned_4 x);
394e98e3e1Schristos INLINE_SIM_ENDIAN(unsigned_8) endian_t2h_8(unsigned_8 x);
404e98e3e1Schristos INLINE_SIM_ENDIAN(unsigned_16) endian_t2h_16(unsigned_16 x);
414e98e3e1Schristos 
424e98e3e1Schristos INLINE_SIM_ENDIAN(unsigned_1) swap_1(unsigned_1 x);
434e98e3e1Schristos INLINE_SIM_ENDIAN(unsigned_2) swap_2(unsigned_2 x);
444e98e3e1Schristos INLINE_SIM_ENDIAN(unsigned_4) swap_4(unsigned_4 x);
454e98e3e1Schristos INLINE_SIM_ENDIAN(unsigned_8) swap_8(unsigned_8 x);
464e98e3e1Schristos INLINE_SIM_ENDIAN(unsigned_16) swap_16(unsigned_16 x);
474e98e3e1Schristos 
484e98e3e1Schristos INLINE_SIM_ENDIAN(unsigned_1) endian_h2be_1(unsigned_1 x);
494e98e3e1Schristos INLINE_SIM_ENDIAN(unsigned_2) endian_h2be_2(unsigned_2 x);
504e98e3e1Schristos INLINE_SIM_ENDIAN(unsigned_4) endian_h2be_4(unsigned_4 x);
514e98e3e1Schristos INLINE_SIM_ENDIAN(unsigned_8) endian_h2be_8(unsigned_8 x);
524e98e3e1Schristos INLINE_SIM_ENDIAN(unsigned_16) endian_h2be_16(unsigned_16 x);
534e98e3e1Schristos 
544e98e3e1Schristos INLINE_SIM_ENDIAN(unsigned_1) endian_be2h_1(unsigned_1 x);
554e98e3e1Schristos INLINE_SIM_ENDIAN(unsigned_2) endian_be2h_2(unsigned_2 x);
564e98e3e1Schristos INLINE_SIM_ENDIAN(unsigned_4) endian_be2h_4(unsigned_4 x);
574e98e3e1Schristos INLINE_SIM_ENDIAN(unsigned_8) endian_be2h_8(unsigned_8 x);
584e98e3e1Schristos INLINE_SIM_ENDIAN(unsigned_16) endian_be2h_16(unsigned_16 x);
594e98e3e1Schristos 
604e98e3e1Schristos INLINE_SIM_ENDIAN(unsigned_1) endian_h2le_1(unsigned_1 x);
614e98e3e1Schristos INLINE_SIM_ENDIAN(unsigned_2) endian_h2le_2(unsigned_2 x);
624e98e3e1Schristos INLINE_SIM_ENDIAN(unsigned_4) endian_h2le_4(unsigned_4 x);
634e98e3e1Schristos INLINE_SIM_ENDIAN(unsigned_8) endian_h2le_8(unsigned_8 x);
644e98e3e1Schristos INLINE_SIM_ENDIAN(unsigned_16) endian_h2le_16(unsigned_16 x);
654e98e3e1Schristos 
664e98e3e1Schristos INLINE_SIM_ENDIAN(unsigned_1) endian_le2h_1(unsigned_1 x);
674e98e3e1Schristos INLINE_SIM_ENDIAN(unsigned_2) endian_le2h_2(unsigned_2 x);
684e98e3e1Schristos INLINE_SIM_ENDIAN(unsigned_4) endian_le2h_4(unsigned_4 x);
694e98e3e1Schristos INLINE_SIM_ENDIAN(unsigned_8) endian_le2h_8(unsigned_8 x);
704e98e3e1Schristos INLINE_SIM_ENDIAN(unsigned_16) endian_le2h_16(unsigned_16 x);
714e98e3e1Schristos 
724e98e3e1Schristos INLINE_SIM_ENDIAN(void*) offset_1(unsigned_1 *x, unsigned ws, unsigned w);
734e98e3e1Schristos INLINE_SIM_ENDIAN(void*) offset_2(unsigned_2 *x, unsigned ws, unsigned w);
744e98e3e1Schristos INLINE_SIM_ENDIAN(void*) offset_4(unsigned_4 *x, unsigned ws, unsigned w);
754e98e3e1Schristos INLINE_SIM_ENDIAN(void*) offset_8(unsigned_8 *x, unsigned ws, unsigned w);
764e98e3e1Schristos INLINE_SIM_ENDIAN(void*) offset_16(unsigned_16 *x, unsigned ws, unsigned w);
774e98e3e1Schristos 
784e98e3e1Schristos INLINE_SIM_ENDIAN(unsigned_16) sim_endian_join_16 (unsigned_8 h, unsigned_8 l);
794e98e3e1Schristos INLINE_SIM_ENDIAN(unsigned_8) sim_endian_split_16 (unsigned_16 word, int w);
804e98e3e1Schristos 
814e98e3e1Schristos 
824e98e3e1Schristos /* SWAP */
834e98e3e1Schristos 
844e98e3e1Schristos #define SWAP_1 swap_1
854e98e3e1Schristos #define SWAP_2 swap_2
864e98e3e1Schristos #define SWAP_4 swap_4
874e98e3e1Schristos #define SWAP_8 swap_8
884e98e3e1Schristos #define SWAP_16 swap_16
894e98e3e1Schristos 
904e98e3e1Schristos 
914e98e3e1Schristos /* HOST to BE */
924e98e3e1Schristos 
934e98e3e1Schristos #define H2BE_1 endian_h2be_1
944e98e3e1Schristos #define H2BE_2 endian_h2be_2
954e98e3e1Schristos #define H2BE_4 endian_h2be_4
964e98e3e1Schristos #define H2BE_8 endian_h2be_8
974e98e3e1Schristos #define H2BE_16 endian_h2be_16
984e98e3e1Schristos #define BE2H_1 endian_be2h_1
994e98e3e1Schristos #define BE2H_2 endian_be2h_2
1004e98e3e1Schristos #define BE2H_4 endian_be2h_4
1014e98e3e1Schristos #define BE2H_8 endian_be2h_8
1024e98e3e1Schristos #define BE2H_16 endian_be2h_16
1034e98e3e1Schristos 
1044e98e3e1Schristos 
1054e98e3e1Schristos /* HOST to LE */
1064e98e3e1Schristos 
1074e98e3e1Schristos #define H2LE_1 endian_h2le_1
1084e98e3e1Schristos #define H2LE_2 endian_h2le_2
1094e98e3e1Schristos #define H2LE_4 endian_h2le_4
1104e98e3e1Schristos #define H2LE_8 endian_h2le_8
1114e98e3e1Schristos #define H2LE_16 endian_h2le_16
1124e98e3e1Schristos #define LE2H_1 endian_le2h_1
1134e98e3e1Schristos #define LE2H_2 endian_le2h_2
1144e98e3e1Schristos #define LE2H_4 endian_le2h_4
1154e98e3e1Schristos #define LE2H_8 endian_le2h_8
1164e98e3e1Schristos #define LE2H_16 endian_le2h_16
1174e98e3e1Schristos 
1184e98e3e1Schristos 
1194e98e3e1Schristos /* HOST to TARGET */
1204e98e3e1Schristos 
1214e98e3e1Schristos #define H2T_1 endian_h2t_1
1224e98e3e1Schristos #define H2T_2 endian_h2t_2
1234e98e3e1Schristos #define H2T_4 endian_h2t_4
1244e98e3e1Schristos #define H2T_8 endian_h2t_8
1254e98e3e1Schristos #define H2T_16 endian_h2t_16
1264e98e3e1Schristos #define T2H_1 endian_t2h_1
1274e98e3e1Schristos #define T2H_2 endian_t2h_2
1284e98e3e1Schristos #define T2H_4 endian_t2h_4
1294e98e3e1Schristos #define T2H_8 endian_t2h_8
1304e98e3e1Schristos #define T2H_16 endian_t2h_16
1314e98e3e1Schristos 
1324e98e3e1Schristos 
1334e98e3e1Schristos /* CONVERT IN PLACE
1344e98e3e1Schristos 
1354e98e3e1Schristos    These macros, given an argument of unknown size, swap its value in
1364e98e3e1Schristos    place if a host/target conversion is required. */
1374e98e3e1Schristos 
1384e98e3e1Schristos #define H2T(VARIABLE) \
1394e98e3e1Schristos do { \
1404e98e3e1Schristos   void *vp = &(VARIABLE); \
1414e98e3e1Schristos   switch (sizeof (VARIABLE)) { \
1424e98e3e1Schristos   case 1: *(unsigned_1*)vp = H2T_1(*(unsigned_1*)vp); break; \
1434e98e3e1Schristos   case 2: *(unsigned_2*)vp = H2T_2(*(unsigned_2*)vp); break; \
1444e98e3e1Schristos   case 4: *(unsigned_4*)vp = H2T_4(*(unsigned_4*)vp); break; \
1454e98e3e1Schristos   case 8: *(unsigned_8*)vp = H2T_8(*(unsigned_8*)vp); break; \
1464e98e3e1Schristos   case 16: *(unsigned_16*)vp = H2T_16(*(unsigned_16*)vp); break; \
1474e98e3e1Schristos   } \
1484e98e3e1Schristos } while (0)
1494e98e3e1Schristos 
1504e98e3e1Schristos #define T2H(VARIABLE) \
1514e98e3e1Schristos do { \
1524e98e3e1Schristos   switch (sizeof(VARIABLE)) { \
1534e98e3e1Schristos   case 1: VARIABLE = T2H_1(VARIABLE); break; \
1544e98e3e1Schristos   case 2: VARIABLE = T2H_2(VARIABLE); break; \
1554e98e3e1Schristos   case 4: VARIABLE = T2H_4(VARIABLE); break; \
1564e98e3e1Schristos   case 8: VARIABLE = T2H_8(VARIABLE); break; \
1574e98e3e1Schristos   /*case 16: VARIABLE = T2H_16(VARIABLE); break;*/ \
1584e98e3e1Schristos   } \
1594e98e3e1Schristos } while (0)
1604e98e3e1Schristos 
1614e98e3e1Schristos #define SWAP(VARIABLE) \
1624e98e3e1Schristos do { \
1634e98e3e1Schristos   switch (sizeof(VARIABLE)) { \
1644e98e3e1Schristos   case 1: VARIABLE = SWAP_1(VARIABLE); break; \
1654e98e3e1Schristos   case 2: VARIABLE = SWAP_2(VARIABLE); break; \
1664e98e3e1Schristos   case 4: VARIABLE = SWAP_4(VARIABLE); break; \
1674e98e3e1Schristos   case 8: VARIABLE = SWAP_8(VARIABLE); break; \
1684e98e3e1Schristos   /*case 16: VARIABLE = SWAP_16(VARIABLE); break;*/ \
1694e98e3e1Schristos   } \
1704e98e3e1Schristos } while (0)
1714e98e3e1Schristos 
1724e98e3e1Schristos #define H2BE(VARIABLE) \
1734e98e3e1Schristos do { \
1744e98e3e1Schristos   switch (sizeof(VARIABLE)) { \
1754e98e3e1Schristos   case 1: VARIABLE = H2BE_1(VARIABLE); break; \
1764e98e3e1Schristos   case 2: VARIABLE = H2BE_2(VARIABLE); break; \
1774e98e3e1Schristos   case 4: VARIABLE = H2BE_4(VARIABLE); break; \
1784e98e3e1Schristos   case 8: VARIABLE = H2BE_8(VARIABLE); break; \
1794e98e3e1Schristos   /*case 16: VARIABLE = H2BE_16(VARIABLE); break;*/ \
1804e98e3e1Schristos   } \
1814e98e3e1Schristos } while (0)
1824e98e3e1Schristos 
1834e98e3e1Schristos #define BE2H(VARIABLE) \
1844e98e3e1Schristos do { \
1854e98e3e1Schristos   switch (sizeof(VARIABLE)) { \
1864e98e3e1Schristos   case 1: VARIABLE = BE2H_1(VARIABLE); break; \
1874e98e3e1Schristos   case 2: VARIABLE = BE2H_2(VARIABLE); break; \
1884e98e3e1Schristos   case 4: VARIABLE = BE2H_4(VARIABLE); break; \
1894e98e3e1Schristos   case 8: VARIABLE = BE2H_8(VARIABLE); break; \
1904e98e3e1Schristos   /*case 16: VARIABLE = BE2H_16(VARIABLE); break;*/ \
1914e98e3e1Schristos   } \
1924e98e3e1Schristos } while (0)
1934e98e3e1Schristos 
1944e98e3e1Schristos #define H2LE(VARIABLE) \
1954e98e3e1Schristos do { \
1964e98e3e1Schristos   switch (sizeof(VARIABLE)) { \
1974e98e3e1Schristos   case 1: VARIABLE = H2LE_1(VARIABLE); break; \
1984e98e3e1Schristos   case 2: VARIABLE = H2LE_2(VARIABLE); break; \
1994e98e3e1Schristos   case 4: VARIABLE = H2LE_4(VARIABLE); break; \
2004e98e3e1Schristos   case 8: VARIABLE = H2LE_8(VARIABLE); break; \
2014e98e3e1Schristos   /*case 16: VARIABLE = H2LE_16(VARIABLE); break;*/ \
2024e98e3e1Schristos   } \
2034e98e3e1Schristos } while (0)
2044e98e3e1Schristos 
2054e98e3e1Schristos #define LE2H(VARIABLE) \
2064e98e3e1Schristos do { \
2074e98e3e1Schristos   switch (sizeof(VARIABLE)) { \
2084e98e3e1Schristos   case 1: VARIABLE = LE2H_1(VARIABLE); break; \
2094e98e3e1Schristos   case 2: VARIABLE = LE2H_2(VARIABLE); break; \
2104e98e3e1Schristos   case 4: VARIABLE = LE2H_4(VARIABLE); break; \
2114e98e3e1Schristos   case 8: VARIABLE = LE2H_8(VARIABLE); break; \
2124e98e3e1Schristos   /*case 16: VARIABLE = LE2H_16(VARIABLE); break;*/ \
2134e98e3e1Schristos   } \
2144e98e3e1Schristos } while (0)
2154e98e3e1Schristos 
2164e98e3e1Schristos 
2174e98e3e1Schristos 
2184e98e3e1Schristos /* TARGET WORD:
2194e98e3e1Schristos 
2204e98e3e1Schristos    Byte swap a quantity the size of the targets word */
2214e98e3e1Schristos 
2224e98e3e1Schristos #if (WITH_TARGET_WORD_BITSIZE == 64)
2234e98e3e1Schristos #define H2T_word H2T_8
2244e98e3e1Schristos #define T2H_word T2H_8
2254e98e3e1Schristos #define H2BE_word H2BE_8
2264e98e3e1Schristos #define BE2H_word BE2H_8
2274e98e3e1Schristos #define H2LE_word H2LE_8
2284e98e3e1Schristos #define LE2H_word LE2H_8
2294e98e3e1Schristos #define SWAP_word SWAP_8
2304e98e3e1Schristos #endif
2314e98e3e1Schristos #if (WITH_TARGET_WORD_BITSIZE == 32)
2324e98e3e1Schristos #define H2T_word H2T_4
2334e98e3e1Schristos #define T2H_word T2H_4
2344e98e3e1Schristos #define H2BE_word H2BE_4
2354e98e3e1Schristos #define BE2H_word BE2H_4
2364e98e3e1Schristos #define H2LE_word H2LE_4
2374e98e3e1Schristos #define LE2H_word LE2H_4
2384e98e3e1Schristos #define SWAP_word SWAP_4
2394e98e3e1Schristos #endif
2404e98e3e1Schristos 
2414e98e3e1Schristos 
2424e98e3e1Schristos 
2434e98e3e1Schristos /* TARGET CELL:
2444e98e3e1Schristos 
2454e98e3e1Schristos    Byte swap a quantity the size of the targets IEEE 1275 memory cell */
2464e98e3e1Schristos 
2474e98e3e1Schristos #define H2T_cell H2T_4
2484e98e3e1Schristos #define T2H_cell T2H_4
2494e98e3e1Schristos #define H2BE_cell H2BE_4
2504e98e3e1Schristos #define BE2H_cell BE2H_4
2514e98e3e1Schristos #define H2LE_cell H2LE_4
2524e98e3e1Schristos #define LE2H_cell LE2H_4
2534e98e3e1Schristos #define SWAP_cell SWAP_4
2544e98e3e1Schristos 
2554e98e3e1Schristos 
2564e98e3e1Schristos 
2574e98e3e1Schristos /* HOST Offsets:
2584e98e3e1Schristos 
2594e98e3e1Schristos    Address of high/low sub-word within a host word quantity.
2604e98e3e1Schristos 
2614e98e3e1Schristos    Address of sub-word N within a host word quantity.  NOTE: Numbering
2624e98e3e1Schristos    is BIG endian always. */
2634e98e3e1Schristos 
2644e98e3e1Schristos #define AH1_2(X) (unsigned_1*)offset_2((X), 1, 0)
2654e98e3e1Schristos #define AL1_2(X) (unsigned_1*)offset_2((X), 1, 1)
2664e98e3e1Schristos 
2674e98e3e1Schristos #define AH2_4(X) (unsigned_2*)offset_4((X), 2, 0)
2684e98e3e1Schristos #define AL2_4(X) (unsigned_2*)offset_4((X), 2, 1)
2694e98e3e1Schristos 
2704e98e3e1Schristos #define AH4_8(X) (unsigned_4*)offset_8((X), 4, 0)
2714e98e3e1Schristos #define AL4_8(X) (unsigned_4*)offset_8((X), 4, 1)
2724e98e3e1Schristos 
2734e98e3e1Schristos #define AH8_16(X) (unsigned_8*)offset_16((X), 8, 0)
2744e98e3e1Schristos #define AL8_16(X) (unsigned_8*)offset_16((X), 8, 1)
2754e98e3e1Schristos 
2764e98e3e1Schristos #if (WITH_TARGET_WORD_BITSIZE == 64)
2774e98e3e1Schristos #define AH_word(X) AH4_8(X)
2784e98e3e1Schristos #define AL_word(X) AL4_8(X)
2794e98e3e1Schristos #endif
2804e98e3e1Schristos #if (WITH_TARGET_WORD_BITSIZE == 32)
2814e98e3e1Schristos #define AH_word(X) AH2_4(X)
2824e98e3e1Schristos #define AL_word(X) AL2_4(X)
2834e98e3e1Schristos #endif
2844e98e3e1Schristos 
2854e98e3e1Schristos 
2864e98e3e1Schristos #define A1_2(X,N) (unsigned_1*)offset_2((X), 1, (N))
2874e98e3e1Schristos 
2884e98e3e1Schristos #define A1_4(X,N) (unsigned_1*)offset_4((X), 1, (N))
2894e98e3e1Schristos #define A2_4(X,N) (unsigned_2*)offset_4((X), 2, (N))
2904e98e3e1Schristos 
2914e98e3e1Schristos #define A1_8(X,N) (unsigned_1*)offset_8((X), 1, (N))
2924e98e3e1Schristos #define A2_8(X,N) (unsigned_2*)offset_8((X), 2, (N))
2934e98e3e1Schristos #define A4_8(X,N) (unsigned_4*)offset_8((X), 4, (N))
2944e98e3e1Schristos 
2954e98e3e1Schristos #define A1_16(X,N) (unsigned_1*)offset_16((X), 1, (N))
2964e98e3e1Schristos #define A2_16(X,N) (unsigned_2*)offset_16((X), 2, (N))
2974e98e3e1Schristos #define A4_16(X,N) (unsigned_4*)offset_16((X), 4, (N))
2984e98e3e1Schristos #define A8_16(X,N) (unsigned_8*)offset_16((X), 8, (N))
2994e98e3e1Schristos 
3004e98e3e1Schristos 
3014e98e3e1Schristos 
3024e98e3e1Schristos 
3034e98e3e1Schristos /* HOST Components:
3044e98e3e1Schristos 
3054e98e3e1Schristos    Value of sub-word within a host word quantity */
3064e98e3e1Schristos 
3074e98e3e1Schristos #define VH1_2(X) ((unsigned_1)((unsigned_2)(X) >> 8))
3084e98e3e1Schristos #define VL1_2(X) (unsigned_1)(X)
3094e98e3e1Schristos 
3104e98e3e1Schristos #define VH2_4(X) ((unsigned_2)((unsigned_4)(X) >> 16))
3114e98e3e1Schristos #define VL2_4(X) ((unsigned_2)(X))
3124e98e3e1Schristos 
3134e98e3e1Schristos #define VH4_8(X) ((unsigned_4)((unsigned_8)(X) >> 32))
3144e98e3e1Schristos #define VL4_8(X) ((unsigned_4)(X))
3154e98e3e1Schristos 
3164e98e3e1Schristos #define VH8_16(X) (sim_endian_split_16 ((X), 0))
3174e98e3e1Schristos #define VL8_16(X) (sim_endian_split_16 ((X), 1))
3184e98e3e1Schristos 
3194e98e3e1Schristos #if (WITH_TARGET_WORD_BITSIZE == 64)
3204e98e3e1Schristos #define VH_word(X) VH4_8(X)
3214e98e3e1Schristos #define VL_word(X) VL4_8(X)
3224e98e3e1Schristos #endif
3234e98e3e1Schristos #if (WITH_TARGET_WORD_BITSIZE == 32)
3244e98e3e1Schristos #define VH_word(X) VH2_4(X)
3254e98e3e1Schristos #define VL_word(X) VL2_4(X)
3264e98e3e1Schristos #endif
3274e98e3e1Schristos 
3284e98e3e1Schristos 
3294e98e3e1Schristos #define V1_2(X,N) ((unsigned_1)((unsigned_2)(X) >> ( 8 * (1 - (N)))))
3304e98e3e1Schristos 
3314e98e3e1Schristos #define V1_4(X,N) ((unsigned_1)((unsigned_4)(X) >> ( 8 * (3 - (N)))))
3324e98e3e1Schristos #define V2_4(X,N) ((unsigned_2)((unsigned_4)(X) >> (16 * (1 - (N)))))
3334e98e3e1Schristos 
3344e98e3e1Schristos #define V1_8(X,N) ((unsigned_1)((unsigned_8)(X) >> ( 8 * (7 - (N)))))
3354e98e3e1Schristos #define V2_8(X,N) ((unsigned_2)((unsigned_8)(X) >> (16 * (3 - (N)))))
3364e98e3e1Schristos #define V4_8(X,N) ((unsigned_4)((unsigned_8)(X) >> (32 * (1 - (N)))))
3374e98e3e1Schristos 
3384e98e3e1Schristos #define V1_16(X,N) (*A1_16 (&(X),N))
3394e98e3e1Schristos #define V2_16(X,N) (*A2_16 (&(X),N))
3404e98e3e1Schristos #define V4_16(X,N) (*A4_16 (&(X),N))
3414e98e3e1Schristos #define V8_16(X,N) (*A8_16 (&(X),N))
3424e98e3e1Schristos 
3434e98e3e1Schristos 
3444e98e3e1Schristos /* Reverse - insert sub-word into word quantity */
3454e98e3e1Schristos 
3464e98e3e1Schristos #define V2_H1(X) ((unsigned_2)(unsigned_1)(X) <<  8)
3474e98e3e1Schristos #define V2_L1(X) ((unsigned_2)(unsigned_1)(X))
3484e98e3e1Schristos 
3494e98e3e1Schristos #define V4_H2(X) ((unsigned_4)(unsigned_2)(X) << 16)
3504e98e3e1Schristos #define V4_L2(X) ((unsigned_4)(unsigned_2)(X))
3514e98e3e1Schristos 
3524e98e3e1Schristos #define V8_H4(X) ((unsigned_8)(unsigned_4)(X) << 32)
3534e98e3e1Schristos #define V8_L4(X) ((unsigned_8)(unsigned_4)(X))
3544e98e3e1Schristos 
3554e98e3e1Schristos #define V16_H8(X) ((unsigned_16)(unsigned_8)(X) << 64)
3564e98e3e1Schristos #define V16_L8(X) ((unsigned_16)(unsigned_8)(X))
3574e98e3e1Schristos 
3584e98e3e1Schristos 
3594e98e3e1Schristos #define V2_1(X,N) ((unsigned_2)(unsigned_1)(X) << ( 8 * (1 - (N))))
3604e98e3e1Schristos 
3614e98e3e1Schristos #define V4_1(X,N) ((unsigned_4)(unsigned_1)(X) << ( 8 * (3 - (N))))
3624e98e3e1Schristos #define V4_2(X,N) ((unsigned_4)(unsigned_2)(X) << (16 * (1 - (N))))
3634e98e3e1Schristos 
3644e98e3e1Schristos #define V8_1(X,N) ((unsigned_8)(unsigned_1)(X) << ( 8 * (7 - (N))))
3654e98e3e1Schristos #define V8_2(X,N) ((unsigned_8)(unsigned_2)(X) << (16 * (3 - (N))))
3664e98e3e1Schristos #define V8_4(X,N) ((unsigned_8)(unsigned_4)(X) << (32 * (1 - (N))))
3674e98e3e1Schristos 
3684e98e3e1Schristos #define V16_1(X,N) ((unsigned_16)(unsigned_1)(X) << ( 8 * (15 - (N))))
3694e98e3e1Schristos #define V16_2(X,N) ((unsigned_16)(unsigned_2)(X) << (16 * (7 - (N))))
3704e98e3e1Schristos #define V16_4(X,N) ((unsigned_16)(unsigned_4)(X) << (32 * (3 - (N))))
3714e98e3e1Schristos #define V16_8(X,N) ((unsigned_16)(unsigned_8)(X) << (64 * (1 - (N))))
3724e98e3e1Schristos 
3734e98e3e1Schristos 
3744e98e3e1Schristos /* Reverse - insert N sub-words into single word quantity */
3754e98e3e1Schristos 
3764e98e3e1Schristos #define U2_1(I0,I1) (V2_1(I0,0) | V2_1(I1,1))
3774e98e3e1Schristos #define U4_1(I0,I1,I2,I3) (V4_1(I0,0) | V4_1(I1,1) | V4_1(I2,2) | V4_1(I3,3))
3784e98e3e1Schristos #define U8_1(I0,I1,I2,I3,I4,I5,I6,I7) \
3794e98e3e1Schristos (V8_1(I0,0) | V8_1(I1,1) | V8_1(I2,2) | V8_1(I3,3) \
3804e98e3e1Schristos  | V8_1(I4,4) | V8_1(I5,5) | V8_1(I6,6) | V8_1(I7,7))
3814e98e3e1Schristos #define U16_1(I0,I1,I2,I3,I4,I5,I6,I7,I8,I9,I10,I11,I12,I13,I14,I15) \
3824e98e3e1Schristos (V16_1(I0,0) | V16_1(I1,1) | V16_1(I2,2) | V16_1(I3,3) \
3834e98e3e1Schristos  | V16_1(I4,4) | V16_1(I5,5) | V16_1(I6,6) | V16_1(I7,7) \
3844e98e3e1Schristos  | V16_1(I8,8) | V16_1(I9,9) | V16_1(I10,10) | V16_1(I11,11) \
3854e98e3e1Schristos  | V16_1(I12,12) | V16_1(I13,13) | V16_1(I14,14) | V16_1(I15,15))
3864e98e3e1Schristos 
3874e98e3e1Schristos #define U4_2(I0,I1) (V4_2(I0,0) | V4_2(I1,1))
3884e98e3e1Schristos #define U8_2(I0,I1,I2,I3) (V8_2(I0,0) | V8_2(I1,1) | V8_2(I2,2) | V8_2(I3,3))
3894e98e3e1Schristos #define U16_2(I0,I1,I2,I3,I4,I5,I6,I7) \
3904e98e3e1Schristos (V16_2(I0,0) | V16_2(I1,1) | V16_2(I2,2) | V16_2(I3,3) \
3914e98e3e1Schristos  | V16_2(I4,4) | V16_2(I5,5) | V16_2(I6,6) | V16_2(I7,7) )
3924e98e3e1Schristos 
3934e98e3e1Schristos #define U8_4(I0,I1) (V8_4(I0,0) | V8_4(I1,1))
3944e98e3e1Schristos #define U16_4(I0,I1,I2,I3) (V16_4(I0,0) | V16_4(I1,1) | V16_4(I2,2) | V16_4(I3,3))
3954e98e3e1Schristos 
3964e98e3e1Schristos #define U16_8(I0,I1) (sim_endian_join_16 (I0, I1))
3974e98e3e1Schristos 
3984e98e3e1Schristos 
3994e98e3e1Schristos #if (WITH_TARGET_WORD_BITSIZE == 64)
4004e98e3e1Schristos #define Vword_H(X) V8_H4(X)
4014e98e3e1Schristos #define Vword_L(X) V8_L4(X)
4024e98e3e1Schristos #endif
4034e98e3e1Schristos #if (WITH_TARGET_WORD_BITSIZE == 32)
4044e98e3e1Schristos #define Vword_H(X) V4_H2(X)
4054e98e3e1Schristos #define Vword_L(X) V4_L2(X)
4064e98e3e1Schristos #endif
4074e98e3e1Schristos 
4084e98e3e1Schristos 
4094e98e3e1Schristos 
4104e98e3e1Schristos 
4114e98e3e1Schristos #if H_REVEALS_MODULE_P (SIM_ENDIAN_INLINE)
4124e98e3e1Schristos #include "sim-endian.c"
4134e98e3e1Schristos #endif
4144e98e3e1Schristos 
415212397c6Schristos #endif /* SIM_ENDIAN_H */
416