#include "util.h"
#include "debug.h"
#include "fourcc.h"
+#include "bitfiddle.h"
#include "irop_t.h"
#include "irmode_t.h"
return irn;
}
-ir_node *be_new_IncSP(const arch_register_t *sp, ir_graph *irg, ir_node *bl, ir_node *old_sp, unsigned offset, be_stack_dir_t dir)
+ir_node *be_new_IncSP(const arch_register_t *sp, ir_graph *irg, ir_node *bl, ir_node *old_sp, ir_node *mem, unsigned offset, be_stack_dir_t dir)
{
be_stack_attr_t *a;
ir_node *irn;
ir_node *in[1];
in[0] = old_sp;
- irn = new_ir_node(NULL, irg, bl, op_IncSP, sp->reg_class->mode, 1, in);
+ in[1] = mem;
+ irn = new_ir_node(NULL, irg, bl, op_IncSP, sp->reg_class->mode, 2, in);
a = init_node_attr(irn, sp->reg_class, irg, 1);
a->dir = dir;
a->offset = offset;
static arch_irn_flags_t be_node_get_flags(const void *_self, const ir_node *irn)
{
+ int out_pos;
be_node_attr_t *a;
- redir_proj((const ir_node **) &irn, -1);
+ out_pos = redir_proj((const ir_node **) &irn, -1);
+ a = get_irn_attr(irn);
+
assert(is_be_node(irn));
- a = get_irn_attr(irn);
- return a->max_reg_data > 0 ? a->reg_data[0].req.flags : arch_irn_flags_none;
+ assert(out_pos < a->max_reg_data && "position too high");
+
+ return a->reg_data[out_pos].req.flags;
}
static const arch_irn_ops_if_t be_node_irn_ops_if = {
be_node_get_arch_ops
};
+
+static void dump_node_req(FILE *f, be_req_t *req)
+{
+ int i;
+ int did_something = 0;
+ const char *suffix = "";
+
+ if(req->flags != arch_irn_flags_none) {
+ fprintf(f, "flags: ");
+ for(i = arch_irn_flags_none; i <= log2_ceil(arch_irn_flags_last); ++i) {
+ if(req->flags & (1 << i)) {
+ fprintf(f, "%s%s", suffix, arch_irn_flag_str(1 << i));
+ suffix = "|";
+ }
+ }
+ suffix = ", ";
+ did_something = 1;
+ }
+
+ if(req->req.cls != 0) {
+ char tmp[256];
+ fprintf(f, suffix);
+ arch_register_req_format(tmp, sizeof(tmp), &req->req);
+ fprintf(f, "%s", tmp);
+ did_something = 1;
+ }
+
+ if(did_something)
+ fprintf(f, "\n");
+}
+
+static void dump_node_reqs(FILE *f, ir_node *irn)
+{
+ int i;
+ be_node_attr_t *a = get_irn_attr(irn);
+
+ fprintf(f, "registers: \n");
+ for(i = 0; i < a->max_reg_data; ++i) {
+ be_reg_data_t *rd = &a->reg_data[i];
+ if(rd->reg)
+ fprintf(f, "#%d: %s\n", i, rd->reg->name);
+ }
+
+ fprintf(f, "in requirements\n");
+ for(i = 0; i < a->max_reg_data; ++i) {
+ dump_node_req(f, &a->reg_data[i].in_req);
+ }
+
+ fprintf(f, "\nout requirements\n");
+ for(i = 0; i < a->max_reg_data; ++i) {
+ dump_node_req(f, &a->reg_data[i].req);
+ }
+}
+
static int dump_node(ir_node *irn, FILE *f, dump_reason_t reason)
{
be_node_attr_t *at = get_irn_attr(irn);
- int i;
assert(is_be_node(irn));
case dump_node_nodeattr_txt:
break;
case dump_node_info_txt:
- fprintf(f, "reg class: %s\n", at->cls ? at->cls->name : "n/a");
- for(i = 0; i < at->max_reg_data; ++i) {
- const arch_register_t *reg = at->reg_data[i].reg;
- fprintf(f, "reg #%d: %s\n", i, reg ? reg->name : "n/a");
- }
+ dump_node_reqs(f, irn);
switch(be_get_irn_opcode(irn)) {
case beo_Spill: