X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;ds=sidebyside;f=ir%2Fbe%2Fscripts%2Fgenerate_regalloc_if.pl;h=4f24ca8ef9ca1c6ac296bcf90d6d551db1f8dc22;hb=d9c77a99acbf05eca3d7b3d7e74ce555b60efaa9;hp=12a14e8a46b7772c4965c5a16432aa63e015c6cf;hpb=a57b5bde8043722684b8ac008011c2807aa4c45d;p=libfirm diff --git a/ir/be/scripts/generate_regalloc_if.pl b/ir/be/scripts/generate_regalloc_if.pl index 12a14e8a4..4f24ca8ef 100755 --- a/ir/be/scripts/generate_regalloc_if.pl +++ b/ir/be/scripts/generate_regalloc_if.pl @@ -32,25 +32,31 @@ my $target_c = $target_dir."/gen_".$arch."_regalloc_if.c"; my $target_h = $target_dir."/gen_".$arch."_regalloc_if.h"; my $target_h_t = $target_dir."/gen_".$arch."_regalloc_if_t.h"; -# helper array -my @rt = ("arch_register_type_none", # 0 - "arch_register_type_caller_save", # 1 - "arch_register_type_callee_save", # 2 - "", - "arch_register_type_ignore", # 4 - "", - "", - "", - "arch_register_type_sp", # 8 - "", - "", - "", - "", - "", - "", - "", - "arch_register_type_bp" # 16 - ); +# 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"); + } + + return join(" | ", @types); + } +} # stacks for output my @obst_regtypes; # stack for the register type variables @@ -62,7 +68,6 @@ my @obst_req; # stack for the register requirements my @obst_limit_func; # stack for functions to return a subset of a register class my @obst_defreq_head; # stack for prototypes of default requirement function my @obst_header_all; # stack for some extern struct defs needed for bearch_$arch include -my @obst_projnum_map; # stack for mapping register projnums to requirements my @obst_requirement_def; # stack for requirement name defines my $numregs; @@ -92,7 +97,6 @@ push(@obst_header_all, "extern const $arch\_register_req_t $arch\_default_req_no push(@obst_classdef, "#define N_CLASSES ".scalar(keys(%reg_classes))."\n"); -my $global_projnum_idx = 0; my $class_mode; # generate register type and class variable, init function and default requirements @@ -173,13 +177,7 @@ foreach my $class_name (keys(%reg_classes)) { push(@obst_reginit, " ".$class_name."_regs[$idx].name = \"".$_->{"name"}."\";\n"); push(@obst_reginit, " ".$class_name."_regs[$idx].reg_class = $class_ptr;\n"); push(@obst_reginit, " ".$class_name."_regs[$idx].index = $idx;\n"); - push(@obst_reginit, " ".$class_name."_regs[$idx].type = ".$rt[$_->{"type"}].";\n"); - if ($_->{"type"} == 2) { - # this is a caller saved register - push(@obst_reginit, " ia32_set_reg_projnum(&".$class_name."_regs[$idx], $global_projnum_idx, isa->reg_projnum_map);\n"); - push(@obst_projnum_map, "&$arch\_default_req_$class_name\_".$_->{"name"}); - $global_projnum_idx++; - } + push(@obst_reginit, " ".$class_name."_regs[$idx].type = ".translate_reg_type($_->{"type"}).";\n"); push(@obst_reginit, "\n"); $idx++; } @@ -187,10 +185,6 @@ foreach my $class_name (keys(%reg_classes)) { $class_idx++; } -push(@obst_regdef, "\n#define N_CALLER_SAVE_REGS ".scalar(@obst_projnum_map)."\n"); - -push(@obst_header_all, "\nextern const $arch\_register_req_t *$arch\_projnum_reg_req_map[N_CALLER_SAVE_REGS];\n\n"); - # generate node-register constraints foreach my $op (keys(%nodes)) { my %n = %{ $nodes{"$op"} }; @@ -303,18 +297,15 @@ print OUT<