[MIPS64] libc/libm support

libc/libm support for MIPS64 targets

Change-Id: I8271941d418612a286be55495f0e95822f90004f
Signed-off-by: Chris Dearman <chris.dearman@imgtec.com>
Signed-off-by: Raghu Gandham <raghu.gandham@imgtec.com>
diff --git a/libm/Android.mk b/libm/Android.mk
index 64a40e4..d06088b 100644
--- a/libm/Android.mk
+++ b/libm/Android.mk
@@ -254,6 +254,10 @@
 LOCAL_C_INCLUDES_mips := $(LOCAL_PATH)/mips
 LOCAL_SRC_FILES_mips := mips/fenv.c
 
+LOCAL_CFLAGS_mips64 := -fno-builtin-rintf -fno-builtin-rint
+LOCAL_C_INCLUDES_mips64 := $(LOCAL_PATH)/mips
+LOCAL_SRC_FILES_mips64 := mips/fenv.c
+
 include $(BUILD_STATIC_LIBRARY)
 
 #
diff --git a/libm/mips/_fpmath.h b/libm/mips/_fpmath.h
index f006a58..f759639 100644
--- a/libm/mips/_fpmath.h
+++ b/libm/mips/_fpmath.h
@@ -30,23 +30,49 @@
 	long double	e;
 	struct {
 #ifndef __MIPSEB__
+#if (_MIPS_SIM == _ABI64) || (_MIPS_SIM == _ABIN32)
+		unsigned long	manl	:64;
+		unsigned long	manh	:48;
+		unsigned int	exp	:15;
+		unsigned int	sign	:1;
+#else
 		unsigned int	manl	:32;
 		unsigned int	manh	:20;
 		unsigned int	exp	:11;
 		unsigned int	sign	:1;
+#endif
 #else
-		unsigned int		sign	:1;
-		unsigned int		exp	:11;
-		unsigned int		manh	:20;
-		unsigned int		manl	:32;
+#if (_MIPS_SIM == _ABI64) || (_MIPS_SIM == _ABIN32)
+		unsigned int	sign	:1;
+		unsigned int	exp	:15;
+		unsigned long	manh	:48;
+		unsigned long	manl	:64;
+#else
+		unsigned int	sign	:1;
+		unsigned int	exp	:11;
+		unsigned int	manh	:20;
+		unsigned int	manl	:32;
+#endif
 #endif
 	} bits;
+
 };
 
 #define	LDBL_NBIT	0
 #define	mask_nbit_l(u)	((void)0)
 #define	LDBL_IMPLICIT_NBIT
 
+#if (_MIPS_SIM == _ABI64) || (_MIPS_SIM == _ABIN32)
+#define	LDBL_MANH_SIZE	48
+#define	LDBL_MANL_SIZE	64
+
+#define	LDBL_TO_ARRAY32(u, a) do {			\
+	(a)[0] = (uint32_t)(u).bits.manl;		\
+	(a)[1] = (uint32_t)((u).bits.manl >> 32);       \
+	(a)[2] = (uint32_t)(u).bits.manh;		\
+	(a)[3] = (uint32_t)((u).bits.manh >> 32);       \
+} while(0)
+#else
 #define	LDBL_MANH_SIZE	20
 #define	LDBL_MANL_SIZE	32
 
@@ -54,3 +80,4 @@
 	(a)[0] = (uint32_t)(u).bits.manl;		\
 	(a)[1] = (uint32_t)(u).bits.manh;		\
 } while(0)
+#endif