From nobody Thu Dec 18 17:56:31 2025 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; 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=pass(p=none dis=none) header.from=linaro.org ARC-Seal: i=1; a=rsa-sha256; t=1621955573; cv=none; d=zohomail.com; s=zohoarc; b=V1INhc4y1ftrgw+IwS6sC7ah5WAvkOOjUnpzHlaa7+k5v0R+5/lmgOOts0ojTWtQ6fJ9c0JtiPtO/VmAE48S2Twbx19u4CW2VERIMXAI/rtzggVR9+Jp1STQVJH5VN0tXATwMqDyZ/KBVH3IS3KYbJa8jVj96Q63Lth0ynf+nuo= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1621955573; h=Content-Transfer-Encoding:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=IavT5SMq4hysDZsDWwUJtLGIMN0m6oy5ugbNXrDp9cY=; b=TFUg2FmProC8P0Qi7FcVEI8XifI+DbNIHZe7WfYIb60Y+//sUu8fyLC9V10RAxNAH4ArLjXj/6X7NSvGDSyEu25SqkcutubBLE3J5BUkk54qrerEScwJkFWit3DlRymtWksIbNf/Bl6ogD2+2b+fA78wS0yuOeKBIdWyQbcl8rY= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; 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=pass header.from= (p=none dis=none) header.from= Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1621955573365752.4129808774529; Tue, 25 May 2021 08:12:53 -0700 (PDT) Received: from localhost ([::1]:53754 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1llYjk-0006nm-8z for importer@patchew.org; Tue, 25 May 2021 11:12:52 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:58656) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1llYbH-0002gn-T0 for qemu-devel@nongnu.org; Tue, 25 May 2021 11:04:07 -0400 Received: from mail-wr1-x433.google.com ([2a00:1450:4864:20::433]:39553) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1llYbB-0004JO-MD for qemu-devel@nongnu.org; Tue, 25 May 2021 11:04:07 -0400 Received: by mail-wr1-x433.google.com with SMTP id v12so32627767wrq.6 for ; Tue, 25 May 2021 08:03:56 -0700 (PDT) Received: from orth.archaic.org.uk (orth.archaic.org.uk. [81.2.115.148]) by smtp.gmail.com with ESMTPSA id q62sm11710284wma.42.2021.05.25.08.03.54 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 25 May 2021 08:03:54 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:subject:date:message-id:in-reply-to:references:mime-version :content-transfer-encoding; bh=IavT5SMq4hysDZsDWwUJtLGIMN0m6oy5ugbNXrDp9cY=; b=LobMgf+Grcins043D0N66R+WStpzZZmKHSugJraRcJE54dSbM+ezRveAyNTdfAuMXX REk+ViMT9TxlzNntM3LZ65LJ7ufb/2g2hxs4P34WPUiartWaNSnC/bUM4iV12hOAsFry DXKchK9B9qSdkHFpvm89V9YxFDexbATuW6/P11vxTV5vUOfhaPjrGKXsobiTc6WgLKOE IchpZ0xl09J4OKgzIqHIoI/zkhDZWhPVj7jguer6Aurb/69RFCUI6vttuweBM0chwCS0 lOjCIcWGjgvVkzp6l08MLFjJZe3sGMaQgizAzuPaK0LuT1w1hL4WMyoRFG7TgyVkANjP sQ8w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=IavT5SMq4hysDZsDWwUJtLGIMN0m6oy5ugbNXrDp9cY=; b=eZNUwfPovhh3/Mkg0A8OEYbrP41iSa8AolvX9fa7xe236uAE5ezJlUUxnHSEJHxG8M xb6qJ0rjZle9MF3a+nijYxRLUKXBvF1TNocrFSug74PJnZfrNtS+PYd1XDh+XCgGfQOA sdLQDm7Dpwjehl+aUmQMHLpLxS+/jcUbTsnhRoRwgStHu2h7x5lqTAjlox6dMcMXqJFx 7SljBu3fPhkZvEjAtd9CfOx3EDdhkKjXVnxZh/N4WL4fxRZemzPQbTVW1bHSytx30gbn InKFjOKQyjNPF2i9tSiqaDFYeQBznPgakdd3844ngEvO3x0L2wp7d6sylLamlpU0ngcm LXaw== X-Gm-Message-State: AOAM530QXZK6TeGgj1SneZ55+3a3i/H1Z23ogJkQFihUlMSUBi4FdPeW mAqdhL+pA6gorlvECMJsOTXJ2G/pPqwLDI4q X-Google-Smtp-Source: ABdhPJwZ4uYAyfXGGumctZO3tYyi/lECKKZL4RBIaZawiPvo5J+V7GrGR796hgS/gV1iFdUwnguzAA== X-Received: by 2002:a5d:4536:: with SMTP id j22mr27734588wra.329.1621955035309; Tue, 25 May 2021 08:03:55 -0700 (PDT) From: Peter Maydell To: qemu-devel@nongnu.org Subject: [PULL 031/114] target/arm: Implement SVE2 saturating add/subtract (predicated) Date: Tue, 25 May 2021 16:02:01 +0100 Message-Id: <20210525150324.32370-32-peter.maydell@linaro.org> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20210525150324.32370-1-peter.maydell@linaro.org> References: <20210525150324.32370-1-peter.maydell@linaro.org> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable 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=2a00:1450:4864:20::433; envelope-from=peter.maydell@linaro.org; helo=mail-wr1-x433.google.com X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, 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: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: pass (identity @linaro.org) Content-Type: text/plain; charset="utf-8" From: Richard Henderson Reviewed-by: Peter Maydell Signed-off-by: Richard Henderson Message-id: 20210525010358.152808-10-richard.henderson@linaro.org Signed-off-by: Peter Maydell --- target/arm/helper-sve.h | 54 +++++++++++ target/arm/sve.decode | 11 +++ target/arm/sve_helper.c | 194 ++++++++++++++++++++++++++----------- target/arm/translate-sve.c | 7 ++ 4 files changed, 210 insertions(+), 56 deletions(-) diff --git a/target/arm/helper-sve.h b/target/arm/helper-sve.h index 09bc067dd4f..37461c9927d 100644 --- a/target/arm/helper-sve.h +++ b/target/arm/helper-sve.h @@ -371,6 +371,60 @@ DEF_HELPER_FLAGS_5(sve2_uminp_zpzz_s, TCG_CALL_NO_RWG, DEF_HELPER_FLAGS_5(sve2_uminp_zpzz_d, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, ptr, i32) =20 +DEF_HELPER_FLAGS_5(sve2_sqadd_zpzz_b, TCG_CALL_NO_RWG, + void, ptr, ptr, ptr, ptr, i32) +DEF_HELPER_FLAGS_5(sve2_sqadd_zpzz_h, TCG_CALL_NO_RWG, + void, ptr, ptr, ptr, ptr, i32) +DEF_HELPER_FLAGS_5(sve2_sqadd_zpzz_s, TCG_CALL_NO_RWG, + void, ptr, ptr, ptr, ptr, i32) +DEF_HELPER_FLAGS_5(sve2_sqadd_zpzz_d, TCG_CALL_NO_RWG, + void, ptr, ptr, ptr, ptr, i32) + +DEF_HELPER_FLAGS_5(sve2_uqadd_zpzz_b, TCG_CALL_NO_RWG, + void, ptr, ptr, ptr, ptr, i32) +DEF_HELPER_FLAGS_5(sve2_uqadd_zpzz_h, TCG_CALL_NO_RWG, + void, ptr, ptr, ptr, ptr, i32) +DEF_HELPER_FLAGS_5(sve2_uqadd_zpzz_s, TCG_CALL_NO_RWG, + void, ptr, ptr, ptr, ptr, i32) +DEF_HELPER_FLAGS_5(sve2_uqadd_zpzz_d, TCG_CALL_NO_RWG, + void, ptr, ptr, ptr, ptr, i32) + +DEF_HELPER_FLAGS_5(sve2_sqsub_zpzz_b, TCG_CALL_NO_RWG, + void, ptr, ptr, ptr, ptr, i32) +DEF_HELPER_FLAGS_5(sve2_sqsub_zpzz_h, TCG_CALL_NO_RWG, + void, ptr, ptr, ptr, ptr, i32) +DEF_HELPER_FLAGS_5(sve2_sqsub_zpzz_s, TCG_CALL_NO_RWG, + void, ptr, ptr, ptr, ptr, i32) +DEF_HELPER_FLAGS_5(sve2_sqsub_zpzz_d, TCG_CALL_NO_RWG, + void, ptr, ptr, ptr, ptr, i32) + +DEF_HELPER_FLAGS_5(sve2_uqsub_zpzz_b, TCG_CALL_NO_RWG, + void, ptr, ptr, ptr, ptr, i32) +DEF_HELPER_FLAGS_5(sve2_uqsub_zpzz_h, TCG_CALL_NO_RWG, + void, ptr, ptr, ptr, ptr, i32) +DEF_HELPER_FLAGS_5(sve2_uqsub_zpzz_s, TCG_CALL_NO_RWG, + void, ptr, ptr, ptr, ptr, i32) +DEF_HELPER_FLAGS_5(sve2_uqsub_zpzz_d, TCG_CALL_NO_RWG, + void, ptr, ptr, ptr, ptr, i32) + +DEF_HELPER_FLAGS_5(sve2_suqadd_zpzz_b, TCG_CALL_NO_RWG, + void, ptr, ptr, ptr, ptr, i32) +DEF_HELPER_FLAGS_5(sve2_suqadd_zpzz_h, TCG_CALL_NO_RWG, + void, ptr, ptr, ptr, ptr, i32) +DEF_HELPER_FLAGS_5(sve2_suqadd_zpzz_s, TCG_CALL_NO_RWG, + void, ptr, ptr, ptr, ptr, i32) +DEF_HELPER_FLAGS_5(sve2_suqadd_zpzz_d, TCG_CALL_NO_RWG, + void, ptr, ptr, ptr, ptr, i32) + +DEF_HELPER_FLAGS_5(sve2_usqadd_zpzz_b, TCG_CALL_NO_RWG, + void, ptr, ptr, ptr, ptr, i32) +DEF_HELPER_FLAGS_5(sve2_usqadd_zpzz_h, TCG_CALL_NO_RWG, + void, ptr, ptr, ptr, ptr, i32) +DEF_HELPER_FLAGS_5(sve2_usqadd_zpzz_s, TCG_CALL_NO_RWG, + void, ptr, ptr, ptr, ptr, i32) +DEF_HELPER_FLAGS_5(sve2_usqadd_zpzz_d, TCG_CALL_NO_RWG, + void, ptr, ptr, ptr, ptr, i32) + DEF_HELPER_FLAGS_5(sve_asr_zpzw_b, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, ptr, i32) DEF_HELPER_FLAGS_5(sve_asr_zpzw_h, TCG_CALL_NO_RWG, diff --git a/target/arm/sve.decode b/target/arm/sve.decode index 61a3321325a..cd4f73265fe 100644 --- a/target/arm/sve.decode +++ b/target/arm/sve.decode @@ -1148,3 +1148,14 @@ SMAXP 01000100 .. 010 100 101 ... ..... ..= ... @rdn_pg_rm UMAXP 01000100 .. 010 101 101 ... ..... ..... @rdn_pg_rm SMINP 01000100 .. 010 110 101 ... ..... ..... @rdn_pg_rm UMINP 01000100 .. 010 111 101 ... ..... ..... @rdn_pg_rm + +### SVE2 saturating add/subtract (predicated) + +SQADD_zpzz 01000100 .. 011 000 100 ... ..... ..... @rdn_pg_rm +UQADD_zpzz 01000100 .. 011 001 100 ... ..... ..... @rdn_pg_rm +SQSUB_zpzz 01000100 .. 011 010 100 ... ..... ..... @rdn_pg_rm +UQSUB_zpzz 01000100 .. 011 011 100 ... ..... ..... @rdn_pg_rm +SUQADD 01000100 .. 011 100 100 ... ..... ..... @rdn_pg_rm +USQADD 01000100 .. 011 101 100 ... ..... ..... @rdn_pg_rm +SQSUB_zpzz 01000100 .. 011 110 100 ... ..... ..... @rdm_pg_rn # SQSU= BR +UQSUB_zpzz 01000100 .. 011 111 100 ... ..... ..... @rdm_pg_rn # UQSU= BR diff --git a/target/arm/sve_helper.c b/target/arm/sve_helper.c index 74063680959..1f1783b8f3e 100644 --- a/target/arm/sve_helper.c +++ b/target/arm/sve_helper.c @@ -687,6 +687,135 @@ DO_ZPZZ(sve2_uhsub_zpzz_h, uint16_t, H1_2, DO_HSUB_BH= S) DO_ZPZZ(sve2_uhsub_zpzz_s, uint32_t, H1_4, DO_HSUB_BHS) DO_ZPZZ_D(sve2_uhsub_zpzz_d, uint64_t, DO_HSUB_D) =20 +static inline int32_t do_sat_bhs(int64_t val, int64_t min, int64_t max) +{ + return val >=3D max ? max : val <=3D min ? min : val; +} + +#define DO_SQADD_B(n, m) do_sat_bhs((int64_t)n + m, INT8_MIN, INT8_MAX) +#define DO_SQADD_H(n, m) do_sat_bhs((int64_t)n + m, INT16_MIN, INT16_MAX) +#define DO_SQADD_S(n, m) do_sat_bhs((int64_t)n + m, INT32_MIN, INT32_MAX) + +static inline int64_t do_sqadd_d(int64_t n, int64_t m) +{ + int64_t r =3D n + m; + if (((r ^ n) & ~(n ^ m)) < 0) { + /* Signed overflow. */ + return r < 0 ? INT64_MAX : INT64_MIN; + } + return r; +} + +DO_ZPZZ(sve2_sqadd_zpzz_b, int8_t, H1, DO_SQADD_B) +DO_ZPZZ(sve2_sqadd_zpzz_h, int16_t, H1_2, DO_SQADD_H) +DO_ZPZZ(sve2_sqadd_zpzz_s, int32_t, H1_4, DO_SQADD_S) +DO_ZPZZ_D(sve2_sqadd_zpzz_d, int64_t, do_sqadd_d) + +#define DO_UQADD_B(n, m) do_sat_bhs((int64_t)n + m, 0, UINT8_MAX) +#define DO_UQADD_H(n, m) do_sat_bhs((int64_t)n + m, 0, UINT16_MAX) +#define DO_UQADD_S(n, m) do_sat_bhs((int64_t)n + m, 0, UINT32_MAX) + +static inline uint64_t do_uqadd_d(uint64_t n, uint64_t m) +{ + uint64_t r =3D n + m; + return r < n ? UINT64_MAX : r; +} + +DO_ZPZZ(sve2_uqadd_zpzz_b, uint8_t, H1, DO_UQADD_B) +DO_ZPZZ(sve2_uqadd_zpzz_h, uint16_t, H1_2, DO_UQADD_H) +DO_ZPZZ(sve2_uqadd_zpzz_s, uint32_t, H1_4, DO_UQADD_S) +DO_ZPZZ_D(sve2_uqadd_zpzz_d, uint64_t, do_uqadd_d) + +#define DO_SQSUB_B(n, m) do_sat_bhs((int64_t)n - m, INT8_MIN, INT8_MAX) +#define DO_SQSUB_H(n, m) do_sat_bhs((int64_t)n - m, INT16_MIN, INT16_MAX) +#define DO_SQSUB_S(n, m) do_sat_bhs((int64_t)n - m, INT32_MIN, INT32_MAX) + +static inline int64_t do_sqsub_d(int64_t n, int64_t m) +{ + int64_t r =3D n - m; + if (((r ^ n) & (n ^ m)) < 0) { + /* Signed overflow. */ + return r < 0 ? INT64_MAX : INT64_MIN; + } + return r; +} + +DO_ZPZZ(sve2_sqsub_zpzz_b, int8_t, H1, DO_SQSUB_B) +DO_ZPZZ(sve2_sqsub_zpzz_h, int16_t, H1_2, DO_SQSUB_H) +DO_ZPZZ(sve2_sqsub_zpzz_s, int32_t, H1_4, DO_SQSUB_S) +DO_ZPZZ_D(sve2_sqsub_zpzz_d, int64_t, do_sqsub_d) + +#define DO_UQSUB_B(n, m) do_sat_bhs((int64_t)n - m, 0, UINT8_MAX) +#define DO_UQSUB_H(n, m) do_sat_bhs((int64_t)n - m, 0, UINT16_MAX) +#define DO_UQSUB_S(n, m) do_sat_bhs((int64_t)n - m, 0, UINT32_MAX) + +static inline uint64_t do_uqsub_d(uint64_t n, uint64_t m) +{ + return n > m ? n - m : 0; +} + +DO_ZPZZ(sve2_uqsub_zpzz_b, uint8_t, H1, DO_UQSUB_B) +DO_ZPZZ(sve2_uqsub_zpzz_h, uint16_t, H1_2, DO_UQSUB_H) +DO_ZPZZ(sve2_uqsub_zpzz_s, uint32_t, H1_4, DO_UQSUB_S) +DO_ZPZZ_D(sve2_uqsub_zpzz_d, uint64_t, do_uqsub_d) + +#define DO_SUQADD_B(n, m) \ + do_sat_bhs((int64_t)(int8_t)n + m, INT8_MIN, INT8_MAX) +#define DO_SUQADD_H(n, m) \ + do_sat_bhs((int64_t)(int16_t)n + m, INT16_MIN, INT16_MAX) +#define DO_SUQADD_S(n, m) \ + do_sat_bhs((int64_t)(int32_t)n + m, INT32_MIN, INT32_MAX) + +static inline int64_t do_suqadd_d(int64_t n, uint64_t m) +{ + uint64_t r =3D n + m; + + if (n < 0) { + /* Note that m - abs(n) cannot underflow. */ + if (r > INT64_MAX) { + /* Result is either very large positive or negative. */ + if (m > -n) { + /* m > abs(n), so r is a very large positive. */ + return INT64_MAX; + } + /* Result is negative. */ + } + } else { + /* Both inputs are positive: check for overflow. */ + if (r < m || r > INT64_MAX) { + return INT64_MAX; + } + } + return r; +} + +DO_ZPZZ(sve2_suqadd_zpzz_b, uint8_t, H1, DO_SUQADD_B) +DO_ZPZZ(sve2_suqadd_zpzz_h, uint16_t, H1_2, DO_SUQADD_H) +DO_ZPZZ(sve2_suqadd_zpzz_s, uint32_t, H1_4, DO_SUQADD_S) +DO_ZPZZ_D(sve2_suqadd_zpzz_d, uint64_t, do_suqadd_d) + +#define DO_USQADD_B(n, m) \ + do_sat_bhs((int64_t)n + (int8_t)m, 0, UINT8_MAX) +#define DO_USQADD_H(n, m) \ + do_sat_bhs((int64_t)n + (int16_t)m, 0, UINT16_MAX) +#define DO_USQADD_S(n, m) \ + do_sat_bhs((int64_t)n + (int32_t)m, 0, UINT32_MAX) + +static inline uint64_t do_usqadd_d(uint64_t n, int64_t m) +{ + uint64_t r =3D n + m; + + if (m < 0) { + return n < -m ? 0 : r; + } + return r < n ? UINT64_MAX : r; +} + +DO_ZPZZ(sve2_usqadd_zpzz_b, uint8_t, H1, DO_USQADD_B) +DO_ZPZZ(sve2_usqadd_zpzz_h, uint16_t, H1_2, DO_USQADD_H) +DO_ZPZZ(sve2_usqadd_zpzz_s, uint32_t, H1_4, DO_USQADD_S) +DO_ZPZZ_D(sve2_usqadd_zpzz_d, uint64_t, do_usqadd_d) + #undef DO_ZPZZ #undef DO_ZPZZ_D =20 @@ -1623,13 +1752,7 @@ void HELPER(sve_sqaddi_b)(void *d, void *a, int32_t = b, uint32_t desc) intptr_t i, oprsz =3D simd_oprsz(desc); =20 for (i =3D 0; i < oprsz; i +=3D sizeof(int8_t)) { - int r =3D *(int8_t *)(a + i) + b; - if (r > INT8_MAX) { - r =3D INT8_MAX; - } else if (r < INT8_MIN) { - r =3D INT8_MIN; - } - *(int8_t *)(d + i) =3D r; + *(int8_t *)(d + i) =3D DO_SQADD_B(b, *(int8_t *)(a + i)); } } =20 @@ -1638,13 +1761,7 @@ void HELPER(sve_sqaddi_h)(void *d, void *a, int32_t = b, uint32_t desc) intptr_t i, oprsz =3D simd_oprsz(desc); =20 for (i =3D 0; i < oprsz; i +=3D sizeof(int16_t)) { - int r =3D *(int16_t *)(a + i) + b; - if (r > INT16_MAX) { - r =3D INT16_MAX; - } else if (r < INT16_MIN) { - r =3D INT16_MIN; - } - *(int16_t *)(d + i) =3D r; + *(int16_t *)(d + i) =3D DO_SQADD_H(b, *(int16_t *)(a + i)); } } =20 @@ -1653,13 +1770,7 @@ void HELPER(sve_sqaddi_s)(void *d, void *a, int64_t = b, uint32_t desc) intptr_t i, oprsz =3D simd_oprsz(desc); =20 for (i =3D 0; i < oprsz; i +=3D sizeof(int32_t)) { - int64_t r =3D *(int32_t *)(a + i) + b; - if (r > INT32_MAX) { - r =3D INT32_MAX; - } else if (r < INT32_MIN) { - r =3D INT32_MIN; - } - *(int32_t *)(d + i) =3D r; + *(int32_t *)(d + i) =3D DO_SQADD_S(b, *(int32_t *)(a + i)); } } =20 @@ -1668,13 +1779,7 @@ void HELPER(sve_sqaddi_d)(void *d, void *a, int64_t = b, uint32_t desc) intptr_t i, oprsz =3D simd_oprsz(desc); =20 for (i =3D 0; i < oprsz; i +=3D sizeof(int64_t)) { - int64_t ai =3D *(int64_t *)(a + i); - int64_t r =3D ai + b; - if (((r ^ ai) & ~(ai ^ b)) < 0) { - /* Signed overflow. */ - r =3D (r < 0 ? INT64_MAX : INT64_MIN); - } - *(int64_t *)(d + i) =3D r; + *(int64_t *)(d + i) =3D do_sqadd_d(b, *(int64_t *)(a + i)); } } =20 @@ -1687,13 +1792,7 @@ void HELPER(sve_uqaddi_b)(void *d, void *a, int32_t = b, uint32_t desc) intptr_t i, oprsz =3D simd_oprsz(desc); =20 for (i =3D 0; i < oprsz; i +=3D sizeof(uint8_t)) { - int r =3D *(uint8_t *)(a + i) + b; - if (r > UINT8_MAX) { - r =3D UINT8_MAX; - } else if (r < 0) { - r =3D 0; - } - *(uint8_t *)(d + i) =3D r; + *(uint8_t *)(d + i) =3D DO_UQADD_B(b, *(uint8_t *)(a + i)); } } =20 @@ -1702,13 +1801,7 @@ void HELPER(sve_uqaddi_h)(void *d, void *a, int32_t = b, uint32_t desc) intptr_t i, oprsz =3D simd_oprsz(desc); =20 for (i =3D 0; i < oprsz; i +=3D sizeof(uint16_t)) { - int r =3D *(uint16_t *)(a + i) + b; - if (r > UINT16_MAX) { - r =3D UINT16_MAX; - } else if (r < 0) { - r =3D 0; - } - *(uint16_t *)(d + i) =3D r; + *(uint16_t *)(d + i) =3D DO_UQADD_H(b, *(uint16_t *)(a + i)); } } =20 @@ -1717,13 +1810,7 @@ void HELPER(sve_uqaddi_s)(void *d, void *a, int64_t = b, uint32_t desc) intptr_t i, oprsz =3D simd_oprsz(desc); =20 for (i =3D 0; i < oprsz; i +=3D sizeof(uint32_t)) { - int64_t r =3D *(uint32_t *)(a + i) + b; - if (r > UINT32_MAX) { - r =3D UINT32_MAX; - } else if (r < 0) { - r =3D 0; - } - *(uint32_t *)(d + i) =3D r; + *(uint32_t *)(d + i) =3D DO_UQADD_S(b, *(uint32_t *)(a + i)); } } =20 @@ -1732,11 +1819,7 @@ void HELPER(sve_uqaddi_d)(void *d, void *a, uint64_t= b, uint32_t desc) intptr_t i, oprsz =3D simd_oprsz(desc); =20 for (i =3D 0; i < oprsz; i +=3D sizeof(uint64_t)) { - uint64_t r =3D *(uint64_t *)(a + i) + b; - if (r < b) { - r =3D UINT64_MAX; - } - *(uint64_t *)(d + i) =3D r; + *(uint64_t *)(d + i) =3D do_uqadd_d(b, *(uint64_t *)(a + i)); } } =20 @@ -1745,8 +1828,7 @@ void HELPER(sve_uqsubi_d)(void *d, void *a, uint64_t = b, uint32_t desc) intptr_t i, oprsz =3D simd_oprsz(desc); =20 for (i =3D 0; i < oprsz; i +=3D sizeof(uint64_t)) { - uint64_t ai =3D *(uint64_t *)(a + i); - *(uint64_t *)(d + i) =3D (ai < b ? 0 : ai - b); + *(uint64_t *)(d + i) =3D do_uqsub_d(*(uint64_t *)(a + i), b); } } =20 diff --git a/target/arm/translate-sve.c b/target/arm/translate-sve.c index 2d449c9b57b..609d5ae7b71 100644 --- a/target/arm/translate-sve.c +++ b/target/arm/translate-sve.c @@ -5963,3 +5963,10 @@ DO_SVE2_ZPZZ(SMAXP, smaxp) DO_SVE2_ZPZZ(UMAXP, umaxp) DO_SVE2_ZPZZ(SMINP, sminp) DO_SVE2_ZPZZ(UMINP, uminp) + +DO_SVE2_ZPZZ(SQADD_zpzz, sqadd) +DO_SVE2_ZPZZ(UQADD_zpzz, uqadd) +DO_SVE2_ZPZZ(SQSUB_zpzz, sqsub) +DO_SVE2_ZPZZ(UQSUB_zpzz, uqsub) +DO_SVE2_ZPZZ(SUQADD, suqadd) +DO_SVE2_ZPZZ(USQADD, usqadd) --=20 2.20.1