On Fri, Jan 31, 2014 at 5:59 AM, H.J. Lu <hongjiu...@intel.com> wrote:
> Hi,
>
> For 64-bit Android, long double is 128-bit IEEE-754 floating point type.
> This patch adds -mlong-double-128 to i386 and makes it default for 64-bit
> Bionic.  I only added MASK_LONG_DOUBLE_128.  I made -mlong-double-128,
> -mlong-double-64 and -mlong-double-80 negate each other so that the
> last one on command line wins.  It os OK since we don't support
> -mlong-double-xxx in target attribute. I added some testcases to verify
> it works correctly.  OK for trunk?

I don't see any where in the documentation that explains the
difference between -mlong-double-128 and -m128bit-long-double.  Can
you please add that  -mlong-double-128 causes soft-floating point.
Also what about the interactions between these two options.

Thanks,
Andrew



>
> Thanks.
>
>
> H.J.
> ---
> gcc/
>
> 2014-01-30  H.J. Lu  <hongjiu...@intel.com>
>
>         * config/i386/i386.c (flag_opts): Add -mlong-double-128.
>         (ix86_option_override_internal): Default long double to 64-bit for
>         32-bit Bionic and to 128-bit for 64-bit Bionic.
>
>         * config/i386/i386.h (LONG_DOUBLE_TYPE_SIZE): Use 128 if
>         TARGET_LONG_DOUBLE_128 is true.
>         (LIBGCC2_LONG_DOUBLE_TYPE_SIZE): Likewise.
>
>         * config/i386/i386.opt (mlong-double-80): Negate -mlong-double-64.
>         (mlong-double-64): Negate -mlong-double-128.
>         (mlong-double-128): New option.
>
>         * config/i386/i386-c.c (ix86_target_macros): Define
>         __LONG_DOUBLE_128__ for TARGET_LONG_DOUBLE_128.
>
>         * doc/invoke.texi: Document -mlong-double-128.
>
> gcc/testsuite/
>
> 2014-01-30  H.J. Lu  <hongjiu...@intel.com>
>
>         * gcc.target/i386/long-double-64-1.c: Verify __multf3 isn't used.
>         * gcc.target/i386/long-double-64-4.c: Likewise.
>         * gcc.target/i386/long-double-80-1.c: Likewise.
>         * gcc.target/i386/long-double-80-2.c: Likewise.
>         * gcc.target/i386/long-double-80-3.c: Likewise.
>         * gcc.target/i386/long-double-80-4.c: Likewise.
>         * gcc.target/i386/long-double-80-5.c: Likewise.
>         * gcc.target/i386/long-double-64-2.c: Limit to ia32.  Verify
>         __multf3 isn't used.
>         * gcc.target/i386/long-double-64-3.c: Likewise.
>         * gcc.target/i386/long-double-128-1.c: New test.
>         * gcc.target/i386/long-double-128-2.c: Likewise.
>         * gcc.target/i386/long-double-128-3.c: Likewise.
>         * gcc.target/i386/long-double-128-4.c: Likewise.
>         * gcc.target/i386/long-double-128-5.c: Likewise.
>         * gcc.target/i386/long-double-128-6.c: Likewise.
>         * gcc.target/i386/long-double-128-7.c: Likewise.
>         * gcc.target/i386/long-double-128-8.c: Likewise.
>         * gcc.target/i386/long-double-128-9.c: Likewise.
>         * gcc.target/i386/long-double-64-5.c: Likewise.
>         * gcc.target/i386/long-double-64-6.c: Likewise.
>         * gcc.target/i386/long-double-64-7.c: Likewise.
>         * gcc.target/i386/long-double-64-8.c: Likewise.
>         * gcc.target/i386/long-double-64-9.c: Likewise.
>         * gcc.target/i386/long-double-80-10.c: Likewise.
>         * gcc.target/i386/long-double-80-8.c: Likewise.
>         * gcc.target/i386/long-double-80-9.c: Likewise.
> diff --git a/gcc/config/i386/i386-c.c b/gcc/config/i386/i386-c.c
> index ee83de6..0c50720 100644
> --- a/gcc/config/i386/i386-c.c
> +++ b/gcc/config/i386/i386-c.c
> @@ -513,6 +513,9 @@ ix86_target_macros (void)
>    if (TARGET_LONG_DOUBLE_64)
>      cpp_define (parse_in, "__LONG_DOUBLE_64__");
>
> +  if (TARGET_LONG_DOUBLE_128)
> +    cpp_define (parse_in, "__LONG_DOUBLE_128__");
> +
>    cpp_define_formatted (parse_in, "__ATOMIC_HLE_ACQUIRE=%d", 
> IX86_HLE_ACQUIRE);
>    cpp_define_formatted (parse_in, "__ATOMIC_HLE_RELEASE=%d", 
> IX86_HLE_RELEASE);
>
> diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c
> index 1e65743..3a01b6e 100644
> --- a/gcc/config/i386/i386.c
> +++ b/gcc/config/i386/i386.c
> @@ -2628,6 +2628,7 @@ ix86_target_string (HOST_WIDE_INT isa, int flags, const 
> char *arch,
>    static struct ix86_target_opts flag_opts[] =
>    {
>      { "-m128bit-long-double",          MASK_128BIT_LONG_DOUBLE },
> +    { "-mlong-double-128",             MASK_LONG_DOUBLE_128 },
>      { "-mlong-double-64",              MASK_LONG_DOUBLE_64 },
>      { "-m80387",                       MASK_80387 },
>      { "-maccumulate-outgoing-args",    MASK_ACCUMULATE_OUTGOING_ARGS },
> @@ -4195,10 +4196,18 @@ ix86_option_override_internal (bool main_args_p,
>    else if (opts_set->x_target_flags & MASK_RECIP)
>      opts->x_recip_mask &= ~(RECIP_MASK_ALL & ~opts->x_recip_mask_explicit);
>
> -  /* Default long double to 64-bit for Bionic.  */
> +  /* Default long double to 64-bit for 32-bit Bionic and to __float128
> +     for 64-bit Bionic.  */
>    if (TARGET_HAS_BIONIC
> -      && !(opts_set->x_target_flags & MASK_LONG_DOUBLE_64))
> -    opts->x_target_flags |= MASK_LONG_DOUBLE_64;
> +      && !(opts_set->x_target_flags
> +          & (MASK_LONG_DOUBLE_64 | MASK_LONG_DOUBLE_128)))
> +    opts->x_target_flags |= (TARGET_64BIT
> +                            ? MASK_LONG_DOUBLE_128
> +                            : MASK_LONG_DOUBLE_64);
> +
> +  /* Only one of them can be active.  */
> +  gcc_assert ((opts->x_target_flags & MASK_LONG_DOUBLE_64) == 0
> +             || (opts->x_target_flags & MASK_LONG_DOUBLE_128) == 0);
>
>    /* Save the initial options in case the user does function specific
>       options.  */
> diff --git a/gcc/config/i386/i386.h b/gcc/config/i386/i386.h
> index bfb6dc6..0e757c9c 100644
> --- a/gcc/config/i386/i386.h
> +++ b/gcc/config/i386/i386.h
> @@ -668,12 +668,15 @@ extern const char *host_detect_local_cpu (int argc, 
> const char **argv);
>  #define LONG_LONG_TYPE_SIZE 64
>  #define FLOAT_TYPE_SIZE 32
>  #define DOUBLE_TYPE_SIZE 64
> -#define LONG_DOUBLE_TYPE_SIZE (TARGET_LONG_DOUBLE_64 ? 64 : 80)
> +#define LONG_DOUBLE_TYPE_SIZE \
> +  (TARGET_LONG_DOUBLE_64 ? 64 : (TARGET_LONG_DOUBLE_128 ? 128 : 80))
>
>  /* Define this to set long double type size to use in libgcc2.c, which can
>     not depend on target_flags.  */
>  #ifdef __LONG_DOUBLE_64__
>  #define LIBGCC2_LONG_DOUBLE_TYPE_SIZE 64
> +#elif defined (__LONG_DOUBLE_128__)
> +#define LIBGCC2_LONG_DOUBLE_TYPE_SIZE 128
>  #else
>  #define LIBGCC2_LONG_DOUBLE_TYPE_SIZE 80
>  #endif
> diff --git a/gcc/config/i386/i386.opt b/gcc/config/i386/i386.opt
> index 485ed2a..d5dd0fa 100644
> --- a/gcc/config/i386/i386.opt
> +++ b/gcc/config/i386/i386.opt
> @@ -186,13 +186,17 @@ Target RejectNegative Report 
> InverseMask(128BIT_LONG_DOUBLE) Save
>  sizeof(long double) is 12
>
>  mlong-double-80
> -Target Report RejectNegative InverseMask(LONG_DOUBLE_64) Save
> +Target Report RejectNegative Negative(mlong-double-64) 
> InverseMask(LONG_DOUBLE_64) Save
>  Use 80-bit long double
>
>  mlong-double-64
> -Target Report RejectNegative Mask(LONG_DOUBLE_64) Save
> +Target Report RejectNegative Negative(mlong-double-128) Mask(LONG_DOUBLE_64) 
> InverseMask(LONG_DOUBLE_128) Save
>  Use 64-bit long double
>
> +mlong-double-128
> +Target Report RejectNegative Negative(mlong-double-80) Mask(LONG_DOUBLE_128) 
> InverseMask(LONG_DOUBLE_64) Save
> +Use 128-bit long double
> +
>  maccumulate-outgoing-args
>  Target Report Mask(ACCUMULATE_OUTGOING_ARGS) Save
>  Reserve space for outgoing arguments in the function prologue
> diff --git a/gcc/doc/invoke.texi b/gcc/doc/invoke.texi
> index 268abf6..73c7bbd 100644
> --- a/gcc/doc/invoke.texi
> +++ b/gcc/doc/invoke.texi
> @@ -674,7 +674,7 @@ Objective-C and Objective-C++ Dialects}.
>  -minline-stringops-dynamically -mstringop-strategy=@var{alg} @gol
>  -mmemcpy-strategy=@var{strategy} -mmemset-strategy=@var{strategy}
>  -mpush-args  -maccumulate-outgoing-args  -m128bit-long-double @gol
> --m96bit-long-double -mlong-double-64 -mlong-double-80 @gol
> +-m96bit-long-double -mlong-double-64 -mlong-double-80 -mlong-double-128 @gol
>  -mregparm=@var{num}  -msseregparm @gol
>  -mveclibabi=@var{type} -mvect8-ret-in-mem @gol
>  -mpc32 -mpc64 -mpc80 -mstackrealign @gol
> @@ -15053,11 +15053,15 @@ with code compiled without that switch.
>
>  @item -mlong-double-64
>  @itemx -mlong-double-80
> +@itemx -mlong-double-128
>  @opindex mlong-double-64
>  @opindex mlong-double-80
> +@opindex mlong-double-128
>  These switches control the size of @code{long double} type. A size
>  of 64 bits makes the @code{long double} type equivalent to the @code{double}
> -type. This is the default for Bionic C library.
> +type. This is the default for 32-bit Bionic C library.  A size
> +of 128 bits makes the @code{long double} type equivalent to the
> +@code{__float128} type. This is the default for 64-bit Bionic C library.
>
>  @strong{Warning:} if you override the default value for your target ABI, this
>  changes the size of
> diff --git a/gcc/testsuite/gcc.target/i386/long-double-128-1.c 
> b/gcc/testsuite/gcc.target/i386/long-double-128-1.c
> new file mode 100644
> index 0000000..cbd9bb5
> --- /dev/null
> +++ b/gcc/testsuite/gcc.target/i386/long-double-128-1.c
> @@ -0,0 +1,11 @@
> +/* { dg-do compile } */
> +/* { dg-options "-O2 -mlong-double-128" } */
> +
> +long double
> +foo (long double x)
> +{
> +  return x * x;
> +}
> +
> +/* { dg-final { scan-assembler-not "fldt" } } */
> +/* { dg-final { scan-assembler "call\[\\t \]*_?__multf3" } } */
> diff --git a/gcc/testsuite/gcc.target/i386/long-double-128-2.c 
> b/gcc/testsuite/gcc.target/i386/long-double-128-2.c
> new file mode 100644
> index 0000000..9aef4bf
> --- /dev/null
> +++ b/gcc/testsuite/gcc.target/i386/long-double-128-2.c
> @@ -0,0 +1,11 @@
> +/* { dg-do compile { target { *-*-linux* && { ! ia32 } } } } */
> +/* { dg-options "-O2 -mbionic" } */
> +
> +long double
> +foo (long double x)
> +{
> +  return x * x;
> +}
> +
> +/* { dg-final { scan-assembler-not "fldt" } } */
> +/* { dg-final { scan-assembler "call\[\\t \]*_?__multf3" } } */
> diff --git a/gcc/testsuite/gcc.target/i386/long-double-128-3.c 
> b/gcc/testsuite/gcc.target/i386/long-double-128-3.c
> new file mode 100644
> index 0000000..86b9b12
> --- /dev/null
> +++ b/gcc/testsuite/gcc.target/i386/long-double-128-3.c
> @@ -0,0 +1,11 @@
> +/* { dg-do compile { target { *-*-linux* && { ! ia32 } } } } */
> +/* { dg-options "-O2 -mandroid" } */
> +
> +long double
> +foo (long double x)
> +{
> +  return x * x;
> +}
> +
> +/* { dg-final { scan-assembler-not "fldt" } } */
> +/* { dg-final { scan-assembler "call\[\\t \]*_?__multf3" } } */
> diff --git a/gcc/testsuite/gcc.target/i386/long-double-128-4.c 
> b/gcc/testsuite/gcc.target/i386/long-double-128-4.c
> new file mode 100644
> index 0000000..af73635
> --- /dev/null
> +++ b/gcc/testsuite/gcc.target/i386/long-double-128-4.c
> @@ -0,0 +1,11 @@
> +/* { dg-do compile { target { *-*-linux* && { ! ia32 } } } } */
> +/* { dg-options "-O2 -mlong-double-128 -mbionic" } */
> +
> +long double
> +foo (long double x)
> +{
> +  return x * x;
> +}
> +
> +/* { dg-final { scan-assembler-not "fldt" } } */
> +/* { dg-final { scan-assembler "call\[\\t \]*_?__multf3" } } */
> diff --git a/gcc/testsuite/gcc.target/i386/long-double-128-5.c 
> b/gcc/testsuite/gcc.target/i386/long-double-128-5.c
> new file mode 100644
> index 0000000..fb32c5b
> --- /dev/null
> +++ b/gcc/testsuite/gcc.target/i386/long-double-128-5.c
> @@ -0,0 +1,11 @@
> +/* { dg-do compile { target { *-*-linux* && { ! ia32 } } } } */
> +/* { dg-options "-O2 -mlong-double-128 -mandroid" } */
> +
> +long double
> +foo (long double x)
> +{
> +  return x * x;
> +}
> +
> +/* { dg-final { scan-assembler-not "fldt" } } */
> +/* { dg-final { scan-assembler "call\[\\t \]*_?__multf3" } } */
> diff --git a/gcc/testsuite/gcc.target/i386/long-double-128-6.c 
> b/gcc/testsuite/gcc.target/i386/long-double-128-6.c
> new file mode 100644
> index 0000000..2797516
> --- /dev/null
> +++ b/gcc/testsuite/gcc.target/i386/long-double-128-6.c
> @@ -0,0 +1,11 @@
> +/* { dg-do compile } */
> +/* { dg-options "-O2 -mlong-double-64 -mlong-double-128" } */
> +
> +long double
> +foo (long double x)
> +{
> +  return x * x;
> +}
> +
> +/* { dg-final { scan-assembler-not "fldt" } } */
> +/* { dg-final { scan-assembler "call\[\\t \]*_?__multf3" } } */
> diff --git a/gcc/testsuite/gcc.target/i386/long-double-128-7.c 
> b/gcc/testsuite/gcc.target/i386/long-double-128-7.c
> new file mode 100644
> index 0000000..eaa7f63
> --- /dev/null
> +++ b/gcc/testsuite/gcc.target/i386/long-double-128-7.c
> @@ -0,0 +1,11 @@
> +/* { dg-do compile } */
> +/* { dg-options "-O2 -mlong-double-64" } */
> +
> +__float128
> +foo (__float128 x)
> +{
> +  return x * x;
> +}
> +
> +/* { dg-final { scan-assembler-not "fldt" } } */
> +/* { dg-final { scan-assembler "call\[\\t \]*_?__multf3" } } */
> diff --git a/gcc/testsuite/gcc.target/i386/long-double-128-8.c 
> b/gcc/testsuite/gcc.target/i386/long-double-128-8.c
> new file mode 100644
> index 0000000..d869efc
> --- /dev/null
> +++ b/gcc/testsuite/gcc.target/i386/long-double-128-8.c
> @@ -0,0 +1,11 @@
> +/* { dg-do run } */
> +/* { dg-options "-O0 -mlong-double-64 -mfpmath=387" } */
> +
> +int
> +main ()
> +{
> +  __float128 a = -0.23456789;
> +  if ((double) a >= 0)
> +    __builtin_abort ();
> +  return 0;
> +}
> diff --git a/gcc/testsuite/gcc.target/i386/long-double-128-9.c 
> b/gcc/testsuite/gcc.target/i386/long-double-128-9.c
> new file mode 100644
> index 0000000..bc90f21
> --- /dev/null
> +++ b/gcc/testsuite/gcc.target/i386/long-double-128-9.c
> @@ -0,0 +1,13 @@
> +/* { dg-do run } */
> +/* { dg-options "-O0 -mlong-double-64 -mfpmath=sse -msse2" } */
> +/* { dg-require-effective-target sse2 } */
> +
> +#include "sse2-check.h"
> +
> +static void
> +sse2_test (void)
> +{
> +  __float128 a = -0.23456789;
> +  if ((double) a >= 0)
> +    __builtin_abort ();
> +}
> diff --git a/gcc/testsuite/gcc.target/i386/long-double-64-1.c 
> b/gcc/testsuite/gcc.target/i386/long-double-64-1.c
> index cf93379..f5c83a5 100644
> --- a/gcc/testsuite/gcc.target/i386/long-double-64-1.c
> +++ b/gcc/testsuite/gcc.target/i386/long-double-64-1.c
> @@ -8,3 +8,4 @@ foo (long double x)
>  }
>
>  /* { dg-final { scan-assembler-not "fldt" } } */
> +/* { dg-final { scan-assembler-not "call\[\\t \]*_?__multf3" } } */
> diff --git a/gcc/testsuite/gcc.target/i386/long-double-64-2.c 
> b/gcc/testsuite/gcc.target/i386/long-double-64-2.c
> index ddf4fe6..13a7be0 100644
> --- a/gcc/testsuite/gcc.target/i386/long-double-64-2.c
> +++ b/gcc/testsuite/gcc.target/i386/long-double-64-2.c
> @@ -1,4 +1,4 @@
> -/* { dg-do compile { target *-*-linux* } } */
> +/* { dg-do compile { target { *-*-linux* && ia32 } } } */
>  /* { dg-options "-O2 -mbionic" } */
>
>  long double
> @@ -8,3 +8,4 @@ foo (long double x)
>  }
>
>  /* { dg-final { scan-assembler-not "fldt" } } */
> +/* { dg-final { scan-assembler-not "call\[\\t \]*_?__multf3" } } */
> diff --git a/gcc/testsuite/gcc.target/i386/long-double-64-3.c 
> b/gcc/testsuite/gcc.target/i386/long-double-64-3.c
> index e748fab..99d3d5f 100644
> --- a/gcc/testsuite/gcc.target/i386/long-double-64-3.c
> +++ b/gcc/testsuite/gcc.target/i386/long-double-64-3.c
> @@ -1,4 +1,4 @@
> -/* { dg-do compile { target *-*-linux* } } */
> +/* { dg-do compile { target { *-*-linux* && ia32 } } } */
>  /* { dg-options "-O2 -mandroid" } */
>
>  long double
> @@ -8,3 +8,4 @@ foo (long double x)
>  }
>
>  /* { dg-final { scan-assembler-not "fldt" } } */
> +/* { dg-final { scan-assembler-not "call\[\\t \]*_?__multf3" } } */
> diff --git a/gcc/testsuite/gcc.target/i386/long-double-64-4.c 
> b/gcc/testsuite/gcc.target/i386/long-double-64-4.c
> index d9c25aa..471f0bf 100644
> --- a/gcc/testsuite/gcc.target/i386/long-double-64-4.c
> +++ b/gcc/testsuite/gcc.target/i386/long-double-64-4.c
> @@ -8,3 +8,4 @@ foo (long double x)
>  }
>
>  /* { dg-final { scan-assembler-not "fldt" } } */
> +/* { dg-final { scan-assembler-not "call\[\\t \]*_?__multf3" } } */
> diff --git a/gcc/testsuite/gcc.target/i386/long-double-64-5.c 
> b/gcc/testsuite/gcc.target/i386/long-double-64-5.c
> new file mode 100644
> index 0000000..f634425
> --- /dev/null
> +++ b/gcc/testsuite/gcc.target/i386/long-double-64-5.c
> @@ -0,0 +1,11 @@
> +/* { dg-do compile } */
> +/* { dg-options "-O2 -mlong-double-128 -mlong-double-64" } */
> +
> +long double
> +foo (long double x)
> +{
> +  return x * x;
> +}
> +
> +/* { dg-final { scan-assembler-not "fldt" } } */
> +/* { dg-final { scan-assembler-not "call\[\\t \]*_?__multf3" } } */
> diff --git a/gcc/testsuite/gcc.target/i386/long-double-64-6.c 
> b/gcc/testsuite/gcc.target/i386/long-double-64-6.c
> new file mode 100644
> index 0000000..76b030d
> --- /dev/null
> +++ b/gcc/testsuite/gcc.target/i386/long-double-64-6.c
> @@ -0,0 +1,11 @@
> +/* { dg-do compile } */
> +/* { dg-options "-O2 -mlong-double-80 -mlong-double-128 -mlong-double-64" } 
> */
> +
> +long double
> +foo (long double x)
> +{
> +  return x * x;
> +}
> +
> +/* { dg-final { scan-assembler-not "fldt" } } */
> +/* { dg-final { scan-assembler-not "call\[\\t \]*_?__multf3" } } */
> diff --git a/gcc/testsuite/gcc.target/i386/long-double-64-7.c 
> b/gcc/testsuite/gcc.target/i386/long-double-64-7.c
> new file mode 100644
> index 0000000..9f66d37
> --- /dev/null
> +++ b/gcc/testsuite/gcc.target/i386/long-double-64-7.c
> @@ -0,0 +1,11 @@
> +/* { dg-do compile } */
> +/* { dg-options "-O2 -mlong-double-128 -mlong-double-80 -mlong-double-64" } 
> */
> +
> +long double
> +foo (long double x)
> +{
> +  return x * x;
> +}
> +
> +/* { dg-final { scan-assembler-not "fldt" } } */
> +/* { dg-final { scan-assembler-not "call\[\\t \]*_?__multf3" } } */
> diff --git a/gcc/testsuite/gcc.target/i386/long-double-64-8.c 
> b/gcc/testsuite/gcc.target/i386/long-double-64-8.c
> new file mode 100644
> index 0000000..fd2fdbc
> --- /dev/null
> +++ b/gcc/testsuite/gcc.target/i386/long-double-64-8.c
> @@ -0,0 +1,11 @@
> +/* { dg-do compile { target *-*-linux* } } */
> +/* { dg-options "-O2 -mlong-double-64 -mbionic" } */
> +
> +long double
> +foo (long double x)
> +{
> +  return x * x;
> +}
> +
> +/* { dg-final { scan-assembler-not "fldt" } } */
> +/* { dg-final { scan-assembler-not "call\[\\t \]*_?__multf3" } } */
> diff --git a/gcc/testsuite/gcc.target/i386/long-double-64-9.c 
> b/gcc/testsuite/gcc.target/i386/long-double-64-9.c
> new file mode 100644
> index 0000000..595dba3
> --- /dev/null
> +++ b/gcc/testsuite/gcc.target/i386/long-double-64-9.c
> @@ -0,0 +1,11 @@
> +/* { dg-do compile { target *-*-linux* } } */
> +/* { dg-options "-O2 -mlong-double-64 -mandroid" } */
> +
> +long double
> +foo (long double x)
> +{
> +  return x * x;
> +}
> +
> +/* { dg-final { scan-assembler-not "fldt" } } */
> +/* { dg-final { scan-assembler-not "call\[\\t \]*_?__multf3" } } */
> diff --git a/gcc/testsuite/gcc.target/i386/long-double-80-1.c 
> b/gcc/testsuite/gcc.target/i386/long-double-80-1.c
> index d3b75a0..887bd6c 100644
> --- a/gcc/testsuite/gcc.target/i386/long-double-80-1.c
> +++ b/gcc/testsuite/gcc.target/i386/long-double-80-1.c
> @@ -8,3 +8,4 @@ foo (long double x)
>  }
>
>  /* { dg-final { scan-assembler "fldt" } } */
> +/* { dg-final { scan-assembler-not "call\[\\t \]*_?__multf3" } } */
> diff --git a/gcc/testsuite/gcc.target/i386/long-double-80-10.c 
> b/gcc/testsuite/gcc.target/i386/long-double-80-10.c
> new file mode 100644
> index 0000000..311ae4f
> --- /dev/null
> +++ b/gcc/testsuite/gcc.target/i386/long-double-80-10.c
> @@ -0,0 +1,11 @@
> +/* { dg-do compile } */
> +/* { dg-options "-O2 -mlong-double-128 -mlong-double-64 -mlong-double-80" } 
> */
> +
> +long double
> +foo (long double x)
> +{
> +  return x * x;
> +}
> +
> +/* { dg-final { scan-assembler "fldt" } } */
> +/* { dg-final { scan-assembler-not "call\[\\t \]*_?__multf3" } } */
> diff --git a/gcc/testsuite/gcc.target/i386/long-double-80-2.c 
> b/gcc/testsuite/gcc.target/i386/long-double-80-2.c
> index 954dfd1..7ca0643 100644
> --- a/gcc/testsuite/gcc.target/i386/long-double-80-2.c
> +++ b/gcc/testsuite/gcc.target/i386/long-double-80-2.c
> @@ -8,3 +8,4 @@ foo (long double x)
>  }
>
>  /* { dg-final { scan-assembler "fldt" } } */
> +/* { dg-final { scan-assembler-not "call\[\\t \]*_?__multf3" } } */
> diff --git a/gcc/testsuite/gcc.target/i386/long-double-80-3.c 
> b/gcc/testsuite/gcc.target/i386/long-double-80-3.c
> index e0e8365..39dc8a4 100644
> --- a/gcc/testsuite/gcc.target/i386/long-double-80-3.c
> +++ b/gcc/testsuite/gcc.target/i386/long-double-80-3.c
> @@ -8,3 +8,4 @@ foo (long double x)
>  }
>
>  /* { dg-final { scan-assembler "fldt" } } */
> +/* { dg-final { scan-assembler-not "call\[\\t \]*_?__multf3" } } */
> diff --git a/gcc/testsuite/gcc.target/i386/long-double-80-4.c 
> b/gcc/testsuite/gcc.target/i386/long-double-80-4.c
> index cac2d55..4ee21b6 100644
> --- a/gcc/testsuite/gcc.target/i386/long-double-80-4.c
> +++ b/gcc/testsuite/gcc.target/i386/long-double-80-4.c
> @@ -8,3 +8,4 @@ foo (long double x)
>  }
>
>  /* { dg-final { scan-assembler "fldt" } } */
> +/* { dg-final { scan-assembler-not "call\[\\t \]*_?__multf3" } } */
> diff --git a/gcc/testsuite/gcc.target/i386/long-double-80-5.c 
> b/gcc/testsuite/gcc.target/i386/long-double-80-5.c
> index 4aa606f..78a1603 100644
> --- a/gcc/testsuite/gcc.target/i386/long-double-80-5.c
> +++ b/gcc/testsuite/gcc.target/i386/long-double-80-5.c
> @@ -8,3 +8,4 @@ foo (__float80 x)
>  }
>
>  /* { dg-final { scan-assembler "fldt" } } */
> +/* { dg-final { scan-assembler-not "call\[\\t \]*_?__multf3" } } */
> diff --git a/gcc/testsuite/gcc.target/i386/long-double-80-8.c 
> b/gcc/testsuite/gcc.target/i386/long-double-80-8.c
> new file mode 100644
> index 0000000..b82305f
> --- /dev/null
> +++ b/gcc/testsuite/gcc.target/i386/long-double-80-8.c
> @@ -0,0 +1,11 @@
> +/* { dg-do compile } */
> +/* { dg-options "-O2 -mlong-double-128 -mlong-double-80" } */
> +
> +long double
> +foo (long double x)
> +{
> +  return x * x;
> +}
> +
> +/* { dg-final { scan-assembler "fldt" } } */
> +/* { dg-final { scan-assembler-not "call\[\\t \]*_?__multf3" } } */
> diff --git a/gcc/testsuite/gcc.target/i386/long-double-80-9.c 
> b/gcc/testsuite/gcc.target/i386/long-double-80-9.c
> new file mode 100644
> index 0000000..91ff9d1
> --- /dev/null
> +++ b/gcc/testsuite/gcc.target/i386/long-double-80-9.c
> @@ -0,0 +1,11 @@
> +/* { dg-do compile } */
> +/* { dg-options "-O2 -mlong-double-64 -mlong-double-128 -mlong-double-80" } 
> */
> +
> +long double
> +foo (long double x)
> +{
> +  return x * x;
> +}
> +
> +/* { dg-final { scan-assembler "fldt" } } */
> +/* { dg-final { scan-assembler-not "call\[\\t \]*_?__multf3" } } */

Reply via email to