diff options
Diffstat (limited to 'lib/mpi')
| -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))); \ |
