Commit d8a32a96 authored by Clemens Backes's avatar Clemens Backes Committed by Commit Bot

[wasm] Split decoding into individual functions

Instead of having a loop with one big switch for handling the different
opcodes, split the decoding into one handler per opcode and call them
via an opcode handler table.
The compiler will generate similar code for this new approach (the big
switch is also compiled into a table lookup and an indirect jump). The
main difference is that it's now calls instead of jumps. This has a
slight performance impact, but allows to look at the decoding logic of
individual opcodes in isolation and see optimization opportunities much
easier. It also allows spot very easily in profilers on which opcodes
most time is spent.

The different opcode handlers are still implemented via the same switch
as before, but since the opcode is a template argument (hence static)
the compiler will eliminate the switch and generate the small handlers
we want.
I plan to actually remove the switch and break up the big generic
{DecodeOp} method into one method per opcode.

R=thibaudm@chromium.org

Bug: v8:10576
Change-Id: Ic2c1e2fe5e98df52a7079ace305cf77340dcbf35
Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/2249664Reviewed-by: 's avatarThibaud Michaud <thibaudm@chromium.org>
Commit-Queue: Clemens Backes <clemensb@chromium.org>
Cr-Commit-Position: refs/heads/master@{#68403}
parent 09fd7c71
......@@ -23,6 +23,12 @@ constexpr inline auto make_array_helper(Function f,
return {{f(Indexes)...}};
}
template <template <size_t> class Value, std::size_t... Indexes>
constexpr inline auto make_array_helper(std::index_sequence<Indexes...>)
-> std::array<typename Value<0>::value_type, sizeof...(Indexes)> {
return {{Value<Indexes>()...}};
}
} // namespace detail
// base::make_array: Create an array of fixed length, initialized by a function.
......@@ -36,6 +42,13 @@ constexpr auto make_array(Function f) {
return detail::make_array_helper(f, std::make_index_sequence<Size>{});
}
// The same as above, but taking a template instead of a function to generate
// the values for the array.
template <std::size_t Size, template <size_t> class Value>
constexpr auto make_array() {
return detail::make_array_helper<Value>(std::make_index_sequence<Size>{});
}
// Helper to determine how to pass values: Pass scalars and arrays by value,
// others by const reference (even if it was a non-const ref before; this is
// disallowed by the style guide anyway).
......
This diff is collapsed.
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment