X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=ir%2Fbe%2Fscripts%2Fgenerate_new_opcodes.pl;h=7cd2679386a20cd760ca80e0668985624671425e;hb=edb89fdd5733701e759588fca01691b30309b093;hp=205a01d45bf618d125e274d0fccb7fea6b40dbac;hpb=c2e55800e76ff59722d4774e212908cda1dae592;p=libfirm diff --git a/ir/be/scripts/generate_new_opcodes.pl b/ir/be/scripts/generate_new_opcodes.pl index 205a01d45..7cd267938 100755 --- a/ir/be/scripts/generate_new_opcodes.pl +++ b/ir/be/scripts/generate_new_opcodes.pl @@ -67,7 +67,7 @@ my $target_h = $target_dir."/gen_".$arch."_new_nodes.h"; 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, irn_flags_, in_reqs, n_res);", ); @@ -75,7 +75,7 @@ if(!defined(%init_attr)) { 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}", ); @@ -116,6 +116,7 @@ my @obst_opvar; # stack for the "ir_op *op__ = NULL;" state my @obst_get_opvar; # stack for the get_op__() functions my $obst_constructor; # stack for node constructor functions my @obst_new_irop; # stack for the new_ir_op calls +my @obst_free_irop; # stack for free_ir_op calls my @obst_enum_op; # stack for creating the _opcode enum my $obst_header; # stack for function prototypes my @obst_is_archirn; # stack for the is_$arch_irn() function @@ -159,6 +160,7 @@ foreach my $class_name (keys(%reg_classes)) { $n_opcodes += $additional_opcodes if (defined($additional_opcodes)); $obst_header .= "void ${arch}_create_opcodes(const arch_irn_ops_t *be_ops);\n"; +$obst_header .= "void ${arch}_free_opcodes(void);\n"; sub create_constructor { my $op = shift; @@ -409,7 +411,7 @@ EOF "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"}}) { @@ -650,33 +652,10 @@ EOF $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 = ${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)) { - 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"); - } - if (defined($hash_func)) { - push(@obst_new_irop, "\tops.hash = ${hash_func};\n"); - } - my %known_flags = map { $_ => 1 } ( - "none", "labeled", "commutative", "cfopcode", "unknown_jump", "fragile", - "forking", "highlevel", "constlike", "always_opt", "keep", - "start_block", "uses_memory", "dump_noblock", "dump_noinput", - "cse_neutral" + "none", "commutative", "cfopcode", "unknown_jump", "fragile", + "forking", "highlevel", "constlike", "keep", "start_block", + "uses_memory", "dump_noblock", "cse_neutral" ); my $is_fragile = 0; foreach my $flag (@{$n{"op_flags"}}) { @@ -696,21 +675,40 @@ EOF } $n_opcodes++; - $temp = "\top_$op = new_ir_op(cur_opcode + iro_$op, \"$op\", op_pin_state_".$n{"state"}.", $op_flags"; - $temp .= ", ".translate_arity($arity).", 0, ${attr_size}, &ops);\n"; + $temp = "\top = new_ir_op(cur_opcode + iro_$op, \"$op\", op_pin_state_".$n{"state"}.", $op_flags"; + $temp .= ", ".translate_arity($arity).", 0, ${attr_size});\n"; push(@obst_new_irop, $temp); - if ($is_fragile) { - push(@obst_new_irop, "\tir_op_set_fragile_indices(op_${op}, n_${op}_mem, pn_${op}_X_regular, pn_${op}_X_except);\n"); + push(@obst_new_irop, "\top->ops.be_ops = be_ops;\n"); + push(@obst_new_irop, "\top->ops.dump_node = ${dump_func};\n"); + if (defined($cmp_attr_func)) { + push(@obst_new_irop, "\top->ops.node_cmp_attr = ${cmp_attr_func};\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"); - if(defined($n{op_attr_init})) { - push(@obst_new_irop, "\t".$n{op_attr_init}."\n"); + my $copy_attr_func = $copy_attr{$attr_type}; + if (!defined($copy_attr_func)) { + # don't set a copy_attr function if the node has no additional attributes. + if ($attr_type ne "") { + $copy_attr_func = $default_copy_attr; } - push(@obst_new_irop, "\tset_op_attr(op_$op, attr);\n"); + } + if (defined($copy_attr_func)) { + push(@obst_new_irop, "\top->ops.copy_attr = ${copy_attr_func};\n"); + } + if (defined($hash_func)) { + push(@obst_new_irop, "\top->ops.hash = ${hash_func};\n"); } + if ($is_fragile) { + push(@obst_new_irop, "\tir_op_set_memory_index(op, n_${op}_mem);\n"); + push(@obst_new_irop, "\tir_op_set_fragile_indices(op, pn_${op}_X_regular, pn_${op}_X_except);\n"); + } + push(@obst_new_irop, "\tset_op_tag(op, $arch\_op_tag);\n"); + if(defined($n{op_attr_init})) { + push(@obst_new_irop, "\t".$n{op_attr_init}."\n"); + } + push(@obst_new_irop, "\top_${op} = op;\n"); + + push(@obst_free_irop, "\tfree_ir_op(op_$op); op_$op = NULL;\n"); + push(@obst_enum_op, "\tiro_$op,\n"); $obst_header .= "\n"; @@ -726,6 +724,7 @@ open(OUT, ">$target_c") || die("Fatal error: Could not open $target_c, reason: $ 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"; @@ -815,38 +814,32 @@ $obst_constructor * Creates the $arch specific Firm machine operations * needed for the assembler irgs. */ -void $arch\_create_opcodes(const arch_irn_ops_t *be_ops) { - ir_op_ops ops; - int cur_opcode; - static int run_once = 0; -ENDOFMAIN - - if (defined($default_op_attr_type)) { - print OUT "\t$default_op_attr_type *attr, *attrs;\n"; - } - -print OUT<