From nobody Sun Apr 12 00:57:42 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=linaro.org ARC-Seal: i=1; a=rsa-sha256; t=1771911892; cv=none; d=zohomail.com; s=zohoarc; b=RlgajDZYNag29ObQGBrJZyRN4inM4R3zONy2jEa3n+5M4U+8dVUvjfa4TDl9ppV6pi2uCjED0xAsvpHCOFbDp/ctZIPKKgsUzpCgNZqO4RRZq1Y8RhwWcL3KFfxyv6PrDnEZ8GakYLtdgOV7DztdTaz/qd3SyhRUCF/8Szx2WQ8= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1771911892; 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=CW3OZ4gtvBO22IqlUTNQJUAjSbwsjtahA3k1KPELhKevSzRkGV47eAMHK2eDHso1uEzIUTDyzFnh1WzuRhJd1MKuhL/fNOsqenMUh+Zlgue4cj08bYhtQmJV/+TZphdMCo32nuTt1UuxfBYA5ZkC2MXxVGubkyz+QgbMAOBU5hc= 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 1771911892906716.2572857145319; Mon, 23 Feb 2026 21:44:52 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1vulDq-0003nF-Kq; Tue, 24 Feb 2026 00:44:38 -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 1vulDo-0003mp-Ko for qemu-devel@nongnu.org; Tue, 24 Feb 2026 00:44:36 -0500 Received: from mail-dy1-x1341.google.com ([2607:f8b0:4864:20::1341]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1vulDm-0002I2-He for qemu-devel@nongnu.org; Tue, 24 Feb 2026 00:44:36 -0500 Received: by mail-dy1-x1341.google.com with SMTP id 5a478bee46e88-2ba9c484e5eso5110095eec.1 for ; Mon, 23 Feb 2026 21:44:34 -0800 (PST) Received: from stoup.. ([172.56.177.223]) by smtp.gmail.com with ESMTPSA id 5a478bee46e88-2bd7daa37c7sm5958093eec.12.2026.02.23.21.44.29 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 23 Feb 2026 21:44:32 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1771911873; x=1772516673; 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=DvSXl3uddlyIfTVGdrHsG4N6KxCdPkk2/2q3EOLVQeU6amqHwiVSqZFYMqcFlwwcmx hX1BxI+/H8+5agBSFFAiHfSsocsMqTKotq2FeZs+IKGArhNdNl+Id6IUEAft0IxficwD pn6k+58ZUV38LN08NnxUBenlLVaIbMhEl/94lBQIjMsTcC4p+lRCG3a+27y7L4Yi+3OB LsRaXD4FmNCiwf3PripdQl0zMaIviibJ1p2XE2r2tb0JK4OyMuHYHP5d292RxnbnUJ2F AIqBGDLs0qHxOwKXyzX4VnlT6QFeoLsy2C+IR26rbT1TM86YpHDdI1T5SD8ay+MBrH8Y +CjA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1771911873; x=1772516673; 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=izm7ajbuCeLTBc0OYUUGMVnEDy+VehlDIvtk8djTuVDD/pIYiFC4NLhoK8PF5uDYf3 K/vP6iNgx2auG8zmv7CIq6JRP6WSFioJpdQkuRODWgfJ/fN1cabG+tVbKH1LKsmauBMl UvmbOycs+CppJxcpyw8CLJH2+fOjYuXXaV9wofrkZpdt0qTuQlGLQKCUfAY94xUIBJZr GJ1qqnnyEm36/SOqHJpoOVTUgFxEAIQUeHBBtZ3kAb8uSf2OCv5BLd6IBY9JApkEXAqJ BoZp2P5pRvIep1DZZxct8NX4Mj2hwUtGgEA9sovjBpW99/rDOJlCmQwLLfZRcNC8tVWu 37zQ== X-Gm-Message-State: AOJu0Yw4j6WQ1XkHrtlvIfqE6mnX2g15H/QvDTWkz6Z/3eDJwtkVM1s7 77zJe420rrjv7vzeXS0xc8tY09dryvfeER+wv82zzQBC9nZan5Ndydm0N4cRWP/bYUrmGVO1ev1 OSRD0j2Tjrw== X-Gm-Gg: ATEYQzwsP+mFHJT+pdyIpyah5AkOubj3vbgvqE7VEK+T4jyL3aVzYzcMOBUVhKr1caU 4Bx0Wqxu+snOPvDWZzT4hAm3e6fXnPscnb4V7YOb+kDZYuZoTUhVVDLUjeE3LW6txZJJCC5hit6 8JVrAR/f4xRn7kmI0IpCQdaHTjzt7CLmmFgZjbdUB3J/NLdqrTPrviNbFgOhcUTDBWc3lnk1nu5 SmOtXYu78praALpYjpNIsGvUE53Aln/3d2OjImssjbBpUTO3UW0fPn742MEsAafC46VJ8lMGjBT FHg+FZJJydoWXjSwnD5TP8N7xW97xXxT7AzZc2EPefkiUIVJ0Ox2JajsXHFQwZMCM/tAPYd+GUk iOeSyztERmlqAnyDQQL39L4rz7wPEpcFYYHYPdEwkEfK/pwbpSwPq5RtT6k+efWWGAvdg72oToa 50WNC5S1+SQWNLXrKIiq6k/qq/bOW6Ldh5I81bZsf4m+jrGiJ1EheF X-Received: by 2002:a05:693c:2c17:b0:2ba:8aa8:9bd4 with SMTP id 5a478bee46e88-2bd7b9d54a1mr4046033eec.5.1771911872771; Mon, 23 Feb 2026 21:44:32 -0800 (PST) From: Richard Henderson To: qemu-devel@nongnu.org Cc: Max Chou , Chao Liu Subject: [PULL 1/9] fpu/softfloat: Refactor IEEE format NaN classification to share code Date: Tue, 24 Feb 2026 16:44:09 +1100 Message-ID: <20260224054417.32430-2-richard.henderson@linaro.org> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260224054417.32430-1-richard.henderson@linaro.org> References: <20260224054417.32430-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::1341; envelope-from=richard.henderson@linaro.org; helo=mail-dy1-x1341.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: 1771911893785158500 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 Sun Apr 12 00:57:42 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=linaro.org ARC-Seal: i=1; a=rsa-sha256; t=1771911898; cv=none; d=zohomail.com; s=zohoarc; b=n3YyMuiGzY7c4vDhaD3ImuvJ6HF69tbgBU08lT4g4hA4mnpxNAc1UZw75R7ORstEymmsi71Auheu+f+pNTv3NXvj4qJp3Qw/+dik2i7Skt0bhqOR3PfaJrL1p8znVX82xnEhgDsaZYmx1lXNVh2TDO3dizK51IyFK1OY1zIANnE= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1771911898; 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=WILaMGNYgo59ciXOv8fCSdPpQjQ/av9tdzjHB1/JF6I=; b=Ub488o/8VjjCFb/rZhYRL76z6ie8vpWKhUNRQ6B3MwvAY/3qjCwQXYG7RtFAYwpn6QeDalci2QwBvqYDw4SjZgRL17naiZd5hGkmUM8j8qCFQTjr7RJ9pyxhk57wulLzc4upkGqBMLrn1nU0y1H2YAjghs7XTVD0eHSzBtz0lSY= 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 1771911897967612.7911874305188; Mon, 23 Feb 2026 21:44:57 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1vulDv-0003o0-Ln; Tue, 24 Feb 2026 00:44:43 -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 1vulDt-0003nS-Nu for qemu-devel@nongnu.org; Tue, 24 Feb 2026 00:44:41 -0500 Received: from mail-dy1-x1341.google.com ([2607:f8b0:4864:20::1341]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1vulDr-0002IH-O4 for qemu-devel@nongnu.org; Tue, 24 Feb 2026 00:44:41 -0500 Received: by mail-dy1-x1341.google.com with SMTP id 5a478bee46e88-2b6b0500e06so6429872eec.1 for ; Mon, 23 Feb 2026 21:44:39 -0800 (PST) Received: from stoup.. ([172.56.177.223]) by smtp.gmail.com with ESMTPSA id 5a478bee46e88-2bd7daa37c7sm5958093eec.12.2026.02.23.21.44.34 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 23 Feb 2026 21:44:37 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1771911878; x=1772516678; 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=WILaMGNYgo59ciXOv8fCSdPpQjQ/av9tdzjHB1/JF6I=; b=aUh1HkwY28hsC8iuk/eKF2nRzLix2GT/yw7E1q7D6i4frR+l1AJtJQXZiMsx3fXOcA FtHhtXFmFu1nIFekKqf8ft40jg9vwiOTjDz+Kf5ah5kFQtzo83k+DtGBU5+/uP+lidng /e1rmMTrHuLfGF8meby3wwbENUjGmqmT+vCypi+Pudiuy2LscQZYJDE1Adnqz8QSLq6w Kv4RjkRwhdattHbEbMBBMjSVSb2cq9xZeG5QHznvuhfAw64qBD1dLiyyKNPbpuyEPo1K PJbqX+RkLdR1Ntdg6uYGsn4JLKWCCfINRccgmh16xFZOjHWtJkV8o+FJdGP9FJcT4JDc +wGw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1771911878; x=1772516678; 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=WILaMGNYgo59ciXOv8fCSdPpQjQ/av9tdzjHB1/JF6I=; b=CU5WXjM+i2Y+wnk2Qpg39Mc1TGr9KXPa0S9M7x6jffKQy3HfClTiwmzoqPcHFMIjHF VAtTjAn4PWDpMmz+8Ei9ller7VZa8ujZ72/by1pgAF8FU8+xlIPYoRQsx1U3NOKPhnEh 7XgmdnjQVRfCEVQP+bM9PptcVXYpAx1NEEyUdYRhBMWHHoEBNV/7XFsDops9m79kK98r UeJB1RoP2Uo5SK8yPYCz4XPzHsHdkS4YNvF/aTYCG3HGqx/iGeW3jc41UDDiIKr7i2Lf NdlDltlZyFUqiHWadgrrH3N/FWXjM2OGsTjDqAm9GgIwnwwaf8eoV++PNvsym5r7z1Jb GHyg== X-Gm-Message-State: AOJu0Yw3zERezMUOJkgWGW7jOpSxFC4u7d/ryMo+qZexsyjyc+zfHW2R zZpbGVy6ay0vR+h0Z9nc1jxvr0xRQlKJrRU/9kFxxJJhUv78Uyysm4w3E3gMYxi4ivrrlxJqUcw jtxxwzFzjDg== X-Gm-Gg: ATEYQzzukXUFVC27RLC+3e8XHkPLukyXBPfd/ylVrGyuaS2nQ/3KJjCkUkV2471Vrpz 2uGt6FjQ7dYI1edQAjzaGfc73PK6YzzofRh2nEyAm+WAwRsOUG6o00ivvgbtkyPdxffww/OKgQ/ 983TlTijK9j4ov3OzeaQWo2WtYF/yoF37QTuOFDeI0CBmgp8ETMy/zXOmxohkm9iWB2fkY0hVcR 2ndPUU2cDOMCyYKXAMIhluteACR2L57e26oYHXd2r2VMUp8/5+8pqiVUCm1LEpMMN0pN33XmH9b SiHQi3imoCh0OcdxCTFRDSDRx10EN02q7K9oxZJneCtloCqNhV7ON8kDGTJZEmPPDuD04kv1LbE ZhN8H34ZSW3uTDYWZfRgEfD0m9RgvCmdYqjktPSF0foF43JiI29Dy+BMxWvAdVhpWbjoBBisQUR 1LdVjFZFPXsW3okmPDAEKiDC0RXxgO4aTRODmoZlWN/b6sdLJFFt2P X-Received: by 2002:a05:7300:e80e:b0:2ba:7a5f:9e5b with SMTP id 5a478bee46e88-2bd7bd60186mr4088828eec.35.1771911878029; Mon, 23 Feb 2026 21:44:38 -0800 (PST) From: Richard Henderson To: qemu-devel@nongnu.org Cc: Max Chou , Chao Liu Subject: [PULL 2/9] fpu/softfloat: Refactor floatx80 format NaN classification to share code Date: Tue, 24 Feb 2026 16:44:10 +1100 Message-ID: <20260224054417.32430-3-richard.henderson@linaro.org> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260224054417.32430-1-richard.henderson@linaro.org> References: <20260224054417.32430-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::1341; envelope-from=richard.henderson@linaro.org; helo=mail-dy1-x1341.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: 1771911903659158500 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 66b0c47b5e..69b9041ef0 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 Sun Apr 12 00:57:42 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=linaro.org ARC-Seal: i=1; a=rsa-sha256; t=1771911912; cv=none; d=zohomail.com; s=zohoarc; b=aXWVJoUPfJ8Gj882Ax/ZC3lwjFQogalp2dlBRlK6Ey8ypeNDsP2IF8qYCckYhT9NC7lC++MWdSpsoal0fhmRs0HRAl6SeNe8N2ODC4PNVF6ClLWgVnLVtNxj/QC4Ye8QxyK8JCaeAyClGqWF3mUQEgAwdTC20ON3wsyLSGrdWO8= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1771911912; 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=UBGXQcBMD1EX0azJRcepjdD9pAfybHT3DcyzgPH081vXjV15ud+NVNolEbQdruPbBrgwlzZH1T1eVwQzsgg7V0goUh/a5iTvl8y9gScFgAIW1FVzPdgJ4tZ7j1KtCq2SgpfeNh/ObMsbFhQyB6TsQw7MHPHsa4csuABOhEp+B5Y= 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 1771911912555599.5564912304425; Mon, 23 Feb 2026 21:45:12 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1vulEB-0003ot-5c; Tue, 24 Feb 2026 00:45:04 -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 1vulDz-0003ok-75 for qemu-devel@nongnu.org; Tue, 24 Feb 2026 00:44:47 -0500 Received: from mail-dy1-x132b.google.com ([2607:f8b0:4864:20::132b]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1vulDx-0002IS-4k for qemu-devel@nongnu.org; Tue, 24 Feb 2026 00:44:46 -0500 Received: by mail-dy1-x132b.google.com with SMTP id 5a478bee46e88-2ba895adfeaso5017399eec.0 for ; Mon, 23 Feb 2026 21:44:43 -0800 (PST) Received: from stoup.. ([172.56.177.223]) by smtp.gmail.com with ESMTPSA id 5a478bee46e88-2bd7daa37c7sm5958093eec.12.2026.02.23.21.44.38 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 23 Feb 2026 21:44:41 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1771911882; x=1772516682; 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=U16My6skclzhMY8OQMMcJU53wUCgJ45X0DoqChxGCcY7L/kWiOsnZzZFjHTrzb21fA OvqUt5qRoZ0N9lwWhS8Okdpwwd8r64v6en2BOYbJfWCJL0XBQPjFCEQYeRCgkJctzVF2 Rcx0Aw3acu+/X2ItuIWP0eRWLALEzF3fSyL7LXKOR3e75ZgfWKS3gRCB2cywdxKXDgk2 PLILSGteLXx/JH0VY3/9TsoCR78S2KyoBXoCCvx4r33gUvHLeWSrRFhBNNbEOURsuMTm XKbccG5HV+yLCVjMqWTfEd9sytHmI9lgA2fHheHnNjgPsQI1dpnGWoNGIHhvfSCuCg1u kZnQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1771911882; x=1772516682; 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=Ysb7PKeLgsK6Jo0WXKMp3zicsVPTI8T/cA38vHmfGpnRydJ5RCkMO6MmOhcXGDwiew oWWoc4eqPMGelBT/q4ZwakPShqfGT1CGKozjPXY51d/Ktynb9kGzn9CHZZfTz0644b4L boam4qPVGMO0foy4MbH/e1Uq1KEXcpySo18G9PA7zzos7xIczMnNsK/BhDu34m7Wnop4 hu7gXMWopeBqhGTP2oQCeHg2eebNI1bgRb9jhlJm+W+IbgGIbg02DdbXmiwVarC5JKDa foBCeRH4OAOncBx2d3w8BgXJ+6tOJFtw8cZBnTD9YQOda4AyJgp+CwPyptuh4YJd5zKs teOA== X-Gm-Message-State: AOJu0YwXjJpjC0OcIxTzsqKtMRRmKH2HBd9GvqeXMWy64WgaSqRy9jyz lDdfB1WECNlsmjyogjIt4a389liQQaBh31xCMwpFNbgO10EAYgxAA+jDsa4qzK6GgXhcrQuXDRI oGYE2qLg= X-Gm-Gg: ATEYQzxZ9gO4lyMqmBFy+EXlEMxS9M+C2nmffFxy7wHCcCNRsRWdm3GVPvzPoAaNnm4 YkN5F80JUeKgw7yMXmqzqctXYB0X7tAHIvO4cjjK6bDj+CcG+YTMaA7PAY2GrT8SrUEIRwghYPR dWP3N3FjfoUNzjvOU7zpU2oPHarr2yI5gDnSPnrPAscrB1SIzQAKDk2vL0MOoiwNVd7S8OIdd2i ZJH4844wqYAjLK1V3FVPffFwp2mP2LKIsGx1IAVdrV2bgrCtgOWRzviRkX/qWMdSvpglS22ctfH cjQj34EW+tTef8sbESB2G2IjQbUg18r+LNYuG+OhlC/Z9i0vAB0VByVE5aWocrxgGfCp2hR2qqT uZEPEd6Ppc4zONH02gtoycADTGHWGhs2BXm44Ttv0HFbR0HToKelaGR7cJF69D3+Pmo7ufH+At4 PlA5B6j1+sBOafJGbN5GUBDiBLdevYlMuZsy10J3Zmx9IgV3/xDj7g X-Received: by 2002:a05:693c:3944:b0:2ae:5e93:b69 with SMTP id 5a478bee46e88-2bd7bd24e03mr4123931eec.29.1771911881868; Mon, 23 Feb 2026 21:44:41 -0800 (PST) From: Richard Henderson To: qemu-devel@nongnu.org Cc: Max Chou , Chao Liu Subject: [PULL 3/9] target/i386: Fix pseudo-NaN handling in FPATAN/FYL2XP1/FYL2X helpers Date: Tue, 24 Feb 2026 16:44:11 +1100 Message-ID: <20260224054417.32430-4-richard.henderson@linaro.org> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260224054417.32430-1-richard.henderson@linaro.org> References: <20260224054417.32430-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::132b; envelope-from=richard.henderson@linaro.org; helo=mail-dy1-x132b.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: 1771911913644158500 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 Sun Apr 12 00:57:42 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=linaro.org ARC-Seal: i=1; a=rsa-sha256; t=1771911948; cv=none; d=zohomail.com; s=zohoarc; b=n1JfZEk8ApKCraq4iqoRHHLrNbEPYyr01FXtl9LcS+CDYL/csebnvO3AHJKqBE1gdC4iMECORUjdT7pDla76p0qWQ2tvikvB2mhI+HmQfVRcfEiPJ+ZkqcBgQdA+rDbpM5+SpBCXpeaZuMoXZnhsGK8BMHROCiRK14XQerh9ayg= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1771911948; 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=DVUWgEvjLQB0NDOZm7G+U6gmWtQsgOgvHpv/+3PxHe0=; b=BccPPmLY+v6ywTooSmn3Tcof7wqlzF7JHL/eyLEtbRhjy9OOyWmZk2sZO9533nvJBQvCX+OkHDX4EZq38rNJU0cM6UtfWVfQR2Qj9IX+6BqMO0Y02PC+CA59zLK9/UpHEH79rHhVJRPjd1aV4d1lYKb/K2EDZ0lqFTReZjUCiA0= 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 1771911948443866.5841648883746; Mon, 23 Feb 2026 21:45:48 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1vulEo-0004Ce-2W; Tue, 24 Feb 2026 00:45:41 -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 1vulE1-0003ox-5K for qemu-devel@nongnu.org; Tue, 24 Feb 2026 00:44:55 -0500 Received: from mail-dy1-x1330.google.com ([2607:f8b0:4864:20::1330]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1vulDz-0002IW-7t for qemu-devel@nongnu.org; Tue, 24 Feb 2026 00:44:48 -0500 Received: by mail-dy1-x1330.google.com with SMTP id 5a478bee46e88-2b6b0500e06so6429932eec.1 for ; Mon, 23 Feb 2026 21:44:46 -0800 (PST) Received: from stoup.. ([172.56.177.223]) by smtp.gmail.com with ESMTPSA id 5a478bee46e88-2bd7daa37c7sm5958093eec.12.2026.02.23.21.44.42 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 23 Feb 2026 21:44:45 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1771911886; x=1772516686; 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=DVUWgEvjLQB0NDOZm7G+U6gmWtQsgOgvHpv/+3PxHe0=; b=I03uGeldf1T3JC9TVlMx1P8W5Rm5CZo6bwOSRFofRfjiQtxsZxJWglQhXp7jcWR8UI FCV7IAZUrTB6pmCSPcU+eGHLZu/CYc9DOk03UZMCNlupDm8B/oo9fklMetoW6gqDDZhq YrMIXXWD0CiJCCyrUwmvQOTCwBy3ZAGJQ3+xnZhowN6zqMaBoOdjyq5pRoxjtNaqWYRc eBBn3ZK2lwPisJmUcFbzF8IBpJzKBb+XhreXsLzRwW9bMQ3Injg0IYXm6B7NVjsgh6rc XjNVV256WagodVg2VfZlWvdMNBjMxj2RXKS+G9nJUL2/6ThtbIXPSUk/syR+DdURWS+V VHkQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1771911886; x=1772516686; 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=DVUWgEvjLQB0NDOZm7G+U6gmWtQsgOgvHpv/+3PxHe0=; b=FtN6gASc//VO+AUb0pGOYhIXn2g6RE5TKlKaJ51T84Ni+lbxd0XfIhqXq3yE5SQp2s wchCB2ApL/gTPeJLxjEw/xDfBGihUEB8HRYeseE/4ZGyHnhEUfsSZhYkXxekxVjR+Qhn mUQ0mPDQFgLj45dxMWNs3ESxBy/EVf/s66qvVmrkCnh+SCMP6IYN8qNOdsEpQ1UxL8S8 xil+lE9D902m0wjL2wS0k5dB1vK449bYT7E/3MYcQyRJHzXP0K3laSLb/0NMi2uwzo2e yLxeRrnfogQG4fVHSoBnRPP934ooMFrRt4Zl5RYNoe4k5wUKUQJQyiiYZoGlD5MloUfh TCsA== X-Gm-Message-State: AOJu0YyurRr2aX3NDI2oHw/PHTqdaQn9IOl3X+R/OH9i9qFzvH6tzPim syzEmyYrWVqJDEqG1BWleaEMrB0N02KSSvsBFl2i4+OatVFRTru7JkywvdOC9b+TSLy5MV1mVkw XZfa9jGg= X-Gm-Gg: ATEYQzxzupa4WhUU4n4tswlSB7iT5dRiBdhTAfigX+rDlueMqK6wQFHOKsS5SkXyojA zPutY7ea0xOwRHtd525OPUlibo33G7GQpM3gJcEkx1tthvKW2+P9fLJguZi0+hp4U0u3FFeqG32 Y0nKGr7yf173gM3uJ0sPcA0oX90xvfAKI/DaEySO6sYZODSM5u6qejAviffT4vUUHKf2WAt6QPw 1VFKdcjNzCWi4al3O4wIecuL5988fBOsIGbFzFjRTDANwdylV0UBDO3IQ79Su3iJdQ5Uxjg4yHQ nqvNuJ0Rn4jaOPBDvow/8kMbo6o5zc/3gWplYLy+O/hHPLYLP6Mz4+IoscHs+9qzoB7v3Yhagh/ WXzZrHBZKPNhzi8o3eptmvTxNM5VBPwyGQOeRAHqOA6mAE8ZAa3VbOj+l/QF0w+qAsqQgKif43o /hCNykUr7tzyAa7LKCpuegw4vZ5qwiywEANx27HKFyK1zcRTnumYLc X-Received: by 2002:a05:7300:6c9f:b0:2ba:8121:3f81 with SMTP id 5a478bee46e88-2bd7bd281f3mr5679297eec.25.1771911885553; Mon, 23 Feb 2026 21:44:45 -0800 (PST) From: Richard Henderson To: qemu-devel@nongnu.org Cc: Chao Liu Subject: [PULL 4/9] fpu: Introduce FloatFmtExpMaxKind Date: Tue, 24 Feb 2026 16:44:12 +1100 Message-ID: <20260224054417.32430-5-richard.henderson@linaro.org> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260224054417.32430-1-richard.henderson@linaro.org> References: <20260224054417.32430-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::1330; envelope-from=richard.henderson@linaro.org; helo=mail-dy1-x1330.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: 1771911949944158501 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. Reviewed-by: Chao Liu 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 8740975348..8d8e576757 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 79b56014ab..455bbf281e 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 Sun Apr 12 00:57:42 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=linaro.org ARC-Seal: i=1; a=rsa-sha256; t=1771911967; cv=none; d=zohomail.com; s=zohoarc; b=AaH0R1JJmtRYgTkFsm/1GlOVZZKfbtG3GjiGcUmN/1SwncnWt6wDUJ9OLIItTcwOhoYF4avxBwOw6Xomf0/b3OfHr+o+Z+PjRwBnQaz9NmM+Ril9fOCEXilk5L4OWEScMFlLj3/CgegO29AToAkV72HF2Q2TKlQGxA5lvHdBfW0= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1771911967; 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=X6XPtUSpRFE7xmawHfhRMeMmmluweS9VsVD+lHKg9p4=; b=Yo7b8mnltQFMz9pTZYXRvOKGfaKFTidcGtcHqdMeAZPTI9miiadwY744WePq3vkB6f4zFDSHwRyJsnVk8lkL9PS+YDASTxI8Ahqztrf7kJV0Carc0yplooQb5HpkulGZU2Cl+Tc9F5iNPS7cp1cwNCYstTHhDUSm1GP4n2Y+Qu4= 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 1771911967144102.53393384554204; Mon, 23 Feb 2026 21:46:07 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1vulF2-0004TB-8r; Tue, 24 Feb 2026 00:45:52 -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 1vulEF-0003xE-Em for qemu-devel@nongnu.org; Tue, 24 Feb 2026 00:45:04 -0500 Received: from mail-dy1-x1334.google.com ([2607:f8b0:4864:20::1334]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1vulE7-0002Il-3B for qemu-devel@nongnu.org; Tue, 24 Feb 2026 00:45:00 -0500 Received: by mail-dy1-x1334.google.com with SMTP id 5a478bee46e88-2bdb09bbedeso211916eec.0 for ; Mon, 23 Feb 2026 21:44:51 -0800 (PST) Received: from stoup.. ([172.56.177.223]) by smtp.gmail.com with ESMTPSA id 5a478bee46e88-2bd7daa37c7sm5958093eec.12.2026.02.23.21.44.46 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 23 Feb 2026 21:44:49 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1771911890; x=1772516690; 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=X6XPtUSpRFE7xmawHfhRMeMmmluweS9VsVD+lHKg9p4=; b=siad2PnMZ9A3a74iiSPJ4yNiWHt1qe4WoxbfRgBNX0Xl1T2YNxm0Y5wZutNV+76vFQ kzzvUKYm/5pDIXlkkICxlXpxqweONekSbb2GtROzVMDfcE/H6xiAPfahZteTJHuc1AUw KpIXkpmMMXW2AwZpfmkQMH3SKbjUaoaxnmYMxFN8zqD0ZAzJknL/Q8Exl+xY8ZCpGhEP 9Kh1AEyxMw+yTWMh5di2G1R0jOBsOCQLYKcSAuU5wXxoF9ekeuAdrEPQ7ja2njZpC/VE oiQyRivhI+oS8eK5RuGBpE85bGsVYLMsGIKwwIAlrS/pkAUasPjMpbdWpKleRvKlCsLv PLvA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1771911890; x=1772516690; 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=X6XPtUSpRFE7xmawHfhRMeMmmluweS9VsVD+lHKg9p4=; b=uYrLV+RhQfGmdqkL5RQtVOsiiLNMwGbGS65j91FZ+IUJyfWW/r95BNhewZECaU/GPs +dEvJjNaqn5afQFajSnXuzuE30bm18rY0L5gwwih5cH5cODcUI4pKRPoP15ZJIiVlo89 uFGkanTgBiLX0dBLVaxVxKANq/ngWh0wi//PBKF6VWqCRbbNwEOu49GqTfFPfKtn9aDx UskToG5CmlZ9c5NkUlu/LKu8iOw1fRt3Kxk5OWnhViaPus/sUhCi+tsbx/mpmSPDO8ry xDbly/F0csied0L85i3FyNeCQDis7icj1+1zgjV5Jz8n5sqplkmuqu1q76sxI8Yb0UeO U7rg== X-Gm-Message-State: AOJu0Ywp/Tr2oZBZ/jOBSNe+W2HmhNX+I82B2yJgAvto4Xecjf87zP7i 0RgLr0uIRaebfzfzKBKewDa6iqKVECViZlSw6/eP4pEEUpI0nnWvnpRYb8bKBzycALm1hvln463 Qcrzt9W0= X-Gm-Gg: ATEYQzzyIkiWTShZFbBLtWsrPd6B4KronCZap18E56UUAOT3PHb9LyUnoITc9R5Plbt vj7FtlFxqpg5VIShnhT2AC1A7y7WZogoxiHVl9KwHEE7cV8GikTWjJ473jy6PO/stbM0SoyztYN aYVWzmMsVypCmS3Z2LNg3TMCbC2q1K4LGD1cGNgsr5M4f333/gzTCyJivTwBcH17vzHK3Mahn7P pUUFcYHOGkSJSSzoxviuSLquZzdCTZ0LQ8wKT0qB1o8qx5fZ7aeNQuuXovWPH4rPON8mMEQgNDw dS7YiJcwhXhLRy7yeUb0Hwli+BZtNXO8PeOS1RmuKucvfgc0Yx7pQSTZH1/1ykbfXudBlNISePA 5c5+Gn+Hnzf5zBevnxG5V0mJRqpbv99PKBIrcu2jBsqxNwYGrWm4K39NJXUfP24v0bUMzvtZ5Gm 7i1hxGEV+//6cuBXugzyyKYqFmOJDehFqnyBp0AlZEwuSxgWto6ltnXqD8bpvzPAc= X-Received: by 2002:a05:7301:4443:b0:2ba:7046:b6b5 with SMTP id 5a478bee46e88-2bd7b8b943bmr3777807eec.15.1771911889860; Mon, 23 Feb 2026 21:44:49 -0800 (PST) From: Richard Henderson To: qemu-devel@nongnu.org Cc: Max Chou , Chao Liu Subject: [PULL 5/9] fpu: Add overflow_raises_invalid to FloatFmt Date: Tue, 24 Feb 2026 16:44:13 +1100 Message-ID: <20260224054417.32430-6-richard.henderson@linaro.org> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260224054417.32430-1-richard.henderson@linaro.org> References: <20260224054417.32430-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::1334; envelope-from=richard.henderson@linaro.org; helo=mail-dy1-x1334.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: 1771911967963158500 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. Reviewed-by: Chao Liu 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 8d8e576757..9d06a1bb59 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 455bbf281e..4909ff7418 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 Sun Apr 12 00:57:42 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=linaro.org ARC-Seal: i=1; a=rsa-sha256; t=1771911962; cv=none; d=zohomail.com; s=zohoarc; b=mZ+rYylEMROkhORuWlLTAHiOW7TQFDWKdp9lHugZ0zBW4/I02W9ketf/1q28wdv6AtDKgampm7mPzjxG+bXZ1Rbpp7s1WHoP/CgTmvFbuggWoKmWPUqjsTjN4+r0ZpWOpIOSN0KgVa3fthP2sBA5+ekWw/nXZw1Dv6Z0HK2XtEc= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1771911962; 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=tx95IX5iqClxkaMl43usMjzb61BBE9oTV3e21KmOpRI=; b=iseBdwn1bFpBvAPQdU0XNVriqS0lBPWHUNcnJBiD4dN2UWG1R8S9GpjEb+eGwNVPVL2BMOmFrPa3uDPFySs/tXkR+Nm5MnAJzg9iJe+9iq2KfJk95md/OQjvjA7BteWIcppuWkP4ihPGi2WAjy/ViizzvXwRqEzLtYPV10r6tcA= 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 1771911962058523.6264269191711; Mon, 23 Feb 2026 21:46:02 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1vulF2-0004XV-RT; Tue, 24 Feb 2026 00:45:52 -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 1vulEH-00040s-Pv for qemu-devel@nongnu.org; Tue, 24 Feb 2026 00:45:08 -0500 Received: from mail-dy1-x132c.google.com ([2607:f8b0:4864:20::132c]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1vulEF-0002It-5h for qemu-devel@nongnu.org; Tue, 24 Feb 2026 00:45:05 -0500 Received: by mail-dy1-x132c.google.com with SMTP id 5a478bee46e88-2ba94dbf739so5586961eec.1 for ; Mon, 23 Feb 2026 21:44:55 -0800 (PST) Received: from stoup.. ([172.56.177.223]) by smtp.gmail.com with ESMTPSA id 5a478bee46e88-2bd7daa37c7sm5958093eec.12.2026.02.23.21.44.50 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 23 Feb 2026 21:44:54 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1771911895; x=1772516695; 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=tx95IX5iqClxkaMl43usMjzb61BBE9oTV3e21KmOpRI=; b=mXYm+VaEFopYU27aIPZnM0J8OQG/SW9JnVPD5r8U9V3sCifjnTtvS0tSE94TLczRFr Vxu4+/iga+AMVn+J+QyCy7bUOajxP1T2ofqnPBUcsOPHP0+duNojaDfTm3ee01e3KlUM 62tbvtBTzxFyT5WRYQOj6N8GZn1o8pC4y22/l0hRw59f9yfVCb/1uoL08dzYbzPySjyp QFyx1s+PN9906zhaI9nwe5bfraOrG96fW70tQxLih+cAKB5L8R3C+VfGWLQbTLB7y6sg X8HCk2l4xgMJrnTnb1ZVBEdwpzv+H2F8U38+6jx0g3yAPa1Tgbm0e8CoaaCw1Kc721jD 7deQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1771911895; x=1772516695; 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=tx95IX5iqClxkaMl43usMjzb61BBE9oTV3e21KmOpRI=; b=RqIX1G3s2O3j+nXjUsa+bt19sVyP2qJL9ubdj0GUt2W0jr+hzpxOasJxwbCouQsF6L oe0SvcUUCpfd9Y3ptt+j5XBlkLvdNsipZ1dStf5HPR1Si5v9i5XrB4FwGe5MX2rGpIWi u4oKEVS8t133SfB1rnLL6Awiod6JOT2dLnJrBqczSRm8PYq8xvY/I0e+aUaVHEU3CJ0k 5FacTxJNWdABawyXcevDAhl/1MA4O6atdzuxdMpKSTdFkyxu2lFPdDYS1rXMblXa6KqM OppYJ3csBaNKKmFf58AJV+XFeD/HUvqaMvd7Vtim4DoW+Mcef7wKweaK5XrapGZBAI8t 6wDQ== X-Gm-Message-State: AOJu0YzC3nRwQLa9TTpn2vfopma3itmCi5NATeXXVCx3wWSHO+c4yMqq +jHxmudOrSsXXARcUaBtHnczBIkB8/PtDS+qWu9v2CQG1oEegHTBgjj5y9jhCP4atWzQOaVJJei 34rX6IUs= X-Gm-Gg: ATEYQzyVQfCrZVzTfysQqjjwG3cEkiF1edEOAPQ5s23pNuEiFxc2/970K2EODY+lbEy bKC2dJEeWZpFp6wyf2RjcsY3MHkZIvx9mwBsCQ+FINEjj82U37IxBlcEcwTYTmMk4swx9zGS0B3 Rl0Bx4WeGBlnCuLBu6lSeBysSsLCYU7uDYEF0jpO3Cc/DzSpfMfDjJQz+dOb8eyzuV/yb0SHMTT BmdBq7/TAJD37UfPRNq+X7ArVcu2Bvw43mQjFCpHHtWuTuhgP05JmvKaAJdq6QpFIQjOTmG6aaX qnYhIRSqx/Sr9AuAif4Zx4bVTEZwY4pxt2ZQcK/X2fFgn62KWbAxUTQMjXThi9zg8ngg4TKm0mZ dQXTvMqyrfBrFgq5mMUHkU3u1Y7+62My8+j6X3eSQBMbJoXZgWge11o0kk/KtteRK5YmwBBOiQb DPGpG0MRyOsaFN1FYLVJH8Ng4VA94FgdgOkCBGJ9bpMkJvEEbJS7DM X-Received: by 2002:a05:693c:310c:b0:2ba:a60a:15ef with SMTP id 5a478bee46e88-2bd7b9d3a70mr4127549eec.1.1771911894452; Mon, 23 Feb 2026 21:44:54 -0800 (PST) From: Richard Henderson To: qemu-devel@nongnu.org Cc: Max Chou , Chao Liu Subject: [PULL 6/9] fpu: Add saturate parameter to parts_uncanon Date: Tue, 24 Feb 2026 16:44:14 +1100 Message-ID: <20260224054417.32430-7-richard.henderson@linaro.org> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260224054417.32430-1-richard.henderson@linaro.org> References: <20260224054417.32430-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::132c; envelope-from=richard.henderson@linaro.org; helo=mail-dy1-x132c.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: 1771911964000158500 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. Reviewed-by: Chao Liu Signed-off-by: Max Chou [rth: Split out of a larger patch] Signed-off-by: Richard Henderson --- fpu/softfloat.c | 46 +++++++++++++++++++-------------------- fpu/softfloat-parts.c.inc | 15 ++++++++----- 2 files changed, 32 insertions(+), 29 deletions(-) diff --git a/fpu/softfloat.c b/fpu/softfloat.c index 9d06a1bb59..b3c4104854 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; } @@ -5435,7 +5435,7 @@ static void parts_s390_divide_to_integer(FloatParts64= *a, FloatParts64 *b, /* Round remainder to the target format */ *r =3D *r_precise; status->float_exception_flags =3D 0; - parts_uncanon(r, status, fmt); + parts_uncanon(r, status, fmt, false); r_flags =3D status->float_exception_flags; r->frac &=3D (1ULL << fmt->frac_size) - 1; parts_canonicalize(r, status, fmt); diff --git a/fpu/softfloat-parts.c.inc b/fpu/softfloat-parts.c.inc index 4909ff7418..09be686645 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 Sun Apr 12 00:57:42 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=linaro.org ARC-Seal: i=1; a=rsa-sha256; t=1771911959; cv=none; d=zohomail.com; s=zohoarc; b=T3G0ORyzFdh2tIxHX4ToEk+DGsdVymaZnugHLUE+z/ly1ZO3ESsWaRqPE3Jg79aUUUKiGSm3GwZVt2JM5exwRJ1SrOV4CCPZdyJmEiTZBfS5z9qTfO6sDvsqAX0jcYZX61qWAgehPKjXibcQwZc+bQF5Nt8exzXS2Wk1yRyyRJQ= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1771911959; 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=6qDZd6la+aXT3IiDcEIYe1ygHeyC4Z2Wam0iYSk0jXY=; b=HyU73+iey5bO5NQT7oe2zjuAzkA6M+bEMp33iIhHIF09Bv0zs9GYUqiVi/MD0JWMkMGwcddBSHnVizHoa4zuH6s3PcqqyHMHOiM3by6r087Lgt90fkr3jNPXFZbGIYQlQqFidH0P0rgQl/SidaVY/4Uk7XGuwEMGQUZgJyqZp/g= 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 1771911959106197.749857534895; Mon, 23 Feb 2026 21:45:59 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1vulEx-0004MN-NB; Tue, 24 Feb 2026 00:45: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 1vulEI-00040w-S4 for qemu-devel@nongnu.org; Tue, 24 Feb 2026 00:45:13 -0500 Received: from mail-dy1-x1329.google.com ([2607:f8b0:4864:20::1329]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1vulEF-0002Ix-6k for qemu-devel@nongnu.org; Tue, 24 Feb 2026 00:45:05 -0500 Received: by mail-dy1-x1329.google.com with SMTP id 5a478bee46e88-2ba9c484e5eso5110270eec.1 for ; Mon, 23 Feb 2026 21:44:59 -0800 (PST) Received: from stoup.. ([172.56.177.223]) by smtp.gmail.com with ESMTPSA id 5a478bee46e88-2bd7daa37c7sm5958093eec.12.2026.02.23.21.44.55 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 23 Feb 2026 21:44:57 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1771911899; x=1772516699; 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=6qDZd6la+aXT3IiDcEIYe1ygHeyC4Z2Wam0iYSk0jXY=; b=v7S8Eu4ikP/qLL6rx28l+UgQV02R27GsC2YjMZ6/sU7sLzzT4mWMOn3MjrKpLnIZSQ 6VFWMkP7YPA3h80my1dh6slF4biSDYfMszE7UbN8cFObzS02AVbFbCesAQTOrkoK+fW4 JAufjLog6l55ZeBg7gafVybgPvkxWgMrTRENpm+E6LFWn+pPo2XZZNHJM2NonkYRII79 vZP2nrGi2tjuVh84WDLc8xmH1+AxafatLdincJiUTqzX+8MwaBkhERr7rg3hvjzj6nC8 EB8EiJTM7l1dfo328sJQcLzbgp2OoQlvihvTI9jDUDSw1NlofLbY032FMqe33JNT+2zz qqCw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1771911899; x=1772516699; 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=6qDZd6la+aXT3IiDcEIYe1ygHeyC4Z2Wam0iYSk0jXY=; b=eg9NtkZMcpf6JTDsZIem4s2CKpZDJ8DdocNlgt04Sy7iNX6alCTbLdTy1Umpq4nie6 2FJZTgfrt4Btw/q6z4Y8gr1gzy7eQZtdpk+6UOYhwj6KMy68J1CFMFGjZ9zloxqXeLeC zjRY1mjmBqGGOAI6iMv3MAOkFjKAVRxbfXYy+MkYmIWM1QjDDT5SqiERxJnApkXsDLIm NJX3pHsJ8G0MuJtZKFqznEpiCLzvpYXTHbko2iNIV3IrTcveBCnmXh63xEZyNdUf/h9r mORdKxwGHzgklkcjzWlNOqFFxUpfAKxZE33SIeMxrJQ7vmqqOXAb5Nu0D+zxf+fzIAf1 efKQ== X-Gm-Message-State: AOJu0YwTwcwNjNCtrswVnkV0b4WGivFLyZN6fsASfoWgGOqvgaHEAGnN dZCtC/ZaA6h2PGhM97asJvOT4lX4/l2ykULwiSmS+cYi4RO0hyMD3s2Nzy4kKCI3kflZxQQBsIY Xqvby3vQ= X-Gm-Gg: ATEYQzyYfDuHh+hcY7x70zBEexIYJ/bGkGHZCjss6h/YLt3DEvrzIvB4tGyDKt4dx4S IOqnjomvoQS/OVHjT/NHFzMjcrBPCvcYyEHonaMsNLWo92QkM/l1juWnSqKznDm4HWFHkUSoBFK eMGk1wjQUEQzd8A2uPSIDUlpPH/kyRjfKcNARUY4Ez3839jAq64gI8W0bxJFsbAdoNRIPn4E1o/ grMurF8CTknHFANwEhpNB08e34K8kEB0f4YA0D+TiYfna6ceJcctvs9SLtB0dE8d+VRLP9g1Xj8 CYkoL6EsIKrxrQ9ysxYghWphRRRgLiHUIc1X2Qwa2VehUeWmveUwOt1KJhUKRC5kka8B74wRaik LX/VOKriB+lBqXPrIkJ+95W8f0vUfJOZgZABFFx4cp8P1/EcMVVh+xef9l4KwZShYZv3dbCu31u C30j9/OXOtcUUanPqMwMo+TWHaip/n4d0pchcDvjuNzP25gi9M97UwlEZ10tmwqVM= X-Received: by 2002:a05:7301:615:b0:2b7:8b4a:15b7 with SMTP id 5a478bee46e88-2bd7bb38617mr4407218eec.16.1771911898723; Mon, 23 Feb 2026 21:44:58 -0800 (PST) From: Richard Henderson To: qemu-devel@nongnu.org Cc: Max Chou , Chao Liu Subject: [PULL 7/9] fpu: Add conversion routines for OCP FP8 E5M2 Date: Tue, 24 Feb 2026 16:44:15 +1100 Message-ID: <20260224054417.32430-8-richard.henderson@linaro.org> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260224054417.32430-1-richard.henderson@linaro.org> References: <20260224054417.32430-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::1329; envelope-from=richard.henderson@linaro.org; helo=mail-dy1-x1329.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: 1771911960174158501 Content-Type: text/plain; charset="utf-8" From: Max Chou Reviewed-by: Chao Liu 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 | 85 +++++++++++++++++++++++++++++++++++ 3 files changed, 98 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 69b9041ef0..4385462992 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 b3c4104854..0dc769283d 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) @@ -2772,6 +2801,35 @@ static void parts_float_to_ahp(FloatParts64 *a, floa= t_status *s) } } =20 +static void parts_float_to_e5m2(FloatParts64 *a, float_status *s, bool sat= urate) +{ + switch (a->cls) { + case float_class_snan: + case float_class_qnan: + parts_return_nan(a, s); + break; + + case float_class_inf: + /* Per OCP, conversion in SATURATE mode bounds Inf to MAX. */ + if (saturate) { + a->cls =3D float_class_normal; + a->exp =3D float8_e5m2_params.exp_max - 1; + a->frac =3D MAKE_64BIT_MASK(float8_e5m2_params.frac_shift, + float8_e5m2_params.frac_size + 1); + } + break; + + case float_class_denormal: + float_raise(float_flag_input_denormal_used, s); + break; + case float_class_normal: + case float_class_zero: + break; + default: + g_assert_not_reached(); + } +} + static void parts64_float_to_float(FloatParts64 *a, float_status *s) { if (is_nan(a->cls)) { @@ -2836,6 +2894,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 +2923,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_e5m2(&p, s, saturate); + return float8_e5m2_round_pack_canonical(&p, s, saturate); +} + float16 float32_to_float16(float32 a, bool ieee, float_status *s) { FloatParts64 p; @@ -2923,6 +2999,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_e5m2(&p, s, saturate); + 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 Sun Apr 12 00:57:42 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=linaro.org ARC-Seal: i=1; a=rsa-sha256; t=1771911963; cv=none; d=zohomail.com; s=zohoarc; b=lh7lLlX7Jn/XYYcz5COJ01N0DLhwajFbMZaSSuRW5Xpmp8PKXIFXEAepp3detgFGvQWVFTW1irmis6cBWWt0mlEiu0OFeRfrt7Z9/OzE/MN3DIUdsc2FpCm24yrnCJEDCdeZvrm4X0Pb4tHyD/CBEH+bTbvTuSSZ9gylIFj1NZ0= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1771911963; 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=Vey5Rh3waHmkn33K/lS5TwQ0lXIHYR1iFIEDzRn1i+k=; b=RaBPWjA3y1bWr60oUIVdFxM0L9oEr3NNEZWUjrUVz629m9m9Ff4zip5sOd5aDOQbwIhwGFoaQDUc7WHrDNIAYa2ONsgCul5TguMDuqJDUJjVvjfDaX8OLzttbxPjc1g9DyXr6UOljl7mBJuR9b8t8lg7Wt8yPyoOwZk2PA771SI= 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 1771911963788472.9613963860262; Mon, 23 Feb 2026 21:46:03 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1vulF3-0004Z8-O7; Tue, 24 Feb 2026 00:45:53 -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 1vulEK-000415-OE for qemu-devel@nongnu.org; Tue, 24 Feb 2026 00:45:17 -0500 Received: from mail-dy1-x1335.google.com ([2607:f8b0:4864:20::1335]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1vulEG-0002Nb-UA for qemu-devel@nongnu.org; Tue, 24 Feb 2026 00:45:07 -0500 Received: by mail-dy1-x1335.google.com with SMTP id 5a478bee46e88-2ba88e53b46so2793618eec.1 for ; Mon, 23 Feb 2026 21:45:03 -0800 (PST) Received: from stoup.. ([172.56.177.223]) by smtp.gmail.com with ESMTPSA id 5a478bee46e88-2bd7daa37c7sm5958093eec.12.2026.02.23.21.44.59 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 23 Feb 2026 21:45:02 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1771911902; x=1772516702; 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=Vey5Rh3waHmkn33K/lS5TwQ0lXIHYR1iFIEDzRn1i+k=; b=B5+SrTUKjU3bb/J2wxftBTUSd+1h3fNTDR91QOVcXAAnFQVo+IAfCI7DDnGhyHm2ib A8XPIZBD+0kzmbrltFf9yFNtOwlFSusPKm05CUItSWjZ/m1wv+MpantCQFLNapz355Ia 09P7hx6CMT8EES0ObCc01nLiStW+o+7XcRjKLGkzhicmxpJ1+F+gUy9e/mAED7fiK+9N qw/njoC0iP0aMaKTAo93kS1/E6yEyOmt8S6PR42+cvCWc+A0EdZtQs8I8e68+0jRRR0Y 3k4/nS3/8RAjg4zWLiDO/dm+h4dMruI3B27Ivf6Ymcq9FYMUbaO7lNy3UE3RDyacmc3a DQNQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1771911902; x=1772516702; 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=Vey5Rh3waHmkn33K/lS5TwQ0lXIHYR1iFIEDzRn1i+k=; b=UmRO+uEvihtbGrDomqRxKbDCDMWd2qDbykAFYTkLu9EFAf20l6ZhWr3SMyk7HFMAZY Np2sYCPS+SWRmG2Wuy8w0v0IZkTqUoio0PqaklYd8Z2SwXPwwIPO4Fr1Suul19vPoIzX A76600mlAtwvfE7usVCWLxKO932orYe913Z9vv8mO0I/vUVTTDaBC3d2iGoIT/V7A/RJ RIBwQDc7vMuUmTMlUmWTDaUvIzJYtfFQ6uOzWNonUQhruwHrZFcEjtxlGMz/QgyYO9kT x+o373bMmGrpaD9WzLOtSte6Cu7gkFhHefFM4Sf08+hcGWgqPBmh0SuXOMuz3o1aTEas B32g== X-Gm-Message-State: AOJu0YzX5tsRa+18Jeb7Jc7ELXSwkv4WEc4Bd4rsNobODXTzpe/I/kxl C/4ohoQUx7JS0OnNmBTyopo0T3VCdDkQz6Ega6qQRbyp+maHpbVCGaXwFOPErEvrEGenE1pjg/m 8hMFvOl0= X-Gm-Gg: ATEYQzyfmfXE4xo5RA0xdt80Luq1clIhjGwiqvpvK9t+YXD1kckuxYpV25dzQ8mj9In WcF8CrIbDZGfes+5Mk8ZlYBHHER5PmqPzntfx7FK9ZeAo/4kTtKG/Z4plN/YnR1CS3ai1hukVlh PEen2Fhy2gBZJhts2+r3ECFBARuSrwXooiy8QuGzx2K2YJiOeNGlsoag6u6V8pP4wTVOonZA8W9 cTH8b2ZAP2SS9556x96SSipoSuFiujMCiiH4SjXPvu+0wuCtgzA2OLQluJJDfWq7yZsaYdJ1eqy vOmnqA45/ItcwuwLlhMk9ogXEoPVxC7i2fbIUBwZgDy3ykMax3irsszfYvKIiSYVbRo20B/B7P2 Dop2xvANlmdkCxgE2GA6wo7MjvWx2G9jdofDj/08VOrJcAV02Zvf6jdPdjpInmmbQJRtTup56pB 2SvRYiW3SFTZlzQunwxiwz6lRip13PgDsvjfJ8h1jbmtTVDiHwHdEz X-Received: by 2002:a05:7301:6505:b0:2ba:7c92:82fb with SMTP id 5a478bee46e88-2bd60769b84mr6846251eec.5.1771911902343; Mon, 23 Feb 2026 21:45:02 -0800 (PST) From: Richard Henderson To: qemu-devel@nongnu.org Cc: Max Chou , Chao Liu Subject: [PULL 8/9] fpu: Add conversion routines for OCP FP8 E4M3 Date: Tue, 24 Feb 2026 16:44:16 +1100 Message-ID: <20260224054417.32430-9-richard.henderson@linaro.org> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260224054417.32430-1-richard.henderson@linaro.org> References: <20260224054417.32430-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::1335; envelope-from=richard.henderson@linaro.org; helo=mail-dy1-x1335.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: 1771911965912158500 Content-Type: text/plain; charset="utf-8" From: Max Chou Reviewed-by: Chao Liu 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 4385462992..31d3f76d3f 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 0dc769283d..6e21882ab2 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) @@ -2894,6 +2929,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; @@ -2923,6 +2967,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; @@ -2999,6 +3052,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 09be686645..61b07307bf 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 Sun Apr 12 00:57:42 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=linaro.org ARC-Seal: i=1; a=rsa-sha256; t=1771911963; cv=none; d=zohomail.com; s=zohoarc; b=WdPC7DkAV4DB4hEQlTkXChrxnRu5bqMNAODzvoAqb0Z9eVB81+J7S+eherECx/6eokHlFhTuQEmPeD61ryQu2JL7ZfylPhmVDwroEPwuFQ51LA+InLp5C4OgG5PHhU1aTdUNP2NlL3s5wdsljqcxNDzxUrDT9kHXcqlWPfMVPvQ= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1771911963; 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=GrQzbaecMpge8pvlLhr8Mj9BD4e/GVJtWS3a7jCbeWo=; b=Is9W2koQseSGzV747Xdm+qomBErHvC1j/NTvdv721zyuAnwzivyEINWbt8ku6puObU+0oxXYcHmaLFeHTpC+xH96PzccVmFmVqyY8+2w9C/a77z3zh0Q96b7APGbt7z945587c4j89XmdxARVrhelMyaBSlcfEnqdnp4W+bsOb8= 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 1771911963990707.6974071523777; Mon, 23 Feb 2026 21:46:03 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1vulF3-0004ZR-VO; Tue, 24 Feb 2026 00:45:53 -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 1vulES-00047S-0Y for qemu-devel@nongnu.org; Tue, 24 Feb 2026 00:45:23 -0500 Received: from mail-dy1-x1332.google.com ([2607:f8b0:4864:20::1332]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1vulEK-0002UZ-GF for qemu-devel@nongnu.org; Tue, 24 Feb 2026 00:45:11 -0500 Received: by mail-dy1-x1332.google.com with SMTP id 5a478bee46e88-2baab3137bcso4285374eec.0 for ; Mon, 23 Feb 2026 21:45:07 -0800 (PST) Received: from stoup.. ([172.56.177.223]) by smtp.gmail.com with ESMTPSA id 5a478bee46e88-2bd7daa37c7sm5958093eec.12.2026.02.23.21.45.02 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 23 Feb 2026 21:45:05 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1771911906; x=1772516706; 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=GrQzbaecMpge8pvlLhr8Mj9BD4e/GVJtWS3a7jCbeWo=; b=chXcZZSFse8AlGJ2UUVdD9viPVuKhpV2B0yDYjp12keFRnUX6FxlIim4rhrtR38gG2 uwnJCJaCBeye88MCM9vhlA5cZZFLmuDZ/lWFvdiPD+Kylhq23tBEUf/ks9C/rJ5G87bu GkYL4uij03a8yXznYF/cF6hHdz3tic2NE7NtciFk52k+e1d622GqKAOE2NWHem32OIAU 8Prk8SOI/20PmipcB92lBBwXIIxUFk/WxvON2P+EzgCQ/RQlLT/49uVOgDsldWsdIwAO it/XdsOC5ABmNrUj1Q2geycJfFxYpXLIBVZKhbmpgIsiG4f+pBBsCRA9OV7UkrRAhyle 9/Jg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1771911906; x=1772516706; 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=GrQzbaecMpge8pvlLhr8Mj9BD4e/GVJtWS3a7jCbeWo=; b=G2nM+tNkQge96HxxddVBg0xgOKSyUKjUHHTaZAPZWaoKUT3uXcdjeIoARrR/8ytjBM SjdkCyTA7y3ZWF60hbhk1qOf0pQ3FZ1+Wq3c1JWkdSFV1bSCRuQ+iQvPuHuO6NwPfk7F SIyoUvphPn0iuNARJKMr/p15UQl6jLIxABT6lDb+vWGhMnOiqeuvEf1T7KpfMiESq72+ Dw5wYwKhKiO1oEwvRUsxC6S9lEeE+GrxAKDlOJ9fNBZO2c5tctTEQW/HGuLxHndFtTbj lm5xN9kXBy+o2yb1lWK8LL6SAw6xY0/yupMwcWCo8KFaK4p1tMsXBX/hqjjXuxxgvvfO 6pqQ== X-Gm-Message-State: AOJu0Yx4FcIlXelD3cpR5FRtQ49dKJfuaGQgC3c02Y6AkbTfqnXGhtML yRbZFxRdQRMN0Jt3aypYZfzJ6zo3UkGtkaq9v2i4JPhgMHujUQztQW30o6KOBaoxpLqS4HHlRgO nFExz/jw= X-Gm-Gg: ATEYQzwxmTK5U80NtNwth/CATUpWDxathaPYMIRovOyjVemYMOIOpXi9l6P61jpnUrc 0vf9o42vnv+Ccl9sN4W8YlEhj/TMI9mKl8KimotjIrwajf3WKSlJ8i4+HexK5NjXDfQ7+Znn1RH u5qgpasZrvpJJEwVTj1C9f/xN/i80DxwStuvhRcgLE+Jsa/+Wb4c7mgbiF43CzmZDhUWqBvrb39 USMnVNoASMGqmKomulLk6g8ydKNvoYkcPMnDm6XnpIpmoBTsePjGcCig/7Vmt6HMguYFmN/hkOm g1lqPgkCBckAgMCRhrPuDwljnRql7JWlSEK3mBCfndGxEFQc/DR1aeRPsO7k6tvlTWDgSzRYYhm fUVh0FOJUv2qOIkwmo4xB1J0BtD+A/Vdof2xGlYmivGI/LnXhU1GH8Afyg5N1cWcpJb8V9+0kBD dhvhOECNnalDLtPq9A9DStRmqJ3a3MMcelKkKzamOt7EG9+iaPGF48 X-Received: by 2002:a05:7300:cb13:b0:2ba:9350:d8ba with SMTP id 5a478bee46e88-2bd7b9eddb3mr4129243eec.10.1771911906246; Mon, 23 Feb 2026 21:45:06 -0800 (PST) From: Richard Henderson To: qemu-devel@nongnu.org Cc: Max Chou , Chao Liu Subject: [PULL 9/9] fpu: Add conversion routines for OCP FP4 E2M1 Date: Tue, 24 Feb 2026 16:44:17 +1100 Message-ID: <20260224054417.32430-10-richard.henderson@linaro.org> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260224054417.32430-1-richard.henderson@linaro.org> References: <20260224054417.32430-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::1332; envelope-from=richard.henderson@linaro.org; helo=mail-dy1-x1332.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: 1771911965919158500 Content-Type: text/plain; charset="utf-8" From: Max Chou Reviewed-by: Chao Liu 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 31d3f76d3f..8389a07b04 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 6e21882ab2..91c34307c8 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) { @@ -2929,6 +2946,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