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

--- Comment #9 from GCC Commits <cvs-commit at gcc dot gnu.org> ---
The master branch has been updated by Pan Li <pa...@gcc.gnu.org>:

https://gcc.gnu.org/g:bfb57d62c743235284f9b31a88c6ceed9971d27a

commit r15-7267-gbfb57d62c743235284f9b31a88c6ceed9971d27a
Author: Pan Li <pan2...@intel.com>
Date:   Thu Jan 23 12:14:43 2025 +0800

    RISC-V: Fix incorrect code gen for scalar signed SAT_SUB [PR117688]

    This patch would like to fix the wroing code generation for the scalar
    signed SAT_SUB.  The input can be QI/HI/SI/DI while the alu like sub
    can only work on Xmode.  Unfortunately we don't have sub/add for
    non-Xmode like QImode in scalar, thus we need to sign extend to Xmode
    to ensure we have the correct value before ALU like sub.  The gen_lowpart
    will generate something like lbu which has all zero for highest bits.

    For example, when 0xff(-1 for QImode) sub 0x1(1 for QImode), we actually
    want to -1 - 1 = -2, but if there is no sign extend like lbu, we will get
    0xff - 1 = 0xfe which is incorrect.  Thus, we have to sign extend
0xff(Qmode)
    to 0xffffffffffffffff(assume XImode is DImode) before sub in Xmode.

    The below test suites are passed for this patch.
    * The rv64gcv fully regression test.

            PR target/117688

    gcc/ChangeLog:

            * config/riscv/riscv.cc (riscv_expand_sssub): Leverage the helper
            riscv_extend_to_xmode_reg with SIGN_EXTEND.

    gcc/testsuite/ChangeLog:

            * gcc.target/riscv/pr117688.h: Add test helper macro.
            * gcc.target/riscv/pr117688-sub-run-1-s16.c: New test.
            * gcc.target/riscv/pr117688-sub-run-1-s32.c: New test.
            * gcc.target/riscv/pr117688-sub-run-1-s64.c: New test.
            * gcc.target/riscv/pr117688-sub-run-1-s8.c: New test.

    Signed-off-by: Pan Li <pan2...@intel.com>

Reply via email to