diff options
author | jsing <> | 2023-06-24 15:51:47 +0000 |
---|---|---|
committer | jsing <> | 2023-06-24 15:51:47 +0000 |
commit | 9e7af2e933573c645b1fd326082f5705781bac2b (patch) | |
tree | 4a62cc96d4dd91ecaca2a61bd0f658cbfbd19cf8 /src | |
parent | 23a3848bc1a71df07b287b04bc2f6ed7af1c1bbc (diff) | |
download | openbsd-9e7af2e933573c645b1fd326082f5705781bac2b.tar.gz openbsd-9e7af2e933573c645b1fd326082f5705781bac2b.tar.bz2 openbsd-9e7af2e933573c645b1fd326082f5705781bac2b.zip |
Provide optimised bn_subw() and bn_subw_subw() for arm.
Diffstat (limited to 'src')
-rw-r--r-- | src/lib/libcrypto/bn/arch/arm/bn_arch.h | 51 |
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 | |||
29 | static inline void | ||
30 | bn_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 | |||
49 | static inline void | ||
50 | bn_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 |