mie: select: add support for target-specific nodes and lowering operations
This commit is contained in:
@@ -10,18 +10,43 @@ struct mie_value;
|
||||
struct mie_select_builder;
|
||||
struct mie_select_node;
|
||||
struct mie_select_graph;
|
||||
struct mie_select_value;
|
||||
struct mie_target;
|
||||
|
||||
MIE_API struct mie_select_builder *mie_select_builder_create(struct mie_ctx *ctx);
|
||||
MIE_API struct mie_select_builder *mie_select_builder_create(
|
||||
struct mie_ctx *ctx, const struct mie_target *target);
|
||||
MIE_API void mie_select_builder_destroy(struct mie_select_builder *builder);
|
||||
|
||||
MIE_API struct mie_select_graph *mie_select_builder_get_graph(
|
||||
struct mie_select_builder *builder);
|
||||
MIE_API struct mie_ctx *mie_select_builder_get_ctx(
|
||||
struct mie_select_builder *builder);
|
||||
MIE_API const struct mie_target *mie_select_builder_get_target(
|
||||
struct mie_select_builder *builder);
|
||||
MIE_API struct mie_select_graph *mie_select_builder_finish(
|
||||
struct mie_select_builder *builder);
|
||||
|
||||
MIE_API enum mie_status mie_select_builder_get_const(
|
||||
struct mie_select_builder *builder, long long value,
|
||||
struct mie_select_value *out);
|
||||
|
||||
MIE_API enum mie_status mie_select_builder_push_instr(
|
||||
struct mie_select_builder *builder, struct mie_instr *instr);
|
||||
|
||||
MIE_API struct mie_select_node *mie_select_builder_find_node_with_ivalue(
|
||||
struct mie_select_builder *builder, const struct mie_target *target,
|
||||
unsigned int opcode, long long val);
|
||||
|
||||
MIE_API struct mie_select_value *mie_select_builder_get_value(
|
||||
struct mie_select_builder *builder, struct mie_value *ir_val);
|
||||
MIE_API enum mie_status mie_select_builder_set_value(
|
||||
struct mie_select_builder *builder, struct mie_value *ir_val,
|
||||
struct mie_select_value *graph_val);
|
||||
|
||||
MIE_API struct mie_select_value *mie_select_builder_get_mem_access(
|
||||
struct mie_select_builder *builder, struct mie_value *ir_val);
|
||||
MIE_API enum mie_status mie_select_builder_set_mem_access(
|
||||
struct mie_select_builder *builder, struct mie_value *ir_val,
|
||||
struct mie_select_value *graph_val);
|
||||
|
||||
#endif
|
||||
|
||||
@@ -4,6 +4,7 @@
|
||||
#include <blue/core/btree.h>
|
||||
#include <blue/core/queue.h>
|
||||
#include <mie/misc.h>
|
||||
#include <mie/target/target.h>
|
||||
|
||||
struct mie_ctx;
|
||||
struct mie_type;
|
||||
@@ -22,7 +23,7 @@ struct mie_select_use {
|
||||
|
||||
struct mie_select_graph {
|
||||
b_queue g_nodes;
|
||||
struct mie_select_value g_root;
|
||||
struct mie_select_node *g_root;
|
||||
struct mie_select_value g_entry;
|
||||
struct mie_select_value g_last_chain;
|
||||
size_t g_frame_index;
|
||||
@@ -48,9 +49,9 @@ MIE_API struct mie_select_graph *mie_select_graph_create(struct mie_ctx *ctx);
|
||||
MIE_API void mie_select_graph_destroy(struct mie_select_graph *graph);
|
||||
|
||||
MIE_API enum mie_status mie_select_graph_get_node(
|
||||
struct mie_select_graph *graph, unsigned int op,
|
||||
struct mie_select_value **operands, size_t nr_operands,
|
||||
struct mie_type **values, size_t nr_values, struct mie_select_value *out);
|
||||
struct mie_select_graph *graph, const struct mie_target *target,
|
||||
unsigned int op, struct mie_select_value **operands, size_t nr_operands,
|
||||
struct mie_type **values, size_t nr_values, struct mie_select_node **out);
|
||||
|
||||
MIE_API void mie_select_graph_dump_text(struct mie_select_graph *graph);
|
||||
MIE_API void mie_select_graph_dump_dot(struct mie_select_graph *graph);
|
||||
|
||||
@@ -21,9 +21,14 @@ struct mie_select_node {
|
||||
unsigned long n_opcode;
|
||||
enum mie_select_node_flags n_flags;
|
||||
|
||||
char *n_description;
|
||||
|
||||
/* certain "builtin" parameters that can be used by opcodes */
|
||||
struct mie_value *n_value_p;
|
||||
long long n_value_i;
|
||||
struct {
|
||||
struct mie_value *v;
|
||||
long long i;
|
||||
void *p;
|
||||
} n_value;
|
||||
|
||||
/* queue entry, links to mie_select_graph.g_nodes */
|
||||
b_queue_entry n_entry;
|
||||
@@ -84,6 +89,13 @@ MIE_API void mie_select_node_get_users(
|
||||
MIE_API void mie_select_node_get_uses(
|
||||
struct mie_select_node *node, struct mie_select_node_iterator *it);
|
||||
|
||||
MIE_API enum mie_status mie_select_node_get_value(
|
||||
struct mie_select_node *node, struct mie_type *type, size_t index,
|
||||
struct mie_select_value *out);
|
||||
|
||||
MIE_API enum mie_status mie_select_node_set_description(
|
||||
struct mie_select_node *node, const char *format, ...);
|
||||
|
||||
MIE_API struct mie_select_node *mie_select_node_get_glued_node(
|
||||
struct mie_select_node *node);
|
||||
MIE_API struct mie_select_node *mie_select_node_get_glued_user(
|
||||
|
||||
@@ -12,6 +12,7 @@ enum mie_select_opcode {
|
||||
MIE_SELECT_OP_COPY_FROM_REG,
|
||||
MIE_SELECT_OP_COPY_TO_REG,
|
||||
MIE_SELECT_OP_GLOBAL_ADDRESS,
|
||||
MIE_SELECT_OP_CHAIN_GROUP,
|
||||
MIE_SELECT_OP_LOAD,
|
||||
MIE_SELECT_OP_STORE,
|
||||
MIE_SELECT_OP_ADD,
|
||||
|
||||
Reference in New Issue
Block a user