rs6000: float128 on BE and 32-bit
authorSegher Boessenkool <segher@kernel.crashing.org>
Fri, 10 Mar 2017 17:57:58 +0000 (18:57 +0100)
committerSegher Boessenkool <segher@gcc.gnu.org>
Fri, 10 Mar 2017 17:57:58 +0000 (18:57 +0100)
This fixes float128 on BE and on 32-bit.

The configure tests need to use -mabi=altivec for 32-bit, since it is
not the default there.  That also enables the "vector" keyword, used by
the tests.  To do this it temporarily adds a few flags to the CFLAGS
variable.

It also fixes a syntax error in the libgcc_cv_powerpc_float128_hw test
(the function name was missing in the function declaration).

Regenerating config.in (via autoreconf) removed the duplicate definition
of HAVE_SOLARIS_CRTS.

Finally, this adds a "-mfloat128-hardware requires -m64" test to
rs6000.c: all the current patterns need 64-bit registers.  Maybe we'll
want to add float128 hardware support to 32-bit some day, but certainly
not today.

* config/rs6000/rs6000.c (rs6000_option_override_internal): Disallow
-mfloat128-hardware without -m64.

libgcc/
* configure.ac (test for libgcc_cv_powerpc_float128): Temporarily
modify CFLAGS.  Add -mabi=altivec -mvsx -mfloat128.
(test for libgcc_cv_powerpc_float128_hw): Add -mpower9-vector and
-mfloat128-hardware to the CFLAGS.  Fix syntax error in the C snippet.
* configure: Regenerate.
* config.in: Regenerate.

From-SVN: r246043

gcc/ChangeLog
gcc/config/rs6000/rs6000.c
libgcc/ChangeLog
libgcc/config.in
libgcc/configure
libgcc/configure.ac

index 3cbc63d69f9c85c729f6e88528c2f8eaecd1f0b5..518178a886a9ad8e1a14065adf573a531d456b46 100644 (file)
@@ -1,5 +1,10 @@
+2017-03-10  Segher Boessenkool  <segher@kernel.crashing.org>
+
+       * config/rs6000/rs6000.c (rs6000_option_override_internal): Disallow
+       -mfloat128-hardware without -m64.
+
 2017-03-10  Will Schmidt <will_schmidt@vnet.ibm.com>
+
        PR target/79941
        * config/rs6000/rs6000.c (builtin_function_type): Add VMUL*U[HB]
        entries to the case statement that marks unsigned arguments to
index 4371b00d79e2e7a0e6e2a1b2fcfcbe0050fc4e55..e3627c9c8cad5541ce485145df415b95f1f95c1e 100644 (file)
@@ -4686,6 +4686,14 @@ rs6000_option_override_internal (bool global_init_p)
       rs6000_isa_flags &= ~OPTION_MASK_FLOAT128_HW;
     }
 
+  if (TARGET_FLOAT128_HW && !TARGET_64BIT)
+    {
+      if ((rs6000_isa_flags_explicit & OPTION_MASK_FLOAT128_HW) != 0)
+       error ("-mfloat128-hardware requires -m64");
+
+      rs6000_isa_flags &= ~OPTION_MASK_FLOAT128_HW;
+    }
+
   if (TARGET_FLOAT128_HW && !TARGET_FLOAT128_KEYWORD
       && (rs6000_isa_flags_explicit & OPTION_MASK_FLOAT128_HW) != 0
       && (rs6000_isa_flags_explicit & OPTION_MASK_FLOAT128_KEYWORD) == 0)
index 476f610f92d19c9d955d2257062c84d11dffd4e0..470fbb7266cd3a2d2cfff9d8fea85171a102fd8c 100644 (file)
@@ -1,3 +1,12 @@
+2017-03-10  Segher Boessenkool  <segher@kernel.crashing.org>
+
+       * configure.ac (test for libgcc_cv_powerpc_float128): Temporarily
+       modify CFLAGS.  Add -mabi=altivec -mvsx -mfloat128.
+       (test for libgcc_cv_powerpc_float128_hw): Add -mpower9-vector and
+       -mfloat128-hardware to the CFLAGS.  Fix syntax error in the C snippet.
+       * configure: Regenerate.
+       * config.in: Regenerate.
+
 2017-03-02  Jonathan Yong <10walls@gmail.com>
 
        * config/i386/gthr-win32.h: Define NOGDI before
index 4d33411e40857ffaa6448c14a385852f78c55d9f..25aa0d93bab8660e2e836caab1565860dee94ea9 100644 (file)
@@ -21,9 +21,6 @@
 /* Define if the system-provided CRTs are present on Solaris. */
 #undef HAVE_SOLARIS_CRTS
 
-/* Define if the system-provided CRTs are present on Solaris. */
-#undef HAVE_SOLARIS_CRTS
-
 /* Define to 1 if you have the <stdint.h> header file. */
 #undef HAVE_STDINT_H
 
index 5c900cc1325116337371aa71fdcdfb3485b94217..45c459788c3da5bc077883e7b38243e54420ef8d 100644 (file)
@@ -4779,6 +4779,8 @@ case ${host} in
 # software libraries, and whether the assembler can handle xsaddqp
 # for hardware support.
 powerpc*-*-linux*)
+  saved_CFLAGS="$CFLAGS"
+  CFLAGS="$CFLAGS -mabi=altivec -mvsx -mfloat128"
   { $as_echo "$as_me:${as_lineno-$LINENO}: checking for PowerPC ISA 2.06 to build __float128 libraries" >&5
 $as_echo_n "checking for PowerPC ISA 2.06 to build __float128 libraries... " >&6; }
 if test "${libgcc_cv_powerpc_float128+set}" = set; then :
@@ -4786,8 +4788,7 @@ if test "${libgcc_cv_powerpc_float128+set}" = set; then :
 else
   cat confdefs.h - <<_ACEOF >conftest.$ac_ext
 /* end confdefs.h.  */
-#pragma GCC target ("vsx")
-     vector double dadd (vector double a, vector double b) { return a + b; }
+vector double dadd (vector double a, vector double b) { return a + b; }
 _ACEOF
 if ac_fn_c_try_compile "$LINENO"; then :
   libgcc_cv_powerpc_float128=yes
@@ -4799,6 +4800,7 @@ fi
 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $libgcc_cv_powerpc_float128" >&5
 $as_echo "$libgcc_cv_powerpc_float128" >&6; }
 
+  CFLAGS="$CFLAGS -mpower9-vector -mfloat128-hardware"
   { $as_echo "$as_me:${as_lineno-$LINENO}: checking for PowerPC ISA 3.0 to build hardware __float128 libraries" >&5
 $as_echo_n "checking for PowerPC ISA 3.0 to build hardware __float128 libraries... " >&6; }
 if test "${libgcc_cv_powerpc_float128_hw+set}" = set; then :
@@ -4806,12 +4808,11 @@ if test "${libgcc_cv_powerpc_float128_hw+set}" = set; then :
 else
   cat confdefs.h - <<_ACEOF >conftest.$ac_ext
 /* end confdefs.h.  */
-#pragma GCC target ("vsx,power9-vector")
-     #include <sys/auxv.h>
+#include <sys/auxv.h>
      #ifndef AT_PLATFORM
      #error "AT_PLATFORM is not defined"
      #endif
-     vector unsigned char (vector unsigned char a, vector unsigned char b)
+     vector unsigned char add (vector unsigned char a, vector unsigned char b)
      {
        vector unsigned char ret;
        __asm__ ("xsaddqp %0,%1,%2" : "=v" (ret) : "v" (a), "v" (b));
@@ -4830,6 +4831,7 @@ rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
 fi
 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $libgcc_cv_powerpc_float128_hw" >&5
 $as_echo "$libgcc_cv_powerpc_float128_hw" >&6; }
+  CFLAGS="$saved_CFLAGS"
 esac
 
 # Collect host-machine-specific information.
index ea2030fa06d5ec562b4b2b8d57d71eb1474dea9c..af1514737092278d294be5f72e5c0ef18997f6d8 100644 (file)
@@ -379,23 +379,24 @@ case ${host} in
 # software libraries, and whether the assembler can handle xsaddqp
 # for hardware support.
 powerpc*-*-linux*)
+  saved_CFLAGS="$CFLAGS"
+  CFLAGS="$CFLAGS -mabi=altivec -mvsx -mfloat128"
   AC_CACHE_CHECK([for PowerPC ISA 2.06 to build __float128 libraries],
                 [libgcc_cv_powerpc_float128],
                 [AC_COMPILE_IFELSE(
-    [#pragma GCC target ("vsx")
-     vector double dadd (vector double a, vector double b) { return a + b; }],
+    [vector double dadd (vector double a, vector double b) { return a + b; }],
     [libgcc_cv_powerpc_float128=yes],
     [libgcc_cv_powerpc_float128=no])])
 
+  CFLAGS="$CFLAGS -mpower9-vector -mfloat128-hardware"
   AC_CACHE_CHECK([for PowerPC ISA 3.0 to build hardware __float128 libraries],
                 [libgcc_cv_powerpc_float128_hw],
                 [AC_COMPILE_IFELSE(
-    [#pragma GCC target ("vsx,power9-vector")
-     #include <sys/auxv.h>
+    [#include <sys/auxv.h>
      #ifndef AT_PLATFORM
      #error "AT_PLATFORM is not defined"
      #endif
-     vector unsigned char (vector unsigned char a, vector unsigned char b)
+     vector unsigned char add (vector unsigned char a, vector unsigned char b)
      {
        vector unsigned char ret;
        __asm__ ("xsaddqp %0,%1,%2" : "=v" (ret) : "v" (a), "v" (b));
@@ -406,6 +407,7 @@ powerpc*-*-linux*)
        __attribute__ ((__ifunc__ ("add_resolver")));],
     [libgcc_cv_powerpc_float128_hw=yes],
     [libgcc_cv_powerpc_float128_hw=no])])
+  CFLAGS="$saved_CFLAGS"
 esac
 
 # Collect host-machine-specific information.