feature. See also
. The project being documented here (as the example) is the Zig library itself.
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
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]);
}
}