http://gcc.gnu.org/bugzilla/show_bug.cgi?id=54272

--- Comment #6 from Oleg Endo <olegendo at gcc dot gnu.org> ---
Another example where addv could be used:

int test (int a)
{
  if (a == 0x7FFFFFFF)
    return a;

  return a + 1;
}

currently compiles to:

-O2 -m2a:
        mov.l   .L6,r1
        cmp/eq  r1,r4
        bt.s    .L4
        mov     r4,r0
        add     #1,r0
.L4:
        rts/n

        .align 2
.L6:
        .long   2147483647


-O2 -m4:
        mov.l   .L4,r1
        mov     #-1,r0
        cmp/eq  r1,r4
        negc    r0,r0
        rts
        add     r4,r0

        .align 2
.L4:
        .long   2147483647

better:

SH4 with zero displacement branch:
        mov     #1,r0
        addv    r4,r0  // T = r0 == 0x80000000 (overflow)
        bt      0f
        mov     r4,r0
0:
        rts
        nop

branch-free:
        mov    #1,r0
        mov    #0,r1
        addv    r4,r0  // T = r0 == 0x80000000 (overflow)
        rts
        subc    r1,r0  // r0 = r0 - r1 - T

Reply via email to