Index: gcc-4.3.6/gcc/config/arm/predicates.md
===================================================================
--- gcc-4.3.6.orig/gcc/config/arm/predicates.md	2013-07-06 12:32:43.000000000 +0000
+++ gcc-4.3.6/gcc/config/arm/predicates.md	2013-07-06 12:33:25.000000000 +0000
@@ -477,11 +477,15 @@
 ; 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
