xref: /openbsd/lib/libcrypto/bn/arch/arm/bn_arch.h (revision 9f358229)
1*9f358229Sjsing /*	$OpenBSD: bn_arch.h,v 1.2 2023/06/24 15:51:47 jsing Exp $ */
25c83b098Sjsing /*
35c83b098Sjsing  * Copyright (c) 2023 Joel Sing <jsing@openbsd.org>
45c83b098Sjsing  *
55c83b098Sjsing  * Permission to use, copy, modify, and distribute this software for any
65c83b098Sjsing  * purpose with or without fee is hereby granted, provided that the above
75c83b098Sjsing  * copyright notice and this permission notice appear in all copies.
85c83b098Sjsing  *
95c83b098Sjsing  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
105c83b098Sjsing  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
115c83b098Sjsing  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
125c83b098Sjsing  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
135c83b098Sjsing  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
145c83b098Sjsing  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
155c83b098Sjsing  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
165c83b098Sjsing  */
175c83b098Sjsing 
18*9f358229Sjsing #include <openssl/bn.h>
19*9f358229Sjsing 
205c83b098Sjsing #ifndef HEADER_BN_ARCH_H
215c83b098Sjsing #define HEADER_BN_ARCH_H
225c83b098Sjsing 
235c83b098Sjsing #ifndef OPENSSL_NO_ASM
245c83b098Sjsing 
25*9f358229Sjsing #if defined(__GNUC__)
26*9f358229Sjsing 
27*9f358229Sjsing #define HAVE_BN_SUBW
28*9f358229Sjsing 
29*9f358229Sjsing static inline void
bn_subw(BN_ULONG a,BN_ULONG b,BN_ULONG * out_borrow,BN_ULONG * out_r0)30*9f358229Sjsing bn_subw(BN_ULONG a, BN_ULONG b, BN_ULONG *out_borrow, BN_ULONG *out_r0)
31*9f358229Sjsing {
32*9f358229Sjsing 	BN_ULONG borrow, r0;
33*9f358229Sjsing 
34*9f358229Sjsing 	__asm__ (
35*9f358229Sjsing 	    "mov  %[borrow], #0 \n"
36*9f358229Sjsing 	    "subs %[r0], %[a], %[b] \n"
37*9f358229Sjsing 	    "sbc  %[borrow], %[borrow], #0 \n"
38*9f358229Sjsing 	    "neg  %[borrow], %[borrow] \n"
39*9f358229Sjsing 	    : [borrow]"=&r"(borrow), [r0]"=r"(r0)
40*9f358229Sjsing 	    : [a]"r"(a), [b]"r"(b)
41*9f358229Sjsing 	    : "cc");
42*9f358229Sjsing 
43*9f358229Sjsing 	*out_borrow = borrow;
44*9f358229Sjsing 	*out_r0 = r0;
45*9f358229Sjsing }
46*9f358229Sjsing 
47*9f358229Sjsing #define HAVE_BN_SUBW_SUBW
48*9f358229Sjsing 
49*9f358229Sjsing static inline void
bn_subw_subw(BN_ULONG a,BN_ULONG b,BN_ULONG c,BN_ULONG * out_borrow,BN_ULONG * out_r0)50*9f358229Sjsing bn_subw_subw(BN_ULONG a, BN_ULONG b, BN_ULONG c, BN_ULONG *out_borrow,
51*9f358229Sjsing     BN_ULONG *out_r0)
52*9f358229Sjsing {
53*9f358229Sjsing 	BN_ULONG borrow, r0;
54*9f358229Sjsing 
55*9f358229Sjsing 	__asm__ (
56*9f358229Sjsing 	    "mov  %[borrow], #0 \n"
57*9f358229Sjsing 	    "subs %[r0], %[a], %[b] \n"
58*9f358229Sjsing 	    "sbc  %[borrow], %[borrow], #0 \n"
59*9f358229Sjsing 	    "subs %[r0], %[r0], %[c] \n"
60*9f358229Sjsing 	    "sbc  %[borrow], %[borrow], #0 \n"
61*9f358229Sjsing 	    "neg  %[borrow], %[borrow] \n"
62*9f358229Sjsing 	    : [borrow]"=&r"(borrow), [r0]"=&r"(r0)
63*9f358229Sjsing 	    : [a]"r"(a), [b]"r"(b), [c]"r"(c)
64*9f358229Sjsing 	    : "cc");
65*9f358229Sjsing 
66*9f358229Sjsing 	*out_borrow = borrow;
67*9f358229Sjsing 	*out_r0 = r0;
68*9f358229Sjsing }
69*9f358229Sjsing 
70*9f358229Sjsing #endif /* __GNUC__ */
71*9f358229Sjsing 
725c83b098Sjsing #endif
735c83b098Sjsing #endif
74