|
@@ -671,7 +671,23 @@ do { \
|
|
|
************** MIPS/64 **************
|
|
|
***************************************/
|
|
|
#if (defined(__mips) && __mips >= 3) && W_TYPE_SIZE == 64
|
|
|
-#if (__GNUC__ >= 5) || (__GNUC__ >= 4 && __GNUC_MINOR__ >= 4)
|
|
|
+#if defined(__mips_isa_rev) && __mips_isa_rev >= 6
|
|
|
+/*
|
|
|
+ * GCC ends up emitting a __multi3 intrinsic call for MIPS64r6 with the plain C
|
|
|
+ * code below, so we special case MIPS64r6 until the compiler can do better.
|
|
|
+ */
|
|
|
+#define umul_ppmm(w1, w0, u, v) \
|
|
|
+do { \
|
|
|
+ __asm__ ("dmulu %0,%1,%2" \
|
|
|
+ : "=d" ((UDItype)(w0)) \
|
|
|
+ : "d" ((UDItype)(u)), \
|
|
|
+ "d" ((UDItype)(v))); \
|
|
|
+ __asm__ ("dmuhu %0,%1,%2" \
|
|
|
+ : "=d" ((UDItype)(w1)) \
|
|
|
+ : "d" ((UDItype)(u)), \
|
|
|
+ "d" ((UDItype)(v))); \
|
|
|
+} while (0)
|
|
|
+#elif (__GNUC__ >= 5) || (__GNUC__ >= 4 && __GNUC_MINOR__ >= 4)
|
|
|
#define umul_ppmm(w1, w0, u, v) \
|
|
|
do { \
|
|
|
typedef unsigned int __ll_UTItype __attribute__((mode(TI))); \
|