From: Andy Polyakov Date: Sat, 1 Sep 2012 13:17:32 +0000 (+0000) Subject: bn_lcl.h: gcc removed support for "h" constraint, which broke inline X-Git-Tag: master-post-reformat~1711 X-Git-Url: https://git.openssl.org/?p=openssl.git;a=commitdiff_plain;h=a58fdc7a346e717308984e2b6d22b1081d708b0a;hp=d21bf10dea6588b632a65b4fe594e04f288aad83 bn_lcl.h: gcc removed support for "h" constraint, which broke inline assembler. --- diff --git a/crypto/bn/bn_lcl.h b/crypto/bn/bn_lcl.h index 74cea91c1c..64df27aaf9 100644 --- a/crypto/bn/bn_lcl.h +++ b/crypto/bn/bn_lcl.h @@ -300,16 +300,23 @@ extern "C" { # endif # elif defined(__mips) && (defined(SIXTY_FOUR_BIT) || defined(SIXTY_FOUR_BIT_LONG)) # if defined(__GNUC__) && __GNUC__>=2 -# define BN_UMULT_HIGH(a,b) ({ \ +# if __GNUC__>=4 && __GNUC_MINOR__>=4 /* "h" constraint is no more since 4.4 */ +# define BN_UMULT_HIGH(a,b) (((__uint128_t)(a)*(b))>>64) +# define BN_UMULT_LOHI(low,high,a,b) ({ \ + __uint128_t ret=(__uint128_t)(a)*(b); \ + (high)=ret>>64; (low)=ret; }) +# else +# define BN_UMULT_HIGH(a,b) ({ \ register BN_ULONG ret; \ asm ("dmultu %1,%2" \ : "=h"(ret) \ : "r"(a), "r"(b) : "l"); \ ret; }) -# define BN_UMULT_LOHI(low,high,a,b) \ +# define BN_UMULT_LOHI(low,high,a,b)\ asm ("dmultu %2,%3" \ : "=l"(low),"=h"(high) \ : "r"(a), "r"(b)); +# endif # endif # endif /* cpu */ #endif /* OPENSSL_NO_ASM */