re PR target/33049 ([avr] bit extraction non optimal, inversing logic solves problem)
authorGeorg-Johann Lay <avr@gjlay.de>
Tue, 21 Jun 2011 17:30:54 +0000 (17:30 +0000)
committerGeorg-Johann Lay <gjl@gcc.gnu.org>
Tue, 21 Jun 2011 17:30:54 +0000 (17:30 +0000)
PR target/33049
* config/avr/avr.md (extzv): New expander.
(*extzv): New insn.
(*extzv.qihi1, *extzv.qihi2): New insn-and-split.
* config/avr/constraints.md (C04): New constraint.
* doc/md.texi (Machine Constraints): Document it.

From-SVN: r175269

gcc/ChangeLog
gcc/config/avr/avr.md
gcc/config/avr/constraints.md
gcc/doc/md.texi

index db3b00b0cf42ad9df37a9951d6320642fc0ff53a..3e0d8acf44c8603735c32b68c4519fd72f7ef2d9 100644 (file)
@@ -1,3 +1,12 @@
+2011-06-21  Georg-Johann Lay  <avr@gjlay.de>
+       
+       PR target/33049
+       * config/avr/avr.md (extzv): New expander.
+       (*extzv): New insn.
+       (*extzv.qihi1, *extzv.qihi2): New insn-and-split.
+       * config/avr/constraints.md (C04): New constraint.
+       * doc/md.texi (Machine Constraints): Document it.
+
 2011-06-21  Jakub Jelinek  <jakub@redhat.com>
 
        PR middle-end/49489
index 4d77b0e7d071bddb23858764a8cf4762e5435d29..0e5031ccf06a528b202c463fac44795cbc988fe5 100644 (file)
     int byteno = INTVAL(operands[2]) / BITS_PER_UNIT;
     operands[4] = simplify_gen_subreg (QImode, operands[0], <MODE>mode, byteno);
   })
+
+(define_expand "extzv"
+  [(set (match_operand:QI 0 "register_operand" "")
+        (zero_extract:QI (match_operand:QI 1 "register_operand"  "")
+                         (match_operand:QI 2 "const1_operand" "")
+                         (match_operand:QI 3 "const_0_to_7_operand" "")))]
+  ""
+  "")
+
+(define_insn "*extzv"
+  [(set (match_operand:QI 0 "register_operand"                   "=*d,*d,*d,*d,r")
+        (zero_extract:QI (match_operand:QI 1 "register_operand"     "0,r,0,0,r")
+                         (const_int 1)
+                         (match_operand:QI 2 "const_0_to_7_operand" "L,L,P,C04,n")))]
+  ""
+  "@
+       andi %0,1
+       mov %0,%1\;andi %0,1
+       lsr %0\;andi %0,1
+        swap %0\;andi %0,1
+       bst %1,%2\;clr %0\;bld %0,0"
+  [(set_attr "length" "1,2,2,2,3")
+   (set_attr "cc" "set_zn,set_zn,set_zn,set_zn,clobber")])
+
+(define_insn_and_split "*extzv.qihi1"
+  [(set (match_operand:HI 0 "register_operand"                     "=r")
+        (zero_extract:HI (match_operand:QI 1 "register_operand"     "r")
+                         (const_int 1)
+                         (match_operand:QI 2 "const_0_to_7_operand" "n")))]
+  ""
+  "#"
+  ""
+  [(set (match_dup 3)
+        (zero_extract:QI (match_dup 1)
+                         (const_int 1)
+                         (match_dup 2)))
+   (set (match_dup 4)
+        (const_int 0))]
+  {
+    operands[3] = simplify_gen_subreg (QImode, operands[0], HImode, 0);
+    operands[4] = simplify_gen_subreg (QImode, operands[0], HImode, 1);
+  })
+
+(define_insn_and_split "*extzv.qihi2"
+  [(set (match_operand:HI 0 "register_operand"                      "=r")
+        (zero_extend:HI 
+         (zero_extract:QI (match_operand:QI 1 "register_operand"     "r")
+                          (const_int 1)
+                          (match_operand:QI 2 "const_0_to_7_operand" "n"))))]
+  ""
+  "#"
+  ""
+  [(set (match_dup 3)
+        (zero_extract:QI (match_dup 1)
+                         (const_int 1)
+                         (match_dup 2)))
+   (set (match_dup 4)
+        (const_int 0))]
+  {
+    operands[3] = simplify_gen_subreg (QImode, operands[0], HImode, 0);
+    operands[4] = simplify_gen_subreg (QImode, operands[0], HImode, 1);
+  })
index 2ac8833bd511f8fe0e858d47925880546c812d41..e754c79070bc64f355300a67b2a87834c59a7cdf 100644 (file)
   "A memory address based on Y or Z pointer with displacement."
   (and (match_code "mem")
        (match_test "extra_constraint_Q (op)")))
+
+(define_constraint "C04"
+  "Constant integer 4."
+  (and (match_code "const_int")
+       (match_test "ival == 4")))
index 65e4070d91da83184c1f4d8579c4faf57fb62137..abe51f80727b9792f9fc89f59badd329798c8c55 100644 (file)
@@ -1773,6 +1773,9 @@ Integer constant in the range @minus{}6 @dots{} 5.
 
 @item Q
 A memory address based on Y or Z pointer with displacement.
+
+@item C04
+Constant integer 4
 @end table
 
 @item Hewlett-Packard PA-RISC---@file{config/pa/pa.h}