From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: by sourceware.org (Postfix, from userid 2153) id 77C1F393A436; Tue, 11 Jan 2022 22:52:06 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 77C1F393A436 MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Content-Type: text/plain; charset="utf-8" From: Jakub Jelinek To: gcc-cvs@gcc.gnu.org Subject: [gcc r12-6508] power-ieee128: Fix up byte-swapping for IBM extended real(kind=16) X-Act-Checkin: gcc X-Git-Author: Jakub Jelinek X-Git-Refname: refs/heads/master X-Git-Oldrev: a574503ff95691c932fd896568f6914a63be4a02 X-Git-Newrev: a01be2f3095dc91a6999d4abb3e6c96c58bc5561 Message-Id: <20220111225206.77C1F393A436@sourceware.org> Date: Tue, 11 Jan 2022 22:52:06 +0000 (GMT) X-BeenThere: gcc-cvs@gcc.gnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Gcc-cvs mailing list List-Unsubscribe: , List-Archive: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 11 Jan 2022 22:52:06 -0000 https://gcc.gnu.org/g:a01be2f3095dc91a6999d4abb3e6c96c58bc5561 commit r12-6508-ga01be2f3095dc91a6999d4abb3e6c96c58bc5561 Author: Jakub Jelinek Date: Tue Jan 11 23:03:11 2022 +0100 power-ieee128: Fix up byte-swapping for IBM extended real(kind=16) Here is a patch to fix up the ppc64be vs. ppc64le byteswapping of IBM extended real(kind=16) and complex(kind=16). Similarly to the BT_COMPLEX case it halves size and doubles nelems for the bswap_array calls. Of course for r16_ibm and r16_ieee conversions one needs to make sure it is only done when the on file data is in that format and not in IEEE quad. 2022-01-11 Jakub Jelinek * io/transfer.c (unformatted_read, unformatted_write): When byteswapping IBM extended real(kind=16), handle it as byteswapping two real(kind=8) values. Diff: --- libgfortran/io/transfer.c | 38 ++++++++++++++++++++++++++++++++++++-- 1 file changed, 36 insertions(+), 2 deletions(-) diff --git a/libgfortran/io/transfer.c b/libgfortran/io/transfer.c index 8e4f64db177..f543dfd79dc 100644 --- a/libgfortran/io/transfer.c +++ b/libgfortran/io/transfer.c @@ -1145,11 +1145,28 @@ unformatted_read (st_parameter_dt *dtp, bt type, size /= 2; } #ifndef HAVE_GFC_REAL_17 +#if defined(HAVE_GFC_REAL_16) && GFC_REAL_16_DIGITS == 106 + /* IBM extended format is stored as a pair of IEEE754 + double values, with the more significant value first + in both big and little endian. */ + if (kind == 16 && (type == BT_REAL || type == BT_COMPLEX)) + { + nelems *= 2; + size /= 2; + } +#endif bswap_array (dest, dest, size, nelems); #else unit_convert bswap = convert & ~(GFC_CONVERT_R16_IEEE | GFC_CONVERT_R16_IBM); if (bswap == GFC_CONVERT_SWAP) - bswap_array (dest, dest, size, nelems); + { + if ((type == BT_REAL || type == BT_COMPLEX) + && ((kind == 16 && (convert & GFC_CONVERT_R16_IEEE) == 0) + || (kind == 17 && (convert & GFC_CONVERT_R16_IBM)))) + bswap_array (dest, dest, size / 2, nelems * 2); + else + bswap_array (dest, dest, size, nelems); + } if ((convert & GFC_CONVERT_R16_IEEE) && kind == 16 @@ -1274,6 +1291,18 @@ unformatted_write (st_parameter_dt *dtp, bt type, size /= 2; } +#if !defined(HAVE_GFC_REAL_17) && defined(HAVE_GFC_REAL_16) \ + && GFC_REAL_16_DIGITS == 106 + /* IBM extended format is stored as a pair of IEEE754 + double values, with the more significant value first + in both big and little endian. */ + if (kind == 16 && (type == BT_REAL || type == BT_COMPLEX)) + { + nelems *= 2; + size /= 2; + } +#endif + /* By now, all complex variables have been split into their constituent reals. */ @@ -1321,7 +1350,12 @@ unformatted_write (st_parameter_dt *dtp, bt type, if ((dtp->u.p.current_unit->flags.convert & ~(GFC_CONVERT_R16_IEEE | GFC_CONVERT_R16_IBM)) == GFC_CONVERT_SWAP) - bswap_array (buffer, buffer, size, nc); + bswap_array (buffer, buffer, size / 2, nc * 2); + } + else if (kind == 16 && (type == BT_REAL || type == BT_COMPLEX)) + { + bswap_array (buffer, p, size / 2, nc * 2); + p += size * nc; } else #endif