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

--- Comment #14 from GCC Commits <cvs-commit at gcc dot gnu.org> ---
The master branch has been updated by Uros Bizjak <u...@gcc.gnu.org>:

https://gcc.gnu.org/g:8bb6b2f4ae19c3aab7d7a5e5c8f5965f89d90e01

commit r15-1122-g8bb6b2f4ae19c3aab7d7a5e5c8f5965f89d90e01
Author: Uros Bizjak <ubiz...@gmail.com>
Date:   Sun Jun 9 12:09:13 2024 +0200

    i386: Implement .SAT_SUB for unsigned scalar integers [PR112600]

    The following testcase:

    unsigned
    sub_sat (unsigned x, unsigned y)
    {
      unsigned res;
      res = x - y;
      res &= -(x >= y);
      return res;
    }

    currently compiles (-O2) to:

    sub_sat:
            movl    %edi, %edx
            xorl    %eax, %eax
            subl    %esi, %edx
            cmpl    %esi, %edi
            setnb   %al
            negl    %eax
            andl    %edx, %eax
            ret

    We can expand through ussub{m}3 optab to use carry flag from the
subtraction
    and generate code using SBB instruction implementing:

        unsigned res = x - y;
        res &= ~(-(x < y));

    sub_sat:
            subl    %esi, %edi
            sbbl    %eax, %eax
            notl    %eax
            andl    %edi, %eax
            ret

            PR target/112600

    gcc/ChangeLog:

            * config/i386/i386.md (ussub<mode>3): New expander.
            (sub<mode>_3): Ditto.

    gcc/testsuite/ChangeLog:

            * gcc.target/i386/pr112600-b.c: New test.

Reply via email to