aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorJuha Sarlin <juha@c3l.tyreso.se>1998-06-10 02:41:51 +0200
committerJeff Law <law@gcc.gnu.org>1998-06-09 18:41:51 -0600
commite6bcfef93acf89ff924dbe47b31dc923f27a584b (patch)
tree29acd50af4b02da97b4316672815716525f85e76 /gcc
parent9d932d439ee9935219a879d1ff7d08a35f05c3b9 (diff)
downloadgcc-e6bcfef93acf89ff924dbe47b31dc923f27a584b.zip
gcc-e6bcfef93acf89ff924dbe47b31dc923f27a584b.tar.gz
gcc-e6bcfef93acf89ff924dbe47b31dc923f27a584b.tar.bz2
* h8300.c (get_shift_alg): Add special cases for shifts of 8 and 24.
From-SVN: r20396
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog4
-rw-r--r--gcc/config/h8300/h8300.c38
2 files changed, 41 insertions, 1 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index db2fa7d..18b9965 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,7 @@
+Wed Jun 10 01:39:00 1998 Juha Sarlin <juha@c3l.tyreso.se>
+
+ * h8300.c (get_shift_alg): Add special cases for shifts of 8 and 24.
+
Tue Jun 9 22:05:34 1998 Richard Henderson <rth@cygnus.com>
* fold-const.c (fold): Even with otherwise constant trees, look for
diff --git a/gcc/config/h8300/h8300.c b/gcc/config/h8300/h8300.c
index 8ff9ec4..a3af135 100644
--- a/gcc/config/h8300/h8300.c
+++ b/gcc/config/h8300/h8300.c
@@ -1,5 +1,5 @@
/* Subroutines for insn-output.c for Hitachi H8/300.
- Copyright (C) 1992, 93, 94, 95, 96, 1997 Free Software Foundation, Inc.
+ Copyright (C) 1992, 93, 94, 95, 96, 97, 1998 Free Software Foundation, Inc.
Contributed by Steve Chamberlain (sac@cygnus.com),
Jim Wilson (wilson@cygnus.com), and Doug Evans (dje@cygnus.com).
@@ -2378,6 +2378,24 @@ get_shift_alg (cpu, shift_type, mode, count, assembler_p,
return SHIFT_SPECIAL;
}
}
+ else if (count == 8 && !TARGET_H8300)
+ {
+ switch (shift_type)
+ {
+ case SHIFT_ASHIFT:
+ *assembler_p = "mov.w\t%e0,%f4\n\tmov.b\t%s4,%t4\n\tmov.b\t%t0,%s4\n\tmov.b\t%s0,%t0\n\tsub.b\t%s0,%s0\n\tmov.w\t%f4,%e0";
+ *cc_valid_p = 0;
+ return SHIFT_SPECIAL;
+ case SHIFT_LSHIFTRT:
+ *assembler_p = "mov.w\t%e0,%f4\n\tmov.b\t%t0,%s0\n\tmov.b\t%s4,%t0\n\tmov.b\t%t4,%s4\n\textu.w\t%f4\n\tmov.w\t%f4,%e0";
+ *cc_valid_p = 0;
+ return SHIFT_SPECIAL;
+ case SHIFT_ASHIFTRT:
+ *assembler_p = "mov.w\t%e0,%f4\n\tmov.b\t%t0,%s0\n\tmov.b\t%s4,%t0\n\tmov.b\t%t4,%s4\n\texts.w\t%f4\n\tmov.w\t%f4,%e0";
+ *cc_valid_p = 0;
+ return SHIFT_SPECIAL;
+ }
+ }
else if (count == 16)
{
switch (shift_type)
@@ -2489,6 +2507,24 @@ get_shift_alg (cpu, shift_type, mode, count, assembler_p,
return SHIFT_SPECIAL;
}
}
+ else if (count == 24 && !TARGET_H8300)
+ {
+ switch (shift_type)
+ {
+ case SHIFT_ASHIFT:
+ *assembler_p = "mov.b\t%s0,%t0\n\tsub.b\t%s0,%s0\n\tmov.w\t%f0,%e0\n\tsub.w\t%f0,%f0";
+ *cc_valid_p = 0;
+ return SHIFT_SPECIAL;
+ case SHIFT_LSHIFTRT:
+ *assembler_p = "mov.w\t%e0,%f0\n\tmov.b\t%t0,%s0\n\textu.w\t%f0\n\textu.l\t%S0";
+ *cc_valid_p = 0;
+ return SHIFT_SPECIAL;
+ case SHIFT_ASHIFTRT:
+ *assembler_p = "mov.w\t%e0,%f0\n\tmov.b\t%t0,%s0\n\texts.w\t%f0\n\texts.l\t%S0";
+ *cc_valid_p = 0;
+ return SHIFT_SPECIAL;
+ }
+ }
else if (count >= 28 && count <= 30 && !TARGET_H8300)
{
if (shift_type == SHIFT_ASHIFTRT)