From nobody Mon May 25 13:51:46 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=1778977612; cv=none; d=zohomail.com; s=zohoarc; b=Mrgro09aLJZgWbDgjXnNcUDkaclMqgT3RmSwzjmRFL2Xrfliy1EyAiQIACQupeJW0hWFGl2/0ki/te+RL2uDesqhTTEDsazZmUONfMBukjooffJux3mvSIfLQDEnCMjw53sQEJVyxShQdrSbKBx2dcWna6BwHMchX2ixuCgOMR8= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1778977612; 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=u/kDXd23+ycS383PGeIrgHSsrr0fsby8WIj0IEq0o18=; b=Qk19NWrKEW5UfvVEvL0K2NLSKBTvfxeRpRoJ1rzF6sTjb39P7wmxZXC61ufaIz+5oEV1RZZNhvqSz8+a9LSMVBIzBCtyoXo63YrhgvWM17ZbCwO8YDEH1xXXBTbUgomuXyLVww+iiMM0+KHGQQxfBVRj7hCYsk6olIjZ8/AIglQ= 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 1778977612387447.72816638618326; Sat, 16 May 2026 17:26:52 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wOPKZ-0001dw-Pw; Sat, 16 May 2026 20:26:07 -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 1wOPKQ-0001cs-0H for qemu-devel@nongnu.org; Sat, 16 May 2026 20:25:59 -0400 Received: from mail-pf1-x432.google.com ([2607:f8b0:4864:20::432]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1wOPKN-0002PN-HK for qemu-devel@nongnu.org; Sat, 16 May 2026 20:25:57 -0400 Received: by mail-pf1-x432.google.com with SMTP id d2e1a72fcca58-83ef1d17904so1076614b3a.1 for ; Sat, 16 May 2026 17:25:55 -0700 (PDT) Received: from stoup.. ([71.212.142.33]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-83f19c5be71sm9670317b3a.39.2026.05.16.17.25.52 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 16 May 2026 17:25:52 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1778977554; x=1779582354; 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=u/kDXd23+ycS383PGeIrgHSsrr0fsby8WIj0IEq0o18=; b=kQS1qauJfcvxX+qDxYTgJzs/gW9ei6hQx/XZfYCxZwOxEWljxTCKOptnGB1hj5lHca FQLQStVBrD4x/Vj/+nd4uUJQ5trShphhB3axntQSylVSb/Y/shk9Ubu6U2xSUgPd0Fo6 hv/S6pzhIIo6p6zsUotplVYddODJND/sqThKiZDSSvAMRp+XnYcR7Td9nsu0WURwqhAt rRbmGpJe3PXF2clQMV+Shd03VkLHCD2jimogbATabELVh7XVDlxlmZ5/KBboKnVF7IOI kMbY2rG0n+JqzGbuqn61djAWv7TdZ9a7qVIkqcf85uYVsrB8z6oMjqAgKvF4NAGjspxx sM6w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1778977554; x=1779582354; 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=u/kDXd23+ycS383PGeIrgHSsrr0fsby8WIj0IEq0o18=; b=It8b5BXj/u+fAY/lkAqXtkgp+73g9YiSOqnu1DlyNpaazvzRjBXWKsPkUVxEiv7mhQ I6IlASBoyXwGebHo2ZdxbOFp/FH9/70d33J2KOypwm/dbhQr4YWvngeNvnUEvOehGZ91 U8UUbJrmU0BBgzyRSIzATTDjM5mkgLwsGLwwtbuPV9ZsAIRZGsOmF62O7g1Oqm7MOHva A6DDC4FHLmrSG8JvTYqtflsQAzuB5VsVBsR01oG7lDfPOEKaR7tscgRhkqtp/gLt7jmE /GXiqgn3BqKPDil7r4Rp7g6as3q4J/q4nHmKxLmJJqfDh4/M4MEZoArekHYnpbSadNwm UY5w== X-Gm-Message-State: AOJu0Yw2MdLbaP9mb/f20rQL1N4HgmjWRVtZ1DCFucgUDrK38cKhDIRA jJYGZgUQoaKq6+rYb16KzkLl3TOQU1XSYFbhNJi15FZHH/4QBQXKuCpqBkpiEYw26jBuAl6PUuB 7OA2b X-Gm-Gg: Acq92OFewfYzqkaZiFyLAvXGd/9WGNTrtt7Wj7QEA7ldhEumDx6OjgTn+AYQgcW1Ese D7DlsW/FNAkXJIZHJxmt8PA+NAY816PeOFEQSkcA/8rykzJ08b3FfuIJPYyx/zPtZuOh56Mr9VX Ex5lAly54gl93LD6EIy37lt5+TVwOMoEz7NuP4obns3Yh/ggm4t2SIpXDrXRbSsB1aqIOz4WF7l xbw66srhOSXBaoVGUlSsSgvFLxc+HBOfjgLi7BQqCCi8F1f34SZn9F6Z1YzXDxnE5dmZGt/O1dg YTTLnqXm8vKcc3muaxw9WGCsSA91XbfhmOOolp/tvAf2uwJ0EUEWd+RyRny1EzfAt6CUKa71wt9 vybRx++4kAb3v2EwzAopaS5YjicH/kkCxd4HzVJGafD1USBTLr8bjMIOi4ndydhn0HPXVyDDw93 7OsiusDT6w6tK2cgnqb92pF0D6vp42Sm7i8DTPtG4= X-Received: by 2002:a05:6a00:3689:b0:837:7e7d:3c8 with SMTP id d2e1a72fcca58-83f33df5086mr10201662b3a.39.1778977553674; Sat, 16 May 2026 17:25:53 -0700 (PDT) From: Richard Henderson To: qemu-devel@nongnu.org Cc: =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= Subject: [PATCH v4 01/12] fpu: Return struct from parts{64,128}_scalbn Date: Sat, 16 May 2026 17:25:38 -0700 Message-ID: <20260517002550.321291-2-richard.henderson@linaro.org> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260517002550.321291-1-richard.henderson@linaro.org> References: <20260517002550.321291-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::432; envelope-from=richard.henderson@linaro.org; helo=mail-pf1-x432.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: 1778977615518158500 At the same time, export. Reviewed-by: Philippe Mathieu-Daud=C3=A9 Signed-off-by: Richard Henderson --- include/fpu/softfloat-parts.h | 3 +++ fpu/softfloat.c | 18 +++++++++--------- fpu/softfloat-parts.c.inc | 14 ++++++++------ 3 files changed, 20 insertions(+), 15 deletions(-) diff --git a/include/fpu/softfloat-parts.h b/include/fpu/softfloat-parts.h index 9504d0daa0..46618d217e 100644 --- a/include/fpu/softfloat-parts.h +++ b/include/fpu/softfloat-parts.h @@ -214,4 +214,7 @@ FloatParts128 parts128_round_to_int(const FloatParts128= *a, FloatParts64 parts64_round_to_fmt(const FloatParts64 *p, float_status *s, const FloatFmt *fmt); =20 +FloatParts64 parts64_scalbn(const FloatParts64 *a, int n, float_status *s); +FloatParts128 parts128_scalbn(const FloatParts128 *a, int n, float_status = *s); + #endif diff --git a/fpu/softfloat.c b/fpu/softfloat.c index 90ebd83f69..7fc6df461e 100644 --- a/fpu/softfloat.c +++ b/fpu/softfloat.c @@ -1910,7 +1910,7 @@ float16 float16_muladd_scalbn(float16 a, float16 b, f= loat16 c, =20 /* Before rounding, scale. */ if (scale) { - parts64_scalbn(pr, scale, status); + *pr =3D parts64_scalbn(pr, scale, status); } parts64_uncanon(pr, status, &float16_params, false); /* After rounding, apply negate result, especially for -0.0. */ @@ -1937,7 +1937,7 @@ float32_muladd_scalbn(float32 a, float32 b, float32 c, =20 /* Before rounding, scale. */ if (scale) { - parts64_scalbn(pr, scale, status); + *pr =3D parts64_scalbn(pr, scale, status); } parts64_uncanon(pr, status, &float32_params, false); /* After rounding, apply negate result, especially for -0.0. */ @@ -1958,7 +1958,7 @@ float64_muladd_scalbn(float64 a, float64 b, float64 c, =20 /* Before rounding, scale. */ if (scale) { - parts64_scalbn(pr, scale, status); + *pr =3D parts64_scalbn(pr, scale, status); } parts64_uncanon(pr, status, &float64_params, false); /* After rounding, apply negate result, especially for -0.0. */ @@ -4312,7 +4312,7 @@ float16 float16_scalbn(float16 a, int n, float_status= *status) { FloatParts64 p =3D float16_unpack_canonical(a, status); =20 - parts64_scalbn(&p, n, status); + p =3D parts64_scalbn(&p, n, status); return float16_round_pack_canonical(&p, status); } =20 @@ -4320,7 +4320,7 @@ float32 float32_scalbn(float32 a, int n, float_status= *status) { FloatParts64 p =3D float32_unpack_canonical(a, status); =20 - parts64_scalbn(&p, n, status); + p =3D parts64_scalbn(&p, n, status); return float32_round_pack_canonical(&p, status); } =20 @@ -4328,7 +4328,7 @@ float64 float64_scalbn(float64 a, int n, float_status= *status) { FloatParts64 p =3D float64_unpack_canonical(a, status); =20 - parts64_scalbn(&p, n, status); + p =3D parts64_scalbn(&p, n, status); return float64_round_pack_canonical(&p, status); } =20 @@ -4336,7 +4336,7 @@ bfloat16 bfloat16_scalbn(bfloat16 a, int n, float_sta= tus *status) { FloatParts64 p =3D bfloat16_unpack_canonical(a, status); =20 - parts64_scalbn(&p, n, status); + p =3D parts64_scalbn(&p, n, status); return bfloat16_round_pack_canonical(&p, status); } =20 @@ -4344,7 +4344,7 @@ float128 float128_scalbn(float128 a, int n, float_sta= tus *status) { FloatParts128 p =3D float128_unpack_canonical(a, status); =20 - parts128_scalbn(&p, n, status); + p =3D parts128_scalbn(&p, n, status); return float128_round_pack_canonical(&p, status); } =20 @@ -4355,7 +4355,7 @@ floatx80 floatx80_scalbn(floatx80 a, int n, float_sta= tus *status) if (!floatx80_unpack_canonical(&p, a, status)) { return floatx80_default_nan(status); } - parts128_scalbn(&p, n, status); + p =3D parts128_scalbn(&p, n, status); return floatx80_round_pack_canonical(&p, status); } =20 diff --git a/fpu/softfloat-parts.c.inc b/fpu/softfloat-parts.c.inc index 2114797aca..3a9c2748cd 100644 --- a/fpu/softfloat-parts.c.inc +++ b/fpu/softfloat-parts.c.inc @@ -1633,22 +1633,24 @@ FloatRelation partsN(compare)(const FloatPartsN *a,= const FloatPartsN *b, /* * Multiply A by 2 raised to the power N. */ -static void partsN(scalbn)(FloatPartsN *a, int n, float_status *s) +FloatPartsN partsN(scalbn)(const FloatPartsN *a, int n, float_status *s) { switch (a->cls) { case float_class_snan: case float_class_qnan: - *a =3D partsN(return_nan)(a, s); - break; + return partsN(return_nan)(a, s); case float_class_zero: case float_class_inf: - break; + return *a; case float_class_denormal: float_raise(float_flag_input_denormal_used, s); /* fall through */ case float_class_normal: - a->exp +=3D MIN(MAX(n, -0x10000), 0x10000); - break; + { + FloatPartsN r =3D *a; + r.exp +=3D MIN(MAX(n, -0x10000), 0x10000); + return r; + } default: g_assert_not_reached(); } --=20 2.43.0 From nobody Mon May 25 13:51:46 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=1778977672; cv=none; d=zohomail.com; s=zohoarc; b=n+c2OxEjykumTIfviUFnUudnlBF7a3+OLPmZJ8so3TLmYG0ZIDkL1KR3A/75BRE+IzecnJ27+2BGCacgBOe8XmNPx4LknqO50MaxCIBzLTw89ESn6M3tN44VBPQAFowurlGhDolprwx4rloEyeR7E5aCWmu4faIx13wMCASG0k8= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1778977672; 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=x9rWSaQvjbDXBnfVxCErc01A7AXki6hbY0KLzGZpXR4=; b=GBtdITGMR32O2iNp6jXhhStSTFrOurWkC2gkv+Z+MYfaBKdwq4N9ilNoz4vz3MFcJZISWSRXHB061vkRliB2bC/uGauyBEDjRLezTArrBCdwD7NOxeZzZ6nYurEsUG59B1k/D30RZ2MrBjf7OwHtZp0id0W+ahzxHHcziIvcCak= 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 177897767215154.13925428846687; Sat, 16 May 2026 17:27:52 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wOPKp-0001iF-Pk; Sat, 16 May 2026 20:26:23 -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 1wOPKR-0001dE-TW for qemu-devel@nongnu.org; Sat, 16 May 2026 20:26:01 -0400 Received: from mail-pf1-x429.google.com ([2607:f8b0:4864:20::429]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1wOPKP-0002QL-NB for qemu-devel@nongnu.org; Sat, 16 May 2026 20:25:59 -0400 Received: by mail-pf1-x429.google.com with SMTP id d2e1a72fcca58-839dc688d6cso394308b3a.2 for ; Sat, 16 May 2026 17:25:56 -0700 (PDT) Received: from stoup.. ([71.212.142.33]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-83f19c5be71sm9670317b3a.39.2026.05.16.17.25.54 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 16 May 2026 17:25:54 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1778977555; x=1779582355; 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=x9rWSaQvjbDXBnfVxCErc01A7AXki6hbY0KLzGZpXR4=; b=dFuYeKOj3ej/Ecm582uQwtEFQKMsI+Qyj7WmTZ79vkaqIOBjPjn2nDtxwMuBrlyRtv 5sQoGfpo4ScQyFlkWWqBb0bQf4SEySEOL6aygi1+GxJFl8m5vfg9GWPPBO8WwUke1sGv x11VZcSESZVgAqLWmMrermXGSwNBTK0PSCDwTz7k8XC2XSdkUOIpUwnvIDZgyqVVa4f8 lAO82gdaCUXACSG6ReCZtp0EZuWx5eQmpfTM4OQEjNoknNBC7RJMHrtfa3KjkLk08CCn 1taZekhmKNk2kRKQFycjHj011hNHsQ0ibcaBDqHTZhr/KN4xDPmGc1Dd7ujpnapB3VX5 R53g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1778977555; x=1779582355; 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=x9rWSaQvjbDXBnfVxCErc01A7AXki6hbY0KLzGZpXR4=; b=RIaH+FIZnsszavRH+fLRbQFtRG+VXvAva+cBH2kQMoWZKiyqV3UqA1jC1Fr0a1Wi1R h7i3P1oCvRouKNJN1fvZJHjMLUw4HrT6qovfKlLOcd+OZyc+VZlG2DT1dnKRt3GojnWr GYuErkFvT3O46zUFxmPSCtJoCHfqGTP2xnkdJR/hEiFyKgF2VEGa77obdBI7yfHBytXp PoKN961mVQtcP08bzickApCMYIaDMCE9rY62+wNS+JY2hjADzS7AuMa+wRyAbrDqHen0 UQCKMjLPJu4/Ss/CLZUIDZH44Ob2xhQ3vujMA+U3mbDU5c/Jg+4zrulhsN4M0kephAoq 8InA== X-Gm-Message-State: AOJu0YxON/70rfUML4rvdON4arecAUPwjp2xHzksoBsTbRoAsXwuDsKa d3ifqKLnqU+ndDQSTVKNGru0+/owb22IyVOxEumqAk0pSaMqeXlpUzvzh/YdHcvPGmLp88yhDVW WK/Ev X-Gm-Gg: Acq92OHX1x9WItJ36iREY3iHBTmFW3LOGECY7UZ4/L7vED9F9HN5rUefmPELdhZfX68 Q8/j1HATOT+1eLTrgvXTSXodugn/YC1vNsDWY5i0mKYU58k0wOYvrjgHQRFozH2UCuA1aHGBm8C udYoOQ4pCtX5Fq5XZTygGzLaI6X7hwG+WFe3k/6hpnCyon3vDy3OnrX/f6KJEfmkzI17Z0W4BD+ b7jmhGkiNMhQgx2ulEq/AY+/mI2fKEFzbriBh9FdaAcCcu4sNzYwFRItYKIvM8WmopxEbIIQ1Np hyUnTC2XX+WhyGt4+MjeCgI0ncsaCjEm+NE3stz1FrG7GJtpGi0RzqyMFbk6Gpg+L4o4+bqhGQ8 HJvoaWLs4I92LO8nBlQRH4Gpnr4HceczEL0zV6pHq3nQ1+/15Mfh+Ud9GOwVgqfo//Oj1d+GprY qbioDac82UPX5F9K2zjfM/182zoOFa X-Received: by 2002:a05:6a00:1908:b0:834:df57:9d67 with SMTP id d2e1a72fcca58-83f33cf0bddmr10153972b3a.32.1778977554992; Sat, 16 May 2026 17:25:54 -0700 (PDT) From: Richard Henderson To: qemu-devel@nongnu.org Subject: [PATCH v4 02/12] fpu: Reorganize partsN(muladd) Date: Sat, 16 May 2026 17:25:39 -0700 Message-ID: <20260517002550.321291-3-richard.henderson@linaro.org> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260517002550.321291-1-richard.henderson@linaro.org> References: <20260517002550.321291-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::429; envelope-from=richard.henderson@linaro.org; helo=mail-pf1-x429.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: 1778977672930158500 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 | 156 +++++++++++++++++--------------------- 1 file changed, 71 insertions(+), 85 deletions(-) diff --git a/fpu/softfloat-parts.c.inc b/fpu/softfloat-parts.c.inc index 3a9c2748cd..ca2d7a15c9 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,47 @@ 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 cases are zero product or inf addend. */ + assert((ab_mask & float_cmask_zero) | (c_mask & float_cmask_inf)); + + /* + * P + Inf =3D=3D Inf, or + * 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 13:51:46 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=1778977638; cv=none; d=zohomail.com; s=zohoarc; b=LmaNzYmO3PVMGzS3/khmJM32HmDjobcLxUNURGbgQ4I6qNm6HL0iIDZYHzxQu6J43QKZlOzYXT8TUnQxMQCqJJRuwkrprVtGbLltq43YmlKYNZJI5eP/RxxxtbAfL9/7v3se7AA4r4Ot3AaIVWAIJu9xANQFeUlTbHeZB5wiu1M= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1778977638; 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=Er8/h7hcdrH0i8AVq283Mmmr7LBMQsIla5HO90Oj/dc=; b=hE7sEtbkK3W5ZM0iXewt9j01YNf6YoVFA/YhPf/MbGvMP8pMBKjY6ESysbIdmUjfKELa3WsMXwM5/JM3fGpkkMonDkuVMNEfgEhCqLQ/5ty4ptEHsengN6pochlOaRFlm30CucTlnumZw3zpGU88O4IsomJQDYmdVmZ32IjPzOo= 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 1778977638788875.3998474816736; Sat, 16 May 2026 17:27:18 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wOPKn-0001hy-BP; Sat, 16 May 2026 20:26:23 -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 1wOPKT-0001db-RA for qemu-devel@nongnu.org; Sat, 16 May 2026 20:26:01 -0400 Received: from mail-pf1-x429.google.com ([2607:f8b0:4864:20::429]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1wOPKQ-0002Sk-4g for qemu-devel@nongnu.org; Sat, 16 May 2026 20:26:01 -0400 Received: by mail-pf1-x429.google.com with SMTP id d2e1a72fcca58-8354461da74so444388b3a.1 for ; Sat, 16 May 2026 17:25:57 -0700 (PDT) Received: from stoup.. ([71.212.142.33]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-83f19c5be71sm9670317b3a.39.2026.05.16.17.25.55 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 16 May 2026 17:25:56 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1778977557; x=1779582357; 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=Er8/h7hcdrH0i8AVq283Mmmr7LBMQsIla5HO90Oj/dc=; b=AhLHVCMijufFPOYMQns75EMTaWvbJMWyBtfHcYAx/pMh1myXgs5RhBJdfxwkunbWst J4GiJlhphlHZHab9gSSFImV2qdlmEXaio7SRK4kuEqMigCqKQ2MZlY2WOUJzN2SWzAnR IxhosP3M88BM2/WnRv0BJR89ND7pWSD6BU4BulDGK6071JkC4ml15q6lrV27Lp14By2U LpPnjVPdDVroE0jsN7Y/kxmlkdxOKkh57Nj8GQh1Sl5OLAYArV1NZU9/WqWbnhfSNMSV JL/XNVflYaNqja99PB4VmlpJ36byrk7MrbydU5YqvPdbx9GRK/rPN10DwpJKP/bkaXeL EwOg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1778977557; x=1779582357; 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=Er8/h7hcdrH0i8AVq283Mmmr7LBMQsIla5HO90Oj/dc=; b=hpi6u4GsJs5A7yqUZDNXtacu4BFsdASxNq5smoTD5qnfQ1MQp/pyaGqUYW9tgG5bQq e4luWpBdmgGi6qQcamATPsCV6tDHpYh9hKSgOHyPl5dXYHXefIzVYmPnAZWWU7tE3xsz wfm4VS9faYWclvvEwQBgSIl6puFq+855MR8Km7bV98Hk+K3hke6QS6xkzY52j1mLAp5M YPhZls7xzifsIpJ+QBE1BM0pd095FoTSAisBlE/r65RIrKwWy7fB2sDi5MECR+ONrOOs fSA/z3QxkuThLBG4VL837I9UwoKMzh0ylLNVgwWBcdQvOL5hW8szFFKQdEN/lbw6kjCn /0Kg== X-Gm-Message-State: AOJu0YzGMsgEP8+Deb8v9kd/+644756bgpOA8COvx1w1hUN2oyhw19Xh AE8/qa/vVliwMJDs9m9ltWP0QPlL5g4theLl1G3BmG4ZXD22EE2E5ySoXOH3KdVSREymUq5lJPu Z2Jcg X-Gm-Gg: Acq92OED1l5jGkxbziGWl/pxPQSck5PbMVKYoF5iCAgvOl09Rc7Je397EPG4obkgpdT SJHoXrMZ7BvZZ7E9LGU7AsYO7hXE9I4mhPQvzrZ63LW+UpaPSsjBB7ZwyvLwnLRQD6kkxRFF35T 9ABT8cRTL5PNT4nejka16BFoqwtP2nBSTKxacJca4vBVo0oAlCIsF8ET3wUHLZy6ASm9MJE0gaO MGNMkzkbuof4DC3s7wtwsJ3xDcjphgDtz3TzKKbCe8ZWLhW/hlDFDM8BiX04Upv3b6SPcFa18sS Qsso0G4jQuSkYwAVlKg6bdHCpyDzJv9ZitEF4z/RfN5DRmmLbURuEnUR77VhZzBaDTkLfIlG4+8 bXdd2bQVYnPqr174PTv0aAeG9pOnKzwptX0o9Q9MBrvKjhsb+Psv+Xue8hXPtEHXn6UhYZqmiSC I6n4p6nSk9N5kinb/XSTtNt4ZOwODT X-Received: by 2002:a05:6a00:4c82:b0:838:20b7:40ed with SMTP id d2e1a72fcca58-83f33d98b22mr9977189b3a.42.1778977556644; Sat, 16 May 2026 17:25:56 -0700 (PDT) From: Richard Henderson To: qemu-devel@nongnu.org Cc: =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= Subject: [PATCH v4 03/12] fpu: Return struct from parts{64,128}_muladd Date: Sat, 16 May 2026 17:25:40 -0700 Message-ID: <20260517002550.321291-4-richard.henderson@linaro.org> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260517002550.321291-1-richard.henderson@linaro.org> References: <20260517002550.321291-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::429; envelope-from=richard.henderson@linaro.org; helo=mail-pf1-x429.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: 1778977640760158500 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 7fc6df461e..905ba6ecf8 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) { - *pr =3D parts64_scalbn(pr, scale, status); + pr =3D 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) { - *pr =3D parts64_scalbn(pr, scale, status); + pr =3D 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) { - *pr =3D parts64_scalbn(pr, scale, status); + pr =3D 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 ca2d7a15c9..437b333341 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 @@ -766,19 +765,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 13:51:46 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=1778977678; cv=none; d=zohomail.com; s=zohoarc; b=HbtvlzSGcU8VF0v5QQlp5jvBMFV0f9ukvUDXVDRfIRPL9TPGYFADPpyqcj04SHIPIxgw0uwarW5Fqc+yuEdjS8N0JyNKYtvj65Vh/JL0Wfne0k4R8M8m64th9KRtxbmf7RTbS/EHvbUHdtkUATaAXeI7JLLNpMEkn9f3+6qXGkc= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1778977678; 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=LXEFjIA2Rc2Ly2XJsgxo/zPmqwc6w9LU/oPQ8iHupDk=; b=iAaZOEdH2Y1fQzUKjA4LD69T8tyKcM6T1a/+H2FDB3kGB4h2KtJgZL8l+lqWTsj0bxTC0eZstZQsCKJbm1cg3CAm3aOVWH1iSklxeayQJxnJoUWPTjSBmxHZ0bVoDUXLWJ6nvxVxaZjQfk1olhBdNqM9b50f/gLf/tMSo6T5k5M= 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 1778977678543625.6415269391986; Sat, 16 May 2026 17:27:58 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wOPKs-0001jW-Mu; Sat, 16 May 2026 20:26:26 -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 1wOPKU-0001dx-VE for qemu-devel@nongnu.org; Sat, 16 May 2026 20:26:03 -0400 Received: from mail-pg1-x52b.google.com ([2607:f8b0:4864:20::52b]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1wOPKT-0002Vv-6y for qemu-devel@nongnu.org; Sat, 16 May 2026 20:26:02 -0400 Received: by mail-pg1-x52b.google.com with SMTP id 41be03b00d2f7-c736261ee8dso420267a12.1 for ; Sat, 16 May 2026 17:25:59 -0700 (PDT) Received: from stoup.. ([71.212.142.33]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-83f19c5be71sm9670317b3a.39.2026.05.16.17.25.56 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 16 May 2026 17:25:57 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1778977558; x=1779582358; 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=LXEFjIA2Rc2Ly2XJsgxo/zPmqwc6w9LU/oPQ8iHupDk=; b=KaICmOxAdkdSRhASr3rbO3HIe7RHhFMtd8rHJ0Pp8/R0R5KTolGvNP8LelMIlIVIab asTImzJYvrmB9oDvz0JoSJmcJUmEpXMq/wjoxBmfSaKbxx7IwQ9JpRjQm6nbQWWmQuWu ysNlL5btbI0og3U7MU7OzjXJ8UpbcSEZFJ1Cf3mMicwOyYi9s9h0ZEREbJFO6GEoEsz3 fhb5tH8D+pxYgpyIsmeeQs1d9qXPpmSkNhludsNmbcaSkxV2HvZNVrTfEY79otSsxYnW h8opR4gaLOF1aD+9+F2rIZOEUJ/MmPfyd+NlYUDdT0it+3vfmS7YCbVXF099VtVNleaU /0bw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1778977558; x=1779582358; 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=LXEFjIA2Rc2Ly2XJsgxo/zPmqwc6w9LU/oPQ8iHupDk=; b=nQeQtGpEHhyiyX5MYLcUewDgclo0boMa+ccruIK03pKl4mBhX5So4FCxf5VYfGy45D +j35zy960BMq/1mn7U2f6dAvLxoyvm6eCaM34T76BPDc/roiEB3QLLCvtYIYJBKbw67s Kyybc0+teWExIicaBySxwhvUt0p/XY5dbeGVhjygmV5Kycm1iiNfuxnZDeK1xW/jISZF u0ytPLByWV5i9KPnCyRQfQ8h/XuvngWf9BOwcNNJGXZAKW7RheVgYK76r3c16ry4DJuG BGgPqDaU4A0PWdIMRKVOLFSFCm3HD+Yex8egAfVl6UhN957nKC1l/z5/O0Z1ZS0+DKXl LioA== X-Gm-Message-State: AOJu0YxlHXuDNs8upzE4lfII3fS9tRTGBWTpMSvtgpx4Erq4635RQCfT 63ydcSabUDT3Cs3v50dRJn3OZTjw49mUL7qCVd7RhbgblvGpvuuESwgCekPXGXZYEJhgVtMEhrA 7KfU3 X-Gm-Gg: Acq92OGUhQGhnxfMuiOmQ2H0H4rXMnLsQ33HASJ9+heefUbDfFzGFyLnf3bxkLxBnjr nBRmeEBh0Z6n4bUvDEMNq8w6VNBwHbnu7HbD6wrA17tylAA9bO8EIB75gnBCer94OKIjL3jET+N OTvXEMLYO4YfoM4Dqwd9GrJ99Zj9UynQ5L2O2IbheORli4BAL9urMKWBfT1BoHI71mED1kIWoX0 jz0gaNyixbzTdsNOL3zfGwNwpAhaTB8oM//isNJhtGHPWPcNwVJK4os6rNFayvdc7aFaPLxeOVT AbFuFgUXHsgKPrO2MGUASWy3mLTMOGHykBI7O21gLZnCEougp0X+44X8UKHpkkQWfKtiFWyNw9C T0dUDhvwPFMSZaXtFkHOX9vHYD0tBccy9EYg4Q0tJtRYbNz+N6IFIC/5U7SNtpD2LIzC+b2L2NB FmQnAERY24WU/jGRRp3nBhKF5eqUjc X-Received: by 2002:a05:6a00:198f:b0:82a:5d55:5807 with SMTP id d2e1a72fcca58-83f33c52428mr9516451b3a.6.1778977558290; Sat, 16 May 2026 17:25:58 -0700 (PDT) From: Richard Henderson To: qemu-devel@nongnu.org Cc: =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= Subject: [PATCH v4 04/12] fpu: Hoist nan check in partsN_addsub Date: Sat, 16 May 2026 17:25:41 -0700 Message-ID: <20260517002550.321291-5-richard.henderson@linaro.org> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260517002550.321291-1-richard.henderson@linaro.org> References: <20260517002550.321291-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::52b; envelope-from=richard.henderson@linaro.org; helo=mail-pg1-x52b.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: 1778977678942158500 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. Reviewed-by: Philippe Mathieu-Daud=C3=A9 Signed-off-by: Richard Henderson --- 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 437b333341..3246702289 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 13:51:46 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=1778977645; cv=none; d=zohomail.com; s=zohoarc; b=OnRql2QzrJMpTDQKS4CSPx2FC1osY7f75GHLz6oLzCVIP3BUE0zOq8Wc1GJinPhAIKHmhW7d1un9xmrB00sMPN0x+uvf5sEvZ5hMcZcHpJZm7UojeYX4uRwbYts3lGASFV+jmdmKWarr2AK+RewZY04bsydIxwn2kyQa5gVN++w= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1778977645; 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=aizZ6KsxuScbuarSuGl62Wou0yp8xd59JdQCbRvge3Q=; b=ho6VaZ1OXMpx/s+RPV2h5/2Abm9e/XxgJlzsK20BDpWXTyYZ0E68GmS5zknui1OwY9RpPYDDsfhFFgRXxU9VYrSNphyOwF7WYfZTEgKknQ5igD0p4uuclAJDMArijGLVv2XfnwGkhDzIhODlGMbw6zjoHK6GnZWTyNT7Lmy7nLE= 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 1778977645235940.4025649483807; Sat, 16 May 2026 17:27:25 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wOPKn-0001hp-9X; Sat, 16 May 2026 20:26:21 -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 1wOPKV-0001dy-1w for qemu-devel@nongnu.org; Sat, 16 May 2026 20:26:04 -0400 Received: from mail-pf1-x431.google.com ([2607:f8b0:4864:20::431]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1wOPKT-0002Wh-Ha for qemu-devel@nongnu.org; Sat, 16 May 2026 20:26:02 -0400 Received: by mail-pf1-x431.google.com with SMTP id d2e1a72fcca58-835386ff122so1125286b3a.3 for ; Sat, 16 May 2026 17:26:00 -0700 (PDT) Received: from stoup.. ([71.212.142.33]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-83f19c5be71sm9670317b3a.39.2026.05.16.17.25.58 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 16 May 2026 17:25:58 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1778977559; x=1779582359; 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=aizZ6KsxuScbuarSuGl62Wou0yp8xd59JdQCbRvge3Q=; b=sAdgmxIZ2SNp1KU+/f/R2fA6D61RNdVOfXes6gFyVhVrIXxWO1HqPSggN1rBvOSSLu sbXGlszWb43NnI9qjV8j+7u4gwD2I0RzoXA9uWCliN/wWnhQ6Myy4Q2/t/eQc7o+Hnyq SFJMUu8js+Z3bAtw+U5ClKXHQ0fCK1iqG554HdbXckyHXOggRcIqI9gcpYUBy4fr4W+Y c41jJbrGdEGub9PAjsIZaGA0j4WYib6G7cExRwxl2Q5gUnSQSAVM7IfnluG2aW4BczMc uAIiHpz35FQUvSj73FRTE7le5ImN4kzTGx0zLvO/RsJBzyLVg6ddHAotpmX9LZXZEza7 4Ejg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1778977559; x=1779582359; 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=aizZ6KsxuScbuarSuGl62Wou0yp8xd59JdQCbRvge3Q=; b=ah/Ar3NrE10PQfYp12FKtknAgwnMi8pv3D06x9L1q/F+lkkALvpd6sqotJIkqsmz9X Agliz0LCWVjC/z/enjKpnmkvxvdGGUrgtu9PX21imFS47wLQI+OWoN0lTufgKzRkbwUh ZyLOqgvoKuqk7W5gH6FL4HHiGif2Ad8Xvgw8lL2vUvfLNhpHWJkP7MYla/dfIq7boU4C GiRxcYduexWWcd40Z/cgUgbRBBdTPbaFkH9pyqSWIfEHGWxqA/7Z/MXWZHrEbo+oX6dR 8ZVyOt76BF/uPzeE/fOEComFn7nCGOunhkgg691XfZhwb/MEleCPZgIRxEkcf12WUNbY B88g== X-Gm-Message-State: AOJu0YzbKPQn3es9+sZSj/4lSBepJVB7235QL/SeKQaj0hjbaYDdeFzW Hf7cFD7g2Bdvz32Lh8u7Jud/6lcDKoKLa2xfE2J20dH3/00wQV/cID1isfgdcpgj/zN5x5j/AKX 1inNA X-Gm-Gg: Acq92OH/nJURVsntUDldxyerHM/zT/EaJFPTyFWBzlijNh6iVCTZCV8MAFJ1nA3aQUZ 9x9T9w4Hj43tlLhlifjqtEKDN2qw9hZn9vHnb0WnqR0/HL5WPzEm+Bbc3Do3FpujVjaEwv/aC+Q UmIvOYiwwU26dj4URtxM5EP6bSLZQsit4Drsq/r6zVriu8uS095neBPaDKRZrGmam71tDmz3giE AJUGBoq2BIMYxUAGM7khKob6SZX6zbZygU3ood+33Y9IMqur0OTh7BX9RG/x2ocWFj3rJNhxDHQ LIgeD9QEKZNYFLzYLD4ojglnduQ7QoVJha89knKlrD7w2qkuxgzWeoIcRnig0naueYw6upDpiZ2 GQKQ5reT8A80bYMSlJJI1iChNRiK+DAwoY1pZvseeEO4Xa1OZc40cZlR3V19IHVdngSyVo4IY7J jswe/M5oqu9G0gTbloQVu7OwAoA9zA X-Received: by 2002:a05:6a00:4fc8:b0:838:1636:e2d3 with SMTP id d2e1a72fcca58-83f33c97154mr10721453b3a.35.1778977559196; Sat, 16 May 2026 17:25:59 -0700 (PDT) From: Richard Henderson To: qemu-devel@nongnu.org Subject: [PATCH v4 05/12] fpu: Simplify 0 +/- N case in parts_addsub Date: Sat, 16 May 2026 17:25:42 -0700 Message-ID: <20260517002550.321291-6-richard.henderson@linaro.org> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260517002550.321291-1-richard.henderson@linaro.org> References: <20260517002550.321291-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::431; envelope-from=richard.henderson@linaro.org; helo=mail-pf1-x431.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: 1778977646755158500 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 Reviewed-by: Philippe Mathieu-Daud=C3=A9 --- 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 3246702289..45606f8402 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 13:51:46 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=1778977624; cv=none; d=zohomail.com; s=zohoarc; b=TQmDb0RdF/LkaiUcF0YTuuF7kUPayOdlYd+TAlV5k9aaoMAeCI/GNTWhjZh7eBkaeyMAcFOMSzNB/qfIbOLgQTLgLn0Qh2RuyJrlrnVodnW2OcOVkrTgUtUfp1eVjbfu688XOUPMFZ6MBquAosklFEAo5OBkxkHWAHq68J8pWX4= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1778977624; 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=2J8h7EuqX8JGH71JQZgqsud/ulFplvnKZbTkt0er6k4=; b=S8obV4Pmz9Z3KfOEvGW9jpQ2mJfn84p1FEXWzg+ESX/cQGIH6ThCildYrABSRaPCkvMgnd3ZPnKYNkRLlUdyPAkWVIrruCrl1lT59A1Hg+4ilPQcHvvDExQFSDz3DOQEUOFe4bYK1fTVTfby4KtScswV5iH7JY9m5UWUyisAZWA= 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 1778977624199164.65756744222324; Sat, 16 May 2026 17:27:04 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wOPKp-0001iC-H8; Sat, 16 May 2026 20:26:23 -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 1wOPKW-0001eJ-Tj for qemu-devel@nongnu.org; Sat, 16 May 2026 20:26:07 -0400 Received: from mail-pf1-x42e.google.com ([2607:f8b0:4864:20::42e]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1wOPKU-0002YA-6V for qemu-devel@nongnu.org; Sat, 16 May 2026 20:26:03 -0400 Received: by mail-pf1-x42e.google.com with SMTP id d2e1a72fcca58-8354461da74so444400b3a.1 for ; Sat, 16 May 2026 17:26:01 -0700 (PDT) Received: from stoup.. ([71.212.142.33]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-83f19c5be71sm9670317b3a.39.2026.05.16.17.25.59 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 16 May 2026 17:26:00 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1778977561; x=1779582361; 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=2J8h7EuqX8JGH71JQZgqsud/ulFplvnKZbTkt0er6k4=; b=DemfvLZoIwfhF2RWcaopTdjkBqGfx+jiNo2s4QtldWqIl2yT5fJjsYXZyybN+5IZtU ZA+IkI/tnGf9D7E0vPoV9BXFHotNa2CpuwW1zDsjjHivhj0OiQrD/PYuTQFiYePMvPn5 kqQ3CSJE1suA0jg/BBEFVQ/aDlnr0hhulAcAdnpaMS9yF/zdBYA8xThNqGdmoh0AqR+H mQsfeRTPTloVGb9e2EquTk8PE2gTrNcR/Id9g9/QQlZ8ZQ8gX7wHXOdHanpBE049G47B n59ucPZPoJpgY8A6cg+pf4VmX6uSw/kk4N9jfMPpajmBuDpCIyTuOdfUh6JBabI3oHXs Ljiw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1778977561; x=1779582361; 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=2J8h7EuqX8JGH71JQZgqsud/ulFplvnKZbTkt0er6k4=; b=M3kLjQZG37uUaJsWOiCqlwULooeqfh5XSkPKooz8+9qQA8xW0bo1KpiRNy0wuhTDEA nByurnIeXPMz4ExINaw5S+QY2eLXr0TsYqfq6Vc41RWKd0DNvfgEIPUyA0r+6KzkgZZc OxBy9JOEdnBzx3sfSw5mFRU+XAVIUEetNiR8xT/tQIRKD92RKEyW86dKBqnsQgmCq1k9 5eZUVy1N4sgH5za3w+udAB9OxX7OegxzIEg7uL6j+JSMwmpcwkAZiiqIp/heYrHnW/3w oZ3bT5JT63e6OL1cxqsxnw5YNmijFwBh+CfyVzEJRtfM+LBhgZxFD1WKqg0RpqRZ18YE N+7Q== X-Gm-Message-State: AOJu0YxVM0I8QfajFaRmCgOpoWwyxGq4oSpG66XWIoPkBNb2F6fs6DFi OxF+B4yVT747kYNYLuzv5a0sDLFjuMPO5n8pYsYdcD/oCWaFqO89nNXAhj2yAjicmC1dI8uJ8E/ K2op7 X-Gm-Gg: Acq92OGcO6nNOJfENqryumqjuJmEF6YtJ8I/DuPQQ60h9HzIWXoSkRD6LOXXRTrN/ti YTMK3i7DK6CRICRkNEKUWpJ2vlpolHaKpNS7RQR284cTbHiK0CuX+d+OhjfIh1JqTtUXXEgHfnB 9yFNqrlMXiFoLjqg1Wfv+WQhLpWFpiFBMEapNZrwvTViprOQhNKzjuLnGoyaXHAQBl9X97o30nJ PZOJThY1Qb5urVq9bGSI4FcNgDpx4ICnuSSGzQ8Vd6kpulGE2dyoVa8t3QbWWjTFs0aBqiRT92V DSzO2k3KXIc4NIRS3y6ExRi/HBpr5Dz+7XboCwznz10Mpfb1aHQWnN8gfPcvFDrG3M/tyZAtFZN SVf4T87FFuAnHM4bfSWTfPaBI+eAwbLUIfREkGf3pNmMP486smIk8GxymrnhD0t5tlR/oVMx04T iUgr5P/IADphXrNxhq0z9wCo8Girc5 X-Received: by 2002:a05:6a00:a20e:b0:82c:e1aa:21e3 with SMTP id d2e1a72fcca58-83f33bca81dmr9848317b3a.10.1778977560527; Sat, 16 May 2026 17:26:00 -0700 (PDT) From: Richard Henderson To: qemu-devel@nongnu.org Subject: [PATCH v4 06/12] fpu: Use parts64_round_to_int in parts_s390_divide_to_integer Date: Sat, 16 May 2026 17:25:43 -0700 Message-ID: <20260517002550.321291-7-richard.henderson@linaro.org> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260517002550.321291-1-richard.henderson@linaro.org> References: <20260517002550.321291-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::42e; envelope-from=richard.henderson@linaro.org; helo=mail-pf1-x42e.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: 1778977624910158500 Content-Type: text/plain; charset="utf-8" We will not expose parts_round_to_int_normal. Signed-off-by: Richard Henderson Reviewed-by: Philippe Mathieu-Daud=C3=A9 --- fpu/softfloat.c | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/fpu/softfloat.c b/fpu/softfloat.c index 905ba6ecf8..08ea56a71d 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 13:51:46 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 1778977629300836.1463317527484; Sat, 16 May 2026 17:27:09 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wOPKq-0001iP-O5; Sat, 16 May 2026 20:26:24 -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 1wOPKY-0001eh-Vo for qemu-devel@nongnu.org; Sat, 16 May 2026 20:26:07 -0400 Received: from mail-pf1-x431.google.com ([2607:f8b0:4864:20::431]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1wOPKW-0002aW-MF for qemu-devel@nongnu.org; Sat, 16 May 2026 20:26:06 -0400 Received: by mail-pf1-x431.google.com with SMTP id d2e1a72fcca58-8353fd1cb5fso443273b3a.0 for ; Sat, 16 May 2026 17:26:03 -0700 (PDT) Received: from stoup.. ([71.212.142.33]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-83f19c5be71sm9670317b3a.39.2026.05.16.17.26.00 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 16 May 2026 17:26:01 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1778977562; x=1779582362; 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=fCZyoqgqjVXJJtjxCkZlZshfx8C6L5WwhqI7H2CZ8tM=; b=njz/VanvoGCWA5zisIK/6GTHXB3y0sP5kazmOay6fWCE7fssXl6EteTIMbsMSGkjwH 1D9MJyBB4LDC0ayKzhzzMPZoRXCoAZj90ZRaxN1Od1+DtBHOkNKiRdWcIMIAgiBZdUTN 8hPbna1Iwn7n4CP6GqiFkna00F9WYUqTLU4UboU56spB2bO6+zy/29lC0BqqzCsRVUbW ic4XTbuPjoc8B8G7y1Q4aMYVLjFWjQ2gBjao9AdF6XrQ4a8MMJ9WTU94sTEk0w7sb6FK uu9QBLRLk0+Vs2Kaje31RUv0Nuv+mUCXGrJw6quf3mzDIdlti7RYXkME4x8qDktenPT+ sJHQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1778977562; x=1779582362; 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=fCZyoqgqjVXJJtjxCkZlZshfx8C6L5WwhqI7H2CZ8tM=; b=WfEdJhKyoZPwCUvDAZS+3Q0vb+zpX4xkf2okfkW+nwWmeg3DpHkW8VtOu+ax7t1UMf PXLKsW/1U+MYpoCzereCDsHO7JMhw2Qws5DwvqjcG8vre/tnH2FqGqBfs0FvknTnkV7b ziD5l1yWwTyL050Z/7M5TGkIcGojpapiJoyLQzoAzEGfe1+tgPM3kNvkZuoUAM0sdQ+o PRdhoNINd5SQZmy3qTtP6fvkmIFrBlbCKTFZO4TTKQ4aCtuzo4IDD4/W0yNq9OVuT6Ds QwrRmAzxnZVktx0b1vHSZYiiNmcOtBdP9RQHBCJ0iwV31bXA0Ni0OYMRqQsjMqH0RNwj wTnQ== X-Gm-Message-State: AOJu0YzmFg1PQPj2QVCQyXyYPWDycUr1rnTOupLlKiJjTl7YgG8h2GN4 PdYlPhizkzrmlC3RFLqciXNKi6fFfhRphkleKiJ+EGIac4MqZahzYl8JPb9Qs4H58AKeqpZswju O7/WZ X-Gm-Gg: Acq92OFez5f4i2X1MBCJ4pSltHy2eRfke8LmZqdzLkUUsTvpiJfGBcL5SA7/G5Em+Xv d0MapdKSkCNd9T4Rp34167tfvRPCUuboL4DJvwwpnItz+u5XqZ1JFhnzebown+Fjbxo3lF+1nJe qzljlQ9waM7k9RbYTZ2XQdFNT7zOcNOLiiwS97sqTRgJK0A+/25R3Q7WNFF40GywOLi7opDg8Z3 i3ySw/WfrjGr5czFjrzfmIbACBPWAdRZ67ZEc1az1lU9cvM2SUnX+BhNi5i5RwVmane61M7oZS1 wA9pxW+v5EBYHIhLNjKnRxXgTWy0UPA5skJn2agRXYR9oFlyBzLSjRAYwIDkCUd7BErWMqu883z X6S++a1oZAqF36FEhhXDwRTiaVQr9IMP2SzlJjyfbA+cKFx2UNzyNh1rxFvzjrVQVgBsaqNJm+7 i+1uQg3/8vPNQjUgni/R1w++gi49AaHO9T1l6eCvtJjDFvpau41g== X-Received: by 2002:a05:6a00:1405:b0:82c:1cd0:2f7e with SMTP id d2e1a72fcca58-83f33c93b19mr7002752b3a.20.1778977562185; Sat, 16 May 2026 17:26:02 -0700 (PDT) From: Richard Henderson To: qemu-devel@nongnu.org Cc: =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= , Ilya Leoshkevich Subject: [PATCH v4 07/12] target/s390x: Move float{32, 64}_s390_divide_to_integer Date: Sat, 16 May 2026 17:25:44 -0700 Message-ID: <20260517002550.321291-8-richard.henderson@linaro.org> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260517002550.321291-1-richard.henderson@linaro.org> References: <20260517002550.321291-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::431; envelope-from=richard.henderson@linaro.org; helo=mail-pf1-x431.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: 1778977631033158500 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 08ea56a71d..a762f4b43a 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 13:51:46 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=1778977632; cv=none; d=zohomail.com; s=zohoarc; b=nMq63AqLAlYm0wZh6o2rW0RPVTDgJYvUsNRReOJsi4uQnc5L93+gQcx3GvkkhuJD9J1hQGGp1y6LBno8+jhm0CEtO+dWuagLH289c6NVzqhjaxtJRvu4K+Ope0jqxu/GqK0vTAr02uTjS2Sj1qVV1kF14MkXWJoZLISVSbkAnXg= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1778977632; 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=d/7iKZNywgV3QPhGrfS0cdcDKlE52GUm3Yc5Fk32xV6kjUMySuV+ErsRy0aBLpadq4+Gge/2+vzjaVVM7L8ZYqy8YaqNnSHUQbL4I1Nkpwxs/Po2nEkAqj/TVsQzA5Ie2XKhXW87QioXi9vUee+pIro0jbxJnJxdFQcRo2x2Tyc= 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 1778977632577688.2146160216848; Sat, 16 May 2026 17:27:12 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wOPKt-0001jm-IF; Sat, 16 May 2026 20:26:27 -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 1wOPKY-0001eg-Qg for qemu-devel@nongnu.org; Sat, 16 May 2026 20:26:08 -0400 Received: from mail-pg1-x52d.google.com ([2607:f8b0:4864:20::52d]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1wOPKX-0002aj-2B for qemu-devel@nongnu.org; Sat, 16 May 2026 20:26:06 -0400 Received: by mail-pg1-x52d.google.com with SMTP id 41be03b00d2f7-c70fb6aa323so348370a12.3 for ; Sat, 16 May 2026 17:26:04 -0700 (PDT) Received: from stoup.. ([71.212.142.33]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-83f19c5be71sm9670317b3a.39.2026.05.16.17.26.02 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 16 May 2026 17:26:02 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1778977563; x=1779582363; 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=rBtZsPhIPsbz1w2dtwLPNvfct7kC2U43LuGb+N8vsr52bIio/WGtO/zouN/4dJ5/Px 4yfkLXCYgz15yLjmytc37Ep+pyPKJVeyZEmq+Yd8RJICkWPduplIBSZsZZnz9DTlOA1C JFkY9fe+Q6/cZyUwAY5SnqhNqGvTLikb2wixpJxUvM6jW/NhamovEpPX1BHOQTl+wTF+ ZHY3NN1+vXPqBsCMBlijKwH8Tku2Sb90F5knAIbKOJIyFh5+OCLAYTcJad7JhoIDd4MN /52QCVJ9UHr8a4Ucs+UP6NzwHYgsFQCSchNLlmJibGn5ufqr11HWzrLZvqlmz81r5FEz Lgzg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1778977563; x=1779582363; 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=KYEp0wi0lmDprKYQ/ucSFY5/OjkZkCOsAnkeN2y1tpj4DoEbaJnz/8C6Nsir5iefxO RnlcfHLH0khMh7pSR/gs7sNFBjTUNXxXgFZBw6x8Nd/cBSYLZaCBZAqiIqLrg1eXZlAZ 31AFuLyODl2mW1GvZ29CD0koqJVh9TeLrFz0OSLec/IP7yugIGVEMD9RN9acuB39dxU9 cgsxd0YFPET5lrR5Bzl1auHfSiJqjlWtbCgAviluKFhbp59IAxxP41LnzCMqP/r8qS5X 3JEPUJV0nPDb4o7UYZArwq/WjIW9qTvgdDS6IWccGMLKUKP3Z1ecu9Eq6rEyBarpvr/u Mllw== X-Gm-Message-State: AOJu0Ywr+WqMgBRdbio1NKvbgHcSxWudRDtOf4cBL8nFHRr8JiKyIneI 4Px6+EHlx3vdO9uzxotkYx3c8ri3/kHmBrZ3yagfhWxC5RQm9/QRCgs8njZ+ZyW8UOHpcGhJLcB fOavL X-Gm-Gg: Acq92OFxQLShY1PdCzzDN5KJcRBFBQKuQQlRJ9OqonGXLBM8u9x6GnaI8eFn+HVkuYu 5jPzOaIkybMInSTe9ejU7RCGD0AE7ejDr8vA1QO5jdUBrXd/+UC3W4+BR0LKSvTRk3xBfXEBVl9 7vfxH88opWR1lH8AT8jAKoFpsbRF1qrFQ6TEfXtNbO57f7BOKr6uv9F9RacatRWMAUMBJcxLUTY nFXmbFaIVqt5eFaWM4z92jQ98TV5lblpbs3Y/3nkdwau3uj4hbWXuGuITM5/UNGJ/lpSwIesUQp nA4NVhK4SO2Tz+xq+iiW366p3JryA6NIOOWcRL93j4wSxEbxz+zYLKz42jYJPatGYNmzATYUQLW UUznxVZ9YDCY20H6Lo2SmL9W2vkKquoueS6fBXB6EF6xmBAxGMUSein75HYRJTBlQDk6th4Gr7M 0/dOsElytKFtxIPZB4j8se/RWmyBeRQfD9WFwlsgE= X-Received: by 2002:a05:6a20:3949:b0:3af:91a:ff52 with SMTP id adf61e73a8af0-3b22ecb2b45mr10283160637.51.1778977563380; Sat, 16 May 2026 17:26:03 -0700 (PDT) From: Richard Henderson To: qemu-devel@nongnu.org Subject: [PATCH v4 08/12] target/arm: Use FloatParts64 in bfdotadd_ebf Date: Sat, 16 May 2026 17:25:45 -0700 Message-ID: <20260517002550.321291-9-richard.henderson@linaro.org> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260517002550.321291-1-richard.henderson@linaro.org> References: <20260517002550.321291-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::52d; envelope-from=richard.henderson@linaro.org; helo=mail-pg1-x52d.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: 1778977634878158501 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 Reviewed-by: Philippe Mathieu-Daud=C3=A9 --- 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 13:51:46 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=1778977678; cv=none; d=zohomail.com; s=zohoarc; b=Kh3jvwOccjAeEXOCTkortSduK/f2F47AnviHc1LtFD1floylUOfGd8Q8zU2E4Nhqshbl/54Z/qcwVz/rQfYriFhDb/He5aYRX2boCkaV0O37THU1UGAfBOZcBLkS0Zbj2tWFs7EDYwRT7scP/+6HKj3Cpzd0kiZO61P/soBzojo= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1778977678; 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=nnfHJatMugM9eWBk1w6tD+1Uw/GoodoR/WpDYn0oU9avP9VDZvSOovwC7GIffqxa+nJgd05qHe9FswdsvwDzdTgtVsiXB5O0nhIPDxcKBfTSPdtl22awlTkyZbshH9ofx5ndUmn5QvSlXNpuEPErFNa0ZQ4BbhzW8RJOxjheOyM= 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 1778977678816776.4205495296344; Sat, 16 May 2026 17:27:58 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wOPKs-0001jD-5Y; Sat, 16 May 2026 20:26:26 -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 1wOPKa-0001ek-Be for qemu-devel@nongnu.org; Sat, 16 May 2026 20:26:11 -0400 Received: from mail-pg1-x52d.google.com ([2607:f8b0:4864:20::52d]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1wOPKY-0002cD-3p for qemu-devel@nongnu.org; Sat, 16 May 2026 20:26:08 -0400 Received: by mail-pg1-x52d.google.com with SMTP id 41be03b00d2f7-c80167f56cdso350178a12.3 for ; Sat, 16 May 2026 17:26:05 -0700 (PDT) Received: from stoup.. ([71.212.142.33]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-83f19c5be71sm9670317b3a.39.2026.05.16.17.26.03 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 16 May 2026 17:26:03 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1778977565; x=1779582365; 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=bsmrs+Jvu/uwdeJv6KJy5JgNEx9HlxymoY3zGSmJAl+WfWsL4NYJ7KUhRY+kqjZ9E6 BpGqR4mnAncgvR3w+3//TNold16pGO2In7CvMYJIyAhcBRkuQNUwoH5kUTk4sNuR47U8 EAsHq4NExo0/GZ8bgbKPN4rr6znJUKuV+Db7AacoOKH+5m0AqbnOu8S4XOs6kWhTIj/s toMhFYbQ87Y8P3Cls7OiTbmDBd5zeSjvC9t+Cw3g9GXeMjnq0yT6s3saJbtaJ5bIsX0b BEX8GC0CkQ+LlB8ZWh0b+gEEWdgDuH2FnyHcBj9celLADxmcj+Rcr0MM6UY9gNhv3xdp ANcw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1778977565; x=1779582365; 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=abHpN5tl6NyK6yChgwhk/rTpztufvlubqGt82YvTqoyvyjt3pw1nxx4JdixWAHAlg8 x2ciVrE33OR7GCuK7gO0iK/GHZJbLQzuVi3t4KhZSkYz4glyodBzAQ8TwOPW3clM1Wn8 qF4UUSg0Ycf0Iq0gBOY3nzU7fyl/OEIzTg2Z9Zxt5m7AoOV0lBe6HGTSuP3MkdCl2r8o lHq8aWvh/UT438oPG7eu/kyM8cMNyjeI0AVBKmAtV9M3NnKQHGXLFPmn95J7Uogfr4Tw dPKx9ISEHlZgTfKUBiQjTCbCazWxQ2WrWdJNwe0G7gkgiXBLFTDOF9E2jANqSs9RvFiv 6rVQ== X-Gm-Message-State: AOJu0YzxPuoDCetVfaR004GtfCnUx8EMhrtvWScg+b7Me3lNc0zQVcvl uyarifC2xjkOq0hdotN6U25+RjbGU3M52DBjS6LkhQNbXjm6fs+DfPgc2BO2UM2SGl33khc2dwp qB7St X-Gm-Gg: Acq92OFOUczk70dGO01PwKPvUNqnohR1bczesr6HqRy1V7aaSDEd6sSkxRi1D/1/qQY HzKBNCca2bvvAh6XPd053ESGNy4wqO/QM55Hy0v78YX/W12taWOYhJhCU4Hagg8N513C+mI5XG8 ealnd9Y0V+DyEwFnu1DkGVwJCP5igHAFmFJWrey3GLmiBYAmfsY1Fzhf8PJMxPtpm90ysGrN0/t p3zEbt+ZJodpB1poPeNmLc/a2fK0U8gtGHMJSCUo8s4d169vQj+fMGyKX1imPOMacd/JCFYTQaa l8kouUOBs+UFmNdXylSGuHjQd/1DxMtcfBa6hVqPj672jiCzPPs8kjV3Rn/ERTxmkmjjzaSRH50 lVulKwI7bf3G/hJ07qfPM+k9d6Jw+EmQ7yDFM1bUdhGubjSU2vwAO7QfNSMUWeNIm6ul+TUVBU3 P+WToNKuONczysofe99Xp5TizQMxFBEiI4Nc5bFnuTCrWolHa3wA== X-Received: by 2002:a05:6a00:178e:b0:82c:e9cc:f61d with SMTP id d2e1a72fcca58-83f33ba0aa1mr9877619b3a.9.1778977564614; Sat, 16 May 2026 17:26:04 -0700 (PDT) From: Richard Henderson To: qemu-devel@nongnu.org Cc: =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= Subject: [PATCH v4 09/12] target/arm: Drop oddstatus from is_ebf and bfdotadd_ebf Date: Sat, 16 May 2026 17:25:46 -0700 Message-ID: <20260517002550.321291-10-richard.henderson@linaro.org> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260517002550.321291-1-richard.henderson@linaro.org> References: <20260517002550.321291-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::52d; envelope-from=richard.henderson@linaro.org; helo=mail-pg1-x52d.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: 1778977680999158500 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 13:51:46 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=1778977643; cv=none; d=zohomail.com; s=zohoarc; b=QyLNcAqew5c886/HGhEPX9KJq5M2U/qsS5X+3rsl5a1byo4gO0trvv0VTq2M1FunYle5gBjeJ7gpvq2Tp7+sRi8kWNlsgmTMF0IQcAXRdLcQgTFUYw9UoPg3a9+OdUy7yWTk1GTwyDWYpHtsupPRUlgM4GI9Zwypce76GkfeF2A= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1778977643; 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=bTqlTcSRNJVOzyxvv4GgmPUhMR6EVKNZU/LxS1Fv/svnsJV5HCEi2n0PDZx68TLdeoxtotxnVdC/boGON+64/KFRaeFSSyKEuVvMS6SBSENmBYi9p9F6GVeow0uRRQFnVBeg5S5EHfvbSgPlVZkC+yqKNVrQm13t0YXSzd4aKD0= 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 1778977643304476.4543379041336; Sat, 16 May 2026 17:27:23 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wOPKv-0001lY-IC; Sat, 16 May 2026 20:26:29 -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 1wOPKa-0001em-US for qemu-devel@nongnu.org; Sat, 16 May 2026 20:26:11 -0400 Received: from mail-pg1-x52e.google.com ([2607:f8b0:4864:20::52e]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1wOPKY-0002de-VP for qemu-devel@nongnu.org; Sat, 16 May 2026 20:26:08 -0400 Received: by mail-pg1-x52e.google.com with SMTP id 41be03b00d2f7-c8027e876fcso371697a12.1 for ; Sat, 16 May 2026 17:26:06 -0700 (PDT) Received: from stoup.. ([71.212.142.33]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-83f19c5be71sm9670317b3a.39.2026.05.16.17.26.04 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 16 May 2026 17:26:05 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1778977565; x=1779582365; 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=X2IIaJpoB8n6J9pNuR1VP7gT6XC8dzdoQzuinlUWOImh7vbibBrnElHHfA93c+29zg 2PgFMEiFnKk4jUHPBZQzxsefoTQiMEOjkoX157yMETyrigS/R+6RJq4rWOLJINUXMIKP FQNOLZ0YNPJPbmGAym7VlslZGVzxbipTJ+vkQ0bNzZUr/mzGvzTDJojPCTR0Wl/Mg9S1 ofPrCCH80Oc1xk7rEdS5hErSKZxDMwDLY06vI01z/JBzrS+7K5rSRGoVen5PI/ULnyWO d068HRr6ezy2pVF/fjv3Fmre7CqXw7KxbDXkiQl70FHl25CZW7UXQua72ARJ0lcQJ+0Y Nsmg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1778977565; x=1779582365; 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=G/0bGssjHqiaGqbf2HtTvlyxS7Mk71+tOOE33a7Lh1RVLMm38ABR080f9pwSMBK2BH OmAtA9dkCBcWH7fcirRlSxtr0qSps756Ep6QN/oL1r7AN4BSJveL+yqLDzLMaUfFoghq 8lH+/OmX6Qs0B8wC0hzwZWK1ANsSFNl3p316qhSRviHmFlUlyDfy7IX8tQVDUjyc9u6M 51AwShbEXMefD6Mr6W+An7llIyCxZ0L25vc+Daf9ZDL09Gp3MbLVpFdycyBR4ByZDIjW 244ltJD0inUg1npo23kK7jozB9BkVmnOiDMSaEtF9rT/IZN6Jw+Iw42DdkqZKPc1ZZE1 RISQ== X-Gm-Message-State: AOJu0YxgfsWEYNhLTeHzNkfTgVMZ+LzPWpmyQd0Z4UhwMbXaQ+B6NWzc K5B6junDKdnsCgS90xTSVHeaUrfam1DRFFcoUmEwS56eFR1umoRJCYUTbZwbUFs+otcIBe9r/qI VOzSn X-Gm-Gg: Acq92OEo5yjmDRNquuHJ/OdUCRD6/pvJr/fp85GRJ7rnvMC2RdqTzwDM55PYX+X1m1R yIjr2t791mUcvBEIryauBqNXu0AvMfR/SjXGtPd2LaAFomOCYbpu2MFqbr/JW5vR/GqOIE9nKdV N4fcE8BYBvJOLgd/TOgCeQX5+qfs6yvRs+roJ/6punGbCb/amY7T2GU9v7ZzXTna4cnLglY/9Tp MPAdA/wNx/u7o+dX9DmPSEBzJ1NWBH6THe/HPodTmW2gtgyM/d+nlRF67J/gpGMITCuajs1Tx02 r7jqPcz0GPgIemaaSbFJN7akMrAZhAg2Qlt/wIJ4MfNuklFuxsKVned/dAt8D3+YvjHKp/SzhGG KJoCEKj/cTElj4s7nC7jhxpznVnfEXr2qoMsLKPgcf/r2tJWjFUxi/ctw8kB9mDIvlgUR76qklc Bc1BkAJDNKEDOOZVjFBtFsDThTSQU5 X-Received: by 2002:a05:6a00:e11:b0:82c:f035:6748 with SMTP id d2e1a72fcca58-83f33d8092cmr9723721b3a.42.1778977565319; Sat, 16 May 2026 17:26:05 -0700 (PDT) From: Richard Henderson To: qemu-devel@nongnu.org Subject: [PATCH v4 10/12] target/arm: Use FloatParts64 in f16_dotadd Date: Sat, 16 May 2026 17:25:47 -0700 Message-ID: <20260517002550.321291-11-richard.henderson@linaro.org> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260517002550.321291-1-richard.henderson@linaro.org> References: <20260517002550.321291-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::52e; envelope-from=richard.henderson@linaro.org; helo=mail-pg1-x52e.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: 1778977645207158500 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 Reviewed-by: Philippe Mathieu-Daud=C3=A9 --- 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 13:51:46 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=1778977671; cv=none; d=zohomail.com; s=zohoarc; b=fHo0EglZrYRe59Cfe56GZqw9lc7ACn3JjjT1FhD/YgGHxEkH6bwyCFFGKTbx1iRMGilqb/YHGLXj+/bIcG/oiUbHUuVfZnR715KZoF/3Bcc7kC4wtt16dhDrrHOJGwq3GeW+jiH8+k+FWcAgMBTXqkePKtO7Y8seCoP/+rUE2Dw= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1778977671; 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=RFzxrZgIp76/g6uZzqeb4ErU3uXRZCw3p7gJi8brWB8=; b=jWc3T9z0dh92Hh46xFeHwc8HFQ7ATbC/acw318fILpgUiBwRyxU8K/7Y3gVxAb69DITo3DnAomCLLZNlfhWU6vNQKUKzRJz1wtBOgMq4Ey2JHwyGfW6Fvv6Ej4pLa81tIu1uhyMdjNw3tuHP1iIwanMP6gdS7euNy6MBy6C1FKs= 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 17789776715081010.0979364000287; Sat, 16 May 2026 17:27:51 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wOPKs-0001jY-SB; Sat, 16 May 2026 20:26:26 -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 1wOPKc-0001f3-2R for qemu-devel@nongnu.org; Sat, 16 May 2026 20:26:11 -0400 Received: from mail-pf1-x42d.google.com ([2607:f8b0:4864:20::42d]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1wOPKZ-0002fh-R2 for qemu-devel@nongnu.org; Sat, 16 May 2026 20:26:09 -0400 Received: by mail-pf1-x42d.google.com with SMTP id d2e1a72fcca58-834f1075805so858057b3a.2 for ; Sat, 16 May 2026 17:26:07 -0700 (PDT) Received: from stoup.. ([71.212.142.33]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-83f19c5be71sm9670317b3a.39.2026.05.16.17.26.05 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 16 May 2026 17:26:05 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1778977566; x=1779582366; 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=RFzxrZgIp76/g6uZzqeb4ErU3uXRZCw3p7gJi8brWB8=; b=mZUbHRK0R5E+TpBth16/isQwwn/X2sCdqxYaI7eZfStZsgzF4W84E7PFoAaBgi4GPh liQanFrO+2MfdVfeFzVTYtcCKfqnOaEWoiaVxAOJd3NHe5dXeOA5RpxnlA3GDQRx17UL o/o67qOrcRUWX/6holT0m6zwWmvT6ZnXYb1pSXz4WfpdX++1E4bTWIMD1ZpqaBgmjziC VFEa9v0nQKB0zRBgn5RrHv2JOBYlGSSVPMQCIdLh4H6IwTYiX/qMn0idA+hqKwZh7pw1 7s/CY1eBAvzb45EiBZudiCuHVGOM8Qxs+4b7RJ0kCEh4L3nhShn50mTx+bPxovey1rDR X0bA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1778977566; x=1779582366; 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=RFzxrZgIp76/g6uZzqeb4ErU3uXRZCw3p7gJi8brWB8=; b=HcgF8bncWf3GLZHxilBiF20EUZUXObWtD1yCUTQXaE4E1AOcnAu4bC0jDzsFIIsEjI 8Vos14dPEmtgAq41LoyyYDLeTzecp3ggCjg1VdYCrxJOCkqfMyRSP5RdYeoQcdD+tVtP 23iluDrLO77GRirzzDtp/JTuAv5WYvQeO/1VZLPRuPr1C4dD+3GpGhjEuGZEJk2f+aPA 4TFyYXrRRdGHuNS0+2mYGdBtjt+B28c9KA5SAh7kN4RXR3ctf63uoMFSilbnUFbbUMni VuQGGleyYRc3gJwWRlD6ZF48RGvk2/aMUprpZjzfC13d7XDKlXMqWdAVKpftLT9BgAE3 z7XQ== X-Gm-Message-State: AOJu0Yyjz/ABnoau84+Y5eDVJ091wh6XZTGsrxF271VMjnznBKruC7Ny E04LySlETWrfoyr7qv1sFYXnBGy8JFrb0H+kINHwuqMeN7Sz4GAN9pSk9VpXH+RwByBgTiui6eR I72EE X-Gm-Gg: Acq92OEjl/H60aVncysTqwqtYbMoQIvCPA/m6wTd6pBgbgeEOW8V1/K+d6am9yjZY5p StPuZX43ozETphx+naakW23kOTx2Fk6qP64Egd3MBouddwuA3I45RK3o3ogOAaHfqbjBHLcPMXU QoKxqQeDT4GJLlR6OULOD3PxYheJZRGiIian7E5872P8q22YRaheXmpOV77OQAw4JvGUImgStes aCZeFeAvKzNsE2BVOh1FZvEE1NcSUHUwxuuXkhtBNkNi5esA/JbGeL/52UbGaM1dYHsnsj1bdC7 7TQenFMO7Lq9ZVzhiJUwZMVpd8xTJuZ3eFMUD8yfL3Rw4b/5T6LIHUDQQ2bE2dKIEbv0hRqNoBP VDntxTCSLxrXeJbpAh5RRmx98J16AD10eCZy1VkI09U6qXZN73+3EuNER4TBP8FDD56FPoQ/7lg IRFLi5DmrpAHwZutBW+KC0rEZkv8aM5bnmD2i1aMk= X-Received: by 2002:a05:6a00:194f:b0:82f:5034:77a4 with SMTP id d2e1a72fcca58-83f33cf2aefmr10301311b3a.21.1778977566331; Sat, 16 May 2026 17:26:06 -0700 (PDT) From: Richard Henderson To: qemu-devel@nongnu.org Subject: [PATCH v4 11/12] fpu: Saturate the exponent in uncanon_normal Date: Sat, 16 May 2026 17:25:48 -0700 Message-ID: <20260517002550.321291-12-richard.henderson@linaro.org> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260517002550.321291-1-richard.henderson@linaro.org> References: <20260517002550.321291-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::42d; envelope-from=richard.henderson@linaro.org; helo=mail-pf1-x42d.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: 1778977672866158500 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 Reviewed-by: Philippe Mathieu-Daud=C3=A9 --- 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 45606f8402..914e588ec8 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 13:51:46 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=1778977629; cv=none; d=zohomail.com; s=zohoarc; b=JP3151SqhnqX5iqg9L0hkCRaBwL3WrLT2sYP1P/cZtjO8BzT2unLlB6YgbXivqp2y40vvulaZA/vjwpQrUiyRa8uMHnMCJXRNb9voHHSNKQSQpGq3Gn8zFynTxNk6ZTdBEBivmmQrfX0eWnkJu7ksDoBel/P0/SyII4yprqjvKk= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1778977629; 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=AsQJRNP1GjT+LK7oBczLFbhTenBiS0j96dQXCFfIHLw=; b=cs8Y4vn8iBf0YUUc/LAqkZJ6WoYF9DroXCftKVl/ex6G8y7clqECydRnaJVlKH2gwqm6kLMdzppgPJnf4sbKYPc6vukDC0NJV7j1Ueelg/l1m/9iRvNrGXhqBP6pmwIT33sSqfP/8eypH04KwKregOERK7DBavAz/MwWYrADYWY= 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 1778977629079655.6666429282542; Sat, 16 May 2026 17:27:09 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wOPKq-0001iI-F1; Sat, 16 May 2026 20:26:24 -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 1wOPKc-0001f6-9p for qemu-devel@nongnu.org; Sat, 16 May 2026 20:26:11 -0400 Received: from mail-pg1-x52f.google.com ([2607:f8b0:4864:20::52f]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1wOPKa-0002gw-EL for qemu-devel@nongnu.org; Sat, 16 May 2026 20:26:10 -0400 Received: by mail-pg1-x52f.google.com with SMTP id 41be03b00d2f7-c802803ac17so394969a12.1 for ; Sat, 16 May 2026 17:26:08 -0700 (PDT) Received: from stoup.. ([71.212.142.33]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-83f19c5be71sm9670317b3a.39.2026.05.16.17.26.06 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 16 May 2026 17:26:06 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1778977567; x=1779582367; 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=AsQJRNP1GjT+LK7oBczLFbhTenBiS0j96dQXCFfIHLw=; b=g2wxqbULpeIgdIwlInPZKwXlxtz1wJJ56vV+ioGCAPQqIDzUUk+cCWl7kFUwch4aGG YMCrGSn238rT39QkWMDpLfTuSVRECX8kStnQSvdMOX/j7ujx0Q/X8lOzvVPmi9sXQ6U6 bI2PfojZuAF9OelOk9MwuBzuTRUkPuXDWT1k0IpDRZ0wKi9svrHC7KPVqzDzDLrTnKIL uZCmlwbjsN6u7X9TYRYXbhCM168nvshgrNh25B8D6dUvd+ks1EFcs5izxUQ/laSi51pC SgjQY8vWpBc+b1jJE5sfKjMmnasJ5ITO+2IVgL/dGG26PloyqHNgCu6joqrFmI27KM5Y eHZg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1778977567; x=1779582367; 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=AsQJRNP1GjT+LK7oBczLFbhTenBiS0j96dQXCFfIHLw=; b=FeC+9AjSLiRdCxYnAuUTL1B+6ZNi6qs4Ilyla6Hczb1H/iarSdUk7IOupUPymIQbbQ 39kl4jMhRa8disdmk/OrKI8A5x+BHaK3JVWPcXXXgF6Ekt8T41uHN/DbSl5oE2IBzeSZ gotlMOVV6uZSDOUaZ2x8g6d6lNu8rS23sFAFKVfx30UwwckFSMRBwfxXVJw6VmnZ39B6 pS0/dBbeqkr635AqSAsLGh8pI5CRN+r/oNiccPbWGMjikSKuEbg5DDIv/lJY6gugRgYi T5qKR9Sva4G+EihU3qBLtZVeoRek25RAnJknzR3gRfZW+EPTUOk1xc8I+ugsggio3aZH 44qw== X-Gm-Message-State: AOJu0YzCz8Kb4b7JGEKbqs5QmhMByUU2rTEXmdSnDepMKYcmcaF2KHW0 CoMpCTATGg8ofawqOq3IVrzyt4fDvPgFxLO/KjArt+Tv/kJ6rh6O/QnPXhQtdZYDhancwYUWefM btnPv X-Gm-Gg: Acq92OFc8hVA25r8vdCt7ydBiX8xdWhDANvf4YQQxXR1qTAmZecFmRnGJDfY3eA/JtU jLCPq71ahBngcNd+XseBSBFxWhJYTNg3zIBzL/dkWcMHEqLvCIJ+Nc97aDubkHDC/4rZmil9keH mAYIquXqR3d32I3Sp+q/Ryt3ul2wDRtsZq3z/hwDW178lj9pa69SwVsg1KBmFlpxT2PYVa50eq2 fK+tjo8nMMXCo4A1qg2BoGWfdv2AL6zH7+dnPgbz1+Hc5AK1owFP44GQ+KTkZPxRmVmwV0+q5Y5 +ejijX5Xt3TV7sqPr8AWG0rdz0ZvAIDQZoiTKIvwWVH3UT4zNRasNLhdyBNRfw/7VFYZnE7KGfG ZrXO9VxstmOT1c/VOQl0UdVv0FJFWn0fuGQAf9GshPsdh8Rf4JR95jeH4BbUVgS0Z0O1kDrc6iS a46RlT+7MRynVdA3EXd0upS9qYIHpK X-Received: by 2002:a05:6a00:429b:b0:83e:b125:ff30 with SMTP id d2e1a72fcca58-83f33ab698bmr10169419b3a.7.1778977566951; Sat, 16 May 2026 17:26:06 -0700 (PDT) From: Richard Henderson To: qemu-devel@nongnu.org Subject: [PATCH v4 12/12] fpu: Introduce exp_scalbn Date: Sat, 16 May 2026 17:25:49 -0700 Message-ID: <20260517002550.321291-13-richard.henderson@linaro.org> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260517002550.321291-1-richard.henderson@linaro.org> References: <20260517002550.321291-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::52f; envelope-from=richard.henderson@linaro.org; helo=mail-pg1-x52f.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: 1778977630948158500 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 Reviewed-by: Philippe Mathieu-Daud=C3=A9 --- 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 a762f4b43a..722bf5ecda 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 914e588ec8..0c617beef7 100644 --- a/fpu/softfloat-parts.c.inc +++ b/fpu/softfloat-parts.c.inc @@ -1108,8 +1108,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; @@ -1633,7 +1632,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