- # we have additional attribute arguements
- if (exists($n{"attr"})) {
- $complete_args .= ", ".$n{"attr"};
- }
-
- $temp .= "$complete_args)";
- push(@obst_constructor, $temp."\n{\n");
- push(@obst_header, $comment);
- push(@obst_header, $temp.";\n");
-
- # emit constructor code
- if (!exists($n{"rd_constructor"})) { # default constructor
- $temp = "\tir_node *res;\n";
- $temp .= "\tir_op *op = op_${op};\n";
- $temp .= "\tint flags = 0;\n";
-
- if($arity == $ARITY_DYNAMIC) {
- $temp .= "\tint arity = -1;\n";
- $temp .= "\tir_node **in = NULL;\n";
- } elsif($arity == $ARITY_VARIABLE) {
- } else {
- $temp .= "\tint arity = $arity;\n";
- if($arity > 0) {
- $temp .= "\tir_node *in[$arity];\n";
- } else {
- $temp .= "\tir_node **in = NULL;\n";
- }
- }
- if($out_arity == $ARITY_DYNAMIC) {
- $temp .= "\tint n_res = -1;\n";
- } elsif($out_arity == $ARITY_VARIABLE) {
- } else {
- $temp .= "\tint n_res = ${out_arity};\n";
- }
-
- my $latency = $n{"latency"};
- if (!defined($latency)) {
- $latency = 1;
- }
- $temp .= "\tunsigned latency = ${latency};\n";
-
- if (defined($known_mode)) {
- $temp .= "\tir_mode *mode = ${known_mode};\n";
- }
-
- # set up static variables for cpu execution unit assigments
- if (exists($n{"units"})) {
- $temp .= gen_execunit_list_initializer($n{"units"});
- } else {
- $temp .= "\tstatic const be_execution_unit_t ***exec_units = NULL;\n";
- }
-
- undef my $in_req_var;
- undef my $out_req_var;
-
- # set up static variables for requirements and registers
- if (exists($n{"reg_req"})) {
- my %req = %{ $n{"reg_req"} };
- my $idx;
-
- undef my @in;
- @in = @{ $req{"in"} } if (exists($req{"in"}));
- undef my @out;
- @out = @{ $req{"out"} } if exists(($req{"out"}));
-
- for(my $idx = 0; $idx < $#in; $idx++) {
- my $req = $in[$idx];
- generate_requirements($req, \%n, $op, $idx, 1);
- }
- for(my $idx = 0; $idx < $#out; $idx++) {
- my $req = $out[$idx];
- generate_requirements($req, \%n, $op, $idx, 0);
- }
-
- if (@in) {
- if($arity >= 0 && scalar(@in) != $arity) {
- die "Fatal error: Arity and number of in requirements don't match for ${op}\n";
- }
-
- $temp .= "\tstatic const arch_register_req_t *in_reqs[] =\n";
- $temp .= "\t{\n";
- for ($idx = 0; $idx <= $#in; $idx++) {
- my $req = $in[$idx];
- my $reqstruct = generate_requirements($req, \%n, $op, $idx, 1);
- $temp .= "\t\t& ${reqstruct},\n";
- }
- $temp .= "\t};\n";
- } else {
- if($arity > 0) {
- die "Fatal error: need in requirements for ${op}\n";
- }
- $temp .= "\tstatic const arch_register_req_t **in_reqs = NULL;\n";
- }
-
- if (@out) {
- if($out_arity >= 0 && scalar(@out) != $out_arity) {
- die "Fatal error: Out-Arity and number of out requirements don't match for ${op}\n";
- }
-
- $temp .= "\tstatic const arch_register_req_t *out_reqs[] =\n";
- $temp .= "\t{\n";
- for ($idx = 0; $idx <= $#out; $idx++) {
- my $req = $out[$idx];
- my $reqstruct = generate_requirements($req, \%n, $op, $idx, 0);
- $temp .= "\t\t& ${reqstruct},\n";
- }
- $temp .= "\t};\n";
- } else {
- if($out_arity > 0) {
- die "Fatal error: need out requirements for ${op}\n";
- }
- $temp .= "\tstatic const arch_register_req_t **out_reqs = NULL;\n";
- }
- } else {
- $temp .= "\tstatic const arch_register_req_t **in_reqs = NULL;\n";
- $temp .= "\tstatic const arch_register_req_t **out_reqs = NULL;\n";
- }
- if(exists($n{"init_attr"})) {
- $temp .= "\t${attr_type} *attr;\n";
- }
-
- $temp .= "\n";
-
- if($arity > 0) {
- $temp .= "\t/* construct in array */\n";
- for (my $i = 0; $i < $arity; $i++) {
- my $opname = "op${i}";
- if (exists($n{"ins"})) {
- my @ins = @{ $n{"ins"} };
- $opname = $ins[$i];
- }
-
- $temp .= "\tin[${i}] = ${opname};\n";
- }
- $temp .= "\n";
- }
-
- # set flags
- if (exists($n{"irn_flags"})) {
- $temp .= "\t/* flags */\n";
- foreach my $flag (split(/\|/, $n{"irn_flags"})) {
- if ($flag eq "R") {
- $temp .= "\tflags |= arch_irn_flags_rematerializable;\n";
- } elsif ($flag eq "N") {
- $temp .= "\tflags |= arch_irn_flags_dont_spill;\n";
- } elsif ($flag eq "I") {
- $temp .= "\tflags |= arch_irn_flags_ignore;\n";
- } elsif ($flag eq "S") {
- $temp .= "\tflags |= arch_irn_flags_modify_sp;\n";
- }
- }
- $temp .= "\n";
- }
-
- $temp .= "\t/* create node */\n";
- $temp .= "\tassert(op != NULL);\n";
- $temp .= "\tres = new_ir_node(db, irg, block, op, mode, arity, in);\n";
- $temp .= "\n";
-
- $temp .= "\t/* init node attributes */\n";
- # lookup init function
- my $attr_init_code = $init_attr{$attr_type};
- if(!defined($attr_init_code)) {
- die "Fatal error: Couldn't find attribute initialisation code for type '${attr_type}'";
- }
- $temp .= "${attr_init_code}\n";
- $temp .= "\n";
-
- # set flags for outs
- if ($#out_flags >= 0) {
- $temp .= "\t/* set flags for outs */\n";
- for (my $idx = 0; $idx <= $#out_flags; $idx++) {
- my $flags = "";
- my $prefix = "";
-
- foreach my $flag (split(/\|/, $out_flags[$idx])) {
- if ($flag eq "I") {
- $flags .= $prefix."arch_irn_flags_ignore";
- $prefix = " | ";
- }
- elsif ($flag eq "S") {
- $flags .= $prefix."arch_irn_flags_modify_sp";
- $prefix = " | ";
- }
- }
-
- $temp .= "\tset_$arch\_out_flags(res, $flags, $idx);\n";
- }
- $temp .= "\n";
- }
-
-
- if (exists($n{"init_attr"})) {
- $temp .= "\tattr = get_irn_generic_attr(res);\n";
- $temp .= "\t".$n{"init_attr"}."\n";