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