From 16737e76d6ef9912996b93aa52ec9fb7c1efd2c3 Mon Sep 17 00:00:00 2001 From: Bernd Schmidt <bernds@codesourcery.com> Date: Tue, 20 Jul 2010 20:50:44 +0000 Subject: [PATCH] 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 --- gcc/ChangeLog | 7 +++++++ gcc/config/arm/arm.md | 29 ++++++++++++++++++----------- gcc/config/arm/constraints.md | 10 ++++++++-- 3 files changed, 33 insertions(+), 13 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 95914c7ca68d..b2beeea43605 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 e597eb3a745d..bbe65ec27ba8 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 8d0d184f7bec..ee6b6256b323 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") -- GitLab