Merge pull request #5714 from alexischr/update_bockbuild
[mono.git] / mono / metadata / mono-endian.h
1 /**
2  * \file
3  */
4
5 #ifndef _MONO_METADATA_ENDIAN_H_
6 #define _MONO_METADATA_ENDIAN_H_ 1
7
8 #include <glib.h>
9
10 typedef union {
11         guint32 ival;
12         float fval;
13 } mono_rfloat;
14
15 typedef union {
16         guint64 ival;
17         double fval;
18         unsigned char cval [8];
19 } mono_rdouble;
20
21 #if defined(__s390x__)
22
23 #define read16(x)       s390x_read16(*(guint16 *)(x))
24 #define read32(x)       s390x_read32(*(guint32 *)(x))
25 #define read64(x)       s390x_read64(*(guint64 *)(x))
26
27 static __inline__ guint16
28 s390x_read16(guint16 x)
29 {
30         guint16 ret;
31
32         __asm__ ("      lrvr    %0,%1\n"
33                  "      sra     %0,16\n"
34                  : "=r" (ret) : "r" (x));
35
36         return(ret);
37 }
38
39 static __inline__ guint32
40 s390x_read32(guint32 x)
41 {
42         guint32 ret;
43
44         __asm__ ("      lrvr    %0,%1\n"
45                  : "=r" (ret) : "r" (x));
46
47         return(ret);
48 }
49
50 static __inline__ guint64
51 s390x_read64(guint64 x)
52 {
53         guint64 ret;
54
55         __asm__ ("      lrvgr   %0,%1\n"
56                  : "=r" (ret) : "r" (x));
57
58         return(ret);
59 }
60
61 #else
62
63 # if NO_UNALIGNED_ACCESS
64
65 guint16 mono_read16 (const unsigned char *x);
66 guint32 mono_read32 (const unsigned char *x);
67 guint64 mono_read64 (const unsigned char *x);
68
69 #define read16(x) (mono_read16 ((const unsigned char *)(x)))
70 #define read32(x) (mono_read32 ((const unsigned char *)(x)))
71 #define read64(x) (mono_read64 ((const unsigned char *)(x)))
72
73 # else
74
75 #define read16(x) GUINT16_FROM_LE (*((const guint16 *) (x)))
76 #define read32(x) GUINT32_FROM_LE (*((const guint32 *) (x)))
77 #define read64(x) GUINT64_FROM_LE (*((const guint64 *) (x)))
78
79 # endif
80
81 #endif
82
83 #define readr4(x,dest)  \
84         do {    \
85                 mono_rfloat mf; \
86                 mf.ival = read32 ((x)); \
87                 *(dest) = mf.fval;      \
88         } while (0)
89
90 #define readr8(x,dest)  \
91         do {    \
92                 mono_rdouble mf;        \
93                 mf.ival = read64 ((x)); \
94                 *(dest) = mf.fval;      \
95         } while (0)
96
97 #endif /* _MONO_METADATA_ENDIAN_H_ */