h8300.md (*andsi3_lshiftrt_9_sb): New.
authorKazu Hirata <kazu@cs.umass.edu>
Tue, 14 Jan 2003 13:11:24 +0000 (13:11 +0000)
committerKazu Hirata <kazu@gcc.gnu.org>
Tue, 14 Jan 2003 13:11:24 +0000 (13:11 +0000)
* config/h8300/h8300.md (*andsi3_lshiftrt_9_sb): New.
(*iorsi3_and_lshiftrt_9_sb): Likewise.

From-SVN: r61280

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

index 86ce412acedf41c53327d7137fe0262e33e3fd80..86a3094d715417f51196f95f36d6fd5c0e0fb788 100644 (file)
@@ -1,3 +1,8 @@
+2003-01-14  Kazu Hirata  <kazu@cs.umass.edu>
+
+       * config/h8300/h8300.md (*andsi3_lshiftrt_9_sb): New.
+       (*iorsi3_and_lshiftrt_9_sb): Likewise.
+
 Tue Jan 14 00:45:33 CET 2003  Jan Hubicka  <jh@suse.cz>
 
        * convert.c (strip_float_extensions):  Look for narrowest type handling
index 5b38e049b93ff223b936dbcf7d37111ff816fd18..0388ff24af9699cf9ee8ec309bb47371c11be040 100644 (file)
   [(set_attr "length" "8")
    (set_attr "cc" "clobber")])
 
+(define_insn_and_split "*andsi3_lshiftrt_9_sb"
+  [(set (match_operand:SI 0 "register_operand" "=r")
+       (and:SI (lshiftrt:SI (match_operand:SI 1 "register_operand" "0")
+                            (const_int 9))
+               (const_int 4194304)))]
+  "(TARGET_H8300H || TARGET_H8300S)"
+  "#"
+  "&& reload_completed"
+  [(set (match_dup 0)
+       (and:SI (lshiftrt:SI (match_dup 0)
+                            (const_int 25))
+               (const_int 64)))
+   (parallel [(set (match_dup 0)
+                  (ashift:SI (match_dup 0)
+                             (const_int 16)))
+             (clobber (scratch:QI))])]
+  "")
+
 ;; plus:SI
 
 (define_insn "*addsi3_upper"
   [(set_attr "length" "8")
    (set_attr "cc" "clobber")])
 
+(define_insn "*iorsi3_and_lshiftrt_9_sb"
+  [(set (match_operand:SI 0 "register_operand" "=r")
+       (ior:SI (and:SI (lshiftrt:SI (match_operand:SI 1 "register_operand" "r")
+                                    (const_int 9))
+                       (const_int 4194304))
+               (match_operand:SI 2 "register_operand" "0")))
+   (clobber (match_scratch:HI 3 "=&r"))]
+  "(TARGET_H8300H || TARGET_H8300S)"
+  "*
+{
+  if (find_regno_note (insn, REG_DEAD, REGNO (operands[1])))
+    return \"shll.l\\t%S1\;xor.w\\t%T3,%T3\;bst\\t#6,%s3\;or.w\\t%T3,%e0\";
+  else
+    return \"rotl.l\\t%S1\;rotr.l\\t%S1\;xor.w\\t%T3,%T3\;bst\\t#6,%s3\;or.w\\t%T3,%e0\";
+}"
+  [(set_attr "length" "10")
+   (set_attr "cc" "clobber")])
+
 ;; Used to OR the exponent of a float.
 
 (define_insn "*iorsi3_shift"