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

--- Comment #2 from Jens Seifert <jens.seifert at de dot ibm.com> ---
Assembly that better integrates:

unsigned long long addc_opt(unsigned long long a, unsigned long long b,
unsigned long long *res)
{
   unsigned long long rc;
   __asm__("addc %0,%2,%3;\n\tsubfe
%1,%1,%1":"=r"(*res),"=r"(rc):"r"(a),"r"(b):"xer");
   return rc + 1;
}

Output:

.L.addc_opt(unsigned long long, unsigned long long, unsigned long long*):
        addc 9,3,4;
        subfe 3,3,3
        std 9,0(5)
        addi 3,3,1
        blr

Power10 code for __builtin_uaddll_overflow is okay:

unsigned long long addc(unsigned long long a, unsigned long long b, unsigned
long long *res)
{
   return __builtin_uaddll_overflow(a, b, res);
}

.L.addc(unsigned long long, unsigned long long, unsigned long long*):
        add 4,3,4
        cmpld 0,4,3
        std 4,0(5)
        setbc 3,0
        blr

Reply via email to