h8300.c (shift_alg_si): Optimize ashift:HI and lshiftrt:SI by 28, 29, and 30 bits...
authorKazu Hirata <kazu@cs.umass.edu>
Thu, 5 Dec 2002 13:19:16 +0000 (13:19 +0000)
committerKazu Hirata <kazu@gcc.gnu.org>
Thu, 5 Dec 2002 13:19:16 +0000 (13:19 +0000)
* config/h8300/h8300.c (shift_alg_si): Optimize ashift:HI and
lshiftrt:SI by 28, 29, and 30 bits when !TARGET_H8300.
(get_shift_alg): Return optimal assembly instructions for the
shifts mentioned above.

From-SVN: r59859

gcc/ChangeLog
gcc/config/h8300/h8300.c

index d0317f9da6c8e576efc3d0831395653abaa5b3cc..4a46107d6ca449da100230ff0466be14e7d6a39b 100644 (file)
@@ -1,3 +1,10 @@
+2002-12-05  Kazu Hirata  <kazu@cs.umass.edu>
+
+       * config/h8300/h8300.c (shift_alg_si): Optimize ashift:HI and
+       lshiftrt:SI by 28, 29, and 30 bits when !TARGET_H8300.
+       (get_shift_alg): Return optimal assembly instructions for the
+       shifts mentioned above.
+
 2002-12-04  Kazu Hirata  <kazu@cs.umass.edu>
 
        * config/h8300/h8300.c (h8300_init_once): Do not use loop to
index 1cd1cdcbc011bff014ee9aabdde93070c5876829..eac88bde469059f9df26a11033d5093702252d67 100644 (file)
@@ -242,11 +242,11 @@ static enum shift_alg shift_alg_si[3][3][32] = {
     { INL, INL, INL, INL, INL, LOP, LOP, LOP,
       SPC, LOP, LOP, LOP, LOP, LOP, LOP, SPC,
       SPC, SPC, SPC, SPC, LOP, LOP, LOP, LOP,
-      SPC, LOP, LOP, LOP, ROT, ROT, ROT, SPC }, /* SHIFT_ASHIFT   */
+      SPC, LOP, LOP, LOP, SPC, SPC, SPC, SPC }, /* SHIFT_ASHIFT   */
     { INL, INL, INL, INL, INL, LOP, LOP, LOP,
       SPC, LOP, LOP, LOP, LOP, LOP, LOP, SPC,
       SPC, SPC, SPC, SPC, LOP, LOP, LOP, LOP,
-      SPC, LOP, LOP, LOP, ROT, ROT, ROT, SPC }, /* SHIFT_LSHIFTRT */
+      SPC, LOP, LOP, LOP, SPC, SPC, SPC, SPC }, /* SHIFT_LSHIFTRT */
     { INL, INL, INL, INL, INL, LOP, LOP, LOP,
       SPC, LOP, LOP, LOP, LOP, LOP, LOP, LOP,
       SPC, SPC, SPC, SPC, LOP, LOP, LOP, LOP,
@@ -261,11 +261,11 @@ static enum shift_alg shift_alg_si[3][3][32] = {
     { INL, INL, INL, INL, INL, INL, INL, INL,
       INL, INL, INL, LOP, LOP, LOP, LOP, SPC,
       SPC, SPC, SPC, SPC, SPC, SPC, LOP, LOP,
-      SPC, SPC, LOP, LOP, ROT, ROT, ROT, SPC }, /* SHIFT_ASHIFT   */
+      SPC, SPC, LOP, LOP, SPC, SPC, SPC, SPC }, /* SHIFT_ASHIFT   */
     { INL, INL, INL, INL, INL, INL, INL, INL,
       INL, INL, INL, LOP, LOP, LOP, LOP, SPC,
       SPC, SPC, SPC, SPC, SPC, SPC, LOP, LOP,
-      SPC, SPC, LOP, LOP, ROT, ROT, ROT, SPC }, /* SHIFT_LSHIFTRT */
+      SPC, SPC, LOP, LOP, SPC, SPC, SPC, SPC }, /* SHIFT_LSHIFTRT */
     { INL, INL, INL, INL, INL, INL, INL, INL,
       INL, INL, INL, LOP, LOP, LOP, LOP, LOP,
       SPC, SPC, SPC, SPC, SPC, SPC, LOP, LOP,
@@ -2725,6 +2725,78 @@ get_shift_alg (shift_type, shift_mode, count, info)
              goto end;
            }
        }
+      else if (!TARGET_H8300 && count == 28)
+       {
+         switch (shift_type)
+           {
+           case SHIFT_ASHIFT:
+             if (TARGET_H8300H)
+               info->special = "sub.w\t%e0,%e0\n\trotr.l\t%S0\n\trotr.l\t%S0\n\trotr.l\t%S0\n\trotr.l\t%S0\n\tsub.w\t%f0,%f0";
+             else
+               info->special = "sub.w\t%e0,%e0\n\trotr.l\t#2,%S0\n\trotr.l\t#2,%S0\n\tsub.w\t%f0,%f0";
+             info->shift1  = "";
+             info->shift2  = "";
+             goto end;
+           case SHIFT_LSHIFTRT:
+             if (TARGET_H8300H)
+               info->special = "sub.w\t%f0,%f0\n\trotl.l\t%S0\n\trotl.l\t%S0\n\trotl.l\t%S0\n\trotl.l\t%S0\n\tsub.w\t%e0,%e0";
+             else
+               info->special = "sub.w\t%f0,%f0\n\trotl.l\t#2,%S0\n\trotl.l\t#2,%S0\n\tsub.w\t%e0,%e0";
+             info->shift1  = "";
+             info->shift2  = "";
+             goto end;
+           case SHIFT_ASHIFTRT:
+             abort ();
+           }
+       }
+      else if (!TARGET_H8300 && count == 29)
+       {
+         switch (shift_type)
+           {
+           case SHIFT_ASHIFT:
+             if (TARGET_H8300H)
+               info->special = "sub.w\t%e0,%e0\n\trotr.l\t%S0\n\trotr.l\t%S0\n\trotr.l\t%S0\n\tsub.w\t%f0,%f0";
+             else
+               info->special = "sub.w\t%e0,%e0\n\trotr.l\t#2,%S0\n\trotr.l\t%S0\n\tsub.w\t%f0,%f0";
+             info->shift1  = "";
+             info->shift2  = "";
+             goto end;
+           case SHIFT_LSHIFTRT:
+             if (TARGET_H8300H)
+               info->special = "sub.w\t%f0,%f0\n\trotl.l\t%S0\n\trotl.l\t%S0\n\trotl.l\t%S0\n\tsub.w\t%e0,%e0";
+             else
+               info->special = "sub.w\t%f0,%f0\n\trotl.l\t#2,%S0\n\trotl.l\t%S0\n\tsub.w\t%e0,%e0";
+             info->shift1  = "";
+             info->shift2  = "";
+             goto end;
+           case SHIFT_ASHIFTRT:
+             abort ();
+           }
+       }
+      else if (!TARGET_H8300 && count == 30)
+       {
+         switch (shift_type)
+           {
+           case SHIFT_ASHIFT:
+             if (TARGET_H8300H)
+               info->special = "sub.w\t%e0,%e0\n\trotr.l\t%S0\n\trotr.l\t%S0\n\tsub.w\t%f0,%f0";
+             else
+               info->special = "sub.w\t%e0,%e0\n\trotr.l\t#2,%S0\n\tsub.w\t%f0,%f0";
+             info->shift1  = "";
+             info->shift2  = "";
+             goto end;
+           case SHIFT_LSHIFTRT:
+             if (TARGET_H8300H)
+               info->special = "sub.w\t%f0,%f0\n\trotl.l\t%S0\n\trotl.l\t%S0\n\tsub.w\t%e0,%e0";
+             else
+               info->special = "sub.w\t%f0,%f0\n\trotl.l\t#2,%S0\n\tsub.w\t%e0,%e0";
+             info->shift1  = "";
+             info->shift2  = "";
+             goto end;
+           case SHIFT_ASHIFTRT:
+             abort ();
+           }
+       }
       else if (count == 31)
        {
          if (TARGET_H8300)