mie: dialect: add emitter functions for various ops

This commit is contained in:
2026-01-21 14:42:22 +00:00
parent 008966e046
commit 58bd336eb8
6 changed files with 146 additions and 0 deletions

View File

@@ -1,8 +1,12 @@
#include <mie/ctx.h>
#include <mie/dialect/builtin.h>
#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/op.h>
#include <mie/macros.h> #include <mie/macros.h>
#include <mie/print/printer.h> #include <mie/print/printer.h>
#include <mie/type/type.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)
{ {
@@ -28,6 +32,24 @@ static enum mie_status parse(struct mie_parser *parser, struct mie_op *out)
return MIE_SUCCESS; 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_BEGIN(mie_arith_addi, "addi")
MIE_OP_DEFINITION_PRINT(print); MIE_OP_DEFINITION_PRINT(print);
MIE_OP_DEFINITION_PARSE(parse); MIE_OP_DEFINITION_PARSE(parse);

View File

@@ -1,6 +1,7 @@
#include <mie/attribute/attribute.h> #include <mie/attribute/attribute.h>
#include <mie/dialect/builtin.h> #include <mie/dialect/builtin.h>
#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/op.h>
#include <mie/macros.h> #include <mie/macros.h>
@@ -40,6 +41,44 @@ static enum mie_status parse(struct mie_parser *parser, struct mie_op *out)
return MIE_SUCCESS; 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_BEGIN(mie_arith_constant, "constant")
MIE_OP_DEFINITION_PRINT(print); MIE_OP_DEFINITION_PRINT(print);
MIE_OP_DEFINITION_PARSE(parse); MIE_OP_DEFINITION_PARSE(parse);

View File

@@ -2,9 +2,11 @@
#include <mie/ctx.h> #include <mie/ctx.h>
#include <mie/dialect/builtin.h> #include <mie/dialect/builtin.h>
#include <mie/dialect/dialect.h> #include <mie/dialect/dialect.h>
#include <mie/dialect/func.h>
#include <mie/interface/interface-definition.h> #include <mie/interface/interface-definition.h>
#include <mie/interface/interface.h> #include <mie/interface/interface.h>
#include <mie/ir/block.h> #include <mie/ir/block.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/op.h>
#include <mie/ir/region.h> #include <mie/ir/region.h>
@@ -72,6 +74,59 @@ static enum mie_status parse(struct mie_parser *parser, struct mie_op *out)
return MIE_SUCCESS; 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, &param_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_BEGIN(mie_func_func, "func")
MIE_OP_DEFINITION_PRINT(print); MIE_OP_DEFINITION_PRINT(print);
MIE_OP_DEFINITION_PARSE(parse); MIE_OP_DEFINITION_PARSE(parse);

View File

@@ -8,7 +8,19 @@
struct mie_ctx; struct mie_ctx;
struct mie_dialect; struct mie_dialect;
struct mie_builder;
MIE_API struct mie_dialect *mie_arith_dialect_create(struct mie_ctx *ctx); 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 #endif

View File

@@ -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( MIE_API struct mie_type *mie_ctx_get_float_type(
struct mie_ctx *ctx, size_t bit_width); 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_int_type_get_width(const struct mie_type *type);
MIE_API size_t mie_float_type_get_width(const struct mie_type *type); MIE_API size_t mie_float_type_get_width(const struct mie_type *type);

View File

@@ -2,10 +2,25 @@
#define MIE_DIALECT_FUNC_H_ #define MIE_DIALECT_FUNC_H_
#include <mie/misc.h> #include <mie/misc.h>
#include <stddef.h>
struct mie_ctx; struct mie_ctx;
struct mie_type;
struct mie_dialect; 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_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 #endif