From: kazu Date: Tue, 13 Nov 2001 21:00:28 +0000 (+0000) Subject: * config/h8300/h8300.c (shift_alg_si): Use special code for X-Git-Tag: upstream/4.9.2~90973 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=0d2192709a00dac771a0b4cd28be33674a288f8b;p=platform%2Fupstream%2Flinaro-gcc.git * 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. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@46991 138bc75d-0d04-0410-961f-82ee72b054a4 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index e3c672f..b7acb2f 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2001-11-13 Kazu Hirata + + * 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 * emit-rtl.c (adjust_address_1): Add ADJUST argument. diff --git a/gcc/config/h8300/h8300.c b/gcc/config/h8300/h8300.c index e31ddfa..f978392 100644 --- a/gcc/config/h8300/h8300.c +++ b/gcc/config/h8300/h8300.c @@ -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; } }