From: Richard Henderson Date: Mon, 8 Oct 2001 22:38:45 +0000 (-0700) Subject: i386.md (movsi_xor): Export. X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=646ded90c6b3d96cd172dcbf18cce70d76d9d172;p=gcc.git i386.md (movsi_xor): Export. * i386.md (movsi_xor): Export. (setcc peep2): Use it when available; add an alternative to match zero_extendhisi2_and. From-SVN: r46107 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index e8f087cf292..bc49dc67e14 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2001-10-08 Richard Henderson + + * i386.md (movsi_xor): Export. + (setcc peep2): Use it when available; add an alternative to + match zero_extendhisi2_and. + 2001-10-08 Kaveh R. Ghazi * romp-protos.h (romp_initialize_trampoline): New function. diff --git a/gcc/config/i386/i386.md b/gcc/config/i386/i386.md index fa18782102f..63fefc88bee 100644 --- a/gcc/config/i386/i386.md +++ b/gcc/config/i386/i386.md @@ -1711,7 +1711,7 @@ [(set_attr "type" "pop") (set_attr "mode" "SI")]) -(define_insn "*movsi_xor" +(define_insn "movsi_xor" [(set (match_operand:SI 0 "register_operand" "=r") (match_operand:SI 1 "const0_operand" "i")) (clobber (reg:CC 17))] @@ -13126,14 +13126,45 @@ [(reg 17) (const_int 0)])) (set (match_operand 3 "q_regs_operand" "") (zero_extend (match_dup 1)))] - "peep2_reg_dead_p (3, operands[1]) + "(peep2_reg_dead_p (3, operands[1]) + || operands_match_p (operands[1], operands[3])) && ! reg_overlap_mentioned_p (operands[3], operands[0])" - [(set (match_dup 3) (const_int 0)) - (set (match_dup 4) (match_dup 0)) + [(set (match_dup 4) (match_dup 0)) + (set (strict_low_part (match_dup 5)) + (match_dup 2))] +{ + operands[4] = gen_rtx_REG (GET_MODE (operands[0]), 17); + operands[5] = gen_rtx_REG (QImode, REGNO (operands[3])); + if (HAVE_movsi_xor) + emit_insn (gen_movsi_xor (operands[3], const0_rtx)); + else + emit_insn (gen_movsi (operands[3], const0_rtx)); +}) + +;; Similar, but match zero_extendhisi2_and, which adds a clobber. + +(define_peephole2 + [(set (reg 17) (match_operand 0 "" "")) + (set (match_operand:QI 1 "register_operand" "") + (match_operator:QI 2 "ix86_comparison_operator" + [(reg 17) (const_int 0)])) + (parallel [(set (match_operand 3 "q_regs_operand" "") + (zero_extend (match_dup 1))) + (clobber (reg:CC 17))])] + "(peep2_reg_dead_p (3, operands[1]) + || operands_match_p (operands[1], operands[3])) + && ! reg_overlap_mentioned_p (operands[3], operands[0])" + [(set (match_dup 4) (match_dup 0)) (set (strict_low_part (match_dup 5)) (match_dup 2))] - "operands[4] = gen_rtx_REG (GET_MODE (operands[0]), 17); - operands[5] = gen_rtx_REG (QImode, REGNO (operands[3]));") +{ + operands[4] = gen_rtx_REG (GET_MODE (operands[0]), 17); + operands[5] = gen_rtx_REG (QImode, REGNO (operands[3])); + if (HAVE_movsi_xor) + emit_insn (gen_movsi_xor (operands[3], const0_rtx)); + else + emit_insn (gen_movsi (operands[3], const0_rtx)); +}) ;; Call instructions.