From: Wei Guozhi Date: Tue, 19 Apr 2011 08:46:54 +0000 (+0000) Subject: arm-protos.h (thumb1_legitimate_address_p): New prototype. X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=363ee90e135b1fde1ac4b16ff3248db0604c45bf;p=gcc.git arm-protos.h (thumb1_legitimate_address_p): New prototype. * config/arm/arm-protos.h (thumb1_legitimate_address_p): New prototype. * config/arm/arm.c (thumb1_legitimate_address_p): Remove the static linkage. * config/arm/constraints.md (Uu): New constraint. * config/arm/arm.md (*arm_movqi_insn): Compute attr "length". From-SVN: r172697 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 268b43a5ac1..2ce7bb77e0b 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,12 @@ +2011-04-19 Wei Guozhi + + PR target/47855 + * config/arm/arm-protos.h (thumb1_legitimate_address_p): New prototype. + * config/arm/arm.c (thumb1_legitimate_address_p): Remove the static + linkage. + * config/arm/constraints.md (Uu): New constraint. + * config/arm/arm.md (*arm_movqi_insn): Compute attr "length". + 2011-04-19 Tristan Gingold * config.gcc (-*-*-*vms): Added. diff --git a/gcc/config/arm/arm-protos.h b/gcc/config/arm/arm-protos.h index c8cadf34d99..190fec0ecef 100644 --- a/gcc/config/arm/arm-protos.h +++ b/gcc/config/arm/arm-protos.h @@ -58,6 +58,7 @@ extern bool arm_legitimize_reload_address (rtx *, enum machine_mode, int, int, int); extern rtx thumb_legitimize_reload_address (rtx *, enum machine_mode, int, int, int); +extern int thumb1_legitimate_address_p (enum machine_mode, rtx, int); extern int arm_const_double_rtx (rtx); extern int neg_const_double_rtx_ok_for_fpa (rtx); extern int vfp3_const_double_rtx (rtx); diff --git a/gcc/config/arm/arm.c b/gcc/config/arm/arm.c index 722a3715ea5..5f964d6d425 100644 --- a/gcc/config/arm/arm.c +++ b/gcc/config/arm/arm.c @@ -5775,7 +5775,7 @@ thumb1_index_register_rtx_p (rtx x, int strict_p) addresses based on the frame pointer or arg pointer until the reload pass starts. This is so that eliminating such addresses into stack based ones won't produce impossible code. */ -static int +int thumb1_legitimate_address_p (enum machine_mode mode, rtx x, int strict_p) { /* ??? Not clear if this is right. Experiment. */ diff --git a/gcc/config/arm/arm.md b/gcc/config/arm/arm.md index 5e7b4023d12..9e23d9bd175 100644 --- a/gcc/config/arm/arm.md +++ b/gcc/config/arm/arm.md @@ -5946,8 +5946,8 @@ (define_insn "*arm_movqi_insn" - [(set (match_operand:QI 0 "nonimmediate_operand" "=r,r,r,m") - (match_operand:QI 1 "general_operand" "rI,K,m,r"))] + [(set (match_operand:QI 0 "nonimmediate_operand" "=r,r,l,Uu,r,m") + (match_operand:QI 1 "general_operand" "rI,K,Uu,l,m,r"))] "TARGET_32BIT && ( register_operand (operands[0], QImode) || register_operand (operands[1], QImode))" @@ -5955,10 +5955,14 @@ mov%?\\t%0, %1 mvn%?\\t%0, #%B1 ldr%(b%)\\t%0, %1 + str%(b%)\\t%1, %0 + ldr%(b%)\\t%0, %1 str%(b%)\\t%1, %0" - [(set_attr "type" "*,*,load1,store1") - (set_attr "insn" "mov,mvn,*,*") - (set_attr "predicable" "yes")] + [(set_attr "type" "*,*,load1,store1,load1,store1") + (set_attr "insn" "mov,mvn,*,*,*,*") + (set_attr "predicable" "yes") + (set_attr "arch" "any,any,t2,t2,any,any") + (set_attr "length" "4,4,2,2,4,4")] ) (define_insn "*thumb1_movqi_insn" diff --git a/gcc/config/arm/constraints.md b/gcc/config/arm/constraints.md index 378415b6abb..f5b8521dd83 100644 --- a/gcc/config/arm/constraints.md +++ b/gcc/config/arm/constraints.md @@ -36,6 +36,7 @@ ;; The following memory constraints have been used: ;; in ARM/Thumb-2 state: Q, Ut, Uv, Uy, Un, Um, Us ;; in ARM state: Uq +;; in Thumb state: Uu (define_register_constraint "f" "TARGET_ARM ? FPA_REGS : NO_REGS" @@ -332,6 +333,14 @@ (and (match_code "mem") (match_test "REG_P (XEXP (op, 0))"))) +(define_memory_constraint "Uu" + "@internal + In Thumb state an address that is valid in 16bit encoding." + (and (match_code "mem") + (match_test "TARGET_THUMB + && thumb1_legitimate_address_p (GET_MODE (op), XEXP (op, 0), + 0)"))) + ;; We used to have constraint letters for S and R in ARM state, but ;; all uses of these now appear to have been removed.