33 lines
950 B
C
33 lines
950 B
C
|
|
#include "builder.h"
|
||
|
|
|
||
|
|
#include <mie/select/opcode.h>
|
||
|
|
#include <stddef.h>
|
||
|
|
|
||
|
|
#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];
|
||
|
|
}
|