# their coresponding node constructors for all operations in a given spec
# so they can be used as normal firm nodes.
# Creation: 2005/10/19
-# $Id$
use strict;
use Data::Dumper;
if(!defined($default_attr_type)) {
$default_attr_type = "${arch}_attr_t";
}
-if(!defined(%init_attr)) {
+if(! %init_attr) {
%init_attr = (
- "$default_attr_type" => "\tinit_${arch}_attributes(res, flags, in_reqs, exec_units, n_res);",
+ "$default_attr_type" => "\tinit_${arch}_attributes(res, irn_flags_, in_reqs, n_res);",
);
}
if(!defined($default_cmp_attr)) {
$default_cmp_attr = "${arch}_compare_attr";
}
-if(!defined(%compare_attr)) {
+if(! %compare_attr) {
%compare_attr = (
"${default_attr_type}" => "${default_cmp_attr}",
);
# emit constructor code
$temp = <<EOF;
+ ir_graph *irg = get_irn_irg(block);
+ ir_op *op = op_${arch}_${op};
+ arch_irn_flags_t irn_flags_ = arch_irn_flags_none;
ir_node *res;
- ir_op *op = op_${arch}_${op};
- arch_irn_flags_t flags = arch_irn_flags_none;
backend_info_t *info;
EOF
EOF
}
- # set up static variables for cpu execution unit assigments
- if (exists($n->{"units"})) {
- $temp .= gen_execunit_list_initializer($n->{"units"});
- } else {
- $temp .= <<EOF;
- static const be_execution_unit_t ***exec_units = NULL;
-EOF
- }
-
undef my $in_req_var;
undef my $out_req_var;
"simple_jump" => "arch_irn_flags_simple_jump",
"not_scheduled" => "arch_irn_flags_not_scheduled",
);
- if (defined(%custom_irn_flags)) {
+ if (%custom_irn_flags) {
%known_irn_flags = (%known_irn_flags, %custom_irn_flags);
}
foreach my $flag (@{$n->{"irn_flags"}}) {
if (not defined($known_irn_flags{$flag})) {
print STDERR "WARNING: irn_flag '$flag' in opcode $op is unknown\n";
} else {
- $temp .= "\tflags |= " . $known_irn_flags{$flag} . ";\n";
+ $temp .= "\tirn_flags_ |= " . $known_irn_flags{$flag} . ";\n";
}
}
$temp .= "\n";
}
# lookup init function
- my $attr_init_code = "(void)in;(void)exec_units;(void)flags;(void)in_reqs;(void)n_res;";
+ my $attr_init_code = "(void)in;(void)irn_flags_;(void)in_reqs;(void)n_res;";
if ($attr_type ne "") {
$attr_init_code = $init_attr{$attr_type};
if(!defined($attr_init_code)) {
$temp .= <<EOF;
/* create node */
assert(op != NULL);
- res = new_ir_node(dbgi, current_ir_graph, block, op, mode, arity, in);
+ res = new_ir_node(dbgi, irg, block, op, mode, arity, in);
/* init node attributes */
${attr_init_code}
if (exists($n->{"init_attr"})) {
$temp .= "\tattr = (${attr_type}*)get_irn_generic_attr(res);\n";
+ $temp .= "\t(void) attr; /* avoid potential warning */\n";
$temp .= "\t".$n->{"init_attr"}."\n";
}
$temp .= <<EOF;
/* optimize node */
res = optimize_node(res);
- irn_verify_irg(res, current_ir_graph);
+ irn_verify_irg(res, irg);
return res;
EOF
}
# set default values for state and flags if not given
- $n{"state"} = "floats" if (! exists($n{"state"}));
- $n{"op_flags"} = ["none"] if (! exists($n{"op_flags"}));
+ $n{"state"} = "floats" if (! exists($n{"state"}));
+ $n{"op_flags"} = ["none"] if (! exists($n{"op_flags"}));
+ $n{"dump_func"} = "${arch}_dump_node" if (!exists($n{"dump_func"}));
+ my $dump_func = $n{"dump_func"};
push(@obst_new_irop, "\n\tmemset(&ops, 0, sizeof(ops));\n");
push(@obst_new_irop, "\tops.be_ops = be_ops;\n");
- push(@obst_new_irop, "\tops.dump_node = $arch\_dump_node;\n");
+ push(@obst_new_irop, "\tops.dump_node = ${dump_func};\n");
if (defined($cmp_attr_func)) {
push(@obst_new_irop, "\tops.node_cmp_attr = ${cmp_attr_func};\n");
}
my $copy_attr_func = $copy_attr{$attr_type};
if (!defined($copy_attr_func)) {
- $copy_attr_func = $default_copy_attr;
+ if ($attr_type eq "") {
+ $copy_attr_func = "NULL";
+ } else {
+ $copy_attr_func = $default_copy_attr;
+ }
}
if (defined($copy_attr_func)) {
push(@obst_new_irop, "\tops.copy_attr = ${copy_attr_func};\n");
"none", "labeled", "commutative", "cfopcode", "unknown_jump", "fragile",
"forking", "highlevel", "constlike", "always_opt", "keep",
"start_block", "uses_memory", "dump_noblock", "dump_noinput",
- "machine", "machine_op", "cse_neutral"
+ "cse_neutral"
);
+ my $is_fragile = 0;
foreach my $flag (@{$n{"op_flags"}}) {
if (not defined($known_flags{$flag})) {
print STDERR "WARNING: Flag '$flag' in opcode $op is unknown\n";
}
+ if ($flag eq "fragile") {
+ $is_fragile = 1;
+ }
}
my @mapped = map { "irop_flag_$_" } @{$n{"op_flags"}};
my $op_flags = join('|', @mapped);
$n_opcodes++;
$temp = "\top_$op = new_ir_op(cur_opcode + iro_$op, \"$op\", op_pin_state_".$n{"state"}.", $op_flags";
- $temp .= "|irop_flag_machine, ".translate_arity($arity).", 0, ${attr_size}, &ops);\n";
+ $temp .= ", ".translate_arity($arity).", 0, ${attr_size}, &ops);\n";
push(@obst_new_irop, $temp);
+ if ($is_fragile) {
+ push(@obst_new_irop, "\tir_op_set_memory_index(op_${op}, n_${op}_mem);\n");
+ push(@obst_new_irop, "\tir_op_set_fragile_indices(op_${op}, pn_${op}_X_regular, pn_${op}_X_except);\n");
+ }
push(@obst_new_irop, "\tset_op_tag(op_$op, $arch\_op_tag);\n");
if(defined($default_op_attr_type)) {
push(@obst_new_irop, "\tattr = &attrs[iro_$op];\n");
print OUT "#include \"gen_$arch\_regalloc_if.h\"\n";
print OUT "#include \"irverify_t.h\"\n";
+print OUT "#include \"fourcc.h\"\n";
print OUT "\n";
print OUT @obst_cmp_attr;
print OUT "\n";
}
}
-###
-# Return the list of pointers for the given execution units.
-###
-sub gen_execunit_list_initializer {
- my $units = shift;
- my $uc_arch = uc($arch);
- my $ret = "";
- my $ret2 = "";
- my %init;
-
- foreach my $unit (@{ $units }) {
- if ($unit eq "DUMMY") {
- push(@{ $init{"DUMMY"} }, "\t\t&be_machine_execution_units_DUMMY[0]");
- }
- elsif (exists($cpu{"$unit"})) {
- # operation can be executed on all units of this type
- # -> add them all
- my $tp_name = "$arch\_execution_units_$unit";
- my $idx = 0;
- foreach (@{ $cpu{"$unit"} }) {
- next if ($idx++ == 0); # skip first element (it's not a unit)
- my $unit_name = "$uc_arch\_EXECUNIT_TP_$unit\_$_";
- push(@{ $init{"$unit"} }, "\t\t&".$tp_name."[".$unit_name."]");
- }
- }
- else {
- # operation can be executed only a certain unit
- # -> find corresponding unit type
- my $found = 0;
-TP_SEARCH: foreach my $cur_type (keys(%cpu)) {
- foreach my $cur_unit (@{ $cpu{"$cur_type"} }) {
- if ($unit eq $cur_unit) {
- my $tp_name = "$arch\_execution_units_$cur_type";
- my $unit_name = "$uc_arch\_EXECUNIT_TP_$cur_type\_$unit";
- push(@{ $init{"$unit"} }, "\t\t&".$tp_name."[".$unit_name."]");
- $found = 1;
- last TP_SEARCH;
- }
- }
- }
-
- if (! $found) {
- print STDERR "Invalid execution unit $unit specified!\n";
- }
- }
- }
-
- # prepare the 2-dim array init
- foreach my $key (keys(%init)) {
- $ret .= "\tstatic const be_execution_unit_t *allowed_units_".$key."[] =\n";
- $ret .= "\t{\n";
- foreach (@{ $init{"$key"} }) {
- $ret .= "$_,\n";
- }
- $ret .= "\t\tNULL\n";
- $ret .= "\t};\n";
- $ret2 .= "\t\tallowed_units_$key,\n";
- }
- $ret2 .= "\t\tNULL\n";
-
- $ret .= "\tstatic const be_execution_unit_t **exec_units[] =\n";
- $ret .= "\t{\n";
- $ret .= $ret2;
- $ret .= "\t};\n";
-
- return $ret;
-}
-
sub mangle_requirements {
my $reqs = shift;
my $class = shift;