/** * \file */ #ifndef _MONO_METADATA_ENDIAN_H_ #define _MONO_METADATA_ENDIAN_H_ 1 #include typedef union { guint32 ival; float fval; } mono_rfloat; typedef union { guint64 ival; double fval; unsigned char cval [8]; } mono_rdouble; #if defined(__s390x__) #define read16(x) s390x_read16(*(guint16 *)(x)) #define read32(x) s390x_read32(*(guint32 *)(x)) #define read64(x) s390x_read64(*(guint64 *)(x)) static __inline__ guint16 s390x_read16(guint16 x) { guint16 ret; __asm__ (" lrvr %0,%1\n" " sra %0,16\n" : "=r" (ret) : "r" (x)); return(ret); } static __inline__ guint32 s390x_read32(guint32 x) { guint32 ret; __asm__ (" lrvr %0,%1\n" : "=r" (ret) : "r" (x)); return(ret); } static __inline__ guint64 s390x_read64(guint64 x) { guint64 ret; __asm__ (" lrvgr %0,%1\n" : "=r" (ret) : "r" (x)); return(ret); } #else # 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 #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)); \ *(dest) = mf.fval; \ } while (0) #endif /* _MONO_METADATA_ENDIAN_H_ */