X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=ir%2Fbe%2Fscripts%2Fgenerate_new_opcodes.pl;h=3e353e62fdc69f04c5aaa27a0fded10b96c22884;hb=248af0e1d8280f21f356bb148ecdf11f2e7a6093;hp=4e35413febd03c6d15a4c0ab335fa756876baffc;hpb=637450acaf2ef255b2841785a6c6e6b809c9ac27;p=libfirm diff --git a/ir/be/scripts/generate_new_opcodes.pl b/ir/be/scripts/generate_new_opcodes.pl index 4e35413fe..3e353e62f 100755 --- a/ir/be/scripts/generate_new_opcodes.pl +++ b/ir/be/scripts/generate_new_opcodes.pl @@ -48,6 +48,7 @@ our $custom_init_attr_func; our %compare_attr; our %copy_attr; our %reg_classes; +our %custom_irn_flags; # include spec file @@ -269,10 +270,11 @@ sub create_constructor { # emit constructor code $temp = <out_infos[${idx}].req = &${reqstruct}; + info->out_infos[${idx}].req = &${reqstruct}; EOF } } else { @@ -409,23 +411,34 @@ EOF # set flags if (exists($n->{"irn_flags"})) { $temp .= "\t/* flags */\n"; - my %known_irn_flags = map { $_ => 1 } ( - "none", "dont_spill", "rematerializable", - "modify_flags", "simple_jump" + my %known_irn_flags = ( + "none" => "arch_irn_flags_none", + "dont_spill" => "arch_irn_flags_dont_spill", + "rematerializable" => "arch_irn_flags_rematerializable", + "modify_flags" => "arch_irn_flags_modify_flags", + "simple_jump" => "arch_irn_flags_simple_jump", + "not_scheduled" => "arch_irn_flags_not_scheduled", ); + if (defined(%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 .= "\tflags |= arch_irn_flags_$flag;\n"; } $temp .= "\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}'"; + my $attr_init_code = "(void)in;(void)exec_units;(void)flags;(void)in_reqs;(void)n_res;"; + if ($attr_type ne "") { + $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}'"; + } } my $custominit = ""; if(defined($custom_init_attr_func)) { @@ -438,26 +451,26 @@ EOF $temp .= <{"init_attr"})) { - $temp .= "\tattr = get_irn_generic_attr(res);\n"; + $temp .= "\tattr = (${attr_type}*)get_irn_generic_attr(res);\n"; $temp .= "\t".$n->{"init_attr"}."\n"; } $temp .= < 0) { + $obst_proj .= "\nenum pn_${op} {\n"; - for (my $idx = 0; $idx <= $#outs; $idx++) { - # check, if we have additional flags annotated to out - if ($outs[$idx] =~ /:((S|I)(\|(S|I))*)/) { - push(@out_flags, $1); - $outs[$idx] =~ s/:((S|I)(\|(S|I))*)//; + for (my $idx = 0; $idx <= $#outs; $idx++) { + # check, if we have additional flags annotated to out + if ($outs[$idx] =~ /:((S|I)(\|(S|I))*)/) { + push(@out_flags, $1); + $outs[$idx] =~ s/:((S|I)(\|(S|I))*)//; + } + $obst_proj .= "\tpn_${op}_".$outs[$idx]." = ${idx},\n"; } - $obst_proj .= "\tpn_${op}_".$outs[$idx]." = ${idx},\n"; - } - $obst_proj .= "};\n"; + $obst_proj .= "};\n"; + } # outs have names, it must be a mode_T node if (!defined($n{mode})) { $n{mode} = "mode_T"; @@ -546,11 +561,13 @@ foreach my $op (keys(%nodes)) { die "Fatal error: Op ${op} has different number of ins and arity\n"; } - $obst_proj .= "\nenum n_$op {\n"; - for (my $idx = 0; $idx <= $#ins; $idx++) { - $obst_proj .= "\tn_${op}_".$ins[$idx]." = ${idx},\n"; + if ($#ins >= 0) { + $obst_proj .= "\nenum n_$op {\n"; + for (my $idx = 0; $idx <= $#ins; $idx++) { + $obst_proj .= "\tn_${op}_".$ins[$idx]." = ${idx},\n"; + } + $obst_proj .= "};\n"; } - $obst_proj .= "};\n"; } # Create opcode @@ -583,14 +600,14 @@ EOF if (exists($n{"cmp_attr"})) { my $cmpcode = $n{"cmp_attr"}; - push(@obst_cmp_attr, "static int cmp_attr_$op(ir_node *a, ir_node *b) {\n"); + push(@obst_cmp_attr, "static int cmp_attr_$op(const ir_node *a, const ir_node *b) {\n"); if($cmpcode =~ m/attr_a/) { - push(@obst_cmp_attr, "\t${attr_type} *attr_a = get_irn_generic_attr(a);\n"); + push(@obst_cmp_attr, "\tconst ${attr_type} *attr_a = get_irn_generic_attr_const(a);\n"); } else { push(@obst_cmp_attr, "\t(void) a;\n"); } if($cmpcode =~ m/attr_b/) { - push(@obst_cmp_attr, "\t${attr_type} *attr_b = get_irn_generic_attr(b);\n"); + push(@obst_cmp_attr, "\tconst ${attr_type} *attr_b = get_irn_generic_attr_const(b);\n"); } else { push(@obst_cmp_attr, "\t(void) b;\n"); } @@ -598,6 +615,8 @@ EOF push(@obst_cmp_attr, "}\n\n"); $cmp_attr_func = "cmp_attr_${op}"; + } elsif ($attr_type eq "") { + $cmp_attr_func = "NULL"; } else { if(defined($compare_attr{${attr_type}})) { $cmp_attr_func = $compare_attr{${attr_type}}; @@ -657,10 +676,10 @@ EOF } my %known_flags = map { $_ => 1 } ( - "none", "labeled", "commutative", "cfopcode", "op_cfopcode", - "fragile", "forking", "highlevel", "constlike", "always_opt", - "keep", "start_block", "uses_memory", "dump_noblock", - "dump_noinput", "machine", "machine_op", "cse_neutral" + "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" ); foreach my $flag (@{$n{"op_flags"}}) { if (not defined($known_flags{$flag})) { @@ -670,9 +689,14 @@ EOF my @mapped = map { "irop_flag_$_" } @{$n{"op_flags"}}; my $op_flags = join('|', @mapped); + my $attr_size = "0"; + if ($attr_type ne "") { + $attr_size = "sizeof(${attr_type})" + } + $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, sizeof(${attr_type}), &ops);\n"; + $temp .= "|irop_flag_machine, ".translate_arity($arity).", 0, ${attr_size}, &ops);\n"; push(@obst_new_irop, $temp); push(@obst_new_irop, "\tset_op_tag(op_$op, $arch\_op_tag);\n"); if(defined($default_op_attr_type)) { @@ -696,7 +720,9 @@ push(@obst_enum_op, "\n} $arch\_opcodes;\n\n"); open(OUT, ">$target_c") || die("Fatal error: Could not open $target_c, reason: $!\n"); -print OUT "#include \"gen_$arch\_regalloc_if.h\"\n\n"; +print OUT "#include \"gen_$arch\_regalloc_if.h\"\n"; +print OUT "#include \"irverify_t.h\"\n"; +print OUT "\n"; print OUT @obst_cmp_attr; print OUT "\n"; print OUT @obst_opvar; @@ -768,7 +794,7 @@ print OUT <{"name"}); + my $classuc = uc($class); + my $reguc = uc($reg); + $temp .= "BIT(REG_${classuc}_${reguc})"; } if(defined($temp)) { push(@obst_limit_func, "${temp}"); @@ -1253,6 +1265,7 @@ sub generate_requirements { my $idx = shift; my $is_in = shift; my $class = ""; + my $width = 1; my $result; my @req_type_mask; @@ -1262,6 +1275,10 @@ sub generate_requirements { push(@req_type_mask, "arch_register_req_type_ignore"); } elsif ($f eq "S") { push(@req_type_mask, "arch_register_req_type_produces_sp"); + } elsif ($f eq "a") { + push(@req_type_mask, "arch_register_req_type_aligned"); + } elsif ($f eq "2" or $f eq "4" or $f eq "8") { + $width = int($f); } } } @@ -1274,7 +1291,8 @@ sub generate_requirements { NULL, /* regclass */ NULL, /* limit bitset */ 0, /* same pos */ - 0 /* different pos */ + 0, /* different pos */ + 0 /* width */ }; EOF @@ -1288,7 +1306,8 @@ EOF & ${arch}_reg_classes[CLASS_${arch}_${class}], NULL, /* limit bitset */ 0, /* same pos */ - 0 /* different pos */ + 0, /* different pos */ + $width /* width */ }; EOF @@ -1323,7 +1342,8 @@ EOF & ${arch}_reg_classes[CLASS_${arch}_${class}], ${limit_bitset}, ${same_pos}, /* same pos */ - ${different_pos} /* different pos */ + ${different_pos}, /* different pos */ + $width /* width */ }; EOF