On Fri, Aug 15, 2025 at 10:07 AM H.J. Lu <hjl.to...@gmail.com> wrote:
>
> Add target("80387") attribute to enable and disable x87 instructions in a
> function.
>
> gcc/
>
>         PR target/121541
>         * config/i386/i386-options.cc
>         (ix86_valid_target_attribute_inner_p): Add target("80387")
>         attribute.  Set the mask bit in opts_set->x_target_flags if the
>         mask bit in opts->x_target_flags is updated.
>         * doc/extend.texi: Document target("80387") function attribute.
>
> gcc/testsuite/
>
>         PR target/121541
>         * gcc.target/i386/pr121541-1a.c: New test.
>         * gcc.target/i386/pr121541-1b.c: Likewise.
>         * gcc.target/i386/pr121541-2.c: Likewise.
>         * gcc.target/i386/pr121541-3.c: Likewise.
>         * gcc.target/i386/pr121541-4.c: Likewise.
>         * gcc.target/i386/pr121541-5a.c: Likewise.
>         * gcc.target/i386/pr121541-5b.c: Likewise.
>
> Signed-off-by: H.J. Lu <hjl.to...@gmail.com>
> ---
>  gcc/config/i386/i386-options.cc             |  6 ++++++
>  gcc/doc/extend.texi                         |  5 +++++
>  gcc/testsuite/gcc.target/i386/pr121541-1a.c | 11 +++++++++++
>  gcc/testsuite/gcc.target/i386/pr121541-1b.c |  6 ++++++
>  gcc/testsuite/gcc.target/i386/pr121541-2.c  | 11 +++++++++++
>  gcc/testsuite/gcc.target/i386/pr121541-3.c  | 11 +++++++++++
>  gcc/testsuite/gcc.target/i386/pr121541-4.c  | 11 +++++++++++
>  gcc/testsuite/gcc.target/i386/pr121541-5a.c | 11 +++++++++++
>  gcc/testsuite/gcc.target/i386/pr121541-5b.c |  6 ++++++
>  9 files changed, 78 insertions(+)
>  create mode 100644 gcc/testsuite/gcc.target/i386/pr121541-1a.c
>  create mode 100644 gcc/testsuite/gcc.target/i386/pr121541-1b.c
>  create mode 100644 gcc/testsuite/gcc.target/i386/pr121541-2.c
>  create mode 100644 gcc/testsuite/gcc.target/i386/pr121541-3.c
>  create mode 100644 gcc/testsuite/gcc.target/i386/pr121541-4.c
>  create mode 100644 gcc/testsuite/gcc.target/i386/pr121541-5a.c
>  create mode 100644 gcc/testsuite/gcc.target/i386/pr121541-5b.c
>
> diff --git a/gcc/config/i386/i386-options.cc b/gcc/config/i386/i386-options.cc
> index 136c0f2e966..abb5dd7700e 100644
> --- a/gcc/config/i386/i386-options.cc
> +++ b/gcc/config/i386/i386-options.cc
> @@ -1172,6 +1172,10 @@ ix86_valid_target_attribute_inner_p (tree fndecl, tree 
> args, char *p_strings[],
>                    OPT_mrecip,
>                    MASK_RECIP),
>
> +    IX86_ATTR_YES ("80387",
> +                  OPT_m80387,
> +                  MASK_80387),
> +
>      IX86_ATTR_IX86_YES ("general-regs-only",
>                         OPT_mgeneral_regs_only,
>                         OPTION_MASK_GENERAL_REGS_ONLY),
> @@ -1281,6 +1285,8 @@ ix86_valid_target_attribute_inner_p (tree fndecl, tree 
> args, char *p_strings[],
>
>        else if (type == ix86_opt_yes || type == ix86_opt_no)
>         {
> +         opts_set->x_target_flags |= mask;
I don't think we should set opts_set here, opts_set is more readable only.
I think we need to call ix86_handle_option here to rewrite opts when
x87 is enabled(disable general regs in ix86_handle_optiion)
Would that also solve the problem below?

       /* Don't enable x87 instructions if only general registers are
           allowed by target("general-regs-only") function attribute or
           -mgeneral-regs-only.  */
        if (!(opts->x_ix86_target_flags & OPTION_MASK_GENERAL_REGS_ONLY)
            && !(opts_set->x_target_flags & MASK_80387))
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
When MASK_80387 in opts_set and opts are cleared by target("80387")
function attribute,  MASK_80387 will be turned on again without
target("general-regs-only") function attribute nor  -mgeneral-regs-only.

          {
            if (((processor_alias_table[i].flags & PTA_NO_80387) != 0))
              opts->x_target_flags &= ~MASK_80387;
            else
              opts->x_target_flags |= MASK_80387;


> +
>           if (type == ix86_opt_no)
>             opt_set_p = !opt_set_p;
>
> diff --git a/gcc/doc/extend.texi b/gcc/doc/extend.texi
> index 224d6197d63..e2771d7e36a 100644
> --- a/gcc/doc/extend.texi
> +++ b/gcc/doc/extend.texi
> @@ -6798,6 +6798,11 @@ Enable/disable the generation of RCPSS, RCPPS, RSQRTSS 
> and RSQRTPS
>  instructions followed an additional Newton-Raphson step instead of
>  doing a floating-point division.
>
> +@cindex @code{target("80387")} function attribute, x86
> +@item 80387
> +@itemx no-80387
> +Generate code containing 80387 instructions for floating point.
> +
>  @cindex @code{target("general-regs-only")} function attribute, x86
>  @item general-regs-only
>  Generate code which uses only the general registers.
> diff --git a/gcc/testsuite/gcc.target/i386/pr121541-1a.c 
> b/gcc/testsuite/gcc.target/i386/pr121541-1a.c
> new file mode 100644
> index 00000000000..83884a7b15c
> --- /dev/null
> +++ b/gcc/testsuite/gcc.target/i386/pr121541-1a.c
> @@ -0,0 +1,11 @@
> +/* { dg-do compile { target { ! ia32 } } } */
> +/* { dg-options "-O2 -march=x86-64" } */
> +
> +extern long double d;
> +
> +__attribute__ ((target("no-80387")))
> +void
> +func1 (void)
> +{
> +  d *= 3; /* { dg-error "x87 register return with x87 disabled" } */
> +}
> diff --git a/gcc/testsuite/gcc.target/i386/pr121541-1b.c 
> b/gcc/testsuite/gcc.target/i386/pr121541-1b.c
> new file mode 100644
> index 00000000000..f440b14ca71
> --- /dev/null
> +++ b/gcc/testsuite/gcc.target/i386/pr121541-1b.c
> @@ -0,0 +1,6 @@
> +/* { dg-do compile { target ia32 } } */
> +/* { dg-options "-O2" } */
> +
> +#include "pr121541-1a.c"
> +
> +/* { dg-final { scan-assembler "call\[\\t \]+_?__mulxf3" } } */
> diff --git a/gcc/testsuite/gcc.target/i386/pr121541-2.c 
> b/gcc/testsuite/gcc.target/i386/pr121541-2.c
> new file mode 100644
> index 00000000000..281341e9bb9
> --- /dev/null
> +++ b/gcc/testsuite/gcc.target/i386/pr121541-2.c
> @@ -0,0 +1,11 @@
> +/* { dg-do compile } */
> +/* { dg-options "-O2 -mno-80387" } */
> +
> +extern long double d;
> +
> +__attribute__ ((target("80387")))
> +void
> +func1 (void)
> +{
> +  d *= 3;
> +}
> diff --git a/gcc/testsuite/gcc.target/i386/pr121541-3.c 
> b/gcc/testsuite/gcc.target/i386/pr121541-3.c
> new file mode 100644
> index 00000000000..380fab2aad9
> --- /dev/null
> +++ b/gcc/testsuite/gcc.target/i386/pr121541-3.c
> @@ -0,0 +1,11 @@
> +/* { dg-do compile } */
> +/* { dg-options "-O2 -mgeneral-regs-only" } */
> +
> +extern long double d;
> +
> +__attribute__ ((target("80387")))
> +void
> +func1 (void)
> +{
> +  d *= 3;
> +}
> diff --git a/gcc/testsuite/gcc.target/i386/pr121541-4.c 
> b/gcc/testsuite/gcc.target/i386/pr121541-4.c
> new file mode 100644
> index 00000000000..1f4381a52b0
> --- /dev/null
> +++ b/gcc/testsuite/gcc.target/i386/pr121541-4.c
> @@ -0,0 +1,11 @@
> +/* { dg-do compile } */
> +/* { dg-options "-O2" } */
> +
> +extern long double d;
> +
> +__attribute__ ((target("general-regs-only","80387")))
> +void
> +func1 (void)
> +{
> +  d *= 3;
> +}
> diff --git a/gcc/testsuite/gcc.target/i386/pr121541-5a.c 
> b/gcc/testsuite/gcc.target/i386/pr121541-5a.c
> new file mode 100644
> index 00000000000..e6137e22e98
> --- /dev/null
> +++ b/gcc/testsuite/gcc.target/i386/pr121541-5a.c
> @@ -0,0 +1,11 @@
> +/* { dg-do compile { target { ! ia32 } } } */
> +/* { dg-options "-O2 -march=x86-64" } */
> +
> +extern long double d;
> +
> +__attribute__ ((target("80387","general-regs-only")))
> +void
> +func1 (void)
> +{
> +  d *= 3; /* { dg-error "x87 register return with x87 disabled" } */
> +}
> diff --git a/gcc/testsuite/gcc.target/i386/pr121541-5b.c 
> b/gcc/testsuite/gcc.target/i386/pr121541-5b.c
> new file mode 100644
> index 00000000000..b61a7fe6a3f
> --- /dev/null
> +++ b/gcc/testsuite/gcc.target/i386/pr121541-5b.c
> @@ -0,0 +1,6 @@
> +/* { dg-do compile { target ia32 } } */
> +/* { dg-options "-O2" } */
> +
> +#include "pr121541-5a.c"
> +
> +/* { dg-final { scan-assembler "call\[\\t \]+_?__mulxf3" } } */
> --
> 2.50.1
>


--
BR,
Hongtao

Reply via email to