X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=ir%2Fbe%2Fscripts%2Fgenerate_regalloc_if.pl;h=87714c936251b74ed3f3191817f4b19b0705e0ba;hb=b24c359be385d38d535efe35df5a937a8ee9cc0c;hp=5628403703afc63c0b8da3e897cbbc820978f9b0;hpb=6730cf921d356d992d35526daf57f82af7ab0816;p=libfirm diff --git a/ir/be/scripts/generate_regalloc_if.pl b/ir/be/scripts/generate_regalloc_if.pl index 562840370..87714c936 100755 --- a/ir/be/scripts/generate_regalloc_if.pl +++ b/ir/be/scripts/generate_regalloc_if.pl @@ -94,16 +94,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 +134,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 +147,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,7 +164,6 @@ 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"}; @@ -199,16 +199,14 @@ static const arch_register_req_t ${arch}_class_reg_req_${old_classname} = { }; EOF - $regtypes_decl .= "extern const arch_register_t ${class_name}_regs[$numregs];\n"; - $classdef .= "\tCLASS_$class_name = $class_idx,\n"; - push(@regclasses, "{ $class_idx, \"$class_name\", $numregs, NULL, ".$class_name."_regs, $flags_prepared, &${arch}_class_reg_req_${old_classname} }"); + my $numregs = @class; + my $first_reg = "&${arch}_registers[REG_". uc($class[0]->{"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 $ucname = uc($name); @@ -216,13 +214,16 @@ EOF # 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"; $regtypes_def .= <$target_h") || die("Fatal error: Could not open $target_h, reason: $!\n"); @@ -271,17 +270,28 @@ print OUT<