From 25e71cb29ba1842ed64d188b2d12bfae2244e423 Mon Sep 17 00:00:00 2001 From: NIIBE Yutaka Date: Thu, 20 Mar 2014 15:51:55 +0900 Subject: [PATCH] use 64-bit for mul --- src/mod25638.c | 31 +++++++++++-------------------- 1 file changed, 11 insertions(+), 20 deletions(-) diff --git a/src/mod25638.c b/src/mod25638.c index 3f51843..ebfb3ef 100644 --- a/src/mod25638.c +++ b/src/mod25638.c @@ -158,40 +158,31 @@ mod25638_mul (bn256 *X, const bn256 *A, const bn256 *B) s = &word[8]; d = &word[0]; w = 38; { int i; - uint32_t r0, r1; + uint64_t r; + uint32_t r0; + uint32_t carry; - r0 = r1 = 0; + r = 0; for (i = 0; i < BN256_WORDS; i++) { uint64_t uv; - uint32_t u, v; - uint32_t carry; - r0 += d[i]; - r1 += (r0 < d[i]); - carry = (r1 < (r0 < d[i])); + r += d[i]; + carry = (r < d[i]); uv = ((uint64_t)s[i])*w; - v = uv; - u = (uv >> 32); - r0 += v; - r1 += (r0 < v); - carry += (r1 < (r0 < v)); - r1 += u; - carry += (r1 < u); + r += uv; + carry += (r < uv); - d[i] = r0; - r0 = r1; - r1 = carry; + d[i] = (uint32_t)r; + r = ((r >> 32) | ((uint64_t)carry << 32)); } - d[i] = r0; + d[i] = (uint32_t)r; r0 = word[8] * 38; d = word; for (i = 0; i < BN256_WORDS; i++) { - uint32_t carry; - r0 += d[i]; carry = (r0 < d[i]); d[i] = r0;