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_add.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 'src/lib/libcrypto/bn/bn_add.c')
-rw-r--r-- | src/lib/libcrypto/bn/bn_add.c | 18 |
1 files changed, 5 insertions, 13 deletions
diff --git a/src/lib/libcrypto/bn/bn_add.c b/src/lib/libcrypto/bn/bn_add.c index 92489b7da3..36f160ab5f 100644 --- a/src/lib/libcrypto/bn/bn_add.c +++ b/src/lib/libcrypto/bn/bn_add.c | |||
@@ -1,4 +1,4 @@ | |||
1 | /* $OpenBSD: bn_add.c,v 1.24 2023/02/22 05:46:37 jsing Exp $ */ | 1 | /* $OpenBSD: bn_add.c,v 1.25 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 | * |
@@ -80,18 +80,14 @@ bn_add_words(BN_ULONG *r, const BN_ULONG *a, const BN_ULONG *b, int n) | |||
80 | if (n <= 0) | 80 | if (n <= 0) |
81 | return 0; | 81 | return 0; |
82 | 82 | ||
83 | #ifndef OPENSSL_SMALL_FOOTPRINT | ||
84 | while (n & ~3) { | 83 | while (n & ~3) { |
85 | bn_addw_addw(a[0], b[0], carry, &carry, &r[0]); | 84 | bn_qwaddqw(a[3], a[2], a[1], a[0], b[3], b[2], b[1], b[0], |
86 | bn_addw_addw(a[1], b[1], carry, &carry, &r[1]); | 85 | carry, &carry, &r[3], &r[2], &r[1], &r[0]); |
87 | bn_addw_addw(a[2], b[2], carry, &carry, &r[2]); | ||
88 | bn_addw_addw(a[3], b[3], carry, &carry, &r[3]); | ||
89 | a += 4; | 86 | a += 4; |
90 | b += 4; | 87 | b += 4; |
91 | r += 4; | 88 | r += 4; |
92 | n -= 4; | 89 | n -= 4; |
93 | } | 90 | } |
94 | #endif | ||
95 | while (n) { | 91 | while (n) { |
96 | bn_addw_addw(a[0], b[0], carry, &carry, &r[0]); | 92 | bn_addw_addw(a[0], b[0], carry, &carry, &r[0]); |
97 | a++; | 93 | a++; |
@@ -165,18 +161,14 @@ bn_sub_words(BN_ULONG *r, const BN_ULONG *a, const BN_ULONG *b, int n) | |||
165 | if (n <= 0) | 161 | if (n <= 0) |
166 | return 0; | 162 | return 0; |
167 | 163 | ||
168 | #ifndef OPENSSL_SMALL_FOOTPRINT | ||
169 | while (n & ~3) { | 164 | while (n & ~3) { |
170 | bn_subw_subw(a[0], b[0], borrow, &borrow, &r[0]); | 165 | bn_qwsubqw(a[3], a[2], a[1], a[0], b[3], b[2], b[1], b[0], |
171 | bn_subw_subw(a[1], b[1], borrow, &borrow, &r[1]); | 166 | borrow, &borrow, &r[3], &r[2], &r[1], &r[0]); |
172 | bn_subw_subw(a[2], b[2], borrow, &borrow, &r[2]); | ||
173 | bn_subw_subw(a[3], b[3], borrow, &borrow, &r[3]); | ||
174 | a += 4; | 167 | a += 4; |
175 | b += 4; | 168 | b += 4; |
176 | r += 4; | 169 | r += 4; |
177 | n -= 4; | 170 | n -= 4; |
178 | } | 171 | } |
179 | #endif | ||
180 | while (n) { | 172 | while (n) { |
181 | bn_subw_subw(a[0], b[0], borrow, &borrow, &r[0]); | 173 | bn_subw_subw(a[0], b[0], borrow, &borrow, &r[0]); |
182 | a++; | 174 | a++; |