Index: gcc-4.4.7/gcc/config/arm/predicates.md
===================================================================
--- gcc-4.4.7.orig/gcc/config/arm/predicates.md	2013-06-29 15:58:45.000000000 +0200
+++ gcc-4.4.7/gcc/config/arm/predicates.md	2013-07-04 14:51:58.000000000 +0200
@@ -481,11 +481,13 @@
 ; Crunch shifts only work up to 31 places left or 32 right
 (define_predicate "const_cirrus_shift_operand"
   (and (match_code "const_int")
-       (match_test "((unsigned HOST_WIDE_INT) INTVAL (op)) <= 31")))
+       (and (match_test "((unsigned HOST_WIDE_INT) INTVAL (op)) <= 31")
+            (match_test "((unsigned HOST_WIDE_INT) INTVAL (op)) >= -32"))))
 
 (define_predicate "const_cirrus_shiftrt_operand"
   (and (match_code "const_int")
-       (match_test "((unsigned HOST_WIDE_INT) INTVAL (op)) <= 32")))
+       (and (match_test "((unsigned HOST_WIDE_INT) INTVAL (op)) <= 32")
+            (match_test "((unsigned HOST_WIDE_INT) INTVAL (op)) >= -31"))))
 
 
 ;; Neon predicates
