diff options
author | jsing <> | 2023-06-12 16:17:24 +0000 |
---|---|---|
committer | jsing <> | 2023-06-12 16:17:24 +0000 |
commit | 9555359b43b00ed20a16eba7b602909bc52f32b0 (patch) | |
tree | b4e21a96adfc49bf3a4624865e60a6430dcf75ab /src/lib/libcrypto/bn/bn_mul.c | |
parent | 3e78f2fb356efca03fc4bfdadb63b49114e128a2 (diff) | |
download | openbsd-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.c | 19 |
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++; |