From nobody Tue Feb 10 03:40:02 2026 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=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1661556294; cv=none; d=zohomail.com; s=zohoarc; b=hPJPKBxTSe/rKQ4CS58ZMffTn3lGSXtjwvy9sy/cSxqtAW8HumtBLMKPDLSpJ7devceLz8AC5R0M7n0BS5AqSEbTgUTGarEqPLFe3zagh73NbPYMMZL3N+7U3imWNKPPQV40VnLqZsGsq1zXhUsczc+As6hVkmEp2eyPPm/av6U= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1661556294; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=SkcLlE3+NWnE1Ni60695EMJiMdZS1Zu17YnLw8OeY/U=; b=OITyxOb/j+JDZWcaEcxm5sAhAFXzOaLAguKmBZHBXFq0DeGqTPi/nP7GPD8rCzrgI0h/HNUZGHQ5Ym90KSovmQVGdk5vSQG4trKrTTuKK9fhyUNEnnX1XojvN3pFFE7xapxpZvrl+DTLfFa4NL0hpj5EwIbW8eR/91ED47j2NhI= 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) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1661556294606727.6379773262831; Fri, 26 Aug 2022 16:24:54 -0700 (PDT) Received: from localhost ([::1]:52632 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1oRih3-0006Ij-Fc for importer@patchew.org; Fri, 26 Aug 2022 19:24:53 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:40704) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1oRiVX-00074A-Mn for qemu-devel@nongnu.org; Fri, 26 Aug 2022 19:12:59 -0400 Received: from us-smtp-delivery-124.mimecast.com ([170.10.133.124]:56290) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1oRiV6-0007qJ-DF for qemu-devel@nongnu.org; Fri, 26 Aug 2022 19:12:34 -0400 Received: from mail-ed1-f71.google.com (mail-ed1-f71.google.com [209.85.208.71]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_128_GCM_SHA256) id us-mta-508-tYWdAsjgPLWCEqDnzo3rhQ-1; Fri, 26 Aug 2022 19:12:30 -0400 Received: by mail-ed1-f71.google.com with SMTP id h17-20020a05640250d100b00446d1825c9fso1848245edb.14 for ; Fri, 26 Aug 2022 16:12:30 -0700 (PDT) Received: from goa-sendmail ([2001:b07:6468:f312:1c09:f536:3de6:228c]) by smtp.gmail.com with ESMTPSA id es5-20020a056402380500b0043bc4b28464sm1804833edb.34.2022.08.26.16.12.27 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 26 Aug 2022 16:12:28 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1661555551; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=SkcLlE3+NWnE1Ni60695EMJiMdZS1Zu17YnLw8OeY/U=; b=SUQi3jQiZgUfVAehLSsPje+9mMDh88CCgwh0rdgWI4oiKKV0ohIlJcGfg48KZ0xjug0bta KhNXym7ozyizU4KUctbg4Sq7hbIj51kMmJJQZ9GwlurXBFmqDiKqaDPEWwbYpffMm5Klj0 aTOKuPaGlZqTwA8KArUzCEB59UKwZ7U= X-MC-Unique: tYWdAsjgPLWCEqDnzo3rhQ-1 X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc; bh=SkcLlE3+NWnE1Ni60695EMJiMdZS1Zu17YnLw8OeY/U=; b=wqeSvqwBc6SnOZ6jOo5KH61xhbY0k0sHybfaHDZyAslPsRYw0Imfv7UDmRRB7EhCxk 3gXlEhQteY92UwKcFVlap4lfVX+9jzjpKQYAttd0/oe2PcOCaRl7U2xo1KnBJg6s5kWE hwfDho21Wf/QWynDcgdCQu/22I+kzpRxIva4bPTUtVcOlcdhQRpz+0PikUjWxZ7shH3O M/0QFHjMt9lgwTunleTFHpQSvPdjv9Ao7VtaKcIoDBH7LDUBPMB+NBjc185p8LpUHlLR uzszrSrwbRbrlWWu1k6FlSV4vTuRGF2srmsokd16qUJeTxsJwLFGUZzrsV/h8DiJpeJ4 2Esw== X-Gm-Message-State: ACgBeo2LYFmjih5lxg/7c0m8yCY4ZZ6/WKKrbe7OM5qbBeShN1WzHmKX bwgywyTtmOpzVF+WkkXaYl5RjgriX2/u/tyf+whqphQpBewIWuaj0tV6zQqxEDer0YdSqbPMPjy JN+cNVDnTi7KHGfoYZTmaUhZMTyJlQamtiNogrO8fZp1VukaR0Q2q+qMfhfqteNfArS4= X-Received: by 2002:a17:906:4795:b0:73d:daa0:3cbf with SMTP id cw21-20020a170906479500b0073ddaa03cbfmr4954064ejc.693.1661555549014; Fri, 26 Aug 2022 16:12:29 -0700 (PDT) X-Google-Smtp-Source: AA6agR6/9fNjS8uajm1RbKdFDZEfxUV6cEebWeYmS/OA6GMBhtCwPuUp0qSfgAa1wJtsZl0MfUFNZQ== X-Received: by 2002:a17:906:4795:b0:73d:daa0:3cbf with SMTP id cw21-20020a170906479500b0073ddaa03cbfmr4954054ejc.693.1661555548708; Fri, 26 Aug 2022 16:12:28 -0700 (PDT) From: Paolo Bonzini To: qemu-devel@nongnu.org Cc: richard.henderson@linaro.org, paul@nowt.org Subject: [PATCH 12/23] i386: Rewrite vector shift helper Date: Sat, 27 Aug 2022 01:11:53 +0200 Message-Id: <20220826231204.201395-13-pbonzini@redhat.com> X-Mailer: git-send-email 2.37.1 In-Reply-To: <20220826231204.201395-1-pbonzini@redhat.com> References: <20220826231204.201395-1-pbonzini@redhat.com> 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=170.10.133.124; envelope-from=pbonzini@redhat.com; helo=us-smtp-delivery-124.mimecast.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, DKIMWL_WL_HIGH=-0.001, 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, 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: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: pass (identity @redhat.com) X-ZM-MESSAGEID: 1661556296450100001 Content-Type: text/plain; charset="utf-8" From: Paul Brook Rewrite the vector shift helpers in preperation for AVX support (3 operand form and 256 bit vectors). For now keep the existing two operand interface. No functional changes to existing helpers. Signed-off-by: Paul Brook Message-Id: <20220424220204.2493824-11-paul@nowt.org> Reviewed-by: Richard Henderson Signed-off-by: Paolo Bonzini --- target/i386/ops_sse.h | 221 ++++++++++++++++++------------------------ 1 file changed, 96 insertions(+), 125 deletions(-) diff --git a/target/i386/ops_sse.h b/target/i386/ops_sse.h index f603981ab8..8c745f5cab 100644 --- a/target/i386/ops_sse.h +++ b/target/i386/ops_sse.h @@ -56,195 +56,166 @@ #define MOVE(d, r) memcpy(&(d).B(0), &(r).B(0), SIZE) #endif =20 -void glue(helper_psrlw, SUFFIX)(CPUX86State *env, Reg *d, Reg *s) -{ - int shift; +#if SHIFT =3D=3D 0 +#define FPSRL(x, c) ((x) >> shift) +#define FPSRAW(x, c) ((int16_t)(x) >> shift) +#define FPSRAL(x, c) ((int32_t)(x) >> shift) +#define FPSLL(x, c) ((x) << shift) +#endif =20 - if (s->Q(0) > 15) { - d->Q(0) =3D 0; -#if SHIFT =3D=3D 1 - d->Q(1) =3D 0; -#endif +void glue(helper_psrlw, SUFFIX)(CPUX86State *env, Reg *d, Reg *c) +{ + Reg *s =3D d; + int shift; + if (c->Q(0) > 15) { + for (int i =3D 0; i < 1 << SHIFT; i++) { + d->Q(i) =3D 0; + } } else { - shift =3D s->B(0); - d->W(0) >>=3D shift; - d->W(1) >>=3D shift; - d->W(2) >>=3D shift; - d->W(3) >>=3D shift; -#if SHIFT =3D=3D 1 - d->W(4) >>=3D shift; - d->W(5) >>=3D shift; - d->W(6) >>=3D shift; - d->W(7) >>=3D shift; -#endif + shift =3D c->B(0); + for (int i =3D 0; i < 4 << SHIFT; i++) { + d->W(i) =3D FPSRL(s->W(i), shift); + } } } =20 -void glue(helper_psraw, SUFFIX)(CPUX86State *env, Reg *d, Reg *s) +void glue(helper_psllw, SUFFIX)(CPUX86State *env, Reg *d, Reg *c) { + Reg *s =3D d; int shift; + if (c->Q(0) > 15) { + for (int i =3D 0; i < 1 << SHIFT; i++) { + d->Q(i) =3D 0; + } + } else { + shift =3D c->B(0); + for (int i =3D 0; i < 4 << SHIFT; i++) { + d->W(i) =3D FPSLL(s->W(i), shift); + } + } +} =20 - if (s->Q(0) > 15) { +void glue(helper_psraw, SUFFIX)(CPUX86State *env, Reg *d, Reg *c) +{ + Reg *s =3D d; + int shift; + if (c->Q(0) > 15) { shift =3D 15; } else { - shift =3D s->B(0); + shift =3D c->B(0); + } + for (int i =3D 0; i < 4 << SHIFT; i++) { + d->W(i) =3D FPSRAW(s->W(i), shift); } - d->W(0) =3D (int16_t)d->W(0) >> shift; - d->W(1) =3D (int16_t)d->W(1) >> shift; - d->W(2) =3D (int16_t)d->W(2) >> shift; - d->W(3) =3D (int16_t)d->W(3) >> shift; -#if SHIFT =3D=3D 1 - d->W(4) =3D (int16_t)d->W(4) >> shift; - d->W(5) =3D (int16_t)d->W(5) >> shift; - d->W(6) =3D (int16_t)d->W(6) >> shift; - d->W(7) =3D (int16_t)d->W(7) >> shift; -#endif } =20 -void glue(helper_psllw, SUFFIX)(CPUX86State *env, Reg *d, Reg *s) +void glue(helper_psrld, SUFFIX)(CPUX86State *env, Reg *d, Reg *c) { + Reg *s =3D d; int shift; - - if (s->Q(0) > 15) { - d->Q(0) =3D 0; -#if SHIFT =3D=3D 1 - d->Q(1) =3D 0; -#endif + if (c->Q(0) > 31) { + for (int i =3D 0; i < 1 << SHIFT; i++) { + d->Q(i) =3D 0; + } } else { - shift =3D s->B(0); - d->W(0) <<=3D shift; - d->W(1) <<=3D shift; - d->W(2) <<=3D shift; - d->W(3) <<=3D shift; -#if SHIFT =3D=3D 1 - d->W(4) <<=3D shift; - d->W(5) <<=3D shift; - d->W(6) <<=3D shift; - d->W(7) <<=3D shift; -#endif + shift =3D c->B(0); + for (int i =3D 0; i < 2 << SHIFT; i++) { + d->L(i) =3D FPSRL(s->L(i), shift); + } } } =20 -void glue(helper_psrld, SUFFIX)(CPUX86State *env, Reg *d, Reg *s) +void glue(helper_pslld, SUFFIX)(CPUX86State *env, Reg *d, Reg *c) { + Reg *s =3D d; int shift; - - if (s->Q(0) > 31) { - d->Q(0) =3D 0; -#if SHIFT =3D=3D 1 - d->Q(1) =3D 0; -#endif + if (c->Q(0) > 31) { + for (int i =3D 0; i < 1 << SHIFT; i++) { + d->Q(i) =3D 0; + } } else { - shift =3D s->B(0); - d->L(0) >>=3D shift; - d->L(1) >>=3D shift; -#if SHIFT =3D=3D 1 - d->L(2) >>=3D shift; - d->L(3) >>=3D shift; -#endif + shift =3D c->B(0); + for (int i =3D 0; i < 2 << SHIFT; i++) { + d->L(i) =3D FPSLL(s->L(i), shift); + } } } =20 -void glue(helper_psrad, SUFFIX)(CPUX86State *env, Reg *d, Reg *s) +void glue(helper_psrad, SUFFIX)(CPUX86State *env, Reg *d, Reg *c) { + Reg *s =3D d; int shift; - - if (s->Q(0) > 31) { + if (c->Q(0) > 31) { shift =3D 31; } else { - shift =3D s->B(0); + shift =3D c->B(0); + } + for (int i =3D 0; i < 2 << SHIFT; i++) { + d->L(i) =3D FPSRAL(s->L(i), shift); } - d->L(0) =3D (int32_t)d->L(0) >> shift; - d->L(1) =3D (int32_t)d->L(1) >> shift; -#if SHIFT =3D=3D 1 - d->L(2) =3D (int32_t)d->L(2) >> shift; - d->L(3) =3D (int32_t)d->L(3) >> shift; -#endif } =20 -void glue(helper_pslld, SUFFIX)(CPUX86State *env, Reg *d, Reg *s) +void glue(helper_psrlq, SUFFIX)(CPUX86State *env, Reg *d, Reg *c) { + Reg *s =3D d; int shift; - - if (s->Q(0) > 31) { - d->Q(0) =3D 0; -#if SHIFT =3D=3D 1 - d->Q(1) =3D 0; -#endif + if (c->Q(0) > 63) { + for (int i =3D 0; i < 1 << SHIFT; i++) { + d->Q(i) =3D 0; + } } else { - shift =3D s->B(0); - d->L(0) <<=3D shift; - d->L(1) <<=3D shift; -#if SHIFT =3D=3D 1 - d->L(2) <<=3D shift; - d->L(3) <<=3D shift; -#endif + shift =3D c->B(0); + for (int i =3D 0; i < 1 << SHIFT; i++) { + d->Q(i) =3D FPSRL(s->Q(i), shift); + } } } =20 -void glue(helper_psrlq, SUFFIX)(CPUX86State *env, Reg *d, Reg *s) +void glue(helper_psllq, SUFFIX)(CPUX86State *env, Reg *d, Reg *c) { + Reg *s =3D d; int shift; - - if (s->Q(0) > 63) { - d->Q(0) =3D 0; -#if SHIFT =3D=3D 1 - d->Q(1) =3D 0; -#endif + if (c->Q(0) > 63) { + for (int i =3D 0; i < 1 << SHIFT; i++) { + d->Q(i) =3D 0; + } } else { - shift =3D s->B(0); - d->Q(0) >>=3D shift; -#if SHIFT =3D=3D 1 - d->Q(1) >>=3D shift; -#endif + shift =3D c->B(0); + for (int i =3D 0; i < 1 << SHIFT; i++) { + d->Q(i) =3D FPSLL(s->Q(i), shift); + } } } =20 -void glue(helper_psllq, SUFFIX)(CPUX86State *env, Reg *d, Reg *s) -{ - int shift; - - if (s->Q(0) > 63) { - d->Q(0) =3D 0; -#if SHIFT =3D=3D 1 - d->Q(1) =3D 0; -#endif - } else { - shift =3D s->B(0); - d->Q(0) <<=3D shift; -#if SHIFT =3D=3D 1 - d->Q(1) <<=3D shift; -#endif - } -} - -#if SHIFT =3D=3D 1 -void glue(helper_psrldq, SUFFIX)(CPUX86State *env, Reg *d, Reg *s) +#if SHIFT >=3D 1 +void glue(helper_psrldq, SUFFIX)(CPUX86State *env, Reg *d, Reg *c) { + Reg *s =3D d; int shift, i; =20 - shift =3D s->L(0); + shift =3D c->L(0); if (shift > 16) { shift =3D 16; } for (i =3D 0; i < 16 - shift; i++) { - d->B(i) =3D d->B(i + shift); + d->B(i) =3D s->B(i + shift); } for (i =3D 16 - shift; i < 16; i++) { d->B(i) =3D 0; } } =20 -void glue(helper_pslldq, SUFFIX)(CPUX86State *env, Reg *d, Reg *s) +void glue(helper_pslldq, SUFFIX)(CPUX86State *env, Reg *d, Reg *c) { + Reg *s =3D d; int shift, i; =20 - shift =3D s->L(0); + shift =3D c->L(0); if (shift > 16) { shift =3D 16; } for (i =3D 15; i >=3D shift; i--) { - d->B(i) =3D d->B(i - shift); + d->B(i) =3D s->B(i - shift); } for (i =3D 0; i < shift; i++) { d->B(i) =3D 0; --=20 2.37.1