/*
- * Copyright (C) 1995-2008 University of Karlsruhe. All right reserved.
- *
* This file is part of libFirm.
- *
- * This file may be distributed and/or modified under the terms of the
- * GNU General Public License version 2 as published by the Free Software
- * Foundation and appearing in the file LICENSE.GPL included in the
- * packaging of this file.
- *
- * Licensees holding valid libFirm Professional Edition licenses may use
- * this file in accordance with the libFirm Commercial License.
- * Agreement provided with the Software.
- *
- * This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
- * WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE.
+ * Copyright (C) 2012 University of Karlsruhe.
*/
/**
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_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];
}
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;
}
return false;
if (reg->type & arch_register_type_virtual)
return true;
- if (req->type & arch_register_req_type_limited)
+ if (arch_register_req_is(req, limited))
return rbitset_is_set(req->limited, reg->index);
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 =");