Hi,

The attached patch fixes up PR50022 which exposed a problem in my reworking
the movdi_vfp_cortex_a8 patterns.  The problem was the ce_count attribute
wasn't being set at all for alternatives that would have more than
one assembler instruction that could be generated as a result of
predication.

The ce_count attribute is used in the backend to determine how many
actual assembler instructions result from one pattern in the backend
to allow for proper packing of IT block instructions.

I know I have set the length field conservatively but checking for
each of the cases for Thumb2 to get the exact lengths can be the
subject of a follow-up patch.

A slightly different version of this patch was tested independently
by Matthias Klose to check that it fixed the Ada bootstrap issue.
The other alternative was to split this again into an ARM state pattern
and a Thumb2 state pattern with the Thumb2 pattern not being marked
as predicable.

Final testing in progress on qemu with armv7-a / Thumb2 and a
bootstrap for paranoia. Ok to commit if no regressions ?

Cheers
Ramana



2011-08-12  Ramana Radhakrishnan  <ramana.radhakrish...@linaro.org>

        PR target/50022
        * config/arm/arm.c (output_move_double): Add 2 parameters
        to count the number of insns emitted and whether to emit or not.
        Use the flag to decide when to emit and count number of instructions
        that will be emitted.
        Handle case where output_move_double might be called for calculating
        lengths with an invalid constant.
        (arm_count_output_move_double_insns): Define.
        * config/arm/arm-protos.h (arm_count_output_move_double_insns): Declare.
        (output_move_double): Adjust prototype.
        * config/arm/vfp.md ("*movdi_vfp"): Adjust call to
        output_move_double.
        ("*movdi_vfp_cortexa8"): Likewise and add attribute
        for ce_count.
        * config/arm/arm.md ("*arm_movdi"): Adjust call to output_move_double.
        ("*movdf_soft_insn"): Likewise.
        * config/arm/cirrus.md ("*cirrus_arm_movdi"): Likewise.
        ("*cirrus_thumb2_movdi"): Likewise.
        ("*thumb2_cirrus_movdf_hard_insn"): Likewise.
        ("*cirrus_movdf_hard_insn"): Likewise.
        * config/arm/neon.md (*neon_mov<mode> VD): Likewise.
        * config/arm/iwmmxt.md ("*iwmmxt_arm_movdi"): Likewise.
        ("mov<mode>_internal VMMX"): Likewise.

Reply via email to