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.