From e9d2c0fbc7e27f4995d76cbc466a0d55e4ebf7c2 Mon Sep 17 00:00:00 2001 From: Max Wash Date: Fri, 23 Jan 2026 23:32:59 +0000 Subject: [PATCH] mie: scf: implement lots of print and emit functions --- mie/dialect/scf/op/if.c | 65 +++++++++++++++++++++++++++++++++++ mie/dialect/scf/op/yield.c | 29 ++++++++++++++++ mie/include/mie/dialect/scf.h | 11 ++++++ 3 files changed, 105 insertions(+) diff --git a/mie/dialect/scf/op/if.c b/mie/dialect/scf/op/if.c index d36ad35..44888f5 100644 --- a/mie/dialect/scf/op/if.c +++ b/mie/dialect/scf/op/if.c @@ -1,9 +1,45 @@ #include +#include #include +#include +#include #include +#include static enum mie_status print(struct mie_printer *printer, const struct mie_op *op) { + b_stream_write_char(printer->p_stream, ' '); + mie_printer_print_op_arg(printer, &op->op_args.items[0], false); + + if (MIE_VECTOR_COUNT(op->op_result) > 0) { + b_stream_write_string(printer->p_stream, " -> ", NULL); + + if (MIE_VECTOR_COUNT(op->op_result) > 1) { + b_stream_write_char(printer->p_stream, '('); + } + } + + for (size_t i = 0; i < MIE_VECTOR_COUNT(op->op_result); i++) { + if (i > 0) { + b_stream_write_string(printer->p_stream, ", ", NULL); + } + + mie_printer_print_type(printer, op->op_result.items[i].reg_type); + } + + if (MIE_VECTOR_COUNT(op->op_result) > 1) { + b_stream_write_char(printer->p_stream, '('); + } + + b_stream_write_char(printer->p_stream, ' '); + + mie_printer_print_region(printer, &op->op_regions.items[0], 0); + + if (MIE_VECTOR_COUNT(op->op_regions) > 1) { + b_stream_write_string(printer->p_stream, " else ", NULL); + mie_printer_print_region(printer, &op->op_regions.items[1], 0); + } + return MIE_SUCCESS; } @@ -12,6 +48,35 @@ 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, + 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); + 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); + } + + struct mie_region *r_true = mie_op_add_region(op); + struct mie_region *r_false = mie_op_add_region(op); + + if (out_true) { + *out_true = r_true; + } + + if (out_false) { + *out_false = r_false; + } + + return op; +} + MIE_OP_DEFINITION_BEGIN(mie_scf_if, "if") MIE_OP_DEFINITION_PRINT(print); MIE_OP_DEFINITION_PARSE(parse); diff --git a/mie/dialect/scf/op/yield.c b/mie/dialect/scf/op/yield.c index c53c139..d5d5f21 100644 --- a/mie/dialect/scf/op/yield.c +++ b/mie/dialect/scf/op/yield.c @@ -1,9 +1,32 @@ #include +#include #include +#include #include +#include static enum mie_status print(struct mie_printer *printer, const struct mie_op *op) { + b_stream_write_char(printer->p_stream, ' '); + for (size_t i = 0; i < MIE_VECTOR_COUNT(op->op_args); i++) { + if (i > 0) { + b_stream_write_string(printer->p_stream, ", ", NULL); + } + + mie_printer_print_op_arg(printer, &op->op_args.items[i], false); + } + + b_stream_write_string(printer->p_stream, " : ", NULL); + + for (size_t i = 0; i < MIE_VECTOR_COUNT(op->op_args); i++) { + if (i > 0) { + b_stream_write_string(printer->p_stream, ", ", NULL); + } + + mie_printer_print_type( + printer, mie_op_arg_get_type(&op->op_args.items[i])); + } + return MIE_SUCCESS; } @@ -12,6 +35,12 @@ 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) +{ + return mie_builder_put_op(builder, "scf", "yield", &value, 1); +} + MIE_OP_DEFINITION_BEGIN(mie_scf_yield, "yield") MIE_OP_DEFINITION_PRINT(print); MIE_OP_DEFINITION_PARSE(parse); diff --git a/mie/include/mie/dialect/scf.h b/mie/include/mie/dialect/scf.h index 22bc5fb..1226ec1 100644 --- a/mie/include/mie/dialect/scf.h +++ b/mie/include/mie/dialect/scf.h @@ -4,8 +4,19 @@ #include struct mie_ctx; +struct mie_type; +struct mie_region; struct mie_dialect; +struct mie_builder; +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, + 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); + #endif