From nobody Tue Feb 10 07:22:43 2026 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 Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 165083866320648.2310359124848; Sun, 24 Apr 2022 15:17:43 -0700 (PDT) Received: from localhost ([::1]:45996 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1nikY1-0001G2-9M for importer@patchew.org; Sun, 24 Apr 2022 18:17:41 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:50408) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1nikRs-0000sc-EY for qemu-devel@nongnu.org; Sun, 24 Apr 2022 18:11:22 -0400 Received: from nowt.default.pbrook.uk0.bigv.io ([2001:41c8:51:832:fcff:ff:fe00:46dd]:58750) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1nikRq-0002ln-LQ for qemu-devel@nongnu.org; Sun, 24 Apr 2022 18:11:20 -0400 Received: from cpc91554-seac25-2-0-cust857.7-2.cable.virginm.net ([82.27.199.90] helo=wren.home) by nowt.default.pbrook.uk0.bigv.io with esmtpsa (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.84_2) (envelope-from ) id 1nikJ8-0001ea-7q; Sun, 24 Apr 2022 23:02:18 +0100 From: Paul Brook To: Paolo Bonzini , Richard Henderson , Eduardo Habkost Subject: [PATCH v2 17/42] i386: Destructive FP helpers for AVX Date: Sun, 24 Apr 2022 23:01:39 +0100 Message-Id: <20220424220204.2493824-18-paul@nowt.org> X-Mailer: git-send-email 2.36.0 In-Reply-To: <20220418173904.3746036-1-paul@nowt.org> References: <20220418173904.3746036-1-paul@nowt.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=2001:41c8:51:832:fcff:ff:fe00:46dd; envelope-from=paul@nowt.org; helo=nowt.default.pbrook.uk0.bigv.io 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_PASS=-0.001, T_SCC_BODY_TEXT_LINE=-0.01 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: "open list:All patches CC here" , Paul Brook Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZM-MESSAGEID: 1650838663504100001 Content-Type: text/plain; charset="utf-8" Perpare the horizontal atithmetic vector helpers for AVX These currently use a dummy Reg typed variable to store the result then assign the whole register. This will cause 128 bit operations to corrupt the upper half of the register, so replace it with explicit temporaries and element assignments. Signed-off-by: Paul Brook --- target/i386/ops_sse.h | 96 +++++++++++++++++++++++++++++++------------ 1 file changed, 70 insertions(+), 26 deletions(-) diff --git a/target/i386/ops_sse.h b/target/i386/ops_sse.h index 4137e6e1fa..d128af6cc8 100644 --- a/target/i386/ops_sse.h +++ b/target/i386/ops_sse.h @@ -1196,44 +1196,88 @@ void helper_insertq_i(CPUX86State *env, ZMMReg *d, = int index, int length) d->ZMM_Q(0) =3D helper_insertq(d->ZMM_Q(0), index, length); } =20 -void glue(helper_haddps, SUFFIX)(CPUX86State *env, ZMMReg *d, ZMMReg *s) +void glue(helper_haddps, SUFFIX)(CPUX86State *env, Reg *d, Reg *s) { - ZMMReg r; - - r.ZMM_S(0) =3D float32_add(d->ZMM_S(0), d->ZMM_S(1), &env->sse_status); - r.ZMM_S(1) =3D float32_add(d->ZMM_S(2), d->ZMM_S(3), &env->sse_status); - r.ZMM_S(2) =3D float32_add(s->ZMM_S(0), s->ZMM_S(1), &env->sse_status); - r.ZMM_S(3) =3D float32_add(s->ZMM_S(2), s->ZMM_S(3), &env->sse_status); - MOVE(*d, r); + Reg *v =3D d; + float32 r0, r1, r2, r3; + + r0 =3D float32_add(v->ZMM_S(0), v->ZMM_S(1), &env->sse_status); + r1 =3D float32_add(v->ZMM_S(2), v->ZMM_S(3), &env->sse_status); + r2 =3D float32_add(s->ZMM_S(0), s->ZMM_S(1), &env->sse_status); + r3 =3D float32_add(s->ZMM_S(2), s->ZMM_S(3), &env->sse_status); + d->ZMM_S(0) =3D r0; + d->ZMM_S(1) =3D r1; + d->ZMM_S(2) =3D r2; + d->ZMM_S(3) =3D r3; +#if SHIFT =3D=3D 2 + r0 =3D float32_add(v->ZMM_S(4), v->ZMM_S(5), &env->sse_status); + r1 =3D float32_add(v->ZMM_S(6), v->ZMM_S(7), &env->sse_status); + r2 =3D float32_add(s->ZMM_S(4), s->ZMM_S(5), &env->sse_status); + r3 =3D float32_add(s->ZMM_S(6), s->ZMM_S(7), &env->sse_status); + d->ZMM_S(4) =3D r0; + d->ZMM_S(5) =3D r1; + d->ZMM_S(6) =3D r2; + d->ZMM_S(7) =3D r3; +#endif } =20 -void glue(helper_haddpd, SUFFIX)(CPUX86State *env, ZMMReg *d, ZMMReg *s) +void glue(helper_haddpd, SUFFIX)(CPUX86State *env, Reg *d, Reg *s) { - ZMMReg r; + Reg *v =3D d; + float64 r0, r1; =20 - r.ZMM_D(0) =3D float64_add(d->ZMM_D(0), d->ZMM_D(1), &env->sse_status); - r.ZMM_D(1) =3D float64_add(s->ZMM_D(0), s->ZMM_D(1), &env->sse_status); - MOVE(*d, r); + r0 =3D float64_add(v->ZMM_D(0), v->ZMM_D(1), &env->sse_status); + r1 =3D float64_add(s->ZMM_D(0), s->ZMM_D(1), &env->sse_status); + d->ZMM_D(0) =3D r0; + d->ZMM_D(1) =3D r1; +#if SHIFT =3D=3D 2 + r0 =3D float64_add(v->ZMM_D(2), v->ZMM_D(3), &env->sse_status); + r1 =3D float64_add(s->ZMM_D(2), s->ZMM_D(3), &env->sse_status); + d->ZMM_D(2) =3D r0; + d->ZMM_D(3) =3D r1; +#endif } =20 -void glue(helper_hsubps, SUFFIX)(CPUX86State *env, ZMMReg *d, ZMMReg *s) +void glue(helper_hsubps, SUFFIX)(CPUX86State *env, Reg *d, Reg *s) { - ZMMReg r; - - r.ZMM_S(0) =3D float32_sub(d->ZMM_S(0), d->ZMM_S(1), &env->sse_status); - r.ZMM_S(1) =3D float32_sub(d->ZMM_S(2), d->ZMM_S(3), &env->sse_status); - r.ZMM_S(2) =3D float32_sub(s->ZMM_S(0), s->ZMM_S(1), &env->sse_status); - r.ZMM_S(3) =3D float32_sub(s->ZMM_S(2), s->ZMM_S(3), &env->sse_status); - MOVE(*d, r); + Reg *v =3D d; + float32 r0, r1, r2, r3; + + r0 =3D float32_sub(v->ZMM_S(0), v->ZMM_S(1), &env->sse_status); + r1 =3D float32_sub(v->ZMM_S(2), v->ZMM_S(3), &env->sse_status); + r2 =3D float32_sub(s->ZMM_S(0), s->ZMM_S(1), &env->sse_status); + r3 =3D float32_sub(s->ZMM_S(2), s->ZMM_S(3), &env->sse_status); + d->ZMM_S(0) =3D r0; + d->ZMM_S(1) =3D r1; + d->ZMM_S(2) =3D r2; + d->ZMM_S(3) =3D r3; +#if SHIFT =3D=3D 2 + r0 =3D float32_sub(v->ZMM_S(4), v->ZMM_S(5), &env->sse_status); + r1 =3D float32_sub(v->ZMM_S(6), v->ZMM_S(7), &env->sse_status); + r2 =3D float32_sub(s->ZMM_S(4), s->ZMM_S(5), &env->sse_status); + r3 =3D float32_sub(s->ZMM_S(6), s->ZMM_S(7), &env->sse_status); + d->ZMM_S(4) =3D r0; + d->ZMM_S(5) =3D r1; + d->ZMM_S(6) =3D r2; + d->ZMM_S(7) =3D r3; +#endif } =20 -void glue(helper_hsubpd, SUFFIX)(CPUX86State *env, ZMMReg *d, ZMMReg *s) +void glue(helper_hsubpd, SUFFIX)(CPUX86State *env, Reg *d, Reg *s) { - ZMMReg r; + Reg *v =3D d; + float64 r0, r1; =20 - r.ZMM_D(0) =3D float64_sub(d->ZMM_D(0), d->ZMM_D(1), &env->sse_status); - r.ZMM_D(1) =3D float64_sub(s->ZMM_D(0), s->ZMM_D(1), &env->sse_status); - MOVE(*d, r); + r0 =3D float64_sub(v->ZMM_D(0), v->ZMM_D(1), &env->sse_status); + r1 =3D float64_sub(s->ZMM_D(0), s->ZMM_D(1), &env->sse_status); + d->ZMM_D(0) =3D r0; + d->ZMM_D(1) =3D r1; +#if SHIFT =3D=3D 2 + r0 =3D float64_sub(v->ZMM_D(2), v->ZMM_D(3), &env->sse_status); + r1 =3D float64_sub(s->ZMM_D(2), s->ZMM_D(3), &env->sse_status); + d->ZMM_D(2) =3D r0; + d->ZMM_D(3) =3D r1; +#endif } =20 void glue(helper_addsubps, SUFFIX)(CPUX86State *env, Reg *d, Reg *s) --=20 2.36.0