https://gcc.gnu.org/bugzilla/show_bug.cgi?id=117864

            Bug ID: 117864
           Summary: uadd_with_carry could be improved for aarch64
           Product: gcc
           Version: 15.0
            Status: UNCONFIRMED
          Keywords: missed-optimization
          Severity: enhancement
          Priority: P3
         Component: target
          Assignee: unassigned at gcc dot gnu.org
          Reporter: pinskia at gcc dot gnu.org
  Target Milestone: ---
            Target: aarch64

Take:
```
bool uadd_with_carry(unsigned a, unsigned b, bool c, unsigned* out) {
    unsigned sum1;
    bool c1 = __builtin_uadd_overflow(a, b, &sum1);
    unsigned sum2;
    bool c2 = __builtin_uadd_overflow(sum1, (unsigned)c, &sum2);

    *out = sum2;
    return c1 | c2;
}
```

Right now GCC produces:
```
uadd_with_carry:
        adds    w0, w0, w1
        and     w2, w2, 255
        cset    w1, cs
        adds    w2, w0, w2
        cset    w0, cs
        str     w2, [x3]
        orr     w0, w1, w0
        ret
```

This could be improved to:
```
uadd_with_carry:
        and     w8, w2, #0x1
        cmp     w8, #1
        adcs    w8, w0, w1
        cset    w0, hs
        str     w8, [x3]
        ret
```

That is implement aarch64 backend could implement the uaddc5/usubc5 optabs for
SImode/DImode.

Reply via email to