aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorKazu Hirata <kazu@cs.umass.edu>2002-12-05 13:19:16 +0000
committerKazu Hirata <kazu@gcc.gnu.org>2002-12-05 13:19:16 +0000
commit1e5bdc40951e1ff33e3198ee95e0dab94f2c7946 (patch)
treeb6f0b572f9f30062ec98eb3a4f78cb1f162aa8c6 /gcc
parentd8f2e87b7727707c23476f97224c5fd7756fab0a (diff)
downloadgcc-1e5bdc40951e1ff33e3198ee95e0dab94f2c7946.zip
gcc-1e5bdc40951e1ff33e3198ee95e0dab94f2c7946.tar.gz
gcc-1e5bdc40951e1ff33e3198ee95e0dab94f2c7946.tar.bz2
h8300.c (shift_alg_si): Optimize ashift:HI and lshiftrt:SI by 28, 29, and 30 bits when !TARGET_H8300.
* 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
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog7
-rw-r--r--gcc/config/h8300/h8300.c80
2 files changed, 83 insertions, 4 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index d0317f9..4a46107 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -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
diff --git a/gcc/config/h8300/h8300.c b/gcc/config/h8300/h8300.c
index 1cd1cdc..eac88bd 100644
--- a/gcc/config/h8300/h8300.c
+++ b/gcc/config/h8300/h8300.c
@@ -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)