87 lines
2.1 KiB
C
87 lines
2.1 KiB
C
#include <mie/dialect/dialect.h>
|
|
#include <mie/ir/emit.h>
|
|
#include <mie/ir/op-definition.h>
|
|
#include <mie/ir/op.h>
|
|
#include <mie/ir/region.h>
|
|
#include <mie/macros.h>
|
|
#include <mie/print/printer.h>
|
|
|
|
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, ' ');
|
|
|
|
struct mie_region *if_region = mie_op_get_first_region(op);
|
|
struct mie_region *else_region = mie_op_get_next_region(op, if_region);
|
|
|
|
mie_printer_print_region(printer, if_region, 0);
|
|
|
|
if (else_region) {
|
|
b_stream_write_string(printer->p_stream, " else ", NULL);
|
|
mie_printer_print_region(printer, else_region, 0);
|
|
}
|
|
|
|
return MIE_SUCCESS;
|
|
}
|
|
|
|
static enum mie_status parse(struct mie_parser *parser, struct mie_op *out)
|
|
{
|
|
return MIE_SUCCESS;
|
|
}
|
|
|
|
struct mie_op *mie_scf_if_put(
|
|
struct mie_emitter *e, 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_emitter_put_op(e, "scf", "if", &cond, 1);
|
|
if (!op) {
|
|
return NULL;
|
|
}
|
|
|
|
if (result_type) {
|
|
struct mie_register *result = mie_op_add_result(op, result_type);
|
|
mie_emitter_put_name(e, &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_PRINT(print);
|
|
MIE_OP_DEFINITION_PARSE(parse);
|
|
MIE_OP_DEFINITION_END()
|