* config/h8300/h8300.md (*andsi3_ashift_n_lower): New.
authorKazu Hirata <kazu@cs.umass.edu>
Fri, 24 Jan 2003 16:03:14 +0000 (16:03 +0000)
committerKazu Hirata <kazu@gcc.gnu.org>
Fri, 24 Jan 2003 16:03:14 +0000 (16:03 +0000)
From-SVN: r61702

gcc/ChangeLog
gcc/config/h8300/h8300.md

index 422f6d44d99cf79839fdf33c6fc74faaf2674e95..29490661bd21bfce49a113fa700a5641ccf4c6df 100644 (file)
@@ -1,3 +1,7 @@
+2003-01-24  Kazu Hirata  <kazu@cs.umass.edu>
+
+       * config/h8300/h8300.md (*andsi3_ashift_n_lower): New.
+
 2003-01-24  Volker Reichelt  <reichelt@igpm.rwth-aachen.de>
 
        * doc/bugreport.texi: Use @command instead of @code for commands.
index 966bf9545b8f0059adbf7ed2b726691a7dfbc328..ec8a931be6eb4b24868b1a5c066cc1a96bfacc48 100644 (file)
              (clobber (scratch:QI))])]
   "")
 
+;; Transform (SImode << B) & 0xffff into (SImode) (HImode << B).
+
+(define_insn_and_split "*andsi3_ashift_n_lower"
+  [(set (match_operand:SI 0 "register_operand" "=r,r")
+       (and:SI (ashift:SI (match_operand:SI 1 "register_operand" "0,0")
+                          (match_operand:QI 2 "const_int_operand" "S,n"))
+               (match_operand:SI 3 "const_int_operand" "n,n")))
+   (clobber (match_scratch:QI 4 "=X,&r"))]
+  "(TARGET_H8300H || TARGET_H8300S)
+   && INTVAL (operands[2]) <= 15
+   && INTVAL (operands[3]) == ((-1 << INTVAL (operands[2])) & 0xffff)"
+  "#"
+  "&& reload_completed"
+  [(parallel [(set (match_dup 5)
+                  (ashift:HI (match_dup 5)
+                             (match_dup 2)))
+             (clobber (match_dup 4))])
+   (set (match_dup 0)
+       (zero_extend:SI (match_dup 5)))]
+  "operands[5] = gen_rtx_REG (HImode, REGNO (operands[0]));")
+
 ;; Accept (A >> 30) & 2 and the like.
 
 (define_insn "*andsi3_lshiftrt_n_sb"