mie: scf: implement lots of print and emit functions

This commit is contained in:
2026-01-23 23:32:59 +00:00
parent a710ef0b24
commit e9d2c0fbc7
3 changed files with 105 additions and 0 deletions

View File

@@ -1,9 +1,45 @@
#include <mie/dialect/dialect.h> #include <mie/dialect/dialect.h>
#include <mie/ir/builder.h>
#include <mie/ir/op-definition.h> #include <mie/ir/op-definition.h>
#include <mie/ir/op.h>
#include <mie/ir/region.h>
#include <mie/macros.h> #include <mie/macros.h>
#include <mie/print/printer.h>
static enum mie_status print(struct mie_printer *printer, const struct mie_op *op) 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; return MIE_SUCCESS;
} }
@@ -12,6 +48,35 @@ static enum mie_status parse(struct mie_parser *parser, struct mie_op *out)
return MIE_SUCCESS; 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_BEGIN(mie_scf_if, "if")
MIE_OP_DEFINITION_PRINT(print); MIE_OP_DEFINITION_PRINT(print);
MIE_OP_DEFINITION_PARSE(parse); MIE_OP_DEFINITION_PARSE(parse);

View File

@@ -1,9 +1,32 @@
#include <mie/dialect/dialect.h> #include <mie/dialect/dialect.h>
#include <mie/ir/builder.h>
#include <mie/ir/op-definition.h> #include <mie/ir/op-definition.h>
#include <mie/ir/op.h>
#include <mie/macros.h> #include <mie/macros.h>
#include <mie/print/printer.h>
static enum mie_status print(struct mie_printer *printer, const struct mie_op *op) 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; return MIE_SUCCESS;
} }
@@ -12,6 +35,12 @@ static enum mie_status parse(struct mie_parser *parser, struct mie_op *out)
return MIE_SUCCESS; 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_BEGIN(mie_scf_yield, "yield")
MIE_OP_DEFINITION_PRINT(print); MIE_OP_DEFINITION_PRINT(print);
MIE_OP_DEFINITION_PARSE(parse); MIE_OP_DEFINITION_PARSE(parse);

View File

@@ -4,8 +4,19 @@
#include <mie/misc.h> #include <mie/misc.h>
struct mie_ctx; struct mie_ctx;
struct mie_type;
struct mie_region;
struct mie_dialect; 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_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 #endif