diff mbox

: Fix PR middle-end/56382 -- Only move MODE_COMPLEX_FLOAT by parts if we can create pseudos

Message ID BLU0-SMTP71B6C467DEA0A9892D9ACD97370@phx.gbl
State New
Headers show

Commit Message

John David Anglin Sept. 1, 2013, 10:31 p.m. UTC
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.anglin@bell.net
diff mbox

Patch

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)