* alpha.md (insxh-1): New insxl pattern for combine.
authorRichard Henderson <rth@cygnus.com>
Fri, 5 Jun 1998 03:10:46 +0000 (20:10 -0700)
committerRichard Henderson <rth@gcc.gnu.org>
Fri, 5 Jun 1998 03:10:46 +0000 (20:10 -0700)
From-SVN: r20239

gcc/ChangeLog
gcc/config/alpha/alpha.md

index 4a9e3a27d147447ff4fe219f339e234d09e5f794..4cc35197b73e4db93a09e9bd83bf7b3bd52f8cec 100644 (file)
@@ -1,3 +1,7 @@
+Fri Jun  5 03:05:34 1998  Richard Henderson  <rth@cygnus.com>
+
+       * alpha.md (insxh-1): New insxl pattern for combine.
+
 Fri Jun  5 01:12:15 1998  H.J. Lu  (hjl@gnu.org)
 
        * i386/i386.c (output_fp_conditional_move): New function
index 57e2c445050b19132ee8b6020e5fc2fe270d87f2..6c001e304addc425ea7e4607f382d508753eb68a 100644 (file)
   "insql %1,%2,%0"
   [(set_attr "type" "shift")])
 
+;; Combine has this sometimes habit of moving the and outside of the
+;; shift, making life more interesting.
+
+(define_insn ""
+  [(set (match_operand:DI 0 "register_operand" "=r")
+       (and:DI (ashift:DI (match_operand:DI 1 "register_operand" "r")
+                          (match_operand:DI 2 "mul8_operand" "I"))
+               (match_operand:DI 3 "immediate_operand" "i")))]
+  "HOST_BITS_PER_WIDE_INT == 64
+   && GET_CODE (operands[3]) == CONST_INT
+   && (((unsigned HOST_WIDE_INT) 0xff << INTVAL (operands[2])
+        == INTVAL (operands[3]))
+       || ((unsigned HOST_WIDE_INT) 0xffff << INTVAL (operands[2])
+        == INTVAL (operands[3]))
+       || ((unsigned HOST_WIDE_INT) 0xffffffff << INTVAL (operands[2])
+        == INTVAL (operands[3])))"
+  "*
+{
+#if HOST_BITS_PER_WIDE_INT == 64
+  if ((unsigned HOST_WIDE_INT) 0xff << INTVAL (operands[2])
+      == INTVAL (operands[3]))
+    return \"insbl %1,%s2,%0\";
+  if ((unsigned HOST_WIDE_INT) 0xffff << INTVAL (operands[2])
+      == INTVAL (operands[3]))
+    return \"inswl %1,%s2,%0\";
+  if ((unsigned HOST_WIDE_INT) 0xffffffff << INTVAL (operands[2])
+      == INTVAL (operands[3]))
+    return \"insll %1,%s2,%0\";
+#endif
+  abort();
+}"
+  [(set_attr "type" "shift")])
+
 ;; We do not include the insXh insns because they are complex to express
 ;; and it does not appear that we would ever want to generate them.
 ;;