Enable s2n-bignum word_clz() on amd64.
authorjsing <jsing@openbsd.org>
Thu, 16 Feb 2023 11:13:05 +0000 (11:13 +0000)
committerjsing <jsing@openbsd.org>
Thu, 16 Feb 2023 11:13:05 +0000 (11:13 +0000)
The BN_num_bits_word() function is a hot path, being called more than
80 million times during a libcrypto regress run. The word_clz()
implementation uses five instructions to do the same as the generic code
that uses more than 60 instructions.

Discussed with tb@

lib/libcrypto/arch/amd64/Makefile.inc
lib/libcrypto/bn/arch/amd64/bn_arch.c
lib/libcrypto/bn/arch/amd64/bn_arch.h
lib/libcrypto/bn/bn_local.h

index 5e433b5..e9c7732 100644 (file)
@@ -1,4 +1,4 @@
-# $OpenBSD: Makefile.inc,v 1.11 2023/01/29 14:00:41 jsing Exp $
+# $OpenBSD: Makefile.inc,v 1.12 2023/02/16 11:13:05 jsing Exp $
 
 # amd64-specific libcrypto build rules
 
@@ -39,6 +39,7 @@ SRCS += bignum_sqr.S
 SRCS += bignum_sqr_4_8_alt.S
 SRCS += bignum_sqr_8_16_alt.S
 SRCS += bignum_sub.S
+SRCS += word_clz.S
 
 # camellia
 SRCS+= cmll_misc.c
index be2badc..a4a2d93 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: bn_arch.c,v 1.4 2023/02/04 14:00:18 jsing Exp $ */
+/*     $OpenBSD: bn_arch.c,v 1.5 2023/02/16 11:13:05 jsing Exp $ */
 /*
  * Copyright (c) 2023 Joel Sing <jsing@openbsd.org>
  *
@@ -118,3 +118,11 @@ bn_sqr_comba8(BN_ULONG *rd, const BN_ULONG *ad)
        bignum_sqr_8_16_alt((uint64_t *)rd, (uint64_t *)ad);
 }
 #endif
+
+#ifdef HAVE_BN_WORD_CLZ
+int
+bn_word_clz(BN_ULONG w)
+{
+       return word_clz(w);
+}
+#endif
index 80f73bf..f3653bc 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: bn_arch.h,v 1.12 2023/02/16 10:41:03 jsing Exp $ */
+/*     $OpenBSD: bn_arch.h,v 1.13 2023/02/16 11:13:05 jsing Exp $ */
 /*
  * Copyright (c) 2023 Joel Sing <jsing@openbsd.org>
  *
@@ -39,6 +39,8 @@
 #define HAVE_BN_SUB
 #define HAVE_BN_SUB_WORDS
 
+#define HAVE_BN_WORD_CLZ
+
 #if defined(__GNUC__)
 #define HAVE_BN_DIV_REM_WORDS_INLINE
 
index 1830264..51582f9 100644 (file)
@@ -1,4 +1,4 @@
-/* $OpenBSD: bn_local.h,v 1.9 2023/02/14 18:45:39 jsing Exp $ */
+/* $OpenBSD: bn_local.h,v 1.10 2023/02/16 11:13:05 jsing Exp $ */
 /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
  * All rights reserved.
  *
@@ -515,6 +515,8 @@ BN_ULONG bn_sub_part_words(BN_ULONG *r, const BN_ULONG *a, const BN_ULONG *b,
 int bn_mul_mont(BN_ULONG *rp, const BN_ULONG *ap, const BN_ULONG *bp,
     const BN_ULONG *np, const BN_ULONG *n0, int num);
 
+int bn_word_clz(BN_ULONG w);
+
 void bn_correct_top(BIGNUM *a);
 int bn_expand(BIGNUM *a, int bits);
 int bn_wexpand(BIGNUM *a, int words);