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

Jens Seifert <jens.seifert at de dot ibm.com> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
             Status|RESOLVED                    |UNCONFIRMED
         Resolution|DUPLICATE                   |---

--- Comment #3 from Jens Seifert <jens.seifert at de dot ibm.com> ---
This is different as the extsw also happens if the result gets used e.g.
followed by a andc, which is my case. I obviously oversimplified the sample. It
has nothing to do with function result and ABI requirements. gcc assume that
the result of -(a < b) implemented by subfc, subfe is signed 32-bit. But the
result is already 64-bit.

unsigned long long branchlesconditional(unsigned long long a, unsigned long
long b, unsigned long long c)
{
   unsigned long long mask = -(a < b);
   return c &~ mask;
}

results in

_Z20branchlesconditionalyyy:
.LFB1:
        .cfi_startproc
        subfc 4,4,3
        subfe 3,3,3
        not 3,3
        extsw 3,3
        and 3,3,5
        blr

expected
subfc
subfe
andc

Reply via email to