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: *Mutable
a: Const
b: Const
allocator: ?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);
}