typedef union {
guint64 ival;
double fval;
+ unsigned char cval [8];
} mono_rdouble;
-#if NO_UNALIGNED_ACCESS
+#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);
-guint64 mono_read64_swap_words (const unsigned char *x);
-#define read16(x) (mono_read16 ((x)))
-#define read32(x) (mono_read32 ((x)))
-#define read64(x) (mono_read64 ((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
+# 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) \
*(dest) = mf.fval; \
} while (0)
-#ifdef __arm__
-
-#define readr8(x,dest) \
- do { \
- mono_rdouble mf; \
- mf.ival = mono_read64_swap_words ((x)); \
- *(dest) = mf.fval; \
- } while (0)
-#else
-
#define readr8(x,dest) \
do { \
mono_rdouble mf; \
*(dest) = mf.fval; \
} while (0)
-#endif /* __arm__ */
-
#endif /* _MONO_METADATA_ENDIAN_H_ */