2020-01-03 Jakub Jelinek <jakub@redhat.com>
+ PR target/93110
+ * config/i386/i386.md (abs<mode>2): Use expand_simple_binop instead of
+ emitting ASHIFTRT, XOR and MINUS by hand. Use gen_int_mode with QImode
+ instead of gen_int_shift_amount + convert_modes.
+
PR rtl-optimization/93088
* loop-iv.c (find_single_def_src): Punt after looking through
128 reg copies for regs with single definitions. Move definitions
/* Generate rtx abs using abs (x) = (((signed) x >> (W-1)) ^ x) -
((signed) x >> (W-1)) */
- rtx shift_amount = gen_int_shift_amount (mode,
- GET_MODE_PRECISION (mode)
- - 1);
- shift_amount = convert_modes (E_QImode, GET_MODE (shift_amount),
- shift_amount, 1);
- rtx shift_dst = gen_reg_rtx (mode);
- rtx shift_op = gen_rtx_SET (shift_dst,
- gen_rtx_fmt_ee (ASHIFTRT, mode,
- operands[1], shift_amount));
- rtx clobber = gen_rtx_CLOBBER (VOIDmode, gen_rtx_REG (CCmode,
- FLAGS_REG));
- emit_insn (gen_rtx_PARALLEL (VOIDmode, gen_rtvec (2, shift_op,
- clobber)));
-
- rtx xor_op = gen_rtx_SET (operands[0],
- gen_rtx_fmt_ee (XOR, mode, shift_dst,
- operands[1]));
- emit_insn (gen_rtx_PARALLEL (VOIDmode, gen_rtvec (2, xor_op, clobber)));
-
- rtx minus_op = gen_rtx_SET (operands[0],
- gen_rtx_fmt_ee (MINUS, mode,
- operands[0], shift_dst));
- emit_insn (gen_rtx_PARALLEL (VOIDmode, gen_rtvec (2, minus_op,
- clobber)));
+ rtx shift_amount = gen_int_mode (GET_MODE_PRECISION (mode) - 1, QImode);
+ rtx shift_dst = expand_simple_binop (mode, ASHIFTRT, operands[1],
+ shift_amount, NULL_RTX,
+ 0, OPTAB_DIRECT);
+ rtx xor_dst = expand_simple_binop (mode, XOR, shift_dst, operands[1],
+ operands[0], 0, OPTAB_DIRECT);
+ rtx minus_dst = expand_simple_binop (mode, MINUS, xor_dst, shift_dst,
+ operands[0], 0, OPTAB_DIRECT);
+ if (!rtx_equal_p (minus_dst, operands[0]))
+ emit_move_insn (operands[0], minus_dst);
DONE;
})