X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=ir%2Fbe%2Fscripts%2Fgenerate_new_opcodes.pl;h=9f40503d8ba8ffbcfcbe64a26fdaf5fb9fff9493;hb=df2faee01a5832057bb3ca0ba5f67e979c916e19;hp=c992ea2a85999b27aff66736fc12b9a703ae1956;hpb=30b992a490bfdcccb934dbe90710b663898c001f;p=libfirm diff --git a/ir/be/scripts/generate_new_opcodes.pl b/ir/be/scripts/generate_new_opcodes.pl index c992ea2a8..9f40503d8 100755 --- a/ir/be/scripts/generate_new_opcodes.pl +++ b/ir/be/scripts/generate_new_opcodes.pl @@ -29,15 +29,9 @@ use Data::Dumper; my $specfile = $ARGV[0]; my $target_dir = $ARGV[1]; -my $state = 1; -my $cur_op = ""; -my $line_nr = 0; our $arch; -our $additional_opcodes; our %nodes; -our %cpu; -our $default_op_attr_type; our $default_attr_type; our $default_cmp_attr; our $default_copy_attr; @@ -82,18 +76,17 @@ if(! %compare_attr) { # create c code file from specs -my @obst_limit_func; -my @obst_reg_reqs; -my @obst_opvar; # stack for the "ir_op *op__ = NULL;" statements -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 -my @obst_cmp_attr; # stack for the compare attribute functions -my $obst_proj = ""; # stack for the pn_ numbers +my $obst_limit_func = ""; # +my $obst_reg_reqs = ""; # +my $obst_opvar = ""; # buffer for the "ir_op *op__ = NULL;" statements +my $obst_get_opvar = ""; # buffer for the get_op__() functions +my $obst_constructor = ""; # buffer for node constructor functions +my $obst_new_irop = ""; # buffer for the new_ir_op calls +my $obst_free_irop = ""; # buffer for free_ir_op calls +my $obst_enum_op = ""; # buffer for creating the _opcode enum +my $obst_header = ""; # buffer for function prototypes +my $obst_cmp_attr = ""; # buffer for the compare attribute functions +my $obst_proj = ""; # buffer for the pn_ numbers my $orig_op; my $arity; my $cmp_attr_func; @@ -128,9 +121,6 @@ foreach my $class_name (keys(%reg_classes)) { } -# for registering additional opcodes -$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"; @@ -446,7 +436,22 @@ EOF $obst_constructor .= "}\n\n"; } -push(@obst_enum_op, "typedef enum ${arch}_opcodes {\n"); +my @node_attrs = ( + "args", + "arity", + "attr", + "comment", + "custominit", + "init_attr", + "ins", + "irn_flags", + "mode", + "out_arity", + "outs", + "reg_req", +); + +$obst_enum_op .= "typedef enum ${arch}_opcodes {\n"; foreach my $op (keys(%nodes)) { my %n = %{ $nodes{"$op"} }; my $known_mode; @@ -536,11 +541,9 @@ foreach my $op (keys(%nodes)) { } # Create opcode - push(@obst_opvar, "ir_op *op_$op = NULL;\n"); - push(@obst_get_opvar, "ir_op *get_op_$op(void) { return op_$op; }\n"); - push(@obst_get_opvar, "int is_$op(const ir_node *n) { return get_$arch\_irn_opcode(n) == iro_$op; }\n\n"); - - push(@obst_is_archirn, "is_$op(node)"); + $obst_opvar .= "ir_op *op_$op = NULL;\n"; + $obst_get_opvar .= "ir_op *get_op_$op(void) { return op_$op; }\n"; + $obst_get_opvar .= "int is_$op(const ir_node *n) { return get_$arch\_irn_opcode(n) == iro_$op; }\n\n"; $obst_header .= <ops.be_ops = be_ops;\n"); - push(@obst_new_irop, "\top->ops.dump_node = ${dump_func};\n"); + $obst_new_irop .= $temp; + $obst_new_irop .= "\top->ops.be_ops = be_ops;\n"; + $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"); + $obst_new_irop .= "\top->ops.node_cmp_attr = ${cmp_attr_func};\n"; } my $copy_attr_func = $copy_attr{$attr_type}; if (!defined($copy_attr_func)) { @@ -663,49 +663,43 @@ EOF } } if (defined($copy_attr_func)) { - push(@obst_new_irop, "\top->ops.copy_attr = ${copy_attr_func};\n"); + $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"); + $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"); + $obst_new_irop .= "\tir_op_set_memory_index(op, n_${op}_mem);\n"; + $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"); + $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"); + $obst_new_irop .= "\t".$n{op_attr_init}."\n"; } - push(@obst_new_irop, "\top_${op} = op;\n"); + $obst_new_irop .= "\top_${op} = op;\n"; - push(@obst_free_irop, "\tfree_ir_op(op_$op); op_$op = NULL;\n"); + $obst_free_irop .= "\tfree_ir_op(op_$op); op_$op = NULL;\n"; - push(@obst_enum_op, "\tiro_$op,\n"); + $obst_enum_op .= "\tiro_$op,\n"; $obst_header .= "\n"; } -push(@obst_enum_op, "\tiro_$arch\_last_generated,\n"); -push(@obst_enum_op, "\tiro_$arch\_last = iro_$arch\_last_generated"); -push(@obst_enum_op, " + $additional_opcodes") if (defined($additional_opcodes)); -push(@obst_enum_op, "\n} $arch\_opcodes;\n\n"); +$obst_enum_op .= "\tiro_$arch\_last\n"; +$obst_enum_op .= "} $arch\_opcodes;\n\n"; # emit the code open(OUT, ">$target_c") || die("Fatal error: Could not open $target_c, reason: $!\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"; -print OUT @obst_opvar; -print OUT "\n"; -print OUT @obst_get_opvar; -print OUT "\n"; - print OUT<= 4) { $d = uc(substr($arch, 3, 1)); } -print OUT<