darwin-ldouble.c (__gcc_qunord): Define if __NO_FPRS__, not just if _SOFT_DOUBLE.
authorJoseph Myers <joseph@codesourcery.com>
Tue, 1 May 2007 17:41:48 +0000 (18:41 +0100)
committerJoseph Myers <jsm28@gcc.gnu.org>
Tue, 1 May 2007 17:41:48 +0000 (18:41 +0100)
* config/rs6000/darwin-ldouble.c (__gcc_qunord): Define if
__NO_FPRS__, not just if _SOFT_DOUBLE.
* config/rs6000/libgcc-ppc-glibc.ver (__gcc_qunord): Likewise.
* config/rs6000/rs6000.c (rs6000_init_libfuncs): Use __gcc_qunord
also for E500 double.
* config/rs6000/rs6000.md (buneq, bunge, bungt, bunle, bunlt,
suneq, sunge, sungt, sunle, sunlt): Disable for (TARGET_HARD_FLOAT
&& !TARGET_FPRS).

From-SVN: r124332

gcc/ChangeLog
gcc/config/rs6000/darwin-ldouble.c
gcc/config/rs6000/libgcc-ppc-glibc.ver
gcc/config/rs6000/rs6000.c
gcc/config/rs6000/rs6000.md

index 617a0dabdb737a37bcc7efd81c1419d4c827741b..f7a05f8f20a78fdd68a6ba04fccf4d3caee721a7 100644 (file)
@@ -1,3 +1,14 @@
+2007-05-01  Joseph Myers  <joseph@codesourcery.com>
+
+       * config/rs6000/darwin-ldouble.c (__gcc_qunord): Define if
+       __NO_FPRS__, not just if _SOFT_DOUBLE.
+       * config/rs6000/libgcc-ppc-glibc.ver (__gcc_qunord): Likewise.
+       * config/rs6000/rs6000.c (rs6000_init_libfuncs): Use __gcc_qunord
+       also for E500 double.
+       * config/rs6000/rs6000.md (buneq, bunge, bungt, bunle, bunlt,
+       suneq, sunge, sungt, sunle, sunlt): Disable for (TARGET_HARD_FLOAT
+       && !TARGET_FPRS).
+
 2007-05-01  Richard Guenther  <rguenther@suse.de>
 
        * tree-ssa-loop-manip.c (ip_normal_pos): Check if last stmt
index 7405448706a4e7b026ca23dd5562abe7af5cdd15..7aa15b6d0199df5ac46be3c497aa2872cd6ea532 100644 (file)
@@ -225,7 +225,6 @@ int __gcc_qeq (double, double, double, double);
 int __gcc_qne (double, double, double, double);
 int __gcc_qge (double, double, double, double);
 int __gcc_qle (double, double, double, double);
-int __gcc_qunord (double, double, double, double);
 long double __gcc_stoq (float);
 long double __gcc_dtoq (double);
 float __gcc_qtos (double, double);
@@ -238,7 +237,6 @@ long double __gcc_utoq (unsigned int);
 extern int __eqdf2 (double, double);
 extern int __ledf2 (double, double);
 extern int __gedf2 (double, double);
-extern int __unorddf2 (double, double);
 
 /* Negate 'long double' value and return the result.   */
 long double
@@ -284,15 +282,6 @@ __gcc_qge (double a, double aa, double c, double cc)
 
 strong_alias (__gcc_qge, __gcc_qgt);
 
-/* Compare two 'long double' values for unordered.  */
-int
-__gcc_qunord (double a, double aa, double c, double cc)
-{
-  if (__eqdf2 (a, c) == 0)
-    return __unorddf2 (aa, cc);
-  return __unorddf2 (a, c);
-}
-
 /* Convert single to long double.  */
 long double
 __gcc_stoq (float a)
@@ -365,6 +354,20 @@ __gcc_utoq (unsigned int a)
 
 #ifdef __NO_FPRS__
 
+int __gcc_qunord (double, double, double, double);
+
+extern int __eqdf2 (double, double);
+extern int __unorddf2 (double, double);
+
+/* Compare two 'long double' values for unordered.  */
+int
+__gcc_qunord (double a, double aa, double c, double cc)
+{
+  if (__eqdf2 (a, c) == 0)
+    return __unorddf2 (aa, cc);
+  return __unorddf2 (a, c);
+}
+
 #include "config/soft-fp/soft-fp.h"
 #include "config/soft-fp/double.h"
 #include "config/soft-fp/quad.h"
index 8fafaa3ab000cbf0cf8da8087d0c8aa7c2cdb822..c74d732e572924feed3c9508a7a1f7a5a8c5d2c7 100644 (file)
@@ -39,7 +39,6 @@ GCC_4.2.0 {
   __gcc_qge
   __gcc_qlt
   __gcc_qle
-  __gcc_qunord
   __gcc_stoq
   __gcc_dtoq
   __gcc_qtos
@@ -49,4 +48,8 @@ GCC_4.2.0 {
   __gcc_itoq
   __gcc_utoq
 %endif
+
+%ifdef __NO_FPRS__
+  __gcc_qunord
+%endif
 }
index acbc7080aa26504f8d9966862f1236a9e967a3ab..f89175a0d95b1fe702012396a2d9c6cae9d64ce7 100644 (file)
@@ -9587,7 +9587,6 @@ rs6000_init_libfuncs (void)
            set_optab_libfunc (ge_optab, TFmode, "__gcc_qge");
            set_optab_libfunc (lt_optab, TFmode, "__gcc_qlt");
            set_optab_libfunc (le_optab, TFmode, "__gcc_qle");
-           set_optab_libfunc (unord_optab, TFmode, "__gcc_qunord");
 
            set_conv_libfunc (sext_optab, TFmode, SFmode, "__gcc_stoq");
            set_conv_libfunc (sext_optab, TFmode, DFmode, "__gcc_dtoq");
@@ -9598,6 +9597,9 @@ rs6000_init_libfuncs (void)
            set_conv_libfunc (sfloat_optab, TFmode, SImode, "__gcc_itoq");
            set_conv_libfunc (ufloat_optab, TFmode, SImode, "__gcc_utoq");
          }
+
+       if (!(TARGET_HARD_FLOAT && TARGET_FPRS))
+         set_optab_libfunc (unord_optab, TFmode, "__gcc_qunord");
       }
     else
       {
index 2359b9e2b7787aded5647b41000118b2ec10226e..477f12e429b95b145bfebfeec5b1fd9da10b8957 100644 (file)
 
 (define_expand "buneq"
   [(use (match_operand 0 "" ""))]
-  ""
+  "! (TARGET_HARD_FLOAT && !TARGET_FPRS)"
   "{ rs6000_emit_cbranch (UNEQ, operands[0]); DONE; }")
 
 (define_expand "bunge"
   [(use (match_operand 0 "" ""))]
-  ""
+  "! (TARGET_HARD_FLOAT && !TARGET_FPRS)"
   "{ rs6000_emit_cbranch (UNGE, operands[0]); DONE; }")
 
 (define_expand "bungt"
   [(use (match_operand 0 "" ""))]
-  ""
+  "! (TARGET_HARD_FLOAT && !TARGET_FPRS)"
   "{ rs6000_emit_cbranch (UNGT, operands[0]); DONE; }")
 
 (define_expand "bunle"
   [(use (match_operand 0 "" ""))]
-  ""
+  "! (TARGET_HARD_FLOAT && !TARGET_FPRS)"
   "{ rs6000_emit_cbranch (UNLE, operands[0]); DONE; }")
 
 (define_expand "bunlt"
   [(use (match_operand 0 "" ""))]
-  ""
+  "! (TARGET_HARD_FLOAT && !TARGET_FPRS)"
   "{ rs6000_emit_cbranch (UNLT, operands[0]); DONE; }")
 
 (define_expand "bltgt"
 
 (define_expand "suneq"
   [(clobber (match_operand:SI 0 "gpc_reg_operand" ""))]
-  ""
+  "! (TARGET_HARD_FLOAT && !TARGET_FPRS)"
   "{ rs6000_emit_sCOND (UNEQ, operands[0]); DONE; }")
 
 (define_expand "sunge"
   [(clobber (match_operand:SI 0 "gpc_reg_operand" ""))]
-  ""
+  "! (TARGET_HARD_FLOAT && !TARGET_FPRS)"
   "{ rs6000_emit_sCOND (UNGE, operands[0]); DONE; }")
 
 (define_expand "sungt"
   [(clobber (match_operand:SI 0 "gpc_reg_operand" ""))]
-  ""
+  "! (TARGET_HARD_FLOAT && !TARGET_FPRS)"
   "{ rs6000_emit_sCOND (UNGT, operands[0]); DONE; }")
 
 (define_expand "sunle"
   [(clobber (match_operand:SI 0 "gpc_reg_operand" ""))]
-  ""
+  "! (TARGET_HARD_FLOAT && !TARGET_FPRS)"
   "{ rs6000_emit_sCOND (UNLE, operands[0]); DONE; }")
 
 (define_expand "sunlt"
   [(clobber (match_operand:SI 0 "gpc_reg_operand" ""))]
-  ""
+  "! (TARGET_HARD_FLOAT && !TARGET_FPRS)"
   "{ rs6000_emit_sCOND (UNLT, operands[0]); DONE; }")
 
 (define_expand "sltgt"