On Mon, Apr 18, 2011 at 9:33 PM, Richard Earnshaw <rearn...@arm.com> wrote: > > On Sat, 2011-04-16 at 12:34 +0800, Carrot Wei wrote: >> Hi Richard >> >> Thank you for the detailed explanation. It sounds like an inherent >> difficulty of rtl passes. Then the only opportunity is ldrb/strb >> instructions because they never affect cc registers. > > There are also some comparison operations that are also known to be 2 > bytes (because they are known to set the condition codes). But yes, the > scope here is quite limited. > > R.
So now this version only computes the correct length of ldrd/strb in insn arm_movqi_insn. Tested on arm qemu without regression. thanks Carrot ChangeLog: 2011-04-18 Wei Guozhi <car...@google.com> 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". Index: arm.c =================================================================== --- arm.c (revision 172353) +++ arm.c (working copy) @@ -5772,7 +5772,7 @@ thumb1_index_register_rtx_p (rtx x, int 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. */ Index: arm-protos.h =================================================================== --- arm-protos.h (revision 172353) +++ arm-protos.h (working copy) @@ -58,6 +58,7 @@ extern bool arm_legitimize_reload_addres 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); Index: constraints.md =================================================================== --- constraints.md (revision 172353) +++ constraints.md (working copy) @@ -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. Index: arm.md =================================================================== --- arm.md (revision 172353) +++ arm.md (working copy) @@ -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"