diff --git a/mie/include/mie/select/opcode.h b/mie/include/mie/select/opcode.h index afd7df9..54984f3 100644 --- a/mie/include/mie/select/opcode.h +++ b/mie/include/mie/select/opcode.h @@ -20,6 +20,12 @@ enum mie_select_opcode { MIE_SELECT_OP_MUL, MIE_SELECT_OP_DIV, MIE_SELECT_OP_XOR, + MIE_SELECT_OP_CMP_EQ, + MIE_SELECT_OP_CMP_NEQ, + MIE_SELECT_OP_CMP_LT, + MIE_SELECT_OP_CMP_GT, + MIE_SELECT_OP_CMP_LEQ, + MIE_SELECT_OP_CMP_GEQ, MIE_SELECT_OP_BR, MIE_SELECT_OP_BR_COND, }; diff --git a/mie/select/binary-op.c b/mie/select/binary-op.c index 7fbe6b1..ada98d3 100644 --- a/mie/select/binary-op.c +++ b/mie/select/binary-op.c @@ -50,8 +50,20 @@ DEFINE_PUSH_FUNCTION(add, MIE_SELECT_OP_ADD); DEFINE_PUSH_FUNCTION(sub, MIE_SELECT_OP_SUB); DEFINE_PUSH_FUNCTION(mul, MIE_SELECT_OP_MUL); DEFINE_PUSH_FUNCTION(div, MIE_SELECT_OP_DIV); +DEFINE_PUSH_FUNCTION(cmp_eq, MIE_SELECT_OP_CMP_EQ); +DEFINE_PUSH_FUNCTION(cmp_neq, MIE_SELECT_OP_CMP_NEQ); +DEFINE_PUSH_FUNCTION(cmp_lt, MIE_SELECT_OP_CMP_LT); +DEFINE_PUSH_FUNCTION(cmp_gt, MIE_SELECT_OP_CMP_GT); +DEFINE_PUSH_FUNCTION(cmp_leq, MIE_SELECT_OP_CMP_LEQ); +DEFINE_PUSH_FUNCTION(cmp_geq, MIE_SELECT_OP_CMP_GEQ); DEFINE_OP(add); DEFINE_OP(sub); DEFINE_OP(mul); DEFINE_OP(div); +DEFINE_OP(cmp_eq); +DEFINE_OP(cmp_neq); +DEFINE_OP(cmp_lt); +DEFINE_OP(cmp_gt); +DEFINE_OP(cmp_leq); +DEFINE_OP(cmp_geq); diff --git a/mie/select/instr.c b/mie/select/instr.c index 2023983..3fb14e6 100644 --- a/mie/select/instr.c +++ b/mie/select/instr.c @@ -11,15 +11,24 @@ 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); 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), INSTR_TYPE_ENTRY(MSG, msg), + INSTR_TYPE_ENTRY(ALLOCA, alloca), INSTR_TYPE_ENTRY(LOAD, load), + INSTR_TYPE_ENTRY(STORE, store), INSTR_TYPE_ENTRY(MSG, msg), + 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]; diff --git a/mie/target/select.c b/mie/target/select.c index dcfe639..f1c112f 100644 --- a/mie/target/select.c +++ b/mie/target/select.c @@ -13,7 +13,7 @@ static size_t node_name( switch (opcode) { NODE_NAME(ENTRY, "Entry"); NODE_NAME(ROOT, "Root"); - NODE_NAME(BLOCK, "Root"); + NODE_NAME(BLOCK, "Block"); NODE_NAME(CONSTANT, "Constant"); NODE_NAME(FRAME_INDEX, "FrameIndex"); NODE_NAME(REGISTER, "Register"); @@ -27,6 +27,12 @@ static size_t node_name( NODE_NAME(SUB, "Sub"); NODE_NAME(MUL, "Mul"); NODE_NAME(DIV, "Div"); + NODE_NAME(CMP_EQ, "Cmp.Eq"); + NODE_NAME(CMP_NEQ, "Cmp.Neq"); + NODE_NAME(CMP_LT, "Cmp.Lt"); + NODE_NAME(CMP_GT, "Cmp.Gt"); + NODE_NAME(CMP_LEQ, "Cmp.Leq"); + NODE_NAME(CMP_GEQ, "Cmp.Geq"); NODE_NAME(XOR, "Xor"); NODE_NAME(BR, "Branch"); NODE_NAME(BR_COND, "CondBranch");