X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=mono%2Fmetadata%2Fmono-endian.h;h=6cee6415259bddbf97127c6dbf933e01494e6b7d;hb=bf484297f1e88a8906894e6e0bf4bcd10ba43802;hp=8da0e4126e0e6b3bbcd717fe60405bbdc727890d;hpb=fe9fb1dd934a4f65c9ca2e10283e9748854a6489;p=mono.git diff --git a/mono/metadata/mono-endian.h b/mono/metadata/mono-endian.h index 8da0e4126e0..6cee6415259 100644 --- a/mono/metadata/mono-endian.h +++ b/mono/metadata/mono-endian.h @@ -1,13 +1,63 @@ #ifndef _MONO_METADATA_ENDIAN_H_ #define _MONO_METADATA_ENDIAN_H_ 1 -/* FIXME: implement big endian versions */ - -#define le64_to_cpu(x) (x) -#define le32_to_cpu(x) (x) -#define le16_to_cpu(x) (x) -#define read32(x) le32_to_cpu (*((guint32 *) (x))) -#define read16(x) le16_to_cpu (*((guint16 *) (x))) -#define read64(x) le64_to_cpu (*((guint64 *) (x))) +#include + +typedef union { + guint32 ival; + float fval; +} mono_rfloat; + +typedef union { + guint64 ival; + double fval; + unsigned char cval [8]; +} mono_rdouble; + +#ifdef ARM_FPU_FPA +#define MONO_DOUBLE_ASSERT_ENDIANITY(dbl_ptr) \ + do { \ + mono_rdouble r; \ + r.fval = *dbl_ptr; \ + r.ival = (guint64) *((guint32 *) r.cval) << 32 | \ + *((guint32 *) (r.cval + 4)); \ + *dbl_ptr = r.fval; \ + } while (0) +#else +#define MONO_DOUBLE_ASSERT_ENDIANITY(dbl_ptr) +#endif + +#if NO_UNALIGNED_ACCESS + +guint16 mono_read16 (const unsigned char *x); +guint32 mono_read32 (const unsigned char *x); +guint64 mono_read64 (const unsigned char *x); + +#define read16(x) (mono_read16 ((const unsigned char *)(x))) +#define read32(x) (mono_read32 ((const unsigned char *)(x))) +#define read64(x) (mono_read64 ((const unsigned char *)(x))) + +#else + +#define read16(x) GUINT16_FROM_LE (*((const guint16 *) (x))) +#define read32(x) GUINT32_FROM_LE (*((const guint32 *) (x))) +#define read64(x) GUINT64_FROM_LE (*((const guint64 *) (x))) + +#endif + +#define readr4(x,dest) \ + do { \ + mono_rfloat mf; \ + mf.ival = read32 ((x)); \ + *(dest) = mf.fval; \ + } while (0) + +#define readr8(x,dest) \ + do { \ + mono_rdouble mf; \ + mf.ival = read64 ((x)); \ + MONO_DOUBLE_ASSERT_ENDIANITY (&mf.fval); \ + *(dest) = mf.fval; \ + } while (0) #endif /* _MONO_METADATA_ENDIAN_H_ */