From 210e185272bc34731909e0a53fb982d3ae434516 Mon Sep 17 00:00:00 2001 From: Roger Sayle Date: Sat, 12 Mar 2005 04:56:29 +0000 Subject: [PATCH] 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 --- gcc/ChangeLog | 6 ++++++ gcc/builtins.c | 5 +++++ 2 files changed, 11 insertions(+) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 0bbe5866c84..3e9f384253d 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2005-03-11 Roger Sayle + + 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 * cfglayout.c, loop-doloop.c, profile.c, target-def.h, diff --git a/gcc/builtins.c b/gcc/builtins.c index 4f464746b9a..e6e07171f74 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. */ -- 2.30.2