From nobody Wed Nov 19 00:14:29 2025 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 ARC-Seal: i=1; a=rsa-sha256; t=1613145530; cv=none; d=zohomail.com; s=zohoarc; b=CEy/8b4rZvlRg3dQB3PUGXqk3/CX6KqFCqZapd+7CFBO712b9OuuQcQE/CApPnD9lE8WoB19hQHD2JV3Q9bHPQwbCoTGvUeKeihq1F3VxT7AeZNjL564RE4QSVmZHszwNIV8EMMZIA/SH87bAYgl/u5oE4MlRT9SosiQTTCzpk0= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1613145530; h=Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:Message-ID:References:Sender:Subject:To; bh=wv5n2MEHi85Kxu1ENEU8jQfNttR5JBleszBfkq+0gUY=; b=BA+9huEYt1uPTzIZ6MT0toa0PtH8T5lo/Dd71uxORJWptXQVRm3cnTdUnETv6EzJ59tgprhlWM7R4MkMV4rpCHc40on3cNB3hlRr0OiC7EcvRwiwN6w7lm/9Nm7U85EH6etCWZo/uOaawPEcH2S1JDT0bdjdSX/O8gkEv//VSXM= ARC-Authentication-Results: i=1; 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 Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1613145529602355.8516224768771; Fri, 12 Feb 2021 07:58:49 -0800 (PST) Received: from localhost ([::1]:58914 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1lAaqG-0008Pd-El for importer@patchew.org; Fri, 12 Feb 2021 10:58:48 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]:54572) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1lAaop-0007Zv-Th; Fri, 12 Feb 2021 10:57:20 -0500 Received: from smtp2200-217.mail.aliyun.com ([121.197.200.217]:41415) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1lAaol-0002BQ-G7; Fri, 12 Feb 2021 10:57:19 -0500 Received: from localhost.localdomain(mailfrom:zhiwei_liu@c-sky.com fp:SMTPD_---.JYHDsEp_1613145419) by smtp.aliyun-inc.com(10.147.41.120); Fri, 12 Feb 2021 23:56:59 +0800 X-Alimail-AntiSpam: AC=CONTINUE; BC=0.07436283|-1; CH=green; DM=|CONTINUE|false|; DS=CONTINUE|ham_system_inform|0.527822-0.00383003-0.468348; FP=0|0|0|0|0|-1|-1|-1; HT=ay29a033018047201; MF=zhiwei_liu@c-sky.com; NM=1; PH=DS; RN=6; RT=6; SR=0; TI=SMTPD_---.JYHDsEp_1613145419; From: LIU Zhiwei To: qemu-devel@nongnu.org Subject: [PATCH 26/38] target/riscv: Non-SIMD Q31 saturation ALU Instructions Date: Fri, 12 Feb 2021 23:02:44 +0800 Message-Id: <20210212150256.885-27-zhiwei_liu@c-sky.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20210212150256.885-1-zhiwei_liu@c-sky.com> References: <20210212150256.885-1-zhiwei_liu@c-sky.com> 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: none client-ip=121.197.200.217; envelope-from=zhiwei_liu@c-sky.com; helo=smtp2200-217.mail.aliyun.com 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, SPF_HELO_NONE=0.001, SPF_NONE=0.001, UNPARSEABLE_RELAY=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: richard.henderson@linaro.org, LIU Zhiwei , qemu-riscv@nongnu.org, palmer@dabbelt.com, alistair23@gmail.com Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Signed-off-by: LIU Zhiwei --- target/riscv/helper.h | 15 ++ target/riscv/insn32.decode | 16 ++ target/riscv/insn_trans/trans_rvp.c.inc | 17 ++ target/riscv/packed_helper.c | 214 ++++++++++++++++++++++++ 4 files changed, 262 insertions(+) diff --git a/target/riscv/helper.h b/target/riscv/helper.h index fdfd3177db..a6f62295e9 100644 --- a/target/riscv/helper.h +++ b/target/riscv/helper.h @@ -1366,3 +1366,18 @@ DEF_HELPER_3(khmbt, tl, env, tl, tl) DEF_HELPER_3(khmtt, tl, env, tl, tl) DEF_HELPER_3(ukaddh, tl, env, tl, tl) DEF_HELPER_3(uksubh, tl, env, tl, tl) + +DEF_HELPER_3(kaddw, tl, env, tl, tl) +DEF_HELPER_3(ukaddw, tl, env, tl, tl) +DEF_HELPER_3(ksubw, tl, env, tl, tl) +DEF_HELPER_3(uksubw, tl, env, tl, tl) +DEF_HELPER_3(kdmbb, tl, env, tl, tl) +DEF_HELPER_3(kdmbt, tl, env, tl, tl) +DEF_HELPER_3(kdmtt, tl, env, tl, tl) +DEF_HELPER_3(kslraw, tl, env, tl, tl) +DEF_HELPER_3(kslraw_u, tl, env, tl, tl) +DEF_HELPER_3(ksllw, tl, env, tl, tl) +DEF_HELPER_4(kdmabb, tl, env, tl, tl, tl) +DEF_HELPER_4(kdmabt, tl, env, tl, tl, tl) +DEF_HELPER_4(kdmatt, tl, env, tl, tl, tl) +DEF_HELPER_2(kabsw, tl, env, tl) diff --git a/target/riscv/insn32.decode b/target/riscv/insn32.decode index b31bec9c75..0b8f8d4c42 100644 --- a/target/riscv/insn32.decode +++ b/target/riscv/insn32.decode @@ -836,3 +836,19 @@ khmbt 0001110 ..... ..... 001 ..... 1111111 @r khmtt 0010110 ..... ..... 001 ..... 1111111 @r ukaddh 0001010 ..... ..... 001 ..... 1111111 @r uksubh 0001011 ..... ..... 001 ..... 1111111 @r + +kaddw 0000000 ..... ..... 001 ..... 1111111 @r +ukaddw 0001000 ..... ..... 001 ..... 1111111 @r +ksubw 0000001 ..... ..... 001 ..... 1111111 @r +uksubw 0001001 ..... ..... 001 ..... 1111111 @r +kdmbb 0000101 ..... ..... 001 ..... 1111111 @r +kdmbt 0001101 ..... ..... 001 ..... 1111111 @r +kdmtt 0010101 ..... ..... 001 ..... 1111111 @r +kslraw 0110111 ..... ..... 001 ..... 1111111 @r +kslraw_u 0111111 ..... ..... 001 ..... 1111111 @r +ksllw 0010011 ..... ..... 001 ..... 1111111 @r +kslliw 0011011 ..... ..... 001 ..... 1111111 @sh5 +kdmabb 1101001 ..... ..... 001 ..... 1111111 @r +kdmabt 1110001 ..... ..... 001 ..... 1111111 @r +kdmatt 1111001 ..... ..... 001 ..... 1111111 @r +kabsw 1010110 10100 ..... 000 ..... 1111111 @r2 diff --git a/target/riscv/insn_trans/trans_rvp.c.inc b/target/riscv/insn_tr= ans/trans_rvp.c.inc index b4f6b74b70..a57776303a 100644 --- a/target/riscv/insn_trans/trans_rvp.c.inc +++ b/target/riscv/insn_trans/trans_rvp.c.inc @@ -829,3 +829,20 @@ GEN_RVP_R_OOL(khmbt); GEN_RVP_R_OOL(khmtt); GEN_RVP_R_OOL(ukaddh); GEN_RVP_R_OOL(uksubh); + +/* Non-SIMD Q31 saturation ALU Instructions */ +GEN_RVP_R_OOL(kaddw); +GEN_RVP_R_OOL(ukaddw); +GEN_RVP_R_OOL(ksubw); +GEN_RVP_R_OOL(uksubw); +GEN_RVP_R_OOL(kdmbb); +GEN_RVP_R_OOL(kdmbt); +GEN_RVP_R_OOL(kdmtt); +GEN_RVP_R_OOL(kslraw); +GEN_RVP_R_OOL(kslraw_u); +GEN_RVP_R_OOL(ksllw); +GEN_RVP_SHIFTI(kslliw, ksllw, NULL); +GEN_RVP_R_ACC_OOL(kdmabb); +GEN_RVP_R_ACC_OOL(kdmabt); +GEN_RVP_R_ACC_OOL(kdmatt); +GEN_RVP_R2_OOL(kabsw); diff --git a/target/riscv/packed_helper.c b/target/riscv/packed_helper.c index 68db0b1f61..d2f7ec26f9 100644 --- a/target/riscv/packed_helper.c +++ b/target/riscv/packed_helper.c @@ -2613,3 +2613,217 @@ static inline void do_uksubh(CPURISCVState *env, vo= id *vd, void *va, } =20 RVPR(uksubh, 2, 4); + +/* Q31 saturation Instructions */ +static inline void do_kaddw(CPURISCVState *env, void *vd, void *va, + void *vb, uint8_t i) +{ + target_long *d =3D vd; + int32_t *a =3D va, *b =3D vb; + + *d =3D sadd32(env, 0, a[H4(i)], b[H4(i)]); +} + +RVPR(kaddw, 2, 4); + +static inline void do_ukaddw(CPURISCVState *env, void *vd, void *va, + void *vb, uint8_t i) +{ + target_long *d =3D vd; + uint32_t *a =3D va, *b =3D vb; + + *d =3D (int32_t)saddu32(env, 0, a[H4(i)], b[H4(i)]); +} + +RVPR(ukaddw, 2, 4); + +static inline void do_ksubw(CPURISCVState *env, void *vd, void *va, + void *vb, uint8_t i) +{ + target_long *d =3D vd; + int32_t *a =3D va, *b =3D vb; + + *d =3D ssub32(env, 0, a[H4(i)], b[H4(i)]); +} + +RVPR(ksubw, 2, 4); + +static inline void do_uksubw(CPURISCVState *env, void *vd, void *va, + void *vb, uint8_t i) +{ + target_long *d =3D vd; + uint32_t *a =3D va, *b =3D vb; + + *d =3D (int32_t)ssubu32(env, 0, a[H4(i)], b[H4(i)]); +} + +RVPR(uksubw, 2, 4); + +static inline void do_kdmbb(CPURISCVState *env, void *vd, void *va, + void *vb, uint8_t i) +{ + target_long *d =3D vd; + int16_t *a =3D va, *b =3D vb; + + if (a[H2(i)] =3D=3D INT16_MIN && b[H2(i)] =3D=3D INT16_MIN) { + *d =3D INT32_MAX; + env->vxsat =3D 0x1; + } else { + *d =3D (int64_t)a[H2(i)] * b[H2(i)] << 1; + } +} + +RVPR(kdmbb, 4, 2); + +static inline void do_kdmbt(CPURISCVState *env, void *vd, void *va, + void *vb, uint8_t i) +{ + target_long *d =3D vd; + int16_t *a =3D va, *b =3D vb; + + if (a[H2(i)] =3D=3D INT16_MIN && b[H2(i + 1)] =3D=3D INT16_MIN) { + *d =3D INT32_MAX; + env->vxsat =3D 0x1; + } else { + *d =3D (int64_t)a[H2(i)] * b[H2(i + 1)] << 1; + } +} + +RVPR(kdmbt, 4, 2); + +static inline void do_kdmtt(CPURISCVState *env, void *vd, void *va, + void *vb, uint8_t i) +{ + target_long *d =3D vd; + int16_t *a =3D va, *b =3D vb; + + if (a[H2(i + 1)] =3D=3D INT16_MIN && b[H2(i + 1)] =3D=3D INT16_MIN) { + *d =3D INT32_MAX; + env->vxsat =3D 0x1; + } else { + *d =3D (int64_t)a[H2(i + 1)] * b[H2(i + 1)] << 1; + } +} + +RVPR(kdmtt, 4, 2); + +static inline void do_kslraw(CPURISCVState *env, void *vd, void *va, + void *vb, uint8_t i) +{ + target_long *d =3D vd; + int32_t *a =3D va; + int32_t shift =3D sextract32((*(uint32_t *)vb), 0, 6); + + if (shift >=3D 0) { + *d =3D (int32_t)sat64(env, (int64_t)a[H4(i)] << shift, 31); + } else { + shift =3D -shift; + shift =3D (shift =3D=3D 32) ? 31 : shift; + *d =3D a[H4(i)] >> shift; + } +} + +RVPR(kslraw, 2, 4); + +static inline void do_kslraw_u(CPURISCVState *env, void *vd, void *va, + void *vb, uint8_t i) +{ + target_long *d =3D vd; + int32_t *a =3D va; + int32_t shift =3D sextract32((*(uint32_t *)vb), 0, 6); + + if (shift >=3D 0) { + *d =3D (int32_t)sat64(env, (int64_t)a[H4(i)] << shift, 31); + } else { + shift =3D -shift; + shift =3D (shift =3D=3D 32) ? 31 : shift; + *d =3D vssra32(env, 0, a[H4(i)], shift); + } +} + +RVPR(kslraw_u, 2, 4); + +static inline void do_ksllw(CPURISCVState *env, void *vd, void *va, + void *vb, uint8_t i) +{ + target_long *d =3D vd; + int32_t *a =3D va; + uint8_t shift =3D *(uint8_t *)vb & 0x1f; + + *d =3D (int32_t)sat64(env, (int64_t)a[H4(i)] << shift, 31); +} + +RVPR(ksllw, 2, 4); + +static inline void do_kdmabb(CPURISCVState *env, void *vd, void *va, + void *vb, void *vc, uint8_t i) + +{ + target_long *d =3D vd; + int16_t *a =3D va, *b =3D vb; + int32_t *c =3D vc, m0; + + if (a[H2(i)] =3D=3D INT16_MIN && b[H2(i)] =3D=3D INT16_MIN) { + m0 =3D INT32_MAX; + env->vxsat =3D 0x1; + } else { + m0 =3D (int32_t)a[H2(i)] * b[H2(i)] << 1; + } + *d =3D sadd32(env, 0, c[H4(i)], m0); +} + +RVPR_ACC(kdmabb, 4, 2); + +static inline void do_kdmabt(CPURISCVState *env, void *vd, void *va, + void *vb, void *vc, uint8_t i) + +{ + target_long *d =3D vd; + int16_t *a =3D va, *b =3D vb; + int32_t *c =3D vc, m0; + + if (a[H2(i)] =3D=3D INT16_MIN && b[H2(i + 1)] =3D=3D INT16_MIN) { + m0 =3D INT32_MAX; + env->vxsat =3D 0x1; + } else { + m0 =3D (int32_t)a[H2(i)] * b[H2(i + 1)] << 1; + } + *d =3D sadd32(env, 0, c[H4(i)], m0); +} + +RVPR_ACC(kdmabt, 4, 2); + +static inline void do_kdmatt(CPURISCVState *env, void *vd, void *va, + void *vb, void *vc, uint8_t i) + +{ + target_long *d =3D vd; + int16_t *a =3D va, *b =3D vb; + int32_t *c =3D vc, m0; + + if (a[H2(i + 1)] =3D=3D INT16_MIN && b[H2(i + 1)] =3D=3D INT16_MIN) { + m0 =3D INT32_MAX; + env->vxsat =3D 0x1; + } else { + m0 =3D (int32_t)a[H2(i + 1)] * b[H2(i + 1)] << 1; + } + *d =3D sadd32(env, 0, c[H4(i)], m0); +} + +RVPR_ACC(kdmatt, 4, 2); + +static inline void do_kabsw(CPURISCVState *env, void *vd, void *va, uint8_= t i) + +{ + target_long *d =3D vd; + int32_t *a =3D va; + + if (a[H4(i)] =3D=3D INT32_MIN) { + *d =3D INT32_MAX; + env->vxsat =3D 0x1; + } else { + *d =3D (int32_t)abs(a[H4(i)]); + } +} + +RVPR2(kabsw, 2, 4); --=20 2.17.1