mie: dialect: add emitter functions for various ops
This commit is contained in:
@@ -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);
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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, ¶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_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);
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user