def cr.vm.mul

bend-osdev-crypto@0.1.0.0 · vmac.bend:60

import bend-osdev-crypto@0.1.0.0/vmac.bend as Vmac
import Base
import bend-osdev-word64@0.1.0.0/word64.bend as W

60# the 128-bit product of two 64-bit words
61def cr.vm.mul(+a: W.W64, +b: W.W64) -> CrU128:
62  +al = W.W64.lo(a)
63  +ah = W.W64.hi(a)
64  +bl = W.W64.lo(b)
65  +bh = W.W64.hi(b)
66  +p0 = W.W64.mul(cr.vm.w(al), cr.vm.w(bl))
67  +p1 = W.W64.mul(cr.vm.w(al), cr.vm.w(bh))
68  +p2 = W.W64.mul(cr.vm.w(ah), cr.vm.w(bl))
69  +p3 = W.W64.mul(cr.vm.w(ah), cr.vm.w(bh))
70  +mid = W.W64.add(p1, p2)
71  +lo = W.W64.add(p0, W.W64.shl(mid, 32n))
72  CrU128{W.W64.add(W.W64.add(p3, W.W64.shr(mid, 32n)), W.W64.add(W.W64.shl(cr.vm.carry(W.W64.is_lt(mid, p1)), 32n), cr.vm.carry(W.W64.is_lt(lo, p0)))), lo}

Uses (11)

Used by (4)