qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Qemu-devel] [RISU RFC PATCH v1 1/7] risugen_common: add insnv, rand


From: Richard Henderson
Subject: Re: [Qemu-devel] [RISU RFC PATCH v1 1/7] risugen_common: add insnv, randint_constr, rand_fill
Date: Thu, 27 Jun 2019 10:53:33 +0200
User-agent: Mozilla/5.0 (X11; Linux x86_64; rv:60.0) Gecko/20100101 Thunderbird/60.7.0

On 6/19/19 7:04 AM, Jan Bobek wrote:
> +        my $value = ($args{bigendian}
> +                     ? ($args{value} >> (8 * $args{len} - $bitlen))
> +                     : $args{value});
...
> +        $args{value} >>= $bitlen unless $args{bigendian};

I think this could be clearer without modifying $args.
I mis-read these the first time around.

Perhaps

    my $bitpos = 0;
    my $bitend = 8 * $args{len};
    while ($bitpos < $bitend) {
        ...
        my $value = $args{value} >> ($args{bigendian}
                                     ? $bitend - $bitpos - $bitlen
                                     : $bitpos);
        ...
        $bitpos += $bitlen;
    }

> +sub randint_constr(%)
> +{
> +    my (%args) = @_;
> +    my $bitlen = $args{bitlen};
> +    my $halfrange = 1 << ($bitlen - 1);
> +
> +    while (1) {
> +        my $value = int(rand(2 * $halfrange));
> +        $value -= $halfrange if defined $args{signed} && $args{signed};
> +        $value &= ~$args{fixedbitmask} if defined $args{fixedbitmask};
> +        $value |= $args{fixedbits} if defined $args{fixedbits};
> +
> +        if (defined $args{constraint}) {
> +            if (!($args{constraint} >> 63)) {
> +                $value = $args{constraint};
> +            } elsif ($value == ~$args{constraint}) {
> +                next;
> +            }
> +        }

I don't understand what you're doing here with {constraint}.
Some additional commentary would help.


r~



reply via email to

[Prev in Thread] Current Thread [Next in Thread]