|
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~
[Prev in Thread] | Current Thread | [Next in Thread] |