From c064fde513a56f84a742e38b30c87871d9df3718 Mon Sep 17 00:00:00 2001 From: Roger Sayle Date: Tue, 15 Mar 2005 20:43:12 +0000 Subject: [PATCH] real.c (c4x_single_format, [...]): Provide values for signbit_ro for c4x's single and extended floating point formats. * real.c (c4x_single_format, c4x_extended_format): Provide values for signbit_ro for c4x's single and extended floating point formats. * optabs.c (expand_copysign): Use the floating point format's signbit_ro for expanding via expand_copysign_absneg, and it's signbit_rw field for expanding via expand_copysign_bit. Co-Authored-By: Richard Henderson From-SVN: r96530 --- gcc/ChangeLog | 9 +++++++++ gcc/optabs.c | 19 +++++++++---------- gcc/real.c | 4 ++-- 3 files changed, 20 insertions(+), 12 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 0d3e60f7d3a..67cce72f5e7 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,12 @@ +2005-03-15 Roger Sayle + Richard Henderson + + * real.c (c4x_single_format, c4x_extended_format): Provide values + for signbit_ro for c4x's single and extended floating point formats. + * optabs.c (expand_copysign): Use the floating point format's + signbit_ro for expanding via expand_copysign_absneg, and it's + signbit_rw field for expanding via expand_copysign_bit. + 2005-03-15 Dorit Naishlos * tree-vectorizer.h (unknown_alignment_for_access_p): Replaced by diff --git a/gcc/optabs.c b/gcc/optabs.c index d41a234de6b..a28042a80aa 100644 --- a/gcc/optabs.c +++ b/gcc/optabs.c @@ -2865,7 +2865,6 @@ expand_copysign (rtx op0, rtx op1, rtx target) { enum machine_mode mode = GET_MODE (op0); const struct real_format *fmt; - int bitpos; bool op0_is_abs; rtx temp; @@ -2882,10 +2881,6 @@ expand_copysign (rtx op0, rtx op1, rtx target) if (fmt == NULL || !fmt->has_signed_zero) return NULL_RTX; - bitpos = fmt->signbit_rw; - if (bitpos < 0) - return NULL_RTX; - op0_is_abs = false; if (GET_CODE (op0) == CONST_DOUBLE) { @@ -2894,17 +2889,21 @@ expand_copysign (rtx op0, rtx op1, rtx target) op0_is_abs = true; } - if (GET_CODE (op0) == CONST_DOUBLE - || (neg_optab->handlers[mode].insn_code != CODE_FOR_nothing - && abs_optab->handlers[mode].insn_code != CODE_FOR_nothing)) + if (fmt->signbit_ro >= 0 + && (GET_CODE (op0) == CONST_DOUBLE + || (neg_optab->handlers[mode].insn_code != CODE_FOR_nothing + && abs_optab->handlers[mode].insn_code != CODE_FOR_nothing))) { temp = expand_copysign_absneg (mode, op0, op1, target, - bitpos, op0_is_abs); + fmt->signbit_ro, op0_is_abs); if (temp) return temp; } - return expand_copysign_bit (mode, op0, op1, target, bitpos, op0_is_abs); + if (fmt->signbit_rw < 0) + return NULL_RTX; + return expand_copysign_bit (mode, op0, op1, target, + fmt->signbit_rw, op0_is_abs); } /* Generate an instruction whose insn-code is INSN_CODE, diff --git a/gcc/real.c b/gcc/real.c index bed2fb09301..81bce444437 100644 --- a/gcc/real.c +++ b/gcc/real.c @@ -4414,7 +4414,7 @@ const struct real_format c4x_single_format = 24, -126, 128, - -1, + 23, -1, false, false, @@ -4433,7 +4433,7 @@ const struct real_format c4x_extended_format = 32, -126, 128, - -1, + 31, -1, false, false, -- 2.30.2