From 9bc8c6e3500cd526c3b278a47a354719280e4636 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Christian=20W=C3=BCrdig?= Date: Mon, 16 Jan 2006 10:04:48 +0000 Subject: [PATCH 1/1] extended IN constraints with reference to out register --- ir/be/scripts/generate_regalloc_if.pl | 57 ++++++++++++++++++++++++--- 1 file changed, 51 insertions(+), 6 deletions(-) diff --git a/ir/be/scripts/generate_regalloc_if.pl b/ir/be/scripts/generate_regalloc_if.pl index 67e8907a9..6ad370e10 100755 --- a/ir/be/scripts/generate_regalloc_if.pl +++ b/ir/be/scripts/generate_regalloc_if.pl @@ -63,7 +63,8 @@ $tmp = "/* Default NONE register requirements */\n"; $tmp .= "const arch_register_req_t ia32_default_req_none = {\n"; $tmp .= " arch_register_req_type_none,\n"; $tmp .= " NULL,\n"; -$tmp .= " { NULL }\n"; +$tmp .= " NULL,\n"; +$tmp .= " 0\n"; $tmp .= "};\n\n"; push(@obst_req, $tmp); @@ -92,7 +93,8 @@ foreach my $class_name (keys(%reg_classes)) { $tmp .= "const arch_register_req_t ia32_default_req_$class_name = {\n"; $tmp .= " arch_register_req_type_normal,\n"; $tmp .= " $class_ptr,\n"; - $tmp .= " { NULL }\n"; + $tmp .= " NULL,\n"; + $tmp .= " 0\n"; $tmp .= "};\n\n"; push(@obst_req, $tmp); @@ -125,7 +127,8 @@ foreach my $class_name (keys(%reg_classes)) { $tmp = "const arch_register_req_t ia32_default_req_$class_name\_".$_->{"name"}." = {\n"; $tmp .= " arch_register_req_type_limited,\n"; $tmp .= " $class_ptr,\n"; - $tmp .= " { $limit_func_name }\n"; + $tmp .= " $limit_func_name,\n"; + $tmp .= " 0\n"; $tmp .= "};\n\n"; push(@obst_req, $tmp); @@ -155,6 +158,39 @@ foreach my $op (keys(%nodes)) { push(@obst_req, "/* IN requirements for '$op' */\n"); + # We can have IN requirements like "out_d1" + # and for those we need the associated register class + # That's why we have to check all out requirements first + # and remember their classes. + my @outidx_class; + if (exists($n{"reg_req"}{"out"})) { + my @out = @{ $n{"reg_req"}{"out"} }; + + for (my $idx = 0; $idx <= $#out; $idx++) { + my $class = undef; + + if ($out[$idx] eq "none") { + $class = "none"; + } + elsif (is_reg_class($out[$idx])) { + $class = $out[$idx]; + } + elsif ($out[$idx] =~ /^(!)?in_s(\d+)/) { + $class = "UNKNOWN_CLASS"; + } + else { + my @regs = split(/ /, $out[$idx]); + $class = get_reg_class($regs[0]); + if (!defined $class) { + die("Could not get register class for '$op' pos $idx ... exiting.\n"); + } + } + + push(@outidx_class, $class); + } + } + + # we need to remember the classes of the IN constraints for # OUT constraints like "in_s1" my @inidx_class; @@ -179,6 +215,15 @@ foreach my $op (keys(%nodes)) { elsif (is_reg_class($in[$idx])) { push(@inidx_class, $in[$idx]); $tmp .= "&ia32_default_req_".$arch."_".$in[$idx].";\n"; + } + elsif ($in[$idx] =~ /^(!)?out_d(\d+)/) { # this is a "should be (un)equal to register at out_X" + $tmp .= "&_".$op."_reg_req_in_$idx;\n"; + $tmp2 .= " {\n"; + $tmp2 .= " arch_register_req_type_should_be_".($1 ? "different" : "same").",\n"; + $tmp2 .= " &$arch\_reg_classes[CLASS_$arch\_".$outidx_class[$2 - 1]."],\n"; + $tmp2 .= " NULL,\n -$2\n};\n"; + + $tmp = $tmp2.$tmp } else { $class = build_subset_class_func($op, $idx, 1, $in[$idx]); @@ -187,7 +232,7 @@ foreach my $op (keys(%nodes)) { } push(@inidx_class, $class); $tmp .= "&_".$op."_reg_req_in_$idx;\n"; - $tmp2 .= " {\n arch_register_req_type_limited,\n &$arch\_reg_classes[CLASS_$arch\_".$class."],\n { limit_reg_".$op."_in_".$idx." }\n};\n"; + $tmp2 .= " {\n arch_register_req_type_limited,\n &$arch\_reg_classes[CLASS_$arch\_".$class."],\n limit_reg_".$op."_in_".$idx.",\n 0\n};\n"; $tmp = $tmp2.$tmp; } @@ -222,7 +267,7 @@ foreach my $op (keys(%nodes)) { $tmp2 .= " {\n"; $tmp2 .= " arch_register_req_type_should_be_".($1 ? "different" : "same").",\n"; $tmp2 .= " &$arch\_reg_classes[CLASS_$arch\_".$inidx_class[$2 - 1]."],\n"; - $tmp2 .= " { ".($2 - 1)." }\n};\n"; + $tmp2 .= " NULL,\n ".($2 - 1)."\n};\n"; $tmp = $tmp2.$tmp } @@ -232,7 +277,7 @@ foreach my $op (keys(%nodes)) { die("Could not build subset for OUT requirements '$op' pos $idx ... exiting.\n"); } $tmp .= "&_".$op."_reg_req_out_$idx;\n"; - $tmp2 .= " {\n arch_register_req_type_limited,\n &$arch\_reg_classes[CLASS_$arch\_".$class."],\n { limit_reg_".$op."_out_".$idx." }\n};\n"; + $tmp2 .= " {\n arch_register_req_type_limited,\n &$arch\_reg_classes[CLASS_$arch\_".$class."],\n limit_reg_".$op."_out_".$idx.",\n 0\n};\n"; $tmp = $tmp2.$tmp } -- 2.20.1