@@ -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,
@@ -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;
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.bennee@linaro.org> --- risugen | 15 +++++++++++++++ risugen_arm.pm | 7 +++++++ 2 files changed, 22 insertions(+) -- 2.13.0