summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authordoko <doko@6ca36cf4-e1d1-0310-8c6f-e303bb2178ca>2014-07-24 21:58:23 +0000
committerdoko <doko@6ca36cf4-e1d1-0310-8c6f-e303bb2178ca>2014-07-24 21:58:23 +0000
commit4a2e634ed8e6277d9ceb8e04b764ca59cf8e4a04 (patch)
treef9f3076c44854fbe899d6f03ea9e6e847ba4effc
parentfd1dbcc10165e96b9fc38d2331fb8725c072bb61 (diff)
downloadgcc-49-4a2e634ed8e6277d9ceb8e04b764ca59cf8e4a04.tar.gz
* Update to SVN 20140724 (r212995) from the gcc-4_9-branch.
* Update the Linaro support to the 4.9-2014.07 release. git-svn-id: svn://svn.debian.org/svn/gcccvs/branches/sid/gcc-4.9@7526 6ca36cf4-e1d1-0310-8c6f-e303bb2178ca
-rw-r--r--debian/changelog5
-rw-r--r--debian/patches/gcc-linaro-doc.diff121
-rw-r--r--debian/patches/gcc-linaro.diff19098
-rw-r--r--debian/patches/gcc-multiarch-linaro.diff147
-rw-r--r--debian/patches/svn-updates.diff1951
-rw-r--r--debian/rules.patch7
6 files changed, 20352 insertions, 977 deletions
diff --git a/debian/changelog b/debian/changelog
index f0906d6..47c7ab6 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,11 +1,14 @@
gcc-4.9 (4.9.1-2) UNRELEASED; urgency=medium
+ * Update to SVN 20140724 (r212995) from the gcc-4_9-branch.
+
* Fix installing test logs and summaries.
* Warn about ppc ELFv2 ABI issues, which will change in GCC 4.10.
* Don't gzip the xz compressed testsuite logs and summaries.
* Build libphobos on armel and armhf. Closes: #755390.
+ * Update the Linaro support to the 4.9-2014.07 release.
- -- Matthias Klose <doko@debian.org> Thu, 17 Jul 2014 14:56:55 +0200
+ -- Matthias Klose <doko@debian.org> Thu, 24 Jul 2014 16:47:07 +0200
gcc-4.9 (4.9.1-1) unstable; urgency=medium
diff --git a/debian/patches/gcc-linaro-doc.diff b/debian/patches/gcc-linaro-doc.diff
index f4599a8..ee2ed39 100644
--- a/debian/patches/gcc-linaro-doc.diff
+++ b/debian/patches/gcc-linaro-doc.diff
@@ -1,2 +1,121 @@
-# DP: Changes for the Linaro 4.9-2014.06 release (documentation).
+# DP: Changes for the Linaro 4.9-2014.07 release (documentation).
+--- a/src/gcc/doc/extend.texi
++++ b/src/gcc/doc/extend.texi
+@@ -9109,6 +9109,8 @@
+ instructions, but allow the compiler to schedule those calls.
+
+ @menu
++* AArch64 Built-in Functions::
++* AArch64 intrinsics::
+ * Alpha Built-in Functions::
+ * Altera Nios II Built-in Functions::
+ * ARC Built-in Functions::
+@@ -9116,6 +9118,7 @@
+ * ARM iWMMXt Built-in Functions::
+ * ARM NEON Intrinsics::
+ * ARM ACLE Intrinsics::
++* ARM Floating Point Status and Control Intrinsics::
+ * AVR Built-in Functions::
+ * Blackfin Built-in Functions::
+ * FR-V Built-in Functions::
+@@ -9141,6 +9144,23 @@
+ * TILEPro Built-in Functions::
+ @end menu
+
++@node AArch64 Built-in Functions
++@subsection AArch64 Built-in Functions
++
++These built-in functions are available for the AArch64 family of
++processors.
++@smallexample
++unsigned int __builtin_aarch64_get_fpcr ()
++void __builtin_aarch64_set_fpcr (unsigned int)
++unsigned int __builtin_aarch64_get_fpsr ()
++void __builtin_aarch64_set_fpsr (unsigned int)
++@end smallexample
++
++@node AArch64 intrinsics
++@subsection ACLE Intrinsics for AArch64
++
++@include aarch64-acle-intrinsics.texi
++
+ @node Alpha Built-in Functions
+ @subsection Alpha Built-in Functions
+
+@@ -9917,6 +9937,17 @@
+
+ @include arm-acle-intrinsics.texi
+
++@node ARM Floating Point Status and Control Intrinsics
++@subsection ARM Floating Point Status and Control Intrinsics
++
++These built-in functions are available for the ARM family of
++processors with floating-point unit.
++
++@smallexample
++unsigned int __builtin_arm_get_fpscr ()
++void __builtin_arm_set_fpscr (unsigned int)
++@end smallexample
++
+ @node AVR Built-in Functions
+ @subsection AVR Built-in Functions
+
+--- a/src/gcc/doc/aarch64-acle-intrinsics.texi
++++ b/src/gcc/doc/aarch64-acle-intrinsics.texi
+@@ -0,0 +1,55 @@
++@c Copyright (C) 2014 Free Software Foundation, Inc.
++@c This is part of the GCC manual.
++@c For copying conditions, see the file gcc.texi.
++
++@subsubsection CRC32 intrinsics
++
++These intrinsics are available when the CRC32 architecture extension is
++specified, e.g. when the @option{-march=armv8-a+crc} switch is used, or when
++the target processor specified with @option{-mcpu} supports it.
++
++@itemize @bullet
++@item uint32_t __crc32b (uint32_t, uint8_t)
++@*@emph{Form of expected instruction(s):} @code{crc32b @var{w0}, @var{w1}, @var{w2}}
++@end itemize
++
++
++@itemize @bullet
++@item uint32_t __crc32h (uint32_t, uint16_t)
++@*@emph{Form of expected instruction(s):} @code{crc32h @var{w0}, @var{w1}, @var{w2}}
++@end itemize
++
++
++@itemize @bullet
++@item uint32_t __crc32w (uint32_t, uint32_t)
++@*@emph{Form of expected instruction(s):} @code{crc32w @var{w0}, @var{w1}, @var{w2}}
++@end itemize
++
++
++@itemize @bullet
++@item uint32_t __crc32d (uint32_t, uint64_t)
++@*@emph{Form of expected instruction(s):} @code{crc32x @var{w0}, @var{w1}, @var{x2}}
++@end itemize
++
++@itemize @bullet
++@item uint32_t __crc32cb (uint32_t, uint8_t)
++@*@emph{Form of expected instruction(s):} @code{crc32cb @var{w0}, @var{w1}, @var{w2}}
++@end itemize
++
++
++@itemize @bullet
++@item uint32_t __crc32ch (uint32_t, uint16_t)
++@*@emph{Form of expected instruction(s):} @code{crc32ch @var{w0}, @var{w1}, @var{w2}}
++@end itemize
++
++
++@itemize @bullet
++@item uint32_t __crc32cw (uint32_t, uint32_t)
++@*@emph{Form of expected instruction(s):} @code{crc32cw @var{w0}, @var{w1}, @var{w2}}
++@end itemize
++
++
++@itemize @bullet
++@item uint32_t __crc32cd (uint32_t, uint64_t)
++@*@emph{Form of expected instruction(s):} @code{crc32cx @var{w0}, @var{w1}, @var{x2}}
++@end itemize
diff --git a/debian/patches/gcc-linaro.diff b/debian/patches/gcc-linaro.diff
index 1686fa4..28457c5 100644
--- a/debian/patches/gcc-linaro.diff
+++ b/debian/patches/gcc-linaro.diff
@@ -1,12 +1,16 @@
-# DP: Changes for the Linaro 4.9-2014.06 release.
+# DP: Changes for the Linaro 4.9-2014.07 release.
-LANG=C svn diff svn://gcc.gnu.org/svn/gcc/branches/gcc-4_9-branch@211979 \
- svn://gcc.gnu.org/svn/gcc/branches/linaro/gcc-4_9-branch@212009 \
+LANG=C svn diff svn://gcc.gnu.org/svn/gcc/branches/gcc-4_9-branch@212635 \
+ svn://gcc.gnu.org/svn/gcc/branches/linaro/gcc-4_9-branch@212977 \
| filterdiff --remove-timestamps --addoldprefix=a/src/ --addnewprefix=b/src/
--- a/src/libitm/ChangeLog.linaro
+++ b/src/libitm/ChangeLog.linaro
-@@ -0,0 +1,24 @@
+@@ -0,0 +1,28 @@
++2014-07-17 Yvan Roux <yvan.roux@linaro.org>
++
++ GCC Linaro 4.9-2014.07 released.
++
+2014-06-25 Yvan Roux <yvan.roux@linaro.org>
+
+ GCC Linaro 4.9-2014.06-1 released.
@@ -187,7 +191,11 @@ LANG=C svn diff svn://gcc.gnu.org/svn/gcc/branches/gcc-4_9-branch@211979 \
+} // namespace GTM
--- a/src/libgomp/ChangeLog.linaro
+++ b/src/libgomp/ChangeLog.linaro
-@@ -0,0 +1,15 @@
+@@ -0,0 +1,19 @@
++2014-07-17 Yvan Roux <yvan.roux@linaro.org>
++
++ GCC Linaro 4.9-2014.07 released.
++
+2014-06-25 Yvan Roux <yvan.roux@linaro.org>
+
+ GCC Linaro 4.9-2014.06-1 released.
@@ -205,7 +213,11 @@ LANG=C svn diff svn://gcc.gnu.org/svn/gcc/branches/gcc-4_9-branch@211979 \
+ GCC Linaro 4.9-2014.04 released.
--- a/src/libquadmath/ChangeLog.linaro
+++ b/src/libquadmath/ChangeLog.linaro
-@@ -0,0 +1,15 @@
+@@ -0,0 +1,19 @@
++2014-07-17 Yvan Roux <yvan.roux@linaro.org>
++
++ GCC Linaro 4.9-2014.07 released.
++
+2014-06-25 Yvan Roux <yvan.roux@linaro.org>
+
+ GCC Linaro 4.9-2014.06-1 released.
@@ -223,7 +235,11 @@ LANG=C svn diff svn://gcc.gnu.org/svn/gcc/branches/gcc-4_9-branch@211979 \
+ GCC Linaro 4.9-2014.04 released.
--- a/src/libsanitizer/ChangeLog.linaro
+++ b/src/libsanitizer/ChangeLog.linaro
-@@ -0,0 +1,15 @@
+@@ -0,0 +1,19 @@
++2014-07-17 Yvan Roux <yvan.roux@linaro.org>
++
++ GCC Linaro 4.9-2014.07 released.
++
+2014-06-25 Yvan Roux <yvan.roux@linaro.org>
+
+ GCC Linaro 4.9-2014.06-1 released.
@@ -241,7 +257,11 @@ LANG=C svn diff svn://gcc.gnu.org/svn/gcc/branches/gcc-4_9-branch@211979 \
+ GCC Linaro 4.9-2014.04 released.
--- a/src/zlib/ChangeLog.linaro
+++ b/src/zlib/ChangeLog.linaro
-@@ -0,0 +1,15 @@
+@@ -0,0 +1,19 @@
++2014-07-17 Yvan Roux <yvan.roux@linaro.org>
++
++ GCC Linaro 4.9-2014.07 released.
++
+2014-06-25 Yvan Roux <yvan.roux@linaro.org>
+
+ GCC Linaro 4.9-2014.06-1 released.
@@ -259,7 +279,11 @@ LANG=C svn diff svn://gcc.gnu.org/svn/gcc/branches/gcc-4_9-branch@211979 \
+ GCC Linaro 4.9-2014.04 released.
--- a/src/libstdc++-v3/ChangeLog.linaro
+++ b/src/libstdc++-v3/ChangeLog.linaro
-@@ -0,0 +1,15 @@
+@@ -0,0 +1,19 @@
++2014-07-17 Yvan Roux <yvan.roux@linaro.org>
++
++ GCC Linaro 4.9-2014.07 released.
++
+2014-06-25 Yvan Roux <yvan.roux@linaro.org>
+
+ GCC Linaro 4.9-2014.06-1 released.
@@ -277,7 +301,11 @@ LANG=C svn diff svn://gcc.gnu.org/svn/gcc/branches/gcc-4_9-branch@211979 \
+ GCC Linaro 4.9-2014.04 released.
--- a/src/intl/ChangeLog.linaro
+++ b/src/intl/ChangeLog.linaro
-@@ -0,0 +1,15 @@
+@@ -0,0 +1,19 @@
++2014-07-17 Yvan Roux <yvan.roux@linaro.org>
++
++ GCC Linaro 4.9-2014.07 released.
++
+2014-06-25 Yvan Roux <yvan.roux@linaro.org>
+
+ GCC Linaro 4.9-2014.06-1 released.
@@ -295,7 +323,11 @@ LANG=C svn diff svn://gcc.gnu.org/svn/gcc/branches/gcc-4_9-branch@211979 \
+ GCC Linaro 4.9-2014.04 released.
--- a/src/ChangeLog.linaro
+++ b/src/ChangeLog.linaro
-@@ -0,0 +1,15 @@
+@@ -0,0 +1,19 @@
++2014-07-17 Yvan Roux <yvan.roux@linaro.org>
++
++ GCC Linaro 4.9-2014.07 released.
++
+2014-06-25 Yvan Roux <yvan.roux@linaro.org>
+
+ GCC Linaro 4.9-2014.06-1 released.
@@ -313,7 +345,11 @@ LANG=C svn diff svn://gcc.gnu.org/svn/gcc/branches/gcc-4_9-branch@211979 \
+ GCC Linaro 4.9-2014.04 released.
--- a/src/boehm-gc/ChangeLog.linaro
+++ b/src/boehm-gc/ChangeLog.linaro
-@@ -0,0 +1,15 @@
+@@ -0,0 +1,19 @@
++2014-07-17 Yvan Roux <yvan.roux@linaro.org>
++
++ GCC Linaro 4.9-2014.07 released.
++
+2014-06-25 Yvan Roux <yvan.roux@linaro.org>
+
+ GCC Linaro 4.9-2014.06-1 released.
@@ -331,7 +367,11 @@ LANG=C svn diff svn://gcc.gnu.org/svn/gcc/branches/gcc-4_9-branch@211979 \
+ GCC Linaro 4.9-2014.04 released.
--- a/src/include/ChangeLog.linaro
+++ b/src/include/ChangeLog.linaro
-@@ -0,0 +1,22 @@
+@@ -0,0 +1,26 @@
++2014-07-17 Yvan Roux <yvan.roux@linaro.org>
++
++ GCC Linaro 4.9-2014.07 released.
++
+2014-06-25 Yvan Roux <yvan.roux@linaro.org>
+
+ GCC Linaro 4.9-2014.06-1 released.
@@ -388,7 +428,11 @@ LANG=C svn diff svn://gcc.gnu.org/svn/gcc/branches/gcc-4_9-branch@211979 \
do { \
--- a/src/libiberty/ChangeLog.linaro
+++ b/src/libiberty/ChangeLog.linaro
-@@ -0,0 +1,15 @@
+@@ -0,0 +1,19 @@
++2014-07-17 Yvan Roux <yvan.roux@linaro.org>
++
++ GCC Linaro 4.9-2014.07 released.
++
+2014-06-25 Yvan Roux <yvan.roux@linaro.org>
+
+ GCC Linaro 4.9-2014.06-1 released.
@@ -406,7 +450,11 @@ LANG=C svn diff svn://gcc.gnu.org/svn/gcc/branches/gcc-4_9-branch@211979 \
+ GCC Linaro 4.9-2014.04 released.
--- a/src/lto-plugin/ChangeLog.linaro
+++ b/src/lto-plugin/ChangeLog.linaro
-@@ -0,0 +1,15 @@
+@@ -0,0 +1,19 @@
++2014-07-17 Yvan Roux <yvan.roux@linaro.org>
++
++ GCC Linaro 4.9-2014.07 released.
++
+2014-06-25 Yvan Roux <yvan.roux@linaro.org>
+
+ GCC Linaro 4.9-2014.06-1 released.
@@ -424,7 +472,11 @@ LANG=C svn diff svn://gcc.gnu.org/svn/gcc/branches/gcc-4_9-branch@211979 \
+ GCC Linaro 4.9-2014.04 released.
--- a/src/contrib/regression/ChangeLog.linaro
+++ b/src/contrib/regression/ChangeLog.linaro
-@@ -0,0 +1,15 @@
+@@ -0,0 +1,19 @@
++2014-07-17 Yvan Roux <yvan.roux@linaro.org>
++
++ GCC Linaro 4.9-2014.07 released.
++
+2014-06-25 Yvan Roux <yvan.roux@linaro.org>
+
+ GCC Linaro 4.9-2014.06-1 released.
@@ -442,7 +494,11 @@ LANG=C svn diff svn://gcc.gnu.org/svn/gcc/branches/gcc-4_9-branch@211979 \
+ GCC Linaro 4.9-2014.04 released.
--- a/src/contrib/ChangeLog.linaro
+++ b/src/contrib/ChangeLog.linaro
-@@ -0,0 +1,15 @@
+@@ -0,0 +1,19 @@
++2014-07-17 Yvan Roux <yvan.roux@linaro.org>
++
++ GCC Linaro 4.9-2014.07 released.
++
+2014-06-25 Yvan Roux <yvan.roux@linaro.org>
+
+ GCC Linaro 4.9-2014.06-1 released.
@@ -460,7 +516,11 @@ LANG=C svn diff svn://gcc.gnu.org/svn/gcc/branches/gcc-4_9-branch@211979 \
+ GCC Linaro 4.9-2014.04 released.
--- a/src/contrib/reghunt/ChangeLog.linaro
+++ b/src/contrib/reghunt/ChangeLog.linaro
-@@ -0,0 +1,15 @@
+@@ -0,0 +1,19 @@
++2014-07-17 Yvan Roux <yvan.roux@linaro.org>
++
++ GCC Linaro 4.9-2014.07 released.
++
+2014-06-25 Yvan Roux <yvan.roux@linaro.org>
+
+ GCC Linaro 4.9-2014.06-1 released.
@@ -478,7 +538,11 @@ LANG=C svn diff svn://gcc.gnu.org/svn/gcc/branches/gcc-4_9-branch@211979 \
+ GCC Linaro 4.9-2014.04 released.
--- a/src/libatomic/ChangeLog.linaro
+++ b/src/libatomic/ChangeLog.linaro
-@@ -0,0 +1,15 @@
+@@ -0,0 +1,19 @@
++2014-07-17 Yvan Roux <yvan.roux@linaro.org>
++
++ GCC Linaro 4.9-2014.07 released.
++
+2014-06-25 Yvan Roux <yvan.roux@linaro.org>
+
+ GCC Linaro 4.9-2014.06-1 released.
@@ -496,7 +560,11 @@ LANG=C svn diff svn://gcc.gnu.org/svn/gcc/branches/gcc-4_9-branch@211979 \
+ GCC Linaro 4.9-2014.04 released.
--- a/src/config/ChangeLog.linaro
+++ b/src/config/ChangeLog.linaro
-@@ -0,0 +1,15 @@
+@@ -0,0 +1,19 @@
++2014-07-17 Yvan Roux <yvan.roux@linaro.org>
++
++ GCC Linaro 4.9-2014.07 released.
++
+2014-06-25 Yvan Roux <yvan.roux@linaro.org>
+
+ GCC Linaro 4.9-2014.06-1 released.
@@ -514,7 +582,11 @@ LANG=C svn diff svn://gcc.gnu.org/svn/gcc/branches/gcc-4_9-branch@211979 \
+ GCC Linaro 4.9-2014.04 released.
--- a/src/libbacktrace/ChangeLog.linaro
+++ b/src/libbacktrace/ChangeLog.linaro
-@@ -0,0 +1,15 @@
+@@ -0,0 +1,19 @@
++2014-07-17 Yvan Roux <yvan.roux@linaro.org>
++
++ GCC Linaro 4.9-2014.07 released.
++
+2014-06-25 Yvan Roux <yvan.roux@linaro.org>
+
+ GCC Linaro 4.9-2014.06-1 released.
@@ -532,7 +604,11 @@ LANG=C svn diff svn://gcc.gnu.org/svn/gcc/branches/gcc-4_9-branch@211979 \
+ GCC Linaro 4.9-2014.04 released.
--- a/src/libjava/libltdl/ChangeLog.linaro
+++ b/src/libjava/libltdl/ChangeLog.linaro
-@@ -0,0 +1,15 @@
+@@ -0,0 +1,19 @@
++2014-07-17 Yvan Roux <yvan.roux@linaro.org>
++
++ GCC Linaro 4.9-2014.07 released.
++
+2014-06-25 Yvan Roux <yvan.roux@linaro.org>
+
+ GCC Linaro 4.9-2014.06-1 released.
@@ -550,7 +626,11 @@ LANG=C svn diff svn://gcc.gnu.org/svn/gcc/branches/gcc-4_9-branch@211979 \
+ GCC Linaro 4.9-2014.04 released.
--- a/src/libjava/ChangeLog.linaro
+++ b/src/libjava/ChangeLog.linaro
-@@ -0,0 +1,15 @@
+@@ -0,0 +1,19 @@
++2014-07-17 Yvan Roux <yvan.roux@linaro.org>
++
++ GCC Linaro 4.9-2014.07 released.
++
+2014-06-25 Yvan Roux <yvan.roux@linaro.org>
+
+ GCC Linaro 4.9-2014.06-1 released.
@@ -568,7 +648,11 @@ LANG=C svn diff svn://gcc.gnu.org/svn/gcc/branches/gcc-4_9-branch@211979 \
+ GCC Linaro 4.9-2014.04 released.
--- a/src/libjava/classpath/ChangeLog.linaro
+++ b/src/libjava/classpath/ChangeLog.linaro
-@@ -0,0 +1,15 @@
+@@ -0,0 +1,19 @@
++2014-07-17 Yvan Roux <yvan.roux@linaro.org>
++
++ GCC Linaro 4.9-2014.07 released.
++
+2014-06-25 Yvan Roux <yvan.roux@linaro.org>
+
+ GCC Linaro 4.9-2014.06-1 released.
@@ -586,7 +670,11 @@ LANG=C svn diff svn://gcc.gnu.org/svn/gcc/branches/gcc-4_9-branch@211979 \
+ GCC Linaro 4.9-2014.04 released.
--- a/src/gnattools/ChangeLog.linaro
+++ b/src/gnattools/ChangeLog.linaro
-@@ -0,0 +1,15 @@
+@@ -0,0 +1,19 @@
++2014-07-17 Yvan Roux <yvan.roux@linaro.org>
++
++ GCC Linaro 4.9-2014.07 released.
++
+2014-06-25 Yvan Roux <yvan.roux@linaro.org>
+
+ GCC Linaro 4.9-2014.06-1 released.
@@ -604,7 +692,11 @@ LANG=C svn diff svn://gcc.gnu.org/svn/gcc/branches/gcc-4_9-branch@211979 \
+ GCC Linaro 4.9-2014.04 released.
--- a/src/maintainer-scripts/ChangeLog.linaro
+++ b/src/maintainer-scripts/ChangeLog.linaro
-@@ -0,0 +1,15 @@
+@@ -0,0 +1,19 @@
++2014-07-17 Yvan Roux <yvan.roux@linaro.org>
++
++ GCC Linaro 4.9-2014.07 released.
++
+2014-06-25 Yvan Roux <yvan.roux@linaro.org>
+
+ GCC Linaro 4.9-2014.06-1 released.
@@ -622,7 +714,11 @@ LANG=C svn diff svn://gcc.gnu.org/svn/gcc/branches/gcc-4_9-branch@211979 \
+ GCC Linaro 4.9-2014.04 released.
--- a/src/libgcc/ChangeLog.linaro
+++ b/src/libgcc/ChangeLog.linaro
-@@ -0,0 +1,15 @@
+@@ -0,0 +1,19 @@
++2014-07-17 Yvan Roux <yvan.roux@linaro.org>
++
++ GCC Linaro 4.9-2014.07 released.
++
+2014-06-25 Yvan Roux <yvan.roux@linaro.org>
+
+ GCC Linaro 4.9-2014.06-1 released.
@@ -640,7 +736,11 @@ LANG=C svn diff svn://gcc.gnu.org/svn/gcc/branches/gcc-4_9-branch@211979 \
+ GCC Linaro 4.9-2014.04 released.
--- a/src/libgcc/config/libbid/ChangeLog.linaro
+++ b/src/libgcc/config/libbid/ChangeLog.linaro
-@@ -0,0 +1,15 @@
+@@ -0,0 +1,19 @@
++2014-07-17 Yvan Roux <yvan.roux@linaro.org>
++
++ GCC Linaro 4.9-2014.07 released.
++
+2014-06-25 Yvan Roux <yvan.roux@linaro.org>
+
+ GCC Linaro 4.9-2014.06-1 released.
@@ -658,7 +758,11 @@ LANG=C svn diff svn://gcc.gnu.org/svn/gcc/branches/gcc-4_9-branch@211979 \
+ GCC Linaro 4.9-2014.04 released.
--- a/src/libdecnumber/ChangeLog.linaro
+++ b/src/libdecnumber/ChangeLog.linaro
-@@ -0,0 +1,15 @@
+@@ -0,0 +1,19 @@
++2014-07-17 Yvan Roux <yvan.roux@linaro.org>
++
++ GCC Linaro 4.9-2014.07 released.
++
+2014-06-25 Yvan Roux <yvan.roux@linaro.org>
+
+ GCC Linaro 4.9-2014.06-1 released.
@@ -677,10 +781,14 @@ LANG=C svn diff svn://gcc.gnu.org/svn/gcc/branches/gcc-4_9-branch@211979 \
--- a/src/gcc/LINARO-VERSION
+++ b/src/gcc/LINARO-VERSION
@@ -0,0 +1 @@
-+4.9-2014.06-1
++4.9-2014.07-1~dev
--- a/src/gcc/c-family/ChangeLog.linaro
+++ b/src/gcc/c-family/ChangeLog.linaro
-@@ -0,0 +1,15 @@
+@@ -0,0 +1,19 @@
++2014-07-17 Yvan Roux <yvan.roux@linaro.org>
++
++ GCC Linaro 4.9-2014.07 released.
++
+2014-06-25 Yvan Roux <yvan.roux@linaro.org>
+
+ GCC Linaro 4.9-2014.06-1 released.
@@ -698,7 +806,11 @@ LANG=C svn diff svn://gcc.gnu.org/svn/gcc/branches/gcc-4_9-branch@211979 \
+ GCC Linaro 4.9-2014.04 released.
--- a/src/gcc/java/ChangeLog.linaro
+++ b/src/gcc/java/ChangeLog.linaro
-@@ -0,0 +1,15 @@
+@@ -0,0 +1,19 @@
++2014-07-17 Yvan Roux <yvan.roux@linaro.org>
++
++ GCC Linaro 4.9-2014.07 released.
++
+2014-06-25 Yvan Roux <yvan.roux@linaro.org>
+
+ GCC Linaro 4.9-2014.06-1 released.
@@ -714,9 +826,268 @@ LANG=C svn diff svn://gcc.gnu.org/svn/gcc/branches/gcc-4_9-branch@211979 \
+2014-04-22 Yvan Roux <yvan.roux@linaro.org>
+
+ GCC Linaro 4.9-2014.04 released.
+--- a/src/gcc/c/c-parser.c
++++ b/src/gcc/c/c-parser.c
+@@ -4210,7 +4210,8 @@
+ init.original_type = NULL;
+ c_parser_error (parser, "expected identifier");
+ c_parser_skip_until_found (parser, CPP_COMMA, NULL);
+- process_init_element (init, false, braced_init_obstack);
++ process_init_element (input_location, init, false,
++ braced_init_obstack);
+ return;
+ }
+ }
+@@ -4342,7 +4343,8 @@
+ init.original_type = NULL;
+ c_parser_error (parser, "expected %<=%>");
+ c_parser_skip_until_found (parser, CPP_COMMA, NULL);
+- process_init_element (init, false, braced_init_obstack);
++ process_init_element (input_location, init, false,
++ braced_init_obstack);
+ return;
+ }
+ }
+@@ -4363,11 +4365,12 @@
+ {
+ struct c_expr init;
+ gcc_assert (!after || c_dialect_objc ());
++ location_t loc = c_parser_peek_token (parser)->location;
++
+ if (c_parser_next_token_is (parser, CPP_OPEN_BRACE) && !after)
+ init = c_parser_braced_init (parser, NULL_TREE, true);
+ else
+ {
+- location_t loc = c_parser_peek_token (parser)->location;
+ init = c_parser_expr_no_commas (parser, after);
+ if (init.value != NULL_TREE
+ && TREE_CODE (init.value) != STRING_CST
+@@ -4374,7 +4377,7 @@
+ && TREE_CODE (init.value) != COMPOUND_LITERAL_EXPR)
+ init = convert_lvalue_to_rvalue (loc, init, true, true);
+ }
+- process_init_element (init, false, braced_init_obstack);
++ process_init_element (loc, init, false, braced_init_obstack);
+ }
+
+ /* Parse a compound statement (possibly a function body) (C90 6.6.2,
+--- a/src/gcc/c/c-typeck.c
++++ b/src/gcc/c/c-typeck.c
+@@ -102,8 +102,8 @@
+ static char *print_spelling (char *);
+ static void warning_init (int, const char *);
+ static tree digest_init (location_t, tree, tree, tree, bool, bool, int);
+-static void output_init_element (tree, tree, bool, tree, tree, int, bool,
+- struct obstack *);
++static void output_init_element (location_t, tree, tree, bool, tree, tree, int,
++ bool, struct obstack *);
+ static void output_pending_init_elements (int, struct obstack *);
+ static int set_designator (int, struct obstack *);
+ static void push_range_stack (tree, struct obstack *);
+@@ -7183,13 +7183,15 @@
+ if ((TREE_CODE (constructor_type) == RECORD_TYPE
+ || TREE_CODE (constructor_type) == UNION_TYPE)
+ && constructor_fields == 0)
+- process_init_element (pop_init_level (1, braced_init_obstack),
++ process_init_element (input_location,
++ pop_init_level (1, braced_init_obstack),
+ true, braced_init_obstack);
+ else if (TREE_CODE (constructor_type) == ARRAY_TYPE
+ && constructor_max_index
+ && tree_int_cst_lt (constructor_max_index,
+ constructor_index))
+- process_init_element (pop_init_level (1, braced_init_obstack),
++ process_init_element (input_location,
++ pop_init_level (1, braced_init_obstack),
+ true, braced_init_obstack);
+ else
+ break;
+@@ -7389,10 +7391,9 @@
+ /* When we come to an explicit close brace,
+ pop any inner levels that didn't have explicit braces. */
+ while (constructor_stack->implicit)
+- {
+- process_init_element (pop_init_level (1, braced_init_obstack),
+- true, braced_init_obstack);
+- }
++ process_init_element (input_location,
++ pop_init_level (1, braced_init_obstack),
++ true, braced_init_obstack);
+ gcc_assert (!constructor_range_stack);
+ }
+
+@@ -7570,10 +7571,9 @@
+ /* Designator list starts at the level of closest explicit
+ braces. */
+ while (constructor_stack->implicit)
+- {
+- process_init_element (pop_init_level (1, braced_init_obstack),
+- true, braced_init_obstack);
+- }
++ process_init_element (input_location,
++ pop_init_level (1, braced_init_obstack),
++ true, braced_init_obstack);
+ constructor_designated = 1;
+ return 0;
+ }
+@@ -8193,9 +8193,9 @@
+ existing initializer. */
+
+ static void
+-output_init_element (tree value, tree origtype, bool strict_string, tree type,
+- tree field, int pending, bool implicit,
+- struct obstack * braced_init_obstack)
++output_init_element (location_t loc, tree value, tree origtype,
++ bool strict_string, tree type, tree field, int pending,
++ bool implicit, struct obstack * braced_init_obstack)
+ {
+ tree semantic_type = NULL_TREE;
+ bool maybe_const = true;
+@@ -8293,8 +8293,8 @@
+
+ if (semantic_type)
+ value = build1 (EXCESS_PRECISION_EXPR, semantic_type, value);
+- value = digest_init (input_location, type, value, origtype, npc,
+- strict_string, require_constant_value);
++ value = digest_init (loc, type, value, origtype, npc, strict_string,
++ require_constant_value);
+ if (value == error_mark_node)
+ {
+ constructor_erroneous = 1;
+@@ -8421,8 +8421,8 @@
+ {
+ if (tree_int_cst_equal (elt->purpose,
+ constructor_unfilled_index))
+- output_init_element (elt->value, elt->origtype, true,
+- TREE_TYPE (constructor_type),
++ output_init_element (input_location, elt->value, elt->origtype,
++ true, TREE_TYPE (constructor_type),
+ constructor_unfilled_index, 0, false,
+ braced_init_obstack);
+ else if (tree_int_cst_lt (constructor_unfilled_index,
+@@ -8476,8 +8476,8 @@
+ if (tree_int_cst_equal (elt_bitpos, ctor_unfilled_bitpos))
+ {
+ constructor_unfilled_fields = elt->purpose;
+- output_init_element (elt->value, elt->origtype, true,
+- TREE_TYPE (elt->purpose),
++ output_init_element (input_location, elt->value, elt->origtype,
++ true, TREE_TYPE (elt->purpose),
+ elt->purpose, 0, false,
+ braced_init_obstack);
+ }
+@@ -8550,7 +8550,7 @@
+ existing initializer. */
+
+ void
+-process_init_element (struct c_expr value, bool implicit,
++process_init_element (location_t loc, struct c_expr value, bool implicit,
+ struct obstack * braced_init_obstack)
+ {
+ tree orig_value = value.value;
+@@ -8594,7 +8594,7 @@
+ if ((TREE_CODE (constructor_type) == RECORD_TYPE
+ || TREE_CODE (constructor_type) == UNION_TYPE)
+ && constructor_fields == 0)
+- process_init_element (pop_init_level (1, braced_init_obstack),
++ process_init_element (loc, pop_init_level (1, braced_init_obstack),
+ true, braced_init_obstack);
+ else if ((TREE_CODE (constructor_type) == ARRAY_TYPE
+ || TREE_CODE (constructor_type) == VECTOR_TYPE)
+@@ -8601,7 +8601,7 @@
+ && constructor_max_index
+ && tree_int_cst_lt (constructor_max_index,
+ constructor_index))
+- process_init_element (pop_init_level (1, braced_init_obstack),
++ process_init_element (loc, pop_init_level (1, braced_init_obstack),
+ true, braced_init_obstack);
+ else
+ break;
+@@ -8679,7 +8679,7 @@
+ if (value.value)
+ {
+ push_member_name (constructor_fields);
+- output_init_element (value.value, value.original_type,
++ output_init_element (loc, value.value, value.original_type,
+ strict_string, fieldtype,
+ constructor_fields, 1, implicit,
+ braced_init_obstack);
+@@ -8771,7 +8771,7 @@
+ if (value.value)
+ {
+ push_member_name (constructor_fields);
+- output_init_element (value.value, value.original_type,
++ output_init_element (loc, value.value, value.original_type,
+ strict_string, fieldtype,
+ constructor_fields, 1, implicit,
+ braced_init_obstack);
+@@ -8823,7 +8823,7 @@
+ if (value.value)
+ {
+ push_array_bounds (tree_to_uhwi (constructor_index));
+- output_init_element (value.value, value.original_type,
++ output_init_element (loc, value.value, value.original_type,
+ strict_string, elttype,
+ constructor_index, 1, implicit,
+ braced_init_obstack);
+@@ -8858,7 +8858,7 @@
+ {
+ if (TREE_CODE (value.value) == VECTOR_CST)
+ elttype = TYPE_MAIN_VARIANT (constructor_type);
+- output_init_element (value.value, value.original_type,
++ output_init_element (loc, value.value, value.original_type,
+ strict_string, elttype,
+ constructor_index, 1, implicit,
+ braced_init_obstack);
+@@ -8887,7 +8887,7 @@
+ else
+ {
+ if (value.value)
+- output_init_element (value.value, value.original_type,
++ output_init_element (loc, value.value, value.original_type,
+ strict_string, constructor_type,
+ NULL_TREE, 1, implicit,
+ braced_init_obstack);
+@@ -8906,8 +8906,8 @@
+ while (constructor_stack != range_stack->stack)
+ {
+ gcc_assert (constructor_stack->implicit);
+- process_init_element (pop_init_level (1,
+- braced_init_obstack),
++ process_init_element (loc,
++ pop_init_level (1, braced_init_obstack),
+ true, braced_init_obstack);
+ }
+ for (p = range_stack;
+@@ -8915,7 +8915,8 @@
+ p = p->prev)
+ {
+ gcc_assert (constructor_stack->implicit);
+- process_init_element (pop_init_level (1, braced_init_obstack),
++ process_init_element (loc,
++ pop_init_level (1, braced_init_obstack),
+ true, braced_init_obstack);
+ }
+
+--- a/src/gcc/c/c-tree.h
++++ b/src/gcc/c/c-tree.h
+@@ -612,7 +612,8 @@
+ extern struct c_expr pop_init_level (int, struct obstack *);
+ extern void set_init_index (tree, tree, struct obstack *);
+ extern void set_init_label (tree, struct obstack *);
+-extern void process_init_element (struct c_expr, bool, struct obstack *);
++extern void process_init_element (location_t, struct c_expr, bool,
++ struct obstack *);
+ extern tree build_compound_literal (location_t, tree, tree, bool);
+ extern void check_compound_literal_type (location_t, struct c_type_name *);
+ extern tree c_start_case (location_t, location_t, tree);
--- a/src/gcc/c/ChangeLog.linaro
+++ b/src/gcc/c/ChangeLog.linaro
-@@ -0,0 +1,15 @@
+@@ -0,0 +1,19 @@
++2014-07-17 Yvan Roux <yvan.roux@linaro.org>
++
++ GCC Linaro 4.9-2014.07 released.
++
+2014-06-25 Yvan Roux <yvan.roux@linaro.org>
+
+ GCC Linaro 4.9-2014.06-1 released.
@@ -773,7 +1144,11 @@ LANG=C svn diff svn://gcc.gnu.org/svn/gcc/branches/gcc-4_9-branch@211979 \
#if HAVE_DLFCN_H
--- a/src/gcc/objc/ChangeLog.linaro
+++ b/src/gcc/objc/ChangeLog.linaro
-@@ -0,0 +1,15 @@
+@@ -0,0 +1,19 @@
++2014-07-17 Yvan Roux <yvan.roux@linaro.org>
++
++ GCC Linaro 4.9-2014.07 released.
++
+2014-06-25 Yvan Roux <yvan.roux@linaro.org>
+
+ GCC Linaro 4.9-2014.06-1 released.
@@ -791,7 +1166,1819 @@ LANG=C svn diff svn://gcc.gnu.org/svn/gcc/branches/gcc-4_9-branch@211979 \
+ GCC Linaro 4.9-2014.04 released.
--- a/src/gcc/ChangeLog.linaro
+++ b/src/gcc/ChangeLog.linaro
-@@ -0,0 +1,836 @@
+@@ -0,0 +1,2648 @@
++2014-07-20 Yvan Roux <yvan.roux@linaro.org>
++
++ Revert:
++ 2014-07-16 Yvan Roux <yvan.roux@linaro.org>
++
++ Backport from trunk r211129.
++ 2014-06-02 Ramana Radhakrishnan <ramana.radhakrishnan@arm.com>
++
++ PR target/61154
++ * config/arm/arm.h (TARGET_SUPPORTS_WIDE_INT): Define.
++ * config/arm/arm.md (mov64 splitter): Replace const_double_operand
++ with immediate_operand.
++
++2014-07-19 Yvan Roux <yvan.roux@linaro.org>
++
++ * LINARO-VERSION: Bump version.
++
++2014-07-17 Yvan Roux <yvan.roux@linaro.org>
++
++ GCC Linaro 4.9-2014.07 released.
++ * LINARO-VERSION: Update.
++
++2014-07-17 Yvan Roux <yvan.roux@linaro.org>
++
++ Backport from trunk r211887, r211899.
++ 2014-06-23 James Greenhalgh <james.greenhalgh@arm.com>
++
++ * config/aarch64/aarch64.md (addsi3_aarch64): Set "simd" attr to
++ "yes" where needed.
++
++ 2014-06-23 James Greenhalgh <james.greenhalgh@arm.com>
++
++ * config/aarch64/aarch64.md (*addsi3_aarch64): Add alternative in
++ vector registers.
++
++2014-07-17 Yvan Roux <yvan.roux@linaro.org>
++
++ Backport from trunk r211440.
++ 2014-06-11 Kyrylo Tkachov <kyrylo.tkachov@arm.com>
++
++ * config.gcc (aarch64*-*-*): Add arm_acle.h to extra headers.
++ * Makefile.in (TEXI_GCC_FILES): Add aarch64-acle-intrinsics.texi to
++ dependencies.
++ * config/aarch64/aarch64-builtins.c (AARCH64_CRC32_BUILTINS): Define.
++ (aarch64_crc_builtin_datum): New struct.
++ (aarch64_crc_builtin_data): New.
++ (aarch64_init_crc32_builtins): New function.
++ (aarch64_init_builtins): Initialise CRC32 builtins when appropriate.
++ (aarch64_crc32_expand_builtin): New.
++ (aarch64_expand_builtin): Add CRC32 builtin expansion case.
++ * config/aarch64/aarch64.h (TARGET_CPU_CPP_BUILTINS): Define
++ __ARM_FEATURE_CRC32 when appropriate.
++ (TARGET_CRC32): Define.
++ * config/aarch64/aarch64.md (UNSPEC_CRC32B, UNSPEC_CRC32H,
++ UNSPEC_CRC32W, UNSPEC_CRC32X, UNSPEC_CRC32CB, UNSPEC_CRC32CH,
++ UNSPEC_CRC32CW, UNSPEC_CRC32CX): New unspec values.
++ (aarch64_<crc_variant>): New pattern.
++ * config/aarch64/arm_acle.h: New file.
++ * config/aarch64/iterators.md (CRC): New int iterator.
++ (crc_variant, crc_mode): New int attributes.
++ * doc/aarch64-acle-intrinsics.texi: New file.
++ * doc/extend.texi (aarch64): Document aarch64 ACLE intrinsics.
++ Include aarch64-acle-intrinsics.texi.
++
++2014-07-17 Yvan Roux <yvan.roux@linaro.org>
++
++ Backport from trunk r211174.
++ 2014-06-03 Alan Lawrence <alan.lawrence@arm.com>
++
++ * config/aarch64/aarch64-simd.md (aarch64_rev<REVERSE:rev-op><mode>):
++ New pattern.
++ * config/aarch64/aarch64.c (aarch64_evpc_rev): New function.
++ (aarch64_expand_vec_perm_const_1): Add call to aarch64_evpc_rev.
++ * config/aarch64/iterators.md (REVERSE): New iterator.
++ (UNSPEC_REV64, UNSPEC_REV32, UNSPEC_REV16): New enum elements.
++ (rev_op): New int_attribute.
++ * config/aarch64/arm_neon.h (vrev16_p8, vrev16_s8, vrev16_u8,
++ vrev16q_p8, vrev16q_s8, vrev16q_u8, vrev32_p8, vrev32_p16, vrev32_s8,
++ vrev32_s16, vrev32_u8, vrev32_u16, vrev32q_p8, vrev32q_p16, vrev32q_s8,
++ vrev32q_s16, vrev32q_u8, vrev32q_u16, vrev64_f32, vrev64_p8,
++ vrev64_p16, vrev64_s8, vrev64_s16, vrev64_s32, vrev64_u8, vrev64_u16,
++ vrev64_u32, vrev64q_f32, vrev64q_p8, vrev64q_p16, vrev64q_s8,
++ vrev64q_s16, vrev64q_s32, vrev64q_u8, vrev64q_u16, vrev64q_u32):
++ Replace temporary __asm__ with __builtin_shuffle.
++
++2014-07-17 Yvan Roux <yvan.roux@linaro.org>
++
++ Backport from trunk r210216, r210218, r210219.
++ 2014-05-08 Ramana Radhakrishnan <ramana.radhakrishnan@arm.com>
++
++ * config/arm/arm_neon.h: Update comment.
++ * config/arm/neon-docgen.ml: Delete.
++ * config/arm/neon-gen.ml: Delete.
++ * doc/arm-neon-intrinsics.texi: Update comment.
++
++ 2014-05-08 Ramana Radhakrishnan <ramana.radhakrishnan@arm.com>
++
++ * config/arm/arm_neon_builtins.def (vadd, vsub): Only define the v2sf
++ and v4sf versions.
++ (vand, vorr, veor, vorn, vbic): Remove.
++ * config/arm/neon.md (neon_vadd, neon_vsub, neon_vadd_unspec): Adjust
++ iterator.
++ (neon_vsub_unspec): Likewise.
++ (neon_vorr, neon_vand, neon_vbic, neon_veor, neon_vorn): Remove.
++
++ 2014-05-08 Ramana Radhakrishnan <ramana.radhakrishnan@arm.com>
++
++ * config/arm/arm_neon.h (vadd_s8): GNU C implementation
++ (vadd_s16): Likewise.
++ (vadd_s32): Likewise.
++ (vadd_f32): Likewise.
++ (vadd_u8): Likewise.
++ (vadd_u16): Likewise.
++ (vadd_u32): Likewise.
++ (vadd_s64): Likewise.
++ (vadd_u64): Likewise.
++ (vaddq_s8): Likewise.
++ (vaddq_s16): Likewise.
++ (vaddq_s32): Likewise.
++ (vaddq_s64): Likewise.
++ (vaddq_f32): Likewise.
++ (vaddq_u8): Likewise.
++ (vaddq_u16): Likewise.
++ (vaddq_u32): Likewise.
++ (vaddq_u64): Likewise.
++ (vmul_s8): Likewise.
++ (vmul_s16): Likewise.
++ (vmul_s32): Likewise.
++ (vmul_f32): Likewise.
++ (vmul_u8): Likewise.
++ (vmul_u16): Likewise.
++ (vmul_u32): Likewise.
++ (vmul_p8): Likewise.
++ (vmulq_s8): Likewise.
++ (vmulq_s16): Likewise.
++ (vmulq_s32): Likewise.
++ (vmulq_f32): Likewise.
++ (vmulq_u8): Likewise.
++ (vmulq_u16): Likewise.
++ (vmulq_u32): Likewise.
++ (vsub_s8): Likewise.
++ (vsub_s16): Likewise.
++ (vsub_s32): Likewise.
++ (vsub_f32): Likewise.
++ (vsub_u8): Likewise.
++ (vsub_u16): Likewise.
++ (vsub_u32): Likewise.
++ (vsub_s64): Likewise.
++ (vsub_u64): Likewise.
++ (vsubq_s8): Likewise.
++ (vsubq_s16): Likewise.
++ (vsubq_s32): Likewise.
++ (vsubq_s64): Likewise.
++ (vsubq_f32): Likewise.
++ (vsubq_u8): Likewise.
++ (vsubq_u16): Likewise.
++ (vsubq_u32): Likewise.
++ (vsubq_u64): Likewise.
++ (vand_s8): Likewise.
++ (vand_s16): Likewise.
++ (vand_s32): Likewise.
++ (vand_u8): Likewise.
++ (vand_u16): Likewise.
++ (vand_u32): Likewise.
++ (vand_s64): Likewise.
++ (vand_u64): Likewise.
++ (vandq_s8): Likewise.
++ (vandq_s16): Likewise.
++ (vandq_s32): Likewise.
++ (vandq_s64): Likewise.
++ (vandq_u8): Likewise.
++ (vandq_u16): Likewise.
++ (vandq_u32): Likewise.
++ (vandq_u64): Likewise.
++ (vorr_s8): Likewise.
++ (vorr_s16): Likewise.
++ (vorr_s32): Likewise.
++ (vorr_u8): Likewise.
++ (vorr_u16): Likewise.
++ (vorr_u32): Likewise.
++ (vorr_s64): Likewise.
++ (vorr_u64): Likewise.
++ (vorrq_s8): Likewise.
++ (vorrq_s16): Likewise.
++ (vorrq_s32): Likewise.
++ (vorrq_s64): Likewise.
++ (vorrq_u8): Likewise.
++ (vorrq_u16): Likewise.
++ (vorrq_u32): Likewise.
++ (vorrq_u64): Likewise.
++ (veor_s8): Likewise.
++ (veor_s16): Likewise.
++ (veor_s32): Likewise.
++ (veor_u8): Likewise.
++ (veor_u16): Likewise.
++ (veor_u32): Likewise.
++ (veor_s64): Likewise.
++ (veor_u64): Likewise.
++ (veorq_s8): Likewise.
++ (veorq_s16): Likewise.
++ (veorq_s32): Likewise.
++ (veorq_s64): Likewise.
++ (veorq_u8): Likewise.
++ (veorq_u16): Likewise.
++ (veorq_u32): Likewise.
++ (veorq_u64): Likewise.
++ (vbic_s8): Likewise.
++ (vbic_s16): Likewise.
++ (vbic_s32): Likewise.
++ (vbic_u8): Likewise.
++ (vbic_u16): Likewise.
++ (vbic_u32): Likewise.
++ (vbic_s64): Likewise.
++ (vbic_u64): Likewise.
++ (vbicq_s8): Likewise.
++ (vbicq_s16): Likewise.
++ (vbicq_s32): Likewise.
++ (vbicq_s64): Likewise.
++ (vbicq_u8): Likewise.
++ (vbicq_u16): Likewise.
++ (vbicq_u32): Likewise.
++ (vbicq_u64): Likewise.
++ (vorn_s8): Likewise.
++ (vorn_s16): Likewise.
++ (vorn_s32): Likewise.
++ (vorn_u8): Likewise.
++ (vorn_u16): Likewise.
++ (vorn_u32): Likewise.
++ (vorn_s64): Likewise.
++ (vorn_u64): Likewise.
++ (vornq_s8): Likewise.
++ (vornq_s16): Likewise.
++ (vornq_s32): Likewise.
++ (vornq_s64): Likewise.
++ (vornq_u8): Likewise.
++ (vornq_u16): Likewise.
++ (vornq_u32): Likewise.
++ (vornq_u64): Likewise.
++
++2014-07-16 Yvan Roux <yvan.roux@linaro.org>
++
++ Backport from trunk r210151.
++ 2014-05-07 Alan Lawrence <alan.lawrence@arm.com>
++
++ * config/aarch64/arm_neon.h (vtrn1_f32, vtrn1_p8, vtrn1_p16, vtrn1_s8,
++ vtrn1_s16, vtrn1_s32, vtrn1_u8, vtrn1_u16, vtrn1_u32, vtrn1q_f32,
++ vtrn1q_f64, vtrn1q_p8, vtrn1q_p16, vtrn1q_s8, vtrn1q_s16, vtrn1q_s32,
++ vtrn1q_s64, vtrn1q_u8, vtrn1q_u16, vtrn1q_u32, vtrn1q_u64, vtrn2_f32,
++ vtrn2_p8, vtrn2_p16, vtrn2_s8, vtrn2_s16, vtrn2_s32, vtrn2_u8,
++ vtrn2_u16, vtrn2_u32, vtrn2q_f32, vtrn2q_f64, vtrn2q_p8, vtrn2q_p16,
++ vtrn2q_s8, vtrn2q_s16, vtrn2q_s32, vtrn2q_s64, vtrn2q_u8, vtrn2q_u16,
++ vtrn2q_u32, vtrn2q_u64): Replace temporary asm with __builtin_shuffle.
++
++2014-07-16 Yvan Roux <yvan.roux@linaro.org>
++
++ Backport from trunk r209794.
++ 2014-04-25 Marek Polacek <polacek@redhat.com>
++
++ PR c/60114
++ * c-parser.c (c_parser_initelt): Pass input_location to
++ process_init_element.
++ (c_parser_initval): Pass loc to process_init_element.
++ * c-tree.h (process_init_element): Adjust declaration.
++ * c-typeck.c (push_init_level): Pass input_location to
++ process_init_element.
++ (pop_init_level): Likewise.
++ (set_designator): Likewise.
++ (output_init_element): Add location_t parameter. Pass loc to
++ digest_init.
++ (output_pending_init_elements): Pass input_location to
++ output_init_element.
++ (process_init_element): Add location_t parameter. Pass loc to
++ output_init_element.
++
++2014-07-16 Yvan Roux <yvan.roux@linaro.org>
++
++ Backport from trunk r211771.
++ 2014-06-18 Kyrylo Tkachov <kyrylo.tkachov@arm.com>
++
++ * genattrtab.c (n_bypassed): New variable.
++ (process_bypasses): Initialise n_bypassed.
++ Count number of bypassed reservations.
++ (make_automaton_attrs): Allocate space for bypassed reservations
++ rather than number of bypasses.
++
++2014-07-16 Yvan Roux <yvan.roux@linaro.org>
++
++ Backport from trunk r210861.
++ 2014-05-23 Jiong Wang <jiong.wang@arm.com>
++
++ * config/aarch64/predicates.md (aarch64_call_insn_operand): New
++ predicate.
++ * config/aarch64/constraints.md ("Ucs", "Usf"): New constraints.
++ * config/aarch64/aarch64.md (*sibcall_insn, *sibcall_value_insn):
++ Adjust for tailcalling through registers.
++ * config/aarch64/aarch64.h (enum reg_class): New caller save
++ register class.
++ (REG_CLASS_NAMES): Likewise.
++ (REG_CLASS_CONTENTS): Likewise.
++ * config/aarch64/aarch64.c (aarch64_function_ok_for_sibcall):
++ Allow tailcalling without decls.
++
++2014-07-16 Yvan Roux <yvan.roux@linaro.org>
++
++ Backport from trunk r211314.
++ 2014-06-06 James Greenhalgh <james.greenhalgh@arm.com>
++
++ * config/aarch64/aarch64-protos.h (aarch64_expand_movmem): New.
++ * config/aarch64/aarch64.c (aarch64_move_pointer): New.
++ (aarch64_progress_pointer): Likewise.
++ (aarch64_copy_one_part_and_move_pointers): Likewise.
++ (aarch64_expand_movmen): Likewise.
++ * config/aarch64/aarch64.h (MOVE_RATIO): Set low.
++ * config/aarch64/aarch64.md (movmem<mode>): New.
++
++2014-07-16 Yvan Roux <yvan.roux@linaro.org>
++
++ Backport from trunk r211185, 211186.
++ 2014-06-03 Alan Lawrence <alan.lawrence@arm.com>
++
++ * gcc/config/aarch64/aarch64-builtins.c
++ (aarch64_types_binop_uus_qualifiers,
++ aarch64_types_shift_to_unsigned_qualifiers,
++ aarch64_types_unsigned_shiftacc_qualifiers): Define.
++ * gcc/config/aarch64/aarch64-simd-builtins.def (uqshl, uqrshl, uqadd,
++ uqsub, usqadd, usra_n, ursra_n, uqshrn_n, uqrshrn_n, usri_n, usli_n,
++ sqshlu_n, uqshl_n): Update qualifiers.
++ * gcc/config/aarch64/arm_neon.h (vqadd_u8, vqadd_u16, vqadd_u32,
++ vqadd_u64, vqaddq_u8, vqaddq_u16, vqaddq_u32, vqaddq_u64, vqsub_u8,
++ vqsub_u16, vqsub_u32, vqsub_u64, vqsubq_u8, vqsubq_u16, vqsubq_u32,
++ vqsubq_u64, vqaddb_u8, vqaddh_u16, vqadds_u32, vqaddd_u64, vqrshl_u8,
++ vqrshl_u16, vqrshl_u32, vqrshl_u64, vqrshlq_u8, vqrshlq_u16,
++ vqrshlq_u32, vqrshlq_u64, vqrshlb_u8, vqrshlh_u16, vqrshls_u32,
++ vqrshld_u64, vqrshrn_n_u16, vqrshrn_n_u32, vqrshrn_n_u64,
++ vqrshrnh_n_u16, vqrshrns_n_u32, vqrshrnd_n_u64, vqshl_u8, vqshl_u16,
++ vqshl_u32, vqshl_u64, vqshlq_u8, vqshlq_u16, vqshlq_u32, vqshlq_u64,
++ vqshlb_u8, vqshlh_u16, vqshls_u32, vqshld_u64, vqshl_n_u8, vqshl_n_u16,
++ vqshl_n_u32, vqshl_n_u64, vqshlq_n_u8, vqshlq_n_u16, vqshlq_n_u32,
++ vqshlq_n_u64, vqshlb_n_u8, vqshlh_n_u16, vqshls_n_u32, vqshld_n_u64,
++ vqshlu_n_s8, vqshlu_n_s16, vqshlu_n_s32, vqshlu_n_s64, vqshluq_n_s8,
++ vqshluq_n_s16, vqshluq_n_s32, vqshluq_n_s64, vqshlub_n_s8,
++ vqshluh_n_s16, vqshlus_n_s32, vqshlud_n_s64, vqshrn_n_u16,
++ vqshrn_n_u32, vqshrn_n_u64, vqshrnh_n_u16, vqshrns_n_u32,
++ vqshrnd_n_u64, vqsubb_u8, vqsubh_u16, vqsubs_u32, vqsubd_u64,
++ vrsra_n_u8, vrsra_n_u16, vrsra_n_u32, vrsra_n_u64, vrsraq_n_u8,
++ vrsraq_n_u16, vrsraq_n_u32, vrsraq_n_u64, vrsrad_n_u64, vsli_n_u8,
++ vsli_n_u16, vsli_n_u32,vsli_n_u64, vsliq_n_u8, vsliq_n_u16,
++ vsliq_n_u32, vsliq_n_u64, vslid_n_u64, vsqadd_u8, vsqadd_u16,
++ vsqadd_u32, vsqadd_u64, vsqaddq_u8, vsqaddq_u16, vsqaddq_u32,
++ vsqaddq_u64, vsqaddb_u8, vsqaddh_u16, vsqadds_u32, vsqaddd_u64,
++ vsra_n_u8, vsra_n_u16, vsra_n_u32, vsra_n_u64, vsraq_n_u8,
++ vsraq_n_u16, vsraq_n_u32, vsraq_n_u64, vsrad_n_u64, vsri_n_u8,
++ vsri_n_u16, vsri_n_u32, vsri_n_u64, vsriq_n_u8, vsriq_n_u16,
++ vsriq_n_u32, vsriq_n_u64, vsrid_n_u64): Remove casts.
++
++ 2014-06-03 Alan Lawrence <alan.lawrence@arm.com>
++
++ * gcc/config/aarch64/aarch64-builtins.c
++ (aarch64_types_binop_ssu_qualifiers): New static data.
++ (TYPES_BINOP_SSU): Define.
++ * gcc/config/aarch64/aarch64-simd-builtins.def (suqadd, ushl, urshl,
++ urshr_n, ushll_n): Use appropriate unsigned qualifiers. 47
++ * gcc/config/aarch64/arm_neon.h (vrshl_u8, vrshl_u16, vrshl_u32,
++ vrshl_u64, vrshlq_u8, vrshlq_u16, vrshlq_u32, vrshlq_u64, vrshld_u64,
++ vrshr_n_u8, vrshr_n_u16, vrshr_n_u32, vrshr_n_u64, vrshrq_n_u8, 50
++ vrshrq_n_u16, vrshrq_n_u32, vrshrq_n_u64, vrshrd_n_u64, vshll_n_u8,
++ vshll_n_u16, vshll_n_u32, vuqadd_s8, vuqadd_s16, vuqadd_s32, 52
++ vuqadd_s64, vuqaddq_s8, vuqaddq_s16, vuqaddq_s32, vuqaddq_s64, 53
++ vuqaddb_s8, vuqaddh_s16, vuqadds_s32, vuqaddd_s64): Add signedness
++ suffix to builtin function name, remove cast. 55
++ (vshl_s8, vshl_s16, vshl_s32, vshl_s64, vshl_u8, vshl_u16, vshl_u32,
++ vshl_u64, vshlq_s8, vshlq_s16, vshlq_s32, vshlq_s64, vshlq_u8, 57
++ vshlq_u16, vshlq_u32, vshlq_u64, vshld_s64, vshld_u64): Remove cast.
++
++2014-07-16 Yvan Roux <yvan.roux@linaro.org>
++
++ Backport from trunk r211408, 211416.
++ 2014-06-10 Marcus Shawcroft <marcus.shawcroft@arm.com>
++
++ * config/aarch64/aarch64.c (aarch64_save_or_restore_fprs): Fix
++ REG_CFA_RESTORE mode.
++
++ 2014-06-10 Jiong Wang <jiong.wang@arm.com>
++
++ * config/aarch64/aarch64.c (aarch64_save_or_restore_fprs)
++ (aarch64_save_or_restore_callee_save_registers): Fix layout.
++
++2014-07-16 Yvan Roux <yvan.roux@linaro.org>
++
++ Backport from trunk r211418.
++ 2014-06-10 Kyrylo Tkachov <kyrylo.tkachov@arm.com>
++
++ * config/aarch64/aarch64-simd.md (move_lo_quad_<mode>):
++ Change second alternative type to f_mcr.
++ * config/aarch64/aarch64.md (*movsi_aarch64): Change 11th
++ and 12th alternatives' types to f_mcr and f_mrc.
++ (*movdi_aarch64): Same for 12th and 13th alternatives.
++ (*movsf_aarch64): Change 9th alternatives' type to mov_reg.
++ (aarch64_movtilow_tilow): Change type to fmov.
++
++2014-07-16 Yvan Roux <yvan.roux@linaro.org>
++
++ Backport from trunk r211371.
++ 2014-06-09 Ramana Radhakrishnan <ramana.radhakrishnan@arm.com>
++
++ * config/arm/arm-modes.def: Remove XFmode.
++
++2014-07-16 Yvan Roux <yvan.roux@linaro.org>
++
++ Backport from trunk r211268.
++ 2014-06-05 Marcus Shawcroft <marcus.shawcroft@arm.com>
++
++ * config/aarch64/aarch64.c (aarch64_expand_prologue): Update stack
++ layout comment.
++
++2014-07-16 Yvan Roux <yvan.roux@linaro.org>
++
++ Backport from trunk r211129.
++ 2014-06-02 Ramana Radhakrishnan <ramana.radhakrishnan@arm.com>
++
++ PR target/61154
++ * config/arm/arm.h (TARGET_SUPPORTS_WIDE_INT): Define.
++ * config/arm/arm.md (mov64 splitter): Replace const_double_operand
++ with immediate_operand.
++
++2014-07-16 Yvan Roux <yvan.roux@linaro.org>
++
++ Backport from trunk r211073.
++ 2014-05-30 Kyrylo Tkachov <kyrylo.tkachov@arm.com>
++
++ * config/arm/thumb2.md (*thumb2_movhi_insn): Set type of movw
++ to mov_imm.
++ * config/arm/vfp.md (*thumb2_movsi_vfp): Likewise.
++
++2014-07-16 Yvan Roux <yvan.roux@linaro.org>
++
++ Backport from trunk r211050.
++ 2014-05-29 Richard Earnshaw <rearnsha@arm.com>
++ Richard Sandiford <rdsandiford@googlemail.com>
++
++ * arm/iterators.md (shiftable_ops): New code iterator.
++ (t2_binop0, arith_shift_insn): New code attributes.
++ * arm/predicates.md (shift_nomul_operator): New predicate.
++ * arm/arm.md (insn_enabled): Delete.
++ (enabled): Remove insn_enabled test.
++ (*arith_shiftsi): Delete. Replace with ...
++ (*<arith_shift_insn>_multsi): ... new pattern.
++ (*<arith_shift_insn>_shiftsi): ... new pattern.
++ * config/arm/arm.c (arm_print_operand): Handle operand format 'b'.
++
++2014-07-16 Yvan Roux <yvan.roux@linaro.org>
++
++ Backport from trunk r210996.
++ 2014-05-27 Andrew Pinski <apinski@cavium.com>
++
++ * config/aarch64/aarch64.md (stack_protect_set_<mode>):
++ Use <w> for the register in assembly template.
++ (stack_protect_test): Use the mode of operands[0] for the
++ result.
++ (stack_protect_test_<mode>): Use <w> for the register
++ in assembly template.
++
++2014-07-16 Yvan Roux <yvan.roux@linaro.org>
++
++ Backport from trunk r210967.
++ 2014-05-27 Kyrylo Tkachov <kyrylo.tkachov@arm.com>
++
++ * config/arm/neon.md (neon_bswap<mode>): New pattern.
++ * config/arm/arm.c (neon_itype): Add NEON_BSWAP.
++ (arm_init_neon_builtins): Handle NEON_BSWAP.
++ Define required type nodes.
++ (arm_expand_neon_builtin): Handle NEON_BSWAP.
++ (arm_builtin_vectorized_function): Handle BUILTIN_BSWAP builtins.
++ * config/arm/arm_neon_builtins.def (bswap): Define builtins.
++ * config/arm/iterators.md (VDQHSD): New mode iterator.
++
++2014-07-16 Yvan Roux <yvan.roux@linaro.org>
++
++ Backport from trunk r210471.
++ 2014-05-15 Kyrylo Tkachov <kyrylo.tkachov@arm.com>
++
++ * config/arm/arm.c (arm_option_override): Use the SCHED_PRESSURE_MODEL
++ enum name for PARAM_SCHED_PRESSURE_ALGORITHM.
++
++2014-07-16 Yvan Roux <yvan.roux@linaro.org>
++
++ Backport from trunk r210369.
++ 2014-05-13 Kyrylo Tkachov <kyrylo.tkachov@arm.com>
++
++ * config/arm/arm.c (neon_itype): Remove NEON_RESULTPAIR.
++ (arm_init_neon_builtins): Remove handling of NEON_RESULTPAIR.
++ Remove associated type declarations and initialisations.
++ (arm_expand_neon_builtin): Likewise.
++ (neon_emit_pair_result_insn): Delete.
++ * config/arm/arm_neon_builtins (vtrn, vzip, vuzp): Delete.
++ * config/arm/neon.md (neon_vtrn<mode>): Delete.
++ (neon_vzip<mode>): Likewise.
++ (neon_vuzp<mode>): Likewise.
++
++2014-07-16 Yvan Roux <yvan.roux@linaro.org>
++
++ Backport from trunk r211058, 211177.
++ 2014-05-29 Alan Lawrence <alan.lawrence@arm.com>
++
++ * config/aarch64/aarch64-builtins.c (aarch64_types_binopv_qualifiers,
++ TYPES_BINOPV): New static data.
++ * config/aarch64/aarch64-simd-builtins.def (im_lane_bound): New builtin.
++ * config/aarch64/aarch64-simd.md (aarch64_ext, aarch64_im_lane_boundsi):
++ New patterns.
++ * config/aarch64/aarch64.c (aarch64_expand_vec_perm_const_1): Match
++ patterns for EXT.
++ (aarch64_evpc_ext): New function.
++
++ * config/aarch64/iterators.md (UNSPEC_EXT): New enum element.
++
++ * config/aarch64/arm_neon.h (vext_f32, vext_f64, vext_p8, vext_p16,
++ vext_s8, vext_s16, vext_s32, vext_s64, vext_u8, vext_u16, vext_u32,
++ vext_u64, vextq_f32, vextq_f64, vextq_p8, vextq_p16, vextq_s8,
++ vextq_s16, vextq_s32, vextq_s64, vextq_u8, vextq_u16, vextq_u32,
++ vextq_u64): Replace __asm with __builtin_shuffle and im_lane_boundsi.
++
++ 2014-06-03 Alan Lawrence <alan.lawrence@arm.com>
++
++ * config/aarch64/aarch64.c (aarch64_evpc_ext): allow and handle
++ location == 0.
++
++2014-07-16 Yvan Roux <yvan.roux@linaro.org>
++
++ Backport from trunk r209797.
++ 2014-04-25 Kyrylo Tkachov <kyrylo.tkachov@arm.com>
++
++ * config/arm/aarch-common.c (aarch_rev16_shright_mask_imm_p):
++ Use HOST_WIDE_INT_C for mask literal.
++ (aarch_rev16_shleft_mask_imm_p): Likewise.
++
++2014-07-16 Yvan Roux <yvan.roux@linaro.org>
++
++ Backport from trunk r211148.
++ 2014-06-02 Andrew Pinski <apinski@cavium.com>
++
++ * config/aarch64/aarch64-linux.h (GLIBC_DYNAMIC_LINKER):
++ /lib/ld-linux32-aarch64.so.1 is used for ILP32.
++ (LINUX_TARGET_LINK_SPEC): Update linker script for ILP32.
++ file whose name depends on -mabi= and -mbig-endian.
++ * config/aarch64/t-aarch64-linux (MULTILIB_OSDIRNAMES): Handle LP64
++ better and handle ilp32 too.
++ (MULTILIB_OPTIONS): Delete.
++ (MULTILIB_DIRNAMES): Delete.
++
++2014-07-16 Yvan Roux <yvan.roux@linaro.org>
++
++ Backport from trunk r210828, r211103.
++ 2014-05-31 Kugan Vivekanandarajah <kuganv@linaro.org>
++
++ * config/arm/arm.c (TARGET_ATOMIC_ASSIGN_EXPAND_FENV): New define.
++ (arm_builtins) : Add ARM_BUILTIN_GET_FPSCR and ARM_BUILTIN_SET_FPSCR.
++ (bdesc_2arg) : Add description for builtins __builtins_arm_set_fpscr
++ and __builtins_arm_get_fpscr.
++ (arm_init_builtins) : Initialize builtins __builtins_arm_set_fpscr and
++ __builtins_arm_get_fpscr.
++ (arm_expand_builtin) : Expand builtins __builtins_arm_set_fpscr and
++ __builtins_arm_ldfpscr.
++ (arm_atomic_assign_expand_fenv): New function.
++ * config/arm/vfp.md (set_fpscr): New pattern.
++ (get_fpscr) : Likewise.
++ * config/arm/unspecs.md (unspecv): Add VUNSPEC_GET_FPSCR and
++ VUNSPEC_SET_FPSCR.
++ * doc/extend.texi (AARCH64 Built-in Functions) : Document
++ __builtins_arm_set_fpscr, __builtins_arm_get_fpscr.
++
++ 2014-05-23 Kugan Vivekanandarajah <kuganv@linaro.org>
++
++ * config/aarch64/aarch64.c (TARGET_ATOMIC_ASSIGN_EXPAND_FENV): New
++ define.
++ * config/aarch64/aarch64-protos.h (aarch64_atomic_assign_expand_fenv):
++ New function declaration.
++ * config/aarch64/aarch64-builtins.c (aarch64_builtins) : Add
++ AARCH64_BUILTIN_GET_FPCR, AARCH64_BUILTIN_SET_FPCR.
++ AARCH64_BUILTIN_GET_FPSR and AARCH64_BUILTIN_SET_FPSR.
++ (aarch64_init_builtins) : Initialize builtins
++ __builtins_aarch64_set_fpcr, __builtins_aarch64_get_fpcr.
++ __builtins_aarch64_set_fpsr and __builtins_aarch64_get_fpsr.
++ (aarch64_expand_builtin) : Expand builtins __builtins_aarch64_set_fpcr
++ __builtins_aarch64_get_fpcr, __builtins_aarch64_get_fpsr,
++ and __builtins_aarch64_set_fpsr.
++ (aarch64_atomic_assign_expand_fenv): New function.
++ * config/aarch64/aarch64.md (set_fpcr): New pattern.
++ (get_fpcr) : Likewise.
++ (set_fpsr) : Likewise.
++ (get_fpsr) : Likewise.
++ (unspecv): Add UNSPECV_GET_FPCR and UNSPECV_SET_FPCR, UNSPECV_GET_FPSR
++ and UNSPECV_SET_FPSR.
++ * doc/extend.texi (AARCH64 Built-in Functions) : Document
++ __builtins_aarch64_set_fpcr, __builtins_aarch64_get_fpcr.
++ __builtins_aarch64_set_fpsr and __builtins_aarch64_get_fpsr.
++
++2014-07-16 Yvan Roux <yvan.roux@linaro.org>
++
++ Backport from trunk r210355.
++ 2014-05-13 Ian Bolton <ian.bolton@arm.com>
++
++ * config/aarch64/aarch64-protos.h
++ (aarch64_hard_regno_caller_save_mode): New prototype.
++ * config/aarch64/aarch64.c (aarch64_hard_regno_caller_save_mode):
++ New function.
++ * config/aarch64/aarch64.h (HARD_REGNO_CALLER_SAVE_MODE): New macro.
++
++2014-07-16 Yvan Roux <yvan.roux@linaro.org>
++
++ Backport from trunk r209943.
++ 2014-04-30 Alan Lawrence <alan.lawrence@arm.com>
++
++ * config/aarch64/arm_neon.h (vuzp1_f32, vuzp1_p8, vuzp1_p16, vuzp1_s8,
++ vuzp1_s16, vuzp1_s32, vuzp1_u8, vuzp1_u16, vuzp1_u32, vuzp1q_f32,
++ vuzp1q_f64, vuzp1q_p8, vuzp1q_p16, vuzp1q_s8, vuzp1q_s16, vuzp1q_s32,
++ vuzp1q_s64, vuzp1q_u8, vuzp1q_u16, vuzp1q_u32, vuzp1q_u64, vuzp2_f32,
++ vuzp2_p8, vuzp2_p16, vuzp2_s8, vuzp2_s16, vuzp2_s32, vuzp2_u8,
++ vuzp2_u16, vuzp2_u32, vuzp2q_f32, vuzp2q_f64, vuzp2q_p8, vuzp2q_p16,
++ vuzp2q_s8, vuzp2q_s16, vuzp2q_s32, vuzp2q_s64, vuzp2q_u8, vuzp2q_u16,
++ vuzp2q_u32, vuzp2q_u64): Replace temporary asm with __builtin_shuffle.
++
++2014-06-26 Yvan Roux <yvan.roux@linaro.org>
++
++ * LINARO-VERSION: Bump version.
++
++2014-06-25 Yvan Roux <yvan.roux@linaro.org>
++
++ GCC Linaro 4.9-2014.06-1 released.
++ * LINARO-VERSION: Update.
++
++2014-06-24 Yvan Roux <yvan.roux@linaro.org>
++
++ Revert:
++ 2014-05-23 Yvan Roux <yvan.roux@linaro.org>
++
++ Backport from trunk r209643.
++ 2014-04-22 Ramana Radhakrishnan <ramana.radhakrishnan@arm.com>
++
++ * config/aarch64/aarch64.c (TARGET_FLAGS_REGNUM): Define.
++
++2014-06-13 Yvan Roux <yvan.roux@linaro.org>
++
++ Backport from trunk r210493, 210494, 210495, 210496, 210497, 210498,
++ 210499, 210500, 210501, 210502, 210503, 210504, 210505, 210506, 210507,
++ 210508, 210509, 210510, 210512, 211205, 211206.
++ 2014-05-16 James Greenhalgh <james.greenhalgh@arm.com>
++
++ * config/aarch64/aarch64-protos.h (scale_addr_mode_cost): New.
++ (cpu_addrcost_table): Use it.
++ * config/aarch64/aarch64.c (generic_addrcost_table): Initialize it.
++ (aarch64_address_cost): Rewrite using aarch64_classify_address,
++ move it.
++
++ 2014-05-16 James Greenhalgh <james.greenhalgh@arm.com>
++
++ * config/aarch64/aarch64.c (cortexa57_addrcost_table): New.
++ (cortexa57_vector_cost): Likewise.
++ (cortexa57_tunings): Use them.
++
++ 2014-05-16 James Greenhalgh <james.greenhalgh@arm.com>
++
++ * config/aarch64/aarch64.c (aarch64_rtx_costs_wrapper): New.
++ (TARGET_RTX_COSTS): Call it.
++
++ 2014-05-16 James Greenhalgh <james.greenhalgh@arm.com>
++ Philipp Tomsich <philipp.tomsich@theobroma-systems.com>
++
++ * config/aarch64/aarch64.c (aarch64_build_constant): Conditionally
++ emit instructions, return number of instructions which would
++ be emitted.
++ (aarch64_add_constant): Update call to aarch64_build_constant.
++ (aarch64_output_mi_thunk): Likewise.
++ (aarch64_rtx_costs): Estimate cost of a CONST_INT, cost
++ a CONST_DOUBLE.
++
++ 2014-05-16 James Greenhalgh <james.greenhalgh@arm.com>
++ Philipp Tomsich <philipp.tomsich@theobroma-systems.com>
++
++ * config/aarch64/aarch64.c (aarch64_strip_shift_or_extend): Rename
++ to...
++ (aarch64_strip_extend): ...this, don't strip shifts, check RTX is
++ well formed.
++ (aarch64_rtx_mult_cost): New.
++ (aarch64_rtx_costs): Use it, refactor as appropriate.
++
++ 2014-05-16 James Greenhalgh <james.greenhalgh@arm.com>
++
++ * config/aarch64/aarch64.c (aarch64_rtx_costs): Set default costs.
++
++ 2014-05-16 James Greenhalgh <james.greenhalgh@arm.com>
++ Philip Tomsich <philipp.tomsich@theobroma-systems.com>
++
++ * config/aarch64/aarch64.c (aarch64_rtx_costs): Improve costing
++ for SET RTX.
++
++ 2014-05-16 James Greenhalgh <james.greenhalgh@arm.com>
++ Philipp Tomsich <philipp.tomsich@theobroma-systems.com>
++
++ * config/aarch64/aarch64.c (aarch64_rtx_costs): Use address
++ costs when costing loads and stores to memory.
++
++ 2014-05-16 James Greenhalgh <james.greenhalgh@arm.com>
++ Philipp Tomsich <philipp.tomsich@theobroma-systems.com>
++
++ * config/aarch64/aarch64.c (aarch64_rtx_costs): Improve cost for
++ logical operations.
++
++ 2014-05-16 James Greenhalgh <james.greenhalgh@arm.com>
++ Philipp Tomsich <philipp.tomsich@theobroma-systems.com>
++
++ * config/aarch64/aarch64.c (aarch64_rtx_costs): Cost
++ ZERO_EXTEND and SIGN_EXTEND better.
++
++ 2014-05-16 James Greenhalgh <james.greenhalgh@arm.com>
++ Philipp Tomsich <philipp.tomsich@theobroma-systems.com>
++
++ * config/aarch64/aarch64.c (aarch64_rtx_costs): Improve costs for
++ rotates and shifts.
++
++ 2014-03-16 James Greenhalgh <james.greenhalgh@arm.com>
++ Philipp Tomsich <philipp.tomsich@theobroma-systems.com>
++
++ * config/aarch64/aarch64.c (aarch64_rtx_arith_op_extract_p): New.
++ (aarch64_rtx_costs): Improve costs for SIGN/ZERO_EXTRACT.
++
++ 2014-05-16 James Greenhalgh <james.greenhalgh@arm.com>
++ Philipp Tomsich <philipp.tomsich@theobroma-systems.com>
++
++ * config/aarch64/aarch64.c (aarch64_rtx_costs): Improve costs for
++ DIV/MOD.
++
++ 2014-05-16 James Greenhalgh <james.greenhalgh@arm.com>
++ Philipp Tomsich <philipp.tomsich@theobroma-systems.com>
++
++ * config/aarch64/aarch64.c (aarch64_rtx_costs): Cost comparison
++ operators.
++
++ 2014-05-16 James Greenhalgh <james.greenhalgh@arm.com>
++ Philipp Tomsich <philipp.tomsich@theobroma-systems.com>
++
++ * config/aarch64/aarch64.c (aarch64_rtx_costs): Cost FMA,
++ FLOAT_EXTEND, FLOAT_TRUNCATE, ABS, SMAX, and SMIN.
++
++ 2014-05-16 James Greenhalgh <james.greenhalgh@arm.com>
++ Philipp Tomsich <philipp.tomsich@theobroma-systems.com>
++
++ * config/aarch64/aarch64.c (aarch64_rtx_costs): Cost TRUNCATE.
++
++ 2014-05-16 James Greenhalgh <james.greenhalgh@arm.com>
++
++ * config/aarch64/aarch64.c (aarch64_rtx_costs): Cost SYMBOL_REF,
++ HIGH, LO_SUM.
++
++ 2014-05-16 James Greenhalgh <james.greenhalgh@arm.com>
++
++ * config/aarch64/aarch64.c (aarch64_rtx_costs): Handle the case
++ where we were unable to cost an RTX.
++
++ 2014-05-16 James Greenhalgh <james.greenhalgh@arm.com>
++
++ * config/aarch64/aarch64.c (aarch64_rtx_mult_cost): Fix FNMUL case.
++
++ 2014-06-03 Andrew Pinski <apinski@cavium.com>
++
++ * config/aarch64/aarch64.c (aarch64_if_then_else_costs): New function.
++ (aarch64_rtx_costs): Use aarch64_if_then_else_costs.
++
++ 2014-06-03 Andrew Pinski <apinski@cavium.com>
++
++ * config/aarch64/aarch64.c (aarch64_if_then_else_costs): Allow non
++ comparisons for OP0.
++
++2014-06-13 Yvan Roux <yvan.roux@linaro.org>
++
++ * LINARO-VERSION: Bump version.
++
++2014-06-12 Yvan Roux <yvan.roux@linaro.org>
++
++ GCC Linaro 4.9-2014.06 released.
++ * LINARO-VERSION: Update.
++
++2014-06-04 Yvan Roux <yvan.roux@linaro.org>
++
++ Backport from trunk r211211.
++ 2014-06-04 Bin Cheng <bin.cheng@arm.com>
++
++ * config/aarch64/aarch64.c (aarch64_classify_address)
++ (aarch64_legitimize_reload_address): Support full addressing modes
++ for vector modes.
++ * config/aarch64/aarch64.md (mov<mode>, movmisalign<mode>)
++ (*aarch64_simd_mov<mode>, *aarch64_simd_mov<mode>): Relax predicates.
++
++2014-05-25 Yvan Roux <yvan.roux@linaro.org>
++
++ Backport from trunk r209906.
++ 2014-04-29 Alan Lawrence <alan.lawrence@arm.com>
++
++ * config/aarch64/arm_neon.h (vzip1_f32, vzip1_p8, vzip1_p16, vzip1_s8,
++ vzip1_s16, vzip1_s32, vzip1_u8, vzip1_u16, vzip1_u32, vzip1q_f32,
++ vzip1q_f64, vzip1q_p8, vzip1q_p16, vzip1q_s8, vzip1q_s16, vzip1q_s32,
++ vzip1q_s64, vzip1q_u8, vzip1q_u16, vzip1q_u32, vzip1q_u64, vzip2_f32,
++ vzip2_p8, vzip2_p16, vzip2_s8, vzip2_s16, vzip2_s32, vzip2_u8,
++ vzip2_u16, vzip2_u32, vzip2q_f32, vzip2q_f64, vzip2q_p8, vzip2q_p16,
++ vzip2q_s8, vzip2q_s16, vzip2q_s32, vzip2q_s64, vzip2q_u8, vzip2q_u16,
++ vzip2q_u32, vzip2q_u64): Replace inline __asm__ with __builtin_shuffle.
++
++2014-05-25 Yvan Roux <yvan.roux@linaro.org>
++
++ Backport from trunk r209897.
++ 2014-04-29 James Greenhalgh <james.greenhalgh@arm.com>
++
++ * calls.c (initialize_argument_information): Always treat
++ PUSH_ARGS_REVERSED as 1, simplify code accordingly.
++ (expand_call): Likewise.
++ (emit_library_call_calue_1): Likewise.
++ * expr.c (PUSH_ARGS_REVERSED): Do not define.
++ (emit_push_insn): Always treat PUSH_ARGS_REVERSED as 1, simplify
++ code accordingly.
++
++2014-05-25 Yvan Roux <yvan.roux@linaro.org>
++
++ Backport from trunk r209880.
++ 2014-04-28 James Greenhalgh <james.greenhalgh@arm.com>
++
++ * config/aarch64/aarch64-builtins.c
++ (aarch64_types_storestruct_lane_qualifiers): New.
++ (TYPES_STORESTRUCT_LANE): Likewise.
++ * config/aarch64/aarch64-simd-builtins.def (st2_lane): New.
++ (st3_lane): Likewise.
++ (st4_lane): Likewise.
++ * config/aarch64/aarch64-simd.md (vec_store_lanesoi_lane<mode>): New.
++ (vec_store_lanesci_lane<mode>): Likewise.
++ (vec_store_lanesxi_lane<mode>): Likewise.
++ (aarch64_st2_lane<VQ:mode>): Likewise.
++ (aarch64_st3_lane<VQ:mode>): Likewise.
++ (aarch64_st4_lane<VQ:mode>): Likewise.
++ * config/aarch64/aarch64.md (unspec): Add UNSPEC_ST{2,3,4}_LANE.
++ * config/aarch64/arm_neon.h
++ (__ST2_LANE_FUNC): Rewrite using builtins, update use points to
++ use new macro arguments.
++ (__ST3_LANE_FUNC): Likewise.
++ (__ST4_LANE_FUNC): Likewise.
++ * config/aarch64/iterators.md (V_TWO_ELEM): New.
++ (V_THREE_ELEM): Likewise.
++ (V_FOUR_ELEM): Likewise.
++
++2014-05-25 Yvan Roux <yvan.roux@linaro.org>
++
++ Backport from trunk r209878.
++ 2014-04-28 James Greenhalgh <james.greenhalgh@arm.com>
++
++ * config/aarch64/aarch64-protos.h (aarch64_modes_tieable_p): New.
++ * config/aarch64/aarch64.c
++ (aarch64_cannot_change_mode_class): Weaken conditions.
++ (aarch64_modes_tieable_p): New.
++ * config/aarch64/aarch64.h (MODES_TIEABLE_P): Use it.
++
++2014-05-25 Yvan Roux <yvan.roux@linaro.org>
++
++ Backport from trunk r209808.
++ 2014-04-25 Jiong Wang <jiong.wang@arm.com>
++
++ * config/arm/predicates.md (call_insn_operand): Add long_call check.
++ * config/arm/arm.md (sibcall, sibcall_value): Force the address to
++ reg for long_call.
++ * config/arm/arm.c (arm_function_ok_for_sibcall): Remove long_call
++ restriction.
++
++2014-05-25 Yvan Roux <yvan.roux@linaro.org>
++
++ Backport from trunk r209806.
++ 2014-04-25 Kyrylo Tkachov <kyrylo.tkachov@arm.com>
++
++ * config/arm/arm.c (arm_cortex_a8_tune): Initialise
++ T16-related fields.
++
++2014-05-25 Yvan Roux <yvan.roux@linaro.org>
++
++ Backport from trunk r209742, 209749.
++ 2014-04-24 Alan Lawrence <alan.lawrence@arm.com>
++
++ * config/aarch64/aarch64.c (aarch64_evpc_tbl): Enable for bigendian.
++
++ 2014-04-24 Tejas Belagod <tejas.belagod@arm.com>
++
++ * config/aarch64/aarch64.c (aarch64_evpc_tbl): Reverse order of elements
++ for big-endian.
++
++2014-05-23 Yvan Roux <yvan.roux@linaro.org>
++
++ Backport from trunk r209736.
++ 2014-04-24 Kyrylo Tkachov <kyrylo.tkachov@arm.com>
++
++ * config/aarch64/aarch64-builtins.c
++ (aarch64_builtin_vectorized_function): Handle BUILT_IN_BSWAP16,
++ BUILT_IN_BSWAP32, BUILT_IN_BSWAP64.
++ * config/aarch64/aarch64-simd.md (bswap<mode>): New pattern.
++ * config/aarch64/aarch64-simd-builtins.def: Define vector bswap
++ builtins.
++ * config/aarch64/iterator.md (VDQHSD): New mode iterator.
++ (Vrevsuff): New mode attribute.
++
++2014-05-23 Yvan Roux <yvan.roux@linaro.org>
++
++ Backport from trunk r209712.
++ 2014-04-23 Venkataramanan Kumar <venkataramanan.kumar@linaro.org>
++
++ * config/aarch64/aarch64.md (stack_protect_set, stack_protect_test)
++ (stack_protect_set_<mode>, stack_protect_test_<mode>): Add
++ machine descriptions for Stack Smashing Protector.
++
++2014-05-23 Yvan Roux <yvan.roux@linaro.org>
++
++ Backport from trunk r209711.
++ 2014-04-23 Richard Earnshaw <rearnsha@arm.com>
++
++ * aarch64.md (<optab>_rol<mode>3): New pattern.
++ (<optab>_rolsi3_uxtw): Likewise.
++ * aarch64.c (aarch64_strip_shift): Handle ROTATE and ROTATERT.
++
++2014-05-23 Yvan Roux <yvan.roux@linaro.org>
++
++ Backport from trunk r209710.
++ 2014-04-23 James Greenhalgh <james.greenhalgh@arm.com>
++
++ * config/arm/arm.c (arm_cortex_a57_tune): Initialize all fields.
++ (arm_cortex_a12_tune): Likewise.
++
++2014-05-23 Yvan Roux <yvan.roux@linaro.org>
++
++ Backport from trunk r209706.
++ 2014-04-23 Kyrylo Tkachov <kyrylo.tkachov@arm.com>
++
++ * config/aarch64/aarch64.c (aarch64_rtx_costs): Handle BSWAP.
++
++2014-05-23 Yvan Roux <yvan.roux@linaro.org>
++
++ Backport from trunk r209701, 209702, 209703, 209704, 209705.
++ 2014-04-23 Kyrylo Tkachov <kyrylo.tkachov@arm.com>
++
++ * config/arm/arm.md (arm_rev16si2): New pattern.
++ (arm_rev16si2_alt): Likewise.
++ * config/arm/arm.c (arm_new_rtx_costs): Handle rev16 case.
++
++ 2014-04-23 Kyrylo Tkachov <kyrylo.tkachov@arm.com>
++ * config/aarch64/aarch64.md (rev16<mode>2): New pattern.
++ (rev16<mode>2_alt): Likewise.
++ * config/aarch64/aarch64.c (aarch64_rtx_costs): Handle rev16 case.
++ * config/arm/aarch-common.c (aarch_rev16_shright_mask_imm_p): New.
++ (aarch_rev16_shleft_mask_imm_p): Likewise.
++ (aarch_rev16_p_1): Likewise.
++ (aarch_rev16_p): Likewise.
++ * config/arm/aarch-common-protos.h (aarch_rev16_p): Declare extern.
++ (aarch_rev16_shright_mask_imm_p): Likewise.
++ (aarch_rev16_shleft_mask_imm_p): Likewise.
++
++ 2014-04-23 Kyrylo Tkachov <kyrylo.tkachov@arm.com>
++
++ * config/arm/aarch-common-protos.h (alu_cost_table): Add rev field.
++ * config/arm/aarch-cost-tables.h (generic_extra_costs): Specify
++ rev cost.
++ (cortex_a53_extra_costs): Likewise.
++ (cortex_a57_extra_costs): Likewise.
++ * config/arm/arm.c (cortexa9_extra_costs): Likewise.
++ (cortexa7_extra_costs): Likewise.
++ (cortexa8_extra_costs): Likewise.
++ (cortexa12_extra_costs): Likewise.
++ (cortexa15_extra_costs): Likewise.
++ (v7m_extra_costs): Likewise.
++ (arm_new_rtx_costs): Handle BSWAP.
++
++ 2013-04-23 Kyrylo Tkachov <kyrylo.tkachov@arm.com>
++
++ * config/arm/arm.c (cortexa8_extra_costs): New table.
++ (arm_cortex_a8_tune): New tuning struct.
++ * config/arm/arm-cores.def (cortex-a8): Use cortex_a8 tuning struct.
++
++ 2014-04-23 Kyrylo Tkachov <kyrylo.tkachov@arm.com>
++
++ * config/arm/arm.c (arm_new_rtx_costs): Handle FMA.
++
++2014-05-23 Yvan Roux <yvan.roux@linaro.org>
++
++ Backport from trunk r209659.
++ 2014-04-22 Richard Henderson <rth@redhat.com>
++
++ * config/aarch64/aarch64 (addti3, subti3): New expanders.
++ (add<GPI>3_compare0): Remove leading * from name.
++ (add<GPI>3_carryin): Likewise.
++ (sub<GPI>3_compare0): Likewise.
++ (sub<GPI>3_carryin): Likewise.
++ (<su_optab>mulditi3): New expander.
++ (multi3): New expander.
++ (madd<GPI>): Remove leading * from name.
++
++2014-05-23 Yvan Roux <yvan.roux@linaro.org>
++
++ Backport from trunk r209645.
++ 2014-04-22 Andrew Pinski <apinski@cavium.com>
++
++ * config/aarch64/aarch64.c (aarch64_load_symref_appropriately):
++ Handle TLS for ILP32.
++ * config/aarch64/aarch64.md (tlsie_small): Rename to ...
++ (tlsie_small_<mode>): this and handle PTR.
++ (tlsie_small_sidi): New pattern.
++ (tlsle_small): Change to an expand to handle ILP32.
++ (tlsle_small_<mode>): New pattern.
++ (tlsdesc_small): Rename to ...
++ (tlsdesc_small_<mode>): this and handle PTR.
++
++2014-05-23 Yvan Roux <yvan.roux@linaro.org>
++
++ Backport from trunk r209643.
++ 2014-04-22 Ramana Radhakrishnan <ramana.radhakrishnan@arm.com>
++
++ * config/aarch64/aarch64.c (TARGET_FLAGS_REGNUM): Define.
++
++2014-05-23 Yvan Roux <yvan.roux@linaro.org>
++
++ Backport from trunk r209641, 209642.
++ 2014-04-22 Alex Velenko <Alex.Velenko@arm.com>
++
++ * config/aarch64/aarch64-builtins.c (TYPES_REINTERP): Removed.
++ (aarch64_types_signed_unsigned_qualifiers): Qualifier added.
++ (aarch64_types_signed_poly_qualifiers): Likewise.
++ (aarch64_types_unsigned_signed_qualifiers): Likewise.
++ (aarch64_types_poly_signed_qualifiers): Likewise.
++ (TYPES_REINTERP_SS): Type macro added.
++ (TYPES_REINTERP_SU): Likewise.
++ (TYPES_REINTERP_SP): Likewise.
++ (TYPES_REINTERP_US): Likewise.
++ (TYPES_REINTERP_PS): Likewise.
++ (aarch64_fold_builtin): New expression folding added.
++ * config/aarch64/aarch64-simd-builtins.def (REINTERP):
++ Declarations removed.
++ (REINTERP_SS): Declarations added.
++ (REINTERP_US): Likewise.
++ (REINTERP_PS): Likewise.
++ (REINTERP_SU): Likewise.
++ (REINTERP_SP): Likewise.
++ * config/aarch64/arm_neon.h (vreinterpret_p8_f64): Implemented.
++ (vreinterpretq_p8_f64): Likewise.
++ (vreinterpret_p16_f64): Likewise.
++ (vreinterpretq_p16_f64): Likewise.
++ (vreinterpret_f32_f64): Likewise.
++ (vreinterpretq_f32_f64): Likewise.
++ (vreinterpret_f64_f32): Likewise.
++ (vreinterpret_f64_p8): Likewise.
++ (vreinterpret_f64_p16): Likewise.
++ (vreinterpret_f64_s8): Likewise.
++ (vreinterpret_f64_s16): Likewise.
++ (vreinterpret_f64_s32): Likewise.
++ (vreinterpret_f64_s64): Likewise.
++ (vreinterpret_f64_u8): Likewise.
++ (vreinterpret_f64_u16): Likewise.
++ (vreinterpret_f64_u32): Likewise.
++ (vreinterpret_f64_u64): Likewise.
++ (vreinterpretq_f64_f32): Likewise.
++ (vreinterpretq_f64_p8): Likewise.
++ (vreinterpretq_f64_p16): Likewise.
++ (vreinterpretq_f64_s8): Likewise.
++ (vreinterpretq_f64_s16): Likewise.
++ (vreinterpretq_f64_s32): Likewise.
++ (vreinterpretq_f64_s64): Likewise.
++ (vreinterpretq_f64_u8): Likewise.
++ (vreinterpretq_f64_u16): Likewise.
++ (vreinterpretq_f64_u32): Likewise.
++ (vreinterpretq_f64_u64): Likewise.
++ (vreinterpret_s64_f64): Likewise.
++ (vreinterpretq_s64_f64): Likewise.
++ (vreinterpret_u64_f64): Likewise.
++ (vreinterpretq_u64_f64): Likewise.
++ (vreinterpret_s8_f64): Likewise.
++ (vreinterpretq_s8_f64): Likewise.
++ (vreinterpret_s16_f64): Likewise.
++ (vreinterpretq_s16_f64): Likewise.
++ (vreinterpret_s32_f64): Likewise.
++ (vreinterpretq_s32_f64): Likewise.
++ (vreinterpret_u8_f64): Likewise.
++ (vreinterpretq_u8_f64): Likewise.
++ (vreinterpret_u16_f64): Likewise.
++ (vreinterpretq_u16_f64): Likewise.
++ (vreinterpret_u32_f64): Likewise.
++ (vreinterpretq_u32_f64): Likewise.
++
++ 2014-04-22 Alex Velenko <Alex.Velenko@arm.com>
++
++ * config/aarch64/aarch64/aarch64-builtins.c (TYPES_REINTERP): Removed.
++ * config/aarch64/aarch64/aarch64-simd-builtins.def (REINTERP): Removed.
++ (vreinterpret_p8_s8): Likewise.
++ * config/aarch64/aarch64/arm_neon.h (vreinterpret_p8_s8): Uses cast.
++ (vreinterpret_p8_s16): Likewise.
++ (vreinterpret_p8_s32): Likewise.
++ (vreinterpret_p8_s64): Likewise.
++ (vreinterpret_p8_f32): Likewise.
++ (vreinterpret_p8_u8): Likewise.
++ (vreinterpret_p8_u16): Likewise.
++ (vreinterpret_p8_u32): Likewise.
++ (vreinterpret_p8_u64): Likewise.
++ (vreinterpret_p8_p16): Likewise.
++ (vreinterpretq_p8_s8): Likewise.
++ (vreinterpretq_p8_s16): Likewise.
++ (vreinterpretq_p8_s32): Likewise.
++ (vreinterpretq_p8_s64): Likewise.
++ (vreinterpretq_p8_f32): Likewise.
++ (vreinterpretq_p8_u8): Likewise.
++ (vreinterpretq_p8_u16): Likewise.
++ (vreinterpretq_p8_u32): Likewise.
++ (vreinterpretq_p8_u64): Likewise.
++ (vreinterpretq_p8_p16): Likewise.
++ (vreinterpret_p16_s8): Likewise.
++ (vreinterpret_p16_s16): Likewise.
++ (vreinterpret_p16_s32): Likewise.
++ (vreinterpret_p16_s64): Likewise.
++ (vreinterpret_p16_f32): Likewise.
++ (vreinterpret_p16_u8): Likewise.
++ (vreinterpret_p16_u16): Likewise.
++ (vreinterpret_p16_u32): Likewise.
++ (vreinterpret_p16_u64): Likewise.
++ (vreinterpret_p16_p8): Likewise.
++ (vreinterpretq_p16_s8): Likewise.
++ (vreinterpretq_p16_s16): Likewise.
++ (vreinterpretq_p16_s32): Likewise.
++ (vreinterpretq_p16_s64): Likewise.
++ (vreinterpretq_p16_f32): Likewise.
++ (vreinterpretq_p16_u8): Likewise.
++ (vreinterpretq_p16_u16): Likewise.
++ (vreinterpretq_p16_u32): Likewise.
++ (vreinterpretq_p16_u64): Likewise.
++ (vreinterpretq_p16_p8): Likewise.
++ (vreinterpret_f32_s8): Likewise.
++ (vreinterpret_f32_s16): Likewise.
++ (vreinterpret_f32_s32): Likewise.
++ (vreinterpret_f32_s64): Likewise.
++ (vreinterpret_f32_u8): Likewise.
++ (vreinterpret_f32_u16): Likewise.
++ (vreinterpret_f32_u32): Likewise.
++ (vreinterpret_f32_u64): Likewise.
++ (vreinterpret_f32_p8): Likewise.
++ (vreinterpret_f32_p16): Likewise.
++ (vreinterpretq_f32_s8): Likewise.
++ (vreinterpretq_f32_s16): Likewise.
++ (vreinterpretq_f32_s32): Likewise.
++ (vreinterpretq_f32_s64): Likewise.
++ (vreinterpretq_f32_u8): Likewise.
++ (vreinterpretq_f32_u16): Likewise.
++ (vreinterpretq_f32_u32): Likewise.
++ (vreinterpretq_f32_u64): Likewise.
++ (vreinterpretq_f32_p8): Likewise.
++ (vreinterpretq_f32_p16): Likewise.
++ (vreinterpret_s64_s8): Likewise.
++ (vreinterpret_s64_s16): Likewise.
++ (vreinterpret_s64_s32): Likewise.
++ (vreinterpret_s64_f32): Likewise.
++ (vreinterpret_s64_u8): Likewise.
++ (vreinterpret_s64_u16): Likewise.
++ (vreinterpret_s64_u32): Likewise.
++ (vreinterpret_s64_u64): Likewise.
++ (vreinterpret_s64_p8): Likewise.
++ (vreinterpret_s64_p16): Likewise.
++ (vreinterpretq_s64_s8): Likewise.
++ (vreinterpretq_s64_s16): Likewise.
++ (vreinterpretq_s64_s32): Likewise.
++ (vreinterpretq_s64_f32): Likewise.
++ (vreinterpretq_s64_u8): Likewise.
++ (vreinterpretq_s64_u16): Likewise.
++ (vreinterpretq_s64_u32): Likewise.
++ (vreinterpretq_s64_u64): Likewise.
++ (vreinterpretq_s64_p8): Likewise.
++ (vreinterpretq_s64_p16): Likewise.
++ (vreinterpret_u64_s8): Likewise.
++ (vreinterpret_u64_s16): Likewise.
++ (vreinterpret_u64_s32): Likewise.
++ (vreinterpret_u64_s64): Likewise.
++ (vreinterpret_u64_f32): Likewise.
++ (vreinterpret_u64_u8): Likewise.
++ (vreinterpret_u64_u16): Likewise.
++ (vreinterpret_u64_u32): Likewise.
++ (vreinterpret_u64_p8): Likewise.
++ (vreinterpret_u64_p16): Likewise.
++ (vreinterpretq_u64_s8): Likewise.
++ (vreinterpretq_u64_s16): Likewise.
++ (vreinterpretq_u64_s32): Likewise.
++ (vreinterpretq_u64_s64): Likewise.
++ (vreinterpretq_u64_f32): Likewise.
++ (vreinterpretq_u64_u8): Likewise.
++ (vreinterpretq_u64_u16): Likewise.
++ (vreinterpretq_u64_u32): Likewise.
++ (vreinterpretq_u64_p8): Likewise.
++ (vreinterpretq_u64_p16): Likewise.
++ (vreinterpret_s8_s16): Likewise.
++ (vreinterpret_s8_s32): Likewise.
++ (vreinterpret_s8_s64): Likewise.
++ (vreinterpret_s8_f32): Likewise.
++ (vreinterpret_s8_u8): Likewise.
++ (vreinterpret_s8_u16): Likewise.
++ (vreinterpret_s8_u32): Likewise.
++ (vreinterpret_s8_u64): Likewise.
++ (vreinterpret_s8_p8): Likewise.
++ (vreinterpret_s8_p16): Likewise.
++ (vreinterpretq_s8_s16): Likewise.
++ (vreinterpretq_s8_s32): Likewise.
++ (vreinterpretq_s8_s64): Likewise.
++ (vreinterpretq_s8_f32): Likewise.
++ (vreinterpretq_s8_u8): Likewise.
++ (vreinterpretq_s8_u16): Likewise.
++ (vreinterpretq_s8_u32): Likewise.
++ (vreinterpretq_s8_u64): Likewise.
++ (vreinterpretq_s8_p8): Likewise.
++ (vreinterpretq_s8_p16): Likewise.
++ (vreinterpret_s16_s8): Likewise.
++ (vreinterpret_s16_s32): Likewise.
++ (vreinterpret_s16_s64): Likewise.
++ (vreinterpret_s16_f32): Likewise.
++ (vreinterpret_s16_u8): Likewise.
++ (vreinterpret_s16_u16): Likewise.
++ (vreinterpret_s16_u32): Likewise.
++ (vreinterpret_s16_u64): Likewise.
++ (vreinterpret_s16_p8): Likewise.
++ (vreinterpret_s16_p16): Likewise.
++ (vreinterpretq_s16_s8): Likewise.
++ (vreinterpretq_s16_s32): Likewise.
++ (vreinterpretq_s16_s64): Likewise.
++ (vreinterpretq_s16_f32): Likewise.
++ (vreinterpretq_s16_u8): Likewise.
++ (vreinterpretq_s16_u16): Likewise.
++ (vreinterpretq_s16_u32): Likewise.
++ (vreinterpretq_s16_u64): Likewise.
++ (vreinterpretq_s16_p8): Likewise.
++ (vreinterpretq_s16_p16): Likewise.
++ (vreinterpret_s32_s8): Likewise.
++ (vreinterpret_s32_s16): Likewise.
++ (vreinterpret_s32_s64): Likewise.
++ (vreinterpret_s32_f32): Likewise.
++ (vreinterpret_s32_u8): Likewise.
++ (vreinterpret_s32_u16): Likewise.
++ (vreinterpret_s32_u32): Likewise.
++ (vreinterpret_s32_u64): Likewise.
++ (vreinterpret_s32_p8): Likewise.
++ (vreinterpret_s32_p16): Likewise.
++ (vreinterpretq_s32_s8): Likewise.
++ (vreinterpretq_s32_s16): Likewise.
++ (vreinterpretq_s32_s64): Likewise.
++ (vreinterpretq_s32_f32): Likewise.
++ (vreinterpretq_s32_u8): Likewise.
++ (vreinterpretq_s32_u16): Likewise.
++ (vreinterpretq_s32_u32): Likewise.
++ (vreinterpretq_s32_u64): Likewise.
++ (vreinterpretq_s32_p8): Likewise.
++ (vreinterpretq_s32_p16): Likewise.
++ (vreinterpret_u8_s8): Likewise.
++ (vreinterpret_u8_s16): Likewise.
++ (vreinterpret_u8_s32): Likewise.
++ (vreinterpret_u8_s64): Likewise.
++ (vreinterpret_u8_f32): Likewise.
++ (vreinterpret_u8_u16): Likewise.
++ (vreinterpret_u8_u32): Likewise.
++ (vreinterpret_u8_u64): Likewise.
++ (vreinterpret_u8_p8): Likewise.
++ (vreinterpret_u8_p16): Likewise.
++ (vreinterpretq_u8_s8): Likewise.
++ (vreinterpretq_u8_s16): Likewise.
++ (vreinterpretq_u8_s32): Likewise.
++ (vreinterpretq_u8_s64): Likewise.
++ (vreinterpretq_u8_f32): Likewise.
++ (vreinterpretq_u8_u16): Likewise.
++ (vreinterpretq_u8_u32): Likewise.
++ (vreinterpretq_u8_u64): Likewise.
++ (vreinterpretq_u8_p8): Likewise.
++ (vreinterpretq_u8_p16): Likewise.
++ (vreinterpret_u16_s8): Likewise.
++ (vreinterpret_u16_s16): Likewise.
++ (vreinterpret_u16_s32): Likewise.
++ (vreinterpret_u16_s64): Likewise.
++ (vreinterpret_u16_f32): Likewise.
++ (vreinterpret_u16_u8): Likewise.
++ (vreinterpret_u16_u32): Likewise.
++ (vreinterpret_u16_u64): Likewise.
++ (vreinterpret_u16_p8): Likewise.
++ (vreinterpret_u16_p16): Likewise.
++ (vreinterpretq_u16_s8): Likewise.
++ (vreinterpretq_u16_s16): Likewise.
++ (vreinterpretq_u16_s32): Likewise.
++ (vreinterpretq_u16_s64): Likewise.
++ (vreinterpretq_u16_f32): Likewise.
++ (vreinterpretq_u16_u8): Likewise.
++ (vreinterpretq_u16_u32): Likewise.
++ (vreinterpretq_u16_u64): Likewise.
++ (vreinterpretq_u16_p8): Likewise.
++ (vreinterpretq_u16_p16): Likewise.
++ (vreinterpret_u32_s8): Likewise.
++ (vreinterpret_u32_s16): Likewise.
++ (vreinterpret_u32_s32): Likewise.
++ (vreinterpret_u32_s64): Likewise.
++ (vreinterpret_u32_f32): Likewise.
++ (vreinterpret_u32_u8): Likewise.
++ (vreinterpret_u32_u16): Likewise.
++ (vreinterpret_u32_u64): Likewise.
++ (vreinterpret_u32_p8): Likewise.
++ (vreinterpret_u32_p16): Likewise.
++ (vreinterpretq_u32_s8): Likewise.
++ (vreinterpretq_u32_s16): Likewise.
++ (vreinterpretq_u32_s32): Likewise.
++ (vreinterpretq_u32_s64): Likewise.
++ (vreinterpretq_u32_f32): Likewise.
++ (vreinterpretq_u32_u8): Likewise.
++ (vreinterpretq_u32_u16): Likewise.
++ (vreinterpretq_u32_u64): Likewise.
++ (vreinterpretq_u32_p8): Likewise.
++ (vreinterpretq_u32_p16): Likewise.
++
++2014-05-23 Yvan Roux <yvan.roux@linaro.org>
++
++ Backport from trunk r209640.
++ 2014-04-22 Alex Velenko <Alex.Velenko@arm.com>
++
++ * gcc/config/aarch64/aarch64-simd.md (aarch64_s<optab><mode>):
++ Pattern extended.
++ * config/aarch64/aarch64-simd-builtins.def (sqneg): Iterator
++ extended.
++ (sqabs): Likewise.
++ * config/aarch64/arm_neon.h (vqneg_s64): New intrinsic.
++ (vqnegd_s64): Likewise.
++ (vqabs_s64): Likewise.
++ (vqabsd_s64): Likewise.
++
++2014-05-23 Yvan Roux <yvan.roux@linaro.org>
++
++ Backport from trunk r209627, 209636.
++ 2014-04-22 Renlin <renlin.li@arm.com>
++ Jiong Wang <jiong.wang@arm.com>
++
++ * config/aarch64/aarch64.h (aarch64_frame): Delete "fp_lr_offset".
++ * config/aarch64/aarch64.c (aarch64_layout_frame)
++ (aarch64_initial_elimination_offset): Likewise.
++
++ 2014-04-22 Marcus Shawcroft <marcus.shawcroft@arm.com>
++
++ * config/aarch64/aarch64.c (aarch64_initial_elimination_offset):
++ Fix indentation.
++
++2014-05-23 Yvan Roux <yvan.roux@linaro.org>
++
++ Backport from trunk r209618.
++ 2014-04-22 Renlin Li <Renlin.Li@arm.com>
++
++ * config/aarch64/aarch64.c (aarch64_print_operand_address): Adjust
++ the output asm format.
++
++2014-05-23 Yvan Roux <yvan.roux@linaro.org>
++
++ Backport from trunk r209617.
++ 2014-04-22 James Greenhalgh <james.greenhalgh@arm.com>
++
++ * config/aarch64/aarch64-simd.md
++ (aarch64_cm<optab>di): Always split.
++ (*aarch64_cm<optab>di): New.
++ (aarch64_cmtstdi): Always split.
++ (*aarch64_cmtstdi): New.
++
++2014-05-23 Yvan Roux <yvan.roux@linaro.org>
++
++ Backport from trunk r209615.
++ 2014-04-22 Ramana Radhakrishnan <ramana.radhakrishnan@arm.com>
++
++ * config/arm/arm.c (arm_hard_regno_mode_ok): Loosen
++ restrictions on core registers for DImode values in Thumb2.
++
++2014-05-23 Yvan Roux <yvan.roux@linaro.org>
++
++ Backport from trunk r209613, r209614.
++ 2014-04-22 Ian Bolton <ian.bolton@arm.com>
++
++ * config/arm/arm.md (*anddi_notdi_zesidi): New pattern.
++ * config/arm/thumb2.md (*iordi_notdi_zesidi): New pattern.
++
++ 2014-04-22 Ian Bolton <ian.bolton@arm.com>
++
++ * config/arm/thumb2.md (*iordi_notdi_di): New pattern.
++ (*iordi_notzesidi_di): Likewise.
++ (*iordi_notsesidi_di): Likewise.
++
++2014-05-23 Yvan Roux <yvan.roux@linaro.org>
++
++ Backport from trunk r209561.
++ 2014-04-22 Ian Bolton <ian.bolton@arm.com>
++
++ * config/arm/arm-protos.h (tune_params): New struct members.
++ * config/arm/arm.c: Initialise tune_params per processor.
++ (thumb2_reorg): Suppress conversion from t32 to t16 when optimizing
++ for speed, based on new tune_params.
++
++2014-05-23 Yvan Roux <yvan.roux@linaro.org>
++
++ Backport from trunk r209559.
++ 2014-04-22 Alex Velenko <Alex.Velenko@arm.com>
++
++ * config/aarch64/aarch64-builtins.c (BUILTIN_VDQF_DF): Macro
++ added.
++ * config/aarch64/aarch64-simd-builtins.def (frintn): Use added
++ macro.
++ * config/aarch64/aarch64-simd.md (<frint_pattern>): Comment
++ corrected.
++ * config/aarch64/aarch64.md (<frint_pattern>): Likewise.
++ * config/aarch64/arm_neon.h (vrnd_f64): Added.
++ (vrnda_f64): Likewise.
++ (vrndi_f64): Likewise.
++ (vrndm_f64): Likewise.
++ (vrndn_f64): Likewise.
++ (vrndp_f64): Likewise.
++ (vrndx_f64): Likewise.
++
++2014-05-23 Yvan Roux <yvan.roux@linaro.org>
++
++ Backport from trunk r209419.
++ 2014-04-15 Kyrylo Tkachov <kyrylo.tkachov@arm.com>
++
++ PR rtl-optimization/60663
++ * config/arm/arm.c (arm_new_rtx_costs): Improve ASM_OPERANDS case,
++ avoid 0 cost.
++
++2014-05-23 Yvan Roux <yvan.roux@linaro.org>
++
++ Backport from trunk r209457.
++ 2014-04-16 Andrew Pinski <apinski@cavium.com>
++
++ * config/host-linux.c (TRY_EMPTY_VM_SPACE): Change aarch64 ilp32
++ definition.
++
++2014-05-19 Yvan Roux <yvan.roux@linaro.org>
++
++ * LINARO-VERSION: Bump version.
++
++2014-05-14 Yvan Roux <yvan.roux@linaro.org>
++ GCC Linaro 4.9-2014.05 released.
++ * LINARO-VERSION: Update.
++
++2014-05-13 Yvan Roux <yvan.roux@linaro.org>
++
++ Backport from trunk r209889.
++ 2014-04-29 Zhenqiang Chen <zhenqiang.chen@linaro.org>
++
++ * config/aarch64/aarch64.md (mov<mode>cc): New for GPF.
++
++2014-05-13 Yvan Roux <yvan.roux@linaro.org>
++
++ Backport from trunk r209556.
++ 2014-04-22 Zhenqiang Chen <zhenqiang.chen@linaro.org>
++
++ * config/arm/arm.c (arm_print_operand, thumb_exit): Make sure
++ GET_MODE_SIZE argument is enum machine_mode.
++
++2014-04-28 Yvan Roux <yvan.roux@linaro.org>
++
++ * LINARO-VERSION: Bump version.
++
++2014-04-22 Yvan Roux <yvan.roux@linaro.org>
++
++ GCC Linaro 4.9-2014.04 released.
++ * LINARO-VERSION: New file.
++ * configure.ac: Add Linaro version string.
++2014-07-16 Yvan Roux <yvan.roux@linaro.org>
++
++ Backport from trunk r211771.
++ 2014-06-18 Kyrylo Tkachov <kyrylo.tkachov@arm.com>
++
++ * genattrtab.c (n_bypassed): New variable.
++ (process_bypasses): Initialise n_bypassed.
++ Count number of bypassed reservations.
++ (make_automaton_attrs): Allocate space for bypassed reservations
++ rather than number of bypasses.
++
++2014-07-16 Yvan Roux <yvan.roux@linaro.org>
++
++ Backport from trunk r210861.
++ 2014-05-23 Jiong Wang <jiong.wang@arm.com>
++
++ * config/aarch64/predicates.md (aarch64_call_insn_operand): New
++ predicate.
++ * config/aarch64/constraints.md ("Ucs", "Usf"): New constraints.
++ * config/aarch64/aarch64.md (*sibcall_insn, *sibcall_value_insn):
++ Adjust for tailcalling through registers.
++ * config/aarch64/aarch64.h (enum reg_class): New caller save
++ register class.
++ (REG_CLASS_NAMES): Likewise.
++ (REG_CLASS_CONTENTS): Likewise.
++ * config/aarch64/aarch64.c (aarch64_function_ok_for_sibcall):
++ Allow tailcalling without decls.
++
++2014-07-16 Yvan Roux <yvan.roux@linaro.org>
++
++ Backport from trunk r211314.
++ 2014-06-06 James Greenhalgh <james.greenhalgh@arm.com>
++
++ * config/aarch64/aarch64-protos.h (aarch64_expand_movmem): New.
++ * config/aarch64/aarch64.c (aarch64_move_pointer): New.
++ (aarch64_progress_pointer): Likewise.
++ (aarch64_copy_one_part_and_move_pointers): Likewise.
++ (aarch64_expand_movmen): Likewise.
++ * config/aarch64/aarch64.h (MOVE_RATIO): Set low.
++ * config/aarch64/aarch64.md (movmem<mode>): New.
++
++2014-07-16 Yvan Roux <yvan.roux@linaro.org>
++
++ Backport from trunk r211185, 211186.
++ 2014-06-03 Alan Lawrence <alan.lawrence@arm.com>
++
++ * gcc/config/aarch64/aarch64-builtins.c
++ (aarch64_types_binop_uus_qualifiers,
++ aarch64_types_shift_to_unsigned_qualifiers,
++ aarch64_types_unsigned_shiftacc_qualifiers): Define.
++ * gcc/config/aarch64/aarch64-simd-builtins.def (uqshl, uqrshl, uqadd,
++ uqsub, usqadd, usra_n, ursra_n, uqshrn_n, uqrshrn_n, usri_n, usli_n,
++ sqshlu_n, uqshl_n): Update qualifiers.
++ * gcc/config/aarch64/arm_neon.h (vqadd_u8, vqadd_u16, vqadd_u32,
++ vqadd_u64, vqaddq_u8, vqaddq_u16, vqaddq_u32, vqaddq_u64, vqsub_u8,
++ vqsub_u16, vqsub_u32, vqsub_u64, vqsubq_u8, vqsubq_u16, vqsubq_u32,
++ vqsubq_u64, vqaddb_u8, vqaddh_u16, vqadds_u32, vqaddd_u64, vqrshl_u8,
++ vqrshl_u16, vqrshl_u32, vqrshl_u64, vqrshlq_u8, vqrshlq_u16,
++ vqrshlq_u32, vqrshlq_u64, vqrshlb_u8, vqrshlh_u16, vqrshls_u32,
++ vqrshld_u64, vqrshrn_n_u16, vqrshrn_n_u32, vqrshrn_n_u64,
++ vqrshrnh_n_u16, vqrshrns_n_u32, vqrshrnd_n_u64, vqshl_u8, vqshl_u16,
++ vqshl_u32, vqshl_u64, vqshlq_u8, vqshlq_u16, vqshlq_u32, vqshlq_u64,
++ vqshlb_u8, vqshlh_u16, vqshls_u32, vqshld_u64, vqshl_n_u8, vqshl_n_u16,
++ vqshl_n_u32, vqshl_n_u64, vqshlq_n_u8, vqshlq_n_u16, vqshlq_n_u32,
++ vqshlq_n_u64, vqshlb_n_u8, vqshlh_n_u16, vqshls_n_u32, vqshld_n_u64,
++ vqshlu_n_s8, vqshlu_n_s16, vqshlu_n_s32, vqshlu_n_s64, vqshluq_n_s8,
++ vqshluq_n_s16, vqshluq_n_s32, vqshluq_n_s64, vqshlub_n_s8,
++ vqshluh_n_s16, vqshlus_n_s32, vqshlud_n_s64, vqshrn_n_u16,
++ vqshrn_n_u32, vqshrn_n_u64, vqshrnh_n_u16, vqshrns_n_u32,
++ vqshrnd_n_u64, vqsubb_u8, vqsubh_u16, vqsubs_u32, vqsubd_u64,
++ vrsra_n_u8, vrsra_n_u16, vrsra_n_u32, vrsra_n_u64, vrsraq_n_u8,
++ vrsraq_n_u16, vrsraq_n_u32, vrsraq_n_u64, vrsrad_n_u64, vsli_n_u8,
++ vsli_n_u16, vsli_n_u32,vsli_n_u64, vsliq_n_u8, vsliq_n_u16,
++ vsliq_n_u32, vsliq_n_u64, vslid_n_u64, vsqadd_u8, vsqadd_u16,
++ vsqadd_u32, vsqadd_u64, vsqaddq_u8, vsqaddq_u16, vsqaddq_u32,
++ vsqaddq_u64, vsqaddb_u8, vsqaddh_u16, vsqadds_u32, vsqaddd_u64,
++ vsra_n_u8, vsra_n_u16, vsra_n_u32, vsra_n_u64, vsraq_n_u8,
++ vsraq_n_u16, vsraq_n_u32, vsraq_n_u64, vsrad_n_u64, vsri_n_u8,
++ vsri_n_u16, vsri_n_u32, vsri_n_u64, vsriq_n_u8, vsriq_n_u16,
++ vsriq_n_u32, vsriq_n_u64, vsrid_n_u64): Remove casts.
++
++ 2014-06-03 Alan Lawrence <alan.lawrence@arm.com>
++
++ * gcc/config/aarch64/aarch64-builtins.c
++ (aarch64_types_binop_ssu_qualifiers): New static data.
++ (TYPES_BINOP_SSU): Define.
++ * gcc/config/aarch64/aarch64-simd-builtins.def (suqadd, ushl, urshl,
++ urshr_n, ushll_n): Use appropriate unsigned qualifiers. 47
++ * gcc/config/aarch64/arm_neon.h (vrshl_u8, vrshl_u16, vrshl_u32,
++ vrshl_u64, vrshlq_u8, vrshlq_u16, vrshlq_u32, vrshlq_u64, vrshld_u64,
++ vrshr_n_u8, vrshr_n_u16, vrshr_n_u32, vrshr_n_u64, vrshrq_n_u8, 50
++ vrshrq_n_u16, vrshrq_n_u32, vrshrq_n_u64, vrshrd_n_u64, vshll_n_u8,
++ vshll_n_u16, vshll_n_u32, vuqadd_s8, vuqadd_s16, vuqadd_s32, 52
++ vuqadd_s64, vuqaddq_s8, vuqaddq_s16, vuqaddq_s32, vuqaddq_s64, 53
++ vuqaddb_s8, vuqaddh_s16, vuqadds_s32, vuqaddd_s64): Add signedness
++ suffix to builtin function name, remove cast. 55
++ (vshl_s8, vshl_s16, vshl_s32, vshl_s64, vshl_u8, vshl_u16, vshl_u32,
++ vshl_u64, vshlq_s8, vshlq_s16, vshlq_s32, vshlq_s64, vshlq_u8, 57
++ vshlq_u16, vshlq_u32, vshlq_u64, vshld_s64, vshld_u64): Remove cast.
++
++2014-07-16 Yvan Roux <yvan.roux@linaro.org>
++
++ Backport from trunk r211408, 211416.
++ 2014-06-10 Marcus Shawcroft <marcus.shawcroft@arm.com>
++
++ * config/aarch64/aarch64.c (aarch64_save_or_restore_fprs): Fix
++ REG_CFA_RESTORE mode.
++
++ 2014-06-10 Jiong Wang <jiong.wang@arm.com>
++
++ * config/aarch64/aarch64.c (aarch64_save_or_restore_fprs)
++ (aarch64_save_or_restore_callee_save_registers): Fix layout.
++
++2014-07-16 Yvan Roux <yvan.roux@linaro.org>
++
++ Backport from trunk r211418.
++ 2014-06-10 Kyrylo Tkachov <kyrylo.tkachov@arm.com>
++
++ * config/aarch64/aarch64-simd.md (move_lo_quad_<mode>):
++ Change second alternative type to f_mcr.
++ * config/aarch64/aarch64.md (*movsi_aarch64): Change 11th
++ and 12th alternatives' types to f_mcr and f_mrc.
++ (*movdi_aarch64): Same for 12th and 13th alternatives.
++ (*movsf_aarch64): Change 9th alternatives' type to mov_reg.
++ (aarch64_movtilow_tilow): Change type to fmov.
++
++2014-07-16 Yvan Roux <yvan.roux@linaro.org>
++
++ Backport from trunk r211371.
++ 2014-06-09 Ramana Radhakrishnan <ramana.radhakrishnan@arm.com>
++
++ * config/arm/arm-modes.def: Remove XFmode.
++
++2014-07-16 Yvan Roux <yvan.roux@linaro.org>
++
++ Backport from trunk r211268.
++ 2014-06-05 Marcus Shawcroft <marcus.shawcroft@arm.com>
++
++ * config/aarch64/aarch64.c (aarch64_expand_prologue): Update stack
++ layout comment.
++
++2014-07-16 Yvan Roux <yvan.roux@linaro.org>
++
++ Backport from trunk r211129.
++ 2014-06-02 Ramana Radhakrishnan <ramana.radhakrishnan@arm.com>
++
++ PR target/61154
++ * config/arm/arm.h (TARGET_SUPPORTS_WIDE_INT): Define.
++ * config/arm/arm.md (mov64 splitter): Replace const_double_operand
++ with immediate_operand.
++
++2014-07-16 Yvan Roux <yvan.roux@linaro.org>
++
++ Backport from trunk r211073.
++ 2014-05-30 Kyrylo Tkachov <kyrylo.tkachov@arm.com>
++
++ * config/arm/thumb2.md (*thumb2_movhi_insn): Set type of movw
++ to mov_imm.
++ * config/arm/vfp.md (*thumb2_movsi_vfp): Likewise.
++
++2014-07-16 Yvan Roux <yvan.roux@linaro.org>
++
++ Backport from trunk r211050.
++ 2014-05-29 Richard Earnshaw <rearnsha@arm.com>
++ Richard Sandiford <rdsandiford@googlemail.com>
++
++ * arm/iterators.md (shiftable_ops): New code iterator.
++ (t2_binop0, arith_shift_insn): New code attributes.
++ * arm/predicates.md (shift_nomul_operator): New predicate.
++ * arm/arm.md (insn_enabled): Delete.
++ (enabled): Remove insn_enabled test.
++ (*arith_shiftsi): Delete. Replace with ...
++ (*<arith_shift_insn>_multsi): ... new pattern.
++ (*<arith_shift_insn>_shiftsi): ... new pattern.
++ * config/arm/arm.c (arm_print_operand): Handle operand format 'b'.
++
++2014-07-16 Yvan Roux <yvan.roux@linaro.org>
++
++ Backport from trunk r210996.
++ 2014-05-27 Andrew Pinski <apinski@cavium.com>
++
++ * config/aarch64/aarch64.md (stack_protect_set_<mode>):
++ Use <w> for the register in assembly template.
++ (stack_protect_test): Use the mode of operands[0] for the
++ result.
++ (stack_protect_test_<mode>): Use <w> for the register
++ in assembly template.
++
++2014-07-16 Yvan Roux <yvan.roux@linaro.org>
++
++ Backport from trunk r210967.
++ 2014-05-27 Kyrylo Tkachov <kyrylo.tkachov@arm.com>
++
++ * config/arm/neon.md (neon_bswap<mode>): New pattern.
++ * config/arm/arm.c (neon_itype): Add NEON_BSWAP.
++ (arm_init_neon_builtins): Handle NEON_BSWAP.
++ Define required type nodes.
++ (arm_expand_neon_builtin): Handle NEON_BSWAP.
++ (arm_builtin_vectorized_function): Handle BUILTIN_BSWAP builtins.
++ * config/arm/arm_neon_builtins.def (bswap): Define builtins.
++ * config/arm/iterators.md (VDQHSD): New mode iterator.
++
++2014-07-16 Yvan Roux <yvan.roux@linaro.org>
++
++ Backport from trunk r210471.
++ 2014-05-15 Kyrylo Tkachov <kyrylo.tkachov@arm.com>
++
++ * config/arm/arm.c (arm_option_override): Use the SCHED_PRESSURE_MODEL
++ enum name for PARAM_SCHED_PRESSURE_ALGORITHM.
++
++2014-07-16 Yvan Roux <yvan.roux@linaro.org>
++
++ Backport from trunk r210369.
++ 2014-05-13 Kyrylo Tkachov <kyrylo.tkachov@arm.com>
++
++ * config/arm/arm.c (neon_itype): Remove NEON_RESULTPAIR.
++ (arm_init_neon_builtins): Remove handling of NEON_RESULTPAIR.
++ Remove associated type declarations and initialisations.
++ (arm_expand_neon_builtin): Likewise.
++ (neon_emit_pair_result_insn): Delete.
++ * config/arm/arm_neon_builtins (vtrn, vzip, vuzp): Delete.
++ * config/arm/neon.md (neon_vtrn<mode>): Delete.
++ (neon_vzip<mode>): Likewise.
++ (neon_vuzp<mode>): Likewise.
++
++2014-07-16 Yvan Roux <yvan.roux@linaro.org>
++
++ Backport from trunk r211058, 211177.
++ 2014-05-29 Alan Lawrence <alan.lawrence@arm.com>
++
++ * config/aarch64/aarch64-builtins.c (aarch64_types_binopv_qualifiers,
++ TYPES_BINOPV): New static data.
++ * config/aarch64/aarch64-simd-builtins.def (im_lane_bound): New builtin.
++ * config/aarch64/aarch64-simd.md (aarch64_ext, aarch64_im_lane_boundsi):
++ New patterns.
++ * config/aarch64/aarch64.c (aarch64_expand_vec_perm_const_1): Match
++ patterns for EXT.
++ (aarch64_evpc_ext): New function.
++
++ * config/aarch64/iterators.md (UNSPEC_EXT): New enum element.
++
++ * config/aarch64/arm_neon.h (vext_f32, vext_f64, vext_p8, vext_p16,
++ vext_s8, vext_s16, vext_s32, vext_s64, vext_u8, vext_u16, vext_u32,
++ vext_u64, vextq_f32, vextq_f64, vextq_p8, vextq_p16, vextq_s8,
++ vextq_s16, vextq_s32, vextq_s64, vextq_u8, vextq_u16, vextq_u32,
++ vextq_u64): Replace __asm with __builtin_shuffle and im_lane_boundsi.
++
++ 2014-06-03 Alan Lawrence <alan.lawrence@arm.com>
++
++ * config/aarch64/aarch64.c (aarch64_evpc_ext): allow and handle
++ location == 0.
++
++2014-07-16 Yvan Roux <yvan.roux@linaro.org>
++
++ Backport from trunk r209797.
++ 2014-04-25 Kyrylo Tkachov <kyrylo.tkachov@arm.com>
++
++ * config/arm/aarch-common.c (aarch_rev16_shright_mask_imm_p):
++ Use HOST_WIDE_INT_C for mask literal.
++ (aarch_rev16_shleft_mask_imm_p): Likewise.
++
++2014-07-16 Yvan Roux <yvan.roux@linaro.org>
++
++ Backport from trunk r211148.
++ 2014-06-02 Andrew Pinski <apinski@cavium.com>
++
++ * config/aarch64/aarch64-linux.h (GLIBC_DYNAMIC_LINKER):
++ /lib/ld-linux32-aarch64.so.1 is used for ILP32.
++ (LINUX_TARGET_LINK_SPEC): Update linker script for ILP32.
++ file whose name depends on -mabi= and -mbig-endian.
++ * config/aarch64/t-aarch64-linux (MULTILIB_OSDIRNAMES): Handle LP64
++ better and handle ilp32 too.
++ (MULTILIB_OPTIONS): Delete.
++ (MULTILIB_DIRNAMES): Delete.
++
++2014-07-16 Yvan Roux <yvan.roux@linaro.org>
++
++ Backport from trunk r210828, r211103.
++ 2014-05-31 Kugan Vivekanandarajah <kuganv@linaro.org>
++
++ * config/arm/arm.c (TARGET_ATOMIC_ASSIGN_EXPAND_FENV): New define.
++ (arm_builtins) : Add ARM_BUILTIN_GET_FPSCR and ARM_BUILTIN_SET_FPSCR.
++ (bdesc_2arg) : Add description for builtins __builtins_arm_set_fpscr
++ and __builtins_arm_get_fpscr.
++ (arm_init_builtins) : Initialize builtins __builtins_arm_set_fpscr and
++ __builtins_arm_get_fpscr.
++ (arm_expand_builtin) : Expand builtins __builtins_arm_set_fpscr and
++ __builtins_arm_ldfpscr.
++ (arm_atomic_assign_expand_fenv): New function.
++ * config/arm/vfp.md (set_fpscr): New pattern.
++ (get_fpscr) : Likewise.
++ * config/arm/unspecs.md (unspecv): Add VUNSPEC_GET_FPSCR and
++ VUNSPEC_SET_FPSCR.
++ * doc/extend.texi (AARCH64 Built-in Functions) : Document
++ __builtins_arm_set_fpscr, __builtins_arm_get_fpscr.
++
++ 2014-05-23 Kugan Vivekanandarajah <kuganv@linaro.org>
++
++ * config/aarch64/aarch64.c (TARGET_ATOMIC_ASSIGN_EXPAND_FENV): New
++ define.
++ * config/aarch64/aarch64-protos.h (aarch64_atomic_assign_expand_fenv):
++ New function declaration.
++ * config/aarch64/aarch64-builtins.c (aarch64_builtins) : Add
++ AARCH64_BUILTIN_GET_FPCR, AARCH64_BUILTIN_SET_FPCR.
++ AARCH64_BUILTIN_GET_FPSR and AARCH64_BUILTIN_SET_FPSR.
++ (aarch64_init_builtins) : Initialize builtins
++ __builtins_aarch64_set_fpcr, __builtins_aarch64_get_fpcr.
++ __builtins_aarch64_set_fpsr and __builtins_aarch64_get_fpsr.
++ (aarch64_expand_builtin) : Expand builtins __builtins_aarch64_set_fpcr
++ __builtins_aarch64_get_fpcr, __builtins_aarch64_get_fpsr,
++ and __builtins_aarch64_set_fpsr.
++ (aarch64_atomic_assign_expand_fenv): New function.
++ * config/aarch64/aarch64.md (set_fpcr): New pattern.
++ (get_fpcr) : Likewise.
++ (set_fpsr) : Likewise.
++ (get_fpsr) : Likewise.
++ (unspecv): Add UNSPECV_GET_FPCR and UNSPECV_SET_FPCR, UNSPECV_GET_FPSR
++ and UNSPECV_SET_FPSR.
++ * doc/extend.texi (AARCH64 Built-in Functions) : Document
++ __builtins_aarch64_set_fpcr, __builtins_aarch64_get_fpcr.
++ __builtins_aarch64_set_fpsr and __builtins_aarch64_get_fpsr.
++
++2014-07-16 Yvan Roux <yvan.roux@linaro.org>
++
++ Backport from trunk r210355.
++ 2014-05-13 Ian Bolton <ian.bolton@arm.com>
++
++ * config/aarch64/aarch64-protos.h
++ (aarch64_hard_regno_caller_save_mode): New prototype.
++ * config/aarch64/aarch64.c (aarch64_hard_regno_caller_save_mode):
++ New function.
++ * config/aarch64/aarch64.h (HARD_REGNO_CALLER_SAVE_MODE): New macro.
++
++2014-07-16 Yvan Roux <yvan.roux@linaro.org>
++
++ Backport from trunk r209943.
++ 2014-04-30 Alan Lawrence <alan.lawrence@arm.com>
++
++ * config/aarch64/arm_neon.h (vuzp1_f32, vuzp1_p8, vuzp1_p16, vuzp1_s8,
++ vuzp1_s16, vuzp1_s32, vuzp1_u8, vuzp1_u16, vuzp1_u32, vuzp1q_f32,
++ vuzp1q_f64, vuzp1q_p8, vuzp1q_p16, vuzp1q_s8, vuzp1q_s16, vuzp1q_s32,
++ vuzp1q_s64, vuzp1q_u8, vuzp1q_u16, vuzp1q_u32, vuzp1q_u64, vuzp2_f32,
++ vuzp2_p8, vuzp2_p16, vuzp2_s8, vuzp2_s16, vuzp2_s32, vuzp2_u8,
++ vuzp2_u16, vuzp2_u32, vuzp2q_f32, vuzp2q_f64, vuzp2q_p8, vuzp2q_p16,
++ vuzp2q_s8, vuzp2q_s16, vuzp2q_s32, vuzp2q_s64, vuzp2q_u8, vuzp2q_u16,
++ vuzp2q_u32, vuzp2q_u64): Replace temporary asm with __builtin_shuffle.
++
++2014-06-26 Yvan Roux <yvan.roux@linaro.org>
++
++ * LINARO-VERSION: Bump version.
++
+2014-06-25 Yvan Roux <yvan.roux@linaro.org>
+
+ GCC Linaro 4.9-2014.06-1 released.
@@ -1696,10 +3883,10 @@ LANG=C svn diff svn://gcc.gnu.org/svn/gcc/branches/gcc-4_9-branch@211979 \
+/* { dg-final { scan-assembler-times "orn\t" 6 { target arm_thumb2 } } } */
+
+/* { dg-final { cleanup-saved-temps } } */
---- a/src/gcc/testsuite/gcc.target/arm/simd/vzipp16_1.c
-+++ b/src/gcc/testsuite/gcc.target/arm/simd/vzipp16_1.c
+--- a/src/gcc/testsuite/gcc.target/arm/simd/vzips16_1.c
++++ b/src/gcc/testsuite/gcc.target/arm/simd/vzips16_1.c
@@ -0,0 +1,12 @@
-+/* Test the `vzipp16' ARM Neon intrinsic. */
++/* Test the `vzips16' ARM Neon intrinsic. */
+
+/* { dg-do run } */
+/* { dg-require-effective-target arm_neon_ok } */
@@ -1707,14 +3894,29 @@ LANG=C svn diff svn://gcc.gnu.org/svn/gcc/branches/gcc-4_9-branch@211979 \
+/* { dg-add-options arm_neon } */
+
+#include "arm_neon.h"
-+#include "../../aarch64/simd/vzipp16.x"
++#include "../../aarch64/simd/vzips16.x"
+
+/* { dg-final { scan-assembler-times "vzip\.16\[ \t\]+\[dD\]\[0-9\]+, ?\[dD\]\[0-9\]+!?\(?:\[ \t\]+@\[a-zA-Z0-9 \]+\)?\n" 1 } } */
+/* { dg-final { cleanup-saved-temps } } */
---- a/src/gcc/testsuite/gcc.target/arm/simd/vzips32_1.c
-+++ b/src/gcc/testsuite/gcc.target/arm/simd/vzips32_1.c
+--- a/src/gcc/testsuite/gcc.target/arm/simd/vexts64_1.c
++++ b/src/gcc/testsuite/gcc.target/arm/simd/vexts64_1.c
@@ -0,0 +1,12 @@
-+/* Test the `vzips32' ARM Neon intrinsic. */
++/* Test the `vexts64' ARM Neon intrinsic. */
++
++/* { dg-do run } */
++/* { dg-require-effective-target arm_neon_ok } */
++/* { dg-options "-save-temps -O3 -fno-inline" } */
++/* { dg-add-options arm_neon } */
++
++#include "arm_neon.h"
++#include "../../aarch64/simd/ext_s64.x"
++
++/* Don't scan assembler for vext - it can be optimized into a move from r0. */
++/* { dg-final { cleanup-saved-temps } } */
+--- a/src/gcc/testsuite/gcc.target/arm/simd/vtrns16_1.c
++++ b/src/gcc/testsuite/gcc.target/arm/simd/vtrns16_1.c
+@@ -0,0 +1,12 @@
++/* Test the `vtrns16' ARM Neon intrinsic. */
+
+/* { dg-do run } */
+/* { dg-require-effective-target arm_neon_ok } */
@@ -1722,14 +3924,14 @@ LANG=C svn diff svn://gcc.gnu.org/svn/gcc/branches/gcc-4_9-branch@211979 \
+/* { dg-add-options arm_neon } */
+
+#include "arm_neon.h"
-+#include "../../aarch64/simd/vzips32.x"
++#include "../../aarch64/simd/vtrns16.x"
+
-+/* { dg-final { scan-assembler-times "vuzp\.32\[ \t\]+\[dD\]\[0-9\]+, ?\[dD\]\[0-9\]+!?\(?:\[ \t\]+@\[a-zA-Z0-9 \]+\)?\n" 1 } } */
++/* { dg-final { scan-assembler-times "vtrn\.16\[ \t\]+\[dD\]\[0-9\]+, ?\[dD\]\[0-9\]+!?\(?:\[ \t\]+@\[a-zA-Z0-9 \]+\)?\n" 1 } } */
+/* { dg-final { cleanup-saved-temps } } */
---- a/src/gcc/testsuite/gcc.target/arm/simd/vzipqp8_1.c
-+++ b/src/gcc/testsuite/gcc.target/arm/simd/vzipqp8_1.c
+--- a/src/gcc/testsuite/gcc.target/arm/simd/vzipu16_1.c
++++ b/src/gcc/testsuite/gcc.target/arm/simd/vzipu16_1.c
@@ -0,0 +1,12 @@
-+/* Test the `vzipQp8' ARM Neon intrinsic. */
++/* Test the `vzipu16' ARM Neon intrinsic. */
+
+/* { dg-do run } */
+/* { dg-require-effective-target arm_neon_ok } */
@@ -1737,14 +3939,44 @@ LANG=C svn diff svn://gcc.gnu.org/svn/gcc/branches/gcc-4_9-branch@211979 \
+/* { dg-add-options arm_neon } */
+
+#include "arm_neon.h"
-+#include "../../aarch64/simd/vzipqp8.x"
++#include "../../aarch64/simd/vzipu16.x"
++
++/* { dg-final { scan-assembler-times "vzip\.16\[ \t\]+\[dD\]\[0-9\]+, ?\[dD\]\[0-9\]+!?\(?:\[ \t\]+@\[a-zA-Z0-9 \]+\)?\n" 1 } } */
++/* { dg-final { cleanup-saved-temps } } */
+--- a/src/gcc/testsuite/gcc.target/arm/simd/vzipqs8_1.c
++++ b/src/gcc/testsuite/gcc.target/arm/simd/vzipqs8_1.c
+@@ -0,0 +1,12 @@
++/* Test the `vzipQs8' ARM Neon intrinsic. */
++
++/* { dg-do run } */
++/* { dg-require-effective-target arm_neon_ok } */
++/* { dg-options "-save-temps -O1 -fno-inline" } */
++/* { dg-add-options arm_neon } */
++
++#include "arm_neon.h"
++#include "../../aarch64/simd/vzipqs8.x"
+
+/* { dg-final { scan-assembler-times "vzip\.8\[ \t\]+\[qQ\]\[0-9\]+, ?\[qQ\]\[0-9\]+!?\(?:\[ \t\]+@\[a-zA-Z0-9 \]+\)?\n" 1 } } */
+/* { dg-final { cleanup-saved-temps } } */
---- a/src/gcc/testsuite/gcc.target/arm/simd/vzipu32_1.c
-+++ b/src/gcc/testsuite/gcc.target/arm/simd/vzipu32_1.c
+--- a/src/gcc/testsuite/gcc.target/arm/simd/vextQu8_1.c
++++ b/src/gcc/testsuite/gcc.target/arm/simd/vextQu8_1.c
@@ -0,0 +1,12 @@
-+/* Test the `vzipu32' ARM Neon intrinsic. */
++/* Test the `vextQu8' ARM Neon intrinsic. */
++
++/* { dg-do run } */
++/* { dg-require-effective-target arm_neon_ok } */
++/* { dg-options "-save-temps -O3 -fno-inline" } */
++/* { dg-add-options arm_neon } */
++
++#include "arm_neon.h"
++#include "../../aarch64/simd/extq_u8.x"
++
++/* { dg-final { scan-assembler-times "vext\.8\[ \t\]+\[qQ\]\[0-9\]+, \[qQ\]\[0-9\]+, \[qQ\]\[0-9\]+, #\[0-9\]+!?\(?:\[ \t\]+@\[a-zA-Z0-9 \]+\)?\n" 15 } } */
++/* { dg-final { cleanup-saved-temps } } */
+--- a/src/gcc/testsuite/gcc.target/arm/simd/vtrnqf32_1.c
++++ b/src/gcc/testsuite/gcc.target/arm/simd/vtrnqf32_1.c
+@@ -0,0 +1,12 @@
++/* Test the `vtrnQf32' ARM Neon intrinsic. */
+
+/* { dg-do run } */
+/* { dg-require-effective-target arm_neon_ok } */
@@ -1752,14 +3984,29 @@ LANG=C svn diff svn://gcc.gnu.org/svn/gcc/branches/gcc-4_9-branch@211979 \
+/* { dg-add-options arm_neon } */
+
+#include "arm_neon.h"
-+#include "../../aarch64/simd/vzipu32.x"
++#include "../../aarch64/simd/vtrnqf32.x"
+
-+/* { dg-final { scan-assembler-times "vuzp\.32\[ \t\]+\[dD\]\[0-9\]+, ?\[dD\]\[0-9\]+!?\(?:\[ \t\]+@\[a-zA-Z0-9 \]+\)?\n" 1 } } */
++/* { dg-final { scan-assembler-times "vtrn\.32\[ \t\]+\[qQ\]\[0-9\]+, ?\[qQ\]\[0-9\]+!?\(?:\[ \t\]+@\[a-zA-Z0-9 \]+\)?\n" 1 } } */
+/* { dg-final { cleanup-saved-temps } } */
---- a/src/gcc/testsuite/gcc.target/arm/simd/vzips16_1.c
-+++ b/src/gcc/testsuite/gcc.target/arm/simd/vzips16_1.c
+--- a/src/gcc/testsuite/gcc.target/arm/simd/vextu64_1.c
++++ b/src/gcc/testsuite/gcc.target/arm/simd/vextu64_1.c
@@ -0,0 +1,12 @@
-+/* Test the `vzips16' ARM Neon intrinsic. */
++/* Test the `vextu64' ARM Neon intrinsic. */
++
++/* { dg-do run } */
++/* { dg-require-effective-target arm_neon_ok } */
++/* { dg-options "-save-temps -O3 -fno-inline" } */
++/* { dg-add-options arm_neon } */
++
++#include "arm_neon.h"
++#include "../../aarch64/simd/ext_u64.x"
++
++/* Don't scan assembler for vext - it can be optimized into a move from r0. */
++/* { dg-final { cleanup-saved-temps } } */
+--- a/src/gcc/testsuite/gcc.target/arm/simd/vtrnqs8_1.c
++++ b/src/gcc/testsuite/gcc.target/arm/simd/vtrnqs8_1.c
+@@ -0,0 +1,12 @@
++/* Test the `vtrnQs8' ARM Neon intrinsic. */
+
+/* { dg-do run } */
+/* { dg-require-effective-target arm_neon_ok } */
@@ -1767,14 +4014,14 @@ LANG=C svn diff svn://gcc.gnu.org/svn/gcc/branches/gcc-4_9-branch@211979 \
+/* { dg-add-options arm_neon } */
+
+#include "arm_neon.h"
-+#include "../../aarch64/simd/vzips16.x"
++#include "../../aarch64/simd/vtrnqs8.x"
+
-+/* { dg-final { scan-assembler-times "vzip\.16\[ \t\]+\[dD\]\[0-9\]+, ?\[dD\]\[0-9\]+!?\(?:\[ \t\]+@\[a-zA-Z0-9 \]+\)?\n" 1 } } */
++/* { dg-final { scan-assembler-times "vtrn\.8\[ \t\]+\[qQ\]\[0-9\]+, ?\[qQ\]\[0-9\]+!?\(?:\[ \t\]+@\[a-zA-Z0-9 \]+\)?\n" 1 } } */
+/* { dg-final { cleanup-saved-temps } } */
---- a/src/gcc/testsuite/gcc.target/arm/simd/vzipu16_1.c
-+++ b/src/gcc/testsuite/gcc.target/arm/simd/vzipu16_1.c
+--- a/src/gcc/testsuite/gcc.target/arm/simd/vtrnu16_1.c
++++ b/src/gcc/testsuite/gcc.target/arm/simd/vtrnu16_1.c
@@ -0,0 +1,12 @@
-+/* Test the `vzipu16' ARM Neon intrinsic. */
++/* Test the `vtrnu16' ARM Neon intrinsic. */
+
+/* { dg-do run } */
+/* { dg-require-effective-target arm_neon_ok } */
@@ -1782,14 +4029,14 @@ LANG=C svn diff svn://gcc.gnu.org/svn/gcc/branches/gcc-4_9-branch@211979 \
+/* { dg-add-options arm_neon } */
+
+#include "arm_neon.h"
-+#include "../../aarch64/simd/vzipu16.x"
++#include "../../aarch64/simd/vtrnu16.x"
+
-+/* { dg-final { scan-assembler-times "vzip\.16\[ \t\]+\[dD\]\[0-9\]+, ?\[dD\]\[0-9\]+!?\(?:\[ \t\]+@\[a-zA-Z0-9 \]+\)?\n" 1 } } */
++/* { dg-final { scan-assembler-times "vtrn\.16\[ \t\]+\[dD\]\[0-9\]+, ?\[dD\]\[0-9\]+!?\(?:\[ \t\]+@\[a-zA-Z0-9 \]+\)?\n" 1 } } */
+/* { dg-final { cleanup-saved-temps } } */
---- a/src/gcc/testsuite/gcc.target/arm/simd/vzipqf32_1.c
-+++ b/src/gcc/testsuite/gcc.target/arm/simd/vzipqf32_1.c
+--- a/src/gcc/testsuite/gcc.target/arm/simd/vuzpqp8_1.c
++++ b/src/gcc/testsuite/gcc.target/arm/simd/vuzpqp8_1.c
@@ -0,0 +1,12 @@
-+/* Test the `vzipQf32' ARM Neon intrinsic. */
++/* Test the `vuzpQp8' ARM Neon intrinsic. */
+
+/* { dg-do run } */
+/* { dg-require-effective-target arm_neon_ok } */
@@ -1797,14 +4044,29 @@ LANG=C svn diff svn://gcc.gnu.org/svn/gcc/branches/gcc-4_9-branch@211979 \
+/* { dg-add-options arm_neon } */
+
+#include "arm_neon.h"
-+#include "../../aarch64/simd/vzipqf32.x"
++#include "../../aarch64/simd/vuzpqp8.x"
+
-+/* { dg-final { scan-assembler-times "vzip\.32\[ \t\]+\[qQ\]\[0-9\]+, ?\[qQ\]\[0-9\]+!?\(?:\[ \t\]+@\[a-zA-Z0-9 \]+\)?\n" 1 } } */
++/* { dg-final { scan-assembler-times "vuzp\.8\[ \t\]+\[qQ\]\[0-9\]+, ?\[qQ\]\[0-9\]+!?\(?:\[ \t\]+@\[a-zA-Z0-9 \]+\)?\n" 1 } } */
+/* { dg-final { cleanup-saved-temps } } */
---- a/src/gcc/testsuite/gcc.target/arm/simd/vzipqs8_1.c
-+++ b/src/gcc/testsuite/gcc.target/arm/simd/vzipqs8_1.c
+--- a/src/gcc/testsuite/gcc.target/arm/simd/vextu8_1.c
++++ b/src/gcc/testsuite/gcc.target/arm/simd/vextu8_1.c
@@ -0,0 +1,12 @@
-+/* Test the `vzipQs8' ARM Neon intrinsic. */
++/* Test the `vextu8' ARM Neon intrinsic. */
++
++/* { dg-do run } */
++/* { dg-require-effective-target arm_neon_ok } */
++/* { dg-options "-save-temps -O3 -fno-inline" } */
++/* { dg-add-options arm_neon } */
++
++#include "arm_neon.h"
++#include "../../aarch64/simd/ext_u8.x"
++
++/* { dg-final { scan-assembler-times "vext\.8\[ \t\]+\[dD\]\[0-9\]+, \[dD\]\[0-9\]+, \[dD\]\[0-9\]+, #\[0-9\]+!?\(?:\[ \t\]+@\[a-zA-Z0-9 \]+\)?\n" 7 } } */
++/* { dg-final { cleanup-saved-temps } } */
+--- a/src/gcc/testsuite/gcc.target/arm/simd/vtrnqs16_1.c
++++ b/src/gcc/testsuite/gcc.target/arm/simd/vtrnqs16_1.c
+@@ -0,0 +1,12 @@
++/* Test the `vtrnQs16' ARM Neon intrinsic. */
+
+/* { dg-do run } */
+/* { dg-require-effective-target arm_neon_ok } */
@@ -1812,10 +4074,205 @@ LANG=C svn diff svn://gcc.gnu.org/svn/gcc/branches/gcc-4_9-branch@211979 \
+/* { dg-add-options arm_neon } */
+
+#include "arm_neon.h"
-+#include "../../aarch64/simd/vzipqs8.x"
++#include "../../aarch64/simd/vtrnqs16.x"
++
++/* { dg-final { scan-assembler-times "vtrn\.16\[ \t\]+\[qQ\]\[0-9\]+, ?\[qQ\]\[0-9\]+!?\(?:\[ \t\]+@\[a-zA-Z0-9 \]+\)?\n" 1 } } */
++/* { dg-final { cleanup-saved-temps } } */
+--- a/src/gcc/testsuite/gcc.target/arm/simd/vextQs64_1.c
++++ b/src/gcc/testsuite/gcc.target/arm/simd/vextQs64_1.c
+@@ -0,0 +1,12 @@
++/* Test the `vextQs64' ARM Neon intrinsic. */
++
++/* { dg-do run } */
++/* { dg-require-effective-target arm_neon_ok } */
++/* { dg-options "-save-temps -O3 -fno-inline" } */
++/* { dg-add-options arm_neon } */
++
++#include "arm_neon.h"
++#include "../../aarch64/simd/extq_s64.x"
++
++/* { dg-final { scan-assembler-times "vext\.64\[ \t\]+\[qQ\]\[0-9\]+, \[qQ\]\[0-9\]+, \[qQ\]\[0-9\]+, #\[0-9\]+!?\(?:\[ \t\]+@\[a-zA-Z0-9 \]+\)?\n" 1 } } */
++/* { dg-final { cleanup-saved-temps } } */
+--- a/src/gcc/testsuite/gcc.target/arm/simd/vtrns8_1.c
++++ b/src/gcc/testsuite/gcc.target/arm/simd/vtrns8_1.c
+@@ -0,0 +1,12 @@
++/* Test the `vtrns8' ARM Neon intrinsic. */
++
++/* { dg-do run } */
++/* { dg-require-effective-target arm_neon_ok } */
++/* { dg-options "-save-temps -O1 -fno-inline" } */
++/* { dg-add-options arm_neon } */
++
++#include "arm_neon.h"
++#include "../../aarch64/simd/vtrns8.x"
++
++/* { dg-final { scan-assembler-times "vtrn\.8\[ \t\]+\[dD\]\[0-9\]+, ?\[dD\]\[0-9\]+!?\(?:\[ \t\]+@\[a-zA-Z0-9 \]+\)?\n" 1 } } */
++/* { dg-final { cleanup-saved-temps } } */
+--- a/src/gcc/testsuite/gcc.target/arm/simd/vtrnqu16_1.c
++++ b/src/gcc/testsuite/gcc.target/arm/simd/vtrnqu16_1.c
+@@ -0,0 +1,12 @@
++/* Test the `vtrnQu16' ARM Neon intrinsic. */
++
++/* { dg-do run } */
++/* { dg-require-effective-target arm_neon_ok } */
++/* { dg-options "-save-temps -O1 -fno-inline" } */
++/* { dg-add-options arm_neon } */
++
++#include "arm_neon.h"
++#include "../../aarch64/simd/vtrnqu16.x"
++
++/* { dg-final { scan-assembler-times "vtrn\.16\[ \t\]+\[qQ\]\[0-9\]+, ?\[qQ\]\[0-9\]+!?\(?:\[ \t\]+@\[a-zA-Z0-9 \]+\)?\n" 1 } } */
++/* { dg-final { cleanup-saved-temps } } */
+--- a/src/gcc/testsuite/gcc.target/arm/simd/vextQu64_1.c
++++ b/src/gcc/testsuite/gcc.target/arm/simd/vextQu64_1.c
+@@ -0,0 +1,12 @@
++/* Test the `vextQu64' ARM Neon intrinsic. */
++
++/* { dg-do run } */
++/* { dg-require-effective-target arm_neon_ok } */
++/* { dg-options "-save-temps -O3 -fno-inline" } */
++/* { dg-add-options arm_neon } */
++
++#include "arm_neon.h"
++#include "../../aarch64/simd/extq_u64.x"
++
++/* { dg-final { scan-assembler-times "vext\.64\[ \t\]+\[qQ\]\[0-9\]+, \[qQ\]\[0-9\]+, \[qQ\]\[0-9\]+, #\[0-9\]+!?\(?:\[ \t\]+@\[a-zA-Z0-9 \]+\)?\n" 1 } } */
++/* { dg-final { cleanup-saved-temps } } */
+--- a/src/gcc/testsuite/gcc.target/arm/simd/vuzpqp16_1.c
++++ b/src/gcc/testsuite/gcc.target/arm/simd/vuzpqp16_1.c
+@@ -0,0 +1,12 @@
++/* Test the `vuzpQp16' ARM Neon intrinsic. */
++
++/* { dg-do run } */
++/* { dg-require-effective-target arm_neon_ok } */
++/* { dg-options "-save-temps -O1 -fno-inline" } */
++/* { dg-add-options arm_neon } */
++
++#include "arm_neon.h"
++#include "../../aarch64/simd/vuzpqp16.x"
++
++/* { dg-final { scan-assembler-times "vuzp\.16\[ \t\]+\[qQ\]\[0-9\]+, ?\[qQ\]\[0-9\]+!?\(?:\[ \t\]+@\[a-zA-Z0-9 \]+\)?\n" 1 } } */
++/* { dg-final { cleanup-saved-temps } } */
+--- a/src/gcc/testsuite/gcc.target/arm/simd/vuzpqs32_1.c
++++ b/src/gcc/testsuite/gcc.target/arm/simd/vuzpqs32_1.c
+@@ -0,0 +1,12 @@
++/* Test the `vuzpQs32' ARM Neon intrinsic. */
++
++/* { dg-do run } */
++/* { dg-require-effective-target arm_neon_ok } */
++/* { dg-options "-save-temps -O1 -fno-inline" } */
++/* { dg-add-options arm_neon } */
++
++#include "arm_neon.h"
++#include "../../aarch64/simd/vuzpqs32.x"
++
++/* { dg-final { scan-assembler-times "vuzp\.32\[ \t\]+\[qQ\]\[0-9\]+, ?\[qQ\]\[0-9\]+!?\(?:\[ \t\]+@\[a-zA-Z0-9 \]+\)?\n" 1 } } */
++/* { dg-final { cleanup-saved-temps } } */
+--- a/src/gcc/testsuite/gcc.target/arm/simd/vextp16_1.c
++++ b/src/gcc/testsuite/gcc.target/arm/simd/vextp16_1.c
+@@ -0,0 +1,12 @@
++/* Test the `vextp16' ARM Neon intrinsic. */
++
++/* { dg-do run } */
++/* { dg-require-effective-target arm_neon_ok } */
++/* { dg-options "-save-temps -O3 -fno-inline" } */
++/* { dg-add-options arm_neon } */
++
++#include "arm_neon.h"
++#include "../../aarch64/simd/ext_p16.x"
++
++/* { dg-final { scan-assembler-times "vext\.16\[ \t\]+\[dD\]\[0-9\]+, \[dD\]\[0-9\]+, \[dD\]\[0-9\]+, #\[0-9\]+!?\(?:\[ \t\]+@\[a-zA-Z0-9 \]+\)?\n" 3 } } */
++/* { dg-final { cleanup-saved-temps } } */
+--- a/src/gcc/testsuite/gcc.target/arm/simd/vexts32_1.c
++++ b/src/gcc/testsuite/gcc.target/arm/simd/vexts32_1.c
+@@ -0,0 +1,12 @@
++/* Test the `vexts32' ARM Neon intrinsic. */
++
++/* { dg-do run } */
++/* { dg-require-effective-target arm_neon_ok } */
++/* { dg-options "-save-temps -O3 -fno-inline" } */
++/* { dg-add-options arm_neon } */
++
++#include "arm_neon.h"
++#include "../../aarch64/simd/ext_s32.x"
++
++/* { dg-final { scan-assembler-times "vext\.32\[ \t\]+\[dD\]\[0-9\]+, \[dD\]\[0-9\]+, \[dD\]\[0-9\]+, #\[0-9\]+!?\(?:\[ \t\]+@\[a-zA-Z0-9 \]+\)?\n" 1 } } */
++/* { dg-final { cleanup-saved-temps } } */
+--- a/src/gcc/testsuite/gcc.target/arm/simd/vuzps8_1.c
++++ b/src/gcc/testsuite/gcc.target/arm/simd/vuzps8_1.c
+@@ -0,0 +1,12 @@
++/* Test the `vuzps8' ARM Neon intrinsic. */
++
++/* { dg-do run } */
++/* { dg-require-effective-target arm_neon_ok } */
++/* { dg-options "-save-temps -O1 -fno-inline" } */
++/* { dg-add-options arm_neon } */
++
++#include "arm_neon.h"
++#include "../../aarch64/simd/vuzps8.x"
++
++/* { dg-final { scan-assembler-times "vuzp\.8\[ \t\]+\[dD\]\[0-9\]+, ?\[dD\]\[0-9\]+!?\(?:\[ \t\]+@\[a-zA-Z0-9 \]+\)?\n" 1 } } */
++/* { dg-final { cleanup-saved-temps } } */
+--- a/src/gcc/testsuite/gcc.target/arm/simd/vuzpqu32_1.c
++++ b/src/gcc/testsuite/gcc.target/arm/simd/vuzpqu32_1.c
+@@ -0,0 +1,12 @@
++/* Test the `vuzpQu32' ARM Neon intrinsic. */
++
++/* { dg-do run } */
++/* { dg-require-effective-target arm_neon_ok } */
++/* { dg-options "-save-temps -O1 -fno-inline" } */
++/* { dg-add-options arm_neon } */
++
++#include "arm_neon.h"
++#include "../../aarch64/simd/vuzpqu32.x"
++
++/* { dg-final { scan-assembler-times "vuzp\.32\[ \t\]+\[qQ\]\[0-9\]+, ?\[qQ\]\[0-9\]+!?\(?:\[ \t\]+@\[a-zA-Z0-9 \]+\)?\n" 1 } } */
++/* { dg-final { cleanup-saved-temps } } */
+--- a/src/gcc/testsuite/gcc.target/arm/simd/vextu32_1.c
++++ b/src/gcc/testsuite/gcc.target/arm/simd/vextu32_1.c
+@@ -0,0 +1,12 @@
++/* Test the `vextu32' ARM Neon intrinsic. */
++
++/* { dg-do run } */
++/* { dg-require-effective-target arm_neon_ok } */
++/* { dg-options "-save-temps -O3 -fno-inline" } */
++/* { dg-add-options arm_neon } */
++
++#include "arm_neon.h"
++#include "../../aarch64/simd/ext_u32.x"
++
++/* { dg-final { scan-assembler-times "vext\.32\[ \t\]+\[dD\]\[0-9\]+, \[dD\]\[0-9\]+, \[dD\]\[0-9\]+, #\[0-9\]+!?\(?:\[ \t\]+@\[a-zA-Z0-9 \]+\)?\n" 1 } } */
++/* { dg-final { cleanup-saved-temps } } */
+--- a/src/gcc/testsuite/gcc.target/arm/simd/vzipqp8_1.c
++++ b/src/gcc/testsuite/gcc.target/arm/simd/vzipqp8_1.c
+@@ -0,0 +1,12 @@
++/* Test the `vzipQp8' ARM Neon intrinsic. */
++
++/* { dg-do run } */
++/* { dg-require-effective-target arm_neon_ok } */
++/* { dg-options "-save-temps -O1 -fno-inline" } */
++/* { dg-add-options arm_neon } */
++
++#include "arm_neon.h"
++#include "../../aarch64/simd/vzipqp8.x"
+
+/* { dg-final { scan-assembler-times "vzip\.8\[ \t\]+\[qQ\]\[0-9\]+, ?\[qQ\]\[0-9\]+!?\(?:\[ \t\]+@\[a-zA-Z0-9 \]+\)?\n" 1 } } */
+/* { dg-final { cleanup-saved-temps } } */
+--- a/src/gcc/testsuite/gcc.target/arm/simd/vtrnqp8_1.c
++++ b/src/gcc/testsuite/gcc.target/arm/simd/vtrnqp8_1.c
+@@ -0,0 +1,12 @@
++/* Test the `vtrnQp8' ARM Neon intrinsic. */
++
++/* { dg-do run } */
++/* { dg-require-effective-target arm_neon_ok } */
++/* { dg-options "-save-temps -O1 -fno-inline" } */
++/* { dg-add-options arm_neon } */
++
++#include "arm_neon.h"
++#include "../../aarch64/simd/vtrnqp8.x"
++
++/* { dg-final { scan-assembler-times "vtrn\.8\[ \t\]+\[qQ\]\[0-9\]+, ?\[qQ\]\[0-9\]+!?\(?:\[ \t\]+@\[a-zA-Z0-9 \]+\)?\n" 1 } } */
++/* { dg-final { cleanup-saved-temps } } */
--- a/src/gcc/testsuite/gcc.target/arm/simd/simd.exp
+++ b/src/gcc/testsuite/gcc.target/arm/simd/simd.exp
@@ -0,0 +1,35 @@
@@ -1854,10 +4311,10 @@ LANG=C svn diff svn://gcc.gnu.org/svn/gcc/branches/gcc-4_9-branch@211979 \
+
+# All done.
+dg-finish
---- a/src/gcc/testsuite/gcc.target/arm/simd/vzipqu8_1.c
-+++ b/src/gcc/testsuite/gcc.target/arm/simd/vzipqu8_1.c
+--- a/src/gcc/testsuite/gcc.target/arm/simd/vuzpp16_1.c
++++ b/src/gcc/testsuite/gcc.target/arm/simd/vuzpp16_1.c
@@ -0,0 +1,12 @@
-+/* Test the `vzipQu8' ARM Neon intrinsic. */
++/* Test the `vuzpp16' ARM Neon intrinsic. */
+
+/* { dg-do run } */
+/* { dg-require-effective-target arm_neon_ok } */
@@ -1865,14 +4322,14 @@ LANG=C svn diff svn://gcc.gnu.org/svn/gcc/branches/gcc-4_9-branch@211979 \
+/* { dg-add-options arm_neon } */
+
+#include "arm_neon.h"
-+#include "../../aarch64/simd/vzipqu8.x"
++#include "../../aarch64/simd/vuzpp16.x"
+
-+/* { dg-final { scan-assembler-times "vzip\.8\[ \t\]+\[qQ\]\[0-9\]+, ?\[qQ\]\[0-9\]+!?\(?:\[ \t\]+@\[a-zA-Z0-9 \]+\)?\n" 1 } } */
++/* { dg-final { scan-assembler-times "vuzp\.16\[ \t\]+\[dD\]\[0-9\]+, ?\[dD\]\[0-9\]+!?\(?:\[ \t\]+@\[a-zA-Z0-9 \]+\)?\n" 1 } } */
+/* { dg-final { cleanup-saved-temps } } */
---- a/src/gcc/testsuite/gcc.target/arm/simd/vzipp8_1.c
-+++ b/src/gcc/testsuite/gcc.target/arm/simd/vzipp8_1.c
+--- a/src/gcc/testsuite/gcc.target/arm/simd/vuzps32_1.c
++++ b/src/gcc/testsuite/gcc.target/arm/simd/vuzps32_1.c
@@ -0,0 +1,12 @@
-+/* Test the `vzipp8' ARM Neon intrinsic. */
++/* Test the `vuzps32' ARM Neon intrinsic. */
+
+/* { dg-do run } */
+/* { dg-require-effective-target arm_neon_ok } */
@@ -1880,9 +4337,54 @@ LANG=C svn diff svn://gcc.gnu.org/svn/gcc/branches/gcc-4_9-branch@211979 \
+/* { dg-add-options arm_neon } */
+
+#include "arm_neon.h"
-+#include "../../aarch64/simd/vzipp8.x"
++#include "../../aarch64/simd/vuzps32.x"
+
-+/* { dg-final { scan-assembler-times "vzip\.8\[ \t\]+\[dD\]\[0-9\]+, ?\[dD\]\[0-9\]+!?\(?:\[ \t\]+@\[a-zA-Z0-9 \]+\)?\n" 1 } } */
++/* { dg-final { scan-assembler-times "vuzp\.32\[ \t\]+\[dD\]\[0-9\]+, ?\[dD\]\[0-9\]+!?\(?:\[ \t\]+@\[a-zA-Z0-9 \]+\)?\n" 1 } } */
++/* { dg-final { cleanup-saved-temps } } */
+--- a/src/gcc/testsuite/gcc.target/arm/simd/vuzpu32_1.c
++++ b/src/gcc/testsuite/gcc.target/arm/simd/vuzpu32_1.c
+@@ -0,0 +1,12 @@
++/* Test the `vuzpu32' ARM Neon intrinsic. */
++
++/* { dg-do run } */
++/* { dg-require-effective-target arm_neon_ok } */
++/* { dg-options "-save-temps -O1 -fno-inline" } */
++/* { dg-add-options arm_neon } */
++
++#include "arm_neon.h"
++#include "../../aarch64/simd/vuzpu32.x"
++
++/* { dg-final { scan-assembler-times "vuzp\.32\[ \t\]+\[dD\]\[0-9\]+, ?\[dD\]\[0-9\]+!?\(?:\[ \t\]+@\[a-zA-Z0-9 \]+\)?\n" 1 } } */
++/* { dg-final { cleanup-saved-temps } } */
+--- a/src/gcc/testsuite/gcc.target/arm/simd/vextQp16_1.c
++++ b/src/gcc/testsuite/gcc.target/arm/simd/vextQp16_1.c
+@@ -0,0 +1,12 @@
++/* Test the `vextQp16' ARM Neon intrinsic. */
++
++/* { dg-do run } */
++/* { dg-require-effective-target arm_neon_ok } */
++/* { dg-options "-save-temps -O3 -fno-inline" } */
++/* { dg-add-options arm_neon } */
++
++#include "arm_neon.h"
++#include "../../aarch64/simd/extq_p16.x"
++
++/* { dg-final { scan-assembler-times "vext\.16\[ \t\]+\[qQ\]\[0-9\]+, \[qQ\]\[0-9\]+, \[qQ\]\[0-9\]+, #\[0-9\]+!?\(?:\[ \t\]+@\[a-zA-Z0-9 \]+\)?\n" 7 } } */
++/* { dg-final { cleanup-saved-temps } } */
+--- a/src/gcc/testsuite/gcc.target/arm/simd/vextQs32_1.c
++++ b/src/gcc/testsuite/gcc.target/arm/simd/vextQs32_1.c
+@@ -0,0 +1,12 @@
++/* Test the `vextQs32' ARM Neon intrinsic. */
++
++/* { dg-do run } */
++/* { dg-require-effective-target arm_neon_ok } */
++/* { dg-options "-save-temps -O3 -fno-inline" } */
++/* { dg-add-options arm_neon } */
++
++#include "arm_neon.h"
++#include "../../aarch64/simd/extq_s32.x"
++
++/* { dg-final { scan-assembler-times "vext\.32\[ \t\]+\[qQ\]\[0-9\]+, \[qQ\]\[0-9\]+, \[qQ\]\[0-9\]+, #\[0-9\]+!?\(?:\[ \t\]+@\[a-zA-Z0-9 \]+\)?\n" 3 } } */
+/* { dg-final { cleanup-saved-temps } } */
--- a/src/gcc/testsuite/gcc.target/arm/simd/vzipqp16_1.c
+++ b/src/gcc/testsuite/gcc.target/arm/simd/vzipqp16_1.c
@@ -1914,10 +4416,10 @@ LANG=C svn diff svn://gcc.gnu.org/svn/gcc/branches/gcc-4_9-branch@211979 \
+
+/* { dg-final { scan-assembler-times "vzip\.32\[ \t\]+\[qQ\]\[0-9\]+, ?\[qQ\]\[0-9\]+!?\(?:\[ \t\]+@\[a-zA-Z0-9 \]+\)?\n" 1 } } */
+/* { dg-final { cleanup-saved-temps } } */
---- a/src/gcc/testsuite/gcc.target/arm/simd/vzipqs16_1.c
-+++ b/src/gcc/testsuite/gcc.target/arm/simd/vzipqs16_1.c
+--- a/src/gcc/testsuite/gcc.target/arm/simd/vtrnp8_1.c
++++ b/src/gcc/testsuite/gcc.target/arm/simd/vtrnp8_1.c
@@ -0,0 +1,12 @@
-+/* Test the `vzipQs16' ARM Neon intrinsic. */
++/* Test the `vtrnp8' ARM Neon intrinsic. */
+
+/* { dg-do run } */
+/* { dg-require-effective-target arm_neon_ok } */
@@ -1925,9 +4427,54 @@ LANG=C svn diff svn://gcc.gnu.org/svn/gcc/branches/gcc-4_9-branch@211979 \
+/* { dg-add-options arm_neon } */
+
+#include "arm_neon.h"
-+#include "../../aarch64/simd/vzipqs16.x"
++#include "../../aarch64/simd/vtrnp8.x"
+
-+/* { dg-final { scan-assembler-times "vzip\.16\[ \t\]+\[qQ\]\[0-9\]+, ?\[qQ\]\[0-9\]+!?\(?:\[ \t\]+@\[a-zA-Z0-9 \]+\)?\n" 1 } } */
++/* { dg-final { scan-assembler-times "vtrn\.8\[ \t\]+\[dD\]\[0-9\]+, ?\[dD\]\[0-9\]+!?\(?:\[ \t\]+@\[a-zA-Z0-9 \]+\)?\n" 1 } } */
++/* { dg-final { cleanup-saved-temps } } */
+--- a/src/gcc/testsuite/gcc.target/arm/simd/vextQu32_1.c
++++ b/src/gcc/testsuite/gcc.target/arm/simd/vextQu32_1.c
+@@ -0,0 +1,12 @@
++/* Test the `vextQu32' ARM Neon intrinsic. */
++
++/* { dg-do run } */
++/* { dg-require-effective-target arm_neon_ok } */
++/* { dg-options "-save-temps -O3 -fno-inline" } */
++/* { dg-add-options arm_neon } */
++
++#include "arm_neon.h"
++#include "../../aarch64/simd/extq_u32.x"
++
++/* { dg-final { scan-assembler-times "vext\.32\[ \t\]+\[qQ\]\[0-9\]+, \[qQ\]\[0-9\]+, \[qQ\]\[0-9\]+, #\[0-9\]+!?\(?:\[ \t\]+@\[a-zA-Z0-9 \]+\)?\n" 3 } } */
++/* { dg-final { cleanup-saved-temps } } */
+--- a/src/gcc/testsuite/gcc.target/arm/simd/vuzpqu8_1.c
++++ b/src/gcc/testsuite/gcc.target/arm/simd/vuzpqu8_1.c
+@@ -0,0 +1,12 @@
++/* Test the `vuzpQu8' ARM Neon intrinsic. */
++
++/* { dg-do run } */
++/* { dg-require-effective-target arm_neon_ok } */
++/* { dg-options "-save-temps -O1 -fno-inline" } */
++/* { dg-add-options arm_neon } */
++
++#include "arm_neon.h"
++#include "../../aarch64/simd/vuzpqu8.x"
++
++/* { dg-final { scan-assembler-times "vuzp\.8\[ \t\]+\[qQ\]\[0-9\]+, ?\[qQ\]\[0-9\]+!?\(?:\[ \t\]+@\[a-zA-Z0-9 \]+\)?\n" 1 } } */
++/* { dg-final { cleanup-saved-temps } } */
+--- a/src/gcc/testsuite/gcc.target/arm/simd/vzips8_1.c
++++ b/src/gcc/testsuite/gcc.target/arm/simd/vzips8_1.c
+@@ -0,0 +1,12 @@
++/* Test the `vzips8' ARM Neon intrinsic. */
++
++/* { dg-do run } */
++/* { dg-require-effective-target arm_neon_ok } */
++/* { dg-options "-save-temps -O1 -fno-inline" } */
++/* { dg-add-options arm_neon } */
++
++#include "arm_neon.h"
++#include "../../aarch64/simd/vzips8.x"
++
++/* { dg-final { scan-assembler-times "vzip\.8\[ \t\]+\[dD\]\[0-9\]+, ?\[dD\]\[0-9\]+!?\(?:\[ \t\]+@\[a-zA-Z0-9 \]+\)?\n" 1 } } */
+/* { dg-final { cleanup-saved-temps } } */
--- a/src/gcc/testsuite/gcc.target/arm/simd/vzipqu32_1.c
+++ b/src/gcc/testsuite/gcc.target/arm/simd/vzipqu32_1.c
@@ -1944,10 +4491,10 @@ LANG=C svn diff svn://gcc.gnu.org/svn/gcc/branches/gcc-4_9-branch@211979 \
+
+/* { dg-final { scan-assembler-times "vzip\.32\[ \t\]+\[qQ\]\[0-9\]+, ?\[qQ\]\[0-9\]+!?\(?:\[ \t\]+@\[a-zA-Z0-9 \]+\)?\n" 1 } } */
+/* { dg-final { cleanup-saved-temps } } */
---- a/src/gcc/testsuite/gcc.target/arm/simd/vzips8_1.c
-+++ b/src/gcc/testsuite/gcc.target/arm/simd/vzips8_1.c
+--- a/src/gcc/testsuite/gcc.target/arm/simd/vuzpp8_1.c
++++ b/src/gcc/testsuite/gcc.target/arm/simd/vuzpp8_1.c
@@ -0,0 +1,12 @@
-+/* Test the `vzips8' ARM Neon intrinsic. */
++/* Test the `vuzpp8' ARM Neon intrinsic. */
+
+/* { dg-do run } */
+/* { dg-require-effective-target arm_neon_ok } */
@@ -1955,10 +4502,540 @@ LANG=C svn diff svn://gcc.gnu.org/svn/gcc/branches/gcc-4_9-branch@211979 \
+/* { dg-add-options arm_neon } */
+
+#include "arm_neon.h"
-+#include "../../aarch64/simd/vzips8.x"
++#include "../../aarch64/simd/vuzpp8.x"
++
++/* { dg-final { scan-assembler-times "vuzp\.8\[ \t\]+\[dD\]\[0-9\]+, ?\[dD\]\[0-9\]+!?\(?:\[ \t\]+@\[a-zA-Z0-9 \]+\)?\n" 1 } } */
++/* { dg-final { cleanup-saved-temps } } */
+--- a/src/gcc/testsuite/gcc.target/arm/simd/vzipp16_1.c
++++ b/src/gcc/testsuite/gcc.target/arm/simd/vzipp16_1.c
+@@ -0,0 +1,12 @@
++/* Test the `vzipp16' ARM Neon intrinsic. */
++
++/* { dg-do run } */
++/* { dg-require-effective-target arm_neon_ok } */
++/* { dg-options "-save-temps -O1 -fno-inline" } */
++/* { dg-add-options arm_neon } */
++
++#include "arm_neon.h"
++#include "../../aarch64/simd/vzipp16.x"
++
++/* { dg-final { scan-assembler-times "vzip\.16\[ \t\]+\[dD\]\[0-9\]+, ?\[dD\]\[0-9\]+!?\(?:\[ \t\]+@\[a-zA-Z0-9 \]+\)?\n" 1 } } */
++/* { dg-final { cleanup-saved-temps } } */
+--- a/src/gcc/testsuite/gcc.target/arm/simd/vzips32_1.c
++++ b/src/gcc/testsuite/gcc.target/arm/simd/vzips32_1.c
+@@ -0,0 +1,12 @@
++/* Test the `vzips32' ARM Neon intrinsic. */
++
++/* { dg-do run } */
++/* { dg-require-effective-target arm_neon_ok } */
++/* { dg-options "-save-temps -O1 -fno-inline" } */
++/* { dg-add-options arm_neon } */
++
++#include "arm_neon.h"
++#include "../../aarch64/simd/vzips32.x"
++
++/* { dg-final { scan-assembler-times "vuzp\.32\[ \t\]+\[dD\]\[0-9\]+, ?\[dD\]\[0-9\]+!?\(?:\[ \t\]+@\[a-zA-Z0-9 \]+\)?\n" 1 } } */
++/* { dg-final { cleanup-saved-temps } } */
+--- a/src/gcc/testsuite/gcc.target/arm/simd/vtrnp16_1.c
++++ b/src/gcc/testsuite/gcc.target/arm/simd/vtrnp16_1.c
+@@ -0,0 +1,12 @@
++/* Test the `vtrnp16' ARM Neon intrinsic. */
++
++/* { dg-do run } */
++/* { dg-require-effective-target arm_neon_ok } */
++/* { dg-options "-save-temps -O1 -fno-inline" } */
++/* { dg-add-options arm_neon } */
++
++#include "arm_neon.h"
++#include "../../aarch64/simd/vtrnp16.x"
++
++/* { dg-final { scan-assembler-times "vtrn\.16\[ \t\]+\[dD\]\[0-9\]+, ?\[dD\]\[0-9\]+!?\(?:\[ \t\]+@\[a-zA-Z0-9 \]+\)?\n" 1 } } */
++/* { dg-final { cleanup-saved-temps } } */
+--- a/src/gcc/testsuite/gcc.target/arm/simd/vextp64_1.c
++++ b/src/gcc/testsuite/gcc.target/arm/simd/vextp64_1.c
+@@ -0,0 +1,26 @@
++/* Test the `vextp64' ARM Neon intrinsic. */
++
++/* { dg-do run } */
++/* { dg-require-effective-target arm_crypto_ok } */
++/* { dg-options "-save-temps -O3 -fno-inline" } */
++/* { dg-add-options arm_crypto } */
++
++#include "arm_neon.h"
++
++extern void abort (void);
++
++int
++main (int argc, char **argv)
++{
++ int i;
++ poly64x1_t in1 = {0};
++ poly64x1_t in2 = {1};
++ poly64x1_t actual = vext_p64 (in1, in2, 0);
++ if (actual != in1)
++ abort ();
++
++ return 0;
++}
++
++/* Don't scan assembler for vext - it can be optimized into a move from r0.
++/* { dg-final { cleanup-saved-temps } } */
+--- a/src/gcc/testsuite/gcc.target/arm/simd/vtrns32_1.c
++++ b/src/gcc/testsuite/gcc.target/arm/simd/vtrns32_1.c
+@@ -0,0 +1,12 @@
++/* Test the `vtrns32' ARM Neon intrinsic. */
++
++/* { dg-do run } */
++/* { dg-require-effective-target arm_neon_ok } */
++/* { dg-options "-save-temps -O1 -fno-inline" } */
++/* { dg-add-options arm_neon } */
++
++#include "arm_neon.h"
++#include "../../aarch64/simd/vtrns32.x"
++
++/* { dg-final { scan-assembler-times "vuzp\.32\[ \t\]+\[dD\]\[0-9\]+, ?\[dD\]\[0-9\]+!?\(?:\[ \t\]+@\[a-zA-Z0-9 \]+\)?\n" 1 } } */
++/* { dg-final { cleanup-saved-temps } } */
+--- a/src/gcc/testsuite/gcc.target/arm/simd/vzipu32_1.c
++++ b/src/gcc/testsuite/gcc.target/arm/simd/vzipu32_1.c
+@@ -0,0 +1,12 @@
++/* Test the `vzipu32' ARM Neon intrinsic. */
++
++/* { dg-do run } */
++/* { dg-require-effective-target arm_neon_ok } */
++/* { dg-options "-save-temps -O1 -fno-inline" } */
++/* { dg-add-options arm_neon } */
++
++#include "arm_neon.h"
++#include "../../aarch64/simd/vzipu32.x"
++
++/* { dg-final { scan-assembler-times "vuzp\.32\[ \t\]+\[dD\]\[0-9\]+, ?\[dD\]\[0-9\]+!?\(?:\[ \t\]+@\[a-zA-Z0-9 \]+\)?\n" 1 } } */
++/* { dg-final { cleanup-saved-temps } } */
+--- a/src/gcc/testsuite/gcc.target/arm/simd/vextQs8_1.c
++++ b/src/gcc/testsuite/gcc.target/arm/simd/vextQs8_1.c
+@@ -0,0 +1,12 @@
++/* Test the `vextQs8' ARM Neon intrinsic. */
++
++/* { dg-do run } */
++/* { dg-require-effective-target arm_neon_ok } */
++/* { dg-options "-save-temps -O3 -fno-inline" } */
++/* { dg-add-options arm_neon } */
++
++#include "arm_neon.h"
++#include "../../aarch64/simd/extq_s8.x"
++
++/* { dg-final { scan-assembler-times "vext\.8\[ \t\]+\[qQ\]\[0-9\]+, \[qQ\]\[0-9\]+, \[qQ\]\[0-9\]+, #\[0-9\]+!?\(?:\[ \t\]+@\[a-zA-Z0-9 \]+\)?\n" 15 } } */
++/* { dg-final { cleanup-saved-temps } } */
+--- a/src/gcc/testsuite/gcc.target/arm/simd/vtrnu32_1.c
++++ b/src/gcc/testsuite/gcc.target/arm/simd/vtrnu32_1.c
+@@ -0,0 +1,12 @@
++/* Test the `vtrnu32' ARM Neon intrinsic. */
++
++/* { dg-do run } */
++/* { dg-require-effective-target arm_neon_ok } */
++/* { dg-options "-save-temps -O1 -fno-inline" } */
++/* { dg-add-options arm_neon } */
++
++#include "arm_neon.h"
++#include "../../aarch64/simd/vtrnu32.x"
++
++/* { dg-final { scan-assembler-times "vuzp\.32\[ \t\]+\[dD\]\[0-9\]+, ?\[dD\]\[0-9\]+!?\(?:\[ \t\]+@\[a-zA-Z0-9 \]+\)?\n" 1 } } */
++/* { dg-final { cleanup-saved-temps } } */
+--- a/src/gcc/testsuite/gcc.target/arm/simd/vzipqu8_1.c
++++ b/src/gcc/testsuite/gcc.target/arm/simd/vzipqu8_1.c
+@@ -0,0 +1,12 @@
++/* Test the `vzipQu8' ARM Neon intrinsic. */
++
++/* { dg-do run } */
++/* { dg-require-effective-target arm_neon_ok } */
++/* { dg-options "-save-temps -O1 -fno-inline" } */
++/* { dg-add-options arm_neon } */
++
++#include "arm_neon.h"
++#include "../../aarch64/simd/vzipqu8.x"
++
++/* { dg-final { scan-assembler-times "vzip\.8\[ \t\]+\[qQ\]\[0-9\]+, ?\[qQ\]\[0-9\]+!?\(?:\[ \t\]+@\[a-zA-Z0-9 \]+\)?\n" 1 } } */
++/* { dg-final { cleanup-saved-temps } } */
+--- a/src/gcc/testsuite/gcc.target/arm/simd/vtrnqu8_1.c
++++ b/src/gcc/testsuite/gcc.target/arm/simd/vtrnqu8_1.c
+@@ -0,0 +1,12 @@
++/* Test the `vtrnQu8' ARM Neon intrinsic. */
++
++/* { dg-do run } */
++/* { dg-require-effective-target arm_neon_ok } */
++/* { dg-options "-save-temps -O1 -fno-inline" } */
++/* { dg-add-options arm_neon } */
++
++#include "arm_neon.h"
++#include "../../aarch64/simd/vtrnqu8.x"
++
++/* { dg-final { scan-assembler-times "vtrn\.8\[ \t\]+\[qQ\]\[0-9\]+, ?\[qQ\]\[0-9\]+!?\(?:\[ \t\]+@\[a-zA-Z0-9 \]+\)?\n" 1 } } */
++/* { dg-final { cleanup-saved-temps } } */
+--- a/src/gcc/testsuite/gcc.target/arm/simd/vuzpqf32_1.c
++++ b/src/gcc/testsuite/gcc.target/arm/simd/vuzpqf32_1.c
+@@ -0,0 +1,12 @@
++/* Test the `vuzpQf32' ARM Neon intrinsic. */
++
++/* { dg-do run } */
++/* { dg-require-effective-target arm_neon_ok } */
++/* { dg-options "-save-temps -O1 -fno-inline" } */
++/* { dg-add-options arm_neon } */
++
++#include "arm_neon.h"
++#include "../../aarch64/simd/vuzpqf32.x"
++
++/* { dg-final { scan-assembler-times "vuzp\.32\[ \t\]+\[qQ\]\[0-9\]+, ?\[qQ\]\[0-9\]+!?\(?:\[ \t\]+@\[a-zA-Z0-9 \]+\)?\n" 1 } } */
++/* { dg-final { cleanup-saved-temps } } */
+--- a/src/gcc/testsuite/gcc.target/arm/simd/vzipp8_1.c
++++ b/src/gcc/testsuite/gcc.target/arm/simd/vzipp8_1.c
+@@ -0,0 +1,12 @@
++/* Test the `vzipp8' ARM Neon intrinsic. */
++
++/* { dg-do run } */
++/* { dg-require-effective-target arm_neon_ok } */
++/* { dg-options "-save-temps -O1 -fno-inline" } */
++/* { dg-add-options arm_neon } */
++
++#include "arm_neon.h"
++#include "../../aarch64/simd/vzipp8.x"
+
+/* { dg-final { scan-assembler-times "vzip\.8\[ \t\]+\[dD\]\[0-9\]+, ?\[dD\]\[0-9\]+!?\(?:\[ \t\]+@\[a-zA-Z0-9 \]+\)?\n" 1 } } */
+/* { dg-final { cleanup-saved-temps } } */
+--- a/src/gcc/testsuite/gcc.target/arm/simd/vtrnqp16_1.c
++++ b/src/gcc/testsuite/gcc.target/arm/simd/vtrnqp16_1.c
+@@ -0,0 +1,12 @@
++/* Test the `vtrnQp16' ARM Neon intrinsic. */
++
++/* { dg-do run } */
++/* { dg-require-effective-target arm_neon_ok } */
++/* { dg-options "-save-temps -O1 -fno-inline" } */
++/* { dg-add-options arm_neon } */
++
++#include "arm_neon.h"
++#include "../../aarch64/simd/vtrnqp16.x"
++
++/* { dg-final { scan-assembler-times "vtrn\.16\[ \t\]+\[qQ\]\[0-9\]+, ?\[qQ\]\[0-9\]+!?\(?:\[ \t\]+@\[a-zA-Z0-9 \]+\)?\n" 1 } } */
++/* { dg-final { cleanup-saved-temps } } */
+--- a/src/gcc/testsuite/gcc.target/arm/simd/vexts8_1.c
++++ b/src/gcc/testsuite/gcc.target/arm/simd/vexts8_1.c
+@@ -0,0 +1,12 @@
++/* Test the `vexts8' ARM Neon intrinsic. */
++
++/* { dg-do run } */
++/* { dg-require-effective-target arm_neon_ok } */
++/* { dg-options "-save-temps -O3 -fno-inline" } */
++/* { dg-add-options arm_neon } */
++
++#include "arm_neon.h"
++#include "../../aarch64/simd/ext_s8.x"
++
++/* { dg-final { scan-assembler-times "vext\.8\[ \t\]+\[dD\]\[0-9\]+, \[dD\]\[0-9\]+, \[dD\]\[0-9\]+, #\[0-9\]+!?\(?:\[ \t\]+@\[a-zA-Z0-9 \]+\)?\n" 7 } } */
++/* { dg-final { cleanup-saved-temps } } */
+--- a/src/gcc/testsuite/gcc.target/arm/simd/vextQp64_1.c
++++ b/src/gcc/testsuite/gcc.target/arm/simd/vextQp64_1.c
+@@ -0,0 +1,33 @@
++/* Test the `vextQp64' ARM Neon intrinsic. */
++
++/* { dg-do run } */
++/* { dg-require-effective-target arm_crypto_ok } */
++/* { dg-options "-save-temps -O3 -fno-inline" } */
++/* { dg-add-options arm_crypto } */
++
++#include "arm_neon.h"
++
++extern void abort (void);
++
++poly64x2_t
++test_vextq_p64_1 (poly64x2_t a, poly64x2_t b)
++{
++ return vextq_p64(a, b, 1);
++}
++
++int
++main (int argc, char **argv)
++{
++ int i, off;
++ poly64x2_t in1 = {0, 1};
++ poly64x2_t in2 = {2, 3};
++ poly64x2_t actual = test_vextq_p64_1 (in1, in2);
++ for (i = 0; i < 2; i++)
++ if (actual[i] != i + 1)
++ abort ();
++
++ return 0;
++}
++
++/* { dg-final { scan-assembler-times "vext\.64\[ \t\]+\[qQ\]\[0-9\]+, \[qQ\]\[0-9\]+, \[qQ\]\[0-9\]+, #\[0-9\]+!?\(?:\[ \t\]+@\[a-zA-Z0-9 \]+\)?\n" 1 } } */
++/* { dg-final { cleanup-saved-temps } } */
+--- a/src/gcc/testsuite/gcc.target/arm/simd/vextf32_1.c
++++ b/src/gcc/testsuite/gcc.target/arm/simd/vextf32_1.c
+@@ -0,0 +1,12 @@
++/* Test the `vextf32' ARM Neon intrinsic. */
++
++/* { dg-do run } */
++/* { dg-require-effective-target arm_neon_ok } */
++/* { dg-options "-save-temps -O3 -fno-inline" } */
++/* { dg-add-options arm_neon } */
++
++#include "arm_neon.h"
++#include "../../aarch64/simd/ext_f32.x"
++
++/* { dg-final { scan-assembler-times "vext\.32\[ \t\]+\[dD\]\[0-9\]+, \[dD\]\[0-9\]+, \[dD\]\[0-9\]+, #\[0-9\]+!?\(?:\[ \t\]+@\[a-zA-Z0-9 \]+\)?\n" 1 } } */
++/* { dg-final { cleanup-saved-temps } } */
+--- a/src/gcc/testsuite/gcc.target/arm/simd/vtrnqs32_1.c
++++ b/src/gcc/testsuite/gcc.target/arm/simd/vtrnqs32_1.c
+@@ -0,0 +1,12 @@
++/* Test the `vtrnQs32' ARM Neon intrinsic. */
++
++/* { dg-do run } */
++/* { dg-require-effective-target arm_neon_ok } */
++/* { dg-options "-save-temps -O1 -fno-inline" } */
++/* { dg-add-options arm_neon } */
++
++#include "arm_neon.h"
++#include "../../aarch64/simd/vtrnqs32.x"
++
++/* { dg-final { scan-assembler-times "vtrn\.32\[ \t\]+\[qQ\]\[0-9\]+, ?\[qQ\]\[0-9\]+!?\(?:\[ \t\]+@\[a-zA-Z0-9 \]+\)?\n" 1 } } */
++/* { dg-final { cleanup-saved-temps } } */
+--- a/src/gcc/testsuite/gcc.target/arm/simd/vtrnqu32_1.c
++++ b/src/gcc/testsuite/gcc.target/arm/simd/vtrnqu32_1.c
+@@ -0,0 +1,12 @@
++/* Test the `vtrnQu32' ARM Neon intrinsic. */
++
++/* { dg-do run } */
++/* { dg-require-effective-target arm_neon_ok } */
++/* { dg-options "-save-temps -O1 -fno-inline" } */
++/* { dg-add-options arm_neon } */
++
++#include "arm_neon.h"
++#include "../../aarch64/simd/vtrnqu32.x"
++
++/* { dg-final { scan-assembler-times "vtrn\.32\[ \t\]+\[qQ\]\[0-9\]+, ?\[qQ\]\[0-9\]+!?\(?:\[ \t\]+@\[a-zA-Z0-9 \]+\)?\n" 1 } } */
++/* { dg-final { cleanup-saved-temps } } */
+--- a/src/gcc/testsuite/gcc.target/arm/simd/vtrnu8_1.c
++++ b/src/gcc/testsuite/gcc.target/arm/simd/vtrnu8_1.c
+@@ -0,0 +1,12 @@
++/* Test the `vtrnu8' ARM Neon intrinsic. */
++
++/* { dg-do run } */
++/* { dg-require-effective-target arm_neon_ok } */
++/* { dg-options "-save-temps -O1 -fno-inline" } */
++/* { dg-add-options arm_neon } */
++
++#include "arm_neon.h"
++#include "../../aarch64/simd/vtrnu8.x"
++
++/* { dg-final { scan-assembler-times "vtrn\.8\[ \t\]+\[dD\]\[0-9\]+, ?\[dD\]\[0-9\]+!?\(?:\[ \t\]+@\[a-zA-Z0-9 \]+\)?\n" 1 } } */
++/* { dg-final { cleanup-saved-temps } } */
+--- a/src/gcc/testsuite/gcc.target/arm/simd/vextQp8_1.c
++++ b/src/gcc/testsuite/gcc.target/arm/simd/vextQp8_1.c
+@@ -0,0 +1,12 @@
++/* Test the `vextQp8' ARM Neon intrinsic. */
++
++/* { dg-do run } */
++/* { dg-require-effective-target arm_neon_ok } */
++/* { dg-options "-save-temps -O3 -fno-inline" } */
++/* { dg-add-options arm_neon } */
++
++#include "arm_neon.h"
++#include "../../aarch64/simd/extq_p8.x"
++
++/* { dg-final { scan-assembler-times "vext\.8\[ \t\]+\[qQ\]\[0-9\]+, \[qQ\]\[0-9\]+, \[qQ\]\[0-9\]+, #\[0-9\]+!?\(?:\[ \t\]+@\[a-zA-Z0-9 \]+\)?\n" 15 } } */
++/* { dg-final { cleanup-saved-temps } } */
+--- a/src/gcc/testsuite/gcc.target/arm/simd/vuzpf32_1.c
++++ b/src/gcc/testsuite/gcc.target/arm/simd/vuzpf32_1.c
+@@ -0,0 +1,12 @@
++/* Test the `vuzpf32' ARM Neon intrinsic. */
++
++/* { dg-do run } */
++/* { dg-require-effective-target arm_neon_ok } */
++/* { dg-options "-save-temps -O1 -fno-inline" } */
++/* { dg-add-options arm_neon } */
++
++#include "arm_neon.h"
++#include "../../aarch64/simd/vuzpf32.x"
++
++/* { dg-final { scan-assembler-times "vuzp\.32\[ \t\]+\[dD\]\[0-9\]+, ?\[dD\]\[0-9\]+!?\(?:\[ \t\]+@\[a-zA-Z0-9 \]+\)?\n" 1 } } */
++/* { dg-final { cleanup-saved-temps } } */
+--- a/src/gcc/testsuite/gcc.target/arm/simd/vuzpqs16_1.c
++++ b/src/gcc/testsuite/gcc.target/arm/simd/vuzpqs16_1.c
+@@ -0,0 +1,12 @@
++/* Test the `vuzpQs16' ARM Neon intrinsic. */
++
++/* { dg-do run } */
++/* { dg-require-effective-target arm_neon_ok } */
++/* { dg-options "-save-temps -O1 -fno-inline" } */
++/* { dg-add-options arm_neon } */
++
++#include "arm_neon.h"
++#include "../../aarch64/simd/vuzpqs16.x"
++
++/* { dg-final { scan-assembler-times "vuzp\.16\[ \t\]+\[qQ\]\[0-9\]+, ?\[qQ\]\[0-9\]+!?\(?:\[ \t\]+@\[a-zA-Z0-9 \]+\)?\n" 1 } } */
++/* { dg-final { cleanup-saved-temps } } */
+--- a/src/gcc/testsuite/gcc.target/arm/simd/vexts16_1.c
++++ b/src/gcc/testsuite/gcc.target/arm/simd/vexts16_1.c
+@@ -0,0 +1,12 @@
++/* Test the `vexts16' ARM Neon intrinsic. */
++
++/* { dg-do run } */
++/* { dg-require-effective-target arm_neon_ok } */
++/* { dg-options "-save-temps -O3 -fno-inline" } */
++/* { dg-add-options arm_neon } */
++
++#include "arm_neon.h"
++#include "../../aarch64/simd/ext_s16.x"
++
++/* { dg-final { scan-assembler-times "vext\.16\[ \t\]+\[dD\]\[0-9\]+, \[dD\]\[0-9\]+, \[dD\]\[0-9\]+, #\[0-9\]+!?\(?:\[ \t\]+@\[a-zA-Z0-9 \]+\)?\n" 3 } } */
++/* { dg-final { cleanup-saved-temps } } */
+--- a/src/gcc/testsuite/gcc.target/arm/simd/vuzpu8_1.c
++++ b/src/gcc/testsuite/gcc.target/arm/simd/vuzpu8_1.c
+@@ -0,0 +1,12 @@
++/* Test the `vuzpu8' ARM Neon intrinsic. */
++
++/* { dg-do run } */
++/* { dg-require-effective-target arm_neon_ok } */
++/* { dg-options "-save-temps -O1 -fno-inline" } */
++/* { dg-add-options arm_neon } */
++
++#include "arm_neon.h"
++#include "../../aarch64/simd/vuzpu8.x"
++
++/* { dg-final { scan-assembler-times "vuzp\.8\[ \t\]+\[dD\]\[0-9\]+, ?\[dD\]\[0-9\]+!?\(?:\[ \t\]+@\[a-zA-Z0-9 \]+\)?\n" 1 } } */
++/* { dg-final { cleanup-saved-temps } } */
+--- a/src/gcc/testsuite/gcc.target/arm/simd/vuzpqu16_1.c
++++ b/src/gcc/testsuite/gcc.target/arm/simd/vuzpqu16_1.c
+@@ -0,0 +1,12 @@
++/* Test the `vuzpQu16' ARM Neon intrinsic. */
++
++/* { dg-do run } */
++/* { dg-require-effective-target arm_neon_ok } */
++/* { dg-options "-save-temps -O1 -fno-inline" } */
++/* { dg-add-options arm_neon } */
++
++#include "arm_neon.h"
++#include "../../aarch64/simd/vuzpqu16.x"
++
++/* { dg-final { scan-assembler-times "vuzp\.16\[ \t\]+\[qQ\]\[0-9\]+, ?\[qQ\]\[0-9\]+!?\(?:\[ \t\]+@\[a-zA-Z0-9 \]+\)?\n" 1 } } */
++/* { dg-final { cleanup-saved-temps } } */
+--- a/src/gcc/testsuite/gcc.target/arm/simd/vextQf32_1.c
++++ b/src/gcc/testsuite/gcc.target/arm/simd/vextQf32_1.c
+@@ -0,0 +1,12 @@
++/* Test the `vextQf32' ARM Neon intrinsic. */
++
++/* { dg-do run } */
++/* { dg-require-effective-target arm_neon_ok } */
++/* { dg-options "-save-temps -O3 -fno-inline" } */
++/* { dg-add-options arm_neon } */
++
++#include "arm_neon.h"
++#include "../../aarch64/simd/extq_f32.x"
++
++/* { dg-final { scan-assembler-times "vext\.32\[ \t\]+\[qQ\]\[0-9\]+, \[qQ\]\[0-9\]+, \[qQ\]\[0-9\]+, #\[0-9\]+!?\(?:\[ \t\]+@\[a-zA-Z0-9 \]+\)?\n" 3 } } */
++/* { dg-final { cleanup-saved-temps } } */
+--- a/src/gcc/testsuite/gcc.target/arm/simd/vextu16_1.c
++++ b/src/gcc/testsuite/gcc.target/arm/simd/vextu16_1.c
+@@ -0,0 +1,12 @@
++/* Test the `vextu16' ARM Neon intrinsic. */
++
++/* { dg-do run } */
++/* { dg-require-effective-target arm_neon_ok } */
++/* { dg-options "-save-temps -O3 -fno-inline" } */
++/* { dg-add-options arm_neon } */
++
++#include "arm_neon.h"
++#include "../../aarch64/simd/ext_u16.x"
++
++/* { dg-final { scan-assembler-times "vext\.16\[ \t\]+\[dD\]\[0-9\]+, \[dD\]\[0-9\]+, \[dD\]\[0-9\]+, #\[0-9\]+!?\(?:\[ \t\]+@\[a-zA-Z0-9 \]+\)?\n" 3 } } */
++/* { dg-final { cleanup-saved-temps } } */
+--- a/src/gcc/testsuite/gcc.target/arm/simd/vzipqf32_1.c
++++ b/src/gcc/testsuite/gcc.target/arm/simd/vzipqf32_1.c
+@@ -0,0 +1,12 @@
++/* Test the `vzipQf32' ARM Neon intrinsic. */
++
++/* { dg-do run } */
++/* { dg-require-effective-target arm_neon_ok } */
++/* { dg-options "-save-temps -O1 -fno-inline" } */
++/* { dg-add-options arm_neon } */
++
++#include "arm_neon.h"
++#include "../../aarch64/simd/vzipqf32.x"
++
++/* { dg-final { scan-assembler-times "vzip\.32\[ \t\]+\[qQ\]\[0-9\]+, ?\[qQ\]\[0-9\]+!?\(?:\[ \t\]+@\[a-zA-Z0-9 \]+\)?\n" 1 } } */
++/* { dg-final { cleanup-saved-temps } } */
+--- a/src/gcc/testsuite/gcc.target/arm/simd/vuzps16_1.c
++++ b/src/gcc/testsuite/gcc.target/arm/simd/vuzps16_1.c
+@@ -0,0 +1,12 @@
++/* Test the `vuzps16' ARM Neon intrinsic. */
++
++/* { dg-do run } */
++/* { dg-require-effective-target arm_neon_ok } */
++/* { dg-options "-save-temps -O1 -fno-inline" } */
++/* { dg-add-options arm_neon } */
++
++#include "arm_neon.h"
++#include "../../aarch64/simd/vuzps16.x"
++
++/* { dg-final { scan-assembler-times "vuzp\.16\[ \t\]+\[dD\]\[0-9\]+, ?\[dD\]\[0-9\]+!?\(?:\[ \t\]+@\[a-zA-Z0-9 \]+\)?\n" 1 } } */
++/* { dg-final { cleanup-saved-temps } } */
+--- a/src/gcc/testsuite/gcc.target/arm/simd/vextp8_1.c
++++ b/src/gcc/testsuite/gcc.target/arm/simd/vextp8_1.c
+@@ -0,0 +1,12 @@
++/* Test the `vextp8' ARM Neon intrinsic. */
++
++/* { dg-do run } */
++/* { dg-require-effective-target arm_neon_ok } */
++/* { dg-options "-save-temps -O3 -fno-inline" } */
++/* { dg-add-options arm_neon } */
++
++#include "arm_neon.h"
++#include "../../aarch64/simd/ext_p8.x"
++
++/* { dg-final { scan-assembler-times "vext\.8\[ \t\]+\[dD\]\[0-9\]+, \[dD\]\[0-9\]+, \[dD\]\[0-9\]+, #\[0-9\]+!?\(?:\[ \t\]+@\[a-zA-Z0-9 \]+\)?\n" 7 } } */
++/* { dg-final { cleanup-saved-temps } } */
+--- a/src/gcc/testsuite/gcc.target/arm/simd/vuzpu16_1.c
++++ b/src/gcc/testsuite/gcc.target/arm/simd/vuzpu16_1.c
+@@ -0,0 +1,12 @@
++/* Test the `vuzpu16' ARM Neon intrinsic. */
++
++/* { dg-do run } */
++/* { dg-require-effective-target arm_neon_ok } */
++/* { dg-options "-save-temps -O1 -fno-inline" } */
++/* { dg-add-options arm_neon } */
++
++#include "arm_neon.h"
++#include "../../aarch64/simd/vuzpu16.x"
++
++/* { dg-final { scan-assembler-times "vuzp\.16\[ \t\]+\[dD\]\[0-9\]+, ?\[dD\]\[0-9\]+!?\(?:\[ \t\]+@\[a-zA-Z0-9 \]+\)?\n" 1 } } */
++/* { dg-final { cleanup-saved-temps } } */
+--- a/src/gcc/testsuite/gcc.target/arm/simd/vuzpqs8_1.c
++++ b/src/gcc/testsuite/gcc.target/arm/simd/vuzpqs8_1.c
+@@ -0,0 +1,12 @@
++/* Test the `vuzpQs8' ARM Neon intrinsic. */
++
++/* { dg-do run } */
++/* { dg-require-effective-target arm_neon_ok } */
++/* { dg-options "-save-temps -O1 -fno-inline" } */
++/* { dg-add-options arm_neon } */
++
++#include "arm_neon.h"
++#include "../../aarch64/simd/vuzpqs8.x"
++
++/* { dg-final { scan-assembler-times "vuzp\.8\[ \t\]+\[qQ\]\[0-9\]+, ?\[qQ\]\[0-9\]+!?\(?:\[ \t\]+@\[a-zA-Z0-9 \]+\)?\n" 1 } } */
++/* { dg-final { cleanup-saved-temps } } */
+--- a/src/gcc/testsuite/gcc.target/arm/simd/vextQs16_1.c
++++ b/src/gcc/testsuite/gcc.target/arm/simd/vextQs16_1.c
+@@ -0,0 +1,12 @@
++/* Test the `vextQs16' ARM Neon intrinsic. */
++
++/* { dg-do run } */
++/* { dg-require-effective-target arm_neon_ok } */
++/* { dg-options "-save-temps -O3 -fno-inline" } */
++/* { dg-add-options arm_neon } */
++
++#include "arm_neon.h"
++#include "../../aarch64/simd/extq_s16.x"
++
++/* { dg-final { scan-assembler-times "vext\.16\[ \t\]+\[qQ\]\[0-9\]+, \[qQ\]\[0-9\]+, \[qQ\]\[0-9\]+, #\[0-9\]+!?\(?:\[ \t\]+@\[a-zA-Z0-9 \]+\)?\n" 7 } } */
++/* { dg-final { cleanup-saved-temps } } */
--- a/src/gcc/testsuite/gcc.target/arm/simd/vzipf32_1.c
+++ b/src/gcc/testsuite/gcc.target/arm/simd/vzipf32_1.c
@@ -0,0 +1,12 @@
@@ -1974,6 +5051,51 @@ LANG=C svn diff svn://gcc.gnu.org/svn/gcc/branches/gcc-4_9-branch@211979 \
+
+/* { dg-final { scan-assembler-times "vuzp\.32\[ \t\]+\[dD\]\[0-9\]+, ?\[dD\]\[0-9\]+!?\(?:\[ \t\]+@\[a-zA-Z0-9 \]+\)?\n" 1 } } */
+/* { dg-final { cleanup-saved-temps } } */
+--- a/src/gcc/testsuite/gcc.target/arm/simd/vextQu16_1.c
++++ b/src/gcc/testsuite/gcc.target/arm/simd/vextQu16_1.c
+@@ -0,0 +1,12 @@
++/* Test the `vextQu16' ARM Neon intrinsic. */
++
++/* { dg-do run } */
++/* { dg-require-effective-target arm_neon_ok } */
++/* { dg-options "-save-temps -O3 -fno-inline" } */
++/* { dg-add-options arm_neon } */
++
++#include "arm_neon.h"
++#include "../../aarch64/simd/extq_u16.x"
++
++/* { dg-final { scan-assembler-times "vext\.16\[ \t\]+\[qQ\]\[0-9\]+, \[qQ\]\[0-9\]+, \[qQ\]\[0-9\]+, #\[0-9\]+!?\(?:\[ \t\]+@\[a-zA-Z0-9 \]+\)?\n" 7 } } */
++/* { dg-final { cleanup-saved-temps } } */
+--- a/src/gcc/testsuite/gcc.target/arm/simd/vzipqs16_1.c
++++ b/src/gcc/testsuite/gcc.target/arm/simd/vzipqs16_1.c
+@@ -0,0 +1,12 @@
++/* Test the `vzipQs16' ARM Neon intrinsic. */
++
++/* { dg-do run } */
++/* { dg-require-effective-target arm_neon_ok } */
++/* { dg-options "-save-temps -O1 -fno-inline" } */
++/* { dg-add-options arm_neon } */
++
++#include "arm_neon.h"
++#include "../../aarch64/simd/vzipqs16.x"
++
++/* { dg-final { scan-assembler-times "vzip\.16\[ \t\]+\[qQ\]\[0-9\]+, ?\[qQ\]\[0-9\]+!?\(?:\[ \t\]+@\[a-zA-Z0-9 \]+\)?\n" 1 } } */
++/* { dg-final { cleanup-saved-temps } } */
+--- a/src/gcc/testsuite/gcc.target/arm/simd/vtrnf32_1.c
++++ b/src/gcc/testsuite/gcc.target/arm/simd/vtrnf32_1.c
+@@ -0,0 +1,12 @@
++/* Test the `vtrnf32' ARM Neon intrinsic. */
++
++/* { dg-do run } */
++/* { dg-require-effective-target arm_neon_ok } */
++/* { dg-options "-save-temps -O1 -fno-inline" } */
++/* { dg-add-options arm_neon } */
++
++#include "arm_neon.h"
++#include "../../aarch64/simd/vtrnf32.x"
++
++/* { dg-final { scan-assembler-times "vuzp\.32\[ \t\]+\[dD\]\[0-9\]+, ?\[dD\]\[0-9\]+!?\(?:\[ \t\]+@\[a-zA-Z0-9 \]+\)?\n" 1 } } */
++/* { dg-final { cleanup-saved-temps } } */
--- a/src/gcc/testsuite/gcc.target/arm/simd/vzipqu16_1.c
+++ b/src/gcc/testsuite/gcc.target/arm/simd/vzipqu16_1.c
@@ -0,0 +1,12 @@
@@ -2125,408 +5247,244 @@ LANG=C svn diff svn://gcc.gnu.org/svn/gcc/branches/gcc-4_9-branch@211979 \
+/* { dg-final { scan-assembler-times "bic\t" 6 } } */
+
+/* { dg-final { cleanup-saved-temps } } */
---- a/src/gcc/testsuite/gcc.target/aarch64/vdup_lane_2.c
-+++ b/src/gcc/testsuite/gcc.target/aarch64/vdup_lane_2.c
-@@ -0,0 +1,343 @@
-+/* Test vdup_lane intrinsics work correctly. */
+--- a/src/gcc/testsuite/gcc.target/aarch64/vqabs_s64_1.c
++++ b/src/gcc/testsuite/gcc.target/aarch64/vqabs_s64_1.c
+@@ -0,0 +1,54 @@
++/* Test vqabs_s64 intrinsics work correctly. */
+/* { dg-do run } */
-+/* { dg-options "-O1 --save-temps" } */
++/* { dg-options "--save-temps" } */
+
+#include <arm_neon.h>
+
-+#define force_simd(V1) asm volatile ("" \
-+ : "=w"(V1) \
-+ : "w"(V1) \
-+ : /* No clobbers */)
-+
+extern void abort (void);
+
-+float32_t __attribute__ ((noinline))
-+wrap_vdups_lane_f32_0 (float32x2_t dummy, float32x2_t a)
-+{
-+ return vdups_lane_f32 (a, 0);
-+}
-+
-+float32_t __attribute__ ((noinline))
-+wrap_vdups_lane_f32_1 (float32x2_t a)
-+{
-+ return vdups_lane_f32 (a, 1);
-+}
-+
+int __attribute__ ((noinline))
-+test_vdups_lane_f32 ()
-+{
-+ float32x2_t a;
-+ float32_t b;
-+ float32_t c[2] = { 0.0, 1.0 };
-+
-+ a = vld1_f32 (c);
-+ b = wrap_vdups_lane_f32_0 (a, a);
-+ if (c[0] != b)
-+ return 1;
-+ b = wrap_vdups_lane_f32_1 (a);
-+ if (c[1] != b)
-+ return 1;
-+ return 0;
-+}
-+
-+float64_t __attribute__ ((noinline))
-+wrap_vdupd_lane_f64_0 (float64x1_t dummy, float64x1_t a)
++test_vqabs_s64 (int64x1_t passed, int64_t expected)
+{
-+ return vdupd_lane_f64 (a, 0);
++ return vget_lane_s64 (vqabs_s64 (passed), 0) != expected;
+}
+
+int __attribute__ ((noinline))
-+test_vdupd_lane_f64 ()
++test_vqabsd_s64 (int64_t passed, int64_t expected)
+{
-+ float64x1_t a;
-+ float64_t b;
-+ float64_t c[1] = { 0.0 };
-+ a = vld1_f64 (c);
-+ b = wrap_vdupd_lane_f64_0 (a, a);
-+ if (c[0] != b)
-+ return 1;
-+ return 0;
++ return vqabsd_s64 (passed) != expected;
+}
+
-+int8_t __attribute__ ((noinline))
-+wrap_vdupb_lane_s8_0 (int8x8_t dummy, int8x8_t a)
-+{
-+ int8_t result = vdupb_lane_s8 (a, 0);
-+ force_simd (result);
-+ return result;
-+}
++/* { dg-final { scan-assembler-times "sqabs\\td\[0-9\]+, d\[0-9\]+" 2 } } */
+
-+int8_t __attribute__ ((noinline))
-+wrap_vdupb_lane_s8_1 (int8x8_t a)
++int
++main (int argc, char **argv)
+{
-+ int8_t result = vdupb_lane_s8 (a, 1);
-+ force_simd (result);
-+ return result;
-+}
++ /* Basic test. */
++ if (test_vqabs_s64 (vcreate_s64 (-1), 1))
++ abort ();
++ if (test_vqabsd_s64 (-1, 1))
++ abort ();
+
-+int __attribute__ ((noinline))
-+test_vdupb_lane_s8 ()
-+{
-+ int8x8_t a;
-+ int8_t b;
-+ int8_t c[8] = { 0, 1, 2, 3, 4, 5, 6, 7 };
++ /* Getting absolute value of min int64_t.
++ Note, exact result cannot be represented in int64_t,
++ so max int64_t is expected. */
++ if (test_vqabs_s64 (vcreate_s64 (0x8000000000000000), 0x7fffffffffffffff))
++ abort ();
++ if (test_vqabsd_s64 (0x8000000000000000, 0x7fffffffffffffff))
++ abort ();
+
-+ a = vld1_s8 (c);
-+ b = wrap_vdupb_lane_s8_0 (a, a);
-+ if (c[0] != b)
-+ return 1;
-+ b = wrap_vdupb_lane_s8_1 (a);
-+ if (c[1] != b)
-+ return 1;
++ /* Another input that gets max int64_t. */
++ if (test_vqabs_s64 (vcreate_s64 (0x8000000000000001), 0x7fffffffffffffff))
++ abort ();
++ if (test_vqabsd_s64 (0x8000000000000001, 0x7fffffffffffffff))
++ abort ();
++
++ /* Checking that large positive numbers stay the same. */
++ if (test_vqabs_s64 (vcreate_s64 (0x7fffffffffffffff), 0x7fffffffffffffff))
++ abort ();
++ if (test_vqabsd_s64 (0x7fffffffffffffff, 0x7fffffffffffffff))
++ abort ();
+
+ return 0;
+}
++/* { dg-final { cleanup-saved-temps } } */
+--- a/src/gcc/testsuite/gcc.target/aarch64/acle/acle.exp
++++ b/src/gcc/testsuite/gcc.target/aarch64/acle/acle.exp
+@@ -0,0 +1,35 @@
++# Copyright (C) 2014 Free Software Foundation, Inc.
+
-+uint8_t __attribute__ ((noinline))
-+wrap_vdupb_lane_u8_0 (uint8x8_t dummy, uint8x8_t a)
-+{
-+ uint8_t result = vdupb_lane_u8 (a, 0);
-+ force_simd (result);
-+ return result;
-+}
++# This program is free software; you can redistribute it and/or modify
++# it under the terms of the GNU General Public License as published by
++# the Free Software Foundation; either version 3 of the License, or
++# (at your option) any later version.
++#
++# This program is distributed in the hope that it will be useful,
++# but WITHOUT ANY WARRANTY; without even the implied warranty of
++# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
++# GNU General Public License for more details.
++#
++# You should have received a copy of the GNU General Public License
++# along with GCC; see the file COPYING3. If not see
++# <http://www.gnu.org/licenses/>.
+
-+uint8_t __attribute__ ((noinline))
-+wrap_vdupb_lane_u8_1 (uint8x8_t a)
-+{
-+ uint8_t result = vdupb_lane_u8 (a, 1);
-+ force_simd (result);
-+ return result;
++# GCC testsuite that uses the `dg.exp' driver.
++
++# Exit immediately if this isn't an AArch64 target.
++if ![istarget aarch64*-*-*] then {
++ return
+}
+
-+int __attribute__ ((noinline))
-+test_vdupb_lane_u8 ()
-+{
-+ uint8x8_t a;
-+ uint8_t b;
-+ uint8_t c[8] = { 0, 1, 2, 3, 4, 5, 6, 7 };
++# Load support procs.
++load_lib gcc-dg.exp
+
-+ a = vld1_u8 (c);
-+ b = wrap_vdupb_lane_u8_0 (a, a);
-+ if (c[0] != b)
-+ return 1;
-+ b = wrap_vdupb_lane_u8_1 (a);
-+ if (c[1] != b)
-+ return 1;
-+ return 0;
-+}
++# Initialize `dg'.
++dg-init
+
-+int16_t __attribute__ ((noinline))
-+wrap_vduph_lane_s16_0 (int16x4_t dummy, int16x4_t a)
-+{
-+ int16_t result = vduph_lane_s16 (a, 0);
-+ force_simd (result);
-+ return result;
-+}
++# Main loop.
++dg-runtest [lsort [glob -nocomplain $srcdir/$subdir/*.\[cCS\]]] \
++ "" ""
+
-+int16_t __attribute__ ((noinline))
-+wrap_vduph_lane_s16_1 (int16x4_t a)
-+{
-+ int16_t result = vduph_lane_s16 (a, 1);
-+ force_simd (result);
-+ return result;
-+}
++# All done.
++dg-finish
+--- a/src/gcc/testsuite/gcc.target/aarch64/acle/crc32b.c
++++ b/src/gcc/testsuite/gcc.target/aarch64/acle/crc32b.c
+@@ -0,0 +1,15 @@
++/* Test the crc32b ACLE intrinsic. */
+
-+int __attribute__ ((noinline))
-+test_vduph_lane_s16 ()
-+{
-+ int16x4_t a;
-+ int16_t b;
-+ int16_t c[4] = { 0, 1, 2, 3 };
++/* { dg-do assemble } */
++/* { dg-options "-save-temps -O2 -march=armv8-a+crc" } */
+
-+ a = vld1_s16 (c);
-+ b = wrap_vduph_lane_s16_0 (a, a);
-+ if (c[0] != b)
-+ return 1;
-+ b = wrap_vduph_lane_s16_1 (a);
-+ if (c[1] != b)
-+ return 1;
-+ return 0;
-+}
++#include "arm_acle.h"
+
-+uint16_t __attribute__ ((noinline))
-+wrap_vduph_lane_u16_0 (uint16x4_t dummy, uint16x4_t a)
++uint32_t
++test_crc32b (uint32_t arg0, uint8_t arg1)
+{
-+ uint16_t result = vduph_lane_u16 (a, 0);
-+ force_simd (result);
-+ return result;
++ return __crc32b (arg0, arg1);
+}
+
-+uint16_t __attribute__ ((noinline))
-+wrap_vduph_lane_u16_1 (uint16x4_t a)
-+{
-+ uint16_t result = vduph_lane_u16 (a, 1);
-+ force_simd (result);
-+ return result;
-+}
++/* { dg-final { scan-assembler "crc32b\tw..?, w..?, w..?\n" } } */
++/* { dg-final { cleanup-saved-temps } } */
+--- a/src/gcc/testsuite/gcc.target/aarch64/acle/crc32d.c
++++ b/src/gcc/testsuite/gcc.target/aarch64/acle/crc32d.c
+@@ -0,0 +1,15 @@
++/* Test the crc32d ACLE intrinsic. */
+
-+int __attribute__ ((noinline))
-+test_vduph_lane_u16 ()
-+{
-+ uint16x4_t a;
-+ uint16_t b;
-+ uint16_t c[4] = { 0, 1, 2, 3 };
++/* { dg-do assemble } */
++/* { dg-options "-save-temps -O2 -march=armv8-a+crc" } */
+
-+ a = vld1_u16 (c);
-+ b = wrap_vduph_lane_u16_0 (a, a);
-+ if (c[0] != b)
-+ return 1;
-+ b = wrap_vduph_lane_u16_1 (a);
-+ if (c[1] != b)
-+ return 1;
-+ return 0;
-+}
++#include "arm_acle.h"
+
-+int32_t __attribute__ ((noinline))
-+wrap_vdups_lane_s32_0 (int32x2_t dummy, int32x2_t a)
++uint32_t
++test_crc32d (uint32_t arg0, uint64_t arg1)
+{
-+ int32_t result = vdups_lane_s32 (a, 0);
-+ force_simd (result);
-+ return result;
++ return __crc32d (arg0, arg1);
+}
+
-+int32_t __attribute__ ((noinline))
-+wrap_vdups_lane_s32_1 (int32x2_t a)
-+{
-+ int32_t result = vdups_lane_s32 (a, 1);
-+ force_simd (result);
-+ return result;
-+}
++/* { dg-final { scan-assembler "crc32x\tw..?, w..?, x..?\n" } } */
++/* { dg-final { cleanup-saved-temps } } */
+--- a/src/gcc/testsuite/gcc.target/aarch64/acle/crc32cb.c
++++ b/src/gcc/testsuite/gcc.target/aarch64/acle/crc32cb.c
+@@ -0,0 +1,15 @@
++/* Test the crc32cb ACLE intrinsic. */
+
-+int __attribute__ ((noinline))
-+test_vdups_lane_s32 ()
-+{
-+ int32x2_t a;
-+ int32_t b;
-+ int32_t c[2] = { 0, 1 };
++/* { dg-do assemble } */
++/* { dg-options "-save-temps -O2 -march=armv8-a+crc" } */
+
-+ a = vld1_s32 (c);
-+ b = wrap_vdups_lane_s32_0 (vcreate_s32 (0), a);
-+ if (c[0] != b)
-+ return 1;
-+ b = wrap_vdups_lane_s32_1 (a);
-+ if (c[1] != b)
-+ return 1;
-+ return 0;
-+}
++#include "arm_acle.h"
+
-+uint32_t __attribute__ ((noinline))
-+wrap_vdups_lane_u32_0 (uint32x2_t dummy, uint32x2_t a)
++uint32_t
++test_crc32cb (uint32_t arg0, uint8_t arg1)
+{
-+ uint32_t result = vdups_lane_u32 (a, 0);
-+ force_simd (result);
-+ return result;
++ return __crc32cb (arg0, arg1);
+}
+
-+uint32_t __attribute__ ((noinline))
-+wrap_vdups_lane_u32_1 (uint32x2_t a)
-+{
-+ uint32_t result = vdups_lane_u32 (a, 1);
-+ force_simd (result);
-+ return result;
-+}
++/* { dg-final { scan-assembler "crc32cb\tw..?, w..?, w..?\n" } } */
++/* { dg-final { cleanup-saved-temps } } */
+--- a/src/gcc/testsuite/gcc.target/aarch64/acle/crc32cd.c
++++ b/src/gcc/testsuite/gcc.target/aarch64/acle/crc32cd.c
+@@ -0,0 +1,15 @@
++/* Test the crc32cd ACLE intrinsic. */
+
-+int __attribute__ ((noinline))
-+test_vdups_lane_u32 ()
-+{
-+ uint32x2_t a;
-+ uint32_t b;
-+ uint32_t c[2] = { 0, 1 };
-+ a = vld1_u32 (c);
-+ b = wrap_vdups_lane_u32_0 (a, a);
-+ if (c[0] != b)
-+ return 1;
-+ b = wrap_vdups_lane_u32_1 (a);
-+ if (c[1] != b)
-+ return 1;
-+ return 0;
-+}
++/* { dg-do assemble } */
++/* { dg-options "-save-temps -O2 -march=armv8-a+crc" } */
+
-+uint64_t __attribute__ ((noinline))
-+wrap_vdupd_lane_u64_0 (uint64x1_t dummy, uint64x1_t a)
-+{
-+ return vdupd_lane_u64 (a, 0);;
-+}
++#include "arm_acle.h"
+
-+int __attribute__ ((noinline))
-+test_vdupd_lane_u64 ()
++uint32_t
++test_crc32cd (uint32_t arg0, uint64_t arg1)
+{
-+ uint64x1_t a;
-+ uint64_t b;
-+ uint64_t c[1] = { 0 };
-+
-+ a = vld1_u64 (c);
-+ b = wrap_vdupd_lane_u64_0 (a, a);
-+ if (c[0] != b)
-+ return 1;
-+ return 0;
++ return __crc32cd (arg0, arg1);
+}
+
-+int64_t __attribute__ ((noinline))
-+wrap_vdupd_lane_s64_0 (uint64x1_t dummy, int64x1_t a)
-+{
-+ return vdupd_lane_u64 (a, 0);
-+}
++/* { dg-final { scan-assembler "crc32cx\tw..?, w..?, x..?\n" } } */
++/* { dg-final { cleanup-saved-temps } } */
+--- a/src/gcc/testsuite/gcc.target/aarch64/acle/crc32w.c
++++ b/src/gcc/testsuite/gcc.target/aarch64/acle/crc32w.c
+@@ -0,0 +1,15 @@
++/* Test the crc32w ACLE intrinsic. */
+
-+int __attribute__ ((noinline))
-+test_vdupd_lane_s64 ()
-+{
-+ int64x1_t a;
-+ int64_t b;
-+ int64_t c[1] = { 0 };
++/* { dg-do assemble } */
++/* { dg-options "-save-temps -O2 -march=armv8-a+crc" } */
+
-+ a = vld1_s64 (c);
-+ b = wrap_vdupd_lane_s64_0 (a, a);
-+ if (c[0] != b)
-+ return 1;
-+ return 0;
-+}
++#include "arm_acle.h"
+
-+int
-+main ()
++uint32_t
++test_crc32w (uint32_t arg0, uint32_t arg1)
+{
-+ if (test_vdups_lane_f32 ())
-+ abort ();
-+ if (test_vdupd_lane_f64 ())
-+ abort ();
-+ if (test_vdupb_lane_s8 ())
-+ abort ();
-+ if (test_vdupb_lane_u8 ())
-+ abort ();
-+ if (test_vduph_lane_s16 ())
-+ abort ();
-+ if (test_vduph_lane_u16 ())
-+ abort ();
-+ if (test_vdups_lane_s32 ())
-+ abort ();
-+ if (test_vdups_lane_u32 ())
-+ abort ();
-+ if (test_vdupd_lane_s64 ())
-+ abort ();
-+ if (test_vdupd_lane_u64 ())
-+ abort ();
-+ return 0;
++ return __crc32w (arg0, arg1);
+}
+
-+/* Asm check for vdupb_lane_s8, vdupb_lane_u8. */
-+/* { dg-final { scan-assembler-not "dup\\tb\[0-9\]+, v\[0-9\]+\.b\\\[0\\\]" } } */
-+/* { dg-final { scan-assembler-times "dup\\tb\[0-9\]+, v\[0-9\]+\.b\\\[1\\\]" 2 } } */
-+
-+/* Asm check for vduph_lane_h16, vduph_lane_h16. */
-+/* { dg-final { scan-assembler-not "dup\\th\[0-9\]+, v\[0-9\]+\.h\\\[0\\\]" } } */
-+/* { dg-final { scan-assembler-times "dup\\th\[0-9\]+, v\[0-9\]+\.h\\\[1\\\]" 2 } } */
-+
-+/* Asm check for vdups_lane_f32, vdups_lane_s32, vdups_lane_u32. */
-+/* Can't generate "dup s<n>, v<m>[0]" for vdups_lane_s32 and vdups_lane_u32. */
-+/* { dg-final { scan-assembler-times "dup\\ts\[0-9\]+, v\[0-9\]+\.s\\\[0\\\]" 1} } */
-+/* { dg-final { scan-assembler-times "dup\\ts\[0-9\]+, v\[0-9\]+\.s\\\[1\\\]" 3 } } */
-+
-+/* Asm check for vdupd_lane_f64, vdupd_lane_s64, vdupd_lane_u64. */
-+/* Attempts to make the compiler generate vdupd are not practical. */
-+/* { dg-final { scan-assembler-not "dup\\td\[0-9\]+, v\[0-9\]+\.d\\\[0\\\]" } }
-+
++/* { dg-final { scan-assembler "crc32w\tw..?, w..?, w..?\n" } } */
+/* { dg-final { cleanup-saved-temps } } */
---- a/src/gcc/testsuite/gcc.target/aarch64/vqabs_s64_1.c
-+++ b/src/gcc/testsuite/gcc.target/aarch64/vqabs_s64_1.c
-@@ -0,0 +1,54 @@
-+/* Test vqabs_s64 intrinsics work correctly. */
-+/* { dg-do run } */
-+/* { dg-options "--save-temps" } */
+--- a/src/gcc/testsuite/gcc.target/aarch64/acle/crc32h.c
++++ b/src/gcc/testsuite/gcc.target/aarch64/acle/crc32h.c
+@@ -0,0 +1,15 @@
++/* Test the crc32h ACLE intrinsic. */
+
-+#include <arm_neon.h>
++/* { dg-do assemble } */
++/* { dg-options "-save-temps -O2 -march=armv8-a+crc" } */
+
-+extern void abort (void);
++#include "arm_acle.h"
+
-+int __attribute__ ((noinline))
-+test_vqabs_s64 (int64x1_t passed, int64_t expected)
++uint32_t
++test_crc32h (uint32_t arg0, uint16_t arg1)
+{
-+ return vget_lane_s64 (vqabs_s64 (passed), 0) != expected;
++ return __crc32h (arg0, arg1);
+}
+
-+int __attribute__ ((noinline))
-+test_vqabsd_s64 (int64_t passed, int64_t expected)
-+{
-+ return vqabsd_s64 (passed) != expected;
-+}
++/* { dg-final { scan-assembler "crc32h\tw..?, w..?, w..?\n" } } */
++/* { dg-final { cleanup-saved-temps } } */
+--- a/src/gcc/testsuite/gcc.target/aarch64/acle/crc32cw.c
++++ b/src/gcc/testsuite/gcc.target/aarch64/acle/crc32cw.c
+@@ -0,0 +1,15 @@
++/* Test the crc32cw ACLE intrinsic. */
+
-+/* { dg-final { scan-assembler-times "sqabs\\td\[0-9\]+, d\[0-9\]+" 2 } } */
++/* { dg-do assemble } */
++/* { dg-options "-save-temps -O2 -march=armv8-a+crc" } */
+
-+int
-+main (int argc, char **argv)
++#include "arm_acle.h"
++
++uint32_t
++test_crc32cw (uint32_t arg0, uint32_t arg1)
+{
-+ /* Basic test. */
-+ if (test_vqabs_s64 (vcreate_s64 (-1), 1))
-+ abort ();
-+ if (test_vqabsd_s64 (-1, 1))
-+ abort ();
++ return __crc32cw (arg0, arg1);
++}
+
-+ /* Getting absolute value of min int64_t.
-+ Note, exact result cannot be represented in int64_t,
-+ so max int64_t is expected. */
-+ if (test_vqabs_s64 (vcreate_s64 (0x8000000000000000), 0x7fffffffffffffff))
-+ abort ();
-+ if (test_vqabsd_s64 (0x8000000000000000, 0x7fffffffffffffff))
-+ abort ();
++/* { dg-final { scan-assembler "crc32cw\tw..?, w..?, w..?\n" } } */
++/* { dg-final { cleanup-saved-temps } } */
+--- a/src/gcc/testsuite/gcc.target/aarch64/acle/crc32ch.c
++++ b/src/gcc/testsuite/gcc.target/aarch64/acle/crc32ch.c
+@@ -0,0 +1,15 @@
++/* Test the crc32ch ACLE intrinsic. */
+
-+ /* Another input that gets max int64_t. */
-+ if (test_vqabs_s64 (vcreate_s64 (0x8000000000000001), 0x7fffffffffffffff))
-+ abort ();
-+ if (test_vqabsd_s64 (0x8000000000000001, 0x7fffffffffffffff))
-+ abort ();
++/* { dg-do assemble } */
++/* { dg-options "-save-temps -O2 -march=armv8-a+crc" } */
+
-+ /* Checking that large positive numbers stay the same. */
-+ if (test_vqabs_s64 (vcreate_s64 (0x7fffffffffffffff), 0x7fffffffffffffff))
-+ abort ();
-+ if (test_vqabsd_s64 (0x7fffffffffffffff, 0x7fffffffffffffff))
-+ abort ();
++#include "arm_acle.h"
+
-+ return 0;
++uint32_t
++test_crc32ch (uint32_t arg0, uint16_t arg1)
++{
++ return __crc32ch (arg0, arg1);
+}
++
++/* { dg-final { scan-assembler "crc32ch\tw..?, w..?, w..?\n" } } */
+/* { dg-final { cleanup-saved-temps } } */
--- a/src/gcc/testsuite/gcc.target/aarch64/vreinterpret_f64_1.c
+++ b/src/gcc/testsuite/gcc.target/aarch64/vreinterpret_f64_1.c
@@ -3127,198 +6085,2154 @@ LANG=C svn diff svn://gcc.gnu.org/svn/gcc/branches/gcc-4_9-branch@211979 \
+
+ return 0;
+}
---- a/src/gcc/testsuite/gcc.target/aarch64/vrnd_f64_1.c
-+++ b/src/gcc/testsuite/gcc.target/aarch64/vrnd_f64_1.c
-@@ -0,0 +1,105 @@
-+/* Test vrnd_f64 works correctly. */
+--- a/src/gcc/testsuite/gcc.target/aarch64/simd/extq_s16.x
++++ b/src/gcc/testsuite/gcc.target/aarch64/simd/extq_s16.x
+@@ -0,0 +1,114 @@
++extern void abort (void);
++
++int16x8_t
++test_vextq_s16_1 (int16x8_t a, int16x8_t b)
++{
++ return vextq_s16 (a, b, 1);
++}
++
++int16x8_t
++test_vextq_s16_2 (int16x8_t a, int16x8_t b)
++{
++ return vextq_s16 (a, b, 2);
++}
++
++int16x8_t
++test_vextq_s16_3 (int16x8_t a, int16x8_t b)
++{
++ return vextq_s16 (a, b, 3);
++}
++
++int16x8_t
++test_vextq_s16_4 (int16x8_t a, int16x8_t b)
++{
++ return vextq_s16 (a, b, 4);
++}
++
++int16x8_t
++test_vextq_s16_5 (int16x8_t a, int16x8_t b)
++{
++ return vextq_s16 (a, b, 5);
++}
++
++int16x8_t
++test_vextq_s16_6 (int16x8_t a, int16x8_t b)
++{
++ return vextq_s16 (a, b, 6);
++}
++
++int16x8_t
++test_vextq_s16_7 (int16x8_t a, int16x8_t b)
++{
++ return vextq_s16 (a, b, 7);
++}
++
++int
++main (int argc, char **argv)
++{
++ int i, off;
++ int16_t arr1[] = {0, 1, 2, 3, 4, 5, 6, 7};
++ int16x8_t in1 = vld1q_s16 (arr1);
++ int16_t arr2[] = {8, 9, 10, 11, 12, 13, 14, 15};
++ int16x8_t in2 = vld1q_s16 (arr2);
++ int16_t exp[8];
++ int16x8_t expected;
++ int16x8_t actual = test_vextq_s16_1 (in1, in2);
++
++ for (i = 0; i < 8; i++)
++ exp[i] = i + 1;
++ expected = vld1q_s16 (exp);
++ for (i = 0; i < 8; i++)
++ if (actual[i] != expected[i])
++ abort ();
++
++ actual = test_vextq_s16_2 (in1, in2);
++ for (i = 0; i < 8; i++)
++ exp[i] = i + 2;
++ expected = vld1q_s16 (exp);
++ for (i = 0; i < 8; i++)
++ if (actual[i] != expected[i])
++ abort ();
++
++ actual = test_vextq_s16_3 (in1, in2);
++ for (i = 0; i < 8; i++)
++ exp[i] = i + 3;
++ expected = vld1q_s16 (exp);
++ for (i = 0; i < 8; i++)
++ if (actual[i] != expected[i])
++ abort ();
++
++ actual = test_vextq_s16_4 (in1, in2);
++ for (i = 0; i < 8; i++)
++ exp[i] = i + 4;
++ expected = vld1q_s16 (exp);
++ for (i = 0; i < 8; i++)
++ if (actual[i] != expected[i])
++ abort ();
++
++ actual = test_vextq_s16_5 (in1, in2);
++ for (i = 0; i < 8; i++)
++ exp[i] = i + 5;
++ expected = vld1q_s16 (exp);
++ for (i = 0; i < 8; i++)
++ if (actual[i] != expected[i])
++ abort ();
++
++ actual = test_vextq_s16_6 (in1, in2);
++ for (i = 0; i < 8; i++)
++ exp[i] = i + 6;
++ expected = vld1q_s16 (exp);
++ for (i = 0; i < 8; i++)
++ if (actual[i] != expected[i])
++ abort ();
++
++ actual = test_vextq_s16_7 (in1, in2);
++ for (i = 0; i < 8; i++)
++ exp[i] = i + 7;
++ expected = vld1q_s16 (exp);
++ for (i = 0; i < 8; i++)
++ if (actual[i] != expected[i])
++ abort ();
++
++ return 0;
++}
++
+--- a/src/gcc/testsuite/gcc.target/aarch64/simd/ext_u8.x
++++ b/src/gcc/testsuite/gcc.target/aarch64/simd/ext_u8.x
+@@ -0,0 +1,114 @@
++extern void abort (void);
++
++uint8x8_t
++test_vext_u8_1 (uint8x8_t a, uint8x8_t b)
++{
++ return vext_u8 (a, b, 1);
++}
++
++uint8x8_t
++test_vext_u8_2 (uint8x8_t a, uint8x8_t b)
++{
++ return vext_u8 (a, b, 2);
++}
++
++uint8x8_t
++test_vext_u8_3 (uint8x8_t a, uint8x8_t b)
++{
++ return vext_u8 (a, b, 3);
++}
++
++uint8x8_t
++test_vext_u8_4 (uint8x8_t a, uint8x8_t b)
++{
++ return vext_u8 (a, b, 4);
++}
++
++uint8x8_t
++test_vext_u8_5 (uint8x8_t a, uint8x8_t b)
++{
++ return vext_u8 (a, b, 5);
++}
++
++uint8x8_t
++test_vext_u8_6 (uint8x8_t a, uint8x8_t b)
++{
++ return vext_u8 (a, b, 6);
++}
++
++uint8x8_t
++test_vext_u8_7 (uint8x8_t a, uint8x8_t b)
++{
++ return vext_u8 (a, b, 7);
++}
++
++int
++main (int argc, char **argv)
++{
++ int i, off;
++ uint8_t arr1[] = {0, 1, 2, 3, 4, 5, 6, 7};
++ uint8x8_t in1 = vld1_u8 (arr1);
++ uint8_t arr2[] = {8, 9, 10, 11, 12, 13, 14, 15};
++ uint8x8_t in2 = vld1_u8 (arr2);
++ uint8_t exp[8];
++ uint8x8_t expected;
++ uint8x8_t actual = test_vext_u8_1 (in1, in2);
++
++ for (i = 0; i < 8; i++)
++ exp[i] = i + 1;
++ expected = vld1_u8 (exp);
++ for (i = 0; i < 8; i++)
++ if (actual[i] != expected[i])
++ abort ();
++
++ actual = test_vext_u8_2 (in1, in2);
++ for (i = 0; i < 8; i++)
++ exp[i] = i + 2;
++ expected = vld1_u8 (exp);
++ for (i = 0; i < 8; i++)
++ if (actual[i] != expected[i])
++ abort ();
++
++ actual = test_vext_u8_3 (in1, in2);
++ for (i = 0; i < 8; i++)
++ exp[i] = i + 3;
++ expected = vld1_u8 (exp);
++ for (i = 0; i < 8; i++)
++ if (actual[i] != expected[i])
++ abort ();
++
++ actual = test_vext_u8_4 (in1, in2);
++ for (i = 0; i < 8; i++)
++ exp[i] = i + 4;
++ expected = vld1_u8 (exp);
++ for (i = 0; i < 8; i++)
++ if (actual[i] != expected[i])
++ abort ();
++
++ actual = test_vext_u8_5 (in1, in2);
++ for (i = 0; i < 8; i++)
++ exp[i] = i + 5;
++ expected = vld1_u8 (exp);
++ for (i = 0; i < 8; i++)
++ if (actual[i] != expected[i])
++ abort ();
++
++ actual = test_vext_u8_6 (in1, in2);
++ for (i = 0; i < 8; i++)
++ exp[i] = i + 6;
++ expected = vld1_u8 (exp);
++ for (i = 0; i < 8; i++)
++ if (actual[i] != expected[i])
++ abort ();
++
++ actual = test_vext_u8_7 (in1, in2);
++ for (i = 0; i < 8; i++)
++ exp[i] = i + 7;
++ expected = vld1_u8 (exp);
++ for (i = 0; i < 8; i++)
++ if (actual[i] != expected[i])
++ abort ();
++
++ return 0;
++}
++
+--- a/src/gcc/testsuite/gcc.target/aarch64/simd/extq_u16.x
++++ b/src/gcc/testsuite/gcc.target/aarch64/simd/extq_u16.x
+@@ -0,0 +1,114 @@
++extern void abort (void);
++
++uint16x8_t
++test_vextq_u16_1 (uint16x8_t a, uint16x8_t b)
++{
++ return vextq_u16 (a, b, 1);
++}
++
++uint16x8_t
++test_vextq_u16_2 (uint16x8_t a, uint16x8_t b)
++{
++ return vextq_u16 (a, b, 2);
++}
++
++uint16x8_t
++test_vextq_u16_3 (uint16x8_t a, uint16x8_t b)
++{
++ return vextq_u16 (a, b, 3);
++}
++
++uint16x8_t
++test_vextq_u16_4 (uint16x8_t a, uint16x8_t b)
++{
++ return vextq_u16 (a, b, 4);
++}
++
++uint16x8_t
++test_vextq_u16_5 (uint16x8_t a, uint16x8_t b)
++{
++ return vextq_u16 (a, b, 5);
++}
++
++uint16x8_t
++test_vextq_u16_6 (uint16x8_t a, uint16x8_t b)
++{
++ return vextq_u16 (a, b, 6);
++}
++
++uint16x8_t
++test_vextq_u16_7 (uint16x8_t a, uint16x8_t b)
++{
++ return vextq_u16 (a, b, 7);
++}
++
++int
++main (int argc, char **argv)
++{
++ int i, off;
++ uint16_t arr1[] = {0, 1, 2, 3, 4, 5, 6, 7};
++ uint16x8_t in1 = vld1q_u16 (arr1);
++ uint16_t arr2[] = {8, 9, 10, 11, 12, 13, 14, 15};
++ uint16x8_t in2 = vld1q_u16 (arr2);
++ uint16_t exp[8];
++ uint16x8_t expected;
++ uint16x8_t actual = test_vextq_u16_1 (in1, in2);
++
++ for (i = 0; i < 8; i++)
++ exp[i] = i + 1;
++ expected = vld1q_u16 (exp);
++ for (i = 0; i < 8; i++)
++ if (actual[i] != expected[i])
++ abort ();
++
++ actual = test_vextq_u16_2 (in1, in2);
++ for (i = 0; i < 8; i++)
++ exp[i] = i + 2;
++ expected = vld1q_u16 (exp);
++ for (i = 0; i < 8; i++)
++ if (actual[i] != expected[i])
++ abort ();
++
++ actual = test_vextq_u16_3 (in1, in2);
++ for (i = 0; i < 8; i++)
++ exp[i] = i + 3;
++ expected = vld1q_u16 (exp);
++ for (i = 0; i < 8; i++)
++ if (actual[i] != expected[i])
++ abort ();
++
++ actual = test_vextq_u16_4 (in1, in2);
++ for (i = 0; i < 8; i++)
++ exp[i] = i + 4;
++ expected = vld1q_u16 (exp);
++ for (i = 0; i < 8; i++)
++ if (actual[i] != expected[i])
++ abort ();
++
++ actual = test_vextq_u16_5 (in1, in2);
++ for (i = 0; i < 8; i++)
++ exp[i] = i + 5;
++ expected = vld1q_u16 (exp);
++ for (i = 0; i < 8; i++)
++ if (actual[i] != expected[i])
++ abort ();
++
++ actual = test_vextq_u16_6 (in1, in2);
++ for (i = 0; i < 8; i++)
++ exp[i] = i + 6;
++ expected = vld1q_u16 (exp);
++ for (i = 0; i < 8; i++)
++ if (actual[i] != expected[i])
++ abort ();
++
++ actual = test_vextq_u16_7 (in1, in2);
++ for (i = 0; i < 8; i++)
++ exp[i] = i + 7;
++ expected = vld1q_u16 (exp);
++ for (i = 0; i < 8; i++)
++ if (actual[i] != expected[i])
++ abort ();
++
++ return 0;
++}
++
+--- a/src/gcc/testsuite/gcc.target/aarch64/simd/vzips16_1.c
++++ b/src/gcc/testsuite/gcc.target/aarch64/simd/vzips16_1.c
+@@ -0,0 +1,11 @@
++/* Test the `vzip_s16' AArch64 SIMD intrinsic. */
++
+/* { dg-do run } */
-+/* { dg-options "--save-temps" } */
++/* { dg-options "-save-temps -fno-inline" } */
++
++#include <arm_neon.h>
++#include "vzips16.x"
++
++/* { dg-final { scan-assembler-times "zip1\[ \t\]+v\[0-9\]+\.4h, ?v\[0-9\]+\.4h, ?v\[0-9\]+\.4h!?\(?:\[ \t\]+@\[a-zA-Z0-9 \]+\)?\n" 1 } } */
++/* { dg-final { scan-assembler-times "zip2\[ \t\]+v\[0-9\]+\.4h, ?v\[0-9\]+\.4h, ?v\[0-9\]+\.4h!?\(?:\[ \t\]+@\[a-zA-Z0-9 \]+\)?\n" 1 } } */
++/* { dg-final { cleanup-saved-temps } } */
+--- a/src/gcc/testsuite/gcc.target/aarch64/simd/vuzpqs16.x
++++ b/src/gcc/testsuite/gcc.target/aarch64/simd/vuzpqs16.x
+@@ -0,0 +1,26 @@
++extern void abort (void);
++
++int16x8x2_t
++test_vuzpqs16 (int16x8_t _a, int16x8_t _b)
++{
++ return vuzpq_s16 (_a, _b);
++}
++
++int
++main (int argc, char **argv)
++{
++ int i;
++ int16_t first[] = {1, 2, 3, 4, 5, 6, 7, 8};
++ int16_t second[] = {9, 10, 11, 12, 13, 14, 15, 16};
++ int16x8x2_t result = test_vuzpqs16 (vld1q_s16 (first), vld1q_s16 (second));
++ int16_t exp1[] = {1, 3, 5, 7, 9, 11, 13, 15};
++ int16_t exp2[] = {2, 4, 6, 8, 10, 12, 14, 16};
++ int16x8_t expect1 = vld1q_s16 (exp1);
++ int16x8_t expect2 = vld1q_s16 (exp2);
++
++ for (i = 0; i < 8; i++)
++ if ((result.val[0][i] != expect1[i]) || (result.val[1][i] != expect2[i]))
++ abort ();
++
++ return 0;
++}
+--- a/src/gcc/testsuite/gcc.target/aarch64/simd/vzipqs8_1.c
++++ b/src/gcc/testsuite/gcc.target/aarch64/simd/vzipqs8_1.c
+@@ -0,0 +1,11 @@
++/* Test the `vzipq_s8' AArch64 SIMD intrinsic. */
++
++/* { dg-do run } */
++/* { dg-options "-save-temps -fno-inline" } */
++
++#include <arm_neon.h>
++#include "vzipqs8.x"
++
++/* { dg-final { scan-assembler-times "zip1\[ \t\]+v\[0-9\]+\.16b, ?v\[0-9\]+\.16b, ?v\[0-9\]+\.16b!?\(?:\[ \t\]+@\[a-zA-Z0-9 \]+\)?\n" 1 } } */
++/* { dg-final { scan-assembler-times "zip2\[ \t\]+v\[0-9\]+\.16b, ?v\[0-9\]+\.16b, ?v\[0-9\]+\.16b!?\(?:\[ \t\]+@\[a-zA-Z0-9 \]+\)?\n" 1 } } */
++/* { dg-final { cleanup-saved-temps } } */
+--- a/src/gcc/testsuite/gcc.target/aarch64/simd/vrev64qp8_1.c
++++ b/src/gcc/testsuite/gcc.target/aarch64/simd/vrev64qp8_1.c
+@@ -0,0 +1,10 @@
++/* Test the `vrev64q_p8' AArch64 SIMD intrinsic. */
++
++/* { dg-do run } */
++/* { dg-options "-save-temps -fno-inline" } */
++
++#include <arm_neon.h>
++#include "vrev64qp8.x"
++
++/* { dg-final { scan-assembler-times "rev64\[ \t\]+v\[0-9\]+.16b, ?v\[0-9\]+.16b!?\(?:\[ \t\]+@\[a-zA-Z0-9 \]+\)?\n" 1 } } */
++/* { dg-final { cleanup-saved-temps } } */
+--- a/src/gcc/testsuite/gcc.target/aarch64/simd/vtrnu16_1.c
++++ b/src/gcc/testsuite/gcc.target/aarch64/simd/vtrnu16_1.c
+@@ -0,0 +1,11 @@
++/* Test the `vtrn_u16' AArch64 SIMD intrinsic. */
++
++/* { dg-do run } */
++/* { dg-options "-save-temps -fno-inline" } */
++
++#include <arm_neon.h>
++#include "vtrnu16.x"
++
++/* { dg-final { scan-assembler-times "trn1\[ \t\]+v\[0-9\]+\.4h, ?v\[0-9\]+\.4h, ?v\[0-9\]+\.4h!?\(?:\[ \t\]+@\[a-zA-Z0-9 \]+\)?\n" 1 } } */
++/* { dg-final { scan-assembler-times "trn2\[ \t\]+v\[0-9\]+\.4h, ?v\[0-9\]+\.4h, ?v\[0-9\]+\.4h!?\(?:\[ \t\]+@\[a-zA-Z0-9 \]+\)?\n" 1 } } */
++/* { dg-final { cleanup-saved-temps } } */
+--- a/src/gcc/testsuite/gcc.target/aarch64/simd/vuzpqu16.x
++++ b/src/gcc/testsuite/gcc.target/aarch64/simd/vuzpqu16.x
+@@ -0,0 +1,26 @@
++extern void abort (void);
++
++uint16x8x2_t
++test_vuzpqu16 (uint16x8_t _a, uint16x8_t _b)
++{
++ return vuzpq_u16 (_a, _b);
++}
++
++int
++main (int argc, char **argv)
++{
++ int i;
++ uint16_t first[] = {1, 2, 3, 4, 5, 6, 7, 8};
++ uint16_t second[] = {9, 10, 11, 12, 13, 14, 15, 16};
++ uint16x8x2_t result = test_vuzpqu16 (vld1q_u16 (first), vld1q_u16 (second));
++ uint16_t exp1[] = {1, 3, 5, 7, 9, 11, 13, 15};
++ uint16_t exp2[] = {2, 4, 6, 8, 10, 12, 14, 16};
++ uint16x8_t expect1 = vld1q_u16 (exp1);
++ uint16x8_t expect2 = vld1q_u16 (exp2);
++
++ for (i = 0; i < 8; i++)
++ if ((result.val[0][i] != expect1[i]) || (result.val[1][i] != expect2[i]))
++ abort ();
++
++ return 0;
++}
+--- a/src/gcc/testsuite/gcc.target/aarch64/simd/vuzpu8.x
++++ b/src/gcc/testsuite/gcc.target/aarch64/simd/vuzpu8.x
+@@ -0,0 +1,26 @@
++extern void abort (void);
++
++uint8x8x2_t
++test_vuzpu8 (uint8x8_t _a, uint8x8_t _b)
++{
++ return vuzp_u8 (_a, _b);
++}
++
++int
++main (int argc, char **argv)
++{
++ int i;
++ uint8_t first[] = {1, 2, 3, 4, 5, 6, 7, 8};
++ uint8_t second[] = {9, 10, 11, 12, 13, 14, 15, 16};
++ uint8x8x2_t result = test_vuzpu8 (vld1_u8 (first), vld1_u8 (second));
++ uint8_t exp1[] = {1, 3, 5, 7, 9, 11, 13, 15};
++ uint8_t exp2[] = {2, 4, 6, 8, 10, 12, 14, 16};
++ uint8x8_t expect1 = vld1_u8 (exp1);
++ uint8x8_t expect2 = vld1_u8 (exp2);
++
++ for (i = 0; i < 8; i++)
++ if ((result.val[0][i] != expect1[i]) || (result.val[1][i] != expect2[i]))
++ abort ();
++
++ return 0;
++}
+--- a/src/gcc/testsuite/gcc.target/aarch64/simd/ext_u16_1.c
++++ b/src/gcc/testsuite/gcc.target/aarch64/simd/ext_u16_1.c
+@@ -0,0 +1,10 @@
++/* Test the `vextu16' AArch64 SIMD intrinsic. */
++
++/* { dg-do run } */
++/* { dg-options "-save-temps -O3 -fno-inline" } */
++
++#include "arm_neon.h"
++#include "ext_u16.x"
++
++/* { dg-final { scan-assembler-times "ext\[ \t\]+\[vV\]\[0-9\]+\.8\[bB\], ?\[vV\]\[0-9\]+\.8\[bB\], ?\[vV\]\[0-9\]+\.8\[bB\], ?#\[0-9\]+\(?:.2\)?\(?:\[ \t\]+@\[a-zA-Z0-9 \]+\)?\n" 3 } } */
++/* { dg-final { cleanup-saved-temps } } */
+--- a/src/gcc/testsuite/gcc.target/aarch64/simd/extq_u8_1.c
++++ b/src/gcc/testsuite/gcc.target/aarch64/simd/extq_u8_1.c
+@@ -0,0 +1,10 @@
++/* Test the `vextQu8' AArch64 SIMD intrinsic. */
++
++/* { dg-do run } */
++/* { dg-options "-save-temps -O3 -fno-inline" } */
+
+#include "arm_neon.h"
++#include "extq_u8.x"
+
++/* { dg-final { scan-assembler-times "ext\[ \t\]+\[vV\]\[0-9\]+\.16\[bB\], ?\[vV\]\[0-9\]+\.16\[bB\], ?\[vV\]\[0-9\]+\.16\[bB\], ?#?\[0-9\]+\(?:.2\)?\(?:\[ \t\]+@\[a-zA-Z0-9 \]+\)?\n" 15 } } */
++/* { dg-final { cleanup-saved-temps } } */
+--- a/src/gcc/testsuite/gcc.target/aarch64/simd/vrev64qu8.x
++++ b/src/gcc/testsuite/gcc.target/aarch64/simd/vrev64qu8.x
+@@ -0,0 +1,22 @@
+extern void abort (void);
+
-+/* Bit offset to round mode field in FPCR. */
-+#define RMODE_START 22
++uint8x16_t
++test_vrev64qu8 (uint8x16_t _arg)
++{
++ return vrev64q_u8 (_arg);
++}
+
-+#define FPROUNDING_ZERO 3
++int
++main (int argc, char **argv)
++{
++ int i;
++ uint8x16_t inorder = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16};
++ uint8x16_t reversed = test_vrev64qu8 (inorder);
++ uint8x16_t expected = {8, 7, 6, 5, 4, 3, 2, 1, 16, 15, 14, 13, 12, 11, 10, 9};
+
-+/* Set RMODE field of FPCR control register
-+ to rounding mode passed. */
-+void __inline __attribute__ ((__always_inline__))
-+set_rounding_mode (uint32_t mode)
++ for (i = 0; i < 16; i++)
++ if (reversed[i] != expected[i])
++ abort ();
++ return 0;
++}
++
+--- a/src/gcc/testsuite/gcc.target/aarch64/simd/vrev32p8_1.c
++++ b/src/gcc/testsuite/gcc.target/aarch64/simd/vrev32p8_1.c
+@@ -0,0 +1,10 @@
++/* Test the `vrev32_p8' AArch64 SIMD intrinsic. */
++
++/* { dg-do run } */
++/* { dg-options "-save-temps -fno-inline" } */
++
++#include <arm_neon.h>
++#include "vrev32p8.x"
++
++/* { dg-final { scan-assembler-times "rev32\[ \t\]+v\[0-9\]+.8b, ?v\[0-9\]+.8b!?\(?:\[ \t\]+@\[a-zA-Z0-9 \]+\)?\n" 1 } } */
++/* { dg-final { cleanup-saved-temps } } */
+--- a/src/gcc/testsuite/gcc.target/aarch64/simd/ext_s64.x
++++ b/src/gcc/testsuite/gcc.target/aarch64/simd/ext_s64.x
+@@ -0,0 +1,17 @@
++extern void abort (void);
++
++int
++main (int argc, char **argv)
+{
-+ uint32_t r;
++ int i, off;
++ int64_t arr1[] = {0};
++ int64x1_t in1 = vld1_s64 (arr1);
++ int64_t arr2[] = {1};
++ int64x1_t in2 = vld1_s64 (arr2);
++ int64x1_t actual = vext_s64 (in1, in2, 0);
++ if (actual != in1)
++ abort ();
+
-+ /* Read current FPCR. */
-+ asm volatile ("mrs %[r], fpcr" : [r] "=r" (r) : :);
++ return 0;
++}
+
-+ /* Clear rmode. */
-+ r &= ~(3 << RMODE_START);
-+ /* Calculate desired FPCR. */
-+ r |= mode << RMODE_START;
+--- a/src/gcc/testsuite/gcc.target/aarch64/simd/vuzps32.x
++++ b/src/gcc/testsuite/gcc.target/aarch64/simd/vuzps32.x
+@@ -0,0 +1,26 @@
++extern void abort (void);
+
-+ /* Write desired FPCR back. */
-+ asm volatile ("msr fpcr, %[r]" : : [r] "r" (r) :);
++int32x2x2_t
++test_vuzps32 (int32x2_t _a, int32x2_t _b)
++{
++ return vuzp_s32 (_a, _b);
+}
+
-+float64x1_t __attribute__ ((noinline))
-+compare_f64 (float64x1_t passed, float64_t expected)
++int
++main (int argc, char **argv)
+{
-+ return (__builtin_fabs (vget_lane_f64 (passed, 0) - expected)
-+ > __DBL_EPSILON__);
++ int i;
++ int32_t first[] = {1, 2};
++ int32_t second[] = {3, 4};
++ int32x2x2_t result = test_vuzps32 (vld1_s32 (first), vld1_s32 (second));
++ int32_t exp1[] = {1, 3};
++ int32_t exp2[] = {2, 4};
++ int32x2_t expect1 = vld1_s32 (exp1);
++ int32x2_t expect2 = vld1_s32 (exp2);
++
++ for (i = 0; i < 2; i++)
++ if ((result.val[0][i] != expect1[i]) || (result.val[1][i] != expect2[i]))
++ abort ();
++
++ return 0;
+}
+--- a/src/gcc/testsuite/gcc.target/aarch64/simd/vuzpu32.x
++++ b/src/gcc/testsuite/gcc.target/aarch64/simd/vuzpu32.x
+@@ -0,0 +1,26 @@
++extern void abort (void);
+
-+void __attribute__ ((noinline))
-+run_round_tests (float64x1_t *tests,
-+ float64_t expectations[][6])
++uint32x2x2_t
++test_vuzpu32 (uint32x2_t _a, uint32x2_t _b)
++{
++ return vuzp_u32 (_a, _b);
++}
++
++int
++main (int argc, char **argv)
+{
+ int i;
++ uint32_t first[] = {1, 2};
++ uint32_t second[] = {3, 4};
++ uint32x2x2_t result = test_vuzpu32 (vld1_u32 (first), vld1_u32 (second));
++ uint32_t exp1[] = {1, 3};
++ uint32_t exp2[] = {2, 4};
++ uint32x2_t expect1 = vld1_u32 (exp1);
++ uint32x2_t expect2 = vld1_u32 (exp2);
+
-+ for (i = 0; i < 6; i++)
-+ {
-+ if (compare_f64 (vrnd_f64 (tests[i]), expectations[0][i]))
-+ abort ();
-+ if (compare_f64 (vrndx_f64 (tests[i]), expectations[1][i]))
-+ abort ();
-+ if (compare_f64 (vrndp_f64 (tests[i]), expectations[2][i]))
-+ abort ();
-+ if (compare_f64 (vrndn_f64 (tests[i]), expectations[3][i]))
-+ abort ();
-+ if (compare_f64 (vrndm_f64 (tests[i]), expectations[4][i]))
-+ abort ();
-+ if (compare_f64 (vrndi_f64 (tests[i]), expectations[5][i]))
-+ abort ();
-+ if (compare_f64 (vrnda_f64 (tests[i]), expectations[6][i]))
-+ abort ();
-+ }
++ for (i = 0; i < 2; i++)
++ if ((result.val[0][i] != expect1[i]) || (result.val[1][i] != expect2[i]))
++ abort ();
++
++ return 0;
+}
+--- a/src/gcc/testsuite/gcc.target/aarch64/simd/ext_u64.x
++++ b/src/gcc/testsuite/gcc.target/aarch64/simd/ext_u64.x
+@@ -0,0 +1,17 @@
++extern void abort (void);
+
+int
+main (int argc, char **argv)
+{
-+ float64x1_t tests[6] =
-+ {
-+ vcreate_f64 (0x3FE0000000000000), /* Hex for: 0.5. */
-+ vcreate_f64 (0x3FD999999999999A), /* Hex for: 0.4. */
-+ vcreate_f64 (0x3FE3333333333333), /* Hex for: 0.6. */
-+ vcreate_f64 (0xBFE0000000000000), /* Hex for: -0.5. */
-+ vcreate_f64 (0xBFD999999999999A), /* Hex for: -0.4. */
-+ vcreate_f64 (0xBFE3333333333333), /* Hex for: -0.6. */
-+ };
++ int i, off;
++ uint64_t arr1[] = {0};
++ uint64x1_t in1 = vld1_u64 (arr1);
++ uint64_t arr2[] = {1};
++ uint64x1_t in2 = vld1_u64 (arr2);
++ uint64x1_t actual = vext_u64 (in1, in2, 0);
++ if (actual != in1)
++ abort ();
+
-+ float64_t expectations[7][6] =
-+ {
-+ { 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 }, /* vrnd - round towards zero. */
-+ { 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 }, /* vrndx - round using FPCR mode. */
-+ { 1.0, 1.0, 1.0, 0.0, 0.0, 0.0 }, /* vrndp - round to plus infinity. */
-+ { 0.0, 0.0, 1.0, 0.0, 0.0, -1.0 }, /* vrndn - round ties to even. */
-+ { 0.0, 0.0, 0.0, -1.0, -1.0, -1.0 }, /* vrndm - round to minus infinity. */
-+ { 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 }, /* vrndi - round using FPCR mode. */
-+ { 1.0, 0.0, 1.0, -1.0, 0.0, -1.0 }, /* vrnda - round ties away from 0. */
-+ };
++ return 0;
++}
+
-+ /* Set floating point control register
-+ to have predictable vrndx and vrndi behaviour. */
-+ set_rounding_mode (FPROUNDING_ZERO);
+--- a/src/gcc/testsuite/gcc.target/aarch64/simd/vtrns8_1.c
++++ b/src/gcc/testsuite/gcc.target/aarch64/simd/vtrns8_1.c
+@@ -0,0 +1,11 @@
++/* Test the `vtrn_s8' AArch64 SIMD intrinsic. */
+
-+ run_round_tests (tests, expectations);
++/* { dg-do run } */
++/* { dg-options "-save-temps -fno-inline" } */
++
++#include <arm_neon.h>
++#include "vtrns8.x"
++
++/* { dg-final { scan-assembler-times "trn1\[ \t\]+v\[0-9\]+\.8b, ?v\[0-9\]+\.8b, ?v\[0-9\]+\.8b!?\(?:\[ \t\]+@\[a-zA-Z0-9 \]+\)?\n" 1 } } */
++/* { dg-final { scan-assembler-times "trn2\[ \t\]+v\[0-9\]+\.8b, ?v\[0-9\]+\.8b, ?v\[0-9\]+\.8b!?\(?:\[ \t\]+@\[a-zA-Z0-9 \]+\)?\n" 1 } } */
++/* { dg-final { cleanup-saved-temps } } */
+--- a/src/gcc/testsuite/gcc.target/aarch64/simd/vtrnqs16_1.c
++++ b/src/gcc/testsuite/gcc.target/aarch64/simd/vtrnqs16_1.c
+@@ -0,0 +1,11 @@
++/* Test the `vtrnq_s16' AArch64 SIMD intrinsic. */
++
++/* { dg-do run } */
++/* { dg-options "-save-temps -fno-inline" } */
++
++#include <arm_neon.h>
++#include "vtrnqs16.x"
++
++/* { dg-final { scan-assembler-times "trn1\[ \t\]+v\[0-9\]+\.8h, ?v\[0-9\]+\.8h, ?v\[0-9\]+\.8h!?\(?:\[ \t\]+@\[a-zA-Z0-9 \]+\)?\n" 1 } } */
++/* { dg-final { scan-assembler-times "trn2\[ \t\]+v\[0-9\]+\.8h, ?v\[0-9\]+\.8h, ?v\[0-9\]+\.8h!?\(?:\[ \t\]+@\[a-zA-Z0-9 \]+\)?\n" 1 } } */
++/* { dg-final { cleanup-saved-temps } } */
+--- a/src/gcc/testsuite/gcc.target/aarch64/simd/vrev64qs32_1.c
++++ b/src/gcc/testsuite/gcc.target/aarch64/simd/vrev64qs32_1.c
+@@ -0,0 +1,10 @@
++/* Test the `vrev64q_s32' AArch64 SIMD intrinsic. */
++
++/* { dg-do run } */
++/* { dg-options "-save-temps -fno-inline" } */
++
++#include <arm_neon.h>
++#include "vrev64qs32.x"
++
++/* { dg-final { scan-assembler-times "rev64\[ \t\]+v\[0-9\]+.4s, ?v\[0-9\]+.4s!?\(?:\[ \t\]+@\[a-zA-Z0-9 \]+\)?\n" 1 } } */
++/* { dg-final { cleanup-saved-temps } } */
+--- a/src/gcc/testsuite/gcc.target/aarch64/simd/vrev64s8_1.c
++++ b/src/gcc/testsuite/gcc.target/aarch64/simd/vrev64s8_1.c
+@@ -0,0 +1,10 @@
++/* Test the `vrev64_s8' AArch64 SIMD intrinsic. */
++
++/* { dg-do run } */
++/* { dg-options "-save-temps -fno-inline" } */
++
++#include <arm_neon.h>
++#include "vrev64s8.x"
++
++/* { dg-final { scan-assembler-times "rev64\[ \t\]+v\[0-9\]+.8b, ?v\[0-9\]+.8b!?\(?:\[ \t\]+@\[a-zA-Z0-9 \]+\)?\n" 1 } } */
++/* { dg-final { cleanup-saved-temps } } */
+--- a/src/gcc/testsuite/gcc.target/aarch64/simd/vzipqs16.x
++++ b/src/gcc/testsuite/gcc.target/aarch64/simd/vzipqs16.x
+@@ -0,0 +1,27 @@
++extern void abort (void);
++
++int16x8x2_t
++test_vzipqs16 (int16x8_t _a, int16x8_t _b)
++{
++ return vzipq_s16 (_a, _b);
++}
++
++int
++main (int argc, char **argv)
++{
++ int i;
++ int16_t first[] = {1, 2, 3, 4, 5, 6, 7, 8};
++ int16_t second[] = {9, 10, 11, 12, 13, 14, 15, 16};
++ int16x8x2_t result = test_vzipqs16 (vld1q_s16 (first), vld1q_s16 (second));
++ int16x8_t res1 = result.val[0], res2 = result.val[1];
++ int16_t exp1[] = {1, 9, 2, 10, 3, 11, 4, 12};
++ int16_t exp2[] = {5, 13, 6, 14, 7, 15, 8, 16};
++ int16x8_t expected1 = vld1q_s16 (exp1);
++ int16x8_t expected2 = vld1q_s16 (exp2);
++
++ for (i = 0; i < 8; i++)
++ if ((res1[i] != expected1[i]) || (res2[i] != expected2[i]))
++ abort ();
+
+ return 0;
+}
+--- a/src/gcc/testsuite/gcc.target/aarch64/simd/vzipf32.x
++++ b/src/gcc/testsuite/gcc.target/aarch64/simd/vzipf32.x
+@@ -0,0 +1,27 @@
++extern void abort (void);
+
-+/* { dg-final { scan-assembler-times "frintz\\td\[0-9\]+, d\[0-9\]+" 1 } } */
-+/* { dg-final { scan-assembler-times "frintx\\td\[0-9\]+, d\[0-9\]+" 1 } } */
-+/* { dg-final { scan-assembler-times "frintp\\td\[0-9\]+, d\[0-9\]+" 1 } } */
-+/* { dg-final { scan-assembler-times "frintn\\td\[0-9\]+, d\[0-9\]+" 1 } } */
-+/* { dg-final { scan-assembler-times "frintm\\td\[0-9\]+, d\[0-9\]+" 1 } } */
-+/* { dg-final { scan-assembler-times "frinti\\td\[0-9\]+, d\[0-9\]+" 1 } } */
-+/* { dg-final { scan-assembler-times "frinta\\td\[0-9\]+, d\[0-9\]+" 1 } } */
++float32x2x2_t
++test_vzipf32 (float32x2_t _a, float32x2_t _b)
++{
++ return vzip_f32 (_a, _b);
++}
++
++int
++main (int argc, char **argv)
++{
++ int i;
++ float32_t first[] = {1, 2};
++ float32_t second[] = {3, 4};
++ float32x2x2_t result = test_vzipf32 (vld1_f32 (first), vld1_f32 (second));
++ float32x2_t res1 = result.val[0], res2 = result.val[1];
++ float32_t exp1[] = {1, 3};
++ float32_t exp2[] = {2, 4};
++ float32x2_t expected1 = vld1_f32 (exp1);
++ float32x2_t expected2 = vld1_f32 (exp2);
++
++ for (i = 0; i < 2; i++)
++ if ((res1[i] != expected1[i]) || (res2[i] != expected2[i]))
++ abort ();
++
++ return 0;
++}
+--- a/src/gcc/testsuite/gcc.target/aarch64/simd/vzipu8.x
++++ b/src/gcc/testsuite/gcc.target/aarch64/simd/vzipu8.x
+@@ -0,0 +1,27 @@
++extern void abort (void);
++
++uint8x8x2_t
++test_vzipu8 (uint8x8_t _a, uint8x8_t _b)
++{
++ return vzip_u8 (_a, _b);
++}
++
++int
++main (int argc, char **argv)
++{
++ int i;
++ uint8_t first[] = {1, 2, 3, 4, 5, 6, 7, 8};
++ uint8_t second[] = {9, 10, 11, 12, 13, 14, 15, 16};
++ uint8x8x2_t result = test_vzipu8 (vld1_u8 (first), vld1_u8 (second));
++ uint8x8_t res1 = result.val[0], res2 = result.val[1];
++ uint8_t exp1[] = {1, 9, 2, 10, 3, 11, 4, 12};
++ uint8_t exp2[] = {5, 13, 6, 14, 7, 15, 8, 16};
++ uint8x8_t expected1 = vld1_u8 (exp1);
++ uint8x8_t expected2 = vld1_u8 (exp2);
++
++ for (i = 0; i < 8; i++)
++ if ((res1[i] != expected1[i]) || (res2[i] != expected2[i]))
++ abort ();
++
++ return 0;
++}
+--- a/src/gcc/testsuite/gcc.target/aarch64/simd/vzipqu16.x
++++ b/src/gcc/testsuite/gcc.target/aarch64/simd/vzipqu16.x
+@@ -0,0 +1,27 @@
++extern void abort (void);
++
++uint16x8x2_t
++test_vzipqu16 (uint16x8_t _a, uint16x8_t _b)
++{
++ return vzipq_u16 (_a, _b);
++}
++
++int
++main (int argc, char **argv)
++{
++ int i;
++ uint16_t first[] = {1, 2, 3, 4, 5, 6, 7, 8};
++ uint16_t second[] = {9, 10, 11, 12, 13, 14, 15, 16};
++ uint16x8x2_t result = test_vzipqu16 (vld1q_u16 (first), vld1q_u16 (second));
++ uint16x8_t res1 = result.val[0], res2 = result.val[1];
++ uint16_t exp1[] = {1, 9, 2, 10, 3, 11, 4, 12};
++ uint16_t exp2[] = {5, 13, 6, 14, 7, 15, 8, 16};
++ uint16x8_t expected1 = vld1q_u16 (exp1);
++ uint16x8_t expected2 = vld1q_u16 (exp2);
++
++ for (i = 0; i < 8; i++)
++ if ((res1[i] != expected1[i]) || (res2[i] != expected2[i]))
++ abort ();
++
++ return 0;
++}
+--- a/src/gcc/testsuite/gcc.target/aarch64/simd/extq_s16_1.c
++++ b/src/gcc/testsuite/gcc.target/aarch64/simd/extq_s16_1.c
+@@ -0,0 +1,10 @@
++/* Test the `vextQs16' AArch64 SIMD intrinsic. */
++
++/* { dg-do run } */
++/* { dg-options "-save-temps -O3 -fno-inline" } */
++
++#include "arm_neon.h"
++#include "extq_s16.x"
++
++/* { dg-final { scan-assembler-times "ext\[ \t\]+\[vV\]\[0-9\]+\.16\[bB\], ?\[vV\]\[0-9\]+\.16\[bB\], ?\[vV\]\[0-9\]+\.16\[bB\], ?#\[0-9\]+\(?:.2\)?\(?:\[ \t\]+@\[a-zA-Z0-9 \]+\)?\n" 7 } } */
+/* { dg-final { cleanup-saved-temps } } */
---- a/src/gcc/testsuite/gcc.target/aarch64/simd/vzipp16_1.c
-+++ b/src/gcc/testsuite/gcc.target/aarch64/simd/vzipp16_1.c
+--- a/src/gcc/testsuite/gcc.target/aarch64/simd/vuzpqp16_1.c
++++ b/src/gcc/testsuite/gcc.target/aarch64/simd/vuzpqp16_1.c
@@ -0,0 +1,11 @@
-+/* Test the `vzip_p16' AArch64 SIMD intrinsic. */
++/* Test the `vuzpq_p16' AArch64 SIMD intrinsic. */
+
+/* { dg-do run } */
+/* { dg-options "-save-temps -fno-inline" } */
+
+#include <arm_neon.h>
-+#include "vzipp16.x"
++#include "vuzpqp16.x"
+
-+/* { dg-final { scan-assembler-times "zip1\[ \t\]+v\[0-9\]+\.4h, ?v\[0-9\]+\.4h, ?v\[0-9\]+\.4h!?\(?:\[ \t\]+@\[a-zA-Z0-9 \]+\)?\n" 1 } } */
-+/* { dg-final { scan-assembler-times "zip2\[ \t\]+v\[0-9\]+\.4h, ?v\[0-9\]+\.4h, ?v\[0-9\]+\.4h!?\(?:\[ \t\]+@\[a-zA-Z0-9 \]+\)?\n" 1 } } */
++/* { dg-final { scan-assembler-times "uzp1\[ \t\]+v\[0-9\]+\.8h, ?v\[0-9\]+\.8h, ?v\[0-9\]+\.8h!?\(?:\[ \t\]+@\[a-zA-Z0-9 \]+\)?\n" 1 } } */
++/* { dg-final { scan-assembler-times "uzp2\[ \t\]+v\[0-9\]+\.8h, ?v\[0-9\]+\.8h, ?v\[0-9\]+\.8h!?\(?:\[ \t\]+@\[a-zA-Z0-9 \]+\)?\n" 1 } } */
+/* { dg-final { cleanup-saved-temps } } */
---- a/src/gcc/testsuite/gcc.target/aarch64/simd/vzips32_1.c
-+++ b/src/gcc/testsuite/gcc.target/aarch64/simd/vzips32_1.c
+--- a/src/gcc/testsuite/gcc.target/aarch64/simd/ext_p8.x
++++ b/src/gcc/testsuite/gcc.target/aarch64/simd/ext_p8.x
+@@ -0,0 +1,114 @@
++extern void abort (void);
++
++poly8x8_t
++test_vext_p8_1 (poly8x8_t a, poly8x8_t b)
++{
++ return vext_p8 (a, b, 1);
++}
++
++poly8x8_t
++test_vext_p8_2 (poly8x8_t a, poly8x8_t b)
++{
++ return vext_p8 (a, b, 2);
++}
++
++poly8x8_t
++test_vext_p8_3 (poly8x8_t a, poly8x8_t b)
++{
++ return vext_p8 (a, b, 3);
++}
++
++poly8x8_t
++test_vext_p8_4 (poly8x8_t a, poly8x8_t b)
++{
++ return vext_p8 (a, b, 4);
++}
++
++poly8x8_t
++test_vext_p8_5 (poly8x8_t a, poly8x8_t b)
++{
++ return vext_p8 (a, b, 5);
++}
++
++poly8x8_t
++test_vext_p8_6 (poly8x8_t a, poly8x8_t b)
++{
++ return vext_p8 (a, b, 6);
++}
++
++poly8x8_t
++test_vext_p8_7 (poly8x8_t a, poly8x8_t b)
++{
++ return vext_p8 (a, b, 7);
++}
++
++int
++main (int argc, char **argv)
++{
++ int i, off;
++ poly8_t arr1[] = {0, 1, 2, 3, 4, 5, 6, 7};
++ poly8x8_t in1 = vld1_p8 (arr1);
++ poly8_t arr2[] = {8, 9, 10, 11, 12, 13, 14, 15};
++ poly8x8_t in2 = vld1_p8 (arr2);
++ poly8_t exp[8];
++ poly8x8_t expected;
++ poly8x8_t actual = test_vext_p8_1 (in1, in2);
++
++ for (i = 0; i < 8; i++)
++ exp[i] = i + 1;
++ expected = vld1_p8 (exp);
++ for (i = 0; i < 8; i++)
++ if (actual[i] != expected[i])
++ abort ();
++
++ actual = test_vext_p8_2 (in1, in2);
++ for (i = 0; i < 8; i++)
++ exp[i] = i + 2;
++ expected = vld1_p8 (exp);
++ for (i = 0; i < 8; i++)
++ if (actual[i] != expected[i])
++ abort ();
++
++ actual = test_vext_p8_3 (in1, in2);
++ for (i = 0; i < 8; i++)
++ exp[i] = i + 3;
++ expected = vld1_p8 (exp);
++ for (i = 0; i < 8; i++)
++ if (actual[i] != expected[i])
++ abort ();
++
++ actual = test_vext_p8_4 (in1, in2);
++ for (i = 0; i < 8; i++)
++ exp[i] = i + 4;
++ expected = vld1_p8 (exp);
++ for (i = 0; i < 8; i++)
++ if (actual[i] != expected[i])
++ abort ();
++
++ actual = test_vext_p8_5 (in1, in2);
++ for (i = 0; i < 8; i++)
++ exp[i] = i + 5;
++ expected = vld1_p8 (exp);
++ for (i = 0; i < 8; i++)
++ if (actual[i] != expected[i])
++ abort ();
++
++ actual = test_vext_p8_6 (in1, in2);
++ for (i = 0; i < 8; i++)
++ exp[i] = i + 6;
++ expected = vld1_p8 (exp);
++ for (i = 0; i < 8; i++)
++ if (actual[i] != expected[i])
++ abort ();
++
++ actual = test_vext_p8_7 (in1, in2);
++ for (i = 0; i < 8; i++)
++ exp[i] = i + 7;
++ expected = vld1_p8 (exp);
++ for (i = 0; i < 8; i++)
++ if (actual[i] != expected[i])
++ abort ();
++
++ return 0;
++}
++
+--- a/src/gcc/testsuite/gcc.target/aarch64/simd/vuzpqu32_1.c
++++ b/src/gcc/testsuite/gcc.target/aarch64/simd/vuzpqu32_1.c
@@ -0,0 +1,11 @@
-+/* Test the `vzip_s32' AArch64 SIMD intrinsic. */
++/* Test the `vuzpq_u32' AArch64 SIMD intrinsic. */
+
+/* { dg-do run } */
+/* { dg-options "-save-temps -fno-inline" } */
+
+#include <arm_neon.h>
-+#include "vzips32.x"
++#include "vuzpqu32.x"
++
++/* { dg-final { scan-assembler-times "uzp1\[ \t\]+v\[0-9\]+\.4s, ?v\[0-9\]+\.4s, ?v\[0-9\]+\.4s!?\(?:\[ \t\]+@\[a-zA-Z0-9 \]+\)?\n" 1 } } */
++/* { dg-final { scan-assembler-times "uzp2\[ \t\]+v\[0-9\]+\.4s, ?v\[0-9\]+\.4s, ?v\[0-9\]+\.4s!?\(?:\[ \t\]+@\[a-zA-Z0-9 \]+\)?\n" 1 } } */
++/* { dg-final { cleanup-saved-temps } } */
+--- a/src/gcc/testsuite/gcc.target/aarch64/simd/vuzpp8.x
++++ b/src/gcc/testsuite/gcc.target/aarch64/simd/vuzpp8.x
+@@ -0,0 +1,26 @@
++extern void abort (void);
++
++poly8x8x2_t
++test_vuzpp8 (poly8x8_t _a, poly8x8_t _b)
++{
++ return vuzp_p8 (_a, _b);
++}
++
++int
++main (int argc, char **argv)
++{
++ int i;
++ poly8_t first[] = {1, 2, 3, 4, 5, 6, 7, 8};
++ poly8_t second[] = {9, 10, 11, 12, 13, 14, 15, 16};
++ poly8x8x2_t result = test_vuzpp8 (vld1_p8 (first), vld1_p8 (second));
++ poly8_t exp1[] = {1, 3, 5, 7, 9, 11, 13, 15};
++ poly8_t exp2[] = {2, 4, 6, 8, 10, 12, 14, 16};
++ poly8x8_t expect1 = vld1_p8 (exp1);
++ poly8x8_t expect2 = vld1_p8 (exp2);
++
++ for (i = 0; i < 8; i++)
++ if ((result.val[0][i] != expect1[i]) || (result.val[1][i] != expect2[i]))
++ abort ();
++
++ return 0;
++}
+--- a/src/gcc/testsuite/gcc.target/aarch64/simd/vrev32s16_1.c
++++ b/src/gcc/testsuite/gcc.target/aarch64/simd/vrev32s16_1.c
+@@ -0,0 +1,10 @@
++/* Test the `vrev32_s16' AArch64 SIMD intrinsic. */
++
++/* { dg-do run } */
++/* { dg-options "-save-temps -fno-inline" } */
++
++#include <arm_neon.h>
++#include "vrev32s16.x"
++
++/* { dg-final { scan-assembler-times "rev32\[ \t\]+v\[0-9\]+.4h, ?v\[0-9\]+.4h!?\(?:\[ \t\]+@\[a-zA-Z0-9 \]+\)?\n" 1 } } */
++/* { dg-final { cleanup-saved-temps } } */
+--- a/src/gcc/testsuite/gcc.target/aarch64/simd/vzipqp8_1.c
++++ b/src/gcc/testsuite/gcc.target/aarch64/simd/vzipqp8_1.c
+@@ -0,0 +1,11 @@
++/* Test the `vzipq_p8' AArch64 SIMD intrinsic. */
++
++/* { dg-do run } */
++/* { dg-options "-save-temps -fno-inline" } */
++
++#include <arm_neon.h>
++#include "vzipqp8.x"
++
++/* { dg-final { scan-assembler-times "zip1\[ \t\]+v\[0-9\]+\.16b, ?v\[0-9\]+\.16b, ?v\[0-9\]+\.16b!?\(?:\[ \t\]+@\[a-zA-Z0-9 \]+\)?\n" 1 } } */
++/* { dg-final { scan-assembler-times "zip2\[ \t\]+v\[0-9\]+\.16b, ?v\[0-9\]+\.16b, ?v\[0-9\]+\.16b!?\(?:\[ \t\]+@\[a-zA-Z0-9 \]+\)?\n" 1 } } */
++/* { dg-final { cleanup-saved-temps } } */
+--- a/src/gcc/testsuite/gcc.target/aarch64/simd/vrev32qs8_1.c
++++ b/src/gcc/testsuite/gcc.target/aarch64/simd/vrev32qs8_1.c
+@@ -0,0 +1,10 @@
++/* Test the `vrev32q_s8' AArch64 SIMD intrinsic. */
++
++/* { dg-do run } */
++/* { dg-options "-save-temps -fno-inline" } */
++
++#include <arm_neon.h>
++#include "vrev32qs8.x"
++
++/* { dg-final { scan-assembler-times "rev32\[ \t\]+v\[0-9\]+.16b, ?v\[0-9\]+.16b!?\(?:\[ \t\]+@\[a-zA-Z0-9 \]+\)?\n" 1 } } */
++/* { dg-final { cleanup-saved-temps } } */
+--- a/src/gcc/testsuite/gcc.target/aarch64/simd/vrev64s32_1.c
++++ b/src/gcc/testsuite/gcc.target/aarch64/simd/vrev64s32_1.c
+@@ -0,0 +1,10 @@
++/* Test the `vrev64_s32' AArch64 SIMD intrinsic. */
++
++/* { dg-do run } */
++/* { dg-options "-save-temps -fno-inline" } */
++
++#include <arm_neon.h>
++#include "vrev64s32.x"
++
++/* { dg-final { scan-assembler-times "rev64\[ \t\]+v\[0-9\]+.2s, ?v\[0-9\]+.2s!?\(?:\[ \t\]+@\[a-zA-Z0-9 \]+\)?\n" 1 } } */
++/* { dg-final { cleanup-saved-temps } } */
+--- a/src/gcc/testsuite/gcc.target/aarch64/simd/simd.exp
++++ b/src/gcc/testsuite/gcc.target/aarch64/simd/simd.exp
+@@ -0,0 +1,45 @@
++# Specific regression driver for AArch64 SIMD instructions.
++# Copyright (C) 2014 Free Software Foundation, Inc.
++# Contributed by ARM Ltd.
++#
++# This file is part of GCC.
++#
++# GCC is free software; you can redistribute it and/or modify it
++# under the terms of the GNU General Public License as published by
++# the Free Software Foundation; either version 3, or (at your option)
++# any later version.
++#
++# GCC is distributed in the hope that it will be useful, but
++# WITHOUT ANY WARRANTY; without even the implied warranty of
++# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
++# General Public License for more details.
++#
++# You should have received a copy of the GNU General Public License
++# along with GCC; see the file COPYING3. If not see
++# <http://www.gnu.org/licenses/>. */
++
++# GCC testsuite that uses the `dg.exp' driver.
++
++# Exit immediately if this isn't an AArch64 target.
++if {![istarget aarch64*-*-*] } then {
++ return
++}
++
++# Load support procs.
++load_lib gcc-dg.exp
++
++# If a testcase doesn't have special options, use these.
++global DEFAULT_CFLAGS
++if ![info exists DEFAULT_CFLAGS] then {
++ set DEFAULT_CFLAGS " -ansi -pedantic-errors"
++}
++
++# Initialize `dg'.
++dg-init
++
++# Main loop.
++dg-runtest [lsort [glob -nocomplain $srcdir/$subdir/*.\[cCS\]]] \
++ "" $DEFAULT_CFLAGS
++
++# All done.
++dg-finish
+--- a/src/gcc/testsuite/gcc.target/aarch64/simd/vtrns16.x
++++ b/src/gcc/testsuite/gcc.target/aarch64/simd/vtrns16.x
+@@ -0,0 +1,27 @@
++extern void abort (void);
++
++int16x4x2_t
++test_vtrns16 (int16x4_t _a, int16x4_t _b)
++{
++ return vtrn_s16 (_a, _b);
++}
++
++int
++main (int argc, char **argv)
++{
++ int i;
++ int16_t first[] = {1, 2, 3, 4};
++ int16_t second[] = {5, 6, 7, 8};
++ int16x4x2_t result = test_vtrns16 (vld1_s16 (first), vld1_s16 (second));
++ int16x4_t res1 = result.val[0], res2 = result.val[1];
++ int16_t exp1[] = {1, 5, 3, 7};
++ int16_t exp2[] = {2, 6, 4, 8};
++ int16x4_t expected1 = vld1_s16 (exp1);
++ int16x4_t expected2 = vld1_s16 (exp2);
++
++ for (i = 0; i < 4; i++)
++ if ((res1[i] != expected1[i]) || (res2[i] != expected2[i]))
++ abort ();
++
++ return 0;
++}
+--- a/src/gcc/testsuite/gcc.target/aarch64/simd/vrev64qu8_1.c
++++ b/src/gcc/testsuite/gcc.target/aarch64/simd/vrev64qu8_1.c
+@@ -0,0 +1,10 @@
++/* Test the `vrev64q_u8' AArch64 SIMD intrinsic. */
++
++/* { dg-do run } */
++/* { dg-options "-save-temps -fno-inline" } */
++
++#include <arm_neon.h>
++#include "vrev64qu8.x"
++
++/* { dg-final { scan-assembler-times "rev64\[ \t\]+v\[0-9\]+.16b, ?v\[0-9\]+.16b!?\(?:\[ \t\]+@\[a-zA-Z0-9 \]+\)?\n" 1 } } */
++/* { dg-final { cleanup-saved-temps } } */
+--- a/src/gcc/testsuite/gcc.target/aarch64/simd/vrev64qp8.x
++++ b/src/gcc/testsuite/gcc.target/aarch64/simd/vrev64qp8.x
+@@ -0,0 +1,22 @@
++extern void abort (void);
++
++poly8x16_t
++test_vrev64qp8 (poly8x16_t _arg)
++{
++ return vrev64q_p8 (_arg);
++}
++
++int
++main (int argc, char **argv)
++{
++ int i;
++ poly8x16_t inorder = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16};
++ poly8x16_t reversed = test_vrev64qp8 (inorder);
++ poly8x16_t expected = {8, 7, 6, 5, 4, 3, 2, 1, 16, 15, 14, 13, 12, 11, 10, 9};
++
++ for (i = 0; i < 16; i++)
++ if (reversed[i] != expected[i])
++ abort ();
++ return 0;
++}
++
+--- a/src/gcc/testsuite/gcc.target/aarch64/simd/vtrnu16.x
++++ b/src/gcc/testsuite/gcc.target/aarch64/simd/vtrnu16.x
+@@ -0,0 +1,27 @@
++extern void abort (void);
++
++uint16x4x2_t
++test_vtrnu16 (uint16x4_t _a, uint16x4_t _b)
++{
++ return vtrn_u16 (_a, _b);
++}
++
++int
++main (int argc, char **argv)
++{
++ int i;
++ uint16_t first[] = {1, 2, 3, 4};
++ uint16_t second[] = {5, 6, 7, 8};
++ uint16x4x2_t result = test_vtrnu16 (vld1_u16 (first), vld1_u16 (second));
++ uint16x4_t res1 = result.val[0], res2 = result.val[1];
++ uint16_t exp1[] = {1, 5, 3, 7};
++ uint16_t exp2[] = {2, 6, 4, 8};
++ uint16x4_t expected1 = vld1_u16 (exp1);
++ uint16x4_t expected2 = vld1_u16 (exp2);
++
++ for (i = 0; i < 4; i++)
++ if ((res1[i] != expected1[i]) || (res2[i] != expected2[i]))
++ abort ();
++
++ return 0;
++}
+--- a/src/gcc/testsuite/gcc.target/aarch64/simd/ext_p16.x
++++ b/src/gcc/testsuite/gcc.target/aarch64/simd/ext_p16.x
+@@ -0,0 +1,58 @@
++extern void abort (void);
++
++poly16x4_t
++test_vext_p16_1 (poly16x4_t a, poly16x4_t b)
++{
++ return vext_p16 (a, b, 1);
++}
++
++poly16x4_t
++test_vext_p16_2 (poly16x4_t a, poly16x4_t b)
++{
++ return vext_p16 (a, b, 2);
++}
++
++poly16x4_t
++test_vext_p16_3 (poly16x4_t a, poly16x4_t b)
++{
++ return vext_p16 (a, b, 3);
++}
++
++int
++main (int argc, char **argv)
++{
++ int i, off;
++ poly16_t arr1[] = {0, 1, 2, 3};
++ poly16x4_t in1 = vld1_p16 (arr1);
++ poly16_t arr2[] = {4, 5, 6, 7};
++ poly16x4_t in2 = vld1_p16 (arr2);
++ poly16_t exp[4];
++ poly16x4_t expected;
++ poly16x4_t actual = test_vext_p16_1 (in1, in2);
++
++ for (i = 0; i < 4; i++)
++ exp[i] = i + 1;
++ expected = vld1_p16 (exp);
++ for (i = 0; i < 4; i++)
++ if (actual[i] != expected[i])
++ abort ();
++
++ actual = test_vext_p16_2 (in1, in2);
++ for (i = 0; i < 4; i++)
++ exp[i] = i + 2;
++ expected = vld1_p16 (exp);
++ for (i = 0; i < 4; i++)
++ if (actual[i] != expected[i])
++ abort ();
++
++ actual = test_vext_p16_3 (in1, in2);
++ for (i = 0; i < 4; i++)
++ exp[i] = i + 3;
++ expected = vld1_p16 (exp);
++ for (i = 0; i < 4; i++)
++ if (actual[i] != expected[i])
++ abort ();
++
++ return 0;
++}
++
+--- a/src/gcc/testsuite/gcc.target/aarch64/simd/vuzpp16_1.c
++++ b/src/gcc/testsuite/gcc.target/aarch64/simd/vuzpp16_1.c
+@@ -0,0 +1,11 @@
++/* Test the `vuzp_p16' AArch64 SIMD intrinsic. */
++
++/* { dg-do run } */
++/* { dg-options "-save-temps -fno-inline" } */
++
++#include <arm_neon.h>
++#include "vuzpp16.x"
++
++/* { dg-final { scan-assembler-times "uzp1\[ \t\]+v\[0-9\]+\.4h, ?v\[0-9\]+\.4h, ?v\[0-9\]+\.4h!?\(?:\[ \t\]+@\[a-zA-Z0-9 \]+\)?\n" 1 } } */
++/* { dg-final { scan-assembler-times "uzp2\[ \t\]+v\[0-9\]+\.4h, ?v\[0-9\]+\.4h, ?v\[0-9\]+\.4h!?\(?:\[ \t\]+@\[a-zA-Z0-9 \]+\)?\n" 1 } } */
++/* { dg-final { cleanup-saved-temps } } */
+--- a/src/gcc/testsuite/gcc.target/aarch64/simd/vzipqu8.x
++++ b/src/gcc/testsuite/gcc.target/aarch64/simd/vzipqu8.x
+@@ -0,0 +1,29 @@
++extern void abort (void);
++
++uint8x16x2_t
++test_vzipqu8 (uint8x16_t _a, uint8x16_t _b)
++{
++ return vzipq_u8 (_a, _b);
++}
++
++int
++main (int argc, char **argv)
++{
++ int i;
++ uint8_t first[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16};
++ uint8_t second[] =
++ {17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32};
++ uint8x16x2_t result = test_vzipqu8 (vld1q_u8 (first), vld1q_u8 (second));
++ uint8x16_t res1 = result.val[0], res2 = result.val[1];
++ uint8_t exp1[] = {1, 17, 2, 18, 3, 19, 4, 20, 5, 21, 6, 22, 7, 23, 8, 24};
++ uint8_t exp2[] =
++ {9, 25, 10, 26, 11, 27, 12, 28, 13, 29, 14, 30, 15, 31, 16, 32};
++ uint8x16_t expected1 = vld1q_u8 (exp1);
++ uint8x16_t expected2 = vld1q_u8 (exp2);
++
++ for (i = 0; i < 16; i++)
++ if ((res1[i] != expected1[i]) || (res2[i] != expected2[i]))
++ abort ();
++
++ return 0;
++}
+--- a/src/gcc/testsuite/gcc.target/aarch64/simd/ext_u64_1.c
++++ b/src/gcc/testsuite/gcc.target/aarch64/simd/ext_u64_1.c
+@@ -0,0 +1,11 @@
++/* Test the `vextu64' AArch64 SIMD intrinsic. */
++
++/* { dg-do run } */
++/* { dg-options "-save-temps -O3 -fno-inline" } */
++
++#include "arm_neon.h"
++#include "ext_u64.x"
++
++/* Do not scan-assembler. An EXT instruction could be emitted, but would merely
++ return its first argument, so it is legitimate to optimize it out. */
++/* { dg-final { cleanup-saved-temps } } */
+--- a/src/gcc/testsuite/gcc.target/aarch64/simd/vuzpu32_1.c
++++ b/src/gcc/testsuite/gcc.target/aarch64/simd/vuzpu32_1.c
+@@ -0,0 +1,11 @@
++/* Test the `vuzp_u32' AArch64 SIMD intrinsic. */
++
++/* { dg-do run } */
++/* { dg-options "-save-temps -fno-inline" } */
++
++#include <arm_neon.h>
++#include "vuzpu32.x"
+
+/* { dg-final { scan-assembler-times "zip1\[ \t\]+v\[0-9\]+\.2s, ?v\[0-9\]+\.2s, ?v\[0-9\]+\.2s!?\(?:\[ \t\]+@\[a-zA-Z0-9 \]+\)?\n" 1 } } */
+/* { dg-final { scan-assembler-times "zip2\[ \t\]+v\[0-9\]+\.2s, ?v\[0-9\]+\.2s, ?v\[0-9\]+\.2s!?\(?:\[ \t\]+@\[a-zA-Z0-9 \]+\)?\n" 1 } } */
+/* { dg-final { cleanup-saved-temps } } */
---- a/src/gcc/testsuite/gcc.target/aarch64/simd/vzips16_1.c
-+++ b/src/gcc/testsuite/gcc.target/aarch64/simd/vzips16_1.c
+--- a/src/gcc/testsuite/gcc.target/aarch64/simd/vrev32qp16_1.c
++++ b/src/gcc/testsuite/gcc.target/aarch64/simd/vrev32qp16_1.c
+@@ -0,0 +1,10 @@
++/* Test the `vrev32q_p16' AArch64 SIMD intrinsic. */
++
++/* { dg-do run } */
++/* { dg-options "-save-temps -fno-inline" } */
++
++#include <arm_neon.h>
++#include "vrev32qp16.x"
++
++/* { dg-final { scan-assembler-times "rev32\[ \t\]+v\[0-9\]+.8h, ?v\[0-9\]+.8h!?\(?:\[ \t\]+@\[a-zA-Z0-9 \]+\)?\n" 1 } } */
++/* { dg-final { cleanup-saved-temps } } */
+--- a/src/gcc/testsuite/gcc.target/aarch64/simd/extq_f32.x
++++ b/src/gcc/testsuite/gcc.target/aarch64/simd/extq_f32.x
+@@ -0,0 +1,58 @@
++extern void abort (void);
++
++float32x4_t
++test_vextq_f32_1 (float32x4_t a, float32x4_t b)
++{
++ return vextq_f32 (a, b, 1);
++}
++
++float32x4_t
++test_vextq_f32_2 (float32x4_t a, float32x4_t b)
++{
++ return vextq_f32 (a, b, 2);
++}
++
++float32x4_t
++test_vextq_f32_3 (float32x4_t a, float32x4_t b)
++{
++ return vextq_f32 (a, b, 3);
++}
++
++int
++main (int argc, char **argv)
++{
++ int i, off;
++ float32_t arr1[] = {0, 1, 2, 3};
++ float32x4_t in1 = vld1q_f32 (arr1);
++ float32_t arr2[] = {4, 5, 6, 7};
++ float32x4_t in2 = vld1q_f32 (arr2);
++ float32_t exp[4];
++ float32x4_t expected;
++ float32x4_t actual = test_vextq_f32_1 (in1, in2);
++
++ for (i = 0; i < 4; i++)
++ exp[i] = i + 1;
++ expected = vld1q_f32 (exp);
++ for (i = 0; i < 4; i++)
++ if (actual[i] != expected[i])
++ abort ();
++
++ actual = test_vextq_f32_2 (in1, in2);
++ for (i = 0; i < 4; i++)
++ exp[i] = i + 2;
++ expected = vld1q_f32 (exp);
++ for (i = 0; i < 4; i++)
++ if (actual[i] != expected[i])
++ abort ();
++
++ actual = test_vextq_f32_3 (in1, in2);
++ for (i = 0; i < 4; i++)
++ exp[i] = i + 3;
++ expected = vld1q_f32 (exp);
++ for (i = 0; i < 4; i++)
++ if (actual[i] != expected[i])
++ abort ();
++
++ return 0;
++}
++
+--- a/src/gcc/testsuite/gcc.target/aarch64/simd/vzipqp16_1.c
++++ b/src/gcc/testsuite/gcc.target/aarch64/simd/vzipqp16_1.c
@@ -0,0 +1,11 @@
-+/* Test the `vzip_s16' AArch64 SIMD intrinsic. */
++/* Test the `vzipq_p16' AArch64 SIMD intrinsic. */
+
+/* { dg-do run } */
+/* { dg-options "-save-temps -fno-inline" } */
+
+#include <arm_neon.h>
-+#include "vzips16.x"
++#include "vzipqp16.x"
+
-+/* { dg-final { scan-assembler-times "zip1\[ \t\]+v\[0-9\]+\.4h, ?v\[0-9\]+\.4h, ?v\[0-9\]+\.4h!?\(?:\[ \t\]+@\[a-zA-Z0-9 \]+\)?\n" 1 } } */
-+/* { dg-final { scan-assembler-times "zip2\[ \t\]+v\[0-9\]+\.4h, ?v\[0-9\]+\.4h, ?v\[0-9\]+\.4h!?\(?:\[ \t\]+@\[a-zA-Z0-9 \]+\)?\n" 1 } } */
++/* { dg-final { scan-assembler-times "zip1\[ \t\]+v\[0-9\]+\.8h, ?v\[0-9\]+\.8h, ?v\[0-9\]+\.8h!?\(?:\[ \t\]+@\[a-zA-Z0-9 \]+\)?\n" 1 } } */
++/* { dg-final { scan-assembler-times "zip2\[ \t\]+v\[0-9\]+\.8h, ?v\[0-9\]+\.8h, ?v\[0-9\]+\.8h!?\(?:\[ \t\]+@\[a-zA-Z0-9 \]+\)?\n" 1 } } */
+/* { dg-final { cleanup-saved-temps } } */
---- a/src/gcc/testsuite/gcc.target/aarch64/simd/vzipu32_1.c
-+++ b/src/gcc/testsuite/gcc.target/aarch64/simd/vzipu32_1.c
+--- a/src/gcc/testsuite/gcc.target/aarch64/simd/vtrnp8_1.c
++++ b/src/gcc/testsuite/gcc.target/aarch64/simd/vtrnp8_1.c
@@ -0,0 +1,11 @@
-+/* Test the `vzip_u32' AArch64 SIMD intrinsic. */
++/* Test the `vtrn_p8' AArch64 SIMD intrinsic. */
+
+/* { dg-do run } */
+/* { dg-options "-save-temps -fno-inline" } */
+
+#include <arm_neon.h>
-+#include "vzipu32.x"
++#include "vtrnp8.x"
++
++/* { dg-final { scan-assembler-times "trn1\[ \t\]+v\[0-9\]+\.8b, ?v\[0-9\]+\.8b, ?v\[0-9\]+\.8b!?\(?:\[ \t\]+@\[a-zA-Z0-9 \]+\)?\n" 1 } } */
++/* { dg-final { scan-assembler-times "trn2\[ \t\]+v\[0-9\]+\.8b, ?v\[0-9\]+\.8b, ?v\[0-9\]+\.8b!?\(?:\[ \t\]+@\[a-zA-Z0-9 \]+\)?\n" 1 } } */
++/* { dg-final { cleanup-saved-temps } } */
+--- a/src/gcc/testsuite/gcc.target/aarch64/simd/extq_u8.x
++++ b/src/gcc/testsuite/gcc.target/aarch64/simd/extq_u8.x
+@@ -0,0 +1,227 @@
++extern void abort (void);
++
++uint8x16_t
++test_vextq_u8_1 (uint8x16_t a, uint8x16_t b)
++{
++ return vextq_u8 (a, b, 1);
++}
++
++uint8x16_t
++test_vextq_u8_2 (uint8x16_t a, uint8x16_t b)
++{
++ return vextq_u8 (a, b, 2);
++}
++
++uint8x16_t
++test_vextq_u8_3 (uint8x16_t a, uint8x16_t b)
++{
++ return vextq_u8 (a, b, 3);
++}
++
++uint8x16_t
++test_vextq_u8_4 (uint8x16_t a, uint8x16_t b)
++{
++ return vextq_u8 (a, b, 4);
++}
++
++uint8x16_t
++test_vextq_u8_5 (uint8x16_t a, uint8x16_t b)
++{
++ return vextq_u8 (a, b, 5);
++}
++
++uint8x16_t
++test_vextq_u8_6 (uint8x16_t a, uint8x16_t b)
++{
++ return vextq_u8 (a, b, 6);
++}
++
++uint8x16_t
++test_vextq_u8_7 (uint8x16_t a, uint8x16_t b)
++{
++ return vextq_u8 (a, b, 7);
++}
++
++uint8x16_t
++test_vextq_u8_8 (uint8x16_t a, uint8x16_t b)
++{
++ return vextq_u8 (a, b, 8);
++}
++
++uint8x16_t
++test_vextq_u8_9 (uint8x16_t a, uint8x16_t b)
++{
++ return vextq_u8 (a, b, 9);
++}
++
++uint8x16_t
++test_vextq_u8_10 (uint8x16_t a, uint8x16_t b)
++{
++ return vextq_u8 (a, b, 10);
++}
++
++uint8x16_t
++test_vextq_u8_11 (uint8x16_t a, uint8x16_t b)
++{
++ return vextq_u8 (a, b, 11);
++}
++
++uint8x16_t
++test_vextq_u8_12 (uint8x16_t a, uint8x16_t b)
++{
++ return vextq_u8 (a, b, 12);
++}
++
++uint8x16_t
++test_vextq_u8_13 (uint8x16_t a, uint8x16_t b)
++{
++ return vextq_u8 (a, b, 13);
++}
++
++uint8x16_t
++test_vextq_u8_14 (uint8x16_t a, uint8x16_t b)
++{
++ return vextq_u8 (a, b, 14);
++}
++
++uint8x16_t
++test_vextq_u8_15 (uint8x16_t a, uint8x16_t b)
++{
++ return vextq_u8 (a, b, 15);
++}
++
++int
++main (int argc, char **argv)
++{
++ int i;
++ uint8_t arr1[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15};
++ uint8x16_t in1 = vld1q_u8 (arr1);
++ uint8_t arr2[] =
++ {16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31};
++ uint8x16_t in2 = vld1q_u8 (arr2);
++ uint8_t exp[16];
++ uint8x16_t expected;
++ uint8x16_t actual = test_vextq_u8_1 (in1, in2);
++
++ for (i = 0; i < 16; i++)
++ exp[i] = i + 1;
++ expected = vld1q_u8 (exp);
++ for (i = 0; i < 16; i++)
++ if (actual[i] != expected[i])
++ abort ();
++
++ actual = test_vextq_u8_2 (in1, in2);
++ for (i = 0; i < 16; i++)
++ exp[i] = i + 2;
++ expected = vld1q_u8 (exp);
++ for (i = 0; i < 16; i++)
++ if (actual[i] != expected[i])
++ abort ();
++
++ actual = test_vextq_u8_3 (in1, in2);
++ for (i = 0; i < 16; i++)
++ exp[i] = i + 3;
++ expected = vld1q_u8 (exp);
++ for (i = 0; i < 16; i++)
++ if (actual[i] != expected[i])
++ abort ();
++
++ actual = test_vextq_u8_4 (in1, in2);
++ for (i = 0; i < 16; i++)
++ exp[i] = i + 4;
++ expected = vld1q_u8 (exp);
++ for (i = 0; i < 16; i++)
++ if (actual[i] != expected[i])
++ abort ();
++
++ actual = test_vextq_u8_5 (in1, in2);
++ for (i = 0; i < 16; i++)
++ exp[i] = i + 5;
++ expected = vld1q_u8 (exp);
++ for (i = 0; i < 16; i++)
++ if (actual[i] != expected[i])
++ abort ();
++
++ actual = test_vextq_u8_6 (in1, in2);
++ for (i = 0; i < 16; i++)
++ exp[i] = i + 6;
++ expected = vld1q_u8 (exp);
++ for (i = 0; i < 16; i++)
++ if (actual[i] != expected[i])
++ abort ();
++
++ actual = test_vextq_u8_7 (in1, in2);
++ for (i = 0; i < 16; i++)
++ exp[i] = i + 7;
++ expected = vld1q_u8 (exp);
++ for (i = 0; i < 16; i++)
++ if (actual[i] != expected[i])
++ abort ();
++
++ actual = test_vextq_u8_8 (in1, in2);
++ for (i = 0; i < 16; i++)
++ exp[i] = i + 8;
++ expected = vld1q_u8 (exp);
++ for (i = 0; i < 16; i++)
++ if (actual[i] != expected[i])
++ abort ();
++
++ actual = test_vextq_u8_9 (in1, in2);
++ for (i = 0; i < 16; i++)
++ exp[i] = i + 9;
++ expected = vld1q_u8 (exp);
++ for (i = 0; i < 16; i++)
++ if (actual[i] != expected[i])
++ abort ();
++
++ actual = test_vextq_u8_10 (in1, in2);
++ for (i = 0; i < 16; i++)
++ exp[i] = i + 10;
++ expected = vld1q_u8 (exp);
++ for (i = 0; i < 16; i++)
++ if (actual[i] != expected[i])
++ abort ();
++
++ actual = test_vextq_u8_11 (in1, in2);
++ for (i = 0; i < 16; i++)
++ exp[i] = i + 11;
++ expected = vld1q_u8 (exp);
++ for (i = 0; i < 16; i++)
++ if (actual[i] != expected[i])
++ abort ();
++
++ actual = test_vextq_u8_12 (in1, in2);
++ for (i = 0; i < 16; i++)
++ exp[i] = i + 12;
++ expected = vld1q_u8 (exp);
++ for (i = 0; i < 16; i++)
++ if (actual[i] != expected[i])
++ abort ();
++
++ actual = test_vextq_u8_13 (in1, in2);
++ for (i = 0; i < 16; i++)
++ exp[i] = i + 13;
++ expected = vld1q_u8 (exp);
++ for (i = 0; i < 16; i++)
++ if (actual[i] != expected[i])
++ abort ();
++
++ actual = test_vextq_u8_14 (in1, in2);
++ for (i = 0; i < 16; i++)
++ exp[i] = i + 14;
++ expected = vld1q_u8 (exp);
++ for (i = 0; i < 16; i++)
++ if (actual[i] != expected[i])
++ abort ();
++
++ actual = test_vextq_u8_15 (in1, in2);
++ for (i = 0; i < 16; i++)
++ exp[i] = i + 15;
++ expected = vld1q_u8 (exp);
++ for (i = 0; i < 16; i++)
++ if (actual[i] != expected[i])
++ abort ();
++
++ return 0;
++}
++
+--- a/src/gcc/testsuite/gcc.target/aarch64/simd/vzipqu32_1.c
++++ b/src/gcc/testsuite/gcc.target/aarch64/simd/vzipqu32_1.c
+@@ -0,0 +1,11 @@
++/* Test the `vzipq_u32' AArch64 SIMD intrinsic. */
++
++/* { dg-do run } */
++/* { dg-options "-save-temps -fno-inline" } */
++
++#include <arm_neon.h>
++#include "vzipqu32.x"
++
++/* { dg-final { scan-assembler-times "zip1\[ \t\]+v\[0-9\]+\.4s, ?v\[0-9\]+\.4s, ?v\[0-9\]+\.4s!?\(?:\[ \t\]+@\[a-zA-Z0-9 \]+\)?\n" 1 } } */
++/* { dg-final { scan-assembler-times "zip2\[ \t\]+v\[0-9\]+\.4s, ?v\[0-9\]+\.4s, ?v\[0-9\]+\.4s!?\(?:\[ \t\]+@\[a-zA-Z0-9 \]+\)?\n" 1 } } */
++/* { dg-final { cleanup-saved-temps } } */
+--- a/src/gcc/testsuite/gcc.target/aarch64/simd/vrev64p8_1.c
++++ b/src/gcc/testsuite/gcc.target/aarch64/simd/vrev64p8_1.c
+@@ -0,0 +1,10 @@
++/* Test the `vrev64_p8' AArch64 SIMD intrinsic. */
++
++/* { dg-do run } */
++/* { dg-options "-save-temps -fno-inline" } */
++
++#include <arm_neon.h>
++#include "vrev64p8.x"
++
++/* { dg-final { scan-assembler-times "rev64\[ \t\]+v\[0-9\]+.8b, ?v\[0-9\]+.8b!?\(?:\[ \t\]+@\[a-zA-Z0-9 \]+\)?\n" 1 } } */
++/* { dg-final { cleanup-saved-temps } } */
+--- a/src/gcc/testsuite/gcc.target/aarch64/simd/vrev32u8_1.c
++++ b/src/gcc/testsuite/gcc.target/aarch64/simd/vrev32u8_1.c
+@@ -0,0 +1,10 @@
++/* Test the `vrev32_u8' AArch64 SIMD intrinsic. */
++
++/* { dg-do run } */
++/* { dg-options "-save-temps -fno-inline" } */
++
++#include <arm_neon.h>
++#include "vrev32u8.x"
++
++/* { dg-final { scan-assembler-times "rev32\[ \t\]+v\[0-9\]+.8b, ?v\[0-9\]+.8b!?\(?:\[ \t\]+@\[a-zA-Z0-9 \]+\)?\n" 1 } } */
++/* { dg-final { cleanup-saved-temps } } */
+--- a/src/gcc/testsuite/gcc.target/aarch64/simd/vrev16s8_1.c
++++ b/src/gcc/testsuite/gcc.target/aarch64/simd/vrev16s8_1.c
+@@ -0,0 +1,10 @@
++/* Test the `vrev16_s8' AArch64 SIMD intrinsic. */
++
++/* { dg-do run } */
++/* { dg-options "-save-temps -fno-inline" } */
++
++#include <arm_neon.h>
++#include "vrev16s8.x"
++
++/* { dg-final { scan-assembler-times "rev16\[ \t\]+v\[0-9\]+.8b, ?v\[0-9\]+.8b!?\(?:\[ \t\]+@\[a-zA-Z0-9 \]+\)?\n" 1 } } */
++/* { dg-final { cleanup-saved-temps } } */
+--- a/src/gcc/testsuite/gcc.target/aarch64/simd/vuzpqf32.x
++++ b/src/gcc/testsuite/gcc.target/aarch64/simd/vuzpqf32.x
+@@ -0,0 +1,26 @@
++extern void abort (void);
++
++float32x4x2_t
++test_vuzpqf32 (float32x4_t _a, float32x4_t _b)
++{
++ return vuzpq_f32 (_a, _b);
++}
++
++int
++main (int argc, char **argv)
++{
++ int i;
++ float32_t first[] = {1, 2, 3, 4};
++ float32_t second[] = {5, 6, 7, 8};
++ float32x4x2_t result = test_vuzpqf32 (vld1q_f32 (first), vld1q_f32 (second));
++ float32_t exp1[] = {1, 3, 5, 7};
++ float32_t exp2[] = {2, 4, 6, 8};
++ float32x4_t expect1 = vld1q_f32 (exp1);
++ float32x4_t expect2 = vld1q_f32 (exp2);
++
++ for (i = 0; i < 4; i++)
++ if ((result.val[0][i] != expect1[i]) || (result.val[1][i] != expect2[i]))
++ abort ();
++
++ return 0;
++}
+--- a/src/gcc/testsuite/gcc.target/aarch64/simd/vzipp8.x
++++ b/src/gcc/testsuite/gcc.target/aarch64/simd/vzipp8.x
+@@ -0,0 +1,27 @@
++extern void abort (void);
++
++poly8x8x2_t
++test_vzipp8 (poly8x8_t _a, poly8x8_t _b)
++{
++ return vzip_p8 (_a, _b);
++}
++
++int
++main (int argc, char **argv)
++{
++ int i;
++ poly8_t first[] = {1, 2, 3, 4, 5, 6, 7, 8};
++ poly8_t second[] = {9, 10, 11, 12, 13, 14, 15, 16};
++ poly8x8x2_t result = test_vzipp8 (vld1_p8 (first), vld1_p8 (second));
++ poly8x8_t res1 = result.val[0], res2 = result.val[1];
++ poly8_t exp1[] = {1, 9, 2, 10, 3, 11, 4, 12};
++ poly8_t exp2[] = {5, 13, 6, 14, 7, 15, 8, 16};
++ poly8x8_t expected1 = vld1_p8 (exp1);
++ poly8x8_t expected2 = vld1_p8 (exp2);
++
++ for (i = 0; i < 8; i++)
++ if ((res1[i] != expected1[i]) || (res2[i] != expected2[i]))
++ abort ();
++
++ return 0;
++}
+--- a/src/gcc/testsuite/gcc.target/aarch64/simd/vtrnqs32.x
++++ b/src/gcc/testsuite/gcc.target/aarch64/simd/vtrnqs32.x
+@@ -0,0 +1,27 @@
++extern void abort (void);
++
++int32x4x2_t
++test_vtrnqs32 (int32x4_t _a, int32x4_t _b)
++{
++ return vtrnq_s32 (_a, _b);
++}
++
++int
++main (int argc, char **argv)
++{
++ int i;
++ int32_t first[] = {1, 2, 3, 4};
++ int32_t second[] = {5, 6, 7, 8};
++ int32x4x2_t result = test_vtrnqs32 (vld1q_s32 (first), vld1q_s32 (second));
++ int32x4_t res1 = result.val[0], res2 = result.val[1];
++ int32_t exp1[] = {1, 5, 3, 7};
++ int32_t exp2[] = {2, 6, 4, 8};
++ int32x4_t expected1 = vld1q_s32 (exp1);
++ int32x4_t expected2 = vld1q_s32 (exp2);
++
++ for (i = 0; i < 4; i++)
++ if ((res1[i] != expected1[i]) || (res2[i] != expected2[i]))
++ abort ();
++
++ return 0;
++}
+--- a/src/gcc/testsuite/gcc.target/aarch64/simd/vtrnqu32.x
++++ b/src/gcc/testsuite/gcc.target/aarch64/simd/vtrnqu32.x
+@@ -0,0 +1,27 @@
++extern void abort (void);
++
++uint32x4x2_t
++test_vtrnqu32 (uint32x4_t _a, uint32x4_t _b)
++{
++ return vtrnq_u32 (_a, _b);
++}
++
++int
++main (int argc, char **argv)
++{
++ int i;
++ uint32_t first[] = {1, 2, 3, 4};
++ uint32_t second[] = {5, 6, 7, 8};
++ uint32x4x2_t result = test_vtrnqu32 (vld1q_u32 (first), vld1q_u32 (second));
++ uint32x4_t res1 = result.val[0], res2 = result.val[1];
++ uint32_t exp1[] = {1, 5, 3, 7};
++ uint32_t exp2[] = {2, 6, 4, 8};
++ uint32x4_t expected1 = vld1q_u32 (exp1);
++ uint32x4_t expected2 = vld1q_u32 (exp2);
++
++ for (i = 0; i < 4; i++)
++ if ((res1[i] != expected1[i]) || (res2[i] != expected2[i]))
++ abort ();
++
++ return 0;
++}
+--- a/src/gcc/testsuite/gcc.target/aarch64/simd/vrev64qs32.x
++++ b/src/gcc/testsuite/gcc.target/aarch64/simd/vrev64qs32.x
+@@ -0,0 +1,22 @@
++extern void abort (void);
++
++int32x4_t
++test_vrev64qs32 (int32x4_t _arg)
++{
++ return vrev64q_s32 (_arg);
++}
++
++int
++main (int argc, char **argv)
++{
++ int i;
++ int32x4_t inorder = {1, 2, 3, 4};
++ int32x4_t reversed = test_vrev64qs32 (inorder);
++ int32x4_t expected = {2, 1, 4, 3};
++
++ for (i = 0; i < 4; i++)
++ if (reversed[i] != expected[i])
++ abort ();
++ return 0;
++}
++
+--- a/src/gcc/testsuite/gcc.target/aarch64/simd/vtrnu8.x
++++ b/src/gcc/testsuite/gcc.target/aarch64/simd/vtrnu8.x
+@@ -0,0 +1,27 @@
++extern void abort (void);
++
++uint8x8x2_t
++test_vtrnu8 (uint8x8_t _a, uint8x8_t _b)
++{
++ return vtrn_u8 (_a, _b);
++}
++
++int
++main (int argc, char **argv)
++{
++ int i;
++ uint8_t first[] = {1, 2, 3, 4, 5, 6, 7, 8};
++ uint8_t second[] = {9, 10, 11, 12, 13, 14, 15, 16};
++ uint8x8x2_t result = test_vtrnu8 (vld1_u8 (first), vld1_u8 (second));
++ uint8x8_t res1 = result.val[0], res2 = result.val[1];
++ uint8_t exp1[] = {1, 9, 3, 11, 5, 13, 7, 15};
++ uint8_t exp2[] = {2, 10, 4, 12, 6, 14, 8, 16};
++ uint8x8_t expected1 = vld1_u8 (exp1);
++ uint8x8_t expected2 = vld1_u8 (exp2);
++
++ for (i = 0; i < 8; i++)
++ if ((res1[i] != expected1[i]) || (res2[i] != expected2[i]))
++ abort ();
++
++ return 0;
++}
+--- a/src/gcc/testsuite/gcc.target/aarch64/simd/vrev64qu32.x
++++ b/src/gcc/testsuite/gcc.target/aarch64/simd/vrev64qu32.x
+@@ -0,0 +1,22 @@
++extern void abort (void);
++
++uint32x4_t
++test_vrev64qu32 (uint32x4_t _arg)
++{
++ return vrev64q_u32 (_arg);
++}
++
++int
++main (int argc, char **argv)
++{
++ int i;
++ uint32x4_t inorder = {1, 2, 3, 4};
++ uint32x4_t reversed = test_vrev64qu32 (inorder);
++ uint32x4_t expected = {2, 1, 4, 3};
++
++ for (i = 0; i < 4; i++)
++ if (reversed[i] != expected[i])
++ abort ();
++ return 0;
++}
++
+--- a/src/gcc/testsuite/gcc.target/aarch64/simd/extq_s64_1.c
++++ b/src/gcc/testsuite/gcc.target/aarch64/simd/extq_s64_1.c
+@@ -0,0 +1,10 @@
++/* Test the `vextQs64' AArch64 SIMD intrinsic. */
++
++/* { dg-do run } */
++/* { dg-options "-save-temps -O3 -fno-inline" } */
++
++#include "arm_neon.h"
++#include "extq_s64.x"
++
++/* { dg-final { scan-assembler-times "ext\[ \t\]+\[vV\]\[0-9\]+\.16\[bB\], ?\[vV\]\[0-9\]+\.16\[bB\], ?\[vV\]\[0-9\]+\.16\[bB\], ?#\[0-9\]+\(?:.8\)?\(?:\[ \t\]+@\[a-zA-Z0-9 \]+\)?\n" 1 } } */
++/* { dg-final { cleanup-saved-temps } } */
+--- a/src/gcc/testsuite/gcc.target/aarch64/simd/ext_s8.x
++++ b/src/gcc/testsuite/gcc.target/aarch64/simd/ext_s8.x
+@@ -0,0 +1,114 @@
++extern void abort (void);
++
++int8x8_t
++test_vext_s8_1 (int8x8_t a, int8x8_t b)
++{
++ return vext_s8 (a, b, 1);
++}
++
++int8x8_t
++test_vext_s8_2 (int8x8_t a, int8x8_t b)
++{
++ return vext_s8 (a, b, 2);
++}
++
++int8x8_t
++test_vext_s8_3 (int8x8_t a, int8x8_t b)
++{
++ return vext_s8 (a, b, 3);
++}
++
++int8x8_t
++test_vext_s8_4 (int8x8_t a, int8x8_t b)
++{
++ return vext_s8 (a, b, 4);
++}
++
++int8x8_t
++test_vext_s8_5 (int8x8_t a, int8x8_t b)
++{
++ return vext_s8 (a, b, 5);
++}
++
++int8x8_t
++test_vext_s8_6 (int8x8_t a, int8x8_t b)
++{
++ return vext_s8 (a, b, 6);
++}
++
++int8x8_t
++test_vext_s8_7 (int8x8_t a, int8x8_t b)
++{
++ return vext_s8 (a, b, 7);
++}
++
++int
++main (int argc, char **argv)
++{
++ int i, off;
++ int8_t arr1[] = {0, 1, 2, 3, 4, 5, 6, 7};
++ int8x8_t in1 = vld1_s8 (arr1);
++ int8_t arr2[] = {8, 9, 10, 11, 12, 13, 14, 15};
++ int8x8_t in2 = vld1_s8 (arr2);
++ int8_t exp[8];
++ int8x8_t expected;
++ int8x8_t actual = test_vext_s8_1 (in1, in2);
++
++ for (i = 0; i < 8; i++)
++ exp[i] = i + 1;
++ expected = vld1_s8 (exp);
++ for (i = 0; i < 8; i++)
++ if (actual[i] != expected[i])
++ abort ();
++
++ actual = test_vext_s8_2 (in1, in2);
++ for (i = 0; i < 8; i++)
++ exp[i] = i + 2;
++ expected = vld1_s8 (exp);
++ for (i = 0; i < 8; i++)
++ if (actual[i] != expected[i])
++ abort ();
++
++ actual = test_vext_s8_3 (in1, in2);
++ for (i = 0; i < 8; i++)
++ exp[i] = i + 3;
++ expected = vld1_s8 (exp);
++ for (i = 0; i < 8; i++)
++ if (actual[i] != expected[i])
++ abort ();
++
++ actual = test_vext_s8_4 (in1, in2);
++ for (i = 0; i < 8; i++)
++ exp[i] = i + 4;
++ expected = vld1_s8 (exp);
++ for (i = 0; i < 8; i++)
++ if (actual[i] != expected[i])
++ abort ();
++
++ actual = test_vext_s8_5 (in1, in2);
++ for (i = 0; i < 8; i++)
++ exp[i] = i + 5;
++ expected = vld1_s8 (exp);
++ for (i = 0; i < 8; i++)
++ if (actual[i] != expected[i])
++ abort ();
++
++ actual = test_vext_s8_6 (in1, in2);
++ for (i = 0; i < 8; i++)
++ exp[i] = i + 6;
++ expected = vld1_s8 (exp);
++ for (i = 0; i < 8; i++)
++ if (actual[i] != expected[i])
++ abort ();
++
++ actual = test_vext_s8_7 (in1, in2);
++ for (i = 0; i < 8; i++)
++ exp[i] = i + 7;
++ expected = vld1_s8 (exp);
++ for (i = 0; i < 8; i++)
++ if (actual[i] != expected[i])
++ abort ();
++
++ return 0;
++}
++
+--- a/src/gcc/testsuite/gcc.target/aarch64/simd/vzips32_1.c
++++ b/src/gcc/testsuite/gcc.target/aarch64/simd/vzips32_1.c
+@@ -0,0 +1,11 @@
++/* Test the `vzip_s32' AArch64 SIMD intrinsic. */
++
++/* { dg-do run } */
++/* { dg-options "-save-temps -fno-inline" } */
++
++#include <arm_neon.h>
++#include "vzips32.x"
+
+/* { dg-final { scan-assembler-times "zip1\[ \t\]+v\[0-9\]+\.2s, ?v\[0-9\]+\.2s, ?v\[0-9\]+\.2s!?\(?:\[ \t\]+@\[a-zA-Z0-9 \]+\)?\n" 1 } } */
+/* { dg-final { scan-assembler-times "zip2\[ \t\]+v\[0-9\]+\.2s, ?v\[0-9\]+\.2s, ?v\[0-9\]+\.2s!?\(?:\[ \t\]+@\[a-zA-Z0-9 \]+\)?\n" 1 } } */
+/* { dg-final { cleanup-saved-temps } } */
---- a/src/gcc/testsuite/gcc.target/aarch64/simd/vzipqs8_1.c
-+++ b/src/gcc/testsuite/gcc.target/aarch64/simd/vzipqs8_1.c
+--- a/src/gcc/testsuite/gcc.target/aarch64/simd/vrev32qp8_1.c
++++ b/src/gcc/testsuite/gcc.target/aarch64/simd/vrev32qp8_1.c
+@@ -0,0 +1,10 @@
++/* Test the `vrev32q_p8' AArch64 SIMD intrinsic. */
++
++/* { dg-do run } */
++/* { dg-options "-save-temps -fno-inline" } */
++
++#include <arm_neon.h>
++#include "vrev32qp8.x"
++
++/* { dg-final { scan-assembler-times "rev32\[ \t\]+v\[0-9\]+.16b, ?v\[0-9\]+.16b!?\(?:\[ \t\]+@\[a-zA-Z0-9 \]+\)?\n" 1 } } */
++/* { dg-final { cleanup-saved-temps } } */
+--- a/src/gcc/testsuite/gcc.target/aarch64/simd/vtrnp16_1.c
++++ b/src/gcc/testsuite/gcc.target/aarch64/simd/vtrnp16_1.c
@@ -0,0 +1,11 @@
-+/* Test the `vzipq_s8' AArch64 SIMD intrinsic. */
++/* Test the `vtrn_p16' AArch64 SIMD intrinsic. */
+
+/* { dg-do run } */
+/* { dg-options "-save-temps -fno-inline" } */
+
+#include <arm_neon.h>
-+#include "vzipqs8.x"
++#include "vtrnp16.x"
+
-+/* { dg-final { scan-assembler-times "zip1\[ \t\]+v\[0-9\]+\.16b, ?v\[0-9\]+\.16b, ?v\[0-9\]+\.16b!?\(?:\[ \t\]+@\[a-zA-Z0-9 \]+\)?\n" 1 } } */
-+/* { dg-final { scan-assembler-times "zip2\[ \t\]+v\[0-9\]+\.16b, ?v\[0-9\]+\.16b, ?v\[0-9\]+\.16b!?\(?:\[ \t\]+@\[a-zA-Z0-9 \]+\)?\n" 1 } } */
++/* { dg-final { scan-assembler-times "trn1\[ \t\]+v\[0-9\]+\.4h, ?v\[0-9\]+\.4h, ?v\[0-9\]+\.4h!?\(?:\[ \t\]+@\[a-zA-Z0-9 \]+\)?\n" 1 } } */
++/* { dg-final { scan-assembler-times "trn2\[ \t\]+v\[0-9\]+\.4h, ?v\[0-9\]+\.4h, ?v\[0-9\]+\.4h!?\(?:\[ \t\]+@\[a-zA-Z0-9 \]+\)?\n" 1 } } */
+/* { dg-final { cleanup-saved-temps } } */
---- a/src/gcc/testsuite/gcc.target/aarch64/simd/vzipu16_1.c
-+++ b/src/gcc/testsuite/gcc.target/aarch64/simd/vzipu16_1.c
+--- a/src/gcc/testsuite/gcc.target/aarch64/simd/vtrnu32_1.c
++++ b/src/gcc/testsuite/gcc.target/aarch64/simd/vtrnu32_1.c
@@ -0,0 +1,11 @@
-+/* Test the `vzip_u16' AArch64 SIMD intrinsic. */
++/* Test the `vtrn_u32' AArch64 SIMD intrinsic. */
+
+/* { dg-do run } */
+/* { dg-options "-save-temps -fno-inline" } */
+
+#include <arm_neon.h>
-+#include "vzipu16.x"
++#include "vtrnu32.x"
+
-+/* { dg-final { scan-assembler-times "zip1\[ \t\]+v\[0-9\]+\.4h, ?v\[0-9\]+\.4h, ?v\[0-9\]+\.4h!?\(?:\[ \t\]+@\[a-zA-Z0-9 \]+\)?\n" 1 } } */
-+/* { dg-final { scan-assembler-times "zip2\[ \t\]+v\[0-9\]+\.4h, ?v\[0-9\]+\.4h, ?v\[0-9\]+\.4h!?\(?:\[ \t\]+@\[a-zA-Z0-9 \]+\)?\n" 1 } } */
++/* { dg-final { scan-assembler-times "zip1\[ \t\]+v\[0-9\]+\.2s, ?v\[0-9\]+\.2s, ?v\[0-9\]+\.2s!?\(?:\[ \t\]+@\[a-zA-Z0-9 \]+\)?\n" 1 } } */
++/* { dg-final { scan-assembler-times "zip2\[ \t\]+v\[0-9\]+\.2s, ?v\[0-9\]+\.2s, ?v\[0-9\]+\.2s!?\(?:\[ \t\]+@\[a-zA-Z0-9 \]+\)?\n" 1 } } */
+/* { dg-final { cleanup-saved-temps } } */
+--- a/src/gcc/testsuite/gcc.target/aarch64/simd/vuzps8.x
++++ b/src/gcc/testsuite/gcc.target/aarch64/simd/vuzps8.x
+@@ -0,0 +1,26 @@
++extern void abort (void);
++
++int8x8x2_t
++test_vuzps8 (int8x8_t _a, int8x8_t _b)
++{
++ return vuzp_s8 (_a, _b);
++}
++
++int
++main (int argc, char **argv)
++{
++ int i;
++ int8_t first[] = {1, 2, 3, 4, 5, 6, 7, 8};
++ int8_t second[] = {9, 10, 11, 12, 13, 14, 15, 16};
++ int8x8x2_t result = test_vuzps8 (vld1_s8 (first), vld1_s8 (second));
++ int8_t exp1[] = {1, 3, 5, 7, 9, 11, 13, 15};
++ int8_t exp2[] = {2, 4, 6, 8, 10, 12, 14, 16};
++ int8x8_t expect1 = vld1_s8 (exp1);
++ int8x8_t expect2 = vld1_s8 (exp2);
++
++ for (i = 0; i < 8; i++)
++ if ((result.val[0][i] != expect1[i]) || (result.val[1][i] != expect2[i]))
++ abort ();
++
++ return 0;
++}
--- a/src/gcc/testsuite/gcc.target/aarch64/simd/vzipqu8_1.c
+++ b/src/gcc/testsuite/gcc.target/aarch64/simd/vzipqu8_1.c
@@ -0,0 +1,11 @@
@@ -3365,6 +8279,107 @@ LANG=C svn diff svn://gcc.gnu.org/svn/gcc/branches/gcc-4_9-branch@211979 \
+
+ return 0;
+}
+--- a/src/gcc/testsuite/gcc.target/aarch64/simd/ext_p16_1.c
++++ b/src/gcc/testsuite/gcc.target/aarch64/simd/ext_p16_1.c
+@@ -0,0 +1,10 @@
++/* Test the `vextp16' AArch64 SIMD intrinsic. */
++
++/* { dg-do run } */
++/* { dg-options "-save-temps -O3 -fno-inline" } */
++
++#include "arm_neon.h"
++#include "ext_p16.x"
++
++/* { dg-final { scan-assembler-times "ext\[ \t\]+\[vV\]\[0-9\]+\.8\[bB\], ?\[vV\]\[0-9\]+\.8\[bB\], ?\[vV\]\[0-9\]+\.8\[bB\], ?#\[0-9\]+\(?:.2\)?\(?:\[ \t\]+@\[a-zA-Z0-9 \]+\)?\n" 3 } } */
++/* { dg-final { cleanup-saved-temps } } */
+--- a/src/gcc/testsuite/gcc.target/aarch64/simd/vrev32s16.x
++++ b/src/gcc/testsuite/gcc.target/aarch64/simd/vrev32s16.x
+@@ -0,0 +1,22 @@
++extern void abort (void);
++
++int16x4_t
++test_vrev32s16 (int16x4_t _arg)
++{
++ return vrev32_s16 (_arg);
++}
++
++int
++main (int argc, char **argv)
++{
++ int i;
++ int16x4_t inorder = {1, 2, 3, 4};
++ int16x4_t reversed = test_vrev32s16 (inorder);
++ int16x4_t expected = {2, 1, 4, 3};
++
++ for (i = 0; i < 4; i++)
++ if (reversed[i] != expected[i])
++ abort ();
++ return 0;
++}
++
+--- a/src/gcc/testsuite/gcc.target/aarch64/simd/vrev32u16.x
++++ b/src/gcc/testsuite/gcc.target/aarch64/simd/vrev32u16.x
+@@ -0,0 +1,22 @@
++extern void abort (void);
++
++uint16x4_t
++test_vrev32u16 (uint16x4_t _arg)
++{
++ return vrev32_u16 (_arg);
++}
++
++int
++main (int argc, char **argv)
++{
++ int i;
++ uint16x4_t inorder = {1, 2, 3, 4};
++ uint16x4_t reversed = test_vrev32u16 (inorder);
++ uint16x4_t expected = {2, 1, 4, 3};
++
++ for (i = 0; i < 4; i++)
++ if (reversed[i] != expected[i])
++ abort ();
++ return 0;
++}
++
+--- a/src/gcc/testsuite/gcc.target/aarch64/simd/vrev64p16.x
++++ b/src/gcc/testsuite/gcc.target/aarch64/simd/vrev64p16.x
+@@ -0,0 +1,22 @@
++extern void abort (void);
++
++poly16x4_t
++test_vrev64p16 (poly16x4_t _arg)
++{
++ return vrev64_p16 (_arg);
++}
++
++int
++main (int argc, char **argv)
++{
++ int i;
++ poly16x4_t inorder = {1, 2, 3, 4};
++ poly16x4_t reversed = test_vrev64p16 (inorder);
++ poly16x4_t expected = {4, 3, 2, 1};
++
++ for (i = 0; i < 4; i++)
++ if (reversed[i] != expected[i])
++ abort ();
++ return 0;
++}
++
+--- a/src/gcc/testsuite/gcc.target/aarch64/simd/vrev64qf32_1.c
++++ b/src/gcc/testsuite/gcc.target/aarch64/simd/vrev64qf32_1.c
+@@ -0,0 +1,10 @@
++/* Test the `vrev64q_f32' AArch64 SIMD intrinsic. */
++
++/* { dg-do run } */
++/* { dg-options "-save-temps -fno-inline" } */
++
++#include <arm_neon.h>
++#include "vrev64qf32.x"
++
++/* { dg-final { scan-assembler-times "rev64\[ \t\]+v\[0-9\]+.4s, ?v\[0-9\]+.4s!?\(?:\[ \t\]+@\[a-zA-Z0-9 \]+\)?\n" 1 } } */
++/* { dg-final { cleanup-saved-temps } } */
--- a/src/gcc/testsuite/gcc.target/aarch64/simd/vzipqf32.x
+++ b/src/gcc/testsuite/gcc.target/aarch64/simd/vzipqf32.x
@@ -0,0 +1,27 @@
@@ -3395,80 +8410,441 @@ LANG=C svn diff svn://gcc.gnu.org/svn/gcc/branches/gcc-4_9-branch@211979 \
+
+ return 0;
+}
---- a/src/gcc/testsuite/gcc.target/aarch64/simd/vzipp8_1.c
-+++ b/src/gcc/testsuite/gcc.target/aarch64/simd/vzipp8_1.c
+--- a/src/gcc/testsuite/gcc.target/aarch64/simd/ext_u32_1.c
++++ b/src/gcc/testsuite/gcc.target/aarch64/simd/ext_u32_1.c
+@@ -0,0 +1,10 @@
++/* Test the `vextu32' AArch64 SIMD intrinsic. */
++
++/* { dg-do run } */
++/* { dg-options "-save-temps -O3 -fno-inline" } */
++
++#include "arm_neon.h"
++#include "ext_u32.x"
++
++/* { dg-final { scan-assembler-times "ext\[ \t\]+\[vV\]\[0-9\]+\.8\[bB\], ?\[vV\]\[0-9\]+\.8\[bB\], ?\[vV\]\[0-9\]+\.8\[bB\], ?#\[0-9\]+\(?:.4)?\(?:\[ \t\]+@\[a-zA-Z0-9 \]+\)?\n" 1 } } */
++/* { dg-final { cleanup-saved-temps } } */
+--- a/src/gcc/testsuite/gcc.target/aarch64/simd/extq_p8.x
++++ b/src/gcc/testsuite/gcc.target/aarch64/simd/extq_p8.x
+@@ -0,0 +1,227 @@
++extern void abort (void);
++
++poly8x16_t
++test_vextq_p8_1 (poly8x16_t a, poly8x16_t b)
++{
++ return vextq_p8 (a, b, 1);
++}
++
++poly8x16_t
++test_vextq_p8_2 (poly8x16_t a, poly8x16_t b)
++{
++ return vextq_p8 (a, b, 2);
++}
++
++poly8x16_t
++test_vextq_p8_3 (poly8x16_t a, poly8x16_t b)
++{
++ return vextq_p8 (a, b, 3);
++}
++
++poly8x16_t
++test_vextq_p8_4 (poly8x16_t a, poly8x16_t b)
++{
++ return vextq_p8 (a, b, 4);
++}
++
++poly8x16_t
++test_vextq_p8_5 (poly8x16_t a, poly8x16_t b)
++{
++ return vextq_p8 (a, b, 5);
++}
++
++poly8x16_t
++test_vextq_p8_6 (poly8x16_t a, poly8x16_t b)
++{
++ return vextq_p8 (a, b, 6);
++}
++
++poly8x16_t
++test_vextq_p8_7 (poly8x16_t a, poly8x16_t b)
++{
++ return vextq_p8 (a, b, 7);
++}
++
++poly8x16_t
++test_vextq_p8_8 (poly8x16_t a, poly8x16_t b)
++{
++ return vextq_p8 (a, b, 8);
++}
++
++poly8x16_t
++test_vextq_p8_9 (poly8x16_t a, poly8x16_t b)
++{
++ return vextq_p8 (a, b, 9);
++}
++
++poly8x16_t
++test_vextq_p8_10 (poly8x16_t a, poly8x16_t b)
++{
++ return vextq_p8 (a, b, 10);
++}
++
++poly8x16_t
++test_vextq_p8_11 (poly8x16_t a, poly8x16_t b)
++{
++ return vextq_p8 (a, b, 11);
++}
++
++poly8x16_t
++test_vextq_p8_12 (poly8x16_t a, poly8x16_t b)
++{
++ return vextq_p8 (a, b, 12);
++}
++
++poly8x16_t
++test_vextq_p8_13 (poly8x16_t a, poly8x16_t b)
++{
++ return vextq_p8 (a, b, 13);
++}
++
++poly8x16_t
++test_vextq_p8_14 (poly8x16_t a, poly8x16_t b)
++{
++ return vextq_p8 (a, b, 14);
++}
++
++poly8x16_t
++test_vextq_p8_15 (poly8x16_t a, poly8x16_t b)
++{
++ return vextq_p8 (a, b, 15);
++}
++
++int
++main (int argc, char **argv)
++{
++ int i;
++ poly8_t arr1[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15};
++ poly8x16_t in1 = vld1q_p8 (arr1);
++ poly8_t arr2[] =
++ {16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31};
++ poly8x16_t in2 = vld1q_p8 (arr2);
++ poly8_t exp[16];
++ poly8x16_t expected;
++ poly8x16_t actual = test_vextq_p8_1 (in1, in2);
++
++ for (i = 0; i < 16; i++)
++ exp[i] = i + 1;
++ expected = vld1q_p8 (exp);
++ for (i = 0; i < 16; i++)
++ if (actual[i] != expected[i])
++ abort ();
++
++ actual = test_vextq_p8_2 (in1, in2);
++ for (i = 0; i < 16; i++)
++ exp[i] = i + 2;
++ expected = vld1q_p8 (exp);
++ for (i = 0; i < 16; i++)
++ if (actual[i] != expected[i])
++ abort ();
++
++ actual = test_vextq_p8_3 (in1, in2);
++ for (i = 0; i < 16; i++)
++ exp[i] = i + 3;
++ expected = vld1q_p8 (exp);
++ for (i = 0; i < 16; i++)
++ if (actual[i] != expected[i])
++ abort ();
++
++ actual = test_vextq_p8_4 (in1, in2);
++ for (i = 0; i < 16; i++)
++ exp[i] = i + 4;
++ expected = vld1q_p8 (exp);
++ for (i = 0; i < 16; i++)
++ if (actual[i] != expected[i])
++ abort ();
++
++ actual = test_vextq_p8_5 (in1, in2);
++ for (i = 0; i < 16; i++)
++ exp[i] = i + 5;
++ expected = vld1q_p8 (exp);
++ for (i = 0; i < 16; i++)
++ if (actual[i] != expected[i])
++ abort ();
++
++ actual = test_vextq_p8_6 (in1, in2);
++ for (i = 0; i < 16; i++)
++ exp[i] = i + 6;
++ expected = vld1q_p8 (exp);
++ for (i = 0; i < 16; i++)
++ if (actual[i] != expected[i])
++ abort ();
++
++ actual = test_vextq_p8_7 (in1, in2);
++ for (i = 0; i < 16; i++)
++ exp[i] = i + 7;
++ expected = vld1q_p8 (exp);
++ for (i = 0; i < 16; i++)
++ if (actual[i] != expected[i])
++ abort ();
++
++ actual = test_vextq_p8_8 (in1, in2);
++ for (i = 0; i < 16; i++)
++ exp[i] = i + 8;
++ expected = vld1q_p8 (exp);
++ for (i = 0; i < 16; i++)
++ if (actual[i] != expected[i])
++ abort ();
++
++ actual = test_vextq_p8_9 (in1, in2);
++ for (i = 0; i < 16; i++)
++ exp[i] = i + 9;
++ expected = vld1q_p8 (exp);
++ for (i = 0; i < 16; i++)
++ if (actual[i] != expected[i])
++ abort ();
++
++ actual = test_vextq_p8_10 (in1, in2);
++ for (i = 0; i < 16; i++)
++ exp[i] = i + 10;
++ expected = vld1q_p8 (exp);
++ for (i = 0; i < 16; i++)
++ if (actual[i] != expected[i])
++ abort ();
++
++ actual = test_vextq_p8_11 (in1, in2);
++ for (i = 0; i < 16; i++)
++ exp[i] = i + 11;
++ expected = vld1q_p8 (exp);
++ for (i = 0; i < 16; i++)
++ if (actual[i] != expected[i])
++ abort ();
++
++ actual = test_vextq_p8_12 (in1, in2);
++ for (i = 0; i < 16; i++)
++ exp[i] = i + 12;
++ expected = vld1q_p8 (exp);
++ for (i = 0; i < 16; i++)
++ if (actual[i] != expected[i])
++ abort ();
++
++ actual = test_vextq_p8_13 (in1, in2);
++ for (i = 0; i < 16; i++)
++ exp[i] = i + 13;
++ expected = vld1q_p8 (exp);
++ for (i = 0; i < 16; i++)
++ if (actual[i] != expected[i])
++ abort ();
++
++ actual = test_vextq_p8_14 (in1, in2);
++ for (i = 0; i < 16; i++)
++ exp[i] = i + 14;
++ expected = vld1q_p8 (exp);
++ for (i = 0; i < 16; i++)
++ if (actual[i] != expected[i])
++ abort ();
++
++ actual = test_vextq_p8_15 (in1, in2);
++ for (i = 0; i < 16; i++)
++ exp[i] = i + 15;
++ expected = vld1q_p8 (exp);
++ for (i = 0; i < 16; i++)
++ if (actual[i] != expected[i])
++ abort ();
++
++ return 0;
++}
++
+--- a/src/gcc/testsuite/gcc.target/aarch64/simd/vrev64qs8.x
++++ b/src/gcc/testsuite/gcc.target/aarch64/simd/vrev64qs8.x
+@@ -0,0 +1,22 @@
++extern void abort (void);
++
++int8x16_t
++test_vrev64qs8 (int8x16_t _arg)
++{
++ return vrev64q_s8 (_arg);
++}
++
++int
++main (int argc, char **argv)
++{
++ int i;
++ int8x16_t inorder = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16};
++ int8x16_t reversed = test_vrev64qs8 (inorder);
++ int8x16_t expected = {8, 7, 6, 5, 4, 3, 2, 1, 16, 15, 14, 13, 12, 11, 10, 9};
++
++ for (i = 0; i < 16; i++)
++ if (reversed[i] != expected[i])
++ abort ();
++ return 0;
++}
++
+--- a/src/gcc/testsuite/gcc.target/aarch64/simd/vrev16p8_1.c
++++ b/src/gcc/testsuite/gcc.target/aarch64/simd/vrev16p8_1.c
+@@ -0,0 +1,10 @@
++/* Test the `vrev16_p8' AArch64 SIMD intrinsic. */
++
++/* { dg-do run } */
++/* { dg-options "-save-temps -fno-inline" } */
++
++#include <arm_neon.h>
++#include "vrev16p8.x"
++
++/* { dg-final { scan-assembler-times "rev16\[ \t\]+v\[0-9\]+.8b, ?v\[0-9\]+.8b!?\(?:\[ \t\]+@\[a-zA-Z0-9 \]+\)?\n" 1 } } */
++/* { dg-final { cleanup-saved-temps } } */
+--- a/src/gcc/testsuite/gcc.target/aarch64/simd/vtrnqs32_1.c
++++ b/src/gcc/testsuite/gcc.target/aarch64/simd/vtrnqs32_1.c
@@ -0,0 +1,11 @@
-+/* Test the `vzip_p8' AArch64 SIMD intrinsic. */
++/* Test the `vtrnq_s32' AArch64 SIMD intrinsic. */
+
+/* { dg-do run } */
+/* { dg-options "-save-temps -fno-inline" } */
+
+#include <arm_neon.h>
-+#include "vzipp8.x"
++#include "vtrnqs32.x"
+
-+/* { dg-final { scan-assembler-times "zip1\[ \t\]+v\[0-9\]+\.8b, ?v\[0-9\]+\.8b, ?v\[0-9\]+\.8b!?\(?:\[ \t\]+@\[a-zA-Z0-9 \]+\)?\n" 1 } } */
-+/* { dg-final { scan-assembler-times "zip2\[ \t\]+v\[0-9\]+\.8b, ?v\[0-9\]+\.8b, ?v\[0-9\]+\.8b!?\(?:\[ \t\]+@\[a-zA-Z0-9 \]+\)?\n" 1 } } */
++/* { dg-final { scan-assembler-times "trn1\[ \t\]+v\[0-9\]+\.4s, ?v\[0-9\]+\.4s, ?v\[0-9\]+\.4s!?\(?:\[ \t\]+@\[a-zA-Z0-9 \]+\)?\n" 1 } } */
++/* { dg-final { scan-assembler-times "trn2\[ \t\]+v\[0-9\]+\.4s, ?v\[0-9\]+\.4s, ?v\[0-9\]+\.4s!?\(?:\[ \t\]+@\[a-zA-Z0-9 \]+\)?\n" 1 } } */
+/* { dg-final { cleanup-saved-temps } } */
---- a/src/gcc/testsuite/gcc.target/aarch64/simd/vzipqp16.x
-+++ b/src/gcc/testsuite/gcc.target/aarch64/simd/vzipqp16.x
-@@ -0,0 +1,27 @@
+--- a/src/gcc/testsuite/gcc.target/aarch64/simd/vuzps16.x
++++ b/src/gcc/testsuite/gcc.target/aarch64/simd/vuzps16.x
+@@ -0,0 +1,26 @@
+extern void abort (void);
+
-+poly16x8x2_t
-+test_vzipqp16 (poly16x8_t _a, poly16x8_t _b)
++int16x4x2_t
++test_vuzps16 (int16x4_t _a, int16x4_t _b)
+{
-+ return vzipq_p16 (_a, _b);
++ return vuzp_s16 (_a, _b);
+}
+
+int
+main (int argc, char **argv)
+{
+ int i;
-+ poly16_t first[] = {1, 2, 3, 4, 5, 6, 7, 8};
-+ poly16_t second[] = {9, 10, 11, 12, 13, 14, 15, 16};
-+ poly16x8x2_t result = test_vzipqp16 (vld1q_p16 (first), vld1q_p16 (second));
-+ poly16x8_t res1 = result.val[0], res2 = result.val[1];
-+ poly16_t exp1[] = {1, 9, 2, 10, 3, 11, 4, 12};
-+ poly16_t exp2[] = {5, 13, 6, 14, 7, 15, 8, 16};
-+ poly16x8_t expected1 = vld1q_p16 (exp1);
-+ poly16x8_t expected2 = vld1q_p16 (exp2);
++ int16_t first[] = {1, 2, 3, 4};
++ int16_t second[] = {5, 6, 7, 8};
++ int16x4x2_t result = test_vuzps16 (vld1_s16 (first), vld1_s16 (second));
++ int16_t exp1[] = {1, 3, 5, 7};
++ int16_t exp2[] = {2, 4, 6, 8};
++ int16x4_t expect1 = vld1_s16 (exp1);
++ int16x4_t expect2 = vld1_s16 (exp2);
+
-+ for (i = 0; i < 8; i++)
-+ if ((res1[i] != expected1[i]) || (res2[i] != expected2[i]))
++ for (i = 0; i < 4; i++)
++ if ((result.val[0][i] != expect1[i]) || (result.val[1][i] != expect2[i]))
+ abort ();
+
+ return 0;
+}
---- a/src/gcc/testsuite/gcc.target/aarch64/simd/vzipqs32.x
-+++ b/src/gcc/testsuite/gcc.target/aarch64/simd/vzipqs32.x
-@@ -0,0 +1,27 @@
+--- a/src/gcc/testsuite/gcc.target/aarch64/simd/vuzpu16.x
++++ b/src/gcc/testsuite/gcc.target/aarch64/simd/vuzpu16.x
+@@ -0,0 +1,26 @@
+extern void abort (void);
+
-+int32x4x2_t
-+test_vzipqs32 (int32x4_t _a, int32x4_t _b)
++uint16x4x2_t
++test_vuzpu16 (uint16x4_t _a, uint16x4_t _b)
+{
-+ return vzipq_s32 (_a, _b);
++ return vuzp_u16 (_a, _b);
+}
+
+int
+main (int argc, char **argv)
+{
+ int i;
-+ int32_t first[] = {1, 2, 3, 4};
-+ int32_t second[] = {5, 6, 7, 8};
-+ int32x4x2_t result = test_vzipqs32 (vld1q_s32 (first), vld1q_s32 (second));
-+ int32x4_t res1 = result.val[0], res2 = result.val[1];
-+ int32_t exp1[] = {1, 5, 2, 6};
-+ int32_t exp2[] = {3, 7, 4, 8};
-+ int32x4_t expected1 = vld1q_s32 (exp1);
-+ int32x4_t expected2 = vld1q_s32 (exp2);
++ uint16_t first[] = {1, 2, 3, 4};
++ uint16_t second[] = {5, 6, 7, 8};
++ uint16x4x2_t result = test_vuzpu16 (vld1_u16 (first), vld1_u16 (second));
++ uint16_t exp1[] = {1, 3, 5, 7};
++ uint16_t exp2[] = {2, 4, 6, 8};
++ uint16x4_t expect1 = vld1_u16 (exp1);
++ uint16x4_t expect2 = vld1_u16 (exp2);
+
+ for (i = 0; i < 4; i++)
++ if ((result.val[0][i] != expect1[i]) || (result.val[1][i] != expect2[i]))
++ abort ();
++
++ return 0;
++}
+--- a/src/gcc/testsuite/gcc.target/aarch64/simd/vtrnu8_1.c
++++ b/src/gcc/testsuite/gcc.target/aarch64/simd/vtrnu8_1.c
+@@ -0,0 +1,11 @@
++/* Test the `vtrn_u8' AArch64 SIMD intrinsic. */
++
++/* { dg-do run } */
++/* { dg-options "-save-temps -fno-inline" } */
++
++#include <arm_neon.h>
++#include "vtrnu8.x"
++
++/* { dg-final { scan-assembler-times "trn1\[ \t\]+v\[0-9\]+\.8b, ?v\[0-9\]+\.8b, ?v\[0-9\]+\.8b!?\(?:\[ \t\]+@\[a-zA-Z0-9 \]+\)?\n" 1 } } */
++/* { dg-final { scan-assembler-times "trn2\[ \t\]+v\[0-9\]+\.8b, ?v\[0-9\]+\.8b, ?v\[0-9\]+\.8b!?\(?:\[ \t\]+@\[a-zA-Z0-9 \]+\)?\n" 1 } } */
++/* { dg-final { cleanup-saved-temps } } */
+--- a/src/gcc/testsuite/gcc.target/aarch64/simd/vtrnp8.x
++++ b/src/gcc/testsuite/gcc.target/aarch64/simd/vtrnp8.x
+@@ -0,0 +1,27 @@
++extern void abort (void);
++
++poly8x8x2_t
++test_vtrnp8 (poly8x8_t _a, poly8x8_t _b)
++{
++ return vtrn_p8 (_a, _b);
++}
++
++int
++main (int argc, char **argv)
++{
++ int i;
++ poly8_t first[] = {1, 2, 3, 4, 5, 6, 7, 8};
++ poly8_t second[] = {9, 10, 11, 12, 13, 14, 15, 16};
++ poly8x8x2_t result = test_vtrnp8 (vld1_p8 (first), vld1_p8 (second));
++ poly8x8_t res1 = result.val[0], res2 = result.val[1];
++ poly8_t exp1[] = {1, 9, 3, 11, 5, 13, 7, 15};
++ poly8_t exp2[] = {2, 10, 4, 12, 6, 14, 8, 16};
++ poly8x8_t expected1 = vld1_p8 (exp1);
++ poly8x8_t expected2 = vld1_p8 (exp2);
++
++ for (i = 0; i < 8; i++)
+ if ((res1[i] != expected1[i]) || (res2[i] != expected2[i]))
+ abort ();
+
+ return 0;
+}
+--- a/src/gcc/testsuite/gcc.target/aarch64/simd/vrev32qs16.x
++++ b/src/gcc/testsuite/gcc.target/aarch64/simd/vrev32qs16.x
+@@ -0,0 +1,22 @@
++extern void abort (void);
++
++int16x8_t
++test_vrev32qs16 (int16x8_t _arg)
++{
++ return vrev32q_s16 (_arg);
++}
++
++int
++main (int argc, char **argv)
++{
++ int i;
++ int16x8_t inorder = {1, 2, 3, 4, 5, 6, 7, 8};
++ int16x8_t reversed = test_vrev32qs16 (inorder);
++ int16x8_t expected = {2, 1, 4, 3, 6, 5, 8, 7};
++
++ for (i = 0; i < 8; i++)
++ if (reversed[i] != expected[i])
++ abort ();
++ return 0;
++}
++
+--- a/src/gcc/testsuite/gcc.target/aarch64/simd/vrev64f32_1.c
++++ b/src/gcc/testsuite/gcc.target/aarch64/simd/vrev64f32_1.c
+@@ -0,0 +1,10 @@
++/* Test the `vrev64_f32' AArch64 SIMD intrinsic. */
++
++/* { dg-do run } */
++/* { dg-options "-save-temps -fno-inline" } */
++
++#include <arm_neon.h>
++#include "vrev64f32.x"
++
++/* { dg-final { scan-assembler-times "rev64\[ \t\]+v\[0-9\]+.2s, ?v\[0-9\]+.2s!?\(?:\[ \t\]+@\[a-zA-Z0-9 \]+\)?\n" 1 } } */
++/* { dg-final { cleanup-saved-temps } } */
--- a/src/gcc/testsuite/gcc.target/aarch64/simd/vzips8.x
+++ b/src/gcc/testsuite/gcc.target/aarch64/simd/vzips8.x
@@ -0,0 +1,27 @@
@@ -3499,45 +8875,79 @@ LANG=C svn diff svn://gcc.gnu.org/svn/gcc/branches/gcc-4_9-branch@211979 \
+
+ return 0;
+}
---- a/src/gcc/testsuite/gcc.target/aarch64/simd/vzipqu32.x
-+++ b/src/gcc/testsuite/gcc.target/aarch64/simd/vzipqu32.x
-@@ -0,0 +1,27 @@
+--- a/src/gcc/testsuite/gcc.target/aarch64/simd/extq_s32_1.c
++++ b/src/gcc/testsuite/gcc.target/aarch64/simd/extq_s32_1.c
+@@ -0,0 +1,10 @@
++/* Test the `vextQs32' AArch64 SIMD intrinsic. */
++
++/* { dg-do run } */
++/* { dg-options "-save-temps -O3 -fno-inline" } */
++
++#include "arm_neon.h"
++#include "extq_s32.x"
++
++/* { dg-final { scan-assembler-times "ext\[ \t\]+\[vV\]\[0-9\]+\.16\[bB\], ?\[vV\]\[0-9\]+\.16\[bB\], ?\[vV\]\[0-9\]+\.16\[bB\], ?#\[0-9\]+\(?:.4)?\(?:\[ \t\]+@\[a-zA-Z0-9 \]+\)?\n" 3 } } */
++/* { dg-final { cleanup-saved-temps } } */
+--- a/src/gcc/testsuite/gcc.target/aarch64/simd/vrev32qu16.x
++++ b/src/gcc/testsuite/gcc.target/aarch64/simd/vrev32qu16.x
+@@ -0,0 +1,22 @@
+extern void abort (void);
+
-+uint32x4x2_t
-+test_vzipqu32 (uint32x4_t _a, uint32x4_t _b)
++uint16x8_t
++test_vrev32qu16 (uint16x8_t _arg)
+{
-+ return vzipq_u32 (_a, _b);
++ return vrev32q_u16 (_arg);
+}
+
+int
+main (int argc, char **argv)
+{
+ int i;
-+ uint32_t first[] = {1, 2, 3, 4};
-+ uint32_t second[] = {5, 6, 7, 8};
-+ uint32x4x2_t result = test_vzipqu32 (vld1q_u32 (first), vld1q_u32 (second));
-+ uint32x4_t res1 = result.val[0], res2 = result.val[1];
-+ uint32_t exp1[] = {1, 5, 2, 6};
-+ uint32_t exp2[] = {3, 7, 4, 8};
-+ uint32x4_t expected1 = vld1q_u32 (exp1);
-+ uint32x4_t expected2 = vld1q_u32 (exp2);
++ uint16x8_t inorder = {1, 2, 3, 4, 5, 6, 7, 8};
++ uint16x8_t reversed = test_vrev32qu16 (inorder);
++ uint16x8_t expected = {2, 1, 4, 3, 6, 5, 8, 7};
+
-+ for (i = 0; i < 4; i++)
-+ if ((res1[i] != expected1[i]) || (res2[i] != expected2[i]))
++ for (i = 0; i < 8; i++)
++ if (reversed[i] != expected[i])
+ abort ();
-+
+ return 0;
+}
---- a/src/gcc/testsuite/gcc.target/aarch64/simd/vzipf32.x
-+++ b/src/gcc/testsuite/gcc.target/aarch64/simd/vzipf32.x
++
+--- a/src/gcc/testsuite/gcc.target/aarch64/simd/vrev64qu16_1.c
++++ b/src/gcc/testsuite/gcc.target/aarch64/simd/vrev64qu16_1.c
+@@ -0,0 +1,10 @@
++/* Test the `vrev64q_u16' AArch64 SIMD intrinsic. */
++
++/* { dg-do run } */
++/* { dg-options "-save-temps -fno-inline" } */
++
++#include <arm_neon.h>
++#include "vrev64qu16.x"
++
++/* { dg-final { scan-assembler-times "rev64\[ \t\]+v\[0-9\]+.8h, ?v\[0-9\]+.8h!?\(?:\[ \t\]+@\[a-zA-Z0-9 \]+\)?\n" 1 } } */
++/* { dg-final { cleanup-saved-temps } } */
+--- a/src/gcc/testsuite/gcc.target/aarch64/simd/vrev64u8_1.c
++++ b/src/gcc/testsuite/gcc.target/aarch64/simd/vrev64u8_1.c
+@@ -0,0 +1,10 @@
++/* Test the `vrev64_u8' AArch64 SIMD intrinsic. */
++
++/* { dg-do run } */
++/* { dg-options "-save-temps -fno-inline" } */
++
++#include <arm_neon.h>
++#include "vrev64u8.x"
++
++/* { dg-final { scan-assembler-times "rev64\[ \t\]+v\[0-9\]+.8b, ?v\[0-9\]+.8b!?\(?:\[ \t\]+@\[a-zA-Z0-9 \]+\)?\n" 1 } } */
++/* { dg-final { cleanup-saved-temps } } */
+--- a/src/gcc/testsuite/gcc.target/aarch64/simd/vtrnf32.x
++++ b/src/gcc/testsuite/gcc.target/aarch64/simd/vtrnf32.x
@@ -0,0 +1,27 @@
+extern void abort (void);
+
+float32x2x2_t
-+test_vzipf32 (float32x2_t _a, float32x2_t _b)
++test_vtrnf32 (float32x2_t _a, float32x2_t _b)
+{
-+ return vzip_f32 (_a, _b);
++ return vtrn_f32 (_a, _b);
+}
+
+int
@@ -3546,7 +8956,7 @@ LANG=C svn diff svn://gcc.gnu.org/svn/gcc/branches/gcc-4_9-branch@211979 \
+ int i;
+ float32_t first[] = {1, 2};
+ float32_t second[] = {3, 4};
-+ float32x2x2_t result = test_vzipf32 (vld1_f32 (first), vld1_f32 (second));
++ float32x2x2_t result = test_vtrnf32 (vld1_f32 (first), vld1_f32 (second));
+ float32x2_t res1 = result.val[0], res2 = result.val[1];
+ float32_t exp1[] = {1, 3};
+ float32_t exp2[] = {2, 4};
@@ -3559,29 +8969,721 @@ LANG=C svn diff svn://gcc.gnu.org/svn/gcc/branches/gcc-4_9-branch@211979 \
+
+ return 0;
+}
---- a/src/gcc/testsuite/gcc.target/aarch64/simd/vzipqs16.x
-+++ b/src/gcc/testsuite/gcc.target/aarch64/simd/vzipqs16.x
+--- a/src/gcc/testsuite/gcc.target/aarch64/simd/ext_s8_1.c
++++ b/src/gcc/testsuite/gcc.target/aarch64/simd/ext_s8_1.c
+@@ -0,0 +1,10 @@
++/* Test the `vexts8' AArch64 SIMD intrinsic. */
++
++/* { dg-do run } */
++/* { dg-options "-save-temps -O3 -fno-inline" } */
++
++#include "arm_neon.h"
++#include "ext_s8.x"
++
++/* { dg-final { scan-assembler-times "ext\[ \t\]+\[vV\]\[0-9\]+\.8\[bB\], ?\[vV\]\[0-9\]+\.8\[bB\], ?\[vV\]\[0-9\]+\.8\[bB\], ?#?\[0-9\]+\(?:\[ \t\]+@\[a-zA-Z0-9 \]+\)?\n" 7 } } */
++/* { dg-final { cleanup-saved-temps } } */
+--- a/src/gcc/testsuite/gcc.target/aarch64/simd/vrev16u8.x
++++ b/src/gcc/testsuite/gcc.target/aarch64/simd/vrev16u8.x
+@@ -0,0 +1,22 @@
++extern void abort (void);
++
++uint8x8_t
++test_vrev16u8 (uint8x8_t _arg)
++{
++ return vrev16_u8 (_arg);
++}
++
++int
++main (int argc, char **argv)
++{
++ int i;
++ uint8x8_t inorder = {1, 2, 3, 4, 5, 6, 7, 8};
++ uint8x8_t reversed = test_vrev16u8 (inorder);
++ uint8x8_t expected = {2, 1, 4, 3, 6, 5, 8, 7};
++
++ for (i = 0; i < 8; i++)
++ if (reversed[i] != expected[i])
++ abort ();
++ return 0;
++}
++
+--- a/src/gcc/testsuite/gcc.target/aarch64/simd/vuzpqs16_1.c
++++ b/src/gcc/testsuite/gcc.target/aarch64/simd/vuzpqs16_1.c
+@@ -0,0 +1,11 @@
++/* Test the `vuzpq_s16' AArch64 SIMD intrinsic. */
++
++/* { dg-do run } */
++/* { dg-options "-save-temps -fno-inline" } */
++
++#include <arm_neon.h>
++#include "vuzpqs16.x"
++
++/* { dg-final { scan-assembler-times "uzp1\[ \t\]+v\[0-9\]+\.8h, ?v\[0-9\]+\.8h, ?v\[0-9\]+\.8h!?\(?:\[ \t\]+@\[a-zA-Z0-9 \]+\)?\n" 1 } } */
++/* { dg-final { scan-assembler-times "uzp2\[ \t\]+v\[0-9\]+\.8h, ?v\[0-9\]+\.8h, ?v\[0-9\]+\.8h!?\(?:\[ \t\]+@\[a-zA-Z0-9 \]+\)?\n" 1 } } */
++/* { dg-final { cleanup-saved-temps } } */
+--- a/src/gcc/testsuite/gcc.target/aarch64/simd/extq_s64.x
++++ b/src/gcc/testsuite/gcc.target/aarch64/simd/extq_s64.x
+@@ -0,0 +1,30 @@
++extern void abort (void);
++
++int64x2_t
++test_vextq_s64_1 (int64x2_t a, int64x2_t b)
++{
++ return vextq_s64 (a, b, 1);
++}
++
++int
++main (int argc, char **argv)
++{
++ int i, off;
++ int64_t arr1[] = {0, 1};
++ int64x2_t in1 = vld1q_s64 (arr1);
++ int64_t arr2[] = {2, 3};
++ int64x2_t in2 = vld1q_s64 (arr2);
++ int64_t exp[2];
++ int64x2_t expected;
++ int64x2_t actual = test_vextq_s64_1 (in1, in2);
++
++ for (i = 0; i < 2; i++)
++ exp[i] = i + 1;
++ expected = vld1q_s64 (exp);
++ for (i = 0; i < 2; i++)
++ if (actual[i] != expected[i])
++ abort ();
++
++ return 0;
++}
++
+--- a/src/gcc/testsuite/gcc.target/aarch64/simd/vzipp16.x
++++ b/src/gcc/testsuite/gcc.target/aarch64/simd/vzipp16.x
@@ -0,0 +1,27 @@
+extern void abort (void);
+
-+int16x8x2_t
-+test_vzipqs16 (int16x8_t _a, int16x8_t _b)
++poly16x4x2_t
++test_vzipp16 (poly16x4_t _a, poly16x4_t _b)
+{
-+ return vzipq_s16 (_a, _b);
++ return vzip_p16 (_a, _b);
+}
+
+int
+main (int argc, char **argv)
+{
+ int i;
-+ int16_t first[] = {1, 2, 3, 4, 5, 6, 7, 8};
-+ int16_t second[] = {9, 10, 11, 12, 13, 14, 15, 16};
-+ int16x8x2_t result = test_vzipqs16 (vld1q_s16 (first), vld1q_s16 (second));
-+ int16x8_t res1 = result.val[0], res2 = result.val[1];
-+ int16_t exp1[] = {1, 9, 2, 10, 3, 11, 4, 12};
-+ int16_t exp2[] = {5, 13, 6, 14, 7, 15, 8, 16};
-+ int16x8_t expected1 = vld1q_s16 (exp1);
-+ int16x8_t expected2 = vld1q_s16 (exp2);
++ poly16_t first[] = {1, 2, 3, 4};
++ poly16_t second[] = {5, 6, 7, 8};
++ poly16x4x2_t result = test_vzipp16 (vld1_p16 (first), vld1_p16 (second));
++ poly16x4_t res1 = result.val[0], res2 = result.val[1];
++ poly16_t exp1[] = {1, 5, 2, 6};
++ poly16_t exp2[] = {3, 7, 4, 8};
++ poly16x4_t expected1 = vld1_p16 (exp1);
++ poly16x4_t expected2 = vld1_p16 (exp2);
++
++ for (i = 0; i < 4; i++)
++ if ((res1[i] != expected1[i]) || (res2[i] != expected2[i]))
++ abort ();
++
++ return 0;
++}
+--- a/src/gcc/testsuite/gcc.target/aarch64/simd/extq_u64.x
++++ b/src/gcc/testsuite/gcc.target/aarch64/simd/extq_u64.x
+@@ -0,0 +1,30 @@
++extern void abort (void);
++
++uint64x2_t
++test_vextq_u64_1 (uint64x2_t a, uint64x2_t b)
++{
++ return vextq_u64 (a, b, 1);
++}
++
++int
++main (int argc, char **argv)
++{
++ int i, off;
++ uint64_t arr1[] = {0, 1};
++ uint64x2_t in1 = vld1q_u64 (arr1);
++ uint64_t arr2[] = {2, 3};
++ uint64x2_t in2 = vld1q_u64 (arr2);
++ uint64_t exp[2];
++ uint64x2_t expected;
++ uint64x2_t actual = test_vextq_u64_1 (in1, in2);
++
++ for (i = 0; i < 2; i++)
++ exp[i] = i + 1;
++ expected = vld1q_u64 (exp);
++ for (i = 0; i < 2; i++)
++ if (actual[i] != expected[i])
++ abort ();
++
++ return 0;
++}
++
+--- a/src/gcc/testsuite/gcc.target/aarch64/simd/vrev32qu8_1.c
++++ b/src/gcc/testsuite/gcc.target/aarch64/simd/vrev32qu8_1.c
+@@ -0,0 +1,10 @@
++/* Test the `vrev32q_u8' AArch64 SIMD intrinsic. */
++
++/* { dg-do run } */
++/* { dg-options "-save-temps -fno-inline" } */
++
++#include <arm_neon.h>
++#include "vrev32qu8.x"
++
++/* { dg-final { scan-assembler-times "rev32\[ \t\]+v\[0-9\]+.16b, ?v\[0-9\]+.16b!?\(?:\[ \t\]+@\[a-zA-Z0-9 \]+\)?\n" 1 } } */
++/* { dg-final { cleanup-saved-temps } } */
+--- a/src/gcc/testsuite/gcc.target/aarch64/simd/vrev64u16_1.c
++++ b/src/gcc/testsuite/gcc.target/aarch64/simd/vrev64u16_1.c
+@@ -0,0 +1,10 @@
++/* Test the `vrev64_u16' AArch64 SIMD intrinsic. */
++
++/* { dg-do run } */
++/* { dg-options "-save-temps -fno-inline" } */
++
++#include <arm_neon.h>
++#include "vrev64u16.x"
++
++/* { dg-final { scan-assembler-times "rev64\[ \t\]+v\[0-9\]+.4h, ?v\[0-9\]+.4h!?\(?:\[ \t\]+@\[a-zA-Z0-9 \]+\)?\n" 1 } } */
++/* { dg-final { cleanup-saved-temps } } */
+--- a/src/gcc/testsuite/gcc.target/aarch64/simd/vzipqs8.x
++++ b/src/gcc/testsuite/gcc.target/aarch64/simd/vzipqs8.x
+@@ -0,0 +1,29 @@
++extern void abort (void);
++
++int8x16x2_t
++test_vzipqs8 (int8x16_t _a, int8x16_t _b)
++{
++ return vzipq_s8 (_a, _b);
++}
++
++int
++main (int argc, char **argv)
++{
++ int i;
++ int8_t first[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16};
++ int8_t second[] =
++ {17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32};
++ int8x16x2_t result = test_vzipqs8 (vld1q_s8 (first), vld1q_s8 (second));
++ int8x16_t res1 = result.val[0], res2 = result.val[1];
++ int8_t exp1[] = {1, 17, 2, 18, 3, 19, 4, 20, 5, 21, 6, 22, 7, 23, 8, 24};
++ int8_t exp2[] =
++ {9, 25, 10, 26, 11, 27, 12, 28, 13, 29, 14, 30, 15, 31, 16, 32};
++ int8x16_t expected1 = vld1q_s8 (exp1);
++ int8x16_t expected2 = vld1q_s8 (exp2);
++
++ for (i = 0; i < 16; i++)
++ if ((res1[i] != expected1[i]) || (res2[i] != expected2[i]))
++ abort ();
++
++ return 0;
++}
+--- a/src/gcc/testsuite/gcc.target/aarch64/simd/vtrnqu8.x
++++ b/src/gcc/testsuite/gcc.target/aarch64/simd/vtrnqu8.x
+@@ -0,0 +1,28 @@
++extern void abort (void);
++
++uint8x16x2_t
++test_vtrnqu8 (uint8x16_t _a, uint8x16_t _b)
++{
++ return vtrnq_u8 (_a, _b);
++}
++
++int
++main (int argc, char **argv)
++{
++ int i;
++ uint8_t first[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16};
++ uint8_t second[] =
++ {17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32};
++ uint8x16x2_t result = test_vtrnqu8 (vld1q_u8 (first), vld1q_u8 (second));
++ uint8x16_t res1 = result.val[0], res2 = result.val[1];
++ uint8_t exp1[] = {1, 17, 3, 19, 5, 21, 7, 23, 9, 25, 11, 27, 13, 29, 15, 31};
++ uint8_t exp2[] = {2, 18, 4, 20, 6, 22, 8, 24, 10, 26, 12, 28, 14, 30, 16, 32};
++ uint8x16_t expected1 = vld1q_u8 (exp1);
++ uint8x16_t expected2 = vld1q_u8 (exp2);
++
++ for (i = 0; i < 16; i++)
++ if ((res1[i] != expected1[i]) || (res2[i] != expected2[i]))
++ abort ();
++
++ return 0;
++}
+--- a/src/gcc/testsuite/gcc.target/aarch64/simd/ext_s32.x
++++ b/src/gcc/testsuite/gcc.target/aarch64/simd/ext_s32.x
+@@ -0,0 +1,30 @@
++extern void abort (void);
++
++int32x2_t
++test_vext_s32_1 (int32x2_t a, int32x2_t b)
++{
++ return vext_s32 (a, b, 1);
++}
++
++int
++main (int argc, char **argv)
++{
++ int i, off;
++ int32_t arr1[] = {0, 1};
++ int32x2_t in1 = vld1_s32 (arr1);
++ int32_t arr2[] = {2, 3};
++ int32x2_t in2 = vld1_s32 (arr2);
++ int32_t exp[2];
++ int32x2_t expected;
++ int32x2_t actual = test_vext_s32_1 (in1, in2);
++
++ for (i = 0; i < 2; i++)
++ exp[i] = i + 1;
++ expected = vld1_s32 (exp);
++ for (i = 0; i < 2; i++)
++ if (actual[i] != expected[i])
++ abort ();
++
++ return 0;
++}
++
+--- a/src/gcc/testsuite/gcc.target/aarch64/simd/vuzps16_1.c
++++ b/src/gcc/testsuite/gcc.target/aarch64/simd/vuzps16_1.c
+@@ -0,0 +1,11 @@
++/* Test the `vuzp_s16' AArch64 SIMD intrinsic. */
++
++/* { dg-do run } */
++/* { dg-options "-save-temps -fno-inline" } */
++
++#include <arm_neon.h>
++#include "vuzps16.x"
++
++/* { dg-final { scan-assembler-times "uzp1\[ \t\]+v\[0-9\]+\.4h, ?v\[0-9\]+\.4h, ?v\[0-9\]+\.4h!?\(?:\[ \t\]+@\[a-zA-Z0-9 \]+\)?\n" 1 } } */
++/* { dg-final { scan-assembler-times "uzp2\[ \t\]+v\[0-9\]+\.4h, ?v\[0-9\]+\.4h, ?v\[0-9\]+\.4h!?\(?:\[ \t\]+@\[a-zA-Z0-9 \]+\)?\n" 1 } } */
++/* { dg-final { cleanup-saved-temps } } */
+--- a/src/gcc/testsuite/gcc.target/aarch64/simd/ext_u32.x
++++ b/src/gcc/testsuite/gcc.target/aarch64/simd/ext_u32.x
+@@ -0,0 +1,30 @@
++extern void abort (void);
++
++uint32x2_t
++test_vext_u32_1 (uint32x2_t a, uint32x2_t b)
++{
++ return vext_u32 (a, b, 1);
++}
++
++int
++main (int argc, char **argv)
++{
++ int i, off;
++ uint32_t arr1[] = {0, 1};
++ uint32x2_t in1 = vld1_u32 (arr1);
++ uint32_t arr2[] = {2, 3};
++ uint32x2_t in2 = vld1_u32 (arr2);
++ uint32_t exp[2];
++ uint32x2_t expected;
++ uint32x2_t actual = test_vext_u32_1 (in1, in2);
++
++ for (i = 0; i < 2; i++)
++ exp[i] = i + 1;
++ expected = vld1_u32 (exp);
++ for (i = 0; i < 2; i++)
++ if (actual[i] != expected[i])
++ abort ();
++
++ return 0;
++}
++
+--- a/src/gcc/testsuite/gcc.target/aarch64/simd/vuzpqs8_1.c
++++ b/src/gcc/testsuite/gcc.target/aarch64/simd/vuzpqs8_1.c
+@@ -0,0 +1,11 @@
++/* Test the `vuzpq_s8' AArch64 SIMD intrinsic. */
++
++/* { dg-do run } */
++/* { dg-options "-save-temps -fno-inline" } */
++
++#include <arm_neon.h>
++#include "vuzpqs8.x"
++
++/* { dg-final { scan-assembler-times "uzp1\[ \t\]+v\[0-9\]+\.16b, ?v\[0-9\]+\.16b, ?v\[0-9\]+\.16b!?\(?:\[ \t\]+@\[a-zA-Z0-9 \]+\)?\n" 1 } } */
++/* { dg-final { scan-assembler-times "uzp2\[ \t\]+v\[0-9\]+\.16b, ?v\[0-9\]+\.16b, ?v\[0-9\]+\.16b!?\(?:\[ \t\]+@\[a-zA-Z0-9 \]+\)?\n" 1 } } */
++/* { dg-final { cleanup-saved-temps } } */
+--- a/src/gcc/testsuite/gcc.target/aarch64/simd/extq_s8.x
++++ b/src/gcc/testsuite/gcc.target/aarch64/simd/extq_s8.x
+@@ -0,0 +1,227 @@
++extern void abort (void);
++
++int8x16_t
++test_vextq_s8_1 (int8x16_t a, int8x16_t b)
++{
++ return vextq_s8 (a, b, 1);
++}
++
++int8x16_t
++test_vextq_s8_2 (int8x16_t a, int8x16_t b)
++{
++ return vextq_s8 (a, b, 2);
++}
++
++int8x16_t
++test_vextq_s8_3 (int8x16_t a, int8x16_t b)
++{
++ return vextq_s8 (a, b, 3);
++}
++
++int8x16_t
++test_vextq_s8_4 (int8x16_t a, int8x16_t b)
++{
++ return vextq_s8 (a, b, 4);
++}
++
++int8x16_t
++test_vextq_s8_5 (int8x16_t a, int8x16_t b)
++{
++ return vextq_s8 (a, b, 5);
++}
++
++int8x16_t
++test_vextq_s8_6 (int8x16_t a, int8x16_t b)
++{
++ return vextq_s8 (a, b, 6);
++}
++
++int8x16_t
++test_vextq_s8_7 (int8x16_t a, int8x16_t b)
++{
++ return vextq_s8 (a, b, 7);
++}
++
++int8x16_t
++test_vextq_s8_8 (int8x16_t a, int8x16_t b)
++{
++ return vextq_s8 (a, b, 8);
++}
++
++int8x16_t
++test_vextq_s8_9 (int8x16_t a, int8x16_t b)
++{
++ return vextq_s8 (a, b, 9);
++}
++
++int8x16_t
++test_vextq_s8_10 (int8x16_t a, int8x16_t b)
++{
++ return vextq_s8 (a, b, 10);
++}
++
++int8x16_t
++test_vextq_s8_11 (int8x16_t a, int8x16_t b)
++{
++ return vextq_s8 (a, b, 11);
++}
++
++int8x16_t
++test_vextq_s8_12 (int8x16_t a, int8x16_t b)
++{
++ return vextq_s8 (a, b, 12);
++}
++
++int8x16_t
++test_vextq_s8_13 (int8x16_t a, int8x16_t b)
++{
++ return vextq_s8 (a, b, 13);
++}
++
++int8x16_t
++test_vextq_s8_14 (int8x16_t a, int8x16_t b)
++{
++ return vextq_s8 (a, b, 14);
++}
++
++int8x16_t
++test_vextq_s8_15 (int8x16_t a, int8x16_t b)
++{
++ return vextq_s8 (a, b, 15);
++}
++
++int
++main (int argc, char **argv)
++{
++ int i;
++ int8_t arr1[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15};
++ int8x16_t in1 = vld1q_s8 (arr1);
++ int8_t arr2[] =
++ {16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31};
++ int8x16_t in2 = vld1q_s8 (arr2);
++ int8_t exp[16];
++ int8x16_t expected;
++ int8x16_t actual = test_vextq_s8_1 (in1, in2);
++
++ for (i = 0; i < 16; i++)
++ exp[i] = i + 1;
++ expected = vld1q_s8 (exp);
++ for (i = 0; i < 16; i++)
++ if (actual[i] != expected[i])
++ abort ();
++
++ actual = test_vextq_s8_2 (in1, in2);
++ for (i = 0; i < 16; i++)
++ exp[i] = i + 2;
++ expected = vld1q_s8 (exp);
++ for (i = 0; i < 16; i++)
++ if (actual[i] != expected[i])
++ abort ();
++
++ actual = test_vextq_s8_3 (in1, in2);
++ for (i = 0; i < 16; i++)
++ exp[i] = i + 3;
++ expected = vld1q_s8 (exp);
++ for (i = 0; i < 16; i++)
++ if (actual[i] != expected[i])
++ abort ();
++
++ actual = test_vextq_s8_4 (in1, in2);
++ for (i = 0; i < 16; i++)
++ exp[i] = i + 4;
++ expected = vld1q_s8 (exp);
++ for (i = 0; i < 16; i++)
++ if (actual[i] != expected[i])
++ abort ();
++
++ actual = test_vextq_s8_5 (in1, in2);
++ for (i = 0; i < 16; i++)
++ exp[i] = i + 5;
++ expected = vld1q_s8 (exp);
++ for (i = 0; i < 16; i++)
++ if (actual[i] != expected[i])
++ abort ();
++
++ actual = test_vextq_s8_6 (in1, in2);
++ for (i = 0; i < 16; i++)
++ exp[i] = i + 6;
++ expected = vld1q_s8 (exp);
++ for (i = 0; i < 16; i++)
++ if (actual[i] != expected[i])
++ abort ();
++
++ actual = test_vextq_s8_7 (in1, in2);
++ for (i = 0; i < 16; i++)
++ exp[i] = i + 7;
++ expected = vld1q_s8 (exp);
++ for (i = 0; i < 16; i++)
++ if (actual[i] != expected[i])
++ abort ();
++
++ actual = test_vextq_s8_8 (in1, in2);
++ for (i = 0; i < 16; i++)
++ exp[i] = i + 8;
++ expected = vld1q_s8 (exp);
++ for (i = 0; i < 16; i++)
++ if (actual[i] != expected[i])
++ abort ();
++
++ actual = test_vextq_s8_9 (in1, in2);
++ for (i = 0; i < 16; i++)
++ exp[i] = i + 9;
++ expected = vld1q_s8 (exp);
++ for (i = 0; i < 16; i++)
++ if (actual[i] != expected[i])
++ abort ();
++
++ actual = test_vextq_s8_10 (in1, in2);
++ for (i = 0; i < 16; i++)
++ exp[i] = i + 10;
++ expected = vld1q_s8 (exp);
++ for (i = 0; i < 16; i++)
++ if (actual[i] != expected[i])
++ abort ();
++
++ actual = test_vextq_s8_11 (in1, in2);
++ for (i = 0; i < 16; i++)
++ exp[i] = i + 11;
++ expected = vld1q_s8 (exp);
++ for (i = 0; i < 16; i++)
++ if (actual[i] != expected[i])
++ abort ();
++
++ actual = test_vextq_s8_12 (in1, in2);
++ for (i = 0; i < 16; i++)
++ exp[i] = i + 12;
++ expected = vld1q_s8 (exp);
++ for (i = 0; i < 16; i++)
++ if (actual[i] != expected[i])
++ abort ();
++
++ actual = test_vextq_s8_13 (in1, in2);
++ for (i = 0; i < 16; i++)
++ exp[i] = i + 13;
++ expected = vld1q_s8 (exp);
++ for (i = 0; i < 16; i++)
++ if (actual[i] != expected[i])
++ abort ();
++
++ actual = test_vextq_s8_14 (in1, in2);
++ for (i = 0; i < 16; i++)
++ exp[i] = i + 14;
++ expected = vld1q_s8 (exp);
++ for (i = 0; i < 16; i++)
++ if (actual[i] != expected[i])
++ abort ();
++
++ actual = test_vextq_s8_15 (in1, in2);
++ for (i = 0; i < 16; i++)
++ exp[i] = i + 15;
++ expected = vld1q_s8 (exp);
++ for (i = 0; i < 16; i++)
++ if (actual[i] != expected[i])
++ abort ();
++
++ return 0;
++}
++
+--- a/src/gcc/testsuite/gcc.target/aarch64/simd/extq_f64_1.c
++++ b/src/gcc/testsuite/gcc.target/aarch64/simd/extq_f64_1.c
+@@ -0,0 +1,36 @@
++/* Test the `vextq_f64' AArch64 SIMD intrinsic. */
++
++/* { dg-do run } */
++/* { dg-options "-save-temps -O3 -fno-inline" } */
++
++#include "arm_neon.h"
++extern void abort (void);
++#include <stdio.h>
++
++float64x2_t
++test_vextq_f64_1 (float64x2_t a, float64x2_t b)
++{
++ return vextq_f64 (a, b, 1);
++}
++
++int
++main (int argc, char **argv)
++{
++ int i, off;
++ float64_t arr1[] = {0, 1};
++ float64x2_t in1 = vld1q_f64 (arr1);
++ float64_t arr2[] = {2, 3};
++ float64x2_t in2 = vld1q_f64 (arr2);
++ float64_t exp[] = {1, 2};
++ float64x2_t expected = vld1q_f64 (exp);
++ float64x2_t actual = test_vextq_f64_1 (in1, in2);
++
++ for (i = 0; i < 2; i++)
++ if (actual[i] != expected[i])
++ abort ();
++
++ return 0;
++}
++
++/* { dg-final { scan-assembler-times "ext\[ \t\]+\[vV\]\[0-9\]+\.16\[bB\], ?\[vV\]\[0-9\]+\.16\[bB\], ?\[vV\]\[0-9\]+\.16\[bB\], ?#\[0-9\]+\(?:.8\)?\(?:\[ \t\]+@\[a-zA-Z0-9 \]+\)?\n" 1 } } */
++/* { dg-final { cleanup-saved-temps } } */
+--- a/src/gcc/testsuite/gcc.target/aarch64/simd/vrev32qs16_1.c
++++ b/src/gcc/testsuite/gcc.target/aarch64/simd/vrev32qs16_1.c
+@@ -0,0 +1,10 @@
++/* Test the `vrev32q_s16' AArch64 SIMD intrinsic. */
++
++/* { dg-do run } */
++/* { dg-options "-save-temps -fno-inline" } */
++
++#include <arm_neon.h>
++#include "vrev32qs16.x"
++
++/* { dg-final { scan-assembler-times "rev32\[ \t\]+v\[0-9\]+.8h, ?v\[0-9\]+.8h!?\(?:\[ \t\]+@\[a-zA-Z0-9 \]+\)?\n" 1 } } */
++/* { dg-final { cleanup-saved-temps } } */
+--- a/src/gcc/testsuite/gcc.target/aarch64/simd/vzipqs16_1.c
++++ b/src/gcc/testsuite/gcc.target/aarch64/simd/vzipqs16_1.c
+@@ -0,0 +1,11 @@
++/* Test the `vzipq_s16' AArch64 SIMD intrinsic. */
++
++/* { dg-do run } */
++/* { dg-options "-save-temps -fno-inline" } */
++
++#include <arm_neon.h>
++#include "vzipqs16.x"
++
++/* { dg-final { scan-assembler-times "zip1\[ \t\]+v\[0-9\]+\.8h, ?v\[0-9\]+\.8h, ?v\[0-9\]+\.8h!?\(?:\[ \t\]+@\[a-zA-Z0-9 \]+\)?\n" 1 } } */
++/* { dg-final { scan-assembler-times "zip2\[ \t\]+v\[0-9\]+\.8h, ?v\[0-9\]+\.8h, ?v\[0-9\]+\.8h!?\(?:\[ \t\]+@\[a-zA-Z0-9 \]+\)?\n" 1 } } */
++/* { dg-final { cleanup-saved-temps } } */
+--- a/src/gcc/testsuite/gcc.target/aarch64/simd/vzipf32_1.c
++++ b/src/gcc/testsuite/gcc.target/aarch64/simd/vzipf32_1.c
+@@ -0,0 +1,11 @@
++/* Test the `vzip_f32' AArch64 SIMD intrinsic. */
++
++/* { dg-do run } */
++/* { dg-options "-save-temps -fno-inline" } */
++
++#include <arm_neon.h>
++#include "vzipf32.x"
++
++/* { dg-final { scan-assembler-times "zip1\[ \t\]+v\[0-9\]+\.2s, ?v\[0-9\]+\.2s, ?v\[0-9\]+\.2s!?\(?:\[ \t\]+@\[a-zA-Z0-9 \]+\)?\n" 1 } } */
++/* { dg-final { scan-assembler-times "zip2\[ \t\]+v\[0-9\]+\.2s, ?v\[0-9\]+\.2s, ?v\[0-9\]+\.2s!?\(?:\[ \t\]+@\[a-zA-Z0-9 \]+\)?\n" 1 } } */
++/* { dg-final { cleanup-saved-temps } } */
+--- a/src/gcc/testsuite/gcc.target/aarch64/simd/vrev16u8_1.c
++++ b/src/gcc/testsuite/gcc.target/aarch64/simd/vrev16u8_1.c
+@@ -0,0 +1,10 @@
++/* Test the `vrev16_u8' AArch64 SIMD intrinsic. */
++
++/* { dg-do run } */
++/* { dg-options "-save-temps -fno-inline" } */
++
++#include <arm_neon.h>
++#include "vrev16u8.x"
++
++/* { dg-final { scan-assembler-times "rev16\[ \t\]+v\[0-9\]+.8b, ?v\[0-9\]+.8b!?\(?:\[ \t\]+@\[a-zA-Z0-9 \]+\)?\n" 1 } } */
++/* { dg-final { cleanup-saved-temps } } */
+--- a/src/gcc/testsuite/gcc.target/aarch64/simd/vrev16p8.x
++++ b/src/gcc/testsuite/gcc.target/aarch64/simd/vrev16p8.x
+@@ -0,0 +1,22 @@
++extern void abort (void);
++
++poly8x8_t
++test_vrev16p8 (poly8x8_t _arg)
++{
++ return vrev16_p8 (_arg);
++}
++
++int
++main (int argc, char **argv)
++{
++ int i;
++ poly8x8_t inorder = {1, 2, 3, 4, 5, 6, 7, 8};
++ poly8x8_t reversed = test_vrev16p8 (inorder);
++ poly8x8_t expected = {2, 1, 4, 3, 6, 5, 8, 7};
++
++ for (i = 0; i < 8; i++)
++ if (reversed[i] != expected[i])
++ abort ();
++ return 0;
++}
++
+--- a/src/gcc/testsuite/gcc.target/aarch64/simd/ext_p8_1.c
++++ b/src/gcc/testsuite/gcc.target/aarch64/simd/ext_p8_1.c
+@@ -0,0 +1,10 @@
++/* Test the `vextp8' AArch64 SIMD intrinsic. */
++
++/* { dg-do run } */
++/* { dg-options "-save-temps -O3 -fno-inline" } */
++
++#include "arm_neon.h"
++#include "ext_p8.x"
++
++/* { dg-final { scan-assembler-times "ext\[ \t\]+\[vV\]\[0-9\]+\.8\[bB\], ?\[vV\]\[0-9\]+\.8\[bB\], ?\[vV\]\[0-9\]+\.8\[bB\], ?#?\[0-9\]+\(?:\[ \t\]+@\[a-zA-Z0-9 \]+\)?\n" 7 } } */
++/* { dg-final { cleanup-saved-temps } } */
+--- a/src/gcc/testsuite/gcc.target/aarch64/simd/vtrns8.x
++++ b/src/gcc/testsuite/gcc.target/aarch64/simd/vtrns8.x
+@@ -0,0 +1,27 @@
++extern void abort (void);
++
++int8x8x2_t
++test_vtrns8 (int8x8_t _a, int8x8_t _b)
++{
++ return vtrn_s8 (_a, _b);
++}
++
++int
++main (int argc, char **argv)
++{
++ int i;
++ int8_t first[] = {1, 2, 3, 4, 5, 6, 7, 8};
++ int8_t second[] = {9, 10, 11, 12, 13, 14, 15, 16};
++ int8x8x2_t result = test_vtrns8 (vld1_s8 (first), vld1_s8 (second));
++ int8x8_t res1 = result.val[0], res2 = result.val[1];
++ int8_t exp1[] = {1, 9, 3, 11, 5, 13, 7, 15};
++ int8_t exp2[] = {2, 10, 4, 12, 6, 14, 8, 16};
++ int8x8_t expected1 = vld1_s8 (exp1);
++ int8x8_t expected2 = vld1_s8 (exp2);
+
+ for (i = 0; i < 8; i++)
+ if ((res1[i] != expected1[i]) || (res2[i] != expected2[i]))
@@ -3589,29 +9691,29 @@ LANG=C svn diff svn://gcc.gnu.org/svn/gcc/branches/gcc-4_9-branch@211979 \
+
+ return 0;
+}
---- a/src/gcc/testsuite/gcc.target/aarch64/simd/vzipu8.x
-+++ b/src/gcc/testsuite/gcc.target/aarch64/simd/vzipu8.x
+--- a/src/gcc/testsuite/gcc.target/aarch64/simd/vtrnqs16.x
++++ b/src/gcc/testsuite/gcc.target/aarch64/simd/vtrnqs16.x
@@ -0,0 +1,27 @@
+extern void abort (void);
+
-+uint8x8x2_t
-+test_vzipu8 (uint8x8_t _a, uint8x8_t _b)
++int16x8x2_t
++test_vtrnqs16 (int16x8_t _a, int16x8_t _b)
+{
-+ return vzip_u8 (_a, _b);
++ return vtrnq_s16 (_a, _b);
+}
+
+int
+main (int argc, char **argv)
+{
+ int i;
-+ uint8_t first[] = {1, 2, 3, 4, 5, 6, 7, 8};
-+ uint8_t second[] = {9, 10, 11, 12, 13, 14, 15, 16};
-+ uint8x8x2_t result = test_vzipu8 (vld1_u8 (first), vld1_u8 (second));
-+ uint8x8_t res1 = result.val[0], res2 = result.val[1];
-+ uint8_t exp1[] = {1, 9, 2, 10, 3, 11, 4, 12};
-+ uint8_t exp2[] = {5, 13, 6, 14, 7, 15, 8, 16};
-+ uint8x8_t expected1 = vld1_u8 (exp1);
-+ uint8x8_t expected2 = vld1_u8 (exp2);
++ int16_t first[] = {1, 2, 3, 4, 5, 6, 7, 8};
++ int16_t second[] = {9, 10, 11, 12, 13, 14, 15, 16};
++ int16x8x2_t result = test_vtrnqs16 (vld1q_s16 (first), vld1q_s16 (second));
++ int16x8_t res1 = result.val[0], res2 = result.val[1];
++ int16_t exp1[] = {1, 9, 3, 11, 5, 13, 7, 15};
++ int16_t exp2[] = {2, 10, 4, 12, 6, 14, 8, 16};
++ int16x8_t expected1 = vld1q_s16 (exp1);
++ int16x8_t expected2 = vld1q_s16 (exp2);
+
+ for (i = 0; i < 8; i++)
+ if ((res1[i] != expected1[i]) || (res2[i] != expected2[i]))
@@ -3619,15 +9721,15 @@ LANG=C svn diff svn://gcc.gnu.org/svn/gcc/branches/gcc-4_9-branch@211979 \
+
+ return 0;
+}
---- a/src/gcc/testsuite/gcc.target/aarch64/simd/vzipqu16.x
-+++ b/src/gcc/testsuite/gcc.target/aarch64/simd/vzipqu16.x
+--- a/src/gcc/testsuite/gcc.target/aarch64/simd/vtrnqu16.x
++++ b/src/gcc/testsuite/gcc.target/aarch64/simd/vtrnqu16.x
@@ -0,0 +1,27 @@
+extern void abort (void);
+
+uint16x8x2_t
-+test_vzipqu16 (uint16x8_t _a, uint16x8_t _b)
++test_vtrnqu16 (uint16x8_t _a, uint16x8_t _b)
+{
-+ return vzipq_u16 (_a, _b);
++ return vtrnq_u16 (_a, _b);
+}
+
+int
@@ -3636,10 +9738,10 @@ LANG=C svn diff svn://gcc.gnu.org/svn/gcc/branches/gcc-4_9-branch@211979 \
+ int i;
+ uint16_t first[] = {1, 2, 3, 4, 5, 6, 7, 8};
+ uint16_t second[] = {9, 10, 11, 12, 13, 14, 15, 16};
-+ uint16x8x2_t result = test_vzipqu16 (vld1q_u16 (first), vld1q_u16 (second));
++ uint16x8x2_t result = test_vtrnqu16 (vld1q_u16 (first), vld1q_u16 (second));
+ uint16x8_t res1 = result.val[0], res2 = result.val[1];
-+ uint16_t exp1[] = {1, 9, 2, 10, 3, 11, 4, 12};
-+ uint16_t exp2[] = {5, 13, 6, 14, 7, 15, 8, 16};
++ uint16_t exp1[] = {1, 9, 3, 11, 5, 13, 7, 15};
++ uint16_t exp2[] = {2, 10, 4, 12, 6, 14, 8, 16};
+ uint16x8_t expected1 = vld1q_u16 (exp1);
+ uint16x8_t expected2 = vld1q_u16 (exp2);
+
@@ -3649,43 +9751,761 @@ LANG=C svn diff svn://gcc.gnu.org/svn/gcc/branches/gcc-4_9-branch@211979 \
+
+ return 0;
+}
---- a/src/gcc/testsuite/gcc.target/aarch64/simd/vzipqp8_1.c
-+++ b/src/gcc/testsuite/gcc.target/aarch64/simd/vzipqp8_1.c
+--- a/src/gcc/testsuite/gcc.target/aarch64/simd/extq_p16.x
++++ b/src/gcc/testsuite/gcc.target/aarch64/simd/extq_p16.x
+@@ -0,0 +1,114 @@
++extern void abort (void);
++
++poly16x8_t
++test_vextq_p16_1 (poly16x8_t a, poly16x8_t b)
++{
++ return vextq_p16 (a, b, 1);
++}
++
++poly16x8_t
++test_vextq_p16_2 (poly16x8_t a, poly16x8_t b)
++{
++ return vextq_p16 (a, b, 2);
++}
++
++poly16x8_t
++test_vextq_p16_3 (poly16x8_t a, poly16x8_t b)
++{
++ return vextq_p16 (a, b, 3);
++}
++
++poly16x8_t
++test_vextq_p16_4 (poly16x8_t a, poly16x8_t b)
++{
++ return vextq_p16 (a, b, 4);
++}
++
++poly16x8_t
++test_vextq_p16_5 (poly16x8_t a, poly16x8_t b)
++{
++ return vextq_p16 (a, b, 5);
++}
++
++poly16x8_t
++test_vextq_p16_6 (poly16x8_t a, poly16x8_t b)
++{
++ return vextq_p16 (a, b, 6);
++}
++
++poly16x8_t
++test_vextq_p16_7 (poly16x8_t a, poly16x8_t b)
++{
++ return vextq_p16 (a, b, 7);
++}
++
++int
++main (int argc, char **argv)
++{
++ int i, off;
++ poly16_t arr1[] = {0, 1, 2, 3, 4, 5, 6, 7};
++ poly16x8_t in1 = vld1q_p16 (arr1);
++ poly16_t arr2[] = {8, 9, 10, 11, 12, 13, 14, 15};
++ poly16x8_t in2 = vld1q_p16 (arr2);
++ poly16_t exp[8];
++ poly16x8_t expected;
++ poly16x8_t actual = test_vextq_p16_1 (in1, in2);
++
++ for (i = 0; i < 8; i++)
++ exp[i] = i + 1;
++ expected = vld1q_p16 (exp);
++ for (i = 0; i < 8; i++)
++ if (actual[i] != expected[i])
++ abort ();
++
++ actual = test_vextq_p16_2 (in1, in2);
++ for (i = 0; i < 8; i++)
++ exp[i] = i + 2;
++ expected = vld1q_p16 (exp);
++ for (i = 0; i < 8; i++)
++ if (actual[i] != expected[i])
++ abort ();
++
++ actual = test_vextq_p16_3 (in1, in2);
++ for (i = 0; i < 8; i++)
++ exp[i] = i + 3;
++ expected = vld1q_p16 (exp);
++ for (i = 0; i < 8; i++)
++ if (actual[i] != expected[i])
++ abort ();
++
++ actual = test_vextq_p16_4 (in1, in2);
++ for (i = 0; i < 8; i++)
++ exp[i] = i + 4;
++ expected = vld1q_p16 (exp);
++ for (i = 0; i < 8; i++)
++ if (actual[i] != expected[i])
++ abort ();
++
++ actual = test_vextq_p16_5 (in1, in2);
++ for (i = 0; i < 8; i++)
++ exp[i] = i + 5;
++ expected = vld1q_p16 (exp);
++ for (i = 0; i < 8; i++)
++ if (actual[i] != expected[i])
++ abort ();
++
++ actual = test_vextq_p16_6 (in1, in2);
++ for (i = 0; i < 8; i++)
++ exp[i] = i + 6;
++ expected = vld1q_p16 (exp);
++ for (i = 0; i < 8; i++)
++ if (actual[i] != expected[i])
++ abort ();
++
++ actual = test_vextq_p16_7 (in1, in2);
++ for (i = 0; i < 8; i++)
++ exp[i] = i + 7;
++ expected = vld1q_p16 (exp);
++ for (i = 0; i < 8; i++)
++ if (actual[i] != expected[i])
++ abort ();
++
++ return 0;
++}
++
+--- a/src/gcc/testsuite/gcc.target/aarch64/simd/vrev64qs16.x
++++ b/src/gcc/testsuite/gcc.target/aarch64/simd/vrev64qs16.x
+@@ -0,0 +1,22 @@
++extern void abort (void);
++
++int16x8_t
++test_vrev64qs16 (int16x8_t _arg)
++{
++ return vrev64q_s16 (_arg);
++}
++
++int
++main (int argc, char **argv)
++{
++ int i;
++ int16x8_t inorder = {1, 2, 3, 4, 5, 6, 7, 8};
++ int16x8_t reversed = test_vrev64qs16 (inorder);
++ int16x8_t expected = {4, 3, 2, 1, 8, 7, 6, 5};
++
++ for (i = 0; i < 8; i++)
++ if (reversed[i] != expected[i])
++ abort ();
++ return 0;
++}
++
+--- a/src/gcc/testsuite/gcc.target/aarch64/simd/vrev64qu16.x
++++ b/src/gcc/testsuite/gcc.target/aarch64/simd/vrev64qu16.x
+@@ -0,0 +1,22 @@
++extern void abort (void);
++
++uint16x8_t
++test_vrev64qu16 (uint16x8_t _arg)
++{
++ return vrev64q_u16 (_arg);
++}
++
++int
++main (int argc, char **argv)
++{
++ int i;
++ uint16x8_t inorder = {1, 2, 3, 4, 5, 6, 7, 8};
++ uint16x8_t reversed = test_vrev64qu16 (inorder);
++ uint16x8_t expected = {4, 3, 2, 1, 8, 7, 6, 5};
++
++ for (i = 0; i < 8; i++)
++ if (reversed[i] != expected[i])
++ abort ();
++ return 0;
++}
++
+--- a/src/gcc/testsuite/gcc.target/aarch64/simd/vrev64u8.x
++++ b/src/gcc/testsuite/gcc.target/aarch64/simd/vrev64u8.x
+@@ -0,0 +1,22 @@
++extern void abort (void);
++
++uint8x8_t
++test_vrev64u8 (uint8x8_t _arg)
++{
++ return vrev64_u8 (_arg);
++}
++
++int
++main (int argc, char **argv)
++{
++ int i;
++ uint8x8_t inorder = {1, 2, 3, 4, 5, 6, 7, 8};
++ uint8x8_t reversed = test_vrev64u8 (inorder);
++ uint8x8_t expected = {8, 7, 6, 5, 4, 3, 2, 1};
++
++ for (i = 0; i < 8; i++)
++ if (reversed[i] != expected[i])
++ abort ();
++ return 0;
++}
++
+--- a/src/gcc/testsuite/gcc.target/aarch64/simd/vuzpqp16.x
++++ b/src/gcc/testsuite/gcc.target/aarch64/simd/vuzpqp16.x
+@@ -0,0 +1,26 @@
++extern void abort (void);
++
++poly16x8x2_t
++test_vuzpqp16 (poly16x8_t _a, poly16x8_t _b)
++{
++ return vuzpq_p16 (_a, _b);
++}
++
++int
++main (int argc, char **argv)
++{
++ int i;
++ poly16_t first[] = {1, 2, 3, 4, 5, 6, 7, 8};
++ poly16_t second[] = {9, 10, 11, 12, 13, 14, 15, 16};
++ poly16x8x2_t result = test_vuzpqp16 (vld1q_p16 (first), vld1q_p16 (second));
++ poly16_t exp1[] = {1, 3, 5, 7, 9, 11, 13, 15};
++ poly16_t exp2[] = {2, 4, 6, 8, 10, 12, 14, 16};
++ poly16x8_t expect1 = vld1q_p16 (exp1);
++ poly16x8_t expect2 = vld1q_p16 (exp2);
++
++ for (i = 0; i < 8; i++)
++ if ((result.val[0][i] != expect1[i]) || (result.val[1][i] != expect2[i]))
++ abort ();
++
++ return 0;
++}
+--- a/src/gcc/testsuite/gcc.target/aarch64/simd/vtrns16_1.c
++++ b/src/gcc/testsuite/gcc.target/aarch64/simd/vtrns16_1.c
@@ -0,0 +1,11 @@
-+/* Test the `vzipq_p8' AArch64 SIMD intrinsic. */
++/* Test the `vtrn_s16' AArch64 SIMD intrinsic. */
+
+/* { dg-do run } */
+/* { dg-options "-save-temps -fno-inline" } */
+
+#include <arm_neon.h>
-+#include "vzipqp8.x"
++#include "vtrns16.x"
+
-+/* { dg-final { scan-assembler-times "zip1\[ \t\]+v\[0-9\]+\.16b, ?v\[0-9\]+\.16b, ?v\[0-9\]+\.16b!?\(?:\[ \t\]+@\[a-zA-Z0-9 \]+\)?\n" 1 } } */
-+/* { dg-final { scan-assembler-times "zip2\[ \t\]+v\[0-9\]+\.16b, ?v\[0-9\]+\.16b, ?v\[0-9\]+\.16b!?\(?:\[ \t\]+@\[a-zA-Z0-9 \]+\)?\n" 1 } } */
++/* { dg-final { scan-assembler-times "trn1\[ \t\]+v\[0-9\]+\.4h, ?v\[0-9\]+\.4h, ?v\[0-9\]+\.4h!?\(?:\[ \t\]+@\[a-zA-Z0-9 \]+\)?\n" 1 } } */
++/* { dg-final { scan-assembler-times "trn2\[ \t\]+v\[0-9\]+\.4h, ?v\[0-9\]+\.4h, ?v\[0-9\]+\.4h!?\(?:\[ \t\]+@\[a-zA-Z0-9 \]+\)?\n" 1 } } */
+/* { dg-final { cleanup-saved-temps } } */
---- a/src/gcc/testsuite/gcc.target/aarch64/simd/vzipqf32_1.c
-+++ b/src/gcc/testsuite/gcc.target/aarch64/simd/vzipqf32_1.c
+--- a/src/gcc/testsuite/gcc.target/aarch64/simd/vzipu16_1.c
++++ b/src/gcc/testsuite/gcc.target/aarch64/simd/vzipu16_1.c
@@ -0,0 +1,11 @@
-+/* Test the `vzipq_f32' AArch64 SIMD intrinsic. */
++/* Test the `vzip_u16' AArch64 SIMD intrinsic. */
+
+/* { dg-do run } */
+/* { dg-options "-save-temps -fno-inline" } */
+
+#include <arm_neon.h>
-+#include "vzipqf32.x"
++#include "vzipu16.x"
+
-+/* { dg-final { scan-assembler-times "zip1\[ \t\]+v\[0-9\]+\.4s, ?v\[0-9\]+\.4s, ?v\[0-9\]+\.4s!?\(?:\[ \t\]+@\[a-zA-Z0-9 \]+\)?\n" 1 } } */
-+/* { dg-final { scan-assembler-times "zip2\[ \t\]+v\[0-9\]+\.4s, ?v\[0-9\]+\.4s, ?v\[0-9\]+\.4s!?\(?:\[ \t\]+@\[a-zA-Z0-9 \]+\)?\n" 1 } } */
++/* { dg-final { scan-assembler-times "zip1\[ \t\]+v\[0-9\]+\.4h, ?v\[0-9\]+\.4h, ?v\[0-9\]+\.4h!?\(?:\[ \t\]+@\[a-zA-Z0-9 \]+\)?\n" 1 } } */
++/* { dg-final { scan-assembler-times "zip2\[ \t\]+v\[0-9\]+\.4h, ?v\[0-9\]+\.4h, ?v\[0-9\]+\.4h!?\(?:\[ \t\]+@\[a-zA-Z0-9 \]+\)?\n" 1 } } */
+/* { dg-final { cleanup-saved-temps } } */
---- a/src/gcc/testsuite/gcc.target/aarch64/simd/vzipp16.x
-+++ b/src/gcc/testsuite/gcc.target/aarch64/simd/vzipp16.x
+--- a/src/gcc/testsuite/gcc.target/aarch64/simd/vuzpf32.x
++++ b/src/gcc/testsuite/gcc.target/aarch64/simd/vuzpf32.x
+@@ -0,0 +1,26 @@
++extern void abort (void);
++
++float32x2x2_t
++test_vuzpf32 (float32x2_t _a, float32x2_t _b)
++{
++ return vuzp_f32 (_a, _b);
++}
++
++int
++main (int argc, char **argv)
++{
++ int i;
++ float32_t first[] = {1, 2};
++ float32_t second[] = {3, 4};
++ float32x2x2_t result = test_vuzpf32 (vld1_f32 (first), vld1_f32 (second));
++ float32_t exp1[] = {1, 3};
++ float32_t exp2[] = {2, 4};
++ float32x2_t expect1 = vld1_f32 (exp1);
++ float32x2_t expect2 = vld1_f32 (exp2);
++
++ for (i = 0; i < 2; i++)
++ if ((result.val[0][i] != expect1[i]) || (result.val[1][i] != expect2[i]))
++ abort ();
++
++ return 0;
++}
+--- a/src/gcc/testsuite/gcc.target/aarch64/simd/vtrnqs8_1.c
++++ b/src/gcc/testsuite/gcc.target/aarch64/simd/vtrnqs8_1.c
+@@ -0,0 +1,11 @@
++/* Test the `vtrnq_s8' AArch64 SIMD intrinsic. */
++
++/* { dg-do run } */
++/* { dg-options "-save-temps -fno-inline" } */
++
++#include <arm_neon.h>
++#include "vtrnqs8.x"
++
++/* { dg-final { scan-assembler-times "trn1\[ \t\]+v\[0-9\]+\.16b, ?v\[0-9\]+\.16b, ?v\[0-9\]+\.16b!?\(?:\[ \t\]+@\[a-zA-Z0-9 \]+\)?\n" 1 } } */
++/* { dg-final { scan-assembler-times "trn2\[ \t\]+v\[0-9\]+\.16b, ?v\[0-9\]+\.16b, ?v\[0-9\]+\.16b!?\(?:\[ \t\]+@\[a-zA-Z0-9 \]+\)?\n" 1 } } */
++/* { dg-final { cleanup-saved-temps } } */
+--- a/src/gcc/testsuite/gcc.target/aarch64/simd/vtrnqf32_1.c
++++ b/src/gcc/testsuite/gcc.target/aarch64/simd/vtrnqf32_1.c
+@@ -0,0 +1,11 @@
++/* Test the `vtrnq_f32' AArch64 SIMD intrinsic. */
++
++/* { dg-do run } */
++/* { dg-options "-save-temps -fno-inline" } */
++
++#include <arm_neon.h>
++#include "vtrnqf32.x"
++
++/* { dg-final { scan-assembler-times "trn1\[ \t\]+v\[0-9\]+\.4s, ?v\[0-9\]+\.4s, ?v\[0-9\]+\.4s!?\(?:\[ \t\]+@\[a-zA-Z0-9 \]+\)?\n" 1 } } */
++/* { dg-final { scan-assembler-times "trn2\[ \t\]+v\[0-9\]+\.4s, ?v\[0-9\]+\.4s, ?v\[0-9\]+\.4s!?\(?:\[ \t\]+@\[a-zA-Z0-9 \]+\)?\n" 1 } } */
++/* { dg-final { cleanup-saved-temps } } */
+--- a/src/gcc/testsuite/gcc.target/aarch64/simd/vtrnqp8.x
++++ b/src/gcc/testsuite/gcc.target/aarch64/simd/vtrnqp8.x
+@@ -0,0 +1,28 @@
++extern void abort (void);
++
++poly8x16x2_t
++test_vtrnqp8 (poly8x16_t _a, poly8x16_t _b)
++{
++ return vtrnq_p8 (_a, _b);
++}
++
++int
++main (int argc, char **argv)
++{
++ int i;
++ poly8_t first[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16};
++ poly8_t second[] =
++ {17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32};
++ poly8x16x2_t result = test_vtrnqp8 (vld1q_p8 (first), vld1q_p8 (second));
++ poly8x16_t res1 = result.val[0], res2 = result.val[1];
++ poly8_t exp1[] = {1, 17, 3, 19, 5, 21, 7, 23, 9, 25, 11, 27, 13, 29, 15, 31};
++ poly8_t exp2[] = {2, 18, 4, 20, 6, 22, 8, 24, 10, 26, 12, 28, 14, 30, 16, 32};
++ poly8x16_t expected1 = vld1q_p8 (exp1);
++ poly8x16_t expected2 = vld1q_p8 (exp2);
++
++ for (i = 0; i < 16; i++)
++ if ((res1[i] != expected1[i]) || (res2[i] != expected2[i]))
++ abort ();
++
++ return 0;
++}
+--- a/src/gcc/testsuite/gcc.target/aarch64/simd/vrev64s32.x
++++ b/src/gcc/testsuite/gcc.target/aarch64/simd/vrev64s32.x
+@@ -0,0 +1,22 @@
++extern void abort (void);
++
++int32x2_t
++test_vrev64s32 (int32x2_t _arg)
++{
++ return vrev64_s32 (_arg);
++}
++
++int
++main (int argc, char **argv)
++{
++ int i;
++ int32x2_t inorder = {1, 2};
++ int32x2_t reversed = test_vrev64s32 (inorder);
++ int32x2_t expected = {2, 1};
++
++ for (i = 0; i < 2; i++)
++ if (reversed[i] != expected[i])
++ abort ();
++ return 0;
++}
++
+--- a/src/gcc/testsuite/gcc.target/aarch64/simd/ext_s16_1.c
++++ b/src/gcc/testsuite/gcc.target/aarch64/simd/ext_s16_1.c
+@@ -0,0 +1,10 @@
++/* Test the `vexts16' AArch64 SIMD intrinsic. */
++
++/* { dg-do run } */
++/* { dg-options "-save-temps -O3 -fno-inline" } */
++
++#include "arm_neon.h"
++#include "ext_s16.x"
++
++/* { dg-final { scan-assembler-times "ext\[ \t\]+\[vV\]\[0-9\]+\.8\[bB\], ?\[vV\]\[0-9\]+\.8\[bB\], ?\[vV\]\[0-9\]+\.8\[bB\], ?#\[0-9\]+\(?:.2\)?\(?:\[ \t\]+@\[a-zA-Z0-9 \]+\)?\n" 3 } } */
++/* { dg-final { cleanup-saved-temps } } */
+--- a/src/gcc/testsuite/gcc.target/aarch64/simd/vrev32qu8.x
++++ b/src/gcc/testsuite/gcc.target/aarch64/simd/vrev32qu8.x
+@@ -0,0 +1,22 @@
++extern void abort (void);
++
++uint8x16_t
++test_vrev32qu8 (uint8x16_t _arg)
++{
++ return vrev32q_u8 (_arg);
++}
++
++int
++main (int argc, char **argv)
++{
++ int i;
++ uint8x16_t inorder = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16};
++ uint8x16_t reversed = test_vrev32qu8 (inorder);
++ uint8x16_t expected = {4, 3, 2, 1, 8, 7, 6, 5, 12, 11, 10, 9, 16, 15, 14, 13};
++
++ for (i = 0; i < 16; i++)
++ if (reversed[i] != expected[i])
++ abort ();
++ return 0;
++}
++
+--- a/src/gcc/testsuite/gcc.target/aarch64/simd/vrev64u32.x
++++ b/src/gcc/testsuite/gcc.target/aarch64/simd/vrev64u32.x
+@@ -0,0 +1,22 @@
++extern void abort (void);
++
++uint32x2_t
++test_vrev64u32 (uint32x2_t _arg)
++{
++ return vrev64_u32 (_arg);
++}
++
++int
++main (int argc, char **argv)
++{
++ int i;
++ uint32x2_t inorder = {1, 2};
++ uint32x2_t reversed = test_vrev64u32 (inorder);
++ uint32x2_t expected = {2, 1};
++
++ for (i = 0; i < 2; i++)
++ if (reversed[i] != expected[i])
++ abort ();
++ return 0;
++}
++
+--- a/src/gcc/testsuite/gcc.target/aarch64/simd/extq_f32_1.c
++++ b/src/gcc/testsuite/gcc.target/aarch64/simd/extq_f32_1.c
+@@ -0,0 +1,10 @@
++/* Test the `vextQf32' AArch64 SIMD intrinsic. */
++
++/* { dg-do run } */
++/* { dg-options "-save-temps -O3 -fno-inline" } */
++
++#include "arm_neon.h"
++#include "extq_f32.x"
++
++/* { dg-final { scan-assembler-times "ext\[ \t\]+\[vV\]\[0-9\]+\.16\[bB\], ?\[vV\]\[0-9\]+\.16\[bB\], ?\[vV\]\[0-9\]+\.16\[bB\], ?#\[0-9\]+\(?:.4)?\(?:\[ \t\]+@\[a-zA-Z0-9 \]+\)?\n" 3 } } */
++/* { dg-final { cleanup-saved-temps } } */
+--- a/src/gcc/testsuite/gcc.target/aarch64/simd/vrev16qu8.x
++++ b/src/gcc/testsuite/gcc.target/aarch64/simd/vrev16qu8.x
+@@ -0,0 +1,22 @@
++extern void abort (void);
++
++uint8x16_t
++test_vrev16qu8 (uint8x16_t _arg)
++{
++ return vrev16q_u8 (_arg);
++}
++
++int
++main (int argc, char **argv)
++{
++ int i;
++ uint8x16_t inorder = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16};
++ uint8x16_t reversed = test_vrev16qu8 (inorder);
++ uint8x16_t expected = {2, 1, 4, 3, 6, 5, 8, 7, 10, 9, 12, 11, 14, 13, 16, 15};
++
++ for (i = 0; i < 16; i++)
++ if (reversed[i] != expected[i])
++ abort ();
++ return 0;
++}
++
+--- a/src/gcc/testsuite/gcc.target/aarch64/simd/vuzpqp8_1.c
++++ b/src/gcc/testsuite/gcc.target/aarch64/simd/vuzpqp8_1.c
+@@ -0,0 +1,11 @@
++/* Test the `vuzpq_p8' AArch64 SIMD intrinsic. */
++
++/* { dg-do run } */
++/* { dg-options "-save-temps -fno-inline" } */
++
++#include <arm_neon.h>
++#include "vuzpqp8.x"
++
++/* { dg-final { scan-assembler-times "uzp1\[ \t\]+v\[0-9\]+\.16b, ?v\[0-9\]+\.16b, ?v\[0-9\]+\.16b!?\(?:\[ \t\]+@\[a-zA-Z0-9 \]+\)?\n" 1 } } */
++/* { dg-final { scan-assembler-times "uzp2\[ \t\]+v\[0-9\]+\.16b, ?v\[0-9\]+\.16b, ?v\[0-9\]+\.16b!?\(?:\[ \t\]+@\[a-zA-Z0-9 \]+\)?\n" 1 } } */
++/* { dg-final { cleanup-saved-temps } } */
+--- a/src/gcc/testsuite/gcc.target/aarch64/simd/vrev64qp16_1.c
++++ b/src/gcc/testsuite/gcc.target/aarch64/simd/vrev64qp16_1.c
+@@ -0,0 +1,10 @@
++/* Test the `vrev64q_p16' AArch64 SIMD intrinsic. */
++
++/* { dg-do run } */
++/* { dg-options "-save-temps -fno-inline" } */
++
++#include <arm_neon.h>
++#include "vrev64qp16.x"
++
++/* { dg-final { scan-assembler-times "rev64\[ \t\]+v\[0-9\]+.8h, ?v\[0-9\]+.8h!?\(?:\[ \t\]+@\[a-zA-Z0-9 \]+\)?\n" 1 } } */
++/* { dg-final { cleanup-saved-temps } } */
+--- a/src/gcc/testsuite/gcc.target/aarch64/simd/vzipqp16.x
++++ b/src/gcc/testsuite/gcc.target/aarch64/simd/vzipqp16.x
+@@ -0,0 +1,27 @@
++extern void abort (void);
++
++poly16x8x2_t
++test_vzipqp16 (poly16x8_t _a, poly16x8_t _b)
++{
++ return vzipq_p16 (_a, _b);
++}
++
++int
++main (int argc, char **argv)
++{
++ int i;
++ poly16_t first[] = {1, 2, 3, 4, 5, 6, 7, 8};
++ poly16_t second[] = {9, 10, 11, 12, 13, 14, 15, 16};
++ poly16x8x2_t result = test_vzipqp16 (vld1q_p16 (first), vld1q_p16 (second));
++ poly16x8_t res1 = result.val[0], res2 = result.val[1];
++ poly16_t exp1[] = {1, 9, 2, 10, 3, 11, 4, 12};
++ poly16_t exp2[] = {5, 13, 6, 14, 7, 15, 8, 16};
++ poly16x8_t expected1 = vld1q_p16 (exp1);
++ poly16x8_t expected2 = vld1q_p16 (exp2);
++
++ for (i = 0; i < 8; i++)
++ if ((res1[i] != expected1[i]) || (res2[i] != expected2[i]))
++ abort ();
++
++ return 0;
++}
+--- a/src/gcc/testsuite/gcc.target/aarch64/simd/vtrnqu16_1.c
++++ b/src/gcc/testsuite/gcc.target/aarch64/simd/vtrnqu16_1.c
+@@ -0,0 +1,11 @@
++/* Test the `vtrnq_u16' AArch64 SIMD intrinsic. */
++
++/* { dg-do run } */
++/* { dg-options "-save-temps -fno-inline" } */
++
++#include <arm_neon.h>
++#include "vtrnqu16.x"
++
++/* { dg-final { scan-assembler-times "trn1\[ \t\]+v\[0-9\]+\.8h, ?v\[0-9\]+\.8h, ?v\[0-9\]+\.8h!?\(?:\[ \t\]+@\[a-zA-Z0-9 \]+\)?\n" 1 } } */
++/* { dg-final { scan-assembler-times "trn2\[ \t\]+v\[0-9\]+\.8h, ?v\[0-9\]+\.8h, ?v\[0-9\]+\.8h!?\(?:\[ \t\]+@\[a-zA-Z0-9 \]+\)?\n" 1 } } */
++/* { dg-final { cleanup-saved-temps } } */
+--- a/src/gcc/testsuite/gcc.target/aarch64/simd/vrev64qu32_1.c
++++ b/src/gcc/testsuite/gcc.target/aarch64/simd/vrev64qu32_1.c
+@@ -0,0 +1,10 @@
++/* Test the `vrev64q_u32' AArch64 SIMD intrinsic. */
++
++/* { dg-do run } */
++/* { dg-options "-save-temps -fno-inline" } */
++
++#include <arm_neon.h>
++#include "vrev64qu32.x"
++
++/* { dg-final { scan-assembler-times "rev64\[ \t\]+v\[0-9\]+.4s, ?v\[0-9\]+.4s!?\(?:\[ \t\]+@\[a-zA-Z0-9 \]+\)?\n" 1 } } */
++/* { dg-final { cleanup-saved-temps } } */
+--- a/src/gcc/testsuite/gcc.target/aarch64/simd/vuzpqu8.x
++++ b/src/gcc/testsuite/gcc.target/aarch64/simd/vuzpqu8.x
+@@ -0,0 +1,27 @@
++extern void abort (void);
++
++uint8x16x2_t
++test_vuzpqu8 (uint8x16_t _a, uint8x16_t _b)
++{
++ return vuzpq_u8 (_a, _b);
++}
++
++int
++main (int argc, char **argv)
++{
++ int i;
++ uint8_t first[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16};
++ uint8_t second[] =
++ {17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32};
++ uint8x16x2_t result = test_vuzpqu8 (vld1q_u8 (first), vld1q_u8 (second));
++ uint8_t exp1[] = {1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29, 31};
++ uint8_t exp2[] = {2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32};
++ uint8x16_t expect1 = vld1q_u8 (exp1);
++ uint8x16_t expect2 = vld1q_u8 (exp2);
++
++ for (i = 0; i < 16; i++)
++ if ((result.val[0][i] != expect1[i]) || (result.val[1][i] != expect2[i]))
++ abort ();
++
++ return 0;
++}
+--- a/src/gcc/testsuite/gcc.target/aarch64/simd/vrev64p8.x
++++ b/src/gcc/testsuite/gcc.target/aarch64/simd/vrev64p8.x
+@@ -0,0 +1,22 @@
++extern void abort (void);
++
++poly8x8_t
++test_vrev64p8 (poly8x8_t _arg)
++{
++ return vrev64_p8 (_arg);
++}
++
++int
++main (int argc, char **argv)
++{
++ int i;
++ poly8x8_t inorder = {1, 2, 3, 4, 5, 6, 7, 8};
++ poly8x8_t reversed = test_vrev64p8 (inorder);
++ poly8x8_t expected = {8, 7, 6, 5, 4, 3, 2, 1};
++
++ for (i = 0; i < 8; i++)
++ if (reversed[i] != expected[i])
++ abort ();
++ return 0;
++}
++
+--- a/src/gcc/testsuite/gcc.target/aarch64/simd/vrev32u8.x
++++ b/src/gcc/testsuite/gcc.target/aarch64/simd/vrev32u8.x
+@@ -0,0 +1,22 @@
++extern void abort (void);
++
++uint8x8_t
++test_vrev32u8 (uint8x8_t _arg)
++{
++ return vrev32_u8 (_arg);
++}
++
++int
++main (int argc, char **argv)
++{
++ int i;
++ uint8x8_t inorder = {1, 2, 3, 4, 5, 6, 7, 8};
++ uint8x8_t reversed = test_vrev32u8 (inorder);
++ uint8x8_t expected = {4, 3, 2, 1, 8, 7, 6, 5};
++
++ for (i = 0; i < 8; i++)
++ if (reversed[i] != expected[i])
++ abort ();
++ return 0;
++}
++
+--- a/src/gcc/testsuite/gcc.target/aarch64/simd/vrev16s8.x
++++ b/src/gcc/testsuite/gcc.target/aarch64/simd/vrev16s8.x
+@@ -0,0 +1,22 @@
++extern void abort (void);
++
++int8x8_t
++test_vrev16s8 (int8x8_t _arg)
++{
++ return vrev16_s8 (_arg);
++}
++
++int
++main (int argc, char **argv)
++{
++ int i;
++ int8x8_t inorder = {1, 2, 3, 4, 5, 6, 7, 8};
++ int8x8_t reversed = test_vrev16s8 (inorder);
++ int8x8_t expected = {2, 1, 4, 3, 6, 5, 8, 7};
++
++ for (i = 0; i < 8; i++)
++ if (reversed[i] != expected[i])
++ abort ();
++ return 0;
++}
++
+--- a/src/gcc/testsuite/gcc.target/aarch64/simd/ext_u8_1.c
++++ b/src/gcc/testsuite/gcc.target/aarch64/simd/ext_u8_1.c
+@@ -0,0 +1,10 @@
++/* Test the `vextu8' AArch64 SIMD intrinsic. */
++
++/* { dg-do run } */
++/* { dg-options "-save-temps -O3 -fno-inline" } */
++
++#include "arm_neon.h"
++#include "ext_u8.x"
++
++/* { dg-final { scan-assembler-times "ext\[ \t\]+\[vV\]\[0-9\]+\.8\[bB\], ?\[vV\]\[0-9\]+\.8\[bB\], ?\[vV\]\[0-9\]+\.8\[bB\], ?#?\[0-9\]+\(?:\[ \t\]+@\[a-zA-Z0-9 \]+\)?\n" 7 } } */
++/* { dg-final { cleanup-saved-temps } } */
+--- a/src/gcc/testsuite/gcc.target/aarch64/simd/extq_u16_1.c
++++ b/src/gcc/testsuite/gcc.target/aarch64/simd/extq_u16_1.c
+@@ -0,0 +1,10 @@
++/* Test the `vextQu16' AArch64 SIMD intrinsic. */
++
++/* { dg-do run } */
++/* { dg-options "-save-temps -O3 -fno-inline" } */
++
++#include "arm_neon.h"
++#include "extq_u16.x"
++
++/* { dg-final { scan-assembler-times "ext\[ \t\]+\[vV\]\[0-9\]+\.16\[bB\], ?\[vV\]\[0-9\]+\.16\[bB\], ?\[vV\]\[0-9\]+\.16\[bB\], ?#\[0-9\]+\(?:.2\)?\(?:\[ \t\]+@\[a-zA-Z0-9 \]+\)?\n" 7 } } */
++/* { dg-final { cleanup-saved-temps } } */
+--- a/src/gcc/testsuite/gcc.target/aarch64/simd/vuzpqs32_1.c
++++ b/src/gcc/testsuite/gcc.target/aarch64/simd/vuzpqs32_1.c
+@@ -0,0 +1,11 @@
++/* Test the `vuzpq_s32' AArch64 SIMD intrinsic. */
++
++/* { dg-do run } */
++/* { dg-options "-save-temps -fno-inline" } */
++
++#include <arm_neon.h>
++#include "vuzpqs32.x"
++
++/* { dg-final { scan-assembler-times "uzp1\[ \t\]+v\[0-9\]+\.4s, ?v\[0-9\]+\.4s, ?v\[0-9\]+\.4s!?\(?:\[ \t\]+@\[a-zA-Z0-9 \]+\)?\n" 1 } } */
++/* { dg-final { scan-assembler-times "uzp2\[ \t\]+v\[0-9\]+\.4s, ?v\[0-9\]+\.4s, ?v\[0-9\]+\.4s!?\(?:\[ \t\]+@\[a-zA-Z0-9 \]+\)?\n" 1 } } */
++/* { dg-final { cleanup-saved-temps } } */
+--- a/src/gcc/testsuite/gcc.target/aarch64/simd/vuzps8_1.c
++++ b/src/gcc/testsuite/gcc.target/aarch64/simd/vuzps8_1.c
+@@ -0,0 +1,11 @@
++/* Test the `vuzp_s8' AArch64 SIMD intrinsic. */
++
++/* { dg-do run } */
++/* { dg-options "-save-temps -fno-inline" } */
++
++#include <arm_neon.h>
++#include "vuzps8.x"
++
++/* { dg-final { scan-assembler-times "uzp1\[ \t\]+v\[0-9\]+\.8b, ?v\[0-9\]+\.8b, ?v\[0-9\]+\.8b!?\(?:\[ \t\]+@\[a-zA-Z0-9 \]+\)?\n" 1 } } */
++/* { dg-final { scan-assembler-times "uzp2\[ \t\]+v\[0-9\]+\.8b, ?v\[0-9\]+\.8b, ?v\[0-9\]+\.8b!?\(?:\[ \t\]+@\[a-zA-Z0-9 \]+\)?\n" 1 } } */
++/* { dg-final { cleanup-saved-temps } } */
+--- a/src/gcc/testsuite/gcc.target/aarch64/simd/vtrnqp8_1.c
++++ b/src/gcc/testsuite/gcc.target/aarch64/simd/vtrnqp8_1.c
+@@ -0,0 +1,11 @@
++/* Test the `vtrnq_p8' AArch64 SIMD intrinsic. */
++
++/* { dg-do run } */
++/* { dg-options "-save-temps -fno-inline" } */
++
++#include <arm_neon.h>
++#include "vtrnqp8.x"
++
++/* { dg-final { scan-assembler-times "trn1\[ \t\]+v\[0-9\]+\.16b, ?v\[0-9\]+\.16b, ?v\[0-9\]+\.16b!?\(?:\[ \t\]+@\[a-zA-Z0-9 \]+\)?\n" 1 } } */
++/* { dg-final { scan-assembler-times "trn2\[ \t\]+v\[0-9\]+\.16b, ?v\[0-9\]+\.16b, ?v\[0-9\]+\.16b!?\(?:\[ \t\]+@\[a-zA-Z0-9 \]+\)?\n" 1 } } */
++/* { dg-final { cleanup-saved-temps } } */
+--- a/src/gcc/testsuite/gcc.target/aarch64/simd/vrev64p16_1.c
++++ b/src/gcc/testsuite/gcc.target/aarch64/simd/vrev64p16_1.c
+@@ -0,0 +1,10 @@
++/* Test the `vrev64_p16' AArch64 SIMD intrinsic. */
++
++/* { dg-do run } */
++/* { dg-options "-save-temps -fno-inline" } */
++
++#include <arm_neon.h>
++#include "vrev64p16.x"
++
++/* { dg-final { scan-assembler-times "rev64\[ \t\]+v\[0-9\]+.4h, ?v\[0-9\]+.4h!?\(?:\[ \t\]+@\[a-zA-Z0-9 \]+\)?\n" 1 } } */
++/* { dg-final { cleanup-saved-temps } } */
+--- a/src/gcc/testsuite/gcc.target/aarch64/simd/vrev32u16_1.c
++++ b/src/gcc/testsuite/gcc.target/aarch64/simd/vrev32u16_1.c
+@@ -0,0 +1,10 @@
++/* Test the `vrev32_u16' AArch64 SIMD intrinsic. */
++
++/* { dg-do run } */
++/* { dg-options "-save-temps -fno-inline" } */
++
++#include <arm_neon.h>
++#include "vrev32u16.x"
++
++/* { dg-final { scan-assembler-times "rev32\[ \t\]+v\[0-9\]+.4h, ?v\[0-9\]+.4h!?\(?:\[ \t\]+@\[a-zA-Z0-9 \]+\)?\n" 1 } } */
++/* { dg-final { cleanup-saved-temps } } */
+--- a/src/gcc/testsuite/gcc.target/aarch64/simd/vtrnp16.x
++++ b/src/gcc/testsuite/gcc.target/aarch64/simd/vtrnp16.x
@@ -0,0 +1,27 @@
+extern void abort (void);
+
+poly16x4x2_t
-+test_vzipp16 (poly16x4_t _a, poly16x4_t _b)
++test_vtrnp16 (poly16x4_t _a, poly16x4_t _b)
+{
-+ return vzip_p16 (_a, _b);
++ return vtrn_p16 (_a, _b);
+}
+
+int
@@ -3694,10 +10514,10 @@ LANG=C svn diff svn://gcc.gnu.org/svn/gcc/branches/gcc-4_9-branch@211979 \
+ int i;
+ poly16_t first[] = {1, 2, 3, 4};
+ poly16_t second[] = {5, 6, 7, 8};
-+ poly16x4x2_t result = test_vzipp16 (vld1_p16 (first), vld1_p16 (second));
++ poly16x4x2_t result = test_vtrnp16 (vld1_p16 (first), vld1_p16 (second));
+ poly16x4_t res1 = result.val[0], res2 = result.val[1];
-+ poly16_t exp1[] = {1, 5, 2, 6};
-+ poly16_t exp2[] = {3, 7, 4, 8};
++ poly16_t exp1[] = {1, 5, 3, 7};
++ poly16_t exp2[] = {2, 6, 4, 8};
+ poly16x4_t expected1 = vld1_p16 (exp1);
+ poly16x4_t expected2 = vld1_p16 (exp2);
+
@@ -3707,6 +10527,44 @@ LANG=C svn diff svn://gcc.gnu.org/svn/gcc/branches/gcc-4_9-branch@211979 \
+
+ return 0;
+}
+--- a/src/gcc/testsuite/gcc.target/aarch64/simd/vrev32qp8.x
++++ b/src/gcc/testsuite/gcc.target/aarch64/simd/vrev32qp8.x
+@@ -0,0 +1,22 @@
++extern void abort (void);
++
++poly8x16_t
++test_vrev32qp8 (poly8x16_t _arg)
++{
++ return vrev32q_p8 (_arg);
++}
++
++int
++main (int argc, char **argv)
++{
++ int i;
++ poly8x16_t inorder = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16};
++ poly8x16_t reversed = test_vrev32qp8 (inorder);
++ poly8x16_t expected = {4, 3, 2, 1, 8, 7, 6, 5, 12, 11, 10, 9, 16, 15, 14, 13};
++
++ for (i = 0; i < 16; i++)
++ if (reversed[i] != expected[i])
++ abort ();
++ return 0;
++}
++
+--- a/src/gcc/testsuite/gcc.target/aarch64/simd/vrev16qs8_1.c
++++ b/src/gcc/testsuite/gcc.target/aarch64/simd/vrev16qs8_1.c
+@@ -0,0 +1,10 @@
++/* Test the `vrev16q_s8' AArch64 SIMD intrinsic. */
++
++/* { dg-do run } */
++/* { dg-options "-save-temps -fno-inline" } */
++
++#include <arm_neon.h>
++#include "vrev16qs8.x"
++
++/* { dg-final { scan-assembler-times "rev16\[ \t\]+v\[0-9\]+.16b, ?v\[0-9\]+.16b!?\(?:\[ \t\]+@\[a-zA-Z0-9 \]+\)?\n" 1 } } */
++/* { dg-final { cleanup-saved-temps } } */
--- a/src/gcc/testsuite/gcc.target/aarch64/simd/vzips32.x
+++ b/src/gcc/testsuite/gcc.target/aarch64/simd/vzips32.x
@@ -0,0 +1,27 @@
@@ -3737,54 +10595,44 @@ LANG=C svn diff svn://gcc.gnu.org/svn/gcc/branches/gcc-4_9-branch@211979 \
+
+ return 0;
+}
---- a/src/gcc/testsuite/gcc.target/aarch64/simd/simd.exp
-+++ b/src/gcc/testsuite/gcc.target/aarch64/simd/simd.exp
-@@ -0,0 +1,45 @@
-+# Specific regression driver for AArch64 SIMD instructions.
-+# Copyright (C) 2014 Free Software Foundation, Inc.
-+# Contributed by ARM Ltd.
-+#
-+# This file is part of GCC.
-+#
-+# GCC is free software; you can redistribute it and/or modify it
-+# under the terms of the GNU General Public License as published by
-+# the Free Software Foundation; either version 3, or (at your option)
-+# any later version.
-+#
-+# GCC is distributed in the hope that it will be useful, but
-+# WITHOUT ANY WARRANTY; without even the implied warranty of
-+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-+# General Public License for more details.
-+#
-+# You should have received a copy of the GNU General Public License
-+# along with GCC; see the file COPYING3. If not see
-+# <http://www.gnu.org/licenses/>. */
+--- a/src/gcc/testsuite/gcc.target/aarch64/simd/vrev64u32_1.c
++++ b/src/gcc/testsuite/gcc.target/aarch64/simd/vrev64u32_1.c
+@@ -0,0 +1,10 @@
++/* Test the `vrev64_u32' AArch64 SIMD intrinsic. */
+
-+# GCC testsuite that uses the `dg.exp' driver.
++/* { dg-do run } */
++/* { dg-options "-save-temps -fno-inline" } */
+
-+# Exit immediately if this isn't an AArch64 target.
-+if {![istarget aarch64*-*-*] } then {
-+ return
-+}
++#include <arm_neon.h>
++#include "vrev64u32.x"
+
-+# Load support procs.
-+load_lib gcc-dg.exp
++/* { dg-final { scan-assembler-times "rev64\[ \t\]+v\[0-9\]+.2s, ?v\[0-9\]+.2s!?\(?:\[ \t\]+@\[a-zA-Z0-9 \]+\)?\n" 1 } } */
++/* { dg-final { cleanup-saved-temps } } */
+--- a/src/gcc/testsuite/gcc.target/aarch64/simd/vrev16qp8.x
++++ b/src/gcc/testsuite/gcc.target/aarch64/simd/vrev16qp8.x
+@@ -0,0 +1,22 @@
++extern void abort (void);
+
-+# If a testcase doesn't have special options, use these.
-+global DEFAULT_CFLAGS
-+if ![info exists DEFAULT_CFLAGS] then {
-+ set DEFAULT_CFLAGS " -ansi -pedantic-errors"
++poly8x16_t
++test_vrev16qp8 (poly8x16_t _arg)
++{
++ return vrev16q_p8 (_arg);
+}
+
-+# Initialize `dg'.
-+dg-init
++int
++main (int argc, char **argv)
++{
++ int i;
++ poly8x16_t inorder = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16};
++ poly8x16_t reversed = test_vrev16qp8 (inorder);
++ poly8x16_t expected = {2, 1, 4, 3, 6, 5, 8, 7, 10, 9, 12, 11, 14, 13, 16, 15};
+
-+# Main loop.
-+dg-runtest [lsort [glob -nocomplain $srcdir/$subdir/*.\[cCS\]]] \
-+ "" $DEFAULT_CFLAGS
++ for (i = 0; i < 16; i++)
++ if (reversed[i] != expected[i])
++ abort ();
++ return 0;
++}
+
-+# All done.
-+dg-finish
--- a/src/gcc/testsuite/gcc.target/aarch64/simd/vzipu32.x
+++ b/src/gcc/testsuite/gcc.target/aarch64/simd/vzipu32.x
@@ -0,0 +1,27 @@
@@ -3815,29 +10663,29 @@ LANG=C svn diff svn://gcc.gnu.org/svn/gcc/branches/gcc-4_9-branch@211979 \
+
+ return 0;
+}
---- a/src/gcc/testsuite/gcc.target/aarch64/simd/vzips16.x
-+++ b/src/gcc/testsuite/gcc.target/aarch64/simd/vzips16.x
+--- a/src/gcc/testsuite/gcc.target/aarch64/simd/vtrnqf32.x
++++ b/src/gcc/testsuite/gcc.target/aarch64/simd/vtrnqf32.x
@@ -0,0 +1,27 @@
+extern void abort (void);
+
-+int16x4x2_t
-+test_vzips16 (int16x4_t _a, int16x4_t _b)
++float32x4x2_t
++test_vtrnqf32 (float32x4_t _a, float32x4_t _b)
+{
-+ return vzip_s16 (_a, _b);
++ return vtrnq_f32 (_a, _b);
+}
+
+int
+main (int argc, char **argv)
+{
+ int i;
-+ int16_t first[] = {1, 2, 3, 4};
-+ int16_t second[] = {5, 6, 7, 8};
-+ int16x4x2_t result = test_vzips16 (vld1_s16 (first), vld1_s16 (second));
-+ int16x4_t res1 = result.val[0], res2 = result.val[1];
-+ int16_t exp1[] = {1, 5, 2, 6};
-+ int16_t exp2[] = {3, 7, 4, 8};
-+ int16x4_t expected1 = vld1_s16 (exp1);
-+ int16x4_t expected2 = vld1_s16 (exp2);
++ float32_t first[] = {1, 2, 3, 4};
++ float32_t second[] = {5, 6, 7, 8};
++ float32x4x2_t result = test_vtrnqf32 (vld1q_f32 (first), vld1q_f32 (second));
++ float32x4_t res1 = result.val[0], res2 = result.val[1];
++ float32_t exp1[] = {1, 5, 3, 7};
++ float32_t exp2[] = {2, 6, 4, 8};
++ float32x4_t expected1 = vld1q_f32 (exp1);
++ float32x4_t expected2 = vld1q_f32 (exp2);
+
+ for (i = 0; i < 4; i++)
+ if ((res1[i] != expected1[i]) || (res2[i] != expected2[i]))
@@ -3845,15 +10693,15 @@ LANG=C svn diff svn://gcc.gnu.org/svn/gcc/branches/gcc-4_9-branch@211979 \
+
+ return 0;
+}
---- a/src/gcc/testsuite/gcc.target/aarch64/simd/vzipqs8.x
-+++ b/src/gcc/testsuite/gcc.target/aarch64/simd/vzipqs8.x
-@@ -0,0 +1,29 @@
+--- a/src/gcc/testsuite/gcc.target/aarch64/simd/vtrnqs8.x
++++ b/src/gcc/testsuite/gcc.target/aarch64/simd/vtrnqs8.x
+@@ -0,0 +1,28 @@
+extern void abort (void);
+
+int8x16x2_t
-+test_vzipqs8 (int8x16_t _a, int8x16_t _b)
++test_vtrnqs8 (int8x16_t _a, int8x16_t _b)
+{
-+ return vzipq_s8 (_a, _b);
++ return vtrnq_s8 (_a, _b);
+}
+
+int
@@ -3863,11 +10711,10 @@ LANG=C svn diff svn://gcc.gnu.org/svn/gcc/branches/gcc-4_9-branch@211979 \
+ int8_t first[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16};
+ int8_t second[] =
+ {17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32};
-+ int8x16x2_t result = test_vzipqs8 (vld1q_s8 (first), vld1q_s8 (second));
++ int8x16x2_t result = test_vtrnqs8 (vld1q_s8 (first), vld1q_s8 (second));
+ int8x16_t res1 = result.val[0], res2 = result.val[1];
-+ int8_t exp1[] = {1, 17, 2, 18, 3, 19, 4, 20, 5, 21, 6, 22, 7, 23, 8, 24};
-+ int8_t exp2[] =
-+ {9, 25, 10, 26, 11, 27, 12, 28, 13, 29, 14, 30, 15, 31, 16, 32};
++ int8_t exp1[] = {1, 17, 3, 19, 5, 21, 7, 23, 9, 25, 11, 27, 13, 29, 15, 31};
++ int8_t exp2[] = {2, 18, 4, 20, 6, 22, 8, 24, 10, 26, 12, 28, 14, 30, 16, 32};
+ int8x16_t expected1 = vld1q_s8 (exp1);
+ int8x16_t expected2 = vld1q_s8 (exp2);
+
@@ -3877,82 +10724,181 @@ LANG=C svn diff svn://gcc.gnu.org/svn/gcc/branches/gcc-4_9-branch@211979 \
+
+ return 0;
+}
---- a/src/gcc/testsuite/gcc.target/aarch64/simd/vzipu16.x
-+++ b/src/gcc/testsuite/gcc.target/aarch64/simd/vzipu16.x
-@@ -0,0 +1,27 @@
+--- a/src/gcc/testsuite/gcc.target/aarch64/simd/ext_s64_1.c
++++ b/src/gcc/testsuite/gcc.target/aarch64/simd/ext_s64_1.c
+@@ -0,0 +1,11 @@
++/* Test the `vexts64' AArch64 SIMD intrinsic. */
++
++/* { dg-do run } */
++/* { dg-options "-save-temps -O3 -fno-inline" } */
++
++#include "arm_neon.h"
++#include "ext_s64.x"
++
++/* Do not scan-assembler. An EXT instruction could be emitted, but would merely
++ return its first argument, so it is legitimate to optimize it out. */
++/* { dg-final { cleanup-saved-temps } } */
+--- a/src/gcc/testsuite/gcc.target/aarch64/simd/vuzps32_1.c
++++ b/src/gcc/testsuite/gcc.target/aarch64/simd/vuzps32_1.c
+@@ -0,0 +1,11 @@
++/* Test the `vuzp_s32' AArch64 SIMD intrinsic. */
++
++/* { dg-do run } */
++/* { dg-options "-save-temps -fno-inline" } */
++
++#include <arm_neon.h>
++#include "vuzps32.x"
++
++/* { dg-final { scan-assembler-times "zip1\[ \t\]+v\[0-9\]+\.2s, ?v\[0-9\]+\.2s, ?v\[0-9\]+\.2s!?\(?:\[ \t\]+@\[a-zA-Z0-9 \]+\)?\n" 1 } } */
++/* { dg-final { scan-assembler-times "zip2\[ \t\]+v\[0-9\]+\.2s, ?v\[0-9\]+\.2s, ?v\[0-9\]+\.2s!?\(?:\[ \t\]+@\[a-zA-Z0-9 \]+\)?\n" 1 } } */
++/* { dg-final { cleanup-saved-temps } } */
+--- a/src/gcc/testsuite/gcc.target/aarch64/simd/vrev64qf32.x
++++ b/src/gcc/testsuite/gcc.target/aarch64/simd/vrev64qf32.x
+@@ -0,0 +1,22 @@
+extern void abort (void);
+
-+uint16x4x2_t
-+test_vzipu16 (uint16x4_t _a, uint16x4_t _b)
++float32x4_t
++test_vrev64qf32 (float32x4_t _arg)
+{
-+ return vzip_u16 (_a, _b);
++ return vrev64q_f32 (_arg);
+}
+
+int
+main (int argc, char **argv)
+{
+ int i;
-+ uint16_t first[] = {1, 2, 3, 4};
-+ uint16_t second[] = {5, 6, 7, 8};
-+ uint16x4x2_t result = test_vzipu16 (vld1_u16 (first), vld1_u16 (second));
-+ uint16x4_t res1 = result.val[0], res2 = result.val[1];
-+ uint16_t exp1[] = {1, 5, 2, 6};
-+ uint16_t exp2[] = {3, 7, 4, 8};
-+ uint16x4_t expected1 = vld1_u16 (exp1);
-+ uint16x4_t expected2 = vld1_u16 (exp2);
++ float32x4_t inorder = {1, 2, 3, 4};
++ float32x4_t reversed = test_vrev64qf32 (inorder);
++ float32x4_t expected = {2, 1, 4, 3};
+
+ for (i = 0; i < 4; i++)
-+ if ((res1[i] != expected1[i]) || (res2[i] != expected2[i]))
++ if (reversed[i] != expected[i])
+ abort ();
-+
+ return 0;
+}
---- a/src/gcc/testsuite/gcc.target/aarch64/simd/vzipqu8.x
-+++ b/src/gcc/testsuite/gcc.target/aarch64/simd/vzipqu8.x
-@@ -0,0 +1,29 @@
++
+--- a/src/gcc/testsuite/gcc.target/aarch64/simd/ext_s16.x
++++ b/src/gcc/testsuite/gcc.target/aarch64/simd/ext_s16.x
+@@ -0,0 +1,58 @@
+extern void abort (void);
+
-+uint8x16x2_t
-+test_vzipqu8 (uint8x16_t _a, uint8x16_t _b)
++int16x4_t
++test_vext_s16_1 (int16x4_t a, int16x4_t b)
+{
-+ return vzipq_u8 (_a, _b);
++ return vext_s16 (a, b, 1);
++}
++
++int16x4_t
++test_vext_s16_2 (int16x4_t a, int16x4_t b)
++{
++ return vext_s16 (a, b, 2);
++}
++
++int16x4_t
++test_vext_s16_3 (int16x4_t a, int16x4_t b)
++{
++ return vext_s16 (a, b, 3);
+}
+
+int
+main (int argc, char **argv)
+{
-+ int i;
-+ uint8_t first[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16};
-+ uint8_t second[] =
-+ {17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32};
-+ uint8x16x2_t result = test_vzipqu8 (vld1q_u8 (first), vld1q_u8 (second));
-+ uint8x16_t res1 = result.val[0], res2 = result.val[1];
-+ uint8_t exp1[] = {1, 17, 2, 18, 3, 19, 4, 20, 5, 21, 6, 22, 7, 23, 8, 24};
-+ uint8_t exp2[] =
-+ {9, 25, 10, 26, 11, 27, 12, 28, 13, 29, 14, 30, 15, 31, 16, 32};
-+ uint8x16_t expected1 = vld1q_u8 (exp1);
-+ uint8x16_t expected2 = vld1q_u8 (exp2);
++ int i, off;
++ int16_t arr1[] = {0, 1, 2, 3};
++ int16x4_t in1 = vld1_s16 (arr1);
++ int16_t arr2[] = {4, 5, 6, 7};
++ int16x4_t in2 = vld1_s16 (arr2);
++ int16_t exp[4];
++ int16x4_t expected;
++ int16x4_t actual = test_vext_s16_1 (in1, in2);
+
-+ for (i = 0; i < 16; i++)
-+ if ((res1[i] != expected1[i]) || (res2[i] != expected2[i]))
++ for (i = 0; i < 4; i++)
++ exp[i] = i + 1;
++ expected = vld1_s16 (exp);
++ for (i = 0; i < 4; i++)
++ if (actual[i] != expected[i])
++ abort ();
++
++ actual = test_vext_s16_2 (in1, in2);
++ for (i = 0; i < 4; i++)
++ exp[i] = i + 2;
++ expected = vld1_s16 (exp);
++ for (i = 0; i < 4; i++)
++ if (actual[i] != expected[i])
++ abort ();
++
++ actual = test_vext_s16_3 (in1, in2);
++ for (i = 0; i < 4; i++)
++ exp[i] = i + 3;
++ expected = vld1_s16 (exp);
++ for (i = 0; i < 4; i++)
++ if (actual[i] != expected[i])
+ abort ();
+
+ return 0;
+}
---- a/src/gcc/testsuite/gcc.target/aarch64/simd/vzipqp16_1.c
-+++ b/src/gcc/testsuite/gcc.target/aarch64/simd/vzipqp16_1.c
-@@ -0,0 +1,11 @@
-+/* Test the `vzipq_p16' AArch64 SIMD intrinsic. */
+
-+/* { dg-do run } */
-+/* { dg-options "-save-temps -fno-inline" } */
+--- a/src/gcc/testsuite/gcc.target/aarch64/simd/ext_u16.x
++++ b/src/gcc/testsuite/gcc.target/aarch64/simd/ext_u16.x
+@@ -0,0 +1,58 @@
++extern void abort (void);
+
-+#include <arm_neon.h>
-+#include "vzipqp16.x"
++uint16x4_t
++test_vext_u16_1 (uint16x4_t a, uint16x4_t b)
++{
++ return vext_u16 (a, b, 1);
++}
++
++uint16x4_t
++test_vext_u16_2 (uint16x4_t a, uint16x4_t b)
++{
++ return vext_u16 (a, b, 2);
++}
++
++uint16x4_t
++test_vext_u16_3 (uint16x4_t a, uint16x4_t b)
++{
++ return vext_u16 (a, b, 3);
++}
++
++int
++main (int argc, char **argv)
++{
++ int i, off;
++ uint16_t arr1[] = {0, 1, 2, 3};
++ uint16x4_t in1 = vld1_u16 (arr1);
++ uint16_t arr2[] = {4, 5, 6, 7};
++ uint16x4_t in2 = vld1_u16 (arr2);
++ uint16_t exp[4];
++ uint16x4_t expected;
++ uint16x4_t actual = test_vext_u16_1 (in1, in2);
++
++ for (i = 0; i < 4; i++)
++ exp[i] = i + 1;
++ expected = vld1_u16 (exp);
++ for (i = 0; i < 4; i++)
++ if (actual[i] != expected[i])
++ abort ();
++
++ actual = test_vext_u16_2 (in1, in2);
++ for (i = 0; i < 4; i++)
++ exp[i] = i + 2;
++ expected = vld1_u16 (exp);
++ for (i = 0; i < 4; i++)
++ if (actual[i] != expected[i])
++ abort ();
++
++ actual = test_vext_u16_3 (in1, in2);
++ for (i = 0; i < 4; i++)
++ exp[i] = i + 3;
++ expected = vld1_u16 (exp);
++ for (i = 0; i < 4; i++)
++ if (actual[i] != expected[i])
++ abort ();
++
++ return 0;
++}
+
-+/* { dg-final { scan-assembler-times "zip1\[ \t\]+v\[0-9\]+\.8h, ?v\[0-9\]+\.8h, ?v\[0-9\]+\.8h!?\(?:\[ \t\]+@\[a-zA-Z0-9 \]+\)?\n" 1 } } */
-+/* { dg-final { scan-assembler-times "zip2\[ \t\]+v\[0-9\]+\.8h, ?v\[0-9\]+\.8h, ?v\[0-9\]+\.8h!?\(?:\[ \t\]+@\[a-zA-Z0-9 \]+\)?\n" 1 } } */
-+/* { dg-final { cleanup-saved-temps } } */
--- a/src/gcc/testsuite/gcc.target/aarch64/simd/vzipqs32_1.c
+++ b/src/gcc/testsuite/gcc.target/aarch64/simd/vzipqs32_1.c
@@ -0,0 +1,11 @@
@@ -3967,19 +10913,49 @@ LANG=C svn diff svn://gcc.gnu.org/svn/gcc/branches/gcc-4_9-branch@211979 \
+/* { dg-final { scan-assembler-times "zip1\[ \t\]+v\[0-9\]+\.4s, ?v\[0-9\]+\.4s, ?v\[0-9\]+\.4s!?\(?:\[ \t\]+@\[a-zA-Z0-9 \]+\)?\n" 1 } } */
+/* { dg-final { scan-assembler-times "zip2\[ \t\]+v\[0-9\]+\.4s, ?v\[0-9\]+\.4s, ?v\[0-9\]+\.4s!?\(?:\[ \t\]+@\[a-zA-Z0-9 \]+\)?\n" 1 } } */
+/* { dg-final { cleanup-saved-temps } } */
---- a/src/gcc/testsuite/gcc.target/aarch64/simd/vzipqu32_1.c
-+++ b/src/gcc/testsuite/gcc.target/aarch64/simd/vzipqu32_1.c
+--- a/src/gcc/testsuite/gcc.target/aarch64/simd/vuzpqp8.x
++++ b/src/gcc/testsuite/gcc.target/aarch64/simd/vuzpqp8.x
+@@ -0,0 +1,27 @@
++extern void abort (void);
++
++poly8x16x2_t
++test_vuzpqp8 (poly8x16_t _a, poly8x16_t _b)
++{
++ return vuzpq_p8 (_a, _b);
++}
++
++int
++main (int argc, char **argv)
++{
++ int i;
++ poly8_t first[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16};
++ poly8_t second[] =
++ {17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32};
++ poly8x16x2_t result = test_vuzpqp8 (vld1q_p8 (first), vld1q_p8 (second));
++ poly8_t exp1[] = {1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29, 31};
++ poly8_t exp2[] = {2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32};
++ poly8x16_t expect1 = vld1q_p8 (exp1);
++ poly8x16_t expect2 = vld1q_p8 (exp2);
++
++ for (i = 0; i < 16; i++)
++ if ((result.val[0][i] != expect1[i]) || (result.val[1][i] != expect2[i]))
++ abort ();
++
++ return 0;
++}
+--- a/src/gcc/testsuite/gcc.target/aarch64/simd/vuzpqu8_1.c
++++ b/src/gcc/testsuite/gcc.target/aarch64/simd/vuzpqu8_1.c
@@ -0,0 +1,11 @@
-+/* Test the `vzipq_u32' AArch64 SIMD intrinsic. */
++/* Test the `vuzpq_u8' AArch64 SIMD intrinsic. */
+
+/* { dg-do run } */
+/* { dg-options "-save-temps -fno-inline" } */
+
+#include <arm_neon.h>
-+#include "vzipqu32.x"
++#include "vuzpqu8.x"
+
-+/* { dg-final { scan-assembler-times "zip1\[ \t\]+v\[0-9\]+\.4s, ?v\[0-9\]+\.4s, ?v\[0-9\]+\.4s!?\(?:\[ \t\]+@\[a-zA-Z0-9 \]+\)?\n" 1 } } */
-+/* { dg-final { scan-assembler-times "zip2\[ \t\]+v\[0-9\]+\.4s, ?v\[0-9\]+\.4s, ?v\[0-9\]+\.4s!?\(?:\[ \t\]+@\[a-zA-Z0-9 \]+\)?\n" 1 } } */
++/* { dg-final { scan-assembler-times "uzp1\[ \t\]+v\[0-9\]+\.16b, ?v\[0-9\]+\.16b, ?v\[0-9\]+\.16b!?\(?:\[ \t\]+@\[a-zA-Z0-9 \]+\)?\n" 1 } } */
++/* { dg-final { scan-assembler-times "uzp2\[ \t\]+v\[0-9\]+\.16b, ?v\[0-9\]+\.16b, ?v\[0-9\]+\.16b!?\(?:\[ \t\]+@\[a-zA-Z0-9 \]+\)?\n" 1 } } */
+/* { dg-final { cleanup-saved-temps } } */
--- a/src/gcc/testsuite/gcc.target/aarch64/simd/vzips8_1.c
+++ b/src/gcc/testsuite/gcc.target/aarch64/simd/vzips8_1.c
@@ -3995,78 +10971,1117 @@ LANG=C svn diff svn://gcc.gnu.org/svn/gcc/branches/gcc-4_9-branch@211979 \
+/* { dg-final { scan-assembler-times "zip1\[ \t\]+v\[0-9\]+\.8b, ?v\[0-9\]+\.8b, ?v\[0-9\]+\.8b!?\(?:\[ \t\]+@\[a-zA-Z0-9 \]+\)?\n" 1 } } */
+/* { dg-final { scan-assembler-times "zip2\[ \t\]+v\[0-9\]+\.8b, ?v\[0-9\]+\.8b, ?v\[0-9\]+\.8b!?\(?:\[ \t\]+@\[a-zA-Z0-9 \]+\)?\n" 1 } } */
+/* { dg-final { cleanup-saved-temps } } */
---- a/src/gcc/testsuite/gcc.target/aarch64/simd/vzipf32_1.c
-+++ b/src/gcc/testsuite/gcc.target/aarch64/simd/vzipf32_1.c
+--- a/src/gcc/testsuite/gcc.target/aarch64/simd/vrev32p8.x
++++ b/src/gcc/testsuite/gcc.target/aarch64/simd/vrev32p8.x
+@@ -0,0 +1,22 @@
++extern void abort (void);
++
++poly8x8_t
++test_vrev32p8 (poly8x8_t _arg)
++{
++ return vrev32_p8 (_arg);
++}
++
++int
++main (int argc, char **argv)
++{
++ int i;
++ poly8x8_t inorder = {1, 2, 3, 4, 5, 6, 7, 8};
++ poly8x8_t reversed = test_vrev32p8 (inorder);
++ poly8x8_t expected = {4, 3, 2, 1, 8, 7, 6, 5};
++
++ for (i = 0; i < 8; i++)
++ if (reversed[i] != expected[i])
++ abort ();
++ return 0;
++}
++
+--- a/src/gcc/testsuite/gcc.target/aarch64/simd/vrev64s8.x
++++ b/src/gcc/testsuite/gcc.target/aarch64/simd/vrev64s8.x
+@@ -0,0 +1,22 @@
++extern void abort (void);
++
++int8x8_t
++test_vrev64s8 (int8x8_t _arg)
++{
++ return vrev64_s8 (_arg);
++}
++
++int
++main (int argc, char **argv)
++{
++ int i;
++ int8x8_t inorder = {1, 2, 3, 4, 5, 6, 7, 8};
++ int8x8_t reversed = test_vrev64s8 (inorder);
++ int8x8_t expected = {8, 7, 6, 5, 4, 3, 2, 1};
++
++ for (i = 0; i < 8; i++)
++ if (reversed[i] != expected[i])
++ abort ();
++ return 0;
++}
++
+--- a/src/gcc/testsuite/gcc.target/aarch64/simd/vuzpp8_1.c
++++ b/src/gcc/testsuite/gcc.target/aarch64/simd/vuzpp8_1.c
@@ -0,0 +1,11 @@
-+/* Test the `vzip_f32' AArch64 SIMD intrinsic. */
++/* Test the `vuzp_p8' AArch64 SIMD intrinsic. */
+
+/* { dg-do run } */
+/* { dg-options "-save-temps -fno-inline" } */
+
+#include <arm_neon.h>
-+#include "vzipf32.x"
++#include "vuzpp8.x"
++
++/* { dg-final { scan-assembler-times "uzp1\[ \t\]+v\[0-9\]+\.8b, ?v\[0-9\]+\.8b, ?v\[0-9\]+\.8b!?\(?:\[ \t\]+@\[a-zA-Z0-9 \]+\)?\n" 1 } } */
++/* { dg-final { scan-assembler-times "uzp2\[ \t\]+v\[0-9\]+\.8b, ?v\[0-9\]+\.8b, ?v\[0-9\]+\.8b!?\(?:\[ \t\]+@\[a-zA-Z0-9 \]+\)?\n" 1 } } */
++/* { dg-final { cleanup-saved-temps } } */
+--- a/src/gcc/testsuite/gcc.target/aarch64/simd/extq_s32.x
++++ b/src/gcc/testsuite/gcc.target/aarch64/simd/extq_s32.x
+@@ -0,0 +1,58 @@
++extern void abort (void);
++
++int32x4_t
++test_vextq_s32_1 (int32x4_t a, int32x4_t b)
++{
++ return vextq_s32 (a, b, 1);
++}
++
++int32x4_t
++test_vextq_s32_2 (int32x4_t a, int32x4_t b)
++{
++ return vextq_s32 (a, b, 2);
++}
++
++int32x4_t
++test_vextq_s32_3 (int32x4_t a, int32x4_t b)
++{
++ return vextq_s32 (a, b, 3);
++}
++
++int
++main (int argc, char **argv)
++{
++ int i, off;
++ int32_t arr1[] = {0, 1, 2, 3};
++ int32x4_t in1 = vld1q_s32 (arr1);
++ int32_t arr2[] = {4, 5, 6, 7};
++ int32x4_t in2 = vld1q_s32 (arr2);
++ int32_t exp[4];
++ int32x4_t expected;
++ int32x4_t actual = test_vextq_s32_1 (in1, in2);
++
++ for (i = 0; i < 4; i++)
++ exp[i] = i + 1;
++ expected = vld1q_s32 (exp);
++ for (i = 0; i < 4; i++)
++ if (actual[i] != expected[i])
++ abort ();
++
++ actual = test_vextq_s32_2 (in1, in2);
++ for (i = 0; i < 4; i++)
++ exp[i] = i + 2;
++ expected = vld1q_s32 (exp);
++ for (i = 0; i < 4; i++)
++ if (actual[i] != expected[i])
++ abort ();
++
++ actual = test_vextq_s32_3 (in1, in2);
++ for (i = 0; i < 4; i++)
++ exp[i] = i + 3;
++ expected = vld1q_s32 (exp);
++ for (i = 0; i < 4; i++)
++ if (actual[i] != expected[i])
++ abort ();
++
++ return 0;
++}
++
+--- a/src/gcc/testsuite/gcc.target/aarch64/simd/extq_u32.x
++++ b/src/gcc/testsuite/gcc.target/aarch64/simd/extq_u32.x
+@@ -0,0 +1,58 @@
++extern void abort (void);
++
++uint32x4_t
++test_vextq_u32_1 (uint32x4_t a, uint32x4_t b)
++{
++ return vextq_u32 (a, b, 1);
++}
++
++uint32x4_t
++test_vextq_u32_2 (uint32x4_t a, uint32x4_t b)
++{
++ return vextq_u32 (a, b, 2);
++}
++
++uint32x4_t
++test_vextq_u32_3 (uint32x4_t a, uint32x4_t b)
++{
++ return vextq_u32 (a, b, 3);
++}
++
++int
++main (int argc, char **argv)
++{
++ int i, off;
++ uint32_t arr1[] = {0, 1, 2, 3};
++ uint32x4_t in1 = vld1q_u32 (arr1);
++ uint32_t arr2[] = {4, 5, 6, 7};
++ uint32x4_t in2 = vld1q_u32 (arr2);
++ uint32_t exp[4];
++ uint32x4_t expected;
++ uint32x4_t actual = test_vextq_u32_1 (in1, in2);
++
++ for (i = 0; i < 4; i++)
++ exp[i] = i + 1;
++ expected = vld1q_u32 (exp);
++ for (i = 0; i < 4; i++)
++ if (actual[i] != expected[i])
++ abort ();
++
++ actual = test_vextq_u32_2 (in1, in2);
++ for (i = 0; i < 4; i++)
++ exp[i] = i + 2;
++ expected = vld1q_u32 (exp);
++ for (i = 0; i < 4; i++)
++ if (actual[i] != expected[i])
++ abort ();
++
++ actual = test_vextq_u32_3 (in1, in2);
++ for (i = 0; i < 4; i++)
++ exp[i] = i + 3;
++ expected = vld1q_u32 (exp);
++ for (i = 0; i < 4; i++)
++ if (actual[i] != expected[i])
++ abort ();
++
++ return 0;
++}
++
+--- a/src/gcc/testsuite/gcc.target/aarch64/simd/extq_u64_1.c
++++ b/src/gcc/testsuite/gcc.target/aarch64/simd/extq_u64_1.c
+@@ -0,0 +1,10 @@
++/* Test the `vextQu64' AArch64 SIMD intrinsic. */
++
++/* { dg-do run } */
++/* { dg-options "-save-temps -O3 -fno-inline" } */
++
++#include "arm_neon.h"
++#include "extq_u64.x"
++
++/* { dg-final { scan-assembler-times "ext\[ \t\]+\[vV\]\[0-9\]+\.16\[bB\], ?\[vV\]\[0-9\]+\.16\[bB\], ?\[vV\]\[0-9\]+\.16\[bB\], ?#\[0-9\]+\(?:.8\)?\(?:\[ \t\]+@\[a-zA-Z0-9 \]+\)?\n" 1 } } */
++/* { dg-final { cleanup-saved-temps } } */
+--- a/src/gcc/testsuite/gcc.target/aarch64/simd/vzipp16_1.c
++++ b/src/gcc/testsuite/gcc.target/aarch64/simd/vzipp16_1.c
+@@ -0,0 +1,11 @@
++/* Test the `vzip_p16' AArch64 SIMD intrinsic. */
++
++/* { dg-do run } */
++/* { dg-options "-save-temps -fno-inline" } */
++
++#include <arm_neon.h>
++#include "vzipp16.x"
++
++/* { dg-final { scan-assembler-times "zip1\[ \t\]+v\[0-9\]+\.4h, ?v\[0-9\]+\.4h, ?v\[0-9\]+\.4h!?\(?:\[ \t\]+@\[a-zA-Z0-9 \]+\)?\n" 1 } } */
++/* { dg-final { scan-assembler-times "zip2\[ \t\]+v\[0-9\]+\.4h, ?v\[0-9\]+\.4h, ?v\[0-9\]+\.4h!?\(?:\[ \t\]+@\[a-zA-Z0-9 \]+\)?\n" 1 } } */
++/* { dg-final { cleanup-saved-temps } } */
+--- a/src/gcc/testsuite/gcc.target/aarch64/simd/vtrns32_1.c
++++ b/src/gcc/testsuite/gcc.target/aarch64/simd/vtrns32_1.c
+@@ -0,0 +1,11 @@
++/* Test the `vtrn_s32' AArch64 SIMD intrinsic. */
++
++/* { dg-do run } */
++/* { dg-options "-save-temps -fno-inline" } */
++
++#include <arm_neon.h>
++#include "vtrns32.x"
+
+/* { dg-final { scan-assembler-times "zip1\[ \t\]+v\[0-9\]+\.2s, ?v\[0-9\]+\.2s, ?v\[0-9\]+\.2s!?\(?:\[ \t\]+@\[a-zA-Z0-9 \]+\)?\n" 1 } } */
+/* { dg-final { scan-assembler-times "zip2\[ \t\]+v\[0-9\]+\.2s, ?v\[0-9\]+\.2s, ?v\[0-9\]+\.2s!?\(?:\[ \t\]+@\[a-zA-Z0-9 \]+\)?\n" 1 } } */
+/* { dg-final { cleanup-saved-temps } } */
---- a/src/gcc/testsuite/gcc.target/aarch64/simd/vzipqs16_1.c
-+++ b/src/gcc/testsuite/gcc.target/aarch64/simd/vzipqs16_1.c
+--- a/src/gcc/testsuite/gcc.target/aarch64/simd/vrev16qp8_1.c
++++ b/src/gcc/testsuite/gcc.target/aarch64/simd/vrev16qp8_1.c
+@@ -0,0 +1,10 @@
++/* Test the `vrev16q_p8' AArch64 SIMD intrinsic. */
++
++/* { dg-do run } */
++/* { dg-options "-save-temps -fno-inline" } */
++
++#include <arm_neon.h>
++#include "vrev16qp8.x"
++
++/* { dg-final { scan-assembler-times "rev16\[ \t\]+v\[0-9\]+.16b, ?v\[0-9\]+.16b!?\(?:\[ \t\]+@\[a-zA-Z0-9 \]+\)?\n" 1 } } */
++/* { dg-final { cleanup-saved-temps } } */
+--- a/src/gcc/testsuite/gcc.target/aarch64/simd/vuzpqs32.x
++++ b/src/gcc/testsuite/gcc.target/aarch64/simd/vuzpqs32.x
+@@ -0,0 +1,26 @@
++extern void abort (void);
++
++int32x4x2_t
++test_vuzpqs32 (int32x4_t _a, int32x4_t _b)
++{
++ return vuzpq_s32 (_a, _b);
++}
++
++int
++main (int argc, char **argv)
++{
++ int i;
++ int32_t first[] = {1, 2, 3, 4};
++ int32_t second[] = {5, 6, 7, 8};
++ int32x4x2_t result = test_vuzpqs32 (vld1q_s32 (first), vld1q_s32 (second));
++ int32_t exp1[] = {1, 3, 5, 7};
++ int32_t exp2[] = {2, 4, 6, 8};
++ int32x4_t expect1 = vld1q_s32 (exp1);
++ int32x4_t expect2 = vld1q_s32 (exp2);
++
++ for (i = 0; i < 4; i++)
++ if ((result.val[0][i] != expect1[i]) || (result.val[1][i] != expect2[i]))
++ abort ();
++
++ return 0;
++}
+--- a/src/gcc/testsuite/gcc.target/aarch64/simd/vzipu32_1.c
++++ b/src/gcc/testsuite/gcc.target/aarch64/simd/vzipu32_1.c
@@ -0,0 +1,11 @@
-+/* Test the `vzipq_s16' AArch64 SIMD intrinsic. */
++/* Test the `vzip_u32' AArch64 SIMD intrinsic. */
+
+/* { dg-do run } */
+/* { dg-options "-save-temps -fno-inline" } */
+
+#include <arm_neon.h>
-+#include "vzipqs16.x"
++#include "vzipu32.x"
+
-+/* { dg-final { scan-assembler-times "zip1\[ \t\]+v\[0-9\]+\.8h, ?v\[0-9\]+\.8h, ?v\[0-9\]+\.8h!?\(?:\[ \t\]+@\[a-zA-Z0-9 \]+\)?\n" 1 } } */
-+/* { dg-final { scan-assembler-times "zip2\[ \t\]+v\[0-9\]+\.8h, ?v\[0-9\]+\.8h, ?v\[0-9\]+\.8h!?\(?:\[ \t\]+@\[a-zA-Z0-9 \]+\)?\n" 1 } } */
++/* { dg-final { scan-assembler-times "zip1\[ \t\]+v\[0-9\]+\.2s, ?v\[0-9\]+\.2s, ?v\[0-9\]+\.2s!?\(?:\[ \t\]+@\[a-zA-Z0-9 \]+\)?\n" 1 } } */
++/* { dg-final { scan-assembler-times "zip2\[ \t\]+v\[0-9\]+\.2s, ?v\[0-9\]+\.2s, ?v\[0-9\]+\.2s!?\(?:\[ \t\]+@\[a-zA-Z0-9 \]+\)?\n" 1 } } */
+/* { dg-final { cleanup-saved-temps } } */
---- a/src/gcc/testsuite/gcc.target/aarch64/simd/vzipqu16_1.c
-+++ b/src/gcc/testsuite/gcc.target/aarch64/simd/vzipqu16_1.c
+--- a/src/gcc/testsuite/gcc.target/aarch64/simd/vrev32p16.x
++++ b/src/gcc/testsuite/gcc.target/aarch64/simd/vrev32p16.x
+@@ -0,0 +1,22 @@
++extern void abort (void);
++
++poly16x4_t
++test_vrev32p16 (poly16x4_t _arg)
++{
++ return vrev32_p16 (_arg);
++}
++
++int
++main (int argc, char **argv)
++{
++ int i;
++ poly16x4_t inorder = {1, 2, 3, 4};
++ poly16x4_t reversed = test_vrev32p16 (inorder);
++ poly16x4_t expected = {2, 1, 4, 3};
++
++ for (i = 0; i < 4; i++)
++ if (reversed[i] != expected[i])
++ abort ();
++ return 0;
++}
++
+--- a/src/gcc/testsuite/gcc.target/aarch64/simd/vuzpqu32.x
++++ b/src/gcc/testsuite/gcc.target/aarch64/simd/vuzpqu32.x
+@@ -0,0 +1,26 @@
++extern void abort (void);
++
++uint32x4x2_t
++test_vuzpqu32 (uint32x4_t _a, uint32x4_t _b)
++{
++ return vuzpq_u32 (_a, _b);
++}
++
++int
++main (int argc, char **argv)
++{
++ int i;
++ uint32_t first[] = {1, 2, 3, 4};
++ uint32_t second[] = {5, 6, 7, 8};
++ uint32x4x2_t result = test_vuzpqu32 (vld1q_u32 (first), vld1q_u32 (second));
++ uint32_t exp1[] = {1, 3, 5, 7};
++ uint32_t exp2[] = {2, 4, 6, 8};
++ uint32x4_t expect1 = vld1q_u32 (exp1);
++ uint32x4_t expect2 = vld1q_u32 (exp2);
++
++ for (i = 0; i < 4; i++)
++ if ((result.val[0][i] != expect1[i]) || (result.val[1][i] != expect2[i]))
++ abort ();
++
++ return 0;
++}
+--- a/src/gcc/testsuite/gcc.target/aarch64/simd/ext_s32_1.c
++++ b/src/gcc/testsuite/gcc.target/aarch64/simd/ext_s32_1.c
+@@ -0,0 +1,10 @@
++/* Test the `vexts32' AArch64 SIMD intrinsic. */
++
++/* { dg-do run } */
++/* { dg-options "-save-temps -O3 -fno-inline" } */
++
++#include "arm_neon.h"
++#include "ext_s32.x"
++
++/* { dg-final { scan-assembler-times "ext\[ \t\]+\[vV\]\[0-9\]+\.8\[bB\], ?\[vV\]\[0-9\]+\.8\[bB\], ?\[vV\]\[0-9\]+\.8\[bB\], ?#\[0-9\]+\(?:.4)?\(?:\[ \t\]+@\[a-zA-Z0-9 \]+\)?\n" 1 } } */
++/* { dg-final { cleanup-saved-temps } } */
+--- a/src/gcc/testsuite/gcc.target/aarch64/simd/vtrnqu8_1.c
++++ b/src/gcc/testsuite/gcc.target/aarch64/simd/vtrnqu8_1.c
@@ -0,0 +1,11 @@
-+/* Test the `vzipq_u16' AArch64 SIMD intrinsic. */
++/* Test the `vtrnq_u8' AArch64 SIMD intrinsic. */
+
+/* { dg-do run } */
+/* { dg-options "-save-temps -fno-inline" } */
+
+#include <arm_neon.h>
-+#include "vzipqu16.x"
++#include "vtrnqu8.x"
+
-+/* { dg-final { scan-assembler-times "zip1\[ \t\]+v\[0-9\]+\.8h, ?v\[0-9\]+\.8h, ?v\[0-9\]+\.8h!?\(?:\[ \t\]+@\[a-zA-Z0-9 \]+\)?\n" 1 } } */
-+/* { dg-final { scan-assembler-times "zip2\[ \t\]+v\[0-9\]+\.8h, ?v\[0-9\]+\.8h, ?v\[0-9\]+\.8h!?\(?:\[ \t\]+@\[a-zA-Z0-9 \]+\)?\n" 1 } } */
++/* { dg-final { scan-assembler-times "trn1\[ \t\]+v\[0-9\]+\.16b, ?v\[0-9\]+\.16b, ?v\[0-9\]+\.16b!?\(?:\[ \t\]+@\[a-zA-Z0-9 \]+\)?\n" 1 } } */
++/* { dg-final { scan-assembler-times "trn2\[ \t\]+v\[0-9\]+\.16b, ?v\[0-9\]+\.16b, ?v\[0-9\]+\.16b!?\(?:\[ \t\]+@\[a-zA-Z0-9 \]+\)?\n" 1 } } */
+/* { dg-final { cleanup-saved-temps } } */
---- a/src/gcc/testsuite/gcc.target/aarch64/simd/vzipp8.x
-+++ b/src/gcc/testsuite/gcc.target/aarch64/simd/vzipp8.x
+--- a/src/gcc/testsuite/gcc.target/aarch64/simd/vrev32qs8.x
++++ b/src/gcc/testsuite/gcc.target/aarch64/simd/vrev32qs8.x
+@@ -0,0 +1,22 @@
++extern void abort (void);
++
++int8x16_t
++test_vrev32qs8 (int8x16_t _arg)
++{
++ return vrev32q_s8 (_arg);
++}
++
++int
++main (int argc, char **argv)
++{
++ int i;
++ int8x16_t inorder = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16};
++ int8x16_t reversed = test_vrev32qs8 (inorder);
++ int8x16_t expected = {4, 3, 2, 1, 8, 7, 6, 5, 12, 11, 10, 9, 16, 15, 14, 13};
++
++ for (i = 0; i < 16; i++)
++ if (reversed[i] != expected[i])
++ abort ();
++ return 0;
++}
++
+--- a/src/gcc/testsuite/gcc.target/aarch64/simd/vrev16qs8.x
++++ b/src/gcc/testsuite/gcc.target/aarch64/simd/vrev16qs8.x
+@@ -0,0 +1,22 @@
++extern void abort (void);
++
++int8x16_t
++test_vrev16qs8 (int8x16_t _arg)
++{
++ return vrev16q_s8 (_arg);
++}
++
++int
++main (int argc, char **argv)
++{
++ int i;
++ int8x16_t inorder = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16};
++ int8x16_t reversed = test_vrev16qs8 (inorder);
++ int8x16_t expected = {2, 1, 4, 3, 6, 5, 8, 7, 10, 9, 12, 11, 14, 13, 16, 15};
++
++ for (i = 0; i < 16; i++)
++ if (reversed[i] != expected[i])
++ abort ();
++ return 0;
++}
++
+--- a/src/gcc/testsuite/gcc.target/aarch64/simd/vrev64s16.x
++++ b/src/gcc/testsuite/gcc.target/aarch64/simd/vrev64s16.x
+@@ -0,0 +1,22 @@
++extern void abort (void);
++
++int16x4_t
++test_vrev64s16 (int16x4_t _arg)
++{
++ return vrev64_s16 (_arg);
++}
++
++int
++main (int argc, char **argv)
++{
++ int i;
++ int16x4_t inorder = {1, 2, 3, 4};
++ int16x4_t reversed = test_vrev64s16 (inorder);
++ int16x4_t expected = {4, 3, 2, 1};
++
++ for (i = 0; i < 4; i++)
++ if (reversed[i] != expected[i])
++ abort ();
++ return 0;
++}
++
+--- a/src/gcc/testsuite/gcc.target/aarch64/simd/extq_s8_1.c
++++ b/src/gcc/testsuite/gcc.target/aarch64/simd/extq_s8_1.c
+@@ -0,0 +1,10 @@
++/* Test the `vextQs8' AArch64 SIMD intrinsic. */
++
++/* { dg-do run } */
++/* { dg-options "-save-temps -O3 -fno-inline" } */
++
++#include "arm_neon.h"
++#include "extq_s8.x"
++
++/* { dg-final { scan-assembler-times "ext\[ \t\]+\[vV\]\[0-9\]+\.16\[bB\], ?\[vV\]\[0-9\]+\.16\[bB\], ?\[vV\]\[0-9\]+\.16\[bB\], ?#?\[0-9\]+\(?:.2\)?\(?:\[ \t\]+@\[a-zA-Z0-9 \]+\)?\n" 15 } } */
++/* { dg-final { cleanup-saved-temps } } */
+--- a/src/gcc/testsuite/gcc.target/aarch64/simd/vrev64u16.x
++++ b/src/gcc/testsuite/gcc.target/aarch64/simd/vrev64u16.x
+@@ -0,0 +1,22 @@
++extern void abort (void);
++
++uint16x4_t
++test_vrev64u16 (uint16x4_t _arg)
++{
++ return vrev64_u16 (_arg);
++}
++
++int
++main (int argc, char **argv)
++{
++ int i;
++ uint16x4_t inorder = {1, 2, 3, 4};
++ uint16x4_t reversed = test_vrev64u16 (inorder);
++ uint16x4_t expected = {4, 3, 2, 1};
++
++ for (i = 0; i < 4; i++)
++ if (reversed[i] != expected[i])
++ abort ();
++ return 0;
++}
++
+--- a/src/gcc/testsuite/gcc.target/aarch64/simd/vuzpp16.x
++++ b/src/gcc/testsuite/gcc.target/aarch64/simd/vuzpp16.x
+@@ -0,0 +1,26 @@
++extern void abort (void);
++
++poly16x4x2_t
++test_vuzpp16 (poly16x4_t _a, poly16x4_t _b)
++{
++ return vuzp_p16 (_a, _b);
++}
++
++int
++main (int argc, char **argv)
++{
++ int i;
++ poly16_t first[] = {1, 2, 3, 4};
++ poly16_t second[] = {5, 6, 7, 8};
++ poly16x4x2_t result = test_vuzpp16 (vld1_p16 (first), vld1_p16 (second));
++ poly16_t exp1[] = {1, 3, 5, 7};
++ poly16_t exp2[] = {2, 4, 6, 8};
++ poly16x4_t expect1 = vld1_p16 (exp1);
++ poly16x4_t expect2 = vld1_p16 (exp2);
++
++ for (i = 0; i < 4; i++)
++ if ((result.val[0][i] != expect1[i]) || (result.val[1][i] != expect2[i]))
++ abort ();
++
++ return 0;
++}
+--- a/src/gcc/testsuite/gcc.target/aarch64/simd/vuzpqf32_1.c
++++ b/src/gcc/testsuite/gcc.target/aarch64/simd/vuzpqf32_1.c
+@@ -0,0 +1,11 @@
++/* Test the `vuzpq_f32' AArch64 SIMD intrinsic. */
++
++/* { dg-do run } */
++/* { dg-options "-save-temps -fno-inline" } */
++
++#include <arm_neon.h>
++#include "vuzpqf32.x"
++
++/* { dg-final { scan-assembler-times "uzp1\[ \t\]+v\[0-9\]+\.4s, ?v\[0-9\]+\.4s, ?v\[0-9\]+\.4s!?\(?:\[ \t\]+@\[a-zA-Z0-9 \]+\)?\n" 1 } } */
++/* { dg-final { scan-assembler-times "uzp2\[ \t\]+v\[0-9\]+\.4s, ?v\[0-9\]+\.4s, ?v\[0-9\]+\.4s!?\(?:\[ \t\]+@\[a-zA-Z0-9 \]+\)?\n" 1 } } */
++/* { dg-final { cleanup-saved-temps } } */
+--- a/src/gcc/testsuite/gcc.target/aarch64/simd/vzipp8_1.c
++++ b/src/gcc/testsuite/gcc.target/aarch64/simd/vzipp8_1.c
+@@ -0,0 +1,11 @@
++/* Test the `vzip_p8' AArch64 SIMD intrinsic. */
++
++/* { dg-do run } */
++/* { dg-options "-save-temps -fno-inline" } */
++
++#include <arm_neon.h>
++#include "vzipp8.x"
++
++/* { dg-final { scan-assembler-times "zip1\[ \t\]+v\[0-9\]+\.8b, ?v\[0-9\]+\.8b, ?v\[0-9\]+\.8b!?\(?:\[ \t\]+@\[a-zA-Z0-9 \]+\)?\n" 1 } } */
++/* { dg-final { scan-assembler-times "zip2\[ \t\]+v\[0-9\]+\.8b, ?v\[0-9\]+\.8b, ?v\[0-9\]+\.8b!?\(?:\[ \t\]+@\[a-zA-Z0-9 \]+\)?\n" 1 } } */
++/* { dg-final { cleanup-saved-temps } } */
+--- a/src/gcc/testsuite/gcc.target/aarch64/simd/vtrnqp16_1.c
++++ b/src/gcc/testsuite/gcc.target/aarch64/simd/vtrnqp16_1.c
+@@ -0,0 +1,11 @@
++/* Test the `vtrnq_p16' AArch64 SIMD intrinsic. */
++
++/* { dg-do run } */
++/* { dg-options "-save-temps -fno-inline" } */
++
++#include <arm_neon.h>
++#include "vtrnqp16.x"
++
++/* { dg-final { scan-assembler-times "trn1\[ \t\]+v\[0-9\]+\.8h, ?v\[0-9\]+\.8h, ?v\[0-9\]+\.8h!?\(?:\[ \t\]+@\[a-zA-Z0-9 \]+\)?\n" 1 } } */
++/* { dg-final { scan-assembler-times "trn2\[ \t\]+v\[0-9\]+\.8h, ?v\[0-9\]+\.8h, ?v\[0-9\]+\.8h!?\(?:\[ \t\]+@\[a-zA-Z0-9 \]+\)?\n" 1 } } */
++/* { dg-final { cleanup-saved-temps } } */
+--- a/src/gcc/testsuite/gcc.target/aarch64/simd/vrev32qp16.x
++++ b/src/gcc/testsuite/gcc.target/aarch64/simd/vrev32qp16.x
+@@ -0,0 +1,22 @@
++extern void abort (void);
++
++poly16x8_t
++test_vrev32qp16 (poly16x8_t _arg)
++{
++ return vrev32q_p16 (_arg);
++}
++
++int
++main (int argc, char **argv)
++{
++ int i;
++ poly16x8_t inorder = {1, 2, 3, 4, 5, 6, 7, 8};
++ poly16x8_t reversed = test_vrev32qp16 (inorder);
++ poly16x8_t expected = {2, 1, 4, 3, 6, 5, 8, 7};
++
++ for (i = 0; i < 8; i++)
++ if (reversed[i] != expected[i])
++ abort ();
++ return 0;
++}
++
+--- a/src/gcc/testsuite/gcc.target/aarch64/simd/vtrnqu32_1.c
++++ b/src/gcc/testsuite/gcc.target/aarch64/simd/vtrnqu32_1.c
+@@ -0,0 +1,11 @@
++/* Test the `vtrnq_u32' AArch64 SIMD intrinsic. */
++
++/* { dg-do run } */
++/* { dg-options "-save-temps -fno-inline" } */
++
++#include <arm_neon.h>
++#include "vtrnqu32.x"
++
++/* { dg-final { scan-assembler-times "trn1\[ \t\]+v\[0-9\]+\.4s, ?v\[0-9\]+\.4s, ?v\[0-9\]+\.4s!?\(?:\[ \t\]+@\[a-zA-Z0-9 \]+\)?\n" 1 } } */
++/* { dg-final { scan-assembler-times "trn2\[ \t\]+v\[0-9\]+\.4s, ?v\[0-9\]+\.4s, ?v\[0-9\]+\.4s!?\(?:\[ \t\]+@\[a-zA-Z0-9 \]+\)?\n" 1 } } */
++/* { dg-final { cleanup-saved-temps } } */
+--- a/src/gcc/testsuite/gcc.target/aarch64/simd/vuzpqs8.x
++++ b/src/gcc/testsuite/gcc.target/aarch64/simd/vuzpqs8.x
@@ -0,0 +1,27 @@
+extern void abort (void);
+
-+poly8x8x2_t
-+test_vzipp8 (poly8x8_t _a, poly8x8_t _b)
++int8x16x2_t
++test_vuzpqs8 (int8x16_t _a, int8x16_t _b)
+{
-+ return vzip_p8 (_a, _b);
++ return vuzpq_s8 (_a, _b);
+}
+
+int
+main (int argc, char **argv)
+{
+ int i;
-+ poly8_t first[] = {1, 2, 3, 4, 5, 6, 7, 8};
-+ poly8_t second[] = {9, 10, 11, 12, 13, 14, 15, 16};
-+ poly8x8x2_t result = test_vzipp8 (vld1_p8 (first), vld1_p8 (second));
-+ poly8x8_t res1 = result.val[0], res2 = result.val[1];
-+ poly8_t exp1[] = {1, 9, 2, 10, 3, 11, 4, 12};
-+ poly8_t exp2[] = {5, 13, 6, 14, 7, 15, 8, 16};
-+ poly8x8_t expected1 = vld1_p8 (exp1);
-+ poly8x8_t expected2 = vld1_p8 (exp2);
++ int8_t first[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16};
++ int8_t second[] =
++ {17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32};
++ int8x16x2_t result = test_vuzpqs8 (vld1q_s8 (first), vld1q_s8 (second));
++ int8_t exp1[] = {1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29, 31};
++ int8_t exp2[] = {2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32};
++ int8x16_t expect1 = vld1q_s8 (exp1);
++ int8x16_t expect2 = vld1q_s8 (exp2);
++
++ for (i = 0; i < 16; i++)
++ if ((result.val[0][i] != expect1[i]) || (result.val[1][i] != expect2[i]))
++ abort ();
++
++ return 0;
++}
+--- a/src/gcc/testsuite/gcc.target/aarch64/simd/vzipqs32.x
++++ b/src/gcc/testsuite/gcc.target/aarch64/simd/vzipqs32.x
+@@ -0,0 +1,27 @@
++extern void abort (void);
++
++int32x4x2_t
++test_vzipqs32 (int32x4_t _a, int32x4_t _b)
++{
++ return vzipq_s32 (_a, _b);
++}
++
++int
++main (int argc, char **argv)
++{
++ int i;
++ int32_t first[] = {1, 2, 3, 4};
++ int32_t second[] = {5, 6, 7, 8};
++ int32x4x2_t result = test_vzipqs32 (vld1q_s32 (first), vld1q_s32 (second));
++ int32x4_t res1 = result.val[0], res2 = result.val[1];
++ int32_t exp1[] = {1, 5, 2, 6};
++ int32_t exp2[] = {3, 7, 4, 8};
++ int32x4_t expected1 = vld1q_s32 (exp1);
++ int32x4_t expected2 = vld1q_s32 (exp2);
++
++ for (i = 0; i < 4; i++)
++ if ((res1[i] != expected1[i]) || (res2[i] != expected2[i]))
++ abort ();
++
++ return 0;
++}
+--- a/src/gcc/testsuite/gcc.target/aarch64/simd/vrev64qs16_1.c
++++ b/src/gcc/testsuite/gcc.target/aarch64/simd/vrev64qs16_1.c
+@@ -0,0 +1,10 @@
++/* Test the `vrev64q_s16' AArch64 SIMD intrinsic. */
++
++/* { dg-do run } */
++/* { dg-options "-save-temps -fno-inline" } */
++
++#include <arm_neon.h>
++#include "vrev64qs16.x"
++
++/* { dg-final { scan-assembler-times "rev64\[ \t\]+v\[0-9\]+.8h, ?v\[0-9\]+.8h!?\(?:\[ \t\]+@\[a-zA-Z0-9 \]+\)?\n" 1 } } */
++/* { dg-final { cleanup-saved-temps } } */
+--- a/src/gcc/testsuite/gcc.target/aarch64/simd/vrev32s8.x
++++ b/src/gcc/testsuite/gcc.target/aarch64/simd/vrev32s8.x
+@@ -0,0 +1,22 @@
++extern void abort (void);
++
++int8x8_t
++test_vrev32s8 (int8x8_t _arg)
++{
++ return vrev32_s8 (_arg);
++}
++
++int
++main (int argc, char **argv)
++{
++ int i;
++ int8x8_t inorder = {1, 2, 3, 4, 5, 6, 7, 8};
++ int8x8_t reversed = test_vrev32s8 (inorder);
++ int8x8_t expected = {4, 3, 2, 1, 8, 7, 6, 5};
+
+ for (i = 0; i < 8; i++)
++ if (reversed[i] != expected[i])
++ abort ();
++ return 0;
++}
++
+--- a/src/gcc/testsuite/gcc.target/aarch64/simd/extq_p16_1.c
++++ b/src/gcc/testsuite/gcc.target/aarch64/simd/extq_p16_1.c
+@@ -0,0 +1,10 @@
++/* Test the `vextQp16' AArch64 SIMD intrinsic. */
++
++/* { dg-do run } */
++/* { dg-options "-save-temps -O3 -fno-inline" } */
++
++#include "arm_neon.h"
++#include "extq_p16.x"
++
++/* { dg-final { scan-assembler-times "ext\[ \t\]+\[vV\]\[0-9\]+\.16\[bB\], ?\[vV\]\[0-9\]+\.16\[bB\], ?\[vV\]\[0-9\]+\.16\[bB\], ?#\[0-9\]+\(?:.2\)?\(?:\[ \t\]+@\[a-zA-Z0-9 \]+\)?\n" 7 } } */
++/* { dg-final { cleanup-saved-temps } } */
+--- a/src/gcc/testsuite/gcc.target/aarch64/simd/vzipqu32.x
++++ b/src/gcc/testsuite/gcc.target/aarch64/simd/vzipqu32.x
+@@ -0,0 +1,27 @@
++extern void abort (void);
++
++uint32x4x2_t
++test_vzipqu32 (uint32x4_t _a, uint32x4_t _b)
++{
++ return vzipq_u32 (_a, _b);
++}
++
++int
++main (int argc, char **argv)
++{
++ int i;
++ uint32_t first[] = {1, 2, 3, 4};
++ uint32_t second[] = {5, 6, 7, 8};
++ uint32x4x2_t result = test_vzipqu32 (vld1q_u32 (first), vld1q_u32 (second));
++ uint32x4_t res1 = result.val[0], res2 = result.val[1];
++ uint32_t exp1[] = {1, 5, 2, 6};
++ uint32_t exp2[] = {3, 7, 4, 8};
++ uint32x4_t expected1 = vld1q_u32 (exp1);
++ uint32x4_t expected2 = vld1q_u32 (exp2);
++
++ for (i = 0; i < 4; i++)
++ if ((res1[i] != expected1[i]) || (res2[i] != expected2[i]))
++ abort ();
++
++ return 0;
++}
+--- a/src/gcc/testsuite/gcc.target/aarch64/simd/extq_u32_1.c
++++ b/src/gcc/testsuite/gcc.target/aarch64/simd/extq_u32_1.c
+@@ -0,0 +1,10 @@
++/* Test the `vextQu32' AArch64 SIMD intrinsic. */
++
++/* { dg-do run } */
++/* { dg-options "-save-temps -O3 -fno-inline" } */
++
++#include "arm_neon.h"
++#include "extq_u32.x"
++
++/* { dg-final { scan-assembler-times "ext\[ \t\]+\[vV\]\[0-9\]+\.16\[bB\], ?\[vV\]\[0-9\]+\.16\[bB\], ?\[vV\]\[0-9\]+\.16\[bB\], ?#\[0-9\]+\(?:.4)?\(?:\[ \t\]+@\[a-zA-Z0-9 \]+\)?\n" 3 } } */
++/* { dg-final { cleanup-saved-temps } } */
+--- a/src/gcc/testsuite/gcc.target/aarch64/simd/vrev32p16_1.c
++++ b/src/gcc/testsuite/gcc.target/aarch64/simd/vrev32p16_1.c
+@@ -0,0 +1,10 @@
++/* Test the `vrev32_p16' AArch64 SIMD intrinsic. */
++
++/* { dg-do run } */
++/* { dg-options "-save-temps -fno-inline" } */
++
++#include <arm_neon.h>
++#include "vrev32p16.x"
++
++/* { dg-final { scan-assembler-times "rev32\[ \t\]+v\[0-9\]+.4h, ?v\[0-9\]+.4h!?\(?:\[ \t\]+@\[a-zA-Z0-9 \]+\)?\n" 1 } } */
++/* { dg-final { cleanup-saved-temps } } */
+--- a/src/gcc/testsuite/gcc.target/aarch64/simd/ext_f32.x
++++ b/src/gcc/testsuite/gcc.target/aarch64/simd/ext_f32.x
+@@ -0,0 +1,30 @@
++extern void abort (void);
++
++float32x2_t
++test_vext_f32_1 (float32x2_t a, float32x2_t b)
++{
++ return vext_f32 (a, b, 1);
++}
++
++int
++main (int argc, char **argv)
++{
++ int i, off;
++ float32_t arr1[] = {0, 1};
++ float32x2_t in1 = vld1_f32 (arr1);
++ float32_t arr2[] = {2, 3};
++ float32x2_t in2 = vld1_f32 (arr2);
++ float32_t exp[2];
++ float32x2_t expected;
++ float32x2_t actual = test_vext_f32_1 (in1, in2);
++
++ for (i = 0; i < 2; i++)
++ exp[i] = i + 1;
++ expected = vld1_f32 (exp);
++ for (i = 0; i < 2; i++)
++ if (actual[i] != expected[i])
++ abort ();
++
++ return 0;
++}
++
+--- a/src/gcc/testsuite/gcc.target/aarch64/simd/ext_f64_1.c
++++ b/src/gcc/testsuite/gcc.target/aarch64/simd/ext_f64_1.c
+@@ -0,0 +1,25 @@
++/* Test the `vextf64' AArch64 SIMD intrinsic. */
++
++/* { dg-do run } */
++/* { dg-options "-save-temps -O3 -fno-inline" } */
++
++#include "arm_neon.h"
++
++extern void abort (void);
++
++int
++main (int argc, char **argv)
++{
++ int i, off;
++ float64x1_t in1 = {0};
++ float64x1_t in2 = {1};
++ float64x1_t actual = vext_f64 (in1, in2, 0);
++ if (actual != in1)
++ abort ();
++
++ return 0;
++}
++
++/* Do not scan-assembler. An EXT instruction could be emitted, but would merely
++ return its first argument, so it is legitimate to optimize it out. */
++/* { dg-final { cleanup-saved-temps } } */
+--- a/src/gcc/testsuite/gcc.target/aarch64/simd/vuzpf32_1.c
++++ b/src/gcc/testsuite/gcc.target/aarch64/simd/vuzpf32_1.c
+@@ -0,0 +1,11 @@
++/* Test the `vuzp_f32' AArch64 SIMD intrinsic. */
++
++/* { dg-do run } */
++/* { dg-options "-save-temps -fno-inline" } */
++
++#include <arm_neon.h>
++#include "vuzpf32.x"
++
++/* { dg-final { scan-assembler-times "zip1\[ \t\]+v\[0-9\]+\.2s, ?v\[0-9\]+\.2s, ?v\[0-9\]+\.2s!?\(?:\[ \t\]+@\[a-zA-Z0-9 \]+\)?\n" 1 } } */
++/* { dg-final { scan-assembler-times "zip2\[ \t\]+v\[0-9\]+\.2s, ?v\[0-9\]+\.2s, ?v\[0-9\]+\.2s!?\(?:\[ \t\]+@\[a-zA-Z0-9 \]+\)?\n" 1 } } */
++/* { dg-final { cleanup-saved-temps } } */
+--- a/src/gcc/testsuite/gcc.target/aarch64/simd/vuzpqu16_1.c
++++ b/src/gcc/testsuite/gcc.target/aarch64/simd/vuzpqu16_1.c
+@@ -0,0 +1,11 @@
++/* Test the `vuzpq_u16' AArch64 SIMD intrinsic. */
++
++/* { dg-do run } */
++/* { dg-options "-save-temps -fno-inline" } */
++
++#include <arm_neon.h>
++#include "vuzpqu16.x"
++
++/* { dg-final { scan-assembler-times "uzp1\[ \t\]+v\[0-9\]+\.8h, ?v\[0-9\]+\.8h, ?v\[0-9\]+\.8h!?\(?:\[ \t\]+@\[a-zA-Z0-9 \]+\)?\n" 1 } } */
++/* { dg-final { scan-assembler-times "uzp2\[ \t\]+v\[0-9\]+\.8h, ?v\[0-9\]+\.8h, ?v\[0-9\]+\.8h!?\(?:\[ \t\]+@\[a-zA-Z0-9 \]+\)?\n" 1 } } */
++/* { dg-final { cleanup-saved-temps } } */
+--- a/src/gcc/testsuite/gcc.target/aarch64/simd/vuzpu8_1.c
++++ b/src/gcc/testsuite/gcc.target/aarch64/simd/vuzpu8_1.c
+@@ -0,0 +1,11 @@
++/* Test the `vuzp_u8' AArch64 SIMD intrinsic. */
++
++/* { dg-do run } */
++/* { dg-options "-save-temps -fno-inline" } */
++
++#include <arm_neon.h>
++#include "vuzpu8.x"
++
++/* { dg-final { scan-assembler-times "uzp1\[ \t\]+v\[0-9\]+\.8b, ?v\[0-9\]+\.8b, ?v\[0-9\]+\.8b!?\(?:\[ \t\]+@\[a-zA-Z0-9 \]+\)?\n" 1 } } */
++/* { dg-final { scan-assembler-times "uzp2\[ \t\]+v\[0-9\]+\.8b, ?v\[0-9\]+\.8b, ?v\[0-9\]+\.8b!?\(?:\[ \t\]+@\[a-zA-Z0-9 \]+\)?\n" 1 } } */
++/* { dg-final { cleanup-saved-temps } } */
+--- a/src/gcc/testsuite/gcc.target/aarch64/simd/vzipqf32_1.c
++++ b/src/gcc/testsuite/gcc.target/aarch64/simd/vzipqf32_1.c
+@@ -0,0 +1,11 @@
++/* Test the `vzipq_f32' AArch64 SIMD intrinsic. */
++
++/* { dg-do run } */
++/* { dg-options "-save-temps -fno-inline" } */
++
++#include <arm_neon.h>
++#include "vzipqf32.x"
++
++/* { dg-final { scan-assembler-times "zip1\[ \t\]+v\[0-9\]+\.4s, ?v\[0-9\]+\.4s, ?v\[0-9\]+\.4s!?\(?:\[ \t\]+@\[a-zA-Z0-9 \]+\)?\n" 1 } } */
++/* { dg-final { scan-assembler-times "zip2\[ \t\]+v\[0-9\]+\.4s, ?v\[0-9\]+\.4s, ?v\[0-9\]+\.4s!?\(?:\[ \t\]+@\[a-zA-Z0-9 \]+\)?\n" 1 } } */
++/* { dg-final { cleanup-saved-temps } } */
+--- a/src/gcc/testsuite/gcc.target/aarch64/simd/vrev64s16_1.c
++++ b/src/gcc/testsuite/gcc.target/aarch64/simd/vrev64s16_1.c
+@@ -0,0 +1,10 @@
++/* Test the `vrev64_s16' AArch64 SIMD intrinsic. */
++
++/* { dg-do run } */
++/* { dg-options "-save-temps -fno-inline" } */
++
++#include <arm_neon.h>
++#include "vrev64s16.x"
++
++/* { dg-final { scan-assembler-times "rev64\[ \t\]+v\[0-9\]+.4h, ?v\[0-9\]+.4h!?\(?:\[ \t\]+@\[a-zA-Z0-9 \]+\)?\n" 1 } } */
++/* { dg-final { cleanup-saved-temps } } */
+--- a/src/gcc/testsuite/gcc.target/aarch64/simd/vtrns32.x
++++ b/src/gcc/testsuite/gcc.target/aarch64/simd/vtrns32.x
+@@ -0,0 +1,27 @@
++extern void abort (void);
++
++int32x2x2_t
++test_vtrns32 (int32x2_t _a, int32x2_t _b)
++{
++ return vtrn_s32 (_a, _b);
++}
++
++int
++main (int argc, char **argv)
++{
++ int i;
++ int32_t first[] = {1, 2};
++ int32_t second[] = {3, 4};
++ int32x2x2_t result = test_vtrns32 (vld1_s32 (first), vld1_s32 (second));
++ int32x2_t res1 = result.val[0], res2 = result.val[1];
++ int32_t exp1[] = {1, 3};
++ int32_t exp2[] = {2, 4};
++ int32x2_t expected1 = vld1_s32 (exp1);
++ int32x2_t expected2 = vld1_s32 (exp2);
++
++ for (i = 0; i < 2; i++)
+ if ((res1[i] != expected1[i]) || (res2[i] != expected2[i]))
+ abort ();
+
+ return 0;
+}
+--- a/src/gcc/testsuite/gcc.target/aarch64/simd/vrev16qu8_1.c
++++ b/src/gcc/testsuite/gcc.target/aarch64/simd/vrev16qu8_1.c
+@@ -0,0 +1,10 @@
++/* Test the `vrev16q_u8' AArch64 SIMD intrinsic. */
++
++/* { dg-do run } */
++/* { dg-options "-save-temps -fno-inline" } */
++
++#include <arm_neon.h>
++#include "vrev16qu8.x"
++
++/* { dg-final { scan-assembler-times "rev16\[ \t\]+v\[0-9\]+.16b, ?v\[0-9\]+.16b!?\(?:\[ \t\]+@\[a-zA-Z0-9 \]+\)?\n" 1 } } */
++/* { dg-final { cleanup-saved-temps } } */
+--- a/src/gcc/testsuite/gcc.target/aarch64/simd/vzips16.x
++++ b/src/gcc/testsuite/gcc.target/aarch64/simd/vzips16.x
+@@ -0,0 +1,27 @@
++extern void abort (void);
++
++int16x4x2_t
++test_vzips16 (int16x4_t _a, int16x4_t _b)
++{
++ return vzip_s16 (_a, _b);
++}
++
++int
++main (int argc, char **argv)
++{
++ int i;
++ int16_t first[] = {1, 2, 3, 4};
++ int16_t second[] = {5, 6, 7, 8};
++ int16x4x2_t result = test_vzips16 (vld1_s16 (first), vld1_s16 (second));
++ int16x4_t res1 = result.val[0], res2 = result.val[1];
++ int16_t exp1[] = {1, 5, 2, 6};
++ int16_t exp2[] = {3, 7, 4, 8};
++ int16x4_t expected1 = vld1_s16 (exp1);
++ int16x4_t expected2 = vld1_s16 (exp2);
++
++ for (i = 0; i < 4; i++)
++ if ((res1[i] != expected1[i]) || (res2[i] != expected2[i]))
++ abort ();
++
++ return 0;
++}
+--- a/src/gcc/testsuite/gcc.target/aarch64/simd/vrev64qs8_1.c
++++ b/src/gcc/testsuite/gcc.target/aarch64/simd/vrev64qs8_1.c
+@@ -0,0 +1,10 @@
++/* Test the `vrev64q_s8' AArch64 SIMD intrinsic. */
++
++/* { dg-do run } */
++/* { dg-options "-save-temps -fno-inline" } */
++
++#include <arm_neon.h>
++#include "vrev64qs8.x"
++
++/* { dg-final { scan-assembler-times "rev64\[ \t\]+v\[0-9\]+.16b, ?v\[0-9\]+.16b!?\(?:\[ \t\]+@\[a-zA-Z0-9 \]+\)?\n" 1 } } */
++/* { dg-final { cleanup-saved-temps } } */
+--- a/src/gcc/testsuite/gcc.target/aarch64/simd/extq_p8_1.c
++++ b/src/gcc/testsuite/gcc.target/aarch64/simd/extq_p8_1.c
+@@ -0,0 +1,10 @@
++/* Test the `vextQp8' AArch64 SIMD intrinsic. */
++
++/* { dg-do run } */
++/* { dg-options "-save-temps -O3 -fno-inline" } */
++
++#include "arm_neon.h"
++#include "extq_p8.x"
++
++/* { dg-final { scan-assembler-times "ext\[ \t\]+\[vV\]\[0-9\]+\.16\[bB\], ?\[vV\]\[0-9\]+\.16\[bB\], ?\[vV\]\[0-9\]+\.16\[bB\], ?#?\[0-9\]+\(?:.2\)?\(?:\[ \t\]+@\[a-zA-Z0-9 \]+\)?\n" 15 } } */
++/* { dg-final { cleanup-saved-temps } } */
+--- a/src/gcc/testsuite/gcc.target/aarch64/simd/vtrnu32.x
++++ b/src/gcc/testsuite/gcc.target/aarch64/simd/vtrnu32.x
+@@ -0,0 +1,27 @@
++extern void abort (void);
++
++uint32x2x2_t
++test_vtrnu32 (uint32x2_t _a, uint32x2_t _b)
++{
++ return vtrn_u32 (_a, _b);
++}
++
++int
++main (int argc, char **argv)
++{
++ int i;
++ uint32_t first[] = {1, 2};
++ uint32_t second[] = {3, 4};
++ uint32x2x2_t result = test_vtrnu32 (vld1_u32 (first), vld1_u32 (second));
++ uint32x2_t res1 = result.val[0], res2 = result.val[1];
++ uint32_t exp1[] = {1, 3};
++ uint32_t exp2[] = {2, 4};
++ uint32x2_t expected1 = vld1_u32 (exp1);
++ uint32x2_t expected2 = vld1_u32 (exp2);
++
++ for (i = 0; i < 2; i++)
++ if ((res1[i] != expected1[i]) || (res2[i] != expected2[i]))
++ abort ();
++
++ return 0;
++}
+--- a/src/gcc/testsuite/gcc.target/aarch64/simd/vzipu16.x
++++ b/src/gcc/testsuite/gcc.target/aarch64/simd/vzipu16.x
+@@ -0,0 +1,27 @@
++extern void abort (void);
++
++uint16x4x2_t
++test_vzipu16 (uint16x4_t _a, uint16x4_t _b)
++{
++ return vzip_u16 (_a, _b);
++}
++
++int
++main (int argc, char **argv)
++{
++ int i;
++ uint16_t first[] = {1, 2, 3, 4};
++ uint16_t second[] = {5, 6, 7, 8};
++ uint16x4x2_t result = test_vzipu16 (vld1_u16 (first), vld1_u16 (second));
++ uint16x4_t res1 = result.val[0], res2 = result.val[1];
++ uint16_t exp1[] = {1, 5, 2, 6};
++ uint16_t exp2[] = {3, 7, 4, 8};
++ uint16x4_t expected1 = vld1_u16 (exp1);
++ uint16x4_t expected2 = vld1_u16 (exp2);
++
++ for (i = 0; i < 4; i++)
++ if ((res1[i] != expected1[i]) || (res2[i] != expected2[i]))
++ abort ();
++
++ return 0;
++}
+--- a/src/gcc/testsuite/gcc.target/aarch64/simd/vuzpu16_1.c
++++ b/src/gcc/testsuite/gcc.target/aarch64/simd/vuzpu16_1.c
+@@ -0,0 +1,11 @@
++/* Test the `vuzp_u16' AArch64 SIMD intrinsic. */
++
++/* { dg-do run } */
++/* { dg-options "-save-temps -fno-inline" } */
++
++#include <arm_neon.h>
++#include "vuzpu16.x"
++
++/* { dg-final { scan-assembler-times "uzp1\[ \t\]+v\[0-9\]+\.4h, ?v\[0-9\]+\.4h, ?v\[0-9\]+\.4h!?\(?:\[ \t\]+@\[a-zA-Z0-9 \]+\)?\n" 1 } } */
++/* { dg-final { scan-assembler-times "uzp2\[ \t\]+v\[0-9\]+\.4h, ?v\[0-9\]+\.4h, ?v\[0-9\]+\.4h!?\(?:\[ \t\]+@\[a-zA-Z0-9 \]+\)?\n" 1 } } */
++/* { dg-final { cleanup-saved-temps } } */
+--- a/src/gcc/testsuite/gcc.target/aarch64/simd/vrev32s8_1.c
++++ b/src/gcc/testsuite/gcc.target/aarch64/simd/vrev32s8_1.c
+@@ -0,0 +1,10 @@
++/* Test the `vrev32_s8' AArch64 SIMD intrinsic. */
++
++/* { dg-do run } */
++/* { dg-options "-save-temps -fno-inline" } */
++
++#include <arm_neon.h>
++#include "vrev32s8.x"
++
++/* { dg-final { scan-assembler-times "rev32\[ \t\]+v\[0-9\]+.8b, ?v\[0-9\]+.8b!?\(?:\[ \t\]+@\[a-zA-Z0-9 \]+\)?\n" 1 } } */
++/* { dg-final { cleanup-saved-temps } } */
+--- a/src/gcc/testsuite/gcc.target/aarch64/simd/vtrnf32_1.c
++++ b/src/gcc/testsuite/gcc.target/aarch64/simd/vtrnf32_1.c
+@@ -0,0 +1,11 @@
++/* Test the `vtrn_f32' AArch64 SIMD intrinsic. */
++
++/* { dg-do run } */
++/* { dg-options "-save-temps -fno-inline" } */
++
++#include <arm_neon.h>
++#include "vtrnf32.x"
++
++/* { dg-final { scan-assembler-times "zip1\[ \t\]+v\[0-9\]+\.2s, ?v\[0-9\]+\.2s, ?v\[0-9\]+\.2s!?\(?:\[ \t\]+@\[a-zA-Z0-9 \]+\)?\n" 1 } } */
++/* { dg-final { scan-assembler-times "zip2\[ \t\]+v\[0-9\]+\.2s, ?v\[0-9\]+\.2s, ?v\[0-9\]+\.2s!?\(?:\[ \t\]+@\[a-zA-Z0-9 \]+\)?\n" 1 } } */
++/* { dg-final { cleanup-saved-temps } } */
+--- a/src/gcc/testsuite/gcc.target/aarch64/simd/vrev32qu16_1.c
++++ b/src/gcc/testsuite/gcc.target/aarch64/simd/vrev32qu16_1.c
+@@ -0,0 +1,10 @@
++/* Test the `vrev32q_u16' AArch64 SIMD intrinsic. */
++
++/* { dg-do run } */
++/* { dg-options "-save-temps -fno-inline" } */
++
++#include <arm_neon.h>
++#include "vrev32qu16.x"
++
++/* { dg-final { scan-assembler-times "rev32\[ \t\]+v\[0-9\]+.8h, ?v\[0-9\]+.8h!?\(?:\[ \t\]+@\[a-zA-Z0-9 \]+\)?\n" 1 } } */
++/* { dg-final { cleanup-saved-temps } } */
+--- a/src/gcc/testsuite/gcc.target/aarch64/simd/vzipqu16_1.c
++++ b/src/gcc/testsuite/gcc.target/aarch64/simd/vzipqu16_1.c
+@@ -0,0 +1,11 @@
++/* Test the `vzipq_u16' AArch64 SIMD intrinsic. */
++
++/* { dg-do run } */
++/* { dg-options "-save-temps -fno-inline" } */
++
++#include <arm_neon.h>
++#include "vzipqu16.x"
++
++/* { dg-final { scan-assembler-times "zip1\[ \t\]+v\[0-9\]+\.8h, ?v\[0-9\]+\.8h, ?v\[0-9\]+\.8h!?\(?:\[ \t\]+@\[a-zA-Z0-9 \]+\)?\n" 1 } } */
++/* { dg-final { scan-assembler-times "zip2\[ \t\]+v\[0-9\]+\.8h, ?v\[0-9\]+\.8h, ?v\[0-9\]+\.8h!?\(?:\[ \t\]+@\[a-zA-Z0-9 \]+\)?\n" 1 } } */
++/* { dg-final { cleanup-saved-temps } } */
--- a/src/gcc/testsuite/gcc.target/aarch64/simd/vzipu8_1.c
+++ b/src/gcc/testsuite/gcc.target/aarch64/simd/vzipu8_1.c
@@ -0,0 +1,11 @@
@@ -4081,56 +12096,99 @@ LANG=C svn diff svn://gcc.gnu.org/svn/gcc/branches/gcc-4_9-branch@211979 \
+/* { dg-final { scan-assembler-times "zip1\[ \t\]+v\[0-9\]+\.8b, ?v\[0-9\]+\.8b, ?v\[0-9\]+\.8b!?\(?:\[ \t\]+@\[a-zA-Z0-9 \]+\)?\n" 1 } } */
+/* { dg-final { scan-assembler-times "zip2\[ \t\]+v\[0-9\]+\.8b, ?v\[0-9\]+\.8b, ?v\[0-9\]+\.8b!?\(?:\[ \t\]+@\[a-zA-Z0-9 \]+\)?\n" 1 } } */
+/* { dg-final { cleanup-saved-temps } } */
---- a/src/gcc/testsuite/gcc.target/aarch64/vqneg_s64_1.c
-+++ b/src/gcc/testsuite/gcc.target/aarch64/vqneg_s64_1.c
-@@ -0,0 +1,47 @@
-+/* Test vqneg_s64 intrinsics work correctly. */
-+/* { dg-do run } */
-+/* { dg-options "--save-temps" } */
-+
-+#include <arm_neon.h>
-+
+--- a/src/gcc/testsuite/gcc.target/aarch64/simd/vtrnqp16.x
++++ b/src/gcc/testsuite/gcc.target/aarch64/simd/vtrnqp16.x
+@@ -0,0 +1,27 @@
+extern void abort (void);
+
-+int __attribute__ ((noinline))
-+test_vqneg_s64 (int64x1_t passed, int64_t expected)
++poly16x8x2_t
++test_vtrnqp16 (poly16x8_t _a, poly16x8_t _b)
+{
-+ return vget_lane_s64 (vqneg_s64 (passed), 0) != expected;
++ return vtrnq_p16 (_a, _b);
+}
+
-+int __attribute__ ((noinline))
-+test_vqnegd_s64 (int64_t passed, int64_t expected)
++int
++main (int argc, char **argv)
+{
-+ return vqnegd_s64 (passed) != expected;
++ int i;
++ poly16_t first[] = {1, 2, 3, 4, 5, 6, 7, 8};
++ poly16_t second[] = {9, 10, 11, 12, 13, 14, 15, 16};
++ poly16x8x2_t result = test_vtrnqp16 (vld1q_p16 (first), vld1q_p16 (second));
++ poly16x8_t res1 = result.val[0], res2 = result.val[1];
++ poly16_t exp1[] = {1, 9, 3, 11, 5, 13, 7, 15};
++ poly16_t exp2[] = {2, 10, 4, 12, 6, 14, 8, 16};
++ poly16x8_t expected1 = vld1q_p16 (exp1);
++ poly16x8_t expected2 = vld1q_p16 (exp2);
++
++ for (i = 0; i < 8; i++)
++ if ((res1[i] != expected1[i]) || (res2[i] != expected2[i]))
++ abort ();
++
++ return 0;
+}
+--- a/src/gcc/testsuite/gcc.target/aarch64/simd/vrev64qp16.x
++++ b/src/gcc/testsuite/gcc.target/aarch64/simd/vrev64qp16.x
+@@ -0,0 +1,22 @@
++extern void abort (void);
+
-+/* { dg-final { scan-assembler-times "sqneg\\td\[0-9\]+, d\[0-9\]+" 2 } } */
++poly16x8_t
++test_vrev64qp16 (poly16x8_t _arg)
++{
++ return vrev64q_p16 (_arg);
++}
+
+int
+main (int argc, char **argv)
+{
-+ /* Basic test. */
-+ if (test_vqneg_s64 (vcreate_s64 (-1), 1))
-+ abort ();
-+ if (test_vqnegd_s64 (-1, 1))
-+ abort ();
++ int i;
++ poly16x8_t inorder = {1, 2, 3, 4, 5, 6, 7, 8};
++ poly16x8_t reversed = test_vrev64qp16 (inorder);
++ poly16x8_t expected = {4, 3, 2, 1, 8, 7, 6, 5};
+
-+ /* Negating max int64_t. */
-+ if (test_vqneg_s64 (vcreate_s64 (0x7fffffffffffffff), 0x8000000000000001))
-+ abort ();
-+ if (test_vqnegd_s64 (0x7fffffffffffffff, 0x8000000000000001))
-+ abort ();
++ for (i = 0; i < 8; i++)
++ if (reversed[i] != expected[i])
++ abort ();
++ return 0;
++}
+
-+ /* Negating min int64_t.
-+ Note, exact negation cannot be represented as int64_t. */
-+ if (test_vqneg_s64 (vcreate_s64 (0x8000000000000000), 0x7fffffffffffffff))
-+ abort ();
-+ if (test_vqnegd_s64 (0x8000000000000000, 0x7fffffffffffffff))
-+ abort ();
+--- a/src/gcc/testsuite/gcc.target/aarch64/simd/ext_f32_1.c
++++ b/src/gcc/testsuite/gcc.target/aarch64/simd/ext_f32_1.c
+@@ -0,0 +1,10 @@
++/* Test the `vextf32' AArch64 SIMD intrinsic. */
++
++/* { dg-do run } */
++/* { dg-options "-save-temps -O3 -fno-inline" } */
++
++#include "arm_neon.h"
++#include "ext_f32.x"
++
++/* { dg-final { scan-assembler-times "ext\[ \t\]+\[vV\]\[0-9\]+\.8\[bB\], ?\[vV\]\[0-9\]+\.8\[bB\], ?\[vV\]\[0-9\]+\.8\[bB\], ?#\[0-9\]+\(?:.4)?\(?:\[ \t\]+@\[a-zA-Z0-9 \]+\)?\n" 1 } } */
++/* { dg-final { cleanup-saved-temps } } */
+--- a/src/gcc/testsuite/gcc.target/aarch64/simd/vrev64f32.x
++++ b/src/gcc/testsuite/gcc.target/aarch64/simd/vrev64f32.x
+@@ -0,0 +1,22 @@
++extern void abort (void);
++
++float32x2_t
++test_vrev64f32 (float32x2_t _arg)
++{
++ return vrev64_f32 (_arg);
++}
++
++int
++main (int argc, char **argv)
++{
++ int i;
++ float32x2_t inorder = {1, 2};
++ float32x2_t reversed = test_vrev64f32 (inorder);
++ float32x2_t expected = {2, 1};
+
++ for (i = 0; i < 2; i++)
++ if (reversed[i] != expected[i])
++ abort ();
+ return 0;
+}
-+/* { dg-final { cleanup-saved-temps } } */
++
--- a/src/gcc/testsuite/gcc.target/aarch64/vdup_lane_1.c
+++ b/src/gcc/testsuite/gcc.target/aarch64/vdup_lane_1.c
@@ -0,0 +1,430 @@
@@ -5273,9 +13331,552 @@ LANG=C svn diff svn://gcc.gnu.org/svn/gcc/branches/gcc-4_9-branch@211979 \
+
+ return 0;
+}
+--- a/src/gcc/testsuite/gcc.target/aarch64/vdup_lane_2.c
++++ b/src/gcc/testsuite/gcc.target/aarch64/vdup_lane_2.c
+@@ -0,0 +1,343 @@
++/* Test vdup_lane intrinsics work correctly. */
++/* { dg-do run } */
++/* { dg-options "-O1 --save-temps" } */
++
++#include <arm_neon.h>
++
++#define force_simd(V1) asm volatile ("" \
++ : "=w"(V1) \
++ : "w"(V1) \
++ : /* No clobbers */)
++
++extern void abort (void);
++
++float32_t __attribute__ ((noinline))
++wrap_vdups_lane_f32_0 (float32x2_t dummy, float32x2_t a)
++{
++ return vdups_lane_f32 (a, 0);
++}
++
++float32_t __attribute__ ((noinline))
++wrap_vdups_lane_f32_1 (float32x2_t a)
++{
++ return vdups_lane_f32 (a, 1);
++}
++
++int __attribute__ ((noinline))
++test_vdups_lane_f32 ()
++{
++ float32x2_t a;
++ float32_t b;
++ float32_t c[2] = { 0.0, 1.0 };
++
++ a = vld1_f32 (c);
++ b = wrap_vdups_lane_f32_0 (a, a);
++ if (c[0] != b)
++ return 1;
++ b = wrap_vdups_lane_f32_1 (a);
++ if (c[1] != b)
++ return 1;
++ return 0;
++}
++
++float64_t __attribute__ ((noinline))
++wrap_vdupd_lane_f64_0 (float64x1_t dummy, float64x1_t a)
++{
++ return vdupd_lane_f64 (a, 0);
++}
++
++int __attribute__ ((noinline))
++test_vdupd_lane_f64 ()
++{
++ float64x1_t a;
++ float64_t b;
++ float64_t c[1] = { 0.0 };
++ a = vld1_f64 (c);
++ b = wrap_vdupd_lane_f64_0 (a, a);
++ if (c[0] != b)
++ return 1;
++ return 0;
++}
++
++int8_t __attribute__ ((noinline))
++wrap_vdupb_lane_s8_0 (int8x8_t dummy, int8x8_t a)
++{
++ int8_t result = vdupb_lane_s8 (a, 0);
++ force_simd (result);
++ return result;
++}
++
++int8_t __attribute__ ((noinline))
++wrap_vdupb_lane_s8_1 (int8x8_t a)
++{
++ int8_t result = vdupb_lane_s8 (a, 1);
++ force_simd (result);
++ return result;
++}
++
++int __attribute__ ((noinline))
++test_vdupb_lane_s8 ()
++{
++ int8x8_t a;
++ int8_t b;
++ int8_t c[8] = { 0, 1, 2, 3, 4, 5, 6, 7 };
++
++ a = vld1_s8 (c);
++ b = wrap_vdupb_lane_s8_0 (a, a);
++ if (c[0] != b)
++ return 1;
++ b = wrap_vdupb_lane_s8_1 (a);
++ if (c[1] != b)
++ return 1;
++
++ return 0;
++}
++
++uint8_t __attribute__ ((noinline))
++wrap_vdupb_lane_u8_0 (uint8x8_t dummy, uint8x8_t a)
++{
++ uint8_t result = vdupb_lane_u8 (a, 0);
++ force_simd (result);
++ return result;
++}
++
++uint8_t __attribute__ ((noinline))
++wrap_vdupb_lane_u8_1 (uint8x8_t a)
++{
++ uint8_t result = vdupb_lane_u8 (a, 1);
++ force_simd (result);
++ return result;
++}
++
++int __attribute__ ((noinline))
++test_vdupb_lane_u8 ()
++{
++ uint8x8_t a;
++ uint8_t b;
++ uint8_t c[8] = { 0, 1, 2, 3, 4, 5, 6, 7 };
++
++ a = vld1_u8 (c);
++ b = wrap_vdupb_lane_u8_0 (a, a);
++ if (c[0] != b)
++ return 1;
++ b = wrap_vdupb_lane_u8_1 (a);
++ if (c[1] != b)
++ return 1;
++ return 0;
++}
++
++int16_t __attribute__ ((noinline))
++wrap_vduph_lane_s16_0 (int16x4_t dummy, int16x4_t a)
++{
++ int16_t result = vduph_lane_s16 (a, 0);
++ force_simd (result);
++ return result;
++}
++
++int16_t __attribute__ ((noinline))
++wrap_vduph_lane_s16_1 (int16x4_t a)
++{
++ int16_t result = vduph_lane_s16 (a, 1);
++ force_simd (result);
++ return result;
++}
++
++int __attribute__ ((noinline))
++test_vduph_lane_s16 ()
++{
++ int16x4_t a;
++ int16_t b;
++ int16_t c[4] = { 0, 1, 2, 3 };
++
++ a = vld1_s16 (c);
++ b = wrap_vduph_lane_s16_0 (a, a);
++ if (c[0] != b)
++ return 1;
++ b = wrap_vduph_lane_s16_1 (a);
++ if (c[1] != b)
++ return 1;
++ return 0;
++}
++
++uint16_t __attribute__ ((noinline))
++wrap_vduph_lane_u16_0 (uint16x4_t dummy, uint16x4_t a)
++{
++ uint16_t result = vduph_lane_u16 (a, 0);
++ force_simd (result);
++ return result;
++}
++
++uint16_t __attribute__ ((noinline))
++wrap_vduph_lane_u16_1 (uint16x4_t a)
++{
++ uint16_t result = vduph_lane_u16 (a, 1);
++ force_simd (result);
++ return result;
++}
++
++int __attribute__ ((noinline))
++test_vduph_lane_u16 ()
++{
++ uint16x4_t a;
++ uint16_t b;
++ uint16_t c[4] = { 0, 1, 2, 3 };
++
++ a = vld1_u16 (c);
++ b = wrap_vduph_lane_u16_0 (a, a);
++ if (c[0] != b)
++ return 1;
++ b = wrap_vduph_lane_u16_1 (a);
++ if (c[1] != b)
++ return 1;
++ return 0;
++}
++
++int32_t __attribute__ ((noinline))
++wrap_vdups_lane_s32_0 (int32x2_t dummy, int32x2_t a)
++{
++ int32_t result = vdups_lane_s32 (a, 0);
++ force_simd (result);
++ return result;
++}
++
++int32_t __attribute__ ((noinline))
++wrap_vdups_lane_s32_1 (int32x2_t a)
++{
++ int32_t result = vdups_lane_s32 (a, 1);
++ force_simd (result);
++ return result;
++}
++
++int __attribute__ ((noinline))
++test_vdups_lane_s32 ()
++{
++ int32x2_t a;
++ int32_t b;
++ int32_t c[2] = { 0, 1 };
++
++ a = vld1_s32 (c);
++ b = wrap_vdups_lane_s32_0 (vcreate_s32 (0), a);
++ if (c[0] != b)
++ return 1;
++ b = wrap_vdups_lane_s32_1 (a);
++ if (c[1] != b)
++ return 1;
++ return 0;
++}
++
++uint32_t __attribute__ ((noinline))
++wrap_vdups_lane_u32_0 (uint32x2_t dummy, uint32x2_t a)
++{
++ uint32_t result = vdups_lane_u32 (a, 0);
++ force_simd (result);
++ return result;
++}
++
++uint32_t __attribute__ ((noinline))
++wrap_vdups_lane_u32_1 (uint32x2_t a)
++{
++ uint32_t result = vdups_lane_u32 (a, 1);
++ force_simd (result);
++ return result;
++}
++
++int __attribute__ ((noinline))
++test_vdups_lane_u32 ()
++{
++ uint32x2_t a;
++ uint32_t b;
++ uint32_t c[2] = { 0, 1 };
++ a = vld1_u32 (c);
++ b = wrap_vdups_lane_u32_0 (a, a);
++ if (c[0] != b)
++ return 1;
++ b = wrap_vdups_lane_u32_1 (a);
++ if (c[1] != b)
++ return 1;
++ return 0;
++}
++
++uint64_t __attribute__ ((noinline))
++wrap_vdupd_lane_u64_0 (uint64x1_t dummy, uint64x1_t a)
++{
++ return vdupd_lane_u64 (a, 0);;
++}
++
++int __attribute__ ((noinline))
++test_vdupd_lane_u64 ()
++{
++ uint64x1_t a;
++ uint64_t b;
++ uint64_t c[1] = { 0 };
++
++ a = vld1_u64 (c);
++ b = wrap_vdupd_lane_u64_0 (a, a);
++ if (c[0] != b)
++ return 1;
++ return 0;
++}
++
++int64_t __attribute__ ((noinline))
++wrap_vdupd_lane_s64_0 (uint64x1_t dummy, int64x1_t a)
++{
++ return vdupd_lane_u64 (a, 0);
++}
++
++int __attribute__ ((noinline))
++test_vdupd_lane_s64 ()
++{
++ int64x1_t a;
++ int64_t b;
++ int64_t c[1] = { 0 };
++
++ a = vld1_s64 (c);
++ b = wrap_vdupd_lane_s64_0 (a, a);
++ if (c[0] != b)
++ return 1;
++ return 0;
++}
++
++int
++main ()
++{
++ if (test_vdups_lane_f32 ())
++ abort ();
++ if (test_vdupd_lane_f64 ())
++ abort ();
++ if (test_vdupb_lane_s8 ())
++ abort ();
++ if (test_vdupb_lane_u8 ())
++ abort ();
++ if (test_vduph_lane_s16 ())
++ abort ();
++ if (test_vduph_lane_u16 ())
++ abort ();
++ if (test_vdups_lane_s32 ())
++ abort ();
++ if (test_vdups_lane_u32 ())
++ abort ();
++ if (test_vdupd_lane_s64 ())
++ abort ();
++ if (test_vdupd_lane_u64 ())
++ abort ();
++ return 0;
++}
++
++/* Asm check for vdupb_lane_s8, vdupb_lane_u8. */
++/* { dg-final { scan-assembler-not "dup\\tb\[0-9\]+, v\[0-9\]+\.b\\\[0\\\]" } } */
++/* { dg-final { scan-assembler-times "dup\\tb\[0-9\]+, v\[0-9\]+\.b\\\[1\\\]" 2 } } */
++
++/* Asm check for vduph_lane_h16, vduph_lane_h16. */
++/* { dg-final { scan-assembler-not "dup\\th\[0-9\]+, v\[0-9\]+\.h\\\[0\\\]" } } */
++/* { dg-final { scan-assembler-times "dup\\th\[0-9\]+, v\[0-9\]+\.h\\\[1\\\]" 2 } } */
++
++/* Asm check for vdups_lane_f32, vdups_lane_s32, vdups_lane_u32. */
++/* Can't generate "dup s<n>, v<m>[0]" for vdups_lane_s32 and vdups_lane_u32. */
++/* { dg-final { scan-assembler-times "dup\\ts\[0-9\]+, v\[0-9\]+\.s\\\[0\\\]" 1} } */
++/* { dg-final { scan-assembler-times "dup\\ts\[0-9\]+, v\[0-9\]+\.s\\\[1\\\]" 3 } } */
++
++/* Asm check for vdupd_lane_f64, vdupd_lane_s64, vdupd_lane_u64. */
++/* Attempts to make the compiler generate vdupd are not practical. */
++/* { dg-final { scan-assembler-not "dup\\td\[0-9\]+, v\[0-9\]+\.d\\\[0\\\]" } }
++
++/* { dg-final { cleanup-saved-temps } } */
+--- a/src/gcc/testsuite/gcc.target/aarch64/tail_indirect_call_1.c
++++ b/src/gcc/testsuite/gcc.target/aarch64/tail_indirect_call_1.c
+@@ -0,0 +1,18 @@
++/* { dg-do compile } */
++/* { dg-options "-O2" } */
++
++typedef void FP (int);
++
++/* { dg-final { scan-assembler "br" } } */
++/* { dg-final { scan-assembler-not "blr" } } */
++void
++f1 (FP fp, int n)
++{
++ (fp) (n);
++}
++
++void
++f2 (int n, FP fp)
++{
++ (fp) (n);
++}
+--- a/src/gcc/testsuite/gcc.target/aarch64/scalar_shift_1.c
++++ b/src/gcc/testsuite/gcc.target/aarch64/scalar_shift_1.c
+@@ -193,7 +193,6 @@
+ return b;
+ }
+ /* { dg-final { scan-assembler "sshr\td\[0-9\]+,\ d\[0-9\]+,\ 63" } } */
+-/* { dg-final { scan-assembler "shl\td\[0-9\]+,\ d\[0-9\]+,\ 1" } } */
+
+ Int32x1
+ test_corners_sisd_si (Int32x1 b)
+@@ -207,7 +206,6 @@
+ return b;
+ }
+ /* { dg-final { scan-assembler "sshr\tv\[0-9\]+\.2s,\ v\[0-9\]+\.2s,\ 31" } } */
+-/* { dg-final { scan-assembler "shl\tv\[0-9\]+\.2s,\ v\[0-9\]+\.2s,\ 1" } } */
+
+
+
+--- a/src/gcc/testsuite/gcc.target/aarch64/vrnd_f64_1.c
++++ b/src/gcc/testsuite/gcc.target/aarch64/vrnd_f64_1.c
+@@ -0,0 +1,105 @@
++/* Test vrnd_f64 works correctly. */
++/* { dg-do run } */
++/* { dg-options "--save-temps" } */
++
++#include "arm_neon.h"
++
++extern void abort (void);
++
++/* Bit offset to round mode field in FPCR. */
++#define RMODE_START 22
++
++#define FPROUNDING_ZERO 3
++
++/* Set RMODE field of FPCR control register
++ to rounding mode passed. */
++void __inline __attribute__ ((__always_inline__))
++set_rounding_mode (uint32_t mode)
++{
++ uint32_t r;
++
++ /* Read current FPCR. */
++ asm volatile ("mrs %[r], fpcr" : [r] "=r" (r) : :);
++
++ /* Clear rmode. */
++ r &= ~(3 << RMODE_START);
++ /* Calculate desired FPCR. */
++ r |= mode << RMODE_START;
++
++ /* Write desired FPCR back. */
++ asm volatile ("msr fpcr, %[r]" : : [r] "r" (r) :);
++}
++
++float64x1_t __attribute__ ((noinline))
++compare_f64 (float64x1_t passed, float64_t expected)
++{
++ return (__builtin_fabs (vget_lane_f64 (passed, 0) - expected)
++ > __DBL_EPSILON__);
++}
++
++void __attribute__ ((noinline))
++run_round_tests (float64x1_t *tests,
++ float64_t expectations[][6])
++{
++ int i;
++
++ for (i = 0; i < 6; i++)
++ {
++ if (compare_f64 (vrnd_f64 (tests[i]), expectations[0][i]))
++ abort ();
++ if (compare_f64 (vrndx_f64 (tests[i]), expectations[1][i]))
++ abort ();
++ if (compare_f64 (vrndp_f64 (tests[i]), expectations[2][i]))
++ abort ();
++ if (compare_f64 (vrndn_f64 (tests[i]), expectations[3][i]))
++ abort ();
++ if (compare_f64 (vrndm_f64 (tests[i]), expectations[4][i]))
++ abort ();
++ if (compare_f64 (vrndi_f64 (tests[i]), expectations[5][i]))
++ abort ();
++ if (compare_f64 (vrnda_f64 (tests[i]), expectations[6][i]))
++ abort ();
++ }
++}
++
++int
++main (int argc, char **argv)
++{
++ float64x1_t tests[6] =
++ {
++ vcreate_f64 (0x3FE0000000000000), /* Hex for: 0.5. */
++ vcreate_f64 (0x3FD999999999999A), /* Hex for: 0.4. */
++ vcreate_f64 (0x3FE3333333333333), /* Hex for: 0.6. */
++ vcreate_f64 (0xBFE0000000000000), /* Hex for: -0.5. */
++ vcreate_f64 (0xBFD999999999999A), /* Hex for: -0.4. */
++ vcreate_f64 (0xBFE3333333333333), /* Hex for: -0.6. */
++ };
++
++ float64_t expectations[7][6] =
++ {
++ { 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 }, /* vrnd - round towards zero. */
++ { 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 }, /* vrndx - round using FPCR mode. */
++ { 1.0, 1.0, 1.0, 0.0, 0.0, 0.0 }, /* vrndp - round to plus infinity. */
++ { 0.0, 0.0, 1.0, 0.0, 0.0, -1.0 }, /* vrndn - round ties to even. */
++ { 0.0, 0.0, 0.0, -1.0, -1.0, -1.0 }, /* vrndm - round to minus infinity. */
++ { 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 }, /* vrndi - round using FPCR mode. */
++ { 1.0, 0.0, 1.0, -1.0, 0.0, -1.0 }, /* vrnda - round ties away from 0. */
++ };
++
++ /* Set floating point control register
++ to have predictable vrndx and vrndi behaviour. */
++ set_rounding_mode (FPROUNDING_ZERO);
++
++ run_round_tests (tests, expectations);
++
++ return 0;
++}
++
++/* { dg-final { scan-assembler-times "frintz\\td\[0-9\]+, d\[0-9\]+" 1 } } */
++/* { dg-final { scan-assembler-times "frintx\\td\[0-9\]+, d\[0-9\]+" 1 } } */
++/* { dg-final { scan-assembler-times "frintp\\td\[0-9\]+, d\[0-9\]+" 1 } } */
++/* { dg-final { scan-assembler-times "frintn\\td\[0-9\]+, d\[0-9\]+" 1 } } */
++/* { dg-final { scan-assembler-times "frintm\\td\[0-9\]+, d\[0-9\]+" 1 } } */
++/* { dg-final { scan-assembler-times "frinti\\td\[0-9\]+, d\[0-9\]+" 1 } } */
++/* { dg-final { scan-assembler-times "frinta\\td\[0-9\]+, d\[0-9\]+" 1 } } */
++/* { dg-final { cleanup-saved-temps } } */
+--- a/src/gcc/testsuite/gcc.target/aarch64/vqneg_s64_1.c
++++ b/src/gcc/testsuite/gcc.target/aarch64/vqneg_s64_1.c
+@@ -0,0 +1,47 @@
++/* Test vqneg_s64 intrinsics work correctly. */
++/* { dg-do run } */
++/* { dg-options "--save-temps" } */
++
++#include <arm_neon.h>
++
++extern void abort (void);
++
++int __attribute__ ((noinline))
++test_vqneg_s64 (int64x1_t passed, int64_t expected)
++{
++ return vget_lane_s64 (vqneg_s64 (passed), 0) != expected;
++}
++
++int __attribute__ ((noinline))
++test_vqnegd_s64 (int64_t passed, int64_t expected)
++{
++ return vqnegd_s64 (passed) != expected;
++}
++
++/* { dg-final { scan-assembler-times "sqneg\\td\[0-9\]+, d\[0-9\]+" 2 } } */
++
++int
++main (int argc, char **argv)
++{
++ /* Basic test. */
++ if (test_vqneg_s64 (vcreate_s64 (-1), 1))
++ abort ();
++ if (test_vqnegd_s64 (-1, 1))
++ abort ();
++
++ /* Negating max int64_t. */
++ if (test_vqneg_s64 (vcreate_s64 (0x7fffffffffffffff), 0x8000000000000001))
++ abort ();
++ if (test_vqnegd_s64 (0x7fffffffffffffff, 0x8000000000000001))
++ abort ();
++
++ /* Negating min int64_t.
++ Note, exact negation cannot be represented as int64_t. */
++ if (test_vqneg_s64 (vcreate_s64 (0x8000000000000000), 0x7fffffffffffffff))
++ abort ();
++ if (test_vqnegd_s64 (0x8000000000000000, 0x7fffffffffffffff))
++ abort ();
++
++ return 0;
++}
++/* { dg-final { cleanup-saved-temps } } */
--- a/src/gcc/testsuite/lib/target-supports.exp
+++ b/src/gcc/testsuite/lib/target-supports.exp
-@@ -3306,6 +3306,24 @@
+@@ -3306,6 +3306,27 @@
return $et_vect_shift_saved
}
@@ -5288,7 +13889,10 @@ LANG=C svn diff svn://gcc.gnu.org/svn/gcc/branches/gcc-4_9-branch@211979 \
+ verbose "check_effective_target_vect_bswap: using cached result" 2
+ } else {
+ set et_vect_bswap_saved 0
-+ if { [istarget aarch64*-*-*] } {
++ if { [istarget aarch64*-*-*]
++ || ([istarget arm*-*-*]
++ && [check_effective_target_arm_neon])
++ } {
+ set et_vect_bswap_saved 1
+ }
+ }
@@ -5300,7 +13904,7 @@ LANG=C svn diff svn://gcc.gnu.org/svn/gcc/branches/gcc-4_9-branch@211979 \
# Return 1 if the target supports hardware vector shift operation for char.
proc check_effective_target_vect_shift_char { } {
-@@ -3504,8 +3522,7 @@
+@@ -3504,8 +3525,7 @@
} else {
set et_vect_perm_saved 0
if { [is-effective-target arm_neon_ok]
@@ -5312,7 +13916,358 @@ LANG=C svn diff svn://gcc.gnu.org/svn/gcc/branches/gcc-4_9-branch@211979 \
|| [istarget i?86-*-*]
--- a/src/gcc/testsuite/ChangeLog.linaro
+++ b/src/gcc/testsuite/ChangeLog.linaro
-@@ -0,0 +1,176 @@
+@@ -0,0 +1,527 @@
++2014-07-17 Yvan Roux <yvan.roux@linaro.org>
++
++ GCC Linaro 4.9-2014.07 released.
++
++2014-07-17 Yvan Roux <yvan.roux@linaro.org>
++
++ Backport from trunk r211887.
++ 2014-06-23 James Greenhalgh <james.greenhalgh@arm.com>
++
++ * gcc.target/aarch64/scalar_shift_1.c: Fix expected assembler.
++
++2014-07-17 Yvan Roux <yvan.roux@linaro.org>
++
++ Backport from trunk r211441.
++ 2014-06-11 Kyrylo Tkachov <kyrylo.tkachov@arm.com>
++
++ * gcc.target/aarch64/acle/acle.exp: New.
++ * gcc.target/aarch64/acle/crc32b.c: New test.
++ * gcc.target/aarch64/acle/crc32cb.c: Likewise.
++ * gcc.target/aarch64/acle/crc32cd.c: Likewise.
++ * gcc.target/aarch64/acle/crc32ch.c: Likewise.
++ * gcc.target/aarch64/acle/crc32cw.c: Likewise.
++ * gcc.target/aarch64/acle/crc32d.c: Likewise.
++ * gcc.target/aarch64/acle/crc32h.c: Likewise.
++ * gcc.target/aarch64/acle/crc32w.c: Likewise.
++
++2014-07-17 Yvan Roux <yvan.roux@linaro.org>
++
++ Backport from trunk r210153.
++ 2014-05-07 Alan Lawrence <alan.lawrence@arm.com>
++
++ * gcc.target/aarch64/simd/vrev16p8_1.c: New file.
++ * gcc.target/aarch64/simd/vrev16p8.x: New file.
++ * gcc.target/aarch64/simd/vrev16qp8_1.c: New file.
++ * gcc.target/aarch64/simd/vrev16qp8.x: New file.
++ * gcc.target/aarch64/simd/vrev16qs8_1.c: New file.
++ * gcc.target/aarch64/simd/vrev16qs8.x: New file.
++ * gcc.target/aarch64/simd/vrev16qu8_1.c: New file.
++ * gcc.target/aarch64/simd/vrev16qu8.x: New file.
++ * gcc.target/aarch64/simd/vrev16s8_1.c: New file.
++ * gcc.target/aarch64/simd/vrev16s8.x: New file.
++ * gcc.target/aarch64/simd/vrev16u8_1.c: New file.
++ * gcc.target/aarch64/simd/vrev16u8.x: New file.
++ * gcc.target/aarch64/simd/vrev32p16_1.c: New file.
++ * gcc.target/aarch64/simd/vrev32p16.x: New file.
++ * gcc.target/aarch64/simd/vrev32p8_1.c: New file.
++ * gcc.target/aarch64/simd/vrev32p8.x: New file.
++ * gcc.target/aarch64/simd/vrev32qp16_1.c: New file.
++ * gcc.target/aarch64/simd/vrev32qp16.x: New file.
++ * gcc.target/aarch64/simd/vrev32qp8_1.c: New file.
++ * gcc.target/aarch64/simd/vrev32qp8.x: New file.
++ * gcc.target/aarch64/simd/vrev32qs16_1.c: New file.
++ * gcc.target/aarch64/simd/vrev32qs16.x: New file.
++ * gcc.target/aarch64/simd/vrev32qs8_1.c: New file.
++ * gcc.target/aarch64/simd/vrev32qs8.x: New file.
++ * gcc.target/aarch64/simd/vrev32qu16_1.c: New file.
++ * gcc.target/aarch64/simd/vrev32qu16.x: New file.
++ * gcc.target/aarch64/simd/vrev32qu8_1.c: New file.
++ * gcc.target/aarch64/simd/vrev32qu8.x: New file.
++ * gcc.target/aarch64/simd/vrev32s16_1.c: New file.
++ * gcc.target/aarch64/simd/vrev32s16.x: New file.
++ * gcc.target/aarch64/simd/vrev32s8_1.c: New file.
++ * gcc.target/aarch64/simd/vrev32s8.x: New file.
++ * gcc.target/aarch64/simd/vrev32u16_1.c: New file.
++ * gcc.target/aarch64/simd/vrev32u16.x: New file.
++ * gcc.target/aarch64/simd/vrev32u8_1.c: New file.
++ * gcc.target/aarch64/simd/vrev32u8.x: New file.
++ * gcc.target/aarch64/simd/vrev64f32_1.c: New file.
++ * gcc.target/aarch64/simd/vrev64f32.x: New file.
++ * gcc.target/aarch64/simd/vrev64p16_1.c: New file.
++ * gcc.target/aarch64/simd/vrev64p16.x: New file.
++ * gcc.target/aarch64/simd/vrev64p8_1.c: New file.
++ * gcc.target/aarch64/simd/vrev64p8.x: New file.
++ * gcc.target/aarch64/simd/vrev64qf32_1.c: New file.
++ * gcc.target/aarch64/simd/vrev64qf32.x: New file.
++ * gcc.target/aarch64/simd/vrev64qp16_1.c: New file.
++ * gcc.target/aarch64/simd/vrev64qp16.x: New file.
++ * gcc.target/aarch64/simd/vrev64qp8_1.c: New file.
++ * gcc.target/aarch64/simd/vrev64qp8.x: New file.
++ * gcc.target/aarch64/simd/vrev64qs16_1.c: New file.
++ * gcc.target/aarch64/simd/vrev64qs16.x: New file.
++ * gcc.target/aarch64/simd/vrev64qs32_1.c: New file.
++ * gcc.target/aarch64/simd/vrev64qs32.x: New file.
++ * gcc.target/aarch64/simd/vrev64qs8_1.c: New file.
++ * gcc.target/aarch64/simd/vrev64qs8.x: New file.
++ * gcc.target/aarch64/simd/vrev64qu16_1.c: New file.
++ * gcc.target/aarch64/simd/vrev64qu16.x: New file.
++ * gcc.target/aarch64/simd/vrev64qu32_1.c: New file.
++ * gcc.target/aarch64/simd/vrev64qu32.x: New file.
++ * gcc.target/aarch64/simd/vrev64qu8_1.c: New file.
++ * gcc.target/aarch64/simd/vrev64qu8.x: New file.
++ * gcc.target/aarch64/simd/vrev64s16_1.c: New file.
++ * gcc.target/aarch64/simd/vrev64s16.x: New file.
++ * gcc.target/aarch64/simd/vrev64s32_1.c: New file.
++ * gcc.target/aarch64/simd/vrev64s32.x: New file.
++ * gcc.target/aarch64/simd/vrev64s8_1.c: New file.
++ * gcc.target/aarch64/simd/vrev64s8.x: New file.
++ * gcc.target/aarch64/simd/vrev64u16_1.c: New file.
++ * gcc.target/aarch64/simd/vrev64u16.x: New file.
++ * gcc.target/aarch64/simd/vrev64u32_1.c: New file.
++ * gcc.target/aarch64/simd/vrev64u32.x: New file.
++ * gcc.target/aarch64/simd/vrev64u8_1.c: New file.
++ * gcc.target/aarch64/simd/vrev64u8.x: New file.
++
++2014-07-16 Yvan Roux <yvan.roux@linaro.org>
++
++ Backport from trunk r210148, r210151, r210422.
++ 2014-05-14 Alan Lawrence <alan.lawrence@arm.com>
++
++ * gcc.target/arm/simd/vtrnqf32_1.c: New file.
++ * gcc.target/arm/simd/vtrnqp16_1.c: New file.
++ * gcc.target/arm/simd/vtrnqp8_1.c: New file.
++ * gcc.target/arm/simd/vtrnqs16_1.c: New file.
++ * gcc.target/arm/simd/vtrnqs32_1.c: New file.
++ * gcc.target/arm/simd/vtrnqs8_1.c: New file.
++ * gcc.target/arm/simd/vtrnqu16_1.c: New file.
++ * gcc.target/arm/simd/vtrnqu32_1.c: New file.
++ * gcc.target/arm/simd/vtrnqu8_1.c: New file.
++ * gcc.target/arm/simd/vtrnf32_1.c: New file.
++ * gcc.target/arm/simd/vtrnp16_1.c: New file.
++ * gcc.target/arm/simd/vtrnp8_1.c: New file.
++ * gcc.target/arm/simd/vtrns16_1.c: New file.
++ * gcc.target/arm/simd/vtrns32_1.c: New file.
++ * gcc.target/arm/simd/vtrns8_1.c: New file.
++ * gcc.target/arm/simd/vtrnu16_1.c: New file.
++ * gcc.target/arm/simd/vtrnu32_1.c: New file.
++ * gcc.target/arm/simd/vtrnu8_1.c: New file.
++
++ 2014-05-07 Alan Lawrence <alan.lawrence@arm.com>
++
++ * gcc.target/aarch64/vtrns32.c: Expect zip[12] insn rather than trn[12].
++ * gcc.target/aarch64/vtrnu32.c: Likewise.
++ * gcc.target/aarch64/vtrnf32.c: Likewise.
++
++ 2014-05-07 Alan Lawrence <alan.lawrence@arm.com>
++
++ * gcc.target/aarch64/simd/vtrnf32_1.c: New file.
++ * gcc.target/aarch64/simd/vtrnf32.x: New file.
++ * gcc.target/aarch64/simd/vtrnp16_1.c: New file.
++ * gcc.target/aarch64/simd/vtrnp16.x: New file.
++ * gcc.target/aarch64/simd/vtrnp8_1.c: New file.
++ * gcc.target/aarch64/simd/vtrnp8.x: New file.
++ * gcc.target/aarch64/simd/vtrnqf32_1.c: New file.
++ * gcc.target/aarch64/simd/vtrnqf32.x: New file.
++ * gcc.target/aarch64/simd/vtrnqp16_1.c: New file.
++ * gcc.target/aarch64/simd/vtrnqp16.x: New file.
++ * gcc.target/aarch64/simd/vtrnqp8_1.c: New file.
++ * gcc.target/aarch64/simd/vtrnqp8.x: New file.
++ * gcc.target/aarch64/simd/vtrnqs16_1.c: New file.
++ * gcc.target/aarch64/simd/vtrnqs16.x: New file.
++ * gcc.target/aarch64/simd/vtrnqs32_1.c: New file.
++ * gcc.target/aarch64/simd/vtrnqs32.x: New file.
++ * gcc.target/aarch64/simd/vtrnqs8_1.c: New file.
++ * gcc.target/aarch64/simd/vtrnqs8.x: New file.
++ * gcc.target/aarch64/simd/vtrnqu16_1.c: New file.
++ * gcc.target/aarch64/simd/vtrnqu16.x: New file.
++ * gcc.target/aarch64/simd/vtrnqu32_1.c: New file.
++ * gcc.target/aarch64/simd/vtrnqu32.x: New file.
++ * gcc.target/aarch64/simd/vtrnqu8_1.c: New file.
++ * gcc.target/aarch64/simd/vtrnqu8.x: New file.
++ * gcc.target/aarch64/simd/vtrns16_1.c: New file.
++ * gcc.target/aarch64/simd/vtrns16.x: New file.
++ * gcc.target/aarch64/simd/vtrns32_1.c: New file.
++ * gcc.target/aarch64/simd/vtrns32.x: New file.
++ * gcc.target/aarch64/simd/vtrns8_1.c: New file.
++ * gcc.target/aarch64/simd/vtrns8.x: New file.
++ * gcc.target/aarch64/simd/vtrnu16_1.c: New file.
++ * gcc.target/aarch64/simd/vtrnu16.x: New file.
++ * gcc.target/aarch64/simd/vtrnu32_1.c: New file.
++ * gcc.target/aarch64/simd/vtrnu32.x: New file.
++ * gcc.target/aarch64/simd/vtrnu8_1.c: New file.
++ * gcc.target/aarch64/simd/vtrnu8.x: New file.
++
++2014-07-16 Yvan Roux <yvan.roux@linaro.org>
++
++ Backport from trunk r209794, 209858.
++ 2014-04-25 Marek Polacek <polacek@redhat.com>
++
++ PR c/60114
++ * gcc.dg/pr60114.c: New test.
++
++ 2014-04-28 Kyrylo Tkachov <kyrylo.tkachov@arm.com>
++
++ PR c/60983
++ * gcc.dg/pr60114.c: Use signed chars.
++
++2014-07-16 Yvan Roux <yvan.roux@linaro.org>
++
++ Backport from trunk r210861.
++ 2014-05-23 Jiong Wang <jiong.wang@arm.com>
++
++ * gcc.target/aarch64/tail_indirect_call_1.c: New.
++
++2014-07-16 Yvan Roux <yvan.roux@linaro.org>
++
++ Backport from trunk r211314.
++ 2014-06-06 James Greenhalgh <james.greenhalgh@arm.com>
++
++ * gcc.dg/tree-ssa/pr42585.c: Skip for AArch64.
++ * gcc.dg/tree-ssa/sra-12.c: Likewise.
++
++2014-07-16 Yvan Roux <yvan.roux@linaro.org>
++
++ Backport from trunk r210967.
++ 2014-05-27 Kyrylo Tkachov <kyrylo.tkachov@arm.com>
++
++ * lib/target-supports.exp (check_effective_target_vect_bswap):
++ Specify arm*-*-* support.
++
++2014-07-16 Yvan Roux <yvan.roux@linaro.org>
++
++ Backport from trunk r210152, 211059.
++ 2014-05-29 Alan Lawrence <alan.lawrence@arm.com>
++
++ * gcc.target/arm/simd/vextQf32_1.c: New file.
++ * gcc.target/arm/simd/vextQp16_1.c: New file.
++ * gcc.target/arm/simd/vextQp8_1.c: New file.
++ * gcc.target/arm/simd/vextQs16_1.c: New file.
++ * gcc.target/arm/simd/vextQs32_1.c: New file.
++ * gcc.target/arm/simd/vextQs64_1.c: New file.
++ * gcc.target/arm/simd/vextQs8_1.c: New file.
++ * gcc.target/arm/simd/vextQu16_1.c: New file.
++ * gcc.target/arm/simd/vextQu32_1.c: New file.
++ * gcc.target/arm/simd/vextQu64_1.c: New file.
++ * gcc.target/arm/simd/vextQu8_1.c: New file.
++ * gcc.target/arm/simd/vextQp64_1.c: New file.
++ * gcc.target/arm/simd/vextf32_1.c: New file.
++ * gcc.target/arm/simd/vextp16_1.c: New file.
++ * gcc.target/arm/simd/vextp8_1.c: New file.
++ * gcc.target/arm/simd/vexts16_1.c: New file.
++ * gcc.target/arm/simd/vexts32_1.c: New file.
++ * gcc.target/arm/simd/vexts64_1.c: New file.
++ * gcc.target/arm/simd/vexts8_1.c: New file.
++ * gcc.target/arm/simd/vextu16_1.c: New file.
++ * gcc.target/arm/simd/vextu32_1.c: New file.
++ * gcc.target/arm/simd/vextu64_1.c: New file.
++ * gcc.target/arm/simd/vextu8_1.c: New file.
++ * gcc.target/arm/simd/vextp64_1.c: New file.
++
++ 2014-05-07 Alan Lawrence <alan.lawrence@arm.com>
++
++ * gcc.target/aarch64/simd/ext_f32.x: New file.
++ * gcc.target/aarch64/simd/ext_f32_1.c: New file.
++ * gcc.target/aarch64/simd/ext_p16.x: New file.
++ * gcc.target/aarch64/simd/ext_p16_1.c: New file.
++ * gcc.target/aarch64/simd/ext_p8.x: New file.
++ * gcc.target/aarch64/simd/ext_p8_1.c: New file.
++ * gcc.target/aarch64/simd/ext_s16.x: New file.
++ * gcc.target/aarch64/simd/ext_s16_1.c: New file.
++ * gcc.target/aarch64/simd/ext_s32.x: New file.
++ * gcc.target/aarch64/simd/ext_s32_1.c: New file.
++ * gcc.target/aarch64/simd/ext_s64.x: New file.
++ * gcc.target/aarch64/simd/ext_s64_1.c: New file.
++ * gcc.target/aarch64/simd/ext_s8.x: New file.
++ * gcc.target/aarch64/simd/ext_s8_1.c: New file.
++ * gcc.target/aarch64/simd/ext_u16.x: New file.
++ * gcc.target/aarch64/simd/ext_u16_1.c: New file.
++ * gcc.target/aarch64/simd/ext_u32.x: New file.
++ * gcc.target/aarch64/simd/ext_u32_1.c: New file.
++ * gcc.target/aarch64/simd/ext_u64.x: New file.
++ * gcc.target/aarch64/simd/ext_u64_1.c: New file.
++ * gcc.target/aarch64/simd/ext_u8.x: New file.
++ * gcc.target/aarch64/simd/ext_u8_1.c: New file.
++ * gcc.target/aarch64/simd/ext_f64.c: New file.
++ * gcc.target/aarch64/simd/extq_f32.x: New file.
++ * gcc.target/aarch64/simd/extq_f32_1.c: New file.
++ * gcc.target/aarch64/simd/extq_p16.x: New file.
++ * gcc.target/aarch64/simd/extq_p16_1.c: New file.
++ * gcc.target/aarch64/simd/extq_p8.x: New file.
++ * gcc.target/aarch64/simd/extq_p8_1.c: New file.
++ * gcc.target/aarch64/simd/extq_s16.x: New file.
++ * gcc.target/aarch64/simd/extq_s16_1.c: New file.
++ * gcc.target/aarch64/simd/extq_s32.x: New file.
++ * gcc.target/aarch64/simd/extq_s32_1.c: New file.
++ * gcc.target/aarch64/simd/extq_s64.x: New file.
++ * gcc.target/aarch64/simd/extq_s64_1.c: New file.
++ * gcc.target/aarch64/simd/extq_s8.x: New file.
++ * gcc.target/aarch64/simd/extq_s8_1.c: New file.
++ * gcc.target/aarch64/simd/extq_u16.x: New file.
++ * gcc.target/aarch64/simd/extq_u16_1.c: New file.
++ * gcc.target/aarch64/simd/extq_u32.x: New file.
++
++2014-07-16 Yvan Roux <yvan.roux@linaro.org>
++
++ Backport from trunk r209940, r209943, r209947.
++ 2014-04-30 Alan Lawrence <alan.lawrence@arm.com>
++
++ * gcc.target/arm/simd/vuzpqf32_1.c: New file.
++ * gcc.target/arm/simd/vuzpqp16_1.c: New file.
++ * gcc.target/arm/simd/vuzpqp8_1.c: New file.
++ * gcc.target/arm/simd/vuzpqs16_1.c: New file.
++ * gcc.target/arm/simd/vuzpqs32_1.c: New file.
++ * gcc.target/arm/simd/vuzpqs8_1.c: New file.
++ * gcc.target/arm/simd/vuzpqu16_1.c: New file.
++ * gcc.target/arm/simd/vuzpqu32_1.c: New file.
++ * gcc.target/arm/simd/vuzpqu8_1.c: New file.
++ * gcc.target/arm/simd/vuzpf32_1.c: New file.
++ * gcc.target/arm/simd/vuzpp16_1.c: New file.
++ * gcc.target/arm/simd/vuzpp8_1.c: New file.
++ * gcc.target/arm/simd/vuzps16_1.c: New file.
++ * gcc.target/arm/simd/vuzps32_1.c: New file.
++ * gcc.target/arm/simd/vuzps8_1.c: New file.
++ * gcc.target/arm/simd/vuzpu16_1.c: New file.
++ * gcc.target/arm/simd/vuzpu32_1.c: New file.
++ * gcc.target/arm/simd/vuzpu8_1.c: New file.
++
++ 2014-04-30 Alan Lawrence <alan.lawrence@arm.com>
++
++ * gcc.target/aarch64/vuzps32_1.c: Expect zip1/2 insn rather than uzp1/2.
++ * gcc.target/aarch64/vuzpu32_1.c: Likewise.
++ * gcc.target/aarch64/vuzpf32_1.c: Likewise.
++
++ 2014-04-30 Alan Lawrence <alan.lawrence@arm.com>
++
++ * gcc.target/aarch64/simd/vuzpf32_1.c: New file.
++ * gcc.target/aarch64/simd/vuzpf32.x: New file.
++ * gcc.target/aarch64/simd/vuzpp16_1.c: New file.
++ * gcc.target/aarch64/simd/vuzpp16.x: New file.
++ * gcc.target/aarch64/simd/vuzpp8_1.c: New file.
++ * gcc.target/aarch64/simd/vuzpp8.x: New file.
++ * gcc.target/aarch64/simd/vuzpqf32_1.c: New file.
++ * gcc.target/aarch64/simd/vuzpqf32.x: New file.
++ * gcc.target/aarch64/simd/vuzpqp16_1.c: New file.
++ * gcc.target/aarch64/simd/vuzpqp16.x: New file.
++ * gcc.target/aarch64/simd/vuzpqp8_1.c: New file.
++ * gcc.target/aarch64/simd/vuzpqp8.x: New file.
++ * gcc.target/aarch64/simd/vuzpqs16_1.c: New file.
++ * gcc.target/aarch64/simd/vuzpqs16.x: New file.
++ * gcc.target/aarch64/simd/vuzpqs32_1.c: New file.
++ * gcc.target/aarch64/simd/vuzpqs32.x: New file.
++ * gcc.target/aarch64/simd/vuzpqs8_1.c: New file.
++ * gcc.target/aarch64/simd/vuzpqs8.x: New file.
++ * gcc.target/aarch64/simd/vuzpqu16_1.c: New file.
++ * gcc.target/aarch64/simd/vuzpqu16.x: New file.
++ * gcc.target/aarch64/simd/vuzpqu32_1.c: New file.
++ * gcc.target/aarch64/simd/vuzpqu32.x: New file.
++ * gcc.target/aarch64/simd/vuzpqu8_1.c: New file.
++ * gcc.target/aarch64/simd/vuzpqu8.x: New file.
++ * gcc.target/aarch64/simd/vuzps16_1.c: New file.
++ * gcc.target/aarch64/simd/vuzps16.x: New file.
++ * gcc.target/aarch64/simd/vuzps32_1.c: New file.
++ * gcc.target/aarch64/simd/vuzps32.x: New file.
++ * gcc.target/aarch64/simd/vuzps8_1.c: New file.
++ * gcc.target/aarch64/simd/vuzps8.x: New file.
++ * gcc.target/aarch64/simd/vuzpu16_1.c: New file.
++ * gcc.target/aarch64/simd/vuzpu16.x: New file.
++ * gcc.target/aarch64/simd/vuzpu32_1.c: New file.
++ * gcc.target/aarch64/simd/vuzpu32.x: New file.
++ * gcc.target/aarch64/simd/vuzpu8_1.c: New file.
++ * gcc.target/aarch64/simd/vuzpu8.x: New file.
++
+2014-06-25 Yvan Roux <yvan.roux@linaro.org>
+
+ GCC Linaro 4.9-2014.06-1 released.
@@ -5501,6 +14456,60 @@ LANG=C svn diff svn://gcc.gnu.org/svn/gcc/branches/gcc-4_9-branch@211979 \
+ gfp_mask |= 0x1000000u;
+ return (gfp_mask & ~gfp_notmask);
+}
+--- a/src/gcc/testsuite/gcc.dg/tree-ssa/pr42585.c
++++ b/src/gcc/testsuite/gcc.dg/tree-ssa/pr42585.c
+@@ -35,6 +35,6 @@
+ /* Whether the structs are totally scalarized or not depends on the
+ MOVE_RATIO macro definition in the back end. The scalarization will
+ not take place when using small values for MOVE_RATIO. */
+-/* { dg-final { scan-tree-dump-times "struct _fat_ptr _ans" 0 "optimized" { target { ! "arm*-*-* avr-*-* nds32*-*-* powerpc*-*-* s390*-*-* sh*-*-*" } } } } */
+-/* { dg-final { scan-tree-dump-times "struct _fat_ptr _T2" 0 "optimized" { target { ! "arm*-*-* avr-*-* nds32*-*-* powerpc*-*-* s390*-*-* sh*-*-*" } } } } */
++/* { dg-final { scan-tree-dump-times "struct _fat_ptr _ans" 0 "optimized" { target { ! "aarch64*-*-* arm*-*-* avr-*-* nds32*-*-* powerpc*-*-* s390*-*-* sh*-*-*" } } } } */
++/* { dg-final { scan-tree-dump-times "struct _fat_ptr _T2" 0 "optimized" { target { ! "aarch64*-*-* arm*-*-* avr-*-* nds32*-*-* powerpc*-*-* s390*-*-* sh*-*-*" } } } } */
+ /* { dg-final { cleanup-tree-dump "optimized" } } */
+--- a/src/gcc/testsuite/gcc.dg/tree-ssa/sra-12.c
++++ b/src/gcc/testsuite/gcc.dg/tree-ssa/sra-12.c
+@@ -21,5 +21,5 @@
+ *p = l;
+ }
+
+-/* { dg-final { scan-tree-dump-times "l;" 0 "release_ssa" { target { ! "avr*-*-* nds32*-*-*" } } } } */
++/* { dg-final { scan-tree-dump-times "l;" 0 "release_ssa" { target { ! "aarch64*-*-* avr*-*-* nds32*-*-*" } } } } */
+ /* { dg-final { cleanup-tree-dump "release_ssa" } } */
+--- a/src/gcc/testsuite/gcc.dg/pr60114.c
++++ b/src/gcc/testsuite/gcc.dg/pr60114.c
+@@ -0,0 +1,31 @@
++/* PR c/60114 */
++/* { dg-do compile } */
++/* { dg-options "-Wconversion" } */
++
++struct S { int n, u[2]; };
++const signed char z[] = {
++ [0] = 0x100, /* { dg-warning "9:overflow in implicit constant conversion" } */
++ [2] = 0x101, /* { dg-warning "9:overflow in implicit constant conversion" } */
++};
++int A[] = {
++ 0, 0x80000000, /* { dg-warning "16:conversion of unsigned constant value to negative integer" } */
++ 0xA, 0x80000000, /* { dg-warning "18:conversion of unsigned constant value to negative integer" } */
++ 0xA, 0xA, 0x80000000 /* { dg-warning "23:conversion of unsigned constant value to negative integer" } */
++ };
++int *p = (int []) { 0x80000000 }; /* { dg-warning "21:conversion of unsigned constant value to negative integer" } */
++union { int k; } u = { .k = 0x80000000 }; /* { dg-warning "29:conversion of unsigned constant value to negative integer" } */
++typedef int H[];
++void
++foo (void)
++{
++ signed char a[][3] = { { 0x100, /* { dg-warning "28:overflow in implicit constant conversion" } */
++ 1, 0x100 }, /* { dg-warning "24:overflow in implicit constant conversion" } */
++ { '\0', 0x100, '\0' } /* { dg-warning "27:overflow in implicit constant conversion" } */
++ };
++ (const signed char []) { 0x100 }; /* { dg-warning "28:overflow in implicit constant conversion" } */
++ (const float []) { 1e0, 1e1, 1e100 }; /* { dg-warning "32:conversion" } */
++ struct S s1 = { 0x80000000 }; /* { dg-warning "19:conversion of unsigned constant value to negative integer" } */
++ struct S s2 = { .n = 0x80000000 }; /* { dg-warning "24:conversion of unsigned constant value to negative integer" } */
++ struct S s3 = { .u[1] = 0x80000000 }; /* { dg-warning "27:conversion of unsigned constant value to negative integer" } */
++ H h = { 1, 2, 0x80000000 }; /* { dg-warning "17:conversion of unsigned constant value to negative integer" } */
++}
--- a/src/gcc/testsuite/gcc.dg/vect/vect-bswap32.c
+++ b/src/gcc/testsuite/gcc.dg/vect/vect-bswap32.c
@@ -0,0 +1,44 @@
@@ -5644,7 +14653,11 @@ LANG=C svn diff svn://gcc.gnu.org/svn/gcc/branches/gcc-4_9-branch@211979 \
+/* { dg-final { cleanup-tree-dump "vect" } } */
--- a/src/gcc/objcp/ChangeLog.linaro
+++ b/src/gcc/objcp/ChangeLog.linaro
-@@ -0,0 +1,15 @@
+@@ -0,0 +1,19 @@
++2014-07-17 Yvan Roux <yvan.roux@linaro.org>
++
++ GCC Linaro 4.9-2014.07 released.
++
+2014-06-25 Yvan Roux <yvan.roux@linaro.org>
+
+ GCC Linaro 4.9-2014.06-1 released.
@@ -5662,7 +14675,11 @@ LANG=C svn diff svn://gcc.gnu.org/svn/gcc/branches/gcc-4_9-branch@211979 \
+ GCC Linaro 4.9-2014.04 released.
--- a/src/gcc/cp/ChangeLog.linaro
+++ b/src/gcc/cp/ChangeLog.linaro
-@@ -0,0 +1,15 @@
+@@ -0,0 +1,19 @@
++2014-07-17 Yvan Roux <yvan.roux@linaro.org>
++
++ GCC Linaro 4.9-2014.07 released.
++
+2014-06-25 Yvan Roux <yvan.roux@linaro.org>
+
+ GCC Linaro 4.9-2014.06-1 released.
@@ -5717,7 +14734,11 @@ LANG=C svn diff svn://gcc.gnu.org/svn/gcc/branches/gcc-4_9-branch@211979 \
word_mode, NULL_TREE, NULL_RTX, align, 0, NULL_RTX,
--- a/src/gcc/go/ChangeLog.linaro
+++ b/src/gcc/go/ChangeLog.linaro
-@@ -0,0 +1,15 @@
+@@ -0,0 +1,19 @@
++2014-07-17 Yvan Roux <yvan.roux@linaro.org>
++
++ GCC Linaro 4.9-2014.07 released.
++
+2014-06-25 Yvan Roux <yvan.roux@linaro.org>
+
+ GCC Linaro 4.9-2014.06-1 released.
@@ -5733,9 +14754,52 @@ LANG=C svn diff svn://gcc.gnu.org/svn/gcc/branches/gcc-4_9-branch@211979 \
+2014-04-22 Yvan Roux <yvan.roux@linaro.org>
+
+ GCC Linaro 4.9-2014.04 released.
+--- a/src/gcc/genattrtab.c
++++ b/src/gcc/genattrtab.c
+@@ -4765,6 +4765,7 @@
+
+ static struct bypass_list *all_bypasses;
+ static size_t n_bypasses;
++static size_t n_bypassed;
+
+ static void
+ gen_bypass_1 (const char *s, size_t len)
+@@ -4810,12 +4811,18 @@
+ struct bypass_list *b;
+ struct insn_reserv *r;
+
++ n_bypassed = 0;
++
+ /* The reservation list is likely to be much longer than the bypass
+ list. */
+ for (r = all_insn_reservs; r; r = r->next)
+ for (b = all_bypasses; b; b = b->next)
+ if (fnmatch (b->pattern, r->name, 0) == 0)
+- r->bypassed = true;
++ {
++ n_bypassed++;
++ r->bypassed = true;
++ break;
++ }
+ }
+
+ /* Check that attribute NAME is used in define_insn_reservation condition
+@@ -5074,7 +5081,7 @@
+ process_bypasses ();
+
+ byps_exp = rtx_alloc (COND);
+- XVEC (byps_exp, 0) = rtvec_alloc (n_bypasses * 2);
++ XVEC (byps_exp, 0) = rtvec_alloc (n_bypassed * 2);
+ XEXP (byps_exp, 1) = make_numeric_value (0);
+ for (decl = all_insn_reservs, i = 0;
+ decl;
--- a/src/gcc/ada/ChangeLog.linaro
+++ b/src/gcc/ada/ChangeLog.linaro
-@@ -0,0 +1,59 @@
+@@ -0,0 +1,63 @@
++2014-07-17 Yvan Roux <yvan.roux@linaro.org>
++
++ GCC Linaro 4.9-2014.07 released.
++
+2014-06-25 Yvan Roux <yvan.roux@linaro.org>
+
+ GCC Linaro 4.9-2014.06-1 released.
@@ -5797,7 +14861,11 @@ LANG=C svn diff svn://gcc.gnu.org/svn/gcc/branches/gcc-4_9-branch@211979 \
+ GCC Linaro 4.9-2014.04 released.
--- a/src/gcc/fortran/ChangeLog.linaro
+++ b/src/gcc/fortran/ChangeLog.linaro
-@@ -0,0 +1,15 @@
+@@ -0,0 +1,19 @@
++2014-07-17 Yvan Roux <yvan.roux@linaro.org>
++
++ GCC Linaro 4.9-2014.07 released.
++
+2014-06-25 Yvan Roux <yvan.roux@linaro.org>
+
+ GCC Linaro 4.9-2014.06-1 released.
@@ -5998,7 +15066,11 @@ LANG=C svn diff svn://gcc.gnu.org/svn/gcc/branches/gcc-4_9-branch@211979 \
rtx val = argvec[argnum].value;
--- a/src/gcc/lto/ChangeLog.linaro
+++ b/src/gcc/lto/ChangeLog.linaro
-@@ -0,0 +1,15 @@
+@@ -0,0 +1,19 @@
++2014-07-17 Yvan Roux <yvan.roux@linaro.org>
++
++ GCC Linaro 4.9-2014.07 released.
++
+2014-06-25 Yvan Roux <yvan.roux@linaro.org>
+
+ GCC Linaro 4.9-2014.06-1 released.
@@ -6016,7 +15088,11 @@ LANG=C svn diff svn://gcc.gnu.org/svn/gcc/branches/gcc-4_9-branch@211979 \
+ GCC Linaro 4.9-2014.04 released.
--- a/src/gcc/po/ChangeLog.linaro
+++ b/src/gcc/po/ChangeLog.linaro
-@@ -0,0 +1,15 @@
+@@ -0,0 +1,19 @@
++2014-07-17 Yvan Roux <yvan.roux@linaro.org>
++
++ GCC Linaro 4.9-2014.07 released.
++
+2014-06-25 Yvan Roux <yvan.roux@linaro.org>
+
+ GCC Linaro 4.9-2014.06-1 released.
@@ -6032,6 +15108,29 @@ LANG=C svn diff svn://gcc.gnu.org/svn/gcc/branches/gcc-4_9-branch@211979 \
+2014-04-22 Yvan Roux <yvan.roux@linaro.org>
+
+ GCC Linaro 4.9-2014.04 released.
+--- a/src/gcc/config.gcc
++++ b/src/gcc/config.gcc
+@@ -311,8 +311,7 @@
+ ;;
+ aarch64*-*-*)
+ cpu_type=aarch64
+- need_64bit_hwint=yes
+- extra_headers="arm_neon.h"
++ extra_headers="arm_neon.h arm_acle.h"
+ extra_objs="aarch64-builtins.o aarch-common.o"
+ target_has_targetm_common=yes
+ ;;
+--- a/src/gcc/Makefile.in
++++ b/src/gcc/Makefile.in
+@@ -2798,7 +2798,7 @@
+ contribute.texi compat.texi funding.texi gnu.texi gpl_v3.texi \
+ fdl.texi contrib.texi cppenv.texi cppopts.texi avr-mmcu.texi \
+ implement-c.texi implement-cxx.texi arm-neon-intrinsics.texi \
+- arm-acle-intrinsics.texi
++ arm-acle-intrinsics.texi aarch64-acle-intrinsics.texi
+
+ # we explicitly use $(srcdir)/doc/tm.texi here to avoid confusion with
+ # the generated tm.texi; the latter might have a more recent timestamp,
--- a/src/gcc/config/host-linux.c
+++ b/src/gcc/config/host-linux.c
@@ -86,6 +86,8 @@
@@ -6106,7 +15205,16 @@ LANG=C svn diff svn://gcc.gnu.org/svn/gcc/branches/gcc-4_9-branch@211979 \
(define_insn "*aarch64_mul3_elt<mode>"
[(set (match_operand:VMUL 0 "register_operand" "=w")
(mult:VMUL
-@@ -1452,7 +1460,7 @@
+@@ -954,7 +962,7 @@
+ dup\\t%d0, %1.d[0]
+ fmov\\t%d0, %1
+ dup\\t%d0, %1"
+- [(set_attr "type" "neon_dup<q>,fmov,neon_dup<q>")
++ [(set_attr "type" "neon_dup<q>,f_mcr,neon_dup<q>")
+ (set_attr "simd" "yes,*,yes")
+ (set_attr "fp" "*,yes,*")
+ (set_attr "length" "4")]
+@@ -1509,7 +1517,7 @@
)
;; Vector versions of the floating-point frint patterns.
@@ -6115,7 +15223,7 @@ LANG=C svn diff svn://gcc.gnu.org/svn/gcc/branches/gcc-4_9-branch@211979 \
(define_insn "<frint_pattern><mode>2"
[(set (match_operand:VDQF 0 "register_operand" "=w")
(unspec:VDQF [(match_operand:VDQF 1 "register_operand" "w")]
-@@ -2259,6 +2267,15 @@
+@@ -2316,6 +2324,15 @@
DONE;
})
@@ -6131,7 +15239,7 @@ LANG=C svn diff svn://gcc.gnu.org/svn/gcc/branches/gcc-4_9-branch@211979 \
(define_expand "aarch64_reinterpretv16qi<mode>"
[(match_operand:V16QI 0 "register_operand" "")
(match_operand:VQ 1 "register_operand" "")]
-@@ -2610,9 +2627,9 @@
+@@ -2702,9 +2719,9 @@
;; <su>q<absneg>
(define_insn "aarch64_s<optab><mode>"
@@ -6144,7 +15252,7 @@ LANG=C svn diff svn://gcc.gnu.org/svn/gcc/branches/gcc-4_9-branch@211979 \
"TARGET_SIMD"
"s<optab>\\t%<v>0<Vmtype>, %<v>1<Vmtype>"
[(set_attr "type" "neon_<optab><q>")]
-@@ -3527,26 +3544,46 @@
+@@ -3756,26 +3773,46 @@
)))
(clobber (reg:CC CC_REGNUM))]
"TARGET_SIMD"
@@ -6206,7 +15314,7 @@ LANG=C svn diff svn://gcc.gnu.org/svn/gcc/branches/gcc-4_9-branch@211979 \
;; cm(hs|hi)
(define_insn "aarch64_cm<optab><mode>"
-@@ -3570,25 +3607,44 @@
+@@ -3799,25 +3836,44 @@
)))
(clobber (reg:CC CC_REGNUM))]
"TARGET_SIMD"
@@ -6266,7 +15374,7 @@ LANG=C svn diff svn://gcc.gnu.org/svn/gcc/branches/gcc-4_9-branch@211979 \
;; cmtst
(define_insn "aarch64_cmtst<mode>"
-@@ -3614,23 +3670,44 @@
+@@ -3843,23 +3899,44 @@
(const_int 0))))
(clobber (reg:CC CC_REGNUM))]
"TARGET_SIMD"
@@ -6326,7 +15434,7 @@ LANG=C svn diff svn://gcc.gnu.org/svn/gcc/branches/gcc-4_9-branch@211979 \
[(set_attr "type" "neon_tst")]
)
-@@ -3721,6 +3798,17 @@
+@@ -3950,6 +4027,17 @@
[(set_attr "type" "neon_store2_2reg<q>")]
)
@@ -6344,7 +15452,7 @@ LANG=C svn diff svn://gcc.gnu.org/svn/gcc/branches/gcc-4_9-branch@211979 \
(define_insn "vec_load_lanesci<mode>"
[(set (match_operand:CI 0 "register_operand" "=w")
(unspec:CI [(match_operand:CI 1 "aarch64_simd_struct_operand" "Utv")
-@@ -3741,6 +3829,17 @@
+@@ -3970,6 +4058,17 @@
[(set_attr "type" "neon_store3_3reg<q>")]
)
@@ -6362,7 +15470,7 @@ LANG=C svn diff svn://gcc.gnu.org/svn/gcc/branches/gcc-4_9-branch@211979 \
(define_insn "vec_load_lanesxi<mode>"
[(set (match_operand:XI 0 "register_operand" "=w")
(unspec:XI [(match_operand:XI 1 "aarch64_simd_struct_operand" "Utv")
-@@ -3761,6 +3860,17 @@
+@@ -3990,6 +4089,17 @@
[(set_attr "type" "neon_store4_4reg<q>")]
)
@@ -6380,7 +15488,52 @@ LANG=C svn diff svn://gcc.gnu.org/svn/gcc/branches/gcc-4_9-branch@211979 \
;; Reload patterns for AdvSIMD register list operands.
(define_expand "mov<mode>"
-@@ -4255,6 +4365,57 @@
+@@ -4398,6 +4508,44 @@
+ [(set_attr "type" "neon_permute<q>")]
+ )
+
++;; Note immediate (third) operand is lane index not byte index.
++(define_insn "aarch64_ext<mode>"
++ [(set (match_operand:VALL 0 "register_operand" "=w")
++ (unspec:VALL [(match_operand:VALL 1 "register_operand" "w")
++ (match_operand:VALL 2 "register_operand" "w")
++ (match_operand:SI 3 "immediate_operand" "i")]
++ UNSPEC_EXT))]
++ "TARGET_SIMD"
++{
++ operands[3] = GEN_INT (INTVAL (operands[3])
++ * GET_MODE_SIZE (GET_MODE_INNER (<MODE>mode)));
++ return "ext\\t%0.<Vbtype>, %1.<Vbtype>, %2.<Vbtype>, #%3";
++}
++ [(set_attr "type" "neon_ext<q>")]
++)
++
++;; This exists solely to check the arguments to the corresponding __builtin.
++;; Used where we want an error for out-of-range indices which would otherwise
++;; be silently wrapped (e.g. the mask to a __builtin_shuffle).
++(define_expand "aarch64_im_lane_boundsi"
++ [(match_operand:SI 0 "immediate_operand" "i")
++ (match_operand:SI 1 "immediate_operand" "i")]
++ "TARGET_SIMD"
++{
++ aarch64_simd_lane_bounds (operands[0], 0, INTVAL (operands[1]));
++ DONE;
++}
++)
++
++(define_insn "aarch64_rev<REVERSE:rev_op><mode>"
++ [(set (match_operand:VALL 0 "register_operand" "=w")
++ (unspec:VALL [(match_operand:VALL 1 "register_operand" "w")]
++ REVERSE))]
++ "TARGET_SIMD"
++ "rev<REVERSE:rev_op>\\t%0.<Vtype>, %1.<Vtype>"
++ [(set_attr "type" "neon_rev<q>")]
++)
++
+ (define_insn "aarch64_st2<mode>_dreg"
+ [(set (match_operand:TI 0 "aarch64_simd_struct_operand" "=Utv")
+ (unspec:TI [(match_operand:OI 1 "register_operand" "w")
+@@ -4484,6 +4632,57 @@
DONE;
})
@@ -6438,9 +15591,160 @@ LANG=C svn diff svn://gcc.gnu.org/svn/gcc/branches/gcc-4_9-branch@211979 \
(define_expand "aarch64_st1<VALL:mode>"
[(match_operand:DI 0 "register_operand")
(match_operand:VALL 1 "register_operand")]
+--- a/src/gcc/config/aarch64/predicates.md
++++ b/src/gcc/config/aarch64/predicates.md
+@@ -26,6 +26,10 @@
+ && GET_MODE_CLASS (GET_MODE (op)) == MODE_CC"))))
+ )
+
++(define_predicate "aarch64_call_insn_operand"
++ (ior (match_code "symbol_ref")
++ (match_operand 0 "register_operand")))
++
+ (define_predicate "aarch64_simd_register"
+ (and (match_code "reg")
+ (ior (match_test "REGNO_REG_CLASS (REGNO (op)) == FP_LO_REGS")
--- a/src/gcc/config/aarch64/arm_neon.h
+++ b/src/gcc/config/aarch64/arm_neon.h
-@@ -2318,6 +2318,12 @@
+@@ -2119,29 +2119,26 @@
+ __extension__ static __inline uint8x8_t __attribute__ ((__always_inline__))
+ vqadd_u8 (uint8x8_t __a, uint8x8_t __b)
+ {
+- return (uint8x8_t) __builtin_aarch64_uqaddv8qi ((int8x8_t) __a,
+- (int8x8_t) __b);
++ return __builtin_aarch64_uqaddv8qi_uuu (__a, __b);
+ }
+
+ __extension__ static __inline uint16x4_t __attribute__ ((__always_inline__))
+ vqadd_u16 (uint16x4_t __a, uint16x4_t __b)
+ {
+- return (uint16x4_t) __builtin_aarch64_uqaddv4hi ((int16x4_t) __a,
+- (int16x4_t) __b);
++ return __builtin_aarch64_uqaddv4hi_uuu (__a, __b);
+ }
+
+ __extension__ static __inline uint32x2_t __attribute__ ((__always_inline__))
+ vqadd_u32 (uint32x2_t __a, uint32x2_t __b)
+ {
+- return (uint32x2_t) __builtin_aarch64_uqaddv2si ((int32x2_t) __a,
+- (int32x2_t) __b);
++ return __builtin_aarch64_uqaddv2si_uuu (__a, __b);
+ }
+
+ __extension__ static __inline uint64x1_t __attribute__ ((__always_inline__))
+ vqadd_u64 (uint64x1_t __a, uint64x1_t __b)
+ {
+- return (uint64x1_t) __builtin_aarch64_uqadddi ((int64x1_t) __a,
+- (int64x1_t) __b);
++ return (uint64x1_t) __builtin_aarch64_uqadddi_uuu ((uint64_t) __a,
++ (uint64_t) __b);
+ }
+
+ __extension__ static __inline int8x16_t __attribute__ ((__always_inline__))
+@@ -2171,29 +2168,25 @@
+ __extension__ static __inline uint8x16_t __attribute__ ((__always_inline__))
+ vqaddq_u8 (uint8x16_t __a, uint8x16_t __b)
+ {
+- return (uint8x16_t) __builtin_aarch64_uqaddv16qi ((int8x16_t) __a,
+- (int8x16_t) __b);
++ return __builtin_aarch64_uqaddv16qi_uuu (__a, __b);
+ }
+
+ __extension__ static __inline uint16x8_t __attribute__ ((__always_inline__))
+ vqaddq_u16 (uint16x8_t __a, uint16x8_t __b)
+ {
+- return (uint16x8_t) __builtin_aarch64_uqaddv8hi ((int16x8_t) __a,
+- (int16x8_t) __b);
++ return __builtin_aarch64_uqaddv8hi_uuu (__a, __b);
+ }
+
+ __extension__ static __inline uint32x4_t __attribute__ ((__always_inline__))
+ vqaddq_u32 (uint32x4_t __a, uint32x4_t __b)
+ {
+- return (uint32x4_t) __builtin_aarch64_uqaddv4si ((int32x4_t) __a,
+- (int32x4_t) __b);
++ return __builtin_aarch64_uqaddv4si_uuu (__a, __b);
+ }
+
+ __extension__ static __inline uint64x2_t __attribute__ ((__always_inline__))
+ vqaddq_u64 (uint64x2_t __a, uint64x2_t __b)
+ {
+- return (uint64x2_t) __builtin_aarch64_uqaddv2di ((int64x2_t) __a,
+- (int64x2_t) __b);
++ return __builtin_aarch64_uqaddv2di_uuu (__a, __b);
+ }
+
+ __extension__ static __inline int8x8_t __attribute__ ((__always_inline__))
+@@ -2223,29 +2216,26 @@
+ __extension__ static __inline uint8x8_t __attribute__ ((__always_inline__))
+ vqsub_u8 (uint8x8_t __a, uint8x8_t __b)
+ {
+- return (uint8x8_t) __builtin_aarch64_uqsubv8qi ((int8x8_t) __a,
+- (int8x8_t) __b);
++ return __builtin_aarch64_uqsubv8qi_uuu (__a, __b);
+ }
+
+ __extension__ static __inline uint16x4_t __attribute__ ((__always_inline__))
+ vqsub_u16 (uint16x4_t __a, uint16x4_t __b)
+ {
+- return (uint16x4_t) __builtin_aarch64_uqsubv4hi ((int16x4_t) __a,
+- (int16x4_t) __b);
++ return __builtin_aarch64_uqsubv4hi_uuu (__a, __b);
+ }
+
+ __extension__ static __inline uint32x2_t __attribute__ ((__always_inline__))
+ vqsub_u32 (uint32x2_t __a, uint32x2_t __b)
+ {
+- return (uint32x2_t) __builtin_aarch64_uqsubv2si ((int32x2_t) __a,
+- (int32x2_t) __b);
++ return __builtin_aarch64_uqsubv2si_uuu (__a, __b);
+ }
+
+ __extension__ static __inline uint64x1_t __attribute__ ((__always_inline__))
+ vqsub_u64 (uint64x1_t __a, uint64x1_t __b)
+ {
+- return (uint64x1_t) __builtin_aarch64_uqsubdi ((int64x1_t) __a,
+- (int64x1_t) __b);
++ return (uint64x1_t) __builtin_aarch64_uqsubdi_uuu ((uint64_t) __a,
++ (uint64_t) __b);
+ }
+
+ __extension__ static __inline int8x16_t __attribute__ ((__always_inline__))
+@@ -2275,29 +2265,25 @@
+ __extension__ static __inline uint8x16_t __attribute__ ((__always_inline__))
+ vqsubq_u8 (uint8x16_t __a, uint8x16_t __b)
+ {
+- return (uint8x16_t) __builtin_aarch64_uqsubv16qi ((int8x16_t) __a,
+- (int8x16_t) __b);
++ return __builtin_aarch64_uqsubv16qi_uuu (__a, __b);
+ }
+
+ __extension__ static __inline uint16x8_t __attribute__ ((__always_inline__))
+ vqsubq_u16 (uint16x8_t __a, uint16x8_t __b)
+ {
+- return (uint16x8_t) __builtin_aarch64_uqsubv8hi ((int16x8_t) __a,
+- (int16x8_t) __b);
++ return __builtin_aarch64_uqsubv8hi_uuu (__a, __b);
+ }
+
+ __extension__ static __inline uint32x4_t __attribute__ ((__always_inline__))
+ vqsubq_u32 (uint32x4_t __a, uint32x4_t __b)
+ {
+- return (uint32x4_t) __builtin_aarch64_uqsubv4si ((int32x4_t) __a,
+- (int32x4_t) __b);
++ return __builtin_aarch64_uqsubv4si_uuu (__a, __b);
+ }
+
+ __extension__ static __inline uint64x2_t __attribute__ ((__always_inline__))
+ vqsubq_u64 (uint64x2_t __a, uint64x2_t __b)
+ {
+- return (uint64x2_t) __builtin_aarch64_uqsubv2di ((int64x2_t) __a,
+- (int64x2_t) __b);
++ return __builtin_aarch64_uqsubv2di_uuu (__a, __b);
+ }
+
+ __extension__ static __inline int8x8_t __attribute__ ((__always_inline__))
+@@ -2318,6 +2304,12 @@
return (int32x2_t) __builtin_aarch64_sqnegv2si (__a);
}
@@ -6453,7 +15757,7 @@ LANG=C svn diff svn://gcc.gnu.org/svn/gcc/branches/gcc-4_9-branch@211979 \
__extension__ static __inline int8x16_t __attribute__ ((__always_inline__))
vqnegq_s8 (int8x16_t __a)
{
-@@ -2354,6 +2360,12 @@
+@@ -2354,6 +2346,12 @@
return (int32x2_t) __builtin_aarch64_sqabsv2si (__a);
}
@@ -6466,7 +15770,7 @@ LANG=C svn diff svn://gcc.gnu.org/svn/gcc/branches/gcc-4_9-branch@211979 \
__extension__ static __inline int8x16_t __attribute__ ((__always_inline__))
vqabsq_s8 (int8x16_t __a)
{
-@@ -2643,1352 +2655,1587 @@
+@@ -2643,1352 +2641,1587 @@
/* vreinterpret */
__extension__ static __inline poly8x8_t __attribute__ ((__always_inline__))
@@ -8303,10 +17607,1664 @@ LANG=C svn diff svn://gcc.gnu.org/svn/gcc/branches/gcc-4_9-branch@211979 \
}
#define __GET_LOW(__TYPE) \
-@@ -13414,468 +13661,6 @@
+@@ -5414,318 +5647,6 @@
+ return result;
+ }
+
+-#define vext_f32(a, b, c) \
+- __extension__ \
+- ({ \
+- float32x2_t b_ = (b); \
+- float32x2_t a_ = (a); \
+- float32x2_t result; \
+- __asm__ ("ext %0.8b, %1.8b, %2.8b, #%3*4" \
+- : "=w"(result) \
+- : "w"(a_), "w"(b_), "i"(c) \
+- : /* No clobbers */); \
+- result; \
+- })
+-
+-#define vext_f64(a, b, c) \
+- __extension__ \
+- ({ \
+- float64x1_t b_ = (b); \
+- float64x1_t a_ = (a); \
+- float64x1_t result; \
+- __asm__ ("ext %0.8b, %1.8b, %2.8b, #%3*8" \
+- : "=w"(result) \
+- : "w"(a_), "w"(b_), "i"(c) \
+- : /* No clobbers */); \
+- result; \
+- })
+-
+-#define vext_p8(a, b, c) \
+- __extension__ \
+- ({ \
+- poly8x8_t b_ = (b); \
+- poly8x8_t a_ = (a); \
+- poly8x8_t result; \
+- __asm__ ("ext %0.8b,%1.8b,%2.8b,%3" \
+- : "=w"(result) \
+- : "w"(a_), "w"(b_), "i"(c) \
+- : /* No clobbers */); \
+- result; \
+- })
+-
+-#define vext_p16(a, b, c) \
+- __extension__ \
+- ({ \
+- poly16x4_t b_ = (b); \
+- poly16x4_t a_ = (a); \
+- poly16x4_t result; \
+- __asm__ ("ext %0.8b, %1.8b, %2.8b, #%3*2" \
+- : "=w"(result) \
+- : "w"(a_), "w"(b_), "i"(c) \
+- : /* No clobbers */); \
+- result; \
+- })
+-
+-#define vext_s8(a, b, c) \
+- __extension__ \
+- ({ \
+- int8x8_t b_ = (b); \
+- int8x8_t a_ = (a); \
+- int8x8_t result; \
+- __asm__ ("ext %0.8b,%1.8b,%2.8b,%3" \
+- : "=w"(result) \
+- : "w"(a_), "w"(b_), "i"(c) \
+- : /* No clobbers */); \
+- result; \
+- })
+-
+-#define vext_s16(a, b, c) \
+- __extension__ \
+- ({ \
+- int16x4_t b_ = (b); \
+- int16x4_t a_ = (a); \
+- int16x4_t result; \
+- __asm__ ("ext %0.8b, %1.8b, %2.8b, #%3*2" \
+- : "=w"(result) \
+- : "w"(a_), "w"(b_), "i"(c) \
+- : /* No clobbers */); \
+- result; \
+- })
+-
+-#define vext_s32(a, b, c) \
+- __extension__ \
+- ({ \
+- int32x2_t b_ = (b); \
+- int32x2_t a_ = (a); \
+- int32x2_t result; \
+- __asm__ ("ext %0.8b, %1.8b, %2.8b, #%3*4" \
+- : "=w"(result) \
+- : "w"(a_), "w"(b_), "i"(c) \
+- : /* No clobbers */); \
+- result; \
+- })
+-
+-#define vext_s64(a, b, c) \
+- __extension__ \
+- ({ \
+- int64x1_t b_ = (b); \
+- int64x1_t a_ = (a); \
+- int64x1_t result; \
+- __asm__ ("ext %0.8b, %1.8b, %2.8b, #%3*8" \
+- : "=w"(result) \
+- : "w"(a_), "w"(b_), "i"(c) \
+- : /* No clobbers */); \
+- result; \
+- })
+-
+-#define vext_u8(a, b, c) \
+- __extension__ \
+- ({ \
+- uint8x8_t b_ = (b); \
+- uint8x8_t a_ = (a); \
+- uint8x8_t result; \
+- __asm__ ("ext %0.8b,%1.8b,%2.8b,%3" \
+- : "=w"(result) \
+- : "w"(a_), "w"(b_), "i"(c) \
+- : /* No clobbers */); \
+- result; \
+- })
+-
+-#define vext_u16(a, b, c) \
+- __extension__ \
+- ({ \
+- uint16x4_t b_ = (b); \
+- uint16x4_t a_ = (a); \
+- uint16x4_t result; \
+- __asm__ ("ext %0.8b, %1.8b, %2.8b, #%3*2" \
+- : "=w"(result) \
+- : "w"(a_), "w"(b_), "i"(c) \
+- : /* No clobbers */); \
+- result; \
+- })
+-
+-#define vext_u32(a, b, c) \
+- __extension__ \
+- ({ \
+- uint32x2_t b_ = (b); \
+- uint32x2_t a_ = (a); \
+- uint32x2_t result; \
+- __asm__ ("ext %0.8b, %1.8b, %2.8b, #%3*4" \
+- : "=w"(result) \
+- : "w"(a_), "w"(b_), "i"(c) \
+- : /* No clobbers */); \
+- result; \
+- })
+-
+-#define vext_u64(a, b, c) \
+- __extension__ \
+- ({ \
+- uint64x1_t b_ = (b); \
+- uint64x1_t a_ = (a); \
+- uint64x1_t result; \
+- __asm__ ("ext %0.8b, %1.8b, %2.8b, #%3*8" \
+- : "=w"(result) \
+- : "w"(a_), "w"(b_), "i"(c) \
+- : /* No clobbers */); \
+- result; \
+- })
+-
+-#define vextq_f32(a, b, c) \
+- __extension__ \
+- ({ \
+- float32x4_t b_ = (b); \
+- float32x4_t a_ = (a); \
+- float32x4_t result; \
+- __asm__ ("ext %0.16b, %1.16b, %2.16b, #%3*4" \
+- : "=w"(result) \
+- : "w"(a_), "w"(b_), "i"(c) \
+- : /* No clobbers */); \
+- result; \
+- })
+-
+-#define vextq_f64(a, b, c) \
+- __extension__ \
+- ({ \
+- float64x2_t b_ = (b); \
+- float64x2_t a_ = (a); \
+- float64x2_t result; \
+- __asm__ ("ext %0.16b, %1.16b, %2.16b, #%3*8" \
+- : "=w"(result) \
+- : "w"(a_), "w"(b_), "i"(c) \
+- : /* No clobbers */); \
+- result; \
+- })
+-
+-#define vextq_p8(a, b, c) \
+- __extension__ \
+- ({ \
+- poly8x16_t b_ = (b); \
+- poly8x16_t a_ = (a); \
+- poly8x16_t result; \
+- __asm__ ("ext %0.16b, %1.16b, %2.16b, #%3" \
+- : "=w"(result) \
+- : "w"(a_), "w"(b_), "i"(c) \
+- : /* No clobbers */); \
+- result; \
+- })
+-
+-#define vextq_p16(a, b, c) \
+- __extension__ \
+- ({ \
+- poly16x8_t b_ = (b); \
+- poly16x8_t a_ = (a); \
+- poly16x8_t result; \
+- __asm__ ("ext %0.16b, %1.16b, %2.16b, #%3*2" \
+- : "=w"(result) \
+- : "w"(a_), "w"(b_), "i"(c) \
+- : /* No clobbers */); \
+- result; \
+- })
+-
+-#define vextq_s8(a, b, c) \
+- __extension__ \
+- ({ \
+- int8x16_t b_ = (b); \
+- int8x16_t a_ = (a); \
+- int8x16_t result; \
+- __asm__ ("ext %0.16b, %1.16b, %2.16b, #%3" \
+- : "=w"(result) \
+- : "w"(a_), "w"(b_), "i"(c) \
+- : /* No clobbers */); \
+- result; \
+- })
+-
+-#define vextq_s16(a, b, c) \
+- __extension__ \
+- ({ \
+- int16x8_t b_ = (b); \
+- int16x8_t a_ = (a); \
+- int16x8_t result; \
+- __asm__ ("ext %0.16b, %1.16b, %2.16b, #%3*2" \
+- : "=w"(result) \
+- : "w"(a_), "w"(b_), "i"(c) \
+- : /* No clobbers */); \
+- result; \
+- })
+-
+-#define vextq_s32(a, b, c) \
+- __extension__ \
+- ({ \
+- int32x4_t b_ = (b); \
+- int32x4_t a_ = (a); \
+- int32x4_t result; \
+- __asm__ ("ext %0.16b, %1.16b, %2.16b, #%3*4" \
+- : "=w"(result) \
+- : "w"(a_), "w"(b_), "i"(c) \
+- : /* No clobbers */); \
+- result; \
+- })
+-
+-#define vextq_s64(a, b, c) \
+- __extension__ \
+- ({ \
+- int64x2_t b_ = (b); \
+- int64x2_t a_ = (a); \
+- int64x2_t result; \
+- __asm__ ("ext %0.16b, %1.16b, %2.16b, #%3*8" \
+- : "=w"(result) \
+- : "w"(a_), "w"(b_), "i"(c) \
+- : /* No clobbers */); \
+- result; \
+- })
+-
+-#define vextq_u8(a, b, c) \
+- __extension__ \
+- ({ \
+- uint8x16_t b_ = (b); \
+- uint8x16_t a_ = (a); \
+- uint8x16_t result; \
+- __asm__ ("ext %0.16b, %1.16b, %2.16b, #%3" \
+- : "=w"(result) \
+- : "w"(a_), "w"(b_), "i"(c) \
+- : /* No clobbers */); \
+- result; \
+- })
+-
+-#define vextq_u16(a, b, c) \
+- __extension__ \
+- ({ \
+- uint16x8_t b_ = (b); \
+- uint16x8_t a_ = (a); \
+- uint16x8_t result; \
+- __asm__ ("ext %0.16b, %1.16b, %2.16b, #%3*2" \
+- : "=w"(result) \
+- : "w"(a_), "w"(b_), "i"(c) \
+- : /* No clobbers */); \
+- result; \
+- })
+-
+-#define vextq_u32(a, b, c) \
+- __extension__ \
+- ({ \
+- uint32x4_t b_ = (b); \
+- uint32x4_t a_ = (a); \
+- uint32x4_t result; \
+- __asm__ ("ext %0.16b, %1.16b, %2.16b, #%3*4" \
+- : "=w"(result) \
+- : "w"(a_), "w"(b_), "i"(c) \
+- : /* No clobbers */); \
+- result; \
+- })
+-
+-#define vextq_u64(a, b, c) \
+- __extension__ \
+- ({ \
+- uint64x2_t b_ = (b); \
+- uint64x2_t a_ = (a); \
+- uint64x2_t result; \
+- __asm__ ("ext %0.16b, %1.16b, %2.16b, #%3*8" \
+- : "=w"(result) \
+- : "w"(a_), "w"(b_), "i"(c) \
+- : /* No clobbers */); \
+- result; \
+- })
+-
+ __extension__ static __inline float32x2_t __attribute__ ((__always_inline__))
+ vfma_f32 (float32x2_t a, float32x2_t b, float32x2_t c)
+ {
+@@ -10628,402 +10549,6 @@
return result;
}
+-__extension__ static __inline poly8x8_t __attribute__ ((__always_inline__))
+-vrev16_p8 (poly8x8_t a)
+-{
+- poly8x8_t result;
+- __asm__ ("rev16 %0.8b,%1.8b"
+- : "=w"(result)
+- : "w"(a)
+- : /* No clobbers */);
+- return result;
+-}
+-
+-__extension__ static __inline int8x8_t __attribute__ ((__always_inline__))
+-vrev16_s8 (int8x8_t a)
+-{
+- int8x8_t result;
+- __asm__ ("rev16 %0.8b,%1.8b"
+- : "=w"(result)
+- : "w"(a)
+- : /* No clobbers */);
+- return result;
+-}
+-
+-__extension__ static __inline uint8x8_t __attribute__ ((__always_inline__))
+-vrev16_u8 (uint8x8_t a)
+-{
+- uint8x8_t result;
+- __asm__ ("rev16 %0.8b,%1.8b"
+- : "=w"(result)
+- : "w"(a)
+- : /* No clobbers */);
+- return result;
+-}
+-
+-__extension__ static __inline poly8x16_t __attribute__ ((__always_inline__))
+-vrev16q_p8 (poly8x16_t a)
+-{
+- poly8x16_t result;
+- __asm__ ("rev16 %0.16b,%1.16b"
+- : "=w"(result)
+- : "w"(a)
+- : /* No clobbers */);
+- return result;
+-}
+-
+-__extension__ static __inline int8x16_t __attribute__ ((__always_inline__))
+-vrev16q_s8 (int8x16_t a)
+-{
+- int8x16_t result;
+- __asm__ ("rev16 %0.16b,%1.16b"
+- : "=w"(result)
+- : "w"(a)
+- : /* No clobbers */);
+- return result;
+-}
+-
+-__extension__ static __inline uint8x16_t __attribute__ ((__always_inline__))
+-vrev16q_u8 (uint8x16_t a)
+-{
+- uint8x16_t result;
+- __asm__ ("rev16 %0.16b,%1.16b"
+- : "=w"(result)
+- : "w"(a)
+- : /* No clobbers */);
+- return result;
+-}
+-
+-__extension__ static __inline poly8x8_t __attribute__ ((__always_inline__))
+-vrev32_p8 (poly8x8_t a)
+-{
+- poly8x8_t result;
+- __asm__ ("rev32 %0.8b,%1.8b"
+- : "=w"(result)
+- : "w"(a)
+- : /* No clobbers */);
+- return result;
+-}
+-
+-__extension__ static __inline poly16x4_t __attribute__ ((__always_inline__))
+-vrev32_p16 (poly16x4_t a)
+-{
+- poly16x4_t result;
+- __asm__ ("rev32 %0.4h,%1.4h"
+- : "=w"(result)
+- : "w"(a)
+- : /* No clobbers */);
+- return result;
+-}
+-
+-__extension__ static __inline int8x8_t __attribute__ ((__always_inline__))
+-vrev32_s8 (int8x8_t a)
+-{
+- int8x8_t result;
+- __asm__ ("rev32 %0.8b,%1.8b"
+- : "=w"(result)
+- : "w"(a)
+- : /* No clobbers */);
+- return result;
+-}
+-
+-__extension__ static __inline int16x4_t __attribute__ ((__always_inline__))
+-vrev32_s16 (int16x4_t a)
+-{
+- int16x4_t result;
+- __asm__ ("rev32 %0.4h,%1.4h"
+- : "=w"(result)
+- : "w"(a)
+- : /* No clobbers */);
+- return result;
+-}
+-
+-__extension__ static __inline uint8x8_t __attribute__ ((__always_inline__))
+-vrev32_u8 (uint8x8_t a)
+-{
+- uint8x8_t result;
+- __asm__ ("rev32 %0.8b,%1.8b"
+- : "=w"(result)
+- : "w"(a)
+- : /* No clobbers */);
+- return result;
+-}
+-
+-__extension__ static __inline uint16x4_t __attribute__ ((__always_inline__))
+-vrev32_u16 (uint16x4_t a)
+-{
+- uint16x4_t result;
+- __asm__ ("rev32 %0.4h,%1.4h"
+- : "=w"(result)
+- : "w"(a)
+- : /* No clobbers */);
+- return result;
+-}
+-
+-__extension__ static __inline poly8x16_t __attribute__ ((__always_inline__))
+-vrev32q_p8 (poly8x16_t a)
+-{
+- poly8x16_t result;
+- __asm__ ("rev32 %0.16b,%1.16b"
+- : "=w"(result)
+- : "w"(a)
+- : /* No clobbers */);
+- return result;
+-}
+-
+-__extension__ static __inline poly16x8_t __attribute__ ((__always_inline__))
+-vrev32q_p16 (poly16x8_t a)
+-{
+- poly16x8_t result;
+- __asm__ ("rev32 %0.8h,%1.8h"
+- : "=w"(result)
+- : "w"(a)
+- : /* No clobbers */);
+- return result;
+-}
+-
+-__extension__ static __inline int8x16_t __attribute__ ((__always_inline__))
+-vrev32q_s8 (int8x16_t a)
+-{
+- int8x16_t result;
+- __asm__ ("rev32 %0.16b,%1.16b"
+- : "=w"(result)
+- : "w"(a)
+- : /* No clobbers */);
+- return result;
+-}
+-
+-__extension__ static __inline int16x8_t __attribute__ ((__always_inline__))
+-vrev32q_s16 (int16x8_t a)
+-{
+- int16x8_t result;
+- __asm__ ("rev32 %0.8h,%1.8h"
+- : "=w"(result)
+- : "w"(a)
+- : /* No clobbers */);
+- return result;
+-}
+-
+-__extension__ static __inline uint8x16_t __attribute__ ((__always_inline__))
+-vrev32q_u8 (uint8x16_t a)
+-{
+- uint8x16_t result;
+- __asm__ ("rev32 %0.16b,%1.16b"
+- : "=w"(result)
+- : "w"(a)
+- : /* No clobbers */);
+- return result;
+-}
+-
+-__extension__ static __inline uint16x8_t __attribute__ ((__always_inline__))
+-vrev32q_u16 (uint16x8_t a)
+-{
+- uint16x8_t result;
+- __asm__ ("rev32 %0.8h,%1.8h"
+- : "=w"(result)
+- : "w"(a)
+- : /* No clobbers */);
+- return result;
+-}
+-
+-__extension__ static __inline float32x2_t __attribute__ ((__always_inline__))
+-vrev64_f32 (float32x2_t a)
+-{
+- float32x2_t result;
+- __asm__ ("rev64 %0.2s,%1.2s"
+- : "=w"(result)
+- : "w"(a)
+- : /* No clobbers */);
+- return result;
+-}
+-
+-__extension__ static __inline poly8x8_t __attribute__ ((__always_inline__))
+-vrev64_p8 (poly8x8_t a)
+-{
+- poly8x8_t result;
+- __asm__ ("rev64 %0.8b,%1.8b"
+- : "=w"(result)
+- : "w"(a)
+- : /* No clobbers */);
+- return result;
+-}
+-
+-__extension__ static __inline poly16x4_t __attribute__ ((__always_inline__))
+-vrev64_p16 (poly16x4_t a)
+-{
+- poly16x4_t result;
+- __asm__ ("rev64 %0.4h,%1.4h"
+- : "=w"(result)
+- : "w"(a)
+- : /* No clobbers */);
+- return result;
+-}
+-
+-__extension__ static __inline int8x8_t __attribute__ ((__always_inline__))
+-vrev64_s8 (int8x8_t a)
+-{
+- int8x8_t result;
+- __asm__ ("rev64 %0.8b,%1.8b"
+- : "=w"(result)
+- : "w"(a)
+- : /* No clobbers */);
+- return result;
+-}
+-
+-__extension__ static __inline int16x4_t __attribute__ ((__always_inline__))
+-vrev64_s16 (int16x4_t a)
+-{
+- int16x4_t result;
+- __asm__ ("rev64 %0.4h,%1.4h"
+- : "=w"(result)
+- : "w"(a)
+- : /* No clobbers */);
+- return result;
+-}
+-
+-__extension__ static __inline int32x2_t __attribute__ ((__always_inline__))
+-vrev64_s32 (int32x2_t a)
+-{
+- int32x2_t result;
+- __asm__ ("rev64 %0.2s,%1.2s"
+- : "=w"(result)
+- : "w"(a)
+- : /* No clobbers */);
+- return result;
+-}
+-
+-__extension__ static __inline uint8x8_t __attribute__ ((__always_inline__))
+-vrev64_u8 (uint8x8_t a)
+-{
+- uint8x8_t result;
+- __asm__ ("rev64 %0.8b,%1.8b"
+- : "=w"(result)
+- : "w"(a)
+- : /* No clobbers */);
+- return result;
+-}
+-
+-__extension__ static __inline uint16x4_t __attribute__ ((__always_inline__))
+-vrev64_u16 (uint16x4_t a)
+-{
+- uint16x4_t result;
+- __asm__ ("rev64 %0.4h,%1.4h"
+- : "=w"(result)
+- : "w"(a)
+- : /* No clobbers */);
+- return result;
+-}
+-
+-__extension__ static __inline uint32x2_t __attribute__ ((__always_inline__))
+-vrev64_u32 (uint32x2_t a)
+-{
+- uint32x2_t result;
+- __asm__ ("rev64 %0.2s,%1.2s"
+- : "=w"(result)
+- : "w"(a)
+- : /* No clobbers */);
+- return result;
+-}
+-
+-__extension__ static __inline float32x4_t __attribute__ ((__always_inline__))
+-vrev64q_f32 (float32x4_t a)
+-{
+- float32x4_t result;
+- __asm__ ("rev64 %0.4s,%1.4s"
+- : "=w"(result)
+- : "w"(a)
+- : /* No clobbers */);
+- return result;
+-}
+-
+-__extension__ static __inline poly8x16_t __attribute__ ((__always_inline__))
+-vrev64q_p8 (poly8x16_t a)
+-{
+- poly8x16_t result;
+- __asm__ ("rev64 %0.16b,%1.16b"
+- : "=w"(result)
+- : "w"(a)
+- : /* No clobbers */);
+- return result;
+-}
+-
+-__extension__ static __inline poly16x8_t __attribute__ ((__always_inline__))
+-vrev64q_p16 (poly16x8_t a)
+-{
+- poly16x8_t result;
+- __asm__ ("rev64 %0.8h,%1.8h"
+- : "=w"(result)
+- : "w"(a)
+- : /* No clobbers */);
+- return result;
+-}
+-
+-__extension__ static __inline int8x16_t __attribute__ ((__always_inline__))
+-vrev64q_s8 (int8x16_t a)
+-{
+- int8x16_t result;
+- __asm__ ("rev64 %0.16b,%1.16b"
+- : "=w"(result)
+- : "w"(a)
+- : /* No clobbers */);
+- return result;
+-}
+-
+-__extension__ static __inline int16x8_t __attribute__ ((__always_inline__))
+-vrev64q_s16 (int16x8_t a)
+-{
+- int16x8_t result;
+- __asm__ ("rev64 %0.8h,%1.8h"
+- : "=w"(result)
+- : "w"(a)
+- : /* No clobbers */);
+- return result;
+-}
+-
+-__extension__ static __inline int32x4_t __attribute__ ((__always_inline__))
+-vrev64q_s32 (int32x4_t a)
+-{
+- int32x4_t result;
+- __asm__ ("rev64 %0.4s,%1.4s"
+- : "=w"(result)
+- : "w"(a)
+- : /* No clobbers */);
+- return result;
+-}
+-
+-__extension__ static __inline uint8x16_t __attribute__ ((__always_inline__))
+-vrev64q_u8 (uint8x16_t a)
+-{
+- uint8x16_t result;
+- __asm__ ("rev64 %0.16b,%1.16b"
+- : "=w"(result)
+- : "w"(a)
+- : /* No clobbers */);
+- return result;
+-}
+-
+-__extension__ static __inline uint16x8_t __attribute__ ((__always_inline__))
+-vrev64q_u16 (uint16x8_t a)
+-{
+- uint16x8_t result;
+- __asm__ ("rev64 %0.8h,%1.8h"
+- : "=w"(result)
+- : "w"(a)
+- : /* No clobbers */);
+- return result;
+-}
+-
+-__extension__ static __inline uint32x4_t __attribute__ ((__always_inline__))
+-vrev64q_u32 (uint32x4_t a)
+-{
+- uint32x4_t result;
+- __asm__ ("rev64 %0.4s,%1.4s"
+- : "=w"(result)
+- : "w"(a)
+- : /* No clobbers */);
+- return result;
+-}
+-
+ #define vrshrn_high_n_s16(a, b, c) \
+ __extension__ \
+ ({ \
+@@ -12447,469 +11972,7 @@
+ return result;
+ }
+
+-__extension__ static __inline float32x2_t __attribute__ ((__always_inline__))
+-vtrn1_f32 (float32x2_t a, float32x2_t b)
+-{
+- float32x2_t result;
+- __asm__ ("trn1 %0.2s,%1.2s,%2.2s"
+- : "=w"(result)
+- : "w"(a), "w"(b)
+- : /* No clobbers */);
+- return result;
+-}
+-
+-__extension__ static __inline poly8x8_t __attribute__ ((__always_inline__))
+-vtrn1_p8 (poly8x8_t a, poly8x8_t b)
+-{
+- poly8x8_t result;
+- __asm__ ("trn1 %0.8b,%1.8b,%2.8b"
+- : "=w"(result)
+- : "w"(a), "w"(b)
+- : /* No clobbers */);
+- return result;
+-}
+-
+-__extension__ static __inline poly16x4_t __attribute__ ((__always_inline__))
+-vtrn1_p16 (poly16x4_t a, poly16x4_t b)
+-{
+- poly16x4_t result;
+- __asm__ ("trn1 %0.4h,%1.4h,%2.4h"
+- : "=w"(result)
+- : "w"(a), "w"(b)
+- : /* No clobbers */);
+- return result;
+-}
+-
+-__extension__ static __inline int8x8_t __attribute__ ((__always_inline__))
+-vtrn1_s8 (int8x8_t a, int8x8_t b)
+-{
+- int8x8_t result;
+- __asm__ ("trn1 %0.8b,%1.8b,%2.8b"
+- : "=w"(result)
+- : "w"(a), "w"(b)
+- : /* No clobbers */);
+- return result;
+-}
+-
+-__extension__ static __inline int16x4_t __attribute__ ((__always_inline__))
+-vtrn1_s16 (int16x4_t a, int16x4_t b)
+-{
+- int16x4_t result;
+- __asm__ ("trn1 %0.4h,%1.4h,%2.4h"
+- : "=w"(result)
+- : "w"(a), "w"(b)
+- : /* No clobbers */);
+- return result;
+-}
+-
+-__extension__ static __inline int32x2_t __attribute__ ((__always_inline__))
+-vtrn1_s32 (int32x2_t a, int32x2_t b)
+-{
+- int32x2_t result;
+- __asm__ ("trn1 %0.2s,%1.2s,%2.2s"
+- : "=w"(result)
+- : "w"(a), "w"(b)
+- : /* No clobbers */);
+- return result;
+-}
+-
+ __extension__ static __inline uint8x8_t __attribute__ ((__always_inline__))
+-vtrn1_u8 (uint8x8_t a, uint8x8_t b)
+-{
+- uint8x8_t result;
+- __asm__ ("trn1 %0.8b,%1.8b,%2.8b"
+- : "=w"(result)
+- : "w"(a), "w"(b)
+- : /* No clobbers */);
+- return result;
+-}
+-
+-__extension__ static __inline uint16x4_t __attribute__ ((__always_inline__))
+-vtrn1_u16 (uint16x4_t a, uint16x4_t b)
+-{
+- uint16x4_t result;
+- __asm__ ("trn1 %0.4h,%1.4h,%2.4h"
+- : "=w"(result)
+- : "w"(a), "w"(b)
+- : /* No clobbers */);
+- return result;
+-}
+-
+-__extension__ static __inline uint32x2_t __attribute__ ((__always_inline__))
+-vtrn1_u32 (uint32x2_t a, uint32x2_t b)
+-{
+- uint32x2_t result;
+- __asm__ ("trn1 %0.2s,%1.2s,%2.2s"
+- : "=w"(result)
+- : "w"(a), "w"(b)
+- : /* No clobbers */);
+- return result;
+-}
+-
+-__extension__ static __inline float32x4_t __attribute__ ((__always_inline__))
+-vtrn1q_f32 (float32x4_t a, float32x4_t b)
+-{
+- float32x4_t result;
+- __asm__ ("trn1 %0.4s,%1.4s,%2.4s"
+- : "=w"(result)
+- : "w"(a), "w"(b)
+- : /* No clobbers */);
+- return result;
+-}
+-
+-__extension__ static __inline float64x2_t __attribute__ ((__always_inline__))
+-vtrn1q_f64 (float64x2_t a, float64x2_t b)
+-{
+- float64x2_t result;
+- __asm__ ("trn1 %0.2d,%1.2d,%2.2d"
+- : "=w"(result)
+- : "w"(a), "w"(b)
+- : /* No clobbers */);
+- return result;
+-}
+-
+-__extension__ static __inline poly8x16_t __attribute__ ((__always_inline__))
+-vtrn1q_p8 (poly8x16_t a, poly8x16_t b)
+-{
+- poly8x16_t result;
+- __asm__ ("trn1 %0.16b,%1.16b,%2.16b"
+- : "=w"(result)
+- : "w"(a), "w"(b)
+- : /* No clobbers */);
+- return result;
+-}
+-
+-__extension__ static __inline poly16x8_t __attribute__ ((__always_inline__))
+-vtrn1q_p16 (poly16x8_t a, poly16x8_t b)
+-{
+- poly16x8_t result;
+- __asm__ ("trn1 %0.8h,%1.8h,%2.8h"
+- : "=w"(result)
+- : "w"(a), "w"(b)
+- : /* No clobbers */);
+- return result;
+-}
+-
+-__extension__ static __inline int8x16_t __attribute__ ((__always_inline__))
+-vtrn1q_s8 (int8x16_t a, int8x16_t b)
+-{
+- int8x16_t result;
+- __asm__ ("trn1 %0.16b,%1.16b,%2.16b"
+- : "=w"(result)
+- : "w"(a), "w"(b)
+- : /* No clobbers */);
+- return result;
+-}
+-
+-__extension__ static __inline int16x8_t __attribute__ ((__always_inline__))
+-vtrn1q_s16 (int16x8_t a, int16x8_t b)
+-{
+- int16x8_t result;
+- __asm__ ("trn1 %0.8h,%1.8h,%2.8h"
+- : "=w"(result)
+- : "w"(a), "w"(b)
+- : /* No clobbers */);
+- return result;
+-}
+-
+-__extension__ static __inline int32x4_t __attribute__ ((__always_inline__))
+-vtrn1q_s32 (int32x4_t a, int32x4_t b)
+-{
+- int32x4_t result;
+- __asm__ ("trn1 %0.4s,%1.4s,%2.4s"
+- : "=w"(result)
+- : "w"(a), "w"(b)
+- : /* No clobbers */);
+- return result;
+-}
+-
+-__extension__ static __inline int64x2_t __attribute__ ((__always_inline__))
+-vtrn1q_s64 (int64x2_t a, int64x2_t b)
+-{
+- int64x2_t result;
+- __asm__ ("trn1 %0.2d,%1.2d,%2.2d"
+- : "=w"(result)
+- : "w"(a), "w"(b)
+- : /* No clobbers */);
+- return result;
+-}
+-
+-__extension__ static __inline uint8x16_t __attribute__ ((__always_inline__))
+-vtrn1q_u8 (uint8x16_t a, uint8x16_t b)
+-{
+- uint8x16_t result;
+- __asm__ ("trn1 %0.16b,%1.16b,%2.16b"
+- : "=w"(result)
+- : "w"(a), "w"(b)
+- : /* No clobbers */);
+- return result;
+-}
+-
+-__extension__ static __inline uint16x8_t __attribute__ ((__always_inline__))
+-vtrn1q_u16 (uint16x8_t a, uint16x8_t b)
+-{
+- uint16x8_t result;
+- __asm__ ("trn1 %0.8h,%1.8h,%2.8h"
+- : "=w"(result)
+- : "w"(a), "w"(b)
+- : /* No clobbers */);
+- return result;
+-}
+-
+-__extension__ static __inline uint32x4_t __attribute__ ((__always_inline__))
+-vtrn1q_u32 (uint32x4_t a, uint32x4_t b)
+-{
+- uint32x4_t result;
+- __asm__ ("trn1 %0.4s,%1.4s,%2.4s"
+- : "=w"(result)
+- : "w"(a), "w"(b)
+- : /* No clobbers */);
+- return result;
+-}
+-
+-__extension__ static __inline uint64x2_t __attribute__ ((__always_inline__))
+-vtrn1q_u64 (uint64x2_t a, uint64x2_t b)
+-{
+- uint64x2_t result;
+- __asm__ ("trn1 %0.2d,%1.2d,%2.2d"
+- : "=w"(result)
+- : "w"(a), "w"(b)
+- : /* No clobbers */);
+- return result;
+-}
+-
+-__extension__ static __inline float32x2_t __attribute__ ((__always_inline__))
+-vtrn2_f32 (float32x2_t a, float32x2_t b)
+-{
+- float32x2_t result;
+- __asm__ ("trn2 %0.2s,%1.2s,%2.2s"
+- : "=w"(result)
+- : "w"(a), "w"(b)
+- : /* No clobbers */);
+- return result;
+-}
+-
+-__extension__ static __inline poly8x8_t __attribute__ ((__always_inline__))
+-vtrn2_p8 (poly8x8_t a, poly8x8_t b)
+-{
+- poly8x8_t result;
+- __asm__ ("trn2 %0.8b,%1.8b,%2.8b"
+- : "=w"(result)
+- : "w"(a), "w"(b)
+- : /* No clobbers */);
+- return result;
+-}
+-
+-__extension__ static __inline poly16x4_t __attribute__ ((__always_inline__))
+-vtrn2_p16 (poly16x4_t a, poly16x4_t b)
+-{
+- poly16x4_t result;
+- __asm__ ("trn2 %0.4h,%1.4h,%2.4h"
+- : "=w"(result)
+- : "w"(a), "w"(b)
+- : /* No clobbers */);
+- return result;
+-}
+-
+-__extension__ static __inline int8x8_t __attribute__ ((__always_inline__))
+-vtrn2_s8 (int8x8_t a, int8x8_t b)
+-{
+- int8x8_t result;
+- __asm__ ("trn2 %0.8b,%1.8b,%2.8b"
+- : "=w"(result)
+- : "w"(a), "w"(b)
+- : /* No clobbers */);
+- return result;
+-}
+-
+-__extension__ static __inline int16x4_t __attribute__ ((__always_inline__))
+-vtrn2_s16 (int16x4_t a, int16x4_t b)
+-{
+- int16x4_t result;
+- __asm__ ("trn2 %0.4h,%1.4h,%2.4h"
+- : "=w"(result)
+- : "w"(a), "w"(b)
+- : /* No clobbers */);
+- return result;
+-}
+-
+-__extension__ static __inline int32x2_t __attribute__ ((__always_inline__))
+-vtrn2_s32 (int32x2_t a, int32x2_t b)
+-{
+- int32x2_t result;
+- __asm__ ("trn2 %0.2s,%1.2s,%2.2s"
+- : "=w"(result)
+- : "w"(a), "w"(b)
+- : /* No clobbers */);
+- return result;
+-}
+-
+-__extension__ static __inline uint8x8_t __attribute__ ((__always_inline__))
+-vtrn2_u8 (uint8x8_t a, uint8x8_t b)
+-{
+- uint8x8_t result;
+- __asm__ ("trn2 %0.8b,%1.8b,%2.8b"
+- : "=w"(result)
+- : "w"(a), "w"(b)
+- : /* No clobbers */);
+- return result;
+-}
+-
+-__extension__ static __inline uint16x4_t __attribute__ ((__always_inline__))
+-vtrn2_u16 (uint16x4_t a, uint16x4_t b)
+-{
+- uint16x4_t result;
+- __asm__ ("trn2 %0.4h,%1.4h,%2.4h"
+- : "=w"(result)
+- : "w"(a), "w"(b)
+- : /* No clobbers */);
+- return result;
+-}
+-
+-__extension__ static __inline uint32x2_t __attribute__ ((__always_inline__))
+-vtrn2_u32 (uint32x2_t a, uint32x2_t b)
+-{
+- uint32x2_t result;
+- __asm__ ("trn2 %0.2s,%1.2s,%2.2s"
+- : "=w"(result)
+- : "w"(a), "w"(b)
+- : /* No clobbers */);
+- return result;
+-}
+-
+-__extension__ static __inline float32x4_t __attribute__ ((__always_inline__))
+-vtrn2q_f32 (float32x4_t a, float32x4_t b)
+-{
+- float32x4_t result;
+- __asm__ ("trn2 %0.4s,%1.4s,%2.4s"
+- : "=w"(result)
+- : "w"(a), "w"(b)
+- : /* No clobbers */);
+- return result;
+-}
+-
+-__extension__ static __inline float64x2_t __attribute__ ((__always_inline__))
+-vtrn2q_f64 (float64x2_t a, float64x2_t b)
+-{
+- float64x2_t result;
+- __asm__ ("trn2 %0.2d,%1.2d,%2.2d"
+- : "=w"(result)
+- : "w"(a), "w"(b)
+- : /* No clobbers */);
+- return result;
+-}
+-
+-__extension__ static __inline poly8x16_t __attribute__ ((__always_inline__))
+-vtrn2q_p8 (poly8x16_t a, poly8x16_t b)
+-{
+- poly8x16_t result;
+- __asm__ ("trn2 %0.16b,%1.16b,%2.16b"
+- : "=w"(result)
+- : "w"(a), "w"(b)
+- : /* No clobbers */);
+- return result;
+-}
+-
+-__extension__ static __inline poly16x8_t __attribute__ ((__always_inline__))
+-vtrn2q_p16 (poly16x8_t a, poly16x8_t b)
+-{
+- poly16x8_t result;
+- __asm__ ("trn2 %0.8h,%1.8h,%2.8h"
+- : "=w"(result)
+- : "w"(a), "w"(b)
+- : /* No clobbers */);
+- return result;
+-}
+-
+-__extension__ static __inline int8x16_t __attribute__ ((__always_inline__))
+-vtrn2q_s8 (int8x16_t a, int8x16_t b)
+-{
+- int8x16_t result;
+- __asm__ ("trn2 %0.16b,%1.16b,%2.16b"
+- : "=w"(result)
+- : "w"(a), "w"(b)
+- : /* No clobbers */);
+- return result;
+-}
+-
+-__extension__ static __inline int16x8_t __attribute__ ((__always_inline__))
+-vtrn2q_s16 (int16x8_t a, int16x8_t b)
+-{
+- int16x8_t result;
+- __asm__ ("trn2 %0.8h,%1.8h,%2.8h"
+- : "=w"(result)
+- : "w"(a), "w"(b)
+- : /* No clobbers */);
+- return result;
+-}
+-
+-__extension__ static __inline int32x4_t __attribute__ ((__always_inline__))
+-vtrn2q_s32 (int32x4_t a, int32x4_t b)
+-{
+- int32x4_t result;
+- __asm__ ("trn2 %0.4s,%1.4s,%2.4s"
+- : "=w"(result)
+- : "w"(a), "w"(b)
+- : /* No clobbers */);
+- return result;
+-}
+-
+-__extension__ static __inline int64x2_t __attribute__ ((__always_inline__))
+-vtrn2q_s64 (int64x2_t a, int64x2_t b)
+-{
+- int64x2_t result;
+- __asm__ ("trn2 %0.2d,%1.2d,%2.2d"
+- : "=w"(result)
+- : "w"(a), "w"(b)
+- : /* No clobbers */);
+- return result;
+-}
+-
+-__extension__ static __inline uint8x16_t __attribute__ ((__always_inline__))
+-vtrn2q_u8 (uint8x16_t a, uint8x16_t b)
+-{
+- uint8x16_t result;
+- __asm__ ("trn2 %0.16b,%1.16b,%2.16b"
+- : "=w"(result)
+- : "w"(a), "w"(b)
+- : /* No clobbers */);
+- return result;
+-}
+-
+-__extension__ static __inline uint16x8_t __attribute__ ((__always_inline__))
+-vtrn2q_u16 (uint16x8_t a, uint16x8_t b)
+-{
+- uint16x8_t result;
+- __asm__ ("trn2 %0.8h,%1.8h,%2.8h"
+- : "=w"(result)
+- : "w"(a), "w"(b)
+- : /* No clobbers */);
+- return result;
+-}
+-
+-__extension__ static __inline uint32x4_t __attribute__ ((__always_inline__))
+-vtrn2q_u32 (uint32x4_t a, uint32x4_t b)
+-{
+- uint32x4_t result;
+- __asm__ ("trn2 %0.4s,%1.4s,%2.4s"
+- : "=w"(result)
+- : "w"(a), "w"(b)
+- : /* No clobbers */);
+- return result;
+-}
+-
+-__extension__ static __inline uint64x2_t __attribute__ ((__always_inline__))
+-vtrn2q_u64 (uint64x2_t a, uint64x2_t b)
+-{
+- uint64x2_t result;
+- __asm__ ("trn2 %0.2d,%1.2d,%2.2d"
+- : "=w"(result)
+- : "w"(a), "w"(b)
+- : /* No clobbers */);
+- return result;
+-}
+-
+-__extension__ static __inline uint8x8_t __attribute__ ((__always_inline__))
+ vtst_p8 (poly8x8_t a, poly8x8_t b)
+ {
+ uint8x8_t result;
+@@ -12952,930 +12015,7 @@
+ : /* No clobbers */);
+ return result;
+ }
+-__extension__ static __inline float32x2_t __attribute__ ((__always_inline__))
+-vuzp1_f32 (float32x2_t a, float32x2_t b)
+-{
+- float32x2_t result;
+- __asm__ ("uzp1 %0.2s,%1.2s,%2.2s"
+- : "=w"(result)
+- : "w"(a), "w"(b)
+- : /* No clobbers */);
+- return result;
+-}
+
+-__extension__ static __inline poly8x8_t __attribute__ ((__always_inline__))
+-vuzp1_p8 (poly8x8_t a, poly8x8_t b)
+-{
+- poly8x8_t result;
+- __asm__ ("uzp1 %0.8b,%1.8b,%2.8b"
+- : "=w"(result)
+- : "w"(a), "w"(b)
+- : /* No clobbers */);
+- return result;
+-}
+-
+-__extension__ static __inline poly16x4_t __attribute__ ((__always_inline__))
+-vuzp1_p16 (poly16x4_t a, poly16x4_t b)
+-{
+- poly16x4_t result;
+- __asm__ ("uzp1 %0.4h,%1.4h,%2.4h"
+- : "=w"(result)
+- : "w"(a), "w"(b)
+- : /* No clobbers */);
+- return result;
+-}
+-
+-__extension__ static __inline int8x8_t __attribute__ ((__always_inline__))
+-vuzp1_s8 (int8x8_t a, int8x8_t b)
+-{
+- int8x8_t result;
+- __asm__ ("uzp1 %0.8b,%1.8b,%2.8b"
+- : "=w"(result)
+- : "w"(a), "w"(b)
+- : /* No clobbers */);
+- return result;
+-}
+-
+-__extension__ static __inline int16x4_t __attribute__ ((__always_inline__))
+-vuzp1_s16 (int16x4_t a, int16x4_t b)
+-{
+- int16x4_t result;
+- __asm__ ("uzp1 %0.4h,%1.4h,%2.4h"
+- : "=w"(result)
+- : "w"(a), "w"(b)
+- : /* No clobbers */);
+- return result;
+-}
+-
+-__extension__ static __inline int32x2_t __attribute__ ((__always_inline__))
+-vuzp1_s32 (int32x2_t a, int32x2_t b)
+-{
+- int32x2_t result;
+- __asm__ ("uzp1 %0.2s,%1.2s,%2.2s"
+- : "=w"(result)
+- : "w"(a), "w"(b)
+- : /* No clobbers */);
+- return result;
+-}
+-
+-__extension__ static __inline uint8x8_t __attribute__ ((__always_inline__))
+-vuzp1_u8 (uint8x8_t a, uint8x8_t b)
+-{
+- uint8x8_t result;
+- __asm__ ("uzp1 %0.8b,%1.8b,%2.8b"
+- : "=w"(result)
+- : "w"(a), "w"(b)
+- : /* No clobbers */);
+- return result;
+-}
+-
+-__extension__ static __inline uint16x4_t __attribute__ ((__always_inline__))
+-vuzp1_u16 (uint16x4_t a, uint16x4_t b)
+-{
+- uint16x4_t result;
+- __asm__ ("uzp1 %0.4h,%1.4h,%2.4h"
+- : "=w"(result)
+- : "w"(a), "w"(b)
+- : /* No clobbers */);
+- return result;
+-}
+-
+-__extension__ static __inline uint32x2_t __attribute__ ((__always_inline__))
+-vuzp1_u32 (uint32x2_t a, uint32x2_t b)
+-{
+- uint32x2_t result;
+- __asm__ ("uzp1 %0.2s,%1.2s,%2.2s"
+- : "=w"(result)
+- : "w"(a), "w"(b)
+- : /* No clobbers */);
+- return result;
+-}
+-
+-__extension__ static __inline float32x4_t __attribute__ ((__always_inline__))
+-vuzp1q_f32 (float32x4_t a, float32x4_t b)
+-{
+- float32x4_t result;
+- __asm__ ("uzp1 %0.4s,%1.4s,%2.4s"
+- : "=w"(result)
+- : "w"(a), "w"(b)
+- : /* No clobbers */);
+- return result;
+-}
+-
+-__extension__ static __inline float64x2_t __attribute__ ((__always_inline__))
+-vuzp1q_f64 (float64x2_t a, float64x2_t b)
+-{
+- float64x2_t result;
+- __asm__ ("uzp1 %0.2d,%1.2d,%2.2d"
+- : "=w"(result)
+- : "w"(a), "w"(b)
+- : /* No clobbers */);
+- return result;
+-}
+-
+-__extension__ static __inline poly8x16_t __attribute__ ((__always_inline__))
+-vuzp1q_p8 (poly8x16_t a, poly8x16_t b)
+-{
+- poly8x16_t result;
+- __asm__ ("uzp1 %0.16b,%1.16b,%2.16b"
+- : "=w"(result)
+- : "w"(a), "w"(b)
+- : /* No clobbers */);
+- return result;
+-}
+-
+-__extension__ static __inline poly16x8_t __attribute__ ((__always_inline__))
+-vuzp1q_p16 (poly16x8_t a, poly16x8_t b)
+-{
+- poly16x8_t result;
+- __asm__ ("uzp1 %0.8h,%1.8h,%2.8h"
+- : "=w"(result)
+- : "w"(a), "w"(b)
+- : /* No clobbers */);
+- return result;
+-}
+-
+-__extension__ static __inline int8x16_t __attribute__ ((__always_inline__))
+-vuzp1q_s8 (int8x16_t a, int8x16_t b)
+-{
+- int8x16_t result;
+- __asm__ ("uzp1 %0.16b,%1.16b,%2.16b"
+- : "=w"(result)
+- : "w"(a), "w"(b)
+- : /* No clobbers */);
+- return result;
+-}
+-
+-__extension__ static __inline int16x8_t __attribute__ ((__always_inline__))
+-vuzp1q_s16 (int16x8_t a, int16x8_t b)
+-{
+- int16x8_t result;
+- __asm__ ("uzp1 %0.8h,%1.8h,%2.8h"
+- : "=w"(result)
+- : "w"(a), "w"(b)
+- : /* No clobbers */);
+- return result;
+-}
+-
+-__extension__ static __inline int32x4_t __attribute__ ((__always_inline__))
+-vuzp1q_s32 (int32x4_t a, int32x4_t b)
+-{
+- int32x4_t result;
+- __asm__ ("uzp1 %0.4s,%1.4s,%2.4s"
+- : "=w"(result)
+- : "w"(a), "w"(b)
+- : /* No clobbers */);
+- return result;
+-}
+-
+-__extension__ static __inline int64x2_t __attribute__ ((__always_inline__))
+-vuzp1q_s64 (int64x2_t a, int64x2_t b)
+-{
+- int64x2_t result;
+- __asm__ ("uzp1 %0.2d,%1.2d,%2.2d"
+- : "=w"(result)
+- : "w"(a), "w"(b)
+- : /* No clobbers */);
+- return result;
+-}
+-
+-__extension__ static __inline uint8x16_t __attribute__ ((__always_inline__))
+-vuzp1q_u8 (uint8x16_t a, uint8x16_t b)
+-{
+- uint8x16_t result;
+- __asm__ ("uzp1 %0.16b,%1.16b,%2.16b"
+- : "=w"(result)
+- : "w"(a), "w"(b)
+- : /* No clobbers */);
+- return result;
+-}
+-
+-__extension__ static __inline uint16x8_t __attribute__ ((__always_inline__))
+-vuzp1q_u16 (uint16x8_t a, uint16x8_t b)
+-{
+- uint16x8_t result;
+- __asm__ ("uzp1 %0.8h,%1.8h,%2.8h"
+- : "=w"(result)
+- : "w"(a), "w"(b)
+- : /* No clobbers */);
+- return result;
+-}
+-
+-__extension__ static __inline uint32x4_t __attribute__ ((__always_inline__))
+-vuzp1q_u32 (uint32x4_t a, uint32x4_t b)
+-{
+- uint32x4_t result;
+- __asm__ ("uzp1 %0.4s,%1.4s,%2.4s"
+- : "=w"(result)
+- : "w"(a), "w"(b)
+- : /* No clobbers */);
+- return result;
+-}
+-
+-__extension__ static __inline uint64x2_t __attribute__ ((__always_inline__))
+-vuzp1q_u64 (uint64x2_t a, uint64x2_t b)
+-{
+- uint64x2_t result;
+- __asm__ ("uzp1 %0.2d,%1.2d,%2.2d"
+- : "=w"(result)
+- : "w"(a), "w"(b)
+- : /* No clobbers */);
+- return result;
+-}
+-
+-__extension__ static __inline float32x2_t __attribute__ ((__always_inline__))
+-vuzp2_f32 (float32x2_t a, float32x2_t b)
+-{
+- float32x2_t result;
+- __asm__ ("uzp2 %0.2s,%1.2s,%2.2s"
+- : "=w"(result)
+- : "w"(a), "w"(b)
+- : /* No clobbers */);
+- return result;
+-}
+-
+-__extension__ static __inline poly8x8_t __attribute__ ((__always_inline__))
+-vuzp2_p8 (poly8x8_t a, poly8x8_t b)
+-{
+- poly8x8_t result;
+- __asm__ ("uzp2 %0.8b,%1.8b,%2.8b"
+- : "=w"(result)
+- : "w"(a), "w"(b)
+- : /* No clobbers */);
+- return result;
+-}
+-
+-__extension__ static __inline poly16x4_t __attribute__ ((__always_inline__))
+-vuzp2_p16 (poly16x4_t a, poly16x4_t b)
+-{
+- poly16x4_t result;
+- __asm__ ("uzp2 %0.4h,%1.4h,%2.4h"
+- : "=w"(result)
+- : "w"(a), "w"(b)
+- : /* No clobbers */);
+- return result;
+-}
+-
+-__extension__ static __inline int8x8_t __attribute__ ((__always_inline__))
+-vuzp2_s8 (int8x8_t a, int8x8_t b)
+-{
+- int8x8_t result;
+- __asm__ ("uzp2 %0.8b,%1.8b,%2.8b"
+- : "=w"(result)
+- : "w"(a), "w"(b)
+- : /* No clobbers */);
+- return result;
+-}
+-
+-__extension__ static __inline int16x4_t __attribute__ ((__always_inline__))
+-vuzp2_s16 (int16x4_t a, int16x4_t b)
+-{
+- int16x4_t result;
+- __asm__ ("uzp2 %0.4h,%1.4h,%2.4h"
+- : "=w"(result)
+- : "w"(a), "w"(b)
+- : /* No clobbers */);
+- return result;
+-}
+-
+-__extension__ static __inline int32x2_t __attribute__ ((__always_inline__))
+-vuzp2_s32 (int32x2_t a, int32x2_t b)
+-{
+- int32x2_t result;
+- __asm__ ("uzp2 %0.2s,%1.2s,%2.2s"
+- : "=w"(result)
+- : "w"(a), "w"(b)
+- : /* No clobbers */);
+- return result;
+-}
+-
+-__extension__ static __inline uint8x8_t __attribute__ ((__always_inline__))
+-vuzp2_u8 (uint8x8_t a, uint8x8_t b)
+-{
+- uint8x8_t result;
+- __asm__ ("uzp2 %0.8b,%1.8b,%2.8b"
+- : "=w"(result)
+- : "w"(a), "w"(b)
+- : /* No clobbers */);
+- return result;
+-}
+-
+-__extension__ static __inline uint16x4_t __attribute__ ((__always_inline__))
+-vuzp2_u16 (uint16x4_t a, uint16x4_t b)
+-{
+- uint16x4_t result;
+- __asm__ ("uzp2 %0.4h,%1.4h,%2.4h"
+- : "=w"(result)
+- : "w"(a), "w"(b)
+- : /* No clobbers */);
+- return result;
+-}
+-
+-__extension__ static __inline uint32x2_t __attribute__ ((__always_inline__))
+-vuzp2_u32 (uint32x2_t a, uint32x2_t b)
+-{
+- uint32x2_t result;
+- __asm__ ("uzp2 %0.2s,%1.2s,%2.2s"
+- : "=w"(result)
+- : "w"(a), "w"(b)
+- : /* No clobbers */);
+- return result;
+-}
+-
+-__extension__ static __inline float32x4_t __attribute__ ((__always_inline__))
+-vuzp2q_f32 (float32x4_t a, float32x4_t b)
+-{
+- float32x4_t result;
+- __asm__ ("uzp2 %0.4s,%1.4s,%2.4s"
+- : "=w"(result)
+- : "w"(a), "w"(b)
+- : /* No clobbers */);
+- return result;
+-}
+-
+-__extension__ static __inline float64x2_t __attribute__ ((__always_inline__))
+-vuzp2q_f64 (float64x2_t a, float64x2_t b)
+-{
+- float64x2_t result;
+- __asm__ ("uzp2 %0.2d,%1.2d,%2.2d"
+- : "=w"(result)
+- : "w"(a), "w"(b)
+- : /* No clobbers */);
+- return result;
+-}
+-
+-__extension__ static __inline poly8x16_t __attribute__ ((__always_inline__))
+-vuzp2q_p8 (poly8x16_t a, poly8x16_t b)
+-{
+- poly8x16_t result;
+- __asm__ ("uzp2 %0.16b,%1.16b,%2.16b"
+- : "=w"(result)
+- : "w"(a), "w"(b)
+- : /* No clobbers */);
+- return result;
+-}
+-
+-__extension__ static __inline poly16x8_t __attribute__ ((__always_inline__))
+-vuzp2q_p16 (poly16x8_t a, poly16x8_t b)
+-{
+- poly16x8_t result;
+- __asm__ ("uzp2 %0.8h,%1.8h,%2.8h"
+- : "=w"(result)
+- : "w"(a), "w"(b)
+- : /* No clobbers */);
+- return result;
+-}
+-
+-__extension__ static __inline int8x16_t __attribute__ ((__always_inline__))
+-vuzp2q_s8 (int8x16_t a, int8x16_t b)
+-{
+- int8x16_t result;
+- __asm__ ("uzp2 %0.16b,%1.16b,%2.16b"
+- : "=w"(result)
+- : "w"(a), "w"(b)
+- : /* No clobbers */);
+- return result;
+-}
+-
+-__extension__ static __inline int16x8_t __attribute__ ((__always_inline__))
+-vuzp2q_s16 (int16x8_t a, int16x8_t b)
+-{
+- int16x8_t result;
+- __asm__ ("uzp2 %0.8h,%1.8h,%2.8h"
+- : "=w"(result)
+- : "w"(a), "w"(b)
+- : /* No clobbers */);
+- return result;
+-}
+-
+-__extension__ static __inline int32x4_t __attribute__ ((__always_inline__))
+-vuzp2q_s32 (int32x4_t a, int32x4_t b)
+-{
+- int32x4_t result;
+- __asm__ ("uzp2 %0.4s,%1.4s,%2.4s"
+- : "=w"(result)
+- : "w"(a), "w"(b)
+- : /* No clobbers */);
+- return result;
+-}
+-
+-__extension__ static __inline int64x2_t __attribute__ ((__always_inline__))
+-vuzp2q_s64 (int64x2_t a, int64x2_t b)
+-{
+- int64x2_t result;
+- __asm__ ("uzp2 %0.2d,%1.2d,%2.2d"
+- : "=w"(result)
+- : "w"(a), "w"(b)
+- : /* No clobbers */);
+- return result;
+-}
+-
+-__extension__ static __inline uint8x16_t __attribute__ ((__always_inline__))
+-vuzp2q_u8 (uint8x16_t a, uint8x16_t b)
+-{
+- uint8x16_t result;
+- __asm__ ("uzp2 %0.16b,%1.16b,%2.16b"
+- : "=w"(result)
+- : "w"(a), "w"(b)
+- : /* No clobbers */);
+- return result;
+-}
+-
+-__extension__ static __inline uint16x8_t __attribute__ ((__always_inline__))
+-vuzp2q_u16 (uint16x8_t a, uint16x8_t b)
+-{
+- uint16x8_t result;
+- __asm__ ("uzp2 %0.8h,%1.8h,%2.8h"
+- : "=w"(result)
+- : "w"(a), "w"(b)
+- : /* No clobbers */);
+- return result;
+-}
+-
+-__extension__ static __inline uint32x4_t __attribute__ ((__always_inline__))
+-vuzp2q_u32 (uint32x4_t a, uint32x4_t b)
+-{
+- uint32x4_t result;
+- __asm__ ("uzp2 %0.4s,%1.4s,%2.4s"
+- : "=w"(result)
+- : "w"(a), "w"(b)
+- : /* No clobbers */);
+- return result;
+-}
+-
+-__extension__ static __inline uint64x2_t __attribute__ ((__always_inline__))
+-vuzp2q_u64 (uint64x2_t a, uint64x2_t b)
+-{
+- uint64x2_t result;
+- __asm__ ("uzp2 %0.2d,%1.2d,%2.2d"
+- : "=w"(result)
+- : "w"(a), "w"(b)
+- : /* No clobbers */);
+- return result;
+-}
+-
-__extension__ static __inline float32x2_t __attribute__ ((__always_inline__))
-vzip1_f32 (float32x2_t a, float32x2_t b)
-{
@@ -8772,7 +19730,7 @@ LANG=C svn diff svn://gcc.gnu.org/svn/gcc/branches/gcc-4_9-branch@211979 \
/* End of temporary inline asm implementations. */
/* Start of temporary inline asm for vldn, vstn and friends. */
-@@ -14205,132 +13990,225 @@
+@@ -14205,132 +12345,225 @@
__LD4_LANE_FUNC (uint32x4x4_t, uint32_t, 4s, s, u32, q)
__LD4_LANE_FUNC (uint64x2x4_t, uint64_t, 2d, d, u64, q)
@@ -9118,7 +20076,300 @@ LANG=C svn diff svn://gcc.gnu.org/svn/gcc/branches/gcc-4_9-branch@211979 \
__extension__ static __inline int64_t __attribute__ ((__always_inline__))
vaddlv_s32 (int32x2_t a)
{
-@@ -20943,6 +20821,12 @@
+@@ -18489,6 +16722,292 @@
+ return __aarch64_vgetq_lane_u64 (__a, __b);
+ }
+
++/* vext */
++
++__extension__ static __inline float32x2_t __attribute__ ((__always_inline__))
++vext_f32 (float32x2_t __a, float32x2_t __b, __const int __c)
++{
++ __builtin_aarch64_im_lane_boundsi (__c, 2);
++#ifdef __AARCH64EB__
++ return __builtin_shuffle (__b, __a, (uint32x2_t) {2-__c, 3-__c});
++#else
++ return __builtin_shuffle (__a, __b, (uint32x2_t) {__c, __c+1});
++#endif
++}
++
++__extension__ static __inline float64x1_t __attribute__ ((__always_inline__))
++vext_f64 (float64x1_t __a, float64x1_t __b, __const int __c)
++{
++ /* The only possible index to the assembler instruction returns element 0. */
++ __builtin_aarch64_im_lane_boundsi (__c, 1);
++ return __a;
++}
++__extension__ static __inline poly8x8_t __attribute__ ((__always_inline__))
++vext_p8 (poly8x8_t __a, poly8x8_t __b, __const int __c)
++{
++ __builtin_aarch64_im_lane_boundsi (__c, 8);
++#ifdef __AARCH64EB__
++ return __builtin_shuffle (__b, __a, (uint8x8_t)
++ {8-__c, 9-__c, 10-__c, 11-__c, 12-__c, 13-__c, 14-__c, 15-__c});
++#else
++ return __builtin_shuffle (__a, __b,
++ (uint8x8_t) {__c, __c+1, __c+2, __c+3, __c+4, __c+5, __c+6, __c+7});
++#endif
++}
++
++__extension__ static __inline poly16x4_t __attribute__ ((__always_inline__))
++vext_p16 (poly16x4_t __a, poly16x4_t __b, __const int __c)
++{
++ __builtin_aarch64_im_lane_boundsi (__c, 4);
++#ifdef __AARCH64EB__
++ return __builtin_shuffle (__b, __a,
++ (uint16x4_t) {4-__c, 5-__c, 6-__c, 7-__c});
++#else
++ return __builtin_shuffle (__a, __b, (uint16x4_t) {__c, __c+1, __c+2, __c+3});
++#endif
++}
++
++__extension__ static __inline int8x8_t __attribute__ ((__always_inline__))
++vext_s8 (int8x8_t __a, int8x8_t __b, __const int __c)
++{
++ __builtin_aarch64_im_lane_boundsi (__c, 8);
++#ifdef __AARCH64EB__
++ return __builtin_shuffle (__b, __a, (uint8x8_t)
++ {8-__c, 9-__c, 10-__c, 11-__c, 12-__c, 13-__c, 14-__c, 15-__c});
++#else
++ return __builtin_shuffle (__a, __b,
++ (uint8x8_t) {__c, __c+1, __c+2, __c+3, __c+4, __c+5, __c+6, __c+7});
++#endif
++}
++
++__extension__ static __inline int16x4_t __attribute__ ((__always_inline__))
++vext_s16 (int16x4_t __a, int16x4_t __b, __const int __c)
++{
++ __builtin_aarch64_im_lane_boundsi (__c, 4);
++#ifdef __AARCH64EB__
++ return __builtin_shuffle (__b, __a,
++ (uint16x4_t) {4-__c, 5-__c, 6-__c, 7-__c});
++#else
++ return __builtin_shuffle (__a, __b, (uint16x4_t) {__c, __c+1, __c+2, __c+3});
++#endif
++}
++
++__extension__ static __inline int32x2_t __attribute__ ((__always_inline__))
++vext_s32 (int32x2_t __a, int32x2_t __b, __const int __c)
++{
++ __builtin_aarch64_im_lane_boundsi (__c, 2);
++#ifdef __AARCH64EB__
++ return __builtin_shuffle (__b, __a, (uint32x2_t) {2-__c, 3-__c});
++#else
++ return __builtin_shuffle (__a, __b, (uint32x2_t) {__c, __c+1});
++#endif
++}
++
++__extension__ static __inline int64x1_t __attribute__ ((__always_inline__))
++vext_s64 (int64x1_t __a, int64x1_t __b, __const int __c)
++{
++ /* The only possible index to the assembler instruction returns element 0. */
++ __builtin_aarch64_im_lane_boundsi (__c, 1);
++ return __a;
++}
++
++__extension__ static __inline uint8x8_t __attribute__ ((__always_inline__))
++vext_u8 (uint8x8_t __a, uint8x8_t __b, __const int __c)
++{
++ __builtin_aarch64_im_lane_boundsi (__c, 8);
++#ifdef __AARCH64EB__
++ return __builtin_shuffle (__b, __a, (uint8x8_t)
++ {8-__c, 9-__c, 10-__c, 11-__c, 12-__c, 13-__c, 14-__c, 15-__c});
++#else
++ return __builtin_shuffle (__a, __b,
++ (uint8x8_t) {__c, __c+1, __c+2, __c+3, __c+4, __c+5, __c+6, __c+7});
++#endif
++}
++
++__extension__ static __inline uint16x4_t __attribute__ ((__always_inline__))
++vext_u16 (uint16x4_t __a, uint16x4_t __b, __const int __c)
++{
++ __builtin_aarch64_im_lane_boundsi (__c, 4);
++#ifdef __AARCH64EB__
++ return __builtin_shuffle (__b, __a,
++ (uint16x4_t) {4-__c, 5-__c, 6-__c, 7-__c});
++#else
++ return __builtin_shuffle (__a, __b, (uint16x4_t) {__c, __c+1, __c+2, __c+3});
++#endif
++}
++
++__extension__ static __inline uint32x2_t __attribute__ ((__always_inline__))
++vext_u32 (uint32x2_t __a, uint32x2_t __b, __const int __c)
++{
++ __builtin_aarch64_im_lane_boundsi (__c, 2);
++#ifdef __AARCH64EB__
++ return __builtin_shuffle (__b, __a, (uint32x2_t) {2-__c, 3-__c});
++#else
++ return __builtin_shuffle (__a, __b, (uint32x2_t) {__c, __c+1});
++#endif
++}
++
++__extension__ static __inline uint64x1_t __attribute__ ((__always_inline__))
++vext_u64 (uint64x1_t __a, uint64x1_t __b, __const int __c)
++{
++ /* The only possible index to the assembler instruction returns element 0. */
++ __builtin_aarch64_im_lane_boundsi (__c, 1);
++ return __a;
++}
++
++__extension__ static __inline float32x4_t __attribute__ ((__always_inline__))
++vextq_f32 (float32x4_t __a, float32x4_t __b, __const int __c)
++{
++ __builtin_aarch64_im_lane_boundsi (__c, 4);
++#ifdef __AARCH64EB__
++ return __builtin_shuffle (__b, __a,
++ (uint32x4_t) {4-__c, 5-__c, 6-__c, 7-__c});
++#else
++ return __builtin_shuffle (__a, __b, (uint32x4_t) {__c, __c+1, __c+2, __c+3});
++#endif
++}
++
++__extension__ static __inline float64x2_t __attribute__ ((__always_inline__))
++vextq_f64 (float64x2_t __a, float64x2_t __b, __const int __c)
++{
++ __builtin_aarch64_im_lane_boundsi (__c, 2);
++#ifdef __AARCH64EB__
++ return __builtin_shuffle (__b, __a, (uint64x2_t) {2-__c, 3-__c});
++#else
++ return __builtin_shuffle (__a, __b, (uint64x2_t) {__c, __c+1});
++#endif
++}
++
++__extension__ static __inline poly8x16_t __attribute__ ((__always_inline__))
++vextq_p8 (poly8x16_t __a, poly8x16_t __b, __const int __c)
++{
++ __builtin_aarch64_im_lane_boundsi (__c, 16);
++#ifdef __AARCH64EB__
++ return __builtin_shuffle (__b, __a, (uint8x16_t)
++ {16-__c, 17-__c, 18-__c, 19-__c, 20-__c, 21-__c, 22-__c, 23-__c,
++ 24-__c, 25-__c, 26-__c, 27-__c, 28-__c, 29-__c, 30-__c, 31-__c});
++#else
++ return __builtin_shuffle (__a, __b, (uint8x16_t)
++ {__c, __c+1, __c+2, __c+3, __c+4, __c+5, __c+6, __c+7,
++ __c+8, __c+9, __c+10, __c+11, __c+12, __c+13, __c+14, __c+15});
++#endif
++}
++
++__extension__ static __inline poly16x8_t __attribute__ ((__always_inline__))
++vextq_p16 (poly16x8_t __a, poly16x8_t __b, __const int __c)
++{
++ __builtin_aarch64_im_lane_boundsi (__c, 8);
++#ifdef __AARCH64EB__
++ return __builtin_shuffle (__b, __a, (uint16x8_t)
++ {8-__c, 9-__c, 10-__c, 11-__c, 12-__c, 13-__c, 14-__c, 15-__c});
++#else
++ return __builtin_shuffle (__a, __b,
++ (uint16x8_t) {__c, __c+1, __c+2, __c+3, __c+4, __c+5, __c+6, __c+7});
++#endif
++}
++
++__extension__ static __inline int8x16_t __attribute__ ((__always_inline__))
++vextq_s8 (int8x16_t __a, int8x16_t __b, __const int __c)
++{
++ __builtin_aarch64_im_lane_boundsi (__c, 16);
++#ifdef __AARCH64EB__
++ return __builtin_shuffle (__b, __a, (uint8x16_t)
++ {16-__c, 17-__c, 18-__c, 19-__c, 20-__c, 21-__c, 22-__c, 23-__c,
++ 24-__c, 25-__c, 26-__c, 27-__c, 28-__c, 29-__c, 30-__c, 31-__c});
++#else
++ return __builtin_shuffle (__a, __b, (uint8x16_t)
++ {__c, __c+1, __c+2, __c+3, __c+4, __c+5, __c+6, __c+7,
++ __c+8, __c+9, __c+10, __c+11, __c+12, __c+13, __c+14, __c+15});
++#endif
++}
++
++__extension__ static __inline int16x8_t __attribute__ ((__always_inline__))
++vextq_s16 (int16x8_t __a, int16x8_t __b, __const int __c)
++{
++ __builtin_aarch64_im_lane_boundsi (__c, 8);
++#ifdef __AARCH64EB__
++ return __builtin_shuffle (__b, __a, (uint16x8_t)
++ {8-__c, 9-__c, 10-__c, 11-__c, 12-__c, 13-__c, 14-__c, 15-__c});
++#else
++ return __builtin_shuffle (__a, __b,
++ (uint16x8_t) {__c, __c+1, __c+2, __c+3, __c+4, __c+5, __c+6, __c+7});
++#endif
++}
++
++__extension__ static __inline int32x4_t __attribute__ ((__always_inline__))
++vextq_s32 (int32x4_t __a, int32x4_t __b, __const int __c)
++{
++ __builtin_aarch64_im_lane_boundsi (__c, 4);
++#ifdef __AARCH64EB__
++ return __builtin_shuffle (__b, __a,
++ (uint32x4_t) {4-__c, 5-__c, 6-__c, 7-__c});
++#else
++ return __builtin_shuffle (__a, __b, (uint32x4_t) {__c, __c+1, __c+2, __c+3});
++#endif
++}
++
++__extension__ static __inline int64x2_t __attribute__ ((__always_inline__))
++vextq_s64 (int64x2_t __a, int64x2_t __b, __const int __c)
++{
++ __builtin_aarch64_im_lane_boundsi (__c, 2);
++#ifdef __AARCH64EB__
++ return __builtin_shuffle (__b, __a, (uint64x2_t) {2-__c, 3-__c});
++#else
++ return __builtin_shuffle (__a, __b, (uint64x2_t) {__c, __c+1});
++#endif
++}
++
++__extension__ static __inline uint8x16_t __attribute__ ((__always_inline__))
++vextq_u8 (uint8x16_t __a, uint8x16_t __b, __const int __c)
++{
++ __builtin_aarch64_im_lane_boundsi (__c, 16);
++#ifdef __AARCH64EB__
++ return __builtin_shuffle (__b, __a, (uint8x16_t)
++ {16-__c, 17-__c, 18-__c, 19-__c, 20-__c, 21-__c, 22-__c, 23-__c,
++ 24-__c, 25-__c, 26-__c, 27-__c, 28-__c, 29-__c, 30-__c, 31-__c});
++#else
++ return __builtin_shuffle (__a, __b, (uint8x16_t)
++ {__c, __c+1, __c+2, __c+3, __c+4, __c+5, __c+6, __c+7,
++ __c+8, __c+9, __c+10, __c+11, __c+12, __c+13, __c+14, __c+15});
++#endif
++}
++
++__extension__ static __inline uint16x8_t __attribute__ ((__always_inline__))
++vextq_u16 (uint16x8_t __a, uint16x8_t __b, __const int __c)
++{
++ __builtin_aarch64_im_lane_boundsi (__c, 8);
++#ifdef __AARCH64EB__
++ return __builtin_shuffle (__b, __a, (uint16x8_t)
++ {8-__c, 9-__c, 10-__c, 11-__c, 12-__c, 13-__c, 14-__c, 15-__c});
++#else
++ return __builtin_shuffle (__a, __b,
++ (uint16x8_t) {__c, __c+1, __c+2, __c+3, __c+4, __c+5, __c+6, __c+7});
++#endif
++}
++
++__extension__ static __inline uint32x4_t __attribute__ ((__always_inline__))
++vextq_u32 (uint32x4_t __a, uint32x4_t __b, __const int __c)
++{
++ __builtin_aarch64_im_lane_boundsi (__c, 4);
++#ifdef __AARCH64EB__
++ return __builtin_shuffle (__b, __a,
++ (uint32x4_t) {4-__c, 5-__c, 6-__c, 7-__c});
++#else
++ return __builtin_shuffle (__a, __b, (uint32x4_t) {__c, __c+1, __c+2, __c+3});
++#endif
++}
++
++__extension__ static __inline uint64x2_t __attribute__ ((__always_inline__))
++vextq_u64 (uint64x2_t __a, uint64x2_t __b, __const int __c)
++{
++ __builtin_aarch64_im_lane_boundsi (__c, 2);
++#ifdef __AARCH64EB__
++ return __builtin_shuffle (__b, __a, (uint64x2_t) {2-__c, 3-__c});
++#else
++ return __builtin_shuffle (__a, __b, (uint64x2_t) {__c, __c+1});
++#endif
++}
++
+ /* vfma_lane */
+
+ __extension__ static __inline float32x2_t __attribute__ ((__always_inline__))
+@@ -20943,6 +19462,12 @@
return (int32x1_t) __builtin_aarch64_sqabssi (__a);
}
@@ -9131,7 +20382,38 @@ LANG=C svn diff svn://gcc.gnu.org/svn/gcc/branches/gcc-4_9-branch@211979 \
/* vqadd */
__extension__ static __inline int8x1_t __attribute__ ((__always_inline__))
-@@ -21561,6 +21445,12 @@
+@@ -20972,25 +19497,26 @@
+ __extension__ static __inline uint8x1_t __attribute__ ((__always_inline__))
+ vqaddb_u8 (uint8x1_t __a, uint8x1_t __b)
+ {
+- return (uint8x1_t) __builtin_aarch64_uqaddqi (__a, __b);
++ return (uint8x1_t) __builtin_aarch64_uqaddqi_uuu (__a, __b);
+ }
+
+ __extension__ static __inline uint16x1_t __attribute__ ((__always_inline__))
+ vqaddh_u16 (uint16x1_t __a, uint16x1_t __b)
+ {
+- return (uint16x1_t) __builtin_aarch64_uqaddhi (__a, __b);
++ return (uint16x1_t) __builtin_aarch64_uqaddhi_uuu (__a, __b);
+ }
+
+ __extension__ static __inline uint32x1_t __attribute__ ((__always_inline__))
+ vqadds_u32 (uint32x1_t __a, uint32x1_t __b)
+ {
+- return (uint32x1_t) __builtin_aarch64_uqaddsi (__a, __b);
++ return (uint32x1_t) __builtin_aarch64_uqaddsi_uuu (__a, __b);
+ }
+
+ __extension__ static __inline uint64x1_t __attribute__ ((__always_inline__))
+ vqaddd_u64 (uint64x1_t __a, uint64x1_t __b)
+ {
+- return (uint64x1_t) __builtin_aarch64_uqadddi (__a, __b);
++ return (uint64x1_t) __builtin_aarch64_uqadddi_uuu ((uint64_t) __a,
++ (uint64_t) __b);
+ }
+
+ /* vqdmlal */
+@@ -21555,6 +20081,12 @@
return (int32x1_t) __builtin_aarch64_sqnegsi (__a);
}
@@ -9144,7 +20426,721 @@ LANG=C svn diff svn://gcc.gnu.org/svn/gcc/branches/gcc-4_9-branch@211979 \
/* vqrdmulh */
__extension__ static __inline int16x4_t __attribute__ ((__always_inline__))
-@@ -22481,6 +22371,12 @@
+@@ -21634,25 +20166,25 @@
+ __extension__ static __inline uint8x8_t __attribute__ ((__always_inline__))
+ vqrshl_u8 (uint8x8_t __a, int8x8_t __b)
+ {
+- return (uint8x8_t) __builtin_aarch64_uqrshlv8qi ((int8x8_t) __a, __b);
++ return __builtin_aarch64_uqrshlv8qi_uus ( __a, __b);
+ }
+
+ __extension__ static __inline uint16x4_t __attribute__ ((__always_inline__))
+ vqrshl_u16 (uint16x4_t __a, int16x4_t __b)
+ {
+- return (uint16x4_t) __builtin_aarch64_uqrshlv4hi ((int16x4_t) __a, __b);
++ return __builtin_aarch64_uqrshlv4hi_uus ( __a, __b);
+ }
+
+ __extension__ static __inline uint32x2_t __attribute__ ((__always_inline__))
+ vqrshl_u32 (uint32x2_t __a, int32x2_t __b)
+ {
+- return (uint32x2_t) __builtin_aarch64_uqrshlv2si ((int32x2_t) __a, __b);
++ return __builtin_aarch64_uqrshlv2si_uus ( __a, __b);
+ }
+
+ __extension__ static __inline uint64x1_t __attribute__ ((__always_inline__))
+ vqrshl_u64 (uint64x1_t __a, int64x1_t __b)
+ {
+- return (uint64x1_t) __builtin_aarch64_uqrshldi ((int64x1_t) __a, __b);
++ return __builtin_aarch64_uqrshldi_uus ( __a, __b);
+ }
+
+ __extension__ static __inline int8x16_t __attribute__ ((__always_inline__))
+@@ -21682,25 +20214,25 @@
+ __extension__ static __inline uint8x16_t __attribute__ ((__always_inline__))
+ vqrshlq_u8 (uint8x16_t __a, int8x16_t __b)
+ {
+- return (uint8x16_t) __builtin_aarch64_uqrshlv16qi ((int8x16_t) __a, __b);
++ return __builtin_aarch64_uqrshlv16qi_uus ( __a, __b);
+ }
+
+ __extension__ static __inline uint16x8_t __attribute__ ((__always_inline__))
+ vqrshlq_u16 (uint16x8_t __a, int16x8_t __b)
+ {
+- return (uint16x8_t) __builtin_aarch64_uqrshlv8hi ((int16x8_t) __a, __b);
++ return __builtin_aarch64_uqrshlv8hi_uus ( __a, __b);
+ }
+
+ __extension__ static __inline uint32x4_t __attribute__ ((__always_inline__))
+ vqrshlq_u32 (uint32x4_t __a, int32x4_t __b)
+ {
+- return (uint32x4_t) __builtin_aarch64_uqrshlv4si ((int32x4_t) __a, __b);
++ return __builtin_aarch64_uqrshlv4si_uus ( __a, __b);
+ }
+
+ __extension__ static __inline uint64x2_t __attribute__ ((__always_inline__))
+ vqrshlq_u64 (uint64x2_t __a, int64x2_t __b)
+ {
+- return (uint64x2_t) __builtin_aarch64_uqrshlv2di ((int64x2_t) __a, __b);
++ return __builtin_aarch64_uqrshlv2di_uus ( __a, __b);
+ }
+
+ __extension__ static __inline int8x1_t __attribute__ ((__always_inline__))
+@@ -21730,25 +20262,25 @@
+ __extension__ static __inline uint8x1_t __attribute__ ((__always_inline__))
+ vqrshlb_u8 (uint8x1_t __a, uint8x1_t __b)
+ {
+- return (uint8x1_t) __builtin_aarch64_uqrshlqi (__a, __b);
++ return __builtin_aarch64_uqrshlqi_uus (__a, __b);
+ }
+
+ __extension__ static __inline uint16x1_t __attribute__ ((__always_inline__))
+ vqrshlh_u16 (uint16x1_t __a, uint16x1_t __b)
+ {
+- return (uint16x1_t) __builtin_aarch64_uqrshlhi (__a, __b);
++ return __builtin_aarch64_uqrshlhi_uus (__a, __b);
+ }
+
+ __extension__ static __inline uint32x1_t __attribute__ ((__always_inline__))
+ vqrshls_u32 (uint32x1_t __a, uint32x1_t __b)
+ {
+- return (uint32x1_t) __builtin_aarch64_uqrshlsi (__a, __b);
++ return __builtin_aarch64_uqrshlsi_uus (__a, __b);
+ }
+
+ __extension__ static __inline uint64x1_t __attribute__ ((__always_inline__))
+ vqrshld_u64 (uint64x1_t __a, uint64x1_t __b)
+ {
+- return (uint64x1_t) __builtin_aarch64_uqrshldi (__a, __b);
++ return __builtin_aarch64_uqrshldi_uus (__a, __b);
+ }
+
+ /* vqrshrn */
+@@ -21774,19 +20306,19 @@
+ __extension__ static __inline uint8x8_t __attribute__ ((__always_inline__))
+ vqrshrn_n_u16 (uint16x8_t __a, const int __b)
+ {
+- return (uint8x8_t) __builtin_aarch64_uqrshrn_nv8hi ((int16x8_t) __a, __b);
++ return __builtin_aarch64_uqrshrn_nv8hi_uus ( __a, __b);
+ }
+
+ __extension__ static __inline uint16x4_t __attribute__ ((__always_inline__))
+ vqrshrn_n_u32 (uint32x4_t __a, const int __b)
+ {
+- return (uint16x4_t) __builtin_aarch64_uqrshrn_nv4si ((int32x4_t) __a, __b);
++ return __builtin_aarch64_uqrshrn_nv4si_uus ( __a, __b);
+ }
+
+ __extension__ static __inline uint32x2_t __attribute__ ((__always_inline__))
+ vqrshrn_n_u64 (uint64x2_t __a, const int __b)
+ {
+- return (uint32x2_t) __builtin_aarch64_uqrshrn_nv2di ((int64x2_t) __a, __b);
++ return __builtin_aarch64_uqrshrn_nv2di_uus ( __a, __b);
+ }
+
+ __extension__ static __inline int8x1_t __attribute__ ((__always_inline__))
+@@ -21810,19 +20342,19 @@
+ __extension__ static __inline uint8x1_t __attribute__ ((__always_inline__))
+ vqrshrnh_n_u16 (uint16x1_t __a, const int __b)
+ {
+- return (uint8x1_t) __builtin_aarch64_uqrshrn_nhi (__a, __b);
++ return __builtin_aarch64_uqrshrn_nhi_uus (__a, __b);
+ }
+
+ __extension__ static __inline uint16x1_t __attribute__ ((__always_inline__))
+ vqrshrns_n_u32 (uint32x1_t __a, const int __b)
+ {
+- return (uint16x1_t) __builtin_aarch64_uqrshrn_nsi (__a, __b);
++ return __builtin_aarch64_uqrshrn_nsi_uus (__a, __b);
+ }
+
+ __extension__ static __inline uint32x1_t __attribute__ ((__always_inline__))
+ vqrshrnd_n_u64 (uint64x1_t __a, const int __b)
+ {
+- return (uint32x1_t) __builtin_aarch64_uqrshrn_ndi (__a, __b);
++ return __builtin_aarch64_uqrshrn_ndi_uus (__a, __b);
+ }
+
+ /* vqrshrun */
+@@ -21892,25 +20424,25 @@
+ __extension__ static __inline uint8x8_t __attribute__ ((__always_inline__))
+ vqshl_u8 (uint8x8_t __a, int8x8_t __b)
+ {
+- return (uint8x8_t) __builtin_aarch64_uqshlv8qi ((int8x8_t) __a, __b);
++ return __builtin_aarch64_uqshlv8qi_uus ( __a, __b);
+ }
+
+ __extension__ static __inline uint16x4_t __attribute__ ((__always_inline__))
+ vqshl_u16 (uint16x4_t __a, int16x4_t __b)
+ {
+- return (uint16x4_t) __builtin_aarch64_uqshlv4hi ((int16x4_t) __a, __b);
++ return __builtin_aarch64_uqshlv4hi_uus ( __a, __b);
+ }
+
+ __extension__ static __inline uint32x2_t __attribute__ ((__always_inline__))
+ vqshl_u32 (uint32x2_t __a, int32x2_t __b)
+ {
+- return (uint32x2_t) __builtin_aarch64_uqshlv2si ((int32x2_t) __a, __b);
++ return __builtin_aarch64_uqshlv2si_uus ( __a, __b);
+ }
+
+ __extension__ static __inline uint64x1_t __attribute__ ((__always_inline__))
+ vqshl_u64 (uint64x1_t __a, int64x1_t __b)
+ {
+- return (uint64x1_t) __builtin_aarch64_uqshldi ((int64x1_t) __a, __b);
++ return __builtin_aarch64_uqshldi_uus ( __a, __b);
+ }
+
+ __extension__ static __inline int8x16_t __attribute__ ((__always_inline__))
+@@ -21940,25 +20472,25 @@
+ __extension__ static __inline uint8x16_t __attribute__ ((__always_inline__))
+ vqshlq_u8 (uint8x16_t __a, int8x16_t __b)
+ {
+- return (uint8x16_t) __builtin_aarch64_uqshlv16qi ((int8x16_t) __a, __b);
++ return __builtin_aarch64_uqshlv16qi_uus ( __a, __b);
+ }
+
+ __extension__ static __inline uint16x8_t __attribute__ ((__always_inline__))
+ vqshlq_u16 (uint16x8_t __a, int16x8_t __b)
+ {
+- return (uint16x8_t) __builtin_aarch64_uqshlv8hi ((int16x8_t) __a, __b);
++ return __builtin_aarch64_uqshlv8hi_uus ( __a, __b);
+ }
+
+ __extension__ static __inline uint32x4_t __attribute__ ((__always_inline__))
+ vqshlq_u32 (uint32x4_t __a, int32x4_t __b)
+ {
+- return (uint32x4_t) __builtin_aarch64_uqshlv4si ((int32x4_t) __a, __b);
++ return __builtin_aarch64_uqshlv4si_uus ( __a, __b);
+ }
+
+ __extension__ static __inline uint64x2_t __attribute__ ((__always_inline__))
+ vqshlq_u64 (uint64x2_t __a, int64x2_t __b)
+ {
+- return (uint64x2_t) __builtin_aarch64_uqshlv2di ((int64x2_t) __a, __b);
++ return __builtin_aarch64_uqshlv2di_uus ( __a, __b);
+ }
+
+ __extension__ static __inline int8x1_t __attribute__ ((__always_inline__))
+@@ -21988,25 +20520,25 @@
+ __extension__ static __inline uint8x1_t __attribute__ ((__always_inline__))
+ vqshlb_u8 (uint8x1_t __a, uint8x1_t __b)
+ {
+- return (uint8x1_t) __builtin_aarch64_uqshlqi (__a, __b);
++ return __builtin_aarch64_uqshlqi_uus (__a, __b);
+ }
+
+ __extension__ static __inline uint16x1_t __attribute__ ((__always_inline__))
+ vqshlh_u16 (uint16x1_t __a, uint16x1_t __b)
+ {
+- return (uint16x1_t) __builtin_aarch64_uqshlhi (__a, __b);
++ return __builtin_aarch64_uqshlhi_uus (__a, __b);
+ }
+
+ __extension__ static __inline uint32x1_t __attribute__ ((__always_inline__))
+ vqshls_u32 (uint32x1_t __a, uint32x1_t __b)
+ {
+- return (uint32x1_t) __builtin_aarch64_uqshlsi (__a, __b);
++ return __builtin_aarch64_uqshlsi_uus (__a, __b);
+ }
+
+ __extension__ static __inline uint64x1_t __attribute__ ((__always_inline__))
+ vqshld_u64 (uint64x1_t __a, uint64x1_t __b)
+ {
+- return (uint64x1_t) __builtin_aarch64_uqshldi (__a, __b);
++ return __builtin_aarch64_uqshldi_uus (__a, __b);
+ }
+
+ __extension__ static __inline int8x8_t __attribute__ ((__always_inline__))
+@@ -22036,25 +20568,25 @@
+ __extension__ static __inline uint8x8_t __attribute__ ((__always_inline__))
+ vqshl_n_u8 (uint8x8_t __a, const int __b)
+ {
+- return (uint8x8_t) __builtin_aarch64_uqshl_nv8qi ((int8x8_t) __a, __b);
++ return __builtin_aarch64_uqshl_nv8qi_uus (__a, __b);
+ }
+
+ __extension__ static __inline uint16x4_t __attribute__ ((__always_inline__))
+ vqshl_n_u16 (uint16x4_t __a, const int __b)
+ {
+- return (uint16x4_t) __builtin_aarch64_uqshl_nv4hi ((int16x4_t) __a, __b);
++ return __builtin_aarch64_uqshl_nv4hi_uus (__a, __b);
+ }
+
+ __extension__ static __inline uint32x2_t __attribute__ ((__always_inline__))
+ vqshl_n_u32 (uint32x2_t __a, const int __b)
+ {
+- return (uint32x2_t) __builtin_aarch64_uqshl_nv2si ((int32x2_t) __a, __b);
++ return __builtin_aarch64_uqshl_nv2si_uus (__a, __b);
+ }
+
+ __extension__ static __inline uint64x1_t __attribute__ ((__always_inline__))
+ vqshl_n_u64 (uint64x1_t __a, const int __b)
+ {
+- return (uint64x1_t) __builtin_aarch64_uqshl_ndi ((int64x1_t) __a, __b);
++ return __builtin_aarch64_uqshl_ndi_uus (__a, __b);
+ }
+
+ __extension__ static __inline int8x16_t __attribute__ ((__always_inline__))
+@@ -22084,25 +20616,25 @@
+ __extension__ static __inline uint8x16_t __attribute__ ((__always_inline__))
+ vqshlq_n_u8 (uint8x16_t __a, const int __b)
+ {
+- return (uint8x16_t) __builtin_aarch64_uqshl_nv16qi ((int8x16_t) __a, __b);
++ return __builtin_aarch64_uqshl_nv16qi_uus (__a, __b);
+ }
+
+ __extension__ static __inline uint16x8_t __attribute__ ((__always_inline__))
+ vqshlq_n_u16 (uint16x8_t __a, const int __b)
+ {
+- return (uint16x8_t) __builtin_aarch64_uqshl_nv8hi ((int16x8_t) __a, __b);
++ return __builtin_aarch64_uqshl_nv8hi_uus (__a, __b);
+ }
+
+ __extension__ static __inline uint32x4_t __attribute__ ((__always_inline__))
+ vqshlq_n_u32 (uint32x4_t __a, const int __b)
+ {
+- return (uint32x4_t) __builtin_aarch64_uqshl_nv4si ((int32x4_t) __a, __b);
++ return __builtin_aarch64_uqshl_nv4si_uus (__a, __b);
+ }
+
+ __extension__ static __inline uint64x2_t __attribute__ ((__always_inline__))
+ vqshlq_n_u64 (uint64x2_t __a, const int __b)
+ {
+- return (uint64x2_t) __builtin_aarch64_uqshl_nv2di ((int64x2_t) __a, __b);
++ return __builtin_aarch64_uqshl_nv2di_uus (__a, __b);
+ }
+
+ __extension__ static __inline int8x1_t __attribute__ ((__always_inline__))
+@@ -22132,25 +20664,25 @@
+ __extension__ static __inline uint8x1_t __attribute__ ((__always_inline__))
+ vqshlb_n_u8 (uint8x1_t __a, const int __b)
+ {
+- return (uint8x1_t) __builtin_aarch64_uqshl_nqi (__a, __b);
++ return __builtin_aarch64_uqshl_nqi_uus (__a, __b);
+ }
+
+ __extension__ static __inline uint16x1_t __attribute__ ((__always_inline__))
+ vqshlh_n_u16 (uint16x1_t __a, const int __b)
+ {
+- return (uint16x1_t) __builtin_aarch64_uqshl_nhi (__a, __b);
++ return __builtin_aarch64_uqshl_nhi_uus (__a, __b);
+ }
+
+ __extension__ static __inline uint32x1_t __attribute__ ((__always_inline__))
+ vqshls_n_u32 (uint32x1_t __a, const int __b)
+ {
+- return (uint32x1_t) __builtin_aarch64_uqshl_nsi (__a, __b);
++ return __builtin_aarch64_uqshl_nsi_uus (__a, __b);
+ }
+
+ __extension__ static __inline uint64x1_t __attribute__ ((__always_inline__))
+ vqshld_n_u64 (uint64x1_t __a, const int __b)
+ {
+- return (uint64x1_t) __builtin_aarch64_uqshl_ndi (__a, __b);
++ return __builtin_aarch64_uqshl_ndi_uus (__a, __b);
+ }
+
+ /* vqshlu */
+@@ -22158,73 +20690,73 @@
+ __extension__ static __inline uint8x8_t __attribute__ ((__always_inline__))
+ vqshlu_n_s8 (int8x8_t __a, const int __b)
+ {
+- return (uint8x8_t) __builtin_aarch64_sqshlu_nv8qi (__a, __b);
++ return __builtin_aarch64_sqshlu_nv8qi_uss (__a, __b);
+ }
+
+ __extension__ static __inline uint16x4_t __attribute__ ((__always_inline__))
+ vqshlu_n_s16 (int16x4_t __a, const int __b)
+ {
+- return (uint16x4_t) __builtin_aarch64_sqshlu_nv4hi (__a, __b);
++ return __builtin_aarch64_sqshlu_nv4hi_uss (__a, __b);
+ }
+
+ __extension__ static __inline uint32x2_t __attribute__ ((__always_inline__))
+ vqshlu_n_s32 (int32x2_t __a, const int __b)
+ {
+- return (uint32x2_t) __builtin_aarch64_sqshlu_nv2si (__a, __b);
++ return __builtin_aarch64_sqshlu_nv2si_uss (__a, __b);
+ }
+
+ __extension__ static __inline uint64x1_t __attribute__ ((__always_inline__))
+ vqshlu_n_s64 (int64x1_t __a, const int __b)
+ {
+- return (uint64x1_t) __builtin_aarch64_sqshlu_ndi (__a, __b);
++ return __builtin_aarch64_sqshlu_ndi_uss (__a, __b);
+ }
+
+ __extension__ static __inline uint8x16_t __attribute__ ((__always_inline__))
+ vqshluq_n_s8 (int8x16_t __a, const int __b)
+ {
+- return (uint8x16_t) __builtin_aarch64_sqshlu_nv16qi (__a, __b);
++ return __builtin_aarch64_sqshlu_nv16qi_uss (__a, __b);
+ }
+
+ __extension__ static __inline uint16x8_t __attribute__ ((__always_inline__))
+ vqshluq_n_s16 (int16x8_t __a, const int __b)
+ {
+- return (uint16x8_t) __builtin_aarch64_sqshlu_nv8hi (__a, __b);
++ return __builtin_aarch64_sqshlu_nv8hi_uss (__a, __b);
+ }
+
+ __extension__ static __inline uint32x4_t __attribute__ ((__always_inline__))
+ vqshluq_n_s32 (int32x4_t __a, const int __b)
+ {
+- return (uint32x4_t) __builtin_aarch64_sqshlu_nv4si (__a, __b);
++ return __builtin_aarch64_sqshlu_nv4si_uss (__a, __b);
+ }
+
+ __extension__ static __inline uint64x2_t __attribute__ ((__always_inline__))
+ vqshluq_n_s64 (int64x2_t __a, const int __b)
+ {
+- return (uint64x2_t) __builtin_aarch64_sqshlu_nv2di (__a, __b);
++ return __builtin_aarch64_sqshlu_nv2di_uss (__a, __b);
+ }
+
+ __extension__ static __inline int8x1_t __attribute__ ((__always_inline__))
+ vqshlub_n_s8 (int8x1_t __a, const int __b)
+ {
+- return (int8x1_t) __builtin_aarch64_sqshlu_nqi (__a, __b);
++ return (int8x1_t) __builtin_aarch64_sqshlu_nqi_uss (__a, __b);
+ }
+
+ __extension__ static __inline int16x1_t __attribute__ ((__always_inline__))
+ vqshluh_n_s16 (int16x1_t __a, const int __b)
+ {
+- return (int16x1_t) __builtin_aarch64_sqshlu_nhi (__a, __b);
++ return (int16x1_t) __builtin_aarch64_sqshlu_nhi_uss (__a, __b);
+ }
+
+ __extension__ static __inline int32x1_t __attribute__ ((__always_inline__))
+ vqshlus_n_s32 (int32x1_t __a, const int __b)
+ {
+- return (int32x1_t) __builtin_aarch64_sqshlu_nsi (__a, __b);
++ return (int32x1_t) __builtin_aarch64_sqshlu_nsi_uss (__a, __b);
+ }
+
+ __extension__ static __inline int64x1_t __attribute__ ((__always_inline__))
+ vqshlud_n_s64 (int64x1_t __a, const int __b)
+ {
+- return (int64x1_t) __builtin_aarch64_sqshlu_ndi (__a, __b);
++ return (int64x1_t) __builtin_aarch64_sqshlu_ndi_uss (__a, __b);
+ }
+
+ /* vqshrn */
+@@ -22250,19 +20782,19 @@
+ __extension__ static __inline uint8x8_t __attribute__ ((__always_inline__))
+ vqshrn_n_u16 (uint16x8_t __a, const int __b)
+ {
+- return (uint8x8_t) __builtin_aarch64_uqshrn_nv8hi ((int16x8_t) __a, __b);
++ return __builtin_aarch64_uqshrn_nv8hi_uus ( __a, __b);
+ }
+
+ __extension__ static __inline uint16x4_t __attribute__ ((__always_inline__))
+ vqshrn_n_u32 (uint32x4_t __a, const int __b)
+ {
+- return (uint16x4_t) __builtin_aarch64_uqshrn_nv4si ((int32x4_t) __a, __b);
++ return __builtin_aarch64_uqshrn_nv4si_uus ( __a, __b);
+ }
+
+ __extension__ static __inline uint32x2_t __attribute__ ((__always_inline__))
+ vqshrn_n_u64 (uint64x2_t __a, const int __b)
+ {
+- return (uint32x2_t) __builtin_aarch64_uqshrn_nv2di ((int64x2_t) __a, __b);
++ return __builtin_aarch64_uqshrn_nv2di_uus ( __a, __b);
+ }
+
+ __extension__ static __inline int8x1_t __attribute__ ((__always_inline__))
+@@ -22286,19 +20818,19 @@
+ __extension__ static __inline uint8x1_t __attribute__ ((__always_inline__))
+ vqshrnh_n_u16 (uint16x1_t __a, const int __b)
+ {
+- return (uint8x1_t) __builtin_aarch64_uqshrn_nhi (__a, __b);
++ return __builtin_aarch64_uqshrn_nhi_uus (__a, __b);
+ }
+
+ __extension__ static __inline uint16x1_t __attribute__ ((__always_inline__))
+ vqshrns_n_u32 (uint32x1_t __a, const int __b)
+ {
+- return (uint16x1_t) __builtin_aarch64_uqshrn_nsi (__a, __b);
++ return __builtin_aarch64_uqshrn_nsi_uus (__a, __b);
+ }
+
+ __extension__ static __inline uint32x1_t __attribute__ ((__always_inline__))
+ vqshrnd_n_u64 (uint64x1_t __a, const int __b)
+ {
+- return (uint32x1_t) __builtin_aarch64_uqshrn_ndi (__a, __b);
++ return __builtin_aarch64_uqshrn_ndi_uus (__a, __b);
+ }
+
+ /* vqshrun */
+@@ -22368,25 +20900,26 @@
+ __extension__ static __inline uint8x1_t __attribute__ ((__always_inline__))
+ vqsubb_u8 (uint8x1_t __a, uint8x1_t __b)
+ {
+- return (uint8x1_t) __builtin_aarch64_uqsubqi (__a, __b);
++ return (uint8x1_t) __builtin_aarch64_uqsubqi_uuu (__a, __b);
+ }
+
+ __extension__ static __inline uint16x1_t __attribute__ ((__always_inline__))
+ vqsubh_u16 (uint16x1_t __a, uint16x1_t __b)
+ {
+- return (uint16x1_t) __builtin_aarch64_uqsubhi (__a, __b);
++ return (uint16x1_t) __builtin_aarch64_uqsubhi_uuu (__a, __b);
+ }
+
+ __extension__ static __inline uint32x1_t __attribute__ ((__always_inline__))
+ vqsubs_u32 (uint32x1_t __a, uint32x1_t __b)
+ {
+- return (uint32x1_t) __builtin_aarch64_uqsubsi (__a, __b);
++ return (uint32x1_t) __builtin_aarch64_uqsubsi_uuu (__a, __b);
+ }
+
+ __extension__ static __inline uint64x1_t __attribute__ ((__always_inline__))
+ vqsubd_u64 (uint64x1_t __a, uint64x1_t __b)
+ {
+- return (uint64x1_t) __builtin_aarch64_uqsubdi (__a, __b);
++ return (uint64x1_t) __builtin_aarch64_uqsubdi_uuu ((uint64_t) __a,
++ (uint64_t) __b);
+ }
+
+ /* vrecpe */
+@@ -22467,6 +21000,234 @@
+ return __builtin_aarch64_frecpxdf (__a);
+ }
+
++
++/* vrev */
++
++__extension__ static __inline poly8x8_t __attribute__ ((__always_inline__))
++vrev16_p8 (poly8x8_t a)
++{
++ return __builtin_shuffle (a, (uint8x8_t) { 1, 0, 3, 2, 5, 4, 7, 6 });
++}
++
++__extension__ static __inline int8x8_t __attribute__ ((__always_inline__))
++vrev16_s8 (int8x8_t a)
++{
++ return __builtin_shuffle (a, (uint8x8_t) { 1, 0, 3, 2, 5, 4, 7, 6 });
++}
++
++__extension__ static __inline uint8x8_t __attribute__ ((__always_inline__))
++vrev16_u8 (uint8x8_t a)
++{
++ return __builtin_shuffle (a, (uint8x8_t) { 1, 0, 3, 2, 5, 4, 7, 6 });
++}
++
++__extension__ static __inline poly8x16_t __attribute__ ((__always_inline__))
++vrev16q_p8 (poly8x16_t a)
++{
++ return __builtin_shuffle (a,
++ (uint8x16_t) { 1, 0, 3, 2, 5, 4, 7, 6, 9, 8, 11, 10, 13, 12, 15, 14 });
++}
++
++__extension__ static __inline int8x16_t __attribute__ ((__always_inline__))
++vrev16q_s8 (int8x16_t a)
++{
++ return __builtin_shuffle (a,
++ (uint8x16_t) { 1, 0, 3, 2, 5, 4, 7, 6, 9, 8, 11, 10, 13, 12, 15, 14 });
++}
++
++__extension__ static __inline uint8x16_t __attribute__ ((__always_inline__))
++vrev16q_u8 (uint8x16_t a)
++{
++ return __builtin_shuffle (a,
++ (uint8x16_t) { 1, 0, 3, 2, 5, 4, 7, 6, 9, 8, 11, 10, 13, 12, 15, 14 });
++}
++
++__extension__ static __inline poly8x8_t __attribute__ ((__always_inline__))
++vrev32_p8 (poly8x8_t a)
++{
++ return __builtin_shuffle (a, (uint8x8_t) { 3, 2, 1, 0, 7, 6, 5, 4 });
++}
++
++__extension__ static __inline poly16x4_t __attribute__ ((__always_inline__))
++vrev32_p16 (poly16x4_t a)
++{
++ return __builtin_shuffle (a, (uint16x4_t) { 1, 0, 3, 2 });
++}
++
++__extension__ static __inline int8x8_t __attribute__ ((__always_inline__))
++vrev32_s8 (int8x8_t a)
++{
++ return __builtin_shuffle (a, (uint8x8_t) { 3, 2, 1, 0, 7, 6, 5, 4 });
++}
++
++__extension__ static __inline int16x4_t __attribute__ ((__always_inline__))
++vrev32_s16 (int16x4_t a)
++{
++ return __builtin_shuffle (a, (uint16x4_t) { 1, 0, 3, 2 });
++}
++
++__extension__ static __inline uint8x8_t __attribute__ ((__always_inline__))
++vrev32_u8 (uint8x8_t a)
++{
++ return __builtin_shuffle (a, (uint8x8_t) { 3, 2, 1, 0, 7, 6, 5, 4 });
++}
++
++__extension__ static __inline uint16x4_t __attribute__ ((__always_inline__))
++vrev32_u16 (uint16x4_t a)
++{
++ return __builtin_shuffle (a, (uint16x4_t) { 1, 0, 3, 2 });
++}
++
++__extension__ static __inline poly8x16_t __attribute__ ((__always_inline__))
++vrev32q_p8 (poly8x16_t a)
++{
++ return __builtin_shuffle (a,
++ (uint8x16_t) { 3, 2, 1, 0, 7, 6, 5, 4, 11, 10, 9, 8, 15, 14, 13, 12 });
++}
++
++__extension__ static __inline poly16x8_t __attribute__ ((__always_inline__))
++vrev32q_p16 (poly16x8_t a)
++{
++ return __builtin_shuffle (a, (uint16x8_t) { 1, 0, 3, 2, 5, 4, 7, 6 });
++}
++
++__extension__ static __inline int8x16_t __attribute__ ((__always_inline__))
++vrev32q_s8 (int8x16_t a)
++{
++ return __builtin_shuffle (a,
++ (uint8x16_t) { 3, 2, 1, 0, 7, 6, 5, 4, 11, 10, 9, 8, 15, 14, 13, 12 });
++}
++
++__extension__ static __inline int16x8_t __attribute__ ((__always_inline__))
++vrev32q_s16 (int16x8_t a)
++{
++ return __builtin_shuffle (a, (uint16x8_t) { 1, 0, 3, 2, 5, 4, 7, 6 });
++}
++
++__extension__ static __inline uint8x16_t __attribute__ ((__always_inline__))
++vrev32q_u8 (uint8x16_t a)
++{
++ return __builtin_shuffle (a,
++ (uint8x16_t) { 3, 2, 1, 0, 7, 6, 5, 4, 11, 10, 9, 8, 15, 14, 13, 12 });
++}
++
++__extension__ static __inline uint16x8_t __attribute__ ((__always_inline__))
++vrev32q_u16 (uint16x8_t a)
++{
++ return __builtin_shuffle (a, (uint16x8_t) { 1, 0, 3, 2, 5, 4, 7, 6 });
++}
++
++__extension__ static __inline float32x2_t __attribute__ ((__always_inline__))
++vrev64_f32 (float32x2_t a)
++{
++ return __builtin_shuffle (a, (uint32x2_t) { 1, 0 });
++}
++
++__extension__ static __inline poly8x8_t __attribute__ ((__always_inline__))
++vrev64_p8 (poly8x8_t a)
++{
++ return __builtin_shuffle (a, (uint8x8_t) { 7, 6, 5, 4, 3, 2, 1, 0 });
++}
++
++__extension__ static __inline poly16x4_t __attribute__ ((__always_inline__))
++vrev64_p16 (poly16x4_t a)
++{
++ return __builtin_shuffle (a, (uint16x4_t) { 3, 2, 1, 0 });
++}
++
++__extension__ static __inline int8x8_t __attribute__ ((__always_inline__))
++vrev64_s8 (int8x8_t a)
++{
++ return __builtin_shuffle (a, (uint8x8_t) { 7, 6, 5, 4, 3, 2, 1, 0 });
++}
++
++__extension__ static __inline int16x4_t __attribute__ ((__always_inline__))
++vrev64_s16 (int16x4_t a)
++{
++ return __builtin_shuffle (a, (uint16x4_t) { 3, 2, 1, 0 });
++}
++
++__extension__ static __inline int32x2_t __attribute__ ((__always_inline__))
++vrev64_s32 (int32x2_t a)
++{
++ return __builtin_shuffle (a, (uint32x2_t) { 1, 0 });
++}
++
++__extension__ static __inline uint8x8_t __attribute__ ((__always_inline__))
++vrev64_u8 (uint8x8_t a)
++{
++ return __builtin_shuffle (a, (uint8x8_t) { 7, 6, 5, 4, 3, 2, 1, 0 });
++}
++
++__extension__ static __inline uint16x4_t __attribute__ ((__always_inline__))
++vrev64_u16 (uint16x4_t a)
++{
++ return __builtin_shuffle (a, (uint16x4_t) { 3, 2, 1, 0 });
++}
++
++__extension__ static __inline uint32x2_t __attribute__ ((__always_inline__))
++vrev64_u32 (uint32x2_t a)
++{
++ return __builtin_shuffle (a, (uint32x2_t) { 1, 0 });
++}
++
++__extension__ static __inline float32x4_t __attribute__ ((__always_inline__))
++vrev64q_f32 (float32x4_t a)
++{
++ return __builtin_shuffle (a, (uint32x4_t) { 1, 0, 3, 2 });
++}
++
++__extension__ static __inline poly8x16_t __attribute__ ((__always_inline__))
++vrev64q_p8 (poly8x16_t a)
++{
++ return __builtin_shuffle (a,
++ (uint8x16_t) { 7, 6, 5, 4, 3, 2, 1, 0, 15, 14, 13, 12, 11, 10, 9, 8 });
++}
++
++__extension__ static __inline poly16x8_t __attribute__ ((__always_inline__))
++vrev64q_p16 (poly16x8_t a)
++{
++ return __builtin_shuffle (a, (uint16x8_t) { 3, 2, 1, 0, 7, 6, 5, 4 });
++}
++
++__extension__ static __inline int8x16_t __attribute__ ((__always_inline__))
++vrev64q_s8 (int8x16_t a)
++{
++ return __builtin_shuffle (a,
++ (uint8x16_t) { 7, 6, 5, 4, 3, 2, 1, 0, 15, 14, 13, 12, 11, 10, 9, 8 });
++}
++
++__extension__ static __inline int16x8_t __attribute__ ((__always_inline__))
++vrev64q_s16 (int16x8_t a)
++{
++ return __builtin_shuffle (a, (uint16x8_t) { 3, 2, 1, 0, 7, 6, 5, 4 });
++}
++
++__extension__ static __inline int32x4_t __attribute__ ((__always_inline__))
++vrev64q_s32 (int32x4_t a)
++{
++ return __builtin_shuffle (a, (uint32x4_t) { 1, 0, 3, 2 });
++}
++
++__extension__ static __inline uint8x16_t __attribute__ ((__always_inline__))
++vrev64q_u8 (uint8x16_t a)
++{
++ return __builtin_shuffle (a,
++ (uint8x16_t) { 7, 6, 5, 4, 3, 2, 1, 0, 15, 14, 13, 12, 11, 10, 9, 8 });
++}
++
++__extension__ static __inline uint16x8_t __attribute__ ((__always_inline__))
++vrev64q_u16 (uint16x8_t a)
++{
++ return __builtin_shuffle (a, (uint16x8_t) { 3, 2, 1, 0, 7, 6, 5, 4 });
++}
++
++__extension__ static __inline uint32x4_t __attribute__ ((__always_inline__))
++vrev64q_u32 (uint32x4_t a)
++{
++ return __builtin_shuffle (a, (uint32x4_t) { 1, 0, 3, 2 });
++}
++
+ /* vrnd */
+
+ __extension__ static __inline float32x2_t __attribute__ ((__always_inline__))
+@@ -22475,6 +21236,12 @@
return __builtin_aarch64_btruncv2sf (__a);
}
@@ -9157,7 +21153,7 @@ LANG=C svn diff svn://gcc.gnu.org/svn/gcc/branches/gcc-4_9-branch@211979 \
__extension__ static __inline float32x4_t __attribute__ ((__always_inline__))
vrndq_f32 (float32x4_t __a)
{
-@@ -22501,6 +22397,12 @@
+@@ -22495,6 +21262,12 @@
return __builtin_aarch64_roundv2sf (__a);
}
@@ -9170,7 +21166,7 @@ LANG=C svn diff svn://gcc.gnu.org/svn/gcc/branches/gcc-4_9-branch@211979 \
__extension__ static __inline float32x4_t __attribute__ ((__always_inline__))
vrndaq_f32 (float32x4_t __a)
{
-@@ -22521,6 +22423,12 @@
+@@ -22515,6 +21288,12 @@
return __builtin_aarch64_nearbyintv2sf (__a);
}
@@ -9183,7 +21179,7 @@ LANG=C svn diff svn://gcc.gnu.org/svn/gcc/branches/gcc-4_9-branch@211979 \
__extension__ static __inline float32x4_t __attribute__ ((__always_inline__))
vrndiq_f32 (float32x4_t __a)
{
-@@ -22541,6 +22449,12 @@
+@@ -22535,6 +21314,12 @@
return __builtin_aarch64_floorv2sf (__a);
}
@@ -9196,7 +21192,7 @@ LANG=C svn diff svn://gcc.gnu.org/svn/gcc/branches/gcc-4_9-branch@211979 \
__extension__ static __inline float32x4_t __attribute__ ((__always_inline__))
vrndmq_f32 (float32x4_t __a)
{
-@@ -22560,6 +22474,13 @@
+@@ -22554,6 +21339,13 @@
{
return __builtin_aarch64_frintnv2sf (__a);
}
@@ -9210,7 +21206,7 @@ LANG=C svn diff svn://gcc.gnu.org/svn/gcc/branches/gcc-4_9-branch@211979 \
__extension__ static __inline float32x4_t __attribute__ ((__always_inline__))
vrndnq_f32 (float32x4_t __a)
{
-@@ -22580,6 +22501,12 @@
+@@ -22574,6 +21366,12 @@
return __builtin_aarch64_ceilv2sf (__a);
}
@@ -9223,7 +21219,7 @@ LANG=C svn diff svn://gcc.gnu.org/svn/gcc/branches/gcc-4_9-branch@211979 \
__extension__ static __inline float32x4_t __attribute__ ((__always_inline__))
vrndpq_f32 (float32x4_t __a)
{
-@@ -22600,6 +22527,12 @@
+@@ -22594,6 +21392,12 @@
return __builtin_aarch64_rintv2sf (__a);
}
@@ -9236,7 +21232,1658 @@ LANG=C svn diff svn://gcc.gnu.org/svn/gcc/branches/gcc-4_9-branch@211979 \
__extension__ static __inline float32x4_t __attribute__ ((__always_inline__))
vrndxq_f32 (float32x4_t __a)
{
-@@ -25316,6 +25249,444 @@
+@@ -22635,25 +21439,25 @@
+ __extension__ static __inline uint8x8_t __attribute__ ((__always_inline__))
+ vrshl_u8 (uint8x8_t __a, int8x8_t __b)
+ {
+- return (uint8x8_t) __builtin_aarch64_urshlv8qi ((int8x8_t) __a, __b);
++ return __builtin_aarch64_urshlv8qi_uus (__a, __b);
+ }
+
+ __extension__ static __inline uint16x4_t __attribute__ ((__always_inline__))
+ vrshl_u16 (uint16x4_t __a, int16x4_t __b)
+ {
+- return (uint16x4_t) __builtin_aarch64_urshlv4hi ((int16x4_t) __a, __b);
++ return __builtin_aarch64_urshlv4hi_uus (__a, __b);
+ }
+
+ __extension__ static __inline uint32x2_t __attribute__ ((__always_inline__))
+ vrshl_u32 (uint32x2_t __a, int32x2_t __b)
+ {
+- return (uint32x2_t) __builtin_aarch64_urshlv2si ((int32x2_t) __a, __b);
++ return __builtin_aarch64_urshlv2si_uus (__a, __b);
+ }
+
+ __extension__ static __inline uint64x1_t __attribute__ ((__always_inline__))
+ vrshl_u64 (uint64x1_t __a, int64x1_t __b)
+ {
+- return (uint64x1_t) __builtin_aarch64_urshldi ((int64x1_t) __a, __b);
++ return __builtin_aarch64_urshldi_uus (__a, __b);
+ }
+
+ __extension__ static __inline int8x16_t __attribute__ ((__always_inline__))
+@@ -22683,25 +21487,25 @@
+ __extension__ static __inline uint8x16_t __attribute__ ((__always_inline__))
+ vrshlq_u8 (uint8x16_t __a, int8x16_t __b)
+ {
+- return (uint8x16_t) __builtin_aarch64_urshlv16qi ((int8x16_t) __a, __b);
++ return __builtin_aarch64_urshlv16qi_uus (__a, __b);
+ }
+
+ __extension__ static __inline uint16x8_t __attribute__ ((__always_inline__))
+ vrshlq_u16 (uint16x8_t __a, int16x8_t __b)
+ {
+- return (uint16x8_t) __builtin_aarch64_urshlv8hi ((int16x8_t) __a, __b);
++ return __builtin_aarch64_urshlv8hi_uus (__a, __b);
+ }
+
+ __extension__ static __inline uint32x4_t __attribute__ ((__always_inline__))
+ vrshlq_u32 (uint32x4_t __a, int32x4_t __b)
+ {
+- return (uint32x4_t) __builtin_aarch64_urshlv4si ((int32x4_t) __a, __b);
++ return __builtin_aarch64_urshlv4si_uus (__a, __b);
+ }
+
+ __extension__ static __inline uint64x2_t __attribute__ ((__always_inline__))
+ vrshlq_u64 (uint64x2_t __a, int64x2_t __b)
+ {
+- return (uint64x2_t) __builtin_aarch64_urshlv2di ((int64x2_t) __a, __b);
++ return __builtin_aarch64_urshlv2di_uus (__a, __b);
+ }
+
+ __extension__ static __inline int64x1_t __attribute__ ((__always_inline__))
+@@ -22713,7 +21517,7 @@
+ __extension__ static __inline uint64x1_t __attribute__ ((__always_inline__))
+ vrshld_u64 (uint64x1_t __a, uint64x1_t __b)
+ {
+- return (uint64x1_t) __builtin_aarch64_urshldi (__a, __b);
++ return __builtin_aarch64_urshldi_uus (__a, __b);
+ }
+
+ /* vrshr */
+@@ -22745,25 +21549,25 @@
+ __extension__ static __inline uint8x8_t __attribute__ ((__always_inline__))
+ vrshr_n_u8 (uint8x8_t __a, const int __b)
+ {
+- return (uint8x8_t) __builtin_aarch64_urshr_nv8qi ((int8x8_t) __a, __b);
++ return __builtin_aarch64_urshr_nv8qi_uus (__a, __b);
+ }
+
+ __extension__ static __inline uint16x4_t __attribute__ ((__always_inline__))
+ vrshr_n_u16 (uint16x4_t __a, const int __b)
+ {
+- return (uint16x4_t) __builtin_aarch64_urshr_nv4hi ((int16x4_t) __a, __b);
++ return __builtin_aarch64_urshr_nv4hi_uus (__a, __b);
+ }
+
+ __extension__ static __inline uint32x2_t __attribute__ ((__always_inline__))
+ vrshr_n_u32 (uint32x2_t __a, const int __b)
+ {
+- return (uint32x2_t) __builtin_aarch64_urshr_nv2si ((int32x2_t) __a, __b);
++ return __builtin_aarch64_urshr_nv2si_uus (__a, __b);
+ }
+
+ __extension__ static __inline uint64x1_t __attribute__ ((__always_inline__))
+ vrshr_n_u64 (uint64x1_t __a, const int __b)
+ {
+- return (uint64x1_t) __builtin_aarch64_urshr_ndi ((int64x1_t) __a, __b);
++ return __builtin_aarch64_urshr_ndi_uus (__a, __b);
+ }
+
+ __extension__ static __inline int8x16_t __attribute__ ((__always_inline__))
+@@ -22793,25 +21597,25 @@
+ __extension__ static __inline uint8x16_t __attribute__ ((__always_inline__))
+ vrshrq_n_u8 (uint8x16_t __a, const int __b)
+ {
+- return (uint8x16_t) __builtin_aarch64_urshr_nv16qi ((int8x16_t) __a, __b);
++ return __builtin_aarch64_urshr_nv16qi_uus (__a, __b);
+ }
+
+ __extension__ static __inline uint16x8_t __attribute__ ((__always_inline__))
+ vrshrq_n_u16 (uint16x8_t __a, const int __b)
+ {
+- return (uint16x8_t) __builtin_aarch64_urshr_nv8hi ((int16x8_t) __a, __b);
++ return __builtin_aarch64_urshr_nv8hi_uus (__a, __b);
+ }
+
+ __extension__ static __inline uint32x4_t __attribute__ ((__always_inline__))
+ vrshrq_n_u32 (uint32x4_t __a, const int __b)
+ {
+- return (uint32x4_t) __builtin_aarch64_urshr_nv4si ((int32x4_t) __a, __b);
++ return __builtin_aarch64_urshr_nv4si_uus (__a, __b);
+ }
+
+ __extension__ static __inline uint64x2_t __attribute__ ((__always_inline__))
+ vrshrq_n_u64 (uint64x2_t __a, const int __b)
+ {
+- return (uint64x2_t) __builtin_aarch64_urshr_nv2di ((int64x2_t) __a, __b);
++ return __builtin_aarch64_urshr_nv2di_uus (__a, __b);
+ }
+
+ __extension__ static __inline int64x1_t __attribute__ ((__always_inline__))
+@@ -22823,7 +21627,7 @@
+ __extension__ static __inline uint64x1_t __attribute__ ((__always_inline__))
+ vrshrd_n_u64 (uint64x1_t __a, const int __b)
+ {
+- return (uint64x1_t) __builtin_aarch64_urshr_ndi (__a, __b);
++ return __builtin_aarch64_urshr_ndi_uus (__a, __b);
+ }
+
+ /* vrsra */
+@@ -22855,29 +21659,25 @@
+ __extension__ static __inline uint8x8_t __attribute__ ((__always_inline__))
+ vrsra_n_u8 (uint8x8_t __a, uint8x8_t __b, const int __c)
+ {
+- return (uint8x8_t) __builtin_aarch64_ursra_nv8qi ((int8x8_t) __a,
+- (int8x8_t) __b, __c);
++ return __builtin_aarch64_ursra_nv8qi_uuus (__a, __b, __c);
+ }
+
+ __extension__ static __inline uint16x4_t __attribute__ ((__always_inline__))
+ vrsra_n_u16 (uint16x4_t __a, uint16x4_t __b, const int __c)
+ {
+- return (uint16x4_t) __builtin_aarch64_ursra_nv4hi ((int16x4_t) __a,
+- (int16x4_t) __b, __c);
++ return __builtin_aarch64_ursra_nv4hi_uuus (__a, __b, __c);
+ }
+
+ __extension__ static __inline uint32x2_t __attribute__ ((__always_inline__))
+ vrsra_n_u32 (uint32x2_t __a, uint32x2_t __b, const int __c)
+ {
+- return (uint32x2_t) __builtin_aarch64_ursra_nv2si ((int32x2_t) __a,
+- (int32x2_t) __b, __c);
++ return __builtin_aarch64_ursra_nv2si_uuus (__a, __b, __c);
+ }
+
+ __extension__ static __inline uint64x1_t __attribute__ ((__always_inline__))
+ vrsra_n_u64 (uint64x1_t __a, uint64x1_t __b, const int __c)
+ {
+- return (uint64x1_t) __builtin_aarch64_ursra_ndi ((int64x1_t) __a,
+- (int64x1_t) __b, __c);
++ return __builtin_aarch64_ursra_ndi_uuus (__a, __b, __c);
+ }
+
+ __extension__ static __inline int8x16_t __attribute__ ((__always_inline__))
+@@ -22907,29 +21707,25 @@
+ __extension__ static __inline uint8x16_t __attribute__ ((__always_inline__))
+ vrsraq_n_u8 (uint8x16_t __a, uint8x16_t __b, const int __c)
+ {
+- return (uint8x16_t) __builtin_aarch64_ursra_nv16qi ((int8x16_t) __a,
+- (int8x16_t) __b, __c);
++ return __builtin_aarch64_ursra_nv16qi_uuus (__a, __b, __c);
+ }
+
+ __extension__ static __inline uint16x8_t __attribute__ ((__always_inline__))
+ vrsraq_n_u16 (uint16x8_t __a, uint16x8_t __b, const int __c)
+ {
+- return (uint16x8_t) __builtin_aarch64_ursra_nv8hi ((int16x8_t) __a,
+- (int16x8_t) __b, __c);
++ return __builtin_aarch64_ursra_nv8hi_uuus (__a, __b, __c);
+ }
+
+ __extension__ static __inline uint32x4_t __attribute__ ((__always_inline__))
+ vrsraq_n_u32 (uint32x4_t __a, uint32x4_t __b, const int __c)
+ {
+- return (uint32x4_t) __builtin_aarch64_ursra_nv4si ((int32x4_t) __a,
+- (int32x4_t) __b, __c);
++ return __builtin_aarch64_ursra_nv4si_uuus (__a, __b, __c);
+ }
+
+ __extension__ static __inline uint64x2_t __attribute__ ((__always_inline__))
+ vrsraq_n_u64 (uint64x2_t __a, uint64x2_t __b, const int __c)
+ {
+- return (uint64x2_t) __builtin_aarch64_ursra_nv2di ((int64x2_t) __a,
+- (int64x2_t) __b, __c);
++ return __builtin_aarch64_ursra_nv2di_uuus (__a, __b, __c);
+ }
+
+ __extension__ static __inline int64x1_t __attribute__ ((__always_inline__))
+@@ -22941,7 +21737,7 @@
+ __extension__ static __inline uint64x1_t __attribute__ ((__always_inline__))
+ vrsrad_n_u64 (uint64x1_t __a, uint64x1_t __b, const int __c)
+ {
+- return (uint64x1_t) __builtin_aarch64_ursra_ndi (__a, __b, __c);
++ return __builtin_aarch64_ursra_ndi_uuus (__a, __b, __c);
+ }
+
+ #ifdef __ARM_FEATURE_CRYPTO
+@@ -23134,109 +21930,109 @@
+ __extension__ static __inline int8x8_t __attribute__ ((__always_inline__))
+ vshl_s8 (int8x8_t __a, int8x8_t __b)
+ {
+- return (int8x8_t) __builtin_aarch64_sshlv8qi (__a, __b);
++ return __builtin_aarch64_sshlv8qi (__a, __b);
+ }
+
+ __extension__ static __inline int16x4_t __attribute__ ((__always_inline__))
+ vshl_s16 (int16x4_t __a, int16x4_t __b)
+ {
+- return (int16x4_t) __builtin_aarch64_sshlv4hi (__a, __b);
++ return __builtin_aarch64_sshlv4hi (__a, __b);
+ }
+
+ __extension__ static __inline int32x2_t __attribute__ ((__always_inline__))
+ vshl_s32 (int32x2_t __a, int32x2_t __b)
+ {
+- return (int32x2_t) __builtin_aarch64_sshlv2si (__a, __b);
++ return __builtin_aarch64_sshlv2si (__a, __b);
+ }
+
+ __extension__ static __inline int64x1_t __attribute__ ((__always_inline__))
+ vshl_s64 (int64x1_t __a, int64x1_t __b)
+ {
+- return (int64x1_t) __builtin_aarch64_sshldi (__a, __b);
++ return __builtin_aarch64_sshldi (__a, __b);
+ }
+
+ __extension__ static __inline uint8x8_t __attribute__ ((__always_inline__))
+ vshl_u8 (uint8x8_t __a, int8x8_t __b)
+ {
+- return (uint8x8_t) __builtin_aarch64_ushlv8qi ((int8x8_t) __a, __b);
++ return __builtin_aarch64_ushlv8qi_uus (__a, __b);
+ }
+
+ __extension__ static __inline uint16x4_t __attribute__ ((__always_inline__))
+ vshl_u16 (uint16x4_t __a, int16x4_t __b)
+ {
+- return (uint16x4_t) __builtin_aarch64_ushlv4hi ((int16x4_t) __a, __b);
++ return __builtin_aarch64_ushlv4hi_uus (__a, __b);
+ }
+
+ __extension__ static __inline uint32x2_t __attribute__ ((__always_inline__))
+ vshl_u32 (uint32x2_t __a, int32x2_t __b)
+ {
+- return (uint32x2_t) __builtin_aarch64_ushlv2si ((int32x2_t) __a, __b);
++ return __builtin_aarch64_ushlv2si_uus (__a, __b);
+ }
+
+ __extension__ static __inline uint64x1_t __attribute__ ((__always_inline__))
+ vshl_u64 (uint64x1_t __a, int64x1_t __b)
+ {
+- return (uint64x1_t) __builtin_aarch64_ushldi ((int64x1_t) __a, __b);
++ return __builtin_aarch64_ushldi_uus (__a, __b);
+ }
+
+ __extension__ static __inline int8x16_t __attribute__ ((__always_inline__))
+ vshlq_s8 (int8x16_t __a, int8x16_t __b)
+ {
+- return (int8x16_t) __builtin_aarch64_sshlv16qi (__a, __b);
++ return __builtin_aarch64_sshlv16qi (__a, __b);
+ }
+
+ __extension__ static __inline int16x8_t __attribute__ ((__always_inline__))
+ vshlq_s16 (int16x8_t __a, int16x8_t __b)
+ {
+- return (int16x8_t) __builtin_aarch64_sshlv8hi (__a, __b);
++ return __builtin_aarch64_sshlv8hi (__a, __b);
+ }
+
+ __extension__ static __inline int32x4_t __attribute__ ((__always_inline__))
+ vshlq_s32 (int32x4_t __a, int32x4_t __b)
+ {
+- return (int32x4_t) __builtin_aarch64_sshlv4si (__a, __b);
++ return __builtin_aarch64_sshlv4si (__a, __b);
+ }
+
+ __extension__ static __inline int64x2_t __attribute__ ((__always_inline__))
+ vshlq_s64 (int64x2_t __a, int64x2_t __b)
+ {
+- return (int64x2_t) __builtin_aarch64_sshlv2di (__a, __b);
++ return __builtin_aarch64_sshlv2di (__a, __b);
+ }
+
+ __extension__ static __inline uint8x16_t __attribute__ ((__always_inline__))
+ vshlq_u8 (uint8x16_t __a, int8x16_t __b)
+ {
+- return (uint8x16_t) __builtin_aarch64_ushlv16qi ((int8x16_t) __a, __b);
++ return __builtin_aarch64_ushlv16qi_uus (__a, __b);
+ }
+
+ __extension__ static __inline uint16x8_t __attribute__ ((__always_inline__))
+ vshlq_u16 (uint16x8_t __a, int16x8_t __b)
+ {
+- return (uint16x8_t) __builtin_aarch64_ushlv8hi ((int16x8_t) __a, __b);
++ return __builtin_aarch64_ushlv8hi_uus (__a, __b);
+ }
+
+ __extension__ static __inline uint32x4_t __attribute__ ((__always_inline__))
+ vshlq_u32 (uint32x4_t __a, int32x4_t __b)
+ {
+- return (uint32x4_t) __builtin_aarch64_ushlv4si ((int32x4_t) __a, __b);
++ return __builtin_aarch64_ushlv4si_uus (__a, __b);
+ }
+
+ __extension__ static __inline uint64x2_t __attribute__ ((__always_inline__))
+ vshlq_u64 (uint64x2_t __a, int64x2_t __b)
+ {
+- return (uint64x2_t) __builtin_aarch64_ushlv2di ((int64x2_t) __a, __b);
++ return __builtin_aarch64_ushlv2di_uus (__a, __b);
+ }
+
+ __extension__ static __inline int64x1_t __attribute__ ((__always_inline__))
+ vshld_s64 (int64x1_t __a, int64x1_t __b)
+ {
+- return (int64x1_t) __builtin_aarch64_sshldi (__a, __b);
++ return __builtin_aarch64_sshldi (__a, __b);
+ }
+
+ __extension__ static __inline uint64x1_t __attribute__ ((__always_inline__))
+ vshld_u64 (uint64x1_t __a, uint64x1_t __b)
+ {
+- return (uint64x1_t) __builtin_aarch64_ushldi (__a, __b);
++ return __builtin_aarch64_ushldi_uus (__a, __b);
+ }
+
+ __extension__ static __inline int16x8_t __attribute__ ((__always_inline__))
+@@ -23296,19 +22092,19 @@
+ __extension__ static __inline uint16x8_t __attribute__ ((__always_inline__))
+ vshll_n_u8 (uint8x8_t __a, const int __b)
+ {
+- return (uint16x8_t) __builtin_aarch64_ushll_nv8qi ((int8x8_t) __a, __b);
++ return __builtin_aarch64_ushll_nv8qi_uus (__a, __b);
+ }
+
+ __extension__ static __inline uint32x4_t __attribute__ ((__always_inline__))
+ vshll_n_u16 (uint16x4_t __a, const int __b)
+ {
+- return (uint32x4_t) __builtin_aarch64_ushll_nv4hi ((int16x4_t) __a, __b);
++ return __builtin_aarch64_ushll_nv4hi_uus (__a, __b);
+ }
+
+ __extension__ static __inline uint64x2_t __attribute__ ((__always_inline__))
+ vshll_n_u32 (uint32x2_t __a, const int __b)
+ {
+- return (uint64x2_t) __builtin_aarch64_ushll_nv2si ((int32x2_t) __a, __b);
++ return __builtin_aarch64_ushll_nv2si_uus (__a, __b);
+ }
+
+ /* vshr */
+@@ -23450,29 +22246,25 @@
+ __extension__ static __inline uint8x8_t __attribute__ ((__always_inline__))
+ vsli_n_u8 (uint8x8_t __a, uint8x8_t __b, const int __c)
+ {
+- return (uint8x8_t) __builtin_aarch64_usli_nv8qi ((int8x8_t) __a,
+- (int8x8_t) __b, __c);
++ return __builtin_aarch64_usli_nv8qi_uuus (__a, __b, __c);
+ }
+
+ __extension__ static __inline uint16x4_t __attribute__ ((__always_inline__))
+ vsli_n_u16 (uint16x4_t __a, uint16x4_t __b, const int __c)
+ {
+- return (uint16x4_t) __builtin_aarch64_usli_nv4hi ((int16x4_t) __a,
+- (int16x4_t) __b, __c);
++ return __builtin_aarch64_usli_nv4hi_uuus (__a, __b, __c);
+ }
+
+ __extension__ static __inline uint32x2_t __attribute__ ((__always_inline__))
+ vsli_n_u32 (uint32x2_t __a, uint32x2_t __b, const int __c)
+ {
+- return (uint32x2_t) __builtin_aarch64_usli_nv2si ((int32x2_t) __a,
+- (int32x2_t) __b, __c);
++ return __builtin_aarch64_usli_nv2si_uuus (__a, __b, __c);
+ }
+
+ __extension__ static __inline uint64x1_t __attribute__ ((__always_inline__))
+ vsli_n_u64 (uint64x1_t __a, uint64x1_t __b, const int __c)
+ {
+- return (uint64x1_t) __builtin_aarch64_usli_ndi ((int64x1_t) __a,
+- (int64x1_t) __b, __c);
++ return __builtin_aarch64_usli_ndi_uuus (__a, __b, __c);
+ }
+
+ __extension__ static __inline int8x16_t __attribute__ ((__always_inline__))
+@@ -23502,29 +22294,25 @@
+ __extension__ static __inline uint8x16_t __attribute__ ((__always_inline__))
+ vsliq_n_u8 (uint8x16_t __a, uint8x16_t __b, const int __c)
+ {
+- return (uint8x16_t) __builtin_aarch64_usli_nv16qi ((int8x16_t) __a,
+- (int8x16_t) __b, __c);
++ return __builtin_aarch64_usli_nv16qi_uuus (__a, __b, __c);
+ }
+
+ __extension__ static __inline uint16x8_t __attribute__ ((__always_inline__))
+ vsliq_n_u16 (uint16x8_t __a, uint16x8_t __b, const int __c)
+ {
+- return (uint16x8_t) __builtin_aarch64_usli_nv8hi ((int16x8_t) __a,
+- (int16x8_t) __b, __c);
++ return __builtin_aarch64_usli_nv8hi_uuus (__a, __b, __c);
+ }
+
+ __extension__ static __inline uint32x4_t __attribute__ ((__always_inline__))
+ vsliq_n_u32 (uint32x4_t __a, uint32x4_t __b, const int __c)
+ {
+- return (uint32x4_t) __builtin_aarch64_usli_nv4si ((int32x4_t) __a,
+- (int32x4_t) __b, __c);
++ return __builtin_aarch64_usli_nv4si_uuus (__a, __b, __c);
+ }
+
+ __extension__ static __inline uint64x2_t __attribute__ ((__always_inline__))
+ vsliq_n_u64 (uint64x2_t __a, uint64x2_t __b, const int __c)
+ {
+- return (uint64x2_t) __builtin_aarch64_usli_nv2di ((int64x2_t) __a,
+- (int64x2_t) __b, __c);
++ return __builtin_aarch64_usli_nv2di_uuus (__a, __b, __c);
+ }
+
+ __extension__ static __inline int64x1_t __attribute__ ((__always_inline__))
+@@ -23536,7 +22324,7 @@
+ __extension__ static __inline uint64x1_t __attribute__ ((__always_inline__))
+ vslid_n_u64 (uint64x1_t __a, uint64x1_t __b, const int __c)
+ {
+- return (uint64x1_t) __builtin_aarch64_usli_ndi (__a, __b, __c);
++ return __builtin_aarch64_usli_ndi_uuus (__a, __b, __c);
+ }
+
+ /* vsqadd */
+@@ -23544,80 +22332,73 @@
+ __extension__ static __inline uint8x8_t __attribute__ ((__always_inline__))
+ vsqadd_u8 (uint8x8_t __a, int8x8_t __b)
+ {
+- return (uint8x8_t) __builtin_aarch64_usqaddv8qi ((int8x8_t) __a,
+- (int8x8_t) __b);
++ return __builtin_aarch64_usqaddv8qi_uus (__a, __b);
+ }
+
+ __extension__ static __inline uint16x4_t __attribute__ ((__always_inline__))
+ vsqadd_u16 (uint16x4_t __a, int16x4_t __b)
+ {
+- return (uint16x4_t) __builtin_aarch64_usqaddv4hi ((int16x4_t) __a,
+- (int16x4_t) __b);
++ return __builtin_aarch64_usqaddv4hi_uus (__a, __b);
+ }
+
+ __extension__ static __inline uint32x2_t __attribute__ ((__always_inline__))
+ vsqadd_u32 (uint32x2_t __a, int32x2_t __b)
+ {
+- return (uint32x2_t) __builtin_aarch64_usqaddv2si ((int32x2_t) __a,
+- (int32x2_t) __b);
++ return __builtin_aarch64_usqaddv2si_uus (__a, __b);
+ }
+
+ __extension__ static __inline uint64x1_t __attribute__ ((__always_inline__))
+ vsqadd_u64 (uint64x1_t __a, int64x1_t __b)
+ {
+- return (uint64x1_t) __builtin_aarch64_usqadddi ((int64x1_t) __a, __b);
++ return __builtin_aarch64_usqadddi_uus (__a, __b);
+ }
+
+ __extension__ static __inline uint8x16_t __attribute__ ((__always_inline__))
+ vsqaddq_u8 (uint8x16_t __a, int8x16_t __b)
+ {
+- return (uint8x16_t) __builtin_aarch64_usqaddv16qi ((int8x16_t) __a,
+- (int8x16_t) __b);
++ return __builtin_aarch64_usqaddv16qi_uus (__a, __b);
+ }
+
+ __extension__ static __inline uint16x8_t __attribute__ ((__always_inline__))
+ vsqaddq_u16 (uint16x8_t __a, int16x8_t __b)
+ {
+- return (uint16x8_t) __builtin_aarch64_usqaddv8hi ((int16x8_t) __a,
+- (int16x8_t) __b);
++ return __builtin_aarch64_usqaddv8hi_uus (__a, __b);
+ }
+
+ __extension__ static __inline uint32x4_t __attribute__ ((__always_inline__))
+ vsqaddq_u32 (uint32x4_t __a, int32x4_t __b)
+ {
+- return (uint32x4_t) __builtin_aarch64_usqaddv4si ((int32x4_t) __a,
+- (int32x4_t) __b);
++ return __builtin_aarch64_usqaddv4si_uus (__a, __b);
+ }
+
+ __extension__ static __inline uint64x2_t __attribute__ ((__always_inline__))
+ vsqaddq_u64 (uint64x2_t __a, int64x2_t __b)
+ {
+- return (uint64x2_t) __builtin_aarch64_usqaddv2di ((int64x2_t) __a,
+- (int64x2_t) __b);
++ return __builtin_aarch64_usqaddv2di_uus (__a, __b);
+ }
+
+ __extension__ static __inline uint8x1_t __attribute__ ((__always_inline__))
+ vsqaddb_u8 (uint8x1_t __a, int8x1_t __b)
+ {
+- return (uint8x1_t) __builtin_aarch64_usqaddqi ((int8x1_t) __a, __b);
++ return __builtin_aarch64_usqaddqi_uus (__a, __b);
+ }
+
+ __extension__ static __inline uint16x1_t __attribute__ ((__always_inline__))
+ vsqaddh_u16 (uint16x1_t __a, int16x1_t __b)
+ {
+- return (uint16x1_t) __builtin_aarch64_usqaddhi ((int16x1_t) __a, __b);
++ return __builtin_aarch64_usqaddhi_uus (__a, __b);
+ }
+
+ __extension__ static __inline uint32x1_t __attribute__ ((__always_inline__))
+ vsqadds_u32 (uint32x1_t __a, int32x1_t __b)
+ {
+- return (uint32x1_t) __builtin_aarch64_usqaddsi ((int32x1_t) __a, __b);
++ return __builtin_aarch64_usqaddsi_uus (__a, __b);
+ }
+
+ __extension__ static __inline uint64x1_t __attribute__ ((__always_inline__))
+ vsqaddd_u64 (uint64x1_t __a, int64x1_t __b)
+ {
+- return (uint64x1_t) __builtin_aarch64_usqadddi ((int64x1_t) __a, __b);
++ return __builtin_aarch64_usqadddi_uus (__a, __b);
+ }
+
+ /* vsqrt */
+@@ -23668,29 +22449,25 @@
+ __extension__ static __inline uint8x8_t __attribute__ ((__always_inline__))
+ vsra_n_u8 (uint8x8_t __a, uint8x8_t __b, const int __c)
+ {
+- return (uint8x8_t) __builtin_aarch64_usra_nv8qi ((int8x8_t) __a,
+- (int8x8_t) __b, __c);
++ return __builtin_aarch64_usra_nv8qi_uuus (__a, __b, __c);
+ }
+
+ __extension__ static __inline uint16x4_t __attribute__ ((__always_inline__))
+ vsra_n_u16 (uint16x4_t __a, uint16x4_t __b, const int __c)
+ {
+- return (uint16x4_t) __builtin_aarch64_usra_nv4hi ((int16x4_t) __a,
+- (int16x4_t) __b, __c);
++ return __builtin_aarch64_usra_nv4hi_uuus (__a, __b, __c);
+ }
+
+ __extension__ static __inline uint32x2_t __attribute__ ((__always_inline__))
+ vsra_n_u32 (uint32x2_t __a, uint32x2_t __b, const int __c)
+ {
+- return (uint32x2_t) __builtin_aarch64_usra_nv2si ((int32x2_t) __a,
+- (int32x2_t) __b, __c);
++ return __builtin_aarch64_usra_nv2si_uuus (__a, __b, __c);
+ }
+
+ __extension__ static __inline uint64x1_t __attribute__ ((__always_inline__))
+ vsra_n_u64 (uint64x1_t __a, uint64x1_t __b, const int __c)
+ {
+- return (uint64x1_t) __builtin_aarch64_usra_ndi ((int64x1_t) __a,
+- (int64x1_t) __b, __c);
++ return __builtin_aarch64_usra_ndi_uuus (__a, __b, __c);
+ }
+
+ __extension__ static __inline int8x16_t __attribute__ ((__always_inline__))
+@@ -23720,29 +22497,25 @@
+ __extension__ static __inline uint8x16_t __attribute__ ((__always_inline__))
+ vsraq_n_u8 (uint8x16_t __a, uint8x16_t __b, const int __c)
+ {
+- return (uint8x16_t) __builtin_aarch64_usra_nv16qi ((int8x16_t) __a,
+- (int8x16_t) __b, __c);
++ return __builtin_aarch64_usra_nv16qi_uuus (__a, __b, __c);
+ }
+
+ __extension__ static __inline uint16x8_t __attribute__ ((__always_inline__))
+ vsraq_n_u16 (uint16x8_t __a, uint16x8_t __b, const int __c)
+ {
+- return (uint16x8_t) __builtin_aarch64_usra_nv8hi ((int16x8_t) __a,
+- (int16x8_t) __b, __c);
++ return __builtin_aarch64_usra_nv8hi_uuus (__a, __b, __c);
+ }
+
+ __extension__ static __inline uint32x4_t __attribute__ ((__always_inline__))
+ vsraq_n_u32 (uint32x4_t __a, uint32x4_t __b, const int __c)
+ {
+- return (uint32x4_t) __builtin_aarch64_usra_nv4si ((int32x4_t) __a,
+- (int32x4_t) __b, __c);
++ return __builtin_aarch64_usra_nv4si_uuus (__a, __b, __c);
+ }
+
+ __extension__ static __inline uint64x2_t __attribute__ ((__always_inline__))
+ vsraq_n_u64 (uint64x2_t __a, uint64x2_t __b, const int __c)
+ {
+- return (uint64x2_t) __builtin_aarch64_usra_nv2di ((int64x2_t) __a,
+- (int64x2_t) __b, __c);
++ return __builtin_aarch64_usra_nv2di_uuus (__a, __b, __c);
+ }
+
+ __extension__ static __inline int64x1_t __attribute__ ((__always_inline__))
+@@ -23754,7 +22527,7 @@
+ __extension__ static __inline uint64x1_t __attribute__ ((__always_inline__))
+ vsrad_n_u64 (uint64x1_t __a, uint64x1_t __b, const int __c)
+ {
+- return (uint64x1_t) __builtin_aarch64_usra_ndi (__a, __b, __c);
++ return __builtin_aarch64_usra_ndi_uuus (__a, __b, __c);
+ }
+
+ /* vsri */
+@@ -23786,29 +22559,25 @@
+ __extension__ static __inline uint8x8_t __attribute__ ((__always_inline__))
+ vsri_n_u8 (uint8x8_t __a, uint8x8_t __b, const int __c)
+ {
+- return (uint8x8_t) __builtin_aarch64_usri_nv8qi ((int8x8_t) __a,
+- (int8x8_t) __b, __c);
++ return __builtin_aarch64_usri_nv8qi_uuus (__a, __b, __c);
+ }
+
+ __extension__ static __inline uint16x4_t __attribute__ ((__always_inline__))
+ vsri_n_u16 (uint16x4_t __a, uint16x4_t __b, const int __c)
+ {
+- return (uint16x4_t) __builtin_aarch64_usri_nv4hi ((int16x4_t) __a,
+- (int16x4_t) __b, __c);
++ return __builtin_aarch64_usri_nv4hi_uuus (__a, __b, __c);
+ }
+
+ __extension__ static __inline uint32x2_t __attribute__ ((__always_inline__))
+ vsri_n_u32 (uint32x2_t __a, uint32x2_t __b, const int __c)
+ {
+- return (uint32x2_t) __builtin_aarch64_usri_nv2si ((int32x2_t) __a,
+- (int32x2_t) __b, __c);
++ return __builtin_aarch64_usri_nv2si_uuus (__a, __b, __c);
+ }
+
+ __extension__ static __inline uint64x1_t __attribute__ ((__always_inline__))
+ vsri_n_u64 (uint64x1_t __a, uint64x1_t __b, const int __c)
+ {
+- return (uint64x1_t) __builtin_aarch64_usri_ndi ((int64x1_t) __a,
+- (int64x1_t) __b, __c);
++ return __builtin_aarch64_usri_ndi_uuus (__a, __b, __c);
+ }
+
+ __extension__ static __inline int8x16_t __attribute__ ((__always_inline__))
+@@ -23838,29 +22607,25 @@
+ __extension__ static __inline uint8x16_t __attribute__ ((__always_inline__))
+ vsriq_n_u8 (uint8x16_t __a, uint8x16_t __b, const int __c)
+ {
+- return (uint8x16_t) __builtin_aarch64_usri_nv16qi ((int8x16_t) __a,
+- (int8x16_t) __b, __c);
++ return __builtin_aarch64_usri_nv16qi_uuus (__a, __b, __c);
+ }
+
+ __extension__ static __inline uint16x8_t __attribute__ ((__always_inline__))
+ vsriq_n_u16 (uint16x8_t __a, uint16x8_t __b, const int __c)
+ {
+- return (uint16x8_t) __builtin_aarch64_usri_nv8hi ((int16x8_t) __a,
+- (int16x8_t) __b, __c);
++ return __builtin_aarch64_usri_nv8hi_uuus (__a, __b, __c);
+ }
+
+ __extension__ static __inline uint32x4_t __attribute__ ((__always_inline__))
+ vsriq_n_u32 (uint32x4_t __a, uint32x4_t __b, const int __c)
+ {
+- return (uint32x4_t) __builtin_aarch64_usri_nv4si ((int32x4_t) __a,
+- (int32x4_t) __b, __c);
++ return __builtin_aarch64_usri_nv4si_uuus (__a, __b, __c);
+ }
+
+ __extension__ static __inline uint64x2_t __attribute__ ((__always_inline__))
+ vsriq_n_u64 (uint64x2_t __a, uint64x2_t __b, const int __c)
+ {
+- return (uint64x2_t) __builtin_aarch64_usri_nv2di ((int64x2_t) __a,
+- (int64x2_t) __b, __c);
++ return __builtin_aarch64_usri_nv2di_uuus (__a, __b, __c);
+ }
+
+ __extension__ static __inline int64x1_t __attribute__ ((__always_inline__))
+@@ -23872,7 +22637,7 @@
+ __extension__ static __inline uint64x1_t __attribute__ ((__always_inline__))
+ vsrid_n_u64 (uint64x1_t __a, uint64x1_t __b, const int __c)
+ {
+- return (uint64x1_t) __builtin_aarch64_usri_ndi (__a, __b, __c);
++ return __builtin_aarch64_usri_ndi_uuus (__a, __b, __c);
+ }
+
+ /* vst1 */
+@@ -24976,6 +23741,438 @@
+
+ /* vtrn */
+
++__extension__ static __inline float32x2_t __attribute__ ((__always_inline__))
++vtrn1_f32 (float32x2_t __a, float32x2_t __b)
++{
++#ifdef __AARCH64EB__
++ return __builtin_shuffle (__a, __b, (uint32x2_t) {3, 1});
++#else
++ return __builtin_shuffle (__a, __b, (uint32x2_t) {0, 2});
++#endif
++}
++
++__extension__ static __inline poly8x8_t __attribute__ ((__always_inline__))
++vtrn1_p8 (poly8x8_t __a, poly8x8_t __b)
++{
++#ifdef __AARCH64EB__
++ return __builtin_shuffle (__a, __b, (uint8x8_t) {9, 1, 11, 3, 13, 5, 15, 7});
++#else
++ return __builtin_shuffle (__a, __b, (uint8x8_t) {0, 8, 2, 10, 4, 12, 6, 14});
++#endif
++}
++
++__extension__ static __inline poly16x4_t __attribute__ ((__always_inline__))
++vtrn1_p16 (poly16x4_t __a, poly16x4_t __b)
++{
++#ifdef __AARCH64EB__
++ return __builtin_shuffle (__a, __b, (uint16x4_t) {5, 1, 7, 3});
++#else
++ return __builtin_shuffle (__a, __b, (uint16x4_t) {0, 4, 2, 6});
++#endif
++}
++
++__extension__ static __inline int8x8_t __attribute__ ((__always_inline__))
++vtrn1_s8 (int8x8_t __a, int8x8_t __b)
++{
++#ifdef __AARCH64EB__
++ return __builtin_shuffle (__a, __b, (uint8x8_t) {9, 1, 11, 3, 13, 5, 15, 7});
++#else
++ return __builtin_shuffle (__a, __b, (uint8x8_t) {0, 8, 2, 10, 4, 12, 6, 14});
++#endif
++}
++
++__extension__ static __inline int16x4_t __attribute__ ((__always_inline__))
++vtrn1_s16 (int16x4_t __a, int16x4_t __b)
++{
++#ifdef __AARCH64EB__
++ return __builtin_shuffle (__a, __b, (uint16x4_t) {5, 1, 7, 3});
++#else
++ return __builtin_shuffle (__a, __b, (uint16x4_t) {0, 4, 2, 6});
++#endif
++}
++
++__extension__ static __inline int32x2_t __attribute__ ((__always_inline__))
++vtrn1_s32 (int32x2_t __a, int32x2_t __b)
++{
++#ifdef __AARCH64EB__
++ return __builtin_shuffle (__a, __b, (uint32x2_t) {3, 1});
++#else
++ return __builtin_shuffle (__a, __b, (uint32x2_t) {0, 2});
++#endif
++}
++
++__extension__ static __inline uint8x8_t __attribute__ ((__always_inline__))
++vtrn1_u8 (uint8x8_t __a, uint8x8_t __b)
++{
++#ifdef __AARCH64EB__
++ return __builtin_shuffle (__a, __b, (uint8x8_t) {9, 1, 11, 3, 13, 5, 15, 7});
++#else
++ return __builtin_shuffle (__a, __b, (uint8x8_t) {0, 8, 2, 10, 4, 12, 6, 14});
++#endif
++}
++
++__extension__ static __inline uint16x4_t __attribute__ ((__always_inline__))
++vtrn1_u16 (uint16x4_t __a, uint16x4_t __b)
++{
++#ifdef __AARCH64EB__
++ return __builtin_shuffle (__a, __b, (uint16x4_t) {5, 1, 7, 3});
++#else
++ return __builtin_shuffle (__a, __b, (uint16x4_t) {0, 4, 2, 6});
++#endif
++}
++
++__extension__ static __inline uint32x2_t __attribute__ ((__always_inline__))
++vtrn1_u32 (uint32x2_t __a, uint32x2_t __b)
++{
++#ifdef __AARCH64EB__
++ return __builtin_shuffle (__a, __b, (uint32x2_t) {3, 1});
++#else
++ return __builtin_shuffle (__a, __b, (uint32x2_t) {0, 2});
++#endif
++}
++
++__extension__ static __inline float32x4_t __attribute__ ((__always_inline__))
++vtrn1q_f32 (float32x4_t __a, float32x4_t __b)
++{
++#ifdef __AARCH64EB__
++ return __builtin_shuffle (__a, __b, (uint32x4_t) {5, 1, 7, 3});
++#else
++ return __builtin_shuffle (__a, __b, (uint32x4_t) {0, 4, 2, 6});
++#endif
++}
++
++__extension__ static __inline float64x2_t __attribute__ ((__always_inline__))
++vtrn1q_f64 (float64x2_t __a, float64x2_t __b)
++{
++#ifdef __AARCH64EB__
++ return __builtin_shuffle (__a, __b, (uint64x2_t) {3, 1});
++#else
++ return __builtin_shuffle (__a, __b, (uint64x2_t) {0, 2});
++#endif
++}
++
++__extension__ static __inline poly8x16_t __attribute__ ((__always_inline__))
++vtrn1q_p8 (poly8x16_t __a, poly8x16_t __b)
++{
++#ifdef __AARCH64EB__
++ return __builtin_shuffle (__a, __b,
++ (uint8x16_t) {17, 1, 19, 3, 21, 5, 23, 7, 25, 9, 27, 11, 29, 13, 31, 15});
++#else
++ return __builtin_shuffle (__a, __b,
++ (uint8x16_t) {0, 16, 2, 18, 4, 20, 6, 22, 8, 24, 10, 26, 12, 28, 14, 30});
++#endif
++}
++
++__extension__ static __inline poly16x8_t __attribute__ ((__always_inline__))
++vtrn1q_p16 (poly16x8_t __a, poly16x8_t __b)
++{
++#ifdef __AARCH64EB__
++ return __builtin_shuffle (__a, __b, (uint16x8_t) {9, 1, 11, 3, 13, 5, 15, 7});
++#else
++ return __builtin_shuffle (__a, __b, (uint16x8_t) {0, 8, 2, 10, 4, 12, 6, 14});
++#endif
++}
++
++__extension__ static __inline int8x16_t __attribute__ ((__always_inline__))
++vtrn1q_s8 (int8x16_t __a, int8x16_t __b)
++{
++#ifdef __AARCH64EB__
++ return __builtin_shuffle (__a, __b,
++ (uint8x16_t) {17, 1, 19, 3, 21, 5, 23, 7, 25, 9, 27, 11, 29, 13, 31, 15});
++#else
++ return __builtin_shuffle (__a, __b,
++ (uint8x16_t) {0, 16, 2, 18, 4, 20, 6, 22, 8, 24, 10, 26, 12, 28, 14, 30});
++#endif
++}
++
++__extension__ static __inline int16x8_t __attribute__ ((__always_inline__))
++vtrn1q_s16 (int16x8_t __a, int16x8_t __b)
++{
++#ifdef __AARCH64EB__
++ return __builtin_shuffle (__a, __b, (uint16x8_t) {9, 1, 11, 3, 13, 5, 15, 7});
++#else
++ return __builtin_shuffle (__a, __b, (uint16x8_t) {0, 8, 2, 10, 4, 12, 6, 14});
++#endif
++}
++
++__extension__ static __inline int32x4_t __attribute__ ((__always_inline__))
++vtrn1q_s32 (int32x4_t __a, int32x4_t __b)
++{
++#ifdef __AARCH64EB__
++ return __builtin_shuffle (__a, __b, (uint32x4_t) {5, 1, 7, 3});
++#else
++ return __builtin_shuffle (__a, __b, (uint32x4_t) {0, 4, 2, 6});
++#endif
++}
++
++__extension__ static __inline int64x2_t __attribute__ ((__always_inline__))
++vtrn1q_s64 (int64x2_t __a, int64x2_t __b)
++{
++#ifdef __AARCH64EB__
++ return __builtin_shuffle (__a, __b, (uint64x2_t) {3, 1});
++#else
++ return __builtin_shuffle (__a, __b, (uint64x2_t) {0, 2});
++#endif
++}
++
++__extension__ static __inline uint8x16_t __attribute__ ((__always_inline__))
++vtrn1q_u8 (uint8x16_t __a, uint8x16_t __b)
++{
++#ifdef __AARCH64EB__
++ return __builtin_shuffle (__a, __b,
++ (uint8x16_t) {17, 1, 19, 3, 21, 5, 23, 7, 25, 9, 27, 11, 29, 13, 31, 15});
++#else
++ return __builtin_shuffle (__a, __b,
++ (uint8x16_t) {0, 16, 2, 18, 4, 20, 6, 22, 8, 24, 10, 26, 12, 28, 14, 30});
++#endif
++}
++
++__extension__ static __inline uint16x8_t __attribute__ ((__always_inline__))
++vtrn1q_u16 (uint16x8_t __a, uint16x8_t __b)
++{
++#ifdef __AARCH64EB__
++ return __builtin_shuffle (__a, __b, (uint16x8_t) {9, 1, 11, 3, 13, 5, 15, 7});
++#else
++ return __builtin_shuffle (__a, __b, (uint16x8_t) {0, 8, 2, 10, 4, 12, 6, 14});
++#endif
++}
++
++__extension__ static __inline uint32x4_t __attribute__ ((__always_inline__))
++vtrn1q_u32 (uint32x4_t __a, uint32x4_t __b)
++{
++#ifdef __AARCH64EB__
++ return __builtin_shuffle (__a, __b, (uint32x4_t) {5, 1, 7, 3});
++#else
++ return __builtin_shuffle (__a, __b, (uint32x4_t) {0, 4, 2, 6});
++#endif
++}
++
++__extension__ static __inline uint64x2_t __attribute__ ((__always_inline__))
++vtrn1q_u64 (uint64x2_t __a, uint64x2_t __b)
++{
++#ifdef __AARCH64EB__
++ return __builtin_shuffle (__a, __b, (uint64x2_t) {3, 1});
++#else
++ return __builtin_shuffle (__a, __b, (uint64x2_t) {0, 2});
++#endif
++}
++
++__extension__ static __inline float32x2_t __attribute__ ((__always_inline__))
++vtrn2_f32 (float32x2_t __a, float32x2_t __b)
++{
++#ifdef __AARCH64EB__
++ return __builtin_shuffle (__a, __b, (uint32x2_t) {2, 0});
++#else
++ return __builtin_shuffle (__a, __b, (uint32x2_t) {1, 3});
++#endif
++}
++
++__extension__ static __inline poly8x8_t __attribute__ ((__always_inline__))
++vtrn2_p8 (poly8x8_t __a, poly8x8_t __b)
++{
++#ifdef __AARCH64EB__
++ return __builtin_shuffle (__a, __b, (uint8x8_t) {8, 0, 10, 2, 12, 4, 14, 6});
++#else
++ return __builtin_shuffle (__a, __b, (uint8x8_t) {1, 9, 3, 11, 5, 13, 7, 15});
++#endif
++}
++
++__extension__ static __inline poly16x4_t __attribute__ ((__always_inline__))
++vtrn2_p16 (poly16x4_t __a, poly16x4_t __b)
++{
++#ifdef __AARCH64EB__
++ return __builtin_shuffle (__a, __b, (uint16x4_t) {4, 0, 6, 2});
++#else
++ return __builtin_shuffle (__a, __b, (uint16x4_t) {1, 5, 3, 7});
++#endif
++}
++
++__extension__ static __inline int8x8_t __attribute__ ((__always_inline__))
++vtrn2_s8 (int8x8_t __a, int8x8_t __b)
++{
++#ifdef __AARCH64EB__
++ return __builtin_shuffle (__a, __b, (uint8x8_t) {8, 0, 10, 2, 12, 4, 14, 6});
++#else
++ return __builtin_shuffle (__a, __b, (uint8x8_t) {1, 9, 3, 11, 5, 13, 7, 15});
++#endif
++}
++
++__extension__ static __inline int16x4_t __attribute__ ((__always_inline__))
++vtrn2_s16 (int16x4_t __a, int16x4_t __b)
++{
++#ifdef __AARCH64EB__
++ return __builtin_shuffle (__a, __b, (uint16x4_t) {4, 0, 6, 2});
++#else
++ return __builtin_shuffle (__a, __b, (uint16x4_t) {1, 5, 3, 7});
++#endif
++}
++
++__extension__ static __inline int32x2_t __attribute__ ((__always_inline__))
++vtrn2_s32 (int32x2_t __a, int32x2_t __b)
++{
++#ifdef __AARCH64EB__
++ return __builtin_shuffle (__a, __b, (uint32x2_t) {2, 0});
++#else
++ return __builtin_shuffle (__a, __b, (uint32x2_t) {1, 3});
++#endif
++}
++
++__extension__ static __inline uint8x8_t __attribute__ ((__always_inline__))
++vtrn2_u8 (uint8x8_t __a, uint8x8_t __b)
++{
++#ifdef __AARCH64EB__
++ return __builtin_shuffle (__a, __b, (uint8x8_t) {8, 0, 10, 2, 12, 4, 14, 6});
++#else
++ return __builtin_shuffle (__a, __b, (uint8x8_t) {1, 9, 3, 11, 5, 13, 7, 15});
++#endif
++}
++
++__extension__ static __inline uint16x4_t __attribute__ ((__always_inline__))
++vtrn2_u16 (uint16x4_t __a, uint16x4_t __b)
++{
++#ifdef __AARCH64EB__
++ return __builtin_shuffle (__a, __b, (uint16x4_t) {4, 0, 6, 2});
++#else
++ return __builtin_shuffle (__a, __b, (uint16x4_t) {1, 5, 3, 7});
++#endif
++}
++
++__extension__ static __inline uint32x2_t __attribute__ ((__always_inline__))
++vtrn2_u32 (uint32x2_t __a, uint32x2_t __b)
++{
++#ifdef __AARCH64EB__
++ return __builtin_shuffle (__a, __b, (uint32x2_t) {2, 0});
++#else
++ return __builtin_shuffle (__a, __b, (uint32x2_t) {1, 3});
++#endif
++}
++
++__extension__ static __inline float32x4_t __attribute__ ((__always_inline__))
++vtrn2q_f32 (float32x4_t __a, float32x4_t __b)
++{
++#ifdef __AARCH64EB__
++ return __builtin_shuffle (__a, __b, (uint32x4_t) {4, 0, 6, 2});
++#else
++ return __builtin_shuffle (__a, __b, (uint32x4_t) {1, 5, 3, 7});
++#endif
++}
++
++__extension__ static __inline float64x2_t __attribute__ ((__always_inline__))
++vtrn2q_f64 (float64x2_t __a, float64x2_t __b)
++{
++#ifdef __AARCH64EB__
++ return __builtin_shuffle (__a, __b, (uint64x2_t) {2, 0});
++#else
++ return __builtin_shuffle (__a, __b, (uint64x2_t) {1, 3});
++#endif
++}
++
++__extension__ static __inline poly8x16_t __attribute__ ((__always_inline__))
++vtrn2q_p8 (poly8x16_t __a, poly8x16_t __b)
++{
++#ifdef __AARCH64EB__
++ return __builtin_shuffle (__a, __b,
++ (uint8x16_t) {16, 0, 18, 2, 20, 4, 22, 6, 24, 8, 26, 10, 28, 12, 30, 14});
++#else
++ return __builtin_shuffle (__a, __b,
++ (uint8x16_t) {1, 17, 3, 19, 5, 21, 7, 23, 9, 25, 11, 27, 13, 29, 15, 31});
++#endif
++}
++
++__extension__ static __inline poly16x8_t __attribute__ ((__always_inline__))
++vtrn2q_p16 (poly16x8_t __a, poly16x8_t __b)
++{
++#ifdef __AARCH64EB__
++ return __builtin_shuffle (__a, __b, (uint16x8_t) {8, 0, 10, 2, 12, 4, 14, 6});
++#else
++ return __builtin_shuffle (__a, __b, (uint16x8_t) {1, 9, 3, 11, 5, 13, 7, 15});
++#endif
++}
++
++__extension__ static __inline int8x16_t __attribute__ ((__always_inline__))
++vtrn2q_s8 (int8x16_t __a, int8x16_t __b)
++{
++#ifdef __AARCH64EB__
++ return __builtin_shuffle (__a, __b,
++ (uint8x16_t) {16, 0, 18, 2, 20, 4, 22, 6, 24, 8, 26, 10, 28, 12, 30, 14});
++#else
++ return __builtin_shuffle (__a, __b,
++ (uint8x16_t) {1, 17, 3, 19, 5, 21, 7, 23, 9, 25, 11, 27, 13, 29, 15, 31});
++#endif
++}
++
++__extension__ static __inline int16x8_t __attribute__ ((__always_inline__))
++vtrn2q_s16 (int16x8_t __a, int16x8_t __b)
++{
++#ifdef __AARCH64EB__
++ return __builtin_shuffle (__a, __b, (uint16x8_t) {8, 0, 10, 2, 12, 4, 14, 6});
++#else
++ return __builtin_shuffle (__a, __b, (uint16x8_t) {1, 9, 3, 11, 5, 13, 7, 15});
++#endif
++}
++
++__extension__ static __inline int32x4_t __attribute__ ((__always_inline__))
++vtrn2q_s32 (int32x4_t __a, int32x4_t __b)
++{
++#ifdef __AARCH64EB__
++ return __builtin_shuffle (__a, __b, (uint32x4_t) {4, 0, 6, 2});
++#else
++ return __builtin_shuffle (__a, __b, (uint32x4_t) {1, 5, 3, 7});
++#endif
++}
++
++__extension__ static __inline int64x2_t __attribute__ ((__always_inline__))
++vtrn2q_s64 (int64x2_t __a, int64x2_t __b)
++{
++#ifdef __AARCH64EB__
++ return __builtin_shuffle (__a, __b, (uint64x2_t) {2, 0});
++#else
++ return __builtin_shuffle (__a, __b, (uint64x2_t) {1, 3});
++#endif
++}
++
++__extension__ static __inline uint8x16_t __attribute__ ((__always_inline__))
++vtrn2q_u8 (uint8x16_t __a, uint8x16_t __b)
++{
++#ifdef __AARCH64EB__
++ return __builtin_shuffle (__a, __b,
++ (uint8x16_t) {16, 0, 18, 2, 20, 4, 22, 6, 24, 8, 26, 10, 28, 12, 30, 14});
++#else
++ return __builtin_shuffle (__a, __b,
++ (uint8x16_t) {1, 17, 3, 19, 5, 21, 7, 23, 9, 25, 11, 27, 13, 29, 15, 31});
++#endif
++}
++
++__extension__ static __inline uint16x8_t __attribute__ ((__always_inline__))
++vtrn2q_u16 (uint16x8_t __a, uint16x8_t __b)
++{
++#ifdef __AARCH64EB__
++ return __builtin_shuffle (__a, __b, (uint16x8_t) {8, 0, 10, 2, 12, 4, 14, 6});
++#else
++ return __builtin_shuffle (__a, __b, (uint16x8_t) {1, 9, 3, 11, 5, 13, 7, 15});
++#endif
++}
++
++__extension__ static __inline uint32x4_t __attribute__ ((__always_inline__))
++vtrn2q_u32 (uint32x4_t __a, uint32x4_t __b)
++{
++#ifdef __AARCH64EB__
++ return __builtin_shuffle (__a, __b, (uint32x4_t) {4, 0, 6, 2});
++#else
++ return __builtin_shuffle (__a, __b, (uint32x4_t) {1, 5, 3, 7});
++#endif
++}
++
++__extension__ static __inline uint64x2_t __attribute__ ((__always_inline__))
++vtrn2q_u64 (uint64x2_t __a, uint64x2_t __b)
++{
++#ifdef __AARCH64EB__
++ return __builtin_shuffle (__a, __b, (uint64x2_t) {2, 0});
++#else
++ return __builtin_shuffle (__a, __b, (uint64x2_t) {1, 3});
++#endif
++}
++
+ __extension__ static __inline float32x2x2_t __attribute__ ((__always_inline__))
+ vtrn_f32 (float32x2_t a, float32x2_t b)
+ {
+@@ -25206,73 +24403,73 @@
+ __extension__ static __inline int8x8_t __attribute__ ((__always_inline__))
+ vuqadd_s8 (int8x8_t __a, uint8x8_t __b)
+ {
+- return (int8x8_t) __builtin_aarch64_suqaddv8qi (__a, (int8x8_t) __b);
++ return __builtin_aarch64_suqaddv8qi_ssu (__a, __b);
+ }
+
+ __extension__ static __inline int16x4_t __attribute__ ((__always_inline__))
+ vuqadd_s16 (int16x4_t __a, uint16x4_t __b)
+ {
+- return (int16x4_t) __builtin_aarch64_suqaddv4hi (__a, (int16x4_t) __b);
++ return __builtin_aarch64_suqaddv4hi_ssu (__a, __b);
+ }
+
+ __extension__ static __inline int32x2_t __attribute__ ((__always_inline__))
+ vuqadd_s32 (int32x2_t __a, uint32x2_t __b)
+ {
+- return (int32x2_t) __builtin_aarch64_suqaddv2si (__a, (int32x2_t) __b);
++ return __builtin_aarch64_suqaddv2si_ssu (__a, __b);
+ }
+
+ __extension__ static __inline int64x1_t __attribute__ ((__always_inline__))
+ vuqadd_s64 (int64x1_t __a, uint64x1_t __b)
+ {
+- return (int64x1_t) __builtin_aarch64_suqadddi (__a, (int64x1_t) __b);
++ return __builtin_aarch64_suqadddi_ssu (__a, __b);
+ }
+
+ __extension__ static __inline int8x16_t __attribute__ ((__always_inline__))
+ vuqaddq_s8 (int8x16_t __a, uint8x16_t __b)
+ {
+- return (int8x16_t) __builtin_aarch64_suqaddv16qi (__a, (int8x16_t) __b);
++ return __builtin_aarch64_suqaddv16qi_ssu (__a, __b);
+ }
+
+ __extension__ static __inline int16x8_t __attribute__ ((__always_inline__))
+ vuqaddq_s16 (int16x8_t __a, uint16x8_t __b)
+ {
+- return (int16x8_t) __builtin_aarch64_suqaddv8hi (__a, (int16x8_t) __b);
++ return __builtin_aarch64_suqaddv8hi_ssu (__a, __b);
+ }
+
+ __extension__ static __inline int32x4_t __attribute__ ((__always_inline__))
+ vuqaddq_s32 (int32x4_t __a, uint32x4_t __b)
+ {
+- return (int32x4_t) __builtin_aarch64_suqaddv4si (__a, (int32x4_t) __b);
++ return __builtin_aarch64_suqaddv4si_ssu (__a, __b);
+ }
+
+ __extension__ static __inline int64x2_t __attribute__ ((__always_inline__))
+ vuqaddq_s64 (int64x2_t __a, uint64x2_t __b)
+ {
+- return (int64x2_t) __builtin_aarch64_suqaddv2di (__a, (int64x2_t) __b);
++ return __builtin_aarch64_suqaddv2di_ssu (__a, __b);
+ }
+
+ __extension__ static __inline int8x1_t __attribute__ ((__always_inline__))
+ vuqaddb_s8 (int8x1_t __a, uint8x1_t __b)
+ {
+- return (int8x1_t) __builtin_aarch64_suqaddqi (__a, (int8x1_t) __b);
++ return __builtin_aarch64_suqaddqi_ssu (__a, __b);
+ }
+
+ __extension__ static __inline int16x1_t __attribute__ ((__always_inline__))
+ vuqaddh_s16 (int16x1_t __a, uint16x1_t __b)
+ {
+- return (int16x1_t) __builtin_aarch64_suqaddhi (__a, (int16x1_t) __b);
++ return __builtin_aarch64_suqaddhi_ssu (__a, __b);
+ }
+
+ __extension__ static __inline int32x1_t __attribute__ ((__always_inline__))
+ vuqadds_s32 (int32x1_t __a, uint32x1_t __b)
+ {
+- return (int32x1_t) __builtin_aarch64_suqaddsi (__a, (int32x1_t) __b);
++ return __builtin_aarch64_suqaddsi_ssu (__a, __b);
+ }
+
+ __extension__ static __inline int64x1_t __attribute__ ((__always_inline__))
+ vuqaddd_s64 (int64x1_t __a, uint64x1_t __b)
+ {
+- return (int64x1_t) __builtin_aarch64_suqadddi (__a, (int64x1_t) __b);
++ return __builtin_aarch64_suqadddi_ssu (__a, __b);
+ }
+
+ #define __DEFINTERLEAVE(op, rettype, intype, funcsuffix, Q) \
+@@ -25306,10 +24503,880 @@
+
+ /* vuzp */
+
++__extension__ static __inline float32x2_t __attribute__ ((__always_inline__))
++vuzp1_f32 (float32x2_t __a, float32x2_t __b)
++{
++#ifdef __AARCH64EB__
++ return __builtin_shuffle (__a, __b, (uint32x2_t) {3, 1});
++#else
++ return __builtin_shuffle (__a, __b, (uint32x2_t) {0, 2});
++#endif
++}
++
++__extension__ static __inline poly8x8_t __attribute__ ((__always_inline__))
++vuzp1_p8 (poly8x8_t __a, poly8x8_t __b)
++{
++#ifdef __AARCH64EB__
++ return __builtin_shuffle (__a, __b, (uint8x8_t) {9, 11, 13, 15, 1, 3, 5, 7});
++#else
++ return __builtin_shuffle (__a, __b, (uint8x8_t) {0, 2, 4, 6, 8, 10, 12, 14});
++#endif
++}
++
++__extension__ static __inline poly16x4_t __attribute__ ((__always_inline__))
++vuzp1_p16 (poly16x4_t __a, poly16x4_t __b)
++{
++#ifdef __AARCH64EB__
++ return __builtin_shuffle (__a, __b, (uint16x4_t) {5, 7, 1, 3});
++#else
++ return __builtin_shuffle (__a, __b, (uint16x4_t) {0, 2, 4, 6});
++#endif
++}
++
++__extension__ static __inline int8x8_t __attribute__ ((__always_inline__))
++vuzp1_s8 (int8x8_t __a, int8x8_t __b)
++{
++#ifdef __AARCH64EB__
++ return __builtin_shuffle (__a, __b, (uint8x8_t) {9, 11, 13, 15, 1, 3, 5, 7});
++#else
++ return __builtin_shuffle (__a, __b, (uint8x8_t) {0, 2, 4, 6, 8, 10, 12, 14});
++#endif
++}
++
++__extension__ static __inline int16x4_t __attribute__ ((__always_inline__))
++vuzp1_s16 (int16x4_t __a, int16x4_t __b)
++{
++#ifdef __AARCH64EB__
++ return __builtin_shuffle (__a, __b, (uint16x4_t) {5, 7, 1, 3});
++#else
++ return __builtin_shuffle (__a, __b, (uint16x4_t) {0, 2, 4, 6});
++#endif
++}
++
++__extension__ static __inline int32x2_t __attribute__ ((__always_inline__))
++vuzp1_s32 (int32x2_t __a, int32x2_t __b)
++{
++#ifdef __AARCH64EB__
++ return __builtin_shuffle (__a, __b, (uint32x2_t) {3, 1});
++#else
++ return __builtin_shuffle (__a, __b, (uint32x2_t) {0, 2});
++#endif
++}
++
++__extension__ static __inline uint8x8_t __attribute__ ((__always_inline__))
++vuzp1_u8 (uint8x8_t __a, uint8x8_t __b)
++{
++#ifdef __AARCH64EB__
++ return __builtin_shuffle (__a, __b, (uint8x8_t) {9, 11, 13, 15, 1, 3, 5, 7});
++#else
++ return __builtin_shuffle (__a, __b, (uint8x8_t) {0, 2, 4, 6, 8, 10, 12, 14});
++#endif
++}
++
++__extension__ static __inline uint16x4_t __attribute__ ((__always_inline__))
++vuzp1_u16 (uint16x4_t __a, uint16x4_t __b)
++{
++#ifdef __AARCH64EB__
++ return __builtin_shuffle (__a, __b, (uint16x4_t) {5, 7, 1, 3});
++#else
++ return __builtin_shuffle (__a, __b, (uint16x4_t) {0, 2, 4, 6});
++#endif
++}
++
++__extension__ static __inline uint32x2_t __attribute__ ((__always_inline__))
++vuzp1_u32 (uint32x2_t __a, uint32x2_t __b)
++{
++#ifdef __AARCH64EB__
++ return __builtin_shuffle (__a, __b, (uint32x2_t) {3, 1});
++#else
++ return __builtin_shuffle (__a, __b, (uint32x2_t) {0, 2});
++#endif
++}
++
++__extension__ static __inline float32x4_t __attribute__ ((__always_inline__))
++vuzp1q_f32 (float32x4_t __a, float32x4_t __b)
++{
++#ifdef __AARCH64EB__
++ return __builtin_shuffle (__a, __b, (uint32x4_t) {5, 7, 1, 3});
++#else
++ return __builtin_shuffle (__a, __b, (uint32x4_t) {0, 2, 4, 6});
++#endif
++}
++
++__extension__ static __inline float64x2_t __attribute__ ((__always_inline__))
++vuzp1q_f64 (float64x2_t __a, float64x2_t __b)
++{
++#ifdef __AARCH64EB__
++ return __builtin_shuffle (__a, __b, (uint64x2_t) {3, 1});
++#else
++ return __builtin_shuffle (__a, __b, (uint64x2_t) {0, 2});
++#endif
++}
++
++__extension__ static __inline poly8x16_t __attribute__ ((__always_inline__))
++vuzp1q_p8 (poly8x16_t __a, poly8x16_t __b)
++{
++#ifdef __AARCH64EB__
++ return __builtin_shuffle (__a, __b, (uint8x16_t)
++ {17, 19, 21, 23, 25, 27, 29, 31, 1, 3, 5, 7, 9, 11, 13, 15});
++#else
++ return __builtin_shuffle (__a, __b, (uint8x16_t)
++ {0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30});
++#endif
++}
++
++__extension__ static __inline poly16x8_t __attribute__ ((__always_inline__))
++vuzp1q_p16 (poly16x8_t __a, poly16x8_t __b)
++{
++#ifdef __AARCH64EB__
++ return __builtin_shuffle (__a, __b, (uint16x8_t) {9, 11, 13, 15, 1, 3, 5, 7});
++#else
++ return __builtin_shuffle (__a, __b, (uint16x8_t) {0, 2, 4, 6, 8, 10, 12, 14});
++#endif
++}
++
++__extension__ static __inline int8x16_t __attribute__ ((__always_inline__))
++vuzp1q_s8 (int8x16_t __a, int8x16_t __b)
++{
++#ifdef __AARCH64EB__
++ return __builtin_shuffle (__a, __b,
++ (uint8x16_t) {17, 19, 21, 23, 25, 27, 29, 31, 1, 3, 5, 7, 9, 11, 13, 15});
++#else
++ return __builtin_shuffle (__a, __b,
++ (uint8x16_t) {0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30});
++#endif
++}
++
++__extension__ static __inline int16x8_t __attribute__ ((__always_inline__))
++vuzp1q_s16 (int16x8_t __a, int16x8_t __b)
++{
++#ifdef __AARCH64EB__
++ return __builtin_shuffle (__a, __b, (uint16x8_t) {9, 11, 13, 15, 1, 3, 5, 7});
++#else
++ return __builtin_shuffle (__a, __b, (uint16x8_t) {0, 2, 4, 6, 8, 10, 12, 14});
++#endif
++}
++
++__extension__ static __inline int32x4_t __attribute__ ((__always_inline__))
++vuzp1q_s32 (int32x4_t __a, int32x4_t __b)
++{
++#ifdef __AARCH64EB__
++ return __builtin_shuffle (__a, __b, (uint32x4_t) {5, 7, 1, 3});
++#else
++ return __builtin_shuffle (__a, __b, (uint32x4_t) {0, 2, 4, 6});
++#endif
++}
++
++__extension__ static __inline int64x2_t __attribute__ ((__always_inline__))
++vuzp1q_s64 (int64x2_t __a, int64x2_t __b)
++{
++#ifdef __AARCH64EB__
++ return __builtin_shuffle (__a, __b, (uint64x2_t) {3, 1});
++#else
++ return __builtin_shuffle (__a, __b, (uint64x2_t) {0, 2});
++#endif
++}
++
++__extension__ static __inline uint8x16_t __attribute__ ((__always_inline__))
++vuzp1q_u8 (uint8x16_t __a, uint8x16_t __b)
++{
++#ifdef __AARCH64EB__
++ return __builtin_shuffle (__a, __b,
++ (uint8x16_t) {17, 19, 21, 23, 25, 27, 29, 31, 1, 3, 5, 7, 9, 11, 13, 15});
++#else
++ return __builtin_shuffle (__a, __b,
++ (uint8x16_t) {0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30});
++#endif
++}
++
++__extension__ static __inline uint16x8_t __attribute__ ((__always_inline__))
++vuzp1q_u16 (uint16x8_t __a, uint16x8_t __b)
++{
++#ifdef __AARCH64EB__
++ return __builtin_shuffle (__a, __b, (uint16x8_t) {9, 11, 13, 15, 1, 3, 5, 7});
++#else
++ return __builtin_shuffle (__a, __b, (uint16x8_t) {0, 2, 4, 6, 8, 10, 12, 14});
++#endif
++}
++
++__extension__ static __inline uint32x4_t __attribute__ ((__always_inline__))
++vuzp1q_u32 (uint32x4_t __a, uint32x4_t __b)
++{
++#ifdef __AARCH64EB__
++ return __builtin_shuffle (__a, __b, (uint32x4_t) {5, 7, 1, 3});
++#else
++ return __builtin_shuffle (__a, __b, (uint32x4_t) {0, 2, 4, 6});
++#endif
++}
++
++__extension__ static __inline uint64x2_t __attribute__ ((__always_inline__))
++vuzp1q_u64 (uint64x2_t __a, uint64x2_t __b)
++{
++#ifdef __AARCH64EB__
++ return __builtin_shuffle (__a, __b, (uint64x2_t) {3, 1});
++#else
++ return __builtin_shuffle (__a, __b, (uint64x2_t) {0, 2});
++#endif
++}
++
++__extension__ static __inline float32x2_t __attribute__ ((__always_inline__))
++vuzp2_f32 (float32x2_t __a, float32x2_t __b)
++{
++#ifdef __AARCH64EB__
++ return __builtin_shuffle (__a, __b, (uint32x2_t) {2, 0});
++#else
++ return __builtin_shuffle (__a, __b, (uint32x2_t) {1, 3});
++#endif
++}
++
++__extension__ static __inline poly8x8_t __attribute__ ((__always_inline__))
++vuzp2_p8 (poly8x8_t __a, poly8x8_t __b)
++{
++#ifdef __AARCH64EB__
++ return __builtin_shuffle (__a, __b, (uint8x8_t) {8, 10, 12, 14, 0, 2, 4, 6});
++#else
++ return __builtin_shuffle (__a, __b, (uint8x8_t) {1, 3, 5, 7, 9, 11, 13, 15});
++#endif
++}
++
++__extension__ static __inline poly16x4_t __attribute__ ((__always_inline__))
++vuzp2_p16 (poly16x4_t __a, poly16x4_t __b)
++{
++#ifdef __AARCH64EB__
++ return __builtin_shuffle (__a, __b, (uint16x4_t) {4, 6, 0, 2});
++#else
++ return __builtin_shuffle (__a, __b, (uint16x4_t) {1, 3, 5, 7});
++#endif
++}
++
++__extension__ static __inline int8x8_t __attribute__ ((__always_inline__))
++vuzp2_s8 (int8x8_t __a, int8x8_t __b)
++{
++#ifdef __AARCH64EB__
++ return __builtin_shuffle (__a, __b, (uint8x8_t) {8, 10, 12, 14, 0, 2, 4, 6});
++#else
++ return __builtin_shuffle (__a, __b, (uint8x8_t) {1, 3, 5, 7, 9, 11, 13, 15});
++#endif
++}
++
++__extension__ static __inline int16x4_t __attribute__ ((__always_inline__))
++vuzp2_s16 (int16x4_t __a, int16x4_t __b)
++{
++#ifdef __AARCH64EB__
++ return __builtin_shuffle (__a, __b, (uint16x4_t) {4, 6, 0, 2});
++#else
++ return __builtin_shuffle (__a, __b, (uint16x4_t) {1, 3, 5, 7});
++#endif
++}
++
++__extension__ static __inline int32x2_t __attribute__ ((__always_inline__))
++vuzp2_s32 (int32x2_t __a, int32x2_t __b)
++{
++#ifdef __AARCH64EB__
++ return __builtin_shuffle (__a, __b, (uint32x2_t) {2, 0});
++#else
++ return __builtin_shuffle (__a, __b, (uint32x2_t) {1, 3});
++#endif
++}
++
++__extension__ static __inline uint8x8_t __attribute__ ((__always_inline__))
++vuzp2_u8 (uint8x8_t __a, uint8x8_t __b)
++{
++#ifdef __AARCH64EB__
++ return __builtin_shuffle (__a, __b, (uint8x8_t) {8, 10, 12, 14, 0, 2, 4, 6});
++#else
++ return __builtin_shuffle (__a, __b, (uint8x8_t) {1, 3, 5, 7, 9, 11, 13, 15});
++#endif
++}
++
++__extension__ static __inline uint16x4_t __attribute__ ((__always_inline__))
++vuzp2_u16 (uint16x4_t __a, uint16x4_t __b)
++{
++#ifdef __AARCH64EB__
++ return __builtin_shuffle (__a, __b, (uint16x4_t) {4, 6, 0, 2});
++#else
++ return __builtin_shuffle (__a, __b, (uint16x4_t) {1, 3, 5, 7});
++#endif
++}
++
++__extension__ static __inline uint32x2_t __attribute__ ((__always_inline__))
++vuzp2_u32 (uint32x2_t __a, uint32x2_t __b)
++{
++#ifdef __AARCH64EB__
++ return __builtin_shuffle (__a, __b, (uint32x2_t) {2, 0});
++#else
++ return __builtin_shuffle (__a, __b, (uint32x2_t) {1, 3});
++#endif
++}
++
++__extension__ static __inline float32x4_t __attribute__ ((__always_inline__))
++vuzp2q_f32 (float32x4_t __a, float32x4_t __b)
++{
++#ifdef __AARCH64EB__
++ return __builtin_shuffle (__a, __b, (uint32x4_t) {4, 6, 0, 2});
++#else
++ return __builtin_shuffle (__a, __b, (uint32x4_t) {1, 3, 5, 7});
++#endif
++}
++
++__extension__ static __inline float64x2_t __attribute__ ((__always_inline__))
++vuzp2q_f64 (float64x2_t __a, float64x2_t __b)
++{
++#ifdef __AARCH64EB__
++ return __builtin_shuffle (__a, __b, (uint64x2_t) {2, 0});
++#else
++ return __builtin_shuffle (__a, __b, (uint64x2_t) {1, 3});
++#endif
++}
++
++__extension__ static __inline poly8x16_t __attribute__ ((__always_inline__))
++vuzp2q_p8 (poly8x16_t __a, poly8x16_t __b)
++{
++#ifdef __AARCH64EB__
++ return __builtin_shuffle (__a, __b,
++ (uint8x16_t) {16, 18, 20, 22, 24, 26, 28, 30, 0, 2, 4, 6, 8, 10, 12, 14});
++#else
++ return __builtin_shuffle (__a, __b,
++ (uint8x16_t) {1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29, 31});
++#endif
++}
++
++__extension__ static __inline poly16x8_t __attribute__ ((__always_inline__))
++vuzp2q_p16 (poly16x8_t __a, poly16x8_t __b)
++{
++#ifdef __AARCH64EB__
++ return __builtin_shuffle (__a, __b, (uint16x8_t) {8, 10, 12, 14, 0, 2, 4, 6});
++#else
++ return __builtin_shuffle (__a, __b, (uint16x8_t) {1, 3, 5, 7, 9, 11, 13, 15});
++#endif
++}
++
++__extension__ static __inline int8x16_t __attribute__ ((__always_inline__))
++vuzp2q_s8 (int8x16_t __a, int8x16_t __b)
++{
++#ifdef __AARCH64EB__
++ return __builtin_shuffle (__a, __b,
++ (uint8x16_t) {16, 18, 20, 22, 24, 26, 28, 30, 0, 2, 4, 6, 8, 10, 12, 14});
++#else
++ return __builtin_shuffle (__a, __b,
++ (uint8x16_t) {1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29, 31});
++#endif
++}
++
++__extension__ static __inline int16x8_t __attribute__ ((__always_inline__))
++vuzp2q_s16 (int16x8_t __a, int16x8_t __b)
++{
++#ifdef __AARCH64EB__
++ return __builtin_shuffle (__a, __b, (uint16x8_t) {8, 10, 12, 14, 0, 2, 4, 6});
++#else
++ return __builtin_shuffle (__a, __b, (uint16x8_t) {1, 3, 5, 7, 9, 11, 13, 15});
++#endif
++}
++
++__extension__ static __inline int32x4_t __attribute__ ((__always_inline__))
++vuzp2q_s32 (int32x4_t __a, int32x4_t __b)
++{
++#ifdef __AARCH64EB__
++ return __builtin_shuffle (__a, __b, (uint32x4_t) {4, 6, 0, 2});
++#else
++ return __builtin_shuffle (__a, __b, (uint32x4_t) {1, 3, 5, 7});
++#endif
++}
++
++__extension__ static __inline int64x2_t __attribute__ ((__always_inline__))
++vuzp2q_s64 (int64x2_t __a, int64x2_t __b)
++{
++#ifdef __AARCH64EB__
++ return __builtin_shuffle (__a, __b, (uint64x2_t) {2, 0});
++#else
++ return __builtin_shuffle (__a, __b, (uint64x2_t) {1, 3});
++#endif
++}
++
++__extension__ static __inline uint8x16_t __attribute__ ((__always_inline__))
++vuzp2q_u8 (uint8x16_t __a, uint8x16_t __b)
++{
++#ifdef __AARCH64EB__
++ return __builtin_shuffle (__a, __b, (uint8x16_t)
++ {16, 18, 20, 22, 24, 26, 28, 30, 0, 2, 4, 6, 8, 10, 12, 14});
++#else
++ return __builtin_shuffle (__a, __b, (uint8x16_t)
++ {1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29, 31});
++#endif
++}
++
++__extension__ static __inline uint16x8_t __attribute__ ((__always_inline__))
++vuzp2q_u16 (uint16x8_t __a, uint16x8_t __b)
++{
++#ifdef __AARCH64EB__
++ return __builtin_shuffle (__a, __b, (uint16x8_t) {8, 10, 12, 14, 0, 2, 4, 6});
++#else
++ return __builtin_shuffle (__a, __b, (uint16x8_t) {1, 3, 5, 7, 9, 11, 13, 15});
++#endif
++}
++
++__extension__ static __inline uint32x4_t __attribute__ ((__always_inline__))
++vuzp2q_u32 (uint32x4_t __a, uint32x4_t __b)
++{
++#ifdef __AARCH64EB__
++ return __builtin_shuffle (__a, __b, (uint32x4_t) {4, 6, 0, 2});
++#else
++ return __builtin_shuffle (__a, __b, (uint32x4_t) {1, 3, 5, 7});
++#endif
++}
++
++__extension__ static __inline uint64x2_t __attribute__ ((__always_inline__))
++vuzp2q_u64 (uint64x2_t __a, uint64x2_t __b)
++{
++#ifdef __AARCH64EB__
++ return __builtin_shuffle (__a, __b, (uint64x2_t) {2, 0});
++#else
++ return __builtin_shuffle (__a, __b, (uint64x2_t) {1, 3});
++#endif
++}
++
+ __INTERLEAVE_LIST (uzp)
/* vzip */
@@ -9681,9 +23328,39 @@ LANG=C svn diff svn://gcc.gnu.org/svn/gcc/branches/gcc-4_9-branch@211979 \
__INTERLEAVE_LIST (zip)
#undef __INTERLEAVE_LIST
+--- a/src/gcc/config/aarch64/t-aarch64-linux
++++ b/src/gcc/config/aarch64/t-aarch64-linux
+@@ -22,10 +22,7 @@
+ LIB1ASMFUNCS = _aarch64_sync_cache_range
+
+ AARCH_BE = $(if $(findstring TARGET_BIG_ENDIAN_DEFAULT=1, $(tm_defines)),_be)
+-MULTILIB_OSDIRNAMES = .=../lib64$(call if_multiarch,:aarch64$(AARCH_BE)-linux-gnu)
++MULTILIB_OSDIRNAMES = mabi.lp64=../lib64$(call if_multiarch,:aarch64$(AARCH_BE)-linux-gnu)
+ MULTIARCH_DIRNAME = $(call if_multiarch,aarch64$(AARCH_BE)-linux-gnu)
+
+-# Disable the multilib for linux-gnu targets for the time being; focus
+-# on the baremetal targets.
+-MULTILIB_OPTIONS =
+-MULTILIB_DIRNAMES =
++MULTILIB_OSDIRNAMES += mabi.ilp32=../libilp32
--- a/src/gcc/config/aarch64/aarch64.md
+++ b/src/gcc/config/aarch64/aarch64.md
-@@ -98,11 +98,16 @@
+@@ -68,6 +68,14 @@
+ (define_c_enum "unspec" [
+ UNSPEC_CASESI
+ UNSPEC_CLS
++ UNSPEC_CRC32B
++ UNSPEC_CRC32CB
++ UNSPEC_CRC32CH
++ UNSPEC_CRC32CW
++ UNSPEC_CRC32CX
++ UNSPEC_CRC32H
++ UNSPEC_CRC32W
++ UNSPEC_CRC32X
+ UNSPEC_FRECPE
+ UNSPEC_FRECPS
+ UNSPEC_FRECPX
+@@ -98,15 +106,24 @@
UNSPEC_ST2
UNSPEC_ST3
UNSPEC_ST4
@@ -9700,7 +23377,150 @@ LANG=C svn diff svn://gcc.gnu.org/svn/gcc/branches/gcc-4_9-branch@211979 \
])
(define_c_enum "unspecv" [
-@@ -1106,7 +1111,26 @@
+ UNSPECV_EH_RETURN ; Represent EH_RETURN
++ UNSPECV_GET_FPCR ; Represent fetch of FPCR content.
++ UNSPECV_SET_FPCR ; Represent assign of FPCR content.
++ UNSPECV_GET_FPSR ; Represent fetch of FPSR content.
++ UNSPECV_SET_FPSR ; Represent assign of FPSR content.
+ ]
+ )
+
+@@ -514,6 +531,10 @@
+ (use (match_operand 2 "" ""))])]
+ ""
+ {
++ if (!REG_P (XEXP (operands[0], 0))
++ && (GET_CODE (XEXP (operands[0], 0)) != SYMBOL_REF))
++ XEXP (operands[0], 0) = force_reg (Pmode, XEXP (operands[0], 0));
++
+ if (operands[2] == NULL_RTX)
+ operands[2] = const0_rtx;
+ }
+@@ -527,6 +548,10 @@
+ (use (match_operand 3 "" ""))])]
+ ""
+ {
++ if (!REG_P (XEXP (operands[1], 0))
++ && (GET_CODE (XEXP (operands[1], 0)) != SYMBOL_REF))
++ XEXP (operands[1], 0) = force_reg (Pmode, XEXP (operands[1], 0));
++
+ if (operands[3] == NULL_RTX)
+ operands[3] = const0_rtx;
+ }
+@@ -533,25 +558,28 @@
+ )
+
+ (define_insn "*sibcall_insn"
+- [(call (mem:DI (match_operand:DI 0 "" "X"))
++ [(call (mem:DI (match_operand:DI 0 "aarch64_call_insn_operand" "Ucs, Usf"))
+ (match_operand 1 "" ""))
+ (return)
+ (use (match_operand 2 "" ""))]
+- "GET_CODE (operands[0]) == SYMBOL_REF"
+- "b\\t%a0"
+- [(set_attr "type" "branch")]
+-
++ "SIBLING_CALL_P (insn)"
++ "@
++ br\\t%0
++ b\\t%a0"
++ [(set_attr "type" "branch, branch")]
+ )
+
+ (define_insn "*sibcall_value_insn"
+ [(set (match_operand 0 "" "")
+- (call (mem:DI (match_operand 1 "" "X"))
++ (call (mem:DI (match_operand 1 "aarch64_call_insn_operand" "Ucs, Usf"))
+ (match_operand 2 "" "")))
+ (return)
+ (use (match_operand 3 "" ""))]
+- "GET_CODE (operands[1]) == SYMBOL_REF"
+- "b\\t%a1"
+- [(set_attr "type" "branch")]
++ "SIBLING_CALL_P (insn)"
++ "@
++ br\\t%1
++ b\\t%a1"
++ [(set_attr "type" "branch, branch")]
+ )
+
+ ;; Call subroutine returning any type.
+@@ -669,7 +697,7 @@
+ fmov\\t%w0, %s1
+ fmov\\t%s0, %s1"
+ [(set_attr "type" "mov_reg,mov_reg,mov_reg,mov_imm,load1,load1,store1,store1,\
+- adr,adr,fmov,fmov,fmov")
++ adr,adr,f_mcr,f_mrc,fmov")
+ (set_attr "fp" "*,*,*,*,*,yes,*,yes,*,*,yes,yes,yes")]
+ )
+
+@@ -694,7 +722,7 @@
+ fmov\\t%d0, %d1
+ movi\\t%d0, %1"
+ [(set_attr "type" "mov_reg,mov_reg,mov_reg,mov_imm,load1,load1,store1,store1,\
+- adr,adr,fmov,fmov,fmov,fmov")
++ adr,adr,f_mcr,f_mrc,fmov,fmov")
+ (set_attr "fp" "*,*,*,*,*,yes,*,yes,*,*,yes,yes,yes,*")
+ (set_attr "simd" "*,*,*,*,*,*,*,*,*,*,*,*,*,yes")]
+ )
+@@ -789,7 +817,7 @@
+ str\\t%w1, %0
+ mov\\t%w0, %w1"
+ [(set_attr "type" "f_mcr,f_mrc,fmov,fconsts,\
+- f_loads,f_stores,f_loads,f_stores,fmov")]
++ f_loads,f_stores,f_loads,f_stores,mov_reg")]
+ )
+
+ (define_insn "*movdf_aarch64"
+@@ -863,6 +891,24 @@
+ }
+ )
+
++;; 0 is dst
++;; 1 is src
++;; 2 is size of move in bytes
++;; 3 is alignment
++
++(define_expand "movmemdi"
++ [(match_operand:BLK 0 "memory_operand")
++ (match_operand:BLK 1 "memory_operand")
++ (match_operand:DI 2 "immediate_operand")
++ (match_operand:DI 3 "immediate_operand")]
++ "!STRICT_ALIGNMENT"
++{
++ if (aarch64_expand_movmem (operands))
++ DONE;
++ FAIL;
++}
++)
++
+ ;; Operands 1 and 3 are tied together by the final condition; so we allow
+ ;; fairly lax checking on the second memory operation.
+ (define_insn "load_pair<mode>"
+@@ -1063,16 +1109,18 @@
+
+ (define_insn "*addsi3_aarch64"
+ [(set
+- (match_operand:SI 0 "register_operand" "=rk,rk,rk")
++ (match_operand:SI 0 "register_operand" "=rk,rk,w,rk")
+ (plus:SI
+- (match_operand:SI 1 "register_operand" "%rk,rk,rk")
+- (match_operand:SI 2 "aarch64_plus_operand" "I,r,J")))]
++ (match_operand:SI 1 "register_operand" "%rk,rk,w,rk")
++ (match_operand:SI 2 "aarch64_plus_operand" "I,r,w,J")))]
+ ""
+ "@
+ add\\t%w0, %w1, %2
+ add\\t%w0, %w1, %w2
++ add\\t%0.2s, %1.2s, %2.2s
+ sub\\t%w0, %w1, #%n2"
+- [(set_attr "type" "alu_imm,alu_reg,alu_imm")]
++ [(set_attr "type" "alu_imm,alu_reg,neon_add,alu_imm")
++ (set_attr "simd" "*,*,yes,*")]
+ )
+
+ ;; zero_extend version of above
+@@ -1106,7 +1154,26 @@
(set_attr "simd" "*,*,*,yes")]
)
@@ -9728,7 +23548,7 @@ LANG=C svn diff svn://gcc.gnu.org/svn/gcc/branches/gcc-4_9-branch@211979 \
[(set (reg:CC_NZ CC_REGNUM)
(compare:CC_NZ
(plus:GPI (match_operand:GPI 1 "register_operand" "%r,r,r")
-@@ -1390,7 +1414,7 @@
+@@ -1390,7 +1457,7 @@
[(set_attr "type" "alu_ext")]
)
@@ -9737,7 +23557,7 @@ LANG=C svn diff svn://gcc.gnu.org/svn/gcc/branches/gcc-4_9-branch@211979 \
[(set
(match_operand:GPI 0 "register_operand" "=r")
(plus:GPI (geu:GPI (reg:CC CC_REGNUM) (const_int 0))
-@@ -1558,8 +1582,26 @@
+@@ -1558,8 +1625,26 @@
(set_attr "simd" "*,yes")]
)
@@ -9765,7 +23585,7 @@ LANG=C svn diff svn://gcc.gnu.org/svn/gcc/branches/gcc-4_9-branch@211979 \
[(set (reg:CC_NZ CC_REGNUM)
(compare:CC_NZ (minus:GPI (match_operand:GPI 1 "register_operand" "r")
(match_operand:GPI 2 "register_operand" "r"))
-@@ -1706,7 +1748,7 @@
+@@ -1706,7 +1791,7 @@
[(set_attr "type" "alu_ext")]
)
@@ -9774,7 +23594,7 @@ LANG=C svn diff svn://gcc.gnu.org/svn/gcc/branches/gcc-4_9-branch@211979 \
[(set
(match_operand:GPI 0 "register_operand" "=r")
(minus:GPI (minus:GPI
-@@ -1935,7 +1977,7 @@
+@@ -1935,7 +2020,7 @@
[(set_attr "type" "mul")]
)
@@ -9783,7 +23603,7 @@ LANG=C svn diff svn://gcc.gnu.org/svn/gcc/branches/gcc-4_9-branch@211979 \
[(set (match_operand:GPI 0 "register_operand" "=r")
(plus:GPI (mult:GPI (match_operand:GPI 1 "register_operand" "r")
(match_operand:GPI 2 "register_operand" "r"))
-@@ -2045,6 +2087,48 @@
+@@ -2045,6 +2130,48 @@
[(set_attr "type" "<su>mull")]
)
@@ -9832,7 +23652,7 @@ LANG=C svn diff svn://gcc.gnu.org/svn/gcc/branches/gcc-4_9-branch@211979 \
(define_insn "<su>muldi3_highpart"
[(set (match_operand:DI 0 "register_operand" "=r")
(truncate:DI
-@@ -2345,6 +2429,25 @@
+@@ -2345,6 +2472,42 @@
}
)
@@ -9855,10 +23675,27 @@ LANG=C svn diff svn://gcc.gnu.org/svn/gcc/branches/gcc-4_9-branch@211979 \
+ }
+)
+
++
++;; CRC32 instructions.
++(define_insn "aarch64_<crc_variant>"
++ [(set (match_operand:SI 0 "register_operand" "=r")
++ (unspec:SI [(match_operand:SI 1 "register_operand" "r")
++ (match_operand:<crc_mode> 2 "register_operand" "r")]
++ CRC))]
++ "TARGET_CRC32"
++ {
++ if (GET_MODE_BITSIZE (GET_MODE (operands[2])) >= 64)
++ return "<crc_variant>\\t%w0, %w1, %x2";
++ else
++ return "<crc_variant>\\t%w0, %w1, %w2";
++ }
++ [(set_attr "type" "crc")]
++)
++
(define_insn "*csinc2<mode>_insn"
[(set (match_operand:GPI 0 "register_operand" "=r")
(plus:GPI (match_operator:GPI 2 "aarch64_comparison_operator"
-@@ -2486,7 +2589,18 @@
+@@ -2486,7 +2649,18 @@
[(set_attr "type" "logic_shift_imm")]
)
@@ -9878,7 +23715,7 @@ LANG=C svn diff svn://gcc.gnu.org/svn/gcc/branches/gcc-4_9-branch@211979 \
(define_insn "*<LOGICAL:optab>_<SHIFT:optab>si3_uxtw"
[(set (match_operand:DI 0 "register_operand" "=r")
(zero_extend:DI
-@@ -2499,6 +2613,18 @@
+@@ -2499,6 +2673,18 @@
[(set_attr "type" "logic_shift_imm")]
)
@@ -9897,7 +23734,7 @@ LANG=C svn diff svn://gcc.gnu.org/svn/gcc/branches/gcc-4_9-branch@211979 \
(define_insn "one_cmpl<mode>2"
[(set (match_operand:GPI 0 "register_operand" "=r")
(not:GPI (match_operand:GPI 1 "register_operand" "r")))]
-@@ -3174,6 +3300,38 @@
+@@ -3179,6 +3365,38 @@
[(set_attr "type" "rev")]
)
@@ -9936,7 +23773,7 @@ LANG=C svn diff svn://gcc.gnu.org/svn/gcc/branches/gcc-4_9-branch@211979 \
;; zero_extend version of above
(define_insn "*bswapsi2_uxtw"
[(set (match_operand:DI 0 "register_operand" "=r")
-@@ -3188,7 +3346,7 @@
+@@ -3193,7 +3411,7 @@
;; -------------------------------------------------------------------
;; frint floating-point round to integral standard patterns.
@@ -9945,7 +23782,16 @@ LANG=C svn diff svn://gcc.gnu.org/svn/gcc/branches/gcc-4_9-branch@211979 \
(define_insn "<frint_pattern><mode>2"
[(set (match_operand:GPF 0 "register_operand" "=w")
-@@ -3582,36 +3740,63 @@
+@@ -3489,7 +3707,7 @@
+ (truncate:DI (match_operand:TI 1 "register_operand" "w"))))]
+ "reload_completed || reload_in_progress"
+ "fmov\\t%d0, %d1"
+- [(set_attr "type" "f_mcr")
++ [(set_attr "type" "fmov")
+ (set_attr "length" "4")
+ ])
+
+@@ -3587,36 +3805,63 @@
[(set_attr "type" "call")
(set_attr "length" "16")])
@@ -10021,7 +23867,7 @@ LANG=C svn diff svn://gcc.gnu.org/svn/gcc/branches/gcc-4_9-branch@211979 \
[(set_attr "type" "call")
(set_attr "length" "16")])
-@@ -3636,6 +3821,67 @@
+@@ -3641,6 +3886,98 @@
DONE;
})
@@ -10045,7 +23891,7 @@ LANG=C svn diff svn://gcc.gnu.org/svn/gcc/branches/gcc-4_9-branch@211979 \
+ UNSPEC_SP_SET))
+ (set (match_scratch:PTR 2 "=&r") (const_int 0))]
+ ""
-+ "ldr\\t%x2, %1\;str\\t%x2, %0\;mov\t%x2,0"
++ "ldr\\t%<w>2, %1\;str\\t%<w>2, %0\;mov\t%<w>2,0"
+ [(set_attr "length" "12")
+ (set_attr "type" "multiple")])
+
@@ -10055,11 +23901,11 @@ LANG=C svn diff svn://gcc.gnu.org/svn/gcc/branches/gcc-4_9-branch@211979 \
+ (match_operand 2)]
+ ""
+{
-+
-+ rtx result = gen_reg_rtx (Pmode);
-+
++ rtx result;
+ enum machine_mode mode = GET_MODE (operands[0]);
+
++ result = gen_reg_rtx(mode);
++
+ emit_insn ((mode == DImode
+ ? gen_stack_protect_test_di
+ : gen_stack_protect_test_si) (result,
@@ -10082,16 +23928,140 @@ LANG=C svn diff svn://gcc.gnu.org/svn/gcc/branches/gcc-4_9-branch@211979 \
+ UNSPEC_SP_TEST))
+ (clobber (match_scratch:PTR 3 "=&r"))]
+ ""
-+ "ldr\t%x3, %x1\;ldr\t%x0, %x2\;eor\t%x0, %x3, %x0"
++ "ldr\t%<w>3, %x1\;ldr\t%<w>0, %x2\;eor\t%<w>0, %<w>3, %<w>0"
+ [(set_attr "length" "12")
+ (set_attr "type" "multiple")])
+
++;; Write Floating-point Control Register.
++(define_insn "set_fpcr"
++ [(unspec_volatile [(match_operand:SI 0 "register_operand" "r")] UNSPECV_SET_FPCR)]
++ ""
++ "msr\\tfpcr, %0\;isb"
++ [(set_attr "type" "mrs")])
++
++;; Read Floating-point Control Register.
++(define_insn "get_fpcr"
++ [(set (match_operand:SI 0 "register_operand" "=r")
++ (unspec_volatile:SI [(const_int 0)] UNSPECV_GET_FPCR))]
++ ""
++ "mrs\\t%0, fpcr"
++ [(set_attr "type" "mrs")])
++
++;; Write Floating-point Status Register.
++(define_insn "set_fpsr"
++ [(unspec_volatile [(match_operand:SI 0 "register_operand" "r")] UNSPECV_SET_FPSR)]
++ ""
++ "msr\\tfpsr, %0"
++ [(set_attr "type" "mrs")])
++
++;; Read Floating-point Status Register.
++(define_insn "get_fpsr"
++ [(set (match_operand:SI 0 "register_operand" "=r")
++ (unspec_volatile:SI [(const_int 0)] UNSPECV_GET_FPSR))]
++ ""
++ "mrs\\t%0, fpsr"
++ [(set_attr "type" "mrs")])
++
++
;; AdvSIMD Stuff
(include "aarch64-simd.md")
+--- a/src/gcc/config/aarch64/arm_acle.h
++++ b/src/gcc/config/aarch64/arm_acle.h
+@@ -0,0 +1,90 @@
++/* AArch64 Non-NEON ACLE intrinsics include file.
++
++ Copyright (C) 2014 Free Software Foundation, Inc.
++ Contributed by ARM Ltd.
++
++ This file is part of GCC.
++
++ GCC is free software; you can redistribute it and/or modify it
++ under the terms of the GNU General Public License as published
++ by the Free Software Foundation; either version 3, or (at your
++ option) any later version.
++
++ GCC is distributed in the hope that it will be useful, but WITHOUT
++ ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
++ or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
++ License for more details.
++
++ Under Section 7 of GPL version 3, you are granted additional
++ permissions described in the GCC Runtime Library Exception, version
++ 3.1, as published by the Free Software Foundation.
++
++ You should have received a copy of the GNU General Public License and
++ a copy of the GCC Runtime Library Exception along with this program;
++ see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
++ <http://www.gnu.org/licenses/>. */
++
++#ifndef _GCC_ARM_ACLE_H
++#define _GCC_ARM_ACLE_H
++
++#include <stdint.h>
++#ifdef __cplusplus
++extern "C" {
++#endif
++
++#ifdef __ARM_FEATURE_CRC32
++__extension__ static __inline uint32_t __attribute__ ((__always_inline__))
++__crc32b (uint32_t __a, uint8_t __b)
++{
++ return __builtin_aarch64_crc32b (__a, __b);
++}
++
++__extension__ static __inline uint32_t __attribute__ ((__always_inline__))
++__crc32cb (uint32_t __a, uint8_t __b)
++{
++ return __builtin_aarch64_crc32cb (__a, __b);
++}
++
++__extension__ static __inline uint32_t __attribute__ ((__always_inline__))
++__crc32ch (uint32_t __a, uint16_t __b)
++{
++ return __builtin_aarch64_crc32ch (__a, __b);
++}
++
++__extension__ static __inline uint32_t __attribute__ ((__always_inline__))
++__crc32cw (uint32_t __a, uint32_t __b)
++{
++ return __builtin_aarch64_crc32cw (__a, __b);
++}
++
++__extension__ static __inline uint32_t __attribute__ ((__always_inline__))
++__crc32cd (uint32_t __a, uint64_t __b)
++{
++ return __builtin_aarch64_crc32cx (__a, __b);
++}
++
++__extension__ static __inline uint32_t __attribute__ ((__always_inline__))
++__crc32h (uint32_t __a, uint16_t __b)
++{
++ return __builtin_aarch64_crc32h (__a, __b);
++}
++
++__extension__ static __inline uint32_t __attribute__ ((__always_inline__))
++__crc32w (uint32_t __a, uint32_t __b)
++{
++ return __builtin_aarch64_crc32w (__a, __b);
++}
++
++__extension__ static __inline uint32_t __attribute__ ((__always_inline__))
++__crc32d (uint32_t __a, uint64_t __b)
++{
++ return __builtin_aarch64_crc32x (__a, __b);
++}
++
++#endif
++
++#ifdef __cplusplus
++}
++#endif
++
++#endif
--- a/src/gcc/config/aarch64/aarch64-builtins.c
+++ b/src/gcc/config/aarch64/aarch64-builtins.c
-@@ -147,8 +147,24 @@
+@@ -147,16 +147,44 @@
= { qualifier_unsigned, qualifier_unsigned };
#define TYPES_UNOPU (aarch64_types_unopu_qualifiers)
#define TYPES_CREATE (aarch64_types_unop_qualifiers)
@@ -10117,7 +24087,56 @@ LANG=C svn diff svn://gcc.gnu.org/svn/gcc/branches/gcc-4_9-branch@211979 \
aarch64_types_binop_qualifiers[SIMD_MAX_BUILTIN_ARGS]
= { qualifier_none, qualifier_none, qualifier_maybe_immediate };
#define TYPES_BINOP (aarch64_types_binop_qualifiers)
-@@ -230,6 +246,11 @@
+ static enum aarch64_type_qualifiers
++aarch64_types_binopv_qualifiers[SIMD_MAX_BUILTIN_ARGS]
++ = { qualifier_void, qualifier_none, qualifier_none };
++#define TYPES_BINOPV (aarch64_types_binopv_qualifiers)
++static enum aarch64_type_qualifiers
+ aarch64_types_binopu_qualifiers[SIMD_MAX_BUILTIN_ARGS]
+ = { qualifier_unsigned, qualifier_unsigned, qualifier_unsigned };
+ #define TYPES_BINOPU (aarch64_types_binopu_qualifiers)
+ static enum aarch64_type_qualifiers
++aarch64_types_binop_uus_qualifiers[SIMD_MAX_BUILTIN_ARGS]
++ = { qualifier_unsigned, qualifier_unsigned, qualifier_none };
++#define TYPES_BINOP_UUS (aarch64_types_binop_uus_qualifiers)
++static enum aarch64_type_qualifiers
++aarch64_types_binop_ssu_qualifiers[SIMD_MAX_BUILTIN_ARGS]
++ = { qualifier_none, qualifier_none, qualifier_unsigned };
++#define TYPES_BINOP_SSU (aarch64_types_binop_ssu_qualifiers)
++static enum aarch64_type_qualifiers
+ aarch64_types_binopp_qualifiers[SIMD_MAX_BUILTIN_ARGS]
+ = { qualifier_poly, qualifier_poly, qualifier_poly };
+ #define TYPES_BINOPP (aarch64_types_binopp_qualifiers)
+@@ -183,9 +211,14 @@
+ #define TYPES_GETLANE (aarch64_types_getlane_qualifiers)
+ #define TYPES_SHIFTIMM (aarch64_types_getlane_qualifiers)
+ static enum aarch64_type_qualifiers
++aarch64_types_shift_to_unsigned_qualifiers[SIMD_MAX_BUILTIN_ARGS]
++ = { qualifier_unsigned, qualifier_none, qualifier_immediate };
++#define TYPES_SHIFTIMM_USS (aarch64_types_shift_to_unsigned_qualifiers)
++static enum aarch64_type_qualifiers
+ aarch64_types_unsigned_shift_qualifiers[SIMD_MAX_BUILTIN_ARGS]
+ = { qualifier_unsigned, qualifier_unsigned, qualifier_immediate };
+ #define TYPES_USHIFTIMM (aarch64_types_unsigned_shift_qualifiers)
++
+ static enum aarch64_type_qualifiers
+ aarch64_types_setlane_qualifiers[SIMD_MAX_BUILTIN_ARGS]
+ = { qualifier_none, qualifier_none, qualifier_none, qualifier_immediate };
+@@ -194,6 +227,13 @@
+ #define TYPES_SHIFTACC (aarch64_types_setlane_qualifiers)
+
+ static enum aarch64_type_qualifiers
++aarch64_types_unsigned_shiftacc_qualifiers[SIMD_MAX_BUILTIN_ARGS]
++ = { qualifier_unsigned, qualifier_unsigned, qualifier_unsigned,
++ qualifier_immediate };
++#define TYPES_USHIFTACC (aarch64_types_unsigned_shiftacc_qualifiers)
++
++
++static enum aarch64_type_qualifiers
+ aarch64_types_combine_qualifiers[SIMD_MAX_BUILTIN_ARGS]
+ = { qualifier_none, qualifier_none, qualifier_none };
+ #define TYPES_COMBINE (aarch64_types_combine_qualifiers)
+@@ -230,6 +270,11 @@
= { qualifier_void, qualifier_pointer_map_mode, qualifier_none };
#define TYPES_STORE1 (aarch64_types_store1_qualifiers)
#define TYPES_STORESTRUCT (aarch64_types_store1_qualifiers)
@@ -10129,7 +24148,7 @@ LANG=C svn diff svn://gcc.gnu.org/svn/gcc/branches/gcc-4_9-branch@211979 \
#define CF0(N, X) CODE_FOR_aarch64_##N##X
#define CF1(N, X) CODE_FOR_##N##X##1
-@@ -311,6 +332,8 @@
+@@ -311,6 +356,8 @@
VAR7 (T, N, MAP, v8qi, v16qi, v4hi, v8hi, v2si, v4si, v2di)
#define BUILTIN_VDQF(T, N, MAP) \
VAR3 (T, N, MAP, v2sf, v4sf, v2df)
@@ -10138,7 +24157,204 @@ LANG=C svn diff svn://gcc.gnu.org/svn/gcc/branches/gcc-4_9-branch@211979 \
#define BUILTIN_VDQH(T, N, MAP) \
VAR2 (T, N, MAP, v4hi, v8hi)
#define BUILTIN_VDQHS(T, N, MAP) \
-@@ -1086,7 +1109,29 @@
+@@ -364,6 +411,28 @@
+ #include "aarch64-simd-builtins.def"
+ };
+
++/* There's only 8 CRC32 builtins. Probably not worth their own .def file. */
++#define AARCH64_CRC32_BUILTINS \
++ CRC32_BUILTIN (crc32b, QI) \
++ CRC32_BUILTIN (crc32h, HI) \
++ CRC32_BUILTIN (crc32w, SI) \
++ CRC32_BUILTIN (crc32x, DI) \
++ CRC32_BUILTIN (crc32cb, QI) \
++ CRC32_BUILTIN (crc32ch, HI) \
++ CRC32_BUILTIN (crc32cw, SI) \
++ CRC32_BUILTIN (crc32cx, DI)
++
++typedef struct
++{
++ const char *name;
++ enum machine_mode mode;
++ const enum insn_code icode;
++ unsigned int fcode;
++} aarch64_crc_builtin_datum;
++
++#define CRC32_BUILTIN(N, M) \
++ AARCH64_BUILTIN_##N,
++
+ #undef VAR1
+ #define VAR1(T, N, MAP, A) \
+ AARCH64_SIMD_BUILTIN_##T##_##N##A,
+@@ -371,13 +440,32 @@
+ enum aarch64_builtins
+ {
+ AARCH64_BUILTIN_MIN,
++
++ AARCH64_BUILTIN_GET_FPCR,
++ AARCH64_BUILTIN_SET_FPCR,
++ AARCH64_BUILTIN_GET_FPSR,
++ AARCH64_BUILTIN_SET_FPSR,
++
+ AARCH64_SIMD_BUILTIN_BASE,
+ #include "aarch64-simd-builtins.def"
+ AARCH64_SIMD_BUILTIN_MAX = AARCH64_SIMD_BUILTIN_BASE
+ + ARRAY_SIZE (aarch64_simd_builtin_data),
++ AARCH64_CRC32_BUILTIN_BASE,
++ AARCH64_CRC32_BUILTINS
++ AARCH64_CRC32_BUILTIN_MAX,
+ AARCH64_BUILTIN_MAX
+ };
+
++#undef CRC32_BUILTIN
++#define CRC32_BUILTIN(N, M) \
++ {"__builtin_aarch64_"#N, M##mode, CODE_FOR_aarch64_##N, AARCH64_BUILTIN_##N},
++
++static aarch64_crc_builtin_datum aarch64_crc_builtin_data[] = {
++ AARCH64_CRC32_BUILTINS
++};
++
++#undef CRC32_BUILTIN
++
+ static GTY(()) tree aarch64_builtin_decls[AARCH64_BUILTIN_MAX];
+
+ #define NUM_DREG_TYPES 6
+@@ -749,11 +837,49 @@
+ }
+ }
+
++static void
++aarch64_init_crc32_builtins ()
++{
++ tree usi_type = aarch64_build_unsigned_type (SImode);
++ unsigned int i = 0;
++
++ for (i = 0; i < ARRAY_SIZE (aarch64_crc_builtin_data); ++i)
++ {
++ aarch64_crc_builtin_datum* d = &aarch64_crc_builtin_data[i];
++ tree argtype = aarch64_build_unsigned_type (d->mode);
++ tree ftype = build_function_type_list (usi_type, usi_type, argtype, NULL_TREE);
++ tree fndecl = add_builtin_function (d->name, ftype, d->fcode,
++ BUILT_IN_MD, NULL, NULL_TREE);
++
++ aarch64_builtin_decls[d->fcode] = fndecl;
++ }
++}
++
+ void
+ aarch64_init_builtins (void)
+ {
++ tree ftype_set_fpr
++ = build_function_type_list (void_type_node, unsigned_type_node, NULL);
++ tree ftype_get_fpr
++ = build_function_type_list (unsigned_type_node, NULL);
++
++ aarch64_builtin_decls[AARCH64_BUILTIN_GET_FPCR]
++ = add_builtin_function ("__builtin_aarch64_get_fpcr", ftype_get_fpr,
++ AARCH64_BUILTIN_GET_FPCR, BUILT_IN_MD, NULL, NULL_TREE);
++ aarch64_builtin_decls[AARCH64_BUILTIN_SET_FPCR]
++ = add_builtin_function ("__builtin_aarch64_set_fpcr", ftype_set_fpr,
++ AARCH64_BUILTIN_SET_FPCR, BUILT_IN_MD, NULL, NULL_TREE);
++ aarch64_builtin_decls[AARCH64_BUILTIN_GET_FPSR]
++ = add_builtin_function ("__builtin_aarch64_get_fpsr", ftype_get_fpr,
++ AARCH64_BUILTIN_GET_FPSR, BUILT_IN_MD, NULL, NULL_TREE);
++ aarch64_builtin_decls[AARCH64_BUILTIN_SET_FPSR]
++ = add_builtin_function ("__builtin_aarch64_set_fpsr", ftype_set_fpr,
++ AARCH64_BUILTIN_SET_FPSR, BUILT_IN_MD, NULL, NULL_TREE);
++
+ if (TARGET_SIMD)
+ aarch64_init_simd_builtins ();
++ if (TARGET_CRC32)
++ aarch64_init_crc32_builtins ();
+ }
+
+ tree
+@@ -953,6 +1079,41 @@
+ SIMD_ARG_STOP);
+ }
+
++rtx
++aarch64_crc32_expand_builtin (int fcode, tree exp, rtx target)
++{
++ rtx pat;
++ aarch64_crc_builtin_datum *d
++ = &aarch64_crc_builtin_data[fcode - (AARCH64_CRC32_BUILTIN_BASE + 1)];
++ enum insn_code icode = d->icode;
++ tree arg0 = CALL_EXPR_ARG (exp, 0);
++ tree arg1 = CALL_EXPR_ARG (exp, 1);
++ rtx op0 = expand_normal (arg0);
++ rtx op1 = expand_normal (arg1);
++ enum machine_mode tmode = insn_data[icode].operand[0].mode;
++ enum machine_mode mode0 = insn_data[icode].operand[1].mode;
++ enum machine_mode mode1 = insn_data[icode].operand[2].mode;
++
++ if (! target
++ || GET_MODE (target) != tmode
++ || ! (*insn_data[icode].operand[0].predicate) (target, tmode))
++ target = gen_reg_rtx (tmode);
++
++ gcc_assert ((GET_MODE (op0) == mode0 || GET_MODE (op0) == VOIDmode)
++ && (GET_MODE (op1) == mode1 || GET_MODE (op1) == VOIDmode));
++
++ if (! (*insn_data[icode].operand[1].predicate) (op0, mode0))
++ op0 = copy_to_mode_reg (mode0, op0);
++ if (! (*insn_data[icode].operand[2].predicate) (op1, mode1))
++ op1 = copy_to_mode_reg (mode1, op1);
++
++ pat = GEN_FCN (icode) (target, op0, op1);
++ if (! pat)
++ return 0;
++ emit_insn (pat);
++ return target;
++}
++
+ /* Expand an expression EXP that calls a built-in function,
+ with result going to TARGET if that's convenient. */
+ rtx
+@@ -964,9 +1125,41 @@
+ {
+ tree fndecl = TREE_OPERAND (CALL_EXPR_FN (exp), 0);
+ int fcode = DECL_FUNCTION_CODE (fndecl);
++ int icode;
++ rtx pat, op0;
++ tree arg0;
+
+- if (fcode >= AARCH64_SIMD_BUILTIN_BASE)
++ switch (fcode)
++ {
++ case AARCH64_BUILTIN_GET_FPCR:
++ case AARCH64_BUILTIN_SET_FPCR:
++ case AARCH64_BUILTIN_GET_FPSR:
++ case AARCH64_BUILTIN_SET_FPSR:
++ if ((fcode == AARCH64_BUILTIN_GET_FPCR)
++ || (fcode == AARCH64_BUILTIN_GET_FPSR))
++ {
++ icode = (fcode == AARCH64_BUILTIN_GET_FPSR) ?
++ CODE_FOR_get_fpsr : CODE_FOR_get_fpcr;
++ target = gen_reg_rtx (SImode);
++ pat = GEN_FCN (icode) (target);
++ }
++ else
++ {
++ target = NULL_RTX;
++ icode = (fcode == AARCH64_BUILTIN_SET_FPSR) ?
++ CODE_FOR_set_fpsr : CODE_FOR_set_fpcr;
++ arg0 = CALL_EXPR_ARG (exp, 0);
++ op0 = expand_normal (arg0);
++ pat = GEN_FCN (icode) (op0);
++ }
++ emit_insn (pat);
++ return target;
++ }
++
++ if (fcode >= AARCH64_SIMD_BUILTIN_BASE && fcode <= AARCH64_SIMD_BUILTIN_MAX)
+ return aarch64_simd_expand_builtin (fcode, exp, target);
++ else if (fcode >= AARCH64_CRC32_BUILTIN_BASE && fcode <= AARCH64_CRC32_BUILTIN_MAX)
++ return aarch64_crc32_expand_builtin (fcode, exp, target);
+
+ return NULL_RTX;
+ }
+@@ -1086,7 +1279,29 @@
return aarch64_builtin_decls[builtin];
}
@@ -10169,7 +24385,7 @@ LANG=C svn diff svn://gcc.gnu.org/svn/gcc/branches/gcc-4_9-branch@211979 \
default:
return NULL_TREE;
}
-@@ -1127,6 +1172,25 @@
+@@ -1127,6 +1342,25 @@
return fold_build2 (NE_EXPR, type, and_node, vec_zero_node);
break;
}
@@ -10195,6 +24411,113 @@ LANG=C svn diff svn://gcc.gnu.org/svn/gcc/branches/gcc-4_9-branch@211979 \
VAR1 (UNOP, floatv2si, 2, v2sf)
VAR1 (UNOP, floatv4si, 2, v4sf)
VAR1 (UNOP, floatv2di, 2, v2df)
+@@ -1196,6 +1430,106 @@
+ return changed;
+ }
+
++void
++aarch64_atomic_assign_expand_fenv (tree *hold, tree *clear, tree *update)
++{
++ const unsigned AARCH64_FE_INVALID = 1;
++ const unsigned AARCH64_FE_DIVBYZERO = 2;
++ const unsigned AARCH64_FE_OVERFLOW = 4;
++ const unsigned AARCH64_FE_UNDERFLOW = 8;
++ const unsigned AARCH64_FE_INEXACT = 16;
++ const unsigned HOST_WIDE_INT AARCH64_FE_ALL_EXCEPT = (AARCH64_FE_INVALID
++ | AARCH64_FE_DIVBYZERO
++ | AARCH64_FE_OVERFLOW
++ | AARCH64_FE_UNDERFLOW
++ | AARCH64_FE_INEXACT);
++ const unsigned HOST_WIDE_INT AARCH64_FE_EXCEPT_SHIFT = 8;
++ tree fenv_cr, fenv_sr, get_fpcr, set_fpcr, mask_cr, mask_sr;
++ tree ld_fenv_cr, ld_fenv_sr, masked_fenv_cr, masked_fenv_sr, hold_fnclex_cr;
++ tree hold_fnclex_sr, new_fenv_var, reload_fenv, restore_fnenv, get_fpsr, set_fpsr;
++ tree update_call, atomic_feraiseexcept, hold_fnclex, masked_fenv, ld_fenv;
++
++ /* Generate the equivalence of :
++ unsigned int fenv_cr;
++ fenv_cr = __builtin_aarch64_get_fpcr ();
++
++ unsigned int fenv_sr;
++ fenv_sr = __builtin_aarch64_get_fpsr ();
++
++ Now set all exceptions to non-stop
++ unsigned int mask_cr
++ = ~(AARCH64_FE_ALL_EXCEPT << AARCH64_FE_EXCEPT_SHIFT);
++ unsigned int masked_cr;
++ masked_cr = fenv_cr & mask_cr;
++
++ And clear all exception flags
++ unsigned int maske_sr = ~AARCH64_FE_ALL_EXCEPT;
++ unsigned int masked_cr;
++ masked_sr = fenv_sr & mask_sr;
++
++ __builtin_aarch64_set_cr (masked_cr);
++ __builtin_aarch64_set_sr (masked_sr); */
++
++ fenv_cr = create_tmp_var (unsigned_type_node, NULL);
++ fenv_sr = create_tmp_var (unsigned_type_node, NULL);
++
++ get_fpcr = aarch64_builtin_decls[AARCH64_BUILTIN_GET_FPCR];
++ set_fpcr = aarch64_builtin_decls[AARCH64_BUILTIN_SET_FPCR];
++ get_fpsr = aarch64_builtin_decls[AARCH64_BUILTIN_GET_FPSR];
++ set_fpsr = aarch64_builtin_decls[AARCH64_BUILTIN_SET_FPSR];
++
++ mask_cr = build_int_cst (unsigned_type_node,
++ ~(AARCH64_FE_ALL_EXCEPT << AARCH64_FE_EXCEPT_SHIFT));
++ mask_sr = build_int_cst (unsigned_type_node,
++ ~(AARCH64_FE_ALL_EXCEPT));
++
++ ld_fenv_cr = build2 (MODIFY_EXPR, unsigned_type_node,
++ fenv_cr, build_call_expr (get_fpcr, 0));
++ ld_fenv_sr = build2 (MODIFY_EXPR, unsigned_type_node,
++ fenv_sr, build_call_expr (get_fpsr, 0));
++
++ masked_fenv_cr = build2 (BIT_AND_EXPR, unsigned_type_node, fenv_cr, mask_cr);
++ masked_fenv_sr = build2 (BIT_AND_EXPR, unsigned_type_node, fenv_sr, mask_sr);
++
++ hold_fnclex_cr = build_call_expr (set_fpcr, 1, masked_fenv_cr);
++ hold_fnclex_sr = build_call_expr (set_fpsr, 1, masked_fenv_sr);
++
++ hold_fnclex = build2 (COMPOUND_EXPR, void_type_node, hold_fnclex_cr,
++ hold_fnclex_sr);
++ masked_fenv = build2 (COMPOUND_EXPR, void_type_node, masked_fenv_cr,
++ masked_fenv_sr);
++ ld_fenv = build2 (COMPOUND_EXPR, void_type_node, ld_fenv_cr, ld_fenv_sr);
++
++ *hold = build2 (COMPOUND_EXPR, void_type_node,
++ build2 (COMPOUND_EXPR, void_type_node, masked_fenv, ld_fenv),
++ hold_fnclex);
++
++ /* Store the value of masked_fenv to clear the exceptions:
++ __builtin_aarch64_set_fpsr (masked_fenv_sr); */
++
++ *clear = build_call_expr (set_fpsr, 1, masked_fenv_sr);
++
++ /* Generate the equivalent of :
++ unsigned int new_fenv_var;
++ new_fenv_var = __builtin_aarch64_get_fpsr ();
++
++ __builtin_aarch64_set_fpsr (fenv_sr);
++
++ __atomic_feraiseexcept (new_fenv_var); */
++
++ new_fenv_var = create_tmp_var (unsigned_type_node, NULL);
++ reload_fenv = build2 (MODIFY_EXPR, unsigned_type_node,
++ new_fenv_var, build_call_expr (get_fpsr, 0));
++ restore_fnenv = build_call_expr (set_fpsr, 1, fenv_sr);
++ atomic_feraiseexcept = builtin_decl_implicit (BUILT_IN_ATOMIC_FERAISEEXCEPT);
++ update_call = build_call_expr (atomic_feraiseexcept, 1,
++ fold_convert (integer_type_node, new_fenv_var));
++ *update = build2 (COMPOUND_EXPR, void_type_node,
++ build2 (COMPOUND_EXPR, void_type_node,
++ reload_fenv, restore_fnenv), update_call);
++}
++
++
+ #undef AARCH64_CHECK_BUILTIN_MODE
+ #undef AARCH64_FIND_FRINT_VARIANT
+ #undef BUILTIN_DX
--- a/src/gcc/config/aarch64/aarch64-protos.h
+++ b/src/gcc/config/aarch64/aarch64-protos.h
@@ -108,9 +108,22 @@
@@ -10220,7 +24543,15 @@ LANG=C svn diff svn://gcc.gnu.org/svn/gcc/branches/gcc-4_9-branch@211979 \
const int pre_modify;
const int post_modify;
const int register_offset;
-@@ -175,6 +188,8 @@
+@@ -167,6 +180,7 @@
+ enum aarch64_symbol_type
+ aarch64_classify_symbolic_expression (rtx, enum aarch64_symbol_context);
+ bool aarch64_constant_address_p (rtx);
++bool aarch64_expand_movmem (rtx *);
+ bool aarch64_float_const_zero_rtx_p (rtx);
+ bool aarch64_function_arg_regno_p (unsigned);
+ bool aarch64_gen_movmemqi (rtx *);
+@@ -175,6 +189,8 @@
bool aarch64_is_long_call_p (rtx);
bool aarch64_label_mentioned_p (rtx);
bool aarch64_legitimate_pic_operand_p (rtx);
@@ -10229,9 +24560,24 @@ LANG=C svn diff svn://gcc.gnu.org/svn/gcc/branches/gcc-4_9-branch@211979 \
bool aarch64_move_imm (HOST_WIDE_INT, enum machine_mode);
bool aarch64_mov_operand_p (rtx, enum aarch64_symbol_context,
enum machine_mode);
+@@ -200,6 +216,8 @@
+ enum aarch64_symbol_type aarch64_classify_tls_symbol (rtx);
+ enum reg_class aarch64_regno_regclass (unsigned);
+ int aarch64_asm_preferred_eh_data_format (int, int);
++enum machine_mode aarch64_hard_regno_caller_save_mode (unsigned, unsigned,
++ enum machine_mode);
+ int aarch64_hard_regno_mode_ok (unsigned, enum machine_mode);
+ int aarch64_hard_regno_nregs (unsigned, enum machine_mode);
+ int aarch64_simd_attr_length_move (rtx);
+@@ -289,4 +307,5 @@
+ extern void aarch64_expand_vec_perm (rtx target, rtx op0, rtx op1, rtx sel);
+ extern bool
+ aarch64_expand_vec_perm_const (rtx target, rtx op0, rtx op1, rtx sel);
++void aarch64_atomic_assign_expand_fenv (tree *, tree *, tree *);
+ #endif /* GCC_AARCH64_PROTOS_H */
--- a/src/gcc/config/aarch64/aarch64-simd-builtins.def
+++ b/src/gcc/config/aarch64/aarch64-simd-builtins.def
-@@ -51,18 +51,29 @@
+@@ -51,32 +51,43 @@
VAR1 (GETLANE, get_lane, 0, di)
BUILTIN_VALL (GETLANE, be_checked_get_lane, 0)
@@ -10272,6 +24618,26 @@ LANG=C svn diff svn://gcc.gnu.org/svn/gcc/branches/gcc-4_9-branch@211979 \
BUILTIN_VDQ_I (BINOP, dup_lane, 0)
/* Implemented by aarch64_<sur>q<r>shl<mode>. */
BUILTIN_VSDQ_I (BINOP, sqshl, 0)
+- BUILTIN_VSDQ_I (BINOP, uqshl, 0)
++ BUILTIN_VSDQ_I (BINOP_UUS, uqshl, 0)
+ BUILTIN_VSDQ_I (BINOP, sqrshl, 0)
+- BUILTIN_VSDQ_I (BINOP, uqrshl, 0)
++ BUILTIN_VSDQ_I (BINOP_UUS, uqrshl, 0)
+ /* Implemented by aarch64_<su_optab><optab><mode>. */
+ BUILTIN_VSDQ_I (BINOP, sqadd, 0)
+- BUILTIN_VSDQ_I (BINOP, uqadd, 0)
++ BUILTIN_VSDQ_I (BINOPU, uqadd, 0)
+ BUILTIN_VSDQ_I (BINOP, sqsub, 0)
+- BUILTIN_VSDQ_I (BINOP, uqsub, 0)
++ BUILTIN_VSDQ_I (BINOPU, uqsub, 0)
+ /* Implemented by aarch64_<sur>qadd<mode>. */
+- BUILTIN_VSDQ_I (BINOP, suqadd, 0)
+- BUILTIN_VSDQ_I (BINOP, usqadd, 0)
++ BUILTIN_VSDQ_I (BINOP_SSU, suqadd, 0)
++ BUILTIN_VSDQ_I (BINOP_UUS, usqadd, 0)
+
+ /* Implemented by aarch64_get_dreg<VSTRUCT:mode><VDC:mode>. */
+ BUILTIN_VDC (GETLANE, get_dregoi, 0)
@@ -107,6 +118,10 @@
BUILTIN_VQ (STORESTRUCT, st3, 0)
BUILTIN_VQ (STORESTRUCT, st4, 0)
@@ -10294,6 +24660,63 @@ LANG=C svn diff svn://gcc.gnu.org/svn/gcc/branches/gcc-4_9-branch@211979 \
BUILTIN_VSD_HSI (QUADOP, sqdmlal_lane, 0)
BUILTIN_VSD_HSI (QUADOP, sqdmlsl_lane, 0)
+@@ -186,9 +201,9 @@
+ BUILTIN_VSDQ_I_DI (BINOP, ashl, 3)
+ /* Implemented by aarch64_<sur>shl<mode>. */
+ BUILTIN_VSDQ_I_DI (BINOP, sshl, 0)
+- BUILTIN_VSDQ_I_DI (BINOP, ushl, 0)
++ BUILTIN_VSDQ_I_DI (BINOP_UUS, ushl, 0)
+ BUILTIN_VSDQ_I_DI (BINOP, srshl, 0)
+- BUILTIN_VSDQ_I_DI (BINOP, urshl, 0)
++ BUILTIN_VSDQ_I_DI (BINOP_UUS, urshl, 0)
+
+ BUILTIN_VDQ_I (SHIFTIMM, ashr, 3)
+ VAR1 (SHIFTIMM, ashr_simd, 0, di)
+@@ -196,15 +211,15 @@
+ VAR1 (USHIFTIMM, lshr_simd, 0, di)
+ /* Implemented by aarch64_<sur>shr_n<mode>. */
+ BUILTIN_VSDQ_I_DI (SHIFTIMM, srshr_n, 0)
+- BUILTIN_VSDQ_I_DI (SHIFTIMM, urshr_n, 0)
++ BUILTIN_VSDQ_I_DI (USHIFTIMM, urshr_n, 0)
+ /* Implemented by aarch64_<sur>sra_n<mode>. */
+ BUILTIN_VSDQ_I_DI (SHIFTACC, ssra_n, 0)
+- BUILTIN_VSDQ_I_DI (SHIFTACC, usra_n, 0)
++ BUILTIN_VSDQ_I_DI (USHIFTACC, usra_n, 0)
+ BUILTIN_VSDQ_I_DI (SHIFTACC, srsra_n, 0)
+- BUILTIN_VSDQ_I_DI (SHIFTACC, ursra_n, 0)
++ BUILTIN_VSDQ_I_DI (USHIFTACC, ursra_n, 0)
+ /* Implemented by aarch64_<sur>shll_n<mode>. */
+ BUILTIN_VDW (SHIFTIMM, sshll_n, 0)
+- BUILTIN_VDW (SHIFTIMM, ushll_n, 0)
++ BUILTIN_VDW (USHIFTIMM, ushll_n, 0)
+ /* Implemented by aarch64_<sur>shll2_n<mode>. */
+ BUILTIN_VQW (SHIFTIMM, sshll2_n, 0)
+ BUILTIN_VQW (SHIFTIMM, ushll2_n, 0)
+@@ -212,18 +227,18 @@
+ BUILTIN_VSQN_HSDI (SHIFTIMM, sqshrun_n, 0)
+ BUILTIN_VSQN_HSDI (SHIFTIMM, sqrshrun_n, 0)
+ BUILTIN_VSQN_HSDI (SHIFTIMM, sqshrn_n, 0)
+- BUILTIN_VSQN_HSDI (SHIFTIMM, uqshrn_n, 0)
++ BUILTIN_VSQN_HSDI (USHIFTIMM, uqshrn_n, 0)
+ BUILTIN_VSQN_HSDI (SHIFTIMM, sqrshrn_n, 0)
+- BUILTIN_VSQN_HSDI (SHIFTIMM, uqrshrn_n, 0)
++ BUILTIN_VSQN_HSDI (USHIFTIMM, uqrshrn_n, 0)
+ /* Implemented by aarch64_<sur>s<lr>i_n<mode>. */
+ BUILTIN_VSDQ_I_DI (SHIFTINSERT, ssri_n, 0)
+- BUILTIN_VSDQ_I_DI (SHIFTINSERT, usri_n, 0)
++ BUILTIN_VSDQ_I_DI (USHIFTACC, usri_n, 0)
+ BUILTIN_VSDQ_I_DI (SHIFTINSERT, ssli_n, 0)
+- BUILTIN_VSDQ_I_DI (SHIFTINSERT, usli_n, 0)
++ BUILTIN_VSDQ_I_DI (USHIFTACC, usli_n, 0)
+ /* Implemented by aarch64_<sur>qshl<u>_n<mode>. */
+- BUILTIN_VSDQ_I (SHIFTIMM, sqshlu_n, 0)
++ BUILTIN_VSDQ_I (SHIFTIMM_USS, sqshlu_n, 0)
+ BUILTIN_VSDQ_I (SHIFTIMM, sqshl_n, 0)
+- BUILTIN_VSDQ_I (SHIFTIMM, uqshl_n, 0)
++ BUILTIN_VSDQ_I (USHIFTIMM, uqshl_n, 0)
+
+ /* Implemented by aarch64_cm<cmp><mode>. */
+ BUILTIN_VALLDI (BINOP, cmeq, 0)
@@ -265,7 +280,7 @@
BUILTIN_VDQF (UNOP, nearbyint, 2)
BUILTIN_VDQF (UNOP, rint, 2)
@@ -10312,6 +24735,36 @@ LANG=C svn diff svn://gcc.gnu.org/svn/gcc/branches/gcc-4_9-branch@211979 \
/* Implemented by
aarch64_<PERMUTE:perm_insn><PERMUTE:perm_hilo><mode>. */
BUILTIN_VALL (BINOP, zip1, 0)
+@@ -393,3 +410,6 @@
+ /* Implemented by aarch64_crypto_pmull<mode>. */
+ VAR1 (BINOPP, crypto_pmull, 0, di)
+ VAR1 (BINOPP, crypto_pmull, 0, v2di)
++
++ /* Meta-op to check lane bounds of immediate in aarch64_expand_builtin. */
++ VAR1 (BINOPV, im_lane_bound, 0, si)
+--- a/src/gcc/config/aarch64/constraints.md
++++ b/src/gcc/config/aarch64/constraints.md
+@@ -21,6 +21,9 @@
+ (define_register_constraint "k" "STACK_REG"
+ "@internal The stack register.")
+
++(define_register_constraint "Ucs" "CALLER_SAVE_REGS"
++ "@internal The caller save registers.")
++
+ (define_register_constraint "w" "FP_REGS"
+ "Floating point and SIMD vector registers.")
+
+@@ -92,6 +95,10 @@
+ (and (match_code "const_int")
+ (match_test "(unsigned HOST_WIDE_INT) ival < 64")))
+
++(define_constraint "Usf"
++ "@internal Usf is a symbol reference."
++ (match_code "symbol_ref"))
++
+ (define_constraint "UsM"
+ "@internal
+ A constraint that matches the immediate constant -1."
--- a/src/gcc/config/aarch64/aarch64.c
+++ b/src/gcc/config/aarch64/aarch64.c
@@ -63,6 +63,7 @@
@@ -10416,7 +24869,32 @@ LANG=C svn diff svn://gcc.gnu.org/svn/gcc/branches/gcc-4_9-branch@211979 \
NAMED_PARAM (memmov_cost, 4),
NAMED_PARAM (issue_rate, 3)
};
-@@ -444,7 +496,7 @@
+@@ -424,6 +476,24 @@
+ return 0;
+ }
+
++/* Implement HARD_REGNO_CALLER_SAVE_MODE. */
++enum machine_mode
++aarch64_hard_regno_caller_save_mode (unsigned regno, unsigned nregs,
++ enum machine_mode mode)
++{
++ /* Handle modes that fit within single registers. */
++ if (nregs == 1 && GET_MODE_SIZE (mode) <= 16)
++ {
++ if (GET_MODE_SIZE (mode) >= 4)
++ return mode;
++ else
++ return SImode;
++ }
++ /* Fall back to generic for multi-reg and very large modes. */
++ else
++ return choose_hard_reg_mode (regno, nregs, false);
++}
++
+ /* Return true if calls to DECL should be treated as
+ long-calls (ie called via a register). */
+ static bool
+@@ -444,7 +514,7 @@
represent an expression that matches an extend operation. The
operands represent the paramters from
@@ -10425,7 +24903,7 @@ LANG=C svn diff svn://gcc.gnu.org/svn/gcc/branches/gcc-4_9-branch@211979 \
bool
aarch64_is_extend_from_extract (enum machine_mode mode, rtx mult_imm,
rtx extract_imm)
-@@ -636,12 +688,24 @@
+@@ -636,12 +706,24 @@
case SYMBOL_SMALL_TLSDESC:
{
@@ -10453,7 +24931,7 @@ LANG=C svn diff svn://gcc.gnu.org/svn/gcc/branches/gcc-4_9-branch@211979 \
set_unique_reg_note (get_last_insn (), REG_EQUIV, imm);
return;
}
-@@ -648,10 +712,34 @@
+@@ -648,10 +730,34 @@
case SYMBOL_SMALL_GOTTPREL:
{
@@ -10491,7 +24969,29 @@ LANG=C svn diff svn://gcc.gnu.org/svn/gcc/branches/gcc-4_9-branch@211979 \
set_unique_reg_note (get_last_insn (), REG_EQUIV, imm);
return;
}
-@@ -1716,8 +1804,6 @@
+@@ -1162,18 +1268,10 @@
+ }
+
+ static bool
+-aarch64_function_ok_for_sibcall (tree decl, tree exp ATTRIBUTE_UNUSED)
++aarch64_function_ok_for_sibcall (tree decl ATTRIBUTE_UNUSED,
++ tree exp ATTRIBUTE_UNUSED)
+ {
+- /* Indirect calls are not currently supported. */
+- if (decl == NULL)
+- return false;
+-
+- /* Cannot tail-call to long-calls, since these are outside of the
+- range of a branch instruction (we could handle this if we added
+- support for indirect tail-calls. */
+- if (aarch64_decl_is_long_call_p (decl))
+- return false;
+-
++ /* Currently, always true. */
+ return true;
+ }
+
+@@ -1716,8 +1814,6 @@
if (reload_completed && cfun->machine->frame.laid_out)
return;
@@ -10500,7 +25000,7 @@ LANG=C svn diff svn://gcc.gnu.org/svn/gcc/branches/gcc-4_9-branch@211979 \
/* First mark all the registers that really need to be saved... */
for (regno = R0_REGNUM; regno <= R30_REGNUM; regno++)
cfun->machine->frame.reg_offset[regno] = -1;
-@@ -1767,7 +1853,6 @@
+@@ -1767,7 +1863,6 @@
{
cfun->machine->frame.reg_offset[R29_REGNUM] = offset;
offset += UNITS_PER_WORD;
@@ -10508,7 +25008,7 @@ LANG=C svn diff svn://gcc.gnu.org/svn/gcc/branches/gcc-4_9-branch@211979 \
}
if (cfun->machine->frame.reg_offset[R30_REGNUM] != -1)
-@@ -1774,7 +1859,6 @@
+@@ -1774,7 +1869,6 @@
{
cfun->machine->frame.reg_offset[R30_REGNUM] = offset;
offset += UNITS_PER_WORD;
@@ -10516,7 +25016,156 @@ LANG=C svn diff svn://gcc.gnu.org/svn/gcc/branches/gcc-4_9-branch@211979 \
}
cfun->machine->frame.padding0 =
-@@ -2449,12 +2533,22 @@
+@@ -1819,7 +1913,6 @@
+ rtx (*gen_mem_ref)(enum machine_mode, rtx)
+ = (frame_pointer_needed)? gen_frame_mem : gen_rtx_MEM;
+
+-
+ for (regno = V0_REGNUM; regno <= V31_REGNUM; regno++)
+ {
+ if (aarch64_register_saved_on_entry (regno))
+@@ -1837,10 +1930,12 @@
+ {
+ /* Empty loop. */
+ }
++
+ if (regno2 <= V31_REGNUM &&
+ aarch64_register_saved_on_entry (regno2))
+ {
+ rtx mem2;
++
+ /* Next highest register to be saved. */
+ mem2 = gen_mem_ref (DFmode,
+ plus_constant
+@@ -1866,10 +1961,10 @@
+ gen_rtx_REG (DFmode, regno2));
+ }
+
+- /* The first part of a frame-related parallel insn
+- is always assumed to be relevant to the frame
+- calculations; subsequent parts, are only
+- frame-related if explicitly marked. */
++ /* The first part of a frame-related parallel insn is
++ always assumed to be relevant to the frame
++ calculations; subsequent parts, are only
++ frame-related if explicitly marked. */
+ RTX_FRAME_RELATED_P (XVECEXP (PATTERN (insn), 0, 1)) = 1;
+ regno = regno2;
+ start_offset += increment * 2;
+@@ -1882,7 +1977,7 @@
+ {
+ insn = emit_move_insn (gen_rtx_REG (DFmode, regno), mem);
+ add_reg_note (insn, REG_CFA_RESTORE,
+- gen_rtx_REG (DImode, regno));
++ gen_rtx_REG (DFmode, regno));
+ }
+ start_offset += increment;
+ }
+@@ -1889,7 +1984,6 @@
+ RTX_FRAME_RELATED_P (insn) = 1;
+ }
+ }
+-
+ }
+
+
+@@ -1897,7 +1991,7 @@
+ restore's have to happen. */
+ static void
+ aarch64_save_or_restore_callee_save_registers (HOST_WIDE_INT offset,
+- bool restore)
++ bool restore)
+ {
+ rtx insn;
+ rtx base_rtx = stack_pointer_rtx;
+@@ -1929,6 +2023,7 @@
+ aarch64_register_saved_on_entry (regno2))
+ {
+ rtx mem2;
++
+ /* Next highest register to be saved. */
+ mem2 = gen_mem_ref (Pmode,
+ plus_constant
+@@ -1952,12 +2047,11 @@
+ add_reg_note (insn, REG_CFA_RESTORE, gen_rtx_REG (DImode, regno2));
+ }
+
+- /* The first part of a frame-related parallel insn
+- is always assumed to be relevant to the frame
+- calculations; subsequent parts, are only
+- frame-related if explicitly marked. */
+- RTX_FRAME_RELATED_P (XVECEXP (PATTERN (insn), 0,
+- 1)) = 1;
++ /* The first part of a frame-related parallel insn is
++ always assumed to be relevant to the frame
++ calculations; subsequent parts, are only
++ frame-related if explicitly marked. */
++ RTX_FRAME_RELATED_P (XVECEXP (PATTERN (insn), 0, 1)) = 1;
+ regno = regno2;
+ start_offset += increment * 2;
+ }
+@@ -1977,7 +2071,6 @@
+ }
+
+ aarch64_save_or_restore_fprs (start_offset, increment, restore, base_rtx);
+-
+ }
+
+ /* AArch64 stack frames generated by this compiler look like:
+@@ -1986,37 +2079,35 @@
+ | |
+ | incoming stack arguments |
+ | |
+- +-------------------------------+ <-- arg_pointer_rtx
+- | |
++ +-------------------------------+
++ | | <-- incoming stack pointer (aligned)
+ | callee-allocated save area |
+ | for register varargs |
+ | |
+- +-------------------------------+ <-- frame_pointer_rtx
++ +-------------------------------+
++ | local variables | <-- frame_pointer_rtx
+ | |
+- | local variables |
+- | |
+ +-------------------------------+
+ | padding0 | \
+ +-------------------------------+ |
+- | | |
+- | | |
+ | callee-saved registers | | frame.saved_regs_size
+- | | |
+ +-------------------------------+ |
+ | LR' | |
+ +-------------------------------+ |
+- | FP' | /
+- P +-------------------------------+ <-- hard_frame_pointer_rtx
++ | FP' | / <- hard_frame_pointer_rtx (aligned)
++ +-------------------------------+
+ | dynamic allocation |
+ +-------------------------------+
+- | |
+- | outgoing stack arguments |
+- | |
+- +-------------------------------+ <-- stack_pointer_rtx
++ | padding |
++ +-------------------------------+
++ | outgoing stack arguments | <-- arg_pointer
++ | |
++ +-------------------------------+
++ | | <-- stack_pointer_rtx (aligned)
+
+- Dynamic stack allocations such as alloca insert data at point P.
+- They decrease stack_pointer_rtx but leave frame_pointer_rtx and
+- hard_frame_pointer_rtx unchanged. */
++ Dynamic stack allocations via alloca() decrease stack_pointer_rtx
++ but leave frame_pointer_rtx and hard_frame_pointer_rtx
++ unchanged. */
+
+ /* Generate the prologue instructions for entry into a function.
+ Establish the stack frame by decreasing the stack pointer with a
+@@ -2449,12 +2540,22 @@
- 2 * UNITS_PER_WORD));
}
@@ -10543,7 +25192,7 @@ LANG=C svn diff svn://gcc.gnu.org/svn/gcc/branches/gcc-4_9-branch@211979 \
else
{
int i;
-@@ -2485,15 +2579,19 @@
+@@ -2485,15 +2586,19 @@
the same. */
if (ncount < zcount)
{
@@ -10567,7 +25216,7 @@ LANG=C svn diff svn://gcc.gnu.org/svn/gcc/branches/gcc-4_9-branch@211979 \
}
val >>= 16;
-@@ -2501,11 +2599,17 @@
+@@ -2501,11 +2606,17 @@
for (i = 16; i < 64; i += 16)
{
if ((val & 0xffff) != tval)
@@ -10587,7 +25236,7 @@ LANG=C svn diff svn://gcc.gnu.org/svn/gcc/branches/gcc-4_9-branch@211979 \
}
static void
-@@ -2520,7 +2624,7 @@
+@@ -2520,7 +2631,7 @@
if (mdelta >= 4096 * 4096)
{
@@ -10596,7 +25245,7 @@ LANG=C svn diff svn://gcc.gnu.org/svn/gcc/branches/gcc-4_9-branch@211979 \
emit_insn (gen_add3_insn (this_rtx, this_rtx, scratch_rtx));
}
else if (mdelta > 0)
-@@ -2594,7 +2698,7 @@
+@@ -2594,7 +2705,7 @@
addr = plus_constant (Pmode, temp0, vcall_offset);
else
{
@@ -10605,7 +25254,7 @@ LANG=C svn diff svn://gcc.gnu.org/svn/gcc/branches/gcc-4_9-branch@211979 \
addr = gen_rtx_PLUS (Pmode, temp0, temp1);
}
-@@ -3046,11 +3150,11 @@
+@@ -3046,11 +3157,11 @@
enum rtx_code code = GET_CODE (x);
rtx op0, op1;
bool allow_reg_index_p =
@@ -10620,7 +25269,7 @@ LANG=C svn diff svn://gcc.gnu.org/svn/gcc/branches/gcc-4_9-branch@211979 \
&& (code != POST_INC && code != REG))
return false;
-@@ -3839,34 +3943,34 @@
+@@ -3839,34 +3950,34 @@
if (addr.offset == const0_rtx)
asm_fprintf (f, "[%s]", reg_names [REGNO (addr.base)]);
else
@@ -10662,7 +25311,7 @@ LANG=C svn diff svn://gcc.gnu.org/svn/gcc/branches/gcc-4_9-branch@211979 \
REGNO (addr.offset) - R0_REGNUM, addr.shift);
return;
-@@ -3874,27 +3978,27 @@
+@@ -3874,27 +3985,27 @@
switch (GET_CODE (x))
{
case PRE_INC:
@@ -10696,7 +25345,7 @@ LANG=C svn diff svn://gcc.gnu.org/svn/gcc/branches/gcc-4_9-branch@211979 \
INTVAL (addr.offset));
return;
default:
-@@ -3903,7 +4007,7 @@
+@@ -3903,7 +4014,7 @@
break;
case ADDRESS_LO_SUM:
@@ -10705,7 +25354,7 @@ LANG=C svn diff svn://gcc.gnu.org/svn/gcc/branches/gcc-4_9-branch@211979 \
output_addr_const (f, addr.offset);
asm_fprintf (f, "]");
return;
-@@ -3980,8 +4084,8 @@
+@@ -3980,8 +4091,8 @@
{
rtx x = *x_p;
@@ -10716,7 +25365,7 @@ LANG=C svn diff svn://gcc.gnu.org/svn/gcc/branches/gcc-4_9-branch@211979 \
&& GET_CODE (x) == PLUS
&& REG_P (XEXP (x, 0))
&& CONST_INT_P (XEXP (x, 1)))
-@@ -4150,32 +4254,31 @@
+@@ -4150,32 +4261,31 @@
+ crtl->outgoing_args_size
+ cfun->machine->saved_varargs_size);
@@ -10770,7 +25419,15 @@ LANG=C svn diff svn://gcc.gnu.org/svn/gcc/branches/gcc-4_9-branch@211979 \
}
-@@ -4443,9 +4546,13 @@
+@@ -4242,6 +4352,7 @@
+ {
+ switch (regclass)
+ {
++ case CALLER_SAVE_REGS:
+ case CORE_REGS:
+ case POINTER_REGS:
+ case GENERAL_REGS:
+@@ -4443,9 +4554,13 @@
{
rtx op = x;
@@ -10785,7 +25442,7 @@ LANG=C svn diff svn://gcc.gnu.org/svn/gcc/branches/gcc-4_9-branch@211979 \
&& CONST_INT_P (XEXP (op, 1)))
return XEXP (op, 0);
-@@ -4457,12 +4564,12 @@
+@@ -4457,12 +4572,12 @@
return x;
}
@@ -10800,7 +25457,7 @@ LANG=C svn diff svn://gcc.gnu.org/svn/gcc/branches/gcc-4_9-branch@211979 \
{
rtx op = x;
-@@ -4469,6 +4576,7 @@
+@@ -4469,6 +4584,7 @@
/* Zero and sign extraction of a widened value. */
if ((GET_CODE (op) == ZERO_EXTRACT || GET_CODE (op) == SIGN_EXTRACT)
&& XEXP (op, 2) == const0_rtx
@@ -10808,7 +25465,7 @@ LANG=C svn diff svn://gcc.gnu.org/svn/gcc/branches/gcc-4_9-branch@211979 \
&& aarch64_is_extend_from_extract (GET_MODE (op), XEXP (XEXP (op, 0), 1),
XEXP (op, 1)))
return XEXP (XEXP (op, 0), 0);
-@@ -4497,9 +4605,316 @@
+@@ -4497,9 +4613,316 @@
if (op != x)
return op;
@@ -11126,7 +25783,7 @@ LANG=C svn diff svn://gcc.gnu.org/svn/gcc/branches/gcc-4_9-branch@211979 \
/* Calculate the cost of calculating X, storing it in *COST. Result
is true if the total cost of the operation has now been calculated. */
static bool
-@@ -4506,13 +4921,31 @@
+@@ -4506,13 +4929,31 @@
aarch64_rtx_costs (rtx x, int code, int outer ATTRIBUTE_UNUSED,
int param ATTRIBUTE_UNUSED, int *cost, bool speed)
{
@@ -11159,7 +25816,7 @@ LANG=C svn diff svn://gcc.gnu.org/svn/gcc/branches/gcc-4_9-branch@211979 \
op0 = SET_DEST (x);
op1 = SET_SRC (x);
-@@ -4520,25 +4953,47 @@
+@@ -4520,25 +4961,47 @@
{
case MEM:
if (speed)
@@ -11215,7 +25872,7 @@ LANG=C svn diff svn://gcc.gnu.org/svn/gcc/branches/gcc-4_9-branch@211979 \
if (GET_CODE (op1) == SUBREG)
op1 = SUBREG_REG (op1);
if ((GET_CODE (op1) == ZERO_EXTEND
-@@ -4547,25 +5002,139 @@
+@@ -4547,25 +5010,139 @@
&& (GET_MODE_BITSIZE (GET_MODE (XEXP (op1, 0)))
>= INTVAL (XEXP (op0, 1))))
op1 = XEXP (op1, 0);
@@ -11360,7 +26017,7 @@ LANG=C svn diff svn://gcc.gnu.org/svn/gcc/branches/gcc-4_9-branch@211979 \
case COMPARE:
op0 = XEXP (x, 0);
op1 = XEXP (x, 1);
-@@ -4577,96 +5146,228 @@
+@@ -4577,96 +5154,228 @@
goto cost_logic;
}
@@ -11661,7 +26318,7 @@ LANG=C svn diff svn://gcc.gnu.org/svn/gcc/branches/gcc-4_9-branch@211979 \
case XOR:
case AND:
cost_logic:
-@@ -4673,117 +5374,252 @@
+@@ -4673,117 +5382,252 @@
op0 = XEXP (x, 0);
op1 = XEXP (x, 1);
@@ -11979,7 +26636,7 @@ LANG=C svn diff svn://gcc.gnu.org/svn/gcc/branches/gcc-4_9-branch@211979 \
if (speed)
{
if (GET_MODE_CLASS (GET_MODE (x)) == MODE_INT)
-@@ -4800,53 +5636,179 @@
+@@ -4800,53 +5644,179 @@
case DIV:
case UDIV:
@@ -12191,7 +26848,153 @@ LANG=C svn diff svn://gcc.gnu.org/svn/gcc/branches/gcc-4_9-branch@211979 \
}
static int
-@@ -8093,11 +9055,6 @@
+@@ -8038,7 +9008,145 @@
+ return true;
+ }
+
++/* Recognize patterns for the EXT insn. */
++
+ static bool
++aarch64_evpc_ext (struct expand_vec_perm_d *d)
++{
++ unsigned int i, nelt = d->nelt;
++ rtx (*gen) (rtx, rtx, rtx, rtx);
++ rtx offset;
++
++ unsigned int location = d->perm[0]; /* Always < nelt. */
++
++ /* Check if the extracted indices are increasing by one. */
++ for (i = 1; i < nelt; i++)
++ {
++ unsigned int required = location + i;
++ if (d->one_vector_p)
++ {
++ /* We'll pass the same vector in twice, so allow indices to wrap. */
++ required &= (nelt - 1);
++ }
++ if (d->perm[i] != required)
++ return false;
++ }
++
++ switch (d->vmode)
++ {
++ case V16QImode: gen = gen_aarch64_extv16qi; break;
++ case V8QImode: gen = gen_aarch64_extv8qi; break;
++ case V4HImode: gen = gen_aarch64_extv4hi; break;
++ case V8HImode: gen = gen_aarch64_extv8hi; break;
++ case V2SImode: gen = gen_aarch64_extv2si; break;
++ case V4SImode: gen = gen_aarch64_extv4si; break;
++ case V2SFmode: gen = gen_aarch64_extv2sf; break;
++ case V4SFmode: gen = gen_aarch64_extv4sf; break;
++ case V2DImode: gen = gen_aarch64_extv2di; break;
++ case V2DFmode: gen = gen_aarch64_extv2df; break;
++ default:
++ return false;
++ }
++
++ /* Success! */
++ if (d->testing_p)
++ return true;
++
++ /* The case where (location == 0) is a no-op for both big- and little-endian,
++ and is removed by the mid-end at optimization levels -O1 and higher. */
++
++ if (BYTES_BIG_ENDIAN && (location != 0))
++ {
++ /* After setup, we want the high elements of the first vector (stored
++ at the LSB end of the register), and the low elements of the second
++ vector (stored at the MSB end of the register). So swap. */
++ rtx temp = d->op0;
++ d->op0 = d->op1;
++ d->op1 = temp;
++ /* location != 0 (above), so safe to assume (nelt - location) < nelt. */
++ location = nelt - location;
++ }
++
++ offset = GEN_INT (location);
++ emit_insn (gen (d->target, d->op0, d->op1, offset));
++ return true;
++}
++
++/* Recognize patterns for the REV insns. */
++
++static bool
++aarch64_evpc_rev (struct expand_vec_perm_d *d)
++{
++ unsigned int i, j, diff, nelt = d->nelt;
++ rtx (*gen) (rtx, rtx);
++
++ if (!d->one_vector_p)
++ return false;
++
++ diff = d->perm[0];
++ switch (diff)
++ {
++ case 7:
++ switch (d->vmode)
++ {
++ case V16QImode: gen = gen_aarch64_rev64v16qi; break;
++ case V8QImode: gen = gen_aarch64_rev64v8qi; break;
++ default:
++ return false;
++ }
++ break;
++ case 3:
++ switch (d->vmode)
++ {
++ case V16QImode: gen = gen_aarch64_rev32v16qi; break;
++ case V8QImode: gen = gen_aarch64_rev32v8qi; break;
++ case V8HImode: gen = gen_aarch64_rev64v8hi; break;
++ case V4HImode: gen = gen_aarch64_rev64v4hi; break;
++ default:
++ return false;
++ }
++ break;
++ case 1:
++ switch (d->vmode)
++ {
++ case V16QImode: gen = gen_aarch64_rev16v16qi; break;
++ case V8QImode: gen = gen_aarch64_rev16v8qi; break;
++ case V8HImode: gen = gen_aarch64_rev32v8hi; break;
++ case V4HImode: gen = gen_aarch64_rev32v4hi; break;
++ case V4SImode: gen = gen_aarch64_rev64v4si; break;
++ case V2SImode: gen = gen_aarch64_rev64v2si; break;
++ case V4SFmode: gen = gen_aarch64_rev64v4sf; break;
++ case V2SFmode: gen = gen_aarch64_rev64v2sf; break;
++ default:
++ return false;
++ }
++ break;
++ default:
++ return false;
++ }
++
++ for (i = 0; i < nelt ; i += diff + 1)
++ for (j = 0; j <= diff; j += 1)
++ {
++ /* This is guaranteed to be true as the value of diff
++ is 7, 3, 1 and we should have enough elements in the
++ queue to generate this. Getting a vector mask with a
++ value of diff other than these values implies that
++ something is wrong by the time we get here. */
++ gcc_assert (i + j < nelt);
++ if (d->perm[i + j] != i + diff - j)
++ return false;
++ }
++
++ /* Success! */
++ if (d->testing_p)
++ return true;
++
++ emit_insn (gen (d->target, d->op0));
++ return true;
++}
++
++static bool
+ aarch64_evpc_dup (struct expand_vec_perm_d *d)
+ {
+ rtx (*gen) (rtx, rtx, rtx);
+@@ -8094,11 +9202,6 @@
enum machine_mode vmode = d->vmode;
unsigned int i, nelt = d->nelt;
@@ -12203,7 +27006,7 @@ LANG=C svn diff svn://gcc.gnu.org/svn/gcc/branches/gcc-4_9-branch@211979 \
if (d->testing_p)
return true;
-@@ -8108,7 +9065,15 @@
+@@ -8109,7 +9212,15 @@
return false;
for (i = 0; i < nelt; ++i)
@@ -12220,7 +27023,21 @@ LANG=C svn diff svn://gcc.gnu.org/svn/gcc/branches/gcc-4_9-branch@211979 \
sel = gen_rtx_CONST_VECTOR (vmode, gen_rtvec_v (nelt, rperm));
sel = force_reg (vmode, sel);
-@@ -8263,7 +9228,8 @@
+@@ -8138,8 +9249,12 @@
+
+ if (TARGET_SIMD)
+ {
+- if (aarch64_evpc_zip (d))
++ if (aarch64_evpc_rev (d))
+ return true;
++ else if (aarch64_evpc_ext (d))
++ return true;
++ else if (aarch64_evpc_zip (d))
++ return true;
+ else if (aarch64_evpc_uzp (d))
+ return true;
+ else if (aarch64_evpc_trn (d))
+@@ -8264,7 +9379,8 @@
/* Limited combinations of subregs are safe on FPREGs. Particularly,
1. Vector Mode to Scalar mode where 1 unit of the vector is accessed.
2. Scalar to Scalar for integer modes or same size float modes.
@@ -12230,7 +27047,7 @@ LANG=C svn diff svn://gcc.gnu.org/svn/gcc/branches/gcc-4_9-branch@211979 \
if (GET_MODE_SIZE (from) > GET_MODE_SIZE (to))
{
if (aarch64_vector_mode_supported_p (from)
-@@ -8279,11 +9245,41 @@
+@@ -8280,11 +9396,199 @@
if (aarch64_vector_mode_supported_p (from)
&& aarch64_vector_mode_supported_p (to))
return false;
@@ -12269,10 +27086,168 @@ LANG=C svn diff svn://gcc.gnu.org/svn/gcc/branches/gcc-4_9-branch@211979 \
+ return false;
+}
+
++/* Return a new RTX holding the result of moving POINTER forward by
++ AMOUNT bytes. */
++
++static rtx
++aarch64_move_pointer (rtx pointer, int amount)
++{
++ rtx next = plus_constant (Pmode, XEXP (pointer, 0), amount);
++
++ return adjust_automodify_address (pointer, GET_MODE (pointer),
++ next, amount);
++}
++
++/* Return a new RTX holding the result of moving POINTER forward by the
++ size of the mode it points to. */
++
++static rtx
++aarch64_progress_pointer (rtx pointer)
++{
++ HOST_WIDE_INT amount = GET_MODE_SIZE (GET_MODE (pointer));
++
++ return aarch64_move_pointer (pointer, amount);
++}
++
++/* Copy one MODE sized block from SRC to DST, then progress SRC and DST by
++ MODE bytes. */
++
++static void
++aarch64_copy_one_block_and_progress_pointers (rtx *src, rtx *dst,
++ enum machine_mode mode)
++{
++ rtx reg = gen_reg_rtx (mode);
++
++ /* "Cast" the pointers to the correct mode. */
++ *src = adjust_address (*src, mode, 0);
++ *dst = adjust_address (*dst, mode, 0);
++ /* Emit the memcpy. */
++ emit_move_insn (reg, *src);
++ emit_move_insn (*dst, reg);
++ /* Move the pointers forward. */
++ *src = aarch64_progress_pointer (*src);
++ *dst = aarch64_progress_pointer (*dst);
++}
++
++/* Expand movmem, as if from a __builtin_memcpy. Return true if
++ we succeed, otherwise return false. */
++
++bool
++aarch64_expand_movmem (rtx *operands)
++{
++ unsigned int n;
++ rtx dst = operands[0];
++ rtx src = operands[1];
++ rtx base;
++ bool speed_p = !optimize_function_for_size_p (cfun);
++
++ /* When optimizing for size, give a better estimate of the length of a
++ memcpy call, but use the default otherwise. */
++ unsigned int max_instructions = (speed_p ? 15 : AARCH64_CALL_RATIO) / 2;
++
++ /* We can't do anything smart if the amount to copy is not constant. */
++ if (!CONST_INT_P (operands[2]))
++ return false;
++
++ n = UINTVAL (operands[2]);
++
++ /* Try to keep the number of instructions low. For cases below 16 bytes we
++ need to make at most two moves. For cases above 16 bytes it will be one
++ move for each 16 byte chunk, then at most two additional moves. */
++ if (((n / 16) + (n % 16 ? 2 : 0)) > max_instructions)
++ return false;
++
++ base = copy_to_mode_reg (Pmode, XEXP (dst, 0));
++ dst = adjust_automodify_address (dst, VOIDmode, base, 0);
++
++ base = copy_to_mode_reg (Pmode, XEXP (src, 0));
++ src = adjust_automodify_address (src, VOIDmode, base, 0);
++
++ /* Simple cases. Copy 0-3 bytes, as (if applicable) a 2-byte, then a
++ 1-byte chunk. */
++ if (n < 4)
++ {
++ if (n >= 2)
++ {
++ aarch64_copy_one_block_and_progress_pointers (&src, &dst, HImode);
++ n -= 2;
++ }
++
++ if (n == 1)
++ aarch64_copy_one_block_and_progress_pointers (&src, &dst, QImode);
++
++ return true;
++ }
++
++ /* Copy 4-8 bytes. First a 4-byte chunk, then (if applicable) a second
++ 4-byte chunk, partially overlapping with the previously copied chunk. */
++ if (n < 8)
++ {
++ aarch64_copy_one_block_and_progress_pointers (&src, &dst, SImode);
++ n -= 4;
++ if (n > 0)
++ {
++ int move = n - 4;
++
++ src = aarch64_move_pointer (src, move);
++ dst = aarch64_move_pointer (dst, move);
++ aarch64_copy_one_block_and_progress_pointers (&src, &dst, SImode);
++ }
++ return true;
++ }
++
++ /* Copy more than 8 bytes. Copy chunks of 16 bytes until we run out of
++ them, then (if applicable) an 8-byte chunk. */
++ while (n >= 8)
++ {
++ if (n / 16)
++ {
++ aarch64_copy_one_block_and_progress_pointers (&src, &dst, TImode);
++ n -= 16;
++ }
++ else
++ {
++ aarch64_copy_one_block_and_progress_pointers (&src, &dst, DImode);
++ n -= 8;
++ }
++ }
++
++ /* Finish the final bytes of the copy. We can always do this in one
++ instruction. We either copy the exact amount we need, or partially
++ overlap with the previous chunk we copied and copy 8-bytes. */
++ if (n == 0)
++ return true;
++ else if (n == 1)
++ aarch64_copy_one_block_and_progress_pointers (&src, &dst, QImode);
++ else if (n == 2)
++ aarch64_copy_one_block_and_progress_pointers (&src, &dst, HImode);
++ else if (n == 4)
++ aarch64_copy_one_block_and_progress_pointers (&src, &dst, SImode);
++ else
++ {
++ if (n == 3)
++ {
++ src = aarch64_move_pointer (src, -1);
++ dst = aarch64_move_pointer (dst, -1);
++ aarch64_copy_one_block_and_progress_pointers (&src, &dst, SImode);
++ }
++ else
++ {
++ int move = n - 8;
++
++ src = aarch64_move_pointer (src, move);
++ dst = aarch64_move_pointer (dst, move);
++ aarch64_copy_one_block_and_progress_pointers (&src, &dst, DImode);
++ }
++ }
++
++ return true;
++}
++
#undef TARGET_ADDRESS_COST
#define TARGET_ADDRESS_COST aarch64_address_cost
-@@ -8454,7 +9450,7 @@
+@@ -8455,7 +9759,7 @@
#define TARGET_RETURN_IN_MSB aarch64_return_in_msb
#undef TARGET_RTX_COSTS
@@ -12281,6 +27256,37 @@ LANG=C svn diff svn://gcc.gnu.org/svn/gcc/branches/gcc-4_9-branch@211979 \
#undef TARGET_SCHED_ISSUE_RATE
#define TARGET_SCHED_ISSUE_RATE aarch64_sched_issue_rate
+@@ -8493,6 +9797,10 @@
+ #define TARGET_VECTORIZE_AUTOVECTORIZE_VECTOR_SIZES \
+ aarch64_autovectorize_vector_sizes
+
++#undef TARGET_ATOMIC_ASSIGN_EXPAND_FENV
++#define TARGET_ATOMIC_ASSIGN_EXPAND_FENV \
++ aarch64_atomic_assign_expand_fenv
++
+ /* Section anchor support. */
+
+ #undef TARGET_MIN_ANCHOR_OFFSET
+--- a/src/gcc/config/aarch64/aarch64-linux.h
++++ b/src/gcc/config/aarch64/aarch64-linux.h
+@@ -21,7 +21,7 @@
+ #ifndef GCC_AARCH64_LINUX_H
+ #define GCC_AARCH64_LINUX_H
+
+-#define GLIBC_DYNAMIC_LINKER "/lib/ld-linux-aarch64%{mbig-endian:_be}.so.1"
++#define GLIBC_DYNAMIC_LINKER "/lib/ld-linux-aarch64%{mbig-endian:_be}%{mabi=ilp32:_ilp32}.so.1"
+
+ #define CPP_SPEC "%{pthread:-D_REENTRANT}"
+
+@@ -33,7 +33,7 @@
+ -dynamic-linker " GNU_USER_DYNAMIC_LINKER " \
+ -X \
+ %{mbig-endian:-EB} %{mlittle-endian:-EL} \
+- -maarch64linux%{mbig-endian:b}"
++ -maarch64linux%{mabi=ilp32:32}%{mbig-endian:b}"
+
+ #define LINK_SPEC LINUX_TARGET_LINK_SPEC
+
--- a/src/gcc/config/aarch64/iterators.md
+++ b/src/gcc/config/aarch64/iterators.md
@@ -150,6 +150,9 @@
@@ -12293,7 +27299,18 @@ LANG=C svn diff svn://gcc.gnu.org/svn/gcc/branches/gcc-4_9-branch@211979 \
;; Vector modes for Q, H and S types.
(define_mode_iterator VDQQHS [V8QI V16QI V4HI V8HI V2SI V4SI])
-@@ -352,6 +355,9 @@
+@@ -267,6 +270,10 @@
+ UNSPEC_UZP2 ; Used in vector permute patterns.
+ UNSPEC_TRN1 ; Used in vector permute patterns.
+ UNSPEC_TRN2 ; Used in vector permute patterns.
++ UNSPEC_EXT ; Used in aarch64-simd.md.
++ UNSPEC_REV64 ; Used in vector reverse patterns (permute).
++ UNSPEC_REV32 ; Used in vector reverse patterns (permute).
++ UNSPEC_REV16 ; Used in vector reverse patterns (permute).
+ UNSPEC_AESE ; Used in aarch64-simd.md.
+ UNSPEC_AESD ; Used in aarch64-simd.md.
+ UNSPEC_AESMC ; Used in aarch64-simd.md.
+@@ -352,6 +359,9 @@
(V2DI "2d") (V2SF "2s")
(V4SF "4s") (V2DF "2d")])
@@ -12303,7 +27320,7 @@ LANG=C svn diff svn://gcc.gnu.org/svn/gcc/branches/gcc-4_9-branch@211979 \
(define_mode_attr Vmtype [(V8QI ".8b") (V16QI ".16b")
(V4HI ".4h") (V8HI ".8h")
(V2SI ".2s") (V4SI ".4s")
-@@ -554,6 +560,32 @@
+@@ -546,6 +556,32 @@
(define_mode_attr VSTRUCT_DREG [(OI "TI") (CI "EI") (XI "OI")])
@@ -12336,9 +27353,77 @@ LANG=C svn diff svn://gcc.gnu.org/svn/gcc/branches/gcc-4_9-branch@211979 \
;; Mode for atomic operation suffixes
(define_mode_attr atomic_sfx
[(QI "b") (HI "h") (SI "") (DI "")])
+@@ -847,6 +883,8 @@
+ UNSPEC_TRN1 UNSPEC_TRN2
+ UNSPEC_UZP1 UNSPEC_UZP2])
+
++(define_int_iterator REVERSE [UNSPEC_REV64 UNSPEC_REV32 UNSPEC_REV16])
++
+ (define_int_iterator FRINT [UNSPEC_FRINTZ UNSPEC_FRINTP UNSPEC_FRINTM
+ UNSPEC_FRINTN UNSPEC_FRINTI UNSPEC_FRINTX
+ UNSPEC_FRINTA])
+@@ -856,6 +894,10 @@
+
+ (define_int_iterator FRECP [UNSPEC_FRECPE UNSPEC_FRECPX])
+
++(define_int_iterator CRC [UNSPEC_CRC32B UNSPEC_CRC32H UNSPEC_CRC32W
++ UNSPEC_CRC32X UNSPEC_CRC32CB UNSPEC_CRC32CH
++ UNSPEC_CRC32CW UNSPEC_CRC32CX])
++
+ (define_int_iterator CRYPTO_AES [UNSPEC_AESE UNSPEC_AESD])
+ (define_int_iterator CRYPTO_AESMC [UNSPEC_AESMC UNSPEC_AESIMC])
+
+@@ -974,6 +1016,10 @@
+ (UNSPEC_TRN1 "trn") (UNSPEC_TRN2 "trn")
+ (UNSPEC_UZP1 "uzp") (UNSPEC_UZP2 "uzp")])
+
++; op code for REV instructions (size within which elements are reversed).
++(define_int_attr rev_op [(UNSPEC_REV64 "64") (UNSPEC_REV32 "32")
++ (UNSPEC_REV16 "16")])
++
+ (define_int_attr perm_hilo [(UNSPEC_ZIP1 "1") (UNSPEC_ZIP2 "2")
+ (UNSPEC_TRN1 "1") (UNSPEC_TRN2 "2")
+ (UNSPEC_UZP1 "1") (UNSPEC_UZP2 "2")])
+@@ -980,6 +1026,16 @@
+
+ (define_int_attr frecp_suffix [(UNSPEC_FRECPE "e") (UNSPEC_FRECPX "x")])
+
++(define_int_attr crc_variant [(UNSPEC_CRC32B "crc32b") (UNSPEC_CRC32H "crc32h")
++ (UNSPEC_CRC32W "crc32w") (UNSPEC_CRC32X "crc32x")
++ (UNSPEC_CRC32CB "crc32cb") (UNSPEC_CRC32CH "crc32ch")
++ (UNSPEC_CRC32CW "crc32cw") (UNSPEC_CRC32CX "crc32cx")])
++
++(define_int_attr crc_mode [(UNSPEC_CRC32B "QI") (UNSPEC_CRC32H "HI")
++ (UNSPEC_CRC32W "SI") (UNSPEC_CRC32X "DI")
++ (UNSPEC_CRC32CB "QI") (UNSPEC_CRC32CH "HI")
++ (UNSPEC_CRC32CW "SI") (UNSPEC_CRC32CX "DI")])
++
+ (define_int_attr aes_op [(UNSPEC_AESE "e") (UNSPEC_AESD "d")])
+ (define_int_attr aesmc_op [(UNSPEC_AESMC "mc") (UNSPEC_AESIMC "imc")])
+
--- a/src/gcc/config/aarch64/aarch64.h
+++ b/src/gcc/config/aarch64/aarch64.h
-@@ -365,8 +365,7 @@
+@@ -35,6 +35,9 @@
+ if (TARGET_SIMD) \
+ builtin_define ("__ARM_NEON"); \
+ \
++ if (TARGET_CRC32) \
++ builtin_define ("__ARM_FEATURE_CRC32"); \
++ \
+ switch (aarch64_cmodel) \
+ { \
+ case AARCH64_CMODEL_TINY: \
+@@ -188,6 +191,9 @@
+ /* Crypto is an optional extension to AdvSIMD. */
+ #define TARGET_CRYPTO (TARGET_SIMD && AARCH64_ISA_CRYPTO)
+
++/* CRC instructions that can be enabled through +crc arch extension. */
++#define TARGET_CRC32 (AARCH64_ISA_CRC)
++
+ /* Standard register usage. */
+
+ /* 31 64-bit general purpose registers R0-R30:
+@@ -365,8 +371,7 @@
#define HARD_REGNO_MODE_OK(REGNO, MODE) aarch64_hard_regno_mode_ok (REGNO, MODE)
@@ -12348,7 +27433,31 @@ LANG=C svn diff svn://gcc.gnu.org/svn/gcc/branches/gcc-4_9-branch@211979 \
#define DWARF2_UNWIND_INFO 1
-@@ -520,7 +519,6 @@
+@@ -409,6 +414,7 @@
+ enum reg_class
+ {
+ NO_REGS,
++ CALLER_SAVE_REGS,
+ CORE_REGS,
+ GENERAL_REGS,
+ STACK_REG,
+@@ -424,6 +430,7 @@
+ #define REG_CLASS_NAMES \
+ { \
+ "NO_REGS", \
++ "CALLER_SAVE_REGS", \
+ "CORE_REGS", \
+ "GENERAL_REGS", \
+ "STACK_REG", \
+@@ -436,6 +443,7 @@
+ #define REG_CLASS_CONTENTS \
+ { \
+ { 0x00000000, 0x00000000, 0x00000000 }, /* NO_REGS */ \
++ { 0x0007ffff, 0x00000000, 0x00000000 }, /* CALLER_SAVE_REGS */ \
+ { 0x7fffffff, 0x00000000, 0x00000003 }, /* CORE_REGS */ \
+ { 0x7fffffff, 0x00000000, 0x00000003 }, /* GENERAL_REGS */ \
+ { 0x80000000, 0x00000000, 0x00000000 }, /* STACK_REG */ \
+@@ -520,7 +528,6 @@
been saved. */
HOST_WIDE_INT padding0;
HOST_WIDE_INT hardfp_offset; /* HARD_FRAME_POINTER_REGNUM */
@@ -12356,6 +27465,38 @@ LANG=C svn diff svn://gcc.gnu.org/svn/gcc/branches/gcc-4_9-branch@211979 \
bool laid_out;
};
+@@ -661,12 +668,14 @@
+ /* The base cost overhead of a memcpy call, for MOVE_RATIO and friends. */
+ #define AARCH64_CALL_RATIO 8
+
+-/* When optimizing for size, give a better estimate of the length of a memcpy
+- call, but use the default otherwise. But move_by_pieces_ninsns() counts
+- memory-to-memory moves, and we'll have to generate a load & store for each,
+- so halve the value to take that into account. */
++/* MOVE_RATIO dictates when we will use the move_by_pieces infrastructure.
++ move_by_pieces will continually copy the largest safe chunks. So a
++ 7-byte copy is a 4-byte + 2-byte + byte copy. This proves inefficient
++ for both size and speed of copy, so we will instead use the "movmem"
++ standard name to implement the copy. This logic does not apply when
++ targeting -mstrict-align, so keep a sensible default in that case. */
+ #define MOVE_RATIO(speed) \
+- (((speed) ? 15 : AARCH64_CALL_RATIO) / 2)
++ (!STRICT_ALIGNMENT ? 2 : (((speed) ? 15 : AARCH64_CALL_RATIO) / 2))
+
+ /* For CLEAR_RATIO, when optimizing for size, give a better estimate
+ of the length of a memset call, but use the default otherwise. */
+@@ -826,6 +835,11 @@
+
+ #define SHIFT_COUNT_TRUNCATED !TARGET_SIMD
+
++/* Choose appropriate mode for caller saves, so we do the minimum
++ required size of load/store. */
++#define HARD_REGNO_CALLER_SAVE_MODE(REGNO, NREGS, MODE) \
++ aarch64_hard_regno_caller_save_mode ((REGNO), (NREGS), (MODE))
++
+ /* Callee only saves lower 64-bits of a 128-bit register. Tell the
+ compiler the callee clobbers the top 64-bits when restoring the
+ bottom 64-bits. */
--- a/src/gcc/config/arm/aarch-cost-tables.h
+++ b/src/gcc/config/arm/aarch-cost-tables.h
@@ -39,6 +39,7 @@
@@ -12384,6 +27525,15 @@ LANG=C svn diff svn://gcc.gnu.org/svn/gcc/branches/gcc-4_9-branch@211979 \
},
--- a/src/gcc/config/arm/thumb2.md
+++ b/src/gcc/config/arm/thumb2.md
+@@ -329,7 +329,7 @@
+ movw%?\\t%0, %L1\\t%@ movhi
+ str%(h%)\\t%1, %0\\t%@ movhi
+ ldr%(h%)\\t%0, %1\\t%@ movhi"
+- [(set_attr "type" "mov_reg,mov_imm,mov_imm,mov_reg,store1,load1")
++ [(set_attr "type" "mov_reg,mov_imm,mov_imm,mov_imm,store1,load1")
+ (set_attr "predicable" "yes")
+ (set_attr "predicable_short_it" "yes,no,yes,no,no,no")
+ (set_attr "length" "2,4,2,4,4,4")
@@ -1370,6 +1370,103 @@
(set_attr "type" "alu_reg")]
)
@@ -12490,7 +27640,41 @@ LANG=C svn diff svn://gcc.gnu.org/svn/gcc/branches/gcc-4_9-branch@211979 \
(ior:SI (not:SI (match_operand:SI 2 "s_register_operand" "r"))
--- a/src/gcc/config/arm/arm.c
+++ b/src/gcc/config/arm/arm.c
-@@ -986,6 +986,7 @@
+@@ -50,6 +50,7 @@
+ #include "except.h"
+ #include "tm_p.h"
+ #include "target.h"
++#include "sched-int.h"
+ #include "target-def.h"
+ #include "debug.h"
+ #include "langhooks.h"
+@@ -59,6 +60,7 @@
+ #include "params.h"
+ #include "opts.h"
+ #include "dumpfile.h"
++#include "gimple-expr.h"
+
+ /* Forward definitions of types. */
+ typedef struct minipool_node Mnode;
+@@ -94,6 +96,7 @@
+ static bool thumb_force_lr_save (void);
+ static unsigned arm_size_return_regs (void);
+ static bool arm_assemble_integer (rtx, unsigned int, int);
++static void arm_atomic_assign_expand_fenv (tree *hold, tree *clear, tree *update);
+ static void arm_print_operand (FILE *, rtx, int);
+ static void arm_print_operand_address (FILE *, rtx);
+ static bool arm_print_operand_punct_valid_p (unsigned char code);
+@@ -585,6 +588,9 @@
+ #undef TARGET_MANGLE_TYPE
+ #define TARGET_MANGLE_TYPE arm_mangle_type
+
++#undef TARGET_ATOMIC_ASSIGN_EXPAND_FENV
++#define TARGET_ATOMIC_ASSIGN_EXPAND_FENV arm_atomic_assign_expand_fenv
++
+ #undef TARGET_BUILD_BUILTIN_VA_LIST
+ #define TARGET_BUILD_BUILTIN_VA_LIST arm_build_builtin_va_list
+ #undef TARGET_EXPAND_BUILTIN_VA_START
+@@ -986,6 +992,7 @@
COSTS_N_INSNS (1), /* bfi. */
COSTS_N_INSNS (1), /* bfx. */
0, /* clz. */
@@ -12498,7 +27682,7 @@ LANG=C svn diff svn://gcc.gnu.org/svn/gcc/branches/gcc-4_9-branch@211979 \
0, /* non_exec. */
true /* non_exec_costs_exec. */
},
-@@ -1069,7 +1070,109 @@
+@@ -1069,7 +1076,109 @@
}
};
@@ -12608,7 +27792,7 @@ LANG=C svn diff svn://gcc.gnu.org/svn/gcc/branches/gcc-4_9-branch@211979 \
const struct cpu_cost_table cortexa7_extra_costs =
{
/* ALU */
-@@ -1087,6 +1190,7 @@
+@@ -1087,6 +1196,7 @@
COSTS_N_INSNS (1), /* bfi. */
COSTS_N_INSNS (1), /* bfx. */
COSTS_N_INSNS (1), /* clz. */
@@ -12616,7 +27800,7 @@ LANG=C svn diff svn://gcc.gnu.org/svn/gcc/branches/gcc-4_9-branch@211979 \
0, /* non_exec. */
true /* non_exec_costs_exec. */
},
-@@ -1188,6 +1292,7 @@
+@@ -1188,6 +1298,7 @@
0, /* bfi. */
COSTS_N_INSNS (1), /* bfx. */
COSTS_N_INSNS (1), /* clz. */
@@ -12624,7 +27808,7 @@ LANG=C svn diff svn://gcc.gnu.org/svn/gcc/branches/gcc-4_9-branch@211979 \
0, /* non_exec. */
true /* non_exec_costs_exec. */
},
-@@ -1288,6 +1393,7 @@
+@@ -1288,6 +1399,7 @@
COSTS_N_INSNS (1), /* bfi. */
0, /* bfx. */
0, /* clz. */
@@ -12632,7 +27816,7 @@ LANG=C svn diff svn://gcc.gnu.org/svn/gcc/branches/gcc-4_9-branch@211979 \
0, /* non_exec. */
true /* non_exec_costs_exec. */
},
-@@ -1388,6 +1494,7 @@
+@@ -1388,6 +1500,7 @@
0, /* bfi. */
0, /* bfx. */
0, /* clz. */
@@ -12640,7 +27824,7 @@ LANG=C svn diff svn://gcc.gnu.org/svn/gcc/branches/gcc-4_9-branch@211979 \
COSTS_N_INSNS (1), /* non_exec. */
false /* non_exec_costs_exec. */
},
-@@ -1484,7 +1591,8 @@
+@@ -1484,7 +1597,8 @@
false, /* Prefer LDRD/STRD. */
{true, true}, /* Prefer non short circuit. */
&arm_default_vec_cost, /* Vectorizer costs. */
@@ -12650,7 +27834,7 @@ LANG=C svn diff svn://gcc.gnu.org/svn/gcc/branches/gcc-4_9-branch@211979 \
};
const struct tune_params arm_fastmul_tune =
-@@ -1500,7 +1608,8 @@
+@@ -1500,7 +1614,8 @@
false, /* Prefer LDRD/STRD. */
{true, true}, /* Prefer non short circuit. */
&arm_default_vec_cost, /* Vectorizer costs. */
@@ -12660,7 +27844,7 @@ LANG=C svn diff svn://gcc.gnu.org/svn/gcc/branches/gcc-4_9-branch@211979 \
};
/* StrongARM has early execution of branches, so a sequence that is worth
-@@ -1519,7 +1628,8 @@
+@@ -1519,7 +1634,8 @@
false, /* Prefer LDRD/STRD. */
{true, true}, /* Prefer non short circuit. */
&arm_default_vec_cost, /* Vectorizer costs. */
@@ -12670,7 +27854,7 @@ LANG=C svn diff svn://gcc.gnu.org/svn/gcc/branches/gcc-4_9-branch@211979 \
};
const struct tune_params arm_xscale_tune =
-@@ -1535,7 +1645,8 @@
+@@ -1535,7 +1651,8 @@
false, /* Prefer LDRD/STRD. */
{true, true}, /* Prefer non short circuit. */
&arm_default_vec_cost, /* Vectorizer costs. */
@@ -12680,7 +27864,7 @@ LANG=C svn diff svn://gcc.gnu.org/svn/gcc/branches/gcc-4_9-branch@211979 \
};
const struct tune_params arm_9e_tune =
-@@ -1551,7 +1662,8 @@
+@@ -1551,7 +1668,8 @@
false, /* Prefer LDRD/STRD. */
{true, true}, /* Prefer non short circuit. */
&arm_default_vec_cost, /* Vectorizer costs. */
@@ -12690,7 +27874,7 @@ LANG=C svn diff svn://gcc.gnu.org/svn/gcc/branches/gcc-4_9-branch@211979 \
};
const struct tune_params arm_v6t2_tune =
-@@ -1567,7 +1679,8 @@
+@@ -1567,7 +1685,8 @@
false, /* Prefer LDRD/STRD. */
{true, true}, /* Prefer non short circuit. */
&arm_default_vec_cost, /* Vectorizer costs. */
@@ -12700,7 +27884,7 @@ LANG=C svn diff svn://gcc.gnu.org/svn/gcc/branches/gcc-4_9-branch@211979 \
};
/* Generic Cortex tuning. Use more specific tunings if appropriate. */
-@@ -1584,9 +1697,27 @@
+@@ -1584,9 +1703,27 @@
false, /* Prefer LDRD/STRD. */
{true, true}, /* Prefer non short circuit. */
&arm_default_vec_cost, /* Vectorizer costs. */
@@ -12729,7 +27913,7 @@ LANG=C svn diff svn://gcc.gnu.org/svn/gcc/branches/gcc-4_9-branch@211979 \
const struct tune_params arm_cortex_a7_tune =
{
arm_9e_rtx_costs,
-@@ -1600,7 +1731,8 @@
+@@ -1600,7 +1737,8 @@
false, /* Prefer LDRD/STRD. */
{true, true}, /* Prefer non short circuit. */
&arm_default_vec_cost, /* Vectorizer costs. */
@@ -12739,7 +27923,7 @@ LANG=C svn diff svn://gcc.gnu.org/svn/gcc/branches/gcc-4_9-branch@211979 \
};
const struct tune_params arm_cortex_a15_tune =
-@@ -1616,7 +1748,8 @@
+@@ -1616,7 +1754,8 @@
true, /* Prefer LDRD/STRD. */
{true, true}, /* Prefer non short circuit. */
&arm_default_vec_cost, /* Vectorizer costs. */
@@ -12749,7 +27933,7 @@ LANG=C svn diff svn://gcc.gnu.org/svn/gcc/branches/gcc-4_9-branch@211979 \
};
const struct tune_params arm_cortex_a53_tune =
-@@ -1632,7 +1765,8 @@
+@@ -1632,7 +1771,8 @@
false, /* Prefer LDRD/STRD. */
{true, true}, /* Prefer non short circuit. */
&arm_default_vec_cost, /* Vectorizer costs. */
@@ -12759,7 +27943,7 @@ LANG=C svn diff svn://gcc.gnu.org/svn/gcc/branches/gcc-4_9-branch@211979 \
};
const struct tune_params arm_cortex_a57_tune =
-@@ -1648,7 +1782,8 @@
+@@ -1648,7 +1788,8 @@
true, /* Prefer LDRD/STRD. */
{true, true}, /* Prefer non short circuit. */
&arm_default_vec_cost, /* Vectorizer costs. */
@@ -12769,7 +27953,7 @@ LANG=C svn diff svn://gcc.gnu.org/svn/gcc/branches/gcc-4_9-branch@211979 \
};
/* Branches can be dual-issued on Cortex-A5, so conditional execution is
-@@ -1667,7 +1802,8 @@
+@@ -1667,7 +1808,8 @@
false, /* Prefer LDRD/STRD. */
{false, false}, /* Prefer non short circuit. */
&arm_default_vec_cost, /* Vectorizer costs. */
@@ -12779,7 +27963,7 @@ LANG=C svn diff svn://gcc.gnu.org/svn/gcc/branches/gcc-4_9-branch@211979 \
};
const struct tune_params arm_cortex_a9_tune =
-@@ -1683,7 +1819,8 @@
+@@ -1683,7 +1825,8 @@
false, /* Prefer LDRD/STRD. */
{true, true}, /* Prefer non short circuit. */
&arm_default_vec_cost, /* Vectorizer costs. */
@@ -12789,7 +27973,7 @@ LANG=C svn diff svn://gcc.gnu.org/svn/gcc/branches/gcc-4_9-branch@211979 \
};
const struct tune_params arm_cortex_a12_tune =
-@@ -1699,7 +1836,8 @@
+@@ -1699,7 +1842,8 @@
true, /* Prefer LDRD/STRD. */
{true, true}, /* Prefer non short circuit. */
&arm_default_vec_cost, /* Vectorizer costs. */
@@ -12799,7 +27983,7 @@ LANG=C svn diff svn://gcc.gnu.org/svn/gcc/branches/gcc-4_9-branch@211979 \
};
/* armv7m tuning. On Cortex-M4 cores for example, MOVW/MOVT take a single
-@@ -1722,7 +1860,8 @@
+@@ -1722,7 +1866,8 @@
false, /* Prefer LDRD/STRD. */
{false, false}, /* Prefer non short circuit. */
&arm_default_vec_cost, /* Vectorizer costs. */
@@ -12809,7 +27993,7 @@ LANG=C svn diff svn://gcc.gnu.org/svn/gcc/branches/gcc-4_9-branch@211979 \
};
/* The arm_v6m_tune is duplicated from arm_cortex_tune, rather than
-@@ -1740,7 +1879,8 @@
+@@ -1740,7 +1885,8 @@
false, /* Prefer LDRD/STRD. */
{false, false}, /* Prefer non short circuit. */
&arm_default_vec_cost, /* Vectorizer costs. */
@@ -12819,7 +28003,7 @@ LANG=C svn diff svn://gcc.gnu.org/svn/gcc/branches/gcc-4_9-branch@211979 \
};
const struct tune_params arm_fa726te_tune =
-@@ -1756,7 +1896,8 @@
+@@ -1756,7 +1902,8 @@
false, /* Prefer LDRD/STRD. */
{true, true}, /* Prefer non short circuit. */
&arm_default_vec_cost, /* Vectorizer costs. */
@@ -12829,7 +28013,16 @@ LANG=C svn diff svn://gcc.gnu.org/svn/gcc/branches/gcc-4_9-branch@211979 \
};
-@@ -6080,11 +6221,6 @@
+@@ -2807,7 +2954,7 @@
+ prefer_neon_for_64bits = true;
+
+ /* Use the alternative scheduling-pressure algorithm by default. */
+- maybe_set_param_value (PARAM_SCHED_PRESSURE_ALGORITHM, 2,
++ maybe_set_param_value (PARAM_SCHED_PRESSURE_ALGORITHM, SCHED_PRESSURE_MODEL,
+ global_options.x_param_values,
+ global_options_set.x_param_values);
+
+@@ -6080,11 +6227,6 @@
if (TARGET_VXWORKS_RTP && flag_pic && !targetm.binds_local_p (decl))
return false;
@@ -12841,7 +28034,7 @@ LANG=C svn diff svn://gcc.gnu.org/svn/gcc/branches/gcc-4_9-branch@211979 \
/* If we are interworking and the function is not declared static
then we can't tail-call it unless we know that it exists in this
compilation unit (since it might be a Thumb routine). */
-@@ -9338,6 +9474,47 @@
+@@ -9338,6 +9480,47 @@
*cost = LIBCALL_COST (2);
return false;
@@ -12889,7 +28082,7 @@ LANG=C svn diff svn://gcc.gnu.org/svn/gcc/branches/gcc-4_9-branch@211979 \
case MINUS:
if (TARGET_HARD_FLOAT && GET_MODE_CLASS (mode) == MODE_FLOAT
&& (mode == SFmode || !TARGET_VFP_SINGLE))
-@@ -9720,8 +9897,17 @@
+@@ -9720,8 +9903,17 @@
/* Vector mode? */
*cost = LIBCALL_COST (2);
return false;
@@ -12908,7 +28101,7 @@ LANG=C svn diff svn://gcc.gnu.org/svn/gcc/branches/gcc-4_9-branch@211979 \
if (mode == SImode)
{
enum rtx_code subcode = GET_CODE (XEXP (x, 0));
-@@ -10620,6 +10806,36 @@
+@@ -10620,6 +10812,36 @@
*cost = LIBCALL_COST (1);
return false;
@@ -12945,7 +28138,7 @@ LANG=C svn diff svn://gcc.gnu.org/svn/gcc/branches/gcc-4_9-branch@211979 \
case FIX:
case UNSIGNED_FIX:
if (TARGET_HARD_FLOAT)
-@@ -10670,10 +10886,16 @@
+@@ -10670,10 +10892,16 @@
return true;
case ASM_OPERANDS:
@@ -12965,7 +28158,7 @@ LANG=C svn diff svn://gcc.gnu.org/svn/gcc/branches/gcc-4_9-branch@211979 \
default:
if (mode != VOIDmode)
*cost = COSTS_N_INSNS (ARM_NUM_REGS (mode));
-@@ -16787,9 +17009,20 @@
+@@ -16788,9 +17016,20 @@
compute_bb_for_insn ();
df_analyze ();
@@ -12986,7 +28179,7 @@ LANG=C svn diff svn://gcc.gnu.org/svn/gcc/branches/gcc-4_9-branch@211979 \
COPY_REG_SET (&live, DF_LR_OUT (bb));
df_simulate_initialize_backwards (bb, &live);
-@@ -16799,7 +17032,7 @@
+@@ -16800,7 +17039,7 @@
&& !REGNO_REG_SET_P (&live, CC_REGNUM)
&& GET_CODE (PATTERN (insn)) == SET)
{
@@ -12995,7 +28188,7 @@ LANG=C svn diff svn://gcc.gnu.org/svn/gcc/branches/gcc-4_9-branch@211979 \
rtx pat = PATTERN (insn);
rtx dst = XEXP (pat, 0);
rtx src = XEXP (pat, 1);
-@@ -16880,10 +17113,11 @@
+@@ -16881,10 +17120,11 @@
/* ANDS <Rdn>,<Rm> */
if (rtx_equal_p (dst, op0)
&& low_register_operand (op1, SImode))
@@ -13009,7 +28202,7 @@ LANG=C svn diff svn://gcc.gnu.org/svn/gcc/branches/gcc-4_9-branch@211979 \
break;
case ASHIFTRT:
-@@ -16894,7 +17128,7 @@
+@@ -16895,7 +17135,7 @@
/* LSLS <Rdn>,<Rm> */
if (rtx_equal_p (dst, op0)
&& low_register_operand (op1, SImode))
@@ -13018,7 +28211,7 @@ LANG=C svn diff svn://gcc.gnu.org/svn/gcc/branches/gcc-4_9-branch@211979 \
/* ASRS <Rd>,<Rm>,#<imm5> */
/* LSRS <Rd>,<Rm>,#<imm5> */
/* LSLS <Rd>,<Rm>,#<imm5> */
-@@ -16901,7 +17135,7 @@
+@@ -16902,7 +17142,7 @@
else if (low_register_operand (op0, SImode)
&& CONST_INT_P (op1)
&& IN_RANGE (INTVAL (op1), 0, 31))
@@ -13027,7 +28220,7 @@ LANG=C svn diff svn://gcc.gnu.org/svn/gcc/branches/gcc-4_9-branch@211979 \
break;
case ROTATERT:
-@@ -16908,12 +17142,16 @@
+@@ -16909,12 +17149,16 @@
/* RORS <Rdn>,<Rm> */
if (rtx_equal_p (dst, op0)
&& low_register_operand (op1, SImode))
@@ -13046,7 +28239,7 @@ LANG=C svn diff svn://gcc.gnu.org/svn/gcc/branches/gcc-4_9-branch@211979 \
/* NEGS <Rd>,<Rm> (a.k.a RSBS) */
if (low_register_operand (op0, SImode))
action = CONV;
-@@ -16923,7 +17161,7 @@
+@@ -16924,7 +17168,7 @@
/* MOVS <Rd>,#<imm8> */
if (CONST_INT_P (src)
&& IN_RANGE (INTVAL (src), 0, 255))
@@ -13055,7 +28248,44 @@ LANG=C svn diff svn://gcc.gnu.org/svn/gcc/branches/gcc-4_9-branch@211979 \
break;
case REG:
-@@ -21421,7 +21659,7 @@
+@@ -21040,7 +21284,15 @@
+ }
+
+
+-/* If CODE is 'd', then the X is a condition operand and the instruction
++/* Globally reserved letters: acln
++ Puncutation letters currently used: @_|?().!#
++ Lower case letters currently used: bcdefhimpqtvwxyz
++ Upper case letters currently used: ABCDFGHJKLMNOPQRSTU
++ Letters previously used, but now deprecated/obsolete: sVWXYZ.
++
++ Note that the global reservation for 'c' is only for CONSTANT_ADDRESS_P.
++
++ If CODE is 'd', then the X is a condition operand and the instruction
+ should only be executed if the condition is true.
+ if CODE is 'D', then the X is a condition operand and the instruction
+ should only be executed if the condition is false: however, if the mode
+@@ -21180,6 +21432,19 @@
+ }
+ return;
+
++ case 'b':
++ /* Print the log2 of a CONST_INT. */
++ {
++ HOST_WIDE_INT val;
++
++ if (!CONST_INT_P (x)
++ || (val = exact_log2 (INTVAL (x) & 0xffffffff)) < 0)
++ output_operand_lossage ("Unsupported operand for code '%c'", code);
++ else
++ fprintf (stream, "#" HOST_WIDE_INT_PRINT_DEC, val);
++ }
++ return;
++
+ case 'L':
+ /* The low 16 bits of an immediate constant. */
+ fprintf (stream, HOST_WIDE_INT_PRINT_DEC, INTVAL(x) & 0xffff);
+@@ -21422,7 +21687,7 @@
register. */
case 'p':
{
@@ -13064,7 +28294,7 @@ LANG=C svn diff svn://gcc.gnu.org/svn/gcc/branches/gcc-4_9-branch@211979 \
int regno;
if (GET_MODE_SIZE (mode) != 8 || !REG_P (x))
-@@ -21445,7 +21683,7 @@
+@@ -21446,7 +21711,7 @@
case 'P':
case 'q':
{
@@ -13073,7 +28303,7 @@ LANG=C svn diff svn://gcc.gnu.org/svn/gcc/branches/gcc-4_9-branch@211979 \
int is_quad = (code == 'q');
int regno;
-@@ -21481,7 +21719,7 @@
+@@ -21482,7 +21747,7 @@
case 'e':
case 'f':
{
@@ -13082,7 +28312,7 @@ LANG=C svn diff svn://gcc.gnu.org/svn/gcc/branches/gcc-4_9-branch@211979 \
int regno;
if ((GET_MODE_SIZE (mode) != 16
-@@ -21614,7 +21852,7 @@
+@@ -21615,7 +21880,7 @@
/* Translate an S register number into a D register number and element index. */
case 'y':
{
@@ -13091,7 +28321,7 @@ LANG=C svn diff svn://gcc.gnu.org/svn/gcc/branches/gcc-4_9-branch@211979 \
int regno;
if (GET_MODE_SIZE (mode) != 4 || !REG_P (x))
-@@ -21648,7 +21886,7 @@
+@@ -21649,7 +21914,7 @@
number into a D register number and element index. */
case 'z':
{
@@ -13100,7 +28330,7 @@ LANG=C svn diff svn://gcc.gnu.org/svn/gcc/branches/gcc-4_9-branch@211979 \
int regno;
if (GET_MODE_SIZE (mode) != 2 || !REG_P (x))
-@@ -22609,13 +22847,20 @@
+@@ -22610,13 +22875,20 @@
}
/* We allow almost any value to be stored in the general registers.
@@ -13126,7 +28356,358 @@ LANG=C svn diff svn://gcc.gnu.org/svn/gcc/branches/gcc-4_9-branch@211979 \
if (regno == FRAME_POINTER_REGNUM
|| regno == ARG_POINTER_REGNUM)
/* We only allow integers in the fake hard registers. */
-@@ -25888,7 +26133,7 @@
+@@ -22827,6 +23099,7 @@
+ NEON_BINOP,
+ NEON_TERNOP,
+ NEON_UNOP,
++ NEON_BSWAP,
+ NEON_GETLANE,
+ NEON_SETLANE,
+ NEON_CREATE,
+@@ -22848,7 +23121,6 @@
+ NEON_FLOAT_NARROW,
+ NEON_FIXCONV,
+ NEON_SELECT,
+- NEON_RESULTPAIR,
+ NEON_REINTERP,
+ NEON_VTBL,
+ NEON_VTBX,
+@@ -23217,6 +23489,9 @@
+ ARM_BUILTIN_CRC32CH,
+ ARM_BUILTIN_CRC32CW,
+
++ ARM_BUILTIN_GET_FPSCR,
++ ARM_BUILTIN_SET_FPSCR,
++
+ #undef CRYPTO1
+ #undef CRYPTO2
+ #undef CRYPTO3
+@@ -23294,14 +23569,19 @@
+
+ tree V8QI_type_node;
+ tree V4HI_type_node;
++ tree V4UHI_type_node;
+ tree V4HF_type_node;
+ tree V2SI_type_node;
++ tree V2USI_type_node;
+ tree V2SF_type_node;
+ tree V16QI_type_node;
+ tree V8HI_type_node;
++ tree V8UHI_type_node;
+ tree V4SI_type_node;
++ tree V4USI_type_node;
+ tree V4SF_type_node;
+ tree V2DI_type_node;
++ tree V2UDI_type_node;
+
+ tree intUQI_type_node;
+ tree intUHI_type_node;
+@@ -23313,27 +23593,6 @@
+ tree intCI_type_node;
+ tree intXI_type_node;
+
+- tree V8QI_pointer_node;
+- tree V4HI_pointer_node;
+- tree V2SI_pointer_node;
+- tree V2SF_pointer_node;
+- tree V16QI_pointer_node;
+- tree V8HI_pointer_node;
+- tree V4SI_pointer_node;
+- tree V4SF_pointer_node;
+- tree V2DI_pointer_node;
+-
+- tree void_ftype_pv8qi_v8qi_v8qi;
+- tree void_ftype_pv4hi_v4hi_v4hi;
+- tree void_ftype_pv2si_v2si_v2si;
+- tree void_ftype_pv2sf_v2sf_v2sf;
+- tree void_ftype_pdi_di_di;
+- tree void_ftype_pv16qi_v16qi_v16qi;
+- tree void_ftype_pv8hi_v8hi_v8hi;
+- tree void_ftype_pv4si_v4si_v4si;
+- tree void_ftype_pv4sf_v4sf_v4sf;
+- tree void_ftype_pv2di_v2di_v2di;
+-
+ tree reinterp_ftype_dreg[NUM_DREG_TYPES][NUM_DREG_TYPES];
+ tree reinterp_ftype_qreg[NUM_QREG_TYPES][NUM_QREG_TYPES];
+ tree dreg_types[NUM_DREG_TYPES], qreg_types[NUM_QREG_TYPES];
+@@ -23397,6 +23656,12 @@
+ const_intDI_pointer_node = build_pointer_type (const_intDI_node);
+ const_float_pointer_node = build_pointer_type (const_float_node);
+
++ /* Unsigned integer types for various mode sizes. */
++ intUQI_type_node = make_unsigned_type (GET_MODE_PRECISION (QImode));
++ intUHI_type_node = make_unsigned_type (GET_MODE_PRECISION (HImode));
++ intUSI_type_node = make_unsigned_type (GET_MODE_PRECISION (SImode));
++ intUDI_type_node = make_unsigned_type (GET_MODE_PRECISION (DImode));
++ neon_intUTI_type_node = make_unsigned_type (GET_MODE_PRECISION (TImode));
+ /* Now create vector types based on our NEON element types. */
+ /* 64-bit vectors. */
+ V8QI_type_node =
+@@ -23403,10 +23668,14 @@
+ build_vector_type_for_mode (neon_intQI_type_node, V8QImode);
+ V4HI_type_node =
+ build_vector_type_for_mode (neon_intHI_type_node, V4HImode);
++ V4UHI_type_node =
++ build_vector_type_for_mode (intUHI_type_node, V4HImode);
+ V4HF_type_node =
+ build_vector_type_for_mode (neon_floatHF_type_node, V4HFmode);
+ V2SI_type_node =
+ build_vector_type_for_mode (neon_intSI_type_node, V2SImode);
++ V2USI_type_node =
++ build_vector_type_for_mode (intUSI_type_node, V2SImode);
+ V2SF_type_node =
+ build_vector_type_for_mode (neon_float_type_node, V2SFmode);
+ /* 128-bit vectors. */
+@@ -23414,21 +23683,20 @@
+ build_vector_type_for_mode (neon_intQI_type_node, V16QImode);
+ V8HI_type_node =
+ build_vector_type_for_mode (neon_intHI_type_node, V8HImode);
++ V8UHI_type_node =
++ build_vector_type_for_mode (intUHI_type_node, V8HImode);
+ V4SI_type_node =
+ build_vector_type_for_mode (neon_intSI_type_node, V4SImode);
++ V4USI_type_node =
++ build_vector_type_for_mode (intUSI_type_node, V4SImode);
+ V4SF_type_node =
+ build_vector_type_for_mode (neon_float_type_node, V4SFmode);
+ V2DI_type_node =
+ build_vector_type_for_mode (neon_intDI_type_node, V2DImode);
++ V2UDI_type_node =
++ build_vector_type_for_mode (intUDI_type_node, V2DImode);
+
+- /* Unsigned integer types for various mode sizes. */
+- intUQI_type_node = make_unsigned_type (GET_MODE_PRECISION (QImode));
+- intUHI_type_node = make_unsigned_type (GET_MODE_PRECISION (HImode));
+- intUSI_type_node = make_unsigned_type (GET_MODE_PRECISION (SImode));
+- intUDI_type_node = make_unsigned_type (GET_MODE_PRECISION (DImode));
+- neon_intUTI_type_node = make_unsigned_type (GET_MODE_PRECISION (TImode));
+
+-
+ (*lang_hooks.types.register_builtin_type) (intUQI_type_node,
+ "__builtin_neon_uqi");
+ (*lang_hooks.types.register_builtin_type) (intUHI_type_node,
+@@ -23459,53 +23727,8 @@
+ (*lang_hooks.types.register_builtin_type) (intXI_type_node,
+ "__builtin_neon_xi");
+
+- /* Pointers to vector types. */
+- V8QI_pointer_node = build_pointer_type (V8QI_type_node);
+- V4HI_pointer_node = build_pointer_type (V4HI_type_node);
+- V2SI_pointer_node = build_pointer_type (V2SI_type_node);
+- V2SF_pointer_node = build_pointer_type (V2SF_type_node);
+- V16QI_pointer_node = build_pointer_type (V16QI_type_node);
+- V8HI_pointer_node = build_pointer_type (V8HI_type_node);
+- V4SI_pointer_node = build_pointer_type (V4SI_type_node);
+- V4SF_pointer_node = build_pointer_type (V4SF_type_node);
+- V2DI_pointer_node = build_pointer_type (V2DI_type_node);
+-
+- /* Operations which return results as pairs. */
+- void_ftype_pv8qi_v8qi_v8qi =
+- build_function_type_list (void_type_node, V8QI_pointer_node, V8QI_type_node,
+- V8QI_type_node, NULL);
+- void_ftype_pv4hi_v4hi_v4hi =
+- build_function_type_list (void_type_node, V4HI_pointer_node, V4HI_type_node,
+- V4HI_type_node, NULL);
+- void_ftype_pv2si_v2si_v2si =
+- build_function_type_list (void_type_node, V2SI_pointer_node, V2SI_type_node,
+- V2SI_type_node, NULL);
+- void_ftype_pv2sf_v2sf_v2sf =
+- build_function_type_list (void_type_node, V2SF_pointer_node, V2SF_type_node,
+- V2SF_type_node, NULL);
+- void_ftype_pdi_di_di =
+- build_function_type_list (void_type_node, intDI_pointer_node,
+- neon_intDI_type_node, neon_intDI_type_node, NULL);
+- void_ftype_pv16qi_v16qi_v16qi =
+- build_function_type_list (void_type_node, V16QI_pointer_node,
+- V16QI_type_node, V16QI_type_node, NULL);
+- void_ftype_pv8hi_v8hi_v8hi =
+- build_function_type_list (void_type_node, V8HI_pointer_node, V8HI_type_node,
+- V8HI_type_node, NULL);
+- void_ftype_pv4si_v4si_v4si =
+- build_function_type_list (void_type_node, V4SI_pointer_node, V4SI_type_node,
+- V4SI_type_node, NULL);
+- void_ftype_pv4sf_v4sf_v4sf =
+- build_function_type_list (void_type_node, V4SF_pointer_node, V4SF_type_node,
+- V4SF_type_node, NULL);
+- void_ftype_pv2di_v2di_v2di =
+- build_function_type_list (void_type_node, V2DI_pointer_node, V2DI_type_node,
+- V2DI_type_node, NULL);
+-
+ if (TARGET_CRYPTO && TARGET_HARD_FLOAT)
+ {
+- tree V4USI_type_node =
+- build_vector_type_for_mode (intUSI_type_node, V4SImode);
+
+ tree V16UQI_type_node =
+ build_vector_type_for_mode (intUQI_type_node, V16QImode);
+@@ -23791,25 +24014,6 @@
+ }
+ break;
+
+- case NEON_RESULTPAIR:
+- {
+- switch (insn_data[d->code].operand[1].mode)
+- {
+- case V8QImode: ftype = void_ftype_pv8qi_v8qi_v8qi; break;
+- case V4HImode: ftype = void_ftype_pv4hi_v4hi_v4hi; break;
+- case V2SImode: ftype = void_ftype_pv2si_v2si_v2si; break;
+- case V2SFmode: ftype = void_ftype_pv2sf_v2sf_v2sf; break;
+- case DImode: ftype = void_ftype_pdi_di_di; break;
+- case V16QImode: ftype = void_ftype_pv16qi_v16qi_v16qi; break;
+- case V8HImode: ftype = void_ftype_pv8hi_v8hi_v8hi; break;
+- case V4SImode: ftype = void_ftype_pv4si_v4si_v4si; break;
+- case V4SFmode: ftype = void_ftype_pv4sf_v4sf_v4sf; break;
+- case V2DImode: ftype = void_ftype_pv2di_v2di_v2di; break;
+- default: gcc_unreachable ();
+- }
+- }
+- break;
+-
+ case NEON_REINTERP:
+ {
+ /* We iterate over NUM_DREG_TYPES doubleword types,
+@@ -23869,6 +24073,31 @@
+ ftype = build_function_type_list (return_type, eltype, NULL);
+ break;
+ }
++ case NEON_BSWAP:
++ {
++ tree eltype = NULL_TREE;
++ switch (insn_data[d->code].operand[1].mode)
++ {
++ case V4HImode:
++ eltype = V4UHI_type_node;
++ break;
++ case V8HImode:
++ eltype = V8UHI_type_node;
++ break;
++ case V2SImode:
++ eltype = V2USI_type_node;
++ break;
++ case V4SImode:
++ eltype = V4USI_type_node;
++ break;
++ case V2DImode:
++ eltype = V2UDI_type_node;
++ break;
++ default: gcc_unreachable ();
++ }
++ ftype = build_function_type_list (eltype, eltype, NULL);
++ break;
++ }
+ default:
+ gcc_unreachable ();
+ }
+@@ -24015,6 +24244,15 @@
+ IWMMXT_BUILTIN2 (iwmmxt_wmacuz, WMACUZ)
+ IWMMXT_BUILTIN2 (iwmmxt_wmacsz, WMACSZ)
+
++
++#define FP_BUILTIN(L, U) \
++ {0, CODE_FOR_##L, "__builtin_arm_"#L, ARM_BUILTIN_##U, \
++ UNKNOWN, 0},
++
++ FP_BUILTIN (set_fpscr, GET_FPSCR)
++ FP_BUILTIN (get_fpscr, SET_FPSCR)
++#undef FP_BUILTIN
++
+ #define CRC32_BUILTIN(L, U) \
+ {0, CODE_FOR_##L, "__builtin_arm_"#L, ARM_BUILTIN_##U, \
+ UNKNOWN, 0},
+@@ -24529,6 +24767,21 @@
+
+ if (TARGET_CRC32)
+ arm_init_crc32_builtins ();
++
++ if (TARGET_VFP)
++ {
++ tree ftype_set_fpscr
++ = build_function_type_list (void_type_node, unsigned_type_node, NULL);
++ tree ftype_get_fpscr
++ = build_function_type_list (unsigned_type_node, NULL);
++
++ arm_builtin_decls[ARM_BUILTIN_GET_FPSCR]
++ = add_builtin_function ("__builtin_arm_ldfscr", ftype_get_fpscr,
++ ARM_BUILTIN_GET_FPSCR, BUILT_IN_MD, NULL, NULL_TREE);
++ arm_builtin_decls[ARM_BUILTIN_SET_FPSCR]
++ = add_builtin_function ("__builtin_arm_stfscr", ftype_set_fpscr,
++ ARM_BUILTIN_SET_FPSCR, BUILT_IN_MD, NULL, NULL_TREE);
++ }
+ }
+
+ /* Return the ARM builtin for CODE. */
+@@ -25043,6 +25296,7 @@
+ case NEON_SPLIT:
+ case NEON_FLOAT_WIDEN:
+ case NEON_FLOAT_NARROW:
++ case NEON_BSWAP:
+ case NEON_REINTERP:
+ return arm_expand_neon_args (target, icode, 1, type_mode, exp, fcode,
+ NEON_ARG_COPY_TO_REG, NEON_ARG_STOP);
+@@ -25052,11 +25306,6 @@
+ return arm_expand_neon_args (target, icode, 1, type_mode, exp, fcode,
+ NEON_ARG_COPY_TO_REG, NEON_ARG_COPY_TO_REG, NEON_ARG_STOP);
+
+- case NEON_RESULTPAIR:
+- return arm_expand_neon_args (target, icode, 0, type_mode, exp, fcode,
+- NEON_ARG_COPY_TO_REG, NEON_ARG_COPY_TO_REG, NEON_ARG_COPY_TO_REG,
+- NEON_ARG_STOP);
+-
+ case NEON_LANEMUL:
+ case NEON_LANEMULL:
+ case NEON_LANEMULH:
+@@ -25118,24 +25367,6 @@
+ emit_move_insn (dest, gen_lowpart (GET_MODE (dest), src));
+ }
+
+-/* Emit code to place a Neon pair result in memory locations (with equal
+- registers). */
+-void
+-neon_emit_pair_result_insn (enum machine_mode mode,
+- rtx (*intfn) (rtx, rtx, rtx, rtx), rtx destaddr,
+- rtx op1, rtx op2)
+-{
+- rtx mem = gen_rtx_MEM (mode, destaddr);
+- rtx tmp1 = gen_reg_rtx (mode);
+- rtx tmp2 = gen_reg_rtx (mode);
+-
+- emit_insn (intfn (tmp1, op1, op2, tmp2));
+-
+- emit_move_insn (mem, tmp1);
+- mem = adjust_address (mem, mode, GET_MODE_SIZE (mode));
+- emit_move_insn (mem, tmp2);
+-}
+-
+ /* Set up OPERANDS for a register copy from SRC to DEST, taking care
+ not to early-clobber SRC registers in the process.
+
+@@ -25256,6 +25487,25 @@
+
+ switch (fcode)
+ {
++ case ARM_BUILTIN_GET_FPSCR:
++ case ARM_BUILTIN_SET_FPSCR:
++ if (fcode == ARM_BUILTIN_GET_FPSCR)
++ {
++ icode = CODE_FOR_get_fpscr;
++ target = gen_reg_rtx (SImode);
++ pat = GEN_FCN (icode) (target);
++ }
++ else
++ {
++ target = NULL_RTX;
++ icode = CODE_FOR_set_fpscr;
++ arg0 = CALL_EXPR_ARG (exp, 0);
++ op0 = expand_normal (arg0);
++ pat = GEN_FCN (icode) (op0);
++ }
++ emit_insn (pat);
++ return target;
++
+ case ARM_BUILTIN_TEXTRMSB:
+ case ARM_BUILTIN_TEXTRMUB:
+ case ARM_BUILTIN_TEXTRMSH:
+@@ -25889,7 +26139,7 @@
int pops_needed;
unsigned available;
unsigned required;
@@ -13135,6 +28716,159 @@ LANG=C svn diff svn://gcc.gnu.org/svn/gcc/branches/gcc-4_9-branch@211979 \
int size;
int restore_a4 = FALSE;
+@@ -29550,8 +29800,7 @@
+ int in_n, out_n;
+
+ if (TREE_CODE (type_out) != VECTOR_TYPE
+- || TREE_CODE (type_in) != VECTOR_TYPE
+- || !(TARGET_NEON && TARGET_FPU_ARMV8 && flag_unsafe_math_optimizations))
++ || TREE_CODE (type_in) != VECTOR_TYPE)
+ return NULL_TREE;
+
+ out_mode = TYPE_MODE (TREE_TYPE (type_out));
+@@ -29563,7 +29812,13 @@
+ decl of the vectorized builtin for the appropriate vector mode.
+ NULL_TREE is returned if no such builtin is available. */
+ #undef ARM_CHECK_BUILTIN_MODE
+-#define ARM_CHECK_BUILTIN_MODE(C) \
++#define ARM_CHECK_BUILTIN_MODE(C) \
++ (TARGET_NEON && TARGET_FPU_ARMV8 \
++ && flag_unsafe_math_optimizations \
++ && ARM_CHECK_BUILTIN_MODE_1 (C))
++
++#undef ARM_CHECK_BUILTIN_MODE_1
++#define ARM_CHECK_BUILTIN_MODE_1(C) \
+ (out_mode == SFmode && out_n == C \
+ && in_mode == SFmode && in_n == C)
+
+@@ -29588,6 +29843,30 @@
+ return ARM_FIND_VRINT_VARIANT (vrintz);
+ case BUILT_IN_ROUNDF:
+ return ARM_FIND_VRINT_VARIANT (vrinta);
++#undef ARM_CHECK_BUILTIN_MODE
++#define ARM_CHECK_BUILTIN_MODE(C, N) \
++ (out_mode == N##Imode && out_n == C \
++ && in_mode == N##Imode && in_n == C)
++ case BUILT_IN_BSWAP16:
++ if (ARM_CHECK_BUILTIN_MODE (4, H))
++ return arm_builtin_decl (ARM_BUILTIN_NEON_bswapv4hi, false);
++ else if (ARM_CHECK_BUILTIN_MODE (8, H))
++ return arm_builtin_decl (ARM_BUILTIN_NEON_bswapv8hi, false);
++ else
++ return NULL_TREE;
++ case BUILT_IN_BSWAP32:
++ if (ARM_CHECK_BUILTIN_MODE (2, S))
++ return arm_builtin_decl (ARM_BUILTIN_NEON_bswapv2si, false);
++ else if (ARM_CHECK_BUILTIN_MODE (4, S))
++ return arm_builtin_decl (ARM_BUILTIN_NEON_bswapv4si, false);
++ else
++ return NULL_TREE;
++ case BUILT_IN_BSWAP64:
++ if (ARM_CHECK_BUILTIN_MODE (2, D))
++ return arm_builtin_decl (ARM_BUILTIN_NEON_bswapv2di, false);
++ else
++ return NULL_TREE;
++
+ default:
+ return NULL_TREE;
+ }
+@@ -31167,4 +31446,73 @@
+ return false;
+ }
+
++static void
++arm_atomic_assign_expand_fenv (tree *hold, tree *clear, tree *update)
++{
++ const unsigned ARM_FE_INVALID = 1;
++ const unsigned ARM_FE_DIVBYZERO = 2;
++ const unsigned ARM_FE_OVERFLOW = 4;
++ const unsigned ARM_FE_UNDERFLOW = 8;
++ const unsigned ARM_FE_INEXACT = 16;
++ const unsigned HOST_WIDE_INT ARM_FE_ALL_EXCEPT = (ARM_FE_INVALID
++ | ARM_FE_DIVBYZERO
++ | ARM_FE_OVERFLOW
++ | ARM_FE_UNDERFLOW
++ | ARM_FE_INEXACT);
++ const unsigned HOST_WIDE_INT ARM_FE_EXCEPT_SHIFT = 8;
++ tree fenv_var, get_fpscr, set_fpscr, mask, ld_fenv, masked_fenv;
++ tree new_fenv_var, reload_fenv, restore_fnenv;
++ tree update_call, atomic_feraiseexcept, hold_fnclex;
++
++ if (!TARGET_VFP)
++ return;
++
++ /* Generate the equivalent of :
++ unsigned int fenv_var;
++ fenv_var = __builtin_arm_get_fpscr ();
++
++ unsigned int masked_fenv;
++ masked_fenv = fenv_var & mask;
++
++ __builtin_arm_set_fpscr (masked_fenv); */
++
++ fenv_var = create_tmp_var (unsigned_type_node, NULL);
++ get_fpscr = arm_builtin_decls[ARM_BUILTIN_GET_FPSCR];
++ set_fpscr = arm_builtin_decls[ARM_BUILTIN_SET_FPSCR];
++ mask = build_int_cst (unsigned_type_node,
++ ~((ARM_FE_ALL_EXCEPT << ARM_FE_EXCEPT_SHIFT)
++ | ARM_FE_ALL_EXCEPT));
++ ld_fenv = build2 (MODIFY_EXPR, unsigned_type_node,
++ fenv_var, build_call_expr (get_fpscr, 0));
++ masked_fenv = build2 (BIT_AND_EXPR, unsigned_type_node, fenv_var, mask);
++ hold_fnclex = build_call_expr (set_fpscr, 1, masked_fenv);
++ *hold = build2 (COMPOUND_EXPR, void_type_node,
++ build2 (COMPOUND_EXPR, void_type_node, masked_fenv, ld_fenv),
++ hold_fnclex);
++
++ /* Store the value of masked_fenv to clear the exceptions:
++ __builtin_arm_set_fpscr (masked_fenv); */
++
++ *clear = build_call_expr (set_fpscr, 1, masked_fenv);
++
++ /* Generate the equivalent of :
++ unsigned int new_fenv_var;
++ new_fenv_var = __builtin_arm_get_fpscr ();
++
++ __builtin_arm_set_fpscr (fenv_var);
++
++ __atomic_feraiseexcept (new_fenv_var); */
++
++ new_fenv_var = create_tmp_var (unsigned_type_node, NULL);
++ reload_fenv = build2 (MODIFY_EXPR, unsigned_type_node, new_fenv_var,
++ build_call_expr (get_fpscr, 0));
++ restore_fnenv = build_call_expr (set_fpscr, 1, fenv_var);
++ atomic_feraiseexcept = builtin_decl_implicit (BUILT_IN_ATOMIC_FERAISEEXCEPT);
++ update_call = build_call_expr (atomic_feraiseexcept, 1,
++ fold_convert (integer_type_node, new_fenv_var));
++ *update = build2 (COMPOUND_EXPR, void_type_node,
++ build2 (COMPOUND_EXPR, void_type_node,
++ reload_fenv, restore_fnenv), update_call);
++}
++
+ #include "gt-arm.h"
+--- a/src/gcc/config/arm/unspecs.md
++++ b/src/gcc/config/arm/unspecs.md
+@@ -143,6 +143,8 @@
+ VUNSPEC_SLX ; Represent a store-register-release-exclusive.
+ VUNSPEC_LDA ; Represent a store-register-acquire.
+ VUNSPEC_STL ; Represent a store-register-release.
++ VUNSPEC_GET_FPSCR ; Represent fetch of FPSCR content.
++ VUNSPEC_SET_FPSCR ; Represent assign of FPSCR content.
+ ])
+
+ ;; Enumerators for NEON unspecs.
+--- a/src/gcc/config/arm/arm-modes.def
++++ b/src/gcc/config/arm/arm-modes.def
+@@ -21,9 +21,6 @@
+ along with GCC; see the file COPYING3. If not see
+ <http://www.gnu.org/licenses/>. */
+
+-/* Extended precision floating point.
+- FIXME What format is this? */
+-FLOAT_MODE (XF, 12, 0);
+
+ /* Half-precision floating point */
+ FLOAT_MODE (HF, 2, 0);
--- a/src/gcc/config/arm/arm-cores.def
+++ b/src/gcc/config/arm/arm-cores.def
@@ -141,7 +141,7 @@
@@ -13160,6 +28894,280 @@ LANG=C svn diff svn://gcc.gnu.org/svn/gcc/branches/gcc-4_9-branch@211979 \
};
extern const struct tune_params *current_tune;
+--- a/src/gcc/config/arm/vfp.md
++++ b/src/gcc/config/arm/vfp.md
+@@ -100,7 +100,7 @@
+ "
+ [(set_attr "predicable" "yes")
+ (set_attr "predicable_short_it" "yes,no,yes,no,no,no,no,no,no,no,no,no,no,no")
+- (set_attr "type" "mov_reg,mov_reg,mov_reg,mvn_reg,mov_reg,load1,load1,store1,store1,f_mcr,f_mrc,fmov,f_loads,f_stores")
++ (set_attr "type" "mov_reg,mov_reg,mov_reg,mvn_reg,mov_imm,load1,load1,store1,store1,f_mcr,f_mrc,fmov,f_loads,f_stores")
+ (set_attr "length" "2,4,2,4,4,4,4,4,4,4,4,4,4,4")
+ (set_attr "pool_range" "*,*,*,*,*,1018,4094,*,*,*,*,*,1018,*")
+ (set_attr "neg_pool_range" "*,*,*,*,*, 0, 0,*,*,*,*,*,1008,*")]
+@@ -1322,6 +1322,22 @@
+ (set_attr "conds" "unconditional")]
+ )
+
++;; Write Floating-point Status and Control Register.
++(define_insn "set_fpscr"
++ [(unspec_volatile [(match_operand:SI 0 "register_operand" "r")] VUNSPEC_SET_FPSCR)]
++ "TARGET_VFP"
++ "mcr\\tp10, 7, %0, cr1, cr0, 0\\t @SET_FPSCR"
++ [(set_attr "type" "mrs")])
++
++;; Read Floating-point Status and Control Register.
++(define_insn "get_fpscr"
++ [(set (match_operand:SI 0 "register_operand" "=r")
++ (unspec_volatile:SI [(const_int 0)] VUNSPEC_GET_FPSCR))]
++ "TARGET_VFP"
++ "mrc\\tp10, 7, %0, cr1, cr0, 0\\t @GET_FPSCR"
++ [(set_attr "type" "mrs")])
++
++
+ ;; Unimplemented insns:
+ ;; fldm*
+ ;; fstm*
+--- a/src/gcc/config/arm/neon.md
++++ b/src/gcc/config/arm/neon.md
+@@ -1842,9 +1842,9 @@
+ ; good for plain vadd, vaddq.
+
+ (define_expand "neon_vadd<mode>"
+- [(match_operand:VDQX 0 "s_register_operand" "=w")
+- (match_operand:VDQX 1 "s_register_operand" "w")
+- (match_operand:VDQX 2 "s_register_operand" "w")
++ [(match_operand:VCVTF 0 "s_register_operand" "=w")
++ (match_operand:VCVTF 1 "s_register_operand" "w")
++ (match_operand:VCVTF 2 "s_register_operand" "w")
+ (match_operand:SI 3 "immediate_operand" "i")]
+ "TARGET_NEON"
+ {
+@@ -1869,9 +1869,9 @@
+ ; Used for intrinsics when flag_unsafe_math_optimizations is false.
+
+ (define_insn "neon_vadd<mode>_unspec"
+- [(set (match_operand:VDQX 0 "s_register_operand" "=w")
+- (unspec:VDQX [(match_operand:VDQX 1 "s_register_operand" "w")
+- (match_operand:VDQX 2 "s_register_operand" "w")]
++ [(set (match_operand:VCVTF 0 "s_register_operand" "=w")
++ (unspec:VCVTF [(match_operand:VCVTF 1 "s_register_operand" "w")
++ (match_operand:VCVTF 2 "s_register_operand" "w")]
+ UNSPEC_VADD))]
+ "TARGET_NEON"
+ "vadd.<V_if_elem>\t%<V_reg>0, %<V_reg>1, %<V_reg>2"
+@@ -2132,9 +2132,9 @@
+ )
+
+ (define_expand "neon_vsub<mode>"
+- [(match_operand:VDQX 0 "s_register_operand" "=w")
+- (match_operand:VDQX 1 "s_register_operand" "w")
+- (match_operand:VDQX 2 "s_register_operand" "w")
++ [(match_operand:VCVTF 0 "s_register_operand" "=w")
++ (match_operand:VCVTF 1 "s_register_operand" "w")
++ (match_operand:VCVTF 2 "s_register_operand" "w")
+ (match_operand:SI 3 "immediate_operand" "i")]
+ "TARGET_NEON"
+ {
+@@ -2149,9 +2149,9 @@
+ ; Used for intrinsics when flag_unsafe_math_optimizations is false.
+
+ (define_insn "neon_vsub<mode>_unspec"
+- [(set (match_operand:VDQX 0 "s_register_operand" "=w")
+- (unspec:VDQX [(match_operand:VDQX 1 "s_register_operand" "w")
+- (match_operand:VDQX 2 "s_register_operand" "w")]
++ [(set (match_operand:VCVTF 0 "s_register_operand" "=w")
++ (unspec:VCVTF [(match_operand:VCVTF 1 "s_register_operand" "w")
++ (match_operand:VCVTF 2 "s_register_operand" "w")]
+ UNSPEC_VSUB))]
+ "TARGET_NEON"
+ "vsub.<V_if_elem>\t%<V_reg>0, %<V_reg>1, %<V_reg>2"
+@@ -2547,6 +2547,14 @@
+ [(set_attr "type" "neon_qabs<q>")]
+ )
+
++(define_insn "neon_bswap<mode>"
++ [(set (match_operand:VDQHSD 0 "register_operand" "=w")
++ (bswap:VDQHSD (match_operand:VDQHSD 1 "register_operand" "w")))]
++ "TARGET_NEON"
++ "vrev<V_sz_elem>.8\\t%<V_reg>0, %<V_reg>1"
++ [(set_attr "type" "neon_rev<q>")]
++)
++
+ (define_expand "neon_vneg<mode>"
+ [(match_operand:VDQW 0 "s_register_operand" "")
+ (match_operand:VDQW 1 "s_register_operand" "")
+@@ -4140,17 +4148,6 @@
+ [(set_attr "type" "neon_permute<q>")]
+ )
+
+-(define_expand "neon_vtrn<mode>"
+- [(match_operand:SI 0 "s_register_operand" "r")
+- (match_operand:VDQW 1 "s_register_operand" "w")
+- (match_operand:VDQW 2 "s_register_operand" "w")]
+- "TARGET_NEON"
+-{
+- neon_emit_pair_result_insn (<MODE>mode, gen_neon_vtrn<mode>_internal,
+- operands[0], operands[1], operands[2]);
+- DONE;
+-})
+-
+ (define_expand "neon_vzip<mode>_internal"
+ [(parallel
+ [(set (match_operand:VDQW 0 "s_register_operand" "")
+@@ -4177,17 +4174,6 @@
+ [(set_attr "type" "neon_zip<q>")]
+ )
+
+-(define_expand "neon_vzip<mode>"
+- [(match_operand:SI 0 "s_register_operand" "r")
+- (match_operand:VDQW 1 "s_register_operand" "w")
+- (match_operand:VDQW 2 "s_register_operand" "w")]
+- "TARGET_NEON"
+-{
+- neon_emit_pair_result_insn (<MODE>mode, gen_neon_vzip<mode>_internal,
+- operands[0], operands[1], operands[2]);
+- DONE;
+-})
+-
+ (define_expand "neon_vuzp<mode>_internal"
+ [(parallel
+ [(set (match_operand:VDQW 0 "s_register_operand" "")
+@@ -4214,17 +4200,6 @@
+ [(set_attr "type" "neon_zip<q>")]
+ )
+
+-(define_expand "neon_vuzp<mode>"
+- [(match_operand:SI 0 "s_register_operand" "r")
+- (match_operand:VDQW 1 "s_register_operand" "w")
+- (match_operand:VDQW 2 "s_register_operand" "w")]
+- "TARGET_NEON"
+-{
+- neon_emit_pair_result_insn (<MODE>mode, gen_neon_vuzp<mode>_internal,
+- operands[0], operands[1], operands[2]);
+- DONE;
+-})
+-
+ (define_expand "neon_vreinterpretv8qi<mode>"
+ [(match_operand:V8QI 0 "s_register_operand" "")
+ (match_operand:VDX 1 "s_register_operand" "")]
+@@ -5357,61 +5332,6 @@
+ [(set_attr "type" "neon_store4_4reg<q>")]
+ )
+
+-(define_expand "neon_vand<mode>"
+- [(match_operand:VDQX 0 "s_register_operand" "")
+- (match_operand:VDQX 1 "s_register_operand" "")
+- (match_operand:VDQX 2 "neon_inv_logic_op2" "")
+- (match_operand:SI 3 "immediate_operand" "")]
+- "TARGET_NEON"
+-{
+- emit_insn (gen_and<mode>3 (operands[0], operands[1], operands[2]));
+- DONE;
+-})
+-
+-(define_expand "neon_vorr<mode>"
+- [(match_operand:VDQX 0 "s_register_operand" "")
+- (match_operand:VDQX 1 "s_register_operand" "")
+- (match_operand:VDQX 2 "neon_logic_op2" "")
+- (match_operand:SI 3 "immediate_operand" "")]
+- "TARGET_NEON"
+-{
+- emit_insn (gen_ior<mode>3 (operands[0], operands[1], operands[2]));
+- DONE;
+-})
+-
+-(define_expand "neon_veor<mode>"
+- [(match_operand:VDQX 0 "s_register_operand" "")
+- (match_operand:VDQX 1 "s_register_operand" "")
+- (match_operand:VDQX 2 "s_register_operand" "")
+- (match_operand:SI 3 "immediate_operand" "")]
+- "TARGET_NEON"
+-{
+- emit_insn (gen_xor<mode>3 (operands[0], operands[1], operands[2]));
+- DONE;
+-})
+-
+-(define_expand "neon_vbic<mode>"
+- [(match_operand:VDQX 0 "s_register_operand" "")
+- (match_operand:VDQX 1 "s_register_operand" "")
+- (match_operand:VDQX 2 "neon_logic_op2" "")
+- (match_operand:SI 3 "immediate_operand" "")]
+- "TARGET_NEON"
+-{
+- emit_insn (gen_bic<mode>3_neon (operands[0], operands[1], operands[2]));
+- DONE;
+-})
+-
+-(define_expand "neon_vorn<mode>"
+- [(match_operand:VDQX 0 "s_register_operand" "")
+- (match_operand:VDQX 1 "s_register_operand" "")
+- (match_operand:VDQX 2 "neon_inv_logic_op2" "")
+- (match_operand:SI 3 "immediate_operand" "")]
+- "TARGET_NEON"
+-{
+- emit_insn (gen_orn<mode>3_neon (operands[0], operands[1], operands[2]));
+- DONE;
+-})
+-
+ (define_insn "neon_vec_unpack<US>_lo_<mode>"
+ [(set (match_operand:<V_unpack> 0 "register_operand" "=w")
+ (SE:<V_unpack> (vec_select:<V_HALF>
+--- a/src/gcc/config/arm/arm_neon_builtins.def
++++ b/src/gcc/config/arm/arm_neon_builtins.def
+@@ -18,8 +18,7 @@
+ along with GCC; see the file COPYING3. If not see
+ <http://www.gnu.org/licenses/>. */
+
+-VAR10 (BINOP, vadd,
+- v8qi, v4hi, v2si, v2sf, di, v16qi, v8hi, v4si, v4sf, v2di),
++VAR2 (BINOP, vadd, v2sf, v4sf),
+ VAR3 (BINOP, vaddl, v8qi, v4hi, v2si),
+ VAR3 (BINOP, vaddw, v8qi, v4hi, v2si),
+ VAR6 (BINOP, vhadd, v8qi, v4hi, v2si, v16qi, v8hi, v4si),
+@@ -54,7 +53,7 @@
+ VAR8 (SHIFTIMM, vqshlu_n, v8qi, v4hi, v2si, di, v16qi, v8hi, v4si, v2di),
+ VAR3 (SHIFTIMM, vshll_n, v8qi, v4hi, v2si),
+ VAR8 (SHIFTACC, vsra_n, v8qi, v4hi, v2si, di, v16qi, v8hi, v4si, v2di),
+-VAR10 (BINOP, vsub, v8qi, v4hi, v2si, v2sf, di, v16qi, v8hi, v4si, v4sf, v2di),
++VAR2 (BINOP, vsub, v2sf, v4sf),
+ VAR3 (BINOP, vsubl, v8qi, v4hi, v2si),
+ VAR3 (BINOP, vsubw, v8qi, v4hi, v2si),
+ VAR8 (BINOP, vqsub, v8qi, v4hi, v2si, di, v16qi, v8hi, v4si, v2di),
+@@ -89,6 +88,7 @@
+ VAR6 (UNOP, vqneg, v8qi, v4hi, v2si, v16qi, v8hi, v4si),
+ VAR6 (UNOP, vcls, v8qi, v4hi, v2si, v16qi, v8hi, v4si),
+ VAR6 (UNOP, vclz, v8qi, v4hi, v2si, v16qi, v8hi, v4si),
++VAR5 (BSWAP, bswap, v4hi, v8hi, v2si, v4si, v2di),
+ VAR2 (UNOP, vcnt, v8qi, v16qi),
+ VAR4 (UNOP, vrecpe, v2si, v2sf, v4si, v4sf),
+ VAR4 (UNOP, vrsqrte, v2si, v2sf, v4si, v4sf),
+@@ -149,9 +149,6 @@
+ VAR1 (VTBX, vtbx2, v8qi),
+ VAR1 (VTBX, vtbx3, v8qi),
+ VAR1 (VTBX, vtbx4, v8qi),
+-VAR8 (RESULTPAIR, vtrn, v8qi, v4hi, v2si, v2sf, v16qi, v8hi, v4si, v4sf),
+-VAR8 (RESULTPAIR, vzip, v8qi, v4hi, v2si, v2sf, v16qi, v8hi, v4si, v4sf),
+-VAR8 (RESULTPAIR, vuzp, v8qi, v4hi, v2si, v2sf, v16qi, v8hi, v4si, v4sf),
+ VAR5 (REINTERP, vreinterpretv8qi, v8qi, v4hi, v2si, v2sf, di),
+ VAR5 (REINTERP, vreinterpretv4hi, v8qi, v4hi, v2si, v2sf, di),
+ VAR5 (REINTERP, vreinterpretv2si, v8qi, v4hi, v2si, v2sf, di),
+@@ -199,14 +196,4 @@
+ VAR9 (STORESTRUCT, vst4,
+ v8qi, v4hi, v2si, v2sf, di, v16qi, v8hi, v4si, v4sf),
+ VAR7 (STORESTRUCTLANE, vst4_lane,
+- v8qi, v4hi, v2si, v2sf, v8hi, v4si, v4sf),
+-VAR10 (LOGICBINOP, vand,
+- v8qi, v4hi, v2si, v2sf, di, v16qi, v8hi, v4si, v4sf, v2di),
+-VAR10 (LOGICBINOP, vorr,
+- v8qi, v4hi, v2si, v2sf, di, v16qi, v8hi, v4si, v4sf, v2di),
+-VAR10 (BINOP, veor,
+- v8qi, v4hi, v2si, v2sf, di, v16qi, v8hi, v4si, v4sf, v2di),
+-VAR10 (LOGICBINOP, vbic,
+- v8qi, v4hi, v2si, v2sf, di, v16qi, v8hi, v4si, v4sf, v2di),
+-VAR10 (LOGICBINOP, vorn,
+- v8qi, v4hi, v2si, v2sf, di, v16qi, v8hi, v4si, v4sf, v2di)
++ v8qi, v4hi, v2si, v2sf, v8hi, v4si, v4sf)
--- a/src/gcc/config/arm/aarch-common-protos.h
+++ b/src/gcc/config/arm/aarch-common-protos.h
@@ -24,6 +24,9 @@
@@ -13182,7 +29190,23 @@ LANG=C svn diff svn://gcc.gnu.org/svn/gcc/branches/gcc-4_9-branch@211979 \
cost. */
--- a/src/gcc/config/arm/predicates.md
+++ b/src/gcc/config/arm/predicates.md
-@@ -681,5 +681,6 @@
+@@ -291,6 +291,15 @@
+ || ((unsigned HOST_WIDE_INT) INTVAL (XEXP (op, 1))) < 32")))
+ (match_test "mode == GET_MODE (op)")))
+
++(define_special_predicate "shift_nomul_operator"
++ (and (ior (and (match_code "rotate")
++ (match_test "CONST_INT_P (XEXP (op, 1))
++ && ((unsigned HOST_WIDE_INT) INTVAL (XEXP (op, 1))) < 32"))
++ (and (match_code "ashift,ashiftrt,lshiftrt,rotatert")
++ (match_test "!CONST_INT_P (XEXP (op, 1))
++ || ((unsigned HOST_WIDE_INT) INTVAL (XEXP (op, 1))) < 32")))
++ (match_test "mode == GET_MODE (op)")))
++
+ ;; True for shift operators which can be used with saturation instructions.
+ (define_special_predicate "sat_shift_operator"
+ (and (ior (and (match_code "mult")
+@@ -681,5 +690,6 @@
(match_code "reg" "0")))
(define_predicate "call_insn_operand"
@@ -13190,9 +29214,981 @@ LANG=C svn diff svn://gcc.gnu.org/svn/gcc/branches/gcc-4_9-branch@211979 \
+ (ior (and (match_code "symbol_ref")
+ (match_test "!arm_is_long_call_p (SYMBOL_REF_DECL (op))"))
(match_operand 0 "s_register_operand")))
+--- a/src/gcc/config/arm/arm_neon.h
++++ b/src/gcc/config/arm/arm_neon.h
+@@ -452,114 +452,121 @@
+ } poly64x2x4_t;
+ #endif
+
+-
+-
++/* vadd */
+ __extension__ static __inline int8x8_t __attribute__ ((__always_inline__))
+ vadd_s8 (int8x8_t __a, int8x8_t __b)
+ {
+- return (int8x8_t)__builtin_neon_vaddv8qi (__a, __b, 1);
++ return __a + __b;
+ }
+
+ __extension__ static __inline int16x4_t __attribute__ ((__always_inline__))
+ vadd_s16 (int16x4_t __a, int16x4_t __b)
+ {
+- return (int16x4_t)__builtin_neon_vaddv4hi (__a, __b, 1);
++ return __a + __b;
+ }
+
+ __extension__ static __inline int32x2_t __attribute__ ((__always_inline__))
+ vadd_s32 (int32x2_t __a, int32x2_t __b)
+ {
+- return (int32x2_t)__builtin_neon_vaddv2si (__a, __b, 1);
++ return __a + __b;
+ }
+
+ __extension__ static __inline float32x2_t __attribute__ ((__always_inline__))
+ vadd_f32 (float32x2_t __a, float32x2_t __b)
+ {
+- return (float32x2_t)__builtin_neon_vaddv2sf (__a, __b, 3);
++#ifdef __FAST_MATH__
++ return __a + __b;
++#else
++ return (float32x2_t) __builtin_neon_vaddv2sf (__a, __b, 3);
++#endif
+ }
+
+ __extension__ static __inline uint8x8_t __attribute__ ((__always_inline__))
+ vadd_u8 (uint8x8_t __a, uint8x8_t __b)
+ {
+- return (uint8x8_t)__builtin_neon_vaddv8qi ((int8x8_t) __a, (int8x8_t) __b, 0);
++ return __a + __b;
+ }
+
+ __extension__ static __inline uint16x4_t __attribute__ ((__always_inline__))
+ vadd_u16 (uint16x4_t __a, uint16x4_t __b)
+ {
+- return (uint16x4_t)__builtin_neon_vaddv4hi ((int16x4_t) __a, (int16x4_t) __b, 0);
++ return __a + __b;
+ }
+
+ __extension__ static __inline uint32x2_t __attribute__ ((__always_inline__))
+ vadd_u32 (uint32x2_t __a, uint32x2_t __b)
+ {
+- return (uint32x2_t)__builtin_neon_vaddv2si ((int32x2_t) __a, (int32x2_t) __b, 0);
++ return __a + __b;
+ }
+
+ __extension__ static __inline int64x1_t __attribute__ ((__always_inline__))
+ vadd_s64 (int64x1_t __a, int64x1_t __b)
+ {
+- return (int64x1_t)__builtin_neon_vadddi (__a, __b, 1);
++ return __a + __b;
+ }
+
+ __extension__ static __inline uint64x1_t __attribute__ ((__always_inline__))
+ vadd_u64 (uint64x1_t __a, uint64x1_t __b)
+ {
+- return (uint64x1_t)__builtin_neon_vadddi ((int64x1_t) __a, (int64x1_t) __b, 0);
++ return __a + __b;
+ }
+
+ __extension__ static __inline int8x16_t __attribute__ ((__always_inline__))
+ vaddq_s8 (int8x16_t __a, int8x16_t __b)
+ {
+- return (int8x16_t)__builtin_neon_vaddv16qi (__a, __b, 1);
++ return __a + __b;
+ }
+
+ __extension__ static __inline int16x8_t __attribute__ ((__always_inline__))
+ vaddq_s16 (int16x8_t __a, int16x8_t __b)
+ {
+- return (int16x8_t)__builtin_neon_vaddv8hi (__a, __b, 1);
++ return __a + __b;
+ }
+
+ __extension__ static __inline int32x4_t __attribute__ ((__always_inline__))
+ vaddq_s32 (int32x4_t __a, int32x4_t __b)
+ {
+- return (int32x4_t)__builtin_neon_vaddv4si (__a, __b, 1);
++ return __a + __b;
+ }
+
+ __extension__ static __inline int64x2_t __attribute__ ((__always_inline__))
+ vaddq_s64 (int64x2_t __a, int64x2_t __b)
+ {
+- return (int64x2_t)__builtin_neon_vaddv2di (__a, __b, 1);
++ return __a + __b;
+ }
+
+ __extension__ static __inline float32x4_t __attribute__ ((__always_inline__))
+ vaddq_f32 (float32x4_t __a, float32x4_t __b)
+ {
+- return (float32x4_t)__builtin_neon_vaddv4sf (__a, __b, 3);
++#ifdef __FAST_MATH
++ return __a + __b;
++#else
++ return (float32x4_t) __builtin_neon_vaddv4sf (__a, __b, 3);
++#endif
+ }
+
+ __extension__ static __inline uint8x16_t __attribute__ ((__always_inline__))
+ vaddq_u8 (uint8x16_t __a, uint8x16_t __b)
+ {
+- return (uint8x16_t)__builtin_neon_vaddv16qi ((int8x16_t) __a, (int8x16_t) __b, 0);
++ return __a + __b;
+ }
+
+ __extension__ static __inline uint16x8_t __attribute__ ((__always_inline__))
+ vaddq_u16 (uint16x8_t __a, uint16x8_t __b)
+ {
+- return (uint16x8_t)__builtin_neon_vaddv8hi ((int16x8_t) __a, (int16x8_t) __b, 0);
++ return __a + __b;
+ }
+
+ __extension__ static __inline uint32x4_t __attribute__ ((__always_inline__))
+ vaddq_u32 (uint32x4_t __a, uint32x4_t __b)
+ {
+- return (uint32x4_t)__builtin_neon_vaddv4si ((int32x4_t) __a, (int32x4_t) __b, 0);
++ return __a + __b;
+ }
+
+ __extension__ static __inline uint64x2_t __attribute__ ((__always_inline__))
+ vaddq_u64 (uint64x2_t __a, uint64x2_t __b)
+ {
+- return (uint64x2_t)__builtin_neon_vaddv2di ((int64x2_t) __a, (int64x2_t) __b, 0);
++ return __a + __b;
+ }
+
+ __extension__ static __inline int16x8_t __attribute__ ((__always_inline__))
+@@ -949,93 +956,102 @@
+ __extension__ static __inline int8x8_t __attribute__ ((__always_inline__))
+ vmul_s8 (int8x8_t __a, int8x8_t __b)
+ {
+- return (int8x8_t)__builtin_neon_vmulv8qi (__a, __b, 1);
++ return __a * __b;
+ }
+
+ __extension__ static __inline int16x4_t __attribute__ ((__always_inline__))
+ vmul_s16 (int16x4_t __a, int16x4_t __b)
+ {
+- return (int16x4_t)__builtin_neon_vmulv4hi (__a, __b, 1);
++ return __a * __b;
+ }
+
+ __extension__ static __inline int32x2_t __attribute__ ((__always_inline__))
+ vmul_s32 (int32x2_t __a, int32x2_t __b)
+ {
+- return (int32x2_t)__builtin_neon_vmulv2si (__a, __b, 1);
++ return __a * __b;
+ }
+
+ __extension__ static __inline float32x2_t __attribute__ ((__always_inline__))
+ vmul_f32 (float32x2_t __a, float32x2_t __b)
+ {
+- return (float32x2_t)__builtin_neon_vmulv2sf (__a, __b, 3);
++#ifdef __FAST_MATH
++ return __a * __b;
++#else
++ return (float32x2_t) __builtin_neon_vmulv2sf (__a, __b, 3);
++#endif
++
+ }
+
+ __extension__ static __inline uint8x8_t __attribute__ ((__always_inline__))
+ vmul_u8 (uint8x8_t __a, uint8x8_t __b)
+ {
+- return (uint8x8_t)__builtin_neon_vmulv8qi ((int8x8_t) __a, (int8x8_t) __b, 0);
++ return __a * __b;
+ }
+
+ __extension__ static __inline uint16x4_t __attribute__ ((__always_inline__))
+ vmul_u16 (uint16x4_t __a, uint16x4_t __b)
+ {
+- return (uint16x4_t)__builtin_neon_vmulv4hi ((int16x4_t) __a, (int16x4_t) __b, 0);
++ return __a * __b;
+ }
+
+ __extension__ static __inline uint32x2_t __attribute__ ((__always_inline__))
+ vmul_u32 (uint32x2_t __a, uint32x2_t __b)
+ {
+- return (uint32x2_t)__builtin_neon_vmulv2si ((int32x2_t) __a, (int32x2_t) __b, 0);
++ return __a * __b;
+ }
+
+-__extension__ static __inline poly8x8_t __attribute__ ((__always_inline__))
+-vmul_p8 (poly8x8_t __a, poly8x8_t __b)
+-{
+- return (poly8x8_t)__builtin_neon_vmulv8qi ((int8x8_t) __a, (int8x8_t) __b, 2);
+-}
+-
+ __extension__ static __inline int8x16_t __attribute__ ((__always_inline__))
+ vmulq_s8 (int8x16_t __a, int8x16_t __b)
+ {
+- return (int8x16_t)__builtin_neon_vmulv16qi (__a, __b, 1);
++ return __a * __b;
+ }
+
+ __extension__ static __inline int16x8_t __attribute__ ((__always_inline__))
+ vmulq_s16 (int16x8_t __a, int16x8_t __b)
+ {
+- return (int16x8_t)__builtin_neon_vmulv8hi (__a, __b, 1);
++ return __a * __b;
+ }
+
+ __extension__ static __inline int32x4_t __attribute__ ((__always_inline__))
+ vmulq_s32 (int32x4_t __a, int32x4_t __b)
+ {
+- return (int32x4_t)__builtin_neon_vmulv4si (__a, __b, 1);
++ return __a * __b;
+ }
+
+ __extension__ static __inline float32x4_t __attribute__ ((__always_inline__))
+ vmulq_f32 (float32x4_t __a, float32x4_t __b)
+ {
+- return (float32x4_t)__builtin_neon_vmulv4sf (__a, __b, 3);
++#ifdef __FAST_MATH
++ return __a * __b;
++#else
++ return (float32x4_t) __builtin_neon_vmulv4sf (__a, __b, 3);
++#endif
+ }
+
+ __extension__ static __inline uint8x16_t __attribute__ ((__always_inline__))
+ vmulq_u8 (uint8x16_t __a, uint8x16_t __b)
+ {
+- return (uint8x16_t)__builtin_neon_vmulv16qi ((int8x16_t) __a, (int8x16_t) __b, 0);
++ return __a * __b;
+ }
+
+ __extension__ static __inline uint16x8_t __attribute__ ((__always_inline__))
+ vmulq_u16 (uint16x8_t __a, uint16x8_t __b)
+ {
+- return (uint16x8_t)__builtin_neon_vmulv8hi ((int16x8_t) __a, (int16x8_t) __b, 0);
++ return __a * __b;
+ }
+
+ __extension__ static __inline uint32x4_t __attribute__ ((__always_inline__))
+ vmulq_u32 (uint32x4_t __a, uint32x4_t __b)
+ {
+- return (uint32x4_t)__builtin_neon_vmulv4si ((int32x4_t) __a, (int32x4_t) __b, 0);
++ return __a * __b;
+ }
+
++__extension__ static __inline poly8x8_t __attribute__ ((__always_inline__))
++vmul_p8 (poly8x8_t __a, poly8x8_t __b)
++{
++ return (poly8x8_t)__builtin_neon_vmulv8qi ((int8x8_t) __a, (int8x8_t) __b, 2);
++}
++
+ __extension__ static __inline poly8x16_t __attribute__ ((__always_inline__))
+ vmulq_p8 (poly8x16_t __a, poly8x16_t __b)
+ {
+@@ -1520,112 +1536,121 @@
+ }
+
+ #endif
++
+ __extension__ static __inline int8x8_t __attribute__ ((__always_inline__))
+ vsub_s8 (int8x8_t __a, int8x8_t __b)
+ {
+- return (int8x8_t)__builtin_neon_vsubv8qi (__a, __b, 1);
++ return __a - __b;
+ }
+
+ __extension__ static __inline int16x4_t __attribute__ ((__always_inline__))
+ vsub_s16 (int16x4_t __a, int16x4_t __b)
+ {
+- return (int16x4_t)__builtin_neon_vsubv4hi (__a, __b, 1);
++ return __a - __b;
+ }
+
+ __extension__ static __inline int32x2_t __attribute__ ((__always_inline__))
+ vsub_s32 (int32x2_t __a, int32x2_t __b)
+ {
+- return (int32x2_t)__builtin_neon_vsubv2si (__a, __b, 1);
++ return __a - __b;
+ }
+
+ __extension__ static __inline float32x2_t __attribute__ ((__always_inline__))
+ vsub_f32 (float32x2_t __a, float32x2_t __b)
+ {
+- return (float32x2_t)__builtin_neon_vsubv2sf (__a, __b, 3);
++#ifdef __FAST_MATH
++ return __a - __b;
++#else
++ return (float32x2_t) __builtin_neon_vsubv2sf (__a, __b, 3);
++#endif
+ }
+
+ __extension__ static __inline uint8x8_t __attribute__ ((__always_inline__))
+ vsub_u8 (uint8x8_t __a, uint8x8_t __b)
+ {
+- return (uint8x8_t)__builtin_neon_vsubv8qi ((int8x8_t) __a, (int8x8_t) __b, 0);
++ return __a - __b;
+ }
+
+ __extension__ static __inline uint16x4_t __attribute__ ((__always_inline__))
+ vsub_u16 (uint16x4_t __a, uint16x4_t __b)
+ {
+- return (uint16x4_t)__builtin_neon_vsubv4hi ((int16x4_t) __a, (int16x4_t) __b, 0);
++ return __a - __b;
+ }
+
+ __extension__ static __inline uint32x2_t __attribute__ ((__always_inline__))
+ vsub_u32 (uint32x2_t __a, uint32x2_t __b)
+ {
+- return (uint32x2_t)__builtin_neon_vsubv2si ((int32x2_t) __a, (int32x2_t) __b, 0);
++ return __a - __b;
+ }
+
+ __extension__ static __inline int64x1_t __attribute__ ((__always_inline__))
+ vsub_s64 (int64x1_t __a, int64x1_t __b)
+ {
+- return (int64x1_t)__builtin_neon_vsubdi (__a, __b, 1);
++ return __a - __b;
+ }
+
+ __extension__ static __inline uint64x1_t __attribute__ ((__always_inline__))
+ vsub_u64 (uint64x1_t __a, uint64x1_t __b)
+ {
+- return (uint64x1_t)__builtin_neon_vsubdi ((int64x1_t) __a, (int64x1_t) __b, 0);
++ return __a - __b;
+ }
+
+ __extension__ static __inline int8x16_t __attribute__ ((__always_inline__))
+ vsubq_s8 (int8x16_t __a, int8x16_t __b)
+ {
+- return (int8x16_t)__builtin_neon_vsubv16qi (__a, __b, 1);
++ return __a - __b;
+ }
+
+ __extension__ static __inline int16x8_t __attribute__ ((__always_inline__))
+ vsubq_s16 (int16x8_t __a, int16x8_t __b)
+ {
+- return (int16x8_t)__builtin_neon_vsubv8hi (__a, __b, 1);
++ return __a - __b;
+ }
+
+ __extension__ static __inline int32x4_t __attribute__ ((__always_inline__))
+ vsubq_s32 (int32x4_t __a, int32x4_t __b)
+ {
+- return (int32x4_t)__builtin_neon_vsubv4si (__a, __b, 1);
++ return __a - __b;
+ }
+
+ __extension__ static __inline int64x2_t __attribute__ ((__always_inline__))
+ vsubq_s64 (int64x2_t __a, int64x2_t __b)
+ {
+- return (int64x2_t)__builtin_neon_vsubv2di (__a, __b, 1);
++ return __a - __b;
+ }
+
+ __extension__ static __inline float32x4_t __attribute__ ((__always_inline__))
+ vsubq_f32 (float32x4_t __a, float32x4_t __b)
+ {
+- return (float32x4_t)__builtin_neon_vsubv4sf (__a, __b, 3);
++#ifdef __FAST_MATH
++ return __a - __b;
++#else
++ return (float32x4_t) __builtin_neon_vsubv4sf (__a, __b, 3);
++#endif
+ }
+
+ __extension__ static __inline uint8x16_t __attribute__ ((__always_inline__))
+ vsubq_u8 (uint8x16_t __a, uint8x16_t __b)
+ {
+- return (uint8x16_t)__builtin_neon_vsubv16qi ((int8x16_t) __a, (int8x16_t) __b, 0);
++ return __a - __b;
+ }
+
+ __extension__ static __inline uint16x8_t __attribute__ ((__always_inline__))
+ vsubq_u16 (uint16x8_t __a, uint16x8_t __b)
+ {
+- return (uint16x8_t)__builtin_neon_vsubv8hi ((int16x8_t) __a, (int16x8_t) __b, 0);
++ return __a - __b;
+ }
+
+ __extension__ static __inline uint32x4_t __attribute__ ((__always_inline__))
+ vsubq_u32 (uint32x4_t __a, uint32x4_t __b)
+ {
+- return (uint32x4_t)__builtin_neon_vsubv4si ((int32x4_t) __a, (int32x4_t) __b, 0);
++ return __a - __b;
+ }
+
+ __extension__ static __inline uint64x2_t __attribute__ ((__always_inline__))
+ vsubq_u64 (uint64x2_t __a, uint64x2_t __b)
+ {
+- return (uint64x2_t)__builtin_neon_vsubv2di ((int64x2_t) __a, (int64x2_t) __b, 0);
++ return __a - __b;
+ }
+
+ __extension__ static __inline int16x8_t __attribute__ ((__always_inline__))
+@@ -11295,484 +11320,483 @@
+ __extension__ static __inline int8x8_t __attribute__ ((__always_inline__))
+ vand_s8 (int8x8_t __a, int8x8_t __b)
+ {
+- return (int8x8_t)__builtin_neon_vandv8qi (__a, __b, 1);
++ return __a & __b;
+ }
+
+ __extension__ static __inline int16x4_t __attribute__ ((__always_inline__))
+ vand_s16 (int16x4_t __a, int16x4_t __b)
+ {
+- return (int16x4_t)__builtin_neon_vandv4hi (__a, __b, 1);
++ return __a & __b;
+ }
+
+ __extension__ static __inline int32x2_t __attribute__ ((__always_inline__))
+ vand_s32 (int32x2_t __a, int32x2_t __b)
+ {
+- return (int32x2_t)__builtin_neon_vandv2si (__a, __b, 1);
++ return __a & __b;
+ }
+
+ __extension__ static __inline uint8x8_t __attribute__ ((__always_inline__))
+ vand_u8 (uint8x8_t __a, uint8x8_t __b)
+ {
+- return (uint8x8_t)__builtin_neon_vandv8qi ((int8x8_t) __a, (int8x8_t) __b, 0);
++ return __a & __b;
+ }
+
+ __extension__ static __inline uint16x4_t __attribute__ ((__always_inline__))
+ vand_u16 (uint16x4_t __a, uint16x4_t __b)
+ {
+- return (uint16x4_t)__builtin_neon_vandv4hi ((int16x4_t) __a, (int16x4_t) __b, 0);
++ return __a & __b;
+ }
+
+ __extension__ static __inline uint32x2_t __attribute__ ((__always_inline__))
+ vand_u32 (uint32x2_t __a, uint32x2_t __b)
+ {
+- return (uint32x2_t)__builtin_neon_vandv2si ((int32x2_t) __a, (int32x2_t) __b, 0);
++ return __a & __b;
+ }
+
+ __extension__ static __inline int64x1_t __attribute__ ((__always_inline__))
+ vand_s64 (int64x1_t __a, int64x1_t __b)
+ {
+- return (int64x1_t)__builtin_neon_vanddi (__a, __b, 1);
++ return __a & __b;
+ }
+
+ __extension__ static __inline uint64x1_t __attribute__ ((__always_inline__))
+ vand_u64 (uint64x1_t __a, uint64x1_t __b)
+ {
+- return (uint64x1_t)__builtin_neon_vanddi ((int64x1_t) __a, (int64x1_t) __b, 0);
++ return __a & __b;
+ }
+
+ __extension__ static __inline int8x16_t __attribute__ ((__always_inline__))
+ vandq_s8 (int8x16_t __a, int8x16_t __b)
+ {
+- return (int8x16_t)__builtin_neon_vandv16qi (__a, __b, 1);
++ return __a & __b;
+ }
+
+ __extension__ static __inline int16x8_t __attribute__ ((__always_inline__))
+ vandq_s16 (int16x8_t __a, int16x8_t __b)
+ {
+- return (int16x8_t)__builtin_neon_vandv8hi (__a, __b, 1);
++ return __a & __b;
+ }
+
+ __extension__ static __inline int32x4_t __attribute__ ((__always_inline__))
+ vandq_s32 (int32x4_t __a, int32x4_t __b)
+ {
+- return (int32x4_t)__builtin_neon_vandv4si (__a, __b, 1);
++ return __a & __b;
+ }
+
+ __extension__ static __inline int64x2_t __attribute__ ((__always_inline__))
+ vandq_s64 (int64x2_t __a, int64x2_t __b)
+ {
+- return (int64x2_t)__builtin_neon_vandv2di (__a, __b, 1);
++ return __a & __b;
+ }
+
+ __extension__ static __inline uint8x16_t __attribute__ ((__always_inline__))
+ vandq_u8 (uint8x16_t __a, uint8x16_t __b)
+ {
+- return (uint8x16_t)__builtin_neon_vandv16qi ((int8x16_t) __a, (int8x16_t) __b, 0);
++ return __a & __b;
+ }
+
+ __extension__ static __inline uint16x8_t __attribute__ ((__always_inline__))
+ vandq_u16 (uint16x8_t __a, uint16x8_t __b)
+ {
+- return (uint16x8_t)__builtin_neon_vandv8hi ((int16x8_t) __a, (int16x8_t) __b, 0);
++ return __a & __b;
+ }
+
+ __extension__ static __inline uint32x4_t __attribute__ ((__always_inline__))
+ vandq_u32 (uint32x4_t __a, uint32x4_t __b)
+ {
+- return (uint32x4_t)__builtin_neon_vandv4si ((int32x4_t) __a, (int32x4_t) __b, 0);
++ return __a & __b;
+ }
+
+ __extension__ static __inline uint64x2_t __attribute__ ((__always_inline__))
+ vandq_u64 (uint64x2_t __a, uint64x2_t __b)
+ {
+- return (uint64x2_t)__builtin_neon_vandv2di ((int64x2_t) __a, (int64x2_t) __b, 0);
++ return __a & __b;
+ }
+
+ __extension__ static __inline int8x8_t __attribute__ ((__always_inline__))
+ vorr_s8 (int8x8_t __a, int8x8_t __b)
+ {
+- return (int8x8_t)__builtin_neon_vorrv8qi (__a, __b, 1);
++ return __a | __b;
+ }
+
+ __extension__ static __inline int16x4_t __attribute__ ((__always_inline__))
+ vorr_s16 (int16x4_t __a, int16x4_t __b)
+ {
+- return (int16x4_t)__builtin_neon_vorrv4hi (__a, __b, 1);
++ return __a | __b;
+ }
+
+ __extension__ static __inline int32x2_t __attribute__ ((__always_inline__))
+ vorr_s32 (int32x2_t __a, int32x2_t __b)
+ {
+- return (int32x2_t)__builtin_neon_vorrv2si (__a, __b, 1);
++ return __a | __b;
+ }
+
+ __extension__ static __inline uint8x8_t __attribute__ ((__always_inline__))
+ vorr_u8 (uint8x8_t __a, uint8x8_t __b)
+ {
+- return (uint8x8_t)__builtin_neon_vorrv8qi ((int8x8_t) __a, (int8x8_t) __b, 0);
++ return __a | __b;
+ }
+
+ __extension__ static __inline uint16x4_t __attribute__ ((__always_inline__))
+ vorr_u16 (uint16x4_t __a, uint16x4_t __b)
+ {
+- return (uint16x4_t)__builtin_neon_vorrv4hi ((int16x4_t) __a, (int16x4_t) __b, 0);
++ return __a | __b;
+ }
+
+ __extension__ static __inline uint32x2_t __attribute__ ((__always_inline__))
+ vorr_u32 (uint32x2_t __a, uint32x2_t __b)
+ {
+- return (uint32x2_t)__builtin_neon_vorrv2si ((int32x2_t) __a, (int32x2_t) __b, 0);
++ return __a | __b;
+ }
+
+ __extension__ static __inline int64x1_t __attribute__ ((__always_inline__))
+ vorr_s64 (int64x1_t __a, int64x1_t __b)
+ {
+- return (int64x1_t)__builtin_neon_vorrdi (__a, __b, 1);
++ return __a | __b;
+ }
+
+ __extension__ static __inline uint64x1_t __attribute__ ((__always_inline__))
+ vorr_u64 (uint64x1_t __a, uint64x1_t __b)
+ {
+- return (uint64x1_t)__builtin_neon_vorrdi ((int64x1_t) __a, (int64x1_t) __b, 0);
++ return __a | __b;
+ }
+
+ __extension__ static __inline int8x16_t __attribute__ ((__always_inline__))
+ vorrq_s8 (int8x16_t __a, int8x16_t __b)
+ {
+- return (int8x16_t)__builtin_neon_vorrv16qi (__a, __b, 1);
++ return __a | __b;
+ }
+
+ __extension__ static __inline int16x8_t __attribute__ ((__always_inline__))
+ vorrq_s16 (int16x8_t __a, int16x8_t __b)
+ {
+- return (int16x8_t)__builtin_neon_vorrv8hi (__a, __b, 1);
++ return __a | __b;
+ }
+
+ __extension__ static __inline int32x4_t __attribute__ ((__always_inline__))
+ vorrq_s32 (int32x4_t __a, int32x4_t __b)
+ {
+- return (int32x4_t)__builtin_neon_vorrv4si (__a, __b, 1);
++ return __a | __b;
+ }
+
+ __extension__ static __inline int64x2_t __attribute__ ((__always_inline__))
+ vorrq_s64 (int64x2_t __a, int64x2_t __b)
+ {
+- return (int64x2_t)__builtin_neon_vorrv2di (__a, __b, 1);
++ return __a | __b;
+ }
+
+ __extension__ static __inline uint8x16_t __attribute__ ((__always_inline__))
+ vorrq_u8 (uint8x16_t __a, uint8x16_t __b)
+ {
+- return (uint8x16_t)__builtin_neon_vorrv16qi ((int8x16_t) __a, (int8x16_t) __b, 0);
++ return __a | __b;
+ }
+
+ __extension__ static __inline uint16x8_t __attribute__ ((__always_inline__))
+ vorrq_u16 (uint16x8_t __a, uint16x8_t __b)
+ {
+- return (uint16x8_t)__builtin_neon_vorrv8hi ((int16x8_t) __a, (int16x8_t) __b, 0);
++ return __a | __b;
+ }
+
+ __extension__ static __inline uint32x4_t __attribute__ ((__always_inline__))
+ vorrq_u32 (uint32x4_t __a, uint32x4_t __b)
+ {
+- return (uint32x4_t)__builtin_neon_vorrv4si ((int32x4_t) __a, (int32x4_t) __b, 0);
++ return __a | __b;
+ }
+
+ __extension__ static __inline uint64x2_t __attribute__ ((__always_inline__))
+ vorrq_u64 (uint64x2_t __a, uint64x2_t __b)
+ {
+- return (uint64x2_t)__builtin_neon_vorrv2di ((int64x2_t) __a, (int64x2_t) __b, 0);
++ return __a | __b;
+ }
+
+ __extension__ static __inline int8x8_t __attribute__ ((__always_inline__))
+ veor_s8 (int8x8_t __a, int8x8_t __b)
+ {
+- return (int8x8_t)__builtin_neon_veorv8qi (__a, __b, 1);
++ return __a ^ __b;
+ }
+
+ __extension__ static __inline int16x4_t __attribute__ ((__always_inline__))
+ veor_s16 (int16x4_t __a, int16x4_t __b)
+ {
+- return (int16x4_t)__builtin_neon_veorv4hi (__a, __b, 1);
++ return __a ^ __b;
+ }
+
+ __extension__ static __inline int32x2_t __attribute__ ((__always_inline__))
+ veor_s32 (int32x2_t __a, int32x2_t __b)
+ {
+- return (int32x2_t)__builtin_neon_veorv2si (__a, __b, 1);
++ return __a ^ __b;
+ }
+
+ __extension__ static __inline uint8x8_t __attribute__ ((__always_inline__))
+ veor_u8 (uint8x8_t __a, uint8x8_t __b)
+ {
+- return (uint8x8_t)__builtin_neon_veorv8qi ((int8x8_t) __a, (int8x8_t) __b, 0);
++ return __a ^ __b;
+ }
+
+ __extension__ static __inline uint16x4_t __attribute__ ((__always_inline__))
+ veor_u16 (uint16x4_t __a, uint16x4_t __b)
+ {
+- return (uint16x4_t)__builtin_neon_veorv4hi ((int16x4_t) __a, (int16x4_t) __b, 0);
++ return __a ^ __b;
+ }
+
+ __extension__ static __inline uint32x2_t __attribute__ ((__always_inline__))
+ veor_u32 (uint32x2_t __a, uint32x2_t __b)
+ {
+- return (uint32x2_t)__builtin_neon_veorv2si ((int32x2_t) __a, (int32x2_t) __b, 0);
++ return __a ^ __b;
+ }
+
+ __extension__ static __inline int64x1_t __attribute__ ((__always_inline__))
+ veor_s64 (int64x1_t __a, int64x1_t __b)
+ {
+- return (int64x1_t)__builtin_neon_veordi (__a, __b, 1);
++ return __a ^ __b;
+ }
+
+ __extension__ static __inline uint64x1_t __attribute__ ((__always_inline__))
+ veor_u64 (uint64x1_t __a, uint64x1_t __b)
+ {
+- return (uint64x1_t)__builtin_neon_veordi ((int64x1_t) __a, (int64x1_t) __b, 0);
++ return __a ^ __b;
+ }
+
+ __extension__ static __inline int8x16_t __attribute__ ((__always_inline__))
+ veorq_s8 (int8x16_t __a, int8x16_t __b)
+ {
+- return (int8x16_t)__builtin_neon_veorv16qi (__a, __b, 1);
++ return __a ^ __b;
+ }
+
+ __extension__ static __inline int16x8_t __attribute__ ((__always_inline__))
+ veorq_s16 (int16x8_t __a, int16x8_t __b)
+ {
+- return (int16x8_t)__builtin_neon_veorv8hi (__a, __b, 1);
++ return __a ^ __b;
+ }
+
+ __extension__ static __inline int32x4_t __attribute__ ((__always_inline__))
+ veorq_s32 (int32x4_t __a, int32x4_t __b)
+ {
+- return (int32x4_t)__builtin_neon_veorv4si (__a, __b, 1);
++ return __a ^ __b;
+ }
+
+ __extension__ static __inline int64x2_t __attribute__ ((__always_inline__))
+ veorq_s64 (int64x2_t __a, int64x2_t __b)
+ {
+- return (int64x2_t)__builtin_neon_veorv2di (__a, __b, 1);
++ return __a ^ __b;
+ }
+
+ __extension__ static __inline uint8x16_t __attribute__ ((__always_inline__))
+ veorq_u8 (uint8x16_t __a, uint8x16_t __b)
+ {
+- return (uint8x16_t)__builtin_neon_veorv16qi ((int8x16_t) __a, (int8x16_t) __b, 0);
++ return __a ^ __b;
+ }
+
+ __extension__ static __inline uint16x8_t __attribute__ ((__always_inline__))
+ veorq_u16 (uint16x8_t __a, uint16x8_t __b)
+ {
+- return (uint16x8_t)__builtin_neon_veorv8hi ((int16x8_t) __a, (int16x8_t) __b, 0);
++ return __a ^ __b;
+ }
+
+ __extension__ static __inline uint32x4_t __attribute__ ((__always_inline__))
+ veorq_u32 (uint32x4_t __a, uint32x4_t __b)
+ {
+- return (uint32x4_t)__builtin_neon_veorv4si ((int32x4_t) __a, (int32x4_t) __b, 0);
++ return __a ^ __b;
+ }
+
+ __extension__ static __inline uint64x2_t __attribute__ ((__always_inline__))
+ veorq_u64 (uint64x2_t __a, uint64x2_t __b)
+ {
+- return (uint64x2_t)__builtin_neon_veorv2di ((int64x2_t) __a, (int64x2_t) __b, 0);
++ return __a ^ __b;
+ }
+
+ __extension__ static __inline int8x8_t __attribute__ ((__always_inline__))
+ vbic_s8 (int8x8_t __a, int8x8_t __b)
+ {
+- return (int8x8_t)__builtin_neon_vbicv8qi (__a, __b, 1);
++ return __a & ~__b;
+ }
+
+ __extension__ static __inline int16x4_t __attribute__ ((__always_inline__))
+ vbic_s16 (int16x4_t __a, int16x4_t __b)
+ {
+- return (int16x4_t)__builtin_neon_vbicv4hi (__a, __b, 1);
++ return __a & ~__b;
+ }
+
+ __extension__ static __inline int32x2_t __attribute__ ((__always_inline__))
+ vbic_s32 (int32x2_t __a, int32x2_t __b)
+ {
+- return (int32x2_t)__builtin_neon_vbicv2si (__a, __b, 1);
++ return __a & ~__b;
+ }
+
+ __extension__ static __inline uint8x8_t __attribute__ ((__always_inline__))
+ vbic_u8 (uint8x8_t __a, uint8x8_t __b)
+ {
+- return (uint8x8_t)__builtin_neon_vbicv8qi ((int8x8_t) __a, (int8x8_t) __b, 0);
++ return __a & ~__b;
+ }
+
+ __extension__ static __inline uint16x4_t __attribute__ ((__always_inline__))
+ vbic_u16 (uint16x4_t __a, uint16x4_t __b)
+ {
+- return (uint16x4_t)__builtin_neon_vbicv4hi ((int16x4_t) __a, (int16x4_t) __b, 0);
++ return __a & ~__b;
+ }
+
+ __extension__ static __inline uint32x2_t __attribute__ ((__always_inline__))
+ vbic_u32 (uint32x2_t __a, uint32x2_t __b)
+ {
+- return (uint32x2_t)__builtin_neon_vbicv2si ((int32x2_t) __a, (int32x2_t) __b, 0);
++ return __a & ~__b;
+ }
+
+ __extension__ static __inline int64x1_t __attribute__ ((__always_inline__))
+ vbic_s64 (int64x1_t __a, int64x1_t __b)
+ {
+- return (int64x1_t)__builtin_neon_vbicdi (__a, __b, 1);
++ return __a & ~__b;
+ }
+
+ __extension__ static __inline uint64x1_t __attribute__ ((__always_inline__))
+ vbic_u64 (uint64x1_t __a, uint64x1_t __b)
+ {
+- return (uint64x1_t)__builtin_neon_vbicdi ((int64x1_t) __a, (int64x1_t) __b, 0);
++ return __a & ~__b;
+ }
+
+ __extension__ static __inline int8x16_t __attribute__ ((__always_inline__))
+ vbicq_s8 (int8x16_t __a, int8x16_t __b)
+ {
+- return (int8x16_t)__builtin_neon_vbicv16qi (__a, __b, 1);
++ return __a & ~__b;
+ }
+
+ __extension__ static __inline int16x8_t __attribute__ ((__always_inline__))
+ vbicq_s16 (int16x8_t __a, int16x8_t __b)
+ {
+- return (int16x8_t)__builtin_neon_vbicv8hi (__a, __b, 1);
++ return __a & ~__b;
+ }
+
+ __extension__ static __inline int32x4_t __attribute__ ((__always_inline__))
+ vbicq_s32 (int32x4_t __a, int32x4_t __b)
+ {
+- return (int32x4_t)__builtin_neon_vbicv4si (__a, __b, 1);
++ return __a & ~__b;
+ }
+
+ __extension__ static __inline int64x2_t __attribute__ ((__always_inline__))
+ vbicq_s64 (int64x2_t __a, int64x2_t __b)
+ {
+- return (int64x2_t)__builtin_neon_vbicv2di (__a, __b, 1);
++ return __a & ~__b;
+ }
+
+ __extension__ static __inline uint8x16_t __attribute__ ((__always_inline__))
+ vbicq_u8 (uint8x16_t __a, uint8x16_t __b)
+ {
+- return (uint8x16_t)__builtin_neon_vbicv16qi ((int8x16_t) __a, (int8x16_t) __b, 0);
++ return __a & ~__b;
+ }
+
+ __extension__ static __inline uint16x8_t __attribute__ ((__always_inline__))
+ vbicq_u16 (uint16x8_t __a, uint16x8_t __b)
+ {
+- return (uint16x8_t)__builtin_neon_vbicv8hi ((int16x8_t) __a, (int16x8_t) __b, 0);
++ return __a & ~__b;
+ }
+
+ __extension__ static __inline uint32x4_t __attribute__ ((__always_inline__))
+ vbicq_u32 (uint32x4_t __a, uint32x4_t __b)
+ {
+- return (uint32x4_t)__builtin_neon_vbicv4si ((int32x4_t) __a, (int32x4_t) __b, 0);
++ return __a & ~__b;
+ }
+
+ __extension__ static __inline uint64x2_t __attribute__ ((__always_inline__))
+ vbicq_u64 (uint64x2_t __a, uint64x2_t __b)
+ {
+- return (uint64x2_t)__builtin_neon_vbicv2di ((int64x2_t) __a, (int64x2_t) __b, 0);
++ return __a & ~__b;
+ }
+
+ __extension__ static __inline int8x8_t __attribute__ ((__always_inline__))
+ vorn_s8 (int8x8_t __a, int8x8_t __b)
+ {
+- return (int8x8_t)__builtin_neon_vornv8qi (__a, __b, 1);
++ return __a | ~__b;
+ }
+
+ __extension__ static __inline int16x4_t __attribute__ ((__always_inline__))
+ vorn_s16 (int16x4_t __a, int16x4_t __b)
+ {
+- return (int16x4_t)__builtin_neon_vornv4hi (__a, __b, 1);
++ return __a | ~__b;
+ }
+
+ __extension__ static __inline int32x2_t __attribute__ ((__always_inline__))
+ vorn_s32 (int32x2_t __a, int32x2_t __b)
+ {
+- return (int32x2_t)__builtin_neon_vornv2si (__a, __b, 1);
++ return __a | ~__b;
+ }
+
+ __extension__ static __inline uint8x8_t __attribute__ ((__always_inline__))
+ vorn_u8 (uint8x8_t __a, uint8x8_t __b)
+ {
+- return (uint8x8_t)__builtin_neon_vornv8qi ((int8x8_t) __a, (int8x8_t) __b, 0);
++ return __a | ~__b;
+ }
+
+ __extension__ static __inline uint16x4_t __attribute__ ((__always_inline__))
+ vorn_u16 (uint16x4_t __a, uint16x4_t __b)
+ {
+- return (uint16x4_t)__builtin_neon_vornv4hi ((int16x4_t) __a, (int16x4_t) __b, 0);
++ return __a | ~__b;
+ }
+
+ __extension__ static __inline uint32x2_t __attribute__ ((__always_inline__))
+ vorn_u32 (uint32x2_t __a, uint32x2_t __b)
+ {
+- return (uint32x2_t)__builtin_neon_vornv2si ((int32x2_t) __a, (int32x2_t) __b, 0);
++ return __a | ~__b;
+ }
+
+ __extension__ static __inline int64x1_t __attribute__ ((__always_inline__))
+ vorn_s64 (int64x1_t __a, int64x1_t __b)
+ {
+- return (int64x1_t)__builtin_neon_vorndi (__a, __b, 1);
++ return __a | ~__b;
+ }
+
+ __extension__ static __inline uint64x1_t __attribute__ ((__always_inline__))
+ vorn_u64 (uint64x1_t __a, uint64x1_t __b)
+ {
+- return (uint64x1_t)__builtin_neon_vorndi ((int64x1_t) __a, (int64x1_t) __b, 0);
++ return __a | ~__b;
+ }
+
+ __extension__ static __inline int8x16_t __attribute__ ((__always_inline__))
+ vornq_s8 (int8x16_t __a, int8x16_t __b)
+ {
+- return (int8x16_t)__builtin_neon_vornv16qi (__a, __b, 1);
++ return __a | ~__b;
+ }
+
+ __extension__ static __inline int16x8_t __attribute__ ((__always_inline__))
+ vornq_s16 (int16x8_t __a, int16x8_t __b)
+ {
+- return (int16x8_t)__builtin_neon_vornv8hi (__a, __b, 1);
++ return __a | ~__b;
+ }
+
+ __extension__ static __inline int32x4_t __attribute__ ((__always_inline__))
+ vornq_s32 (int32x4_t __a, int32x4_t __b)
+ {
+- return (int32x4_t)__builtin_neon_vornv4si (__a, __b, 1);
++ return __a | ~__b;
+ }
+
+ __extension__ static __inline int64x2_t __attribute__ ((__always_inline__))
+ vornq_s64 (int64x2_t __a, int64x2_t __b)
+ {
+- return (int64x2_t)__builtin_neon_vornv2di (__a, __b, 1);
++ return __a | ~__b;
+ }
+
+ __extension__ static __inline uint8x16_t __attribute__ ((__always_inline__))
+ vornq_u8 (uint8x16_t __a, uint8x16_t __b)
+ {
+- return (uint8x16_t)__builtin_neon_vornv16qi ((int8x16_t) __a, (int8x16_t) __b, 0);
++ return __a | ~__b;
+ }
+
+ __extension__ static __inline uint16x8_t __attribute__ ((__always_inline__))
+ vornq_u16 (uint16x8_t __a, uint16x8_t __b)
+ {
+- return (uint16x8_t)__builtin_neon_vornv8hi ((int16x8_t) __a, (int16x8_t) __b, 0);
++ return __a | ~__b;
+ }
+
+ __extension__ static __inline uint32x4_t __attribute__ ((__always_inline__))
+ vornq_u32 (uint32x4_t __a, uint32x4_t __b)
+ {
+- return (uint32x4_t)__builtin_neon_vornv4si ((int32x4_t) __a, (int32x4_t) __b, 0);
++ return __a | ~__b;
+ }
+
+ __extension__ static __inline uint64x2_t __attribute__ ((__always_inline__))
+ vornq_u64 (uint64x2_t __a, uint64x2_t __b)
+ {
+- return (uint64x2_t)__builtin_neon_vornv2di ((int64x2_t) __a, (int64x2_t) __b, 0);
++ return __a | ~__b;
+ }
+
+-
+ __extension__ static __inline poly8x8_t __attribute__ ((__always_inline__))
+ vreinterpret_p8_p16 (poly16x4_t __a)
+ {
--- a/src/gcc/config/arm/aarch-common.c
+++ b/src/gcc/config/arm/aarch-common.c
-@@ -191,6 +191,79 @@
+@@ -191,6 +191,83 @@
return 0;
}
@@ -13200,14 +30196,18 @@ LANG=C svn diff svn://gcc.gnu.org/svn/gcc/branches/gcc-4_9-branch@211979 \
+aarch_rev16_shright_mask_imm_p (rtx val, enum machine_mode mode)
+{
+ return CONST_INT_P (val)
-+ && INTVAL (val) == trunc_int_for_mode (0xff00ff00ff00ff, mode);
++ && INTVAL (val)
++ == trunc_int_for_mode (HOST_WIDE_INT_C (0xff00ff00ff00ff),
++ mode);
+}
+
+bool
+aarch_rev16_shleft_mask_imm_p (rtx val, enum machine_mode mode)
+{
+ return CONST_INT_P (val)
-+ && INTVAL (val) == trunc_int_for_mode (0xff00ff00ff00ff00, mode);
++ && INTVAL (val)
++ == trunc_int_for_mode (HOST_WIDE_INT_C (0xff00ff00ff00ff00),
++ mode);
+}
+
+
@@ -13272,9 +30272,61 @@ LANG=C svn diff svn://gcc.gnu.org/svn/gcc/branches/gcc-4_9-branch@211979 \
/* Return nonzero if the CONSUMER instruction (a load) does need
PRODUCER's value to calculate the address. */
int
+--- a/src/gcc/config/arm/iterators.md
++++ b/src/gcc/config/arm/iterators.md
+@@ -116,6 +116,9 @@
+ ;; Vector modes including 64-bit integer elements, but no floats.
+ (define_mode_iterator VDQIX [V8QI V16QI V4HI V8HI V2SI V4SI DI V2DI])
+
++;; Vector modes for H, S and D types.
++(define_mode_iterator VDQHSD [V4HI V8HI V2SI V4SI V2DI])
++
+ ;; Vector modes for float->int conversions.
+ (define_mode_iterator VCVTF [V2SF V4SF])
+
+@@ -191,6 +194,20 @@
+ ;; Right shifts
+ (define_code_iterator rshifts [ashiftrt lshiftrt])
+
++;; Binary operators whose second operand can be shifted.
++(define_code_iterator shiftable_ops [plus minus ior xor and])
++
++;; plus and minus are the only shiftable_ops for which Thumb2 allows
++;; a stack pointer opoerand. The minus operation is a candidate for an rsub
++;; and hence only plus is supported.
++(define_code_attr t2_binop0
++ [(plus "rk") (minus "r") (ior "r") (xor "r") (and "r")])
++
++;; The instruction to use when a shiftable_ops has a shift operation as
++;; its first operand.
++(define_code_attr arith_shift_insn
++ [(plus "add") (minus "rsb") (ior "orr") (xor "eor") (and "and")])
++
+ ;;----------------------------------------------------------------------------
+ ;; Int iterators
+ ;;----------------------------------------------------------------------------
--- a/src/gcc/config/arm/arm.md
+++ b/src/gcc/config/arm/arm.md
-@@ -2863,6 +2863,28 @@
+@@ -200,17 +200,9 @@
+ (const_string "yes")]
+ (const_string "no")))
+
+-; Allows an insn to disable certain alternatives for reasons other than
+-; arch support.
+-(define_attr "insn_enabled" "no,yes"
+- (const_string "yes"))
+-
+ ; Enable all alternatives that are both arch_enabled and insn_enabled.
+ (define_attr "enabled" "no,yes"
+- (cond [(eq_attr "insn_enabled" "no")
+- (const_string "no")
+-
+- (and (eq_attr "predicable_short_it" "no")
++ (cond [(and (eq_attr "predicable_short_it" "no")
+ (and (eq_attr "predicated" "yes")
+ (match_test "arm_restrict_it")))
+ (const_string "no")
+@@ -2863,6 +2855,28 @@
(set_attr "type" "multiple")]
)
@@ -13303,7 +30355,7 @@ LANG=C svn diff svn://gcc.gnu.org/svn/gcc/branches/gcc-4_9-branch@211979 \
(define_insn_and_split "*anddi_notsesidi_di"
[(set (match_operand:DI 0 "s_register_operand" "=&r,&r")
(and:DI (not:DI (sign_extend:DI
-@@ -9345,8 +9367,10 @@
+@@ -9345,8 +9359,10 @@
"TARGET_32BIT"
"
{
@@ -13316,7 +30368,7 @@ LANG=C svn diff svn://gcc.gnu.org/svn/gcc/branches/gcc-4_9-branch@211979 \
XEXP (operands[0], 0) = force_reg (SImode, XEXP (operands[0], 0));
if (operands[2] == NULL_RTX)
-@@ -9363,8 +9387,10 @@
+@@ -9363,8 +9379,10 @@
"TARGET_32BIT"
"
{
@@ -13329,7 +30381,71 @@ LANG=C svn diff svn://gcc.gnu.org/svn/gcc/branches/gcc-4_9-branch@211979 \
XEXP (operands[1], 0) = force_reg (SImode, XEXP (operands[1], 0));
if (operands[3] == NULL_RTX)
-@@ -12669,6 +12695,44 @@
+@@ -9850,39 +9868,35 @@
+
+ ;; Patterns to allow combination of arithmetic, cond code and shifts
+
+-(define_insn "*arith_shiftsi"
+- [(set (match_operand:SI 0 "s_register_operand" "=r,r,r,r")
+- (match_operator:SI 1 "shiftable_operator"
+- [(match_operator:SI 3 "shift_operator"
+- [(match_operand:SI 4 "s_register_operand" "r,r,r,r")
+- (match_operand:SI 5 "shift_amount_operand" "M,M,M,r")])
+- (match_operand:SI 2 "s_register_operand" "rk,rk,r,rk")]))]
++(define_insn "*<arith_shift_insn>_multsi"
++ [(set (match_operand:SI 0 "s_register_operand" "=r,r")
++ (shiftable_ops:SI
++ (mult:SI (match_operand:SI 2 "s_register_operand" "r,r")
++ (match_operand:SI 3 "power_of_two_operand" ""))
++ (match_operand:SI 1 "s_register_operand" "rk,<t2_binop0>")))]
+ "TARGET_32BIT"
+- "%i1%?\\t%0, %2, %4%S3"
++ "<arith_shift_insn>%?\\t%0, %1, %2, lsl %b3"
+ [(set_attr "predicable" "yes")
+ (set_attr "predicable_short_it" "no")
+ (set_attr "shift" "4")
+- (set_attr "arch" "a,t2,t2,a")
+- ;; Thumb2 doesn't allow the stack pointer to be used for
+- ;; operand1 for all operations other than add and sub. In this case
+- ;; the minus operation is a candidate for an rsub and hence needs
+- ;; to be disabled.
+- ;; We have to make sure to disable the fourth alternative if
+- ;; the shift_operator is MULT, since otherwise the insn will
+- ;; also match a multiply_accumulate pattern and validate_change
+- ;; will allow a replacement of the constant with a register
+- ;; despite the checks done in shift_operator.
+- (set_attr_alternative "insn_enabled"
+- [(const_string "yes")
+- (if_then_else
+- (match_operand:SI 1 "add_operator" "")
+- (const_string "yes") (const_string "no"))
+- (const_string "yes")
+- (if_then_else
+- (match_operand:SI 3 "mult_operator" "")
+- (const_string "no") (const_string "yes"))])
+- (set_attr "type" "alu_shift_imm,alu_shift_imm,alu_shift_imm,alu_shift_reg")])
++ (set_attr "arch" "a,t2")
++ (set_attr "type" "alu_shift_imm")])
+
++(define_insn "*<arith_shift_insn>_shiftsi"
++ [(set (match_operand:SI 0 "s_register_operand" "=r,r,r")
++ (shiftable_ops:SI
++ (match_operator:SI 2 "shift_nomul_operator"
++ [(match_operand:SI 3 "s_register_operand" "r,r,r")
++ (match_operand:SI 4 "shift_amount_operand" "M,M,r")])
++ (match_operand:SI 1 "s_register_operand" "rk,<t2_binop0>,rk")))]
++ "TARGET_32BIT && GET_CODE (operands[3]) != MULT"
++ "<arith_shift_insn>%?\\t%0, %1, %3%S2"
++ [(set_attr "predicable" "yes")
++ (set_attr "predicable_short_it" "no")
++ (set_attr "shift" "4")
++ (set_attr "arch" "a,t2,a")
++ (set_attr "type" "alu_shift_imm,alu_shift_imm,alu_shift_reg")])
++
+ (define_split
+ [(set (match_operand:SI 0 "s_register_operand" "")
+ (match_operator:SI 1 "shiftable_operator"
+@@ -12669,6 +12683,44 @@
(set_attr "type" "rev")]
)
@@ -13376,7 +30492,11 @@ LANG=C svn diff svn://gcc.gnu.org/svn/gcc/branches/gcc-4_9-branch@211979 \
(bswap:HI (match_operand:HI 1 "s_register_operand" "r")))]
--- a/src/libobjc/ChangeLog.linaro
+++ b/src/libobjc/ChangeLog.linaro
-@@ -0,0 +1,15 @@
+@@ -0,0 +1,19 @@
++2014-07-17 Yvan Roux <yvan.roux@linaro.org>
++
++ GCC Linaro 4.9-2014.07 released.
++
+2014-06-25 Yvan Roux <yvan.roux@linaro.org>
+
+ GCC Linaro 4.9-2014.06-1 released.
@@ -13394,7 +30514,11 @@ LANG=C svn diff svn://gcc.gnu.org/svn/gcc/branches/gcc-4_9-branch@211979 \
+ GCC Linaro 4.9-2014.04 released.
--- a/src/libvtv/ChangeLog.linaro
+++ b/src/libvtv/ChangeLog.linaro
-@@ -0,0 +1,15 @@
+@@ -0,0 +1,19 @@
++2014-07-17 Yvan Roux <yvan.roux@linaro.org>
++
++ GCC Linaro 4.9-2014.07 released.
++
+2014-06-25 Yvan Roux <yvan.roux@linaro.org>
+
+ GCC Linaro 4.9-2014.06-1 released.
@@ -13434,7 +30558,11 @@ LANG=C svn diff svn://gcc.gnu.org/svn/gcc/branches/gcc-4_9-branch@211979 \
[Define to 1 if you have the `clock_gettime' function in librt.])])
--- a/src/libgfortran/ChangeLog.linaro
+++ b/src/libgfortran/ChangeLog.linaro
-@@ -0,0 +1,23 @@
+@@ -0,0 +1,27 @@
++2014-07-17 Yvan Roux <yvan.roux@linaro.org>
++
++ GCC Linaro 4.9-2014.07 released.
++
+2014-06-25 Yvan Roux <yvan.roux@linaro.org>
+
+ GCC Linaro 4.9-2014.06-1 released.
@@ -13460,7 +30588,11 @@ LANG=C svn diff svn://gcc.gnu.org/svn/gcc/branches/gcc-4_9-branch@211979 \
+ GCC Linaro 4.9-2014.04 released.
--- a/src/libada/ChangeLog.linaro
+++ b/src/libada/ChangeLog.linaro
-@@ -0,0 +1,15 @@
+@@ -0,0 +1,19 @@
++2014-07-17 Yvan Roux <yvan.roux@linaro.org>
++
++ GCC Linaro 4.9-2014.07 released.
++
+2014-06-25 Yvan Roux <yvan.roux@linaro.org>
+
+ GCC Linaro 4.9-2014.06-1 released.
@@ -13478,7 +30610,11 @@ LANG=C svn diff svn://gcc.gnu.org/svn/gcc/branches/gcc-4_9-branch@211979 \
+ GCC Linaro 4.9-2014.04 released.
--- a/src/libffi/ChangeLog.linaro
+++ b/src/libffi/ChangeLog.linaro
-@@ -0,0 +1,15 @@
+@@ -0,0 +1,19 @@
++2014-07-17 Yvan Roux <yvan.roux@linaro.org>
++
++ GCC Linaro 4.9-2014.07 released.
++
+2014-06-25 Yvan Roux <yvan.roux@linaro.org>
+
+ GCC Linaro 4.9-2014.06-1 released.
@@ -13496,7 +30632,11 @@ LANG=C svn diff svn://gcc.gnu.org/svn/gcc/branches/gcc-4_9-branch@211979 \
+ GCC Linaro 4.9-2014.04 released.
--- a/src/libssp/ChangeLog.linaro
+++ b/src/libssp/ChangeLog.linaro
-@@ -0,0 +1,15 @@
+@@ -0,0 +1,19 @@
++2014-07-17 Yvan Roux <yvan.roux@linaro.org>
++
++ GCC Linaro 4.9-2014.07 released.
++
+2014-06-25 Yvan Roux <yvan.roux@linaro.org>
+
+ GCC Linaro 4.9-2014.06-1 released.
@@ -13514,7 +30654,11 @@ LANG=C svn diff svn://gcc.gnu.org/svn/gcc/branches/gcc-4_9-branch@211979 \
+ GCC Linaro 4.9-2014.04 released.
--- a/src/libcilkrts/ChangeLog.linaro
+++ b/src/libcilkrts/ChangeLog.linaro
-@@ -0,0 +1,15 @@
+@@ -0,0 +1,19 @@
++2014-07-17 Yvan Roux <yvan.roux@linaro.org>
++
++ GCC Linaro 4.9-2014.07 released.
++
+2014-06-25 Yvan Roux <yvan.roux@linaro.org>
+
+ GCC Linaro 4.9-2014.06-1 released.
@@ -13532,7 +30676,11 @@ LANG=C svn diff svn://gcc.gnu.org/svn/gcc/branches/gcc-4_9-branch@211979 \
+ GCC Linaro 4.9-2014.04 released.
--- a/src/libcpp/ChangeLog.linaro
+++ b/src/libcpp/ChangeLog.linaro
-@@ -0,0 +1,15 @@
+@@ -0,0 +1,19 @@
++2014-07-17 Yvan Roux <yvan.roux@linaro.org>
++
++ GCC Linaro 4.9-2014.07 released.
++
+2014-06-25 Yvan Roux <yvan.roux@linaro.org>
+
+ GCC Linaro 4.9-2014.06-1 released.
@@ -13550,7 +30698,11 @@ LANG=C svn diff svn://gcc.gnu.org/svn/gcc/branches/gcc-4_9-branch@211979 \
+ GCC Linaro 4.9-2014.04 released.
--- a/src/libcpp/po/ChangeLog.linaro
+++ b/src/libcpp/po/ChangeLog.linaro
-@@ -0,0 +1,15 @@
+@@ -0,0 +1,19 @@
++2014-07-17 Yvan Roux <yvan.roux@linaro.org>
++
++ GCC Linaro 4.9-2014.07 released.
++
+2014-06-25 Yvan Roux <yvan.roux@linaro.org>
+
+ GCC Linaro 4.9-2014.06-1 released.
@@ -13568,7 +30720,11 @@ LANG=C svn diff svn://gcc.gnu.org/svn/gcc/branches/gcc-4_9-branch@211979 \
+ GCC Linaro 4.9-2014.04 released.
--- a/src/fixincludes/ChangeLog.linaro
+++ b/src/fixincludes/ChangeLog.linaro
-@@ -0,0 +1,15 @@
+@@ -0,0 +1,19 @@
++2014-07-17 Yvan Roux <yvan.roux@linaro.org>
++
++ GCC Linaro 4.9-2014.07 released.
++
+2014-06-25 Yvan Roux <yvan.roux@linaro.org>
+
+ GCC Linaro 4.9-2014.06-1 released.
diff --git a/debian/patches/gcc-multiarch-linaro.diff b/debian/patches/gcc-multiarch-linaro.diff
new file mode 100644
index 0000000..08e16ed
--- /dev/null
+++ b/debian/patches/gcc-multiarch-linaro.diff
@@ -0,0 +1,147 @@
+# DP: - Remaining multiarch patches, not yet submitted upstream.
+# DP: - Add MULTIARCH_DIRNAME definitions for multilib configurations,
+# DP: which are used for the non-multilib builds.
+
+2013-06-12 Matthias Klose <doko@ubuntu.com>
+
+ * config/i386/t-linux64: Set MULTIARCH_DIRNAME.
+ * config/i386/t-kfreebsd: Set MULTIARCH_DIRNAME.
+ * config.gcc (i[34567]86-*-linux* | x86_64-*-linux*): Prepend
+ i386/t-linux to $tmake_file.
+ * config/mips/t-linux64: Set MULTIARCH_DIRNAME.
+ * config/rs6000/t-linux64: Set MULTIARCH_DIRNAME.
+ * config/s390/t-linux64: Set MULTIARCH_DIRNAME.
+ * config/sparc/t-linux64: Set MULTIARCH_DIRNAME.
+
+Index: b/src/gcc/config/sh/t-linux
+===================================================================
+--- a/src/gcc/config/sh/t-linux
++++ b/src/gcc/config/sh/t-linux
+@@ -1,2 +1,4 @@
+ MULTILIB_DIRNAMES=
+ MULTILIB_MATCHES =
++
++MULTILIB_OSDIRNAMES = sh4-linux-gnu:sh4-linux-gnu sh4_nofpu-linux-gnu:sh4-linux-gnu
+Index: b/src/gcc/config/sparc/t-linux64
+===================================================================
+--- a/src/gcc/config/sparc/t-linux64
++++ b/src/gcc/config/sparc/t-linux64
+@@ -27,3 +27,5 @@ MULTILIB_OPTIONS = m64/m32
+ MULTILIB_DIRNAMES = 64 32
+ MULTILIB_OSDIRNAMES = ../lib64$(call if_multiarch,:sparc64-linux-gnu)
+ MULTILIB_OSDIRNAMES += $(if $(wildcard $(shell echo $(SYSTEM_HEADER_DIR))/../../usr/lib32),../lib32,../lib)$(call if_multiarch,:sparc-linux-gnu)
++
++MULTIARCH_DIRNAME = $(call if_multiarch,sparc$(if $(findstring 64,$(target)),64)-linux-gnu)
+Index: b/src/gcc/config/s390/t-linux64
+===================================================================
+--- a/src/gcc/config/s390/t-linux64
++++ b/src/gcc/config/s390/t-linux64
+@@ -9,3 +9,5 @@ MULTILIB_OPTIONS = m64/m31
+ MULTILIB_DIRNAMES = 64 32
+ MULTILIB_OSDIRNAMES = ../lib64$(call if_multiarch,:s390x-linux-gnu)
+ MULTILIB_OSDIRNAMES += $(if $(wildcard $(shell echo $(SYSTEM_HEADER_DIR))/../../usr/lib32),../lib32,../lib)$(call if_multiarch,:s390-linux-gnu)
++
++MULTIARCH_DIRNAME = $(call if_multiarch,s390$(if $(findstring s390x,$(target)),x)-linux-gnu)
+Index: b/src/gcc/config/rs6000/t-linux64
+===================================================================
+--- a/src/gcc/config/rs6000/t-linux64
++++ b/src/gcc/config/rs6000/t-linux64
+@@ -31,6 +31,8 @@ MULTILIB_EXTRA_OPTS :=
+ MULTILIB_OSDIRNAMES := m64=../lib64$(call if_multiarch,:powerpc64-linux-gnu)
+ MULTILIB_OSDIRNAMES += m32=$(if $(wildcard $(shell echo $(SYSTEM_HEADER_DIR))/../../usr/lib32),../lib32,../lib)$(call if_multiarch,:powerpc-linux-gnu)
+
++MULTIARCH_DIRNAME = $(call if_multiarch,powerpc$(if $(findstring 64,$(target)),64)-linux-gnu)
++
+ rs6000-linux.o: $(srcdir)/config/rs6000/rs6000-linux.c
+ $(COMPILE) $<
+ $(POSTCOMPILE)
+Index: b/src/gcc/config/i386/t-linux64
+===================================================================
+--- a/src/gcc/config/i386/t-linux64
++++ b/src/gcc/config/i386/t-linux64
+@@ -36,3 +36,13 @@ MULTILIB_DIRNAMES = $(patsubst m%, %,
+ MULTILIB_OSDIRNAMES = m64=../lib64$(call if_multiarch,:x86_64-linux-gnu)
+ MULTILIB_OSDIRNAMES+= m32=$(if $(wildcard $(shell echo $(SYSTEM_HEADER_DIR))/../../usr/lib32),../lib32,../lib)$(call if_multiarch,:i386-linux-gnu)
+ MULTILIB_OSDIRNAMES+= mx32=../libx32$(call if_multiarch,:x86_64-linux-gnux32)
++
++ifneq (,$(findstring x86_64,$(target)))
++ ifneq (,$(findstring biarchx32.h,$(tm_include_list)))
++ MULTIARCH_DIRNAME = $(call if_multiarch,x86_64-linux-gnux32)
++ else
++ MULTIARCH_DIRNAME = $(call if_multiarch,x86_64-linux-gnu)
++ endif
++else
++ MULTIARCH_DIRNAME = $(call if_multiarch,i386-linux-gnu)
++endif
+Index: b/src/gcc/config/i386/t-kfreebsd
+===================================================================
+--- a/src/gcc/config/i386/t-kfreebsd
++++ b/src/gcc/config/i386/t-kfreebsd
+@@ -1,5 +1,9 @@
+-MULTIARCH_DIRNAME = $(call if_multiarch,i386-kfreebsd-gnu)
++ifeq (,$(MULTIARCH_DIRNAME))
++ MULTIARCH_DIRNAME = $(call if_multiarch,i386-kfreebsd-gnu)
++endif
+
+ # MULTILIB_OSDIRNAMES are set in t-linux64.
+ KFREEBSD_OS = $(filter kfreebsd%, $(word 3, $(subst -, ,$(target))))
+ MULTILIB_OSDIRNAMES := $(filter-out mx32=%,$(subst linux,$(KFREEBSD_OS),$(MULTILIB_OSDIRNAMES)))
++
++MULTIARCH_DIRNAME := $(subst linux,$(KFREEBSD_OS),$(MULTIARCH_DIRNAME))
+Index: b/src/gcc/config/mips/t-linux64
+===================================================================
+--- a/src/gcc/config/mips/t-linux64
++++ b/src/gcc/config/mips/t-linux64
+@@ -24,3 +24,13 @@ MULTILIB_OSDIRNAMES = \
+ ../lib32$(call if_multiarch,:mips64$(MIPS_EL)-linux-gnuabin32$(MIPS_SOFT)) \
+ ../lib$(call if_multiarch,:mips$(MIPS_EL)-linux-gnu$(MIPS_SOFT)) \
+ ../lib64$(call if_multiarch,:mips64$(MIPS_EL)-linux-gnuabi64$(MIPS_SOFT))
++
++ifneq (,$(findstring abin32,$(target)))
++MULTIARCH_DIRNAME = $(call if_multiarch,mips64$(MIPS_EL)-linux-gnuabin32$(MIPS_SOFT))
++else
++ifneq (,$(findstring abi64,$(target)))
++MULTIARCH_DIRNAME = $(call if_multiarch,mips64$(MIPS_EL)-linux-gnuabi64$(MIPS_SOFT))
++else
++MULTIARCH_DIRNAME = $(call if_multiarch,mips$(MIPS_EL)-linux-gnu$(MIPS_SOFT))
++endif
++endif
+Index: b/src/gcc/config.gcc
+===================================================================
+--- a/src/gcc/config.gcc
++++ b/src/gcc/config.gcc
+@@ -1959,8 +1959,11 @@ mips64*-*-linux* | mipsisa64*-*-linux*)
+ tm_file="dbxelf.h elfos.h gnu-user.h linux.h linux-android.h glibc-stdint.h ${tm_file} mips/gnu-user.h mips/gnu-user64.h mips/linux64.h mips/linux-common.h"
+ extra_options="${extra_options} linux-android.opt"
+ tmake_file="${tmake_file} mips/t-linux64"
+- tm_defines="${tm_defines} MIPS_ABI_DEFAULT=ABI_N32"
++ tm_defines="${tm_defines} MIPS_ABI_DEFAULT=ABI_64"
+ case ${target} in
++ *gnuabin32*)
++ tm_defines=$(echo ${tm_defines}| sed 's/MIPS_ABI_DEFAULT=ABI_64/MIPS_ABI_DEFAULT=ABI_N32/g')
++ ;;
+ mips64el-st-linux-gnu)
+ tm_file="${tm_file} mips/st.h"
+ tmake_file="${tmake_file} mips/t-st"
+@@ -4107,7 +4110,7 @@ case ${target} in
+ i[34567]86-*-darwin* | x86_64-*-darwin*)
+ ;;
+ i[34567]86-*-linux* | x86_64-*-linux*)
+- tmake_file="$tmake_file i386/t-linux"
++ tmake_file="i386/t-linux $tmake_file"
+ ;;
+ i[34567]86-*-kfreebsd*-gnu | x86_64-*-kfreebsd*-gnu)
+ tmake_file="$tmake_file i386/t-kfreebsd"
+Index: b/src/gcc/config/aarch64/t-aarch64-linux
+===================================================================
+--- a/src/gcc/config/aarch64/t-aarch64-linux
++++ b/src/gcc/config/aarch64/t-aarch64-linux
+@@ -22,7 +22,7 @@ LIB1ASMSRC = aarch64/lib1funcs.asm
+ LIB1ASMFUNCS = _aarch64_sync_cache_range
+
+ AARCH_BE = $(if $(findstring TARGET_BIG_ENDIAN_DEFAULT=1, $(tm_defines)),_be)
+-MULTILIB_OSDIRNAMES = mabi.lp64=../lib64$(call if_multiarch,:aarch64$(AARCH_BE)-linux-gnu)
++MULTILIB_OSDIRNAMES = mabi.lp64=../lib$(call if_multiarch,:aarch64$(AARCH_BE)-linux-gnu)
+ MULTIARCH_DIRNAME = $(call if_multiarch,aarch64$(AARCH_BE)-linux-gnu)
+
+ MULTILIB_OSDIRNAMES += mabi.ilp32=../libilp32
diff --git a/debian/patches/svn-updates.diff b/debian/patches/svn-updates.diff
index c95af02..5d2874f 100644
--- a/debian/patches/svn-updates.diff
+++ b/debian/patches/svn-updates.diff
@@ -1,10 +1,10 @@
-# DP: updates from the 4.9 branch upto 20140712 (r212479).
+# DP: updates from the 4.9 branch upto 20140724 (r212995).
last_update()
{
cat > ${dir}LAST_UPDATED <EOF
-Sat Jul 12 13:02:22 CEST 2014
-Sat Jul 12 11:02:22 UTC 2014 (revision 212479)
+Thu Jul 24 16:26:03 CEST 2014
+Thu Jul 24 14:26:03 UTC 2014 (revision 212995)
EOF
}
@@ -12,3 +12,1948 @@ LANG=C svn diff svn://gcc.gnu.org/svn/gcc/tags/gcc_4_9_1_release svn://gcc.gnu.o
| sed -r 's,^--- (\S+)\t(\S+)(.*)$,--- a/src/\1\t\2,;s,^\+\+\+ (\S+)\t(\S+)(.*)$,+++ b/src/\1\t\2,' \
| awk '/^Index:.*\.(class|texi)/ {skip=1; next} /^Index:/ { skip=0 } skip==0'
+Index: gcc/c-family/c-gimplify.c
+===================================================================
+--- a/src/gcc/c-family/c-gimplify.c (.../tags/gcc_4_9_1_release)
++++ b/src/gcc/c-family/c-gimplify.c (.../branches/gcc-4_9-branch)
+@@ -199,9 +199,7 @@
+ tree type = TREE_TYPE (TREE_OPERAND (*expr_p, 0));
+ if (INTEGRAL_TYPE_P (type) && c_promoting_integer_type_p (type))
+ {
+- if (TYPE_OVERFLOW_UNDEFINED (type)
+- || ((flag_sanitize & SANITIZE_SI_OVERFLOW)
+- && !TYPE_OVERFLOW_WRAPS (type)))
++ if (!TYPE_OVERFLOW_WRAPS (type))
+ type = unsigned_type_for (type);
+ return gimplify_self_mod_expr (expr_p, pre_p, post_p, 1, type);
+ }
+Index: gcc/c-family/ChangeLog
+===================================================================
+--- a/src/gcc/c-family/ChangeLog (.../tags/gcc_4_9_1_release)
++++ b/src/gcc/c-family/ChangeLog (.../branches/gcc-4_9-branch)
+@@ -1,3 +1,13 @@
++2014-07-17 Richard Biener <rguenther@suse.de>
++
++ Backport from mainline
++ 2014-07-09 Richard Biener <rguenther@suse.de>
++
++ PR c-family/61741
++ * c-gimplify.c (c_gimplify_expr): Gimplify self-modify expressions
++ using unsigned arithmetic if overflow does not wrap instead of
++ if overflow is undefined.
++
+ 2014-07-16 Release Manager
+
+ * GCC 4.9.1 released.
+Index: gcc/DATESTAMP
+===================================================================
+--- a/src/gcc/DATESTAMP (.../tags/gcc_4_9_1_release)
++++ b/src/gcc/DATESTAMP (.../branches/gcc-4_9-branch)
+@@ -1 +1 @@
+-20140716
++20140724
+Index: gcc/omp-low.c
+===================================================================
+--- a/src/gcc/omp-low.c (.../tags/gcc_4_9_1_release)
++++ b/src/gcc/omp-low.c (.../branches/gcc-4_9-branch)
+@@ -1872,7 +1872,6 @@
+ TREE_STATIC (decl) = 1;
+ TREE_USED (decl) = 1;
+ DECL_ARTIFICIAL (decl) = 1;
+- DECL_NAMELESS (decl) = 1;
+ DECL_IGNORED_P (decl) = 0;
+ TREE_PUBLIC (decl) = 0;
+ DECL_UNINLINABLE (decl) = 1;
+Index: gcc/toplev.c
+===================================================================
+--- a/src/gcc/toplev.c (.../tags/gcc_4_9_1_release)
++++ b/src/gcc/toplev.c (.../branches/gcc-4_9-branch)
+@@ -1052,16 +1052,19 @@
+
+ if (warn_stack_usage >= 0)
+ {
++ const location_t loc = DECL_SOURCE_LOCATION (current_function_decl);
++
+ if (stack_usage_kind == DYNAMIC)
+- warning (OPT_Wstack_usage_, "stack usage might be unbounded");
++ warning_at (loc, OPT_Wstack_usage_, "stack usage might be unbounded");
+ else if (stack_usage > warn_stack_usage)
+ {
+ if (stack_usage_kind == DYNAMIC_BOUNDED)
+- warning (OPT_Wstack_usage_, "stack usage might be %wd bytes",
+- stack_usage);
++ warning_at (loc,
++ OPT_Wstack_usage_, "stack usage might be %wd bytes",
++ stack_usage);
+ else
+- warning (OPT_Wstack_usage_, "stack usage is %wd bytes",
+- stack_usage);
++ warning_at (loc, OPT_Wstack_usage_, "stack usage is %wd bytes",
++ stack_usage);
+ }
+ }
+ }
+Index: gcc/ChangeLog
+===================================================================
+--- a/src/gcc/ChangeLog (.../tags/gcc_4_9_1_release)
++++ b/src/gcc/ChangeLog (.../branches/gcc-4_9-branch)
+@@ -1,3 +1,138 @@
++2014-07-23 Sebastian Huber <sebastian.huber@embedded-brains.de>
++
++ * config/arm/t-rtems-eabi: Add
++ mthumb/march=armv7-r/mfpu=vfpv3-d16/mfloat-abi=hard,
++ mthumb/march=armv7-m/mfpu=fpv4-sp-d16/mfloat-abi=hard,
++ mbig-endian/mthumb/march=armv7-r, and
++ mbig-endian/mthumb/march=armv7-r/mfpu=vfpv3-d16/mfloat-abi=hard
++ multilibs.
++
++2014-07-23 Sebastian Huber <sebastian.huber@embedded-brains.de>
++ Chris Johns <chrisj@rtems.org>
++ Joel Sherrill <joel.sherrill@oarcorp.com>
++
++ * config.gcc: Add nios2-*-rtems*.
++ * config/nios2/rtems.h: New file.
++ * gcc/config/nios2/t-rtems: New file.
++
++2014-07-21 Peter Bergner <bergner@vnet.ibm.com>
++
++ * config/rs6000/sysv4.h (LIBASAN_EARLY_SPEC): Define.
++ (LIBTSAN_EARLY_SPEC): Likewise.
++
++2014-07-21 Uros Bizjak <ubizjak@gmail.com>
++
++ Backport from mainline
++ 2014-07-21 Uros Bizjak <ubizjak@gmail.com>
++
++ PR target/61855
++ * config/i386/avx512fintrin.h: Move constants for mantissa extraction
++ out of #ifdef __OPTIMIZE__.
++
++2014-07-20 Eric Botcazou <ebotcazou@adacore.com>
++
++ * expr.c (store_field): Handle VOIDmode for calls that return values
++ in multiple locations.
++
++2014-07-19 Eric Botcazou <ebotcazou@adacore.com>
++
++ * toplev.c (output_stack_usage): Adjust the location of the warning.
++
++2014-07-19 Daniel Cederman <cederman@gaisler.com>
++
++ * config/sparc/sync.md (*membar_storeload_leon3): New insn.
++ (*membar_storeload): Disable for LEON3.
++
++2014-07-18 Uros Bizjak <ubizjak@gmail.com>
++
++ Backport from mainline
++ 2014-07-16 David Wohlferd <dw@LimeGreenSocks.com>
++
++ PR target/61662
++ * config/i386/ia32intrin.h: Use __LP64__ to determine size of long.
++
++2014-07-18 Uros Bizjak <ubizjak@gmail.com>
++
++ Backport from mainline
++ 2014-07-18 Uros Bizjak <ubizjak@gmail.com>
++
++ PR target/61794
++ * config/i386/sse.md (avx512f_vextract<shuffletype>32x4_1_maskm):
++ Fix instruction constraint.
++ (<mask_codefor>avx512f_vextract<shuffletype>32x4_1<mask_name>): Ditto.
++
++2014-07-17 Richard Biener <rguenther@suse.de>
++
++ Backport from mainline
++ 2014-07-14 Richard Biener <rguenther@suse.de>
++
++ PR tree-optimization/61779
++ * tree-ssa-copy.c (copy_prop_visit_cond_stmt): Always try
++ simplifying a condition.
++
++2014-07-17 Richard Biener <rguenther@suse.de>
++
++ PR rtl-optimization/61801
++ * sched-deps.c (sched_analyze_2): For ASM_OPERANDS and ASM_INPUT
++ don't set reg_pending_barrier if it appears in a debug-insn.
++
++2014-07-17 Hans-Peter Nilsson <hp@axis.com>
++
++ Backport from trunk.
++ PR target/61737.
++ * config/cris/cris.c (TARGET_LEGITIMATE_CONSTANT_P)
++ (TARGET_CANNOT_FORCE_CONST_MEM): Define.
++ (cris_cannot_force_const_mem, cris_legitimate_constant_p): New
++ functions.
++ (cris_print_index, cris_print_operand, cris_constant_index_p)
++ (cris_side_effect_mode_ok): Replace CONSTANT_P with CRIS_CONSTANT_P.
++ (cris_address_cost): Ditto last CONSTANT_P.
++ (cris_symbol_type_of): Rename from cris_pic_symbol_type_of. All
++ callers changed. Yield cris_offsettable_symbol for non-PIC
++ constant symbolic expressions including labels. Yield cris_unspec
++ for all unspecs.
++ (cris_expand_pic_call_address): New parameter MARKERP. Set its
++ target to pic_offset_table_rtx for calls that will likely go
++ through PLT, const0_rtx when they can't. All callers changed.
++ Assert flag_pic. Use CONSTANT_P, not CONSTANT_ADDRESS_P, for
++ symbolic expressions to be PICified. Remove second, redundant,
++ assert on can_create_pseudo_p returning non-zero. Use
++ replace_equiv_address_nv, not replace_equiv_address, for final
++ operand update.
++ * config/cris/cris.md ("movsi"): Move variable t to pattern
++ toplevel. Adjust assert for new cris_symbol_type member. Use
++ CONSTANT_P instead of CONSTANT_ADDRESS_P.
++ ("*movsi_internal") <case 9>: Make check for valid unspec operands
++ for lapc stricter.
++ <case CRIS_UNSPEC_PCREL, CRIS_UNSPEC_PLT_PCREL>: Clear condition codes.
++ ("call", "call_value"): Use second incoming operand as a marker
++ for pic-offset-table-register being used.
++ ("*expanded_call_non_v32", "*expanded_call_v32")
++ ("*expanded_call_value_non_v32", "*expanded_call_value_v32"): For
++ second incoming operand to CALL, match cris_call_type_marker.
++ ("*expanded_call_value_side"): Ditto. Disable before reload_completed.
++ ("*expanded_call_side"): Ditto. Fix typo in comment.
++ (moverside, movemside peepholes): Check for CRIS_CONSTANT_P, not
++ CONSTANT_P.
++ * config/cris/predicates.md ("cris_call_type_marker"): New predicate.
++ * config/cris/cris.h (CRIS_CONSTANT_P): New macro.
++ (enum cris_symbol_type): Rename from cris_pic_symbol_type. All
++ users changed. Add members cris_offsettable_symbol and cris_unspec.
++ (cris_symbol_type): Rename from cris_pic_symbol_type.
++ * config/cris/constraints.md ("T"): Use CRIS_CONSTANT_P, not
++ just CONSTANT_P.
++ * config/cris/cris-protos.h (cris_symbol_type_of,
++ cris_expand_pic_call_address): Adjust prototypes.
++ (cris_legitimate_constant_p): New prototype.
++
++ * config.gcc (crisv32-*-linux* | cris-*-linux*): Do not override
++ an existing tmake_file. Don't add t-slibgcc and t-linux.
++
++2014-07-16 Jakub Jelinek <jakub@redhat.com>
++
++ * omp-low.c (create_omp_child_function): Don't set DECL_NAMELESS
++ on the FUNCTION_DECL.
++
+ 2014-07-16 Release Manager
+
+ * GCC 4.9.1 released.
+@@ -4,14 +142,14 @@
+
+ 2014-07-10 Cary Coutant <ccoutant@google.com>
+
+- Backport from trunk at r212211.
++ Backport from trunk at r212211.
+
+ * dwarf2out.c (remove_addr_table_entry): Remove unnecessary hash table
+- lookup.
++ lookup.
+ (resolve_addr_in_expr): When replacing the rtx in a location list
+- entry, get a new address table entry.
++ entry, get a new address table entry.
+ (dwarf2out_finish): Call index_location_lists even if there are no
+- addr_index_table entries yet.
++ addr_index_table entries yet.
+
+ 2014-07-10 Tom G. Christensen <tgc@jupiterrise.com>
+
+@@ -33,13 +171,13 @@
+ PR target/61062
+ * config/arm/arm_neon.h (vtrn_s8, vtrn_s16, vtrn_u8, vtrn_u16, vtrn_p8,
+ vtrn_p16, vtrn_s32, vtrn_f32, vtrn_u32, vtrnq_s8, vtrnq_s16, vtrnq_s32,
+- vtrnq_f32, vtrnq_u8, vtrnq_u16, vtrnq_u32, vtrnq_p8, vtrnq_p16, vzip_s8,
+- vzip_s16, vzip_u8, vzip_u16, vzip_p8, vzip_p16, vzip_s32, vzip_f32,
+- vzip_u32, vzipq_s8, vzipq_s16, vzipq_s32, vzipq_f32, vzipq_u8,
+- vzipq_u16, vzipq_u32, vzipq_p8, vzipq_p16, vuzp_s8, vuzp_s16, vuzp_s32,
+- vuzp_f32, vuzp_u8, vuzp_u16, vuzp_u32, vuzp_p8, vuzp_p16, vuzpq_s8,
+- vuzpq_s16, vuzpq_s32, vuzpq_f32, vuzpq_u8, vuzpq_u16, vuzpq_u32,
+- vuzpq_p8, vuzpq_p16): Correct mask for bigendian.
++ vtrnq_f32, vtrnq_u8, vtrnq_u16, vtrnq_u32, vtrnq_p8, vtrnq_p16,
++ vzip_s8, vzip_s16, vzip_u8, vzip_u16, vzip_p8, vzip_p16, vzip_s32,
++ vzip_f32, vzip_u32, vzipq_s8, vzipq_s16, vzipq_s32, vzipq_f32,
++ vzipq_u8, vzipq_u16, vzipq_u32, vzipq_p8, vzipq_p16, vuzp_s8, vuzp_s16,
++ vuzp_s32, vuzp_f32, vuzp_u8, vuzp_u16, vuzp_u32, vuzp_p8, vuzp_p16,
++ vuzpq_s8, vuzpq_s16, vuzpq_s32, vuzpq_f32, vuzpq_u8, vuzpq_u16,
++ vuzpq_u32, vuzpq_p8, vuzpq_p16): Correct mask for bigendian.
+
+
+ 2014-07-09 Alan Lawrence <alan.lawrence@arm.com>
+@@ -157,11 +295,9 @@
+ 2014-06-24 Jakub Jelinek <jakub@redhat.com>
+
+ * gimplify.c (gimplify_scan_omp_clauses) <case OMP_CLAUSE_MAP,
+- OMP_CLAUSE_TO, OMP_CLAUSE_FROM): Make sure OMP_CLAUSE_SIZE is
+- non-NULL.
++ OMP_CLAUSE_TO, OMP_CLAUSE_FROM): Make sure OMP_CLAUSE_SIZE is non-NULL.
+ <case OMP_CLAUSE_ALIGNED>: Gimplify OMP_CLAUSE_ALIGNED_ALIGNMENT.
+- (gimplify_adjust_omp_clauses_1): Make sure OMP_CLAUSE_SIZE is
+- non-NULL.
++ (gimplify_adjust_omp_clauses_1): Make sure OMP_CLAUSE_SIZE is non-NULL.
+ (gimplify_adjust_omp_clauses): Likewise.
+ * omp-low.c (lower_rec_simd_input_clauses,
+ lower_rec_input_clauses, expand_omp_simd): Handle non-constant
+@@ -176,9 +312,8 @@
+
+ 2014-06-18 Jakub Jelinek <jakub@redhat.com>
+
+- * gimplify.c (omp_notice_variable): If n is non-NULL
+- and no flags change in ORT_TARGET region, don't jump to
+- do_outer.
++ * gimplify.c (omp_notice_variable): If n is non-NULL and no flags
++ change in ORT_TARGET region, don't jump to do_outer.
+ (struct gimplify_adjust_omp_clauses_data): New type.
+ (gimplify_adjust_omp_clauses_1): Adjust for data being
+ a struct gimplify_adjust_omp_clauses_data pointer instead
+@@ -196,14 +331,12 @@
+ gimple_seq * argument to omp_finish_clause hook.
+ * omp-low.c (scan_sharing_clauses): Call scan_omp_op on
+ non-DECL_P OMP_CLAUSE_DECL if ctx->outer.
+- (scan_omp_parallel, lower_omp_for): When adding
+- _LOOPTEMP_ clause var, add it to outer ctx's decl_map
+- as identity.
++ (scan_omp_parallel, lower_omp_for): When adding _LOOPTEMP_ clause var,
++ add it to outer ctx's decl_map as identity.
+ * tree-core.h (OMP_CLAUSE_MAP_TO_PSET): New map kind.
+ * tree-nested.c (convert_nonlocal_omp_clauses,
+ convert_local_omp_clauses): Handle various OpenMP 4.0 clauses.
+- * tree-pretty-print.c (dump_omp_clause): Handle
+- OMP_CLAUSE_MAP_TO_PSET.
++ * tree-pretty-print.c (dump_omp_clause): Handle OMP_CLAUSE_MAP_TO_PSET.
+
+ 2014-06-10 Jakub Jelinek <jakub@redhat.com>
+
+@@ -227,8 +360,7 @@
+ OMP_CLAUSE_LINEAR_STMT.
+ * omp-low.c (lower_rec_input_clauses): Fix typo.
+ (maybe_add_implicit_barrier_cancel, lower_omp_1): Add
+- cast between Fortran boolean_type_node and C _Bool if
+- needed.
++ cast between Fortran boolean_type_node and C _Bool if needed.
+
+ 2014-06-30 Jason Merrill <jason@redhat.com>
+
+@@ -279,8 +411,7 @@
+ (aarch64_sqdmlsl_lane<mode>): Likewise.
+ (aarch64_sqdmull_lane<mode>): Likewise.
+ (aarch64_sqdmull2_lane<mode>): Likewise.
+- (aarch64_sqdmlal_laneq<mode>):
+- Replace VCON usage with VCONQ.
++ (aarch64_sqdmlal_laneq<mode>): Replace VCON usage with VCONQ.
+ Emit aarch64_sqdmlal_laneq<mode>_internal insn.
+ (aarch64_sqdmlal2_laneq<mode>): Emit
+ aarch64_sqdmlal2_laneq<mode>_internal insn.
+Index: gcc/testsuite/gcc.target/i386/pr61855.c
+===================================================================
+--- a/src/gcc/testsuite/gcc.target/i386/pr61855.c (.../tags/gcc_4_9_1_release)
++++ b/src/gcc/testsuite/gcc.target/i386/pr61855.c (.../branches/gcc-4_9-branch)
+@@ -0,0 +1,10 @@
++/* { dg-do compile } */
++/* { dg-options "-mavx512f" } */
++
++#include <x86intrin.h>
++
++__m512 test (__m512 x)
++{
++ return _mm512_getmant_ps(x, _MM_MANT_NORM_1_2, _MM_MANT_SIGN_zero);
++}
++
+Index: gcc/testsuite/gcc.target/i386/pr61794.c
+===================================================================
+--- a/src/gcc/testsuite/gcc.target/i386/pr61794.c (.../tags/gcc_4_9_1_release)
++++ b/src/gcc/testsuite/gcc.target/i386/pr61794.c (.../branches/gcc-4_9-branch)
+@@ -0,0 +1,12 @@
++/* { dg-do compile } */
++/* { dg-options "-mavx512f" } */
++
++#include <x86intrin.h>
++
++__m512i zmm;
++__m128i xmm;
++
++void test (void)
++{
++ xmm = _mm512_extracti32x4_epi32 (zmm, 0);
++}
+Index: gcc/testsuite/gfortran.dg/dependency_44.f90
+===================================================================
+--- a/src/gcc/testsuite/gfortran.dg/dependency_44.f90 (.../tags/gcc_4_9_1_release)
++++ b/src/gcc/testsuite/gfortran.dg/dependency_44.f90 (.../branches/gcc-4_9-branch)
+@@ -0,0 +1,36 @@
++! { dg-do run }
++! Tests fix for PR61780 in which the loop reversal mechanism was
++! not accounting for the first index being an element so that no
++! loop in this dimension is created.
++!
++! Contributed by Manfred Tietze on clf.
++!
++program prgm3
++ implicit none
++ integer, parameter :: n = 10, k = 3
++ integer :: i, j
++ integer, dimension(n,n) :: y
++ integer :: res1(n), res2(n)
++
++1 format(10i5)
++
++!initialize
++ do i=1,n
++ do j=1,n
++ y(i,j) = n*i + j
++ end do
++ end do
++ res2 = y(k,:)
++
++!shift right
++ y(k,4:n) = y(k,3:n-1)
++ y(k,3) = 0
++ res1 = y(k,:)
++ y(k,:) = res2
++ y(k,n:4:-1) = y(k,n-1:3:-1)
++ y(k,3) = 0
++ res2 = y(k,:)
++! print *, res1
++! print *, res2
++ if (any(res1 /= res2)) call abort ()
++end program prgm3
+Index: gcc/testsuite/gnat.dg/pack20.adb
+===================================================================
+--- a/src/gcc/testsuite/gnat.dg/pack20.adb (.../tags/gcc_4_9_1_release)
++++ b/src/gcc/testsuite/gnat.dg/pack20.adb (.../branches/gcc-4_9-branch)
+@@ -0,0 +1,9 @@
++package body Pack20 is
++
++ procedure Proc (A : Rec) is
++ Local : Rec := A;
++ begin
++ Modify (Local.Fixed);
++ end;
++
++end Pack20;
+Index: gcc/testsuite/gnat.dg/pack20.ads
+===================================================================
+--- a/src/gcc/testsuite/gnat.dg/pack20.ads (.../tags/gcc_4_9_1_release)
++++ b/src/gcc/testsuite/gnat.dg/pack20.ads (.../branches/gcc-4_9-branch)
+@@ -0,0 +1,15 @@
++-- { dg-do compile }
++
++with Pack20_Pkg; use Pack20_Pkg;
++
++package Pack20 is
++
++ type Rec is record
++ Simple_Type : Integer;
++ Fixed : String_Ptr;
++ end record;
++ pragma Pack (Rec);
++
++ procedure Proc (A : Rec);
++
++end Pack20;
+Index: gcc/testsuite/gnat.dg/pack20_pkg.ads
+===================================================================
+--- a/src/gcc/testsuite/gnat.dg/pack20_pkg.ads (.../tags/gcc_4_9_1_release)
++++ b/src/gcc/testsuite/gnat.dg/pack20_pkg.ads (.../branches/gcc-4_9-branch)
+@@ -0,0 +1,7 @@
++package Pack20_Pkg is
++
++ type String_Ptr is access all String;
++
++ procedure Modify (Fixed : in out String_Ptr);
++
++end Pack20_Pkg;
+Index: gcc/testsuite/gcc.dg/tree-ssa/ssa-copyprop-2.c
+===================================================================
+--- a/src/gcc/testsuite/gcc.dg/tree-ssa/ssa-copyprop-2.c (.../tags/gcc_4_9_1_release)
++++ b/src/gcc/testsuite/gcc.dg/tree-ssa/ssa-copyprop-2.c (.../branches/gcc-4_9-branch)
+@@ -0,0 +1,13 @@
++/* { dg-do compile } */
++/* { dg-options "-Og -fdump-tree-optimized" } */
++
++extern long long __sdt_unsp;
++void
++f(void)
++{
++ for (;;)
++ __asm__ ("%0" :: "i" (((!__extension__ (__builtin_constant_p ((((unsigned long long) (__typeof (__builtin_choose_expr (((__builtin_classify_type (0) + 3) & -4) == 4, (0), 0U))) __sdt_unsp) ) == 0) )) ? 1 : -1) ));
++}
++
++/* { dg-final { scan-tree-dump-not "PHI" "optimized" } } */
++/* { dg-final { cleanup-tree-dump "optimized" } } */
+Index: gcc/testsuite/gcc.dg/stack-usage-2.c
+===================================================================
+--- a/src/gcc/testsuite/gcc.dg/stack-usage-2.c (.../tags/gcc_4_9_1_release)
++++ b/src/gcc/testsuite/gcc.dg/stack-usage-2.c (.../branches/gcc-4_9-branch)
+@@ -1,21 +1,21 @@
+ /* { dg-do compile } */
+ /* { dg-options "-Wstack-usage=512" } */
+
+-int foo1 (void)
++int foo1 (void) /* { dg-bogus "stack usage" } */
+ {
+ char arr[16];
+ arr[0] = 1;
+ return 0;
+-} /* { dg-bogus "stack usage" } */
++}
+
+-int foo2 (void)
++int foo2 (void) /* { dg-warning "stack usage is \[0-9\]* bytes" } */
+ {
+ char arr[1024];
+ arr[0] = 1;
+ return 0;
+-} /* { dg-warning "stack usage is \[0-9\]* bytes" } */
++}
+
+-int foo3 (void)
++int foo3 (void) /* { dg-warning "stack usage might be \[0-9\]* bytes" } */
+ {
+ char arr[1024] __attribute__((aligned (512)));
+ arr[0] = 1;
+@@ -22,12 +22,11 @@
+ /* Force dynamic realignment of argument pointer. */
+ __builtin_apply ((void (*)()) foo2, 0, 0);
+ return 0;
++}
+
+-} /* { dg-warning "stack usage might be \[0-9\]* bytes" } */
+-
+-int foo4 (int n)
++int foo4 (int n) /* { dg-warning "stack usage might be unbounded" } */
+ {
+ char arr[n];
+ arr[0] = 1;
+ return 0;
+-} /* { dg-warning "stack usage might be unbounded" } */
++}
+Index: gcc/testsuite/ChangeLog
+===================================================================
+--- a/src/gcc/testsuite/ChangeLog (.../tags/gcc_4_9_1_release)
++++ b/src/gcc/testsuite/ChangeLog (.../branches/gcc-4_9-branch)
+@@ -1,3 +1,61 @@
++2014-07-24 Martin Jambor <mjambor@suse.cz>
++
++ PR ipa/61160
++ * g++.dg/ipa/pr61160-2.C (main): Return zero.
++ * g++.dg/ipa/pr61160-3.C (main): Likewise.
++
++2014-07-21 Uros Bizjak <ubizjak@gmail.com>
++
++ Backport from mainline
++ 2014-07-21 Uros Bizjak <ubizjak@gmail.com>
++
++ PR target/61855
++ * gcc.target/i386/pr61855.c: New test.
++
++2014-07-20 Eric Botcazou <ebotcazou@adacore.com>
++
++ * gnat.dg/pack20.ad[sb]: New test.
++ * gnat.dg/pack20_pkg.ads: New helper.
++
++2014-07-19 Eric Botcazou <ebotcazou@adacore.com>
++
++ * gcc.dg/stack-usage-2.c: Adjust.
++
++2014-07-19 Paul Thomas <pault@gcc.gnu.org>
++
++ Backport from mainline
++ PR fortran/61780
++ * gfortran.dg/dependency_44.f90 : New test
++
++2014-07-18 Uros Bizjak <ubizjak@gmail.com>
++
++ Backport from mainline
++ 2014-07-18 Uros Bizjak <ubizjak@gmail.com>
++
++ PR target/61794
++ * gcc.target/i386/pr61794.c: New test.
++
++2014-07-17 Richard Biener <rguenther@suse.de>
++
++ Backport from mainline
++ 2014-07-10 Richard Biener <rguenther@suse.de>
++
++ PR c-family/61741
++ * c-c++-common/torture/pr61741.c: Use signed char.
++
++ 2014-07-09 Richard Biener <rguenther@suse.de>
++
++ PR c-family/61741
++ * c-c++-common/torture/pr61741.c: New testcase.
++
++2014-07-17 Richard Biener <rguenther@suse.de>
++
++ Backport from mainline
++ 2014-07-14 Richard Biener <rguenther@suse.de>
++
++ PR tree-optimization/61779
++ * gcc.dg/tree-ssa/ssa-copyprop-2.c: New testcase.
++
+ 2014-07-16 Release Manager
+
+ * GCC 4.9.1 released.
+@@ -17,7 +75,8 @@
+ 2014-06-09 Alan Lawrence <alan.lawrence@arm.com>
+
+ PR target/61062
+- * gcc.target/arm/pr48252.c (main): Expect same result as endian-neutral.
++ * gcc.target/arm/pr48252.c (main): Expect same result as
++ endian-neutral.
+
+ 2014-07-08 Jakub Jelinek <jakub@redhat.com>
+
+@@ -34,8 +93,8 @@
+
+ 2014-07-08 Alan Lawrence <alan.lawrence@arm.com>
+
+- Backport r211502 from mainline.
+- 2014-06-10 Alan Lawrence <alan.lawrence@arm.com>
++ Backport r211502 from mainline.
++ 2014-06-10 Alan Lawrence <alan.lawrence@arm.com>
+
+ PR target/59843
+ * gcc.dg/vect/vect-singleton_1.c: New file.
+Index: gcc/testsuite/g++.dg/ipa/pr61160-1.C
+===================================================================
+--- a/src/gcc/testsuite/g++.dg/ipa/pr61160-1.C (.../tags/gcc_4_9_1_release)
++++ b/src/gcc/testsuite/g++.dg/ipa/pr61160-1.C (.../branches/gcc-4_9-branch)
+@@ -27,5 +27,6 @@
+ int main ()
+ {
+ CExample c;
+- return (test (c) != &c);
++ test (c);
++ return 0;
+ }
+Index: gcc/testsuite/g++.dg/ipa/pr61160-2.C
+===================================================================
+--- a/src/gcc/testsuite/g++.dg/ipa/pr61160-2.C (.../tags/gcc_4_9_1_release)
++++ b/src/gcc/testsuite/g++.dg/ipa/pr61160-2.C (.../branches/gcc-4_9-branch)
+@@ -39,5 +39,6 @@
+ int main ()
+ {
+ CExample c;
+- return (test (c) != &c);
++ test (c);
++ return 0;
+ }
+Index: gcc/testsuite/c-c++-common/pr61741.c
+===================================================================
+--- a/src/gcc/testsuite/c-c++-common/pr61741.c (.../tags/gcc_4_9_1_release)
++++ b/src/gcc/testsuite/c-c++-common/pr61741.c (.../branches/gcc-4_9-branch)
+@@ -0,0 +1,22 @@
++/* { dg-do run } */
++
++int a = 1, b;
++
++void
++foo (void)
++{
++ signed char c = 0;
++ for (; a; a--)
++ for (; c >= 0; c++);
++ if (!c)
++ b = 1;
++}
++
++int
++main ()
++{
++ foo ();
++ if (b != 0)
++ __builtin_abort ();
++ return 0;
++}
+Index: gcc/expr.c
+===================================================================
+--- a/src/gcc/expr.c (.../tags/gcc_4_9_1_release)
++++ b/src/gcc/expr.c (.../branches/gcc-4_9-branch)
+@@ -6605,7 +6605,7 @@
+ {
+ HOST_WIDE_INT size = int_size_in_bytes (TREE_TYPE (exp));
+ rtx temp_target;
+- if (mode == BLKmode)
++ if (mode == BLKmode || mode == VOIDmode)
+ mode = smallest_mode_for_size (size * BITS_PER_UNIT, MODE_INT);
+ temp_target = gen_reg_rtx (mode);
+ emit_group_store (temp_target, temp, TREE_TYPE (exp), size);
+Index: gcc/fortran/ChangeLog
+===================================================================
+--- a/src/gcc/fortran/ChangeLog (.../tags/gcc_4_9_1_release)
++++ b/src/gcc/fortran/ChangeLog (.../branches/gcc-4_9-branch)
+@@ -1,3 +1,11 @@
++2014-07-19 Paul Thomas <pault@gcc.gnu.org>
++
++ Backport from mainline
++ PR fortran/61780
++ * dependency.c (gfc_dep_resolver): Index the 'reverse' array so
++ that elements are skipped. This then correctly aligns 'reverse'
++ with the scalarizer loops.
++
+ 2014-07-16 Release Manager
+
+ * GCC 4.9.1 released.
+Index: gcc/fortran/dependency.c
+===================================================================
+--- a/src/gcc/fortran/dependency.c (.../tags/gcc_4_9_1_release)
++++ b/src/gcc/fortran/dependency.c (.../branches/gcc-4_9-branch)
+@@ -2023,6 +2023,7 @@
+ gfc_dep_resolver (gfc_ref *lref, gfc_ref *rref, gfc_reverse *reverse)
+ {
+ int n;
++ int m;
+ gfc_dependency fin_dep;
+ gfc_dependency this_dep;
+
+@@ -2072,6 +2073,8 @@
+ break;
+ }
+
++ /* Index for the reverse array. */
++ m = -1;
+ for (n=0; n < lref->u.ar.dimen; n++)
+ {
+ /* Handle dependency when either of array reference is vector
+@@ -2118,31 +2121,37 @@
+ The ability to reverse or not is set by previous conditions
+ in this dimension. If reversal is not activated, the
+ value GFC_DEP_BACKWARD is reset to GFC_DEP_OVERLAP. */
++
++ /* Get the indexing right for the scalarizing loop. If this
++ is an element, there is no corresponding loop. */
++ if (lref->u.ar.dimen_type[n] != DIMEN_ELEMENT)
++ m++;
++
+ if (rref->u.ar.dimen_type[n] == DIMEN_RANGE
+ && lref->u.ar.dimen_type[n] == DIMEN_RANGE)
+ {
+ /* Set reverse if backward dependence and not inhibited. */
+- if (reverse && reverse[n] == GFC_ENABLE_REVERSE)
+- reverse[n] = (this_dep == GFC_DEP_BACKWARD) ?
+- GFC_REVERSE_SET : reverse[n];
++ if (reverse && reverse[m] == GFC_ENABLE_REVERSE)
++ reverse[m] = (this_dep == GFC_DEP_BACKWARD) ?
++ GFC_REVERSE_SET : reverse[m];
+
+ /* Set forward if forward dependence and not inhibited. */
+- if (reverse && reverse[n] == GFC_ENABLE_REVERSE)
+- reverse[n] = (this_dep == GFC_DEP_FORWARD) ?
+- GFC_FORWARD_SET : reverse[n];
++ if (reverse && reverse[m] == GFC_ENABLE_REVERSE)
++ reverse[m] = (this_dep == GFC_DEP_FORWARD) ?
++ GFC_FORWARD_SET : reverse[m];
+
+ /* Flag up overlap if dependence not compatible with
+ the overall state of the expression. */
+- if (reverse && reverse[n] == GFC_REVERSE_SET
++ if (reverse && reverse[m] == GFC_REVERSE_SET
+ && this_dep == GFC_DEP_FORWARD)
+ {
+- reverse[n] = GFC_INHIBIT_REVERSE;
++ reverse[m] = GFC_INHIBIT_REVERSE;
+ this_dep = GFC_DEP_OVERLAP;
+ }
+- else if (reverse && reverse[n] == GFC_FORWARD_SET
++ else if (reverse && reverse[m] == GFC_FORWARD_SET
+ && this_dep == GFC_DEP_BACKWARD)
+ {
+- reverse[n] = GFC_INHIBIT_REVERSE;
++ reverse[m] = GFC_INHIBIT_REVERSE;
+ this_dep = GFC_DEP_OVERLAP;
+ }
+
+@@ -2149,7 +2158,7 @@
+ /* If no intention of reversing or reversing is explicitly
+ inhibited, convert backward dependence to overlap. */
+ if ((reverse == NULL && this_dep == GFC_DEP_BACKWARD)
+- || (reverse != NULL && reverse[n] == GFC_INHIBIT_REVERSE))
++ || (reverse != NULL && reverse[m] == GFC_INHIBIT_REVERSE))
+ this_dep = GFC_DEP_OVERLAP;
+ }
+
+Index: gcc/tree-ssa-copy.c
+===================================================================
+--- a/src/gcc/tree-ssa-copy.c (.../tags/gcc_4_9_1_release)
++++ b/src/gcc/tree-ssa-copy.c (.../branches/gcc-4_9-branch)
+@@ -235,38 +235,26 @@
+ enum ssa_prop_result retval = SSA_PROP_VARYING;
+ location_t loc = gimple_location (stmt);
+
+- tree op0 = gimple_cond_lhs (stmt);
+- tree op1 = gimple_cond_rhs (stmt);
++ tree op0 = valueize_val (gimple_cond_lhs (stmt));
++ tree op1 = valueize_val (gimple_cond_rhs (stmt));
+
+- /* The only conditionals that we may be able to compute statically
+- are predicates involving two SSA_NAMEs. */
+- if (TREE_CODE (op0) == SSA_NAME && TREE_CODE (op1) == SSA_NAME)
++ /* See if we can determine the predicate's value. */
++ if (dump_file && (dump_flags & TDF_DETAILS))
+ {
+- op0 = valueize_val (op0);
+- op1 = valueize_val (op1);
++ fprintf (dump_file, "Trying to determine truth value of ");
++ fprintf (dump_file, "predicate ");
++ print_gimple_stmt (dump_file, stmt, 0, 0);
++ }
+
+- /* See if we can determine the predicate's value. */
+- if (dump_file && (dump_flags & TDF_DETAILS))
+- {
+- fprintf (dump_file, "Trying to determine truth value of ");
+- fprintf (dump_file, "predicate ");
+- print_gimple_stmt (dump_file, stmt, 0, 0);
+- }
+-
+- /* We can fold COND and get a useful result only when we have
+- the same SSA_NAME on both sides of a comparison operator. */
+- if (op0 == op1)
+- {
+- tree folded_cond = fold_binary_loc (loc, gimple_cond_code (stmt),
+- boolean_type_node, op0, op1);
+- if (folded_cond)
+- {
+- basic_block bb = gimple_bb (stmt);
+- *taken_edge_p = find_taken_edge (bb, folded_cond);
+- if (*taken_edge_p)
+- retval = SSA_PROP_INTERESTING;
+- }
+- }
++ /* Fold COND and see whether we get a useful result. */
++ tree folded_cond = fold_binary_loc (loc, gimple_cond_code (stmt),
++ boolean_type_node, op0, op1);
++ if (folded_cond)
++ {
++ basic_block bb = gimple_bb (stmt);
++ *taken_edge_p = find_taken_edge (bb, folded_cond);
++ if (*taken_edge_p)
++ retval = SSA_PROP_INTERESTING;
+ }
+
+ if (dump_file && (dump_flags & TDF_DETAILS) && *taken_edge_p)
+Index: gcc/sched-deps.c
+===================================================================
+--- a/src/gcc/sched-deps.c (.../tags/gcc_4_9_1_release)
++++ b/src/gcc/sched-deps.c (.../branches/gcc-4_9-branch)
+@@ -2750,7 +2750,8 @@
+ Consider for instance a volatile asm that changes the fpu rounding
+ mode. An insn should not be moved across this even if it only uses
+ pseudo-regs because it might give an incorrectly rounded result. */
+- if (code != ASM_OPERANDS || MEM_VOLATILE_P (x))
++ if ((code != ASM_OPERANDS || MEM_VOLATILE_P (x))
++ && !DEBUG_INSN_P (insn))
+ reg_pending_barrier = TRUE_BARRIER;
+
+ /* For all ASM_OPERANDS, we must traverse the vector of input operands.
+Index: gcc/config.gcc
+===================================================================
+--- a/src/gcc/config.gcc (.../tags/gcc_4_9_1_release)
++++ b/src/gcc/config.gcc (.../branches/gcc-4_9-branch)
+@@ -432,7 +432,7 @@
+ nios2-*-*)
+ cpu_type=nios2
+ extra_options="${extra_options} g.opt"
+- ;;
++ ;;
+ picochip-*-*)
+ cpu_type=picochip
+ ;;
+@@ -1129,8 +1129,7 @@
+ ;;
+ crisv32-*-linux* | cris-*-linux*)
+ tm_file="dbxelf.h elfos.h ${tm_file} gnu-user.h linux.h glibc-stdint.h cris/linux.h"
+- # We need to avoid using t-linux, so override default tmake_file
+- tmake_file="cris/t-cris cris/t-linux t-slibgcc t-linux"
++ tmake_file="${tmake_file} cris/t-cris cris/t-linux"
+ extra_options="${extra_options} cris/linux.opt"
+ case $target in
+ cris-*-*)
+@@ -2156,6 +2155,10 @@
+ tm_file="${tm_file} newlib-stdint.h nios2/elf.h"
+ extra_options="${extra_options} nios2/elf.opt"
+ ;;
++ nios2-*-rtems*)
++ tm_file="${tm_file} newlib-stdint.h nios2/rtems.h rtems.h"
++ tmake_file="${tmake_file} t-rtems nios2/t-rtems"
++ ;;
+ esac
+ ;;
+ pdp11-*-*)
+Index: gcc/config/sparc/sync.md
+===================================================================
+--- a/src/gcc/config/sparc/sync.md (.../tags/gcc_4_9_1_release)
++++ b/src/gcc/config/sparc/sync.md (.../branches/gcc-4_9-branch)
+@@ -64,11 +64,19 @@
+ "stbar"
+ [(set_attr "type" "multi")])
+
++;; For LEON3, STB has the effect of membar #StoreLoad.
++(define_insn "*membar_storeload_leon3"
++ [(set (match_operand:BLK 0 "" "")
++ (unspec:BLK [(match_dup 0) (const_int 2)] UNSPEC_MEMBAR))]
++ "TARGET_LEON3"
++ "stb\t%%g0, [%%sp-1]"
++ [(set_attr "type" "store")])
++
+ ;; For V8, LDSTUB has the effect of membar #StoreLoad.
+ (define_insn "*membar_storeload"
+ [(set (match_operand:BLK 0 "" "")
+ (unspec:BLK [(match_dup 0) (const_int 2)] UNSPEC_MEMBAR))]
+- "TARGET_V8"
++ "TARGET_V8 && !TARGET_LEON3"
+ "ldstub\t[%%sp-1], %%g0"
+ [(set_attr "type" "multi")])
+
+Index: gcc/config/i386/sse.md
+===================================================================
+--- a/src/gcc/config/i386/sse.md (.../tags/gcc_4_9_1_release)
++++ b/src/gcc/config/i386/sse.md (.../branches/gcc-4_9-branch)
+@@ -5887,9 +5887,10 @@
+ (match_operand 5 "const_0_to_15_operand")]))
+ (match_operand:<ssequartermode> 6 "memory_operand" "0")
+ (match_operand:QI 7 "register_operand" "Yk")))]
+- "TARGET_AVX512F && (INTVAL (operands[2]) = INTVAL (operands[3]) - 1)
+- && (INTVAL (operands[3]) = INTVAL (operands[4]) - 1)
+- && (INTVAL (operands[4]) = INTVAL (operands[5]) - 1)"
++ "TARGET_AVX512F
++ && (INTVAL (operands[2]) == (INTVAL (operands[3]) - 1)
++ && INTVAL (operands[3]) == (INTVAL (operands[4]) - 1)
++ && INTVAL (operands[4]) == (INTVAL (operands[5]) - 1))"
+ {
+ operands[2] = GEN_INT ((INTVAL (operands[2])) >> 2);
+ return "vextract<shuffletype>32x4\t{%2, %1, %0%{%7%}|%0%{%7%}, %1, %2}";
+@@ -5909,9 +5910,10 @@
+ (match_operand 3 "const_0_to_15_operand")
+ (match_operand 4 "const_0_to_15_operand")
+ (match_operand 5 "const_0_to_15_operand")])))]
+- "TARGET_AVX512F && (INTVAL (operands[2]) = INTVAL (operands[3]) - 1)
+- && (INTVAL (operands[3]) = INTVAL (operands[4]) - 1)
+- && (INTVAL (operands[4]) = INTVAL (operands[5]) - 1)"
++ "TARGET_AVX512F
++ && (INTVAL (operands[2]) == (INTVAL (operands[3]) - 1)
++ && INTVAL (operands[3]) == (INTVAL (operands[4]) - 1)
++ && INTVAL (operands[4]) == (INTVAL (operands[5]) - 1))"
+ {
+ operands[2] = GEN_INT ((INTVAL (operands[2])) >> 2);
+ return "vextract<shuffletype>32x4\t{%2, %1, %0<mask_operand6>|%0<mask_operand6>, %1, %2}";
+Index: gcc/config/i386/avx512fintrin.h
+===================================================================
+--- a/src/gcc/config/i386/avx512fintrin.h (.../tags/gcc_4_9_1_release)
++++ b/src/gcc/config/i386/avx512fintrin.h (.../branches/gcc-4_9-branch)
+@@ -8103,6 +8103,22 @@
+ return __builtin_ia32_movntdqa512 ((__v8di *)__P);
+ }
+
++/* Constants for mantissa extraction */
++typedef enum
++{
++ _MM_MANT_NORM_1_2, /* interval [1, 2) */
++ _MM_MANT_NORM_p5_2, /* interval [0.5, 2) */
++ _MM_MANT_NORM_p5_1, /* interval [0.5, 1) */
++ _MM_MANT_NORM_p75_1p5 /* interval [0.75, 1.5) */
++} _MM_MANTISSA_NORM_ENUM;
++
++typedef enum
++{
++ _MM_MANT_SIGN_src, /* sign = sign(SRC) */
++ _MM_MANT_SIGN_zero, /* sign = 0 */
++ _MM_MANT_SIGN_nan /* DEST = NaN if sign(SRC) = 1 */
++} _MM_MANTISSA_SIGN_ENUM;
++
+ #ifdef __OPTIMIZE__
+ extern __inline __m128
+ __attribute__ ((__gnu_inline__, __always_inline__, __artificial__))
+@@ -8182,22 +8198,6 @@
+ (__mmask8) __U, __R);
+ }
+
+-/* Constants for mantissa extraction */
+-typedef enum
+-{
+- _MM_MANT_NORM_1_2, /* interval [1, 2) */
+- _MM_MANT_NORM_p5_2, /* interval [0.5, 2) */
+- _MM_MANT_NORM_p5_1, /* interval [0.5, 1) */
+- _MM_MANT_NORM_p75_1p5 /* interval [0.75, 1.5) */
+-} _MM_MANTISSA_NORM_ENUM;
+-
+-typedef enum
+-{
+- _MM_MANT_SIGN_src, /* sign = sign(SRC) */
+- _MM_MANT_SIGN_zero, /* sign = 0 */
+- _MM_MANT_SIGN_nan /* DEST = NaN if sign(SRC) = 1 */
+-} _MM_MANTISSA_SIGN_ENUM;
+-
+ extern __inline __m512d
+ __attribute__ ((__gnu_inline__, __always_inline__, __artificial__))
+ _mm512_getmant_round_pd (__m512d __A, _MM_MANTISSA_NORM_ENUM __B,
+Index: gcc/config/i386/ia32intrin.h
+===================================================================
+--- a/src/gcc/config/i386/ia32intrin.h (.../tags/gcc_4_9_1_release)
++++ b/src/gcc/config/i386/ia32intrin.h (.../branches/gcc-4_9-branch)
+@@ -256,11 +256,7 @@
+
+ #define _bswap64(a) __bswapq(a)
+ #define _popcnt64(a) __popcntq(a)
+-#define _lrotl(a,b) __rolq((a), (b))
+-#define _lrotr(a,b) __rorq((a), (b))
+ #else
+-#define _lrotl(a,b) __rold((a), (b))
+-#define _lrotr(a,b) __rord((a), (b))
+
+ /* Read flags register */
+ extern __inline unsigned int
+@@ -280,6 +276,16 @@
+
+ #endif
+
++/* On LP64 systems, longs are 64-bit. Use the appropriate rotate
++ * function. */
++#ifdef __LP64__
++#define _lrotl(a,b) __rolq((a), (b))
++#define _lrotr(a,b) __rorq((a), (b))
++#else
++#define _lrotl(a,b) __rold((a), (b))
++#define _lrotr(a,b) __rord((a), (b))
++#endif
++
+ #define _bit_scan_forward(a) __bsfd(a)
+ #define _bit_scan_reverse(a) __bsrd(a)
+ #define _bswap(a) __bswapd(a)
+Index: gcc/config/nios2/rtems.h
+===================================================================
+--- a/src/gcc/config/nios2/rtems.h (.../tags/gcc_4_9_1_release)
++++ b/src/gcc/config/nios2/rtems.h (.../branches/gcc-4_9-branch)
+@@ -0,0 +1,34 @@
++/* Definitions for rtems targeting a NIOS2 using ELF.
++ Copyright (C) 2011-2014 Free Software Foundation, Inc.
++
++ Contributed by Chris Johns (chrisj@rtems.org).
++
++This file is part of GCC.
++
++GCC is free software; you can redistribute it and/or modify
++it under the terms of the GNU General Public License as published by
++the Free Software Foundation; either version 3, or (at your option)
++any later version.
++
++GCC is distributed in the hope that it will be useful,
++but WITHOUT ANY WARRANTY; without even the implied warranty of
++MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
++GNU General Public License for more details.
++
++You should have received a copy of the GNU General Public License
++along with GCC; see the file COPYING3. If not see
++<http://www.gnu.org/licenses/>. */
++
++/* Specify predefined symbols in preprocessor. */
++#define TARGET_OS_CPP_BUILTINS() \
++do { \
++ builtin_define ("__rtems__"); \
++ builtin_define ("__USE_INIT_FINI__"); \
++ builtin_assert ("system=rtems"); \
++} while (0)
++
++/* This toolchain implements the ABI for Linux Systems documented in the
++ Nios II Processor Reference Handbook.
++
++ This is done so RTEMS targets have Thread Local Storage like Linux. */
++#define TARGET_LINUX_ABI 1
+Index: gcc/config/nios2/t-rtems
+===================================================================
+--- a/src/gcc/config/nios2/t-rtems (.../tags/gcc_4_9_1_release)
++++ b/src/gcc/config/nios2/t-rtems (.../branches/gcc-4_9-branch)
+@@ -0,0 +1,133 @@
++# Custom RTEMS multilibs
++
++MULTILIB_OPTIONS = mhw-mul mhw-mulx mhw-div mcustom-fadds=253 mcustom-fdivs=255 mcustom-fmuls=252 mcustom-fsubs=254
++
++# Enumeration of multilibs
++
++# MULTILIB_EXCEPTIONS += mhw-mul/mhw-mulx/mhw-div/mcustom-fadds=253/mcustom-fdivs=255/mcustom-fmuls=252/mcustom-fsubs=254
++MULTILIB_EXCEPTIONS += mhw-mul/mhw-mulx/mhw-div/mcustom-fadds=253/mcustom-fdivs=255/mcustom-fmuls=252
++MULTILIB_EXCEPTIONS += mhw-mul/mhw-mulx/mhw-div/mcustom-fadds=253/mcustom-fdivs=255/mcustom-fsubs=254
++MULTILIB_EXCEPTIONS += mhw-mul/mhw-mulx/mhw-div/mcustom-fadds=253/mcustom-fdivs=255
++MULTILIB_EXCEPTIONS += mhw-mul/mhw-mulx/mhw-div/mcustom-fadds=253/mcustom-fmuls=252/mcustom-fsubs=254
++MULTILIB_EXCEPTIONS += mhw-mul/mhw-mulx/mhw-div/mcustom-fadds=253/mcustom-fmuls=252
++MULTILIB_EXCEPTIONS += mhw-mul/mhw-mulx/mhw-div/mcustom-fadds=253/mcustom-fsubs=254
++MULTILIB_EXCEPTIONS += mhw-mul/mhw-mulx/mhw-div/mcustom-fadds=253
++MULTILIB_EXCEPTIONS += mhw-mul/mhw-mulx/mhw-div/mcustom-fdivs=255/mcustom-fmuls=252/mcustom-fsubs=254
++MULTILIB_EXCEPTIONS += mhw-mul/mhw-mulx/mhw-div/mcustom-fdivs=255/mcustom-fmuls=252
++MULTILIB_EXCEPTIONS += mhw-mul/mhw-mulx/mhw-div/mcustom-fdivs=255/mcustom-fsubs=254
++MULTILIB_EXCEPTIONS += mhw-mul/mhw-mulx/mhw-div/mcustom-fdivs=255
++MULTILIB_EXCEPTIONS += mhw-mul/mhw-mulx/mhw-div/mcustom-fmuls=252/mcustom-fsubs=254
++MULTILIB_EXCEPTIONS += mhw-mul/mhw-mulx/mhw-div/mcustom-fmuls=252
++MULTILIB_EXCEPTIONS += mhw-mul/mhw-mulx/mhw-div/mcustom-fsubs=254
++# MULTILIB_EXCEPTIONS += mhw-mul/mhw-mulx/mhw-div
++MULTILIB_EXCEPTIONS += mhw-mul/mhw-mulx/mcustom-fadds=253/mcustom-fdivs=255/mcustom-fmuls=252/mcustom-fsubs=254
++MULTILIB_EXCEPTIONS += mhw-mul/mhw-mulx/mcustom-fadds=253/mcustom-fdivs=255/mcustom-fmuls=252
++MULTILIB_EXCEPTIONS += mhw-mul/mhw-mulx/mcustom-fadds=253/mcustom-fdivs=255/mcustom-fsubs=254
++MULTILIB_EXCEPTIONS += mhw-mul/mhw-mulx/mcustom-fadds=253/mcustom-fdivs=255
++MULTILIB_EXCEPTIONS += mhw-mul/mhw-mulx/mcustom-fadds=253/mcustom-fmuls=252/mcustom-fsubs=254
++MULTILIB_EXCEPTIONS += mhw-mul/mhw-mulx/mcustom-fadds=253/mcustom-fmuls=252
++MULTILIB_EXCEPTIONS += mhw-mul/mhw-mulx/mcustom-fadds=253/mcustom-fsubs=254
++MULTILIB_EXCEPTIONS += mhw-mul/mhw-mulx/mcustom-fadds=253
++MULTILIB_EXCEPTIONS += mhw-mul/mhw-mulx/mcustom-fdivs=255/mcustom-fmuls=252/mcustom-fsubs=254
++MULTILIB_EXCEPTIONS += mhw-mul/mhw-mulx/mcustom-fdivs=255/mcustom-fmuls=252
++MULTILIB_EXCEPTIONS += mhw-mul/mhw-mulx/mcustom-fdivs=255/mcustom-fsubs=254
++MULTILIB_EXCEPTIONS += mhw-mul/mhw-mulx/mcustom-fdivs=255
++MULTILIB_EXCEPTIONS += mhw-mul/mhw-mulx/mcustom-fmuls=252/mcustom-fsubs=254
++MULTILIB_EXCEPTIONS += mhw-mul/mhw-mulx/mcustom-fmuls=252
++MULTILIB_EXCEPTIONS += mhw-mul/mhw-mulx/mcustom-fsubs=254
++MULTILIB_EXCEPTIONS += mhw-mul/mhw-mulx
++MULTILIB_EXCEPTIONS += mhw-mul/mhw-div/mcustom-fadds=253/mcustom-fdivs=255/mcustom-fmuls=252/mcustom-fsubs=254
++MULTILIB_EXCEPTIONS += mhw-mul/mhw-div/mcustom-fadds=253/mcustom-fdivs=255/mcustom-fmuls=252
++MULTILIB_EXCEPTIONS += mhw-mul/mhw-div/mcustom-fadds=253/mcustom-fdivs=255/mcustom-fsubs=254
++MULTILIB_EXCEPTIONS += mhw-mul/mhw-div/mcustom-fadds=253/mcustom-fdivs=255
++MULTILIB_EXCEPTIONS += mhw-mul/mhw-div/mcustom-fadds=253/mcustom-fmuls=252/mcustom-fsubs=254
++MULTILIB_EXCEPTIONS += mhw-mul/mhw-div/mcustom-fadds=253/mcustom-fmuls=252
++MULTILIB_EXCEPTIONS += mhw-mul/mhw-div/mcustom-fadds=253/mcustom-fsubs=254
++MULTILIB_EXCEPTIONS += mhw-mul/mhw-div/mcustom-fadds=253
++MULTILIB_EXCEPTIONS += mhw-mul/mhw-div/mcustom-fdivs=255/mcustom-fmuls=252/mcustom-fsubs=254
++MULTILIB_EXCEPTIONS += mhw-mul/mhw-div/mcustom-fdivs=255/mcustom-fmuls=252
++MULTILIB_EXCEPTIONS += mhw-mul/mhw-div/mcustom-fdivs=255/mcustom-fsubs=254
++MULTILIB_EXCEPTIONS += mhw-mul/mhw-div/mcustom-fdivs=255
++MULTILIB_EXCEPTIONS += mhw-mul/mhw-div/mcustom-fmuls=252/mcustom-fsubs=254
++MULTILIB_EXCEPTIONS += mhw-mul/mhw-div/mcustom-fmuls=252
++MULTILIB_EXCEPTIONS += mhw-mul/mhw-div/mcustom-fsubs=254
++MULTILIB_EXCEPTIONS += mhw-mul/mhw-div
++MULTILIB_EXCEPTIONS += mhw-mul/mcustom-fadds=253/mcustom-fdivs=255/mcustom-fmuls=252/mcustom-fsubs=254
++MULTILIB_EXCEPTIONS += mhw-mul/mcustom-fadds=253/mcustom-fdivs=255/mcustom-fmuls=252
++MULTILIB_EXCEPTIONS += mhw-mul/mcustom-fadds=253/mcustom-fdivs=255/mcustom-fsubs=254
++MULTILIB_EXCEPTIONS += mhw-mul/mcustom-fadds=253/mcustom-fdivs=255
++MULTILIB_EXCEPTIONS += mhw-mul/mcustom-fadds=253/mcustom-fmuls=252/mcustom-fsubs=254
++MULTILIB_EXCEPTIONS += mhw-mul/mcustom-fadds=253/mcustom-fmuls=252
++MULTILIB_EXCEPTIONS += mhw-mul/mcustom-fadds=253/mcustom-fsubs=254
++MULTILIB_EXCEPTIONS += mhw-mul/mcustom-fadds=253
++MULTILIB_EXCEPTIONS += mhw-mul/mcustom-fdivs=255/mcustom-fmuls=252/mcustom-fsubs=254
++MULTILIB_EXCEPTIONS += mhw-mul/mcustom-fdivs=255/mcustom-fmuls=252
++MULTILIB_EXCEPTIONS += mhw-mul/mcustom-fdivs=255/mcustom-fsubs=254
++MULTILIB_EXCEPTIONS += mhw-mul/mcustom-fdivs=255
++MULTILIB_EXCEPTIONS += mhw-mul/mcustom-fmuls=252/mcustom-fsubs=254
++MULTILIB_EXCEPTIONS += mhw-mul/mcustom-fmuls=252
++MULTILIB_EXCEPTIONS += mhw-mul/mcustom-fsubs=254
++# MULTILIB_EXCEPTIONS += mhw-mul
++MULTILIB_EXCEPTIONS += mhw-mulx/mhw-div/mcustom-fadds=253/mcustom-fdivs=255/mcustom-fmuls=252/mcustom-fsubs=254
++MULTILIB_EXCEPTIONS += mhw-mulx/mhw-div/mcustom-fadds=253/mcustom-fdivs=255/mcustom-fmuls=252
++MULTILIB_EXCEPTIONS += mhw-mulx/mhw-div/mcustom-fadds=253/mcustom-fdivs=255/mcustom-fsubs=254
++MULTILIB_EXCEPTIONS += mhw-mulx/mhw-div/mcustom-fadds=253/mcustom-fdivs=255
++MULTILIB_EXCEPTIONS += mhw-mulx/mhw-div/mcustom-fadds=253/mcustom-fmuls=252/mcustom-fsubs=254
++MULTILIB_EXCEPTIONS += mhw-mulx/mhw-div/mcustom-fadds=253/mcustom-fmuls=252
++MULTILIB_EXCEPTIONS += mhw-mulx/mhw-div/mcustom-fadds=253/mcustom-fsubs=254
++MULTILIB_EXCEPTIONS += mhw-mulx/mhw-div/mcustom-fadds=253
++MULTILIB_EXCEPTIONS += mhw-mulx/mhw-div/mcustom-fdivs=255/mcustom-fmuls=252/mcustom-fsubs=254
++MULTILIB_EXCEPTIONS += mhw-mulx/mhw-div/mcustom-fdivs=255/mcustom-fmuls=252
++MULTILIB_EXCEPTIONS += mhw-mulx/mhw-div/mcustom-fdivs=255/mcustom-fsubs=254
++MULTILIB_EXCEPTIONS += mhw-mulx/mhw-div/mcustom-fdivs=255
++MULTILIB_EXCEPTIONS += mhw-mulx/mhw-div/mcustom-fmuls=252/mcustom-fsubs=254
++MULTILIB_EXCEPTIONS += mhw-mulx/mhw-div/mcustom-fmuls=252
++MULTILIB_EXCEPTIONS += mhw-mulx/mhw-div/mcustom-fsubs=254
++MULTILIB_EXCEPTIONS += mhw-mulx/mhw-div
++MULTILIB_EXCEPTIONS += mhw-mulx/mcustom-fadds=253/mcustom-fdivs=255/mcustom-fmuls=252/mcustom-fsubs=254
++MULTILIB_EXCEPTIONS += mhw-mulx/mcustom-fadds=253/mcustom-fdivs=255/mcustom-fmuls=252
++MULTILIB_EXCEPTIONS += mhw-mulx/mcustom-fadds=253/mcustom-fdivs=255/mcustom-fsubs=254
++MULTILIB_EXCEPTIONS += mhw-mulx/mcustom-fadds=253/mcustom-fdivs=255
++MULTILIB_EXCEPTIONS += mhw-mulx/mcustom-fadds=253/mcustom-fmuls=252/mcustom-fsubs=254
++MULTILIB_EXCEPTIONS += mhw-mulx/mcustom-fadds=253/mcustom-fmuls=252
++MULTILIB_EXCEPTIONS += mhw-mulx/mcustom-fadds=253/mcustom-fsubs=254
++MULTILIB_EXCEPTIONS += mhw-mulx/mcustom-fadds=253
++MULTILIB_EXCEPTIONS += mhw-mulx/mcustom-fdivs=255/mcustom-fmuls=252/mcustom-fsubs=254
++MULTILIB_EXCEPTIONS += mhw-mulx/mcustom-fdivs=255/mcustom-fmuls=252
++MULTILIB_EXCEPTIONS += mhw-mulx/mcustom-fdivs=255/mcustom-fsubs=254
++MULTILIB_EXCEPTIONS += mhw-mulx/mcustom-fdivs=255
++MULTILIB_EXCEPTIONS += mhw-mulx/mcustom-fmuls=252/mcustom-fsubs=254
++MULTILIB_EXCEPTIONS += mhw-mulx/mcustom-fmuls=252
++MULTILIB_EXCEPTIONS += mhw-mulx/mcustom-fsubs=254
++MULTILIB_EXCEPTIONS += mhw-mulx
++MULTILIB_EXCEPTIONS += mhw-div/mcustom-fadds=253/mcustom-fdivs=255/mcustom-fmuls=252/mcustom-fsubs=254
++MULTILIB_EXCEPTIONS += mhw-div/mcustom-fadds=253/mcustom-fdivs=255/mcustom-fmuls=252
++MULTILIB_EXCEPTIONS += mhw-div/mcustom-fadds=253/mcustom-fdivs=255/mcustom-fsubs=254
++MULTILIB_EXCEPTIONS += mhw-div/mcustom-fadds=253/mcustom-fdivs=255
++MULTILIB_EXCEPTIONS += mhw-div/mcustom-fadds=253/mcustom-fmuls=252/mcustom-fsubs=254
++MULTILIB_EXCEPTIONS += mhw-div/mcustom-fadds=253/mcustom-fmuls=252
++MULTILIB_EXCEPTIONS += mhw-div/mcustom-fadds=253/mcustom-fsubs=254
++MULTILIB_EXCEPTIONS += mhw-div/mcustom-fadds=253
++MULTILIB_EXCEPTIONS += mhw-div/mcustom-fdivs=255/mcustom-fmuls=252/mcustom-fsubs=254
++MULTILIB_EXCEPTIONS += mhw-div/mcustom-fdivs=255/mcustom-fmuls=252
++MULTILIB_EXCEPTIONS += mhw-div/mcustom-fdivs=255/mcustom-fsubs=254
++MULTILIB_EXCEPTIONS += mhw-div/mcustom-fdivs=255
++MULTILIB_EXCEPTIONS += mhw-div/mcustom-fmuls=252/mcustom-fsubs=254
++MULTILIB_EXCEPTIONS += mhw-div/mcustom-fmuls=252
++MULTILIB_EXCEPTIONS += mhw-div/mcustom-fsubs=254
++MULTILIB_EXCEPTIONS += mhw-div
++MULTILIB_EXCEPTIONS += mcustom-fadds=253/mcustom-fdivs=255/mcustom-fmuls=252/mcustom-fsubs=254
++MULTILIB_EXCEPTIONS += mcustom-fadds=253/mcustom-fdivs=255/mcustom-fmuls=252
++MULTILIB_EXCEPTIONS += mcustom-fadds=253/mcustom-fdivs=255/mcustom-fsubs=254
++MULTILIB_EXCEPTIONS += mcustom-fadds=253/mcustom-fdivs=255
++MULTILIB_EXCEPTIONS += mcustom-fadds=253/mcustom-fmuls=252/mcustom-fsubs=254
++MULTILIB_EXCEPTIONS += mcustom-fadds=253/mcustom-fmuls=252
++MULTILIB_EXCEPTIONS += mcustom-fadds=253/mcustom-fsubs=254
++MULTILIB_EXCEPTIONS += mcustom-fadds=253
++MULTILIB_EXCEPTIONS += mcustom-fdivs=255/mcustom-fmuls=252/mcustom-fsubs=254
++MULTILIB_EXCEPTIONS += mcustom-fdivs=255/mcustom-fmuls=252
++MULTILIB_EXCEPTIONS += mcustom-fdivs=255/mcustom-fsubs=254
++MULTILIB_EXCEPTIONS += mcustom-fdivs=255
++MULTILIB_EXCEPTIONS += mcustom-fmuls=252/mcustom-fsubs=254
++MULTILIB_EXCEPTIONS += mcustom-fmuls=252
++MULTILIB_EXCEPTIONS += mcustom-fsubs=254
+Index: gcc/config/cris/cris.md
+===================================================================
+--- a/src/gcc/config/cris/cris.md (.../tags/gcc_4_9_1_release)
++++ b/src/gcc/config/cris/cris.md (.../branches/gcc-4_9-branch)
+@@ -919,6 +919,8 @@
+ (match_operand:SI 1 "cris_general_operand_or_symbol" ""))]
+ ""
+ {
++ enum cris_symbol_type t;
++
+ /* If the output goes to a MEM, make sure we have zero or a register as
+ input. */
+ if (MEM_P (operands[0])
+@@ -934,12 +936,12 @@
+ valid symbol? Can we exclude global PIC addresses with an added
+ offset? */
+ if (flag_pic
+- && CONSTANT_ADDRESS_P (operands[1])
++ && CONSTANT_P (operands[1])
+ && !cris_valid_pic_const (operands[1], false))
+ {
+- enum cris_pic_symbol_type t = cris_pic_symbol_type_of (operands[1]);
++ t = cris_symbol_type_of (operands[1]);
+
+- gcc_assert (t != cris_no_symbol);
++ gcc_assert (t != cris_no_symbol && t != cris_offsettable_symbol);
+
+ if (! REG_S_P (operands[0]))
+ {
+@@ -1086,7 +1088,12 @@
+ if (!flag_pic
+ && (GET_CODE (operands[1]) == SYMBOL_REF
+ || GET_CODE (operands[1]) == LABEL_REF
+- || GET_CODE (operands[1]) == CONST))
++ || (GET_CODE (operands[1]) == CONST
++ && (GET_CODE (XEXP (operands[1], 0)) != UNSPEC
++ || (XINT (XEXP (operands[1], 0), 1)
++ == CRIS_UNSPEC_PLT_PCREL)
++ || (XINT (XEXP (operands[1], 0), 1)
++ == CRIS_UNSPEC_PCREL)))))
+ {
+ /* FIXME: Express this through (set_attr cc none) instead,
+ since we can't express the ``none'' at this point. FIXME:
+@@ -1169,6 +1176,12 @@
+ case CRIS_UNSPEC_PCREL:
+ case CRIS_UNSPEC_PLT_PCREL:
+ gcc_assert (TARGET_V32);
++ /* LAPC doesn't set condition codes; clear them to make the
++ (equivalence-marked) result of this insn not presumed
++ present. This instruction can be a PIC symbol load (for
++ a hidden symbol) which for weak symbols will be followed
++ by a test for NULL. */
++ CC_STATUS_INIT;
+ return "lapc %1,%0";
+
+ default:
+@@ -3710,15 +3723,16 @@
+ {
+ gcc_assert (MEM_P (operands[0]));
+ if (flag_pic)
+- cris_expand_pic_call_address (&operands[0]);
++ cris_expand_pic_call_address (&operands[0], &operands[1]);
++ else
++ operands[1] = const0_rtx;
+ })
+
+-;; Accept *anything* as operand 1. Accept operands for operand 0 in
+-;; order of preference.
++;; Accept operands for operand 0 in order of preference.
+
+ (define_insn "*expanded_call_non_v32"
+ [(call (mem:QI (match_operand:SI 0 "general_operand" "r,Q>,g"))
+- (match_operand 1 "" ""))
++ (match_operand:SI 1 "cris_call_type_marker" "rM,rM,rM"))
+ (clobber (reg:SI CRIS_SRP_REGNUM))]
+ "!TARGET_V32"
+ "jsr %0")
+@@ -3727,7 +3741,7 @@
+ [(call
+ (mem:QI
+ (match_operand:SI 0 "cris_nonmemory_operand_or_callable_symbol" "n,r,U,i"))
+- (match_operand 1 "" ""))
++ (match_operand:SI 1 "cris_call_type_marker" "rM,rM,rM,rM"))
+ (clobber (reg:SI CRIS_SRP_REGNUM))]
+ "TARGET_V32"
+ "@
+@@ -3740,7 +3754,7 @@
+ ;; Parallel when calculating and reusing address of indirect pointer
+ ;; with simple offset. (Makes most sense with PIC.) It looks a bit
+ ;; wrong not to have the clobber last, but that's the way combine
+-;; generates it (except it doesn' look into the *inner* mem, so this
++;; generates it (except it doesn't look into the *inner* mem, so this
+ ;; just matches a peephole2). FIXME: investigate that.
+ (define_insn "*expanded_call_side"
+ [(call (mem:QI
+@@ -3747,12 +3761,14 @@
+ (mem:SI
+ (plus:SI (match_operand:SI 0 "cris_bdap_operand" "%r, r,r")
+ (match_operand:SI 1 "cris_bdap_operand" "r>Rn,r,>Rn"))))
+- (match_operand 2 "" ""))
++ (match_operand:SI 2 "cris_call_type_marker" "rM,rM,rM"))
+ (clobber (reg:SI CRIS_SRP_REGNUM))
+ (set (match_operand:SI 3 "register_operand" "=*0,r,r")
+ (plus:SI (match_dup 0)
+ (match_dup 1)))]
+- "!TARGET_AVOID_GOTPLT && !TARGET_V32"
++ ;; Disabled until after reload until we can avoid an output reload for
++ ;; operand 3 (being forbidden for call insns).
++ "reload_completed && !TARGET_AVOID_GOTPLT && !TARGET_V32"
+ "jsr [%3=%0%S1]")
+
+ (define_expand "call_value"
+@@ -3764,10 +3780,12 @@
+ {
+ gcc_assert (MEM_P (operands[1]));
+ if (flag_pic)
+- cris_expand_pic_call_address (&operands[1]);
++ cris_expand_pic_call_address (&operands[1], &operands[2]);
++ else
++ operands[2] = const0_rtx;
+ })
+
+-;; Accept *anything* as operand 2. The validity other than "general" of
++;; The validity other than "general" of
+ ;; operand 0 will be checked elsewhere. Accept operands for operand 1 in
+ ;; order of preference (Q includes r, but r is shorter, faster).
+ ;; We also accept a PLT symbol. We output it as [rPIC+sym:GOTPLT] rather
+@@ -3776,7 +3794,7 @@
+ (define_insn "*expanded_call_value_non_v32"
+ [(set (match_operand 0 "nonimmediate_operand" "=g,g,g")
+ (call (mem:QI (match_operand:SI 1 "general_operand" "r,Q>,g"))
+- (match_operand 2 "" "")))
++ (match_operand:SI 2 "cris_call_type_marker" "rM,rM,rM")))
+ (clobber (reg:SI CRIS_SRP_REGNUM))]
+ "!TARGET_V32"
+ "Jsr %1"
+@@ -3790,12 +3808,14 @@
+ (mem:SI
+ (plus:SI (match_operand:SI 1 "cris_bdap_operand" "%r, r,r")
+ (match_operand:SI 2 "cris_bdap_operand" "r>Rn,r,>Rn"))))
+- (match_operand 3 "" "")))
++ (match_operand:SI 3 "cris_call_type_marker" "rM,rM,rM")))
+ (clobber (reg:SI CRIS_SRP_REGNUM))
+ (set (match_operand:SI 4 "register_operand" "=*1,r,r")
+ (plus:SI (match_dup 1)
+ (match_dup 2)))]
+- "!TARGET_AVOID_GOTPLT && !TARGET_V32"
++ ;; Disabled until after reload until we can avoid an output reload for
++ ;; operand 4 (being forbidden for call insns).
++ "reload_completed && !TARGET_AVOID_GOTPLT && !TARGET_V32"
+ "Jsr [%4=%1%S2]"
+ [(set_attr "cc" "clobber")])
+
+@@ -3805,7 +3825,7 @@
+ (call
+ (mem:QI
+ (match_operand:SI 1 "cris_nonmemory_operand_or_callable_symbol" "n,r,U,i"))
+- (match_operand 2 "" "")))
++ (match_operand:SI 2 "cris_call_type_marker" "rM,rM,rM,rM")))
+ (clobber (reg:SI 16))]
+ "TARGET_V32"
+ "@
+@@ -4827,7 +4847,7 @@
+ /* Make sure we have canonical RTX so we match the insn pattern -
+ not a constant in the first operand. We also require the order
+ (plus reg mem) to match the final pattern. */
+- if (CONSTANT_P (otherop) || MEM_P (otherop))
++ if (CRIS_CONSTANT_P (otherop) || MEM_P (otherop))
+ {
+ operands[7] = operands[1];
+ operands[8] = otherop;
+@@ -4878,7 +4898,7 @@
+ /* Make sure we have canonical RTX so we match the insn pattern -
+ not a constant in the first operand. We also require the order
+ (plus reg mem) to match the final pattern. */
+- if (CONSTANT_P (otherop) || MEM_P (otherop))
++ if (CRIS_CONSTANT_P (otherop) || MEM_P (otherop))
+ {
+ operands[7] = operands[1];
+ operands[8] = otherop;
+Index: gcc/config/cris/cris.c
+===================================================================
+--- a/src/gcc/config/cris/cris.c (.../tags/gcc_4_9_1_release)
++++ b/src/gcc/config/cris/cris.c (.../branches/gcc-4_9-branch)
+@@ -147,6 +147,7 @@
+ static void cris_function_arg_advance (cumulative_args_t, enum machine_mode,
+ const_tree, bool);
+ static tree cris_md_asm_clobbers (tree, tree, tree);
++static bool cris_cannot_force_const_mem (enum machine_mode, rtx);
+
+ static void cris_option_override (void);
+
+@@ -214,6 +215,9 @@
+ #undef TARGET_LEGITIMATE_ADDRESS_P
+ #define TARGET_LEGITIMATE_ADDRESS_P cris_legitimate_address_p
+
++#undef TARGET_LEGITIMATE_CONSTANT_P
++#define TARGET_LEGITIMATE_CONSTANT_P cris_legitimate_constant_p
++
+ #undef TARGET_PREFERRED_RELOAD_CLASS
+ #define TARGET_PREFERRED_RELOAD_CLASS cris_preferred_reload_class
+
+@@ -248,6 +252,10 @@
+ #define TARGET_FUNCTION_ARG_ADVANCE cris_function_arg_advance
+ #undef TARGET_MD_ASM_CLOBBERS
+ #define TARGET_MD_ASM_CLOBBERS cris_md_asm_clobbers
++
++#undef TARGET_CANNOT_FORCE_CONST_MEM
++#define TARGET_CANNOT_FORCE_CONST_MEM cris_cannot_force_const_mem
++
+ #undef TARGET_FRAME_POINTER_REQUIRED
+ #define TARGET_FRAME_POINTER_REQUIRED cris_frame_pointer_required
+
+@@ -506,6 +514,21 @@
+ return crtl->uses_pic_offset_table;
+ }
+
++/* Worker function for TARGET_CANNOT_FORCE_CONST_MEM.
++ We can't put PIC addresses in the constant pool, not even the ones that
++ can be reached as pc-relative as we can't tell when or how to do that. */
++
++static bool
++cris_cannot_force_const_mem (enum machine_mode mode ATTRIBUTE_UNUSED, rtx x)
++{
++ enum cris_symbol_type t = cris_symbol_type_of (x);
++
++ return
++ t == cris_unspec
++ || t == cris_got_symbol
++ || t == cris_rel_symbol;
++}
++
+ /* Given an rtx, return the text string corresponding to the CODE of X.
+ Intended for use in the assembly language output section of a
+ define_insn. */
+@@ -601,7 +624,7 @@
+
+ if (REG_P (index))
+ fprintf (file, "$%s.b", reg_names[REGNO (index)]);
+- else if (CONSTANT_P (index))
++ else if (CRIS_CONSTANT_P (index))
+ cris_output_addr_const (file, index);
+ else if (GET_CODE (index) == MULT)
+ {
+@@ -1041,7 +1064,7 @@
+ /* If this is a GOT symbol, force it to be emitted as :GOT and
+ :GOTPLT regardless of -fpic (i.e. not as :GOT16, :GOTPLT16).
+ Avoid making this too much of a special case. */
+- if (flag_pic == 1 && CONSTANT_P (operand))
++ if (flag_pic == 1 && CRIS_CONSTANT_P (operand))
+ {
+ int flag_pic_save = flag_pic;
+
+@@ -1161,7 +1184,7 @@
+ default:
+ /* No need to handle all strange variants, let output_addr_const
+ do it for us. */
+- if (CONSTANT_P (operand))
++ if (CRIS_CONSTANT_P (operand))
+ {
+ cris_output_addr_const (file, operand);
+ return;
+@@ -1358,7 +1381,7 @@
+ bool
+ cris_constant_index_p (const_rtx x)
+ {
+- return (CONSTANT_P (x) && (!flag_pic || cris_valid_pic_const (x, true)));
++ return (CRIS_CONSTANT_P (x) && (!flag_pic || cris_valid_pic_const (x, true)));
+ }
+
+ /* True if X is a valid base register. */
+@@ -1467,6 +1490,29 @@
+ return false;
+ }
+
++/* Worker function for TARGET_LEGITIMATE_CONSTANT_P. We have to handle
++ PIC constants that aren't legitimized. FIXME: there used to be a
++ guarantee that the target LEGITIMATE_CONSTANT_P didn't have to handle
++ PIC constants, but no more (4.7 era); testcase: glibc init-first.c.
++ While that may be seen as a bug, that guarantee seems a wart by design,
++ so don't bother; fix the documentation instead. */
++
++bool
++cris_legitimate_constant_p (enum machine_mode mode ATTRIBUTE_UNUSED, rtx x)
++{
++ enum cris_symbol_type t;
++
++ if (flag_pic)
++ return LEGITIMATE_PIC_OPERAND_P (x);
++
++ t = cris_symbol_type_of (x);
++
++ return
++ t == cris_no_symbol
++ || t == cris_offsettable_symbol
++ || t == cris_unspec;
++}
++
+ /* Worker function for LEGITIMIZE_RELOAD_ADDRESS. */
+
+ bool
+@@ -2214,7 +2260,7 @@
+ return (2 + 2) / 2;
+
+ /* A BDAP with some other constant is 2 bytes extra. */
+- if (CONSTANT_P (tem2))
++ if (CRIS_CONSTANT_P (tem2))
+ return (2 + 2 + 2) / 2;
+
+ /* BDAP with something indirect should have a higher cost than
+@@ -2312,7 +2358,7 @@
+ return 0;
+
+ /* Check allowed cases, like [r(+)?].[bwd] and const. */
+- if (CONSTANT_P (val_rtx))
++ if (CRIS_CONSTANT_P (val_rtx))
+ return 1;
+
+ if (MEM_P (val_rtx)
+@@ -2464,32 +2510,34 @@
+ gcc_unreachable ();
+ }
+
+- return cris_pic_symbol_type_of (x) == cris_no_symbol;
++ return cris_symbol_type_of (x) == cris_no_symbol;
+ }
+
+-/* Helper function to find the right PIC-type symbol to generate,
++/* Helper function to find the right symbol-type to generate,
+ given the original (non-PIC) representation. */
+
+-enum cris_pic_symbol_type
+-cris_pic_symbol_type_of (const_rtx x)
++enum cris_symbol_type
++cris_symbol_type_of (const_rtx x)
+ {
+ switch (GET_CODE (x))
+ {
+ case SYMBOL_REF:
+- return SYMBOL_REF_LOCAL_P (x)
+- ? cris_rel_symbol : cris_got_symbol;
++ return flag_pic
++ ? (SYMBOL_REF_LOCAL_P (x)
++ ? cris_rel_symbol : cris_got_symbol)
++ : cris_offsettable_symbol;
+
+ case LABEL_REF:
+- return cris_rel_symbol;
++ return flag_pic ? cris_rel_symbol : cris_offsettable_symbol;
+
+ case CONST:
+- return cris_pic_symbol_type_of (XEXP (x, 0));
++ return cris_symbol_type_of (XEXP (x, 0));
+
+ case PLUS:
+ case MINUS:
+ {
+- enum cris_pic_symbol_type t1 = cris_pic_symbol_type_of (XEXP (x, 0));
+- enum cris_pic_symbol_type t2 = cris_pic_symbol_type_of (XEXP (x, 1));
++ enum cris_symbol_type t1 = cris_symbol_type_of (XEXP (x, 0));
++ enum cris_symbol_type t2 = cris_symbol_type_of (XEXP (x, 1));
+
+ gcc_assert (t1 == cris_no_symbol || t2 == cris_no_symbol);
+
+@@ -2504,9 +2552,7 @@
+ return cris_no_symbol;
+
+ case UNSPEC:
+- /* Likely an offsettability-test attempting to add a constant to
+- a GOTREAD symbol, which can't be handled. */
+- return cris_invalid_pic_symbol;
++ return cris_unspec;
+
+ default:
+ fatal_insn ("unrecognized supposed constant", x);
+@@ -3714,19 +3760,19 @@
+ /* Worker function for expanding the address for PIC function calls. */
+
+ void
+-cris_expand_pic_call_address (rtx *opp)
++cris_expand_pic_call_address (rtx *opp, rtx *markerp)
+ {
+ rtx op = *opp;
+
+- gcc_assert (MEM_P (op));
++ gcc_assert (flag_pic && MEM_P (op));
+ op = XEXP (op, 0);
+
+ /* It might be that code can be generated that jumps to 0 (or to a
+ specific address). Don't die on that. (There is a
+ testcase.) */
+- if (CONSTANT_ADDRESS_P (op) && !CONST_INT_P (op))
++ if (CONSTANT_P (op) && !CONST_INT_P (op))
+ {
+- enum cris_pic_symbol_type t = cris_pic_symbol_type_of (op);
++ enum cris_symbol_type t = cris_symbol_type_of (op);
+
+ CRIS_ASSERT (can_create_pseudo_p ());
+
+@@ -3752,6 +3798,9 @@
+ }
+ else
+ op = force_reg (Pmode, op);
++
++ /* A local call. */
++ *markerp = const0_rtx;
+ }
+ else if (t == cris_got_symbol)
+ {
+@@ -3758,12 +3807,12 @@
+ if (TARGET_AVOID_GOTPLT)
+ {
+ /* Change a "jsr sym" into (allocate register rM, rO)
+- "move.d (const (unspec [sym rPIC] CRIS_UNSPEC_PLT_GOTREL)),rM"
++ "move.d (const (unspec [sym] CRIS_UNSPEC_PLT_GOTREL)),rM"
+ "add.d rPIC,rM,rO", "jsr rO" for pre-v32 and
+- "jsr (const (unspec [sym rPIC] CRIS_UNSPEC_PLT_PCREL))"
++ "jsr (const (unspec [sym] CRIS_UNSPEC_PLT_PCREL))"
+ for v32. */
+ rtx tem, rm, ro;
+- gcc_assert (can_create_pseudo_p ());
++
+ crtl->uses_pic_offset_table = 1;
+ tem = gen_rtx_UNSPEC (Pmode, gen_rtvec (1, op),
+ TARGET_V32
+@@ -3817,14 +3866,27 @@
+ MEM_NOTRAP_P (mem) = 1;
+ op = mem;
+ }
++
++ /* We need to prepare this call to go through the PLT; we
++ need to make GOT available. */
++ *markerp = pic_offset_table_rtx;
+ }
+ else
+- /* Can't possibly get a GOT-needing-fixup for a function-call,
+- right? */
++ /* Can't possibly get anything else for a function-call, right? */
+ fatal_insn ("unidentifiable call op", op);
+
+- *opp = replace_equiv_address (*opp, op);
++ /* If the validizing variant is called, it will try to validize
++ the address as a valid any-operand constant, but as it's only
++ valid for calls and moves, it will fail and always be forced
++ into a register. */
++ *opp = replace_equiv_address_nv (*opp, op);
+ }
++ else
++ /* Can't tell what locality a call to a non-constant address has;
++ better make the GOT register alive at it.
++ FIXME: Can we see whether the register has known constant
++ contents? */
++ *markerp = pic_offset_table_rtx;
+ }
+
+ /* Make sure operands are in the right order for an addsi3 insn as
+Index: gcc/config/cris/predicates.md
+===================================================================
+--- a/src/gcc/config/cris/predicates.md (.../tags/gcc_4_9_1_release)
++++ b/src/gcc/config/cris/predicates.md (.../branches/gcc-4_9-branch)
+@@ -142,7 +142,7 @@
+ (ior (match_operand 0 "general_operand")
+ (and (match_code "const, symbol_ref, label_ref")
+ ; The following test is actually just an assertion.
+- (match_test "cris_pic_symbol_type_of (op) != cris_no_symbol"))))
++ (match_test "cris_symbol_type_of (op) != cris_no_symbol"))))
+
+ ;; A predicate for the anon movsi expansion, one that fits a PCREL
+ ;; operand as well as general_operand.
+@@ -176,3 +176,15 @@
+ (ior (match_operand 0 "memory_operand")
+ (match_test "cris_general_operand_or_symbol (XEXP (op, 0),
+ Pmode)"))))
++
++;; A marker for the call-insn: (const_int 0) for a call to a
++;; hidden or static function and non-pic and
++;; pic_offset_table_rtx for a call that *might* go through the
++;; PLT.
++
++(define_predicate "cris_call_type_marker"
++ (ior (and (match_operand 0 "const_int_operand")
++ (match_test "op == const0_rtx"))
++ (and (and (match_operand 0 "register_operand")
++ (match_test "op == pic_offset_table_rtx"))
++ (match_test "flag_pic != 0"))))
+Index: gcc/config/cris/constraints.md
+===================================================================
+--- a/src/gcc/config/cris/constraints.md (.../tags/gcc_4_9_1_release)
++++ b/src/gcc/config/cris/constraints.md (.../branches/gcc-4_9-branch)
+@@ -118,7 +118,7 @@
+ reload_in_progress
+ || reload_completed)"))
+ ;; Just an explicit indirect reference: [const]?
+- (match_test "CONSTANT_P (XEXP (op, 0))")
++ (match_test "CRIS_CONSTANT_P (XEXP (op, 0))")
+ ;; Something that is indexed; [...+...]?
+ (and (match_code "plus" "0")
+ ;; A BDAP constant: [reg+(8|16|32)bit offset]?
+@@ -159,6 +159,8 @@
+ (define_constraint "U"
+ "@internal"
+ (and (match_test "flag_pic")
++ ;; We're just interested in the ..._or_callable_symbol part.
++ ;; (Using CRIS_CONSTANT_P would exclude that too.)
+ (match_test "CONSTANT_P (op)")
+ (match_operand 0 "cris_nonmemory_operand_or_callable_symbol")))
+
+Index: gcc/config/cris/cris.h
+===================================================================
+--- a/src/gcc/config/cris/cris.h (.../tags/gcc_4_9_1_release)
++++ b/src/gcc/config/cris/cris.h (.../branches/gcc-4_9-branch)
+@@ -794,6 +794,12 @@
+ } \
+ while (0)
+
++/* The mode argument to cris_legitimate_constant_p isn't used, so just
++ pass a cheap dummy. N.B. we have to cast away const from the
++ parameter rather than adjust the parameter, as it's type is mandated
++ by the TARGET_LEGITIMATE_CONSTANT_P target hook interface. */
++#define CRIS_CONSTANT_P(X) \
++ (CONSTANT_P (X) && cris_legitimate_constant_p (VOIDmode, CONST_CAST_RTX (X)))
+
+ /* Node: Condition Code */
+
+@@ -833,13 +839,14 @@
+
+ /* Helper type. */
+
+-enum cris_pic_symbol_type
++enum cris_symbol_type
+ {
+ cris_no_symbol = 0,
+ cris_got_symbol = 1,
+ cris_rel_symbol = 2,
+ cris_got_symbol_needing_fixup = 3,
+- cris_invalid_pic_symbol = 4
++ cris_unspec = 7,
++ cris_offsettable_symbol = 8
+ };
+
+ #define PIC_OFFSET_TABLE_REGNUM (flag_pic ? CRIS_GOT_REGNUM : INVALID_REGNUM)
+Index: gcc/config/cris/cris-protos.h
+===================================================================
+--- a/src/gcc/config/cris/cris-protos.h (.../tags/gcc_4_9_1_release)
++++ b/src/gcc/config/cris/cris-protos.h (.../branches/gcc-4_9-branch)
+@@ -31,8 +31,9 @@
+ extern rtx cris_return_addr_rtx (int, rtx);
+ extern rtx cris_split_movdx (rtx *);
+ extern int cris_legitimate_pic_operand (rtx);
+-extern enum cris_pic_symbol_type cris_pic_symbol_type_of (const_rtx);
++extern enum cris_symbol_type cris_symbol_type_of (const_rtx);
+ extern bool cris_valid_pic_const (const_rtx, bool);
++extern bool cris_legitimate_constant_p (enum machine_mode, rtx);
+ extern bool cris_constant_index_p (const_rtx);
+ extern bool cris_base_p (const_rtx, bool);
+ extern bool cris_base_or_autoincr_p (const_rtx, bool);
+@@ -46,7 +47,7 @@
+ extern void cris_asm_output_case_end (FILE *, int, rtx);
+ extern rtx cris_gen_movem_load (rtx, rtx, int);
+ extern rtx cris_emit_movem_store (rtx, rtx, int, bool);
+-extern void cris_expand_pic_call_address (rtx *);
++extern void cris_expand_pic_call_address (rtx *, rtx *);
+ extern void cris_order_for_addsi3 (rtx *, int);
+ extern void cris_emit_trap_for_misalignment (rtx);
+ #endif /* RTX_CODE */
+Index: gcc/config/rs6000/sysv4.h
+===================================================================
+--- a/src/gcc/config/rs6000/sysv4.h (.../tags/gcc_4_9_1_release)
++++ b/src/gcc/config/rs6000/sysv4.h (.../branches/gcc-4_9-branch)
+@@ -949,3 +949,19 @@
+ #define TARGET_USES_SYSV4_OPT 1
+
+ #undef DBX_REGISTER_NUMBER
++
++/* Link -lasan early on the command line. For -static-libasan, don't link
++ it for -shared link, the executable should be compiled with -static-libasan
++ in that case, and for executable link link with --{,no-}whole-archive around
++ it to force everything into the executable. And similarly for -ltsan. */
++#if defined(HAVE_LD_STATIC_DYNAMIC)
++#undef LIBASAN_EARLY_SPEC
++#define LIBASAN_EARLY_SPEC "%{!shared:libasan_preinit%O%s} " \
++ "%{static-libasan:%{!shared:" \
++ LD_STATIC_OPTION " --whole-archive -lasan --no-whole-archive " \
++ LD_DYNAMIC_OPTION "}}%{!static-libasan:-lasan}"
++#undef LIBTSAN_EARLY_SPEC
++#define LIBTSAN_EARLY_SPEC "%{static-libtsan:%{!shared:" \
++ LD_STATIC_OPTION " --whole-archive -ltsan --no-whole-archive " \
++ LD_DYNAMIC_OPTION "}}%{!static-libtsan:-ltsan}"
++#endif
+Index: gcc/config/arm/t-rtems-eabi
+===================================================================
+--- a/src/gcc/config/arm/t-rtems-eabi (.../tags/gcc_4_9_1_release)
++++ b/src/gcc/config/arm/t-rtems-eabi (.../branches/gcc-4_9-branch)
+@@ -1,47 +1,167 @@
+ # Custom RTEMS EABI multilibs
+
+-MULTILIB_OPTIONS = mthumb march=armv6-m/march=armv7-a/march=armv7-r/march=armv7-m mfpu=neon mfloat-abi=hard
+-MULTILIB_DIRNAMES = thumb armv6-m armv7-a armv7-r armv7-m neon hard
++MULTILIB_OPTIONS = mbig-endian mthumb march=armv6-m/march=armv7-a/march=armv7-r/march=armv7-m mfpu=neon/mfpu=vfpv3-d16/mfpu=fpv4-sp-d16 mfloat-abi=hard
++MULTILIB_DIRNAMES = eb thumb armv6-m armv7-a armv7-r armv7-m neon vfpv3-d16 fpv4-sp-d16 hard
+
+ # Enumeration of multilibs
+
+ MULTILIB_EXCEPTIONS =
++MULTILIB_EXCEPTIONS += mbig-endian/mthumb/march=armv6-m/mfpu=neon/mfloat-abi=hard
++MULTILIB_EXCEPTIONS += mbig-endian/mthumb/march=armv6-m/mfpu=neon
++MULTILIB_EXCEPTIONS += mbig-endian/mthumb/march=armv6-m/mfpu=vfpv3-d16/mfloat-abi=hard
++MULTILIB_EXCEPTIONS += mbig-endian/mthumb/march=armv6-m/mfpu=vfpv3-d16
++MULTILIB_EXCEPTIONS += mbig-endian/mthumb/march=armv6-m/mfpu=fpv4-sp-d16/mfloat-abi=hard
++MULTILIB_EXCEPTIONS += mbig-endian/mthumb/march=armv6-m/mfpu=fpv4-sp-d16
++MULTILIB_EXCEPTIONS += mbig-endian/mthumb/march=armv6-m/mfloat-abi=hard
++MULTILIB_EXCEPTIONS += mbig-endian/mthumb/march=armv6-m
++MULTILIB_EXCEPTIONS += mbig-endian/mthumb/march=armv7-a/mfpu=neon/mfloat-abi=hard
++MULTILIB_EXCEPTIONS += mbig-endian/mthumb/march=armv7-a/mfpu=neon
++MULTILIB_EXCEPTIONS += mbig-endian/mthumb/march=armv7-a/mfpu=vfpv3-d16/mfloat-abi=hard
++MULTILIB_EXCEPTIONS += mbig-endian/mthumb/march=armv7-a/mfpu=vfpv3-d16
++MULTILIB_EXCEPTIONS += mbig-endian/mthumb/march=armv7-a/mfpu=fpv4-sp-d16/mfloat-abi=hard
++MULTILIB_EXCEPTIONS += mbig-endian/mthumb/march=armv7-a/mfpu=fpv4-sp-d16
++MULTILIB_EXCEPTIONS += mbig-endian/mthumb/march=armv7-a/mfloat-abi=hard
++MULTILIB_EXCEPTIONS += mbig-endian/mthumb/march=armv7-a
++MULTILIB_EXCEPTIONS += mbig-endian/mthumb/march=armv7-r/mfpu=neon/mfloat-abi=hard
++MULTILIB_EXCEPTIONS += mbig-endian/mthumb/march=armv7-r/mfpu=neon
++# MULTILIB_EXCEPTIONS += mbig-endian/mthumb/march=armv7-r/mfpu=vfpv3-d16/mfloat-abi=hard
++MULTILIB_EXCEPTIONS += mbig-endian/mthumb/march=armv7-r/mfpu=vfpv3-d16
++MULTILIB_EXCEPTIONS += mbig-endian/mthumb/march=armv7-r/mfpu=fpv4-sp-d16/mfloat-abi=hard
++MULTILIB_EXCEPTIONS += mbig-endian/mthumb/march=armv7-r/mfpu=fpv4-sp-d16
++MULTILIB_EXCEPTIONS += mbig-endian/mthumb/march=armv7-r/mfloat-abi=hard
++# MULTILIB_EXCEPTIONS += mbig-endian/mthumb/march=armv7-r
++MULTILIB_EXCEPTIONS += mbig-endian/mthumb/march=armv7-m/mfpu=neon/mfloat-abi=hard
++MULTILIB_EXCEPTIONS += mbig-endian/mthumb/march=armv7-m/mfpu=neon
++MULTILIB_EXCEPTIONS += mbig-endian/mthumb/march=armv7-m/mfpu=vfpv3-d16/mfloat-abi=hard
++MULTILIB_EXCEPTIONS += mbig-endian/mthumb/march=armv7-m/mfpu=vfpv3-d16
++MULTILIB_EXCEPTIONS += mbig-endian/mthumb/march=armv7-m/mfpu=fpv4-sp-d16/mfloat-abi=hard
++MULTILIB_EXCEPTIONS += mbig-endian/mthumb/march=armv7-m/mfpu=fpv4-sp-d16
++MULTILIB_EXCEPTIONS += mbig-endian/mthumb/march=armv7-m/mfloat-abi=hard
++MULTILIB_EXCEPTIONS += mbig-endian/mthumb/march=armv7-m
++MULTILIB_EXCEPTIONS += mbig-endian/mthumb/mfpu=neon/mfloat-abi=hard
++MULTILIB_EXCEPTIONS += mbig-endian/mthumb/mfpu=neon
++MULTILIB_EXCEPTIONS += mbig-endian/mthumb/mfpu=vfpv3-d16/mfloat-abi=hard
++MULTILIB_EXCEPTIONS += mbig-endian/mthumb/mfpu=vfpv3-d16
++MULTILIB_EXCEPTIONS += mbig-endian/mthumb/mfpu=fpv4-sp-d16/mfloat-abi=hard
++MULTILIB_EXCEPTIONS += mbig-endian/mthumb/mfpu=fpv4-sp-d16
++MULTILIB_EXCEPTIONS += mbig-endian/mthumb/mfloat-abi=hard
++MULTILIB_EXCEPTIONS += mbig-endian/mthumb
++MULTILIB_EXCEPTIONS += mbig-endian/march=armv6-m/mfpu=neon/mfloat-abi=hard
++MULTILIB_EXCEPTIONS += mbig-endian/march=armv6-m/mfpu=neon
++MULTILIB_EXCEPTIONS += mbig-endian/march=armv6-m/mfpu=vfpv3-d16/mfloat-abi=hard
++MULTILIB_EXCEPTIONS += mbig-endian/march=armv6-m/mfpu=vfpv3-d16
++MULTILIB_EXCEPTIONS += mbig-endian/march=armv6-m/mfpu=fpv4-sp-d16/mfloat-abi=hard
++MULTILIB_EXCEPTIONS += mbig-endian/march=armv6-m/mfpu=fpv4-sp-d16
++MULTILIB_EXCEPTIONS += mbig-endian/march=armv6-m/mfloat-abi=hard
++MULTILIB_EXCEPTIONS += mbig-endian/march=armv6-m
++MULTILIB_EXCEPTIONS += mbig-endian/march=armv7-a/mfpu=neon/mfloat-abi=hard
++MULTILIB_EXCEPTIONS += mbig-endian/march=armv7-a/mfpu=neon
++MULTILIB_EXCEPTIONS += mbig-endian/march=armv7-a/mfpu=vfpv3-d16/mfloat-abi=hard
++MULTILIB_EXCEPTIONS += mbig-endian/march=armv7-a/mfpu=vfpv3-d16
++MULTILIB_EXCEPTIONS += mbig-endian/march=armv7-a/mfpu=fpv4-sp-d16/mfloat-abi=hard
++MULTILIB_EXCEPTIONS += mbig-endian/march=armv7-a/mfpu=fpv4-sp-d16
++MULTILIB_EXCEPTIONS += mbig-endian/march=armv7-a/mfloat-abi=hard
++MULTILIB_EXCEPTIONS += mbig-endian/march=armv7-a
++MULTILIB_EXCEPTIONS += mbig-endian/march=armv7-r/mfpu=neon/mfloat-abi=hard
++MULTILIB_EXCEPTIONS += mbig-endian/march=armv7-r/mfpu=neon
++MULTILIB_EXCEPTIONS += mbig-endian/march=armv7-r/mfpu=vfpv3-d16/mfloat-abi=hard
++MULTILIB_EXCEPTIONS += mbig-endian/march=armv7-r/mfpu=vfpv3-d16
++MULTILIB_EXCEPTIONS += mbig-endian/march=armv7-r/mfpu=fpv4-sp-d16/mfloat-abi=hard
++MULTILIB_EXCEPTIONS += mbig-endian/march=armv7-r/mfpu=fpv4-sp-d16
++MULTILIB_EXCEPTIONS += mbig-endian/march=armv7-r/mfloat-abi=hard
++MULTILIB_EXCEPTIONS += mbig-endian/march=armv7-r
++MULTILIB_EXCEPTIONS += mbig-endian/march=armv7-m/mfpu=neon/mfloat-abi=hard
++MULTILIB_EXCEPTIONS += mbig-endian/march=armv7-m/mfpu=neon
++MULTILIB_EXCEPTIONS += mbig-endian/march=armv7-m/mfpu=vfpv3-d16/mfloat-abi=hard
++MULTILIB_EXCEPTIONS += mbig-endian/march=armv7-m/mfpu=vfpv3-d16
++MULTILIB_EXCEPTIONS += mbig-endian/march=armv7-m/mfpu=fpv4-sp-d16/mfloat-abi=hard
++MULTILIB_EXCEPTIONS += mbig-endian/march=armv7-m/mfpu=fpv4-sp-d16
++MULTILIB_EXCEPTIONS += mbig-endian/march=armv7-m/mfloat-abi=hard
++MULTILIB_EXCEPTIONS += mbig-endian/march=armv7-m
++MULTILIB_EXCEPTIONS += mbig-endian/mfpu=neon/mfloat-abi=hard
++MULTILIB_EXCEPTIONS += mbig-endian/mfpu=neon
++MULTILIB_EXCEPTIONS += mbig-endian/mfpu=vfpv3-d16/mfloat-abi=hard
++MULTILIB_EXCEPTIONS += mbig-endian/mfpu=vfpv3-d16
++MULTILIB_EXCEPTIONS += mbig-endian/mfpu=fpv4-sp-d16/mfloat-abi=hard
++MULTILIB_EXCEPTIONS += mbig-endian/mfpu=fpv4-sp-d16
++MULTILIB_EXCEPTIONS += mbig-endian/mfloat-abi=hard
++MULTILIB_EXCEPTIONS += mbig-endian
+ MULTILIB_EXCEPTIONS += mthumb/march=armv6-m/mfpu=neon/mfloat-abi=hard
+ MULTILIB_EXCEPTIONS += mthumb/march=armv6-m/mfpu=neon
++MULTILIB_EXCEPTIONS += mthumb/march=armv6-m/mfpu=vfpv3-d16/mfloat-abi=hard
++MULTILIB_EXCEPTIONS += mthumb/march=armv6-m/mfpu=vfpv3-d16
++MULTILIB_EXCEPTIONS += mthumb/march=armv6-m/mfpu=fpv4-sp-d16/mfloat-abi=hard
++MULTILIB_EXCEPTIONS += mthumb/march=armv6-m/mfpu=fpv4-sp-d16
+ MULTILIB_EXCEPTIONS += mthumb/march=armv6-m/mfloat-abi=hard
+ # MULTILIB_EXCEPTIONS += mthumb/march=armv6-m
+ # MULTILIB_EXCEPTIONS += mthumb/march=armv7-a/mfpu=neon/mfloat-abi=hard
+ MULTILIB_EXCEPTIONS += mthumb/march=armv7-a/mfpu=neon
++MULTILIB_EXCEPTIONS += mthumb/march=armv7-a/mfpu=vfpv3-d16/mfloat-abi=hard
++MULTILIB_EXCEPTIONS += mthumb/march=armv7-a/mfpu=vfpv3-d16
++MULTILIB_EXCEPTIONS += mthumb/march=armv7-a/mfpu=fpv4-sp-d16/mfloat-abi=hard
++MULTILIB_EXCEPTIONS += mthumb/march=armv7-a/mfpu=fpv4-sp-d16
+ MULTILIB_EXCEPTIONS += mthumb/march=armv7-a/mfloat-abi=hard
+ # MULTILIB_EXCEPTIONS += mthumb/march=armv7-a
+ MULTILIB_EXCEPTIONS += mthumb/march=armv7-r/mfpu=neon/mfloat-abi=hard
+ MULTILIB_EXCEPTIONS += mthumb/march=armv7-r/mfpu=neon
++# MULTILIB_EXCEPTIONS += mthumb/march=armv7-r/mfpu=vfpv3-d16/mfloat-abi=hard
++MULTILIB_EXCEPTIONS += mthumb/march=armv7-r/mfpu=vfpv3-d16
++MULTILIB_EXCEPTIONS += mthumb/march=armv7-r/mfpu=fpv4-sp-d16/mfloat-abi=hard
++MULTILIB_EXCEPTIONS += mthumb/march=armv7-r/mfpu=fpv4-sp-d16
+ MULTILIB_EXCEPTIONS += mthumb/march=armv7-r/mfloat-abi=hard
+ # MULTILIB_EXCEPTIONS += mthumb/march=armv7-r
+ MULTILIB_EXCEPTIONS += mthumb/march=armv7-m/mfpu=neon/mfloat-abi=hard
+ MULTILIB_EXCEPTIONS += mthumb/march=armv7-m/mfpu=neon
++MULTILIB_EXCEPTIONS += mthumb/march=armv7-m/mfpu=vfpv3-d16/mfloat-abi=hard
++MULTILIB_EXCEPTIONS += mthumb/march=armv7-m/mfpu=vfpv3-d16
++# MULTILIB_EXCEPTIONS += mthumb/march=armv7-m/mfpu=fpv4-sp-d16/mfloat-abi=hard
++MULTILIB_EXCEPTIONS += mthumb/march=armv7-m/mfpu=fpv4-sp-d16
+ MULTILIB_EXCEPTIONS += mthumb/march=armv7-m/mfloat-abi=hard
+ # MULTILIB_EXCEPTIONS += mthumb/march=armv7-m
+ MULTILIB_EXCEPTIONS += mthumb/mfpu=neon/mfloat-abi=hard
+ MULTILIB_EXCEPTIONS += mthumb/mfpu=neon
++MULTILIB_EXCEPTIONS += mthumb/mfpu=vfpv3-d16/mfloat-abi=hard
++MULTILIB_EXCEPTIONS += mthumb/mfpu=vfpv3-d16
++MULTILIB_EXCEPTIONS += mthumb/mfpu=fpv4-sp-d16/mfloat-abi=hard
++MULTILIB_EXCEPTIONS += mthumb/mfpu=fpv4-sp-d16
+ MULTILIB_EXCEPTIONS += mthumb/mfloat-abi=hard
+ # MULTILIB_EXCEPTIONS += mthumb
+ MULTILIB_EXCEPTIONS += march=armv6-m/mfpu=neon/mfloat-abi=hard
+ MULTILIB_EXCEPTIONS += march=armv6-m/mfpu=neon
++MULTILIB_EXCEPTIONS += march=armv6-m/mfpu=vfpv3-d16/mfloat-abi=hard
++MULTILIB_EXCEPTIONS += march=armv6-m/mfpu=vfpv3-d16
++MULTILIB_EXCEPTIONS += march=armv6-m/mfpu=fpv4-sp-d16/mfloat-abi=hard
++MULTILIB_EXCEPTIONS += march=armv6-m/mfpu=fpv4-sp-d16
+ MULTILIB_EXCEPTIONS += march=armv6-m/mfloat-abi=hard
+ MULTILIB_EXCEPTIONS += march=armv6-m
+ MULTILIB_EXCEPTIONS += march=armv7-a/mfpu=neon/mfloat-abi=hard
+ MULTILIB_EXCEPTIONS += march=armv7-a/mfpu=neon
++MULTILIB_EXCEPTIONS += march=armv7-a/mfpu=vfpv3-d16/mfloat-abi=hard
++MULTILIB_EXCEPTIONS += march=armv7-a/mfpu=vfpv3-d16
++MULTILIB_EXCEPTIONS += march=armv7-a/mfpu=fpv4-sp-d16/mfloat-abi=hard
++MULTILIB_EXCEPTIONS += march=armv7-a/mfpu=fpv4-sp-d16
+ MULTILIB_EXCEPTIONS += march=armv7-a/mfloat-abi=hard
+ MULTILIB_EXCEPTIONS += march=armv7-a
+ MULTILIB_EXCEPTIONS += march=armv7-r/mfpu=neon/mfloat-abi=hard
+ MULTILIB_EXCEPTIONS += march=armv7-r/mfpu=neon
++MULTILIB_EXCEPTIONS += march=armv7-r/mfpu=vfpv3-d16/mfloat-abi=hard
++MULTILIB_EXCEPTIONS += march=armv7-r/mfpu=vfpv3-d16
++MULTILIB_EXCEPTIONS += march=armv7-r/mfpu=fpv4-sp-d16/mfloat-abi=hard
++MULTILIB_EXCEPTIONS += march=armv7-r/mfpu=fpv4-sp-d16
+ MULTILIB_EXCEPTIONS += march=armv7-r/mfloat-abi=hard
+ MULTILIB_EXCEPTIONS += march=armv7-r
+ MULTILIB_EXCEPTIONS += march=armv7-m/mfpu=neon/mfloat-abi=hard
+ MULTILIB_EXCEPTIONS += march=armv7-m/mfpu=neon
++MULTILIB_EXCEPTIONS += march=armv7-m/mfpu=vfpv3-d16/mfloat-abi=hard
++MULTILIB_EXCEPTIONS += march=armv7-m/mfpu=vfpv3-d16
++MULTILIB_EXCEPTIONS += march=armv7-m/mfpu=fpv4-sp-d16/mfloat-abi=hard
++MULTILIB_EXCEPTIONS += march=armv7-m/mfpu=fpv4-sp-d16
+ MULTILIB_EXCEPTIONS += march=armv7-m/mfloat-abi=hard
+ MULTILIB_EXCEPTIONS += march=armv7-m
+ MULTILIB_EXCEPTIONS += mfpu=neon/mfloat-abi=hard
+ MULTILIB_EXCEPTIONS += mfpu=neon
++MULTILIB_EXCEPTIONS += mfpu=vfpv3-d16/mfloat-abi=hard
++MULTILIB_EXCEPTIONS += mfpu=vfpv3-d16
++MULTILIB_EXCEPTIONS += mfpu=fpv4-sp-d16/mfloat-abi=hard
++MULTILIB_EXCEPTIONS += mfpu=fpv4-sp-d16
+ MULTILIB_EXCEPTIONS += mfloat-abi=hard
diff --git a/debian/rules.patch b/debian/rules.patch
index 8630d06..829f6b7 100644
--- a/debian/rules.patch
+++ b/debian/rules.patch
@@ -13,6 +13,7 @@ series_file ?= $(patchdir)/series
# which patches should be applied?
debian_patches = \
+ svn-updates \
$(if $(with_linaro_branch),gcc-linaro) \
# svn-updates \
@@ -265,7 +266,11 @@ else ifeq ($(distribution),Ubuntu)
endif
debian_patches += libffi-ro-eh_frame_sect
-debian_patches += gcc-multiarch$(if $(trunk_build),-trunk)
+ifeq ($(trunk_build),yes)
+ debian_patches += gcc-multiarch-trunk
+else
+ debian_patches += gcc-multiarch$(if $(with_linaro_branch),-linaro)
+endif
ifeq ($(with_multiarch_lib),yes)
ifneq ($(single_package),yes)
debian_patches += libjava-multiarch