mie: select: add support for target-specific nodes and lowering operations

This commit is contained in:
2025-09-08 15:42:22 +01:00
parent 5ca045fd5b
commit eb260fb35c
15 changed files with 277 additions and 76 deletions

View File

@@ -9,35 +9,42 @@ static enum mie_status push_load(
{
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
= select_builder_get_mem_access(builder, load->l_src);
= mie_select_builder_get_mem_access(builder, load->l_src);
if (!chain) {
chain = &graph->g_entry;
}
struct mie_select_value *operands[] = {
chain,
select_builder_get_value(builder, load->l_src),
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,
mie_ctx_get_type(mie_select_builder_get_ctx(builder), MIE_TYPE_OTHER),
chain_type,
};
size_t nr_results = sizeof result / sizeof result[0];
struct mie_select_value node = {0};
struct mie_select_node *node;
enum mie_status status = mie_select_graph_get_node(
graph, MIE_SELECT_OP_LOAD, operands, nr_operands, result,
nr_results, &node);
graph, mie_target_builtin(), MIE_SELECT_OP_LOAD, operands,
nr_operands, result, nr_results, &node);
if (status != MIE_SUCCESS) {
return status;
}
select_builder_set_mem_access(builder, load->l_src, &node);
return select_builder_set_value(builder, MIE_VALUE(instr), &node);
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(
@@ -47,15 +54,15 @@ static enum mie_status push_store(
struct mie_select_graph *graph = mie_select_builder_get_graph(builder);
struct mie_select_value *chain
= select_builder_get_mem_access(builder, store->s_dest);
= mie_select_builder_get_mem_access(builder, store->s_dest);
if (!chain) {
chain = &graph->g_entry;
}
struct mie_select_value *operands[] = {
chain,
select_builder_get_value(builder, store->s_val),
select_builder_get_value(builder, store->s_dest),
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];
@@ -64,16 +71,19 @@ static enum mie_status push_store(
};
size_t nr_results = sizeof result / sizeof result[0];
struct mie_select_value node = {0};
struct mie_select_node *node;
enum mie_status status = mie_select_graph_get_node(
graph, MIE_SELECT_OP_STORE, operands, nr_operands, result,
nr_results, &node);
graph, mie_target_builtin(), MIE_SELECT_OP_STORE, operands,
nr_operands, result, nr_results, &node);
if (status != MIE_SUCCESS) {
return status;
}
select_builder_set_mem_access(builder, store->s_dest, &node);
return select_builder_set_value(builder, MIE_VALUE(instr), &node);
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 = {