Commit 4f385652 authored by Andy Polyakov's avatar Andy Polyakov
Browse files

bn_lcl.h: add MIPS III-specific BN_UMULT_LOHI as alternative to porting

crypto/bn/asm/mips3.s from IRIX. Performance improvement is not as
impressive as with complete assembler, but still... it's almost 2.5x
[on R5000].
parent 4407700c
Loading
Loading
Loading
Loading
+16 −3
Original line number Diff line number Diff line
@@ -238,7 +238,7 @@ extern "C" {
#  if defined(__DECC)
#   include <c_asm.h>
#   define BN_UMULT_HIGH(a,b)	(BN_ULONG)asm("umulh %a0,%a1,%v0",(a),(b))
#  elif defined(__GNUC__)
#  elif defined(__GNUC__) && __GNUC__>=2
#   define BN_UMULT_HIGH(a,b)	({	\
	register BN_ULONG ret;		\
	asm ("umulh	%1,%2,%0"	\
@@ -247,7 +247,7 @@ extern "C" {
	ret;			})
#  endif	/* compiler */
# elif defined(_ARCH_PPC) && defined(__64BIT__) && defined(SIXTY_FOUR_BIT_LONG)
#  if defined(__GNUC__)
#  if defined(__GNUC__) && __GNUC__>=2
#   define BN_UMULT_HIGH(a,b)	({	\
	register BN_ULONG ret;		\
	asm ("mulhdu	%0,%1,%2"	\
@@ -257,7 +257,7 @@ extern "C" {
#  endif	/* compiler */
# elif (defined(__x86_64) || defined(__x86_64__)) && \
       (defined(SIXTY_FOUR_BIT_LONG) || defined(SIXTY_FOUR_BIT))
#  if defined(__GNUC__)
#  if defined(__GNUC__) && __GNUC__>=2
#   define BN_UMULT_HIGH(a,b)	({	\
	register BN_ULONG ret,discard;	\
	asm ("mulq	%3"		\
@@ -280,6 +280,19 @@ extern "C" {
#   define BN_UMULT_HIGH(a,b)		__umulh((a),(b))
#   define BN_UMULT_LOHI(low,high,a,b)	((low)=_umul128((a),(b),&(high)))
#  endif
# elif defined(__mips) && (defined(SIXTY_FOUR_BIT) || defined(SIXTY_FOUR_BIT_LONG))
#  if defined(__GNUC__) && __GNUC__>=2
#   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)	\
	asm ("dmultu	%2,%3"		\
	     : "=l"(low),"=h"(high)	\
	     : "r"(a), "r"(b));
#  endif
# endif		/* cpu */
#endif		/* OPENSSL_NO_ASM */