aboutsummaryrefslogtreecommitdiff
path: root/gcc/optabs.c
diff options
context:
space:
mode:
authorRoger Sayle <roger@eyesopen.com>2005-03-15 20:43:12 +0000
committerRoger Sayle <roger@eyesopen.com>2005-03-15 20:43:12 +0000
commite2c106987449334872d5afebad076a9ad7b14b95 (patch)
tree50db29a106e66fe59df101fa54e16ae8c18b2d72 /gcc/optabs.c
parent00a9e61bf12bfc7a7e15f64939c3549728c16277 (diff)
* 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. git-svn-id: https://gcc.gnu.org/svn/gcc/trunk@96530 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/optabs.c')
-rw-r--r--gcc/optabs.c19
1 files changed, 9 insertions, 10 deletions
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,