Skip to content

Commit 2b718de

Browse files
fcarreiroAztecBot
authored and
AztecBot
committed
feat(avm): get_row optimization - 25x faster logderiv inv (#11605)
Proving times (VM1) on 16 cores, 850+ columns, dozens of lookups, bulk_test. ``` ** Before ** prove/all_ms: 92606 prove/execute_log_derivative_inverse_round_ms: 21544 ** After ** prove/all_ms: 73404 prove/execute_log_derivative_inverse_round_ms: 839 ``` No change in sumcheck time. For reviewing, you can focus on the templates. An explanation follows (with history). --- This PR is about the `get_row()` method on the prover polynomials of a given flavor. This method is used by the [logderivative library](https://github.com/AztecProtocol/aztec-packages/blob/master/barretenberg/cpp/src/barretenberg/honk/proof_system/logderivative_library.hpp#L36) to compute logderivative inverses. Originally, `get_row()` was supposed to be debug only but it ended up used in the library above. To be fair, the reason is as follows: the `accumulate` function of relations (including lookups and perms), takes in a row (or something that looks like it!). However, by the time that you have to compute inverses, you don't have your row-based trace anymore, you only have the prover polynomials which are column-based. So, you need to extract a row from columns. The following sections explore a way to make things run faster, without completely breaking the `get_row()` expectations from the caller. That is, that it behaves like a row (you can do `.column` and it will return the field for it). # Phase 1: `AllEntities<FF>` So far so good. Normal [BB flavors](https://github.com/AztecProtocol/aztec-packages/blob/master/barretenberg/cpp/src/barretenberg/stdlib_circuit_builders/mega_flavor.hpp#L366) make `get_row()` return `AllEntities<FF>` which is literally a row with as many fields copied as columns you have. Note that the copy is done even for the columns that may not get used later in the accumulation of a relation, or in the computation of inverses. This might be ok if you have 10 columns and a handful of lookups, but in our case we have dozens of lookups and 850+ columns (we estimate 3500 by completion of the AVM). # Phase 2: something like `AllEntities<const FF&>` As a quick fix you might think you can copy references instead and use `AllEntities<const FF&>`. Well you can't, at least not the way you would use `AllEntities<FF>`. Since the class would have members that are references, you need to define a constructor that initializes them all, maybe from a `RefArray` of sorts. The problem is because the class `AllEntities` is defined as inheriting from other classes, instead of being "flat". This, for us, added an immense amount of codegen. See `AllConstRefValues` [here](https://github.com/AztecProtocol/aztec-packages/blob/2f05dc02fe7b147c7cd6fc235134279dbf332c08/barretenberg/cpp/src/barretenberg/vm/avm/generated/flavor.cpp). This improvement was introduced in [this PR](AztecProtocol/aztec-packages#7419) and it gave a **20x** speed improvement over `AllEntities<FF>`. The code itself was then improved in [this PR](AztecProtocol/aztec-packages#11504) by using a flat class and some fold expressions. # Phase 3: Getters Ideally what we'd want is for `get_row()` to return something like this: ``` template <typename Polynomials> class PolynomialEntitiesAtFixedRow { public: PolynomialEntitiesAtFixedRow(const size_t row_idx, const Polynomials& pp) : row_idx(row_idx) , pp(pp) {} // what here? private: const size_t row_idx; const Polynomials& pp; }; ``` such that if you do `row.column` it would secretly do `pp.column[row_idx]` instead. Unfortunately, you cannot override the `.` operator, and certainly not like this. Instead, we compromise. I added a macro to generate getters `_column()` for every column, which do exactly that. Then I changed the lookups and permutation codegen to use that (i.e., `in._column()` instead of `in.column`). Note that we _only_ use these getters in lookups and perm, not in the main relations. However, we are not done. The perms and lookups code that we changed is also called by `accumulate` when doing sumcheck, and `AllEntities` does not provide those getters so it will not compile. Well, we add them, and we are done. This results in a **25x** time improvement in calculating logderiv inverses, amounting to a total of **500x** better than baseline. # Conclusion Some thing in BB are not thought for a VM :) I wonder if theres any such improvement lurking in sumcheck? :)
1 parent 145e7da commit 2b718de

29 files changed

+1409
-1336
lines changed

cpp/src/barretenberg/vm/avm/generated/circuit_builder.cpp

+2-2
Original file line numberDiff line numberDiff line change
@@ -860,7 +860,7 @@ bool AvmCircuitBuilder::check_circuit() const
860860

861861
std::array<bool, result.size()> subrelation_failed = { false };
862862
for (size_t r = 0; r < num_rows; ++r) {
863-
Relation::accumulate(result, polys.get_row(r), {}, 1);
863+
Relation::accumulate(result, polys.get_standard_row(r), {}, 1);
864864
for (size_t j = 0; j < result.size(); ++j) {
865865
if (!subrelation_failed[j] && result[j] != 0) {
866866
signal_error(format("Relation ",
@@ -891,7 +891,7 @@ bool AvmCircuitBuilder::check_circuit() const
891891
r = 0;
892892
}
893893
for (size_t r = 0; r < num_rows; ++r) {
894-
Relation::accumulate(lookup_result, polys.get_row(r), params, 1);
894+
Relation::accumulate(lookup_result, polys.get_standard_row(r), params, 1);
895895
}
896896
for (auto r : lookup_result) {
897897
if (r != 0) {

cpp/src/barretenberg/vm/avm/generated/columns.hpp

+1
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ namespace bb::avm {
1616
#define AVM_TO_BE_SHIFTED(e) e.binary_acc_ia, e.binary_acc_ib, e.binary_acc_ic, e.binary_mem_tag_ctr, e.binary_op_id, e.cmp_a_hi, e.cmp_a_lo, e.cmp_b_hi, e.cmp_b_lo, e.cmp_cmp_rng_ctr, e.cmp_op_gt, e.cmp_p_sub_a_hi, e.cmp_p_sub_a_lo, e.cmp_p_sub_b_hi, e.cmp_p_sub_b_lo, e.cmp_sel_rng_chk, e.main_da_gas_remaining, e.main_l2_gas_remaining, e.main_pc, e.main_sel_execution_end, e.main_sel_execution_row, e.mem_glob_addr, e.mem_rw, e.mem_sel_mem, e.mem_tag, e.mem_tsp, e.mem_val, e.merkle_tree_leaf_index, e.merkle_tree_leaf_value, e.merkle_tree_path_len, e.poseidon2_full_a_0, e.poseidon2_full_a_1, e.poseidon2_full_a_2, e.poseidon2_full_a_3, e.poseidon2_full_execute_poseidon_perm, e.poseidon2_full_input_0, e.poseidon2_full_input_1, e.poseidon2_full_input_2, e.poseidon2_full_num_perm_rounds_rem, e.poseidon2_full_sel_poseidon, e.poseidon2_full_start_poseidon, e.slice_addr, e.slice_clk, e.slice_cnt, e.slice_sel_cd_cpy, e.slice_sel_mem_active, e.slice_sel_return, e.slice_sel_start, e.slice_space_id
1717
#define AVM_ALL_ENTITIES AVM_PRECOMPUTED_ENTITIES, AVM_WIRE_ENTITIES, AVM_DERIVED_WITNESS_ENTITIES, AVM_SHIFTED_ENTITIES
1818
#define AVM_UNSHIFTED_ENTITIES AVM_PRECOMPUTED_ENTITIES, AVM_WIRE_ENTITIES, AVM_DERIVED_WITNESS_ENTITIES
19+
#define AVM_WITNESS_ENTITIES AVM_WIRE_ENTITIES, AVM_DERIVED_WITNESS_ENTITIES
1920

2021
#define AVM_TO_BE_SHIFTED_COLUMNS Column::binary_acc_ia, Column::binary_acc_ib, Column::binary_acc_ic, Column::binary_mem_tag_ctr, Column::binary_op_id, Column::cmp_a_hi, Column::cmp_a_lo, Column::cmp_b_hi, Column::cmp_b_lo, Column::cmp_cmp_rng_ctr, Column::cmp_op_gt, Column::cmp_p_sub_a_hi, Column::cmp_p_sub_a_lo, Column::cmp_p_sub_b_hi, Column::cmp_p_sub_b_lo, Column::cmp_sel_rng_chk, Column::main_da_gas_remaining, Column::main_l2_gas_remaining, Column::main_pc, Column::main_sel_execution_end, Column::main_sel_execution_row, Column::mem_glob_addr, Column::mem_rw, Column::mem_sel_mem, Column::mem_tag, Column::mem_tsp, Column::mem_val, Column::merkle_tree_leaf_index, Column::merkle_tree_leaf_value, Column::merkle_tree_path_len, Column::poseidon2_full_a_0, Column::poseidon2_full_a_1, Column::poseidon2_full_a_2, Column::poseidon2_full_a_3, Column::poseidon2_full_execute_poseidon_perm, Column::poseidon2_full_input_0, Column::poseidon2_full_input_1, Column::poseidon2_full_input_2, Column::poseidon2_full_num_perm_rounds_rem, Column::poseidon2_full_sel_poseidon, Column::poseidon2_full_start_poseidon, Column::slice_addr, Column::slice_clk, Column::slice_cnt, Column::slice_sel_cd_cpy, Column::slice_sel_mem_active, Column::slice_sel_return, Column::slice_sel_start, Column::slice_space_id
2122
#define AVM_SHIFTED_COLUMNS ColumnAndShifts::binary_acc_ia_shift, ColumnAndShifts::binary_acc_ib_shift, ColumnAndShifts::binary_acc_ic_shift, ColumnAndShifts::binary_mem_tag_ctr_shift, ColumnAndShifts::binary_op_id_shift, ColumnAndShifts::cmp_a_hi_shift, ColumnAndShifts::cmp_a_lo_shift, ColumnAndShifts::cmp_b_hi_shift, ColumnAndShifts::cmp_b_lo_shift, ColumnAndShifts::cmp_cmp_rng_ctr_shift, ColumnAndShifts::cmp_op_gt_shift, ColumnAndShifts::cmp_p_sub_a_hi_shift, ColumnAndShifts::cmp_p_sub_a_lo_shift, ColumnAndShifts::cmp_p_sub_b_hi_shift, ColumnAndShifts::cmp_p_sub_b_lo_shift, ColumnAndShifts::cmp_sel_rng_chk_shift, ColumnAndShifts::main_da_gas_remaining_shift, ColumnAndShifts::main_l2_gas_remaining_shift, ColumnAndShifts::main_pc_shift, ColumnAndShifts::main_sel_execution_end_shift, ColumnAndShifts::main_sel_execution_row_shift, ColumnAndShifts::mem_glob_addr_shift, ColumnAndShifts::mem_rw_shift, ColumnAndShifts::mem_sel_mem_shift, ColumnAndShifts::mem_tag_shift, ColumnAndShifts::mem_tsp_shift, ColumnAndShifts::mem_val_shift, ColumnAndShifts::merkle_tree_leaf_index_shift, ColumnAndShifts::merkle_tree_leaf_value_shift, ColumnAndShifts::merkle_tree_path_len_shift, ColumnAndShifts::poseidon2_full_a_0_shift, ColumnAndShifts::poseidon2_full_a_1_shift, ColumnAndShifts::poseidon2_full_a_2_shift, ColumnAndShifts::poseidon2_full_a_3_shift, ColumnAndShifts::poseidon2_full_execute_poseidon_perm_shift, ColumnAndShifts::poseidon2_full_input_0_shift, ColumnAndShifts::poseidon2_full_input_1_shift, ColumnAndShifts::poseidon2_full_input_2_shift, ColumnAndShifts::poseidon2_full_num_perm_rounds_rem_shift, ColumnAndShifts::poseidon2_full_sel_poseidon_shift, ColumnAndShifts::poseidon2_full_start_poseidon_shift, ColumnAndShifts::slice_addr_shift, ColumnAndShifts::slice_clk_shift, ColumnAndShifts::slice_cnt_shift, ColumnAndShifts::slice_sel_cd_cpy_shift, ColumnAndShifts::slice_sel_mem_active_shift, ColumnAndShifts::slice_sel_return_shift, ColumnAndShifts::slice_sel_start_shift, ColumnAndShifts::slice_space_id_shift

cpp/src/barretenberg/vm/avm/generated/flavor.hpp

+37-10
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
#include "barretenberg/transcript/transcript.hpp"
1414

1515
#include "barretenberg/vm/aztec_constants.hpp"
16+
#include "barretenberg/vm2/common/macros.hpp"
1617
#include "columns.hpp"
1718
#include "flavor_settings.hpp"
1819

@@ -52,6 +53,19 @@
5253
// Metaprogramming to concatenate tuple types.
5354
template <typename... input_t> using tuple_cat_t = decltype(std::tuple_cat(std::declval<input_t>()...));
5455

56+
// clang-format off
57+
// These getters are used to speedup logderivative inverses.
58+
// See https://github.com/AztecProtocol/aztec-packages/pull/11605/ for a full explanation.
59+
#define DEFAULT_GETTERS(ENTITY) \
60+
inline auto& _##ENTITY() { return ENTITY; } \
61+
inline auto& _##ENTITY() const { return ENTITY; }
62+
#define ROW_PROXY_GETTERS(ENTITY) \
63+
inline auto& _##ENTITY() { return pp.ENTITY[row_idx]; } \
64+
inline auto& _##ENTITY() const { return pp.ENTITY[row_idx]; }
65+
#define DEFINE_GETTERS(GETTER_MACRO, ENTITIES) \
66+
FOR_EACH(GETTER_MACRO, ENTITIES)
67+
// clang-format on
68+
5569
namespace bb::avm {
5670

5771
class AvmFlavor {
@@ -210,32 +224,29 @@ class AvmFlavor {
210224
"AVM circuit. In this case, modify AVM_VERIFICATION_LENGTH_IN_FIELDS \n"
211225
"in constants.nr accordingly.");
212226

213-
template <typename DataType_> class PrecomputedEntities : public PrecomputedEntitiesBase {
227+
template <typename DataType> class PrecomputedEntities : public PrecomputedEntitiesBase {
214228
public:
215-
using DataType = DataType_;
216-
217229
DEFINE_FLAVOR_MEMBERS(DataType, AVM_PRECOMPUTED_ENTITIES)
218-
219-
RefVector<DataType> get_selectors() { return get_all(); }
220-
RefVector<DataType> get_sigma_polynomials() { return {}; }
221-
RefVector<DataType> get_id_polynomials() { return {}; }
222-
RefVector<DataType> get_table_polynomials() { return {}; }
230+
DEFINE_GETTERS(DEFAULT_GETTERS, AVM_PRECOMPUTED_ENTITIES)
223231
};
224232

225233
private:
226234
template <typename DataType> class WireEntities {
227235
public:
228236
DEFINE_FLAVOR_MEMBERS(DataType, AVM_WIRE_ENTITIES)
237+
DEFINE_GETTERS(DEFAULT_GETTERS, AVM_WIRE_ENTITIES)
229238
};
230239

231240
template <typename DataType> class DerivedWitnessEntities {
232241
public:
233242
DEFINE_FLAVOR_MEMBERS(DataType, AVM_DERIVED_WITNESS_ENTITIES)
243+
DEFINE_GETTERS(DEFAULT_GETTERS, AVM_DERIVED_WITNESS_ENTITIES)
234244
};
235245

236246
template <typename DataType> class ShiftedEntities {
237247
public:
238248
DEFINE_FLAVOR_MEMBERS(DataType, AVM_SHIFTED_ENTITIES)
249+
DEFINE_GETTERS(DEFAULT_GETTERS, AVM_SHIFTED_ENTITIES)
239250
};
240251

241252
template <typename DataType, typename PrecomputedAndWitnessEntitiesSuperset>
@@ -341,12 +352,26 @@ class AvmFlavor {
341352
using Base::Base;
342353
};
343354

355+
// Only used by VM1 check_circuit. Remove.
344356
class AllConstRefValues {
345357
public:
346358
using BaseDataType = const FF;
347359
using DataType = BaseDataType&;
348-
349360
DEFINE_FLAVOR_MEMBERS(DataType, AVM_ALL_ENTITIES)
361+
DEFINE_GETTERS(DEFAULT_GETTERS, AVM_ALL_ENTITIES)
362+
};
363+
364+
template <typename Polynomials> class PolynomialEntitiesAtFixedRow {
365+
public:
366+
PolynomialEntitiesAtFixedRow(const size_t row_idx, const Polynomials& pp)
367+
: row_idx(row_idx)
368+
, pp(pp)
369+
{}
370+
DEFINE_GETTERS(ROW_PROXY_GETTERS, AVM_ALL_ENTITIES)
371+
372+
private:
373+
const size_t row_idx;
374+
const Polynomials& pp;
350375
};
351376

352377
/**
@@ -365,12 +390,14 @@ class AvmFlavor {
365390
ProverPolynomials(ProvingKey& proving_key);
366391

367392
size_t get_polynomial_size() const { return main_kernel_inputs.size(); }
368-
AllConstRefValues get_row(size_t row_idx) const
393+
// This is only used in VM1 check_circuit. Remove.
394+
AllConstRefValues get_standard_row(size_t row_idx) const
369395
{
370396
return [row_idx](auto&... entities) -> AllConstRefValues {
371397
return { entities[row_idx]... };
372398
}(AVM_ALL_ENTITIES);
373399
}
400+
auto get_row(size_t row_idx) const { return PolynomialEntitiesAtFixedRow<ProverPolynomials>(row_idx, *this); }
374401
};
375402

376403
class PartiallyEvaluatedMultivariates : public AllEntities<Polynomial> {

cpp/src/barretenberg/vm/avm/generated/relations/lookups_alu.hpp

+22-22
Original file line numberDiff line numberDiff line change
@@ -34,15 +34,15 @@ class lookup_pow_2_0_lookup_settings {
3434

3535
template <typename AllEntities> static inline auto inverse_polynomial_is_computed_at_row(const AllEntities& in)
3636
{
37-
return (in.alu_sel_shift_which == 1 || in.main_sel_rng_8 == 1);
37+
return (in._alu_sel_shift_which() == 1 || in._main_sel_rng_8() == 1);
3838
}
3939

4040
template <typename Accumulator, typename AllEntities>
4141
static inline auto compute_inverse_exists(const AllEntities& in)
4242
{
4343
using View = typename Accumulator::View;
44-
const auto is_operation = View(in.alu_sel_shift_which);
45-
const auto is_table_entry = View(in.main_sel_rng_8);
44+
const auto is_operation = View(in._alu_sel_shift_which());
45+
const auto is_table_entry = View(in._main_sel_rng_8());
4646
return (is_operation + is_table_entry - is_operation * is_table_entry);
4747
}
4848

@@ -58,14 +58,14 @@ class lookup_pow_2_0_lookup_settings {
5858

5959
template <typename AllEntities> static inline auto get_entities(AllEntities&& in)
6060
{
61-
return std::forward_as_tuple(in.lookup_pow_2_0_inv,
62-
in.lookup_pow_2_0_counts,
63-
in.alu_sel_shift_which,
64-
in.main_sel_rng_8,
65-
in.alu_ib,
66-
in.alu_b_pow,
67-
in.main_clk,
68-
in.powers_power_of_2);
61+
return std::forward_as_tuple(in._lookup_pow_2_0_inv(),
62+
in._lookup_pow_2_0_counts(),
63+
in._alu_sel_shift_which(),
64+
in._main_sel_rng_8(),
65+
in._alu_ib(),
66+
in._alu_b_pow(),
67+
in._main_clk(),
68+
in._powers_power_of_2());
6969
}
7070
};
7171

@@ -101,15 +101,15 @@ class lookup_pow_2_1_lookup_settings {
101101

102102
template <typename AllEntities> static inline auto inverse_polynomial_is_computed_at_row(const AllEntities& in)
103103
{
104-
return (in.alu_sel_shift_which == 1 || in.main_sel_rng_8 == 1);
104+
return (in._alu_sel_shift_which() == 1 || in._main_sel_rng_8() == 1);
105105
}
106106

107107
template <typename Accumulator, typename AllEntities>
108108
static inline auto compute_inverse_exists(const AllEntities& in)
109109
{
110110
using View = typename Accumulator::View;
111-
const auto is_operation = View(in.alu_sel_shift_which);
112-
const auto is_table_entry = View(in.main_sel_rng_8);
111+
const auto is_operation = View(in._alu_sel_shift_which());
112+
const auto is_table_entry = View(in._main_sel_rng_8());
113113
return (is_operation + is_table_entry - is_operation * is_table_entry);
114114
}
115115

@@ -125,14 +125,14 @@ class lookup_pow_2_1_lookup_settings {
125125

126126
template <typename AllEntities> static inline auto get_entities(AllEntities&& in)
127127
{
128-
return std::forward_as_tuple(in.lookup_pow_2_1_inv,
129-
in.lookup_pow_2_1_counts,
130-
in.alu_sel_shift_which,
131-
in.main_sel_rng_8,
132-
in.alu_max_bits_sub_b_bits,
133-
in.alu_max_bits_sub_b_pow,
134-
in.main_clk,
135-
in.powers_power_of_2);
128+
return std::forward_as_tuple(in._lookup_pow_2_1_inv(),
129+
in._lookup_pow_2_1_counts(),
130+
in._alu_sel_shift_which(),
131+
in._main_sel_rng_8(),
132+
in._alu_max_bits_sub_b_bits(),
133+
in._alu_max_bits_sub_b_pow(),
134+
in._main_clk(),
135+
in._powers_power_of_2());
136136
}
137137
};
138138

cpp/src/barretenberg/vm/avm/generated/relations/lookups_binary.hpp

+26-26
Original file line numberDiff line numberDiff line change
@@ -35,15 +35,15 @@ class lookup_byte_lengths_lookup_settings {
3535

3636
template <typename AllEntities> static inline auto inverse_polynomial_is_computed_at_row(const AllEntities& in)
3737
{
38-
return (in.binary_start == 1 || in.byte_lookup_sel_bin == 1);
38+
return (in._binary_start() == 1 || in._byte_lookup_sel_bin() == 1);
3939
}
4040

4141
template <typename Accumulator, typename AllEntities>
4242
static inline auto compute_inverse_exists(const AllEntities& in)
4343
{
4444
using View = typename Accumulator::View;
45-
const auto is_operation = View(in.binary_start);
46-
const auto is_table_entry = View(in.byte_lookup_sel_bin);
45+
const auto is_operation = View(in._binary_start());
46+
const auto is_table_entry = View(in._byte_lookup_sel_bin());
4747
return (is_operation + is_table_entry - is_operation * is_table_entry);
4848
}
4949

@@ -59,14 +59,14 @@ class lookup_byte_lengths_lookup_settings {
5959

6060
template <typename AllEntities> static inline auto get_entities(AllEntities&& in)
6161
{
62-
return std::forward_as_tuple(in.lookup_byte_lengths_inv,
63-
in.lookup_byte_lengths_counts,
64-
in.binary_start,
65-
in.byte_lookup_sel_bin,
66-
in.binary_in_tag,
67-
in.binary_mem_tag_ctr,
68-
in.byte_lookup_table_in_tags,
69-
in.byte_lookup_table_byte_lengths);
62+
return std::forward_as_tuple(in._lookup_byte_lengths_inv(),
63+
in._lookup_byte_lengths_counts(),
64+
in._binary_start(),
65+
in._byte_lookup_sel_bin(),
66+
in._binary_in_tag(),
67+
in._binary_mem_tag_ctr(),
68+
in._byte_lookup_table_in_tags(),
69+
in._byte_lookup_table_byte_lengths());
7070
}
7171
};
7272

@@ -105,15 +105,15 @@ class lookup_byte_operations_lookup_settings {
105105

106106
template <typename AllEntities> static inline auto inverse_polynomial_is_computed_at_row(const AllEntities& in)
107107
{
108-
return (in.binary_sel_bin == 1 || in.byte_lookup_sel_bin == 1);
108+
return (in._binary_sel_bin() == 1 || in._byte_lookup_sel_bin() == 1);
109109
}
110110

111111
template <typename Accumulator, typename AllEntities>
112112
static inline auto compute_inverse_exists(const AllEntities& in)
113113
{
114114
using View = typename Accumulator::View;
115-
const auto is_operation = View(in.binary_sel_bin);
116-
const auto is_table_entry = View(in.byte_lookup_sel_bin);
115+
const auto is_operation = View(in._binary_sel_bin());
116+
const auto is_table_entry = View(in._byte_lookup_sel_bin());
117117
return (is_operation + is_table_entry - is_operation * is_table_entry);
118118
}
119119

@@ -129,18 +129,18 @@ class lookup_byte_operations_lookup_settings {
129129

130130
template <typename AllEntities> static inline auto get_entities(AllEntities&& in)
131131
{
132-
return std::forward_as_tuple(in.lookup_byte_operations_inv,
133-
in.lookup_byte_operations_counts,
134-
in.binary_sel_bin,
135-
in.byte_lookup_sel_bin,
136-
in.binary_op_id,
137-
in.binary_ia_bytes,
138-
in.binary_ib_bytes,
139-
in.binary_ic_bytes,
140-
in.byte_lookup_table_op_id,
141-
in.byte_lookup_table_input_a,
142-
in.byte_lookup_table_input_b,
143-
in.byte_lookup_table_output);
132+
return std::forward_as_tuple(in._lookup_byte_operations_inv(),
133+
in._lookup_byte_operations_counts(),
134+
in._binary_sel_bin(),
135+
in._byte_lookup_sel_bin(),
136+
in._binary_op_id(),
137+
in._binary_ia_bytes(),
138+
in._binary_ib_bytes(),
139+
in._binary_ic_bytes(),
140+
in._byte_lookup_table_op_id(),
141+
in._byte_lookup_table_input_a(),
142+
in._byte_lookup_table_input_b(),
143+
in._byte_lookup_table_output());
144144
}
145145
};
146146

0 commit comments

Comments
 (0)