From patchwork Sat Jun 21 23:50:06 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Richard Henderson X-Patchwork-Id: 898863 Delivered-To: patch@linaro.org Received: by 2002:adf:e506:0:b0:3a6:d909:26ce with SMTP id j6csp316846wrm; Sat, 21 Jun 2025 17:00:42 -0700 (PDT) X-Forwarded-Encrypted: i=2; AJvYcCVSD6+4wcYV7hE7lH9wVdKE6D35dNrgyQ1RTeFqsH27iYoufUsWUiABHa33iXjIcuDVyvlzDA==@linaro.org X-Google-Smtp-Source: AGHT+IHrag7Hg6FKViegtmudiOIp+ALS/fK7qNiI/eU9wBv+VCJCr5oRevi5bDWhrUESUgOvvGq/ X-Received: by 2002:a05:620a:4406:b0:7d3:90ab:804 with SMTP id af79cd13be357-7d3f9967735mr1189903485a.58.1750550441908; Sat, 21 Jun 2025 17:00:41 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1750550441; cv=none; d=google.com; s=arc-20240605; b=gNmGbpk1D0BP0c4V6zjaFpm25uWH1Tlm0cD5FYKry1OkT76lqjvfZLhFZHe4oIH2mi ew0ZKgB4Z57kVXlzrEclv7HpcjhX1zUxLpUCpJy69uHjuP03jmhAA2wzPEo/EbVaAL7z w477pfDZx9RI0bZXRnKPY2FcLGbin5QY7VQQVMLu4PeppdRO/yCAVFEBJv5riBvDcxOz 5djzVMq1JSYYtFsWwDuuDi37swSvAu/kxLjttMz9ILuKvSRh05fJb6kixEJSai//Iusw JTxB4dfe/F3+uRSR5CDb7Doht3/OWlFW5U8wouPg5I8K2JBn1BkeDx1rydocodozAyCz KQGQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20240605; h=sender:errors-to:list-subscribe:list-help:list-post:list-archive :list-unsubscribe:list-id:precedence:content-transfer-encoding :mime-version:references:in-reply-to:message-id:date:subject:to:from :dkim-signature; bh=PUsGQeaVWdzEfLA4ZPf0L7EaF69nxGnusl9ChC//h68=; fh=PnYt+qEB9tAfMKoqBm2xjKOFpYyFFGPudh5cVIoieJM=; b=GU3pTlnvg+p/ZqCUZRrDOLlCKWNIdOY4O0Bv3DjudWEWVqlAOYSjhrVO36D46s2cdq I6WCZn6vS/GJqYJkt7zh/qVSLp38xcPgE+RZ+32EFx9uFtWtRSlqZ1PzEdK12oftxHat qKIic4OJaL5MrmRoU1EXNFl35FHOzfmCWR9n6KVXzD/9YNTToApVZHu2Q4/NCNaJ8Mvq bddgiH6XLkpEQBnZ00f/R6BIaNKFdxueKejCdefD8DyW6P+jBfUzGrA15A6T0Y0FSOr4 ZciaY6xKDOLHPIN1OxKM1i0SmcUw4P78xKhsrXOHiNpFCv30IjzPQgbAq6iP2ljJKFt6 Sicg==; dara=google.com ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linaro.org header.s=google header.b=S9CcQRAr; spf=pass (google.com: domain of qemu-devel-bounces+patch=linaro.org@nongnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom="qemu-devel-bounces+patch=linaro.org@nongnu.org"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linaro.org; dara=neutral header.i=@linaro.org Return-Path: Received: from lists.gnu.org (lists.gnu.org. [209.51.188.17]) by mx.google.com with ESMTPS id 6a1803df08f44-6fd095bb812si55042646d6.443.2025.06.21.17.00.41 for (version=TLS1_2 cipher=ECDHE-ECDSA-CHACHA20-POLY1305 bits=256/256); Sat, 21 Jun 2025 17:00:41 -0700 (PDT) Received-SPF: pass (google.com: domain of qemu-devel-bounces+patch=linaro.org@nongnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; Authentication-Results: mx.google.com; dkim=pass header.i=@linaro.org header.s=google header.b=S9CcQRAr; spf=pass (google.com: domain of qemu-devel-bounces+patch=linaro.org@nongnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom="qemu-devel-bounces+patch=linaro.org@nongnu.org"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linaro.org; dara=neutral header.i=@linaro.org Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1uT830-0004WM-VZ; Sat, 21 Jun 2025 19:54:59 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1uT82U-0002Sq-R0 for qemu-devel@nongnu.org; Sat, 21 Jun 2025 19:54:26 -0400 Received: from mail-pf1-x436.google.com ([2607:f8b0:4864:20::436]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1uT82T-0005C2-0q for qemu-devel@nongnu.org; Sat, 21 Jun 2025 19:54:26 -0400 Received: by mail-pf1-x436.google.com with SMTP id d2e1a72fcca58-7399a2dc13fso3410424b3a.2 for ; Sat, 21 Jun 2025 16:54:24 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1750550064; x=1751154864; darn=nongnu.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:to:from:from:to:cc:subject:date:message-id :reply-to; bh=PUsGQeaVWdzEfLA4ZPf0L7EaF69nxGnusl9ChC//h68=; b=S9CcQRArHthPSzuw45vKnARCXq1XDF0IWrK20PtT6NCsCPGPo519WW8TJmbO31xfq8 8PW9sfQfsYszn8oOKnabbQObl6rFDNjBfAAsMQChWQUqkwJmvTtZH52UzhQAlAx156kx Z/1jKQpk5aWtnP0dCac/0ERwY6uj/dVG9IiUDuRX+ovl7++dGKihDZrwIn77lPZP0K3v +eobSDcva4/xSFkWLBOoWzS89sza4mQmprCt0PwPXERmlvrngHSHcB8eXBgURvDi56B4 ttXZi6/u96i+r7XA7p4fGFdoUoa4ZOhGV8JzjYAF85SVnS7avNZdmouSZYV6dihstzPB k5zw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1750550064; x=1751154864; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=PUsGQeaVWdzEfLA4ZPf0L7EaF69nxGnusl9ChC//h68=; b=pso4nuOTtOGVX7XKgUQ+PfTWut9LyclN5Yz+ruo7L+XioEcdNHNy3fRqXroA/u3rM8 F4q3YLg6iWyEcWjoZ0A0P/qFsG6wXTew++ZwHyJpt0q3VDulPIfoMEJRx2SdbYdV90kv oEAwfCmvBSMGxXqihqaF30v381wy1htEgZTZs0ZaMFI4SpbWwWsFSynJPxQ0kxKYwNFo ErGYrRv9SS5Ntgx4Z4AOkDH1azJ0fR6SYab04TOoc/NAf5K1hFob973ek7FvxmNnMtBB 3j/PWIWLsPwfVWEpPRbhaLPqcmriX8iFN/FE7HQS1PEYvwfzPGy3T8TAAit902fx6xTA H2EQ== X-Gm-Message-State: AOJu0Yz5FhFi5igH0eKRL8AQ4LxuIZXxMQ0kpixVzhI3n8mpqzAh5rGv HukbdyeAq+E6EbQTTVI8WmtNCfFSkjbkD+bJJGqFhRoy+M+uL4emZSLyR/7aQk67y6p/J4TyAVn 6z0hpm+0= X-Gm-Gg: ASbGnctYziK79aRlki9dncZGGTb9S7wv9cKE6oSkBK3xfHTH2nPmVDSKujGjCwEbsvR ujBXEycyMR1ZLvtpisTdH53MKDTyTrsd+wmqDTCfDgEm7vuVGLR9dsWwsUrrBqgT7sXkWBpWi4J UIpHJTeGytabp8H/EWhLRgPVR+pGV3uZOcwV/N1yVPjzjlF38Swm4hQ/O2ZsmZ52maF4pFIjWxg YQa9AQFGg91HgVJsKj32C2JaWfYOh9EYdosveNFu5ZsMNw61o84gqxsdiavKU3vi1NNoYwW5L2I Zhgk8ezEdE2J8aV3R3JT2LuOhJGUDNsrMZsDVn/eWh5tAq2w8GSP/4fTZNZPRcL6RMra+kfwS4i 3I5JGFTWgL8mg4zifgdrj X-Received: by 2002:a05:6a00:2e95:b0:746:3200:620 with SMTP id d2e1a72fcca58-7490d6a9d84mr10732227b3a.9.1750550063658; Sat, 21 Jun 2025 16:54:23 -0700 (PDT) Received: from stoup.. (174-21-67-243.tukw.qwest.net. [174.21.67.243]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-7490a46b590sm4970051b3a.27.2025.06.21.16.54.23 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 21 Jun 2025 16:54:23 -0700 (PDT) From: Richard Henderson To: qemu-devel@nongnu.org Subject: [PATCH v2 070/101] target/arm: Introduce pred_count_test Date: Sat, 21 Jun 2025 16:50:06 -0700 Message-ID: <20250621235037.74091-71-richard.henderson@linaro.org> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20250621235037.74091-1-richard.henderson@linaro.org> References: <20250621235037.74091-1-richard.henderson@linaro.org> MIME-Version: 1.0 Received-SPF: pass client-ip=2607:f8b0:4864:20::436; envelope-from=richard.henderson@linaro.org; helo=mail-pf1-x436.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.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+patch=linaro.org@nongnu.org Sender: qemu-devel-bounces+patch=linaro.org@nongnu.org For WHILE, we have the count of enabled predicates, so we don't need to search to compute the PredTest result. Reuse the logic that will shortly be required for counted predicates. Signed-off-by: Richard Henderson --- target/arm/tcg/sve_helper.c | 62 +++++++++++++++++++++++++------------ 1 file changed, 43 insertions(+), 19 deletions(-) diff --git a/target/arm/tcg/sve_helper.c b/target/arm/tcg/sve_helper.c index e78d807ce1..df2cbf9b6e 100644 --- a/target/arm/tcg/sve_helper.c +++ b/target/arm/tcg/sve_helper.c @@ -4102,20 +4102,50 @@ uint64_t HELPER(sve_cntp)(void *vn, void *vg, uint32_t pred_desc) return sum; } +/* C.f. Arm pseudocode PredCountTest */ +static uint32_t pred_count_test(uint32_t elements, uint32_t count, bool invert) +{ + uint32_t flags; + + if (count == 0) { + /* + * N = 0 !(first active) + * Z = 1 (none active) + * C = 1 !(not last active) + */ + flags = 1; + } else if (!invert) { + /* + * N = 1 (first active) + * Z = 0 !(none active) + * C = ? (not last active) + */ + flags = (1u << 31) | 2; /* N, Z */ + flags |= count == elements; /* C */ + } else { + /* + * N = ? (first active) + * Z = 0 !(none active) + * C = 0 !(not last active) + */ + flags = 2; /* Z, C */ + flags |= (count == elements) << 31; /* N */ + } + return flags; +} + uint32_t HELPER(sve_whilel)(void *vd, uint32_t count, uint32_t pred_desc) { intptr_t oprsz = FIELD_EX32(pred_desc, PREDDESC, OPRSZ); intptr_t esz = FIELD_EX32(pred_desc, PREDDESC, ESZ); uint64_t esz_mask = pred_esz_masks[esz]; ARMPredicateReg *d = vd; - uint32_t flags; - intptr_t i; + intptr_t i, oprbits = oprsz * 8; + + tcg_debug_assert(count <= oprbits); /* Begin with a zero predicate register. */ - flags = do_zero(d, oprsz); - if (count == 0) { - return flags; - } + do_zero(d, oprsz); /* Set all of the requested bits. */ for (i = 0; i < count / 64; ++i) { @@ -4125,7 +4155,7 @@ uint32_t HELPER(sve_whilel)(void *vd, uint32_t count, uint32_t pred_desc) d->p[i] = MAKE_64BIT_MASK(0, count & 63) & esz_mask; } - return predtest_ones(d, oprsz, esz_mask); + return pred_count_test(oprbits, count, false); } uint32_t HELPER(sve_whileg)(void *vd, uint32_t count, uint32_t pred_desc) @@ -4134,16 +4164,15 @@ uint32_t HELPER(sve_whileg)(void *vd, uint32_t count, uint32_t pred_desc) intptr_t esz = FIELD_EX32(pred_desc, PREDDESC, ESZ); uint64_t esz_mask = pred_esz_masks[esz]; ARMPredicateReg *d = vd; - intptr_t i, invcount, oprbits; + intptr_t i, invcount, oprbits = oprsz * 8; uint64_t bits; - if (count == 0) { - return do_zero(d, oprsz); - } - - oprbits = oprsz * 8; tcg_debug_assert(count <= oprbits); + /* Begin with a zero predicate register. */ + do_zero(d, oprsz); + + /* Set all of the requested bits. */ bits = esz_mask; if (oprbits & 63) { bits &= MAKE_64BIT_MASK(0, oprbits & 63); @@ -4154,14 +4183,9 @@ uint32_t HELPER(sve_whileg)(void *vd, uint32_t count, uint32_t pred_desc) d->p[i] = bits; bits = esz_mask; } - d->p[i] = bits & MAKE_64BIT_MASK(invcount & 63, 64); - while (--i >= 0) { - d->p[i] = 0; - } - - return predtest_ones(d, oprsz, esz_mask); + return pred_count_test(oprbits, count, true); } /* Recursive reduction on a function;