5#include "barretenberg/numeric/bitop/rotate.hpp"
10template <u
int64_t bits_per_slice, u
int64_t num_rotated_output_bits>
11inline std::array<barretenberg::fr, 2> get_xor_rotate_values_from_key(
const std::array<uint64_t, 2> key)
13 return { numeric::rotate64(key[0] ^ key[1], num_rotated_output_bits), 0ULL };
16template <u
int64_t bits_per_slice, u
int64_t num_rotated_output_bits>
17inline BasicTable generate_xor_rotate_table(BasicTableId
id,
const size_t table_index)
19 const uint64_t base = 1UL << bits_per_slice;
22 table.table_index = table_index;
23 table.size = base * base;
24 table.use_twin_keys =
true;
26 for (uint64_t i = 0; i < base; ++i) {
27 for (uint64_t j = 0; j < base; ++j) {
28 table.column_1.emplace_back(i);
29 table.column_2.emplace_back(j);
30 table.column_3.emplace_back(numeric::rotate64(i ^ j, num_rotated_output_bits));
34 table.get_values_from_key = &get_xor_rotate_values_from_key<bits_per_slice, num_rotated_output_bits>;
36 table.column_1_step_size = base;
37 table.column_2_step_size = base;
38 table.column_3_step_size = base;
43template <u
int64_t bits_per_slice, u
int64_t num_rotated_output_bits>
44inline std::array<barretenberg::fr, 2> get_and_rotate_values_from_key(
const std::array<uint64_t, 2> key)
46 return { numeric::rotate64(key[0] & key[1], num_rotated_output_bits), 0ULL };
49template <u
int64_t bits_per_slice, u
int64_t num_rotated_output_bits>
50inline BasicTable generate_and_rotate_table(BasicTableId
id,
const size_t table_index)
52 const uint64_t base = 1UL << bits_per_slice;
55 table.table_index = table_index;
56 table.size = base * base;
57 table.use_twin_keys =
true;
59 for (uint64_t i = 0; i < base; ++i) {
60 for (uint64_t j = 0; j < base; ++j) {
61 table.column_1.emplace_back(i);
62 table.column_2.emplace_back(j);
63 table.column_3.emplace_back(numeric::rotate64(i & j, num_rotated_output_bits));
67 table.get_values_from_key = &get_and_rotate_values_from_key<bits_per_slice, num_rotated_output_bits>;
69 table.column_1_step_size = base;
70 table.column_2_step_size = base;
71 table.column_3_step_size = base;
76inline MultiTable get_uint32_xor_table(
const MultiTableId
id = UINT32_XOR)
78 const size_t num_entries = (32 + 5) / 6;
79 const uint64_t base = 1 << 6;
80 MultiTable table(base, base, base, num_entries);
83 for (
size_t i = 0; i < num_entries; ++i) {
84 table.slice_sizes.emplace_back(base);
85 table.lookup_ids.emplace_back(UINT_XOR_ROTATE0);
86 table.get_table_values.emplace_back(&get_xor_rotate_values_from_key<6, 0>);
91inline MultiTable get_uint32_and_table(
const MultiTableId
id = UINT32_AND)
93 const size_t num_entries = (32 + 5) / 6;
94 const uint64_t base = 1 << 6;
95 MultiTable table(base, base, base, num_entries);
98 for (
size_t i = 0; i < num_entries; ++i) {
99 table.slice_sizes.emplace_back(base);
100 table.lookup_ids.emplace_back(UINT_AND_ROTATE0);
101 table.get_table_values.emplace_back(&get_and_rotate_values_from_key<6, 0>);