On 30-Aug-13, at 6:38 AM, Eric Botcazou wrote:
Let's avoid trying to do something general since this seems to be
really a
corner case. Can't we simply deal with hard registers specially?
/* Move floating point as parts if splitting is easy. */
if (GET_MODE_CLASS (mode) == MODE_COMPLEX_FLOAT
&& optab_handler (mov_optab, GET_MODE_INNER (mode)) !=
CODE_FOR_nothing
&& !(REG_P (x)
&& HARD_REGISTER_P (x)
&& hard_regno_nregs[REGNO(x)][mode] == 1)
&& !(REG_P (y)
&& HARD_REGISTER_P (y)
&& hard_regno_nregs[REGNO(y)][mode] == 1))
try_int = false;
Eric, your patch works for me. Tested on hppa2.0w-hp-hpux11.11 and
hppa64-hp-hpux11.11.
Dave
--
John David Anglin dave.ang...@bell.net
Index: expr.c
===================================================================
--- expr.c (revision 202102)
+++ expr.c (working copy)
@@ -3236,7 +3236,13 @@
/* Move floating point as parts. */
if (GET_MODE_CLASS (mode) == MODE_COMPLEX_FLOAT
- && optab_handler (mov_optab, GET_MODE_INNER (mode)) != CODE_FOR_nothing)
+ && optab_handler (mov_optab, GET_MODE_INNER (mode)) != CODE_FOR_nothing
+ && !(REG_P (x)
+ && HARD_REGISTER_P (x)
+ && hard_regno_nregs[REGNO(x)][mode] == 1)
+ && !(REG_P (y)
+ && HARD_REGISTER_P (y)
+ && hard_regno_nregs[REGNO(y)][mode] == 1))
try_int = false;
/* Not possible if the values are inherently not adjacent. */
else if (GET_CODE (x) == CONCAT || GET_CODE (y) == CONCAT)