projects
/
openssl.git
/ commitdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
| commitdiff |
tree
raw
|
patch
|
inline
| side by side (parent:
d21bf10
)
bn_lcl.h: gcc removed support for "h" constraint, which broke inline
author
Andy Polyakov
<appro@openssl.org>
Sat, 1 Sep 2012 13:17:32 +0000
(13:17 +0000)
committer
Andy Polyakov
<appro@openssl.org>
Sat, 1 Sep 2012 13:17:32 +0000
(13:17 +0000)
assembler.
crypto/bn/bn_lcl.h
patch
|
blob
|
history
diff --git
a/crypto/bn/bn_lcl.h
b/crypto/bn/bn_lcl.h
index 74cea91c1cf9a1c316321be2cf92f24b219dc280..64df27aaf93e22091a5b38854a7b8a5208b312b9 100644
(file)
--- 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
# 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; })
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));
asm ("dmultu %2,%3" \
: "=l"(low),"=h"(high) \
: "r"(a), "r"(b));
+# endif
# endif
# endif /* cpu */
#endif /* OPENSSL_NO_ASM */
# endif
# endif /* cpu */
#endif /* OPENSSL_NO_ASM */