summaryrefslogtreecommitdiff
path: root/src/lib/libcrypto/bn/bn_mul.c
diff options
context:
space:
mode:
authorjsing <>2023-06-12 16:17:24 +0000
committerjsing <>2023-06-12 16:17:24 +0000
commit9555359b43b00ed20a16eba7b602909bc52f32b0 (patch)
treeb4e21a96adfc49bf3a4624865e60a6430dcf75ab /src/lib/libcrypto/bn/bn_mul.c
parent3e78f2fb356efca03fc4bfdadb63b49114e128a2 (diff)
downloadopenbsd-9555359b43b00ed20a16eba7b602909bc52f32b0.tar.gz
openbsd-9555359b43b00ed20a16eba7b602909bc52f32b0.tar.bz2
openbsd-9555359b43b00ed20a16eba7b602909bc52f32b0.zip
Provide and use various quad word primitives.
This includes bn_qwaddqw(), bn_qwsubqw(), bn_qwmulw_addw() and bn_qwmulw_addqw_addw(). These can typically be optimised on architectures that have a reasonable number of general purpose registers. ok tb@
Diffstat (limited to '')
-rw-r--r--src/lib/libcrypto/bn/bn_mul.c19
1 files changed, 6 insertions, 13 deletions
diff --git a/src/lib/libcrypto/bn/bn_mul.c b/src/lib/libcrypto/bn/bn_mul.c
index 118e8cddc5..65088cc5c4 100644
--- a/src/lib/libcrypto/bn/bn_mul.c
+++ b/src/lib/libcrypto/bn/bn_mul.c
@@ -1,4 +1,4 @@
1/* $OpenBSD: bn_mul.c,v 1.37 2023/04/19 10:51:22 jsing Exp $ */ 1/* $OpenBSD: bn_mul.c,v 1.38 2023/06/12 16:17:24 jsing Exp $ */
2/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) 2/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
3 * All rights reserved. 3 * All rights reserved.
4 * 4 *
@@ -210,17 +210,13 @@ bn_mul_words(BN_ULONG *r, const BN_ULONG *a, int num, BN_ULONG w)
210 if (num <= 0) 210 if (num <= 0)
211 return 0; 211 return 0;
212 212
213#ifndef OPENSSL_SMALL_FOOTPRINT
214 while (num & ~3) { 213 while (num & ~3) {
215 bn_mulw_addw(a[0], w, carry, &carry, &r[0]); 214 bn_qwmulw_addw(a[3], a[2], a[1], a[0], w, carry, &carry,
216 bn_mulw_addw(a[1], w, carry, &carry, &r[1]); 215 &r[3], &r[2], &r[1], &r[0]);
217 bn_mulw_addw(a[2], w, carry, &carry, &r[2]);
218 bn_mulw_addw(a[3], w, carry, &carry, &r[3]);
219 a += 4; 216 a += 4;
220 r += 4; 217 r += 4;
221 num -= 4; 218 num -= 4;
222 } 219 }
223#endif
224 while (num) { 220 while (num) {
225 bn_mulw_addw(a[0], w, carry, &carry, &r[0]); 221 bn_mulw_addw(a[0], w, carry, &carry, &r[0]);
226 a++; 222 a++;
@@ -247,17 +243,14 @@ bn_mul_add_words(BN_ULONG *r, const BN_ULONG *a, int num, BN_ULONG w)
247 if (num <= 0) 243 if (num <= 0)
248 return 0; 244 return 0;
249 245
250#ifndef OPENSSL_SMALL_FOOTPRINT
251 while (num & ~3) { 246 while (num & ~3) {
252 bn_mulw_addw_addw(a[0], w, r[0], carry, &carry, &r[0]); 247 bn_qwmulw_addqw_addw(a[3], a[2], a[1], a[0], w,
253 bn_mulw_addw_addw(a[1], w, r[1], carry, &carry, &r[1]); 248 r[3], r[2], r[1], r[0], carry, &carry,
254 bn_mulw_addw_addw(a[2], w, r[2], carry, &carry, &r[2]); 249 &r[3], &r[2], &r[1], &r[0]);
255 bn_mulw_addw_addw(a[3], w, r[3], carry, &carry, &r[3]);
256 a += 4; 250 a += 4;
257 r += 4; 251 r += 4;
258 num -= 4; 252 num -= 4;
259 } 253 }
260#endif
261 while (num) { 254 while (num) {
262 bn_mulw_addw_addw(a[0], w, r[0], carry, &carry, &r[0]); 255 bn_mulw_addw_addw(a[0], w, r[0], carry, &carry, &r[0]);
263 a++; 256 a++;