aboutsummaryrefslogtreecommitdiffstats
path: root/lib/mpi/mpicoder.c
diff options
context:
space:
mode:
authorNicolai Stange <nicstange@gmail.com>2016-03-22 08:12:40 -0400
committerHerbert Xu <herbert@gondor.apana.org.au>2016-04-05 08:35:49 -0400
commitf00fa2417b3e1252b1a761f88731af03afff4407 (patch)
tree1ba46a98908d23e0c95eb52b5e5a52173b7d06b9 /lib/mpi/mpicoder.c
parentd755290689646fa66cc4830ca55569f2c9863666 (diff)
lib/mpi: mpi_read_buffer(): optimize skipping of leading zero limbs
Currently, if the number of leading zeros is greater than fits into a complete limb, mpi_read_buffer() skips them by iterating over them limb-wise. Instead of skipping the high order zero limbs within the loop as shown above, adjust the copying loop's bounds. Signed-off-by: Nicolai Stange <nicstange@gmail.com> Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
Diffstat (limited to 'lib/mpi/mpicoder.c')
-rw-r--r--lib/mpi/mpicoder.c18
1 files changed, 8 insertions, 10 deletions
diff --git a/lib/mpi/mpicoder.c b/lib/mpi/mpicoder.c
index 623439e4bad5..2fd8d418526c 100644
--- a/lib/mpi/mpicoder.c
+++ b/lib/mpi/mpicoder.c
@@ -184,7 +184,9 @@ int mpi_read_buffer(MPI a, uint8_t *buf, unsigned buf_len, unsigned *nbytes,
184 p = buf; 184 p = buf;
185 *nbytes = n - lzeros; 185 *nbytes = n - lzeros;
186 186
187 for (i = a->nlimbs - 1; i >= 0; i--) { 187 for (i = a->nlimbs - 1 - lzeros / BYTES_PER_MPI_LIMB,
188 lzeros %= BYTES_PER_MPI_LIMB;
189 i >= 0; i--) {
188 alimb = a->d[i]; 190 alimb = a->d[i];
189#if BYTES_PER_MPI_LIMB == 4 191#if BYTES_PER_MPI_LIMB == 4
190 *p++ = alimb >> 24; 192 *p++ = alimb >> 24;
@@ -205,15 +207,11 @@ int mpi_read_buffer(MPI a, uint8_t *buf, unsigned buf_len, unsigned *nbytes,
205#endif 207#endif
206 208
207 if (lzeros > 0) { 209 if (lzeros > 0) {
208 if (lzeros >= sizeof(alimb)) { 210 mpi_limb_t *limb1 = (void *)p - sizeof(alimb);
209 p -= sizeof(alimb); 211 mpi_limb_t *limb2 = (void *)p - sizeof(alimb)
210 } else { 212 + lzeros;
211 mpi_limb_t *limb1 = (void *)p - sizeof(alimb); 213 *limb1 = *limb2;
212 mpi_limb_t *limb2 = (void *)p - sizeof(alimb) 214 p -= lzeros;
213 + lzeros;
214 *limb1 = *limb2;
215 p -= lzeros;
216 }
217 lzeros -= sizeof(alimb); 215 lzeros -= sizeof(alimb);
218 } 216 }
219 } 217 }