* arm.md: New split to transform ((X << y) - 1) into ~(~(X-1) << y)
authorrearnsha <rearnsha@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 8 Dec 2003 11:05:59 +0000 (11:05 +0000)
committerrearnsha <rearnsha@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 8 Dec 2003 11:05:59 +0000 (11:05 +0000)
for constant X.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@74417 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/config/arm/arm.md

index 48f0406..a6c33ac 100644 (file)
@@ -1,3 +1,8 @@
+2003-12-08  Richard Earnshaw  <rearnsha@arm.com>
+
+       * arm.md: New split to transform ((X << y) - 1) into ~(~(X-1) << y)
+       for constant X.
+
 2003-12-08  Richard Sandiford  <rsandifo@redhat.com>
 
        * calls.c (expand_call): Don't try using tail or recursive calls
index 3c4dffc..d5d4258 100644 (file)
    (set_attr "length" "4,8")]
 )
 
+; transform ((x << y) - 1) to ~(~(x-1) << y)  Where X is a constant.
+(define_split
+  [(set (match_operand:SI 0 "s_register_operand" "")
+       (plus:SI (ashift:SI (match_operand:SI 1 "const_int_operand" "")
+                           (match_operand:SI 2 "s_register_operand" ""))
+                (const_int -1)))
+   (clobber (match_operand:SI 3 "s_register_operand" ""))]
+  "TARGET_ARM"
+  [(set (match_dup 3) (match_dup 1))
+   (set (match_dup 0) (not:SI (ashift:SI (match_dup 3) (match_dup 2))))]
+  "
+  operands[1] = GEN_INT (~(INTVAL (operands[1]) - 1));
+")
+
 (define_expand "addsf3"
   [(set (match_operand:SF          0 "s_register_operand" "")
        (plus:SF (match_operand:SF 1 "s_register_operand" "")