Merge pull request #260 from pcc/topmost
[mono.git] / mono / metadata / mono-endian.h
1 #ifndef _MONO_METADATA_ENDIAN_H_
2 #define _MONO_METADATA_ENDIAN_H_ 1
3
4 #include <glib.h>
5
6 typedef union {
7         guint32 ival;
8         float fval;
9 } mono_rfloat;
10
11 typedef union {
12         guint64 ival;
13         double fval;
14         unsigned char cval [8];
15 } mono_rdouble;
16
17 #if NO_UNALIGNED_ACCESS
18
19 guint16 mono_read16 (const unsigned char *x);
20 guint32 mono_read32 (const unsigned char *x);
21 guint64 mono_read64 (const unsigned char *x);
22
23 #define read16(x) (mono_read16 ((const unsigned char *)(x)))
24 #define read32(x) (mono_read32 ((const unsigned char *)(x)))
25 #define read64(x) (mono_read64 ((const unsigned char *)(x)))
26
27 #else
28
29 #define read16(x) GUINT16_FROM_LE (*((const guint16 *) (x)))
30 #define read32(x) GUINT32_FROM_LE (*((const guint32 *) (x)))
31 #define read64(x) GUINT64_FROM_LE (*((const guint64 *) (x)))
32
33 #endif
34
35 #define readr4(x,dest)  \
36         do {    \
37                 mono_rfloat mf; \
38                 mf.ival = read32 ((x)); \
39                 *(dest) = mf.fval;      \
40         } while (0)
41
42 #define readr8(x,dest)  \
43         do {    \
44                 mono_rdouble mf;        \
45                 mf.ival = read64 ((x)); \
46                 *(dest) = mf.fval;      \
47         } while (0)
48
49 #endif /* _MONO_METADATA_ENDIAN_H_ */