From nobody Mon May 25 20:33:42 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=linaro.org ARC-Seal: i=1; a=rsa-sha256; t=1778170251; cv=none; d=zohomail.com; s=zohoarc; b=BzV4Erac7PT19hY9LEmdrBU/k9yclDZ3HO0hM6+2dstgcJ0fMfALex73rCsTLGoIW01a/cWO+YnHUccSISX/cnKtk47IMffzbD1QAEZYxKn1VWS/OHaSCgW8BlCAyyBRvCLs7PtASBwsGXYuqz6cMiRGhuuOWmj+scCWI0GQozk= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1778170251; h=Content-Transfer-Encoding:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To:Cc; bh=6QyGqNuFJ9FrT8LgHdQBdPtxv1l1sITer0qRw/oh+IY=; b=IaMybjuVJQJbYwowWqbjpg8CltitueGGHLi3OMcff+3L8g0orgO3nCMFKUgVyCh6RvB4RhOmtpqPso+efe2FE9Hw4nJumC8pUfrZ6wYXSYUHM26tO2H7DTPtnGIWjpQTo6i+opPBJ9F8qoGZ5FlSsrFvwnoTbwkc5LXkOBDGDvU= 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 lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1778170251031952.227087950701; Thu, 7 May 2026 09:10:51 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wL1Iw-00020o-NM; Thu, 07 May 2026 12:10:32 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wL1Ib-0001eE-VZ for qemu-devel@nongnu.org; Thu, 07 May 2026 12:10:10 -0400 Received: from mail-ot1-x336.google.com ([2607:f8b0:4864:20::336]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1wL1IZ-0007tw-OD for qemu-devel@nongnu.org; Thu, 07 May 2026 12:10:05 -0400 Received: by mail-ot1-x336.google.com with SMTP id 46e09a7af769-7dcc9b506d9so845584a34.1 for ; Thu, 07 May 2026 09:10:03 -0700 (PDT) Received: from stoup.attlocal.net ([2600:381:c938:6375:9641:bbb2:a93a:bb4c]) by smtp.gmail.com with ESMTPSA id 46e09a7af769-7e302462fb1sm16415a34.11.2026.05.07.09.10.01 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 07 May 2026 09:10:01 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1778170202; x=1778775002; 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=6QyGqNuFJ9FrT8LgHdQBdPtxv1l1sITer0qRw/oh+IY=; b=y/PdI386RcknhoiV5iyStUMMpCDdpGtoco5bFK8BHJPG6mhy/orYpm7e7IMHmtwJ0w 9fUTVwqhOLeCo8XJmmjP1QEgHkLCTAmNOIjoHslvqrQ46YAM/ERNMdgbrbKxfx0kYpBs XFqkLFdQazlmqQ+vlAj7xUbuLpPkHta2WzrZWj9zNbujc047ByPLfpmHefQyWD8S7lfd RbBFLtIIw5I1w47MJe2Tbnx5vTtB2wQzX8sJFFY3lcBf+oNaQRJ2wavQIyEtDT1ihnxe mhYtRi3LLoXGSR6oKxz/spbBpSU7vAHiDqEXEbyYnZOCOvWSVhwnIrw8I0IS5NI7FrDQ c3AQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1778170202; x=1778775002; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:to:from:x-gm-gg:x-gm-message-state:from:to :cc:subject:date:message-id:reply-to; bh=6QyGqNuFJ9FrT8LgHdQBdPtxv1l1sITer0qRw/oh+IY=; b=K2AzMYxfd7E/8jJHVD4/EVBdLdJnWqpDlUS5kU3ZDmPFvDO3F9Ma5299/VdG5AS2JM IcBWYLd/am4Bnzu6y59HIVdIgL4+2FI1ePYcUN9nf9ZtqhUxy0Ayy0WMGnY+5uCJMAXj MxfNJM32OIoZ3CmuVLCA721M+Gra5MSlgwCmRO7w5C4vgt7WLrYz+XicfYXEEUNPXYyU wtM0iUzZtvJyrhv1Znp8gq3gyaeGMPPr40OSZ9+mBno0ggLfvVIzRrppcaKk53KTy314 SOIiqVkQ7TBq018Ju7JUmUTG9BCsvqE2JaWGVRCifAqdwEENI0fmGX43Y/IDfsXbkLAF 1qpQ== X-Gm-Message-State: AOJu0YzikKbdy6GGSQwEARubcL2ZW5wsE6p2HTRuyPB/pohTV9JEdF8H 4GIvanRI0K5VZqkm+Fp2+59IQlRTP1OTy53mUZ9vprxBHmQuquc0bhE2sryaE8GVmi4M6zbvSUL CyUgy X-Gm-Gg: AeBDiev7zwOsqZ6ndwJf9cC+veTZlRQ8MBCIRXN31uEunNQygla1z6lVKuPW561ipfa 8y8beblMMxS43tHs+QUsJ1bh1HonOwRewmQFpQRtp4VW4Qk+5Pn9oPTZZOSSwwUZGEA/TfC2fan Qaqt/WxBxIg0D9Q4XIJAP+LrL1heO9I7pj7tE4VSzDhm5KknN41HsxdQDM7PBaNUb+txrI3sAoX x/ekm9Owliq5Iq3pxCWsWst2Y7+HD8cC5d0ckHg/WVeoL1Tm9RoBh0K40oalBkCJ7KpfL8LjlTo SGhOvjtaf0lXXVBvQ7uxjZMJo2hS6517Mie4caVUMukl8A4h8l14ye0TOOaXzyAo1xm3lhieRqU KdqktT8/asQQAuh3oLEqn+6C3itF13L8ufHVy8TGT8Ir8/b0ZwMHYpbm6E4OJR/W7cIpJrMAKfh 1VpxnLVXVhHM3UOp92MKOjCk27wCjQD9FQmLAXw4f9OYsXLQ== X-Received: by 2002:a05:6830:6734:b0:7d7:fb8c:3c29 with SMTP id 46e09a7af769-7e1df0f9574mr5357600a34.14.1778170202192; Thu, 07 May 2026 09:10:02 -0700 (PDT) From: Richard Henderson To: qemu-devel@nongnu.org Subject: [PATCH v3 01/11] fpu: Reorganize partsN(muladd) Date: Thu, 7 May 2026 11:09:49 -0500 Message-ID: <20260507160959.449170-2-richard.henderson@linaro.org> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260507160959.449170-1-richard.henderson@linaro.org> References: <20260507160959.449170-1-richard.henderson@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=lists1p.gnu.org; Received-SPF: pass client-ip=2607:f8b0:4864:20::336; envelope-from=richard.henderson@linaro.org; helo=mail-ot1-x336.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: qemu development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @linaro.org) X-ZM-MESSAGEID: 1778170253983154100 Content-Type: text/plain; charset="utf-8" Check the likely case of normal product and normal or zero addend first; shift NaN and infinity detection down; end with zero product + addend. Signed-off-by: Richard Henderson --- fpu/softfloat-parts.c.inc | 155 +++++++++++++++++--------------------- 1 file changed, 70 insertions(+), 85 deletions(-) diff --git a/fpu/softfloat-parts.c.inc b/fpu/softfloat-parts.c.inc index 3a9c2748cd..3d2606c07c 100644 --- a/fpu/softfloat-parts.c.inc +++ b/fpu/softfloat-parts.c.inc @@ -681,11 +681,47 @@ static FloatPartsN *partsN(muladd)(FloatPartsN *a, Fl= oatPartsN *b, FloatPartsN *c, int flags, float_status *s) { - int ab_mask, abc_mask; - FloatPartsW p_widen, c_widen; + int ab_mask =3D float_cmask(a->cls) | float_cmask(b->cls); + int c_mask =3D float_cmask(c->cls); + int abc_mask =3D ab_mask | c_mask; + bool c_sign =3D c->sign ^ !!(flags & float_muladd_negate_c); + bool p_sign =3D a->sign ^ b->sign ^ !!(flags & float_muladd_negate_pro= duct); =20 - ab_mask =3D float_cmask(a->cls) | float_cmask(b->cls); - abc_mask =3D float_cmask(c->cls) | ab_mask; + /* + * The "likely" case is A and B normal, so that the product is normal, + * and C normal or zero so that the result is normal. + */ + int likely_mask =3D ab_mask | (c_mask & ~float_cmask_zero); + if (likely(cmask_is_only_normals(likely_mask))) { + record_denormals_used(abc_mask, s); + + /* Perform the multiplication step. */ + FloatPartsW p_widen =3D { .sign =3D p_sign, .exp =3D a->exp + b->e= xp + 1 }; + fracN(mulw)(&p_widen, a, b); + if (!(p_widen.frac_hi & DECOMPOSED_IMPLICIT_BIT)) { + fracW(add)(&p_widen, &p_widen, &p_widen); + p_widen.exp -=3D 1; + } + + /* Perform the addition step. */ + if (!(c_mask & float_cmask_zero)) { + /* Zero-extend C to less significant bits. */ + FloatPartsW c_widen =3D { .sign =3D c_sign, .exp =3D c->exp }; + fracN(widen)(&c_widen, c); + + if (p_sign =3D=3D c_sign) { + partsW(add_normal)(&p_widen, &c_widen); + } else if (!partsW(sub_normal)(&p_widen, &c_widen)) { + goto return_sub_zero; + } + } + + /* Narrow with sticky bit, for proper rounding later. */ + fracN(truncjam)(a, &p_widen); + a->sign =3D p_widen.sign; + a->exp =3D p_widen.exp; + return a; + } =20 /* * It is implementation-defined whether the cases of (0,inf,qnan) @@ -698,97 +734,46 @@ static FloatPartsN *partsN(muladd)(FloatPartsN *a, Fl= oatPartsN *b, return a; } =20 - if (flags & float_muladd_negate_c) { - c->sign ^=3D 1; + if (unlikely(ab_mask =3D=3D float_cmask_infzero)) { + /* Inf * Zero =3D=3D NaN */ + float_raise(float_flag_invalid | float_flag_invalid_imz, s); + goto d_nan; } =20 - /* Compute the sign of the product into A. */ - a->sign ^=3D b->sign; - if (flags & float_muladd_negate_product) { - a->sign ^=3D 1; - } - - if (unlikely(!cmask_is_only_normals(ab_mask))) { - if (unlikely(ab_mask =3D=3D float_cmask_infzero)) { - float_raise(float_flag_invalid | float_flag_invalid_imz, s); + if (unlikely(ab_mask & float_cmask_inf)) { + if ((c_mask & float_cmask_inf) && p_sign !=3D c_sign) { + /* Inf - Inf =3D=3D NaN */ + float_raise(float_flag_invalid | float_flag_invalid_isi, s); goto d_nan; } - - if (ab_mask & float_cmask_inf) { - if (c->cls =3D=3D float_class_inf && a->sign !=3D c->sign) { - float_raise(float_flag_invalid | float_flag_invalid_isi, s= ); - goto d_nan; - } - goto return_inf; - } - - g_assert(ab_mask & float_cmask_zero); - if (is_anynorm(c->cls)) { - *a =3D *c; - goto finish_sign; - } - if (c->cls =3D=3D float_class_zero) { - if (flags & float_muladd_suppress_add_product_zero) { - a->sign =3D c->sign; - } else if (a->sign !=3D c->sign) { - goto return_sub_zero; - } - goto return_zero; - } - g_assert(c->cls =3D=3D float_class_inf); + /* Inf + C =3D=3D Inf */ + record_denormals_used(abc_mask, s); + a->sign =3D p_sign; + a->cls =3D float_class_inf; + return a; } - - if (unlikely(c->cls =3D=3D float_class_inf)) { - a->sign =3D c->sign; - goto return_inf; - } - - /* Perform the multiplication step. */ - p_widen.sign =3D a->sign; - p_widen.exp =3D a->exp + b->exp + 1; - fracN(mulw)(&p_widen, a, b); - if (!(p_widen.frac_hi & DECOMPOSED_IMPLICIT_BIT)) { - fracW(add)(&p_widen, &p_widen, &p_widen); - p_widen.exp -=3D 1; - } - - /* Perform the addition step. */ - if (c->cls !=3D float_class_zero) { - /* Zero-extend C to less significant bits. */ - fracN(widen)(&c_widen, c); - c_widen.exp =3D c->exp; - - if (a->sign =3D=3D c->sign) { - partsW(add_normal)(&p_widen, &c_widen); - } else if (!partsW(sub_normal)(&p_widen, &c_widen)) { - goto return_sub_zero; - } - } - - /* Narrow with sticky bit, for proper rounding later. */ - fracN(truncjam)(a, &p_widen); - a->sign =3D p_widen.sign; - a->exp =3D p_widen.exp; - - finish_sign: - /* - * All result types except for "return the default NaN - * because this is an Invalid Operation" go through here; - * this matches the set of cases where we consumed a - * denormal input. - */ record_denormals_used(abc_mask, s); - return a; + + /* Only remaining case is zero product. */ + assert(ab_mask & float_cmask_zero); + + /* + * 0 + C =3D=3D C, + * except for 0 - 0, which needs special rounding, + * except for when we want to suppress this addition step. + */ + if (!(c_mask & float_cmask_zero) + || p_sign =3D=3D c_sign + || (flags & float_muladd_suppress_add_product_zero)) { + c->sign =3D c_sign; + return c; + } =20 return_sub_zero: + /* 0 - 0 =3D=3D -0 for round_down, +0 otherwise. */ a->sign =3D s->float_rounding_mode =3D=3D float_round_down; - return_zero: a->cls =3D float_class_zero; - goto finish_sign; - - return_inf: - a->cls =3D float_class_inf; - goto finish_sign; + return a; =20 d_nan: *a =3D partsN(default_nan)(s); --=20 2.43.0 From nobody Mon May 25 20:33:42 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=linaro.org ARC-Seal: i=1; a=rsa-sha256; t=1778170309; cv=none; d=zohomail.com; s=zohoarc; b=WXh0fEgvXy/JXpkU2jheUOq2RrrDhA3AV89DWAh3K09BLciG2cDDPZXa97Uwxeopuf2idOM4zMc+z89oKc/R/C537saxkQ4T10/OVtDCmzaidWwRn+pBnxzRIhNMr5HrsopnjWyv4z1r+jszp44dbZvCbzqNFLDZEetk9EF8MHI= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1778170309; h=Content-Type:Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=Sb1CVOnR1v+AoYSx743vCYn6DnCjsVU4fwzve1BycZA=; b=YlmzJEuLX71XdJ9ZA8rBZwpEQ7m30VukVkZmbPlXuyfeTl0nf9o65F+OVyMoAkkZD4McGeSvcV6uSXQ7reY1qUHmQRLn+mitTzkK9WTPdrNWfe8spX+Q/ndBeJkY9HIYZ25D/ZCuLi6aIJ2J4zvqZ8zPxCLiiIwkrKnPc6shc8A= 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 lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1778170309219133.9423856307236; Thu, 7 May 2026 09:11:49 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wL1JK-0002Q9-B8; Thu, 07 May 2026 12:10:50 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wL1Id-0001gG-T1 for qemu-devel@nongnu.org; Thu, 07 May 2026 12:10:11 -0400 Received: from mail-ot1-x32d.google.com ([2607:f8b0:4864:20::32d]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1wL1Ib-00080K-Ib for qemu-devel@nongnu.org; Thu, 07 May 2026 12:10:07 -0400 Received: by mail-ot1-x32d.google.com with SMTP id 46e09a7af769-7d55b97f358so735420a34.3 for ; Thu, 07 May 2026 09:10:04 -0700 (PDT) Received: from stoup.attlocal.net ([2600:381:c938:6375:9641:bbb2:a93a:bb4c]) by smtp.gmail.com with ESMTPSA id 46e09a7af769-7e302462fb1sm16415a34.11.2026.05.07.09.10.02 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 07 May 2026 09:10:02 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1778170203; x=1778775003; darn=nongnu.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=Sb1CVOnR1v+AoYSx743vCYn6DnCjsVU4fwzve1BycZA=; b=IHPW0k8dfWmxfzxA09h0WcwoGYhuStrAwolxkT9agkzk3lZw1QBZ1QOtuXpm2mlKsV i+coGMoXP6Y42gqcura03JqbpepLilW+ZyESuUp4j6uQOtPrxj1xpHcH589rHNLfrnh3 4X+1Fpnmbuq/D4AlHTOrWY1sseRtyjHY1BNYbWX28t2HDrlHcStYQ4nQ5m02q+w5muhL MHdRTMAmxol/9XTaaWFHQdhwfIX7/TcwTqZUhdBAKhms9uiT7ynrGsAPCfy81eCf0tEA Y5vsWsSwIIS/TGQz3dLEKptvDCdYxFeRIr2GYYwt6tsaDt+fveFavvEy/Q6wlYp7ntMN yq1Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1778170203; x=1778775003; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=Sb1CVOnR1v+AoYSx743vCYn6DnCjsVU4fwzve1BycZA=; b=WG2zVmUkIZ3CJvUYcDhlhL5G5XQ5n9PIGBHxXt88eTytol0D4E1+ypbE762vNwkMj8 dOgIsq1ZwiVNCVZowmFej7qoQe+pcWPxCwoGZyo8RoBjfmfI+6wM0qGEU/wlMzhng5k3 FFGVWvjh5oEpmJix8ek60g6cxOjXS+HiefIoZKvYhKTWoXfMOLf6erfjO93PrS3JezZi a1wViDGnj6M/2V3vHptnMu14Rp9g9QXQH70JeA+D90yw/qmTK2yv9mTKETIjYCZkSbRx js3t5Fk5do5EFMWQiM8/wwUON27TI8KZ99Ef+s+kOGeG3cPDZaiYAmDmHRiMxJBK9KJk iKsw== X-Gm-Message-State: AOJu0Yy7TuuQPH15KHA4peHUcqV8RRjV6iRQl3AZXDfSwSvKQYYCnpOH YOIno0liS3eEkiR9yG6Yfgcoa/eEMGiJJ7V02Unczr4LlsVyTTvlQpfYPiqWCzvPWxH6PEZ3Yxw ZYVqH X-Gm-Gg: AeBDietSVYfwqvk6bHpdctn/lgDLcjnn6ei2n4+EeGuQa6QVbG5v0cbt/HzBBp1jdwN omzqqLFJcuQluDXb9NrYo9vlhDEiokdAlqe4Hq1G5DNMrO/15h+RsTTCnjcH5WP6XFBhpKlchOW DKMlyRzkinD/0vzITZQoEfnHP0/ixgNTuY/kcL7ckGJS/6jmMltbb5CA4U6gUaUrwu1xWHgOrdO YUKKkdodKP70OHTkFNGWwNipOSihd3osA+OEMvBOZL7QHftlTfSEVXARSEhNq4dCHCNWDR9EjX5 nOBQMMp58KDxuWGThC2nj/9RiwriE0mjDvfhKvgvJJH3DF3usl3jP01jloPlGDnnuA8UwQDshCg 9iIvtMYBEgMY9QnF8jVF7JFVWh/briqAlLxZtUGVWNK9bwom1v0L1BinlfFxWdtRAt63PGfsOu5 BDMfcvUq+m3rjh5mUsr+6jiJcddPHaV+fRQRiCmiIs4d9Wsg== X-Received: by 2002:a05:6830:608c:b0:7df:5fc:3fd8 with SMTP id 46e09a7af769-7e1dee91018mr5216693a34.1.1778170203100; Thu, 07 May 2026 09:10:03 -0700 (PDT) From: Richard Henderson To: qemu-devel@nongnu.org Cc: =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= Subject: [PATCH v3 02/11] fpu: Return struct from parts{64,128}_muladd Date: Thu, 7 May 2026 11:09:50 -0500 Message-ID: <20260507160959.449170-3-richard.henderson@linaro.org> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260507160959.449170-1-richard.henderson@linaro.org> References: <20260507160959.449170-1-richard.henderson@linaro.org> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" 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=lists1p.gnu.org; Received-SPF: pass client-ip=2607:f8b0:4864:20::32d; envelope-from=richard.henderson@linaro.org; helo=mail-ot1-x32d.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: qemu development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @linaro.org) X-ZM-MESSAGEID: 1778170310850154100 At the same time, export. Reviewed-by: Philippe Mathieu-Daud=C3=A9 Signed-off-by: Richard Henderson --- include/fpu/softfloat-parts.h | 9 ++++ fpu/softfloat.c | 83 +++++++++++++++++------------------ fpu/softfloat-parts.c.inc | 38 ++++++++-------- 3 files changed, 69 insertions(+), 61 deletions(-) diff --git a/include/fpu/softfloat-parts.h b/include/fpu/softfloat-parts.h index 46618d217e..7170cc7b6a 100644 --- a/include/fpu/softfloat-parts.h +++ b/include/fpu/softfloat-parts.h @@ -202,6 +202,15 @@ FloatParts64 parts64_mul(const FloatParts64 *a, const = FloatParts64 *b, FloatParts128 parts128_mul(const FloatParts128 *a, const FloatParts128 *b, float_status *s); =20 +FloatParts64 parts64_muladd(const FloatParts64 *a, + const FloatParts64 *b, + const FloatParts64 *c, + int flags, float_status *s); +FloatParts128 parts128_muladd(const FloatParts128 *a, + const FloatParts128 *b, + const FloatParts128 *c, + int flags, float_status *s); + FloatParts64 parts64_round_to_int(const FloatParts64 *a, FloatRoundMode rmode, int scale, float_status *s, diff --git a/fpu/softfloat.c b/fpu/softfloat.c index 90ebd83f69..72ddb19fa0 100644 --- a/fpu/softfloat.c +++ b/fpu/softfloat.c @@ -1906,18 +1906,18 @@ float16 float16_muladd_scalbn(float16 a, float16 b,= float16 c, FloatParts64 pa =3D float16_unpack_canonical(a, status); FloatParts64 pb =3D float16_unpack_canonical(b, status); FloatParts64 pc =3D float16_unpack_canonical(c, status); - FloatParts64 *pr =3D parts64_muladd(&pa, &pb, &pc, flags, status); + FloatParts64 pr =3D parts64_muladd(&pa, &pb, &pc, flags, status); =20 /* Before rounding, scale. */ if (scale) { - parts64_scalbn(pr, scale, status); + parts64_scalbn(&pr, scale, status); } - parts64_uncanon(pr, status, &float16_params, false); + parts64_uncanon(&pr, status, &float16_params, false); /* After rounding, apply negate result, especially for -0.0. */ - if ((flags & float_muladd_negate_result) && !is_nan(pr->cls)) { - pr->sign ^=3D 1; + if ((flags & float_muladd_negate_result) && !is_nan(pr.cls)) { + pr.sign ^=3D 1; } - return pack_raw64(pr, &float16_params); + return pack_raw64(&pr, &float16_params); } =20 float16 float16_muladd(float16 a, float16 b, float16 c, @@ -1933,18 +1933,18 @@ float32_muladd_scalbn(float32 a, float32 b, float32= c, FloatParts64 pa =3D float32_unpack_canonical(a, status); FloatParts64 pb =3D float32_unpack_canonical(b, status); FloatParts64 pc =3D float32_unpack_canonical(c, status); - FloatParts64 *pr =3D parts64_muladd(&pa, &pb, &pc, flags, status); + FloatParts64 pr =3D parts64_muladd(&pa, &pb, &pc, flags, status); =20 /* Before rounding, scale. */ if (scale) { - parts64_scalbn(pr, scale, status); + parts64_scalbn(&pr, scale, status); } - parts64_uncanon(pr, status, &float32_params, false); + parts64_uncanon(&pr, status, &float32_params, false); /* After rounding, apply negate result, especially for -0.0. */ - if ((flags & float_muladd_negate_result) && !is_nan(pr->cls)) { - pr->sign ^=3D 1; + if ((flags & float_muladd_negate_result) && !is_nan(pr.cls)) { + pr.sign ^=3D 1; } - return pack_raw64(pr, &float32_params); + return pack_raw64(&pr, &float32_params); } =20 float64 QEMU_SOFTFLOAT_ATTR @@ -1954,18 +1954,18 @@ float64_muladd_scalbn(float64 a, float64 b, float64= c, FloatParts64 pa =3D float64_unpack_canonical(a, status); FloatParts64 pb =3D float64_unpack_canonical(b, status); FloatParts64 pc =3D float64_unpack_canonical(c, status); - FloatParts64 *pr =3D parts64_muladd(&pa, &pb, &pc, flags, status); + FloatParts64 pr =3D parts64_muladd(&pa, &pb, &pc, flags, status); =20 /* Before rounding, scale. */ if (scale) { - parts64_scalbn(pr, scale, status); + parts64_scalbn(&pr, scale, status); } - parts64_uncanon(pr, status, &float64_params, false); + parts64_uncanon(&pr, status, &float64_params, false); /* After rounding, apply negate result, especially for -0.0. */ - if ((flags & float_muladd_negate_result) && !is_nan(pr->cls)) { - pr->sign ^=3D 1; + if ((flags & float_muladd_negate_result) && !is_nan(pr.cls)) { + pr.sign ^=3D 1; } - return pack_raw64(pr, &float64_params); + return pack_raw64(&pr, &float64_params); } =20 static bool force_soft_fma; @@ -2115,14 +2115,14 @@ float64 float64r32_muladd(float64 a, float64 b, flo= at64 c, FloatParts64 pa =3D float64_unpack_canonical(a, status); FloatParts64 pb =3D float64_unpack_canonical(b, status); FloatParts64 pc =3D float64_unpack_canonical(c, status); - FloatParts64 *pr =3D parts64_muladd(&pa, &pb, &pc, flags, status); + FloatParts64 pr =3D parts64_muladd(&pa, &pb, &pc, flags, status); =20 /* Round before applying negate result. */ - parts64_uncanon(pr, status, &float32_params, false); - if ((flags & float_muladd_negate_result) && !is_nan(pr->cls)) { - pr->sign ^=3D 1; + parts64_uncanon(&pr, status, &float32_params, false); + if ((flags & float_muladd_negate_result) && !is_nan(pr.cls)) { + pr.sign ^=3D 1; } - return float64r32_pack_raw(pr); + return float64r32_pack_raw(&pr); } =20 bfloat16 bfloat16_muladd(bfloat16 a, bfloat16 b, bfloat16 c, @@ -2131,14 +2131,14 @@ bfloat16 bfloat16_muladd(bfloat16 a, bfloat16 b, bf= loat16 c, FloatParts64 pa =3D bfloat16_unpack_canonical(a, status); FloatParts64 pb =3D bfloat16_unpack_canonical(b, status); FloatParts64 pc =3D bfloat16_unpack_canonical(c, status); - FloatParts64 *pr =3D parts64_muladd(&pa, &pb, &pc, flags, status); + FloatParts64 pr =3D parts64_muladd(&pa, &pb, &pc, flags, status); =20 /* Round before applying negate result. */ - parts64_uncanon(pr, status, &bfloat16_params, false); - if ((flags & float_muladd_negate_result) && !is_nan(pr->cls)) { - pr->sign ^=3D 1; + parts64_uncanon(&pr, status, &bfloat16_params, false); + if ((flags & float_muladd_negate_result) && !is_nan(pr.cls)) { + pr.sign ^=3D 1; } - return pack_raw64(pr, &bfloat16_params); + return pack_raw64(&pr, &bfloat16_params); } =20 float128 float128_muladd(float128 a, float128 b, float128 c, @@ -2147,14 +2147,14 @@ float128 float128_muladd(float128 a, float128 b, fl= oat128 c, FloatParts128 pa =3D float128_unpack_canonical(a, status); FloatParts128 pb =3D float128_unpack_canonical(b, status); FloatParts128 pc =3D float128_unpack_canonical(c, status); - FloatParts128 *pr =3D parts128_muladd(&pa, &pb, &pc, flags, status); + FloatParts128 pr =3D parts128_muladd(&pa, &pb, &pc, flags, status); =20 /* Round before applying negate result. */ - parts128_uncanon(pr, status, &float128_params, false); - if ((flags & float_muladd_negate_result) && !is_nan(pr->cls)) { - pr->sign ^=3D 1; + parts128_uncanon(&pr, status, &float128_params, false); + if ((flags & float_muladd_negate_result) && !is_nan(pr.cls)) { + pr.sign ^=3D 1; } - return float128_pack_raw(pr); + return float128_pack_raw(&pr); } =20 /* @@ -5126,7 +5126,7 @@ float32 float32_exp2(float32 a, float_status *status) rp =3D float64_unpack_canonical(float64_one, status); for (int i =3D 0; i < 15; i++) { tp =3D float64_unpack_canonical(float32_exp2_coefficients[i], stat= us); - rp =3D *parts64_muladd(&tp, &xnp, &rp, 0, status); + rp =3D parts64_muladd(&tp, &xnp, &rp, 0, status); xnp =3D parts64_mul(&xnp, &xp, status); } =20 @@ -5175,7 +5175,7 @@ static void parts_s390_divide_to_integer(FloatParts64= *a, FloatParts64 *b, n->sign =3D a->sign ^ b->sign; *cc =3D 0; } else { - FloatParts64 *q, q_buf, *r_precise, r_precise_buf; + FloatParts64 *q, q_buf, r_precise; int float_exception_flags =3D 0; bool is_q_smallish; uint32_t r_flags; @@ -5205,12 +5205,11 @@ static void parts_s390_divide_to_integer(FloatParts= 64 *a, FloatParts64 *b, 0, fmt->frac_size); =20 /* Compute precise remainder */ - r_precise_buf =3D *b; - r_precise =3D parts64_muladd(&r_precise_buf, n, a, + r_precise =3D parts64_muladd(b, n, a, float_muladd_negate_product, status); =20 /* Round remainder to the target format */ - *r =3D *r_precise; + *r =3D r_precise; status->float_exception_flags =3D 0; *r =3D parts64_round_to_fmt(r, status, fmt); r_flags =3D status->float_exception_flags; @@ -5234,17 +5233,17 @@ static void parts_s390_divide_to_integer(FloatParts= 64 *a, FloatParts64 *b, * toward zero) or incremented. */ saved_r_sign =3D r->sign; - saved_r_precise_sign =3D r_precise->sign; + saved_r_precise_sign =3D r_precise.sign; r->sign =3D false; - r_precise->sign =3D false; - if (parts64_compare(r, r_precise, status, true) < + r_precise.sign =3D false; + if (parts64_compare(r, &r_precise, status, true) < float_relation_equal) { *dxc =3D 0x8; } else { *dxc =3D 0xc; } r->sign =3D saved_r_sign; - r_precise->sign =3D saved_r_precise_sign; + r_precise.sign =3D saved_r_precise_sign; } } } diff --git a/fpu/softfloat-parts.c.inc b/fpu/softfloat-parts.c.inc index 3d2606c07c..87525fb4b6 100644 --- a/fpu/softfloat-parts.c.inc +++ b/fpu/softfloat-parts.c.inc @@ -677,9 +677,8 @@ FloatPartsN partsN(mul)(const FloatPartsN *a, const Flo= atPartsN *b, * Requires A and C extracted into a double-sized structure to provide the * extra space for the widening multiply. */ -static FloatPartsN *partsN(muladd)(FloatPartsN *a, FloatPartsN *b, - FloatPartsN *c, - int flags, float_status *s) +FloatPartsN partsN(muladd)(const FloatPartsN *a, const FloatPartsN *b, + const FloatPartsN *c, int flags, float_status *= s) { int ab_mask =3D float_cmask(a->cls) | float_cmask(b->cls); int c_mask =3D float_cmask(c->cls); @@ -717,10 +716,13 @@ static FloatPartsN *partsN(muladd)(FloatPartsN *a, Fl= oatPartsN *b, } =20 /* Narrow with sticky bit, for proper rounding later. */ - fracN(truncjam)(a, &p_widen); - a->sign =3D p_widen.sign; - a->exp =3D p_widen.exp; - return a; + FloatPartsN r =3D { + .sign =3D p_widen.sign, + .exp =3D p_widen.exp, + .cls =3D float_class_normal, + }; + fracN(truncjam)(&r, &p_widen); + return r; } =20 /* @@ -730,8 +732,7 @@ static FloatPartsN *partsN(muladd)(FloatPartsN *a, Floa= tPartsN *b, * off to the target-specific pick-a-NaN routine. */ if (unlikely(abc_mask & float_cmask_anynan)) { - *a =3D partsN(pick_nan_muladd)(a, b, c, s, ab_mask, abc_mask); - return a; + return partsN(pick_nan_muladd)(a, b, c, s, ab_mask, abc_mask); } =20 if (unlikely(ab_mask =3D=3D float_cmask_infzero)) { @@ -748,9 +749,7 @@ static FloatPartsN *partsN(muladd)(FloatPartsN *a, Floa= tPartsN *b, } /* Inf + C =3D=3D Inf */ record_denormals_used(abc_mask, s); - a->sign =3D p_sign; - a->cls =3D float_class_inf; - return a; + return (FloatPartsN){ .sign =3D p_sign, .cls =3D float_class_inf }; } record_denormals_used(abc_mask, s); =20 @@ -765,19 +764,20 @@ static FloatPartsN *partsN(muladd)(FloatPartsN *a, Fl= oatPartsN *b, if (!(c_mask & float_cmask_zero) || p_sign =3D=3D c_sign || (flags & float_muladd_suppress_add_product_zero)) { - c->sign =3D c_sign; - return c; + FloatPartsN r =3D *c; + r.sign =3D c_sign; + return r; } =20 return_sub_zero: /* 0 - 0 =3D=3D -0 for round_down, +0 otherwise. */ - a->sign =3D s->float_rounding_mode =3D=3D float_round_down; - a->cls =3D float_class_zero; - return a; + return (FloatPartsN){ + .sign =3D s->float_rounding_mode =3D=3D float_round_down, + .cls =3D float_class_zero + }; =20 d_nan: - *a =3D partsN(default_nan)(s); - return a; + return partsN(default_nan)(s); } =20 /* --=20 2.43.0 From nobody Mon May 25 20:33:42 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=linaro.org ARC-Seal: i=1; a=rsa-sha256; t=1778170297; cv=none; d=zohomail.com; s=zohoarc; b=SazsrBcV5hDMCGgtVxScTMerxCCcB9IFFZlhN3SN0gVADfdPATNJEMCBC3yn0bmOiNMb9xYW/4IzB3e77NuVQS98pyDDbFJc0fzQOaNHIw0xvIbhzPBL94jWdU3PA0doWAbKIyc+vJze7TM/FH9Xf1vIV00kw7mv4x9e6GanarA= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1778170297; h=Content-Transfer-Encoding:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To:Cc; bh=2PfrqBtIf7vrbh2G9kIH/7coVyeCHu2A8Sgg5/INWz4=; b=mxTMgfjSKhGcOZ5Ak9nZBkxVq6qRgw1k5E7hIbEgthPemEPomX8y/Fr5+UnBlAeEviaL0tT/e3fXGmVyGHV/UGeEZc6rPbZeGpYprKZIwWlLOcmiPEq8HNsdZFNFfK8mJkeqZsMycmSRFwWgTus3+AMp6kC6amk9yg5HQwTBS0A= 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 lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1778170297085181.26903000565937; Thu, 7 May 2026 09:11:37 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wL1JO-0002lJ-2j; Thu, 07 May 2026 12:10:54 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wL1Ie-0001gR-7Q for qemu-devel@nongnu.org; Thu, 07 May 2026 12:10:11 -0400 Received: from mail-ot1-x331.google.com ([2607:f8b0:4864:20::331]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1wL1Ib-00085e-K4 for qemu-devel@nongnu.org; Thu, 07 May 2026 12:10:07 -0400 Received: by mail-ot1-x331.google.com with SMTP id 46e09a7af769-7dbe07d3ec3so530858a34.0 for ; Thu, 07 May 2026 09:10:05 -0700 (PDT) Received: from stoup.attlocal.net ([2600:381:c938:6375:9641:bbb2:a93a:bb4c]) by smtp.gmail.com with ESMTPSA id 46e09a7af769-7e302462fb1sm16415a34.11.2026.05.07.09.10.03 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 07 May 2026 09:10:03 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1778170204; x=1778775004; 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=2PfrqBtIf7vrbh2G9kIH/7coVyeCHu2A8Sgg5/INWz4=; b=Q/zcIfj4gVp9No/9ryuJ7+UsPqxaEvV0cY8esTO4lSAmKN7Nl9CH/014WcHVCy536+ avyWuImv5Cz/kLe5muwleQ2l/xnAecopEyMtLq9Sfta5JZmVWD8Jx1omwn2rMmIiGCwc g+xJcK21PO/U8g8lYvCQ9G5x237GMYjc2O54/+x4RxDGOCcgrREc8bhBriLkUcKAgG6u mj25xDDWslrBj8UPMPPhHW/7jLOr5eRnpyBkYMpRfi6uShzebER2OV+P5GwD3vF5yuyo 6goyR2w5KTCcc6TpokdS93dG8Bq6egSpTPoSXWyekse0h/IMMFmhP8ji6kOXiPyd0DsT bw1A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1778170204; x=1778775004; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:to:from:x-gm-gg:x-gm-message-state:from:to :cc:subject:date:message-id:reply-to; bh=2PfrqBtIf7vrbh2G9kIH/7coVyeCHu2A8Sgg5/INWz4=; b=MXkEEveGY5Zj2WuKfVFdB+/OHBsr6xQwe/sB5DxuNYXTp5/BbevZ33lFKc354KekuQ 6mvuM/80RjsetGmWR7OmbXtDilW55LEmYnArVPM3L4Nm14pCqzoYg/BVb60v+Bb7cu9c kTSmyylB6ioKALs6DKS16rshCK9/X0qRj4a/wESh3rh//GVC396qMy3Ld4xwrreOnZs7 ywsGESQXf4TQTgWMp99EcmBSpHMybDVi6Puo2oWic2nnMWzESAhvrpyiGVIRfEaVF3Gt NdXZ35Ca1NPo1+liMcyWW6T0+pHv1loj8pOmKQPHoOmXQVWxmCQfnnATcvEMI1wGTRmM 9kbQ== X-Gm-Message-State: AOJu0Yxp5g+MM54XOhqRYMp0QRhpDLH2jG+E8TvF1EDmskxnXKCdv2l9 tLXyGconlQmjzpH88465pS5rnJABY6mRtdsI5X6h6w8XqiRVsJ52bAeMNn3OSr9tpKgO7VAab9p ruCB2 X-Gm-Gg: AeBDieu1zI5sUTXP3CDvsGfhSBbKkw3nurafYPpzl++w0pLcUCrVoFa9UjPY4FiYXmh 5RkVaw0ONqlCXdiBPLjuljwqRZheSQi6SxzJUlXhg2pHZ5UZtfQwyxWVzeS9UYEgTYQ3eV2z8NX rz6qKd6p60gDtIXUJPmdmtJK0O/SXFtVboFeexHDMLNGrTm96PuQsoUKMRdqXpmdtASRR9EoTlA ra02VgBckFTLR1PWusPkxxBsNnWtK9yUQXDTdqqxAr7+pyWGxIhNY63ZXy9fdPWtqDlSiL/rGIk 7Bf7+Hzodd3d250jvtt5O2NfLZaO6VxJdj17bPzRFEI0whVgHBahDnipkZMP5c6l7fUl0Srq3JN DYGXr6Nk/WnUdp1YdsGP1mfOqvXcWTDwrHdHVrH9pWhj2/yE+ER3chm2L1zEtcLDuii+PlgE8mZ Ja0pVc8BNJN8JYm1vzBP+cOtlM9Ico6FOjCjmv6Q3hmjJigg== X-Received: by 2002:a05:6830:83b1:b0:7d7:f623:680a with SMTP id 46e09a7af769-7e1ded2af14mr4988566a34.2.1778170204330; Thu, 07 May 2026 09:10:04 -0700 (PDT) From: Richard Henderson To: qemu-devel@nongnu.org Subject: [PATCH v3 03/11] fpu: Hoist nan check in partsN_addsub Date: Thu, 7 May 2026 11:09:51 -0500 Message-ID: <20260507160959.449170-4-richard.henderson@linaro.org> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260507160959.449170-1-richard.henderson@linaro.org> References: <20260507160959.449170-1-richard.henderson@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=lists1p.gnu.org; Received-SPF: pass client-ip=2607:f8b0:4864:20::331; envelope-from=richard.henderson@linaro.org; helo=mail-ot1-x331.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: qemu development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @linaro.org) X-ZM-MESSAGEID: 1778170298656154100 Content-Type: text/plain; charset="utf-8" The nan test had been down below because it was unlikely. But if we have to have one anyway because of denormals, we might as well take care of them right away. Signed-off-by: Richard Henderson Reviewed-by: Philippe Mathieu-Daud=C3=A9 --- fpu/softfloat-parts.c.inc | 19 +++++-------------- 1 file changed, 5 insertions(+), 14 deletions(-) diff --git a/fpu/softfloat-parts.c.inc b/fpu/softfloat-parts.c.inc index 87525fb4b6..20cb739c75 100644 --- a/fpu/softfloat-parts.c.inc +++ b/fpu/softfloat-parts.c.inc @@ -530,13 +530,15 @@ FloatPartsN partsN(addsub)(const FloatPartsN *a_orig, { int ab_mask =3D float_cmask(a_orig->cls) | float_cmask(b_orig->cls); =20 + if (unlikely(ab_mask & float_cmask_anynan)) { + return partsN(pick_nan)(a_orig, b_orig, s); + } + /* * For addition and subtraction, we will consume an * input denormal unless the other input is a NaN. */ - if (!(ab_mask & float_cmask_anynan)) { - record_denormals_used(ab_mask, s); - } + record_denormals_used(ab_mask, s); =20 FloatPartsN a =3D *a_orig; FloatPartsN b =3D *b_orig; @@ -558,10 +560,6 @@ FloatPartsN partsN(addsub)(const FloatPartsN *a_orig, return a; } =20 - if (unlikely(ab_mask & float_cmask_anynan)) { - goto p_nan; - } - if (ab_mask & float_cmask_inf) { if (a.cls !=3D float_class_inf) { /* N - Inf */ @@ -586,10 +584,6 @@ FloatPartsN partsN(addsub)(const FloatPartsN *a_orig, return a; } =20 - if (unlikely(ab_mask & float_cmask_anynan)) { - goto p_nan; - } - if (ab_mask & float_cmask_inf) { a.cls =3D float_class_inf; return a; @@ -604,9 +598,6 @@ FloatPartsN partsN(addsub)(const FloatPartsN *a_orig, g_assert(a.cls =3D=3D float_class_zero); g_assert(is_anynorm(b.cls)); return b; - - p_nan: - return partsN(pick_nan)(a_orig, b_orig, s); } =20 /* --=20 2.43.0 From nobody Mon May 25 20:33:42 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=linaro.org ARC-Seal: i=1; a=rsa-sha256; t=1778170315; cv=none; d=zohomail.com; s=zohoarc; b=fcT9X8G3/1MliWp2BBh4O+Bwsc0If+5/XQqwrPhqxtM7ilukr3QVPQATSHoff4apk76I0o+WETG63C9y5KJ1y5QGC4KzkXkpXbQQWodWOalZqbZ3CDFywwXioKnKRqd4ek+YlH7hgnnYyX1uBClTbXzIhnGRb8JHYVSUUMGGMW8= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1778170315; h=Content-Transfer-Encoding:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To:Cc; bh=MQ1ojMgoomCJTz2WUmM2Kg1zoPKv7tCL+iMiboWdMVw=; b=HAnuZO3QZ1VHJs1O6XW8g8S17Yxdp/FMumMO6X5bIpoNMT0Ge5jMX7ENIq79KkvqyLkTcVRD/+GMz90zIc4vhD7FF6qV7aIRAJ/bp3HXiuzngBdgqyNrmxiejhtg+MOP5dg/qAnpOqUo+1nwqg7Bxk5QEnQ/M+rMTtT9ZoBDNK4= 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 lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1778170315088266.0414489863382; Thu, 7 May 2026 09:11:55 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wL1JK-0002VK-Sm; Thu, 07 May 2026 12:10:50 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wL1Ie-0001gQ-79 for qemu-devel@nongnu.org; Thu, 07 May 2026 12:10:11 -0400 Received: from mail-ot1-x32b.google.com ([2607:f8b0:4864:20::32b]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1wL1Ic-00086S-I3 for qemu-devel@nongnu.org; Thu, 07 May 2026 12:10:07 -0400 Received: by mail-ot1-x32b.google.com with SMTP id 46e09a7af769-7dbcb467f2bso925289a34.3 for ; Thu, 07 May 2026 09:10:06 -0700 (PDT) Received: from stoup.attlocal.net ([2600:381:c938:6375:9641:bbb2:a93a:bb4c]) by smtp.gmail.com with ESMTPSA id 46e09a7af769-7e302462fb1sm16415a34.11.2026.05.07.09.10.04 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 07 May 2026 09:10:04 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1778170205; x=1778775005; 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=MQ1ojMgoomCJTz2WUmM2Kg1zoPKv7tCL+iMiboWdMVw=; b=dv1gRtVB5AJlxf/P6kORDFQYhYzuKuq3NSgeb6l9TenjKuKW4i5+HY492JMTLBMcHs 4TnZiFVPNILedOGqsdffBQY0SCdGp4GtJ48LcA+0BVfC89DmTdDY6oxS7wx9uR75gxzz tRZ6WxNsBFncgxqKQBy3IWYV3sYjy7ztcQndwI1pamGO7c5meUyviNAkyiJI+mMS4ss7 iE6ZplpAXvz3iAZ0kgkcKYNMXwChI6Lob1ZHyGWw+p1HO6EdadGUlAnxcWuvGyq5X1Ex NMh9E7966u9FxIK0zW8mvy5MLpGl0E7wPUdbwQ28Dy/NnJOzOZf/KvDJU0/hJwla1mKx lVbA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1778170205; x=1778775005; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:to:from:x-gm-gg:x-gm-message-state:from:to :cc:subject:date:message-id:reply-to; bh=MQ1ojMgoomCJTz2WUmM2Kg1zoPKv7tCL+iMiboWdMVw=; b=aPHPBFBXPxHBWDRxtZKeoHJSZJkV0v11ibSvaHcZ7iLMj9e/ZE9fqCJvassr9ZWKOD Fgj7DUf+0vupzrsekTRq+69Od4mrYiiKnq0AB3uzYYZaf4FWfOlH04hOYw++q43GXUg2 ICJ/g8SFVFXR4BVUuUed11ToDNAoNml0Pp1jqWbgk/9BgNZa9jfhN226LaE/Tql66Flj 1zSJl4ULVBDeDPogf/CdLPclTmx8Qg/T/jEZhG8Jwc9e9m9m8EhBBAm0UjXn0/5WEr3Q +A8q6jP2PVItvWqZLDtmUa0B7dELVxNKygc6s3ks2zJTrp5mvdFxzeEK3urFSFrMbsSa exGw== X-Gm-Message-State: AOJu0YyAVbcBwxv2+hbxPEXops0VOHybyB6I3LWKnaLdYfxv4kYHjV48 OC/VMsB0t49W6NDGNMb9GjVFCX9DqEJzpT9PPzs79aSJzjT6XCluqiRW3dmCzNM3YiMWsUwlBPl edXKh X-Gm-Gg: AeBDiesl2FvAC2oAN9cY2o6CXpuySmqo6TgQxm+78oIru27p6XOYQEPP786TGbHwFVR GxzmsBcYxnSwoNoFdV604UtyspyAWfsk/sxBFkdEct9eNOnUiRpUNGbn6P0N4F7Iabf9zKWFeyf ZXC7cKkjEvSq6tlPVodilV39ggpAQs47T9i/32L3ctfZSrsZeRKg2sISdNTc0INOZNrlBCyYv2Q gwdfxSbAWxsNiDxoXiEcth70vTjwSEEylvBSYjZ72z+DV9Zes3i2BuGAS3G+zOlhju3WSkD/rLl dcRGbAQxVfmsnxcMlPjjRPzpSt5iQB7HpxnRqCUOV1OLcul5BMtOww3AOtBshWv2zALpnSMa/iu dPNUVUu07UgjEGMFSZ1Ac+totOk3XFhsxHvQ//KS8mdugBXpQ/NFJzqDuIGzw5Ne7AUw7l8eWdr +6/dF/zu/VAWtdnPn2MMdryxVHCIl9jGyiIcKrUhIN2103fw== X-Received: by 2002:a05:6830:378e:b0:7de:49c0:a752 with SMTP id 46e09a7af769-7e1df26c2d2mr5164347a34.27.1778170205228; Thu, 07 May 2026 09:10:05 -0700 (PDT) From: Richard Henderson To: qemu-devel@nongnu.org Subject: [PATCH v3 04/11] fpu: Simplify 0 +/- N case in parts_addsub Date: Thu, 7 May 2026 11:09:52 -0500 Message-ID: <20260507160959.449170-5-richard.henderson@linaro.org> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260507160959.449170-1-richard.henderson@linaro.org> References: <20260507160959.449170-1-richard.henderson@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=lists1p.gnu.org; Received-SPF: pass client-ip=2607:f8b0:4864:20::32b; envelope-from=richard.henderson@linaro.org; helo=mail-ot1-x32b.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: qemu development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @linaro.org) X-ZM-MESSAGEID: 1778170317157158500 Content-Type: text/plain; charset="utf-8" Consolidate the tests for zero and anynorm. Add comments for a few cases. Signed-off-by: Richard Henderson --- fpu/softfloat-parts.c.inc | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/fpu/softfloat-parts.c.inc b/fpu/softfloat-parts.c.inc index 20cb739c75..6df98eb5fb 100644 --- a/fpu/softfloat-parts.c.inc +++ b/fpu/softfloat-parts.c.inc @@ -556,6 +556,7 @@ FloatPartsN partsN(addsub)(const FloatPartsN *a_orig, } =20 if (ab_mask =3D=3D float_cmask_zero) { + /* 0 - 0 */ a.sign =3D s->float_rounding_mode =3D=3D float_round_down; return a; } @@ -581,23 +582,20 @@ FloatPartsN partsN(addsub)(const FloatPartsN *a_orig, } =20 if (ab_mask =3D=3D float_cmask_zero) { + /* 0 + 0 */ return a; } =20 if (ab_mask & float_cmask_inf) { + /* N + Inf or Inf + N */ a.cls =3D float_class_inf; return a; } } =20 - if (b.cls =3D=3D float_class_zero) { - g_assert(is_anynorm(a.cls)); - return a; - } - - g_assert(a.cls =3D=3D float_class_zero); - g_assert(is_anynorm(b.cls)); - return b; + /* 0 +/- N or N +/- 0 */ + assert((ab_mask & float_cmask_zero) && (ab_mask & float_cmask_anynorm)= ); + return b.cls =3D=3D float_class_zero ? a : b; } =20 /* --=20 2.43.0 From nobody Mon May 25 20:33:42 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=linaro.org ARC-Seal: i=1; a=rsa-sha256; t=1778170280; cv=none; d=zohomail.com; s=zohoarc; b=ZVsTRcCrt0pYAHeF5G+CfsPfhxW5pn4FVpekE+vYpdksXgkw8yHHUdl0EH5bg0I9czSDf41hVOxnNm8k57FIXOnJvD+Kucb7mDTs6+Xu5JOgPYVj6ACl837OFLOlXVFGHYXzxumuUzZWxgWAk6qj7EGGyn775k8e2OuHb8NgbXA= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1778170280; h=Content-Transfer-Encoding:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To:Cc; bh=uvxQVzD2NWrupoCz4G/8KaK0EyttZI+r4W+RC04wPrI=; b=KUaQh4sBWUx8F9s8CW6buIsqooJGR/JA7NSG3uQDFv54Wlh7kX6zwMqmIMM0Gs1P5M1EWVmgca9lO4KFiYntF+LY/c8kSCorCpICMBBwoxw2tZ6Yt02+kSm6wN2pGfig9OdIPrEKG+I28bf3Az65F9+0BiGpntaA3e04tWpVfP4= 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 lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1778170280399501.7900800970817; Thu, 7 May 2026 09:11:20 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wL1JJ-0002L8-6b; Thu, 07 May 2026 12:10:49 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wL1If-0001kr-TS for qemu-devel@nongnu.org; Thu, 07 May 2026 12:10:11 -0400 Received: from mail-ot1-x32a.google.com ([2607:f8b0:4864:20::32a]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1wL1Id-00087L-R9 for qemu-devel@nongnu.org; Thu, 07 May 2026 12:10:09 -0400 Received: by mail-ot1-x32a.google.com with SMTP id 46e09a7af769-7dbe07d3ec3so530881a34.0 for ; Thu, 07 May 2026 09:10:07 -0700 (PDT) Received: from stoup.attlocal.net ([2600:381:c938:6375:9641:bbb2:a93a:bb4c]) by smtp.gmail.com with ESMTPSA id 46e09a7af769-7e302462fb1sm16415a34.11.2026.05.07.09.10.05 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 07 May 2026 09:10:06 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1778170206; x=1778775006; 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=uvxQVzD2NWrupoCz4G/8KaK0EyttZI+r4W+RC04wPrI=; b=m8eSwXJ+BLGbmekBK9gvFB9w5e9uBI8dLFDBiXGC7BcxykpYmMLpxmIsCChXY7MWxr qKm9pZis56tFdAdxjdm602d3gA0Z7dnIvrpUQt8LTi37QdnTeX8DA1EhavmLQQ2DhLJC 3BUFY+7Q3e9DeJliTHYVcz9Sdks/wsygsSVNhwLRPHeh6SK59XsrWUeNOSobUzKCJsWj yMNAjzcz/5j3jJjzNMuYmTIdSPlMEAPpf5bV4SPAhCrqZja1UzRERFistbj+xvv4VsXY NWoJCad6KDAEQF+OTQNErBNcKl5trbtKFFAfXkqp1xoG4MWCTbt4sYMSakYvCeZo4thO ZkZw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1778170206; x=1778775006; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:to:from:x-gm-gg:x-gm-message-state:from:to :cc:subject:date:message-id:reply-to; bh=uvxQVzD2NWrupoCz4G/8KaK0EyttZI+r4W+RC04wPrI=; b=gSWPImx7ru2FMhel7jAOXWs+6m8Tb6qod8dE0Qm/arHMdoptyHKqTZvoPKtvNSuYbQ gB/NZS/amy/4JhU4HZBbKHOr0gpKCDfbryzXcL8Jm2TRPVqWEsFPWR1vZbDTjauIKcin jh3MbKp64ZnNkR9fzDmUiUNVk2ZWfqou8Dn465Z55uU5JLK8Z5T0XZBNcCKd2OX66Pdf QREKD09gSUQTL8GITApfvOoriMva9TG9SpAKjJ6x/J9C5KHPT9xOHJqlwek2Fhzt0Bha TpjjRh9tgYAGDkEfM+p9KTWQu+quRcPjeiKJZ767C/mLSSEee9HBnDgGaSGVMMiaq2pH InvQ== X-Gm-Message-State: AOJu0YzGGhctMAE3d2J3NFXGyYVjXmHlpR5l8gLNwJWBx1qlmq7hR65p +lALr+i/9wbZTymUeNDNrbLJW1aT2IKo2EuFs/9jsg/4lc6QnbZpamFWrUesaWW4QLywO/aLEW2 +pAKm X-Gm-Gg: AeBDieuYOQFgERUAhMo2rR+56kKFNwaVMuo9vcnOiieYLoy4EwRb2o3GN08caeW5qe+ Y7rRxU7cY1M7+tsrS7Fjac/+yKYt6faMHnyz+ZWmCJoWIutl8ZbNXOKqoiGhWX38vTKTE8a0qW6 zuoIX6B0+2lnk5o3kIADWa3kvEQSRuOZSn9Gcb1o1004v/xpMJW/Q6AZ5JBqB/3WilIGpjKfLMT aagFwXG+ADsp8zy6VbZa+sdFLhNyStuzs/zDgdEstGtCJ8MICSJYRSGHSkBxkwBP87sJNMTrXcw tOlQATsCX1HSHpeSOAG7EM6QbdSOIRvqMbzSCqkmDjNslyedlv3hF+EtIvrqgNKJBNG9GiD8uUH KD3JlQq7A0bHeo88uf7BkO6TrkQCLOn8exvv2DiveGcTmF8s0vPxNYPFkIjSATNgZr7rrhaqg4Z TmxdPxGF5Idi3/gIaev9QQmPCwXRaDRlLf5LRRv+BDF084Yw== X-Received: by 2002:a05:6830:921:b0:7de:4fc6:a588 with SMTP id 46e09a7af769-7e1df08a13bmr4830292a34.23.1778170206440; Thu, 07 May 2026 09:10:06 -0700 (PDT) From: Richard Henderson To: qemu-devel@nongnu.org Subject: [PATCH v3 05/11] fpu: Use parts64_round_to_int in parts_s390_divide_to_integer Date: Thu, 7 May 2026 11:09:53 -0500 Message-ID: <20260507160959.449170-6-richard.henderson@linaro.org> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260507160959.449170-1-richard.henderson@linaro.org> References: <20260507160959.449170-1-richard.henderson@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=lists1p.gnu.org; Received-SPF: pass client-ip=2607:f8b0:4864:20::32a; envelope-from=richard.henderson@linaro.org; helo=mail-ot1-x32a.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: qemu development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @linaro.org) X-ZM-MESSAGEID: 1778170282489154100 Content-Type: text/plain; charset="utf-8" We will not expose parts_round_to_int_normal. Signed-off-by: Richard Henderson --- fpu/softfloat.c | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/fpu/softfloat.c b/fpu/softfloat.c index 72ddb19fa0..cd03ace323 100644 --- a/fpu/softfloat.c +++ b/fpu/softfloat.c @@ -5197,12 +5197,11 @@ static void parts_s390_divide_to_integer(FloatParts= 64 *a, FloatParts64 *b, * Rounding of partial quotient may be inexact. This is the whole = point * of distinguishing partial quotients, so ignore the exception. */ - *n =3D *q; - parts64_round_to_int_normal(n, - is_q_smallish - ? final_quotient_rounding_mode - : float_round_to_zero, - 0, fmt->frac_size); + *n =3D parts64_round_to_int(q, + is_q_smallish + ? final_quotient_rounding_mode + : float_round_to_zero, + 0, status, fmt); =20 /* Compute precise remainder */ r_precise =3D parts64_muladd(b, n, a, --=20 2.43.0 From nobody Mon May 25 20:33:42 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=fail; 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=fail(p=none dis=none) header.from=linaro.org Return-Path: Received: from lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1778170270929231.1293193824871; Thu, 7 May 2026 09:11:10 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wL1JL-0002Zw-Pv; Thu, 07 May 2026 12:10:51 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wL1Ii-0001lv-59 for qemu-devel@nongnu.org; Thu, 07 May 2026 12:10:14 -0400 Received: from mail-ot1-x32d.google.com ([2607:f8b0:4864:20::32d]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1wL1If-00088L-M1 for qemu-devel@nongnu.org; Thu, 07 May 2026 12:10:11 -0400 Received: by mail-ot1-x32d.google.com with SMTP id 46e09a7af769-7dbe07d3ec3so530892a34.0 for ; Thu, 07 May 2026 09:10:08 -0700 (PDT) Received: from stoup.attlocal.net ([2600:381:c938:6375:9641:bbb2:a93a:bb4c]) by smtp.gmail.com with ESMTPSA id 46e09a7af769-7e302462fb1sm16415a34.11.2026.05.07.09.10.06 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 07 May 2026 09:10:07 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1778170208; x=1778775008; darn=nongnu.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=IjstTKJT90sH1HrKciEy2EXgN+I4s6KJIu6v2tPYbj4=; b=LwJijNhFJQRMEKYu27KwzuALoLZzf9FuLV6HmAAFYjl3VrwvmgdYHiXqAUvP6tR0/z t4lMaz2PwoVw+VyYPqXm0WlGehsra1xSEW5j7E9mVSLl+E07rOWCZVmpgeHtRy0TCa9w PYhZLGV4J3TogiK9+vJyT1Oe1pUUgoKk3N0qj0RgJGTRQeAknHXT3maxkZNt/62fjncI 3h5BSyI5q1IjJ+mo75nR1EONQrm92ZbtgMLHaJ7Ug/9RJ6c4hAsdfgTzNyEXtG/M3Sbr n2k8pQ2aeebVvRHjwJ4R/ZcGcHPyUZH/Pw0AG4CDb5sFKCaZz/yuoNy93lWfEXWuq7M6 w9rg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1778170208; x=1778775008; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=IjstTKJT90sH1HrKciEy2EXgN+I4s6KJIu6v2tPYbj4=; b=WtXK7ybRbQyw1MH5CumQHDLCXIj7YgIpaWisq4fsJM8TKQ1FBmOiAl72mbp6c1LMOk O7N1wRgprNhzKtl6JjXPBoiLVuVkqV0PM0Oa9iHGvUqjbAopmclTfoa556waLVlHoAVH g4taHUEMNGw6eowK6dTKs5hB7/qlT6SXuxZ3jQdrLXjnAwJ7bQytvy/R77/52RzMTHZh Zq4EYLCDVuZ1gnB6xYVhhnp/4NZPcP89cwvsulSfqE/CbZGh7zTdBXPqUzSroOKWQ3BY opbipQ/J2n9wSNEfPHN2JimDaV9IdW13kZubBu0ZmQYlOveifcNqjFOPAx0p2FIAII7Q yJ5g== X-Gm-Message-State: AOJu0YzqTAvAgDVuhUyL+GZPUbczTNpNleyGUWlMLtQNzbwAVpzwn45o z45OgGdT+uwQ5Hri5m09RsgLSRYlY/lSSICc4dEqvllQy+ABicFxYsL1SMJoB8AS0drZBtKe23M nZgq8 X-Gm-Gg: AeBDiesH2FctrBrpZ1iCRst8nNa5OKpHKMTORIGZikoDyqMY//KelphMZzi9EZgSZdK UcOuu5Jg043hJbRMpiNsKy1egCz0orXUZD4KSeDDTwUQOtV8a3JUhWbLBtqHYjOJ9qdmbdAGc+V +8OGEFiUapkYFYdpUgF1GS/+DD6fBCdSvmLyRwokKoz10NtGgM5VYv4ZHEhyXT+cPrNoi0H1aCM O7UwBPPebi++1ihUKZGv30NqQM9umqC8R04apvBUKBwjSfUiqwzkOdNL/6BcwWQBNdIFq/1+JpW lO6i4noRqCylReNRGWiWt4AAMJqcOY8LroDUOmVIP1OgJeJd3u8hicgbtWYkfWXUunWv+8Exka+ r4ZJbxN7a4BRnTQYbLY0RmcHIo1w2wze7Jb+0t/texM9CXgF849QgaoU2W9uZYkjbILCzDUw8jj rVcYmKvbVNUDp6weZtWJnAdykhWR3aIcja31eLyV0u+fsoaA== X-Received: by 2002:a05:6830:6d15:b0:7d9:71e7:abe5 with SMTP id 46e09a7af769-7e1dee9096amr5434678a34.10.1778170207609; Thu, 07 May 2026 09:10:07 -0700 (PDT) From: Richard Henderson To: qemu-devel@nongnu.org Cc: =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= , Ilya Leoshkevich Subject: [PATCH v3 06/11] target/s390x: Move float{32, 64}_s390_divide_to_integer Date: Thu, 7 May 2026 11:09:54 -0500 Message-ID: <20260507160959.449170-7-richard.henderson@linaro.org> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260507160959.449170-1-richard.henderson@linaro.org> References: <20260507160959.449170-1-richard.henderson@linaro.org> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" 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=lists1p.gnu.org; Received-SPF: pass client-ip=2607:f8b0:4864:20::32d; envelope-from=richard.henderson@linaro.org; helo=mail-ot1-x32d.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: qemu development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZM-MESSAGEID: 1778170272977158500 Now that we've exposed enough infrastructure, this can be implemented in the backend that needs it. Reviewed-by: Philippe Mathieu-Daud=C3=A9 Reviewed-by: Ilya Leoshkevich Signed-off-by: Richard Henderson --- include/fpu/softfloat.h | 11 --- fpu/softfloat.c | 137 ---------------------------------- target/s390x/tcg/fpu_helper.c | 135 +++++++++++++++++++++++++++++++++ 3 files changed, 135 insertions(+), 148 deletions(-) diff --git a/include/fpu/softfloat.h b/include/fpu/softfloat.h index 8389a07b04..1580d956d5 100644 --- a/include/fpu/softfloat.h +++ b/include/fpu/softfloat.h @@ -1386,15 +1386,4 @@ static inline bool float128_unordered_quiet(float128= a, float128 b, *-------------------------------------------------------------------------= ---*/ float128 float128_default_nan(float_status *status); =20 -#define DECLARE_S390_DIVIDE_TO_INTEGER(floatN) = \ -void floatN ## _s390_divide_to_integer(floatN a, floatN b, = \ - int final_quotient_rounding_mode, = \ - bool mask_underflow, bool mask_inex= act, \ - floatN *r, floatN *n, = \ - uint32_t *cc, int *dxc, = \ - float_status *status) -DECLARE_S390_DIVIDE_TO_INTEGER(float32); -DECLARE_S390_DIVIDE_TO_INTEGER(float64); - - #endif /* SOFTFLOAT_H */ diff --git a/fpu/softfloat.c b/fpu/softfloat.c index cd03ace323..6a14c5d639 100644 --- a/fpu/softfloat.c +++ b/fpu/softfloat.c @@ -5151,143 +5151,6 @@ floatx80 floatx80_round(floatx80 a, float_status *s= tatus) return floatx80_round_pack_canonical(&p, status); } =20 -static void parts_s390_divide_to_integer(FloatParts64 *a, FloatParts64 *b, - int final_quotient_rounding_mode, - bool mask_underflow, bool mask_in= exact, - const FloatFmt *fmt, - FloatParts64 *r, FloatParts64 *n, - uint32_t *cc, int *dxc, - float_status *status) -{ - /* POp table "Results: DIVIDE TO INTEGER (Part 1 of 2)" */ - if ((float_cmask(a->cls) | float_cmask(b->cls)) & float_cmask_anynan) { - *r =3D parts64_pick_nan(a, b, status); - *n =3D *r; - *cc =3D 1; - } else if (a->cls =3D=3D float_class_inf || b->cls =3D=3D float_class_= zero) { - *r =3D parts64_default_nan(status); - *n =3D *r; - *cc =3D 1; - status->float_exception_flags |=3D float_flag_invalid; - } else if (b->cls =3D=3D float_class_inf) { - *r =3D *a; - n->cls =3D float_class_zero; - n->sign =3D a->sign ^ b->sign; - *cc =3D 0; - } else { - FloatParts64 *q, q_buf, r_precise; - int float_exception_flags =3D 0; - bool is_q_smallish; - uint32_t r_flags; - - /* Compute precise quotient */ - q_buf =3D parts64_div(a, b, status); - q =3D &q_buf; - - /* - * Check whether two closest integers can be precisely represented, - * i.e., all their bits fit into the fractional part. - */ - is_q_smallish =3D q->exp < (fmt->frac_size + 1); - - /* - * Final quotient is rounded using final-quotient-rounding method,= and - * partial quotient is rounded toward zero. - * - * Rounding of partial quotient may be inexact. This is the whole = point - * of distinguishing partial quotients, so ignore the exception. - */ - *n =3D parts64_round_to_int(q, - is_q_smallish - ? final_quotient_rounding_mode - : float_round_to_zero, - 0, status, fmt); - - /* Compute precise remainder */ - r_precise =3D parts64_muladd(b, n, a, - float_muladd_negate_product, status); - - /* Round remainder to the target format */ - *r =3D r_precise; - status->float_exception_flags =3D 0; - *r =3D parts64_round_to_fmt(r, status, fmt); - r_flags =3D status->float_exception_flags; - - /* POp table "Results: DIVIDE TO INTEGER (Part 2 of 2)" */ - if (is_q_smallish) { - if (r->cls !=3D float_class_zero) { - if (r->exp < 2 - (1 << (fmt->exp_size - 1))) { - if (mask_underflow) { - float_exception_flags |=3D float_flag_underflow; - *dxc =3D 0x10; - r->exp +=3D fmt->exp_re_bias; - } - } else if (r_flags & float_flag_inexact) { - float_exception_flags |=3D float_flag_inexact; - if (mask_inexact) { - bool saved_r_sign, saved_r_precise_sign; - - /* - * Check whether remainder was truncated (rounded - * toward zero) or incremented. - */ - saved_r_sign =3D r->sign; - saved_r_precise_sign =3D r_precise.sign; - r->sign =3D false; - r_precise.sign =3D false; - if (parts64_compare(r, &r_precise, status, true) < - float_relation_equal) { - *dxc =3D 0x8; - } else { - *dxc =3D 0xc; - } - r->sign =3D saved_r_sign; - r_precise.sign =3D saved_r_precise_sign; - } - } - } - *cc =3D 0; - } else if (n->exp > (1 << (fmt->exp_size - 1)) - 1) { - n->exp -=3D fmt->exp_re_bias; - *cc =3D r->cls =3D=3D float_class_zero ? 1 : 3; - } else { - *cc =3D r->cls =3D=3D float_class_zero ? 0 : 2; - } - - /* Adjust signs of zero results */ - if (r->cls =3D=3D float_class_zero) { - r->sign =3D a->sign; - } - if (n->cls =3D=3D float_class_zero) { - n->sign =3D a->sign ^ b->sign; - } - - status->float_exception_flags =3D float_exception_flags; - } -} - -#define DEFINE_S390_DIVIDE_TO_INTEGER(floatN) = \ -void floatN ## _s390_divide_to_integer(floatN a, floatN b, = \ - int final_quotient_rounding_mode, = \ - bool mask_underflow, bool mask_inex= act, \ - floatN *r, floatN *n, = \ - uint32_t *cc, int *dxc, = \ - float_status *status) = \ -{ = \ - FloatParts64 pa =3D floatN ## _unpack_canonical(a, status); = \ - FloatParts64 pb =3D floatN ## _unpack_canonical(b, status); = \ - FloatParts64 pr, pn; = \ - parts_s390_divide_to_integer(&pa, &pb, final_quotient_rounding_mode, = \ - mask_underflow, mask_inexact, = \ - &floatN ## _params, = \ - &pr, &pn, cc, dxc, status); = \ - *r =3D floatN ## _round_pack_canonical(&pr, status); = \ - *n =3D floatN ## _round_pack_canonical(&pn, status); = \ -} - -DEFINE_S390_DIVIDE_TO_INTEGER(float32) -DEFINE_S390_DIVIDE_TO_INTEGER(float64) - static void __attribute__((constructor)) softfloat_init(void) { union_float64 ua, ub, uc, ur; diff --git a/target/s390x/tcg/fpu_helper.c b/target/s390x/tcg/fpu_helper.c index 122994960a..33e0f6100d 100644 --- a/target/s390x/tcg/fpu_helper.c +++ b/target/s390x/tcg/fpu_helper.c @@ -24,6 +24,7 @@ #include "tcg_s390x.h" #include "exec/helper-proto.h" #include "fpu/softfloat.h" +#include "fpu/softfloat-parts.h" =20 /* #define DEBUG_HELPER */ #ifdef DEBUG_HELPER @@ -315,6 +316,140 @@ Int128 HELPER(dxb)(CPUS390XState *env, Int128 a, Int1= 28 b) return RET128(ret); } =20 +static void parts_s390_divide_to_integer(FloatParts64 *a, FloatParts64 *b, + int final_quotient_rounding_mode, + bool mask_underflow, bool mask_in= exact, + const FloatFmt *fmt, + FloatParts64 *r, FloatParts64 *n, + uint32_t *cc, int *dxc, + float_status *status) +{ + /* POp table "Results: DIVIDE TO INTEGER (Part 1 of 2)" */ + if ((float_cmask(a->cls) | float_cmask(b->cls)) & float_cmask_anynan) { + *r =3D parts64_pick_nan(a, b, status); + *n =3D *r; + *cc =3D 1; + } else if (a->cls =3D=3D float_class_inf || b->cls =3D=3D float_class_= zero) { + *r =3D parts64_default_nan(status); + *n =3D *r; + *cc =3D 1; + status->float_exception_flags |=3D float_flag_invalid; + } else if (b->cls =3D=3D float_class_inf) { + *r =3D *a; + n->cls =3D float_class_zero; + n->sign =3D a->sign ^ b->sign; + *cc =3D 0; + } else { + FloatParts64 *q, q_buf, r_precise; + int float_exception_flags =3D 0; + bool is_q_smallish; + uint32_t r_flags; + + /* Compute precise quotient */ + q_buf =3D parts64_div(a, b, status); + q =3D &q_buf; + + /* + * Check whether two closest integers can be precisely represented, + * i.e., all their bits fit into the fractional part. + */ + is_q_smallish =3D q->exp < (fmt->frac_size + 1); + + /* + * Final quotient is rounded using final-quotient-rounding method,= and + * partial quotient is rounded toward zero. + * + * Rounding of partial quotient may be inexact. This is the whole = point + * of distinguishing partial quotients, so ignore the exception. + */ + *n =3D parts64_round_to_int(q, + is_q_smallish + ? final_quotient_rounding_mode + : float_round_to_zero, + 0, status, fmt); + + /* Compute precise remainder */ + r_precise =3D parts64_muladd(b, n, a, + float_muladd_negate_product, status); + + /* Round remainder to the target format */ + *r =3D r_precise; + status->float_exception_flags =3D 0; + *r =3D parts64_round_to_fmt(r, status, fmt); + r_flags =3D status->float_exception_flags; + + /* POp table "Results: DIVIDE TO INTEGER (Part 2 of 2)" */ + if (is_q_smallish) { + if (r->cls !=3D float_class_zero) { + if (r->exp < 2 - (1 << (fmt->exp_size - 1))) { + if (mask_underflow) { + float_exception_flags |=3D float_flag_underflow; + *dxc =3D 0x10; + r->exp +=3D fmt->exp_re_bias; + } + } else if (r_flags & float_flag_inexact) { + float_exception_flags |=3D float_flag_inexact; + if (mask_inexact) { + bool saved_r_sign, saved_r_precise_sign; + + /* + * Check whether remainder was truncated (rounded + * toward zero) or incremented. + */ + saved_r_sign =3D r->sign; + saved_r_precise_sign =3D r_precise.sign; + r->sign =3D false; + r_precise.sign =3D false; + if (parts64_compare(r, &r_precise, status, true) < + float_relation_equal) { + *dxc =3D 0x8; + } else { + *dxc =3D 0xc; + } + r->sign =3D saved_r_sign; + r_precise.sign =3D saved_r_precise_sign; + } + } + } + *cc =3D 0; + } else if (n->exp > (1 << (fmt->exp_size - 1)) - 1) { + n->exp -=3D fmt->exp_re_bias; + *cc =3D r->cls =3D=3D float_class_zero ? 1 : 3; + } else { + *cc =3D r->cls =3D=3D float_class_zero ? 0 : 2; + } + + /* Adjust signs of zero results */ + if (r->cls =3D=3D float_class_zero) { + r->sign =3D a->sign; + } + if (n->cls =3D=3D float_class_zero) { + n->sign =3D a->sign ^ b->sign; + } + + status->float_exception_flags =3D float_exception_flags; + } +} + +#define DEFINE_S390_DIVIDE_TO_INTEGER(floatN) = \ +static void floatN ## _s390_divide_to_integer(floatN a, floatN b, = \ + int final_quotient_rounding_mode, bool mask_underflow, bool mask_inexa= ct, \ + floatN *r, floatN *n, uint32_t *cc, int *dxc, float_status *status) = \ +{ = \ + FloatParts64 pa =3D floatN ## _unpack_canonical(a, status); = \ + FloatParts64 pb =3D floatN ## _unpack_canonical(b, status); = \ + FloatParts64 pr, pn; = \ + parts_s390_divide_to_integer(&pa, &pb, final_quotient_rounding_mode, = \ + mask_underflow, mask_inexact, = \ + &floatN ## _params, = \ + &pr, &pn, cc, dxc, status); = \ + *r =3D floatN ## _round_pack_canonical(&pr, status); = \ + *n =3D floatN ## _round_pack_canonical(&pn, status); = \ +} + +DEFINE_S390_DIVIDE_TO_INTEGER(float32) +DEFINE_S390_DIVIDE_TO_INTEGER(float64) + void HELPER(dib)(CPUS390XState *env, uint32_t r1, uint32_t r2, uint32_t r3, uint32_t m4, uint32_t bits) { --=20 2.43.0 From nobody Mon May 25 20:33:42 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=linaro.org ARC-Seal: i=1; a=rsa-sha256; t=1778170325; cv=none; d=zohomail.com; s=zohoarc; b=EZ2LkCbSzN5xatUW2GCiOP2cksKYM7pvMO/9lrE1vQ928b5URuG2HN62DP+4FiYv7l3xtXygHyr3/2usvA9UFJn8CZNB+x5r7TRt4/WevGIVOaTqhb68m+OyCEC83TVbdY3KIPrlF8/gF2a66su8SXND3ktFS/vEPjljLBQgyYw= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1778170325; h=Content-Transfer-Encoding:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To:Cc; bh=Pu3TZxm2iTRUBoR9MHlryIG9+4ZyXp6ZsL5bLZgQwto=; b=LRBU9krVw/dPZ0/qR2ReePVpRgAHJBFOE8tlyWThrekOS8IYh4yKBq8vFAgEQNxY0LgQMM0v5JKszgX85/ite3a7kdVzHjbKukX8IZBHGKHgCZchzY7asZtvxu+kTMBOq1RMEu6oN2vIN1+z4NqyiGvssO+io+Cy/W2giMu459A= 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 lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1778170325566498.60377653247053; Thu, 7 May 2026 09:12:05 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wL1JN-0002jO-QX; Thu, 07 May 2026 12:10:53 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wL1Ii-0001nC-BI for qemu-devel@nongnu.org; Thu, 07 May 2026 12:10:16 -0400 Received: from mail-ot1-x332.google.com ([2607:f8b0:4864:20::332]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1wL1Ig-00088Z-A8 for qemu-devel@nongnu.org; Thu, 07 May 2026 12:10:12 -0400 Received: by mail-ot1-x332.google.com with SMTP id 46e09a7af769-7d4be94eeacso1098922a34.2 for ; Thu, 07 May 2026 09:10:09 -0700 (PDT) Received: from stoup.attlocal.net ([2600:381:c938:6375:9641:bbb2:a93a:bb4c]) by smtp.gmail.com with ESMTPSA id 46e09a7af769-7e302462fb1sm16415a34.11.2026.05.07.09.10.08 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 07 May 2026 09:10:08 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1778170209; x=1778775009; 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=Pu3TZxm2iTRUBoR9MHlryIG9+4ZyXp6ZsL5bLZgQwto=; b=XPHKj26G0JkTzVy94fTDonGduw+79dNMa2hehHLaoCpaXHEZmjctIok8AsHmXdogrb +O8IWplsw/a836ua72vp8EUy7z/+meBy2st3RoPnX6AFBZPAIBEKyviKafw9e6RvJspe L6JPS2fRX70Z/UVH1bRRiPLYEpvTHe5IW+XV39W6JQlpluMufCYZHTMGgYpRMhIJ/8eB 2Oum0AfWxmVv50eQ4P2Vp6JdJxYCDzHHwqs8w6eE+kchI0IWk0juKfJ9C40g11kx1vAw rClY1/QmMe9EC+WwEY0mGKkik/TU+p4Mz3nSzPyuJr1Hg8Ujpx9gzWTzVQgFbTJVCGDP Rosg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1778170209; x=1778775009; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:to:from:x-gm-gg:x-gm-message-state:from:to :cc:subject:date:message-id:reply-to; bh=Pu3TZxm2iTRUBoR9MHlryIG9+4ZyXp6ZsL5bLZgQwto=; b=php8frzNAgpawhuX5G1TJngUf7VpLcRIxC689qVgj/XklMkDYfLhErdgmAuVMgDHn7 C9YCPV9xgrdSyXPJ0t5k0qGzgG/JFdqQnMQRz58p2H3LDe58A+0mKurkOsK1ri74q5Gx ZVg074rq2IKPhlFUP+8C3o3SdcLZM+IDEb0AxblEHyCb+LbexYQ1nit0XVLnH4dw4YdI FsrNxmOuS5O1qt6PE1FmwUxu0GArN2nsEqQCX2UEsOaW0cSTbmZThwdREung26g+Tfhg tvNFcWRF1UZijl+QBoo9uTTRrV2RucKuf44uXJYCn5WbV1pDg6aV8/nT0rOLKnChJHnJ suoA== X-Gm-Message-State: AOJu0YxMc/IpZnoGd62LldOhIn1FuddUlviqOGRMdhpBFwM59qafqE0+ /jhe9HLj9YA+S7qR0NCqrbX+N3kCQqEfrwuxWbC1HfJDBu76GCshExkc4x1QwS+x8G6VwaQpUUS IJOWv X-Gm-Gg: AeBDiesOPR2s4hC5qDPuuRoa21gndrN9Lm3m0ER2MvHklgyAhl2DRt+rOBlBvHJH/r4 YMCrFl74Op4qsvQw/Uzz3ZiVDlivIPOSttcnEvmhHhX0gNTuqMmMrBcecJ+20L5ilWA67Y5GrX1 VM1qf1fj/tTJdRfVA0s84Fn6yAWZ0NZyYgATLQowDNGKU13YJx56kkNJpIIxXAaNzy7vfoJCoyS Qld8Im97gPgTP6k1jSIQDIbbmYHGZU7UentWLp471HR6C5l+z/yznKRJ/xZjsQZPGblCkt+93sc d4Q7SqUq0bBszwDbxhNKwv4eEs4R0EOsaO72JvBsCkdfAt3pS5k/EnVYNpo4eNSzXP57bcEbP2o 6duNTHegFzAI8JFZePRc72lsEk68GJ1eOWbbM9mnAkTxik/VoPerTp49M7bF7uuPccwV6RYhJpD lNajnFh3PunqOPqJZ+S41+AQYKMFoBAyUedgrlC96fVFpvhw== X-Received: by 2002:a05:6830:b95:b0:7de:d056:19d with SMTP id 46e09a7af769-7e1dea1fffemr5393173a34.0.1778170209039; Thu, 07 May 2026 09:10:09 -0700 (PDT) From: Richard Henderson To: qemu-devel@nongnu.org Subject: [PATCH v3 07/11] target/arm: Use FloatParts64 in bfdotadd_ebf Date: Thu, 7 May 2026 11:09:55 -0500 Message-ID: <20260507160959.449170-8-richard.henderson@linaro.org> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260507160959.449170-1-richard.henderson@linaro.org> References: <20260507160959.449170-1-richard.henderson@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=lists1p.gnu.org; Received-SPF: pass client-ip=2607:f8b0:4864:20::332; envelope-from=richard.henderson@linaro.org; helo=mail-ot1-x332.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: qemu development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @linaro.org) X-ZM-MESSAGEID: 1778170327254158500 Content-Type: text/plain; charset="utf-8" Use softfloat-parts.h so that we can more naturally perform the required operations witha single rounding step. This happens to also simplify the NaN detection step. Signed-off-by: Richard Henderson --- target/arm/tcg/vec_helper.c | 77 +++++++++++++++++++------------------ 1 file changed, 40 insertions(+), 37 deletions(-) diff --git a/target/arm/tcg/vec_helper.c b/target/arm/tcg/vec_helper.c index 91e98d28ae..85bcaac3d1 100644 --- a/target/arm/tcg/vec_helper.c +++ b/target/arm/tcg/vec_helper.c @@ -22,6 +22,7 @@ #include "helper.h" #include "tcg/tcg-gvec-desc.h" #include "fpu/softfloat.h" +#include "fpu/softfloat-parts.h" #include "qemu/int128.h" #include "crypto/clmul.h" #include "vec_internal.h" @@ -2895,61 +2896,63 @@ float32 bfdotadd(float32 sum, uint32_t e1, uint32_t= e2, float_status *fpst) float32 bfdotadd_ebf(float32 sum, uint32_t e1, uint32_t e2, float_status *fpst, float_status *fpst_odd) { + /* Unpack two BFloat16 into two Float32, trivially. */ float32 s1r =3D e1 << 16; float32 s1c =3D e1 & 0xffff0000u; float32 s2r =3D e2 << 16; float32 s2c =3D e2 & 0xffff0000u; float32 t32; =20 + /* + * Compare f16_dotadd() in sme_helper.c, but here we have + * bfloat16 inputs. In particular that means that we do not + * want the FPCR.FZ16 flush semantics, so we use the normal + * float_status for the input handling here. + */ + FloatParts64 p1r =3D float32_unpack_canonical(s1r, fpst); + FloatParts64 p1c =3D float32_unpack_canonical(s1c, fpst); + FloatParts64 p2r =3D float32_unpack_canonical(s2r, fpst); + FloatParts64 p2c =3D float32_unpack_canonical(s2c, fpst); + + int all_mask =3D (float_cmask(p1r.cls) | float_cmask(p1c.cls) | + float_cmask(p1r.cls) | float_cmask(p1c.cls)); + /* C.f. FPProcessNaNs4 */ - if (float32_is_any_nan(s1r) || float32_is_any_nan(s1c) || - float32_is_any_nan(s2r) || float32_is_any_nan(s2c)) { - if (float32_is_signaling_nan(s1r, fpst)) { - t32 =3D s1r; - } else if (float32_is_signaling_nan(s1c, fpst)) { - t32 =3D s1c; - } else if (float32_is_signaling_nan(s2r, fpst)) { - t32 =3D s2r; - } else if (float32_is_signaling_nan(s2c, fpst)) { - t32 =3D s2c; - } else if (float32_is_any_nan(s1r)) { - t32 =3D s1r; - } else if (float32_is_any_nan(s1c)) { - t32 =3D s1c; - } else if (float32_is_any_nan(s2r)) { - t32 =3D s2r; + if (unlikely(all_mask & float_cmask_anynan)) { + if (unlikely(all_mask & float_cmask_snan)) { + if (p1r.cls =3D=3D float_class_snan) { + t32 =3D s1r; + } else if (p1c.cls =3D=3D float_class_snan) { + t32 =3D s1c; + } else if (p2r.cls =3D=3D float_class_snan) { + t32 =3D s2r; + } else { + t32 =3D s2c; + } } else { - t32 =3D s2c; + if (p1r.cls =3D=3D float_class_qnan) { + t32 =3D s1r; + } else if (p1c.cls =3D=3D float_class_qnan) { + t32 =3D s1c; + } else if (p2r.cls =3D=3D float_class_qnan) { + t32 =3D s2r; + } else { + t32 =3D s2c; + } } /* * FPConvertNaN(FPProcessNaN(t32)) will be done as part * of the final addition below. */ } else { - /* - * Compare f16_dotadd() in sme_helper.c, but here we have - * bfloat16 inputs. In particular that means that we do not - * want the FPCR.FZ16 flush semantics, so we use the normal - * float_status for the input handling here. - */ - float64 e1r =3D float32_to_float64(s1r, fpst); - float64 e1c =3D float32_to_float64(s1c, fpst); - float64 e2r =3D float32_to_float64(s2r, fpst); - float64 e2c =3D float32_to_float64(s2c, fpst); - float64 t64; - /* * The ARM pseudocode function FPDot performs both multiplies - * and the add with a single rounding operation. Emulate this - * by performing the first multiply in round-to-odd, then doing - * the second multiply as fused multiply-add, and rounding to - * float32 all in one step. + * and the add with a single rounding operation. */ - t64 =3D float64_mul(e1r, e2r, fpst_odd); - t64 =3D float64r32_muladd(e1c, e2c, t64, 0, fpst); + FloatParts64 tmp =3D parts64_mul(&p1r, &p2r, fpst); + tmp =3D parts64_muladd(&p1c, &p2c, &tmp, 0, fpst); =20 - /* This conversion is exact, because we've already rounded. */ - t32 =3D float64_to_float32(t64, fpst); + t32 =3D float32_round_pack_canonical(&tmp, fpst); } =20 /* The final accumulation step is not fused. */ --=20 2.43.0 From nobody Mon May 25 20:33:42 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=linaro.org ARC-Seal: i=1; a=rsa-sha256; t=1778170276; cv=none; d=zohomail.com; s=zohoarc; b=LSf0nU/4W7q1f54qG+/0t6ShuySX1n5RnUf3K3qcB+7WLWsI4TtAckOb863skwhRG2gPPYShF/Vr0NwdVfD1braw1Cy2/EZNG2np8ZFNQqP9ICZoxZWEc8l3ByQBqD0SHO/phMRhbKpMfZCoLvgivVWUuDoW/48yTaZPgkrKW2c= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1778170276; h=Content-Type:Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=OdMS80Iqz8+nGqxW2YaXhtp5vgXW9pAPi87GTGVVKbM=; b=aRqw4vBu/RGJoEd3HBhuOq0JKKZc2M2aAHT8e/KhqTgqw7q0y4KFiJ5n/K6Uxsx1lCNNDqWKoewk00nPFl4rSQeFBfi+61C4tnbApXCyFt5oe2haFHqk4F+ZlQAoxhRQvkSmtrtCSTfJFrdYcnzOBD0DYoh4RPe5bqqZAl1M6tg= 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 lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1778170276122794.4512570982419; Thu, 7 May 2026 09:11:16 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wL1JM-0002cc-C4; Thu, 07 May 2026 12:10:52 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wL1Ik-0001rh-AW for qemu-devel@nongnu.org; Thu, 07 May 2026 12:10:18 -0400 Received: from mail-ot1-x334.google.com ([2607:f8b0:4864:20::334]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1wL1Ih-00089d-C6 for qemu-devel@nongnu.org; Thu, 07 May 2026 12:10:13 -0400 Received: by mail-ot1-x334.google.com with SMTP id 46e09a7af769-7de4ed0593fso522423a34.1 for ; Thu, 07 May 2026 09:10:10 -0700 (PDT) Received: from stoup.attlocal.net ([2600:381:c938:6375:9641:bbb2:a93a:bb4c]) by smtp.gmail.com with ESMTPSA id 46e09a7af769-7e302462fb1sm16415a34.11.2026.05.07.09.10.09 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 07 May 2026 09:10:09 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1778170210; x=1778775010; darn=nongnu.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=OdMS80Iqz8+nGqxW2YaXhtp5vgXW9pAPi87GTGVVKbM=; b=dSB1Qg7BoQsJMyOBumvUi/dkrscjkl+4neRXocyyDwfhHi1N8McxgwagXU/Ihu4thu WCnxu0otvCJCVfgla1bxEAQxeN+LPtSn2haTtfotdD7DjYGYD0fOAH2J4QjAjsuqQ8Q+ WJJC0C48YDrWjP3Uo6yUu6yGZ+Du2gPSlDAvOLOy6XOKQaQpz1pCwehcHp2yphmz1Smv Y2pGvQQTktNHcleoGFlLxZVJnzsYyDlGm/AQYUl4oOzbJ9S2DWja5SSG3PZ8P4sNTQq8 OPicGQLVepwpt2Fetnh/VkRSnhce89XCBn9x8G5zrCmZI4l/SpZ6JjmPJ73K3eaxFTZZ DvHQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1778170210; x=1778775010; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=OdMS80Iqz8+nGqxW2YaXhtp5vgXW9pAPi87GTGVVKbM=; b=S47WSBmWhlpVtyCdn4AX2R3b6b5RUdZv4oblN0sjcqp7JJc54xi7KzDWUxxi62/QJe pe1nG4sNJ/dHyseknjUtXOCqIvPSf4iU5ydbf/ObOPjkbJkpD/7aw6UATmSZ6QSupWLN sU1+n2pbLjLX1AoLyF/mGNRIMTeAkvS6hsixA8sAr0pVeuJdzKqM6A1SvmhFzmLPr9tI hVAZwpBpYQQoXCCN3f3w6EjWtTvv46xwU6tRPg+Hh0Nw+LZsanVi07z1IW0mEYSsyWAm XXskn+BvkLQMt/o2jPHVPXjncd9VmMt9sDyjKAyKkDIJkEjumX4Lo6Ik433XNDfK3Oel UV2A== X-Gm-Message-State: AOJu0YyRpVwPxFULJfUfFaxCpuUBtfxBnVWidc3bX3oNjXLtQZsiehVk duW2zuCAQq0/pk1ZxV6OGXfWD4XLMl3Hb/KlOndNA2sYajYJHMfiLyrG+E/pXIRPXsdjkQMj/U3 2HNe6 X-Gm-Gg: AeBDies5+XYQm5YHn7F+CnKN8+P0dq0im/PeCIcJW09vSS5XLlrp6OyOz2Nf/BMX0Us dw08nfnQ2JlmvMDxSKUIR4dMmkbrNWyTgD0faOJr1qnnrMdp9eWTMGsDAUR3D8+4EqziRI6fI65 E/1cpmLW88GNSP+fS3EmfuONLUAg/Fk+tDSIvwKvZSlMOsA4Jl+QjFMPtktYVHCLqdGfokZEgma p4cKCCMuuvYrd7jx4g3EcVb31W+e0gBYjCCTxELkpujw2YtIyS/7qfhzD6UZfssyVjliPz6xrgV JVk+/AAeRZ4zfTNIGGsM/ONqVefrozYCZeiseLBRy1EjhaQ4mv5OjIpljL7JezBM39Q72jb8d5h 8ua+8vqnb+OVz5xu2kiBen305PJ/J2VM08FTBjjpKHalKDa5A8SjA/wH4+CuAkqmjNpVsz1jlsA Q74Ogegd7W/y+14m65T/BLnw/aL5k5LTqvwMw49jE0Dua0dw== X-Received: by 2002:a05:6830:3785:b0:7de:a330:ecb8 with SMTP id 46e09a7af769-7e1defe86f3mr5151194a34.16.1778170210007; Thu, 07 May 2026 09:10:10 -0700 (PDT) From: Richard Henderson To: qemu-devel@nongnu.org Cc: =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= Subject: [PATCH v3 08/11] target/arm: Drop oddstatus from is_ebf and bfdotadd_ebf Date: Thu, 7 May 2026 11:09:56 -0500 Message-ID: <20260507160959.449170-9-richard.henderson@linaro.org> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260507160959.449170-1-richard.henderson@linaro.org> References: <20260507160959.449170-1-richard.henderson@linaro.org> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" 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=lists1p.gnu.org; Received-SPF: pass client-ip=2607:f8b0:4864:20::334; envelope-from=richard.henderson@linaro.org; helo=mail-ot1-x334.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: qemu development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @linaro.org) X-ZM-MESSAGEID: 1778170277264158500 This argument is no longer used. Reviewed-by: Philippe Mathieu-Daud=C3=A9 Signed-off-by: Richard Henderson --- target/arm/tcg/vec_internal.h | 12 +++------ target/arm/tcg/sme_helper.c | 6 ++--- target/arm/tcg/vec_helper.c | 50 +++++++++++++++-------------------- 3 files changed, 29 insertions(+), 39 deletions(-) diff --git a/target/arm/tcg/vec_internal.h b/target/arm/tcg/vec_internal.h index 4edd2b4fc1..c7ccb28b18 100644 --- a/target/arm/tcg/vec_internal.h +++ b/target/arm/tcg/vec_internal.h @@ -270,7 +270,6 @@ float32 bfdotadd(float32 sum, uint32_t e1, uint32_t e2,= float_status *fpst); * @sum: addend * @e1, @e2: multiplicand vectors * @fpst: floating-point status to use - * @fpst_odd: floating-point status to use for round-to-odd operations * * BFloat16 2-way dot product of @e1 & @e2, accumulating with @sum. * The @e1 and @e2 operands correspond to the 32-bit source vector @@ -279,23 +278,20 @@ float32 bfdotadd(float32 sum, uint32_t e1, uint32_t e= 2, float_status *fpst); * Corresponds to the ARM pseudocode function BFDotAdd, specialized * for the FPCR.EBF =3D=3D 1 case. */ -float32 bfdotadd_ebf(float32 sum, uint32_t e1, uint32_t e2, - float_status *fpst, float_status *fpst_odd); +float32 bfdotadd_ebf(float32 sum, uint32_t e1, uint32_t e2, float_status *= fpst); =20 /** * is_ebf: * @env: CPU state * @statusp: pointer to floating point status to fill in - * @oddstatusp: pointer to floating point status to fill in for round-to-o= dd * * Determine whether a BFDotAdd operation should use FPCR.EBF =3D 0 - * or FPCR.EBF =3D 1 semantics. On return, has initialized *statusp - * and *oddstatusp to suitable float_status arguments to use with either - * bfdotadd() or bfdotadd_ebf(). + * or FPCR.EBF =3D 1 semantics. On return, has initialized *statusp as sui= table + * for float_status arguments to either bfdotadd() or bfdotadd_ebf(). * Returns true for EBF =3D 1, false for EBF =3D 0. (The caller should use= this * to decide whether to call bfdotadd() or bfdotadd_ebf().) */ -bool is_ebf(CPUARMState *env, float_status *statusp, float_status *oddstat= usp); +bool is_ebf(CPUARMState *env, float_status *statusp); =20 /* * Negate as for FPCR.AH=3D1 -- do not negate NaNs. diff --git a/target/arm/tcg/sme_helper.c b/target/arm/tcg/sme_helper.c index ab5999c592..0702a1b129 100644 --- a/target/arm/tcg/sme_helper.c +++ b/target/arm/tcg/sme_helper.c @@ -1435,9 +1435,9 @@ static void do_bfmopa_w(void *vza, void *vzn, void *v= zm, uint32_t desc, uint32_t negx, bool ah_neg) { intptr_t row, col, oprsz =3D simd_maxsz(desc); - float_status fpst, fpst_odd; + float_status fpst; =20 - if (is_ebf(env, &fpst, &fpst_odd)) { + if (is_ebf(env, &fpst)) { for (row =3D 0; row < oprsz; ) { uint16_t prow =3D pn[H2(row >> 4)]; do { @@ -1458,7 +1458,7 @@ static void do_bfmopa_w(void *vza, void *vzn, void *v= zm, uint32_t m =3D *(uint32_t *)(vzm + H1_4(col)); =20 m =3D f16mop_adj_pair(m, pcol, 0); - *a =3D bfdotadd_ebf(*a, n, m, &fpst, &fpst_odd= ); + *a =3D bfdotadd_ebf(*a, n, m, &fpst); } col +=3D 4; pcol >>=3D 4; diff --git a/target/arm/tcg/vec_helper.c b/target/arm/tcg/vec_helper.c index 85bcaac3d1..3231bb2100 100644 --- a/target/arm/tcg/vec_helper.c +++ b/target/arm/tcg/vec_helper.c @@ -2845,7 +2845,7 @@ DO_MMLA_B(gvec_usmmla_b, do_usmmla_b) * BFloat16 Dot Product */ =20 -bool is_ebf(CPUARMState *env, float_status *statusp, float_status *oddstat= usp) +bool is_ebf(CPUARMState *env, float_status *statusp) { /* * For BFDOT, BFMMLA, etc, the behaviour depends on FPCR.EBF. @@ -2865,11 +2865,7 @@ bool is_ebf(CPUARMState *env, float_status *statusp,= float_status *oddstatusp) *statusp =3D env->vfp.fp_status[is_a64(env) ? FPST_A64 : FPST_A32]; set_default_nan_mode(true, statusp); =20 - if (ebf) { - /* EBF=3D1 needs to do a step with round-to-odd semantics */ - *oddstatusp =3D *statusp; - set_float_rounding_mode(float_round_to_odd, oddstatusp); - } else { + if (!ebf) { set_flush_to_zero(true, statusp); set_flush_inputs_to_zero(true, statusp); set_float_rounding_mode(float_round_to_odd_inf, statusp); @@ -2893,8 +2889,7 @@ float32 bfdotadd(float32 sum, uint32_t e1, uint32_t e= 2, float_status *fpst) return t1; } =20 -float32 bfdotadd_ebf(float32 sum, uint32_t e1, uint32_t e2, - float_status *fpst, float_status *fpst_odd) +float32 bfdotadd_ebf(float32 sum, uint32_t e1, uint32_t e2, float_status *= fpst) { /* Unpack two BFloat16 into two Float32, trivially. */ float32 s1r =3D e1 << 16; @@ -2965,11 +2960,11 @@ void HELPER(gvec_bfdot)(void *vd, void *vn, void *v= m, void *va, intptr_t i, opr_sz =3D simd_oprsz(desc); float32 *d =3D vd, *a =3D va; uint32_t *n =3D vn, *m =3D vm; - float_status fpst, fpst_odd; + float_status fpst; =20 - if (is_ebf(env, &fpst, &fpst_odd)) { + if (is_ebf(env, &fpst)) { for (i =3D 0; i < opr_sz / 4; ++i) { - d[i] =3D bfdotadd_ebf(a[i], n[i], m[i], &fpst, &fpst_odd); + d[i] =3D bfdotadd_ebf(a[i], n[i], m[i], &fpst); } } else { for (i =3D 0; i < opr_sz / 4; ++i) { @@ -2988,14 +2983,14 @@ void HELPER(gvec_bfdot_idx)(void *vd, void *vn, voi= d *vm, intptr_t eltspersegment =3D MIN(16 / 4, elements); float32 *d =3D vd, *a =3D va; uint32_t *n =3D vn, *m =3D vm; - float_status fpst, fpst_odd; + float_status fpst; =20 - if (is_ebf(env, &fpst, &fpst_odd)) { + if (is_ebf(env, &fpst)) { for (i =3D 0; i < elements; i +=3D eltspersegment) { uint32_t m_idx =3D m[i + H4(index)]; =20 for (j =3D i; j < i + eltspersegment; j++) { - d[j] =3D bfdotadd_ebf(a[j], n[j], m_idx, &fpst, &fpst_odd); + d[j] =3D bfdotadd_ebf(a[j], n[j], m_idx, &fpst); } } } else { @@ -3022,17 +3017,16 @@ void HELPER(sme2_bfvdot_idx)(void *vd, void *vn, vo= id *vm, uint16_t *n0 =3D vn; uint16_t *n1 =3D vn + sizeof(ARMVectorReg); uint32_t *m =3D vm; - float_status fpst, fpst_odd; + float_status fpst; =20 - if (is_ebf(env, &fpst, &fpst_odd)) { + if (is_ebf(env, &fpst)) { for (i =3D 0; i < elements; i +=3D eltspersegment) { uint32_t m_idx =3D m[i + H4(idx)]; =20 for (j =3D 0; j < eltspersegment; j++) { uint32_t nn =3D (n0[H2(2 * (i + j) + sel)]) | (n1[H2(2 * (i + j) + sel)] << 16); - d[i + H4(j)] =3D bfdotadd_ebf(a[i + H4(j)], nn, m_idx, - &fpst, &fpst_odd); + d[i + H4(j)] =3D bfdotadd_ebf(a[i + H4(j)], nn, m_idx, &fp= st); } } } else { @@ -3055,9 +3049,9 @@ void HELPER(gvec_bfmmla)(void *vd, void *vn, void *vm= , void *va, intptr_t s, opr_sz =3D simd_oprsz(desc); float32 *d =3D vd, *a =3D va; uint32_t *n =3D vn, *m =3D vm; - float_status fpst, fpst_odd; + float_status fpst; =20 - if (is_ebf(env, &fpst, &fpst_odd)) { + if (is_ebf(env, &fpst)) { for (s =3D 0; s < opr_sz / 4; s +=3D 4) { float32 sum00, sum01, sum10, sum11; =20 @@ -3069,20 +3063,20 @@ void HELPER(gvec_bfmmla)(void *vd, void *vn, void *= vm, void *va, * i j i k j k */ sum00 =3D a[s + H4(0 + 0)]; - sum00 =3D bfdotadd_ebf(sum00, n[s + H4(0 + 0)], m[s + H4(0 + 0= )], &fpst, &fpst_odd); - sum00 =3D bfdotadd_ebf(sum00, n[s + H4(0 + 1)], m[s + H4(0 + 1= )], &fpst, &fpst_odd); + sum00 =3D bfdotadd_ebf(sum00, n[s + H4(0 + 0)], m[s + H4(0 + 0= )], &fpst); + sum00 =3D bfdotadd_ebf(sum00, n[s + H4(0 + 1)], m[s + H4(0 + 1= )], &fpst); =20 sum01 =3D a[s + H4(0 + 1)]; - sum01 =3D bfdotadd_ebf(sum01, n[s + H4(0 + 0)], m[s + H4(2 + 0= )], &fpst, &fpst_odd); - sum01 =3D bfdotadd_ebf(sum01, n[s + H4(0 + 1)], m[s + H4(2 + 1= )], &fpst, &fpst_odd); + sum01 =3D bfdotadd_ebf(sum01, n[s + H4(0 + 0)], m[s + H4(2 + 0= )], &fpst); + sum01 =3D bfdotadd_ebf(sum01, n[s + H4(0 + 1)], m[s + H4(2 + 1= )], &fpst); =20 sum10 =3D a[s + H4(2 + 0)]; - sum10 =3D bfdotadd_ebf(sum10, n[s + H4(2 + 0)], m[s + H4(0 + 0= )], &fpst, &fpst_odd); - sum10 =3D bfdotadd_ebf(sum10, n[s + H4(2 + 1)], m[s + H4(0 + 1= )], &fpst, &fpst_odd); + sum10 =3D bfdotadd_ebf(sum10, n[s + H4(2 + 0)], m[s + H4(0 + 0= )], &fpst); + sum10 =3D bfdotadd_ebf(sum10, n[s + H4(2 + 1)], m[s + H4(0 + 1= )], &fpst); =20 sum11 =3D a[s + H4(2 + 1)]; - sum11 =3D bfdotadd_ebf(sum11, n[s + H4(2 + 0)], m[s + H4(2 + 0= )], &fpst, &fpst_odd); - sum11 =3D bfdotadd_ebf(sum11, n[s + H4(2 + 1)], m[s + H4(2 + 1= )], &fpst, &fpst_odd); + sum11 =3D bfdotadd_ebf(sum11, n[s + H4(2 + 0)], m[s + H4(2 + 0= )], &fpst); + sum11 =3D bfdotadd_ebf(sum11, n[s + H4(2 + 1)], m[s + H4(2 + 1= )], &fpst); =20 d[s + H4(0 + 0)] =3D sum00; d[s + H4(0 + 1)] =3D sum01; --=20 2.43.0 From nobody Mon May 25 20:33:42 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=linaro.org ARC-Seal: i=1; a=rsa-sha256; t=1778170317; cv=none; d=zohomail.com; s=zohoarc; b=desW+RPECNs9F9aHxrsfJ0rKryKt4qgUpj9qyNENELPoPJoZs0h3mlZhamX8wIhLTSEIcIu6FMG9rsYV9R/JPUobSgkAnK8OZgSZXXkLi4WHuKDaB4oDaQYydq4W+Di7P9lzAvei5ojMGJeGcb/zPJR03bMGk4hwFrNr/Mu+elI= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1778170317; h=Content-Transfer-Encoding:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To:Cc; bh=LMcpEFYI4IhEZgzdOBWNJ8qlgQLS+b48/lPnLmqusZc=; b=YMJ0dRa0/DjY2YtWdlHOdvPZg8i2iO2pp7kt6kytO4xljSBnzHDnX8A3JXGHLTUPIyZlrJ9U0+togZV3aBTH12fwOBOMnsenLUS8cCUfQ9Y4DWfbjmkmBy9EMj4Ji7f4mMA7FfZz2R540W3OKQVPoT8Y//nZRa9EbeHKnWfqUQI= 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 lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1778170317518492.76087583178287; Thu, 7 May 2026 09:11:57 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wL1JN-0002iq-Lo; Thu, 07 May 2026 12:10:53 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wL1Ik-0001ri-DK for qemu-devel@nongnu.org; Thu, 07 May 2026 12:10:18 -0400 Received: from mail-ot1-x332.google.com ([2607:f8b0:4864:20::332]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1wL1Ii-0008A0-9e for qemu-devel@nongnu.org; Thu, 07 May 2026 12:10:14 -0400 Received: by mail-ot1-x332.google.com with SMTP id 46e09a7af769-7dd73b7c757so591662a34.0 for ; Thu, 07 May 2026 09:10:11 -0700 (PDT) Received: from stoup.attlocal.net ([2600:381:c938:6375:9641:bbb2:a93a:bb4c]) by smtp.gmail.com with ESMTPSA id 46e09a7af769-7e302462fb1sm16415a34.11.2026.05.07.09.10.10 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 07 May 2026 09:10:10 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1778170211; x=1778775011; 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=LMcpEFYI4IhEZgzdOBWNJ8qlgQLS+b48/lPnLmqusZc=; b=GuhBIexOSVR/7QfyjQsntK7asa+86fek2yZVSfDW7+EyXPBIF5wXsZadfGlVb4r0bg DOYuWMlPlefw/FLWSm89iP1afWqwdjIHuXlU4eczo2rv2gcn2BWyUVUJISiS4cEIeHQU eEv9T7xLVumJvuXAQXc0ReRwVtCYAgPdezV4wwh+RORUprMwKLRTqUo7S+jh++uetpAL ChxFebe9OBEeYgaLyXl152YsM0nWLgXkLhRCj016Z7tGWsQiNu+lahth3cH3NiX17dHF LcQTNIjTR3j6O/psG5S4qtWcr9tRowP4c+FYE7leCaKg5HBzdOVMMq65pyP4EvALPNlh MJ7Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1778170211; x=1778775011; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:to:from:x-gm-gg:x-gm-message-state:from:to :cc:subject:date:message-id:reply-to; bh=LMcpEFYI4IhEZgzdOBWNJ8qlgQLS+b48/lPnLmqusZc=; b=PrktCqdVSdL4AMAp0gYsPVcq7ow6xwmFPYLjj+hkIdyTqh6t8qf5axusjZcJJwLpGS gRCz8dCntNM9lsLi4xjIpP7KeQT38JuB0beB5vtA8F7Is0fpskWmcZeKhAPNahm7GD97 ae9SSTLXJFBuD/q+Te5gVxNIAQR85A4Sq4hvCVkHqAurhuvlwLVrVDdJrCRg+KRddm5x hQ9oRFDUjcAeRyps+U+SJCw+6XC3kQ9Xz5xUvIT+tVJG3vMNV/VEQ0RCvR40ddjreLXq SwOl592LkBlxDhfeJ2qzT1xf1AEKLPsw+gTvEdwGIvIf20PbErUovOqdr7MpwYT7hVh8 TWug== X-Gm-Message-State: AOJu0Yy4GRZESCce0zLuAa/ufoP9GmTjscaIFrqS1YBcnhlSFzO43Aso 4GTqPgkj3UKPsG7TZ4mpnZfle5hlPpVHdgy+SrkzK0F2agZ/QYhJjWpFR4VfQyI1pJ/8ONTDiiV Rq9nz X-Gm-Gg: AeBDietAKVaS4WmCW2WFrm2MpjmE32HMmmJHcs4ig1fOlaDSiOq/j0+3GSyFKqwDIb9 XBOoeIkatYxG/1C8kWen7/DfrWkz0qaLAiUCfbod84KCOvQyFlV/aFp3go9EF9iigFcNtMZJym8 HGiyZy7aV6F2K98eN8E8wxmEOEi3j7ImDSFzAisuAO5vvcQcLPzb2bKD0Y+IVKOKj5DXVwKEKtD Mu4d7jg+d1qy2Pyd+wzaCbMnRCb5BZjboC55ga4NEz2N5OqsGsd/gPMHkINK9ROAF0AYbEMeo96 I4W9tWFPyNovH30yCt7q9ExXzxKxxQeh8X/Kpr4S7znhE2DHiAS9iWVihAQ/NRCzc7KW09ZaLb4 QiU652UTYM2lqT6lkfW52Ms73KjvBdTiA2PvVJHBMT1A+HNAttQ9p4Yw/ghy+fF4To08xIJ/yz8 OW3OwVML0Lb2/ZMUYf+DSaA69vhlV4izd4g5dPriw/F5fSxw3vAbTVzN6S X-Received: by 2002:a05:6830:6d06:b0:7dc:dbe4:3f21 with SMTP id 46e09a7af769-7e1deebc979mr5472847a34.1.1778170211105; Thu, 07 May 2026 09:10:11 -0700 (PDT) From: Richard Henderson To: qemu-devel@nongnu.org Subject: [PATCH v3 09/11] target/arm: Use FloatParts64 in f16_dotadd Date: Thu, 7 May 2026 11:09:57 -0500 Message-ID: <20260507160959.449170-10-richard.henderson@linaro.org> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260507160959.449170-1-richard.henderson@linaro.org> References: <20260507160959.449170-1-richard.henderson@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=lists1p.gnu.org; Received-SPF: pass client-ip=2607:f8b0:4864:20::332; envelope-from=richard.henderson@linaro.org; helo=mail-ot1-x332.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: qemu development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @linaro.org) X-ZM-MESSAGEID: 1778170319295158500 Content-Type: text/plain; charset="utf-8" Use softfloat-parts.h so that we can more naturally perform the required operations witha single rounding step. This happens to also simplify the NaN detection step. Signed-off-by: Richard Henderson --- target/arm/tcg/sme_helper.c | 96 ++++++++++++++++--------------------- 1 file changed, 40 insertions(+), 56 deletions(-) diff --git a/target/arm/tcg/sme_helper.c b/target/arm/tcg/sme_helper.c index 0702a1b129..16b96890cc 100644 --- a/target/arm/tcg/sme_helper.c +++ b/target/arm/tcg/sme_helper.c @@ -27,6 +27,7 @@ #include "accel/tcg/helper-retaddr.h" #include "qemu/int128.h" #include "fpu/softfloat.h" +#include "fpu/softfloat-parts.h" #include "vec_internal.h" #include "sve_ldst_internal.h" =20 @@ -1227,18 +1228,15 @@ static inline uint32_t bf16mop_ah_neg_adj_pair(uint= 32_t pair, uint32_t pg) } =20 static float32 f16_dotadd(float32 sum, uint32_t e1, uint32_t e2, - float_status *s_f16, float_status *s_std, - float_status *s_odd) + float_status *s_f16, float_status *s_std) { /* - * We need three different float_status for different parts of this + * We need two different float_status for different parts of this * operation: * - the input conversion of the float16 values must use the * f16-specific float_status, so that the FPCR.FZ16 control is appl= ied * - operations on float32 including the final accumulation must use * the normal float_status, so that FPCR.FZ is applied - * - we have pre-set-up copy of s_std which is set to round-to-odd, - * for the multiply (see below) */ float16 h1r =3D e1 & 0xffff; float16 h1c =3D e1 >> 16; @@ -1246,48 +1244,49 @@ static float32 f16_dotadd(float32 sum, uint32_t e1,= uint32_t e2, float16 h2c =3D e2 >> 16; float32 t32; =20 + FloatParts64 p1r =3D float16_unpack_canonical(h1r, s_f16); + FloatParts64 p1c =3D float16_unpack_canonical(h1c, s_f16); + FloatParts64 p2r =3D float16_unpack_canonical(h2r, s_f16); + FloatParts64 p2c =3D float16_unpack_canonical(h2c, s_f16); + + int all_mask =3D (float_cmask(p1r.cls) | float_cmask(p1c.cls) | + float_cmask(p1r.cls) | float_cmask(p1c.cls)); + /* C.f. FPProcessNaNs4 */ - if (float16_is_any_nan(h1r) || float16_is_any_nan(h1c) || - float16_is_any_nan(h2r) || float16_is_any_nan(h2c)) { + if (unlikely(all_mask & float_cmask_anynan)) { float16 t16; =20 - if (float16_is_signaling_nan(h1r, s_f16)) { - t16 =3D h1r; - } else if (float16_is_signaling_nan(h1c, s_f16)) { - t16 =3D h1c; - } else if (float16_is_signaling_nan(h2r, s_f16)) { - t16 =3D h2r; - } else if (float16_is_signaling_nan(h2c, s_f16)) { - t16 =3D h2c; - } else if (float16_is_any_nan(h1r)) { - t16 =3D h1r; - } else if (float16_is_any_nan(h1c)) { - t16 =3D h1c; - } else if (float16_is_any_nan(h2r)) { - t16 =3D h2r; + if (unlikely(all_mask & float_cmask_snan)) { + if (p1r.cls =3D=3D float_class_snan) { + t16 =3D h1r; + } else if (p1c.cls =3D=3D float_class_snan) { + t16 =3D h1c; + } else if (p2r.cls =3D=3D float_class_snan) { + t16 =3D h2r; + } else { + t16 =3D h2c; + } } else { - t16 =3D h2c; + if (p1r.cls =3D=3D float_class_qnan) { + t16 =3D h1r; + } else if (p1c.cls =3D=3D float_class_qnan) { + t16 =3D h1c; + } else if (p2r.cls =3D=3D float_class_qnan) { + t16 =3D h2r; + } else { + t16 =3D h2c; + } } t32 =3D float16_to_float32(t16, true, s_f16); } else { - float64 e1r =3D float16_to_float64(h1r, true, s_f16); - float64 e1c =3D float16_to_float64(h1c, true, s_f16); - float64 e2r =3D float16_to_float64(h2r, true, s_f16); - float64 e2c =3D float16_to_float64(h2c, true, s_f16); - float64 t64; - /* * The ARM pseudocode function FPDot performs both multiplies - * and the add with a single rounding operation. Emulate this - * by performing the first multiply in round-to-odd, then doing - * the second multiply as fused multiply-add, and rounding to - * float32 all in one step. + * and the add with a single rounding operation. */ - t64 =3D float64_mul(e1r, e2r, s_odd); - t64 =3D float64r32_muladd(e1c, e2c, t64, 0, s_std); + FloatParts64 tmp =3D parts64_mul(&p1r, &p2r, s_std); + tmp =3D parts64_muladd(&p1c, &p2c, &tmp, 0, s_std); =20 - /* This conversion is exact, because we've already rounded. */ - t32 =3D float64_to_float32(t64, s_std); + t32 =3D float32_round_pack_canonical(&tmp, s_std); } =20 /* The final accumulation step is not fused. */ @@ -1299,9 +1298,6 @@ static void do_fmopa_w_h(void *vza, void *vzn, void *= vzm, uint16_t *pn, uint32_t negx, bool ah_neg) { intptr_t row, col, oprsz =3D simd_maxsz(desc); - float_status fpst_odd =3D env->vfp.fp_status[FPST_ZA]; - - set_float_rounding_mode(float_round_to_odd, &fpst_odd); =20 for (row =3D 0; row < oprsz; ) { uint16_t prow =3D pn[H2(row >> 4)]; @@ -1325,8 +1321,7 @@ static void do_fmopa_w_h(void *vza, void *vzn, void *= vzm, uint16_t *pn, m =3D f16mop_adj_pair(m, pcol, 0); *a =3D f16_dotadd(*a, n, m, &env->vfp.fp_status[FPST_ZA_F16], - &env->vfp.fp_status[FPST_ZA], - &fpst_odd); + &env->vfp.fp_status[FPST_ZA]); } col +=3D 4; pcol >>=3D 4; @@ -1363,15 +1358,12 @@ void HELPER(sme2_fdot_h)(void *vd, void *vn, void *= vm, void *va, bool za =3D extract32(desc, SIMD_DATA_SHIFT, 1); float_status *fpst_std =3D &env->vfp.fp_status[za ? FPST_ZA : FPST_A64= ]; float_status *fpst_f16 =3D &env->vfp.fp_status[za ? FPST_ZA_F16 : FPST= _A64_F16]; - float_status fpst_odd =3D *fpst_std; float32 *d =3D vd, *a =3D va; uint32_t *n =3D vn, *m =3D vm; =20 - set_float_rounding_mode(float_round_to_odd, &fpst_odd); - for (i =3D 0; i < oprsz / sizeof(float32); ++i) { d[H4(i)] =3D f16_dotadd(a[H4(i)], n[H4(i)], m[H4(i)], - fpst_f16, fpst_std, &fpst_odd); + fpst_f16, fpst_std); } } =20 @@ -1385,17 +1377,14 @@ void HELPER(sme2_fdot_idx_h)(void *vd, void *vn, vo= id *vm, void *va, bool za =3D extract32(desc, SIMD_DATA_SHIFT + 2, 1); float_status *fpst_std =3D &env->vfp.fp_status[za ? FPST_ZA : FPST_A64= ]; float_status *fpst_f16 =3D &env->vfp.fp_status[za ? FPST_ZA_F16 : FPST= _A64_F16]; - float_status fpst_odd =3D *fpst_std; float32 *d =3D vd, *a =3D va; uint32_t *n =3D vn, *m =3D (uint32_t *)vm + H4(idx); =20 - set_float_rounding_mode(float_round_to_odd, &fpst_odd); - for (i =3D 0; i < elements; i +=3D eltspersegment) { uint32_t mm =3D m[i]; for (j =3D 0; j < eltspersegment; ++j) { d[H4(i + j)] =3D f16_dotadd(a[H4(i + j)], n[H4(i + j)], mm, - fpst_f16, fpst_std, &fpst_odd); + fpst_f16, fpst_std); } } } @@ -1408,24 +1397,19 @@ void HELPER(sme2_fvdot_idx_h)(void *vd, void *vn, v= oid *vm, void *va, intptr_t eltspersegment =3D MIN(4, elements); int idx =3D extract32(desc, SIMD_DATA_SHIFT, 2); int sel =3D extract32(desc, SIMD_DATA_SHIFT + 2, 1); - float_status fpst_odd, *fpst_std, *fpst_f16; float32 *d =3D vd, *a =3D va; uint16_t *n0 =3D vn; uint16_t *n1 =3D vn + sizeof(ARMVectorReg); uint32_t *m =3D (uint32_t *)vm + H4(idx); =20 - fpst_std =3D &env->vfp.fp_status[FPST_ZA]; - fpst_f16 =3D &env->vfp.fp_status[FPST_ZA_F16]; - fpst_odd =3D *fpst_std; - set_float_rounding_mode(float_round_to_odd, &fpst_odd); - for (i =3D 0; i < elements; i +=3D eltspersegment) { uint32_t mm =3D m[i]; for (j =3D 0; j < eltspersegment; ++j) { uint32_t nn =3D (n0[H2(2 * (i + j) + sel)]) | (n1[H2(2 * (i + j) + sel)] << 16); d[i + H4(j)] =3D f16_dotadd(a[i + H4(j)], nn, mm, - fpst_f16, fpst_std, &fpst_odd); + &env->vfp.fp_status[FPST_ZA_F16], + &env->vfp.fp_status[FPST_ZA]); } } } --=20 2.43.0 From nobody Mon May 25 20:33:42 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=linaro.org ARC-Seal: i=1; a=rsa-sha256; t=1778170319; cv=none; d=zohomail.com; s=zohoarc; b=mGv5ykhL0MJr17DrTIs6Pdabpp1tHFxAANF7H9IxW1C+lmDJZQSmOfykLEtdW9qoR8PqgfcjvzLdNT/plOZeLg3r5Bb/dvqFGSBLGR1PIJ98g+C1JqUu/w6mliSeOyVO8RvsBZMz7+5xbnX74wHJDdgDxRuIOoio2LeXDpLiO/E= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1778170319; h=Content-Transfer-Encoding:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To:Cc; bh=T2ZghK4sNfiM5z8zyNlYLTncliVfy0NuA2KHs5cYwz0=; b=dZRMUk07uPxhe3wrZmGqZKIhRxCPU3UFuPdgDeYzOPgnVtyFNM6jARdgFvGxgerl5XFYLY/ptkswPlk/7DKdRpcW2VoUpPEbmaWuiLHFt7U1q+4WXmb/b+KzZQl4TAbbhukqrKndlfLqgL/AApmnI1B5qW4Ym1ucyGGTYCOSupo= 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 lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1778170319218199.30186603013362; Thu, 7 May 2026 09:11:59 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wL1JN-0002hf-6z; Thu, 07 May 2026 12:10:53 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wL1Io-0001uD-3z for qemu-devel@nongnu.org; Thu, 07 May 2026 12:10:18 -0400 Received: from mail-ot1-x32a.google.com ([2607:f8b0:4864:20::32a]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1wL1Ik-0008Aq-3f for qemu-devel@nongnu.org; Thu, 07 May 2026 12:10:15 -0400 Received: by mail-ot1-x32a.google.com with SMTP id 46e09a7af769-7dbccf6a23dso884357a34.2 for ; Thu, 07 May 2026 09:10:13 -0700 (PDT) Received: from stoup.attlocal.net ([2600:381:c938:6375:9641:bbb2:a93a:bb4c]) by smtp.gmail.com with ESMTPSA id 46e09a7af769-7e302462fb1sm16415a34.11.2026.05.07.09.10.11 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 07 May 2026 09:10:12 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1778170212; x=1778775012; 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=T2ZghK4sNfiM5z8zyNlYLTncliVfy0NuA2KHs5cYwz0=; b=Pvu/T7UZQTg9b5ty43vbRmTka6svTZYe4P0WAa9xu6KW1yAr731xgRychxm2p9Ppp/ ZDE0lxF7iByzI2y7q9/wjm9VNdZ+zLswpHmr3LcN/5M/RFGmzkRr2/DDRGnCqn2xRa19 1yj+F+TmK1IDfEcoWZD4Vk6JylcHILIfEq9FHtIgRC85+t3aQoqqsyo3g6xjsla/xsxr VfWKfxziyJuBspXLcy8KR9bD0GHHVkTBVKm389S1Aoj7Zg3IpfDQH9arqvq9OuCp2Xma 47jwm+UoRc2pMqIF2wJb1A2QtzQNQq6RMMjc21692yhkf8mqrqKg1VAGR/6LszwEJDsH fJLg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1778170212; x=1778775012; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:to:from:x-gm-gg:x-gm-message-state:from:to :cc:subject:date:message-id:reply-to; bh=T2ZghK4sNfiM5z8zyNlYLTncliVfy0NuA2KHs5cYwz0=; b=gu5YiM1MCfzq6AFCOYr0hyD4rGB0kWV7PZOVdMLSf8Y9aCwSC6vL/Dl6SGyktVNZS5 szG+3xCX7MFqVj7xMhwTMeH6eIAse8DAyN3UBlhyviHgYSnJxEI5sbqlqFdu/sp8SjCC KvJTfMoIrdIervHKve4FVTGDqajC2bWKdtRteWkHIMloyX0ruRPwH6cnbls23yCd3Dhu HE8U91N+pJ6kW0cSrT2fEqWihfCuVFFWW/De5nvYo7SLktIk1UEM8Z3vd+Ug63Wr8sLm uy+CgXW0vFCSq1E0P+UuS1Y7pl8Q5XpzOZi197gduxr+QNmnS4dIMditv7DkomHapHcb ahpg== X-Gm-Message-State: AOJu0YzbfqVhYJJpnsgVHewI+tpwK/HTXI7Sr82QcKZzaOLBfHZvpSPP bo6bDs50v/qbXMRMB4pxdeQn/ZzHWEdmvnMSFEcpL8UUh2AQID9/Ec3sRFPrUlJ7bqgxJJJlE47 uaeXr X-Gm-Gg: AeBDiev23NC4EupFWto8xOI8jLfJM32IIuPM6l3g2274lZeRNlmbtAp6IZ5ghbrAoFA d8nColXwpclVQeIB7OEOKQzaJJ9nMXYmPdIrWVjaqNxdUYf3Br+Hk+HjeA7THmHJ6Ps0Nv0F9oe dLcApcOfeYKvj0CJGYA/AvHVPDm1ZNgtnyct9Zi5Y9oqpjqudhohb7W/tEtPruW1e9bmkaikVYS pNM4tOFU65tk/anS2/rJg30Lrf+xgmnzSVePjFxP17X9n9CXQE630Q5tu7+TryQT+RwOj8QAFMR NF0Yc/NjJl1IdjPWTAdilzfP9SPXVLw3rIhv0fuX0uxcMSRPuni9jnwhqJOQIeAJyjHo/Fd6NC7 b49CgxKGXHkGKl11S0tGLBzwxgObBS4ct9tdUBbvkgJ/LOgqe7+hFBssgjnePJUKH2coc9drd9d HTXJaGXo3p+cE3W4gjHsvPCXXVvV61L69QzPhWvxCuZEW2bQ== X-Received: by 2002:a05:6830:3890:b0:7dc:c926:4f6c with SMTP id 46e09a7af769-7e1df060272mr5397628a34.18.1778170212296; Thu, 07 May 2026 09:10:12 -0700 (PDT) From: Richard Henderson To: qemu-devel@nongnu.org Subject: [PATCH v3 10/11] fpu: Saturate the exponent in uncanon_normal Date: Thu, 7 May 2026 11:09:58 -0500 Message-ID: <20260507160959.449170-11-richard.henderson@linaro.org> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260507160959.449170-1-richard.henderson@linaro.org> References: <20260507160959.449170-1-richard.henderson@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=lists1p.gnu.org; Received-SPF: pass client-ip=2607:f8b0:4864:20::32a; envelope-from=richard.henderson@linaro.org; helo=mail-ot1-x32a.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: qemu development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @linaro.org) X-ZM-MESSAGEID: 1778170321284158501 Content-Type: text/plain; charset="utf-8" Notice the conflict between saturation and rebias_overflow, which should never happen. Otherwise, saturate to INT32_MAX and allow the usual overflow to max, infinity, or dnan. Signed-off-by: Richard Henderson --- fpu/softfloat-parts.c.inc | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/fpu/softfloat-parts.c.inc b/fpu/softfloat-parts.c.inc index 6df98eb5fb..c5a828eb90 100644 --- a/fpu/softfloat-parts.c.inc +++ b/fpu/softfloat-parts.c.inc @@ -341,7 +341,17 @@ static void partsN(uncanon_normal)(FloatPartsN *p, flo= at_status *s, g_assert_not_reached(); } =20 - exp =3D p->exp + fmt->exp_bias; + /* Because exp_bias is positive, we can only overflow past INT_MAX. */ + if (sadd32_overflow(p->exp, fmt->exp_bias, &exp)) { + /* + * rebias_overflow wants to compute a modulo exponent, which + * conflicts with saturation. That said, saturation can only + * happen with scalbn, which is not a PowerPC operation. + */ + assert(!s->rebias_overflow); + exp =3D INT32_MAX; + } + if (likely(exp > 0)) { if (p->frac_lo & round_mask) { flags |=3D float_flag_inexact; --=20 2.43.0 From nobody Mon May 25 20:33:42 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=linaro.org ARC-Seal: i=1; a=rsa-sha256; t=1778170281; cv=none; d=zohomail.com; s=zohoarc; b=NKeX/DfSBkUkqG/3bgbU2HtDNU/T7ctu+AG+k0FrzdvYGbX84Rih4735RCWpm/X4B+92tRxqafxPlkeivxrRBkIUvFJh94l0x2jg/NEcX1HMnh/tWcH0t2tmoaa/nRw0FB4li03muRzsloHzk1TzYTChYukWcEDCyXE3+6/UUgQ= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1778170281; h=Content-Transfer-Encoding:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To:Cc; bh=Tno4FRdkKISmgYOrfh62o7rJBcHuyC+6/bmV3xDjQJQ=; b=jqotKR0XAKiz7n5rmb9WX++oGd7wEFvc9h25avCl8b5AgWDL4Ys1Oo5qGaAVqIEkPABal46VJDgFrC1K9Dzn3Wcklncdb1rBC4k0Mcz0hnUUrA0qqrckoqsdCgz2c9ejZeKcjmPtstWHpRcx6htmeP58W7l11NRPksNeEEum8CI= 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 lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1778170281919709.7571220580587; Thu, 7 May 2026 09:11:21 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wL1JJ-0002Go-6J; Thu, 07 May 2026 12:10:49 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wL1Io-0001uF-4N for qemu-devel@nongnu.org; Thu, 07 May 2026 12:10:18 -0400 Received: from mail-ot1-x32e.google.com ([2607:f8b0:4864:20::32e]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1wL1Ik-0008Ay-Lx for qemu-devel@nongnu.org; Thu, 07 May 2026 12:10:15 -0400 Received: by mail-ot1-x32e.google.com with SMTP id 46e09a7af769-7dca4debedaso1074124a34.2 for ; Thu, 07 May 2026 09:10:14 -0700 (PDT) Received: from stoup.attlocal.net ([2600:381:c938:6375:9641:bbb2:a93a:bb4c]) by smtp.gmail.com with ESMTPSA id 46e09a7af769-7e302462fb1sm16415a34.11.2026.05.07.09.10.12 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 07 May 2026 09:10:13 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1778170213; x=1778775013; 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=Tno4FRdkKISmgYOrfh62o7rJBcHuyC+6/bmV3xDjQJQ=; b=W/EnVHkPhOKQ8NZjrgMZ6sXmgnFVe/D7mAlcbuWF1bQE/MmoKPycxUyvQOW+WbrTH/ 1DtcsxphxRqaM+stQtYBDQT0F89PFWv7+u4xo3ngDTLS3ooKB2Z4lW1Xo56nqUlgFC3p iMBBSonk8Gqzc3bs9OBk6jlPdmHplUXFThD4OGT+7rtnc2Xgdl5AjUZvx26Js6RrNwLE cJbPCRITMm8WmM89j1wsxXstBDT+AxTMEbP9Xm1tL6LluQxJHAkx+pOke0g0AjoKK7ZX u9vWxGJgJpDLr7sfSQ6VWqf1sl/0IFM36AOFiyO8AkjNGeyDr5PNkgindsNNZ7Nn1FX3 olhw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1778170213; x=1778775013; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:to:from:x-gm-gg:x-gm-message-state:from:to :cc:subject:date:message-id:reply-to; bh=Tno4FRdkKISmgYOrfh62o7rJBcHuyC+6/bmV3xDjQJQ=; b=RWd4WQtRGuR94kIWvrvqNbiqJ1RDbwcSQ1pPGULvunXhltg9bDbx1ngHYCLHL0J4lS Yl9nLMkWUfpCVw48kHahyElCvMqeY6fuA7b+G3rLvZQ+SXenD7IaoZpL/cmaEQ09zVzA lNj6rEB8zqfXMDRRywI/2wjdjlXUxfu0kHjiXjZ1zUuPVg9A4bboDCvG72iR4IReShkg an8jFeRa7QCa69zqEKN8n57b7jepgoKic6FNpDdhzmfpV02QTFQxnIMzzd6Gan8Jk9l5 BZwl9FZjSNSUa6r9Jx1XGiW/fJU+xznFdVEhEPbU3K+5Chr8vE/6evr2akRRoXIR/hV0 +Tdg== X-Gm-Message-State: AOJu0Ywqtaa126lM8I8brnuWps3D/o3k2a7PXxUfR8kPwmxhTRMwVN1K KE9tvnMEWWCiQEb8TuMmVErbUNhtbdmUtvzksxpUSQXkOuklKaBVImnhPmJOWHFwqJeBpOsz+Sz 1bNnv X-Gm-Gg: AeBDietCxerI/tTuIJmD3RMOZgaTvzqUHnsX195+cY0XIvjHK/Toe/tYaErXq7cRWZT 8m48VpFqwjXTPTIs8rVcb350AFLKymIN9+UQoZj7FyZ057xiXd2nfRAv5oF3ZIeHdcUPeVT+Oyw SYE1+vUQ5+42Mr6kxad/05aPB5UlcGmc5idtIO/e20hGL+rEcERFaUbEoR0VXNiFB5bMpxHvp9N V/hpiiA89Ni1Ch+Oxydm4M+6hZL/Dc0bwwBO18iNyv1QCH/5wqsgoAK1AiEd4uG/sajE7fsyd+k LVYQNssWNKYUkIZVEkrL4NdXAguDmuQLRFYJC2zAXOEgUoQt05Om/DjcfhBHRfUvVaEvTNiWBDd HqJRstm7C0eRPuoTtR+ou5az3mV95lWv0u6Ce4PXTqqKpCPSVjO6p0t/V3F79YoePhnISzqhXaU ctsL0YWMFmw385r/sMFBvzmLgK9DdoUV+DSuRVpUfzLTHP9u3v08i9A9Gt X-Received: by 2002:a05:6830:67f8:b0:7de:51f3:e7ed with SMTP id 46e09a7af769-7e1df210cdamr5452475a34.26.1778170213375; Thu, 07 May 2026 09:10:13 -0700 (PDT) From: Richard Henderson To: qemu-devel@nongnu.org Subject: [PATCH v3 11/11] fpu: Introduce exp_scalbn Date: Thu, 7 May 2026 11:09:59 -0500 Message-ID: <20260507160959.449170-12-richard.henderson@linaro.org> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260507160959.449170-1-richard.henderson@linaro.org> References: <20260507160959.449170-1-richard.henderson@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=lists1p.gnu.org; Received-SPF: pass client-ip=2607:f8b0:4864:20::32e; envelope-from=richard.henderson@linaro.org; helo=mail-ot1-x32e.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: qemu development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @linaro.org) X-ZM-MESSAGEID: 1778170283004158500 Content-Type: text/plain; charset="utf-8" Avoid exponent overflow as well as checking that we don't lose information with opposing scaling. Use it in partsN(scalbn) and partsN(round_to_int_normal). Signed-off-by: Richard Henderson --- fpu/softfloat.c | 17 +++++++++++++++++ fpu/softfloat-parts.c.inc | 5 ++--- 2 files changed, 19 insertions(+), 3 deletions(-) diff --git a/fpu/softfloat.c b/fpu/softfloat.c index 6a14c5d639..a6ab3ee0f8 100644 --- a/fpu/softfloat.c +++ b/fpu/softfloat.c @@ -601,6 +601,23 @@ static float128 QEMU_FLATTEN float128_pack_raw(const F= loatParts128 *p) *-------------------------------------------------------------------------= ---*/ #include "softfloat-specialize.c.inc" =20 +static int32_t exp_scalbn(int32_t exp, int32_t scale) +{ + /* + * Catch chains of scaling which lose information. + * In particular, if the exponent has been saturated, + * do not allow it to become unsaturated. + */ + if (unlikely(exp =3D=3D INT32_MAX)) { + assert(scale >=3D 0); + } else if (unlikely(exp =3D=3D INT32_MIN)) { + assert(scale <=3D 0); + } else { + exp =3D sadd32_saturate(exp, scale); + } + return exp; +} + /* * Helper functions for softfloat-parts.c.inc, per-size operations. */ diff --git a/fpu/softfloat-parts.c.inc b/fpu/softfloat-parts.c.inc index c5a828eb90..789a41d24e 100644 --- a/fpu/softfloat-parts.c.inc +++ b/fpu/softfloat-parts.c.inc @@ -1107,8 +1107,7 @@ static bool partsN(round_to_int_normal)(FloatPartsN *= a, FloatRoundMode rmode, uint64_t frac_lsb, frac_lsbm1, rnd_even_mask, rnd_mask, inc; int shift_adj; =20 - scale =3D MIN(MAX(scale, -0x10000), 0x10000); - a->exp +=3D scale; + a->exp =3D exp_scalbn(a->exp, scale); =20 if (a->exp < 0) { bool one; @@ -1632,7 +1631,7 @@ FloatPartsN partsN(scalbn)(const FloatPartsN *a, int = n, float_status *s) case float_class_normal: { FloatPartsN r =3D *a; - r.exp +=3D MIN(MAX(n, -0x10000), 0x10000); + r.exp =3D exp_scalbn(r.exp, n); return r; } default: --=20 2.43.0