The MIPS port of GCC-4.4 no longer recognizes the "h" asm constraint. Patch originally from OpenWRT forums: https://forum.openwrt.org/viewtopic.php?id=20520 Passes all tests on little-endian MIPS32 (gcc-4.4.3). --- libgcrypt-1.4.5/mpi/longlong.h.orig 2010-03-09 07:39:59.000000000 +0100 +++ libgcrypt-1.4.5/mpi/longlong.h 2010-03-09 07:40:04.000000000 +0100 @@ -710,18 +710,35 @@ extern USItype __udiv_qrnnd (); #endif /* __m88110__ */ #endif /* __m88000__ */ +/* Test for gcc >= maj.min, as per __GNUC_PREREQ in glibc */ +#if defined (__GNUC__) && defined (__GNUC_MINOR__) +#define __GNUC_PREREQ(maj, min) \ + ((__GNUC__ << 16) + __GNUC_MINOR__ >= ((maj) << 16) + (min)) +#else +#define __GNUC_PREREQ(maj, min) 0 +#endif + /*************************************** ************** MIPS ***************** ***************************************/ #if defined (__mips__) && W_TYPE_SIZE == 32 -#if __GNUC__ > 2 || __GNUC_MINOR__ >= 7 +#if __GNUC_PREREQ (4,4) +#define umul_ppmm(w1, w0, u, v) \ + do { \ + UDItype __ll = (UDItype)(u) * (v); \ + w1 = __ll >> 32; \ + w0 = __ll; \ + } while (0) +#endif +#if !defined (umul_ppmm) && __GNUC_PREREQ (2,7) #define umul_ppmm(w1, w0, u, v) \ __asm__ ("multu %2,%3" \ : "=l" ((USItype)(w0)), \ "=h" ((USItype)(w1)) \ : "d" ((USItype)(u)), \ "d" ((USItype)(v))) -#else +#endif +#if !defined (umul_ppmm) #define umul_ppmm(w1, w0, u, v) \ __asm__ ("multu %2,%3 \n" \ "mflo %0 \n" \ @@ -739,14 +756,24 @@ extern USItype __udiv_qrnnd (); ************** MIPS/64 ************** ***************************************/ #if (defined (__mips) && __mips >= 3) && W_TYPE_SIZE == 64 -#if __GNUC__ > 2 || __GNUC_MINOR__ >= 7 +#if __GNUC_PREREQ (4,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) +#endif +#if !defined (umul_ppmm) && __GNUC_PREREQ (2,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 +#endif +#if !defined (umul_ppmm) #define umul_ppmm(w1, w0, u, v) \ __asm__ ("dmultu %2,%3 \n" \ "mflo %0 \n" \ Reproducible: Always
Created attachment 222777 [details, diff] libgcrypt-1.4.5-gcc44-mips-no-h-constraint Patch
I have tested it on my Loongson little-endian N32 mips . Pass
1.4.5 version passed test on my gentoo-mips 24kc box, both cross/native compile (In reply to comment #0)
Doest this problem still occur with dev-libs/libgcrypt-1.4.6?
(In reply to comment #4) > Doest this problem still occur with dev-libs/libgcrypt-1.4.6? No, the libgcrypt-1.4.6 ebuild builds just fine on my MIPS machines with gcc-4.4.4. I'll close the bug.