OSDN Git Service

* i386.md: Add two peepholes to clean up code generated by
authorzack <zack@138bc75d-0d04-0410-961f-82ee72b054a4>
Thu, 17 May 2001 00:53:25 +0000 (00:53 +0000)
committerzack <zack@138bc75d-0d04-0410-961f-82ee72b054a4>
Thu, 17 May 2001 00:53:25 +0000 (00:53 +0000)
cmpstr* expanders.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@42183 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/config/i386/i386.md

index 0d93005..9dd9297 100644 (file)
@@ -1,3 +1,8 @@
+2001-05-16  Zack Weinberg  <zackw@stanford.edu>
+
+       * i386.md: Add two peepholes to clean up code generated by
+       cmpstr* expanders.
+
 2001-05-16  Richard Henderson  <rth@redhat.com>
 
        * dwarf2asm.c (eh_data_format_name): Add names for "pointer size" 
index b85e585..a5bad66 100644 (file)
   [(set_attr "type" "str")
    (set_attr "mode" "QI")
    (set_attr "prefix_rep" "1")])
+
+;; Peephole optimizations to clean up after cmpstr*.  This should be
+;; handled in combine, but it is not currently up to the task.
+;; When used for their truth value, the cmpstr* expanders generate
+;; code like this:
+;;
+;;   repz cmpsb
+;;   seta      %al
+;;   setb      %dl
+;;   cmpb      %al, %dl
+;;   jcc       label
+;;
+;; The intermediate three instructions are unnecessary.
+
+;; This one handles cmpstr*_nz_1...
+(define_peephole2
+  [(parallel[
+     (set (reg:CC 17)
+         (compare:CC (mem:BLK (match_operand 4 "register_operand" ""))
+                     (mem:BLK (match_operand 5 "register_operand" ""))))
+     (use (match_operand 6 "register_operand" ""))
+     (use (match_operand:SI 3 "immediate_operand" ""))
+     (use (reg:SI 19))
+     (clobber (match_operand 0 "register_operand" ""))
+     (clobber (match_operand 1 "register_operand" ""))
+     (clobber (match_operand 2 "register_operand" ""))])
+   (set (match_operand:QI 7 "register_operand" "")
+       (gtu:QI (reg:CC 17) (const_int 0)))
+   (set (match_operand:QI 8 "register_operand" "")
+       (ltu:QI (reg:CC 17) (const_int 0)))
+   (set (reg 17)
+       (compare (match_dup 7) (match_dup 8)))
+  ]
+  ""
+  [(parallel[
+     (set (reg:CC 17)
+         (compare:CC (mem:BLK (match_dup 4))
+                     (mem:BLK (match_dup 5))))
+     (use (match_dup 6))
+     (use (match_dup 3))
+     (use (reg:SI 19))
+     (clobber (match_dup 0))
+     (clobber (match_dup 1))
+     (clobber (match_dup 2))])]
+  "")
+
+;; ...and this one handles cmpstr*_1.
+(define_peephole2
+  [(parallel[
+     (set (reg:CC 17)
+         (if_then_else:CC (ne (match_operand 6 "register_operand" "")
+                              (const_int 0))
+           (compare:CC (mem:BLK (match_operand 4 "register_operand" ""))
+                       (mem:BLK (match_operand 5 "register_operand" "")))
+           (const_int 0)))
+     (use (match_operand:SI 3 "immediate_operand" ""))
+     (use (reg:CC 17))
+     (use (reg:SI 19))
+     (clobber (match_operand 0 "register_operand" ""))
+     (clobber (match_operand 1 "register_operand" ""))
+     (clobber (match_operand 2 "register_operand" ""))])
+   (set (match_operand:QI 7 "register_operand" "")
+       (gtu:QI (reg:CC 17) (const_int 0)))
+   (set (match_operand:QI 8 "register_operand" "")
+       (ltu:QI (reg:CC 17) (const_int 0)))
+   (set (reg 17)
+       (compare (match_dup 7) (match_dup 8)))
+  ]
+  ""
+  [(parallel[
+     (set (reg:CC 17)
+         (if_then_else:CC (ne (match_dup 6)
+                              (const_int 0))
+           (compare:CC (mem:BLK (match_dup 4))
+                       (mem:BLK (match_dup 5)))
+           (const_int 0)))
+     (use (match_dup 3))
+     (use (reg:CC 17))
+     (use (reg:SI 19))
+     (clobber (match_dup 0))
+     (clobber (match_dup 1))
+     (clobber (match_dup 2))])]
+  "")
+
+
 \f
 ;; Conditional move instructions.