From nobody Mon Feb 9 13:51:29 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=1770290248; cv=none; d=zohomail.com; s=zohoarc; b=QFVnjpXCfHD1ulCLDoxyHwCDIMAADSQdHZzP5JQ63OMHv5EjRih475JgXguEPjeNsX8PRAF+OTFSJge544MUeahzHc5+ulyYWwmh8A7SA/xXBsgGQfpA+hvba03LahKW9i/EFUj/maCbbwavq9flyy5KwjUNKmUFKnyeyjR99GY= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1770290248; h=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=jL1s5SV3cubFpJlsGLlbrnPoja1OfqVMQ1g/z28whqY=; b=UjPb712ZmB9hueaTMI1G6x0lol4dZRj5EWDmzDZnNpVPjtfY4jmOjB0bu38Hcdq3n/xMyDmd5CdsRXYnwIa0Sz0zny9BrKwTUS+DDjbnsO2LpMTY46BvnGZuYF++EWT2xfzX1cbnoWWwwvujMUwBnzNQbKGmxfaji5c5GngG6BA= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1770290248383606.4924287391294; Thu, 5 Feb 2026 03:17:28 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1vnxM2-0004o6-Tf; Thu, 05 Feb 2026 06:16:58 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1vnxLe-0004gX-Ep for qemu-devel@nongnu.org; Thu, 05 Feb 2026 06:16:41 -0500 Received: from mail-pl1-x641.google.com ([2607:f8b0:4864:20::641]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1vnxLb-0003my-SE for qemu-devel@nongnu.org; Thu, 05 Feb 2026 06:16:34 -0500 Received: by mail-pl1-x641.google.com with SMTP id d9443c01a7336-2a871daa98fso6187715ad.1 for ; Thu, 05 Feb 2026 03:16:31 -0800 (PST) Received: from stoup.. ([2401:d002:dc0f:2100:7515:513c:b646:18b8]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-2a933851685sm51088435ad.13.2026.02.05.03.16.28 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 05 Feb 2026 03:16:29 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1770290190; x=1770894990; 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=jL1s5SV3cubFpJlsGLlbrnPoja1OfqVMQ1g/z28whqY=; b=vaaCG0hQtp4wTPNg4DJkjoPXhGW7qu3xldD3MlK8a0262KfxBPScPrqBvA4hF8P86v 4Eu3urgvcDNATrKDrKIvuUyUzkPzKwLFZhLgjXQZSHdl8s/rnXehSh1BAfsYdgvfMTqB fxACLdEdOXxiKr83BQcY+Dg5wS4E7RFNbalG+BhJ94DQQfS108PDBXtCwilUV5CxAGZ6 4lkp+UbiSwiXaUt7Qt0iqKrQwZw8H1uPcLyK2BNP+uP3dJbSugNsGiJnFSykj0CFKtvc DDH1TRWOYXkK0GCwr/3RvOYRduSZBwqzwjwUXD8cuLh1IKXXBCPxfwtc2ykQ4DKdFtOb o/zA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1770290190; x=1770894990; 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=jL1s5SV3cubFpJlsGLlbrnPoja1OfqVMQ1g/z28whqY=; b=K9NohhQrEWlKhFrMNY7tcyu7Jh0kw8lae4Bd+8PEvHssVXL3SxEzSiCrkcCG/9drUN T3u1xleWdzKa5q/NXYscc3PGKLPG9OyFJBzl4ICf8CMKXWLxQnP1f4tZm+SwQZMt2XYh efKDxeze0R11A+n2yhGQC8TkzdtC2dDGcMMbdYVxx/htRt9Y0IYnd3Mts1e2fOqztJ45 ZX/gYHQ02B8OpqFYgH6NIeURwnj5jO41hMrmHpByo857eq4PiF56UZY8gomyJVJFGhNP aK5iq0NmIjVEWr+ZwChOjvI+Ksj0/96ixd7OOzqiLTlQR/cJEBXDIuhaeFAlEsIzt5+g Lo9g== X-Gm-Message-State: AOJu0YzqEoDQosO6YzGFdqs30mZcak6IdgAyaHqa34n24fieQULFjSMb riPJ6cs1eXKEhR+I8vBJ3C1+yHH5pmoh1iGWnrVYD/8FAjltr3xBZCjVwM/h2LztTpeKIA/9mzP mGlqPQBC8yYAF X-Gm-Gg: AZuq6aIaeyFo6XXhK1Vh/XS5vmsjNf7BNHT7UwjzMtsY+unYr7L8xchPrstQCFm+OJU jCfAj/35n9d8M17KaB6bQPM4Q98ZbKM/cmSKFDDAStYnk7HxEGrapXxy010xW1uWCPTPQT3rh2w 3OMrj4wVvXGkJt3JY3akfh1itgHtbat+XWLBSSFtQZr/PGLWZO+rIjcvct10HoEWVX+8O2bQNOS DT/QYXKojcNQhmiSDD+N6INuQUL15xbutL+5ag++xTRCiC4c4Mk5IsfG81mi5p+Oag5UQAw2Itm pw+MAtDHJatECu9x5pf1mQIYGix3kAVtCrf9Qg/kFx8IK5CeudZlHdiTBYrselP+Z0NsXyk6RwH qkiZFG7S/t+j2Nr8HYwY5aqzBt9V9FaoEYvErfFegOKg/kcg7IjOjYtfeZQv7/dI+JoVvoEYsF/ VvZ8QABMTOH68kLhMBDil9GqQ5+IcmDRg= X-Received: by 2002:a17:902:d4d2:b0:297:e3c4:b2b0 with SMTP id d9443c01a7336-2a93410a4d3mr63224465ad.54.1770290190286; Thu, 05 Feb 2026 03:16:30 -0800 (PST) From: Richard Henderson To: qemu-devel@nongnu.org Cc: max.chou@sifive.com, Chao Liu Subject: [PATCH v4 1/9] fpu/softfloat: Refactor IEEE format NaN classification to share code Date: Thu, 5 Feb 2026 21:16:14 +1000 Message-ID: <20260205111622.461497-2-richard.henderson@linaro.org> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260205111622.461497-1-richard.henderson@linaro.org> References: <20260205111622.461497-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=lists.gnu.org; Received-SPF: pass client-ip=2607:f8b0:4864:20::641; envelope-from=richard.henderson@linaro.org; helo=mail-pl1-x641.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: 1770290250314154100 Content-Type: text/plain; charset="utf-8" From: Max Chou The floatN_is_[quiet|signaling]_nan functions for following formats (float16, bfloat16, float32, float64, float128) contain duplicated logic that should be shared. This commit introduces [float16|bfloat16|float32|float64|float128]_nan_is_snan that determine if a NaN is signaling. Suggested-by: Richard Henderson Signed-off-by: Max Chou Reviewed-by: Richard Henderson Reviewed-by: Chao Liu Signed-off-by: Richard Henderson Message-ID: <20260204051756.667397-3-max.chou@sifive.com> --- fpu/softfloat-specialize.c.inc | 192 ++++++++++++++------------------- 1 file changed, 80 insertions(+), 112 deletions(-) diff --git a/fpu/softfloat-specialize.c.inc b/fpu/softfloat-specialize.c.inc index ba4fa08b7b..7d2515c1fa 100644 --- a/fpu/softfloat-specialize.c.inc +++ b/fpu/softfloat-specialize.c.inc @@ -226,6 +226,19 @@ floatx80 floatx80_default_inf(bool zSign, float_status= *status) return packFloatx80(zSign, 0x7fff, z ? 0 : (1ULL << 63)); } =20 +/*------------------------------------------------------------------------= ---- +| Determine if a float16 NaN is signaling NaN. +*-------------------------------------------------------------------------= ---*/ + +static bool float16_nan_is_snan(float16 a, float_status *status) +{ + if (no_signaling_nans(status)) { + return false; + } + bool frac_msb_is_one =3D (a >> 9) & 1; + return frac_msb_is_one =3D=3D snan_bit_is_one(status); +} + /*------------------------------------------------------------------------= ---- | Returns 1 if the half-precision floating-point value `a' is a quiet | NaN; otherwise returns 0. @@ -233,36 +246,7 @@ floatx80 floatx80_default_inf(bool zSign, float_status= *status) =20 bool float16_is_quiet_nan(float16 a_, float_status *status) { - if (no_signaling_nans(status)) { - return float16_is_any_nan(a_); - } else { - uint16_t a =3D float16_val(a_); - if (snan_bit_is_one(status)) { - return (((a >> 9) & 0x3F) =3D=3D 0x3E) && (a & 0x1FF); - } else { - - return ((a >> 9) & 0x3F) =3D=3D 0x3F; - } - } -} - -/*------------------------------------------------------------------------= ---- -| Returns 1 if the bfloat16 value `a' is a quiet -| NaN; otherwise returns 0. -*-------------------------------------------------------------------------= ---*/ - -bool bfloat16_is_quiet_nan(bfloat16 a_, float_status *status) -{ - if (no_signaling_nans(status)) { - return bfloat16_is_any_nan(a_); - } else { - uint16_t a =3D a_; - if (snan_bit_is_one(status)) { - return (((a >> 6) & 0x1FF) =3D=3D 0x1FE) && (a & 0x3F); - } else { - return ((a >> 6) & 0x1FF) =3D=3D 0x1FF; - } - } + return float16_is_any_nan(a_) && !float16_nan_is_snan(a_, status); } =20 /*------------------------------------------------------------------------= ---- @@ -272,35 +256,51 @@ bool bfloat16_is_quiet_nan(bfloat16 a_, float_status = *status) =20 bool float16_is_signaling_nan(float16 a_, float_status *status) { - if (no_signaling_nans(status)) { - return 0; - } else { - uint16_t a =3D float16_val(a_); - if (snan_bit_is_one(status)) { - return ((a >> 9) & 0x3F) =3D=3D 0x3F; - } else { - return (((a >> 9) & 0x3F) =3D=3D 0x3E) && (a & 0x1FF); - } - } + return float16_is_any_nan(a_) && float16_nan_is_snan(a_, status); } =20 /*------------------------------------------------------------------------= ---- -| Returns 1 if the bfloat16 value `a' is a signaling -| NaN; otherwise returns 0. +| Determine if a bfloat16 NaN is signaling NaN. +*-------------------------------------------------------------------------= ---*/ + +static bool bfloat16_nan_is_snan(bfloat16 a, float_status *status) +{ + if (no_signaling_nans(status)) { + return false; + } + bool frac_msb_is_one =3D (a >> 6) & 1; + return frac_msb_is_one =3D=3D snan_bit_is_one(status); +} + +/*------------------------------------------------------------------------= ---- +| Returns 1 if the bfloat16 value `a' is a quiet NaN; otherwise returns 0. +*-------------------------------------------------------------------------= ---*/ + +bool bfloat16_is_quiet_nan(bfloat16 a_, float_status *status) +{ + return bfloat16_is_any_nan(a_) && !bfloat16_nan_is_snan(a_, status); +} + +/*------------------------------------------------------------------------= ---- +| Returns 1 if the bfloat16 value `a' is a signaling NaN; otherwise return= s 0. *-------------------------------------------------------------------------= ---*/ =20 bool bfloat16_is_signaling_nan(bfloat16 a_, float_status *status) +{ + return bfloat16_is_any_nan(a_) && bfloat16_nan_is_snan(a_, status); +} + +/*------------------------------------------------------------------------= ---- +| Determine if a float32 NaN is signaling NaN. +*-------------------------------------------------------------------------= ---*/ + +static bool float32_nan_is_snan(float32 a, float_status *status) { if (no_signaling_nans(status)) { - return 0; - } else { - uint16_t a =3D a_; - if (snan_bit_is_one(status)) { - return ((a >> 6) & 0x1FF) =3D=3D 0x1FF; - } else { - return (((a >> 6) & 0x1FF) =3D=3D 0x1FE) && (a & 0x3F); - } + return false; } + bool frac_msb_is_one =3D (a >> 22) & 1; + return frac_msb_is_one =3D=3D snan_bit_is_one(status); } =20 /*------------------------------------------------------------------------= ---- @@ -310,16 +310,7 @@ bool bfloat16_is_signaling_nan(bfloat16 a_, float_stat= us *status) =20 bool float32_is_quiet_nan(float32 a_, float_status *status) { - if (no_signaling_nans(status)) { - return float32_is_any_nan(a_); - } else { - uint32_t a =3D float32_val(a_); - if (snan_bit_is_one(status)) { - return (((a >> 22) & 0x1FF) =3D=3D 0x1FE) && (a & 0x003FFFFF); - } else { - return ((uint32_t)(a << 1) >=3D 0xFF800000); - } - } + return float32_is_any_nan(a_) && !float32_nan_is_snan(a_, status); } =20 /*------------------------------------------------------------------------= ---- @@ -328,17 +319,21 @@ bool float32_is_quiet_nan(float32 a_, float_status *s= tatus) *-------------------------------------------------------------------------= ---*/ =20 bool float32_is_signaling_nan(float32 a_, float_status *status) +{ + return float32_is_any_nan(a_) && float32_nan_is_snan(a_, status); +} + +/*------------------------------------------------------------------------= ---- +| Determine if a float64 NaN is signaling NaN. +*-------------------------------------------------------------------------= ---*/ + +static bool float64_nan_is_snan(float64 a, float_status *status) { if (no_signaling_nans(status)) { - return 0; - } else { - uint32_t a =3D float32_val(a_); - if (snan_bit_is_one(status)) { - return ((uint32_t)(a << 1) >=3D 0xFF800000); - } else { - return (((a >> 22) & 0x1FF) =3D=3D 0x1FE) && (a & 0x003FFFFF); - } + return false; } + bool frac_msb_is_one =3D (a >> 51) & 1; + return frac_msb_is_one =3D=3D snan_bit_is_one(status); } =20 /*------------------------------------------------------------------------= ---- @@ -348,17 +343,7 @@ bool float32_is_signaling_nan(float32 a_, float_status= *status) =20 bool float64_is_quiet_nan(float64 a_, float_status *status) { - if (no_signaling_nans(status)) { - return float64_is_any_nan(a_); - } else { - uint64_t a =3D float64_val(a_); - if (snan_bit_is_one(status)) { - return (((a >> 51) & 0xFFF) =3D=3D 0xFFE) - && (a & 0x0007FFFFFFFFFFFFULL); - } else { - return ((a << 1) >=3D 0xFFF0000000000000ULL); - } - } + return float64_is_any_nan(a_) && !float64_nan_is_snan(a_, status); } =20 /*------------------------------------------------------------------------= ---- @@ -368,17 +353,7 @@ bool float64_is_quiet_nan(float64 a_, float_status *st= atus) =20 bool float64_is_signaling_nan(float64 a_, float_status *status) { - if (no_signaling_nans(status)) { - return 0; - } else { - uint64_t a =3D float64_val(a_); - if (snan_bit_is_one(status)) { - return ((a << 1) >=3D 0xFFF0000000000000ULL); - } else { - return (((a >> 51) & 0xFFF) =3D=3D 0xFFE) - && (a & UINT64_C(0x0007FFFFFFFFFFFF)); - } - } + return float64_is_any_nan(a_) && float64_nan_is_snan(a_, status); } =20 /*------------------------------------------------------------------------= ---- @@ -444,6 +419,19 @@ floatx80 floatx80_silence_nan(floatx80 a, float_status= *status) return a; } =20 +/*------------------------------------------------------------------------= ---- +| Determine if a float128 NaN is signaling NaN. +*-------------------------------------------------------------------------= ---*/ + +static bool float128_nan_is_snan(float128 a, float_status *status) +{ + if (no_signaling_nans(status)) { + return false; + } + bool frac_msb_is_one =3D (a.high >> 47) & 1; + return frac_msb_is_one =3D=3D snan_bit_is_one(status); +} + /*------------------------------------------------------------------------= ---- | Returns 1 if the quadruple-precision floating-point value `a' is a quiet | NaN; otherwise returns 0. @@ -451,17 +439,7 @@ floatx80 floatx80_silence_nan(floatx80 a, float_status= *status) =20 bool float128_is_quiet_nan(float128 a, float_status *status) { - if (no_signaling_nans(status)) { - return float128_is_any_nan(a); - } else { - if (snan_bit_is_one(status)) { - return (((a.high >> 47) & 0xFFFF) =3D=3D 0xFFFE) - && (a.low || (a.high & 0x00007FFFFFFFFFFFULL)); - } else { - return ((a.high << 1) >=3D 0xFFFF000000000000ULL) - && (a.low || (a.high & 0x0000FFFFFFFFFFFFULL)); - } - } + return float128_is_any_nan(a) && !float128_nan_is_snan(a, status); } =20 /*------------------------------------------------------------------------= ---- @@ -471,15 +449,5 @@ bool float128_is_quiet_nan(float128 a, float_status *s= tatus) =20 bool float128_is_signaling_nan(float128 a, float_status *status) { - if (no_signaling_nans(status)) { - return 0; - } else { - if (snan_bit_is_one(status)) { - return ((a.high << 1) >=3D 0xFFFF000000000000ULL) - && (a.low || (a.high & 0x0000FFFFFFFFFFFFULL)); - } else { - return (((a.high >> 47) & 0xFFFF) =3D=3D 0xFFFE) - && (a.low || (a.high & UINT64_C(0x00007FFFFFFFFFFF))); - } - } + return float128_is_any_nan(a) && float128_nan_is_snan(a, status); } --=20 2.43.0 From nobody Mon Feb 9 13:51:29 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=1770290304; cv=none; d=zohomail.com; s=zohoarc; b=RNJqtWq0kfGSZ9ETgcASgGAP1qMllooU04JJ1+ca46YkmE8AbyKeNH9mNNiOhp6nTMSvKbdN2+Ow6QZT1MEYPKwNSnYKexzYJ5/RoifDK48DQ8ooYMvonq/TNiKL1eo3Seu4sCpJ9MjY5xjqsk4BWoTUvylKDsGWUQw3zdI3bLc= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1770290304; h=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=jYqIjIwuJjJ99LoW2+mJj8Co+SjC+NkMZqtAn40OcNI=; b=YE0yP3oRm2mpl2i25HPRle4xdBQdK6ZnmLC/svZjNv6Z9QrNqg4zye3FLQAk/mSzcfkLc4Rl7LDPDrpGeMoUIHSYlZI6WHiri01/41j4QzUNrD7+CXDxIRiuqxxPSQlUxxJefPIbI6JhIhT6Aa4tm0EB1o1egJZzHAnIQqdDkwE= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1770290304948996.0275829719543; Thu, 5 Feb 2026 03:18:24 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1vnxMV-00054V-Qx; Thu, 05 Feb 2026 06:17:27 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1vnxLg-0004gk-AW for qemu-devel@nongnu.org; Thu, 05 Feb 2026 06:16:43 -0500 Received: from mail-pg1-x542.google.com ([2607:f8b0:4864:20::542]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1vnxLe-0003nB-GT for qemu-devel@nongnu.org; Thu, 05 Feb 2026 06:16:36 -0500 Received: by mail-pg1-x542.google.com with SMTP id 41be03b00d2f7-c698873a1deso376372a12.0 for ; Thu, 05 Feb 2026 03:16:34 -0800 (PST) Received: from stoup.. ([2401:d002:dc0f:2100:7515:513c:b646:18b8]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-2a933851685sm51088435ad.13.2026.02.05.03.16.30 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 05 Feb 2026 03:16:32 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1770290193; x=1770894993; 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=jYqIjIwuJjJ99LoW2+mJj8Co+SjC+NkMZqtAn40OcNI=; b=pDg3QuPCwPYzT4t7M7zJtIUED2dH4lbtmtPwXY4zYZyhmXneaYz02umqtdJr1bgPjH KV/Fv2DSIUhx3d3AmoXj1sTMvrjUDy25t9zSgTsTSwLIYJnNnmaOhsdGFZunpT9TvMUN +ZREVW6eM0AqpGj/HTHxXeN4UFI4hkWfdvadDRkcSAphSEopAaRHGuZSlxHZ2pzDJp7v tGxK1UGwMe5fVg0jRZ9L2OSMmqDnhOWctqopCM4uA6ofMyBQhi5wA8mXucF76MQBWTQZ ADUf0pb+5xRg0bDPPN9zeXDALl49hrCHjWLxyfr8B234EhmGkOfsSNmrb7bFGoOta3x7 AOQA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1770290193; x=1770894993; 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=jYqIjIwuJjJ99LoW2+mJj8Co+SjC+NkMZqtAn40OcNI=; b=hgZK9DNECBE75wnQgnEDeUpm+NyXvBBZ2jOvv4QRo4ObOgt9GscQygYhlnEZ/8norV SMW7iUT/VbIZw6IguZ9ZYN/y0CvkC6PIXHLtupPB/6l+eZ6L1tdLkw+ITXmTU9KuRmAn Uw5CMnf7IRcFjb9HJD5KZlgQVgkH8uKPKasg+QqlPsovQcbJbxhiih+qm9jjqHGsUZDt E0/6WJCu5aJRceIsiHx/dp2NsYaEhXaJiDWNT0Ycwz17qVxZwODkgv5rTlzaSn8Kkdhy EZF25UgUOo5VrY9pboI71yGXuyrafUfLMSfU4qLmjCs1E3U0tk0zwW5snONWFGzoc2Tx jXgg== X-Gm-Message-State: AOJu0YzBVM1Cb/qjzo3zqhetWNqI//4XI6T71X48DhFiHHscTh6YME4M iSNwEo7cqzQHvjdWuK7HgxkaO8WK9bHSdzQumqnUjz3Apvw7PeSu9vV8wS7Gn7jEEVKsc2UWuA6 R9hJsvhVLHABA X-Gm-Gg: AZuq6aJjWyLPC6UJBTNXKGsDcBAgHefv3Ixyt27eGyhPi9ASAK9a6DCJoGDj2gosgPE k0kJ0/lG4PXpNmToRmtGN2NByA6WeJfhi3Zc/h++8XeArT7DndIdCxOX12Xgx+lNzMgW3X8pxCv NHoU4KVBC2o551rid41JuacSNJ2BlvnNe8LsYM7uXjLyWUr+/7eixXzyb1yAwb3QKNzf5W7k/Y2 M0M7COgrcoSq2nyHNbeZc2fceCh7EUsUJNKJw15A32BcCZr8a/onGZWfnQZvKCPoeLFVvO+kHlv G2K4mLh6yAdYgfhpf4u4q6KKarCdZYarGdBN9OelCOMDsevuQq2TDz4sO4W7MSTmfoYMxiv7feV +SpOCNOWtrPd+P9BlcojSY5/JhkPQCobGfGWjE/nmoCkLa85+qlrqFjEmmkzVtytO/s0CROJhDB 4BgiA54FFcMgKaq3GeZvGg X-Received: by 2002:a17:903:f85:b0:295:592f:94a3 with SMTP id d9443c01a7336-2a933fdd4edmr54397625ad.48.1770290192880; Thu, 05 Feb 2026 03:16:32 -0800 (PST) From: Richard Henderson To: qemu-devel@nongnu.org Cc: max.chou@sifive.com, Chao Liu Subject: [PATCH v4 2/9] fpu/softfloat: Refactor floatx80 format NaN classification to share code Date: Thu, 5 Feb 2026 21:16:15 +1000 Message-ID: <20260205111622.461497-3-richard.henderson@linaro.org> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260205111622.461497-1-richard.henderson@linaro.org> References: <20260205111622.461497-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=lists.gnu.org; Received-SPF: pass client-ip=2607:f8b0:4864:20::542; envelope-from=richard.henderson@linaro.org; helo=mail-pg1-x542.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: 1770290307302154100 Content-Type: text/plain; charset="utf-8" From: Max Chou The floatx80_is_[quiet|signaling]_nan functions contain duplicated logic that should be shared. This commit introduces floatx80_nan_is_snan helper function that determine if a NaN is signaling and change the return type of floatx80_is_[signaling|quiet]_nan to bool. Suggested-by: Richard Henderson Signed-off-by: Max Chou Reviewed-by: Richard Henderson Reviewed-by: Chao Liu Signed-off-by: Richard Henderson Message-ID: <20260204051756.667397-4-max.chou@sifive.com> --- include/fpu/softfloat.h | 4 +-- fpu/softfloat-specialize.c.inc | 53 ++++++++++++---------------------- 2 files changed, 21 insertions(+), 36 deletions(-) diff --git a/include/fpu/softfloat.h b/include/fpu/softfloat.h index c18ab2cb60..ac6a392375 100644 --- a/include/fpu/softfloat.h +++ b/include/fpu/softfloat.h @@ -978,8 +978,8 @@ floatx80 floatx80_rem(floatx80, floatx80, float_status = *status); floatx80 floatx80_sqrt(floatx80, float_status *status); FloatRelation floatx80_compare(floatx80, floatx80, float_status *status); FloatRelation floatx80_compare_quiet(floatx80, floatx80, float_status *sta= tus); -int floatx80_is_quiet_nan(floatx80, float_status *status); -int floatx80_is_signaling_nan(floatx80, float_status *status); +bool floatx80_is_quiet_nan(floatx80, float_status *status); +bool floatx80_is_signaling_nan(floatx80, float_status *status); floatx80 floatx80_silence_nan(floatx80, float_status *status); floatx80 floatx80_scalbn(floatx80, int, float_status *status); =20 diff --git a/fpu/softfloat-specialize.c.inc b/fpu/softfloat-specialize.c.inc index 7d2515c1fa..9ed968c79b 100644 --- a/fpu/softfloat-specialize.c.inc +++ b/fpu/softfloat-specialize.c.inc @@ -357,53 +357,38 @@ bool float64_is_signaling_nan(float64 a_, float_statu= s *status) } =20 /*------------------------------------------------------------------------= ---- -| Returns 1 if the extended double-precision floating-point value `a' is a -| quiet NaN; otherwise returns 0. This slightly differs from the same -| function for other types as floatx80 has an explicit bit. +| Determine if a floatx80 NaN is signaling NaN. +| The MSB of frac differs from the same function for other types as floatx= 80 +| has an explicit bit. *-------------------------------------------------------------------------= ---*/ =20 -int floatx80_is_quiet_nan(floatx80 a, float_status *status) +static bool floatx80_nan_is_snan(floatx80 a, float_status *status) { if (no_signaling_nans(status)) { - return floatx80_is_any_nan(a); - } else { - if (snan_bit_is_one(status)) { - uint64_t aLow; - - aLow =3D a.low & ~0x4000000000000000ULL; - return ((a.high & 0x7FFF) =3D=3D 0x7FFF) - && (aLow << 1) - && (a.low =3D=3D aLow); - } else { - return ((a.high & 0x7FFF) =3D=3D 0x7FFF) - && (UINT64_C(0x8000000000000000) <=3D ((uint64_t)(a.low <<= 1))); - } + return false; } + bool frac_msb_is_one =3D (a.low >> 62) & 1; + return frac_msb_is_one =3D=3D snan_bit_is_one(status); } =20 /*------------------------------------------------------------------------= ---- | Returns 1 if the extended double-precision floating-point value `a' is a -| signaling NaN; otherwise returns 0. This slightly differs from the same -| function for other types as floatx80 has an explicit bit. +| quiet NaN; otherwise returns 0. *-------------------------------------------------------------------------= ---*/ =20 -int floatx80_is_signaling_nan(floatx80 a, float_status *status) +bool floatx80_is_quiet_nan(floatx80 a, float_status *status) { - if (no_signaling_nans(status)) { - return 0; - } else { - if (snan_bit_is_one(status)) { - return ((a.high & 0x7FFF) =3D=3D 0x7FFF) - && ((a.low << 1) >=3D 0x8000000000000000ULL); - } else { - uint64_t aLow; + return floatx80_is_any_nan(a) && !floatx80_nan_is_snan(a, status); +} =20 - aLow =3D a.low & ~UINT64_C(0x4000000000000000); - return ((a.high & 0x7FFF) =3D=3D 0x7FFF) - && (uint64_t)(aLow << 1) - && (a.low =3D=3D aLow); - } - } +/*------------------------------------------------------------------------= ---- +| Returns 1 if the extended double-precision floating-point value `a' is a +| signaling NaN; otherwise returns 0. +*-------------------------------------------------------------------------= ---*/ + +bool floatx80_is_signaling_nan(floatx80 a, float_status *status) +{ + return floatx80_is_any_nan(a) && floatx80_nan_is_snan(a, status); } =20 /*------------------------------------------------------------------------= ---- --=20 2.43.0 From nobody Mon Feb 9 13:51:29 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=1770290233; cv=none; d=zohomail.com; s=zohoarc; b=VBoA+OrT+l5gTwfcerjFYVUQ9Mt80wYePOu0dJECtFF2CYs8f4TA1p3zDuHiHmOH46rZ6Kkf0Ur+/zbJBhE3AS4xGKJ6c+AfW6euD2KhW37aVD3Npsn83yxZD2mg5RrpmO902EpkkcdhhtOfRArcSDwwZZP1igkzqSALSN8qE30= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1770290233; h=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=7P4L6KRGUfnJuZGklnenZefdnYuPN4EZ2NjRTD5rCHQ=; b=SD4ZWFjRBp4zp6bzYRht/k3T3BbdaNVdO4yhmTgGoV9/oeuqa1y4EDnp7Qu/VuUvcy8uEEGt4CHUl/ou0WtdVQMxxFK6QecJDX4gqGQvcdPP9K0457A+hQM7xM7lO7rSNpG4Z4kL6fahXZQObMTNY/6mC8Qtc2NNaiU3HYrMbSE= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1770290233794337.7579411133303; Thu, 5 Feb 2026 03:17:13 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1vnxLs-0004mS-24; Thu, 05 Feb 2026 06:16:49 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1vnxLl-0004hb-H1 for qemu-devel@nongnu.org; Thu, 05 Feb 2026 06:16:43 -0500 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 1vnxLh-0003nU-VP for qemu-devel@nongnu.org; Thu, 05 Feb 2026 06:16:40 -0500 Received: by mail-pg1-x52e.google.com with SMTP id 41be03b00d2f7-c6788f3db37so262631a12.1 for ; Thu, 05 Feb 2026 03:16:36 -0800 (PST) Received: from stoup.. ([2401:d002:dc0f:2100:7515:513c:b646:18b8]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-2a933851685sm51088435ad.13.2026.02.05.03.16.33 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 05 Feb 2026 03:16:35 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1770290196; x=1770894996; 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=7P4L6KRGUfnJuZGklnenZefdnYuPN4EZ2NjRTD5rCHQ=; b=i3Lk4qns2IbeWdFNuZ8f9TTR1lDatU/xAHGiPk1fXWEd52AzdXbZKDxiNAEXGsmUAw t6nv/G4/4g6FwYwEyLqhNockHyyAw1NwrM+XwS6yv/LHZi//cTgAyQS6VEN2eZ3oPPlF Aibmg13gU0GvcSyj46MfEL8wlBkCQ7tSWP+tETuNseVK88mplkwPYOSoQO+nxYO6kSJN ZJuqcbH+BKMVDtRdz2TJN5Yo50MaCmhju7ZtsJsgLD8yFDDwzm9oawJjt2nXxrMobcr3 KqIaOqoAjBE0H2l28GoRaVB5eY70C7iIKZPWxHXqav5phuILJKJK58lIkdVJtIwpnlvW OsHg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1770290196; x=1770894996; 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=7P4L6KRGUfnJuZGklnenZefdnYuPN4EZ2NjRTD5rCHQ=; b=sZH5kJ1y43JMcFhrlYZx7v3HPxtGNS/KmPQovP8XpSclNNzwWE6BqxBsgjrW3/8Ym0 zt1xp4u++UoY//PyhpDdgQ3LIjM3xLRc/jPz1eKLuRgmqkAJDyGVsRNDCdN+zkFcvw9U NaaVlC+cskpm9yB+iN9AdmDgKckKP6T9erssbBlYRQ2jNN0IzQAvYjg3CaajCIGFf0zV DRiLrlAVmFHhJP9acLqqNBsvRNAptI3GtH3qKUqyD60+rKaOSG0f6GEq74YwFqo13MgT 3BQZ8juYF+xGY/v8J/qQOkstJRGaMP481muUlSyWggPtfKkyDncTD3o91sAWfUc92kci Lmkw== X-Gm-Message-State: AOJu0YxAqn4SoxmKP8i1kcdUBdP5fgBzVKpzayGcqgJmaoj404cSfdh4 MQW3YKlOnUx9tnvFf3vmTaQcrpBxD52MJhITHi2DfESKEw/GKr25WktGVwzlB/RATr7XuUeaibC qiu5fk9TGtQ== X-Gm-Gg: AZuq6aJZ1MMDfxlEFE7a7Rr8QRIMUcF5LChWw6rhUJBsSsQiZHlQwP0z/9HFE6DuIgI CfDmXNndCBVlFuOOq/GBQBb40fGyU2bggJKT0OxVb2QfTxdL28pxGJWuY1fx9DeZ0oJJ6NOuFnZ v9v1jTtn24/d+bj2HfI4Br+zVb7yLubtcDhMVYsBMW4XD7hFpZ+j5RrkurL09mXDRwistU7inc5 PlODYHfT1CJIde9Rpp6TVyCK6VYiCQQJWJ2vReCCJ8sL+v8DUcvMsA/CDD/MI+ra8Hzf4RZ7ll/ hfO9SwoolCJqazFJHBf7EY+MBc/9ioj7Laoam6oYZPgNrZSxVidy6my2/bg7+7AGR+PSDQbl7o1 3BVD+WQuyTG2nw8zgmltkEfvOp10wWIjHOnh10YWv7Ek+yL/gIN7PI7ufaWYFO4smJ70sbGEtaj JgiJvlu26q8HgN/H295V1bykmSTtyf3q0= X-Received: by 2002:a17:903:3d05:b0:2a9:484c:ff21 with SMTP id d9443c01a7336-2a9484d049amr7647235ad.25.1770290195535; Thu, 05 Feb 2026 03:16:35 -0800 (PST) From: Richard Henderson To: qemu-devel@nongnu.org Cc: max.chou@sifive.com, Chao Liu Subject: [PATCH v4 3/9] target/i386: Fix pseudo-NaN handling in FPATAN/FYL2XP1/FYL2X helpers Date: Thu, 5 Feb 2026 21:16:16 +1000 Message-ID: <20260205111622.461497-4-richard.henderson@linaro.org> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260205111622.461497-1-richard.henderson@linaro.org> References: <20260205111622.461497-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=lists.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: 1770290236177154100 Content-Type: text/plain; charset="utf-8" From: Max Chou According to Intel's x87 FPU specification (Table 8-10, Vol. 1), arithmetic operations on operands in unsupported formats (including pseudo-NaNs) must return the QNaN floating-point indefinite value. The helper functions for FPATAN, FYL2XP1, and FYL2X incorrectly check for signaling NaN before checking for invalid encodings. This causes pseudo-NaNs to be treated as valid signaling NaNs and silenced, rather than being rejected as unsupported formats. Reorder the checks to test floatx80_invalid_encoding before floatx80_is_signaling_nan, matching the correct behavior already implemented in helper_fscale. Signed-off-by: Max Chou Reviewed-by: Richard Henderson Reviewed-by: Chao Liu Signed-off-by: Richard Henderson Message-ID: <20260204051756.667397-5-max.chou@sifive.com> --- target/i386/tcg/fpu_helper.c | 30 +++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/target/i386/tcg/fpu_helper.c b/target/i386/tcg/fpu_helper.c index b3b23823fd..37c83ded38 100644 --- a/target/i386/tcg/fpu_helper.c +++ b/target/i386/tcg/fpu_helper.c @@ -1377,16 +1377,16 @@ void helper_fpatan(CPUX86State *env) int32_t arg1_exp =3D extractFloatx80Exp(ST1); bool arg1_sign =3D extractFloatx80Sign(ST1); =20 - if (floatx80_is_signaling_nan(ST0, &env->fp_status)) { + if (floatx80_invalid_encoding(ST0, &env->fp_status) || + floatx80_invalid_encoding(ST1, &env->fp_status)) { + float_raise(float_flag_invalid, &env->fp_status); + ST1 =3D floatx80_default_nan(&env->fp_status); + } else if (floatx80_is_signaling_nan(ST0, &env->fp_status)) { float_raise(float_flag_invalid, &env->fp_status); ST1 =3D floatx80_silence_nan(ST0, &env->fp_status); } else if (floatx80_is_signaling_nan(ST1, &env->fp_status)) { float_raise(float_flag_invalid, &env->fp_status); ST1 =3D floatx80_silence_nan(ST1, &env->fp_status); - } else if (floatx80_invalid_encoding(ST0, &env->fp_status) || - floatx80_invalid_encoding(ST1, &env->fp_status)) { - float_raise(float_flag_invalid, &env->fp_status); - ST1 =3D floatx80_default_nan(&env->fp_status); } else if (floatx80_is_any_nan(ST0)) { ST1 =3D ST0; } else if (floatx80_is_any_nan(ST1)) { @@ -2061,16 +2061,16 @@ void helper_fyl2xp1(CPUX86State *env) int32_t arg1_exp =3D extractFloatx80Exp(ST1); bool arg1_sign =3D extractFloatx80Sign(ST1); =20 - if (floatx80_is_signaling_nan(ST0, &env->fp_status)) { + if (floatx80_invalid_encoding(ST0, &env->fp_status) || + floatx80_invalid_encoding(ST1, &env->fp_status)) { + float_raise(float_flag_invalid, &env->fp_status); + ST1 =3D floatx80_default_nan(&env->fp_status); + } else if (floatx80_is_signaling_nan(ST0, &env->fp_status)) { float_raise(float_flag_invalid, &env->fp_status); ST1 =3D floatx80_silence_nan(ST0, &env->fp_status); } else if (floatx80_is_signaling_nan(ST1, &env->fp_status)) { float_raise(float_flag_invalid, &env->fp_status); ST1 =3D floatx80_silence_nan(ST1, &env->fp_status); - } else if (floatx80_invalid_encoding(ST0, &env->fp_status) || - floatx80_invalid_encoding(ST1, &env->fp_status)) { - float_raise(float_flag_invalid, &env->fp_status); - ST1 =3D floatx80_default_nan(&env->fp_status); } else if (floatx80_is_any_nan(ST0)) { ST1 =3D ST0; } else if (floatx80_is_any_nan(ST1)) { @@ -2159,16 +2159,16 @@ void helper_fyl2x(CPUX86State *env) int32_t arg1_exp =3D extractFloatx80Exp(ST1); bool arg1_sign =3D extractFloatx80Sign(ST1); =20 - if (floatx80_is_signaling_nan(ST0, &env->fp_status)) { + if (floatx80_invalid_encoding(ST0, &env->fp_status) || + floatx80_invalid_encoding(ST1, &env->fp_status)) { + float_raise(float_flag_invalid, &env->fp_status); + ST1 =3D floatx80_default_nan(&env->fp_status); + } else if (floatx80_is_signaling_nan(ST0, &env->fp_status)) { float_raise(float_flag_invalid, &env->fp_status); ST1 =3D floatx80_silence_nan(ST0, &env->fp_status); } else if (floatx80_is_signaling_nan(ST1, &env->fp_status)) { float_raise(float_flag_invalid, &env->fp_status); ST1 =3D floatx80_silence_nan(ST1, &env->fp_status); - } else if (floatx80_invalid_encoding(ST0, &env->fp_status) || - floatx80_invalid_encoding(ST1, &env->fp_status)) { - float_raise(float_flag_invalid, &env->fp_status); - ST1 =3D floatx80_default_nan(&env->fp_status); } else if (floatx80_is_any_nan(ST0)) { ST1 =3D ST0; } else if (floatx80_is_any_nan(ST1)) { --=20 2.43.0 From nobody Mon Feb 9 13:51:29 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=1770290263; cv=none; d=zohomail.com; s=zohoarc; b=dBou/1wYWFsEe685+KCWKu9/wNM789p1h2pFnubavB8603HoaWdlu4grHHx2/TA8WZVfqCvTiwicKA44v6VaCh29nt0PmEGnDtMF4hxtD/g2DQFPjmfuVh0AWsr5/FwvywuHYaVzEKJy4cXDwC5UTAI3Kr1kYobN1DlX3W8nlvY= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1770290263; h=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=gMibsSFmr8930GLdEf6auOmzhfpvG0IZCKbbW9pih4Q=; b=a+sBRoAJMMYqd186WEmzfizy+lwTcVfLoLzNcBUy8XO3RhUdzLb9XhUCAcGyvT0I/slf4MAcKBYPqzAR5sTH9lcf1e2fjf1G5oSKZLHhiPgVjlCvPeAAnEc5xPD4P7zeS+VZwmYzS+y2wqGixWXMc23xhklnKZ42VTa2MmzQATI= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1770290263315150.74376539467642; Thu, 5 Feb 2026 03:17:43 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1vnxMV-00050D-4h; Thu, 05 Feb 2026 06:17:27 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1vnxLp-0004lU-6x for qemu-devel@nongnu.org; Thu, 05 Feb 2026 06:16:45 -0500 Received: from mail-pl1-x62d.google.com ([2607:f8b0:4864:20::62d]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1vnxLl-0003ng-84 for qemu-devel@nongnu.org; Thu, 05 Feb 2026 06:16:42 -0500 Received: by mail-pl1-x62d.google.com with SMTP id d9443c01a7336-2a7a9b8ed69so9200615ad.2 for ; Thu, 05 Feb 2026 03:16:39 -0800 (PST) Received: from stoup.. ([2401:d002:dc0f:2100:7515:513c:b646:18b8]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-2a933851685sm51088435ad.13.2026.02.05.03.16.36 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 05 Feb 2026 03:16:37 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1770290198; x=1770894998; 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=gMibsSFmr8930GLdEf6auOmzhfpvG0IZCKbbW9pih4Q=; b=s9aw9fbdMircau///uh6Kpg1Z8oK+Pz56gahtP0B1GRUU47sivLL2oa08T23GyNbE0 OCR572u64Q6MPLEHfxaw/1sBsbdu691pJcFN2mvYJHwB5/v5dLh+kTqXVVaMvog/iuHA ICzKVQFimKyJSjqVYgGh4INiMB635eC7tFTqCOorNnIcKqqfdeR6WFRFqywvM2JMYTN8 DRXYGjQaUgNLMxMrQBFCwr3u6GISZrYOfX8wmq2D+tRPqRatdv9hQIQlWNtqPCz7IjeE 2HrmZ0Km/NJkzLPWGHZcNSPBCpfjVn1kTECvu6BWEr/T0MB8iA6nspXtQjy8ta5Ooef9 DFzw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1770290198; x=1770894998; 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=gMibsSFmr8930GLdEf6auOmzhfpvG0IZCKbbW9pih4Q=; b=wQjMHWb3pOQjdDnTvIxviI1bai9xkXGyu6Y1tGrlqFiys+CFZ9VPGqEQPhccu9XnRj HoR1o3AHvllF72Y8Q9+k1JWdCPA2VHcux4RgW/7UAGUcFXiCwCKS9VZ/PDqF00SgWV6Q 2KRQ5hjO/7/9ih1Dsnu/kjJupoednZRPk/3719D4L8zk7qN1/GIB/Ho7N7sn2jQuC4hH Rd4feF7Td1zidl6wYhihIhYb6DQH9j5mygfuQt+0XAPDpIY9oPUj2xtdRnID1LcbLsFS HJ5G2ArLjv5xZPjgs6ll9nLc+YDodO9AkoLisuNhaNWY3w1o12645haqwPcNOFZelnVt NfqQ== X-Gm-Message-State: AOJu0Yy3RHJAeBSvK5rnjaP07HWA49dU44E7yddOyxctac2TPs25eMuU dlviqn/5d0YUHDAjOw4yFV/+NxHkM8w6fv1CPf/Np8Nt6pCkQ35I2h3glAmZ3Rg8Nu+80PZglol fnJOplkk5xw== X-Gm-Gg: AZuq6aJzhfYkXljMHm2b/f/fHCfuCSicQAPB31q9hdN7svB0JdHMJ09HIfj5JwVscss Qp0uS0WCvE3Bsb7Sjr6Wa7CGx4iO2FZlG29J9FvMzP0ykhP0yDH7BW3how0SQlj9OYwnH+hpFjL 5QcM0XH7JwuyQ9j+YeC5KO/EFbluiC3vg4oV5M/hLkLeOXaZGBLaV1DlWcS7vUzyOkiNvFQoa2/ 8f2yiN2o7hMtjf/wbd/mkmsDSTTcS7Xd9fvP0/l9fyV5FVNiFAkFVazZw68jsDgQiB6vGLnYMdD X6z1duRF6OiP5FfpdYTp1jPrswhm+5w5uBHKUuFj9w+XeWxEESkSfLE9mifxfd75MwYHBsYHmsA Cr07utmMD9qmNq04LD5n0lnFWECwqzAbjvztwqQoWxp8NhvpgPjxYmaOGRJELz3Qjo/bCbSy+2e r4BgOOMkEZrhtfOnPqFwBB X-Received: by 2002:a17:902:cecc:b0:2a1:3cd9:a737 with SMTP id d9443c01a7336-2a933eaa8d3mr64698475ad.36.1770290197820; Thu, 05 Feb 2026 03:16:37 -0800 (PST) From: Richard Henderson To: qemu-devel@nongnu.org Cc: max.chou@sifive.com Subject: [PATCH v4 4/9] fpu: Introduce FloatFmtExpMaxKind Date: Thu, 5 Feb 2026 21:16:17 +1000 Message-ID: <20260205111622.461497-5-richard.henderson@linaro.org> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260205111622.461497-1-richard.henderson@linaro.org> References: <20260205111622.461497-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=lists.gnu.org; Received-SPF: pass client-ip=2607:f8b0:4864:20::62d; envelope-from=richard.henderson@linaro.org; helo=mail-pl1-x62d.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: 1770290264574154100 Content-Type: text/plain; charset="utf-8" Generalize arm_althp to indicate how exp=3D=3Dmax should be handled for the format. Reorganize canonicalize and uncanon_normal to use a switch statement, allowing more cases to be added trivially. Signed-off-by: Richard Henderson --- fpu/softfloat.c | 17 ++++++-- fpu/softfloat-parts.c.inc | 92 ++++++++++++++++++++++++--------------- 2 files changed, 69 insertions(+), 40 deletions(-) diff --git a/fpu/softfloat.c b/fpu/softfloat.c index 8094358c2e..18098c4cdd 100644 --- a/fpu/softfloat.c +++ b/fpu/softfloat.c @@ -522,7 +522,16 @@ typedef struct { #define DECOMPOSED_BINARY_POINT 63 #define DECOMPOSED_IMPLICIT_BIT (1ull << DECOMPOSED_BINARY_POINT) =20 -/* Structure holding all of the relevant parameters for a format. +/* Format-specific handling of exp =3D=3D exp_max */ +typedef enum __attribute__((__packed__)) { + /* exp=3D=3Dmax, frac=3D=3D0 ? infinity : nan; this is ieee standard. = */ + float_expmax_ieee, + /* exp=3D=3Dmax is a normal number; no infinity or nan representation.= */ + float_expmax_normal, +} FloatFmtExpMaxKind; + +/* + * Structure holding all of the relevant parameters for a format. * exp_size: the size of the exponent field * exp_bias: the offset applied to the exponent field * exp_max: the maximum normalised exponent @@ -531,7 +540,7 @@ typedef struct { * The following are computed based the size of fraction * round_mask: bits below lsb which must be rounded * The following optional modifiers are available: - * arm_althp: handle ARM Alternative Half Precision + * exp_max_kind: affects how exp =3D=3D exp_max is interpreted * has_explicit_bit: has an explicit integer bit; this affects whether * the float_status floatx80_behaviour handling applies */ @@ -542,7 +551,7 @@ typedef struct { int exp_max; int frac_size; int frac_shift; - bool arm_althp; + FloatFmtExpMaxKind exp_max_kind; bool has_explicit_bit; uint64_t round_mask; } FloatFmt; @@ -566,7 +575,7 @@ static const FloatFmt float16_params =3D { =20 static const FloatFmt float16_params_ahp =3D { FLOAT_PARAMS(5, 10), - .arm_althp =3D true + .exp_max_kind =3D float_expmax_normal, }; =20 static const FloatFmt bfloat16_params =3D { diff --git a/fpu/softfloat-parts.c.inc b/fpu/softfloat-parts.c.inc index 5e0438fc0b..d3c9c7a913 100644 --- a/fpu/softfloat-parts.c.inc +++ b/fpu/softfloat-parts.c.inc @@ -227,18 +227,30 @@ static void partsN(canonicalize)(FloatPartsN *p, floa= t_status *status, p->exp =3D fmt->frac_shift - fmt->exp_bias - shift + !has_pseudo_denormals; } - } else if (likely(p->exp < fmt->exp_max) || fmt->arm_althp) { - p->cls =3D float_class_normal; - p->exp -=3D fmt->exp_bias; - frac_shl(p, fmt->frac_shift); - p->frac_hi |=3D DECOMPOSED_IMPLICIT_BIT; - } else if (likely(frac_eqz(p))) { - p->cls =3D float_class_inf; - } else { - frac_shl(p, fmt->frac_shift); - p->cls =3D (parts_is_snan_frac(p->frac_hi, status) - ? float_class_snan : float_class_qnan); + return; } + if (unlikely(p->exp =3D=3D fmt->exp_max)) { + switch (fmt->exp_max_kind) { + case float_expmax_ieee: + if (likely(frac_eqz(p))) { + p->cls =3D float_class_inf; + } else { + frac_shl(p, fmt->frac_shift); + p->cls =3D (parts_is_snan_frac(p->frac_hi, status) + ? float_class_snan : float_class_qnan); + } + return; + case float_expmax_normal: + break; + default: + g_assert_not_reached(); + } + } + + p->cls =3D float_class_normal; + p->exp -=3D fmt->exp_bias; + frac_shl(p, fmt->frac_shift); + p->frac_hi |=3D DECOMPOSED_IMPLICIT_BIT; } =20 /* @@ -314,29 +326,37 @@ static void partsN(uncanon_normal)(FloatPartsN *p, fl= oat_status *s, p->frac_lo &=3D ~round_mask; } =20 - if (fmt->arm_althp) { - /* ARM Alt HP eschews Inf and NaN for a wider exponent. */ - if (unlikely(exp > exp_max)) { - /* Overflow. Return the maximum normal. */ - flags =3D float_flag_invalid; - exp =3D exp_max; - frac_allones(p); - p->frac_lo &=3D ~round_mask; - } - } else if (unlikely(exp >=3D exp_max)) { - flags |=3D float_flag_overflow; - if (s->rebias_overflow) { - exp -=3D fmt->exp_re_bias; - } else if (overflow_norm) { - flags |=3D float_flag_inexact; - exp =3D exp_max - 1; - frac_allones(p); - p->frac_lo &=3D ~round_mask; - } else { - flags |=3D float_flag_inexact; - p->cls =3D float_class_inf; - exp =3D exp_max; - frac_clear(p); + if (unlikely(exp >=3D exp_max)) { + switch (fmt->exp_max_kind) { + case float_expmax_ieee: + flags |=3D float_flag_overflow; + if (s->rebias_overflow) { + exp -=3D fmt->exp_re_bias; + } else if (overflow_norm) { + flags |=3D float_flag_inexact; + exp =3D exp_max - 1; + frac_allones(p); + p->frac_lo &=3D ~round_mask; + } else { + flags |=3D float_flag_inexact; + p->cls =3D float_class_inf; + exp =3D exp_max; + frac_clear(p); + } + break; + + case float_expmax_normal: + if (unlikely(exp > exp_max)) { + /* Overflow. Return the maximum normal. */ + flags =3D float_flag_invalid; + exp =3D exp_max; + frac_allones(p); + p->frac_lo &=3D ~round_mask; + } + break; + + default: + g_assert_not_reached(); } } frac_shr(p, frac_shift); @@ -434,13 +454,13 @@ static void partsN(uncanon)(FloatPartsN *p, float_sta= tus *s, frac_clear(p); return; case float_class_inf: - g_assert(!fmt->arm_althp); + assert(fmt->exp_max_kind =3D=3D float_expmax_ieee); p->exp =3D fmt->exp_max; frac_clear(p); return; case float_class_qnan: case float_class_snan: - g_assert(!fmt->arm_althp); + assert(fmt->exp_max_kind !=3D float_expmax_normal); p->exp =3D fmt->exp_max; frac_shr(p, fmt->frac_shift); return; --=20 2.43.0 From nobody Mon Feb 9 13:51:29 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=1770290256; cv=none; d=zohomail.com; s=zohoarc; b=dwZejCbTrfmh2jh3Y7T7RgpCx+BvXrGIAhWnONyz2qAq6hLaDvBOZFpKqnZUWU6LqpDt8oaaCFHSV37XhafJ802V8eSYoJXXD0q38cFwHurITaeheFlNMYTh/c/pAc58FlZeEqillz4hpE1/sp4kI1nr6KaC+cjrCwGnw18AFUw= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1770290256; h=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=ElQpzIZEQeDmNN3cMImRewZNjsVx9FWnqqHOtfmVIkA=; b=ZqPiilV4evVvgSLz9cdhopsxt+xWIDhMuQpw3dD1qsMyDqrCLqE+X5fpqgHSoHYFzSYd0QjRJ8cy7inWLtJA9ctjPFTu4PgHGPIGkjrxRIw386DdvNXgUfKOvLSL9ENmcwjsPQP3dtMXIryTlBr89B+a7Erbr3Gx0hTs5bQVq3c= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1770290256623981.7828258582326; Thu, 5 Feb 2026 03:17:36 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1vnxMO-0004vX-6V; Thu, 05 Feb 2026 06:17:22 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1vnxLp-0004lT-6c for qemu-devel@nongnu.org; Thu, 05 Feb 2026 06:16:45 -0500 Received: from mail-pl1-x633.google.com ([2607:f8b0:4864:20::633]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1vnxLl-0003nw-FW for qemu-devel@nongnu.org; Thu, 05 Feb 2026 06:16:42 -0500 Received: by mail-pl1-x633.google.com with SMTP id d9443c01a7336-2a743050256so6078125ad.3 for ; Thu, 05 Feb 2026 03:16:41 -0800 (PST) Received: from stoup.. ([2401:d002:dc0f:2100:7515:513c:b646:18b8]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-2a933851685sm51088435ad.13.2026.02.05.03.16.38 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 05 Feb 2026 03:16:39 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1770290200; x=1770895000; 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=ElQpzIZEQeDmNN3cMImRewZNjsVx9FWnqqHOtfmVIkA=; b=WI7mEBTNSVD86gwAO6P/T5dZgK+NEiXBS0GuJJcEvYgHHjWN+2Xh8QwsfxVM7QIySI x2/epRp/y2U/lyuk7udQvB7a2eXys4eqneIDgK93U3s+SC7PpwOa2shUctf0h697x/1j 8n8/UTkMsKdGGkOUvftdjaAfCvEBp6Qs86QH1qyiuT8wF1Kgxdd3ZwP3T6ZmBNtmEKYx m0qb/VLLWEnDxAYSXTOFxflbT4Ly+OUxxgpLN/6BVBVO0F9zRKc622ZXCsY7SlkOQhbz 4yiYQ1CgejdlQ0lRaV60EeZjD3dKUEEmfx6XQkUrdsYmy8MXka9EGXcU0sfChzzTozTw vYYQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1770290200; x=1770895000; 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=ElQpzIZEQeDmNN3cMImRewZNjsVx9FWnqqHOtfmVIkA=; b=Ym948bGBNFHB/7xHFhIA0B8DjOi13JVbfMatiE0Q9rc7WxdOgkfJFExYfmTv3DtOr+ 38bct7snFiBzR/GG9wkl1EGnSZFlHBYiJERP/+ihjyUJDcnx3NLCd6EF02kU9I74c7Md QVnjrtzNKhkoPvNL8DnqsdYqiUvgSd+3ftn2c8uszkW54RsU4wbcG/A9yn9OelJ+wPAH Wvl5AyXNjw2SoSlVXAmeSbxHO+Stba09gFXnx1xWBKGtC9bqJOFEIdtF3jk4hkR7Fk7d iBg9eiu9J/UrL31hhJKb6vdINBN3hATGTPjyrG+YghW1GzqfxR95MlB4MSJUr9A8P8Ih ph/A== X-Gm-Message-State: AOJu0YyD+ufik/sx9KQv1VuIKlDeZU6WzZpWlErscwwb9jAd4mn64kXQ jItfHjtJJsvIcDCYM5JLkXa5caVEX7JtMlQz4SUcAL5hJnw+YcBxHLoTK4eP5G9qpwZwn6dOMyB 3+weuGqJ6eg== X-Gm-Gg: AZuq6aJ6CTCimtWWWAAfb9vax/ewpQa832M8Gc03yp8yIQB9RvG5z8OOfnvUyeg9fQk ucClY26EVmOhUAtjiBHZ6yAsnzZxL5GMaHAW2QsMfNFO29W3rlBWWRE8nxrPX9S4OTaYMqa0qGa gQfi3fb0z/X0OshQsjS718faFiLUYsEPMtoeA6eBJ8aZxCnyY8+riMT2FSiClKFl54+A1EYUfZC tTpAHWDX2e5q2RW4twpuRv9Ktb1H4jExnEmQcqPo5eBB9EkcpwmB2/BLJ/Q1Whk0YILUGH74ynd kc3y1OJPWMzpASyTxxJvpJnaqzRxwyWxsac869JRlfOe5mvB6u5jI5eseaTrnCRXtuLRChE49b+ HSRY6MTkss7nxjQ0Gj6OivrrtRBwWTL+G6P9+3CKU3K3wOfhDYMpCxe1mdxHPL3/dQAQHis7QAP kO0xOJYx/RWk5b8hW4Ne2WjooMHSmOVZg= X-Received: by 2002:a17:902:e84e:b0:295:5da6:600c with SMTP id d9443c01a7336-2a933bca814mr67213015ad.2.1770290200015; Thu, 05 Feb 2026 03:16:40 -0800 (PST) From: Richard Henderson To: qemu-devel@nongnu.org Cc: max.chou@sifive.com Subject: [PATCH v4 5/9] fpu: Add overflow_raises_invalid to FloatFmt Date: Thu, 5 Feb 2026 21:16:18 +1000 Message-ID: <20260205111622.461497-6-richard.henderson@linaro.org> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260205111622.461497-1-richard.henderson@linaro.org> References: <20260205111622.461497-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=lists.gnu.org; Received-SPF: pass client-ip=2607:f8b0:4864:20::633; envelope-from=richard.henderson@linaro.org; helo=mail-pl1-x633.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: 1770290258328154100 Content-Type: text/plain; charset="utf-8" From: Max Chou ARM Alt HP raises different exceptions on overflow than is standard for IEEE when saturating a value. Add a flag to control this effect. Signed-off-by: Max Chou [rth: Split out of a larger patch] Signed-off-by: Richard Henderson --- fpu/softfloat.c | 6 +++++- fpu/softfloat-parts.c.inc | 4 +++- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/fpu/softfloat.c b/fpu/softfloat.c index 18098c4cdd..209eb59b48 100644 --- a/fpu/softfloat.c +++ b/fpu/softfloat.c @@ -542,7 +542,9 @@ typedef enum __attribute__((__packed__)) { * The following optional modifiers are available: * exp_max_kind: affects how exp =3D=3D exp_max is interpreted * has_explicit_bit: has an explicit integer bit; this affects whether - * the float_status floatx80_behaviour handling applies + * the float_status floatx80_behaviour handling applies + * overflow_raises_invalid: for float_expmax_normal, raise invalid + * instead of overflow. */ typedef struct { int exp_size; @@ -553,6 +555,7 @@ typedef struct { int frac_shift; FloatFmtExpMaxKind exp_max_kind; bool has_explicit_bit; + bool overflow_raises_invalid; uint64_t round_mask; } FloatFmt; =20 @@ -576,6 +579,7 @@ static const FloatFmt float16_params =3D { static const FloatFmt float16_params_ahp =3D { FLOAT_PARAMS(5, 10), .exp_max_kind =3D float_expmax_normal, + .overflow_raises_invalid =3D true, }; =20 static const FloatFmt bfloat16_params =3D { diff --git a/fpu/softfloat-parts.c.inc b/fpu/softfloat-parts.c.inc index d3c9c7a913..eada83f7a4 100644 --- a/fpu/softfloat-parts.c.inc +++ b/fpu/softfloat-parts.c.inc @@ -348,7 +348,9 @@ static void partsN(uncanon_normal)(FloatPartsN *p, floa= t_status *s, case float_expmax_normal: if (unlikely(exp > exp_max)) { /* Overflow. Return the maximum normal. */ - flags =3D float_flag_invalid; + flags =3D (fmt->overflow_raises_invalid + ? float_flag_invalid + : float_flag_overflow | float_flag_inexact); exp =3D exp_max; frac_allones(p); p->frac_lo &=3D ~round_mask; --=20 2.43.0 From nobody Mon Feb 9 13:51:29 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=1770290245; cv=none; d=zohomail.com; s=zohoarc; b=MPiUcbFrRGI7nLXyHMsWTZXErGQm3dE3zuLG7yHn/7C67B8qOKilxmGJgjMWs8rB9p5T0oVAPWJR5x7ldN7VQ+VqhtB9S5MQozdvrklvqQ422tXwQjOMxJ80un9x8pe48qupjrKGcIlFUDMDop+anDU4uYemuqJ6RMxuLIwAKws= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1770290245; h=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=t9Trus/hz1i90FrTfwhpYx+wv92psw9rbjVx4v6GD0s=; b=dqMJ4h1NvAefzna1gowRTuS6nYBTGjrL3jryNgpli1Gd2XlF2UHgExjmeCkCqfv0X4Je41jo2Wbp6Vdc2BYMCxOA0FdFmxzD7YAcViZKqV6AER9ws3AzKZK+YvS5FEiHCmsqawieKCJTBFCk90SiBDNMOWlQlVeflKppaijcpAo= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1770290245317526.930248958525; Thu, 5 Feb 2026 03:17:25 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1vnxM1-0004nP-MQ; Thu, 05 Feb 2026 06:16:58 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1vnxLr-0004mT-A1 for qemu-devel@nongnu.org; Thu, 05 Feb 2026 06:16:47 -0500 Received: from mail-pl1-x62a.google.com ([2607:f8b0:4864:20::62a]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1vnxLp-0003oQ-2c for qemu-devel@nongnu.org; Thu, 05 Feb 2026 06:16:46 -0500 Received: by mail-pl1-x62a.google.com with SMTP id d9443c01a7336-2a8ff2ca490so4399155ad.2 for ; Thu, 05 Feb 2026 03:16:43 -0800 (PST) Received: from stoup.. ([2401:d002:dc0f:2100:7515:513c:b646:18b8]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-2a933851685sm51088435ad.13.2026.02.05.03.16.40 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 05 Feb 2026 03:16:41 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1770290202; x=1770895002; 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=t9Trus/hz1i90FrTfwhpYx+wv92psw9rbjVx4v6GD0s=; b=ru9j2P7b7iGf8yiI78aZAdy0SziyZZd85WHc+O97Wnt9vDXbS1oxkjg4v9AlgWRrQe ACKvznJzxe9scrbfU4z+EuYz2OsOMM5X0+IAUTaCtCIRiZOnArRa4Vb1S4yaEgyDR5aM bQLbnCB9urUAy6D4C2mq16oqDnWnA9LuS5EsxATcZW/GtHIcpAroWeF5t5ZWafHojAdO c68t+b311MW8aYKxGtCBBf9tgiFGgtDVb3sieDbrDxxeTBnYwiQky+nYcoRGfqjT/qLr A+CZ30G0HRDyON2tinBDyiB9ulBR6R0ECKgUMOBTX/F5X3R8YSM9hUa7gvoUKsmuFRP8 2ARQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1770290202; x=1770895002; 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=t9Trus/hz1i90FrTfwhpYx+wv92psw9rbjVx4v6GD0s=; b=SUyTehmxTL04AJDHresn8zhzwZ8NhIQip9nzE+8YDdMWZ7dcKPz4xIL7fp8B0iJqo1 w5Wkb1mzQ41BAB9z03n6ss+QVDUDcTTsnA0HRVBc0S/vTFieDR5vQEXXA1w4Tf1i4rSJ hrc9daFndaQrTYO+CMPOqRaDQvoCDF6auolW74hj7E118loq93+qV3ipt7HWptFfHz7V qjv+1h5EcqiC8P5l5laq/VkXyVGRyq+8N9x8UZqQT4fUBGglhlLKct1BL/OIwF0tA5R6 OSScfFGPigIbdoxbp4fcTJUY0tR3KGYv2bAnIZeazqssv/8TqYx5reSqJwLasjjWvguP XfVw== X-Gm-Message-State: AOJu0YxK0EUZ37koF049MQnRkG4EXZkcJh3/H9rVtdhbp/OxOhLpktuN IuAK86+cMXJfdIUay8lfYQwHpZK3TlJDNZuA96SdGgCpLaUuTji/4ZqevUGSBHx9lQKYaE3r9u3 Bd+Wiq15K8A== X-Gm-Gg: AZuq6aL+ET2Kt5tX/VidE5DMEhLIMmme9hZk4e0WDtUpYxde2aiiehAveMTQCqp6Vrx RhMYuG5qUdwYVd34qQZ8ImPwafDr3aDbpmnghkQUp0m51zA8hvNpgGoZZ+9vuc23fGBzaqVfR0i P0luixciyGKYavruKId8P5cy6MYp0ZurYN9IGApPcYCST8ZT1nIRRITuEm+JaDqmXUOXSIElfZ1 EOHF/+e2lIhA40CcYkIkI1auPzawA8ltcZ31w3+4Qqqxah/Ges8Xch/Gog3hspwLFKwIkwuF106 mDUTFUsiLwjHsK7v3T4Bo37mfITyokxGHnTaoqcu/JzV3OeHcP2kEJ/lY3gczS6T9L6nbHr5yaq qLY7XfZdLYIz1ZgOZQRRTO376KBjIyxN79LeIva/msHWwe9XTBpfUSW3IsFXYt6Riw2sPyLfjJo 6hLuj68f3T1df6Z9unqWTM X-Received: by 2002:a17:902:f543:b0:29d:a26c:34b6 with SMTP id d9443c01a7336-2a934105868mr53918075ad.50.1770290202269; Thu, 05 Feb 2026 03:16:42 -0800 (PST) From: Richard Henderson To: qemu-devel@nongnu.org Cc: max.chou@sifive.com Subject: [PATCH v4 6/9] fpu: Add saturate parameter to parts_uncanon Date: Thu, 5 Feb 2026 21:16:19 +1000 Message-ID: <20260205111622.461497-7-richard.henderson@linaro.org> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260205111622.461497-1-richard.henderson@linaro.org> References: <20260205111622.461497-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=lists.gnu.org; Received-SPF: pass client-ip=2607:f8b0:4864:20::62a; envelope-from=richard.henderson@linaro.org; helo=mail-pl1-x62a.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: 1770290247483158500 Content-Type: text/plain; charset="utf-8" From: Max Chou The OCP FP8 conversion operations have a parameter to control saturate vs overflow. Add a parameter, currently always false. Signed-off-by: Max Chou [rth: Split out of a larger patch] Signed-off-by: Richard Henderson --- fpu/softfloat.c | 44 +++++++++++++++++++-------------------- fpu/softfloat-parts.c.inc | 15 +++++++------ 2 files changed, 31 insertions(+), 28 deletions(-) diff --git a/fpu/softfloat.c b/fpu/softfloat.c index 209eb59b48..a637d28fd3 100644 --- a/fpu/softfloat.c +++ b/fpu/softfloat.c @@ -771,20 +771,20 @@ static void parts128_canonicalize(FloatParts128 *p, f= loat_status *status, PARTS_GENERIC_64_128(canonicalize, A)(A, S, F) =20 static void parts64_uncanon_normal(FloatParts64 *p, float_status *status, - const FloatFmt *fmt); + const FloatFmt *fmt, bool saturate); static void parts128_uncanon_normal(FloatParts128 *p, float_status *status, - const FloatFmt *fmt); + const FloatFmt *fmt, bool saturate); =20 -#define parts_uncanon_normal(A, S, F) \ - PARTS_GENERIC_64_128(uncanon_normal, A)(A, S, F) +#define parts_uncanon_normal(A, S, F, X) \ + PARTS_GENERIC_64_128(uncanon_normal, A)(A, S, F, X) =20 static void parts64_uncanon(FloatParts64 *p, float_status *status, - const FloatFmt *fmt); + const FloatFmt *fmt, bool saturate); static void parts128_uncanon(FloatParts128 *p, float_status *status, - const FloatFmt *fmt); + const FloatFmt *fmt, bool saturate); =20 -#define parts_uncanon(A, S, F) \ - PARTS_GENERIC_64_128(uncanon, A)(A, S, F) +#define parts_uncanon(A, S, F, X) \ + PARTS_GENERIC_64_128(uncanon, A)(A, S, F, X) =20 static void parts64_add_normal(FloatParts64 *a, FloatParts64 *b); static void parts128_add_normal(FloatParts128 *a, FloatParts128 *b); @@ -1699,7 +1699,7 @@ static float16 float16a_round_pack_canonical(FloatPar= ts64 *p, float_status *s, const FloatFmt *params) { - parts_uncanon(p, s, params); + parts_uncanon(p, s, params, false); return float16_pack_raw(p); } =20 @@ -1712,7 +1712,7 @@ static float16 float16_round_pack_canonical(FloatPart= s64 *p, static bfloat16 bfloat16_round_pack_canonical(FloatParts64 *p, float_status *s) { - parts_uncanon(p, s, &bfloat16_params); + parts_uncanon(p, s, &bfloat16_params, false); return bfloat16_pack_raw(p); } =20 @@ -1726,7 +1726,7 @@ static void float32_unpack_canonical(FloatParts64 *p,= float32 f, static float32 float32_round_pack_canonical(FloatParts64 *p, float_status *s) { - parts_uncanon(p, s, &float32_params); + parts_uncanon(p, s, &float32_params, false); return float32_pack_raw(p); } =20 @@ -1740,7 +1740,7 @@ static void float64_unpack_canonical(FloatParts64 *p,= float64 f, static float64 float64_round_pack_canonical(FloatParts64 *p, float_status *s) { - parts_uncanon(p, s, &float64_params); + parts_uncanon(p, s, &float64_params, false); return float64_pack_raw(p); } =20 @@ -1789,7 +1789,7 @@ static float64 float64r32_pack_raw(FloatParts64 *p) static float64 float64r32_round_pack_canonical(FloatParts64 *p, float_status *s) { - parts_uncanon(p, s, &float32_params); + parts_uncanon(p, s, &float32_params, false); return float64r32_pack_raw(p); } =20 @@ -1803,7 +1803,7 @@ static void float128_unpack_canonical(FloatParts128 *= p, float128 f, static float128 float128_round_pack_canonical(FloatParts128 *p, float_status *s) { - parts_uncanon(p, s, &float128_params); + parts_uncanon(p, s, &float128_params, false); return float128_pack_raw(p); } =20 @@ -1851,7 +1851,7 @@ static floatx80 floatx80_round_pack_canonical(FloatPa= rts128 *p, case float_class_normal: case float_class_denormal: if (s->floatx80_rounding_precision =3D=3D floatx80_precision_x) { - parts_uncanon_normal(p, s, fmt); + parts_uncanon_normal(p, s, fmt, false); frac =3D p->frac_hi; exp =3D p->exp; } else { @@ -1860,7 +1860,7 @@ static floatx80 floatx80_round_pack_canonical(FloatPa= rts128 *p, p64.sign =3D p->sign; p64.exp =3D p->exp; frac_truncjam(&p64, p); - parts_uncanon_normal(&p64, s, fmt); + parts_uncanon_normal(&p64, s, fmt, false); frac =3D p64.frac; exp =3D p64.exp; } @@ -2258,7 +2258,7 @@ float16_muladd_scalbn(float16 a, float16 b, float16 c, pr =3D parts_muladd_scalbn(&pa, &pb, &pc, scale, flags, status); =20 /* Round before applying negate result. */ - parts_uncanon(pr, status, &float16_params); + parts_uncanon(pr, status, &float16_params, false); if ((flags & float_muladd_negate_result) && !is_nan(pr->cls)) { pr->sign ^=3D 1; } @@ -2283,7 +2283,7 @@ float32_muladd_scalbn(float32 a, float32 b, float32 c, pr =3D parts_muladd_scalbn(&pa, &pb, &pc, scale, flags, status); =20 /* Round before applying negate result. */ - parts_uncanon(pr, status, &float32_params); + parts_uncanon(pr, status, &float32_params, false); if ((flags & float_muladd_negate_result) && !is_nan(pr->cls)) { pr->sign ^=3D 1; } @@ -2302,7 +2302,7 @@ float64_muladd_scalbn(float64 a, float64 b, float64 c, pr =3D parts_muladd_scalbn(&pa, &pb, &pc, scale, flags, status); =20 /* Round before applying negate result. */ - parts_uncanon(pr, status, &float64_params); + parts_uncanon(pr, status, &float64_params, false); if ((flags & float_muladd_negate_result) && !is_nan(pr->cls)) { pr->sign ^=3D 1; } @@ -2461,7 +2461,7 @@ float64 float64r32_muladd(float64 a, float64 b, float= 64 c, pr =3D parts_muladd_scalbn(&pa, &pb, &pc, 0, flags, status); =20 /* Round before applying negate result. */ - parts_uncanon(pr, status, &float32_params); + parts_uncanon(pr, status, &float32_params, false); if ((flags & float_muladd_negate_result) && !is_nan(pr->cls)) { pr->sign ^=3D 1; } @@ -2479,7 +2479,7 @@ bfloat16 QEMU_FLATTEN bfloat16_muladd(bfloat16 a, bfl= oat16 b, bfloat16 c, pr =3D parts_muladd_scalbn(&pa, &pb, &pc, 0, flags, status); =20 /* Round before applying negate result. */ - parts_uncanon(pr, status, &bfloat16_params); + parts_uncanon(pr, status, &bfloat16_params, false); if ((flags & float_muladd_negate_result) && !is_nan(pr->cls)) { pr->sign ^=3D 1; } @@ -2497,7 +2497,7 @@ float128 QEMU_FLATTEN float128_muladd(float128 a, flo= at128 b, float128 c, pr =3D parts_muladd_scalbn(&pa, &pb, &pc, 0, flags, status); =20 /* Round before applying negate result. */ - parts_uncanon(pr, status, &float128_params); + parts_uncanon(pr, status, &float128_params, false); if ((flags & float_muladd_negate_result) && !is_nan(pr->cls)) { pr->sign ^=3D 1; } diff --git a/fpu/softfloat-parts.c.inc b/fpu/softfloat-parts.c.inc index eada83f7a4..1e1bbb14fd 100644 --- a/fpu/softfloat-parts.c.inc +++ b/fpu/softfloat-parts.c.inc @@ -258,9 +258,12 @@ static void partsN(canonicalize)(FloatPartsN *p, float= _status *status, * are FRAC_SHIFT bits that may require rounding at the bottom of the * fraction; these bits will be removed. The exponent will be biased * by EXP_BIAS and must be bounded by [EXP_MAX-1, 0]. + * + * The saturate parameter controls saturation behavior for formats that + * support it -- when true, overflow produces max normal instead of infini= ty. */ static void partsN(uncanon_normal)(FloatPartsN *p, float_status *s, - const FloatFmt *fmt) + const FloatFmt *fmt, bool saturate) { const int exp_max =3D fmt->exp_max; const int frac_shift =3D fmt->frac_shift; @@ -269,7 +272,7 @@ static void partsN(uncanon_normal)(FloatPartsN *p, floa= t_status *s, const uint64_t frac_lsbm1 =3D round_mask ^ (round_mask >> 1); const uint64_t roundeven_mask =3D round_mask | frac_lsb; uint64_t inc; - bool overflow_norm =3D false; + bool overflow_norm =3D saturate; int exp, flags =3D 0; =20 switch (s->float_rounding_mode) { @@ -294,11 +297,11 @@ static void partsN(uncanon_normal)(FloatPartsN *p, fl= oat_status *s, break; case float_round_up: inc =3D p->sign ? 0 : round_mask; - overflow_norm =3D p->sign; + overflow_norm |=3D p->sign; break; case float_round_down: inc =3D p->sign ? round_mask : 0; - overflow_norm =3D !p->sign; + overflow_norm |=3D !p->sign; break; case float_round_to_odd: overflow_norm =3D true; @@ -445,10 +448,10 @@ static void partsN(uncanon_normal)(FloatPartsN *p, fl= oat_status *s, } =20 static void partsN(uncanon)(FloatPartsN *p, float_status *s, - const FloatFmt *fmt) + const FloatFmt *fmt, bool saturate) { if (likely(is_anynorm(p->cls))) { - parts_uncanon_normal(p, s, fmt); + parts_uncanon_normal(p, s, fmt, saturate); } else { switch (p->cls) { case float_class_zero: --=20 2.43.0 From nobody Mon Feb 9 13:51:29 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=1770290283; cv=none; d=zohomail.com; s=zohoarc; b=gAJaFbdY9GnL9oyXhE4GZcVRPWP5SErGvX8HIPfmCEdcunQoMQLN7hd/RmFjHn66kD6EX/GDvP7/2kIeHuvIqdA6vrm4mj5IZEhu1WNMGMSwuahocvyA4U5nOiuNUbGXHNMh5cwMtoXveappjO5RoVHQABVINeCQ7sCuKoBNFdQ= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1770290283; h=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=uJXB35quTNKKccj4R3BAhYCyHwYQTOEExEEUQmzJvZE=; b=Tyesyismgb2OF6iQoCo62EDtGw3nJm5j/d1rcJzacS+D/IF/P1SMGOfScxJnnrCJ7rzZZczeL8N9eFVQJ+MvIU2mZJ912YzGuEbR8epoDYqpZHsYqruLqEBe/dCwi8zgrW80iKVwmqfpjyLxMSW65y3Nxk/Vh2ntAyiUpx2pN3A= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1770290283707313.5125316112086; Thu, 5 Feb 2026 03:18:03 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1vnxMV-00051m-F5; Thu, 05 Feb 2026 06:17:27 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1vnxLv-0004n5-95 for qemu-devel@nongnu.org; Thu, 05 Feb 2026 06:16:55 -0500 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 1vnxLq-0003or-8d for qemu-devel@nongnu.org; Thu, 05 Feb 2026 06:16:48 -0500 Received: by mail-pg1-x52b.google.com with SMTP id 41be03b00d2f7-c0c24d0f4ceso300130a12.1 for ; Thu, 05 Feb 2026 03:16:45 -0800 (PST) Received: from stoup.. ([2401:d002:dc0f:2100:7515:513c:b646:18b8]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-2a933851685sm51088435ad.13.2026.02.05.03.16.42 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 05 Feb 2026 03:16:44 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1770290205; x=1770895005; 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=uJXB35quTNKKccj4R3BAhYCyHwYQTOEExEEUQmzJvZE=; b=hhlRZpnuP8D26ai4TZLTdaw2W//D6QlTlELrDV+WoFmfmvdiLZxafiCh2I0gmGY54V Xa0XV5koLMs2bdrrbRHxAtr/oC9clhvUElQeUH4JcGLG5JEmRcX8rJ5e8PXSNy2JKatL eIopFDjf0zH00eFC9EtRXNLkzf3OtYX6IrcJMsZ2cd5IAzBZwiGEgPU9P6XMLcDrwW6/ bFjBb52Y/6RwAxOMoIp9cuJO8BpegFUnmXbCvv+tAC8leViPFkr9xVYduvBhsrcWsqzf 0ho7N194ZSq2z6TMpqVYvKyCepQ96hiKFTyC6JgLbkYQgGW4C6Ee//05huwROq/HIclp wknQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1770290205; x=1770895005; 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=uJXB35quTNKKccj4R3BAhYCyHwYQTOEExEEUQmzJvZE=; b=Jx8vsdmMpDNE5JobOlUmFzpDUQNGejDvYaMkCcEg5mXfI4UsREU8E5saVe/fkbYuHA MNvBayHi+JOjMeEFYttD0wHY9shvrVwfPnr4dRqOSPo4pJUlbP1zTaMSvs+b8USir/qb atGaB9/JWl+rm0yzoYmRqnFudQERi2v3JGXYogxetrIDPzGgyHfCHSfh4yDBqcDgoSlh WKOjw99K95MndE0BlXwqY0uiM/uzRtxL+XeXdECsgbM6CfluP4KeywVbv+GtR1feS+Rl fvq89Rfa8LWKLrL6oXD+SJDhQ3LmEFobOyCGiMDtXTWMoLkCshtVqEg/6Sd83fYaZtfV fkEQ== X-Gm-Message-State: AOJu0Yz7h56fLLdAZgbkMqQb/w4cbgMJNhrtVk4QzqRMBjIWf/vw6VQy +FbcEK4yJXDq8a7DbqMsTOBuUAyFbiHdreFhWBLMdza08hGL2VYgQ9nKTU76h6+bSAwN3Zf2nuO nBUXKeT7eEg== X-Gm-Gg: AZuq6aKxI1T8c3FhseXbnf/DuFlJOlCBjyJt5SmtQwZXPh6LdebmAxEcXn8Lu6267GZ Y/pCcYrl6HfFhbSFNWG/uRXPH2cLCe2QuyqE/xBN5YQilxiyQQNnsMuNk/t14i0LXMBGgcEHH24 4SSLl0dThxu5JKyEUZExwm6Y6TWwF0pg9UIsENpYWpoNRYhL4UZwZo7TO2r03M+s4Z+lFHlUMNB LC2fzrUa/P0N1Ax3S5qxnV8Doqp8uhYxs3lK5GVez86Q1nF1dKES4rQ7/gxXtkSeY7pyqVSJBBB ChyjIoS+DkzKIuwUWod41ORpdZMKGutblVcK3lEhPOSQIUkyN83I7KQvN+PdOeF7mAe6KzZpY7a tnSApmGltaYvy4K7vsM2NHBmziqL74eHgLikhI2hTnz5ngafYTqxOgGePs4ipNvJdLbl5FLRB1D bu3RERNR55ftis5x4oh/0q X-Received: by 2002:a17:903:2352:b0:2a7:c340:4c48 with SMTP id d9443c01a7336-2a933fb0c72mr61859665ad.32.1770290204598; Thu, 05 Feb 2026 03:16:44 -0800 (PST) From: Richard Henderson To: qemu-devel@nongnu.org Cc: max.chou@sifive.com Subject: [PATCH v4 7/9] fpu: Add conversion routines for OCP FP8 E5M2 Date: Thu, 5 Feb 2026 21:16:20 +1000 Message-ID: <20260205111622.461497-8-richard.henderson@linaro.org> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260205111622.461497-1-richard.henderson@linaro.org> References: <20260205111622.461497-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=lists.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: 1770290284916154100 Content-Type: text/plain; charset="utf-8" From: Max Chou Signed-off-by: Max Chou [rth: Split out of a larger patch] Signed-off-by: Richard Henderson --- include/fpu/softfloat-types.h | 5 ++++ include/fpu/softfloat.h | 8 +++++ fpu/softfloat.c | 56 +++++++++++++++++++++++++++++++++++ 3 files changed, 69 insertions(+) diff --git a/include/fpu/softfloat-types.h b/include/fpu/softfloat-types.h index 8f82fdfc97..be7e2de6e3 100644 --- a/include/fpu/softfloat-types.h +++ b/include/fpu/softfloat-types.h @@ -119,6 +119,11 @@ typedef struct { */ typedef uint16_t bfloat16; =20 +/* + * Open Compute Project (OCP) Microscaling Formats + */ +typedef uint8_t float8_e5m2; + /* * Software IEC/IEEE floating-point underflow tininess-detection mode. */ diff --git a/include/fpu/softfloat.h b/include/fpu/softfloat.h index ac6a392375..8f80726658 100644 --- a/include/fpu/softfloat.h +++ b/include/fpu/softfloat.h @@ -189,6 +189,14 @@ float128 int128_to_float128(Int128, float_status *stat= us); float128 uint64_to_float128(uint64_t, float_status *status); float128 uint128_to_float128(Int128, float_status *status); =20 +/*------------------------------------------------------------------------= ---- +| OCP FP8 conversion routines. +*-------------------------------------------------------------------------= ---*/ + +bfloat16 float8_e5m2_to_bfloat16(float8_e5m2, float_status *status); +float8_e5m2 bfloat16_to_float8_e5m2(bfloat16, bool sat, float_status *stat= us); +float8_e5m2 float32_to_float8_e5m2(float32, bool sat, float_status *status= ); + /*------------------------------------------------------------------------= ---- | Software half-precision conversion routines. *-------------------------------------------------------------------------= ---*/ diff --git a/fpu/softfloat.c b/fpu/softfloat.c index a637d28fd3..ed259657d8 100644 --- a/fpu/softfloat.c +++ b/fpu/softfloat.c @@ -572,6 +572,10 @@ typedef struct { .frac_shift =3D (-F - 1) & 63, \ .round_mask =3D (1ull << ((-F - 1) & 63)) - 1 =20 +static const FloatFmt float8_e5m2_params =3D { + FLOAT_PARAMS(5, 2) +}; + static const FloatFmt float16_params =3D { FLOAT_PARAMS(5, 10) }; @@ -627,6 +631,11 @@ static void unpack_raw64(FloatParts64 *r, const FloatF= mt *fmt, uint64_t raw) }; } =20 +static void QEMU_FLATTEN float8_e5m2_unpack_raw(FloatParts64 *p, float8_e5= m2 f) +{ + unpack_raw64(p, &float8_e5m2_params, f); +} + static void QEMU_FLATTEN float16_unpack_raw(FloatParts64 *p, float16 f) { unpack_raw64(p, &float16_params, f); @@ -684,6 +693,11 @@ static uint64_t pack_raw64(const FloatParts64 *p, cons= t FloatFmt *fmt) return ret; } =20 +static float8_e5m2 QEMU_FLATTEN float8_e5m2_pack_raw(const FloatParts64 *p) +{ + return pack_raw64(p, &float8_e5m2_params); +} + static float16 QEMU_FLATTEN float16_pack_raw(const FloatParts64 *p) { return make_float16(pack_raw64(p, &float16_params)); @@ -1675,6 +1689,13 @@ static const uint16_t rsqrt_tab[128] =3D { * Pack/unpack routines with a specific FloatFmt. */ =20 +static void float8_e5m2_unpack_canonical(FloatParts64 *p, float8_e5m2 f, + float_status *s) +{ + float8_e5m2_unpack_raw(p, f); + parts_canonicalize(p, s, &float8_e5m2_params); +} + static void float16a_unpack_canonical(FloatParts64 *p, float16 f, float_status *s, const FloatFmt *par= ams) { @@ -1695,6 +1716,14 @@ static void bfloat16_unpack_canonical(FloatParts64 *= p, bfloat16 f, parts_canonicalize(p, s, &bfloat16_params); } =20 +static float8_e5m2 float8_e5m2_round_pack_canonical(FloatParts64 *p, + float_status *s, + bool saturate) +{ + parts_uncanon(p, s, &float8_e5m2_params, saturate); + return float8_e5m2_pack_raw(p); +} + static float16 float16a_round_pack_canonical(FloatParts64 *p, float_status *s, const FloatFmt *params) @@ -2836,6 +2865,15 @@ static void parts_float_to_float_widen(FloatParts128= *a, FloatParts64 *b, } } =20 +bfloat16 float8_e5m2_to_bfloat16(float8_e5m2 a, float_status *s) +{ + FloatParts64 p; + + float8_e5m2_unpack_canonical(&p, a, s); + parts_float_to_float(&p, s); + return bfloat16_round_pack_canonical(&p, s); +} + float32 float16_to_float32(float16 a, bool ieee, float_status *s) { const FloatFmt *fmt16 =3D ieee ? &float16_params : &float16_params_ahp; @@ -2856,6 +2894,15 @@ float64 float16_to_float64(float16 a, bool ieee, flo= at_status *s) return float64_round_pack_canonical(&p, s); } =20 +float8_e5m2 float32_to_float8_e5m2(float32 a, bool saturate, float_status = *s) +{ + FloatParts64 p; + + float32_unpack_canonical(&p, a, s); + parts_float_to_float(&p, s); + return float8_e5m2_round_pack_canonical(&p, s, saturate); +} + float16 float32_to_float16(float32 a, bool ieee, float_status *s) { FloatParts64 p; @@ -2923,6 +2970,15 @@ float32 float64_to_float32(float64 a, float_status *= s) return float32_round_pack_canonical(&p, s); } =20 +float8_e5m2 bfloat16_to_float8_e5m2(bfloat16 a, bool saturate, float_statu= s *s) +{ + FloatParts64 p; + + bfloat16_unpack_canonical(&p, a, s); + parts_float_to_float(&p, s); + return float8_e5m2_round_pack_canonical(&p, s, saturate); +} + float32 bfloat16_to_float32(bfloat16 a, float_status *s) { FloatParts64 p; --=20 2.43.0 From nobody Mon Feb 9 13:51:29 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=1770290270; cv=none; d=zohomail.com; s=zohoarc; b=W1bjCFRD4o8B4+XF8CisBXnNPahKQ0DVKpqEuGKJHd8qm5SWHbLzXD5pgpYWzoh6HAVKMKTkBEvhO1Rozn4qQUtPAe9J+r33MMoXQgUd35bJyOpwrAqZ6mADErxeC+OAPCFr2IojdR5x61fb0sVSZlAX3Sb5ppH+YIiw85JxnV4= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1770290270; h=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=dhShHS5+426+mEvKHX0n9TpFkAqO0Z7x0lCXzKXYdzg=; b=h7537D5y0QUs4W39gYhgI9uIdP3qCEviONatjip4CfwfOSjcS6Ef+dZ6ZMrXfUUPIQA+RobDVOLQv9lFjO1HGcv+614MrhSPuZp6/LXk+iTTe3+QwehPFpWcagc/pT7D+wDyhv6vwLUPsY2Phg+KrXWqVwDczlTWzbN3Yt79Qh8= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1770290270657447.4895960049208; Thu, 5 Feb 2026 03:17:50 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1vnxMW-00057F-Cn; Thu, 05 Feb 2026 06:17:28 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1vnxLy-0004nB-Jz for qemu-devel@nongnu.org; Thu, 05 Feb 2026 06:16:55 -0500 Received: from mail-pg1-x534.google.com ([2607:f8b0:4864:20::534]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1vnxLu-0003pB-W1 for qemu-devel@nongnu.org; Thu, 05 Feb 2026 06:16:54 -0500 Received: by mail-pg1-x534.google.com with SMTP id 41be03b00d2f7-c0ec27cad8cso294526a12.1 for ; Thu, 05 Feb 2026 03:16:47 -0800 (PST) Received: from stoup.. ([2401:d002:dc0f:2100:7515:513c:b646:18b8]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-2a933851685sm51088435ad.13.2026.02.05.03.16.45 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 05 Feb 2026 03:16:46 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1770290207; x=1770895007; 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=dhShHS5+426+mEvKHX0n9TpFkAqO0Z7x0lCXzKXYdzg=; b=j52QC6xmm+FVeoHnjQyEiuSLMKQu1wA/gmIgkZsZecC2d3yDPycCHMMoz6JfnR3KMX J9iaOv2/vreq/hWyGFwVreMno0H7HQzf7B7EQEBwIfI4MGsRj4PUDwnXcUrJgZRyFQlr +1JHdbG5OpD62B7z7eZJfOB8qPGvMp8d9LFSx9xV9bUy/t4IkXtkjgknx2OkD+iMQTJc 2XlAyoXrp7uXpEMP+gMznHVGle5/JlUPO/WL6z6cwFqJZAiqiKsKuwnSJDn+IXNu/SDJ ypp1U+aVZq/yEjEPSCObVbIFwxmVhqkd7fe+OiR/s+mtvxdJ1ZBiHO95X5CfxGBB0c2+ d+cA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1770290207; x=1770895007; 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=dhShHS5+426+mEvKHX0n9TpFkAqO0Z7x0lCXzKXYdzg=; b=iX231j/y7SXuSDUH77UuJRdXzUzn4+O6gIpiZfyHjRH+yOcuWMDeNZYVpYLVrYszjt VfDvV6Ip1OLTH/kZpUS+sUtUCrXz7DuscbPRelQXqxpyBnF+G/UJc7djdqSP4LmG9F3l J1A8uf7C5cCj4Q3G6ZqWmpVmagkSXZZ2NZwrdQIwOUiGOLCmgYXGq6h7Yo4cp+JAbhV/ H7NacQpKJNbUoRet0FFZQ2KIDkJuKorWROAArVmfMxBZ2lkruEnj5BgnVhI0pczVP/EF /G3S2KyxMqhXz1XSsH6+ZElrLWnm9HHsrnuWm+DMmzsdj3YwlsI2n9K3Ff7hPjuz5oih BkSA== X-Gm-Message-State: AOJu0YwIrKzhpd/q8E6NTYnG6MRaXw32FC4GnifrD+uOdtZsW01anNiE YtYhyQZIqg2mdwMAWyoogrLxffXE+p528R8LIeSRlZp0W3l6EswJSPTCDRThll+HcaEwQn2btWF 0OVIFxPZkbw== X-Gm-Gg: AZuq6aKX0833QxvbJqqchzytlwpBYya6hr5mg+pfWK5QCmjNXJMJQIHa9aY7xwH+TA1 ps4Z8zOU8947pFxc6wRZs+CnSF1T+j3+ryVm0F1m1vIUxB06A8TDCvo5wid66OQscKFjpRtZx71 Ltu2c306Qi341kfsqHvepMRR02qwv9RAr+qszzT1wJfa5fzaGVy94eMwCsUMmxP5vmsLcSSI7iQ fMQNXIgoki771fsR4IxreZwWynJYNDYMTiUZmJvRl2RHL1kKdEmXgE9AnxB9JiWz5+KLnWHmgvN DZeSnxp0G3s1t8Jk3y3pHNuiWdmEYpOoxxzDXBC29rhbo7krab/HUX2xcGTZoBeubRaJIUjEO1O bvt5TjZcOwLs/CkoXlemMeU4L46h6hv2TpZKTRxdLGCq3oEKJd6sG1oNzvz6fj3z3rXDV3sEK8t 8wZ1xf+zV3ugqZGTKPRuhe X-Received: by 2002:a17:903:fa7:b0:2a8:f8bd:bb72 with SMTP id d9443c01a7336-2a933fa77dbmr57081635ad.50.1770290206762; Thu, 05 Feb 2026 03:16:46 -0800 (PST) From: Richard Henderson To: qemu-devel@nongnu.org Cc: max.chou@sifive.com Subject: [PATCH v4 8/9] fpu: Add conversion routines for OCP FP8 E4M3 Date: Thu, 5 Feb 2026 21:16:21 +1000 Message-ID: <20260205111622.461497-9-richard.henderson@linaro.org> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260205111622.461497-1-richard.henderson@linaro.org> References: <20260205111622.461497-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=lists.gnu.org; Received-SPF: pass client-ip=2607:f8b0:4864:20::534; envelope-from=richard.henderson@linaro.org; helo=mail-pg1-x534.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: 1770290272693154100 Content-Type: text/plain; charset="utf-8" From: Max Chou Signed-off-by: Max Chou [rth: Split out of a larger patch; adjust overflow detection.] Signed-off-by: Richard Henderson --- include/fpu/softfloat-types.h | 1 + include/fpu/softfloat.h | 4 +++ fpu/softfloat.c | 62 +++++++++++++++++++++++++++++++++++ fpu/softfloat-parts.c.inc | 45 +++++++++++++++++++++++-- 4 files changed, 109 insertions(+), 3 deletions(-) diff --git a/include/fpu/softfloat-types.h b/include/fpu/softfloat-types.h index be7e2de6e3..9c84a101e5 100644 --- a/include/fpu/softfloat-types.h +++ b/include/fpu/softfloat-types.h @@ -122,6 +122,7 @@ typedef uint16_t bfloat16; /* * Open Compute Project (OCP) Microscaling Formats */ +typedef uint8_t float8_e4m3; typedef uint8_t float8_e5m2; =20 /* diff --git a/include/fpu/softfloat.h b/include/fpu/softfloat.h index 8f80726658..e45260f52d 100644 --- a/include/fpu/softfloat.h +++ b/include/fpu/softfloat.h @@ -193,6 +193,10 @@ float128 uint128_to_float128(Int128, float_status *sta= tus); | OCP FP8 conversion routines. *-------------------------------------------------------------------------= ---*/ =20 +bfloat16 float8_e4m3_to_bfloat16(float8_e4m3, float_status *status); +float8_e4m3 bfloat16_to_float8_e4m3(bfloat16, bool sat, float_status *stat= us); +float8_e4m3 float32_to_float8_e4m3(float32, bool sat, float_status *status= ); + bfloat16 float8_e5m2_to_bfloat16(float8_e5m2, float_status *status); float8_e5m2 bfloat16_to_float8_e5m2(bfloat16, bool sat, float_status *stat= us); float8_e5m2 float32_to_float8_e5m2(float32, bool sat, float_status *status= ); diff --git a/fpu/softfloat.c b/fpu/softfloat.c index ed259657d8..9e31ddd85a 100644 --- a/fpu/softfloat.c +++ b/fpu/softfloat.c @@ -528,6 +528,8 @@ typedef enum __attribute__((__packed__)) { float_expmax_ieee, /* exp=3D=3Dmax is a normal number; no infinity or nan representation.= */ float_expmax_normal, + /* exp=3D=3Dmax, frac=3D=3Dmax ? nan : normal; no infinity representat= ion. */ + float_expmax_e4m3, } FloatFmtExpMaxKind; =20 /* @@ -572,6 +574,14 @@ typedef struct { .frac_shift =3D (-F - 1) & 63, \ .round_mask =3D (1ull << ((-F - 1) & 63)) - 1 =20 +static const FloatFmt float8_e4m3_params =3D { + FLOAT_PARAMS(4, 3), + .exp_max_kind =3D float_expmax_e4m3 +}; + +/* 110 << frac_shift, with the implicit bit set */ +#define E4M3_NORMAL_FRAC_MAX 0xe000000000000000ull + static const FloatFmt float8_e5m2_params =3D { FLOAT_PARAMS(5, 2) }; @@ -631,6 +641,11 @@ static void unpack_raw64(FloatParts64 *r, const FloatF= mt *fmt, uint64_t raw) }; } =20 +static void QEMU_FLATTEN float8_e4m3_unpack_raw(FloatParts64 *p, float8_e4= m3 f) +{ + unpack_raw64(p, &float8_e4m3_params, f); +} + static void QEMU_FLATTEN float8_e5m2_unpack_raw(FloatParts64 *p, float8_e5= m2 f) { unpack_raw64(p, &float8_e5m2_params, f); @@ -693,6 +708,11 @@ static uint64_t pack_raw64(const FloatParts64 *p, cons= t FloatFmt *fmt) return ret; } =20 +static float8_e4m3 QEMU_FLATTEN float8_e4m3_pack_raw(const FloatParts64 *p) +{ + return pack_raw64(p, &float8_e4m3_params); +} + static float8_e5m2 QEMU_FLATTEN float8_e5m2_pack_raw(const FloatParts64 *p) { return pack_raw64(p, &float8_e5m2_params); @@ -1689,6 +1709,13 @@ static const uint16_t rsqrt_tab[128] =3D { * Pack/unpack routines with a specific FloatFmt. */ =20 +static void float8_e4m3_unpack_canonical(FloatParts64 *p, float8_e4m3 f, + float_status *s) +{ + float8_e4m3_unpack_raw(p, f); + parts_canonicalize(p, s, &float8_e4m3_params); +} + static void float8_e5m2_unpack_canonical(FloatParts64 *p, float8_e5m2 f, float_status *s) { @@ -1716,6 +1743,14 @@ static void bfloat16_unpack_canonical(FloatParts64 *= p, bfloat16 f, parts_canonicalize(p, s, &bfloat16_params); } =20 +static float8_e4m3 float8_e4m3_round_pack_canonical(FloatParts64 *p, + float_status *s, + bool saturate) +{ + parts_uncanon(p, s, &float8_e4m3_params, saturate); + return float8_e4m3_pack_raw(p); +} + static float8_e5m2 float8_e5m2_round_pack_canonical(FloatParts64 *p, float_status *s, bool saturate) @@ -2865,6 +2900,15 @@ static void parts_float_to_float_widen(FloatParts128= *a, FloatParts64 *b, } } =20 +bfloat16 float8_e4m3_to_bfloat16(float8_e4m3 a, float_status *s) +{ + FloatParts64 p; + + float8_e4m3_unpack_canonical(&p, a, s); + parts_float_to_float(&p, s); + return bfloat16_round_pack_canonical(&p, s); +} + bfloat16 float8_e5m2_to_bfloat16(float8_e5m2 a, float_status *s) { FloatParts64 p; @@ -2894,6 +2938,15 @@ float64 float16_to_float64(float16 a, bool ieee, flo= at_status *s) return float64_round_pack_canonical(&p, s); } =20 +float8_e4m3 float32_to_float8_e4m3(float32 a, bool saturate, float_status = *s) +{ + FloatParts64 p; + + float32_unpack_canonical(&p, a, s); + parts_float_to_float(&p, s); + return float8_e4m3_round_pack_canonical(&p, s, saturate); +} + float8_e5m2 float32_to_float8_e5m2(float32 a, bool saturate, float_status = *s) { FloatParts64 p; @@ -2970,6 +3023,15 @@ float32 float64_to_float32(float64 a, float_status *= s) return float32_round_pack_canonical(&p, s); } =20 +float8_e4m3 bfloat16_to_float8_e4m3(bfloat16 a, bool saturate, float_statu= s *s) +{ + FloatParts64 p; + + bfloat16_unpack_canonical(&p, a, s); + parts_float_to_float(&p, s); + return float8_e4m3_round_pack_canonical(&p, s, saturate); +} + float8_e5m2 bfloat16_to_float8_e5m2(bfloat16 a, bool saturate, float_statu= s *s) { FloatParts64 p; diff --git a/fpu/softfloat-parts.c.inc b/fpu/softfloat-parts.c.inc index 1e1bbb14fd..a45873c51f 100644 --- a/fpu/softfloat-parts.c.inc +++ b/fpu/softfloat-parts.c.inc @@ -242,6 +242,15 @@ static void partsN(canonicalize)(FloatPartsN *p, float= _status *status, return; case float_expmax_normal: break; + case float_expmax_e4m3: + if (p->frac_hi =3D=3D 0b111) { + frac_shl(p, fmt->frac_shift); + p->cls =3D (parts_is_snan_frac(p->frac_hi, status) + ? float_class_snan : float_class_qnan); + return; + } + /* otherwise normal */ + break; default: g_assert_not_reached(); } @@ -262,6 +271,21 @@ static void partsN(canonicalize)(FloatPartsN *p, float= _status *status, * The saturate parameter controls saturation behavior for formats that * support it -- when true, overflow produces max normal instead of infini= ty. */ + +/* Helper for uncanon_normal and uncanon, for FP8 E4M3. */ +static void partsN(uncanon_e4m3_overflow)(FloatPartsN *p, float_status *s, + const FloatFmt *fmt, bool satura= te) +{ + assert(N =3D=3D 64); + float_raise(float_flag_overflow | float_flag_inexact, s); + if (saturate) { + p->exp =3D fmt->exp_max; + p->frac_hi =3D E4M3_NORMAL_FRAC_MAX; + } else { + parts_default_nan(p, s); + } +} + static void partsN(uncanon_normal)(FloatPartsN *p, float_status *s, const FloatFmt *fmt, bool saturate) { @@ -360,6 +384,12 @@ static void partsN(uncanon_normal)(FloatPartsN *p, flo= at_status *s, } break; =20 + case float_expmax_e4m3: + if (exp > exp_max || p->frac_hi > E4M3_NORMAL_FRAC_MAX) { + partsN(uncanon_e4m3_overflow)(p, s, fmt, overflow_norm= ); + } + break; + default: g_assert_not_reached(); } @@ -459,9 +489,18 @@ static void partsN(uncanon)(FloatPartsN *p, float_stat= us *s, frac_clear(p); return; case float_class_inf: - assert(fmt->exp_max_kind =3D=3D float_expmax_ieee); - p->exp =3D fmt->exp_max; - frac_clear(p); + switch (fmt->exp_max_kind) { + case float_expmax_ieee: + p->exp =3D fmt->exp_max; + frac_clear(p); + break; + case float_expmax_e4m3: + partsN(uncanon_e4m3_overflow)(p, s, fmt, saturate); + break; + case float_expmax_normal: + default: + g_assert_not_reached(); + } return; case float_class_qnan: case float_class_snan: --=20 2.43.0 From nobody Mon Feb 9 13:51:29 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=1770290283; cv=none; d=zohomail.com; s=zohoarc; b=hkjRILklYx/HDb+XAtmT+gO2ErVDcKbh00VyNdSR5UiWJ4c2z9IpqeGt34AcHUn13932XT5gmvu32LD4Nw5yg38zvuCBNR4dKteFIMl+JIM8FIUEN4qnMaw1mRLNt/IuSyf+9ng0TKcUHrOI9g0oo4TsU67qtLIpydfmG8I6ak4= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1770290283; h=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=GUJkPxJTWqwWbdY7PIHOQlggOr8hkqng9fCkzzSfwBk=; b=YGV6jAEKHiRV2WqoSMsWXPWAFSViat9B2kq7zFfohCmR9w0ipBJ1kZZhJi01skHb8FT/1i0DFogc/r3CNxTYD7nSDVKV2EL/+1Rn2Ge8pvlkcDCtZMvyjOp4cQD7wqG1JtbYPq6xEyABKQZ6NtBmXdRAYi1+wG063Nv24FfsbuU= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1770290283682723.3623625861638; Thu, 5 Feb 2026 03:18:03 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1vnxMV-00053p-MN; Thu, 05 Feb 2026 06:17:27 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1vnxLy-0004nA-9E for qemu-devel@nongnu.org; Thu, 05 Feb 2026 06:16:55 -0500 Received: from mail-pl1-x630.google.com ([2607:f8b0:4864:20::630]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1vnxLv-0003pP-1u for qemu-devel@nongnu.org; Thu, 05 Feb 2026 06:16:54 -0500 Received: by mail-pl1-x630.google.com with SMTP id d9443c01a7336-2a0d67f1877so5117275ad.2 for ; Thu, 05 Feb 2026 03:16:49 -0800 (PST) Received: from stoup.. ([2401:d002:dc0f:2100:7515:513c:b646:18b8]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-2a933851685sm51088435ad.13.2026.02.05.03.16.47 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 05 Feb 2026 03:16:48 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1770290209; x=1770895009; 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=GUJkPxJTWqwWbdY7PIHOQlggOr8hkqng9fCkzzSfwBk=; b=fa8rCJPMx8UO4qCl+/anMYgrqBzU0KqwOwcegwQ2+x65LGt0uYmRx3GKH+w7vBPccR 7tUIqpwrQS3Q2huXTPVCcyfQZSfpLk5wg/9NQKPvMWvBSL0Rl4XmObN5IsTl1Wv0d0Ra OOIqFdpLgsz1dOBV9gXMODjB34AHZ19SUReLJ/iIEMC8QaPjUUCteDhapR45fTOcaEi3 x/EEoeIGuqEthB0AyYXk03xxXkTuSzSASb6VSUQWbYEe4Vav+NVo3MXblrAQPQSlwjNS VdSiYoRXImpkfLT5xULGkMZ/RiLbHYOc2b2EF+5aR2rCcFPMvFv5I8f4fItmBoH6odoI 9riQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1770290209; x=1770895009; 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=GUJkPxJTWqwWbdY7PIHOQlggOr8hkqng9fCkzzSfwBk=; b=PnOTsYrbwrexmjaxswpy+8bsT8vsWQ0IUGrJlscwS1EklKUNy748+EtaEOk7HFqKH5 6q3gOj5dRaxbDEGgQ0A8d654w+zBPECxsFW9dzrEvli9B/sLPPCDe1m0kwy9fWDHJD82 hWpp6uL2uhFGhBlQwRSNFXHR71uRq03qxLiXNjRVtwMF/Y7kjuqZmSDqgPJ30dVoENr3 hzuqQKfJrxWtdgAN9VgGgWzijn3quShHP7pMy9WWmxgZVLYahNlm8pIP9KaVgPrglNla APlW9F0f1mxxltUQxoPlDpWCz0GNKio8JIs38V+CAZEcJoe987l+g5OqzkQfmrV0barm cfhQ== X-Gm-Message-State: AOJu0Yzr8BLrd5AHTb4LtZfj8zMc4P+essf8mc9VX5HlqXFAahaBmXwW 1RmQyb8adI9+irWk06P/lpsCfgUdor91BN+1acl8Qc4m/eqqcKlbo5VYuhongFa/bgVXH743KIN K1Tpq7DUsJw== X-Gm-Gg: AZuq6aJSb1ZpgpTXGrR8I77kWyyngPJStGq771CHwAY9oV4rGiGonfoXGsmDzuaDYWl GwpL3k30BnamjLlBG5eUxzbwUvhkzijRApm+R7Mx12NajPz1YvksRd/rCYPH9SSqYUexGUXvwtF BWe4xG9salrPLXMDgZDFYfNItQxa00fNDrJe1ku9Sp/Y8UR0FcB3KVF+mC+bDt8fjKLVFBxjIHW Akkxo2LuVp6igsFbhGsCtP+RmcxydGjQ46P9TuQFwpXzzorRQE6oO/0NxiV7Ith9nRKXyvquonQ tcbDTWWyX8YnN+58dur1LuBFyN+r2ZkyfY49zPoFQpZM6XGx+EUD+Wri4ljRU9RJHv31q4HKHql 3cuS88HPoa5aVk3RXVxsrLiJbsvkgZTkIYVru+GtiRsFeoIbzqj8W2d5H2km1scG7U7Pv8NY9Cz NsffAhN7LvdyAgNhvGep4g X-Received: by 2002:a17:902:f64e:b0:2a0:a0cc:9994 with SMTP id d9443c01a7336-2a9340029ebmr75232975ad.47.1770290208929; Thu, 05 Feb 2026 03:16:48 -0800 (PST) From: Richard Henderson To: qemu-devel@nongnu.org Cc: max.chou@sifive.com Subject: [PATCH v4 9/9] fpu: Add conversion routines for OCP FP4 E2M1 Date: Thu, 5 Feb 2026 21:16:22 +1000 Message-ID: <20260205111622.461497-10-richard.henderson@linaro.org> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260205111622.461497-1-richard.henderson@linaro.org> References: <20260205111622.461497-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=lists.gnu.org; Received-SPF: pass client-ip=2607:f8b0:4864:20::630; envelope-from=richard.henderson@linaro.org; helo=mail-pl1-x630.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: 1770290285310158500 Content-Type: text/plain; charset="utf-8" From: Max Chou Signed-off-by: Max Chou [rth: Update for exp_max_kind] Signed-off-by: Richard Henderson --- include/fpu/softfloat-types.h | 1 + include/fpu/softfloat.h | 4 +++- fpu/softfloat.c | 26 ++++++++++++++++++++++++++ 3 files changed, 30 insertions(+), 1 deletion(-) diff --git a/include/fpu/softfloat-types.h b/include/fpu/softfloat-types.h index 9c84a101e5..ead146c22d 100644 --- a/include/fpu/softfloat-types.h +++ b/include/fpu/softfloat-types.h @@ -122,6 +122,7 @@ typedef uint16_t bfloat16; /* * Open Compute Project (OCP) Microscaling Formats */ +typedef uint8_t float4_e2m1; typedef uint8_t float8_e4m3; typedef uint8_t float8_e5m2; =20 diff --git a/include/fpu/softfloat.h b/include/fpu/softfloat.h index e45260f52d..1580d956d5 100644 --- a/include/fpu/softfloat.h +++ b/include/fpu/softfloat.h @@ -190,9 +190,11 @@ float128 uint64_to_float128(uint64_t, float_status *st= atus); float128 uint128_to_float128(Int128, float_status *status); =20 /*------------------------------------------------------------------------= ---- -| OCP FP8 conversion routines. +| OCP FP{4,8} conversion routines. *-------------------------------------------------------------------------= ---*/ =20 +float8_e4m3 float4_e2m1_to_float8_e4m3(float4_e2m1, float_status *status); + bfloat16 float8_e4m3_to_bfloat16(float8_e4m3, float_status *status); float8_e4m3 bfloat16_to_float8_e4m3(bfloat16, bool sat, float_status *stat= us); float8_e4m3 float32_to_float8_e4m3(float32, bool sat, float_status *status= ); diff --git a/fpu/softfloat.c b/fpu/softfloat.c index 9e31ddd85a..a8ba3cbdd1 100644 --- a/fpu/softfloat.c +++ b/fpu/softfloat.c @@ -574,6 +574,11 @@ typedef struct { .frac_shift =3D (-F - 1) & 63, \ .round_mask =3D (1ull << ((-F - 1) & 63)) - 1 =20 +static const FloatFmt float4_e2m1_params =3D { + FLOAT_PARAMS(2, 1), + .exp_max_kind =3D float_expmax_normal, +}; + static const FloatFmt float8_e4m3_params =3D { FLOAT_PARAMS(4, 3), .exp_max_kind =3D float_expmax_e4m3 @@ -641,6 +646,11 @@ static void unpack_raw64(FloatParts64 *r, const FloatF= mt *fmt, uint64_t raw) }; } =20 +static void QEMU_FLATTEN float4_e2m1_unpack_raw(FloatParts64 *p, float4_e2= m1 f) +{ + unpack_raw64(p, &float4_e2m1_params, f); +} + static void QEMU_FLATTEN float8_e4m3_unpack_raw(FloatParts64 *p, float8_e4= m3 f) { unpack_raw64(p, &float8_e4m3_params, f); @@ -1709,6 +1719,13 @@ static const uint16_t rsqrt_tab[128] =3D { * Pack/unpack routines with a specific FloatFmt. */ =20 +static void float4_e2m1_unpack_canonical(FloatParts64 *p, float4_e2m1 f, + float_status *s) +{ + float4_e2m1_unpack_raw(p, f); + parts_canonicalize(p, s, &float4_e2m1_params); +} + static void float8_e4m3_unpack_canonical(FloatParts64 *p, float8_e4m3 f, float_status *s) { @@ -2900,6 +2917,15 @@ static void parts_float_to_float_widen(FloatParts128= *a, FloatParts64 *b, } } =20 +float8_e4m3 float4_e2m1_to_float8_e4m3(float4_e2m1 a, float_status *s) +{ + FloatParts64 p; + + float4_e2m1_unpack_canonical(&p, a, s); + parts_float_to_float(&p, s); + return float8_e4m3_round_pack_canonical(&p, s, false); +} + bfloat16 float8_e4m3_to_bfloat16(float8_e4m3 a, float_status *s) { FloatParts64 p; --=20 2.43.0