Hi all,

This third patch implements the new optabs for arm.
Conveniently, we can reuse the recently refactored *if_neg_move pattern
and extend it to cover the conditional NOT case.
Although arm has conditional execution capabilities I have found that
performing the transformation from patch 1/3 early on benefits arm as well.
For example for code:
int
foonegsi (int a)
{
  return a ? 25089992 : -25089992;
}

we currently generate:
        movw    r2, #55240
        movw    r3, #10296
        cmp     r0, #0
        movt    r2, 382
        movt    r3, 65153
        movne   r0, r2
        moveq   r0, r3
        bx

whereas with this patch we generate:
        movw    r3, #10296
        cmp     r0, #0
        movt    r3, 65153
        mov     r0, r3
        rsbne   r0, r3, #0
        bx      lr


In SPEC2006 this doesn't trigger very often, so there were minimal code 
differences,
but overall I claim this patch is an improvement.

Bootstrapped and tested on arm-none-linux-gnueabihf.

Ok for trunk if the midend changes in 1/3 are approved?

Thanks,
Kyrill

2015-09-01  Kyrylo Tkachov  <kyrylo.tkac...@arm.com>

    * config/arm/arm.md (<NOT_NEG_op>sicc): New define_expand.
    (*if_neg_move): Rename to...
    (*if_<NOT_NEG_op>_move): ... This.  Use NOT_NEG code iterator.
    * config/arm/iterators.md (NOT_NEG): New code iterator.
    (NOT_NEG_op): New code attribute.

2015-09-01  Kyrylo Tkachov  <kyrylo.tkac...@arm.com>

    * gcc.target/arm/cond_op_imm_1.c: New test.

Reply via email to