Barretenberg
The ZK-SNARK library at the core of Aztec
Loading...
Searching...
No Matches
fold_stride2.hpp
Go to the documentation of this file.
1#pragma once
2
6
7#include <cstddef>
8
9namespace bb {
10
40template <typename Fr>
42 const Polynomial<Fr>& src, Polynomial<Fr>& dst, const size_t begin, const size_t end, const Fr& challenge)
43{
44 size_t k = begin;
45#if defined(__wasm_simd128__)
46 if constexpr (simd_supported_v<Fr>) {
47 constexpr size_t WIDTH = VECTOR_FIELD_WIDTH;
49 const Vec challenge_vec = Vec::broadcast(challenge);
50 for (; k + WIDTH <= end; k += WIDTH) {
51 const Vec even = Vec::from_lanes([&](size_t lane) { return src[2 * (k + lane)]; });
52 const Vec odd = Vec::from_lanes([&](size_t lane) { return src[2 * (k + lane) + 1]; });
53 dst[ContiguousVectorIndex<WIDTH>{ k }] = even + (odd - even) * challenge_vec;
54 }
55 }
56#endif
57 for (; k < end; ++k) {
58 const Fr even = src[2 * k];
59 dst[ScalarIndex{ k }] = even + challenge * (src[2 * k + 1] - even);
60 }
61}
62
63} // namespace bb
Entry point for Barretenberg command-line interface.
Definition api.hpp:5
void fold_stride2(const Polynomial< Fr > &src, Polynomial< Fr > &dst, const size_t begin, const size_t end, const Fr &challenge)
Stride-2 linear-interpolation fold: dst[k] = src[2k] + challenge * (src[2k+1] - src[2k]) for every ou...
constexpr size_t VECTOR_FIELD_WIDTH
static VectorField from_lanes(const Fn &value_at) noexcept
static VectorField broadcast(const Field &s) noexcept