a56c1641e9
This x86_64 backend patch allows TImode STV to take advantage of the fact that the PTEST instruction performs an AND operation. Previously PTEST was (mostly) used for comparison against zero, by using the same operands. The benefits are demonstrated by the new test case: __int128 a,b; int foo() { return (a & b) != 0; } Currently with -O2 -msse4 we generate: movdqa a(%rip), %xmm0 pand b(%rip), %xmm0 xorl %eax, %eax ptest %xmm0, %xmm0 setne %al ret with this patch we now generate: movdqa a(%rip), %xmm0 xorl %eax, %eax ptest b(%rip), %xmm0 setne %al ret Technically, the magic happens using new define_insn_and_split patterns. Using two patterns allows this transformation to performed independently of whether TImode STV is run before or after combine. The one tricky case is that immediate constant operands of the AND behave slightly differently between TImode and V1TImode: All V1TImode immediate operands becomes loads, but for TImode only values that are not hilo_operands need to be loaded. Hence the new *testti_doubleword accepts any general_operand, but internally during split calls force_reg whenever the second operand is not x86_64_hilo_general_operand. This required (benefits from) some tweaks to TImode STV to support CONST_WIDE_INT in more places, using CONST_SCALAR_INT_P instead of just CONST_INT_P. 2022-08-09 Roger Sayle <roger@nextmovesoftware.com> gcc/ChangeLog * config/i386/i386-features.cc (scalar_chain::convert_compare): Create new pseudos only when/if needed. Add support for TEST, i.e. (COMPARE (AND x y) (const_int 0)), using UNSPEC_PTEST. When broadcasting V2DImode and V4SImode use new pseudo register. (timode_scalar_chain::convert_op): Do nothing if operand is already V1TImode. Avoid generating useless SUBREG conversions, i.e. (SUBREG:V1TImode (REG:V1TImode) 0). Handle CONST_WIDE_INT in addition to CONST_INT by using CONST_SCALAR_INT_P. (convertible_comparison_p): Use CONST_SCALAR_INT_P to match both CONST_WIDE_INT and CONST_INT. Recognize new *testti_doubleword pattern as an STV candidate. (timode_scalar_to_vector_candidate_p): Allow CONST_SCALAR_INT_P operands in binary logic operations. * config/i386/i386.cc (ix86_rtx_costs) <case UNSPEC>: Add costs for UNSPEC_PTEST; a PTEST that performs an AND has the same cost as regular PTEST, i.e. cost->sse_op. * config/i386/i386.md (*testti_doubleword): New pre-reload define_insn_and_split that recognizes comparison of TI mode AND against zero. * config/i386/sse.md (*ptest<mode>_and): New pre-reload define_insn_and_split that recognizes UNSPEC_PTEST of identical AND operands. gcc/testsuite/ChangeLog * gcc.target/i386/sse4_1-stv-8.c: New test case. |
||
---|---|---|
INSTALL | ||
c++tools | ||
config | ||
contrib | ||
fixincludes | ||
gcc | ||
gnattools | ||
gotools | ||
include | ||
intl | ||
libada | ||
libatomic | ||
libbacktrace | ||
libcc1 | ||
libcody | ||
libcpp | ||
libdecnumber | ||
libffi | ||
libgcc | ||
libgfortran | ||
libgo | ||
libgomp | ||
libiberty | ||
libitm | ||
libobjc | ||
liboffloadmic | ||
libphobos | ||
libquadmath | ||
libsanitizer | ||
libssp | ||
libstdc++-v3 | ||
libvtv | ||
lto-plugin | ||
maintainer-scripts | ||
zlib | ||
.dir-locals.el | ||
.gitattributes | ||
.gitignore | ||
ABOUT-NLS | ||
COPYING | ||
COPYING.LIB | ||
COPYING.RUNTIME | ||
COPYING3 | ||
COPYING3.LIB | ||
ChangeLog | ||
ChangeLog.jit | ||
ChangeLog.tree-ssa | ||
MAINTAINERS | ||
Makefile.def | ||
Makefile.in | ||
Makefile.tpl | ||
README | ||
ar-lib | ||
compile | ||
config-ml.in | ||
config.guess | ||
config.rpath | ||
config.sub | ||
configure | ||
configure.ac | ||
depcomp | ||
install-sh | ||
libtool-ldflags | ||
libtool.m4 | ||
ltgcc.m4 | ||
ltmain.sh | ||
ltoptions.m4 | ||
ltsugar.m4 | ||
ltversion.m4 | ||
lt~obsolete.m4 | ||
missing | ||
mkdep | ||
mkinstalldirs | ||
move-if-change | ||
multilib.am | ||
symlink-tree | ||
test-driver | ||
ylwrap |
README
This directory contains the GNU Compiler Collection (GCC). The GNU Compiler Collection is free software. See the files whose names start with COPYING for copying permission. The manuals, and some of the runtime libraries, are under different terms; see the individual source files for details. The directory INSTALL contains copies of the installation information as HTML and plain text. The source of this information is gcc/doc/install.texi. The installation information includes details of what is included in the GCC sources and what files GCC installs. See the file gcc/doc/gcc.texi (together with other files that it includes) for usage and porting information. An online readable version of the manual is in the files gcc/doc/gcc.info*. See http://gcc.gnu.org/bugs/ for how to report bugs usefully. Copyright years on GCC source files may be listed using range notation, e.g., 1987-2012, indicating that every year in the range, inclusive, is a copyrightable year that could otherwise be listed individually.