- for (size_t i = 0; i < ARRAY_SIZE(decoders); ++i) {
- if (decoders[i].guard_func(ctx->cfg_ptr) &&
- decoders[i].decode_func(ctx, opcode32)) {
+ for (size_t i = 0; i < decoder_table_size; ++i) {
+ if (ctx->decoder[i](ctx, opcode32)) {
return;
By the way, you're adding layers of pointer chasing, so I suspect you'll find all of this
is a wash or worse, performance-wise.
Indeed, since some of the predicates are trivial, going the other way might help: allow
everything to be inlined:
if (decode_insn32(...)) {
return;
}
if (has_xthead_p(...) && decode_xthead(...)) {
return;
}
...
Even if there are 10 entries here, so what? All of the code has to be compiled into QEMU.
You're not going to somehow add truly dynamic code that you've loaded from a module.
You could perhaps streamline predicates such as has_xthead_p to not test 11 variables by
adding an artificial "ext_xthead_any" configuration entry that is the sum of all of those.
r~