From 9f358229f560da5f55a5f334c28bd543d12a1476 Mon Sep 17 00:00:00 2001 From: jsing Date: Sat, 24 Jun 2023 15:51:47 +0000 Subject: [PATCH] Provide optimised bn_subw() and bn_subw_subw() for arm. --- lib/libcrypto/bn/arch/arm/bn_arch.h | 51 ++++++++++++++++++++++++++++- 1 file changed, 50 insertions(+), 1 deletion(-) diff --git a/lib/libcrypto/bn/arch/arm/bn_arch.h b/lib/libcrypto/bn/arch/arm/bn_arch.h index 136adf0e977..ef9bf7f1569 100644 --- a/lib/libcrypto/bn/arch/arm/bn_arch.h +++ b/lib/libcrypto/bn/arch/arm/bn_arch.h @@ -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 * @@ -15,10 +15,59 @@ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ +#include + #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 -- 2.20.1