From nobody Tue Nov 11 03:16:16 2025 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=gmail.com ARC-Seal: i=1; a=rsa-sha256; t=1560920876; cv=none; d=zoho.com; s=zohoarc; b=dW7NkU8XYXF72FB1wHky2n8NsaempDf2JVyy77n31l+hO2PQijMknGVUpSpl8rcK6UQSM20pBHzSS/ie9Qq5mYixUmNBjBzIS0Qn97jR+x1bSAkm4wvpvk35kszfe9YBOk1VBwMUZLaPhGelZ3iO3tqrELFNOx1xulxyfNiXtFI= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zoho.com; s=zohoarc; t=1560920876; h=Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To:ARC-Authentication-Results; bh=E+nG+A7eIMJ+oEMZ98jk8lnEytaL2DnbYAnCvuy+ey8=; b=i2mzHJilduIgUN/yS0OTwjR+O4j1S9pTDz9WNBxclEks+RIT7KKg3v1Ywa0C1bZ951N75xS+mHgm9DJCs3QtiQYjsrwCzPQq0S7zj8Xepq/Q3lYgOYsLQaRDnBDvEt4dKhloRuqez5ETC1ryY0PVZhruPHeAWgpvY61g0JDshUA= ARC-Authentication-Results: i=1; mx.zoho.com; dkim=fail; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail header.from= (p=none dis=none) header.from= Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 156092087688823.663966630580717; Tue, 18 Jun 2019 22:07:56 -0700 (PDT) Received: from localhost ([::1]:35162 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.86_2) (envelope-from ) id 1hdSoy-0005wX-0V for importer@patchew.org; Wed, 19 Jun 2019 01:07:44 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:34415) by lists.gnu.org with esmtp (Exim 4.86_2) (envelope-from ) id 1hdSmT-0003u8-9A for qemu-devel@nongnu.org; Wed, 19 Jun 2019 01:05:11 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1hdSmP-0001dY-IW for qemu-devel@nongnu.org; Wed, 19 Jun 2019 01:05:07 -0400 Received: from mail-yb1-xb44.google.com ([2607:f8b0:4864:20::b44]:41244) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1hdSmO-0001c0-RN for qemu-devel@nongnu.org; Wed, 19 Jun 2019 01:05:04 -0400 Received: by mail-yb1-xb44.google.com with SMTP id d2so7077574ybh.8 for ; Tue, 18 Jun 2019 22:05:03 -0700 (PDT) Received: from localhost.localdomain (67-9-99-67.biz.bhn.net. [67.9.99.67]) by smtp.gmail.com with ESMTPSA id e12sm1714426ywe.85.2019.06.18.22.05.02 (version=TLS1_3 cipher=AEAD-AES256-GCM-SHA384 bits=256/256); Tue, 18 Jun 2019 22:05:02 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=E+nG+A7eIMJ+oEMZ98jk8lnEytaL2DnbYAnCvuy+ey8=; b=tRlOOJu/44ZdoANgiGx9LaHAYE+sQ6IlK4nos+/S+iriipl1VVZAxp69FMe8N7Xsn4 skvNznWNlKeBFNjgmZFP6g+i/XWjDhm0wkHHs4HFqxcnVinR2Cme9NVt8XksfACINudD r0HNmTw+wUPeeahIjl7Jlga/mowljVStdbMjKsV0D8oRlDkLRjwgqy1fE5hCr2DZGYja 7VPMVciQ75wND2JneK95srUXFL3PsrMl3+uhsm4FYoOaFvDfQnDa3py59fuUuJhfILYc HroesAq6x61Dvej0sdMGtxAXAzJldq9D1vLhUwD9Pd+qYztGzIAcod2DsGvpYCJq3poM 2Nrw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=E+nG+A7eIMJ+oEMZ98jk8lnEytaL2DnbYAnCvuy+ey8=; b=hbz0Sn9B4012Pe3rCWglQ61HO9Mf5Wgu8CSVYUUWdS08YM2LUWyjy4V+htRzQaz2Iu lJmBS9Vkbj33LsXvMYmpdhE2djiSMDA0scekAo9l0dcWP30rIymuu3JS5fRgGYQeTyaj I44EZfed3v8dsS5AinqpxYE0IYpeNrEDCRSntVIiE+DyMVWgI+GZImn9np15gOGi3JgF WNsN/aylFaB0KnalEv5r1cQae0Idd6qLGmY2Ypl3UGAHNQPT5qKLVDeB0MfuQS6QH4Ql 7DajY2l7Wb3Y+UWwOqnlP0FwbwNrxfC71So6GNXhSOsro1WMwigI9e2H1LzA7X0uxn45 7ZsQ== X-Gm-Message-State: APjAAAWrS90tdIT11qY0kJWcUotVrIgUx7S+4Xx8jThrZEsVp0xTEVKo HdYW3JRxVOwvPXg5JzMh/Wy/8/Io X-Google-Smtp-Source: APXvYqxM9T5OCojbabYUp4yv5z8fLTBG83tyvLnCZ8JO27X11qtMLWxRMVStWUqA10Gyi1eIz+hBIg== X-Received: by 2002:a25:4d5:: with SMTP id 204mr21735719ybe.112.1560920703342; Tue, 18 Jun 2019 22:05:03 -0700 (PDT) From: Jan Bobek To: qemu-devel@nongnu.org Date: Wed, 19 Jun 2019 01:04:41 -0400 Message-Id: <20190619050447.22201-2-jan.bobek@gmail.com> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20190619050447.22201-1-jan.bobek@gmail.com> References: <20190619050447.22201-1-jan.bobek@gmail.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2607:f8b0:4864:20::b44 Subject: [Qemu-devel] [RISU RFC PATCH v1 1/7] risugen_common: add insnv, randint_constr, rand_fill X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Jan Bobek , =?UTF-8?q?Alex=20Benn=C3=A9e?= , Richard Henderson Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) Content-Type: text/plain; charset="utf-8" Add three common utility functions: - insnv allows emitting variable-length instructions in little-endian or big-endian byte order; it subsumes functionality of former insn16() and insn32() functions. - randint_constr allows generating random integers according to several constraints passed as arguments. - rand_fill uses randint_constr to fill a given hash with (optionally constrained) random values. Signed-off-by: Jan Bobek --- risugen_common.pm | 101 +++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 95 insertions(+), 6 deletions(-) diff --git a/risugen_common.pm b/risugen_common.pm index 71ee996..98b9170 100644 --- a/risugen_common.pm +++ b/risugen_common.pm @@ -23,7 +23,8 @@ BEGIN { require Exporter; =20 our @ISA =3D qw(Exporter); - our @EXPORT =3D qw(open_bin close_bin set_endian insn32 insn16 $byteco= unt + our @EXPORT =3D qw(open_bin close_bin set_endian insn32 insn16 + $bytecount insnv randint_constr rand_fill progress_start progress_update progress_end eval_with_fields is_pow_of_2 sextract ctz dump_insn_details); @@ -37,7 +38,7 @@ my $bigendian =3D 0; # (default is little endian, 0). sub set_endian { - $bigendian =3D @_; + ($bigendian) =3D @_; } =20 sub open_bin @@ -52,18 +53,106 @@ sub close_bin close(BIN) or die "can't close output file: $!"; } =20 +sub insnv(%) +{ + my (%args) =3D @_; + + # Default to big-endian order, so that the instruction bytes are + # emitted in the same order as they are written in the + # configuration file. + $args{bigendian} =3D 1 unless defined $args{bigendian}; + + while (0 < $args{len}) { + my $format; + my $len; + + if ($args{len} >=3D 8) { + $format =3D "Q"; + $len =3D 8; + } elsif ($args{len} >=3D 4) { + $format =3D "L"; + $len =3D 4; + } elsif ($args{len} >=3D 2) { + $format =3D "S"; + $len =3D 2; + } else { + $format =3D "C"; + $len =3D 1; + } + + $format .=3D ($args{bigendian} ? ">" : "<") if $len > 1; + + my $bitlen =3D 8 * $len; + my $bitmask =3D (1 << $bitlen) - 1; + my $value =3D ($args{bigendian} + ? ($args{value} >> (8 * $args{len} - $bitlen)) + : $args{value}); + + print BIN pack($format, $value & $bitmask); + $bytecount +=3D $len; + + $args{len} -=3D $len; + $args{value} >>=3D $bitlen unless $args{bigendian}; + } +} + sub insn32($) { my ($insn) =3D @_; - print BIN pack($bigendian ? "N" : "V", $insn); - $bytecount +=3D 4; + insnv(value =3D> $insn, len =3D> 4, bigendian =3D> $bigendian); } =20 sub insn16($) { my ($insn) =3D @_; - print BIN pack($bigendian ? "n" : "v", $insn); - $bytecount +=3D 2; + insnv(value =3D> $insn, len =3D> 2, bigendian =3D> $bigendian); +} + +sub randint_constr(%) +{ + my (%args) =3D @_; + my $bitlen =3D $args{bitlen}; + my $halfrange =3D 1 << ($bitlen - 1); + + while (1) { + my $value =3D int(rand(2 * $halfrange)); + $value -=3D $halfrange if defined $args{signed} && $args{signed}; + $value &=3D ~$args{fixedbitmask} if defined $args{fixedbitmask}; + $value |=3D $args{fixedbits} if defined $args{fixedbits}; + + if (defined $args{constraint}) { + if (!($args{constraint} >> 63)) { + $value =3D $args{constraint}; + } elsif ($value =3D=3D ~$args{constraint}) { + next; + } + } + + return $value; + } +} + +sub rand_fill($$) +{ + my ($target, $constraints) =3D @_; + + for (keys %{$target}) { + my %args =3D (bitlen =3D> $target->{$_}{bitlen}); + + $args{fixedbits} =3D $target->{$_}{fixedbits} + if defined $target->{$_}{fixedbits}; + $args{fixedbitmask} =3D $target->{$_}{fixedbitmask} + if defined $target->{$_}{fixedbitmask}; + $args{signed} =3D $target->{$_}{signed} + if defined $target->{$_}{signed}; + + $args{constraint} =3D $constraints->{$_} + if defined $constraints->{$_}; + + $target->{$_} =3D randint_constr(%args); + } + + return $target; } =20 # Progress bar implementation --=20 2.20.1