diff --git a/mie/dialect/arith/op/addi.c b/mie/dialect/arith/op/addi.c index 0bc08c7..98cfe38 100644 --- a/mie/dialect/arith/op/addi.c +++ b/mie/dialect/arith/op/addi.c @@ -1,7 +1,7 @@ #include #include #include -#include +#include #include #include #include @@ -32,20 +32,18 @@ static enum mie_status parse(struct mie_parser *parser, struct mie_op *out) return MIE_SUCCESS; } -struct mie_register *mie_arith_put_addi( - struct mie_builder *builder, struct mie_register *left, +struct mie_register *mie_arith_addi_put( + struct mie_emitter *e, struct mie_register *left, struct mie_register *right, const char *name) { struct mie_register *args[] = {left, right}; const size_t nr_args = sizeof args / sizeof args[0]; - struct mie_op *op - = mie_builder_put_op(builder, "arith", "addi", args, nr_args); + struct mie_op *op = mie_emitter_put_op(e, "arith", "addi", args, nr_args); const struct mie_type *ty = left->reg_type; struct mie_register *result = mie_op_add_result(op, ty); - result->reg_block = mie_builder_get_current_block(builder); - mie_builder_put_name(builder, &result->reg_name, name); + mie_emitter_put_name(e, &result->reg_name, name); return result; } diff --git a/mie/dialect/arith/op/constant.c b/mie/dialect/arith/op/constant.c index 5ea78fd..05c4fdf 100644 --- a/mie/dialect/arith/op/constant.c +++ b/mie/dialect/arith/op/constant.c @@ -1,7 +1,7 @@ #include #include #include -#include +#include #include #include #include @@ -41,39 +41,35 @@ static enum mie_status parse(struct mie_parser *parser, struct mie_op *out) return MIE_SUCCESS; } -struct mie_register *mie_arith_put_constant_i( - struct mie_builder *builder, long long value, const char *name) +struct mie_register *mie_arith_constant_i_put( + struct mie_emitter *e, long long value, const char *name) { - struct mie_op *op - = mie_builder_put_op(builder, "arith", "constant", NULL, 0); + struct mie_op *op = mie_emitter_put_op(e, "arith", "constant", NULL, 0); const struct mie_type *ty - = mie_ctx_get_int_type(mie_builder_get_ctx(builder), 32); + = mie_ctx_get_int_type(mie_emitter_get_ctx(e), 32); struct mie_register *result = mie_op_add_result(op, ty); - result->reg_block = mie_builder_get_current_block(builder); - mie_builder_put_name(builder, &result->reg_name, name); + mie_emitter_put_name(e, &result->reg_name, name); struct mie_attribute *val - = mie_ctx_get_int(mie_builder_get_ctx(builder), value, 32); + = mie_ctx_get_int(mie_emitter_get_ctx(e), value, 32); mie_attribute_map_put(&op->op_attrib, "value", val, MIE_ATTRMAP_F_REPLACE); return result; } -struct mie_register *mie_arith_put_constant_f( - struct mie_builder *builder, long long value, const char *name) +struct mie_register *mie_arith_constant_f_put( + struct mie_emitter *e, long long value, const char *name) { - struct mie_op *op - = mie_builder_put_op(builder, "arith", "constant", NULL, 0); + struct mie_op *op = mie_emitter_put_op(e, "arith", "constant", NULL, 0); const struct mie_type *ty - = mie_ctx_get_int_type(mie_builder_get_ctx(builder), 32); + = mie_ctx_get_int_type(mie_emitter_get_ctx(e), 32); struct mie_register *result = mie_op_add_result(op, ty); - result->reg_block = mie_builder_get_current_block(builder); - mie_builder_put_name(builder, &result->reg_name, name); + mie_emitter_put_name(e, &result->reg_name, name); struct mie_attribute *val - = mie_ctx_get_float(mie_builder_get_ctx(builder), value, 32); + = mie_ctx_get_float(mie_emitter_get_ctx(e), value, 32); mie_attribute_map_put(&op->op_attrib, "value", val, MIE_ATTRMAP_F_REPLACE); return result; diff --git a/mie/dialect/builtin/op/module.c b/mie/dialect/builtin/op/module.c index 5dd9481..38a1abc 100644 --- a/mie/dialect/builtin/op/module.c +++ b/mie/dialect/builtin/op/module.c @@ -9,12 +9,11 @@ static enum mie_status print(struct mie_printer *out, const struct mie_op *op) { b_stream_write_char(out->p_stream, ' '); - if (MIE_VECTOR_COUNT(op->op_regions) == 0) { - return MIE_SUCCESS; - } - struct mie_region *region = &op->op_regions.items[0]; - mie_printer_print_region(out, region, 0); + struct mie_region *region = mie_op_get_first_region(op); + if (region) { + mie_printer_print_region(out, region, 0); + } return MIE_SUCCESS; } diff --git a/mie/dialect/cf/op/br-cond.c b/mie/dialect/cf/op/br-cond.c index aa73417..960a335 100644 --- a/mie/dialect/cf/op/br-cond.c +++ b/mie/dialect/cf/op/br-cond.c @@ -1,4 +1,5 @@ #include +#include #include #include #include @@ -33,6 +34,23 @@ static enum mie_status parse(struct mie_parser *parser, struct mie_op *out) return MIE_SUCCESS; } +struct mie_op *mie_cf_br_cond_put( + struct mie_emitter *e, struct mie_register *cond, + struct mie_block *true_block, struct mie_register **true_args, + size_t nr_true_args, struct mie_block *false_block, + struct mie_register **false_args, size_t nr_false_args) +{ + struct mie_op *op = mie_emitter_put_op(e, "cf", "br-cond", &cond, 1); + if (!op) { + return NULL; + } + + mie_op_add_successor(op, true_block, true_args, nr_true_args); + mie_op_add_successor(op, false_block, false_args, nr_false_args); + + return op; +} + MIE_OP_DEFINITION_BEGIN(mie_cf_br_cond, "br-cond") MIE_OP_DEFINITION_PRINT(print); MIE_OP_DEFINITION_PARSE(parse); diff --git a/mie/dialect/cf/op/br.c b/mie/dialect/cf/op/br.c index 4912d22..a61f23d 100644 --- a/mie/dialect/cf/op/br.c +++ b/mie/dialect/cf/op/br.c @@ -1,5 +1,6 @@ #include #include +#include #include #include #include @@ -20,6 +21,21 @@ static enum mie_status parse(struct mie_parser *parser, struct mie_op *out) return MIE_SUCCESS; } +struct mie_op *mie_cf_br_put( + struct mie_emitter *e, struct mie_block *dest, + struct mie_register **dest_args, size_t nr_dest_args) +{ + struct mie_op *op = mie_emitter_put_op(e, "cf", "br", NULL, 0); + if (!op) { + return NULL; + } + + struct mie_op_successor *s + = mie_op_add_successor(op, dest, dest_args, nr_dest_args); + + return op; +} + MIE_OP_DEFINITION_BEGIN(mie_cf_br, "br") MIE_OP_DEFINITION_PRINT(print); MIE_OP_DEFINITION_PARSE(parse); diff --git a/mie/dialect/func/op/func.c b/mie/dialect/func/op/func.c index e591604..de5cd22 100644 --- a/mie/dialect/func/op/func.c +++ b/mie/dialect/func/op/func.c @@ -6,7 +6,7 @@ #include #include #include -#include +#include #include #include #include @@ -28,8 +28,8 @@ static enum mie_status print(struct mie_printer *printer, const struct mie_op *o b_stream_write_fmt(printer->p_stream, NULL, " @%s(", sym_name_cstr); - const struct mie_region *code = &op->op_regions.items[0]; - const struct mie_block *entry = &code->r_blocks.items[0]; + const struct mie_region *code = mie_op_get_first_region(op); + const struct mie_block *entry = mie_region_get_first_block(code); for (size_t i = 0; i < MIE_VECTOR_COUNT(entry->b_params); i++) { if (i > 0) { @@ -74,10 +74,9 @@ static enum mie_status parse(struct mie_parser *parser, struct mie_op *out) return MIE_SUCCESS; } -struct mie_op *mie_func_put_func( - struct mie_builder *builder, const char *name, - struct mie_func_parameter *params, size_t nr_params, - const struct mie_type **ret_types, size_t nr_ret_types) +struct mie_op *mie_func_func_put( + struct mie_emitter *e, const char *name, struct mie_func_parameter *params, + size_t nr_params, const struct mie_type **ret_types, size_t nr_ret_types) { const struct mie_type **param_types = calloc(nr_params, sizeof *param_types); @@ -90,7 +89,7 @@ struct mie_op *mie_func_put_func( } const struct mie_type *func_type = mie_ctx_get_function_type( - mie_builder_get_ctx(builder), param_types, nr_params, ret_types, + mie_emitter_get_ctx(e), param_types, nr_params, ret_types, nr_ret_types); free(param_types); @@ -98,7 +97,7 @@ struct mie_op *mie_func_put_func( return NULL; } - struct mie_op *op = mie_builder_put_op(builder, "func", "func", NULL, 0); + struct mie_op *op = mie_emitter_put_op(e, "func", "func", NULL, 0); struct mie_region *region = mie_op_add_region(op); struct mie_block *entry = mie_region_add_block(region); @@ -114,9 +113,9 @@ struct mie_op *mie_func_put_func( } struct mie_attribute *sym_name - = mie_ctx_get_string(mie_builder_get_ctx(builder), name); + = mie_ctx_get_string(mie_emitter_get_ctx(e), name); struct mie_attribute *function_type - = mie_type_attr_create(mie_builder_get_ctx(builder), func_type); + = mie_type_attr_create(mie_emitter_get_ctx(e), func_type); mie_attribute_map_put( &op->op_attrib, "sym_name", sym_name, MIE_ATTRMAP_F_REPLACE); diff --git a/mie/dialect/scf/op/if.c b/mie/dialect/scf/op/if.c index 44888f5..4449c55 100644 --- a/mie/dialect/scf/op/if.c +++ b/mie/dialect/scf/op/if.c @@ -1,5 +1,5 @@ #include -#include +#include #include #include #include @@ -33,11 +33,14 @@ static enum mie_status print(struct mie_printer *printer, const struct mie_op *o b_stream_write_char(printer->p_stream, ' '); - mie_printer_print_region(printer, &op->op_regions.items[0], 0); + struct mie_region *if_region = mie_op_get_first_region(op); + struct mie_region *else_region = mie_op_get_next_region(op, if_region); - if (MIE_VECTOR_COUNT(op->op_regions) > 1) { + mie_printer_print_region(printer, if_region, 0); + + if (else_region) { b_stream_write_string(printer->p_stream, " else ", NULL); - mie_printer_print_region(printer, &op->op_regions.items[1], 0); + mie_printer_print_region(printer, else_region, 0); } return MIE_SUCCESS; @@ -48,19 +51,19 @@ static enum mie_status parse(struct mie_parser *parser, struct mie_op *out) return MIE_SUCCESS; } -struct mie_op *mie_scf_put_if( - struct mie_builder *builder, struct mie_register *cond, +struct mie_op *mie_scf_if_put( + struct mie_emitter *e, struct mie_register *cond, const struct mie_type *result_type, struct mie_region **out_true, struct mie_region **out_false, const char *name) { - struct mie_op *op = mie_builder_put_op(builder, "scf", "if", &cond, 1); + struct mie_op *op = mie_emitter_put_op(e, "scf", "if", &cond, 1); if (!op) { return NULL; } if (result_type) { struct mie_register *result = mie_op_add_result(op, result_type); - mie_builder_put_name(builder, &result->reg_name, name); + mie_emitter_put_name(e, &result->reg_name, name); } struct mie_region *r_true = mie_op_add_region(op); diff --git a/mie/dialect/scf/op/yield.c b/mie/dialect/scf/op/yield.c index d5d5f21..3f9e18f 100644 --- a/mie/dialect/scf/op/yield.c +++ b/mie/dialect/scf/op/yield.c @@ -1,5 +1,5 @@ #include -#include +#include #include #include #include @@ -35,10 +35,9 @@ static enum mie_status parse(struct mie_parser *parser, struct mie_op *out) return MIE_SUCCESS; } -struct mie_op *mie_scf_put_yield( - struct mie_builder *builder, struct mie_register *value) +struct mie_op *mie_scf_yield_put(struct mie_emitter *e, struct mie_register *value) { - return mie_builder_put_op(builder, "scf", "yield", &value, 1); + return mie_emitter_put_op(e, "scf", "yield", &value, 1); } MIE_OP_DEFINITION_BEGIN(mie_scf_yield, "yield") diff --git a/mie/include/mie/dialect/arith.h b/mie/include/mie/dialect/arith.h index 2d06248..2c5a74f 100644 --- a/mie/include/mie/dialect/arith.h +++ b/mie/include/mie/dialect/arith.h @@ -8,19 +8,19 @@ struct mie_ctx; struct mie_dialect; -struct mie_builder; +struct mie_emitter; MIE_API struct mie_dialect *mie_arith_dialect_create(struct mie_ctx *ctx); -MIE_API struct mie_register *mie_arith_put_constant_i( - struct mie_builder *builder, long long value, const char *name); -MIE_API struct mie_register *mie_arith_put_constant_f( - struct mie_builder *builder, long long value, const char *name); -MIE_API struct mie_register *mie_arith_put_addi( - struct mie_builder *builder, struct mie_register *left, +MIE_API struct mie_register *mie_arith_constant_i_put( + struct mie_emitter *e, long long value, const char *name); +MIE_API struct mie_register *mie_arith_constant_f_put( + struct mie_emitter *e, long long value, const char *name); +MIE_API struct mie_register *mie_arith_addi_put( + struct mie_emitter *e, struct mie_register *left, struct mie_register *right, const char *name); -MIE_API struct mie_register *mie_arith_put_addf( - struct mie_builder *builder, struct mie_register *left, +MIE_API struct mie_register *mie_arith_addf_put( + struct mie_emitter *e, struct mie_register *left, struct mie_register *right, const char *name); #endif diff --git a/mie/include/mie/dialect/cf.h b/mie/include/mie/dialect/cf.h index f530182..11ce715 100644 --- a/mie/include/mie/dialect/cf.h +++ b/mie/include/mie/dialect/cf.h @@ -2,10 +2,23 @@ #define MIE_DIALECT_CF_H_ #include +#include struct mie_ctx; +struct mie_block; struct mie_dialect; +struct mie_emitter; +struct mie_register; MIE_API struct mie_dialect *mie_cf_dialect_create(struct mie_ctx *ctx); +MIE_API struct mie_op *mie_cf_br_put( + struct mie_emitter *e, struct mie_block *dest, + struct mie_register **dest_args, size_t nr_dest_args); +MIE_API struct mie_op *mie_cf_br_cond_put( + struct mie_emitter *e, struct mie_register *cond, + struct mie_block *true_block, struct mie_register **true_args, + size_t nr_true_args, struct mie_block *false_block, + struct mie_register **false_args, size_t nr_false_args); + #endif diff --git a/mie/include/mie/dialect/func.h b/mie/include/mie/dialect/func.h index a40c1f1..2287916 100644 --- a/mie/include/mie/dialect/func.h +++ b/mie/include/mie/dialect/func.h @@ -7,8 +7,8 @@ struct mie_ctx; struct mie_type; struct mie_dialect; +struct mie_emitter; struct mie_register; -struct mie_builder; struct mie_func_parameter { const char *param_name; @@ -18,9 +18,8 @@ struct mie_func_parameter { MIE_API struct mie_dialect *mie_func_dialect_create(struct mie_ctx *ctx); -MIE_API struct mie_op *mie_func_put_func( - struct mie_builder *builder, const char *name, - struct mie_func_parameter *params, size_t nr_params, - const struct mie_type **ret_types, size_t nr_ret_types); +MIE_API struct mie_op *mie_func_func_put( + struct mie_emitter *e, const char *name, struct mie_func_parameter *params, + size_t nr_params, const struct mie_type **ret_types, size_t nr_ret_types); #endif diff --git a/mie/include/mie/dialect/scf.h b/mie/include/mie/dialect/scf.h index 1226ec1..59da312 100644 --- a/mie/include/mie/dialect/scf.h +++ b/mie/include/mie/dialect/scf.h @@ -7,16 +7,16 @@ struct mie_ctx; struct mie_type; struct mie_region; struct mie_dialect; -struct mie_builder; +struct mie_emitter; struct mie_register; MIE_API struct mie_dialect *mie_scf_dialect_create(struct mie_ctx *ctx); -MIE_API struct mie_op *mie_scf_put_if( - struct mie_builder *builder, struct mie_register *cond, +MIE_API struct mie_op *mie_scf_if_put( + struct mie_emitter *e, struct mie_register *cond, const struct mie_type *result_type, struct mie_region **out_true, struct mie_region **out_false, const char *name); -MIE_API struct mie_op *mie_scf_put_yield( - struct mie_builder *builder, struct mie_register *value); +MIE_API struct mie_op *mie_scf_yield_put( + struct mie_emitter *e, struct mie_register *value); #endif