qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
From: "Alex Bennée" <alex.bennee@linaro.org>
To: Dave Martin <Dave.Martin@arm.com>
Cc: "peter.maydell@linaro.org" <peter.maydell@linaro.org>,
	"qemu-devel@nongnu.org" <qemu-devel@nongnu.org>,
	"qemu-arm@nongnu.org" <qemu-arm@nongnu.org>
Subject: Re: [Qemu-devel] [RISU PATCH 07/10] risugen: add --sve support
Date: Thu, 09 Nov 2017 14:50:44 +0000	[thread overview]
Message-ID: <87a7zvqzej.fsf@linaro.org> (raw)
In-Reply-To: <20171109122144.GA22781@e103592.cambridge.arm.com>


Dave Martin <Dave.Martin@arm.com> writes:

> On Tue, Nov 07, 2017 at 03:05:55PM +0000, Alex Bennée wrote:
>> This is similar to the approach used by the FP/simd data in so far as
>> we generate a block of random data and then load into it. As there are
>> no post-index SVE operations we need to emit an additional incp
>> instruction to generate our offset into the array.
>>
>> Signed-off-by: Alex Bennée <alex.bennee@linaro.org>
>> ---
>>  risugen        |  3 +++
>>  risugen_arm.pm | 57 ++++++++++++++++++++++++++++++++++++++++++++++++++-------
>>  2 files changed, 53 insertions(+), 7 deletions(-)
>>
>> diff --git a/risugen b/risugen
>> index aba4bb7..0ac8e86 100755
>> --- a/risugen
>> +++ b/risugen
>> @@ -317,6 +317,7 @@ sub main()
>>      my $condprob = 0;
>>      my $fpscr = 0;
>>      my $fp_enabled = 1;
>> +    my $sve_enabled = 1;
>>      my $big_endian = 0;
>>      my ($infile, $outfile);
>>
>> @@ -334,6 +335,7 @@ sub main()
>>                  },
>>                  "be" => sub { $big_endian = 1; },
>>                  "no-fp" => sub { $fp_enabled = 0; },
>> +                "sve" => sub { $sve_enabled = 1; },
>>          ) or return 1;
>>      # allow "--pattern re,re" and "--pattern re --pattern re"
>>      @pattern_re = split(/,/,join(',',@pattern_re));
>> @@ -361,6 +363,7 @@ sub main()
>>          'fpscr' => $fpscr,
>>          'numinsns' => $numinsns,
>>          'fp_enabled' => $fp_enabled,
>> +        'sve_enabled' => $sve_enabled,
>>          'outfile' => $outfile,
>>          'details' => \%insn_details,
>>          'keys' => \@insn_keys,
>> diff --git a/risugen_arm.pm b/risugen_arm.pm
>> index 2f10d58..8d1e1fd 100644
>> --- a/risugen_arm.pm
>> +++ b/risugen_arm.pm
>> @@ -472,9 +472,47 @@ sub write_random_aarch64_fpdata()
>>      }
>>  }
>>
>> -sub write_random_aarch64_regdata($)
>> +sub write_random_aarch64_svedata()
>>  {
>> -    my ($fp_enabled) = @_;
>> +    # Load SVE registers
>> +    my $align = 16;
>> +    my $vl = 16;                             # number of vqs
>
> Would this be better phrased
>
> 	my $vq = 16;				# quadwords per vector
>
>> +    my $datalen = (32 * $vl * 16) + $align;
>> +
>> +    write_pc_adr(0, (3 * 4) + ($align - 1)); # insn 1
>> +    write_align_reg(0, $align);              # insn 2
>> +    write_jump_fwd($datalen);                # insn 3
>> +
>> +    # align safety
>> +    for (my $i = 0; $i < ($align / 4); $i++) {
>> +        # align with nops
>> +        insn32(0xd503201f);
>> +    };
>> +
>> +    for (my $rt = 0; $rt <= 31; $rt++) {
>> +        for (my $q = 0; $q < $vl; $q++) {
>> +            write_random_fpreg_var(4); # quad
>> +        }
>> +    }
>> +
>> +    # Reset all the predicate registers to all true
>> +    for (my $p = 0; $p < 16; $p++) {
>> +        insn32(0x2518e3e0 | $p);
>> +    }
>> +
>> +    # there is no post index load so we do this by hand
>> +    write_mov_ri(1, 0);
>> +    for (my $rt = 0; $rt <= 31; $rt++) {
>> +        # ld1d    z0.d, p0/z, [x0, x1, lsl #3]
>> +        insn32(0xa5e14000 | $rt);
>> +        # incp    x1, p0.d
>> +        insn32(0x25ec8801);
>
> You could avoid this with the unpredicated form LDR (vector).
> (LD1x scalar+immediate doesn't provide enough immediate range).
>
> 	# ldr	z$rt, [x0, #$rt, mul vl]
> 	insn32(0x85804000 + $rt + (($rt & 7) << 10) + (($rt & 0x18) << 13));
>
> which is what the kernel does.

Ahh thanks.

> No harm in exercising different instructions though!  The kernel uses
> embarrassingly few.

Well that's what the actual random instructions are for. I haven't yet
considered if we need to group things together to properly exercise the
predicate code. So far RISU doesn't exercise conditional branches as
it's hard to do that without generating code that would lock up. It's
very much the "easy 80%" of instructions we target.

> Does it matter that the stride will depend on the actual current VL?
> If x0 just points to a block of random data, I guess it doesn't matter:
> some trailing data remains unused, but that doesn't make the used data
> any less random.

Not really. We do try and re-generate every N instructions so all the
floats don't just denormalise.

>
> [...]
>
> Cheers
> ---Dave


--
Alex Bennée

  reply	other threads:[~2017-11-09 14:50 UTC|newest]

Thread overview: 24+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2017-11-07 15:05 [Qemu-devel] [RISU PATCH 00/10] Initial support for SVE Alex Bennée
2017-11-07 15:05 ` [Qemu-devel] [RISU PATCH 01/10] build-all-arches: drop -t (for tty) from docker invocation Alex Bennée
2017-11-07 15:05 ` [Qemu-devel] [RISU PATCH 02/10] risu.c: split out setting up options Alex Bennée
2017-11-07 15:05 ` [Qemu-devel] [RISU PATCH 03/10] risu.c: add missing --trace longopt Alex Bennée
2017-11-07 15:05 ` [Qemu-devel] [RISU PATCH 04/10] risu: move optional args to each architecture Alex Bennée
2017-11-09  8:13   ` Richard Henderson
2017-11-07 15:05 ` [Qemu-devel] [RISU PATCH 05/10] configure: allow repeated invocation of configure in build dir Alex Bennée
2017-11-07 15:05 ` [Qemu-devel] [RISU PATCH 06/10] configure: support CPPFLAGS Alex Bennée
2017-11-08 10:34   ` Dave Martin
2017-11-08 11:02     ` Alex Bennée
2017-11-07 15:05 ` [Qemu-devel] [RISU PATCH 07/10] risugen: add --sve support Alex Bennée
2017-11-09  8:18   ` Richard Henderson
2017-11-09 12:21   ` Dave Martin
2017-11-09 14:50     ` Alex Bennée [this message]
2017-11-07 15:05 ` [Qemu-devel] [RISU PATCH 08/10] aarch64.risu: initial SVE instruction Alex Bennée
2017-11-07 15:05 ` [Qemu-devel] [RISU PATCH 09/10] risu_reginfo_aarch64: add reginfo_copy_sve Alex Bennée
2017-11-08 10:46   ` Dave Martin
2017-11-07 15:05 ` [Qemu-devel] [RISU PATCH 10/10] risu_reginfo_aarch64: add SVE support to reginfo_dump_mismatch Alex Bennée
2017-11-08 10:58   ` Dave Martin
2017-11-08 11:41     ` Alex Bennée
2017-11-08 10:36 ` [Qemu-devel] [RISU PATCH 00/10] Initial support for SVE Dave Martin
2017-11-08 11:02   ` Alex Bennée
2017-11-08 11:12     ` Dave Martin
2017-11-21 16:51 ` Peter Maydell

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=87a7zvqzej.fsf@linaro.org \
    --to=alex.bennee@linaro.org \
    --cc=Dave.Martin@arm.com \
    --cc=peter.maydell@linaro.org \
    --cc=qemu-arm@nongnu.org \
    --cc=qemu-devel@nongnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).