#include "builder.h" #include #include #include static enum mie_status push_load( struct mie_select_builder *builder, struct mie_instr *instr) { struct mie_select_graph *graph = mie_select_builder_get_graph(builder); struct mie_load *load = (struct mie_load *)instr; struct mie_type *chain_type = mie_ctx_get_type( mie_select_builder_get_ctx(builder), MIE_TYPE_OTHER); struct mie_select_value *chain = mie_select_builder_get_mem_access(builder, load->l_src); if (!chain) { chain = &graph->g_entry; } struct mie_select_value *operands[] = { chain, mie_select_builder_get_value(builder, load->l_src), }; size_t nr_operands = sizeof operands / sizeof operands[0]; struct mie_type *result[] = { load->l_type, chain_type, }; size_t nr_results = sizeof result / sizeof result[0]; struct mie_select_node *node; enum mie_status status = mie_select_graph_get_node( graph, mie_target_builtin(), MIE_SELECT_OP_LOAD, operands, nr_operands, result, nr_results, &node); if (status != MIE_SUCCESS) { return status; } struct mie_select_value value_result, chain_result; mie_select_node_get_value(node, load->l_type, 0, &value_result); mie_select_node_get_value(node, chain_type, 0, &chain_result); mie_select_builder_set_mem_access(builder, load->l_src, &chain_result); return mie_select_builder_set_value( builder, MIE_VALUE(instr), &value_result); } static enum mie_status push_store( struct mie_select_builder *builder, struct mie_instr *instr) { struct mie_store *store = (struct mie_store *)instr; struct mie_select_graph *graph = mie_select_builder_get_graph(builder); struct mie_select_value *chain = mie_select_builder_get_mem_access(builder, store->s_dest); if (!chain) { chain = &graph->g_entry; } struct mie_select_value *operands[] = { chain, mie_select_builder_get_value(builder, store->s_val), mie_select_builder_get_value(builder, store->s_dest), }; size_t nr_operands = sizeof operands / sizeof operands[0]; struct mie_type *result[] = { mie_ctx_get_type(mie_select_builder_get_ctx(builder), MIE_TYPE_OTHER), }; size_t nr_results = sizeof result / sizeof result[0]; struct mie_select_node *node; enum mie_status status = mie_select_graph_get_node( graph, mie_target_builtin(), MIE_SELECT_OP_STORE, operands, nr_operands, result, nr_results, &node); if (status != MIE_SUCCESS) { return status; } struct mie_select_value value; mie_select_node_get_value(node, result[0], 0, &value); mie_select_builder_set_mem_access(builder, store->s_dest, &value); return mie_select_builder_set_value(builder, MIE_VALUE(instr), &value); } struct select_instr_type select_load = { .i_push = push_load, }; struct select_instr_type select_store = { .i_push = push_store, };