https://gcc.gnu.org/bugzilla/show_bug.cgi?id=85667

mateuszb at poczta dot onet.pl changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |mateuszb at poczta dot onet.pl

--- Comment #4 from mateuszb at poczta dot onet.pl ---
Now gcc 9 is heavily broken for mingw-w64 target -- so it is not fixed.
Functions that returns float or double should return in xmm0 (not eax).

In gcc-9 source code there are some hints:
gcc/config/i386/cygming.h from line #400:
/* MSVC returns aggregate types of up to 8 bytes via registers.
   See i386.c:ix86_return_in_memory.  */
#undef MS_AGGREGATE_RETURN
#define MS_AGGREGATE_RETURN 1

I think we should check if type is aggregate before we return in eax and leave
xmm0 for float and double, for example:
Index: gcc/config/i386/i386.c
===================================================================
--- gcc/config/i386/i386.c      (revision 267268)
+++ gcc/config/i386/i386.c      (working copy)
@@ -9063,6 +9063,13 @@
              && !COMPLEX_MODE_P (mode))
            regno = FIRST_SSE_REG;
          break;
+       case 8:
+       case 4:
+         if (valtype != NULL_TREE && AGGREGATE_TYPE_P (valtype))
+           break;
+         if (mode == SFmode || mode == DFmode)
+           regno = FIRST_SSE_REG;
+         break;
        default:
          break;
         }

Reply via email to