aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRoger Sayle <roger@eyesopen.com>2005-03-12 04:56:29 +0000
committerRoger Sayle <sayle@gcc.gnu.org>2005-03-12 04:56:29 +0000
commit210e185272bc34731909e0a53fb982d3ae434516 (patch)
tree96386c408166b9b5428a6ddf7d05ea299cb137d7
parent7999e310bf46cdd9fd435b7d0f56ad4c72054748 (diff)
downloadgcc-210e185272bc34731909e0a53fb982d3ae434516.zip
gcc-210e185272bc34731909e0a53fb982d3ae434516.tar.gz
gcc-210e185272bc34731909e0a53fb982d3ae434516.tar.bz2
re PR middle-end/20419 (ICE in gen_lowpart_general, at rtlhooks.c:58)
PR middle-end/20419 * builtins.c (expand_builtin_signbit): Force the signbit's word into an integer register to avoid SUBREGs of floating point modes. From-SVN: r96328
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/builtins.c5
2 files changed, 11 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 0bbe586..3e9f384 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,9 @@
+2005-03-11 Roger Sayle <roger@eyesopen.com>
+
+ PR middle-end/20419
+ * builtins.c (expand_builtin_signbit): Force the signbit's word
+ into an integer register to avoid SUBREGs of floating point modes.
+
2005-03-12 Kazu Hirata <kazu@cs.umass.edu>
* cfglayout.c, loop-doloop.c, profile.c, target-def.h,
diff --git a/gcc/builtins.c b/gcc/builtins.c
index 4f46474..e6e0717 100644
--- a/gcc/builtins.c
+++ b/gcc/builtins.c
@@ -5003,6 +5003,11 @@ expand_builtin_signbit (tree exp, rtx target)
bitpos = bitpos % BITS_PER_WORD;
}
+ /* Force the intermediate word_mode (or narrower) result into a
+ register. This avoids attempting to create paradoxical SUBREGs
+ of floating point modes below. */
+ temp = force_reg (imode, temp);
+
/* If the bitpos is within the "result mode" lowpart, the operation
can be implement with a single bitwise AND. Otherwise, we need
a right shift and an AND. */