From 3033ae30f837c3ceee57a37dcdbf974354b0ea88 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mamy=20Andr=C3=A9-Ratsimbazafy?= Date: Mon, 10 Feb 2020 02:12:44 +0100 Subject: [PATCH] Fix uint32 extended precision multiplication --- constantine/private/primitives_internal.nim | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/constantine/private/primitives_internal.nim b/constantine/private/primitives_internal.nim index 70f38b9..a4f4e8d 100644 --- a/constantine/private/primitives_internal.nim +++ b/constantine/private/primitives_internal.nim @@ -57,11 +57,13 @@ func unsafeExtendedPrecMul*(hi, lo: var Ct[uint64], a, b: Ct[uint64]) {.inline.} else: asm_x86_64_extMul(T(hi), T(lo), T(a), T(b)) +import strutils + func unsafeExtendedPrecMul*(hi, lo: var Ct[uint32], a, b: Ct[uint32]) {.inline.}= ## Extended precision multiplication uint32 * uint32 --> uint32 let extMul = uint64(a) * uint64(b) hi = (Ct[uint32])(extMul shr 32) - lo = (Ct[uint32])(extMul and 31) + lo = (Ct[uint32])(extMul and ((1'u64 shl 32) - 1)) func asm_x86_64_div2n1n(q, r: var uint64, n_hi, n_lo, d: uint64) {.inline.}= ## Division uint128 by uint64