re PR target/49313 (Inefficient libgcc implementations for avr)
authorGeorg-Johann Lay <avr@gjlay.de>
Fri, 28 Oct 2011 17:47:56 +0000 (17:47 +0000)
committerGeorg-Johann Lay <gjl@gcc.gnu.org>
Fri, 28 Oct 2011 17:47:56 +0000 (17:47 +0000)
PR target/49313
* config/avr/avr.md (parityhi2): Expand allowing pseudos.
(*parityhi2): New pre-reload insn-and-split to map 16-bit parity
to the libgcc insn.
(*parityqihi2): Same for 8-bit parity.

From-SVN: r180620

gcc/ChangeLog
gcc/config/avr/avr.md

index ae569a889b5d65043b3c7c5aec2705dfcf44d9c1..33651a263cfed88cd08279182f66c2b492303915 100644 (file)
@@ -1,3 +1,11 @@
+2011-10-28  Georg-Johann Lay  <avr@gjlay.de>
+
+       PR target/49313
+       * config/avr/avr.md (parityhi2): Expand allowing pseudos.
+       (*parityhi2): New pre-reload insn-and-split to map 16-bit parity
+       to the libgcc insn.
+       (*parityqihi2): Same for 8-bit parity.
+
 2011-10-28  Julian Brown  <julian@codesourcery.com>
 
        PR rtl-optimization/47918
index 35d4bdc1717212c52ba1c1f2815a2f10e1b06c78..064db2cc00046194b61f1c63ba1d3addac72ebcb 100644 (file)
 
 ;; Parity
 
+;; Postpone expansion of 16-bit parity to libgcc call until after combine for
+;; better 8-bit parity recognition.
+
 (define_expand "parityhi2"
+  [(parallel [(set (match_operand:HI 0 "register_operand" "")
+                   (parity:HI (match_operand:HI 1 "register_operand" "")))
+              (clobber (reg:HI 24))])])
+
+(define_insn_and_split "*parityhi2"
+  [(set (match_operand:HI 0 "register_operand"           "=r")
+        (parity:HI (match_operand:HI 1 "register_operand" "r")))
+   (clobber (reg:HI 24))]
+  "!reload_completed"
+  { gcc_unreachable(); }
+  "&& 1"
   [(set (reg:HI 24)
-        (match_operand:HI 1 "register_operand" ""))
+        (match_dup 1))
    (set (reg:HI 24)
         (parity:HI (reg:HI 24)))
-   (set (match_operand:HI 0 "register_operand" "")
-        (reg:HI 24))]
-  ""
-  "")
+   (set (match_dup 0)
+        (reg:HI 24))])
+
+(define_insn_and_split "*parityqihi2"
+  [(set (match_operand:HI 0 "register_operand"           "=r")
+        (parity:HI (match_operand:QI 1 "register_operand" "r")))
+   (clobber (reg:HI 24))]
+  "!reload_completed"
+  { gcc_unreachable(); }
+  "&& 1"
+  [(set (reg:QI 24)
+        (match_dup 1))
+   (set (reg:HI 24)
+        (zero_extend:HI (parity:QI (reg:QI 24))))
+   (set (match_dup 0)
+        (reg:HI 24))])
 
 (define_expand "paritysi2"
   [(set (reg:SI 22)