From: Roger Sayle Date: Sat, 7 Feb 2004 03:00:16 +0000 (+0000) Subject: builtins.c (expand_builtin_signbit): Use extract_bit_field instead of gen_highpart... X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=254878eaddab86eae9ec232baedfdc4103cf7ef9;p=gcc.git builtins.c (expand_builtin_signbit): Use extract_bit_field instead of gen_highpart or gen_lowpart when... * builtins.c (expand_builtin_signbit): Use extract_bit_field instead of gen_highpart or gen_lowpart when the floating point format is wider than the result mode. Co-Authored-By: Ulrich Weigand From-SVN: r77439 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 40329079821..48393ee5ece 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2004-02-06 Roger Sayle + Ulrich Weigand + + * builtins.c (expand_builtin_signbit): Use extract_bit_field instead + of gen_highpart or gen_lowpart when the floating point format is + wider than the result mode. + 2004-02-06 Andrew Pinski * dwarf2out.c (loclabel_num): Move into #ifdef diff --git a/gcc/builtins.c b/gcc/builtins.c index b9b057d944f..48be07b7a26 100644 --- a/gcc/builtins.c +++ b/gcc/builtins.c @@ -4986,34 +4986,35 @@ expand_builtin_signbit (tree exp, rtx target) temp = expand_expr (arg, NULL_RTX, VOIDmode, 0); temp = gen_lowpart (imode, temp); - if (GET_MODE_BITSIZE (imode) < GET_MODE_BITSIZE (rmode)) - temp = gen_lowpart (rmode, temp); - else if (GET_MODE_BITSIZE (imode) > GET_MODE_BITSIZE (rmode)) + if (GET_MODE_BITSIZE (imode) > GET_MODE_BITSIZE (rmode)) { - if (bitpos > GET_MODE_BITSIZE (rmode)) + if (BITS_BIG_ENDIAN) + bitpos = GET_MODE_BITSIZE (imode) - 1 - bitpos; + temp = copy_to_mode_reg (imode, temp); + temp = extract_bit_field (temp, 1, bitpos, 1, + NULL_RTX, rmode, rmode, + GET_MODE_SIZE (imode)); + } + else + { + if (GET_MODE_BITSIZE (imode) < GET_MODE_BITSIZE (rmode)) + temp = gen_lowpart (rmode, temp); + if (bitpos < HOST_BITS_PER_WIDE_INT) { - temp = gen_highpart (rmode, temp); - bitpos %= GET_MODE_BITSIZE (rmode); + hi = 0; + lo = (HOST_WIDE_INT) 1 << bitpos; } else - temp = gen_lowpart (rmode, temp); - } + { + hi = (HOST_WIDE_INT) 1 << (bitpos - HOST_BITS_PER_WIDE_INT); + lo = 0; + } - if (bitpos < HOST_BITS_PER_WIDE_INT) - { - hi = 0; - lo = (HOST_WIDE_INT) 1 << bitpos; + temp = force_reg (rmode, temp); + temp = expand_binop (rmode, and_optab, temp, + immed_double_const (lo, hi, rmode), + target, 1, OPTAB_LIB_WIDEN); } - else - { - hi = (HOST_WIDE_INT) 1 << (bitpos - HOST_BITS_PER_WIDE_INT); - lo = 0; - } - - temp = force_reg (rmode, temp); - temp = expand_binop (rmode, and_optab, temp, - immed_double_const (lo, hi, rmode), - target, 1, OPTAB_LIB_WIDEN); return temp; }