(match_operand:SI 2 "register_operand" "c")
(match_operand:SI 3 "const_int_operand")) 0)))
(clobber (reg:CC FLAGS_REG))]
- "INTVAL (operands[3]) <= (<MODE_SIZE> * BITS_PER_UNIT)-1
+ "INTVAL (operands[3]) <= (<MODE_SIZE> * BITS_PER_UNIT) - 1
&& can_create_pseudo_p ()"
"#"
"&& 1"
operands[8] = GEN_INT (<MODE_SIZE> * BITS_PER_UNIT);
- if (INTVAL (operands[3]) < (<MODE_SIZE> * BITS_PER_UNIT)-1)
- emit_insn (gen_andsi3 (operands[2], operands[2], operands[3]));
+ if (INTVAL (operands[3]) < (<MODE_SIZE> * BITS_PER_UNIT) - 1)
+ {
+ rtx tem = gen_reg_rtx (SImode);
+ emit_insn (gen_andsi3 (tem, operands[2], operands[3]));
+ operands[2] = tem;
+ }
operands[2] = gen_lowpart (QImode, operands[2]);
(match_operand:QI 2 "register_operand" "c")
(match_operand:QI 3 "const_int_operand"))))
(clobber (reg:CC FLAGS_REG))]
- "INTVAL (operands[3]) <= (<MODE_SIZE> * BITS_PER_UNIT)-1
+ "INTVAL (operands[3]) <= (<MODE_SIZE> * BITS_PER_UNIT) - 1
&& can_create_pseudo_p ()"
"#"
"&& 1"
operands[8] = GEN_INT (<MODE_SIZE> * BITS_PER_UNIT);
- if (INTVAL (operands[3]) < (<MODE_SIZE> * BITS_PER_UNIT)-1)
- emit_insn (gen_andqi3 (operands[2], operands[2], operands[3]));
+ if (INTVAL (operands[3]) < (<MODE_SIZE> * BITS_PER_UNIT) - 1)
+ {
+ rtx tem = gen_reg_rtx (QImode);
+ emit_insn (gen_andqi3 (tem, operands[2], operands[3]));
+ operands[2] = tem;
+ }
if (!rtx_equal_p (operands[6], operands[7]))
emit_move_insn (operands[6], operands[7]);
(match_operand:SI 2 "register_operand" "c")
(match_operand:SI 3 "const_int_operand")) 0)))
(clobber (reg:CC FLAGS_REG))]
- "INTVAL (operands[3]) <= (<MODE_SIZE> * BITS_PER_UNIT)-1
+ "INTVAL (operands[3]) <= (<MODE_SIZE> * BITS_PER_UNIT) - 1
&& can_create_pseudo_p ()"
"#"
"&& 1"
operands[8] = GEN_INT (<MODE_SIZE> * BITS_PER_UNIT);
if (INTVAL (operands[3]) < (<MODE_SIZE> * BITS_PER_UNIT)-1)
- emit_insn (gen_andsi3 (operands[2], operands[2], operands[3]));
+ {
+ rtx tem = gen_reg_rtx (SImode);
+ emit_insn (gen_andsi3 (tem, operands[2], operands[3]));
+ operands[2] = tem;
+ }
operands[2] = gen_lowpart (QImode, operands[2]);
(match_operand:QI 2 "register_operand" "c")
(match_operand:QI 3 "const_int_operand"))))
(clobber (reg:CC FLAGS_REG))]
- "INTVAL (operands[3]) <= (<MODE_SIZE> * BITS_PER_UNIT)-1
+ "INTVAL (operands[3]) <= (<MODE_SIZE> * BITS_PER_UNIT) - 1
&& can_create_pseudo_p ()"
"#"
"&& 1"
operands[8] = GEN_INT (<MODE_SIZE> * BITS_PER_UNIT);
- if (INTVAL (operands[3]) < (<MODE_SIZE> * BITS_PER_UNIT)-1)
- emit_insn (gen_andqi3 (operands[2], operands[2], operands[3]));
+ if (INTVAL (operands[3]) < (<MODE_SIZE> * BITS_PER_UNIT) - 1)
+ {
+ rtx tem = gen_reg_rtx (QImode);
+ emit_insn (gen_andqi3 (tem, operands[2], operands[3]));
+ operands[2] = tem;
+ }
if (!rtx_equal_p (operands[4], operands[5]))
emit_move_insn (operands[4], operands[5]);
--- /dev/null
+/* PR target/85582 */
+
+#ifdef __SIZEOF_INT128__
+typedef __int128 S;
+typedef unsigned __int128 U;
+#else
+typedef long long S;
+typedef unsigned long long U;
+#endif
+
+__attribute__((noipa)) S
+f1 (S x, int y)
+{
+ x = x << (y & 5);
+ x += y;
+ return x;
+}
+
+__attribute__((noipa)) S
+f2 (S x, int y)
+{
+ x = x >> (y & 5);
+ x += y;
+ return x;
+}
+
+__attribute__((noipa)) U
+f3 (U x, int y)
+{
+ x = x >> (y & 5);
+ x += y;
+ return x;
+}
+
+int
+main ()
+{
+ S a = (S) 1 << (sizeof (S) * __CHAR_BIT__ - 7);
+ S b = f1 (a, 12);
+ if (b != ((S) 1 << (sizeof (S) * __CHAR_BIT__ - 3)) + 12)
+ __builtin_abort ();
+ S c = (U) 1 << (sizeof (S) * __CHAR_BIT__ - 1);
+ S d = f2 (c, 12);
+ if ((U) d != ((U) 0x1f << (sizeof (S) * __CHAR_BIT__ - 5)) + 12)
+ __builtin_abort ();
+ U e = (U) 1 << (sizeof (U) * __CHAR_BIT__ - 1);
+ U f = f3 (c, 12);
+ if (f != ((U) 1 << (sizeof (U) * __CHAR_BIT__ - 5)) + 12)
+ __builtin_abort ();
+ return 0;
+}