def double.of_f32bits

bendonnect-rpc@0.1.0.0 · src/pb.bend:320

import bendonnect-rpc@0.1.0.0/src/pb.bend as Pb
import Base
import bend-kit-protobuf@0.1.0.0/protobuf.bend as Pb

320# IEEE binary32 bits -> binary64 bits (exact).
321def double.of_f32bits(+b: U32) -> Pb.Word64:
322  +s = ((b >> 31n) << 31n : U32)
323  +e = ((b >> 23n) .&. 255 : U32)
324  +m = (b .&. 8388607 : U32)
325  +p = msb(m)
326  +sub = word64.shl(Pb.Word64{0, (m - (1 << U32.to_nat(p)) : U32)}, (52 - p : U32))
327  +mh = (m >> 3n : U32)
328  +ml = ((m .&. 7) << 29n : U32)
329  +nh = (s .|. ((e + 896) << 20n) .|. mh : U32)
330  +sh = (s .|. 2146435072 .|. mh : U32)
331  +uh = (s .|. ((p + 874) << 20n) .|. word64.hi(sub) : U32)
332  Pb.Word64{
333    Bool.pick(U32, U32.is_eq(e, 255), sh, Bool.pick(U32, U32.is_zero(e), Bool.pick(U32, U32.is_zero(m), s, uh), nh)),
334    Bool.pick(U32, U32.is_zero(e), Bool.pick(U32, U32.is_zero(m), 0, word64.lo(sub)), ml)}

Uses (16)

Used by (1)