d7a09c445a
The current SVE REV patterns follow the AArch64 scheme, in which UNSPEC_REV<NN> reverses elements within an <NN>-bit granule. E.g. UNSPEC_REV64 on VNx8HI reverses the four 16-bit elements within each 64-bit granule. The native SVE scheme is the other way around: UNSPEC_REV64 is seen as an operation on 64-bit elements, with REVB swapping bytes within the elements, REVH swapping halfwords, and so on. This fits SVE more naturally because the operation can then be predicated per <NN>-bit granule/element. Making the patterns use the Advanced SIMD scheme was more natural when all we cared about were permutes, since we could then use the source and target of the permute in their original modes. However, the ACLE does need patterns that follow the native scheme, treating them as operations on integer elements. This patch defines the patterns that way instead and updates the existing uses to match. This also brings in a couple of helper routines from the ACLE branch. 2019-08-15 Richard Sandiford <richard.sandiford@arm.com> gcc/ * config/aarch64/iterators.md (UNSPEC_REVB, UNSPEC_REVH) (UNSPEC_REVW): New constants. (elem_bits): New mode attribute. (SVE_INT_UNARY): New int iterator. (optab): Handle UNSPEC_REV[BHW]. (sve_int_op): New int attribute. (min_elem_bits): Handle VNx16QI and the predicate modes. * config/aarch64/aarch64-sve.md (*aarch64_sve_rev64<mode>) (*aarch64_sve_rev32<mode>, *aarch64_sve_rev16vnx16qi): Delete. (@aarch64_pred_<SVE_INT_UNARY:optab><SVE_I:mode>): New pattern. * config/aarch64/aarch64.c (aarch64_sve_data_mode): New function. (aarch64_sve_int_mode, aarch64_sve_rev_unspec): Likewise. (aarch64_split_sve_subreg_move): Use UNSPEC_REV[BHW] instead of unspecs based on the total width of the reversed data. (aarch64_evpc_rev_local): Likewise (for SVE only). Use a reinterpret followed by a subreg on big-endian targets. gcc/testsuite/ * gcc.target/aarch64/sve/revb_1.c: Restrict to little-endian targets. Avoid including stdint.h. * gcc.target/aarch64/sve/revh_1.c: Likewise. * gcc.target/aarch64/sve/revw_1.c: Likewise. * gcc.target/aarch64/sve/revb_2.c: New big-endian test. * gcc.target/aarch64/sve/revh_2.c: Likewise. * gcc.target/aarch64/sve/revw_2.c: Likewise. From-SVN: r274517 |
||
---|---|---|
INSTALL | ||
config | ||
contrib | ||
fixincludes | ||
gcc | ||
gnattools | ||
gotools | ||
include | ||
intl | ||
libada | ||
libatomic | ||
libbacktrace | ||
libcc1 | ||
libcpp | ||
libdecnumber | ||
libffi | ||
libgcc | ||
libgfortran | ||
libgo | ||
libgomp | ||
libhsail-rt | ||
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.