(match_operand 2 "int248_register_operand" "c,r")) 0)))
(clobber (reg:CC FLAGS_REG))]
"ix86_binary_operator_ok (<CODE>, <MODE>mode, operands)
- && (INTVAL (operands[3]) & (<MODE_SIZE> * BITS_PER_UNIT - 1)) == 0
+ && ((INTVAL (operands[3]) & (<MODE_SIZE> * BITS_PER_UNIT - 1)) == 0
+ || (INTVAL (operands[3]) & (<MODE_SIZE> * BITS_PER_UNIT - 1))
+ == <MODE_SIZE> * BITS_PER_UNIT - 1)
&& ix86_pre_reload_split ()"
"#"
"&& 1"
[(parallel
- [(set (match_dup 4)
- (neg:QI (match_dup 2)))
- (clobber (reg:CC FLAGS_REG))])
- (parallel
[(set (match_dup 0)
(any_shift:SWI48 (match_dup 1)
(match_dup 4)))
(clobber (reg:CC FLAGS_REG))])]
{
+ HOST_WIDE_INT cnt = INTVAL (operands[3]) & (<MODE_SIZE> * BITS_PER_UNIT - 1);
+
operands[2] = force_reg (GET_MODE (operands[2]), operands[2]);
operands[2] = gen_lowpart (QImode, operands[2]);
operands[4] = gen_reg_rtx (QImode);
+
+ rtx (*insn)(rtx, rtx) = (cnt == 0) ? gen_negqi2 : gen_one_cmplqi2;
+ emit_insn (insn (operands[4], operands[2]));
}
[(set_attr "isa" "*,bmi2")])
(match_operand:QI 2 "register_operand" "c,r"))))
(clobber (reg:CC FLAGS_REG))]
"ix86_binary_operator_ok (<CODE>, <MODE>mode, operands)
- && (INTVAL (operands[3]) & (<MODE_SIZE> * BITS_PER_UNIT - 1)) == 0
+ && ((INTVAL (operands[3]) & (<MODE_SIZE> * BITS_PER_UNIT - 1)) == 0
+ || (INTVAL (operands[3]) & (<MODE_SIZE> * BITS_PER_UNIT - 1))
+ == <MODE_SIZE> * BITS_PER_UNIT - 1)
&& ix86_pre_reload_split ()"
"#"
"&& 1"
[(parallel
- [(set (match_dup 4)
- (neg:QI (match_dup 2)))
- (clobber (reg:CC FLAGS_REG))])
- (parallel
[(set (match_dup 0)
(any_shift:SWI48 (match_dup 1)
(match_dup 4)))
(clobber (reg:CC FLAGS_REG))])]
- "operands[4] = gen_reg_rtx (QImode);"
+{
+ HOST_WIDE_INT cnt = INTVAL (operands[3]) & (<MODE_SIZE> * BITS_PER_UNIT - 1);
+
+ operands[4] = gen_reg_rtx (QImode);
+
+ rtx (*insn)(rtx, rtx) = (cnt == 0) ? gen_negqi2 : gen_one_cmplqi2;
+ emit_insn (insn (operands[4], operands[2]));
+}
[(set_attr "isa" "*,bmi2")])
(define_insn_and_split "*extend<dwi>2_doubleword_highpart"