summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorjsing <>2023-06-24 15:51:47 +0000
committerjsing <>2023-06-24 15:51:47 +0000
commit9e7af2e933573c645b1fd326082f5705781bac2b (patch)
tree4a62cc96d4dd91ecaca2a61bd0f658cbfbd19cf8
parent23a3848bc1a71df07b287b04bc2f6ed7af1c1bbc (diff)
downloadopenbsd-9e7af2e933573c645b1fd326082f5705781bac2b.tar.gz
openbsd-9e7af2e933573c645b1fd326082f5705781bac2b.tar.bz2
openbsd-9e7af2e933573c645b1fd326082f5705781bac2b.zip
Provide optimised bn_subw() and bn_subw_subw() for arm.
-rw-r--r--src/lib/libcrypto/bn/arch/arm/bn_arch.h51
1 files changed, 50 insertions, 1 deletions
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 @@
1/* $OpenBSD: bn_arch.h,v 1.1 2023/01/20 10:04:33 jsing Exp $ */ 1/* $OpenBSD: bn_arch.h,v 1.2 2023/06/24 15:51:47 jsing Exp $ */
2/* 2/*
3 * Copyright (c) 2023 Joel Sing <jsing@openbsd.org> 3 * Copyright (c) 2023 Joel Sing <jsing@openbsd.org>
4 * 4 *
@@ -15,10 +15,59 @@
15 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 15 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
16 */ 16 */
17 17
18#include <openssl/bn.h>
19
18#ifndef HEADER_BN_ARCH_H 20#ifndef HEADER_BN_ARCH_H
19#define HEADER_BN_ARCH_H 21#define HEADER_BN_ARCH_H
20 22
21#ifndef OPENSSL_NO_ASM 23#ifndef OPENSSL_NO_ASM
22 24
25#if defined(__GNUC__)
26
27#define HAVE_BN_SUBW
28
29static inline void
30bn_subw(BN_ULONG a, BN_ULONG b, BN_ULONG *out_borrow, BN_ULONG *out_r0)
31{
32 BN_ULONG borrow, r0;
33
34 __asm__ (
35 "mov %[borrow], #0 \n"
36 "subs %[r0], %[a], %[b] \n"
37 "sbc %[borrow], %[borrow], #0 \n"
38 "neg %[borrow], %[borrow] \n"
39 : [borrow]"=&r"(borrow), [r0]"=r"(r0)
40 : [a]"r"(a), [b]"r"(b)
41 : "cc");
42
43 *out_borrow = borrow;
44 *out_r0 = r0;
45}
46
47#define HAVE_BN_SUBW_SUBW
48
49static inline void
50bn_subw_subw(BN_ULONG a, BN_ULONG b, BN_ULONG c, BN_ULONG *out_borrow,
51 BN_ULONG *out_r0)
52{
53 BN_ULONG borrow, r0;
54
55 __asm__ (
56 "mov %[borrow], #0 \n"
57 "subs %[r0], %[a], %[b] \n"
58 "sbc %[borrow], %[borrow], #0 \n"
59 "subs %[r0], %[r0], %[c] \n"
60 "sbc %[borrow], %[borrow], #0 \n"
61 "neg %[borrow], %[borrow] \n"
62 : [borrow]"=&r"(borrow), [r0]"=&r"(r0)
63 : [a]"r"(a), [b]"r"(b), [c]"r"(c)
64 : "cc");
65
66 *out_borrow = borrow;
67 *out_r0 = r0;
68}
69
70#endif /* __GNUC__ */
71
23#endif 72#endif
24#endif 73#endif