xref: /netbsd-src/external/gpl3/gdb/dist/sim/d10v/endian.c (revision bdc22b2e01993381dcefeff2bc9b56ca75a4235c)
1 /* If we're being compiled as a .c file, rather than being included in
2    d10v_sim.h, then ENDIAN_INLINE won't be defined yet.  */
3 
4 #ifndef ENDIAN_INLINE
5 #define NO_ENDIAN_INLINE
6 #include "sim-main.h"
7 #define ENDIAN_INLINE
8 #endif
9 
10 ENDIAN_INLINE uint16
11 get_word (uint8 *x)
12 {
13   return ((uint16)x[0]<<8) + x[1];
14 }
15 
16 ENDIAN_INLINE uint32
17 get_longword (uint8 *x)
18 {
19   return ((uint32)x[0]<<24) + ((uint32)x[1]<<16) + ((uint32)x[2]<<8) + ((uint32)x[3]);
20 }
21 
22 ENDIAN_INLINE int64
23 get_longlong (uint8 *x)
24 {
25   uint32 top = get_longword (x);
26   uint32 bottom = get_longword (x+4);
27   return (((int64)top)<<32) | (int64)bottom;
28 }
29 
30 ENDIAN_INLINE void
31 write_word (uint8 *addr, uint16 data)
32 {
33   addr[0] = (data >> 8) & 0xff;
34   addr[1] = data & 0xff;
35 }
36 
37 ENDIAN_INLINE void
38 write_longword (uint8 *addr, uint32 data)
39 {
40   addr[0] = (data >> 24) & 0xff;
41   addr[1] = (data >> 16) & 0xff;
42   addr[2] = (data >> 8) & 0xff;
43   addr[3] = data & 0xff;
44 }
45 
46 ENDIAN_INLINE void
47 write_longlong (uint8 *addr, int64 data)
48 {
49   write_longword (addr, (uint32)(data >> 32));
50   write_longword (addr+4, (uint32)data);
51 }
52