aboutsummaryrefslogtreecommitdiff
path: root/gcc/rtl.h
diff options
context:
space:
mode:
authorDominik Vogt <vogt@linux.vnet.ibm.com>2016-12-02 08:26:19 +0000
committerAndreas Krebbel <krebbel@gcc.gnu.org>2016-12-02 08:26:19 +0000
commit8f61415f1f776d35f0d616bd662019a659a6e536 (patch)
tree05837f8d404bbfc6a3056defa244950336cb02ad /gcc/rtl.h
parent7f5fc63362a675a216f1475bb08fd42d8274f8cf (diff)
downloadgcc-8f61415f1f776d35f0d616bd662019a659a6e536.zip
gcc-8f61415f1f776d35f0d616bd662019a659a6e536.tar.gz
gcc-8f61415f1f776d35f0d616bd662019a659a6e536.tar.bz2
PR target/77822: Add helper macro EXTRACT_ARGS_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/ChangeLog: 2016-12-02 Dominik Vogt <vogt@linux.vnet.ibm.com> PR target/77822 * rtl.h (EXTRACT_ARGS_IN_RANGE): New. From-SVN: r243159
Diffstat (limited to 'gcc/rtl.h')
-rw-r--r--gcc/rtl.h10
1 files changed, 10 insertions, 0 deletions
diff --git a/gcc/rtl.h b/gcc/rtl.h
index 5fde698..a5efa28 100644
--- 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);