OSDN Git Service

* config/h8300/h8300.c (shift_alg_si): Use special code for
authorkazu <kazu@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 13 Nov 2001 21:00:28 +0000 (21:00 +0000)
committerkazu <kazu@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 13 Nov 2001 21:00:28 +0000 (21:00 +0000)
25-bit shifts on H8/S.
(get_shift_alg): Generate special code for 25-bit shifts on
H8/S.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@46991 138bc75d-0d04-0410-961f-82ee72b054a4

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

index e3c672f..b7acb2f 100644 (file)
@@ -1,3 +1,10 @@
+2001-11-13  Kazu Hirata  <kazu@hxi.com>
+
+       * config/h8300/h8300.c (shift_alg_si): Use special code for
+       25-bit shifts on H8/S.
+       (get_shift_alg): Generate special code for 25-bit shifts on
+       H8/S.
+
 2001-11-13  Jakub Jelinek  <jakub@redhat.com>
 
        * emit-rtl.c (adjust_address_1): Add ADJUST argument.
index e31ddfa..f978392 100644 (file)
@@ -2273,15 +2273,15 @@ static const 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, LOP, LOP, LOP, ROT, ROT, ROT, SPC }, /* SHIFT_ASHIFT   */
+      SPC, SPC, LOP, LOP, ROT, ROT, ROT, 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, LOP, LOP, LOP, ROT, ROT, ROT, SPC }, /* SHIFT_LSHIFTRT */
+      SPC, SPC, LOP, LOP, ROT, ROT, ROT, 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,
-      SPC, LOP, LOP, LOP, LOP, LOP, LOP, SPC }, /* SHIFT_ASHIFTRT */
+      SPC, SPC, LOP, LOP, LOP, LOP, LOP, SPC }, /* SHIFT_ASHIFTRT */
   }
 };
 
@@ -2554,18 +2554,27 @@ get_shift_alg (shift_type, shift_mode, count, info)
              goto end;
            }
        }
-      else if (count == 24 && !TARGET_H8300)
+      else if ((TARGET_H8300H && count == 24)
+              || (TARGET_H8300S && 24 <= count && count <= 25))
        {
+         info->remainder = count - 24;
+
          switch (shift_type)
            {
            case SHIFT_ASHIFT:
              info->special = "mov.b\t%s0,%t0\n\tsub.b\t%s0,%s0\n\tmov.w\t%f0,%e0\n\tsub.w\t%f0,%f0";
+             info->shift1  = "shll.l\t%S0";
+             info->shift2  = "shll.l\t#2,%S0";
              goto end;
            case SHIFT_LSHIFTRT:
              info->special = "mov.w\t%e0,%f0\n\tmov.b\t%t0,%s0\n\textu.w\t%f0\n\textu.l\t%S0";
+             info->shift1  = "shlr.l\t%S0";
+             info->shift2  = "shlr.l\t#2,%S0";
              goto end;
            case SHIFT_ASHIFTRT:
              info->special = "mov.w\t%e0,%f0\n\tmov.b\t%t0,%s0\n\texts.w\t%f0\n\texts.l\t%S0";
+             info->shift1  = "shar.l\t%S0";
+             info->shift2  = "shar.l\t#2,%S0";
              goto end;
            }
        }