PR target/77822: Add helper macro EXTRACT_ARGS_IN_RANGE to system.h.
authorDominik Vogt <vogt@linux.vnet.ibm.com>
Fri, 2 Dec 2016 08:26:19 +0000 (08:26 +0000)
committerAndreas Krebbel <krebbel@gcc.gnu.org>
Fri, 2 Dec 2016 08:26:19 +0000 (08:26 +0000)
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/ChangeLog:

2016-12-02  Dominik Vogt  <vogt@linux.vnet.ibm.com>

PR target/77822
* rtl.h (EXTRACT_ARGS_IN_RANGE): New.

From-SVN: r243159

gcc/ChangeLog
gcc/rtl.h

index e5f83456f0f00e285b55a6bd7ea567b1116a8414..8c71c21d1eb8808bacea62105d07d321c6e73eab 100644 (file)
@@ -1,3 +1,8 @@
+2016-12-02  Dominik Vogt  <vogt@linux.vnet.ibm.com>
+
+       PR target/77822
+       * rtl.h (EXTRACT_ARGS_IN_RANGE): New.
+
 2016-12-02  Andreas Krebbel  <krebbel@linux.vnet.ibm.com>
 
        * gcc/config/s390/s390.c (s390_builtin_vectorization_cost): New
index 5fde6989216bc3e2dc47412610dd6da7f18fd7d0..a5efa282a157f40b7666cc36488e475340fb47a2 100644 (file)
--- a/gcc/rtl.h
+++ b/gcc/rtl.h
@@ -2694,6 +2694,16 @@ get_full_set_src_cost (rtx x, machine_mode mode, struct full_rtx_costs *c)
 }
 #endif
 
+/* A convenience macro to validate the arguments of a zero_extract
+   expression.  It determines 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 EXTRACT_ARGS_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)))
+
 /* In explow.c */
 extern HOST_WIDE_INT trunc_int_for_mode        (HOST_WIDE_INT, machine_mode);
 extern rtx plus_constant (machine_mode, rtx, HOST_WIDE_INT, bool = false);