m68hc11.c (m68hc11_gen_highpart): Don't use gen_highpart.
authorStephane Carrez <Stephane.Carrez@worldnet.fr>
Fri, 20 Jul 2001 19:34:56 +0000 (21:34 +0200)
committerStephane Carrez <ciceron@gcc.gnu.org>
Fri, 20 Jul 2001 19:34:56 +0000 (21:34 +0200)
* config/m68hc11/m68hc11.c (m68hc11_gen_highpart): Don't use
gen_highpart.

From-SVN: r44206

gcc/ChangeLog
gcc/config/m68hc11/m68hc11.c

index f7af8bd..f19c5f8 100644 (file)
@@ -1,3 +1,8 @@
+2001-07-20  Stephane Carrez  <Stephane.Carrez@worldnet.fr>
+
+       * config/m68hc11/m68hc11.c (m68hc11_gen_highpart): Don't use
+       gen_highpart.
+
 2001-07-20  Daniel Berlin  <dan@cgsoftware.com>
 
        * params.def: Change default max inline insns to 100.
index cf5d968..da7f490 100644 (file)
@@ -1922,18 +1922,30 @@ m68hc11_gen_highpart (mode, x)
     }
 
   /* gen_highpart crashes when it is called with a SUBREG.  */
-  if (GET_CODE (x) == SUBREG && SUBREG_BYTE (x) != 0)
+  if (GET_CODE (x) == SUBREG)
     {
       return gen_rtx (SUBREG, mode, XEXP (x, 0), XEXP (x, 1));
     }
-  x = gen_highpart (mode, x);
+  if (GET_CODE (x) == REG)
+    {
+      if (REGNO (x) < FIRST_PSEUDO_REGISTER)
+        return gen_rtx (REG, mode, REGNO (x));
+      else
+        return gen_rtx_SUBREG (mode, x, 0);
+    }
 
-  /* Return a different rtx to avoid to share it in several insns
-     (when used by a split pattern).  Sharing addresses within
-     a MEM breaks the Z register replacement (and reloading).  */
   if (GET_CODE (x) == MEM)
-    x = copy_rtx (x);
-  return x;
+    {
+      x = change_address (x, mode, 0);
+
+      /* Return a different rtx to avoid to share it in several insns
+        (when used by a split pattern).  Sharing addresses within
+        a MEM breaks the Z register replacement (and reloading).  */
+      if (GET_CODE (x) == MEM)
+       x = copy_rtx (x);
+      return x;
+    }
+  abort ();
 }
 \f