0
};
-/* Initialize the architecture environment struct. */
-arch_env_t *arch_env_begin_codegeneration(const arch_isa_if_t *isa_if,
- be_main_env_t *main_env)
-{
- arch_env_t *arch_env = isa_if->begin_codegeneration(main_env);
- arch_env->main_env = main_env;
- return arch_env;
-}
-
/**
* Get the isa responsible for a node.
* @param irn The node to get the responsible isa for.
}
}
-static reg_out_info_t *get_out_info(const ir_node *node)
-{
- size_t pos = 0;
- const backend_info_t *info;
- assert(get_irn_mode(node) != mode_T);
- if (is_Proj(node)) {
- pos = get_Proj_proj(node);
- node = get_Proj_pred(node);
- }
-
- info = be_get_info(node);
- assert(pos < ARR_LEN(info->out_infos));
- return &info->out_infos[pos];
-}
-
static reg_out_info_t *get_out_info_n(const ir_node *node, unsigned pos)
{
const backend_info_t *info = be_get_info(node);
- assert(!is_Proj(node));
assert(pos < (unsigned)ARR_LEN(info->out_infos));
return &info->out_infos[pos];
}
out->reg = reg;
}
-const arch_register_req_t *arch_get_irn_register_req(const ir_node *node)
-{
- reg_out_info_t *out = get_out_info(node);
- return out->req;
-}
-
-arch_irn_flags_t arch_get_irn_flags(const ir_node *node)
-{
- backend_info_t *info;
- if (is_Proj(node))
- return arch_irn_flags_not_scheduled;
-
- info = be_get_info(node);
- return info->flags;
-}
-
void arch_set_irn_flags(ir_node *node, arch_irn_flags_t flags)
{
- backend_info_t *info;
-
- /* setting flags is only supported for instructions currently.
- * (mainly because we found no use for it yet and saved the space for
- * be_infos for them */
- assert(!is_Proj(node));
- info = be_get_info(node);
+ backend_info_t *const info = be_get_info(node);
info->flags = flags;
}
void arch_add_irn_flags(ir_node *node, arch_irn_flags_t flags)
{
- backend_info_t *info;
- assert(!is_Proj(node));
- info = be_get_info(node);
+ backend_info_t *const info = be_get_info(node);
info->flags |= flags;
}
bool arch_reg_is_allocatable(const arch_register_req_t *req,
const arch_register_t *reg)
{
- if (reg->type & arch_register_type_joker)
- return true;
- if (req->type == arch_register_req_type_none)
+ assert(req->type != arch_register_req_type_none);
+ if (req->cls != reg->reg_class)
return false;
- if (req->type & arch_register_req_type_limited) {
- if (reg->reg_class != req->cls)
- return false;
+ if (reg->type & arch_register_type_virtual)
+ return true;
+ if (arch_register_req_is(req, limited))
return rbitset_is_set(req->limited, reg->index);
- }
- return req->cls == reg->reg_class;
+ return true;
}
-void arch_dump_register_req(FILE *F, const arch_register_req_t *req,
+/**
+ * Print information about a register requirement in human readable form
+ * @param F output stream/file
+ * @param req The requirements structure to format.
+ */
+static void arch_dump_register_req(FILE *F, const arch_register_req_t *req,
const ir_node *node)
{
if (req == NULL || req->type == arch_register_req_type_none) {
fprintf(F, " same as");
for (i = 0; 1U << i <= other; ++i) {
if (other & (1U << i)) {
- ir_fprintf(F, " %+F", get_irn_n(skip_Proj_const(node), i));
+ ir_fprintf(F, " #%d (%+F)", i, get_irn_n(skip_Proj_const(node), i));
}
}
}
fprintf(F, " different from");
for (i = 0; 1U << i <= other; ++i) {
if (other & (1U << i)) {
- ir_fprintf(F, " %+F", get_irn_n(skip_Proj_const(node), i));
+ ir_fprintf(F, " #%d (%+F)", i, get_irn_n(skip_Proj_const(node), i));
}
}
}
void arch_dump_reqs_and_registers(FILE *F, const ir_node *node)
{
- int n_ins = get_irn_arity(node);
+ backend_info_t *const info = be_get_info(node);
+ int const n_ins = get_irn_arity(node);
+ /* don't fail on invalid graphs */
+ if (!info || (!info->in_reqs && n_ins != 0) || !info->out_infos) {
+ fprintf(F, "invalid register requirements!!!\n");
+ return;
+ }
+
for (int i = 0; i < n_ins; ++i) {
const arch_register_req_t *req = arch_get_irn_register_req_in(node, i);
fprintf(F, "inreq #%d = ", i);
arch_dump_register_req(F, req, node);
fputs("\n", F);
}
- unsigned n_outs = arch_get_irn_n_outs(node);
- for (unsigned o = 0; o < n_outs; ++o) {
+ be_foreach_out(node, o) {
const arch_register_req_t *req = arch_get_irn_register_req_out(node, o);
fprintf(F, "outreq #%u = ", o);
arch_dump_register_req(F, req, node);
- fputs("\n", F);
- }
- for (unsigned o = 0; o < n_outs; ++o) {
- const arch_register_t *reg = arch_get_irn_register_out(node, o);
- const arch_register_req_t *req = arch_get_irn_register_req_out(node, o);
- if (req->cls == NULL)
- continue;
- fprintf(F, "reg #%u = %s\n", o, reg != NULL ? reg->name : "n/a");
+ const arch_register_t *reg = arch_get_irn_register_out(node, o);
+ fprintf(F, " [%s]\n", reg != NULL ? reg->name : "n/a");
}
fprintf(F, "flags =");