> On 18/11/14 11:02, Yangfei (Felix) wrote:
> >> On 06/11/14 08:35, Yangfei (Felix) wrote:
> >>>>> The idea is simple: Use movw for certain const source
> >>>>> operand instead of
> >>>> ldrh. And exclude the const values which cannot be handled by
> >>>> mov/mvn/movw.
> >>>>> I am doing regression test for this patch. Assuming no
> >>>>> issue pops up,
> >>>> OK for trunk?
> >>>>
> >>>> So, doesn't that makes the bug latent for architectures older than
> >>>> armv6t2 and big endian and only fixed this in ARM state ? I'd
> >>>> prefer a complete solution please. What about *thumb2_movhi_insn in
> >> thumb2.md ?
> >>>>
> >>>
> >>> Actually, we fix the bug by excluding the const values which cannot be
> handled.
> >> The patch still works even without the adding of "movw" here.
> >>> The new "movw" alternative here is just an small code optimization
> >>> for certain
> >> arch. We can handle consts by movw instead of ldrh and this better
> >> for performance.
> >>> We find that this bug is not reproducible for *thumb2_movhi_insn.
> >>> The reason
> >> is that this pattern can always move consts using "movw".
> >>
> >> Please fix the PR number in your final commit with PR 59593.
> >>
> >>> Index: gcc/config/arm/predicates.md
> >>>
> >>
> =============================================================
> >> ======
> >>> --- gcc/config/arm/predicates.md (revision 216838)
> >>> +++ gcc/config/arm/predicates.md (working copy)
> >>> @@ -144,6 +144,11 @@
> >>> (and (match_code "const_int")
> >>> (match_test "INTVAL (op) == 0")))
> >>>
> >>> +(define_predicate "arm_movw_immediate_operand"
> >>> + (and (match_test "TARGET_32BIT && arm_arch_thumb2")
> >>> + (and (match_code "const_int")
> >>> + (match_test "(INTVAL (op) & 0xffff0000) == 0"))))
> >>> +
> >>> ;; Something valid on the RHS of an ARM data-processing
> >>> instruction (define_predicate "arm_rhs_operand"
> >>> (ior (match_operand 0 "s_register_operand") @@ -211,6 +216,11 @@
> >>> (ior (match_operand 0 "arm_rhs_operand")
> >>> (match_operand 0 "arm_not_immediate_operand")))
> >>>
> >>> +(define_predicate "arm_hi_operand"
> >>> + (ior (match_operand 0 "arm_rhsm_operand")
> >>> + (ior (match_operand 0 "arm_not_immediate_operand")
> >>> + (match_operand 0 "arm_movw_immediate_operand"))))
> >>> +
> >>
> >> I think you don't need any of these predicates.
> >>
> >>
> >>> (define_predicate "arm_di_operand"
> >>> (ior (match_operand 0 "s_register_operand")
> >>> (match_operand 0 "arm_immediate_di_operand")))
> >>> Index: gcc/config/arm/arm.md
> >>>
> >>
> =============================================================
> >> ======
> >>> --- gcc/config/arm/arm.md (revision 216838)
> >>> +++ gcc/config/arm/arm.md (working copy)
> >>> @@ -6285,8 +6285,8 @@
> >>>
> >>> ;; Pattern to recognize insn generated default case above
> >>> (define_insn "*movhi_insn_arch4"
> >>> - [(set (match_operand:HI 0 "nonimmediate_operand" "=r,r,m,r")
> >>> - (match_operand:HI 1 "general_operand" "rIk,K,r,mi"))]
> >>> + [(set (match_operand:HI 0 "nonimmediate_operand" "=r,r,r,m,r")
> >>> + (match_operand:HI 1 "arm_hi_operand" "rIk,K,j,r,mi"))]
> >>
> >> Use `n' instead of `j' - movw can handle all of the numerical
> >> constants for HImode values. And the predicate can remain general_operand.
> >>
>
> Did you read my comment about set_attr "arch" further down in the thread ?
>
> > Look at the set_attr "arch" alternative and set this to t2 for the movw
> alternative. I would expect that to be enough to sort this out instead of
> adding all
> this code.
>
Sorry for missing the point. It seems to me that 't2' here will conflict with
condition of the pattern *movhi_insn_arch4:
"TARGET_ARM
&& arm_arch4
&& (register_operand (operands[0], HImode)
|| register_operand (operands[1], HImode))"
#define TARGET_ARM (! TARGET_THUMB)
/* 32-bit Thumb-2 code. */
#define TARGET_THUMB2 (TARGET_THUMB && arm_arch_thumb2)
Right? Thanks.