On Fri, Aug 5, 2022 at 3:14 PM Roger Sayle <ro...@nextmovesoftware.com> wrote:
>
>
> This patch tweaks i386.md's *cmp<dwi>_doubleword splitter's predicate to
> allow general_operand, not just x86_64_hilo_general_operand, to improve
> code generation.  As a general rule, i386.md's _doubleword splitters should
> be post-reload splitters that require integer immediate operands to be
> x86_64_hilo_int_operand, so that each part is a valid word mode immediate
> constant.  As an exception to this rule, doubleword patterns that must be
> split before reload, because they require additional scratch registers,
> can take advantage of this ability to create new pseudos, to accept
> any immediate constant, and call force_reg on the high and/or low parts
> if they are not suitable immediate operands in word mode.
>
> The benefit is shown in the new cmpti3.c test case below.
>
> __int128 x;
> int foo()
> {
>     __int128 t = 0x1234567890abcdefLL;
>     return x == t;
> }
>
> where GCC with -O2 currently generates:
>
>         movabsq $1311768467294899695, %rax
>         xorl    %edx, %edx
>         xorq    x(%rip), %rax
>         xorq    x+8(%rip), %rdx
>         orq     %rdx, %rax
>         sete    %al
>         movzbl  %al, %eax
>         ret
>
> but with this patch now generates:
>
>         movabsq $1311768467294899695, %rax
>         xorq    x(%rip), %rax
>         orq     x+8(%rip), %rax
>         sete    %al
>         movzbl  %al, %eax
>         ret
>
> This patch has been tested on x86_64-pc-linux-gnu with make bootstrap
> and make -k check, both with and without --target_board=unix{-m32},
> with no new failures.  The first two new test cases aren't affected
> by this patch, but as I had them in my directory, it seemed reasonable to
> increase the testsuite's coverage of TImode comparison code generation.
> Ok for mainline?
>
> 2022-08-05  Roger Sayle  <ro...@nextmovesoftware.com>
>
> gcc/ChangeLog
>         * config/i386/i386.md (*cmp<dwi>_doubleword): Change predicate
>         for x86_64_hilo_general_operand to general operand.  Call
>         force_reg on parts that are not x86_64_immediate_operand.
>
> gcc/testsuite/ChangeLog
>         * gcc.target/i386/cmpti1.c: New test case.
>         * gcc.target/i386/cmpti2.c: Likewise.
>         * gcc.target/i386/cmpti3.c: Likewise.

OK.

Thanks,
Uros.

Reply via email to