Skip to documentation
SLOP

tiny.simd.unroll2

Reference tiny.simd unroll2

Defined in unroller.

Called byCallsprivate sourcelib.simd.src.unrollerverifyDotAndMinprivate sourcelib.simd.src.unrollerload0private sourcelib.simd.src.unrollerload1private sourcelib.simd.src.unrollermaskLoad0private sourcelib.simd.src.unrollermaskLoad1private sourcelib.simd.src.unrollermaskStore+8 moreunrollerunroll2
Static calls · unresolved targets: 0 · external targets: 1.

Source

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

zig
pub fn unroll2(unit: anytype, input0: anytype, input1: anytype, output: anytype) void {    const Unit = pointee(@TypeOf(unit));    const Base = unitBase(Unit, 2);    if (!@hasDecl(Unit, "func")) @compileError("two-input unroller unit must declare func");    const input0_slice: []const Base.Input0 = input0;    const input1_slice: []const Base.Input1 = input1;    const output_slice: []Base.Output = output;    const lane_count = Base.actual_lanes;    std.debug.assert(input0_slice.len == input1_slice.len);    std.debug.assert(input0_slice.len <= std.math.maxInt(isize));    var x0 = x0Init2(Unit, Base, unit);    var x1 = x1Init2(Unit, Base, unit);    var y = yInit(Unit, Base, unit);    var index: usize = 0;    if (input0_slice.len < lane_count) {        const count: isize = @intCast(input0_slice.len);        x0 = maskLoad0(Unit, Base, unit, 0, input0_slice, count);        x1 = maskLoad1(Unit, Base, unit, 0, input1_slice, count);        y = unit.func(0, x0, x1, y);        _ = maskStore(Unit, Base, unit, 0, output_slice, y, count);        _ = reduceFinal(Unit, Base, unit, y, output_slice);        return;    }    if (input0_slice.len > 4 * lane_count) {        var x01 = x0Init2(Unit, Base, unit);        var x11 = x1Init2(Unit, Base, unit);        var y1 = yInit(Unit, Base, unit);        var x02 = x0Init2(Unit, Base, unit);        var x12 = x1Init2(Unit, Base, unit);        var y2 = yInit(Unit, Base, unit);        var x03 = x0Init2(Unit, Base, unit);        var x13 = x1Init2(Unit, Base, unit);        var y3 = yInit(Unit, Base, unit);        while (index + 4 * lane_count <= input0_slice.len) {            x0 = load0(Unit, Base, unit, @intCast(index), input0_slice);            x1 = load1(Unit, Base, unit, @intCast(index), input1_slice);            x01 = load0(Unit, Base, unit, @intCast(index + lane_count), input0_slice);            x11 = load1(Unit, Base, unit, @intCast(index + lane_count), input1_slice);            x02 = load0(Unit, Base, unit, @intCast(index + 2 * lane_count), input0_slice);            x12 = load1(Unit, Base, unit, @intCast(index + 2 * lane_count), input1_slice);            x03 = load0(Unit, Base, unit, @intCast(index + 3 * lane_count), input0_slice);            x13 = load1(Unit, Base, unit, @intCast(index + 3 * lane_count), input1_slice);            y = unit.func(@intCast(index), x0, x1, y);            y1 = unit.func(@intCast(index + lane_count), x01, x11, y1);            y2 = unit.func(@intCast(index + 2 * lane_count), x02, x12, y2);            y3 = unit.func(@intCast(index + 3 * lane_count), x03, x13, 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 <= input0_slice.len) : (index += lane_count) {        x0 = load0(Unit, Base, unit, @intCast(index), input0_slice);        x1 = load1(Unit, Base, unit, @intCast(index), input1_slice);        y = unit.func(@intCast(index), x0, x1, y);        if (!storeAndShortCircuit(Unit, Base, unit, @intCast(index), output_slice, y)) return;    }    if (index != input0_slice.len) {        const tail_index = input0_slice.len - lane_count;        const places = @as(isize, @intCast(index)) - @as(isize, @intCast(input0_slice.len));        x0 = maskLoad0(Unit, Base, unit, @intCast(tail_index), input0_slice, places);        x1 = maskLoad1(Unit, Base, unit, @intCast(tail_index), input1_slice, places);        y = unit.func(@intCast(tail_index), x0, x1, 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:536

zig
pub const unroll2 = unroller.unroll2;

Complete call list

13 direct calls.

Audit

Definitions1
Public names2
Members0
Version26.7.0
Revisiondaab053ee433