diff mbox

[ARM] PR47855 Compute attr "length" for some thumb2 insns, 2/3

Message ID BANLkTingR_n0Lu308JHzOAFJdE1gcWARkA@mail.gmail.com
State New
Headers show

Commit Message

Carrot Wei April 18, 2011, 2:17 p.m. UTC
On Mon, Apr 18, 2011 at 9:33 PM, Richard Earnshaw <rearnsha@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  <carrot@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".

Comments

Richard Earnshaw April 18, 2011, 2:49 p.m. UTC | #1
On Mon, 2011-04-18 at 22:17 +0800, Carrot Wei wrote:
> On Mon, Apr 18, 2011 at 9:33 PM, Richard Earnshaw <rearnsha@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  <carrot@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".


OK.

R.
diff mbox

Patch

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"