Patchwork PATCH: Enable TARGET_HAS_SINCOS if x87 FPU fsincos is available

login
register
mail settings
Submitter H.J. Lu
Date Aug. 30, 2010, 2:40 p.m.
Message ID <20100830144016.GA31228@intel.com>
Download mbox | patch
Permalink /patch/63044/
State New
Headers show

Comments

H.J. Lu - Aug. 30, 2010, 2:40 p.m.
Hi,

On x86, sincos is always available if x87 FPU fsincos is available.
This patch enables TARGET_HAS_SINCOS for -ffast-math and x87 FPU.  Also
x86 Bionic C library doesn't provide sincos and we shouldn't enable
TARGET_HAS_SINCOS with OPTION_BIONIC on x86.  OK for trunk?

Thanks.


H.J.
---
2010-08-30  H.J. Lu  <hongjiu.lu@intel.com>

	* config/linux.h (TARGET_HAS_SINCOS): Define only if not
	defined.

	* config/i386/i386.h (TARGET_HAS_SINCOS): New.  Enabled if x87
	FPU fsincos is available.
	* config/i386/x86-64.h (TARGET_HAS_SINCOS): Likewise.
	* config/i386/linux.h (TARGET_HAS_SINCOS): Likewise.
	* config/i386/linux64.h (TARGET_HAS_SINCOS): Likewise.
Richard Guenther - Aug. 30, 2010, 2:57 p.m.
On Mon, Aug 30, 2010 at 4:40 PM, H.J. Lu <hongjiu.lu@intel.com> wrote:
> Hi,
>
> On x86, sincos is always available if x87 FPU fsincos is available.
> This patch enables TARGET_HAS_SINCOS for -ffast-math and x87 FPU.  Also
> x86 Bionic C library doesn't provide sincos and we shouldn't enable
> TARGET_HAS_SINCOS with OPTION_BIONIC on x86.  OK for trunk?

Hm.  Shouldn't it be conditional on USE_FANCY_MATH_387
&& !NO_FANCY_MATH_387 as well?

Also a flag dependency breaks with the target/option attributes,
so I'm not sure it is a good idea.  Does anyone care for FP
execution performance on 32bit anyway?

Richard.

> Thanks.
>
>
> H.J.
> ---
> 2010-08-30  H.J. Lu  <hongjiu.lu@intel.com>
>
>        * config/linux.h (TARGET_HAS_SINCOS): Define only if not
>        defined.
>
>        * config/i386/i386.h (TARGET_HAS_SINCOS): New.  Enabled if x87
>        FPU fsincos is available.
>        * config/i386/x86-64.h (TARGET_HAS_SINCOS): Likewise.
>        * config/i386/linux.h (TARGET_HAS_SINCOS): Likewise.
>        * config/i386/linux64.h (TARGET_HAS_SINCOS): Likewise.
>
> diff --git a/gcc/config/i386/i386.h b/gcc/config/i386/i386.h
> index 5bae99d..493b5d2 100644
> --- a/gcc/config/i386/i386.h
> +++ b/gcc/config/i386/i386.h
> @@ -2492,6 +2492,12 @@ struct GTY(()) machine_function {
>  #undef TARG_COND_NOT_TAKEN_BRANCH_COST
>  #define TARG_COND_NOT_TAKEN_BRANCH_COST ix86_cost->cond_not_taken_branch_cost
>
> +/* Use x87 FPU fsincos if it is available.  */
> +#undef TARGET_HAS_SINCOS
> +#define TARGET_HAS_SINCOS                              \
> +  (flag_unsafe_math_optimizations                      \
> +   && (!TARGET_SSE_MATH || TARGET_MIX_SSE_I387))
> +
>  /*
>  Local variables:
>  version-control: t
> diff --git a/gcc/config/i386/linux.h b/gcc/config/i386/linux.h
> index 2a31880..f466d6d 100644
> --- a/gcc/config/i386/linux.h
> +++ b/gcc/config/i386/linux.h
> @@ -35,6 +35,15 @@ along with GCC; see the file COPYING3.  If not see
>  #undef TARGET_TLS_DIRECT_SEG_REFS_DEFAULT
>  #define TARGET_TLS_DIRECT_SEG_REFS_DEFAULT MASK_TLS_DIRECT_SEG_REFS
>
> +/* Whether we have sincos that follows the GNU extension.  There is no
> +   sincos in Bionic C library.  We can only use x87 FPU fsincos if it
> +   is available.  */
> +#undef TARGET_HAS_SINCOS
> +#define TARGET_HAS_SINCOS                              \
> +  (OPTION_GLIBC                                                \
> +   || (flag_unsafe_math_optimizations                  \
> +       && (!TARGET_SSE_MATH || TARGET_MIX_SSE_I387)))
> +
>  #undef ASM_COMMENT_START
>  #define ASM_COMMENT_START "#"
>
> diff --git a/gcc/config/i386/linux64.h b/gcc/config/i386/linux64.h
> index 867de59..9f38a57 100644
> --- a/gcc/config/i386/linux64.h
> +++ b/gcc/config/i386/linux64.h
> @@ -50,6 +50,15 @@ see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
>  #undef TARGET_TLS_DIRECT_SEG_REFS_DEFAULT
>  #define TARGET_TLS_DIRECT_SEG_REFS_DEFAULT MASK_TLS_DIRECT_SEG_REFS
>
> +/* Whether we have sincos that follows the GNU extension.  There is no
> +   sincos in Bionic C library.  We can only use x87 FPU fsincos if it
> +   is available.  */
> +#undef TARGET_HAS_SINCOS
> +#define TARGET_HAS_SINCOS                              \
> +  (OPTION_GLIBC                                                \
> +   || (flag_unsafe_math_optimizations                  \
> +       && (!TARGET_SSE_MATH || TARGET_MIX_SSE_I387)))
> +
>  /* Provide a LINK_SPEC.  Here we provide support for the special GCC
>    options -static and -shared, which allow us to link things in one
>    of these three modes by applying the appropriate combinations of
> diff --git a/gcc/config/i386/x86-64.h b/gcc/config/i386/x86-64.h
> index 1b64813..d18ec23 100644
> --- a/gcc/config/i386/x86-64.h
> +++ b/gcc/config/i386/x86-64.h
> @@ -107,3 +107,9 @@ see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
>
>  #undef TARGET_ASM_UNIQUE_SECTION
>  #define TARGET_ASM_UNIQUE_SECTION  x86_64_elf_unique_section
> +
> +/* Use x87 FPU fsincos if it is available.  */
> +#undef TARGET_HAS_SINCOS
> +#define TARGET_HAS_SINCOS                              \
> +  (flag_unsafe_math_optimizations                      \
> +   && (!TARGET_SSE_MATH || TARGET_MIX_SSE_I387))
> diff --git a/gcc/config/linux.h b/gcc/config/linux.h
> index e283a9a..576a2ac 100644
> --- a/gcc/config/linux.h
> +++ b/gcc/config/linux.h
> @@ -159,7 +159,9 @@ see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
>    is present in the runtime library.  */
>  #define TARGET_C99_FUNCTIONS (OPTION_GLIBC)
>
> +#ifndef TARGET_HAS_SINCOS
>  /* Whether we have sincos that follows the GNU extension.  */
>  #define TARGET_HAS_SINCOS (OPTION_GLIBC || OPTION_BIONIC)
> +#endif
>
>  #define TARGET_POSIX_IO
>
Maxim Kuvyrkov - Aug. 30, 2010, 4:16 p.m.
On 8/30/10 6:40 PM, H.J. Lu wrote:
> Hi,
>
>Also
> x86 Bionic C library doesn't provide sincos and we shouldn't enable
> TARGET_HAS_SINCOS with OPTION_BIONIC on x86.

To be more precise, Bionic doesn't currently implement sincos() for any 
of the architectures, not just x86.

When I was working on adding Bionic support to GCC, David Turner 
(Bionic's lead, CC'ed) planned on adding sincos() to Bionic in the near 
term specifically to enable GCC's sincos optimization.

David,

What are Bionic's plans on supporting sincos()?  Growing number of users 
are now trying out what will become GCC 4.6 and it is becoming important 
for GCC and Bionic to be on the same page regarding available features.

Thanks,

Patch

diff --git a/gcc/config/i386/i386.h b/gcc/config/i386/i386.h
index 5bae99d..493b5d2 100644
--- a/gcc/config/i386/i386.h
+++ b/gcc/config/i386/i386.h
@@ -2492,6 +2492,12 @@  struct GTY(()) machine_function {
 #undef TARG_COND_NOT_TAKEN_BRANCH_COST
 #define TARG_COND_NOT_TAKEN_BRANCH_COST ix86_cost->cond_not_taken_branch_cost
 
+/* Use x87 FPU fsincos if it is available.  */
+#undef TARGET_HAS_SINCOS
+#define TARGET_HAS_SINCOS				\
+  (flag_unsafe_math_optimizations	 		\
+   && (!TARGET_SSE_MATH || TARGET_MIX_SSE_I387))
+
 /*
 Local variables:
 version-control: t
diff --git a/gcc/config/i386/linux.h b/gcc/config/i386/linux.h
index 2a31880..f466d6d 100644
--- a/gcc/config/i386/linux.h
+++ b/gcc/config/i386/linux.h
@@ -35,6 +35,15 @@  along with GCC; see the file COPYING3.  If not see
 #undef TARGET_TLS_DIRECT_SEG_REFS_DEFAULT
 #define TARGET_TLS_DIRECT_SEG_REFS_DEFAULT MASK_TLS_DIRECT_SEG_REFS
 
+/* Whether we have sincos that follows the GNU extension.  There is no
+   sincos in Bionic C library.  We can only use x87 FPU fsincos if it
+   is available.  */
+#undef TARGET_HAS_SINCOS
+#define TARGET_HAS_SINCOS				\
+  (OPTION_GLIBC						\
+   || (flag_unsafe_math_optimizations	 		\
+       && (!TARGET_SSE_MATH || TARGET_MIX_SSE_I387)))
+
 #undef ASM_COMMENT_START
 #define ASM_COMMENT_START "#"
 
diff --git a/gcc/config/i386/linux64.h b/gcc/config/i386/linux64.h
index 867de59..9f38a57 100644
--- a/gcc/config/i386/linux64.h
+++ b/gcc/config/i386/linux64.h
@@ -50,6 +50,15 @@  see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
 #undef TARGET_TLS_DIRECT_SEG_REFS_DEFAULT
 #define TARGET_TLS_DIRECT_SEG_REFS_DEFAULT MASK_TLS_DIRECT_SEG_REFS
 
+/* Whether we have sincos that follows the GNU extension.  There is no
+   sincos in Bionic C library.  We can only use x87 FPU fsincos if it
+   is available.  */
+#undef TARGET_HAS_SINCOS
+#define TARGET_HAS_SINCOS				\
+  (OPTION_GLIBC						\
+   || (flag_unsafe_math_optimizations	 		\
+       && (!TARGET_SSE_MATH || TARGET_MIX_SSE_I387)))
+
 /* Provide a LINK_SPEC.  Here we provide support for the special GCC
    options -static and -shared, which allow us to link things in one
    of these three modes by applying the appropriate combinations of
diff --git a/gcc/config/i386/x86-64.h b/gcc/config/i386/x86-64.h
index 1b64813..d18ec23 100644
--- a/gcc/config/i386/x86-64.h
+++ b/gcc/config/i386/x86-64.h
@@ -107,3 +107,9 @@  see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
 
 #undef TARGET_ASM_UNIQUE_SECTION
 #define TARGET_ASM_UNIQUE_SECTION  x86_64_elf_unique_section
+
+/* Use x87 FPU fsincos if it is available.  */
+#undef TARGET_HAS_SINCOS
+#define TARGET_HAS_SINCOS				\
+  (flag_unsafe_math_optimizations	 		\
+   && (!TARGET_SSE_MATH || TARGET_MIX_SSE_I387))
diff --git a/gcc/config/linux.h b/gcc/config/linux.h
index e283a9a..576a2ac 100644
--- a/gcc/config/linux.h
+++ b/gcc/config/linux.h
@@ -159,7 +159,9 @@  see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
    is present in the runtime library.  */
 #define TARGET_C99_FUNCTIONS (OPTION_GLIBC)
 
+#ifndef TARGET_HAS_SINCOS
 /* Whether we have sincos that follows the GNU extension.  */
 #define TARGET_HAS_SINCOS (OPTION_GLIBC || OPTION_BIONIC)
+#endif
 
 #define TARGET_POSIX_IO