aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBernd Schmidt <bernds@codesourcery.com>2010-07-20 20:50:44 +0000
committerBernd Schmidt <bernds@gcc.gnu.org>2010-07-20 20:50:44 +0000
commit16737e76d6ef9912996b93aa52ec9fb7c1efd2c3 (patch)
tree386e52a837304488ee214aee111e2f072a757c71
parent0603fe683c89ccf3c1663817c44f0d320a57ba5e (diff)
downloadgcc-16737e76d6ef9912996b93aa52ec9fb7c1efd2c3.zip
gcc-16737e76d6ef9912996b93aa52ec9fb7c1efd2c3.tar.gz
gcc-16737e76d6ef9912996b93aa52ec9fb7c1efd2c3.tar.bz2
arm.md (thumb1_addsi3): Add alternative and split for computing the sum of the stack pointer and a...
* config/arm/arm.md (thumb1_addsi3): Add alternative and split for computing the sum of the stack pointer and a large constant. * config/arm/constraints.md (M): Remove superfluous parentheses. (Pc): New constraint. From-SVN: r162355
-rw-r--r--gcc/ChangeLog7
-rw-r--r--gcc/config/arm/arm.md29
-rw-r--r--gcc/config/arm/constraints.md10
3 files changed, 33 insertions, 13 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 95914c7..b2beeea 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,10 @@
+2010-07-20 Bernd Schmidt <bernds@codesourcery.com>
+
+ * config/arm/arm.md (thumb1_addsi3): Add alternative and split for
+ computing the sum of the stack pointer and a large constant.
+ * config/arm/constraints.md (M): Remove superfluous parentheses.
+ (Pc): New constraint.
+
2010-07-20 Jakub Jelinek <jakub@redhat.com>
PR debug/45006
diff --git a/gcc/config/arm/arm.md b/gcc/config/arm/arm.md
index e597eb3a..bbe65ec 100644
--- a/gcc/config/arm/arm.md
+++ b/gcc/config/arm/arm.md
@@ -638,9 +638,9 @@
)
(define_insn_and_split "*thumb1_addsi3"
- [(set (match_operand:SI 0 "register_operand" "=l,l,l,*rk,*hk,l,k,l,l")
- (plus:SI (match_operand:SI 1 "register_operand" "%0,0,l,*0,*0,k,k,0,l")
- (match_operand:SI 2 "nonmemory_operand" "I,J,lL,*hk,*rk,M,O,Pa,Pb")))]
+ [(set (match_operand:SI 0 "register_operand" "=l,l,l,*rk,*hk,l,k,l,l,l")
+ (plus:SI (match_operand:SI 1 "register_operand" "%0,0,l,*0,*0,k,k,0,l,k")
+ (match_operand:SI 2 "nonmemory_operand" "I,J,lL,*hk,*rk,M,O,Pa,Pb,Pc")))]
"TARGET_THUMB1"
"*
static const char * const asms[] =
@@ -653,6 +653,7 @@
\"add\\t%0, %1, %2\",
\"add\\t%0, %1, %2\",
\"#\",
+ \"#\",
\"#\"
};
if ((which_alternative == 2 || which_alternative == 6)
@@ -662,21 +663,27 @@
return asms[which_alternative];
"
"&& reload_completed && CONST_INT_P (operands[2])
- && operands[1] != stack_pointer_rtx
- && (INTVAL (operands[2]) > 255 || INTVAL (operands[2]) < -255)"
+ && ((operands[1] != stack_pointer_rtx
+ && (INTVAL (operands[2]) > 255 || INTVAL (operands[2]) < -255))
+ || (operands[1] == stack_pointer_rtx
+ && INTVAL (operands[2]) > 1020))"
[(set (match_dup 0) (plus:SI (match_dup 1) (match_dup 2)))
(set (match_dup 0) (plus:SI (match_dup 0) (match_dup 3)))]
{
HOST_WIDE_INT offset = INTVAL (operands[2]);
- if (offset > 255)
- offset = 255;
- else if (offset < -255)
- offset = -255;
-
+ if (operands[1] == stack_pointer_rtx)
+ offset -= 1020;
+ else
+ {
+ if (offset > 255)
+ offset = 255;
+ else if (offset < -255)
+ offset = -255;
+ }
operands[3] = GEN_INT (offset);
operands[2] = GEN_INT (INTVAL (operands[2]) - offset);
}
- [(set_attr "length" "2,2,2,2,2,2,2,4,4")]
+ [(set_attr "length" "2,2,2,2,2,2,2,4,4,4")]
)
;; Reloading and elimination of the frame pointer can
diff --git a/gcc/config/arm/constraints.md b/gcc/config/arm/constraints.md
index 8d0d184..ee6b625 100644
--- a/gcc/config/arm/constraints.md
+++ b/gcc/config/arm/constraints.md
@@ -30,7 +30,7 @@
;; The following multi-letter normal constraints have been used:
;; in ARM/Thumb-2 state: Da, Db, Dc, Dn, Dl, DL, Dv, Dy, Di
-;; in Thumb-1 state: Pa, Pb
+;; in Thumb-1 state: Pa, Pb, Pc
;; in Thumb-2 state: Ps, Pt, Pu, Pv, Pw, Px
;; The following memory constraints have been used:
@@ -122,7 +122,7 @@
(and (match_code "const_int")
(match_test "TARGET_32BIT ? ((ival >= 0 && ival <= 32)
|| ((ival & (ival - 1)) == 0))
- : ((ival >= 0 && ival <= 1020) && ((ival & 3) == 0))")))
+ : ival >= 0 && ival <= 1020 && (ival & 3) == 0")))
(define_constraint "N"
"Thumb-1 state a constant in the range 0-31."
@@ -148,6 +148,12 @@
(match_test "TARGET_THUMB1 && ival >= -262 && ival <= 262
&& (ival > 255 || ival < -255)")))
+(define_constraint "Pc"
+ "@internal In Thumb-1 state a constant that is in the range 1021 to 1275"
+ (and (match_code "const_int")
+ (match_test "TARGET_THUMB1
+ && ival > 1020 && ival <= 1275")))
+
(define_constraint "Ps"
"@internal In Thumb-2 state a constant in the range -255 to +255"
(and (match_code "const_int")