On 31/05/13 09:46, Kyrylo Tkachov wrote:
Hi all,

This patch improves code generation for DImode bitwise IOR operations
for arm. The expander can now handle immediate values and the
define_insn is changed to an insn_and_split.
The NEON version is merged with the scalar version.

For code:
   unsigned long long or64 (unsigned long long input)
   {
     return input | 0x200000004ULL;
   }

we now generate:
        orr     r0, r0, #4
        orr     r1, r1, #2

Instead of:
        mov     r2, #4
        mov     r3, #2
        orr     r0, r0, r2
        orr     r1, r1, r3

Regtested arm-none-eabi on qemu and bootstrapped on a Cortex-A15.

gcc.target/arm/neon-for-64bits-2.c scan-assembler-times vorr 1 starts
failing with this patch because now the compiler chooses not to generate
the NEON version for that testcase.
Previously, it would generate the NEON form because the "r" constraints
were suppressed explicitly with '?', but we'd prefer to trust the
optimisers to make the correct decision, therefore I didn't
copy over the '?'.

Ok for trunk?

Thanks,
Kyrill

gcc/
2013-05-31  Kyrylo Tkachov  <kyrylo.tkac...@arm.com>

        PR target/56315
        * config/arm/arm.c (const_ok_for_dimode_op): Handle IOR.
        * config/arm/arm.md (*iordi3_insn): Change to insn_and_split.
        * config/arm/neon.md (iordi3_neon): Remove.
        (neon_vorr<mode>): Generate iordi3 instead of iordi3_neon.
        * config/arm/predicates.md (imm_for_neon_logic_operand):
        Move to earlier in the file.
        (neon_logic_op2): Likewise.
        (arm_iordi_operand_neon): New predicate.
        
gcc/testsuite/
2013-05-31  Kyrylo Tkachov  <kyrylo.tkac...@arm.com>

        PR target/56315
        * gcc.target/arm/iordi3-opt.c: New test.


OK.

R.

Reply via email to