From 9e7af2e933573c645b1fd326082f5705781bac2b Mon Sep 17 00:00:00 2001 From: jsing <> Date: Sat, 24 Jun 2023 15:51:47 +0000 Subject: Provide optimised bn_subw() and bn_subw_subw() for arm. --- src/lib/libcrypto/bn/arch/arm/bn_arch.h | 51 ++++++++++++++++++++++++++++++++- 1 file changed, 50 insertions(+), 1 deletion(-) (limited to 'src') diff --git a/src/lib/libcrypto/bn/arch/arm/bn_arch.h b/src/lib/libcrypto/bn/arch/arm/bn_arch.h index 136adf0e97..ef9bf7f156 100644 --- a/src/lib/libcrypto/bn/arch/arm/bn_arch.h +++ b/src/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 -- cgit v1.2.3-55-g6feb