diff options
author | sayle <sayle@138bc75d-0d04-0410-961f-82ee72b054a4> | 2004-02-07 03:00:16 +0000 |
---|---|---|
committer | sayle <sayle@138bc75d-0d04-0410-961f-82ee72b054a4> | 2004-02-07 03:00:16 +0000 |
commit | 24fd4260f1fbe2ada27ad404149c4ed666ef67ab (patch) | |
tree | c2bcedcd0f279c5d93fcb70ec7914ccfd0bf9d4a /gcc/builtins.c | |
parent | 2335d80316473be52fe7f685b23307f6fafbf9f7 (diff) | |
download | gcc-24fd4260f1fbe2ada27ad404149c4ed666ef67ab.tar.gz |
* 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.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@77439 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/builtins.c')
-rw-r--r-- | gcc/builtins.c | 45 |
1 files changed, 23 insertions, 22 deletions
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; } |