X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=ir%2Fbe%2Fscripts%2Fgenerate_regalloc_if.pl;h=bfc88ff3200abb7d41f3272c4a2fa82418c96f91;hb=19e1d3e44d1bca743b67a9dd9369bba732ed318d;hp=ac07f7e875131c03ac1791d4983c6e76a7534c47;hpb=223381b39ed8606f5dbf94a7c1f59fd9e0b6d249;p=libfirm diff --git a/ir/be/scripts/generate_regalloc_if.pl b/ir/be/scripts/generate_regalloc_if.pl index ac07f7e87..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 @@ -94,16 +62,15 @@ my $regtypes_decl;# stack for the register type variables declarations my @regclasses; # stack for the register class variables my $classdef; # stack to define a name for a class index my $regdef; # stack to define a name for a register index +my $regdef2; +my $regcounts; my $reginit; # stack for the register type inits my $single_constraints_decls; my $single_constraints; -my $numregs; my $class_ptr; my $class_idx = 0; -my $tmp; - my %regclass2len = (); my %reg2class = (); @@ -135,6 +102,8 @@ sub get_limited_array { my $limitedbitsetlen = $regclass2len{$regclass}; my $arraylen = ($limitedbitsetlen+31) / 32; + my $firstreg = uc($reg_classes{$regclass}[0]->{"name"}); + my $classuc = uc($regclass); my $first = 1; for (my $i = 0; $i < $arraylen; ++$i) { if ($first) { @@ -146,9 +115,9 @@ sub get_limited_array { my $index = $reg2class{"$reg"}{"index"}; if ($index >= $i*32 && $index < ($i+1)*32) { if ($i > 0) { - $result .= "(1 << (REG_${ucname} % 32))"; + $result .= "(1 << (REG_${classuc}_${ucname} % 32))"; } else { - $result .= "(1 << REG_${ucname})"; + $result .= "(1 << REG_${classuc}_${ucname})"; } } else { $result .= "0"; @@ -163,30 +132,10 @@ foreach my $class_name (keys(%reg_classes)) { my $old_classname = $class_name; $class_name = $arch."_".$class_name; - $numregs = "N_".$class_name."_REGS"; $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"}) . "]"; + push(@regclasses, "{ $class_idx, \"$class_name\", $numregs, NULL, $first_reg, $flags_prepared, &${arch}_class_reg_req_${old_classname} }"); my $idx = 0; $reginit .= "\t$arch\_reg_classes[CLASS_".$class_name."].mode = $class_mode;\n"; - $regtypes_def .= "const arch_register_t ${class_name}_regs[$numregs] = {\n"; - - $regdef .= "enum reg_${class_name}_indices {\n"; + my $lastreg; foreach (@class) { - my $name = $_->{"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}; + my $classuc = uc($old_classname); - $regdef .= "\tREG_${ucname},\n"; + $regdef .= "\tREG_${ucname},\n"; + $regdef2 .= "\tREG_${classuc}_${ucname} = $idx,\n"; + my $dwarf_number = 0; + if (defined($_->{dwarf})) { + $dwarf_number = $_->{dwarf}; + } $regtypes_def .= <$target_h") || die("Fatal error: Could not open $target_h, reason: $!\n"); @@ -269,20 +224,33 @@ print OUT<