https://gcc.gnu.org/g:2dfff4ffe88c9ef4f7c7887c09e5cee171b1a17e
commit r16-3736-g2dfff4ffe88c9ef4f7c7887c09e5cee171b1a17e Author: Jakub Jelinek <ja...@redhat.com> Date: Wed Sep 10 10:48:31 2025 +0200 c++: Change mangling of Intel/Motorola extended long double literals On Fri, Sep 05, 2025 at 09:57:06PM +0200, Matthias Kretz wrote: > > Hmm, would this fail for x86 long double, which is 80 bits? OK, just > > checked. It's mangled as 12/16 bytes on i686/x86_64. > > It seems that Clang and GCC disagree on mangling 80-Bit long double: > > I like Clang's interpretation of https://itanium-cxx-abi.github.io/cxx-abi/ > abi.html#mangle.float better. This patch changes the mangling of 80-bit long double literals from 24 or 32 digits (on m68k with padding bits in the middle, on x86 at the start) to just 20 hex digits. 2025-09-10 Jakub Jelinek <ja...@redhat.com> * mangle.cc (write_real_cst): Mangle Intel/Motorola extended 80-bit formats using 20 hex digits instead of 24 or 32. * g++.target/i386/mangle-ldbl-1.C: New test. * g++.target/i386/mangle-ldbl-2.C: New test. * g++.target/m68k/mangle-ldbl-1.C: New test. * g++.target/m68k/mangle-ldbl-2.C: New test. Diff: --- gcc/cp/mangle.cc | 23 +++++++++++++++++++++++ gcc/testsuite/g++.target/i386/mangle-ldbl-1.C | 8 ++++++++ gcc/testsuite/g++.target/i386/mangle-ldbl-2.C | 11 +++++++++++ gcc/testsuite/g++.target/m68k/mangle-ldbl-1.C | 9 +++++++++ gcc/testsuite/g++.target/m68k/mangle-ldbl-2.C | 9 +++++++++ 5 files changed, 60 insertions(+) diff --git a/gcc/cp/mangle.cc b/gcc/cp/mangle.cc index c1aae2de52b0..7678c0a97b96 100644 --- a/gcc/cp/mangle.cc +++ b/gcc/cp/mangle.cc @@ -2203,6 +2203,29 @@ write_real_cst (const tree value) else i = words - 1, limit = -1, dir = -1; + if (GET_MODE_PRECISION (SCALAR_FLOAT_TYPE_MODE (type)) == 80 + && abi_check (21)) + { + /* For -fabi-version=21 and above mangle + Intel/Motorola extended format 1.0L as + 3fff8000000000000000 + rather than the previous + 0000000000003fff8000000000000000 (x86_64) + 00003fff8000000000000000 (ia32) + 3fff00008000000000000000 (m68k -mc68020) + i.e. without any embedded padding bits. */ + if (words == 4) + i += dir; + else + gcc_assert (words == 3); + unsigned long val = (unsigned long) target_real[i]; + if (REAL_MODE_FORMAT (SCALAR_FLOAT_TYPE_MODE (type))->signbit_ro == 95) + val >>= 16; + sprintf (buffer, "%04lx", val); + write_chars (buffer, 4); + i += dir; + } + for (; i != limit; i += dir) { sprintf (buffer, "%08lx", (unsigned long) target_real[i]); diff --git a/gcc/testsuite/g++.target/i386/mangle-ldbl-1.C b/gcc/testsuite/g++.target/i386/mangle-ldbl-1.C new file mode 100644 index 000000000000..c891e9532474 --- /dev/null +++ b/gcc/testsuite/g++.target/i386/mangle-ldbl-1.C @@ -0,0 +1,8 @@ +// { dg-do compile { target { c++20 && { x86_64-*-linux* i?86-*-linux* } } } } +// { dg-final { scan-assembler "_Z3fooILe3fff8000000000000000EEiv" } } +// { dg-final { scan-assembler "_Z3fooILe40008000000000000000EEiv" } } + +template <long double a> +int foo () { return 0; } + +int bar () { return foo <1.0L> () + foo <2.0L> (); } diff --git a/gcc/testsuite/g++.target/i386/mangle-ldbl-2.C b/gcc/testsuite/g++.target/i386/mangle-ldbl-2.C new file mode 100644 index 000000000000..baef12e15d22 --- /dev/null +++ b/gcc/testsuite/g++.target/i386/mangle-ldbl-2.C @@ -0,0 +1,11 @@ +// { dg-do compile { target { c++20 && { x86_64-*-linux* i?86-*-linux* } } } } +// { dg-additional-options "-fabi-version=20" } +// { dg-final { scan-assembler "_Z3fooILe0000000000003fff8000000000000000EEiv" { target { ! ia32 } } } } +// { dg-final { scan-assembler "_Z3fooILe00000000000040008000000000000000EEiv" { target { ! ia32 } } } } +// { dg-final { scan-assembler "_Z3fooILe00003fff8000000000000000EEiv" { target ia32 } } } +// { dg-final { scan-assembler "_Z3fooILe000040008000000000000000EEiv" { target ia32 } } } + +template <long double a> +int foo () { return 0; } + +int bar () { return foo <1.0L> () + foo <2.0L> (); } diff --git a/gcc/testsuite/g++.target/m68k/mangle-ldbl-1.C b/gcc/testsuite/g++.target/m68k/mangle-ldbl-1.C new file mode 100644 index 000000000000..2a473ae2a66d --- /dev/null +++ b/gcc/testsuite/g++.target/m68k/mangle-ldbl-1.C @@ -0,0 +1,9 @@ +// { dg-do compile { target { c++20 && { m68k*-*-linux* } } } } +// { dg-additional-options "-m68020" } +// { dg-final { scan-assembler "_Z3fooILe3fff8000000000000000EEiv" } } +// { dg-final { scan-assembler "_Z3fooILe40008000000000000000EEiv" } } + +template <long double a> +int foo () { return 0; } + +int bar () { return foo <1.0L> () + foo <2.0L> (); } diff --git a/gcc/testsuite/g++.target/m68k/mangle-ldbl-2.C b/gcc/testsuite/g++.target/m68k/mangle-ldbl-2.C new file mode 100644 index 000000000000..113775e87880 --- /dev/null +++ b/gcc/testsuite/g++.target/m68k/mangle-ldbl-2.C @@ -0,0 +1,9 @@ +// { dg-do compile { target { c++20 && { m68k*-*-linux* } } } } +// { dg-additional-options "-m68020 -fabi-version=20" } +// { dg-final { scan-assembler "_Z3fooILe3fff00008000000000000000EEiv" } } +// { dg-final { scan-assembler "_Z3fooILe400000008000000000000000EEiv" } } + +template <long double a> +int foo () { return 0; } + +int bar () { return foo <1.0L> () + foo <2.0L> (); }