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
s390x_read16(guint16 x)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
s390x_read32(guint32 x)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
s390x_read64(guint64 x)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_ */
98