summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorrth <rth@138bc75d-0d04-0410-961f-82ee72b054a4>2001-10-08 22:38:45 +0000
committerrth <rth@138bc75d-0d04-0410-961f-82ee72b054a4>2001-10-08 22:38:45 +0000
commitebed3b99a35afe8bd311b4be73d0103d67c5a97f (patch)
treebdab30ca4adce12216ae9924a740d74b2e862df7
parentedb39f41641611afd98137f3c20d9920fe554701 (diff)
downloadgcc-ebed3b99a35afe8bd311b4be73d0103d67c5a97f.tar.gz
* i386.md (movsi_xor): Export.
(setcc peep2): Use it when available; add an alternative to match zero_extendhisi2_and. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@46107 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/config/i386/i386.md43
2 files changed, 43 insertions, 6 deletions
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 <rth@redhat.com>
+
+ * 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 <ghazi@caip.rutgers.edu>
* 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.