From 9ee0a4426da5d2664a2bf75b4fb7e36dded7f230 Mon Sep 17 00:00:00 2001 From: Roger Sayle Date: Wed, 15 Jan 2003 17:32:38 +0000 Subject: [PATCH] re PR middle-end/9009 (floating-point negate and abs optimizations incorrect for ARM) PR middle-end/9009 * optabs.c (expand_unop): When manipulating the FP sign bit using integer operations, account for targets with different integer and FP word orders. (expand_abs): Likewise. From-SVN: r61335 --- gcc/ChangeLog | 8 ++++++++ gcc/optabs.c | 18 +++++++++++++++++- 2 files changed, 25 insertions(+), 1 deletion(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index ec32d195f50..8f42f48cefa 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,11 @@ +2003-01-15 Roger Sayle + + PR middle-end/9009 + * optabs.c (expand_unop): When manipulating the FP sign bit + using integer operations, account for targets with different + integer and FP word orders. + (expand_abs): Likewise. + 2003-01-15 David Edelsohn * config/rs6000/rs6000.c (rs6000_gen_section_name): Do not include diff --git a/gcc/optabs.c b/gcc/optabs.c index d8c058e4330..38cc7e7fdff 100644 --- a/gcc/optabs.c +++ b/gcc/optabs.c @@ -1,6 +1,6 @@ /* Expand the basic unary and binary arithmetic operations, for GNU compiler. Copyright (C) 1987, 1988, 1992, 1993, 1994, 1995, 1996, 1997, 1998, - 1999, 2000, 2001, 2003 Free Software Foundation, Inc. + 1999, 2000, 2001, 2002, 2003 Free Software Foundation, Inc. This file is part of GCC. @@ -2530,6 +2530,14 @@ expand_unop (mode, unoptab, op0, target, unsignedp) HOST_WIDE_INT hi, lo; rtx last = get_last_insn (); + /* Handle targets with different FP word orders. */ + if (FLOAT_WORDS_BIG_ENDIAN != WORDS_BIG_ENDIAN) + { + int nwords = GET_MODE_BITSIZE (mode) / BITS_PER_WORD; + int word = nwords - (bitpos / BITS_PER_WORD) - 1; + bitpos = word * BITS_PER_WORD + bitpos % BITS_PER_WORD; + } + if (bitpos < HOST_BITS_PER_WIDE_INT) { hi = 0; @@ -2675,6 +2683,14 @@ expand_abs (mode, op0, target, result_unsignedp, safe) HOST_WIDE_INT hi, lo; rtx last = get_last_insn (); + /* Handle targets with different FP word orders. */ + if (FLOAT_WORDS_BIG_ENDIAN != WORDS_BIG_ENDIAN) + { + int nwords = GET_MODE_BITSIZE (mode) / BITS_PER_WORD; + int word = nwords - (bitpos / BITS_PER_WORD) - 1; + bitpos = word * BITS_PER_WORD + bitpos % BITS_PER_WORD; + } + if (bitpos < HOST_BITS_PER_WIDE_INT) { hi = 0;