X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;ds=inline;f=ir%2Fbe%2Fscripts%2Fgenerate_regalloc_if.pl;h=bfc88ff3200abb7d41f3272c4a2fa82418c96f91;hb=19e1d3e44d1bca743b67a9dd9369bba732ed318d;hp=87714c936251b74ed3f3191817f4b19b0705e0ba;hpb=b24c359be385d38d535efe35df5a937a8ee9cc0c;p=libfirm diff --git a/ir/be/scripts/generate_regalloc_if.pl b/ir/be/scripts/generate_regalloc_if.pl index 87714c936..bfc88ff32 100755 --- a/ir/be/scripts/generate_regalloc_if.pl +++ b/ir/be/scripts/generate_regalloc_if.pl @@ -22,7 +22,6 @@ # This script generates C code which creates ands sets up functions and # data structures for the register allocator. # Creation: 2005/11/14 -# $Id$ use strict; use Data::Dumper; @@ -51,41 +50,10 @@ my $target_c = $target_dir."/gen_".$arch."_regalloc_if.c"; my $target_h = $target_dir."/gen_".$arch."_regalloc_if.h"; # helper function -sub translate_reg_type { - my $t = shift; - - if ($t == 0) { - return "arch_register_type_none"; - } - else { - my @types; - - if ($t & 1) { - push(@types, "arch_register_type_caller_save"); - } - - if ($t & 2) { - push(@types, "arch_register_type_callee_save"); - } - - if ($t & 4) { - push(@types, "arch_register_type_ignore"); - } - - if ($t & 8) { - push(@types, "arch_register_type_joker"); - } - - if ($t & 16) { - push(@types, "arch_register_type_virtual"); - } - - if ($t & 32) { - push(@types, "arch_register_type_state"); - } - - return join(" | ", @types); - } +sub map_flags { + my $prefix = shift; + my $flags = shift || "none"; + return join(" | ", map { "$prefix$_" } split(/\s*\|\s*/, $flags)); } # stacks for output @@ -167,26 +135,7 @@ foreach my $class_name (keys(%reg_classes)) { $class_ptr = "&".$arch."_reg_classes[CLASS_".$class_name."]"; my $flags = pop(@class); $class_mode = $flags->{"mode"}; - my $class_flags = $flags->{"flags"}; - my $flags_prepared = ""; - - if(defined($class_flags)) { - my $first = 1; - foreach my $flag (split(/\|/, $class_flags)) { - if(!$first) { - $flags_prepared .= "|"; - } else { - $first = 0; - } - $flags_prepared .= "arch_register_class_flag_$flag"; - } - } else { - $flags_prepared = "0"; - } - - $single_constraints_decls .= <{"flags"}); $single_constraints .= <{"name"}; + my $name = $_->{"name"}; my $ucname = uc($name); - my $type = translate_reg_type($_->{"type"}); + my $type = map_flags("arch_register_type_", $_->{"type"}); # realname is name if not set by user $_->{"realname"} = $_->{"name"} if (! exists($_->{"realname"})); my $realname = $_->{realname}; @@ -218,6 +167,10 @@ EOF $regdef .= "\tREG_${ucname},\n"; $regdef2 .= "\tREG_${classuc}_${ucname} = $idx,\n"; + my $dwarf_number = 0; + if (defined($_->{dwarf})) { + $dwarf_number = $_->{dwarf}; + } $regtypes_def .= <