arch_spec: Remove remnants of unused operands.
[libfirm] / ir / be / scripts / generate_new_opcodes.pl
index 649ca5b..c992ea2 100755 (executable)
@@ -36,7 +36,6 @@ my $line_nr    = 0;
 our $arch;
 our $additional_opcodes;
 our %nodes;
-our %operands;
 our %cpu;
 our $default_op_attr_type;
 our $default_attr_type;
@@ -81,33 +80,6 @@ if(! %compare_attr) {
        );
 }
 
-# Operands are really just nodes with some special constraints, we check
-# these and create new entries in the nodes hashmap
-foreach my $op (keys(%operands)) {
-       my %operand = %{ $operands{"$op"} };
-       my %op_node;
-
-       # constraints
-       if(defined($operand{op_flags})) { die "Fatal error: operands can't have op_flags ($op)"; }
-       if(defined($operand{cmp_attr})) { die "Fatal error: cmp_attr not allowed for operands ($op)"; }
-       if(defined($operand{mode})) { die "Operand must not have a mode defined ($op)"; }
-       if(defined($operand{out_arity})) { die "operand must not have out_arity defined ($op)"; }
-       if(defined($nodes{$op})) { die "$op defined as operand and as node"; };
-
-
-       foreach my $flag (keys(%operand)) {
-               $op_node{$flag} = $operand{$flag};
-       }
-       $op_node{op_flags} = "O";
-       $op_node{cmp_attr} = 'return 1;';
-       $op_node{mode}     = 'mode_ANY';
-
-       $nodes{$op} = \%op_node;
-}
-
-#print Dumper(%nodes);
-#print Dumper(%operands);
-
 # create c code file from specs
 
 my @obst_limit_func;
@@ -116,6 +88,7 @@ my @obst_opvar;       # stack for the "ir_op *op_<arch>_<op-name> = NULL;" state
 my @obst_get_opvar;   # stack for the get_op_<arch>_<op-name>() 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 <arch>_opcode enum
 my $obst_header;      # stack for function prototypes
 my @obst_is_archirn;  # stack for the is_$arch_irn() function
@@ -159,6 +132,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;
@@ -650,33 +624,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 +647,39 @@ 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_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, "\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");
 
@@ -817,38 +786,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<<ENDOFMAIN;
-
-       if (run_once)
-               return;
-       run_once = 1;
-
-       cur_opcode = get_next_ir_opcodes(iro_$arch\_last);
+void $arch\_create_opcodes(const arch_irn_ops_t *be_ops)
+{
+       ir_op *op;
+       int    cur_opcode = get_next_ir_opcodes(iro_$arch\_last);
 
        $arch\_opcode_start = cur_opcode;
 ENDOFMAIN
 
-       if (defined($default_op_attr_type)) {
-               print OUT "\tattrs = XMALLOCNZ(${default_op_attr_type}, iro_${arch}_last);\n";
-       }
-
 print OUT @obst_new_irop;
 print OUT "\n";
 print OUT "\t$arch\_register_additional_opcodes(cur_opcode);\n" if (defined($additional_opcodes));
 print OUT "\t$arch\_opcode_end = cur_opcode + iro_$arch\_last";
 print OUT " + $additional_opcodes" if (defined($additional_opcodes));
 print OUT ";\n";
-print OUT "}\n";
+print OUT <<ENDOFMAIN;
+}
+
+void $arch\_free_opcodes(void)
+{
+ENDOFMAIN
+
+print OUT @obst_free_irop;
+
+print OUT <<ENDOFMAIN;
+}
+ENDOFMAIN
 
 close(OUT);