Function mulNoAlias [src]

rma = a * b rma may not alias with a or b. a and b may alias with each other. Asserts the result fits in rma. An upper bound on the number of limbs needed by rma is given by a.limbs.len + b.limbs.len. If allocator is provided, it will be used for temporary storage to improve multiplication performance. error.OutOfMemory is handled with a fallback algorithm.

Prototype

pub fn mulNoAlias(rma: *Mutable, a: Const, b: Const, allocator: ?Allocator) void

Parameters

rma: *Mutablea: Constb: Constallocator: ?Allocator

Source

pub fn mulNoAlias(rma: *Mutable, a: Const, b: Const, allocator: ?Allocator) void { assert(rma.limbs.ptr != a.limbs.ptr); // illegal aliasing assert(rma.limbs.ptr != b.limbs.ptr); // illegal aliasing if (a.limbs.len == 1 and b.limbs.len == 1) { const ov = @mulWithOverflow(a.limbs[0], b.limbs[0]); rma.limbs[0] = ov[0]; if (ov[1] == 0) { rma.len = 1; rma.positive = (a.positive == b.positive); return; } } @memset(rma.limbs[0 .. a.limbs.len + b.limbs.len], 0); llmulacc(.add, allocator, rma.limbs, a.limbs, b.limbs); rma.normalize(a.limbs.len + b.limbs.len); rma.positive = (a.positive == b.positive); }