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)28s390x_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)40s390x_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)51s390x_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