(clobber (reg:CC CC_REGNUM))])]
"TARGET_Z10"
{
+ if (! EXTRACT_ARGS_IN_RANGE (INTVAL (operands[2]), INTVAL (operands[3]), 64))
+ FAIL;
/* Starting with zEC12 there is risbgn not clobbering CC. */
if (TARGET_ZEC12)
{
(match_operand 2 "const_int_operand" "") ; size
(match_operand 3 "const_int_operand" ""))) ; start
]
- "<z10_or_zEC12_cond>"
+ "<z10_or_zEC12_cond>
+ && EXTRACT_ARGS_IN_RANGE (INTVAL (operands[2]), INTVAL (operands[3]),
+ GET_MODE_BITSIZE (<MODE>mode))"
"<risbg_n>\t%0,%1,64-%2,128+63,<bitoff_plus>%3+%2" ; dst, src, start, end, shift
[(set_attr "op_type" "RIE")
(set_attr "z10prop" "z10_super_E1")])
(lshiftrt:DI (match_operand:DI 3 "register_operand" "d")
(match_operand:DI 4 "nonzero_shift_count_operand" "")))]
"<z10_or_zEC12_cond>
+ && EXTRACT_ARGS_IN_RANGE (INTVAL (operands[1]), INTVAL (operands[2]), 64)
&& 64 - UINTVAL (operands[4]) >= UINTVAL (operands[1])"
"<risbg_n>\t%0,%3,%2,%2+%1-1,128-%2-%1-%4"
[(set_attr "op_type" "RIE")
(match_operand 5 "const_int_operand" "")) ; start
4)))]
"<z10_or_zEC12_cond>
+ && EXTRACT_ARGS_IN_RANGE (INTVAL (operands[4]), INTVAL (operands[5]), 64)
&& UINTVAL (operands[2]) == (~(0ULL) << UINTVAL (operands[4]))"
"<risbg_n>\t%0,%3,64-%4,63,%4+%5"
[(set_attr "op_type" "RIE")
(const_int 1) ; size
(match_operand 2 "const_int_operand" "")) ; start
(const_int 0)))]
- "<z10_or_zEC12_cond>"
+ "<z10_or_zEC12_cond>
+ && EXTRACT_ARGS_IN_RANGE (1, INTVAL (operands[2]), 64)"
"<risbg_n>\t%0,%1,64-1,128+63,%2+1" ; dst, src, start, end, shift
[(set_attr "op_type" "RIE")
(set_attr "z10prop" "z10_super_E1")])
(match_operand 2 "const_int_operand" "I")) ; pos
(match_operand:GPR 3 "nonimmediate_operand" "d"))]
"<z10_or_zEC12_cond>
+ && EXTRACT_ARGS_IN_RANGE (INTVAL (operands[1]), INTVAL (operands[2]),
+ GET_MODE_BITSIZE (<MODE>mode))
&& (INTVAL (operands[1]) + INTVAL (operands[2])) <= <bitsize>"
"<risbg_n>\t%0,%3,<bitoff_plus>%2,<bitoff_plus>%2+%1-1,<bitsize>-%2-%1"
[(set_attr "op_type" "RIE")
(match_operand:DI 3 "nonimmediate_operand" "d")))
(clobber (reg:CC CC_REGNUM))]
"TARGET_Z10
+ && EXTRACT_ARGS_IN_RANGE (INTVAL (operands[1]), INTVAL (operands[2]), 64)
&& INTVAL (operands[1]) + INTVAL (operands[2]) == 64"
"rnsbg\t%0,%3,%2,63,0"
[(set_attr "op_type" "RIE")])
(match_operand:DI 4 "nonimmediate_operand" "d")))
(clobber (reg:CC CC_REGNUM))]
"TARGET_Z10
+ && EXTRACT_ARGS_IN_RANGE (INTVAL (operands[1]), INTVAL (operands[2]), 64)
&& INTVAL (operands[3]) == 64 - INTVAL (operands[1]) - INTVAL (operands[2])"
"rnsbg\t%0,%4,%2,%2+%1-1,%3"
[(set_attr "op_type" "RIE")])
(match_operand 1 "const_int_operand" "n,n")
(const_int 0))
(match_operand:W 2 "register_operand" "d,d"))]
- "INTVAL (operands[1]) > 0
+ "EXTRACT_ARGS_IN_RANGE (INTVAL (operands[1]), 0, 64)
+ && INTVAL (operands[1]) > 0
&& INTVAL (operands[1]) <= GET_MODE_BITSIZE (SImode)
&& INTVAL (operands[1]) % BITS_PER_UNIT == 0"
{
(lshiftrt:DI (match_operand:DI 2 "register_operand" "d")
(const_int 32)))]
"TARGET_ZARCH
+ && EXTRACT_ARGS_IN_RANGE (INTVAL (operands[1]), 0, 64)
&& INTVAL (operands[1]) > 0
&& INTVAL (operands[1]) <= GET_MODE_BITSIZE (SImode)
&& INTVAL (operands[1]) % BITS_PER_UNIT == 0"
(match_operand 1 "const_int_operand" "n"))
(match_operand:DI 2 "const_int_operand" "n"))]
"TARGET_ZARCH
+ && EXTRACT_ARGS_IN_RANGE (16, INTVAL (operands[1]), 64)
&& INTVAL (operands[1]) >= 0
&& INTVAL (operands[1]) < BITS_PER_WORD
&& INTVAL (operands[1]) % 16 == 0"
--- /dev/null
+/* This testcase checks that the shift operand of r*sbg instructions is in
+ range. */
+
+/* { dg-do compile } */
+/* { dg-options "-O3 -march=zEC12 -Wno-shift-count-overflow" } */
+
+int g;
+
+void pos_ll_129 (long long b)
+{
+ if (b >> 129 & 1)
+ g = b;
+}
+
+void sizepos_ll_134 (long long b)
+{
+ if (b >> 134 & 1)
+ g = b;
+}
+
+void pos_ll_65 (long long b)
+{
+ if (b >> 65 & 1)
+ g = b;
+}
+
+void sizepos_ll_70 (long long b)
+{
+ if (b >> 70 & 1)
+ g = b;
+}
+
+void pos_ll_33 (long long b)
+{
+ if (b >> 33 & 1)
+ g = b;
+}
+
+void sizepos_ll_38 (long long b)
+{
+ if (b >> 38 & 1)
+ g = b;
+}
+
+void pos_ll_17 (long long b)
+{
+ if (b >> 17 & 1)
+ g = b;
+}
+
+void sizepos_ll_22 (long long b)
+{
+ if (b >> 22 & 1)
+ g = b;
+}
+
+void pos_ll_8 (long long b)
+{
+ if (b >> 8 & 1)
+ g = b;
+}
+
+void sizepos_ll_13 (long long b)
+{
+ if (b >> 13 & 1)
+ g = b;
+}
+
+void pos_l_129 (long b)
+{
+ if (b >> 129 & 1)
+ g = b;
+}
+
+void sizepos_l_134 (long b)
+{
+ if (b >> 134 & 1)
+ g = b;
+}
+
+void pos_l_65 (long b)
+{
+ if (b >> 65 & 1)
+ g = b;
+}
+
+void sizepos_l_70 (long b)
+{
+ if (b >> 70 & 1)
+ g = b;
+}
+
+void pos_l_33 (long b)
+{
+ if (b >> 33 & 1)
+ g = b;
+}
+
+void sizepos_l_38 (long b)
+{
+ if (b >> 38 & 1)
+ g = b;
+}
+
+void pos_l_17 (long b)
+{
+ if (b >> 17 & 1)
+ g = b;
+}
+
+void sizepos_l_22 (long b)
+{
+ if (b >> 22 & 1)
+ g = b;
+}
+
+void pos_l_8 (long b)
+{
+ if (b >> 8 & 1)
+ g = b;
+}
+
+void sizepos_l_13 (long b)
+{
+ if (b >> 13 & 1)
+ g = b;
+}
+
+void pos_i_129 (int b)
+{
+ if (b >> 129 & 1)
+ g = b;
+}
+
+void sizepos_i_134 (int b)
+{
+ if (b >> 134 & 1)
+ g = b;
+}
+
+void pos_i_65 (int b)
+{
+ if (b >> 65 & 1)
+ g = b;
+}
+
+void sizepos_i_70 (int b)
+{
+ if (b >> 70 & 1)
+ g = b;
+}
+
+void pos_i_33 (int b)
+{
+ if (b >> 33 & 1)
+ g = b;
+}
+
+void sizepos_i_38 (int b)
+{
+ if (b >> 38 & 1)
+ g = b;
+}
+
+void pos_i_17 (int b)
+{
+ if (b >> 17 & 1)
+ g = b;
+}
+
+void sizepos_i_22 (int b)
+{
+ if (b >> 22 & 1)
+ g = b;
+}
+
+void pos_i_8 (int b)
+{
+ if (b >> 8 & 1)
+ g = b;
+}
+
+void sizepos_i_13 (int b)
+{
+ if (b >> 13 & 1)
+ g = b;
+}
+
+void pos_s_129 (short b)
+{
+ if (b >> 129 & 1)
+ g = b;
+}
+
+void sizepos_s_134 (short b)
+{
+ if (b >> 134 & 1)
+ g = b;
+}
+
+void pos_s_65 (short b)
+{
+ if (b >> 65 & 1)
+ g = b;
+}
+
+void sizepos_s_70 (short b)
+{
+ if (b >> 70 & 1)
+ g = b;
+}
+
+void pos_s_33 (short b)
+{
+ if (b >> 33 & 1)
+ g = b;
+}
+
+void sizepos_s_38 (short b)
+{
+ if (b >> 38 & 1)
+ g = b;
+}
+
+void pos_s_17 (short b)
+{
+ if (b >> 17 & 1)
+ g = b;
+}
+
+void sizepos_s_22 (short b)
+{
+ if (b >> 22 & 1)
+ g = b;
+}
+
+void pos_s_8 (short b)
+{
+ if (b >> 8 & 1)
+ g = b;
+}
+
+void sizepos_s_13 (short b)
+{
+ if (b >> 13 & 1)
+ g = b;
+}
+
+void pos_c_129 (signed char b)
+{
+ if (b >> 129 & 1)
+ g = b;
+}
+
+void sizepos_c_134 (signed char b)
+{
+ if (b >> 134 & 1)
+ g = b;
+}
+
+void pos_c_65 (signed char b)
+{
+ if (b >> 65 & 1)
+ g = b;
+}
+
+void sizepos_c_70 (signed char b)
+{
+ if (b >> 70 & 1)
+ g = b;
+}
+
+void pos_c_33 (signed char b)
+{
+ if (b >> 33 & 1)
+ g = b;
+}
+
+void sizepos_c_38 (signed char b)
+{
+ if (b >> 38 & 1)
+ g = b;
+}
+
+void pos_c_17 (signed char b)
+{
+ if (b >> 17 & 1)
+ g = b;
+}
+
+void sizepos_c_22 (signed char b)
+{
+ if (b >> 22 & 1)
+ g = b;
+}
+
+void pos_c_8 (signed char b)
+{
+ if (b >> 8 & 1)
+ g = b;
+}
+
+void sizepos_c_13 (signed char b)
+{
+ if (b >> 13 & 1)
+ g = b;
+}