rs6000.c (rs6000_emit_move): If we load or store a long double type...
[gcc] 2018-01-17 Michael Meissner <meissner@linux.vnet.ibm.com> * config/rs6000/rs6000.c (rs6000_emit_move): If we load or store a long double type, set the flags for noting the default long double type, even if we don't pass or return a long double type. [gcc/testsuite] 2018-01-17 Michael Meissner <meissner@linux.vnet.ibm.com> * gcc.target/powerpc/gnuattr1.c: New test to make sure we set the appropriate .gnu_attribute for the long double type, if we use the long double type, but do not generate any calls. * gcc.target/powerpc/gnuattr2.c: Likewise. * gcc.target/powerpc/gnuattr3.c: Likewise. From-SVN: r256822
This commit is contained in:
parent
a533fc7635
commit
a3b11faf7e
6 changed files with 78 additions and 0 deletions
|
@ -1,3 +1,9 @@
|
|||
2018-01-17 Michael Meissner <meissner@linux.vnet.ibm.com>
|
||||
|
||||
* config/rs6000/rs6000.c (rs6000_emit_move): If we load or store a
|
||||
long double type, set the flags for noting the default long double
|
||||
type, even if we don't pass or return a long double type.
|
||||
|
||||
2018-01-17 Jan Hubicka <hubicka@ucw.cz>
|
||||
|
||||
PR ipa/83051
|
||||
|
|
|
@ -10494,6 +10494,23 @@ rs6000_emit_move (rtx dest, rtx source, machine_mode mode)
|
|||
gcc_unreachable ();
|
||||
}
|
||||
|
||||
#ifdef HAVE_AS_GNU_ATTRIBUTE
|
||||
/* If we use a long double type, set the flags in .gnu_attribute that say
|
||||
what the long double type is. This is to allow the linker's warning
|
||||
message for the wrong long double to be useful, even if the function does
|
||||
not do a call (for example, doing a 128-bit add on power9 if the long
|
||||
double type is IEEE 128-bit. Do not set this if __ibm128 or __floa128 are
|
||||
used if they aren't the default long dobule type. */
|
||||
if (rs6000_gnu_attr && (HAVE_LD_PPC_GNU_ATTR_LONG_DOUBLE || TARGET_64BIT))
|
||||
{
|
||||
if (TARGET_LONG_DOUBLE_128 && (mode == TFmode || mode == TCmode))
|
||||
rs6000_passes_float = rs6000_passes_long_double = true;
|
||||
|
||||
else if (!TARGET_LONG_DOUBLE_128 && (mode == DFmode || mode == DCmode))
|
||||
rs6000_passes_float = rs6000_passes_long_double = true;
|
||||
}
|
||||
#endif
|
||||
|
||||
/* See if we need to special case SImode/SFmode SUBREG moves. */
|
||||
if ((mode == SImode || mode == SFmode) && SUBREG_P (source)
|
||||
&& rs6000_emit_move_si_sf_subreg (dest, source, mode))
|
||||
|
|
|
@ -1,3 +1,11 @@
|
|||
2018-01-17 Michael Meissner <meissner@linux.vnet.ibm.com>
|
||||
|
||||
* gcc.target/powerpc/gnuattr1.c: New test to make sure we set the
|
||||
appropriate .gnu_attribute for the long double type, if we use the
|
||||
long double type, but do not generate any calls.
|
||||
* gcc.target/powerpc/gnuattr2.c: Likewise.
|
||||
* gcc.target/powerpc/gnuattr3.c: Likewise.
|
||||
|
||||
2018-01-17 Paolo Carlini <paolo.carlini@oracle.com>
|
||||
|
||||
PR c++/78344
|
||||
|
|
15
gcc/testsuite/gcc.target/powerpc/gnuattr1.c
Normal file
15
gcc/testsuite/gcc.target/powerpc/gnuattr1.c
Normal file
|
@ -0,0 +1,15 @@
|
|||
/* { dg-do compile { target { powerpc*-linux-* } } } */
|
||||
/* { dg-require-effective-target powerpc_vsx_ok } */
|
||||
/* { dg-options "-O2 -mvsx -mlong-double-64" } */
|
||||
/* { dg-final { scan-assembler "gnu_attribute 4, 9" } } */
|
||||
|
||||
/* Check that if we can do the long double operation without doing an emulator
|
||||
call, such as with 64-bit long double support, that we still set the
|
||||
appropriate .gnu_attribute. */
|
||||
|
||||
long double a;
|
||||
|
||||
void add1 (void)
|
||||
{
|
||||
a++;
|
||||
}
|
17
gcc/testsuite/gcc.target/powerpc/gnuattr2.c
Normal file
17
gcc/testsuite/gcc.target/powerpc/gnuattr2.c
Normal file
|
@ -0,0 +1,17 @@
|
|||
/* { dg-do compile { target { powerpc*-linux-* && lp64 } } } */
|
||||
/* { dg-require-effective-target powerpc_p9vector_ok } */
|
||||
/* { dg-options "-O2 -mpower9-vector -mabi=ieeelongdouble -Wno-psabi" } */
|
||||
/* { dg-final { scan-assembler "gnu_attribute 4, 13" } } */
|
||||
|
||||
/* Check that if we can do the long double operation without doing an emulator
|
||||
call, such as with IEEE 128-bit hardware support on power9, that we still
|
||||
set the appropriate .gnu_attribute. The && lp64 is needed, because we can't
|
||||
enable the IEEE 128-bit hardware instructions on ISA 3.0 (power9) in 32-bit,
|
||||
because we don't have a TImode available. */
|
||||
|
||||
long double a;
|
||||
|
||||
void add1 (void)
|
||||
{
|
||||
a++;
|
||||
}
|
15
gcc/testsuite/gcc.target/powerpc/gnuattr3.c
Normal file
15
gcc/testsuite/gcc.target/powerpc/gnuattr3.c
Normal file
|
@ -0,0 +1,15 @@
|
|||
/* { dg-do compile { target { powerpc*-linux-* } } } */
|
||||
/* { dg-require-effective-target powerpc_vsx_ok } */
|
||||
/* { dg-options "-O2 -mvsx -mabi=ibmlongdouble -Wno-psabi" } */
|
||||
/* { dg-final { scan-assembler "gnu_attribute 4, 5" } } */
|
||||
|
||||
/* Check that if we can do the long double operation without doing an emulator
|
||||
call, such as with copysign, that we still set the appropriate
|
||||
.gnu_attribute. */
|
||||
|
||||
long double a, b, c;
|
||||
|
||||
void cs (void)
|
||||
{
|
||||
a = __builtin_copysignl (b, c);
|
||||
}
|
Loading…
Add table
Reference in a new issue