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> (); }

Reply via email to