diff options
author | Roger Sayle <roger@eyesopen.com> | 2005-03-15 20:43:12 +0000 |
---|---|---|
committer | Roger Sayle <sayle@gcc.gnu.org> | 2005-03-15 20:43:12 +0000 |
commit | c064fde513a56f84a742e38b30c87871d9df3718 (patch) | |
tree | 50db29a106e66fe59df101fa54e16ae8c18b2d72 /gcc/optabs.c | |
parent | 813edff1aa8406f9a37c0ef16a70d9533fd3de62 (diff) | |
download | gcc-c064fde513a56f84a742e38b30c87871d9df3718.zip gcc-c064fde513a56f84a742e38b30c87871d9df3718.tar.gz gcc-c064fde513a56f84a742e38b30c87871d9df3718.tar.bz2 |
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 <rth@redhat.com>
From-SVN: r96530
Diffstat (limited to 'gcc/optabs.c')
-rw-r--r-- | gcc/optabs.c | 19 |
1 files changed, 9 insertions, 10 deletions
diff --git a/gcc/optabs.c b/gcc/optabs.c index d41a234..a28042a 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, |