From nobody Sun May 19 05:50:57 2024 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=1591383730; cv=none; d=zohomail.com; s=zohoarc; b=EJRMuFxBwr+d4sC9o6NFxOmMZcX34oPUIt1jgxXIb6tSK+Fteb+Xd2m3Yh4AvCLIUWqbvrEF9GiWD2PZZEpxbGK7pDiCS/fzHgDioFQ9zfaOqPwY5BEXzwRUCXoU01/saTXzfgcyslj/9D1fZh7fxB4KTBJ+WMxrR5tEbvRpYu4= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1591383730; 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=T9AA+ZzVT3Yp0y406RSPILNs9ZwAGNPIoy36ZeeltO8=; b=QAyjDOIqHztUZSu0pLNMdbDrw9SJ+liPlUzeAe3e8NeSEQ9HlDZ+CdlT2/xz7WI7TEba4K/4scTRxH0Bt4cbpEE0EV2kYZ2XWO9zNt+iXhmfCbW9gvdHC04LzB2IKipa3ZI16XwawcxqE3GPZ/8qODCut346U7Wc49AEjMqpZ9U= 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 1591383730033355.1741166889383; Fri, 5 Jun 2020 12:02:10 -0700 (PDT) Received: from localhost ([::1]:46540 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1jhHbU-0000xi-M5 for importer@patchew.org; Fri, 05 Jun 2020 15:02:08 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:58188) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1jhHZG-00078r-1j for qemu-devel@nongnu.org; Fri, 05 Jun 2020 14:59:50 -0400 Received: from esa4.mentor.iphmx.com ([68.232.137.252]:33932) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1jhHZE-0006dV-4I for qemu-devel@nongnu.org; Fri, 05 Jun 2020 14:59:49 -0400 Received: from orw-gwy-01-in.mentorg.com ([192.94.38.165]) by esa4.mentor.iphmx.com with ESMTP; 05 Jun 2020 10:59:45 -0800 IronPort-SDR: PNCzEkExifI0E5ZgJJk48ARcyoDe38aMDKvp0yI0GhzOK2iB862q7a58/ZSzGkz1uuYPzItN4j 7VtWehj5cY5cZlkj6LTEetfsFVZt0rIgKrDt4db2Tv86NUIdi8yaLywzf2eqbgI8VyLTDmO2B4 5KeU/+H+KI6btnjVQtEojfEUkbD5Zy/nD0XIQT5JOkyV/4G1eMaoNkN30B8iF/0Hv+63zX5+po zcCeCbXkF/v/ELs5nk6NCpyVOtT7zuxCG+IkuFIFPYuIAOF3hkuP4tOXvm6n9FHp8VJ+Y0LfVJ 1Nw= X-IronPort-AV: E=Sophos;i="5.73,477,1583222400"; d="scan'208";a="49633014" IronPort-SDR: 0CKygn2+BMp+qFux50QRvAri70GpQKg/2zWcYNRoOeRy7DMP6kjMXwrkiZUWXPHDs5enix2j1I g2IuRyfmuvJWRKF/ToJeQ/qFTr7XuZ3PRnnwBF5sTlBNtTRVdx5GBPMIo3U3PONCN5AbwCeH1j VebSrLivS76sWu8I8bx2OTgUmjNr5x61NWBo0fF889vrCEHJabEOhuz2CR5irIdJrmJ+PfwzUc i13VbZ8lY9+BzafgYit+VO+bLgGB/cJ/lq5u+9joxZ/e0czhp/8f9ToDSrbTB06QYa2PHCskuN YbQ= Date: Fri, 5 Jun 2020 18:59:39 +0000 From: Joseph Myers X-X-Sender: jsm28@digraph.polyomino.org.uk To: , , , , , , , Subject: [PATCH 1/7] softfloat: merge floatx80_mod and floatx80_rem 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-07.mgc.mentorg.com (139.181.222.7) To svr-ies-mbx-02.mgc.mentorg.com (139.181.222.2) 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/06/05 14:59:46 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_HELO_PASS=-0.001, 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" The m68k-specific softfloat code includes a function floatx80_mod that is extremely similar to floatx80_rem, but computing the remainder based on truncating the quotient toward zero rather than rounding it to nearest integer. This is also useful for emulating the x87 fprem and fprem1 instructions. Change the floatx80_rem implementation into floatx80_modrem that can perform either operation, with both floatx80_rem and floatx80_mod as thin wrappers available for all targets. There does not appear to be any use for the _mod operation for other floating-point formats in QEMU (the only other architectures using _rem at all are linux-user/arm/nwfpe, for FPA emulation, and openrisc, for instructions that have been removed in the latest version of the architecture), so no change is made to the code for other formats. Signed-off-by: Joseph Myers Reviewed-by: Richard Henderson --- fpu/softfloat.c | 49 ++++++++++++++++++------ include/fpu/softfloat.h | 2 + target/m68k/softfloat.c | 83 ----------------------------------------- target/m68k/softfloat.h | 1 - 4 files changed, 40 insertions(+), 95 deletions(-) diff --git a/fpu/softfloat.c b/fpu/softfloat.c index 6c8f2d597a..7b1ce7664f 100644 --- a/fpu/softfloat.c +++ b/fpu/softfloat.c @@ -5682,10 +5682,13 @@ floatx80 floatx80_div(floatx80 a, floatx80 b, float= _status *status) /*------------------------------------------------------------------------= ---- | Returns the remainder of the extended double-precision floating-point va= lue | `a' with respect to the corresponding value `b'. The operation is perfo= rmed -| according to the IEC/IEEE Standard for Binary Floating-Point Arithmetic. +| according to the IEC/IEEE Standard for Binary Floating-Point Arithmetic, +| if 'mod' is false; if 'mod' is true, return the remainder based on trunc= ating +| the quotient toward zero instead. *-------------------------------------------------------------------------= ---*/ =20 -floatx80 floatx80_rem(floatx80 a, floatx80 b, float_status *status) +floatx80 floatx80_modrem(floatx80 a, floatx80 b, bool mod, + float_status *status) { bool aSign, zSign; int32_t aExp, bExp, expDiff; @@ -5731,7 +5734,7 @@ floatx80 floatx80_rem(floatx80 a, floatx80 b, float_s= tatus *status) expDiff =3D aExp - bExp; aSig1 =3D 0; if ( expDiff < 0 ) { - if ( expDiff < -1 ) return a; + if ( mod || expDiff < -1 ) return a; shift128Right( aSig0, 0, 1, &aSig0, &aSig1 ); expDiff =3D 0; } @@ -5763,14 +5766,16 @@ floatx80 floatx80_rem(floatx80 a, floatx80 b, float= _status *status) term1 =3D 0; term0 =3D bSig; } - sub128( term0, term1, aSig0, aSig1, &alternateASig0, &alternateASig1 ); - if ( lt128( alternateASig0, alternateASig1, aSig0, aSig1 ) - || ( eq128( alternateASig0, alternateASig1, aSig0, aSig1 ) - && ( q & 1 ) ) - ) { - aSig0 =3D alternateASig0; - aSig1 =3D alternateASig1; - zSign =3D ! zSign; + if (!mod) { + sub128( term0, term1, aSig0, aSig1, &alternateASig0, &alternateASi= g1 ); + if ( lt128( alternateASig0, alternateASig1, aSig0, aSig1 ) + || ( eq128( alternateASig0, alternateASig1, aSig0, aSig= 1 ) + && ( q & 1 ) ) + ) { + aSig0 =3D alternateASig0; + aSig1 =3D alternateASig1; + zSign =3D ! zSign; + } } return normalizeRoundAndPackFloatx80( @@ -5778,6 +5783,28 @@ floatx80 floatx80_rem(floatx80 a, floatx80 b, float_= status *status) =20 } =20 +/*------------------------------------------------------------------------= ---- +| Returns the remainder of the extended double-precision floating-point va= lue +| `a' with respect to the corresponding value `b'. The operation is perfo= rmed +| according to the IEC/IEEE Standard for Binary Floating-Point Arithmetic. +*-------------------------------------------------------------------------= ---*/ + +floatx80 floatx80_rem(floatx80 a, floatx80 b, float_status *status) +{ + return floatx80_modrem(a, b, false, status); +} + +/*------------------------------------------------------------------------= ---- +| Returns the remainder of the extended double-precision floating-point va= lue +| `a' with respect to the corresponding value `b', with the quotient trunc= ated +| toward zero. +*-------------------------------------------------------------------------= ---*/ + +floatx80 floatx80_mod(floatx80 a, floatx80 b, float_status *status) +{ + return floatx80_modrem(a, b, true, status); +} + /*------------------------------------------------------------------------= ---- | Returns the square root of the extended double-precision floating-point | value `a'. The operation is performed according to the IEC/IEEE Standard diff --git a/include/fpu/softfloat.h b/include/fpu/softfloat.h index 16ca697a73..bff6934d09 100644 --- a/include/fpu/softfloat.h +++ b/include/fpu/softfloat.h @@ -687,6 +687,8 @@ floatx80 floatx80_add(floatx80, floatx80, float_status = *status); floatx80 floatx80_sub(floatx80, floatx80, float_status *status); floatx80 floatx80_mul(floatx80, floatx80, float_status *status); floatx80 floatx80_div(floatx80, floatx80, float_status *status); +floatx80 floatx80_modrem(floatx80, floatx80, bool, float_status *status); +floatx80 floatx80_mod(floatx80, floatx80, float_status *status); floatx80 floatx80_rem(floatx80, floatx80, float_status *status); floatx80 floatx80_sqrt(floatx80, float_status *status); FloatRelation floatx80_compare(floatx80, floatx80, float_status *status); diff --git a/target/m68k/softfloat.c b/target/m68k/softfloat.c index 9f120cf15e..b6d0ed7acf 100644 --- a/target/m68k/softfloat.c +++ b/target/m68k/softfloat.c @@ -42,89 +42,6 @@ static floatx80 propagateFloatx80NaNOneArg(floatx80 a, f= loat_status *status) return a; } =20 -/* - * Returns the modulo remainder of the extended double-precision floating-= point - * value `a' with respect to the corresponding value `b'. - */ - -floatx80 floatx80_mod(floatx80 a, floatx80 b, float_status *status) -{ - bool aSign, zSign; - int32_t aExp, bExp, expDiff; - uint64_t aSig0, aSig1, bSig; - uint64_t qTemp, term0, term1; - - aSig0 =3D extractFloatx80Frac(a); - aExp =3D extractFloatx80Exp(a); - aSign =3D extractFloatx80Sign(a); - bSig =3D extractFloatx80Frac(b); - bExp =3D extractFloatx80Exp(b); - - if (aExp =3D=3D 0x7FFF) { - if ((uint64_t) (aSig0 << 1) - || ((bExp =3D=3D 0x7FFF) && (uint64_t) (bSig << 1))) { - return propagateFloatx80NaN(a, b, status); - } - goto invalid; - } - if (bExp =3D=3D 0x7FFF) { - if ((uint64_t) (bSig << 1)) { - return propagateFloatx80NaN(a, b, status); - } - return a; - } - if (bExp =3D=3D 0) { - if (bSig =3D=3D 0) { - invalid: - float_raise(float_flag_invalid, status); - return floatx80_default_nan(status); - } - normalizeFloatx80Subnormal(bSig, &bExp, &bSig); - } - if (aExp =3D=3D 0) { - if ((uint64_t) (aSig0 << 1) =3D=3D 0) { - return a; - } - normalizeFloatx80Subnormal(aSig0, &aExp, &aSig0); - } - bSig |=3D UINT64_C(0x8000000000000000); - zSign =3D aSign; - expDiff =3D aExp - bExp; - aSig1 =3D 0; - if (expDiff < 0) { - return a; - } - qTemp =3D (bSig <=3D aSig0); - if (qTemp) { - aSig0 -=3D bSig; - } - expDiff -=3D 64; - while (0 < expDiff) { - qTemp =3D estimateDiv128To64(aSig0, aSig1, bSig); - qTemp =3D (2 < qTemp) ? qTemp - 2 : 0; - mul64To128(bSig, qTemp, &term0, &term1); - sub128(aSig0, aSig1, term0, term1, &aSig0, &aSig1); - shortShift128Left(aSig0, aSig1, 62, &aSig0, &aSig1); - expDiff -=3D 62; - } - expDiff +=3D 64; - if (0 < expDiff) { - qTemp =3D estimateDiv128To64(aSig0, aSig1, bSig); - qTemp =3D (2 < qTemp) ? qTemp - 2 : 0; - qTemp >>=3D 64 - expDiff; - mul64To128(bSig, qTemp << (64 - expDiff), &term0, &term1); - sub128(aSig0, aSig1, term0, term1, &aSig0, &aSig1); - shortShift128Left(0, bSig, 64 - expDiff, &term0, &term1); - while (le128(term0, term1, aSig0, aSig1)) { - ++qTemp; - sub128(aSig0, aSig1, term0, term1, &aSig0, &aSig1); - } - } - return - normalizeRoundAndPackFloatx80( - 80, zSign, bExp + expDiff, aSig0, aSig1, status); -} - /* * Returns the mantissa of the extended double-precision floating-point * value `a'. diff --git a/target/m68k/softfloat.h b/target/m68k/softfloat.h index 365ef6ac7a..4bb9567134 100644 --- a/target/m68k/softfloat.h +++ b/target/m68k/softfloat.h @@ -23,7 +23,6 @@ #define TARGET_M68K_SOFTFLOAT_H #include "fpu/softfloat.h" =20 -floatx80 floatx80_mod(floatx80 a, floatx80 b, float_status *status); floatx80 floatx80_getman(floatx80 a, float_status *status); floatx80 floatx80_getexp(floatx80 a, float_status *status); floatx80 floatx80_scale(floatx80 a, floatx80 b, float_status *status); --=20 2.17.1 --=20 Joseph S. Myers joseph@codesourcery.com From nobody Sun May 19 05:50:57 2024 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=1591383708; cv=none; d=zohomail.com; s=zohoarc; b=YOwAK/GOxvjfrctF2VNI81v4V+OetiCz0ycgDLbEoQUDLYavVEImtK1OX0HihXfGAkTXLLaqRR2nDLHwTWxD+4VFOF9KXg7Da8U/KesgmQQ3vn0COvVLsgr/BfvA6FMBEDNvEupicFuXffSS9FWup0fQH+iYO9df3TaZd3cWqFU= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1591383708; 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=BbTsFexJ1xEbJHPCwaeq2S8KB9tPLXknDy8uv8VeEWY=; b=Hmly/8z1iKeLOOp/pIQIpu14pIhcpL2JVe7blCSCV87dT7EEPalXrr75vV8O2NTstiW1kVwEpdGy7gSJo8ZLLzjDWX/EMhMEmt3Q9HZhnQbdNfZe9pdmdhQS73JLn0iBKo46Jho2rWP2uQ4XGZrBK0AmcUV43jBcVtwdKx/ZxS8= 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 15913837085561002.6912640449522; Fri, 5 Jun 2020 12:01:48 -0700 (PDT) Received: from localhost ([::1]:45408 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1jhHb9-0000TF-7G for importer@patchew.org; Fri, 05 Jun 2020 15:01:47 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:58278) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1jhHZj-0007ng-Oj for qemu-devel@nongnu.org; Fri, 05 Jun 2020 15:00:19 -0400 Received: from esa4.mentor.iphmx.com ([68.232.137.252]:33964) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1jhHZi-0006kF-Sc for qemu-devel@nongnu.org; Fri, 05 Jun 2020 15:00:19 -0400 Received: from orw-gwy-01-in.mentorg.com ([192.94.38.165]) by esa4.mentor.iphmx.com with ESMTP; 05 Jun 2020 11:00:17 -0800 IronPort-SDR: 9GYcwDgzUE23Zz9Jpn/vvQdCGmbQtwS2G28xA4vme/GAffyb8iKOBIY/oCDOnlOYw54MOqueKd sX9+zpWbvN/tjd4ouhXrnOcXF2gKjiZAaXfRrNI2MwSt+fuct1e6TEsPvgVFl0Wcje7b8gJxe1 co7Ck+V4F9dpryuI8TdKrSVyJKKwKKX6JkctrXEbn/yiq6mPe5Ig/SQylF9l/X7SxfNyVFYdjg OSFskJxj8uYEfQf6mKjPJktXTc5EMAubSlU/+Db5kUDwaGbvHnRb4GFe8zYnLfhbRXHiIeVfWg ceg= X-IronPort-AV: E=Sophos;i="5.73,477,1583222400"; d="scan'208";a="49633038" IronPort-SDR: F/1FruGMO9R7ujubsMTUScSsM8Mx4W2Fh5rWxXLYYxsGY9wrtJq5kU0mA1aJ2JrIGkbkAFNdis sOixld8CnN58F1VpLQSeM9EipzExRbuwSgoaoy7IaMOVqyAtZekhdwyQtNi+Nxwk6XfbmT1qDy qZ0qx/q6L0cH8RYLyGtd4Eeyx/nBq/XEgl5QshxttGwCsuQ87mf7Y3+iTybqIduvkJ2xYb8GC7 gZuZ3J0vxk0ZCc04k4jy0V2/36aN6F2iQ/fetXsaVmd5/PP01Gt7xcjYh4UrRKWTNmdbdNjqc7 bOk= Date: Fri, 5 Jun 2020 19:00:11 +0000 From: Joseph Myers X-X-Sender: jsm28@digraph.polyomino.org.uk To: , , , , , , , Subject: [PATCH 2/7] softfloat: fix floatx80 remainder pseudo-denormal check for zero 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-02.mgc.mentorg.com (139.181.222.2) To svr-ies-mbx-02.mgc.mentorg.com (139.181.222.2) 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/06/05 14:59:46 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_HELO_PASS=-0.001, 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" The floatx80 remainder implementation ignores the high bit of the significand when checking whether an operand (numerator) with zero exponent is zero. This means it mishandles a pseudo-denormal representation of 0x1p-16382L by treating it as zero. Fix this by checking the whole significand instead. Signed-off-by: Joseph Myers Reviewed-by: Richard Henderson --- fpu/softfloat.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fpu/softfloat.c b/fpu/softfloat.c index 7b1ce7664f..091847beb9 100644 --- a/fpu/softfloat.c +++ b/fpu/softfloat.c @@ -5726,7 +5726,7 @@ floatx80 floatx80_modrem(floatx80 a, floatx80 b, bool= mod, normalizeFloatx80Subnormal( bSig, &bExp, &bSig ); } if ( aExp =3D=3D 0 ) { - if ( (uint64_t) ( aSig0<<1 ) =3D=3D 0 ) return a; + if ( aSig0 =3D=3D 0 ) return a; normalizeFloatx80Subnormal( aSig0, &aExp, &aSig0 ); } bSig |=3D UINT64_C(0x8000000000000000); --=20 2.17.1 --=20 Joseph S. Myers joseph@codesourcery.com From nobody Sun May 19 05:50:57 2024 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=1591383743; cv=none; d=zohomail.com; s=zohoarc; b=Xh9S2YMynAqGXcf0dkkLHJOvwzK0kUcwhqsMNFXTidTb0XfzgXeUdL9L93GptEWUIhKK8p7WFnzcdcHelH5U3pK15VVJZGucNGC5YuSAYsX8VaqLk6NeikyBgf/9ZfSvGtHI/7kF2rRs5/5r58pkgJBcP0bZJ8+DxCoueTUPJow= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1591383743; 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=/pVX4cPvRROK1XiTmR4AECRpWJaNO30jja3E9n2J4ws=; b=HjX3K+FhwrTUIXEtoUa98tRbYB0QHIkLv6twZzIdk2ymuYCm78Fp1T4kxRHO7HL8SkKEPekBlXpPzi9fehYjZhJ6T2EWc7qICTTRvZnXNeTMGqDEwAyW3N4HVO4KeS8PQeUNcyb5rmV2Q6gumC+sEFY37EktIJ9S5NtRNzq9744= 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 1591383743905279.79370367327635; Fri, 5 Jun 2020 12:02:23 -0700 (PDT) Received: from localhost ([::1]:47340 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1jhHbi-0001Hj-H6 for importer@patchew.org; Fri, 05 Jun 2020 15:02:22 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:58376) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1jhHaD-0008PS-0l for qemu-devel@nongnu.org; Fri, 05 Jun 2020 15:00:49 -0400 Received: from esa2.mentor.iphmx.com ([68.232.141.98]:23527) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1jhHaB-0006ti-TU for qemu-devel@nongnu.org; Fri, 05 Jun 2020 15:00:48 -0400 Received: from orw-gwy-01-in.mentorg.com ([192.94.38.165]) by esa2.mentor.iphmx.com with ESMTP; 05 Jun 2020 11:00:46 -0800 IronPort-SDR: o6OyhxX5WPW9Ivz+XOQSmu7wA963PKKC/fmCb2nUBqNhcVskOpK/i9QWucaKNx2RLlg8rTa5sN qLBaF3cjGQexwisqaWWjuw9TwFVRpoH2xhxV+p5nTKxhdzGuIEC09mUoZm2vwUbyw7Herulozj g/0rz8EjPAkDX94tzq4brxgPbvyC+mizFOrj3rBnI1SJt0utCd7McNnF2lKlLrAeI/RRenoFKV 5aUd7cys9Rrmr4e0/+C+YkGXau3hhtejQTz2nodOEWbMtA9NM6IGx4CjVH050X7ibrL68uw/l8 WxQ= X-IronPort-AV: E=Sophos;i="5.73,477,1583222400"; d="scan'208";a="49520896" IronPort-SDR: BSk93enA7yO2QEG4arDdvltkG4B+ihlQv19LPP7LOT2XKUCNBupnNF79AJAIUwo7s1YZ/9WDx1 yjfAB4x7YnUYIcW8Y/Nj3m3P1XrI0CMKE8+p34qf9ZE64pmDAai6Llm2AafNKqXp2H9gXgqQpJ Ve/uAay/ecrzmRZneg7LpTVBOjO1IfyMadYHoxm4aY/h25xE8DjPaFA6dGfrWLJY8P3LI/rzN2 hfW5pC80CHU63IGWNQLi8tPDU3Mb/fNjrtaSUIAptu7nbJOs05bniMWQxGU55ry10a3FhHq9Av g/k= Date: Fri, 5 Jun 2020 19:00:40 +0000 From: Joseph Myers X-X-Sender: jsm28@digraph.polyomino.org.uk To: , , , , , , , Subject: [PATCH 3/7] softfloat: do not return pseudo-denormal from floatx80 remainder 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-07.mgc.mentorg.com (139.181.222.7) To svr-ies-mbx-02.mgc.mentorg.com (139.181.222.2) 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.141.98; envelope-from=joseph_myers@mentor.com; helo=esa2.mentor.iphmx.com X-detected-operating-system: by eggs.gnu.org: First seen = 2020/06/05 14:58:48 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_HELO_PASS=-0.001, 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" The floatx80 remainder implementation sometimes returns the numerator unchanged when the denominator is sufficiently larger than the numerator. But if the value to be returned unchanged is a pseudo-denormal, that is incorrect. Fix it to normalize the numerator in that case. Signed-off-by: Joseph Myers Reviewed-by: Richard Henderson --- fpu/softfloat.c | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/fpu/softfloat.c b/fpu/softfloat.c index 091847beb9..00f362af23 100644 --- a/fpu/softfloat.c +++ b/fpu/softfloat.c @@ -5691,7 +5691,7 @@ floatx80 floatx80_modrem(floatx80 a, floatx80 b, bool= mod, float_status *status) { bool aSign, zSign; - int32_t aExp, bExp, expDiff; + int32_t aExp, bExp, expDiff, aExpOrig; uint64_t aSig0, aSig1, bSig; uint64_t q, term0, term1, alternateASig0, alternateASig1; =20 @@ -5700,7 +5700,7 @@ floatx80 floatx80_modrem(floatx80 a, floatx80 b, bool= mod, return floatx80_default_nan(status); } aSig0 =3D extractFloatx80Frac( a ); - aExp =3D extractFloatx80Exp( a ); + aExpOrig =3D aExp =3D extractFloatx80Exp( a ); aSign =3D extractFloatx80Sign( a ); bSig =3D extractFloatx80Frac( b ); bExp =3D extractFloatx80Exp( b ); @@ -5715,6 +5715,11 @@ floatx80 floatx80_modrem(floatx80 a, floatx80 b, boo= l mod, if ((uint64_t)(bSig << 1)) { return propagateFloatx80NaN(a, b, status); } + if (aExp =3D=3D 0 && aSig0 >> 63) { + /* Pseudo-denormal argument must be returned in normalized + * form. */ + return packFloatx80(aSign, 1, aSig0); + } return a; } if ( bExp =3D=3D 0 ) { @@ -5734,7 +5739,14 @@ floatx80 floatx80_modrem(floatx80 a, floatx80 b, boo= l mod, expDiff =3D aExp - bExp; aSig1 =3D 0; if ( expDiff < 0 ) { - if ( mod || expDiff < -1 ) return a; + if ( mod || expDiff < -1 ) { + if (aExp =3D=3D 1 && aExpOrig =3D=3D 0) { + /* Pseudo-denormal argument must be returned in + * normalized form. */ + return packFloatx80(aSign, aExp, aSig0); + } + return a; + } shift128Right( aSig0, 0, 1, &aSig0, &aSig1 ); expDiff =3D 0; } --=20 2.17.1 --=20 Joseph S. Myers joseph@codesourcery.com From nobody Sun May 19 05:50:57 2024 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=1591383840; cv=none; d=zohomail.com; s=zohoarc; b=fJTvixs8W9ItHHIG3sgYa4TDj35WIU9am4SgplW9uqskil8SQF1ZLM0OF4pyFwvvrz934iZhoUiEu3miyMPxaEoSrBwJlD9znReLbGHeouIVwoOjsZnpUsXEFLgIWz6WeIvKXh9pGcI2RITk3RLi4JraVu6y84TzXfkQHDlGe+s= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1591383840; 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=20GEZ6bHrncq8wKJ1vJXVUKi6U2CjCtKo/uz3JsWLuA=; b=EKxQhvkITk744biAehewewjjcx97M4EuaMUXFIb9aaSLFpizgv6QsBftF2akg6z0OKZRv5uths0SmAieL5dTdz5rOX1azDTY69LvO5z6aiojrId334MmtBj9EPqYtm+rQKDHHAAgorJjoApnPIuE8AoRVUcr6dcJ+7zGsHu6Gb0= 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 159138384065977.16316553653951; Fri, 5 Jun 2020 12:04:00 -0700 (PDT) Received: from localhost ([::1]:52896 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1jhHdH-0003bC-Ct for importer@patchew.org; Fri, 05 Jun 2020 15:03:59 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:58424) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1jhHah-0000bV-N0 for qemu-devel@nongnu.org; Fri, 05 Jun 2020 15:01:19 -0400 Received: from esa2.mentor.iphmx.com ([68.232.141.98]:23551) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1jhHag-000729-Pu for qemu-devel@nongnu.org; Fri, 05 Jun 2020 15:01:19 -0400 Received: from orw-gwy-01-in.mentorg.com ([192.94.38.165]) by esa2.mentor.iphmx.com with ESMTP; 05 Jun 2020 11:01:17 -0800 IronPort-SDR: uPSgdjfJa3fpg19bSgr+RqtmTA049hT6mrsqZymQcNC1PEh1e8LjSeL9qwgHW7i9/+AQpN00Hn SQODUeM7dWyNNfv9dObuYivym5qQZ84fyYfyyxMiCRf8sj5BxlG135zmIUScGfkbwOuALtt6sL OeiNzFYTZcV3uQ6KGipVfg3fu4EwNsE6u3Baon29V428iecO9Ly1uGzhnKTQjPFSoo0TC0ui/S K/72k5mmUhP8FT1xtkLLBVKWSOPFRiyFQuicyzML4/ikOOXA5f5bd4YYN4sa5LRuYZgOWn7bK1 F7w= X-IronPort-AV: E=Sophos;i="5.73,477,1583222400"; d="scan'208";a="49520911" IronPort-SDR: 99dz4Wo0vMUORJRAmZtBPNIOs5uRQgmGzcFa0BH0PO+UsxDMgqL+t+wD0MP6y54bNZ/xawLmjy Po16B4domtLXgPvcTfM9wBiEc2JrEyzi9B/vwhsNCn6kucz31GNz6yIuH7DIrz8wL2yuC4/pWw q1aU4Zy6515AFiNioEekEJQR+cW2UN+4uoVTbkXLl3X6KSQ7XKeZNb8jVAb5ayCNZFZBbsdLp5 gwiFu42dPVGt3VVb5myN0r9vPvjSSztAYGO4mlp1Ujjn7iNzOW2unD9iW8QAXdt4NgrNMuJFLk 9vg= Date: Fri, 5 Jun 2020 19:01:10 +0000 From: Joseph Myers X-X-Sender: jsm28@digraph.polyomino.org.uk To: , , , , , , , Subject: [PATCH 4/7] softfloat: do not set denominator high bit for floatx80 remainder 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-02.mgc.mentorg.com (139.181.222.2) 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.141.98; envelope-from=joseph_myers@mentor.com; helo=esa2.mentor.iphmx.com X-detected-operating-system: by eggs.gnu.org: First seen = 2020/06/05 14:58:48 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_HELO_PASS=-0.001, 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" The floatx80 remainder implementation unnecessarily sets the high bit of bSig explicitly. By that point in the function, arguments that are invalid, zero, infinity or NaN have already been handled and subnormals have been through normalizeFloatx80Subnormal, so the high bit will already be set. Remove the unnecessary code. Signed-off-by: Joseph Myers Reviewed-by: Richard Henderson --- fpu/softfloat.c | 1 - 1 file changed, 1 deletion(-) diff --git a/fpu/softfloat.c b/fpu/softfloat.c index 00f362af23..423a815196 100644 --- a/fpu/softfloat.c +++ b/fpu/softfloat.c @@ -5734,7 +5734,6 @@ floatx80 floatx80_modrem(floatx80 a, floatx80 b, bool= mod, if ( aSig0 =3D=3D 0 ) return a; normalizeFloatx80Subnormal( aSig0, &aExp, &aSig0 ); } - bSig |=3D UINT64_C(0x8000000000000000); zSign =3D aSign; expDiff =3D aExp - bExp; aSig1 =3D 0; --=20 2.17.1 --=20 Joseph S. Myers joseph@codesourcery.com From nobody Sun May 19 05:50:57 2024 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=1591383877; cv=none; d=zohomail.com; s=zohoarc; b=GXMboTpmZdFqFeJzM5IpZTRz4WMxP7CSecV1CSVtFwSphcI+mxFagUNw+hkq6th0yxV5JxcGhEDo91Ztp9l7m379p88PKdWYXC4zUt/LegPcatKg+z/rXWh43EF0vvgfc3RTIjdlubgPmWNsgkjNUwctZFP3Y6yan1hMv9YsKPg= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1591383877; 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=gorhlHLYY+4xaovqCEIqXdA2rtIUopD/N9EwLfa2gN0=; b=UFtvsHlBZIoESmWACdlKMjfk2FBRZEZpjiQNIUwAR8lP0tICEHZmGpFkVzhUZfk+L4XnKO7TyA3JZ5Nig1DivmneDDnqmXyd2NLhEqH5Pkm8mpFtIqee1gsRpGB69qFR7CzcwV/KGAowGMso2fktHdPR3MvYRNDT/ZDd1giJ0rU= 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 1591383877043977.6631544620578; Fri, 5 Jun 2020 12:04:37 -0700 (PDT) Received: from localhost ([::1]:54758 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1jhHdr-0004Lz-Qt for importer@patchew.org; Fri, 05 Jun 2020 15:04:35 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:58458) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1jhHbH-00019D-E8 for qemu-devel@nongnu.org; Fri, 05 Jun 2020 15:01:55 -0400 Received: from esa2.mentor.iphmx.com ([68.232.141.98]:23580) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1jhHbG-00076X-63 for qemu-devel@nongnu.org; Fri, 05 Jun 2020 15:01:54 -0400 Received: from orw-gwy-01-in.mentorg.com ([192.94.38.165]) by esa2.mentor.iphmx.com with ESMTP; 05 Jun 2020 11:01:52 -0800 IronPort-SDR: GESuwUlyosFx7RetCaBg7rzrfteYNguZE7SsASwaltADL/OLqJ8DyzdtgdqzMLBJ1Jnx50e+uf fYPMOrDWKfPZAbBBYWlSoomB3Y3ZJleHWXAMwEtC2/oBsBw0+tQTIfY/LvUnwstYXtW5JgblOH sSYwmPCu1yZKHgNWjkdid5wLit7nMMxk3NVYUztIOvyF/7A68rnJ0E1MTBQHIewxFsrqnuBetW /LHTvqcYVPfQXvUGIGw9HK+ByfGSeXPRNX3hdJvydHfpL6gU3Hx4ZNN2fHeHGZzbIJo1vRUhcU Hws= X-IronPort-AV: E=Sophos;i="5.73,477,1583222400"; d="scan'208";a="49520928" IronPort-SDR: 0MqKEzmhVaRvFZrDZgkWBBV3SjyS1fZKaR7r85cI6dXFqt6lo92ZKt90CA7Qtsl96Br6VOGtFH X942gZLfkhce5SfNdlV/60t4tgu60xCD8P/CzHRssfy1bnouNkuvYjJza8e6Pwf0GjY7fcaR+Q SmiUwgOaQqcIjbjjV5U7NNxyhuEsI5R+dLDhBVshB0aC27X0k81PNi9i+Y0YR8wI9bnYy0wolz rEXbeK2lg2oidusI/tdKmWH+xYJVLIE3BwM4EGO4NKfgHVe7O5aPBx5t6Ao3G2pADPfgRmIV8g woM= Date: Fri, 5 Jun 2020 19:01:46 +0000 From: Joseph Myers X-X-Sender: jsm28@digraph.polyomino.org.uk To: , , , , , , , Subject: [PATCH 5/7] softfloat: return low bits of quotient from floatx80_modrem 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-02.mgc.mentorg.com (139.181.222.2) To svr-ies-mbx-02.mgc.mentorg.com (139.181.222.2) 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.141.98; envelope-from=joseph_myers@mentor.com; helo=esa2.mentor.iphmx.com X-detected-operating-system: by eggs.gnu.org: First seen = 2020/06/05 14:58:48 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_HELO_PASS=-0.001, 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" Both x87 and m68k need the low parts of the quotient for their remainder operations. Arrange for floatx80_modrem to track those bits and return them via a pointer. The architectures using float32_rem and float64_rem do not appear to need this information, so the *_rem interface is left unchanged and the information returned only from floatx80_modrem. The logic used to determine the low 7 bits of the quotient for m68k (target/m68k/fpu_helper.c:make_quotient) appears completely bogus (it looks at the result of converting the remainder to integer, the quotient having been discarded by that point); this patch does not change that, but the m68k maintainers may wish to do so. Signed-off-by: Joseph Myers Reviewed-by: Richard Henderson --- fpu/softfloat.c | 23 ++++++++++++++++++----- include/fpu/softfloat.h | 3 ++- 2 files changed, 20 insertions(+), 6 deletions(-) diff --git a/fpu/softfloat.c b/fpu/softfloat.c index 423a815196..c3c3f382af 100644 --- a/fpu/softfloat.c +++ b/fpu/softfloat.c @@ -5684,10 +5684,11 @@ floatx80 floatx80_div(floatx80 a, floatx80 b, float= _status *status) | `a' with respect to the corresponding value `b'. The operation is perfo= rmed | according to the IEC/IEEE Standard for Binary Floating-Point Arithmetic, | if 'mod' is false; if 'mod' is true, return the remainder based on trunc= ating -| the quotient toward zero instead. +| the quotient toward zero instead. '*quotient' is set to the low 64 bits= of +| the absolute value of the integer quotient. *-------------------------------------------------------------------------= ---*/ =20 -floatx80 floatx80_modrem(floatx80 a, floatx80 b, bool mod, +floatx80 floatx80_modrem(floatx80 a, floatx80 b, bool mod, uint64_t *quoti= ent, float_status *status) { bool aSign, zSign; @@ -5695,6 +5696,7 @@ floatx80 floatx80_modrem(floatx80 a, floatx80 b, bool= mod, uint64_t aSig0, aSig1, bSig; uint64_t q, term0, term1, alternateASig0, alternateASig1; =20 + *quotient =3D 0; if (floatx80_invalid_encoding(a) || floatx80_invalid_encoding(b)) { float_raise(float_flag_invalid, status); return floatx80_default_nan(status); @@ -5749,7 +5751,7 @@ floatx80 floatx80_modrem(floatx80 a, floatx80 b, bool= mod, shift128Right( aSig0, 0, 1, &aSig0, &aSig1 ); expDiff =3D 0; } - q =3D ( bSig <=3D aSig0 ); + *quotient =3D q =3D ( bSig <=3D aSig0 ); if ( q ) aSig0 -=3D bSig; expDiff -=3D 64; while ( 0 < expDiff ) { @@ -5759,6 +5761,8 @@ floatx80 floatx80_modrem(floatx80 a, floatx80 b, bool= mod, sub128( aSig0, aSig1, term0, term1, &aSig0, &aSig1 ); shortShift128Left( aSig0, aSig1, 62, &aSig0, &aSig1 ); expDiff -=3D 62; + *quotient <<=3D 62; + *quotient +=3D q; } expDiff +=3D 64; if ( 0 < expDiff ) { @@ -5772,6 +5776,12 @@ floatx80 floatx80_modrem(floatx80 a, floatx80 b, boo= l mod, ++q; sub128( aSig0, aSig1, term0, term1, &aSig0, &aSig1 ); } + if (expDiff < 64) { + *quotient <<=3D expDiff; + } else { + *quotient =3D 0; + } + *quotient +=3D q; } else { term1 =3D 0; @@ -5786,6 +5796,7 @@ floatx80 floatx80_modrem(floatx80 a, floatx80 b, bool= mod, aSig0 =3D alternateASig0; aSig1 =3D alternateASig1; zSign =3D ! zSign; + ++*quotient; } } return @@ -5802,7 +5813,8 @@ floatx80 floatx80_modrem(floatx80 a, floatx80 b, bool= mod, =20 floatx80 floatx80_rem(floatx80 a, floatx80 b, float_status *status) { - return floatx80_modrem(a, b, false, status); + uint64_t quotient; + return floatx80_modrem(a, b, false, "ient, status); } =20 /*------------------------------------------------------------------------= ---- @@ -5813,7 +5825,8 @@ floatx80 floatx80_rem(floatx80 a, floatx80 b, float_s= tatus *status) =20 floatx80 floatx80_mod(floatx80 a, floatx80 b, float_status *status) { - return floatx80_modrem(a, b, true, status); + uint64_t quotient; + return floatx80_modrem(a, b, true, "ient, status); } =20 /*------------------------------------------------------------------------= ---- diff --git a/include/fpu/softfloat.h b/include/fpu/softfloat.h index bff6934d09..ff4e2605b1 100644 --- a/include/fpu/softfloat.h +++ b/include/fpu/softfloat.h @@ -687,7 +687,8 @@ floatx80 floatx80_add(floatx80, floatx80, float_status = *status); floatx80 floatx80_sub(floatx80, floatx80, float_status *status); floatx80 floatx80_mul(floatx80, floatx80, float_status *status); floatx80 floatx80_div(floatx80, floatx80, float_status *status); -floatx80 floatx80_modrem(floatx80, floatx80, bool, float_status *status); +floatx80 floatx80_modrem(floatx80, floatx80, bool, uint64_t *, + float_status *status); floatx80 floatx80_mod(floatx80, floatx80, float_status *status); floatx80 floatx80_rem(floatx80, floatx80, float_status *status); floatx80 floatx80_sqrt(floatx80, float_status *status); --=20 2.17.1 --=20 Joseph S. Myers joseph@codesourcery.com From nobody Sun May 19 05:50:57 2024 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=1591383832; cv=none; d=zohomail.com; s=zohoarc; b=fC82p5+LhhapGVpNLPL8+8CwpwHit6+7+FjiV0zaCOSPpT6p9Ou+A7t1g+gg9Rb3A8ZfGm1OAZoyYY5MPFIZ36DsPVh18FPVBz11butRV5YvbC3ru7QOSWKlBa4UZY2BWLhGhrPjqMACH/9QDAd3mcSC092LHDf1n9BbpdYwcmw= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1591383832; 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=FO3UTdpSpm4fPk23PtXaqMDA3h5rv2KaqyT8gQCnxEc=; b=gnIGXPZeOaP1G1P1sBeB4e5q+C2AXQCU0UBeXJAsJvjwdL/jx1lz707Y5tsuZHPnk5PHzkniNDdhO7AQWTr7Z2SQ9KQAUkPrlEaHnJ/Pgg8Wp1mJFpgx4QQF93eDC/9sQycRcTPsA559eoKTJIYNh0WllmPR7SdRomeN3JX4JqQ= 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 1591383832635185.8930907074083; Fri, 5 Jun 2020 12:03:52 -0700 (PDT) Received: from localhost ([::1]:52498 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1jhHd9-0003RT-Co for importer@patchew.org; Fri, 05 Jun 2020 15:03:51 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:58494) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1jhHbg-0001m8-A9 for qemu-devel@nongnu.org; Fri, 05 Jun 2020 15:02:20 -0400 Received: from esa4.mentor.iphmx.com ([68.232.137.252]:34075) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1jhHbf-00079E-8L for qemu-devel@nongnu.org; Fri, 05 Jun 2020 15:02:19 -0400 Received: from orw-gwy-01-in.mentorg.com ([192.94.38.165]) by esa4.mentor.iphmx.com with ESMTP; 05 Jun 2020 11:02:17 -0800 IronPort-SDR: lBm2zgaXa52gU9BgZFS7yOl7g/uy0ivLid77BkBYvU88+5elh4WW/6m7m7ALhTS/Bhr87ogz7w NYOaOMNHSVTxCVYVH56Qs0onVwGWBFL8mx0wgjXHDwaIXK46mvWeAsY5Z+yyK7A8q+rRWLeL1d CUnkkgf1w+/sifzxxh94b0xsfV2X1ApbWkUmx1LPF4fBg5bNH70tflZSPH6gxxxb64n3AbCEsO UwltTmJb/8hFLbXu2xZQgqtzPD03+Q2OSmifSjyb1qE74Bzlm8uHO4LKcVnUkliKSKZwzozUna xUI= X-IronPort-AV: E=Sophos;i="5.73,477,1583222400"; d="scan'208";a="49633101" IronPort-SDR: 0raJVmDGsvqfEhq/MUoYe1P/HVwTIRmNY+sOSXA3ZtN7xAuhX0OlR6i3QyZL2N7sGGgV/bz7i2 jtnyDj5jHUOsFHVSzA9ofsYtrsHPqyX0d3GA9dJ/VMVnLfEC2QvJMzuGyK7Je9h0U460pGxqxG TxMAGFcfsceo8EzdPio7c98rM7s9bb8+6ZaFQG1nsz2992NzaNPZctzdD51VJNYAkE/TDegFqH R6jGror8uPGWcxGPge33M284X3Fp0A3YK/TkBp+2X0TnjBvlGZroK9yQndn4Kp6jtKdd1pjz/u eF0= Date: Fri, 5 Jun 2020 19:02:11 +0000 From: Joseph Myers X-X-Sender: jsm28@digraph.polyomino.org.uk To: , , , , , , , Subject: [PATCH 6/7] target/i386: reimplement fprem1 using floatx80 operations 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-04.mgc.mentorg.com (139.181.222.4) To svr-ies-mbx-02.mgc.mentorg.com (139.181.222.2) 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/06/05 14:59:46 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_HELO_PASS=-0.001, 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" The x87 fprem1 emulation is currently based around conversion to double, which is inherently unsuitable for a good emulation of any floatx80 operation. Reimplement using the soft-float floatx80 remainder operations. Signed-off-by: Joseph Myers Reviewed-by: Richard Henderson --- target/i386/fpu_helper.c | 96 +++++++++++++++++++--------------------- 1 file changed, 45 insertions(+), 51 deletions(-) diff --git a/target/i386/fpu_helper.c b/target/i386/fpu_helper.c index 8ef5b463ea..bab35e00a0 100644 --- a/target/i386/fpu_helper.c +++ b/target/i386/fpu_helper.c @@ -934,63 +934,57 @@ void helper_fxtract(CPUX86State *env) merge_exception_flags(env, old_flags); } =20 -void helper_fprem1(CPUX86State *env) +static void helper_fprem_common(CPUX86State *env, bool mod) { - double st0, st1, dblq, fpsrcop, fptemp; - CPU_LDoubleU fpsrcop1, fptemp1; - int expdif; - signed long long int q; - - st0 =3D floatx80_to_double(env, ST0); - st1 =3D floatx80_to_double(env, ST1); - - if (isinf(st0) || isnan(st0) || isnan(st1) || (st1 =3D=3D 0.0)) { - ST0 =3D double_to_floatx80(env, 0.0 / 0.0); /* NaN */ - env->fpus &=3D ~0x4700; /* (C3,C2,C1,C0) <-- 0000 */ - return; - } - - fpsrcop =3D st0; - fptemp =3D st1; - fpsrcop1.d =3D ST0; - fptemp1.d =3D ST1; - expdif =3D EXPD(fpsrcop1) - EXPD(fptemp1); - - if (expdif < 0) { - /* optimisation? taken from the AMD docs */ - env->fpus &=3D ~0x4700; /* (C3,C2,C1,C0) <-- 0000 */ - /* ST0 is unchanged */ - return; - } + uint8_t old_flags =3D save_exception_flags(env); + uint64_t quotient; + CPU_LDoubleU temp0, temp1; + int exp0, exp1, expdiff; =20 - if (expdif < 53) { - dblq =3D fpsrcop / fptemp; - /* round dblq towards nearest integer */ - dblq =3D rint(dblq); - st0 =3D fpsrcop - fptemp * dblq; + temp0.d =3D ST0; + temp1.d =3D ST1; + exp0 =3D EXPD(temp0); + exp1 =3D EXPD(temp1); =20 - /* convert dblq to q by truncating towards zero */ - if (dblq < 0.0) { - q =3D (signed long long int)(-dblq); + env->fpus &=3D ~0x4700; /* (C3,C2,C1,C0) <-- 0000 */ + if (floatx80_is_zero(ST0) || floatx80_is_zero(ST1) || + exp0 =3D=3D 0x7fff || exp1 =3D=3D 0x7fff || + floatx80_invalid_encoding(ST0) || floatx80_invalid_encoding(ST1)) { + ST0 =3D floatx80_modrem(ST0, ST1, mod, "ient, &env->fp_status); + } else { + if (exp0 =3D=3D 0) { + exp0 =3D 1 - clz64(temp0.l.lower); + } + if (exp1 =3D=3D 0) { + exp1 =3D 1 - clz64(temp1.l.lower); + } + expdiff =3D exp0 - exp1; + if (expdiff < 64) { + ST0 =3D floatx80_modrem(ST0, ST1, mod, "ient, &env->fp_sta= tus); + env->fpus |=3D (quotient & 0x4) << (8 - 2); /* (C0) <-- q2 */ + env->fpus |=3D (quotient & 0x2) << (14 - 1); /* (C3) <-- q1 */ + env->fpus |=3D (quotient & 0x1) << (9 - 0); /* (C1) <-- q0 */ } else { - q =3D (signed long long int)dblq; + /* Partial remainder. This choice of how many bits to + * process at once is specified in AMD instruction set + * manuals, and empirically is followed by Intel + * processors as well; it ensures that the final remainder + * operation in a loop does produce the correct low three + * bits of the quotient. AMD manuals specify that the + * flags other than C2 are cleared, and empirically Intel + * processors clear them as well. */ + int n =3D 32 + (expdiff % 32); + temp1.d =3D floatx80_scalbn(temp1.d, expdiff - n, &env->fp_sta= tus); + ST0 =3D floatx80_mod(ST0, temp1.d, &env->fp_status); + env->fpus |=3D 0x400; /* C2 <-- 1 */ } - - env->fpus &=3D ~0x4700; /* (C3,C2,C1,C0) <-- 0000 */ - /* (C0,C3,C1) <-- (q2,q1,q0) */ - env->fpus |=3D (q & 0x4) << (8 - 2); /* (C0) <-- q2 */ - env->fpus |=3D (q & 0x2) << (14 - 1); /* (C3) <-- q1 */ - env->fpus |=3D (q & 0x1) << (9 - 0); /* (C1) <-- q0 */ - } else { - env->fpus |=3D 0x400; /* C2 <-- 1 */ - fptemp =3D pow(2.0, expdif - 50); - fpsrcop =3D (st0 / st1) / fptemp; - /* fpsrcop =3D integer obtained by chopping */ - fpsrcop =3D (fpsrcop < 0.0) ? - -(floor(fabs(fpsrcop))) : floor(fpsrcop); - st0 -=3D (st1 * fpsrcop * fptemp); } - ST0 =3D double_to_floatx80(env, st0); + merge_exception_flags(env, old_flags); +} + +void helper_fprem1(CPUX86State *env) +{ + helper_fprem_common(env, false); } =20 void helper_fprem(CPUX86State *env) --=20 2.17.1 --=20 Joseph S. Myers joseph@codesourcery.com From nobody Sun May 19 05:50:57 2024 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=1591384047; cv=none; d=zohomail.com; s=zohoarc; b=AL3oNxHl9DaA5rFGYXmK8QFNBHt19bzwbMPpdqK4hQu2sjaK4W3HqKlPuxMaYAvXD1tKnYkbZ1tPx6icvm+Qf3x+6PClXr+GjUbt81iNUq9kZNy/ni3V/DabwK25+a/+826Kd2+QBSzfSDHbA0KktUunQYVPg/LKLgEuj4XNenw= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1591384047; 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=AL8Peu5/Br4uMuhqrgBltmfHtyIkP2C/FHLNZuSYh1A=; b=BDhBN4OznaKKvakn/k7KdY8P37CtVL/t5/y2ahhzMxHNKgqisyTzyjFhpNfiwICH7NcCnFTvhIJCah+gOxyY2oTu6wjetBAyBQxsnbTZ0MRArncauYMiVY+I5AH1nAHLlMu4zSU2nBOuf533k4oh0yfKiZxf00O5kY6NAi4RJoo= 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 1591384047935827.1166592603377; Fri, 5 Jun 2020 12:07:27 -0700 (PDT) Received: from localhost ([::1]:33210 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1jhHgb-0007Vu-EY for importer@patchew.org; Fri, 05 Jun 2020 15:07:25 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:58616) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1jhHcU-0002yg-EF for qemu-devel@nongnu.org; Fri, 05 Jun 2020 15:03:14 -0400 Received: from esa4.mentor.iphmx.com ([68.232.137.252]:34118) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1jhHcT-0007JN-Hp for qemu-devel@nongnu.org; Fri, 05 Jun 2020 15:03:10 -0400 Received: from orw-gwy-01-in.mentorg.com ([192.94.38.165]) by esa4.mentor.iphmx.com with ESMTP; 05 Jun 2020 11:02:47 -0800 IronPort-SDR: OG6madOroSKM5PvwCaOwRNpHrvYOKnsLs4/jgPOBMgYVa7UUnlcOJKbYwFRBeIS2RM0+ulRTwj Y+ORKGXmgnFcQYMBhQR3hRgi/FrZvz2MC0ZkkbSXHqC4SJYjOP7omAoXxr6cEwYURyZeVa/6sx 4HdJQj+VN1zup06HRQ/rkJzfSdTVrx1wL6GetuGiYhfpJ0DEYnegnSw5zhg6FH49Hz02LkIq1u u6Q3UUvhm6gtNNnDPKuARx59UJf+MDKbqZYWqw9TzKSY3OTV91Q/OyQx/LC2wrE80FGN+93wNd SkY= X-IronPort-AV: E=Sophos;i="5.73,477,1583222400"; d="scan'208";a="49633118" IronPort-SDR: Dw0EzBKvMvk+mvfMqTcnCAOJIL/V/CQDQs3FoAcsEKE33C1FgWja2FdOwwmDr+YdPWa7rEUsXI EMnebsgTS9eAZeEMaFrq5i+1yGJo8yM3Z7R+6nGwexL+Xijd9ZixsS8+UMiBkYXoS0Pmkkkudv S0OGLHW9cOLKBc+2rs3wHE0TDk22MN68FX6s+CcW359WSgRHqq/7ar9+i1292KJ5PR7AUuVB8k 5A/n1M+SyVqo2dCEm/d6NwkgWOoZc/CizGZ/zoPDrJIyh6izwH+HQXwtTlQxy0jyWsyKaQv8xR cbg= Date: Fri, 5 Jun 2020 19:02:41 +0000 From: Joseph Myers X-X-Sender: jsm28@digraph.polyomino.org.uk To: , , , , , , , Subject: [PATCH 7/7] target/i386: reimplement fprem using floatx80 operations 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-02.mgc.mentorg.com (139.181.222.2) 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/06/05 14:59:46 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_HELO_PASS=-0.001, 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" The x87 fprem emulation is currently based around conversion to double, which is inherently unsuitable for a good emulation of any floatx80 operation. Reimplement using the soft-float floatx80 remainder operations. Signed-off-by: Joseph Myers --- target/i386/fpu_helper.c | 58 +--------------------------------------- 1 file changed, 1 insertion(+), 57 deletions(-) diff --git a/target/i386/fpu_helper.c b/target/i386/fpu_helper.c index bab35e00a0..d2fc2c1dde 100644 --- a/target/i386/fpu_helper.c +++ b/target/i386/fpu_helper.c @@ -989,63 +989,7 @@ void helper_fprem1(CPUX86State *env) =20 void helper_fprem(CPUX86State *env) { - double st0, st1, dblq, fpsrcop, fptemp; - CPU_LDoubleU fpsrcop1, fptemp1; - int expdif; - signed long long int q; - - st0 =3D floatx80_to_double(env, ST0); - st1 =3D floatx80_to_double(env, ST1); - - if (isinf(st0) || isnan(st0) || isnan(st1) || (st1 =3D=3D 0.0)) { - ST0 =3D double_to_floatx80(env, 0.0 / 0.0); /* NaN */ - env->fpus &=3D ~0x4700; /* (C3,C2,C1,C0) <-- 0000 */ - return; - } - - fpsrcop =3D st0; - fptemp =3D st1; - fpsrcop1.d =3D ST0; - fptemp1.d =3D ST1; - expdif =3D EXPD(fpsrcop1) - EXPD(fptemp1); - - if (expdif < 0) { - /* optimisation? taken from the AMD docs */ - env->fpus &=3D ~0x4700; /* (C3,C2,C1,C0) <-- 0000 */ - /* ST0 is unchanged */ - return; - } - - if (expdif < 53) { - dblq =3D fpsrcop / fptemp; /* ST0 / ST1 */ - /* round dblq towards zero */ - dblq =3D (dblq < 0.0) ? ceil(dblq) : floor(dblq); - st0 =3D fpsrcop - fptemp * dblq; /* fpsrcop is ST0 */ - - /* convert dblq to q by truncating towards zero */ - if (dblq < 0.0) { - q =3D (signed long long int)(-dblq); - } else { - q =3D (signed long long int)dblq; - } - - env->fpus &=3D ~0x4700; /* (C3,C2,C1,C0) <-- 0000 */ - /* (C0,C3,C1) <-- (q2,q1,q0) */ - env->fpus |=3D (q & 0x4) << (8 - 2); /* (C0) <-- q2 */ - env->fpus |=3D (q & 0x2) << (14 - 1); /* (C3) <-- q1 */ - env->fpus |=3D (q & 0x1) << (9 - 0); /* (C1) <-- q0 */ - } else { - int N =3D 32 + (expdif % 32); /* as per AMD docs */ - - env->fpus |=3D 0x400; /* C2 <-- 1 */ - fptemp =3D pow(2.0, (double)(expdif - N)); - fpsrcop =3D (st0 / st1) / fptemp; - /* fpsrcop =3D integer obtained by chopping */ - fpsrcop =3D (fpsrcop < 0.0) ? - -(floor(fabs(fpsrcop))) : floor(fpsrcop); - st0 -=3D (st1 * fpsrcop * fptemp); - } - ST0 =3D double_to_floatx80(env, st0); + helper_fprem_common(env, true); } =20 void helper_fyl2xp1(CPUX86State *env) --=20 2.17.1 --=20 Joseph S. Myers joseph@codesourcery.com