Thu Jul 3 17:22:20 CEST 2003 Paolo Molaro <lupus@ximian.com>
[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 } mono_rdouble;
15
16 #if NO_UNALIGNED_ACCESS
17
18 guint16 mono_read16 (const unsigned char *x);
19 guint32 mono_read32 (const unsigned char *x);
20 guint64 mono_read64 (const unsigned char *x);
21 guint64 mono_read64_swap_words (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 #ifdef __arm__
43
44 #define readr8(x,dest)  \
45         do {    \
46                 mono_rdouble mf;        \
47                 mf.ival = mono_read64_swap_words ((x)); \
48                 *(dest) = mf.fval;      \
49         } while (0)
50 #else
51
52 #define readr8(x,dest)  \
53         do {    \
54                 mono_rdouble mf;        \
55                 mf.ival = read64 ((x)); \
56                 *(dest) = mf.fval;      \
57         } while (0)
58
59 #endif /* __arm__ */
60
61 #endif /* _MONO_METADATA_ENDIAN_H_ */