From nobody Tue Feb 10 01:16:19 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; 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 ARC-Seal: i=1; a=rsa-sha256; t=1588635977; cv=none; d=zohomail.com; s=zohoarc; b=afzuAS5zmt7mmh5oq7OyulqndoMNhOQvfZSVEjpo4BAUVabOnM03sgCjqqS/u8kv7XYohrS7pSjDs5QzAdyzmig+GRy3h3xh5LIN34lihYx0/Fsswt8GHqI3KAH6A72xv0+kTD1zkaSywcmnGt+70UVxYUkKIzQcXE4mPk5DUIg= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1588635977; h=Content-Type:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=0ILu1U7iP+90fpkV/yX0TrhTmY6pIvgHcAXFZB0ChlI=; b=LvcDWW2nMfbX+u0IqbmDQZivjHYQcIYznIa85qohh1r3YGzQDo5xVqAKEp9Oe/uiCOHOq2/61Mmi43uqpQ47by0KV4Aj2Cy9L69a1OXgkhgvOTmLTOMFZomhVzX2B1UfkEpTvb/H+yOWXUmW2K+i+ILREHCzsp1e3NucGNO7qtY= ARC-Authentication-Results: i=1; mx.zohomail.com; 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 Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 15886359777672.652315827665575; Mon, 4 May 2020 16:46:17 -0700 (PDT) Received: from localhost ([::1]:46054 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1jVkmu-0002eN-8t for importer@patchew.org; Mon, 04 May 2020 19:46:16 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:35524) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1jVkey-0002oU-8r for qemu-devel@nongnu.org; Mon, 04 May 2020 19:38:04 -0400 Received: from esa4.mentor.iphmx.com ([68.232.137.252]:10519) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1jVkew-00024f-PW for qemu-devel@nongnu.org; Mon, 04 May 2020 19:38:03 -0400 Received: from orw-gwy-02-in.mentorg.com ([192.94.38.167]) by esa4.mentor.iphmx.com with ESMTP; 04 May 2020 15:38:01 -0800 IronPort-SDR: nAh6sP4TPIm9nS5MKcwbMOafW913chdfPbrGtzBhznTnOzliNd0fQGJglExnHmNF7rjbOqmDB5 SGWJAJoeJlKlO3DQ3i1ffcO0eU+ZJbo6wozgPcny4HUkPSBolhTC4KUU2c6cyNrqqdKn+WkM/g i9ydgmLEIn3b1rBuvslBSf+V3YqCjAevq+Ys9tbmSgRJj5i8vMqvJAaq/K8cJl4UCtLpQCL9Nl jfJzhU9xTj+ZOy9R/2VTJII8LVWtKZ/1G/g7L0TyC4P+01DiNQfCobwVacxBevxf1gnb2U1SUv IW4= X-IronPort-AV: E=Sophos;i="5.73,353,1583222400"; d="scan'208";a="48579956" IronPort-SDR: 7pEs3fV6ef80FDW+xwh4O5yI1+IQvk+TKlpMZQBxFZL5lqQILaX7QouL3JnDgCI1v/WpziYkYC 5yvaJ2WuvS/E+zR+eD+3o8ek/6lHNnwSJFqBDsLjFMZiBIkL2I2NurN1immjwVb4HdjmQpDlqH LSya+4fgadhOr/7ajwusavMzXXvp0eySdw5GpsjYIlR4a9fZB96FDsWBFeprz4vcktuwYf9A6u +sHPNUbjiAv61/S4K+KNx5DDiIrFakK07dlCML90zHVbj3CB682cCGxr6dFtv+Knutw1EZPiNY KPQ= Date: Mon, 4 May 2020 23:37:54 +0000 From: Joseph Myers X-X-Sender: jsm28@digraph.polyomino.org.uk To: , , , , , , Subject: [PATCH v2 1/4] softfloat: silence sNaN for conversions to/from floatx80 In-Reply-To: Message-ID: References: User-Agent: Alpine 2.21 (DEB 202 2017-01-01) MIME-Version: 1.0 X-Originating-IP: [137.202.0.90] X-ClientProxiedBy: SVR-IES-MBX-08.mgc.mentorg.com (139.181.222.8) To svr-ies-mbx-01.mgc.mentorg.com (139.181.222.1) 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=68.232.137.252; envelope-from=joseph_myers@mentor.com; helo=esa4.mentor.iphmx.com X-detected-operating-system: by eggs.gnu.org: First seen = 2020/05/04 19:36:19 X-ACL-Warn: Detected OS = FreeBSD 9.x or newer [fuzzy] X-Spam_score_int: -39 X-Spam_score: -4.0 X-Spam_bar: ---- X-Spam_report: (-4.0 / 5.0 requ) BAYES_00=-1.9, HEADER_FROM_DIFFERENT_DOMAINS=0.249, RCVD_IN_DNSWL_MED=-2.3, SPF_PASS=-0.001, URIBL_BLOCKED=0.001 autolearn=_AUTOLEARN X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Conversions between IEEE floating-point formats should convert signaling NaNs to quiet NaNs. Most of those in QEMU's softfloat code do so, but those for floatx80 fail to. Fix those conversions to silence signaling NaNs as well. Signed-off-by: Joseph Myers --- fpu/softfloat.c | 24 +++++++--- tests/tcg/i386/test-i386-snan-convert.c | 63 +++++++++++++++++++++++++ 2 files changed, 81 insertions(+), 6 deletions(-) create mode 100644 tests/tcg/i386/test-i386-snan-convert.c diff --git a/fpu/softfloat.c b/fpu/softfloat.c index ae6ba71854..ac116c70b8 100644 --- a/fpu/softfloat.c +++ b/fpu/softfloat.c @@ -4498,7 +4498,9 @@ floatx80 float32_to_floatx80(float32 a, float_status = *status) aSign =3D extractFloat32Sign( a ); if ( aExp =3D=3D 0xFF ) { if (aSig) { - return commonNaNToFloatx80(float32ToCommonNaN(a, status), stat= us); + floatx80 res =3D commonNaNToFloatx80(float32ToCommonNaN(a, sta= tus), + status); + return floatx80_silence_nan(res, status); } return packFloatx80(aSign, floatx80_infinity_high, @@ -5016,7 +5018,9 @@ floatx80 float64_to_floatx80(float64 a, float_status = *status) aSign =3D extractFloat64Sign( a ); if ( aExp =3D=3D 0x7FF ) { if (aSig) { - return commonNaNToFloatx80(float64ToCommonNaN(a, status), stat= us); + floatx80 res =3D commonNaNToFloatx80(float64ToCommonNaN(a, sta= tus), + status); + return floatx80_silence_nan(res, status); } return packFloatx80(aSign, floatx80_infinity_high, @@ -5618,7 +5622,9 @@ float32 floatx80_to_float32(floatx80 a, float_status = *status) aSign =3D extractFloatx80Sign( a ); if ( aExp =3D=3D 0x7FFF ) { if ( (uint64_t) ( aSig<<1 ) ) { - return commonNaNToFloat32(floatx80ToCommonNaN(a, status), stat= us); + float32 res =3D commonNaNToFloat32(floatx80ToCommonNaN(a, stat= us), + status); + return float32_silence_nan(res, status); } return packFloat32( aSign, 0xFF, 0 ); } @@ -5650,7 +5656,9 @@ float64 floatx80_to_float64(floatx80 a, float_status = *status) aSign =3D extractFloatx80Sign( a ); if ( aExp =3D=3D 0x7FFF ) { if ( (uint64_t) ( aSig<<1 ) ) { - return commonNaNToFloat64(floatx80ToCommonNaN(a, status), stat= us); + float64 res =3D commonNaNToFloat64(floatx80ToCommonNaN(a, stat= us), + status); + return float64_silence_nan(res, status); } return packFloat64( aSign, 0x7FF, 0 ); } @@ -5681,7 +5689,9 @@ float128 floatx80_to_float128(floatx80 a, float_statu= s *status) aExp =3D extractFloatx80Exp( a ); aSign =3D extractFloatx80Sign( a ); if ( ( aExp =3D=3D 0x7FFF ) && (uint64_t) ( aSig<<1 ) ) { - return commonNaNToFloat128(floatx80ToCommonNaN(a, status), status); + float128 res =3D commonNaNToFloat128(floatx80ToCommonNaN(a, status= ), + status); + return float128_silence_nan(res, status); } shift128Right( aSig<<1, 0, 16, &zSig0, &zSig1 ); return packFloat128( aSign, aExp, zSig0, zSig1 ); @@ -6959,7 +6969,9 @@ floatx80 float128_to_floatx80(float128 a, float_statu= s *status) aSign =3D extractFloat128Sign( a ); if ( aExp =3D=3D 0x7FFF ) { if ( aSig0 | aSig1 ) { - return commonNaNToFloatx80(float128ToCommonNaN(a, status), sta= tus); + floatx80 res =3D commonNaNToFloatx80(float128ToCommonNaN(a, st= atus), + status); + return floatx80_silence_nan(res, status); } return packFloatx80(aSign, floatx80_infinity_high, floatx80_infinity_low); diff --git a/tests/tcg/i386/test-i386-snan-convert.c b/tests/tcg/i386/test-= i386-snan-convert.c new file mode 100644 index 0000000000..ed6d535ce2 --- /dev/null +++ b/tests/tcg/i386/test-i386-snan-convert.c @@ -0,0 +1,63 @@ +/* Test conversions of signaling NaNs to and from long double. */ + +#include +#include + +volatile float f_res; +volatile double d_res; +volatile long double ld_res; + +volatile float f_snan =3D __builtin_nansf(""); +volatile double d_snan =3D __builtin_nans(""); +volatile long double ld_snan =3D __builtin_nansl(""); + +int issignaling_f(float x) +{ + union { float f; uint32_t u; } u =3D { .f =3D x }; + return (u.u & 0x7fffffff) > 0x7f800000 && (u.u & 0x400000) =3D=3D 0; +} + +int issignaling_d(double x) +{ + union { double d; uint64_t u; } u =3D { .d =3D x }; + return (((u.u & UINT64_C(0x7fffffffffffffff)) > + UINT64_C(0x7ff0000000000000)) && + (u.u & UINT64_C(0x8000000000000)) =3D=3D 0); +} + +int issignaling_ld(long double x) +{ + union { + long double ld; + struct { uint64_t sig; uint16_t sign_exp; } s; + } u =3D { .ld =3D x }; + return ((u.s.sign_exp & 0x7fff) =3D=3D 0x7fff && + (u.s.sig >> 63) !=3D 0 && + (u.s.sig & UINT64_C(0x4000000000000000)) =3D=3D 0); +} + +int main(void) +{ + int ret =3D 0; + ld_res =3D f_snan; + if (issignaling_ld(ld_res)) { + printf("FAIL: float -> long double\n"); + ret =3D 1; + } + ld_res =3D d_snan; + if (issignaling_ld(ld_res)) { + printf("FAIL: double -> long double\n"); + ret =3D 1; + } + f_res =3D ld_snan; + if (issignaling_d(f_res)) { + printf("FAIL: long double -> float\n"); + ret =3D 1; + } + d_res =3D ld_snan; + if (issignaling_d(d_res)) { + printf("FAIL: long double -> double\n"); + ret =3D 1; + } + return ret; +} --=20 2.17.1 --=20 Joseph S. Myers joseph@codesourcery.com