From 58bd336eb8abd222597bee8d773fec42e66449f4 Mon Sep 17 00:00:00 2001 From: Max Wash Date: Wed, 21 Jan 2026 14:42:22 +0000 Subject: [PATCH] mie: dialect: add emitter functions for various ops --- mie/dialect/arith/op/addi.c | 22 +++++++++++++ mie/dialect/arith/op/constant.c | 39 ++++++++++++++++++++++ mie/dialect/func/op/func.c | 55 +++++++++++++++++++++++++++++++ mie/include/mie/dialect/arith.h | 12 +++++++ mie/include/mie/dialect/builtin.h | 3 ++ mie/include/mie/dialect/func.h | 15 +++++++++ 6 files changed, 146 insertions(+) diff --git a/mie/dialect/arith/op/addi.c b/mie/dialect/arith/op/addi.c index 62770e8..0bc08c7 100644 --- a/mie/dialect/arith/op/addi.c +++ b/mie/dialect/arith/op/addi.c @@ -1,8 +1,12 @@ +#include +#include #include +#include #include #include #include #include +#include static enum mie_status print(struct mie_printer *printer, const struct mie_op *op) { @@ -28,6 +32,24 @@ 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 *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); + 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); + + return result; +} + MIE_OP_DEFINITION_BEGIN(mie_arith_addi, "addi") MIE_OP_DEFINITION_PRINT(print); MIE_OP_DEFINITION_PARSE(parse); diff --git a/mie/dialect/arith/op/constant.c b/mie/dialect/arith/op/constant.c index a4074c8..5ea78fd 100644 --- a/mie/dialect/arith/op/constant.c +++ b/mie/dialect/arith/op/constant.c @@ -1,6 +1,7 @@ #include #include #include +#include #include #include #include @@ -40,6 +41,44 @@ 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_op *op + = mie_builder_put_op(builder, "arith", "constant", NULL, 0); + const struct mie_type *ty + = mie_ctx_get_int_type(mie_builder_get_ctx(builder), 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); + + struct mie_attribute *val + = mie_ctx_get_int(mie_builder_get_ctx(builder), 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_op *op + = mie_builder_put_op(builder, "arith", "constant", NULL, 0); + const struct mie_type *ty + = mie_ctx_get_int_type(mie_builder_get_ctx(builder), 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); + + struct mie_attribute *val + = mie_ctx_get_float(mie_builder_get_ctx(builder), value, 32); + mie_attribute_map_put(&op->op_attrib, "value", val, MIE_ATTRMAP_F_REPLACE); + + return result; +} + MIE_OP_DEFINITION_BEGIN(mie_arith_constant, "constant") 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 a9c755d..22b0b39 100644 --- a/mie/dialect/func/op/func.c +++ b/mie/dialect/func/op/func.c @@ -2,9 +2,11 @@ #include #include #include +#include #include #include #include +#include #include #include #include @@ -72,6 +74,59 @@ 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) +{ + const struct mie_type **param_types + = calloc(nr_params, sizeof *param_types); + if (!param_types) { + return NULL; + } + + for (size_t i = 0; i < nr_params; i++) { + param_types[i] = params[i].param_type; + } + + const struct mie_type *func_type = mie_ctx_get_function_type( + mie_builder_get_ctx(builder), param_types, nr_params, ret_types, + nr_ret_types); + free(param_types); + + if (!func_type) { + return NULL; + } + + struct mie_op *op = mie_builder_put_op(builder, "func", "func", NULL, 0); + + struct mie_region *region = mie_op_add_region(op); + struct mie_block *entry = mie_region_add_block(region); + mie_name_map_put(region->r_names, &entry->b_name, "entry", 0); + + for (size_t i = 0; i < nr_params; i++) { + struct mie_register *param_reg = mie_block_add_param(entry); + mie_name_map_put( + region->r_names, ¶m_reg->reg_name, + params[i].param_name, 0); + param_reg->reg_type = params[i].param_type; + params[i].param_reg = param_reg; + } + + struct mie_attribute *sym_name + = mie_ctx_get_string(mie_builder_get_ctx(builder), name); + struct mie_attribute *function_type + = mie_type_attr_create(mie_builder_get_ctx(builder), func_type); + + mie_attribute_map_put( + &op->op_attrib, "sym_name", sym_name, MIE_ATTRMAP_F_REPLACE); + mie_attribute_map_put( + &op->op_attrib, "function_type", function_type, + MIE_ATTRMAP_F_REPLACE); + + return op; +} + MIE_OP_DEFINITION_BEGIN(mie_func_func, "func") MIE_OP_DEFINITION_PRINT(print); MIE_OP_DEFINITION_PARSE(parse); diff --git a/mie/include/mie/dialect/arith.h b/mie/include/mie/dialect/arith.h index c0ea701..2d06248 100644 --- a/mie/include/mie/dialect/arith.h +++ b/mie/include/mie/dialect/arith.h @@ -8,7 +8,19 @@ struct mie_ctx; struct mie_dialect; +struct mie_builder; 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, + struct mie_register *right, const char *name); +MIE_API struct mie_register *mie_arith_put_addf( + struct mie_builder *builder, struct mie_register *left, + struct mie_register *right, const char *name); + #endif diff --git a/mie/include/mie/dialect/builtin.h b/mie/include/mie/dialect/builtin.h index f16012c..53a96d6 100644 --- a/mie/include/mie/dialect/builtin.h +++ b/mie/include/mie/dialect/builtin.h @@ -121,6 +121,9 @@ MIE_API struct mie_type *mie_ctx_get_int_type(struct mie_ctx *ctx, size_t bit_wi MIE_API struct mie_type *mie_ctx_get_float_type( struct mie_ctx *ctx, size_t bit_width); +MIE_API struct mie_attribute *mie_type_attr_create( + struct mie_ctx *ctx, const struct mie_type *ty); + MIE_API size_t mie_int_type_get_width(const struct mie_type *type); MIE_API size_t mie_float_type_get_width(const struct mie_type *type); diff --git a/mie/include/mie/dialect/func.h b/mie/include/mie/dialect/func.h index 3b537b5..a40c1f1 100644 --- a/mie/include/mie/dialect/func.h +++ b/mie/include/mie/dialect/func.h @@ -2,10 +2,25 @@ #define MIE_DIALECT_FUNC_H_ #include +#include struct mie_ctx; +struct mie_type; struct mie_dialect; +struct mie_register; +struct mie_builder; + +struct mie_func_parameter { + const char *param_name; + const struct mie_type *param_type; + struct mie_register *param_reg; +}; 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); + #endif