diff --git a/test/mie-ir.c b/test/mie-ir.c new file mode 100644 index 0000000..61ed11e --- /dev/null +++ b/test/mie-ir.c @@ -0,0 +1,70 @@ +#include +#include +#include +#include +#include +#include +#include + +int main(void) +{ + struct mie_ctx *ctx = mie_ctx_create(); + struct mie_module *mod = mie_module_create(); + struct mie_builder *builder = mie_builder_create(ctx, NULL); + struct mie_func *func = mie_func_create( + "test", MIE_FUNC_STATIC, mie_ctx_get_type(ctx, MIE_TYPE_VOID), + NULL, 0); + + struct mie_type *i32 = mie_ctx_get_int_type(ctx, 32); + + struct mie_block *local_vars = mie_func_create_block(func, NULL); + mie_builder_set_insert_point(builder, local_vars); + struct mie_value *a_ptr = mie_builder_alloca(builder, i32, "a"); + struct mie_value *b_ptr = mie_builder_alloca(builder, i32, "b"); + struct mie_value *c_ptr = mie_builder_alloca(builder, i32, "c"); + + struct mie_block *entry = mie_func_create_block(func, NULL); + + mie_builder_br(builder, entry); + mie_builder_set_insert_point(builder, entry); + + mie_builder_store(builder, mie_ctx_get_int(ctx, 1, 32), a_ptr); + mie_builder_store(builder, mie_ctx_get_int(ctx, 2, 32), b_ptr); + + struct mie_value *a = mie_builder_load(builder, i32, a_ptr, NULL); + struct mie_value *b = mie_builder_load(builder, i32, b_ptr, NULL); + + struct mie_value *c = mie_builder_add(builder, a, b, NULL); + + mie_builder_store(builder, c, c_ptr); + + mie_builder_ret(builder, NULL); +#if 0 + struct mie_value *a = mie_ctx_get_int(ctx, 1, 32); + struct mie_value *b = mie_ctx_get_int(ctx, 2, 32); + struct mie_value *c = mie_ctx_get_int(ctx, 3, 32); + struct mie_value *d = mie_ctx_get_int(ctx, 4, 32); + struct mie_value *add1 = mie_builder_add(builder, a, b, "addtmp"); + struct mie_value *add2 = mie_builder_add(builder, c, d, "addtmp"); + struct mie_value *add3 = mie_builder_add(builder, add1, add2, "addtmp"); + struct mie_value *ret = mie_builder_ret(builder, add3); +#endif + mie_func_insert_block(func, local_vars, NULL); + mie_func_insert_block(func, entry, NULL); + + mie_module_add_function(mod, func); + + struct mie_ir_converter *converter + = mie_ir_converter_create(MIE_IR_MEM, MIE_IR_TEXT); + + mie_ir_converter_set_src_value(converter, MIE_VALUE(mod)); + mie_ir_converter_set_dest_file(converter, stdout); + + mie_ir_converter_process(converter); + + mie_ir_converter_destroy(converter); + + mie_value_destroy(MIE_VALUE(mod)); + + return 0; +}