diff options
Diffstat (limited to 'lib/mpi/longlong.h')
| -rw-r--r-- | lib/mpi/longlong.h | 19 | 
1 files changed, 17 insertions, 2 deletions
diff --git a/lib/mpi/longlong.h b/lib/mpi/longlong.h index 678ce4f1e12..095ab157a52 100644 --- a/lib/mpi/longlong.h +++ b/lib/mpi/longlong.h @@ -641,7 +641,14 @@ do { \  	**************  MIPS  *****************  	***************************************/  #if defined(__mips__) && W_TYPE_SIZE == 32 -#if __GNUC__ > 2 || __GNUC_MINOR__ >= 7 +#if __GNUC__ >= 4 && __GNUC_MINOR__ >= 4 +#define umul_ppmm(w1, w0, u, v)			\ +do {						\ +	UDItype __ll = (UDItype)(u) * (v);	\ +	w1 = __ll >> 32;			\ +	w0 = __ll;				\ +} while (0) +#elif __GNUC__ > 2 || __GNUC_MINOR__ >= 7  #define umul_ppmm(w1, w0, u, v) \  	__asm__ ("multu %2,%3" \  	: "=l" ((USItype)(w0)), \ @@ -666,7 +673,15 @@ do { \  	**************  MIPS/64  **************  	***************************************/  #if (defined(__mips) && __mips >= 3) && W_TYPE_SIZE == 64 -#if __GNUC__ > 2 || __GNUC_MINOR__ >= 7 +#if __GNUC__ >= 4 && __GNUC_MINOR__ >= 4 +#define umul_ppmm(w1, w0, u, v) \ +do {									\ +	typedef unsigned int __ll_UTItype __attribute__((mode(TI)));	\ +	__ll_UTItype __ll = (__ll_UTItype)(u) * (v);			\ +	w1 = __ll >> 64;						\ +	w0 = __ll;							\ +} while (0) +#elif __GNUC__ > 2 || __GNUC_MINOR__ >= 7  #define umul_ppmm(w1, w0, u, v) \  	__asm__ ("dmultu %2,%3" \  	: "=l" ((UDItype)(w0)), \  |