Provide optimised bn_subw() and bn_subw_subw() for arm.
authorjsing <jsing@openbsd.org>
Sat, 24 Jun 2023 15:51:47 +0000 (15:51 +0000)
committerjsing <jsing@openbsd.org>
Sat, 24 Jun 2023 15:51:47 +0000 (15:51 +0000)
lib/libcrypto/bn/arch/arm/bn_arch.h

index 136adf0..ef9bf7f 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: bn_arch.h,v 1.1 2023/01/20 10:04:33 jsing Exp $ */
+/*     $OpenBSD: bn_arch.h,v 1.2 2023/06/24 15:51:47 jsing Exp $ */
 /*
  * Copyright (c) 2023 Joel Sing <jsing@openbsd.org>
  *
  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
  */
 
+#include <openssl/bn.h>
+
 #ifndef HEADER_BN_ARCH_H
 #define HEADER_BN_ARCH_H
 
 #ifndef OPENSSL_NO_ASM
 
+#if defined(__GNUC__)
+
+#define HAVE_BN_SUBW
+
+static inline void
+bn_subw(BN_ULONG a, BN_ULONG b, BN_ULONG *out_borrow, BN_ULONG *out_r0)
+{
+       BN_ULONG borrow, r0;
+
+       __asm__ (
+           "mov  %[borrow], #0 \n"
+           "subs %[r0], %[a], %[b] \n"
+           "sbc  %[borrow], %[borrow], #0 \n"
+           "neg  %[borrow], %[borrow] \n"
+           : [borrow]"=&r"(borrow), [r0]"=r"(r0)
+           : [a]"r"(a), [b]"r"(b)
+           : "cc");
+
+       *out_borrow = borrow;
+       *out_r0 = r0;
+}
+
+#define HAVE_BN_SUBW_SUBW
+
+static inline void
+bn_subw_subw(BN_ULONG a, BN_ULONG b, BN_ULONG c, BN_ULONG *out_borrow,
+    BN_ULONG *out_r0)
+{
+       BN_ULONG borrow, r0;
+
+       __asm__ (
+           "mov  %[borrow], #0 \n"
+           "subs %[r0], %[a], %[b] \n"
+           "sbc  %[borrow], %[borrow], #0 \n"
+           "subs %[r0], %[r0], %[c] \n"
+           "sbc  %[borrow], %[borrow], #0 \n"
+           "neg  %[borrow], %[borrow] \n"
+           : [borrow]"=&r"(borrow), [r0]"=&r"(r0)
+           : [a]"r"(a), [b]"r"(b), [c]"r"(c)
+           : "cc");
+
+       *out_borrow = borrow;
+       *out_r0 = r0;
+}
+
+#endif /* __GNUC__ */
+
 #endif
 #endif