From f94d0f60d36612acccb50ac4bae4aac9c396c1bc Mon Sep 17 00:00:00 2001 From: Richard Henderson Date: Fri, 11 Aug 2000 00:38:23 -0700 Subject: [PATCH] * combine.c (simplify_shift_const): Obey SHIFT_COUNT_TRUNCATED. From-SVN: r35622 --- gcc/ChangeLog | 4 ++++ gcc/combine.c | 14 ++++++++++---- 2 files changed, 14 insertions(+), 4 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 23788386353..0a72584d802 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,7 @@ +2000-08-11 Richard Henderson + + * combine.c (simplify_shift_const): Obey SHIFT_COUNT_TRUNCATED. + Thu Aug 10 22:47:09 2000 Ovidiu Predescu * configure.in: diff --git a/gcc/combine.c b/gcc/combine.c index e4243179bd1..4ad2f4f3b17 100644 --- a/gcc/combine.c +++ b/gcc/combine.c @@ -8879,10 +8879,11 @@ simplify_shift_const (x, code, result_mode, varop, input_count) ? result_mode : mode); /* Handle cases where the count is greater than the size of the mode - minus 1. For ASHIFT, use the size minus one as the count (this can - occur when simplifying (lshiftrt (ashiftrt ..))). For rotates, - take the count modulo the size. For other shifts, the result is - zero. + minus 1. If SHIFT_COUNT_TRUNCATED, there aren't really any such + cases. Otherwise, for ASHIFT, use the size minus one as the count + (this can occur when simplifying (lshiftrt (ashiftrt ..))). For + rotates, take the count modulo the size. For other shifts, the + result is zero. Since these shifts are being produced by the compiler by combining multiple operations, each of which are defined, we know what the @@ -8890,6 +8891,11 @@ simplify_shift_const (x, code, result_mode, varop, input_count) if (count > GET_MODE_BITSIZE (shift_mode) - 1) { +#ifdef SHIFT_COUNT_TRUNCATED + if (SHIFT_COUNT_TRUNCATED) + count %= GET_MODE_BITSIZE (shift_mode); + else +#endif if (code == ASHIFTRT) count = GET_MODE_BITSIZE (shift_mode) - 1; else if (code == ROTATE || code == ROTATERT) -- 2.30.2