X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=ir%2Fbe%2Fscripts%2Fgenerate_new_opcodes.pl;h=329ca17bb6f14b0a4983dd7da94cc39199096fcd;hb=516482fa4892951b0f20a507f10cc7488ac6b250;hp=6ce847b07552e59c82e302493c50aae64fe7bc6f;hpb=aa44b554966dffbccea1c762aa5db988ba71d486;p=libfirm diff --git a/ir/be/scripts/generate_new_opcodes.pl b/ir/be/scripts/generate_new_opcodes.pl index 6ce847b07..329ca17bb 100755 --- a/ir/be/scripts/generate_new_opcodes.pl +++ b/ir/be/scripts/generate_new_opcodes.pl @@ -61,9 +61,11 @@ push(@obst_header, "void ".$arch."_create_opcodes(void);\n"); push(@obst_enum_op, "typedef enum _$arch\_opcodes {\n"); foreach my $op (keys(%nodes)) { - my %n = %{ $nodes{"$op"} }; - my $tuple = 0; - my $n_res = 0; + my %n = %{ $nodes{"$op"} }; + my $tuple = 0; + my $n_res = 0; + my $num_outs = 0; + my @out_flags; # determine arity from in requirements $arity = exists($n{"arity"}) ? $n{"arity"} : 0; @@ -75,13 +77,24 @@ foreach my $op (keys(%nodes)) { $op = $arch."_".$op; $temp = ""; + # define some proj numbers if (exists($n{"outs"})) { undef my @outs; - @outs = @{ $n{"outs"} }; + + @outs = @{ $n{"outs"} }; + $num_outs = $#outs + 1; + push(@obst_proj, "\nenum pn_$op {\n"); + for (my $idx = 0; $idx <= $#outs; $idx++) { + # check, if we have additional flags annotated to out + if ($outs[$idx] =~ /:(S|I(\|(S|I))*)/) { + push(@out_flags, $1); + $outs[$idx] =~ s/:(S|I(\|(S|I))*)//; + } push(@obst_proj, " pn_$op\_".$outs[$idx]." = $idx,\n"); } + push(@obst_proj, "};\n"); $tuple = 1; } @@ -224,6 +237,9 @@ foreach my $op (keys(%nodes)) { elsif ($flag eq "I") { $temp .= " flags |= arch_irn_flags_ignore; /* ignore op for register allocation */\n"; } + elsif ($flag eq "S") { + $temp .= " flags |= arch_irn_flags_modify_sp; /* op modifies stack pointer */\n"; + } } } @@ -246,18 +262,24 @@ foreach my $op (keys(%nodes)) { } if (@out) { - $out_param = $out_req_var.", ".($#out + 1); - $n_res = $#out; + $n_res = $#out + 1; + $out_param = "$out_req_var, $n_res"; } else { $out_param = "NULL, 0"; } } else { - $in_param = "NULL"; + $in_param = "NULL"; $out_param = "NULL, 0"; } $temp .= "\n /* create node */\n"; + + my $latency = 1; + if (exists($n{"latency"})) { + $latency = $n{"latency"}; + } + my $mode = "mode"; if ($tuple == 1) { $mode = "mode_T"; @@ -265,7 +287,30 @@ foreach my $op (keys(%nodes)) { $temp .= " res = new_ir_node(db, irg, block, op_$op, $mode, $arity, ".($arity > 0 ? "in" : "NULL").");\n"; $temp .= "\n /* init node attributes */\n"; - $temp .= " init_$arch\_attributes(res, flags, $in_param, $out_param);\n"; + $temp .= " init_$arch\_attributes(res, flags, $in_param, $out_param, $latency);\n"; + + # set flags for outs + if ($#out_flags >= 0) { + $temp .= "\n /* set flags for outs */\n"; + for (my $idx = 0; $idx <= $#out_flags; $idx++) { + my $flags = ""; + my $prefix = ""; + + foreach my $flag (split(/\|/, $out_flags[$idx])) { + if ($flag eq "I") { + $flags .= $prefix."arch_irn_flags_ignore"; + $prefix = " | "; + } + elsif ($flag eq "S") { + $flags .= $prefix."arch_irn_flags_modify_sp"; + $prefix = " | "; + } + } + + $temp .= " set_$arch\_out_flags(res, $flags, $idx);\n"; + } + } + if (exists($n{"init_attr"})) { $temp .= " attr = get_$arch\_attr(res);\n";