From: Joseph Myers Date: Tue, 1 May 2007 17:41:48 +0000 (+0100) Subject: darwin-ldouble.c (__gcc_qunord): Define if __NO_FPRS__, not just if _SOFT_DOUBLE. X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=b26941b46a82ddb2915de92469ce4d2126fb0ef9;p=gcc.git darwin-ldouble.c (__gcc_qunord): Define if __NO_FPRS__, not just if _SOFT_DOUBLE. * 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 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 617a0dabdb7..f7a05f8f20a 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,14 @@ +2007-05-01 Joseph Myers + + * 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 * tree-ssa-loop-manip.c (ip_normal_pos): Check if last stmt diff --git a/gcc/config/rs6000/darwin-ldouble.c b/gcc/config/rs6000/darwin-ldouble.c index 7405448706a..7aa15b6d019 100644 --- a/gcc/config/rs6000/darwin-ldouble.c +++ b/gcc/config/rs6000/darwin-ldouble.c @@ -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" diff --git a/gcc/config/rs6000/libgcc-ppc-glibc.ver b/gcc/config/rs6000/libgcc-ppc-glibc.ver index 8fafaa3ab00..c74d732e572 100644 --- a/gcc/config/rs6000/libgcc-ppc-glibc.ver +++ b/gcc/config/rs6000/libgcc-ppc-glibc.ver @@ -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 } diff --git a/gcc/config/rs6000/rs6000.c b/gcc/config/rs6000/rs6000.c index acbc7080aa2..f89175a0d95 100644 --- a/gcc/config/rs6000/rs6000.c +++ b/gcc/config/rs6000/rs6000.c @@ -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 { diff --git a/gcc/config/rs6000/rs6000.md b/gcc/config/rs6000/rs6000.md index 2359b9e2b77..477f12e429b 100644 --- a/gcc/config/rs6000/rs6000.md +++ b/gcc/config/rs6000/rs6000.md @@ -11530,27 +11530,27 @@ (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" @@ -11664,27 +11664,27 @@ (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"