]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
h8300.c (shift_alg_hi): Various tweaks to improve performance of HImode shifts.
authorDhananjay R. Deshpande <dhananjayd@kpit.com>
Thu, 29 Aug 2002 21:26:52 +0000 (15:26 -0600)
committerJeff Law <law@gcc.gnu.org>
Thu, 29 Aug 2002 21:26:52 +0000 (15:26 -0600)
        * h8300.c (shift_alg_hi): Various tweaks to improve performance
        of HImode shifts.
        (get_shift_alg): Corresponding changes.

From-SVN: r56665

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

index e29e98e12bae990a82e6979d67b19877b5ff1b44..5fca1767049d7e7feb5e6cc3bc40fa3a7d47fa7f 100644 (file)
@@ -1,3 +1,9 @@
+2002-08-29  "Dhananjay R. Deshpande" <dhananjayd@kpit.com>
+
+       * h8300.c (shift_alg_hi): Various tweaks to improve performance
+       of HImode shifts.
+       (get_shift_alg): Corresponding changes.
+
 2002-08-29  John David Anglin  <dave@hiauly1.hia.nrc.ca>
 
        * som.h (ALWAYS_STRIP_DOTDOT): Define to 1.
index 841c8b7a641000a49a254389894d680f7b961cfa..19520db43331fb7d67683bdf240581b1f26b24e2 100644 (file)
@@ -2213,23 +2213,23 @@ static const enum shift_alg shift_alg_hi[3][3][16] = {
     /* TARGET_H8300  */
     /*  0    1    2    3    4    5    6    7  */
     /*  8    9   10   11   12   13   14   15  */
+    { INL, INL, INL, INL, INL, INL, INL, SPC,
+      SPC, SPC, SPC, SPC, SPC, SPC, SPC, SPC }, /* SHIFT_ASHIFT   */
     { INL, INL, INL, INL, INL, LOP, LOP, SPC,
-      SPC, SPC, SPC, SPC, SPC, LOP, LOP, SPC }, /* SHIFT_ASHIFT   */
+      SPC, SPC, SPC, SPC, SPC, SPC, SPC, SPC }, /* SHIFT_LSHIFTRT */
     { INL, INL, INL, INL, INL, LOP, LOP, SPC,
-      SPC, SPC, SPC, SPC, SPC, LOP, LOP, SPC }, /* SHIFT_LSHIFTRT */
-    { INL, INL, INL, INL, INL, LOP, LOP, SPC,
-      SPC, SPC, SPC, SPC, SPC, LOP, LOP, SPC }, /* SHIFT_ASHIFTRT */
+      SPC, SPC, SPC, SPC, SPC, SPC, SPC, SPC }, /* SHIFT_ASHIFTRT */
   },
   {
     /* TARGET_H8300H  */
     /*  0    1    2    3    4    5    6    7  */
     /*  8    9   10   11   12   13   14   15  */
-    { INL, INL, INL, INL, INL, LOP, LOP, SPC,
+    { INL, INL, INL, INL, INL, INL, INL, SPC,
       SPC, SPC, SPC, SPC, SPC, ROT, ROT, ROT }, /* SHIFT_ASHIFT   */
-    { INL, INL, INL, INL, INL, LOP, LOP, SPC,
+    { INL, INL, INL, INL, INL, INL, INL, SPC,
       SPC, SPC, SPC, SPC, SPC, ROT, ROT, ROT }, /* SHIFT_LSHIFTRT */
-    { INL, INL, INL, INL, INL, LOP, LOP, SPC,
-      SPC, SPC, SPC, SPC, SPC, LOP, LOP, SPC }, /* SHIFT_ASHIFTRT */
+    { INL, INL, INL, INL, INL, INL, INL, SPC,
+      SPC, SPC, SPC, SPC, SPC, SPC, SPC, SPC }, /* SHIFT_ASHIFTRT */
   },
   {
     /* TARGET_H8300S  */
@@ -2240,7 +2240,7 @@ static const enum shift_alg shift_alg_hi[3][3][16] = {
     { INL, INL, INL, INL, INL, INL, INL, INL,
       SPC, SPC, SPC, SPC, SPC, ROT, ROT, ROT }, /* SHIFT_LSHIFTRT */
     { INL, INL, INL, INL, INL, INL, INL, INL,
-      SPC, SPC, SPC, SPC, SPC, LOP, LOP, SPC }, /* SHIFT_ASHIFTRT */
+      SPC, SPC, SPC, SPC, SPC, SPC, SPC, SPC }, /* SHIFT_ASHIFTRT */
   }
 };
 
@@ -2458,7 +2458,7 @@ get_shift_alg (shift_type, shift_mode, count, info)
              goto end;
            }
        }
-      else if (8 <= count && count <= 12)
+      else if (8 <= count && count <= 13)
        {
          info->remainder = count - 8;
 
@@ -2484,6 +2484,28 @@ get_shift_alg (shift_type, shift_mode, count, info)
              goto end;
            }
        }
+      else if (count == 14)
+       {
+         switch (shift_type)
+           {
+           case SHIFT_ASHIFT:
+             if (TARGET_H8300)
+               info->special = "mov.b\t%s0,%t0\n\trotr.b\t%t0\n\trotr.b\t%t0\n\tand.b\t#0xC0,%t0\n\tsub.b\t%s0,%s0";
+             goto end;
+           case SHIFT_LSHIFTRT:
+             if (TARGET_H8300)
+               info->special = "mov.b\t%t0,%s0\n\trotl.b\t%s0\n\trotl.b\t%s0\n\tand.b\t#3,%s0\n\tsub.b\t%t0,%t0";
+             goto end;
+           case SHIFT_ASHIFTRT:
+             if (TARGET_H8300)
+               info->special = "mov.b\t%t0,%s0\n\tshll.b\t%s0\n\tsubx.b\t%t0,%t0\n\tshll.b\t%s0\n\tmov.b\t%t0,%s0\n\tbst.b\t#0,%s0";
+             else if (TARGET_H8300H)
+               info->special = "shll.b\t%t0\n\tsubx.b\t%s0,%s0\n\tshll.b\t%t0\n\trotxl.b\t%s0\n\texts.w\t%T0";
+             else /* TARGET_H8300S */
+               info->special = "mov.b\t%t0,%s0\n\texts.w\t%T0\n\tshar.w\t#2,%T0\n\tshar.w\t#2,%T0\n\tshar.w\t#2,%T0";
+             goto end;
+           }
+       }
       else if (count == 15)
        {
          switch (shift_type)