diff options
Diffstat (limited to 'lib/mpi/longlong.h')
-rw-r--r-- | lib/mpi/longlong.h | 18 |
1 files changed, 17 insertions, 1 deletions
diff --git a/lib/mpi/longlong.h b/lib/mpi/longlong.h index 57fd45ab7af1..08c60d10747f 100644 --- a/lib/mpi/longlong.h +++ b/lib/mpi/longlong.h | |||
@@ -671,7 +671,23 @@ do { \ | |||
671 | ************** MIPS/64 ************** | 671 | ************** MIPS/64 ************** |
672 | ***************************************/ | 672 | ***************************************/ |
673 | #if (defined(__mips) && __mips >= 3) && W_TYPE_SIZE == 64 | 673 | #if (defined(__mips) && __mips >= 3) && W_TYPE_SIZE == 64 |
674 | #if (__GNUC__ >= 5) || (__GNUC__ >= 4 && __GNUC_MINOR__ >= 4) | 674 | #if defined(__mips_isa_rev) && __mips_isa_rev >= 6 |
675 | /* | ||
676 | * GCC ends up emitting a __multi3 intrinsic call for MIPS64r6 with the plain C | ||
677 | * code below, so we special case MIPS64r6 until the compiler can do better. | ||
678 | */ | ||
679 | #define umul_ppmm(w1, w0, u, v) \ | ||
680 | do { \ | ||
681 | __asm__ ("dmulu %0,%1,%2" \ | ||
682 | : "=d" ((UDItype)(w0)) \ | ||
683 | : "d" ((UDItype)(u)), \ | ||
684 | "d" ((UDItype)(v))); \ | ||
685 | __asm__ ("dmuhu %0,%1,%2" \ | ||
686 | : "=d" ((UDItype)(w1)) \ | ||
687 | : "d" ((UDItype)(u)), \ | ||
688 | "d" ((UDItype)(v))); \ | ||
689 | } while (0) | ||
690 | #elif (__GNUC__ >= 5) || (__GNUC__ >= 4 && __GNUC_MINOR__ >= 4) | ||
675 | #define umul_ppmm(w1, w0, u, v) \ | 691 | #define umul_ppmm(w1, w0, u, v) \ |
676 | do { \ | 692 | do { \ |
677 | typedef unsigned int __ll_UTItype __attribute__((mode(TI))); \ | 693 | typedef unsigned int __ll_UTItype __attribute__((mode(TI))); \ |