summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/lib/libcrypto/bn/arch/aarch64/bn_arch.h29
1 files changed, 28 insertions, 1 deletions
diff --git a/src/lib/libcrypto/bn/arch/aarch64/bn_arch.h b/src/lib/libcrypto/bn/arch/aarch64/bn_arch.h
index f658510c73..aa780e09e9 100644
--- a/src/lib/libcrypto/bn/arch/aarch64/bn_arch.h
+++ b/src/lib/libcrypto/bn/arch/aarch64/bn_arch.h
@@ -1,4 +1,4 @@
1/* $OpenBSD: bn_arch.h,v 1.10 2023/06/12 16:42:11 jsing Exp $ */ 1/* $OpenBSD: bn_arch.h,v 1.11 2023/06/17 15:40:46 jsing Exp $ */
2/* 2/*
3 * Copyright (c) 2023 Joel Sing <jsing@openbsd.org> 3 * Copyright (c) 2023 Joel Sing <jsing@openbsd.org>
4 * 4 *
@@ -177,6 +177,33 @@ bn_mulw_addtw(BN_ULONG a, BN_ULONG b, BN_ULONG c2, BN_ULONG c1, BN_ULONG c0,
177 *out_r0 = r0; 177 *out_r0 = r0;
178} 178}
179 179
180#define HAVE_BN_MUL2_MULW_ADDTW
181
182static inline void
183bn_mul2_mulw_addtw(BN_ULONG a, BN_ULONG b, BN_ULONG c2, BN_ULONG c1, BN_ULONG c0,
184 BN_ULONG *out_r2, BN_ULONG *out_r1, BN_ULONG *out_r0)
185{
186 BN_ULONG r2, r1, r0, x1, x0;
187
188 __asm__ (
189 "umulh %[x1], %[a], %[b] \n"
190 "mul %[x0], %[a], %[b] \n"
191 "adds %[r0], %[c0], %[x0] \n"
192 "adcs %[r1], %[c1], %[x1] \n"
193 "adc %[r2], xzr, %[c2] \n"
194 "adds %[r0], %[r0], %[x0] \n"
195 "adcs %[r1], %[r1], %[x1] \n"
196 "adc %[r2], xzr, %[r2] \n"
197 : [r2]"=&r"(r2), [r1]"=&r"(r1), [r0]"=&r"(r0), [x1]"=&r"(x1),
198 [x0]"=&r"(x0)
199 : [a]"r"(a), [b]"r"(b), [c2]"r"(c2), [c1]"r"(c1), [c0]"r"(c0)
200 : "cc");
201
202 *out_r2 = r2;
203 *out_r1 = r1;
204 *out_r0 = r0;
205}
206
180#define HAVE_BN_QWMULW_ADDW 207#define HAVE_BN_QWMULW_ADDW
181 208
182static inline void 209static inline void