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.