Zig 0.17.0-dev (Split by item)

This is an example of documentation generated by ZigDoc, an alternative to Zig's built-in Auto Doc feature. See also examples in other modes/formats. The project being documented here (as the example) is the Zig library itself.

hashManySimd

blake3.hashManySimd
fn hashManySimd(
    inputs: [][*]const u8,
    num_inputs: usize,
    blocks: usize,
    key: [8]u32,
    counter: u64,
    increment_counter: bool,
    flags: Flags,
    flags_start: Flags,
    flags_end: Flags,
    out: []u8,
) void

File

lib/std/crypto/blake3.zig:490

Code

fn hashManySimd(
    inputs: [][*]const u8,
    num_inputs: usize,
    blocks: usize,
    key: [8]u32,
    counter: u64,
    increment_counter: bool,
    flags: Flags,
    flags_start: Flags,
    flags_end: Flags,
    out: []u8,
) void {
    var remaining = num_inputs;
    var inp = inputs.ptr;
    var out_ptr = out.ptr;
    var cnt = counter;

    if (simd_degree >= 16) {
        while (remaining >= 16) {
            const sixteen_inputs = [16][*]const u8{
                inp[0],  inp[1],  inp[2],  inp[3],
                inp[4],  inp[5],  inp[6],  inp[7],
                inp[8],  inp[9],  inp[10], inp[11],
                inp[12], inp[13], inp[14], inp[15],
            };

            var simd_out: [16 * Blake3.digest_length]u8 = undefined;
            hashVec(Vec16, 16, sixteen_inputs, blocks, key, cnt, increment_counter, flags, flags_start, flags_end, &simd_out);

            @memcpy(out_ptr[0 .. 16 * Blake3.digest_length], &simd_out);

            if (increment_counter) cnt += 16;
            inp += 16;
            remaining -= 16;
            out_ptr += 16 * Blake3.digest_length;
        }
    }

    if (simd_degree >= 8) {
        while (remaining >= 8) {
            const eight_inputs = [8][*]const u8{
                inp[0], inp[1], inp[2], inp[3],
                inp[4], inp[5], inp[6], inp[7],
            };

            var simd_out: [8 * Blake3.digest_length]u8 = undefined;
            hashVec(Vec8, 8, eight_inputs, blocks, key, cnt, increment_counter, flags, flags_start, flags_end, &simd_out);

            @memcpy(out_ptr[0 .. 8 * Blake3.digest_length], &simd_out);

            if (increment_counter) cnt += 8;
            inp += 8;
            remaining -= 8;
            out_ptr += 8 * Blake3.digest_length;
        }
    }

    if (simd_degree >= 4) {
        while (remaining >= 4) {
            const four_inputs = [4][*]const u8{
                inp[0],
                inp[1],
                inp[2],
                inp[3],
            };

            var simd_out: [4 * Blake3.digest_length]u8 = undefined;
            hashVec(Vec4, 4, four_inputs, blocks, key, cnt, increment_counter, flags, flags_start, flags_end, &simd_out);

            @memcpy(out_ptr[0 .. 4 * Blake3.digest_length], &simd_out);

            if (increment_counter) cnt += 4;
            inp += 4;
            remaining -= 4;
            out_ptr += 4 * Blake3.digest_length;
        }
    }

    if (remaining > 0) {
        hashManyPortable(inp[0..remaining], remaining, blocks, key, cnt, increment_counter, flags, flags_start, flags_end, out_ptr[0 .. remaining * Blake3.digest_length]);
    }
}