Skip to documentation
SLOP

tiny.simd.unroll

Reference tiny.simd unroll

Defined in unroller.

Called byCallstest sourcelib.simd.src.unrollertest: Highway unroller handles small ...test sourcelib.simd.src.unrollertest: Highway unroller invokes hooks ...private sourcelib.simd.src.unrollerverifyConvertprivate sourcelib.simd.src.unrollerverifyDotAndMinprivate sourcelib.simd.src.unrollerverifyFindprivate sourcelib.simd.src.unrollerloadprivate sourcelib.simd.src.unrollermaskLoadprivate sourcelib.simd.src.unrollermaskStoreprivate sourcelib.simd.src.unrollerpointeeprivate sourcelib.simd.src.unrollerreduceFinal+5 moreunrollerunroll
Static calls · unresolved targets: 0 · external targets: 1.

Source

Source: lib/simd/src/unroller.zig:226

zig
pub fn unroll(unit: anytype, input: anytype, output: anytype) void {    const Unit = pointee(@TypeOf(unit));    const Base = unitBase(Unit, 1);    if (!@hasDecl(Unit, "func")) @compileError("unroller unit must declare func");    const input_slice: []const Base.Input = input;    const output_slice: []Base.Output = output;    const lane_count = Base.actual_lanes;    std.debug.assert(input_slice.len <= std.math.maxInt(isize));    var x0 = x0Init(Unit, Base, unit);    var y = yInit(Unit, Base, unit);    var index: usize = 0;    if (input_slice.len < lane_count) {        const count: isize = @intCast(input_slice.len);        x0 = maskLoad(Unit, Base, unit, 0, input_slice, count);        y = unit.func(0, x0, y);        _ = maskStore(Unit, Base, unit, 0, output_slice, y, count);        _ = reduceFinal(Unit, Base, unit, y, output_slice);        return;    }    if (input_slice.len > 4 * lane_count) {        var x01 = x0Init(Unit, Base, unit);        var y1 = yInit(Unit, Base, unit);        var x02 = x0Init(Unit, Base, unit);        var y2 = yInit(Unit, Base, unit);        var x03 = x0Init(Unit, Base, unit);        var y3 = yInit(Unit, Base, unit);        while (index + 4 * lane_count <= input_slice.len) {            x0 = load(Unit, Base, unit, @intCast(index), input_slice);            x01 = load(Unit, Base, unit, @intCast(index + lane_count), input_slice);            x02 = load(Unit, Base, unit, @intCast(index + 2 * lane_count), input_slice);            x03 = load(Unit, Base, unit, @intCast(index + 3 * lane_count), input_slice);            y = unit.func(@intCast(index), x0, y);            y1 = unit.func(@intCast(index + lane_count), x01, y1);            y2 = unit.func(@intCast(index + 2 * lane_count), x02, y2);            y3 = unit.func(@intCast(index + 3 * lane_count), x03, y3);            if (!storeAndShortCircuit(Unit, Base, unit, @intCast(index), output_slice, y)) return;            index += lane_count;            if (!storeAndShortCircuit(Unit, Base, unit, @intCast(index), output_slice, y1)) return;            index += lane_count;            if (!storeAndShortCircuit(Unit, Base, unit, @intCast(index), output_slice, y2)) return;            index += lane_count;            if (!storeAndShortCircuit(Unit, Base, unit, @intCast(index), output_slice, y3)) return;            index += lane_count;        }        y = reduceUnrolled(Unit, Base, unit, y3, y2, y1, y);    }    while (index + lane_count <= input_slice.len) : (index += lane_count) {        x0 = load(Unit, Base, unit, @intCast(index), input_slice);        y = unit.func(@intCast(index), x0, y);        if (!storeAndShortCircuit(Unit, Base, unit, @intCast(index), output_slice, y)) return;    }    if (index != input_slice.len) {        const tail_index = input_slice.len - lane_count;        const places = @as(isize, @intCast(index)) - @as(isize, @intCast(input_slice.len));        x0 = maskLoad(Unit, Base, unit, @intCast(tail_index), input_slice, places);        y = unit.func(@intCast(tail_index), x0, y);        _ = maskStore(Unit, Base, unit, @intCast(tail_index), output_slice, y, places);    }    _ = reduceFinal(Unit, Base, unit, y, output_slice);}

Source: lib/simd/src/root.zig:535

zig
pub const unroll = unroller.unroll;

Complete call list

10 direct calls.

Audit

Definitions1
Public names2
Members0
Version26.7.0
Revisiondaab053ee433