#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(cmp_eq); DECLARE_INSTR_TYPE(cmp_neq); DECLARE_INSTR_TYPE(cmp_lt); DECLARE_INSTR_TYPE(cmp_gt); DECLARE_INSTR_TYPE(cmp_leq); DECLARE_INSTR_TYPE(cmp_geq); DECLARE_INSTR_TYPE(load); DECLARE_INSTR_TYPE(store); DECLARE_INSTR_TYPE(msg); DECLARE_INSTR_TYPE(br); DECLARE_INSTR_TYPE(br_if); static const struct select_instr_type *instr_types[] = { INSTR_TYPE_ENTRY(ALLOCA, alloca), INSTR_TYPE_ENTRY(LOAD, load), INSTR_TYPE_ENTRY(STORE, store), INSTR_TYPE_ENTRY(MSG, msg), INSTR_TYPE_ENTRY(BR, br), INSTR_TYPE_ENTRY(BR_IF, br_if), INSTR_TYPE_ENTRY(ADD, add), INSTR_TYPE_ENTRY(SUB, sub), INSTR_TYPE_ENTRY(MUL, mul), INSTR_TYPE_ENTRY(DIV, div), INSTR_TYPE_ENTRY(CMP_EQ, cmp_eq), INSTR_TYPE_ENTRY(CMP_NEQ, cmp_neq), INSTR_TYPE_ENTRY(CMP_LT, cmp_lt), INSTR_TYPE_ENTRY(CMP_GT, cmp_gt), INSTR_TYPE_ENTRY(CMP_LEQ, cmp_leq), INSTR_TYPE_ENTRY(CMP_GEQ, cmp_geq), }; 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]; }