mie: scf: implement lots of print and emit functions
This commit is contained in:
@@ -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);
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user