On Fri, Nov 18, 2016 at 04:29:18PM +0100, Dominik Vogt wrote: > On Fri, Nov 18, 2016 at 08:02:08AM -0600, Segher Boessenkool wrote: > > On Fri, Nov 18, 2016 at 01:09:24PM +0100, Dominik Vogt wrote: > > > IN_RANGE(POS...) makes sure that POS is a non-negative number > > > smaller than UPPER, so (UPPER) - (POS) does not wrap. Or is there > > > some case that the new macro does not handle? > > > > I think it works fine. > > > > With a name like UPPER, you may want to have SIZE_POS_IN_RANGE work like > > IN_RANGE, i.e. UPPER is inclusive then. Dunno. > > Yeah, maybe rather call it RANGE to avoid too much similarity. > Some name that is so vague that one has to read the documentation. > I'll post an updated patch later.
Third version of the patch attached. The only difference is that the macro argument name has been changed back to RANGE. Ciao Dominik ^_^ ^_^ -- Dominik Vogt IBM Germany
gcc/ChangeLog PR target/77822 * system.h (SIZE_POS_IN_RANGE): New.
>From 8e02352c70d478c74155d5d127560da31363dd8a Mon Sep 17 00:00:00 2001 From: Dominik Vogt <v...@linux.vnet.ibm.com> Date: Thu, 17 Nov 2016 14:49:18 +0100 Subject: [PATCH 1/2] PR target/77822: Add helper macro SIZE_POS_IN_RANGE to system.h. The macro can be used to validate the arguments of zero_extract and sign_extract to fix this problem: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=77822 --- gcc/system.h | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/gcc/system.h b/gcc/system.h index 8c6127c..6c1228d 100644 --- a/gcc/system.h +++ b/gcc/system.h @@ -316,6 +316,15 @@ extern int errno; ((unsigned HOST_WIDE_INT) (VALUE) - (unsigned HOST_WIDE_INT) (LOWER) \ <= (unsigned HOST_WIDE_INT) (UPPER) - (unsigned HOST_WIDE_INT) (LOWER)) +/* A convenience macro to determine whether SIZE lies inclusively + within [1, RANGE], POS lies inclusively within between + [0, RANGE - 1] and the sum lies inclusively within [1, RANGE]. + RANGE must be >= 1, but SIZE and POS may be negative. */ +#define SIZE_POS_IN_RANGE(SIZE, POS, RANGE) \ + (IN_RANGE ((POS), 0, (unsigned HOST_WIDE_INT) (RANGE) - 1) \ + && IN_RANGE ((SIZE), 1, (unsigned HOST_WIDE_INT) (RANGE) \ + - (unsigned HOST_WIDE_INT)(POS))) + /* Infrastructure for defining missing _MAX and _MIN macros. Note that macros defined with these cannot be used in #if. */ -- 2.3.0