82 lines
2.4 KiB
C
82 lines
2.4 KiB
C
#include <mie/attribute/attribute.h>
|
|
#include <mie/dialect/builtin.h>
|
|
#include <mie/dialect/dialect.h>
|
|
#include <mie/ir/emit.h>
|
|
#include <mie/ir/op-definition.h>
|
|
#include <mie/ir/op.h>
|
|
#include <mie/macros.h>
|
|
#include <mie/print/printer.h>
|
|
|
|
static enum mie_status print(struct mie_printer *printer, const struct mie_op *op)
|
|
{
|
|
const struct mie_attribute *value
|
|
= mie_attribute_map_get(&op->op_attrib, "value");
|
|
if (!value) {
|
|
return MIE_SUCCESS;
|
|
}
|
|
|
|
const struct mie_type *type = NULL;
|
|
if (mie_attribute_check_name(value, "builtin", "int")) {
|
|
const struct mie_int *i = (const struct mie_int *)value;
|
|
b_stream_write_fmt(
|
|
printer->p_stream, NULL, " %lld : ", i->i_val.v_small);
|
|
type = i->i_type;
|
|
} else if (mie_attribute_check_name(value, "builtin", "float")) {
|
|
const struct mie_float *f = (const struct mie_float *)value;
|
|
double d;
|
|
mie_float_get_value(value, &d);
|
|
b_stream_write_fmt(printer->p_stream, NULL, " %g : ", d);
|
|
type = f->f_type;
|
|
} else {
|
|
return MIE_SUCCESS;
|
|
}
|
|
|
|
mie_printer_print_type(printer, type);
|
|
|
|
return MIE_SUCCESS;
|
|
}
|
|
|
|
static enum mie_status parse(struct mie_parser *parser, struct mie_op *out)
|
|
{
|
|
return MIE_SUCCESS;
|
|
}
|
|
|
|
struct mie_register *mie_arith_constant_i_put(
|
|
struct mie_emitter *e, long long value, const char *name)
|
|
{
|
|
struct mie_op *op = mie_emitter_put_op(e, "arith", "constant", NULL, 0);
|
|
const struct mie_type *ty
|
|
= mie_ctx_get_int_type(mie_emitter_get_ctx(e), 32);
|
|
struct mie_register *result = mie_op_add_result(op, ty);
|
|
|
|
mie_emitter_put_name(e, &result->reg_name, name);
|
|
|
|
struct mie_attribute *val
|
|
= mie_ctx_get_int(mie_emitter_get_ctx(e), value, 32);
|
|
mie_attribute_map_put(&op->op_attrib, "value", val, MIE_ATTRMAP_F_REPLACE);
|
|
|
|
return result;
|
|
}
|
|
|
|
struct mie_register *mie_arith_constant_f_put(
|
|
struct mie_emitter *e, long long value, const char *name)
|
|
{
|
|
struct mie_op *op = mie_emitter_put_op(e, "arith", "constant", NULL, 0);
|
|
const struct mie_type *ty
|
|
= mie_ctx_get_int_type(mie_emitter_get_ctx(e), 32);
|
|
struct mie_register *result = mie_op_add_result(op, ty);
|
|
|
|
mie_emitter_put_name(e, &result->reg_name, name);
|
|
|
|
struct mie_attribute *val
|
|
= mie_ctx_get_float(mie_emitter_get_ctx(e), 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);
|
|
MIE_OP_DEFINITION_END()
|