From nobody Thu May 9 06:39:21 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; spf=pass (zohomail.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=univ-grenoble-alpes.fr Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1633556311027851.7244089458713; Wed, 6 Oct 2021 14:38:31 -0700 (PDT) Received: from localhost ([::1]:43316 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1mYEcP-0008LR-VI for importer@patchew.org; Wed, 06 Oct 2021 17:38:29 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:49484) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1mYETc-0007xA-F1; Wed, 06 Oct 2021 17:29:26 -0400 Received: from zm-mta-out-3.u-ga.fr ([152.77.200.56]:43572) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1mYETZ-0007uU-3T; Wed, 06 Oct 2021 17:29:24 -0400 Received: from mailhost.u-ga.fr (mailhost1.u-ga.fr [152.77.1.10]) by zm-mta-out-3.u-ga.fr (Postfix) with ESMTP id 9B5CA40FE2; Wed, 6 Oct 2021 23:29:19 +0200 (CEST) Received: from smtps.univ-grenoble-alpes.fr (smtps2.u-ga.fr [152.77.18.2]) by mailhost.u-ga.fr (Postfix) with ESMTP id 84A9E60067; Wed, 6 Oct 2021 23:29:19 +0200 (CEST) Received: from palmier.tima.u-ga.fr (35.201.90.79.rev.sfr.net [79.90.201.35]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) (Authenticated sender: petrotf@univ-grenoble-alpes.fr) by smtps.univ-grenoble-alpes.fr (Postfix) with ESMTPSA id 4E55714005C; Wed, 6 Oct 2021 23:29:19 +0200 (CEST) From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20P=C3=A9trot?= To: qemu-devel@nongnu.org, qemu-riscv@nongnu.org Subject: [PATCH v2 01/27] memory: add a few defines for octo (128-bit) values Date: Wed, 6 Oct 2021 23:28:07 +0200 Message-Id: <20211006212833.108706-2-frederic.petrot@univ-grenoble-alpes.fr> X-Mailer: git-send-email 2.33.0 In-Reply-To: <20211006212833.108706-1-frederic.petrot@univ-grenoble-alpes.fr> References: <20211006212833.108706-1-frederic.petrot@univ-grenoble-alpes.fr> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable X-Greylist: Whitelist-UGA SMTP Authentifie (petrotf@univ-grenoble-alpes.fr) via submission-587 ACL (41) X-Greylist: Whitelist-UGA MAILHOST (SMTP non authentifie) depuis 152.77.18.2 Received-SPF: pass (zohomail.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; Received-SPF: pass client-ip=152.77.200.56; envelope-from=frederic.petrot@univ-grenoble-alpes.fr; helo=zm-mta-out-3.u-ga.fr X-Spam_score_int: -18 X-Spam_score: -1.9 X-Spam_bar: - X-Spam_report: (-1.9 / 5.0 requ) BAYES_00=-1.9, RCVD_IN_MSPIKE_H2=-0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action 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: bin.meng@windriver.com, richard.henderson@linaro.org, alistair.francis@wdc.com, fabien.portas@grenoble-inp.org, palmer@dabbelt.com, =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20P=C3=A9trot?= , philmd@redhat.com Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZM-MESSAGEID: 1633556313219100001 Introducing unsigned quad, signed quad, and octo accesses types to handle load and store by 128-bit processors. This is just a small addition to Richard's patch not yet upstreamed https://lore.kernel.org/qemu-devel/20210818191920.390759-24-richard.henders= on@linaro.org/ Note that the patch must be applied first for the rest to compile Signed-off-by: Fr=C3=A9d=C3=A9ric P=C3=A9trot Co-authored-by: Fabien Portas --- include/exec/memop.h | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/include/exec/memop.h b/include/exec/memop.h index 04264ffd6b..9297f58a39 100644 --- a/include/exec/memop.h +++ b/include/exec/memop.h @@ -85,10 +85,13 @@ typedef enum MemOp { MO_UB =3D MO_8, MO_UW =3D MO_16, MO_UL =3D MO_32, + MO_UQ =3D MO_64, MO_SB =3D MO_SIGN | MO_8, MO_SW =3D MO_SIGN | MO_16, MO_SL =3D MO_SIGN | MO_32, + MO_SQ =3D MO_SIGN | MO_64, MO_Q =3D MO_64, + MO_O =3D MO_128, =20 MO_LEUW =3D MO_LE | MO_UW, MO_LEUL =3D MO_LE | MO_UL, @@ -105,9 +108,12 @@ typedef enum MemOp { #ifdef NEED_CPU_H MO_TEUW =3D MO_TE | MO_UW, MO_TEUL =3D MO_TE | MO_UL, + MO_TEUQ =3D MO_TE | MO_UQ, MO_TESW =3D MO_TE | MO_SW, MO_TESL =3D MO_TE | MO_SL, + MO_TESQ =3D MO_TE | MO_SQ, MO_TEQ =3D MO_TE | MO_Q, + MO_TEO =3D MO_TE | MO_O, #endif =20 MO_SSIZE =3D MO_SIZE | MO_SIGN, --=20 2.33.0 From nobody Thu May 9 06:39:21 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; spf=pass (zohomail.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=univ-grenoble-alpes.fr Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1633556043844973.5288347775696; Wed, 6 Oct 2021 14:34:03 -0700 (PDT) Received: from localhost ([::1]:35006 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1mYEY5-0002aQ-4i for importer@patchew.org; Wed, 06 Oct 2021 17:34:01 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:49514) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1mYETe-0007xT-8y; Wed, 06 Oct 2021 17:29:27 -0400 Received: from zm-mta-out-3.u-ga.fr ([152.77.200.56]:43592) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1mYETc-0007w1-5g; Wed, 06 Oct 2021 17:29:26 -0400 Received: from mailhost.u-ga.fr (mailhost2.u-ga.fr [129.88.177.242]) by zm-mta-out-3.u-ga.fr (Postfix) with ESMTP id 19CEC40FF2; Wed, 6 Oct 2021 23:29:21 +0200 (CEST) Received: from smtps.univ-grenoble-alpes.fr (smtps2.u-ga.fr [152.77.18.2]) by mailhost.u-ga.fr (Postfix) with ESMTP id 0170360066; Wed, 6 Oct 2021 23:29:20 +0200 (CEST) Received: from palmier.tima.u-ga.fr (35.201.90.79.rev.sfr.net [79.90.201.35]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) (Authenticated sender: petrotf@univ-grenoble-alpes.fr) by smtps.univ-grenoble-alpes.fr (Postfix) with ESMTPSA id A5C4114005C; Wed, 6 Oct 2021 23:29:20 +0200 (CEST) From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20P=C3=A9trot?= To: qemu-devel@nongnu.org, qemu-riscv@nongnu.org Subject: [PATCH v2 02/27] Int128.h: addition of a few 128-bit operations Date: Wed, 6 Oct 2021 23:28:08 +0200 Message-Id: <20211006212833.108706-3-frederic.petrot@univ-grenoble-alpes.fr> X-Mailer: git-send-email 2.33.0 In-Reply-To: <20211006212833.108706-1-frederic.petrot@univ-grenoble-alpes.fr> References: <20211006212833.108706-1-frederic.petrot@univ-grenoble-alpes.fr> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable X-Greylist: Whitelist-UGA SMTP Authentifie (petrotf@univ-grenoble-alpes.fr) via submission-587 ACL (41) X-Greylist: Whitelist-UGA MAILHOST (SMTP non authentifie) depuis 152.77.18.2 Received-SPF: pass (zohomail.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; Received-SPF: pass client-ip=152.77.200.56; envelope-from=frederic.petrot@univ-grenoble-alpes.fr; helo=zm-mta-out-3.u-ga.fr X-Spam_score_int: -18 X-Spam_score: -1.9 X-Spam_bar: - X-Spam_report: (-1.9 / 5.0 requ) BAYES_00=-1.9, RCVD_IN_MSPIKE_H2=-0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action 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: bin.meng@windriver.com, richard.henderson@linaro.org, alistair.francis@wdc.com, fabien.portas@grenoble-inp.org, palmer@dabbelt.com, =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20P=C3=A9trot?= , philmd@redhat.com Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZM-MESSAGEID: 1633556046248100003 Addition of not, xor, div and rem on 128-bit integers, used in particular within div/rem and csr helpers for computations on 128-bit registers. These will be used by the 128-bit riscv version. Signed-off-by: Fr=C3=A9d=C3=A9ric P=C3=A9trot Co-authored-by: Fabien Portas --- include/qemu/int128.h | 264 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 264 insertions(+) diff --git a/include/qemu/int128.h b/include/qemu/int128.h index 2ac0746426..b3236d85ad 100644 --- a/include/qemu/int128.h +++ b/include/qemu/int128.h @@ -58,6 +58,11 @@ static inline Int128 int128_exts64(int64_t a) return a; } =20 +static inline Int128 int128_not(Int128 a) +{ + return ~a; +} + static inline Int128 int128_and(Int128 a, Int128 b) { return a & b; @@ -68,6 +73,11 @@ static inline Int128 int128_or(Int128 a, Int128 b) return a | b; } =20 +static inline Int128 int128_xor(Int128 a, Int128 b) +{ + return a ^ b; +} + static inline Int128 int128_rshift(Int128 a, int n) { return a >> n; @@ -162,6 +172,26 @@ static inline Int128 bswap128(Int128 a) #endif } =20 +static inline Int128 int128_divu(Int128 a, Int128 b) +{ + return (__uint128_t)a / (__uint128_t)b; +} + +static inline Int128 int128_remu(Int128 a, Int128 b) +{ + return (__uint128_t)a % (__uint128_t)b; +} + +static inline Int128 int128_divs(Int128 a, Int128 b) +{ + return a / b; +} + +static inline Int128 int128_rems(Int128 a, Int128 b) +{ + return a % b; +} + #else /* !CONFIG_INT128 */ =20 typedef struct Int128 Int128; @@ -235,6 +265,11 @@ static inline Int128 int128_exts64(int64_t a) return int128_make128(a, (a < 0) ? -1 : 0); } =20 +static inline Int128 int128_not(Int128 a) +{ + return int128_make128(~a.lo, ~a.hi); +} + static inline Int128 int128_and(Int128 a, Int128 b) { return int128_make128(a.lo & b.lo, a.hi & b.hi); @@ -245,6 +280,11 @@ static inline Int128 int128_or(Int128 a, Int128 b) return int128_make128(a.lo | b.lo, a.hi | b.hi); } =20 +static inline Int128 int128_xor(Int128 a, Int128 b) +{ + return int128_make128(a.lo ^ b.lo, a.hi ^ b.hi); +} + static inline Int128 int128_rshift(Int128 a, int n) { int64_t h; @@ -359,6 +399,228 @@ static inline Int128 bswap128(Int128 a) return int128_make128(bswap64(a.hi), bswap64(a.lo)); } =20 +#include "qemu/host-utils.h" +/* + * Division and remainder algorithms for 128-bit. + * Na=C3=AFve implementation of Knuth Algorithm D, can be optimized quite = a bit if + * it becomes a bootleneck. + * Precondition: function never called with v equals to 0, has to be dealt + * with beforehand. + */ +static inline void divrem128(uint64_t ul, uint64_t uh, + uint64_t vl, uint64_t vh, + uint64_t *ql, uint64_t *qh, + uint64_t *rl, uint64_t *rh) +{ + const uint64_t b =3D ((uint64_t) 1) << 32; + const int m =3D 4; + uint64_t qhat, rhat, p; + int n, s, i; + int64_t j, t, k; + + /* Build arrays of 32-bit words for u and v */ + uint32_t u[4] =3D {ul & 0xffffffff, (ul >> 32) & 0xffffffff, + uh & 0xffffffff, (uh >> 32) & 0xffffffff}; + uint32_t v[4] =3D {vl & 0xffffffff, (vl >> 32) & 0xffffffff, + vh & 0xffffffff, (vh >> 32) & 0xffffffff}; + + uint32_t q[4] =3D {0}, r[4] =3D {0}, un[5] =3D {0}, vn[4] =3D {0}; + + if (v[3]) { + n =3D 4; + } else if (v[2]) { + n =3D 3; + } else if (v[1]) { + n =3D 2; + } else if (v[0]) { + n =3D 1; + } else { + /* never happens, but makes gcc shy */ + n =3D 0; + } + + if (n =3D=3D 1) { + /* Take care of the case of a single-digit divisor here */ + k =3D 0; + for (j =3D m - 1; j >=3D 0; j--) { + q[j] =3D (k * b + u[j]) / v[0]; + k =3D (k * b + u[j]) - q[j] * v[0]; + } + if (r !=3D NULL) { + r[0] =3D k; + } + } else { + s =3D clz32(v[n - 1]); /* 0 <=3D s <=3D 32 */ + if (s !=3D 0) { + for (i =3D n - 1; i > 0; i--) { + vn[i] =3D ((v[i] << s) | (v[i - 1] >> (32 - s))); + } + vn[0] =3D v[0] << s; + + un[m] =3D u[m - 1] >> (32 - s); + for (i =3D m - 1; i > 0; i--) { + un[i] =3D (u[i] << s) | (u[i - 1] >> (32 - s)); + } + un[0] =3D u[0] << s; + } else { + for (i =3D 0; i < n; i++) { + vn[i] =3D v[i]; + } + + for (i =3D 0; i < m; i++) { + un[i] =3D u[i]; + } + un[m] =3D 0; + } + + /* Step D2 : loop on j */ + for (j =3D m - n; j >=3D 0; j--) { /* Main loop */ + /* Step D3 : Compute estimate qhat of q[j] */ + qhat =3D (un[j + n] * b + un[j + n - 1]) / vn[n - 1]; + /* Optimized mod vn[n -1 ] */ + rhat =3D (un[j + n] * b + un[j + n - 1]) - qhat * vn[n - 1]; + + while (true) { + if (qhat =3D=3D b + || qhat * vn[n - 2] > b * rhat + un[j + n - 2]) { + qhat =3D qhat - 1; + rhat =3D rhat + vn[n - 1]; + if (rhat < b) { + continue; + } + } + break; + } + + /* Step D4 : Multiply and subtract */ + k =3D 0; + for (i =3D 0; i < n; i++) { + p =3D qhat * vn[i]; + t =3D un[i + j] - k - (p & 0xffffffff); + un[i + j] =3D t; + k =3D (p >> 32) - (t >> 32); + } + t =3D un[j + n] - k; + un[j + n] =3D t; + + /* Step D5 */ + q[j] =3D qhat; /* Store quotient digit */ + /* Step D6 */ + if (t < 0) { /* If we subtracted too much, add back */ + q[j] =3D q[j] - 1; + k =3D 0; + for (i =3D 0; i < n; i++) { + t =3D un[i + j] + vn[i] + k; + un[i + j] =3D t; + k =3D t >> 32; + } + un[j + n] =3D un[j + n] + k; + } + } /* D7 Loop */ + + /* Step D8 : Unnormalize */ + if (rl && rh) { + if (s !=3D 0) { + for (i =3D 0; i < n; i++) { + r[i] =3D (un[i] >> s) | (un[i + 1] << (32 - s)); + } + } else { + for (i =3D 0; i < n; i++) { + r[i] =3D un[i]; + } + } + } + } + + if (ql && qh) { + *ql =3D q[0] | ((uint64_t)q[1] << 32); + *qh =3D q[2] | ((uint64_t)q[3] << 32); + } + + if (rl && rh) { + *rl =3D r[0] | ((uint64_t)r[1] << 32); + *rh =3D r[2] | ((uint64_t)r[3] << 32); + } +} + +static inline Int128 int128_divu(Int128 a, Int128 b) +{ + uint64_t qh, ql; + + divrem128(int128_getlo(a), int128_gethi(a), + int128_getlo(b), int128_gethi(b), + &ql, &qh, + NULL, NULL); + + return int128_make128(ql, qh); +} + +static inline Int128 int128_remu(Int128 a, Int128 b) +{ + uint64_t rh, rl; + + divrem128(int128_getlo(a), int128_gethi(a), + int128_getlo(b), int128_gethi(b), + NULL, NULL, + &rl, &rh); + + return int128_make128(rl, rh); +} + +static inline Int128 int128_divs(Int128 a, Int128 b) +{ + uint64_t qh, ql; + bool sgna =3D !int128_nonneg(a), + sgnb =3D !int128_nonneg(b); + + if (sgna) { + a =3D int128_neg(a); + } + + if (sgnb) { + b =3D int128_neg(b); + } + + divrem128(int128_getlo(a), int128_gethi(a), + int128_getlo(b), int128_gethi(b), + &ql, &qh, + NULL, NULL); + Int128 q =3D int128_make128(ql, qh); + + if (sgna !=3D sgnb) { + q =3D int128_neg(q); + } + + return q; +} + +static inline Int128 int128_rems(Int128 a, Int128 b) +{ + uint64_t rh, rl; + bool sgna =3D !int128_nonneg(a), + sgnb =3D !int128_nonneg(b); + + if (sgna) { + a =3D int128_neg(a); + } + + if (sgnb) { + b =3D int128_neg(b); + } + + divrem128(int128_getlo(a), int128_gethi(a), + int128_getlo(b), int128_gethi(b), + NULL, NULL, + &rl, &rh); + Int128 r =3D int128_make128(rl, rh); + + if (sgna) { + r =3D int128_neg(r); + } + + return r; +} + #endif /* CONFIG_INT128 */ =20 static inline void bswap128s(Int128 *s) @@ -366,4 +628,6 @@ static inline void bswap128s(Int128 *s) *s =3D bswap128(*s); } =20 +#define UINT128_MAX int128_make128(~0LL, ~0LL) + #endif /* INT128_H */ --=20 2.33.0 From nobody Thu May 9 06:39:21 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; spf=pass (zohomail.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=univ-grenoble-alpes.fr Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1633556044307660.5642204702119; Wed, 6 Oct 2021 14:34:04 -0700 (PDT) Received: from localhost ([::1]:35228 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1mYEY7-0002kX-9V for importer@patchew.org; Wed, 06 Oct 2021 17:34:03 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:49502) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1mYETd-0007xD-Di; Wed, 06 Oct 2021 17:29:26 -0400 Received: from zm-mta-out-3.u-ga.fr ([152.77.200.56]:43610) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1mYETb-0007w2-NZ; Wed, 06 Oct 2021 17:29:25 -0400 Received: from mailhost.u-ga.fr (mailhost2.u-ga.fr [129.88.177.242]) by zm-mta-out-3.u-ga.fr (Postfix) with ESMTP id 39B484100B; Wed, 6 Oct 2021 23:29:22 +0200 (CEST) Received: from smtps.univ-grenoble-alpes.fr (smtps2.u-ga.fr [152.77.18.2]) by mailhost.u-ga.fr (Postfix) with ESMTP id 228D060066; Wed, 6 Oct 2021 23:29:22 +0200 (CEST) Received: from palmier.tima.u-ga.fr (35.201.90.79.rev.sfr.net [79.90.201.35]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) (Authenticated sender: petrotf@univ-grenoble-alpes.fr) by smtps.univ-grenoble-alpes.fr (Postfix) with ESMTPSA id DB8B614005C; Wed, 6 Oct 2021 23:29:21 +0200 (CEST) From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20P=C3=A9trot?= To: qemu-devel@nongnu.org, qemu-riscv@nongnu.org Subject: [PATCH v2 03/27] target/riscv: adding upper 64 bits for misa Date: Wed, 6 Oct 2021 23:28:09 +0200 Message-Id: <20211006212833.108706-4-frederic.petrot@univ-grenoble-alpes.fr> X-Mailer: git-send-email 2.33.0 In-Reply-To: <20211006212833.108706-1-frederic.petrot@univ-grenoble-alpes.fr> References: <20211006212833.108706-1-frederic.petrot@univ-grenoble-alpes.fr> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable X-Greylist: Whitelist-UGA SMTP Authentifie (petrotf@univ-grenoble-alpes.fr) via submission-587 ACL (41) X-Greylist: Whitelist-UGA MAILHOST (SMTP non authentifie) depuis 152.77.18.2 Received-SPF: pass (zohomail.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; Received-SPF: pass client-ip=152.77.200.56; envelope-from=frederic.petrot@univ-grenoble-alpes.fr; helo=zm-mta-out-3.u-ga.fr X-Spam_score_int: -18 X-Spam_score: -1.9 X-Spam_bar: - X-Spam_report: (-1.9 / 5.0 requ) BAYES_00=-1.9, RCVD_IN_MSPIKE_H2=-0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action 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: bin.meng@windriver.com, richard.henderson@linaro.org, alistair.francis@wdc.com, fabien.portas@grenoble-inp.org, palmer@dabbelt.com, =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20P=C3=A9trot?= , philmd@redhat.com Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZM-MESSAGEID: 1633556046234100002 Addition of misah, upper part of misa in the 128-bit extension. This is required for the is_64bit and is_128bit macros that we introduce in addition to the existing is_32bit one to know which register size the processor uses. Signed-off-by: Fr=C3=A9d=C3=A9ric P=C3=A9trot Co-authored-by: Fabien Portas --- target/riscv/cpu.h | 11 +++++++++++ target/riscv/cpu.c | 2 ++ target/riscv/translate.c | 21 ++++++++++++++++++++- 3 files changed, 33 insertions(+), 1 deletion(-) diff --git a/target/riscv/cpu.h b/target/riscv/cpu.h index 5896aca346..0c41b60b25 100644 --- a/target/riscv/cpu.h +++ b/target/riscv/cpu.h @@ -37,6 +37,7 @@ #define TYPE_RISCV_CPU_ANY RISCV_CPU_TYPE_NAME("any") #define TYPE_RISCV_CPU_BASE32 RISCV_CPU_TYPE_NAME("rv32") #define TYPE_RISCV_CPU_BASE64 RISCV_CPU_TYPE_NAME("rv64") +#define TYPE_RISCV_CPU_BASE128 RISCV_CPU_TYPE_NAME("rv128") #define TYPE_RISCV_CPU_IBEX RISCV_CPU_TYPE_NAME("lowrisc-ibex") #define TYPE_RISCV_CPU_SHAKTI_C RISCV_CPU_TYPE_NAME("shakti-c") #define TYPE_RISCV_CPU_SIFIVE_E31 RISCV_CPU_TYPE_NAME("sifive-e31") @@ -49,10 +50,16 @@ # define TYPE_RISCV_CPU_BASE TYPE_RISCV_CPU_BASE32 #elif defined(TARGET_RISCV64) # define TYPE_RISCV_CPU_BASE TYPE_RISCV_CPU_BASE64 +#else +# define TYPE_RISCV_CPU_BASE TYPE_RISCV_CPU_BASE128 #endif =20 +/* Mask for the MXLEN flag in the misa CSR */ +#define MXLEN_MASK ((target_ulong)3 << (TARGET_LONG_BITS - 2)) #define RV32 ((target_ulong)1 << (TARGET_LONG_BITS - 2)) #define RV64 ((target_ulong)2 << (TARGET_LONG_BITS - 2)) +/* To be used on misah, the upper part of misa */ +#define RV128 ((target_ulong)3 << (TARGET_LONG_BITS - 2)) =20 #define RV(x) ((target_ulong)1 << (x - 'A')) =20 @@ -187,6 +194,10 @@ struct CPURISCVState { target_ulong hgatp; uint64_t htimedelta; =20 + /* Upper 64-bits of 128-bit misa CSR */ + uint64_t misah; + uint64_t misah_mask; + /* Virtual CSRs */ /* * For RV32 this is 32-bit vsstatus and 32-bit vsstatush. diff --git a/target/riscv/cpu.c b/target/riscv/cpu.c index 7c626d89cd..02417be926 100644 --- a/target/riscv/cpu.c +++ b/target/riscv/cpu.c @@ -154,8 +154,10 @@ static void riscv_any_cpu_init(Object *obj) CPURISCVState *env =3D &RISCV_CPU(obj)->env; #if defined(TARGET_RISCV32) set_misa(env, RV32 | RVI | RVM | RVA | RVF | RVD | RVC | RVU); + set_misah(env, 0); #elif defined(TARGET_RISCV64) set_misa(env, RV64 | RVI | RVM | RVA | RVF | RVD | RVC | RVU); + set_misah(env, 0); #endif set_priv_version(env, PRIV_VERSION_1_11_0); } diff --git a/target/riscv/translate.c b/target/riscv/translate.c index 74b33fa3c9..c04430805e 100644 --- a/target/riscv/translate.c +++ b/target/riscv/translate.c @@ -56,6 +56,7 @@ typedef struct DisasContext { target_ulong pc_succ_insn; target_ulong priv_ver; target_ulong misa; + uint64_t misah; uint32_t opcode; uint32_t mstatus_fs; uint32_t mem_idx; @@ -90,13 +91,30 @@ static inline bool has_ext(DisasContext *ctx, uint32_t = ext) =20 #ifdef TARGET_RISCV32 # define is_32bit(ctx) true +# define is_64bit(ctx) false +# define is_128bit(ctx) false #elif defined(CONFIG_USER_ONLY) # define is_32bit(ctx) false +# define is_64_bit(ctx) true +# define is_128_bit(ctx) false #else static inline bool is_32bit(DisasContext *ctx) { - return (ctx->misa & RV32) =3D=3D RV32; + return (ctx->misa & MXLEN_MASK) =3D=3D RV32; } + +static inline bool is_64bit(DisasContext *ctx) +{ + return (ctx->misa & MXLEN_MASK) =3D=3D RV64; +} +#if !defined(TARGET_RISCV64) +static inline bool is_128bit(DisasContext *ctx) +{ + return (ctx->misah & MXLEN_MASK) =3D=3D RV128; +} +#else +# define is_128bit(ctx) false +#endif #endif =20 /* The word size for this operation. */ @@ -530,6 +548,7 @@ static void riscv_tr_init_disas_context(DisasContextBas= e *dcbase, CPUState *cs) ctx->virt_enabled =3D false; #endif ctx->misa =3D env->misa; + ctx->misah =3D env->misah; ctx->frm =3D -1; /* unknown rounding mode */ ctx->ext_ifencei =3D cpu->cfg.ext_ifencei; ctx->vlen =3D cpu->cfg.vlen; --=20 2.33.0 From nobody Thu May 9 06:39:21 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; spf=pass (zohomail.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=univ-grenoble-alpes.fr Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1633556605125482.7481179536379; Wed, 6 Oct 2021 14:43:25 -0700 (PDT) Received: from localhost ([::1]:52154 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1mYEh9-00063y-P2 for importer@patchew.org; Wed, 06 Oct 2021 17:43:23 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:49518) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1mYETe-0007xc-EP; Wed, 06 Oct 2021 17:29:27 -0400 Received: from zm-mta-out-3.u-ga.fr ([152.77.200.56]:43632) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1mYETc-0007x1-NA; Wed, 06 Oct 2021 17:29:26 -0400 Received: from mailhost.u-ga.fr (mailhost2.u-ga.fr [129.88.177.242]) by zm-mta-out-3.u-ga.fr (Postfix) with ESMTP id 376DB4101C; Wed, 6 Oct 2021 23:29:23 +0200 (CEST) Received: from smtps.univ-grenoble-alpes.fr (smtps2.u-ga.fr [152.77.18.2]) by mailhost.u-ga.fr (Postfix) with ESMTP id 1FB8F60066; Wed, 6 Oct 2021 23:29:23 +0200 (CEST) Received: from palmier.tima.u-ga.fr (35.201.90.79.rev.sfr.net [79.90.201.35]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) (Authenticated sender: petrotf@univ-grenoble-alpes.fr) by smtps.univ-grenoble-alpes.fr (Postfix) with ESMTPSA id E067714005C; Wed, 6 Oct 2021 23:29:22 +0200 (CEST) From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20P=C3=A9trot?= To: qemu-devel@nongnu.org, qemu-riscv@nongnu.org Subject: [PATCH v2 04/27] target/riscv: array for the 64 upper bits of 128-bit registers Date: Wed, 6 Oct 2021 23:28:10 +0200 Message-Id: <20211006212833.108706-5-frederic.petrot@univ-grenoble-alpes.fr> X-Mailer: git-send-email 2.33.0 In-Reply-To: <20211006212833.108706-1-frederic.petrot@univ-grenoble-alpes.fr> References: <20211006212833.108706-1-frederic.petrot@univ-grenoble-alpes.fr> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable X-Greylist: Whitelist-UGA SMTP Authentifie (petrotf@univ-grenoble-alpes.fr) via submission-587 ACL (41) X-Greylist: Whitelist-UGA MAILHOST (SMTP non authentifie) depuis 152.77.18.2 Received-SPF: pass (zohomail.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; Received-SPF: pass client-ip=152.77.200.56; envelope-from=frederic.petrot@univ-grenoble-alpes.fr; helo=zm-mta-out-3.u-ga.fr X-Spam_score_int: -18 X-Spam_score: -1.9 X-Spam_bar: - X-Spam_report: (-1.9 / 5.0 requ) BAYES_00=-1.9, RCVD_IN_MSPIKE_H2=-0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action 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: bin.meng@windriver.com, richard.henderson@linaro.org, alistair.francis@wdc.com, fabien.portas@grenoble-inp.org, palmer@dabbelt.com, =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20P=C3=A9trot?= , philmd@redhat.com Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZM-MESSAGEID: 1633556606414100001 The upper 64-bit of the 128-bit registers have now a place inside the cpu state structure, and are created as globals for future use. Signed-off-by: Fr=C3=A9d=C3=A9ric P=C3=A9trot Co-authored-by: Fabien Portas --- target/riscv/cpu.h | 3 +++ target/riscv/translate.c | 6 +++++- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/target/riscv/cpu.h b/target/riscv/cpu.h index 0c41b60b25..1de9a1286b 100644 --- a/target/riscv/cpu.h +++ b/target/riscv/cpu.h @@ -120,6 +120,7 @@ FIELD(VTYPE, VILL, sizeof(target_ulong) * 8 - 1, 1) =20 struct CPURISCVState { target_ulong gpr[32]; + target_ulong gprh[32]; /* 64 top bits of the 128-bit registers */ uint64_t fpr[32]; /* assume both F and D extensions */ =20 /* vector coprocessor state. */ @@ -405,6 +406,8 @@ FIELD(TB_FLAGS, VILL, 8, 1) FIELD(TB_FLAGS, HLSX, 9, 1) =20 bool riscv_cpu_is_32bit(CPURISCVState *env); +bool riscv_cpu_is_64bit(CPURISCVState *env); +bool riscv_cpu_is_128bit(CPURISCVState *env); =20 /* * A simplification for VLMAX diff --git a/target/riscv/translate.c b/target/riscv/translate.c index c04430805e..3c929ce960 100644 --- a/target/riscv/translate.c +++ b/target/riscv/translate.c @@ -32,7 +32,7 @@ #include "instmap.h" =20 /* global register indices */ -static TCGv cpu_gpr[32], cpu_pc, cpu_vl; +static TCGv cpu_gpr[32], cpu_gprh[32], cpu_pc, cpu_vl; static TCGv_i64 cpu_fpr[32]; /* assume F and D extensions */ static TCGv load_res; static TCGv load_val; @@ -55,6 +55,7 @@ typedef struct DisasContext { /* pc_succ_insn points to the instruction following base.pc_next */ target_ulong pc_succ_insn; target_ulong priv_ver; + /* Type of csrs should be MXLEN, that might be dynamically settable */ target_ulong misa; uint64_t misah; uint32_t opcode; @@ -658,10 +659,13 @@ void riscv_translate_init(void) * unless you specifically block reads/writes to reg 0. */ cpu_gpr[0] =3D NULL; + cpu_gprh[0] =3D NULL; =20 for (i =3D 1; i < 32; i++) { cpu_gpr[i] =3D tcg_global_mem_new(cpu_env, offsetof(CPURISCVState, gpr[i]), riscv_int_regnames[i]); + cpu_gprh[i] =3D tcg_global_mem_new(cpu_env, + offsetof(CPURISCVState, gprh[i]), riscv_int_regnames[i]); } =20 for (i =3D 0; i < 32; i++) { --=20 2.33.0 From nobody Thu May 9 06:39:21 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; spf=pass (zohomail.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=univ-grenoble-alpes.fr Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1633556319306934.2901914397247; Wed, 6 Oct 2021 14:38:39 -0700 (PDT) Received: from localhost ([::1]:43542 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1mYEcY-0008Uy-9y for importer@patchew.org; Wed, 06 Oct 2021 17:38:38 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:49528) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1mYETf-0007xh-D1; Wed, 06 Oct 2021 17:29:27 -0400 Received: from zm-mta-out-3.u-ga.fr ([152.77.200.56]:43652) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1mYETd-0007yf-R7; Wed, 06 Oct 2021 17:29:27 -0400 Received: from mailhost.u-ga.fr (mailhost1.u-ga.fr [152.77.1.10]) by zm-mta-out-3.u-ga.fr (Postfix) with ESMTP id 3AF50410F5; Wed, 6 Oct 2021 23:29:24 +0200 (CEST) Received: from smtps.univ-grenoble-alpes.fr (smtps2.u-ga.fr [152.77.18.2]) by mailhost.u-ga.fr (Postfix) with ESMTP id 239C960067; Wed, 6 Oct 2021 23:29:24 +0200 (CEST) Received: from palmier.tima.u-ga.fr (35.201.90.79.rev.sfr.net [79.90.201.35]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) (Authenticated sender: petrotf@univ-grenoble-alpes.fr) by smtps.univ-grenoble-alpes.fr (Postfix) with ESMTPSA id DFA2614005C; Wed, 6 Oct 2021 23:29:23 +0200 (CEST) From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20P=C3=A9trot?= To: qemu-devel@nongnu.org, qemu-riscv@nongnu.org Subject: [PATCH v2 05/27] target/riscv: additional macros to check instruction support Date: Wed, 6 Oct 2021 23:28:11 +0200 Message-Id: <20211006212833.108706-6-frederic.petrot@univ-grenoble-alpes.fr> X-Mailer: git-send-email 2.33.0 In-Reply-To: <20211006212833.108706-1-frederic.petrot@univ-grenoble-alpes.fr> References: <20211006212833.108706-1-frederic.petrot@univ-grenoble-alpes.fr> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable X-Greylist: Whitelist-UGA SMTP Authentifie (petrotf@univ-grenoble-alpes.fr) via submission-587 ACL (41) X-Greylist: Whitelist-UGA MAILHOST (SMTP non authentifie) depuis 152.77.18.2 Received-SPF: pass (zohomail.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; Received-SPF: pass client-ip=152.77.200.56; envelope-from=frederic.petrot@univ-grenoble-alpes.fr; helo=zm-mta-out-3.u-ga.fr X-Spam_score_int: -18 X-Spam_score: -1.9 X-Spam_bar: - X-Spam_report: (-1.9 / 5.0 requ) BAYES_00=-1.9, RCVD_IN_MSPIKE_H2=-0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action 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: bin.meng@windriver.com, richard.henderson@linaro.org, alistair.francis@wdc.com, fabien.portas@grenoble-inp.org, palmer@dabbelt.com, =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20P=C3=A9trot?= , philmd@redhat.com Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZM-MESSAGEID: 1633556319795100001 Given that the 128-bit version of the riscv spec adds new instructions, and that some instructions that were previously only available in 64-bit mode are now available for both 64-bit and 128-bit, we added new macros to check for the processor mode during translation. Signed-off-by: Fr=C3=A9d=C3=A9ric P=C3=A9trot Co-authored-by: Fabien Portas --- target/riscv/translate.c | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/target/riscv/translate.c b/target/riscv/translate.c index 3c929ce960..96a1e40606 100644 --- a/target/riscv/translate.c +++ b/target/riscv/translate.c @@ -357,11 +357,29 @@ EX_SH(12) } while (0) =20 #define REQUIRE_64BIT(ctx) do { \ - if (is_32bit(ctx)) { \ + if (!is_64bit(ctx)) { \ return false; \ } \ } while (0) =20 +#define REQUIRE_128BIT(ctx) do { \ + if (!is_128bit(ctx)) { \ + return false; \ + } \ +} while (0) + +#define REQUIRE_32_OR_64BIT(ctx) do { \ + if (is_128bit(ctx)) { \ + return false; \ + } \ +} while (0) + +#define REQUIRE_64_OR_128BIT(ctx) do { \ + if (is_32bit(ctx)) { \ + return false; \ + } \ +} while (0) + static int ex_rvc_register(DisasContext *ctx, int reg) { return 8 + reg; --=20 2.33.0 From nobody Thu May 9 06:39:21 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; spf=pass (zohomail.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=univ-grenoble-alpes.fr Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1633556606933287.0095660914378; Wed, 6 Oct 2021 14:43:26 -0700 (PDT) Received: from localhost ([::1]:52336 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1mYEhB-0006Bn-QF for importer@patchew.org; Wed, 06 Oct 2021 17:43:25 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:49540) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1mYETh-0007ya-86; Wed, 06 Oct 2021 17:29:29 -0400 Received: from zm-mta-out-3.u-ga.fr ([152.77.200.56]:43680) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1mYETe-0007yq-OE; Wed, 06 Oct 2021 17:29:28 -0400 Received: from mailhost.u-ga.fr (mailhost2.u-ga.fr [129.88.177.242]) by zm-mta-out-3.u-ga.fr (Postfix) with ESMTP id 2511F412F4; Wed, 6 Oct 2021 23:29:25 +0200 (CEST) Received: from smtps.univ-grenoble-alpes.fr (smtps2.u-ga.fr [152.77.18.2]) by mailhost.u-ga.fr (Postfix) with ESMTP id 0E37160066; Wed, 6 Oct 2021 23:29:25 +0200 (CEST) Received: from palmier.tima.u-ga.fr (35.201.90.79.rev.sfr.net [79.90.201.35]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) (Authenticated sender: petrotf@univ-grenoble-alpes.fr) by smtps.univ-grenoble-alpes.fr (Postfix) with ESMTPSA id C478D14005C; Wed, 6 Oct 2021 23:29:24 +0200 (CEST) From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20P=C3=A9trot?= To: qemu-devel@nongnu.org, qemu-riscv@nongnu.org Subject: [PATCH v2 06/27] target/riscv: separation of bitwise logic and aritmetic helpers Date: Wed, 6 Oct 2021 23:28:12 +0200 Message-Id: <20211006212833.108706-7-frederic.petrot@univ-grenoble-alpes.fr> X-Mailer: git-send-email 2.33.0 In-Reply-To: <20211006212833.108706-1-frederic.petrot@univ-grenoble-alpes.fr> References: <20211006212833.108706-1-frederic.petrot@univ-grenoble-alpes.fr> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable X-Greylist: Whitelist-UGA SMTP Authentifie (petrotf@univ-grenoble-alpes.fr) via submission-587 ACL (41) X-Greylist: Whitelist-UGA MAILHOST (SMTP non authentifie) depuis 152.77.18.2 Received-SPF: pass (zohomail.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; Received-SPF: pass client-ip=152.77.200.56; envelope-from=frederic.petrot@univ-grenoble-alpes.fr; helo=zm-mta-out-3.u-ga.fr X-Spam_score_int: -18 X-Spam_score: -1.9 X-Spam_bar: - X-Spam_report: (-1.9 / 5.0 requ) BAYES_00=-1.9, RCVD_IN_MSPIKE_H2=-0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action 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: bin.meng@windriver.com, richard.henderson@linaro.org, alistair.francis@wdc.com, fabien.portas@grenoble-inp.org, palmer@dabbelt.com, =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20P=C3=A9trot?= , philmd@redhat.com Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZM-MESSAGEID: 1633556608460100003 Introduction of a gen_logic function for bitwise logic to implement instructions in which not propagation of information occurs between bits and use of this function on the bitwise instructions. Signed-off-by: Fr=C3=A9d=C3=A9ric P=C3=A9trot Co-authored-by: Fabien Portas --- target/riscv/translate.c | 27 +++++++++++++++++++++++++ target/riscv/insn_trans/trans_rvb.c.inc | 16 +++++++-------- target/riscv/insn_trans/trans_rvi.c.inc | 12 +++++------ 3 files changed, 41 insertions(+), 14 deletions(-) diff --git a/target/riscv/translate.c b/target/riscv/translate.c index 96a1e40606..86623f81e8 100644 --- a/target/riscv/translate.c +++ b/target/riscv/translate.c @@ -394,6 +394,19 @@ static int ex_rvc_shifti(DisasContext *ctx, int imm) /* Include the auto-generated decoder for 32 bit insn */ #include "decode-insn32.c.inc" =20 +static bool gen_logic_imm_fn(DisasContext *ctx, arg_i *a, DisasExtend ext, + void (*func)(TCGv, TCGv, target_long)) +{ + TCGv dest =3D dest_gpr(ctx, a->rd); + TCGv src1 =3D get_gpr(ctx, a->rs1, ext); + + func(dest, src1, a->imm); + + gen_set_gpr(ctx, a->rd, dest); + + return true; +} + static bool gen_arith_imm_fn(DisasContext *ctx, arg_i *a, DisasExtend ext, void (*func)(TCGv, TCGv, target_long)) { @@ -419,6 +432,20 @@ static bool gen_arith_imm_tl(DisasContext *ctx, arg_i = *a, DisasExtend ext, return true; } =20 +static bool gen_logic(DisasContext *ctx, arg_r *a, DisasExtend ext, + void (*func)(TCGv, TCGv, TCGv)) +{ + TCGv dest =3D dest_gpr(ctx, a->rd); + TCGv src1 =3D get_gpr(ctx, a->rs1, ext); + TCGv src2 =3D get_gpr(ctx, a->rs2, ext); + + func(dest, src1, src2); + + gen_set_gpr(ctx, a->rd, dest); + + return true; +} + static bool gen_arith(DisasContext *ctx, arg_r *a, DisasExtend ext, void (*func)(TCGv, TCGv, TCGv)) { diff --git a/target/riscv/insn_trans/trans_rvb.c.inc b/target/riscv/insn_tr= ans/trans_rvb.c.inc index b72e76255c..326d9939a0 100644 --- a/target/riscv/insn_trans/trans_rvb.c.inc +++ b/target/riscv/insn_trans/trans_rvb.c.inc @@ -49,19 +49,19 @@ static bool trans_cpop(DisasContext *ctx, arg_cpop *a) static bool trans_andn(DisasContext *ctx, arg_andn *a) { REQUIRE_EXT(ctx, RVB); - return gen_arith(ctx, a, EXT_NONE, tcg_gen_andc_tl); + return gen_logic(ctx, a, EXT_NONE, tcg_gen_andc_tl); } =20 static bool trans_orn(DisasContext *ctx, arg_orn *a) { REQUIRE_EXT(ctx, RVB); - return gen_arith(ctx, a, EXT_NONE, tcg_gen_orc_tl); + return gen_logic(ctx, a, EXT_NONE, tcg_gen_orc_tl); } =20 static bool trans_xnor(DisasContext *ctx, arg_xnor *a) { REQUIRE_EXT(ctx, RVB); - return gen_arith(ctx, a, EXT_NONE, tcg_gen_eqv_tl); + return gen_logic(ctx, a, EXT_NONE, tcg_gen_eqv_tl); } =20 static void gen_pack(TCGv ret, TCGv arg1, TCGv arg2) @@ -74,7 +74,7 @@ static void gen_pack(TCGv ret, TCGv arg1, TCGv arg2) static bool trans_pack(DisasContext *ctx, arg_pack *a) { REQUIRE_EXT(ctx, RVB); - return gen_arith(ctx, a, EXT_NONE, gen_pack); + return gen_logic(ctx, a, EXT_NONE, gen_pack); } =20 static void gen_packu(TCGv ret, TCGv arg1, TCGv arg2) @@ -88,7 +88,7 @@ static void gen_packu(TCGv ret, TCGv arg1, TCGv arg2) static bool trans_packu(DisasContext *ctx, arg_packu *a) { REQUIRE_EXT(ctx, RVB); - return gen_arith(ctx, a, EXT_NONE, gen_packu); + return gen_logic(ctx, a, EXT_NONE, gen_packu); } =20 static void gen_packh(TCGv ret, TCGv arg1, TCGv arg2) @@ -102,7 +102,7 @@ static void gen_packh(TCGv ret, TCGv arg1, TCGv arg2) static bool trans_packh(DisasContext *ctx, arg_packh *a) { REQUIRE_EXT(ctx, RVB); - return gen_arith(ctx, a, EXT_NONE, gen_packh); + return gen_logic(ctx, a, EXT_NONE, gen_packh); } =20 static bool trans_min(DisasContext *ctx, arg_min *a) @@ -393,7 +393,7 @@ static bool trans_packw(DisasContext *ctx, arg_packw *a) { REQUIRE_64BIT(ctx); REQUIRE_EXT(ctx, RVB); - return gen_arith(ctx, a, EXT_NONE, gen_packw); + return gen_logic(ctx, a, EXT_NONE, gen_packw); } =20 static void gen_packuw(TCGv ret, TCGv arg1, TCGv arg2) @@ -409,7 +409,7 @@ static bool trans_packuw(DisasContext *ctx, arg_packuw = *a) { REQUIRE_64BIT(ctx); REQUIRE_EXT(ctx, RVB); - return gen_arith(ctx, a, EXT_NONE, gen_packuw); + return gen_logic(ctx, a, EXT_NONE, gen_packuw); } =20 static bool trans_bsetw(DisasContext *ctx, arg_bsetw *a) diff --git a/target/riscv/insn_trans/trans_rvi.c.inc b/target/riscv/insn_tr= ans/trans_rvi.c.inc index 920ae0edb3..844080ec2b 100644 --- a/target/riscv/insn_trans/trans_rvi.c.inc +++ b/target/riscv/insn_trans/trans_rvi.c.inc @@ -252,17 +252,17 @@ static bool trans_sltiu(DisasContext *ctx, arg_sltiu = *a) =20 static bool trans_xori(DisasContext *ctx, arg_xori *a) { - return gen_arith_imm_fn(ctx, a, EXT_NONE, tcg_gen_xori_tl); + return gen_logic_imm_fn(ctx, a, EXT_NONE, tcg_gen_xori_tl); } =20 static bool trans_ori(DisasContext *ctx, arg_ori *a) { - return gen_arith_imm_fn(ctx, a, EXT_NONE, tcg_gen_ori_tl); + return gen_logic_imm_fn(ctx, a, EXT_NONE, tcg_gen_ori_tl); } =20 static bool trans_andi(DisasContext *ctx, arg_andi *a) { - return gen_arith_imm_fn(ctx, a, EXT_NONE, tcg_gen_andi_tl); + return gen_logic_imm_fn(ctx, a, EXT_NONE, tcg_gen_andi_tl); } =20 static bool trans_slli(DisasContext *ctx, arg_slli *a) @@ -307,7 +307,7 @@ static bool trans_sltu(DisasContext *ctx, arg_sltu *a) =20 static bool trans_xor(DisasContext *ctx, arg_xor *a) { - return gen_arith(ctx, a, EXT_NONE, tcg_gen_xor_tl); + return gen_logic(ctx, a, EXT_NONE, tcg_gen_xor_tl); } =20 static bool trans_srl(DisasContext *ctx, arg_srl *a) @@ -322,12 +322,12 @@ static bool trans_sra(DisasContext *ctx, arg_sra *a) =20 static bool trans_or(DisasContext *ctx, arg_or *a) { - return gen_arith(ctx, a, EXT_NONE, tcg_gen_or_tl); + return gen_logic(ctx, a, EXT_NONE, tcg_gen_or_tl); } =20 static bool trans_and(DisasContext *ctx, arg_and *a) { - return gen_arith(ctx, a, EXT_NONE, tcg_gen_and_tl); + return gen_logic(ctx, a, EXT_NONE, tcg_gen_and_tl); } =20 static bool trans_addiw(DisasContext *ctx, arg_addiw *a) --=20 2.33.0 From nobody Thu May 9 06:39:21 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; spf=pass (zohomail.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=univ-grenoble-alpes.fr Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1633556917126180.54031508844128; Wed, 6 Oct 2021 14:48:37 -0700 (PDT) Received: from localhost ([::1]:60916 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1mYEmB-0003jO-Ts for importer@patchew.org; Wed, 06 Oct 2021 17:48:35 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:49560) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1mYETj-00080n-5b; Wed, 06 Oct 2021 17:29:31 -0400 Received: from zm-mta-out-3.u-ga.fr ([152.77.200.56]:43706) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1mYETf-0007zl-Q1; Wed, 06 Oct 2021 17:29:30 -0400 Received: from mailhost.u-ga.fr (mailhost1.u-ga.fr [152.77.1.10]) by zm-mta-out-3.u-ga.fr (Postfix) with ESMTP id 336DE41D91; Wed, 6 Oct 2021 23:29:26 +0200 (CEST) Received: from smtps.univ-grenoble-alpes.fr (smtps2.u-ga.fr [152.77.18.2]) by mailhost.u-ga.fr (Postfix) with ESMTP id 1AB9460067; Wed, 6 Oct 2021 23:29:26 +0200 (CEST) Received: from palmier.tima.u-ga.fr (35.201.90.79.rev.sfr.net [79.90.201.35]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) (Authenticated sender: petrotf@univ-grenoble-alpes.fr) by smtps.univ-grenoble-alpes.fr (Postfix) with ESMTPSA id C7C0214005C; Wed, 6 Oct 2021 23:29:25 +0200 (CEST) From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20P=C3=A9trot?= To: qemu-devel@nongnu.org, qemu-riscv@nongnu.org Subject: [PATCH v2 07/27] target/riscv: refactoring calls to gen_arith Date: Wed, 6 Oct 2021 23:28:13 +0200 Message-Id: <20211006212833.108706-8-frederic.petrot@univ-grenoble-alpes.fr> X-Mailer: git-send-email 2.33.0 In-Reply-To: <20211006212833.108706-1-frederic.petrot@univ-grenoble-alpes.fr> References: <20211006212833.108706-1-frederic.petrot@univ-grenoble-alpes.fr> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable X-Greylist: Whitelist-UGA SMTP Authentifie (petrotf@univ-grenoble-alpes.fr) via submission-587 ACL (41) X-Greylist: Whitelist-UGA MAILHOST (SMTP non authentifie) depuis 152.77.18.2 Received-SPF: pass (zohomail.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; Received-SPF: pass client-ip=152.77.200.56; envelope-from=frederic.petrot@univ-grenoble-alpes.fr; helo=zm-mta-out-3.u-ga.fr X-Spam_score_int: -18 X-Spam_score: -1.9 X-Spam_bar: - X-Spam_report: (-1.9 / 5.0 requ) BAYES_00=-1.9, RCVD_IN_MSPIKE_H2=-0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action 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: bin.meng@windriver.com, richard.henderson@linaro.org, alistair.francis@wdc.com, fabien.portas@grenoble-inp.org, palmer@dabbelt.com, =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20P=C3=A9trot?= , philmd@redhat.com Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZM-MESSAGEID: 1633556918245100001 gen_arith now takes three functions instead of one as arguments, one for each register size. All call sites changed to use this refactored version, without yet supporting sizes other than 32 and 64. Signed-off-by: Fr=C3=A9d=C3=A9ric P=C3=A9trot Co-authored-by: Fabien Portas --- target/riscv/translate.c | 100 +++++++++++++++++------- target/riscv/insn_trans/trans_rvb.c.inc | 17 ++-- target/riscv/insn_trans/trans_rvi.c.inc | 26 +++--- target/riscv/insn_trans/trans_rvm.c.inc | 39 ++++++--- 4 files changed, 123 insertions(+), 59 deletions(-) diff --git a/target/riscv/translate.c b/target/riscv/translate.c index 86623f81e8..c940698478 100644 --- a/target/riscv/translate.c +++ b/target/riscv/translate.c @@ -407,55 +407,97 @@ static bool gen_logic_imm_fn(DisasContext *ctx, arg_i= *a, DisasExtend ext, return true; } =20 +static bool gen_logic(DisasContext *ctx, arg_r *a, DisasExtend ext, + void (*func)(TCGv, TCGv, TCGv)) +{ + TCGv dest =3D dest_gpr(ctx, a->rd); + TCGv src1 =3D get_gpr(ctx, a->rs1, ext); + TCGv src2 =3D get_gpr(ctx, a->rs2, ext); + + func(dest, src1, src2); + + gen_set_gpr(ctx, a->rd, dest); + + return true; +} + static bool gen_arith_imm_fn(DisasContext *ctx, arg_i *a, DisasExtend ext, - void (*func)(TCGv, TCGv, target_long)) + void (*fn32)(TCGv, TCGv, target_long), + void (*fn64)(TCGv, TCGv, target_long), + void (*fn128)(TCGv, TCGv, TCGv, TCGv, target_= long)) { - TCGv dest =3D dest_gpr(ctx, a->rd); - TCGv src1 =3D get_gpr(ctx, a->rs1, ext); + if (is_32bit(ctx)) { + TCGv dest =3D dest_gpr(ctx, a->rd); + TCGv src1 =3D get_gpr(ctx, a->rs1, ext); =20 - func(dest, src1, a->imm); + fn32(dest, src1, a->imm); =20 - gen_set_gpr(ctx, a->rd, dest); + gen_set_gpr(ctx, a->rd, dest); + } else if (is_64bit(ctx)) { + TCGv dest =3D dest_gpr(ctx, a->rd); + TCGv src1 =3D get_gpr(ctx, a->rs1, ext); + + fn64(dest, src1, a->imm); + + gen_set_gpr(ctx, a->rd, dest); + } else { + return false; + } return true; } =20 static bool gen_arith_imm_tl(DisasContext *ctx, arg_i *a, DisasExtend ext, - void (*func)(TCGv, TCGv, TCGv)) + void (*fn32)(TCGv, TCGv, TCGv), + void (*fn64)(TCGv, TCGv, TCGv), + void (*fn128)(TCGv, TCGv, TCGv, TCGv, TCGv, T= CGv)) { - TCGv dest =3D dest_gpr(ctx, a->rd); - TCGv src1 =3D get_gpr(ctx, a->rs1, ext); - TCGv src2 =3D tcg_constant_tl(a->imm); + if (is_32bit(ctx)) { + TCGv dest =3D dest_gpr(ctx, a->rd); + TCGv src1 =3D get_gpr(ctx, a->rs1, ext); + TCGv src2 =3D tcg_constant_tl(a->imm); =20 - func(dest, src1, src2); + fn32(dest, src1, src2); =20 - gen_set_gpr(ctx, a->rd, dest); - return true; -} + gen_set_gpr(ctx, a->rd, dest); + } else if (is_64bit(ctx)) { + TCGv dest =3D dest_gpr(ctx, a->rd); + TCGv src1 =3D get_gpr(ctx, a->rs1, ext); + TCGv src2 =3D tcg_constant_tl(a->imm); =20 -static bool gen_logic(DisasContext *ctx, arg_r *a, DisasExtend ext, - void (*func)(TCGv, TCGv, TCGv)) -{ - TCGv dest =3D dest_gpr(ctx, a->rd); - TCGv src1 =3D get_gpr(ctx, a->rs1, ext); - TCGv src2 =3D get_gpr(ctx, a->rs2, ext); - - func(dest, src1, src2); - - gen_set_gpr(ctx, a->rd, dest); + fn64(dest, src1, src2); =20 + gen_set_gpr(ctx, a->rd, dest); + } else { + return false; + } return true; } =20 static bool gen_arith(DisasContext *ctx, arg_r *a, DisasExtend ext, - void (*func)(TCGv, TCGv, TCGv)) + void (*fn32)(TCGv, TCGv, TCGv), + void (*fn64)(TCGv, TCGv, TCGv), + void (*fn128)(TCGv, TCGv, TCGv, TCGv, TCGv, TCGv)) { - TCGv dest =3D dest_gpr(ctx, a->rd); - TCGv src1 =3D get_gpr(ctx, a->rs1, ext); - TCGv src2 =3D get_gpr(ctx, a->rs2, ext); =20 - func(dest, src1, src2); + if (is_32bit(ctx)) { + TCGv dest =3D dest_gpr(ctx, a->rd); + TCGv src1 =3D get_gpr(ctx, a->rs1, ext); + TCGv src2 =3D get_gpr(ctx, a->rs2, ext); =20 - gen_set_gpr(ctx, a->rd, dest); + fn32(dest, src1, src2); + + gen_set_gpr(ctx, a->rd, dest); + } else if (is_64bit(ctx)) { + TCGv dest =3D dest_gpr(ctx, a->rd); + TCGv src1 =3D get_gpr(ctx, a->rs1, ext); + TCGv src2 =3D get_gpr(ctx, a->rs2, ext); + + fn64(dest, src1, src2); + + gen_set_gpr(ctx, a->rd, dest); + } else { + return false; + } return true; } =20 diff --git a/target/riscv/insn_trans/trans_rvb.c.inc b/target/riscv/insn_tr= ans/trans_rvb.c.inc index 326d9939a0..fef239eed9 100644 --- a/target/riscv/insn_trans/trans_rvb.c.inc +++ b/target/riscv/insn_trans/trans_rvb.c.inc @@ -108,25 +108,25 @@ static bool trans_packh(DisasContext *ctx, arg_packh = *a) static bool trans_min(DisasContext *ctx, arg_min *a) { REQUIRE_EXT(ctx, RVB); - return gen_arith(ctx, a, EXT_SIGN, tcg_gen_smin_tl); + return gen_arith(ctx, a, EXT_SIGN, tcg_gen_smin_tl, tcg_gen_smin_tl, N= ULL); } =20 static bool trans_max(DisasContext *ctx, arg_max *a) { REQUIRE_EXT(ctx, RVB); - return gen_arith(ctx, a, EXT_SIGN, tcg_gen_smax_tl); + return gen_arith(ctx, a, EXT_SIGN, tcg_gen_smax_tl, tcg_gen_smax_tl, N= ULL); } =20 static bool trans_minu(DisasContext *ctx, arg_minu *a) { REQUIRE_EXT(ctx, RVB); - return gen_arith(ctx, a, EXT_SIGN, tcg_gen_umin_tl); + return gen_arith(ctx, a, EXT_SIGN, tcg_gen_umin_tl, tcg_gen_umin_tl, N= ULL); } =20 static bool trans_maxu(DisasContext *ctx, arg_maxu *a) { REQUIRE_EXT(ctx, RVB); - return gen_arith(ctx, a, EXT_SIGN, tcg_gen_umax_tl); + return gen_arith(ctx, a, EXT_SIGN, tcg_gen_umax_tl, tcg_gen_umax_tl, N= ULL); } =20 static bool trans_sext_b(DisasContext *ctx, arg_sext_b *a) @@ -340,7 +340,8 @@ GEN_SHADD(3) static bool trans_sh##SHAMT##add(DisasContext *ctx, arg_sh##SHAMT##add *a)= \ { = \ REQUIRE_EXT(ctx, RVB); = \ - return gen_arith(ctx, a, EXT_NONE, gen_sh##SHAMT##add); = \ + return gen_arith(ctx, a, EXT_NONE, = \ + gen_sh##SHAMT##add, gen_sh##SHAMT##add, NULL); = \ } =20 GEN_TRANS_SHADD(1) @@ -615,7 +616,9 @@ static bool trans_sh##SHAMT##add_uw(DisasContext *ctx, = \ { \ REQUIRE_64BIT(ctx); \ REQUIRE_EXT(ctx, RVB); \ - return gen_arith(ctx, a, EXT_NONE, gen_sh##SHAMT##add_uw); \ + return gen_arith(ctx, a, EXT_NONE, \ + gen_sh##SHAMT##add_uw, \ + gen_sh##SHAMT##add_uw, NULL); \ } =20 GEN_TRANS_SHADD_UW(1) @@ -632,7 +635,7 @@ static bool trans_add_uw(DisasContext *ctx, arg_add_uw = *a) { REQUIRE_64BIT(ctx); REQUIRE_EXT(ctx, RVB); - return gen_arith(ctx, a, EXT_NONE, gen_add_uw); + return gen_arith(ctx, a, EXT_NONE, gen_add_uw, gen_add_uw, NULL); } =20 static void gen_slli_uw(TCGv dest, TCGv src, target_long shamt) diff --git a/target/riscv/insn_trans/trans_rvi.c.inc b/target/riscv/insn_tr= ans/trans_rvi.c.inc index 844080ec2b..c284dd19b3 100644 --- a/target/riscv/insn_trans/trans_rvi.c.inc +++ b/target/riscv/insn_trans/trans_rvi.c.inc @@ -227,7 +227,8 @@ static bool trans_sd(DisasContext *ctx, arg_sd *a) =20 static bool trans_addi(DisasContext *ctx, arg_addi *a) { - return gen_arith_imm_fn(ctx, a, EXT_NONE, tcg_gen_addi_tl); + return gen_arith_imm_fn(ctx, a, EXT_NONE, + tcg_gen_addi_tl, tcg_gen_addi_tl, NULL); } =20 static void gen_slt(TCGv ret, TCGv s1, TCGv s2) @@ -242,12 +243,14 @@ static void gen_sltu(TCGv ret, TCGv s1, TCGv s2) =20 static bool trans_slti(DisasContext *ctx, arg_slti *a) { - return gen_arith_imm_tl(ctx, a, EXT_SIGN, gen_slt); + return gen_arith_imm_tl(ctx, a, EXT_SIGN, + gen_slt, gen_slt, NULL); } =20 static bool trans_sltiu(DisasContext *ctx, arg_sltiu *a) { - return gen_arith_imm_tl(ctx, a, EXT_SIGN, gen_sltu); + return gen_arith_imm_tl(ctx, a, EXT_SIGN, + gen_sltu, gen_sltu, NULL); } =20 static bool trans_xori(DisasContext *ctx, arg_xori *a) @@ -282,12 +285,14 @@ static bool trans_srai(DisasContext *ctx, arg_srai *a) =20 static bool trans_add(DisasContext *ctx, arg_add *a) { - return gen_arith(ctx, a, EXT_NONE, tcg_gen_add_tl); + return gen_arith(ctx, a, EXT_NONE, + tcg_gen_add_tl, tcg_gen_add_tl, NULL); } =20 static bool trans_sub(DisasContext *ctx, arg_sub *a) { - return gen_arith(ctx, a, EXT_NONE, tcg_gen_sub_tl); + return gen_arith(ctx, a, EXT_NONE, + tcg_gen_sub_tl, tcg_gen_sub_tl, NULL); } =20 static bool trans_sll(DisasContext *ctx, arg_sll *a) @@ -297,12 +302,12 @@ static bool trans_sll(DisasContext *ctx, arg_sll *a) =20 static bool trans_slt(DisasContext *ctx, arg_slt *a) { - return gen_arith(ctx, a, EXT_SIGN, gen_slt); + return gen_arith(ctx, a, EXT_SIGN, gen_slt, gen_slt, NULL); } =20 static bool trans_sltu(DisasContext *ctx, arg_sltu *a) { - return gen_arith(ctx, a, EXT_SIGN, gen_sltu); + return gen_arith(ctx, a, EXT_SIGN, gen_sltu, gen_sltu, NULL); } =20 static bool trans_xor(DisasContext *ctx, arg_xor *a) @@ -334,7 +339,8 @@ static bool trans_addiw(DisasContext *ctx, arg_addiw *a) { REQUIRE_64BIT(ctx); ctx->w =3D true; - return gen_arith_imm_fn(ctx, a, EXT_NONE, tcg_gen_addi_tl); + return gen_arith_imm_fn(ctx, a, EXT_NONE, + NULL, tcg_gen_addi_tl, NULL); } =20 static bool trans_slliw(DisasContext *ctx, arg_slliw *a) @@ -372,14 +378,14 @@ static bool trans_addw(DisasContext *ctx, arg_addw *a) { REQUIRE_64BIT(ctx); ctx->w =3D true; - return gen_arith(ctx, a, EXT_NONE, tcg_gen_add_tl); + return gen_arith(ctx, a, EXT_NONE, NULL, tcg_gen_add_tl, NULL); } =20 static bool trans_subw(DisasContext *ctx, arg_subw *a) { REQUIRE_64BIT(ctx); ctx->w =3D true; - return gen_arith(ctx, a, EXT_NONE, tcg_gen_sub_tl); + return gen_arith(ctx, a, EXT_NONE, NULL, tcg_gen_sub_tl, NULL); } =20 static bool trans_sllw(DisasContext *ctx, arg_sllw *a) diff --git a/target/riscv/insn_trans/trans_rvm.c.inc b/target/riscv/insn_tr= ans/trans_rvm.c.inc index b89a85ad3a..0c5f1ba548 100644 --- a/target/riscv/insn_trans/trans_rvm.c.inc +++ b/target/riscv/insn_trans/trans_rvm.c.inc @@ -22,7 +22,8 @@ static bool trans_mul(DisasContext *ctx, arg_mul *a) { REQUIRE_EXT(ctx, RVM); - return gen_arith(ctx, a, EXT_NONE, tcg_gen_mul_tl); + return gen_arith(ctx, a, EXT_NONE, + tcg_gen_mul_tl, tcg_gen_mul_tl, NULL); } =20 static void gen_mulh(TCGv ret, TCGv s1, TCGv s2) @@ -36,7 +37,8 @@ static void gen_mulh(TCGv ret, TCGv s1, TCGv s2) static bool trans_mulh(DisasContext *ctx, arg_mulh *a) { REQUIRE_EXT(ctx, RVM); - return gen_arith(ctx, a, EXT_NONE, gen_mulh); + return gen_arith(ctx, a, EXT_NONE, + gen_mulh, gen_mulh, NULL); } =20 static void gen_mulhsu(TCGv ret, TCGv arg1, TCGv arg2) @@ -57,7 +59,8 @@ static void gen_mulhsu(TCGv ret, TCGv arg1, TCGv arg2) static bool trans_mulhsu(DisasContext *ctx, arg_mulhsu *a) { REQUIRE_EXT(ctx, RVM); - return gen_arith(ctx, a, EXT_NONE, gen_mulhsu); + return gen_arith(ctx, a, EXT_NONE, + gen_mulhsu, gen_mulhsu, NULL); } =20 static void gen_mulhu(TCGv ret, TCGv s1, TCGv s2) @@ -71,7 +74,8 @@ static void gen_mulhu(TCGv ret, TCGv s1, TCGv s2) static bool trans_mulhu(DisasContext *ctx, arg_mulhu *a) { REQUIRE_EXT(ctx, RVM); - return gen_arith(ctx, a, EXT_NONE, gen_mulhu); + return gen_arith(ctx, a, EXT_NONE, + gen_mulhu, gen_mulhu, NULL); } =20 static void gen_div(TCGv ret, TCGv source1, TCGv source2) @@ -110,7 +114,8 @@ static void gen_div(TCGv ret, TCGv source1, TCGv source= 2) static bool trans_div(DisasContext *ctx, arg_div *a) { REQUIRE_EXT(ctx, RVM); - return gen_arith(ctx, a, EXT_SIGN, gen_div); + return gen_arith(ctx, a, EXT_SIGN, + gen_div, gen_div, NULL); } =20 static void gen_divu(TCGv ret, TCGv source1, TCGv source2) @@ -138,7 +143,8 @@ static void gen_divu(TCGv ret, TCGv source1, TCGv sourc= e2) static bool trans_divu(DisasContext *ctx, arg_divu *a) { REQUIRE_EXT(ctx, RVM); - return gen_arith(ctx, a, EXT_ZERO, gen_divu); + return gen_arith(ctx, a, EXT_ZERO, + gen_divu, gen_divu, NULL); } =20 static void gen_rem(TCGv ret, TCGv source1, TCGv source2) @@ -179,7 +185,8 @@ static void gen_rem(TCGv ret, TCGv source1, TCGv source= 2) static bool trans_rem(DisasContext *ctx, arg_rem *a) { REQUIRE_EXT(ctx, RVM); - return gen_arith(ctx, a, EXT_SIGN, gen_rem); + return gen_arith(ctx, a, EXT_SIGN, + gen_rem, gen_rem, NULL); } =20 static void gen_remu(TCGv ret, TCGv source1, TCGv source2) @@ -207,7 +214,8 @@ static void gen_remu(TCGv ret, TCGv source1, TCGv sourc= e2) static bool trans_remu(DisasContext *ctx, arg_remu *a) { REQUIRE_EXT(ctx, RVM); - return gen_arith(ctx, a, EXT_ZERO, gen_remu); + return gen_arith(ctx, a, EXT_ZERO, + gen_remu, gen_remu, NULL); } =20 static bool trans_mulw(DisasContext *ctx, arg_mulw *a) @@ -215,7 +223,8 @@ static bool trans_mulw(DisasContext *ctx, arg_mulw *a) REQUIRE_64BIT(ctx); REQUIRE_EXT(ctx, RVM); ctx->w =3D true; - return gen_arith(ctx, a, EXT_NONE, tcg_gen_mul_tl); + return gen_arith(ctx, a, EXT_NONE, + tcg_gen_mul_tl, tcg_gen_mul_tl, NULL); } =20 static bool trans_divw(DisasContext *ctx, arg_divw *a) @@ -223,7 +232,8 @@ static bool trans_divw(DisasContext *ctx, arg_divw *a) REQUIRE_64BIT(ctx); REQUIRE_EXT(ctx, RVM); ctx->w =3D true; - return gen_arith(ctx, a, EXT_SIGN, gen_div); + return gen_arith(ctx, a, EXT_SIGN, + gen_div, gen_div, NULL); } =20 static bool trans_divuw(DisasContext *ctx, arg_divuw *a) @@ -231,7 +241,8 @@ static bool trans_divuw(DisasContext *ctx, arg_divuw *a) REQUIRE_64BIT(ctx); REQUIRE_EXT(ctx, RVM); ctx->w =3D true; - return gen_arith(ctx, a, EXT_ZERO, gen_divu); + return gen_arith(ctx, a, EXT_ZERO, + gen_divu, gen_divu, NULL); } =20 static bool trans_remw(DisasContext *ctx, arg_remw *a) @@ -239,7 +250,8 @@ static bool trans_remw(DisasContext *ctx, arg_remw *a) REQUIRE_64BIT(ctx); REQUIRE_EXT(ctx, RVM); ctx->w =3D true; - return gen_arith(ctx, a, EXT_SIGN, gen_rem); + return gen_arith(ctx, a, EXT_SIGN, + gen_rem, gen_rem, NULL); } =20 static bool trans_remuw(DisasContext *ctx, arg_remuw *a) @@ -247,5 +259,6 @@ static bool trans_remuw(DisasContext *ctx, arg_remuw *a) REQUIRE_64BIT(ctx); REQUIRE_EXT(ctx, RVM); ctx->w =3D true; - return gen_arith(ctx, a, EXT_ZERO, gen_remu); + return gen_arith(ctx, a, EXT_ZERO, + gen_remu, gen_remu, NULL); } --=20 2.33.0 From nobody Thu May 9 06:39:21 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; spf=pass (zohomail.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=univ-grenoble-alpes.fr Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1633556363036958.5744621374182; Wed, 6 Oct 2021 14:39:23 -0700 (PDT) Received: from localhost ([::1]:44984 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1mYEdG-00014u-08 for importer@patchew.org; Wed, 06 Oct 2021 17:39:22 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:49572) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1mYETj-00081O-Vv; Wed, 06 Oct 2021 17:29:32 -0400 Received: from zm-mta-out-3.u-ga.fr ([152.77.200.56]:43726) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1mYETh-00081d-AF; Wed, 06 Oct 2021 17:29:31 -0400 Received: from mailhost.u-ga.fr (mailhost2.u-ga.fr [129.88.177.242]) by zm-mta-out-3.u-ga.fr (Postfix) with ESMTP id 636E441DAB; Wed, 6 Oct 2021 23:29:27 +0200 (CEST) Received: from smtps.univ-grenoble-alpes.fr (smtps2.u-ga.fr [152.77.18.2]) by mailhost.u-ga.fr (Postfix) with ESMTP id 4D62760066; Wed, 6 Oct 2021 23:29:27 +0200 (CEST) Received: from palmier.tima.u-ga.fr (35.201.90.79.rev.sfr.net [79.90.201.35]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) (Authenticated sender: petrotf@univ-grenoble-alpes.fr) by smtps.univ-grenoble-alpes.fr (Postfix) with ESMTPSA id E907E14005C; Wed, 6 Oct 2021 23:29:26 +0200 (CEST) From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20P=C3=A9trot?= To: qemu-devel@nongnu.org, qemu-riscv@nongnu.org Subject: [PATCH v2 08/27] target/riscv: refactoring calls to gen_shift Date: Wed, 6 Oct 2021 23:28:14 +0200 Message-Id: <20211006212833.108706-9-frederic.petrot@univ-grenoble-alpes.fr> X-Mailer: git-send-email 2.33.0 In-Reply-To: <20211006212833.108706-1-frederic.petrot@univ-grenoble-alpes.fr> References: <20211006212833.108706-1-frederic.petrot@univ-grenoble-alpes.fr> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable X-Greylist: Whitelist-UGA SMTP Authentifie (petrotf@univ-grenoble-alpes.fr) via submission-587 ACL (41) X-Greylist: Whitelist-UGA MAILHOST (SMTP non authentifie) depuis 152.77.18.2 Received-SPF: pass (zohomail.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; Received-SPF: pass client-ip=152.77.200.56; envelope-from=frederic.petrot@univ-grenoble-alpes.fr; helo=zm-mta-out-3.u-ga.fr X-Spam_score_int: -18 X-Spam_score: -1.9 X-Spam_bar: - X-Spam_report: (-1.9 / 5.0 requ) BAYES_00=-1.9, RCVD_IN_MSPIKE_H2=-0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action 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: bin.meng@windriver.com, richard.henderson@linaro.org, alistair.francis@wdc.com, fabien.portas@grenoble-inp.org, palmer@dabbelt.com, =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20P=C3=A9trot?= , philmd@redhat.com Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZM-MESSAGEID: 1633556363629100001 As for arithmetic operations, we now pass functions pointers to deal with 32, 64 and 128-bit shift operations, and to change all call sites according= ly. For now, 128-bit operations are still not handled. Signed-off-by: Fr=C3=A9d=C3=A9ric P=C3=A9trot Co-authored-by: Fabien Portas --- target/riscv/translate.c | 77 ++++++++++++++++++------- target/riscv/insn_trans/trans_rvb.c.inc | 47 +++++++-------- target/riscv/insn_trans/trans_rvi.c.inc | 34 ++++++----- 3 files changed, 101 insertions(+), 57 deletions(-) diff --git a/target/riscv/translate.c b/target/riscv/translate.c index c940698478..0700c82a36 100644 --- a/target/riscv/translate.c +++ b/target/riscv/translate.c @@ -502,21 +502,41 @@ static bool gen_arith(DisasContext *ctx, arg_r *a, Di= sasExtend ext, } =20 static bool gen_shift_imm_fn(DisasContext *ctx, arg_shift *a, DisasExtend = ext, - void (*func)(TCGv, TCGv, target_long)) + void (*fn32)(TCGv, TCGv, target_long), + void (*fn64)(TCGv, TCGv, target_long), + void (*fn128)(TCGv, TCGv, TCGv, TCGv, target_= long)) { - TCGv dest, src1; - int max_len =3D oper_len(ctx); + if (is_32bit(ctx)) { + TCGv dest, src1; + int max_len =3D oper_len(ctx); =20 - if (a->shamt >=3D max_len) { + if (a->shamt >=3D max_len) { + return false; + } + + dest =3D dest_gpr(ctx, a->rd); + src1 =3D get_gpr(ctx, a->rs1, ext); + + fn32(dest, src1, a->shamt); + + gen_set_gpr(ctx, a->rd, dest); + } else if (is_64bit(ctx)) { + TCGv dest, src1; + int max_len =3D oper_len(ctx); + + if (a->shamt >=3D max_len) { + return false; + } + + dest =3D dest_gpr(ctx, a->rd); + src1 =3D get_gpr(ctx, a->rs1, ext); + + fn64(dest, src1, a->shamt); + + gen_set_gpr(ctx, a->rd, dest); + } else { return false; } - - dest =3D dest_gpr(ctx, a->rd); - src1 =3D get_gpr(ctx, a->rs1, ext); - - func(dest, src1, a->shamt); - - gen_set_gpr(ctx, a->rd, dest); return true; } =20 @@ -541,18 +561,35 @@ static bool gen_shift_imm_tl(DisasContext *ctx, arg_s= hift *a, DisasExtend ext, } =20 static bool gen_shift(DisasContext *ctx, arg_r *a, DisasExtend ext, - void (*func)(TCGv, TCGv, TCGv)) + void (*fn32)(TCGv, TCGv, TCGv), + void (*fn64)(TCGv, TCGv, TCGv), + void (*fn128)(TCGv, TCGv, TCGv, TCGv, TCGv)) { - TCGv dest =3D dest_gpr(ctx, a->rd); - TCGv src1 =3D get_gpr(ctx, a->rs1, ext); - TCGv src2 =3D get_gpr(ctx, a->rs2, EXT_NONE); - TCGv ext2 =3D tcg_temp_new(); + if (is_32bit(ctx)) { + TCGv dest =3D dest_gpr(ctx, a->rd); + TCGv src1 =3D get_gpr(ctx, a->rs1, ext); + TCGv src2 =3D get_gpr(ctx, a->rs2, EXT_NONE); + TCGv ext2 =3D tcg_temp_new(); =20 - tcg_gen_andi_tl(ext2, src2, oper_len(ctx) - 1); - func(dest, src1, ext2); + tcg_gen_andi_tl(ext2, src2, oper_len(ctx) - 1); + fn32(dest, src1, ext2); =20 - gen_set_gpr(ctx, a->rd, dest); - tcg_temp_free(ext2); + gen_set_gpr(ctx, a->rd, dest); + tcg_temp_free(ext2); + } else if (is_64bit(ctx)) { + TCGv dest =3D dest_gpr(ctx, a->rd); + TCGv src1 =3D get_gpr(ctx, a->rs1, ext); + TCGv src2 =3D get_gpr(ctx, a->rs2, EXT_NONE); + TCGv ext2 =3D tcg_temp_new(); + + tcg_gen_andi_tl(ext2, src2, oper_len(ctx) - 1); + fn64(dest, src1, ext2); + + gen_set_gpr(ctx, a->rd, dest); + tcg_temp_free(ext2); + } else { + return false; + } return true; } =20 diff --git a/target/riscv/insn_trans/trans_rvb.c.inc b/target/riscv/insn_tr= ans/trans_rvb.c.inc index fef239eed9..cdae9671ff 100644 --- a/target/riscv/insn_trans/trans_rvb.c.inc +++ b/target/riscv/insn_trans/trans_rvb.c.inc @@ -160,7 +160,7 @@ static void gen_bset(TCGv ret, TCGv arg1, TCGv shamt) static bool trans_bset(DisasContext *ctx, arg_bset *a) { REQUIRE_EXT(ctx, RVB); - return gen_shift(ctx, a, EXT_NONE, gen_bset); + return gen_shift(ctx, a, EXT_NONE, gen_bset, gen_bset, NULL); } =20 static bool trans_bseti(DisasContext *ctx, arg_bseti *a) @@ -182,7 +182,7 @@ static void gen_bclr(TCGv ret, TCGv arg1, TCGv shamt) static bool trans_bclr(DisasContext *ctx, arg_bclr *a) { REQUIRE_EXT(ctx, RVB); - return gen_shift(ctx, a, EXT_NONE, gen_bclr); + return gen_shift(ctx, a, EXT_NONE, gen_bclr, gen_bclr, NULL); } =20 static bool trans_bclri(DisasContext *ctx, arg_bclri *a) @@ -204,7 +204,7 @@ static void gen_binv(TCGv ret, TCGv arg1, TCGv shamt) static bool trans_binv(DisasContext *ctx, arg_binv *a) { REQUIRE_EXT(ctx, RVB); - return gen_shift(ctx, a, EXT_NONE, gen_binv); + return gen_shift(ctx, a, EXT_NONE, gen_binv, gen_binv, NULL); } =20 static bool trans_binvi(DisasContext *ctx, arg_binvi *a) @@ -222,7 +222,7 @@ static void gen_bext(TCGv ret, TCGv arg1, TCGv shamt) static bool trans_bext(DisasContext *ctx, arg_bext *a) { REQUIRE_EXT(ctx, RVB); - return gen_shift(ctx, a, EXT_NONE, gen_bext); + return gen_shift(ctx, a, EXT_NONE, gen_bext, gen_bext, NULL); } =20 static bool trans_bexti(DisasContext *ctx, arg_bexti *a) @@ -241,7 +241,7 @@ static void gen_slo(TCGv ret, TCGv arg1, TCGv arg2) static bool trans_slo(DisasContext *ctx, arg_slo *a) { REQUIRE_EXT(ctx, RVB); - return gen_shift(ctx, a, EXT_NONE, gen_slo); + return gen_shift(ctx, a, EXT_NONE, gen_slo, gen_slo, NULL); } =20 static bool trans_sloi(DisasContext *ctx, arg_sloi *a) @@ -260,7 +260,7 @@ static void gen_sro(TCGv ret, TCGv arg1, TCGv arg2) static bool trans_sro(DisasContext *ctx, arg_sro *a) { REQUIRE_EXT(ctx, RVB); - return gen_shift(ctx, a, EXT_ZERO, gen_sro); + return gen_shift(ctx, a, EXT_ZERO, gen_sro, gen_sro, NULL); } =20 static bool trans_sroi(DisasContext *ctx, arg_sroi *a) @@ -272,25 +272,26 @@ static bool trans_sroi(DisasContext *ctx, arg_sroi *a) static bool trans_ror(DisasContext *ctx, arg_ror *a) { REQUIRE_EXT(ctx, RVB); - return gen_shift(ctx, a, EXT_NONE, tcg_gen_rotr_tl); + return gen_shift(ctx, a, EXT_NONE, tcg_gen_rotr_tl, tcg_gen_rotr_tl, N= ULL); } =20 static bool trans_rori(DisasContext *ctx, arg_rori *a) { REQUIRE_EXT(ctx, RVB); - return gen_shift_imm_fn(ctx, a, EXT_NONE, tcg_gen_rotri_tl); + return gen_shift_imm_fn(ctx, a, EXT_NONE, + tcg_gen_rotri_tl, tcg_gen_rotri_tl, NULL); } =20 static bool trans_rol(DisasContext *ctx, arg_rol *a) { REQUIRE_EXT(ctx, RVB); - return gen_shift(ctx, a, EXT_NONE, tcg_gen_rotl_tl); + return gen_shift(ctx, a, EXT_NONE, tcg_gen_rotl_tl, tcg_gen_rotl_tl, N= ULL); } =20 static bool trans_grev(DisasContext *ctx, arg_grev *a) { REQUIRE_EXT(ctx, RVB); - return gen_shift(ctx, a, EXT_NONE, gen_helper_grev); + return gen_shift(ctx, a, EXT_NONE, gen_helper_grev, gen_helper_grev, N= ULL); } =20 static void gen_grevi(TCGv dest, TCGv src, target_long shamt) @@ -306,13 +307,13 @@ static void gen_grevi(TCGv dest, TCGv src, target_lon= g shamt) static bool trans_grevi(DisasContext *ctx, arg_grevi *a) { REQUIRE_EXT(ctx, RVB); - return gen_shift_imm_fn(ctx, a, EXT_NONE, gen_grevi); + return gen_shift_imm_fn(ctx, a, EXT_NONE, gen_grevi, gen_grevi, NULL); } =20 static bool trans_gorc(DisasContext *ctx, arg_gorc *a) { REQUIRE_EXT(ctx, RVB); - return gen_shift(ctx, a, EXT_ZERO, gen_helper_gorc); + return gen_shift(ctx, a, EXT_ZERO, gen_helper_gorc, gen_helper_gorc, N= ULL); } =20 static bool trans_gorci(DisasContext *ctx, arg_gorci *a) @@ -418,7 +419,7 @@ static bool trans_bsetw(DisasContext *ctx, arg_bsetw *a) REQUIRE_64BIT(ctx); REQUIRE_EXT(ctx, RVB); ctx->w =3D true; - return gen_shift(ctx, a, EXT_NONE, gen_bset); + return gen_shift(ctx, a, EXT_NONE, NULL, gen_bset, NULL); } =20 static bool trans_bsetiw(DisasContext *ctx, arg_bsetiw *a) @@ -434,7 +435,7 @@ static bool trans_bclrw(DisasContext *ctx, arg_bclrw *a) REQUIRE_64BIT(ctx); REQUIRE_EXT(ctx, RVB); ctx->w =3D true; - return gen_shift(ctx, a, EXT_NONE, gen_bclr); + return gen_shift(ctx, a, EXT_NONE, NULL, gen_bclr, NULL); } =20 static bool trans_bclriw(DisasContext *ctx, arg_bclriw *a) @@ -450,7 +451,7 @@ static bool trans_binvw(DisasContext *ctx, arg_binvw *a) REQUIRE_64BIT(ctx); REQUIRE_EXT(ctx, RVB); ctx->w =3D true; - return gen_shift(ctx, a, EXT_NONE, gen_binv); + return gen_shift(ctx, a, EXT_NONE, NULL, gen_binv, NULL); } =20 static bool trans_binviw(DisasContext *ctx, arg_binviw *a) @@ -466,7 +467,7 @@ static bool trans_bextw(DisasContext *ctx, arg_bextw *a) REQUIRE_64BIT(ctx); REQUIRE_EXT(ctx, RVB); ctx->w =3D true; - return gen_shift(ctx, a, EXT_NONE, gen_bext); + return gen_shift(ctx, a, EXT_NONE, NULL, gen_bext, NULL); } =20 static bool trans_slow(DisasContext *ctx, arg_slow *a) @@ -474,7 +475,7 @@ static bool trans_slow(DisasContext *ctx, arg_slow *a) REQUIRE_64BIT(ctx); REQUIRE_EXT(ctx, RVB); ctx->w =3D true; - return gen_shift(ctx, a, EXT_NONE, gen_slo); + return gen_shift(ctx, a, EXT_NONE, NULL, gen_slo, NULL); } =20 static bool trans_sloiw(DisasContext *ctx, arg_sloiw *a) @@ -490,7 +491,7 @@ static bool trans_srow(DisasContext *ctx, arg_srow *a) REQUIRE_64BIT(ctx); REQUIRE_EXT(ctx, RVB); ctx->w =3D true; - return gen_shift(ctx, a, EXT_ZERO, gen_sro); + return gen_shift(ctx, a, EXT_ZERO, NULL, gen_sro, NULL); } =20 static bool trans_sroiw(DisasContext *ctx, arg_sroiw *a) @@ -524,7 +525,7 @@ static bool trans_rorw(DisasContext *ctx, arg_rorw *a) REQUIRE_64BIT(ctx); REQUIRE_EXT(ctx, RVB); ctx->w =3D true; - return gen_shift(ctx, a, EXT_NONE, gen_rorw); + return gen_shift(ctx, a, EXT_NONE, NULL, gen_rorw, NULL); } =20 static bool trans_roriw(DisasContext *ctx, arg_roriw *a) @@ -558,7 +559,7 @@ static bool trans_rolw(DisasContext *ctx, arg_rolw *a) REQUIRE_64BIT(ctx); REQUIRE_EXT(ctx, RVB); ctx->w =3D true; - return gen_shift(ctx, a, EXT_NONE, gen_rolw); + return gen_shift(ctx, a, EXT_NONE, NULL, gen_rolw, NULL); } =20 static bool trans_grevw(DisasContext *ctx, arg_grevw *a) @@ -566,7 +567,7 @@ static bool trans_grevw(DisasContext *ctx, arg_grevw *a) REQUIRE_64BIT(ctx); REQUIRE_EXT(ctx, RVB); ctx->w =3D true; - return gen_shift(ctx, a, EXT_ZERO, gen_helper_grev); + return gen_shift(ctx, a, EXT_ZERO, NULL, gen_helper_grev, NULL); } =20 static bool trans_greviw(DisasContext *ctx, arg_greviw *a) @@ -582,7 +583,7 @@ static bool trans_gorcw(DisasContext *ctx, arg_gorcw *a) REQUIRE_64BIT(ctx); REQUIRE_EXT(ctx, RVB); ctx->w =3D true; - return gen_shift(ctx, a, EXT_ZERO, gen_helper_gorc); + return gen_shift(ctx, a, EXT_ZERO, NULL, gen_helper_gorc, NULL); } =20 static bool trans_gorciw(DisasContext *ctx, arg_gorciw *a) @@ -647,5 +648,5 @@ static bool trans_slli_uw(DisasContext *ctx, arg_slli_u= w *a) { REQUIRE_64BIT(ctx); REQUIRE_EXT(ctx, RVB); - return gen_shift_imm_fn(ctx, a, EXT_NONE, gen_slli_uw); + return gen_shift_imm_fn(ctx, a, EXT_NONE, NULL, gen_slli_uw, NULL); } diff --git a/target/riscv/insn_trans/trans_rvi.c.inc b/target/riscv/insn_tr= ans/trans_rvi.c.inc index c284dd19b3..aa1e3f07e5 100644 --- a/target/riscv/insn_trans/trans_rvi.c.inc +++ b/target/riscv/insn_trans/trans_rvi.c.inc @@ -270,17 +270,20 @@ static bool trans_andi(DisasContext *ctx, arg_andi *a) =20 static bool trans_slli(DisasContext *ctx, arg_slli *a) { - return gen_shift_imm_fn(ctx, a, EXT_NONE, tcg_gen_shli_tl); + return gen_shift_imm_fn(ctx, a, EXT_NONE, + tcg_gen_shli_tl, tcg_gen_shli_tl, NULL); } =20 static bool trans_srli(DisasContext *ctx, arg_srli *a) { - return gen_shift_imm_fn(ctx, a, EXT_ZERO, tcg_gen_shri_tl); + return gen_shift_imm_fn(ctx, a, EXT_ZERO, + tcg_gen_shri_tl, tcg_gen_shri_tl, NULL); } =20 static bool trans_srai(DisasContext *ctx, arg_srai *a) { - return gen_shift_imm_fn(ctx, a, EXT_SIGN, tcg_gen_sari_tl); + return gen_shift_imm_fn(ctx, a, EXT_SIGN, + tcg_gen_sari_tl, tcg_gen_sari_tl, NULL); } =20 static bool trans_add(DisasContext *ctx, arg_add *a) @@ -297,7 +300,8 @@ static bool trans_sub(DisasContext *ctx, arg_sub *a) =20 static bool trans_sll(DisasContext *ctx, arg_sll *a) { - return gen_shift(ctx, a, EXT_NONE, tcg_gen_shl_tl); + return gen_shift(ctx, a, EXT_NONE, + tcg_gen_shl_tl, tcg_gen_shl_tl, NULL); } =20 static bool trans_slt(DisasContext *ctx, arg_slt *a) @@ -317,12 +321,12 @@ static bool trans_xor(DisasContext *ctx, arg_xor *a) =20 static bool trans_srl(DisasContext *ctx, arg_srl *a) { - return gen_shift(ctx, a, EXT_ZERO, tcg_gen_shr_tl); + return gen_shift(ctx, a, EXT_ZERO, tcg_gen_shr_tl, tcg_gen_shr_tl, NUL= L); } =20 static bool trans_sra(DisasContext *ctx, arg_sra *a) { - return gen_shift(ctx, a, EXT_SIGN, tcg_gen_sar_tl); + return gen_shift(ctx, a, EXT_SIGN, tcg_gen_sar_tl, tcg_gen_sar_tl, NUL= L); } =20 static bool trans_or(DisasContext *ctx, arg_or *a) @@ -339,15 +343,14 @@ static bool trans_addiw(DisasContext *ctx, arg_addiw = *a) { REQUIRE_64BIT(ctx); ctx->w =3D true; - return gen_arith_imm_fn(ctx, a, EXT_NONE, - NULL, tcg_gen_addi_tl, NULL); + return gen_arith_imm_fn(ctx, a, EXT_NONE, NULL, tcg_gen_addi_tl, NULL); } =20 static bool trans_slliw(DisasContext *ctx, arg_slliw *a) { REQUIRE_64BIT(ctx); ctx->w =3D true; - return gen_shift_imm_fn(ctx, a, EXT_NONE, tcg_gen_shli_tl); + return gen_shift_imm_fn(ctx, a, EXT_NONE, NULL, tcg_gen_shli_tl, NULL); } =20 static void gen_srliw(TCGv dst, TCGv src, target_long shamt) @@ -359,7 +362,7 @@ static bool trans_srliw(DisasContext *ctx, arg_srliw *a) { REQUIRE_64BIT(ctx); ctx->w =3D true; - return gen_shift_imm_fn(ctx, a, EXT_NONE, gen_srliw); + return gen_shift_imm_fn(ctx, a, EXT_NONE, NULL, gen_srliw, NULL); } =20 static void gen_sraiw(TCGv dst, TCGv src, target_long shamt) @@ -371,7 +374,7 @@ static bool trans_sraiw(DisasContext *ctx, arg_sraiw *a) { REQUIRE_64BIT(ctx); ctx->w =3D true; - return gen_shift_imm_fn(ctx, a, EXT_NONE, gen_sraiw); + return gen_shift_imm_fn(ctx, a, EXT_NONE, NULL, gen_sraiw, NULL); } =20 static bool trans_addw(DisasContext *ctx, arg_addw *a) @@ -392,21 +395,24 @@ static bool trans_sllw(DisasContext *ctx, arg_sllw *a) { REQUIRE_64BIT(ctx); ctx->w =3D true; - return gen_shift(ctx, a, EXT_NONE, tcg_gen_shl_tl); + return gen_shift(ctx, a, EXT_NONE, + tcg_gen_shl_tl, tcg_gen_shl_tl, NULL); } =20 static bool trans_srlw(DisasContext *ctx, arg_srlw *a) { REQUIRE_64BIT(ctx); ctx->w =3D true; - return gen_shift(ctx, a, EXT_ZERO, tcg_gen_shr_tl); + return gen_shift(ctx, a, EXT_ZERO, + NULL, tcg_gen_shr_tl, NULL); } =20 static bool trans_sraw(DisasContext *ctx, arg_sraw *a) { REQUIRE_64BIT(ctx); ctx->w =3D true; - return gen_shift(ctx, a, EXT_SIGN, tcg_gen_sar_tl); + return gen_shift(ctx, a, EXT_SIGN, + NULL, tcg_gen_sar_tl, NULL); } =20 static bool trans_fence(DisasContext *ctx, arg_fence *a) --=20 2.33.0 From nobody Thu May 9 06:39:21 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; spf=pass (zohomail.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=univ-grenoble-alpes.fr Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1633556183334198.41142168573674; Wed, 6 Oct 2021 14:36:23 -0700 (PDT) Received: from localhost ([::1]:39620 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1mYEaM-0005m2-5j for importer@patchew.org; Wed, 06 Oct 2021 17:36:22 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:49584) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1mYETk-00082C-Ry; Wed, 06 Oct 2021 17:29:33 -0400 Received: from zm-mta-out-3.u-ga.fr ([152.77.200.56]:43748) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1mYETi-00081t-Eb; Wed, 06 Oct 2021 17:29:32 -0400 Received: from mailhost.u-ga.fr (mailhost1.u-ga.fr [152.77.1.10]) by zm-mta-out-3.u-ga.fr (Postfix) with ESMTP id C358341DD5; Wed, 6 Oct 2021 23:29:28 +0200 (CEST) Received: from smtps.univ-grenoble-alpes.fr (smtps2.u-ga.fr [152.77.18.2]) by mailhost.u-ga.fr (Postfix) with ESMTP id A984560067; Wed, 6 Oct 2021 23:29:28 +0200 (CEST) Received: from palmier.tima.u-ga.fr (35.201.90.79.rev.sfr.net [79.90.201.35]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) (Authenticated sender: petrotf@univ-grenoble-alpes.fr) by smtps.univ-grenoble-alpes.fr (Postfix) with ESMTPSA id 548F114005C; Wed, 6 Oct 2021 23:29:28 +0200 (CEST) From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20P=C3=A9trot?= To: qemu-devel@nongnu.org, qemu-riscv@nongnu.org Subject: [PATCH v2 09/27] target/riscv: setup everything so that riscv128-softmmu compiles Date: Wed, 6 Oct 2021 23:28:15 +0200 Message-Id: <20211006212833.108706-10-frederic.petrot@univ-grenoble-alpes.fr> X-Mailer: git-send-email 2.33.0 In-Reply-To: <20211006212833.108706-1-frederic.petrot@univ-grenoble-alpes.fr> References: <20211006212833.108706-1-frederic.petrot@univ-grenoble-alpes.fr> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable X-Greylist: Whitelist-UGA SMTP Authentifie (petrotf@univ-grenoble-alpes.fr) via submission-587 ACL (41) X-Greylist: Whitelist-UGA MAILHOST (SMTP non authentifie) depuis 152.77.18.2 Received-SPF: pass (zohomail.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; Received-SPF: pass client-ip=152.77.200.56; envelope-from=frederic.petrot@univ-grenoble-alpes.fr; helo=zm-mta-out-3.u-ga.fr X-Spam_score_int: -18 X-Spam_score: -1.9 X-Spam_bar: - X-Spam_report: (-1.9 / 5.0 requ) BAYES_00=-1.9, RCVD_IN_MSPIKE_H2=-0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action 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: bin.meng@windriver.com, richard.henderson@linaro.org, alistair.francis@wdc.com, fabien.portas@grenoble-inp.org, palmer@dabbelt.com, =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20P=C3=A9trot?= , philmd@redhat.com Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZM-MESSAGEID: 1633556185323100003 This patch is kind of a mess because several files have to be slightly modified to allow for a new target. Most of these modifications have to deal with changing what was a binary choice into a ternary one. Although we did our best to avoid testing for TARGET_RISCV128 (which we did), it is implicitly there in '#else' statements. Most added infrastructure files are no far from being copies of the 64-bit version. Once this patch applied, adding risc128-sofmmu to --target-list produces a (no so useful yet) executable. Signed-off-by: Fr=C3=A9d=C3=A9ric P=C3=A9trot Co-authored-by: Fabien Portas --- configs/devices/riscv128-softmmu/default.mak | 17 +++++++ configs/targets/riscv128-softmmu.mak | 6 +++ include/hw/riscv/sifive_cpu.h | 3 ++ target/riscv/cpu-param.h | 5 ++ target/riscv/cpu.c | 47 ++++++++++++++++--- target/riscv/gdbstub.c | 3 ++ target/riscv/insn_trans/trans_rvd.c.inc | 12 ++--- target/riscv/insn_trans/trans_rvf.c.inc | 6 +-- gdb-xml/riscv-128bit-cpu.xml | 48 ++++++++++++++++++++ gdb-xml/riscv-128bit-virtual.xml | 12 +++++ target/riscv/Kconfig | 3 ++ 11 files changed, 147 insertions(+), 15 deletions(-) create mode 100644 configs/devices/riscv128-softmmu/default.mak create mode 100644 configs/targets/riscv128-softmmu.mak create mode 100644 gdb-xml/riscv-128bit-cpu.xml create mode 100644 gdb-xml/riscv-128bit-virtual.xml diff --git a/configs/devices/riscv128-softmmu/default.mak b/configs/devices= /riscv128-softmmu/default.mak new file mode 100644 index 0000000000..e838f35785 --- /dev/null +++ b/configs/devices/riscv128-softmmu/default.mak @@ -0,0 +1,17 @@ +# Default configuration for riscv128-softmmu + +# Uncomment the following lines to disable these optional devices: +# +#CONFIG_PCI_DEVICES=3Dn +# No does not seem to be an option for these two parameters +CONFIG_SEMIHOSTING=3Dy +CONFIG_ARM_COMPATIBLE_SEMIHOSTING=3Dy + +# Boards: +# +CONFIG_SPIKE=3Dn +CONFIG_SIFIVE_E=3Dn +CONFIG_SIFIVE_U=3Dn +CONFIG_RISCV_VIRT=3Dy +CONFIG_MICROCHIP_PFSOC=3Dn +CONFIG_SHAKTI_C=3Dn diff --git a/configs/targets/riscv128-softmmu.mak b/configs/targets/riscv12= 8-softmmu.mak new file mode 100644 index 0000000000..7e5976bbf3 --- /dev/null +++ b/configs/targets/riscv128-softmmu.mak @@ -0,0 +1,6 @@ +#For now a raw copy of the riscv64 version as changing TARGET_ARCH to risc= v64 might trigger to much stuff for now +TARGET_ARCH=3Driscv128 +TARGET_BASE_ARCH=3Driscv +TARGET_SUPPORTS_MTTCG=3Dy +TARGET_XML_FILES=3Dgdb-xml/riscv-128bit-cpu.xml gdb-xml/riscv-32bit-fpu.xm= l gdb-xml/riscv-64bit-fpu.xml gdb-xml/riscv-128bit-virtual.xml +TARGET_NEED_FDT=3Dy diff --git a/include/hw/riscv/sifive_cpu.h b/include/hw/riscv/sifive_cpu.h index 136799633a..64078feba8 100644 --- a/include/hw/riscv/sifive_cpu.h +++ b/include/hw/riscv/sifive_cpu.h @@ -26,6 +26,9 @@ #elif defined(TARGET_RISCV64) #define SIFIVE_E_CPU TYPE_RISCV_CPU_SIFIVE_E51 #define SIFIVE_U_CPU TYPE_RISCV_CPU_SIFIVE_U54 +#else +#define SIFIVE_E_CPU TYPE_RISCV_CPU_SIFIVE_E51 +#define SIFIVE_U_CPU TYPE_RISCV_CPU_SIFIVE_U54 #endif =20 #endif /* HW_SIFIVE_CPU_H */ diff --git a/target/riscv/cpu-param.h b/target/riscv/cpu-param.h index 80eb615f93..c10459b56f 100644 --- a/target/riscv/cpu-param.h +++ b/target/riscv/cpu-param.h @@ -16,6 +16,11 @@ # define TARGET_LONG_BITS 32 # define TARGET_PHYS_ADDR_SPACE_BITS 34 /* 22-bit PPN */ # define TARGET_VIRT_ADDR_SPACE_BITS 32 /* sv32 */ +#else +/* 64-bit target, since QEMU isn't built to have TARGET_LONG_BITS over 64 = */ +# define TARGET_LONG_BITS 64 +# define TARGET_PHYS_ADDR_SPACE_BITS 56 /* 44-bit PPN */ +# define TARGET_VIRT_ADDR_SPACE_BITS 48 /* sv48 */ #endif #define TARGET_PAGE_BITS 12 /* 4 KiB Pages */ /* diff --git a/target/riscv/cpu.c b/target/riscv/cpu.c index 02417be926..fc75f659fa 100644 --- a/target/riscv/cpu.c +++ b/target/riscv/cpu.c @@ -110,18 +110,36 @@ const char *riscv_cpu_get_trap_name(target_ulong caus= e, bool async) =20 bool riscv_cpu_is_32bit(CPURISCVState *env) { - if (env->misa & RV64) { - return false; - } + return (env->misa & MXLEN_MASK) =3D=3D RV32; +} + +bool riscv_cpu_is_64bit(CPURISCVState *env) +{ + return (env->misa & MXLEN_MASK) =3D=3D RV64; +} =20 - return true; +#if defined(TARGET_RISCV64) || defined(TARGET_RISCV32) +bool riscv_cpu_is_128bit(CPURISCVState *env) +{ + return false; +} +#else +bool riscv_cpu_is_128bit(CPURISCVState *env) +{ + return (env->misah & MXLEN_MASK) =3D=3D RV128; } +#endif =20 static void set_misa(CPURISCVState *env, target_ulong misa) { env->misa_mask =3D env->misa =3D misa; } =20 +static void set_misah(CPURISCVState *env, target_ulong misah) +{ + env->misah_mask =3D env->misah =3D misah; +} + static void set_priv_version(CPURISCVState *env, int priv_ver) { env->priv_ver =3D priv_ver; @@ -158,6 +176,9 @@ static void riscv_any_cpu_init(Object *obj) #elif defined(TARGET_RISCV64) set_misa(env, RV64 | RVI | RVM | RVA | RVF | RVD | RVC | RVU); set_misah(env, 0); +#else + set_misa(env, RVI | RVM | RVA | RVF | RVD | RVC | RVU); + set_misah(env, RV128); #endif set_priv_version(env, PRIV_VERSION_1_11_0); } @@ -184,7 +205,7 @@ static void rv64_sifive_e_cpu_init(Object *obj) set_priv_version(env, PRIV_VERSION_1_10_0); qdev_prop_set_bit(DEVICE(obj), "mmu", false); } -#else +#elif defined(TARGET_RISCV32) static void rv32_base_cpu_init(Object *obj) { CPURISCVState *env =3D &RISCV_CPU(obj)->env; @@ -224,6 +245,14 @@ static void rv32_imafcu_nommu_cpu_init(Object *obj) set_resetvec(env, DEFAULT_RSTVEC); qdev_prop_set_bit(DEVICE(obj), "mmu", false); } +#else +static void rv128_base_cpu_init(Object *obj) +{ + CPURISCVState *env =3D &RISCV_CPU(obj)->env; + /* We set this in the realise function */ + set_misa(env, 0); + set_misah(env, RV128); +} #endif =20 static ObjectClass *riscv_cpu_class_by_name(const char *cpu_model) @@ -442,7 +471,9 @@ static void riscv_cpu_realize(DeviceState *dev, Error *= *errp) set_resetvec(env, cpu->cfg.resetvec); =20 /* If only XLEN is set for misa, then set misa from properties */ - if (env->misa =3D=3D RV32 || env->misa =3D=3D RV64) { + if (env->misa =3D=3D RV32 || env->misa =3D=3D RV64 + || (env->misah =3D=3D RV128 && env->misa =3D=3D 0) + ) { /* Do some ISA extension error checking */ if (cpu->cfg.ext_i && cpu->cfg.ext_e) { error_setg(errp, @@ -709,6 +740,8 @@ static void riscv_cpu_class_init(ObjectClass *c, void *= data) cc->gdb_core_xml_file =3D "riscv-32bit-cpu.xml"; #elif defined(TARGET_RISCV64) cc->gdb_core_xml_file =3D "riscv-64bit-cpu.xml"; +#else + cc->gdb_core_xml_file =3D "riscv-128bit-cpu.xml"; #endif cc->gdb_stop_before_watchpoint =3D true; cc->disas_set_info =3D riscv_cpu_disas_set_info; @@ -796,6 +829,8 @@ static const TypeInfo riscv_cpu_type_infos[] =3D { DEFINE_CPU(TYPE_RISCV_CPU_SIFIVE_E51, rv64_sifive_e_cpu_init), DEFINE_CPU(TYPE_RISCV_CPU_SIFIVE_U54, rv64_sifive_u_cpu_init), DEFINE_CPU(TYPE_RISCV_CPU_SHAKTI_C, rv64_sifive_u_cpu_init), +#else + DEFINE_CPU(TYPE_RISCV_CPU_BASE128, rv128_base_cpu_init), #endif }; =20 diff --git a/target/riscv/gdbstub.c b/target/riscv/gdbstub.c index a7a9c0b1fe..a7233948f8 100644 --- a/target/riscv/gdbstub.c +++ b/target/riscv/gdbstub.c @@ -204,6 +204,9 @@ void riscv_cpu_register_gdb_regs_for_features(CPUState = *cs) #elif defined(TARGET_RISCV64) gdb_register_coprocessor(cs, riscv_gdb_get_virtual, riscv_gdb_set_virt= ual, 1, "riscv-64bit-virtual.xml", 0); +#else + gdb_register_coprocessor(cs, riscv_gdb_get_virtual, riscv_gdb_set_virt= ual, + 1, "riscv-128bit-virtual.xml", 0); #endif =20 gdb_register_coprocessor(cs, riscv_gdb_get_csr, riscv_gdb_set_csr, diff --git a/target/riscv/insn_trans/trans_rvd.c.inc b/target/riscv/insn_tr= ans/trans_rvd.c.inc index db9ae15755..41da696ec4 100644 --- a/target/riscv/insn_trans/trans_rvd.c.inc +++ b/target/riscv/insn_trans/trans_rvd.c.inc @@ -393,11 +393,11 @@ static bool trans_fmv_x_d(DisasContext *ctx, arg_fmv_= x_d *a) REQUIRE_FPU; REQUIRE_EXT(ctx, RVD); =20 -#ifdef TARGET_RISCV64 +#ifdef TARGET_RISCV32 + qemu_build_not_reached(); +#else gen_set_gpr(ctx, a->rd, cpu_fpr[a->rs1]); return true; -#else - qemu_build_not_reached(); #endif } =20 @@ -437,11 +437,11 @@ static bool trans_fmv_d_x(DisasContext *ctx, arg_fmv_= d_x *a) REQUIRE_FPU; REQUIRE_EXT(ctx, RVD); =20 -#ifdef TARGET_RISCV64 +#ifdef TARGET_RISCV32 + qemu_build_not_reached(); +#else tcg_gen_mov_tl(cpu_fpr[a->rd], get_gpr(ctx, a->rs1, EXT_NONE)); mark_fs_dirty(ctx); return true; -#else - qemu_build_not_reached(); #endif } diff --git a/target/riscv/insn_trans/trans_rvf.c.inc b/target/riscv/insn_tr= ans/trans_rvf.c.inc index bddbd418d9..90cc51e5d6 100644 --- a/target/riscv/insn_trans/trans_rvf.c.inc +++ b/target/riscv/insn_trans/trans_rvf.c.inc @@ -311,10 +311,10 @@ static bool trans_fmv_x_w(DisasContext *ctx, arg_fmv_= x_w *a) =20 TCGv dest =3D dest_gpr(ctx, a->rd); =20 -#if defined(TARGET_RISCV64) - tcg_gen_ext32s_tl(dest, cpu_fpr[a->rs1]); -#else +#if defined(TARGET_RISCV32) tcg_gen_extrl_i64_i32(dest, cpu_fpr[a->rs1]); +#else + tcg_gen_ext32s_tl(dest, cpu_fpr[a->rs1]); #endif =20 gen_set_gpr(ctx, a->rd, dest); diff --git a/gdb-xml/riscv-128bit-cpu.xml b/gdb-xml/riscv-128bit-cpu.xml new file mode 100644 index 0000000000..c98168148f --- /dev/null +++ b/gdb-xml/riscv-128bit-cpu.xml @@ -0,0 +1,48 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/gdb-xml/riscv-128bit-virtual.xml b/gdb-xml/riscv-128bit-virtua= l.xml new file mode 100644 index 0000000000..db9a0ff677 --- /dev/null +++ b/gdb-xml/riscv-128bit-virtual.xml @@ -0,0 +1,12 @@ + + + + + + + + diff --git a/target/riscv/Kconfig b/target/riscv/Kconfig index b9e5932f13..f9ea52a59a 100644 --- a/target/riscv/Kconfig +++ b/target/riscv/Kconfig @@ -3,3 +3,6 @@ config RISCV32 =20 config RISCV64 bool + +config RISCV128 + bool --=20 2.33.0 From nobody Thu May 9 06:39:21 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; spf=pass (zohomail.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=univ-grenoble-alpes.fr Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 163355695537088.36872979039708; Wed, 6 Oct 2021 14:49:15 -0700 (PDT) Received: from localhost ([::1]:34006 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1mYEmo-0004dW-Bp for importer@patchew.org; Wed, 06 Oct 2021 17:49:14 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:49586) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1mYETl-00082D-5P; Wed, 06 Oct 2021 17:29:33 -0400 Received: from zm-mta-out-3.u-ga.fr ([152.77.200.56]:43766) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1mYETj-00082h-E7; Wed, 06 Oct 2021 17:29:32 -0400 Received: from mailhost.u-ga.fr (mailhost2.u-ga.fr [129.88.177.242]) by zm-mta-out-3.u-ga.fr (Postfix) with ESMTP id D49D941DDF; Wed, 6 Oct 2021 23:29:29 +0200 (CEST) Received: from smtps.univ-grenoble-alpes.fr (smtps2.u-ga.fr [152.77.18.2]) by mailhost.u-ga.fr (Postfix) with ESMTP id BDEBC60066; Wed, 6 Oct 2021 23:29:29 +0200 (CEST) Received: from palmier.tima.u-ga.fr (35.201.90.79.rev.sfr.net [79.90.201.35]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) (Authenticated sender: petrotf@univ-grenoble-alpes.fr) by smtps.univ-grenoble-alpes.fr (Postfix) with ESMTPSA id 8A17F14005C; Wed, 6 Oct 2021 23:29:29 +0200 (CEST) From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20P=C3=A9trot?= To: qemu-devel@nongnu.org, qemu-riscv@nongnu.org Subject: [PATCH v2 10/27] target/riscv: adding accessors to the registers upper part Date: Wed, 6 Oct 2021 23:28:16 +0200 Message-Id: <20211006212833.108706-11-frederic.petrot@univ-grenoble-alpes.fr> X-Mailer: git-send-email 2.33.0 In-Reply-To: <20211006212833.108706-1-frederic.petrot@univ-grenoble-alpes.fr> References: <20211006212833.108706-1-frederic.petrot@univ-grenoble-alpes.fr> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable X-Greylist: Whitelist-UGA SMTP Authentifie (petrotf@univ-grenoble-alpes.fr) via submission-587 ACL (41) X-Greylist: Whitelist-UGA MAILHOST (SMTP non authentifie) depuis 152.77.18.2 Received-SPF: pass (zohomail.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; Received-SPF: pass client-ip=152.77.200.56; envelope-from=frederic.petrot@univ-grenoble-alpes.fr; helo=zm-mta-out-3.u-ga.fr X-Spam_score_int: -18 X-Spam_score: -1.9 X-Spam_bar: - X-Spam_report: (-1.9 / 5.0 requ) BAYES_00=-1.9, RCVD_IN_MSPIKE_H2=-0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action 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: bin.meng@windriver.com, richard.henderson@linaro.org, alistair.francis@wdc.com, fabien.portas@grenoble-inp.org, palmer@dabbelt.com, =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20P=C3=A9trot?= , philmd@redhat.com Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZM-MESSAGEID: 1633556955765100004 Set and get functions to access the 64 top bits of the register, stored in the gprh field of the cpu state. It looks as if the access to the gprh field can not be protected to make sure it is accessed only in the 128-bit version of the processor because the misa/misah field is writable (as it should since the spec indicates that the registers size might be dynamically changeable), although it is for now only set at initialization time. Signed-off-by: Fr=C3=A9d=C3=A9ric P=C3=A9trot Co-authored-by: Fabien Portas --- target/riscv/translate.c | 45 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 45 insertions(+) diff --git a/target/riscv/translate.c b/target/riscv/translate.c index 0700c82a36..9a74abecdd 100644 --- a/target/riscv/translate.c +++ b/target/riscv/translate.c @@ -251,6 +251,25 @@ static TCGv get_gpr(DisasContext *ctx, int reg_num, Di= sasExtend ext) g_assert_not_reached(); } =20 +/* Make sure high part of registers not accessed when not 128-bit */ +static inline TCGv cpu_gprh_check(DisasContext *ctx, int reg_num) +{ + if (is_128bit(ctx)) { + return cpu_gprh[reg_num]; + } else { + /* Cannot use qemu_build_not_reached as misa is rw */ + return 0; + } +} + +static TCGv get_gprh(DisasContext *ctx, int reg_num) +{ + if (reg_num =3D=3D 0 || ctx->w) { + return ctx->zero; + } + return cpu_gprh_check(ctx, reg_num); +} + static TCGv dest_gpr(DisasContext *ctx, int reg_num) { if (reg_num =3D=3D 0 || ctx->w) { @@ -259,6 +278,14 @@ static TCGv dest_gpr(DisasContext *ctx, int reg_num) return cpu_gpr[reg_num]; } =20 +static TCGv dest_gprh(DisasContext *ctx, int reg_num) +{ + if (reg_num =3D=3D 0 || ctx->w) { + return temp_new(ctx); + } + return cpu_gprh_check(ctx, reg_num); +} + static void gen_set_gpr(DisasContext *ctx, int reg_num, TCGv t) { if (reg_num !=3D 0) { @@ -270,6 +297,17 @@ static void gen_set_gpr(DisasContext *ctx, int reg_num= , TCGv t) } } =20 +static void gen_set_gprh(DisasContext *ctx, int reg_num, TCGv t) +{ + if (reg_num !=3D 0) { + if (ctx->w) { + tcg_gen_sari_tl(cpu_gprh_check(ctx, reg_num), cpu_gpr[reg_num]= , 63); + } else { + tcg_gen_mov_tl(cpu_gprh_check(ctx, reg_num), t); + } + } +} + static void gen_jal(DisasContext *ctx, int rd, target_ulong imm) { target_ulong next_pc; @@ -404,6 +442,13 @@ static bool gen_logic_imm_fn(DisasContext *ctx, arg_i = *a, DisasExtend ext, =20 gen_set_gpr(ctx, a->rd, dest); =20 + /* Temporary code so that the patch compiles */ + if (is_128bit(ctx)) { + (void)get_gprh(ctx, 6); + (void)dest_gprh(ctx, 6); + gen_set_gprh(ctx, 6, NULL); + } + return true; } =20 --=20 2.33.0 From nobody Thu May 9 06:39:21 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; spf=pass (zohomail.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=univ-grenoble-alpes.fr Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1633557166923260.90006844821414; Wed, 6 Oct 2021 14:52:46 -0700 (PDT) Received: from localhost ([::1]:41282 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1mYEqC-0001DM-57 for importer@patchew.org; Wed, 06 Oct 2021 17:52:44 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:49662) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1mYEUA-0008Pe-25; Wed, 06 Oct 2021 17:29:58 -0400 Received: from zm-mta-out-3.u-ga.fr ([152.77.200.56]:43786) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1mYEU4-00083x-J5; Wed, 06 Oct 2021 17:29:55 -0400 Received: from mailhost.u-ga.fr (mailhost2.u-ga.fr [129.88.177.242]) by zm-mta-out-3.u-ga.fr (Postfix) with ESMTP id DFE4D41DEF; Wed, 6 Oct 2021 23:29:30 +0200 (CEST) Received: from smtps.univ-grenoble-alpes.fr (smtps2.u-ga.fr [152.77.18.2]) by mailhost.u-ga.fr (Postfix) with ESMTP id C939960066; Wed, 6 Oct 2021 23:29:30 +0200 (CEST) Received: from palmier.tima.u-ga.fr (35.201.90.79.rev.sfr.net [79.90.201.35]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) (Authenticated sender: petrotf@univ-grenoble-alpes.fr) by smtps.univ-grenoble-alpes.fr (Postfix) with ESMTPSA id 908A514005C; Wed, 6 Oct 2021 23:29:30 +0200 (CEST) From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20P=C3=A9trot?= To: qemu-devel@nongnu.org, qemu-riscv@nongnu.org Subject: [PATCH v2 11/27] target/riscv: handling 128-bit part in logic/arith/shift gen helpers Date: Wed, 6 Oct 2021 23:28:17 +0200 Message-Id: <20211006212833.108706-12-frederic.petrot@univ-grenoble-alpes.fr> X-Mailer: git-send-email 2.33.0 In-Reply-To: <20211006212833.108706-1-frederic.petrot@univ-grenoble-alpes.fr> References: <20211006212833.108706-1-frederic.petrot@univ-grenoble-alpes.fr> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable X-Greylist: Whitelist-UGA SMTP Authentifie (petrotf@univ-grenoble-alpes.fr) via submission-587 ACL (41) X-Greylist: Whitelist-UGA MAILHOST (SMTP non authentifie) depuis 152.77.18.2 Received-SPF: pass (zohomail.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; Received-SPF: pass client-ip=152.77.200.56; envelope-from=frederic.petrot@univ-grenoble-alpes.fr; helo=zm-mta-out-3.u-ga.fr X-Spam_score_int: -18 X-Spam_score: -1.9 X-Spam_bar: - X-Spam_report: (-1.9 / 5.0 requ) BAYES_00=-1.9, RCVD_IN_MSPIKE_H2=-0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action 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: bin.meng@windriver.com, richard.henderson@linaro.org, alistair.francis@wdc.com, fabien.portas@grenoble-inp.org, palmer@dabbelt.com, =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20P=C3=A9trot?= , philmd@redhat.com Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZM-MESSAGEID: 1633557167715100001 The code generation helpers are now able to handle also the 128-bit functions, although no such function exists yet. Signed-off-by: Fr=C3=A9d=C3=A9ric P=C3=A9trot Co-authored-by: Fabien Portas --- target/riscv/translate.c | 102 +++++++++++++++++++++++++++++++++------ 1 file changed, 88 insertions(+), 14 deletions(-) diff --git a/target/riscv/translate.c b/target/riscv/translate.c index 9a74abecdd..b3f70bcde0 100644 --- a/target/riscv/translate.c +++ b/target/riscv/translate.c @@ -442,11 +442,14 @@ static bool gen_logic_imm_fn(DisasContext *ctx, arg_i= *a, DisasExtend ext, =20 gen_set_gpr(ctx, a->rd, dest); =20 - /* Temporary code so that the patch compiles */ if (is_128bit(ctx)) { - (void)get_gprh(ctx, 6); - (void)dest_gprh(ctx, 6); - gen_set_gprh(ctx, 6, NULL); + uint64_t immh =3D -(a->imm < 0); + src1 =3D get_gprh(ctx, a->rs1); + dest =3D dest_gprh(ctx, a->rd); + + func(dest, src1, immh); + + gen_set_gprh(ctx, a->rd, dest); } =20 return true; @@ -463,6 +466,15 @@ static bool gen_logic(DisasContext *ctx, arg_r *a, Dis= asExtend ext, =20 gen_set_gpr(ctx, a->rd, dest); =20 + if (is_128bit(ctx)) { + dest =3D dest_gprh(ctx, a->rd); + src1 =3D get_gprh(ctx, a->rs1); + src2 =3D get_gprh(ctx, a->rs2); + + func(dest, src1, src2); + + gen_set_gprh(ctx, a->rd, dest); + } return true; } =20 @@ -485,8 +497,16 @@ static bool gen_arith_imm_fn(DisasContext *ctx, arg_i = *a, DisasExtend ext, fn64(dest, src1, a->imm); =20 gen_set_gpr(ctx, a->rd, dest); - } else { - return false; + } else if (is_128bit(ctx)) { + TCGv src1l =3D get_gpr(ctx, a->rs1, ext), + src1h =3D get_gprh(ctx, a->rs1), + destl =3D dest_gpr(ctx, a->rd), + desth =3D dest_gprh(ctx, a->rd); + + fn128(destl, desth, src1l, src1h, a->imm); + + gen_set_gpr(ctx, a->rd, destl); + gen_set_gprh(ctx, a->rd, desth); } return true; } @@ -512,8 +532,18 @@ static bool gen_arith_imm_tl(DisasContext *ctx, arg_i = *a, DisasExtend ext, fn64(dest, src1, src2); =20 gen_set_gpr(ctx, a->rd, dest); - } else { - return false; + } else if (is_128bit(ctx)) { + TCGv src1l =3D get_gpr(ctx, a->rs1, ext), + src1h =3D get_gprh(ctx, a->rs1), + destl =3D dest_gpr(ctx, a->rd), + desth =3D dest_gprh(ctx, a->rd), + imml =3D tcg_constant_tl(a->imm), + immh =3D tcg_constant_tl(-(a->imm < 0)); + + fn128(destl, desth, src1l, src1h, imml, immh); + + gen_set_gpr(ctx, a->rd, destl); + gen_set_gprh(ctx, a->rd, desth); } return true; } @@ -540,8 +570,21 @@ static bool gen_arith(DisasContext *ctx, arg_r *a, Dis= asExtend ext, fn64(dest, src1, src2); =20 gen_set_gpr(ctx, a->rd, dest); - } else { - return false; + } else if (is_128bit(ctx)) { + TCGv src1l =3D get_gpr(ctx, a->rs1, ext), + src1h =3D get_gprh(ctx, a->rs1), + src2l =3D get_gpr(ctx, a->rs2, ext), + src2h =3D get_gprh(ctx, a->rs2), + destl =3D tcg_temp_new(), + desth =3D tcg_temp_new(); + + fn128(destl, desth, src1l, src1h, src2l, src2h); + + gen_set_gpr(ctx, a->rd, destl); + gen_set_gprh(ctx, a->rd, desth); + + tcg_temp_free(destl); + tcg_temp_free(desth); } return true; } @@ -579,8 +622,24 @@ static bool gen_shift_imm_fn(DisasContext *ctx, arg_sh= ift *a, DisasExtend ext, fn64(dest, src1, a->shamt); =20 gen_set_gpr(ctx, a->rd, dest); - } else { - return false; + } else if (is_128bit(ctx)) { + if ((ctx->w && a->shamt >=3D 32) + || (!ctx->w && a->shamt >=3D 128)) { + return false; + } + + TCGv src1l =3D get_gpr(ctx, a->rs1, ext), + src1h =3D get_gprh(ctx, a->rs1), + destl =3D tcg_temp_new(), + desth =3D tcg_temp_new(); + + fn128(destl, desth, src1l, src1h, a->shamt); + + gen_set_gpr(ctx, a->rd, destl); + gen_set_gprh(ctx, a->rd, desth); + + tcg_temp_free(destl); + tcg_temp_free(desth); } return true; } @@ -632,8 +691,23 @@ static bool gen_shift(DisasContext *ctx, arg_r *a, Dis= asExtend ext, =20 gen_set_gpr(ctx, a->rd, dest); tcg_temp_free(ext2); - } else { - return false; + } else if (is_128bit(ctx)) { + TCGv src1l =3D get_gpr(ctx, a->rs1, ext), + src1h =3D get_gprh(ctx, a->rs1), + src2l =3D get_gpr(ctx, a->rs2, EXT_NONE), + destl =3D tcg_temp_new(), + desth =3D tcg_temp_new(), + shamt =3D tcg_temp_new(); + + tcg_gen_andi_tl(shamt, src2l, !ctx->w << 5 | 0x1f); + fn128(destl, desth, src1l, src1h, shamt); + + gen_set_gpr(ctx, a->rd, destl); + gen_set_gprh(ctx, a->rd, desth); + + tcg_temp_free(destl); + tcg_temp_free(desth); + tcg_temp_free(shamt); } return true; } --=20 2.33.0 From nobody Thu May 9 06:39:21 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; spf=pass (zohomail.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=univ-grenoble-alpes.fr Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1633556653993497.87077246879767; Wed, 6 Oct 2021 14:44:13 -0700 (PDT) Received: from localhost ([::1]:53580 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1mYEhw-00072r-Tq for importer@patchew.org; Wed, 06 Oct 2021 17:44:12 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:49664) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1mYEUA-0008Pk-3u; Wed, 06 Oct 2021 17:29:59 -0400 Received: from zm-mta-out-3.u-ga.fr ([152.77.200.56]:43806) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1mYEU5-00084l-LZ; Wed, 06 Oct 2021 17:29:56 -0400 Received: from mailhost.u-ga.fr (mailhost1.u-ga.fr [152.77.1.10]) by zm-mta-out-3.u-ga.fr (Postfix) with ESMTP id EED8741E18; Wed, 6 Oct 2021 23:29:31 +0200 (CEST) Received: from smtps.univ-grenoble-alpes.fr (smtps2.u-ga.fr [152.77.18.2]) by mailhost.u-ga.fr (Postfix) with ESMTP id D91C360067; Wed, 6 Oct 2021 23:29:31 +0200 (CEST) Received: from palmier.tima.u-ga.fr (35.201.90.79.rev.sfr.net [79.90.201.35]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) (Authenticated sender: petrotf@univ-grenoble-alpes.fr) by smtps.univ-grenoble-alpes.fr (Postfix) with ESMTPSA id 9EDCC14005C; Wed, 6 Oct 2021 23:29:31 +0200 (CEST) From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20P=C3=A9trot?= To: qemu-devel@nongnu.org, qemu-riscv@nongnu.org Subject: [PATCH v2 12/27] target/riscv: moving some insns close to similar insns Date: Wed, 6 Oct 2021 23:28:18 +0200 Message-Id: <20211006212833.108706-13-frederic.petrot@univ-grenoble-alpes.fr> X-Mailer: git-send-email 2.33.0 In-Reply-To: <20211006212833.108706-1-frederic.petrot@univ-grenoble-alpes.fr> References: <20211006212833.108706-1-frederic.petrot@univ-grenoble-alpes.fr> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable X-Greylist: Whitelist-UGA SMTP Authentifie (petrotf@univ-grenoble-alpes.fr) via submission-587 ACL (41) X-Greylist: Whitelist-UGA MAILHOST (SMTP non authentifie) depuis 152.77.18.2 Received-SPF: pass (zohomail.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; Received-SPF: pass client-ip=152.77.200.56; envelope-from=frederic.petrot@univ-grenoble-alpes.fr; helo=zm-mta-out-3.u-ga.fr X-Spam_score_int: -18 X-Spam_score: -1.9 X-Spam_bar: - X-Spam_report: (-1.9 / 5.0 requ) BAYES_00=-1.9, RCVD_IN_MSPIKE_H2=-0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action 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: bin.meng@windriver.com, richard.henderson@linaro.org, alistair.francis@wdc.com, fabien.portas@grenoble-inp.org, palmer@dabbelt.com, =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20P=C3=A9trot?= , philmd@redhat.com Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZM-MESSAGEID: 1633556655900100001 lwu and ld are functionally close to the other loads, but were after the stores in the source file. Similarly, xor was away from or and and by two arithmetic functions, while the immediate versions were nicely put together. This patch moves the aforementioned loads after lhu, and xor above or, where they more logically belong. Signed-off-by: Fr=C3=A9d=C3=A9ric P=C3=A9trot Co-authored-by: Fabien Portas --- target/riscv/insn_trans/trans_rvi.c.inc | 34 ++++++++++++------------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/target/riscv/insn_trans/trans_rvi.c.inc b/target/riscv/insn_tr= ans/trans_rvi.c.inc index aa1e3f07e5..9e5782d1f5 100644 --- a/target/riscv/insn_trans/trans_rvi.c.inc +++ b/target/riscv/insn_trans/trans_rvi.c.inc @@ -177,6 +177,18 @@ static bool trans_lhu(DisasContext *ctx, arg_lhu *a) return gen_load(ctx, a, MO_TEUW); } =20 +static bool trans_lwu(DisasContext *ctx, arg_lwu *a) +{ + REQUIRE_64BIT(ctx); + return gen_load(ctx, a, MO_TEUL); +} + +static bool trans_ld(DisasContext *ctx, arg_ld *a) +{ + REQUIRE_64BIT(ctx); + return gen_load(ctx, a, MO_TEQ); +} + static bool gen_store(DisasContext *ctx, arg_sb *a, MemOp memop) { TCGv addr =3D get_gpr(ctx, a->rs1, EXT_NONE); @@ -207,18 +219,6 @@ static bool trans_sw(DisasContext *ctx, arg_sw *a) return gen_store(ctx, a, MO_TESL); } =20 -static bool trans_lwu(DisasContext *ctx, arg_lwu *a) -{ - REQUIRE_64BIT(ctx); - return gen_load(ctx, a, MO_TEUL); -} - -static bool trans_ld(DisasContext *ctx, arg_ld *a) -{ - REQUIRE_64BIT(ctx); - return gen_load(ctx, a, MO_TEQ); -} - static bool trans_sd(DisasContext *ctx, arg_sd *a) { REQUIRE_64BIT(ctx); @@ -314,11 +314,6 @@ static bool trans_sltu(DisasContext *ctx, arg_sltu *a) return gen_arith(ctx, a, EXT_SIGN, gen_sltu, gen_sltu, NULL); } =20 -static bool trans_xor(DisasContext *ctx, arg_xor *a) -{ - return gen_logic(ctx, a, EXT_NONE, tcg_gen_xor_tl); -} - static bool trans_srl(DisasContext *ctx, arg_srl *a) { return gen_shift(ctx, a, EXT_ZERO, tcg_gen_shr_tl, tcg_gen_shr_tl, NUL= L); @@ -329,6 +324,11 @@ static bool trans_sra(DisasContext *ctx, arg_sra *a) return gen_shift(ctx, a, EXT_SIGN, tcg_gen_sar_tl, tcg_gen_sar_tl, NUL= L); } =20 +static bool trans_xor(DisasContext *ctx, arg_xor *a) +{ + return gen_logic(ctx, a, EXT_NONE, tcg_gen_xor_tl); +} + static bool trans_or(DisasContext *ctx, arg_or *a) { return gen_logic(ctx, a, EXT_NONE, tcg_gen_or_tl); --=20 2.33.0 From nobody Thu May 9 06:39:21 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; spf=pass (zohomail.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=univ-grenoble-alpes.fr Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1633556471743994.4993450659059; Wed, 6 Oct 2021 14:41:11 -0700 (PDT) Received: from localhost ([::1]:48852 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1mYEf0-0003gr-Id for importer@patchew.org; Wed, 06 Oct 2021 17:41:10 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:49710) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1mYEUD-0008SG-Q1; Wed, 06 Oct 2021 17:30:04 -0400 Received: from zm-mta-out-3.u-ga.fr ([152.77.200.56]:43826) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1mYEU7-00085h-KZ; Wed, 06 Oct 2021 17:30:00 -0400 Received: from mailhost.u-ga.fr (mailhost2.u-ga.fr [129.88.177.242]) by zm-mta-out-3.u-ga.fr (Postfix) with ESMTP id E53F041E28; Wed, 6 Oct 2021 23:29:32 +0200 (CEST) Received: from smtps.univ-grenoble-alpes.fr (smtps2.u-ga.fr [152.77.18.2]) by mailhost.u-ga.fr (Postfix) with ESMTP id CF62460066; Wed, 6 Oct 2021 23:29:32 +0200 (CEST) Received: from palmier.tima.u-ga.fr (35.201.90.79.rev.sfr.net [79.90.201.35]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) (Authenticated sender: petrotf@univ-grenoble-alpes.fr) by smtps.univ-grenoble-alpes.fr (Postfix) with ESMTPSA id 9561B14005C; Wed, 6 Oct 2021 23:29:32 +0200 (CEST) From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20P=C3=A9trot?= To: qemu-devel@nongnu.org, qemu-riscv@nongnu.org Subject: [PATCH v2 13/27] target/riscv: rename a few gen function helpers Date: Wed, 6 Oct 2021 23:28:19 +0200 Message-Id: <20211006212833.108706-14-frederic.petrot@univ-grenoble-alpes.fr> X-Mailer: git-send-email 2.33.0 In-Reply-To: <20211006212833.108706-1-frederic.petrot@univ-grenoble-alpes.fr> References: <20211006212833.108706-1-frederic.petrot@univ-grenoble-alpes.fr> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable X-Greylist: Whitelist-UGA SMTP Authentifie (petrotf@univ-grenoble-alpes.fr) via submission-587 ACL (41) X-Greylist: Whitelist-UGA MAILHOST (SMTP non authentifie) depuis 152.77.18.2 Received-SPF: pass (zohomail.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; Received-SPF: pass client-ip=152.77.200.56; envelope-from=frederic.petrot@univ-grenoble-alpes.fr; helo=zm-mta-out-3.u-ga.fr X-Spam_score_int: -18 X-Spam_score: -1.9 X-Spam_bar: - X-Spam_report: (-1.9 / 5.0 requ) BAYES_00=-1.9, RCVD_IN_MSPIKE_H2=-0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action 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: bin.meng@windriver.com, richard.henderson@linaro.org, alistair.francis@wdc.com, fabien.portas@grenoble-inp.org, palmer@dabbelt.com, =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20P=C3=A9trot?= , philmd@redhat.com Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZM-MESSAGEID: 1633556473933100001 Add the tl suffix to the existing integer gen_xxx functions that apply to target_long types for which a 128-bit version will also exist, so that it is immediately visible which function is for which type(s). Signed-off-by: Fr=C3=A9d=C3=A9ric P=C3=A9trot Co-authored-by: Fabien Portas --- target/riscv/insn_trans/trans_rvi.c.inc | 34 ++++++++++++++++--------- 1 file changed, 22 insertions(+), 12 deletions(-) diff --git a/target/riscv/insn_trans/trans_rvi.c.inc b/target/riscv/insn_tr= ans/trans_rvi.c.inc index 9e5782d1f5..ab85693364 100644 --- a/target/riscv/insn_trans/trans_rvi.c.inc +++ b/target/riscv/insn_trans/trans_rvi.c.inc @@ -136,7 +136,7 @@ static bool trans_bgeu(DisasContext *ctx, arg_bgeu *a) return gen_branch(ctx, a, TCG_COND_GEU); } =20 -static bool gen_load(DisasContext *ctx, arg_lb *a, MemOp memop) +static bool gen_load_tl(DisasContext *ctx, arg_lb *a, MemOp memop) { TCGv dest =3D dest_gpr(ctx, a->rd); TCGv addr =3D get_gpr(ctx, a->rs1, EXT_NONE); @@ -152,6 +152,11 @@ static bool gen_load(DisasContext *ctx, arg_lb *a, Mem= Op memop) return true; } =20 +static bool gen_load(DisasContext *ctx, arg_lb *a, MemOp memop) +{ + return gen_load_tl(ctx, a, memop); +} + static bool trans_lb(DisasContext *ctx, arg_lb *a) { return gen_load(ctx, a, MO_SB); @@ -189,7 +194,7 @@ static bool trans_ld(DisasContext *ctx, arg_ld *a) return gen_load(ctx, a, MO_TEQ); } =20 -static bool gen_store(DisasContext *ctx, arg_sb *a, MemOp memop) +static bool gen_store_tl(DisasContext *ctx, arg_sb *a, MemOp memop) { TCGv addr =3D get_gpr(ctx, a->rs1, EXT_NONE); TCGv data =3D get_gpr(ctx, a->rs2, EXT_NONE); @@ -204,6 +209,11 @@ static bool gen_store(DisasContext *ctx, arg_sb *a, Me= mOp memop) return true; } =20 +static bool gen_store(DisasContext *ctx, arg_sb *a, MemOp memop) +{ + return gen_store_tl(ctx, a, memop); +} + static bool trans_sb(DisasContext *ctx, arg_sb *a) { return gen_store(ctx, a, MO_SB); @@ -231,12 +241,12 @@ static bool trans_addi(DisasContext *ctx, arg_addi *a) tcg_gen_addi_tl, tcg_gen_addi_tl, NULL); } =20 -static void gen_slt(TCGv ret, TCGv s1, TCGv s2) +static void gen_slt_tl(TCGv ret, TCGv s1, TCGv s2) { tcg_gen_setcond_tl(TCG_COND_LT, ret, s1, s2); } =20 -static void gen_sltu(TCGv ret, TCGv s1, TCGv s2) +static void gen_sltu_tl(TCGv ret, TCGv s1, TCGv s2) { tcg_gen_setcond_tl(TCG_COND_LTU, ret, s1, s2); } @@ -244,13 +254,13 @@ static void gen_sltu(TCGv ret, TCGv s1, TCGv s2) static bool trans_slti(DisasContext *ctx, arg_slti *a) { return gen_arith_imm_tl(ctx, a, EXT_SIGN, - gen_slt, gen_slt, NULL); + gen_slt_lt, gen_slt_lt, NULL); } =20 static bool trans_sltiu(DisasContext *ctx, arg_sltiu *a) { return gen_arith_imm_tl(ctx, a, EXT_SIGN, - gen_sltu, gen_sltu, NULL); + gen_sltu_lt, gen_sltu_lt, NULL); } =20 static bool trans_xori(DisasContext *ctx, arg_xori *a) @@ -306,12 +316,12 @@ static bool trans_sll(DisasContext *ctx, arg_sll *a) =20 static bool trans_slt(DisasContext *ctx, arg_slt *a) { - return gen_arith(ctx, a, EXT_SIGN, gen_slt, gen_slt, NULL); + return gen_arith(ctx, a, EXT_SIGN, gen_slt_lt, gen_slt_lt, NULL); } =20 static bool trans_sltu(DisasContext *ctx, arg_sltu *a) { - return gen_arith(ctx, a, EXT_SIGN, gen_sltu, gen_sltu, NULL); + return gen_arith(ctx, a, EXT_SIGN, gen_sltu_lt, gen_sltu_lt, NULL); } =20 static bool trans_srl(DisasContext *ctx, arg_srl *a) @@ -353,7 +363,7 @@ static bool trans_slliw(DisasContext *ctx, arg_slliw *a) return gen_shift_imm_fn(ctx, a, EXT_NONE, NULL, tcg_gen_shli_tl, NULL); } =20 -static void gen_srliw(TCGv dst, TCGv src, target_long shamt) +static void gen_srliw_tl(TCGv dst, TCGv src, target_long shamt) { tcg_gen_extract_tl(dst, src, shamt, 32 - shamt); } @@ -362,10 +372,10 @@ static bool trans_srliw(DisasContext *ctx, arg_srliw = *a) { REQUIRE_64BIT(ctx); ctx->w =3D true; - return gen_shift_imm_fn(ctx, a, EXT_NONE, NULL, gen_srliw, NULL); + return gen_shift_imm_fn(ctx, a, EXT_NONE, NULL, gen_srliw_tl, NULL); } =20 -static void gen_sraiw(TCGv dst, TCGv src, target_long shamt) +static void gen_sraiw_tl(TCGv dst, TCGv src, target_long shamt) { tcg_gen_sextract_tl(dst, src, shamt, 32 - shamt); } @@ -374,7 +384,7 @@ static bool trans_sraiw(DisasContext *ctx, arg_sraiw *a) { REQUIRE_64BIT(ctx); ctx->w =3D true; - return gen_shift_imm_fn(ctx, a, EXT_NONE, NULL, gen_sraiw, NULL); + return gen_shift_imm_fn(ctx, a, EXT_NONE, NULL, gen_sraiw_tl, NULL); } =20 static bool trans_addw(DisasContext *ctx, arg_addw *a) --=20 2.33.0 From nobody Thu May 9 06:39:21 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; spf=pass (zohomail.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=univ-grenoble-alpes.fr Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1633557398377791.2880566326571; Wed, 6 Oct 2021 14:56:38 -0700 (PDT) Received: from localhost ([::1]:50412 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1mYEtx-0007Iz-9F for importer@patchew.org; Wed, 06 Oct 2021 17:56:37 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:49684) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1mYEUB-0008Ri-TP; Wed, 06 Oct 2021 17:30:03 -0400 Received: from zm-mta-out-3.u-ga.fr ([152.77.200.56]:43846) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1mYEU7-00086Z-LQ; Wed, 06 Oct 2021 17:29:59 -0400 Received: from mailhost.u-ga.fr (mailhost1.u-ga.fr [152.77.1.10]) by zm-mta-out-3.u-ga.fr (Postfix) with ESMTP id 0037541E3E; Wed, 6 Oct 2021 23:29:33 +0200 (CEST) Received: from smtps.univ-grenoble-alpes.fr (smtps2.u-ga.fr [152.77.18.2]) by mailhost.u-ga.fr (Postfix) with ESMTP id DDEF360067; Wed, 6 Oct 2021 23:29:33 +0200 (CEST) Received: from palmier.tima.u-ga.fr (35.201.90.79.rev.sfr.net [79.90.201.35]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) (Authenticated sender: petrotf@univ-grenoble-alpes.fr) by smtps.univ-grenoble-alpes.fr (Postfix) with ESMTPSA id 9CB5114005C; Wed, 6 Oct 2021 23:29:33 +0200 (CEST) From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20P=C3=A9trot?= To: qemu-devel@nongnu.org, qemu-riscv@nongnu.org Subject: [PATCH v2 14/27] target/riscv: 128-bit support for instructions using gen_arith/gen_logic Date: Wed, 6 Oct 2021 23:28:20 +0200 Message-Id: <20211006212833.108706-15-frederic.petrot@univ-grenoble-alpes.fr> X-Mailer: git-send-email 2.33.0 In-Reply-To: <20211006212833.108706-1-frederic.petrot@univ-grenoble-alpes.fr> References: <20211006212833.108706-1-frederic.petrot@univ-grenoble-alpes.fr> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable X-Greylist: Whitelist-UGA SMTP Authentifie (petrotf@univ-grenoble-alpes.fr) via submission-587 ACL (41) X-Greylist: Whitelist-UGA MAILHOST (SMTP non authentifie) depuis 152.77.18.2 Received-SPF: pass (zohomail.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; Received-SPF: pass client-ip=152.77.200.56; envelope-from=frederic.petrot@univ-grenoble-alpes.fr; helo=zm-mta-out-3.u-ga.fr X-Spam_score_int: -18 X-Spam_score: -1.9 X-Spam_bar: - X-Spam_report: (-1.9 / 5.0 requ) BAYES_00=-1.9, RCVD_IN_MSPIKE_H2=-0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action 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: bin.meng@windriver.com, richard.henderson@linaro.org, alistair.francis@wdc.com, fabien.portas@grenoble-inp.org, palmer@dabbelt.com, =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20P=C3=A9trot?= , philmd@redhat.com Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZM-MESSAGEID: 1633557399051100003 The RISCV ISA is such that the arithmetic and logic instructions have the same opcode, irrelevant of the base register size. So, for all arithmetic and logic insns existing for the 3 register sizes, excluding shifts, this patch adds the support for the 128-bit computations. Signed-off-by: Fr=C3=A9d=C3=A9ric P=C3=A9trot Co-authored-by: Fabien Portas --- target/riscv/insn_trans/trans_rvi.c.inc | 223 +++++++++++++++++++++--- 1 file changed, 198 insertions(+), 25 deletions(-) diff --git a/target/riscv/insn_trans/trans_rvi.c.inc b/target/riscv/insn_tr= ans/trans_rvi.c.inc index ab85693364..814aa5f1b7 100644 --- a/target/riscv/insn_trans/trans_rvi.c.inc +++ b/target/riscv/insn_trans/trans_rvi.c.inc @@ -26,14 +26,17 @@ static bool trans_illegal(DisasContext *ctx, arg_empty = *a) =20 static bool trans_c64_illegal(DisasContext *ctx, arg_empty *a) { - REQUIRE_64BIT(ctx); - return trans_illegal(ctx, a); + REQUIRE_64_OR_128BIT(ctx); + return trans_illegal(ctx, a); } =20 static bool trans_lui(DisasContext *ctx, arg_lui *a) { if (a->rd !=3D 0) { tcg_gen_movi_tl(cpu_gpr[a->rd], a->imm); + if (is_128bit(ctx)) { + tcg_gen_movi_tl(cpu_gprh_check(ctx, a->rd), -(a->imm < 0)); + } } return true; } @@ -41,7 +44,19 @@ static bool trans_lui(DisasContext *ctx, arg_lui *a) static bool trans_auipc(DisasContext *ctx, arg_auipc *a) { if (a->rd !=3D 0) { + if (is_128bit(ctx)) { + /* TODO : when pc is 128 bits, use all its bits */ + TCGv pc =3D tcg_constant_tl(ctx->base.pc_next), + imm =3D tcg_constant_tl(a->imm), + immh =3D tcg_constant_tl(-(a->imm < 0)), + zero =3D tcg_constant_tl(0); + tcg_gen_add2_tl(cpu_gpr[a->rd], cpu_gprh_check(ctx, a->rd), + pc, zero, + imm, immh); + return true; + } tcg_gen_movi_tl(cpu_gpr[a->rd], a->imm + ctx->base.pc_next); + return true; } return true; } @@ -84,13 +99,121 @@ static bool trans_jalr(DisasContext *ctx, arg_jalr *a) return true; } =20 +/* + * Comparison predicates using bitwise logic taken from Hacker's Delight, = 2.12 + * We are just interested in the sign bit, so rl is not used but for subtr= acting + */ +static bool gen_setcond_i128(TCGv rl, TCGv rh, + TCGv al, TCGv ah, + TCGv bl, TCGv bh, + TCGCond cond) +{ + switch (cond) { + case TCG_COND_EQ: + tcg_gen_setcond_tl(TCG_COND_EQ, rl, al, bl); + tcg_gen_setcond_tl(TCG_COND_EQ, rh, ah, bh); + tcg_gen_and_tl(rl, rl, rh); + break; + + case TCG_COND_NE: + tcg_gen_setcond_tl(TCG_COND_NE, rl, al, bl); + tcg_gen_setcond_tl(TCG_COND_NE, rh, ah, bh); + tcg_gen_or_tl(rl, rl, rh); + break; + + case TCG_COND_LT: + { + TCGv tmp1 =3D tcg_temp_new(), + tmp2 =3D tcg_temp_new(); + + tcg_gen_sub2_tl(rl, rh, al, ah, bl, bh); + tcg_gen_xor_tl(tmp1, rh, ah); + tcg_gen_xor_tl(tmp2, ah, bh); + tcg_gen_and_tl(tmp1, tmp1, tmp2); + tcg_gen_xor_tl(tmp1, rh, tmp1); + tcg_gen_shri_tl(rl, tmp1, 63); + + tcg_temp_free(tmp1); + tcg_temp_free(tmp2); + break; + } + + case TCG_COND_GE: + /* Invert result of TCG_COND_LT */ + gen_setcond_i128(rl, rh, al, ah, bl, bh, TCG_COND_LT); + tcg_gen_xori_tl(rl, rl, 1); + break; + + case TCG_COND_LTU: + { + TCGv tmp1 =3D tcg_temp_new(), + tmp2 =3D tcg_temp_new(); + + tcg_gen_sub2_tl(rl, rh, al, ah, bl, bh); + tcg_gen_eqv_tl(tmp1, ah, bh); + tcg_gen_and_tl(tmp1, tmp1, rh); + tcg_gen_andc_tl(tmp2, bh, ah); + tcg_gen_or_tl(tmp1, tmp1, tmp2); + tcg_gen_shri_tl(rl, tmp1, 63); + + tcg_temp_free(tmp1); + tcg_temp_free(tmp2); + break; + } + + case TCG_COND_GEU: + /* Invert result of TCG_COND_LTU */ + gen_setcond_i128(rl, rh, al, ah, bl, bh, TCG_COND_LTU); + tcg_gen_xori_tl(rl, rl, 1); + break; + + default: + return false; + } + tcg_gen_movi_tl(rh, 0); + return true; +} + static bool gen_branch(DisasContext *ctx, arg_b *a, TCGCond cond) { TCGLabel *l =3D gen_new_label(); TCGv src1 =3D get_gpr(ctx, a->rs1, EXT_SIGN); TCGv src2 =3D get_gpr(ctx, a->rs2, EXT_SIGN); =20 - tcg_gen_brcond_tl(cond, src1, src2, l); + if (is_128bit(ctx)) { + TCGv src1h =3D get_gprh(ctx, a->rs1), + src2h =3D get_gprh(ctx, a->rs2), + tmpl =3D tcg_temp_new(), + tmph =3D tcg_temp_new(); + + /* + * Do not use gen_setcond_i128 for EQ and NE as these conditions a= re + * often met and can be more efficiently implemented. + */ + if (cond =3D=3D TCG_COND_EQ || cond =3D=3D TCG_COND_NE) { + /* + * bnez and beqz being used quite often too, lets optimize the= m, + * although QEMU's tcg optimizer handles these cases nicely + */ + if (a->rs2 =3D=3D 0) { + tcg_gen_or_tl(tmpl, src1, src1h); + tcg_gen_brcondi_tl(cond, tmpl, 0, l); + } else { + tcg_gen_xor_tl(tmpl, src1, src2); + tcg_gen_xor_tl(tmph, src1h, src2h); + tcg_gen_or_tl(tmpl, tmpl, tmph); + tcg_gen_brcondi_tl(cond, tmpl, 0, l); + } + } else { + gen_setcond_i128(tmpl, tmph, src1, src1h, src2, src2h, cond); + tcg_gen_brcondi_tl(TCG_COND_NE, tmpl, 0, l); + } + + tcg_temp_free(tmph); + tcg_temp_free(tmpl); + } else { + tcg_gen_brcond_tl(cond, src1, src2, l); + } gen_goto_tb(ctx, 1, ctx->pc_succ_insn); =20 gen_set_label(l); /* branch taken */ @@ -235,10 +358,18 @@ static bool trans_sd(DisasContext *ctx, arg_sd *a) return gen_store(ctx, a, MO_TEQ); } =20 +static void gen_addi2_i128(TCGv retl, TCGv reth, + TCGv srcl, TCGv srch, target_long imm) +{ + TCGv imml =3D tcg_constant_tl(imm), + immh =3D tcg_constant_tl(-(imm < 0)); + tcg_gen_add2_tl(retl, reth, srcl, srch, imml, immh); +} + static bool trans_addi(DisasContext *ctx, arg_addi *a) { return gen_arith_imm_fn(ctx, a, EXT_NONE, - tcg_gen_addi_tl, tcg_gen_addi_tl, NULL); + tcg_gen_addi_tl, tcg_gen_addi_tl, gen_addi2_i1= 28); } =20 static void gen_slt_tl(TCGv ret, TCGv s1, TCGv s2) @@ -246,21 +377,33 @@ static void gen_slt_tl(TCGv ret, TCGv s1, TCGv s2) tcg_gen_setcond_tl(TCG_COND_LT, ret, s1, s2); } =20 +static void gen_slt_i128(TCGv retl, TCGv reth, + TCGv s1l, TCGv s1h, TCGv s2l, TCGv s2h) +{ + gen_setcond_i128(retl, reth, s1l, s1h, s2l, s2h, TCG_COND_LT); +} + static void gen_sltu_tl(TCGv ret, TCGv s1, TCGv s2) { tcg_gen_setcond_tl(TCG_COND_LTU, ret, s1, s2); } =20 +static void gen_sltu_i128(TCGv retl, TCGv reth, + TCGv s1l, TCGv s1h, TCGv s2l, TCGv s2h) +{ + gen_setcond_i128(retl, reth, s1l, s1h, s2l, s2h, TCG_COND_LTU); +} + static bool trans_slti(DisasContext *ctx, arg_slti *a) { return gen_arith_imm_tl(ctx, a, EXT_SIGN, - gen_slt_lt, gen_slt_lt, NULL); + gen_slt_tl, gen_slt_tl, gen_slt_i128); } =20 static bool trans_sltiu(DisasContext *ctx, arg_sltiu *a) { return gen_arith_imm_tl(ctx, a, EXT_SIGN, - gen_sltu_lt, gen_sltu_lt, NULL); + gen_sltu_tl, gen_sltu_tl, gen_sltu_i128); } =20 static bool trans_xori(DisasContext *ctx, arg_xori *a) @@ -299,13 +442,13 @@ static bool trans_srai(DisasContext *ctx, arg_srai *a) static bool trans_add(DisasContext *ctx, arg_add *a) { return gen_arith(ctx, a, EXT_NONE, - tcg_gen_add_tl, tcg_gen_add_tl, NULL); + tcg_gen_add_tl, tcg_gen_add_tl, tcg_gen_add2_tl); } =20 static bool trans_sub(DisasContext *ctx, arg_sub *a) { return gen_arith(ctx, a, EXT_NONE, - tcg_gen_sub_tl, tcg_gen_sub_tl, NULL); + tcg_gen_sub_tl, tcg_gen_sub_tl, tcg_gen_sub2_tl); } =20 static bool trans_sll(DisasContext *ctx, arg_sll *a) @@ -316,22 +459,26 @@ static bool trans_sll(DisasContext *ctx, arg_sll *a) =20 static bool trans_slt(DisasContext *ctx, arg_slt *a) { - return gen_arith(ctx, a, EXT_SIGN, gen_slt_lt, gen_slt_lt, NULL); + return gen_arith(ctx, a, EXT_SIGN, + gen_slt_tl, gen_slt_tl, gen_slt_i128); } =20 static bool trans_sltu(DisasContext *ctx, arg_sltu *a) { - return gen_arith(ctx, a, EXT_SIGN, gen_sltu_lt, gen_sltu_lt, NULL); + return gen_arith(ctx, a, EXT_SIGN, + gen_sltu_tl, gen_sltu_tl, gen_sltu_i128); } =20 static bool trans_srl(DisasContext *ctx, arg_srl *a) { - return gen_shift(ctx, a, EXT_ZERO, tcg_gen_shr_tl, tcg_gen_shr_tl, NUL= L); + return gen_shift(ctx, a, EXT_ZERO, + tcg_gen_shr_tl, tcg_gen_shr_tl, NULL); } =20 static bool trans_sra(DisasContext *ctx, arg_sra *a) { - return gen_shift(ctx, a, EXT_SIGN, tcg_gen_sar_tl, tcg_gen_sar_tl, NUL= L); + return gen_shift(ctx, a, EXT_SIGN, + tcg_gen_sar_tl, tcg_gen_sar_tl, NULL); } =20 static bool trans_xor(DisasContext *ctx, arg_xor *a) @@ -349,18 +496,26 @@ static bool trans_and(DisasContext *ctx, arg_and *a) return gen_logic(ctx, a, EXT_NONE, tcg_gen_and_tl); } =20 +static void gen_addiw_i128(TCGv retl, TCGv reth, + TCGv srcl, TCGv srch, target_long imm) +{ + tcg_gen_addi_tl(retl, srcl, imm); +} + static bool trans_addiw(DisasContext *ctx, arg_addiw *a) { - REQUIRE_64BIT(ctx); + REQUIRE_64_OR_128BIT(ctx); ctx->w =3D true; - return gen_arith_imm_fn(ctx, a, EXT_NONE, NULL, tcg_gen_addi_tl, NULL); + return gen_arith_imm_fn(ctx, a, EXT_NONE, + NULL, tcg_gen_addi_tl, gen_addiw_i128); } =20 static bool trans_slliw(DisasContext *ctx, arg_slliw *a) { - REQUIRE_64BIT(ctx); + REQUIRE_64_OR_128BIT(ctx); ctx->w =3D true; - return gen_shift_imm_fn(ctx, a, EXT_NONE, NULL, tcg_gen_shli_tl, NULL); + return gen_shift_imm_fn(ctx, a, EXT_NONE, + NULL, tcg_gen_shli_tl, NULL); } =20 static void gen_srliw_tl(TCGv dst, TCGv src, target_long shamt) @@ -370,9 +525,10 @@ static void gen_srliw_tl(TCGv dst, TCGv src, target_lo= ng shamt) =20 static bool trans_srliw(DisasContext *ctx, arg_srliw *a) { - REQUIRE_64BIT(ctx); + REQUIRE_64_OR_128BIT(ctx); ctx->w =3D true; - return gen_shift_imm_fn(ctx, a, EXT_NONE, NULL, gen_srliw_tl, NULL); + return gen_shift_imm_fn(ctx, a, EXT_NONE, + NULL, gen_srliw_tl, NULL); } =20 static void gen_sraiw_tl(TCGv dst, TCGv src, target_long shamt) @@ -382,23 +538,40 @@ static void gen_sraiw_tl(TCGv dst, TCGv src, target_l= ong shamt) =20 static bool trans_sraiw(DisasContext *ctx, arg_sraiw *a) { - REQUIRE_64BIT(ctx); + REQUIRE_64_OR_128BIT(ctx); ctx->w =3D true; - return gen_shift_imm_fn(ctx, a, EXT_NONE, NULL, gen_sraiw_tl, NULL); + return gen_shift_imm_fn(ctx, a, EXT_NONE, + NULL, gen_sraiw_tl, NULL); +} + +static void gen_addw_i128(TCGv retl, TCGv reth, + TCGv src1l, TCGv src1h, + TCGv src2l, TCGv src2h) +{ + tcg_gen_add_tl(retl, src1l, src2l); } =20 static bool trans_addw(DisasContext *ctx, arg_addw *a) { - REQUIRE_64BIT(ctx); + REQUIRE_64_OR_128BIT(ctx); ctx->w =3D true; - return gen_arith(ctx, a, EXT_NONE, NULL, tcg_gen_add_tl, NULL); + return gen_arith(ctx, a, EXT_NONE, + NULL, tcg_gen_add_tl, gen_addw_i128); +} + +static void gen_subw_i128(TCGv retl, TCGv reth, + TCGv src1l, TCGv src1h, + TCGv src2l, TCGv src2h) +{ + tcg_gen_sub_tl(retl, src1l, src2l); } =20 static bool trans_subw(DisasContext *ctx, arg_subw *a) { - REQUIRE_64BIT(ctx); + REQUIRE_64_OR_128BIT(ctx); ctx->w =3D true; - return gen_arith(ctx, a, EXT_NONE, NULL, tcg_gen_sub_tl, NULL); + return gen_arith(ctx, a, EXT_NONE, + NULL, tcg_gen_sub_tl, gen_subw_i128); } =20 static bool trans_sllw(DisasContext *ctx, arg_sllw *a) @@ -406,7 +579,7 @@ static bool trans_sllw(DisasContext *ctx, arg_sllw *a) REQUIRE_64BIT(ctx); ctx->w =3D true; return gen_shift(ctx, a, EXT_NONE, - tcg_gen_shl_tl, tcg_gen_shl_tl, NULL); + NULL, tcg_gen_shl_tl, NULL); } =20 static bool trans_srlw(DisasContext *ctx, arg_srlw *a) --=20 2.33.0 From nobody Thu May 9 06:39:21 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; spf=pass (zohomail.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=univ-grenoble-alpes.fr Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1633557593862533.1914958974453; Wed, 6 Oct 2021 14:59:53 -0700 (PDT) Received: from localhost ([::1]:59224 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1mYEx6-0004nL-QF for importer@patchew.org; Wed, 06 Oct 2021 17:59:52 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:49708) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1mYEUD-0008SF-PL; Wed, 06 Oct 2021 17:30:03 -0400 Received: from zm-mta-out-3.u-ga.fr ([152.77.200.56]:43868) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1mYEU8-000876-Pk; Wed, 06 Oct 2021 17:30:01 -0400 Received: from mailhost.u-ga.fr (mailhost1.u-ga.fr [152.77.1.10]) by zm-mta-out-3.u-ga.fr (Postfix) with ESMTP id 477B341E5F; Wed, 6 Oct 2021 23:29:35 +0200 (CEST) Received: from smtps.univ-grenoble-alpes.fr (smtps2.u-ga.fr [152.77.18.2]) by mailhost.u-ga.fr (Postfix) with ESMTP id 323BB60067; Wed, 6 Oct 2021 23:29:35 +0200 (CEST) Received: from palmier.tima.u-ga.fr (35.201.90.79.rev.sfr.net [79.90.201.35]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) (Authenticated sender: petrotf@univ-grenoble-alpes.fr) by smtps.univ-grenoble-alpes.fr (Postfix) with ESMTPSA id D560614005C; Wed, 6 Oct 2021 23:29:34 +0200 (CEST) From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20P=C3=A9trot?= To: qemu-devel@nongnu.org, qemu-riscv@nongnu.org Subject: [PATCH v2 15/27] target/riscv: 128-bit support for instructions using gen_shift Date: Wed, 6 Oct 2021 23:28:21 +0200 Message-Id: <20211006212833.108706-16-frederic.petrot@univ-grenoble-alpes.fr> X-Mailer: git-send-email 2.33.0 In-Reply-To: <20211006212833.108706-1-frederic.petrot@univ-grenoble-alpes.fr> References: <20211006212833.108706-1-frederic.petrot@univ-grenoble-alpes.fr> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable X-Greylist: Whitelist-UGA SMTP Authentifie (petrotf@univ-grenoble-alpes.fr) via submission-587 ACL (41) X-Greylist: Whitelist-UGA MAILHOST (SMTP non authentifie) depuis 152.77.18.2 Received-SPF: pass (zohomail.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; Received-SPF: pass client-ip=152.77.200.56; envelope-from=frederic.petrot@univ-grenoble-alpes.fr; helo=zm-mta-out-3.u-ga.fr X-Spam_score_int: -18 X-Spam_score: -1.9 X-Spam_bar: - X-Spam_report: (-1.9 / 5.0 requ) BAYES_00=-1.9, RCVD_IN_MSPIKE_H2=-0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action 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: bin.meng@windriver.com, richard.henderson@linaro.org, alistair.francis@wdc.com, fabien.portas@grenoble-inp.org, palmer@dabbelt.com, =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20P=C3=A9trot?= , philmd@redhat.com Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZM-MESSAGEID: 1633557594591100001 Support for the base shift instructions working on 128-bit registers. Signed-off-by: Fr=C3=A9d=C3=A9ric P=C3=A9trot Co-authored-by: Fabien Portas --- target/riscv/insn_trans/trans_rvi.c.inc | 224 ++++++++++++++++++++++-- 1 file changed, 209 insertions(+), 15 deletions(-) diff --git a/target/riscv/insn_trans/trans_rvi.c.inc b/target/riscv/insn_tr= ans/trans_rvi.c.inc index 814aa5f1b7..eca9a76ad5 100644 --- a/target/riscv/insn_trans/trans_rvi.c.inc +++ b/target/riscv/insn_trans/trans_rvi.c.inc @@ -421,22 +421,61 @@ static bool trans_andi(DisasContext *ctx, arg_andi *a) return gen_logic_imm_fn(ctx, a, EXT_NONE, tcg_gen_andi_tl); } =20 +static void gen_slli_i128(TCGv retl, TCGv reth, + TCGv src1l, TCGv src1h, + target_long shamt) +{ + if (shamt >=3D 64) { + tcg_gen_shli_tl(reth, src1l, shamt - 64); + tcg_gen_movi_tl(retl, 0); + } else { + tcg_gen_extract2_tl(reth, src1l, src1h, 64 - shamt); + tcg_gen_shli_tl(retl, src1l, shamt); + } +} + static bool trans_slli(DisasContext *ctx, arg_slli *a) { return gen_shift_imm_fn(ctx, a, EXT_NONE, - tcg_gen_shli_tl, tcg_gen_shli_tl, NULL); + tcg_gen_shli_tl, tcg_gen_shli_tl, gen_slli_i12= 8); +} + +static void gen_srli_i128(TCGv retl, TCGv reth, + TCGv src1l, TCGv src1h, + target_long shamt) +{ + if (shamt >=3D 64) { + tcg_gen_shri_tl(retl, src1h, shamt - 64); + tcg_gen_movi_tl(reth, 0); + } else { + tcg_gen_extract2_tl(retl, src1l, src1h, shamt); + tcg_gen_shri_tl(reth, src1h, shamt); + } } =20 static bool trans_srli(DisasContext *ctx, arg_srli *a) { return gen_shift_imm_fn(ctx, a, EXT_ZERO, - tcg_gen_shri_tl, tcg_gen_shri_tl, NULL); + tcg_gen_shri_tl, tcg_gen_shri_tl, gen_srli_i12= 8); +} + +static void gen_srai_i128(TCGv retl, TCGv reth, + TCGv src1l, TCGv src1h, + target_long shamt) +{ + if (shamt >=3D 64) { + tcg_gen_sari_tl(retl, src1h, shamt - 64); + tcg_gen_sari_tl(reth, src1h, 63); + } else { + tcg_gen_extract2_tl(retl, src1l, src1h, shamt); + tcg_gen_sari_tl(reth, src1h, shamt); + } } =20 static bool trans_srai(DisasContext *ctx, arg_srai *a) { return gen_shift_imm_fn(ctx, a, EXT_SIGN, - tcg_gen_sari_tl, tcg_gen_sari_tl, NULL); + tcg_gen_sari_tl, tcg_gen_sari_tl, gen_srai_i12= 8); } =20 static bool trans_add(DisasContext *ctx, arg_add *a) @@ -451,10 +490,76 @@ static bool trans_sub(DisasContext *ctx, arg_sub *a) tcg_gen_sub_tl, tcg_gen_sub_tl, tcg_gen_sub2_tl); } =20 +enum M128_DIR { + M128_LEFT, + M128_RIGHT, + M128_RIGHT_ARITH +}; +/* 127 <=3D arg2 <=3D 0 */ +static void gen_shift_mod128(TCGv ret, TCGv arg1, TCGv arg2, enum M128_DIR= dir) +{ + TCGv tmp1 =3D tcg_temp_new(), + tmp2 =3D tcg_temp_new(), + sgn =3D tcg_temp_new(), + cnst_zero =3D tcg_constant_tl(0); + + tcg_gen_setcondi_tl(TCG_COND_GEU, tmp1, arg2, 64); + + tcg_gen_andi_tl(tmp2, arg2, 0x3f); + switch (dir) { + case M128_LEFT: + tcg_gen_shl_tl(tmp2, arg1, tmp2); + break; + case M128_RIGHT: + tcg_gen_shr_tl(tmp2, arg1, tmp2); + break; + case M128_RIGHT_ARITH: + tcg_gen_sar_tl(tmp2, arg1, tmp2); + break; + } + + if (dir =3D=3D M128_RIGHT_ARITH) { + tcg_gen_sari_tl(sgn, arg1, 63); + tcg_gen_movcond_tl(TCG_COND_NE, ret, tmp1, cnst_zero, sgn, tmp2); + } else { + tcg_gen_movcond_tl(TCG_COND_NE, ret, tmp1, cnst_zero, cnst_zero, t= mp2); + } + + tcg_temp_free(tmp1); + tcg_temp_free(tmp2); + tcg_temp_free(sgn); + return; +} + +static void gen_sll_i128(TCGv destl, TCGv desth, + TCGv src1l, TCGv src1h, TCGv shamt) +{ + TCGv tmp =3D tcg_temp_new(); + /* + * From Hacker's Delight 2.17: + * y1 =3D x1 << n | x0 u>> (64 - n) | x0 << (n - 64) + */ + gen_shift_mod128(desth, src1h, shamt, M128_LEFT); + + tcg_gen_movi_tl(tmp, 64); + tcg_gen_sub_tl(tmp, tmp, shamt); + gen_shift_mod128(tmp, src1l, tmp, M128_RIGHT); + tcg_gen_or_tl(desth, desth, tmp); + + tcg_gen_subi_tl(tmp, shamt, 64); + gen_shift_mod128(tmp, src1l, tmp, M128_LEFT); + tcg_gen_or_tl(desth, desth, tmp); + + /* From Hacker's Delight 2.17: y0 =3D x0 << n */ + gen_shift_mod128(destl, src1l, shamt, M128_LEFT); + + tcg_temp_free(tmp); +} + static bool trans_sll(DisasContext *ctx, arg_sll *a) { return gen_shift(ctx, a, EXT_NONE, - tcg_gen_shl_tl, tcg_gen_shl_tl, NULL); + tcg_gen_shl_tl, tcg_gen_shl_tl, gen_sll_i128); } =20 static bool trans_slt(DisasContext *ctx, arg_slt *a) @@ -469,16 +574,69 @@ static bool trans_sltu(DisasContext *ctx, arg_sltu *a) gen_sltu_tl, gen_sltu_tl, gen_sltu_i128); } =20 +static void gen_srl_i128(TCGv destl, TCGv desth, + TCGv src1l, TCGv src1h, TCGv shamt) +{ + TCGv tmp =3D tcg_temp_new(); + /* + * From Hacker's Delight 2.17: + * y0 =3D x0 u>> n | x1 << (64 - n) | x1 u>> (n - 64) + */ + gen_shift_mod128(destl, src1l, shamt, M128_RIGHT); + + tcg_gen_movi_tl(tmp, 64); + tcg_gen_sub_tl(tmp, tmp, shamt); + gen_shift_mod128(tmp, src1h, tmp, M128_LEFT); + tcg_gen_or_tl(destl, destl, tmp); + + tcg_gen_subi_tl(tmp, shamt, 64); + gen_shift_mod128(tmp, src1h, tmp, M128_RIGHT); + tcg_gen_or_tl(destl, destl, tmp); + + /* From Hacker's Delight 2.17 : y1 =3D x1 u>> n */ + gen_shift_mod128(desth, src1h, shamt, M128_RIGHT); + + tcg_temp_free(tmp); +} + static bool trans_srl(DisasContext *ctx, arg_srl *a) { return gen_shift(ctx, a, EXT_ZERO, - tcg_gen_shr_tl, tcg_gen_shr_tl, NULL); + tcg_gen_shr_tl, tcg_gen_shr_tl, gen_srl_i128); +} + +static void gen_sra_i128(TCGv destl, TCGv desth, + TCGv src1l, TCGv src1h, TCGv shamt) +{ + TCGv tmp1 =3D tcg_temp_new(), + tmp2 =3D tcg_temp_new(), + const64 =3D tcg_constant_tl(64); + + /* Compute y0 value if n < 64: x0 u>> n | x1 << (64 - n) */ + gen_shift_mod128(tmp1, src1l, shamt, M128_RIGHT); + tcg_gen_movi_tl(tmp2, 64); + tcg_gen_sub_tl(tmp2, tmp2, shamt); + gen_shift_mod128(tmp2, src1h, tmp2, M128_LEFT); + tcg_gen_or_tl(tmp1, tmp1, tmp2); + + /* Compute y0 value if n >=3D 64: x1 s>> (n - 64) */ + tcg_gen_subi_tl(tmp2, shamt, 64); + gen_shift_mod128(tmp2, src1h, tmp2, M128_RIGHT_ARITH); + + /* Conditionally move one value or the other */ + tcg_gen_movcond_tl(TCG_COND_LT, destl, shamt, const64, tmp1, tmp2); + + /* y1 =3D x1 s>> n */ + gen_shift_mod128(desth, src1h, shamt, M128_RIGHT_ARITH); + + tcg_temp_free(tmp1); + tcg_temp_free(tmp2); } =20 static bool trans_sra(DisasContext *ctx, arg_sra *a) { return gen_shift(ctx, a, EXT_SIGN, - tcg_gen_sar_tl, tcg_gen_sar_tl, NULL); + tcg_gen_sar_tl, tcg_gen_sar_tl, gen_sra_i128); } =20 static bool trans_xor(DisasContext *ctx, arg_xor *a) @@ -510,12 +668,18 @@ static bool trans_addiw(DisasContext *ctx, arg_addiw = *a) NULL, tcg_gen_addi_tl, gen_addiw_i128); } =20 +static void gen_slliwd_i128(TCGv retl, TCGv reth, + TCGv srcl, TCGv srch, target_long shamt) +{ + tcg_gen_shli_tl(retl, srcl, shamt); +} + static bool trans_slliw(DisasContext *ctx, arg_slliw *a) { REQUIRE_64_OR_128BIT(ctx); ctx->w =3D true; return gen_shift_imm_fn(ctx, a, EXT_NONE, - NULL, tcg_gen_shli_tl, NULL); + NULL, tcg_gen_shli_tl, gen_slliwd_i128); } =20 static void gen_srliw_tl(TCGv dst, TCGv src, target_long shamt) @@ -523,12 +687,18 @@ static void gen_srliw_tl(TCGv dst, TCGv src, target_l= ong shamt) tcg_gen_extract_tl(dst, src, shamt, 32 - shamt); } =20 +static void gen_srliw_i128(TCGv retl, TCGv reth, + TCGv srcl, TCGv srch, target_long shamt) +{ + gen_srliw_tl(retl, srcl, shamt); +} + static bool trans_srliw(DisasContext *ctx, arg_srliw *a) { REQUIRE_64_OR_128BIT(ctx); ctx->w =3D true; return gen_shift_imm_fn(ctx, a, EXT_NONE, - NULL, gen_srliw_tl, NULL); + NULL, gen_srliw_tl, gen_srliw_i128); } =20 static void gen_sraiw_tl(TCGv dst, TCGv src, target_long shamt) @@ -536,12 +706,18 @@ static void gen_sraiw_tl(TCGv dst, TCGv src, target_l= ong shamt) tcg_gen_sextract_tl(dst, src, shamt, 32 - shamt); } =20 +static void gen_sraiw_i128(TCGv retl, TCGv reth, + TCGv srcl, TCGv srch, target_long shamt) +{ + gen_sraiw_tl(retl, srcl, shamt); +} + static bool trans_sraiw(DisasContext *ctx, arg_sraiw *a) { REQUIRE_64_OR_128BIT(ctx); ctx->w =3D true; return gen_shift_imm_fn(ctx, a, EXT_NONE, - NULL, gen_sraiw_tl, NULL); + NULL, gen_sraiw_tl, gen_sraiw_i128); } =20 static void gen_addw_i128(TCGv retl, TCGv reth, @@ -574,28 +750,46 @@ static bool trans_subw(DisasContext *ctx, arg_subw *a) NULL, tcg_gen_sub_tl, gen_subw_i128); } =20 +static void gen_sllwd_i128(TCGv destl, TCGv desth, + TCGv src1l, TCGv src1h, TCGv shamt) +{ + tcg_gen_shl_tl(destl, src1l, shamt); +} + static bool trans_sllw(DisasContext *ctx, arg_sllw *a) { - REQUIRE_64BIT(ctx); + REQUIRE_64_OR_128BIT(ctx); ctx->w =3D true; return gen_shift(ctx, a, EXT_NONE, - NULL, tcg_gen_shl_tl, NULL); + NULL, tcg_gen_shl_tl, gen_sllwd_i128); +} + +static void gen_srlwd_i128(TCGv destl, TCGv desth, + TCGv src1l, TCGv src1h, TCGv shamt) +{ + tcg_gen_shr_tl(destl, src1l, shamt); } =20 static bool trans_srlw(DisasContext *ctx, arg_srlw *a) { - REQUIRE_64BIT(ctx); + REQUIRE_64_OR_128BIT(ctx); ctx->w =3D true; return gen_shift(ctx, a, EXT_ZERO, - NULL, tcg_gen_shr_tl, NULL); + NULL, tcg_gen_shr_tl, gen_srlwd_i128); +} + +static void gen_srawd_i128(TCGv destl, TCGv desth, + TCGv src1l, TCGv src1h, TCGv shamt) +{ + tcg_gen_sar_tl(destl, src1l, shamt); } =20 static bool trans_sraw(DisasContext *ctx, arg_sraw *a) { - REQUIRE_64BIT(ctx); + REQUIRE_64_OR_128BIT(ctx); ctx->w =3D true; return gen_shift(ctx, a, EXT_SIGN, - NULL, tcg_gen_sar_tl, NULL); + NULL, tcg_gen_sar_tl, gen_srawd_i128); } =20 static bool trans_fence(DisasContext *ctx, arg_fence *a) --=20 2.33.0 From nobody Thu May 9 06:39:21 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; spf=pass (zohomail.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=univ-grenoble-alpes.fr Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1633556953511631.3054063422047; Wed, 6 Oct 2021 14:49:13 -0700 (PDT) Received: from localhost ([::1]:33800 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1mYEmm-0004V1-84 for importer@patchew.org; Wed, 06 Oct 2021 17:49:12 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:49712) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1mYEUD-0008SH-UK; Wed, 06 Oct 2021 17:30:03 -0400 Received: from zm-mta-out-3.u-ga.fr ([152.77.200.56]:43886) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1mYEUB-00088a-2S; Wed, 06 Oct 2021 17:30:01 -0400 Received: from mailhost.u-ga.fr (mailhost1.u-ga.fr [152.77.1.10]) by zm-mta-out-3.u-ga.fr (Postfix) with ESMTP id 5BE4241E7A; Wed, 6 Oct 2021 23:29:36 +0200 (CEST) Received: from smtps.univ-grenoble-alpes.fr (smtps2.u-ga.fr [152.77.18.2]) by mailhost.u-ga.fr (Postfix) with ESMTP id 4420660067; Wed, 6 Oct 2021 23:29:36 +0200 (CEST) Received: from palmier.tima.u-ga.fr (35.201.90.79.rev.sfr.net [79.90.201.35]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) (Authenticated sender: petrotf@univ-grenoble-alpes.fr) by smtps.univ-grenoble-alpes.fr (Postfix) with ESMTPSA id F223014005C; Wed, 6 Oct 2021 23:29:35 +0200 (CEST) From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20P=C3=A9trot?= To: qemu-devel@nongnu.org, qemu-riscv@nongnu.org Subject: [PATCH v2 16/27] target/riscv: support for 128-bit loads and store Date: Wed, 6 Oct 2021 23:28:22 +0200 Message-Id: <20211006212833.108706-17-frederic.petrot@univ-grenoble-alpes.fr> X-Mailer: git-send-email 2.33.0 In-Reply-To: <20211006212833.108706-1-frederic.petrot@univ-grenoble-alpes.fr> References: <20211006212833.108706-1-frederic.petrot@univ-grenoble-alpes.fr> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable X-Greylist: Whitelist-UGA SMTP Authentifie (petrotf@univ-grenoble-alpes.fr) via submission-587 ACL (41) X-Greylist: Whitelist-UGA MAILHOST (SMTP non authentifie) depuis 152.77.18.2 Received-SPF: pass (zohomail.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; Received-SPF: pass client-ip=152.77.200.56; envelope-from=frederic.petrot@univ-grenoble-alpes.fr; helo=zm-mta-out-3.u-ga.fr X-Spam_score_int: 0 X-Spam_score: -0.0 X-Spam_bar: / X-Spam_report: (-0.0 / 5.0 requ) RCVD_IN_MSPIKE_H2=-0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action 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: bin.meng@windriver.com, richard.henderson@linaro.org, alistair.francis@wdc.com, fabien.portas@grenoble-inp.org, palmer@dabbelt.com, =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20P=C3=A9trot?= , philmd@redhat.com Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZM-MESSAGEID: 1633556955761100003 The 128-bit ISA adds ldu, lq and sq. We provide here support for these instructions. Note that although we compute a 128-bit address, we only use the lower 64-bit to actually address memory, cowardly utilizing the existing address translation mechanism of QEMU. Signed-off-by: Fr=C3=A9d=C3=A9ric P=C3=A9trot Co-authored-by: Fabien Portas --- target/riscv/insn16.decode | 32 +++++- target/riscv/insn32.decode | 4 + target/riscv/insn_trans/trans_rvi.c.inc | 132 ++++++++++++++++++++++-- 3 files changed, 157 insertions(+), 11 deletions(-) diff --git a/target/riscv/insn16.decode b/target/riscv/insn16.decode index 2e9212663c..151fc6e567 100644 --- a/target/riscv/insn16.decode +++ b/target/riscv/insn16.decode @@ -39,6 +39,10 @@ %imm_addi16sp 12:s1 3:2 5:1 2:1 6:1 !function=3Dex_shift_4 %imm_lui 12:s1 2:5 !function=3Dex_shift_12 =20 +# Added for 128 bit support +%uimm_cl_q 5:2 10:3 !function=3Dex_shift_3 +%uimm_6bit_lq 2:3 12:1 5:2 !function=3Dex_shift_3 +%uimm_6bit_sq 7:3 10:3 !function=3Dex_shift_3 =20 # Argument sets imported from insn32.decode: &empty !extern @@ -54,16 +58,20 @@ # Formats 16: @cr .... ..... ..... .. &r rs2=3D%rs2_5 rs1=3D%rd = %rd @ci ... . ..... ..... .. &i imm=3D%imm_ci rs1=3D%rd = %rd +@cl_q ... . ..... ..... .. &i imm=3D%uimm_6bit_lq rs1=3D2 %rd @cl_d ... ... ... .. ... .. &i imm=3D%uimm_cl_d rs1=3D%rs1_3 = rd=3D%rs2_3 @cl_w ... ... ... .. ... .. &i imm=3D%uimm_cl_w rs1=3D%rs1_3 = rd=3D%rs2_3 @cs_2 ... ... ... .. ... .. &r rs2=3D%rs2_3 rs1=3D%rs1_3 = rd=3D%rs1_3 +@cs_q ... ... ... .. ... .. &s imm=3D%uimm_cl_q rs1=3D%rs1_3 = rs2=3D%rs2_3 @cs_d ... ... ... .. ... .. &s imm=3D%uimm_cl_d rs1=3D%rs1_3 = rs2=3D%rs2_3 @cs_w ... ... ... .. ... .. &s imm=3D%uimm_cl_w rs1=3D%rs1_3 = rs2=3D%rs2_3 @cj ... ........... .. &j imm=3D%imm_cj @cb_z ... ... ... .. ... .. &b imm=3D%imm_cb rs1=3D%rs1_3 = rs2=3D0 =20 +@c_lqsp ... . ..... ..... .. &i imm=3D%uimm_6bit_lq rs1=3D2 %rd @c_ldsp ... . ..... ..... .. &i imm=3D%uimm_6bit_ld rs1=3D2 %rd @c_lwsp ... . ..... ..... .. &i imm=3D%uimm_6bit_lw rs1=3D2 %rd +@c_sqsp ... . ..... ..... .. &s imm=3D%uimm_6bit_sq rs1=3D2 rs2= =3D%rs2_5 @c_sdsp ... . ..... ..... .. &s imm=3D%uimm_6bit_sd rs1=3D2 rs2= =3D%rs2_5 @c_swsp ... . ..... ..... .. &s imm=3D%uimm_6bit_sw rs1=3D2 rs2= =3D%rs2_5 @c_li ... . ..... ..... .. &i imm=3D%imm_ci rs1=3D0 %rd @@ -87,9 +95,17 @@ illegal 000 000 000 00 --- 00 addi 000 ... ... .. ... 00 @c_addi4spn } -fld 001 ... ... .. ... 00 @cl_d +{ + fld 001 ... ... .. ... 00 @cl_d + # *** RV128C specific Standard Extension (Quadrant 0) *** + lq 001 ... ... .. ... 00 @cl_q +} lw 010 ... ... .. ... 00 @cl_w -fsd 101 ... ... .. ... 00 @cs_d +{ + fsd 101 ... ... .. ... 00 @cs_d + # *** RV128C specific Standard Extension (Quadrant 0) *** + sq 101 ... ... .. ... 00 @cs_q +} sw 110 ... ... .. ... 00 @cs_w =20 # *** RV32C and RV64C specific Standard Extension (Quadrant 0) *** @@ -132,7 +148,11 @@ addw 100 1 11 ... 01 ... 01 @cs_2 =20 # *** RV32/64C Standard Extension (Quadrant 2) *** slli 000 . ..... ..... 10 @c_shift2 -fld 001 . ..... ..... 10 @c_ldsp +{ + fld 001 . ..... ..... 10 @c_ldsp + # *** RV128C specific Standard Extension (Quadrant 2) *** + lq 001 ... ... .. ... 10 @c_lqsp +} { illegal 010 - 00000 ----- 10 # c.lwsp, RES rd=3D0 lw 010 . ..... ..... 10 @c_lwsp @@ -147,7 +167,11 @@ fld 001 . ..... ..... 10 @c_ldsp jalr 100 1 ..... 00000 10 @c_jalr rd=3D1 # C.JALR add 100 1 ..... ..... 10 @cr } -fsd 101 ...... ..... 10 @c_sdsp +{ + fsd 101 ...... ..... 10 @c_sdsp + # *** RV128C specific Standard Extension (Quadrant 2) *** + sq 101 ... ... .. ... 10 @c_sqsp +} sw 110 . ..... ..... 10 @c_swsp =20 # *** RV32C and RV64C specific Standard Extension (Quadrant 2) *** diff --git a/target/riscv/insn32.decode b/target/riscv/insn32.decode index 2cd921d51c..79611cb65d 100644 --- a/target/riscv/insn32.decode +++ b/target/riscv/insn32.decode @@ -163,6 +163,10 @@ sllw 0000000 ..... ..... 001 ..... 0111011 @r srlw 0000000 ..... ..... 101 ..... 0111011 @r sraw 0100000 ..... ..... 101 ..... 0111011 @r =20 +# *** RV128I Base Instruction Set (in addition to RV64I) *** +ldu ............ ..... 111 ..... 0000011 @i +lq ............ ..... 010 ..... 0001111 @i +sq ............ ..... 100 ..... 0100011 @s # *** RV32M Standard Extension *** mul 0000001 ..... ..... 000 ..... 0110011 @r mulh 0000001 ..... ..... 001 ..... 0110011 @r diff --git a/target/riscv/insn_trans/trans_rvi.c.inc b/target/riscv/insn_tr= ans/trans_rvi.c.inc index eca9a76ad5..1373fe94b9 100644 --- a/target/riscv/insn_trans/trans_rvi.c.inc +++ b/target/riscv/insn_trans/trans_rvi.c.inc @@ -275,9 +275,63 @@ static bool gen_load_tl(DisasContext *ctx, arg_lb *a, = MemOp memop) return true; } =20 +/* + * TODO: we should assert that src1h =3D=3D 0, as we do not change the + * address translation mechanism + */ +static bool gen_load_i128(DisasContext *ctx, arg_lb *a, MemOp memop) +{ + TCGv src1l =3D get_gpr(ctx, a->rs1, EXT_NONE); + TCGv src1h =3D get_gprh(ctx, a->rs1); + TCGv destl =3D dest_gpr(ctx, a->rd); + TCGv desth =3D dest_gprh(ctx, a->rd); + TCGv addrl =3D tcg_temp_new(); + TCGv addrh =3D tcg_temp_new(); + TCGv imml =3D tcg_temp_new(); + TCGv immh =3D tcg_constant_tl(-(a->imm < 0)); + + /* Build a 128-bit address */ + if (a->imm !=3D 0) { + tcg_gen_movi_tl(imml, a->imm); + tcg_gen_add2_tl(addrl, addrh, src1l, src1h, imml, immh); + } else { + tcg_gen_mov_tl(addrl, src1l); + tcg_gen_mov_tl(addrh, src1h); + } + + if (memop !=3D (MemOp)MO_TEO) { + tcg_gen_qemu_ld_tl(destl, addrl, ctx->mem_idx, memop); + if (memop & MO_SIGN) { + tcg_gen_sari_tl(desth, destl, 63); + } else { + tcg_gen_movi_tl(desth, 0); + } + } else { + tcg_gen_qemu_ld_tl(memop & MO_BSWAP ? desth : destl, addrl, + ctx->mem_idx, MO_TEQ); + tcg_gen_movi_tl(imml, 8); + tcg_gen_movi_tl(immh, 0); + tcg_gen_add2_tl(addrl, addrh, addrl, addrh, imml, immh); + tcg_gen_qemu_ld_tl(memop & MO_BSWAP ? destl : desth, addrl, + ctx->mem_idx, MO_TEQ); + } + + gen_set_gpr(ctx, a->rd, destl); + gen_set_gprh(ctx, a->rd, desth); + + tcg_temp_free(addrl); + tcg_temp_free(addrh); + tcg_temp_free(imml); + return true; +} + static bool gen_load(DisasContext *ctx, arg_lb *a, MemOp memop) { - return gen_load_tl(ctx, a, memop); + if (is_128bit(ctx)) { + return gen_load_i128(ctx, a, memop); + } else { + return gen_load_tl(ctx, a, memop); + } } =20 static bool trans_lb(DisasContext *ctx, arg_lb *a) @@ -295,6 +349,18 @@ static bool trans_lw(DisasContext *ctx, arg_lw *a) return gen_load(ctx, a, MO_TESL); } =20 +static bool trans_ld(DisasContext *ctx, arg_ld *a) +{ + REQUIRE_64_OR_128BIT(ctx); + return gen_load(ctx, a, MO_TESQ); +} + +static bool trans_lq(DisasContext *ctx, arg_lq *a) +{ + REQUIRE_128BIT(ctx); + return gen_load(ctx, a, MO_TEO); +} + static bool trans_lbu(DisasContext *ctx, arg_lbu *a) { return gen_load(ctx, a, MO_UB); @@ -307,14 +373,14 @@ static bool trans_lhu(DisasContext *ctx, arg_lhu *a) =20 static bool trans_lwu(DisasContext *ctx, arg_lwu *a) { - REQUIRE_64BIT(ctx); + REQUIRE_64_OR_128BIT(ctx); return gen_load(ctx, a, MO_TEUL); } =20 -static bool trans_ld(DisasContext *ctx, arg_ld *a) +static bool trans_ldu(DisasContext *ctx, arg_ldu *a) { - REQUIRE_64BIT(ctx); - return gen_load(ctx, a, MO_TEQ); + REQUIRE_128BIT(ctx); + return gen_load(ctx, a, MO_TEUQ); } =20 static bool gen_store_tl(DisasContext *ctx, arg_sb *a, MemOp memop) @@ -332,9 +398,55 @@ static bool gen_store_tl(DisasContext *ctx, arg_sb *a,= MemOp memop) return true; } =20 +/* + * TODO: we should assert that src1h =3D=3D 0, as we do not change the + * address translation mechanism + */ +static bool gen_store_i128(DisasContext *ctx, arg_sb *a, MemOp memop) +{ + TCGv src1l =3D get_gpr(ctx, a->rs1, EXT_NONE); + TCGv src1h =3D get_gprh(ctx, a->rs1); + TCGv src2l =3D get_gpr(ctx, a->rs2, EXT_NONE); + TCGv src2h =3D get_gprh(ctx, a->rs2); + TCGv addrl =3D tcg_temp_new(); + TCGv addrh =3D tcg_temp_new(); + TCGv imml =3D tcg_temp_new(); + TCGv immh =3D tcg_constant_tl(-(a->imm < 0)); + + /* Build a 128-bit address */ + if (a->imm !=3D 0) { + tcg_gen_movi_tl(imml, a->imm); + tcg_gen_add2_tl(addrl, addrh, src1l, src1h, imml, immh); + } else { + tcg_gen_mov_tl(addrl, src1l); + tcg_gen_mov_tl(addrh, src1h); + } + + if (memop !=3D (MemOp)MO_TEO) { + tcg_gen_qemu_st_tl(src2l, addrl, ctx->mem_idx, memop); + } else { + tcg_gen_qemu_st_tl(memop & MO_BSWAP ? src2h : src2l, addrl, + ctx->mem_idx, MO_TEQ); + tcg_gen_movi_tl(imml, 8); + tcg_gen_movi_tl(immh, 0); + tcg_gen_add2_tl(addrl, addrh, addrl, addrh, imml, immh); + tcg_gen_qemu_st_tl(memop & MO_BSWAP ? src2l : src2h, addrl, + ctx->mem_idx, MO_TEQ); + } + + tcg_temp_free(addrl); + tcg_temp_free(addrh); + tcg_temp_free(imml); + return true; +} + static bool gen_store(DisasContext *ctx, arg_sb *a, MemOp memop) { - return gen_store_tl(ctx, a, memop); + if (is_128bit(ctx)) { + return gen_store_i128(ctx, a, memop); + } else { + return gen_store_tl(ctx, a, memop); + } } =20 static bool trans_sb(DisasContext *ctx, arg_sb *a) @@ -354,10 +466,16 @@ static bool trans_sw(DisasContext *ctx, arg_sw *a) =20 static bool trans_sd(DisasContext *ctx, arg_sd *a) { - REQUIRE_64BIT(ctx); + REQUIRE_64_OR_128BIT(ctx); return gen_store(ctx, a, MO_TEQ); } =20 +static bool trans_sq(DisasContext *ctx, arg_sq *a) +{ + REQUIRE_128BIT(ctx); + return gen_store(ctx, a, MO_TEO); +} + static void gen_addi2_i128(TCGv retl, TCGv reth, TCGv srcl, TCGv srch, target_long imm) { --=20 2.33.0 From nobody Thu May 9 06:39:21 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; spf=pass (zohomail.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=univ-grenoble-alpes.fr Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1633557194583304.80188252004507; Wed, 6 Oct 2021 14:53:14 -0700 (PDT) Received: from localhost ([::1]:42806 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1mYEqe-0002DK-LX for importer@patchew.org; Wed, 06 Oct 2021 17:53:12 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:49742) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1mYEUH-0008Th-IN; Wed, 06 Oct 2021 17:30:07 -0400 Received: from zm-mta-out-3.u-ga.fr ([152.77.200.56]:43906) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1mYEUB-00089W-Mc; Wed, 06 Oct 2021 17:30:04 -0400 Received: from mailhost.u-ga.fr (mailhost2.u-ga.fr [129.88.177.242]) by zm-mta-out-3.u-ga.fr (Postfix) with ESMTP id 6F39041E88; Wed, 6 Oct 2021 23:29:37 +0200 (CEST) Received: from smtps.univ-grenoble-alpes.fr (smtps2.u-ga.fr [152.77.18.2]) by mailhost.u-ga.fr (Postfix) with ESMTP id 5807660066; Wed, 6 Oct 2021 23:29:37 +0200 (CEST) Received: from palmier.tima.u-ga.fr (35.201.90.79.rev.sfr.net [79.90.201.35]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) (Authenticated sender: petrotf@univ-grenoble-alpes.fr) by smtps.univ-grenoble-alpes.fr (Postfix) with ESMTPSA id 1FE9914005C; Wed, 6 Oct 2021 23:29:37 +0200 (CEST) From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20P=C3=A9trot?= To: qemu-devel@nongnu.org, qemu-riscv@nongnu.org Subject: [PATCH v2 17/27] target/riscv: 128-bit double word integer arithmetic instructions Date: Wed, 6 Oct 2021 23:28:23 +0200 Message-Id: <20211006212833.108706-18-frederic.petrot@univ-grenoble-alpes.fr> X-Mailer: git-send-email 2.33.0 In-Reply-To: <20211006212833.108706-1-frederic.petrot@univ-grenoble-alpes.fr> References: <20211006212833.108706-1-frederic.petrot@univ-grenoble-alpes.fr> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable X-Greylist: Whitelist-UGA SMTP Authentifie (petrotf@univ-grenoble-alpes.fr) via submission-587 ACL (41) X-Greylist: Whitelist-UGA MAILHOST (SMTP non authentifie) depuis 152.77.18.2 Received-SPF: pass (zohomail.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; Received-SPF: pass client-ip=152.77.200.56; envelope-from=frederic.petrot@univ-grenoble-alpes.fr; helo=zm-mta-out-3.u-ga.fr X-Spam_score_int: -18 X-Spam_score: -1.9 X-Spam_bar: - X-Spam_report: (-1.9 / 5.0 requ) BAYES_00=-1.9, RCVD_IN_MSPIKE_H2=-0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action 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: bin.meng@windriver.com, richard.henderson@linaro.org, alistair.francis@wdc.com, fabien.portas@grenoble-inp.org, palmer@dabbelt.com, =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20P=C3=A9trot?= , philmd@redhat.com Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZM-MESSAGEID: 1633557196803100001 The ISA adds the addid, addd and subd instructions that work on 64-bit while in 128-bit mode. Similarly to what is done for insns working on 32-bit (w suffix), we set a 'd' flag so that masking and sign extension occurs as it should when using the registers' accessors. Signed-off-by: Fr=C3=A9d=C3=A9ric P=C3=A9trot Co-authored-by: Fabien Portas --- target/riscv/insn32.decode | 4 ++ target/riscv/translate.c | 12 ++++-- target/riscv/insn_trans/trans_rvi.c.inc | 50 +++++++++++++++++++++++++ 3 files changed, 63 insertions(+), 3 deletions(-) diff --git a/target/riscv/insn32.decode b/target/riscv/insn32.decode index 79611cb65d..eea540cea9 100644 --- a/target/riscv/insn32.decode +++ b/target/riscv/insn32.decode @@ -167,6 +167,10 @@ sraw 0100000 ..... ..... 101 ..... 0111011 @r ldu ............ ..... 111 ..... 0000011 @i lq ............ ..... 010 ..... 0001111 @i sq ............ ..... 100 ..... 0100011 @s +addid ............ ..... 000 ..... 1011011 @i +addd 0000000 ..... ..... 000 ..... 1111011 @r +subd 0100000 ..... ..... 000 ..... 1111011 @r + # *** RV32M Standard Extension *** mul 0000001 ..... ..... 000 ..... 0110011 @r mulh 0000001 ..... ..... 001 ..... 0110011 @r diff --git a/target/riscv/translate.c b/target/riscv/translate.c index b3f70bcde0..120841de48 100644 --- a/target/riscv/translate.c +++ b/target/riscv/translate.c @@ -68,6 +68,7 @@ typedef struct DisasContext { to reset this known value. */ int frm; bool w; + bool d; bool virt_enabled; bool ext_ifencei; bool hlsx; @@ -264,7 +265,7 @@ static inline TCGv cpu_gprh_check(DisasContext *ctx, in= t reg_num) =20 static TCGv get_gprh(DisasContext *ctx, int reg_num) { - if (reg_num =3D=3D 0 || ctx->w) { + if (reg_num =3D=3D 0 || ctx->w || ctx->d) { return ctx->zero; } return cpu_gprh_check(ctx, reg_num); @@ -300,7 +301,7 @@ static void gen_set_gpr(DisasContext *ctx, int reg_num,= TCGv t) static void gen_set_gprh(DisasContext *ctx, int reg_num, TCGv t) { if (reg_num !=3D 0) { - if (ctx->w) { + if (ctx->w || ctx->d) { tcg_gen_sari_tl(cpu_gprh_check(ctx, reg_num), cpu_gpr[reg_num]= , 63); } else { tcg_gen_mov_tl(cpu_gprh_check(ctx, reg_num), t); @@ -699,7 +700,10 @@ static bool gen_shift(DisasContext *ctx, arg_r *a, Dis= asExtend ext, desth =3D tcg_temp_new(), shamt =3D tcg_temp_new(); =20 - tcg_gen_andi_tl(shamt, src2l, !ctx->w << 5 | 0x1f); + tcg_gen_andi_tl(shamt, src2l, + (!(ctx->d ^ ctx->w) << 6) + | ((ctx->d | !ctx->w) << 5) + | 0x1f); fn128(destl, desth, src1l, src1h, shamt); =20 gen_set_gpr(ctx, a->rd, destl); @@ -804,6 +808,7 @@ static void riscv_tr_init_disas_context(DisasContextBas= e *dcbase, CPUState *cs) ctx->vl_eq_vlmax =3D FIELD_EX32(tb_flags, TB_FLAGS, VL_EQ_VLMAX); ctx->cs =3D cs; ctx->w =3D false; + ctx->d =3D false; ctx->ntemp =3D 0; memset(ctx->temp, 0, sizeof(ctx->temp)); =20 @@ -830,6 +835,7 @@ static void riscv_tr_translate_insn(DisasContextBase *d= cbase, CPUState *cpu) decode_opc(env, ctx, opcode16); ctx->base.pc_next =3D ctx->pc_succ_insn; ctx->w =3D false; + ctx->d =3D false; =20 for (int i =3D ctx->ntemp - 1; i >=3D 0; --i) { tcg_temp_free(ctx->temp[i]); diff --git a/target/riscv/insn_trans/trans_rvi.c.inc b/target/riscv/insn_tr= ans/trans_rvi.c.inc index 1373fe94b9..05e13bbc1d 100644 --- a/target/riscv/insn_trans/trans_rvi.c.inc +++ b/target/riscv/insn_trans/trans_rvi.c.inc @@ -476,6 +476,56 @@ static bool trans_sq(DisasContext *ctx, arg_sq *a) return gen_store(ctx, a, MO_TEO); } =20 +static bool trans_addd(DisasContext *ctx, arg_addd *a) +{ + REQUIRE_128BIT(ctx); + TCGv src1 =3D get_gpr(ctx, a->rs1, EXT_NONE), + src2 =3D get_gpr(ctx, a->rs2, EXT_NONE), + destl =3D dest_gpr(ctx, a->rd), + desth =3D dest_gprh(ctx, a->rd); + + ctx->d =3D true; + tcg_gen_add_tl(destl, src1, src2); + + gen_set_gpr(ctx, a->rd, destl); + gen_set_gprh(ctx, a->rd, desth); + + return true; +} + +static bool trans_addid(DisasContext *ctx, arg_addid *a) +{ + REQUIRE_128BIT(ctx); + TCGv src1 =3D get_gpr(ctx, a->rs1, EXT_NONE), + destl =3D dest_gpr(ctx, a->rd), + desth =3D dest_gprh(ctx, a->rd); + + ctx->d =3D true; + tcg_gen_addi_tl(destl, src1, a->imm); + + gen_set_gpr(ctx, a->rd, destl); + gen_set_gprh(ctx, a->rd, desth); + + return true; +} + +static bool trans_subd(DisasContext *ctx, arg_subd *a) +{ + REQUIRE_128BIT(ctx); + TCGv src1 =3D get_gpr(ctx, a->rs1, EXT_NONE), + src2 =3D get_gpr(ctx, a->rs2, EXT_NONE), + destl =3D dest_gpr(ctx, a->rd), + desth =3D dest_gprh(ctx, a->rd); + + ctx->d =3D true; + tcg_gen_sub_tl(destl, src1, src2); + + gen_set_gpr(ctx, a->rd, destl); + gen_set_gprh(ctx, a->rd, desth); + + return true; +} + static void gen_addi2_i128(TCGv retl, TCGv reth, TCGv srcl, TCGv srch, target_long imm) { --=20 2.33.0 From nobody Thu May 9 06:39:21 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; spf=pass (zohomail.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=univ-grenoble-alpes.fr Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1633556736715306.5714706365028; Wed, 6 Oct 2021 14:45:36 -0700 (PDT) Received: from localhost ([::1]:57106 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1mYEjH-000107-Ff for importer@patchew.org; Wed, 06 Oct 2021 17:45:35 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:49738) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1mYEUF-0008SI-Kn; Wed, 06 Oct 2021 17:30:03 -0400 Received: from zm-mta-out-3.u-ga.fr ([152.77.200.56]:43926) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1mYEUC-00089c-3P; Wed, 06 Oct 2021 17:30:03 -0400 Received: from mailhost.u-ga.fr (mailhost2.u-ga.fr [129.88.177.242]) by zm-mta-out-3.u-ga.fr (Postfix) with ESMTP id 7561A41E8D; Wed, 6 Oct 2021 23:29:38 +0200 (CEST) Received: from smtps.univ-grenoble-alpes.fr (smtps2.u-ga.fr [152.77.18.2]) by mailhost.u-ga.fr (Postfix) with ESMTP id 5EE2C60066; Wed, 6 Oct 2021 23:29:38 +0200 (CEST) Received: from palmier.tima.u-ga.fr (35.201.90.79.rev.sfr.net [79.90.201.35]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) (Authenticated sender: petrotf@univ-grenoble-alpes.fr) by smtps.univ-grenoble-alpes.fr (Postfix) with ESMTPSA id 28EB814005C; Wed, 6 Oct 2021 23:29:38 +0200 (CEST) From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20P=C3=A9trot?= To: qemu-devel@nongnu.org, qemu-riscv@nongnu.org Subject: [PATCH v2 18/27] target/riscv: 128-bit double word integer shift instructions Date: Wed, 6 Oct 2021 23:28:24 +0200 Message-Id: <20211006212833.108706-19-frederic.petrot@univ-grenoble-alpes.fr> X-Mailer: git-send-email 2.33.0 In-Reply-To: <20211006212833.108706-1-frederic.petrot@univ-grenoble-alpes.fr> References: <20211006212833.108706-1-frederic.petrot@univ-grenoble-alpes.fr> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable X-Greylist: Whitelist-UGA SMTP Authentifie (petrotf@univ-grenoble-alpes.fr) via submission-587 ACL (41) X-Greylist: Whitelist-UGA MAILHOST (SMTP non authentifie) depuis 152.77.18.2 Received-SPF: pass (zohomail.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; Received-SPF: pass client-ip=152.77.200.56; envelope-from=frederic.petrot@univ-grenoble-alpes.fr; helo=zm-mta-out-3.u-ga.fr X-Spam_score_int: -18 X-Spam_score: -1.9 X-Spam_bar: - X-Spam_report: (-1.9 / 5.0 requ) BAYES_00=-1.9, RCVD_IN_MSPIKE_H2=-0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action 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: bin.meng@windriver.com, richard.henderson@linaro.org, alistair.francis@wdc.com, fabien.portas@grenoble-inp.org, palmer@dabbelt.com, =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20P=C3=A9trot?= , philmd@redhat.com Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZM-MESSAGEID: 1633556737134100001 All variations of shifts on 64-bit values are available in the 128-bit ISA, so we add them now. Signed-off-by: Fr=C3=A9d=C3=A9ric P=C3=A9trot Co-authored-by: Fabien Portas --- target/riscv/insn32.decode | 10 +++++ target/riscv/translate.c | 4 +- target/riscv/insn_trans/trans_rvi.c.inc | 58 +++++++++++++++++++++++++ 3 files changed, 70 insertions(+), 2 deletions(-) diff --git a/target/riscv/insn32.decode b/target/riscv/insn32.decode index eea540cea9..be8d6aa85f 100644 --- a/target/riscv/insn32.decode +++ b/target/riscv/insn32.decode @@ -22,6 +22,7 @@ %rs1 15:5 %rd 7:5 %sh5 20:5 +%sh6 20:6 =20 %sh7 20:7 %csr 20:12 @@ -92,6 +93,9 @@ # Formats 64: @sh5 ....... ..... ..... ... ..... ....... &shift shamt=3D%sh5 = %rs1 %rd =20 +# Formats 128: +@sh6 ...... ...... ..... ... ..... ....... &shift shamt=3D%sh6 %rs1 = %rd + # *** Privileged Instructions *** ecall 000000000000 00000 000 00000 1110011 ebreak 000000000001 00000 000 00000 1110011 @@ -168,8 +172,14 @@ ldu ............ ..... 111 ..... 0000011 @i lq ............ ..... 010 ..... 0001111 @i sq ............ ..... 100 ..... 0100011 @s addid ............ ..... 000 ..... 1011011 @i +sllid 000000 ...... ..... 001 ..... 1011011 @sh6 +srlid 000000 ...... ..... 101 ..... 1011011 @sh6 +sraid 010000 ...... ..... 101 ..... 1011011 @sh6 addd 0000000 ..... ..... 000 ..... 1111011 @r subd 0100000 ..... ..... 000 ..... 1111011 @r +slld 0000000 ..... ..... 001 ..... 1111011 @r +srld 0000000 ..... ..... 101 ..... 1111011 @r +srad 0100000 ..... ..... 101 ..... 1111011 @r =20 # *** RV32M Standard Extension *** mul 0000001 ..... ..... 000 ..... 0110011 @r diff --git a/target/riscv/translate.c b/target/riscv/translate.c index 120841de48..195dc3f461 100644 --- a/target/riscv/translate.c +++ b/target/riscv/translate.c @@ -624,8 +624,8 @@ static bool gen_shift_imm_fn(DisasContext *ctx, arg_shi= ft *a, DisasExtend ext, =20 gen_set_gpr(ctx, a->rd, dest); } else if (is_128bit(ctx)) { - if ((ctx->w && a->shamt >=3D 32) - || (!ctx->w && a->shamt >=3D 128)) { + if ((ctx->w && a->shamt >=3D 32) || (ctx->d && a->shamt >=3D 64) + || (!ctx->w && !ctx->d && a->shamt >=3D 128)) { return false; } =20 diff --git a/target/riscv/insn_trans/trans_rvi.c.inc b/target/riscv/insn_tr= ans/trans_rvi.c.inc index 05e13bbc1d..1a1defb102 100644 --- a/target/riscv/insn_trans/trans_rvi.c.inc +++ b/target/riscv/insn_trans/trans_rvi.c.inc @@ -888,6 +888,39 @@ static bool trans_sraiw(DisasContext *ctx, arg_sraiw *= a) NULL, gen_sraiw_tl, gen_sraiw_i128); } =20 +static bool trans_sllid(DisasContext *ctx, arg_sllid *a) +{ + REQUIRE_128BIT(ctx); + ctx->d =3D true; + return gen_shift_imm_fn(ctx, a, EXT_NONE, NULL, NULL, gen_slliwd_i128); +} + +static void gen_srlid_i128(TCGv retl, TCGv reth, + TCGv srcl, TCGv srch, target_long shamt) +{ + tcg_gen_shri_tl(retl, srcl, shamt); +} + +static bool trans_srlid(DisasContext *ctx, arg_srlid *a) +{ + REQUIRE_128BIT(ctx); + ctx->d =3D true; + return gen_shift_imm_fn(ctx, a, EXT_NONE, NULL, NULL, gen_srlid_i128); +} + +static void gen_sraid_i128(TCGv retl, TCGv reth, + TCGv srcl, TCGv srch, target_long shamt) +{ + tcg_gen_sari_tl(retl, srcl, shamt); +} + +static bool trans_sraid(DisasContext *ctx, arg_sraid *a) +{ + REQUIRE_128BIT(ctx); + ctx->d =3D true; + return gen_shift_imm_fn(ctx, a, EXT_NONE, NULL, NULL, gen_sraid_i128); +} + static void gen_addw_i128(TCGv retl, TCGv reth, TCGv src1l, TCGv src1h, TCGv src2l, TCGv src2h) @@ -960,6 +993,31 @@ static bool trans_sraw(DisasContext *ctx, arg_sraw *a) NULL, tcg_gen_sar_tl, gen_srawd_i128); } =20 +/* Translation functions for 64-bit operations specific to RV128 */ +static bool trans_slld(DisasContext *ctx, arg_slld *a) +{ + REQUIRE_128BIT(ctx); + ctx->d =3D true; + return gen_shift(ctx, a, EXT_NONE, + tcg_gen_shl_tl, tcg_gen_shl_tl, gen_sllwd_i128); +} + +static bool trans_srld(DisasContext *ctx, arg_srld *a) +{ + REQUIRE_128BIT(ctx); + ctx->d =3D true; + return gen_shift(ctx, a, EXT_ZERO, + tcg_gen_shr_tl, tcg_gen_shr_tl, gen_srlwd_i128); +} + +static bool trans_srad(DisasContext *ctx, arg_srad *a) +{ + REQUIRE_128BIT(ctx); + ctx->d =3D true; + return gen_shift(ctx, a, EXT_SIGN, + tcg_gen_sar_tl, tcg_gen_sar_tl, gen_srawd_i128); +} + static bool trans_fence(DisasContext *ctx, arg_fence *a) { /* FENCE is a full memory barrier. */ --=20 2.33.0 From nobody Thu May 9 06:39:21 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; spf=pass (zohomail.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=univ-grenoble-alpes.fr Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1633557071624672.7786347293581; Wed, 6 Oct 2021 14:51:11 -0700 (PDT) Received: from localhost ([::1]:37442 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1mYEog-0006z9-DK for importer@patchew.org; Wed, 06 Oct 2021 17:51:10 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:49740) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1mYEUG-0008T7-Kq; Wed, 06 Oct 2021 17:30:07 -0400 Received: from zm-mta-out-3.u-ga.fr ([152.77.200.56]:43946) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1mYEUD-0008AZ-2Y; Wed, 06 Oct 2021 17:30:03 -0400 Received: from mailhost.u-ga.fr (mailhost1.u-ga.fr [152.77.1.10]) by zm-mta-out-3.u-ga.fr (Postfix) with ESMTP id 8098941E93; Wed, 6 Oct 2021 23:29:39 +0200 (CEST) Received: from smtps.univ-grenoble-alpes.fr (smtps2.u-ga.fr [152.77.18.2]) by mailhost.u-ga.fr (Postfix) with ESMTP id 6AECD60067; Wed, 6 Oct 2021 23:29:39 +0200 (CEST) Received: from palmier.tima.u-ga.fr (35.201.90.79.rev.sfr.net [79.90.201.35]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) (Authenticated sender: petrotf@univ-grenoble-alpes.fr) by smtps.univ-grenoble-alpes.fr (Postfix) with ESMTPSA id 2F60F14005C; Wed, 6 Oct 2021 23:29:39 +0200 (CEST) From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20P=C3=A9trot?= To: qemu-devel@nongnu.org, qemu-riscv@nongnu.org Subject: [PATCH v2 19/27] target/riscv: support for 128-bit base multiplications insns Date: Wed, 6 Oct 2021 23:28:25 +0200 Message-Id: <20211006212833.108706-20-frederic.petrot@univ-grenoble-alpes.fr> X-Mailer: git-send-email 2.33.0 In-Reply-To: <20211006212833.108706-1-frederic.petrot@univ-grenoble-alpes.fr> References: <20211006212833.108706-1-frederic.petrot@univ-grenoble-alpes.fr> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable X-Greylist: Whitelist-UGA SMTP Authentifie (petrotf@univ-grenoble-alpes.fr) via submission-587 ACL (41) X-Greylist: Whitelist-UGA MAILHOST (SMTP non authentifie) depuis 152.77.18.2 Received-SPF: pass (zohomail.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; Received-SPF: pass client-ip=152.77.200.56; envelope-from=frederic.petrot@univ-grenoble-alpes.fr; helo=zm-mta-out-3.u-ga.fr X-Spam_score_int: -18 X-Spam_score: -1.9 X-Spam_bar: - X-Spam_report: (-1.9 / 5.0 requ) BAYES_00=-1.9, RCVD_IN_MSPIKE_H2=-0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action 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: bin.meng@windriver.com, richard.henderson@linaro.org, alistair.francis@wdc.com, fabien.portas@grenoble-inp.org, palmer@dabbelt.com, =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20P=C3=A9trot?= , philmd@redhat.com Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZM-MESSAGEID: 1633557072810100001 We deal here with the multiplication part of the M extension as, although a bit complex, the code is generated inline, as opposed to division and remainder that resort to helpers (to come soon). Signed-off-by: Fr=C3=A9d=C3=A9ric P=C3=A9trot Co-authored-by: Fabien Portas --- target/riscv/insn_trans/trans_rvm.c.inc | 183 ++++++++++++++++++++++-- 1 file changed, 173 insertions(+), 10 deletions(-) diff --git a/target/riscv/insn_trans/trans_rvm.c.inc b/target/riscv/insn_tr= ans/trans_rvm.c.inc index 0c5f1ba548..d61c79450c 100644 --- a/target/riscv/insn_trans/trans_rvm.c.inc +++ b/target/riscv/insn_trans/trans_rvm.c.inc @@ -18,12 +18,106 @@ * this program. If not, see . */ =20 +static void gen_mulu2_i128(TCGv rll, TCGv rlh, TCGv rhl, TCGv rhh, + TCGv al, TCGv ah, TCGv bl, TCGv bh) +{ + TCGv tmpl =3D tcg_temp_new(), + tmph =3D tcg_temp_new(), + cnst_zero =3D tcg_constant_tl(0); + + tcg_gen_mulu2_tl(rll, rlh, al, bl); + + tcg_gen_mulu2_tl(tmpl, tmph, al, bh); + tcg_gen_add2_tl(rlh, rhl, rlh, cnst_zero, tmpl, tmph); + tcg_gen_mulu2_tl(tmpl, tmph, ah, bl); + tcg_gen_add2_tl(rlh, tmph, rlh, rhl, tmpl, tmph); + /* Overflow detection into rhh */ + tcg_gen_setcond_tl(TCG_COND_LTU, rhh, tmph, rhl); + + tcg_gen_mov_tl(rhl, tmph); + + tcg_gen_mulu2_tl(tmpl, tmph, ah, bh); + tcg_gen_add2_tl(rhl, rhh, rhl, rhh, tmpl, tmph); + + tcg_temp_free(tmpl); + tcg_temp_free(tmph); +} + +static void gen_mul_i128(TCGv rll, TCGv rlh, + TCGv rs1l, TCGv rs1h, TCGv rs2l, TCGv rs2h) +{ + TCGv rhl =3D tcg_temp_new(), + rhh =3D tcg_temp_new(); + + gen_mulu2_i128(rll, rlh, rhl, rhh, rs1l, rs1h, rs2l, rs2h); + + tcg_temp_free(rhl); + tcg_temp_free(rhh); +} =20 static bool trans_mul(DisasContext *ctx, arg_mul *a) { REQUIRE_EXT(ctx, RVM); return gen_arith(ctx, a, EXT_NONE, - tcg_gen_mul_tl, tcg_gen_mul_tl, NULL); + tcg_gen_mul_tl, tcg_gen_mul_tl, gen_mul_i128); +} + +static void gen_mulh_i128(TCGv rhl, TCGv rhh, + TCGv rs1l, TCGv rs1h, TCGv rs2l, TCGv rs2h) +{ + TCGv rll =3D tcg_temp_new(), + rlh =3D tcg_temp_new(), + rlln =3D tcg_temp_new(), + rlhn =3D tcg_temp_new(), + rhln =3D tcg_temp_new(), + rhhn =3D tcg_temp_new(), + sgnres =3D tcg_temp_new(), + tmp =3D tcg_temp_new(), + cnst_one =3D tcg_constant_tl(1), + cnst_zero =3D tcg_constant_tl(0); + + /* Extract sign of result (=3D> sgn(a) xor sgn(b)) */ + tcg_gen_setcondi_tl(TCG_COND_LT, sgnres, rs1h, 0); + tcg_gen_setcondi_tl(TCG_COND_LT, tmp, rs2h, 0); + tcg_gen_xor_tl(sgnres, sgnres, tmp); + + /* Take absolute value of operands */ + tcg_gen_sari_tl(rhl, rs1h, 63); + tcg_gen_add2_tl(rlln, rlhn, rs1l, rs1h, rhl, rhl); + tcg_gen_xor_tl(rlln, rlln, rhl); + tcg_gen_xor_tl(rlhn, rlhn, rhl); + + tcg_gen_sari_tl(rhl, rs2h, 63); + tcg_gen_add2_tl(rhln, rhhn, rs2l, rs2h, rhl, rhl); + tcg_gen_xor_tl(rhln, rhln, rhl); + tcg_gen_xor_tl(rhhn, rhhn, rhl); + + /* Unsigned multiplication */ + gen_mulu2_i128(rll, rlh, rhl, rhh, rlln, rlhn, rhln, rhhn); + + /* Negation of result (two's complement : ~res + 1) */ + tcg_gen_not_tl(rlln, rll); + tcg_gen_not_tl(rlhn, rlh); + tcg_gen_not_tl(rhln, rhl); + tcg_gen_not_tl(rhhn, rhh); + + tcg_gen_add2_tl(rlln, tmp, rlln, cnst_zero, cnst_one, cnst_zero); + tcg_gen_add2_tl(rlhn, tmp, rlhn, cnst_zero, tmp, cnst_zero); + tcg_gen_add2_tl(rhln, tmp, rhln, cnst_zero, tmp, cnst_zero); + tcg_gen_add2_tl(rhhn, tmp, rhhn, cnst_zero, tmp, cnst_zero); + + /* Move conditionally result or -result depending on result sign */ + tcg_gen_movcond_tl(TCG_COND_NE, rhl, sgnres, cnst_zero, rhln, rhl); + tcg_gen_movcond_tl(TCG_COND_NE, rhh, sgnres, cnst_zero, rhhn, rhh); + + tcg_temp_free(rll); + tcg_temp_free(rlh); + tcg_temp_free(rlln); + tcg_temp_free(rlhn); + tcg_temp_free(rhln); + tcg_temp_free(rhhn); + tcg_temp_free(sgnres); + tcg_temp_free(tmp); } =20 static void gen_mulh(TCGv ret, TCGv s1, TCGv s2) @@ -38,7 +132,58 @@ static bool trans_mulh(DisasContext *ctx, arg_mulh *a) { REQUIRE_EXT(ctx, RVM); return gen_arith(ctx, a, EXT_NONE, - gen_mulh, gen_mulh, NULL); + gen_mulh, gen_mulh, gen_mulh_i128); +} + +static void gen_mulhsu_i128(TCGv rhl, TCGv rhh, + TCGv rs1l, TCGv rs1h, TCGv rs2l, TCGv rs2h) +{ + TCGv rll =3D tcg_temp_new(), + rlh =3D tcg_temp_new(), + rlln =3D tcg_temp_new(), + rlhn =3D tcg_temp_new(), + rhln =3D tcg_temp_new(), + rhhn =3D tcg_temp_new(), + sgnres =3D tcg_temp_new(), + tmp =3D tcg_temp_new(), + cnst_one =3D tcg_constant_tl(1), + cnst_zero =3D tcg_constant_tl(0); + + /* Extract sign of result (=3D> sgn(a)) */ + tcg_gen_setcondi_tl(TCG_COND_LT, sgnres, rs1h, 0); + + /* Take absolute value of rs1 */ + tcg_gen_sari_tl(rhl, rs1h, 63); + tcg_gen_add2_tl(rlln, rlhn, rs1l, rs1h, rhl, rhl); + tcg_gen_xor_tl(rlln, rlln, rhl); + tcg_gen_xor_tl(rlhn, rlhn, rhl); + + /* Unsigned multiplication */ + gen_mulu2_i128(rll, rlh, rhl, rhh, rlln, rlhn, rs2l, rs2h); + + /* Negation of result (two's complement : ~res + 1) */ + tcg_gen_not_tl(rlln, rll); + tcg_gen_not_tl(rlhn, rlh); + tcg_gen_not_tl(rhln, rhl); + tcg_gen_not_tl(rhhn, rhh); + + tcg_gen_add2_tl(rlln, tmp, rlln, cnst_zero, cnst_one, cnst_zero); + tcg_gen_add2_tl(rlhn, tmp, rlhn, cnst_zero, tmp, cnst_zero); + tcg_gen_add2_tl(rhln, tmp, rhln, cnst_zero, tmp, cnst_zero); + tcg_gen_add2_tl(rhhn, tmp, rhhn, cnst_zero, tmp, cnst_zero); + + /* Move conditionally result or -result depending on result sign */ + tcg_gen_movcond_tl(TCG_COND_NE, rhl, sgnres, cnst_zero, rhln, rhl); + tcg_gen_movcond_tl(TCG_COND_NE, rhh, sgnres, cnst_zero, rhhn, rhh); + + tcg_temp_free(rll); + tcg_temp_free(rlh); + tcg_temp_free(rlln); + tcg_temp_free(rlhn); + tcg_temp_free(rhln); + tcg_temp_free(rhhn); + tcg_temp_free(sgnres); + tcg_temp_free(tmp); } =20 static void gen_mulhsu(TCGv ret, TCGv arg1, TCGv arg2) @@ -60,7 +205,19 @@ static bool trans_mulhsu(DisasContext *ctx, arg_mulhsu = *a) { REQUIRE_EXT(ctx, RVM); return gen_arith(ctx, a, EXT_NONE, - gen_mulhsu, gen_mulhsu, NULL); + gen_mulhsu, gen_mulhsu, gen_mulhsu_i128); +} + +static void gen_mulhu_i128(TCGv rhl, TCGv rhh, + TCGv rs1l, TCGv rs1h, TCGv rs2l, TCGv rs2h) +{ + TCGv rll =3D tcg_temp_new(), + rlh =3D tcg_temp_new(); + + gen_mulu2_i128(rll, rlh, rhl, rhh, rs1l, rs1h, rs2l, rs2h); + + tcg_temp_free(rll); + tcg_temp_free(rlh); } =20 static void gen_mulhu(TCGv ret, TCGv s1, TCGv s2) @@ -75,7 +232,7 @@ static bool trans_mulhu(DisasContext *ctx, arg_mulhu *a) { REQUIRE_EXT(ctx, RVM); return gen_arith(ctx, a, EXT_NONE, - gen_mulhu, gen_mulhu, NULL); + gen_mulhu, gen_mulhu, gen_mulhu_i128); } =20 static void gen_div(TCGv ret, TCGv source1, TCGv source2) @@ -218,18 +375,24 @@ static bool trans_remu(DisasContext *ctx, arg_remu *a) gen_remu, gen_remu, NULL); } =20 +static void gen_mulw_i128(TCGv rdl, TCGv rdh, + TCGv rs1l, TCGv rs1h, TCGv rs2l, TCGv rs2h) +{ + tcg_gen_mul_tl(rdl, rs1l, rs2l); +} + static bool trans_mulw(DisasContext *ctx, arg_mulw *a) { - REQUIRE_64BIT(ctx); + REQUIRE_64_OR_128BIT(ctx); REQUIRE_EXT(ctx, RVM); ctx->w =3D true; return gen_arith(ctx, a, EXT_NONE, - tcg_gen_mul_tl, tcg_gen_mul_tl, NULL); + tcg_gen_mul_tl, tcg_gen_mul_tl, gen_mulw_i128); } =20 static bool trans_divw(DisasContext *ctx, arg_divw *a) { - REQUIRE_64BIT(ctx); + REQUIRE_64_OR_128BIT(ctx); REQUIRE_EXT(ctx, RVM); ctx->w =3D true; return gen_arith(ctx, a, EXT_SIGN, @@ -238,7 +401,7 @@ static bool trans_divw(DisasContext *ctx, arg_divw *a) =20 static bool trans_divuw(DisasContext *ctx, arg_divuw *a) { - REQUIRE_64BIT(ctx); + REQUIRE_64_OR_128BIT(ctx); REQUIRE_EXT(ctx, RVM); ctx->w =3D true; return gen_arith(ctx, a, EXT_ZERO, @@ -247,7 +410,7 @@ static bool trans_divuw(DisasContext *ctx, arg_divuw *a) =20 static bool trans_remw(DisasContext *ctx, arg_remw *a) { - REQUIRE_64BIT(ctx); + REQUIRE_64_OR_128BIT(ctx); REQUIRE_EXT(ctx, RVM); ctx->w =3D true; return gen_arith(ctx, a, EXT_SIGN, @@ -256,7 +419,7 @@ static bool trans_remw(DisasContext *ctx, arg_remw *a) =20 static bool trans_remuw(DisasContext *ctx, arg_remuw *a) { - REQUIRE_64BIT(ctx); + REQUIRE_64_OR_128BIT(ctx); REQUIRE_EXT(ctx, RVM); ctx->w =3D true; return gen_arith(ctx, a, EXT_ZERO, --=20 2.33.0 From nobody Thu May 9 06:39:21 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; spf=pass (zohomail.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=univ-grenoble-alpes.fr Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1633557276890155.37664912146886; Wed, 6 Oct 2021 14:54:36 -0700 (PDT) Received: from localhost ([::1]:45474 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1mYErz-0003z0-T5 for importer@patchew.org; Wed, 06 Oct 2021 17:54:35 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:49786) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1mYEUX-0000Bt-J1; Wed, 06 Oct 2021 17:30:21 -0400 Received: from zm-mta-out-3.u-ga.fr ([152.77.200.56]:44120) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1mYEUV-0008Os-F1; Wed, 06 Oct 2021 17:30:21 -0400 Received: from mailhost.u-ga.fr (mailhost2.u-ga.fr [129.88.177.242]) by zm-mta-out-3.u-ga.fr (Postfix) with ESMTP id 82B6141E9F; Wed, 6 Oct 2021 23:29:40 +0200 (CEST) Received: from smtps.univ-grenoble-alpes.fr (smtps2.u-ga.fr [152.77.18.2]) by mailhost.u-ga.fr (Postfix) with ESMTP id 6DCBA60066; Wed, 6 Oct 2021 23:29:40 +0200 (CEST) Received: from palmier.tima.u-ga.fr (35.201.90.79.rev.sfr.net [79.90.201.35]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) (Authenticated sender: petrotf@univ-grenoble-alpes.fr) by smtps.univ-grenoble-alpes.fr (Postfix) with ESMTPSA id 34D0014005C; Wed, 6 Oct 2021 23:29:40 +0200 (CEST) From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20P=C3=A9trot?= To: qemu-devel@nongnu.org, qemu-riscv@nongnu.org Subject: [PATCH v2 20/27] target/riscv: addition of the 'd' insns for 128-bit mult/div/rem Date: Wed, 6 Oct 2021 23:28:26 +0200 Message-Id: <20211006212833.108706-21-frederic.petrot@univ-grenoble-alpes.fr> X-Mailer: git-send-email 2.33.0 In-Reply-To: <20211006212833.108706-1-frederic.petrot@univ-grenoble-alpes.fr> References: <20211006212833.108706-1-frederic.petrot@univ-grenoble-alpes.fr> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable X-Greylist: Whitelist-UGA SMTP Authentifie (petrotf@univ-grenoble-alpes.fr) via submission-587 ACL (41) X-Greylist: Whitelist-UGA MAILHOST (SMTP non authentifie) depuis 152.77.18.2 Received-SPF: pass (zohomail.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; Received-SPF: pass client-ip=152.77.200.56; envelope-from=frederic.petrot@univ-grenoble-alpes.fr; helo=zm-mta-out-3.u-ga.fr X-Spam_score_int: -18 X-Spam_score: -1.9 X-Spam_bar: - X-Spam_report: (-1.9 / 5.0 requ) BAYES_00=-1.9, RCVD_IN_MSPIKE_H2=-0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action 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: bin.meng@windriver.com, richard.henderson@linaro.org, alistair.francis@wdc.com, fabien.portas@grenoble-inp.org, palmer@dabbelt.com, =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20P=C3=A9trot?= , philmd@redhat.com Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZM-MESSAGEID: 1633557278031100001 All mult/div/rem instructions that work on double integers (suffixed 'd') can be tcg-generated in a few micro-ops, they are added here. Signed-off-by: Fr=C3=A9d=C3=A9ric P=C3=A9trot Co-authored-by: Fabien Portas --- target/riscv/insn32.decode | 7 ++ target/riscv/insn_trans/trans_rvm.c.inc | 112 +++++++++++++++++++++++- 2 files changed, 115 insertions(+), 4 deletions(-) diff --git a/target/riscv/insn32.decode b/target/riscv/insn32.decode index be8d6aa85f..380604acee 100644 --- a/target/riscv/insn32.decode +++ b/target/riscv/insn32.decode @@ -198,6 +198,13 @@ divuw 0000001 ..... ..... 101 ..... 0111011 @r remw 0000001 ..... ..... 110 ..... 0111011 @r remuw 0000001 ..... ..... 111 ..... 0111011 @r =20 +# *** RV128M Standard Extension (in addition to RV64M) *** +muld 0000001 ..... ..... 000 ..... 1111011 @r +divd 0000001 ..... ..... 100 ..... 1111011 @r +divud 0000001 ..... ..... 101 ..... 1111011 @r +remd 0000001 ..... ..... 110 ..... 1111011 @r +remud 0000001 ..... ..... 111 ..... 1111011 @r + # *** RV32A Standard Extension *** lr_w 00010 . . 00000 ..... 010 ..... 0101111 @atom_ld sc_w 00011 . . ..... ..... 010 ..... 0101111 @atom_st diff --git a/target/riscv/insn_trans/trans_rvm.c.inc b/target/riscv/insn_tr= ans/trans_rvm.c.inc index d61c79450c..9ed9ba0f0f 100644 --- a/target/riscv/insn_trans/trans_rvm.c.inc +++ b/target/riscv/insn_trans/trans_rvm.c.inc @@ -390,13 +390,25 @@ static bool trans_mulw(DisasContext *ctx, arg_mulw *a) tcg_gen_mul_tl, tcg_gen_mul_tl, gen_mulw_i128); } =20 +static void gen_divw_i128(TCGv rdl, TCGv rdh, + TCGv rs1l, TCGv rs1h, TCGv rs2l, TCGv rs2h) +{ + gen_div(rdl, rs1l, rs2l); +} + static bool trans_divw(DisasContext *ctx, arg_divw *a) { REQUIRE_64_OR_128BIT(ctx); REQUIRE_EXT(ctx, RVM); ctx->w =3D true; return gen_arith(ctx, a, EXT_SIGN, - gen_div, gen_div, NULL); + gen_div, gen_div, gen_divw_i128); +} + +static void gen_divuw_i128(TCGv rdl, TCGv rdh, + TCGv rs1l, TCGv rs1h, TCGv rs2l, TCGv rs2h) +{ + gen_divu(rdl, rs1l, rs2l); } =20 static bool trans_divuw(DisasContext *ctx, arg_divuw *a) @@ -405,7 +417,13 @@ static bool trans_divuw(DisasContext *ctx, arg_divuw *= a) REQUIRE_EXT(ctx, RVM); ctx->w =3D true; return gen_arith(ctx, a, EXT_ZERO, - gen_divu, gen_divu, NULL); + gen_divu, gen_divu, gen_divuw_i128); +} + +static void gen_remw_i128(TCGv rdl, TCGv rdh, + TCGv rs1l, TCGv rs1h, TCGv rs2l, TCGv rs2h) +{ + gen_rem(rdl, rs1l, rs2l); } =20 static bool trans_remw(DisasContext *ctx, arg_remw *a) @@ -414,7 +432,13 @@ static bool trans_remw(DisasContext *ctx, arg_remw *a) REQUIRE_EXT(ctx, RVM); ctx->w =3D true; return gen_arith(ctx, a, EXT_SIGN, - gen_rem, gen_rem, NULL); + gen_rem, gen_rem, gen_remw_i128); +} + +static void gen_remuw_i128(TCGv rdl, TCGv rdh, + TCGv rs1l, TCGv rs1h, TCGv rs2l, TCGv rs2h) +{ + gen_remu(rdl, rs1l, rs2l); } =20 static bool trans_remuw(DisasContext *ctx, arg_remuw *a) @@ -423,5 +447,85 @@ static bool trans_remuw(DisasContext *ctx, arg_remuw *= a) REQUIRE_EXT(ctx, RVM); ctx->w =3D true; return gen_arith(ctx, a, EXT_ZERO, - gen_remu, gen_remu, NULL); + gen_remu, gen_remu, gen_remuw_i128); +} + +static void gen_muld_i128(TCGv rdl, TCGv rdh, + TCGv rs1l, TCGv rs1h, TCGv rs2l, TCGv rs2h) +{ + tcg_gen_mul_tl(rdl, rs1l, rs2l); +} + +static bool trans_muld(DisasContext *ctx, arg_muld *a) +{ + REQUIRE_128BIT(ctx); + REQUIRE_EXT(ctx, RVM); + ctx->d =3D true; + + return gen_arith(ctx, a, EXT_SIGN, + tcg_gen_mul_tl, tcg_gen_mul_tl, gen_muld_i128); +} + +static void gen_divd_i128(TCGv rdl, TCGv rdh, + TCGv rs1l, TCGv rs1h, TCGv rs2l, TCGv rs2h) +{ + gen_div(rdl, rs1l, rs2l); +} + +static bool trans_divd(DisasContext *ctx, arg_divd *a) +{ + REQUIRE_128BIT(ctx); + REQUIRE_EXT(ctx, RVM); + ctx->d =3D true; + + return gen_arith(ctx, a, EXT_SIGN, + gen_div, gen_div, gen_divd_i128); +} + +static void gen_divud_i128(TCGv rdl, TCGv rdh, + TCGv rs1l, TCGv rs1h, TCGv rs2l, TCGv rs2h) +{ + gen_divu(rdl, rs1l, rs2l); +} + +static bool trans_divud(DisasContext *ctx, arg_divud *a) +{ + REQUIRE_128BIT(ctx); + REQUIRE_EXT(ctx, RVM); + ctx->d =3D true; + + return gen_arith(ctx, a, EXT_ZERO, + gen_divu, gen_divu, gen_divud_i128); +} + +static void gen_remd_i128(TCGv rdl, TCGv rdh, + TCGv rs1l, TCGv rs1h, TCGv rs2l, TCGv rs2h) +{ + gen_rem(rdl, rs1l, rs2l); +} + +static bool trans_remd(DisasContext *ctx, arg_remd *a) +{ + REQUIRE_128BIT(ctx); + REQUIRE_EXT(ctx, RVM); + ctx->d =3D true; + + return gen_arith(ctx, a, EXT_SIGN, + gen_rem, gen_rem, gen_remd_i128); +} + +static void gen_remud_i128(TCGv rdl, TCGv rdh, + TCGv rs1l, TCGv rs1h, TCGv rs2l, TCGv rs2h) +{ + gen_remu(rdl, rs1l, rs2l); +} + +static bool trans_remud(DisasContext *ctx, arg_remud *a) +{ + REQUIRE_128BIT(ctx); + REQUIRE_EXT(ctx, RVM); + ctx->d =3D true; + + return gen_arith(ctx, a, EXT_ZERO, + gen_remu, gen_remu, gen_remud_i128); } --=20 2.33.0 From nobody Thu May 9 06:39:21 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; spf=pass (zohomail.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=univ-grenoble-alpes.fr Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1633557382977783.8164269894223; Wed, 6 Oct 2021 14:56:22 -0700 (PDT) Received: from localhost ([::1]:49356 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1mYEth-0006XM-Jv for importer@patchew.org; Wed, 06 Oct 2021 17:56:21 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:49794) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1mYEUX-0000Cc-Vm; Wed, 06 Oct 2021 17:30:22 -0400 Received: from zm-mta-out-3.u-ga.fr ([152.77.200.56]:44122) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1mYEUV-0008Ot-DM; Wed, 06 Oct 2021 17:30:21 -0400 Received: from mailhost.u-ga.fr (mailhost1.u-ga.fr [152.77.1.10]) by zm-mta-out-3.u-ga.fr (Postfix) with ESMTP id 9FB5441EA5; Wed, 6 Oct 2021 23:29:41 +0200 (CEST) Received: from smtps.univ-grenoble-alpes.fr (smtps2.u-ga.fr [152.77.18.2]) by mailhost.u-ga.fr (Postfix) with ESMTP id 886D960067; Wed, 6 Oct 2021 23:29:41 +0200 (CEST) Received: from palmier.tima.u-ga.fr (35.201.90.79.rev.sfr.net [79.90.201.35]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) (Authenticated sender: petrotf@univ-grenoble-alpes.fr) by smtps.univ-grenoble-alpes.fr (Postfix) with ESMTPSA id 4AE3114005C; Wed, 6 Oct 2021 23:29:41 +0200 (CEST) From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20P=C3=A9trot?= To: qemu-devel@nongnu.org, qemu-riscv@nongnu.org Subject: [PATCH v2 21/27] target/riscv: div and rem insns on 128-bit Date: Wed, 6 Oct 2021 23:28:27 +0200 Message-Id: <20211006212833.108706-22-frederic.petrot@univ-grenoble-alpes.fr> X-Mailer: git-send-email 2.33.0 In-Reply-To: <20211006212833.108706-1-frederic.petrot@univ-grenoble-alpes.fr> References: <20211006212833.108706-1-frederic.petrot@univ-grenoble-alpes.fr> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable X-Greylist: Whitelist-UGA SMTP Authentifie (petrotf@univ-grenoble-alpes.fr) via submission-587 ACL (41) X-Greylist: Whitelist-UGA MAILHOST (SMTP non authentifie) depuis 152.77.18.2 Received-SPF: pass (zohomail.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; Received-SPF: pass client-ip=152.77.200.56; envelope-from=frederic.petrot@univ-grenoble-alpes.fr; helo=zm-mta-out-3.u-ga.fr X-Spam_score_int: -18 X-Spam_score: -1.9 X-Spam_bar: - X-Spam_report: (-1.9 / 5.0 requ) BAYES_00=-1.9, RCVD_IN_MSPIKE_H2=-0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action 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: bin.meng@windriver.com, richard.henderson@linaro.org, alistair.francis@wdc.com, fabien.portas@grenoble-inp.org, palmer@dabbelt.com, =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20P=C3=A9trot?= , philmd@redhat.com Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZM-MESSAGEID: 1633557384352100001 Given the complexity of the implementation of these instructions, we call helpers to produce their behavior. From an implementation standpoint, we ended up by adding two more tcg globals to return the 128-bit result in a wrapper that itself is called by gen_arith. Signed-off-by: Fr=C3=A9d=C3=A9ric P=C3=A9trot Co-authored-by: Fabien Portas --- target/riscv/cpu.h | 1 + target/riscv/helper.h | 6 ++ target/riscv/m128_helper.c | 109 ++++++++++++++++++++++++ target/riscv/translate.c | 7 +- target/riscv/insn_trans/trans_rvm.c.inc | 44 +++++++++- target/riscv/meson.build | 1 + 6 files changed, 163 insertions(+), 5 deletions(-) create mode 100644 target/riscv/m128_helper.c diff --git a/target/riscv/cpu.h b/target/riscv/cpu.h index 1de9a1286b..81cbd77d09 100644 --- a/target/riscv/cpu.h +++ b/target/riscv/cpu.h @@ -121,6 +121,7 @@ FIELD(VTYPE, VILL, sizeof(target_ulong) * 8 - 1, 1) struct CPURISCVState { target_ulong gpr[32]; target_ulong gprh[32]; /* 64 top bits of the 128-bit registers */ + target_ulong hlpr[2]; /* scratch registers for 128-bit div/rem helper= s */ uint64_t fpr[32]; /* assume both F and D extensions */ =20 /* vector coprocessor state. */ diff --git a/target/riscv/helper.h b/target/riscv/helper.h index 460eee9988..01d885d566 100644 --- a/target/riscv/helper.h +++ b/target/riscv/helper.h @@ -1149,3 +1149,9 @@ DEF_HELPER_6(vcompress_vm_b, void, ptr, ptr, ptr, ptr= , env, i32) DEF_HELPER_6(vcompress_vm_h, void, ptr, ptr, ptr, ptr, env, i32) DEF_HELPER_6(vcompress_vm_w, void, ptr, ptr, ptr, ptr, env, i32) DEF_HELPER_6(vcompress_vm_d, void, ptr, ptr, ptr, ptr, env, i32) + +/* 128-bit integer multiplication and division */ +DEF_HELPER_5(divu_i128, void, env, i64, i64, i64, i64) +DEF_HELPER_5(divs_i128, void, env, i64, i64, i64, i64) +DEF_HELPER_5(remu_i128, void, env, i64, i64, i64, i64) +DEF_HELPER_5(rems_i128, void, env, i64, i64, i64, i64) diff --git a/target/riscv/m128_helper.c b/target/riscv/m128_helper.c new file mode 100644 index 0000000000..694ca5da9b --- /dev/null +++ b/target/riscv/m128_helper.c @@ -0,0 +1,109 @@ +/* + * RISC-V Emulation Helpers for QEMU. + * + * Copyright (c) 2016-2017 Sagar Karandikar, sagark@eecs.berkeley.edu + * Copyright (c) 2017-2018 SiFive, Inc. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms and conditions of the GNU General Public License, + * version 2 or later, as published by the Free Software Foundation. + * + * This program is distributed in the hope it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License f= or + * more details. + * + * You should have received a copy of the GNU General Public License along= with + * this program. If not, see . + */ + +#include "qemu/osdep.h" +#include "cpu.h" +#include "qemu/main-loop.h" +#include "exec/exec-all.h" +#include "exec/helper-proto.h" + +void HELPER(divu_i128)(CPURISCVState *env, + uint64_t ul, uint64_t uh, + uint64_t vl, uint64_t vh) +{ + uint64_t ql, qh; + Int128 q; + + if (vl =3D=3D 0 && vh =3D=3D 0) { /* Handle special behavior on div by= zero */ + ql =3D ~0x0; + qh =3D ~0x0; + } else { + q =3D int128_divu(int128_make128(ul, uh), int128_make128(vl, vh)); + ql =3D int128_getlo(q); + qh =3D int128_gethi(q); + } + + env->hlpr[0] =3D ql; + env->hlpr[1] =3D qh; +} + +void HELPER(remu_i128)(CPURISCVState *env, + uint64_t ul, uint64_t uh, + uint64_t vl, uint64_t vh) +{ + uint64_t rl, rh; + Int128 r; + + if (vl =3D=3D 0 && vh =3D=3D 0) { + rl =3D ul; + rh =3D uh; + } else { + r =3D int128_remu(int128_make128(ul, uh), int128_make128(vl, vh)); + rl =3D int128_getlo(r); + rh =3D int128_gethi(r); + } + + env->hlpr[0] =3D rl; + env->hlpr[1] =3D rh; +} + +void HELPER(divs_i128)(CPURISCVState *env, + uint64_t ul, uint64_t uh, + uint64_t vl, uint64_t vh) +{ + uint64_t qh, ql; + Int128 q; + + if (vl =3D=3D 0 && vh =3D=3D 0) { /* Div by zero check */ + ql =3D ~0x0; + qh =3D ~0x0; + } else if (uh =3D=3D 0x8000000000000000 && ul =3D=3D 0 && + vh =3D=3D ~0x0 && vl =3D=3D ~0x0) { + /* Signed div overflow check (-2**127 / -1) */ + ql =3D ul; + qh =3D uh; + } else { + q =3D int128_divs(int128_make128(ul, uh), int128_make128(vl, vh)); + ql =3D int128_getlo(q); + qh =3D int128_gethi(q); + } + + env->hlpr[0] =3D ql; + env->hlpr[1] =3D qh; +} + +void HELPER(rems_i128)(CPURISCVState *env, + uint64_t ul, uint64_t uh, + uint64_t vl, uint64_t vh) +{ + uint64_t rh, rl; + Int128 r; + + if (vl =3D=3D 0 && vh =3D=3D 0) { + rl =3D ul; + rh =3D uh; + } else { + r =3D int128_rems(int128_make128(ul, uh), int128_make128(vl, vh)); + rl =3D int128_getlo(r); + rh =3D int128_gethi(r); + } + + env->hlpr[0] =3D rl; + env->hlpr[1] =3D rh; +} diff --git a/target/riscv/translate.c b/target/riscv/translate.c index 195dc3f461..cb697bd0e4 100644 --- a/target/riscv/translate.c +++ b/target/riscv/translate.c @@ -32,7 +32,7 @@ #include "instmap.h" =20 /* global register indices */ -static TCGv cpu_gpr[32], cpu_gprh[32], cpu_pc, cpu_vl; +static TCGv cpu_gpr[32], cpu_gprh[32], cpu_hlpr[2], cpu_pc, cpu_vl; static TCGv_i64 cpu_fpr[32]; /* assume F and D extensions */ static TCGv load_res; static TCGv load_val; @@ -917,6 +917,11 @@ void riscv_translate_init(void) offsetof(CPURISCVState, gprh[i]), riscv_int_regnames[i]); } =20 + cpu_hlpr[0] =3D tcg_global_mem_new(cpu_env, + offsetof(CPURISCVState, hlpr[0]), "helper_reg0"); + cpu_hlpr[1] =3D tcg_global_mem_new(cpu_env, + offsetof(CPURISCVState, hlpr[1]), "helper_reg1"); + for (i =3D 0; i < 32; i++) { cpu_fpr[i] =3D tcg_global_mem_new_i64(cpu_env, offsetof(CPURISCVState, fpr[i]), riscv_fpr_regnames[i]); diff --git a/target/riscv/insn_trans/trans_rvm.c.inc b/target/riscv/insn_tr= ans/trans_rvm.c.inc index 9ed9ba0f0f..f46e746bed 100644 --- a/target/riscv/insn_trans/trans_rvm.c.inc +++ b/target/riscv/insn_trans/trans_rvm.c.inc @@ -235,6 +235,15 @@ static bool trans_mulhu(DisasContext *ctx, arg_mulhu *= a) gen_mulhu, gen_mulhu, gen_mulhu_i128); } =20 +static void gen_div_i128(TCGv rdl, TCGv rdh, + TCGv rs1l, TCGv rs1h, TCGv rs2l, TCGv rs2h) +{ + gen_helper_divs_i128(cpu_env, (TCGv_i64)rs1l, (TCGv_i64)rs1h, + (TCGv_i64)rs2l, (TCGv_i64)rs2h); + tcg_gen_mov_tl(rdl, cpu_hlpr[0]); + tcg_gen_mov_tl(rdh, cpu_hlpr[1]); +} + static void gen_div(TCGv ret, TCGv source1, TCGv source2) { TCGv temp1, temp2, zero, one, mone, min; @@ -272,7 +281,16 @@ static bool trans_div(DisasContext *ctx, arg_div *a) { REQUIRE_EXT(ctx, RVM); return gen_arith(ctx, a, EXT_SIGN, - gen_div, gen_div, NULL); + gen_div, gen_div, gen_div_i128); +} + +static void gen_divu_i128(TCGv rdl, TCGv rdh, + TCGv rs1l, TCGv rs1h, TCGv rs2l, TCGv rs2h) +{ + gen_helper_divu_i128(cpu_env, (TCGv_i64)rs1l, (TCGv_i64)rs1h, + (TCGv_i64)rs2l, (TCGv_i64)rs2h); + tcg_gen_mov_tl(rdl, cpu_hlpr[0]); + tcg_gen_mov_tl(rdh, cpu_hlpr[1]); } =20 static void gen_divu(TCGv ret, TCGv source1, TCGv source2) @@ -301,7 +319,16 @@ static bool trans_divu(DisasContext *ctx, arg_divu *a) { REQUIRE_EXT(ctx, RVM); return gen_arith(ctx, a, EXT_ZERO, - gen_divu, gen_divu, NULL); + gen_divu, gen_divu, gen_divu_i128); +} + +static void gen_rem_i128(TCGv rdl, TCGv rdh, + TCGv rs1l, TCGv rs1h, TCGv rs2l, TCGv rs2h) +{ + gen_helper_rems_i128(cpu_env, (TCGv_i64)rs1l, (TCGv_i64)rs1h, + (TCGv_i64)rs2l, (TCGv_i64)rs2h); + tcg_gen_mov_tl(rdl, cpu_hlpr[0]); + tcg_gen_mov_tl(rdh, cpu_hlpr[1]); } =20 static void gen_rem(TCGv ret, TCGv source1, TCGv source2) @@ -343,7 +370,16 @@ static bool trans_rem(DisasContext *ctx, arg_rem *a) { REQUIRE_EXT(ctx, RVM); return gen_arith(ctx, a, EXT_SIGN, - gen_rem, gen_rem, NULL); + gen_rem, gen_rem, gen_rem_i128); +} + +static void gen_remu_i128(TCGv rdl, TCGv rdh, + TCGv rs1l, TCGv rs1h, TCGv rs2l, TCGv rs2h) +{ + gen_helper_remu_i128(cpu_env, (TCGv_i64)rs1l, (TCGv_i64)rs1h, + (TCGv_i64)rs2l, (TCGv_i64)rs2h); + tcg_gen_mov_tl(rdl, cpu_hlpr[0]); + tcg_gen_mov_tl(rdh, cpu_hlpr[1]); } =20 static void gen_remu(TCGv ret, TCGv source1, TCGv source2) @@ -372,7 +408,7 @@ static bool trans_remu(DisasContext *ctx, arg_remu *a) { REQUIRE_EXT(ctx, RVM); return gen_arith(ctx, a, EXT_ZERO, - gen_remu, gen_remu, NULL); + gen_remu, gen_remu, gen_remu_i128); } =20 static void gen_mulw_i128(TCGv rdl, TCGv rdh, diff --git a/target/riscv/meson.build b/target/riscv/meson.build index d5e0bc93ea..a32158da93 100644 --- a/target/riscv/meson.build +++ b/target/riscv/meson.build @@ -18,6 +18,7 @@ riscv_ss.add(files( 'vector_helper.c', 'bitmanip_helper.c', 'translate.c', + 'm128_helper.c' )) =20 riscv_softmmu_ss =3D ss.source_set() --=20 2.33.0 From nobody Thu May 9 06:39:21 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; spf=pass (zohomail.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=univ-grenoble-alpes.fr Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1633557577078101.7823172812873; Wed, 6 Oct 2021 14:59:37 -0700 (PDT) Received: from localhost ([::1]:58762 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1mYEwo-0004Ub-6f for importer@patchew.org; Wed, 06 Oct 2021 17:59:35 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:49806) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1mYEUZ-0000FP-07; Wed, 06 Oct 2021 17:30:23 -0400 Received: from zm-mta-out-3.u-ga.fr ([152.77.200.56]:44126) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1mYEUV-0008Oy-GQ; Wed, 06 Oct 2021 17:30:22 -0400 Received: from mailhost.u-ga.fr (mailhost2.u-ga.fr [129.88.177.242]) by zm-mta-out-3.u-ga.fr (Postfix) with ESMTP id E2B5F41EAE; Wed, 6 Oct 2021 23:29:42 +0200 (CEST) Received: from smtps.univ-grenoble-alpes.fr (smtps2.u-ga.fr [152.77.18.2]) by mailhost.u-ga.fr (Postfix) with ESMTP id CC4B060066; Wed, 6 Oct 2021 23:29:42 +0200 (CEST) Received: from palmier.tima.u-ga.fr (35.201.90.79.rev.sfr.net [79.90.201.35]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) (Authenticated sender: petrotf@univ-grenoble-alpes.fr) by smtps.univ-grenoble-alpes.fr (Postfix) with ESMTPSA id 9572014005C; Wed, 6 Oct 2021 23:29:42 +0200 (CEST) From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20P=C3=A9trot?= To: qemu-devel@nongnu.org, qemu-riscv@nongnu.org Subject: [PATCH v2 22/27] target/riscv: adding high part of some csrs Date: Wed, 6 Oct 2021 23:28:28 +0200 Message-Id: <20211006212833.108706-23-frederic.petrot@univ-grenoble-alpes.fr> X-Mailer: git-send-email 2.33.0 In-Reply-To: <20211006212833.108706-1-frederic.petrot@univ-grenoble-alpes.fr> References: <20211006212833.108706-1-frederic.petrot@univ-grenoble-alpes.fr> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable X-Greylist: Whitelist-UGA SMTP Authentifie (petrotf@univ-grenoble-alpes.fr) via submission-587 ACL (41) X-Greylist: Whitelist-UGA MAILHOST (SMTP non authentifie) depuis 152.77.18.2 Received-SPF: pass (zohomail.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; Received-SPF: pass client-ip=152.77.200.56; envelope-from=frederic.petrot@univ-grenoble-alpes.fr; helo=zm-mta-out-3.u-ga.fr X-Spam_score_int: -18 X-Spam_score: -1.9 X-Spam_bar: - X-Spam_report: (-1.9 / 5.0 requ) BAYES_00=-1.9, RCVD_IN_MSPIKE_H2=-0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action 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: bin.meng@windriver.com, richard.henderson@linaro.org, alistair.francis@wdc.com, fabien.portas@grenoble-inp.org, palmer@dabbelt.com, =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20P=C3=A9trot?= , philmd@redhat.com Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZM-MESSAGEID: 1633557578998100001 Adding the high part of a minimal set of csr. Signed-off-by: Fr=C3=A9d=C3=A9ric P=C3=A9trot Co-authored-by: Fabien Portas --- target/riscv/cpu.h | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/target/riscv/cpu.h b/target/riscv/cpu.h index 81cbd77d09..a2d7d65efb 100644 --- a/target/riscv/cpu.h +++ b/target/riscv/cpu.h @@ -196,9 +196,14 @@ struct CPURISCVState { target_ulong hgatp; uint64_t htimedelta; =20 - /* Upper 64-bits of 128-bit misa CSR */ + /* Upper 64-bits of 128-bit CSRs */ uint64_t misah; uint64_t misah_mask; + uint64_t mtvech; + uint64_t mscratchh; + uint64_t mepch; + uint64_t satph; + uint64_t mstatush; =20 /* Virtual CSRs */ /* --=20 2.33.0 From nobody Thu May 9 06:39:21 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; spf=pass (zohomail.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=univ-grenoble-alpes.fr Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1633557469222481.7754512622712; Wed, 6 Oct 2021 14:57:49 -0700 (PDT) Received: from localhost ([::1]:54054 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1mYEv6-0001In-5M for importer@patchew.org; Wed, 06 Oct 2021 17:57:48 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:49852) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1mYEUa-0000J6-TN; Wed, 06 Oct 2021 17:30:25 -0400 Received: from zm-mta-out-3.u-ga.fr ([152.77.200.56]:44124) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1mYEUV-0008Ox-HM; Wed, 06 Oct 2021 17:30:24 -0400 Received: from mailhost.u-ga.fr (mailhost2.u-ga.fr [129.88.177.242]) by zm-mta-out-3.u-ga.fr (Postfix) with ESMTP id D99AF41EB0; Wed, 6 Oct 2021 23:29:43 +0200 (CEST) Received: from smtps.univ-grenoble-alpes.fr (smtps2.u-ga.fr [152.77.18.2]) by mailhost.u-ga.fr (Postfix) with ESMTP id C3CC060066; Wed, 6 Oct 2021 23:29:43 +0200 (CEST) Received: from palmier.tima.u-ga.fr (35.201.90.79.rev.sfr.net [79.90.201.35]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) (Authenticated sender: petrotf@univ-grenoble-alpes.fr) by smtps.univ-grenoble-alpes.fr (Postfix) with ESMTPSA id 9045F14005C; Wed, 6 Oct 2021 23:29:43 +0200 (CEST) From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20P=C3=A9trot?= To: qemu-devel@nongnu.org, qemu-riscv@nongnu.org Subject: [PATCH v2 23/27] target/riscv: helper functions to wrap calls to 128-bit csr insns Date: Wed, 6 Oct 2021 23:28:29 +0200 Message-Id: <20211006212833.108706-24-frederic.petrot@univ-grenoble-alpes.fr> X-Mailer: git-send-email 2.33.0 In-Reply-To: <20211006212833.108706-1-frederic.petrot@univ-grenoble-alpes.fr> References: <20211006212833.108706-1-frederic.petrot@univ-grenoble-alpes.fr> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable X-Greylist: Whitelist-UGA SMTP Authentifie (petrotf@univ-grenoble-alpes.fr) via submission-587 ACL (41) X-Greylist: Whitelist-UGA MAILHOST (SMTP non authentifie) depuis 152.77.18.2 Received-SPF: pass (zohomail.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; Received-SPF: pass client-ip=152.77.200.56; envelope-from=frederic.petrot@univ-grenoble-alpes.fr; helo=zm-mta-out-3.u-ga.fr X-Spam_score_int: -18 X-Spam_score: -1.9 X-Spam_bar: - X-Spam_report: (-1.9 / 5.0 requ) BAYES_00=-1.9, RCVD_IN_MSPIKE_H2=-0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action 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: bin.meng@windriver.com, richard.henderson@linaro.org, alistair.francis@wdc.com, fabien.portas@grenoble-inp.org, palmer@dabbelt.com, =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20P=C3=A9trot?= , philmd@redhat.com Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZM-MESSAGEID: 1633557470527100001 Given the side effects they have, the csr instructions are realized as helpers. We extend this existing infrastructure for 128-bit sized csr. We have a slight issue with returning 128-bit values: we use the globals we added to support div/rem insns to that end. Theses helpers all call a unique function that is currently a stub. The trans_csrxx functions supporting 128-bit are yet to be implemented. Signed-off-by: Fr=C3=A9d=C3=A9ric P=C3=A9trot Co-authored-by: Fabien Portas --- target/riscv/cpu.h | 4 ++++ target/riscv/helper.h | 3 +++ target/riscv/csr.c | 7 +++++++ target/riscv/op_helper.c | 44 ++++++++++++++++++++++++++++++++++++++++ 4 files changed, 58 insertions(+) diff --git a/target/riscv/cpu.h b/target/riscv/cpu.h index a2d7d65efb..911fdc4ecf 100644 --- a/target/riscv/cpu.h +++ b/target/riscv/cpu.h @@ -506,6 +506,10 @@ typedef RISCVException (*riscv_csr_op_fn)(CPURISCVStat= e *env, int csrno, target_ulong new_value, target_ulong write_mask); =20 +RISCVException riscv_csrrw_i128(CPURISCVState *env, int csrno, + Int128 *ret_value, + Int128 new_value, Int128 write_mask); + typedef struct { const char *name; riscv_csr_predicate_fn predicate; diff --git a/target/riscv/helper.h b/target/riscv/helper.h index 01d885d566..d1176649f1 100644 --- a/target/riscv/helper.h +++ b/target/riscv/helper.h @@ -68,6 +68,9 @@ DEF_HELPER_FLAGS_2(gorcw, TCG_CALL_NO_RWG_SE, tl, tl, tl) DEF_HELPER_2(csrr, tl, env, int) DEF_HELPER_3(csrw, void, env, int, tl) DEF_HELPER_4(csrrw, tl, env, int, tl, tl) +DEF_HELPER_2(csrr_i128, void, env, int) +DEF_HELPER_4(csrw_i128, void, env, int, tl, tl) +DEF_HELPER_6(csrrw_i128, void, env, int, tl, tl, tl, tl) #ifndef CONFIG_USER_ONLY DEF_HELPER_2(sret, tl, env, tl) DEF_HELPER_2(mret, tl, env, tl) diff --git a/target/riscv/csr.c b/target/riscv/csr.c index 23fbbd3216..9529119238 100644 --- a/target/riscv/csr.c +++ b/target/riscv/csr.c @@ -1492,6 +1492,13 @@ RISCVException riscv_csrrw(CPURISCVState *env, int c= srno, return RISCV_EXCP_NONE; } =20 +RISCVException riscv_csrrw_i128(CPURISCVState *env, int csrno, + Int128 *ret_value, + Int128 new_value, Int128 write_mask) +{ + return RISCV_EXCP_ILLEGAL_INST; +} + /* * Debugger support. If not in user mode, set env->debugger before the * riscv_csrrw call and clear it after the call. diff --git a/target/riscv/op_helper.c b/target/riscv/op_helper.c index ee7c24efe7..753eb35000 100644 --- a/target/riscv/op_helper.c +++ b/target/riscv/op_helper.c @@ -69,6 +69,50 @@ target_ulong helper_csrrw(CPURISCVState *env, int csr, return val; } =20 +void helper_csrr_i128(CPURISCVState *env, int csr) +{ + Int128 rv =3D int128_zero(); + RISCVException ret =3D riscv_csrrw_i128(env, csr, &rv, + int128_zero(), + int128_zero()); + + if (ret !=3D RISCV_EXCP_NONE) { + riscv_raise_exception(env, ret, GETPC()); + } + + env->hlpr[0] =3D int128_getlo(rv); + env->hlpr[1] =3D int128_gethi(rv); +} + +void helper_csrw_i128(CPURISCVState *env, int csr, + target_ulong srcl, target_ulong srch) +{ + RISCVException ret =3D riscv_csrrw_i128(env, csr, NULL, + int128_make128(srcl, srch), + UINT128_MAX); + + if (ret !=3D RISCV_EXCP_NONE) { + riscv_raise_exception(env, ret, GETPC()); + } +} + +void helper_csrrw_i128(CPURISCVState *env, int csr, + target_ulong srcl, target_ulong srch, + target_ulong maskl, target_ulong maskh) +{ + Int128 rv =3D int128_zero(); + RISCVException ret =3D riscv_csrrw_i128(env, csr, &rv, + int128_make128(srcl, srch), + int128_make128(maskl, maskh)); + + if (ret !=3D RISCV_EXCP_NONE) { + riscv_raise_exception(env, ret, GETPC()); + } + + env->hlpr[0] =3D int128_getlo(rv); + env->hlpr[1] =3D int128_gethi(rv); +} + #ifndef CONFIG_USER_ONLY =20 target_ulong helper_sret(CPURISCVState *env, target_ulong cpu_pc_deb) --=20 2.33.0 From nobody Thu May 9 06:39:21 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; spf=pass (zohomail.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=univ-grenoble-alpes.fr Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1633557831994291.6385855701569; Wed, 6 Oct 2021 15:03:51 -0700 (PDT) Received: from localhost ([::1]:39732 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1mYF0w-0002Gz-R8 for importer@patchew.org; Wed, 06 Oct 2021 18:03:50 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:49836) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1mYEUa-0000IS-Cp; Wed, 06 Oct 2021 17:30:24 -0400 Received: from zm-mta-out-3.u-ga.fr ([152.77.200.56]:44130) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1mYEUX-0008RZ-RJ; Wed, 06 Oct 2021 17:30:24 -0400 Received: from mailhost.u-ga.fr (mailhost2.u-ga.fr [129.88.177.242]) by zm-mta-out-3.u-ga.fr (Postfix) with ESMTP id D608241EF7; Wed, 6 Oct 2021 23:29:44 +0200 (CEST) Received: from smtps.univ-grenoble-alpes.fr (smtps2.u-ga.fr [152.77.18.2]) by mailhost.u-ga.fr (Postfix) with ESMTP id C063460066; Wed, 6 Oct 2021 23:29:44 +0200 (CEST) Received: from palmier.tima.u-ga.fr (35.201.90.79.rev.sfr.net [79.90.201.35]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) (Authenticated sender: petrotf@univ-grenoble-alpes.fr) by smtps.univ-grenoble-alpes.fr (Postfix) with ESMTPSA id 8A67914005C; Wed, 6 Oct 2021 23:29:44 +0200 (CEST) From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20P=C3=A9trot?= To: qemu-devel@nongnu.org, qemu-riscv@nongnu.org Subject: [PATCH v2 24/27] target/riscv: modification of the trans_csrxx for 128-bit support Date: Wed, 6 Oct 2021 23:28:30 +0200 Message-Id: <20211006212833.108706-25-frederic.petrot@univ-grenoble-alpes.fr> X-Mailer: git-send-email 2.33.0 In-Reply-To: <20211006212833.108706-1-frederic.petrot@univ-grenoble-alpes.fr> References: <20211006212833.108706-1-frederic.petrot@univ-grenoble-alpes.fr> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable X-Greylist: Whitelist-UGA SMTP Authentifie (petrotf@univ-grenoble-alpes.fr) via submission-587 ACL (41) X-Greylist: Whitelist-UGA MAILHOST (SMTP non authentifie) depuis 152.77.18.2 Received-SPF: pass (zohomail.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; Received-SPF: pass client-ip=152.77.200.56; envelope-from=frederic.petrot@univ-grenoble-alpes.fr; helo=zm-mta-out-3.u-ga.fr X-Spam_score_int: -18 X-Spam_score: -1.9 X-Spam_bar: - X-Spam_report: (-1.9 / 5.0 requ) BAYES_00=-1.9, RCVD_IN_MSPIKE_H2=-0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action 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: bin.meng@windriver.com, richard.henderson@linaro.org, alistair.francis@wdc.com, fabien.portas@grenoble-inp.org, palmer@dabbelt.com, =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20P=C3=A9trot?= , philmd@redhat.com Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZM-MESSAGEID: 1633557834223100001 As opposed to the gen_arith and gen_shift generation helpers, the csr insns do not have a common prototype, so the choice to generate 32/64 or 128-bit helper calls is done in the trans_csrxx functions. Signed-off-by: Fr=C3=A9d=C3=A9ric P=C3=A9trot Co-authored-by: Fabien Portas --- target/riscv/insn_trans/trans_rvi.c.inc | 201 ++++++++++++++++++------ 1 file changed, 156 insertions(+), 45 deletions(-) diff --git a/target/riscv/insn_trans/trans_rvi.c.inc b/target/riscv/insn_tr= ans/trans_rvi.c.inc index 1a1defb102..7d09cdd89c 100644 --- a/target/riscv/insn_trans/trans_rvi.c.inc +++ b/target/riscv/insn_trans/trans_rvi.c.inc @@ -1087,20 +1087,74 @@ static bool do_csrrw(DisasContext *ctx, int rd, int= rc, TCGv src, TCGv mask) return do_csr_post(ctx); } =20 +static bool do_csrr_i128(DisasContext *ctx, int rd, int rc) +{ + TCGv_i32 csr =3D tcg_constant_i32(rc); + + if (tb_cflags(ctx->base.tb) & CF_USE_ICOUNT) { + gen_io_start(); + } + gen_helper_csrr_i128(cpu_env, csr); + gen_set_gpr(ctx, rd, cpu_hlpr[0]); + gen_set_gprh(ctx, rd, cpu_hlpr[1]); + return do_csr_post(ctx); +} + +static bool do_csrw_i128(DisasContext *ctx, int rc, TCGv srcl, TCGv srch) +{ + TCGv_i32 csr =3D tcg_constant_i32(rc); + + if (tb_cflags(ctx->base.tb) & CF_USE_ICOUNT) { + gen_io_start(); + } + gen_helper_csrw_i128(cpu_env, csr, srcl, srch); + return do_csr_post(ctx); +} + +static bool do_csrrw_i128(DisasContext *ctx, int rd, int rc, + TCGv srcl, TCGv srch, TCGv maskl, TCGv maskh) +{ + TCGv_i32 csr =3D tcg_constant_i32(rc); + + if (tb_cflags(ctx->base.tb) & CF_USE_ICOUNT) { + gen_io_start(); + } + gen_helper_csrrw_i128(cpu_env, csr, srcl, srch, maskl, maskh); + gen_set_gpr(ctx, rd, cpu_hlpr[0]); + gen_set_gprh(ctx, rd, cpu_hlpr[1]); + return do_csr_post(ctx); +} + static bool trans_csrrw(DisasContext *ctx, arg_csrrw *a) { - TCGv src =3D get_gpr(ctx, a->rs1, EXT_NONE); - - /* - * If rd =3D=3D 0, the insn shall not read the csr, nor cause any of t= he - * side effects that might occur on a csr read. - */ - if (a->rd =3D=3D 0) { - return do_csrw(ctx, a->csr, src); + if (!is_128bit(ctx)) { + TCGv src =3D get_gpr(ctx, a->rs1, EXT_NONE); + + /* + * If rd =3D=3D 0, the insn shall not read the csr, nor cause any = of the + * side effects that might occur on a csr read. + */ + if (a->rd =3D=3D 0) { + return do_csrw(ctx, a->csr, src); + } + + TCGv mask =3D tcg_constant_tl(-1); + return do_csrrw(ctx, a->rd, a->csr, src, mask); + } else { + TCGv srcl =3D get_gpr(ctx, a->rs1, EXT_NONE); + TCGv srch =3D get_gprh(ctx, a->rs1); + + /* + * If rd =3D=3D 0, the insn shall not read the csr, nor cause any = of the + * side effects that might occur on a csr read. + */ + if (a->rd =3D=3D 0) { + return do_csrw_i128(ctx, a->csr, srcl, srch); + } + + TCGv mask =3D tcg_constant_tl(-1); + return do_csrrw_i128(ctx, a->rd, a->csr, srcl, srch, mask, mask); } - - TCGv mask =3D tcg_constant_tl(-1); - return do_csrrw(ctx, a->rd, a->csr, src, mask); } =20 static bool trans_csrrs(DisasContext *ctx, arg_csrrs *a) @@ -1112,13 +1166,24 @@ static bool trans_csrrs(DisasContext *ctx, arg_csrr= s *a) * a zero value, the instruction will still attempt to write the * unmodified value back to the csr and will cause side effects. */ - if (a->rs1 =3D=3D 0) { - return do_csrr(ctx, a->rd, a->csr); + if (!is_128bit(ctx)) { + if (a->rs1 =3D=3D 0) { + return do_csrr(ctx, a->rd, a->csr); + } + + TCGv ones =3D tcg_constant_tl(-1); + TCGv mask =3D get_gpr(ctx, a->rs1, EXT_ZERO); + return do_csrrw(ctx, a->rd, a->csr, ones, mask); + } else { + if (a->rs1 =3D=3D 0) { + return do_csrr_i128(ctx, a->rd, a->csr); + } + + TCGv ones =3D tcg_constant_tl(-1); + TCGv maskl =3D get_gpr(ctx, a->rs1, EXT_ZERO); + TCGv maskh =3D get_gprh(ctx, a->rs1); + return do_csrrw_i128(ctx, a->rd, a->csr, ones, ones, maskl, maskh); } - - TCGv ones =3D tcg_constant_tl(-1); - TCGv mask =3D get_gpr(ctx, a->rs1, EXT_ZERO); - return do_csrrw(ctx, a->rd, a->csr, ones, mask); } =20 static bool trans_csrrc(DisasContext *ctx, arg_csrrc *a) @@ -1130,28 +1195,54 @@ static bool trans_csrrc(DisasContext *ctx, arg_csrr= c *a) * a zero value, the instruction will still attempt to write the * unmodified value back to the csr and will cause side effects. */ - if (a->rs1 =3D=3D 0) { - return do_csrr(ctx, a->rd, a->csr); + if (!is_128bit(ctx)) { + if (a->rs1 =3D=3D 0) { + return do_csrr(ctx, a->rd, a->csr); + } + + TCGv mask =3D get_gpr(ctx, a->rs1, EXT_ZERO); + return do_csrrw(ctx, a->rd, a->csr, ctx->zero, mask); + } else { + if (a->rs1 =3D=3D 0) { + return do_csrr_i128(ctx, a->rd, a->csr); + } + + TCGv maskl =3D get_gpr(ctx, a->rs1, EXT_ZERO); + TCGv maskh =3D get_gprh(ctx, a->rs1); + return do_csrrw_i128(ctx, a->rd, a->csr, + ctx->zero, ctx->zero, maskl, maskh); } - - TCGv mask =3D get_gpr(ctx, a->rs1, EXT_ZERO); - return do_csrrw(ctx, a->rd, a->csr, ctx->zero, mask); } =20 static bool trans_csrrwi(DisasContext *ctx, arg_csrrwi *a) { - TCGv src =3D tcg_constant_tl(a->rs1); - - /* - * If rd =3D=3D 0, the insn shall not read the csr, nor cause any of t= he - * side effects that might occur on a csr read. - */ - if (a->rd =3D=3D 0) { - return do_csrw(ctx, a->csr, src); + if (!is_128bit(ctx)) { + TCGv src =3D tcg_constant_tl(a->rs1); + + /* + * If rd =3D=3D 0, the insn shall not read the csr, nor cause any = of the + * side effects that might occur on a csr read. + */ + if (a->rd =3D=3D 0) { + return do_csrw(ctx, a->csr, src); + } + + TCGv mask =3D tcg_constant_tl(-1); + return do_csrrw(ctx, a->rd, a->csr, src, mask); + } else { + TCGv src =3D tcg_constant_tl(a->rs1); + + /* + * If rd =3D=3D 0, the insn shall not read the csr, nor cause any = of the + * side effects that might occur on a csr read. + */ + if (a->rd =3D=3D 0) { + return do_csrw_i128(ctx, a->csr, src, ctx->zero); + } + + TCGv mask =3D tcg_constant_tl(-1); + return do_csrrw_i128(ctx, a->rd, a->csr, src, ctx->zero, mask, mas= k); } - - TCGv mask =3D tcg_constant_tl(-1); - return do_csrrw(ctx, a->rd, a->csr, src, mask); } =20 static bool trans_csrrsi(DisasContext *ctx, arg_csrrsi *a) @@ -1163,16 +1254,26 @@ static bool trans_csrrsi(DisasContext *ctx, arg_csr= rsi *a) * a zero value, the instruction will still attempt to write the * unmodified value back to the csr and will cause side effects. */ - if (a->rs1 =3D=3D 0) { - return do_csrr(ctx, a->rd, a->csr); + if (!is_128bit(ctx)) { + if (a->rs1 =3D=3D 0) { + return do_csrr(ctx, a->rd, a->csr); + } + + TCGv ones =3D tcg_constant_tl(-1); + TCGv mask =3D tcg_constant_tl(a->rs1); + return do_csrrw(ctx, a->rd, a->csr, ones, mask); + } else { + if (a->rs1 =3D=3D 0) { + return do_csrr_i128(ctx, a->rd, a->csr); + } + + TCGv ones =3D tcg_constant_tl(-1); + TCGv mask =3D tcg_constant_tl(a->rs1); + return do_csrrw_i128(ctx, a->rd, a->csr, ones, ones, mask, ctx->ze= ro); } - - TCGv ones =3D tcg_constant_tl(-1); - TCGv mask =3D tcg_constant_tl(a->rs1); - return do_csrrw(ctx, a->rd, a->csr, ones, mask); } =20 -static bool trans_csrrci(DisasContext *ctx, arg_csrrci *a) +static bool trans_csrrci(DisasContext *ctx, arg_csrrci * a) { /* * If rs1 =3D=3D 0, the insn shall not write to the csr at all, nor @@ -1181,10 +1282,20 @@ static bool trans_csrrci(DisasContext *ctx, arg_csr= rci *a) * a zero value, the instruction will still attempt to write the * unmodified value back to the csr and will cause side effects. */ - if (a->rs1 =3D=3D 0) { - return do_csrr(ctx, a->rd, a->csr); + if (!is_128bit(ctx)) { + if (a->rs1 =3D=3D 0) { + return do_csrr(ctx, a->rd, a->csr); + } + + TCGv mask =3D tcg_constant_tl(a->rs1); + return do_csrrw(ctx, a->rd, a->csr, ctx->zero, mask); + } else { + if (a->rs1 =3D=3D 0) { + return do_csrr_i128(ctx, a->rd, a->csr); + } + + TCGv mask =3D tcg_constant_tl(a->rs1); + return do_csrrw_i128(ctx, a->rd, a->csr, + ctx->zero, ctx->zero, mask, ctx->zero); } - - TCGv mask =3D tcg_constant_tl(a->rs1); - return do_csrrw(ctx, a->rd, a->csr, ctx->zero, mask); } --=20 2.33.0 From nobody Thu May 9 06:39:21 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; spf=pass (zohomail.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=univ-grenoble-alpes.fr Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1633557456540771.5741821992859; Wed, 6 Oct 2021 14:57:36 -0700 (PDT) Received: from localhost ([::1]:53208 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1mYEut-0000ii-Bo for importer@patchew.org; Wed, 06 Oct 2021 17:57:35 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:49856) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1mYEUb-0000J9-0f; Wed, 06 Oct 2021 17:30:25 -0400 Received: from zm-mta-out-3.u-ga.fr ([152.77.200.56]:44128) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1mYEUX-0008RY-SI; Wed, 06 Oct 2021 17:30:24 -0400 Received: from mailhost.u-ga.fr (mailhost1.u-ga.fr [152.77.1.10]) by zm-mta-out-3.u-ga.fr (Postfix) with ESMTP id A93AF41F09; Wed, 6 Oct 2021 23:29:45 +0200 (CEST) Received: from smtps.univ-grenoble-alpes.fr (smtps2.u-ga.fr [152.77.18.2]) by mailhost.u-ga.fr (Postfix) with ESMTP id 9336060067; Wed, 6 Oct 2021 23:29:45 +0200 (CEST) Received: from palmier.tima.u-ga.fr (35.201.90.79.rev.sfr.net [79.90.201.35]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) (Authenticated sender: petrotf@univ-grenoble-alpes.fr) by smtps.univ-grenoble-alpes.fr (Postfix) with ESMTPSA id 5DC7014005C; Wed, 6 Oct 2021 23:29:45 +0200 (CEST) From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20P=C3=A9trot?= To: qemu-devel@nongnu.org, qemu-riscv@nongnu.org Subject: [PATCH v2 25/27] target/riscv: actual functions to realize crs 128-bit insns Date: Wed, 6 Oct 2021 23:28:31 +0200 Message-Id: <20211006212833.108706-26-frederic.petrot@univ-grenoble-alpes.fr> X-Mailer: git-send-email 2.33.0 In-Reply-To: <20211006212833.108706-1-frederic.petrot@univ-grenoble-alpes.fr> References: <20211006212833.108706-1-frederic.petrot@univ-grenoble-alpes.fr> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable X-Greylist: Whitelist-UGA SMTP Authentifie (petrotf@univ-grenoble-alpes.fr) via submission-587 ACL (41) X-Greylist: Whitelist-UGA MAILHOST (SMTP non authentifie) depuis 152.77.18.2 Received-SPF: pass (zohomail.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; Received-SPF: pass client-ip=152.77.200.56; envelope-from=frederic.petrot@univ-grenoble-alpes.fr; helo=zm-mta-out-3.u-ga.fr X-Spam_score_int: -18 X-Spam_score: -1.9 X-Spam_bar: - X-Spam_report: (-1.9 / 5.0 requ) BAYES_00=-1.9, RCVD_IN_MSPIKE_H2=-0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action 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: bin.meng@windriver.com, richard.henderson@linaro.org, alistair.francis@wdc.com, fabien.portas@grenoble-inp.org, palmer@dabbelt.com, =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20P=C3=A9trot?= , philmd@redhat.com Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZM-MESSAGEID: 1633557457852100001 The csrs are accessed through function pointers: we set-up the table for the 128-bit accesses, make the stub a function that does what it should, and implement basic accesses on read-only csrs. Signed-off-by: Fr=C3=A9d=C3=A9ric P=C3=A9trot Co-authored-by: Fabien Portas --- target/riscv/cpu.h | 16 +++++ target/riscv/csr.c | 152 ++++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 165 insertions(+), 3 deletions(-) diff --git a/target/riscv/cpu.h b/target/riscv/cpu.h index 911fdc4ecf..8a28b69a1b 100644 --- a/target/riscv/cpu.h +++ b/target/riscv/cpu.h @@ -510,6 +510,15 @@ RISCVException riscv_csrrw_i128(CPURISCVState *env, in= t csrno, Int128 *ret_value, Int128 new_value, Int128 write_mask); =20 +typedef RISCVException (*riscv_csr_read128_fn)(CPURISCVState *env, int csr= no, + Int128 *ret_value); +typedef RISCVException (*riscv_csr_write128_fn)(CPURISCVState *env, int cs= rno, + Int128 new_value); +typedef RISCVException (*riscv_csr_op128_fn)(CPURISCVState *env, int csrno, + Int128 *ret_value, + Int128 new_value, + Int128 write_mask); + typedef struct { const char *name; riscv_csr_predicate_fn predicate; @@ -518,6 +527,12 @@ typedef struct { riscv_csr_op_fn op; } riscv_csr_operations; =20 +typedef struct { + riscv_csr_read128_fn read128; + riscv_csr_write128_fn write128; + riscv_csr_op128_fn op128; +} riscv_csr_operations128; + /* CSR function table constants */ enum { CSR_TABLE_SIZE =3D 0x1000 @@ -525,6 +540,7 @@ enum { =20 /* CSR function table */ extern riscv_csr_operations csr_ops[CSR_TABLE_SIZE]; +extern riscv_csr_operations128 csr_ops_128[CSR_TABLE_SIZE]; =20 void riscv_get_csr_ops(int csrno, riscv_csr_operations *ops); void riscv_set_csr_ops(int csrno, riscv_csr_operations *ops); diff --git a/target/riscv/csr.c b/target/riscv/csr.c index 9529119238..6ebc03f89b 100644 --- a/target/riscv/csr.c +++ b/target/riscv/csr.c @@ -462,6 +462,13 @@ static const char valid_vm_1_10_64[16] =3D { }; =20 /* Machine Information Registers */ +static RISCVException read_zero_i128(CPURISCVState *env, int csrno, + Int128 *val) +{ + *val =3D int128_zero(); + return RISCV_EXCP_NONE; +} + static RISCVException read_zero(CPURISCVState *env, int csrno, target_ulong *val) { @@ -469,6 +476,13 @@ static RISCVException read_zero(CPURISCVState *env, in= t csrno, return RISCV_EXCP_NONE; } =20 +static RISCVException read_mhartid_i128(CPURISCVState *env, int csrno, + Int128 *val) +{ + *val =3D int128_make64(env->mhartid); + return RISCV_EXCP_NONE; +} + static RISCVException read_mhartid(CPURISCVState *env, int csrno, target_ulong *val) { @@ -554,6 +568,13 @@ static RISCVException write_mstatush(CPURISCVState *en= v, int csrno, return RISCV_EXCP_NONE; } =20 +static RISCVException read_misa_i128(CPURISCVState *env, int csrno, + Int128 *val) +{ + *val =3D int128_make128(env->misa, env->misah); + return RISCV_EXCP_NONE; +} + static RISCVException read_misa(CPURISCVState *env, int csrno, target_ulong *val) { @@ -1492,11 +1513,118 @@ RISCVException riscv_csrrw(CPURISCVState *env, int= csrno, return RISCV_EXCP_NONE; } =20 +static inline RISCVException riscv_csrrw_check_i128(CPURISCVState *env, + int csrno, + Int128 write_mask, + RISCVCPU *cpu) +{ + /* check privileges and return -1 if check fails */ +#if !defined(CONFIG_USER_ONLY) + int effective_priv =3D env->priv; + int read_only =3D get_field(csrno, 0xc00) =3D=3D 3; + + if (riscv_has_ext(env, RVH) && + env->priv =3D=3D PRV_S && + !riscv_cpu_virt_enabled(env)) { + /* + * We are in S mode without virtualisation, therefore we are in HS= Mode. + * Add 1 to the effective privledge level to allow us to access the + * Hypervisor CSRs. + */ + effective_priv++; + } + + if ((int128_nz(write_mask) && read_only) || + (!env->debugger && (effective_priv < get_field(csrno, 0x300)))) { + return RISCV_EXCP_ILLEGAL_INST; + } +#endif + + /* ensure the CSR extension is enabled. */ + if (!cpu->cfg.ext_icsr) { + return RISCV_EXCP_ILLEGAL_INST; + } + + /* check predicate */ + if (!csr_ops[csrno].predicate) { + return RISCV_EXCP_ILLEGAL_INST; + } + RISCVException ret =3D csr_ops[csrno].predicate(env, csrno); + if (ret !=3D RISCV_EXCP_NONE) { + return ret; + } + + return RISCV_EXCP_NONE; +} + RISCVException riscv_csrrw_i128(CPURISCVState *env, int csrno, - Int128 *ret_value, - Int128 new_value, Int128 write_mask) + Int128 *ret_value, + Int128 new_value, Int128 write_mask) { - return RISCV_EXCP_ILLEGAL_INST; + RISCVException ret; + Int128 old_value; + + RISCVCPU *cpu =3D env_archcpu(env); + + if (!csr_ops_128[csrno].read128 && !csr_ops_128[csrno].op128) { + /* + * FIXME: Fall back to 64-bit version for now, if the 128-bit + * alternative isn't defined. + * Note, some CSRs don't extend to MXLEN, for those, + * this fallback is correctly handling the read/write. + */ + target_ulong ret_64; + ret =3D riscv_csrrw(env, csrno, &ret_64, + int128_getlo(new_value), + int128_getlo(write_mask)); + + if (ret_value) { + *ret_value =3D int128_make64(ret_64); + } + + return ret; + } + + RISCVException check_status =3D + riscv_csrrw_check_i128(env, csrno, write_mask, cpu); + if (check_status !=3D RISCV_EXCP_NONE) { + return check_status; + } + + /* execute combined read/write operation if it exists */ + if (csr_ops_128[csrno].op128) { + return csr_ops_128[csrno].op128(env, csrno, ret_value, + new_value, write_mask); + } + + /* if no accessor exists then return failure */ + if (!csr_ops_128[csrno].read128) { + return RISCV_EXCP_ILLEGAL_INST; + } + /* read old value */ + ret =3D csr_ops_128[csrno].read128(env, csrno, &old_value); + if (ret !=3D RISCV_EXCP_NONE) { + return ret; + } + + /* write value if writable and write mask set, otherwise drop writes */ + if (int128_nz(write_mask)) { + new_value =3D int128_or(int128_and(old_value, int128_not(write_mas= k)), + int128_and(new_value, write_mask)); + if (csr_ops_128[csrno].write128) { + ret =3D csr_ops_128[csrno].write128(env, csrno, new_value); + if (ret !=3D RISCV_EXCP_NONE) { + return ret; + } + } + } + + /* return old value */ + if (ret_value) { + *ret_value =3D old_value; + } + + return RISCV_EXCP_NONE; } =20 /* @@ -1520,6 +1648,24 @@ RISCVException riscv_csrrw_debug(CPURISCVState *env,= int csrno, } =20 /* Control and Status Register function table */ +riscv_csr_operations128 csr_ops_128[CSR_TABLE_SIZE] =3D { +#if !defined(CONFIG_USER_ONLY) + [CSR_MVENDORID] =3D { read_zero_i128 }, + [CSR_MARCHID] =3D { read_zero_i128 }, + [CSR_MIMPID] =3D { read_zero_i128 }, + [CSR_MHARTID] =3D { read_mhartid_i128 }, + + [CSR_MSTATUS] =3D { read_zero_i128 }, + [CSR_MISA] =3D { read_misa_i128 }, + [CSR_MTVEC] =3D { read_zero_i128 }, + + [CSR_MSCRATCH] =3D { read_zero_i128 }, + [CSR_MEPC] =3D { read_zero_i128 }, + + [CSR_SATP] =3D { read_zero_i128 }, +#endif +}; + riscv_csr_operations csr_ops[CSR_TABLE_SIZE] =3D { /* User Floating-Point CSRs */ [CSR_FFLAGS] =3D { "fflags", fs, read_fflags, write_fflags }, --=20 2.33.0 From nobody Thu May 9 06:39:21 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; spf=pass (zohomail.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=univ-grenoble-alpes.fr Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1633557745953746.8490914113112; Wed, 6 Oct 2021 15:02:25 -0700 (PDT) Received: from localhost ([::1]:35568 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1mYEzY-0007ul-PS for importer@patchew.org; Wed, 06 Oct 2021 18:02:24 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:49872) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1mYEUb-0000K5-T1; Wed, 06 Oct 2021 17:30:31 -0400 Received: from zm-mta-out-3.u-ga.fr ([152.77.200.56]:44138) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1mYEUZ-0008SE-9r; Wed, 06 Oct 2021 17:30:25 -0400 Received: from mailhost.u-ga.fr (mailhost2.u-ga.fr [129.88.177.242]) by zm-mta-out-3.u-ga.fr (Postfix) with ESMTP id 9585541F1B; Wed, 6 Oct 2021 23:29:46 +0200 (CEST) Received: from smtps.univ-grenoble-alpes.fr (smtps2.u-ga.fr [152.77.18.2]) by mailhost.u-ga.fr (Postfix) with ESMTP id 7FFD660066; Wed, 6 Oct 2021 23:29:46 +0200 (CEST) Received: from palmier.tima.u-ga.fr (35.201.90.79.rev.sfr.net [79.90.201.35]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) (Authenticated sender: petrotf@univ-grenoble-alpes.fr) by smtps.univ-grenoble-alpes.fr (Postfix) with ESMTPSA id 4AB5A14005C; Wed, 6 Oct 2021 23:29:46 +0200 (CEST) From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20P=C3=A9trot?= To: qemu-devel@nongnu.org, qemu-riscv@nongnu.org Subject: [PATCH v2 26/27] target/riscv: adding 128-bit access functions for some csrs Date: Wed, 6 Oct 2021 23:28:32 +0200 Message-Id: <20211006212833.108706-27-frederic.petrot@univ-grenoble-alpes.fr> X-Mailer: git-send-email 2.33.0 In-Reply-To: <20211006212833.108706-1-frederic.petrot@univ-grenoble-alpes.fr> References: <20211006212833.108706-1-frederic.petrot@univ-grenoble-alpes.fr> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable X-Greylist: Whitelist-UGA SMTP Authentifie (petrotf@univ-grenoble-alpes.fr) via submission-587 ACL (41) X-Greylist: Whitelist-UGA MAILHOST (SMTP non authentifie) depuis 152.77.18.2 Received-SPF: pass (zohomail.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; Received-SPF: pass client-ip=152.77.200.56; envelope-from=frederic.petrot@univ-grenoble-alpes.fr; helo=zm-mta-out-3.u-ga.fr X-Spam_score_int: -18 X-Spam_score: -1.9 X-Spam_bar: - X-Spam_report: (-1.9 / 5.0 requ) BAYES_00=-1.9, RCVD_IN_MSPIKE_H2=-0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action 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: bin.meng@windriver.com, richard.henderson@linaro.org, alistair.francis@wdc.com, fabien.portas@grenoble-inp.org, palmer@dabbelt.com, =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20P=C3=A9trot?= , philmd@redhat.com Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZM-MESSAGEID: 1633557748245100001 Access to mstatus, mtvec, mscratch and mepc is implemented. Signed-off-by: Fr=C3=A9d=C3=A9ric P=C3=A9trot Co-authored-by: Fabien Portas --- target/riscv/cpu_bits.h | 1 + target/riscv/csr.c | 111 ++++++++++++++++++++++++++++++++++++++-- 2 files changed, 108 insertions(+), 4 deletions(-) diff --git a/target/riscv/cpu_bits.h b/target/riscv/cpu_bits.h index 999187a9ee..553b0a3d71 100644 --- a/target/riscv/cpu_bits.h +++ b/target/riscv/cpu_bits.h @@ -360,6 +360,7 @@ =20 #define MSTATUS32_SD 0x80000000 #define MSTATUS64_SD 0x8000000000000000ULL +#define MSTATUSH128_SD 0x8000000000000000ULL =20 #define MISA32_MXL 0xC0000000 #define MISA64_MXL 0xC000000000000000ULL diff --git a/target/riscv/csr.c b/target/riscv/csr.c index 6ebc03f89b..a9146a4496 100644 --- a/target/riscv/csr.c +++ b/target/riscv/csr.c @@ -491,6 +491,61 @@ static RISCVException read_mhartid(CPURISCVState *env,= int csrno, } =20 /* Machine Trap Setup */ +static RISCVException read_mstatus_i128(CPURISCVState *env, int csrno, + Int128 *val) +{ + *val =3D int128_make128(env->mstatus, env->mstatush); + return RISCV_EXCP_NONE; +} + +static RISCVException write_mstatus_i128(CPURISCVState *env, int csrno, + Int128 val) +{ + Int128 mstatus =3D int128_make128(env->mstatus, env->mstatush); + Int128 mask =3D int128_zero(); + int dirty; + + /* flush tlb on mstatus fields that affect VM */ + if (int128_getlo(int128_xor(mstatus, val)) + & (MSTATUS_MXR | MSTATUS_MPP | MSTATUS_MPV | + MSTATUS_MPRV | MSTATUS_SUM)) { + tlb_flush(env_cpu(env)); + } + mask =3D int128_make64(MSTATUS_SIE | MSTATUS_SPIE | + MSTATUS_MIE | MSTATUS_MPIE | + MSTATUS_SPP | MSTATUS_FS | MSTATUS_MPRV | MSTATUS= _SUM | + MSTATUS_MPP | MSTATUS_MXR | MSTATUS_TVM | MSTATUS= _TSR | + MSTATUS_TW); + + if (!riscv_cpu_is_32bit(env)) { + /* + * RV32: MPV and GVA are not in mstatus. The current plan is to + * add them to mstatush. For now, we just don't support it. + */ + mask =3D int128_or(mask, int128_make64(MSTATUS_MPV | MSTATUS_GVA)); + } + + mstatus =3D int128_or(int128_and(mstatus, int128_not(mask)), + int128_and(val, mask)); + + dirty =3D ((int128_getlo(mstatus) & MSTATUS_FS) =3D=3D MSTATUS_FS) | + ((int128_getlo(mstatus) & MSTATUS_XS) =3D=3D MSTATUS_XS); + if (dirty) { + if (riscv_cpu_is_32bit(env)) { + mstatus =3D int128_make64(int128_getlo(mstatus) | MSTATUS32_SD= ); + } else if (riscv_cpu_is_64bit(env)) { + mstatus =3D int128_make64(int128_getlo(mstatus) | MSTATUS64_SD= ); + } else { + mstatus =3D int128_or(mstatus, int128_make128(0, MSTATUSH128_S= D)); + } + } + + env->mstatus =3D int128_getlo(mstatus); + env->mstatush =3D int128_gethi(mstatus); + + return RISCV_EXCP_NONE; +} + static RISCVException read_mstatus(CPURISCVState *env, int csrno, target_ulong *val) { @@ -684,6 +739,26 @@ static RISCVException write_mie(CPURISCVState *env, in= t csrno, return RISCV_EXCP_NONE; } =20 +static RISCVException read_mtvec_i128(CPURISCVState *env, int csrno, + Int128 *val) +{ + *val =3D int128_make128(env->mtvec, env->mtvech); + return RISCV_EXCP_NONE; +} + +static RISCVException write_mtvec_i128(CPURISCVState *env, int csrno, + Int128 val) +{ + /* bits [1:0] encode mode; 0 =3D direct, 1 =3D vectored, 2 >=3D reserv= ed */ + if ((int128_getlo(val) & 3) < 2) { + env->mtvec =3D int128_getlo(val); + env->mtvech =3D int128_gethi(val); + } else { + qemu_log_mask(LOG_UNIMP, "CSR_MTVEC: reserved mode not supported\n= "); + } + return RISCV_EXCP_NONE; +} + static RISCVException read_mtvec(CPURISCVState *env, int csrno, target_ulong *val) { @@ -718,6 +793,19 @@ static RISCVException write_mcounteren(CPURISCVState *= env, int csrno, } =20 /* Machine Trap Handling */ +static RISCVException read_mscratch_i128(CPURISCVState *env, int csrno, + Int128 *val) { + *val =3D int128_make128(env->mscratch, env->mscratchh); + return RISCV_EXCP_NONE; +} + +static RISCVException write_mscratch_i128(CPURISCVState *env, int csrno, + Int128 val) { + env->mscratch =3D int128_getlo(val); + env->mscratchh =3D int128_gethi(val); + return RISCV_EXCP_NONE; +} + static RISCVException read_mscratch(CPURISCVState *env, int csrno, target_ulong *val) { @@ -732,6 +820,21 @@ static RISCVException write_mscratch(CPURISCVState *en= v, int csrno, return RISCV_EXCP_NONE; } =20 +static RISCVException read_mepc_i128(CPURISCVState *env, int csrno, + Int128 *val) +{ + *val =3D int128_make128(env->mepc, env->mepch); + return RISCV_EXCP_NONE; +} + +static RISCVException write_mepc_i128(CPURISCVState *env, int csrno, + Int128 val) +{ + env->mepc =3D int128_getlo(val); + env->mepch =3D int128_gethi(val); + return RISCV_EXCP_NONE; +} + static RISCVException read_mepc(CPURISCVState *env, int csrno, target_ulong *val) { @@ -1655,12 +1758,12 @@ riscv_csr_operations128 csr_ops_128[CSR_TABLE_SIZE]= =3D { [CSR_MIMPID] =3D { read_zero_i128 }, [CSR_MHARTID] =3D { read_mhartid_i128 }, =20 - [CSR_MSTATUS] =3D { read_zero_i128 }, + [CSR_MSTATUS] =3D { read_mstatus_i128, write_mstatus_i128 }, [CSR_MISA] =3D { read_misa_i128 }, - [CSR_MTVEC] =3D { read_zero_i128 }, + [CSR_MTVEC] =3D { read_mtvec_i128, write_mtvec_i128 }, =20 - [CSR_MSCRATCH] =3D { read_zero_i128 }, - [CSR_MEPC] =3D { read_zero_i128 }, + [CSR_MSCRATCH] =3D { read_mscratch_i128, write_mscratch_i128 }, + [CSR_MEPC] =3D { read_mepc_i128, write_mepc_i128 }, =20 [CSR_SATP] =3D { read_zero_i128 }, #endif --=20 2.33.0 From nobody Thu May 9 06:39:21 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; spf=pass (zohomail.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=univ-grenoble-alpes.fr Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1633557660340361.6661514510588; Wed, 6 Oct 2021 15:01:00 -0700 (PDT) Received: from localhost ([::1]:33636 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1mYEyB-0006Yr-5g for importer@patchew.org; Wed, 06 Oct 2021 18:00:59 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:49874) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1mYEUd-0000Kx-JR; Wed, 06 Oct 2021 17:30:31 -0400 Received: from zm-mta-out-3.u-ga.fr ([152.77.200.56]:44136) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1mYEUZ-0008SF-9z; Wed, 06 Oct 2021 17:30:26 -0400 Received: from mailhost.u-ga.fr (mailhost2.u-ga.fr [129.88.177.242]) by zm-mta-out-3.u-ga.fr (Postfix) with ESMTP id 7398841F28; Wed, 6 Oct 2021 23:29:47 +0200 (CEST) Received: from smtps.univ-grenoble-alpes.fr (smtps2.u-ga.fr [152.77.18.2]) by mailhost.u-ga.fr (Postfix) with ESMTP id 5DA0560066; Wed, 6 Oct 2021 23:29:47 +0200 (CEST) Received: from palmier.tima.u-ga.fr (35.201.90.79.rev.sfr.net [79.90.201.35]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) (Authenticated sender: petrotf@univ-grenoble-alpes.fr) by smtps.univ-grenoble-alpes.fr (Postfix) with ESMTPSA id 26D3314005C; Wed, 6 Oct 2021 23:29:47 +0200 (CEST) From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20P=C3=A9trot?= To: qemu-devel@nongnu.org, qemu-riscv@nongnu.org Subject: [PATCH v2 27/27] target/riscv: support for 128-bit satp Date: Wed, 6 Oct 2021 23:28:33 +0200 Message-Id: <20211006212833.108706-28-frederic.petrot@univ-grenoble-alpes.fr> X-Mailer: git-send-email 2.33.0 In-Reply-To: <20211006212833.108706-1-frederic.petrot@univ-grenoble-alpes.fr> References: <20211006212833.108706-1-frederic.petrot@univ-grenoble-alpes.fr> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable X-Greylist: Whitelist-UGA SMTP Authentifie (petrotf@univ-grenoble-alpes.fr) via submission-587 ACL (41) X-Greylist: Whitelist-UGA MAILHOST (SMTP non authentifie) depuis 152.77.18.2 Received-SPF: pass (zohomail.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; Received-SPF: pass client-ip=152.77.200.56; envelope-from=frederic.petrot@univ-grenoble-alpes.fr; helo=zm-mta-out-3.u-ga.fr X-Spam_score_int: -18 X-Spam_score: -1.9 X-Spam_bar: - X-Spam_report: (-1.9 / 5.0 requ) BAYES_00=-1.9, RCVD_IN_MSPIKE_H2=-0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action 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: bin.meng@windriver.com, richard.henderson@linaro.org, alistair.francis@wdc.com, fabien.portas@grenoble-inp.org, palmer@dabbelt.com, =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20P=C3=A9trot?= , philmd@redhat.com Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZM-MESSAGEID: 1633557661746100001 Support for a 128-bit satp. This is a bit more involved than necessary because we took the opportunity to increase the page size to 16kB, and change the page table geometry, which makes the page walk a bit more parametrizable (variables instead of defines). Note that is anyway a necessary step for the merging of the 32-bit and 64-bit riscv versions in a single executable. Signed-off-by: Fr=C3=A9d=C3=A9ric P=C3=A9trot Co-authored-by: Fabien Portas --- target/riscv/cpu-param.h | 9 ++++- target/riscv/cpu_bits.h | 10 +++++ target/riscv/cpu_helper.c | 54 +++++++++++++++++++-------- target/riscv/csr.c | 77 +++++++++++++++++++++++++++++++++++++-- 4 files changed, 130 insertions(+), 20 deletions(-) diff --git a/target/riscv/cpu-param.h b/target/riscv/cpu-param.h index c10459b56f..78f0916403 100644 --- a/target/riscv/cpu-param.h +++ b/target/riscv/cpu-param.h @@ -19,10 +19,15 @@ #else /* 64-bit target, since QEMU isn't built to have TARGET_LONG_BITS over 64 = */ # define TARGET_LONG_BITS 64 -# define TARGET_PHYS_ADDR_SPACE_BITS 56 /* 44-bit PPN */ -# define TARGET_VIRT_ADDR_SPACE_BITS 48 /* sv48 */ +# define TARGET_PHYS_ADDR_SPACE_BITS 64 /* 54-bit PPN */ +# define TARGET_VIRT_ADDR_SPACE_BITS 44 /* sv44 */ #endif + +#if defined(TARGET_RISCV32) || defined(TARGET_RISCV64) #define TARGET_PAGE_BITS 12 /* 4 KiB Pages */ +#else +#define TARGET_PAGE_BITS 14 /* 16 KiB pages for RV128 */ +#endif /* * The current MMU Modes are: * - U mode 0b000 diff --git a/target/riscv/cpu_bits.h b/target/riscv/cpu_bits.h index 553b0a3d71..a4f6ba927f 100644 --- a/target/riscv/cpu_bits.h +++ b/target/riscv/cpu_bits.h @@ -428,6 +428,11 @@ #define SATP64_ASID 0x0FFFF00000000000ULL #define SATP64_PPN 0x00000FFFFFFFFFFFULL =20 +/* RV128 satp CSR field masks (H/L for high/low dword) */ +#define SATP128_HMODE 0xFF00000000000000ULL +#define SATP128_HASID 0x00FFFFFFFF000000ULL +#define SATP128_LPPN 0x0003FFFFFFFFFFFFULL + /* VM modes (mstatus.vm) privileged ISA 1.9.1 */ #define VM_1_09_MBARE 0 #define VM_1_09_MBB 1 @@ -443,6 +448,9 @@ #define VM_1_10_SV48 9 #define VM_1_10_SV57 10 #define VM_1_10_SV64 11 +#define VM_1_10_SV44 12 +#define VM_1_10_SV54 13 + =20 /* Page table entry (PTE) fields */ #define PTE_V 0x001 /* Valid */ @@ -460,6 +468,8 @@ =20 /* Leaf page shift amount */ #define PGSHIFT 12 +/* For now, pages in RV128 are 16 KiB. */ +#define PGSHIFT128 14 =20 /* Default Reset Vector adress */ #define DEFAULT_RSTVEC 0x1000 diff --git a/target/riscv/cpu_helper.c b/target/riscv/cpu_helper.c index d41d5cd27c..55dea1f58b 100644 --- a/target/riscv/cpu_helper.c +++ b/target/riscv/cpu_helper.c @@ -391,7 +391,7 @@ static int get_physical_address(CPURISCVState *env, hwa= ddr *physical, *prot =3D 0; =20 hwaddr base; - int levels, ptidxbits, ptesize, vm, sum, mxr, widened; + int levels, ptidxbits, ptesize, vm, sum, mxr, widened, pgshift; =20 if (first_stage =3D=3D true) { mxr =3D get_field(env->mstatus, MSTATUS_MXR); @@ -404,17 +404,25 @@ static int get_physical_address(CPURISCVState *env, h= waddr *physical, if (riscv_cpu_is_32bit(env)) { base =3D (hwaddr)get_field(env->vsatp, SATP32_PPN) << PGSH= IFT; vm =3D get_field(env->vsatp, SATP32_MODE); - } else { + } else if (riscv_cpu_is_64bit(env)) { base =3D (hwaddr)get_field(env->vsatp, SATP64_PPN) << PGSH= IFT; vm =3D get_field(env->vsatp, SATP64_MODE); + } else { + /* TODO : Hypervisor extension not supported yet in RV128.= */ + g_assert_not_reached(); } } else { if (riscv_cpu_is_32bit(env)) { base =3D (hwaddr)get_field(env->satp, SATP32_PPN) << PGSHI= FT; vm =3D get_field(env->satp, SATP32_MODE); - } else { + } else if (riscv_cpu_is_64bit(env)) { base =3D (hwaddr)get_field(env->satp, SATP64_PPN) << PGSHI= FT; vm =3D get_field(env->satp, SATP64_MODE); + } else if (riscv_cpu_is_128bit(env)) { + base =3D (hwaddr)get_field(env->satp, SATP128_LPPN) << PGS= HIFT128; + vm =3D get_field(env->satph, SATP128_HMODE); + } else { + g_assert_not_reached(); } } widened =3D 0; @@ -422,9 +430,15 @@ static int get_physical_address(CPURISCVState *env, hw= addr *physical, if (riscv_cpu_is_32bit(env)) { base =3D (hwaddr)get_field(env->hgatp, SATP32_PPN) << PGSHIFT; vm =3D get_field(env->hgatp, SATP32_MODE); - } else { + } else if (riscv_cpu_is_64bit(env)) { base =3D (hwaddr)get_field(env->hgatp, SATP64_PPN) << PGSHIFT; vm =3D get_field(env->hgatp, SATP64_MODE); + } else { + /* + * TODO : Hypervisor extension not supported yet in RV128, + * so there shouldn't be any two-stage address lookups. + */ + g_assert_not_reached(); } widened =3D 2; } @@ -432,13 +446,17 @@ static int get_physical_address(CPURISCVState *env, h= waddr *physical, sum =3D get_field(env->mstatus, MSTATUS_SUM) || use_background || is_d= ebug; switch (vm) { case VM_1_10_SV32: - levels =3D 2; ptidxbits =3D 10; ptesize =3D 4; break; + levels =3D 2; ptidxbits =3D 10; ptesize =3D 4; pgshift =3D 12; break; case VM_1_10_SV39: - levels =3D 3; ptidxbits =3D 9; ptesize =3D 8; break; + levels =3D 3; ptidxbits =3D 9; ptesize =3D 8; pgshift =3D 12; break; case VM_1_10_SV48: - levels =3D 4; ptidxbits =3D 9; ptesize =3D 8; break; + levels =3D 4; ptidxbits =3D 9; ptesize =3D 8; pgshift =3D 12; break; case VM_1_10_SV57: - levels =3D 5; ptidxbits =3D 9; ptesize =3D 8; break; + levels =3D 5; ptidxbits =3D 9; ptesize =3D 8; pgshift =3D 12; break; + case VM_1_10_SV44: + levels =3D 3; ptidxbits =3D 10; ptesize =3D 16; pgshift =3D 14; brea= k; + case VM_1_10_SV54: + levels =3D 4; ptidxbits =3D 10; ptesize =3D 16; pgshift =3D 14; bre= ak; case VM_1_10_MBARE: *physical =3D addr; *prot =3D PAGE_READ | PAGE_WRITE | PAGE_EXEC; @@ -448,7 +466,7 @@ static int get_physical_address(CPURISCVState *env, hwa= ddr *physical, } =20 CPUState *cs =3D env_cpu(env); - int va_bits =3D PGSHIFT + levels * ptidxbits + widened; + int va_bits =3D pgshift + levels * ptidxbits + widened; target_ulong mask, masked_msbs; =20 if (TARGET_LONG_BITS > (va_bits - 1)) { @@ -463,6 +481,7 @@ static int get_physical_address(CPURISCVState *env, hwa= ddr *physical, } =20 int ptshift =3D (levels - 1) * ptidxbits; + uint64_t pgoff_mask =3D (1ULL << pgshift) - 1; int i; =20 #if !TCG_OVERSIZED_GUEST @@ -471,10 +490,10 @@ restart: for (i =3D 0; i < levels; i++, ptshift -=3D ptidxbits) { target_ulong idx; if (i =3D=3D 0) { - idx =3D (addr >> (PGSHIFT + ptshift)) & + idx =3D (addr >> (pgshift + ptshift)) & ((1 << (ptidxbits + widened)) - 1); } else { - idx =3D (addr >> (PGSHIFT + ptshift)) & + idx =3D (addr >> (pgshift + ptshift)) & ((1 << ptidxbits) - 1); } =20 @@ -482,6 +501,7 @@ restart: hwaddr pte_addr; =20 if (two_stage && first_stage) { + /* TODO : Two-stage translation for RV128 */ int vbase_prot; hwaddr vbase; =20 @@ -515,6 +535,10 @@ restart: if (riscv_cpu_is_32bit(env)) { pte =3D address_space_ldl(cs->as, pte_addr, attrs, &res); } else { + /* + * For RV128, load only lower 64 bits as only those + * are used for now + */ pte =3D address_space_ldq(cs->as, pte_addr, attrs, &res); } =20 @@ -529,7 +553,7 @@ restart: return TRANSLATE_FAIL; } else if (!(pte & (PTE_R | PTE_W | PTE_X))) { /* Inner PTE, continue walking */ - base =3D ppn << PGSHIFT; + base =3D ppn << pgshift; } else if ((pte & (PTE_R | PTE_W | PTE_X)) =3D=3D PTE_W) { /* Reserved leaf PTE flags: PTE_W */ return TRANSLATE_FAIL; @@ -601,9 +625,9 @@ restart: =20 /* for superpage mappings, make a fake leaf PTE for the TLB's benefit. */ - target_ulong vpn =3D addr >> PGSHIFT; - *physical =3D ((ppn | (vpn & ((1L << ptshift) - 1))) << PGSHIF= T) | - (addr & ~TARGET_PAGE_MASK); + target_ulong vpn =3D addr >> pgshift; + *physical =3D ((ppn | (vpn & ((1L << ptshift) - 1))) << pgshif= t) | + (addr & pgoff_mask); =20 /* set permissions on the TLB entry */ if ((pte & PTE_R) || ((pte & PTE_X) && mxr)) { diff --git a/target/riscv/csr.c b/target/riscv/csr.c index a9146a4496..3a6bc02571 100644 --- a/target/riscv/csr.c +++ b/target/riscv/csr.c @@ -461,6 +461,12 @@ static const char valid_vm_1_10_64[16] =3D { [VM_1_10_SV57] =3D 1 }; =20 +static const bool valid_vm_1_10_128[16] =3D { + [VM_1_10_MBARE] =3D 1, + [VM_1_10_SV44] =3D 1, + [VM_1_10_SV54] =3D 1 +}; + /* Machine Information Registers */ static RISCVException read_zero_i128(CPURISCVState *env, int csrno, Int128 *val) @@ -557,8 +563,12 @@ static int validate_vm(CPURISCVState *env, target_ulon= g vm) { if (riscv_cpu_is_32bit(env)) { return valid_vm_1_10_32[vm & 0xf]; - } else { + } else if (riscv_cpu_is_64bit(env)) { return valid_vm_1_10_64[vm & 0xf]; + } else if (riscv_cpu_is_128bit(env)) { + return valid_vm_1_10_128[vm & 0xf]; + } else { + return 0; } } =20 @@ -1090,6 +1100,67 @@ static RISCVException rmw_sip(CPURISCVState *env, in= t csrno, } =20 /* Supervisor Protection and Translation */ +static RISCVException read_satp_i128(CPURISCVState *env, int csrno, + Int128 *val) +{ + if (!riscv_feature(env, RISCV_FEATURE_MMU)) { + *val =3D int128_zero(); + return RISCV_EXCP_NONE; + } + + if (env->priv =3D=3D PRV_S && get_field(env->mstatus, MSTATUS_TVM)) { + return RISCV_EXCP_ILLEGAL_INST; + } else { + *val =3D int128_make128(env->satp, env->satph); + } + + return RISCV_EXCP_NONE; +} + +static RISCVException write_satp_i128(CPURISCVState *env, int csrno, + Int128 val) +{ + uint32_t asid; + bool vm_ok; + Int128 mask; + + if (!riscv_feature(env, RISCV_FEATURE_MMU)) { + return RISCV_EXCP_NONE; + } + + if (riscv_cpu_is_32bit(env)) { + vm_ok =3D validate_vm(env, get_field(int128_getlo(val), SATP32_MOD= E)); + mask =3D int128_make64((int128_getlo(val) ^ env->satp) + & (SATP32_MODE | SATP32_ASID | SATP32_PPN)); + asid =3D (int128_getlo(val) ^ env->satp) & SATP32_ASID; + } else if (riscv_cpu_is_64bit(env)) { + vm_ok =3D validate_vm(env, get_field(int128_getlo(val), SATP64_MOD= E)); + mask =3D int128_make64((int128_getlo(val) ^ env->satp) + & (SATP64_MODE | SATP64_ASID | SATP64_PPN)); + asid =3D (int128_getlo(val) ^ env->satp) & SATP64_ASID; + } else { + vm_ok =3D validate_vm(env, get_field(int128_gethi(val), SATP128_HM= ODE)); + mask =3D int128_and( + int128_xor(val, int128_make128(env->satp, env->satph)), + int128_make128(SATP128_LPPN, SATP128_HMODE | SATP128_HA= SID)); + asid =3D (int128_gethi(val) ^ env->satph) & SATP128_HASID; + } + + + if (vm_ok && int128_nz(mask)) { + if (env->priv =3D=3D PRV_S && get_field(env->mstatus, MSTATUS_TVM)= ) { + return RISCV_EXCP_ILLEGAL_INST; + } else { + if (asid) { + tlb_flush(env_cpu(env)); + } + env->satp =3D int128_getlo(val); + env->satph =3D int128_gethi(val); + } + } + return RISCV_EXCP_NONE; +} + static RISCVException read_satp(CPURISCVState *env, int csrno, target_ulong *val) { @@ -1624,7 +1695,7 @@ static inline RISCVException riscv_csrrw_check_i128(C= PURISCVState *env, /* check privileges and return -1 if check fails */ #if !defined(CONFIG_USER_ONLY) int effective_priv =3D env->priv; - int read_only =3D get_field(csrno, 0xc00) =3D=3D 3; + int read_only =3D get_field(csrno, 0xC00) =3D=3D 3; =20 if (riscv_has_ext(env, RVH) && env->priv =3D=3D PRV_S && @@ -1765,7 +1836,7 @@ riscv_csr_operations128 csr_ops_128[CSR_TABLE_SIZE] = =3D { [CSR_MSCRATCH] =3D { read_mscratch_i128, write_mscratch_i128 }, [CSR_MEPC] =3D { read_mepc_i128, write_mepc_i128 }, =20 - [CSR_SATP] =3D { read_zero_i128 }, + [CSR_SATP] =3D { read_satp_i128, write_satp_i128 }, #endif }; =20 --=20 2.33.0