#include "builder.h" #include #include #define DECLARE_INSTR_TYPE(name) extern struct select_instr_type select_##name #define INSTR_TYPE_ENTRY(op, name) [MIE_INSTR_##op] = &select_##name DECLARE_INSTR_TYPE(alloca); DECLARE_INSTR_TYPE(add); DECLARE_INSTR_TYPE(sub); DECLARE_INSTR_TYPE(mul); DECLARE_INSTR_TYPE(div); DECLARE_INSTR_TYPE(load); DECLARE_INSTR_TYPE(store); static const struct select_instr_type *instr_types[] = { INSTR_TYPE_ENTRY(ALLOCA, alloca), INSTR_TYPE_ENTRY(ADD, add), INSTR_TYPE_ENTRY(SUB, sub), INSTR_TYPE_ENTRY(MUL, mul), INSTR_TYPE_ENTRY(DIV, div), INSTR_TYPE_ENTRY(LOAD, load), INSTR_TYPE_ENTRY(STORE, store), }; static const size_t nr_instr_types = sizeof instr_types / sizeof instr_types[0]; const struct select_instr_type *select_type_for_instr(enum mie_instr_type instr) { if (instr < 0 || instr >= nr_instr_types) { return NULL; } return instr_types[instr]; }