The existing pattern support is useful but it does get a little tedious when faced with large groups of instructions. This introduces the concept of a @GroupName which can be sprinkled in the risu definition and is attached to all instructions following its definition until the next group or an empty group "@" is specified.
It can be combined with the existing pattern support to do things like: ./risugen --group AdvSIMDAcrossVector --not-pattern ".*_RES" aarch64.risu foo.bin Signed-off-by: Alex Bennée <alex.ben...@linaro.org> --- risugen | 15 +++++++++++++++ risugen_arm.pm | 7 +++++++ 2 files changed, 22 insertions(+) diff --git a/risugen b/risugen index 347cf12..97ffa83 100755 --- a/risugen +++ b/risugen @@ -30,7 +30,10 @@ my %insn_details; # The arch will be selected based on .mode directive defined in risu file. my $arch = ""; +# Current group, updated by @GroupName +my $insn_group = ""; +my @group = (); # include groups my @pattern_re = (); # include pattern my @not_pattern_re = (); # exclude pattern @@ -118,6 +121,11 @@ sub parse_config_file($) exit(1); } + if ($tokens[0] =~ /^@(.*)/ ) { + $insn_group = $1; + next; + } + if ($tokens[0] =~ /^\./) { parse_risu_directive($file, $seen_pattern, @tokens); next; @@ -235,6 +243,9 @@ sub parse_config_file($) $insnrec->{fixedbits} = $fixedbits; $insnrec->{fixedbitmask} = $fixedbitmask; $insnrec->{fields} = [ @fields ]; + if (length $insn_group) { + $insnrec->{group} = $insn_group; + } $insn_details{$insnname} = $insnrec; } close(CFILE) or die "can't close $file: $!"; @@ -253,6 +264,7 @@ Valid options: --fpscr n : set initial FPSCR (arm) or FPCR (aarch64) value (default is 0) --condprob p : [ARM only] make instructions conditional with probability p (default is 0, ie all instructions are always executed) + --group name[,name..]: only use instructions in defined groups --pattern re[,re...] : only use instructions matching regular expression Each re must match a full word (that is, we match on the perl regex '\\b((re)|(re))\\b'). This means that @@ -281,6 +293,7 @@ sub main() GetOptions( "help" => sub { usage(); exit(0); }, "numinsns=i" => \$numinsns, "fpscr=o" => \$fpscr, + "group=s" => \@group, "pattern=s" => \@pattern_re, "not-pattern=s" => \@not_pattern_re, "condprob=f" => sub { @@ -295,6 +308,7 @@ sub main() # allow "--pattern re,re" and "--pattern re --pattern re" @pattern_re = split(/,/,join(',',@pattern_re)); @not_pattern_re = split(/,/,join(',',@not_pattern_re)); + @group = split(/,/,join(',',@group)); if ($#ARGV != 1) { usage(); @@ -316,6 +330,7 @@ sub main() 'numinsns' => $numinsns, 'fp_enabled' => $fp_enabled, 'outfile' => $outfile, + 'group' => \@group, 'pattern_re' => \@pattern_re, 'not_pattern_re' => \@not_pattern_re, 'details' => \%insn_details, diff --git a/risugen_arm.pm b/risugen_arm.pm index 1024660..8ad208a 100644 --- a/risugen_arm.pm +++ b/risugen_arm.pm @@ -895,6 +895,7 @@ sub write_test_code($$$$$$$$) my $fp_enabled = $params->{ 'fp_enabled' }; my $outfile = $params->{ 'outfile' }; + my @group = @{ $params->{ 'group' } }; my @pattern_re = @{ $params->{ 'pattern_re' } }; my @not_pattern_re = @{ $params->{ 'not_pattern_re' } }; my %insn_details = %{ $params->{ 'details' } }; @@ -910,6 +911,12 @@ sub write_test_code($$$$$$$$) # Get a list of the insn keys which are permitted by the re patterns my @keys = sort keys %insn_details; + if (@group) { + my $re = join("|",@group); + @keys = grep { + defined($insn_details{$_}->{group}) && + grep /$re/, $insn_details{$_}->{group}} @keys + } if (@pattern_re) { my $re = '\b((' . join(')|(',@pattern_re) . '))\b'; @keys = grep /$re/, @keys; -- 2.13.0