2011-01-01 06:59:53 +00:00
|
|
|
--- a/mpi/longlong.h
|
|
|
|
+++ b/mpi/longlong.h
|
|
|
|
@@ -710,12 +710,13 @@ extern USItype __udiv_qrnnd ();
|
2010-03-27 13:31:27 +00:00
|
|
|
************** MIPS *****************
|
|
|
|
***************************************/
|
|
|
|
#if defined (__mips__) && W_TYPE_SIZE == 32
|
2011-01-01 06:59:53 +00:00
|
|
|
-#if __GNUC__ > 4 || ( __GNUC__ == 4 && __GNUC_MINOR >= 4 )
|
|
|
|
-#define umul_ppmm(w1, w0, u, v) \
|
|
|
|
+#if (__GNUC__ >= 5) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 4)
|
2010-03-27 13:31:27 +00:00
|
|
|
+#define umul_ppmm(w1, w0, u, v) \
|
2011-01-01 06:59:53 +00:00
|
|
|
do { \
|
|
|
|
- UDItype __ll = (UDItype)(u) * (v); \
|
|
|
|
- w1 = __ll >> 32; \
|
|
|
|
- w0 = __ll; \
|
|
|
|
+ UDItype _r; \
|
|
|
|
+ _r = (UDItype) u * v; \
|
|
|
|
+ (w1) = _r >> 32; \
|
|
|
|
+ (w0) = (USItype) _r; \
|
|
|
|
} while (0)
|
|
|
|
#elif __GNUC__ > 2 || __GNUC_MINOR__ >= 7
|
|
|
|
#define umul_ppmm(w1, w0, u, v) \
|
|
|
|
@@ -727,8 +728,8 @@ extern USItype __udiv_qrnnd ();
|
|
|
|
#else
|
2010-03-27 13:31:27 +00:00
|
|
|
#define umul_ppmm(w1, w0, u, v) \
|
2011-01-01 06:59:53 +00:00
|
|
|
__asm__ ("multu %2,%3 \n" \
|
|
|
|
- "mflo %0 \n" \
|
|
|
|
- "mfhi %1" \
|
|
|
|
+ "mflo %0 \n" \
|
|
|
|
+ "mfhi %1" \
|
|
|
|
: "=d" ((USItype)(w0)), \
|
|
|
|
"=d" ((USItype)(w1)) \
|
2010-03-27 13:31:27 +00:00
|
|
|
: "d" ((USItype)(u)), \
|
2011-01-01 06:59:53 +00:00
|
|
|
@@ -742,25 +743,34 @@ extern USItype __udiv_qrnnd ();
|
|
|
|
************** MIPS/64 **************
|
|
|
|
***************************************/
|
|
|
|
#if (defined (__mips) && __mips >= 3) && W_TYPE_SIZE == 64
|
|
|
|
-#if __GNUC__ > 2 || __GNUC_MINOR__ >= 7
|
|
|
|
-#define umul_ppmm(w1, w0, u, v) \
|
|
|
|
- __asm__ ("dmultu %2,%3" \
|
|
|
|
- : "=l" ((UDItype)(w0)), \
|
|
|
|
- "=h" ((UDItype)(w1)) \
|
|
|
|
- : "d" ((UDItype)(u)), \
|
|
|
|
- "d" ((UDItype)(v)))
|
2010-03-27 13:31:27 +00:00
|
|
|
-#else
|
2011-01-01 06:59:53 +00:00
|
|
|
-#define umul_ppmm(w1, w0, u, v) \
|
|
|
|
- __asm__ ("dmultu %2,%3 \n" \
|
|
|
|
- "mflo %0 \n" \
|
|
|
|
- "mfhi %1" \
|
|
|
|
- : "=d" ((UDItype)(w0)), \
|
|
|
|
- "=d" ((UDItype)(w1)) \
|
|
|
|
- : "d" ((UDItype)(u)), \
|
|
|
|
- "d" ((UDItype)(v)))
|
|
|
|
-#endif
|
|
|
|
-#define UMUL_TIME 20
|
|
|
|
-#define UDIV_TIME 140
|
|
|
|
+# if (__GNUC__ >= 5) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 4)
|
|
|
|
+ typedef unsigned int UTItype __attribute__ ((mode (TI)));
|
|
|
|
+# define umul_ppmm(w1, w0, u, v) \
|
|
|
|
+ do { \
|
|
|
|
+ UTItype _r; \
|
|
|
|
+ _r = (UTItype) u * v; \
|
|
|
|
+ (w1) = _r >> 64; \
|
|
|
|
+ (w0) = (UDItype) _r; \
|
|
|
|
+ } while (0)
|
|
|
|
+# elif if __GNUC__ > 2 || __GNUC_MINOR__ >= 7
|
|
|
|
+# define umul_ppmm(w1, w0, u, v) \
|
|
|
|
+ __asm__ ("dmultu %2,%3" \
|
|
|
|
+ : "=l" ((UDItype)(w0)), \
|
|
|
|
+ "=h" ((UDItype)(w1)) \
|
|
|
|
+ : "d" ((UDItype)(u)), \
|
|
|
|
+ "d" ((UDItype)(v)))
|
|
|
|
+# else
|
|
|
|
+# define umul_ppmm(w1, w0, u, v) \
|
|
|
|
+ __asm__ ("dmultu %2,%3 \n" \
|
|
|
|
+ "mflo %0 \n" \
|
|
|
|
+ "mfhi %1" \
|
|
|
|
+ : "=d" ((UDItype)(w0)), \
|
|
|
|
+ "=d" ((UDItype)(w1)) \
|
|
|
|
+ : "d" ((UDItype)(u)), \
|
|
|
|
+ "d" ((UDItype)(v)))
|
|
|
|
+# endif
|
|
|
|
+# define UMUL_TIME 20
|
|
|
|
+# define UDIV_TIME 140
|
|
|
|
#endif /* __mips__ */
|
|
|
|
|
|
|
|
|