simplify-rtx.c (simplify_subreg): Use subreg_regno_offset directly instead of using...
authorRichard Henderson <rth@redhat.com>
Tue, 23 Nov 2004 23:03:15 +0000 (15:03 -0800)
committerRichard Henderson <rth@gcc.gnu.org>
Tue, 23 Nov 2004 23:03:15 +0000 (15:03 -0800)
        * simplify-rtx.c (simplify_subreg): Use subreg_regno_offset directly
        instead of using a SUBREG temporary.

From-SVN: r91114

gcc/ChangeLog
gcc/simplify-rtx.c

index a16e9b6f04187095ba895926f6c4cb14aaf9797c..9752df3b6eebaf5981cf2a45a0135cd51197cc44 100644 (file)
@@ -1,3 +1,8 @@
+2004-11-23  Richard Henderson  <rth@redhat.com>
+
+       * simplify-rtx.c (simplify_subreg): Use subreg_regno_offset directly
+       instead of using a SUBREG temporary.
+
 2004-11-23  Kazu Hirata  <kazu@cs.umass.edu>
 
        * tree-cfg.c (tree_forwarder_block_p): Speed up by reordering
index ac896ab27ab4b95d8990a4091fd5dea4d9d91c13..8ecd8fc55281135766e0017da518ce9512619051 100644 (file)
@@ -3675,14 +3675,15 @@ simplify_subreg (enum machine_mode outermode, rtx op,
       && subreg_offset_representable_p (REGNO (op), innermode,
                                        byte, outermode))
     {
-      rtx tem = gen_rtx_SUBREG (outermode, op, byte);
-      int final_regno = subreg_hard_regno (tem, 0);
+      unsigned int regno = REGNO (op);
+      unsigned int final_regno
+       = regno + subreg_regno_offset (regno, innermode, byte, outermode);
 
       /* ??? We do allow it if the current REG is not valid for
         its mode.  This is a kludge to work around how float/complex
         arguments are passed on 32-bit SPARC and should be fixed.  */
       if (HARD_REGNO_MODE_OK (final_regno, outermode)
-         || ! HARD_REGNO_MODE_OK (REGNO (op), innermode))
+         || ! HARD_REGNO_MODE_OK (regno, innermode))
        {
          rtx x = gen_rtx_REG_offset (op, outermode, final_regno, byte);