diff options
author | Kazu Hirata <kazu@cs.umass.edu> | 2002-12-05 13:19:16 +0000 |
---|---|---|
committer | Kazu Hirata <kazu@gcc.gnu.org> | 2002-12-05 13:19:16 +0000 |
commit | 1e5bdc40951e1ff33e3198ee95e0dab94f2c7946 (patch) | |
tree | b6f0b572f9f30062ec98eb3a4f78cb1f162aa8c6 | |
parent | d8f2e87b7727707c23476f97224c5fd7756fab0a (diff) | |
download | gcc-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
-rw-r--r-- | gcc/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/config/h8300/h8300.c | 80 |
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) |