re PR target/55181 (Expensive shift loop where a bit-testing instruction could be...
authorGeorg-Johann Lay <avr@gjlay.de>
Thu, 4 Aug 2016 07:50:53 +0000 (07:50 +0000)
committerGeorg-Johann Lay <gjl@gcc.gnu.org>
Thu, 4 Aug 2016 07:50:53 +0000 (07:50 +0000)
PR 55181
* config/avr/avr.md: New pattern to work around do_store_flag
generating shift instructions for bit extractions.

From-SVN: r239116

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

index 8261b41e3f3eca39bf15f07bb5c8519fd5ab26fc..0e5eea4e7ca4bf980b8b60cb003d0e81975f8c7f 100644 (file)
@@ -1,3 +1,9 @@
+2016-08-04  Georg-Johann Lay  <avr@gjlay.de>
+
+       PR 55181
+       * config/avr/avr.md: New pattern to work around do_store_flag
+       generating shift instructions for bit extractions.
+
 2016-08-04  Kugan Vivekanandarajah  <kuganv@linaro.org>
 
        * tree-vrp.c (set_value_range): Use vrp_equiv_obstack with
index 23790b6ac7faad5340b250d920a15fd98f17945b..97f35616d1f0ce82a357770841e3ac793ff38cd2 100644 (file)
     operands[4] = simplify_gen_subreg (QImode, operands[0], HImode, 1);
   })
 
+;; ??? do_store_flag emits a hard-coded right shift to extract a bit without
+;; even considering rtx_costs, extzv, or a bit-test.  See PR 55181 for an example.
+(define_insn_and_split "*extract.subreg.bit"
+  [(set (match_operand:QI 0 "register_operand"                                       "=r")
+        (and:QI (subreg:QI (any_shiftrt:HISI (match_operand:HISI 1 "register_operand" "r")
+                                             (match_operand:QI 2 "const_int_operand"  "n"))
+                           0)
+                (const_int 1)))]
+  "INTVAL (operands[2]) < GET_MODE_BITSIZE (<MODE>mode)"
+  { gcc_unreachable(); }
+  "&& reload_completed"
+  [;; "*extzv"
+   (set (match_dup 0)
+        (zero_extract:QI (match_dup 3)
+                         (const_int 1)
+                         (match_dup 4)))]
+  {
+    int bitno = INTVAL (operands[2]);
+    operands[3] = simplify_gen_subreg (QImode, operands[1], <MODE>mode, bitno / 8);
+    operands[4] = GEN_INT (bitno % 8);
+  })
+
+                                        
 \f
 ;; Fixed-point instructions
 (include "avr-fixed.md")