aboutsummaryrefslogtreecommitdiffstats
path: root/toolchain/gcc
diff options
context:
space:
mode:
authorImre Kaloz <kaloz@openwrt.org>2010-01-25 10:52:23 +0000
committerImre Kaloz <kaloz@openwrt.org>2010-01-25 10:52:23 +0000
commitcae33bf4e92744490432350ae00ec50da0cc4980 (patch)
treebfc9d3dcffbaf007cab8d3eb4954c7f9ce5c0efc /toolchain/gcc
parente85f50118cb48d03bf3c83e559f3fb815d11ce7b (diff)
downloadupstream-cae33bf4e92744490432350ae00ec50da0cc4980.tar.gz
upstream-cae33bf4e92744490432350ae00ec50da0cc4980.tar.bz2
upstream-cae33bf4e92744490432350ae00ec50da0cc4980.zip
add preliminary support for the latest CodeSourcery toolchain
SVN-Revision: 19324
Diffstat (limited to 'toolchain/gcc')
-rw-r--r--toolchain/gcc/Config.in4
-rw-r--r--toolchain/gcc/Config.version2
-rw-r--r--toolchain/gcc/Makefile2
-rw-r--r--toolchain/gcc/patches/4.4.1+cs/000-codesourcery_2009q3_68.patch84079
-rw-r--r--toolchain/gcc/patches/4.4.1+cs/100-uclibc-conf.patch33
-rw-r--r--toolchain/gcc/patches/4.4.1+cs/106-fix_linker_error.patch12
-rw-r--r--toolchain/gcc/patches/4.4.1+cs/301-missing-execinfo_h.patch11
-rw-r--r--toolchain/gcc/patches/4.4.1+cs/302-c99-snprintf.patch11
-rw-r--r--toolchain/gcc/patches/4.4.1+cs/305-libmudflap-susv3-legacy.patch47
-rw-r--r--toolchain/gcc/patches/4.4.1+cs/600-ubicom_support.patch9386
-rw-r--r--toolchain/gcc/patches/4.4.1+cs/810-arm-softfloat-libgcc.patch25
-rw-r--r--toolchain/gcc/patches/4.4.1+cs/820-libgcc_pic.patch36
-rw-r--r--toolchain/gcc/patches/4.4.1+cs/910-mbsd_multi.patch162
-rw-r--r--toolchain/gcc/patches/4.4.1+cs/993-arm_insn-opinit-RTX_CODE-fixup.patch14
-rw-r--r--toolchain/gcc/patches/4.4.1+cs/999-coldfire.patch12
15 files changed, 93835 insertions, 1 deletions
diff --git a/toolchain/gcc/Config.in b/toolchain/gcc/Config.in
index a75d5a375b..8ec6bab0ad 100644
--- a/toolchain/gcc/Config.in
+++ b/toolchain/gcc/Config.in
@@ -49,6 +49,10 @@ if !LINUX_2_4
config GCC_VERSION_4_3_3_CS
bool "gcc 4.3.3 with CodeSourcery enhancements"
+ config GCC_VERSION_4_4_1_CS
+ bool "gcc 4.4.1 with CodeSourcery enhancements"
+ depends BROKEN
+
endif
endchoice
diff --git a/toolchain/gcc/Config.version b/toolchain/gcc/Config.version
index f3b40d7fa5..91a9be9342 100644
--- a/toolchain/gcc/Config.version
+++ b/toolchain/gcc/Config.version
@@ -7,6 +7,7 @@ config GCC_VERSION
default "4.3.3+cs" if GCC_VERSION_4_3_3_CS
default "4.3.4" if GCC_VERSION_4_3_4
default "4.4.1" if GCC_VERSION_4_4_1
+ default "4.4.1+cs" if GCC_VERSION_4_4_1_CS
default "4.4.2" if GCC_VERSION_4_4_2
default "4.4.3" if GCC_VERSION_4_4_3
default "llvm" if GCC_VERSION_LLVM
@@ -47,6 +48,7 @@ config GCC_VERSION_4_3
config GCC_VERSION_4_4
bool
default y if GCC_VERSION_4_4_1
+ default y if GCC_VERSION_4_4_1_CS
default y if GCC_VERSION_4_4_2
default y if GCC_VERSION_4_4_3
diff --git a/toolchain/gcc/Makefile b/toolchain/gcc/Makefile
index 5e8b9b3d7b..09ed7b80b8 100644
--- a/toolchain/gcc/Makefile
+++ b/toolchain/gcc/Makefile
@@ -98,7 +98,7 @@ GCC_CONFIGURE:= \
$(call qstrip,$(CONFIG_EXTRA_GCC_CONFIG_OPTIONS)) \
$(if $(CONFIG_mips64)$(CONFIG_mips64el),--with-arch=mips64 --with-abi=64) \
$(if $(CONFIG_GCC_VERSION_LLVM),--enable-llvm=$(BUILD_DIR_BASE)/host/llvm) \
- $(if $(CONFIG_GCC_VERSION_4_3_3_CS),--enable-poison-system-directories)
+ $(if $(CONFIG_GCC_VERSION_4_3_3_CS)$(CONFIG_GCC_VERSION_4_4_1_CS),--enable-poison-system-directories)
ifneq ($(CONFIG_GCC_VERSION_4_3)$(CONFIG_GCC_VERSION_4_4),)
GCC_BUILD_TARGET_LIBGCC:=y
diff --git a/toolchain/gcc/patches/4.4.1+cs/000-codesourcery_2009q3_68.patch b/toolchain/gcc/patches/4.4.1+cs/000-codesourcery_2009q3_68.patch
new file mode 100644
index 0000000000..a0432f4783
--- /dev/null
+++ b/toolchain/gcc/patches/4.4.1+cs/000-codesourcery_2009q3_68.patch
@@ -0,0 +1,84079 @@
+diff -Nur a/config/mh-mingw b/config/mh-mingw
+--- a/config/mh-mingw 2008-11-21 14:54:41.000000000 +0100
++++ b/config/mh-mingw 2010-01-25 09:50:28.945687353 +0100
+@@ -1,6 +1,8 @@
+ # Add -D__USE_MINGW_ACCESS to enable the built compiler to work on Windows
+ # Vista (see PR33281 for details).
+-BOOT_CFLAGS += -D__USE_MINGW_ACCESS -Wno-pedantic-ms-format
+-CFLAGS += -D__USE_MINGW_ACCESS
++# Because we wrap access in libiberty/cygpath.c, we do not want to use
++# the MinGW wrappers for access.
++BOOT_CFLAGS += -Wno-pedantic-ms-format
++# CFLAGS += -D__USE_MINGW_ACCESS
+ # Increase stack limit to same as Linux default.
+ LDFLAGS += -Wl,--stack,8388608
+diff -Nur a/config/stdint.m4 b/config/stdint.m4
+--- a/config/stdint.m4 2007-04-12 15:06:43.000000000 +0200
++++ b/config/stdint.m4 2010-01-25 09:50:28.945687353 +0100
+@@ -115,19 +115,19 @@
+
+ # Lacking an uintptr_t? Test size of void *
+ case "$acx_cv_header_stdint:$ac_cv_type_uintptr_t" in
+- stddef.h:* | *:no) AC_CHECK_SIZEOF(void *) ;;
++ stddef.h:* | *:no) AC_CHECK_SIZEOF(void *,,/* no standard headers */) ;;
+ esac
+
+ # Lacking an uint64_t? Test size of long
+ case "$acx_cv_header_stdint:$ac_cv_type_uint64_t:$ac_cv_type_u_int64_t" in
+- stddef.h:*:* | *:no:no) AC_CHECK_SIZEOF(long) ;;
++ stddef.h:*:* | *:no:no) AC_CHECK_SIZEOF(long,,/* no standard headers */) ;;
+ esac
+
+ if test $acx_cv_header_stdint = stddef.h; then
+ # Lacking a good header? Test size of everything and deduce all types.
+- AC_CHECK_SIZEOF(int)
+- AC_CHECK_SIZEOF(short)
+- AC_CHECK_SIZEOF(char)
++ AC_CHECK_SIZEOF(int,,/* no standard headers */)
++ AC_CHECK_SIZEOF(short,,/* no standard headers */)
++ AC_CHECK_SIZEOF(char,,/* no standard headers */)
+
+ AC_MSG_CHECKING(for type equivalent to int8_t)
+ case "$ac_cv_sizeof_char" in
+diff -Nur a/config/tls.m4 b/config/tls.m4
+--- a/config/tls.m4 2009-01-23 05:58:03.000000000 +0100
++++ b/config/tls.m4 2010-01-25 09:50:28.945687353 +0100
+@@ -1,5 +1,6 @@
+ dnl Check whether the target supports TLS.
+ AC_DEFUN([GCC_CHECK_TLS], [
++ AC_REQUIRE([AC_CANONICAL_HOST])
+ GCC_ENABLE(tls, yes, [], [Use thread-local storage])
+ AC_CACHE_CHECK([whether the target supports thread-local storage],
+ gcc_cv_have_tls, [
+@@ -66,7 +67,24 @@
+ [dnl This is the cross-compiling case. Assume libc supports TLS if the
+ dnl binutils and the compiler do.
+ AC_LINK_IFELSE([__thread int a; int b; int main() { return a = b; }],
+- [gcc_cv_have_tls=yes], [gcc_cv_have_tls=no])
++ [chktls_save_LDFLAGS="$LDFLAGS"
++ dnl Shared library options may depend on the host; this check
++ dnl is only known to be needed for GNU/Linux.
++ case $host in
++ *-*-linux*)
++ LDFLAGS="-shared -Wl,--no-undefined $LDFLAGS"
++ ;;
++ esac
++ chktls_save_CFLAGS="$CFLAGS"
++ CFLAGS="-fPIC $CFLAGS"
++ dnl If -shared works, test if TLS works in a shared library.
++ AC_LINK_IFELSE([int f() { return 0; }],
++ [AC_LINK_IFELSE([__thread int a; int b; int f() { return a = b; }],
++ [gcc_cv_have_tls=yes],
++ [gcc_cv_have_tls=no])],
++ [gcc_cv_have_tls=yes])
++ CFLAGS="$chktls_save_CFLAGS"
++ LDFLAGS="$chktls_save_LDFLAGS"], [gcc_cv_have_tls=no])
+ ]
+ )])
+ if test "$enable_tls $gcc_cv_have_tls" = "yes yes"; then
+diff -Nur a/configure b/configure
+--- a/configure 2009-04-25 06:10:29.000000000 +0200
++++ b/configure 2010-01-25 09:50:28.945687353 +0100
+@@ -2277,7 +2277,7 @@
+ noconfigdirs="$noconfigdirs target-newlib target-libgloss target-rda ${libgcj}"
+ ;;
+ *-*-vxworks*)
+- noconfigdirs="$noconfigdirs target-newlib target-libgloss target-libiberty target-libstdc++-v3 ${libgcj}"
++ noconfigdirs="$noconfigdirs target-newlib target-libgloss target-libiberty ${libgcj}"
+ ;;
+ alpha*-dec-osf*)
+ # ld works, but does not support shared libraries.
+diff -Nur a/configure.ac b/configure.ac
+--- a/configure.ac 2009-04-25 06:10:29.000000000 +0200
++++ b/configure.ac 2010-01-25 09:50:28.945687353 +0100
+@@ -512,7 +512,7 @@
+ noconfigdirs="$noconfigdirs target-newlib target-libgloss target-rda ${libgcj}"
+ ;;
+ *-*-vxworks*)
+- noconfigdirs="$noconfigdirs target-newlib target-libgloss target-libiberty target-libstdc++-v3 ${libgcj}"
++ noconfigdirs="$noconfigdirs target-newlib target-libgloss target-libiberty ${libgcj}"
+ ;;
+ alpha*-dec-osf*)
+ # ld works, but does not support shared libraries.
+diff -Nur a/fixincludes/fixincl.tpl b/fixincludes/fixincl.tpl
+--- a/fixincludes/fixincl.tpl 2008-09-06 21:57:26.000000000 +0200
++++ b/fixincludes/fixincl.tpl 2010-01-25 09:50:28.945687353 +0100
+@@ -38,7 +38,7 @@
+ #ifndef SED_PROGRAM
+ #define SED_PROGRAM "/usr/bin/sed"
+ #endif
+-static char const sed_cmd_z[] = SED_PROGRAM;
++static char const sed_cmd_z[] = "sed";
+ [=
+
+ FOR fix =]
+diff -Nur a/fixincludes/fixincl.x b/fixincludes/fixincl.x
+--- a/fixincludes/fixincl.x 2009-02-28 19:13:31.000000000 +0100
++++ b/fixincludes/fixincl.x 2010-01-25 09:50:28.945687353 +0100
+@@ -2,11 +2,11 @@
+ *
+ * DO NOT EDIT THIS FILE (fixincl.x)
+ *
+- * It has been AutoGen-ed Saturday February 28, 2009 at 10:11:41 AM PST
++ * It has been AutoGen-ed Monday July 20, 2009 at 01:53:53 PM PDT
+ * From the definitions inclhack.def
+ * and the template file fixincl
+ */
+-/* DO NOT SVN-MERGE THIS FILE, EITHER Sat Feb 28 10:11:41 PST 2009
++/* DO NOT SVN-MERGE THIS FILE, EITHER Mon Jul 20 13:53:53 PDT 2009
+ *
+ * You must regenerate it. Use the ./genfixes script.
+ *
+@@ -15,7 +15,7 @@
+ * certain ANSI-incompatible system header files which are fixed to work
+ * correctly with ANSI C and placed in a directory that GNU C will search.
+ *
+- * This file contains 180 fixup descriptions.
++ * This file contains 181 fixup descriptions.
+ *
+ * See README for more information.
+ *
+@@ -39,7 +39,7 @@
+ #ifndef SED_PROGRAM
+ #define SED_PROGRAM "/usr/bin/sed"
+ #endif
+-static char const sed_cmd_z[] = SED_PROGRAM;
++static char const sed_cmd_z[] = "sed";
+
+ /* * * * * * * * * * * * * * * * * * * * * * * * * *
+ *
+@@ -2300,6 +2300,42 @@
+
+ /* * * * * * * * * * * * * * * * * * * * * * * * * *
+ *
++ * Description of Glibc_String2_Memset fix
++ */
++tSCC zGlibc_String2_MemsetName[] =
++ "glibc_string2_memset";
++
++/*
++ * File name selection pattern
++ */
++tSCC zGlibc_String2_MemsetList[] =
++ "bits/string2.h\0";
++/*
++ * Machine/OS name selection pattern
++ */
++#define apzGlibc_String2_MemsetMachs (const char**)NULL
++
++/*
++ * content selection pattern - do fix if pattern found
++ */
++tSCC zGlibc_String2_MemsetSelect0[] =
++ "#ifndef _HAVE_STRING_ARCH_memset\n\
++# if _STRING_ARCH_unaligned";
++
++#define GLIBC_STRING2_MEMSET_TEST_CT 1
++static tTestDesc aGlibc_String2_MemsetTests[] = {
++ { TT_EGREP, zGlibc_String2_MemsetSelect0, (regex_t*)NULL }, };
++
++/*
++ * Fix Command Arguments for Glibc_String2_Memset
++ */
++static const char* apzGlibc_String2_MemsetPatch[] = {
++ "format",
++ "%0 && 0",
++ (char*)NULL };
++
++/* * * * * * * * * * * * * * * * * * * * * * * * * *
++ *
+ * Description of Gnu_Types fix
+ */
+ tSCC zGnu_TypesName[] =
+@@ -5617,8 +5653,7 @@
+ * Machine/OS name selection pattern
+ */
+ tSCC* apzSolaris_Mutex_Init_2Machs[] = {
+- "*-*-solaris2.[0-9]",
+- "*-*-solaris2.[0-9][!0-9]*",
++ "*-*-solaris*",
+ (const char*)NULL };
+
+ /*
+@@ -5627,8 +5662,15 @@
+ tSCC zSolaris_Mutex_Init_2Select0[] =
+ "@\\(#\\)pthread.h[ \t]+1.[0-9]+[ \t]+[0-9/]+ SMI";
+
+-#define SOLARIS_MUTEX_INIT_2_TEST_CT 1
++/*
++ * perform the 'test' shell command - do fix on success
++ */
++tSCC zSolaris_Mutex_Init_2Test0[] =
++ " -n \"`grep '#if __STDC__ - 0 == 0 && !defined(_NO_LONGLONG)' \\`dirname $file\\`/sys/types.h`\"";
++
++#define SOLARIS_MUTEX_INIT_2_TEST_CT 2
+ static tTestDesc aSolaris_Mutex_Init_2Tests[] = {
++ { TT_TEST, zSolaris_Mutex_Init_2Test0, 0 /* unused */ },
+ { TT_EGREP, zSolaris_Mutex_Init_2Select0, (regex_t*)NULL }, };
+
+ /*
+@@ -5670,8 +5712,15 @@
+ tSCC zSolaris_Rwlock_Init_1Select0[] =
+ "@\\(#\\)pthread.h[ \t]+1.[0-9]+[ \t]+[0-9/]+ SMI";
+
+-#define SOLARIS_RWLOCK_INIT_1_TEST_CT 1
++/*
++ * perform the 'test' shell command - do fix on success
++ */
++tSCC zSolaris_Rwlock_Init_1Test0[] =
++ " -n \"`grep '#if __STDC__ - 0 == 0 && !defined(_NO_LONGLONG)' \\`dirname $file\\`/sys/types.h`\"";
++
++#define SOLARIS_RWLOCK_INIT_1_TEST_CT 2
+ static tTestDesc aSolaris_Rwlock_Init_1Tests[] = {
++ { TT_TEST, zSolaris_Rwlock_Init_1Test0, 0 /* unused */ },
+ { TT_EGREP, zSolaris_Rwlock_Init_1Select0, (regex_t*)NULL }, };
+
+ /*
+@@ -5741,8 +5790,7 @@
+ * Machine/OS name selection pattern
+ */
+ tSCC* apzSolaris_Once_Init_2Machs[] = {
+- "*-*-solaris2.[0-9]",
+- "*-*-solaris2.[0-9][!0-9]*",
++ "*-*-solaris*",
+ (const char*)NULL };
+
+ /*
+@@ -5751,8 +5799,15 @@
+ tSCC zSolaris_Once_Init_2Select0[] =
+ "@\\(#\\)pthread.h[ \t]+1.[0-9]+[ \t]+[0-9/]+ SMI";
+
+-#define SOLARIS_ONCE_INIT_2_TEST_CT 1
++/*
++ * perform the 'test' shell command - do fix on success
++ */
++tSCC zSolaris_Once_Init_2Test0[] =
++ " -n \"`grep '#if __STDC__ - 0 == 0 && !defined(_NO_LONGLONG)' \\`dirname $file\\`/sys/types.h`\"";
++
++#define SOLARIS_ONCE_INIT_2_TEST_CT 2
+ static tTestDesc aSolaris_Once_Init_2Tests[] = {
++ { TT_TEST, zSolaris_Once_Init_2Test0, 0 /* unused */ },
+ { TT_EGREP, zSolaris_Once_Init_2Select0, (regex_t*)NULL }, };
+
+ /*
+@@ -7308,9 +7363,9 @@
+ *
+ * List of all fixes
+ */
+-#define REGEX_COUNT 226
+-#define MACH_LIST_SIZE_LIMIT 181
+-#define FIX_COUNT 180
++#define REGEX_COUNT 227
++#define MACH_LIST_SIZE_LIMIT 169
++#define FIX_COUNT 181
+
+ /*
+ * Enumerate the fixes
+@@ -7371,6 +7426,7 @@
+ GLIBC_C99_INLINE_3_FIXIDX,
+ GLIBC_C99_INLINE_4_FIXIDX,
+ GLIBC_MUTEX_INIT_FIXIDX,
++ GLIBC_STRING2_MEMSET_FIXIDX,
+ GNU_TYPES_FIXIDX,
+ HP_INLINE_FIXIDX,
+ HP_SYSFILE_FIXIDX,
+@@ -7774,6 +7830,11 @@
+ GLIBC_MUTEX_INIT_TEST_CT, FD_MACH_ONLY,
+ aGlibc_Mutex_InitTests, apzGlibc_Mutex_InitPatch, 0 },
+
++ { zGlibc_String2_MemsetName, zGlibc_String2_MemsetList,
++ apzGlibc_String2_MemsetMachs,
++ GLIBC_STRING2_MEMSET_TEST_CT, FD_MACH_ONLY | FD_SUBROUTINE,
++ aGlibc_String2_MemsetTests, apzGlibc_String2_MemsetPatch, 0 },
++
+ { zGnu_TypesName, zGnu_TypesList,
+ apzGnu_TypesMachs,
+ GNU_TYPES_TEST_CT, FD_MACH_IFNOT | FD_SUBROUTINE,
+diff -Nur a/fixincludes/inclhack.def b/fixincludes/inclhack.def
+--- a/fixincludes/inclhack.def 2009-02-28 19:13:31.000000000 +0100
++++ b/fixincludes/inclhack.def 2010-01-25 09:50:28.955687088 +0100
+@@ -1302,6 +1302,21 @@
+ };
+
+
++/* glibc's bits/string2.h (before 2004-05-26) generates bogus
++ -Wstrict-aliasing warnings from calls to memset. */
++fix = {
++ hackname = glibc_string2_memset;
++ files = "bits/string2.h";
++ select = "#ifndef _HAVE_STRING_ARCH_memset\n# if _STRING_ARCH_unaligned";
++ c_fix = format;
++ c_fix_arg = "%0 && 0";
++ test_text = "#ifndef _HAVE_STRING_ARCH_memset\n"
++ "# if _STRING_ARCH_unaligned\n"
++ "# endif\n"
++ "#endif\n";
++};
++
++
+ /*
+ * Fix these files to use the types we think they should for
+ * ptrdiff_t, size_t, and wchar_t.
+@@ -2939,24 +2954,32 @@
+ };
+
+ /*
+- * Sun Solaris defines PTHREAD_MUTEX_INITIALIZER with a trailing
+- * "0" for the last field of the pthread_mutex_t structure, which is
+- * of type upad64_t, which itself is typedef'd to int64_t, but with
+- * __STDC__ defined (e.g. by -ansi) it is a union. So change the
+- * initializer to "{0}" instead
++ * Sun Solaris defines the last field of the pthread_mutex_t structure
++ * to have type upad64_t. Whether upad64_t is an integer type or a
++ * union depends on whether or not the headers believe that a 64-bit
++ * integer type is available. But, PTHREAD_MUTEX_INITIALIZER is not
++ * appropriately conditionalized; it always uses "0", and never "{0}".
++ * In order to avoid warnings/errors from the compiler, we must make
++ * the initializer use braces where appropriate.
++ *
++ * Prior to Solaris 10, if __STDC__ is 1 (as when compiling with
++ * -ansi), the definition would be a union. Beginning with Solaris
++ * 10, the headers check for __GNUC__, and will never use a union with
++ * GCC. We check /usr/include/sys/types.h to see if it checks for
++ * __STDC__.
++ *
++ * A "mach" test for Solaris 10 is undesirable because we want to
++ * allow a compiler built for Solaris <10 to be used on Solaris >=10,
++ * but the installed version of fixincludes hard-wires the target
++ * machine to the configure-time $target, rather than automatically
++ * determining it at installation time.
+ */
+ fix = {
+ hackname = solaris_mutex_init_2;
+ select = '@\(#\)pthread.h' "[ \t]+1.[0-9]+[ \t]+[0-9/]+ SMI";
+ files = pthread.h;
+- /*
+- * On Solaris 10, this fix is unnecessary because upad64_t is
+- * always defined correctly regardless of the definition of the
+- * __STDC__ macro. The first "mach" pattern matches up to
+- * solaris9. The second "mach" pattern will not match any two (or
+- * more) digit solaris version, but it will match e.g. 2.5.1.
+- */
+- mach = '*-*-solaris2.[0-9]', '*-*-solaris2.[0-9][!0-9]*';
++ mach = '*-*-solaris*';
++ test = " -n \"`grep '#if __STDC__ - 0 == 0 && !defined(_NO_LONGLONG)' \\`dirname $file\\`/sys/types.h`\"";
+ c_fix = format;
+ c_fix_arg = "#if __STDC__ - 0 == 0 && !defined(_NO_LONGLONG)\n"
+ "%0\n"
+@@ -2967,6 +2990,7 @@
+ "(|/\*.*\*/[ \t]*\\\\\n[ \t]*)\\{.*)"
+ ",[ \t]*0\\}" "(|[ \t].*)$";
+ test_text =
++ "`mkdir -p sys; echo '#if __STDC__ - 0 == 0 && !defined(_NO_LONGLONG)' >> sys/types.h`"
+ '#ident "@(#)pthread.h 1.26 98/04/12 SMI"'"\n"
+ "#define PTHREAD_MUTEX_INITIALIZER\t{{{0},0}, {{{0}}}, 0}\n"
+ "#define PTHREAD_COND_INITIALIZER\t{{{0}, 0}, 0}\t/* DEFAULTCV */\n"
+@@ -2978,17 +3002,14 @@
+
+
+ /*
+- * Sun Solaris defines PTHREAD_RWLOCK_INITIALIZER with a "0" for some
+- * fields of the pthread_rwlock_t structure, which are of type
+- * upad64_t, which itself is typedef'd to int64_t, but with __STDC__
+- * defined (e.g. by -ansi) it is a union. So change the initializer
+- * to "{0}" instead.
++ * See comments for solaris_mutex_init_2 re. upad64_t.
+ */
+ fix = {
+ hackname = solaris_rwlock_init_1;
+ select = '@\(#\)pthread.h' "[ \t]+1.[0-9]+[ \t]+[0-9/]+ SMI";
+ files = pthread.h;
+ mach = '*-*-solaris*';
++ test = " -n \"`grep '#if __STDC__ - 0 == 0 && !defined(_NO_LONGLONG)' \\`dirname $file\\`/sys/types.h`\"";
+ c_fix = format;
+ c_fix_arg = "#if __STDC__ - 0 == 0 && !defined(_NO_LONGLONG)\n"
+ "%0\n"
+@@ -3024,24 +3045,14 @@
+
+
+ /*
+- * Sun Solaris defines PTHREAD_ONCE_INIT with a "0" for some
+- * fields of the pthread_once_t structure, which are of type
+- * upad64_t, which itself is typedef'd to int64_t, but with __STDC__
+- * defined (e.g. by -ansi) it is a union. So change the initializer
+- * to "{0}" instead. This test relies on solaris_once_init_1.
++ * See comments for solaris_mutex_init_2 re. upad64_t.
+ */
+ fix = {
+ hackname = solaris_once_init_2;
+ select = '@\(#\)pthread.h' "[ \t]+1.[0-9]+[ \t]+[0-9/]+ SMI";
+ files = pthread.h;
+- /*
+- * On Solaris 10, this fix is unnecessary because upad64_t is
+- * always defined correctly regardless of the definition of the
+- * __STDC__ macro. The first "mach" pattern matches up to
+- * solaris9. The second "mach" pattern will not match any two (or
+- * more) digit solaris version, but it will match e.g. 2.5.1.
+- */
+- mach = '*-*-solaris2.[0-9]', '*-*-solaris2.[0-9][!0-9]*';
++ mach = '*-*-solaris*';
++ test = " -n \"`grep '#if __STDC__ - 0 == 0 && !defined(_NO_LONGLONG)' \\`dirname $file\\`/sys/types.h`\"";
+ c_fix = format;
+ c_fix_arg = "#if __STDC__ - 0 == 0 && !defined(_NO_LONGLONG)\n"
+ "%0\n"
+diff -Nur a/fixincludes/server.c b/fixincludes/server.c
+--- a/fixincludes/server.c 2005-08-15 02:50:43.000000000 +0200
++++ b/fixincludes/server.c 2010-01-25 09:50:28.955687088 +0100
+@@ -266,7 +266,7 @@
+ /* Make sure the process will pay attention to us, send the
+ supplied command, and then have it output a special marker that
+ we can find. */
+- fprintf (server_pair.pf_write, "cd %s\n%s\n\necho\necho %s\n",
++ fprintf (server_pair.pf_write, "cd '%s'\n%s\n\necho\necho %s\n",
+ p_cur_dir, pz_cmd, z_done);
+ fflush (server_pair.pf_write);
+
+diff -Nur a/fixincludes/tests/base/bits/string2.h b/fixincludes/tests/base/bits/string2.h
+--- a/fixincludes/tests/base/bits/string2.h 2007-03-26 15:25:26.000000000 +0200
++++ b/fixincludes/tests/base/bits/string2.h 2010-01-25 09:50:28.955687088 +0100
+@@ -16,3 +16,12 @@
+ # define __STRING_INLINE extern __inline
+ # endif
+ #endif /* GLIBC_C99_INLINE_3_CHECK */
++
++
++#if defined( GLIBC_STRING2_MEMSET_CHECK )
++#ifndef _HAVE_STRING_ARCH_memset
++# if _STRING_ARCH_unaligned && 0
++# endif
++#endif
++
++#endif /* GLIBC_STRING2_MEMSET_CHECK */
+diff -Nur a/fixincludes/tests/base/sys/types.h b/fixincludes/tests/base/sys/types.h
+--- a/fixincludes/tests/base/sys/types.h 2004-08-31 11:27:00.000000000 +0200
++++ b/fixincludes/tests/base/sys/types.h 2010-01-25 09:50:28.955687088 +0100
+@@ -28,3 +28,4 @@
+
+ #endif /* ushort_t */
+ #endif /* GNU_TYPES_CHECK */
++#if !defined(__STRICT_ANSI__) && !defined(_NO_LONGLONG)
+diff -Nur a/gcc/acinclude.m4 b/gcc/acinclude.m4
+--- a/gcc/acinclude.m4 2008-06-02 21:37:45.000000000 +0200
++++ b/gcc/acinclude.m4 2010-01-25 09:50:28.955687088 +0100
+@@ -482,3 +482,53 @@
+ AC_DEFUN([gcc_AC_BUILD_EXEEXT], [
+ ac_executable_extensions="$build_exeext"])
+
++
++# --with-license=PATH
++AC_DEFUN([CSL_AC_LICENSE],[
++ AC_ARG_WITH(license,
++ AC_HELP_STRING([--with-license],
++ [the path to the installed license component]),
++ [case "$withval" in
++ (yes) AC_MSG_ERROR([license not specified]) ;;
++ (no) with_license= ;;
++ (*) ;;
++ esac],
++ [with_license=])
++ AC_SUBST(licensedir, $with_license)
++])
++
++# --with-csl-license-feature=FOO
++AC_DEFUN([CSL_AC_LICENSE_FEATURE],[
++ AC_ARG_WITH(csl-license-feature,
++ AC_HELP_STRING([--with-csl-license-feature=FEATURE],
++ [Use FEATURE to communicate with the license manager]),
++ [case "$withval" in
++ (yes) AC_MSG_ERROR([license feature not specified]) ;;
++ (no) CSL_LICENSE_FEATURE="" ;;
++ (*) CSL_LICENSE_FEATURE="$withval" ;;
++ esac],
++ CSL_LICENSE_FEATURE=""
++ )
++ if test x"$CSL_LICENSE_FEATURE" != x; then
++ AC_DEFINE_UNQUOTED(CSL_LICENSE_FEATURE, "$CSL_LICENSE_FEATURE",
++ [Required license feature])
++ fi
++])
++
++# --with-csl-license-version=VERSION
++AC_DEFUN([CSL_AC_LICENSE_VERSION],[
++ AC_ARG_WITH(csl-license-version,
++ AC_HELP_STRING([--with-csl-license-version=VERSION],
++ [Use VERSION to communicate with the license manager]),
++ [case "$withval" in
++ (yes) AC_MSG_ERROR([license version not specified]) ;;
++ (no) CSL_LICENSE_VERSION="" ;;
++ (*) CSL_LICENSE_VERSION="$withval" ;;
++ esac],
++ CSL_LICENSE_VERSION=""
++ )
++ if test x"$CSL_LICENSE_VERSION" != x; then
++ AC_DEFINE_UNQUOTED(CSL_LICENSE_VERSION, "$CSL_LICENSE_VERSION",
++ [Required license version])
++ fi
++])
+diff -Nur a/gcc/addresses.h b/gcc/addresses.h
+--- a/gcc/addresses.h 2007-07-26 10:37:01.000000000 +0200
++++ b/gcc/addresses.h 2010-01-25 09:50:28.955687088 +0100
+@@ -78,3 +78,42 @@
+
+ return ok_for_base_p_1 (regno, mode, outer_code, index_code);
+ }
++
++/* Wrapper function to unify target macros MODE_INDEX_REG_CLASS and
++ INDEX_REG_CLASS. Arguments as for the MODE_INDEX_REG_CLASS macro. */
++
++static inline enum reg_class
++index_reg_class (enum machine_mode mode ATTRIBUTE_UNUSED)
++{
++#ifdef MODE_INDEX_REG_CLASS
++ return MODE_INDEX_REG_CLASS (mode);
++#else
++ return INDEX_REG_CLASS;
++#endif
++}
++
++/* Wrapper function to unify target macros REGNO_MODE_OK_FOR_INDEX_P
++ and REGNO_OK_FOR_INDEX_P. Arguments as for the
++ REGNO_MODE_OK_FOR_INDEX_P macro. */
++
++static inline bool
++ok_for_index_p_1 (unsigned regno, enum machine_mode mode ATTRIBUTE_UNUSED)
++{
++#ifdef REGNO_MODE_OK_FOR_INDEX_P
++ return REGNO_MODE_OK_FOR_INDEX_P (regno, mode);
++#else
++ return REGNO_OK_FOR_INDEX_P (regno);
++#endif
++}
++
++/* Wrapper around ok_for_index_p_1, for use after register allocation is
++ complete. Arguments as for the called function. */
++
++static inline bool
++regno_ok_for_index_p (unsigned regno, enum machine_mode mode)
++{
++ if (regno >= FIRST_PSEUDO_REGISTER && reg_renumber[regno] >= 0)
++ regno = reg_renumber[regno];
++
++ return ok_for_index_p_1 (regno, mode);
++}
+diff -Nur a/gcc/calls.c b/gcc/calls.c
+--- a/gcc/calls.c 2009-02-20 12:19:34.000000000 +0100
++++ b/gcc/calls.c 2010-01-25 09:50:28.955687088 +0100
+@@ -3803,7 +3803,7 @@
+ cse'ing of library calls could delete a call and leave the pop. */
+ NO_DEFER_POP;
+ valreg = (mem_value == 0 && outmode != VOIDmode
+- ? hard_libcall_value (outmode) : NULL_RTX);
++ ? hard_libcall_value (outmode, orgfun) : NULL_RTX);
+
+ /* Stack must be properly aligned now. */
+ gcc_assert (!(stack_pointer_delta
+@@ -4048,8 +4048,17 @@
+ /* We need to make a save area. */
+ unsigned int size = arg->locate.size.constant * BITS_PER_UNIT;
+ enum machine_mode save_mode = mode_for_size (size, MODE_INT, 1);
+- rtx adr = memory_address (save_mode, XEXP (arg->stack_slot, 0));
+- rtx stack_area = gen_rtx_MEM (save_mode, adr);
++ rtx adr;
++ rtx stack_area;
++
++ /* We can only use save_mode if the arg is sufficiently
++ aligned. */
++ if (STRICT_ALIGNMENT
++ && GET_MODE_ALIGNMENT (save_mode) > arg->locate.boundary)
++ save_mode = BLKmode;
++
++ adr = memory_address (save_mode, XEXP (arg->stack_slot, 0));
++ stack_area = gen_rtx_MEM (save_mode, adr);
+
+ if (save_mode == BLKmode)
+ {
+diff -Nur a/gcc/c-common.c b/gcc/c-common.c
+--- a/gcc/c-common.c 2009-03-30 19:42:27.000000000 +0200
++++ b/gcc/c-common.c 2010-01-25 09:50:28.955687088 +0100
+@@ -33,7 +33,6 @@
+ #include "varray.h"
+ #include "expr.h"
+ #include "c-common.h"
+-#include "diagnostic.h"
+ #include "tm_p.h"
+ #include "obstack.h"
+ #include "cpplib.h"
+@@ -42,6 +41,7 @@
+ #include "tree-inline.h"
+ #include "c-tree.h"
+ #include "toplev.h"
++#include "diagnostic.h"
+ #include "tree-iterator.h"
+ #include "hashtab.h"
+ #include "tree-mudflap.h"
+@@ -497,6 +497,10 @@
+ This is a count, since unevaluated expressions can nest. */
+ int skip_evaluation;
+
++/* Whether lexing has been completed, so subsequent preprocessor
++ errors should use the compiler's input_location. */
++bool done_lexing = false;
++
+ /* Information about how a function name is generated. */
+ struct fname_var_t
+ {
+@@ -7522,6 +7526,68 @@
+ #undef catenate_messages
+ }
+
++/* Callback from cpp_error for PFILE to print diagnostics from the
++ preprocessor. The diagnostic is of type LEVEL, at location
++ LOCATION unless this is after lexing and the compiler's location
++ should be used instead, with column number possibly overridden by
++ COLUMN_OVERRIDE if not zero; MSG is the translated message and AP
++ the arguments. Returns true if a diagnostic was emitted, false
++ otherwise. */
++
++bool
++c_cpp_error (cpp_reader *pfile ATTRIBUTE_UNUSED, int level,
++ location_t location, unsigned int column_override,
++ const char *msg, va_list *ap)
++{
++ diagnostic_info diagnostic;
++ diagnostic_t dlevel;
++ int save_warn_system_headers = warn_system_headers;
++ bool ret;
++
++ switch (level)
++ {
++ case CPP_DL_WARNING_SYSHDR:
++ if (flag_no_output)
++ return false;
++ warn_system_headers = 1;
++ /* Fall through. */
++ case CPP_DL_WARNING:
++ if (flag_no_output)
++ return false;
++ dlevel = DK_WARNING;
++ break;
++ case CPP_DL_PEDWARN:
++ if (flag_no_output && !flag_pedantic_errors)
++ return false;
++ dlevel = DK_PEDWARN;
++ break;
++ case CPP_DL_ERROR:
++ dlevel = DK_ERROR;
++ break;
++ case CPP_DL_ICE:
++ dlevel = DK_ICE;
++ break;
++ case CPP_DL_NOTE:
++ dlevel = DK_NOTE;
++ break;
++ case CPP_DL_FATAL:
++ dlevel = DK_FATAL;
++ break;
++ default:
++ gcc_unreachable ();
++ }
++ if (done_lexing)
++ location = input_location;
++ diagnostic_set_info_translated (&diagnostic, msg, ap,
++ location, dlevel);
++ if (column_override)
++ diagnostic_override_column (&diagnostic, column_override);
++ ret = report_diagnostic (&diagnostic);
++ if (level == CPP_DL_WARNING_SYSHDR)
++ warn_system_headers = save_warn_system_headers;
++ return ret;
++}
++
+ /* Walk a gimplified function and warn for functions whose return value is
+ ignored and attribute((warn_unused_result)) is set. This is done before
+ inlining, so we don't have to worry about that. */
+diff -Nur a/gcc/c-common.h b/gcc/c-common.h
+--- a/gcc/c-common.h 2009-03-30 19:42:27.000000000 +0200
++++ b/gcc/c-common.h 2010-01-25 09:50:28.955687088 +0100
+@@ -658,6 +658,11 @@
+
+ extern int skip_evaluation;
+
++/* Whether lexing has been completed, so subsequent preprocessor
++ errors should use the compiler's input_location. */
++
++extern bool done_lexing;
++
+ /* C types are partitioned into three subsets: object, function, and
+ incomplete types. */
+ #define C_TYPE_OBJECT_P(type) \
+diff -Nur a/gcc/c-convert.c b/gcc/c-convert.c
+--- a/gcc/c-convert.c 2009-02-20 16:20:38.000000000 +0100
++++ b/gcc/c-convert.c 2010-01-25 09:50:28.955687088 +0100
+@@ -70,6 +70,7 @@
+ tree e = expr;
+ enum tree_code code = TREE_CODE (type);
+ const char *invalid_conv_diag;
++ tree ret;
+
+ if (type == error_mark_node
+ || expr == error_mark_node
+@@ -85,6 +86,9 @@
+
+ if (type == TREE_TYPE (expr))
+ return expr;
++ ret = targetm.convert_to_type (type, expr);
++ if (ret)
++ return ret;
+
+ if (TYPE_MAIN_VARIANT (type) == TYPE_MAIN_VARIANT (TREE_TYPE (expr)))
+ return fold_convert (type, expr);
+diff -Nur a/gcc/c-decl.c b/gcc/c-decl.c
+--- a/gcc/c-decl.c 2009-02-20 16:20:38.000000000 +0100
++++ b/gcc/c-decl.c 2010-01-25 09:50:28.955687088 +0100
+@@ -3994,6 +3994,7 @@
+ bool bitfield = width != NULL;
+ tree element_type;
+ struct c_arg_info *arg_info = 0;
++ const char *errmsg;
+
+ if (decl_context == FUNCDEF)
+ funcdef_flag = true, decl_context = NORMAL;
+@@ -4531,6 +4532,12 @@
+ error ("%qs declared as function returning an array", name);
+ type = integer_type_node;
+ }
++ errmsg = targetm.invalid_return_type (type);
++ if (errmsg)
++ {
++ error (errmsg);
++ type = integer_type_node;
++ }
+
+ /* Construct the function type and go to the next
+ inner layer of declarator. */
+@@ -5044,6 +5051,7 @@
+ {
+ tree parm, type, typelt;
+ unsigned int parmno;
++ const char *errmsg;
+
+ /* If there is a parameter of incomplete type in a definition,
+ this is an error. In a declaration this is valid, and a
+@@ -5087,6 +5095,14 @@
+ }
+ }
+
++ errmsg = targetm.invalid_parameter_type (type);
++ if (errmsg)
++ {
++ error (errmsg);
++ TREE_VALUE (typelt) = error_mark_node;
++ TREE_TYPE (parm) = error_mark_node;
++ }
++
+ if (DECL_NAME (parm) && TREE_USED (parm))
+ warn_if_shadowing (parm);
+ }
+@@ -8071,7 +8087,7 @@
+
+ /* Don't waste time on further processing if -fsyntax-only or we've
+ encountered errors. */
+- if (flag_syntax_only || errorcount || sorrycount || cpp_errors (parse_in))
++ if (flag_syntax_only || errorcount || sorrycount)
+ return;
+
+ /* Close the external scope. */
+diff -Nur a/gcc/cfgexpand.c b/gcc/cfgexpand.c
+--- a/gcc/cfgexpand.c 2009-07-11 21:06:26.000000000 +0200
++++ b/gcc/cfgexpand.c 2010-01-25 09:50:28.955687088 +0100
+@@ -488,7 +488,8 @@
+ {
+ unsigned int align;
+
+- align = LOCAL_DECL_ALIGNMENT (decl);
++ align = alignment_for_aligned_arrays (TREE_TYPE (decl),
++ LOCAL_DECL_ALIGNMENT (decl));
+
+ if (align > MAX_SUPPORTED_STACK_ALIGNMENT)
+ align = MAX_SUPPORTED_STACK_ALIGNMENT;
+diff -Nur a/gcc/cgraph.c b/gcc/cgraph.c
+--- a/gcc/cgraph.c 2008-11-16 23:31:58.000000000 +0100
++++ b/gcc/cgraph.c 2010-01-25 09:50:28.955687088 +0100
+@@ -475,9 +475,11 @@
+ if (DECL_CONTEXT (decl) && TREE_CODE (DECL_CONTEXT (decl)) == FUNCTION_DECL)
+ {
+ node->origin = cgraph_node (DECL_CONTEXT (decl));
++ node->origin->ever_was_nested = 1;
+ node->next_nested = node->origin->nested;
+ node->origin->nested = node;
+ node->master_clone = node;
++ node->ever_was_nested = 1;
+ }
+ if (assembler_name_hash)
+ {
+diff -Nur a/gcc/cgraph.h b/gcc/cgraph.h
+--- a/gcc/cgraph.h 2009-03-23 17:29:33.000000000 +0100
++++ b/gcc/cgraph.h 2010-01-25 09:50:28.955687088 +0100
+@@ -185,6 +185,8 @@
+ unsigned output : 1;
+ /* Set for aliases once they got through assemble_alias. */
+ unsigned alias : 1;
++ /* Set if the function is a nested function or has nested functions. */
++ unsigned ever_was_nested : 1;
+
+ /* In non-unit-at-a-time mode the function body of inline candidates is saved
+ into clone before compiling so the function in original form can be
+diff -Nur a/gcc/common.opt b/gcc/common.opt
+--- a/gcc/common.opt 2009-03-28 18:28:45.000000000 +0100
++++ b/gcc/common.opt 2010-01-25 09:50:28.955687088 +0100
+@@ -153,6 +153,10 @@
+ Common Var(warn_padded) Warning
+ Warn when padding is required to align structure members
+
++Wpoison-system-directories
++Common Var(flag_poison_system_directories) Init(1)
++Warn for -I and -L options using system directories if cross compiling
++
+ Wshadow
+ Common Var(warn_shadow) Warning
+ Warn when one local variable shadows another
+@@ -270,6 +274,12 @@
+ fabi-version=
+ Common Joined UInteger Var(flag_abi_version) Init(2)
+
++falign-arrays
++Target Report Var(flag_align_arrays)
++Set the minimum alignment for array variables to be the largest power
++of two less than or equal to their total storage size, or the biggest
++alignment used on the machine, whichever is smaller.
++
+ falign-functions
+ Common Report Var(align_functions,0) Optimization UInteger
+ Align the start of functions
+@@ -467,6 +477,10 @@
+ Common Report Var(flag_early_inlining) Init(1) Optimization
+ Perform early inlining
+
++feglibc=
++Common Report Joined Undocumented
++EGLIBC configuration specifier, serves multilib purposes.
++
+ feliminate-dwarf2-dups
+ Common Report Var(flag_eliminate_dwarf2_dups)
+ Perform DWARF2 duplicate elimination
+@@ -895,6 +909,10 @@
+ Common Report Var(flag_profile_values)
+ Insert code to profile values of expressions
+
++fpromote-loop-indices
++Common Report Var(flag_promote_loop_indices) Optimization
++Promote loop indices to word-sized indices when safe
++
+ frandom-seed
+ Common
+
+@@ -1227,6 +1245,15 @@
+ Common Report Var(flag_tree_pre) Optimization
+ Enable SSA-PRE optimization on trees
+
++ftree-pre-partial-partial
++Common Report Var(flag_tree_pre_partial_partial) Optimization
++In SSA-PRE optimization on trees, enable partial-partial redundancy elimination.
++
++ftree-pre-partial-partial-obliviously
++Common Report Var(flag_tree_pre_partial_partial_obliviously) Optimization
++In SSA-PRE optimization on trees, enable partial-partial redundancy
++elimination without regard for the cost of the inserted phi nodes.
++
+ ftree-reassoc
+ Common Report Var(flag_tree_reassoc) Init(1) Optimization
+ Enable reassociation on tree level
+diff -Nur a/gcc/config/arm/arm.c b/gcc/config/arm/arm.c
+--- a/gcc/config/arm/arm.c 2009-06-02 09:18:16.000000000 +0200
++++ b/gcc/config/arm/arm.c 2010-01-25 09:50:28.975687047 +0100
+@@ -43,6 +43,7 @@
+ #include "optabs.h"
+ #include "toplev.h"
+ #include "recog.h"
++#include "cgraph.h"
+ #include "ggc.h"
+ #include "except.h"
+ #include "c-pragma.h"
+@@ -53,6 +54,8 @@
+ #include "debug.h"
+ #include "langhooks.h"
+ #include "df.h"
++#include "intl.h"
++#include "params.h"
+
+ /* Forward definitions of types. */
+ typedef struct minipool_node Mnode;
+@@ -110,6 +113,7 @@
+ static unsigned long arm_isr_value (tree);
+ static unsigned long arm_compute_func_type (void);
+ static tree arm_handle_fndecl_attribute (tree *, tree, tree, int, bool *);
++static tree arm_handle_pcs_attribute (tree *, tree, tree, int, bool *);
+ static tree arm_handle_isr_attribute (tree *, tree, tree, int, bool *);
+ #if TARGET_DLLIMPORT_DECL_ATTRIBUTES
+ static tree arm_handle_notshared_attribute (tree *, tree, tree, int, bool *);
+@@ -123,6 +127,10 @@
+ static int count_insns_for_constant (HOST_WIDE_INT, int);
+ static int arm_get_strip_length (int);
+ static bool arm_function_ok_for_sibcall (tree, tree);
++static bool arm_return_in_memory (const_tree, const_tree);
++static rtx arm_function_value (const_tree, const_tree, bool);
++static rtx arm_libcall_value (enum machine_mode, rtx);
++
+ static void arm_internal_label (FILE *, const char *, unsigned long);
+ static void arm_output_mi_thunk (FILE *, tree, HOST_WIDE_INT, HOST_WIDE_INT,
+ tree);
+@@ -148,6 +156,9 @@
+ static rtx emit_set_insn (rtx, rtx);
+ static int arm_arg_partial_bytes (CUMULATIVE_ARGS *, enum machine_mode,
+ tree, bool);
++static rtx aapcs_allocate_return_reg (enum machine_mode, const_tree,
++ const_tree);
++static int aapcs_select_return_coproc (const_tree, const_tree);
+
+ #ifdef OBJECT_FORMAT_ELF
+ static void arm_elf_asm_constructor (rtx, int) ATTRIBUTE_UNUSED;
+@@ -175,6 +186,7 @@
+ static bool arm_output_ttype (rtx);
+ #endif
+ static void arm_dwarf_handle_frame_unspec (const char *, rtx, int);
++static rtx arm_dwarf_register_span(rtx);
+
+ static tree arm_cxx_guard_type (void);
+ static bool arm_cxx_guard_mask_bit (void);
+@@ -197,6 +209,15 @@
+ static int arm_issue_rate (void);
+ static void arm_output_dwarf_dtprel (FILE *, int, rtx) ATTRIBUTE_UNUSED;
+ static bool arm_allocate_stack_slots_for_args (void);
++static bool arm_warn_func_result (void);
++static int arm_multipass_dfa_lookahead (void);
++static const char *arm_invalid_parameter_type (const_tree t);
++static const char *arm_invalid_return_type (const_tree t);
++static tree arm_promoted_type (const_tree t);
++static tree arm_convert_to_type (tree type, tree expr);
++static bool arm_scalar_mode_supported_p (enum machine_mode);
++static int arm_vector_min_alignment (const_tree type);
++static bool arm_vector_always_misalign(const_tree);
+
+
+ /* Initialize the GCC target structure. */
+@@ -256,6 +277,12 @@
+ #undef TARGET_FUNCTION_OK_FOR_SIBCALL
+ #define TARGET_FUNCTION_OK_FOR_SIBCALL arm_function_ok_for_sibcall
+
++#undef TARGET_FUNCTION_VALUE
++#define TARGET_FUNCTION_VALUE arm_function_value
++
++#undef TARGET_LIBCALL_VALUE
++#define TARGET_LIBCALL_VALUE arm_libcall_value
++
+ #undef TARGET_ASM_OUTPUT_MI_THUNK
+ #define TARGET_ASM_OUTPUT_MI_THUNK arm_output_mi_thunk
+ #undef TARGET_ASM_CAN_OUTPUT_MI_THUNK
+@@ -299,6 +326,9 @@
+ #undef TARGET_ALLOCATE_STACK_SLOTS_FOR_ARGS
+ #define TARGET_ALLOCATE_STACK_SLOTS_FOR_ARGS arm_allocate_stack_slots_for_args
+
++#undef TARGET_WARN_FUNC_RESULT
++#define TARGET_WARN_FUNC_RESULT arm_warn_func_result
++
+ #undef TARGET_DEFAULT_SHORT_ENUMS
+ #define TARGET_DEFAULT_SHORT_ENUMS arm_default_short_enums
+
+@@ -353,6 +383,9 @@
+ #undef TARGET_ASM_TTYPE
+ #define TARGET_ASM_TTYPE arm_output_ttype
+
++#undef TARGET_CXX_TTYPE_REF_ENCODE
++#define TARGET_CXX_TTYPE_REF_ENCODE hook_cxx_ttype_ref_in_bit0
++
+ #undef TARGET_ARM_EABI_UNWINDER
+ #define TARGET_ARM_EABI_UNWINDER true
+ #endif /* TARGET_UNWIND_INFO */
+@@ -360,6 +393,9 @@
+ #undef TARGET_DWARF_HANDLE_FRAME_UNSPEC
+ #define TARGET_DWARF_HANDLE_FRAME_UNSPEC arm_dwarf_handle_frame_unspec
+
++#undef TARGET_DWARF_REGISTER_SPAN
++#define TARGET_DWARF_REGISTER_SPAN arm_dwarf_register_span
++
+ #undef TARGET_CANNOT_COPY_INSN_P
+ #define TARGET_CANNOT_COPY_INSN_P arm_cannot_copy_insn_p
+
+@@ -398,6 +434,30 @@
+ #define TARGET_ASM_OUTPUT_DWARF_DTPREL arm_output_dwarf_dtprel
+ #endif
+
++#undef TARGET_SCHED_FIRST_CYCLE_MULTIPASS_DFA_LOOKAHEAD
++#define TARGET_SCHED_FIRST_CYCLE_MULTIPASS_DFA_LOOKAHEAD arm_multipass_dfa_lookahead
++
++#undef TARGET_INVALID_PARAMETER_TYPE
++#define TARGET_INVALID_PARAMETER_TYPE arm_invalid_parameter_type
++
++#undef TARGET_INVALID_RETURN_TYPE
++#define TARGET_INVALID_RETURN_TYPE arm_invalid_return_type
++
++#undef TARGET_PROMOTED_TYPE
++#define TARGET_PROMOTED_TYPE arm_promoted_type
++
++#undef TARGET_CONVERT_TO_TYPE
++#define TARGET_CONVERT_TO_TYPE arm_convert_to_type
++
++#undef TARGET_SCALAR_MODE_SUPPORTED_P
++#define TARGET_SCALAR_MODE_SUPPORTED_P arm_scalar_mode_supported_p
++
++#undef TARGET_VECTOR_MIN_ALIGNMENT
++#define TARGET_VECTOR_MIN_ALIGNMENT arm_vector_min_alignment
++
++#undef TARGET_VECTOR_ALWAYS_MISALIGN
++#define TARGET_VECTOR_ALWAYS_MISALIGN arm_vector_always_misalign
++
+ struct gcc_target targetm = TARGET_INITIALIZER;
+
+ /* Obstack for minipool constant handling. */
+@@ -423,18 +483,18 @@
+ /* The default processor used if not overridden by commandline. */
+ static enum processor_type arm_default_cpu = arm_none;
+
+-/* Which floating point model to use. */
+-enum arm_fp_model arm_fp_model;
+-
+-/* Which floating point hardware is available. */
+-enum fputype arm_fpu_arch;
+-
+ /* Which floating point hardware to schedule for. */
+-enum fputype arm_fpu_tune;
++int arm_fpu_attr;
++
++/* Which floating popint hardware to use. */
++const struct arm_fpu_desc *arm_fpu_desc;
+
+ /* Whether to use floating point hardware. */
+ enum float_abi_type arm_float_abi;
+
++/* Which __fp16 format to use. */
++enum arm_fp16_format_type arm_fp16_format;
++
+ /* Which ABI to use. */
+ enum arm_abi_type arm_abi;
+
+@@ -473,9 +533,19 @@
+ #define FL_DIV (1 << 18) /* Hardware divide. */
+ #define FL_VFPV3 (1 << 19) /* Vector Floating Point V3. */
+ #define FL_NEON (1 << 20) /* Neon instructions. */
++#define FL_MARVELL_F (1 << 21) /* Marvell Feroceon. */
++#define FL_ARCH7EM (1 << 22) /* Instructions present in ARMv7E-M. */
+
+ #define FL_IWMMXT (1 << 29) /* XScale v2 or "Intel Wireless MMX technology". */
+
++/* Some flags are ignored when comparing -mcpu and -march:
++ FL_MARVELL_F so that -mcpu=marvell-f -march=v5te works.
++ FL_LDSCHED and FL_WBUF only effect tuning,
++ FL_CO_PROC, FL_VFPV2, FL_VFPV3 and FL_NEON because FP
++ coprocessors are handled separately. */
++#define FL_COMPAT (FL_MARVELL_F | FL_LDSCHED | FL_WBUF | FL_CO_PROC | \
++ FL_VFPV2 | FL_VFPV3 | FL_NEON)
++
+ #define FL_FOR_ARCH2 FL_NOTM
+ #define FL_FOR_ARCH3 (FL_FOR_ARCH2 | FL_MODE32)
+ #define FL_FOR_ARCH3M (FL_FOR_ARCH3 | FL_ARCH3M)
+@@ -497,6 +567,7 @@
+ #define FL_FOR_ARCH7A (FL_FOR_ARCH7 | FL_NOTM)
+ #define FL_FOR_ARCH7R (FL_FOR_ARCH7A | FL_DIV)
+ #define FL_FOR_ARCH7M (FL_FOR_ARCH7 | FL_DIV)
++#define FL_FOR_ARCH7EM (FL_FOR_ARCH7M | FL_ARCH7EM)
+
+ /* The bits in this mask specify which
+ instructions we are allowed to generate. */
+@@ -533,6 +604,9 @@
+ /* Nonzero if instructions not present in the 'M' profile can be used. */
+ int arm_arch_notm = 0;
+
++/* Nonzero if instructions present in ARMv7E-M can be used. */
++int arm_arch7em = 0;
++
+ /* Nonzero if this chip can benefit from load scheduling. */
+ int arm_ld_sched = 0;
+
+@@ -551,6 +625,9 @@
+ /* Nonzero if tuning for XScale */
+ int arm_tune_xscale = 0;
+
++/* Nonzero if tuning for Marvell Feroceon. */
++int arm_tune_marvell_f = 0;
++
+ /* Nonzero if we want to tune for stores that access the write-buffer.
+ This typically means an ARM6 or ARM7 with MMU or MPU. */
+ int arm_tune_wbuf = 0;
+@@ -561,6 +638,9 @@
+ /* Nonzero if generating Thumb instructions. */
+ int thumb_code = 0;
+
++/* Nonzero if generating code for Janus2. */
++int janus2_code = 0;
++
+ /* Nonzero if we should define __THUMB_INTERWORK__ in the
+ preprocessor.
+ XXX This is a bit of a hack, it's intended to help work around
+@@ -593,6 +673,8 @@
+ /* The maximum number of insns to be used when loading a constant. */
+ static int arm_constant_limit = 3;
+
++static enum arm_pcs arm_pcs_default;
++
+ /* For an explanation of these variables, see final_prescan_insn below. */
+ int arm_ccfsm_state;
+ /* arm_current_cc is also used for Thumb-2 cond_exec blocks. */
+@@ -673,9 +755,11 @@
+ {"armv7-a", cortexa8, "7A", FL_CO_PROC | FL_FOR_ARCH7A, NULL},
+ {"armv7-r", cortexr4, "7R", FL_CO_PROC | FL_FOR_ARCH7R, NULL},
+ {"armv7-m", cortexm3, "7M", FL_CO_PROC | FL_FOR_ARCH7M, NULL},
++ {"armv7e-m", cortexm3, "7EM", FL_CO_PROC | FL_FOR_ARCH7EM, NULL},
+ {"ep9312", ep9312, "4T", FL_LDSCHED | FL_CIRRUS | FL_FOR_ARCH4, NULL},
+ {"iwmmxt", iwmmxt, "5TE", FL_LDSCHED | FL_STRONG | FL_FOR_ARCH5TE | FL_XSCALE | FL_IWMMXT , NULL},
+ {"iwmmxt2", iwmmxt2, "5TE", FL_LDSCHED | FL_STRONG | FL_FOR_ARCH5TE | FL_XSCALE | FL_IWMMXT , NULL},
++ {"marvell-f", marvell_f, "5TE", FL_CO_PROC | FL_FOR_ARCH5TE | FL_MARVELL_F, NULL},
+ {NULL, arm_none, NULL, 0 , NULL}
+ };
+
+@@ -705,49 +789,34 @@
+
+ /* The name of the preprocessor macro to define for this architecture. */
+
+-char arm_arch_name[] = "__ARM_ARCH_0UNK__";
+-
+-struct fpu_desc
+-{
+- const char * name;
+- enum fputype fpu;
+-};
+-
++#define ARM_ARCH_NAME_SIZE 25
++char arm_arch_name[ARM_ARCH_NAME_SIZE] = "__ARM_ARCH_0UNK__";
+
+ /* Available values for -mfpu=. */
+
+-static const struct fpu_desc all_fpus[] =
++static const struct arm_fpu_desc all_fpus[] =
+ {
+- {"fpa", FPUTYPE_FPA},
+- {"fpe2", FPUTYPE_FPA_EMU2},
+- {"fpe3", FPUTYPE_FPA_EMU2},
+- {"maverick", FPUTYPE_MAVERICK},
+- {"vfp", FPUTYPE_VFP},
+- {"vfp3", FPUTYPE_VFP3},
+- {"vfpv3", FPUTYPE_VFP3},
+- {"vfpv3-d16", FPUTYPE_VFP3D16},
+- {"neon", FPUTYPE_NEON}
++ {"fpa", ARM_FP_MODEL_FPA, 0, 0, false, false},
++ {"fpe2", ARM_FP_MODEL_FPA, 2, 0, false, false},
++ {"fpe3", ARM_FP_MODEL_FPA, 3, 0, false, false},
++ {"maverick", ARM_FP_MODEL_MAVERICK, 0, 0, false, false},
++ {"vfp", ARM_FP_MODEL_VFP, 2, VFP_REG_D16, false, false},
++ {"vfpv3", ARM_FP_MODEL_VFP, 3, VFP_REG_D32, false, false},
++ {"vfpv3-fp16", ARM_FP_MODEL_VFP, 3, VFP_REG_D32, false, true },
++ {"vfpv3-d16", ARM_FP_MODEL_VFP, 3, VFP_REG_D16, false, false},
++ {"vfpv3xd", ARM_FP_MODEL_VFP, 3, VFP_REG_SINGLE, false, false},
++ {"vfpv3xd-fp16", ARM_FP_MODEL_VFP, 3, VFP_REG_SINGLE, false, true },
++ {"vfpv3-d16-fp16", ARM_FP_MODEL_VFP, 3, VFP_REG_D16, false, true },
++ {"neon", ARM_FP_MODEL_VFP, 3, VFP_REG_D32, true , false},
++ {"neon-fp16", ARM_FP_MODEL_VFP, 3, VFP_REG_D32, true , true },
++ {"vfpv4", ARM_FP_MODEL_VFP, 4, VFP_REG_D32, false, true },
++ {"vfpv4-d16", ARM_FP_MODEL_VFP, 4, VFP_REG_D16, false, true },
++ {"fpv4-sp-d16", ARM_FP_MODEL_VFP, 4, VFP_REG_SINGLE, false, true },
++ {"neon-vfpv4", ARM_FP_MODEL_VFP, 4, VFP_REG_D32, true , true },
++ /* Compatibility aliases. */
++ {"vfp3", ARM_FP_MODEL_VFP, 3, VFP_REG_D32, false, false},
+ };
+
+-
+-/* Floating point models used by the different hardware.
+- See fputype in arm.h. */
+-
+-static const enum fputype fp_model_for_fpu[] =
+-{
+- /* No FP hardware. */
+- ARM_FP_MODEL_UNKNOWN, /* FPUTYPE_NONE */
+- ARM_FP_MODEL_FPA, /* FPUTYPE_FPA */
+- ARM_FP_MODEL_FPA, /* FPUTYPE_FPA_EMU2 */
+- ARM_FP_MODEL_FPA, /* FPUTYPE_FPA_EMU3 */
+- ARM_FP_MODEL_MAVERICK, /* FPUTYPE_MAVERICK */
+- ARM_FP_MODEL_VFP, /* FPUTYPE_VFP */
+- ARM_FP_MODEL_VFP, /* FPUTYPE_VFP3D16 */
+- ARM_FP_MODEL_VFP, /* FPUTYPE_VFP3 */
+- ARM_FP_MODEL_VFP /* FPUTYPE_NEON */
+-};
+-
+-
+ struct float_abi
+ {
+ const char * name;
+@@ -765,6 +834,23 @@
+ };
+
+
++struct fp16_format
++{
++ const char *name;
++ enum arm_fp16_format_type fp16_format_type;
++};
++
++
++/* Available values for -mfp16-format=. */
++
++static const struct fp16_format all_fp16_formats[] =
++{
++ {"none", ARM_FP16_FORMAT_NONE},
++ {"ieee", ARM_FP16_FORMAT_IEEE},
++ {"alternative", ARM_FP16_FORMAT_ALTERNATIVE}
++};
++
++
+ struct abi_name
+ {
+ const char *name;
+@@ -922,6 +1008,44 @@
+ set_optab_libfunc (umod_optab, DImode, NULL);
+ set_optab_libfunc (smod_optab, SImode, NULL);
+ set_optab_libfunc (umod_optab, SImode, NULL);
++
++ /* Half-precision float operations. The compiler handles all operations
++ with NULL libfuncs by converting the SFmode. */
++ switch (arm_fp16_format)
++ {
++ case ARM_FP16_FORMAT_IEEE:
++ case ARM_FP16_FORMAT_ALTERNATIVE:
++
++ /* Conversions. */
++ set_conv_libfunc (trunc_optab, HFmode, SFmode,
++ (arm_fp16_format == ARM_FP16_FORMAT_IEEE
++ ? "__gnu_f2h_ieee"
++ : "__gnu_f2h_alternative"));
++ set_conv_libfunc (sext_optab, SFmode, HFmode,
++ (arm_fp16_format == ARM_FP16_FORMAT_IEEE
++ ? "__gnu_h2f_ieee"
++ : "__gnu_h2f_alternative"));
++
++ /* Arithmetic. */
++ set_optab_libfunc (add_optab, HFmode, NULL);
++ set_optab_libfunc (sdiv_optab, HFmode, NULL);
++ set_optab_libfunc (smul_optab, HFmode, NULL);
++ set_optab_libfunc (neg_optab, HFmode, NULL);
++ set_optab_libfunc (sub_optab, HFmode, NULL);
++
++ /* Comparisons. */
++ set_optab_libfunc (eq_optab, HFmode, NULL);
++ set_optab_libfunc (ne_optab, HFmode, NULL);
++ set_optab_libfunc (lt_optab, HFmode, NULL);
++ set_optab_libfunc (le_optab, HFmode, NULL);
++ set_optab_libfunc (ge_optab, HFmode, NULL);
++ set_optab_libfunc (gt_optab, HFmode, NULL);
++ set_optab_libfunc (unord_optab, HFmode, NULL);
++ break;
++
++ default:
++ break;
++ }
+ }
+
+ /* On AAPCS systems, this is the "struct __va_list". */
+@@ -1135,6 +1259,7 @@
+ arm_override_options (void)
+ {
+ unsigned i;
++ int len;
+ enum processor_type target_arch_cpu = arm_none;
+ enum processor_type selected_cpu = arm_none;
+
+@@ -1152,7 +1277,11 @@
+ {
+ /* Set the architecture define. */
+ if (i != ARM_OPT_SET_TUNE)
+- sprintf (arm_arch_name, "__ARM_ARCH_%s__", sel->arch);
++ {
++ len = snprintf (arm_arch_name, ARM_ARCH_NAME_SIZE,
++ "__ARM_ARCH_%s__", sel->arch);
++ gcc_assert (len < ARM_ARCH_NAME_SIZE);
++ }
+
+ /* Determine the processor core for which we should
+ tune code-generation. */
+@@ -1178,8 +1307,8 @@
+ make sure that they are compatible. We only generate
+ a warning though, and we prefer the CPU over the
+ architecture. */
+- if (insn_flags != 0 && (insn_flags ^ sel->flags))
+- warning (0, "switch -mcpu=%s conflicts with -march= switch",
++ if (insn_flags != 0 && ((insn_flags ^ sel->flags) & ~FL_COMPAT))
++ warning (0, "switch -mcpu=%s conflicts with -march= switch, assuming CPU feature set",
+ ptr->string);
+
+ insn_flags = sel->flags;
+@@ -1279,7 +1408,11 @@
+
+ insn_flags = sel->flags;
+ }
+- sprintf (arm_arch_name, "__ARM_ARCH_%s__", sel->arch);
++
++ len = snprintf (arm_arch_name, ARM_ARCH_NAME_SIZE,
++ "__ARM_ARCH_%s__", sel->arch);
++ gcc_assert (len < ARM_ARCH_NAME_SIZE);
++
+ arm_default_cpu = (enum processor_type) (sel - all_cores);
+ if (arm_tune == arm_none)
+ arm_tune = arm_default_cpu;
+@@ -1289,8 +1422,35 @@
+ chosen. */
+ gcc_assert (arm_tune != arm_none);
+
++ if (arm_tune == cortexa8 && optimize >= 3)
++ {
++ /* These alignments were experimentally determined to improve SPECint
++ performance on SPECCPU 2000. */
++ if (align_functions <= 0)
++ align_functions = 16;
++ if (align_jumps <= 0)
++ align_jumps = 16;
++ }
++
+ tune_flags = all_cores[(int)arm_tune].flags;
+
++ if (target_fp16_format_name)
++ {
++ for (i = 0; i < ARRAY_SIZE (all_fp16_formats); i++)
++ {
++ if (streq (all_fp16_formats[i].name, target_fp16_format_name))
++ {
++ arm_fp16_format = all_fp16_formats[i].fp16_format_type;
++ break;
++ }
++ }
++ if (i == ARRAY_SIZE (all_fp16_formats))
++ error ("invalid __fp16 format option: -mfp16-format=%s",
++ target_fp16_format_name);
++ }
++ else
++ arm_fp16_format = ARM_FP16_FORMAT_NONE;
++
+ if (target_abi_name)
+ {
+ for (i = 0; i < ARRAY_SIZE (arm_all_abis); i++)
+@@ -1383,6 +1543,7 @@
+ arm_arch6 = (insn_flags & FL_ARCH6) != 0;
+ arm_arch6k = (insn_flags & FL_ARCH6K) != 0;
+ arm_arch_notm = (insn_flags & FL_NOTM) != 0;
++ arm_arch7em = (insn_flags & FL_ARCH7EM) != 0;
+ arm_arch_thumb2 = (insn_flags & FL_THUMB2) != 0;
+ arm_arch_xscale = (insn_flags & FL_XSCALE) != 0;
+ arm_arch_cirrus = (insn_flags & FL_CIRRUS) != 0;
+@@ -1390,12 +1551,25 @@
+ arm_ld_sched = (tune_flags & FL_LDSCHED) != 0;
+ arm_tune_strongarm = (tune_flags & FL_STRONG) != 0;
+ thumb_code = (TARGET_ARM == 0);
++ janus2_code = (TARGET_FIX_JANUS != 0);
++ if (janus2_code && TARGET_THUMB2)
++ error ("janus2 fix is not applicable when targeting a thumb2 core");
+ arm_tune_wbuf = (tune_flags & FL_WBUF) != 0;
+ arm_tune_xscale = (tune_flags & FL_XSCALE) != 0;
++ arm_tune_marvell_f = (tune_flags & FL_MARVELL_F) != 0;
+ arm_arch_iwmmxt = (insn_flags & FL_IWMMXT) != 0;
+- arm_arch_hwdiv = (insn_flags & FL_DIV) != 0;
+ arm_tune_cortex_a9 = (arm_tune == cortexa9) != 0;
+
++ /* Hardware integer division is supported by some variants of the ARM
++ architecture in Thumb-2 mode. In addition some (but not all) Marvell
++ CPUs support their own hardware integer division instructions.
++ The assembler will pick the correct encoding. */
++ if (TARGET_MARVELL_DIV && (insn_flags & FL_MARVELL_F) == 0)
++ error ("-mmarvell-div is only supported when targeting a Marvell core");
++
++ arm_arch_hwdiv = (TARGET_ARM && TARGET_MARVELL_DIV)
++ || (TARGET_THUMB2 && (insn_flags & FL_DIV) != 0);
++
+ /* If we are not using the default (ARM mode) section anchor offset
+ ranges, then set the correct ranges now. */
+ if (TARGET_THUMB1)
+@@ -1434,7 +1608,6 @@
+ if (TARGET_IWMMXT_ABI && !TARGET_IWMMXT)
+ error ("iwmmxt abi requires an iwmmxt capable cpu");
+
+- arm_fp_model = ARM_FP_MODEL_UNKNOWN;
+ if (target_fpu_name == NULL && target_fpe_name != NULL)
+ {
+ if (streq (target_fpe_name, "2"))
+@@ -1445,46 +1618,52 @@
+ error ("invalid floating point emulation option: -mfpe=%s",
+ target_fpe_name);
+ }
+- if (target_fpu_name != NULL)
+- {
+- /* The user specified a FPU. */
+- for (i = 0; i < ARRAY_SIZE (all_fpus); i++)
+- {
+- if (streq (all_fpus[i].name, target_fpu_name))
+- {
+- arm_fpu_arch = all_fpus[i].fpu;
+- arm_fpu_tune = arm_fpu_arch;
+- arm_fp_model = fp_model_for_fpu[arm_fpu_arch];
+- break;
+- }
+- }
+- if (arm_fp_model == ARM_FP_MODEL_UNKNOWN)
+- error ("invalid floating point option: -mfpu=%s", target_fpu_name);
+- }
+- else
++
++ if (target_fpu_name == NULL)
+ {
+ #ifdef FPUTYPE_DEFAULT
+- /* Use the default if it is specified for this platform. */
+- arm_fpu_arch = FPUTYPE_DEFAULT;
+- arm_fpu_tune = FPUTYPE_DEFAULT;
++ target_fpu_name = FPUTYPE_DEFAULT;
+ #else
+- /* Pick one based on CPU type. */
+- /* ??? Some targets assume FPA is the default.
+- if ((insn_flags & FL_VFP) != 0)
+- arm_fpu_arch = FPUTYPE_VFP;
+- else
+- */
+ if (arm_arch_cirrus)
+- arm_fpu_arch = FPUTYPE_MAVERICK;
++ target_fpu_name = "maverick";
+ else
+- arm_fpu_arch = FPUTYPE_FPA_EMU2;
++ target_fpu_name = "fpe2";
+ #endif
+- if (tune_flags & FL_CO_PROC && arm_fpu_arch == FPUTYPE_FPA_EMU2)
+- arm_fpu_tune = FPUTYPE_FPA;
++ }
++
++ arm_fpu_desc = NULL;
++ for (i = 0; i < ARRAY_SIZE (all_fpus); i++)
++ {
++ if (streq (all_fpus[i].name, target_fpu_name))
++ {
++ arm_fpu_desc = &all_fpus[i];
++ break;
++ }
++ }
++ if (!arm_fpu_desc)
++ error ("invalid floating point option: -mfpu=%s", target_fpu_name);
++
++ switch (arm_fpu_desc->model)
++ {
++ case ARM_FP_MODEL_FPA:
++ if (arm_fpu_desc->rev == 2)
++ arm_fpu_attr = FPU_FPE2;
++ else if (arm_fpu_desc->rev == 3)
++ arm_fpu_attr = FPU_FPE3;
+ else
+- arm_fpu_tune = arm_fpu_arch;
+- arm_fp_model = fp_model_for_fpu[arm_fpu_arch];
+- gcc_assert (arm_fp_model != ARM_FP_MODEL_UNKNOWN);
++ arm_fpu_attr = FPU_FPA;
++ break;
++
++ case ARM_FP_MODEL_MAVERICK:
++ arm_fpu_attr = FPU_MAVERICK;
++ break;
++
++ case ARM_FP_MODEL_VFP:
++ arm_fpu_attr = FPU_VFP;
++ break;
++
++ default:
++ gcc_unreachable();
+ }
+
+ if (target_float_abi_name != NULL)
+@@ -1505,9 +1684,6 @@
+ else
+ arm_float_abi = TARGET_DEFAULT_FLOAT_ABI;
+
+- if (arm_float_abi == ARM_FLOAT_ABI_HARD && TARGET_VFP)
+- sorry ("-mfloat-abi=hard and VFP");
+-
+ /* FPA and iWMMXt are incompatible because the insn encodings overlap.
+ VFP and iWMMXt can theoretically coexist, but it's unlikely such silicon
+ will ever exist. GCC makes no attempt to support this combination. */
+@@ -1518,15 +1694,40 @@
+ if (TARGET_THUMB2 && TARGET_IWMMXT)
+ sorry ("Thumb-2 iWMMXt");
+
++ /* __fp16 support currently assumes the core has ldrh. */
++ if (!arm_arch4 && arm_fp16_format != ARM_FP16_FORMAT_NONE)
++ sorry ("__fp16 and no ldrh");
++
+ /* If soft-float is specified then don't use FPU. */
+ if (TARGET_SOFT_FLOAT)
+- arm_fpu_arch = FPUTYPE_NONE;
++ arm_fpu_attr = FPU_NONE;
++
++ if (TARGET_AAPCS_BASED)
++ {
++ if (arm_abi == ARM_ABI_IWMMXT)
++ arm_pcs_default = ARM_PCS_AAPCS_IWMMXT;
++ else if (arm_float_abi == ARM_FLOAT_ABI_HARD
++ && TARGET_HARD_FLOAT
++ && TARGET_VFP)
++ arm_pcs_default = ARM_PCS_AAPCS_VFP;
++ else
++ arm_pcs_default = ARM_PCS_AAPCS;
++ }
++ else
++ {
++ if (arm_float_abi == ARM_FLOAT_ABI_HARD && TARGET_VFP)
++ sorry ("-mfloat-abi=hard and VFP");
++
++ if (arm_abi == ARM_ABI_APCS)
++ arm_pcs_default = ARM_PCS_APCS;
++ else
++ arm_pcs_default = ARM_PCS_ATPCS;
++ }
+
+ /* For arm2/3 there is no need to do any scheduling if there is only
+ a floating point emulator, or we are doing software floating-point. */
+ if ((TARGET_SOFT_FLOAT
+- || arm_fpu_tune == FPUTYPE_FPA_EMU2
+- || arm_fpu_tune == FPUTYPE_FPA_EMU3)
++ || (TARGET_FPA && arm_fpu_desc->rev))
+ && (tune_flags & FL_MODE32) == 0)
+ flag_schedule_insns = flag_schedule_insns_after_reload = 0;
+
+@@ -1616,8 +1817,7 @@
+ fix_cm3_ldrd = 0;
+ }
+
+- /* ??? We might want scheduling for thumb2. */
+- if (TARGET_THUMB && flag_schedule_insns)
++ if (TARGET_THUMB1 && flag_schedule_insns)
+ {
+ /* Don't warn since it's on by default in -O2. */
+ flag_schedule_insns = 0;
+@@ -1653,6 +1853,36 @@
+
+ /* Register global variables with the garbage collector. */
+ arm_add_gc_roots ();
++
++ if (low_irq_latency && TARGET_THUMB)
++ {
++ warning (0,
++ "-low-irq-latency has no effect when compiling for the Thumb");
++ low_irq_latency = 0;
++ }
++
++ /* CSL LOCAL */
++ /* Loop unrolling can be a substantial win. At -O2, limit to 2x
++ unrolling by default to prevent excessive code growth; at -O3,
++ limit to 4x unrolling by default. We know we are not optimizing
++ for size if this is set (see arm_optimization_options). */
++ if (flag_unroll_loops == 2)
++ {
++ if (optimize == 2)
++ {
++ flag_unroll_loops = 1;
++ if (!PARAM_SET_P (PARAM_MAX_UNROLL_TIMES))
++ set_param_value ("max-unroll-times", 2);
++ }
++ else if (optimize > 2)
++ {
++ flag_unroll_loops = 1;
++ if (!PARAM_SET_P (PARAM_MAX_UNROLL_TIMES))
++ set_param_value ("max-unroll-times", 4);
++ }
++ else
++ flag_unroll_loops = 0;
++ }
+ }
+
+ static void
+@@ -1782,6 +2012,14 @@
+ return !IS_NAKED (arm_current_func_type ());
+ }
+
++static bool
++arm_warn_func_result (void)
++{
++ /* Naked functions are implemented entirely in assembly, including the
++ return sequence, so suppress warnings about this. */
++ return !IS_NAKED (arm_current_func_type ());
++}
++
+
+ /* Return 1 if it is possible to return using a single instruction.
+ If SIBLING is non-null, this is a test for a return before a sibling
+@@ -2873,14 +3111,19 @@
+
+ /* Define how to find the value returned by a function. */
+
+-rtx
+-arm_function_value(const_tree type, const_tree func ATTRIBUTE_UNUSED)
++static rtx
++arm_function_value(const_tree type, const_tree func,
++ bool outgoing ATTRIBUTE_UNUSED)
+ {
+ enum machine_mode mode;
+ int unsignedp ATTRIBUTE_UNUSED;
+ rtx r ATTRIBUTE_UNUSED;
+
+ mode = TYPE_MODE (type);
++
++ if (TARGET_AAPCS_BASED)
++ return aapcs_allocate_return_reg (mode, type, func);
++
+ /* Promote integer types. */
+ if (INTEGRAL_TYPE_P (type))
+ PROMOTE_FUNCTION_MODE (mode, unsignedp, type);
+@@ -2897,7 +3140,36 @@
+ }
+ }
+
+- return LIBCALL_VALUE(mode);
++ return LIBCALL_VALUE (mode);
++}
++
++rtx
++arm_libcall_value (enum machine_mode mode, rtx libcall)
++{
++ if (TARGET_AAPCS_BASED && arm_pcs_default != ARM_PCS_AAPCS
++ && GET_MODE_CLASS (mode) == MODE_FLOAT)
++ {
++ /* The following libcalls return their result in integer registers,
++ even though they return a floating point value. */
++ if (rtx_equal_p (libcall,
++ convert_optab_libfunc (sfloat_optab, mode, SImode))
++ || rtx_equal_p (libcall,
++ convert_optab_libfunc (ufloat_optab, mode, SImode))
++ || rtx_equal_p (libcall,
++ convert_optab_libfunc (sfloat_optab, mode, DImode))
++ || rtx_equal_p (libcall,
++ convert_optab_libfunc (ufloat_optab, mode, DImode))
++ || rtx_equal_p (libcall,
++ convert_optab_libfunc (trunc_optab, HFmode, SFmode))
++ || rtx_equal_p (libcall,
++ convert_optab_libfunc (sext_optab, SFmode, HFmode)))
++ return gen_rtx_REG (mode, ARG_REGISTER(1));
++
++ /* XXX There are other libcalls that return in integer registers,
++ but I think they are all handled by hard insns. */
++ }
++
++ return LIBCALL_VALUE (mode);
+ }
+
+ /* Determine the amount of memory needed to store the possible return
+@@ -2907,10 +3179,12 @@
+ {
+ int size = 16;
+
+- if (TARGET_ARM)
++ if (TARGET_32BIT)
+ {
+ if (TARGET_HARD_FLOAT_ABI)
+ {
++ if (TARGET_VFP)
++ size += 32;
+ if (TARGET_FPA)
+ size += 12;
+ if (TARGET_MAVERICK)
+@@ -2923,27 +3197,56 @@
+ return size;
+ }
+
+-/* Decide whether a type should be returned in memory (true)
+- or in a register (false). This is called as the target hook
+- TARGET_RETURN_IN_MEMORY. */
++/* Decide whether TYPE should be returned in memory (true)
++ or in a register (false). FNTYPE is the type of the function making
++ the call. */
+ static bool
+-arm_return_in_memory (const_tree type, const_tree fntype ATTRIBUTE_UNUSED)
++arm_return_in_memory (const_tree type, const_tree fntype)
+ {
+ HOST_WIDE_INT size;
+
+- size = int_size_in_bytes (type);
++ size = int_size_in_bytes (type); /* Negative if not fixed size. */
++
++ if (TARGET_AAPCS_BASED)
++ {
++ /* Simple, non-aggregate types (ie not including vectors and
++ complex) are always returned in a register (or registers).
++ We don't care about which register here, so we can short-cut
++ some of the detail. */
++ if (!AGGREGATE_TYPE_P (type)
++ && TREE_CODE (type) != VECTOR_TYPE
++ && TREE_CODE (type) != COMPLEX_TYPE)
++ return false;
++
++ /* Any return value that is no larger than one word can be
++ returned in r0. */
++ if (((unsigned HOST_WIDE_INT) size) <= UNITS_PER_WORD)
++ return false;
++
++ /* Check any available co-processors to see if they accept the
++ type as a register candidate (VFP, for example, can return
++ some aggregates in consecutive registers). These aren't
++ available if the call is variadic. */
++ if (aapcs_select_return_coproc (type, fntype) >= 0)
++ return false;
++
++ /* Vector values should be returned using ARM registers, not
++ memory (unless they're over 16 bytes, which will break since
++ we only have four call-clobbered registers to play with). */
++ if (TREE_CODE (type) == VECTOR_TYPE)
++ return (size < 0 || size > (4 * UNITS_PER_WORD));
++
++ /* The rest go in memory. */
++ return true;
++ }
+
+- /* Vector values should be returned using ARM registers, not memory (unless
+- they're over 16 bytes, which will break since we only have four
+- call-clobbered registers to play with). */
+ if (TREE_CODE (type) == VECTOR_TYPE)
+ return (size < 0 || size > (4 * UNITS_PER_WORD));
+
+ if (!AGGREGATE_TYPE_P (type) &&
+- !(TARGET_AAPCS_BASED && TREE_CODE (type) == COMPLEX_TYPE))
+- /* All simple types are returned in registers.
+- For AAPCS, complex types are treated the same as aggregates. */
+- return 0;
++ (TREE_CODE (type) != VECTOR_TYPE))
++ /* All simple types are returned in registers. */
++ return false;
+
+ if (arm_abi != ARM_ABI_APCS)
+ {
+@@ -2960,7 +3263,7 @@
+ the aggregate is either huge or of variable size, and in either case
+ we will want to return it via memory and not in a register. */
+ if (size < 0 || size > UNITS_PER_WORD)
+- return 1;
++ return true;
+
+ if (TREE_CODE (type) == RECORD_TYPE)
+ {
+@@ -2980,18 +3283,18 @@
+ continue;
+
+ if (field == NULL)
+- return 0; /* An empty structure. Allowed by an extension to ANSI C. */
++ return false; /* An empty structure. Allowed by an extension to ANSI C. */
+
+ /* Check that the first field is valid for returning in a register. */
+
+ /* ... Floats are not allowed */
+ if (FLOAT_TYPE_P (TREE_TYPE (field)))
+- return 1;
++ return true;
+
+ /* ... Aggregates that are not themselves valid for returning in
+ a register are not allowed. */
+ if (arm_return_in_memory (TREE_TYPE (field), NULL_TREE))
+- return 1;
++ return true;
+
+ /* Now check the remaining fields, if any. Only bitfields are allowed,
+ since they are not addressable. */
+@@ -3003,10 +3306,10 @@
+ continue;
+
+ if (!DECL_BIT_FIELD_TYPE (field))
+- return 1;
++ return true;
+ }
+
+- return 0;
++ return false;
+ }
+
+ if (TREE_CODE (type) == UNION_TYPE)
+@@ -3023,18 +3326,18 @@
+ continue;
+
+ if (FLOAT_TYPE_P (TREE_TYPE (field)))
+- return 1;
++ return true;
+
+ if (arm_return_in_memory (TREE_TYPE (field), NULL_TREE))
+- return 1;
++ return true;
+ }
+
+- return 0;
++ return false;
+ }
+ #endif /* not ARM_WINCE */
+
+ /* Return all other types in memory. */
+- return 1;
++ return true;
+ }
+
+ /* Indicate whether or not words of a double are in big-endian order. */
+@@ -3059,14 +3362,780 @@
+ return 1;
+ }
+
++const struct pcs_attribute_arg
++{
++ const char *arg;
++ enum arm_pcs value;
++} pcs_attribute_args[] =
++ {
++ {"aapcs", ARM_PCS_AAPCS},
++ {"aapcs-vfp", ARM_PCS_AAPCS_VFP},
++ {"aapcs-iwmmxt", ARM_PCS_AAPCS_IWMMXT},
++ {"atpcs", ARM_PCS_ATPCS},
++ {"apcs", ARM_PCS_APCS},
++ {NULL, ARM_PCS_UNKNOWN}
++ };
++
++static enum arm_pcs
++arm_pcs_from_attribute (tree attr)
++{
++ const struct pcs_attribute_arg *ptr;
++ const char *arg;
++
++ /* Get the value of the argument. */
++ if (TREE_VALUE (attr) == NULL_TREE
++ || TREE_CODE (TREE_VALUE (attr)) != STRING_CST)
++ return ARM_PCS_UNKNOWN;
++
++ arg = TREE_STRING_POINTER (TREE_VALUE (attr));
++
++ /* Check it against the list of known arguments. */
++ for (ptr = pcs_attribute_args; ptr->arg != NULL; ptr++)
++ if (streq (arg, ptr->arg))
++ return ptr->value;
++
++ /* An unrecognized interrupt type. */
++ return ARM_PCS_UNKNOWN;
++}
++
++/* Get the PCS variant to use for this call. TYPE is the function's type
++ specification, DECL is the specific declartion. DECL may be null if
++ the call could be indirect or if this is a library call. */
++static enum arm_pcs
++arm_get_pcs_model (const_tree type, const_tree decl)
++{
++ bool user_convention = false;
++ enum arm_pcs user_pcs = arm_pcs_default;
++ tree attr;
++
++ gcc_assert (type);
++
++ attr = lookup_attribute ("pcs", TYPE_ATTRIBUTES (type));
++ if (attr)
++ {
++ user_pcs = arm_pcs_from_attribute (TREE_VALUE (attr));
++ user_convention = true;
++ }
++
++ if (TARGET_AAPCS_BASED)
++ {
++ /* Detect varargs functions. These always use the base rules
++ (no argument is ever a candidate for a co-processor
++ register). */
++ bool base_rules = (TYPE_ARG_TYPES (type) != 0
++ && (TREE_VALUE (tree_last (TYPE_ARG_TYPES (type)))
++ != void_type_node));
++
++ if (user_convention)
++ {
++ if (user_pcs > ARM_PCS_AAPCS_LOCAL)
++ sorry ("Non-AAPCS derived PCS variant");
++ else if (base_rules && user_pcs != ARM_PCS_AAPCS)
++ error ("Variadic functions must use the base AAPCS variant");
++ }
++
++ if (base_rules)
++ return ARM_PCS_AAPCS;
++ else if (user_convention)
++ return user_pcs;
++ else if (decl && flag_unit_at_a_time)
++ {
++ /* Local functions never leak outside this compilation unit,
++ so we are free to use whatever conventions are
++ appropriate. */
++ /* FIXME: remove CONST_CAST_TREE when cgraph is constified. */
++ struct cgraph_local_info *i = cgraph_local_info (CONST_CAST_TREE(decl));
++ if (i && i->local)
++ return ARM_PCS_AAPCS_LOCAL;
++ }
++ }
++ else if (user_convention && user_pcs != arm_pcs_default)
++ sorry ("PCS variant");
++
++ /* For everything else we use the target's default. */
++ return arm_pcs_default;
++}
++
++
++static void
++aapcs_vfp_cum_init (CUMULATIVE_ARGS *pcum ATTRIBUTE_UNUSED,
++ const_tree fntype ATTRIBUTE_UNUSED,
++ rtx libcall ATTRIBUTE_UNUSED,
++ const_tree fndecl ATTRIBUTE_UNUSED)
++{
++ /* Record the unallocated VFP registers. */
++ pcum->aapcs_vfp_regs_free = (1 << NUM_VFP_ARG_REGS) - 1;
++ pcum->aapcs_vfp_reg_alloc = 0;
++}
++
++/* Walk down the type tree of TYPE counting consecutive base elements.
++ If *MODEP is VOIDmode, then set it to the first valid floating point
++ type. If a non-floating point type is found, or if a floating point
++ type that doesn't match a non-VOIDmode *MODEP is found, then return -1,
++ otherwise return the count in the sub-tree. */
++static int
++aapcs_vfp_sub_candidate (const_tree type, enum machine_mode *modep)
++{
++ enum machine_mode mode;
++ HOST_WIDE_INT size;
++
++ switch (TREE_CODE (type))
++ {
++ case REAL_TYPE:
++ mode = TYPE_MODE (type);
++ if (mode != DFmode && mode != SFmode)
++ return -1;
++
++ if (*modep == VOIDmode)
++ *modep = mode;
++
++ if (*modep == mode)
++ return 1;
++
++ break;
++
++ case COMPLEX_TYPE:
++ mode = TYPE_MODE (TREE_TYPE (type));
++ if (mode != DFmode && mode != SFmode)
++ return -1;
++
++ if (*modep == VOIDmode)
++ *modep = mode;
++
++ if (*modep == mode)
++ return 2;
++
++ break;
++
++ case VECTOR_TYPE:
++ /* Use V2SImode and V4SImode as representatives of all 64-bit
++ and 128-bit vector types, whether or not those modes are
++ supported with the present options. */
++ size = int_size_in_bytes (type);
++ switch (size)
++ {
++ case 8:
++ mode = V2SImode;
++ break;
++ case 16:
++ mode = V4SImode;
++ break;
++ default:
++ return -1;
++ }
++
++ if (*modep == VOIDmode)
++ *modep = mode;
++
++ /* Vector modes are considered to be opaque: two vectors are
++ equivalent for the purposes of being homogeneous aggregates
++ if they are the same size. */
++ if (*modep == mode)
++ return 1;
++
++ break;
++
++ case ARRAY_TYPE:
++ {
++ int count;
++ tree index = TYPE_DOMAIN (type);
++
++ /* Can't handle incomplete types. */
++ if (!COMPLETE_TYPE_P(type))
++ return -1;
++
++ count = aapcs_vfp_sub_candidate (TREE_TYPE (type), modep);
++ if (count == -1
++ || !index
++ || !TYPE_MAX_VALUE (index)
++ || !host_integerp (TYPE_MAX_VALUE (index), 1)
++ || !TYPE_MIN_VALUE (index)
++ || !host_integerp (TYPE_MIN_VALUE (index), 1)
++ || count < 0)
++ return -1;
++
++ count *= (1 + tree_low_cst (TYPE_MAX_VALUE (index), 1)
++ - tree_low_cst (TYPE_MIN_VALUE (index), 1));
++
++ /* There must be no padding. */
++ if (!host_integerp (TYPE_SIZE (type), 1)
++ || (tree_low_cst (TYPE_SIZE (type), 1)
++ != count * GET_MODE_BITSIZE (*modep)))
++ return -1;
++
++ return count;
++ }
++
++ case RECORD_TYPE:
++ {
++ int count = 0;
++ int sub_count;
++ tree field;
++
++ /* Can't handle incomplete types. */
++ if (!COMPLETE_TYPE_P(type))
++ return -1;
++
++ for (field = TYPE_FIELDS (type); field; field = TREE_CHAIN (field))
++ {
++ if (TREE_CODE (field) != FIELD_DECL)
++ continue;
++
++ sub_count = aapcs_vfp_sub_candidate (TREE_TYPE (field), modep);
++ if (sub_count < 0)
++ return -1;
++ count += sub_count;
++ }
++
++ /* There must be no padding. */
++ if (!host_integerp (TYPE_SIZE (type), 1)
++ || (tree_low_cst (TYPE_SIZE (type), 1)
++ != count * GET_MODE_BITSIZE (*modep)))
++ return -1;
++
++ return count;
++ }
++
++ case UNION_TYPE:
++ case QUAL_UNION_TYPE:
++ {
++ /* These aren't very interesting except in a degenerate case. */
++ int count = 0;
++ int sub_count;
++ tree field;
++
++ /* Can't handle incomplete types. */
++ if (!COMPLETE_TYPE_P(type))
++ return -1;
++
++ for (field = TYPE_FIELDS (type); field; field = TREE_CHAIN (field))
++ {
++ if (TREE_CODE (field) != FIELD_DECL)
++ continue;
++
++ sub_count = aapcs_vfp_sub_candidate (TREE_TYPE (field), modep);
++ if (sub_count < 0)
++ return -1;
++ count = count > sub_count ? count : sub_count;
++ }
++
++ /* There must be no padding. */
++ if (!host_integerp (TYPE_SIZE (type), 1)
++ || (tree_low_cst (TYPE_SIZE (type), 1)
++ != count * GET_MODE_BITSIZE (*modep)))
++ return -1;
++
++ return count;
++ }
++
++ default:
++ break;
++ }
++
++ return -1;
++}
++
++/* Return true if PCS_VARIANT should use VFP registers. */
++static bool
++use_vfp_abi (enum arm_pcs pcs_variant, bool is_double)
++{
++ if (pcs_variant == ARM_PCS_AAPCS_VFP)
++ return true;
++
++ if (pcs_variant != ARM_PCS_AAPCS_LOCAL)
++ return false;
++
++ return (TARGET_32BIT && TARGET_VFP && TARGET_HARD_FLOAT &&
++ (TARGET_VFP_DOUBLE || !is_double));
++}
++
++static bool
++aapcs_vfp_is_call_or_return_candidate (enum arm_pcs pcs_variant,
++ enum machine_mode mode, const_tree type,
++ int *base_mode, int *count)
++{
++ enum machine_mode new_mode = VOIDmode;
++
++ if (GET_MODE_CLASS (mode) == MODE_FLOAT
++ || GET_MODE_CLASS (mode) == MODE_VECTOR_INT
++ || GET_MODE_CLASS (mode) == MODE_VECTOR_FLOAT)
++ {
++ *count = 1;
++ new_mode = mode;
++ }
++ else if (GET_MODE_CLASS (mode) == MODE_COMPLEX_FLOAT)
++ {
++ *count = 2;
++ new_mode = (mode == DCmode ? DFmode : SFmode);
++ }
++ else if (type && (mode == BLKmode || TREE_CODE (type) == VECTOR_TYPE))
++ {
++ int ag_count = aapcs_vfp_sub_candidate (type, &new_mode);
++
++ if (ag_count > 0 && ag_count <= 4)
++ *count = ag_count;
++ else
++ return false;
++ }
++ else
++ return false;
++
++
++ if (!use_vfp_abi (pcs_variant, ARM_NUM_REGS (new_mode) > 1))
++ return false;
++
++ *base_mode = new_mode;
++ return true;
++}
++
++static bool
++aapcs_vfp_is_return_candidate (enum arm_pcs pcs_variant,
++ enum machine_mode mode, const_tree type)
++{
++ int count ATTRIBUTE_UNUSED;
++ int ag_mode ATTRIBUTE_UNUSED;
++
++ if (!use_vfp_abi (pcs_variant, false))
++ return false;
++ return aapcs_vfp_is_call_or_return_candidate (pcs_variant, mode, type,
++ &ag_mode, &count);
++}
++
++static bool
++aapcs_vfp_is_call_candidate (CUMULATIVE_ARGS *pcum, enum machine_mode mode,
++ const_tree type)
++{
++ if (!use_vfp_abi (pcum->pcs_variant, false))
++ return false;
++
++ return aapcs_vfp_is_call_or_return_candidate (pcum->pcs_variant, mode, type,
++ &pcum->aapcs_vfp_rmode,
++ &pcum->aapcs_vfp_rcount);
++}
++
++static bool
++aapcs_vfp_allocate (CUMULATIVE_ARGS *pcum, enum machine_mode mode,
++ const_tree type ATTRIBUTE_UNUSED)
++{
++ int shift = GET_MODE_SIZE (pcum->aapcs_vfp_rmode) / GET_MODE_SIZE (SFmode);
++ unsigned mask = (1 << (shift * pcum->aapcs_vfp_rcount)) - 1;
++ int regno;
++
++ for (regno = 0; regno < NUM_VFP_ARG_REGS; regno += shift)
++ if (((pcum->aapcs_vfp_regs_free >> regno) & mask) == mask)
++ {
++ pcum->aapcs_vfp_reg_alloc = mask << regno;
++ if (mode == BLKmode || (mode == TImode && !TARGET_NEON))
++ {
++ int i;
++ int rcount = pcum->aapcs_vfp_rcount;
++ int rshift = shift;
++ enum machine_mode rmode = pcum->aapcs_vfp_rmode;
++ rtx par;
++ if (!TARGET_NEON)
++ {
++ /* Avoid using unsupported vector modes. */
++ if (rmode == V2SImode)
++ rmode = DImode;
++ else if (rmode == V4SImode)
++ {
++ rmode = DImode;
++ rcount *= 2;
++ rshift /= 2;
++ }
++ }
++ par = gen_rtx_PARALLEL (mode, rtvec_alloc (rcount));
++ for (i = 0; i < rcount; i++)
++ {
++ rtx tmp = gen_rtx_REG (rmode,
++ FIRST_VFP_REGNUM + regno + i * rshift);
++ tmp = gen_rtx_EXPR_LIST
++ (VOIDmode, tmp,
++ GEN_INT (i * GET_MODE_SIZE (rmode)));
++ XVECEXP (par, 0, i) = tmp;
++ }
++
++ pcum->aapcs_reg = par;
++ }
++ else
++ pcum->aapcs_reg = gen_rtx_REG (mode, FIRST_VFP_REGNUM + regno);
++ return true;
++ }
++ return false;
++}
++
++static rtx
++aapcs_vfp_allocate_return_reg (enum arm_pcs pcs_variant ATTRIBUTE_UNUSED,
++ enum machine_mode mode,
++ const_tree type ATTRIBUTE_UNUSED)
++{
++ if (!use_vfp_abi (pcs_variant, false))
++ return false;
++
++ if (mode == BLKmode || (mode == TImode && !TARGET_NEON))
++ {
++ int count;
++ int ag_mode;
++ int i;
++ rtx par;
++ int shift;
++
++ aapcs_vfp_is_call_or_return_candidate (pcs_variant, mode, type,
++ &ag_mode, &count);
++
++ if (!TARGET_NEON)
++ {
++ if (ag_mode == V2SImode)
++ ag_mode = DImode;
++ else if (ag_mode == V4SImode)
++ {
++ ag_mode = DImode;
++ count *= 2;
++ }
++ }
++ shift = GET_MODE_SIZE(ag_mode) / GET_MODE_SIZE(SFmode);
++ par = gen_rtx_PARALLEL (mode, rtvec_alloc (count));
++ for (i = 0; i < count; i++)
++ {
++ rtx tmp = gen_rtx_REG (ag_mode, FIRST_VFP_REGNUM + i * shift);
++ tmp = gen_rtx_EXPR_LIST (VOIDmode, tmp,
++ GEN_INT (i * GET_MODE_SIZE (ag_mode)));
++ XVECEXP (par, 0, i) = tmp;
++ }
++
++ return par;
++ }
++
++ return gen_rtx_REG (mode, FIRST_VFP_REGNUM);
++}
++
++static void
++aapcs_vfp_advance (CUMULATIVE_ARGS *pcum ATTRIBUTE_UNUSED,
++ enum machine_mode mode ATTRIBUTE_UNUSED,
++ const_tree type ATTRIBUTE_UNUSED)
++{
++ pcum->aapcs_vfp_regs_free &= ~pcum->aapcs_vfp_reg_alloc;
++ pcum->aapcs_vfp_reg_alloc = 0;
++ return;
++}
++
++#define AAPCS_CP(X) \
++ { \
++ aapcs_ ## X ## _cum_init, \
++ aapcs_ ## X ## _is_call_candidate, \
++ aapcs_ ## X ## _allocate, \
++ aapcs_ ## X ## _is_return_candidate, \
++ aapcs_ ## X ## _allocate_return_reg, \
++ aapcs_ ## X ## _advance \
++ }
++
++/* Table of co-processors that can be used to pass arguments in
++ registers. Idealy no arugment should be a candidate for more than
++ one co-processor table entry, but the table is processed in order
++ and stops after the first match. If that entry then fails to put
++ the argument into a co-processor register, the argument will go on
++ the stack. */
++static struct
++{
++ /* Initialize co-processor related state in CUMULATIVE_ARGS structure. */
++ void (*cum_init) (CUMULATIVE_ARGS *, const_tree, rtx, const_tree);
++
++ /* Return true if an argument of mode MODE (or type TYPE if MODE is
++ BLKmode) is a candidate for this co-processor's registers; this
++ function should ignore any position-dependent state in
++ CUMULATIVE_ARGS and only use call-type dependent information. */
++ bool (*is_call_candidate) (CUMULATIVE_ARGS *, enum machine_mode, const_tree);
++
++ /* Return true if the argument does get a co-processor register; it
++ should set aapcs_reg to an RTX of the register allocated as is
++ required for a return from FUNCTION_ARG. */
++ bool (*allocate) (CUMULATIVE_ARGS *, enum machine_mode, const_tree);
++
++ /* Return true if a result of mode MODE (or type TYPE if MODE is
++ BLKmode) is can be returned in this co-processor's registers. */
++ bool (*is_return_candidate) (enum arm_pcs, enum machine_mode, const_tree);
++
++ /* Allocate and return an RTX element to hold the return type of a
++ call, this routine must not fail and will only be called if
++ is_return_candidate returned true with the same parameters. */
++ rtx (*allocate_return_reg) (enum arm_pcs, enum machine_mode, const_tree);
++
++ /* Finish processing this argument and prepare to start processing
++ the next one. */
++ void (*advance) (CUMULATIVE_ARGS *, enum machine_mode, const_tree);
++} aapcs_cp_arg_layout[ARM_NUM_COPROC_SLOTS] =
++ {
++ AAPCS_CP(vfp)
++ };
++
++#undef AAPCS_CP
++
++static int
++aapcs_select_call_coproc (CUMULATIVE_ARGS *pcum, enum machine_mode mode,
++ tree type)
++{
++ int i;
++
++ for (i = 0; i < ARM_NUM_COPROC_SLOTS; i++)
++ if (aapcs_cp_arg_layout[i].is_call_candidate (pcum, mode, type))
++ return i;
++
++ return -1;
++}
++
++static int
++aapcs_select_return_coproc (const_tree type, const_tree fntype)
++{
++ /* We aren't passed a decl, so we can't check that a call is local.
++ However, it isn't clear that that would be a win anyway, since it
++ might limit some tail-calling opportunities. */
++ enum arm_pcs pcs_variant;
++
++ if (fntype)
++ {
++ const_tree fndecl = NULL_TREE;
++
++ if (TREE_CODE (fntype) == FUNCTION_DECL)
++ {
++ fndecl = fntype;
++ fntype = TREE_TYPE (fntype);
++ }
++
++ pcs_variant = arm_get_pcs_model (fntype, fndecl);
++ }
++ else
++ pcs_variant = arm_pcs_default;
++
++ if (pcs_variant != ARM_PCS_AAPCS)
++ {
++ int i;
++
++ for (i = 0; i < ARM_NUM_COPROC_SLOTS; i++)
++ if (aapcs_cp_arg_layout[i].is_return_candidate (pcs_variant,
++ TYPE_MODE (type),
++ type))
++ return i;
++ }
++ return -1;
++}
++
++static rtx
++aapcs_allocate_return_reg (enum machine_mode mode, const_tree type,
++ const_tree fntype)
++{
++ /* We aren't passed a decl, so we can't check that a call is local.
++ However, it isn't clear that that would be a win anyway, since it
++ might limit some tail-calling opportunities. */
++ enum arm_pcs pcs_variant;
++
++ if (fntype)
++ {
++ const_tree fndecl = NULL_TREE;
++
++ if (TREE_CODE (fntype) == FUNCTION_DECL)
++ {
++ fndecl = fntype;
++ fntype = TREE_TYPE (fntype);
++ }
++
++ pcs_variant = arm_get_pcs_model (fntype, fndecl);
++ }
++ else
++ pcs_variant = arm_pcs_default;
++
++ /* Promote integer types. */
++ if (type && INTEGRAL_TYPE_P (type))
++ PROMOTE_FUNCTION_MODE (mode, unsignedp, type);
++
++ if (pcs_variant != ARM_PCS_AAPCS)
++ {
++ int i;
++
++ for (i = 0; i < ARM_NUM_COPROC_SLOTS; i++)
++ if (aapcs_cp_arg_layout[i].is_return_candidate (pcs_variant, mode,
++ type))
++ return aapcs_cp_arg_layout[i].allocate_return_reg (pcs_variant,
++ mode, type);
++ }
++
++ /* Promotes small structs returned in a register to full-word size
++ for big-endian AAPCS. */
++ if (type && arm_return_in_msb (type))
++ {
++ HOST_WIDE_INT size = int_size_in_bytes (type);
++ if (size % UNITS_PER_WORD != 0)
++ {
++ size += UNITS_PER_WORD - size % UNITS_PER_WORD;
++ mode = mode_for_size (size * BITS_PER_UNIT, MODE_INT, 0);
++ }
++ }
++
++ return gen_rtx_REG (mode, R0_REGNUM);
++}
++
++rtx
++aapcs_libcall_value (enum machine_mode mode)
++{
++ return aapcs_allocate_return_reg (mode, NULL_TREE, NULL_TREE);
++}
++
++/* Lay out a function argument using the AAPCS rules. The rule
++ numbers referred to here are those in the AAPCS. */
++static void
++aapcs_layout_arg (CUMULATIVE_ARGS *pcum, enum machine_mode mode,
++ tree type, int named)
++{
++ int nregs, nregs2;
++ int ncrn;
++
++ /* We only need to do this once per argument. */
++ if (pcum->aapcs_arg_processed)
++ return;
++
++ pcum->aapcs_arg_processed = true;
++
++ /* Special case: if named is false then we are handling an incoming
++ anonymous argument which is on the stack. */
++ if (!named)
++ return;
++
++ /* Is this a potential co-processor register candidate? */
++ if (pcum->pcs_variant != ARM_PCS_AAPCS)
++ {
++ int slot = aapcs_select_call_coproc (pcum, mode, type);
++ pcum->aapcs_cprc_slot = slot;
++
++ /* We don't have to apply any of the rules from part B of the
++ preparation phase, these are handled elsewhere in the
++ compiler. */
++
++ if (slot >= 0)
++ {
++ /* A Co-processor register candidate goes either in its own
++ class of registers or on the stack. */
++ if (!pcum->aapcs_cprc_failed[slot])
++ {
++ /* C1.cp - Try to allocate the argument to co-processor
++ registers. */
++ if (aapcs_cp_arg_layout[slot].allocate (pcum, mode, type))
++ return;
++
++ /* C2.cp - Put the argument on the stack and note that we
++ can't assign any more candidates in this slot. We also
++ need to note that we have allocated stack space, so that
++ we won't later try to split a non-cprc candidate between
++ core registers and the stack. */
++ pcum->aapcs_cprc_failed[slot] = true;
++ pcum->can_split = false;
++ }
++
++ /* We didn't get a register, so this argument goes on the
++ stack. */
++ gcc_assert (pcum->can_split == false);
++ return;
++ }
++ }
++
++ /* C3 - For double-word aligned arguments, round the NCRN up to the
++ next even number. */
++ ncrn = pcum->aapcs_ncrn;
++ if ((ncrn & 1) && arm_needs_doubleword_align (mode, type))
++ ncrn++;
++
++ nregs = ARM_NUM_REGS2(mode, type);
++
++ /* Sigh, this test should really assert that nregs > 0, but a GCC
++ extension allows empty structs and then gives them empty size; it
++ then allows such a structure to be passed by value. For some of
++ the code below we have to pretend that such an argument has
++ non-zero size so that we 'locate' it correctly either in
++ registers or on the stack. */
++ gcc_assert (nregs >= 0);
++
++ nregs2 = nregs ? nregs : 1;
++
++ /* C4 - Argument fits entirely in core registers. */
++ if (ncrn + nregs2 <= NUM_ARG_REGS)
++ {
++ pcum->aapcs_reg = gen_rtx_REG (mode, ncrn);
++ pcum->aapcs_next_ncrn = ncrn + nregs;
++ return;
++ }
++
++ /* C5 - Some core registers left and there are no arguments already
++ on the stack: split this argument between the remaining core
++ registers and the stack. */
++ if (ncrn < NUM_ARG_REGS && pcum->can_split)
++ {
++ pcum->aapcs_reg = gen_rtx_REG (mode, ncrn);
++ pcum->aapcs_next_ncrn = NUM_ARG_REGS;
++ pcum->aapcs_partial = (NUM_ARG_REGS - ncrn) * UNITS_PER_WORD;
++ return;
++ }
++
++ /* C6 - NCRN is set to 4. */
++ pcum->aapcs_next_ncrn = NUM_ARG_REGS;
++
++ /* C7,C8 - arugment goes on the stack. We have nothing to do here. */
++ return;
++}
++
+ /* Initialize a variable CUM of type CUMULATIVE_ARGS
+ for a call to a function whose data type is FNTYPE.
+ For a library call, FNTYPE is NULL. */
+ void
+ arm_init_cumulative_args (CUMULATIVE_ARGS *pcum, tree fntype,
+- rtx libname ATTRIBUTE_UNUSED,
++ rtx libname,
+ tree fndecl ATTRIBUTE_UNUSED)
+ {
++ /* Long call handling. */
++ if (fntype)
++ pcum->pcs_variant = arm_get_pcs_model (fntype, fndecl);
++ else
++ pcum->pcs_variant = arm_pcs_default;
++
++ if (pcum->pcs_variant <= ARM_PCS_AAPCS_LOCAL)
++ {
++ /* XXX We should also detect some library calls here and handle
++ them using the base rules too; for example the floating point
++ support functions always work this way. */
++
++ if (rtx_equal_p (libname,
++ convert_optab_libfunc (sfix_optab, DImode, DFmode))
++ || rtx_equal_p (libname,
++ convert_optab_libfunc (ufix_optab, DImode, DFmode))
++ || rtx_equal_p (libname,
++ convert_optab_libfunc (sfix_optab, DImode, SFmode))
++ || rtx_equal_p (libname,
++ convert_optab_libfunc (ufix_optab, DImode, SFmode))
++ || rtx_equal_p (libname,
++ convert_optab_libfunc (trunc_optab, HFmode, SFmode))
++ || rtx_equal_p (libname,
++ convert_optab_libfunc (sext_optab, SFmode, HFmode)))
++ pcum->pcs_variant = ARM_PCS_AAPCS;
++
++ pcum->aapcs_ncrn = pcum->aapcs_next_ncrn = 0;
++ pcum->aapcs_reg = NULL_RTX;
++ pcum->aapcs_partial = 0;
++ pcum->aapcs_arg_processed = false;
++ pcum->aapcs_cprc_slot = -1;
++ pcum->can_split = true;
++
++ if (pcum->pcs_variant != ARM_PCS_AAPCS)
++ {
++ int i;
++
++ for (i = 0; i < ARM_NUM_COPROC_SLOTS; i++)
++ {
++ pcum->aapcs_cprc_failed[i] = false;
++ aapcs_cp_arg_layout[i].cum_init (pcum, fntype, libname, fndecl);
++ }
++ }
++ return;
++ }
++
++ /* Legacy ABIs */
++
+ /* On the ARM, the offset starts at 0. */
+ pcum->nregs = 0;
+ pcum->iwmmxt_nregs = 0;
+@@ -3120,6 +4189,17 @@
+ {
+ int nregs;
+
++ /* Handle the special case quickly. Pick an arbitrary value for op2 of
++ a call insn (op3 of a call_value insn). */
++ if (mode == VOIDmode)
++ return const0_rtx;
++
++ if (pcum->pcs_variant <= ARM_PCS_AAPCS_LOCAL)
++ {
++ aapcs_layout_arg (pcum, mode, type, named);
++ return pcum->aapcs_reg;
++ }
++
+ /* Varargs vectors are treated the same as long long.
+ named_count avoids having to change the way arm handles 'named' */
+ if (TARGET_IWMMXT_ABI
+@@ -3161,10 +4241,16 @@
+
+ static int
+ arm_arg_partial_bytes (CUMULATIVE_ARGS *pcum, enum machine_mode mode,
+- tree type, bool named ATTRIBUTE_UNUSED)
++ tree type, bool named)
+ {
+ int nregs = pcum->nregs;
+
++ if (pcum->pcs_variant <= ARM_PCS_AAPCS_LOCAL)
++ {
++ aapcs_layout_arg (pcum, mode, type, named);
++ return pcum->aapcs_partial;
++ }
++
+ if (TARGET_IWMMXT_ABI && arm_vector_mode_supported_p (mode))
+ return 0;
+
+@@ -3173,7 +4259,40 @@
+ && pcum->can_split)
+ return (NUM_ARG_REGS - nregs) * UNITS_PER_WORD;
+
+- return 0;
++ return 0;
++}
++
++void
++arm_function_arg_advance (CUMULATIVE_ARGS *pcum, enum machine_mode mode,
++ tree type, bool named)
++{
++ if (pcum->pcs_variant <= ARM_PCS_AAPCS_LOCAL)
++ {
++ aapcs_layout_arg (pcum, mode, type, named);
++
++ if (pcum->aapcs_cprc_slot >= 0)
++ {
++ aapcs_cp_arg_layout[pcum->aapcs_cprc_slot].advance (pcum, mode,
++ type);
++ pcum->aapcs_cprc_slot = -1;
++ }
++
++ /* Generic stuff. */
++ pcum->aapcs_arg_processed = false;
++ pcum->aapcs_ncrn = pcum->aapcs_next_ncrn;
++ pcum->aapcs_reg = NULL_RTX;
++ pcum->aapcs_partial = 0;
++ }
++ else
++ {
++ pcum->nargs += 1;
++ if (arm_vector_mode_supported_p (mode)
++ && pcum->named_count > pcum->nargs
++ && TARGET_IWMMXT_ABI)
++ pcum->iwmmxt_nregs += 1;
++ else
++ pcum->nregs += ARM_NUM_REGS2 (mode, type);
++ }
+ }
+
+ /* Variable sized types are passed by reference. This is a GCC
+@@ -3226,6 +4345,8 @@
+ /* Whereas these functions are always known to reside within the 26 bit
+ addressing range. */
+ { "short_call", 0, 0, false, true, true, NULL },
++ /* Specify the procedure call conventions for a function. */
++ { "pcs", 1, 1, false, true, true, arm_handle_pcs_attribute },
+ /* Interrupt Service Routines have special prologue and epilogue requirements. */
+ { "isr", 0, 1, false, false, false, arm_handle_isr_attribute },
+ { "interrupt", 0, 1, false, false, false, arm_handle_isr_attribute },
+@@ -3328,6 +4449,21 @@
+ return NULL_TREE;
+ }
+
++/* Handle a "pcs" attribute; arguments as in struct
++ attribute_spec.handler. */
++static tree
++arm_handle_pcs_attribute (tree *node ATTRIBUTE_UNUSED, tree name, tree args,
++ int flags ATTRIBUTE_UNUSED, bool *no_add_attrs)
++{
++ if (arm_pcs_from_attribute (args) == ARM_PCS_UNKNOWN)
++ {
++ warning (OPT_Wattributes, "%qs attribute ignored",
++ IDENTIFIER_POINTER (name));
++ *no_add_attrs = true;
++ }
++ return NULL_TREE;
++}
++
+ #if TARGET_DLLIMPORT_DECL_ATTRIBUTES
+ /* Handle the "notshared" attribute. This attribute is another way of
+ requesting hidden visibility. ARM's compiler supports
+@@ -3489,7 +4625,7 @@
+
+ /* Return nonzero if it is ok to make a tail-call to DECL. */
+ static bool
+-arm_function_ok_for_sibcall (tree decl, tree exp ATTRIBUTE_UNUSED)
++arm_function_ok_for_sibcall (tree decl, tree exp)
+ {
+ unsigned long func_type;
+
+@@ -3522,6 +4658,21 @@
+ if (IS_INTERRUPT (func_type))
+ return false;
+
++ if (!VOID_TYPE_P (TREE_TYPE (DECL_RESULT (cfun->decl))))
++ {
++ /* Check that the return value locations are the same. For
++ example that we aren't returning a value from the sibling in
++ a VFP register but then need to transfer it to a core
++ register. */
++ rtx a, b;
++
++ a = arm_function_value (TREE_TYPE (exp), decl, false);
++ b = arm_function_value (TREE_TYPE (DECL_RESULT (cfun->decl)),
++ cfun->decl, false);
++ if (!rtx_equal_p (a, b))
++ return false;
++ }
++
+ /* Never tailcall if function may be called with a misaligned SP. */
+ if (IS_STACKALIGN (func_type))
+ return false;
+@@ -4120,6 +5271,7 @@
+ if (GET_MODE_SIZE (mode) <= 4
+ && ! (arm_arch4
+ && (mode == HImode
++ || mode == HFmode
+ || (mode == QImode && outer == SIGN_EXTEND))))
+ {
+ if (code == MULT)
+@@ -4148,13 +5300,15 @@
+ load. */
+ if (arm_arch4)
+ {
+- if (mode == HImode || (outer == SIGN_EXTEND && mode == QImode))
++ if (mode == HImode
++ || mode == HFmode
++ || (outer == SIGN_EXTEND && mode == QImode))
+ range = 256;
+ else
+ range = 4096;
+ }
+ else
+- range = (mode == HImode) ? 4095 : 4096;
++ range = (mode == HImode || mode == HFmode) ? 4095 : 4096;
+
+ return (code == CONST_INT
+ && INTVAL (index) < range
+@@ -4325,7 +5479,8 @@
+ return 1;
+
+ /* This is PC relative data after arm_reorg runs. */
+- else if (GET_MODE_SIZE (mode) >= 4 && reload_completed
++ else if ((GET_MODE_SIZE (mode) >= 4 || mode == HFmode)
++ && reload_completed
+ && (GET_CODE (x) == LABEL_REF
+ || (GET_CODE (x) == CONST
+ && GET_CODE (XEXP (x, 0)) == PLUS
+@@ -5024,7 +6179,7 @@
+ case UMOD:
+ if (TARGET_HARD_FLOAT && mode == SFmode)
+ *total = COSTS_N_INSNS (2);
+- else if (TARGET_HARD_FLOAT && mode == DFmode)
++ else if (TARGET_HARD_FLOAT && mode == DFmode && !TARGET_VFP_SINGLE)
+ *total = COSTS_N_INSNS (4);
+ else
+ *total = COSTS_N_INSNS (20);
+@@ -5063,23 +6218,6 @@
+ return true;
+
+ case MINUS:
+- if (TARGET_THUMB2)
+- {
+- if (GET_MODE_CLASS (mode) == MODE_FLOAT)
+- {
+- if (TARGET_HARD_FLOAT && (mode == SFmode || mode == DFmode))
+- *total = COSTS_N_INSNS (1);
+- else
+- *total = COSTS_N_INSNS (20);
+- }
+- else
+- *total = COSTS_N_INSNS (ARM_NUM_REGS (mode));
+- /* Thumb2 does not have RSB, so all arguments must be
+- registers (subtracting a constant is canonicalized as
+- addition of the negated constant). */
+- return false;
+- }
+-
+ if (mode == DImode)
+ {
+ *total = COSTS_N_INSNS (ARM_NUM_REGS (mode));
+@@ -5102,7 +6240,9 @@
+
+ if (GET_MODE_CLASS (mode) == MODE_FLOAT)
+ {
+- if (TARGET_HARD_FLOAT && (mode == SFmode || mode == DFmode))
++ if (TARGET_HARD_FLOAT
++ && (mode == SFmode
++ || (mode == DFmode && !TARGET_VFP_SINGLE)))
+ {
+ *total = COSTS_N_INSNS (1);
+ if (GET_CODE (XEXP (x, 0)) == CONST_DOUBLE
+@@ -5143,6 +6283,17 @@
+ return true;
+ }
+
++ /* A shift as a part of RSB costs no more than RSB itself. */
++ if (GET_CODE (XEXP (x, 0)) == MULT
++ && GET_CODE (XEXP (XEXP (x, 0), 1)) == CONST_INT
++ && ((INTVAL (XEXP (XEXP (x, 0), 1))
++ & (INTVAL (XEXP (XEXP (x, 0), 1)) - 1)) == 0))
++ {
++ *total += rtx_cost (XEXP (XEXP (x, 0), 0), code, speed);
++ *total += rtx_cost (XEXP (x, 1), code, speed);
++ return true;
++ }
++
+ if (subcode == MULT
+ && GET_CODE (XEXP (XEXP (x, 1), 1)) == CONST_INT
+ && ((INTVAL (XEXP (XEXP (x, 1), 1)) &
+@@ -5164,6 +6315,19 @@
+ return true;
+ }
+
++ /* MLS is just as expensive as its underlying multiplication.
++ Exclude a shift by a constant, which is expressed as a
++ multiplication. */
++ if (TARGET_32BIT && arm_arch_thumb2
++ && GET_CODE (XEXP (x, 1)) == MULT
++ && ! (GET_CODE (XEXP (XEXP (x, 1), 1)) == CONST_INT
++ && ((INTVAL (XEXP (XEXP (x, 1), 1)) &
++ (INTVAL (XEXP (XEXP (x, 1), 1)) - 1)) == 0)))
++ {
++ /* The cost comes from the cost of the multiply. */
++ return false;
++ }
++
+ /* Fall through */
+
+ case PLUS:
+@@ -5192,7 +6356,9 @@
+
+ if (GET_MODE_CLASS (mode) == MODE_FLOAT)
+ {
+- if (TARGET_HARD_FLOAT && (mode == SFmode || mode == DFmode))
++ if (TARGET_HARD_FLOAT
++ && (mode == SFmode
++ || (mode == DFmode && !TARGET_VFP_SINGLE)))
+ {
+ *total = COSTS_N_INSNS (1);
+ if (GET_CODE (XEXP (x, 1)) == CONST_DOUBLE
+@@ -5307,7 +6473,9 @@
+ case NEG:
+ if (GET_MODE_CLASS (mode) == MODE_FLOAT)
+ {
+- if (TARGET_HARD_FLOAT && (mode == SFmode || mode == DFmode))
++ if (TARGET_HARD_FLOAT
++ && (mode == SFmode
++ || (mode == DFmode && !TARGET_VFP_SINGLE)))
+ {
+ *total = COSTS_N_INSNS (1);
+ return false;
+@@ -5460,7 +6628,9 @@
+ case ABS:
+ if (GET_MODE_CLASS (mode == MODE_FLOAT))
+ {
+- if (TARGET_HARD_FLOAT && (mode == SFmode || mode == DFmode))
++ if (TARGET_HARD_FLOAT
++ && (mode == SFmode
++ || (mode == DFmode && !TARGET_VFP_SINGLE)))
+ {
+ *total = COSTS_N_INSNS (1);
+ return false;
+@@ -5563,7 +6733,8 @@
+ return true;
+
+ case CONST_DOUBLE:
+- if (TARGET_HARD_FLOAT && vfp3_const_double_rtx (x))
++ if (TARGET_HARD_FLOAT && vfp3_const_double_rtx (x)
++ && (mode == SFmode || !TARGET_VFP_SINGLE))
+ *total = COSTS_N_INSNS (1);
+ else
+ *total = COSTS_N_INSNS (4);
+@@ -5638,7 +6809,8 @@
+ return false;
+
+ case MINUS:
+- if (TARGET_HARD_FLOAT && GET_MODE_CLASS (mode) == MODE_FLOAT)
++ if (TARGET_HARD_FLOAT && GET_MODE_CLASS (mode) == MODE_FLOAT
++ && (mode == SFmode || !TARGET_VFP_SINGLE))
+ {
+ *total = COSTS_N_INSNS (1);
+ return false;
+@@ -5668,7 +6840,8 @@
+ return false;
+
+ case PLUS:
+- if (TARGET_HARD_FLOAT && GET_MODE_CLASS (mode) == MODE_FLOAT)
++ if (TARGET_HARD_FLOAT && GET_MODE_CLASS (mode) == MODE_FLOAT
++ && (mode == SFmode || !TARGET_VFP_SINGLE))
+ {
+ *total = COSTS_N_INSNS (1);
+ return false;
+@@ -5698,7 +6871,8 @@
+ return false;
+
+ case NEG:
+- if (TARGET_HARD_FLOAT && GET_MODE_CLASS (mode) == MODE_FLOAT)
++ if (TARGET_HARD_FLOAT && GET_MODE_CLASS (mode) == MODE_FLOAT
++ && (mode == SFmode || !TARGET_VFP_SINGLE))
+ {
+ *total = COSTS_N_INSNS (1);
+ return false;
+@@ -5722,7 +6896,8 @@
+ return false;
+
+ case ABS:
+- if (TARGET_HARD_FLOAT && GET_MODE_CLASS (mode) == MODE_FLOAT)
++ if (TARGET_HARD_FLOAT && GET_MODE_CLASS (mode) == MODE_FLOAT
++ && (mode == SFmode || !TARGET_VFP_SINGLE))
+ *total = COSTS_N_INSNS (1);
+ else
+ *total = COSTS_N_INSNS (1 + ARM_NUM_REGS (mode));
+@@ -5939,7 +7114,9 @@
+
+ if (GET_MODE_CLASS (mode) == MODE_FLOAT)
+ {
+- if (TARGET_HARD_FLOAT && (mode == SFmode || mode == DFmode))
++ if (TARGET_HARD_FLOAT
++ && (mode == SFmode
++ || (mode == DFmode && !TARGET_VFP_SINGLE)))
+ {
+ *total = COSTS_N_INSNS (1);
+ return false;
+@@ -6096,7 +7273,9 @@
+
+ if (GET_MODE_CLASS (mode) == MODE_FLOAT)
+ {
+- if (TARGET_HARD_FLOAT && (mode == SFmode || mode == DFmode))
++ if (TARGET_HARD_FLOAT
++ && (mode == SFmode
++ || (mode == DFmode && !TARGET_VFP_SINGLE)))
+ {
+ *total = COSTS_N_INSNS (1);
+ return false;
+@@ -6919,10 +8098,13 @@
+ }
+
+ /* Return TRUE if OP is a memory operand which we can load or store a vector
+- to/from. If CORE is true, we're moving from ARM registers not Neon
+- registers. */
++ to/from. TYPE is one of the following values:
++ 0 - Vector load/stor (vldr)
++ 1 - Core registers (ldm)
++ 2 - Element/structure loads (vld1)
++ */
+ int
+-neon_vector_mem_operand (rtx op, bool core)
++neon_vector_mem_operand (rtx op, int type)
+ {
+ rtx ind;
+
+@@ -6955,23 +8137,16 @@
+ return arm_address_register_rtx_p (ind, 0);
+
+ /* Allow post-increment with Neon registers. */
+- if (!core && GET_CODE (ind) == POST_INC)
++ if ((type != 1 && GET_CODE (ind) == POST_INC)
++ || (type == 0 && GET_CODE (ind) == PRE_DEC))
+ return arm_address_register_rtx_p (XEXP (ind, 0), 0);
+
+-#if 0
+- /* FIXME: We can support this too if we use VLD1/VST1. */
+- if (!core
+- && GET_CODE (ind) == POST_MODIFY
+- && arm_address_register_rtx_p (XEXP (ind, 0), 0)
+- && GET_CODE (XEXP (ind, 1)) == PLUS
+- && rtx_equal_p (XEXP (XEXP (ind, 1), 0), XEXP (ind, 0)))
+- ind = XEXP (ind, 1);
+-#endif
++ /* FIXME: vld1 allows register post-modify. */
+
+ /* Match:
+ (plus (reg)
+ (const)). */
+- if (!core
++ if (type == 0
+ && GET_CODE (ind) == PLUS
+ && GET_CODE (XEXP (ind, 0)) == REG
+ && REG_MODE_OK_FOR_BASE_P (XEXP (ind, 0), VOIDmode)
+@@ -7038,10 +8213,19 @@
+ enum reg_class
+ coproc_secondary_reload_class (enum machine_mode mode, rtx x, bool wb)
+ {
++ if (mode == HFmode)
++ {
++ if (!TARGET_NEON_FP16)
++ return GENERAL_REGS;
++ if (s_register_operand (x, mode) || neon_vector_mem_operand (x, 2))
++ return NO_REGS;
++ return GENERAL_REGS;
++ }
++
+ if (TARGET_NEON
+ && (GET_MODE_CLASS (mode) == MODE_VECTOR_INT
+ || GET_MODE_CLASS (mode) == MODE_VECTOR_FLOAT)
+- && neon_vector_mem_operand (x, FALSE))
++ && neon_vector_mem_operand (x, 0))
+ return NO_REGS;
+
+ if (arm_coproc_mem_operand (x, wb) || s_register_operand (x, mode))
+@@ -7438,6 +8622,9 @@
+ int base_reg = -1;
+ int i;
+
++ if (low_irq_latency)
++ return 0;
++
+ /* Can only handle 2, 3, or 4 insns at present,
+ though could be easily extended if required. */
+ gcc_assert (nops >= 2 && nops <= 4);
+@@ -7667,6 +8854,9 @@
+ int base_reg = -1;
+ int i;
+
++ if (low_irq_latency)
++ return 0;
++
+ /* Can only handle 2, 3, or 4 insns at present, though could be easily
+ extended if required. */
+ gcc_assert (nops >= 2 && nops <= 4);
+@@ -7874,7 +9064,7 @@
+
+ As a compromise, we use ldr for counts of 1 or 2 regs, and ldm
+ for counts of 3 or 4 regs. */
+- if (arm_tune_xscale && count <= 2 && ! optimize_size)
++ if (low_irq_latency || (arm_tune_xscale && count <= 2 && ! optimize_size))
+ {
+ rtx seq;
+
+@@ -7937,7 +9127,7 @@
+
+ /* See arm_gen_load_multiple for discussion of
+ the pros/cons of ldm/stm usage for XScale. */
+- if (arm_tune_xscale && count <= 2 && ! optimize_size)
++ if (low_irq_latency || (arm_tune_xscale && count <= 2 && ! optimize_size))
+ {
+ rtx seq;
+
+@@ -9555,7 +10745,10 @@
+ gcc_assert (GET_CODE (from) != BARRIER);
+
+ /* Count the length of this insn. */
+- count += get_attr_length (from);
++ if (LABEL_P (from) && (align_jumps > 0 || align_loops > 0))
++ count += MAX (align_jumps, align_loops);
++ else
++ count += get_attr_length (from);
+
+ /* If there is a jump table, add its length. */
+ tmp = is_jump_table (from);
+@@ -9867,6 +11060,8 @@
+ insn = table;
+ }
+ }
++ else if (LABEL_P (insn) && (align_jumps > 0 || align_loops > 0))
++ address += MAX (align_jumps, align_loops);
+ }
+
+ fix = minipool_fix_head;
+@@ -10072,6 +11267,21 @@
+ vfp_output_fldmd (FILE * stream, unsigned int base, int reg, int count)
+ {
+ int i;
++ int offset;
++
++ if (low_irq_latency)
++ {
++ /* Output a sequence of FLDD instructions. */
++ offset = 0;
++ for (i = reg; i < reg + count; ++i, offset += 8)
++ {
++ fputc ('\t', stream);
++ asm_fprintf (stream, "fldd\td%d, [%r,#%d]\n", i, base, offset);
++ }
++ asm_fprintf (stream, "\tadd\tsp, sp, #%d\n", count * 8);
++ return;
++ }
++
+
+ /* Workaround ARM10 VFPr1 bug. */
+ if (count == 2 && !arm_arch6)
+@@ -10142,6 +11352,56 @@
+ rtx tmp, reg;
+ int i;
+
++ if (low_irq_latency)
++ {
++ int saved_size;
++ rtx sp_insn;
++
++ if (!count)
++ return 0;
++
++ saved_size = count * GET_MODE_SIZE (DFmode);
++
++ /* Since fstd does not have postdecrement addressing mode,
++ we first decrement stack pointer and then use base+offset
++ stores for VFP registers. The ARM EABI unwind information
++ can't easily describe base+offset loads, so we attach
++ a note for the effects of the whole block in the first insn,
++ and avoid marking the subsequent instructions
++ with RTX_FRAME_RELATED_P. */
++ sp_insn = gen_addsi3 (stack_pointer_rtx, stack_pointer_rtx,
++ GEN_INT (-saved_size));
++ sp_insn = emit_insn (sp_insn);
++ RTX_FRAME_RELATED_P (sp_insn) = 1;
++
++ dwarf = gen_rtx_SEQUENCE (VOIDmode, rtvec_alloc (count + 1));
++ XVECEXP (dwarf, 0, 0) =
++ gen_rtx_SET (VOIDmode, stack_pointer_rtx,
++ plus_constant (stack_pointer_rtx, -saved_size));
++
++ /* push double VFP registers to stack */
++ for (i = 0; i < count; ++i )
++ {
++ rtx reg;
++ rtx mem;
++ rtx addr;
++ rtx insn;
++ reg = gen_rtx_REG (DFmode, base_reg + 2*i);
++ addr = (i == 0) ? stack_pointer_rtx
++ : gen_rtx_PLUS (SImode, stack_pointer_rtx,
++ GEN_INT (i * GET_MODE_SIZE (DFmode)));
++ mem = gen_frame_mem (DFmode, addr);
++ insn = emit_move_insn (mem, reg);
++ XVECEXP (dwarf, 0, i+1) =
++ gen_rtx_SET (VOIDmode, mem, reg);
++ }
++
++ REG_NOTES (sp_insn) = gen_rtx_EXPR_LIST (REG_FRAME_RELATED_EXPR, dwarf,
++ REG_NOTES (sp_insn));
++
++ return saved_size;
++ }
++
+ /* Workaround ARM10 VFPr1 bug. Data corruption can occur when exactly two
+ register pairs are stored by a store multiple insn. We avoid this
+ by pushing an extra pair. */
+@@ -10758,7 +12018,7 @@
+ }
+
+ /* Output a move, load or store for quad-word vectors in ARM registers. Only
+- handles MEMs accepted by neon_vector_mem_operand with CORE=true. */
++ handles MEMs accepted by neon_vector_mem_operand with TYPE=1. */
+
+ const char *
+ output_move_quad (rtx *operands)
+@@ -10954,6 +12214,12 @@
+ ops[1] = reg;
+ break;
+
++ case PRE_DEC:
++ templ = "v%smdb%%?\t%%0!, %%h1";
++ ops[0] = XEXP (addr, 0);
++ ops[1] = reg;
++ break;
++
+ case POST_MODIFY:
+ /* FIXME: Not currently enabled in neon_vector_mem_operand. */
+ gcc_unreachable ();
+@@ -10968,7 +12234,7 @@
+ {
+ /* We're only using DImode here because it's a convenient size. */
+ ops[0] = gen_rtx_REG (DImode, REGNO (reg) + 2 * i);
+- ops[1] = adjust_address (mem, SImode, 8 * i);
++ ops[1] = adjust_address (mem, DImode, 8 * i);
+ if (reg_overlap_mentioned_p (ops[0], mem))
+ {
+ gcc_assert (overlap == -1);
+@@ -11557,7 +12823,7 @@
+ if (count > 0)
+ {
+ /* Workaround ARM10 VFPr1 bug. */
+- if (count == 2 && !arm_arch6)
++ if (count == 2 && !arm_arch6 && !low_irq_latency)
+ count++;
+ saved += count * 8;
+ }
+@@ -11886,6 +13152,41 @@
+ return_used_this_function = 0;
+ }
+
++/* Generate to STREAM a code sequence that pops registers identified
++ in REGS_MASK from SP. SP is incremented as the result.
++*/
++static void
++print_pop_reg_by_ldr (FILE *stream, int regs_mask, int rfe)
++{
++ int reg;
++
++ gcc_assert (! (regs_mask & (1 << SP_REGNUM)));
++
++ for (reg = 0; reg < PC_REGNUM; ++reg)
++ if (regs_mask & (1 << reg))
++ asm_fprintf (stream, "\tldr\t%r, [%r], #4\n",
++ reg, SP_REGNUM);
++
++ if (regs_mask & (1 << PC_REGNUM))
++ {
++ if (rfe)
++ /* When returning from exception, we need to
++ copy SPSR to CPSR. There are two ways to do
++ that: the ldm instruction with "^" suffix,
++ and movs instruction. The latter would
++ require that we load from stack to some
++ scratch register, and then move to PC.
++ Therefore, we'd need extra instruction and
++ have to make sure we actually have a spare
++ register. Using ldm with a single register
++ is simler. */
++ asm_fprintf (stream, "\tldm\tsp!, {pc}^\n");
++ else
++ asm_fprintf (stream, "\tldr\t%r, [%r], #4\n",
++ PC_REGNUM, SP_REGNUM);
++ }
++}
++
+ const char *
+ arm_output_epilogue (rtx sibling)
+ {
+@@ -11946,7 +13247,7 @@
+ /* This variable is for the Virtual Frame Pointer, not VFP regs. */
+ int vfp_offset = offsets->frame;
+
+- if (arm_fpu_arch == FPUTYPE_FPA_EMU2)
++ if (TARGET_FPA_EMU2)
+ {
+ for (reg = LAST_FPA_REGNUM; reg >= FIRST_FPA_REGNUM; reg--)
+ if (df_regs_ever_live_p (reg) && !call_used_regs[reg])
+@@ -12169,7 +13470,7 @@
+ SP_REGNUM, HARD_FRAME_POINTER_REGNUM);
+ }
+
+- if (arm_fpu_arch == FPUTYPE_FPA_EMU2)
++ if (TARGET_FPA_EMU2)
+ {
+ for (reg = FIRST_FPA_REGNUM; reg <= LAST_FPA_REGNUM; reg++)
+ if (df_regs_ever_live_p (reg) && !call_used_regs[reg])
+@@ -12253,22 +13554,19 @@
+ to load use the LDR instruction - it is faster. For Thumb-2
+ always use pop and the assembler will pick the best instruction.*/
+ if (TARGET_ARM && saved_regs_mask == (1 << LR_REGNUM)
+- && !IS_INTERRUPT(func_type))
++ && !IS_INTERRUPT (func_type))
+ {
+ asm_fprintf (f, "\tldr\t%r, [%r], #4\n", LR_REGNUM, SP_REGNUM);
+ }
+ else if (saved_regs_mask)
+ {
+- if (saved_regs_mask & (1 << SP_REGNUM))
+- /* Note - write back to the stack register is not enabled
+- (i.e. "ldmfd sp!..."). We know that the stack pointer is
+- in the list of registers and if we add writeback the
+- instruction becomes UNPREDICTABLE. */
+- print_multi_reg (f, "ldmfd\t%r, ", SP_REGNUM, saved_regs_mask,
+- rfe);
+- else if (TARGET_ARM)
+- print_multi_reg (f, "ldmfd\t%r!, ", SP_REGNUM, saved_regs_mask,
+- rfe);
++ gcc_assert ( ! (saved_regs_mask & (1 << SP_REGNUM)));
++ if (TARGET_ARM)
++ if (low_irq_latency)
++ print_pop_reg_by_ldr (f, saved_regs_mask, rfe);
++ else
++ print_multi_reg (f, "ldmfd\t%r!, ", SP_REGNUM, saved_regs_mask,
++ rfe);
+ else
+ print_multi_reg (f, "pop\t", SP_REGNUM, saved_regs_mask, 0);
+ }
+@@ -12389,6 +13687,32 @@
+
+ gcc_assert (num_regs && num_regs <= 16);
+
++ if (low_irq_latency)
++ {
++ rtx insn = 0;
++
++ /* Emit a series of ldr instructions rather rather than a single ldm. */
++ /* TODO: Use ldrd where possible. */
++ gcc_assert (! (mask & (1 << SP_REGNUM)));
++
++ for (i = LAST_ARM_REGNUM; i >= 0; --i)
++ {
++ if (mask & (1 << i))
++
++ {
++ rtx reg, where, mem;
++
++ reg = gen_rtx_REG (SImode, i);
++ where = gen_rtx_PRE_DEC (SImode, stack_pointer_rtx);
++ mem = gen_rtx_MEM (SImode, where);
++ insn = emit_move_insn (mem, reg);
++ RTX_FRAME_RELATED_P (insn) = 1;
++ }
++ }
++
++ return insn;
++ }
++
+ /* We don't record the PC in the dwarf frame information. */
+ num_dwarf_regs = num_regs;
+ if (mask & (1 << PC_REGNUM))
+@@ -12737,22 +14061,23 @@
+ {
+ int reg = -1;
+
+- for (i = 4; i <= (TARGET_THUMB1 ? LAST_LO_REGNUM : 11); i++)
+- {
+- if ((offsets->saved_regs_mask & (1 << i)) == 0)
+- {
+- reg = i;
+- break;
+- }
+- }
+-
+- if (reg == -1 && arm_size_return_regs () <= 12
+- && !crtl->tail_call_emit)
++ /* If it is safe to use r3, then do so. This sometimes
++ generates better code on Thumb-2 by avoiding the need to
++ use 32-bit push/pop instructions. */
++ if (!crtl->tail_call_emit
++ && arm_size_return_regs () <= 12)
+ {
+- /* Push/pop an argument register (r3) if all callee saved
+- registers are already being pushed. */
+ reg = 3;
+ }
++ else
++ for (i = 4; i <= (TARGET_THUMB1 ? LAST_LO_REGNUM : 11); i++)
++ {
++ if ((offsets->saved_regs_mask & (1 << i)) == 0)
++ {
++ reg = i;
++ break;
++ }
++ }
+
+ if (reg != -1)
+ {
+@@ -12876,7 +14201,7 @@
+
+ /* Save any floating point call-saved registers used by this
+ function. */
+- if (arm_fpu_arch == FPUTYPE_FPA_EMU2)
++ if (TARGET_FPA_EMU2)
+ {
+ for (reg = LAST_FPA_REGNUM; reg >= FIRST_FPA_REGNUM; reg--)
+ if (df_regs_ever_live_p (reg) && !call_used_regs[reg])
+@@ -13483,7 +14808,11 @@
+ {
+ fprintf (stream, ", %s ", shift);
+ if (val == -1)
+- arm_print_operand (stream, XEXP (x, 1), 0);
++ {
++ arm_print_operand (stream, XEXP (x, 1), 0);
++ if (janus2_code)
++ fprintf(stream, "\n\tnop");
++ }
+ else
+ fprintf (stream, "#" HOST_WIDE_INT_PRINT_DEC, val);
+ }
+@@ -13704,6 +15033,30 @@
+ }
+ return;
+
++ /* Print the high single-precision register of a VFP double-precision
++ register. */
++ case 'p':
++ {
++ int mode = GET_MODE (x);
++ int regno;
++
++ if (GET_MODE_SIZE (mode) != 8 || GET_CODE (x) != REG)
++ {
++ output_operand_lossage ("invalid operand for code '%c'", code);
++ return;
++ }
++
++ regno = REGNO (x);
++ if (!VFP_REGNO_OK_FOR_DOUBLE (regno))
++ {
++ output_operand_lossage ("invalid operand for code '%c'", code);
++ return;
++ }
++
++ fprintf (stream, "s%d", regno - FIRST_VFP_REGNUM + 1);
++ }
++ return;
++
+ /* Print a VFP/Neon double precision or quad precision register name. */
+ case 'P':
+ case 'q':
+@@ -13821,6 +15174,57 @@
+ }
+ return;
+
++ /* Memory operand for vld1/vst1 instruction. */
++ case 'A':
++ {
++ rtx addr;
++ bool postinc = FALSE;
++ unsigned align;
++
++ gcc_assert (GET_CODE (x) == MEM);
++ addr = XEXP (x, 0);
++ if (GET_CODE (addr) == POST_INC)
++ {
++ postinc = 1;
++ addr = XEXP (addr, 0);
++ }
++ align = MEM_ALIGN (x) >> 3;
++ asm_fprintf (stream, "[%r", REGNO (addr));
++ if (align > GET_MODE_SIZE (GET_MODE (x)))
++ align = GET_MODE_SIZE (GET_MODE (x));
++ if (align >= 8)
++ asm_fprintf (stream, ", :%d", align << 3);
++ asm_fprintf (stream, "]");
++ if (postinc)
++ fputs("!", stream);
++ }
++ return;
++
++ /* Register specifier for vld1.16/vst1.16. Translate the S register
++ number into a D register number and element index. */
++ case 'z':
++ {
++ int mode = GET_MODE (x);
++ int regno;
++
++ if (GET_MODE_SIZE (mode) != 2 || GET_CODE (x) != REG)
++ {
++ output_operand_lossage ("invalid operand for code '%c'", code);
++ return;
++ }
++
++ regno = REGNO (x);
++ if (!VFP_REGNO_OK_FOR_SINGLE (regno))
++ {
++ output_operand_lossage ("invalid operand for code '%c'", code);
++ return;
++ }
++
++ regno = regno - FIRST_VFP_REGNUM;
++ fprintf (stream, "d%d[%d]", regno/2, ((regno % 2) ? 2 : 0));
++ }
++ return;
++
+ default:
+ if (x == 0)
+ {
+@@ -13854,6 +15258,12 @@
+ default:
+ gcc_assert (GET_CODE (x) != NEG);
+ fputc ('#', stream);
++ if (GET_CODE (x) == HIGH)
++ {
++ fputs (":lower16:", stream);
++ x = XEXP (x, 0);
++ }
++
+ output_addr_const (stream, x);
+ break;
+ }
+@@ -14245,6 +15655,10 @@
+ first insn after the following code_label if REVERSE is true. */
+ rtx start_insn = insn;
+
++ /* Don't do this if we're not considering conditional execution. */
++ if (TARGET_NO_SINGLE_COND_EXEC)
++ return;
++
+ /* If in state 4, check if the target branch is reached, in order to
+ change back to state 0. */
+ if (arm_ccfsm_state == 4)
+@@ -14618,6 +16032,11 @@
+ if (mode == DFmode)
+ return VFP_REGNO_OK_FOR_DOUBLE (regno);
+
++ /* VFP registers can hold HFmode values, but there is no point in
++ putting them there unless we have hardware conversion insns. */
++ if (mode == HFmode)
++ return TARGET_FP16 && VFP_REGNO_OK_FOR_SINGLE (regno);
++
+ if (TARGET_NEON)
+ return (VALID_NEON_DREG_MODE (mode) && VFP_REGNO_OK_FOR_DOUBLE (regno))
+ || (VALID_NEON_QREG_MODE (mode)
+@@ -14637,16 +16056,16 @@
+ return mode == SImode;
+
+ if (IS_IWMMXT_REGNUM (regno))
+- return VALID_IWMMXT_REG_MODE (mode);
++ return VALID_IWMMXT_REG_MODE (mode) && mode != SImode;
+ }
+
+- /* We allow any value to be stored in the general registers.
++ /* We allow almost any value to be stored in the general registers.
+ Restrict doubleword quantities to even register pairs so that we can
+- use ldrd. Do not allow Neon structure opaque modes in general registers;
+- they would use too many. */
++ use ldrd. Do not allow very large Neon structure opaque modes in
++ general registers; they would use too many. */
+ if (regno <= LAST_ARM_REGNUM)
+ return !(TARGET_LDRD && GET_MODE_SIZE (mode) > 4 && (regno & 1) != 0)
+- && !VALID_NEON_STRUCT_MODE (mode);
++ && ARM_NUM_REGS (mode) <= 4;
+
+ if (regno == FRAME_POINTER_REGNUM
+ || regno == ARG_POINTER_REGNUM)
+@@ -16103,6 +17522,15 @@
+ }
+
+ static void
++arm_init_fp16_builtins (void)
++{
++ tree fp16_type = make_node (REAL_TYPE);
++ TYPE_PRECISION (fp16_type) = 16;
++ layout_type (fp16_type);
++ (*lang_hooks.types.register_builtin_type) (fp16_type, "__fp16");
++}
++
++static void
+ arm_init_builtins (void)
+ {
+ arm_init_tls_builtins ();
+@@ -16112,6 +17540,71 @@
+
+ if (TARGET_NEON)
+ arm_init_neon_builtins ();
++
++ if (arm_fp16_format)
++ arm_init_fp16_builtins ();
++}
++
++/* Implement TARGET_INVALID_PARAMETER_TYPE. */
++
++static const char *
++arm_invalid_parameter_type (const_tree t)
++{
++ if (SCALAR_FLOAT_TYPE_P (t) && TYPE_PRECISION (t) == 16)
++ return N_("function parameters cannot have __fp16 type");
++ return NULL;
++}
++
++/* Implement TARGET_INVALID_PARAMETER_TYPE. */
++
++static const char *
++arm_invalid_return_type (const_tree t)
++{
++ if (SCALAR_FLOAT_TYPE_P (t) && TYPE_PRECISION (t) == 16)
++ return N_("functions cannot return __fp16 type");
++ return NULL;
++}
++
++/* Implement TARGET_PROMOTED_TYPE. */
++
++static tree
++arm_promoted_type (const_tree t)
++{
++ if (SCALAR_FLOAT_TYPE_P (t) && TYPE_PRECISION (t) == 16)
++ return float_type_node;
++ return NULL_TREE;
++}
++
++/* Implement TARGET_CONVERT_TO_TYPE.
++ Specifically, this hook implements the peculiarity of the ARM
++ half-precision floating-point C semantics that requires conversions between
++ __fp16 to or from double to do an intermediate conversion to float. */
++
++static tree
++arm_convert_to_type (tree type, tree expr)
++{
++ tree fromtype = TREE_TYPE (expr);
++ if (!SCALAR_FLOAT_TYPE_P (fromtype) || !SCALAR_FLOAT_TYPE_P (type))
++ return NULL_TREE;
++ if ((TYPE_PRECISION (fromtype) == 16 && TYPE_PRECISION (type) > 32)
++ || (TYPE_PRECISION (type) == 16 && TYPE_PRECISION (fromtype) > 32))
++ return convert (type, convert (float_type_node, expr));
++ return NULL_TREE;
++}
++
++/* Implement TARGET_SCALAR_MODE_SUPPORTED_P.
++ This simply adds HFmode as a supported mode; even though we don't
++ implement arithmetic on this type directly, it's supported by
++ optabs conversions, much the way the double-word arithmetic is
++ special-cased in the default hook. */
++
++static bool
++arm_scalar_mode_supported_p (enum machine_mode mode)
++{
++ if (mode == HFmode)
++ return (arm_fp16_format != ARM_FP16_FORMAT_NONE);
++ else
++ return default_scalar_mode_supported_p (mode);
+ }
+
+ /* Errors in the source file can cause expand_expr to return const0_rtx
+@@ -17191,6 +18684,7 @@
+ unsigned HOST_WIDE_INT mask = 0xff;
+ int i;
+
++ val = val & (unsigned HOST_WIDE_INT)0xffffffffu;
+ if (val == 0) /* XXX */
+ return 0;
+
+@@ -18279,40 +19773,8 @@
+ else
+ {
+ int set_float_abi_attributes = 0;
+- switch (arm_fpu_arch)
+- {
+- case FPUTYPE_FPA:
+- fpu_name = "fpa";
+- break;
+- case FPUTYPE_FPA_EMU2:
+- fpu_name = "fpe2";
+- break;
+- case FPUTYPE_FPA_EMU3:
+- fpu_name = "fpe3";
+- break;
+- case FPUTYPE_MAVERICK:
+- fpu_name = "maverick";
+- break;
+- case FPUTYPE_VFP:
+- fpu_name = "vfp";
+- set_float_abi_attributes = 1;
+- break;
+- case FPUTYPE_VFP3D16:
+- fpu_name = "vfpv3-d16";
+- set_float_abi_attributes = 1;
+- break;
+- case FPUTYPE_VFP3:
+- fpu_name = "vfpv3";
+- set_float_abi_attributes = 1;
+- break;
+- case FPUTYPE_NEON:
+- fpu_name = "neon";
+- set_float_abi_attributes = 1;
+- break;
+- default:
+- abort();
+- }
+- if (set_float_abi_attributes)
++ fpu_name = arm_fpu_desc->name;
++ if (arm_fp_model == ARM_FP_MODEL_VFP)
+ {
+ if (TARGET_HARD_FLOAT)
+ asm_fprintf (asm_out_file, "\t.eabi_attribute 27, 3\n");
+@@ -18362,6 +19824,11 @@
+ val = 6;
+ asm_fprintf (asm_out_file, "\t.eabi_attribute 30, %d\n", val);
+
++ /* Tag_ABI_FP_16bit_format. */
++ if (arm_fp16_format)
++ asm_fprintf (asm_out_file, "\t.eabi_attribute 38, %d\n",
++ (int)arm_fp16_format);
++
+ if (arm_lang_output_object_attributes_hook)
+ arm_lang_output_object_attributes_hook();
+ }
+@@ -18591,6 +20058,23 @@
+ return 1;
+ }
+
++/* Emit a fp16 constant appropriately padded to occupy a 4-byte word.
++ HFmode constant pool entries are actually loaded with ldr. */
++void
++arm_emit_fp16_const (rtx c)
++{
++ REAL_VALUE_TYPE r;
++ long bits;
++
++ REAL_VALUE_FROM_CONST_DOUBLE (r, c);
++ bits = real_to_target (NULL, &r, HFmode);
++ if (WORDS_BIG_ENDIAN)
++ assemble_zeros (2);
++ assemble_integer (GEN_INT (bits), 2, BITS_PER_WORD, 1);
++ if (!WORDS_BIG_ENDIAN)
++ assemble_zeros (2);
++}
++
+ const char *
+ arm_output_load_gr (rtx *operands)
+ {
+@@ -18628,19 +20112,24 @@
+ that way. */
+
+ static void
+-arm_setup_incoming_varargs (CUMULATIVE_ARGS *cum,
++arm_setup_incoming_varargs (CUMULATIVE_ARGS *pcum,
+ enum machine_mode mode,
+ tree type,
+ int *pretend_size,
+ int second_time ATTRIBUTE_UNUSED)
+ {
+- int nregs = cum->nregs;
+- if (nregs & 1
+- && ARM_DOUBLEWORD_ALIGN
+- && arm_needs_doubleword_align (mode, type))
+- nregs++;
+-
++ int nregs;
++
+ cfun->machine->uses_anonymous_args = 1;
++ if (pcum->pcs_variant <= ARM_PCS_AAPCS_LOCAL)
++ {
++ nregs = pcum->aapcs_ncrn;
++ if ((nregs & 1) && arm_needs_doubleword_align (mode, type))
++ nregs++;
++ }
++ else
++ nregs = pcum->nregs;
++
+ if (nregs < NUM_ARG_REGS)
+ *pretend_size = (NUM_ARG_REGS - nregs) * UNITS_PER_WORD;
+ }
+@@ -19024,9 +20513,10 @@
+ || mode == V16QImode || mode == V4SFmode || mode == V2DImode))
+ return true;
+
+- if ((mode == V2SImode)
+- || (mode == V4HImode)
+- || (mode == V8QImode))
++ if ((TARGET_NEON || TARGET_IWMMXT)
++ && ((mode == V2SImode)
++ || (mode == V4HImode)
++ || (mode == V8QImode)))
+ return true;
+
+ return false;
+@@ -19057,9 +20547,14 @@
+ if (IS_FPA_REGNUM (regno))
+ return (TARGET_AAPCS_BASED ? 96 : 16) + regno - FIRST_FPA_REGNUM;
+
+- /* FIXME: VFPv3 register numbering. */
+ if (IS_VFP_REGNUM (regno))
+- return 64 + regno - FIRST_VFP_REGNUM;
++ {
++ /* See comment in arm_dwarf_register_span. */
++ if (VFP_REGNO_OK_FOR_SINGLE (regno))
++ return 64 + regno - FIRST_VFP_REGNUM;
++ else
++ return 256 + (regno - FIRST_VFP_REGNUM) / 2;
++ }
+
+ if (IS_IWMMXT_GR_REGNUM (regno))
+ return 104 + regno - FIRST_IWMMXT_GR_REGNUM;
+@@ -19070,6 +20565,39 @@
+ gcc_unreachable ();
+ }
+
++/* Dwarf models VFPv3 registers as 32 64-bit registers.
++ GCC models tham as 64 32-bit registers, so we need to describe this to
++ the DWARF generation code. Other registers can use the default. */
++static rtx
++arm_dwarf_register_span(rtx rtl)
++{
++ unsigned regno;
++ int nregs;
++ int i;
++ rtx p;
++
++ regno = REGNO (rtl);
++ if (!IS_VFP_REGNUM (regno))
++ return NULL_RTX;
++
++ /* The EABI defines two VFP register ranges:
++ 64-95: Legacy VFPv2 numbering for S0-S31 (obsolescent)
++ 256-287: D0-D31
++ The recommended encodings for s0-s31 is a DW_OP_bit_piece of the
++ corresponding D register. However gdb6.6 does not support this, so
++ we use the legacy encodings. We also use these encodings for D0-D15
++ for compatibility with older debuggers. */
++ if (VFP_REGNO_OK_FOR_SINGLE (regno))
++ return NULL_RTX;
++
++ nregs = GET_MODE_SIZE (GET_MODE (rtl)) / 8;
++ p = gen_rtx_PARALLEL (VOIDmode, rtvec_alloc(nregs));
++ regno = (regno - FIRST_VFP_REGNUM) / 2;
++ for (i = 0; i < nregs; i++)
++ XVECEXP (p, 0, i) = gen_rtx_REG (DImode, 256 + regno + i);
++
++ return p;
++}
+
+ #ifdef TARGET_UNWIND_INFO
+ /* Emit unwind directives for a store-multiple instruction or stack pointer
+@@ -19556,6 +21084,7 @@
+ case cortexr4f:
+ case cortexa8:
+ case cortexa9:
++ case marvell_f:
+ return 2;
+
+ default:
+@@ -19620,6 +21149,10 @@
+ return "St9__va_list";
+ }
+
++ /* Half-precision float. */
++ if (TREE_CODE (type) == REAL_TYPE && TYPE_PRECISION (type) == 16)
++ return "Dh";
++
+ if (TREE_CODE (type) != VECTOR_TYPE)
+ return NULL;
+
+@@ -19676,6 +21209,86 @@
+ given on the command line. */
+ if (level > 0)
+ flag_section_anchors = 2;
++
++ if (size)
++ {
++ /* Select optimizations that are a win for code size.
++
++ The inlining options set below have two important
++ consequences for functions not explicitly marked
++ inline:
++ - Static functions used once are inlined if
++ sufficiently small. Static functions used twice
++ are not inlined.
++ - Non-static functions are never inlined.
++ So in effect, inlining will never cause two copies
++ of function bodies to be created. */
++ /* Empirical results show that these options benefit code
++ size on arm. */
++ /* FIXME: -fsee seems to be broken for Thumb-2. */
++ /* flag_see = 1; */
++ flag_move_loop_invariants = 0;
++ /* In Thumb mode the function call code size overhead is typically very
++ small, and narrow branch instructions have very limited range.
++ Inlining even medium sized functions tends to bloat the caller and
++ require the use of long branch instructions. On average the long
++ branches cost more than eliminating the function call overhead saves,
++ so we use extremely restrictive automatic inlining heuristics. In ARM
++ mode the results are fairly neutral, probably due to better constant
++ pool placement. */
++ set_param_value ("max-inline-insns-single", 1);
++ set_param_value ("max-inline-insns-auto", 1);
++ }
++ else
++ {
++ /* CSL LOCAL */
++ /* Set flag_unroll_loops to a default value, so that we can tell
++ if it was specified on the command line; see
++ arm_override_options. */
++ flag_unroll_loops = 2;
++ /* Promote loop indices to int where possible. Consider moving this
++ to -Os, also. */
++ flag_promote_loop_indices = 1;
++ }
++}
++
++/* Return how many instructions to look ahead for better insn
++ scheduling. */
++static int
++arm_multipass_dfa_lookahead (void)
++{
++ return (arm_tune == marvell_f) ? 4 : 0;
++}
++
++/* Return the minimum alignment required to load or store a
++ vector of the given type, which may be less than the
++ natural alignment of the type. */
++
++static int
++arm_vector_min_alignment (const_tree type)
++{
++ if (TARGET_NEON)
++ {
++ /* The NEON element load and store instructions only require the
++ alignment of the element type. They can benefit from higher
++ statically reported alignment, but we do not take advantage
++ of that yet. */
++ gcc_assert (TREE_CODE (type) == VECTOR_TYPE);
++ return TYPE_ALIGN_UNIT (TREE_TYPE (type));
++ }
++
++ return default_vector_min_alignment (type);
++}
++
++static bool
++arm_vector_always_misalign(const_tree type ATTRIBUTE_UNUSED)
++{
++ /* On big-endian targets array loads (vld1) and vector loads (vldm)
++ use a different format. Always use the "misaligned" array variant.
++ FIXME: this still doesn't work for big-endian because of constant
++ loads and other operations using vldm ordering. See
++ issue 6722. */
++ return TARGET_NEON && !BYTES_BIG_ENDIAN;
+ }
+
+ #include "gt-arm.h"
+diff -Nur a/gcc/config/arm/arm-cores.def b/gcc/config/arm/arm-cores.def
+--- a/gcc/config/arm/arm-cores.def 2009-02-20 16:20:38.000000000 +0100
++++ b/gcc/config/arm/arm-cores.def 2010-01-25 09:50:28.975687047 +0100
+@@ -104,6 +104,7 @@
+ ARM_CORE("xscale", xscale, 5TE, FL_LDSCHED | FL_STRONG | FL_XSCALE, xscale)
+ ARM_CORE("iwmmxt", iwmmxt, 5TE, FL_LDSCHED | FL_STRONG | FL_XSCALE | FL_IWMMXT, xscale)
+ ARM_CORE("iwmmxt2", iwmmxt2, 5TE, FL_LDSCHED | FL_STRONG | FL_XSCALE | FL_IWMMXT, xscale)
++ARM_CORE("marvell-f", marvell_f, 5TE, FL_LDSCHED | FL_VFPV2 | FL_MARVELL_F, 9e)
+
+ /* V5TEJ Architecture Processors */
+ ARM_CORE("arm926ej-s", arm926ejs, 5TEJ, FL_LDSCHED, 9e)
+@@ -117,9 +118,13 @@
+ ARM_CORE("mpcorenovfp", mpcorenovfp, 6K, FL_LDSCHED, 9e)
+ ARM_CORE("mpcore", mpcore, 6K, FL_LDSCHED | FL_VFPV2, 9e)
+ ARM_CORE("arm1156t2-s", arm1156t2s, 6T2, FL_LDSCHED, 9e)
++
++/* V7 Architecture Processors */
++ARM_CORE("cortex-a5", cortexa5, 7A, FL_LDSCHED, 9e)
+ ARM_CORE("cortex-a8", cortexa8, 7A, FL_LDSCHED, 9e)
+ ARM_CORE("cortex-a9", cortexa9, 7A, FL_LDSCHED, 9e)
+ ARM_CORE("cortex-r4", cortexr4, 7R, FL_LDSCHED, 9e)
+ ARM_CORE("cortex-r4f", cortexr4f, 7R, FL_LDSCHED, 9e)
+ ARM_CORE("cortex-m3", cortexm3, 7M, FL_LDSCHED, 9e)
+ ARM_CORE("cortex-m1", cortexm1, 6M, FL_LDSCHED, 9e)
++ARM_CORE("cortex-m0", cortexm0, 6M, FL_LDSCHED, 9e)
+diff -Nur a/gcc/config/arm/arm.h b/gcc/config/arm/arm.h
+--- a/gcc/config/arm/arm.h 2009-04-23 02:31:13.000000000 +0200
++++ b/gcc/config/arm/arm.h 2010-01-25 09:50:28.975687047 +0100
+@@ -85,6 +85,10 @@
+ builtin_define ("__IWMMXT__"); \
+ if (TARGET_AAPCS_BASED) \
+ builtin_define ("__ARM_EABI__"); \
++ if (arm_tune_marvell_f) \
++ builtin_define ("__ARM_TUNE_MARVELL_F__"); \
++ if (low_irq_latency) \
++ builtin_define ("__low_irq_latency__"); \
+ } while (0)
+
+ /* The various ARM cores. */
+@@ -199,6 +203,13 @@
+ #define TARGET_AAPCS_BASED \
+ (arm_abi != ARM_ABI_APCS && arm_abi != ARM_ABI_ATPCS)
+
++/* True if we should avoid generating conditional execution instructions. */
++#define TARGET_NO_COND_EXEC (arm_tune_marvell_f && !optimize_size)
++/* Avoid most conditional instructions, but allow pairs with opposite
++ conditions and the same destination. */
++#define TARGET_NO_SINGLE_COND_EXEC \
++ ((arm_tune_cortex_a9 || arm_tune_marvell_f) && !optimize_size)
++
+ #define TARGET_HARD_TP (target_thread_pointer == TP_CP15)
+ #define TARGET_SOFT_TP (target_thread_pointer == TP_SOFT)
+
+@@ -211,35 +222,43 @@
+ /* Thumb-1 only. */
+ #define TARGET_THUMB1_ONLY (TARGET_THUMB1 && !arm_arch_notm)
+
++#define TARGET_FPA_EMU2 (TARGET_FPA && arm_fpu_desc->rev == 2)
+ /* The following two macros concern the ability to execute coprocessor
+ instructions for VFPv3 or NEON. TARGET_VFP3/TARGET_VFPD32 are currently
+ only ever tested when we know we are generating for VFP hardware; we need
+ to be more careful with TARGET_NEON as noted below. */
+
+ /* FPU is has the full VFPv3/NEON register file of 32 D registers. */
+-#define TARGET_VFPD32 (arm_fp_model == ARM_FP_MODEL_VFP \
+- && (arm_fpu_arch == FPUTYPE_VFP3 \
+- || arm_fpu_arch == FPUTYPE_NEON))
++#define TARGET_VFPD32 (TARGET_VFP && arm_arch_vfp_regs == VFP_REG_D32)
+
+ /* FPU supports VFPv3 instructions. */
+-#define TARGET_VFP3 (arm_fp_model == ARM_FP_MODEL_VFP \
+- && (arm_fpu_arch == FPUTYPE_VFP3D16 \
+- || TARGET_VFPD32))
++#define TARGET_VFP3 (TARGET_VFP && arm_arch_vfp_rev >= 3)
++
++/* FPU only supports VFP single-precision instructions. */
++#define TARGET_VFP_SINGLE (TARGET_VFP && arm_arch_vfp_regs == VFP_REG_SINGLE)
++
++/* FPU supports VFP double-precision instructions. */
++#define TARGET_VFP_DOUBLE (TARGET_VFP && arm_arch_vfp_regs != VFP_REG_SINGLE)
++
++/* FPU supports half-precision floating-point with NEON element load/store. */
++#define TARGET_NEON_FP16 (TARGET_VFP && arm_arch_vfp_neon && arm_arch_vfp_fp16)
++
++/* FPU supports VFP half-precision floating-point. */
++#define TARGET_FP16 (TARGET_VFP && arm_arch_vfp_fp16)
+
+ /* FPU supports Neon instructions. The setting of this macro gets
+ revealed via __ARM_NEON__ so we add extra guards upon TARGET_32BIT
+ and TARGET_HARD_FLOAT to ensure that NEON instructions are
+ available. */
+ #define TARGET_NEON (TARGET_32BIT && TARGET_HARD_FLOAT \
+- && arm_fp_model == ARM_FP_MODEL_VFP \
+- && arm_fpu_arch == FPUTYPE_NEON)
++ && TARGET_VFP && arm_arch_vfp_neon)
+
+ /* "DSP" multiply instructions, eg. SMULxy. */
+ #define TARGET_DSP_MULTIPLY \
+- (TARGET_32BIT && arm_arch5e && arm_arch_notm)
++ (TARGET_32BIT && arm_arch5e && (arm_arch_notm || arm_arch7em))
+ /* Integer SIMD instructions, and extend-accumulate instructions. */
+ #define TARGET_INT_SIMD \
+- (TARGET_32BIT && arm_arch6 && arm_arch_notm)
++ (TARGET_32BIT && arm_arch6 && (arm_arch_notm || arm_arch7em))
+
+ /* Should MOVW/MOVT be used in preference to a constant pool. */
+ #define TARGET_USE_MOVT (arm_arch_thumb2 && !optimize_size)
+@@ -289,40 +308,30 @@
+ ARM_FP_MODEL_VFP
+ };
+
+-extern enum arm_fp_model arm_fp_model;
+-
+-/* Which floating point hardware is available. Also update
+- fp_model_for_fpu in arm.c when adding entries to this list. */
+-enum fputype
+-{
+- /* No FP hardware. */
+- FPUTYPE_NONE,
+- /* Full FPA support. */
+- FPUTYPE_FPA,
+- /* Emulated FPA hardware, Issue 2 emulator (no LFM/SFM). */
+- FPUTYPE_FPA_EMU2,
+- /* Emulated FPA hardware, Issue 3 emulator. */
+- FPUTYPE_FPA_EMU3,
+- /* Cirrus Maverick floating point co-processor. */
+- FPUTYPE_MAVERICK,
+- /* VFP. */
+- FPUTYPE_VFP,
+- /* VFPv3-D16. */
+- FPUTYPE_VFP3D16,
+- /* VFPv3. */
+- FPUTYPE_VFP3,
+- /* Neon. */
+- FPUTYPE_NEON
++enum vfp_reg_type {
++ VFP_REG_D16,
++ VFP_REG_D32,
++ VFP_REG_SINGLE
+ };
+
+-/* Recast the floating point class to be the floating point attribute. */
+-#define arm_fpu_attr ((enum attr_fpu) arm_fpu_tune)
+-
+-/* What type of floating point to tune for */
+-extern enum fputype arm_fpu_tune;
++extern const struct arm_fpu_desc
++{
++ const char *name;
++ enum arm_fp_model model;
++ int rev;
++ enum vfp_reg_type myregs;
++ int neon;
++ int fp16;
++} *arm_fpu_desc;
++
++#define arm_fp_model arm_fpu_desc->model
++#define arm_arch_vfp_rev arm_fpu_desc->rev
++#define arm_arch_vfp_regs arm_fpu_desc->myregs
++#define arm_arch_vfp_neon arm_fpu_desc->neon
++#define arm_arch_vfp_fp16 arm_fpu_desc->fp16
+
+-/* What type of floating point instructions are available */
+-extern enum fputype arm_fpu_arch;
++/* Which floating point hardware to schedule for. */
++extern int arm_fpu_attr;
+
+ enum float_abi_type
+ {
+@@ -337,6 +346,21 @@
+ #define TARGET_DEFAULT_FLOAT_ABI ARM_FLOAT_ABI_SOFT
+ #endif
+
++/* Which __fp16 format to use.
++ The enumeration values correspond to the numbering for the
++ Tag_ABI_FP_16bit_format attribute.
++ */
++enum arm_fp16_format_type
++{
++ ARM_FP16_FORMAT_NONE = 0,
++ ARM_FP16_FORMAT_IEEE = 1,
++ ARM_FP16_FORMAT_ALTERNATIVE = 2
++};
++
++extern enum arm_fp16_format_type arm_fp16_format;
++#define LARGEST_EXPONENT_IS_NORMAL(bits) \
++ ((bits) == 16 && arm_fp16_format == ARM_FP16_FORMAT_ALTERNATIVE)
++
+ /* Which ABI to use. */
+ enum arm_abi_type
+ {
+@@ -383,12 +407,18 @@
+ /* Nonzero if instructions not present in the 'M' profile can be used. */
+ extern int arm_arch_notm;
+
++/* Nonzero if instructions present in ARMv7E-M can be used. */
++extern int arm_arch7em;
++
+ /* Nonzero if this chip can benefit from load scheduling. */
+ extern int arm_ld_sched;
+
+ /* Nonzero if generating thumb code. */
+ extern int thumb_code;
+
++/* Nonzero if generating Janus2 code. */
++extern int janus2_code;
++
+ /* Nonzero if this chip is a StrongARM. */
+ extern int arm_tune_strongarm;
+
+@@ -404,6 +434,9 @@
+ /* Nonzero if tuning for XScale. */
+ extern int arm_tune_xscale;
+
++/* Nonzero if tuning for Marvell Feroceon. */
++extern int arm_tune_marvell_f;
++
+ /* Nonzero if tuning for stores via the write buffer. */
+ extern int arm_tune_wbuf;
+
+@@ -423,6 +456,10 @@
+ /* Nonzero if chip supports integer division instruction. */
+ extern int arm_arch_hwdiv;
+
++/* Nonzero if we should minimize interrupt latency of the
++ generated code. */
++extern int low_irq_latency;
++
+ #ifndef TARGET_DEFAULT
+ #define TARGET_DEFAULT (MASK_APCS_FRAME)
+ #endif
+@@ -757,12 +794,11 @@
+ fixed_regs[regno] = call_used_regs[regno] = 1; \
+ } \
+ \
+- if (TARGET_THUMB && optimize_size) \
+- { \
+- /* When optimizing for size, it's better not to use \
+- the HI regs, because of the overhead of stacking \
+- them. */ \
+- /* ??? Is this still true for thumb2? */ \
++ if (TARGET_THUMB1 && optimize_size) \
++ { \
++ /* When optimizing for size on Thumb-1, it's better not \
++ to use the HI regs, because of the overhead of \
++ stacking them. */ \
+ for (regno = FIRST_HI_REGNUM; \
+ regno <= LAST_HI_REGNUM; ++regno) \
+ fixed_regs[regno] = call_used_regs[regno] = 1; \
+@@ -881,6 +917,9 @@
+ /* The number of (integer) argument register available. */
+ #define NUM_ARG_REGS 4
+
++/* And similarly for the VFP. */
++#define NUM_VFP_ARG_REGS 16
++
+ /* Return the register number of the N'th (integer) argument. */
+ #define ARG_REGISTER(N) (N - 1)
+
+@@ -1059,7 +1098,7 @@
+ (GET_MODE_CLASS (MODE1) == GET_MODE_CLASS (MODE2))
+
+ #define VALID_IWMMXT_REG_MODE(MODE) \
+- (arm_vector_mode_supported_p (MODE) || (MODE) == DImode)
++ (arm_vector_mode_supported_p (MODE) || (MODE) == DImode || (MODE) == SImode)
+
+ /* Modes valid for Neon D registers. */
+ #define VALID_NEON_DREG_MODE(MODE) \
+@@ -1230,11 +1269,14 @@
+ || reg_classes_intersect_p (VFP_REGS, (CLASS)) \
+ : 0)
+
+-/* We need to define this for LO_REGS on thumb. Otherwise we can end up
+- using r0-r4 for function arguments, r7 for the stack frame and don't
+- have enough left over to do doubleword arithmetic. */
++/* We need to define this for LO_REGS on Thumb-1. Otherwise we can end up
++ using r0-r4 for function arguments, r7 for the stack frame and don't have
++ enough left over to do doubleword arithmetic. For Thumb-2 all the
++ potentially problematic instructions accept high registers so this is not
++ necessary. Care needs to be taken to avoid adding new Thumb-2 patterns
++ that require many low registers. */
+ #define CLASS_LIKELY_SPILLED_P(CLASS) \
+- ((TARGET_THUMB && (CLASS) == LO_REGS) \
++ ((TARGET_THUMB1 && (CLASS) == LO_REGS) \
+ || (CLASS) == CC_REG)
+
+ /* The class value for index registers, and the one for base regs. */
+@@ -1245,7 +1287,7 @@
+ when addressing quantities in QI or HI mode; if we don't know the
+ mode, then we must be conservative. */
+ #define MODE_BASE_REG_CLASS(MODE) \
+- (TARGET_32BIT ? CORE_REGS : \
++ (TARGET_32BIT ? (TARGET_THUMB2 ? LO_REGS : CORE_REGS) : \
+ (((MODE) == SImode) ? BASE_REGS : LO_REGS))
+
+ /* For Thumb we can not support SP+reg addressing, so we return LO_REGS
+@@ -1346,6 +1388,9 @@
+ else if (TARGET_MAVERICK && TARGET_HARD_FLOAT) \
+ /* Need to be careful, -256 is not a valid offset. */ \
+ low = val >= 0 ? (val & 0xff) : -((-val) & 0xff); \
++ else if (TARGET_REALLY_IWMMXT && MODE == SImode) \
++ /* Need to be careful, -1024 is not a valid offset. */ \
++ low = val >= 0 ? (val & 0x3ff) : -((-val) & 0x3ff); \
+ else if (MODE == SImode \
+ || (MODE == SFmode && TARGET_SOFT_FLOAT) \
+ || ((MODE == HImode || MODE == QImode) && ! arm_arch4)) \
+@@ -1416,13 +1461,17 @@
+ /* If defined, gives a class of registers that cannot be used as the
+ operand of a SUBREG that changes the mode of the object illegally. */
+
+-/* Moves between FPA_REGS and GENERAL_REGS are two memory insns. */
++/* Moves between FPA_REGS and GENERAL_REGS are two memory insns.
++ Moves between VFP_REGS and GENERAL_REGS are a single insn, but
++ it is typically more expensive than a single memory access. We set
++ the cost to less than two memory accesses so that floating
++ point to integer conversion does not go through memory. */
+ #define REGISTER_MOVE_COST(MODE, FROM, TO) \
+ (TARGET_32BIT ? \
+ ((FROM) == FPA_REGS && (TO) != FPA_REGS ? 20 : \
+ (FROM) != FPA_REGS && (TO) == FPA_REGS ? 20 : \
+- IS_VFP_CLASS (FROM) && !IS_VFP_CLASS (TO) ? 10 : \
+- !IS_VFP_CLASS (FROM) && IS_VFP_CLASS (TO) ? 10 : \
++ IS_VFP_CLASS (FROM) && !IS_VFP_CLASS (TO) ? 15 : \
++ !IS_VFP_CLASS (FROM) && IS_VFP_CLASS (TO) ? 15 : \
+ (FROM) == IWMMXT_REGS && (TO) != IWMMXT_REGS ? 4 : \
+ (FROM) != IWMMXT_REGS && (TO) == IWMMXT_REGS ? 4 : \
+ (FROM) == IWMMXT_GR_REGS || (TO) == IWMMXT_GR_REGS ? 20 : \
+@@ -1491,9 +1540,10 @@
+
+ /* Define how to find the value returned by a library function
+ assuming the value has mode MODE. */
+-#define LIBCALL_VALUE(MODE) \
+- (TARGET_32BIT && TARGET_HARD_FLOAT_ABI && TARGET_FPA \
+- && GET_MODE_CLASS (MODE) == MODE_FLOAT \
++#define LIBCALL_VALUE(MODE) \
++ (TARGET_AAPCS_BASED ? aapcs_libcall_value (MODE) \
++ : (TARGET_32BIT && TARGET_HARD_FLOAT_ABI && TARGET_FPA \
++ && GET_MODE_CLASS (MODE) == MODE_FLOAT) \
+ ? gen_rtx_REG (MODE, FIRST_FPA_REGNUM) \
+ : TARGET_32BIT && TARGET_HARD_FLOAT_ABI && TARGET_MAVERICK \
+ && GET_MODE_CLASS (MODE) == MODE_FLOAT \
+@@ -1502,22 +1552,16 @@
+ ? gen_rtx_REG (MODE, FIRST_IWMMXT_REGNUM) \
+ : gen_rtx_REG (MODE, ARG_REGISTER (1)))
+
+-/* Define how to find the value returned by a function.
+- VALTYPE is the data type of the value (as a tree).
+- If the precise function being called is known, FUNC is its FUNCTION_DECL;
+- otherwise, FUNC is 0. */
+-#define FUNCTION_VALUE(VALTYPE, FUNC) \
+- arm_function_value (VALTYPE, FUNC);
+-
+-/* 1 if N is a possible register number for a function value.
+- On the ARM, only r0 and f0 can return results. */
+-/* On a Cirrus chip, mvf0 can return results. */
+-#define FUNCTION_VALUE_REGNO_P(REGNO) \
+- ((REGNO) == ARG_REGISTER (1) \
+- || (TARGET_32BIT && ((REGNO) == FIRST_CIRRUS_FP_REGNUM) \
+- && TARGET_HARD_FLOAT_ABI && TARGET_MAVERICK) \
+- || ((REGNO) == FIRST_IWMMXT_REGNUM && TARGET_IWMMXT_ABI) \
+- || (TARGET_32BIT && ((REGNO) == FIRST_FPA_REGNUM) \
++/* 1 if REGNO is a possible register number for a function value. */
++#define FUNCTION_VALUE_REGNO_P(REGNO) \
++ ((REGNO) == ARG_REGISTER (1) \
++ || (TARGET_AAPCS_BASED && TARGET_32BIT \
++ && TARGET_VFP && TARGET_HARD_FLOAT \
++ && (REGNO) == FIRST_VFP_REGNUM) \
++ || (TARGET_32BIT && ((REGNO) == FIRST_CIRRUS_FP_REGNUM) \
++ && TARGET_HARD_FLOAT_ABI && TARGET_MAVERICK) \
++ || ((REGNO) == FIRST_IWMMXT_REGNUM && TARGET_IWMMXT_ABI) \
++ || (TARGET_32BIT && ((REGNO) == FIRST_FPA_REGNUM) \
+ && TARGET_HARD_FLOAT_ABI && TARGET_FPA))
+
+ /* Amount of memory needed for an untyped call to save all possible return
+@@ -1617,9 +1661,27 @@
+ that is in text_section. */
+ extern GTY(()) rtx thumb_call_via_label[14];
+
++/* The number of potential ways of assigning to a co-processor. */
++#define ARM_NUM_COPROC_SLOTS 1
++
++/* Enumeration of procedure calling standard variants. We don't really
++ support all of these yet. */
++enum arm_pcs
++{
++ ARM_PCS_AAPCS, /* Base standard AAPCS. */
++ ARM_PCS_AAPCS_VFP, /* Use VFP registers for floating point values. */
++ ARM_PCS_AAPCS_IWMMXT, /* Use iWMMXT registers for vectors. */
++ /* This must be the last AAPCS variant. */
++ ARM_PCS_AAPCS_LOCAL, /* Private call within this compilation unit. */
++ ARM_PCS_ATPCS, /* ATPCS. */
++ ARM_PCS_APCS, /* APCS (legacy Linux etc). */
++ ARM_PCS_UNKNOWN
++};
++
++/* We can't define this inside a generator file because it needs enum
++ machine_mode. */
+ /* A C type for declaring a variable that is used as the first argument of
+- `FUNCTION_ARG' and other related values. For some target machines, the
+- type `int' suffices and can hold the number of bytes of argument so far. */
++ `FUNCTION_ARG' and other related values. */
+ typedef struct
+ {
+ /* This is the number of registers of arguments scanned so far. */
+@@ -1628,9 +1690,33 @@
+ int iwmmxt_nregs;
+ int named_count;
+ int nargs;
+- int can_split;
++ /* Which procedure call variant to use for this call. */
++ enum arm_pcs pcs_variant;
++
++ /* AAPCS related state tracking. */
++ int aapcs_arg_processed; /* No need to lay out this argument again. */
++ int aapcs_cprc_slot; /* Index of co-processor rules to handle
++ this argument, or -1 if using core
++ registers. */
++ int aapcs_ncrn;
++ int aapcs_next_ncrn;
++ rtx aapcs_reg; /* Register assigned to this argument. */
++ int aapcs_partial; /* How many bytes are passed in regs (if
++ split between core regs and stack.
++ Zero otherwise. */
++ int aapcs_cprc_failed[ARM_NUM_COPROC_SLOTS];
++ int can_split; /* Argument can be split between core regs
++ and the stack. */
++ /* Private data for tracking VFP register allocation */
++ unsigned aapcs_vfp_regs_free;
++ unsigned aapcs_vfp_reg_alloc;
++ int aapcs_vfp_rcount;
++ /* Can't include insn-modes.h because this header is needed before we
++ generate it. */
++ int /* enum machine_mode */ aapcs_vfp_rmode;
+ } CUMULATIVE_ARGS;
+
++
+ /* Define where to put the arguments to a function.
+ Value is zero to push the argument on the stack,
+ or a hard register in which to store the argument.
+@@ -1674,13 +1760,7 @@
+ of mode MODE and data type TYPE.
+ (TYPE is null for libcalls where that information may not be available.) */
+ #define FUNCTION_ARG_ADVANCE(CUM, MODE, TYPE, NAMED) \
+- (CUM).nargs += 1; \
+- if (arm_vector_mode_supported_p (MODE) \
+- && (CUM).named_count > (CUM).nargs \
+- && TARGET_IWMMXT_ABI) \
+- (CUM).iwmmxt_nregs += 1; \
+- else \
+- (CUM).nregs += ARM_NUM_REGS2 (MODE, TYPE)
++ arm_function_arg_advance (&(CUM), (MODE), (TYPE), (NAMED))
+
+ /* If defined, a C expression that gives the alignment boundary, in bits, of an
+ argument with the specified mode and type. If it is not defined,
+@@ -1692,9 +1772,11 @@
+
+ /* 1 if N is a possible register number for function argument passing.
+ On the ARM, r0-r3 are used to pass args. */
+-#define FUNCTION_ARG_REGNO_P(REGNO) \
+- (IN_RANGE ((REGNO), 0, 3) \
+- || (TARGET_IWMMXT_ABI \
++#define FUNCTION_ARG_REGNO_P(REGNO) \
++ (IN_RANGE ((REGNO), 0, 3) \
++ || (TARGET_AAPCS_BASED && TARGET_VFP && TARGET_HARD_FLOAT \
++ && IN_RANGE ((REGNO), FIRST_VFP_REGNUM, FIRST_VFP_REGNUM + 15)) \
++ || (TARGET_IWMMXT_ABI \
+ && IN_RANGE ((REGNO), FIRST_IWMMXT_REGNUM, FIRST_IWMMXT_REGNUM + 9)))
+
+
+@@ -2324,7 +2406,8 @@
+ /* Try to generate sequences that don't involve branches, we can then use
+ conditional instructions */
+ #define BRANCH_COST(speed_p, predictable_p) \
+- (TARGET_32BIT ? 4 : (optimize > 0 ? 2 : 0))
++ (TARGET_32BIT ? (TARGET_THUMB2 && optimize_size ? 1 : 4) \
++ : (optimize > 0 ? 2 : 0))
+
+ /* Position Independent Code. */
+ /* We decide which register to use based on the compilation options and
+@@ -2392,6 +2475,7 @@
+
+ /* The arm5 clz instruction returns 32. */
+ #define CLZ_DEFINED_VALUE_AT_ZERO(MODE, VALUE) ((VALUE) = 32, 1)
++#define CTZ_DEFINED_VALUE_AT_ZERO(MODE, VALUE) ((VALUE) = 32, 1)
+
+ #undef ASM_APP_OFF
+ #define ASM_APP_OFF (TARGET_THUMB1 ? "\t.code\t16\n" : \
+@@ -2404,6 +2488,19 @@
+ if (TARGET_ARM) \
+ asm_fprintf (STREAM,"\tstmfd\t%r!,{%r}\n", \
+ STACK_POINTER_REGNUM, REGNO); \
++ else if (TARGET_THUMB1 \
++ && (REGNO) == STATIC_CHAIN_REGNUM) \
++ { \
++ /* We can't push STATIC_CHAIN_REGNUM (r12) directly with Thumb-1.
++ We know that ASM_OUTPUT_REG_PUSH will be matched with
++ ASM_OUTPUT_REG_POP, and that r7 isn't used by the function
++ profiler, so we can use it as a scratch reg. WARNING: This isn't
++ safe in the general case! It may be sensitive to future changes
++ in final.c:profile_function. */ \
++ asm_fprintf (STREAM, "\tpush\t{r7}\n"); \
++ asm_fprintf (STREAM, "\tmov\tr7, %r\n", REGNO);\
++ asm_fprintf (STREAM, "\tpush\t{r7}\n"); \
++ } \
+ else \
+ asm_fprintf (STREAM, "\tpush {%r}\n", REGNO); \
+ } while (0)
+@@ -2415,6 +2512,14 @@
+ if (TARGET_ARM) \
+ asm_fprintf (STREAM, "\tldmfd\t%r!,{%r}\n", \
+ STACK_POINTER_REGNUM, REGNO); \
++ else if (TARGET_THUMB1 \
++ && (REGNO) == STATIC_CHAIN_REGNUM) \
++ { \
++ /* See comment in ASM_OUTPUT_REG_PUSH. */ \
++ asm_fprintf (STREAM, "\tpop\t{r7}\n"); \
++ asm_fprintf (STREAM, "\tmov\t%r, r7\n", REGNO);\
++ asm_fprintf (STREAM, "\tpop\t{r7}\n"); \
++ } \
+ else \
+ asm_fprintf (STREAM, "\tpop {%r}\n", REGNO); \
+ } while (0)
+diff -Nur a/gcc/config/arm/arm.md b/gcc/config/arm/arm.md
+--- a/gcc/config/arm/arm.md 2009-05-16 15:28:27.000000000 +0200
++++ b/gcc/config/arm/arm.md 2010-01-25 09:50:28.985687200 +0100
+@@ -99,6 +99,7 @@
+ ; correctly for PIC usage.
+ (UNSPEC_GOTSYM_OFF 24) ; The offset of the start of the the GOT from a
+ ; a given symbolic address.
++ (UNSPEC_RBIT 25) ; rbit operation.
+ ]
+ )
+
+@@ -131,6 +132,8 @@
+ (VUNSPEC_WCMP_EQ 12) ; Used by the iWMMXt WCMPEQ instructions
+ (VUNSPEC_WCMP_GTU 13) ; Used by the iWMMXt WCMPGTU instructions
+ (VUNSPEC_WCMP_GT 14) ; Used by the iwMMXT WCMPGT instructions
++ (VUNSPEC_ALIGN16 15) ; Used to force 16-byte alignment.
++ (VUNSPEC_ALIGN32 16) ; Used to force 32-byte alignment.
+ (VUNSPEC_EH_RETURN 20); Use to override the return address for exception
+ ; handling.
+ ]
+@@ -144,6 +147,10 @@
+ ; patterns that share the same RTL in both ARM and Thumb code.
+ (define_attr "is_thumb" "no,yes" (const (symbol_ref "thumb_code")))
+
++; FIX_JANUS is set to 'yes' when compiling for Janus2, it causes to
++; add a nop after shifts, in order to work around a Janus2 bug
++(define_attr "fix_janus" "no,yes" (const (symbol_ref "janus2_code")))
++
+ ; IS_STRONGARM is set to 'yes' when compiling for StrongARM, it affects
+ ; scheduling decisions for the load unit and the multiplier.
+ (define_attr "is_strongarm" "no,yes" (const (symbol_ref "arm_tune_strongarm")))
+@@ -158,7 +165,7 @@
+ ; Floating Point Unit. If we only have floating point emulation, then there
+ ; is no point in scheduling the floating point insns. (Well, for best
+ ; performance we should try and group them together).
+-(define_attr "fpu" "none,fpa,fpe2,fpe3,maverick,vfp,vfpv3d16,vfpv3,neon"
++(define_attr "fpu" "none,fpa,fpe2,fpe3,maverick,vfp"
+ (const (symbol_ref "arm_fpu_attr")))
+
+ ; LENGTH of an instruction (in bytes)
+@@ -185,7 +192,7 @@
+ ;; scheduling information.
+
+ (define_attr "insn"
+- "mov,mvn,smulxy,smlaxy,smlalxy,smulwy,smlawx,mul,muls,mla,mlas,umull,umulls,umlal,umlals,smull,smulls,smlal,smlals,smlawy,smuad,smuadx,smlad,smladx,smusd,smusdx,smlsd,smlsdx,smmul,smmulr,smmla,umaal,smlald,smlsld,clz,mrs,msr,xtab,sdiv,udiv,other"
++ "mov,mvn,and,orr,eor,smulxy,smlaxy,smlalxy,smulwy,smlawx,mul,muls,mla,mlas,umull,umulls,umlal,umlals,smull,smulls,smlal,smlals,smlawy,smuad,smuadx,smlad,smladx,smusd,smusdx,smlsd,smlsdx,smmul,smmulr,smmla,umaal,smlald,smlsld,clz,mrs,msr,xtab,sdiv,udiv,other"
+ (const_string "other"))
+
+ ; TYPE attribute is used to detect floating point instructions which, if
+@@ -251,8 +258,6 @@
+ (define_attr "ldsched" "no,yes" (const (symbol_ref "arm_ld_sched")))
+
+ ;; Classification of NEON instructions for scheduling purposes.
+-;; Do not set this attribute and the "type" attribute together in
+-;; any one instruction pattern.
+ (define_attr "neon_type"
+ "neon_int_1,\
+ neon_int_2,\
+@@ -415,7 +420,7 @@
+
+ (define_attr "generic_sched" "yes,no"
+ (const (if_then_else
+- (ior (eq_attr "tune" "arm926ejs,arm1020e,arm1026ejs,arm1136js,arm1136jfs,cortexa8,cortexa9")
++ (ior (eq_attr "tune" "arm926ejs,arm1020e,arm1026ejs,arm1136js,arm1136jfs,cortexa8,cortexa9,marvell_f")
+ (eq_attr "tune_cortexr4" "yes"))
+ (const_string "no")
+ (const_string "yes"))))
+@@ -423,7 +428,7 @@
+ (define_attr "generic_vfp" "yes,no"
+ (const (if_then_else
+ (and (eq_attr "fpu" "vfp")
+- (eq_attr "tune" "!arm1020e,arm1022e,cortexa8,cortexa9")
++ (eq_attr "tune" "!arm1020e,arm1022e,cortexa8,cortexa9,marvell_f")
+ (eq_attr "tune_cortexr4" "no"))
+ (const_string "yes")
+ (const_string "no"))))
+@@ -437,6 +442,8 @@
+ (include "cortex-a9.md")
+ (include "cortex-r4.md")
+ (include "cortex-r4f.md")
++(include "marvell-f.md")
++(include "marvell-f-vfp.md")
+ (include "vfp11.md")
+
+
+@@ -472,9 +479,9 @@
+ if (TARGET_THUMB1)
+ {
+ if (GET_CODE (operands[1]) != REG)
+- operands[1] = force_reg (SImode, operands[1]);
++ operands[1] = force_reg (DImode, operands[1]);
+ if (GET_CODE (operands[2]) != REG)
+- operands[2] = force_reg (SImode, operands[2]);
++ operands[2] = force_reg (DImode, operands[2]);
+ }
+ "
+ )
+@@ -620,10 +627,11 @@
+ sub%?\\t%0, %1, #%n2
+ sub%?\\t%0, %1, #%n2
+ #"
+- "TARGET_32BIT &&
+- GET_CODE (operands[2]) == CONST_INT
++ "TARGET_32BIT
++ && GET_CODE (operands[2]) == CONST_INT
+ && !(const_ok_for_arm (INTVAL (operands[2]))
+- || const_ok_for_arm (-INTVAL (operands[2])))"
++ || const_ok_for_arm (-INTVAL (operands[2])))
++ && (reload_completed || !arm_eliminable_register (operands[1]))"
+ [(clobber (const_int 0))]
+ "
+ arm_split_constant (PLUS, SImode, curr_insn,
+@@ -639,10 +647,10 @@
+ ;; register. Trying to reload it will always fail catastrophically,
+ ;; so never allow those alternatives to match if reloading is needed.
+
+-(define_insn "*thumb1_addsi3"
+- [(set (match_operand:SI 0 "register_operand" "=l,l,l,*rk,*hk,l,!k")
+- (plus:SI (match_operand:SI 1 "register_operand" "%0,0,l,*0,*0,!k,!k")
+- (match_operand:SI 2 "nonmemory_operand" "I,J,lL,*hk,*rk,!M,!O")))]
++(define_insn_and_split "*thumb1_addsi3"
++ [(set (match_operand:SI 0 "register_operand" "=l,l,l,*rk,*hk,l,!k,l,l")
++ (plus:SI (match_operand:SI 1 "register_operand" "%0,0,l,*0,*0,!k,!k,0,l")
++ (match_operand:SI 2 "nonmemory_operand" "I,J,lL,*hk,*rk,!M,!O,Pa,Pb")))]
+ "TARGET_THUMB1"
+ "*
+ static const char * const asms[] =
+@@ -653,7 +661,9 @@
+ \"add\\t%0, %0, %2\",
+ \"add\\t%0, %0, %2\",
+ \"add\\t%0, %1, %2\",
+- \"add\\t%0, %1, %2\"
++ \"add\\t%0, %1, %2\",
++ \"#\",
++ \"#\"
+ };
+ if ((which_alternative == 2 || which_alternative == 6)
+ && GET_CODE (operands[2]) == CONST_INT
+@@ -661,7 +671,22 @@
+ return \"sub\\t%0, %1, #%n2\";
+ return asms[which_alternative];
+ "
+- [(set_attr "length" "2")]
++ "&& reload_completed && CONST_INT_P (operands[2])
++ && operands[1] != stack_pointer_rtx
++ && (INTVAL (operands[2]) > 255 || INTVAL (operands[2]) < -255)"
++ [(set (match_dup 0) (plus:SI (match_dup 1) (match_dup 2)))
++ (set (match_dup 0) (plus:SI (match_dup 0) (match_dup 3)))]
++ {
++ HOST_WIDE_INT offset = INTVAL (operands[2]);
++ if (offset > 255)
++ offset = 255;
++ else if (offset < -255)
++ offset = -255;
++
++ operands[3] = GEN_INT (offset);
++ operands[2] = GEN_INT (INTVAL (operands[2]) - offset);
++ }
++ [(set_attr "length" "2,2,2,2,2,2,2,4,4")]
+ )
+
+ ;; Reloading and elimination of the frame pointer can
+@@ -854,7 +879,11 @@
+ [(set_attr "conds" "use")
+ (set (attr "type") (if_then_else (match_operand 4 "const_int_operand" "")
+ (const_string "alu_shift")
+- (const_string "alu_shift_reg")))]
++ (const_string "alu_shift_reg")))
++ (set (attr "length") (if_then_else (and (eq_attr "type" "alu_shift_reg")
++ (eq_attr "fix_janus" "yes"))
++ (const_int 8)
++ (const_int 4)))]
+ )
+
+ (define_insn "*addsi3_carryin_alt1"
+@@ -938,7 +967,7 @@
+ [(set (match_operand:DF 0 "s_register_operand" "")
+ (plus:DF (match_operand:DF 1 "s_register_operand" "")
+ (match_operand:DF 2 "arm_float_add_operand" "")))]
+- "TARGET_32BIT && TARGET_HARD_FLOAT"
++ "TARGET_32BIT && TARGET_HARD_FLOAT && !TARGET_VFP_SINGLE"
+ "
+ if (TARGET_MAVERICK
+ && !cirrus_fp_register (operands[2], DFmode))
+@@ -1176,7 +1205,7 @@
+ [(set (match_operand:DF 0 "s_register_operand" "")
+ (minus:DF (match_operand:DF 1 "arm_float_rhs_operand" "")
+ (match_operand:DF 2 "arm_float_rhs_operand" "")))]
+- "TARGET_32BIT && TARGET_HARD_FLOAT"
++ "TARGET_32BIT && TARGET_HARD_FLOAT && !TARGET_VFP_SINGLE"
+ "
+ if (TARGET_MAVERICK)
+ {
+@@ -1332,6 +1361,49 @@
+ (set_attr "predicable" "yes")]
+ )
+
++; The combiner cannot combine the first and last insns in the
++; following sequence because of the intervening insn, so help the
++; combiner with this splitter. The combiner does attempt to split
++; this particular combination but does not know this exact split.
++; Note that the combiner puts the constant at the outermost operation
++; as a part of canonicalization.
++;
++; mul r3, r2, r1
++; <add/sub> r3, r3, <constant>
++; add r3, r3, r4
++
++(define_split
++ [(set (match_operand:SI 0 "s_register_operand" "")
++ (match_operator:SI 1 "plusminus_operator"
++ [(plus:SI (mult:SI (match_operand:SI 2 "s_register_operand" "")
++ (match_operand:SI 3 "s_register_operand" ""))
++ (match_operand:SI 4 "s_register_operand" ""))
++ (match_operand:SI 5 "arm_immediate_operand" "")]))]
++ "TARGET_32BIT"
++ [(set (match_dup 0)
++ (plus:SI (mult:SI (match_dup 2) (match_dup 3))
++ (match_dup 4)))
++ (set (match_dup 0)
++ (match_op_dup:SI 1 [(match_dup 0) (match_dup 5)]))]
++ "")
++
++; Likewise for MLS. MLS is available only on select architectures.
++
++(define_split
++ [(set (match_operand:SI 0 "s_register_operand" "")
++ (match_operator:SI 1 "plusminus_operator"
++ [(minus:SI (match_operand:SI 2 "s_register_operand" "")
++ (mult:SI (match_operand:SI 3 "s_register_operand" "")
++ (match_operand:SI 4 "s_register_operand" "")))
++ (match_operand:SI 5 "arm_immediate_operand" "")]))]
++ "TARGET_32BIT && arm_arch_thumb2"
++ [(set (match_dup 0)
++ (minus:SI (match_dup 2)
++ (mult:SI (match_dup 3) (match_dup 4))))
++ (set (match_dup 0)
++ (match_op_dup:SI 1 [(match_dup 0) (match_dup 5)]))]
++ "")
++
+ (define_insn "*mulsi3addsi_compare0"
+ [(set (reg:CC_NOOV CC_REGNUM)
+ (compare:CC_NOOV
+@@ -1713,7 +1785,7 @@
+ [(set (match_operand:DF 0 "s_register_operand" "")
+ (mult:DF (match_operand:DF 1 "s_register_operand" "")
+ (match_operand:DF 2 "arm_float_rhs_operand" "")))]
+- "TARGET_32BIT && TARGET_HARD_FLOAT"
++ "TARGET_32BIT && TARGET_HARD_FLOAT && !TARGET_VFP_SINGLE"
+ "
+ if (TARGET_MAVERICK
+ && !cirrus_fp_register (operands[2], DFmode))
+@@ -1733,7 +1805,7 @@
+ [(set (match_operand:DF 0 "s_register_operand" "")
+ (div:DF (match_operand:DF 1 "arm_float_rhs_operand" "")
+ (match_operand:DF 2 "arm_float_rhs_operand" "")))]
+- "TARGET_32BIT && TARGET_HARD_FLOAT && (TARGET_FPA || TARGET_VFP)"
++ "TARGET_32BIT && TARGET_HARD_FLOAT && (TARGET_FPA || TARGET_VFP_DOUBLE)"
+ "")
+
+ ;; Modulo insns
+@@ -1960,6 +2032,7 @@
+ DONE;
+ "
+ [(set_attr "length" "4,4,16")
++ (set_attr "insn" "and")
+ (set_attr "predicable" "yes")]
+ )
+
+@@ -1969,7 +2042,8 @@
+ (match_operand:SI 2 "register_operand" "l")))]
+ "TARGET_THUMB1"
+ "and\\t%0, %0, %2"
+- [(set_attr "length" "2")]
++ [(set_attr "length" "2")
++ (set_attr "insn" "and")]
+ )
+
+ (define_insn "*andsi3_compare0"
+@@ -1984,7 +2058,8 @@
+ "@
+ and%.\\t%0, %1, %2
+ bic%.\\t%0, %1, #%B2"
+- [(set_attr "conds" "set")]
++ [(set_attr "conds" "set")
++ (set_attr "insn" "and,*")]
+ )
+
+ (define_insn "*andsi3_compare0_scratch"
+@@ -2280,7 +2355,7 @@
+ }
+ }
+
+- target = operands[0];
++ target = copy_rtx (operands[0]);
+ /* Avoid using a subreg as a subtarget, and avoid writing a paradoxical
+ subreg as the final target. */
+ if (GET_CODE (target) == SUBREG)
+@@ -2528,7 +2603,11 @@
+ (set_attr "shift" "2")
+ (set (attr "type") (if_then_else (match_operand 3 "const_int_operand" "")
+ (const_string "alu_shift")
+- (const_string "alu_shift_reg")))]
++ (const_string "alu_shift_reg")))
++ (set (attr "length") (if_then_else (and (eq_attr "type" "alu_shift_reg")
++ (eq_attr "fix_janus" "yes"))
++ (const_int 8)
++ (const_int 4)))]
+ )
+
+ (define_insn "*andsi_notsi_si_compare0"
+@@ -2576,6 +2655,7 @@
+ orr%?\\t%Q0, %Q1, %2
+ #"
+ [(set_attr "length" "4,8")
++ (set_attr "insn" "orr")
+ (set_attr "predicable" "yes")]
+ )
+
+@@ -2638,7 +2718,8 @@
+ (match_operand:SI 2 "register_operand" "l")))]
+ "TARGET_THUMB1"
+ "orr\\t%0, %0, %2"
+- [(set_attr "length" "2")]
++ [(set_attr "length" "2")
++ (set_attr "insn" "orr")]
+ )
+
+ (define_peephole2
+@@ -2663,7 +2744,8 @@
+ (ior:SI (match_dup 1) (match_dup 2)))]
+ "TARGET_32BIT"
+ "orr%.\\t%0, %1, %2"
+- [(set_attr "conds" "set")]
++ [(set_attr "conds" "set")
++ (set_attr "insn" "orr")]
+ )
+
+ (define_insn "*iorsi3_compare0_scratch"
+@@ -2674,7 +2756,8 @@
+ (clobber (match_scratch:SI 0 "=r"))]
+ "TARGET_32BIT"
+ "orr%.\\t%0, %1, %2"
+- [(set_attr "conds" "set")]
++ [(set_attr "conds" "set")
++ (set_attr "insn" "orr")]
+ )
+
+ (define_insn "xordi3"
+@@ -2697,7 +2780,8 @@
+ eor%?\\t%Q0, %Q1, %2
+ #"
+ [(set_attr "length" "4,8")
+- (set_attr "predicable" "yes")]
++ (set_attr "predicable" "yes")
++ (set_attr "insn" "eor")]
+ )
+
+ (define_insn "*xordi_sesidi_di"
+@@ -2728,7 +2812,8 @@
+ (match_operand:SI 2 "arm_rhs_operand" "rI")))]
+ "TARGET_32BIT"
+ "eor%?\\t%0, %1, %2"
+- [(set_attr "predicable" "yes")]
++ [(set_attr "predicable" "yes")
++ (set_attr "insn" "eor")]
+ )
+
+ (define_insn "*thumb1_xorsi3"
+@@ -2737,7 +2822,8 @@
+ (match_operand:SI 2 "register_operand" "l")))]
+ "TARGET_THUMB1"
+ "eor\\t%0, %0, %2"
+- [(set_attr "length" "2")]
++ [(set_attr "length" "2")
++ (set_attr "insn" "eor")]
+ )
+
+ (define_insn "*xorsi3_compare0"
+@@ -2749,7 +2835,8 @@
+ (xor:SI (match_dup 1) (match_dup 2)))]
+ "TARGET_32BIT"
+ "eor%.\\t%0, %1, %2"
+- [(set_attr "conds" "set")]
++ [(set_attr "conds" "set")
++ (set_attr "insn" "eor")]
+ )
+
+ (define_insn "*xorsi3_compare0_scratch"
+@@ -2906,7 +2993,7 @@
+ (smax:SI (match_operand:SI 1 "s_register_operand" "")
+ (match_operand:SI 2 "arm_rhs_operand" "")))
+ (clobber (reg:CC CC_REGNUM))])]
+- "TARGET_32BIT"
++ "TARGET_32BIT && !TARGET_NO_COND_EXEC"
+ "
+ if (operands[2] == const0_rtx || operands[2] == constm1_rtx)
+ {
+@@ -2933,7 +3020,8 @@
+ (const_int -1)))]
+ "TARGET_32BIT"
+ "orr%?\\t%0, %1, %1, asr #31"
+- [(set_attr "predicable" "yes")]
++ [(set_attr "predicable" "yes")
++ (set_attr "insn" "orr")]
+ )
+
+ (define_insn "*arm_smax_insn"
+@@ -2941,7 +3029,7 @@
+ (smax:SI (match_operand:SI 1 "s_register_operand" "%0,?r")
+ (match_operand:SI 2 "arm_rhs_operand" "rI,rI")))
+ (clobber (reg:CC CC_REGNUM))]
+- "TARGET_ARM"
++ "TARGET_ARM && !TARGET_NO_COND_EXEC"
+ "@
+ cmp\\t%1, %2\;movlt\\t%0, %2
+ cmp\\t%1, %2\;movge\\t%0, %1\;movlt\\t%0, %2"
+@@ -2955,7 +3043,7 @@
+ (smin:SI (match_operand:SI 1 "s_register_operand" "")
+ (match_operand:SI 2 "arm_rhs_operand" "")))
+ (clobber (reg:CC CC_REGNUM))])]
+- "TARGET_32BIT"
++ "TARGET_32BIT && !TARGET_NO_COND_EXEC"
+ "
+ if (operands[2] == const0_rtx)
+ {
+@@ -2973,7 +3061,8 @@
+ (const_int 0)))]
+ "TARGET_32BIT"
+ "and%?\\t%0, %1, %1, asr #31"
+- [(set_attr "predicable" "yes")]
++ [(set_attr "predicable" "yes")
++ (set_attr "insn" "and")]
+ )
+
+ (define_insn "*arm_smin_insn"
+@@ -2981,7 +3070,7 @@
+ (smin:SI (match_operand:SI 1 "s_register_operand" "%0,?r")
+ (match_operand:SI 2 "arm_rhs_operand" "rI,rI")))
+ (clobber (reg:CC CC_REGNUM))]
+- "TARGET_ARM"
++ "TARGET_ARM && !TARGET_NO_COND_EXEC"
+ "@
+ cmp\\t%1, %2\;movge\\t%0, %2
+ cmp\\t%1, %2\;movlt\\t%0, %1\;movge\\t%0, %2"
+@@ -2995,7 +3084,7 @@
+ (umax:SI (match_operand:SI 1 "s_register_operand" "")
+ (match_operand:SI 2 "arm_rhs_operand" "")))
+ (clobber (reg:CC CC_REGNUM))])]
+- "TARGET_32BIT"
++ "TARGET_32BIT && !TARGET_NO_COND_EXEC"
+ ""
+ )
+
+@@ -3004,7 +3093,7 @@
+ (umax:SI (match_operand:SI 1 "s_register_operand" "0,r,?r")
+ (match_operand:SI 2 "arm_rhs_operand" "rI,0,rI")))
+ (clobber (reg:CC CC_REGNUM))]
+- "TARGET_ARM"
++ "TARGET_ARM && !TARGET_NO_COND_EXEC"
+ "@
+ cmp\\t%1, %2\;movcc\\t%0, %2
+ cmp\\t%1, %2\;movcs\\t%0, %1
+@@ -3019,7 +3108,7 @@
+ (umin:SI (match_operand:SI 1 "s_register_operand" "")
+ (match_operand:SI 2 "arm_rhs_operand" "")))
+ (clobber (reg:CC CC_REGNUM))])]
+- "TARGET_32BIT"
++ "TARGET_32BIT && !TARGET_NO_COND_EXEC"
+ ""
+ )
+
+@@ -3028,7 +3117,7 @@
+ (umin:SI (match_operand:SI 1 "s_register_operand" "0,r,?r")
+ (match_operand:SI 2 "arm_rhs_operand" "rI,0,rI")))
+ (clobber (reg:CC CC_REGNUM))]
+- "TARGET_ARM"
++ "TARGET_ARM && !TARGET_NO_COND_EXEC"
+ "@
+ cmp\\t%1, %2\;movcs\\t%0, %2
+ cmp\\t%1, %2\;movcc\\t%0, %1
+@@ -3043,7 +3132,7 @@
+ [(match_operand:SI 1 "s_register_operand" "r")
+ (match_operand:SI 2 "s_register_operand" "r")]))
+ (clobber (reg:CC CC_REGNUM))]
+- "TARGET_32BIT"
++ "TARGET_32BIT && !TARGET_NO_COND_EXEC"
+ "*
+ operands[3] = gen_rtx_fmt_ee (minmax_code (operands[3]), SImode,
+ operands[1], operands[2]);
+@@ -3163,11 +3252,23 @@
+ [(set (match_operand:SI 0 "register_operand" "=l,l")
+ (ashift:SI (match_operand:SI 1 "register_operand" "l,0")
+ (match_operand:SI 2 "nonmemory_operand" "N,l")))]
+- "TARGET_THUMB1"
++ "TARGET_THUMB1 && !janus2_code"
+ "lsl\\t%0, %1, %2"
+ [(set_attr "length" "2")]
+ )
+
++(define_insn "*thumb1_ashlsi3_janus2"
++ [(set (match_operand:SI 0 "register_operand" "=l,l")
++ (ashift:SI (match_operand:SI 1 "register_operand" "l,0")
++ (match_operand:SI 2 "nonmemory_operand" "N,l")))]
++ "TARGET_THUMB1 && janus2_code"
++ "@
++ lsl\\t%0, %1, %2
++ lsl\\t%0, %1, %2\;nop"
++ [(set_attr "length" "2,4")]
++)
++
++
+ (define_expand "ashrdi3"
+ [(set (match_operand:DI 0 "s_register_operand" "")
+ (ashiftrt:DI (match_operand:DI 1 "s_register_operand" "")
+@@ -3200,6 +3301,7 @@
+ "TARGET_32BIT"
+ "movs\\t%R0, %R1, asr #1\;mov\\t%Q0, %Q1, rrx"
+ [(set_attr "conds" "clob")
++ (set_attr "insn" "mov")
+ (set_attr "length" "8")]
+ )
+
+@@ -3219,11 +3321,22 @@
+ [(set (match_operand:SI 0 "register_operand" "=l,l")
+ (ashiftrt:SI (match_operand:SI 1 "register_operand" "l,0")
+ (match_operand:SI 2 "nonmemory_operand" "N,l")))]
+- "TARGET_THUMB1"
++ "TARGET_THUMB1 && !janus2_code"
+ "asr\\t%0, %1, %2"
+ [(set_attr "length" "2")]
+ )
+
++(define_insn "*thumb1_ashrsi3_janus2"
++ [(set (match_operand:SI 0 "register_operand" "=l,l")
++ (ashiftrt:SI (match_operand:SI 1 "register_operand" "l,0")
++ (match_operand:SI 2 "nonmemory_operand" "N,l")))]
++ "TARGET_THUMB1 && janus2_code"
++ "@
++ asr\\t%0, %1, %2
++ asr\\t%0, %1, %2\;nop"
++ [(set_attr "length" "2,4")]
++)
++
+ (define_expand "lshrdi3"
+ [(set (match_operand:DI 0 "s_register_operand" "")
+ (lshiftrt:DI (match_operand:DI 1 "s_register_operand" "")
+@@ -3256,6 +3369,7 @@
+ "TARGET_32BIT"
+ "movs\\t%R0, %R1, lsr #1\;mov\\t%Q0, %Q1, rrx"
+ [(set_attr "conds" "clob")
++ (set_attr "insn" "mov")
+ (set_attr "length" "8")]
+ )
+
+@@ -3278,11 +3392,22 @@
+ [(set (match_operand:SI 0 "register_operand" "=l,l")
+ (lshiftrt:SI (match_operand:SI 1 "register_operand" "l,0")
+ (match_operand:SI 2 "nonmemory_operand" "N,l")))]
+- "TARGET_THUMB1"
++ "TARGET_THUMB1 && !janus2_code"
+ "lsr\\t%0, %1, %2"
+ [(set_attr "length" "2")]
+ )
+
++(define_insn "*thumb1_lshrsi3_janus2"
++ [(set (match_operand:SI 0 "register_operand" "=l,l")
++ (lshiftrt:SI (match_operand:SI 1 "register_operand" "l,0")
++ (match_operand:SI 2 "nonmemory_operand" "N,l")))]
++ "TARGET_THUMB1 && janus2_code"
++ "@
++ lsr\\t%0, %1, %2
++ lsr\\t%0, %1, %2; nop"
++ [(set_attr "length" "2,4")]
++)
++
+ (define_expand "rotlsi3"
+ [(set (match_operand:SI 0 "s_register_operand" "")
+ (rotatert:SI (match_operand:SI 1 "s_register_operand" "")
+@@ -3324,11 +3449,20 @@
+ [(set (match_operand:SI 0 "register_operand" "=l")
+ (rotatert:SI (match_operand:SI 1 "register_operand" "0")
+ (match_operand:SI 2 "register_operand" "l")))]
+- "TARGET_THUMB1"
++ "TARGET_THUMB1 && !janus2_code"
+ "ror\\t%0, %0, %2"
+ [(set_attr "length" "2")]
+ )
+
++(define_insn "*thumb1_rotrsi3_janus2"
++ [(set (match_operand:SI 0 "register_operand" "=l")
++ (rotatert:SI (match_operand:SI 1 "register_operand" "0")
++ (match_operand:SI 2 "register_operand" "l")))]
++ "TARGET_THUMB1 && janus2_code"
++ "ror\\t%0, %0, %2; nop"
++ [(set_attr "length" "4")]
++)
++
+ (define_insn "*arm_shiftsi3"
+ [(set (match_operand:SI 0 "s_register_operand" "=r")
+ (match_operator:SI 3 "shift_operator"
+@@ -3340,7 +3474,11 @@
+ (set_attr "shift" "1")
+ (set (attr "type") (if_then_else (match_operand 2 "const_int_operand" "")
+ (const_string "alu_shift")
+- (const_string "alu_shift_reg")))]
++ (const_string "alu_shift_reg")))
++ (set (attr "length") (if_then_else (and (eq_attr "type" "alu_shift_reg")
++ (eq_attr "fix_janus" "yes"))
++ (const_int 8)
++ (const_int 4)))]
+ )
+
+ (define_insn "*shiftsi3_compare0"
+@@ -3357,7 +3495,11 @@
+ (set_attr "shift" "1")
+ (set (attr "type") (if_then_else (match_operand 2 "const_int_operand" "")
+ (const_string "alu_shift")
+- (const_string "alu_shift_reg")))]
++ (const_string "alu_shift_reg")))
++ (set (attr "length") (if_then_else (and (eq_attr "type" "alu_shift_reg")
++ (eq_attr "fix_janus" "yes"))
++ (const_int 8)
++ (const_int 4)))]
+ )
+
+ (define_insn "*shiftsi3_compare0_scratch"
+@@ -3370,7 +3512,11 @@
+ "TARGET_32BIT"
+ "* return arm_output_shift(operands, 1);"
+ [(set_attr "conds" "set")
+- (set_attr "shift" "1")]
++ (set_attr "shift" "1")
++ (set (attr "length") (if_then_else (and (match_operand 2 "s_register_operand" "")
++ (eq_attr "fix_janus" "yes"))
++ (const_int 8)
++ (const_int 4)))]
+ )
+
+ (define_insn "*arm_notsi_shiftsi"
+@@ -3382,9 +3528,14 @@
+ "mvn%?\\t%0, %1%S3"
+ [(set_attr "predicable" "yes")
+ (set_attr "shift" "1")
++ (set_attr "insn" "mvn")
+ (set (attr "type") (if_then_else (match_operand 2 "const_int_operand" "")
+ (const_string "alu_shift")
+- (const_string "alu_shift_reg")))]
++ (const_string "alu_shift_reg")))
++ (set (attr "length") (if_then_else (and (eq_attr "type" "alu_shift_reg")
++ (eq_attr "fix_janus" "yes"))
++ (const_int 8)
++ (const_int 4)))]
+ )
+
+ (define_insn "*arm_notsi_shiftsi_compare0"
+@@ -3399,9 +3550,14 @@
+ "mvn%.\\t%0, %1%S3"
+ [(set_attr "conds" "set")
+ (set_attr "shift" "1")
++ (set_attr "insn" "mvn")
+ (set (attr "type") (if_then_else (match_operand 2 "const_int_operand" "")
+ (const_string "alu_shift")
+- (const_string "alu_shift_reg")))]
++ (const_string "alu_shift_reg")))
++ (set (attr "length") (if_then_else (and (eq_attr "type" "alu_shift_reg")
++ (eq_attr "fix_janus" "yes"))
++ (const_int 8)
++ (const_int 4)))]
+ )
+
+ (define_insn "*arm_not_shiftsi_compare0_scratch"
+@@ -3415,9 +3571,14 @@
+ "mvn%.\\t%0, %1%S3"
+ [(set_attr "conds" "set")
+ (set_attr "shift" "1")
++ (set_attr "insn" "mvn")
+ (set (attr "type") (if_then_else (match_operand 2 "const_int_operand" "")
+ (const_string "alu_shift")
+- (const_string "alu_shift_reg")))]
++ (const_string "alu_shift_reg")))
++ (set (attr "length") (if_then_else (and (eq_attr "type" "alu_shift_reg")
++ (eq_attr "fix_janus" "yes"))
++ (const_int 8)
++ (const_int 4)))]
+ )
+
+ ;; We don't really have extzv, but defining this using shifts helps
+@@ -3550,12 +3711,12 @@
+ (define_expand "negdf2"
+ [(set (match_operand:DF 0 "s_register_operand" "")
+ (neg:DF (match_operand:DF 1 "s_register_operand" "")))]
+- "TARGET_32BIT && TARGET_HARD_FLOAT && (TARGET_FPA || TARGET_VFP)"
++ "TARGET_32BIT && TARGET_HARD_FLOAT && (TARGET_FPA || TARGET_VFP_DOUBLE)"
+ "")
+
+ ;; abssi2 doesn't really clobber the condition codes if a different register
+ ;; is being set. To keep things simple, assume during rtl manipulations that
+-;; it does, but tell the final scan operator the truth. Similarly for
++;; it does, and the splitter will eliminate it. Similarly for
+ ;; (neg (abs...))
+
+ (define_expand "abssi2"
+@@ -3567,22 +3728,28 @@
+ "
+ if (TARGET_THUMB1)
+ operands[2] = gen_rtx_SCRATCH (SImode);
++ else if (TARGET_NO_SINGLE_COND_EXEC)
++ {
++ emit_insn(gen_rtx_SET(VOIDmode, operands[0],
++ gen_rtx_ABS(SImode, operands[1])));
++ DONE;
++ }
+ else
+ operands[2] = gen_rtx_REG (CCmode, CC_REGNUM);
+ ")
+
+ (define_insn "*arm_abssi2"
+- [(set (match_operand:SI 0 "s_register_operand" "=r,&r")
+- (abs:SI (match_operand:SI 1 "s_register_operand" "0,r")))
++ [(set (match_operand:SI 0 "s_register_operand" "=r")
++ (abs:SI (match_operand:SI 1 "s_register_operand" "r")))
+ (clobber (reg:CC CC_REGNUM))]
+- "TARGET_ARM"
+- "@
+- cmp\\t%0, #0\;rsblt\\t%0, %0, #0
+- eor%?\\t%0, %1, %1, asr #31\;sub%?\\t%0, %0, %1, asr #31"
+- [(set_attr "conds" "clob,*")
+- (set_attr "shift" "1")
++ "TARGET_32BIT && !TARGET_NO_SINGLE_COND_EXEC"
++ "#"
++ [(set_attr "shift" "1")
+ ;; predicable can't be set based on the variant, so left as no
+- (set_attr "length" "8")]
++ (set (attr "length")
++ (if_then_else (eq_attr "is_thumb" "yes")
++ (const_int 10)
++ (const_int 8)))]
+ )
+
+ (define_insn_and_split "*thumb1_abssi2"
+@@ -3600,17 +3767,17 @@
+ )
+
+ (define_insn "*arm_neg_abssi2"
+- [(set (match_operand:SI 0 "s_register_operand" "=r,&r")
+- (neg:SI (abs:SI (match_operand:SI 1 "s_register_operand" "0,r"))))
++ [(set (match_operand:SI 0 "s_register_operand" "=r")
++ (neg:SI (abs:SI (match_operand:SI 1 "s_register_operand" "r"))))
+ (clobber (reg:CC CC_REGNUM))]
+- "TARGET_ARM"
+- "@
+- cmp\\t%0, #0\;rsbgt\\t%0, %0, #0
+- eor%?\\t%0, %1, %1, asr #31\;rsb%?\\t%0, %0, %1, asr #31"
+- [(set_attr "conds" "clob,*")
+- (set_attr "shift" "1")
++ "TARGET_32BIT && !TARGET_NO_SINGLE_COND_EXEC"
++ "#"
++ [(set_attr "shift" "1")
+ ;; predicable can't be set based on the variant, so left as no
+- (set_attr "length" "8")]
++ (set (attr "length")
++ (if_then_else (eq_attr "is_thumb" "yes")
++ (const_int 10)
++ (const_int 8)))]
+ )
+
+ (define_insn_and_split "*thumb1_neg_abssi2"
+@@ -3627,6 +3794,93 @@
+ [(set_attr "length" "6")]
+ )
+
++;; Simplified version for when avoiding conditional execution
++(define_insn "*arm_nocond_abssi2"
++ [(set (match_operand:SI 0 "s_register_operand" "=&r")
++ (abs:SI (match_operand:SI 1 "s_register_operand" "r")))]
++ "TARGET_32BIT && TARGET_NO_SINGLE_COND_EXEC"
++ "#"
++ [(set_attr "shift" "1")
++ (set_attr "length" "8")
++ (set_attr "predicable" "yes")]
++)
++
++(define_insn "*arm_nocond_neg_abssi2"
++ [(set (match_operand:SI 0 "s_register_operand" "=&r")
++ (neg:SI (abs:SI (match_operand:SI 1 "s_register_operand" "r"))))]
++ "TARGET_32BIT && TARGET_NO_SINGLE_COND_EXEC"
++ "#"
++ [(set_attr "shift" "1")
++ (set_attr "length" "8")
++ (set_attr "predicable" "yes")]
++)
++
++;; Splitters for ABS patterns.
++
++(define_split
++ [(set (match_operand:SI 0 "s_register_operand" "")
++ (abs:SI (match_operand:SI 1 "s_register_operand" "")))
++ (clobber (reg:CC CC_REGNUM))]
++ "TARGET_32BIT && reload_completed && rtx_equal_p(operands[0], operands[1])"
++ [(set (reg:CC CC_REGNUM) (compare:CC (match_dup 1) (const_int 0)))
++ (cond_exec (lt (reg:CC CC_REGNUM) (const_int 0))
++ (set (match_dup 0) (neg:SI (match_dup 1))))]
++)
++
++(define_split
++ [(set (match_operand:SI 0 "s_register_operand" "")
++ (neg:SI (abs:SI (match_operand:SI 1 "s_register_operand" ""))))
++ (clobber (reg:CC CC_REGNUM))]
++ "TARGET_32BIT && reload_completed && rtx_equal_p(operands[0], operands[1])"
++ [(set (reg:CC CC_REGNUM) (compare:CC (match_dup 1) (const_int 0)))
++ (cond_exec (gt (reg:CC CC_REGNUM) (const_int 0))
++ (set (match_dup 0) (neg:SI (match_dup 1))))]
++)
++
++;; GCC does not add/remove clobbers when matching splitters, so we need
++;; variants with and without the CC clobber.
++(define_split
++ [(set (match_operand:SI 0 "s_register_operand" "")
++ (abs:SI (match_operand:SI 1 "s_register_operand" "")))]
++ "TARGET_32BIT && reload_completed && !rtx_equal_p(operands[0], operands[1])"
++ [(set (match_dup 0) (xor:SI (ashiftrt:SI (match_dup 1) (const_int 31))
++ (match_dup 1)))
++ (set (match_dup 0) (minus:SI (match_dup 0)
++ (ashiftrt:SI (match_dup 1) (const_int 31))))]
++)
++
++(define_split
++ [(set (match_operand:SI 0 "s_register_operand" "")
++ (abs:SI (match_operand:SI 1 "s_register_operand" "")))
++ (clobber (reg:CC CC_REGNUM))]
++ "TARGET_32BIT && reload_completed && !rtx_equal_p(operands[0], operands[1])"
++ [(set (match_dup 0) (xor:SI (ashiftrt:SI (match_dup 1) (const_int 31))
++ (match_dup 1)))
++ (set (match_dup 0) (minus:SI (match_dup 0)
++ (ashiftrt:SI (match_dup 1) (const_int 31))))]
++)
++
++(define_split
++ [(set (match_operand:SI 0 "s_register_operand" "")
++ (neg:SI (abs:SI (match_operand:SI 1 "s_register_operand" ""))))]
++ "TARGET_32BIT && reload_completed && !rtx_equal_p(operands[0], operands[1])"
++ [(set (match_dup 0) (xor:SI (ashiftrt:SI (match_dup 1) (const_int 31))
++ (match_dup 1)))
++ (set (match_dup 0) (minus:SI (ashiftrt:SI (match_dup 1) (const_int 31))
++ (match_dup 0)))]
++)
++
++(define_split
++ [(set (match_operand:SI 0 "s_register_operand" "")
++ (neg:SI (abs:SI (match_operand:SI 1 "s_register_operand" ""))))
++ (clobber (reg:CC CC_REGNUM))]
++ "TARGET_32BIT && reload_completed && !rtx_equal_p(operands[0], operands[1])"
++ [(set (match_dup 0) (xor:SI (ashiftrt:SI (match_dup 1) (const_int 31))
++ (match_dup 1)))
++ (set (match_dup 0) (minus:SI (ashiftrt:SI (match_dup 1) (const_int 31))
++ (match_dup 0)))]
++)
++
+ (define_expand "abssf2"
+ [(set (match_operand:SF 0 "s_register_operand" "")
+ (abs:SF (match_operand:SF 1 "s_register_operand" "")))]
+@@ -3636,7 +3890,7 @@
+ (define_expand "absdf2"
+ [(set (match_operand:DF 0 "s_register_operand" "")
+ (abs:DF (match_operand:DF 1 "s_register_operand" "")))]
+- "TARGET_32BIT && TARGET_HARD_FLOAT"
++ "TARGET_32BIT && TARGET_HARD_FLOAT && !TARGET_VFP_SINGLE"
+ "")
+
+ (define_expand "sqrtsf2"
+@@ -3648,7 +3902,7 @@
+ (define_expand "sqrtdf2"
+ [(set (match_operand:DF 0 "s_register_operand" "")
+ (sqrt:DF (match_operand:DF 1 "s_register_operand" "")))]
+- "TARGET_32BIT && TARGET_HARD_FLOAT && (TARGET_FPA || TARGET_VFP)"
++ "TARGET_32BIT && TARGET_HARD_FLOAT && (TARGET_FPA || TARGET_VFP_DOUBLE)"
+ "")
+
+ (define_insn_and_split "one_cmpldi2"
+@@ -3682,7 +3936,8 @@
+ (not:SI (match_operand:SI 1 "s_register_operand" "r")))]
+ "TARGET_32BIT"
+ "mvn%?\\t%0, %1"
+- [(set_attr "predicable" "yes")]
++ [(set_attr "predicable" "yes")
++ (set_attr "insn" "mvn")]
+ )
+
+ (define_insn "*thumb1_one_cmplsi2"
+@@ -3690,7 +3945,8 @@
+ (not:SI (match_operand:SI 1 "register_operand" "l")))]
+ "TARGET_THUMB1"
+ "mvn\\t%0, %1"
+- [(set_attr "length" "2")]
++ [(set_attr "length" "2")
++ (set_attr "insn" "mvn")]
+ )
+
+ (define_insn "*notsi_compare0"
+@@ -3701,7 +3957,8 @@
+ (not:SI (match_dup 1)))]
+ "TARGET_32BIT"
+ "mvn%.\\t%0, %1"
+- [(set_attr "conds" "set")]
++ [(set_attr "conds" "set")
++ (set_attr "insn" "mvn")]
+ )
+
+ (define_insn "*notsi_compare0_scratch"
+@@ -3711,11 +3968,40 @@
+ (clobber (match_scratch:SI 0 "=r"))]
+ "TARGET_32BIT"
+ "mvn%.\\t%0, %1"
+- [(set_attr "conds" "set")]
++ [(set_attr "conds" "set")
++ (set_attr "insn" "mvn")]
+ )
+
+ ;; Fixed <--> Floating conversion insns
+
++(define_expand "floatsihf2"
++ [(set (match_operand:HF 0 "general_operand" "")
++ (float:HF (match_operand:SI 1 "general_operand" "")))]
++ "TARGET_EITHER"
++ "
++ {
++ rtx op1 = gen_reg_rtx (SFmode);
++ expand_float (op1, operands[1], 0);
++ op1 = convert_to_mode (HFmode, op1, 0);
++ emit_move_insn (operands[0], op1);
++ DONE;
++ }"
++)
++
++(define_expand "floatdihf2"
++ [(set (match_operand:HF 0 "general_operand" "")
++ (float:HF (match_operand:DI 1 "general_operand" "")))]
++ "TARGET_EITHER"
++ "
++ {
++ rtx op1 = gen_reg_rtx (SFmode);
++ expand_float (op1, operands[1], 0);
++ op1 = convert_to_mode (HFmode, op1, 0);
++ emit_move_insn (operands[0], op1);
++ DONE;
++ }"
++)
++
+ (define_expand "floatsisf2"
+ [(set (match_operand:SF 0 "s_register_operand" "")
+ (float:SF (match_operand:SI 1 "s_register_operand" "")))]
+@@ -3731,7 +4017,7 @@
+ (define_expand "floatsidf2"
+ [(set (match_operand:DF 0 "s_register_operand" "")
+ (float:DF (match_operand:SI 1 "s_register_operand" "")))]
+- "TARGET_32BIT && TARGET_HARD_FLOAT"
++ "TARGET_32BIT && TARGET_HARD_FLOAT && !TARGET_VFP_SINGLE"
+ "
+ if (TARGET_MAVERICK)
+ {
+@@ -3740,6 +4026,30 @@
+ }
+ ")
+
++(define_expand "fix_trunchfsi2"
++ [(set (match_operand:SI 0 "general_operand" "")
++ (fix:SI (fix:HF (match_operand:HF 1 "general_operand" ""))))]
++ "TARGET_EITHER"
++ "
++ {
++ rtx op1 = convert_to_mode (SFmode, operands[1], 0);
++ expand_fix (operands[0], op1, 0);
++ DONE;
++ }"
++)
++
++(define_expand "fix_trunchfdi2"
++ [(set (match_operand:DI 0 "general_operand" "")
++ (fix:DI (fix:HF (match_operand:HF 1 "general_operand" ""))))]
++ "TARGET_EITHER"
++ "
++ {
++ rtx op1 = convert_to_mode (SFmode, operands[1], 0);
++ expand_fix (operands[0], op1, 0);
++ DONE;
++ }"
++)
++
+ (define_expand "fix_truncsfsi2"
+ [(set (match_operand:SI 0 "s_register_operand" "")
+ (fix:SI (fix:SF (match_operand:SF 1 "s_register_operand" ""))))]
+@@ -3759,7 +4069,7 @@
+ (define_expand "fix_truncdfsi2"
+ [(set (match_operand:SI 0 "s_register_operand" "")
+ (fix:SI (fix:DF (match_operand:DF 1 "s_register_operand" ""))))]
+- "TARGET_32BIT && TARGET_HARD_FLOAT"
++ "TARGET_32BIT && TARGET_HARD_FLOAT && !TARGET_VFP_SINGLE"
+ "
+ if (TARGET_MAVERICK)
+ {
+@@ -3776,9 +4086,25 @@
+ [(set (match_operand:SF 0 "s_register_operand" "")
+ (float_truncate:SF
+ (match_operand:DF 1 "s_register_operand" "")))]
+- "TARGET_32BIT && TARGET_HARD_FLOAT"
++ "TARGET_32BIT && TARGET_HARD_FLOAT && !TARGET_VFP_SINGLE"
+ ""
+ )
++
++/* DFmode -> HFmode conversions have to go through SFmode. */
++(define_expand "truncdfhf2"
++ [(set (match_operand:HF 0 "general_operand" "")
++ (float_truncate:HF
++ (match_operand:DF 1 "general_operand" "")))]
++ "TARGET_EITHER"
++ "
++ {
++ rtx op1;
++ op1 = convert_to_mode (SFmode, operands[1], 0);
++ op1 = convert_to_mode (HFmode, op1, 0);
++ emit_move_insn (operands[0], op1);
++ DONE;
++ }"
++)
+
+ ;; Zero and sign extension instructions.
+
+@@ -3800,6 +4126,7 @@
+ return \"mov%?\\t%R0, #0\";
+ "
+ [(set_attr "length" "8")
++ (set_attr "insn" "mov")
+ (set_attr "predicable" "yes")]
+ )
+
+@@ -3843,6 +4170,7 @@
+ "
+ [(set_attr "length" "8")
+ (set_attr "shift" "1")
++ (set_attr "insn" "mov")
+ (set_attr "predicable" "yes")]
+ )
+
+@@ -4123,6 +4451,28 @@
+ ""
+ )
+
++(define_code_iterator ior_xor [ior xor])
++
++(define_split
++ [(set (match_operand:SI 0 "s_register_operand" "")
++ (ior_xor:SI (and:SI (ashift:SI
++ (match_operand:SI 1 "s_register_operand" "")
++ (match_operand:SI 2 "const_int_operand" ""))
++ (match_operand:SI 3 "const_int_operand" ""))
++ (zero_extend:SI
++ (match_operator 5 "subreg_lowpart_operator"
++ [(match_operand:SI 4 "s_register_operand" "")]))))]
++ "TARGET_32BIT
++ && (INTVAL (operands[3])
++ == (GET_MODE_MASK (GET_MODE (operands[5]))
++ & (GET_MODE_MASK (GET_MODE (operands[5]))
++ << (INTVAL (operands[2])))))"
++ [(set (match_dup 0) (ior_xor:SI (ashift:SI (match_dup 1) (match_dup 2))
++ (match_dup 4)))
++ (set (match_dup 0) (zero_extend:SI (match_dup 5)))]
++ "operands[5] = gen_lowpart (GET_MODE (operands[5]), operands[0]);"
++)
++
+ (define_insn "*compareqi_eq0"
+ [(set (reg:CC_Z CC_REGNUM)
+ (compare:CC_Z (match_operand:QI 0 "s_register_operand" "r")
+@@ -4639,9 +4989,24 @@
+ (define_expand "extendsfdf2"
+ [(set (match_operand:DF 0 "s_register_operand" "")
+ (float_extend:DF (match_operand:SF 1 "s_register_operand" "")))]
+- "TARGET_32BIT && TARGET_HARD_FLOAT"
++ "TARGET_32BIT && TARGET_HARD_FLOAT && !TARGET_VFP_SINGLE"
+ ""
+ )
++
++/* HFmode -> DFmode conversions have to go through SFmode. */
++(define_expand "extendhfdf2"
++ [(set (match_operand:DF 0 "general_operand" "")
++ (float_extend:DF (match_operand:HF 1 "general_operand" "")))]
++ "TARGET_EITHER"
++ "
++ {
++ rtx op1;
++ op1 = convert_to_mode (SFmode, operands[1], 0);
++ op1 = convert_to_mode (DFmode, op1, 0);
++ emit_insn (gen_movdf (operands[0], op1));
++ DONE;
++ }"
++)
+
+ ;; Move insns (including loads and stores)
+
+@@ -4877,6 +5242,7 @@
+ }"
+ [(set_attr "length" "4,4,6,2,2,6,4,4")
+ (set_attr "type" "*,*,*,load2,store2,load2,store2,*")
++ (set_attr "insn" "*,mov,*,*,*,*,*,mov")
+ (set_attr "pool_range" "*,*,*,*,*,1020,*,*")]
+ )
+
+@@ -4903,14 +5269,6 @@
+ optimize && can_create_pseudo_p ());
+ DONE;
+ }
+-
+- if (TARGET_USE_MOVT && !target_word_relocations
+- && GET_CODE (operands[1]) == SYMBOL_REF
+- && !flag_pic && !arm_tls_referenced_p (operands[1]))
+- {
+- arm_emit_movpair (operands[0], operands[1]);
+- DONE;
+- }
+ }
+ else /* TARGET_THUMB1... */
+ {
+@@ -4984,18 +5342,9 @@
+ (set_attr "length" "4")]
+ )
+
+-(define_insn "*arm_movw"
+- [(set (match_operand:SI 0 "nonimmediate_operand" "=r")
+- (high:SI (match_operand:SI 1 "general_operand" "i")))]
+- "TARGET_32BIT"
+- "movw%?\t%0, #:lower16:%c1"
+- [(set_attr "predicable" "yes")
+- (set_attr "length" "4")]
+-)
+-
+ (define_insn "*arm_movsi_insn"
+ [(set (match_operand:SI 0 "nonimmediate_operand" "=rk,r,r,r,rk,m")
+- (match_operand:SI 1 "general_operand" "rk, I,K,N,mi,rk"))]
++ (match_operand:SI 1 "general_operand" "rk, I,K,j,mi,rk"))]
+ "TARGET_ARM && ! TARGET_IWMMXT
+ && !(TARGET_HARD_FLOAT && TARGET_VFP)
+ && ( register_operand (operands[0], SImode)
+@@ -5008,6 +5357,7 @@
+ ldr%?\\t%0, %1
+ str%?\\t%1, %0"
+ [(set_attr "type" "*,*,*,*,load1,store1")
++ (set_attr "insn" "mov,mov,mvn,mov,*,*")
+ (set_attr "predicable" "yes")
+ (set_attr "pool_range" "*,*,*,*,4096,*")
+ (set_attr "neg_pool_range" "*,*,*,*,4084,*")]
+@@ -5027,6 +5377,19 @@
+ "
+ )
+
++(define_split
++ [(set (match_operand:SI 0 "arm_general_register_operand" "")
++ (match_operand:SI 1 "general_operand" ""))]
++ "TARGET_32BIT
++ && TARGET_USE_MOVT && GET_CODE (operands[1]) == SYMBOL_REF
++ && !flag_pic && !target_word_relocations
++ && !arm_tls_referenced_p (operands[1])"
++ [(clobber (const_int 0))]
++{
++ arm_emit_movpair (operands[0], operands[1]);
++ DONE;
++})
++
+ (define_insn "*thumb1_movsi_insn"
+ [(set (match_operand:SI 0 "nonimmediate_operand" "=l,l,l,l,l,>,l, m,*lhk")
+ (match_operand:SI 1 "general_operand" "l, I,J,K,>,l,mi,l,*lhk"))]
+@@ -5065,7 +5428,7 @@
+ (set (match_dup 0) (ashift:SI (match_dup 0) (match_dup 2)))]
+ "
+ {
+- unsigned HOST_WIDE_INT val = INTVAL (operands[1]);
++ unsigned HOST_WIDE_INT val = INTVAL (operands[1]) & 0xffffffffu;
+ unsigned HOST_WIDE_INT mask = 0xff;
+ int i;
+
+@@ -5627,6 +5990,7 @@
+ ldr%(h%)\\t%0, %1\\t%@ movhi"
+ [(set_attr "type" "*,*,store1,load1")
+ (set_attr "predicable" "yes")
++ (set_attr "insn" "mov,mvn,*,*")
+ (set_attr "pool_range" "*,*,*,256")
+ (set_attr "neg_pool_range" "*,*,*,244")]
+ )
+@@ -5638,7 +6002,8 @@
+ "@
+ mov%?\\t%0, %1\\t%@ movhi
+ mvn%?\\t%0, #%B1\\t%@ movhi"
+- [(set_attr "predicable" "yes")]
++ [(set_attr "predicable" "yes")
++ (set_attr "insn" "mov,mvn")]
+ )
+
+ (define_expand "thumb_movhi_clobber"
+@@ -5769,6 +6134,7 @@
+ ldr%(b%)\\t%0, %1
+ str%(b%)\\t%1, %0"
+ [(set_attr "type" "*,*,load1,store1")
++ (set_attr "insn" "mov,mvn,*,*")
+ (set_attr "predicable" "yes")]
+ )
+
+@@ -5787,9 +6153,111 @@
+ mov\\t%0, %1"
+ [(set_attr "length" "2")
+ (set_attr "type" "*,load1,store1,*,*,*")
++ (set_attr "insn" "*,*,*,mov,mov,mov")
+ (set_attr "pool_range" "*,32,*,*,*,*")]
+ )
+
++;; HFmode moves
++(define_expand "movhf"
++ [(set (match_operand:HF 0 "general_operand" "")
++ (match_operand:HF 1 "general_operand" ""))]
++ "TARGET_EITHER"
++ "
++ if (TARGET_32BIT)
++ {
++ if (GET_CODE (operands[0]) == MEM)
++ operands[1] = force_reg (HFmode, operands[1]);
++ }
++ else /* TARGET_THUMB1 */
++ {
++ if (can_create_pseudo_p ())
++ {
++ if (GET_CODE (operands[0]) != REG)
++ operands[1] = force_reg (HFmode, operands[1]);
++ }
++ }
++ "
++)
++
++(define_insn "*arm32_movhf"
++ [(set (match_operand:HF 0 "nonimmediate_operand" "=r,m,r,r")
++ (match_operand:HF 1 "general_operand" " m,r,r,F"))]
++ "TARGET_32BIT && !(TARGET_HARD_FLOAT && TARGET_FP16)
++ && ( s_register_operand (operands[0], HFmode)
++ || s_register_operand (operands[1], HFmode))"
++ "*
++ switch (which_alternative)
++ {
++ case 0: /* ARM register from memory */
++ return \"ldr%(h%)\\t%0, %1\\t%@ __fp16\";
++ case 1: /* memory from ARM register */
++ return \"str%(h%)\\t%1, %0\\t%@ __fp16\";
++ case 2: /* ARM register from ARM register */
++ return \"mov%?\\t%0, %1\\t%@ __fp16\";
++ case 3: /* ARM register from constant */
++ {
++ REAL_VALUE_TYPE r;
++ long bits;
++ rtx ops[4];
++
++ REAL_VALUE_FROM_CONST_DOUBLE (r, operands[1]);
++ bits = real_to_target (NULL, &r, HFmode);
++ ops[0] = operands[0];
++ ops[1] = GEN_INT (bits);
++ ops[2] = GEN_INT (bits & 0xff00);
++ ops[3] = GEN_INT (bits & 0x00ff);
++
++ if (arm_arch_thumb2)
++ output_asm_insn (\"movw%?\\t%0, %1\", ops);
++ else
++ output_asm_insn (\"mov%?\\t%0, %2\;orr%?\\t%0, %0, %3\", ops);
++ return \"\";
++ }
++ default:
++ gcc_unreachable ();
++ }
++ "
++ [(set_attr "conds" "unconditional")
++ (set_attr "type" "load1,store1,*,*")
++ (set_attr "length" "4,4,4,8")
++ (set_attr "predicable" "yes")
++ ]
++)
++
++(define_insn "*thumb1_movhf"
++ [(set (match_operand:HF 0 "nonimmediate_operand" "=l,l,m,*r,*h")
++ (match_operand:HF 1 "general_operand" "l,mF,l,*h,*r"))]
++ "TARGET_THUMB1
++ && ( s_register_operand (operands[0], HFmode)
++ || s_register_operand (operands[1], HFmode))"
++ "*
++ switch (which_alternative)
++ {
++ case 1:
++ {
++ rtx addr;
++ gcc_assert (GET_CODE(operands[1]) == MEM);
++ addr = XEXP (operands[1], 0);
++ if (GET_CODE (addr) == LABEL_REF
++ || (GET_CODE (addr) == CONST
++ && GET_CODE (XEXP (addr, 0)) == PLUS
++ && GET_CODE (XEXP (XEXP (addr, 0), 0)) == LABEL_REF
++ && GET_CODE (XEXP (XEXP (addr, 0), 1)) == CONST_INT))
++ {
++ /* Constant pool entry. */
++ return \"ldr\\t%0, %1\";
++ }
++ return \"ldrh\\t%0, %1\";
++ }
++ case 2: return \"strh\\t%1, %0\";
++ default: return \"mov\\t%0, %1\";
++ }
++ "
++ [(set_attr "length" "2")
++ (set_attr "type" "*,load1,store1,*,*")
++ (set_attr "pool_range" "*,1020,*,*,*")]
++)
++
+ (define_expand "movsf"
+ [(set (match_operand:SF 0 "general_operand" "")
+ (match_operand:SF 1 "general_operand" ""))]
+@@ -5842,6 +6310,7 @@
+ [(set_attr "length" "4,4,4")
+ (set_attr "predicable" "yes")
+ (set_attr "type" "*,load1,store1")
++ (set_attr "insn" "mov,*,*")
+ (set_attr "pool_range" "*,4096,*")
+ (set_attr "neg_pool_range" "*,4084,*")]
+ )
+@@ -6297,7 +6766,7 @@
+ (match_operand:BLK 1 "general_operand" "")
+ (match_operand:SI 2 "const_int_operand" "")
+ (match_operand:SI 3 "const_int_operand" "")]
+- "TARGET_EITHER"
++ "TARGET_EITHER && !low_irq_latency"
+ "
+ if (TARGET_32BIT)
+ {
+@@ -7476,7 +7945,7 @@
+ (define_expand "cmpdf"
+ [(match_operand:DF 0 "s_register_operand" "")
+ (match_operand:DF 1 "arm_float_compare_operand" "")]
+- "TARGET_32BIT && TARGET_HARD_FLOAT"
++ "TARGET_32BIT && TARGET_HARD_FLOAT && !TARGET_VFP_SINGLE"
+ "
+ arm_compare_op0 = operands[0];
+ arm_compare_op1 = operands[1];
+@@ -7507,7 +7976,11 @@
+ (set_attr "shift" "1")
+ (set (attr "type") (if_then_else (match_operand 2 "const_int_operand" "")
+ (const_string "alu_shift")
+- (const_string "alu_shift_reg")))]
++ (const_string "alu_shift_reg")))
++ (set (attr "length") (if_then_else (and (eq_attr "type" "alu_shift_reg")
++ (eq_attr "fix_janus" "yes"))
++ (const_int 8)
++ (const_int 4)))]
+ )
+
+ (define_insn "*arm_cmpsi_shiftsi_swp"
+@@ -7522,7 +7995,11 @@
+ (set_attr "shift" "1")
+ (set (attr "type") (if_then_else (match_operand 2 "const_int_operand" "")
+ (const_string "alu_shift")
+- (const_string "alu_shift_reg")))]
++ (const_string "alu_shift_reg")))
++ (set (attr "length") (if_then_else (and (eq_attr "type" "alu_shift_reg")
++ (eq_attr "fix_janus" "yes"))
++ (const_int 8)
++ (const_int 4)))]
+ )
+
+ (define_insn "*arm_cmpsi_negshiftsi_si"
+@@ -7537,7 +8014,11 @@
+ [(set_attr "conds" "set")
+ (set (attr "type") (if_then_else (match_operand 3 "const_int_operand" "")
+ (const_string "alu_shift")
+- (const_string "alu_shift_reg")))]
++ (const_string "alu_shift_reg")))
++ (set (attr "length") (if_then_else (and (eq_attr "type" "alu_shift_reg")
++ (eq_attr "fix_janus" "yes"))
++ (const_int 8)
++ (const_int 4)))]
+ )
+
+ ;; Cirrus SF compare instruction
+@@ -7879,77 +8360,77 @@
+ (define_expand "seq"
+ [(set (match_operand:SI 0 "s_register_operand" "")
+ (eq:SI (match_dup 1) (const_int 0)))]
+- "TARGET_32BIT"
++ "TARGET_32BIT && !TARGET_NO_COND_EXEC"
+ "operands[1] = arm_gen_compare_reg (EQ, arm_compare_op0, arm_compare_op1);"
+ )
+
+ (define_expand "sne"
+ [(set (match_operand:SI 0 "s_register_operand" "")
+ (ne:SI (match_dup 1) (const_int 0)))]
+- "TARGET_32BIT"
++ "TARGET_32BIT && !TARGET_NO_COND_EXEC"
+ "operands[1] = arm_gen_compare_reg (NE, arm_compare_op0, arm_compare_op1);"
+ )
+
+ (define_expand "sgt"
+ [(set (match_operand:SI 0 "s_register_operand" "")
+ (gt:SI (match_dup 1) (const_int 0)))]
+- "TARGET_32BIT"
++ "TARGET_32BIT && !TARGET_NO_COND_EXEC"
+ "operands[1] = arm_gen_compare_reg (GT, arm_compare_op0, arm_compare_op1);"
+ )
+
+ (define_expand "sle"
+ [(set (match_operand:SI 0 "s_register_operand" "")
+ (le:SI (match_dup 1) (const_int 0)))]
+- "TARGET_32BIT"
++ "TARGET_32BIT && !TARGET_NO_COND_EXEC"
+ "operands[1] = arm_gen_compare_reg (LE, arm_compare_op0, arm_compare_op1);"
+ )
+
+ (define_expand "sge"
+ [(set (match_operand:SI 0 "s_register_operand" "")
+ (ge:SI (match_dup 1) (const_int 0)))]
+- "TARGET_32BIT"
++ "TARGET_32BIT && !TARGET_NO_COND_EXEC"
+ "operands[1] = arm_gen_compare_reg (GE, arm_compare_op0, arm_compare_op1);"
+ )
+
+ (define_expand "slt"
+ [(set (match_operand:SI 0 "s_register_operand" "")
+ (lt:SI (match_dup 1) (const_int 0)))]
+- "TARGET_32BIT"
++ "TARGET_32BIT && !TARGET_NO_COND_EXEC"
+ "operands[1] = arm_gen_compare_reg (LT, arm_compare_op0, arm_compare_op1);"
+ )
+
+ (define_expand "sgtu"
+ [(set (match_operand:SI 0 "s_register_operand" "")
+ (gtu:SI (match_dup 1) (const_int 0)))]
+- "TARGET_32BIT"
++ "TARGET_32BIT && !TARGET_NO_COND_EXEC"
+ "operands[1] = arm_gen_compare_reg (GTU, arm_compare_op0, arm_compare_op1);"
+ )
+
+ (define_expand "sleu"
+ [(set (match_operand:SI 0 "s_register_operand" "")
+ (leu:SI (match_dup 1) (const_int 0)))]
+- "TARGET_32BIT"
++ "TARGET_32BIT && !TARGET_NO_COND_EXEC"
+ "operands[1] = arm_gen_compare_reg (LEU, arm_compare_op0, arm_compare_op1);"
+ )
+
+ (define_expand "sgeu"
+ [(set (match_operand:SI 0 "s_register_operand" "")
+ (geu:SI (match_dup 1) (const_int 0)))]
+- "TARGET_32BIT"
++ "TARGET_32BIT && !TARGET_NO_COND_EXEC"
+ "operands[1] = arm_gen_compare_reg (GEU, arm_compare_op0, arm_compare_op1);"
+ )
+
+ (define_expand "sltu"
+ [(set (match_operand:SI 0 "s_register_operand" "")
+ (ltu:SI (match_dup 1) (const_int 0)))]
+- "TARGET_32BIT"
++ "TARGET_32BIT && !TARGET_NO_COND_EXEC"
+ "operands[1] = arm_gen_compare_reg (LTU, arm_compare_op0, arm_compare_op1);"
+ )
+
+ (define_expand "sunordered"
+ [(set (match_operand:SI 0 "s_register_operand" "")
+ (unordered:SI (match_dup 1) (const_int 0)))]
+- "TARGET_32BIT && TARGET_HARD_FLOAT && (TARGET_FPA || TARGET_VFP)"
++ "TARGET_32BIT && TARGET_HARD_FLOAT && (TARGET_FPA || TARGET_VFP) && !TARGET_NO_COND_EXEC"
+ "operands[1] = arm_gen_compare_reg (UNORDERED, arm_compare_op0,
+ arm_compare_op1);"
+ )
+@@ -7957,7 +8438,7 @@
+ (define_expand "sordered"
+ [(set (match_operand:SI 0 "s_register_operand" "")
+ (ordered:SI (match_dup 1) (const_int 0)))]
+- "TARGET_32BIT && TARGET_HARD_FLOAT && (TARGET_FPA || TARGET_VFP)"
++ "TARGET_32BIT && TARGET_HARD_FLOAT && (TARGET_FPA || TARGET_VFP) && !TARGET_NO_COND_EXEC"
+ "operands[1] = arm_gen_compare_reg (ORDERED, arm_compare_op0,
+ arm_compare_op1);"
+ )
+@@ -7965,7 +8446,7 @@
+ (define_expand "sungt"
+ [(set (match_operand:SI 0 "s_register_operand" "")
+ (ungt:SI (match_dup 1) (const_int 0)))]
+- "TARGET_32BIT && TARGET_HARD_FLOAT && (TARGET_FPA || TARGET_VFP)"
++ "TARGET_32BIT && TARGET_HARD_FLOAT && (TARGET_FPA || TARGET_VFP) && !TARGET_NO_COND_EXEC"
+ "operands[1] = arm_gen_compare_reg (UNGT, arm_compare_op0,
+ arm_compare_op1);"
+ )
+@@ -7973,7 +8454,7 @@
+ (define_expand "sunge"
+ [(set (match_operand:SI 0 "s_register_operand" "")
+ (unge:SI (match_dup 1) (const_int 0)))]
+- "TARGET_32BIT && TARGET_HARD_FLOAT && (TARGET_FPA || TARGET_VFP)"
++ "TARGET_32BIT && TARGET_HARD_FLOAT && (TARGET_FPA || TARGET_VFP) && !TARGET_NO_COND_EXEC"
+ "operands[1] = arm_gen_compare_reg (UNGE, arm_compare_op0,
+ arm_compare_op1);"
+ )
+@@ -7981,7 +8462,7 @@
+ (define_expand "sunlt"
+ [(set (match_operand:SI 0 "s_register_operand" "")
+ (unlt:SI (match_dup 1) (const_int 0)))]
+- "TARGET_32BIT && TARGET_HARD_FLOAT && (TARGET_FPA || TARGET_VFP)"
++ "TARGET_32BIT && TARGET_HARD_FLOAT && (TARGET_FPA || TARGET_VFP) && !TARGET_NO_COND_EXEC"
+ "operands[1] = arm_gen_compare_reg (UNLT, arm_compare_op0,
+ arm_compare_op1);"
+ )
+@@ -7989,7 +8470,7 @@
+ (define_expand "sunle"
+ [(set (match_operand:SI 0 "s_register_operand" "")
+ (unle:SI (match_dup 1) (const_int 0)))]
+- "TARGET_32BIT && TARGET_HARD_FLOAT && (TARGET_FPA || TARGET_VFP)"
++ "TARGET_32BIT && TARGET_HARD_FLOAT && (TARGET_FPA || TARGET_VFP) && !TARGET_NO_COND_EXEC"
+ "operands[1] = arm_gen_compare_reg (UNLE, arm_compare_op0,
+ arm_compare_op1);"
+ )
+@@ -8018,6 +8499,7 @@
+ "TARGET_ARM"
+ "mov%D1\\t%0, #0\;mov%d1\\t%0, #1"
+ [(set_attr "conds" "use")
++ (set_attr "insn" "mov")
+ (set_attr "length" "8")]
+ )
+
+@@ -8028,6 +8510,7 @@
+ "TARGET_ARM"
+ "mov%D1\\t%0, #0\;mvn%d1\\t%0, #0"
+ [(set_attr "conds" "use")
++ (set_attr "insn" "mov")
+ (set_attr "length" "8")]
+ )
+
+@@ -8038,6 +8521,7 @@
+ "TARGET_ARM"
+ "mov%D1\\t%0, #0\;mvn%d1\\t%0, #1"
+ [(set_attr "conds" "use")
++ (set_attr "insn" "mov")
+ (set_attr "length" "8")]
+ )
+
+@@ -8241,7 +8725,7 @@
+ (if_then_else:SI (match_operand 1 "arm_comparison_operator" "")
+ (match_operand:SI 2 "arm_not_operand" "")
+ (match_operand:SI 3 "arm_not_operand" "")))]
+- "TARGET_32BIT"
++ "TARGET_32BIT && !TARGET_NO_COND_EXEC"
+ "
+ {
+ enum rtx_code code = GET_CODE (operands[1]);
+@@ -8260,7 +8744,7 @@
+ (if_then_else:SF (match_operand 1 "arm_comparison_operator" "")
+ (match_operand:SF 2 "s_register_operand" "")
+ (match_operand:SF 3 "nonmemory_operand" "")))]
+- "TARGET_32BIT && TARGET_HARD_FLOAT"
++ "TARGET_32BIT && TARGET_HARD_FLOAT && !TARGET_NO_COND_EXEC"
+ "
+ {
+ enum rtx_code code = GET_CODE (operands[1]);
+@@ -8285,7 +8769,7 @@
+ (if_then_else:DF (match_operand 1 "arm_comparison_operator" "")
+ (match_operand:DF 2 "s_register_operand" "")
+ (match_operand:DF 3 "arm_float_add_operand" "")))]
+- "TARGET_32BIT && TARGET_HARD_FLOAT && (TARGET_FPA || TARGET_VFP)"
++ "TARGET_32BIT && TARGET_HARD_FLOAT && (TARGET_FPA || TARGET_VFP_DOUBLE) && !TARGET_NO_COND_EXEC"
+ "
+ {
+ enum rtx_code code = GET_CODE (operands[1]);
+@@ -8317,7 +8801,8 @@
+ mvn%d3\\t%0, #%B1\;mov%D3\\t%0, %2
+ mvn%d3\\t%0, #%B1\;mvn%D3\\t%0, #%B2"
+ [(set_attr "length" "4,4,4,4,8,8,8,8")
+- (set_attr "conds" "use")]
++ (set_attr "conds" "use")
++ (set_attr "insn" "mov,mvn,mov,mvn,mov,mov,mvn,mvn")]
+ )
+
+ (define_insn "*movsfcc_soft_insn"
+@@ -8330,7 +8815,8 @@
+ "@
+ mov%D3\\t%0, %2
+ mov%d3\\t%0, %1"
+- [(set_attr "conds" "use")]
++ [(set_attr "conds" "use")
++ (set_attr "insn" "mov")]
+ )
+
+
+@@ -8733,7 +9219,7 @@
+ [(match_operand 1 "cc_register" "") (const_int 0)])
+ (return)
+ (pc)))]
+- "TARGET_ARM && USE_RETURN_INSN (TRUE)"
++ "TARGET_ARM && USE_RETURN_INSN (TRUE) && !TARGET_NO_COND_EXEC"
+ "*
+ {
+ if (arm_ccfsm_state == 2)
+@@ -8754,7 +9240,7 @@
+ [(match_operand 1 "cc_register" "") (const_int 0)])
+ (pc)
+ (return)))]
+- "TARGET_ARM && USE_RETURN_INSN (TRUE)"
++ "TARGET_ARM && USE_RETURN_INSN (TRUE) && !TARGET_NO_COND_EXEC"
+ "*
+ {
+ if (arm_ccfsm_state == 2)
+@@ -9072,7 +9558,11 @@
+ (set_attr "shift" "4")
+ (set (attr "type") (if_then_else (match_operand 5 "const_int_operand" "")
+ (const_string "alu_shift")
+- (const_string "alu_shift_reg")))]
++ (const_string "alu_shift_reg")))
++ (set (attr "length") (if_then_else (and (eq_attr "type" "alu_shift_reg")
++ (eq_attr "fix_janus" "yes"))
++ (const_int 8)
++ (const_int 4)))]
+ )
+
+ (define_split
+@@ -9110,7 +9600,11 @@
+ (set_attr "shift" "4")
+ (set (attr "type") (if_then_else (match_operand 5 "const_int_operand" "")
+ (const_string "alu_shift")
+- (const_string "alu_shift_reg")))]
++ (const_string "alu_shift_reg")))
++ (set (attr "length") (if_then_else (and (eq_attr "type" "alu_shift_reg")
++ (eq_attr "fix_janus" "yes"))
++ (const_int 8)
++ (const_int 4)))]
+ )
+
+ (define_insn "*arith_shiftsi_compare0_scratch"
+@@ -9128,7 +9622,11 @@
+ (set_attr "shift" "4")
+ (set (attr "type") (if_then_else (match_operand 5 "const_int_operand" "")
+ (const_string "alu_shift")
+- (const_string "alu_shift_reg")))]
++ (const_string "alu_shift_reg")))
++ (set (attr "length") (if_then_else (and (eq_attr "type" "alu_shift_reg")
++ (eq_attr "fix_janus" "yes"))
++ (const_int 8)
++ (const_int 4)))]
+ )
+
+ (define_insn "*sub_shiftsi"
+@@ -9143,7 +9641,11 @@
+ (set_attr "shift" "3")
+ (set (attr "type") (if_then_else (match_operand 4 "const_int_operand" "")
+ (const_string "alu_shift")
+- (const_string "alu_shift_reg")))]
++ (const_string "alu_shift_reg")))
++ (set (attr "length") (if_then_else (and (eq_attr "type" "alu_shift_reg")
++ (eq_attr "fix_janus" "yes"))
++ (const_int 8)
++ (const_int 4)))]
+ )
+
+ (define_insn "*sub_shiftsi_compare0"
+@@ -9163,7 +9665,11 @@
+ (set_attr "shift" "3")
+ (set (attr "type") (if_then_else (match_operand 4 "const_int_operand" "")
+ (const_string "alu_shift")
+- (const_string "alu_shift_reg")))]
++ (const_string "alu_shift_reg")))
++ (set (attr "length") (if_then_else (and (eq_attr "type" "alu_shift_reg")
++ (eq_attr "fix_janus" "yes"))
++ (const_int 8)
++ (const_int 4)))]
+ )
+
+ (define_insn "*sub_shiftsi_compare0_scratch"
+@@ -9181,7 +9687,11 @@
+ (set_attr "shift" "3")
+ (set (attr "type") (if_then_else (match_operand 4 "const_int_operand" "")
+ (const_string "alu_shift")
+- (const_string "alu_shift_reg")))]
++ (const_string "alu_shift_reg")))
++ (set (attr "length") (if_then_else (and (eq_attr "type" "alu_shift_reg")
++ (eq_attr "fix_janus" "yes"))
++ (const_int 8)
++ (const_int 4)))]
+ )
+
+
+@@ -9194,6 +9704,7 @@
+ "TARGET_ARM"
+ "mov%D1\\t%0, #0\;and%d1\\t%0, %2, #1"
+ [(set_attr "conds" "use")
++ (set_attr "insn" "mov")
+ (set_attr "length" "8")]
+ )
+
+@@ -9207,6 +9718,7 @@
+ orr%d2\\t%0, %1, #1
+ mov%D2\\t%0, %1\;orr%d2\\t%0, %1, #1"
+ [(set_attr "conds" "use")
++ (set_attr "insn" "orr")
+ (set_attr "length" "4,8")]
+ )
+
+@@ -9216,7 +9728,7 @@
+ [(match_operand:SI 2 "s_register_operand" "r,r")
+ (match_operand:SI 3 "arm_add_operand" "rI,L")]))
+ (clobber (reg:CC CC_REGNUM))]
+- "TARGET_ARM"
++ "TARGET_ARM && !TARGET_NO_COND_EXEC"
+ "*
+ if (operands[3] == const0_rtx)
+ {
+@@ -9271,6 +9783,7 @@
+ return \"\";
+ "
+ [(set_attr "conds" "use")
++ (set_attr "insn" "mov")
+ (set_attr "length" "4,4,8")]
+ )
+
+@@ -9282,7 +9795,7 @@
+ (match_operand:SI 3 "arm_rhs_operand" "rI,rI")])
+ (match_operand:SI 1 "s_register_operand" "0,?r")]))
+ (clobber (reg:CC CC_REGNUM))]
+- "TARGET_ARM"
++ "TARGET_ARM && !TARGET_NO_SINGLE_COND_EXEC"
+ "*
+ if (GET_CODE (operands[4]) == LT && operands[3] == const0_rtx)
+ return \"%i5\\t%0, %1, %2, lsr #31\";
+@@ -9678,7 +10191,7 @@
+ (match_operand:SI 1 "arm_rhs_operand" "0,rI,?rI")
+ (match_operand:SI 2 "arm_rhs_operand" "rI,0,rI")))
+ (clobber (reg:CC CC_REGNUM))]
+- "TARGET_ARM"
++ "TARGET_ARM && !TARGET_NO_COND_EXEC"
+ "*
+ if (GET_CODE (operands[5]) == LT
+ && (operands[4] == const0_rtx))
+@@ -9744,7 +10257,7 @@
+ (match_operand:SI 3 "arm_add_operand" "rIL,rIL"))
+ (match_operand:SI 1 "arm_rhs_operand" "0,?rI")))
+ (clobber (reg:CC CC_REGNUM))]
+- "TARGET_ARM"
++ "TARGET_ARM && !TARGET_NO_SINGLE_COND_EXEC"
+ "#"
+ [(set_attr "conds" "clob")
+ (set_attr "length" "8,12")]
+@@ -9780,7 +10293,7 @@
+ (match_operand:SI 2 "s_register_operand" "r,r")
+ (match_operand:SI 3 "arm_add_operand" "rIL,rIL"))))
+ (clobber (reg:CC CC_REGNUM))]
+- "TARGET_ARM"
++ "TARGET_ARM && !TARGET_NO_SINGLE_COND_EXEC"
+ "#"
+ [(set_attr "conds" "clob")
+ (set_attr "length" "8,12")]
+@@ -9818,7 +10331,7 @@
+ [(match_operand:SI 3 "s_register_operand" "r")
+ (match_operand:SI 4 "arm_rhs_operand" "rI")])))
+ (clobber (reg:CC CC_REGNUM))]
+- "TARGET_ARM"
++ "TARGET_ARM && !TARGET_NO_SINGLE_COND_EXEC"
+ "#"
+ [(set_attr "conds" "clob")
+ (set_attr "length" "12")]
+@@ -9968,7 +10481,7 @@
+ (not:SI
+ (match_operand:SI 2 "s_register_operand" "r,r"))))
+ (clobber (reg:CC CC_REGNUM))]
+- "TARGET_ARM"
++ "TARGET_ARM && !TARGET_NO_SINGLE_COND_EXEC"
+ "#"
+ [(set_attr "conds" "clob")
+ (set_attr "length" "8,12")]
+@@ -9987,6 +10500,7 @@
+ mov%d4\\t%0, %1\;mvn%D4\\t%0, %2
+ mvn%d4\\t%0, #%B1\;mvn%D4\\t%0, %2"
+ [(set_attr "conds" "use")
++ (set_attr "insn" "mvn")
+ (set_attr "length" "4,8,8")]
+ )
+
+@@ -10000,7 +10514,7 @@
+ (match_operand:SI 2 "s_register_operand" "r,r"))
+ (match_operand:SI 1 "arm_not_operand" "0,?rIK")))
+ (clobber (reg:CC CC_REGNUM))]
+- "TARGET_ARM"
++ "TARGET_ARM && !TARGET_NO_SINGLE_COND_EXEC"
+ "#"
+ [(set_attr "conds" "clob")
+ (set_attr "length" "8,12")]
+@@ -10019,6 +10533,7 @@
+ mov%D4\\t%0, %1\;mvn%d4\\t%0, %2
+ mvn%D4\\t%0, #%B1\;mvn%d4\\t%0, %2"
+ [(set_attr "conds" "use")
++ (set_attr "insn" "mvn")
+ (set_attr "length" "4,8,8")]
+ )
+
+@@ -10033,7 +10548,7 @@
+ (match_operand:SI 3 "arm_rhs_operand" "rM,rM")])
+ (match_operand:SI 1 "arm_not_operand" "0,?rIK")))
+ (clobber (reg:CC CC_REGNUM))]
+- "TARGET_ARM"
++ "TARGET_ARM && !TARGET_NO_SINGLE_COND_EXEC"
+ "#"
+ [(set_attr "conds" "clob")
+ (set_attr "length" "8,12")]
+@@ -10055,10 +10570,23 @@
+ mvn%D5\\t%0, #%B1\;mov%d5\\t%0, %2%S4"
+ [(set_attr "conds" "use")
+ (set_attr "shift" "2")
+- (set_attr "length" "4,8,8")
++ (set_attr "insn" "mov")
+ (set (attr "type") (if_then_else (match_operand 3 "const_int_operand" "")
+ (const_string "alu_shift")
+- (const_string "alu_shift_reg")))]
++ (const_string "alu_shift_reg")))
++ (set_attr_alternative "length"
++ [(if_then_else (and (eq_attr "type" "alu_shift_reg")
++ (eq_attr "fix_janus" "yes"))
++ (const_int 8)
++ (const_int 4))
++ (if_then_else (and (eq_attr "type" "alu_shift_reg")
++ (eq_attr "fix_janus" "yes"))
++ (const_int 12)
++ (const_int 8))
++ (if_then_else (and (eq_attr "type" "alu_shift_reg")
++ (eq_attr "fix_janus" "yes"))
++ (const_int 12)
++ (const_int 8))])]
+ )
+
+ (define_insn "*ifcompare_move_shift"
+@@ -10072,7 +10600,7 @@
+ [(match_operand:SI 2 "s_register_operand" "r,r")
+ (match_operand:SI 3 "arm_rhs_operand" "rM,rM")])))
+ (clobber (reg:CC CC_REGNUM))]
+- "TARGET_ARM"
++ "TARGET_ARM && !TARGET_NO_SINGLE_COND_EXEC"
+ "#"
+ [(set_attr "conds" "clob")
+ (set_attr "length" "8,12")]
+@@ -10094,10 +10622,24 @@
+ mvn%d5\\t%0, #%B1\;mov%D5\\t%0, %2%S4"
+ [(set_attr "conds" "use")
+ (set_attr "shift" "2")
+- (set_attr "length" "4,8,8")
++ (set_attr "insn" "mov")
+ (set (attr "type") (if_then_else (match_operand 3 "const_int_operand" "")
+ (const_string "alu_shift")
+- (const_string "alu_shift_reg")))]
++ (const_string "alu_shift_reg")))
++ (set_attr_alternative "length"
++ [(if_then_else (and (eq_attr "type" "alu_shift_reg")
++ (eq_attr "fix_janus" "yes"))
++ (const_int 8)
++ (const_int 4))
++ (if_then_else (and (eq_attr "type" "alu_shift_reg")
++ (eq_attr "fix_janus" "yes"))
++ (const_int 12)
++ (const_int 8))
++ (if_then_else (and (eq_attr "type" "alu_shift_reg")
++ (eq_attr "fix_janus" "yes"))
++ (const_int 12)
++ (const_int 8))])
++ (set_attr "insn" "mov")]
+ )
+
+ (define_insn "*ifcompare_shift_shift"
+@@ -10113,7 +10655,7 @@
+ [(match_operand:SI 3 "s_register_operand" "r")
+ (match_operand:SI 4 "arm_rhs_operand" "rM")])))
+ (clobber (reg:CC CC_REGNUM))]
+- "TARGET_ARM"
++ "TARGET_ARM && !TARGET_NO_SINGLE_COND_EXEC"
+ "#"
+ [(set_attr "conds" "clob")
+ (set_attr "length" "12")]
+@@ -10134,12 +10676,16 @@
+ "mov%d5\\t%0, %1%S6\;mov%D5\\t%0, %3%S7"
+ [(set_attr "conds" "use")
+ (set_attr "shift" "1")
+- (set_attr "length" "8")
++ (set_attr "insn" "mov")
+ (set (attr "type") (if_then_else
+ (and (match_operand 2 "const_int_operand" "")
+ (match_operand 4 "const_int_operand" ""))
+ (const_string "alu_shift")
+- (const_string "alu_shift_reg")))]
++ (const_string "alu_shift_reg")))
++ (set (attr "length") (if_then_else (and (eq_attr "type" "alu_shift_reg")
++ (eq_attr "fix_janus" "yes"))
++ (const_int 16)
++ (const_int 8)))]
+ )
+
+ (define_insn "*ifcompare_not_arith"
+@@ -10153,7 +10699,7 @@
+ [(match_operand:SI 2 "s_register_operand" "r")
+ (match_operand:SI 3 "arm_rhs_operand" "rI")])))
+ (clobber (reg:CC CC_REGNUM))]
+- "TARGET_ARM"
++ "TARGET_ARM && !TARGET_NO_SINGLE_COND_EXEC"
+ "#"
+ [(set_attr "conds" "clob")
+ (set_attr "length" "12")]
+@@ -10171,6 +10717,7 @@
+ "TARGET_ARM"
+ "mvn%d5\\t%0, %1\;%I6%D5\\t%0, %2, %3"
+ [(set_attr "conds" "use")
++ (set_attr "insn" "mvn")
+ (set_attr "length" "8")]
+ )
+
+@@ -10185,7 +10732,7 @@
+ (match_operand:SI 3 "arm_rhs_operand" "rI")])
+ (not:SI (match_operand:SI 1 "s_register_operand" "r"))))
+ (clobber (reg:CC CC_REGNUM))]
+- "TARGET_ARM"
++ "TARGET_ARM && !TARGET_NO_SINGLE_COND_EXEC"
+ "#"
+ [(set_attr "conds" "clob")
+ (set_attr "length" "12")]
+@@ -10203,6 +10750,7 @@
+ "TARGET_ARM"
+ "mvn%D5\\t%0, %1\;%I6%d5\\t%0, %2, %3"
+ [(set_attr "conds" "use")
++ (set_attr "insn" "mvn")
+ (set_attr "length" "8")]
+ )
+
+@@ -10215,7 +10763,7 @@
+ (neg:SI (match_operand:SI 2 "s_register_operand" "r,r"))
+ (match_operand:SI 1 "arm_not_operand" "0,?rIK")))
+ (clobber (reg:CC CC_REGNUM))]
+- "TARGET_ARM"
++ "TARGET_ARM && !TARGET_NO_SINGLE_COND_EXEC"
+ "#"
+ [(set_attr "conds" "clob")
+ (set_attr "length" "8,12")]
+@@ -10246,7 +10794,7 @@
+ (match_operand:SI 1 "arm_not_operand" "0,?rIK")
+ (neg:SI (match_operand:SI 2 "s_register_operand" "r,r"))))
+ (clobber (reg:CC CC_REGNUM))]
+- "TARGET_ARM"
++ "TARGET_ARM && !TARGET_NO_SINGLE_COND_EXEC"
+ "#"
+ [(set_attr "conds" "clob")
+ (set_attr "length" "8,12")]
+@@ -10614,7 +11162,7 @@
+ (match_dup 0)
+ (match_operand 4 "" "")))
+ (clobber (reg:CC CC_REGNUM))]
+- "TARGET_ARM && reload_completed"
++ "TARGET_ARM && reload_completed && !TARGET_NO_SINGLE_COND_EXEC"
+ [(set (match_dup 5) (match_dup 6))
+ (cond_exec (match_dup 7)
+ (set (match_dup 0) (match_dup 4)))]
+@@ -10642,7 +11190,7 @@
+ (match_operand 4 "" "")
+ (match_dup 0)))
+ (clobber (reg:CC CC_REGNUM))]
+- "TARGET_ARM && reload_completed"
++ "TARGET_ARM && reload_completed && !TARGET_NO_SINGLE_COND_EXEC"
+ [(set (match_dup 5) (match_dup 6))
+ (cond_exec (match_op_dup 1 [(match_dup 5) (const_int 0)])
+ (set (match_dup 0) (match_dup 4)))]
+@@ -10663,7 +11211,7 @@
+ (match_operand 4 "" "")
+ (match_operand 5 "" "")))
+ (clobber (reg:CC CC_REGNUM))]
+- "TARGET_ARM && reload_completed"
++ "TARGET_ARM && reload_completed && !TARGET_NO_SINGLE_COND_EXEC"
+ [(set (match_dup 6) (match_dup 7))
+ (cond_exec (match_op_dup 1 [(match_dup 6) (const_int 0)])
+ (set (match_dup 0) (match_dup 4)))
+@@ -10695,7 +11243,7 @@
+ (not:SI
+ (match_operand:SI 5 "s_register_operand" ""))))
+ (clobber (reg:CC CC_REGNUM))]
+- "TARGET_ARM && reload_completed"
++ "TARGET_ARM && reload_completed && !TARGET_NO_SINGLE_COND_EXEC"
+ [(set (match_dup 6) (match_dup 7))
+ (cond_exec (match_op_dup 1 [(match_dup 6) (const_int 0)])
+ (set (match_dup 0) (match_dup 4)))
+@@ -10730,6 +11278,7 @@
+ mvn%D4\\t%0, %2
+ mov%d4\\t%0, %1\;mvn%D4\\t%0, %2"
+ [(set_attr "conds" "use")
++ (set_attr "insn" "mvn")
+ (set_attr "length" "4,8")]
+ )
+
+@@ -10864,6 +11413,24 @@
+ "
+ )
+
++(define_insn "align_16"
++ [(unspec_volatile [(const_int 0)] VUNSPEC_ALIGN16)]
++ "TARGET_EITHER"
++ "*
++ assemble_align (128);
++ return \"\";
++ "
++)
++
++(define_insn "align_32"
++ [(unspec_volatile [(const_int 0)] VUNSPEC_ALIGN32)]
++ "TARGET_EITHER"
++ "*
++ assemble_align (256);
++ return \"\";
++ "
++)
++
+ (define_insn "consttable_end"
+ [(unspec_volatile [(const_int 0)] VUNSPEC_POOL_END)]
+ "TARGET_EITHER"
+@@ -10890,6 +11457,7 @@
+ "TARGET_THUMB1"
+ "*
+ making_const_table = TRUE;
++ gcc_assert (GET_MODE_CLASS (GET_MODE (operands[0])) != MODE_FLOAT);
+ assemble_integer (operands[0], 2, BITS_PER_WORD, 1);
+ assemble_zeros (2);
+ return \"\";
+@@ -10902,19 +11470,30 @@
+ "TARGET_EITHER"
+ "*
+ {
++ rtx x = operands[0];
+ making_const_table = TRUE;
+- switch (GET_MODE_CLASS (GET_MODE (operands[0])))
++ switch (GET_MODE_CLASS (GET_MODE (x)))
+ {
+ case MODE_FLOAT:
+- {
+- REAL_VALUE_TYPE r;
+- REAL_VALUE_FROM_CONST_DOUBLE (r, operands[0]);
+- assemble_real (r, GET_MODE (operands[0]), BITS_PER_WORD);
+- break;
+- }
++ if (GET_MODE (x) == HFmode)
++ arm_emit_fp16_const (x);
++ else
++ {
++ REAL_VALUE_TYPE r;
++ REAL_VALUE_FROM_CONST_DOUBLE (r, x);
++ assemble_real (r, GET_MODE (x), BITS_PER_WORD);
++ }
++ break;
+ default:
+- assemble_integer (operands[0], 4, BITS_PER_WORD, 1);
+- mark_symbol_refs_as_used (operands[0]);
++ /* XXX: Sometimes gcc does something really dumb and ends up with
++ a HIGH in a constant pool entry, usually because it's trying to
++ load into a VFP register. We know this will always be used in
++ combination with a LO_SUM which ignores the high bits, so just
++ strip off the HIGH. */
++ if (GET_CODE (x) == HIGH)
++ x = XEXP (x, 0);
++ assemble_integer (x, 4, BITS_PER_WORD, 1);
++ mark_symbol_refs_as_used (x);
+ break;
+ }
+ return \"\";
+@@ -11008,6 +11587,28 @@
+ [(set_attr "predicable" "yes")
+ (set_attr "insn" "clz")])
+
++(define_insn "rbitsi2"
++ [(set (match_operand:SI 0 "s_register_operand" "=r")
++ (unspec:SI [(match_operand:SI 1 "s_register_operand" "r")] UNSPEC_RBIT))]
++ "TARGET_32BIT && arm_arch_thumb2"
++ "rbit%?\\t%0, %1"
++ [(set_attr "predicable" "yes")
++ (set_attr "insn" "clz")])
++
++(define_expand "ctzsi2"
++ [(set (match_operand:SI 0 "s_register_operand" "")
++ (ctz:SI (match_operand:SI 1 "s_register_operand" "")))]
++ "TARGET_32BIT && arm_arch_thumb2"
++ "
++ {
++ rtx tmp = gen_reg_rtx (SImode);
++ emit_insn (gen_rbitsi2 (tmp, operands[1]));
++ emit_insn (gen_clzsi2 (operands[0], tmp));
++ }
++ DONE;
++ "
++)
++
+ ;; V5E instructions.
+
+ (define_insn "prefetch"
+@@ -11017,13 +11618,15 @@
+ "TARGET_32BIT && arm_arch5e"
+ "pld\\t%a0")
+
+-;; General predication pattern
++;; General predication pattern.
++;; Conditional branches are available as both arm_cond_branch and
++;; predicated arm_jump, so it doesn't matter if we disable the latter.
+
+ (define_cond_exec
+ [(match_operator 0 "arm_comparison_operator"
+ [(match_operand 1 "cc_register" "")
+ (const_int 0)])]
+- "TARGET_32BIT"
++ "TARGET_32BIT && !TARGET_NO_SINGLE_COND_EXEC"
+ ""
+ )
+
+diff -Nur a/gcc/config/arm/arm-modes.def b/gcc/config/arm/arm-modes.def
+--- a/gcc/config/arm/arm-modes.def 2007-08-02 12:49:31.000000000 +0200
++++ b/gcc/config/arm/arm-modes.def 2010-01-25 09:50:28.985687200 +0100
+@@ -25,6 +25,11 @@
+ FIXME What format is this? */
+ FLOAT_MODE (XF, 12, 0);
+
++/* Half-precision floating point */
++FLOAT_MODE (HF, 2, 0);
++ADJUST_FLOAT_FORMAT (HF, ((arm_fp16_format == ARM_FP16_FORMAT_ALTERNATIVE)
++ ? &arm_half_format : &ieee_half_format));
++
+ /* CCFPEmode should be used with floating inequalities,
+ CCFPmode should be used with floating equalities.
+ CC_NOOVmode should be used with SImode integer equalities.
+@@ -62,6 +67,4 @@
+ INT_MODE (EI, 24);
+ INT_MODE (OI, 32);
+ INT_MODE (CI, 48);
+-/* ??? This should actually have 512 bits but the precision only has 9
+- bits. */
+-FRACTIONAL_INT_MODE (XI, 511, 64);
++INT_MODE (XI, 64);
+diff -Nur a/gcc/config/arm/arm_neon.h b/gcc/config/arm/arm_neon.h
+--- a/gcc/config/arm/arm_neon.h 2009-04-10 01:23:07.000000000 +0200
++++ b/gcc/config/arm/arm_neon.h 2010-01-25 09:50:28.985687200 +0100
+@@ -36,7 +36,11 @@
+ extern "C" {
+ #endif
+
++#if defined (__vxworks) && defined (_WRS_KERNEL)
++#include <vxWorks.h>
++#else
+ #include <stdint.h>
++#endif
+
+ typedef __builtin_neon_qi int8x8_t __attribute__ ((__vector_size__ (8)));
+ typedef __builtin_neon_hi int16x4_t __attribute__ ((__vector_size__ (8)));
+@@ -61,7 +65,7 @@
+ typedef __builtin_neon_usi uint32x4_t __attribute__ ((__vector_size__ (16)));
+ typedef __builtin_neon_udi uint64x2_t __attribute__ ((__vector_size__ (16)));
+
+-typedef __builtin_neon_sf float32_t;
++typedef float float32_t;
+ typedef __builtin_neon_poly8 poly8_t;
+ typedef __builtin_neon_poly16 poly16_t;
+
+@@ -5085,7 +5089,7 @@
+ __extension__ static __inline float32x2_t __attribute__ ((__always_inline__))
+ vset_lane_f32 (float32_t __a, float32x2_t __b, const int __c)
+ {
+- return (float32x2_t)__builtin_neon_vset_lanev2sf (__a, __b, __c);
++ return (float32x2_t)__builtin_neon_vset_lanev2sf ((__builtin_neon_sf) __a, __b, __c);
+ }
+
+ __extension__ static __inline uint8x8_t __attribute__ ((__always_inline__))
+@@ -5151,7 +5155,7 @@
+ __extension__ static __inline float32x4_t __attribute__ ((__always_inline__))
+ vsetq_lane_f32 (float32_t __a, float32x4_t __b, const int __c)
+ {
+- return (float32x4_t)__builtin_neon_vset_lanev4sf (__a, __b, __c);
++ return (float32x4_t)__builtin_neon_vset_lanev4sf ((__builtin_neon_sf) __a, __b, __c);
+ }
+
+ __extension__ static __inline uint8x16_t __attribute__ ((__always_inline__))
+@@ -5283,7 +5287,7 @@
+ __extension__ static __inline float32x2_t __attribute__ ((__always_inline__))
+ vdup_n_f32 (float32_t __a)
+ {
+- return (float32x2_t)__builtin_neon_vdup_nv2sf (__a);
++ return (float32x2_t)__builtin_neon_vdup_nv2sf ((__builtin_neon_sf) __a);
+ }
+
+ __extension__ static __inline uint8x8_t __attribute__ ((__always_inline__))
+@@ -5349,7 +5353,7 @@
+ __extension__ static __inline float32x4_t __attribute__ ((__always_inline__))
+ vdupq_n_f32 (float32_t __a)
+ {
+- return (float32x4_t)__builtin_neon_vdup_nv4sf (__a);
++ return (float32x4_t)__builtin_neon_vdup_nv4sf ((__builtin_neon_sf) __a);
+ }
+
+ __extension__ static __inline uint8x16_t __attribute__ ((__always_inline__))
+@@ -5415,7 +5419,7 @@
+ __extension__ static __inline float32x2_t __attribute__ ((__always_inline__))
+ vmov_n_f32 (float32_t __a)
+ {
+- return (float32x2_t)__builtin_neon_vdup_nv2sf (__a);
++ return (float32x2_t)__builtin_neon_vdup_nv2sf ((__builtin_neon_sf) __a);
+ }
+
+ __extension__ static __inline uint8x8_t __attribute__ ((__always_inline__))
+@@ -5481,7 +5485,7 @@
+ __extension__ static __inline float32x4_t __attribute__ ((__always_inline__))
+ vmovq_n_f32 (float32_t __a)
+ {
+- return (float32x4_t)__builtin_neon_vdup_nv4sf (__a);
++ return (float32x4_t)__builtin_neon_vdup_nv4sf ((__builtin_neon_sf) __a);
+ }
+
+ __extension__ static __inline uint8x16_t __attribute__ ((__always_inline__))
+@@ -6591,7 +6595,7 @@
+ __extension__ static __inline float32x2_t __attribute__ ((__always_inline__))
+ vmul_n_f32 (float32x2_t __a, float32_t __b)
+ {
+- return (float32x2_t)__builtin_neon_vmul_nv2sf (__a, __b, 3);
++ return (float32x2_t)__builtin_neon_vmul_nv2sf (__a, (__builtin_neon_sf) __b, 3);
+ }
+
+ __extension__ static __inline uint16x4_t __attribute__ ((__always_inline__))
+@@ -6621,7 +6625,7 @@
+ __extension__ static __inline float32x4_t __attribute__ ((__always_inline__))
+ vmulq_n_f32 (float32x4_t __a, float32_t __b)
+ {
+- return (float32x4_t)__builtin_neon_vmul_nv4sf (__a, __b, 3);
++ return (float32x4_t)__builtin_neon_vmul_nv4sf (__a, (__builtin_neon_sf) __b, 3);
+ }
+
+ __extension__ static __inline uint16x8_t __attribute__ ((__always_inline__))
+@@ -6735,7 +6739,7 @@
+ __extension__ static __inline float32x2_t __attribute__ ((__always_inline__))
+ vmla_n_f32 (float32x2_t __a, float32x2_t __b, float32_t __c)
+ {
+- return (float32x2_t)__builtin_neon_vmla_nv2sf (__a, __b, __c, 3);
++ return (float32x2_t)__builtin_neon_vmla_nv2sf (__a, __b, (__builtin_neon_sf) __c, 3);
+ }
+
+ __extension__ static __inline uint16x4_t __attribute__ ((__always_inline__))
+@@ -6765,7 +6769,7 @@
+ __extension__ static __inline float32x4_t __attribute__ ((__always_inline__))
+ vmlaq_n_f32 (float32x4_t __a, float32x4_t __b, float32_t __c)
+ {
+- return (float32x4_t)__builtin_neon_vmla_nv4sf (__a, __b, __c, 3);
++ return (float32x4_t)__builtin_neon_vmla_nv4sf (__a, __b, (__builtin_neon_sf) __c, 3);
+ }
+
+ __extension__ static __inline uint16x8_t __attribute__ ((__always_inline__))
+@@ -6831,7 +6835,7 @@
+ __extension__ static __inline float32x2_t __attribute__ ((__always_inline__))
+ vmls_n_f32 (float32x2_t __a, float32x2_t __b, float32_t __c)
+ {
+- return (float32x2_t)__builtin_neon_vmls_nv2sf (__a, __b, __c, 3);
++ return (float32x2_t)__builtin_neon_vmls_nv2sf (__a, __b, (__builtin_neon_sf) __c, 3);
+ }
+
+ __extension__ static __inline uint16x4_t __attribute__ ((__always_inline__))
+@@ -6861,7 +6865,7 @@
+ __extension__ static __inline float32x4_t __attribute__ ((__always_inline__))
+ vmlsq_n_f32 (float32x4_t __a, float32x4_t __b, float32_t __c)
+ {
+- return (float32x4_t)__builtin_neon_vmls_nv4sf (__a, __b, __c, 3);
++ return (float32x4_t)__builtin_neon_vmls_nv4sf (__a, __b, (__builtin_neon_sf) __c, 3);
+ }
+
+ __extension__ static __inline uint16x8_t __attribute__ ((__always_inline__))
+@@ -7851,7 +7855,7 @@
+ __extension__ static __inline float32x2_t __attribute__ ((__always_inline__))
+ vld1_f32 (const float32_t * __a)
+ {
+- return (float32x2_t)__builtin_neon_vld1v2sf (__a);
++ return (float32x2_t)__builtin_neon_vld1v2sf ((const __builtin_neon_sf *) __a);
+ }
+
+ __extension__ static __inline uint8x8_t __attribute__ ((__always_inline__))
+@@ -7917,7 +7921,7 @@
+ __extension__ static __inline float32x4_t __attribute__ ((__always_inline__))
+ vld1q_f32 (const float32_t * __a)
+ {
+- return (float32x4_t)__builtin_neon_vld1v4sf (__a);
++ return (float32x4_t)__builtin_neon_vld1v4sf ((const __builtin_neon_sf *) __a);
+ }
+
+ __extension__ static __inline uint8x16_t __attribute__ ((__always_inline__))
+@@ -7977,7 +7981,7 @@
+ __extension__ static __inline float32x2_t __attribute__ ((__always_inline__))
+ vld1_lane_f32 (const float32_t * __a, float32x2_t __b, const int __c)
+ {
+- return (float32x2_t)__builtin_neon_vld1_lanev2sf (__a, __b, __c);
++ return (float32x2_t)__builtin_neon_vld1_lanev2sf ((const __builtin_neon_sf *) __a, __b, __c);
+ }
+
+ __extension__ static __inline uint8x8_t __attribute__ ((__always_inline__))
+@@ -8043,7 +8047,7 @@
+ __extension__ static __inline float32x4_t __attribute__ ((__always_inline__))
+ vld1q_lane_f32 (const float32_t * __a, float32x4_t __b, const int __c)
+ {
+- return (float32x4_t)__builtin_neon_vld1_lanev4sf (__a, __b, __c);
++ return (float32x4_t)__builtin_neon_vld1_lanev4sf ((const __builtin_neon_sf *) __a, __b, __c);
+ }
+
+ __extension__ static __inline uint8x16_t __attribute__ ((__always_inline__))
+@@ -8109,7 +8113,7 @@
+ __extension__ static __inline float32x2_t __attribute__ ((__always_inline__))
+ vld1_dup_f32 (const float32_t * __a)
+ {
+- return (float32x2_t)__builtin_neon_vld1_dupv2sf (__a);
++ return (float32x2_t)__builtin_neon_vld1_dupv2sf ((const __builtin_neon_sf *) __a);
+ }
+
+ __extension__ static __inline uint8x8_t __attribute__ ((__always_inline__))
+@@ -8175,7 +8179,7 @@
+ __extension__ static __inline float32x4_t __attribute__ ((__always_inline__))
+ vld1q_dup_f32 (const float32_t * __a)
+ {
+- return (float32x4_t)__builtin_neon_vld1_dupv4sf (__a);
++ return (float32x4_t)__builtin_neon_vld1_dupv4sf ((const __builtin_neon_sf *) __a);
+ }
+
+ __extension__ static __inline uint8x16_t __attribute__ ((__always_inline__))
+@@ -8247,7 +8251,7 @@
+ __extension__ static __inline void __attribute__ ((__always_inline__))
+ vst1_f32 (float32_t * __a, float32x2_t __b)
+ {
+- __builtin_neon_vst1v2sf (__a, __b);
++ __builtin_neon_vst1v2sf ((__builtin_neon_sf *) __a, __b);
+ }
+
+ __extension__ static __inline void __attribute__ ((__always_inline__))
+@@ -8313,7 +8317,7 @@
+ __extension__ static __inline void __attribute__ ((__always_inline__))
+ vst1q_f32 (float32_t * __a, float32x4_t __b)
+ {
+- __builtin_neon_vst1v4sf (__a, __b);
++ __builtin_neon_vst1v4sf ((__builtin_neon_sf *) __a, __b);
+ }
+
+ __extension__ static __inline void __attribute__ ((__always_inline__))
+@@ -8373,7 +8377,7 @@
+ __extension__ static __inline void __attribute__ ((__always_inline__))
+ vst1_lane_f32 (float32_t * __a, float32x2_t __b, const int __c)
+ {
+- __builtin_neon_vst1_lanev2sf (__a, __b, __c);
++ __builtin_neon_vst1_lanev2sf ((__builtin_neon_sf *) __a, __b, __c);
+ }
+
+ __extension__ static __inline void __attribute__ ((__always_inline__))
+@@ -8439,7 +8443,7 @@
+ __extension__ static __inline void __attribute__ ((__always_inline__))
+ vst1q_lane_f32 (float32_t * __a, float32x4_t __b, const int __c)
+ {
+- __builtin_neon_vst1_lanev4sf (__a, __b, __c);
++ __builtin_neon_vst1_lanev4sf ((__builtin_neon_sf *) __a, __b, __c);
+ }
+
+ __extension__ static __inline void __attribute__ ((__always_inline__))
+@@ -8512,7 +8516,7 @@
+ vld2_f32 (const float32_t * __a)
+ {
+ union { float32x2x2_t __i; __builtin_neon_ti __o; } __rv;
+- __rv.__o = __builtin_neon_vld2v2sf (__a);
++ __rv.__o = __builtin_neon_vld2v2sf ((const __builtin_neon_sf *) __a);
+ return __rv.__i;
+ }
+
+@@ -8600,7 +8604,7 @@
+ vld2q_f32 (const float32_t * __a)
+ {
+ union { float32x4x2_t __i; __builtin_neon_oi __o; } __rv;
+- __rv.__o = __builtin_neon_vld2v4sf (__a);
++ __rv.__o = __builtin_neon_vld2v4sf ((const __builtin_neon_sf *) __a);
+ return __rv.__i;
+ }
+
+@@ -8676,7 +8680,7 @@
+ {
+ union { float32x2x2_t __i; __builtin_neon_ti __o; } __bu = { __b };
+ union { float32x2x2_t __i; __builtin_neon_ti __o; } __rv;
+- __rv.__o = __builtin_neon_vld2_lanev2sf (__a, __bu.__o, __c);
++ __rv.__o = __builtin_neon_vld2_lanev2sf ((const __builtin_neon_sf *) __a, __bu.__o, __c);
+ return __rv.__i;
+ }
+
+@@ -8748,7 +8752,7 @@
+ {
+ union { float32x4x2_t __i; __builtin_neon_oi __o; } __bu = { __b };
+ union { float32x4x2_t __i; __builtin_neon_oi __o; } __rv;
+- __rv.__o = __builtin_neon_vld2_lanev4sf (__a, __bu.__o, __c);
++ __rv.__o = __builtin_neon_vld2_lanev4sf ((const __builtin_neon_sf *) __a, __bu.__o, __c);
+ return __rv.__i;
+ }
+
+@@ -8807,7 +8811,7 @@
+ vld2_dup_f32 (const float32_t * __a)
+ {
+ union { float32x2x2_t __i; __builtin_neon_ti __o; } __rv;
+- __rv.__o = __builtin_neon_vld2_dupv2sf (__a);
++ __rv.__o = __builtin_neon_vld2_dupv2sf ((const __builtin_neon_sf *) __a);
+ return __rv.__i;
+ }
+
+@@ -8892,7 +8896,7 @@
+ vst2_f32 (float32_t * __a, float32x2x2_t __b)
+ {
+ union { float32x2x2_t __i; __builtin_neon_ti __o; } __bu = { __b };
+- __builtin_neon_vst2v2sf (__a, __bu.__o);
++ __builtin_neon_vst2v2sf ((__builtin_neon_sf *) __a, __bu.__o);
+ }
+
+ __extension__ static __inline void __attribute__ ((__always_inline__))
+@@ -8969,7 +8973,7 @@
+ vst2q_f32 (float32_t * __a, float32x4x2_t __b)
+ {
+ union { float32x4x2_t __i; __builtin_neon_oi __o; } __bu = { __b };
+- __builtin_neon_vst2v4sf (__a, __bu.__o);
++ __builtin_neon_vst2v4sf ((__builtin_neon_sf *) __a, __bu.__o);
+ }
+
+ __extension__ static __inline void __attribute__ ((__always_inline__))
+@@ -9032,7 +9036,7 @@
+ vst2_lane_f32 (float32_t * __a, float32x2x2_t __b, const int __c)
+ {
+ union { float32x2x2_t __i; __builtin_neon_ti __o; } __bu = { __b };
+- __builtin_neon_vst2_lanev2sf (__a, __bu.__o, __c);
++ __builtin_neon_vst2_lanev2sf ((__builtin_neon_sf *) __a, __bu.__o, __c);
+ }
+
+ __extension__ static __inline void __attribute__ ((__always_inline__))
+@@ -9088,7 +9092,7 @@
+ vst2q_lane_f32 (float32_t * __a, float32x4x2_t __b, const int __c)
+ {
+ union { float32x4x2_t __i; __builtin_neon_oi __o; } __bu = { __b };
+- __builtin_neon_vst2_lanev4sf (__a, __bu.__o, __c);
++ __builtin_neon_vst2_lanev4sf ((__builtin_neon_sf *) __a, __bu.__o, __c);
+ }
+
+ __extension__ static __inline void __attribute__ ((__always_inline__))
+@@ -9140,7 +9144,7 @@
+ vld3_f32 (const float32_t * __a)
+ {
+ union { float32x2x3_t __i; __builtin_neon_ei __o; } __rv;
+- __rv.__o = __builtin_neon_vld3v2sf (__a);
++ __rv.__o = __builtin_neon_vld3v2sf ((const __builtin_neon_sf *) __a);
+ return __rv.__i;
+ }
+
+@@ -9228,7 +9232,7 @@
+ vld3q_f32 (const float32_t * __a)
+ {
+ union { float32x4x3_t __i; __builtin_neon_ci __o; } __rv;
+- __rv.__o = __builtin_neon_vld3v4sf (__a);
++ __rv.__o = __builtin_neon_vld3v4sf ((const __builtin_neon_sf *) __a);
+ return __rv.__i;
+ }
+
+@@ -9304,7 +9308,7 @@
+ {
+ union { float32x2x3_t __i; __builtin_neon_ei __o; } __bu = { __b };
+ union { float32x2x3_t __i; __builtin_neon_ei __o; } __rv;
+- __rv.__o = __builtin_neon_vld3_lanev2sf (__a, __bu.__o, __c);
++ __rv.__o = __builtin_neon_vld3_lanev2sf ((const __builtin_neon_sf *) __a, __bu.__o, __c);
+ return __rv.__i;
+ }
+
+@@ -9376,7 +9380,7 @@
+ {
+ union { float32x4x3_t __i; __builtin_neon_ci __o; } __bu = { __b };
+ union { float32x4x3_t __i; __builtin_neon_ci __o; } __rv;
+- __rv.__o = __builtin_neon_vld3_lanev4sf (__a, __bu.__o, __c);
++ __rv.__o = __builtin_neon_vld3_lanev4sf ((const __builtin_neon_sf *) __a, __bu.__o, __c);
+ return __rv.__i;
+ }
+
+@@ -9435,7 +9439,7 @@
+ vld3_dup_f32 (const float32_t * __a)
+ {
+ union { float32x2x3_t __i; __builtin_neon_ei __o; } __rv;
+- __rv.__o = __builtin_neon_vld3_dupv2sf (__a);
++ __rv.__o = __builtin_neon_vld3_dupv2sf ((const __builtin_neon_sf *) __a);
+ return __rv.__i;
+ }
+
+@@ -9520,7 +9524,7 @@
+ vst3_f32 (float32_t * __a, float32x2x3_t __b)
+ {
+ union { float32x2x3_t __i; __builtin_neon_ei __o; } __bu = { __b };
+- __builtin_neon_vst3v2sf (__a, __bu.__o);
++ __builtin_neon_vst3v2sf ((__builtin_neon_sf *) __a, __bu.__o);
+ }
+
+ __extension__ static __inline void __attribute__ ((__always_inline__))
+@@ -9597,7 +9601,7 @@
+ vst3q_f32 (float32_t * __a, float32x4x3_t __b)
+ {
+ union { float32x4x3_t __i; __builtin_neon_ci __o; } __bu = { __b };
+- __builtin_neon_vst3v4sf (__a, __bu.__o);
++ __builtin_neon_vst3v4sf ((__builtin_neon_sf *) __a, __bu.__o);
+ }
+
+ __extension__ static __inline void __attribute__ ((__always_inline__))
+@@ -9660,7 +9664,7 @@
+ vst3_lane_f32 (float32_t * __a, float32x2x3_t __b, const int __c)
+ {
+ union { float32x2x3_t __i; __builtin_neon_ei __o; } __bu = { __b };
+- __builtin_neon_vst3_lanev2sf (__a, __bu.__o, __c);
++ __builtin_neon_vst3_lanev2sf ((__builtin_neon_sf *) __a, __bu.__o, __c);
+ }
+
+ __extension__ static __inline void __attribute__ ((__always_inline__))
+@@ -9716,7 +9720,7 @@
+ vst3q_lane_f32 (float32_t * __a, float32x4x3_t __b, const int __c)
+ {
+ union { float32x4x3_t __i; __builtin_neon_ci __o; } __bu = { __b };
+- __builtin_neon_vst3_lanev4sf (__a, __bu.__o, __c);
++ __builtin_neon_vst3_lanev4sf ((__builtin_neon_sf *) __a, __bu.__o, __c);
+ }
+
+ __extension__ static __inline void __attribute__ ((__always_inline__))
+@@ -9768,7 +9772,7 @@
+ vld4_f32 (const float32_t * __a)
+ {
+ union { float32x2x4_t __i; __builtin_neon_oi __o; } __rv;
+- __rv.__o = __builtin_neon_vld4v2sf (__a);
++ __rv.__o = __builtin_neon_vld4v2sf ((const __builtin_neon_sf *) __a);
+ return __rv.__i;
+ }
+
+@@ -9856,7 +9860,7 @@
+ vld4q_f32 (const float32_t * __a)
+ {
+ union { float32x4x4_t __i; __builtin_neon_xi __o; } __rv;
+- __rv.__o = __builtin_neon_vld4v4sf (__a);
++ __rv.__o = __builtin_neon_vld4v4sf ((const __builtin_neon_sf *) __a);
+ return __rv.__i;
+ }
+
+@@ -9932,7 +9936,7 @@
+ {
+ union { float32x2x4_t __i; __builtin_neon_oi __o; } __bu = { __b };
+ union { float32x2x4_t __i; __builtin_neon_oi __o; } __rv;
+- __rv.__o = __builtin_neon_vld4_lanev2sf (__a, __bu.__o, __c);
++ __rv.__o = __builtin_neon_vld4_lanev2sf ((const __builtin_neon_sf *) __a, __bu.__o, __c);
+ return __rv.__i;
+ }
+
+@@ -10004,7 +10008,7 @@
+ {
+ union { float32x4x4_t __i; __builtin_neon_xi __o; } __bu = { __b };
+ union { float32x4x4_t __i; __builtin_neon_xi __o; } __rv;
+- __rv.__o = __builtin_neon_vld4_lanev4sf (__a, __bu.__o, __c);
++ __rv.__o = __builtin_neon_vld4_lanev4sf ((const __builtin_neon_sf *) __a, __bu.__o, __c);
+ return __rv.__i;
+ }
+
+@@ -10063,7 +10067,7 @@
+ vld4_dup_f32 (const float32_t * __a)
+ {
+ union { float32x2x4_t __i; __builtin_neon_oi __o; } __rv;
+- __rv.__o = __builtin_neon_vld4_dupv2sf (__a);
++ __rv.__o = __builtin_neon_vld4_dupv2sf ((const __builtin_neon_sf *) __a);
+ return __rv.__i;
+ }
+
+@@ -10148,7 +10152,7 @@
+ vst4_f32 (float32_t * __a, float32x2x4_t __b)
+ {
+ union { float32x2x4_t __i; __builtin_neon_oi __o; } __bu = { __b };
+- __builtin_neon_vst4v2sf (__a, __bu.__o);
++ __builtin_neon_vst4v2sf ((__builtin_neon_sf *) __a, __bu.__o);
+ }
+
+ __extension__ static __inline void __attribute__ ((__always_inline__))
+@@ -10225,7 +10229,7 @@
+ vst4q_f32 (float32_t * __a, float32x4x4_t __b)
+ {
+ union { float32x4x4_t __i; __builtin_neon_xi __o; } __bu = { __b };
+- __builtin_neon_vst4v4sf (__a, __bu.__o);
++ __builtin_neon_vst4v4sf ((__builtin_neon_sf *) __a, __bu.__o);
+ }
+
+ __extension__ static __inline void __attribute__ ((__always_inline__))
+@@ -10288,7 +10292,7 @@
+ vst4_lane_f32 (float32_t * __a, float32x2x4_t __b, const int __c)
+ {
+ union { float32x2x4_t __i; __builtin_neon_oi __o; } __bu = { __b };
+- __builtin_neon_vst4_lanev2sf (__a, __bu.__o, __c);
++ __builtin_neon_vst4_lanev2sf ((__builtin_neon_sf *) __a, __bu.__o, __c);
+ }
+
+ __extension__ static __inline void __attribute__ ((__always_inline__))
+@@ -10344,7 +10348,7 @@
+ vst4q_lane_f32 (float32_t * __a, float32x4x4_t __b, const int __c)
+ {
+ union { float32x4x4_t __i; __builtin_neon_xi __o; } __bu = { __b };
+- __builtin_neon_vst4_lanev4sf (__a, __bu.__o, __c);
++ __builtin_neon_vst4_lanev4sf ((__builtin_neon_sf *) __a, __bu.__o, __c);
+ }
+
+ __extension__ static __inline void __attribute__ ((__always_inline__))
+diff -Nur a/gcc/config/arm/arm.opt b/gcc/config/arm/arm.opt
+--- a/gcc/config/arm/arm.opt 2009-02-20 16:20:38.000000000 +0100
++++ b/gcc/config/arm/arm.opt 2010-01-25 09:50:28.985687200 +0100
+@@ -78,6 +78,10 @@
+ mfp=
+ Target RejectNegative Joined Undocumented Var(target_fpe_name)
+
++mfp16-format=
++Target RejectNegative Joined Var(target_fp16_format_name)
++Specify the __fp16 floating-point format
++
+ ;; Now ignored.
+ mfpe
+ Target RejectNegative Mask(FPE) Undocumented
+@@ -93,6 +97,10 @@
+ Target RejectNegative
+ Alias for -mfloat-abi=hard
+
++mfix-janus-2cc
++Target Report Mask(FIX_JANUS)
++Work around hardware errata for Avalent Janus 2CC cores.
++
+ mlittle-endian
+ Target Report RejectNegative InverseMask(BIG_END)
+ Assume target CPU is configured as little endian
+@@ -101,6 +109,10 @@
+ Target Report Mask(LONG_CALLS)
+ Generate call insns as indirect calls, if necessary
+
++mmarvell-div
++Target Report Mask(MARVELL_DIV)
++Generate hardware integer division instructions supported by some Marvell cores.
++
+ mpic-register=
+ Target RejectNegative Joined Var(arm_pic_register_string)
+ Specify the register to be used for PIC addressing
+@@ -157,6 +169,10 @@
+ Target Report Mask(NEON_VECTORIZE_QUAD)
+ Use Neon quad-word (rather than double-word) registers for vectorization
+
++mlow-irq-latency
++Target Report Var(low_irq_latency)
++Try to reduce interrupt latency of the generated code
++
+ mword-relocations
+ Target Report Var(target_word_relocations) Init(TARGET_DEFAULT_WORD_RELOCATIONS)
+ Only generate absolute relocations on word sized values.
+diff -Nur a/gcc/config/arm/arm-protos.h b/gcc/config/arm/arm-protos.h
+--- a/gcc/config/arm/arm-protos.h 2009-02-20 16:20:38.000000000 +0100
++++ b/gcc/config/arm/arm-protos.h 2010-01-25 09:50:28.985687200 +0100
+@@ -88,7 +88,7 @@
+
+ extern int cirrus_memory_offset (rtx);
+ extern int arm_coproc_mem_operand (rtx, bool);
+-extern int neon_vector_mem_operand (rtx, bool);
++extern int neon_vector_mem_operand (rtx, int);
+ extern int neon_struct_mem_operand (rtx);
+ extern int arm_no_early_store_addr_dep (rtx, rtx);
+ extern int arm_no_early_alu_shift_dep (rtx, rtx);
+@@ -144,6 +144,7 @@
+ extern int arm_debugger_arg_offset (int, rtx);
+ extern bool arm_is_long_call_p (tree);
+ extern int arm_emit_vector_const (FILE *, rtx);
++extern void arm_emit_fp16_const (rtx c);
+ extern const char * arm_output_load_gr (rtx *);
+ extern const char *vfp_output_fstmd (rtx *);
+ extern void arm_set_return_address (rtx, rtx);
+@@ -154,13 +155,15 @@
+
+ #if defined TREE_CODE
+ extern rtx arm_function_arg (CUMULATIVE_ARGS *, enum machine_mode, tree, int);
++extern void arm_function_arg_advance (CUMULATIVE_ARGS *, enum machine_mode,
++ tree, bool);
+ extern void arm_init_cumulative_args (CUMULATIVE_ARGS *, tree, rtx, tree);
+ extern bool arm_pad_arg_upward (enum machine_mode, const_tree);
+ extern bool arm_pad_reg_upward (enum machine_mode, tree, int);
+ extern bool arm_needs_doubleword_align (enum machine_mode, tree);
+-extern rtx arm_function_value(const_tree, const_tree);
+ #endif
+ extern int arm_apply_result_size (void);
++extern rtx aapcs_libcall_value (enum machine_mode);
+
+ #endif /* RTX_CODE */
+
+diff -Nur a/gcc/config/arm/arm-tune.md b/gcc/config/arm/arm-tune.md
+--- a/gcc/config/arm/arm-tune.md 2009-07-22 09:43:59.000000000 +0200
++++ b/gcc/config/arm/arm-tune.md 2010-01-25 09:50:28.985687200 +0100
+@@ -1,5 +1,5 @@
+ ;; -*- buffer-read-only: t -*-
+ ;; Generated automatically by gentune.sh from arm-cores.def
+ (define_attr "tune"
+- "arm2,arm250,arm3,arm6,arm60,arm600,arm610,arm620,arm7,arm7d,arm7di,arm70,arm700,arm700i,arm710,arm720,arm710c,arm7100,arm7500,arm7500fe,arm7m,arm7dm,arm7dmi,arm8,arm810,strongarm,strongarm110,strongarm1100,strongarm1110,arm7tdmi,arm7tdmis,arm710t,arm720t,arm740t,arm9,arm9tdmi,arm920,arm920t,arm922t,arm940t,ep9312,arm10tdmi,arm1020t,arm9e,arm946es,arm966es,arm968es,arm10e,arm1020e,arm1022e,xscale,iwmmxt,iwmmxt2,arm926ejs,arm1026ejs,arm1136js,arm1136jfs,arm1176jzs,arm1176jzfs,mpcorenovfp,mpcore,arm1156t2s,cortexa8,cortexa9,cortexr4,cortexr4f,cortexm3,cortexm1"
++ "arm2,arm250,arm3,arm6,arm60,arm600,arm610,arm620,arm7,arm7d,arm7di,arm70,arm700,arm700i,arm710,arm720,arm710c,arm7100,arm7500,arm7500fe,arm7m,arm7dm,arm7dmi,arm8,arm810,strongarm,strongarm110,strongarm1100,strongarm1110,arm7tdmi,arm7tdmis,arm710t,arm720t,arm740t,arm9,arm9tdmi,arm920,arm920t,arm922t,arm940t,ep9312,arm10tdmi,arm1020t,arm9e,arm946es,arm966es,arm968es,arm10e,arm1020e,arm1022e,xscale,iwmmxt,iwmmxt2,marvell_f,arm926ejs,arm1026ejs,arm1136js,arm1136jfs,arm1176jzs,arm1176jzfs,mpcorenovfp,mpcore,arm1156t2s,cortexa5,cortexa8,cortexa9,cortexr4,cortexr4f,cortexm3,cortexm1,cortexm0"
+ (const (symbol_ref "arm_tune")))
+diff -Nur a/gcc/config/arm/bpabi.h b/gcc/config/arm/bpabi.h
+--- a/gcc/config/arm/bpabi.h 2009-02-20 16:20:38.000000000 +0100
++++ b/gcc/config/arm/bpabi.h 2010-01-25 09:50:28.985687200 +0100
+@@ -30,7 +30,7 @@
+
+ /* Section 4.1 of the AAPCS requires the use of VFP format. */
+ #undef FPUTYPE_DEFAULT
+-#define FPUTYPE_DEFAULT FPUTYPE_VFP
++#define FPUTYPE_DEFAULT "vfp"
+
+ /* TARGET_BIG_ENDIAN_DEFAULT is set in
+ config.gcc for big endian configurations. */
+@@ -53,6 +53,8 @@
+
+ #define TARGET_FIX_V4BX_SPEC " %{mcpu=arm8|mcpu=arm810|mcpu=strongarm*|march=armv4:--fix-v4bx}"
+
++#define BE8_LINK_SPEC " %{mbig-endian:%{march=armv7-a|mcpu=cortex-a5|mcpu=cortex-a8|mcpu=cortex-a9:%{!r:--be8}}}"
++
+ /* Tell the assembler to build BPABI binaries. */
+ #undef SUBTARGET_EXTRA_ASM_SPEC
+ #define SUBTARGET_EXTRA_ASM_SPEC "%{mabi=apcs-gnu|mabi=atpcs:-meabi=gnu;:-meabi=5}" TARGET_FIX_V4BX_SPEC
+@@ -65,7 +67,7 @@
+ #define BPABI_LINK_SPEC \
+ "%{mbig-endian:-EB} %{mlittle-endian:-EL} " \
+ "%{static:-Bstatic} %{shared:-shared} %{symbolic:-Bsymbolic} " \
+- "-X" SUBTARGET_EXTRA_LINK_SPEC TARGET_FIX_V4BX_SPEC
++ "-X" SUBTARGET_EXTRA_LINK_SPEC TARGET_FIX_V4BX_SPEC BE8_LINK_SPEC
+
+ #undef LINK_SPEC
+ #define LINK_SPEC BPABI_LINK_SPEC
+@@ -90,16 +92,22 @@
+ #define DECLARE_LIBRARY_RENAMES RENAME_LIBRARY (muldi3, lmul)
+ #endif
+ #ifdef L_fixdfdi
+-#define DECLARE_LIBRARY_RENAMES RENAME_LIBRARY (fixdfdi, d2lz)
++#define DECLARE_LIBRARY_RENAMES RENAME_LIBRARY (fixdfdi, d2lz) \
++ extern DWtype __fixdfdi (DFtype) __attribute__((pcs("aapcs"))); \
++ extern UDWtype __fixunsdfdi (DFtype) __asm__("__aeabi_d2ulz") __attribute__((pcs("aapcs")));
+ #endif
+ #ifdef L_fixunsdfdi
+-#define DECLARE_LIBRARY_RENAMES RENAME_LIBRARY (fixunsdfdi, d2ulz)
++#define DECLARE_LIBRARY_RENAMES RENAME_LIBRARY (fixunsdfdi, d2ulz) \
++ extern UDWtype __fixunsdfdi (DFtype) __attribute__((pcs("aapcs")));
+ #endif
+ #ifdef L_fixsfdi
+-#define DECLARE_LIBRARY_RENAMES RENAME_LIBRARY (fixsfdi, f2lz)
++#define DECLARE_LIBRARY_RENAMES RENAME_LIBRARY (fixsfdi, f2lz) \
++ extern DWtype __fixsfdi (SFtype) __attribute__((pcs("aapcs"))); \
++ extern UDWtype __fixunssfdi (SFtype) __asm__("__aeabi_f2ulz") __attribute__((pcs("aapcs")));
+ #endif
+ #ifdef L_fixunssfdi
+-#define DECLARE_LIBRARY_RENAMES RENAME_LIBRARY (fixunssfdi, f2ulz)
++#define DECLARE_LIBRARY_RENAMES RENAME_LIBRARY (fixunssfdi, f2ulz) \
++ extern UDWtype __fixunssfdi (SFtype) __attribute__((pcs("aapcs")));
+ #endif
+ #ifdef L_floatdidf
+ #define DECLARE_LIBRARY_RENAMES RENAME_LIBRARY (floatdidf, l2d)
+diff -Nur a/gcc/config/arm/bpabi.S b/gcc/config/arm/bpabi.S
+--- a/gcc/config/arm/bpabi.S 2009-04-10 01:23:07.000000000 +0200
++++ b/gcc/config/arm/bpabi.S 2010-01-25 09:50:28.985687200 +0100
+@@ -64,20 +64,69 @@
+
+ #endif /* L_aeabi_ulcmp */
+
++.macro test_div_by_zero signed
++/* Tail-call to divide-by-zero handlers which may be overridden by the user,
++ so unwinding works properly. */
++#if defined(__thumb2__)
++ cbnz yyh, 1f
++ cbnz yyl, 1f
++ cmp xxh, #0
++ do_it eq
++ cmpeq xxl, #0
++ .ifc \signed, unsigned
++ beq 2f
++ mov xxh, #0xffffffff
++ mov xxl, xxh
++2:
++ .else
++ do_it lt, t
++ movlt xxl, #0
++ movlt xxh, #0x80000000
++ do_it gt, t
++ movgt xxh, #0x7fffffff
++ movgt xxl, #0xffffffff
++ .endif
++ b SYM (__aeabi_ldiv0) __PLT__
++1:
++#else
++ /* Note: Thumb-1 code calls via an ARM shim on processors which
++ support ARM mode. */
++ cmp yyh, #0
++ cmpeq yyl, #0
++ bne 2f
++ cmp xxh, #0
++ cmpeq xxl, #0
++ .ifc \signed, unsigned
++ movne xxh, #0xffffffff
++ movne xxl, #0xffffffff
++ .else
++ movlt xxh, #0x80000000
++ movlt xxl, #0
++ movgt xxh, #0x7fffffff
++ movgt xxl, #0xffffffff
++ .endif
++ b SYM (__aeabi_ldiv0) __PLT__
++2:
++#endif
++.endm
++
+ #ifdef L_aeabi_ldivmod
+
+ ARM_FUNC_START aeabi_ldivmod
++ test_div_by_zero signed
++
+ sub sp, sp, #8
+-#if defined(__thumb2__)
++/* Low latency and Thumb-2 do_push implementations can't push sp directly. */
++#if defined(__thumb2__) || defined(__irq_low_latency__)
+ mov ip, sp
+- push {ip, lr}
++ do_push (ip, lr)
+ #else
+- do_push {sp, lr}
++ stmfd sp!, {sp, lr}
+ #endif
+ bl SYM(__gnu_ldivmod_helper) __PLT__
+ ldr lr, [sp, #4]
+ add sp, sp, #8
+- do_pop {r2, r3}
++ do_pop (r2, r3)
+ RET
+
+ #endif /* L_aeabi_ldivmod */
+@@ -85,17 +134,20 @@
+ #ifdef L_aeabi_uldivmod
+
+ ARM_FUNC_START aeabi_uldivmod
++ test_div_by_zero unsigned
++
+ sub sp, sp, #8
+-#if defined(__thumb2__)
++/* Low latency and Thumb-2 do_push implementations can't push sp directly. */
++#if defined(__thumb2__) || defined(__irq_low_latency__)
+ mov ip, sp
+- push {ip, lr}
++ do_push (ip, lr)
+ #else
+- do_push {sp, lr}
++ stmfd sp!, {sp, lr}
+ #endif
+ bl SYM(__gnu_uldivmod_helper) __PLT__
+ ldr lr, [sp, #4]
+ add sp, sp, #8
+- do_pop {r2, r3}
++ do_pop (r2, r3)
+ RET
+
+ #endif /* L_aeabi_divmod */
+diff -Nur a/gcc/config/arm/bpabi-v6m.S b/gcc/config/arm/bpabi-v6m.S
+--- a/gcc/config/arm/bpabi-v6m.S 2009-04-10 01:23:07.000000000 +0200
++++ b/gcc/config/arm/bpabi-v6m.S 2010-01-25 09:50:28.985687200 +0100
+@@ -69,9 +69,52 @@
+
+ #endif /* L_aeabi_ulcmp */
+
++.macro test_div_by_zero signed
++ cmp yyh, #0
++ bne 7f
++ cmp yyl, #0
++ bne 7f
++ cmp xxh, #0
++ bne 2f
++ cmp xxl, #0
++2:
++ .ifc \signed, unsigned
++ beq 3f
++ mov xxh, #0
++ mvn xxh, xxh @ 0xffffffff
++ mov xxl, xxh
++3:
++ .else
++ beq 5f
++ blt 6f
++ mov xxl, #0
++ mvn xxl, xxl @ 0xffffffff
++ lsr xxh, xxl, #1 @ 0x7fffffff
++ b 5f
++6: mov xxh, #0x80
++ lsl xxh, xxh, #24 @ 0x80000000
++ mov xxl, #0
++5:
++ .endif
++ @ tailcalls are tricky on v6-m.
++ push {r0, r1, r2}
++ ldr r0, 1f
++ adr r1, 1f
++ add r0, r1
++ str r0, [sp, #8]
++ @ We know we are not on armv4t, so pop pc is safe.
++ pop {r0, r1, pc}
++ .align 2
++1:
++ .word __aeabi_ldiv0 - 1b
++7:
++.endm
++
+ #ifdef L_aeabi_ldivmod
+
+ FUNC_START aeabi_ldivmod
++ test_div_by_zero signed
++
+ push {r0, r1}
+ mov r0, sp
+ push {r0, lr}
+@@ -89,6 +132,8 @@
+ #ifdef L_aeabi_uldivmod
+
+ FUNC_START aeabi_uldivmod
++ test_div_by_zero unsigned
++
+ push {r0, r1}
+ mov r0, sp
+ push {r0, lr}
+diff -Nur a/gcc/config/arm/constraints.md b/gcc/config/arm/constraints.md
+--- a/gcc/config/arm/constraints.md 2009-02-20 16:20:38.000000000 +0100
++++ b/gcc/config/arm/constraints.md 2010-01-25 09:50:28.985687200 +0100
+@@ -25,14 +25,15 @@
+ ;; In ARM state, 'l' is an alias for 'r'
+
+ ;; The following normal constraints have been used:
+-;; in ARM/Thumb-2 state: G, H, I, J, K, L, M
++;; in ARM/Thumb-2 state: G, H, I, j, J, K, L, M
+ ;; in Thumb-1 state: I, J, K, L, M, N, O
+
+ ;; The following multi-letter normal constraints have been used:
+-;; in ARM/Thumb-2 state: Da, Db, Dc, Dn, Dl, DL, Dv
++;; in ARM/Thumb-2 state: Da, Db, Dc, Dn, Dl, DL, Dv, Dy
++;; in Thumb-1 state: Pa, Pb
+
+ ;; The following memory constraints have been used:
+-;; in ARM/Thumb-2 state: Q, Ut, Uv, Uy, Un, Us
++;; in ARM/Thumb-2 state: Q, Ut, Uv, Uy, Un, Um, Us
+ ;; in ARM state: Uq
+
+
+@@ -65,6 +66,13 @@
+ (define_register_constraint "h" "TARGET_THUMB ? HI_REGS : NO_REGS"
+ "In Thumb state the core registers @code{r8}-@code{r15}.")
+
++(define_constraint "j"
++ "A constant suitable for a MOVW instruction. (ARM/Thumb-2)"
++ (and (match_test "TARGET_32BIT && arm_arch_thumb2")
++ (ior (match_code "high")
++ (and (match_code "const_int")
++ (match_test "(ival & 0xffff0000) == 0")))))
++
+ (define_register_constraint "k" "STACK_REG"
+ "@internal The stack register.")
+
+@@ -116,11 +124,9 @@
+ : ((ival >= 0 && ival <= 1020) && ((ival & 3) == 0))")))
+
+ (define_constraint "N"
+- "In ARM/Thumb-2 state a constant suitable for a MOVW instruction.
+- In Thumb-1 state a constant in the range 0-31."
++ "Thumb-1 state a constant in the range 0-31."
+ (and (match_code "const_int")
+- (match_test "TARGET_32BIT ? arm_arch_thumb2 && ((ival & 0xffff0000) == 0)
+- : (ival >= 0 && ival <= 31)")))
++ (match_test "!TARGET_32BIT && (ival >= 0 && ival <= 31)")))
+
+ (define_constraint "O"
+ "In Thumb-1 state a constant that is a multiple of 4 in the range
+@@ -129,6 +135,18 @@
+ (match_test "TARGET_THUMB1 && ival >= -508 && ival <= 508
+ && ((ival & 3) == 0)")))
+
++(define_constraint "Pa"
++ "@internal In Thumb-1 state a constant in the range -510 to +510"
++ (and (match_code "const_int")
++ (match_test "TARGET_THUMB1 && ival >= -510 && ival <= 510
++ && (ival > 255 || ival < -255)")))
++
++(define_constraint "Pb"
++ "@internal In Thumb-1 state a constant in the range -262 to +262"
++ (and (match_code "const_int")
++ (match_test "TARGET_THUMB1 && ival >= -262 && ival <= 262
++ && (ival > 255 || ival < -255)")))
++
+ (define_constraint "G"
+ "In ARM/Thumb-2 state a valid FPA immediate constant."
+ (and (match_code "const_double")
+@@ -189,10 +207,17 @@
+ (define_constraint "Dv"
+ "@internal
+ In ARM/Thumb-2 state a const_double which can be used with a VFP fconsts
+- or fconstd instruction."
++ instruction."
+ (and (match_code "const_double")
+ (match_test "TARGET_32BIT && vfp3_const_double_rtx (op)")))
+
++(define_constraint "Dy"
++ "@internal
++ In ARM/Thumb-2 state a const_double which can be used with a VFP fconstd
++ instruction."
++ (and (match_code "const_double")
++ (match_test "TARGET_32BIT && TARGET_VFP_DOUBLE && vfp3_const_double_rtx (op)")))
++
+ (define_memory_constraint "Ut"
+ "@internal
+ In ARM/Thumb-2 state an address valid for loading/storing opaque structure
+@@ -214,17 +239,24 @@
+
+ (define_memory_constraint "Un"
+ "@internal
++ In ARM/Thumb-2 state a valid address for Neon doubleword vector
++ load/store instructions."
++ (and (match_code "mem")
++ (match_test "TARGET_32BIT && neon_vector_mem_operand (op, 0)")))
++
++(define_memory_constraint "Um"
++ "@internal
+ In ARM/Thumb-2 state a valid address for Neon element and structure
+ load/store instructions."
+ (and (match_code "mem")
+- (match_test "TARGET_32BIT && neon_vector_mem_operand (op, FALSE)")))
++ (match_test "TARGET_32BIT && neon_vector_mem_operand (op, 2)")))
+
+ (define_memory_constraint "Us"
+ "@internal
+ In ARM/Thumb-2 state a valid address for non-offset loads/stores of
+ quad-word values in four ARM registers."
+ (and (match_code "mem")
+- (match_test "TARGET_32BIT && neon_vector_mem_operand (op, TRUE)")))
++ (match_test "TARGET_32BIT && neon_vector_mem_operand (op, 1)")))
+
+ (define_memory_constraint "Uq"
+ "@internal
+diff -Nur a/gcc/config/arm/fp16.c b/gcc/config/arm/fp16.c
+--- a/gcc/config/arm/fp16.c 1970-01-01 01:00:00.000000000 +0100
++++ b/gcc/config/arm/fp16.c 2010-01-25 09:50:28.985687200 +0100
+@@ -0,0 +1,145 @@
++/* Half-float conversion routines.
++
++ Copyright (C) 2008, 2009 Free Software Foundation, Inc.
++ Contributed by CodeSourcery.
++
++ This file 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.
++
++ This file 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/>. */
++
++static inline unsigned short
++__gnu_f2h_internal(unsigned int a, int ieee)
++{
++ unsigned short sign = (a >> 16) & 0x8000;
++ int aexp = (a >> 23) & 0xff;
++ unsigned int mantissa = a & 0x007fffff;
++ unsigned int mask;
++ unsigned int increment;
++
++ if (aexp == 0xff)
++ {
++ if (!ieee)
++ return sign;
++ return sign | 0x7e00 | (mantissa >> 13);
++ }
++
++ if (aexp == 0 && mantissa == 0)
++ return sign;
++
++ aexp -= 127;
++
++ /* Decimal point between bits 22 and 23. */
++ mantissa |= 0x00800000;
++ if (aexp < -14)
++ {
++ mask = 0x007fffff;
++ if (aexp < -25)
++ aexp = -26;
++ else if (aexp != -25)
++ mask >>= 24 + aexp;
++ }
++ else
++ mask = 0x00001fff;
++
++ /* Round. */
++ if (mantissa & mask)
++ {
++ increment = (mask + 1) >> 1;
++ if ((mantissa & mask) == increment)
++ increment = mantissa & (increment << 1);
++ mantissa += increment;
++ if (mantissa >= 0x01000000)
++ {
++ mantissa >>= 1;
++ aexp++;
++ }
++ }
++
++ if (ieee)
++ {
++ if (aexp > 15)
++ return sign | 0x7c00;
++ }
++ else
++ {
++ if (aexp > 16)
++ return sign | 0x7fff;
++ }
++
++ if (aexp < -24)
++ return sign;
++
++ if (aexp < -14)
++ {
++ mantissa >>= -14 - aexp;
++ aexp = -14;
++ }
++
++ /* We leave the leading 1 in the mantissa, and subtract one
++ from the exponent bias to compensate. */
++ return sign | (((aexp + 14) << 10) + (mantissa >> 13));
++}
++
++unsigned int
++__gnu_h2f_internal(unsigned short a, int ieee)
++{
++ unsigned int sign = (unsigned int)(a & 0x8000) << 16;
++ int aexp = (a >> 10) & 0x1f;
++ unsigned int mantissa = a & 0x3ff;
++
++ if (aexp == 0x1f && ieee)
++ return sign | 0x7f800000 | (mantissa << 13);
++
++ if (aexp == 0)
++ {
++ int shift;
++
++ if (mantissa == 0)
++ return sign;
++
++ shift = __builtin_clz(mantissa) - 21;
++ mantissa <<= shift;
++ aexp = -shift;
++ }
++
++ return sign | (((aexp + 0x70) << 23) + (mantissa << 13));
++}
++
++unsigned short
++__gnu_f2h_ieee(unsigned int a)
++{
++ return __gnu_f2h_internal(a, 1);
++}
++
++unsigned int
++__gnu_h2f_ieee(unsigned short a)
++{
++ return __gnu_h2f_internal(a, 1);
++}
++
++unsigned short
++__gnu_f2h_alternative(unsigned int x)
++{
++ return __gnu_f2h_internal(x, 0);
++}
++
++unsigned int
++__gnu_h2f_alternative(unsigned short a)
++{
++ return __gnu_h2f_internal(a, 0);
++}
+diff -Nur a/gcc/config/arm/fpa.md b/gcc/config/arm/fpa.md
+--- a/gcc/config/arm/fpa.md 2007-08-02 12:49:31.000000000 +0200
++++ b/gcc/config/arm/fpa.md 2010-01-25 09:50:28.985687200 +0100
+@@ -599,10 +599,10 @@
+ {
+ default:
+ case 0: return \"mvf%?e\\t%0, %1\";
+- case 1: if (arm_fpu_arch == FPUTYPE_FPA_EMU2)
++ case 1: if (TARGET_FPA_EMU2)
+ return \"ldf%?e\\t%0, %1\";
+ return \"lfm%?\\t%0, 1, %1\";
+- case 2: if (arm_fpu_arch == FPUTYPE_FPA_EMU2)
++ case 2: if (TARGET_FPA_EMU2)
+ return \"stf%?e\\t%1, %0\";
+ return \"sfm%?\\t%1, 1, %0\";
+ }
+diff -Nur a/gcc/config/arm/hwdiv.md b/gcc/config/arm/hwdiv.md
+--- a/gcc/config/arm/hwdiv.md 1970-01-01 01:00:00.000000000 +0100
++++ b/gcc/config/arm/hwdiv.md 2010-01-25 09:50:28.985687200 +0100
+@@ -0,0 +1,41 @@
++;; ARM instruction patterns for hardware division
++;; Copyright (C) 2005, 2006, 2007 Free Software Foundation, Inc.
++;; Written by CodeSourcery, LLC.
++;;
++;; 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 2, 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 COPYING. If not, write to
++;; the Free Software Foundation, 51 Franklin Street, Fifth Floor,
++;; Boston, MA 02110-1301, USA.
++
++(define_insn "divsi3"
++ [(set (match_operand:SI 0 "s_register_operand" "=r")
++ (div:SI (match_operand:SI 1 "s_register_operand" "r")
++ (match_operand:SI 2 "s_register_operand" "r")))]
++ "arm_arch_hwdiv"
++ "sdiv%?\t%0, %1, %2"
++ [(set_attr "predicable" "yes")
++ (set_attr "insn" "sdiv")]
++)
++
++(define_insn "udivsi3"
++ [(set (match_operand:SI 0 "s_register_operand" "=r")
++ (udiv:SI (match_operand:SI 1 "s_register_operand" "r")
++ (match_operand:SI 2 "s_register_operand" "r")))]
++ "arm_arch_hwdiv"
++ "udiv%?\t%0, %1, %2"
++ [(set_attr "predicable" "yes")
++ (set_attr "insn" "udiv")]
++)
++
+diff -Nur a/gcc/config/arm/ieee754-df.S b/gcc/config/arm/ieee754-df.S
+--- a/gcc/config/arm/ieee754-df.S 2009-04-10 01:23:07.000000000 +0200
++++ b/gcc/config/arm/ieee754-df.S 2010-01-25 09:50:28.985687200 +0100
+@@ -83,7 +83,7 @@
+ ARM_FUNC_START adddf3
+ ARM_FUNC_ALIAS aeabi_dadd adddf3
+
+-1: do_push {r4, r5, lr}
++1: do_push (r4, r5, lr)
+
+ @ Look for zeroes, equal values, INF, or NAN.
+ shift1 lsl, r4, xh, #1
+@@ -427,7 +427,7 @@
+ do_it eq, t
+ moveq r1, #0
+ RETc(eq)
+- do_push {r4, r5, lr}
++ do_push (r4, r5, lr)
+ mov r4, #0x400 @ initial exponent
+ add r4, r4, #(52-1 - 1)
+ mov r5, #0 @ sign bit is 0
+@@ -447,7 +447,7 @@
+ do_it eq, t
+ moveq r1, #0
+ RETc(eq)
+- do_push {r4, r5, lr}
++ do_push (r4, r5, lr)
+ mov r4, #0x400 @ initial exponent
+ add r4, r4, #(52-1 - 1)
+ ands r5, r0, #0x80000000 @ sign bit in r5
+@@ -481,7 +481,7 @@
+ RETc(eq) @ we are done already.
+
+ @ value was denormalized. We can normalize it now.
+- do_push {r4, r5, lr}
++ do_push (r4, r5, lr)
+ mov r4, #0x380 @ setup corresponding exponent
+ and r5, xh, #0x80000000 @ move sign bit in r5
+ bic xh, xh, #0x80000000
+@@ -508,9 +508,9 @@
+ @ compatibility.
+ adr ip, LSYM(f0_ret)
+ @ Push pc as well so that RETLDM works correctly.
+- do_push {r4, r5, ip, lr, pc}
++ do_push (r4, r5, ip, lr, pc)
+ #else
+- do_push {r4, r5, lr}
++ do_push (r4, r5, lr)
+ #endif
+
+ mov r5, #0
+@@ -534,9 +534,9 @@
+ @ compatibility.
+ adr ip, LSYM(f0_ret)
+ @ Push pc as well so that RETLDM works correctly.
+- do_push {r4, r5, ip, lr, pc}
++ do_push (r4, r5, ip, lr, pc)
+ #else
+- do_push {r4, r5, lr}
++ do_push (r4, r5, lr)
+ #endif
+
+ ands r5, ah, #0x80000000 @ sign bit in r5
+@@ -585,7 +585,7 @@
+ @ Legacy code expects the result to be returned in f0. Copy it
+ @ there as well.
+ LSYM(f0_ret):
+- do_push {r0, r1}
++ do_push (r0, r1)
+ ldfd f0, [sp], #8
+ RETLDM
+
+@@ -602,7 +602,7 @@
+
+ ARM_FUNC_START muldf3
+ ARM_FUNC_ALIAS aeabi_dmul muldf3
+- do_push {r4, r5, r6, lr}
++ do_push (r4, r5, r6, lr)
+
+ @ Mask out exponents, trap any zero/denormal/INF/NAN.
+ mov ip, #0xff
+@@ -910,7 +910,7 @@
+ ARM_FUNC_START divdf3
+ ARM_FUNC_ALIAS aeabi_ddiv divdf3
+
+- do_push {r4, r5, r6, lr}
++ do_push (r4, r5, r6, lr)
+
+ @ Mask out exponents, trap any zero/denormal/INF/NAN.
+ mov ip, #0xff
+@@ -1117,7 +1117,7 @@
+ ARM_FUNC_ALIAS eqdf2 cmpdf2
+ mov ip, #1 @ how should we specify unordered here?
+
+-1: str ip, [sp, #-4]
++1: str ip, [sp, #-4]!
+
+ @ Trap any INF/NAN first.
+ mov ip, xh, lsl #1
+@@ -1129,7 +1129,8 @@
+
+ @ Test for equality.
+ @ Note that 0.0 is equal to -0.0.
+-2: orrs ip, xl, xh, lsl #1 @ if x == 0.0 or -0.0
++2: add sp, sp, #4
++ orrs ip, xl, xh, lsl #1 @ if x == 0.0 or -0.0
+ do_it eq, e
+ COND(orr,s,eq) ip, yl, yh, lsl #1 @ and y == 0.0 or -0.0
+ teqne xh, yh @ or xh == yh
+@@ -1168,7 +1169,7 @@
+ bne 2b
+ orrs ip, yl, yh, lsl #12
+ beq 2b @ y is not NAN
+-5: ldr r0, [sp, #-4] @ unordered return code
++5: ldr r0, [sp], #4 @ unordered return code
+ RET
+
+ FUNC_END gedf2
+@@ -1194,7 +1195,7 @@
+
+ @ The status-returning routines are required to preserve all
+ @ registers except ip, lr, and cpsr.
+-6: do_push {r0, lr}
++6: do_push (r0, lr)
+ ARM_CALL cmpdf2
+ @ Set the Z flag correctly, and the C flag unconditionally.
+ cmp r0, #0
+diff -Nur a/gcc/config/arm/ieee754-sf.S b/gcc/config/arm/ieee754-sf.S
+--- a/gcc/config/arm/ieee754-sf.S 2009-04-10 01:23:07.000000000 +0200
++++ b/gcc/config/arm/ieee754-sf.S 2010-01-25 09:50:28.985687200 +0100
+@@ -481,7 +481,7 @@
+ and r3, ip, #0x80000000
+
+ @ Well, no way to make it shorter without the umull instruction.
+- do_push {r3, r4, r5}
++ do_push (r3, r4, r5)
+ mov r4, r0, lsr #16
+ mov r5, r1, lsr #16
+ bic r0, r0, r4, lsl #16
+@@ -492,7 +492,7 @@
+ mla r0, r4, r1, r0
+ adds r3, r3, r0, lsl #16
+ adc r1, ip, r0, lsr #16
+- do_pop {r0, r4, r5}
++ do_pop (r0, r4, r5)
+
+ #else
+
+@@ -822,7 +822,7 @@
+ ARM_FUNC_ALIAS eqsf2 cmpsf2
+ mov ip, #1 @ how should we specify unordered here?
+
+-1: str ip, [sp, #-4]
++1: str ip, [sp, #-4]!
+
+ @ Trap any INF/NAN first.
+ mov r2, r0, lsl #1
+@@ -834,7 +834,8 @@
+
+ @ Compare values.
+ @ Note that 0.0 is equal to -0.0.
+-2: orrs ip, r2, r3, lsr #1 @ test if both are 0, clear C flag
++2: add sp, sp, #4
++ orrs ip, r2, r3, lsr #1 @ test if both are 0, clear C flag
+ do_it ne
+ teqne r0, r1 @ if not 0 compare sign
+ do_it pl
+@@ -858,7 +859,7 @@
+ bne 2b
+ movs ip, r1, lsl #9
+ beq 2b @ r1 is not NAN
+-5: ldr r0, [sp, #-4] @ return unordered code.
++5: ldr r0, [sp], #4 @ return unordered code.
+ RET
+
+ FUNC_END gesf2
+@@ -881,7 +882,7 @@
+
+ @ The status-returning routines are required to preserve all
+ @ registers except ip, lr, and cpsr.
+-6: do_push {r0, r1, r2, r3, lr}
++6: do_push (r0, r1, r2, r3, lr)
+ ARM_CALL cmpsf2
+ @ Set the Z flag correctly, and the C flag unconditionally.
+ cmp r0, #0
+diff -Nur a/gcc/config/arm/lib1funcs.asm b/gcc/config/arm/lib1funcs.asm
+--- a/gcc/config/arm/lib1funcs.asm 2009-04-10 01:23:07.000000000 +0200
++++ b/gcc/config/arm/lib1funcs.asm 2010-01-25 09:50:28.985687200 +0100
+@@ -27,8 +27,17 @@
+ #if defined(__ELF__) && defined(__linux__)
+ .section .note.GNU-stack,"",%progbits
+ .previous
+-#endif
++#endif /* __ELF__ and __linux__ */
+
++#ifdef __ARM_EABI__
++/* Some attributes that are common to all routines in this file. */
++ /* Tag_ABI_align8_needed: This code does not require 8-byte
++ alignment from the caller. */
++ /* .eabi_attribute 24, 0 -- default setting. */
++ /* Tag_ABI_align8_preserved: This code preserves 8-byte
++ alignment in any callee. */
++ .eabi_attribute 25, 1
++#endif /* __ARM_EABI__ */
+ /* ------------------------------------------------------------------------ */
+
+ /* We need to know what prefix to add to function names. */
+@@ -233,8 +242,8 @@
+ .macro shift1 op, arg0, arg1, arg2
+ \op \arg0, \arg1, \arg2
+ .endm
+-#define do_push push
+-#define do_pop pop
++#define do_push(...) push {__VA_ARGS__}
++#define do_pop(...) pop {__VA_ARGS__}
+ #define COND(op1, op2, cond) op1 ## op2 ## cond
+ /* Perform an arithmetic operation with a variable shift operand. This
+ requires two instructions and a scratch register on Thumb-2. */
+@@ -248,24 +257,133 @@
+ .macro shift1 op, arg0, arg1, arg2
+ mov \arg0, \arg1, \op \arg2
+ .endm
+-#define do_push stmfd sp!,
+-#define do_pop ldmfd sp!,
++#if defined(__low_irq_latency__)
++#define do_push(...) \
++ _buildN1(do_push, _buildC1(__VA_ARGS__))( __VA_ARGS__)
++#define _buildN1(BASE, X) _buildN2(BASE, X)
++#define _buildN2(BASE, X) BASE##X
++#define _buildC1(...) _buildC2(__VA_ARGS__,9,8,7,6,5,4,3,2,1)
++#define _buildC2(a1,a2,a3,a4,a5,a6,a7,a8,a9,c,...) c
++
++#define do_push1(r1) str r1, [sp, #-4]!
++#define do_push2(r1, r2) str r2, [sp, #-4]! ; str r1, [sp, #-4]!
++#define do_push3(r1, r2, r3) str r3, [sp, #-4]! ; str r2, [sp, #-4]!; str r1, [sp, #-4]!
++#define do_push4(r1, r2, r3, r4) \
++ do_push3 (r2, r3, r4);\
++ do_push1 (r1)
++#define do_push5(r1, r2, r3, r4, r5) \
++ do_push4 (r2, r3, r4, r5);\
++ do_push1 (r1)
++
++#define do_pop(...) \
++_buildN1(do_pop, _buildC1(__VA_ARGS__))( __VA_ARGS__)
++
++#define do_pop1(r1) ldr r1, [sp], #4
++#define do_pop2(r1, r2) ldr r1, [sp], #4 ; ldr r2, [sp], #4
++#define do_pop3(r1, r2, r3) ldr r1, [sp], #4 ; str r2, [sp], #4; str r3, [sp], #4
++#define do_pop4(r1, r2, r3, r4) \
++ do_pop1 (r1);\
++ do_pup3 (r2, r3, r4)
++#define do_pop5(r1, r2, r3, r4, r5) \
++ do_pop1 (r1);\
++ do_pop4 (r2, r3, r4, r5)
++#else
++#define do_push(...) stmfd sp!, { __VA_ARGS__}
++#define do_pop(...) ldmfd sp!, {__VA_ARGS__}
++#endif
++
++
+ #define COND(op1, op2, cond) op1 ## cond ## op2
+ .macro shiftop name, dest, src1, src2, shiftop, shiftreg, tmp
+ \name \dest, \src1, \src2, \shiftop \shiftreg
+ .endm
+ #endif
+
+-.macro ARM_LDIV0 name
++#ifdef __ARM_EABI__
++.macro ARM_LDIV0 name signed
++ cmp r0, #0
++ .ifc \signed, unsigned
++ movne r0, #0xffffffff
++ .else
++ movgt r0, #0x7fffffff
++ movlt r0, #0x80000000
++ .endif
++ b SYM (__aeabi_idiv0) __PLT__
++.endm
++#else
++.macro ARM_LDIV0 name signed
+ str lr, [sp, #-8]!
+ 98: cfi_push 98b - __\name, 0xe, -0x8, 0x8
+ bl SYM (__div0) __PLT__
+ mov r0, #0 @ About as wrong as it could be.
+ RETLDM unwind=98b
+ .endm
++#endif
+
+
+-.macro THUMB_LDIV0 name
++#ifdef __ARM_EABI__
++.macro THUMB_LDIV0 name signed
++#if defined(__ARM_ARCH_6M__)
++ .ifc \signed, unsigned
++ cmp r0, #0
++ beq 1f
++ mov r0, #0
++ mvn r0, r0 @ 0xffffffff
++1:
++ .else
++ cmp r0, #0
++ beq 2f
++ blt 3f
++ mov r0, #0
++ mvn r0, r0
++ lsr r0, r0, #1 @ 0x7fffffff
++ b 2f
++3: mov r0, #0x80
++ lsl r0, r0, #24 @ 0x80000000
++2:
++ .endif
++ push {r0, r1, r2}
++ ldr r0, 4f
++ adr r1, 4f
++ add r0, r1
++ str r0, [sp, #8]
++ @ We know we are not on armv4t, so pop pc is safe.
++ pop {r0, r1, pc}
++ .align 2
++4:
++ .word __aeabi_idiv0 - 4b
++#elif defined(__thumb2__)
++ .syntax unified
++ .ifc \signed, unsigned
++ cbz r0, 1f
++ mov r0, #0xffffffff
++1:
++ .else
++ cmp r0, #0
++ do_it gt
++ movgt r0, #0x7fffffff
++ do_it lt
++ movlt r0, #0x80000000
++ .endif
++ b.w SYM(__aeabi_idiv0) __PLT__
++#else
++ .align 2
++ bx pc
++ nop
++ .arm
++ cmp r0, #0
++ .ifc \signed, unsigned
++ movne r0, #0xffffffff
++ .else
++ movgt r0, #0x7fffffff
++ movlt r0, #0x80000000
++ .endif
++ b SYM(__aeabi_idiv0) __PLT__
++ .thumb
++#endif
++.endm
++#else
++.macro THUMB_LDIV0 name signed
+ push { r1, lr }
+ 98: cfi_push 98b - __\name, 0xe, -0x4, 0x8
+ bl SYM (__div0)
+@@ -277,18 +395,19 @@
+ pop { r1, pc }
+ #endif
+ .endm
++#endif
+
+ .macro FUNC_END name
+ SIZE (__\name)
+ .endm
+
+-.macro DIV_FUNC_END name
++.macro DIV_FUNC_END name signed
+ cfi_start __\name, LSYM(Lend_div0)
+ LSYM(Ldiv0):
+ #ifdef __thumb__
+- THUMB_LDIV0 \name
++ THUMB_LDIV0 \name \signed
+ #else
+- ARM_LDIV0 \name
++ ARM_LDIV0 \name \signed
+ #endif
+ cfi_end LSYM(Lend_div0)
+ FUNC_END \name
+@@ -413,6 +532,12 @@
+ #define yyl r2
+ #endif
+
++#ifdef __ARM_EABI__
++.macro WEAK name
++ .weak SYM (__\name)
++.endm
++#endif
++
+ #ifdef __thumb__
+ /* Register aliases. */
+
+@@ -437,6 +562,43 @@
+
+ #if __ARM_ARCH__ >= 5 && ! defined (__OPTIMIZE_SIZE__)
+
++#if defined (__thumb2__)
++ clz \curbit, \dividend
++ clz \result, \divisor
++ sub \curbit, \result, \curbit
++ rsb \curbit, \curbit, #31
++ adr \result, 1f
++ add \curbit, \result, \curbit, lsl #4
++ mov \result, #0
++ mov pc, \curbit
++.p2align 3
++1:
++ .set shift, 32
++ .rept 32
++ .set shift, shift - 1
++ cmp.w \dividend, \divisor, lsl #shift
++ nop.n
++ adc.w \result, \result, \result
++ it cs
++ subcs.w \dividend, \dividend, \divisor, lsl #shift
++ .endr
++#elif defined(__ARM_TUNE_MARVELL_F__)
++ clz \curbit, \dividend
++ clz \result, \divisor
++ sub \curbit, \result, \curbit
++ mov \divisor, \divisor, lsl \curbit
++ rsb \curbit, \curbit, #31
++ mov \curbit, \curbit, lsl #2
++ mov \result, #0
++ add pc, pc, \curbit, lsl #2
++ nop
++ .rept 32
++ cmp \dividend, \divisor
++ subcs \dividend, \dividend, \divisor
++ mov \divisor, \divisor, lsr #1
++ adc \result, \result, \result
++ .endr
++#else /* ! defined(__ARM_TUNE_MARVELL_F__) */
+ clz \curbit, \dividend
+ clz \result, \divisor
+ sub \curbit, \result, \curbit
+@@ -452,6 +614,7 @@
+ adc \result, \result, \result
+ subcs \dividend, \dividend, \divisor, lsl #shift
+ .endr
++#endif /* defined(__ARM_TUNE_MARVELL_F__) */
+
+ #else /* __ARM_ARCH__ < 5 || defined (__OPTIMIZE_SIZE__) */
+ #if __ARM_ARCH__ >= 5
+@@ -499,18 +662,23 @@
+
+ @ Division loop
+ 1: cmp \dividend, \divisor
++ do_it hs, t
+ subhs \dividend, \dividend, \divisor
+ orrhs \result, \result, \curbit
+ cmp \dividend, \divisor, lsr #1
++ do_it hs, t
+ subhs \dividend, \dividend, \divisor, lsr #1
+ orrhs \result, \result, \curbit, lsr #1
+ cmp \dividend, \divisor, lsr #2
++ do_it hs, t
+ subhs \dividend, \dividend, \divisor, lsr #2
+ orrhs \result, \result, \curbit, lsr #2
+ cmp \dividend, \divisor, lsr #3
++ do_it hs, t
+ subhs \dividend, \dividend, \divisor, lsr #3
+ orrhs \result, \result, \curbit, lsr #3
+ cmp \dividend, #0 @ Early termination?
++ do_it ne, t
+ movnes \curbit, \curbit, lsr #4 @ No, any more bits to do?
+ movne \divisor, \divisor, lsr #4
+ bne 1b
+@@ -799,13 +967,14 @@
+ /* ------------------------------------------------------------------------ */
+ #ifdef L_udivsi3
+
++#if defined(__ARM_ARCH_6M__)
++
+ FUNC_START udivsi3
+ FUNC_ALIAS aeabi_uidiv udivsi3
+
+-#ifdef __thumb__
+-
+ cmp divisor, #0
+ beq LSYM(Ldiv0)
++LSYM(udivsi3_nodiv0):
+ mov curbit, #1
+ mov result, #0
+
+@@ -819,9 +988,16 @@
+ pop { work }
+ RET
+
+-#else /* ARM version. */
++#else /* ARM/Thumb-2 version. */
++
++ ARM_FUNC_START udivsi3
++ ARM_FUNC_ALIAS aeabi_uidiv udivsi3
+
++ /* Note: if called via udivsi3_nodiv0, this will unnecessarily check
++ for division-by-zero a second time. */
++LSYM(udivsi3_nodiv0):
+ subs r2, r1, #1
++ do_it eq
+ RETc(eq)
+ bcc LSYM(Ldiv0)
+ cmp r0, r1
+@@ -834,7 +1010,8 @@
+ mov r0, r2
+ RET
+
+-11: moveq r0, #1
++11: do_it eq, e
++ moveq r0, #1
+ movne r0, #0
+ RET
+
+@@ -845,19 +1022,24 @@
+
+ #endif /* ARM version */
+
+- DIV_FUNC_END udivsi3
++ DIV_FUNC_END udivsi3 unsigned
+
++#if defined(__ARM_ARCH_6M__)
+ FUNC_START aeabi_uidivmod
+-#ifdef __thumb__
++ cmp r1, #0
++ beq LSYM(Ldiv0)
+ push {r0, r1, lr}
+- bl SYM(__udivsi3)
++ bl LSYM(udivsi3_nodiv0)
+ POP {r1, r2, r3}
+ mul r2, r0
+ sub r1, r1, r2
+ bx r3
+ #else
++ARM_FUNC_START aeabi_uidivmod
++ cmp r1, #0
++ beq LSYM(Ldiv0)
+ stmfd sp!, { r0, r1, lr }
+- bl SYM(__udivsi3)
++ bl LSYM(udivsi3_nodiv0)
+ ldmfd sp!, { r1, r2, lr }
+ mul r3, r2, r0
+ sub r1, r1, r3
+@@ -904,19 +1086,20 @@
+
+ #endif /* ARM version. */
+
+- DIV_FUNC_END umodsi3
++ DIV_FUNC_END umodsi3 unsigned
+
+ #endif /* L_umodsi3 */
+ /* ------------------------------------------------------------------------ */
+ #ifdef L_divsi3
+
++#if defined(__ARM_ARCH_6M__)
++
+ FUNC_START divsi3
+ FUNC_ALIAS aeabi_idiv divsi3
+
+-#ifdef __thumb__
+ cmp divisor, #0
+ beq LSYM(Ldiv0)
+-
++LSYM(divsi3_nodiv0):
+ push { work }
+ mov work, dividend
+ eor work, divisor @ Save the sign of the result.
+@@ -945,15 +1128,21 @@
+ pop { work }
+ RET
+
+-#else /* ARM version. */
++#else /* ARM/Thumb-2 version. */
+
++ ARM_FUNC_START divsi3
++ ARM_FUNC_ALIAS aeabi_idiv divsi3
++
+ cmp r1, #0
+- eor ip, r0, r1 @ save the sign of the result.
+ beq LSYM(Ldiv0)
++LSYM(divsi3_nodiv0):
++ eor ip, r0, r1 @ save the sign of the result.
++ do_it mi
+ rsbmi r1, r1, #0 @ loops below use unsigned.
+ subs r2, r1, #1 @ division by 1 or -1 ?
+ beq 10f
+ movs r3, r0
++ do_it mi
+ rsbmi r3, r0, #0 @ positive dividend value
+ cmp r3, r1
+ bls 11f
+@@ -963,14 +1152,18 @@
+ ARM_DIV_BODY r3, r1, r0, r2
+
+ cmp ip, #0
++ do_it mi
+ rsbmi r0, r0, #0
+ RET
+
+ 10: teq ip, r0 @ same sign ?
++ do_it mi
+ rsbmi r0, r0, #0
+ RET
+
+-11: movlo r0, #0
++11: do_it lo
++ movlo r0, #0
++ do_it eq,t
+ moveq r0, ip, asr #31
+ orreq r0, r0, #1
+ RET
+@@ -979,24 +1172,30 @@
+
+ cmp ip, #0
+ mov r0, r3, lsr r2
++ do_it mi
+ rsbmi r0, r0, #0
+ RET
+
+ #endif /* ARM version */
+
+- DIV_FUNC_END divsi3
++ DIV_FUNC_END divsi3 signed
+
++#if defined(__ARM_ARCH_6M__)
+ FUNC_START aeabi_idivmod
+-#ifdef __thumb__
++ cmp r1, #0
++ beq LSYM(Ldiv0)
+ push {r0, r1, lr}
+- bl SYM(__divsi3)
++ bl LSYM(divsi3_nodiv0)
+ POP {r1, r2, r3}
+ mul r2, r0
+ sub r1, r1, r2
+ bx r3
+ #else
++ARM_FUNC_START aeabi_idivmod
++ cmp r1, #0
++ beq LSYM(Ldiv0)
+ stmfd sp!, { r0, r1, lr }
+- bl SYM(__divsi3)
++ bl LSYM(divsi3_nodiv0)
+ ldmfd sp!, { r1, r2, lr }
+ mul r3, r2, r0
+ sub r1, r1, r3
+@@ -1062,21 +1261,25 @@
+
+ #endif /* ARM version */
+
+- DIV_FUNC_END modsi3
++ DIV_FUNC_END modsi3 signed
+
+ #endif /* L_modsi3 */
+ /* ------------------------------------------------------------------------ */
+ #ifdef L_dvmd_tls
+
+- FUNC_START div0
+- FUNC_ALIAS aeabi_idiv0 div0
+- FUNC_ALIAS aeabi_ldiv0 div0
+-
++#ifdef __ARM_EABI__
++ WEAK aeabi_idiv0
++ WEAK aeabi_ldiv0
++ FUNC_START aeabi_idiv0
++ FUNC_START aeabi_ldiv0
+ RET
+-
+ FUNC_END aeabi_ldiv0
+ FUNC_END aeabi_idiv0
++#else
++ FUNC_START div0
++ RET
+ FUNC_END div0
++#endif
+
+ #endif /* L_divmodsi_tools */
+ /* ------------------------------------------------------------------------ */
+@@ -1086,16 +1289,49 @@
+ /* Constant taken from <asm/signal.h>. */
+ #define SIGFPE 8
+
++#ifdef __ARM_EABI__
++ WEAK aeabi_idiv0
++ WEAK aeabi_ldiv0
++ ARM_FUNC_START aeabi_idiv0
++ ARM_FUNC_START aeabi_ldiv0
++#else
+ ARM_FUNC_START div0
++#endif
+
+- do_push {r1, lr}
++ do_push (r1, lr)
+ mov r0, #SIGFPE
+ bl SYM(raise) __PLT__
+ RETLDM r1
+
++#ifdef __ARM_EABI__
++ FUNC_END aeabi_ldiv0
++ FUNC_END aeabi_idiv0
++#else
+ FUNC_END div0
++#endif
+
+ #endif /* L_dvmd_lnx */
++#ifdef L_clear_cache
++#if defined __ARM_EABI__ && defined __linux__
++@ EABI GNU/Linux call to cacheflush syscall.
++ ARM_FUNC_START clear_cache
++ do_push (r7)
++#if __ARM_ARCH__ >= 7 || defined(__ARM_ARCH_6T2__)
++ movw r7, #2
++ movt r7, #0xf
++#else
++ mov r7, #0xf0000
++ add r7, r7, #2
++#endif
++ mov r2, #0
++ swi 0
++ do_pop (r7)
++ RET
++ FUNC_END clear_cache
++#else
++#error "This is only for ARM EABI GNU/Linux"
++#endif
++#endif /* L_clear_cache */
+ /* ------------------------------------------------------------------------ */
+ /* Dword shift operations. */
+ /* All the following Dword shift variants rely on the fact that
+@@ -1292,7 +1528,7 @@
+ push {r4, lr}
+ # else
+ ARM_FUNC_START clzdi2
+- do_push {r4, lr}
++ do_push (r4, lr)
+ # endif
+ cmp xxh, #0
+ bne 1f
+diff -Nur a/gcc/config/arm/linux-eabi.h b/gcc/config/arm/linux-eabi.h
+--- a/gcc/config/arm/linux-eabi.h 2007-11-08 14:44:09.000000000 +0100
++++ b/gcc/config/arm/linux-eabi.h 2010-01-25 09:50:28.995687913 +0100
+@@ -66,22 +66,14 @@
+ /* At this point, bpabi.h will have clobbered LINK_SPEC. We want to
+ use the GNU/Linux version, not the generic BPABI version. */
+ #undef LINK_SPEC
+-#define LINK_SPEC LINUX_TARGET_LINK_SPEC
++#define LINK_SPEC LINUX_TARGET_LINK_SPEC BE8_LINK_SPEC
+
+ /* Use the default LIBGCC_SPEC, not the version in linux-elf.h, as we
+ do not use -lfloat. */
+ #undef LIBGCC_SPEC
+
+-/* Clear the instruction cache from `beg' to `end'. This makes an
+- inline system call to SYS_cacheflush. */
++/* Clear the instruction cache from `beg' to `end'. This is
++ implemented in lib1funcs.asm, so ensure an error if this definition
++ is used. */
+ #undef CLEAR_INSN_CACHE
+-#define CLEAR_INSN_CACHE(BEG, END) \
+-{ \
+- register unsigned long _beg __asm ("a1") = (unsigned long) (BEG); \
+- register unsigned long _end __asm ("a2") = (unsigned long) (END); \
+- register unsigned long _flg __asm ("a3") = 0; \
+- register unsigned long _scno __asm ("r7") = 0xf0002; \
+- __asm __volatile ("swi 0 @ sys_cacheflush" \
+- : "=r" (_beg) \
+- : "0" (_beg), "r" (_end), "r" (_flg), "r" (_scno)); \
+-}
++#define CLEAR_INSN_CACHE(BEG, END) not used
+diff -Nur a/gcc/config/arm/linux-elf.h b/gcc/config/arm/linux-elf.h
+--- a/gcc/config/arm/linux-elf.h 2009-02-20 16:20:38.000000000 +0100
++++ b/gcc/config/arm/linux-elf.h 2010-01-25 09:50:28.995687913 +0100
+@@ -98,7 +98,7 @@
+
+ /* NWFPE always understands FPA instructions. */
+ #undef FPUTYPE_DEFAULT
+-#define FPUTYPE_DEFAULT FPUTYPE_FPA_EMU3
++#define FPUTYPE_DEFAULT "fpe3"
+
+ /* Call the function profiler with a given profile label. */
+ #undef ARM_FUNCTION_PROFILER
+diff -Nur a/gcc/config/arm/marvell-f.md b/gcc/config/arm/marvell-f.md
+--- a/gcc/config/arm/marvell-f.md 1970-01-01 01:00:00.000000000 +0100
++++ b/gcc/config/arm/marvell-f.md 2010-01-25 09:50:28.995687913 +0100
+@@ -0,0 +1,365 @@
++;; Marvell 2850 pipeline description
++;; Copyright (C) 2005, 2006, 2007 Free Software Foundation, Inc.
++;; Written by Marvell and CodeSourcery, Inc.
++
++;; 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 2, 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 COPYING. If not, write to
++;; the Free Software Foundation, 51 Franklin Street, Fifth Floor,
++;; Boston, MA 02110-1301, USA.
++
++;; This automaton provides a pipeline description for the Marvell
++;; 2850 core.
++;;
++;; The model given here assumes that the condition for all conditional
++;; instructions is "true", i.e., that all of the instructions are
++;; actually executed.
++
++(define_automaton "marvell_f")
++
++;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
++;; Pipelines
++;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
++
++;; This is a dual-issue processor with three pipelines:
++;;
++;; 1. Arithmetic and load/store pipeline A1.
++;; Issue | E1 | E2 | OF | WR | WB for load-store instructions
++;; Issue | E1 | E2 | WB for arithmetic instructions
++;;
++;; 2. Arithmetic pipeline A2.
++;; Issue | E1 | E2 | WB
++;;
++;; 3. Multiply and multiply-accumulate pipeline.
++;; Issue | MAC1 | MAC2 | MAC3 | WB
++;;
++;; There are various bypasses modelled to a greater or lesser extent.
++;;
++;; Latencies in this file correspond to the number of cycles after
++;; the issue stage that it takes for the result of the instruction to
++;; be computed, or for its side-effects to occur.
++
++(define_cpu_unit "a1_e1,a1_e2,a1_of,a1_wr,a1_wb" "marvell_f") ; ALU 1
++(define_cpu_unit "a2_e1,a2_e2,a2_wb" "marvell_f") ; ALU 2
++(define_cpu_unit "m_1,m_2,m_3,m_wb" "marvell_f") ; MAC
++
++;; We define an SRAM cpu unit to enable us to describe conflicts
++;; between loads at the E2 stage and stores at the WR stage.
++
++(define_cpu_unit "sram" "marvell_f")
++
++;; Handling of dual-issue constraints.
++;;
++;; Certain pairs of instructions can be issued in parallel, and certain
++;; pairs cannot. We divide a subset of the instructions into groups as
++;; follows.
++;;
++;; - data processing 1 (mov, mvn);
++;; - data processing 2 (adc, add, and, bic, cmn, cmp, eor, orr, rsb,
++;; rsc, sbc, sub, teq, tst);
++;; - load single (ldr, ldrb, ldrbt, ldrt, ldrh, ldrsb, ldrsh);
++;; - store single (str, strb, strbt, strt, strh);
++;; - swap (swp, swpb);
++;; - pld;
++;; - count leading zeros and DSP add/sub (clz, qadd, qdadd, qsub, qdsub);
++;; - multiply 2 (mul, muls, smull, umull, smulxy, smulls, umulls);
++;; - multiply 3 (mla, mlas, smlal, umlal, smlaxy, smlalxy, smlawx,
++;; smlawy, smlals, umlals);
++;; - branches (b, bl, blx, bx).
++;;
++;; Ignoring conditional execution, it is a good approximation to the core
++;; to model that two instructions may only be issued in parallel if the
++;; following conditions are met.
++;; I. The instructions both fall into one of the above groups and their
++;; corresponding groups have a entry in the matrix below that is not X.
++;; II. The second instruction does not read any register updated by the
++;; first instruction (already enforced by the GCC scheduler).
++;; III. The second instruction does not need the carry flag updated by the
++;; first instruction. Currently we do not model this.
++;;
++;; First Second instruction group
++;; insn
++;; DP1 DP2 L S SWP PLD CLZ M2 M3 B
++;;
++;; DP1 ok ok ok ok ok ok ok ok ok ok
++;; DP2(1) ok ok ok ok ok ok ok ok ok ok
++;; DP2(2) ok (2) ok (4) ok ok ok ok X ok
++;; L }
++;; SWP } ok ok X X X X ok ok ok ok
++;; PLD }
++;; S(3) ok ok X X X X ok ok ok ok
++;; S(4) ok (2) X X X X ok ok X ok
++;; CLZ ok ok ok ok ok ok ok ok ok ok
++;; M2 ok ok ok ok ok ok ok X X ok
++;; M3 ok (2) ok (4) ok ok ok X X ok
++;; B ok ok ok ok ok ok ok ok ok ok
++;;
++;; (1) without register shift
++;; (2) with register shift
++;; (3) with immediate offset
++;; (4) with register offset
++;;
++;; We define a fake cpu unit "reg_shift_lock" to enforce constraints
++;; between instructions in groups DP2(2) and M3. All other
++;; constraints are enforced automatically by virtue of the limited
++;; number of pipelines available for the various operations, with
++;; the exception of constraints involving S(4) that we do not model.
++
++(define_cpu_unit "reg_shift_lock" "marvell_f")
++
++;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
++;; ALU instructions
++;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
++
++;; 1. Certain logic operations can be retired after the E1 stage if
++;; the pipeline is not already retiring another instruction. In this
++;; model we assume this behaviour always holds for mov, mvn, and, orr, eor
++;; instructions. If a register shift is involved and the instruction is
++;; not mov or mvn, then a dual-issue constraint must be enforced.
++
++;; The first two cases are separate so they can be identified for
++;; bypasses below.
++
++(define_insn_reservation "marvell_f_alu_early_retire" 1
++ (and (eq_attr "tune" "marvell_f")
++ (and (eq_attr "type" "alu")
++ (eq_attr "insn" "mov,mvn,and,orr,eor")))
++ "(a1_e1,a1_wb)|(a2_e1,a2_wb)")
++
++(define_insn_reservation "marvell_f_alu_early_retire_shift" 1
++ (and (eq_attr "tune" "marvell_f")
++ (and (eq_attr "type" "alu_shift_reg")
++ (eq_attr "insn" "mov,mvn,and,orr,eor")))
++ "(a1_e1,a1_wb)|(a2_e1,a2_wb)")
++
++(define_insn_reservation "marvell_f_alu_early_retire_reg_shift1" 1
++ (and (eq_attr "tune" "marvell_f")
++ (and (eq_attr "type" "alu_shift_reg")
++ (eq_attr "insn" "mov,mvn")))
++ "(a1_e1,a1_wb)|(a2_e1,a2_wb)")
++
++(define_insn_reservation "marvell_f_alu_early_retire_reg_shift2" 1
++ (and (eq_attr "tune" "marvell_f")
++ (and (eq_attr "type" "alu_shift_reg")
++ (eq_attr "insn" "and,orr,eor")))
++ "(reg_shift_lock+a1_e1,a1_wb)|(reg_shift_lock+a2_e1,a2_wb)")
++
++;; 2. ALU operations with no shifted operand. These bypass the E1 stage if
++;; the E2 stage of the corresponding pipeline is clear; here, we always
++;; model this scenario [*]. We give the operation a latency of 1 yet reserve
++;; both E1 and E2 for it (thus preventing the GCC scheduler, in the case
++;; where both E1 and E2 of one pipeline are clear, from issuing one
++;; instruction to each).
++;;
++;; [*] The non-bypass case is a latency of two, reserving E1 on the first
++;; cycle and E2 on the next. Due to the way the scheduler works we
++;; have to choose between taking this as the default and taking the
++;; above case (with latency one) as the default; we choose the latter.
++
++(define_insn_reservation "marvell_f_alu_op_bypass_e1" 1
++ (and (eq_attr "tune" "marvell_f")
++ (and (eq_attr "type" "alu")
++ (not (eq_attr "insn" "mov,mvn,and,orr,eor"))))
++ "(a1_e1+a1_e2,a1_wb)|(a2_e1+a2_e2,a2_wb)")
++
++;; 3. ALU operations with a shift-by-constant operand.
++
++(define_insn_reservation "marvell_f_alu_shift_op" 2
++ (and (eq_attr "tune" "marvell_f")
++ (and (eq_attr "type" "alu_shift")
++ (not (eq_attr "insn" "mov,mvn,and,orr,eor"))))
++ "(a1_e1,a1_e2,a1_wb)|(a2_e1,a2_e2,a2_wb)")
++
++;; 4. ALU operations with a shift-by-register operand. Since the
++;; instruction is never mov or mvn, a dual-issue constraint must
++;; be enforced.
++
++(define_insn_reservation "marvell_f_alu_shift_reg_op" 2
++ (and (eq_attr "tune" "marvell_f")
++ (and (eq_attr "type" "alu_shift_reg")
++ (not (eq_attr "insn" "mov,mvn,and,orr,eor"))))
++ "(reg_shift_lock+a1_e1,a1_e2,a1_wb)|(reg_shift_lock+a2_e1,a2_e2,a2_wb)")
++
++;; Given an ALU operation with shift (I1) followed by another ALU
++;; operation (I2), with I2 depending on the destination register Rd of I1
++;; and with I2 not using that value as the amount or the starting value for
++;; a shift, then I1 and I2 may be issued to the same pipeline on
++;; consecutive cycles. In terms of this model that corresponds to I1
++;; having a latency of one cycle. There are three cases for various
++;; I1 and I2 as follows.
++
++;; (a) I1 has a constant or register shift and I2 doesn't have a shift at all.
++(define_bypass 1 "marvell_f_alu_shift_op,\
++ marvell_f_alu_shift_reg_op"
++ "marvell_f_alu_op_bypass_e1,marvell_f_alu_early_retire")
++
++;; (b) I1 has a constant or register shift and I2 has a constant shift.
++;; Rd must not provide the starting value for the shift.
++(define_bypass 1 "marvell_f_alu_shift_op,\
++ marvell_f_alu_shift_reg_op"
++ "marvell_f_alu_shift_op,marvell_f_alu_early_retire_shift"
++ "arm_no_early_alu_shift_value_dep")
++
++;; (c) I1 has a constant or register shift and I2 has a register shift.
++;; Rd must not provide the amount by which to shift.
++(define_bypass 1 "marvell_f_alu_shift_op,\
++ marvell_f_alu_shift_reg_op"
++ "marvell_f_alu_shift_reg_op,\
++ marvell_f_alu_early_retire_reg_shift1,\
++ marvell_f_alu_early_retire_reg_shift2"
++ "arm_no_early_alu_shift_dep")
++
++;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
++;; Multiplication instructions
++;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
++
++;; Multiplication instructions in group "Multiply 2".
++
++(define_insn_reservation "marvell_f_multiply_2" 3
++ (and (eq_attr "tune" "marvell_f")
++ (eq_attr "insn" "mul,muls,smull,umull,smulxy,smulls,umulls"))
++ "m_1,m_2,m_3,m_wb")
++
++;; Multiplication instructions in group "Multiply 3". There is a
++;; dual-issue constraint with non-multiplication ALU instructions
++;; to be respected here.
++
++(define_insn_reservation "marvell_f_multiply_3" 3
++ (and (eq_attr "tune" "marvell_f")
++ (eq_attr "insn" "mla,mlas,smlal,umlal,smlaxy,smlalxy,smlawx,\
++ smlawy,smlals,umlals"))
++ "reg_shift_lock+m_1,m_2,m_3,m_wb")
++
++;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
++;; Branch instructions
++;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
++
++;; Conditional backward b instructions can have a zero-cycle penalty, and
++;; other conditional b and bl instructions have a one-cycle penalty if
++;; predicted correctly. Currently we model the zero-cycle case for all
++;; branches.
++
++(define_insn_reservation "marvell_f_branches" 0
++ (and (eq_attr "tune" "marvell_f")
++ (eq_attr "type" "branch"))
++ "nothing")
++
++;; Call latencies are not predictable; a semi-arbitrary very large
++;; number is used as "positive infinity" for such latencies.
++
++(define_insn_reservation "marvell_f_call" 32
++ (and (eq_attr "tune" "marvell_f")
++ (eq_attr "type" "call"))
++ "nothing")
++
++;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
++;; Load/store instructions
++;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
++
++;; The models for load/store instructions do not accurately describe
++;; the difference between operations with a base register writeback.
++;; These models assume that all memory references hit in dcache.
++
++;; 1. Load/store for single registers.
++
++;; The worst case for a load is when the load result is needed in E1
++;; (for example for a register shift), giving a latency of four. Loads
++;; skip E1 and access memory at the E2 stage.
++
++(define_insn_reservation "marvell_f_load1" 4
++ (and (eq_attr "tune" "marvell_f")
++ (eq_attr "type" "load1,load_byte"))
++ "a1_e2+sram,a1_of,a1_wr,a1_wb")
++
++;; The result for a load may be bypassed (to be available at the same
++;; time as the load arrives in the WR stage, so effectively at the OF
++;; stage) to the Rn operand at E2 with a latency of two. The result may
++;; be bypassed to a non-Rn operand at E2 with a latency of three. For
++;; instructions without shifts, detection of an Rn bypass situation is
++;; difficult (because some of the instruction patterns switch their
++;; operands), and so we do not model that here. For instructions with
++;; shifts, the operand used at E2 will always be Rn, and so we can
++;; model the latency-two bypass for these.
++
++(define_bypass 2 "marvell_f_load1"
++ "marvell_f_alu_shift_op"
++ "arm_no_early_alu_shift_value_dep")
++
++(define_bypass 2 "marvell_f_load1"
++ "marvell_f_alu_shift_reg_op"
++ "arm_no_early_alu_shift_dep")
++
++;; Stores write at the WR stage and loads read at the E2 stage, giving
++;; a store latency of three.
++
++(define_insn_reservation "marvell_f_store1" 3
++ (and (eq_attr "tune" "marvell_f")
++ (eq_attr "type" "store1"))
++ "a1_e2,a1_of,a1_wr+sram,a1_wb")
++
++;; 2. Load/store for two consecutive registers. These may be dealt
++;; with in the same number of cycles as single loads and stores.
++
++(define_insn_reservation "marvell_f_load2" 4
++ (and (eq_attr "tune" "marvell_f")
++ (eq_attr "type" "load2"))
++ "a1_e2+sram,a1_of,a1_wr,a1_wb")
++
++(define_insn_reservation "marvell_f_store2" 3
++ (and (eq_attr "tune" "marvell_f")
++ (eq_attr "type" "store2"))
++ "a1_e2,a1_of,a1_wr+sram,a1_wb")
++
++;; The first word of a doubleword load is eligible for the latency-two
++;; bypass described above for single loads, but this is not modelled here.
++;; We do however assume that either word may also be bypassed with
++;; latency three for ALU operations with shifts (where the shift value and
++;; amount do not depend on the loaded value) and latency four for ALU
++;; operations without shifts. The latency four case is of course the default.
++
++(define_bypass 3 "marvell_f_load2"
++ "marvell_f_alu_shift_op"
++ "arm_no_early_alu_shift_value_dep")
++
++(define_bypass 3 "marvell_f_load2"
++ "marvell_f_alu_shift_reg_op"
++ "arm_no_early_alu_shift_dep")
++
++;; 3. Load/store for more than two registers.
++
++;; These instructions stall for an extra cycle in the decode stage;
++;; individual load/store instructions for each register are then issued.
++;; The load/store multiple instruction itself is removed from the decode
++;; stage at the same time as the final load/store instruction is issued.
++;; To complicate matters, pairs of loads/stores referencing two
++;; consecutive registers will be issued together as doubleword operations.
++;; We model a 3-word load as an LDR plus an LDRD, and a 4-word load
++;; as two LDRDs; thus, these are allocated the same latencies (the
++;; latency for two consecutive loads plus one for the setup stall).
++;; The extra stall is modelled by reserving E1.
++
++(define_insn_reservation "marvell_f_load3_4" 6
++ (and (eq_attr "tune" "marvell_f")
++ (eq_attr "type" "load3,load4"))
++ "a1_e1,a1_e1+a1_e2+sram,a1_e2+sram+a1_of,a1_of+a1_wr,a1_wr+a1_wb,a1_wb")
++
++;; Bypasses are possible for ldm as for single loads, but we do not
++;; model them here since the order of the constituent loads is
++;; difficult to predict.
++
++(define_insn_reservation "marvell_f_store3_4" 5
++ (and (eq_attr "tune" "marvell_f")
++ (eq_attr "type" "store3,store4"))
++ "a1_e1,a1_e1+a1_e2,a1_e2+a1_of,a1_of+a1_wr+sram,a1_wr+sram+a1_wb,a1_wb")
++
+diff -Nur a/gcc/config/arm/marvell-f-vfp.md b/gcc/config/arm/marvell-f-vfp.md
+--- a/gcc/config/arm/marvell-f-vfp.md 1970-01-01 01:00:00.000000000 +0100
++++ b/gcc/config/arm/marvell-f-vfp.md 2010-01-25 09:50:28.995687913 +0100
+@@ -0,0 +1,153 @@
++;; Marvell 2850 VFP pipeline description
++;; Copyright (C) 2007 Free Software Foundation, Inc.
++;; Written by CodeSourcery, Inc.
++
++;; This file is part of GCC.
++
++;; 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 COPYING. If not, write to
++;; the Free Software Foundation, 51 Franklin Street, Fifth Floor,
++;; Boston, MA 02110-1301, USA.
++
++;; This automaton provides a pipeline description for the Marvell
++;; 2850 core.
++;;
++;; The model given here assumes that the condition for all conditional
++;; instructions is "true", i.e., that all of the instructions are
++;; actually executed.
++
++(define_automaton "marvell_f_vfp")
++
++;; This is a single-issue VFPv2 implementation with the following execution
++;; units:
++;;
++;; 1. Addition/subtraction unit; takes three cycles, pipelined.
++;; 2. Multiplication unit; takes four cycles, pipelined.
++;; 3. Add buffer, used for multiply-accumulate (see below).
++;; 4. Divide/square root unit, not pipelined.
++;; For single-precision: takes sixteen cycles, can accept another insn
++;; after fifteen cycles.
++;; For double-precision: takes thirty-one cycles, can accept another insn
++;; after thirty cycles.
++;; 5. Single-cycle unit, pipelined.
++;; This does absolute value/copy/negate/compare in one cycle and
++;; conversion in two cycles.
++;;
++;; When all three operands of a multiply-accumulate instruction are ready,
++;; one is issued to the add buffer (which can hold six operands in a FIFO)
++;; and the two to be multiplied are issued to the multiply unit. After
++;; four cycles in the multiply unit, one cycle is taken to issue the
++;; operand from the add buffer plus the multiplication result to the
++;; addition/subtraction unit. That issue takes priority over any add/sub
++;; instruction waiting at the normal issue stage, but may be performed in
++;; parallel with the issue of a non-add/sub instruction. The total time
++;; for a multiply-accumulate instruction to pass through the execution
++;; units is hence eight cycles.
++;;
++;; We do not need to explicitly model the add buffer because it can
++;; always issue the instruction at the head of its FIFO (due to the above
++;; priority rule) and there are more spaces in the add buffer (six) than
++;; there are stages (four) in the multiplication unit.
++;;
++;; Two instructions may be retired at once from the head of an 8-entry
++;; reorder buffer. Data from these first two instructions only may be
++;; forwarded to the inputs of the issue unit. We assume that the
++;; pressure on the reorder buffer will be sufficiently low that every
++;; instruction entering it will be eligible for data forwarding. Since
++;; data is forwarded to the issue unit and not the execution units (so
++;; for example single-cycle instructions cannot be issued back-to-back),
++;; the latencies given below are the cycle counts above plus one.
++
++(define_cpu_unit "mf_vfp_issue" "marvell_f_vfp")
++(define_cpu_unit "mf_vfp_add" "marvell_f_vfp")
++(define_cpu_unit "mf_vfp_mul" "marvell_f_vfp")
++(define_cpu_unit "mf_vfp_div" "marvell_f_vfp")
++(define_cpu_unit "mf_vfp_single_cycle" "marvell_f_vfp")
++
++;; An attribute to indicate whether our reservations are applicable.
++
++(define_attr "marvell_f_vfp" "yes,no"
++ (const (if_then_else (and (eq_attr "tune" "marvell_f")
++ (eq_attr "fpu" "vfp"))
++ (const_string "yes") (const_string "no"))))
++
++;; Reservations of functional units. The nothing*2 reservations at the
++;; start of many of the reservation strings correspond to the decode
++;; stages. We need to have these reservations so that we can correctly
++;; reserve parts of the core's A1 pipeline for loads and stores. For
++;; that case (since loads skip E1) the pipelines line up thus:
++;; A1 pipe: Issue E2 OF WR WB ...
++;; VFP pipe: Fetch Decode1 Decode2 Issue Execute1 ...
++;; For a load, we need to make a reservation of E2, and thus we must
++;; use Decode1 as the starting point for all VFP reservations here.
++;;
++;; For reservations of pipelined VFP execution units we only reserve
++;; the execution unit for the first execution cycle, omitting any trailing
++;; "nothing" reservations.
++
++(define_insn_reservation "marvell_f_vfp_add" 4
++ (and (eq_attr "marvell_f_vfp" "yes")
++ (eq_attr "type" "farith"))
++ "nothing*2,mf_vfp_issue,mf_vfp_add")
++
++(define_insn_reservation "marvell_f_vfp_mul" 5
++ (and (eq_attr "marvell_f_vfp" "yes")
++ (eq_attr "type" "fmuls,fmuld"))
++ "nothing*2,mf_vfp_issue,mf_vfp_mul")
++
++(define_insn_reservation "marvell_f_vfp_divs" 17
++ (and (eq_attr "marvell_f_vfp" "yes")
++ (eq_attr "type" "fdivs"))
++ "nothing*2,mf_vfp_issue,mf_vfp_div*15")
++
++(define_insn_reservation "marvell_f_vfp_divd" 32
++ (and (eq_attr "marvell_f_vfp" "yes")
++ (eq_attr "type" "fdivd"))
++ "nothing*2,mf_vfp_issue,mf_vfp_div*30")
++
++;; The DFA lookahead is small enough that the "add" reservation here
++;; will always take priority over any addition/subtraction instruction
++;; issued five cycles after the multiply-accumulate instruction, as
++;; required.
++(define_insn_reservation "marvell_f_vfp_mac" 9
++ (and (eq_attr "marvell_f_vfp" "yes")
++ (eq_attr "type" "fmacs,fmacd"))
++ "nothing*2,mf_vfp_issue,mf_vfp_mul,nothing*4,mf_vfp_add")
++
++(define_insn_reservation "marvell_f_vfp_single" 2
++ (and (eq_attr "marvell_f_vfp" "yes")
++ (eq_attr "type" "ffarith"))
++ "nothing*2,mf_vfp_issue,mf_vfp_single_cycle")
++
++(define_insn_reservation "marvell_f_vfp_convert" 3
++ (and (eq_attr "marvell_f_vfp" "yes")
++ (eq_attr "type" "f_cvt"))
++ "nothing*2,mf_vfp_issue,mf_vfp_single_cycle")
++
++(define_insn_reservation "marvell_f_vfp_load" 2
++ (and (eq_attr "marvell_f_vfp" "yes")
++ (eq_attr "type" "f_loads,f_loadd"))
++ "a1_e2+sram,a1_of,a1_wr+mf_vfp_issue,a1_wb+mf_vfp_single_cycle")
++
++(define_insn_reservation "marvell_f_vfp_from_core" 2
++ (and (eq_attr "marvell_f_vfp" "yes")
++ (eq_attr "type" "r_2_f"))
++ "a1_e2,a1_of,a1_wr+mf_vfp_issue,a1_wb+mf_vfp_single_cycle")
++
++;; The interaction between the core and VFP pipelines during VFP
++;; store operations and core <-> VFP moves is not clear, so we guess.
++(define_insn_reservation "marvell_f_vfp_store" 3
++ (and (eq_attr "marvell_f_vfp" "yes")
++ (eq_attr "type" "f_stores,f_stored"))
++ "a1_e2,a1_of,mf_vfp_issue,a1_wr+sram+mf_vfp_single_cycle")
++
++(define_insn_reservation "marvell_f_vfp_to_core" 4
++ (and (eq_attr "marvell_f_vfp" "yes")
++ (eq_attr "type" "f_2_r"))
++ "a1_e2,a1_of,a1_wr+mf_vfp_issue,a1_wb+mf_vfp_single_cycle")
++
+diff -Nur a/gcc/config/arm/montavista-linux.h b/gcc/config/arm/montavista-linux.h
+--- a/gcc/config/arm/montavista-linux.h 1970-01-01 01:00:00.000000000 +0100
++++ b/gcc/config/arm/montavista-linux.h 2010-01-25 09:50:28.995687913 +0100
+@@ -0,0 +1,33 @@
++/* MontaVista GNU/Linux Configuration.
++ Copyright (C) 2009
++ Free Software Foundation, Inc.
++
++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/>. */
++
++/* Add -tarmv6 and -tthumb2 options for convenience in generating multilibs.
++*/
++#undef CC1_SPEC
++#define CC1_SPEC " \
++ %{tarmv6: -march=armv6 -mfloat-abi=softfp ; \
++ tthumb2: -mthumb -march=armv7-a -mfloat-abi=softfp ; \
++ : -march=armv5t}"
++
++/* The various C libraries each have their own subdirectory. */
++#undef SYSROOT_SUFFIX_SPEC
++#define SYSROOT_SUFFIX_SPEC \
++ "%{tarmv6:/armv6 ; \
++ tthumb2:/thumb2}"
+diff -Nur a/gcc/config/arm/neon-gen.ml b/gcc/config/arm/neon-gen.ml
+--- a/gcc/config/arm/neon-gen.ml 2009-04-10 01:23:07.000000000 +0200
++++ b/gcc/config/arm/neon-gen.ml 2010-01-25 09:50:28.995687913 +0100
+@@ -122,6 +122,7 @@
+ | T_uint16 | T_int16 -> T_intHI
+ | T_uint32 | T_int32 -> T_intSI
+ | T_uint64 | T_int64 -> T_intDI
++ | T_float32 -> T_floatSF
+ | T_poly8 -> T_intQI
+ | T_poly16 -> T_intHI
+ | T_arrayof (n, elt) -> T_arrayof (n, signed_ctype elt)
+@@ -320,7 +321,7 @@
+ typeinfo;
+ Format.print_newline ();
+ (* Extra types not in <stdint.h>. *)
+- Format.printf "typedef __builtin_neon_sf float32_t;\n";
++ Format.printf "typedef float float32_t;\n";
+ Format.printf "typedef __builtin_neon_poly8 poly8_t;\n";
+ Format.printf "typedef __builtin_neon_poly16 poly16_t;\n"
+
+@@ -399,7 +400,11 @@
+ "extern \"C\" {";
+ "#endif";
+ "";
++"#if defined (__vxworks) && defined (_WRS_KERNEL)";
++"#include <vxWorks.h>";
++"#else";
+ "#include <stdint.h>";
++"#endif";
+ ""];
+ deftypes ();
+ arrtypes ();
+diff -Nur a/gcc/config/arm/neon.md b/gcc/config/arm/neon.md
+--- a/gcc/config/arm/neon.md 2009-02-20 16:20:38.000000000 +0100
++++ b/gcc/config/arm/neon.md 2010-01-25 09:50:28.995687913 +0100
+@@ -159,7 +159,8 @@
+ (UNSPEC_VUZP1 201)
+ (UNSPEC_VUZP2 202)
+ (UNSPEC_VZIP1 203)
+- (UNSPEC_VZIP2 204)])
++ (UNSPEC_VZIP2 204)
++ (UNSPEC_MISALIGNED_ACCESS 205)])
+
+ ;; Double-width vector modes.
+ (define_mode_iterator VD [V8QI V4HI V2SI V2SF])
+@@ -459,7 +460,9 @@
+ "=w,Uv,w, w, ?r,?w,?r,?r, ?Us")
+ (match_operand:VD 1 "general_operand"
+ " w,w, Dn,Uvi, w, r, r, Usi,r"))]
+- "TARGET_NEON"
++ "TARGET_NEON
++ && (register_operand (operands[0], <MODE>mode)
++ || register_operand (operands[1], <MODE>mode))"
+ {
+ if (which_alternative == 2)
+ {
+@@ -481,7 +484,7 @@
+
+ /* FIXME: If the memory layout is changed in big-endian mode, output_move_vfp
+ below must be changed to output_move_neon (which will use the
+- element/structure loads/stores), and the constraint changed to 'Un' instead
++ element/structure loads/stores), and the constraint changed to 'Um' instead
+ of 'Uv'. */
+
+ switch (which_alternative)
+@@ -506,7 +509,9 @@
+ "=w,Un,w, w, ?r,?w,?r,?r, ?Us")
+ (match_operand:VQXMOV 1 "general_operand"
+ " w,w, Dn,Uni, w, r, r, Usi, r"))]
+- "TARGET_NEON"
++ "TARGET_NEON
++ && (register_operand (operands[0], <MODE>mode)
++ || register_operand (operands[1], <MODE>mode))"
+ {
+ if (which_alternative == 2)
+ {
+@@ -549,6 +554,11 @@
+ (match_operand:TI 1 "general_operand" ""))]
+ "TARGET_NEON"
+ {
++ if (can_create_pseudo_p ())
++ {
++ if (GET_CODE (operands[0]) != REG)
++ operands[1] = force_reg (TImode, operands[1]);
++ }
+ })
+
+ (define_expand "mov<mode>"
+@@ -556,12 +566,19 @@
+ (match_operand:VSTRUCT 1 "general_operand" ""))]
+ "TARGET_NEON"
+ {
++ if (can_create_pseudo_p ())
++ {
++ if (GET_CODE (operands[0]) != REG)
++ operands[1] = force_reg (<MODE>mode, operands[1]);
++ }
+ })
+
+ (define_insn "*neon_mov<mode>"
+ [(set (match_operand:VSTRUCT 0 "nonimmediate_operand" "=w,Ut,w")
+ (match_operand:VSTRUCT 1 "general_operand" " w,w, Ut"))]
+- "TARGET_NEON"
++ "TARGET_NEON
++ && (register_operand (operands[0], <MODE>mode)
++ || register_operand (operands[1], <MODE>mode))"
+ {
+ switch (which_alternative)
+ {
+@@ -658,6 +675,49 @@
+ neon_disambiguate_copy (operands, dest, src, 4);
+ })
+
++(define_expand "movmisalign<mode>"
++ [(set (match_operand:VDQX 0 "nonimmediate_operand" "")
++ (unspec:VDQX [(match_operand:VDQX 1 "general_operand" "")]
++ UNSPEC_MISALIGNED_ACCESS))]
++ "TARGET_NEON && !BYTES_BIG_ENDIAN"
++{
++ if (!s_register_operand (operands[0], <MODE>mode)
++ && !s_register_operand (operands[1], <MODE>mode))
++ FAIL;
++})
++
++(define_insn "*movmisalign<mode>_neon_store"
++ [(set (match_operand:VDX 0 "memory_operand" "=Um")
++ (unspec:VDX [(match_operand:VDX 1 "s_register_operand" " w")]
++ UNSPEC_MISALIGNED_ACCESS))]
++ "TARGET_NEON && !BYTES_BIG_ENDIAN"
++ "vst1.<V_sz_elem>\t{%P1}, %A0"
++ [(set_attr "neon_type" "neon_vst1_1_2_regs_vst2_2_regs")])
++
++(define_insn "*movmisalign<mode>_neon_load"
++ [(set (match_operand:VDX 0 "s_register_operand" "=w")
++ (unspec:VDX [(match_operand:VDX 1 "memory_operand" " Um")]
++ UNSPEC_MISALIGNED_ACCESS))]
++ "TARGET_NEON && !BYTES_BIG_ENDIAN"
++ "vld1.<V_sz_elem>\t{%P0}, %A1"
++ [(set_attr "neon_type" "neon_vld1_1_2_regs")])
++
++(define_insn "*movmisalign<mode>_neon_store"
++ [(set (match_operand:VQX 0 "memory_operand" "=Um")
++ (unspec:VQX [(match_operand:VQX 1 "s_register_operand" " w")]
++ UNSPEC_MISALIGNED_ACCESS))]
++ "TARGET_NEON && !BYTES_BIG_ENDIAN"
++ "vst1.<V_sz_elem>\t{%q1}, %A0"
++ [(set_attr "neon_type" "neon_vst1_1_2_regs_vst2_2_regs")])
++
++(define_insn "*movmisalign<mode>_neon_load"
++ [(set (match_operand:VQX 0 "s_register_operand" "=w")
++ (unspec:VQX [(match_operand:VQX 1 "general_operand" " Um")]
++ UNSPEC_MISALIGNED_ACCESS))]
++ "TARGET_NEON && !BYTES_BIG_ENDIAN"
++ "vld1.<V_sz_elem>\t{%q0}, %A1"
++ [(set_attr "neon_type" "neon_vld1_1_2_regs")])
++
+ (define_insn "vec_set<mode>_internal"
+ [(set (match_operand:VD 0 "s_register_operand" "=w")
+ (vec_merge:VD
+@@ -862,6 +922,50 @@
+ (const_string "neon_mul_qqq_8_16_32_ddd_32")))))]
+ )
+
++(define_insn "*mul<mode>3add<mode>_neon"
++ [(set (match_operand:VDQ 0 "s_register_operand" "=w")
++ (plus:VDQ (mult:VDQ (match_operand:VDQ 2 "s_register_operand" "w")
++ (match_operand:VDQ 3 "s_register_operand" "w"))
++ (match_operand:VDQ 1 "s_register_operand" "0")))]
++ "TARGET_NEON"
++ "vmla.<V_if_elem>\t%<V_reg>0, %<V_reg>2, %<V_reg>3"
++ [(set (attr "neon_type")
++ (if_then_else (ne (symbol_ref "<Is_float_mode>") (const_int 0))
++ (if_then_else (ne (symbol_ref "<Is_d_reg>") (const_int 0))
++ (const_string "neon_fp_vmla_ddd")
++ (const_string "neon_fp_vmla_qqq"))
++ (if_then_else (ne (symbol_ref "<Is_d_reg>") (const_int 0))
++ (if_then_else
++ (ne (symbol_ref "<Scalar_mul_8_16>") (const_int 0))
++ (const_string "neon_mla_ddd_8_16_qdd_16_8_long_32_16_long")
++ (const_string "neon_mla_ddd_32_qqd_16_ddd_32_scalar_qdd_64_32_long_scalar_qdd_64_32_long"))
++ (if_then_else (ne (symbol_ref "<Scalar_mul_8_16>") (const_int 0))
++ (const_string "neon_mla_qqq_8_16")
++ (const_string "neon_mla_qqq_32_qqd_32_scalar")))))]
++)
++
++(define_insn "*mul<mode>3neg<mode>add<mode>_neon"
++ [(set (match_operand:VDQ 0 "s_register_operand" "=w")
++ (minus:VDQ (match_operand:VDQ 1 "s_register_operand" "0")
++ (mult:VDQ (match_operand:VDQ 2 "s_register_operand" "w")
++ (match_operand:VDQ 3 "s_register_operand" "w"))))]
++ "TARGET_NEON"
++ "vmls.<V_if_elem>\t%<V_reg>0, %<V_reg>2, %<V_reg>3"
++ [(set (attr "neon_type")
++ (if_then_else (ne (symbol_ref "<Is_float_mode>") (const_int 0))
++ (if_then_else (ne (symbol_ref "<Is_d_reg>") (const_int 0))
++ (const_string "neon_fp_vmla_ddd")
++ (const_string "neon_fp_vmla_qqq"))
++ (if_then_else (ne (symbol_ref "<Is_d_reg>") (const_int 0))
++ (if_then_else
++ (ne (symbol_ref "<Scalar_mul_8_16>") (const_int 0))
++ (const_string "neon_mla_ddd_8_16_qdd_16_8_long_32_16_long")
++ (const_string "neon_mla_ddd_32_qqd_16_ddd_32_scalar_qdd_64_32_long_scalar_qdd_64_32_long"))
++ (if_then_else (ne (symbol_ref "<Scalar_mul_8_16>") (const_int 0))
++ (const_string "neon_mla_qqq_8_16")
++ (const_string "neon_mla_qqq_32_qqd_32_scalar")))))]
++)
++
+ (define_insn "ior<mode>3"
+ [(set (match_operand:VDQ 0 "s_register_operand" "=w,w")
+ (ior:VDQ (match_operand:VDQ 1 "s_register_operand" "w,0")
+@@ -3611,7 +3715,8 @@
+ UNSPEC_VSHLL_N))]
+ "TARGET_NEON"
+ {
+- neon_const_bounds (operands[2], 0, neon_element_bits (<MODE>mode));
++ /* The boundaries are: 0 < imm <= size. */
++ neon_const_bounds (operands[2], 0, neon_element_bits (<MODE>mode) + 1);
+ return "vshll.%T3%#<V_sz_elem>\t%q0, %P1, %2";
+ }
+ [(set_attr "neon_type" "neon_shift_1")]
+diff -Nur a/gcc/config/arm/neon.ml b/gcc/config/arm/neon.ml
+--- a/gcc/config/arm/neon.ml 2007-08-02 12:49:31.000000000 +0200
++++ b/gcc/config/arm/neon.ml 2010-01-25 09:50:28.995687913 +0100
+@@ -50,7 +50,7 @@
+ | T_ptrto of vectype | T_const of vectype
+ | T_void | T_intQI
+ | T_intHI | T_intSI
+- | T_intDI
++ | T_intDI | T_floatSF
+
+ (* The meanings of the following are:
+ TImode : "Tetra", two registers (four words).
+@@ -1693,6 +1693,7 @@
+ | T_intHI -> "__builtin_neon_hi"
+ | T_intSI -> "__builtin_neon_si"
+ | T_intDI -> "__builtin_neon_di"
++ | T_floatSF -> "__builtin_neon_sf"
+ | T_arrayof (num, base) ->
+ let basename = name (fun x -> x) base in
+ affix (Printf.sprintf "%sx%d" basename num)
+diff -Nur a/gcc/config/arm/neon-testgen.ml b/gcc/config/arm/neon-testgen.ml
+--- a/gcc/config/arm/neon-testgen.ml 2007-08-02 12:49:31.000000000 +0200
++++ b/gcc/config/arm/neon-testgen.ml 2010-01-25 09:50:28.995687913 +0100
+@@ -51,8 +51,8 @@
+ Printf.fprintf chan "/* This file was autogenerated by neon-testgen. */\n\n";
+ Printf.fprintf chan "/* { dg-do assemble } */\n";
+ Printf.fprintf chan "/* { dg-require-effective-target arm_neon_ok } */\n";
+- Printf.fprintf chan
+- "/* { dg-options \"-save-temps -O0 -mfpu=neon -mfloat-abi=softfp\" } */\n";
++ Printf.fprintf chan "/* { dg-options \"-save-temps -O0\" } */\n";
++ Printf.fprintf chan "/* { dg-add-options arm_neon } */\n";
+ Printf.fprintf chan "\n#include \"arm_neon.h\"\n\n";
+ Printf.fprintf chan "void test_%s (void)\n{\n" test_name
+
+diff -Nur a/gcc/config/arm/netbsd-elf.h b/gcc/config/arm/netbsd-elf.h
+--- a/gcc/config/arm/netbsd-elf.h 2007-08-02 12:49:31.000000000 +0200
++++ b/gcc/config/arm/netbsd-elf.h 2010-01-25 09:50:28.995687913 +0100
+@@ -153,5 +153,5 @@
+ while (0)
+
+ #undef FPUTYPE_DEFAULT
+-#define FPUTYPE_DEFAULT FPUTYPE_VFP
++#define FPUTYPE_DEFAULT "vfp"
+
+diff -Nur a/gcc/config/arm/nocrt0.h b/gcc/config/arm/nocrt0.h
+--- a/gcc/config/arm/nocrt0.h 1970-01-01 01:00:00.000000000 +0100
++++ b/gcc/config/arm/nocrt0.h 2010-01-25 09:50:28.995687913 +0100
+@@ -0,0 +1,25 @@
++/* Definitions for generic libgloss based cofigs where crt0 is supplied by
++ the linker script.
++ Copyright (C) 2006 Free Software Foundation, Inc.
++
++ 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/>. */
++
++#undef STARTFILE_SPEC
++#define STARTFILE_SPEC " crti%O%s crtbegin%O%s"
++
++#undef LIB_SPEC
++#define LIB_SPEC "-lc"
+diff -Nur a/gcc/config/arm/predicates.md b/gcc/config/arm/predicates.md
+--- a/gcc/config/arm/predicates.md 2009-02-20 16:20:38.000000000 +0100
++++ b/gcc/config/arm/predicates.md 2010-01-25 09:50:28.995687913 +0100
+@@ -73,6 +73,10 @@
+ || REGNO_REG_CLASS (REGNO (op)) == FPA_REGS));
+ })
+
++(define_special_predicate "subreg_lowpart_operator"
++ (and (match_code "subreg")
++ (match_test "subreg_lowpart_p (op)")))
++
+ ;; Reg, subreg(reg) or const_int.
+ (define_predicate "reg_or_int_operand"
+ (ior (match_code "const_int")
+@@ -168,6 +172,11 @@
+ (and (match_code "plus,minus,ior,xor,and")
+ (match_test "mode == GET_MODE (op)")))
+
++;; True for plus/minus operators
++(define_special_predicate "plusminus_operator"
++ (and (match_code "plus,minus")
++ (match_test "mode == GET_MODE (op)")))
++
+ ;; True for logical binary operators.
+ (define_special_predicate "logical_binary_operator"
+ (and (match_code "ior,xor,and")
+@@ -295,6 +304,9 @@
+ HOST_WIDE_INT i = 1, base = 0;
+ rtx elt;
+
++ if (low_irq_latency)
++ return false;
++
+ if (count <= 1
+ || GET_CODE (XVECEXP (op, 0, 0)) != SET)
+ return false;
+@@ -352,6 +364,9 @@
+ HOST_WIDE_INT i = 1, base = 0;
+ rtx elt;
+
++ if (low_irq_latency)
++ return false;
++
+ if (count <= 1
+ || GET_CODE (XVECEXP (op, 0, 0)) != SET)
+ return false;
+diff -Nur a/gcc/config/arm/sfp-machine.h b/gcc/config/arm/sfp-machine.h
+--- a/gcc/config/arm/sfp-machine.h 2008-03-03 15:30:48.000000000 +0100
++++ b/gcc/config/arm/sfp-machine.h 2010-01-25 09:50:28.995687913 +0100
+@@ -14,9 +14,11 @@
+ #define _FP_DIV_MEAT_D(R,X,Y) _FP_DIV_MEAT_2_udiv(D,R,X,Y)
+ #define _FP_DIV_MEAT_Q(R,X,Y) _FP_DIV_MEAT_4_udiv(Q,R,X,Y)
+
++#define _FP_NANFRAC_H ((_FP_QNANBIT_H << 1) - 1)
+ #define _FP_NANFRAC_S ((_FP_QNANBIT_S << 1) - 1)
+ #define _FP_NANFRAC_D ((_FP_QNANBIT_D << 1) - 1), -1
+ #define _FP_NANFRAC_Q ((_FP_QNANBIT_Q << 1) - 1), -1, -1, -1
++#define _FP_NANSIGN_H 0
+ #define _FP_NANSIGN_S 0
+ #define _FP_NANSIGN_D 0
+ #define _FP_NANSIGN_Q 0
+@@ -92,5 +94,7 @@
+ #define __fixdfdi __aeabi_d2lz
+ #define __fixunsdfdi __aeabi_d2ulz
+ #define __floatdidf __aeabi_l2d
++#define __extendhfsf2 __gnu_h2f_ieee
++#define __truncsfhf2 __gnu_f2h_ieee
+
+ #endif /* __ARM_EABI__ */
+diff -Nur a/gcc/config/arm/t-arm b/gcc/config/arm/t-arm
+--- a/gcc/config/arm/t-arm 2008-03-27 20:20:18.000000000 +0100
++++ b/gcc/config/arm/t-arm 2010-01-25 09:50:28.995687913 +0100
+@@ -13,7 +13,9 @@
+ $(srcdir)/config/arm/iwmmxt.md \
+ $(srcdir)/config/arm/vfp.md \
+ $(srcdir)/config/arm/neon.md \
+- $(srcdir)/config/arm/thumb2.md
++ $(srcdir)/config/arm/thumb2.md \
++ $(srcdir)/config/arm/marvell-f.md \
++ $(srcdir)/config/arm/hwdiv.md
+
+ s-config s-conditions s-flags s-codes s-constants s-emit s-recog s-preds \
+ s-opinit s-extract s-peep s-attr s-attrtab s-output: $(MD_INCLUDES)
+diff -Nur a/gcc/config/arm/t-arm-elf b/gcc/config/arm/t-arm-elf
+--- a/gcc/config/arm/t-arm-elf 2008-06-12 19:29:47.000000000 +0200
++++ b/gcc/config/arm/t-arm-elf 2010-01-25 09:50:28.995687913 +0100
+@@ -24,10 +24,18 @@
+ #MULTILIB_MATCHES += march?armv7=march?armv7-a
+ #MULTILIB_MATCHES += march?armv7=march?armv7-r
+ #MULTILIB_MATCHES += march?armv7=march?armv7-m
++#MULTILIB_MATCHES += march?armv7=march?armv7e-m
+ #MULTILIB_MATCHES += march?armv7=mcpu?cortex-a8
+ #MULTILIB_MATCHES += march?armv7=mcpu?cortex-r4
+ #MULTILIB_MATCHES += march?armv7=mcpu?cortex-m3
+
++# Not quite true. We can support hard-vfp calling in Thumb2, but how do we
++# express that here? Also, we really need architecture v5e or later
++# (mcrr etc).
++MULTILIB_OPTIONS += mfloat-abi=hard
++MULTILIB_DIRNAMES += fpu
++MULTILIB_EXCEPTIONS += *mthumb/*mfloat-abi=hard*
++
+ # MULTILIB_OPTIONS += mcpu=ep9312
+ # MULTILIB_DIRNAMES += ep9312
+ # MULTILIB_EXCEPTIONS += *mthumb/*mcpu=ep9312*
+diff -Nur a/gcc/config/arm/t-asa b/gcc/config/arm/t-asa
+--- a/gcc/config/arm/t-asa 1970-01-01 01:00:00.000000000 +0100
++++ b/gcc/config/arm/t-asa 2010-01-25 09:50:28.995687913 +0100
+@@ -0,0 +1,45 @@
++# Overrides for ASA
++
++# Here is the expected output from xgcc -print-multi-lib.
++#
++# .;@fno-omit-frame-pointer@mapcs-frame
++# armv4t;@march=armv4t@fno-omit-frame-pointer@mapcs-frame
++# armv6;@march=armv6@fno-omit-frame-pointer@mapcs-frame
++# armv7a;@march=armv7-a@fno-omit-frame-pointer@mapcs-frame
++# armv6f;@march=armv6@mfloat-abi=softfp@fno-omit-frame-pointer@mapcs-frame
++# armv7af;@march=armv7-a@mfpu=neon@mfloat-abi=softfp@fno-omit-frame-pointer@mapcs-frame
++# thumb2;@mthumb@march=armv7-a@fno-omit-frame-pointer@mapcs-frame
++# thumb2f;@mthumb@march=armv7-a@mfpu=neon@mfloat-abi=softfp@fno-omit-frame-pointer@mapcs-frame
++
++MULTILIB_OPTIONS = mthumb march=armv4t/march=armv6/march=armv7-a mfpu=neon mfloat-abi=softfp
++MULTILIB_DIRNAMES = thumb v4t v6 v7a neon softfp
++MULTILIB_MATCHES =
++
++MULTILIB_EXTRA_OPTS = fno-omit-frame-pointer mapcs-frame
++
++MULTILIB_EXCEPTIONS = mthumb
++MULTILIB_EXCEPTIONS += mfpu=neon*
++MULTILIB_EXCEPTIONS += mfloat-abi=softfp
++MULTILIB_EXCEPTIONS += *march=armv4t*/*mfpu=neon*
++MULTILIB_EXCEPTIONS += *march=armv4t*/*mfloat-abi=softfp*
++MULTILIB_EXCEPTIONS += march=armv6/*mfpu=neon*
++MULTILIB_EXCEPTIONS += mthumb/mfpu=neon
++MULTILIB_EXCEPTIONS += mthumb/mfloat-abi=softfp
++MULTILIB_EXCEPTIONS += mthumb/mfpu=neon*
++MULTILIB_EXCEPTIONS += mthumb/march=armv6/mfpu=neon*
++
++MULTILIB_OSDIRNAMES = march.armv4t=!armv4t
++MULTILIB_OSDIRNAMES += march.armv6=!armv6
++MULTILIB_OSDIRNAMES += march.armv6/mfloat-abi.softfp=!armv6f
++MULTILIB_OSDIRNAMES += march.armv7-a=!armv7a
++MULTILIB_OSDIRNAMES += march.armv7-a/mfpu.neon/mfloat-abi.softfp=!armv7af
++MULTILIB_OSDIRNAMES += mthumb/march.armv7-a=!thumb2
++MULTILIB_OSDIRNAMES += mthumb/march.armv7-a/mfpu.neon/mfloat-abi.softfp=!thumb2f
++
++MULTILIB_ALIASES = march?armv4t=mthumb/march?armv4t
++MULTILIB_ALIASES += march?armv6=mthumb/march?armv6
++MULTILIB_ALIASES += march?armv6/mfloat-abi?softfp=mthumb/march?armv6/mfloat-abi?softfp
++MULTILIB_ALIASES += march?armv7-a/mfpu?neon/mfloat-abi?softfp=march?armv7-a/mfpu?neon
++MULTILIB_ALIASES += march?armv7-a/mfpu?neon/mfloat-abi?softfp=march?armv7-a/mfloat-abi?softfp
++MULTILIB_ALIASES += mthumb/march?armv7-a/mfpu?neon/mfloat-abi?softfp=mthumb/march?armv7-a/mfpu?neon
++MULTILIB_ALIASES += mthumb/march?armv7-a/mfpu?neon/mfloat-abi?softfp=mthumb/march?armv7-a/mfloat-abi?softfp
+diff -Nur a/gcc/config/arm/t-bpabi b/gcc/config/arm/t-bpabi
+--- a/gcc/config/arm/t-bpabi 2005-11-04 15:51:20.000000000 +0100
++++ b/gcc/config/arm/t-bpabi 2010-01-25 09:50:28.995687913 +0100
+@@ -1,10 +1,13 @@
+ # Add the bpabi.S functions.
+-LIB1ASMFUNCS += _aeabi_lcmp _aeabi_ulcmp _aeabi_ldivmod _aeabi_uldivmod
++LIB1ASMFUNCS += _aeabi_lcmp _aeabi_ulcmp _aeabi_ldivmod _aeabi_uldivmod \
++ _aeabi_idiv0 _aeabi_ldiv0
+
+ # Add the BPABI C functions.
+ LIB2FUNCS_EXTRA = $(srcdir)/config/arm/bpabi.c \
+ $(srcdir)/config/arm/unaligned-funcs.c
+
++LIB2FUNCS_STATIC_EXTRA = $(srcdir)/config/arm/fp16.c
++
+ UNWIND_H = $(srcdir)/config/arm/unwind-arm.h
+ LIB2ADDEH = $(srcdir)/config/arm/unwind-arm.c \
+ $(srcdir)/config/arm/libunwind.S \
+diff -Nur a/gcc/config/arm/t-cs-eabi b/gcc/config/arm/t-cs-eabi
+--- a/gcc/config/arm/t-cs-eabi 1970-01-01 01:00:00.000000000 +0100
++++ b/gcc/config/arm/t-cs-eabi 2010-01-25 09:50:28.995687913 +0100
+@@ -0,0 +1,198 @@
++# Multilibs for SourceryG++ arm-none-eabi
++
++MULTILIB_OPTIONS = mthumb
++MULTILIB_DIRNAMES = t
++MULTILIB_EXCEPTIONS =
++MULTILIB_MATCHES =
++MULTILIB_ALIASES =
++
++MULTILIB_OPTIONS += march=armv7/march=armv7-a/march=armv5te/march=armv6-m
++MULTILIB_DIRNAMES += v7 v7a v5te v6m
++MULTILIB_MATCHES += march?armv7-a=march?armv7a
++MULTILIB_MATCHES += march?armv7=march?armv7r
++MULTILIB_MATCHES += march?armv7=march?armv7m
++MULTILIB_MATCHES += march?armv7=march?armv7-r
++MULTILIB_MATCHES += march?armv7=march?armv7-m
++MULTILIB_MATCHES += march?armv7=march?armv7e-m
++MULTILIB_MATCHES += march?armv7-a=mcpu?cortex-a9
++MULTILIB_MATCHES += march?armv7-a=mcpu?cortex-a8
++MULTILIB_MATCHES += march?armv7-a=mcpu?cortex-a5
++MULTILIB_MATCHES += march?armv7=mcpu?cortex-r4
++MULTILIB_MATCHES += march?armv7=mcpu?cortex-r4f
++MULTILIB_MATCHES += march?armv7=mcpu?cortex-m3
++MULTILIB_MATCHES += march?armv6-m=mcpu?cortex-m1
++MULTILIB_MATCHES += march?armv6-m=mcpu?cortex-m0
++MULTILIB_MATCHES += march?armv5te=march?armv6
++MULTILIB_MATCHES += march?armv5te=march?armv6j
++MULTILIB_MATCHES += march?armv5te=march?armv6k
++MULTILIB_MATCHES += march?armv5te=march?armv6z
++MULTILIB_MATCHES += march?armv5te=march?armv6zk
++MULTILIB_MATCHES += march?armv5te=march?armv6t2
++MULTILIB_MATCHES += march?armv5te=march?iwmmxt
++MULTILIB_MATCHES += march?armv5te=march?iwmmxt2
++MULTILIB_MATCHES += march?armv5te=mcpu?arm9e
++MULTILIB_MATCHES += march?armv5te=mcpu?arm946e-s
++MULTILIB_MATCHES += march?armv5te=mcpu?arm966e-s
++MULTILIB_MATCHES += march?armv5te=mcpu?arm968e-s
++MULTILIB_MATCHES += march?armv5te=mcpu?arm10e
++MULTILIB_MATCHES += march?armv5te=mcpu?arm1020e
++MULTILIB_MATCHES += march?armv5te=mcpu?arm1022e
++MULTILIB_MATCHES += march?armv5te=mcpu?xscale
++MULTILIB_MATCHES += march?armv5te=mcpu?iwmmxt
++MULTILIB_MATCHES += march?armv5te=mcpu?iwmmxt2
++MULTILIB_MATCHES += march?armv5te=mcpu?marvell-f
++MULTILIB_MATCHES += march?armv5te=mcpu?arm926ej-s
++MULTILIB_MATCHES += march?armv5te=mcpu?arm1026ej-s
++MULTILIB_MATCHES += march?armv5te=mcpu?arm1136j-s
++MULTILIB_MATCHES += march?armv5te=mcpu?arm1136jf-s
++MULTILIB_MATCHES += march?armv5te=mcpu?arm1176jz-s
++MULTILIB_MATCHES += march?armv5te=mcpu?arm1176jzf-s
++MULTILIB_MATCHES += march?armv5te=mcpu?mpcorenovfp
++MULTILIB_MATCHES += march?armv5te=mcpu?mpcore
++MULTILIB_MATCHES += march?armv5te=mcpu?arm1156t2-s
++
++MULTILIB_OPTIONS += mfloat-abi=softfp/mfloat-abi=hard
++MULTILIB_DIRNAMES += softfp hard
++MULTILIB_MATCHES += mfloat-abi?hard=mhard-float
++
++MULTILIB_OPTIONS += mfpu=neon
++MULTILIB_DIRNAMES += neon
++MULTILIB_EXCEPTIONS += mfpu=neon
++MULTILIB_MATCHES += mfpu?neon=mfpu?neon-fp16
++MULTILIB_MATCHES += mfpu?neon=mfpu?neon-vfpv4
++
++MULTILIB_ALIASES += mthumb=mthumb/mfpu?neon
++MULTILIB_ALIASES += mthumb=mthumb/march?armv5te/mfpu?neon
++MULTILIB_ALIASES += mbig-endian=mthumb/mfpu?neon/mbig-endian
++#MULTILIB_ALIASES += mfloat-abi?softfp=mthumb/mfloat-abi?softfp/mfpu?neon
++#MULTILIB_ALIASES += mfloat-abi?softfp=mfloat-abi?softfp/mfpu?neon
++#MULTILIB_ALIASES += mfloat-abi?softfp/mbig-endian=mfloat-abi?softfp/mfpu?neon/mbig-endian
++#MULTILIB_ALIASES += mfloat-abi?softfp/mbig-endian=mthumb/mfloat-abi?softfp/mfpu?neon/mbig-endian
++MULTILIB_ALIASES += mthumb/march?armv7/mfix-cortex-m3-ldrd=mthumb/march?armv7-a/mfpu?neon
++MULTILIB_ALIASES += mthumb/march?armv7/mbig-endian=mthumb/march?armv7-a/mfpu?neon/mbig-endian
++MULTILIB_ALIASES += march?armv7-a/mfloat-abi?softfp/mfpu?neon=mthumb/march?armv7-a/mfloat-abi?softfp/mfpu?neon
++MULTILIB_ALIASES += march?armv7-a/mfloat-abi?hard/mfpu?neon=mthumb/march?armv7-a/mfloat-abi?hard/mfpu?neon
++
++MULTILIB_OPTIONS += mbig-endian
++MULTILIB_DIRNAMES += be
++MULTILIB_ALIASES += mbig-endian=mfpu?neon/mbig-endian
++
++# ARMv6-M does not have ARM mode.
++MULTILIB_EXCEPTIONS += march=armv6-m
++
++# Some ARMv7 variants have ARM mode. Use the ARM libraries.
++MULTILIB_EXCEPTIONS += march=armv7 march=armv7/*
++MULTILIB_ALIASES += mbig-endian=march?armv7/mbig-endian
++MULTILIB_ALIASES += march?armv5te/mfloat-abi?softfp=march?armv7/mfloat-abi?softfp
++MULTILIB_ALIASES += march?armv5te/mfloat-abi?softfp=march?armv7/mfloat-abi?softfp/mfpu?neon
++MULTILIB_ALIASES += march?armv5te/mfloat-abi?softfp/mbig-endian=march?armv7/mfloat-abi?softfp/mbig-endian
++MULTILIB_ALIASES += march?armv5te/mfloat-abi?softfp/mbig-endian=march?armv7/mfloat-abi?softfp/mfpu?neon/mbig-endian
++MULTILIB_ALIASES += mbig-endian=march?armv7/mfpu?neon/mbig-endian
++MULTILIB_ALIASES += mthumb/march?armv7/mfix-cortex-m3-ldrd=mthumb/march?armv7/mfloat-abi?softfp/mfpu?neon
++MULTILIB_ALIASES += mthumb/march?armv7/mfix-cortex-m3-ldrd=mthumb/march?armv7/mfpu?neon
++MULTILIB_ALIASES += mthumb/march?armv7/mbig-endian=mthumb/march?armv7/mfpu?neon/mbig-endian
++MULTILIB_ALIASES += mthumb/march?armv7/mbig-endian=mthumb/march?armv7/mfloat-abi?softfp/mfpu?neon/mbig-endian
++
++# ARMv7-A is specially useful used with VFPv3 (enabled by NEON). Rest of the cases behaves as ARMv7.
++MULTILIB_ALIASES += mthumb/march?armv7/mfix-cortex-m3-ldrd=mthumb/march?armv7-a
++MULTILIB_ALIASES += mbig-endian=march?armv7-a/mbig-endian
++MULTILIB_ALIASES += march?armv5te/mfloat-abi?softfp/mbig-endian=march?armv7-a/mfloat-abi?softfp/mbig-endian
++MULTILIB_ALIASES += march?armv5te/mfloat-abi?softfp/mbig-endian=march?armv7-a/mfloat-abi?softfp/mfpu?neon/mbig-endian
++MULTILIB_ALIASES += mthumb/march?armv7/mfix-cortex-m3-ldrd=mthumb/march?armv7-a/mfloat-abi?softfp
++MULTILIB_ALIASES += mthumb/march?armv7/mbig-endian=mthumb/march?armv7-a/mbig-endian
++MULTILIB_ALIASES += mthumb/march?armv7/mbig-endian=mthumb/march?armv7-a/mfloat-abi?softfp/mbig-endian
++MULTILIB_ALIASES += mthumb/march?armv7/mfix-cortex-m3-ldrd=mthumb/march?armv7/mfloat-abi?softfp
++MULTILIB_ALIASES += march?armv5te=march?armv7-a
++MULTILIB_ALIASES += march?armv5te/mfloat-abi?softfp=march?armv7-a/mfloat-abi?softfp
++MULTILIB_ALIASES += march?armv5te=march?armv7-a/mfpu?neon
++MULTILIB_ALIASES += mbig-endian=march?armv7-a/mfpu?neon/mbig-endian
++MULTILIB_ALIASES += mthumb/march?armv7/mbig-endian=mthumb/march?armv7-a/mfloat-abi?softfp/mfpu?neon/mbig-endian
++
++# ARMv5T thumb uses the ARMv5T ARM libraries (with or without VFP).
++MULTILIB_ALIASES += mthumb=mthumb/march?armv5te
++MULTILIB_ALIASES += march?armv5te/mfloat-abi?softfp=mthumb/march?armv5te/mfloat-abi?softfp
++MULTILIB_ALIASES += march?armv5te/mfloat-abi?softfp=march?armv5te/mfloat-abi?softfp/mfpu?neon
++MULTILIB_ALIASES += march?armv5te/mfloat-abi?softfp=mthumb/march?armv5te/mfloat-abi?softfp/mfpu?neon
++MULTILIB_ALIASES += march?armv5te=march?armv5te/mfpu?neon
++MULTILIB_ALIASES += mbig-endian=march?armv5te/mfpu?neon/mbig-endian
++MULTILIB_ALIASES += march?armv5te/mfloat-abi?softfp/mbig-endian=march?armv5te/mfloat-abi?softfp/mfpu?neon/mbig-endian
++MULTILIB_ALIASES += mbig-endian=mthumb/march?armv5te/mfpu?neon/mbig-endian
++MULTILIB_ALIASES += march?armv5te/mfloat-abi?softfp/mbig-endian=mthumb/march?armv5te/mfloat-abi?softfp/mfpu?neon/mbig-endian
++
++# ARMv6-M and VFP are incompatible.
++# FIXME: The compiler should probably error.
++MULTILIB_EXCEPTIONS += *march=armv6-m/mfloat-abi=softfp
++MULTILIB_ALIASES += mthumb/march?armv6-m=mthumb/march?armv6-m/mfpu?neon
++MULTILIB_EXCEPTIONS += march=armv6-m*mfpu=neon
++MULTILIB_EXCEPTIONS += mthumb/march=armv6-m/mfloat-abi=softfp/mfpu=neon
++
++# ARMv4t VFP isn't really supported, so use the soft-float libraries.
++MULTILIB_EXCEPTIONS += mfloat-abi?softfp
++MULTILIB_EXCEPTIONS += mfloat-abi?softfp/mfpu?neon
++MULTILIB_ALIASES += mthumb=mthumb/mfloat-abi?softfp
++MULTILIB_ALIASES += mthumb=mthumb/mfloat-abi?softfp/mfpu?neon
++
++MULTILIB_ALIASES += mbig-endian=mfloat-abi?softfp/mbig-endian
++MULTILIB_ALIASES += mbig-endian=mfloat-abi?softfp/mfpu?neon/mbig-endian
++MULTILIB_ALIASES += mbig-endian=mthumb/mfloat-abi?softfp/mbig-endian
++MULTILIB_ALIASES += mbig-endian=mthumb/mfloat-abi?softfp/mfpu?neon/mbig-endian
++
++# We don't have a big-endian ARMv6-M compatible multilibs.
++MULTILIB_EXCEPTIONS += *march=armv6-m*mbig-endian
++
++# Use the generic libraries for big-endian ARMv5T
++MULTILIB_ALIASES += mbig-endian=march?armv5te/mbig-endian
++MULTILIB_ALIASES += mbig-endian=mfloat-abi?softfp/mbig-endian
++MULTILIB_ALIASES += mbig-endian=mthumb/march?armv5te/mbig-endian
++MULTILIB_ALIASES += march?armv5te/mfloat-abi?softfp/mbig-endian=mthumb/march?armv5te/mfloat-abi?softfp/mbig-endian
++
++# Use ARM libraries for big-endian Thumb.
++MULTILIB_ALIASES += mbig-endian=mthumb/mbig-endian
++
++# Don't bother with big-endian Thumb-2 VFP. Use the soft-float libraries
++# for now.
++MULTILIB_ALIASES += mthumb/march?armv7/mbig-endian=mthumb/march?armv7/mfloat-abi?softfp/mbig-endian
++
++# The only -mfloat-abi=hard libraries provided are for little-endian
++# v7-A NEON.
++MULTILIB_EXCEPTIONS += mfloat-abi=hard*
++MULTILIB_EXCEPTIONS += *march=armv5te*mfloat-abi=hard*
++MULTILIB_EXCEPTIONS += *march=armv7/*mfloat-abi=hard*
++MULTILIB_EXCEPTIONS += *march=armv6-m*mfloat-abi=hard*
++MULTILIB_EXCEPTIONS += mthumb/mfloat-abi=hard*
++MULTILIB_EXCEPTIONS += *mfloat-abi=hard*mbig-endian
++MULTILIB_EXCEPTIONS += *mfloat-abi=hard
++
++# FIXME: We need a sane way of doing this.
++# This isn't really a multilib, it's a hack to add an extra option
++# to the v7-m multilib.
++MULTILIB_OPTIONS += mfix-cortex-m3-ldrd
++MULTILIB_DIRNAMES += broken_ldrd
++
++MULTILIB_EXCEPTIONS += mfix-cortex-m3-ldrd
++MULTILIB_EXCEPTIONS += mthumb/mfix-cortex-m3-ldrd
++MULTILIB_EXCEPTIONS += *march=armv6-m*mfix-cortex-m3-ldrd
++MULTILIB_EXCEPTIONS += *march=armv7-a*mfix-cortex-m3-ldrd
++MULTILIB_EXCEPTIONS += *mcpu=*mfix-cortex-m3-ldrd
++MULTILIB_EXCEPTIONS += *mbig-endian*mfix-cortex-m3-ldrd
++MULTILIB_EXCEPTIONS += *mfloat-abi=softfp*mfix-cortex-m3-ldrd
++MULTILIB_EXCEPTIONS += *march=armv5te*mfix-cortex-m3-ldrd
++MULTILIB_EXCEPTIONS += *mfpu=neon*mfix-cortex-m3-ldrd
++
++MULTILIB_ALIASES += mthumb/march?armv7/mfix-cortex-m3-ldrd=mthumb/march?armv7
++MULTILIB_ALIASES += mthumb/march?armv7/mfix-cortex-m3-ldrd=mthumb/march?armv7-a/mfix-cortex-m3-ldrd
++MULTILIB_ALIASES += mthumb/march?armv7/mfix-cortex-m3-ldrd=mthumb/march?armv7/mfpu?neon/mfix-cortex-m3-ldrd
++MULTILIB_ALIASES += mthumb/march?armv7/mfix-cortex-m3-ldrd=mthumb/march?armv7-a/mfpu?neon/mfix-cortex-m3-ldrd
++
++# As of at least 4.2, gcc passes the wrong -L options if some multilibs are
++# omitted from MULTILIB_OSDIRNAMES
++MULTILIB_OSDIRNAMES = mthumb=!thumb
++MULTILIB_OSDIRNAMES += mbig-endian=!be
++MULTILIB_OSDIRNAMES += march.armv5te=!armv5te
++MULTILIB_OSDIRNAMES += march.armv5te/mfloat-abi.softfp=!vfp
++MULTILIB_OSDIRNAMES += march.armv5te/mfloat-abi.softfp/mbig-endian=!vfp-be
++MULTILIB_OSDIRNAMES += mthumb/march.armv7/mfix-cortex-m3-ldrd=!thumb2
++MULTILIB_OSDIRNAMES += march.armv7-a/mfloat-abi.softfp/mfpu.neon=!armv7-a-neon
++MULTILIB_OSDIRNAMES += march.armv7-a/mfloat-abi.hard/mfpu.neon=!armv7-a-hard
++MULTILIB_OSDIRNAMES += mthumb/march.armv7/mbig-endian=!thumb2-be
++MULTILIB_OSDIRNAMES += mthumb/march.armv6-m=!armv6-m
+diff -Nur a/gcc/config/arm/t-cs-eabi-lite b/gcc/config/arm/t-cs-eabi-lite
+--- a/gcc/config/arm/t-cs-eabi-lite 1970-01-01 01:00:00.000000000 +0100
++++ b/gcc/config/arm/t-cs-eabi-lite 2010-01-25 09:50:28.995687913 +0100
+@@ -0,0 +1,47 @@
++# We build 4 multilibs:
++# ./ (default)
++# thumb/ -mthumb
++# thumb2/ -mthumb -march=armv7
++# armv6-m/ -mthumb -march=armv6-m
++
++MULTILIB_OPTIONS = mthumb
++MULTILIB_DIRNAMES = thumb
++MULTILIB_EXCEPTIONS =
++MULTILIB_MATCHES =
++MULTILIB_ALIASES =
++
++MULTILIB_OPTIONS += march=armv7/march=armv6-m
++MULTILIB_DIRNAMES += v7 v6-m
++MULTILIB_EXCEPTIONS += march=armv7*
++MULTILIB_MATCHES += march?armv7=march?armv7-a
++MULTILIB_MATCHES += march?armv7=march?armv7-r
++MULTILIB_MATCHES += march?armv7=march?armv7-m
++MULTILIB_MATCHES += march?armv7=march?armv7e-m
++MULTILIB_MATCHES += march?armv7=mcpu?cortex-a9
++MULTILIB_MATCHES += march?armv7=mcpu?cortex-a8
++MULTILIB_MATCHES += march?armv7=mcpu?cortex-a5
++MULTILIB_MATCHES += march?armv7=mcpu?cortex-r4
++MULTILIB_MATCHES += march?armv7=mcpu?cortex-r4f
++MULTILIB_MATCHES += march?armv7=mcpu?cortex-m3
++
++MULTILIB_EXCEPTIONS += march=armv6-m
++MULTILIB_MATCHES += march?armv6-m=mcpu?cortex-m1
++MULTILIB_MATCHES += march?armv6-m=mcpu?cortex-m0
++
++# FIXME: We need a sane way of doing this.
++# This isn't really a multilib, it's a hack to add an extra option
++# to the v7-m multilib.
++MULTILIB_OPTIONS += mfix-cortex-m3-ldrd
++MULTILIB_DIRNAMES += broken_ldrd
++
++MULTILIB_EXCEPTIONS += mfix-cortex-m3-ldrd
++MULTILIB_EXCEPTIONS += mthumb/mfix-cortex-m3-ldrd
++MULTILIB_EXCEPTIONS += *march=armv6-m*mfix-cortex-m3-ldrd
++
++MULTILIB_ALIASES += mthumb/march?armv7/mfix-cortex-m3-ldrd=mthumb/march?armv7
++
++# As of at least 4.2, gcc passes the wrong -L options if some multilibs are
++# omitted from MULTILIB_OSDIRNAMES
++MULTILIB_OSDIRNAMES = mthumb=!thumb
++MULTILIB_OSDIRNAMES += mthumb/march.armv7/mfix-cortex-m3-ldrd=!thumb2
++MULTILIB_OSDIRNAMES += mthumb/march.armv6-m=!armv6-m
+diff -Nur a/gcc/config/arm/t-cs-linux b/gcc/config/arm/t-cs-linux
+--- a/gcc/config/arm/t-cs-linux 1970-01-01 01:00:00.000000000 +0100
++++ b/gcc/config/arm/t-cs-linux 2010-01-25 09:50:28.995687913 +0100
+@@ -0,0 +1,112 @@
++# Multilibs for SourceryG++ arm-none-linux-gnueabi
++
++MULTILIB_OPTIONS = mthumb
++MULTILIB_DIRNAMES = t
++MULTILIB_EXCEPTIONS =
++MULTILIB_MATCHES =
++MULTILIB_ALIASES =
++
++MULTILIB_OPTIONS += march=armv4t/march=armv7-a
++MULTILIB_DIRNAMES += v4t v7a
++
++MULTILIB_MATCHES += march?armv7-a=march?armv7a
++MULTILIB_MATCHES += march?armv7-a=mcpu?cortex-a9
++MULTILIB_MATCHES += march?armv7-a=mcpu?cortex-a8
++MULTILIB_MATCHES += march?armv7-a=mcpu?cortex-a5
++MULTILIB_MATCHES += march?armv4t=march?ep9312
++MULTILIB_MATCHES += march?armv4t=mcpu?arm7tdmi
++MULTILIB_MATCHES += march?armv4t=mcpu?arm7tdmi-s
++MULTILIB_MATCHES += march?armv4t=mcpu?arm710t
++MULTILIB_MATCHES += march?armv4t=mcpu?arm720t
++MULTILIB_MATCHES += march?armv4t=mcpu?arm740t
++MULTILIB_MATCHES += march?armv4t=mcpu?arm9
++MULTILIB_MATCHES += march?armv4t=mcpu?arm9tdmi
++MULTILIB_MATCHES += march?armv4t=mcpu?arm920
++MULTILIB_MATCHES += march?armv4t=mcpu?arm920t
++MULTILIB_MATCHES += march?armv4t=mcpu?arm922t
++MULTILIB_MATCHES += march?armv4t=mcpu?arm940t
++MULTILIB_MATCHES += march?armv4t=mcpu?ep9312
++MULTILIB_MATCHES += march?armv4t=march?armv5
++MULTILIB_MATCHES += march?armv4t=march?armv5t
++MULTILIB_MATCHES += march?armv4t=march?arm10tdmi
++MULTILIB_MATCHES += march?armv4t=march?arm1020t
++
++MULTILIB_OPTIONS += mfloat-abi=softfp/mfloat-abi=hard
++MULTILIB_DIRNAMES += softfp hard
++MULTILIB_MATCHES += mfloat-abi?hard=mhard-float
++
++MULTILIB_OPTIONS += mfpu=neon
++MULTILIB_DIRNAMES += neon
++MULTILIB_EXCEPTIONS += mfpu=neon
++MULTILIB_MATCHES += mfpu?neon=mfpu?neon-fp16
++MULTILIB_MATCHES += mfpu?neon=mfpu?neon-vfpv4
++MULTILIB_ALIASES += mfloat-abi?softfp=mfloat-abi?softfp/mfpu?neon
++MULTILIB_ALIASES += mfloat-abi?softfp=mthumb/mfloat-abi?softfp/mfpu?neon
++MULTILIB_ALIASES += march?armv7-a/mfloat-abi?hard/mfpu?neon=mthumb/march?armv7-a/mfloat-abi?hard/mfpu?neon
++
++MULTILIB_OPTIONS += mbig-endian
++MULTILIB_DIRNAMES += be
++MULTILIB_ALIASES += mbig-endian=mfpu?neon/mbig-endian
++MULTILIB_ALIASES += mfloat-abi?softfp/mbig-endian=mfloat-abi?softfp/mfpu?neon/mbig-endian
++MULTILIB_ALIASES += mbig-endian=mthumb/mfpu?neon/mbig-endian
++MULTILIB_ALIASES += mfloat-abi?softfp/mbig-endian=mthumb/mfloat-abi?softfp/mfpu?neon/mbig-endian
++
++# Do not build Thumb libraries.
++MULTILIB_EXCEPTIONS += mthumb
++MULTILIB_EXCEPTIONS += mthumb/mfpu=neon
++
++# Use ARM libraries for ARMv4t Thumb and VFP.
++MULTILIB_ALIASES += march?armv4t=mthumb/march?armv4t
++MULTILIB_ALIASES += march?armv4t=march?armv4t/mfloat-abi?softfp
++MULTILIB_ALIASES += march?armv4t=mthumb/march?armv4t/mfloat-abi?softfp
++MULTILIB_ALIASES += march?armv4t=march?armv4t/mfpu?neon
++MULTILIB_ALIASES += march?armv4t=march?armv4t/mfloat-abi?softfp/mfpu?neon
++MULTILIB_ALIASES += march?armv4t=mthumb/march?armv4t/mfpu?neon
++MULTILIB_ALIASES += march?armv4t=mthumb/march?armv4t/mfloat-abi?softfp/mfpu?neon
++
++# We do not support ARMv4t big-endian.
++MULTILIB_EXCEPTIONS += *march=armv4t*mbig-endian
++
++# Behave ARMv7-A as ARMv7 for some cases.
++MULTILIB_EXCEPTIONS += march=armv7-a
++MULTILIB_EXCEPTIONS += march=armv7-a/mfpu=neon
++MULTILIB_ALIASES += mfloat-abi?softfp=march?armv7-a/mfloat-abi?softfp
++MULTILIB_ALIASES += mbig-endian=march?armv7-a/mbig-endian
++MULTILIB_ALIASES += mbig-endian=march?armv7-a/mfpu?neon/mbig-endian
++MULTILIB_ALIASES += mfloat-abi?softfp/mbig-endian=march?armv7-a/mfloat-abi?softfp/mbig-endian
++MULTILIB_ALIASES += mfloat-abi?softfp/mbig-endian=march?armv7-a/mfloat-abi?softfp/mfpu?neon/mbig-endian
++MULTILIB_ALIASES += mthumb/march?armv7-a=mthumb/march?armv7-a/mfpu?neon
++MULTILIB_ALIASES += mthumb/march?armv7-a/mbig-endian=mthumb/march?armv7-a/mfpu?neon/mbig-endian
++MULTILIB_ALIASES += mthumb/march?armv7-a/mbig-endian=mthumb/march?armv7-a/mfloat-abi?softfp/mfpu?neon/mbig-endian
++MULTILIB_ALIASES += mthumb/march?armv7-a=mthumb/march?armv7-a/mfloat-abi?softfp
++
++# Thumb-1 VFP isn't really a meaningful combination. Use the ARM VFP.
++MULTILIB_ALIASES += mfloat-abi?softfp=mthumb/mfloat-abi?softfp
++MULTILIB_ALIASES += mfloat-abi?softfp/mbig-endian=mthumb/mfloat-abi?softfp/mbig-endian
++
++# Use ARM libraries for big-endian Thumb.
++MULTILIB_ALIASES += mbig-endian=mthumb/mbig-endian
++
++# Don't bother with big-endian Thumb-2 VFP. Use the soft-float libraries
++# for now.
++MULTILIB_ALIASES += mthumb/march?armv7-a/mbig-endian=mthumb/march?armv7-a/mfloat-abi?softfp/mbig-endian
++
++# The only -mfloat-abi=hard libraries provided are for little-endian
++# v7-A NEON.
++MULTILIB_EXCEPTIONS += mfloat-abi=hard*
++MULTILIB_EXCEPTIONS += *march=armv4t*mfloat-abi=hard*
++MULTILIB_EXCEPTIONS += mthumb/mfloat-abi=hard*
++MULTILIB_EXCEPTIONS += *mfloat-abi=hard*mbig-endian
++MULTILIB_EXCEPTIONS += *mfloat-abi=hard
++
++# As of at least 4.2, gcc passes the wrong -L options if some multilibs are
++# omitted from MULTILIB_OSDIRNAMES
++MULTILIB_OSDIRNAMES = march.armv4t=!armv4t
++MULTILIB_OSDIRNAMES += mbig-endian=!be
++MULTILIB_OSDIRNAMES += mfloat-abi.softfp=!vfp
++MULTILIB_OSDIRNAMES += mfloat-abi.softfp/mbig-endian=!vfp-be
++MULTILIB_OSDIRNAMES += mthumb/march.armv7-a=!thumb2
++MULTILIB_OSDIRNAMES += march.armv7-a/mfloat-abi.softfp/mfpu.neon=!armv7-a-neon
++MULTILIB_OSDIRNAMES += mthumb/march.armv7-a/mfloat-abi.softfp/mfpu.neon=!thumb2-neon
++MULTILIB_OSDIRNAMES += march.armv7-a/mfloat-abi.hard/mfpu.neon=!armv7-a-hard
++MULTILIB_OSDIRNAMES += mthumb/march.armv7-a/mbig-endian=!thumb2-be
+diff -Nur a/gcc/config/arm/t-cs-linux-lite b/gcc/config/arm/t-cs-linux-lite
+--- a/gcc/config/arm/t-cs-linux-lite 1970-01-01 01:00:00.000000000 +0100
++++ b/gcc/config/arm/t-cs-linux-lite 2010-01-25 09:50:28.995687913 +0100
+@@ -0,0 +1,48 @@
++# We build 3 multilibs:
++# ./ (default)
++# armv4t/ -march=armv4t [-mthumb]
++# thumb2/ -mthumb -march=armv7
++MULTILIB_OPTIONS = mthumb
++MULTILIB_DIRNAMES = thumb
++MULTILIB_OPTIONS += march=armv4t/march=armv7
++MULTILIB_DIRNAMES += v4t v7
++MULTILIB_EXCEPTIONS += march=armv7
++MULTILIB_EXCEPTIONS += mthumb
++
++MULTILIB_ALIASES = march?armv4t=mthumb/march?armv4t
++
++# As of at least 4.2, gcc passes the wrong -L options if some multilibs are
++# omitted from MULTILIB_OSDIRNAMES
++MULTILIB_OSDIRNAMES = march.armv4t=!armv4t
++MULTILIB_OSDIRNAMES += mthumb/march.armv7=!thumb2
++
++MULTILIB_MATCHES += march?armv7=march?armv7a
++MULTILIB_MATCHES += march?armv7=march?armv7r
++MULTILIB_MATCHES += march?armv7=march?armv7m
++MULTILIB_MATCHES += march?armv7=march?armv7-a
++MULTILIB_MATCHES += march?armv7=march?armv7-r
++MULTILIB_MATCHES += march?armv7=march?armv7-m
++MULTILIB_MATCHES += march?armv7=march?armv7e-m
++MULTILIB_MATCHES += march?armv7=mcpu?cortex-a9
++MULTILIB_MATCHES += march?armv7=mcpu?cortex-a8
++MULTILIB_MATCHES += march?armv7=mcpu?cortex-a5
++MULTILIB_MATCHES += march?armv7=mcpu?cortex-r4
++MULTILIB_MATCHES += march?armv7=mcpu?cortex-r4f
++MULTILIB_MATCHES += march?armv7=mcpu?cortex-m3
++MULTILIB_MATCHES += march?armv4t=march?ep9312
++MULTILIB_MATCHES += march?armv4t=mcpu?arm7tdmi
++MULTILIB_MATCHES += march?armv4t=mcpu?arm7tdmi-s
++MULTILIB_MATCHES += march?armv4t=mcpu?arm710t
++MULTILIB_MATCHES += march?armv4t=mcpu?arm720t
++MULTILIB_MATCHES += march?armv4t=mcpu?arm740t
++MULTILIB_MATCHES += march?armv4t=mcpu?arm9
++MULTILIB_MATCHES += march?armv4t=mcpu?arm9tdmi
++MULTILIB_MATCHES += march?armv4t=mcpu?arm920
++MULTILIB_MATCHES += march?armv4t=mcpu?arm920t
++MULTILIB_MATCHES += march?armv4t=mcpu?arm922t
++MULTILIB_MATCHES += march?armv4t=mcpu?arm940t
++MULTILIB_MATCHES += march?armv4t=mcpu?ep9312
++MULTILIB_MATCHES += march?armv4t=march?armv5
++MULTILIB_MATCHES += march?armv4t=march?armv5t
++MULTILIB_MATCHES += march?armv4t=march?arm10tdmi
++MULTILIB_MATCHES += march?armv4t=march?arm1020t
+diff -Nur a/gcc/config/arm/t-cs-uclinux-eabi b/gcc/config/arm/t-cs-uclinux-eabi
+--- a/gcc/config/arm/t-cs-uclinux-eabi 1970-01-01 01:00:00.000000000 +0100
++++ b/gcc/config/arm/t-cs-uclinux-eabi 2010-01-25 09:50:28.995687913 +0100
+@@ -0,0 +1,55 @@
++# EABI uClinux multilib selection. Other setting are inherited from t-arm-elf
++
++# We build 3 multilibs:
++# . (default)
++# thumb2/ -mthumb -march=armv7 -mfix-cortex-m3-ldrd
++# armv6-m/ -mthumb -march=armv6-m
++
++MULTILIB_OPTIONS = mthumb
++MULTILIB_DIRNAMES = thumb
++MULTILIB_EXCEPTIONS =
++MULTILIB_MATCHES =
++
++MULTILIB_OPTIONS += march=armv7/march=armv6-m
++MULTILIB_DIRNAMES += armv7 armv6-m
++
++MULTILIB_EXCEPTIONS += mthumb
++
++MULTILIB_EXCEPTIONS += march=armv7
++MULTILIB_MATCHES += march?armv7=march?armv7a
++MULTILIB_MATCHES += march?armv7=march?armv7r
++MULTILIB_MATCHES += march?armv7=march?armv7m
++MULTILIB_MATCHES += march?armv7=march?armv7-a
++MULTILIB_MATCHES += march?armv7=march?armv7-r
++MULTILIB_MATCHES += march?armv7=march?armv7-m
++MULTILIB_MATCHES += march?armv7=march?armv7e-m
++MULTILIB_MATCHES += march?armv7=mcpu?cortex-a9
++MULTILIB_MATCHES += march?armv7=mcpu?cortex-a8
++MULTILIB_MATCHES += march?armv7=mcpu?cortex-a5
++MULTILIB_MATCHES += march?armv7=mcpu?cortex-r4
++MULTILIB_MATCHES += march?armv7=mcpu?cortex-r4f
++MULTILIB_MATCHES += march?armv7=mcpu?cortex-m3
++
++MULTILIB_EXCEPTIONS += march=armv6-m
++MULTILIB_MATCHES += march?armv6-m=mcpu?cortex-m1
++MULTILIB_MATCHES += march?armv6-m=mcpu?cortex-m0
++
++MULTILIB_ALIASES =
++
++# FIXME: We need a sane way of doing this.
++# This isn't really a multilib, it's a hack to add an extra option
++# to the v7-m multilib.
++MULTILIB_OPTIONS += mfix-cortex-m3-ldrd
++MULTILIB_DIRNAMES += broken_ldrd
++
++MULTILIB_EXCEPTIONS += mfix-cortex-m3-ldrd
++MULTILIB_EXCEPTIONS += mthumb/mfix-cortex-m3-ldrd
++MULTILIB_EXCEPTIONS += march=armv7/mfix-cortex-m3-ldrd
++MULTILIB_EXCEPTIONS += *march=armv6-m*mfix-cortex-m3-ldrd
++
++MULTILIB_ALIASES += mthumb/march?armv7/mfix-cortex-m3-ldrd=mthumb/march?armv7
++
++
++MULTILIB_OSDIRNAMES = mthumb/march.armv7/mfix-cortex-m3-ldrd=!thumb2
++MULTILIB_OSDIRNAMES += mthumb/march.armv6-m=!armv6-m
++
+diff -Nur a/gcc/config/arm/thumb2.md b/gcc/config/arm/thumb2.md
+--- a/gcc/config/arm/thumb2.md 2008-11-21 00:00:00.000000000 +0100
++++ b/gcc/config/arm/thumb2.md 2010-01-25 09:50:28.995687913 +0100
+@@ -24,6 +24,8 @@
+ ;; changes made in armv5t as "thumb2". These are considered part
+ ;; the 16-bit Thumb-1 instruction set.
+
++(include "hwdiv.md")
++
+ (define_insn "*thumb2_incscc"
+ [(set (match_operand:SI 0 "s_register_operand" "=r,r")
+ (plus:SI (match_operator:SI 2 "arm_comparison_operator"
+@@ -172,34 +174,6 @@
+ (set_attr "length" "8")]
+ )
+
+-(define_insn "*thumb2_abssi2"
+- [(set (match_operand:SI 0 "s_register_operand" "=r,&r")
+- (abs:SI (match_operand:SI 1 "s_register_operand" "0,r")))
+- (clobber (reg:CC CC_REGNUM))]
+- "TARGET_THUMB2"
+- "@
+- cmp\\t%0, #0\;it\tlt\;rsblt\\t%0, %0, #0
+- eor%?\\t%0, %1, %1, asr #31\;sub%?\\t%0, %0, %1, asr #31"
+- [(set_attr "conds" "clob,*")
+- (set_attr "shift" "1")
+- ;; predicable can't be set based on the variant, so left as no
+- (set_attr "length" "10,8")]
+-)
+-
+-(define_insn "*thumb2_neg_abssi2"
+- [(set (match_operand:SI 0 "s_register_operand" "=r,&r")
+- (neg:SI (abs:SI (match_operand:SI 1 "s_register_operand" "0,r"))))
+- (clobber (reg:CC CC_REGNUM))]
+- "TARGET_THUMB2"
+- "@
+- cmp\\t%0, #0\;it\\tgt\;rsbgt\\t%0, %0, #0
+- eor%?\\t%0, %1, %1, asr #31\;rsb%?\\t%0, %0, %1, asr #31"
+- [(set_attr "conds" "clob,*")
+- (set_attr "shift" "1")
+- ;; predicable can't be set based on the variant, so left as no
+- (set_attr "length" "10,8")]
+-)
+-
+ (define_insn "*thumb2_movdi"
+ [(set (match_operand:DI 0 "nonimmediate_di_operand" "=r, r, r, r, m")
+ (match_operand:DI 1 "di_operand" "rDa,Db,Dc,mi,r"))]
+@@ -223,9 +197,14 @@
+ (set_attr "neg_pool_range" "*,*,*,0,*")]
+ )
+
++;; We have two alternatives here for memory loads (and similarly for stores)
++;; to reflect the fact that the permissible constant pool ranges differ
++;; between ldr instructions taking low regs and ldr instructions taking high
++;; regs. The high register alternatives are not taken into account when
++;; choosing register preferences in order to reflect their expense.
+ (define_insn "*thumb2_movsi_insn"
+- [(set (match_operand:SI 0 "nonimmediate_operand" "=rk,r,r,r,rk,m")
+- (match_operand:SI 1 "general_operand" "rk ,I,K,N,mi,rk"))]
++ [(set (match_operand:SI 0 "nonimmediate_operand" "=rk,r,r,r,l,*hk,m,*m")
++ (match_operand:SI 1 "general_operand" "rk ,I,K,j,mi,*mi,l,*hk"))]
+ "TARGET_THUMB2 && ! TARGET_IWMMXT
+ && !(TARGET_HARD_FLOAT && TARGET_VFP)
+ && ( register_operand (operands[0], SImode)
+@@ -236,11 +215,13 @@
+ mvn%?\\t%0, #%B1
+ movw%?\\t%0, %1
+ ldr%?\\t%0, %1
++ ldr%?\\t%0, %1
++ str%?\\t%1, %0
+ str%?\\t%1, %0"
+- [(set_attr "type" "*,*,*,*,load1,store1")
++ [(set_attr "type" "*,*,*,*,load1,load1,store1,store1")
+ (set_attr "predicable" "yes")
+- (set_attr "pool_range" "*,*,*,*,4096,*")
+- (set_attr "neg_pool_range" "*,*,*,*,0,*")]
++ (set_attr "pool_range" "*,*,*,*,1020,4096,*,*")
++ (set_attr "neg_pool_range" "*,*,*,*,0,0,*,*")]
+ )
+
+ ;; ??? We can probably do better with thumb2
+@@ -1128,27 +1109,7 @@
+ return \"add%!\\t%0, %1, %2\";
+ "
+ [(set_attr "predicable" "yes")
+- (set_attr "length" "2")]
+-)
+-
+-(define_insn "divsi3"
+- [(set (match_operand:SI 0 "s_register_operand" "=r")
+- (div:SI (match_operand:SI 1 "s_register_operand" "r")
+- (match_operand:SI 2 "s_register_operand" "r")))]
+- "TARGET_THUMB2 && arm_arch_hwdiv"
+- "sdiv%?\t%0, %1, %2"
+- [(set_attr "predicable" "yes")
+- (set_attr "insn" "sdiv")]
+-)
+-
+-(define_insn "udivsi3"
+- [(set (match_operand:SI 0 "s_register_operand" "=r")
+- (udiv:SI (match_operand:SI 1 "s_register_operand" "r")
+- (match_operand:SI 2 "s_register_operand" "r")))]
+- "TARGET_THUMB2 && arm_arch_hwdiv"
+- "udiv%?\t%0, %1, %2"
+- [(set_attr "predicable" "yes")
+- (set_attr "insn" "udiv")]
++ (set_attr "length" "4")]
+ )
+
+ (define_insn "*thumb2_subsi_short"
+@@ -1162,6 +1123,71 @@
+ (set_attr "length" "2")]
+ )
+
++;; 16-bit encodings of "muls" and "mul<c>". We only use these when
++;; optimizing for size since "muls" is slow on all known
++;; implementations and since "mul<c>" will be generated by
++;; "*arm_mulsi3_v6" anyhow. The assembler will use a 16-bit encoding
++;; for "mul<c>" whenever possible anyhow.
++(define_peephole2
++ [(set (match_operand:SI 0 "low_register_operand" "")
++ (mult:SI (match_operand:SI 1 "low_register_operand" "")
++ (match_dup 0)))]
++ "TARGET_THUMB2 && optimize_size && peep2_regno_dead_p (0, CC_REGNUM)"
++ [(parallel
++ [(set (match_dup 0)
++ (mult:SI (match_dup 0) (match_dup 1)))
++ (clobber (reg:CC CC_REGNUM))])]
++ ""
++)
++
++(define_peephole2
++ [(set (match_operand:SI 0 "low_register_operand" "")
++ (mult:SI (match_dup 0)
++ (match_operand:SI 1 "low_register_operand" "")))]
++ "TARGET_THUMB2 && optimize_size && peep2_regno_dead_p (0, CC_REGNUM)"
++ [(parallel
++ [(set (match_dup 0)
++ (mult:SI (match_dup 0) (match_dup 1)))
++ (clobber (reg:CC CC_REGNUM))])]
++ ""
++)
++
++(define_insn "*thumb2_mulsi_short"
++ [(set (match_operand:SI 0 "low_register_operand" "=l")
++ (mult:SI (match_operand:SI 1 "low_register_operand" "%0")
++ (match_operand:SI 2 "low_register_operand" "l")))
++ (clobber (reg:CC CC_REGNUM))]
++ "TARGET_THUMB2 && optimize_size && reload_completed"
++ "mul%!\\t%0, %2, %0"
++ [(set_attr "predicable" "yes")
++ (set_attr "length" "2")
++ (set_attr "insn" "muls")])
++
++(define_insn "*thumb2_mulsi_short_compare0"
++ [(set (reg:CC_NOOV CC_REGNUM)
++ (compare:CC_NOOV
++ (mult:SI (match_operand:SI 1 "register_operand" "%0")
++ (match_operand:SI 2 "register_operand" "l"))
++ (const_int 0)))
++ (set (match_operand:SI 0 "register_operand" "=l")
++ (mult:SI (match_dup 1) (match_dup 2)))]
++ "TARGET_THUMB2 && optimize_size"
++ "muls\\t%0, %2, %0"
++ [(set_attr "length" "2")
++ (set_attr "insn" "muls")])
++
++(define_insn "*thumb2_mulsi_short_compare0_scratch"
++ [(set (reg:CC_NOOV CC_REGNUM)
++ (compare:CC_NOOV
++ (mult:SI (match_operand:SI 1 "register_operand" "%0")
++ (match_operand:SI 2 "register_operand" "l"))
++ (const_int 0)))
++ (clobber (match_scratch:SI 0 "=r"))]
++ "TARGET_THUMB2 && optimize_size"
++ "muls\\t%0, %2, %0"
++ [(set_attr "length" "2")
++ (set_attr "insn" "muls")])
++
+ (define_insn "*thumb2_cbz"
+ [(set (pc) (if_then_else
+ (eq (match_operand:SI 0 "s_register_operand" "l,?r")
+@@ -1171,7 +1197,7 @@
+ (clobber (reg:CC CC_REGNUM))]
+ "TARGET_THUMB2"
+ "*
+- if (get_attr_length (insn) == 2 && which_alternative == 0)
++ if (get_attr_length (insn) == 2)
+ return \"cbz\\t%0, %l1\";
+ else
+ return \"cmp\\t%0, #0\;beq\\t%l1\";
+@@ -1179,7 +1205,8 @@
+ [(set (attr "length")
+ (if_then_else
+ (and (ge (minus (match_dup 1) (pc)) (const_int 2))
+- (le (minus (match_dup 1) (pc)) (const_int 128)))
++ (le (minus (match_dup 1) (pc)) (const_int 128))
++ (eq (symbol_ref ("which_alternative")) (const_int 0)))
+ (const_int 2)
+ (const_int 8)))]
+ )
+@@ -1193,7 +1220,7 @@
+ (clobber (reg:CC CC_REGNUM))]
+ "TARGET_THUMB2"
+ "*
+- if (get_attr_length (insn) == 2 && which_alternative == 0)
++ if (get_attr_length (insn) == 2)
+ return \"cbnz\\t%0, %l1\";
+ else
+ return \"cmp\\t%0, #0\;bne\\t%l1\";
+@@ -1201,7 +1228,8 @@
+ [(set (attr "length")
+ (if_then_else
+ (and (ge (minus (match_dup 1) (pc)) (const_int 2))
+- (le (minus (match_dup 1) (pc)) (const_int 128)))
++ (le (minus (match_dup 1) (pc)) (const_int 128))
++ (eq (symbol_ref ("which_alternative")) (const_int 0)))
+ (const_int 2)
+ (const_int 8)))]
+ )
+diff -Nur a/gcc/config/arm/t-linux-eabi b/gcc/config/arm/t-linux-eabi
+--- a/gcc/config/arm/t-linux-eabi 2009-01-24 22:06:08.000000000 +0100
++++ b/gcc/config/arm/t-linux-eabi 2010-01-25 09:50:28.995687913 +0100
+@@ -6,8 +6,8 @@
+ MULTILIB_OPTIONS =
+ MULTILIB_DIRNAMES =
+
+-# Use a version of div0 which raises SIGFPE.
+-LIB1ASMFUNCS := $(filter-out _dvmd_tls,$(LIB1ASMFUNCS)) _dvmd_lnx
++# Use a version of div0 which raises SIGFPE, and a special __clear_cache.
++LIB1ASMFUNCS := $(filter-out _dvmd_tls,$(LIB1ASMFUNCS)) _dvmd_lnx _clear_cache
+
+ # Multilib the standard Linux files. Don't include crti.o or crtn.o,
+ # which are provided by glibc.
+diff -Nur a/gcc/config/arm/t-montavista-linux b/gcc/config/arm/t-montavista-linux
+--- a/gcc/config/arm/t-montavista-linux 1970-01-01 01:00:00.000000000 +0100
++++ b/gcc/config/arm/t-montavista-linux 2010-01-25 09:50:28.995687913 +0100
+@@ -0,0 +1,33 @@
++# MontaVista GNU/Linux Configuration.
++# Copyright (C) 2009
++# Free Software Foundation, Inc.
++#
++# 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/>.
++
++MULTILIB_OPTIONS = tarmv6/tthumb2
++MULTILIB_DIRNAMES = armv6 thumb2
++
++MULTILIB_EXCEPTIONS =
++
++MULTILIB_OSDIRNAMES =
++
++MULTILIB_ALIASES =
++
++MULTILIB_MATCHES =
++
++# These files must be built for each multilib.
++EXTRA_MULTILIB_PARTS = crtbegin.o crtend.o crtbeginS.o crtendS.o crtbeginT.o
+diff -Nur a/gcc/config/arm/t-symbian b/gcc/config/arm/t-symbian
+--- a/gcc/config/arm/t-symbian 2008-06-12 19:29:47.000000000 +0200
++++ b/gcc/config/arm/t-symbian 2010-01-25 09:50:28.995687913 +0100
+@@ -17,6 +17,9 @@
+ LIB2ADDEH = $(srcdir)/unwind-c.c $(srcdir)/config/arm/pr-support.c
+ LIB2ADDEHDEP = $(UNWIND_H)
+
++# Include half-float helpers.
++LIB2FUNCS_STATIC_EXTRA = $(srcdir)/config/arm/fp16.c
++
+ # Create a multilib for processors with VFP floating-point, and a
+ # multilib for those without -- using the soft-float ABI in both
+ # cases. Symbian OS object should be compiled with interworking
+diff -Nur a/gcc/config/arm/t-wrs-linux b/gcc/config/arm/t-wrs-linux
+--- a/gcc/config/arm/t-wrs-linux 1970-01-01 01:00:00.000000000 +0100
++++ b/gcc/config/arm/t-wrs-linux 2010-01-25 09:50:28.995687913 +0100
+@@ -0,0 +1,43 @@
++# Wind River GNU/Linux Configuration.
++# Copyright (C) 2006, 2007, 2008
++# Free Software Foundation, Inc.
++#
++# 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/>.
++
++MULTILIB_OPTIONS = muclibc
++MULTILIB_OPTIONS += tarm926ej-s/tiwmmxt/txscale/tarm920t/tthumb2/tcortex-a8-be8
++MULTILIB_OPTIONS += mfloat-abi=softfp
++MULTILIB_DIRNAMES = uclibc
++MULTILIB_DIRNAMES += tarm926ej-s tiwmmxt txscale tarm920t thumb2 cortex-a8-be8
++MULTILIB_DIRNAMES += softfp
++
++MULTILIB_EXCEPTIONS = *muclibc*/*tarm920t*
++MULTILIB_EXCEPTIONS += *muclibc*/*cortex-a8-be8*
++
++MULTILIB_EXCEPTIONS += *tiwmmxt*/*mfloat-abi=softfp*
++MULTILIB_EXCEPTIONS += *txscale*/*mfloat-abi=softfp*
++MULTILIB_EXCEPTIONS += *tarm920t*/*mfloat-abi=softfp*
++MULTILIB_EXCEPTIONS += *thumb2*/*mfloat-abi=softfp*
++
++MULTILIB_MATCHES = tiwmmxt=tiwmmxt2
++
++MULTILIB_ALIASES = tcortex-a8-be8=tcortex-a8-be8/mfloat-abi?softfp
++MULTILIB_OSDIRNAMES =
++
++# These files must be built for each multilib.
++EXTRA_MULTILIB_PARTS = crtbegin.o crtend.o crtbeginS.o crtendS.o crtbeginT.o
++
+diff -Nur a/gcc/config/arm/uclinux-eabi.h b/gcc/config/arm/uclinux-eabi.h
+--- a/gcc/config/arm/uclinux-eabi.h 2009-02-20 16:20:38.000000000 +0100
++++ b/gcc/config/arm/uclinux-eabi.h 2010-01-25 09:50:28.995687913 +0100
+@@ -50,6 +50,10 @@
+ #undef ARM_DEFAULT_ABI
+ #define ARM_DEFAULT_ABI ARM_ABI_AAPCS_LINUX
+
++#undef LINK_GCC_C_SEQUENCE_SPEC
++#define LINK_GCC_C_SEQUENCE_SPEC \
++ "--start-group %G %L --end-group"
++
+ /* Clear the instruction cache from `beg' to `end'. This makes an
+ inline system call to SYS_cacheflush. */
+ #undef CLEAR_INSN_CACHE
+diff -Nur a/gcc/config/arm/unwind-arm.c b/gcc/config/arm/unwind-arm.c
+--- a/gcc/config/arm/unwind-arm.c 2009-04-10 01:23:07.000000000 +0200
++++ b/gcc/config/arm/unwind-arm.c 2010-01-25 09:50:28.995687913 +0100
+@@ -1000,7 +1000,6 @@
+ while (code != _URC_END_OF_STACK
+ && code != _URC_FAILURE);
+
+- finish:
+ restore_non_core_regs (&saved_vrs);
+ return code;
+ }
+@@ -1168,6 +1167,9 @@
+ {
+ matched = (void *)(ucbp + 1);
+ rtti = _Unwind_decode_target2 ((_uw) &data[i + 1]);
++ /* There is no way to encode an exception
++ specification for 'class X * &', so
++ always pass false for is_reference. */
+ if (__cxa_type_match (ucbp, (type_info *) rtti, 0,
+ &matched))
+ break;
+@@ -1197,8 +1199,6 @@
+ ucbp->barrier_cache.bitpattern[4] = (_uw) &data[1];
+
+ if (data[0] & uint32_highbit)
+- phase2_call_unexpected_after_unwind = 1;
+- else
+ {
+ data += rtti_count + 1;
+ /* Setup for entry to the handler. */
+@@ -1208,6 +1208,8 @@
+ _Unwind_SetGR (context, 0, (_uw) ucbp);
+ return _URC_INSTALL_CONTEXT;
+ }
++ else
++ phase2_call_unexpected_after_unwind = 1;
+ }
+ if (data[0] & uint32_highbit)
+ data++;
+diff -Nur a/gcc/config/arm/unwind-arm.h b/gcc/config/arm/unwind-arm.h
+--- a/gcc/config/arm/unwind-arm.h 2009-04-10 01:23:07.000000000 +0200
++++ b/gcc/config/arm/unwind-arm.h 2010-01-25 09:50:28.995687913 +0100
+@@ -229,9 +229,10 @@
+ return 0;
+
+ #if (defined(linux) && !defined(__uClinux__)) || defined(__NetBSD__)
+- /* Pc-relative indirect. */
++ /* Pc-relative indirect. Propagate the bottom 2 bits, which can
++ contain referenceness information in gnu unwinding tables. */
+ tmp += ptr;
+- tmp = *(_Unwind_Word *) tmp;
++ tmp = *(_Unwind_Word *) (tmp & ~(_Unwind_Word)3) | (tmp & 3);
+ #elif defined(__symbian__) || defined(__uClinux__)
+ /* Absolute pointer. Nothing more to do. */
+ #else
+diff -Nur a/gcc/config/arm/vec-common.md b/gcc/config/arm/vec-common.md
+--- a/gcc/config/arm/vec-common.md 2007-08-22 22:32:18.000000000 +0200
++++ b/gcc/config/arm/vec-common.md 2010-01-25 09:50:28.995687913 +0100
+@@ -38,6 +38,11 @@
+ "TARGET_NEON
+ || (TARGET_REALLY_IWMMXT && VALID_IWMMXT_REG_MODE (<MODE>mode))"
+ {
++ if (can_create_pseudo_p ())
++ {
++ if (GET_CODE (operands[0]) != REG)
++ operands[1] = force_reg (<MODE>mode, operands[1]);
++ }
+ })
+
+ ;; Vector arithmetic. Expanders are blank, then unnamed insns implement
+diff -Nur a/gcc/config/arm/vfp.md b/gcc/config/arm/vfp.md
+--- a/gcc/config/arm/vfp.md 2008-09-01 15:40:49.000000000 +0200
++++ b/gcc/config/arm/vfp.md 2010-01-25 09:50:28.995687913 +0100
+@@ -51,7 +51,7 @@
+ ;; problems because small constants get converted into adds.
+ (define_insn "*arm_movsi_vfp"
+ [(set (match_operand:SI 0 "nonimmediate_operand" "=rk,r,r,r,rk,m ,*t,r,*t,*t, *Uv")
+- (match_operand:SI 1 "general_operand" "rk, I,K,N,mi,rk,r,*t,*t,*Uvi,*t"))]
++ (match_operand:SI 1 "general_operand" "rk, I,K,j,mi,rk,r,*t,*t,*Uvi,*t"))]
+ "TARGET_ARM && TARGET_VFP && TARGET_HARD_FLOAT
+ && ( s_register_operand (operands[0], SImode)
+ || s_register_operand (operands[1], SImode))"
+@@ -82,13 +82,17 @@
+ "
+ [(set_attr "predicable" "yes")
+ (set_attr "type" "*,*,*,*,load1,store1,r_2_f,f_2_r,fcpys,f_loads,f_stores")
++ (set_attr "neon_type" "*,*,*,*,*,*,neon_mcr,neon_mrc,neon_vmov,*,*")
++ (set_attr "insn" "mov,mov,mvn,mov,*,*,*,*,*,*,*")
+ (set_attr "pool_range" "*,*,*,*,4096,*,*,*,*,1020,*")
+ (set_attr "neg_pool_range" "*,*,*,*,4084,*,*,*,*,1008,*")]
+ )
+
++;; See thumb2.md:thumb2_movsi_insn for an explanation of the split
++;; high/low register alternatives for loads and stores here.
+ (define_insn "*thumb2_movsi_vfp"
+- [(set (match_operand:SI 0 "nonimmediate_operand" "=rk,r,r,r,rk,m,*t,r, *t,*t, *Uv")
+- (match_operand:SI 1 "general_operand" "rk, I,K,N,mi,rk,r,*t,*t,*Uvi,*t"))]
++ [(set (match_operand:SI 0 "nonimmediate_operand" "=rk,r,r,r,l,*hk,m,*m,*t,r, *t,*t, *Uv")
++ (match_operand:SI 1 "general_operand" "rk, I,K,j,mi,*mi,l,*hk,r,*t,*t,*Uvi,*t"))]
+ "TARGET_THUMB2 && TARGET_VFP && TARGET_HARD_FLOAT
+ && ( s_register_operand (operands[0], SImode)
+ || s_register_operand (operands[1], SImode))"
+@@ -102,25 +106,29 @@
+ case 3:
+ return \"movw%?\\t%0, %1\";
+ case 4:
+- return \"ldr%?\\t%0, %1\";
+ case 5:
+- return \"str%?\\t%1, %0\";
++ return \"ldr%?\\t%0, %1\";
+ case 6:
+- return \"fmsr%?\\t%0, %1\\t%@ int\";
+ case 7:
+- return \"fmrs%?\\t%0, %1\\t%@ int\";
++ return \"str%?\\t%1, %0\";
+ case 8:
++ return \"fmsr%?\\t%0, %1\\t%@ int\";
++ case 9:
++ return \"fmrs%?\\t%0, %1\\t%@ int\";
++ case 10:
+ return \"fcpys%?\\t%0, %1\\t%@ int\";
+- case 9: case 10:
++ case 11: case 12:
+ return output_move_vfp (operands);
+ default:
+ gcc_unreachable ();
+ }
+ "
+ [(set_attr "predicable" "yes")
+- (set_attr "type" "*,*,*,*,load1,store1,r_2_f,f_2_r,fcpys,f_load,f_store")
+- (set_attr "pool_range" "*,*,*,*,4096,*,*,*,*,1020,*")
+- (set_attr "neg_pool_range" "*,*,*,*, 0,*,*,*,*,1008,*")]
++ (set_attr "type" "*,*,*,*,load1,load1,store1,store1,r_2_f,f_2_r,fcpys,f_load,f_store")
++ (set_attr "neon_type" "*,*,*,*,*,*,*,*,neon_mcr,neon_mrc,neon_vmov,*,*")
++ (set_attr "insn" "mov,mov,mvn,mov,*,*,*,*,*,*,*,*,*")
++ (set_attr "pool_range" "*,*,*,*,1020,4096,*,*,*,*,*,1020,*")
++ (set_attr "neg_pool_range" "*,*,*,*, 0, 0,*,*,*,*,*,1008,*")]
+ )
+
+
+@@ -145,7 +153,10 @@
+ case 4:
+ return \"fmrrd%?\\t%Q0, %R0, %P1\\t%@ int\";
+ case 5:
+- return \"fcpyd%?\\t%P0, %P1\\t%@ int\";
++ if (TARGET_VFP_SINGLE)
++ return \"fcpys%?\\t%0, %1\\t%@ int\;fcpys%?\\t%p0, %p1\\t%@ int\";
++ else
++ return \"fcpyd%?\\t%P0, %P1\\t%@ int\";
+ case 6: case 7:
+ return output_move_vfp (operands);
+ default:
+@@ -153,7 +164,14 @@
+ }
+ "
+ [(set_attr "type" "*,load2,store2,r_2_f,f_2_r,ffarithd,f_loadd,f_stored")
+- (set_attr "length" "8,8,8,4,4,4,4,4")
++ (set_attr "neon_type" "*,*,*,neon_mcr_2_mcrr,neon_mrrc,neon_vmov,*,*")
++ (set (attr "length") (cond [(eq_attr "alternative" "0,1,2") (const_int 8)
++ (eq_attr "alternative" "5")
++ (if_then_else
++ (eq (symbol_ref "TARGET_VFP_SINGLE") (const_int 1))
++ (const_int 8)
++ (const_int 4))]
++ (const_int 4)))
+ (set_attr "pool_range" "*,1020,*,*,*,*,1020,*")
+ (set_attr "neg_pool_range" "*,1008,*,*,*,*,1008,*")]
+ )
+@@ -172,7 +190,10 @@
+ case 4:
+ return \"fmrrd%?\\t%Q0, %R0, %P1\\t%@ int\";
+ case 5:
+- return \"fcpyd%?\\t%P0, %P1\\t%@ int\";
++ if (TARGET_VFP_SINGLE)
++ return \"fcpys%?\\t%0, %1\\t%@ int\;fcpys%?\\t%p0, %p1\\t%@ int\";
++ else
++ return \"fcpyd%?\\t%P0, %P1\\t%@ int\";
+ case 6: case 7:
+ return output_move_vfp (operands);
+ default:
+@@ -180,11 +201,123 @@
+ }
+ "
+ [(set_attr "type" "*,load2,store2,r_2_f,f_2_r,ffarithd,f_load,f_store")
+- (set_attr "length" "8,8,8,4,4,4,4,4")
++ (set_attr "neon_type" "*,*,*,neon_mcr_2_mcrr,neon_mrrc,neon_vmov,*,*")
++ (set (attr "length") (cond [(eq_attr "alternative" "0,1,2") (const_int 8)
++ (eq_attr "alternative" "5")
++ (if_then_else
++ (eq (symbol_ref "TARGET_VFP_SINGLE") (const_int 1))
++ (const_int 8)
++ (const_int 4))]
++ (const_int 4)))
+ (set_attr "pool_range" "*,4096,*,*,*,*,1020,*")
+ (set_attr "neg_pool_range" "*, 0,*,*,*,*,1008,*")]
+ )
+
++;; HFmode moves
++(define_insn "*movhf_vfp_neon"
++ [(set (match_operand:HF 0 "nonimmediate_operand" "= t,Um,r,m,t,r,t,r,r")
++ (match_operand:HF 1 "general_operand" " Um, t,m,r,t,r,r,t,F"))]
++ "TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_NEON_FP16
++ && ( s_register_operand (operands[0], HFmode)
++ || s_register_operand (operands[1], HFmode))"
++ "*
++ switch (which_alternative)
++ {
++ case 0: /* S register from memory */
++ return \"vld1.16\\t{%z0}, %A1\";
++ case 1: /* memory from S register */
++ return \"vst1.16\\t{%z1}, %A0\";
++ case 2: /* ARM register from memory */
++ return \"ldrh\\t%0, %1\\t%@ __fp16\";
++ case 3: /* memory from ARM register */
++ return \"strh\\t%1, %0\\t%@ __fp16\";
++ case 4: /* S register from S register */
++ return \"fcpys\\t%0, %1\";
++ case 5: /* ARM register from ARM register */
++ return \"mov\\t%0, %1\\t%@ __fp16\";
++ case 6: /* S register from ARM register */
++ return \"fmsr\\t%0, %1\";
++ case 7: /* ARM register from S register */
++ return \"fmrs\\t%0, %1\";
++ case 8: /* ARM register from constant */
++ {
++ REAL_VALUE_TYPE r;
++ long bits;
++ rtx ops[4];
++
++ REAL_VALUE_FROM_CONST_DOUBLE (r, operands[1]);
++ bits = real_to_target (NULL, &r, HFmode);
++ ops[0] = operands[0];
++ ops[1] = GEN_INT (bits);
++ ops[2] = GEN_INT (bits & 0xff00);
++ ops[3] = GEN_INT (bits & 0x00ff);
++
++ if (arm_arch_thumb2)
++ output_asm_insn (\"movw\\t%0, %1\", ops);
++ else
++ output_asm_insn (\"mov\\t%0, %2\;orr\\t%0, %0, %3\", ops);
++ return \"\";
++ }
++ default:
++ gcc_unreachable ();
++ }
++ "
++ [(set_attr "conds" "unconditional")
++ (set_attr "type" "*,*,load1,store1,fcpys,*,r_2_f,f_2_r,*")
++ (set_attr "neon_type" "neon_vld1_1_2_regs,neon_vst1_1_2_regs_vst2_2_regs,*,*,*,*,*,*,*")
++ (set_attr "length" "4,4,4,4,4,4,4,4,8")]
++)
++
++;; FP16 without element load/store instructions.
++(define_insn "*movhf_vfp"
++ [(set (match_operand:HF 0 "nonimmediate_operand" "=r,m,t,r,t,r,r")
++ (match_operand:HF 1 "general_operand" " m,r,t,r,r,t,F"))]
++ "TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_FP16 && !TARGET_NEON_FP16
++ && ( s_register_operand (operands[0], HFmode)
++ || s_register_operand (operands[1], HFmode))"
++ "*
++ switch (which_alternative)
++ {
++ case 0: /* ARM register from memory */
++ return \"ldrh\\t%0, %1\\t%@ __fp16\";
++ case 1: /* memory from ARM register */
++ return \"strh\\t%1, %0\\t%@ __fp16\";
++ case 2: /* S register from S register */
++ return \"fcpys\\t%0, %1\";
++ case 3: /* ARM register from ARM register */
++ return \"mov\\t%0, %1\\t%@ __fp16\";
++ case 4: /* S register from ARM register */
++ return \"fmsr\\t%0, %1\";
++ case 5: /* ARM register from S register */
++ return \"fmrs\\t%0, %1\";
++ case 6: /* ARM register from constant */
++ {
++ REAL_VALUE_TYPE r;
++ long bits;
++ rtx ops[4];
++
++ REAL_VALUE_FROM_CONST_DOUBLE (r, operands[1]);
++ bits = real_to_target (NULL, &r, HFmode);
++ ops[0] = operands[0];
++ ops[1] = GEN_INT (bits);
++ ops[2] = GEN_INT (bits & 0xff00);
++ ops[3] = GEN_INT (bits & 0x00ff);
++
++ if (arm_arch_thumb2)
++ output_asm_insn (\"movw\\t%0, %1\", ops);
++ else
++ output_asm_insn (\"mov\\t%0, %2\;orr\\t%0, %0, %3\", ops);
++ return \"\";
++ }
++ default:
++ gcc_unreachable ();
++ }
++ "
++ [(set_attr "conds" "unconditional")
++ (set_attr "type" "load1,store1,fcpys,*,r_2_f,f_2_r,*")
++ (set_attr "length" "4,4,4,4,4,4,8")]
++)
++
+
+ ;; SFmode moves
+ ;; Disparage the w<->r cases because reloading an invalid address is
+@@ -222,6 +355,8 @@
+ [(set_attr "predicable" "yes")
+ (set_attr "type"
+ "r_2_f,f_2_r,fconsts,f_loads,f_stores,load1,store1,fcpys,*")
++ (set_attr "neon_type" "neon_mcr,neon_mrc,*,*,*,*,*,neon_vmov,*")
++ (set_attr "insn" "*,*,*,*,*,*,*,*,mov")
+ (set_attr "pool_range" "*,*,*,1020,*,4096,*,*,*")
+ (set_attr "neg_pool_range" "*,*,*,1008,*,4080,*,*,*")]
+ )
+@@ -258,6 +393,8 @@
+ [(set_attr "predicable" "yes")
+ (set_attr "type"
+ "r_2_f,f_2_r,fconsts,f_load,f_store,load1,store1,fcpys,*")
++ (set_attr "neon_type" "neon_mcr,neon_mrc,*,*,*,*,*,neon_vmov,*")
++ (set_attr "insn" "*,*,*,*,*,*,*,*,mov")
+ (set_attr "pool_range" "*,*,*,1020,*,4092,*,*,*")
+ (set_attr "neg_pool_range" "*,*,*,1008,*,0,*,*,*")]
+ )
+@@ -267,7 +404,7 @@
+
+ (define_insn "*movdf_vfp"
+ [(set (match_operand:DF 0 "nonimmediate_soft_df_operand" "=w,?r,w ,r, m,w ,Uv,w,r")
+- (match_operand:DF 1 "soft_df_operand" " ?r,w,Dv,mF,r,UvF,w, w,r"))]
++ (match_operand:DF 1 "soft_df_operand" " ?r,w,Dy,mF,r,UvF,w, w,r"))]
+ "TARGET_ARM && TARGET_HARD_FLOAT && TARGET_VFP
+ && ( register_operand (operands[0], DFmode)
+ || register_operand (operands[1], DFmode))"
+@@ -280,13 +417,17 @@
+ case 1:
+ return \"fmrrd%?\\t%Q0, %R0, %P1\";
+ case 2:
++ gcc_assert (TARGET_VFP_DOUBLE);
+ return \"fconstd%?\\t%P0, #%G1\";
+ case 3: case 4:
+ return output_move_double (operands);
+ case 5: case 6:
+ return output_move_vfp (operands);
+ case 7:
+- return \"fcpyd%?\\t%P0, %P1\";
++ if (TARGET_VFP_SINGLE)
++ return \"fcpys%?\\t%0, %1\;fcpys%?\\t%p0, %p1\";
++ else
++ return \"fcpyd%?\\t%P0, %P1\";
+ case 8:
+ return \"#\";
+ default:
+@@ -296,14 +437,21 @@
+ "
+ [(set_attr "type"
+ "r_2_f,f_2_r,fconstd,f_loadd,f_stored,load2,store2,ffarithd,*")
+- (set_attr "length" "4,4,4,8,8,4,4,4,8")
++ (set_attr "neon_type" "neon_mcr_2_mcrr,neon_mrrc,*,*,*,*,*,neon_vmov,*")
++ (set (attr "length") (cond [(eq_attr "alternative" "3,4,8") (const_int 8)
++ (eq_attr "alternative" "7")
++ (if_then_else
++ (eq (symbol_ref "TARGET_VFP_SINGLE") (const_int 1))
++ (const_int 8)
++ (const_int 4))]
++ (const_int 4)))
+ (set_attr "pool_range" "*,*,*,1020,*,1020,*,*,*")
+ (set_attr "neg_pool_range" "*,*,*,1008,*,1008,*,*,*")]
+ )
+
+ (define_insn "*thumb2_movdf_vfp"
+ [(set (match_operand:DF 0 "nonimmediate_soft_df_operand" "=w,?r,w ,r, m,w ,Uv,w,r")
+- (match_operand:DF 1 "soft_df_operand" " ?r,w,Dv,mF,r,UvF,w, w,r"))]
++ (match_operand:DF 1 "soft_df_operand" " ?r,w,Dy,mF,r,UvF,w, w,r"))]
+ "TARGET_THUMB2 && TARGET_HARD_FLOAT && TARGET_VFP"
+ "*
+ {
+@@ -314,13 +462,17 @@
+ case 1:
+ return \"fmrrd%?\\t%Q0, %R0, %P1\";
+ case 2:
++ gcc_assert (TARGET_VFP_DOUBLE);
+ return \"fconstd%?\\t%P0, #%G1\";
+ case 3: case 4: case 8:
+ return output_move_double (operands);
+ case 5: case 6:
+ return output_move_vfp (operands);
+ case 7:
+- return \"fcpyd%?\\t%P0, %P1\";
++ if (TARGET_VFP_SINGLE)
++ return \"fcpys%?\\t%0, %1\;fcpys%?\\t%p0, %p1\";
++ else
++ return \"fcpyd%?\\t%P0, %P1\";
+ default:
+ abort ();
+ }
+@@ -328,7 +480,14 @@
+ "
+ [(set_attr "type"
+ "r_2_f,f_2_r,fconstd,load2,store2,f_load,f_store,ffarithd,*")
+- (set_attr "length" "4,4,4,8,8,4,4,4,8")
++ (set_attr "neon_type" "neon_mcr_2_mcrr,neon_mrrc,*,*,*,*,*,neon_vmov,*")
++ (set (attr "length") (cond [(eq_attr "alternative" "3,4,8") (const_int 8)
++ (eq_attr "alternative" "7")
++ (if_then_else
++ (eq (symbol_ref "TARGET_VFP_SINGLE") (const_int 1))
++ (const_int 8)
++ (const_int 4))]
++ (const_int 4)))
+ (set_attr "pool_range" "*,*,*,4096,*,1020,*,*,*")
+ (set_attr "neg_pool_range" "*,*,*,0,*,1008,*,*,*")]
+ )
+@@ -356,7 +515,8 @@
+ fmrs%D3\\t%0, %2\;fmrs%d3\\t%0, %1"
+ [(set_attr "conds" "use")
+ (set_attr "length" "4,4,8,4,4,8,4,4,8")
+- (set_attr "type" "fcpys,fcpys,fcpys,r_2_f,r_2_f,r_2_f,f_2_r,f_2_r,f_2_r")]
++ (set_attr "type" "fcpys,fcpys,fcpys,r_2_f,r_2_f,r_2_f,f_2_r,f_2_r,f_2_r")
++ (set_attr "neon_type" "neon_vmov,neon_vmov,neon_vmov,neon_mcr,neon_mcr,neon_mcr,neon_mrc,neon_mrc,neon_mrc")]
+ )
+
+ (define_insn "*thumb2_movsfcc_vfp"
+@@ -379,7 +539,8 @@
+ ite\\t%D3\;fmrs%D3\\t%0, %2\;fmrs%d3\\t%0, %1"
+ [(set_attr "conds" "use")
+ (set_attr "length" "6,6,10,6,6,10,6,6,10")
+- (set_attr "type" "fcpys,fcpys,fcpys,r_2_f,r_2_f,r_2_f,f_2_r,f_2_r,f_2_r")]
++ (set_attr "type" "fcpys,fcpys,fcpys,r_2_f,r_2_f,r_2_f,f_2_r,f_2_r,f_2_r")
++ (set_attr "neon_type" "neon_vmov,neon_vmov,neon_vmov,neon_mcr,neon_mcr,neon_mcr,neon_mrc,neon_mrc,neon_mrc")]
+ )
+
+ (define_insn "*movdfcc_vfp"
+@@ -389,7 +550,7 @@
+ [(match_operand 4 "cc_register" "") (const_int 0)])
+ (match_operand:DF 1 "s_register_operand" "0,w,w,0,?r,?r,0,w,w")
+ (match_operand:DF 2 "s_register_operand" "w,0,w,?r,0,?r,w,0,w")))]
+- "TARGET_ARM && TARGET_HARD_FLOAT && TARGET_VFP"
++ "TARGET_ARM && TARGET_HARD_FLOAT && TARGET_VFP_DOUBLE"
+ "@
+ fcpyd%D3\\t%P0, %P2
+ fcpyd%d3\\t%P0, %P1
+@@ -402,7 +563,8 @@
+ fmrrd%D3\\t%Q0, %R0, %P2\;fmrrd%d3\\t%Q0, %R0, %P1"
+ [(set_attr "conds" "use")
+ (set_attr "length" "4,4,8,4,4,8,4,4,8")
+- (set_attr "type" "ffarithd,ffarithd,ffarithd,r_2_f,r_2_f,r_2_f,f_2_r,f_2_r,f_2_r")]
++ (set_attr "type" "ffarithd,ffarithd,ffarithd,r_2_f,r_2_f,r_2_f,f_2_r,f_2_r,f_2_r")
++ (set_attr "neon_type" "neon_vmov,neon_vmov,neon_vmov,neon_mcr_2_mcrr,neon_mcr_2_mcrr,neon_mcr_2_mcrr,neon_mrrc,neon_mrrc,neon_mrrc")]
+ )
+
+ (define_insn "*thumb2_movdfcc_vfp"
+@@ -412,7 +574,7 @@
+ [(match_operand 4 "cc_register" "") (const_int 0)])
+ (match_operand:DF 1 "s_register_operand" "0,w,w,0,?r,?r,0,w,w")
+ (match_operand:DF 2 "s_register_operand" "w,0,w,?r,0,?r,w,0,w")))]
+- "TARGET_THUMB2 && TARGET_HARD_FLOAT && TARGET_VFP"
++ "TARGET_THUMB2 && TARGET_HARD_FLOAT && TARGET_VFP_DOUBLE"
+ "@
+ it\\t%D3\;fcpyd%D3\\t%P0, %P2
+ it\\t%d3\;fcpyd%d3\\t%P0, %P1
+@@ -425,7 +587,8 @@
+ ite\\t%D3\;fmrrd%D3\\t%Q0, %R0, %P2\;fmrrd%d3\\t%Q0, %R0, %P1"
+ [(set_attr "conds" "use")
+ (set_attr "length" "6,6,10,6,6,10,6,6,10")
+- (set_attr "type" "ffarithd,ffarithd,ffarithd,r_2_f,r_2_f,r_2_f,f_2_r,f_2_r,f_2_r")]
++ (set_attr "type" "ffarithd,ffarithd,ffarithd,r_2_f,r_2_f,r_2_f,f_2_r,f_2_r,f_2_r")
++ (set_attr "neon_type" "neon_vmov,neon_vmov,neon_vmov,neon_mcr_2_mcrr,neon_mcr_2_mcrr,neon_mcr_2_mcrr,neon_mrrc,neon_mrrc,neon_mrrc")]
+ )
+
+
+@@ -443,7 +606,7 @@
+ (define_insn "*absdf2_vfp"
+ [(set (match_operand:DF 0 "s_register_operand" "=w")
+ (abs:DF (match_operand:DF 1 "s_register_operand" "w")))]
+- "TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_VFP"
++ "TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_VFP_DOUBLE"
+ "fabsd%?\\t%P0, %P1"
+ [(set_attr "predicable" "yes")
+ (set_attr "type" "ffarithd")]
+@@ -463,12 +626,12 @@
+ (define_insn_and_split "*negdf2_vfp"
+ [(set (match_operand:DF 0 "s_register_operand" "=w,?r,?r")
+ (neg:DF (match_operand:DF 1 "s_register_operand" "w,0,r")))]
+- "TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_VFP"
++ "TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_VFP_DOUBLE"
+ "@
+ fnegd%?\\t%P0, %P1
+ #
+ #"
+- "TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_VFP && reload_completed
++ "TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_VFP_DOUBLE && reload_completed
+ && arm_general_register_operand (operands[0], DFmode)"
+ [(set (match_dup 0) (match_dup 1))]
+ "
+@@ -523,7 +686,7 @@
+ [(set (match_operand:DF 0 "s_register_operand" "=w")
+ (plus:DF (match_operand:DF 1 "s_register_operand" "w")
+ (match_operand:DF 2 "s_register_operand" "w")))]
+- "TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_VFP"
++ "TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_VFP_DOUBLE"
+ "faddd%?\\t%P0, %P1, %P2"
+ [(set_attr "predicable" "yes")
+ (set_attr "type" "faddd")]
+@@ -544,7 +707,7 @@
+ [(set (match_operand:DF 0 "s_register_operand" "=w")
+ (minus:DF (match_operand:DF 1 "s_register_operand" "w")
+ (match_operand:DF 2 "s_register_operand" "w")))]
+- "TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_VFP"
++ "TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_VFP_DOUBLE"
+ "fsubd%?\\t%P0, %P1, %P2"
+ [(set_attr "predicable" "yes")
+ (set_attr "type" "faddd")]
+@@ -567,7 +730,7 @@
+ [(set (match_operand:DF 0 "s_register_operand" "+w")
+ (div:DF (match_operand:DF 1 "s_register_operand" "w")
+ (match_operand:DF 2 "s_register_operand" "w")))]
+- "TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_VFP"
++ "TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_VFP_DOUBLE"
+ "fdivd%?\\t%P0, %P1, %P2"
+ [(set_attr "predicable" "yes")
+ (set_attr "type" "fdivd")]
+@@ -590,7 +753,7 @@
+ [(set (match_operand:DF 0 "s_register_operand" "+w")
+ (mult:DF (match_operand:DF 1 "s_register_operand" "w")
+ (match_operand:DF 2 "s_register_operand" "w")))]
+- "TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_VFP"
++ "TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_VFP_DOUBLE"
+ "fmuld%?\\t%P0, %P1, %P2"
+ [(set_attr "predicable" "yes")
+ (set_attr "type" "fmuld")]
+@@ -611,7 +774,7 @@
+ [(set (match_operand:DF 0 "s_register_operand" "+w")
+ (mult:DF (neg:DF (match_operand:DF 1 "s_register_operand" "w"))
+ (match_operand:DF 2 "s_register_operand" "w")))]
+- "TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_VFP"
++ "TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_VFP_DOUBLE"
+ "fnmuld%?\\t%P0, %P1, %P2"
+ [(set_attr "predicable" "yes")
+ (set_attr "type" "fmuld")]
+@@ -626,7 +789,8 @@
+ (plus:SF (mult:SF (match_operand:SF 2 "s_register_operand" "t")
+ (match_operand:SF 3 "s_register_operand" "t"))
+ (match_operand:SF 1 "s_register_operand" "0")))]
+- "TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_VFP"
++ "TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_VFP
++ && (!arm_tune_marvell_f || optimize_size)"
+ "fmacs%?\\t%0, %2, %3"
+ [(set_attr "predicable" "yes")
+ (set_attr "type" "fmacs")]
+@@ -637,7 +801,8 @@
+ (plus:DF (mult:DF (match_operand:DF 2 "s_register_operand" "w")
+ (match_operand:DF 3 "s_register_operand" "w"))
+ (match_operand:DF 1 "s_register_operand" "0")))]
+- "TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_VFP"
++ "TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_VFP_DOUBLE
++ && (!arm_tune_marvell_f || optimize_size)"
+ "fmacd%?\\t%P0, %P2, %P3"
+ [(set_attr "predicable" "yes")
+ (set_attr "type" "fmacd")]
+@@ -649,7 +814,8 @@
+ (minus:SF (mult:SF (match_operand:SF 2 "s_register_operand" "t")
+ (match_operand:SF 3 "s_register_operand" "t"))
+ (match_operand:SF 1 "s_register_operand" "0")))]
+- "TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_VFP"
++ "TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_VFP
++ && (!arm_tune_marvell_f || optimize_size)"
+ "fmscs%?\\t%0, %2, %3"
+ [(set_attr "predicable" "yes")
+ (set_attr "type" "fmacs")]
+@@ -660,7 +826,8 @@
+ (minus:DF (mult:DF (match_operand:DF 2 "s_register_operand" "w")
+ (match_operand:DF 3 "s_register_operand" "w"))
+ (match_operand:DF 1 "s_register_operand" "0")))]
+- "TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_VFP"
++ "TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_VFP_DOUBLE
++ && (!arm_tune_marvell_f || optimize_size)"
+ "fmscd%?\\t%P0, %P2, %P3"
+ [(set_attr "predicable" "yes")
+ (set_attr "type" "fmacd")]
+@@ -672,7 +839,8 @@
+ (minus:SF (match_operand:SF 1 "s_register_operand" "0")
+ (mult:SF (match_operand:SF 2 "s_register_operand" "t")
+ (match_operand:SF 3 "s_register_operand" "t"))))]
+- "TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_VFP"
++ "TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_VFP
++ && (!arm_tune_marvell_f || optimize_size)"
+ "fnmacs%?\\t%0, %2, %3"
+ [(set_attr "predicable" "yes")
+ (set_attr "type" "fmacs")]
+@@ -683,7 +851,8 @@
+ (minus:DF (match_operand:DF 1 "s_register_operand" "0")
+ (mult:DF (match_operand:DF 2 "s_register_operand" "w")
+ (match_operand:DF 3 "s_register_operand" "w"))))]
+- "TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_VFP"
++ "TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_VFP_DOUBLE
++ && (!arm_tune_marvell_f || optimize_size)"
+ "fnmacd%?\\t%P0, %P2, %P3"
+ [(set_attr "predicable" "yes")
+ (set_attr "type" "fmacd")]
+@@ -697,7 +866,8 @@
+ (neg:SF (match_operand:SF 2 "s_register_operand" "t"))
+ (match_operand:SF 3 "s_register_operand" "t"))
+ (match_operand:SF 1 "s_register_operand" "0")))]
+- "TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_VFP"
++ "TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_VFP
++ && (!arm_tune_marvell_f || optimize_size)"
+ "fnmscs%?\\t%0, %2, %3"
+ [(set_attr "predicable" "yes")
+ (set_attr "type" "fmacs")]
+@@ -709,7 +879,8 @@
+ (neg:DF (match_operand:DF 2 "s_register_operand" "w"))
+ (match_operand:DF 3 "s_register_operand" "w"))
+ (match_operand:DF 1 "s_register_operand" "0")))]
+- "TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_VFP"
++ "TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_VFP_DOUBLE
++ && (!arm_tune_marvell_f || optimize_size)"
+ "fnmscd%?\\t%P0, %P2, %P3"
+ [(set_attr "predicable" "yes")
+ (set_attr "type" "fmacd")]
+@@ -721,7 +892,7 @@
+ (define_insn "*extendsfdf2_vfp"
+ [(set (match_operand:DF 0 "s_register_operand" "=w")
+ (float_extend:DF (match_operand:SF 1 "s_register_operand" "t")))]
+- "TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_VFP"
++ "TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_VFP_DOUBLE"
+ "fcvtds%?\\t%P0, %1"
+ [(set_attr "predicable" "yes")
+ (set_attr "type" "f_cvt")]
+@@ -730,12 +901,30 @@
+ (define_insn "*truncdfsf2_vfp"
+ [(set (match_operand:SF 0 "s_register_operand" "=t")
+ (float_truncate:SF (match_operand:DF 1 "s_register_operand" "w")))]
+- "TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_VFP"
++ "TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_VFP_DOUBLE"
+ "fcvtsd%?\\t%0, %P1"
+ [(set_attr "predicable" "yes")
+ (set_attr "type" "f_cvt")]
+ )
+
++(define_insn "extendhfsf2"
++ [(set (match_operand:SF 0 "s_register_operand" "=t")
++ (float_extend:SF (match_operand:HF 1 "s_register_operand" "t")))]
++ "TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_FP16"
++ "vcvtb%?.f32.f16\\t%0, %1"
++ [(set_attr "predicable" "yes")
++ (set_attr "type" "f_cvt")]
++)
++
++(define_insn "truncsfhf2"
++ [(set (match_operand:HF 0 "s_register_operand" "=t")
++ (float_truncate:HF (match_operand:SF 1 "s_register_operand" "t")))]
++ "TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_FP16"
++ "vcvtb%?.f16.f32\\t%0, %1"
++ [(set_attr "predicable" "yes")
++ (set_attr "type" "f_cvt")]
++)
++
+ (define_insn "*truncsisf2_vfp"
+ [(set (match_operand:SI 0 "s_register_operand" "=t")
+ (fix:SI (fix:SF (match_operand:SF 1 "s_register_operand" "t"))))]
+@@ -748,7 +937,7 @@
+ (define_insn "*truncsidf2_vfp"
+ [(set (match_operand:SI 0 "s_register_operand" "=t")
+ (fix:SI (fix:DF (match_operand:DF 1 "s_register_operand" "w"))))]
+- "TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_VFP"
++ "TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_VFP_DOUBLE"
+ "ftosizd%?\\t%0, %P1"
+ [(set_attr "predicable" "yes")
+ (set_attr "type" "f_cvt")]
+@@ -767,7 +956,7 @@
+ (define_insn "fixuns_truncdfsi2"
+ [(set (match_operand:SI 0 "s_register_operand" "=t")
+ (unsigned_fix:SI (fix:DF (match_operand:DF 1 "s_register_operand" "t"))))]
+- "TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_VFP"
++ "TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_VFP_DOUBLE"
+ "ftouizd%?\\t%0, %P1"
+ [(set_attr "predicable" "yes")
+ (set_attr "type" "f_cvt")]
+@@ -786,7 +975,7 @@
+ (define_insn "*floatsidf2_vfp"
+ [(set (match_operand:DF 0 "s_register_operand" "=w")
+ (float:DF (match_operand:SI 1 "s_register_operand" "t")))]
+- "TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_VFP"
++ "TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_VFP_DOUBLE"
+ "fsitod%?\\t%P0, %1"
+ [(set_attr "predicable" "yes")
+ (set_attr "type" "f_cvt")]
+@@ -805,7 +994,7 @@
+ (define_insn "floatunssidf2"
+ [(set (match_operand:DF 0 "s_register_operand" "=w")
+ (unsigned_float:DF (match_operand:SI 1 "s_register_operand" "t")))]
+- "TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_VFP"
++ "TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_VFP_DOUBLE"
+ "fuitod%?\\t%P0, %1"
+ [(set_attr "predicable" "yes")
+ (set_attr "type" "f_cvt")]
+@@ -826,7 +1015,7 @@
+ (define_insn "*sqrtdf2_vfp"
+ [(set (match_operand:DF 0 "s_register_operand" "=w")
+ (sqrt:DF (match_operand:DF 1 "s_register_operand" "w")))]
+- "TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_VFP"
++ "TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_VFP_DOUBLE"
+ "fsqrtd%?\\t%P0, %P1"
+ [(set_attr "predicable" "yes")
+ (set_attr "type" "fdivd")]
+@@ -878,9 +1067,9 @@
+ [(set (reg:CCFP CC_REGNUM)
+ (compare:CCFP (match_operand:DF 0 "s_register_operand" "w")
+ (match_operand:DF 1 "vfp_compare_operand" "wG")))]
+- "TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_VFP"
++ "TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_VFP_DOUBLE"
+ "#"
+- "TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_VFP"
++ "TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_VFP_DOUBLE"
+ [(set (reg:CCFP VFPCC_REGNUM)
+ (compare:CCFP (match_dup 0)
+ (match_dup 1)))
+@@ -893,9 +1082,9 @@
+ [(set (reg:CCFPE CC_REGNUM)
+ (compare:CCFPE (match_operand:DF 0 "s_register_operand" "w")
+ (match_operand:DF 1 "vfp_compare_operand" "wG")))]
+- "TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_VFP"
++ "TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_VFP_DOUBLE"
+ "#"
+- "TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_VFP"
++ "TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_VFP_DOUBLE"
+ [(set (reg:CCFPE VFPCC_REGNUM)
+ (compare:CCFPE (match_dup 0)
+ (match_dup 1)))
+@@ -935,7 +1124,7 @@
+ [(set (reg:CCFP VFPCC_REGNUM)
+ (compare:CCFP (match_operand:DF 0 "s_register_operand" "w,w")
+ (match_operand:DF 1 "vfp_compare_operand" "w,G")))]
+- "TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_VFP"
++ "TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_VFP_DOUBLE"
+ "@
+ fcmpd%?\\t%P0, %P1
+ fcmpzd%?\\t%P0"
+@@ -947,7 +1136,7 @@
+ [(set (reg:CCFPE VFPCC_REGNUM)
+ (compare:CCFPE (match_operand:DF 0 "s_register_operand" "w,w")
+ (match_operand:DF 1 "vfp_compare_operand" "w,G")))]
+- "TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_VFP"
++ "TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_VFP_DOUBLE"
+ "@
+ fcmped%?\\t%P0, %P1
+ fcmpezd%?\\t%P0"
+diff -Nur a/gcc/config/arm/vxworks.h b/gcc/config/arm/vxworks.h
+--- a/gcc/config/arm/vxworks.h 2009-02-20 16:20:38.000000000 +0100
++++ b/gcc/config/arm/vxworks.h 2010-01-25 09:50:28.995687913 +0100
+@@ -97,7 +97,7 @@
+ /* There is no default multilib. */
+ #undef MULTILIB_DEFAULTS
+
+-#define FPUTYPE_DEFAULT FPUTYPE_VFP
++#define FPUTYPE_DEFAULT "vfp"
+
+ #undef FUNCTION_PROFILER
+ #define FUNCTION_PROFILER VXWORKS_FUNCTION_PROFILER
+diff -Nur a/gcc/config/arm/wrs-linux.h b/gcc/config/arm/wrs-linux.h
+--- a/gcc/config/arm/wrs-linux.h 1970-01-01 01:00:00.000000000 +0100
++++ b/gcc/config/arm/wrs-linux.h 2010-01-25 09:50:28.995687913 +0100
+@@ -0,0 +1,76 @@
++/* Wind River GNU/Linux Configuration.
++ Copyright (C) 2006, 2007, 2008
++ Free Software Foundation, Inc.
++
++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/>. */
++
++/* Use the ARM926EJ-S by default. */
++#undef SUBTARGET_CPU_DEFAULT
++#define SUBTARGET_CPU_DEFAULT TARGET_CPU_arm926ejs
++
++/* Add a -tiwmmxt option for convenience in generating multilibs.
++ This option generates big-endian IWMMXT code. */
++#undef CC1_SPEC
++#define CC1_SPEC " \
++ %{tarm926ej-s: -mcpu=arm926ej-s ; \
++ tiwmmxt: -mcpu=iwmmxt ; \
++ tiwmmxt2: -mcpu=iwmmxt ; \
++ txscale: -mcpu=xscale -mbig-endian ; \
++ tarm920t: -mcpu=arm920t ; \
++ tthumb2: %{!mcpu=*:%{!march=*:-march=armv6t2}} -mthumb ; \
++ tcortex-a8-be8: -mcpu=cortex-a8 -mbig-endian -mfloat-abi=softfp \
++ -mfpu=neon } \
++ %{txscale:%{mfloat-abi=softfp:%eXScale VFP multilib not provided}} \
++ %{tarm920t:%{mfloat-abi=softfp:%eARM920T VFP multilib not provided}} \
++ %{profile:-p}"
++
++/* Since the ARM926EJ-S is the default processor, we do not need to
++ provide an explicit multilib for that processor. */
++#undef MULTILIB_DEFAULTS
++#define MULTILIB_DEFAULTS \
++ { "tarm926ej-s" }
++
++/* The GLIBC headers are in /usr/include, relative to the sysroot; the
++ uClibc headers are in /uclibc/usr/include. */
++#undef SYSROOT_HEADERS_SUFFIX_SPEC
++#define SYSROOT_HEADERS_SUFFIX_SPEC \
++ "%{muclibc:/uclibc}"
++
++/* Translate -tiwmmxt appropriately for the assembler. The -meabi=5
++ option is the relevant part of SUBTARGET_EXTRA_ASM_SPEC in bpabi.h. */
++#undef SUBTARGET_EXTRA_ASM_SPEC
++#define SUBTARGET_EXTRA_ASM_SPEC \
++ "%{tiwmmxt2:-mcpu=iwmmxt2} %{tiwmmxt:-mcpu=iwmmxt} %{txscale:-mcpu=xscale -EB} %{tcortex-a8-be8:-mcpu=cortex-a8 -EB} -meabi=5"
++
++/* Translate -tiwmmxt for the linker. */
++#undef SUBTARGET_EXTRA_LINK_SPEC
++#define SUBTARGET_EXTRA_LINK_SPEC \
++ " %{tiwmmxt:-m armelf_linux_eabi ; \
++ txscale:-m armelfb_linux_eabi ; \
++ tcortex-a8-be8:-m armelfb_linux_eabi %{!r:--be8} ; \
++ : -m armelf_linux_eabi}"
++
++/* The various C libraries each have their own subdirectory. */
++#undef SYSROOT_SUFFIX_SPEC
++#define SYSROOT_SUFFIX_SPEC \
++ "%{muclibc:/uclibc}%{tiwmmxt:/tiwmmxt ; \
++ tiwmmxt2:/tiwmmxt ; \
++ txscale:/txscale ; \
++ tarm920t:/tarm920t ; \
++ tthumb2:/thumb2 ; \
++ tcortex-a8-be8:/cortex-a8-be8}%{!tthumb2:%{!tcortex-a8-be8:%{mfloat-abi=softfp:/softfp}}}"
++
+diff -Nur a/gcc/config/i386/atom.md b/gcc/config/i386/atom.md
+--- a/gcc/config/i386/atom.md 1970-01-01 01:00:00.000000000 +0100
++++ b/gcc/config/i386/atom.md 2010-01-25 09:50:28.995687913 +0100
+@@ -0,0 +1,795 @@
++;; Atom Scheduling
++;; Copyright (C) 2009 Free Software Foundation, Inc.
++;;
++;; 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/>.
++;;
++;; Atom is an in-order core with two integer pipelines.
++
++
++(define_attr "atom_unit" "sishuf,simul,jeu,complex,other"
++ (const_string "other"))
++
++(define_attr "atom_sse_attr" "rcp,movdup,lfence,fence,prefetch,sqrt,mxcsr,other"
++ (const_string "other"))
++
++(define_automaton "atom")
++
++;; Atom has two ports: port 0 and port 1 connecting to all execution units
++(define_cpu_unit "atom-port-0,atom-port-1" "atom")
++
++;; EU: Execution Unit
++;; Atom EUs are connected by port 0 or port 1.
++
++(define_cpu_unit "atom-eu-0, atom-eu-1,
++ atom-imul-1, atom-imul-2, atom-imul-3, atom-imul-4"
++ "atom")
++
++;; Some EUs have duplicated copied and can be accessed via either
++;; port 0 or port 1
++;; (define_reservation "atom-port-either" "(atom-port-0 | atom-port-1)")
++
++;;; Some instructions is dual-pipe execution, need both ports
++;;; Complex multi-op macro-instructoins need both ports and all EUs
++(define_reservation "atom-port-dual" "(atom-port-0 + atom-port-1)")
++(define_reservation "atom-all-eu" "(atom-eu-0 + atom-eu-1 +
++ atom-imul-1 + atom-imul-2 + atom-imul-3 +
++ atom-imul-4)")
++
++;;; Most of simple instructions have 1 cycle latency. Some of them
++;;; issue in port 0, some in port 0 and some in either port.
++(define_reservation "atom-simple-0" "(atom-port-0 + atom-eu-0)")
++(define_reservation "atom-simple-1" "(atom-port-1 + atom-eu-1)")
++(define_reservation "atom-simple-either" "(atom-simple-0 | atom-simple-1)")
++
++;;; Some insn issues in port 0 with 3 cycle latency and 1 cycle tput
++(define_reservation "atom-eu-0-3-1" "(atom-port-0 + atom-eu-0, nothing*2)")
++
++;;; fmul insn can have 4 or 5 cycles latency
++(define_reservation "atom-fmul-5c" "(atom-port-0 + atom-eu-0), nothing*4")
++(define_reservation "atom-fmul-4c" "(atom-port-0 + atom-eu-0), nothing*3")
++
++;;; fadd can has 5 cycles latency depends on instruction forms
++(define_reservation "atom-fadd-5c" "(atom-port-1 + atom-eu-1), nothing*5")
++
++;;; imul insn has 5 cycles latency
++(define_reservation "atom-imul-32"
++ "atom-imul-1, atom-imul-2, atom-imul-3, atom-imul-4,
++ atom-port-0")
++;;; imul instruction excludes other non-FP instructions.
++(exclusion_set "atom-eu-0, atom-eu-1"
++ "atom-imul-1, atom-imul-2, atom-imul-3, atom-imul-4")
++
++;;; dual-execution instructions can have 1,2,4,5 cycles latency depends on
++;;; instruction forms
++(define_reservation "atom-dual-1c" "(atom-port-dual + atom-eu-0 + atom-eu-1)")
++(define_reservation "atom-dual-2c"
++ "(atom-port-dual + atom-eu-0 + atom-eu-1, nothing)")
++(define_reservation "atom-dual-5c"
++ "(atom-port-dual + atom-eu-0 + atom-eu-1, nothing*4)")
++
++;;; Complex macro-instruction has variants of latency, and uses both ports.
++(define_reservation "atom-complex" "(atom-port-dual + atom-all-eu)")
++
++(define_insn_reservation "atom_other" 9
++ (and (eq_attr "cpu" "atom")
++ (and (eq_attr "type" "other")
++ (eq_attr "atom_unit" "!jeu")))
++ "atom-complex, atom-all-eu*8")
++
++;; return has type "other" with atom_unit "jeu"
++(define_insn_reservation "atom_other_2" 1
++ (and (eq_attr "cpu" "atom")
++ (and (eq_attr "type" "other")
++ (eq_attr "atom_unit" "jeu")))
++ "atom-dual-1c")
++
++(define_insn_reservation "atom_multi" 9
++ (and (eq_attr "cpu" "atom")
++ (eq_attr "type" "multi"))
++ "atom-complex, atom-all-eu*8")
++
++;; Normal alu insns without carry
++(define_insn_reservation "atom_alu" 1
++ (and (eq_attr "cpu" "atom")
++ (and (eq_attr "type" "alu")
++ (and (eq_attr "memory" "none")
++ (eq_attr "use_carry" "0"))))
++ "atom-simple-either")
++
++;; Normal alu insns without carry
++(define_insn_reservation "atom_alu_mem" 1
++ (and (eq_attr "cpu" "atom")
++ (and (eq_attr "type" "alu")
++ (and (eq_attr "memory" "!none")
++ (eq_attr "use_carry" "0"))))
++ "atom-simple-either")
++
++;; Alu insn consuming CF, such as add/sbb
++(define_insn_reservation "atom_alu_carry" 1
++ (and (eq_attr "cpu" "atom")
++ (and (eq_attr "type" "alu")
++ (and (eq_attr "memory" "none")
++ (eq_attr "use_carry" "1"))))
++ "atom-simple-either")
++
++;; Alu insn consuming CF, such as add/sbb
++(define_insn_reservation "atom_alu_carry_mem" 1
++ (and (eq_attr "cpu" "atom")
++ (and (eq_attr "type" "alu")
++ (and (eq_attr "memory" "!none")
++ (eq_attr "use_carry" "1"))))
++ "atom-simple-either")
++
++(define_insn_reservation "atom_alu1" 1
++ (and (eq_attr "cpu" "atom")
++ (and (eq_attr "type" "alu1")
++ (eq_attr "memory" "none")))
++ "atom-simple-either")
++
++(define_insn_reservation "atom_alu1_mem" 1
++ (and (eq_attr "cpu" "atom")
++ (and (eq_attr "type" "alu1")
++ (eq_attr "memory" "!none")))
++ "atom-simple-either")
++
++(define_insn_reservation "atom_negnot" 1
++ (and (eq_attr "cpu" "atom")
++ (and (eq_attr "type" "negnot")
++ (eq_attr "memory" "none")))
++ "atom-simple-either")
++
++(define_insn_reservation "atom_negnot_mem" 1
++ (and (eq_attr "cpu" "atom")
++ (and (eq_attr "type" "negnot")
++ (eq_attr "memory" "!none")))
++ "atom-simple-either")
++
++(define_insn_reservation "atom_imov" 1
++ (and (eq_attr "cpu" "atom")
++ (and (eq_attr "type" "imov")
++ (eq_attr "memory" "none")))
++ "atom-simple-either")
++
++(define_insn_reservation "atom_imov_mem" 1
++ (and (eq_attr "cpu" "atom")
++ (and (eq_attr "type" "imov")
++ (eq_attr "memory" "!none")))
++ "atom-simple-either")
++
++;; 16<-16, 32<-32
++(define_insn_reservation "atom_imovx" 1
++ (and (eq_attr "cpu" "atom")
++ (and (eq_attr "type" "imovx")
++ (and (eq_attr "memory" "none")
++ (ior (and (match_operand:HI 0 "register_operand")
++ (match_operand:HI 1 "general_operand"))
++ (and (match_operand:SI 0 "register_operand")
++ (match_operand:SI 1 "general_operand"))))))
++ "atom-simple-either")
++
++;; 16<-16, 32<-32, mem
++(define_insn_reservation "atom_imovx_mem" 1
++ (and (eq_attr "cpu" "atom")
++ (and (eq_attr "type" "imovx")
++ (and (eq_attr "memory" "!none")
++ (ior (and (match_operand:HI 0 "register_operand")
++ (match_operand:HI 1 "general_operand"))
++ (and (match_operand:SI 0 "register_operand")
++ (match_operand:SI 1 "general_operand"))))))
++ "atom-simple-either")
++
++;; 32<-16, 32<-8, 64<-16, 64<-8, 64<-32, 8<-8
++(define_insn_reservation "atom_imovx_2" 1
++ (and (eq_attr "cpu" "atom")
++ (and (eq_attr "type" "imovx")
++ (and (eq_attr "memory" "none")
++ (ior (match_operand:QI 0 "register_operand")
++ (ior (and (match_operand:SI 0 "register_operand")
++ (not (match_operand:SI 1 "general_operand")))
++ (match_operand:DI 0 "register_operand"))))))
++ "atom-simple-0")
++
++;; 32<-16, 32<-8, 64<-16, 64<-8, 64<-32, 8<-8, mem
++(define_insn_reservation "atom_imovx_2_mem" 1
++ (and (eq_attr "cpu" "atom")
++ (and (eq_attr "type" "imovx")
++ (and (eq_attr "memory" "!none")
++ (ior (match_operand:QI 0 "register_operand")
++ (ior (and (match_operand:SI 0 "register_operand")
++ (not (match_operand:SI 1 "general_operand")))
++ (match_operand:DI 0 "register_operand"))))))
++ "atom-simple-0")
++
++;; 16<-8
++(define_insn_reservation "atom_imovx_3" 3
++ (and (eq_attr "cpu" "atom")
++ (and (eq_attr "type" "imovx")
++ (and (match_operand:HI 0 "register_operand")
++ (match_operand:QI 1 "general_operand"))))
++ "atom-complex, atom-all-eu*2")
++
++(define_insn_reservation "atom_lea" 1
++ (and (eq_attr "cpu" "atom")
++ (and (eq_attr "type" "lea")
++ (eq_attr "mode" "!HI")))
++ "atom-simple-either")
++
++;; lea 16bit address is complex insn
++(define_insn_reservation "atom_lea_2" 2
++ (and (eq_attr "cpu" "atom")
++ (and (eq_attr "type" "lea")
++ (eq_attr "mode" "HI")))
++ "atom-complex, atom-all-eu")
++
++(define_insn_reservation "atom_incdec" 1
++ (and (eq_attr "cpu" "atom")
++ (and (eq_attr "type" "incdec")
++ (eq_attr "memory" "none")))
++ "atom-simple-either")
++
++(define_insn_reservation "atom_incdec_mem" 1
++ (and (eq_attr "cpu" "atom")
++ (and (eq_attr "type" "incdec")
++ (eq_attr "memory" "!none")))
++ "atom-simple-either")
++
++;; simple shift instruction use SHIFT eu, none memory
++(define_insn_reservation "atom_ishift" 1
++ (and (eq_attr "cpu" "atom")
++ (and (eq_attr "type" "ishift")
++ (and (eq_attr "memory" "none") (eq_attr "prefix_0f" "0"))))
++ "atom-simple-0")
++
++;; simple shift instruction use SHIFT eu, memory
++(define_insn_reservation "atom_ishift_mem" 1
++ (and (eq_attr "cpu" "atom")
++ (and (eq_attr "type" "ishift")
++ (and (eq_attr "memory" "!none") (eq_attr "prefix_0f" "0"))))
++ "atom-simple-0")
++
++;; DF shift (prefixed with 0f) is complex insn with latency of 7 cycles
++(define_insn_reservation "atom_ishift_3" 7
++ (and (eq_attr "cpu" "atom")
++ (and (eq_attr "type" "ishift")
++ (eq_attr "prefix_0f" "1")))
++ "atom-complex, atom-all-eu*6")
++
++(define_insn_reservation "atom_ishift1" 1
++ (and (eq_attr "cpu" "atom")
++ (and (eq_attr "type" "ishift1")
++ (eq_attr "memory" "none")))
++ "atom-simple-0")
++
++(define_insn_reservation "atom_ishift1_mem" 1
++ (and (eq_attr "cpu" "atom")
++ (and (eq_attr "type" "ishift1")
++ (eq_attr "memory" "!none")))
++ "atom-simple-0")
++
++(define_insn_reservation "atom_rotate" 1
++ (and (eq_attr "cpu" "atom")
++ (and (eq_attr "type" "rotate")
++ (eq_attr "memory" "none")))
++ "atom-simple-0")
++
++(define_insn_reservation "atom_rotate_mem" 1
++ (and (eq_attr "cpu" "atom")
++ (and (eq_attr "type" "rotate")
++ (eq_attr "memory" "!none")))
++ "atom-simple-0")
++
++(define_insn_reservation "atom_rotate1" 1
++ (and (eq_attr "cpu" "atom")
++ (and (eq_attr "type" "rotate1")
++ (eq_attr "memory" "none")))
++ "atom-simple-0")
++
++(define_insn_reservation "atom_rotate1_mem" 1
++ (and (eq_attr "cpu" "atom")
++ (and (eq_attr "type" "rotate1")
++ (eq_attr "memory" "!none")))
++ "atom-simple-0")
++
++(define_insn_reservation "atom_imul" 5
++ (and (eq_attr "cpu" "atom")
++ (and (eq_attr "type" "imul")
++ (and (eq_attr "memory" "none") (eq_attr "mode" "SI"))))
++ "atom-imul-32")
++
++(define_insn_reservation "atom_imul_mem" 5
++ (and (eq_attr "cpu" "atom")
++ (and (eq_attr "type" "imul")
++ (and (eq_attr "memory" "!none") (eq_attr "mode" "SI"))))
++ "atom-imul-32")
++
++;; latency set to 10 as common 64x64 imul
++(define_insn_reservation "atom_imul_3" 10
++ (and (eq_attr "cpu" "atom")
++ (and (eq_attr "type" "imul")
++ (eq_attr "mode" "!SI")))
++ "atom-complex, atom-all-eu*9")
++
++(define_insn_reservation "atom_idiv" 65
++ (and (eq_attr "cpu" "atom")
++ (eq_attr "type" "idiv"))
++ "atom-complex, atom-all-eu*32, nothing*32")
++
++(define_insn_reservation "atom_icmp" 1
++ (and (eq_attr "cpu" "atom")
++ (and (eq_attr "type" "icmp")
++ (eq_attr "memory" "none")))
++ "atom-simple-either")
++
++(define_insn_reservation "atom_icmp_mem" 1
++ (and (eq_attr "cpu" "atom")
++ (and (eq_attr "type" "icmp")
++ (eq_attr "memory" "!none")))
++ "atom-simple-either")
++
++(define_insn_reservation "atom_test" 1
++ (and (eq_attr "cpu" "atom")
++ (and (eq_attr "type" "test")
++ (eq_attr "memory" "none")))
++ "atom-simple-either")
++
++(define_insn_reservation "atom_test_mem" 1
++ (and (eq_attr "cpu" "atom")
++ (and (eq_attr "type" "test")
++ (eq_attr "memory" "!none")))
++ "atom-simple-either")
++
++(define_insn_reservation "atom_ibr" 1
++ (and (eq_attr "cpu" "atom")
++ (and (eq_attr "type" "ibr")
++ (eq_attr "memory" "!load")))
++ "atom-simple-1")
++
++;; complex if jump target is from address
++(define_insn_reservation "atom_ibr_2" 2
++ (and (eq_attr "cpu" "atom")
++ (and (eq_attr "type" "ibr")
++ (eq_attr "memory" "load")))
++ "atom-complex, atom-all-eu")
++
++(define_insn_reservation "atom_setcc" 1
++ (and (eq_attr "cpu" "atom")
++ (and (eq_attr "type" "setcc")
++ (eq_attr "memory" "!store")))
++ "atom-simple-either")
++
++;; 2 cycles complex if target is in memory
++(define_insn_reservation "atom_setcc_2" 2
++ (and (eq_attr "cpu" "atom")
++ (and (eq_attr "type" "setcc")
++ (eq_attr "memory" "store")))
++ "atom-complex, atom-all-eu")
++
++(define_insn_reservation "atom_icmov" 1
++ (and (eq_attr "cpu" "atom")
++ (and (eq_attr "type" "icmov")
++ (eq_attr "memory" "none")))
++ "atom-simple-either")
++
++(define_insn_reservation "atom_icmov_mem" 1
++ (and (eq_attr "cpu" "atom")
++ (and (eq_attr "type" "icmov")
++ (eq_attr "memory" "!none")))
++ "atom-simple-either")
++
++;; UCODE if segreg, ignored
++(define_insn_reservation "atom_push" 2
++ (and (eq_attr "cpu" "atom")
++ (eq_attr "type" "push"))
++ "atom-dual-2c")
++
++;; pop r64 is 1 cycle. UCODE if segreg, ignored
++(define_insn_reservation "atom_pop" 1
++ (and (eq_attr "cpu" "atom")
++ (and (eq_attr "type" "pop")
++ (eq_attr "mode" "DI")))
++ "atom-dual-1c")
++
++;; pop non-r64 is 2 cycles. UCODE if segreg, ignored
++(define_insn_reservation "atom_pop_2" 2
++ (and (eq_attr "cpu" "atom")
++ (and (eq_attr "type" "pop")
++ (eq_attr "mode" "!DI")))
++ "atom-dual-2c")
++
++;; UCODE if segreg, ignored
++(define_insn_reservation "atom_call" 1
++ (and (eq_attr "cpu" "atom")
++ (eq_attr "type" "call"))
++ "atom-dual-1c")
++
++(define_insn_reservation "atom_callv" 1
++ (and (eq_attr "cpu" "atom")
++ (eq_attr "type" "callv"))
++ "atom-dual-1c")
++
++(define_insn_reservation "atom_leave" 3
++ (and (eq_attr "cpu" "atom")
++ (eq_attr "type" "leave"))
++ "atom-complex, atom-all-eu*2")
++
++(define_insn_reservation "atom_str" 3
++ (and (eq_attr "cpu" "atom")
++ (eq_attr "type" "str"))
++ "atom-complex, atom-all-eu*2")
++
++(define_insn_reservation "atom_sselog" 1
++ (and (eq_attr "cpu" "atom")
++ (and (eq_attr "type" "sselog")
++ (eq_attr "memory" "none")))
++ "atom-simple-either")
++
++(define_insn_reservation "atom_sselog_mem" 1
++ (and (eq_attr "cpu" "atom")
++ (and (eq_attr "type" "sselog")
++ (eq_attr "memory" "!none")))
++ "atom-simple-either")
++
++(define_insn_reservation "atom_sselog1" 1
++ (and (eq_attr "cpu" "atom")
++ (and (eq_attr "type" "sselog1")
++ (eq_attr "memory" "none")))
++ "atom-simple-0")
++
++(define_insn_reservation "atom_sselog1_mem" 1
++ (and (eq_attr "cpu" "atom")
++ (and (eq_attr "type" "sselog1")
++ (eq_attr "memory" "!none")))
++ "atom-simple-0")
++
++;; not pmad, not psad
++(define_insn_reservation "atom_sseiadd" 1
++ (and (eq_attr "cpu" "atom")
++ (and (eq_attr "type" "sseiadd")
++ (and (not (match_operand:V2DI 0 "register_operand"))
++ (and (eq_attr "atom_unit" "!simul")
++ (eq_attr "atom_unit" "!complex")))))
++ "atom-simple-either")
++
++;; pmad, psad and 64
++(define_insn_reservation "atom_sseiadd_2" 4
++ (and (eq_attr "cpu" "atom")
++ (and (eq_attr "type" "sseiadd")
++ (and (not (match_operand:V2DI 0 "register_operand"))
++ (and (eq_attr "atom_unit" "simul" )
++ (eq_attr "mode" "DI")))))
++ "atom-fmul-4c")
++
++;; pmad, psad and 128
++(define_insn_reservation "atom_sseiadd_3" 5
++ (and (eq_attr "cpu" "atom")
++ (and (eq_attr "type" "sseiadd")
++ (and (not (match_operand:V2DI 0 "register_operand"))
++ (and (eq_attr "atom_unit" "simul" )
++ (eq_attr "mode" "TI")))))
++ "atom-fmul-5c")
++
++;; if paddq(64 bit op), phadd/phsub
++(define_insn_reservation "atom_sseiadd_4" 6
++ (and (eq_attr "cpu" "atom")
++ (and (eq_attr "type" "sseiadd")
++ (ior (match_operand:V2DI 0 "register_operand")
++ (eq_attr "atom_unit" "complex"))))
++ "atom-complex, atom-all-eu*5")
++
++;; if immediate op.
++(define_insn_reservation "atom_sseishft" 1
++ (and (eq_attr "cpu" "atom")
++ (and (eq_attr "type" "sseishft")
++ (and (eq_attr "atom_unit" "!sishuf")
++ (match_operand 2 "immediate_operand"))))
++ "atom-simple-either")
++
++;; if palignr or psrldq
++(define_insn_reservation "atom_sseishft_2" 1
++ (and (eq_attr "cpu" "atom")
++ (and (eq_attr "type" "sseishft")
++ (and (eq_attr "atom_unit" "sishuf")
++ (match_operand 2 "immediate_operand"))))
++ "atom-simple-0")
++
++;; if reg/mem op
++(define_insn_reservation "atom_sseishft_3" 2
++ (and (eq_attr "cpu" "atom")
++ (and (eq_attr "type" "sseishft")
++ (not (match_operand 2 "immediate_operand"))))
++ "atom-complex, atom-all-eu")
++
++(define_insn_reservation "atom_sseimul" 1
++ (and (eq_attr "cpu" "atom")
++ (eq_attr "type" "sseimul"))
++ "atom-simple-0")
++
++;; rcpss or rsqrtss
++(define_insn_reservation "atom_sse" 4
++ (and (eq_attr "cpu" "atom")
++ (and (eq_attr "type" "sse")
++ (and (eq_attr "atom_sse_attr" "rcp") (eq_attr "mode" "SF"))))
++ "atom-fmul-4c")
++
++;; movshdup, movsldup. Suggest to type sseishft
++(define_insn_reservation "atom_sse_2" 1
++ (and (eq_attr "cpu" "atom")
++ (and (eq_attr "type" "sse")
++ (eq_attr "atom_sse_attr" "movdup")))
++ "atom-simple-0")
++
++;; lfence
++(define_insn_reservation "atom_sse_3" 1
++ (and (eq_attr "cpu" "atom")
++ (and (eq_attr "type" "sse")
++ (eq_attr "atom_sse_attr" "lfence")))
++ "atom-simple-either")
++
++;; sfence,clflush,mfence, prefetch
++(define_insn_reservation "atom_sse_4" 1
++ (and (eq_attr "cpu" "atom")
++ (and (eq_attr "type" "sse")
++ (ior (eq_attr "atom_sse_attr" "fence")
++ (eq_attr "atom_sse_attr" "prefetch"))))
++ "atom-simple-0")
++
++;; rcpps, rsqrtss, sqrt, ldmxcsr
++(define_insn_reservation "atom_sse_5" 7
++ (and (eq_attr "cpu" "atom")
++ (and (eq_attr "type" "sse")
++ (ior (ior (eq_attr "atom_sse_attr" "sqrt")
++ (eq_attr "atom_sse_attr" "mxcsr"))
++ (and (eq_attr "atom_sse_attr" "rcp")
++ (eq_attr "mode" "V4SF")))))
++ "atom-complex, atom-all-eu*6")
++
++;; xmm->xmm
++(define_insn_reservation "atom_ssemov" 1
++ (and (eq_attr "cpu" "atom")
++ (and (eq_attr "type" "ssemov")
++ (and (match_operand 0 "register_operand" "xy") (match_operand 1 "register_operand" "xy"))))
++ "atom-simple-either")
++
++;; reg->xmm
++(define_insn_reservation "atom_ssemov_2" 1
++ (and (eq_attr "cpu" "atom")
++ (and (eq_attr "type" "ssemov")
++ (and (match_operand 0 "register_operand" "xy") (match_operand 1 "register_operand" "r"))))
++ "atom-simple-0")
++
++;; xmm->reg
++(define_insn_reservation "atom_ssemov_3" 3
++ (and (eq_attr "cpu" "atom")
++ (and (eq_attr "type" "ssemov")
++ (and (match_operand 0 "register_operand" "r") (match_operand 1 "register_operand" "xy"))))
++ "atom-eu-0-3-1")
++
++;; mov mem
++(define_insn_reservation "atom_ssemov_4" 1
++ (and (eq_attr "cpu" "atom")
++ (and (eq_attr "type" "ssemov")
++ (and (eq_attr "movu" "0") (eq_attr "memory" "!none"))))
++ "atom-simple-0")
++
++;; movu mem
++(define_insn_reservation "atom_ssemov_5" 2
++ (and (eq_attr "cpu" "atom")
++ (and (eq_attr "type" "ssemov")
++ (ior (eq_attr "movu" "1") (eq_attr "memory" "!none"))))
++ "atom-complex, atom-all-eu")
++
++;; no memory simple
++(define_insn_reservation "atom_sseadd" 5
++ (and (eq_attr "cpu" "atom")
++ (and (eq_attr "type" "sseadd")
++ (and (eq_attr "memory" "none")
++ (and (eq_attr "mode" "!V2DF")
++ (eq_attr "atom_unit" "!complex")))))
++ "atom-fadd-5c")
++
++;; memory simple
++(define_insn_reservation "atom_sseadd_mem" 5
++ (and (eq_attr "cpu" "atom")
++ (and (eq_attr "type" "sseadd")
++ (and (eq_attr "memory" "!none")
++ (and (eq_attr "mode" "!V2DF")
++ (eq_attr "atom_unit" "!complex")))))
++ "atom-dual-5c")
++
++;; maxps, minps, *pd, hadd, hsub
++(define_insn_reservation "atom_sseadd_3" 8
++ (and (eq_attr "cpu" "atom")
++ (and (eq_attr "type" "sseadd")
++ (ior (eq_attr "mode" "V2DF") (eq_attr "atom_unit" "complex"))))
++ "atom-complex, atom-all-eu*7")
++
++;; Except dppd/dpps
++(define_insn_reservation "atom_ssemul" 5
++ (and (eq_attr "cpu" "atom")
++ (and (eq_attr "type" "ssemul")
++ (eq_attr "mode" "!SF")))
++ "atom-fmul-5c")
++
++;; Except dppd/dpps, 4 cycle if mulss
++(define_insn_reservation "atom_ssemul_2" 4
++ (and (eq_attr "cpu" "atom")
++ (and (eq_attr "type" "ssemul")
++ (eq_attr "mode" "SF")))
++ "atom-fmul-4c")
++
++(define_insn_reservation "atom_ssecmp" 1
++ (and (eq_attr "cpu" "atom")
++ (eq_attr "type" "ssecmp"))
++ "atom-simple-either")
++
++(define_insn_reservation "atom_ssecomi" 10
++ (and (eq_attr "cpu" "atom")
++ (eq_attr "type" "ssecomi"))
++ "atom-complex, atom-all-eu*9")
++
++;; no memory and cvtpi2ps, cvtps2pi, cvttps2pi
++(define_insn_reservation "atom_ssecvt" 5
++ (and (eq_attr "cpu" "atom")
++ (and (eq_attr "type" "ssecvt")
++ (ior (and (match_operand:V2SI 0 "register_operand")
++ (match_operand:V4SF 1 "register_operand"))
++ (and (match_operand:V4SF 0 "register_operand")
++ (match_operand:V2SI 1 "register_operand")))))
++ "atom-fadd-5c")
++
++;; memory and cvtpi2ps, cvtps2pi, cvttps2pi
++(define_insn_reservation "atom_ssecvt_2" 5
++ (and (eq_attr "cpu" "atom")
++ (and (eq_attr "type" "ssecvt")
++ (ior (and (match_operand:V2SI 0 "register_operand")
++ (match_operand:V4SF 1 "memory_operand"))
++ (and (match_operand:V4SF 0 "register_operand")
++ (match_operand:V2SI 1 "memory_operand")))))
++ "atom-dual-5c")
++
++;; otherwise. 7 cycles average for cvtss2sd
++(define_insn_reservation "atom_ssecvt_3" 7
++ (and (eq_attr "cpu" "atom")
++ (and (eq_attr "type" "ssecvt")
++ (not (ior (and (match_operand:V2SI 0 "register_operand")
++ (match_operand:V4SF 1 "nonimmediate_operand"))
++ (and (match_operand:V4SF 0 "register_operand")
++ (match_operand:V2SI 1 "nonimmediate_operand"))))))
++ "atom-complex, atom-all-eu*6")
++
++;; memory and cvtsi2sd
++(define_insn_reservation "atom_sseicvt" 5
++ (and (eq_attr "cpu" "atom")
++ (and (eq_attr "type" "sseicvt")
++ (and (match_operand:V2DF 0 "register_operand")
++ (match_operand:SI 1 "memory_operand"))))
++ "atom-dual-5c")
++
++;; otherwise. 8 cycles average for cvtsd2si
++(define_insn_reservation "atom_sseicvt_2" 8
++ (and (eq_attr "cpu" "atom")
++ (and (eq_attr "type" "sseicvt")
++ (not (and (match_operand:V2DF 0 "register_operand")
++ (match_operand:SI 1 "memory_operand")))))
++ "atom-complex, atom-all-eu*7")
++
++(define_insn_reservation "atom_ssediv" 62
++ (and (eq_attr "cpu" "atom")
++ (eq_attr "type" "ssediv"))
++ "atom-complex, atom-all-eu*12, nothing*49")
++
++;; simple for fmov
++(define_insn_reservation "atom_fmov" 1
++ (and (eq_attr "cpu" "atom")
++ (and (eq_attr "type" "fmov")
++ (eq_attr "memory" "none")))
++ "atom-simple-either")
++
++;; simple for fmov
++(define_insn_reservation "atom_fmov_mem" 1
++ (and (eq_attr "cpu" "atom")
++ (and (eq_attr "type" "fmov")
++ (eq_attr "memory" "!none")))
++ "atom-simple-either")
++
++;; Define bypass here
++
++;; There will be no stall from lea to non-mem EX insns
++(define_bypass 0 "atom_lea"
++ "atom_alu_carry,
++ atom_alu,atom_alu1,atom_negnot,atom_imov,atom_imovx,
++ atom_incdec, atom_setcc, atom_icmov, atom_pop")
++
++(define_bypass 0 "atom_lea"
++ "atom_alu_mem, atom_alu_carry_mem, atom_alu1_mem,
++ atom_imovx_mem, atom_imovx_2_mem,
++ atom_imov_mem, atom_icmov_mem, atom_fmov_mem"
++ "!ix86_agi_dependent")
++
++;; There will be 3 cycles stall from EX insns to AGAN insns LEA
++(define_bypass 4 "atom_alu_carry,
++ atom_alu,atom_alu1,atom_negnot,atom_imov,atom_imovx,
++ atom_incdec,atom_ishift,atom_ishift1,atom_rotate,
++ atom_rotate1, atom_setcc, atom_icmov, atom_pop,
++ atom_alu_mem, atom_alu_carry_mem, atom_alu1_mem,
++ atom_imovx_mem, atom_imovx_2_mem,
++ atom_imov_mem, atom_icmov_mem, atom_fmov_mem"
++ "atom_lea")
++
++;; There will be 3 cycles stall from EX insns to insns need addr calculation
++(define_bypass 4 "atom_alu_carry,
++ atom_alu,atom_alu1,atom_negnot,atom_imov,atom_imovx,
++ atom_incdec,atom_ishift,atom_ishift1,atom_rotate,
++ atom_rotate1, atom_setcc, atom_icmov, atom_pop,
++ atom_imovx_mem, atom_imovx_2_mem,
++ atom_alu_mem, atom_alu_carry_mem, atom_alu1_mem,
++ atom_imov_mem, atom_icmov_mem, atom_fmov_mem"
++ "atom_alu_mem, atom_alu_carry_mem, atom_alu1_mem,
++ atom_negnot_mem, atom_imov_mem, atom_incdec_mem,
++ atom_imovx_mem, atom_imovx_2_mem,
++ atom_imul_mem, atom_icmp_mem,
++ atom_test_mem, atom_icmov_mem, atom_sselog_mem,
++ atom_sselog1_mem, atom_fmov_mem, atom_sseadd_mem,
++ atom_ishift_mem, atom_ishift1_mem,
++ atom_rotate_mem, atom_rotate1_mem"
++ "ix86_agi_dependent")
++
++;; Stall from imul to lea is 8 cycles.
++(define_bypass 9 "atom_imul, atom_imul_mem" "atom_lea")
++
++;; Stall from imul to memory address is 8 cycles.
++(define_bypass 9 "atom_imul, atom_imul_mem"
++ "atom_alu_mem, atom_alu_carry_mem, atom_alu1_mem,
++ atom_negnot_mem, atom_imov_mem, atom_incdec_mem,
++ atom_ishift_mem, atom_ishift1_mem, atom_rotate_mem,
++ atom_rotate1_mem, atom_imul_mem, atom_icmp_mem,
++ atom_test_mem, atom_icmov_mem, atom_sselog_mem,
++ atom_sselog1_mem, atom_fmov_mem, atom_sseadd_mem"
++ "ix86_agi_dependent")
++
++;; There will be 0 cycle stall from cmp/test to jcc
++
++;; There will be 1 cycle stall from flag producer to cmov and adc/sbb
++(define_bypass 2 "atom_icmp, atom_test, atom_alu, atom_alu_carry,
++ atom_alu1, atom_negnot, atom_incdec, atom_ishift,
++ atom_ishift1, atom_rotate, atom_rotate1"
++ "atom_icmov, atom_alu_carry")
++
++;; lea to shift count stall is 2 cycles
++(define_bypass 3 "atom_lea"
++ "atom_ishift, atom_ishift1, atom_rotate, atom_rotate1,
++ atom_ishift_mem, atom_ishift1_mem,
++ atom_rotate_mem, atom_rotate1_mem"
++ "ix86_dep_by_shift_count")
++
++;; lea to shift source stall is 1 cycle
++(define_bypass 2 "atom_lea"
++ "atom_ishift, atom_ishift1, atom_rotate, atom_rotate1"
++ "!ix86_dep_by_shift_count")
++
++;; non-lea to shift count stall is 1 cycle
++(define_bypass 2 "atom_alu_carry,
++ atom_alu,atom_alu1,atom_negnot,atom_imov,atom_imovx,
++ atom_incdec,atom_ishift,atom_ishift1,atom_rotate,
++ atom_rotate1, atom_setcc, atom_icmov, atom_pop,
++ atom_alu_mem, atom_alu_carry_mem, atom_alu1_mem,
++ atom_imovx_mem, atom_imovx_2_mem,
++ atom_imov_mem, atom_icmov_mem, atom_fmov_mem"
++ "atom_ishift, atom_ishift1, atom_rotate, atom_rotate1,
++ atom_ishift_mem, atom_ishift1_mem,
++ atom_rotate_mem, atom_rotate1_mem"
++ "ix86_dep_by_shift_count")
+diff -Nur a/gcc/config/i386/cpuid.h b/gcc/config/i386/cpuid.h
+--- a/gcc/config/i386/cpuid.h 2009-04-10 01:23:07.000000000 +0200
++++ b/gcc/config/i386/cpuid.h 2010-01-25 09:50:28.995687913 +0100
+@@ -29,6 +29,7 @@
+ #define bit_CMPXCHG16B (1 << 13)
+ #define bit_SSE4_1 (1 << 19)
+ #define bit_SSE4_2 (1 << 20)
++#define bit_MOVBE (1 << 22)
+ #define bit_POPCNT (1 << 23)
+ #define bit_AES (1 << 25)
+ #define bit_XSAVE (1 << 26)
+diff -Nur a/gcc/config/i386/cs-linux.h b/gcc/config/i386/cs-linux.h
+--- a/gcc/config/i386/cs-linux.h 1970-01-01 01:00:00.000000000 +0100
++++ b/gcc/config/i386/cs-linux.h 2010-01-25 09:50:28.995687913 +0100
+@@ -0,0 +1,41 @@
++/* Sourcery G++ IA32 GNU/Linux Configuration.
++ Copyright (C) 2007
++ Free Software Foundation, Inc.
++
++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/>. */
++
++/* This configuration may be used either with the system glibc (in
++ system32 and system64 subdirectories) or with the included glibc
++ (in the sgxx-glibc subdirectory). */
++
++#undef SYSROOT_SUFFIX_SPEC
++#define SYSROOT_SUFFIX_SPEC \
++ "%{msgxx-glibc:/sgxx-glibc ; \
++ m64:/system64 ; \
++ mrhel3:/system64 ; \
++ mrh73:/system32-old ; \
++ :/system32}"
++
++#undef SYSROOT_HEADERS_SUFFIX_SPEC
++#define SYSROOT_HEADERS_SUFFIX_SPEC SYSROOT_SUFFIX_SPEC
++
++/* See mips/wrs-linux.h for details on this use of
++ STARTFILE_PREFIX_SPEC. */
++#undef STARTFILE_PREFIX_SPEC
++#define STARTFILE_PREFIX_SPEC \
++ "%{m64: /usr/local/lib64/ /lib64/ /usr/lib64/} \
++ %{!m64: /usr/local/lib/ /lib/ /usr/lib/}"
+diff -Nur a/gcc/config/i386/cs-linux-lite.h b/gcc/config/i386/cs-linux-lite.h
+--- a/gcc/config/i386/cs-linux-lite.h 1970-01-01 01:00:00.000000000 +0100
++++ b/gcc/config/i386/cs-linux-lite.h 2010-01-25 09:50:28.995687913 +0100
+@@ -0,0 +1,31 @@
++/* Sourcery G++ Lite IA32 GNU/Linux Configuration.
++ Copyright (C) 2009
++ Free Software Foundation, Inc.
++
++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/>. */
++
++#undef SYSROOT_SUFFIX_SPEC
++#define SYSROOT_SUFFIX_SPEC \
++ "%{march=atom:%{!m64:/atom} ; \
++ march=core2:%{m64:/core2}}"
++
++/* See mips/wrs-linux.h for details on this use of
++ STARTFILE_PREFIX_SPEC. */
++#undef STARTFILE_PREFIX_SPEC
++#define STARTFILE_PREFIX_SPEC \
++ "%{m64: /usr/local/lib64/ /lib64/ /usr/lib64/} \
++ %{!m64: /usr/local/lib/ /lib/ /usr/lib/}"
+diff -Nur a/gcc/config/i386/cs-linux.opt b/gcc/config/i386/cs-linux.opt
+--- a/gcc/config/i386/cs-linux.opt 1970-01-01 01:00:00.000000000 +0100
++++ b/gcc/config/i386/cs-linux.opt 2010-01-25 09:50:28.995687913 +0100
+@@ -0,0 +1,11 @@
++; Additional options for Sourcery G++.
++
++mrh73
++Target Undocumented
++
++mrhel3
++Target Undocumented
++
++msgxx-glibc
++Target
++Use included version of GLIBC
+diff -Nur a/gcc/config/i386/cygming.h b/gcc/config/i386/cygming.h
+--- a/gcc/config/i386/cygming.h 2009-07-12 17:56:41.000000000 +0200
++++ b/gcc/config/i386/cygming.h 2010-01-25 09:50:28.995687913 +0100
+@@ -34,7 +34,7 @@
+ #endif
+
+ #undef TARGET_64BIT_MS_ABI
+-#define TARGET_64BIT_MS_ABI (!cfun ? DEFAULT_ABI == MS_ABI : TARGET_64BIT && cfun->machine->call_abi == MS_ABI)
++#define TARGET_64BIT_MS_ABI (!cfun ? ix86_abi == MS_ABI : TARGET_64BIT && cfun->machine->call_abi == MS_ABI)
+
+ #undef DEFAULT_ABI
+ #define DEFAULT_ABI (TARGET_64BIT ? MS_ABI : SYSV_ABI)
+@@ -203,7 +203,7 @@
+ #define CHECK_STACK_LIMIT 4000
+
+ #undef STACK_BOUNDARY
+-#define STACK_BOUNDARY (DEFAULT_ABI == MS_ABI ? 128 : BITS_PER_WORD)
++#define STACK_BOUNDARY (ix86_abi == MS_ABI ? 128 : BITS_PER_WORD)
+
+ /* By default, target has a 80387, uses IEEE compatible arithmetic,
+ returns float values in the 387 and needs stack probes.
+diff -Nur a/gcc/config/i386/cygming.opt b/gcc/config/i386/cygming.opt
+--- a/gcc/config/i386/cygming.opt 2007-08-02 12:49:31.000000000 +0200
++++ b/gcc/config/i386/cygming.opt 2010-01-25 09:50:28.995687913 +0100
+@@ -45,3 +45,7 @@
+ mwindows
+ Target
+ Create GUI application
++
++mpe-aligned-commons
++Target Var(use_pe_aligned_common) Init(HAVE_GAS_ALIGNED_COMM)
++Use the GNU extension to the PE format for aligned common data
+diff -Nur a/gcc/config/i386/driver-i386.c b/gcc/config/i386/driver-i386.c
+--- a/gcc/config/i386/driver-i386.c 2009-05-27 16:54:00.000000000 +0200
++++ b/gcc/config/i386/driver-i386.c 2010-01-25 09:50:29.005686600 +0100
+@@ -378,7 +378,7 @@
+ /* Extended features */
+ unsigned int has_lahf_lm = 0, has_sse4a = 0;
+ unsigned int has_longmode = 0, has_3dnowp = 0, has_3dnow = 0;
+- unsigned int has_sse4_1 = 0, has_sse4_2 = 0;
++ unsigned int has_movbe = 0, has_sse4_1 = 0, has_sse4_2 = 0;
+ unsigned int has_popcnt = 0, has_aes = 0, has_avx = 0;
+ unsigned int has_pclmul = 0;
+
+@@ -398,9 +398,22 @@
+
+ __cpuid (1, eax, ebx, ecx, edx);
+
+- /* We don't care for extended family. */
+ model = (eax >> 4) & 0x0f;
+ family = (eax >> 8) & 0x0f;
++ if (vendor == SIG_INTEL)
++ {
++ unsigned int extended_model, extended_family;
++
++ extended_model = (eax >> 12) & 0xf0;
++ extended_family = (eax >> 20) & 0xff;
++ if (family == 0x0f)
++ {
++ family += extended_family;
++ model += extended_model;
++ }
++ else if (family == 0x06)
++ model += extended_model;
++ }
+
+ has_sse3 = ecx & bit_SSE3;
+ has_ssse3 = ecx & bit_SSSE3;
+@@ -408,6 +421,7 @@
+ has_sse4_2 = ecx & bit_SSE4_2;
+ has_avx = ecx & bit_AVX;
+ has_cmpxchg16b = ecx & bit_CMPXCHG16B;
++ has_movbe = ecx & bit_MOVBE;
+ has_popcnt = ecx & bit_POPCNT;
+ has_aes = ecx & bit_AES;
+ has_pclmul = ecx & bit_PCLMUL;
+@@ -505,8 +519,8 @@
+ break;
+ case PROCESSOR_PENTIUMPRO:
+ if (has_longmode)
+- /* It is Core 2 Duo. */
+- cpu = "core2";
++ /* It is Core 2 or Atom. */
++ cpu = (model == 28) ? "atom" : "core2";
+ else if (arch)
+ {
+ if (has_sse3)
+@@ -597,6 +611,8 @@
+ options = concat (options, "-mcx16 ", NULL);
+ if (has_lahf_lm)
+ options = concat (options, "-msahf ", NULL);
++ if (has_movbe)
++ options = concat (options, "-mmovbe ", NULL);
+ if (has_aes)
+ options = concat (options, "-maes ", NULL);
+ if (has_pclmul)
+diff -Nur a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c
+--- a/gcc/config/i386/i386.c 2009-07-21 09:22:51.000000000 +0200
++++ b/gcc/config/i386/i386.c 2010-01-25 09:50:29.005686600 +0100
+@@ -1036,6 +1036,79 @@
+ 1, /* cond_not_taken_branch_cost. */
+ };
+
++static const
++struct processor_costs atom_cost = {
++ COSTS_N_INSNS (1), /* cost of an add instruction */
++ COSTS_N_INSNS (1) + 1, /* cost of a lea instruction */
++ COSTS_N_INSNS (1), /* variable shift costs */
++ COSTS_N_INSNS (1), /* constant shift costs */
++ {COSTS_N_INSNS (3), /* cost of starting multiply for QI */
++ COSTS_N_INSNS (4), /* HI */
++ COSTS_N_INSNS (3), /* SI */
++ COSTS_N_INSNS (4), /* DI */
++ COSTS_N_INSNS (2)}, /* other */
++ 0, /* cost of multiply per each bit set */
++ {COSTS_N_INSNS (18), /* cost of a divide/mod for QI */
++ COSTS_N_INSNS (26), /* HI */
++ COSTS_N_INSNS (42), /* SI */
++ COSTS_N_INSNS (74), /* DI */
++ COSTS_N_INSNS (74)}, /* other */
++ COSTS_N_INSNS (1), /* cost of movsx */
++ COSTS_N_INSNS (1), /* cost of movzx */
++ 8, /* "large" insn */
++ 17, /* MOVE_RATIO */
++ 2, /* cost for loading QImode using movzbl */
++ {4, 4, 4}, /* cost of loading integer registers
++ in QImode, HImode and SImode.
++ Relative to reg-reg move (2). */
++ {4, 4, 4}, /* cost of storing integer registers */
++ 4, /* cost of reg,reg fld/fst */
++ {12, 12, 12}, /* cost of loading fp registers
++ in SFmode, DFmode and XFmode */
++ {6, 6, 8}, /* cost of storing fp registers
++ in SFmode, DFmode and XFmode */
++ 2, /* cost of moving MMX register */
++ {8, 8}, /* cost of loading MMX registers
++ in SImode and DImode */
++ {8, 8}, /* cost of storing MMX registers
++ in SImode and DImode */
++ 2, /* cost of moving SSE register */
++ {8, 8, 8}, /* cost of loading SSE registers
++ in SImode, DImode and TImode */
++ {8, 8, 8}, /* cost of storing SSE registers
++ in SImode, DImode and TImode */
++ 5, /* MMX or SSE register to integer */
++ 32, /* size of l1 cache. */
++ 256, /* size of l2 cache. */
++ 64, /* size of prefetch block */
++ 6, /* number of parallel prefetches */
++ 3, /* Branch cost */
++ COSTS_N_INSNS (8), /* cost of FADD and FSUB insns. */
++ COSTS_N_INSNS (8), /* cost of FMUL instruction. */
++ COSTS_N_INSNS (20), /* cost of FDIV instruction. */
++ COSTS_N_INSNS (8), /* cost of FABS instruction. */
++ COSTS_N_INSNS (8), /* cost of FCHS instruction. */
++ COSTS_N_INSNS (40), /* cost of FSQRT instruction. */
++ {{libcall, {{11, loop}, {-1, rep_prefix_4_byte}}},
++ {libcall, {{32, loop}, {64, rep_prefix_4_byte},
++ {8192, rep_prefix_8_byte}, {-1, libcall}}}},
++ {{libcall, {{8, loop}, {15, unrolled_loop},
++ {2048, rep_prefix_4_byte}, {-1, libcall}}},
++ {libcall, {{24, loop}, {32, unrolled_loop},
++ {8192, rep_prefix_8_byte}, {-1, libcall}}}},
++ 1, /* scalar_stmt_cost. */
++ 1, /* scalar load_cost. */
++ 1, /* scalar_store_cost. */
++ 1, /* vec_stmt_cost. */
++ 1, /* vec_to_scalar_cost. */
++ 1, /* scalar_to_vec_cost. */
++ 1, /* vec_align_load_cost. */
++ 2, /* vec_unalign_load_cost. */
++ 1, /* vec_store_cost. */
++ 3, /* cond_taken_branch_cost. */
++ 1, /* cond_not_taken_branch_cost. */
++};
++
+ /* Generic64 should produce code tuned for Nocona and K8. */
+ static const
+ struct processor_costs generic64_cost = {
+@@ -1194,6 +1267,7 @@
+ #define m_PENT4 (1<<PROCESSOR_PENTIUM4)
+ #define m_NOCONA (1<<PROCESSOR_NOCONA)
+ #define m_CORE2 (1<<PROCESSOR_CORE2)
++#define m_ATOM (1<<PROCESSOR_ATOM)
+
+ #define m_GEODE (1<<PROCESSOR_GEODE)
+ #define m_K6 (1<<PROCESSOR_K6)
+@@ -1231,10 +1305,11 @@
+ m_486 | m_PENT,
+
+ /* X86_TUNE_UNROLL_STRLEN */
+- m_486 | m_PENT | m_PPRO | m_AMD_MULTIPLE | m_K6 | m_CORE2 | m_GENERIC,
++ m_486 | m_PENT | m_ATOM | m_PPRO | m_AMD_MULTIPLE | m_K6
++ | m_CORE2 | m_GENERIC,
+
+ /* X86_TUNE_DEEP_BRANCH_PREDICTION */
+- m_PPRO | m_K6_GEODE | m_AMD_MULTIPLE | m_PENT4 | m_GENERIC,
++ m_ATOM | m_PPRO | m_K6_GEODE | m_AMD_MULTIPLE | m_PENT4 | m_GENERIC,
+
+ /* X86_TUNE_BRANCH_PREDICTION_HINTS: Branch hints were put in P4 based
+ on simulation result. But after P4 was made, no performance benefit
+@@ -1246,12 +1321,12 @@
+ ~m_386,
+
+ /* X86_TUNE_USE_SAHF */
+- m_PPRO | m_K6_GEODE | m_K8 | m_AMDFAM10 | m_PENT4
++ m_ATOM | m_PPRO | m_K6_GEODE | m_K8 | m_AMDFAM10 | m_PENT4
+ | m_NOCONA | m_CORE2 | m_GENERIC,
+
+ /* X86_TUNE_MOVX: Enable to zero extend integer registers to avoid
+ partial dependencies. */
+- m_AMD_MULTIPLE | m_PPRO | m_PENT4 | m_NOCONA
++ m_AMD_MULTIPLE | m_ATOM | m_PPRO | m_PENT4 | m_NOCONA
+ | m_CORE2 | m_GENERIC | m_GEODE /* m_386 | m_K6 */,
+
+ /* X86_TUNE_PARTIAL_REG_STALL: We probably ought to watch for partial
+@@ -1271,13 +1346,13 @@
+ m_386 | m_486 | m_K6_GEODE,
+
+ /* X86_TUNE_USE_SIMODE_FIOP */
+- ~(m_PPRO | m_AMD_MULTIPLE | m_PENT | m_CORE2 | m_GENERIC),
++ ~(m_PPRO | m_AMD_MULTIPLE | m_PENT | m_ATOM | m_CORE2 | m_GENERIC),
+
+ /* X86_TUNE_USE_MOV0 */
+ m_K6,
+
+ /* X86_TUNE_USE_CLTD */
+- ~(m_PENT | m_K6 | m_CORE2 | m_GENERIC),
++ ~(m_PENT | m_ATOM | m_K6 | m_CORE2 | m_GENERIC),
+
+ /* X86_TUNE_USE_XCHGB: Use xchgb %rh,%rl instead of rolw/rorw $8,rx. */
+ m_PENT4,
+@@ -1292,8 +1367,8 @@
+ ~(m_PENT | m_PPRO),
+
+ /* X86_TUNE_PROMOTE_QIMODE */
+- m_K6_GEODE | m_PENT | m_386 | m_486 | m_AMD_MULTIPLE | m_CORE2
+- | m_GENERIC /* | m_PENT4 ? */,
++ m_K6_GEODE | m_PENT | m_ATOM | m_386 | m_486 | m_AMD_MULTIPLE
++ | m_CORE2 | m_GENERIC /* | m_PENT4 ? */,
+
+ /* X86_TUNE_FAST_PREFIX */
+ ~(m_PENT | m_486 | m_386),
+@@ -1317,26 +1392,28 @@
+ m_PPRO,
+
+ /* X86_TUNE_ADD_ESP_4: Enable if add/sub is preferred over 1/2 push/pop. */
+- m_AMD_MULTIPLE | m_K6_GEODE | m_PENT4 | m_NOCONA | m_CORE2 | m_GENERIC,
++ m_ATOM | m_AMD_MULTIPLE | m_K6_GEODE | m_PENT4 | m_NOCONA
++ | m_CORE2 | m_GENERIC,
+
+ /* X86_TUNE_ADD_ESP_8 */
+- m_AMD_MULTIPLE | m_PPRO | m_K6_GEODE | m_386
++ m_AMD_MULTIPLE | m_ATOM | m_PPRO | m_K6_GEODE | m_386
+ | m_486 | m_PENT4 | m_NOCONA | m_CORE2 | m_GENERIC,
+
+ /* X86_TUNE_SUB_ESP_4 */
+- m_AMD_MULTIPLE | m_PPRO | m_PENT4 | m_NOCONA | m_CORE2 | m_GENERIC,
++ m_AMD_MULTIPLE | m_ATOM | m_PPRO | m_PENT4 | m_NOCONA | m_CORE2
++ | m_GENERIC,
+
+ /* X86_TUNE_SUB_ESP_8 */
+- m_AMD_MULTIPLE | m_PPRO | m_386 | m_486
++ m_AMD_MULTIPLE | m_ATOM | m_PPRO | m_386 | m_486
+ | m_PENT4 | m_NOCONA | m_CORE2 | m_GENERIC,
+
+ /* X86_TUNE_INTEGER_DFMODE_MOVES: Enable if integer moves are preferred
+ for DFmode copies */
+- ~(m_AMD_MULTIPLE | m_PENT4 | m_NOCONA | m_PPRO | m_CORE2
++ ~(m_AMD_MULTIPLE | m_ATOM | m_PENT4 | m_NOCONA | m_PPRO | m_CORE2
+ | m_GENERIC | m_GEODE),
+
+ /* X86_TUNE_PARTIAL_REG_DEPENDENCY */
+- m_AMD_MULTIPLE | m_PENT4 | m_NOCONA | m_CORE2 | m_GENERIC,
++ m_AMD_MULTIPLE | m_ATOM | m_PENT4 | m_NOCONA | m_CORE2 | m_GENERIC,
+
+ /* X86_TUNE_SSE_PARTIAL_REG_DEPENDENCY: In the Generic model we have a
+ conflict here in between PPro/Pentium4 based chips that thread 128bit
+@@ -1347,7 +1424,8 @@
+ shows that disabling this option on P4 brings over 20% SPECfp regression,
+ while enabling it on K8 brings roughly 2.4% regression that can be partly
+ masked by careful scheduling of moves. */
+- m_PENT4 | m_NOCONA | m_PPRO | m_CORE2 | m_GENERIC | m_AMDFAM10,
++ m_ATOM | m_PENT4 | m_NOCONA | m_PPRO | m_CORE2 | m_GENERIC
++ | m_AMDFAM10,
+
+ /* X86_TUNE_SSE_UNALIGNED_MOVE_OPTIMAL */
+ m_AMDFAM10,
+@@ -1365,13 +1443,13 @@
+ m_PPRO | m_PENT4 | m_NOCONA,
+
+ /* X86_TUNE_MEMORY_MISMATCH_STALL */
+- m_AMD_MULTIPLE | m_PENT4 | m_NOCONA | m_CORE2 | m_GENERIC,
++ m_AMD_MULTIPLE | m_ATOM | m_PENT4 | m_NOCONA | m_CORE2 | m_GENERIC,
+
+ /* X86_TUNE_PROLOGUE_USING_MOVE */
+- m_ATHLON_K8 | m_PPRO | m_CORE2 | m_GENERIC,
++ m_ATHLON_K8 | m_ATOM | m_PPRO | m_CORE2 | m_GENERIC,
+
+ /* X86_TUNE_EPILOGUE_USING_MOVE */
+- m_ATHLON_K8 | m_PPRO | m_CORE2 | m_GENERIC,
++ m_ATHLON_K8 | m_ATOM | m_PPRO | m_CORE2 | m_GENERIC,
+
+ /* X86_TUNE_SHIFT1 */
+ ~m_486,
+@@ -1380,29 +1458,32 @@
+ m_AMD_MULTIPLE,
+
+ /* X86_TUNE_INTER_UNIT_MOVES */
+- ~(m_AMD_MULTIPLE | m_GENERIC),
++ ~(m_AMD_MULTIPLE | m_ATOM | m_GENERIC),
+
+ /* X86_TUNE_INTER_UNIT_CONVERSIONS */
+ ~(m_AMDFAM10),
+
+ /* X86_TUNE_FOUR_JUMP_LIMIT: Some CPU cores are not able to predict more
+ than 4 branch instructions in the 16 byte window. */
+- m_PPRO | m_AMD_MULTIPLE | m_PENT4 | m_NOCONA | m_CORE2 | m_GENERIC,
++ m_ATOM | m_PPRO | m_AMD_MULTIPLE | m_PENT4 | m_NOCONA | m_CORE2
++ | m_GENERIC,
+
+ /* X86_TUNE_SCHEDULE */
+- m_PPRO | m_AMD_MULTIPLE | m_K6_GEODE | m_PENT | m_CORE2 | m_GENERIC,
++ m_PPRO | m_AMD_MULTIPLE | m_K6_GEODE | m_PENT | m_ATOM | m_CORE2
++ | m_GENERIC,
+
+ /* X86_TUNE_USE_BT */
+- m_AMD_MULTIPLE | m_CORE2 | m_GENERIC,
++ m_AMD_MULTIPLE | m_ATOM | m_CORE2 | m_GENERIC,
+
+ /* X86_TUNE_USE_INCDEC */
+- ~(m_PENT4 | m_NOCONA | m_GENERIC),
++ ~(m_PENT4 | m_NOCONA | m_GENERIC | m_ATOM),
+
+ /* X86_TUNE_PAD_RETURNS */
+ m_AMD_MULTIPLE | m_CORE2 | m_GENERIC,
+
+ /* X86_TUNE_EXT_80387_CONSTANTS */
+- m_K6_GEODE | m_ATHLON_K8 | m_PENT4 | m_NOCONA | m_PPRO | m_CORE2 | m_GENERIC,
++ m_K6_GEODE | m_ATHLON_K8 | m_ATOM | m_PENT4 | m_NOCONA | m_PPRO
++ | m_CORE2 | m_GENERIC,
+
+ /* X86_TUNE_SHORTEN_X87_SSE */
+ ~m_K8,
+@@ -1447,6 +1528,10 @@
+ with a subsequent conditional jump instruction into a single
+ compare-and-branch uop. */
+ m_CORE2,
++
++ /* X86_TUNE_OPT_AGU: Optimize for Address Generation Unit. This flag
++ will impact LEA instruction selection. */
++ m_ATOM,
+ };
+
+ /* Feature tests against the various architecture variations. */
+@@ -1472,10 +1557,11 @@
+ };
+
+ static const unsigned int x86_accumulate_outgoing_args
+- = m_AMD_MULTIPLE | m_PENT4 | m_NOCONA | m_PPRO | m_CORE2 | m_GENERIC;
++ = m_AMD_MULTIPLE | m_ATOM | m_PENT4 | m_NOCONA | m_PPRO | m_CORE2
++ | m_GENERIC;
+
+ static const unsigned int x86_arch_always_fancy_math_387
+- = m_PENT | m_PPRO | m_AMD_MULTIPLE | m_PENT4
++ = m_PENT | m_ATOM | m_PPRO | m_AMD_MULTIPLE | m_PENT4
+ | m_NOCONA | m_CORE2 | m_GENERIC;
+
+ static enum stringop_alg stringop_alg = no_stringop;
+@@ -1743,6 +1829,9 @@
+ /* Alignment for incoming stack boundary in bits. */
+ unsigned int ix86_incoming_stack_boundary;
+
++/* The abi used by target. */
++enum calling_abi ix86_abi;
++
+ /* Values 1-5: see jump.c */
+ int ix86_branch_cost;
+
+@@ -1819,6 +1908,8 @@
+ static bool ix86_can_inline_p (tree, tree);
+ static void ix86_set_current_function (tree);
+
++static enum calling_abi ix86_function_abi (const_tree);
++
+
+ /* The svr4 ABI for the i386 says that records and unions are returned
+ in memory. */
+@@ -1880,6 +1971,7 @@
+ #define OPTION_MASK_ISA_POPCNT_SET OPTION_MASK_ISA_POPCNT
+ #define OPTION_MASK_ISA_CX16_SET OPTION_MASK_ISA_CX16
+ #define OPTION_MASK_ISA_SAHF_SET OPTION_MASK_ISA_SAHF
++#define OPTION_MASK_ISA_MOVBE_SET OPTION_MASK_ISA_MOVBE
+
+ /* Define a set of ISAs which aren't available when a given ISA is
+ disabled. MMX and SSE ISAs are handled separately. */
+@@ -1921,6 +2013,7 @@
+ #define OPTION_MASK_ISA_POPCNT_UNSET OPTION_MASK_ISA_POPCNT
+ #define OPTION_MASK_ISA_CX16_UNSET OPTION_MASK_ISA_CX16
+ #define OPTION_MASK_ISA_SAHF_UNSET OPTION_MASK_ISA_SAHF
++#define OPTION_MASK_ISA_MOVBE_UNSET OPTION_MASK_ISA_MOVBE
+
+ /* Vectorization library interface and handlers. */
+ tree (*ix86_veclib_handler)(enum built_in_function, tree, tree) = NULL;
+@@ -1953,7 +2046,8 @@
+ {&core2_cost, 16, 10, 16, 10, 16},
+ {&generic32_cost, 16, 7, 16, 7, 16},
+ {&generic64_cost, 16, 10, 16, 10, 16},
+- {&amdfam10_cost, 32, 24, 32, 7, 32}
++ {&amdfam10_cost, 32, 24, 32, 7, 32},
++ {&atom_cost, 16, 7, 16, 7, 16}
+ };
+
+ static const char *const cpu_names[TARGET_CPU_DEFAULT_max] =
+@@ -1971,6 +2065,7 @@
+ "prescott",
+ "nocona",
+ "core2",
++ "atom",
+ "geode",
+ "k6",
+ "k6-2",
+@@ -2209,6 +2304,19 @@
+ }
+ return true;
+
++ case OPT_mmovbe:
++ if (value)
++ {
++ ix86_isa_flags |= OPTION_MASK_ISA_MOVBE_SET;
++ ix86_isa_flags_explicit |= OPTION_MASK_ISA_MOVBE_SET;
++ }
++ else
++ {
++ ix86_isa_flags &= ~OPTION_MASK_ISA_MOVBE_UNSET;
++ ix86_isa_flags_explicit |= OPTION_MASK_ISA_MOVBE_UNSET;
++ }
++ return true;
++
+ case OPT_maes:
+ if (value)
+ {
+@@ -2271,6 +2379,7 @@
+ { "-mmmx", OPTION_MASK_ISA_MMX },
+ { "-mabm", OPTION_MASK_ISA_ABM },
+ { "-mpopcnt", OPTION_MASK_ISA_POPCNT },
++ { "-mmovbe", OPTION_MASK_ISA_MOVBE },
+ { "-maes", OPTION_MASK_ISA_AES },
+ { "-mpclmul", OPTION_MASK_ISA_PCLMUL },
+ };
+@@ -2487,7 +2596,8 @@
+ PTA_AES = 1 << 17,
+ PTA_PCLMUL = 1 << 18,
+ PTA_AVX = 1 << 19,
+- PTA_FMA = 1 << 20
++ PTA_FMA = 1 << 20,
++ PTA_MOVBE = 1 << 21
+ };
+
+ static struct pta
+@@ -2529,6 +2639,9 @@
+ {"core2", PROCESSOR_CORE2, CPU_CORE2,
+ PTA_64BIT | PTA_MMX | PTA_SSE | PTA_SSE2 | PTA_SSE3
+ | PTA_SSSE3 | PTA_CX16},
++ {"atom", PROCESSOR_ATOM, CPU_ATOM,
++ PTA_64BIT | PTA_MMX | PTA_SSE | PTA_SSE2 | PTA_SSE3
++ | PTA_SSSE3 | PTA_CX16 | PTA_MOVBE},
+ {"geode", PROCESSOR_GEODE, CPU_GEODE,
+ PTA_MMX | PTA_3DNOW | PTA_3DNOW_A |PTA_PREFETCH_SSE},
+ {"k6", PROCESSOR_K6, CPU_K6, PTA_MMX},
+@@ -2716,6 +2829,20 @@
+ error ("bad value (%s) for %sarch=%s %s",
+ ix86_arch_string, prefix, suffix, sw);
+
++ /* Validate -mabi= value. */
++ if (ix86_abi_string)
++ {
++ if (strcmp (ix86_abi_string, "sysv") == 0)
++ ix86_abi = SYSV_ABI;
++ else if (strcmp (ix86_abi_string, "ms") == 0)
++ ix86_abi = MS_ABI;
++ else
++ error ("unknown ABI (%s) for %sabi=%s %s",
++ ix86_abi_string, prefix, suffix, sw);
++ }
++ else
++ ix86_abi = DEFAULT_ABI;
++
+ if (ix86_cmodel_string != 0)
+ {
+ if (!strcmp (ix86_cmodel_string, "small"))
+@@ -2828,6 +2955,9 @@
+ if (!(TARGET_64BIT && (processor_alias_table[i].flags & PTA_NO_SAHF))
+ && !(ix86_isa_flags_explicit & OPTION_MASK_ISA_SAHF))
+ ix86_isa_flags |= OPTION_MASK_ISA_SAHF;
++ if (processor_alias_table[i].flags & PTA_MOVBE
++ && !(ix86_isa_flags_explicit & OPTION_MASK_ISA_MOVBE))
++ ix86_isa_flags |= OPTION_MASK_ISA_MOVBE;
+ if (processor_alias_table[i].flags & PTA_AES
+ && !(ix86_isa_flags_explicit & OPTION_MASK_ISA_AES))
+ ix86_isa_flags |= OPTION_MASK_ISA_AES;
+@@ -4592,14 +4722,14 @@
+ default ABI. */
+
+ /* RAX is used as hidden argument to va_arg functions. */
+- if (DEFAULT_ABI == SYSV_ABI && regno == AX_REG)
++ if (ix86_abi == SYSV_ABI && regno == AX_REG)
+ return true;
+
+- if (DEFAULT_ABI == MS_ABI)
++ if (ix86_abi == MS_ABI)
+ parm_regs = x86_64_ms_abi_int_parameter_registers;
+ else
+ parm_regs = x86_64_int_parameter_registers;
+- for (i = 0; i < (DEFAULT_ABI == MS_ABI ? X64_REGPARM_MAX
++ for (i = 0; i < (ix86_abi == MS_ABI ? X64_REGPARM_MAX
+ : X86_64_REGPARM_MAX); i++)
+ if (regno == parm_regs[i])
+ return true;
+@@ -4627,7 +4757,7 @@
+ int
+ ix86_reg_parm_stack_space (const_tree fndecl)
+ {
+- int call_abi = SYSV_ABI;
++ enum calling_abi call_abi = SYSV_ABI;
+ if (fndecl != NULL_TREE && TREE_CODE (fndecl) == FUNCTION_DECL)
+ call_abi = ix86_function_abi (fndecl);
+ else
+@@ -4639,37 +4769,39 @@
+
+ /* Returns value SYSV_ABI, MS_ABI dependent on fntype, specifying the
+ call abi used. */
+-int
++enum calling_abi
+ ix86_function_type_abi (const_tree fntype)
+ {
+ if (TARGET_64BIT && fntype != NULL)
+ {
+- int abi;
+- if (DEFAULT_ABI == SYSV_ABI)
+- abi = lookup_attribute ("ms_abi", TYPE_ATTRIBUTES (fntype)) ? MS_ABI : SYSV_ABI;
+- else
+- abi = lookup_attribute ("sysv_abi", TYPE_ATTRIBUTES (fntype)) ? SYSV_ABI : MS_ABI;
+-
++ enum calling_abi abi = ix86_abi;
++ if (abi == SYSV_ABI)
++ {
++ if (lookup_attribute ("ms_abi", TYPE_ATTRIBUTES (fntype)))
++ abi = MS_ABI;
++ }
++ else if (lookup_attribute ("sysv_abi", TYPE_ATTRIBUTES (fntype)))
++ abi = SYSV_ABI;
+ return abi;
+ }
+- return DEFAULT_ABI;
++ return ix86_abi;
+ }
+
+-int
++static enum calling_abi
+ ix86_function_abi (const_tree fndecl)
+ {
+ if (! fndecl)
+- return DEFAULT_ABI;
++ return ix86_abi;
+ return ix86_function_type_abi (TREE_TYPE (fndecl));
+ }
+
+ /* Returns value SYSV_ABI, MS_ABI dependent on cfun, specifying the
+ call abi used. */
+-int
++enum calling_abi
+ ix86_cfun_abi (void)
+ {
+ if (! cfun || ! TARGET_64BIT)
+- return DEFAULT_ABI;
++ return ix86_abi;
+ return cfun->machine->call_abi;
+ }
+
+@@ -4683,7 +4815,7 @@
+ ix86_call_abi_override (const_tree fndecl)
+ {
+ if (fndecl == NULL_TREE)
+- cfun->machine->call_abi = DEFAULT_ABI;
++ cfun->machine->call_abi = ix86_abi;
+ else
+ cfun->machine->call_abi = ix86_function_type_abi (TREE_TYPE (fndecl));
+ }
+@@ -4724,8 +4856,8 @@
+ cum->nregs = ix86_regparm;
+ if (TARGET_64BIT)
+ {
+- if (cum->call_abi != DEFAULT_ABI)
+- cum->nregs = DEFAULT_ABI != SYSV_ABI ? X86_64_REGPARM_MAX
++ if (cum->call_abi != ix86_abi)
++ cum->nregs = ix86_abi != SYSV_ABI ? X86_64_REGPARM_MAX
+ : X64_REGPARM_MAX;
+ }
+ if (TARGET_SSE)
+@@ -4733,8 +4865,8 @@
+ cum->sse_nregs = SSE_REGPARM_MAX;
+ if (TARGET_64BIT)
+ {
+- if (cum->call_abi != DEFAULT_ABI)
+- cum->sse_nregs = DEFAULT_ABI != SYSV_ABI ? X86_64_SSE_REGPARM_MAX
++ if (cum->call_abi != ix86_abi)
++ cum->sse_nregs = ix86_abi != SYSV_ABI ? X86_64_SSE_REGPARM_MAX
+ : X64_SSE_REGPARM_MAX;
+ }
+ }
+@@ -5700,7 +5832,7 @@
+ if (type)
+ mode = type_natural_mode (type, NULL);
+
+- if (TARGET_64BIT && (cum ? cum->call_abi : DEFAULT_ABI) == MS_ABI)
++ if (TARGET_64BIT && (cum ? cum->call_abi : ix86_abi) == MS_ABI)
+ function_arg_advance_ms_64 (cum, bytes, words);
+ else if (TARGET_64BIT)
+ function_arg_advance_64 (cum, mode, type, words, named);
+@@ -5846,9 +5978,9 @@
+ if (mode == VOIDmode)
+ return GEN_INT (cum->maybe_vaarg
+ ? (cum->sse_nregs < 0
+- ? (cum->call_abi == DEFAULT_ABI
++ ? (cum->call_abi == ix86_abi
+ ? SSE_REGPARM_MAX
+- : (DEFAULT_ABI != SYSV_ABI ? X86_64_SSE_REGPARM_MAX
++ : (ix86_abi != SYSV_ABI ? X86_64_SSE_REGPARM_MAX
+ : X64_SSE_REGPARM_MAX))
+ : cum->sse_regno)
+ : -1);
+@@ -5942,7 +6074,7 @@
+ if (type && TREE_CODE (type) == VECTOR_TYPE)
+ mode = type_natural_mode (type, cum);
+
+- if (TARGET_64BIT && (cum ? cum->call_abi : DEFAULT_ABI) == MS_ABI)
++ if (TARGET_64BIT && (cum ? cum->call_abi : ix86_abi) == MS_ABI)
+ return function_arg_ms_64 (cum, mode, omode, named, bytes);
+ else if (TARGET_64BIT)
+ return function_arg_64 (cum, mode, omode, type, named);
+@@ -5962,7 +6094,7 @@
+ const_tree type, bool named ATTRIBUTE_UNUSED)
+ {
+ /* See Windows x64 Software Convention. */
+- if (TARGET_64BIT && (cum ? cum->call_abi : DEFAULT_ABI) == MS_ABI)
++ if (TARGET_64BIT && (cum ? cum->call_abi : ix86_abi) == MS_ABI)
+ {
+ int msize = (int) GET_MODE_SIZE (mode);
+ if (type)
+@@ -6102,7 +6234,7 @@
+ /* TODO: The function should depend on current function ABI but
+ builtins.c would need updating then. Therefore we use the
+ default ABI. */
+- if (TARGET_64BIT && DEFAULT_ABI == MS_ABI)
++ if (TARGET_64BIT && ix86_abi == MS_ABI)
+ return false;
+ return TARGET_FLOAT_RETURNS_IN_80387;
+
+@@ -6498,13 +6630,13 @@
+ static tree
+ ix86_build_builtin_va_list (void)
+ {
+- tree ret = ix86_build_builtin_va_list_abi (DEFAULT_ABI);
++ tree ret = ix86_build_builtin_va_list_abi (ix86_abi);
+
+ /* Initialize abi specific va_list builtin types. */
+ if (TARGET_64BIT)
+ {
+ tree t;
+- if (DEFAULT_ABI == MS_ABI)
++ if (ix86_abi == MS_ABI)
+ {
+ t = ix86_build_builtin_va_list_abi (SYSV_ABI);
+ if (TREE_CODE (t) != RECORD_TYPE)
+@@ -6518,7 +6650,7 @@
+ t = build_variant_type_copy (t);
+ sysv_va_list_type_node = t;
+ }
+- if (DEFAULT_ABI != MS_ABI)
++ if (ix86_abi != MS_ABI)
+ {
+ t = ix86_build_builtin_va_list_abi (MS_ABI);
+ if (TREE_CODE (t) != RECORD_TYPE)
+@@ -6551,8 +6683,8 @@
+ int i;
+ int regparm = ix86_regparm;
+
+- if (cum->call_abi != DEFAULT_ABI)
+- regparm = DEFAULT_ABI != SYSV_ABI ? X86_64_REGPARM_MAX : X64_REGPARM_MAX;
++ if (cum->call_abi != ix86_abi)
++ regparm = ix86_abi != SYSV_ABI ? X86_64_REGPARM_MAX : X64_REGPARM_MAX;
+
+ /* GPR size of varargs save area. */
+ if (cfun->va_list_gpr_size)
+@@ -6705,7 +6837,7 @@
+ return true;
+ canonic = ix86_canonical_va_list_type (type);
+ return (canonic == ms_va_list_type_node
+- || (DEFAULT_ABI == MS_ABI && canonic == va_list_type_node));
++ || (ix86_abi == MS_ABI && canonic == va_list_type_node));
+ }
+
+ /* Implement va_start. */
+@@ -12987,6 +13119,316 @@
+ emit_move_insn (operands[0], dst);
+ }
+
++#define LEA_SEARCH_THRESHOLD 12
++
++/* Search backward for non-agu definition of register number REGNO1
++ or register number REGNO2 in INSN's basic block until
++ 1. Pass LEA_SEARCH_THRESHOLD instructions, or
++ 2. Reach BB boundary, or
++ 3. Reach agu definition.
++ Returns the distance between the non-agu definition point and INSN.
++ If no definition point, returns -1. */
++
++static int
++distance_non_agu_define (unsigned int regno1, unsigned int regno2,
++ rtx insn)
++{
++ basic_block bb = BLOCK_FOR_INSN (insn);
++ int distance = 0;
++ df_ref *def_rec;
++ enum attr_type insn_type;
++
++ if (insn != BB_HEAD (bb))
++ {
++ rtx prev = PREV_INSN (insn);
++ while (prev && distance < LEA_SEARCH_THRESHOLD)
++ {
++ if (INSN_P (prev))
++ {
++ distance++;
++ for (def_rec = DF_INSN_DEFS (prev); *def_rec; def_rec++)
++ if (DF_REF_TYPE (*def_rec) == DF_REF_REG_DEF
++ && !DF_REF_IS_ARTIFICIAL (*def_rec)
++ && (regno1 == DF_REF_REGNO (*def_rec)
++ || regno2 == DF_REF_REGNO (*def_rec)))
++ {
++ insn_type = get_attr_type (prev);
++ if (insn_type != TYPE_LEA)
++ goto done;
++ }
++ }
++ if (prev == BB_HEAD (bb))
++ break;
++ prev = PREV_INSN (prev);
++ }
++ }
++
++ if (distance < LEA_SEARCH_THRESHOLD)
++ {
++ edge e;
++ edge_iterator ei;
++ bool simple_loop = false;
++
++ FOR_EACH_EDGE (e, ei, bb->preds)
++ if (e->src == bb)
++ {
++ simple_loop = true;
++ break;
++ }
++
++ if (simple_loop)
++ {
++ rtx prev = BB_END (bb);
++ while (prev
++ && prev != insn
++ && distance < LEA_SEARCH_THRESHOLD)
++ {
++ if (INSN_P (prev))
++ {
++ distance++;
++ for (def_rec = DF_INSN_DEFS (prev); *def_rec; def_rec++)
++ if (DF_REF_TYPE (*def_rec) == DF_REF_REG_DEF
++ && !DF_REF_IS_ARTIFICIAL (*def_rec)
++ && (regno1 == DF_REF_REGNO (*def_rec)
++ || regno2 == DF_REF_REGNO (*def_rec)))
++ {
++ insn_type = get_attr_type (prev);
++ if (insn_type != TYPE_LEA)
++ goto done;
++ }
++ }
++ prev = PREV_INSN (prev);
++ }
++ }
++ }
++
++ distance = -1;
++
++done:
++ /* get_attr_type may modify recog data. We want to make sure
++ that recog data is valid for instruction INSN, on which
++ distance_non_agu_define is called. INSN is unchanged here. */
++ extract_insn_cached (insn);
++ return distance;
++}
++
++/* Return the distance between INSN and the next insn that uses
++ register number REGNO0 in memory address. Return -1 if no such
++ a use is found within LEA_SEARCH_THRESHOLD or REGNO0 is set. */
++
++static int
++distance_agu_use (unsigned int regno0, rtx insn)
++{
++ basic_block bb = BLOCK_FOR_INSN (insn);
++ int distance = 0;
++ df_ref *def_rec;
++ df_ref *use_rec;
++
++ if (insn != BB_END (bb))
++ {
++ rtx next = NEXT_INSN (insn);
++ while (next && distance < LEA_SEARCH_THRESHOLD)
++ {
++ if (INSN_P (next))
++ {
++ distance++;
++
++ for (use_rec = DF_INSN_USES (next); *use_rec; use_rec++)
++ if ((DF_REF_TYPE (*use_rec) == DF_REF_REG_MEM_LOAD
++ || DF_REF_TYPE (*use_rec) == DF_REF_REG_MEM_STORE)
++ && regno0 == DF_REF_REGNO (*use_rec))
++ {
++ /* Return DISTANCE if OP0 is used in memory
++ address in NEXT. */
++ return distance;
++ }
++
++ for (def_rec = DF_INSN_DEFS (next); *def_rec; def_rec++)
++ if (DF_REF_TYPE (*def_rec) == DF_REF_REG_DEF
++ && !DF_REF_IS_ARTIFICIAL (*def_rec)
++ && regno0 == DF_REF_REGNO (*def_rec))
++ {
++ /* Return -1 if OP0 is set in NEXT. */
++ return -1;
++ }
++ }
++ if (next == BB_END (bb))
++ break;
++ next = NEXT_INSN (next);
++ }
++ }
++
++ if (distance < LEA_SEARCH_THRESHOLD)
++ {
++ edge e;
++ edge_iterator ei;
++ bool simple_loop = false;
++
++ FOR_EACH_EDGE (e, ei, bb->succs)
++ if (e->dest == bb)
++ {
++ simple_loop = true;
++ break;
++ }
++
++ if (simple_loop)
++ {
++ rtx next = BB_HEAD (bb);
++ while (next
++ && next != insn
++ && distance < LEA_SEARCH_THRESHOLD)
++ {
++ if (INSN_P (next))
++ {
++ distance++;
++
++ for (use_rec = DF_INSN_USES (next); *use_rec; use_rec++)
++ if ((DF_REF_TYPE (*use_rec) == DF_REF_REG_MEM_LOAD
++ || DF_REF_TYPE (*use_rec) == DF_REF_REG_MEM_STORE)
++ && regno0 == DF_REF_REGNO (*use_rec))
++ {
++ /* Return DISTANCE if OP0 is used in memory
++ address in NEXT. */
++ return distance;
++ }
++
++ for (def_rec = DF_INSN_DEFS (next); *def_rec; def_rec++)
++ if (DF_REF_TYPE (*def_rec) == DF_REF_REG_DEF
++ && !DF_REF_IS_ARTIFICIAL (*def_rec)
++ && regno0 == DF_REF_REGNO (*def_rec))
++ {
++ /* Return -1 if OP0 is set in NEXT. */
++ return -1;
++ }
++
++ }
++ next = NEXT_INSN (next);
++ }
++ }
++ }
++
++ return -1;
++}
++
++/* Define this macro to tune LEA priority vs ADD, it take effect when
++ there is a dilemma of choicing LEA or ADD
++ Negative value: ADD is more preferred than LEA
++ Zero: Netrual
++ Positive value: LEA is more preferred than ADD*/
++#define IX86_LEA_PRIORITY 2
++
++/* Return true if it is ok to optimize an ADD operation to LEA
++ operation to avoid flag register consumation. For the processors
++ like ATOM, if the destination register of LEA holds an actual
++ address which will be used soon, LEA is better and otherwise ADD
++ is better. */
++
++bool
++ix86_lea_for_add_ok (enum rtx_code code ATTRIBUTE_UNUSED,
++ rtx insn, rtx operands[])
++{
++ unsigned int regno0 = true_regnum (operands[0]);
++ unsigned int regno1 = true_regnum (operands[1]);
++ unsigned int regno2;
++
++ if (!TARGET_OPT_AGU || optimize_function_for_size_p (cfun))
++ return regno0 != regno1;
++
++ regno2 = true_regnum (operands[2]);
++
++ /* If a = b + c, (a!=b && a!=c), must use lea form. */
++ if (regno0 != regno1 && regno0 != regno2)
++ return true;
++ else
++ {
++ int dist_define, dist_use;
++ dist_define = distance_non_agu_define (regno1, regno2, insn);
++ if (dist_define <= 0)
++ return true;
++
++ /* If this insn has both backward non-agu dependence and forward
++ agu dependence, the one with short distance take effect. */
++ dist_use = distance_agu_use (regno0, insn);
++ if (dist_use <= 0
++ || (dist_define + IX86_LEA_PRIORITY) < dist_use)
++ return false;
++
++ return true;
++ }
++}
++
++/* Return true if destination reg of SET_BODY is shift count of
++ USE_BODY. */
++
++static bool
++ix86_dep_by_shift_count_body (const_rtx set_body, const_rtx use_body)
++{
++ rtx set_dest;
++ rtx shift_rtx;
++ int i;
++
++ /* Retrieve destination of SET_BODY. */
++ switch (GET_CODE (set_body))
++ {
++ case SET:
++ set_dest = SET_DEST (set_body);
++ if (!set_dest || !REG_P (set_dest))
++ return false;
++ break;
++ case PARALLEL:
++ for (i = XVECLEN (set_body, 0) - 1; i >= 0; i--)
++ if (ix86_dep_by_shift_count_body (XVECEXP (set_body, 0, i),
++ use_body))
++ return true;
++ default:
++ return false;
++ break;
++ }
++
++ /* Retrieve shift count of USE_BODY. */
++ switch (GET_CODE (use_body))
++ {
++ case SET:
++ shift_rtx = XEXP (use_body, 1);
++ break;
++ case PARALLEL:
++ for (i = XVECLEN (use_body, 0) - 1; i >= 0; i--)
++ if (ix86_dep_by_shift_count_body (set_body,
++ XVECEXP (use_body, 0, i)))
++ return true;
++ default:
++ return false;
++ break;
++ }
++
++ if (shift_rtx
++ && (GET_CODE (shift_rtx) == ASHIFT
++ || GET_CODE (shift_rtx) == LSHIFTRT
++ || GET_CODE (shift_rtx) == ASHIFTRT
++ || GET_CODE (shift_rtx) == ROTATE
++ || GET_CODE (shift_rtx) == ROTATERT))
++ {
++ rtx shift_count = XEXP (shift_rtx, 1);
++
++ /* Return true if shift count is dest of SET_BODY. */
++ if (REG_P (shift_count)
++ && true_regnum (set_dest) == true_regnum (shift_count))
++ return true;
++ }
++
++ return false;
++}
++
++/* Return true if destination reg of SET_INSN is shift count of
++ USE_INSN. */
++
++bool
++ix86_dep_by_shift_count (const_rtx set_insn, const_rtx use_insn)
++{
++ return ix86_dep_by_shift_count_body (PATTERN (set_insn),
++ PATTERN (use_insn));
++}
++
+ /* Return TRUE or FALSE depending on whether the unary operator meets the
+ appropriate constraints. */
+
+@@ -18838,7 +19280,7 @@
+ f = GGC_CNEW (struct machine_function);
+ f->use_fast_prologue_epilogue_nregs = -1;
+ f->tls_descriptor_call_expanded_p = 0;
+- f->call_abi = DEFAULT_ABI;
++ f->call_abi = ix86_abi;
+
+ return f;
+ }
+@@ -19099,6 +19541,7 @@
+ switch (ix86_tune)
+ {
+ case PROCESSOR_PENTIUM:
++ case PROCESSOR_ATOM:
+ case PROCESSOR_K6:
+ return 2;
+
+@@ -19165,41 +19608,21 @@
+ return 1;
+ }
+
+-/* A subroutine of ix86_adjust_cost -- return true iff INSN has a memory
+- address with operands set by DEP_INSN. */
++/* Return true iff USE_INSN has a memory address with operands set by
++ SET_INSN. */
+
+-static int
+-ix86_agi_dependent (rtx insn, rtx dep_insn, enum attr_type insn_type)
++bool
++ix86_agi_dependent (rtx set_insn, rtx use_insn)
+ {
+- rtx addr;
+-
+- if (insn_type == TYPE_LEA
+- && TARGET_PENTIUM)
+- {
+- addr = PATTERN (insn);
+-
+- if (GET_CODE (addr) == PARALLEL)
+- addr = XVECEXP (addr, 0, 0);
+-
+- gcc_assert (GET_CODE (addr) == SET);
+-
+- addr = SET_SRC (addr);
+- }
+- else
+- {
+- int i;
+- extract_insn_cached (insn);
+- for (i = recog_data.n_operands - 1; i >= 0; --i)
+- if (MEM_P (recog_data.operand[i]))
+- {
+- addr = XEXP (recog_data.operand[i], 0);
+- goto found;
+- }
+- return 0;
+- found:;
+- }
+-
+- return modified_in_p (addr, dep_insn);
++ int i;
++ extract_insn_cached (use_insn);
++ for (i = recog_data.n_operands - 1; i >= 0; --i)
++ if (MEM_P (recog_data.operand[i]))
++ {
++ rtx addr = XEXP (recog_data.operand[i], 0);
++ return modified_in_p (addr, set_insn) != 0;
++ }
++ return false;
+ }
+
+ static int
+@@ -19227,7 +19650,20 @@
+ {
+ case PROCESSOR_PENTIUM:
+ /* Address Generation Interlock adds a cycle of latency. */
+- if (ix86_agi_dependent (insn, dep_insn, insn_type))
++ if (insn_type == TYPE_LEA)
++ {
++ rtx addr = PATTERN (insn);
++
++ if (GET_CODE (addr) == PARALLEL)
++ addr = XVECEXP (addr, 0, 0);
++
++ gcc_assert (GET_CODE (addr) == SET);
++
++ addr = SET_SRC (addr);
++ if (modified_in_p (addr, dep_insn))
++ cost += 1;
++ }
++ else if (ix86_agi_dependent (dep_insn, insn))
+ cost += 1;
+
+ /* ??? Compares pair with jump/setcc. */
+@@ -19237,7 +19673,7 @@
+ /* Floating point stores require value to be ready one cycle earlier. */
+ if (insn_type == TYPE_FMOV
+ && get_attr_memory (insn) == MEMORY_STORE
+- && !ix86_agi_dependent (insn, dep_insn, insn_type))
++ && !ix86_agi_dependent (dep_insn, insn))
+ cost += 1;
+ break;
+
+@@ -19260,7 +19696,7 @@
+ in parallel with previous instruction in case
+ previous instruction is not needed to compute the address. */
+ if ((memory == MEMORY_LOAD || memory == MEMORY_BOTH)
+- && !ix86_agi_dependent (insn, dep_insn, insn_type))
++ && !ix86_agi_dependent (dep_insn, insn))
+ {
+ /* Claim moves to take one cycle, as core can issue one load
+ at time and the next load can start cycle later. */
+@@ -19289,7 +19725,7 @@
+ in parallel with previous instruction in case
+ previous instruction is not needed to compute the address. */
+ if ((memory == MEMORY_LOAD || memory == MEMORY_BOTH)
+- && !ix86_agi_dependent (insn, dep_insn, insn_type))
++ && !ix86_agi_dependent (dep_insn, insn))
+ {
+ /* Claim moves to take one cycle, as core can issue one load
+ at time and the next load can start cycle later. */
+@@ -19306,6 +19742,7 @@
+ case PROCESSOR_ATHLON:
+ case PROCESSOR_K8:
+ case PROCESSOR_AMDFAM10:
++ case PROCESSOR_ATOM:
+ case PROCESSOR_GENERIC32:
+ case PROCESSOR_GENERIC64:
+ memory = get_attr_memory (insn);
+@@ -19314,7 +19751,7 @@
+ in parallel with previous instruction in case
+ previous instruction is not needed to compute the address. */
+ if ((memory == MEMORY_LOAD || memory == MEMORY_BOTH)
+- && !ix86_agi_dependent (insn, dep_insn, insn_type))
++ && !ix86_agi_dependent (dep_insn, insn))
+ {
+ enum attr_unit unit = get_attr_unit (insn);
+ int loadcost = 3;
+@@ -29594,14 +30031,11 @@
+ tree
+ ix86_fn_abi_va_list (tree fndecl)
+ {
+- int abi;
+-
+ if (!TARGET_64BIT)
+ return va_list_type_node;
+ gcc_assert (fndecl != NULL_TREE);
+- abi = ix86_function_abi ((const_tree) fndecl);
+
+- if (abi == MS_ABI)
++ if (ix86_function_abi ((const_tree) fndecl) == MS_ABI)
+ return ms_va_list_type_node;
+ else
+ return sysv_va_list_type_node;
+diff -Nur a/gcc/config/i386/i386-c.c b/gcc/config/i386/i386-c.c
+--- a/gcc/config/i386/i386-c.c 2008-08-31 01:50:40.000000000 +0200
++++ b/gcc/config/i386/i386-c.c 2010-01-25 09:50:29.005686600 +0100
+@@ -119,6 +119,10 @@
+ def_or_undef (parse_in, "__core2");
+ def_or_undef (parse_in, "__core2__");
+ break;
++ case PROCESSOR_ATOM:
++ def_or_undef (parse_in, "__atom");
++ def_or_undef (parse_in, "__atom__");
++ break;
+ /* use PROCESSOR_max to not set/unset the arch macro. */
+ case PROCESSOR_max:
+ break;
+@@ -187,6 +191,9 @@
+ case PROCESSOR_CORE2:
+ def_or_undef (parse_in, "__tune_core2__");
+ break;
++ case PROCESSOR_ATOM:
++ def_or_undef (parse_in, "__tune_atom__");
++ break;
+ case PROCESSOR_GENERIC32:
+ case PROCESSOR_GENERIC64:
+ break;
+diff -Nur a/gcc/config/i386/i386.h b/gcc/config/i386/i386.h
+--- a/gcc/config/i386/i386.h 2009-07-11 21:06:26.000000000 +0200
++++ b/gcc/config/i386/i386.h 2010-01-25 09:50:29.005686600 +0100
+@@ -59,6 +59,7 @@
+ #define TARGET_ABM OPTION_ISA_ABM
+ #define TARGET_POPCNT OPTION_ISA_POPCNT
+ #define TARGET_SAHF OPTION_ISA_SAHF
++#define TARGET_MOVBE OPTION_ISA_MOVBE
+ #define TARGET_AES OPTION_ISA_AES
+ #define TARGET_PCLMUL OPTION_ISA_PCLMUL
+ #define TARGET_CMPXCHG16B OPTION_ISA_CX16
+@@ -236,6 +237,7 @@
+ #define TARGET_GENERIC64 (ix86_tune == PROCESSOR_GENERIC64)
+ #define TARGET_GENERIC (TARGET_GENERIC32 || TARGET_GENERIC64)
+ #define TARGET_AMDFAM10 (ix86_tune == PROCESSOR_AMDFAM10)
++#define TARGET_ATOM (ix86_tune == PROCESSOR_ATOM)
+
+ /* Feature tests against the various tunings. */
+ enum ix86_tune_indices {
+@@ -300,6 +302,7 @@
+ X86_TUNE_USE_VECTOR_FP_CONVERTS,
+ X86_TUNE_USE_VECTOR_CONVERTS,
+ X86_TUNE_FUSE_CMP_AND_BRANCH,
++ X86_TUNE_OPT_AGU,
+
+ X86_TUNE_LAST
+ };
+@@ -387,6 +390,7 @@
+ ix86_tune_features[X86_TUNE_USE_VECTOR_CONVERTS]
+ #define TARGET_FUSE_CMP_AND_BRANCH \
+ ix86_tune_features[X86_TUNE_FUSE_CMP_AND_BRANCH]
++#define TARGET_OPT_AGU ix86_tune_features[X86_TUNE_OPT_AGU]
+
+ /* Feature tests against the various architecture variations. */
+ enum ix86_arch_indices {
+@@ -470,7 +474,10 @@
+ MS_ABI = 1
+ };
+
+-/* The default abi form used by target. */
++/* The abi used by target. */
++extern enum calling_abi ix86_abi;
++
++/* The default abi used by target. */
+ #define DEFAULT_ABI SYSV_ABI
+
+ /* Subtargets may reset this to 1 in order to enable 96-bit long double
+@@ -569,6 +576,7 @@
+ TARGET_CPU_DEFAULT_prescott,
+ TARGET_CPU_DEFAULT_nocona,
+ TARGET_CPU_DEFAULT_core2,
++ TARGET_CPU_DEFAULT_atom,
+
+ TARGET_CPU_DEFAULT_geode,
+ TARGET_CPU_DEFAULT_k6,
+@@ -658,7 +666,7 @@
+
+ /* Boundary (in *bits*) on which stack pointer should be aligned. */
+ #define STACK_BOUNDARY \
+- (TARGET_64BIT && DEFAULT_ABI == MS_ABI ? 128 : BITS_PER_WORD)
++ (TARGET_64BIT && ix86_abi == MS_ABI ? 128 : BITS_PER_WORD)
+
+ /* Stack boundary of the main function guaranteed by OS. */
+ #define MAIN_STACK_BOUNDARY (TARGET_64BIT ? 128 : 32)
+@@ -1584,7 +1592,7 @@
+ int maybe_vaarg; /* true for calls to possibly vardic fncts. */
+ int float_in_sse; /* 1 if in 32-bit mode SFmode (2 for DFmode) should
+ be passed in SSE registers. Otherwise 0. */
+- int call_abi; /* Set to SYSV_ABI for sysv abi. Otherwise
++ enum calling_abi call_abi; /* Set to SYSV_ABI for sysv abi. Otherwise
+ MS_ABI for ms abi. */
+ } CUMULATIVE_ARGS;
+
+@@ -2230,6 +2238,7 @@
+ PROCESSOR_GENERIC32,
+ PROCESSOR_GENERIC64,
+ PROCESSOR_AMDFAM10,
++ PROCESSOR_ATOM,
+ PROCESSOR_max
+ };
+
+@@ -2403,7 +2412,7 @@
+ int tls_descriptor_call_expanded_p;
+ /* This value is used for amd64 targets and specifies the current abi
+ to be used. MS_ABI means ms abi. Otherwise SYSV_ABI means sysv abi. */
+- int call_abi;
++ enum calling_abi call_abi;
+ };
+
+ #define ix86_stack_locals (cfun->machine->stack_locals)
+diff -Nur a/gcc/config/i386/i386.md b/gcc/config/i386/i386.md
+--- a/gcc/config/i386/i386.md 2009-07-08 18:59:15.000000000 +0200
++++ b/gcc/config/i386/i386.md 2010-01-25 09:50:29.015687523 +0100
+@@ -316,7 +316,7 @@
+
+
+ ;; Processor type.
+-(define_attr "cpu" "none,pentium,pentiumpro,geode,k6,athlon,k8,core2,
++(define_attr "cpu" "none,pentium,pentiumpro,geode,k6,athlon,k8,core2,atom,
+ generic64,amdfam10"
+ (const (symbol_ref "ix86_schedule")))
+
+@@ -612,6 +612,12 @@
+ (define_attr "i387_cw" "trunc,floor,ceil,mask_pm,uninitialized,any"
+ (const_string "any"))
+
++;; Define attribute to classify add/sub insns that consumes carry flag (CF)
++(define_attr "use_carry" "0,1" (const_string "0"))
++
++;; Define attribute to indicate unaligned ssemov insns
++(define_attr "movu" "0,1" (const_string "0"))
++
+ ;; Describe a user's asm statement.
+ (define_asm_attributes
+ [(set_attr "length" "128")
+@@ -727,6 +733,7 @@
+ (include "k6.md")
+ (include "athlon.md")
+ (include "geode.md")
++(include "atom.md")
+
+
+ ;; Operand and operator predicates and constraints
+@@ -5790,6 +5797,7 @@
+ "TARGET_64BIT && ix86_binary_operator_ok (PLUS, DImode, operands)"
+ "adc{q}\t{%2, %0|%0, %2}"
+ [(set_attr "type" "alu")
++ (set_attr "use_carry" "1")
+ (set_attr "pent_pair" "pu")
+ (set_attr "mode" "DI")])
+
+@@ -5864,6 +5872,7 @@
+ "ix86_binary_operator_ok (PLUS, QImode, operands)"
+ "adc{b}\t{%2, %0|%0, %2}"
+ [(set_attr "type" "alu")
++ (set_attr "use_carry" "1")
+ (set_attr "pent_pair" "pu")
+ (set_attr "mode" "QI")])
+
+@@ -5876,6 +5885,7 @@
+ "ix86_binary_operator_ok (PLUS, HImode, operands)"
+ "adc{w}\t{%2, %0|%0, %2}"
+ [(set_attr "type" "alu")
++ (set_attr "use_carry" "1")
+ (set_attr "pent_pair" "pu")
+ (set_attr "mode" "HI")])
+
+@@ -5888,6 +5898,7 @@
+ "ix86_binary_operator_ok (PLUS, SImode, operands)"
+ "adc{l}\t{%2, %0|%0, %2}"
+ [(set_attr "type" "alu")
++ (set_attr "use_carry" "1")
+ (set_attr "pent_pair" "pu")
+ (set_attr "mode" "SI")])
+
+@@ -5901,6 +5912,7 @@
+ "TARGET_64BIT && ix86_binary_operator_ok (PLUS, SImode, operands)"
+ "adc{l}\t{%2, %k0|%k0, %2}"
+ [(set_attr "type" "alu")
++ (set_attr "use_carry" "1")
+ (set_attr "pent_pair" "pu")
+ (set_attr "mode" "SI")])
+
+@@ -6130,9 +6142,9 @@
+ (set_attr "mode" "SI")])
+
+ (define_insn "*adddi_1_rex64"
+- [(set (match_operand:DI 0 "nonimmediate_operand" "=r,rm,r")
+- (plus:DI (match_operand:DI 1 "nonimmediate_operand" "%0,0,r")
+- (match_operand:DI 2 "x86_64_general_operand" "rme,re,le")))
++ [(set (match_operand:DI 0 "nonimmediate_operand" "=r,rm,r,r")
++ (plus:DI (match_operand:DI 1 "nonimmediate_operand" "%0,0,r,r")
++ (match_operand:DI 2 "x86_64_general_operand" "rme,re,0,le")))
+ (clobber (reg:CC FLAGS_REG))]
+ "TARGET_64BIT && ix86_binary_operator_ok (PLUS, DImode, operands)"
+ {
+@@ -6153,6 +6165,10 @@
+ }
+
+ default:
++ /* Use add as much as possible to replace lea for AGU optimization. */
++ if (which_alternative == 2 && TARGET_OPT_AGU)
++ return "add{q}\t{%1, %0|%0, %1}";
++
+ gcc_assert (rtx_equal_p (operands[0], operands[1]));
+
+ /* Make things pretty and `subl $4,%eax' rather than `addl $-4, %eax'.
+@@ -6171,8 +6187,11 @@
+ }
+ }
+ [(set (attr "type")
+- (cond [(eq_attr "alternative" "2")
++ (cond [(and (eq_attr "alternative" "2")
++ (eq (symbol_ref "TARGET_OPT_AGU") (const_int 0)))
+ (const_string "lea")
++ (eq_attr "alternative" "3")
++ (const_string "lea")
+ ; Current assemblers are broken and do not allow @GOTOFF in
+ ; ought but a memory context.
+ (match_operand:DI 2 "pic_symbolic_operand" "")
+@@ -6189,8 +6208,8 @@
+ (plus:DI (match_operand:DI 1 "register_operand" "")
+ (match_operand:DI 2 "x86_64_nonmemory_operand" "")))
+ (clobber (reg:CC FLAGS_REG))]
+- "TARGET_64BIT && reload_completed
+- && true_regnum (operands[0]) != true_regnum (operands[1])"
++ "TARGET_64BIT && reload_completed
++ && ix86_lea_for_add_ok (PLUS, insn, operands)"
+ [(set (match_dup 0)
+ (plus:DI (match_dup 1)
+ (match_dup 2)))]
+@@ -6394,9 +6413,9 @@
+
+
+ (define_insn "*addsi_1"
+- [(set (match_operand:SI 0 "nonimmediate_operand" "=r,rm,r")
+- (plus:SI (match_operand:SI 1 "nonimmediate_operand" "%0,0,r")
+- (match_operand:SI 2 "general_operand" "g,ri,li")))
++ [(set (match_operand:SI 0 "nonimmediate_operand" "=r,rm,r,r")
++ (plus:SI (match_operand:SI 1 "nonimmediate_operand" "%0,0,r,r")
++ (match_operand:SI 2 "general_operand" "g,ri,0,li")))
+ (clobber (reg:CC FLAGS_REG))]
+ "ix86_binary_operator_ok (PLUS, SImode, operands)"
+ {
+@@ -6417,6 +6436,10 @@
+ }
+
+ default:
++ /* Use add as much as possible to replace lea for AGU optimization. */
++ if (which_alternative == 2 && TARGET_OPT_AGU)
++ return "add{l}\t{%1, %0|%0, %1}";
++
+ gcc_assert (rtx_equal_p (operands[0], operands[1]));
+
+ /* Make things pretty and `subl $4,%eax' rather than `addl $-4, %eax'.
+@@ -6433,7 +6456,10 @@
+ }
+ }
+ [(set (attr "type")
+- (cond [(eq_attr "alternative" "2")
++ (cond [(and (eq_attr "alternative" "2")
++ (eq (symbol_ref "TARGET_OPT_AGU") (const_int 0)))
++ (const_string "lea")
++ (eq_attr "alternative" "3")
+ (const_string "lea")
+ ; Current assemblers are broken and do not allow @GOTOFF in
+ ; ought but a memory context.
+@@ -6451,8 +6477,7 @@
+ (plus (match_operand 1 "register_operand" "")
+ (match_operand 2 "nonmemory_operand" "")))
+ (clobber (reg:CC FLAGS_REG))]
+- "reload_completed
+- && true_regnum (operands[0]) != true_regnum (operands[1])"
++ "reload_completed && ix86_lea_for_add_ok (PLUS, insn, operands)"
+ [(const_int 0)]
+ {
+ rtx pat;
+@@ -7553,6 +7578,7 @@
+ "TARGET_64BIT && ix86_binary_operator_ok (MINUS, DImode, operands)"
+ "sbb{q}\t{%2, %0|%0, %2}"
+ [(set_attr "type" "alu")
++ (set_attr "use_carry" "1")
+ (set_attr "pent_pair" "pu")
+ (set_attr "mode" "DI")])
+
+@@ -7601,6 +7627,7 @@
+ "ix86_binary_operator_ok (MINUS, QImode, operands)"
+ "sbb{b}\t{%2, %0|%0, %2}"
+ [(set_attr "type" "alu")
++ (set_attr "use_carry" "1")
+ (set_attr "pent_pair" "pu")
+ (set_attr "mode" "QI")])
+
+@@ -7613,6 +7640,7 @@
+ "ix86_binary_operator_ok (MINUS, HImode, operands)"
+ "sbb{w}\t{%2, %0|%0, %2}"
+ [(set_attr "type" "alu")
++ (set_attr "use_carry" "1")
+ (set_attr "pent_pair" "pu")
+ (set_attr "mode" "HI")])
+
+@@ -7625,6 +7653,7 @@
+ "ix86_binary_operator_ok (MINUS, SImode, operands)"
+ "sbb{l}\t{%2, %0|%0, %2}"
+ [(set_attr "type" "alu")
++ (set_attr "use_carry" "1")
+ (set_attr "pent_pair" "pu")
+ (set_attr "mode" "SI")])
+
+@@ -15155,7 +15184,7 @@
+ ? gen_rtx_REG (XCmode, FIRST_FLOAT_REG) : NULL),
+ operands[0], const0_rtx,
+ GEN_INT ((TARGET_64BIT
+- ? (DEFAULT_ABI == SYSV_ABI
++ ? (ix86_abi == SYSV_ABI
+ ? X86_64_SSE_REGPARM_MAX
+ : X64_SSE_REGPARM_MAX)
+ : X86_32_SSE_REGPARM_MAX)
+@@ -15235,6 +15264,7 @@
+ "reload_completed"
+ "ret"
+ [(set_attr "length" "1")
++ (set_attr "atom_unit" "jeu")
+ (set_attr "length_immediate" "0")
+ (set_attr "modrm" "0")])
+
+@@ -15247,6 +15277,7 @@
+ "reload_completed"
+ "rep\;ret"
+ [(set_attr "length" "1")
++ (set_attr "atom_unit" "jeu")
+ (set_attr "length_immediate" "0")
+ (set_attr "prefix_rep" "1")
+ (set_attr "modrm" "0")])
+@@ -15257,6 +15288,7 @@
+ "reload_completed"
+ "ret\t%0"
+ [(set_attr "length" "3")
++ (set_attr "atom_unit" "jeu")
+ (set_attr "length_immediate" "2")
+ (set_attr "modrm" "0")])
+
+@@ -15610,7 +15642,7 @@
+ (bswap:SI (match_operand:SI 1 "register_operand" "")))]
+ ""
+ {
+- if (!TARGET_BSWAP)
++ if (!(TARGET_BSWAP || TARGET_MOVBE))
+ {
+ rtx x = operands[0];
+
+@@ -15622,6 +15654,21 @@
+ }
+ })
+
++(define_insn "*bswapsi_movbe"
++ [(set (match_operand:SI 0 "nonimmediate_operand" "=r,r,m")
++ (bswap:SI (match_operand:SI 1 "nonimmediate_operand" "0,m,r")))]
++ "TARGET_MOVBE && !(MEM_P (operands[0]) && MEM_P (operands[1]))"
++ "@
++ bswap\t%0
++ movbe\t{%1, %0|%0, %1}
++ movbe\t{%1, %0|%0, %1}"
++ [(set_attr "type" "*,imov,imov")
++ (set_attr "modrm" "*,1,1")
++ (set_attr "prefix_0f" "1")
++ (set_attr "prefix_extra" "*,1,1")
++ (set_attr "length" "2,*,*")
++ (set_attr "mode" "SI")])
++
+ (define_insn "*bswapsi_1"
+ [(set (match_operand:SI 0 "register_operand" "=r")
+ (bswap:SI (match_operand:SI 1 "register_operand" "0")))]
+@@ -15650,7 +15697,29 @@
+ [(set_attr "length" "4")
+ (set_attr "mode" "HI")])
+
+-(define_insn "bswapdi2"
++(define_expand "bswapdi2"
++ [(set (match_operand:DI 0 "register_operand" "")
++ (bswap:DI (match_operand:DI 1 "register_operand" "")))]
++ "TARGET_64BIT"
++ "")
++
++(define_insn "*bswapdi_movbe"
++ [(set (match_operand:DI 0 "nonimmediate_operand" "=r,r,m")
++ (bswap:DI (match_operand:DI 1 "nonimmediate_operand" "0,m,r")))]
++ "TARGET_64BIT && TARGET_MOVBE
++ && !(MEM_P (operands[0]) && MEM_P (operands[1]))"
++ "@
++ bswap\t%0
++ movbe\t{%1, %0|%0, %1}
++ movbe\t{%1, %0|%0, %1}"
++ [(set_attr "type" "*,imov,imov")
++ (set_attr "modrm" "*,1,1")
++ (set_attr "prefix_0f" "1")
++ (set_attr "prefix_extra" "*,1,1")
++ (set_attr "length" "3,*,*")
++ (set_attr "mode" "DI")])
++
++(define_insn "*bswapdi_1"
+ [(set (match_operand:DI 0 "register_operand" "=r")
+ (bswap:DI (match_operand:DI 1 "register_operand" "0")))]
+ "TARGET_64BIT"
+@@ -16378,6 +16447,7 @@
+ "TARGET_SSE_MATH"
+ "%vrcpss\t{%1, %d0|%d0, %1}"
+ [(set_attr "type" "sse")
++ (set_attr "atom_sse_attr" "rcp")
+ (set_attr "prefix" "maybe_vex")
+ (set_attr "mode" "SF")])
+
+@@ -16729,6 +16799,7 @@
+ "TARGET_SSE_MATH"
+ "%vrsqrtss\t{%1, %d0|%d0, %1}"
+ [(set_attr "type" "sse")
++ (set_attr "atom_sse_attr" "rcp")
+ (set_attr "prefix" "maybe_vex")
+ (set_attr "mode" "SF")])
+
+@@ -16749,6 +16820,7 @@
+ "SSE_FLOAT_MODE_P (<MODE>mode) && TARGET_SSE_MATH"
+ "%vsqrts<ssemodefsuffix>\t{%1, %d0|%d0, %1}"
+ [(set_attr "type" "sse")
++ (set_attr "atom_sse_attr" "sqrt")
+ (set_attr "prefix" "maybe_vex")
+ (set_attr "mode" "<MODE>")
+ (set_attr "athlon_decode" "*")
+@@ -19802,6 +19874,7 @@
+ ; Since we don't have the proper number of operands for an alu insn,
+ ; fill in all the blanks.
+ [(set_attr "type" "alu")
++ (set_attr "use_carry" "1")
+ (set_attr "pent_pair" "pu")
+ (set_attr "memory" "none")
+ (set_attr "imm_disp" "false")
+@@ -19817,6 +19890,7 @@
+ ""
+ "sbb{q}\t%0, %0"
+ [(set_attr "type" "alu")
++ (set_attr "use_carry" "1")
+ (set_attr "pent_pair" "pu")
+ (set_attr "memory" "none")
+ (set_attr "imm_disp" "false")
+@@ -19860,6 +19934,7 @@
+ ; Since we don't have the proper number of operands for an alu insn,
+ ; fill in all the blanks.
+ [(set_attr "type" "alu")
++ (set_attr "use_carry" "1")
+ (set_attr "pent_pair" "pu")
+ (set_attr "memory" "none")
+ (set_attr "imm_disp" "false")
+@@ -19875,6 +19950,7 @@
+ ""
+ "sbb{l}\t%0, %0"
+ [(set_attr "type" "alu")
++ (set_attr "use_carry" "1")
+ (set_attr "pent_pair" "pu")
+ (set_attr "memory" "none")
+ (set_attr "imm_disp" "false")
+@@ -20207,7 +20283,8 @@
+ }
+ }
+ [(set (attr "type")
+- (cond [(eq_attr "alternative" "0")
++ (cond [(and (eq_attr "alternative" "0")
++ (eq (symbol_ref "TARGET_OPT_AGU") (const_int 0)))
+ (const_string "alu")
+ (match_operand:SI 2 "const0_operand" "")
+ (const_string "imov")
+@@ -20250,7 +20327,8 @@
+ }
+ }
+ [(set (attr "type")
+- (cond [(eq_attr "alternative" "0")
++ (cond [(and (eq_attr "alternative" "0")
++ (eq (symbol_ref "TARGET_OPT_AGU") (const_int 0)))
+ (const_string "alu")
+ (match_operand:DI 2 "const0_operand" "")
+ (const_string "imov")
+@@ -21734,6 +21812,7 @@
+ return patterns[locality];
+ }
+ [(set_attr "type" "sse")
++ (set_attr "atom_sse_attr" "prefetch")
+ (set_attr "memory" "none")])
+
+ (define_insn "*prefetch_sse_rex"
+@@ -21752,6 +21831,7 @@
+ return patterns[locality];
+ }
+ [(set_attr "type" "sse")
++ (set_attr "atom_sse_attr" "prefetch")
+ (set_attr "memory" "none")])
+
+ (define_insn "*prefetch_3dnow"
+diff -Nur a/gcc/config/i386/i386.opt b/gcc/config/i386/i386.opt
+--- a/gcc/config/i386/i386.opt 2009-02-20 16:20:38.000000000 +0100
++++ b/gcc/config/i386/i386.opt 2010-01-25 09:50:29.015687523 +0100
+@@ -228,6 +228,10 @@
+ Target RejectNegative Joined Var(ix86_tune_string)
+ Schedule code for given CPU
+
++mabi=
++Target RejectNegative Joined Var(ix86_abi_string)
++Generate code that conforms to the given ABI
++
+ mveclibabi=
+ Target RejectNegative Joined Var(ix86_veclibabi_string)
+ Vector library ABI to use
+@@ -335,6 +339,10 @@
+ Target Report Mask(ISA_SAHF) Var(ix86_isa_flags) VarExists Save
+ Support code generation of sahf instruction in 64bit x86-64 code.
+
++mmovbe
++Target Report Mask(ISA_MOVBE) Var(ix86_isa_flags) VarExists Save
++Support code generation of movbe instruction.
++
+ maes
+ Target Report Mask(ISA_AES) Var(ix86_isa_flags) VarExists Save
+ Support AES built-in functions and code generation
+diff -Nur a/gcc/config/i386/i386-protos.h b/gcc/config/i386/i386-protos.h
+--- a/gcc/config/i386/i386-protos.h 2009-07-11 21:06:26.000000000 +0200
++++ b/gcc/config/i386/i386-protos.h 2010-01-25 09:50:29.015687523 +0100
+@@ -86,6 +86,9 @@
+ extern void ix86_expand_binary_operator (enum rtx_code,
+ enum machine_mode, rtx[]);
+ extern int ix86_binary_operator_ok (enum rtx_code, enum machine_mode, rtx[]);
++extern bool ix86_lea_for_add_ok (enum rtx_code, rtx, rtx[]);
++extern bool ix86_dep_by_shift_count (const_rtx set_insn, const_rtx use_insn);
++extern bool ix86_agi_dependent (rtx set_insn, rtx use_insn);
+ extern void ix86_expand_unary_operator (enum rtx_code, enum machine_mode,
+ rtx[]);
+ extern rtx ix86_build_const_vector (enum machine_mode, bool, rtx);
+@@ -140,9 +143,8 @@
+ extern bool ix86_sol10_return_in_memory (const_tree,const_tree);
+ extern rtx ix86_force_to_memory (enum machine_mode, rtx);
+ extern void ix86_free_from_memory (enum machine_mode);
+-extern int ix86_cfun_abi (void);
+-extern int ix86_function_abi (const_tree);
+-extern int ix86_function_type_abi (const_tree);
++extern enum calling_abi ix86_cfun_abi (void);
++extern enum calling_abi ix86_function_type_abi (const_tree);
+ extern void ix86_call_abi_override (const_tree);
+ extern tree ix86_fn_abi_va_list (tree);
+ extern tree ix86_canonical_va_list_type (tree);
+diff -Nur a/gcc/config/i386/mingw32.h b/gcc/config/i386/mingw32.h
+--- a/gcc/config/i386/mingw32.h 2009-02-20 16:20:38.000000000 +0100
++++ b/gcc/config/i386/mingw32.h 2010-01-25 09:50:29.015687523 +0100
+@@ -38,7 +38,7 @@
+ builtin_define_std ("WINNT"); \
+ builtin_define_with_int_value ("_INTEGRAL_MAX_BITS", \
+ TYPE_PRECISION (intmax_type_node));\
+- if (TARGET_64BIT && DEFAULT_ABI == MS_ABI) \
++ if (TARGET_64BIT && ix86_abi == MS_ABI) \
+ { \
+ builtin_define ("__MINGW64__"); \
+ builtin_define_std ("WIN64"); \
+diff -Nur a/gcc/config/i386/sse.md b/gcc/config/i386/sse.md
+--- a/gcc/config/i386/sse.md 2009-05-06 15:20:41.000000000 +0200
++++ b/gcc/config/i386/sse.md 2010-01-25 09:50:29.015687523 +0100
+@@ -338,6 +338,7 @@
+ && !(MEM_P (operands[0]) && MEM_P (operands[1]))"
+ "vmovup<avxmodesuffixf2c>\t{%1, %0|%0, %1}"
+ [(set_attr "type" "ssemov")
++ (set_attr "movu" "1")
+ (set_attr "prefix" "vex")
+ (set_attr "mode" "<MODE>")])
+
+@@ -363,6 +364,7 @@
+ && !(MEM_P (operands[0]) && MEM_P (operands[1]))"
+ "movup<ssemodesuffixf2c>\t{%1, %0|%0, %1}"
+ [(set_attr "type" "ssemov")
++ (set_attr "movu" "1")
+ (set_attr "mode" "<MODE>")])
+
+ (define_insn "avx_movdqu<avxmodesuffix>"
+@@ -373,6 +375,7 @@
+ "TARGET_AVX && !(MEM_P (operands[0]) && MEM_P (operands[1]))"
+ "vmovdqu\t{%1, %0|%0, %1}"
+ [(set_attr "type" "ssemov")
++ (set_attr "movu" "1")
+ (set_attr "prefix" "vex")
+ (set_attr "mode" "<avxvecmode>")])
+
+@@ -383,6 +386,7 @@
+ "TARGET_SSE2 && !(MEM_P (operands[0]) && MEM_P (operands[1]))"
+ "movdqu\t{%1, %0|%0, %1}"
+ [(set_attr "type" "ssemov")
++ (set_attr "movu" "1")
+ (set_attr "prefix_data16" "1")
+ (set_attr "mode" "TI")])
+
+@@ -424,7 +428,7 @@
+ UNSPEC_MOVNT))]
+ "TARGET_SSE2"
+ "movntdq\t{%1, %0|%0, %1}"
+- [(set_attr "type" "ssecvt")
++ [(set_attr "type" "ssemov")
+ (set_attr "prefix_data16" "1")
+ (set_attr "mode" "TI")])
+
+@@ -434,7 +438,7 @@
+ UNSPEC_MOVNT))]
+ "TARGET_SSE2"
+ "movnti\t{%1, %0|%0, %1}"
+- [(set_attr "type" "ssecvt")
++ [(set_attr "type" "ssemov")
+ (set_attr "mode" "V2DF")])
+
+ (define_insn "avx_lddqu<avxmodesuffix>"
+@@ -445,6 +449,7 @@
+ "TARGET_AVX"
+ "vlddqu\t{%1, %0|%0, %1}"
+ [(set_attr "type" "ssecvt")
++ (set_attr "movu" "1")
+ (set_attr "prefix" "vex")
+ (set_attr "mode" "<avxvecmode>")])
+
+@@ -454,7 +459,8 @@
+ UNSPEC_LDDQU))]
+ "TARGET_SSE3"
+ "lddqu\t{%1, %0|%0, %1}"
+- [(set_attr "type" "ssecvt")
++ [(set_attr "type" "ssemov")
++ (set_attr "movu" "1")
+ (set_attr "prefix_rep" "1")
+ (set_attr "mode" "TI")])
+
+@@ -761,6 +767,7 @@
+ "TARGET_SSE"
+ "%vrcpps\t{%1, %0|%0, %1}"
+ [(set_attr "type" "sse")
++ (set_attr "atom_sse_attr" "rcp")
+ (set_attr "prefix" "maybe_vex")
+ (set_attr "mode" "V4SF")])
+
+@@ -787,6 +794,7 @@
+ "TARGET_SSE"
+ "rcpss\t{%1, %0|%0, %1}"
+ [(set_attr "type" "sse")
++ (set_attr "atom_sse_attr" "rcp")
+ (set_attr "mode" "SF")])
+
+ (define_expand "sqrtv8sf2"
+@@ -832,6 +840,7 @@
+ "TARGET_SSE"
+ "%vsqrtps\t{%1, %0|%0, %1}"
+ [(set_attr "type" "sse")
++ (set_attr "atom_sse_attr" "sqrt")
+ (set_attr "prefix" "maybe_vex")
+ (set_attr "mode" "V4SF")])
+
+@@ -876,6 +885,7 @@
+ "SSE_VEC_FLOAT_MODE_P (<MODE>mode)"
+ "sqrts<ssemodesuffixf2c>\t{%1, %0|%0, %1}"
+ [(set_attr "type" "sse")
++ (set_attr "atom_sse_attr" "sqrt")
+ (set_attr "mode" "<ssescalarmode>")])
+
+ (define_expand "rsqrtv8sf2"
+@@ -1039,7 +1049,7 @@
+ (const_int 1)))]
+ "SSE_VEC_FLOAT_MODE_P (<MODE>mode)"
+ "<maxminfprefix>s<ssemodesuffixf2c>\t{%2, %0|%0, %2}"
+- [(set_attr "type" "sse")
++ [(set_attr "type" "sseadd")
+ (set_attr "mode" "<ssescalarmode>")])
+
+ ;; These versions of the min/max patterns implement exactly the operations
+@@ -1175,6 +1185,7 @@
+ "TARGET_SSE3"
+ "addsubpd\t{%2, %0|%0, %2}"
+ [(set_attr "type" "sseadd")
++ (set_attr "atom_unit" "complex")
+ (set_attr "mode" "V2DF")])
+
+ (define_insn "avx_h<plusminus_insn>v4df3"
+@@ -1298,6 +1309,7 @@
+ "TARGET_SSE3"
+ "h<plusminus_mnemonic>ps\t{%2, %0|%0, %2}"
+ [(set_attr "type" "sseadd")
++ (set_attr "atom_unit" "complex")
+ (set_attr "prefix_rep" "1")
+ (set_attr "mode" "V4SF")])
+
+@@ -5066,6 +5078,7 @@
+ "TARGET_SSE2 && ix86_binary_operator_ok (MULT, V8HImode, operands)"
+ "pmaddwd\t{%2, %0|%0, %2}"
+ [(set_attr "type" "sseiadd")
++ (set_attr "atom_unit" "simul")
+ (set_attr "prefix_data16" "1")
+ (set_attr "mode" "TI")])
+
+@@ -7025,6 +7038,7 @@
+ movq\t{%H1, %0|%0, %H1}
+ mov{q}\t{%H1, %0|%0, %H1}"
+ [(set_attr "type" "ssemov,sseishft,ssemov,imov")
++ (set_attr "atom_unit" "*,sishuf,*,*")
+ (set_attr "memory" "*,none,*,*")
+ (set_attr "mode" "V2SF,TI,TI,DI")])
+
+@@ -7057,6 +7071,7 @@
+ psrldq\t{$8, %0|%0, 8}
+ movq\t{%H1, %0|%0, %H1}"
+ [(set_attr "type" "ssemov,sseishft,ssemov")
++ (set_attr "atom_unit" "*,sishuf,*")
+ (set_attr "memory" "*,none,*")
+ (set_attr "mode" "V2SF,TI,TI")])
+
+@@ -7614,6 +7629,7 @@
+ "TARGET_SSE2"
+ "psadbw\t{%2, %0|%0, %2}"
+ [(set_attr "type" "sseiadd")
++ (set_attr "atom_unit" "simul")
+ (set_attr "prefix_data16" "1")
+ (set_attr "mode" "TI")])
+
+@@ -7635,7 +7651,7 @@
+ UNSPEC_MOVMSK))]
+ "SSE_VEC_FLOAT_MODE_P (<MODE>mode)"
+ "%vmovmskp<ssemodesuffixf2c>\t{%1, %0|%0, %1}"
+- [(set_attr "type" "ssecvt")
++ [(set_attr "type" "ssemov")
+ (set_attr "prefix" "maybe_vex")
+ (set_attr "mode" "<MODE>")])
+
+@@ -7645,7 +7661,7 @@
+ UNSPEC_MOVMSK))]
+ "TARGET_SSE2"
+ "%vpmovmskb\t{%1, %0|%0, %1}"
+- [(set_attr "type" "ssecvt")
++ [(set_attr "type" "ssemov")
+ (set_attr "prefix_data16" "1")
+ (set_attr "prefix" "maybe_vex")
+ (set_attr "mode" "SI")])
+@@ -7668,7 +7684,7 @@
+ "TARGET_SSE2 && !TARGET_64BIT"
+ ;; @@@ check ordering of operands in intel/nonintel syntax
+ "%vmaskmovdqu\t{%2, %1|%1, %2}"
+- [(set_attr "type" "ssecvt")
++ [(set_attr "type" "ssemov")
+ (set_attr "prefix_data16" "1")
+ (set_attr "prefix" "maybe_vex")
+ (set_attr "mode" "TI")])
+@@ -7682,7 +7698,7 @@
+ "TARGET_SSE2 && TARGET_64BIT"
+ ;; @@@ check ordering of operands in intel/nonintel syntax
+ "%vmaskmovdqu\t{%2, %1|%1, %2}"
+- [(set_attr "type" "ssecvt")
++ [(set_attr "type" "ssemov")
+ (set_attr "prefix_data16" "1")
+ (set_attr "prefix" "maybe_vex")
+ (set_attr "mode" "TI")])
+@@ -7693,6 +7709,7 @@
+ "TARGET_SSE"
+ "%vldmxcsr\t%0"
+ [(set_attr "type" "sse")
++ (set_attr "atom_sse_attr" "mxcsr")
+ (set_attr "prefix" "maybe_vex")
+ (set_attr "memory" "load")])
+
+@@ -7702,6 +7719,7 @@
+ "TARGET_SSE"
+ "%vstmxcsr\t%0"
+ [(set_attr "type" "sse")
++ (set_attr "atom_sse_attr" "mxcsr")
+ (set_attr "prefix" "maybe_vex")
+ (set_attr "memory" "store")])
+
+@@ -7720,6 +7738,7 @@
+ "TARGET_SSE || TARGET_3DNOW_A"
+ "sfence"
+ [(set_attr "type" "sse")
++ (set_attr "atom_sse_attr" "fence")
+ (set_attr "memory" "unknown")])
+
+ (define_insn "sse2_clflush"
+@@ -7728,6 +7747,7 @@
+ "TARGET_SSE2"
+ "clflush\t%a0"
+ [(set_attr "type" "sse")
++ (set_attr "atom_sse_attr" "fence")
+ (set_attr "memory" "unknown")])
+
+ (define_expand "sse2_mfence"
+@@ -7745,6 +7765,7 @@
+ "TARGET_64BIT || TARGET_SSE2"
+ "mfence"
+ [(set_attr "type" "sse")
++ (set_attr "atom_sse_attr" "fence")
+ (set_attr "memory" "unknown")])
+
+ (define_expand "sse2_lfence"
+@@ -7762,6 +7783,7 @@
+ "TARGET_SSE2"
+ "lfence"
+ [(set_attr "type" "sse")
++ (set_attr "atom_sse_attr" "lfence")
+ (set_attr "memory" "unknown")])
+
+ (define_insn "sse3_mwait"
+@@ -7885,6 +7907,7 @@
+ "TARGET_SSSE3"
+ "phaddw\t{%2, %0|%0, %2}"
+ [(set_attr "type" "sseiadd")
++ (set_attr "atom_unit" "complex")
+ (set_attr "prefix_data16" "1")
+ (set_attr "prefix_extra" "1")
+ (set_attr "mode" "TI")])
+@@ -7913,6 +7936,7 @@
+ "TARGET_SSSE3"
+ "phaddw\t{%2, %0|%0, %2}"
+ [(set_attr "type" "sseiadd")
++ (set_attr "atom_unit" "complex")
+ (set_attr "prefix_extra" "1")
+ (set_attr "mode" "DI")])
+
+@@ -7967,6 +7991,7 @@
+ "TARGET_SSSE3"
+ "phaddd\t{%2, %0|%0, %2}"
+ [(set_attr "type" "sseiadd")
++ (set_attr "atom_unit" "complex")
+ (set_attr "prefix_data16" "1")
+ (set_attr "prefix_extra" "1")
+ (set_attr "mode" "TI")])
+@@ -7987,6 +8012,7 @@
+ "TARGET_SSSE3"
+ "phaddd\t{%2, %0|%0, %2}"
+ [(set_attr "type" "sseiadd")
++ (set_attr "atom_unit" "complex")
+ (set_attr "prefix_extra" "1")
+ (set_attr "mode" "DI")])
+
+@@ -8073,6 +8099,7 @@
+ "TARGET_SSSE3"
+ "phaddsw\t{%2, %0|%0, %2}"
+ [(set_attr "type" "sseiadd")
++ (set_attr "atom_unit" "complex")
+ (set_attr "prefix_data16" "1")
+ (set_attr "prefix_extra" "1")
+ (set_attr "mode" "TI")])
+@@ -8101,6 +8128,7 @@
+ "TARGET_SSSE3"
+ "phaddsw\t{%2, %0|%0, %2}"
+ [(set_attr "type" "sseiadd")
++ (set_attr "atom_unit" "complex")
+ (set_attr "prefix_extra" "1")
+ (set_attr "mode" "DI")])
+
+@@ -8187,6 +8215,7 @@
+ "TARGET_SSSE3"
+ "phsubw\t{%2, %0|%0, %2}"
+ [(set_attr "type" "sseiadd")
++ (set_attr "atom_unit" "complex")
+ (set_attr "prefix_data16" "1")
+ (set_attr "prefix_extra" "1")
+ (set_attr "mode" "TI")])
+@@ -8215,6 +8244,7 @@
+ "TARGET_SSSE3"
+ "phsubw\t{%2, %0|%0, %2}"
+ [(set_attr "type" "sseiadd")
++ (set_attr "atom_unit" "complex")
+ (set_attr "prefix_extra" "1")
+ (set_attr "mode" "DI")])
+
+@@ -8269,6 +8299,7 @@
+ "TARGET_SSSE3"
+ "phsubd\t{%2, %0|%0, %2}"
+ [(set_attr "type" "sseiadd")
++ (set_attr "atom_unit" "complex")
+ (set_attr "prefix_data16" "1")
+ (set_attr "prefix_extra" "1")
+ (set_attr "mode" "TI")])
+@@ -8289,6 +8320,7 @@
+ "TARGET_SSSE3"
+ "phsubd\t{%2, %0|%0, %2}"
+ [(set_attr "type" "sseiadd")
++ (set_attr "atom_unit" "complex")
+ (set_attr "prefix_extra" "1")
+ (set_attr "mode" "DI")])
+
+@@ -8375,6 +8407,7 @@
+ "TARGET_SSSE3"
+ "phsubsw\t{%2, %0|%0, %2}"
+ [(set_attr "type" "sseiadd")
++ (set_attr "atom_unit" "complex")
+ (set_attr "prefix_data16" "1")
+ (set_attr "prefix_extra" "1")
+ (set_attr "mode" "TI")])
+@@ -8403,6 +8436,7 @@
+ "TARGET_SSSE3"
+ "phsubsw\t{%2, %0|%0, %2}"
+ [(set_attr "type" "sseiadd")
++ (set_attr "atom_unit" "complex")
+ (set_attr "prefix_extra" "1")
+ (set_attr "mode" "DI")])
+
+@@ -8509,6 +8543,7 @@
+ "TARGET_SSSE3"
+ "pmaddubsw\t{%2, %0|%0, %2}"
+ [(set_attr "type" "sseiadd")
++ (set_attr "atom_unit" "simul")
+ (set_attr "prefix_data16" "1")
+ (set_attr "prefix_extra" "1")
+ (set_attr "mode" "TI")])
+@@ -8547,6 +8582,7 @@
+ "TARGET_SSSE3"
+ "pmaddubsw\t{%2, %0|%0, %2}"
+ [(set_attr "type" "sseiadd")
++ (set_attr "atom_unit" "simul")
+ (set_attr "prefix_extra" "1")
+ (set_attr "mode" "DI")])
+
+@@ -8754,6 +8790,7 @@
+ return "palignr\t{%3, %2, %0|%0, %2, %3}";
+ }
+ [(set_attr "type" "sseishft")
++ (set_attr "atom_unit" "sishuf")
+ (set_attr "prefix_data16" "1")
+ (set_attr "prefix_extra" "1")
+ (set_attr "mode" "TI")])
+@@ -8770,6 +8807,7 @@
+ return "palignr\t{%3, %2, %0|%0, %2, %3}";
+ }
+ [(set_attr "type" "sseishft")
++ (set_attr "atom_unit" "sishuf")
+ (set_attr "prefix_extra" "1")
+ (set_attr "mode" "DI")])
+
+@@ -8956,7 +8994,7 @@
+ UNSPEC_MOVNTDQA))]
+ "TARGET_SSE4_1"
+ "%vmovntdqa\t{%1, %0|%0, %1}"
+- [(set_attr "type" "ssecvt")
++ [(set_attr "type" "ssemov")
+ (set_attr "prefix_extra" "1")
+ (set_attr "prefix" "maybe_vex")
+ (set_attr "mode" "TI")])
+diff -Nur a/gcc/config/i386/t-cs-linux b/gcc/config/i386/t-cs-linux
+--- a/gcc/config/i386/t-cs-linux 1970-01-01 01:00:00.000000000 +0100
++++ b/gcc/config/i386/t-cs-linux 2010-01-25 09:50:29.015687523 +0100
+@@ -0,0 +1,25 @@
++# Sourcery G++ IA32 GNU/Linux Configuration.
++# Copyright (C) 2007
++# Free Software Foundation, Inc.
++#
++# 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/>.
++
++MULTILIB_OPTIONS = m64/m32 msgxx-glibc/mrh73/mrhel3
++MULTILIB_DIRNAMES = 64 32 sgxx-glibc rh73 rhel3
++MULTILIB_OSDIRNAMES = ../lib64 ../lib sgxx-glibc rh73 rhel3
++MULTILIB_EXCEPTIONS = m64/mrh73 m64/mrhel3
++
+diff -Nur a/gcc/config/i386/t-cs-linux-lite b/gcc/config/i386/t-cs-linux-lite
+--- a/gcc/config/i386/t-cs-linux-lite 1970-01-01 01:00:00.000000000 +0100
++++ b/gcc/config/i386/t-cs-linux-lite 2010-01-25 09:50:29.015687523 +0100
+@@ -0,0 +1,26 @@
++# Sourcery G++ Lite IA32 GNU/Linux Configuration.
++# Copyright (C) 2009
++# Free Software Foundation, Inc.
++#
++# 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/>.
++
++MULTILIB_OPTIONS = m64 march=atom/march=core2
++MULTILIB_DIRNAMES = 64 atom core2
++MULTILIB_EXCEPTIONS = m64/march=atom march=core2
++MULTILIB_ALIASES = m64=m64/march?atom
++MULTILIB_OSDIRNAMES = m64=../lib64 march.atom=atom m64/march.core2=../lib64/core2
++
+diff -Nur a/gcc/config/i386/t-wrs-linux b/gcc/config/i386/t-wrs-linux
+--- a/gcc/config/i386/t-wrs-linux 1970-01-01 01:00:00.000000000 +0100
++++ b/gcc/config/i386/t-wrs-linux 2010-01-25 09:50:29.015687523 +0100
+@@ -0,0 +1,24 @@
++# Wind River GNU/Linux Configuration.
++# Copyright (C) 2009
++# Free Software Foundation, Inc.
++#
++# 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/>.
++
++MULTILIB_OPTIONS = m64/m32 msystem-glibc
++MULTILIB_DIRNAMES = 64 32 system-glibc
++MULTILIB_OSDIRNAMES = ../lib64 ../lib system-glibc
++MULTILIB_EXCEPTIONS = m64/msystem-glibc
+diff -Nur a/gcc/config/i386/winnt.c b/gcc/config/i386/winnt.c
+--- a/gcc/config/i386/winnt.c 2009-02-21 04:21:44.000000000 +0100
++++ b/gcc/config/i386/winnt.c 2010-01-25 09:50:29.015687523 +0100
+@@ -499,8 +499,11 @@
+ {
+ HOST_WIDE_INT rounded;
+
+- /* Compute as in assemble_noswitch_variable, since we don't actually
+- support aligned common. */
++ /* Compute as in assemble_noswitch_variable, since we don't have
++ support for aligned common on older binutils. We must also
++ avoid emitting a common symbol of size zero, as this is the
++ overloaded representation that indicates an undefined external
++ symbol in the PE object file format. */
+ rounded = size ? size : 1;
+ rounded += (BIGGEST_ALIGNMENT / BITS_PER_UNIT) - 1;
+ rounded = (rounded / (BIGGEST_ALIGNMENT / BITS_PER_UNIT)
+@@ -510,9 +513,13 @@
+
+ fprintf (stream, "\t.comm\t");
+ assemble_name (stream, name);
+- fprintf (stream, ", " HOST_WIDE_INT_PRINT_DEC "\t" ASM_COMMENT_START
+- " " HOST_WIDE_INT_PRINT_DEC "\n",
+- rounded, size);
++ if (use_pe_aligned_common)
++ fprintf (stream, ", " HOST_WIDE_INT_PRINT_DEC ", %d\n",
++ size ? size : (HOST_WIDE_INT) 1,
++ exact_log2 (align) - exact_log2 (CHAR_BIT));
++ else
++ fprintf (stream, ", " HOST_WIDE_INT_PRINT_DEC "\t" ASM_COMMENT_START
++ " " HOST_WIDE_INT_PRINT_DEC "\n", rounded, size);
+ }
+
+ /* The Microsoft linker requires that every function be marked as
+diff -Nur a/gcc/config/i386/wrs-linux.h b/gcc/config/i386/wrs-linux.h
+--- a/gcc/config/i386/wrs-linux.h 1970-01-01 01:00:00.000000000 +0100
++++ b/gcc/config/i386/wrs-linux.h 2010-01-25 09:50:29.015687523 +0100
+@@ -0,0 +1,33 @@
++/* Wind River IA32 GNU/Linux Configuration.
++ Copyright (C) 2009
++ Free Software Foundation, Inc.
++
++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/>. */
++
++#undef SYSROOT_SUFFIX_SPEC
++#define SYSROOT_SUFFIX_SPEC \
++ "%{msystem-glibc:/system-glibc}"
++
++#undef SYSROOT_HEADERS_SUFFIX_SPEC
++#define SYSROOT_HEADERS_SUFFIX_SPEC SYSROOT_SUFFIX_SPEC
++
++/* See mips/wrs-linux.h for details on this use of
++ STARTFILE_PREFIX_SPEC. */
++#undef STARTFILE_PREFIX_SPEC
++#define STARTFILE_PREFIX_SPEC \
++ "%{m64: /usr/local/lib64/ /lib64/ /usr/lib64/} \
++ %{!m64: /usr/local/lib/ /lib/ /usr/lib/}"
+diff -Nur a/gcc/config/i386/wrs-linux.opt b/gcc/config/i386/wrs-linux.opt
+--- a/gcc/config/i386/wrs-linux.opt 1970-01-01 01:00:00.000000000 +0100
++++ b/gcc/config/i386/wrs-linux.opt 2010-01-25 09:50:29.015687523 +0100
+@@ -0,0 +1,5 @@
++; Additional options for Wind River Linux Sourcery G++.
++
++msystem-glibc
++Target
++Use system version of GLIBC
+diff -Nur a/gcc/config/m68k/constraints.md b/gcc/config/m68k/constraints.md
+--- a/gcc/config/m68k/constraints.md 2007-09-11 15:56:30.000000000 +0200
++++ b/gcc/config/m68k/constraints.md 2010-01-25 09:50:29.015687523 +0100
+@@ -124,6 +124,11 @@
+ (and (match_code "const_int")
+ (match_test "ival < -0x8000 || ival > 0x7FFF")))
+
++(define_constraint "Cu"
++ "16-bit offset for wrapped symbols"
++ (and (match_code "const")
++ (match_test "m68k_unwrap_symbol (op, false) != op")))
++
+ (define_constraint "CQ"
+ "Integers valid for mvq."
+ (and (match_code "const_int")
+diff -Nur a/gcc/config/m68k/lb1sf68.asm b/gcc/config/m68k/lb1sf68.asm
+--- a/gcc/config/m68k/lb1sf68.asm 2009-04-10 01:23:07.000000000 +0200
++++ b/gcc/config/m68k/lb1sf68.asm 2010-01-25 09:50:29.015687523 +0100
+@@ -163,6 +163,8 @@
+ #if defined (__mcoldfire__) && !defined (__mcfisab__) && !defined (__mcfisac__)
+ lea \addr-.-8,a0
+ jsr pc@(a0)
++#elif defined (__mcfisab__) || defined (__mcfisac__)
++ bsr.l \addr
+ #else
+ bsr \addr
+ #endif
+@@ -202,6 +204,8 @@
+ #if defined (__mcoldfire__) && !defined (__mcfisab__) && !defined (__mcfisac__)
+ lea \addr-.-8,a0
+ jsr pc@(a0)
++#elif defined (__mcfisab__) || defined (__mcfisac__)
++ bsr.l \addr
+ #else
+ bsr \addr
+ #endif
+diff -Nur a/gcc/config/m68k/linux-unwind.h b/gcc/config/m68k/linux-unwind.h
+--- a/gcc/config/m68k/linux-unwind.h 2009-04-10 01:23:07.000000000 +0200
++++ b/gcc/config/m68k/linux-unwind.h 2010-01-25 09:50:29.015687523 +0100
+@@ -77,9 +77,15 @@
+ fs->regs.reg[9].how = REG_SAVED_OFFSET;
+ fs->regs.reg[9].loc.offset = (long) &sc->sc_a1 - cfa;
+
++#ifdef __uClinux__
++ fs->regs.reg[13].how = REG_SAVED_OFFSET;
++ fs->regs.reg[13].loc.offset = (long) &sc->sc_a5 - cfa;
++#endif
++
+ fs->regs.reg[24].how = REG_SAVED_OFFSET;
+ fs->regs.reg[24].loc.offset = (long) &sc->sc_pc - cfa;
+
++#if defined __mcffpu__ && !defined __uClinux__
+ if (*(int *) sc->sc_fpstate)
+ {
+ int *fpregs = (int *) sc->sc_fpregs;
+@@ -89,11 +95,19 @@
+ fs->regs.reg[17].how = REG_SAVED_OFFSET;
+ fs->regs.reg[17].loc.offset = (long) &fpregs[M68K_FP_SIZE/4] - cfa;
+ }
++#elif defined __mcffpu__
++# error Implement this when uClinux kernel is ported to an FPU architecture
++#endif
+ }
+ #ifdef __mcoldfire__
+ /* move.l #__NR_rt_sigreturn,%d0; trap #0 */
+- else if (pc[0] == 0x203c && pc[1] == 0x0000 &&
+- pc[2] == 0x00ad && pc[3] == 0x4e40)
++ else if ((pc[0] == 0x203c && pc[1] == 0x0000 &&
++ pc[2] == 0x00ad && pc[3] == 0x4e40) ||
++ /* Don't ask me why, this is just what some kernels do:
++ moveq #-__NR_rt_sigreturn,%d0; andil 0xff,%d0; trap #0;
++ Sigh... */
++ (pc[0] == 0x70ad && pc[1] == 0x0280 && pc[2] == 0x0000 &&
++ pc[3] == 0x00ff && pc[4] == 0x4e40 && pc[5] == 0x0000))
+ #else
+ /* moveq #~__NR_rt_sigreturn,%d0; not.b %d0; trap #0 */
+ else if (pc[0] == 0x7052 && pc[1] == 0x4600 && pc[2] == 0x4e40)
+diff -Nur a/gcc/config/m68k/m68k.c b/gcc/config/m68k/m68k.c
+--- a/gcc/config/m68k/m68k.c 2008-11-19 17:24:10.000000000 +0100
++++ b/gcc/config/m68k/m68k.c 2010-01-25 09:50:29.015687523 +0100
+@@ -46,6 +46,7 @@
+ /* ??? Need to add a dependency between m68k.o and sched-int.h. */
+ #include "sched-int.h"
+ #include "insn-codes.h"
++#include "ggc.h"
+
+ enum reg_class regno_reg_class[] =
+ {
+@@ -146,10 +147,12 @@
+ static void m68k_compute_frame_layout (void);
+ static bool m68k_save_reg (unsigned int regno, bool interrupt_handler);
+ static bool m68k_ok_for_sibcall_p (tree, tree);
++static bool m68k_tls_symbol_p (rtx);
+ static bool m68k_rtx_costs (rtx, int, int, int *, bool);
+ #if M68K_HONOR_TARGET_STRICT_ALIGNMENT
+ static bool m68k_return_in_memory (const_tree, const_tree);
+ #endif
++static void m68k_output_dwarf_dtprel (FILE *, int, rtx) ATTRIBUTE_UNUSED;
+
+
+ /* Specify the identification number of the library being built */
+@@ -252,6 +255,14 @@
+ #define TARGET_RETURN_IN_MEMORY m68k_return_in_memory
+ #endif
+
++#ifdef HAVE_AS_TLS
++#undef TARGET_HAVE_TLS
++#define TARGET_HAVE_TLS (true)
++
++#undef TARGET_ASM_OUTPUT_DWARF_DTPREL
++#define TARGET_ASM_OUTPUT_DWARF_DTPREL m68k_output_dwarf_dtprel
++#endif
++
+ static const struct attribute_spec m68k_attribute_table[] =
+ {
+ /* { name, min_len, max_len, decl_req, type_req, fn_type_req, handler } */
+@@ -1150,8 +1161,7 @@
+ current_frame.reg_mask, true, true));
+ }
+
+- if (flag_pic
+- && !TARGET_SEP_DATA
++ if (!TARGET_SEP_DATA
+ && crtl->uses_pic_offset_table)
+ insn = emit_insn (gen_load_got (pic_offset_table_rtx));
+ }
+@@ -1425,6 +1435,86 @@
+ return replace_equiv_address (x, gen_rtx_REG (Pmode, STATIC_CHAIN_REGNUM));
+ }
+
++/* Convert X to a legitimate address and return it if successful. Otherwise
++ return X.
++
++ For the 68000, we handle X+REG by loading X into a register R and
++ using R+REG. R will go in an address reg and indexing will be used.
++ However, if REG is a broken-out memory address or multiplication,
++ nothing needs to be done because REG can certainly go in an address reg. */
++
++rtx
++m68k_legitimize_address (rtx x, rtx oldx, enum machine_mode mode)
++{
++ if (m68k_tls_symbol_p (x))
++ return m68k_legitimize_tls_address (x);
++
++ if (GET_CODE (x) == PLUS)
++ {
++ int ch = (x) != (oldx);
++ int copied = 0;
++
++#define COPY_ONCE(Y) if (!copied) { Y = copy_rtx (Y); copied = ch = 1; }
++
++ if (GET_CODE (XEXP (x, 0)) == MULT)
++ {
++ COPY_ONCE (x);
++ XEXP (x, 0) = force_operand (XEXP (x, 0), 0);
++ }
++ if (GET_CODE (XEXP (x, 1)) == MULT)
++ {
++ COPY_ONCE (x);
++ XEXP (x, 1) = force_operand (XEXP (x, 1), 0);
++ }
++ if (ch)
++ {
++ if (GET_CODE (XEXP (x, 1)) == REG
++ && GET_CODE (XEXP (x, 0)) == REG)
++ {
++ if (TARGET_COLDFIRE_FPU && GET_MODE_CLASS (mode) == MODE_FLOAT)
++ {
++ COPY_ONCE (x);
++ x = force_operand (x, 0);
++ }
++ return x;
++ }
++ if (memory_address_p (mode, x))
++ return x;
++ }
++ if (GET_CODE (XEXP (x, 0)) == REG
++ || (GET_CODE (XEXP (x, 0)) == SIGN_EXTEND
++ && GET_CODE (XEXP (XEXP (x, 0), 0)) == REG
++ && GET_MODE (XEXP (XEXP (x, 0), 0)) == HImode))
++ {
++ rtx temp = gen_reg_rtx (Pmode);
++ rtx val = force_operand (XEXP (x, 1), 0);
++ emit_move_insn (temp, val);
++ COPY_ONCE (x);
++ XEXP (x, 1) = temp;
++ if (TARGET_COLDFIRE_FPU && GET_MODE_CLASS (mode) == MODE_FLOAT
++ && GET_CODE (XEXP (x, 0)) == REG)
++ x = force_operand (x, 0);
++ }
++ else if (GET_CODE (XEXP (x, 1)) == REG
++ || (GET_CODE (XEXP (x, 1)) == SIGN_EXTEND
++ && GET_CODE (XEXP (XEXP (x, 1), 0)) == REG
++ && GET_MODE (XEXP (XEXP (x, 1), 0)) == HImode))
++ {
++ rtx temp = gen_reg_rtx (Pmode);
++ rtx val = force_operand (XEXP (x, 0), 0);
++ emit_move_insn (temp, val);
++ COPY_ONCE (x);
++ XEXP (x, 0) = temp;
++ if (TARGET_COLDFIRE_FPU && GET_MODE_CLASS (mode) == MODE_FLOAT
++ && GET_CODE (XEXP (x, 1)) == REG)
++ x = force_operand (x, 0);
++ }
++ }
++
++ return x;
++}
++
++
+ /* Output a dbCC; jCC sequence. Note we do not handle the
+ floating point version of this sequence (Fdbcc). We also
+ do not handle alternative conditions when CC_NO_OVERFLOW is
+@@ -1713,15 +1803,16 @@
+ whether we need strict checking. */
+
+ bool
+-m68k_legitimate_index_reg_p (rtx x, bool strict_p)
++m68k_legitimate_index_reg_p (enum machine_mode mode, rtx x, bool strict_p)
+ {
+ if (!strict_p && GET_CODE (x) == SUBREG)
+ x = SUBREG_REG (x);
+
+ return (REG_P (x)
+ && (strict_p
+- ? REGNO_OK_FOR_INDEX_P (REGNO (x))
+- : REGNO_OK_FOR_INDEX_NONSTRICT_P (REGNO (x))));
++ ? REGNO_MODE_OK_FOR_INDEX_P (REGNO (x), mode)
++ : (MODE_OK_FOR_INDEX_P (mode)
++ && REGNO_OK_FOR_INDEX_NONSTRICT_P (REGNO (x)))));
+ }
+
+ /* Return true if X is a legitimate index expression for a (d8,An,Xn) or
+@@ -1729,7 +1820,8 @@
+ ADDRESS if so. STRICT_P says whether we need strict checking. */
+
+ static bool
+-m68k_decompose_index (rtx x, bool strict_p, struct m68k_address *address)
++m68k_decompose_index (enum machine_mode mode, rtx x, bool strict_p,
++ struct m68k_address *address)
+ {
+ int scale;
+
+@@ -1753,7 +1845,7 @@
+ && GET_MODE (XEXP (x, 0)) == HImode)
+ x = XEXP (x, 0);
+
+- if (m68k_legitimate_index_reg_p (x, strict_p))
++ if (m68k_legitimate_index_reg_p (mode, x, strict_p))
+ {
+ address->scale = scale;
+ address->index = x;
+@@ -1777,7 +1869,7 @@
+ && !offset_within_block_p (base, INTVAL (offset)))
+ return true;
+ }
+- return false;
++ return m68k_tls_reference_p (x, false);
+ }
+
+ /* Return true if X is a legitimate constant address that can reach
+@@ -1805,7 +1897,7 @@
+ return false;
+ }
+
+- return true;
++ return !m68k_tls_reference_p (x, false);
+ }
+
+ /* Return true if X is a LABEL_REF for a jump table. Assume that unplaced
+@@ -1872,15 +1964,17 @@
+ /* Check for GOT loads. These are (bd,An,Xn) addresses if
+ TARGET_68020 && flag_pic == 2, otherwise they are (d16,An)
+ addresses. */
+- if (flag_pic
+- && GET_CODE (x) == PLUS
+- && XEXP (x, 0) == pic_offset_table_rtx
+- && (GET_CODE (XEXP (x, 1)) == SYMBOL_REF
+- || GET_CODE (XEXP (x, 1)) == LABEL_REF))
++ if (GET_CODE (x) == PLUS
++ && XEXP (x, 0) == pic_offset_table_rtx)
+ {
+- address->base = XEXP (x, 0);
+- address->offset = XEXP (x, 1);
+- return true;
++ /* As we are processing a PLUS, do not unwrap RELOC32 symbols --
++ they are invalid in this context. */
++ if (m68k_unwrap_symbol (XEXP (x, 1), false) != XEXP (x, 1))
++ {
++ address->base = XEXP (x, 0);
++ address->offset = XEXP (x, 1);
++ return true;
++ }
+ }
+
+ /* The ColdFire FPU only accepts addressing modes 2-5. */
+@@ -1905,7 +1999,7 @@
+ accesses to unplaced labels in other cases. */
+ if (GET_CODE (x) == PLUS
+ && m68k_jump_table_ref_p (XEXP (x, 1))
+- && m68k_decompose_index (XEXP (x, 0), strict_p, address))
++ && m68k_decompose_index (mode, XEXP (x, 0), strict_p, address))
+ {
+ address->offset = XEXP (x, 1);
+ return true;
+@@ -1937,7 +2031,7 @@
+ worse code. */
+ if (address->offset
+ && symbolic_operand (address->offset, VOIDmode)
+- && m68k_decompose_index (x, strict_p, address))
++ && m68k_decompose_index (mode, x, strict_p, address))
+ return true;
+ }
+ else
+@@ -1956,14 +2050,14 @@
+ if (GET_CODE (x) == PLUS)
+ {
+ if (m68k_legitimate_base_reg_p (XEXP (x, 0), strict_p)
+- && m68k_decompose_index (XEXP (x, 1), strict_p, address))
++ && m68k_decompose_index (mode, XEXP (x, 1), strict_p, address))
+ {
+ address->base = XEXP (x, 0);
+ return true;
+ }
+
+ if (m68k_legitimate_base_reg_p (XEXP (x, 1), strict_p)
+- && m68k_decompose_index (XEXP (x, 0), strict_p, address))
++ && m68k_decompose_index (mode, XEXP (x, 0), strict_p, address))
+ {
+ address->base = XEXP (x, 1);
+ return true;
+@@ -2025,6 +2119,243 @@
+ && !address.index);
+ }
+
++/* Return GOT pointer. */
++
++static rtx
++m68k_get_gp (void)
++{
++ if (pic_offset_table_rtx == NULL_RTX)
++ pic_offset_table_rtx = gen_rtx_REG (Pmode, PIC_REG);
++
++ crtl->uses_pic_offset_table = 1;
++
++ return pic_offset_table_rtx;
++}
++
++/* M68K relocations, used to distinguish GOT and TLS relocations in UNSPEC
++ wrappers. */
++enum m68k_reloc { RELOC_GOT, RELOC_TLSGD, RELOC_TLSLDM, RELOC_TLSLDO,
++ RELOC_TLSIE, RELOC_TLSLE };
++
++#define TLS_RELOC_P(RELOC) ((RELOC) != RELOC_GOT)
++
++/* Wrap symbol X into unspec representing relocation RELOC.
++ BASE_REG - register that should be added to the result.
++ TEMP_REG - if non-null, temporary register. */
++
++static rtx
++m68k_wrap_symbol (rtx x, enum m68k_reloc reloc, rtx base_reg, rtx temp_reg)
++{
++ bool use_x_p;
++
++ use_x_p = (base_reg == pic_offset_table_rtx) ? TARGET_XGOT : TARGET_XTLS;
++
++ if (TARGET_COLDFIRE && use_x_p)
++ /* When compiling with -mx{got, tls} switch the code will look like this:
++
++ move.l <X>@<RELOC>,<TEMP_REG>
++ add.l <BASE_REG>,<TEMP_REG> */
++ {
++ /* Wrap X in UNSPEC_??? to tip m68k_output_addr_const_extra
++ to put @RELOC after reference. */
++ x = gen_rtx_UNSPEC (Pmode, gen_rtvec (2, x, GEN_INT (reloc)),
++ UNSPEC_RELOC32);
++ x = gen_rtx_CONST (Pmode, x);
++
++ if (temp_reg == NULL)
++ {
++ gcc_assert (can_create_pseudo_p ());
++ temp_reg = gen_reg_rtx (Pmode);
++ }
++
++ emit_move_insn (temp_reg, x);
++ emit_insn (gen_addsi3 (temp_reg, temp_reg, base_reg));
++ x = temp_reg;
++ }
++ else
++ {
++ x = gen_rtx_UNSPEC (Pmode, gen_rtvec (2, x, GEN_INT (reloc)),
++ UNSPEC_RELOC16);
++ x = gen_rtx_CONST (Pmode, x);
++
++ x = gen_rtx_PLUS (Pmode, base_reg, x);
++ }
++
++ return x;
++}
++
++/* Helper for m68k_unwrap_symbol.
++ Also, if unwrapping was successful (that is if (ORIG != <return value>)),
++ sets *RELOC_PTR to relocation type for the symbol. */
++
++static rtx
++m68k_unwrap_symbol_1 (rtx orig, bool unwrap_reloc32_p,
++ enum m68k_reloc *reloc_ptr)
++{
++ if (GET_CODE (orig) == CONST)
++ {
++ rtx x;
++ enum m68k_reloc dummy;
++
++ x = XEXP (orig, 0);
++
++ if (reloc_ptr == NULL)
++ reloc_ptr = &dummy;
++
++ /* Handle an addend. */
++ if ((GET_CODE (x) == PLUS || GET_CODE (x) == MINUS)
++ && CONST_INT_P (XEXP (x, 1)))
++ x = XEXP (x, 0);
++
++ if (GET_CODE (x) == UNSPEC)
++ {
++ switch (XINT (x, 1))
++ {
++ case UNSPEC_RELOC16:
++ orig = XVECEXP (x, 0, 0);
++ *reloc_ptr = (enum m68k_reloc) INTVAL (XVECEXP (x, 0, 1));
++ break;
++
++ case UNSPEC_RELOC32:
++ if (unwrap_reloc32_p)
++ {
++ orig = XVECEXP (x, 0, 0);
++ *reloc_ptr = (enum m68k_reloc) INTVAL (XVECEXP (x, 0, 1));
++ }
++ break;
++
++ default:
++ break;
++ }
++ }
++ }
++
++ return orig;
++}
++
++/* Unwrap symbol from UNSPEC_RELOC16 and, if unwrap_reloc32_p,
++ UNSPEC_RELOC32 wrappers. */
++
++rtx
++m68k_unwrap_symbol (rtx orig, bool unwrap_reloc32_p)
++{
++ return m68k_unwrap_symbol_1 (orig, unwrap_reloc32_p, NULL);
++}
++
++/* Helper for m68k_final_prescan_insn. */
++
++static int
++m68k_final_prescan_insn_1 (rtx *x_ptr, void *data ATTRIBUTE_UNUSED)
++{
++ rtx x = *x_ptr;
++
++ if (m68k_unwrap_symbol (x, true) != x)
++ /* For rationale of the below, see comment in m68k_final_prescan_insn. */
++ {
++ rtx plus;
++
++ gcc_assert (GET_CODE (x) == CONST);
++ plus = XEXP (x, 0);
++
++ if (GET_CODE (plus) == PLUS || GET_CODE (plus) == MINUS)
++ {
++ rtx unspec;
++ rtx addend;
++
++ unspec = XEXP (plus, 0);
++ gcc_assert (GET_CODE (unspec) == UNSPEC);
++ addend = XEXP (plus, 1);
++ gcc_assert (CONST_INT_P (addend));
++
++ /* We now have all the pieces, rearrange them. */
++
++ /* Move symbol to plus. */
++ XEXP (plus, 0) = XVECEXP (unspec, 0, 0);
++
++ /* Move plus inside unspec. */
++ XVECEXP (unspec, 0, 0) = plus;
++
++ /* Move unspec to top level of const. */
++ XEXP (x, 0) = unspec;
++ }
++
++ return -1;
++ }
++
++ return 0;
++}
++
++/* Prescan insn before outputing assembler for it. */
++
++void
++m68k_final_prescan_insn (rtx insn ATTRIBUTE_UNUSED,
++ rtx *operands, int n_operands)
++{
++ int i;
++
++ /* Combine and, possibly, other optimizations may do good job
++ converting
++ (const (unspec [(symbol)]))
++ into
++ (const (plus (unspec [(symbol)])
++ (const_int N))).
++ The problem with this is emitting @TLS or @GOT decorations.
++ The decoration is emitted when processing (unspec), so the
++ result would be "#symbol@TLSLE+N" instead of "#symbol+N@TLSLE".
++
++ It seems that the easiest solution to this is to convert such
++ operands to
++ (const (unspec [(plus (symbol)
++ (const_int N))])).
++ Note, that the top level of operand remains intact, so we don't have
++ to patch up anything outside of the operand. */
++
++ for (i = 0; i < n_operands; ++i)
++ {
++ rtx op;
++
++ op = operands[i];
++
++ for_each_rtx (&op, m68k_final_prescan_insn_1, NULL);
++ }
++}
++
++/* Move X to a register and add REG_EQUAL note pointing to ORIG.
++ If REG is non-null, use it; generate new pseudo otherwise. */
++
++static rtx
++m68k_move_to_reg (rtx x, rtx orig, rtx reg)
++{
++ rtx insn;
++
++ if (reg == NULL_RTX)
++ {
++ gcc_assert (can_create_pseudo_p ());
++ reg = gen_reg_rtx (Pmode);
++ }
++
++ insn = emit_move_insn (reg, x);
++ /* Put a REG_EQUAL note on this insn, so that it can be optimized
++ by loop. */
++ set_unique_reg_note (insn, REG_EQUAL, orig);
++
++ return reg;
++}
++
++/* Does the same as m68k_wrap_symbol, but returns a memory reference to
++ GOT slot. */
++
++static rtx
++m68k_wrap_symbol_into_got_ref (rtx x, enum m68k_reloc reloc, rtx temp_reg)
++{
++ x = m68k_wrap_symbol (x, reloc, m68k_get_gp (), temp_reg);
++
++ x = gen_rtx_MEM (Pmode, x);
++ MEM_READONLY_P (x) = 1;
++
++ return x;
++}
++
+ /* Legitimize PIC addresses. If the address is already
+ position-independent, we return ORIG. Newly generated
+ position-independent addresses go to REG. If we need more
+@@ -2076,42 +2407,15 @@
+ {
+ gcc_assert (reg);
+
+- if (TARGET_COLDFIRE && TARGET_XGOT)
+- /* When compiling with -mxgot switch the code for the above
+- example will look like this:
+-
+- movel a5, a0
+- addl _foo@GOT, a0
+- movel a0@, a0
+- movel #12345, a0@ */
+- {
+- rtx pic_offset;
+-
+- /* Wrap ORIG in UNSPEC_GOTOFF to tip m68k_output_addr_const_extra
+- to put @GOT after reference. */
+- pic_offset = gen_rtx_UNSPEC (Pmode, gen_rtvec (1, orig),
+- UNSPEC_GOTOFF);
+- pic_offset = gen_rtx_CONST (Pmode, pic_offset);
+- emit_move_insn (reg, pic_offset);
+- emit_insn (gen_addsi3 (reg, reg, pic_offset_table_rtx));
+- pic_ref = gen_rtx_MEM (Pmode, reg);
+- }
+- else
+- pic_ref = gen_rtx_MEM (Pmode,
+- gen_rtx_PLUS (Pmode,
+- pic_offset_table_rtx, orig));
+- crtl->uses_pic_offset_table = 1;
+- MEM_READONLY_P (pic_ref) = 1;
+- emit_move_insn (reg, pic_ref);
+- return reg;
++ pic_ref = m68k_wrap_symbol_into_got_ref (orig, RELOC_GOT, reg);
++ pic_ref = m68k_move_to_reg (pic_ref, orig, reg);
+ }
+ else if (GET_CODE (orig) == CONST)
+ {
+ rtx base;
+
+ /* Make sure this has not already been legitimized. */
+- if (GET_CODE (XEXP (orig, 0)) == PLUS
+- && XEXP (XEXP (orig, 0), 0) == pic_offset_table_rtx)
++ if (m68k_unwrap_symbol (orig, true) != orig)
+ return orig;
+
+ gcc_assert (reg);
+@@ -2124,13 +2428,257 @@
+ base == reg ? 0 : reg);
+
+ if (GET_CODE (orig) == CONST_INT)
+- return plus_constant (base, INTVAL (orig));
+- pic_ref = gen_rtx_PLUS (Pmode, base, orig);
+- /* Likewise, should we set special REG_NOTEs here? */
++ pic_ref = plus_constant (base, INTVAL (orig));
++ else
++ pic_ref = gen_rtx_PLUS (Pmode, base, orig);
+ }
++
+ return pic_ref;
+ }
+
++/* The __tls_get_addr symbol. */
++static GTY(()) rtx m68k_tls_get_addr;
++
++/* Return SYMBOL_REF for __tls_get_addr. */
++
++static rtx
++m68k_get_tls_get_addr (void)
++{
++ if (m68k_tls_get_addr == NULL_RTX)
++ m68k_tls_get_addr = init_one_libfunc ("__tls_get_addr");
++
++ return m68k_tls_get_addr;
++}
++
++/* Return libcall result in A0 instead of usual D0. */
++static bool m68k_libcall_value_in_a0_p = false;
++
++/* Emit instruction sequence that calls __tls_get_addr. X is
++ the TLS symbol we are referencing and RELOC is the symbol type to use
++ (either TLSGD or TLSLDM). EQV is the REG_EQUAL note for the sequence
++ emitted. A pseudo register with result of __tls_get_addr call is
++ returned. */
++
++static rtx
++m68k_call_tls_get_addr (rtx x, rtx eqv, enum m68k_reloc reloc)
++{
++ rtx a0;
++ rtx insns;
++ rtx dest;
++
++ /* Emit the call sequence. */
++ start_sequence ();
++
++ /* FIXME: Unfortunately, emit_library_call_value does not
++ consider (plus (%a5) (const (unspec))) to be a good enough
++ operand for push, so it forces it into a register. The bad
++ thing about this is that combiner, due to copy propagation and other
++ optimizations, sometimes can not later fix this. As a consequence,
++ additional register may be allocated resulting in a spill.
++ For reference, see args processing loops in
++ calls.c:emit_library_call_value_1.
++ For testcase, see gcc.target/m68k/tls-{gd, ld}.c */
++ x = m68k_wrap_symbol (x, reloc, m68k_get_gp (), NULL_RTX);
++
++ /* __tls_get_addr() is not a libcall, but emitting a libcall_value
++ is the simpliest way of generating a call. The difference between
++ __tls_get_addr() and libcall is that the result is returned in D0
++ instead of A0. To workaround this, we use m68k_libcall_value_in_a0_p
++ which temporarily switches returning the result to A0. */
++
++ m68k_libcall_value_in_a0_p = true;
++ a0 = emit_library_call_value (m68k_get_tls_get_addr (), NULL_RTX, LCT_PURE,
++ Pmode, 1, x, Pmode);
++ m68k_libcall_value_in_a0_p = false;
++
++ insns = get_insns ();
++ end_sequence ();
++
++ gcc_assert (can_create_pseudo_p ());
++ dest = gen_reg_rtx (Pmode);
++ emit_libcall_block (insns, dest, a0, eqv);
++
++ return dest;
++}
++
++/* The __tls_get_addr symbol. */
++static GTY(()) rtx m68k_read_tp;
++
++/* Return SYMBOL_REF for __m68k_read_tp. */
++
++static rtx
++m68k_get_m68k_read_tp (void)
++{
++ if (m68k_read_tp == NULL_RTX)
++ m68k_read_tp = init_one_libfunc ("__m68k_read_tp");
++
++ return m68k_read_tp;
++}
++
++/* Emit instruction sequence that calls __m68k_read_tp.
++ A pseudo register with result of __m68k_read_tp call is returned. */
++
++static rtx
++m68k_call_m68k_read_tp (void)
++{
++ rtx a0;
++ rtx eqv;
++ rtx insns;
++ rtx dest;
++
++ start_sequence ();
++
++ /* __m68k_read_tp() is not a libcall, but emitting a libcall_value
++ is the simpliest way of generating a call. The difference between
++ __m68k_read_tp() and libcall is that the result is returned in D0
++ instead of A0. To workaround this, we use m68k_libcall_value_in_a0_p
++ which temporarily switches returning the result to A0. */
++
++ /* Emit the call sequence. */
++ m68k_libcall_value_in_a0_p = true;
++ a0 = emit_library_call_value (m68k_get_m68k_read_tp (), NULL_RTX, LCT_PURE,
++ Pmode, 0);
++ m68k_libcall_value_in_a0_p = false;
++ insns = get_insns ();
++ end_sequence ();
++
++ /* Attach a unique REG_EQUIV, to allow the RTL optimizers to
++ share the m68k_read_tp result with other IE/LE model accesses. */
++ eqv = gen_rtx_UNSPEC (Pmode, gen_rtvec (1, const1_rtx), UNSPEC_RELOC32);
++
++ gcc_assert (can_create_pseudo_p ());
++ dest = gen_reg_rtx (Pmode);
++ emit_libcall_block (insns, dest, a0, eqv);
++
++ return dest;
++}
++
++/* Return a legitimized address for accessing TLS SYMBOL_REF X.
++ For explanations on instructions sequences see TLS/NPTL ABI for m68k and
++ ColdFire. */
++
++rtx
++m68k_legitimize_tls_address (rtx orig)
++{
++ switch (SYMBOL_REF_TLS_MODEL (orig))
++ {
++ case TLS_MODEL_GLOBAL_DYNAMIC:
++ orig = m68k_call_tls_get_addr (orig, orig, RELOC_TLSGD);
++ break;
++
++ case TLS_MODEL_LOCAL_DYNAMIC:
++ {
++ rtx eqv;
++ rtx a0;
++ rtx x;
++
++ /* Attach a unique REG_EQUIV, to allow the RTL optimizers to
++ share the LDM result with other LD model accesses. */
++ eqv = gen_rtx_UNSPEC (Pmode, gen_rtvec (1, const0_rtx),
++ UNSPEC_RELOC32);
++
++ a0 = m68k_call_tls_get_addr (orig, eqv, RELOC_TLSLDM);
++
++ x = m68k_wrap_symbol (orig, RELOC_TLSLDO, a0, NULL_RTX);
++
++ if (can_create_pseudo_p ())
++ x = m68k_move_to_reg (x, orig, NULL_RTX);
++
++ orig = x;
++ break;
++ }
++
++ case TLS_MODEL_INITIAL_EXEC:
++ {
++ rtx a0;
++ rtx x;
++
++ a0 = m68k_call_m68k_read_tp ();
++
++ x = m68k_wrap_symbol_into_got_ref (orig, RELOC_TLSIE, NULL_RTX);
++ x = gen_rtx_PLUS (Pmode, x, a0);
++
++ if (can_create_pseudo_p ())
++ x = m68k_move_to_reg (x, orig, NULL_RTX);
++
++ orig = x;
++ break;
++ }
++
++ case TLS_MODEL_LOCAL_EXEC:
++ {
++ rtx a0;
++ rtx x;
++
++ a0 = m68k_call_m68k_read_tp ();
++
++ x = m68k_wrap_symbol (orig, RELOC_TLSLE, a0, NULL_RTX);
++
++ if (can_create_pseudo_p ())
++ x = m68k_move_to_reg (x, orig, NULL_RTX);
++
++ orig = x;
++ break;
++ }
++
++ default:
++ gcc_unreachable ();
++ }
++
++ return orig;
++}
++
++/* Return true if X is a TLS symbol. */
++
++static bool
++m68k_tls_symbol_p (rtx x)
++{
++ if (!TARGET_HAVE_TLS)
++ return false;
++
++ if (GET_CODE (x) != SYMBOL_REF)
++ return false;
++
++ return SYMBOL_REF_TLS_MODEL (x) != 0;
++}
++
++/* Helper for m68k_tls_referenced_p. */
++
++static int
++m68k_tls_reference_p_1 (rtx *x_ptr, void *data ATTRIBUTE_UNUSED)
++{
++ /* Note: this is not the same as m68k_tls_symbol_p. */
++ if (GET_CODE (*x_ptr) == SYMBOL_REF)
++ return SYMBOL_REF_TLS_MODEL (*x_ptr) != 0 ? 1 : 0;
++
++ /* Don't recurse into legitimate TLS references. */
++ if (m68k_tls_reference_p (*x_ptr, true))
++ return -1;
++
++ return 0;
++}
++
++/* If !LEGITIMATE_P, return true if X is a TLS symbol reference,
++ though illegitimate one.
++ If LEGITIMATE_P, return true if X is a legitimate TLS symbol reference. */
++
++bool
++m68k_tls_reference_p (rtx x, bool legitimate_p)
++{
++ if (!TARGET_HAVE_TLS)
++ return false;
++
++ if (!legitimate_p)
++ return for_each_rtx (&x, m68k_tls_reference_p_1, NULL) == 1 ? true : false;
++ else
++ {
++ enum m68k_reloc reloc = RELOC_GOT;
++
++ return (m68k_unwrap_symbol_1 (x, true, &reloc) != x
++ && TLS_RELOC_P (reloc));
++ }
++}
++
+
+
+ #define USE_MOVQ(i) ((unsigned) ((i) + 128) <= 255)
+@@ -3918,18 +4466,92 @@
+ }
+ }
+
++/* Return string for TLS relocation RELOC. */
++
++static const char *
++m68k_get_reloc_decoration (enum m68k_reloc reloc)
++{
++ /* To my knowledge, !MOTOROLA assemblers don't support TLS. */
++ gcc_assert (MOTOROLA || reloc == RELOC_GOT);
++
++ switch (reloc)
++ {
++ case RELOC_GOT:
++ if (MOTOROLA)
++ {
++ if (flag_pic == 1 && TARGET_68020)
++ return "@GOT.w";
++ else
++ return "@GOT";
++ }
++ else
++ {
++ if (TARGET_68020)
++ {
++ switch (flag_pic)
++ {
++ case 1:
++ return ":w";
++ case 2:
++ return ":l";
++ default:
++ return "";
++ }
++ }
++ }
++
++ case RELOC_TLSGD:
++ return "@TLSGD";
++
++ case RELOC_TLSLDM:
++ return "@TLSLDM";
++
++ case RELOC_TLSLDO:
++ return "@TLSLDO";
++
++ case RELOC_TLSIE:
++ return "@TLSIE";
++
++ case RELOC_TLSLE:
++ return "@TLSLE";
++
++ default:
++ gcc_unreachable ();
++ }
++}
++
+ /* m68k implementation of OUTPUT_ADDR_CONST_EXTRA. */
+
+ bool
+ m68k_output_addr_const_extra (FILE *file, rtx x)
+ {
+- if (GET_CODE (x) != UNSPEC || XINT (x, 1) != UNSPEC_GOTOFF)
+- return false;
++ if (GET_CODE (x) == UNSPEC)
++ {
++ switch (XINT (x, 1))
++ {
++ case UNSPEC_RELOC16:
++ case UNSPEC_RELOC32:
++ output_addr_const (file, XVECEXP (x, 0, 0));
++ fputs (m68k_get_reloc_decoration (INTVAL (XVECEXP (x, 0, 1))), file);
++ return true;
+
+- output_addr_const (file, XVECEXP (x, 0, 0));
+- /* ??? What is the non-MOTOROLA syntax? */
+- fputs ("@GOT", file);
+- return true;
++ default:
++ break;
++ }
++ }
++
++ return false;
++}
++
++/* M68K implementation of TARGET_ASM_OUTPUT_DWARF_DTPREL. */
++
++static void
++m68k_output_dwarf_dtprel (FILE *file, int size, rtx x)
++{
++ gcc_assert (size == 4);
++ fputs ("\t.long\t", file);
++ output_addr_const (file, x);
++ fputs ("@TLSLDO+0x8000", file);
+ }
+
+
+@@ -4019,15 +4641,8 @@
+ else
+ {
+ if (address.offset)
+- {
+- output_addr_const (file, address.offset);
+- if (flag_pic && address.base == pic_offset_table_rtx)
+- {
+- fprintf (file, "@GOT");
+- if (flag_pic == 1 && TARGET_68020)
+- fprintf (file, ".w");
+- }
+- }
++ output_addr_const (file, address.offset);
++
+ putc ('(', file);
+ if (address.base)
+ fputs (M68K_REGNAME (REGNO (address.base)), file);
+@@ -4060,19 +4675,7 @@
+ fputs (M68K_REGNAME (REGNO (address.base)), file);
+ fprintf (file, "@(");
+ if (address.offset)
+- {
+- output_addr_const (file, address.offset);
+- if (address.base == pic_offset_table_rtx && TARGET_68020)
+- switch (flag_pic)
+- {
+- case 1:
+- fprintf (file, ":w"); break;
+- case 2:
+- fprintf (file, ":l"); break;
+- default:
+- break;
+- }
+- }
++ output_addr_const (file, address.offset);
+ }
+ /* Print the ",index" component, if any. */
+ if (address.index)
+@@ -4580,7 +5183,8 @@
+ default:
+ break;
+ }
+- return gen_rtx_REG (mode, D0_REG);
++
++ return gen_rtx_REG (mode, m68k_libcall_value_in_a0_p ? A0_REG : D0_REG);
+ }
+
+ rtx
+@@ -4846,9 +5450,8 @@
+ return OP_TYPE_IMM_L;
+
+ default:
+- if (GET_CODE (op) == SYMBOL_REF)
+- /* ??? Just a guess. Probably we can guess better using length
+- attribute of the instructions. */
++ if (symbolic_operand (m68k_unwrap_symbol (op, false), VOIDmode))
++ /* Just a guess. */
+ return OP_TYPE_IMM_W;
+
+ return OP_TYPE_IMM_L;
+@@ -5793,3 +6396,5 @@
+ return 0;
+ }
+ }
++
++#include "gt-m68k.h"
+diff -Nur a/gcc/config/m68k/m68k-devices.def b/gcc/config/m68k/m68k-devices.def
+--- a/gcc/config/m68k/m68k-devices.def 2009-02-20 16:20:38.000000000 +0100
++++ b/gcc/config/m68k/m68k-devices.def 2010-01-25 09:50:29.025687257 +0100
+@@ -72,8 +72,8 @@
+ /* 680x0 series processors. */
+ M68K_DEVICE ("68000", m68000, "68000", "68000", 68000, isa_00, 0)
+ M68K_DEVICE ("68010", m68010, "68010", "68000", 68010, isa_10, 0)
+-M68K_DEVICE ("68020", m68020, "68020", "68020", 68020, isa_20, FL_MMU)
+-M68K_DEVICE ("68030", m68030, "68030", "68020", 68030, isa_20, FL_MMU)
++M68K_DEVICE ("68020", m68020, "68020", "68020", 68020, isa_20, FL_MMU | FL_UCLINUX)
++M68K_DEVICE ("68030", m68030, "68030", "68020", 68030, isa_20, FL_MMU | FL_UCLINUX)
+ M68K_DEVICE ("68040", m68040, "68040", "68040", 68040, isa_40, FL_MMU)
+ M68K_DEVICE ("68060", m68060, "68060", "68060", 68060, isa_40, FL_MMU)
+ M68K_DEVICE ("68302", m68302, "68302", "68000", 68000, isa_00, FL_MMU)
+@@ -81,7 +81,13 @@
+ M68K_DEVICE ("cpu32", cpu32, "cpu32", "cpu32", cpu32, isa_cpu32, FL_MMU)
+
+ /* ColdFire CFV1 processor. */
+-M68K_DEVICE ("51qe", mcf51qe, "51qe", "51qe", cfv1, isa_c, FL_CF_USP)
++/* For historical reasons, the 51 multilib is named 51qe. */
++M68K_DEVICE ("51", mcf51, "51", "51qe", cfv1, isa_c, FL_CF_USP)
++M68K_DEVICE ("51ac", mcf51ac, "51", "51qe", cfv1, isa_c, FL_CF_USP)
++M68K_DEVICE ("51cn", mcf51cn, "51", "51qe", cfv1, isa_c, FL_CF_USP)
++M68K_DEVICE ("51em", mcf51em, "51", "51qe", cfv1, isa_c, FL_CF_USP | FL_CF_MAC)
++M68K_DEVICE ("51jm", mcf51jm, "51", "51qe", cfv1, isa_c, FL_CF_USP)
++M68K_DEVICE ("51qe", mcf51qe, "51", "51qe", cfv1, isa_c, FL_CF_USP)
+
+ /* ColdFire CFV2 processors. */
+ M68K_DEVICE ("5202", mcf5202, "5206", "5206", cfv2, isa_a, 0)
+@@ -97,6 +103,7 @@
+ M68K_DEVICE ("5213", mcf5213, "5213", "5208", cfv2, isa_aplus, FL_CF_HWDIV | FL_CF_MAC)
+ M68K_DEVICE ("5214", mcf5214, "5216", "5208", cfv2, isa_aplus, FL_CF_HWDIV | FL_CF_EMAC)
+ M68K_DEVICE ("5216", mcf5216, "5216", "5208", cfv2, isa_aplus, FL_CF_HWDIV | FL_CF_EMAC)
++M68K_DEVICE ("5221x", mcf5221x, "5221x", "5208", cfv2, isa_aplus, FL_CF_HWDIV | FL_CF_MAC)
+ M68K_DEVICE ("52221", mcf52221, "52223", "5208", cfv2, isa_aplus, FL_CF_HWDIV | FL_CF_MAC)
+ M68K_DEVICE ("52223", mcf52223, "52223", "5208", cfv2, isa_aplus, FL_CF_HWDIV | FL_CF_MAC)
+ M68K_DEVICE ("52230", mcf52230, "52235", "5208", cfv2, isa_aplus, FL_CF_HWDIV | FL_CF_EMAC)
+@@ -107,6 +114,14 @@
+ M68K_DEVICE ("52235", mcf52235, "52235", "5208", cfv2, isa_aplus, FL_CF_HWDIV | FL_CF_EMAC)
+ M68K_DEVICE ("5224", mcf5224, "5225", "5208", cfv2, isa_aplus, FL_CF_HWDIV | FL_CF_MAC)
+ M68K_DEVICE ("5225", mcf5225, "5225", "5208", cfv2, isa_aplus, FL_CF_HWDIV | FL_CF_MAC)
++M68K_DEVICE ("52252", mcf52252, "52259", "5208", cfv2, isa_aplus, FL_CF_HWDIV | FL_CF_EMAC)
++M68K_DEVICE ("52254", mcf52254, "52259", "5208", cfv2, isa_aplus, FL_CF_HWDIV | FL_CF_EMAC)
++M68K_DEVICE ("52255", mcf52255, "52259", "5208", cfv2, isa_aplus, FL_CF_HWDIV | FL_CF_EMAC)
++M68K_DEVICE ("52256", mcf52256, "52259", "5208", cfv2, isa_aplus, FL_CF_HWDIV | FL_CF_EMAC)
++M68K_DEVICE ("52258", mcf52258, "52259", "5208", cfv2, isa_aplus, FL_CF_HWDIV | FL_CF_EMAC)
++M68K_DEVICE ("52259", mcf52259, "52259", "5208", cfv2, isa_aplus, FL_CF_HWDIV | FL_CF_EMAC)
++M68K_DEVICE ("52274", mcf52274, "52277", "5208", cfv2, isa_aplus, FL_CF_HWDIV | FL_CF_EMAC)
++M68K_DEVICE ("52277", mcf52277, "52277", "5208", cfv2, isa_aplus, FL_CF_HWDIV | FL_CF_EMAC)
+ M68K_DEVICE ("5232", mcf5232, "5235", "5208", cfv2, isa_aplus, FL_CF_HWDIV | FL_CF_EMAC)
+ M68K_DEVICE ("5233", mcf5233, "5235", "5208", cfv2, isa_aplus, FL_CF_HWDIV | FL_CF_EMAC)
+ M68K_DEVICE ("5234", mcf5234, "5235", "5208", cfv2, isa_aplus, FL_CF_HWDIV | FL_CF_EMAC)
+@@ -126,6 +141,13 @@
+ M68K_DEVICE ("528x", mcf528x, "5282", "5208", cfv2, isa_aplus, FL_CF_HWDIV | FL_CF_EMAC)
+
+ /* CFV3 processors. */
++M68K_DEVICE ("53011", mcf53011, "53017", "5329", cfv3, isa_aplus, FL_CF_HWDIV | FL_CF_EMAC)
++M68K_DEVICE ("53012", mcf53012, "53017", "5329", cfv3, isa_aplus, FL_CF_HWDIV | FL_CF_EMAC)
++M68K_DEVICE ("53013", mcf53013, "53017", "5329", cfv3, isa_aplus, FL_CF_HWDIV | FL_CF_EMAC)
++M68K_DEVICE ("53014", mcf53014, "53017", "5329", cfv3, isa_aplus, FL_CF_HWDIV | FL_CF_EMAC)
++M68K_DEVICE ("53015", mcf53015, "53017", "5329", cfv3, isa_aplus, FL_CF_HWDIV | FL_CF_EMAC)
++M68K_DEVICE ("53016", mcf53016, "53017", "5329", cfv3, isa_aplus, FL_CF_HWDIV | FL_CF_EMAC)
++M68K_DEVICE ("53017", mcf53017, "53017", "5329", cfv3, isa_aplus, FL_CF_HWDIV | FL_CF_EMAC)
+ M68K_DEVICE ("5307", mcf5307, "5307", "5307", cfv3, isa_a, FL_CF_HWDIV | FL_CF_MAC)
+ M68K_DEVICE ("5327", mcf5327, "5329", "5329", cfv3, isa_aplus, FL_CF_HWDIV | FL_CF_EMAC)
+ M68K_DEVICE ("5328", mcf5328, "5329", "5329", cfv3, isa_aplus, FL_CF_HWDIV | FL_CF_EMAC)
+@@ -137,12 +159,17 @@
+
+ /* CFV4/CFV4e processors. */
+ M68K_DEVICE ("5407", mcf5407, "5407", "5407", cfv4, isa_b, FL_CF_MAC)
+-M68K_DEVICE ("54450", mcf54450, "54455", "54455", cfv4, isa_c, FL_CF_HWDIV | FL_CF_USP | FL_CF_EMAC | FL_MMU)
+-M68K_DEVICE ("54451", mcf54451, "54455", "54455", cfv4, isa_c, FL_CF_HWDIV | FL_CF_USP | FL_CF_EMAC | FL_MMU)
+-M68K_DEVICE ("54452", mcf54452, "54455", "54455", cfv4, isa_c, FL_CF_HWDIV | FL_CF_USP | FL_CF_EMAC | FL_MMU)
+-M68K_DEVICE ("54453", mcf54453, "54455", "54455", cfv4, isa_c, FL_CF_HWDIV | FL_CF_USP | FL_CF_EMAC | FL_MMU)
+-M68K_DEVICE ("54454", mcf54454, "54455", "54455", cfv4, isa_c, FL_CF_HWDIV | FL_CF_USP | FL_CF_EMAC | FL_MMU)
+-M68K_DEVICE ("54455", mcf54455, "54455", "54455", cfv4, isa_c, FL_CF_HWDIV | FL_CF_USP | FL_CF_EMAC | FL_MMU)
++M68K_DEVICE ("54410", mcf54410, "54418", "54455", cfv4, isa_c, FL_CF_HWDIV | FL_CF_USP | FL_CF_EMAC | FL_MMU | FL_UCLINUX)
++M68K_DEVICE ("54415", mcf54415, "54418", "54455", cfv4, isa_c, FL_CF_HWDIV | FL_CF_USP | FL_CF_EMAC | FL_MMU | FL_UCLINUX)
++M68K_DEVICE ("54416", mcf54416, "54418", "54455", cfv4, isa_c, FL_CF_HWDIV | FL_CF_USP | FL_CF_EMAC | FL_MMU | FL_UCLINUX)
++M68K_DEVICE ("54417", mcf54417, "54418", "54455", cfv4, isa_c, FL_CF_HWDIV | FL_CF_USP | FL_CF_EMAC | FL_MMU | FL_UCLINUX)
++M68K_DEVICE ("54418", mcf54418, "54418", "54455", cfv4, isa_c, FL_CF_HWDIV | FL_CF_USP | FL_CF_EMAC | FL_MMU | FL_UCLINUX)
++M68K_DEVICE ("54450", mcf54450, "54455", "54455", cfv4, isa_c, FL_CF_HWDIV | FL_CF_USP | FL_CF_EMAC | FL_MMU | FL_UCLINUX)
++M68K_DEVICE ("54451", mcf54451, "54455", "54455", cfv4, isa_c, FL_CF_HWDIV | FL_CF_USP | FL_CF_EMAC | FL_MMU | FL_UCLINUX)
++M68K_DEVICE ("54452", mcf54452, "54455", "54455", cfv4, isa_c, FL_CF_HWDIV | FL_CF_USP | FL_CF_EMAC | FL_MMU | FL_UCLINUX)
++M68K_DEVICE ("54453", mcf54453, "54455", "54455", cfv4, isa_c, FL_CF_HWDIV | FL_CF_USP | FL_CF_EMAC | FL_MMU | FL_UCLINUX)
++M68K_DEVICE ("54454", mcf54454, "54455", "54455", cfv4, isa_c, FL_CF_HWDIV | FL_CF_USP | FL_CF_EMAC | FL_MMU | FL_UCLINUX)
++M68K_DEVICE ("54455", mcf54455, "54455", "54455", cfv4, isa_c, FL_CF_HWDIV | FL_CF_USP | FL_CF_EMAC | FL_MMU | FL_UCLINUX)
+ M68K_DEVICE ("5470", mcf5470, "5475", "5475", cfv4e, isa_b, FL_CF_USP | FL_CF_EMAC | FL_CF_FPU | FL_MMU)
+ M68K_DEVICE ("5471", mcf5471, "5475", "5475", cfv4e, isa_b, FL_CF_USP | FL_CF_EMAC | FL_CF_FPU | FL_MMU)
+ M68K_DEVICE ("5472", mcf5472, "5475", "5475", cfv4e, isa_b, FL_CF_USP | FL_CF_EMAC | FL_CF_FPU | FL_MMU)
+diff -Nur a/gcc/config/m68k/m68k.h b/gcc/config/m68k/m68k.h
+--- a/gcc/config/m68k/m68k.h 2008-11-19 12:23:28.000000000 +0100
++++ b/gcc/config/m68k/m68k.h 2010-01-25 09:50:29.025687257 +0100
+@@ -232,6 +232,7 @@
+ #define FL_ISA_C (1 << 16)
+ #define FL_FIDOA (1 << 17)
+ #define FL_MMU 0 /* Used by multilib machinery. */
++#define FL_UCLINUX 0 /* Used by multilib machinery. */
+
+ #define TARGET_68010 ((m68k_cpu_flags & FL_ISA_68010) != 0)
+ #define TARGET_68020 ((m68k_cpu_flags & FL_ISA_68020) != 0)
+@@ -501,7 +502,8 @@
+
+ extern enum reg_class regno_reg_class[];
+ #define REGNO_REG_CLASS(REGNO) (regno_reg_class[(REGNO)])
+-#define INDEX_REG_CLASS GENERAL_REGS
++#define MODE_INDEX_REG_CLASS(MODE) \
++ (MODE_OK_FOR_INDEX_P (MODE) ? GENERAL_REGS : NO_REGS)
+ #define BASE_REG_CLASS ADDR_REGS
+
+ #define PREFERRED_RELOAD_CLASS(X,CLASS) \
+@@ -644,7 +646,7 @@
+ (though the operand list is empty). */
+ #define TRANSFER_FROM_TRAMPOLINE \
+ void \
+-__transfer_from_trampoline () \
++__transfer_from_trampoline (void) \
+ { \
+ register char *a0 asm (M68K_STATIC_CHAIN_REG_NAME); \
+ asm (GLOBAL_ASM_OP "___trampoline"); \
+@@ -675,6 +677,10 @@
+ #define HAVE_POST_INCREMENT 1
+ #define HAVE_PRE_DECREMENT 1
+
++/* Return true if addresses of mode MODE can have an index register. */
++#define MODE_OK_FOR_INDEX_P(MODE) \
++ (!TARGET_COLDFIRE_FPU || GET_MODE_CLASS (MODE) != MODE_FLOAT)
++
+ /* Macros to check register numbers against specific register classes. */
+
+ /* True for data registers, D0 through D7. */
+@@ -689,9 +695,10 @@
+ /* True for floating point registers, FP0 through FP7. */
+ #define FP_REGNO_P(REGNO) IN_RANGE (REGNO, 16, 23)
+
+-#define REGNO_OK_FOR_INDEX_P(REGNO) \
+- (INT_REGNO_P (REGNO) \
+- || INT_REGNO_P (reg_renumber[REGNO]))
++#define REGNO_MODE_OK_FOR_INDEX_P(REGNO, MODE) \
++ (MODE_OK_FOR_INDEX_P (MODE) \
++ && (INT_REGNO_P (REGNO) \
++ || INT_REGNO_P (reg_renumber[REGNO])))
+
+ #define REGNO_OK_FOR_BASE_P(REGNO) \
+ (ADDRESS_REGNO_P (REGNO) \
+@@ -751,13 +758,14 @@
+
+ #define LEGITIMATE_PIC_OPERAND_P(X) \
+ (!symbolic_operand (X, VOIDmode) \
+- || (TARGET_PCREL && REG_STRICT_P))
++ || (TARGET_PCREL && REG_STRICT_P) \
++ || m68k_tls_reference_p (X, true))
+
+ #define REG_OK_FOR_BASE_P(X) \
+ m68k_legitimate_base_reg_p (X, REG_STRICT_P)
+
+-#define REG_OK_FOR_INDEX_P(X) \
+- m68k_legitimate_index_reg_p (X, REG_STRICT_P)
++#define REG_MODE_OK_FOR_INDEX_P(X, MODE) \
++ m68k_legitimate_index_reg_p (MODE, X, REG_STRICT_P)
+
+ #define GO_IF_LEGITIMATE_ADDRESS(MODE, X, ADDR) \
+ do \
+@@ -770,52 +778,19 @@
+ /* This address is OK as it stands. */
+ #define PIC_CASE_VECTOR_ADDRESS(index) index
+
+-/* For the 68000, we handle X+REG by loading X into a register R and
+- using R+REG. R will go in an address reg and indexing will be used.
+- However, if REG is a broken-out memory address or multiplication,
+- nothing needs to be done because REG can certainly go in an address reg. */
+-#define COPY_ONCE(Y) if (!copied) { Y = copy_rtx (Y); copied = ch = 1; }
+-#define LEGITIMIZE_ADDRESS(X,OLDX,MODE,WIN) \
+-{ register int ch = (X) != (OLDX); \
+- if (GET_CODE (X) == PLUS) \
+- { int copied = 0; \
+- if (GET_CODE (XEXP (X, 0)) == MULT) \
+- { COPY_ONCE (X); XEXP (X, 0) = force_operand (XEXP (X, 0), 0);} \
+- if (GET_CODE (XEXP (X, 1)) == MULT) \
+- { COPY_ONCE (X); XEXP (X, 1) = force_operand (XEXP (X, 1), 0);} \
+- if (ch && GET_CODE (XEXP (X, 1)) == REG \
+- && GET_CODE (XEXP (X, 0)) == REG) \
+- { if (TARGET_COLDFIRE_FPU \
+- && GET_MODE_CLASS (MODE) == MODE_FLOAT) \
+- { COPY_ONCE (X); X = force_operand (X, 0);} \
+- goto WIN; } \
+- if (ch) { GO_IF_LEGITIMATE_ADDRESS (MODE, X, WIN); } \
+- if (GET_CODE (XEXP (X, 0)) == REG \
+- || (GET_CODE (XEXP (X, 0)) == SIGN_EXTEND \
+- && GET_CODE (XEXP (XEXP (X, 0), 0)) == REG \
+- && GET_MODE (XEXP (XEXP (X, 0), 0)) == HImode)) \
+- { register rtx temp = gen_reg_rtx (Pmode); \
+- register rtx val = force_operand (XEXP (X, 1), 0); \
+- emit_move_insn (temp, val); \
+- COPY_ONCE (X); \
+- XEXP (X, 1) = temp; \
+- if (TARGET_COLDFIRE_FPU && GET_MODE_CLASS (MODE) == MODE_FLOAT \
+- && GET_CODE (XEXP (X, 0)) == REG) \
+- X = force_operand (X, 0); \
+- goto WIN; } \
+- else if (GET_CODE (XEXP (X, 1)) == REG \
+- || (GET_CODE (XEXP (X, 1)) == SIGN_EXTEND \
+- && GET_CODE (XEXP (XEXP (X, 1), 0)) == REG \
+- && GET_MODE (XEXP (XEXP (X, 1), 0)) == HImode)) \
+- { register rtx temp = gen_reg_rtx (Pmode); \
+- register rtx val = force_operand (XEXP (X, 0), 0); \
+- emit_move_insn (temp, val); \
+- COPY_ONCE (X); \
+- XEXP (X, 0) = temp; \
+- if (TARGET_COLDFIRE_FPU && GET_MODE_CLASS (MODE) == MODE_FLOAT \
+- && GET_CODE (XEXP (X, 1)) == REG) \
+- X = force_operand (X, 0); \
+- goto WIN; }}}
++#define LEGITIMIZE_ADDRESS(X, OLDX, MODE, WIN) \
++do { \
++ rtx __x; \
++ \
++ __x = m68k_legitimize_address (X, OLDX, MODE); \
++ if (__x != NULL_RTX) \
++ { \
++ X = __x; \
++ \
++ if (memory_address_p (MODE, X)) \
++ goto WIN; \
++ } \
++} while (0)
+
+ /* On the 68000, only predecrement and postincrement address depend thus
+ (the amount of decrement or increment being the length of the operand).
+@@ -1028,6 +1003,9 @@
+ assemble_name ((FILE), (NAME)), \
+ fprintf ((FILE), ",%u\n", (int)(ROUNDED)))
+
++#define FINAL_PRESCAN_INSN(INSN, OPVEC, NOPERANDS) \
++ m68k_final_prescan_insn (INSN, OPVEC, NOPERANDS)
++
+ /* On the 68000, we use several CODE characters:
+ '.' for dot needed in Motorola-style opcode names.
+ '-' for an operand pushing on the stack:
+diff -Nur a/gcc/config/m68k/m68k.md b/gcc/config/m68k/m68k.md
+--- a/gcc/config/m68k/m68k.md 2009-02-20 16:20:38.000000000 +0100
++++ b/gcc/config/m68k/m68k.md 2010-01-25 09:50:29.025687257 +0100
+@@ -116,7 +116,8 @@
+ (UNSPEC_GOT 3)
+ (UNSPEC_IB 4)
+ (UNSPEC_TIE 5)
+- (UNSPEC_GOTOFF 6)
++ (UNSPEC_RELOC16 6)
++ (UNSPEC_RELOC32 7)
+ ])
+
+ ;; UNSPEC_VOLATILE usage:
+@@ -414,7 +415,7 @@
+
+ (define_insn "tst<mode>_cf"
+ [(set (cc0)
+- (match_operand:FP 0 "general_operand" "f<FP:dreg><Q>U"))]
++ (match_operand:FP 0 "general_operand" "f<FP:dreg>m"))]
+ "TARGET_COLDFIRE_FPU"
+ {
+ cc_status.flags = CC_IN_68881;
+@@ -570,8 +571,8 @@
+
+ (define_insn "*cmp<mode>_cf"
+ [(set (cc0)
+- (compare (match_operand:FP 0 "fp_src_operand" "f,f,<FP:dreg><Q>U")
+- (match_operand:FP 1 "fp_src_operand" "f,<FP:dreg><Q>U,f")))]
++ (compare (match_operand:FP 0 "fp_src_operand" "f,f,<FP:dreg>m")
++ (match_operand:FP 1 "fp_src_operand" "f,<FP:dreg>m,f")))]
+ "TARGET_COLDFIRE_FPU
+ && (register_operand (operands[0], <MODE>mode)
+ || register_operand (operands[1], <MODE>mode))"
+@@ -779,7 +780,41 @@
+ {
+ rtx tmp, base, offset;
+
+- if (flag_pic && !TARGET_PCREL && symbolic_operand (operands[1], SImode))
++ /* Recognize the case where operand[1] is a reference to thread-local
++ data and load its address to a register. */
++ if (!TARGET_PCREL && m68k_tls_reference_p (operands[1], false))
++ {
++ rtx tmp = operands[1];
++ rtx addend = NULL;
++
++ if (GET_CODE (tmp) == CONST && GET_CODE (XEXP (tmp, 0)) == PLUS)
++ {
++ addend = XEXP (XEXP (tmp, 0), 1);
++ tmp = XEXP (XEXP (tmp, 0), 0);
++ }
++
++ gcc_assert (GET_CODE (tmp) == SYMBOL_REF);
++ gcc_assert (SYMBOL_REF_TLS_MODEL (tmp) != 0);
++
++ tmp = m68k_legitimize_tls_address (tmp);
++
++ if (addend)
++ {
++ if (!REG_P (tmp))
++ {
++ rtx reg;
++
++ reg = gen_reg_rtx (Pmode);
++ emit_move_insn (reg, tmp);
++ tmp = reg;
++ }
++
++ tmp = gen_rtx_PLUS (SImode, tmp, addend);
++ }
++
++ operands[1] = tmp;
++ }
++ else if (flag_pic && !TARGET_PCREL && symbolic_operand (operands[1], SImode))
+ {
+ /* The source is an address which requires PIC relocation.
+ Call legitimize_pic_address with the source, mode, and a relocation
+@@ -1070,10 +1105,8 @@
+ ;; SFmode MEMs are restricted to modes 2-4 if TARGET_COLDFIRE_FPU.
+ ;; The move instructions can handle all combinations.
+ (define_insn "movsf_cf_hard"
+- [(set (match_operand:SF 0 "nonimmediate_operand" "=r<Q>U, f, f,mr,f,r<Q>,f
+-,m")
+- (match_operand:SF 1 "general_operand" " f, r<Q>U,f,rm,F,F, m
+-,f"))]
++ [(set (match_operand:SF 0 "nonimmediate_operand" "=rm,f, f,rm,f,r<Q>,f,m")
++ (match_operand:SF 1 "general_operand" " f, rm,f,rm,F,F, m,f"))]
+ "TARGET_COLDFIRE_FPU"
+ {
+ if (which_alternative == 4 || which_alternative == 5) {
+@@ -1215,8 +1248,8 @@
+ })
+
+ (define_insn "movdf_cf_hard"
+- [(set (match_operand:DF 0 "nonimmediate_operand" "=f, <Q>U,r,f,r,r,m,f")
+- (match_operand:DF 1 "general_operand" " f<Q>U,f, f,r,r,m,r,E"))]
++ [(set (match_operand:DF 0 "nonimmediate_operand" "=f, m,r,f,r,r,m,f")
++ (match_operand:DF 1 "general_operand" " fm,f,f,r,r,m,r,E"))]
+ "TARGET_COLDFIRE_FPU"
+ {
+ rtx xoperands[3];
+@@ -1857,7 +1890,7 @@
+ (define_insn "extendsfdf2_cf"
+ [(set (match_operand:DF 0 "nonimmediate_operand" "=f,f")
+ (float_extend:DF
+- (match_operand:SF 1 "general_operand" "f,<Q>U")))]
++ (match_operand:SF 1 "general_operand" "f,m")))]
+ "TARGET_COLDFIRE_FPU"
+ {
+ if (FP_REG_P (operands[0]) && FP_REG_P (operands[1]))
+@@ -1897,9 +1930,9 @@
+ })
+
+ (define_insn "truncdfsf2_cf"
+- [(set (match_operand:SF 0 "nonimmediate_operand" "=f,d<Q>U")
++ [(set (match_operand:SF 0 "nonimmediate_operand" "=f,dm")
+ (float_truncate:SF
+- (match_operand:DF 1 "general_operand" "<Q>U,f")))]
++ (match_operand:DF 1 "general_operand" "m,f")))]
+ "TARGET_COLDFIRE_FPU"
+ "@
+ fsmove%.d %1,%0
+@@ -2045,7 +2078,7 @@
+
+ (define_insn "ftrunc<mode>2_cf"
+ [(set (match_operand:FP 0 "nonimmediate_operand" "=f")
+- (fix:FP (match_operand:FP 1 "general_operand" "f<FP:dreg><Q>U")))]
++ (fix:FP (match_operand:FP 1 "general_operand" "f<FP:dreg>m")))]
+ "TARGET_COLDFIRE_FPU"
+ {
+ if (FP_REG_P (operands[1]))
+@@ -2338,9 +2371,9 @@
+ "* return output_addsi3 (operands);")
+
+ (define_insn_and_split "*addsi3_5200"
+- [(set (match_operand:SI 0 "nonimmediate_operand" "=mr,mr,a,m,r, ?a, ?a,?a,?a")
+- (plus:SI (match_operand:SI 1 "general_operand" "%0, 0, 0,0,0, a, a, r, a")
+- (match_operand:SI 2 "general_src_operand" " I, L, J,d,mrKi,Cj, r, a, J")))]
++ [(set (match_operand:SI 0 "nonimmediate_operand" "=mr,mr,a, m,r, ?a, ?a,?a,?a")
++ (plus:SI (match_operand:SI 1 "general_operand" "%0, 0, 0, 0,0, a, a, r, a")
++ (match_operand:SI 2 "general_src_operand" " I, L, JCu,d,mrKi,Cj, r, a, JCu")))]
+ "TARGET_COLDFIRE"
+ {
+ switch (which_alternative)
+@@ -2382,9 +2415,9 @@
+ (plus:SI (match_dup 0)
+ (match_dup 1)))]
+ ""
+- [(set_attr "type" "aluq_l,aluq_l,lea,alu_l,alu_l,*,lea,lea,lea")
+- (set_attr "opy" "2,2,*,2,2,*,*,*,*")
+- (set_attr "opy_type" "*,*,mem5,*,*,*,mem6,mem6,mem5")])
++ [(set_attr "type" "aluq_l,aluq_l,lea, alu_l,alu_l,*,lea, lea, lea")
++ (set_attr "opy" "2, 2, *, 2, 2, *,*, *, *")
++ (set_attr "opy_type" "*, *, mem5,*, *, *,mem6,mem6,mem5")])
+
+ (define_insn ""
+ [(set (match_operand:SI 0 "nonimmediate_operand" "=a")
+@@ -2666,7 +2699,7 @@
+ (define_insn "add<mode>3_cf"
+ [(set (match_operand:FP 0 "nonimmediate_operand" "=f")
+ (plus:FP (match_operand:FP 1 "general_operand" "%0")
+- (match_operand:FP 2 "general_operand" "f<FP:dreg><Q>U")))]
++ (match_operand:FP 2 "general_operand" "f<FP:dreg>m")))]
+ "TARGET_COLDFIRE_FPU"
+ {
+ if (FP_REG_P (operands[2]))
+@@ -2889,7 +2922,7 @@
+ (define_insn "sub<mode>3_cf"
+ [(set (match_operand:FP 0 "nonimmediate_operand" "=f")
+ (minus:FP (match_operand:FP 1 "general_operand" "0")
+- (match_operand:FP 2 "general_operand" "f<FP:dreg><Q>U")))]
++ (match_operand:FP 2 "general_operand" "f<FP:dreg>m")))]
+ "TARGET_COLDFIRE_FPU"
+ {
+ if (FP_REG_P (operands[2]))
+@@ -3245,7 +3278,7 @@
+ (define_insn "fmul<mode>3_cf"
+ [(set (match_operand:FP 0 "nonimmediate_operand" "=f")
+ (mult:FP (match_operand:FP 1 "general_operand" "%0")
+- (match_operand:FP 2 "general_operand" "f<Q>U<FP:dreg>")))]
++ (match_operand:FP 2 "general_operand" "fm<FP:dreg>")))]
+ "TARGET_COLDFIRE_FPU"
+ {
+ if (FP_REG_P (operands[2]))
+@@ -3315,7 +3348,7 @@
+ (define_insn "div<mode>3_cf"
+ [(set (match_operand:FP 0 "nonimmediate_operand" "=f")
+ (div:FP (match_operand:FP 1 "general_operand" "0")
+- (match_operand:FP 2 "general_operand" "f<Q>U<FP:dreg>")))]
++ (match_operand:FP 2 "general_operand" "fm<FP:dreg>")))]
+ "TARGET_COLDFIRE_FPU"
+ {
+ if (FP_REG_P (operands[2]))
+@@ -4163,7 +4196,7 @@
+
+ (define_insn "neg<mode>2_cf"
+ [(set (match_operand:FP 0 "nonimmediate_operand" "=f,d")
+- (neg:FP (match_operand:FP 1 "general_operand" "f<FP:dreg><Q>U,0")))]
++ (neg:FP (match_operand:FP 1 "general_operand" "f<FP:dreg>m,0")))]
+ "TARGET_COLDFIRE_FPU"
+ {
+ if (DATA_REG_P (operands[0]))
+@@ -4197,7 +4230,7 @@
+
+ (define_insn "sqrt<mode>2_cf"
+ [(set (match_operand:FP 0 "nonimmediate_operand" "=f")
+- (sqrt:FP (match_operand:FP 1 "general_operand" "f<FP:dreg><Q>U")))]
++ (sqrt:FP (match_operand:FP 1 "general_operand" "f<FP:dreg>m")))]
+ "TARGET_COLDFIRE_FPU"
+ {
+ if (FP_REG_P (operands[1]))
+@@ -4316,7 +4349,7 @@
+
+ (define_insn "abs<mode>2_cf"
+ [(set (match_operand:FP 0 "nonimmediate_operand" "=f,d")
+- (abs:FP (match_operand:FP 1 "general_operand" "f<FP:dreg><Q>U,0")))]
++ (abs:FP (match_operand:FP 1 "general_operand" "f<FP:dreg>m,0")))]
+ "TARGET_COLDFIRE_FPU"
+ {
+ if (DATA_REG_P (operands[0]))
+diff -Nur a/gcc/config/m68k/m68k.opt b/gcc/config/m68k/m68k.opt
+--- a/gcc/config/m68k/m68k.opt 2009-02-20 16:20:38.000000000 +0100
++++ b/gcc/config/m68k/m68k.opt 2010-01-25 09:50:29.025687257 +0100
+@@ -182,3 +182,7 @@
+ mxgot
+ Target Report Mask(XGOT)
+ Support more than 8192 GOT entries on ColdFire
++
++mxtls
++Target Report Mask(XTLS)
++Support TLS segment larger than 64K
+diff -Nur a/gcc/config/m68k/m68k-protos.h b/gcc/config/m68k/m68k-protos.h
+--- a/gcc/config/m68k/m68k-protos.h 2009-02-20 16:20:38.000000000 +0100
++++ b/gcc/config/m68k/m68k-protos.h 2010-01-25 09:50:29.025687257 +0100
+@@ -54,19 +54,27 @@
+ extern bool m68k_output_addr_const_extra (FILE *, rtx);
+ extern void notice_update_cc (rtx, rtx);
+ extern bool m68k_legitimate_base_reg_p (rtx, bool);
+-extern bool m68k_legitimate_index_reg_p (rtx, bool);
++extern bool m68k_legitimate_index_reg_p (enum machine_mode, rtx, bool);
+ extern bool m68k_illegitimate_symbolic_constant_p (rtx);
+ extern bool m68k_legitimate_address_p (enum machine_mode, rtx, bool);
+ extern bool m68k_matches_q_p (rtx);
+ extern bool m68k_matches_u_p (rtx);
+ extern rtx legitimize_pic_address (rtx, enum machine_mode, rtx);
++extern rtx m68k_legitimize_tls_address (rtx);
++extern bool m68k_tls_reference_p (rtx, bool);
++extern rtx m68k_legitimize_address (rtx, rtx, enum machine_mode);
+ extern int valid_dbcc_comparison_p_2 (rtx, enum machine_mode);
+ extern rtx m68k_libcall_value (enum machine_mode);
+ extern rtx m68k_function_value (const_tree, const_tree);
+ extern int emit_move_sequence (rtx *, enum machine_mode, rtx);
+ extern bool m68k_movem_pattern_p (rtx, rtx, HOST_WIDE_INT, bool);
+ extern const char *m68k_output_movem (rtx *, rtx, HOST_WIDE_INT, bool);
++extern void m68k_final_prescan_insn (rtx, rtx *, int);
+
++/* Functions from m68k.c used in constraints.md. */
++extern rtx m68k_unwrap_symbol (rtx, bool);
++
++/* Functions from m68k.c used in genattrtab. */
+ #ifdef HAVE_ATTR_cpu
+ extern enum attr_cpu m68k_sched_cpu;
+ extern enum attr_mac m68k_sched_mac;
+diff -Nur a/gcc/config/m68k/predicates.md b/gcc/config/m68k/predicates.md
+--- a/gcc/config/m68k/predicates.md 2007-09-24 23:00:22.000000000 +0200
++++ b/gcc/config/m68k/predicates.md 2010-01-25 09:50:29.025687257 +0100
+@@ -130,7 +130,9 @@
+ (match_code "sign_extend,zero_extend"))
+
+ ;; Returns true if OP is either a symbol reference or a sum of a
+-;; symbol reference and a constant.
++;; symbol reference and a constant. This predicate is for "raw"
++;; symbol references not yet processed by legitimize*_address,
++;; hence we do not handle UNSPEC_{XGOT, TLS, XTLS} here.
+
+ (define_predicate "symbolic_operand"
+ (match_code "symbol_ref,label_ref,const")
+diff -Nur a/gcc/config/m68k/t-uclinux b/gcc/config/m68k/t-uclinux
+--- a/gcc/config/m68k/t-uclinux 2008-04-03 08:12:27.000000000 +0200
++++ b/gcc/config/m68k/t-uclinux 2010-01-25 09:50:29.025687257 +0100
+@@ -1,8 +1,8 @@
+ # crti and crtn are provided by uClibc.
+ EXTRA_MULTILIB_PARTS=crtbegin.o crtend.o
+
+-# Only include multilibs for the 68020 and for CPUs without an MMU.
+-M68K_MLIB_CPU += && (MLIB == "68020" || !match(FLAGS, "FL_MMU"))
++# Include multilibs for CPUs without an MMU or with FL_UCLINUX
++M68K_MLIB_CPU += && (!match(FLAGS, "FL_MMU") || match(FLAGS, "FL_UCLINUX"))
+
+ # Add multilibs for execute-in-place and shared-library code.
+ M68K_MLIB_OPTIONS += msep-data/mid-shared-library
+diff -Nur a/gcc/config/mips/74k.md b/gcc/config/mips/74k.md
+--- a/gcc/config/mips/74k.md 2007-08-02 12:49:31.000000000 +0200
++++ b/gcc/config/mips/74k.md 2010-01-25 09:50:29.025687257 +0100
+@@ -118,8 +118,7 @@
+ ;; stores
+ (define_insn_reservation "r74k_int_store" 1
+ (and (eq_attr "cpu" "74kc,74kf2_1,74kf1_1,74kf3_2")
+- (and (eq_attr "type" "store")
+- (eq_attr "mode" "!unknown")))
++ (eq_attr "type" "store"))
+ "r74k_agen")
+
+
+@@ -145,33 +144,123 @@
+ ;; load->load base: 4 cycles
+ ;; load->store base: 4 cycles
+ (define_bypass 4 "r74k_int_load" "r74k_int_load")
+-(define_bypass 4 "r74k_int_load" "r74k_int_store" "!store_data_bypass_p")
++(define_bypass 4 "r74k_int_load" "r74k_int_store" "!mips_store_data_bypass_p")
+
+ ;; logical/move/slt/signext->next use : 1 cycles (Default)
+ ;; logical/move/slt/signext->load base: 2 cycles
+ ;; logical/move/slt/signext->store base: 2 cycles
+ (define_bypass 2 "r74k_int_logical" "r74k_int_load")
+-(define_bypass 2 "r74k_int_logical" "r74k_int_store" "!store_data_bypass_p")
++(define_bypass 2 "r74k_int_logical" "r74k_int_store"
++ "!mips_store_data_bypass_p")
+
+ ;; arith->next use : 2 cycles (Default)
+ ;; arith->load base: 3 cycles
+ ;; arith->store base: 3 cycles
+ (define_bypass 3 "r74k_int_arith" "r74k_int_load")
+-(define_bypass 3 "r74k_int_arith" "r74k_int_store" "!store_data_bypass_p")
++(define_bypass 3 "r74k_int_arith" "r74k_int_store" "!mips_store_data_bypass_p")
+
+ ;; cmove->next use : 4 cycles (Default)
+ ;; cmove->load base: 5 cycles
+ ;; cmove->store base: 5 cycles
+ (define_bypass 5 "r74k_int_cmove" "r74k_int_load")
+-(define_bypass 5 "r74k_int_cmove" "r74k_int_store" "!store_data_bypass_p")
++(define_bypass 5 "r74k_int_cmove" "r74k_int_store"
++ "!mips_store_data_bypass_p")
+
+ ;; mult/madd/msub->int_mfhilo : 4 cycles (default)
+ ;; mult->madd/msub : 1 cycles
+ ;; madd/msub->madd/msub : 1 cycles
+-(define_bypass 1 "r74k_int_mult,r74k_int_mul3" "r74k_int_madd"
+- "mips_linked_madd_p")
+-(define_bypass 1 "r74k_int_madd" "r74k_int_madd"
+- "mips_linked_madd_p")
++(define_bypass 1 "r74k_int_mult" "r74k_int_madd")
++(define_bypass 1 "r74k_int_madd" "r74k_int_madd")
++
++(define_bypass 1 "r74k_int_mul3" "r74k_int_madd"
++ "mips_mult_madd_chain_bypass_p")
++
++
++;; --------------------------------------------------------------
++;; DSP instructins
++;; --------------------------------------------------------------
++
++;; Non-saturating insn have the same latency as normal ALU operations,
++(define_insn_reservation "r74k_dsp_alu" 2
++ (and (eq_attr "cpu" "74kc,74kf2_1,74kf1_1,74kf3_2")
++ (eq_attr "type" "dspalu"))
++ "r74k_alu")
++
++;; Saturating insn takes an extra cycle.
++(define_insn_reservation "r74k_dsp_alu_sat" 3
++ (and (eq_attr "cpu" "74kc,74kf2_1,74kf1_1,74kf3_2")
++ (eq_attr "type" "dspalusat"))
++ "r74k_alu")
++
++;; dpaq_s, dpau, dpsq_s, dpsu, maq_s, mulsaq
++;; - delivers result to hi/lo in 6 cycle (bypass at M4)
++(define_insn_reservation "r74k_dsp_mac" 6
++ (and (eq_attr "cpu" "74kc,74kf2_1,74kf1_1,74kf3_2")
++ (eq_attr "type" "dspmac"))
++ "r74k_alu+r74k_mul")
++
++;; dpaq_sa, dpsq_sa, maq_sa
++;; - delivers result to hi/lo in 7 cycle (bypass at WB)
++(define_insn_reservation "r74k_dsp_mac_sat" 7
++ (and (eq_attr "cpu" "74kc,74kf2_1,74kf1_1,74kf3_2")
++ (eq_attr "type" "dspmacsat"))
++ "r74k_alu+r74k_mul")
++
++;; extp, extpdp, extpdpv, extpv, extr, extrv
++;; - same latency as "mul"
++(define_insn_reservation "r74k_dsp_acc_ext" 7
++ (and (eq_attr "cpu" "74kc,74kf2_1,74kf1_1,74kf3_2")
++ (eq_attr "type" "accext"))
++ "r74k_alu+r74k_mul")
++
++;; mthlip, shilo, shilov
++;; - same latency as "mul"
++(define_insn_reservation "r74k_dsp_acc_mod" 7
++ (and (eq_attr "cpu" "74kc,74kf2_1,74kf1_1,74kf3_2")
++ (eq_attr "type" "accmod"))
++ "r74k_alu+r74k_mul")
++
++;; dspalu ->load/store base
++;; dspalusat->load/store base
++;; - we should never see these in real life.
++
++;; dsp_mac->dsp_mac : 1 cycles (repeat rate of 1)
++;; dsp_mac->dsp_mac_sat : 1 cycles (repeat rate of 1)
++(define_bypass 1 "r74k_dsp_mac" "r74k_dsp_mac")
++(define_bypass 1 "r74k_dsp_mac" "r74k_dsp_mac_sat")
++
++;; dsp_mac_sat->dsp_mac_sat : 2 cycles (repeat rate of 2)
++;; dsp_mac_sat->dsp_mac : 2 cycles (repeat rate of 2)
++(define_bypass 2 "r74k_dsp_mac_sat" "r74k_dsp_mac_sat")
++(define_bypass 2 "r74k_dsp_mac_sat" "r74k_dsp_mac")
++
++(define_bypass 1 "r74k_int_mult" "r74k_dsp_mac")
++(define_bypass 1 "r74k_int_mult" "r74k_dsp_mac_sat")
++
++;; Before reload, all multiplier is registered as imul3 (which has a long
++;; latency). We temporary jig the latency such that the macc groups
++;; are scheduled closely together during the first scheduler pass.
++(define_bypass 1 "r74k_int_mul3" "r74k_dsp_mac"
++ "mips_mult_madd_chain_bypass_p")
++(define_bypass 1 "r74k_int_mul3" "r74k_dsp_mac_sat"
++ "mips_mult_madd_chain_bypass_p")
++
++;; Assuming the following is true (bypass at M4)
++;; AP AF AM MB M1 M2 M3 M4 WB GR GC
++;; AP AF AM MB M1 M2 M3 M4 WB GR GC
++;; dsp_mac->dsp_acc_ext : 4 cycles
++;; dsp_mac->dsp_acc_mod : 4 cycles
++(define_bypass 4 "r74k_dsp_mac" "r74k_dsp_acc_ext")
++(define_bypass 4 "r74k_dsp_mac" "r74k_dsp_acc_mod")
++
++;; Assuming the following is true (bypass at WB)
++;; AP AF AM MB M1 M2 M3 M4 WB GR GC
++;; AP AF AM MB M1 M2 M3 M4 WB GR GC
++;; dsp_mac_sat->dsp_acc_ext : 5 cycles
++;; dsp_mac_sat->dsp_acc_mod : 5 cycles
++(define_bypass 5 "r74k_dsp_mac_sat" "r74k_dsp_acc_ext")
++(define_bypass 5 "r74k_dsp_mac_sat" "r74k_dsp_acc_mod")
++
+
+ ;; --------------------------------------------------------------
+ ;; Floating Point Instructions
+diff -Nur a/gcc/config/mips/crtfastmath.c b/gcc/config/mips/crtfastmath.c
+--- a/gcc/config/mips/crtfastmath.c 1970-01-01 01:00:00.000000000 +0100
++++ b/gcc/config/mips/crtfastmath.c 2010-01-25 09:50:29.025687257 +0100
+@@ -0,0 +1,53 @@
++/* Copyright (C) 2008, 2009 Free Software Foundation, Inc.
++
++ 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/>. */
++
++#ifdef __mips_hard_float
++
++/* flush denormalized numbers to zero */
++#define _FPU_FLUSH_TZ 0x1000000
++
++/* rounding control */
++#define _FPU_RC_NEAREST 0x0 /* RECOMMENDED */
++#define _FPU_RC_ZERO 0x1
++#define _FPU_RC_UP 0x2
++#define _FPU_RC_DOWN 0x3
++
++/* enable interrupts for IEEE exceptions */
++#define _FPU_IEEE 0x00000F80
++
++/* Macros for accessing the hardware control word. */
++#define _FPU_GETCW(cw) __asm__ ("cfc1 %0,$31" : "=r" (cw))
++#define _FPU_SETCW(cw) __asm__ ("ctc1 %0,$31" : : "r" (cw))
++
++static void __attribute__((constructor))
++set_fast_math (void)
++{
++ unsigned int fcr;
++
++ /* fastmath: flush to zero, round to nearest, ieee exceptions disabled */
++ fcr = _FPU_FLUSH_TZ | _FPU_RC_NEAREST;
++
++ _FPU_SETCW(fcr);
++}
++
++#endif /* __mips_hard_float */
+diff -Nur a/gcc/config/mips/cs-sgxx-linux.h b/gcc/config/mips/cs-sgxx-linux.h
+--- a/gcc/config/mips/cs-sgxx-linux.h 1970-01-01 01:00:00.000000000 +0100
++++ b/gcc/config/mips/cs-sgxx-linux.h 2010-01-25 09:50:29.025687257 +0100
+@@ -0,0 +1,44 @@
++/* MIPS SourceryG++ GNU/Linux Configuration.
++ Copyright (C) 2008
++ Free Software Foundation, Inc.
++
++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/>. */
++
++/* We do not need to provide an explicit big-endian multilib. */
++#undef MULTILIB_DEFAULTS
++#define MULTILIB_DEFAULTS \
++ { "EB" }
++
++/* The various C libraries each have their own subdirectory. */
++#undef SYSROOT_SUFFIX_SPEC
++#define SYSROOT_SUFFIX_SPEC \
++"%{muclibc:/uclibc}\
++%{mips2|mips3|mips4|march=mips2|march=mips3|march=mips4|march=r6000|\
++march=r4000|march=vr4100|march=vr4111|march=vr4120|march=vr4130|\
++march=vr4300|march=r4400|march=r4600|march=orion|march=r4650|\
++march=loongson2e|march=loongson2f|march=r8000|march=r10000|\
++march=r12000|march=r14000|march=r16000|\
++march=vr5000|march=vr5400|march=vr5500|march=rm7000|\
++march=rm9000:/mips2;\
++mips32|march=mips32|march=4kc|march=4km|march=4kp|march=4ksc|\
++mips64|march=mips64|march=5kc|march=5kf|march=20kc|march=sb1|march=sb1a|\
++march=sr71000|march=xlr:/mips32}\
++%{msoft-float:/soft-float}%{mel|EL:/el}"
++
++#undef SYSROOT_HEADERS_SUFFIX_SPEC
++#define SYSROOT_HEADERS_SUFFIX_SPEC \
++ "%{muclibc:/uclibc}"
+diff -Nur a/gcc/config/mips/cs-sgxxlite-linux.h b/gcc/config/mips/cs-sgxxlite-linux.h
+--- a/gcc/config/mips/cs-sgxxlite-linux.h 1970-01-01 01:00:00.000000000 +0100
++++ b/gcc/config/mips/cs-sgxxlite-linux.h 2010-01-25 09:50:29.025687257 +0100
+@@ -0,0 +1,33 @@
++/* MIPS SourceryG++ GNU/Linux Configuration.
++ Copyright (C) 2008
++ Free Software Foundation, Inc.
++
++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/>. */
++
++/* We do not need to provide an explicit big-endian multilib. */
++#undef MULTILIB_DEFAULTS
++#define MULTILIB_DEFAULTS \
++ { "EB" }
++
++/* The various C libraries each have their own subdirectory. */
++#undef SYSROOT_SUFFIX_SPEC
++#define SYSROOT_SUFFIX_SPEC \
++"%{muclibc:/uclibc}%{msoft-float:/soft-float}%{mel|EL:/el}"
++
++#undef SYSROOT_HEADERS_SUFFIX_SPEC
++#define SYSROOT_HEADERS_SUFFIX_SPEC \
++ "%{muclibc:/uclibc}"
+diff -Nur a/gcc/config/mips/linux64.h b/gcc/config/mips/linux64.h
+--- a/gcc/config/mips/linux64.h 2009-02-20 16:20:38.000000000 +0100
++++ b/gcc/config/mips/linux64.h 2010-01-25 09:50:29.025687257 +0100
+@@ -69,3 +69,9 @@
+ ieee_quad_format is the default, but let's put this here to make
+ sure nobody thinks we just forgot to set it to something else. */
+ #define MIPS_TFMODE_FORMAT mips_quad_format
++
++/* Similar to standard Linux, but adding -ffast-math support. */
++#undef ENDFILE_SPEC
++#define ENDFILE_SPEC \
++ "%{ffast-math|funsafe-math-optimizations:crtfastmath.o%s} \
++ %{shared|pie:crtendS.o%s;:crtend.o%s} crtn.o%s"
+diff -Nur a/gcc/config/mips/linux.h b/gcc/config/mips/linux.h
+--- a/gcc/config/mips/linux.h 2009-02-20 16:20:38.000000000 +0100
++++ b/gcc/config/mips/linux.h 2010-01-25 09:50:29.025687257 +0100
+@@ -147,3 +147,17 @@
+ #define DRIVER_SELF_SPECS \
+ BASE_DRIVER_SELF_SPECS, \
+ LINUX_DRIVER_SELF_SPECS
++
++/* Similar to standard Linux, but adding -ffast-math support. */
++#undef ENDFILE_SPEC
++#define ENDFILE_SPEC \
++ "%{ffast-math|funsafe-math-optimizations:crtfastmath.o%s} \
++ %{shared|pie:crtendS.o%s;:crtend.o%s} crtn.o%s"
++
++#undef SUBTARGET_OVERRIDE_OPTIONS
++#define SUBTARGET_OVERRIDE_OPTIONS \
++do { \
++ /* __thread_support is not supported by uClibc. */ \
++ if (linux_uclibc) \
++ targetm.have_tls = 0; \
++} while (0)
+diff -Nur a/gcc/config/mips/mips.c b/gcc/config/mips/mips.c
+--- a/gcc/config/mips/mips.c 2009-03-02 21:26:22.000000000 +0100
++++ b/gcc/config/mips/mips.c 2010-01-25 09:50:29.025687257 +0100
+@@ -261,18 +261,29 @@
+ /* Likewise FPR X. */
+ unsigned int fmask;
+
+- /* The number of GPRs and FPRs saved. */
++ /* Likewise doubleword accumulator X ($acX). */
++ unsigned int acc_mask;
++
++ /* The number of GPRs, FPRs, doubleword accumulators and COP0
++ registers saved. */
+ unsigned int num_gp;
+ unsigned int num_fp;
++ unsigned int num_acc;
++ unsigned int num_cop0_regs;
+
+- /* The offset of the topmost GPR and FPR save slots from the top of
+- the frame, or zero if no such slots are needed. */
++ /* The offset of the topmost GPR, FPR, accumulator and COP0-register
++ save slots from the top of the frame, or zero if no such slots are
++ needed. */
+ HOST_WIDE_INT gp_save_offset;
+ HOST_WIDE_INT fp_save_offset;
++ HOST_WIDE_INT acc_save_offset;
++ HOST_WIDE_INT cop0_save_offset;
+
+ /* Likewise, but giving offsets from the bottom of the frame. */
+ HOST_WIDE_INT gp_sp_offset;
+ HOST_WIDE_INT fp_sp_offset;
++ HOST_WIDE_INT acc_sp_offset;
++ HOST_WIDE_INT cop0_sp_offset;
+
+ /* The offset of arg_pointer_rtx from frame_pointer_rtx. */
+ HOST_WIDE_INT arg_pointer_offset;
+@@ -310,6 +321,20 @@
+ /* True if we have emitted an instruction to initialize
+ mips16_gp_pseudo_rtx. */
+ bool initialized_mips16_gp_pseudo_p;
++
++ /* True if this is an interrupt handler. */
++ bool interrupt_handler_p;
++
++ /* True if this is an interrupt handler that uses shadow registers. */
++ bool use_shadow_register_set_p;
++
++ /* True if this is an interrupt handler that should keep interrupts
++ masked. */
++ bool keep_interrupts_masked_p;
++
++ /* True if this is an interrupt handler that should use DERET
++ instead of ERET. */
++ bool use_debug_exception_return_p;
+ };
+
+ /* Information about a single argument. */
+@@ -542,9 +567,16 @@
+ ALL_REGS, ALL_REGS, ALL_REGS, ALL_REGS
+ };
+
++#ifdef CVMX_SHARED_BSS_FLAGS
++static tree octeon_handle_cvmx_shared_attribute (tree *, tree, tree, int, bool *);
++#endif
++
+ /* The value of TARGET_ATTRIBUTE_TABLE. */
+ const struct attribute_spec mips_attribute_table[] = {
+ /* { name, min_len, max_len, decl_req, type_req, fn_type_req, handler } */
++#ifdef CVMX_SHARED_BSS_FLAGS
++ { "cvmx_shared", 0, 0, true, false, false, octeon_handle_cvmx_shared_attribute },
++#endif
+ { "long_call", 0, 0, false, true, true, NULL },
+ { "far", 0, 0, false, true, true, NULL },
+ { "near", 0, 0, false, true, true, NULL },
+@@ -554,6 +586,11 @@
+ code generation but don't carry other semantics. */
+ { "mips16", 0, 0, true, false, false, NULL },
+ { "nomips16", 0, 0, true, false, false, NULL },
++ /* Allow functions to be specified as interrupt handlers */
++ { "interrupt", 0, 0, false, true, true, NULL },
++ { "use_shadow_register_set", 0, 0, false, true, true, NULL },
++ { "keep_interrupts_masked", 0, 0, false, true, true, NULL },
++ { "use_debug_exception_return", 0, 0, false, true, true, NULL },
+ { NULL, 0, 0, false, false, false, NULL }
+ };
+
+@@ -659,6 +696,11 @@
+ { "74kx", PROCESSOR_74KF1_1, 33, 0 },
+ { "74kf3_2", PROCESSOR_74KF3_2, 33, 0 },
+
++ { "1004kc", PROCESSOR_24KC, 33, 0 }, /* 1004K with MT/DSP. */
++ { "1004kf2_1", PROCESSOR_24KF2_1, 33, 0 },
++ { "1004kf", PROCESSOR_24KF2_1, 33, 0 },
++ { "1004kf1_1", PROCESSOR_24KF1_1, 33, 0 },
++
+ /* MIPS64 processors. */
+ { "5kc", PROCESSOR_5KC, 64, 0 },
+ { "5kf", PROCESSOR_5KF, 64, 0 },
+@@ -1064,13 +1106,7 @@
+ DEFAULT_COSTS
+ },
+ { /* XLR */
+- /* Need to replace first five with the costs of calling the appropriate
+- libgcc routine. */
+- COSTS_N_INSNS (256), /* fp_add */
+- COSTS_N_INSNS (256), /* fp_mult_sf */
+- COSTS_N_INSNS (256), /* fp_mult_df */
+- COSTS_N_INSNS (256), /* fp_div_sf */
+- COSTS_N_INSNS (256), /* fp_div_df */
++ SOFT_FP_COSTS,
+ COSTS_N_INSNS (8), /* int_mult_si */
+ COSTS_N_INSNS (8), /* int_mult_di */
+ COSTS_N_INSNS (72), /* int_div_si */
+@@ -1172,6 +1208,42 @@
+ return lookup_attribute ("nomips16", DECL_ATTRIBUTES (decl)) != NULL;
+ }
+
++/* Check if the interrupt attribute is set for a function. */
++
++static bool
++mips_interrupt_type_p (tree type)
++{
++ return lookup_attribute ("interrupt", TYPE_ATTRIBUTES (type)) != NULL;
++}
++
++/* Check if the attribute to use shadow register set is set for a function. */
++
++static bool
++mips_use_shadow_register_set_p (tree type)
++{
++ return lookup_attribute ("use_shadow_register_set",
++ TYPE_ATTRIBUTES (type)) != NULL;
++}
++
++/* Check if the attribute to keep interrupts masked is set for a function. */
++
++static bool
++mips_keep_interrupts_masked_p (tree type)
++{
++ return lookup_attribute ("keep_interrupts_masked",
++ TYPE_ATTRIBUTES (type)) != NULL;
++}
++
++/* Check if the attribute to use debug exception return is set for
++ a function. */
++
++static bool
++mips_use_debug_exception_return_p (tree type)
++{
++ return lookup_attribute ("use_debug_exception_return",
++ TYPE_ATTRIBUTES (type)) != NULL;
++}
++
+ /* Return true if function DECL is a MIPS16 function. Return the ambient
+ setting if DECL is null. */
+
+@@ -2795,7 +2867,7 @@
+ mips_legitimize_address (rtx *xloc, enum machine_mode mode)
+ {
+ rtx base, addr;
+- HOST_WIDE_INT offset;
++ HOST_WIDE_INT intval, high, offset;
+
+ if (mips_tls_symbol_p (*xloc))
+ {
+@@ -2820,6 +2892,32 @@
+ *xloc = mips_force_address (addr, mode);
+ return true;
+ }
++
++ /* Handle references to constant addresses by loading the high part
++ into a register and using an offset for the low part. */
++ if (GET_CODE (base) == CONST_INT)
++ {
++ intval = INTVAL (base);
++ high = trunc_int_for_mode (CONST_HIGH_PART (intval), Pmode);
++ offset = CONST_LOW_PART (intval);
++ /* Ignore cases in which a positive address would be accessed by a
++ negative offset from a negative address. The required wraparound
++ does not occur for 32-bit addresses on 64-bit targets, and it is
++ very unlikely that such an access would occur in real code anyway.
++
++ If the low offset is not legitimate for MODE, prefer to load
++ the constant normally, instead of using mips_force_address on
++ the legitimized address. The latter option would cause us to
++ use (D)ADDIU unconditionally, but LUI/ORI is more efficient
++ than LUI/ADDIU on some targets. */
++ if ((intval < 0 || high > 0)
++ && mips_valid_offset_p (GEN_INT (offset), mode))
++ {
++ base = mips_force_temporary (NULL, GEN_INT (high));
++ *xloc = plus_constant (base, offset);
++ return true;
++ }
++ }
+ return false;
+ }
+
+@@ -6188,6 +6286,11 @@
+ if (!TARGET_SIBCALLS)
+ return false;
+
++ /* Interrupt handlers need special epilogue code and therefore can't
++ use sibcalls. */
++ if (mips_interrupt_type_p (TREE_TYPE (current_function_decl)))
++ return false;
++
+ /* We can't do a sibcall if the called function is a MIPS16 function
+ because there is no direct "jx" instruction equivalent to "jalx" to
+ switch the ISA mode. We only care about cases where the sibling
+@@ -6608,6 +6711,15 @@
+ if (!mips_get_unaligned_mem (&src, width, bitpos, &left, &right))
+ return false;
+
++ if (ISA_HAS_UL_US)
++ {
++ if (GET_MODE (dest) == DImode)
++ emit_insn (gen_mov_uld (dest, src, left));
++ else
++ emit_insn (gen_mov_ulw (dest, src, left));
++ return true;
++ }
++
+ temp = gen_reg_rtx (GET_MODE (dest));
+ if (GET_MODE (dest) == DImode)
+ {
+@@ -6642,6 +6754,16 @@
+
+ mode = mode_for_size (width, MODE_INT, 0);
+ src = gen_lowpart (mode, src);
++
++ if (ISA_HAS_UL_US)
++ {
++ if (GET_MODE (src) == DImode)
++ emit_insn (gen_mov_usd (dest, src, left));
++ else
++ emit_insn (gen_mov_usw (dest, src, left));
++ return true;
++ }
++
+ if (mode == DImode)
+ {
+ emit_insn (gen_mov_sdl (dest, src, left));
+@@ -7229,7 +7351,11 @@
+ || (letter == 'L' && TARGET_BIG_ENDIAN)
+ || letter == 'D')
+ regno++;
+- fprintf (file, "%s", reg_names[regno]);
++ /* We need to print $0 .. $31 for COP0 registers. */
++ if (COP0_REG_P (regno))
++ fprintf (file, "$%s", &reg_names[regno][4]);
++ else
++ fprintf (file, "%s", reg_names[regno]);
+ }
+ break;
+
+@@ -7369,6 +7495,12 @@
+ if (TARGET_ABICALLS || TARGET_VXWORKS_RTP)
+ return false;
+
++#ifdef CVMX_SHARED_BSS_FLAGS
++ if (TARGET_OCTEON && TREE_CODE (decl) == VAR_DECL
++ && lookup_attribute ("cvmx_shared", DECL_ATTRIBUTES (decl)))
++ return false;
++#endif
++
+ if (TREE_CODE (decl) == VAR_DECL && DECL_SECTION_NAME (decl) != 0)
+ {
+ const char *name;
+@@ -7595,6 +7727,37 @@
+ return NULL_RTX;
+ }
+
++/* DSP ALU can bypass data with no delays for the following pairs. */
++enum insn_code dspalu_bypass_table[][2] =
++{
++ {CODE_FOR_mips_addsc, CODE_FOR_mips_addwc},
++ {CODE_FOR_mips_cmpu_eq_qb, CODE_FOR_mips_pick_qb},
++ {CODE_FOR_mips_cmpu_lt_qb, CODE_FOR_mips_pick_qb},
++ {CODE_FOR_mips_cmpu_le_qb, CODE_FOR_mips_pick_qb},
++ {CODE_FOR_mips_cmp_eq_ph, CODE_FOR_mips_pick_ph},
++ {CODE_FOR_mips_cmp_lt_ph, CODE_FOR_mips_pick_ph},
++ {CODE_FOR_mips_cmp_le_ph, CODE_FOR_mips_pick_ph},
++ {CODE_FOR_mips_wrdsp, CODE_FOR_mips_insv}
++};
++
++int
++mips_dspalu_bypass_p (rtx out_insn, rtx in_insn)
++{
++ int i;
++ int num_bypass = (sizeof (dspalu_bypass_table)
++ / (2 * sizeof (enum insn_code)));
++ enum insn_code out_icode = INSN_CODE (out_insn);
++ enum insn_code in_icode = INSN_CODE (in_insn);
++
++ for (i = 0; i < num_bypass; i++)
++ {
++ if (out_icode == dspalu_bypass_table[i][0]
++ && in_icode == dspalu_bypass_table[i][1])
++ return true;
++ }
++
++ return false;
++}
+ /* Implement ASM_OUTPUT_ASCII. */
+
+ void
+@@ -7819,11 +7982,19 @@
+ "\t.previous\n", TARGET_LONG64 ? 64 : 32);
+
+ #ifdef HAVE_AS_GNU_ATTRIBUTE
++#ifdef TARGET_MIPS_SDEMTK
++ fprintf (asm_out_file, "\t.gnu_attribute 4, %d\n",
++ (!TARGET_NO_FLOAT
++ ? (TARGET_HARD_FLOAT
++ ? (TARGET_DOUBLE_FLOAT
++ ? ((!TARGET_64BIT && TARGET_FLOAT64) ? 4 : 1) : 2) : 3) : 0));
++#else
+ fprintf (asm_out_file, "\t.gnu_attribute 4, %d\n",
+ (TARGET_HARD_FLOAT_ABI
+ ? (TARGET_DOUBLE_FLOAT
+ ? ((!TARGET_64BIT && TARGET_FLOAT64) ? 4 : 1) : 2) : 3));
+ #endif
++#endif
+ }
+
+ /* If TARGET_ABICALLS, tell GAS to generate -KPIC code. */
+@@ -8436,12 +8607,53 @@
+ return GLOBAL_POINTER_REGNUM;
+ }
+
++/* Return true if REGNO is a register that is ordinarily call-clobbered
++ but must nevertheless be preserved by an interrupt handler. */
++
++static bool
++mips_interrupt_extra_call_saved_reg_p (unsigned int regno)
++{
++ if (MD_REG_P (regno))
++ return true;
++
++ if (TARGET_DSP && DSP_ACC_REG_P (regno))
++ return true;
++
++ if (GP_REG_P (regno) && !cfun->machine->use_shadow_register_set_p)
++ {
++ /* $0 is hard-wired. */
++ if (regno == GP_REG_FIRST)
++ return false;
++
++ /* The interrupt handler can treat kernel registers as
++ scratch registers. */
++ if (KERNEL_REG_P (regno))
++ return false;
++
++ /* The function will return the stack pointer to its original value
++ anyway. */
++ if (regno == STACK_POINTER_REGNUM)
++ return false;
++
++ /* Otherwise, return true for registers that aren't ordinarily
++ call-clobbered. */
++ return call_really_used_regs[regno];
++ }
++
++ return false;
++}
++
+ /* Return true if the current function should treat register REGNO
+ as call-saved. */
+
+ static bool
+ mips_cfun_call_saved_reg_p (unsigned int regno)
+ {
++ /* Interrupt handlers need to save extra registers. */
++ if (cfun->machine->interrupt_handler_p
++ && mips_interrupt_extra_call_saved_reg_p (regno))
++ return true;
++
+ /* call_insns preserve $28 unless they explicitly say otherwise,
+ so call_really_used_regs[] treats $28 as call-saved. However,
+ we want the ABI property rather than the default call_insn
+@@ -8490,6 +8702,13 @@
+ if (regno == GP_REG_FIRST + 31 && mips16_cfun_returns_in_fpr_p ())
+ return true;
+
++ /* If REGNO is ordinarily call-clobbered, we must assume that any
++ called function could modify it. */
++ if (cfun->machine->interrupt_handler_p
++ && !current_function_is_leaf
++ && mips_interrupt_extra_call_saved_reg_p (regno))
++ return true;
++
+ return false;
+ }
+
+@@ -8545,6 +8764,14 @@
+ C | callee-allocated save area |
+ | for register varargs |
+ | |
++ +-------------------------------+ <-- frame_pointer_rtx
++ | | + cop0_sp_offset
++ | COP0 reg save area | + UNITS_PER_WORD
++ | |
++ +-------------------------------+ <-- frame_pointer_rtx + acc_sp_offset
++ | | + UNITS_PER_WORD
++ | accumulator save area |
++ | |
+ +-------------------------------+ <-- frame_pointer_rtx + fp_sp_offset
+ | | + UNITS_PER_HWFPVALUE
+ | FPR save area |
+@@ -8588,6 +8815,28 @@
+ HOST_WIDE_INT offset, size;
+ unsigned int regno, i;
+
++ /* Set this function's interrupt properties. */
++ if (mips_interrupt_type_p (TREE_TYPE (current_function_decl)))
++ {
++ if (!ISA_MIPS32R2)
++ error ("the %<interrupt%> attribute requires a MIPS32r2 processor");
++ else if (TARGET_HARD_FLOAT)
++ error ("the %<interrupt%> attribute requires %<-msoft-float%>");
++ else if (TARGET_MIPS16)
++ error ("interrupt handlers cannot be MIPS16 functions");
++ else
++ {
++ cfun->machine->interrupt_handler_p = true;
++ cfun->machine->use_shadow_register_set_p =
++ mips_use_shadow_register_set_p (TREE_TYPE (current_function_decl));
++ cfun->machine->keep_interrupts_masked_p =
++ mips_keep_interrupts_masked_p (TREE_TYPE (current_function_decl));
++ cfun->machine->use_debug_exception_return_p =
++ mips_use_debug_exception_return_p (TREE_TYPE
++ (current_function_decl));
++ }
++ }
++
+ frame = &cfun->machine->frame;
+ memset (frame, 0, sizeof (*frame));
+ size = get_frame_size ();
+@@ -8657,7 +8906,7 @@
+ }
+
+ /* Find out which FPRs we need to save. This loop must iterate over
+- the same space as its companion in mips_for_each_saved_reg. */
++ the same space as its companion in mips_for_each_saved_gpr_and_fpr. */
+ if (TARGET_HARD_FLOAT)
+ for (regno = FP_REG_FIRST; regno <= FP_REG_LAST; regno += MAX_FPRS_PER_FMT)
+ if (mips_save_reg_p (regno))
+@@ -8673,6 +8922,47 @@
+ frame->fp_sp_offset = offset - UNITS_PER_HWFPVALUE;
+ }
+
++ /* Add in space for the interrupt context information. */
++ if (cfun->machine->interrupt_handler_p)
++ {
++ /* Check HI/LO. */
++ if (mips_save_reg_p (LO_REGNUM) || mips_save_reg_p (HI_REGNUM))
++ {
++ frame->num_acc++;
++ frame->acc_mask |= (1 << 0);
++ }
++
++ /* Check accumulators 1, 2, 3. */
++ for (i = DSP_ACC_REG_FIRST; i <= DSP_ACC_REG_LAST; i += 2)
++ if (mips_save_reg_p (i) || mips_save_reg_p (i + 1))
++ {
++ frame->num_acc++;
++ frame->acc_mask |= 1 << (((i - DSP_ACC_REG_FIRST) / 2) + 1);
++ }
++
++ /* All interrupt context functions need space to preserve STATUS. */
++ frame->num_cop0_regs++;
++
++ /* If we don't keep interrupts masked, we need to save EPC. */
++ if (!cfun->machine->keep_interrupts_masked_p)
++ frame->num_cop0_regs++;
++ }
++
++ /* Move above the accumulator save area. */
++ if (frame->num_acc > 0)
++ {
++ /* Each accumulator needs 2 words. */
++ offset += frame->num_acc * 2 * UNITS_PER_WORD;
++ frame->acc_sp_offset = offset - UNITS_PER_WORD;
++ }
++
++ /* Move above the COP0 register save area. */
++ if (frame->num_cop0_regs > 0)
++ {
++ offset += frame->num_cop0_regs * UNITS_PER_WORD;
++ frame->cop0_sp_offset = offset - UNITS_PER_WORD;
++ }
++
+ /* Move above the callee-allocated varargs save area. */
+ offset += MIPS_STACK_ALIGN (cfun->machine->varargs_size);
+ frame->arg_pointer_offset = offset;
+@@ -8686,6 +8976,10 @@
+ frame->gp_save_offset = frame->gp_sp_offset - offset;
+ if (frame->fp_sp_offset > 0)
+ frame->fp_save_offset = frame->fp_sp_offset - offset;
++ if (frame->acc_sp_offset > 0)
++ frame->acc_save_offset = frame->acc_sp_offset - offset;
++ if (frame->num_cop0_regs > 0)
++ frame->cop0_save_offset = frame->cop0_sp_offset - offset;
+
+ /* MIPS16 code offsets the frame pointer by the size of the outgoing
+ arguments. This tends to increase the chances of using unextended
+@@ -8882,12 +9176,41 @@
+ fn (gen_rtx_REG (mode, regno), mem);
+ }
+
++/* Call FN for each accumlator that is saved by the current function.
++ SP_OFFSET is the offset of the current stack pointer from the start
++ of the frame. */
++
++static void
++mips_for_each_saved_acc (HOST_WIDE_INT sp_offset, mips_save_restore_fn fn)
++{
++ HOST_WIDE_INT offset;
++ int regno;
++
++ offset = cfun->machine->frame.acc_sp_offset - sp_offset;
++ if (BITSET_P (cfun->machine->frame.acc_mask, 0))
++ {
++ mips_save_restore_reg (word_mode, LO_REGNUM, offset, fn);
++ offset -= UNITS_PER_WORD;
++ mips_save_restore_reg (word_mode, HI_REGNUM, offset, fn);
++ offset -= UNITS_PER_WORD;
++ }
++
++ for (regno = DSP_ACC_REG_FIRST; regno <= DSP_ACC_REG_LAST; regno++)
++ if (BITSET_P (cfun->machine->frame.acc_mask,
++ ((regno - DSP_ACC_REG_FIRST) / 2) + 1))
++ {
++ mips_save_restore_reg (word_mode, regno, offset, fn);
++ offset -= UNITS_PER_WORD;
++ }
++}
++
+ /* Call FN for each register that is saved by the current function.
+ SP_OFFSET is the offset of the current stack pointer from the start
+ of the frame. */
+
+ static void
+-mips_for_each_saved_reg (HOST_WIDE_INT sp_offset, mips_save_restore_fn fn)
++mips_for_each_saved_gpr_and_fpr (HOST_WIDE_INT sp_offset,
++ mips_save_restore_fn fn)
+ {
+ enum machine_mode fpr_mode;
+ HOST_WIDE_INT offset;
+@@ -9075,13 +9398,24 @@
+ }
+ else
+ {
+- if (TARGET_MIPS16
+- && REGNO (reg) != GP_REG_FIRST + 31
+- && !M16_REG_P (REGNO (reg)))
+- {
+- /* Save a non-MIPS16 register by moving it through a temporary.
+- We don't need to do this for $31 since there's a special
+- instruction for it. */
++ if (REGNO (reg) == HI_REGNUM)
++ {
++ if (TARGET_64BIT)
++ emit_insn (gen_mfhidi_ti (MIPS_PROLOGUE_TEMP (DImode),
++ gen_rtx_REG (TImode, MD_REG_FIRST)));
++ else
++ emit_insn (gen_mfhisi_di (MIPS_PROLOGUE_TEMP (SImode),
++ gen_rtx_REG (DImode, MD_REG_FIRST)));
++ mips_emit_move (mem, MIPS_PROLOGUE_TEMP (GET_MODE (reg)));
++ }
++ else if ((TARGET_MIPS16
++ && REGNO (reg) != GP_REG_FIRST + 31
++ && !M16_REG_P (REGNO (reg)))
++ || ACC_REG_P (REGNO (reg)))
++ {
++ /* If the register has no direct store instruction, move it
++ through a temporary. Note that there's a special MIPS16
++ instruction to save $31. */
+ mips_emit_move (MIPS_PROLOGUE_TEMP (GET_MODE (reg)), reg);
+ mips_emit_move (mem, MIPS_PROLOGUE_TEMP (GET_MODE (reg)));
+ }
+@@ -9153,6 +9487,14 @@
+ emit_insn (gen_loadgp_blockage ());
+ }
+
++/* A for_each_rtx callback. Stop the search if *X is a kernel register. */
++
++static int
++mips_kernel_reg_p (rtx *x, void *data ATTRIBUTE_UNUSED)
++{
++ return GET_CODE (*x) == REG && KERNEL_REG_P (REGNO (*x));
++}
++
+ /* Expand the "prologue" pattern. */
+
+ void
+@@ -9172,7 +9514,8 @@
+ /* Save the registers. Allocate up to MIPS_MAX_FIRST_STACK_STEP
+ bytes beforehand; this is enough to cover the register save area
+ without going out of range. */
+- if ((frame->mask | frame->fmask) != 0)
++ if (((frame->mask | frame->fmask | frame->acc_mask) != 0)
++ || frame->num_cop0_regs > 0)
+ {
+ HOST_WIDE_INT step1;
+
+@@ -9203,12 +9546,97 @@
+ }
+ else
+ {
+- insn = gen_add3_insn (stack_pointer_rtx,
+- stack_pointer_rtx,
+- GEN_INT (-step1));
+- RTX_FRAME_RELATED_P (emit_insn (insn)) = 1;
+- size -= step1;
+- mips_for_each_saved_reg (size, mips_save_reg);
++ if (cfun->machine->interrupt_handler_p)
++ {
++ HOST_WIDE_INT offset;
++ rtx mem;
++
++ /* If this interrupt is using a shadow register set, we need to
++ get the stack pointer from the previous register set. */
++ if (cfun->machine->use_shadow_register_set_p)
++ emit_insn (gen_mips_rdpgpr (stack_pointer_rtx,
++ stack_pointer_rtx));
++
++ if (!cfun->machine->keep_interrupts_masked_p)
++ {
++ /* Move from COP0 Cause to K0. */
++ emit_insn (gen_cop0_move (gen_rtx_REG (SImode, K0_REG_NUM),
++ gen_rtx_REG (SImode,
++ COP0_CAUSE_REG_NUM)));
++ /* Move from COP0 EPC to K1. */
++ emit_insn (gen_cop0_move (gen_rtx_REG (SImode, K1_REG_NUM),
++ gen_rtx_REG (SImode,
++ COP0_EPC_REG_NUM)));
++ }
++
++ /* Allocate the first part of the frame. */
++ insn = gen_add3_insn (stack_pointer_rtx, stack_pointer_rtx,
++ GEN_INT (-step1));
++ RTX_FRAME_RELATED_P (emit_insn (insn)) = 1;
++ size -= step1;
++
++ /* Start at the uppermost location for saving. */
++ offset = frame->cop0_sp_offset - size;
++ if (!cfun->machine->keep_interrupts_masked_p)
++ {
++ /* Push EPC into its stack slot. */
++ mem = gen_frame_mem (word_mode,
++ plus_constant (stack_pointer_rtx,
++ offset));
++ mips_emit_move (mem, gen_rtx_REG (word_mode, K1_REG_NUM));
++ offset -= UNITS_PER_WORD;
++ }
++
++ /* Move from COP0 Status to K1. */
++ emit_insn (gen_cop0_move (gen_rtx_REG (SImode, K1_REG_NUM),
++ gen_rtx_REG (SImode,
++ COP0_STATUS_REG_NUM)));
++
++ /* Right justify the RIPL in k0. */
++ if (!cfun->machine->keep_interrupts_masked_p)
++ emit_insn (gen_lshrsi3 (gen_rtx_REG (SImode, K0_REG_NUM),
++ gen_rtx_REG (SImode, K0_REG_NUM),
++ GEN_INT (CAUSE_IPL)));
++
++ /* Push Status into its stack slot. */
++ mem = gen_frame_mem (word_mode,
++ plus_constant (stack_pointer_rtx, offset));
++ mips_emit_move (mem, gen_rtx_REG (word_mode, K1_REG_NUM));
++ offset -= UNITS_PER_WORD;
++
++ /* Insert the RIPL into our copy of SR (k1) as the new IPL. */
++ if (!cfun->machine->keep_interrupts_masked_p)
++ emit_insn (gen_insvsi (gen_rtx_REG (SImode, K1_REG_NUM),
++ GEN_INT (6),
++ GEN_INT (SR_IPL),
++ gen_rtx_REG (SImode, K0_REG_NUM)));
++
++ if (!cfun->machine->keep_interrupts_masked_p)
++ /* Enable interrupts by clearing the KSU ERL and EXL bits.
++ IE is already the correct value, so we don't have to do
++ anything explicit. */
++ emit_insn (gen_insvsi (gen_rtx_REG (SImode, K1_REG_NUM),
++ GEN_INT (4),
++ GEN_INT (SR_EXL),
++ gen_rtx_REG (SImode, GP_REG_FIRST)));
++ else
++ /* Disable interrupts by clearing the KSU, ERL, EXL,
++ and IE bits. */
++ emit_insn (gen_insvsi (gen_rtx_REG (SImode, K1_REG_NUM),
++ GEN_INT (5),
++ GEN_INT (SR_IE),
++ gen_rtx_REG (SImode, GP_REG_FIRST)));
++ }
++ else
++ {
++ insn = gen_add3_insn (stack_pointer_rtx,
++ stack_pointer_rtx,
++ GEN_INT (-step1));
++ RTX_FRAME_RELATED_P (emit_insn (insn)) = 1;
++ size -= step1;
++ }
++ mips_for_each_saved_acc (size, mips_save_reg);
++ mips_for_each_saved_gpr_and_fpr (size, mips_save_reg);
+ }
+ }
+
+@@ -9293,6 +9721,20 @@
+ pic_offset_table_rtx);
+ }
+
++ /* We need to search back to the last use of K0 or K1. */
++ if (cfun->machine->interrupt_handler_p)
++ {
++ for (insn = get_last_insn (); insn != NULL_RTX; insn = PREV_INSN (insn))
++ if (INSN_P (insn)
++ && for_each_rtx (&PATTERN (insn), mips_kernel_reg_p, NULL))
++ break;
++ /* Emit a move from K1 to COP0 Status after insn. */
++ gcc_assert (insn != NULL_RTX);
++ emit_insn_after (gen_cop0_move (gen_rtx_REG (SImode, COP0_STATUS_REG_NUM),
++ gen_rtx_REG (SImode, K1_REG_NUM)),
++ insn);
++ }
++
+ /* If we are profiling, make sure no instructions are scheduled before
+ the call to mcount. */
+ if (crtl->profile)
+@@ -9309,7 +9751,20 @@
+ if (TARGET_MIPS16 && REGNO (reg) == GP_REG_FIRST + 31)
+ reg = gen_rtx_REG (GET_MODE (reg), GP_REG_FIRST + 7);
+
+- if (TARGET_MIPS16 && !M16_REG_P (REGNO (reg)))
++ if (REGNO (reg) == HI_REGNUM)
++ {
++ mips_emit_move (MIPS_EPILOGUE_TEMP (GET_MODE (reg)), mem);
++ if (TARGET_64BIT)
++ emit_insn (gen_mthisi_di (gen_rtx_REG (TImode, MD_REG_FIRST),
++ MIPS_EPILOGUE_TEMP (DImode),
++ gen_rtx_REG (DImode, LO_REGNUM)));
++ else
++ emit_insn (gen_mthisi_di (gen_rtx_REG (DImode, MD_REG_FIRST),
++ MIPS_EPILOGUE_TEMP (SImode),
++ gen_rtx_REG (SImode, LO_REGNUM)));
++ }
++ else if ((TARGET_MIPS16 && !M16_REG_P (REGNO (reg)))
++ || ACC_REG_P (REGNO (reg)))
+ {
+ /* Can't restore directly; move through a temporary. */
+ mips_emit_move (MIPS_EPILOGUE_TEMP (GET_MODE (reg)), mem);
+@@ -9345,7 +9800,7 @@
+ {
+ const struct mips_frame_info *frame;
+ HOST_WIDE_INT step1, step2;
+- rtx base, target;
++ rtx base, target, insn;
+
+ if (!sibcall_p && mips_can_use_return_insn ())
+ {
+@@ -9378,7 +9833,8 @@
+
+ /* If we need to restore registers, deallocate as much stack as
+ possible in the second step without going out of range. */
+- if ((frame->mask | frame->fmask) != 0)
++ if ((frame->mask | frame->fmask | frame->acc_mask) != 0
++ || frame->num_cop0_regs > 0)
+ {
+ step2 = MIN (step1, MIPS_MAX_FIRST_STACK_STEP);
+ step1 -= step2;
+@@ -9440,13 +9896,53 @@
+ else
+ {
+ /* Restore the registers. */
+- mips_for_each_saved_reg (frame->total_size - step2, mips_restore_reg);
++ mips_for_each_saved_acc (frame->total_size - step2, mips_restore_reg);
++ mips_for_each_saved_gpr_and_fpr (frame->total_size - step2,
++ mips_restore_reg);
+
+- /* Deallocate the final bit of the frame. */
+- if (step2 > 0)
+- emit_insn (gen_add3_insn (stack_pointer_rtx,
+- stack_pointer_rtx,
+- GEN_INT (step2)));
++ if (cfun->machine->interrupt_handler_p)
++ {
++ HOST_WIDE_INT offset;
++ rtx mem;
++
++ offset = frame->cop0_sp_offset - (frame->total_size - step2);
++ if (!cfun->machine->keep_interrupts_masked_p)
++ {
++ /* Restore the original EPC. */
++ mem = gen_frame_mem (word_mode,
++ plus_constant (stack_pointer_rtx, offset));
++ mips_emit_move (gen_rtx_REG (word_mode, K0_REG_NUM), mem);
++ offset -= UNITS_PER_WORD;
++
++ /* Move to COP0 EPC. */
++ emit_insn (gen_cop0_move (gen_rtx_REG (SImode, COP0_EPC_REG_NUM),
++ gen_rtx_REG (SImode, K0_REG_NUM)));
++ }
++
++ /* Restore the original Status. */
++ mem = gen_frame_mem (word_mode,
++ plus_constant (stack_pointer_rtx, offset));
++ mips_emit_move (gen_rtx_REG (word_mode, K0_REG_NUM), mem);
++ offset -= UNITS_PER_WORD;
++
++ /* If we don't use shoadow register set, we need to update SP. */
++ if (!cfun->machine->use_shadow_register_set_p && step2 > 0)
++ emit_insn (gen_add3_insn (stack_pointer_rtx,
++ stack_pointer_rtx,
++ GEN_INT (step2)));
++
++ /* Move to COP0 Status. */
++ emit_insn (gen_cop0_move (gen_rtx_REG (SImode, COP0_STATUS_REG_NUM),
++ gen_rtx_REG (SImode, K0_REG_NUM)));
++ }
++ else
++ {
++ /* Deallocate the final bit of the frame. */
++ if (step2 > 0)
++ emit_insn (gen_add3_insn (stack_pointer_rtx,
++ stack_pointer_rtx,
++ GEN_INT (step2)));
++ }
+ }
+
+ /* Add in the __builtin_eh_return stack adjustment. We need to
+@@ -9469,18 +9965,44 @@
+
+ if (!sibcall_p)
+ {
+- unsigned int regno;
+-
+- /* When generating MIPS16 code, the normal mips_for_each_saved_reg
+- path will restore the return address into $7 rather than $31. */
+- if (TARGET_MIPS16
+- && !GENERATE_MIPS16E_SAVE_RESTORE
+- && BITSET_P (frame->mask, 31))
+- regno = GP_REG_FIRST + 7;
+- else
+- regno = GP_REG_FIRST + 31;
+ mips_expand_before_return ();
+- emit_jump_insn (gen_return_internal (gen_rtx_REG (Pmode, regno)));
++ if (cfun->machine->interrupt_handler_p)
++ {
++ /* Interrupt handlers generate eret or deret. */
++ if (cfun->machine->use_debug_exception_return_p)
++ emit_jump_insn (gen_mips_deret ());
++ else
++ emit_jump_insn (gen_mips_eret ());
++ }
++ else
++ {
++ unsigned int regno;
++
++ /* When generating MIPS16 code, the normal
++ mips_for_each_saved_gpr_and_fpr path will restore the return
++ address into $7 rather than $31. */
++ if (TARGET_MIPS16
++ && !GENERATE_MIPS16E_SAVE_RESTORE
++ && BITSET_P (frame->mask, 31))
++ regno = GP_REG_FIRST + 7;
++ else
++ regno = GP_REG_FIRST + 31;
++ emit_jump_insn (gen_return_internal (gen_rtx_REG (Pmode, regno)));
++ }
++ }
++
++ /* Search from the beginning to the first use of K0 or K1. */
++ if (cfun->machine->interrupt_handler_p
++ && !cfun->machine->keep_interrupts_masked_p)
++ {
++ for (insn = get_insns (); insn != NULL_RTX; insn = NEXT_INSN (insn))
++ if (INSN_P (insn)
++ && for_each_rtx (&PATTERN(insn), mips_kernel_reg_p, NULL))
++ break;
++ gcc_assert (insn != NULL_RTX);
++ /* Insert disable interrupts before the first use of K0 or K1. */
++ emit_insn_before (gen_mips_di (), insn);
++ emit_insn_before (gen_mips_ehb (), insn);
+ }
+ }
+
+@@ -9491,6 +10013,10 @@
+ bool
+ mips_can_use_return_insn (void)
+ {
++ /* Interrupt handlers need to go through the epilogue. */
++ if (cfun->machine->interrupt_handler_p)
++ return false;
++
+ if (!reload_completed)
+ return false;
+
+@@ -10422,10 +10948,15 @@
+ s = "bnez\t%2,1f\n\tbreak\t7\n1:";
+ }
+ else if (GENERATE_DIVIDE_TRAPS)
+- {
+- output_asm_insn (s, operands);
+- s = "teq\t%2,%.,7";
+- }
++ {
++ if (TUNE_74K)
++ output_asm_insn ("teq\t%2,%.,7", operands);
++ else
++ {
++ output_asm_insn (s, operands);
++ s = "teq\t%2,%.,7";
++ }
++ }
+ else
+ {
+ output_asm_insn ("%(bne\t%2,%.,1f", operands);
+@@ -10737,7 +11268,17 @@
+ ready[pos2] = temp;
+ }
+ }
+-
++
++int
++mips_mult_madd_chain_bypass_p (rtx out_insn ATTRIBUTE_UNUSED,
++ rtx in_insn ATTRIBUTE_UNUSED)
++{
++ if (reload_completed)
++ return false;
++ else
++ return true;
++}
++
+ /* Used by TUNE_MACC_CHAINS to record the last scheduled instruction
+ that may clobber hi or lo. */
+ static rtx mips_macc_chains_last_hilo;
+@@ -13910,6 +14451,14 @@
+ long as any indirect jumps use $25. */
+ flag_pic = 1;
+
++ /* For SDE, switch on ABICALLS mode if -fpic or -fpie were used, and the
++ user hasn't explicitly disabled these modes. */
++ if (TARGET_MIPS_SDE
++ && (flag_pic || flag_pie) && !TARGET_ABICALLS
++ && !((target_flags_explicit & MASK_ABICALLS))
++ && mips_abi != ABI_EABI)
++ target_flags |= MASK_ABICALLS;
++
+ /* -mvr4130-align is a "speed over size" optimization: it usually produces
+ faster code, but at the expense of more nops. Enable it at -O3 and
+ above. */
+@@ -13984,26 +14533,46 @@
+ if (TARGET_DSPR2)
+ target_flags |= MASK_DSP;
+
+- /* .eh_frame addresses should be the same width as a C pointer.
+- Most MIPS ABIs support only one pointer size, so the assembler
+- will usually know exactly how big an .eh_frame address is.
+-
+- Unfortunately, this is not true of the 64-bit EABI. The ABI was
+- originally defined to use 64-bit pointers (i.e. it is LP64), and
+- this is still the default mode. However, we also support an n32-like
+- ILP32 mode, which is selected by -mlong32. The problem is that the
+- assembler has traditionally not had an -mlong option, so it has
+- traditionally not known whether we're using the ILP32 or LP64 form.
+-
+- As it happens, gas versions up to and including 2.19 use _32-bit_
+- addresses for EABI64 .cfi_* directives. This is wrong for the
+- default LP64 mode, so we can't use the directives by default.
+- Moreover, since gas's current behavior is at odds with gcc's
+- default behavior, it seems unwise to rely on future versions
+- of gas behaving the same way. We therefore avoid using .cfi
+- directives for -mlong32 as well. */
+- if (mips_abi == ABI_EABI && TARGET_64BIT)
+- flag_dwarf2_cfi_asm = 0;
++ /* Use the traditional method of generating .eh_frames.
++ We need this for two reasons:
++
++ - .eh_frame addresses should be the same width as a C pointer.
++ Most MIPS ABIs support only one pointer size, so the assembler
++ will usually know exactly how big an .eh_frame address is.
++
++ Unfortunately, this is not true of the 64-bit EABI. The ABI was
++ originally defined to use 64-bit pointers (i.e. it is LP64), and
++ this is still the default mode. However, we also support an n32-like
++ ILP32 mode, which is selected by -mlong32. The problem is that the
++ assembler has traditionally not had an -mlong option, so it has
++ traditionally not known whether we're using the ILP32 or LP64 form.
++
++ As it happens, gas versions up to and including 2.19 use _32-bit_
++ addresses for EABI64 .cfi_* directives. This is wrong for the
++ default LP64 mode, so we can't use the directives by default.
++ Moreover, since gas's current behavior is at odds with gcc's
++ default behavior, it seems unwise to rely on future versions
++ of gas behaving the same way. We therefore avoid using .cfi
++ directives for -mlong32 as well.
++
++ - .cfi* directives generate read-only .eh_frame sections.
++ However, MIPS has traditionally not allowed directives like:
++
++ .long x-.
++
++ in cases where "x" is in a different section, or is not defined
++ in the same assembly file. We have therefore traditionally
++ used absolute addresses and a writable .eh_frame instead.
++
++ The linker is able to convert most of these absolute addresses
++ into PC-relative form where doing so is necessary to avoid
++ relocations. However, until 2.21, it wasn't able to do this
++ for indirect encodings or personality routines.
++
++ GNU ld 2.21 and GCC 4.5 have support for read-only .eh_frames,
++ but for the time being, we should stick to the approach used
++ in 4.3 and earlier. */
++ flag_dwarf2_cfi_asm = 0;
+
+ mips_init_print_operand_punct ();
+
+@@ -14242,6 +14811,178 @@
+ reg_alloc_order[24] = 0;
+ }
+ }
++
++/* Implement EPILOGUE_USES. */
++
++bool
++mips_epilogue_uses (unsigned int regno)
++{
++ /* Say that the epilogue uses the return address register. Note that
++ in the case of sibcalls, the values "used by the epilogue" are
++ considered live at the start of the called function. */
++ if (regno == 31)
++ return true;
++
++ /* If using a GOT, say that the epilogue also uses GOT_VERSION_REGNUM.
++ See the comment above load_call<mode> for details. */
++ if (TARGET_USE_GOT && (regno) == GOT_VERSION_REGNUM)
++ return true;
++
++ /* An interrupt handler must preserve some registers that are
++ ordinarily call-clobbered. */
++ if (cfun->machine->interrupt_handler_p
++ && mips_interrupt_extra_call_saved_reg_p (regno))
++ return true;
++
++ return false;
++}
++
++#ifdef CVMX_SHARED_BSS_FLAGS
++/* Handle a "cvmx_shared" attribute; arguments as in
++ struct attribute_spec.handler. */
++
++static tree
++octeon_handle_cvmx_shared_attribute (tree *node, tree name,
++ tree args ATTRIBUTE_UNUSED,
++ int flags ATTRIBUTE_UNUSED,
++ bool *no_add_attrs)
++{
++ if (TREE_CODE (*node) != VAR_DECL)
++ {
++ warning (OPT_Wattributes, "%qs attribute only applies to variables",
++ IDENTIFIER_POINTER (name));
++ *no_add_attrs = true;
++ }
++
++ return NULL_TREE;
++}
++
++/* Switch to the appropriate section for output of DECL.
++ DECL is either a `VAR_DECL' node or a constant of some sort.
++ RELOC indicates whether forming the initial value of DECL requires
++ link-time relocations. */
++
++static section *
++octeon_select_section (tree decl, int reloc, unsigned HOST_WIDE_INT align)
++{
++ if (decl && TREE_CODE (decl) == VAR_DECL
++ && lookup_attribute ("cvmx_shared", DECL_ATTRIBUTES (decl)))
++ {
++ const char *sname = NULL;
++ unsigned int flags = SECTION_WRITE;
++
++ switch (categorize_decl_for_section (decl, reloc))
++ {
++ case SECCAT_DATA:
++ case SECCAT_SDATA:
++ case SECCAT_RODATA:
++ case SECCAT_SRODATA:
++ case SECCAT_RODATA_MERGE_STR:
++ case SECCAT_RODATA_MERGE_STR_INIT:
++ case SECCAT_RODATA_MERGE_CONST:
++ case SECCAT_DATA_REL:
++ case SECCAT_DATA_REL_LOCAL:
++ case SECCAT_DATA_REL_RO:
++ case SECCAT_DATA_REL_RO_LOCAL:
++ sname = ".cvmx_shared";
++ break;
++ case SECCAT_BSS:
++ case SECCAT_SBSS:
++ sname = ".cvmx_shared_bss";
++ flags |= SECTION_BSS;
++ break;
++ case SECCAT_TEXT:
++ case SECCAT_TDATA:
++ case SECCAT_TBSS:
++ break;
++ }
++ if (sname)
++ {
++ return get_section (sname, flags, decl);
++ }
++ }
++ return default_elf_select_section (decl, reloc, align);
++}
++
++/* Build up a unique section name, expressed as a
++ STRING_CST node, and assign it to DECL_SECTION_NAME (decl).
++ RELOC indicates whether the initial value of EXP requires
++ link-time relocations. */
++
++static void
++octeon_unique_section (tree decl, int reloc)
++{
++ if (decl && TREE_CODE (decl) == VAR_DECL
++ && lookup_attribute ("cvmx_shared", DECL_ATTRIBUTES (decl)))
++ {
++ const char *sname = NULL;
++
++ if (! DECL_ONE_ONLY (decl))
++ {
++ section *sect;
++ sect = octeon_select_section (decl, reloc, DECL_ALIGN (decl));
++ DECL_SECTION_NAME (decl) = build_string (strlen (sect->named.name),
++ sect->named.name);
++ return;
++ }
++
++ switch (categorize_decl_for_section (decl, reloc))
++ {
++ case SECCAT_BSS:
++ case SECCAT_SBSS:
++ sname = ".cvmx_shared_bss.linkonce.";
++ break;
++ case SECCAT_SDATA:
++ case SECCAT_DATA:
++ case SECCAT_DATA_REL:
++ case SECCAT_DATA_REL_LOCAL:
++ case SECCAT_DATA_REL_RO:
++ case SECCAT_DATA_REL_RO_LOCAL:
++ case SECCAT_RODATA:
++ case SECCAT_SRODATA:
++ case SECCAT_RODATA_MERGE_STR:
++ case SECCAT_RODATA_MERGE_STR_INIT:
++ case SECCAT_RODATA_MERGE_CONST:
++ sname = ".cvmx_shared.linkonce.";
++ break;
++ case SECCAT_TEXT:
++ case SECCAT_TDATA:
++ case SECCAT_TBSS:
++ break;
++ }
++ if (sname)
++ {
++ const char *name;
++ size_t plen, nlen;
++ char *string;
++ plen = strlen (sname);
++
++ name = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl));
++ name = targetm.strip_name_encoding (name);
++ nlen = strlen (name);
++
++ string = alloca (plen + nlen + 1);
++ memcpy (string, sname, plen);
++ memcpy (string + plen, name, nlen + 1);
++ DECL_SECTION_NAME (decl) = build_string (nlen + plen, string);
++ return;
++ }
++ }
++ default_unique_section (decl, reloc);
++}
++
++/* Emit an uninitialized cvmx_shared variable. */
++void
++octeon_output_shared_variable (FILE *stream, tree decl, const char *name,
++ unsigned HOST_WIDE_INT size, int align)
++{
++ switch_to_section (get_section (".cvmx_shared_bss", CVMX_SHARED_BSS_FLAGS,
++ NULL_TREE));
++ ASM_OUTPUT_ALIGN (stream, floor_log2 (align / BITS_PER_UNIT));
++ ASM_DECLARE_OBJECT_NAME (stream, name, decl);
++ ASM_OUTPUT_SKIP (stream, size != 0 ? size : 1);
++}
++#endif
+
+ /* Initialize the GCC target structure. */
+ #undef TARGET_ASM_ALIGNED_HI_OP
+diff -Nur a/gcc/config/mips/mips-dsp.md b/gcc/config/mips/mips-dsp.md
+--- a/gcc/config/mips/mips-dsp.md 2008-12-21 22:43:51.000000000 +0100
++++ b/gcc/config/mips/mips-dsp.md 2010-01-25 09:50:29.025687257 +0100
+@@ -42,9 +42,9 @@
+ (match_operand:DSPV 2 "register_operand" "d")))
+ (set (reg:CCDSP CCDSP_OU_REGNUM)
+ (unspec:CCDSP [(match_dup 1) (match_dup 2)] UNSPEC_ADDQ))])]
+- ""
++ "ISA_HAS_DSP"
+ "add<DSPV:dspfmt1>.<DSPV:dspfmt2>\t%0,%1,%2"
+- [(set_attr "type" "arith")
++ [(set_attr "type" "dspalu")
+ (set_attr "mode" "SI")])
+
+ (define_insn "mips_add<DSP:dspfmt1>_s_<DSP:dspfmt2>"
+@@ -55,9 +55,9 @@
+ UNSPEC_ADDQ_S))
+ (set (reg:CCDSP CCDSP_OU_REGNUM)
+ (unspec:CCDSP [(match_dup 1) (match_dup 2)] UNSPEC_ADDQ_S))])]
+- ""
++ "ISA_HAS_DSP"
+ "add<DSP:dspfmt1>_s.<DSP:dspfmt2>\t%0,%1,%2"
+- [(set_attr "type" "arith")
++ [(set_attr "type" "dspalusat")
+ (set_attr "mode" "SI")])
+
+ ;; SUBQ*
+@@ -70,7 +70,7 @@
+ (unspec:CCDSP [(match_dup 1) (match_dup 2)] UNSPEC_SUBQ))])]
+ "ISA_HAS_DSP"
+ "sub<DSPV:dspfmt1>.<DSPV:dspfmt2>\t%0,%1,%2"
+- [(set_attr "type" "arith")
++ [(set_attr "type" "dspalu")
+ (set_attr "mode" "SI")])
+
+ (define_insn "mips_sub<DSP:dspfmt1>_s_<DSP:dspfmt2>"
+@@ -83,7 +83,7 @@
+ (unspec:CCDSP [(match_dup 1) (match_dup 2)] UNSPEC_SUBQ_S))])]
+ "ISA_HAS_DSP"
+ "sub<DSP:dspfmt1>_s.<DSP:dspfmt2>\t%0,%1,%2"
+- [(set_attr "type" "arith")
++ [(set_attr "type" "dspalusat")
+ (set_attr "mode" "SI")])
+
+ ;; ADDSC
+@@ -97,7 +97,7 @@
+ (unspec:CCDSP [(match_dup 1) (match_dup 2)] UNSPEC_ADDSC))])]
+ "ISA_HAS_DSP"
+ "addsc\t%0,%1,%2"
+- [(set_attr "type" "arith")
++ [(set_attr "type" "dspalu")
+ (set_attr "mode" "SI")])
+
+ ;; ADDWC
+@@ -112,7 +112,7 @@
+ (unspec:CCDSP [(match_dup 1) (match_dup 2)] UNSPEC_ADDWC))])]
+ "ISA_HAS_DSP"
+ "addwc\t%0,%1,%2"
+- [(set_attr "type" "arith")
++ [(set_attr "type" "dspalu")
+ (set_attr "mode" "SI")])
+
+ ;; MODSUB
+@@ -123,7 +123,7 @@
+ UNSPEC_MODSUB))]
+ "ISA_HAS_DSP"
+ "modsub\t%0,%1,%2"
+- [(set_attr "type" "arith")
++ [(set_attr "type" "dspalu")
+ (set_attr "mode" "SI")])
+
+ ;; RADDU*
+@@ -133,7 +133,7 @@
+ UNSPEC_RADDU_W_QB))]
+ "ISA_HAS_DSP"
+ "raddu.w.qb\t%0,%1"
+- [(set_attr "type" "arith")
++ [(set_attr "type" "dspalu")
+ (set_attr "mode" "SI")])
+
+ ;; ABSQ*
+@@ -146,7 +146,7 @@
+ (unspec:CCDSP [(match_dup 1)] UNSPEC_ABSQ_S))])]
+ "ISA_HAS_DSP"
+ "absq_s.<DSPQ:dspfmt2>\t%0,%1"
+- [(set_attr "type" "arith")
++ [(set_attr "type" "dspalusat")
+ (set_attr "mode" "SI")])
+
+ ;; PRECRQ*
+@@ -157,7 +157,7 @@
+ UNSPEC_PRECRQ_QB_PH))]
+ "ISA_HAS_DSP"
+ "precrq.qb.ph\t%0,%1,%2"
+- [(set_attr "type" "arith")
++ [(set_attr "type" "dspalu")
+ (set_attr "mode" "SI")])
+
+ (define_insn "mips_precrq_ph_w"
+@@ -167,7 +167,7 @@
+ UNSPEC_PRECRQ_PH_W))]
+ "ISA_HAS_DSP"
+ "precrq.ph.w\t%0,%1,%2"
+- [(set_attr "type" "arith")
++ [(set_attr "type" "dspalu")
+ (set_attr "mode" "SI")])
+
+ (define_insn "mips_precrq_rs_ph_w"
+@@ -181,7 +181,7 @@
+ UNSPEC_PRECRQ_RS_PH_W))])]
+ "ISA_HAS_DSP"
+ "precrq_rs.ph.w\t%0,%1,%2"
+- [(set_attr "type" "arith")
++ [(set_attr "type" "dspalu")
+ (set_attr "mode" "SI")])
+
+ ;; PRECRQU*
+@@ -196,7 +196,7 @@
+ UNSPEC_PRECRQU_S_QB_PH))])]
+ "ISA_HAS_DSP"
+ "precrqu_s.qb.ph\t%0,%1,%2"
+- [(set_attr "type" "arith")
++ [(set_attr "type" "dspalusat")
+ (set_attr "mode" "SI")])
+
+ ;; PRECEQ*
+@@ -206,7 +206,7 @@
+ UNSPEC_PRECEQ_W_PHL))]
+ "ISA_HAS_DSP"
+ "preceq.w.phl\t%0,%1"
+- [(set_attr "type" "arith")
++ [(set_attr "type" "dspalu")
+ (set_attr "mode" "SI")])
+
+ (define_insn "mips_preceq_w_phr"
+@@ -215,7 +215,7 @@
+ UNSPEC_PRECEQ_W_PHR))]
+ "ISA_HAS_DSP"
+ "preceq.w.phr\t%0,%1"
+- [(set_attr "type" "arith")
++ [(set_attr "type" "dspalu")
+ (set_attr "mode" "SI")])
+
+ ;; PRECEQU*
+@@ -225,7 +225,7 @@
+ UNSPEC_PRECEQU_PH_QBL))]
+ "ISA_HAS_DSP"
+ "precequ.ph.qbl\t%0,%1"
+- [(set_attr "type" "arith")
++ [(set_attr "type" "dspalu")
+ (set_attr "mode" "SI")])
+
+ (define_insn "mips_precequ_ph_qbr"
+@@ -234,7 +234,7 @@
+ UNSPEC_PRECEQU_PH_QBR))]
+ "ISA_HAS_DSP"
+ "precequ.ph.qbr\t%0,%1"
+- [(set_attr "type" "arith")
++ [(set_attr "type" "dspalu")
+ (set_attr "mode" "SI")])
+
+ (define_insn "mips_precequ_ph_qbla"
+@@ -243,7 +243,7 @@
+ UNSPEC_PRECEQU_PH_QBLA))]
+ "ISA_HAS_DSP"
+ "precequ.ph.qbla\t%0,%1"
+- [(set_attr "type" "arith")
++ [(set_attr "type" "dspalu")
+ (set_attr "mode" "SI")])
+
+ (define_insn "mips_precequ_ph_qbra"
+@@ -252,7 +252,7 @@
+ UNSPEC_PRECEQU_PH_QBRA))]
+ "ISA_HAS_DSP"
+ "precequ.ph.qbra\t%0,%1"
+- [(set_attr "type" "arith")
++ [(set_attr "type" "dspalu")
+ (set_attr "mode" "SI")])
+
+ ;; PRECEU*
+@@ -262,7 +262,7 @@
+ UNSPEC_PRECEU_PH_QBL))]
+ "ISA_HAS_DSP"
+ "preceu.ph.qbl\t%0,%1"
+- [(set_attr "type" "arith")
++ [(set_attr "type" "dspalu")
+ (set_attr "mode" "SI")])
+
+ (define_insn "mips_preceu_ph_qbr"
+@@ -271,7 +271,7 @@
+ UNSPEC_PRECEU_PH_QBR))]
+ "ISA_HAS_DSP"
+ "preceu.ph.qbr\t%0,%1"
+- [(set_attr "type" "arith")
++ [(set_attr "type" "dspalu")
+ (set_attr "mode" "SI")])
+
+ (define_insn "mips_preceu_ph_qbla"
+@@ -280,7 +280,7 @@
+ UNSPEC_PRECEU_PH_QBLA))]
+ "ISA_HAS_DSP"
+ "preceu.ph.qbla\t%0,%1"
+- [(set_attr "type" "arith")
++ [(set_attr "type" "dspalu")
+ (set_attr "mode" "SI")])
+
+ (define_insn "mips_preceu_ph_qbra"
+@@ -289,7 +289,7 @@
+ UNSPEC_PRECEU_PH_QBRA))]
+ "ISA_HAS_DSP"
+ "preceu.ph.qbra\t%0,%1"
+- [(set_attr "type" "arith")
++ [(set_attr "type" "dspalu")
+ (set_attr "mode" "SI")])
+
+ ;; Table 2-2. MIPS DSP ASE Instructions: Shift
+@@ -313,7 +313,7 @@
+ }
+ return "shllv.<DSPV:dspfmt2>\t%0,%1,%2";
+ }
+- [(set_attr "type" "shift")
++ [(set_attr "type" "dspalu")
+ (set_attr "mode" "SI")])
+
+ (define_insn "mips_shll_s_<DSPQ:dspfmt2>"
+@@ -335,7 +335,7 @@
+ }
+ return "shllv_s.<DSPQ:dspfmt2>\t%0,%1,%2";
+ }
+- [(set_attr "type" "shift")
++ [(set_attr "type" "dspalusat")
+ (set_attr "mode" "SI")])
+
+ ;; SHRL*
+@@ -354,7 +354,7 @@
+ }
+ return "shrlv.qb\t%0,%1,%2";
+ }
+- [(set_attr "type" "shift")
++ [(set_attr "type" "dspalu")
+ (set_attr "mode" "SI")])
+
+ ;; SHRA*
+@@ -373,7 +373,7 @@
+ }
+ return "shrav.ph\t%0,%1,%2";
+ }
+- [(set_attr "type" "shift")
++ [(set_attr "type" "dspalu")
+ (set_attr "mode" "SI")])
+
+ (define_insn "mips_shra_r_<DSPQ:dspfmt2>"
+@@ -392,7 +392,7 @@
+ }
+ return "shrav_r.<DSPQ:dspfmt2>\t%0,%1,%2";
+ }
+- [(set_attr "type" "shift")
++ [(set_attr "type" "dspalu")
+ (set_attr "mode" "SI")])
+
+ ;; Table 2-3. MIPS DSP ASE Instructions: Multiply
+@@ -478,7 +478,7 @@
+ UNSPEC_DPAU_H_QBL))]
+ "ISA_HAS_DSP && !TARGET_64BIT"
+ "dpau.h.qbl\t%q0,%2,%3"
+- [(set_attr "type" "imadd")
++ [(set_attr "type" "dspmac")
+ (set_attr "mode" "SI")])
+
+ (define_insn "mips_dpau_h_qbr"
+@@ -489,7 +489,7 @@
+ UNSPEC_DPAU_H_QBR))]
+ "ISA_HAS_DSP && !TARGET_64BIT"
+ "dpau.h.qbr\t%q0,%2,%3"
+- [(set_attr "type" "imadd")
++ [(set_attr "type" "dspmac")
+ (set_attr "mode" "SI")])
+
+ ;; DPSU*
+@@ -501,7 +501,7 @@
+ UNSPEC_DPSU_H_QBL))]
+ "ISA_HAS_DSP && !TARGET_64BIT"
+ "dpsu.h.qbl\t%q0,%2,%3"
+- [(set_attr "type" "imadd")
++ [(set_attr "type" "dspmac")
+ (set_attr "mode" "SI")])
+
+ (define_insn "mips_dpsu_h_qbr"
+@@ -512,7 +512,7 @@
+ UNSPEC_DPSU_H_QBR))]
+ "ISA_HAS_DSP && !TARGET_64BIT"
+ "dpsu.h.qbr\t%q0,%2,%3"
+- [(set_attr "type" "imadd")
++ [(set_attr "type" "dspmac")
+ (set_attr "mode" "SI")])
+
+ ;; DPAQ*
+@@ -528,7 +528,7 @@
+ UNSPEC_DPAQ_S_W_PH))])]
+ "ISA_HAS_DSP && !TARGET_64BIT"
+ "dpaq_s.w.ph\t%q0,%2,%3"
+- [(set_attr "type" "imadd")
++ [(set_attr "type" "dspmac")
+ (set_attr "mode" "SI")])
+
+ ;; DPSQ*
+@@ -544,7 +544,7 @@
+ UNSPEC_DPSQ_S_W_PH))])]
+ "ISA_HAS_DSP && !TARGET_64BIT"
+ "dpsq_s.w.ph\t%q0,%2,%3"
+- [(set_attr "type" "imadd")
++ [(set_attr "type" "dspmac")
+ (set_attr "mode" "SI")])
+
+ ;; MULSAQ*
+@@ -560,7 +560,7 @@
+ UNSPEC_MULSAQ_S_W_PH))])]
+ "ISA_HAS_DSP && !TARGET_64BIT"
+ "mulsaq_s.w.ph\t%q0,%2,%3"
+- [(set_attr "type" "imadd")
++ [(set_attr "type" "dspmac")
+ (set_attr "mode" "SI")])
+
+ ;; DPAQ*
+@@ -576,7 +576,7 @@
+ UNSPEC_DPAQ_SA_L_W))])]
+ "ISA_HAS_DSP && !TARGET_64BIT"
+ "dpaq_sa.l.w\t%q0,%2,%3"
+- [(set_attr "type" "imadd")
++ [(set_attr "type" "dspmacsat")
+ (set_attr "mode" "SI")])
+
+ ;; DPSQ*
+@@ -592,7 +592,7 @@
+ UNSPEC_DPSQ_SA_L_W))])]
+ "ISA_HAS_DSP && !TARGET_64BIT"
+ "dpsq_sa.l.w\t%q0,%2,%3"
+- [(set_attr "type" "imadd")
++ [(set_attr "type" "dspmacsat")
+ (set_attr "mode" "SI")])
+
+ ;; MAQ*
+@@ -608,7 +608,7 @@
+ UNSPEC_MAQ_S_W_PHL))])]
+ "ISA_HAS_DSP && !TARGET_64BIT"
+ "maq_s.w.phl\t%q0,%2,%3"
+- [(set_attr "type" "imadd")
++ [(set_attr "type" "dspmac")
+ (set_attr "mode" "SI")])
+
+ (define_insn "mips_maq_s_w_phr"
+@@ -623,7 +623,7 @@
+ UNSPEC_MAQ_S_W_PHR))])]
+ "ISA_HAS_DSP && !TARGET_64BIT"
+ "maq_s.w.phr\t%q0,%2,%3"
+- [(set_attr "type" "imadd")
++ [(set_attr "type" "dspmac")
+ (set_attr "mode" "SI")])
+
+ ;; MAQ_SA*
+@@ -639,7 +639,7 @@
+ UNSPEC_MAQ_SA_W_PHL))])]
+ "ISA_HAS_DSP && !TARGET_64BIT"
+ "maq_sa.w.phl\t%q0,%2,%3"
+- [(set_attr "type" "imadd")
++ [(set_attr "type" "dspmacsat")
+ (set_attr "mode" "SI")])
+
+ (define_insn "mips_maq_sa_w_phr"
+@@ -654,7 +654,7 @@
+ UNSPEC_MAQ_SA_W_PHR))])]
+ "ISA_HAS_DSP && !TARGET_64BIT"
+ "maq_sa.w.phr\t%q0,%2,%3"
+- [(set_attr "type" "imadd")
++ [(set_attr "type" "dspmacsat")
+ (set_attr "mode" "SI")])
+
+ ;; Table 2-4. MIPS DSP ASE Instructions: General Bit/Manipulation
+@@ -665,7 +665,7 @@
+ UNSPEC_BITREV))]
+ "ISA_HAS_DSP"
+ "bitrev\t%0,%1"
+- [(set_attr "type" "arith")
++ [(set_attr "type" "dspalu")
+ (set_attr "mode" "SI")])
+
+ ;; INSV
+@@ -678,7 +678,7 @@
+ UNSPEC_INSV))]
+ "ISA_HAS_DSP"
+ "insv\t%0,%2"
+- [(set_attr "type" "arith")
++ [(set_attr "type" "dspalu")
+ (set_attr "mode" "SI")])
+
+ ;; REPL*
+@@ -696,7 +696,7 @@
+ }
+ return "replv.qb\t%0,%1";
+ }
+- [(set_attr "type" "arith")
++ [(set_attr "type" "dspalu")
+ (set_attr "mode" "SI")])
+
+ (define_insn "mips_repl_ph"
+@@ -707,7 +707,7 @@
+ "@
+ repl.ph\t%0,%1
+ replv.ph\t%0,%1"
+- [(set_attr "type" "arith")
++ [(set_attr "type" "dspalu")
+ (set_attr "mode" "SI")])
+
+ ;; Table 2-5. MIPS DSP ASE Instructions: Compare-Pick
+@@ -720,7 +720,7 @@
+ UNSPEC_CMP_EQ))]
+ "ISA_HAS_DSP"
+ "cmp<DSPV:dspfmt1_1>.eq.<DSPV:dspfmt2>\t%0,%1"
+- [(set_attr "type" "arith")
++ [(set_attr "type" "dspalu")
+ (set_attr "mode" "SI")])
+
+ (define_insn "mips_cmp<DSPV:dspfmt1_1>_lt_<DSPV:dspfmt2>"
+@@ -731,7 +731,7 @@
+ UNSPEC_CMP_LT))]
+ "ISA_HAS_DSP"
+ "cmp<DSPV:dspfmt1_1>.lt.<DSPV:dspfmt2>\t%0,%1"
+- [(set_attr "type" "arith")
++ [(set_attr "type" "dspalu")
+ (set_attr "mode" "SI")])
+
+ (define_insn "mips_cmp<DSPV:dspfmt1_1>_le_<DSPV:dspfmt2>"
+@@ -742,7 +742,7 @@
+ UNSPEC_CMP_LE))]
+ "ISA_HAS_DSP"
+ "cmp<DSPV:dspfmt1_1>.le.<DSPV:dspfmt2>\t%0,%1"
+- [(set_attr "type" "arith")
++ [(set_attr "type" "dspalu")
+ (set_attr "mode" "SI")])
+
+ (define_insn "mips_cmpgu_eq_qb"
+@@ -752,7 +752,7 @@
+ UNSPEC_CMPGU_EQ_QB))]
+ "ISA_HAS_DSP"
+ "cmpgu.eq.qb\t%0,%1,%2"
+- [(set_attr "type" "arith")
++ [(set_attr "type" "dspalu")
+ (set_attr "mode" "SI")])
+
+ (define_insn "mips_cmpgu_lt_qb"
+@@ -762,7 +762,7 @@
+ UNSPEC_CMPGU_LT_QB))]
+ "ISA_HAS_DSP"
+ "cmpgu.lt.qb\t%0,%1,%2"
+- [(set_attr "type" "arith")
++ [(set_attr "type" "dspalu")
+ (set_attr "mode" "SI")])
+
+ (define_insn "mips_cmpgu_le_qb"
+@@ -772,7 +772,7 @@
+ UNSPEC_CMPGU_LE_QB))]
+ "ISA_HAS_DSP"
+ "cmpgu.le.qb\t%0,%1,%2"
+- [(set_attr "type" "arith")
++ [(set_attr "type" "dspalu")
+ (set_attr "mode" "SI")])
+
+ ;; PICK*
+@@ -784,7 +784,7 @@
+ UNSPEC_PICK))]
+ "ISA_HAS_DSP"
+ "pick.<DSPV:dspfmt2>\t%0,%1,%2"
+- [(set_attr "type" "arith")
++ [(set_attr "type" "dspalu")
+ (set_attr "mode" "SI")])
+
+ ;; PACKRL*
+@@ -795,7 +795,7 @@
+ UNSPEC_PACKRL_PH))]
+ "ISA_HAS_DSP"
+ "packrl.ph\t%0,%1,%2"
+- [(set_attr "type" "arith")
++ [(set_attr "type" "dspalu")
+ (set_attr "mode" "SI")])
+
+ ;; Table 2-6. MIPS DSP ASE Instructions: Accumulator and DSPControl Access
+@@ -818,7 +818,7 @@
+ }
+ return "extrv.w\t%0,%q1,%2";
+ }
+- [(set_attr "type" "mfhilo")
++ [(set_attr "type" "accext")
+ (set_attr "mode" "SI")])
+
+ (define_insn "mips_extr_r_w"
+@@ -839,7 +839,7 @@
+ }
+ return "extrv_r.w\t%0,%q1,%2";
+ }
+- [(set_attr "type" "mfhilo")
++ [(set_attr "type" "accext")
+ (set_attr "mode" "SI")])
+
+ (define_insn "mips_extr_rs_w"
+@@ -860,7 +860,7 @@
+ }
+ return "extrv_rs.w\t%0,%q1,%2";
+ }
+- [(set_attr "type" "mfhilo")
++ [(set_attr "type" "accext")
+ (set_attr "mode" "SI")])
+
+ ;; EXTR*_S.H
+@@ -882,7 +882,7 @@
+ }
+ return "extrv_s.h\t%0,%q1,%2";
+ }
+- [(set_attr "type" "mfhilo")
++ [(set_attr "type" "accext")
+ (set_attr "mode" "SI")])
+
+ ;; EXTP*
+@@ -905,7 +905,7 @@
+ }
+ return "extpv\t%0,%q1,%2";
+ }
+- [(set_attr "type" "mfhilo")
++ [(set_attr "type" "accext")
+ (set_attr "mode" "SI")])
+
+ (define_insn "mips_extpdp"
+@@ -930,7 +930,7 @@
+ }
+ return "extpdpv\t%0,%q1,%2";
+ }
+- [(set_attr "type" "mfhilo")
++ [(set_attr "type" "accext")
+ (set_attr "mode" "SI")])
+
+ ;; SHILO*
+@@ -949,7 +949,7 @@
+ }
+ return "shilov\t%q0,%2";
+ }
+- [(set_attr "type" "mfhilo")
++ [(set_attr "type" "accmod")
+ (set_attr "mode" "SI")])
+
+ ;; MTHLIP*
+@@ -965,7 +965,7 @@
+ (reg:CCDSP CCDSP_PO_REGNUM)] UNSPEC_MTHLIP))])]
+ "ISA_HAS_DSP && !TARGET_64BIT"
+ "mthlip\t%2,%q0"
+- [(set_attr "type" "mfhilo")
++ [(set_attr "type" "accmod")
+ (set_attr "mode" "SI")])
+
+ ;; WRDSP
+@@ -987,7 +987,7 @@
+ (unspec:CCDSP [(match_dup 0) (match_dup 1)] UNSPEC_WRDSP))])]
+ "ISA_HAS_DSP"
+ "wrdsp\t%0,%1"
+- [(set_attr "type" "arith")
++ [(set_attr "type" "dspalu")
+ (set_attr "mode" "SI")])
+
+ ;; RDDSP
+@@ -1003,7 +1003,7 @@
+ UNSPEC_RDDSP))]
+ "ISA_HAS_DSP"
+ "rddsp\t%0,%1"
+- [(set_attr "type" "arith")
++ [(set_attr "type" "dspalu")
+ (set_attr "mode" "SI")])
+
+ ;; Table 2-7. MIPS DSP ASE Instructions: Indexed-Load
+diff -Nur a/gcc/config/mips/mips-dspr2.md b/gcc/config/mips/mips-dspr2.md
+--- a/gcc/config/mips/mips-dspr2.md 2007-09-23 11:24:21.000000000 +0200
++++ b/gcc/config/mips/mips-dspr2.md 2010-01-25 09:50:29.025687257 +0100
+@@ -9,7 +9,7 @@
+ (unspec:CCDSP [(match_dup 1)] UNSPEC_ABSQ_S_QB))])]
+ "ISA_HAS_DSPR2"
+ "absq_s.qb\t%0,%z1"
+- [(set_attr "type" "arith")
++ [(set_attr "type" "dspalusat")
+ (set_attr "mode" "SI")])
+
+ (define_insn "mips_addu_ph"
+@@ -21,7 +21,7 @@
+ (unspec:CCDSP [(match_dup 1) (match_dup 2)] UNSPEC_ADDU_PH))])]
+ "ISA_HAS_DSPR2"
+ "addu.ph\t%0,%z1,%z2"
+- [(set_attr "type" "arith")
++ [(set_attr "type" "dspalu")
+ (set_attr "mode" "SI")])
+
+ (define_insn "mips_addu_s_ph"
+@@ -34,7 +34,7 @@
+ (unspec:CCDSP [(match_dup 1) (match_dup 2)] UNSPEC_ADDU_S_PH))])]
+ "ISA_HAS_DSPR2"
+ "addu_s.ph\t%0,%z1,%z2"
+- [(set_attr "type" "arith")
++ [(set_attr "type" "dspalusat")
+ (set_attr "mode" "SI")])
+
+ (define_insn "mips_adduh_qb"
+@@ -44,7 +44,7 @@
+ UNSPEC_ADDUH_QB))]
+ "ISA_HAS_DSPR2"
+ "adduh.qb\t%0,%z1,%z2"
+- [(set_attr "type" "arith")
++ [(set_attr "type" "dspalu")
+ (set_attr "mode" "SI")])
+
+ (define_insn "mips_adduh_r_qb"
+@@ -54,7 +54,7 @@
+ UNSPEC_ADDUH_R_QB))]
+ "ISA_HAS_DSPR2"
+ "adduh_r.qb\t%0,%z1,%z2"
+- [(set_attr "type" "arith")
++ [(set_attr "type" "dspalusat")
+ (set_attr "mode" "SI")])
+
+ (define_insn "mips_append"
+@@ -69,7 +69,7 @@
+ operands[2] = GEN_INT (INTVAL (operands[2]) & 31);
+ return "append\t%0,%z2,%3";
+ }
+- [(set_attr "type" "arith")
++ [(set_attr "type" "dspalu")
+ (set_attr "mode" "SI")])
+
+ (define_insn "mips_balign"
+@@ -84,7 +84,7 @@
+ operands[2] = GEN_INT (INTVAL (operands[2]) & 3);
+ return "balign\t%0,%z2,%3";
+ }
+- [(set_attr "type" "arith")
++ [(set_attr "type" "dspalu")
+ (set_attr "mode" "SI")])
+
+ (define_insn "mips_cmpgdu_eq_qb"
+@@ -99,7 +99,7 @@
+ UNSPEC_CMPGDU_EQ_QB))])]
+ "ISA_HAS_DSPR2"
+ "cmpgdu.eq.qb\t%0,%z1,%z2"
+- [(set_attr "type" "arith")
++ [(set_attr "type" "dspalu")
+ (set_attr "mode" "SI")])
+
+ (define_insn "mips_cmpgdu_lt_qb"
+@@ -114,7 +114,7 @@
+ UNSPEC_CMPGDU_LT_QB))])]
+ "ISA_HAS_DSPR2"
+ "cmpgdu.lt.qb\t%0,%z1,%z2"
+- [(set_attr "type" "arith")
++ [(set_attr "type" "dspalu")
+ (set_attr "mode" "SI")])
+
+ (define_insn "mips_cmpgdu_le_qb"
+@@ -129,7 +129,7 @@
+ UNSPEC_CMPGDU_LE_QB))])]
+ "ISA_HAS_DSPR2"
+ "cmpgdu.le.qb\t%0,%z1,%z2"
+- [(set_attr "type" "arith")
++ [(set_attr "type" "dspalu")
+ (set_attr "mode" "SI")])
+
+ (define_insn "mips_dpa_w_ph"
+@@ -140,7 +140,7 @@
+ UNSPEC_DPA_W_PH))]
+ "ISA_HAS_DSPR2 && !TARGET_64BIT"
+ "dpa.w.ph\t%q0,%z2,%z3"
+- [(set_attr "type" "imadd")
++ [(set_attr "type" "dspmac")
+ (set_attr "mode" "SI")])
+
+ (define_insn "mips_dps_w_ph"
+@@ -151,7 +151,7 @@
+ UNSPEC_DPS_W_PH))]
+ "ISA_HAS_DSPR2 && !TARGET_64BIT"
+ "dps.w.ph\t%q0,%z2,%z3"
+- [(set_attr "type" "imadd")
++ [(set_attr "type" "dspmac")
+ (set_attr "mode" "SI")])
+
+ (define_expand "mips_madd<u>"
+@@ -247,7 +247,7 @@
+ UNSPEC_MULSA_W_PH))]
+ "ISA_HAS_DSPR2 && !TARGET_64BIT"
+ "mulsa.w.ph\t%q0,%z2,%z3"
+- [(set_attr "type" "imadd")
++ [(set_attr "type" "dspmac")
+ (set_attr "mode" "SI")])
+
+ (define_insn "mips_mult"
+@@ -277,7 +277,7 @@
+ UNSPEC_PRECR_QB_PH))]
+ "ISA_HAS_DSPR2"
+ "precr.qb.ph\t%0,%z1,%z2"
+- [(set_attr "type" "arith")
++ [(set_attr "type" "dspalu")
+ (set_attr "mode" "SI")])
+
+ (define_insn "mips_precr_sra_ph_w"
+@@ -292,7 +292,7 @@
+ operands[2] = GEN_INT (INTVAL (operands[2]) & 31);
+ return "precr_sra.ph.w\t%0,%z2,%3";
+ }
+- [(set_attr "type" "arith")
++ [(set_attr "type" "dspalu")
+ (set_attr "mode" "SI")])
+
+ (define_insn "mips_precr_sra_r_ph_w"
+@@ -307,7 +307,7 @@
+ operands[2] = GEN_INT (INTVAL (operands[2]) & 31);
+ return "precr_sra_r.ph.w\t%0,%z2,%3";
+ }
+- [(set_attr "type" "arith")
++ [(set_attr "type" "dspalu")
+ (set_attr "mode" "SI")])
+
+ (define_insn "mips_prepend"
+@@ -322,7 +322,7 @@
+ operands[2] = GEN_INT (INTVAL (operands[2]) & 31);
+ return "prepend\t%0,%z2,%3";
+ }
+- [(set_attr "type" "arith")
++ [(set_attr "type" "dspalu")
+ (set_attr "mode" "SI")])
+
+ (define_insn "mips_shra_qb"
+@@ -340,7 +340,7 @@
+ }
+ return "shrav.qb\t%0,%z1,%2";
+ }
+- [(set_attr "type" "shift")
++ [(set_attr "type" "dspalu")
+ (set_attr "mode" "SI")])
+
+
+@@ -359,7 +359,7 @@
+ }
+ return "shrav_r.qb\t%0,%z1,%2";
+ }
+- [(set_attr "type" "shift")
++ [(set_attr "type" "dspalu")
+ (set_attr "mode" "SI")])
+
+ (define_insn "mips_shrl_ph"
+@@ -377,7 +377,7 @@
+ }
+ return "shrlv.ph\t%0,%z1,%2";
+ }
+- [(set_attr "type" "shift")
++ [(set_attr "type" "dspalu")
+ (set_attr "mode" "SI")])
+
+ (define_insn "mips_subu_ph"
+@@ -390,7 +390,7 @@
+ (unspec:CCDSP [(match_dup 1) (match_dup 2)] UNSPEC_SUBU_PH))])]
+ "ISA_HAS_DSPR2"
+ "subu.ph\t%0,%z1,%z2"
+- [(set_attr "type" "arith")
++ [(set_attr "type" "dspalu")
+ (set_attr "mode" "SI")])
+
+ (define_insn "mips_subu_s_ph"
+@@ -403,7 +403,7 @@
+ (unspec:CCDSP [(match_dup 1) (match_dup 2)] UNSPEC_SUBU_S_PH))])]
+ "ISA_HAS_DSPR2"
+ "subu_s.ph\t%0,%z1,%z2"
+- [(set_attr "type" "arith")
++ [(set_attr "type" "dspalusat")
+ (set_attr "mode" "SI")])
+
+ (define_insn "mips_subuh_qb"
+@@ -413,7 +413,7 @@
+ UNSPEC_SUBUH_QB))]
+ "ISA_HAS_DSPR2"
+ "subuh.qb\t%0,%z1,%z2"
+- [(set_attr "type" "arith")
++ [(set_attr "type" "dspalu")
+ (set_attr "mode" "SI")])
+
+ (define_insn "mips_subuh_r_qb"
+@@ -423,7 +423,7 @@
+ UNSPEC_SUBUH_R_QB))]
+ "ISA_HAS_DSPR2"
+ "subuh_r.qb\t%0,%z1,%z2"
+- [(set_attr "type" "arith")
++ [(set_attr "type" "dspalu")
+ (set_attr "mode" "SI")])
+
+ (define_insn "mips_addqh_ph"
+@@ -433,7 +433,7 @@
+ UNSPEC_ADDQH_PH))]
+ "ISA_HAS_DSPR2"
+ "addqh.ph\t%0,%z1,%z2"
+- [(set_attr "type" "arith")
++ [(set_attr "type" "dspalu")
+ (set_attr "mode" "SI")])
+
+ (define_insn "mips_addqh_r_ph"
+@@ -443,7 +443,7 @@
+ UNSPEC_ADDQH_R_PH))]
+ "ISA_HAS_DSPR2"
+ "addqh_r.ph\t%0,%z1,%z2"
+- [(set_attr "type" "arith")
++ [(set_attr "type" "dspalu")
+ (set_attr "mode" "SI")])
+
+ (define_insn "mips_addqh_w"
+@@ -453,7 +453,7 @@
+ UNSPEC_ADDQH_W))]
+ "ISA_HAS_DSPR2"
+ "addqh.w\t%0,%z1,%z2"
+- [(set_attr "type" "arith")
++ [(set_attr "type" "dspalu")
+ (set_attr "mode" "SI")])
+
+ (define_insn "mips_addqh_r_w"
+@@ -463,7 +463,7 @@
+ UNSPEC_ADDQH_R_W))]
+ "ISA_HAS_DSPR2"
+ "addqh_r.w\t%0,%z1,%z2"
+- [(set_attr "type" "arith")
++ [(set_attr "type" "dspalu")
+ (set_attr "mode" "SI")])
+
+ (define_insn "mips_subqh_ph"
+@@ -473,7 +473,7 @@
+ UNSPEC_SUBQH_PH))]
+ "ISA_HAS_DSPR2"
+ "subqh.ph\t%0,%z1,%z2"
+- [(set_attr "type" "arith")
++ [(set_attr "type" "dspalu")
+ (set_attr "mode" "SI")])
+
+ (define_insn "mips_subqh_r_ph"
+@@ -483,7 +483,7 @@
+ UNSPEC_SUBQH_R_PH))]
+ "ISA_HAS_DSPR2"
+ "subqh_r.ph\t%0,%z1,%z2"
+- [(set_attr "type" "arith")
++ [(set_attr "type" "dspalu")
+ (set_attr "mode" "SI")])
+
+ (define_insn "mips_subqh_w"
+@@ -493,7 +493,7 @@
+ UNSPEC_SUBQH_W))]
+ "ISA_HAS_DSPR2"
+ "subqh.w\t%0,%z1,%z2"
+- [(set_attr "type" "arith")
++ [(set_attr "type" "dspalu")
+ (set_attr "mode" "SI")])
+
+ (define_insn "mips_subqh_r_w"
+@@ -503,7 +503,7 @@
+ UNSPEC_SUBQH_R_W))]
+ "ISA_HAS_DSPR2"
+ "subqh_r.w\t%0,%z1,%z2"
+- [(set_attr "type" "arith")
++ [(set_attr "type" "dspalu")
+ (set_attr "mode" "SI")])
+
+ (define_insn "mips_dpax_w_ph"
+@@ -514,7 +514,7 @@
+ UNSPEC_DPAX_W_PH))]
+ "ISA_HAS_DSPR2 && !TARGET_64BIT"
+ "dpax.w.ph\t%q0,%z2,%z3"
+- [(set_attr "type" "imadd")
++ [(set_attr "type" "dspmac")
+ (set_attr "mode" "SI")])
+
+ (define_insn "mips_dpsx_w_ph"
+@@ -525,7 +525,7 @@
+ UNSPEC_DPSX_W_PH))]
+ "ISA_HAS_DSPR2 && !TARGET_64BIT"
+ "dpsx.w.ph\t%q0,%z2,%z3"
+- [(set_attr "type" "imadd")
++ [(set_attr "type" "dspmac")
+ (set_attr "mode" "SI")])
+
+ (define_insn "mips_dpaqx_s_w_ph"
+@@ -540,7 +540,7 @@
+ UNSPEC_DPAQX_S_W_PH))])]
+ "ISA_HAS_DSPR2 && !TARGET_64BIT"
+ "dpaqx_s.w.ph\t%q0,%z2,%z3"
+- [(set_attr "type" "imadd")
++ [(set_attr "type" "dspmac")
+ (set_attr "mode" "SI")])
+
+ (define_insn "mips_dpaqx_sa_w_ph"
+@@ -555,7 +555,7 @@
+ UNSPEC_DPAQX_SA_W_PH))])]
+ "ISA_HAS_DSPR2 && !TARGET_64BIT"
+ "dpaqx_sa.w.ph\t%q0,%z2,%z3"
+- [(set_attr "type" "imadd")
++ [(set_attr "type" "dspmacsat")
+ (set_attr "mode" "SI")])
+
+ (define_insn "mips_dpsqx_s_w_ph"
+@@ -570,7 +570,7 @@
+ UNSPEC_DPSQX_S_W_PH))])]
+ "ISA_HAS_DSPR2 && !TARGET_64BIT"
+ "dpsqx_s.w.ph\t%q0,%z2,%z3"
+- [(set_attr "type" "imadd")
++ [(set_attr "type" "dspmac")
+ (set_attr "mode" "SI")])
+
+ (define_insn "mips_dpsqx_sa_w_ph"
+@@ -585,5 +585,43 @@
+ UNSPEC_DPSQX_SA_W_PH))])]
+ "ISA_HAS_DSPR2 && !TARGET_64BIT"
+ "dpsqx_sa.w.ph\t%q0,%z2,%z3"
+- [(set_attr "type" "imadd")
++ [(set_attr "type" "dspmacsat")
++ (set_attr "mode" "SI")])
++
++;; Convert mtlo $ac[1-3],$0 => mult $ac[1-3],$0,$0
++;; mthi $ac[1-3],$0
++(define_peephole2
++ [(set (match_operand:SI 0 "register_operand" "")
++ (const_int 0))
++ (set (match_operand:SI 1 "register_operand" "")
++ (const_int 0))]
++ "ISA_HAS_DSPR2
++ && !TARGET_MIPS16
++ && !TARGET_64BIT
++ && (((true_regnum (operands[0]) == AC1LO_REGNUM
++ && true_regnum (operands[1]) == AC1HI_REGNUM)
++ || (true_regnum (operands[0]) == AC1HI_REGNUM
++ && true_regnum (operands[1]) == AC1LO_REGNUM))
++ || ((true_regnum (operands[0]) == AC2LO_REGNUM
++ && true_regnum (operands[1]) == AC2HI_REGNUM)
++ || (true_regnum (operands[0]) == AC2HI_REGNUM
++ && true_regnum (operands[1]) == AC2LO_REGNUM))
++ || ((true_regnum (operands[0]) == AC3LO_REGNUM
++ && true_regnum (operands[1]) == AC3HI_REGNUM)
++ || (true_regnum (operands[0]) == AC3HI_REGNUM
++ && true_regnum (operands[1]) == AC3LO_REGNUM)))"
++ [(parallel [(set (match_dup 0) (const_int 0))
++ (set (match_dup 1) (const_int 0))])]
++)
++
++(define_insn "*mips_acc_init"
++ [(parallel [(set (match_operand:SI 0 "register_operand" "=a")
++ (const_int 0))
++ (set (match_operand:SI 1 "register_operand" "=a")
++ (const_int 0))])]
++ "ISA_HAS_DSPR2
++ && !TARGET_MIPS16
++ && !TARGET_64BIT"
++ "mult\t%q0,$0,$0\t\t# Clear ACC HI/LO"
++ [(set_attr "type" "imul")
+ (set_attr "mode" "SI")])
+diff -Nur a/gcc/config/mips/mips.h b/gcc/config/mips/mips.h
+--- a/gcc/config/mips/mips.h 2009-02-20 16:20:38.000000000 +0100
++++ b/gcc/config/mips/mips.h 2010-01-25 09:50:29.025687257 +0100
+@@ -342,6 +342,9 @@
+ #define TARGET_IRIX 0
+ #define TARGET_IRIX6 0
+
++/* SDE specific stuff. */
++#define TARGET_MIPS_SDE 0
++
+ /* Define preprocessor macros for the -march and -mtune options.
+ PREFIX is either _MIPS_ARCH or _MIPS_TUNE, INFO is the selected
+ processor. If INFO's canonical name is "foo", define PREFIX to
+@@ -708,8 +711,9 @@
+ |march=r10000|march=r12000|march=r14000|march=r16000:-mips4} \
+ %{march=mips32|march=4kc|march=4km|march=4kp|march=4ksc:-mips32} \
+ %{march=mips32r2|march=m4k|march=4ke*|march=4ksd|march=24k* \
+- |march=34k*|march=74k*: -mips32r2} \
+- %{march=mips64|march=5k*|march=20k*|march=sb1*|march=sr71000: -mips64} \
++ |march=34k*|march=74k*|march=1004k*: -mips32r2} \
++ %{march=mips64|march=5k*|march=20k*|march=sb1*|march=sr71000 \
++ |march=xlr: -mips64} \
+ %{march=mips64r2|march=octeon: -mips64r2} \
+ %{!march=*: -" MULTILIB_ISA_DEFAULT "}}"
+
+@@ -720,7 +724,8 @@
+ #define MIPS_ARCH_FLOAT_SPEC \
+ "%{mhard-float|msoft-float|march=mips*:; \
+ march=vr41*|march=m4k|march=4k*|march=24kc|march=24kec \
+- |march=34kc|march=74kc|march=5kc|march=octeon: -msoft-float; \
++ |march=34kc|march=74kc|march=1004kc|march=5kc \
++ |march=octeon|march=xlr: -msoft-float; \
+ march=*: -mhard-float}"
+
+ /* A spec condition that matches 32-bit options. It only works if
+@@ -731,8 +736,9 @@
+
+ /* Support for a compile-time default CPU, et cetera. The rules are:
+ --with-arch is ignored if -march is specified or a -mips is specified
+- (other than -mips16).
+- --with-tune is ignored if -mtune is specified.
++ (other than -mips16); likewise --with-arch-32 and --with-arch-64.
++ --with-tune is ignored if -mtune is specified; likewise
++ --with-tune-32 and --with-tune-64.
+ --with-abi is ignored if -mabi is specified.
+ --with-float is ignored if -mhard-float or -msoft-float are
+ specified.
+@@ -740,7 +746,11 @@
+ specified. */
+ #define OPTION_DEFAULT_SPECS \
+ {"arch", "%{" MIPS_ARCH_OPTION_SPEC ":;: -march=%(VALUE)}" }, \
++ {"arch_32", "%{!mabi=*|mabi=32:%{" MIPS_ARCH_OPTION_SPEC ":;: -march=%(VALUE)}}" }, \
++ {"arch_64", "%{mabi=n32|mabi=64:%{" MIPS_ARCH_OPTION_SPEC ":;: -march=%(VALUE)}}" }, \
+ {"tune", "%{!mtune=*:-mtune=%(VALUE)}" }, \
++ {"tune_32", "%{!mabi=*|mabi=32:%{!mtune=*:-mtune=%(VALUE)}}" }, \
++ {"tune_64", "%{mabi=n32|mabi=64:%{!mtune=*:-mtune=%(VALUE)}}" }, \
+ {"abi", "%{!mabi=*:-mabi=%(VALUE)}" }, \
+ {"float", "%{!msoft-float:%{!mhard-float:-m%(VALUE)-float}}" }, \
+ {"divide", "%{!mdivide-traps:%{!mdivide-breaks:-mdivide-%(VALUE)}}" }, \
+@@ -750,7 +760,7 @@
+
+ /* A spec that infers the -mdsp setting from an -march argument. */
+ #define BASE_DRIVER_SELF_SPECS \
+- "%{!mno-dsp:%{march=24ke*|march=34k*|march=74k*: -mdsp}}"
++ "%{!mno-dsp:%{march=24ke*|march=34k*|march=74k*|march=1004k*: -mdsp}}"
+
+ #define DRIVER_SELF_SPECS BASE_DRIVER_SELF_SPECS
+
+@@ -1038,6 +1048,11 @@
+ /* ISA includes the bbit* instructions. */
+ #define ISA_HAS_BBIT (TARGET_OCTEON && !TARGET_MIPS16)
+
++/* ISA has single-instruction unaligned load/store support. */
++#define ISA_HAS_UL_US (TARGET_OCTEON \
++ && TARGET_OCTEON_UNALIGNED \
++ && !TARGET_MIPS16)
++
+ /* ISA includes the cins instruction. */
+ #define ISA_HAS_CINS (TARGET_OCTEON && !TARGET_MIPS16)
+
+@@ -1055,6 +1070,7 @@
+
+ /* The CACHE instruction is available. */
+ #define ISA_HAS_CACHE (TARGET_CACHE_BUILTIN && !TARGET_MIPS16)
++
+
+ /* Add -G xx support. */
+
+@@ -1152,6 +1168,7 @@
+ %{mshared} %{mno-shared} \
+ %{msym32} %{mno-sym32} \
+ %{mtune=*} %{v} \
++%{mocteon-useun} %{mno-octeon-useun} \
+ %(subtarget_asm_spec)"
+
+ /* Extra switches sometimes passed to the linker. */
+@@ -1622,6 +1639,9 @@
+ #define GP_REG_LAST 31
+ #define GP_REG_NUM (GP_REG_LAST - GP_REG_FIRST + 1)
+ #define GP_DBX_FIRST 0
++#define K0_REG_NUM (GP_REG_FIRST + 26)
++#define K1_REG_NUM (GP_REG_FIRST + 27)
++#define KERNEL_REG_P(REGNO) (IN_RANGE (REGNO, K0_REG_NUM, K1_REG_NUM))
+
+ #define FP_REG_FIRST 32
+ #define FP_REG_LAST 63
+@@ -1649,6 +1669,10 @@
+ #define COP0_REG_LAST 111
+ #define COP0_REG_NUM (COP0_REG_LAST - COP0_REG_FIRST + 1)
+
++#define COP0_STATUS_REG_NUM (COP0_REG_FIRST + 12)
++#define COP0_CAUSE_REG_NUM (COP0_REG_FIRST + 13)
++#define COP0_EPC_REG_NUM (COP0_REG_FIRST + 14)
++
+ #define COP2_REG_FIRST 112
+ #define COP2_REG_LAST 143
+ #define COP2_REG_NUM (COP2_REG_LAST - COP2_REG_FIRST + 1)
+@@ -1666,6 +1690,29 @@
+ #define AT_REGNUM (GP_REG_FIRST + 1)
+ #define HI_REGNUM (TARGET_BIG_ENDIAN ? MD_REG_FIRST : MD_REG_FIRST + 1)
+ #define LO_REGNUM (TARGET_BIG_ENDIAN ? MD_REG_FIRST + 1 : MD_REG_FIRST)
++#define AC1HI_REGNUM (TARGET_BIG_ENDIAN \
++ ? DSP_ACC_REG_FIRST : DSP_ACC_REG_FIRST + 1)
++#define AC1LO_REGNUM (TARGET_BIG_ENDIAN \
++ ? DSP_ACC_REG_FIRST + 1 : DSP_ACC_REG_FIRST)
++#define AC2HI_REGNUM (TARGET_BIG_ENDIAN \
++ ? DSP_ACC_REG_FIRST + 2 : DSP_ACC_REG_FIRST + 3)
++#define AC2LO_REGNUM (TARGET_BIG_ENDIAN \
++ ? DSP_ACC_REG_FIRST + 3 : DSP_ACC_REG_FIRST + 2)
++#define AC3HI_REGNUM (TARGET_BIG_ENDIAN \
++ ? DSP_ACC_REG_FIRST + 4 : DSP_ACC_REG_FIRST + 5)
++#define AC3LO_REGNUM (TARGET_BIG_ENDIAN \
++ ? DSP_ACC_REG_FIRST + 5 : DSP_ACC_REG_FIRST + 4)
++
++/* A few bitfield locations for the coprocessor registers. */
++/* Request Interrupt Priority Level is from bit 10 to bit 15 of
++ the cause register for the EIC interrupt mode. */
++#define CAUSE_IPL 10
++/* Interrupt Priority Level is from bit 10 to bit 15 of the status register. */
++#define SR_IPL 10
++/* Exception Level is at bit 1 of the status register. */
++#define SR_EXL 1
++/* Interrupt Enable is at bit 0 of the status register. */
++#define SR_IE 0
+
+ /* FPSW_REGNUM is the single condition code used if !ISA_HAS_8CC.
+ If ISA_HAS_8CC, it should not be used, and an arbitrary ST_REG
+@@ -1754,11 +1801,18 @@
+ incoming arguments, the static chain pointer, or the frame pointer.
+ The epilogue temporary mustn't conflict with the return registers,
+ the PIC call register ($25), the frame pointer, the EH stack adjustment,
+- or the EH data registers. */
++ or the EH data registers.
++
++ If we're generating interrupt handlers, we use K0 as a temporary register
++ in prologue/epilogue code. */
+
+ #define MIPS16_PIC_TEMP_REGNUM (GP_REG_FIRST + 2)
+-#define MIPS_PROLOGUE_TEMP_REGNUM (GP_REG_FIRST + 3)
+-#define MIPS_EPILOGUE_TEMP_REGNUM (GP_REG_FIRST + (TARGET_MIPS16 ? 6 : 8))
++#define MIPS_PROLOGUE_TEMP_REGNUM \
++ (cfun->machine->interrupt_handler_p ? K0_REG_NUM : GP_REG_FIRST + 3)
++#define MIPS_EPILOGUE_TEMP_REGNUM \
++ (cfun->machine->interrupt_handler_p \
++ ? K0_REG_NUM \
++ : GP_REG_FIRST + (TARGET_MIPS16 ? 6 : 8))
+
+ #define MIPS16_PIC_TEMP gen_rtx_REG (Pmode, MIPS16_PIC_TEMP_REGNUM)
+ #define MIPS_PROLOGUE_TEMP(MODE) gen_rtx_REG (MODE, MIPS_PROLOGUE_TEMP_REGNUM)
+@@ -2284,14 +2338,7 @@
+ (mips_abi == ABI_EABI && UNITS_PER_FPVALUE >= UNITS_PER_DOUBLE)
+
+
+-/* Say that the epilogue uses the return address register. Note that
+- in the case of sibcalls, the values "used by the epilogue" are
+- considered live at the start of the called function.
+-
+- If using a GOT, say that the epilogue also uses GOT_VERSION_REGNUM.
+- See the comment above load_call<mode> for details. */
+-#define EPILOGUE_USES(REGNO) \
+- ((REGNO) == 31 || (TARGET_USE_GOT && (REGNO) == GOT_VERSION_REGNUM))
++#define EPILOGUE_USES(REGNO) mips_epilogue_uses (REGNO)
+
+ /* Treat LOC as a byte offset from the stack pointer and round it up
+ to the next fully-aligned offset. */
+diff -Nur a/gcc/config/mips/mips.md b/gcc/config/mips/mips.md
+--- a/gcc/config/mips/mips.md 2009-02-20 16:20:38.000000000 +0100
++++ b/gcc/config/mips/mips.md 2010-01-25 09:50:29.035686224 +0100
+@@ -67,7 +67,16 @@
+ (UNSPEC_SET_GOT_VERSION 46)
+ (UNSPEC_UPDATE_GOT_VERSION 47)
+ (UNSPEC_COPYGP 48)
++ (UNSPEC_ERET 49)
++ (UNSPEC_DERET 50)
++ (UNSPEC_DI 51)
++ (UNSPEC_EHB 52)
++ (UNSPEC_RDPGPR 53)
++ (UNSPEC_COP0 54)
+
++ (UNSPEC_UNALIGNED_LOAD 60)
++ (UNSPEC_UNALIGNED_STORE 61)
++
+ (UNSPEC_ADDRESS_FIRST 100)
+
+ (TLS_GET_TP_REGNUM 3)
+@@ -372,6 +381,12 @@
+ ;; frsqrt floating point reciprocal square root
+ ;; frsqrt1 floating point reciprocal square root step1
+ ;; frsqrt2 floating point reciprocal square root step2
++;; dspmac DSP MAC instructions not saturating the accumulator
++;; dspmacsat DSP MAC instructions that saturate the accumulator
++;; accext DSP accumulator extract instructions
++;; accmod DSP accumulator modify instructions
++;; dspalu DSP ALU instructions not saturating the result
++;; dspalusat DSP ALU instructions that saturate the result
+ ;; multi multiword sequence (or user asm statements)
+ ;; nop no operation
+ ;; ghost an instruction that produces no real code
+@@ -380,7 +395,7 @@
+ prefetch,prefetchx,condmove,mtc,mfc,mthilo,mfhilo,const,arith,logical,
+ shift,slt,signext,clz,pop,trap,imul,imul3,imul3nc,imadd,idiv,idiv3,move,
+ fmove,fadd,fmul,fmadd,fdiv,frdiv,frdiv1,frdiv2,fabs,fneg,fcmp,fcvt,fsqrt,
+- frsqrt,frsqrt1,frsqrt2,multi,nop,ghost"
++ frsqrt,frsqrt1,frsqrt2,dspmac,dspmacsat,accext,accmod,dspalu,dspalusat,multi,nop,ghost"
+ (cond [(eq_attr "jal" "!unset") (const_string "call")
+ (eq_attr "got" "load") (const_string "load")
+
+@@ -3565,7 +3580,9 @@
+ (unspec:GPR [(match_operand:BLK 1 "memory_operand" "m")
+ (match_operand:QI 2 "memory_operand" "m")]
+ UNSPEC_LOAD_LEFT))]
+- "!TARGET_MIPS16 && mips_mem_fits_mode_p (<MODE>mode, operands[1])"
++ "!TARGET_MIPS16
++ && !ISA_HAS_UL_US
++ && mips_mem_fits_mode_p (<MODE>mode, operands[1])"
+ "<load>l\t%0,%2"
+ [(set_attr "move_type" "load")
+ (set_attr "mode" "<MODE>")])
+@@ -3576,7 +3593,9 @@
+ (match_operand:QI 2 "memory_operand" "m")
+ (match_operand:GPR 3 "register_operand" "0")]
+ UNSPEC_LOAD_RIGHT))]
+- "!TARGET_MIPS16 && mips_mem_fits_mode_p (<MODE>mode, operands[1])"
++ "!TARGET_MIPS16
++ && !ISA_HAS_UL_US
++ && mips_mem_fits_mode_p (<MODE>mode, operands[1])"
+ "<load>r\t%0,%2"
+ [(set_attr "move_type" "load")
+ (set_attr "mode" "<MODE>")])
+@@ -3586,7 +3605,9 @@
+ (unspec:BLK [(match_operand:GPR 1 "reg_or_0_operand" "dJ")
+ (match_operand:QI 2 "memory_operand" "m")]
+ UNSPEC_STORE_LEFT))]
+- "!TARGET_MIPS16 && mips_mem_fits_mode_p (<MODE>mode, operands[0])"
++ "!TARGET_MIPS16
++ && !ISA_HAS_UL_US
++ && mips_mem_fits_mode_p (<MODE>mode, operands[0])"
+ "<store>l\t%z1,%2"
+ [(set_attr "move_type" "store")
+ (set_attr "mode" "<MODE>")])
+@@ -3602,6 +3623,28 @@
+ [(set_attr "move_type" "store")
+ (set_attr "mode" "<MODE>")])
+
++;; Unaligned load and store patterns.
++
++(define_insn "mov_u<load>"
++ [(set (match_operand:GPR 0 "register_operand" "=d")
++ (unspec:GPR [(match_operand:BLK 1 "memory_operand" "m")
++ (match_operand:QI 2 "memory_operand" "m")]
++ UNSPEC_UNALIGNED_LOAD))]
++ "ISA_HAS_UL_US && mips_mem_fits_mode_p (<MODE>mode, operands[1])"
++ "u<load>\t%0,%2"
++ [(set_attr "type" "load")
++ (set_attr "mode" "<MODE>")])
++
++(define_insn "mov_u<store>"
++ [(set (match_operand:BLK 0 "memory_operand" "=m")
++ (unspec:BLK [(match_operand:GPR 1 "reg_or_0_operand" "dJ")
++ (match_operand:QI 2 "memory_operand" "m")]
++ UNSPEC_UNALIGNED_STORE))]
++ "ISA_HAS_UL_US && mips_mem_fits_mode_p (<MODE>mode, operands[0])"
++ "u<store>\t%z1,%2"
++ [(set_attr "type" "store")
++ (set_attr "mode" "<MODE>")])
++
+ ;; An instruction to calculate the high part of a 64-bit SYMBOL_ABSOLUTE.
+ ;; The required value is:
+ ;;
+@@ -5472,6 +5515,26 @@
+ return "%*b\t%l0%/";
+ else
+ {
++ if (final_sequence && (mips_abi == ABI_32 || mips_abi == ABI_O64))
++ {
++ /* If the delay slot contains a $gp restore, we need to
++ do that first, because we need it for the load
++ label. Other ABIs do not have caller-save $gp. */
++ rtx next = NEXT_INSN (insn);
++ if (INSN_P (next) && !INSN_DELETED_P (next))
++ {
++ rtx pat = PATTERN (next);
++ if (GET_CODE (pat) == SET
++ && REG_P (SET_DEST (pat))
++ && REGNO (SET_DEST (pat)) == PIC_OFFSET_TABLE_REGNUM)
++ {
++ rtx ops[2];
++ ops[0] = SET_DEST (pat);
++ ops[1] = SET_SRC (pat);
++ output_asm_insn (mips_output_move (ops[0], ops[1]), ops);
++ }
++ }
++ }
+ output_asm_insn (mips_output_load_label (), operands);
+ return "%*jr\t%@%/%]";
+ }
+@@ -5490,7 +5553,13 @@
+ (lt (abs (minus (match_dup 0)
+ (plus (pc) (const_int 4))))
+ (const_int 131072)))
+- (const_int 4) (const_int 16)))])
++ (const_int 4)
++ (if_then_else
++ ;; for these two ABIs we may need to move a restore of $gp
++ (ior (eq (symbol_ref "mips_abi") (symbol_ref "ABI_32"))
++ (eq (symbol_ref "mips_abi") (symbol_ref "ABI_O64")))
++ (const_int 20)
++ (const_int 16))))])
+
+ ;; We need a different insn for the mips16, because a mips16 branch
+ ;; does not have a delay slot.
+@@ -5679,6 +5748,60 @@
+ [(set_attr "type" "jump")
+ (set_attr "mode" "none")])
+
++;; Exception return.
++(define_insn "mips_eret"
++ [(return)
++ (unspec_volatile [(const_int 0)] UNSPEC_ERET)]
++ ""
++ "eret"
++ [(set_attr "type" "trap")
++ (set_attr "mode" "none")])
++
++;; Debug exception return.
++(define_insn "mips_deret"
++ [(return)
++ (unspec_volatile [(const_int 0)] UNSPEC_DERET)]
++ ""
++ "deret"
++ [(set_attr "type" "trap")
++ (set_attr "mode" "none")])
++
++;; Disable interrupts.
++(define_insn "mips_di"
++ [(unspec_volatile [(const_int 0)] UNSPEC_DI)]
++ ""
++ "di"
++ [(set_attr "type" "trap")
++ (set_attr "mode" "none")])
++
++;; Execution hazard barrier.
++(define_insn "mips_ehb"
++ [(unspec_volatile [(const_int 0)] UNSPEC_EHB)]
++ ""
++ "ehb"
++ [(set_attr "type" "trap")
++ (set_attr "mode" "none")])
++
++;; Read GPR from previous shadow register set.
++(define_insn "mips_rdpgpr"
++ [(set (match_operand:SI 0 "register_operand" "=d")
++ (unspec_volatile:SI [(match_operand:SI 1 "register_operand" "d")]
++ UNSPEC_RDPGPR))]
++ ""
++ "rdpgpr\t%0,%1"
++ [(set_attr "type" "move")
++ (set_attr "mode" "SI")])
++
++;; Move involving COP0 registers.
++(define_insn "cop0_move"
++ [(set (match_operand:SI 0 "register_operand" "=B,d")
++ (unspec_volatile:SI [(match_operand:SI 1 "register_operand" "d,B")]
++ UNSPEC_COP0))]
++ ""
++{ return mips_output_move (operands[0], operands[1]); }
++ [(set_attr "type" "mtc,mfc")
++ (set_attr "mode" "SI")])
++
+ ;; This is used in compiling the unwind routines.
+ (define_expand "eh_return"
+ [(use (match_operand 0 "general_operand"))]
+diff -Nur a/gcc/config/mips/mips.opt b/gcc/config/mips/mips.opt
+--- a/gcc/config/mips/mips.opt 2009-02-20 16:20:38.000000000 +0100
++++ b/gcc/config/mips/mips.opt 2010-01-25 09:50:29.035686224 +0100
+@@ -184,6 +184,10 @@
+ Target Report RejectNegative Mask(MIPS16)
+ Generate MIPS16 code
+
++mips16e
++Target Report RejectNegative Mask(MIPS16) MaskExists
++Deprecated; alias for -mips16
++
+ mips3d
+ Target Report RejectNegative Mask(MIPS3D)
+ Use MIPS-3D instructions
+@@ -236,6 +240,10 @@
+ Target Report RejectNegative InverseMask(MIPS3D)
+ Do not use MIPS-3D instructions
+
++mocteon-useun
++Target Report Mask(OCTEON_UNALIGNED)
++Use Octeon-specific unaligned loads/stores for 32/64-bit data
++
+ mpaired-single
+ Target Report Mask(PAIRED_SINGLE_FLOAT)
+ Use paired-single floating-point instructions
+diff -Nur a/gcc/config/mips/mips-protos.h b/gcc/config/mips/mips-protos.h
+--- a/gcc/config/mips/mips-protos.h 2009-02-20 16:20:38.000000000 +0100
++++ b/gcc/config/mips/mips-protos.h 2010-01-25 09:50:29.035686224 +0100
+@@ -261,6 +261,8 @@
+ extern void mips_output_external (FILE *, tree, const char *);
+ extern void mips_output_filename (FILE *, const char *);
+ extern void mips_output_ascii (FILE *, const char *, size_t);
++extern void octeon_output_shared_variable (FILE *, tree, const char *,
++ unsigned HOST_WIDE_INT, int);
+ extern void mips_output_aligned_decl_common (FILE *, tree, const char *,
+ unsigned HOST_WIDE_INT,
+ unsigned int);
+@@ -307,6 +309,8 @@
+ extern bool mips_linked_madd_p (rtx, rtx);
+ extern bool mips_store_data_bypass_p (rtx, rtx);
+ extern rtx mips_prefetch_cookie (rtx, rtx);
++extern int mips_mult_madd_chain_bypass_p (rtx, rtx);
++extern int mips_dspalu_bypass_p (rtx, rtx);
+
+ extern void irix_asm_output_align (FILE *, unsigned);
+ extern const char *current_section_name (void);
+@@ -332,4 +336,6 @@
+
+ extern void mips_expand_vector_init (rtx, rtx);
+
++extern bool mips_epilogue_uses (unsigned int);
++
+ #endif /* ! GCC_MIPS_PROTOS_H */
+diff -Nur a/gcc/config/mips/montavista-linux.h b/gcc/config/mips/montavista-linux.h
+--- a/gcc/config/mips/montavista-linux.h 1970-01-01 01:00:00.000000000 +0100
++++ b/gcc/config/mips/montavista-linux.h 2010-01-25 09:50:29.035686224 +0100
+@@ -0,0 +1,54 @@
++/* MontaVista GNU/Linux Configuration.
++ Copyright (C) 2009
++ Free Software Foundation, Inc.
++
++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/>. */
++
++/* Override linux64.h to default to O32. */
++#undef SUBTARGET_SELF_SPECS
++#define SUBTARGET_SELF_SPECS \
++NO_SHARED_SPECS, \
++"%{!EB:%{!EL:%(endian_spec)}}", \
++"%{!mabi=*: -mabi=32}"
++
++/* We do not need to provide an explicit big-endian multilib. */
++#undef MULTILIB_DEFAULTS
++#define MULTILIB_DEFAULTS \
++ { "meb", "mabi=32" }
++
++/* The various C libraries each have their own subdirectory. */
++#undef SYSROOT_SUFFIX_SPEC
++#define SYSROOT_SUFFIX_SPEC \
++ "%{mel:%{msoft-float:/mel/soft-float ; \
++ :/mel} ; \
++ msoft-float:/soft-float}"
++
++/* MULTILIB_OSDIRNAMES provides directory names used in two ways:
++ relative to $target/lib/ in the GCC installation, and relative to
++ lib/ and usr/lib/ in a sysroot. For the latter, we want names such
++ as plain ../lib64, but these cannot be used outside the sysroot
++ because different multilibs would be mapped to the same directory.
++ Directories are searched both with and without the multilib suffix,
++ so it suffices if the directory without the suffix is correct
++ within the sysroot while the directory with the suffix doesn't
++ exist. We use STARTFILE_PREFIX_SPEC to achieve the desired
++ effect. */
++#undef STARTFILE_PREFIX_SPEC
++#define STARTFILE_PREFIX_SPEC \
++ "%{mabi=32: /usr/local/lib/ /lib/ /usr/lib/} \
++ %{mabi=n32: /usr/local/lib32/ /lib32/ /usr/lib32/} \
++ %{mabi=64: /usr/local/lib64/ /lib64/ /usr/lib64/}"
+diff -Nur a/gcc/config/mips/octeon-elf.h b/gcc/config/mips/octeon-elf.h
+--- a/gcc/config/mips/octeon-elf.h 1970-01-01 01:00:00.000000000 +0100
++++ b/gcc/config/mips/octeon-elf.h 2010-01-25 09:50:29.035686224 +0100
+@@ -0,0 +1,98 @@
++/* Macros for mips*-octeon-elf target.
++ Copyright (C) 2004, 2005, 2006 Cavium Networks.
++
++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 2, 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 COPYING. If not, write to
++the Free Software Foundation, 51 Franklin Street, Fifth Floor,
++Boston, MA 02110-1301, USA. */
++
++/* Add MASK_SOFT_FLOAT and MASK_OCTEON_UNALIGNED. */
++
++#undef TARGET_DEFAULT
++#define TARGET_DEFAULT (MASK_SOFT_FLOAT_ABI | MASK_OCTEON_UNALIGNED)
++
++/* Forward -m*octeon-useun. */
++
++#undef SUBTARGET_ASM_SPEC
++#define SUBTARGET_ASM_SPEC "%{mno-octeon-useun} %{!mno-octeon-useun:-mocteon-useun}"
++
++/* Enable backtrace including on machine exceptions by default. */
++
++#undef SUBTARGET_CC1_SPEC
++#define SUBTARGET_CC1_SPEC "%{!fno-asynchronous-unwind-tables:-fasynchronous-unwind-tables}"
++
++/* Without ASM_PREFERRED_EH_DATA_FORMAT, output_call_frame_info emits
++ pointer-sized addresses for FDE addresses. For 64-bit targets, it does
++ it without properly "switching over" to 64-bit as described in the DWARF3
++ spec. GDB can fall back on .eh_frames and misinterpret FDE addresses.
++ Instead let's be explicit and use augmentation to describe the encoding if
++ pointer size is 64. */
++
++#undef ASM_PREFERRED_EH_DATA_FORMAT
++#define ASM_PREFERRED_EH_DATA_FORMAT(CODE, GLOBAL) \
++ ((CODE) == 1 && POINTER_SIZE == 64 \
++ ? (ABI_HAS_64BIT_SYMBOLS ? DW_EH_PE_udata8 : DW_EH_PE_udata4) \
++ : DW_EH_PE_absptr)
++
++/* Link to libc library. */
++
++#undef LIB_SPEC
++#define LIB_SPEC "-lc"
++
++/* Link to startup file. */
++
++#undef STARTFILE_SPEC
++#define STARTFILE_SPEC "crti%O%s crtbegin%O%s crt0%O%s"
++
++/* Default our test-only n64 configuration to -G0 since that is what
++ the kernel uses. */
++
++#undef SUBTARGET_SELF_SPECS
++#define SUBTARGET_SELF_SPECS \
++"%{mabi=64:%{!G*: -G0}}"
++
++/* Pass linker emulation mode for N32. */
++
++#undef LINK_SPEC
++#define LINK_SPEC "\
++%(endian_spec) \
++%{G*} %{mips1} %{mips2} %{mips3} %{mips4} %{mips32} %{mips32r2} %{mips64} \
++%{mips64r2} %{bestGnum} %{shared} %{non_shared} \
++%{mabi=n32:-melf32e%{!EL:b}%{EL:l}octeonn32} \
++%{mabi=64:-melf64e%{!EL:b}%{EL:l}octeon}"
++
++/* Override because of N32. */
++
++#undef LOCAL_LABEL_PREFIX
++#define LOCAL_LABEL_PREFIX ((mips_abi == ABI_N32) ? "." : "$")
++
++/* Append the core number to the GCOV filename FN. */
++
++#define GCOV_TARGET_SUFFIX_LENGTH 2
++#define ADD_GCOV_TARGET_SUFFIX(FN) \
++do \
++ { \
++ char *fn = FN; \
++ int core; \
++ char s[3]; \
++ \
++ asm ("rdhwr %0, $0" : "=r"(core)); \
++ sprintf (s, "%d", core); \
++ strcat (fn, s); \
++ } \
++while (0)
++
++/* Code to unwind through the exception frame. */
++#define MD_UNWIND_SUPPORT "config/mips/octeon-elf-unwind.h"
+diff -Nur a/gcc/config/mips/octeon-elf-unwind.h b/gcc/config/mips/octeon-elf-unwind.h
+--- a/gcc/config/mips/octeon-elf-unwind.h 1970-01-01 01:00:00.000000000 +0100
++++ b/gcc/config/mips/octeon-elf-unwind.h 2010-01-25 09:50:29.035686224 +0100
+@@ -0,0 +1,57 @@
++/* Stack unwinding support through the first exception frame.
++ Copyright (C) 2007 Cavium Networks.
++
++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 2, 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 COPYING. If not, write to
++the Free Software Foundation, 51 Franklin Street, Fifth Floor,
++Boston, MA 02110-1301, USA. */
++
++#define MD_FALLBACK_FRAME_STATE_FOR octeon_elf_fallback_frame_state
++
++/* Check whether this is the cvmx_interrupt_stage2 frame. If the
++ function call was dispatched via k0 assume we are in
++ cvmx_interrupt_stage2. In this case the sp in point to the saved
++ register array. */
++
++static _Unwind_Reason_Code
++octeon_elf_fallback_frame_state (struct _Unwind_Context *context,
++ _Unwind_FrameState *fs)
++{
++ unsigned i;
++ unsigned *pc = context->ra;
++
++ /* Look for "jalr k0". */
++ if (pc[-2] != 0x0340f809)
++ return _URC_END_OF_STACK;
++
++ for (i = 0; i < 32; i++)
++ {
++ fs->regs.reg[i].how = REG_SAVED_OFFSET;
++ fs->regs.reg[i].loc.offset = 8 * i;
++ }
++
++ /* Keep the next frame's sp. This way we have a CFA that points
++ exactly to the register array. */
++ fs->regs.cfa_how = CFA_REG_OFFSET;
++ fs->regs.cfa_reg = STACK_POINTER_REGNUM;
++ fs->regs.cfa_offset = 0;
++
++ /* DEPC is saved as the 35. register. */
++ fs->regs.reg[DWARF_ALT_FRAME_RETURN_COLUMN].how = REG_SAVED_OFFSET;
++ fs->regs.reg[DWARF_ALT_FRAME_RETURN_COLUMN].loc.offset = 8 * 35;
++ fs->retaddr_column = DWARF_ALT_FRAME_RETURN_COLUMN;
++
++ return _URC_NO_REASON;
++}
+diff -Nur a/gcc/config/mips/octeon.h b/gcc/config/mips/octeon.h
+--- a/gcc/config/mips/octeon.h 1970-01-01 01:00:00.000000000 +0100
++++ b/gcc/config/mips/octeon.h 2010-01-25 09:50:29.035686224 +0100
+@@ -0,0 +1,68 @@
++/* Macros for mips*-octeon-* target.
++ Copyright (C) 2004, 2005, 2006 Cavium Networks.
++
++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 2, 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 COPYING. If not, write to
++the Free Software Foundation, 51 Franklin Street, Fifth Floor,
++Boston, MA 02110-1301, USA. */
++
++#define CVMX_SHARED_BSS_FLAGS (SECTION_WRITE | SECTION_BSS)
++
++#undef TARGET_ASM_SELECT_SECTION
++#define TARGET_ASM_SELECT_SECTION octeon_select_section
++
++#undef TARGET_ASM_UNIQUE_SECTION
++#define TARGET_ASM_UNIQUE_SECTION octeon_unique_section
++
++/* Implement ASM_OUTPUT_ALIGNED_DECL_LOCAL. This differs from the
++ generic version only in the use of cvmx_shared attribute. */
++
++#undef ASM_OUTPUT_ALIGNED_DECL_LOCAL
++#define ASM_OUTPUT_ALIGNED_DECL_LOCAL(STREAM, DECL, NAME, SIZE, ALIGN) \
++ do \
++ { \
++ if ((DECL) && TREE_CODE ((DECL)) == VAR_DECL \
++ && lookup_attribute ("cvmx_shared", DECL_ATTRIBUTES (DECL))) \
++ { \
++ fprintf ((STREAM), "%s", LOCAL_ASM_OP); \
++ assemble_name ((STREAM), (NAME)); \
++ fprintf ((STREAM), "\n"); \
++ octeon_output_shared_variable ((STREAM), (DECL), (NAME), \
++ (SIZE), (ALIGN)); \
++ } \
++ else \
++ ASM_OUTPUT_ALIGNED_LOCAL (STREAM, NAME, SIZE, ALIGN); \
++ } \
++ while (0)
++
++
++/* Implement ASM_OUTPUT_ALIGNED_DECL_COMMON. This differs from the mips
++ version only in the use of cvmx_shared attribute. */
++
++#undef ASM_OUTPUT_ALIGNED_DECL_COMMON
++#define ASM_OUTPUT_ALIGNED_DECL_COMMON(STREAM, DECL, NAME, SIZE, ALIGN) \
++ { \
++ if (TREE_CODE ((DECL)) == VAR_DECL \
++ && lookup_attribute ("cvmx_shared", DECL_ATTRIBUTES ((DECL)))) \
++ { \
++ if (TREE_PUBLIC ((DECL)) && DECL_NAME ((DECL))) \
++ targetm.asm_out.globalize_label (asm_out_file, (NAME)); \
++ octeon_output_shared_variable ((STREAM), (DECL), (NAME), \
++ (SIZE), (ALIGN)); \
++ } \
++ else \
++ mips_output_aligned_decl_common ((STREAM), (DECL), (NAME), (SIZE), \
++ (ALIGN)); \
++ }
+diff -Nur a/gcc/config/mips/predicates.md b/gcc/config/mips/predicates.md
+--- a/gcc/config/mips/predicates.md 2009-02-20 16:20:38.000000000 +0100
++++ b/gcc/config/mips/predicates.md 2010-01-25 09:50:29.035686224 +0100
+@@ -211,6 +211,20 @@
+ }
+ })
+
++(define_predicate "mask_low_and_shift_operator"
++ (and (match_code "and")
++ (match_test "GET_CODE (XEXP (op, 0)) == ASHIFT
++ && GET_CODE (XEXP (op, 1)) == CONST_INT
++ && GET_CODE (XEXP (XEXP (op, 0), 1)) == CONST_INT"))
++{
++ int len;
++
++ len = mask_low_and_shift_len (GET_MODE (op),
++ INTVAL (XEXP (XEXP (op, 0), 1)),
++ INTVAL (XEXP (op, 1)));
++ return 0 < len && len <= 32;
++})
++
+ (define_predicate "consttable_operand"
+ (match_test "CONSTANT_P (op)"))
+
+diff -Nur a/gcc/config/mips/sde.h b/gcc/config/mips/sde.h
+--- a/gcc/config/mips/sde.h 2009-02-20 16:20:38.000000000 +0100
++++ b/gcc/config/mips/sde.h 2010-01-25 09:50:29.035686224 +0100
+@@ -19,6 +19,9 @@
+ along with GCC; see the file COPYING3. If not see
+ <http://www.gnu.org/licenses/>. */
+
++#undef TARGET_MIPS_SDE
++#define TARGET_MIPS_SDE 1
++
+ #undef DRIVER_SELF_SPECS
+ #define DRIVER_SELF_SPECS \
+ /* Make sure a -mips option is present. This helps us to pick \
+@@ -90,7 +93,8 @@
+
+ /* Use $5 as a temporary for both MIPS16 and non-MIPS16. */
+ #undef MIPS_EPILOGUE_TEMP_REGNUM
+-#define MIPS_EPILOGUE_TEMP_REGNUM (GP_REG_FIRST + 5)
++#define MIPS_EPILOGUE_TEMP_REGNUM \
++ (cfun->machine->interrupt_handler_p ? K0_REG_NUM : GP_REG_FIRST + 5)
+
+ /* Using long will always be right for size_t and ptrdiff_t, since
+ sizeof(long) must equal sizeof(void *), following from the setting
+diff -Nur a/gcc/config/mips/sdemtk.h b/gcc/config/mips/sdemtk.h
+--- a/gcc/config/mips/sdemtk.h 2009-02-20 16:20:38.000000000 +0100
++++ b/gcc/config/mips/sdemtk.h 2010-01-25 09:50:29.035686224 +0100
+@@ -19,6 +19,8 @@
+ along with GCC; see the file COPYING3. If not see
+ <http://www.gnu.org/licenses/>. */
+
++#define TARGET_MIPS_SDEMTK 1
++
+ #define TARGET_OS_CPP_BUILTINS() \
+ do \
+ { \
+@@ -113,3 +115,12 @@
+ /* ...nor does the call sequence preserve $31. */
+ #undef MIPS_SAVE_REG_FOR_PROFILING_P
+ #define MIPS_SAVE_REG_FOR_PROFILING_P(REGNO) ((REGNO) == GP_REG_FIRST + 31)
++
++/* From mips.h, with mno-float option added. */
++
++#undef MIPS_ARCH_FLOAT_SPEC
++#define MIPS_ARCH_FLOAT_SPEC \
++ "%{mhard-float|msoft-float|mno-float|march=mips*:; \
++ march=vr41*|march=m4k|march=4k*|march=24kc|march=24kec \
++ |march=34kc|march=74kc|march=1004kc|march=5kc|march=octeon|march=xlr: -msoft-float; \
++ march=*: -mhard-float}"
+diff -Nur a/gcc/config/mips/t-crtfm b/gcc/config/mips/t-crtfm
+--- a/gcc/config/mips/t-crtfm 1970-01-01 01:00:00.000000000 +0100
++++ b/gcc/config/mips/t-crtfm 2010-01-25 09:50:29.035686224 +0100
+@@ -0,0 +1,9 @@
++
++EXTRA_MULTILIB_PARTS += crtfastmath.o
++
++EXTRA_PARTS += crtfastmath.o
++
++$(T)crtfastmath.o: $(srcdir)/config/mips/crtfastmath.c $(GCC_PASSES)
++ $(GCC_FOR_TARGET) $(GCC_CFLAGS) $(MULTILIB_CFLAGS) $(INCLUDES) \
++ -c -o $(T)crtfastmath.o $(srcdir)/config/mips/crtfastmath.c
++
+diff -Nur a/gcc/config/mips/t-montavista-elf b/gcc/config/mips/t-montavista-elf
+--- a/gcc/config/mips/t-montavista-elf 1970-01-01 01:00:00.000000000 +0100
++++ b/gcc/config/mips/t-montavista-elf 2010-01-25 09:50:29.035686224 +0100
+@@ -0,0 +1,22 @@
++# MontaVista ELF Configuration.
++# Copyright (C) 2009
++# Free Software Foundation, Inc.
++#
++# 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/>.
++
++MULTILIB_OPTIONS =
++MULTILIB_DIRNAMES =
+diff -Nur a/gcc/config/mips/t-montavista-linux b/gcc/config/mips/t-montavista-linux
+--- a/gcc/config/mips/t-montavista-linux 1970-01-01 01:00:00.000000000 +0100
++++ b/gcc/config/mips/t-montavista-linux 2010-01-25 09:50:29.035686224 +0100
+@@ -0,0 +1,43 @@
++# MontaVista GNU/Linux Configuration.
++# Copyright (C) 2009
++# Free Software Foundation, Inc.
++#
++# 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/>.
++
++# Build big-endian and little-endian support libraries.
++MULTILIB_OPTIONS = mel msoft-float march=octeon mabi=n32/mabi=64
++MULTILIB_DIRNAMES = mel soft-float octeon n32 64
++MULTILIB_EXCEPTIONS = *mel*/*mabi=n32* *mel*/*mabi=64*
++MULTILIB_EXCEPTIONS += *mel*/*march=octeon* march=octeon march=octeon/mabi=n32
++MULTILIB_EXCEPTIONS += march=octeon/mabi=64 msoft-float/march=octeon
++
++# These files must be built for each multilib.
++EXTRA_MULTILIB_PARTS = crtbegin.o crtend.o crtbeginS.o crtendS.o crtbeginT.o
++
++# See comment in montavista-linux.h on STARTFILE_PREFIX_SPEC for how the real
++# directories used in the sysroots are determined. These directories
++# are specified so that (a) they are distinct and (b) removing the
++# components that form part of the sysroot suffix leaves the real
++# directory within the sysroot.
++MULTILIB_OSDIRNAMES = msoft-float/mabi.n32=../lib32/soft-float
++MULTILIB_OSDIRNAMES += msoft-float/mabi.64=../lib64/soft-float
++MULTILIB_OSDIRNAMES += msoft-float/march.octeon/mabi.n32=../lib32/soft-float/octeon
++MULTILIB_OSDIRNAMES += msoft-float/march.octeon/mabi.64=../lib64/soft-float/octeon
++MULTILIB_OSDIRNAMES += mel/msoft-float=!mel/soft-float
++MULTILIB_OSDIRNAMES += msoft-float=!soft-float
++MULTILIB_OSDIRNAMES += mabi.64=../lib64
++MULTILIB_OSDIRNAMES += mabi.n32=../lib32
+diff -Nur a/gcc/config/mips/t-octeon-elf b/gcc/config/mips/t-octeon-elf
+--- a/gcc/config/mips/t-octeon-elf 1970-01-01 01:00:00.000000000 +0100
++++ b/gcc/config/mips/t-octeon-elf 2010-01-25 09:50:29.035686224 +0100
+@@ -0,0 +1,41 @@
++# Don't let CTOR_LIST end up in sdata section.
++
++CRTSTUFF_T_CFLAGS = -G 0 -fno-asynchronous-unwind-tables
++
++# Assemble startup files.
++
++$(T)crti.o: $(srcdir)/config/mips/crti.asm $(GCC_PASSES)
++ $(GCC_FOR_TARGET) $(GCC_CFLAGS) $(MULTILIB_CFLAGS) $(INCLUDES) \
++ -c -o $(T)crti.o -x assembler-with-cpp $(srcdir)/config/mips/crti.asm
++
++$(T)crtn.o: $(srcdir)/config/mips/crtn.asm $(GCC_PASSES)
++ $(GCC_FOR_TARGET) $(GCC_CFLAGS) $(MULTILIB_CFLAGS) $(INCLUDES) \
++ -c -o $(T)crtn.o -x assembler-with-cpp $(srcdir)/config/mips/crtn.asm
++
++# N32 uses TFmode for long double.
++
++TPBIT = tp-bit.c
++
++tp-bit.c: $(srcdir)/config/fp-bit.c
++ echo '#ifdef __MIPSEL__' > tp-bit.c
++ echo '# define FLOAT_BIT_ORDER_MISMATCH' >> tp-bit.c
++ echo '#endif' >> tp-bit.c
++ echo '#if __LDBL_MANT_DIG__ == 113' >> tp-bit.c
++ echo '#define QUIET_NAN_NEGATED' >> tp-bit.c
++ echo '# define TFLOAT' >> tp-bit.c
++ cat $(srcdir)/config/fp-bit.c >> tp-bit.c
++ echo '#endif' >> tp-bit.c
++
++# We must build libgcc2.a with -G 0, in case the user wants to link
++# without the $gp register.
++
++TARGET_LIBGCC2_CFLAGS = -G 0
++
++# Build both ABIs.
++
++MULTILIB_OPTIONS = mabi=n32/mabi=eabi/mabi=64
++MULTILIB_DIRNAMES = n32 eabi n64
++EXTRA_MULTILIB_PARTS = crtbegin.o crtend.o crti.o crtn.o
++
++LIBGCC = stmp-multilib
++INSTALL_LIBGCC = install-multilib
+diff -Nur a/gcc/config/mips/t-sgxx-linux b/gcc/config/mips/t-sgxx-linux
+--- a/gcc/config/mips/t-sgxx-linux 1970-01-01 01:00:00.000000000 +0100
++++ b/gcc/config/mips/t-sgxx-linux 2010-01-25 09:50:29.035686224 +0100
+@@ -0,0 +1,13 @@
++MULTILIB_OPTIONS = muclibc march=mips2/march=mips32 msoft-float EL/EB
++MULTILIB_DIRNAMES = uclibc mips2 mips32 soft-float el eb
++MULTILIB_MATCHES := EL=mel EB=meb \
++ march?mips2=mips2 march?mips2=mips3 march?mips2=mips4 \
++ $(foreach cpu,mips3 mips4 r6000 r4000 vr4100 vr4111 vr4120 vr4130 vr4300 \
++ r4400 r4600 orion r4650 loongson2e loongson2f r8000 r10000 \
++ r12000 r14000 r16000 vr5000 vr5400 vr5500 rm7000 \
++ rm9000,march?mips2=march?$(cpu)) \
++ march?mips32=mips32 march?mips32=mips64 \
++ $(foreach cpu,4kc 4km 4kp 4ksc mips64 5kc 5kf 20kc sb1 sb1a sr71000 \
++ xlr,march?mips32=march?$(cpu))
++MULTILIB_EXCEPTIONS = *muclibc*/*march?mips2* *muclibc*/*march?mips32*
++EXTRA_MULTILIB_PARTS = crtbegin.o crtend.o crtbeginS.o crtendS.o crtbeginT.o
+diff -Nur a/gcc/config/mips/t-sgxxlite-linux b/gcc/config/mips/t-sgxxlite-linux
+--- a/gcc/config/mips/t-sgxxlite-linux 1970-01-01 01:00:00.000000000 +0100
++++ b/gcc/config/mips/t-sgxxlite-linux 2010-01-25 09:50:29.035686224 +0100
+@@ -0,0 +1,5 @@
++MULTILIB_OPTIONS = muclibc msoft-float EL/EB
++MULTILIB_DIRNAMES = uclibc soft-float el eb
++MULTILIB_MATCHES := EL=mel EB=meb
++EXTRA_MULTILIB_PARTS = crtbegin.o crtend.o crtbeginS.o crtendS.o crtbeginT.o
++
+diff -Nur a/gcc/config/mips/t-sgxx-sde b/gcc/config/mips/t-sgxx-sde
+--- a/gcc/config/mips/t-sgxx-sde 1970-01-01 01:00:00.000000000 +0100
++++ b/gcc/config/mips/t-sgxx-sde 2010-01-25 09:50:29.035686224 +0100
+@@ -0,0 +1,15 @@
++# SourceryG++ overrides for SDE builds
++
++# We must build libgcc2.a with -G 0, in case the user wants to link
++# without the $gp register. Use -fno-optimize-sibling-calls in case
++# we have a mixed mips16/non-mips16 environment where a plain "jump"
++# instuction won't work across the divide (no jx instruction).
++# Compile libraries with -mcode-xonly, so that they are link-compatible
++# with both -mcode-readable=pcrel and -mcode-readable=yes.
++TARGET_LIBGCC2_CFLAGS = -G 0 -fno-optimize-sibling-calls -mcode-xonly
++
++MULTILIB_OPTIONS = EL/EB mips16 mfp64/msoft-float/mno-float mcode-readable=no
++MULTILIB_DIRNAMES = el eb mips16 fp64 sof nof spram
++MULTILIB_MATCHES = EL=mel EB=meb mips16=mips16e
++MULTILIB_EXCLUSIONS = mcode-readable=no/!mips16
++MULTILIB_EXCEPTIONS =
+diff -Nur a/gcc/config/mips/t-wrs-linux b/gcc/config/mips/t-wrs-linux
+--- a/gcc/config/mips/t-wrs-linux 1970-01-01 01:00:00.000000000 +0100
++++ b/gcc/config/mips/t-wrs-linux 2010-01-25 09:50:29.035686224 +0100
+@@ -0,0 +1,55 @@
++# Wind River GNU/Linux Configuration.
++# Copyright (C) 2006, 2007
++# Free Software Foundation, Inc.
++#
++# 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/>.
++
++# Build big-endian and little-endian support libraries.
++MULTILIB_OPTIONS = muclibc mel mhard-float march=octeon/march=vr5500 mabi=n32/mabi=64
++MULTILIB_DIRNAMES = uclibc mel hard-float octeon vr5500 n32 64
++MULTILIB_EXCEPTIONS = *muclibc*/*mhard-float*
++MULTILIB_EXCEPTIONS += *muclibc*/*mabi=n32*
++MULTILIB_EXCEPTIONS += *muclibc*/*mabi=64*
++MULTILIB_EXCEPTIONS += *muclibc*/*march=vr5500*
++MULTILIB_EXCEPTIONS += *mel*/*march=vr5500*
++MULTILIB_EXCEPTIONS += march=vr5500*
++MULTILIB_EXCEPTIONS += mhard-float/march=vr5500/*
++MULTILIB_EXCEPTIONS += */march=octeon*
++MULTILIB_EXCEPTIONS += march=octeon march=octeon/mabi=32
++MULTILIB_EXCEPTIONS += mel/mabi=n32 mel/mabi=64
++MULTILIB_EXCEPTIONS += mabi=n32
++# These files must be built for each multilib.
++EXTRA_MULTILIB_PARTS = crtbegin.o crtend.o crtbeginS.o crtendS.o crtbeginT.o
++
++# See comment in wrs-linux.h on STARTFILE_PREFIX_SPEC for how the real
++# directories used in the sysroots are determined. These directories
++# are specified so that (a) they are distinct and (b) removing the
++# components that form part of the sysroot suffix leaves the real
++# directory within the sysroot.
++MULTILIB_OSDIRNAMES = mel/mhard-float/mabi.n32=../lib32/mel/hard-float
++MULTILIB_OSDIRNAMES += mel/mhard-float/mabi.64=../lib64/mel/hard-float
++MULTILIB_OSDIRNAMES += mhard-float/mabi.n32=../lib32/hard-float
++MULTILIB_OSDIRNAMES += mhard-float/mabi.64=../lib64/hard-float
++MULTILIB_OSDIRNAMES += mel/mhard-float=!mel/hard-float
++MULTILIB_OSDIRNAMES += mhard-float/march.vr5500=!hard-float/vr5500
++MULTILIB_OSDIRNAMES += mhard-float=!hard-float
++MULTILIB_OSDIRNAMES += mabi.64=../lib64
++MULTILIB_OSDIRNAMES += march.octeon/mabi.n32=../lib32/octeon
++MULTILIB_OSDIRNAMES += march.octeon/mabi.64=../lib64/octeon
++MULTILIB_OSDIRNAMES += muclibc/mel=!uclibc/mel
++MULTILIB_OSDIRNAMES += muclibc=!uclibc
++
+diff -Nur a/gcc/config/mips/wrs-linux.h b/gcc/config/mips/wrs-linux.h
+--- a/gcc/config/mips/wrs-linux.h 1970-01-01 01:00:00.000000000 +0100
++++ b/gcc/config/mips/wrs-linux.h 2010-01-25 09:50:29.035686224 +0100
+@@ -0,0 +1,65 @@
++/* Wind River GNU/Linux Configuration.
++ Copyright (C) 2006, 2007
++ Free Software Foundation, Inc.
++
++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/>. */
++
++/* Override linux64.h to default to O32. */
++#undef DRIVER_SELF_SPECS
++#define DRIVER_SELF_SPECS \
++ BASE_DRIVER_SELF_SPECS, \
++ LINUX_DRIVER_SELF_SPECS \
++ " %{!EB:%{!EL:%(endian_spec)}}" \
++ " %{!mabi=*: -mabi=32}"
++
++/* We do not need to provide an explicit big-endian multilib. */
++#undef MULTILIB_DEFAULTS
++#define MULTILIB_DEFAULTS \
++ { "meb", "mabi=32" }
++
++/* The GLIBC headers are in /usr/include, relative to the sysroot; the
++ uClibc headers are in /uclibc/usr/include. */
++#undef SYSROOT_HEADERS_SUFFIX_SPEC
++#define SYSROOT_HEADERS_SUFFIX_SPEC \
++ "%{muclibc:/uclibc}"
++
++/* The various C libraries each have their own subdirectory. */
++#undef SYSROOT_SUFFIX_SPEC
++#define SYSROOT_SUFFIX_SPEC \
++ "%{muclibc:%{mel:/uclibc/mel ; \
++ :/uclibc} ; \
++ mel:%{mhard-float:/mel/hard-float ; \
++ :/mel} ; \
++ march=octeon:/octeon ; \
++ march=vr5500:%{mhard-float:/hard-float/vr5500} ; \
++ mhard-float:/hard-float}"
++
++/* MULTILIB_OSDIRNAMES provides directory names used in two ways:
++ relative to $target/lib/ in the GCC installation, and relative to
++ lib/ and usr/lib/ in a sysroot. For the latter, we want names such
++ as plain ../lib64, but these cannot be used outside the sysroot
++ because different multilibs would be mapped to the same directory.
++ Directories are searched both with and without the multilib suffix,
++ so it suffices if the directory without the suffix is correct
++ within the sysroot while the directory with the suffix doesn't
++ exist. We use STARTFILE_PREFIX_SPEC to achieve the desired
++ effect. */
++#undef STARTFILE_PREFIX_SPEC
++#define STARTFILE_PREFIX_SPEC \
++ "%{mabi=32: /usr/local/lib/ /lib/ /usr/lib/} \
++ %{mabi=n32: /usr/local/lib32/ /lib32/ /usr/lib32/} \
++ %{mabi=64: /usr/local/lib64/ /lib64/ /usr/lib64/}"
+diff -Nur a/gcc/config/mips/xlr.md b/gcc/config/mips/xlr.md
+--- a/gcc/config/mips/xlr.md 2008-06-06 16:24:57.000000000 +0200
++++ b/gcc/config/mips/xlr.md 2010-01-25 09:50:29.035686224 +0100
+@@ -1,5 +1,5 @@
+ ;; DFA-based pipeline description for the XLR.
+-;; Copyright (C) 2008 Free Software Foundation, Inc.
++;; Copyright (C) 2008, 2009 Free Software Foundation, Inc.
+ ;;
+ ;; xlr.md Machine Description for the RMI XLR Microprocessor
+ ;; This file is part of GCC.
+@@ -31,7 +31,7 @@
+ ;; Integer arithmetic instructions.
+ (define_insn_reservation "ir_xlr_alu" 1
+ (and (eq_attr "cpu" "xlr")
+- (eq_attr "type" "arith,shift,clz,const,unknown,multi,nop,trap"))
++ (eq_attr "type" "move,arith,shift,clz,logical,signext,const,unknown,multi,nop,trap"))
+ "xlr_main_pipe")
+
+ ;; Integer arithmetic instructions.
+diff -Nur a/gcc/config/print-sysroot-suffix.sh b/gcc/config/print-sysroot-suffix.sh
+--- a/gcc/config/print-sysroot-suffix.sh 1970-01-01 01:00:00.000000000 +0100
++++ b/gcc/config/print-sysroot-suffix.sh 2010-01-25 09:50:29.035686224 +0100
+@@ -0,0 +1,154 @@
++#! /bin/sh
++# Script to generate SYSROOT_SUFFIX_SPEC equivalent to MULTILIB_OSDIRNAMES
++# Arguments are MULTILIB_OSDIRNAMES, MULTILIB_OPTIONS, MULTILIB_MATCHES
++# and MULTILIB_ALIASES.
++
++# Copyright (C) 2009 Free Software Foundation, Inc.
++
++# 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/>.
++
++# This shell script produces a header file fragment that defines
++# SYSROOT_SUFFIX_SPEC. It assumes that the sysroots will have the same
++# structure and names used by the multilibs.
++
++# Invocation:
++# print-sysroot-suffix.sh \
++# MULTILIB_OSDIRNAMES \
++# MULTILIB_OPTIONS \
++# MULTILIB_MATCHES \
++# > t-sysroot-suffix.h
++
++# The three options exactly correspond to the variables of the same
++# names defined in the tmake_file fragments.
++
++# Example:
++# sh ./gcc/config/print-sysroot-suffix.sh "a=A" "a b/c/d" ""
++# =>
++# #undef SYSROOT_SUFFIX_SPEC
++# #define SYSROOT_SUFFIX_SPEC "" \
++# "%{a:" \
++# "%{b:A/b/;" \
++# "c:A/c/;" \
++# "d:A/d/;" \
++# ":A/};" \
++# ":}"
++
++# The script uses temporary subscripts in order to permit a recursive
++# algorithm without the use of functions.
++
++set -e
++
++dirnames="$1"
++options="$2"
++matches="$3"
++aliases="$4"
++
++cat > print-sysroot-suffix3.sh <<\EOF
++#! /bin/sh
++# Print all the multilib matches for this option
++result="$1"
++EOF
++for x in $matches; do
++ l=`echo $x | sed -e 's/=.*$//' -e 's/?/=/g'`
++ r=`echo $x | sed -e 's/^.*=//' -e 's/?/=/g'`
++ echo "[ \"\$1\" = \"$l\" ] && result=\"\$result|$r\"" >> print-sysroot-suffix3.sh
++done
++echo 'echo $result' >> print-sysroot-suffix3.sh
++chmod +x print-sysroot-suffix3.sh
++
++cat > print-sysroot-suffix2.sh <<\EOF
++#! /bin/sh
++# Recursive script to enumerate all multilib combinations, match against
++# multilib directories and output a spec string of the result.
++# Will fold identical trees.
++
++padding="$1"
++optstring="$2"
++shift 2
++n="\" \\
++$padding\""
++if [ $# = 0 ]; then
++ case $optstring in
++EOF
++for x in $aliases; do
++ l=`echo $x | sed -e 's/=.*$//' -e 's/?/=/g'`
++ r=`echo $x | sed -e 's/^.*=//' -e 's/?/=/g'`
++ echo "/$r/) optstring=\"/$l/\" ;;" >> print-sysroot-suffix2.sh
++done
++echo " esac" >> print-sysroot-suffix2.sh
++
++pat=
++for x in $dirnames; do
++ p=`echo $x | sed -e 's,=!,/$=/,'`
++ pat="$pat -e 's=^//$p='"
++done
++echo ' optstring=`echo "/$optstring" | sed '"$pat\`" >> print-sysroot-suffix2.sh
++cat >> print-sysroot-suffix2.sh <<\EOF
++ case $optstring in
++ //*)
++ ;;
++ *)
++ echo "$optstring"
++ ;;
++ esac
++else
++ thisopt="$1"
++ shift
++ bit=
++ lastcond=
++ result=
++ for x in `echo "$thisopt" | sed -e 's,/, ,g'`; do
++ case $x in
++EOF
++for x in `echo "$options" | sed -e 's,/, ,g'`; do
++ match=`./print-sysroot-suffix3.sh "$x"`
++ echo "$x) optmatch=\"$match\" ;;" >> print-sysroot-suffix2.sh
++done
++cat >> print-sysroot-suffix2.sh <<\EOF
++ esac
++ bit=`"$0" "$padding " "$optstring$x/" "$@"`
++ if [ -z "$lastopt" ]; then
++ lastopt="$optmatch"
++ else
++ if [ "$lastbit" = "$bit" ]; then
++ lastopt="$lastopt|$optmatch"
++ else
++ result="$result$lastopt:$lastbit;$n"
++ lastopt="$optmatch"
++ fi
++ fi
++ lastbit="$bit"
++ done
++ bit=`"$0" "$padding " "$optstring" "$@"`
++ if [ "$bit" = "$lastbit" ]; then
++ if [ -z "$result" ]; then
++ echo "$bit"
++ else
++ echo "$n%{$result:$bit}"
++ fi
++ else
++ echo "$n%{$result$lastopt:$lastbit;$n:$bit}"
++ fi
++fi
++EOF
++
++chmod +x ./print-sysroot-suffix2.sh
++result=`./print-sysroot-suffix2.sh "" "/" $options`
++echo "#undef SYSROOT_SUFFIX_SPEC"
++echo "#define SYSROOT_SUFFIX_SPEC \"$result\""
++rm print-sysroot-suffix2.sh
++rm print-sysroot-suffix3.sh
+diff -Nur a/gcc/config/rs6000/e500mc.h b/gcc/config/rs6000/e500mc.h
+--- a/gcc/config/rs6000/e500mc.h 1970-01-01 01:00:00.000000000 +0100
++++ b/gcc/config/rs6000/e500mc.h 2010-01-25 09:50:29.035686224 +0100
+@@ -0,0 +1,46 @@
++/* Core target definitions for GNU compiler
++ for IBM RS/6000 PowerPC targeted to embedded ELF systems.
++ Copyright (C) 1995, 1996, 2000, 2003, 2004, 2007 Free Software Foundation, Inc.
++ Contributed by Cygnus Support.
++
++ 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/>. */
++
++/* Add -meabi to target flags. */
++#undef TARGET_DEFAULT
++#define TARGET_DEFAULT (MASK_POWERPC | MASK_NEW_MNEMONICS | MASK_EABI)
++
++#undef TARGET_VERSION
++#define TARGET_VERSION fprintf (stderr, " (PowerPC Embedded)");
++
++#undef TARGET_OS_CPP_BUILTINS
++#define TARGET_OS_CPP_BUILTINS() \
++ do \
++ { \
++ builtin_define_std ("PPC"); \
++ builtin_define ("__embedded__"); \
++ builtin_assert ("system=embedded"); \
++ builtin_assert ("cpu=powerpc"); \
++ builtin_assert ("machine=powerpc"); \
++ TARGET_OS_SYSV_CPP_BUILTINS (); \
++ } \
++ while (0)
++
++#undef CC1_EXTRA_SPEC
++#define CC1_EXTRA_SPEC "-maix-struct-return"
++
++#undef ASM_DEFAULT_SPEC
++#define ASM_DEFAULT_SPEC "-mppc%{m64:64} -me500mc"
+diff -Nur a/gcc/config/rs6000/eabi.asm b/gcc/config/rs6000/eabi.asm
+--- a/gcc/config/rs6000/eabi.asm 2009-04-10 01:23:07.000000000 +0200
++++ b/gcc/config/rs6000/eabi.asm 2010-01-25 09:50:29.035686224 +0100
+@@ -230,7 +230,7 @@
+ r11 has the address of .LCTOC1 in it.
+ r12 has the value to add to each pointer
+ r13 .. r31 are unchanged */
+-
++#ifdef _RELOCATABLE
+ FUNC_START(__eabi_convert)
+ cmplw 1,3,4 /* any pointers to convert? */
+ subf 5,3,4 /* calculate number of words to convert */
+@@ -285,5 +285,5 @@
+ blr
+
+ FUNC_END(__eabi_uconvert)
+-
++#endif
+ #endif
+diff -Nur a/gcc/config/rs6000/eabi-ci.asm b/gcc/config/rs6000/eabi-ci.asm
+--- a/gcc/config/rs6000/eabi-ci.asm 2009-04-10 01:23:07.000000000 +0200
++++ b/gcc/config/rs6000/eabi-ci.asm 2010-01-25 09:50:29.035686224 +0100
+@@ -98,6 +98,7 @@
+ /* Head of __init function used for static constructors. */
+ .section ".init","ax"
+ .align 2
++FUNC_START(_init)
+ FUNC_START(__init)
+ stwu 1,-16(1)
+ mflr 0
+@@ -106,6 +107,7 @@
+ /* Head of __fini function used for static destructors. */
+ .section ".fini","ax"
+ .align 2
++FUNC_START(_fini)
+ FUNC_START(__fini)
+ stwu 1,-16(1)
+ mflr 0
+diff -Nur a/gcc/config/rs6000/eabi.h b/gcc/config/rs6000/eabi.h
+--- a/gcc/config/rs6000/eabi.h 2007-08-02 12:49:31.000000000 +0200
++++ b/gcc/config/rs6000/eabi.h 2010-01-25 09:50:29.035686224 +0100
+@@ -23,10 +23,6 @@
+ #undef TARGET_DEFAULT
+ #define TARGET_DEFAULT (MASK_POWERPC | MASK_NEW_MNEMONICS | MASK_EABI)
+
+-/* Invoke an initializer function to set up the GOT. */
+-#define NAME__MAIN "__eabi"
+-#define INVOKE__main
+-
+ #undef TARGET_VERSION
+ #define TARGET_VERSION fprintf (stderr, " (PowerPC Embedded)");
+
+@@ -42,3 +38,20 @@
+ TARGET_OS_SYSV_CPP_BUILTINS (); \
+ } \
+ while (0)
++
++/* Add -te500v1 and -te500v2 options for convenience in generating
++ multilibs. */
++#undef CC1_EXTRA_SPEC
++#define CC1_EXTRA_SPEC \
++ "%{te500v1: -mcpu=8540 -mfloat-gprs=single -mspe=yes -mabi=spe} " \
++ "%{te500v2: -mcpu=8548 -mfloat-gprs=double -mspe=yes -mabi=spe} " \
++ "%{te600: -mcpu=7400 -maltivec -mabi=altivec}" \
++ "%{te500mc: -mcpu=e500mc -maix-struct-return}"
++
++#undef ASM_DEFAULT_SPEC
++#define ASM_DEFAULT_SPEC \
++ "%{te500v1:-mppc -mspe -me500 ; \
++ te500v2:-mppc -mspe -me500 ; \
++ te600:-mppc -maltivec ; \
++ te500mc:-mppc -me500mc ; \
++ :-mppc%{m64:64}}"
+diff -Nur a/gcc/config/rs6000/linux.h b/gcc/config/rs6000/linux.h
+--- a/gcc/config/rs6000/linux.h 2007-08-02 12:49:31.000000000 +0200
++++ b/gcc/config/rs6000/linux.h 2010-01-25 09:50:29.035686224 +0100
+@@ -128,3 +128,29 @@
+ #ifdef TARGET_DEFAULT_LONG_DOUBLE_128
+ #define RS6000_DEFAULT_LONG_DOUBLE_SIZE 128
+ #endif
++
++/* Add -te500v1 and -te500v2 options for convenience in generating
++ multilibs. */
++#undef CC1_EXTRA_SPEC
++#define CC1_EXTRA_SPEC \
++ "%{te500v1: -mcpu=8540 -mfloat-gprs=single -mspe=yes -mabi=spe} " \
++ "%{te500v2: -mcpu=8548 -mfloat-gprs=double -mspe=yes -mabi=spe} " \
++ "%{te600: -mcpu=7400 -maltivec -mabi=altivec}" \
++ "%{te500mc: -mcpu=e500mc}"
++
++#undef ASM_DEFAULT_SPEC
++#define ASM_DEFAULT_SPEC \
++ "%{te500v1:-mppc -mspe -me500 ; \
++ te500v2:-mppc -mspe -me500 ; \
++ te600:-mppc -maltivec ; \
++ te500mc:-me500mc ; \
++ :-mppc%{m64:64}}"
++
++/* The various C libraries each have their own subdirectory. */
++#undef SYSROOT_SUFFIX_SPEC
++#define SYSROOT_SUFFIX_SPEC \
++ "%{msoft-float:/nof ; \
++ te600:/te600 ; \
++ te500v1:/te500v1 ; \
++ te500v2:/te500v2 ; \
++ te500mc:/te500mc}"
+diff -Nur a/gcc/config/rs6000/montavista-linux.h b/gcc/config/rs6000/montavista-linux.h
+--- a/gcc/config/rs6000/montavista-linux.h 1970-01-01 01:00:00.000000000 +0100
++++ b/gcc/config/rs6000/montavista-linux.h 2010-01-25 09:50:29.035686224 +0100
+@@ -0,0 +1,41 @@
++/* MontaVista GNU/Linux Configuration.
++ Copyright (C) 2009
++ Free Software Foundation, Inc.
++
++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/>. */
++
++/* Add -te500v2 option for convenience in generating multilibs. */
++#undef CC1_EXTRA_SPEC
++#define CC1_EXTRA_SPEC \
++ "%{te500v2: -mcpu=8548 -mfloat-gprs=double -mspe=yes -mabi=spe} " \
++ "%{te600: -mcpu=7400 -maltivec -mabi=altivec}" \
++ "%{te500mc: -mcpu=e500mc}"
++
++#undef ASM_DEFAULT_SPEC
++#define ASM_DEFAULT_SPEC \
++ "%{te500v2:-mppc -mspe -me500 ; \
++ te600:-mppc -maltivec ; \
++ te500mc:-me500mc ; \
++ :-mppc}"
++
++/* The various C libraries each have their own subdirectory. */
++#undef SYSROOT_SUFFIX_SPEC
++#define SYSROOT_SUFFIX_SPEC \
++ "%{msoft-float:/soft-float ; \
++ te600:/te600 ; \
++ te500v2:/te500v2 ; \
++ te500mc:/te500mc}"
+diff -Nur a/gcc/config/rs6000/option-defaults.h b/gcc/config/rs6000/option-defaults.h
+--- a/gcc/config/rs6000/option-defaults.h 1970-01-01 01:00:00.000000000 +0100
++++ b/gcc/config/rs6000/option-defaults.h 2010-01-25 09:50:29.035686224 +0100
+@@ -0,0 +1,64 @@
++/* Definitions of default options for config/rs6000 configurations.
++ Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
++ 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009
++ Free Software Foundation, Inc.
++
++ 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/>. */
++
++/* This header needs to be included after any other headers affecting
++ TARGET_DEFAULT. */
++
++#if TARGET_AIX
++#define OPT_64 "maix64"
++#define OPT_32 "maix32"
++#else
++#define OPT_64 "m64"
++#define OPT_32 "m32"
++#endif
++
++#ifndef MASK_64BIT
++#define MASK_64BIT 0
++#endif
++
++#if TARGET_DEFAULT & MASK_64BIT
++#define OPT_ARCH64 "!"OPT_32
++#define OPT_ARCH32 OPT_32
++#else
++#define OPT_ARCH64 OPT_64
++#define OPT_ARCH32 "!"OPT_64
++#endif
++
++/* Support for a compile-time default CPU, et cetera. The rules are:
++ --with-cpu is ignored if -mcpu is specified; likewise --with-cpu-32
++ and --with-cpu-64.
++ --with-tune is ignored if -mtune is specified; likewise --with-tune-32
++ and --with-tune-64.
++ --with-float is ignored if -mhard-float or -msoft-float are
++ specified. */
++#define OPTION_DEFAULT_SPECS \
++ {"cpu", "%{mcpu=*|te500mc|te500v1|te500v2|te600:;:-mcpu=%(VALUE)}" }, \
++ {"cpu_32", "%{" OPT_ARCH32 ":%{mcpu=*|te500mc|te500v1|te500v2|te600:;:-mcpu=%(VALUE)}}" }, \
++ {"cpu_64", "%{" OPT_ARCH64 ":%{mcpu=*|te500mc|te500v1|te500v2|te600:;:-mcpu=%(VALUE)}}" }, \
++ {"tune", "%{!mtune=*:-mtune=%(VALUE)}" }, \
++ {"tune_32", "%{" OPT_ARCH32 ":%{!mtune=*:-mtune=%(VALUE)}}" }, \
++ {"tune_64", "%{" OPT_ARCH64 ":%{!mtune=*:-mtune=%(VALUE)}}" }, \
++ {"float", "%{!msoft-float:%{!mhard-float:-m%(VALUE)-float}}" }
+diff -Nur a/gcc/config/rs6000/paired.md b/gcc/config/rs6000/paired.md
+--- a/gcc/config/rs6000/paired.md 2009-04-10 01:23:07.000000000 +0200
++++ b/gcc/config/rs6000/paired.md 2010-01-25 09:50:29.035686224 +0100
+@@ -27,7 +27,7 @@
+ (UNSPEC_EXTODD_V2SF 333)
+ ])
+
+-(define_insn "negv2sf2"
++(define_insn "paired_negv2sf2"
+ [(set (match_operand:V2SF 0 "gpc_reg_operand" "=f")
+ (neg:V2SF (match_operand:V2SF 1 "gpc_reg_operand" "f")))]
+ "TARGET_PAIRED_FLOAT"
+@@ -41,7 +41,7 @@
+ "ps_rsqrte %0,%1"
+ [(set_attr "type" "fp")])
+
+-(define_insn "absv2sf2"
++(define_insn "paired_absv2sf2"
+ [(set (match_operand:V2SF 0 "gpc_reg_operand" "=f")
+ (abs:V2SF (match_operand:V2SF 1 "gpc_reg_operand" "f")))]
+ "TARGET_PAIRED_FLOAT"
+@@ -55,7 +55,7 @@
+ "ps_nabs %0,%1"
+ [(set_attr "type" "fp")])
+
+-(define_insn "addv2sf3"
++(define_insn "paired_addv2sf3"
+ [(set (match_operand:V2SF 0 "gpc_reg_operand" "=f")
+ (plus:V2SF (match_operand:V2SF 1 "gpc_reg_operand" "%f")
+ (match_operand:V2SF 2 "gpc_reg_operand" "f")))]
+@@ -63,7 +63,7 @@
+ "ps_add %0,%1,%2"
+ [(set_attr "type" "fp")])
+
+-(define_insn "subv2sf3"
++(define_insn "paired_subv2sf3"
+ [(set (match_operand:V2SF 0 "gpc_reg_operand" "=f")
+ (minus:V2SF (match_operand:V2SF 1 "gpc_reg_operand" "f")
+ (match_operand:V2SF 2 "gpc_reg_operand" "f")))]
+@@ -71,7 +71,7 @@
+ "ps_sub %0,%1,%2"
+ [(set_attr "type" "fp")])
+
+-(define_insn "mulv2sf3"
++(define_insn "paired_mulv2sf3"
+ [(set (match_operand:V2SF 0 "gpc_reg_operand" "=f")
+ (mult:V2SF (match_operand:V2SF 1 "gpc_reg_operand" "%f")
+ (match_operand:V2SF 2 "gpc_reg_operand" "f")))]
+@@ -86,7 +86,7 @@
+ "ps_res %0,%1"
+ [(set_attr "type" "fp")])
+
+-(define_insn "divv2sf3"
++(define_insn "paired_divv2sf3"
+ [(set (match_operand:V2SF 0 "gpc_reg_operand" "=f")
+ (div:V2SF (match_operand:V2SF 1 "gpc_reg_operand" "f")
+ (match_operand:V2SF 2 "gpc_reg_operand" "f")))]
+diff -Nur a/gcc/config/rs6000/rs6000.c b/gcc/config/rs6000/rs6000.c
+--- a/gcc/config/rs6000/rs6000.c 2009-03-17 21:18:21.000000000 +0100
++++ b/gcc/config/rs6000/rs6000.c 2010-01-25 09:50:29.035686224 +0100
+@@ -919,6 +919,7 @@
+ static bool rs6000_is_opaque_type (const_tree);
+ static rtx rs6000_dwarf_register_span (rtx);
+ static void rs6000_init_dwarf_reg_sizes_extra (tree);
++static int rs6000_commutative_operand_precedence (const_rtx, int);
+ static rtx rs6000_legitimize_tls_address (rtx, enum tls_model);
+ static void rs6000_output_dwarf_dtprel (FILE *, int, rtx) ATTRIBUTE_UNUSED;
+ static rtx rs6000_tls_get_addr (void);
+@@ -1194,6 +1195,10 @@
+ #undef TARGET_VECTOR_OPAQUE_P
+ #define TARGET_VECTOR_OPAQUE_P rs6000_is_opaque_type
+
++#undef TARGET_COMMUTATIVE_OPERAND_PRECEDENCE
++#define TARGET_COMMUTATIVE_OPERAND_PRECEDENCE \
++ rs6000_commutative_operand_precedence
++
+ #undef TARGET_DWARF_REGISTER_SPAN
+ #define TARGET_DWARF_REGISTER_SPAN rs6000_dwarf_register_span
+
+@@ -4682,16 +4687,19 @@
+ if (TARGET_ALTIVEC)
+ global_regs[VSCR_REGNO] = 1;
+
+- if (TARGET_ALTIVEC_ABI)
+- {
+- for (i = FIRST_ALTIVEC_REGNO; i < FIRST_ALTIVEC_REGNO + 20; ++i)
+- call_used_regs[i] = call_really_used_regs[i] = 1;
++ /* If we are not using the AltiVec ABI, pretend that the normally
++ call-saved registers are also call-used. We could use them
++ normally if we saved and restored them in the prologue; that
++ would require using the alignment padding around the register
++ save area, and some care with unwinding information. */
++ if (! TARGET_ALTIVEC_ABI)
++ for (i = FIRST_ALTIVEC_REGNO + 20; i <= LAST_ALTIVEC_REGNO; ++i)
++ call_used_regs[i] = call_really_used_regs[i] = 1;
+
+- /* AIX reserves VR20:31 in non-extended ABI mode. */
+- if (TARGET_XCOFF)
+- for (i = FIRST_ALTIVEC_REGNO + 20; i < FIRST_ALTIVEC_REGNO + 32; ++i)
+- fixed_regs[i] = call_used_regs[i] = call_really_used_regs[i] = 1;
+- }
++ if (TARGET_ALTIVEC_ABI && TARGET_XCOFF)
++ /* AIX reserves VR20:31 in non-extended ABI mode. */
++ for (i = FIRST_ALTIVEC_REGNO + 20; i < FIRST_ALTIVEC_REGNO + 32; ++i)
++ fixed_regs[i] = call_used_regs[i] = call_really_used_regs[i] = 1;
+ }
+
+ /* Try to output insns to set TARGET equal to the constant C if it can
+@@ -7507,10 +7515,10 @@
+ { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_sums", ALTIVEC_BUILTIN_VEC_SUMS },
+ { MASK_ALTIVEC, CODE_FOR_nothing, "__builtin_vec_xor", ALTIVEC_BUILTIN_VEC_XOR },
+
+- { 0, CODE_FOR_divv2sf3, "__builtin_paired_divv2sf3", PAIRED_BUILTIN_DIVV2SF3 },
+- { 0, CODE_FOR_addv2sf3, "__builtin_paired_addv2sf3", PAIRED_BUILTIN_ADDV2SF3 },
+- { 0, CODE_FOR_subv2sf3, "__builtin_paired_subv2sf3", PAIRED_BUILTIN_SUBV2SF3 },
+- { 0, CODE_FOR_mulv2sf3, "__builtin_paired_mulv2sf3", PAIRED_BUILTIN_MULV2SF3 },
++ { 0, CODE_FOR_paired_divv2sf3, "__builtin_paired_divv2sf3", PAIRED_BUILTIN_DIVV2SF3 },
++ { 0, CODE_FOR_paired_addv2sf3, "__builtin_paired_addv2sf3", PAIRED_BUILTIN_ADDV2SF3 },
++ { 0, CODE_FOR_paired_subv2sf3, "__builtin_paired_subv2sf3", PAIRED_BUILTIN_SUBV2SF3 },
++ { 0, CODE_FOR_paired_mulv2sf3, "__builtin_paired_mulv2sf3", PAIRED_BUILTIN_MULV2SF3 },
+ { 0, CODE_FOR_paired_muls0, "__builtin_paired_muls0", PAIRED_BUILTIN_MULS0 },
+ { 0, CODE_FOR_paired_muls1, "__builtin_paired_muls1", PAIRED_BUILTIN_MULS1 },
+ { 0, CODE_FOR_paired_merge00, "__builtin_paired_merge00", PAIRED_BUILTIN_MERGE00 },
+@@ -7519,10 +7527,10 @@
+ { 0, CODE_FOR_paired_merge11, "__builtin_paired_merge11", PAIRED_BUILTIN_MERGE11 },
+
+ /* Place holder, leave as first spe builtin. */
+- { 0, CODE_FOR_spe_evaddw, "__builtin_spe_evaddw", SPE_BUILTIN_EVADDW },
+- { 0, CODE_FOR_spe_evand, "__builtin_spe_evand", SPE_BUILTIN_EVAND },
++ { 0, CODE_FOR_addv2si3, "__builtin_spe_evaddw", SPE_BUILTIN_EVADDW },
++ { 0, CODE_FOR_andv2si3, "__builtin_spe_evand", SPE_BUILTIN_EVAND },
+ { 0, CODE_FOR_spe_evandc, "__builtin_spe_evandc", SPE_BUILTIN_EVANDC },
+- { 0, CODE_FOR_spe_evdivws, "__builtin_spe_evdivws", SPE_BUILTIN_EVDIVWS },
++ { 0, CODE_FOR_divv2si3, "__builtin_spe_evdivws", SPE_BUILTIN_EVDIVWS },
+ { 0, CODE_FOR_spe_evdivwu, "__builtin_spe_evdivwu", SPE_BUILTIN_EVDIVWU },
+ { 0, CODE_FOR_spe_eveqv, "__builtin_spe_eveqv", SPE_BUILTIN_EVEQV },
+ { 0, CODE_FOR_spe_evfsadd, "__builtin_spe_evfsadd", SPE_BUILTIN_EVFSADD },
+@@ -7798,7 +7806,7 @@
+
+ /* The SPE unary builtins must start with SPE_BUILTIN_EVABS and
+ end with SPE_BUILTIN_EVSUBFUSIAAW. */
+- { 0, CODE_FOR_spe_evabs, "__builtin_spe_evabs", SPE_BUILTIN_EVABS },
++ { 0, CODE_FOR_absv2si2, "__builtin_spe_evabs", SPE_BUILTIN_EVABS },
+ { 0, CODE_FOR_spe_evaddsmiaaw, "__builtin_spe_evaddsmiaaw", SPE_BUILTIN_EVADDSMIAAW },
+ { 0, CODE_FOR_spe_evaddssiaaw, "__builtin_spe_evaddssiaaw", SPE_BUILTIN_EVADDSSIAAW },
+ { 0, CODE_FOR_spe_evaddumiaaw, "__builtin_spe_evaddumiaaw", SPE_BUILTIN_EVADDUMIAAW },
+@@ -7830,9 +7838,9 @@
+ /* Place-holder. Leave as last unary SPE builtin. */
+ { 0, CODE_FOR_spe_evsubfusiaaw, "__builtin_spe_evsubfusiaaw", SPE_BUILTIN_EVSUBFUSIAAW },
+
+- { 0, CODE_FOR_absv2sf2, "__builtin_paired_absv2sf2", PAIRED_BUILTIN_ABSV2SF2 },
++ { 0, CODE_FOR_paired_absv2sf2, "__builtin_paired_absv2sf2", PAIRED_BUILTIN_ABSV2SF2 },
+ { 0, CODE_FOR_nabsv2sf2, "__builtin_paired_nabsv2sf2", PAIRED_BUILTIN_NABSV2SF2 },
+- { 0, CODE_FOR_negv2sf2, "__builtin_paired_negv2sf2", PAIRED_BUILTIN_NEGV2SF2 },
++ { 0, CODE_FOR_paired_negv2sf2, "__builtin_paired_negv2sf2", PAIRED_BUILTIN_NEGV2SF2 },
+ { 0, CODE_FOR_sqrtv2sf2, "__builtin_paired_sqrtv2sf2", PAIRED_BUILTIN_SQRTV2SF2 },
+ { 0, CODE_FOR_resv2sf2, "__builtin_paired_resv2sf2", PAIRED_BUILTIN_RESV2SF2 }
+ };
+@@ -9370,6 +9378,8 @@
+ static void
+ rs6000_init_builtins (void)
+ {
++ tree tdecl;
++
+ V2SI_type_node = build_vector_type (intSI_type_node, 2);
+ V2SF_type_node = build_vector_type (float_type_node, 2);
+ V4HI_type_node = build_vector_type (intHI_type_node, 4);
+@@ -9407,60 +9417,75 @@
+ float_type_internal_node = float_type_node;
+ void_type_internal_node = void_type_node;
+
+- (*lang_hooks.decls.pushdecl) (build_decl (TYPE_DECL,
+- get_identifier ("__bool char"),
+- bool_char_type_node));
+- (*lang_hooks.decls.pushdecl) (build_decl (TYPE_DECL,
+- get_identifier ("__bool short"),
+- bool_short_type_node));
+- (*lang_hooks.decls.pushdecl) (build_decl (TYPE_DECL,
+- get_identifier ("__bool int"),
+- bool_int_type_node));
+- (*lang_hooks.decls.pushdecl) (build_decl (TYPE_DECL,
+- get_identifier ("__pixel"),
+- pixel_type_node));
++ tdecl = build_decl (TYPE_DECL, get_identifier ("__bool char"),
++ bool_char_type_node);
++ TYPE_NAME (bool_char_type_node) = tdecl;
++ (*lang_hooks.decls.pushdecl) (tdecl);
++ tdecl = build_decl (TYPE_DECL, get_identifier ("__bool short"),
++ bool_short_type_node);
++ TYPE_NAME (bool_short_type_node) = tdecl;
++ (*lang_hooks.decls.pushdecl) (tdecl);
++ tdecl = build_decl (TYPE_DECL, get_identifier ("__bool int"),
++ bool_int_type_node);
++ TYPE_NAME (bool_int_type_node) = tdecl;
++ (*lang_hooks.decls.pushdecl) (tdecl);
++ tdecl = build_decl (TYPE_DECL, get_identifier ("__pixel"),
++ pixel_type_node);
++ TYPE_NAME (pixel_type_node) = tdecl;
++ (*lang_hooks.decls.pushdecl) (tdecl);
+
+ bool_V16QI_type_node = build_vector_type (bool_char_type_node, 16);
+ bool_V8HI_type_node = build_vector_type (bool_short_type_node, 8);
+ bool_V4SI_type_node = build_vector_type (bool_int_type_node, 4);
+ pixel_V8HI_type_node = build_vector_type (pixel_type_node, 8);
+
+- (*lang_hooks.decls.pushdecl) (build_decl (TYPE_DECL,
+- get_identifier ("__vector unsigned char"),
+- unsigned_V16QI_type_node));
+- (*lang_hooks.decls.pushdecl) (build_decl (TYPE_DECL,
+- get_identifier ("__vector signed char"),
+- V16QI_type_node));
+- (*lang_hooks.decls.pushdecl) (build_decl (TYPE_DECL,
+- get_identifier ("__vector __bool char"),
+- bool_V16QI_type_node));
+-
+- (*lang_hooks.decls.pushdecl) (build_decl (TYPE_DECL,
+- get_identifier ("__vector unsigned short"),
+- unsigned_V8HI_type_node));
+- (*lang_hooks.decls.pushdecl) (build_decl (TYPE_DECL,
+- get_identifier ("__vector signed short"),
+- V8HI_type_node));
+- (*lang_hooks.decls.pushdecl) (build_decl (TYPE_DECL,
+- get_identifier ("__vector __bool short"),
+- bool_V8HI_type_node));
+-
+- (*lang_hooks.decls.pushdecl) (build_decl (TYPE_DECL,
+- get_identifier ("__vector unsigned int"),
+- unsigned_V4SI_type_node));
+- (*lang_hooks.decls.pushdecl) (build_decl (TYPE_DECL,
+- get_identifier ("__vector signed int"),
+- V4SI_type_node));
+- (*lang_hooks.decls.pushdecl) (build_decl (TYPE_DECL,
+- get_identifier ("__vector __bool int"),
+- bool_V4SI_type_node));
+-
+- (*lang_hooks.decls.pushdecl) (build_decl (TYPE_DECL,
+- get_identifier ("__vector float"),
+- V4SF_type_node));
+- (*lang_hooks.decls.pushdecl) (build_decl (TYPE_DECL,
+- get_identifier ("__vector __pixel"),
+- pixel_V8HI_type_node));
++ tdecl = build_decl (TYPE_DECL, get_identifier ("__vector unsigned char"),
++ unsigned_V16QI_type_node);
++ TYPE_NAME (unsigned_V16QI_type_node) = tdecl;
++ (*lang_hooks.decls.pushdecl) (tdecl);
++ tdecl = build_decl (TYPE_DECL, get_identifier ("__vector signed char"),
++ V16QI_type_node);
++ TYPE_NAME (V16QI_type_node) = tdecl;
++ (*lang_hooks.decls.pushdecl) (tdecl);
++ tdecl = build_decl (TYPE_DECL, get_identifier ("__vector __bool char"),
++ bool_V16QI_type_node);
++ TYPE_NAME ( bool_V16QI_type_node) = tdecl;
++ (*lang_hooks.decls.pushdecl) (tdecl);
++
++ tdecl = build_decl (TYPE_DECL, get_identifier ("__vector unsigned short"),
++ unsigned_V8HI_type_node);
++ TYPE_NAME (unsigned_V8HI_type_node) = tdecl;
++ (*lang_hooks.decls.pushdecl) (tdecl);
++ tdecl = build_decl (TYPE_DECL, get_identifier ("__vector signed short"),
++ V8HI_type_node);
++ TYPE_NAME (V8HI_type_node) = tdecl;
++ (*lang_hooks.decls.pushdecl) (tdecl);
++ tdecl = build_decl (TYPE_DECL, get_identifier ("__vector __bool short"),
++ bool_V8HI_type_node);
++ TYPE_NAME (bool_V8HI_type_node) = tdecl;
++ (*lang_hooks.decls.pushdecl) (tdecl);
++
++ tdecl = build_decl (TYPE_DECL, get_identifier ("__vector unsigned int"),
++ unsigned_V4SI_type_node);
++ TYPE_NAME (unsigned_V4SI_type_node) = tdecl;
++ (*lang_hooks.decls.pushdecl) (tdecl);
++ tdecl = build_decl (TYPE_DECL, get_identifier ("__vector signed int"),
++ V4SI_type_node);
++ TYPE_NAME (V4SI_type_node) = tdecl;
++ (*lang_hooks.decls.pushdecl) (tdecl);
++ tdecl = build_decl (TYPE_DECL, get_identifier ("__vector __bool int"),
++ bool_V4SI_type_node);
++ TYPE_NAME (bool_V4SI_type_node) = tdecl;
++ (*lang_hooks.decls.pushdecl) (tdecl);
++
++ tdecl = build_decl (TYPE_DECL, get_identifier ("__vector float"),
++ V4SF_type_node);
++ TYPE_NAME (V4SF_type_node) = tdecl;
++ (*lang_hooks.decls.pushdecl) (tdecl);
++ tdecl = build_decl (TYPE_DECL, get_identifier ("__vector __pixel"),
++ pixel_V8HI_type_node);
++ TYPE_NAME (pixel_V8HI_type_node) = tdecl;
++ (*lang_hooks.decls.pushdecl) (tdecl);
+
+ if (TARGET_PAIRED_FLOAT)
+ paired_init_builtins ();
+@@ -15843,7 +15868,7 @@
+ no_global_regs_above (int first, bool gpr)
+ {
+ int i;
+- for (i = first; i < gpr ? 32 : 64 ; i++)
++ for (i = first; i < (gpr ? 32 : 64); i++)
+ if (global_regs[i])
+ return false;
+ return true;
+@@ -15869,11 +15894,11 @@
+ int regno = gpr ? info->first_gp_reg_save : (info->first_fp_reg_save - 32);
+ rtx sym;
+ int select = ((savep ? 1 : 0) << 2
+- | (gpr
++ | (TARGET_SPE_ABI
+ /* On the SPE, we never have any FPRs, but we do have
+ 32/64-bit versions of the routines. */
+- ? (TARGET_SPE_ABI && info->spe_64bit_regs_used ? 1 : 0)
+- : 0) << 1
++ ? (info->spe_64bit_regs_used ? 1 : 0)
++ : (gpr ? 1 : 0)) << 1
+ | (exitp ? 1: 0));
+
+ /* Don't generate bogus routine names. */
+@@ -15908,6 +15933,7 @@
+
+ sym = savres_routine_syms[regno-FIRST_SAVRES_REGISTER][select]
+ = gen_rtx_SYMBOL_REF (Pmode, ggc_strdup (name));
++ SYMBOL_REF_FLAGS (sym) |= SYMBOL_FLAG_FUNCTION;
+ }
+
+ return sym;
+@@ -16098,6 +16124,14 @@
+ savres_gprs_inline = savres_gprs_inline || using_multiple_p;
+ }
+
++ /* Code intended for use in shared libraries cannot be reliably linked
++ with out-of-line prologues and epilogues. */
++ if (flag_pic)
++ {
++ savres_gprs_inline = 1;
++ savres_fprs_inline = 1;
++ }
++
+ return (using_multiple_p
+ | (savres_fprs_inline << 1)
+ | (savres_gprs_inline << 2));
+@@ -16122,7 +16156,7 @@
+ int using_store_multiple;
+ int using_static_chain_p = (cfun->static_chain_decl != NULL_TREE
+ && df_regs_ever_live_p (STATIC_CHAIN_REGNUM)
+- && !call_used_regs[STATIC_CHAIN_REGNUM]);
++ && call_used_regs[STATIC_CHAIN_REGNUM]);
+ HOST_WIDE_INT sp_offset = 0;
+
+ if (TARGET_FIX_AND_CONTINUE)
+@@ -16924,8 +16958,9 @@
+ || (cfun->calls_alloca
+ && !frame_pointer_needed));
+ restore_lr = (info->lr_save_p
+- && restoring_GPRs_inline
+- && restoring_FPRs_inline);
++ && (restoring_GPRs_inline
++ || (restoring_FPRs_inline
++ && info->first_fp_reg_save < 64)));
+
+ if (WORLD_SAVE_P (info))
+ {
+@@ -17197,7 +17232,7 @@
+
+ /* Get the old lr if we saved it. If we are restoring registers
+ out-of-line, then the out-of-line routines can do this for us. */
+- if (restore_lr)
++ if (restore_lr && restoring_GPRs_inline)
+ {
+ rtx mem = gen_frame_mem_offset (Pmode, frame_reg_rtx,
+ info->lr_save_offset + sp_offset);
+@@ -17216,7 +17251,7 @@
+ }
+
+ /* Set LR here to try to overlap restores below. */
+- if (restore_lr)
++ if (restore_lr && restoring_GPRs_inline)
+ emit_move_insn (gen_rtx_REG (Pmode, LR_REGNO),
+ gen_rtx_REG (Pmode, 0));
+
+@@ -17396,6 +17431,18 @@
+ }
+ }
+
++ if (restore_lr && !restoring_GPRs_inline)
++ {
++ rtx mem = gen_frame_mem_offset (Pmode, frame_reg_rtx,
++ info->lr_save_offset + sp_offset);
++
++ emit_move_insn (gen_rtx_REG (Pmode, 0), mem);
++ }
++
++ if (restore_lr && !restoring_GPRs_inline)
++ emit_move_insn (gen_rtx_REG (Pmode, LR_REGNO),
++ gen_rtx_REG (Pmode, 0));
++
+ /* Restore fpr's if we need to do it without calling a function. */
+ if (restoring_FPRs_inline)
+ for (i = 0; i < 64 - info->first_fp_reg_save; i++)
+@@ -22163,6 +22210,30 @@
+ return 4 + rs6000_register_move_cost (mode, rclass, GENERAL_REGS);
+ }
+
++/* Return a value indicating whether OP, an operand of a commutative
++ operation, is preferred as the first or second operand. The higher
++ the value, the stronger the preference for being the first operand.
++ We use negative values to indicate a preference for the first operand
++ and positive values for the second operand.
++ VALUE is the default precedence for OP; see rtlanal.c:
++ commutative_operand_precendece. */
++
++static int
++rs6000_commutative_operand_precedence (const_rtx op, int value)
++{
++ /* Prefer pointer objects over non pointer objects.
++ For rationale see PR28690. */
++ if (GET_RTX_CLASS (GET_CODE (op)) == RTX_OBJ
++ && ((REG_P (op) && REG_POINTER (op))
++ || (MEM_P (op) && MEM_POINTER (op))))
++ /* value = -1 */;
++ else
++ /* value = -2 */
++ --value;
++
++ return value;
++}
++
+ /* Returns a code for a target-specific builtin that implements
+ reciprocal of the function, or NULL_TREE if not available. */
+
+@@ -22686,12 +22757,16 @@
+ static rtx
+ rs6000_dwarf_register_span (rtx reg)
+ {
+- unsigned regno;
++ rtx parts[8];
++ int i, words;
++ unsigned regno = REGNO (reg);
++ enum machine_mode mode = GET_MODE (reg);
+
+ if (TARGET_SPE
++ && regno < 32
+ && (SPE_VECTOR_MODE (GET_MODE (reg))
+- || (TARGET_E500_DOUBLE
+- && (GET_MODE (reg) == DFmode || GET_MODE (reg) == DDmode))))
++ || (TARGET_E500_DOUBLE && FLOAT_MODE_P (mode)
++ && mode != SFmode && mode != SDmode && mode != SCmode)))
+ ;
+ else
+ return NULL_RTX;
+@@ -22701,15 +22776,23 @@
+ /* The duality of the SPE register size wreaks all kinds of havoc.
+ This is a way of distinguishing r0 in 32-bits from r0 in
+ 64-bits. */
+- return
+- gen_rtx_PARALLEL (VOIDmode,
+- BYTES_BIG_ENDIAN
+- ? gen_rtvec (2,
+- gen_rtx_REG (SImode, regno + 1200),
+- gen_rtx_REG (SImode, regno))
+- : gen_rtvec (2,
+- gen_rtx_REG (SImode, regno),
+- gen_rtx_REG (SImode, regno + 1200)));
++ words = (GET_MODE_SIZE (mode) + UNITS_PER_FP_WORD - 1) / UNITS_PER_FP_WORD;
++ gcc_assert (words <= 4);
++ for (i = 0; i < words; i++, regno++)
++ {
++ if (BYTES_BIG_ENDIAN)
++ {
++ parts[2 * i] = gen_rtx_REG (SImode, regno + 1200);
++ parts[2 * i + 1] = gen_rtx_REG (SImode, regno);
++ }
++ else
++ {
++ parts[2 * i] = gen_rtx_REG (SImode, regno);
++ parts[2 * i + 1] = gen_rtx_REG (SImode, regno + 1200);
++ }
++ }
++
++ return gen_rtx_PARALLEL (VOIDmode, gen_rtvec_v (words * 2, parts));
+ }
+
+ /* Fill in sizes for SPE register high parts in table used by unwinder. */
+diff -Nur a/gcc/config/rs6000/rs6000.h b/gcc/config/rs6000/rs6000.h
+--- a/gcc/config/rs6000/rs6000.h 2009-04-10 01:23:07.000000000 +0200
++++ b/gcc/config/rs6000/rs6000.h 2010-01-25 09:50:29.045688403 +0100
+@@ -368,16 +368,6 @@
+ previous_group
+ };
+
+-/* Support for a compile-time default CPU, et cetera. The rules are:
+- --with-cpu is ignored if -mcpu is specified.
+- --with-tune is ignored if -mtune is specified.
+- --with-float is ignored if -mhard-float or -msoft-float are
+- specified. */
+-#define OPTION_DEFAULT_SPECS \
+- {"cpu", "%{!mcpu=*:-mcpu=%(VALUE)}" }, \
+- {"tune", "%{!mtune=*:-mtune=%(VALUE)}" }, \
+- {"float", "%{!msoft-float:%{!mhard-float:-m%(VALUE)-float}}" }
+-
+ /* rs6000_select[0] is reserved for the default cpu defined via --with-cpu */
+ struct rs6000_cpu_select
+ {
+@@ -794,8 +784,8 @@
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \
+ 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, \
+ /* AltiVec registers. */ \
+- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \
+- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \
++ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, \
++ 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \
+ 1, 1 \
+ , 1, 1, 1 \
+ }
+@@ -813,8 +803,8 @@
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \
+ 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, \
+ /* AltiVec registers. */ \
+- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \
+- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \
++ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, \
++ 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \
+ 0, 0 \
+ , 0, 0, 0 \
+ }
+diff -Nur a/gcc/config/rs6000/rs6000.md b/gcc/config/rs6000/rs6000.md
+--- a/gcc/config/rs6000/rs6000.md 2009-04-01 18:22:17.000000000 +0200
++++ b/gcc/config/rs6000/rs6000.md 2010-01-25 09:50:29.045688403 +0100
+@@ -14703,9 +14703,9 @@
+ [(match_parallel 0 "any_parallel_operand"
+ [(clobber (reg:P 65))
+ (use (match_operand:P 1 "symbol_ref_operand" "s"))
+- (use (match_operand:P 2 "gpc_reg_operand" "r"))
+- (set (match_operand:P 3 "memory_operand" "=m")
+- (match_operand:P 4 "gpc_reg_operand" "r"))])]
++ (use (reg:P 11))
++ (set (match_operand:P 2 "memory_operand" "=m")
++ (match_operand:P 3 "gpc_reg_operand" "r"))])]
+ ""
+ "bl %z1"
+ [(set_attr "type" "branch")
+@@ -14715,9 +14715,9 @@
+ [(match_parallel 0 "any_parallel_operand"
+ [(clobber (reg:P 65))
+ (use (match_operand:P 1 "symbol_ref_operand" "s"))
+- (use (match_operand:P 2 "gpc_reg_operand" "r"))
+- (set (match_operand:DF 3 "memory_operand" "=m")
+- (match_operand:DF 4 "gpc_reg_operand" "f"))])]
++ (use (reg:P 11))
++ (set (match_operand:DF 2 "memory_operand" "=m")
++ (match_operand:DF 3 "gpc_reg_operand" "f"))])]
+ ""
+ "bl %z1"
+ [(set_attr "type" "branch")
+@@ -14810,9 +14810,9 @@
+ [(match_parallel 0 "any_parallel_operand"
+ [(clobber (match_operand:P 1 "register_operand" "=l"))
+ (use (match_operand:P 2 "symbol_ref_operand" "s"))
+- (use (match_operand:P 3 "gpc_reg_operand" "r"))
+- (set (match_operand:P 4 "gpc_reg_operand" "=r")
+- (match_operand:P 5 "memory_operand" "m"))])]
++ (use (reg:P 11))
++ (set (match_operand:P 3 "gpc_reg_operand" "=r")
++ (match_operand:P 4 "memory_operand" "m"))])]
+ ""
+ "bl %z2"
+ [(set_attr "type" "branch")
+@@ -14823,9 +14823,9 @@
+ [(return)
+ (clobber (match_operand:P 1 "register_operand" "=l"))
+ (use (match_operand:P 2 "symbol_ref_operand" "s"))
+- (use (match_operand:P 3 "gpc_reg_operand" "r"))
+- (set (match_operand:P 4 "gpc_reg_operand" "=r")
+- (match_operand:P 5 "memory_operand" "m"))])]
++ (use (reg:P 11))
++ (set (match_operand:P 3 "gpc_reg_operand" "=r")
++ (match_operand:P 4 "memory_operand" "m"))])]
+ ""
+ "b %z2"
+ [(set_attr "type" "branch")
+@@ -14836,9 +14836,9 @@
+ [(return)
+ (clobber (match_operand:P 1 "register_operand" "=l"))
+ (use (match_operand:P 2 "symbol_ref_operand" "s"))
+- (use (match_operand:P 3 "gpc_reg_operand" "r"))
+- (set (match_operand:DF 4 "gpc_reg_operand" "=f")
+- (match_operand:DF 5 "memory_operand" "m"))])]
++ (use (reg:P 11))
++ (set (match_operand:DF 3 "gpc_reg_operand" "=f")
++ (match_operand:DF 4 "memory_operand" "m"))])]
+ ""
+ "b %z2"
+ [(set_attr "type" "branch")
+@@ -14889,6 +14889,120 @@
+ }"
+ [(set_attr "type" "load")])
+
++;;; Expanders for vector insn patterns shared between the SPE and TARGET_PAIRED systems.
++
++(define_expand "absv2sf2"
++ [(set (match_operand:V2SF 0 "gpc_reg_operand" "")
++ (abs:V2SF (match_operand:V2SF 1 "gpc_reg_operand" "")))]
++ "TARGET_PAIRED_FLOAT || TARGET_SPE"
++ "
++{
++ if (TARGET_SPE)
++ {
++ /* We need to make a note that we clobber SPEFSCR. */
++ emit_insn (gen_rtx_SET (VOIDmode, operands[0],
++ gen_rtx_ABS (V2SFmode, operands[1])));
++ emit_insn (gen_rtx_CLOBBER (VOIDmode, gen_rtx_REG (SImode, SPEFSCR_REGNO)));
++ DONE;
++ }
++}")
++
++(define_expand "negv2sf2"
++ [(set (match_operand:V2SF 0 "gpc_reg_operand" "")
++ (neg:V2SF (match_operand:V2SF 1 "gpc_reg_operand" "")))]
++ "TARGET_PAIRED_FLOAT || TARGET_SPE"
++ "
++{
++ if (TARGET_SPE)
++ {
++ /* We need to make a note that we clobber SPEFSCR. */
++ emit_insn (gen_rtx_SET (VOIDmode, operands[0],
++ gen_rtx_NEG (V2SFmode, operands[1])));
++ emit_insn (gen_rtx_CLOBBER (VOIDmode, gen_rtx_REG (SImode, SPEFSCR_REGNO)));
++ DONE;
++ }
++}")
++
++(define_expand "addv2sf3"
++ [(set (match_operand:V2SF 0 "gpc_reg_operand" "")
++ (plus:V2SF (match_operand:V2SF 1 "gpc_reg_operand" "")
++ (match_operand:V2SF 2 "gpc_reg_operand" "")))]
++ "TARGET_PAIRED_FLOAT || TARGET_SPE"
++ "
++{
++ if (TARGET_SPE)
++ {
++ /* We need to make a note that we clobber SPEFSCR. */
++ rtx par = gen_rtx_PARALLEL (VOIDmode, rtvec_alloc (2));
++
++ XVECEXP (par, 0, 0) = gen_rtx_SET (VOIDmode, operands[0],
++ gen_rtx_PLUS (V2SFmode, operands[1], operands[2]));
++ XVECEXP (par, 0, 1) = gen_rtx_CLOBBER (VOIDmode, gen_rtx_REG (SImode, SPEFSCR_REGNO));
++ emit_insn (par);
++ DONE;
++ }
++}")
++
++(define_expand "subv2sf3"
++ [(set (match_operand:V2SF 0 "gpc_reg_operand" "")
++ (minus:V2SF (match_operand:V2SF 1 "gpc_reg_operand" "")
++ (match_operand:V2SF 2 "gpc_reg_operand" "")))]
++ "TARGET_PAIRED_FLOAT || TARGET_SPE"
++ "
++{
++ if (TARGET_SPE)
++ {
++ /* We need to make a note that we clobber SPEFSCR. */
++ rtx par = gen_rtx_PARALLEL (VOIDmode, rtvec_alloc (2));
++
++ XVECEXP (par, 0, 0) = gen_rtx_SET (VOIDmode, operands[0],
++ gen_rtx_MINUS (V2SFmode, operands[1], operands[2]));
++ XVECEXP (par, 0, 1) = gen_rtx_CLOBBER (VOIDmode, gen_rtx_REG (SImode, SPEFSCR_REGNO));
++ emit_insn (par);
++ DONE;
++ }
++}")
++
++(define_expand "mulv2sf3"
++ [(set (match_operand:V2SF 0 "gpc_reg_operand" "")
++ (mult:V2SF (match_operand:V2SF 1 "gpc_reg_operand" "")
++ (match_operand:V2SF 2 "gpc_reg_operand" "")))]
++ "TARGET_PAIRED_FLOAT || TARGET_SPE"
++ "
++{
++ if (TARGET_SPE)
++ {
++ /* We need to make a note that we clobber SPEFSCR. */
++ rtx par = gen_rtx_PARALLEL (VOIDmode, rtvec_alloc (2));
++
++ XVECEXP (par, 0, 0) = gen_rtx_SET (VOIDmode, operands[0],
++ gen_rtx_MULT (V2SFmode, operands[1], operands[2]));
++ XVECEXP (par, 0, 1) = gen_rtx_CLOBBER (VOIDmode, gen_rtx_REG (SImode, SPEFSCR_REGNO));
++ emit_insn (par);
++ DONE;
++ }
++}")
++
++(define_expand "divv2sf3"
++ [(set (match_operand:V2SF 0 "gpc_reg_operand" "")
++ (div:V2SF (match_operand:V2SF 1 "gpc_reg_operand" "")
++ (match_operand:V2SF 2 "gpc_reg_operand" "")))]
++ "TARGET_PAIRED_FLOAT || TARGET_SPE"
++ "
++{
++ if (TARGET_SPE)
++ {
++ /* We need to make a note that we clobber SPEFSCR. */
++ rtx par = gen_rtx_PARALLEL (VOIDmode, rtvec_alloc (2));
++
++ XVECEXP (par, 0, 0) = gen_rtx_SET (VOIDmode, operands[0],
++ gen_rtx_DIV (V2SFmode, operands[1], operands[2]));
++ XVECEXP (par, 0, 1) = gen_rtx_CLOBBER (VOIDmode, gen_rtx_REG (SImode, SPEFSCR_REGNO));
++ emit_insn (par);
++ DONE;
++ }
++}")
++
+
+ (include "sync.md")
+ (include "altivec.md")
+diff -Nur a/gcc/config/rs6000/spe.md b/gcc/config/rs6000/spe.md
+--- a/gcc/config/rs6000/spe.md 2009-02-20 16:20:38.000000000 +0100
++++ b/gcc/config/rs6000/spe.md 2010-01-25 09:50:29.045688403 +0100
+@@ -164,7 +164,7 @@
+
+ ;; SPE SIMD instructions
+
+-(define_insn "spe_evabs"
++(define_insn "absv2si2"
+ [(set (match_operand:V2SI 0 "gpc_reg_operand" "=r")
+ (abs:V2SI (match_operand:V2SI 1 "gpc_reg_operand" "r")))]
+ "TARGET_SPE"
+@@ -181,7 +181,7 @@
+ [(set_attr "type" "vecsimple")
+ (set_attr "length" "4")])
+
+-(define_insn "spe_evand"
++(define_insn "andv2si3"
+ [(set (match_operand:V2SI 0 "gpc_reg_operand" "=r")
+ (and:V2SI (match_operand:V2SI 1 "gpc_reg_operand" "r")
+ (match_operand:V2SI 2 "gpc_reg_operand" "r")))]
+@@ -1898,7 +1898,7 @@
+ [(set_attr "type" "veccomplex")
+ (set_attr "length" "4")])
+
+-(define_insn "spe_evaddw"
++(define_insn "addv2si3"
+ [(set (match_operand:V2SI 0 "gpc_reg_operand" "=r")
+ (plus:V2SI (match_operand:V2SI 1 "gpc_reg_operand" "r")
+ (match_operand:V2SI 2 "gpc_reg_operand" "r")))]
+@@ -2028,7 +2028,7 @@
+ [(set_attr "type" "veccomplex")
+ (set_attr "length" "4")])
+
+-(define_insn "spe_evdivws"
++(define_insn "divv2si3"
+ [(set (match_operand:V2SI 0 "gpc_reg_operand" "=r")
+ (div:V2SI (match_operand:V2SI 1 "gpc_reg_operand" "r")
+ (match_operand:V2SI 2 "gpc_reg_operand" "r")))
+@@ -3156,9 +3156,9 @@
+ [(match_parallel 0 "any_parallel_operand"
+ [(clobber (reg:P 65))
+ (use (match_operand:P 1 "symbol_ref_operand" "s"))
+- (use (match_operand:P 2 "gpc_reg_operand" "r"))
+- (set (match_operand:V2SI 3 "memory_operand" "=m")
+- (match_operand:V2SI 4 "gpc_reg_operand" "r"))])]
++ (use (reg:P 11))
++ (set (match_operand:V2SI 2 "memory_operand" "=m")
++ (match_operand:V2SI 3 "gpc_reg_operand" "r"))])]
+ "TARGET_SPE_ABI"
+ "bl %z1"
+ [(set_attr "type" "branch")
+@@ -3168,9 +3168,9 @@
+ [(match_parallel 0 "any_parallel_operand"
+ [(clobber (reg:P 65))
+ (use (match_operand:P 1 "symbol_ref_operand" "s"))
+- (use (match_operand:P 2 "gpc_reg_operand" "r"))
+- (set (match_operand:V2SI 3 "gpc_reg_operand" "=r")
+- (match_operand:V2SI 4 "memory_operand" "m"))])]
++ (use (reg:P 11))
++ (set (match_operand:V2SI 2 "gpc_reg_operand" "=r")
++ (match_operand:V2SI 3 "memory_operand" "m"))])]
+ "TARGET_SPE_ABI"
+ "bl %z1"
+ [(set_attr "type" "branch")
+@@ -3181,9 +3181,9 @@
+ [(return)
+ (clobber (reg:P 65))
+ (use (match_operand:P 1 "symbol_ref_operand" "s"))
+- (use (match_operand:P 2 "gpc_reg_operand" "r"))
+- (set (match_operand:V2SI 3 "gpc_reg_operand" "=r")
+- (match_operand:V2SI 4 "memory_operand" "m"))])]
++ (use (reg:P 11))
++ (set (match_operand:V2SI 2 "gpc_reg_operand" "=r")
++ (match_operand:V2SI 3 "memory_operand" "m"))])]
+ "TARGET_SPE_ABI"
+ "b %z1"
+ [(set_attr "type" "branch")
+diff -Nur a/gcc/config/rs6000/sysv4.h b/gcc/config/rs6000/sysv4.h
+--- a/gcc/config/rs6000/sysv4.h 2009-04-10 01:23:07.000000000 +0200
++++ b/gcc/config/rs6000/sysv4.h 2010-01-25 09:50:29.045688403 +0100
+@@ -619,6 +619,9 @@
+ #define CC1_SECURE_PLT_DEFAULT_SPEC ""
+ #endif
+
++#undef CC1_EXTRA_SPEC
++#define CC1_EXTRA_SPEC ""
++
+ /* Pass -G xxx to the compiler and set correct endian mode. */
+ #define CC1_SPEC "%{G*} %(cc1_cpu) \
+ %{mlittle|mlittle-endian: %(cc1_endian_little); \
+@@ -643,7 +646,7 @@
+ %{msdata: -msdata=default} \
+ %{mno-sdata: -msdata=none} \
+ %{!mbss-plt: %{!msecure-plt: %(cc1_secure_plt_default)}} \
+-%{profile: -p}"
++%{profile: -p}" CC1_EXTRA_SPEC
+
+ /* Don't put -Y P,<path> for cross compilers. */
+ #ifndef CROSS_DIRECTORY_STRUCTURE
+@@ -843,15 +846,15 @@
+ #define CPP_OS_MVME_SPEC ""
+
+ /* PowerPC simulator based on netbsd system calls support. */
+-#define LIB_SIM_SPEC "--start-group -lsim -lc --end-group"
++#define LIB_SIM_SPEC LIB_DEFAULT_SPEC
+
+-#define STARTFILE_SIM_SPEC "ecrti.o%s sim-crt0.o%s crtbegin.o%s"
++#define STARTFILE_SIM_SPEC "ecrti.o%s crtbegin.o%s"
+
+-#define ENDFILE_SIM_SPEC "crtend.o%s ecrtn.o%s"
++#define ENDFILE_SIM_SPEC "crtend.o%s ecrtn.o%s -Tsim-hosted.ld"
+
+ #define LINK_START_SIM_SPEC ""
+
+-#define LINK_OS_SIM_SPEC "-m elf32ppcsim"
++#define LINK_OS_SIM_SPEC ""
+
+ #define CPP_OS_SIM_SPEC ""
+
+diff -Nur a/gcc/config/rs6000/t-cs-eabi b/gcc/config/rs6000/t-cs-eabi
+--- a/gcc/config/rs6000/t-cs-eabi 1970-01-01 01:00:00.000000000 +0100
++++ b/gcc/config/rs6000/t-cs-eabi 2010-01-25 09:50:29.045688403 +0100
+@@ -0,0 +1,17 @@
++# Multilibs for powerpc embedded ELF targets.
++
++MULTILIB_OPTIONS = te500v1/te500v2/te600/te500mc \
++ msoft-float
++
++MULTILIB_DIRNAMES = te500v1 te500v2 te600 te500mc \
++ nof
++
++MULTILIB_EXCEPTIONS = *te600*/*msoft-float* \
++ *te500v1*/*msoft-float* \
++ *te500v2*/*msoft-float* \
++ *te500mc*/*msoft-float*
++
++MULTILIB_EXTRA_OPTS = mno-eabi mstrict-align
++
++MULTILIB_MATCHES = ${MULTILIB_MATCHES_FLOAT} \
++ ${MULTILIB_MATCHES_ENDIAN}
+diff -Nur a/gcc/config/rs6000/t-cs-eabi-lite b/gcc/config/rs6000/t-cs-eabi-lite
+--- a/gcc/config/rs6000/t-cs-eabi-lite 1970-01-01 01:00:00.000000000 +0100
++++ b/gcc/config/rs6000/t-cs-eabi-lite 2010-01-25 09:50:29.045688403 +0100
+@@ -0,0 +1,16 @@
++# Multilibs for powerpc embedded ELF targets.
++
++MULTILIB_OPTIONS = te500v1/te500v2/te600 \
++ msoft-float
++
++MULTILIB_DIRNAMES = te500v1 te500v2 te600 \
++ nof
++
++MULTILIB_EXCEPTIONS = *te600*/*msoft-float* \
++ *te500v1*/*msoft-float* \
++ *te500v2*/*msoft-float*
++
++MULTILIB_EXTRA_OPTS = mno-eabi mstrict-align
++
++MULTILIB_MATCHES = ${MULTILIB_MATCHES_FLOAT} \
++ ${MULTILIB_MATCHES_ENDIAN}
+diff -Nur a/gcc/config/rs6000/t-cs-linux b/gcc/config/rs6000/t-cs-linux
+--- a/gcc/config/rs6000/t-cs-linux 1970-01-01 01:00:00.000000000 +0100
++++ b/gcc/config/rs6000/t-cs-linux 2010-01-25 09:50:29.045688403 +0100
+@@ -0,0 +1,12 @@
++# Multilibs for powerpc-linux-gnu targets.
++
++MULTILIB_OPTIONS = te500v1/te500v2/te600/te500mc \
++ msoft-float
++
++MULTILIB_DIRNAMES = te500v1 te500v2 te600 te500mc \
++ nof
++
++MULTILIB_EXCEPTIONS = *te600*/*msoft-float* \
++ *te500v1*/*msoft-float* \
++ *te500v2*/*msoft-float* \
++ *te500mc*/*msoft-float*
+diff -Nur a/gcc/config/rs6000/t-montavista-linux b/gcc/config/rs6000/t-montavista-linux
+--- a/gcc/config/rs6000/t-montavista-linux 1970-01-01 01:00:00.000000000 +0100
++++ b/gcc/config/rs6000/t-montavista-linux 2010-01-25 09:50:29.045688403 +0100
+@@ -0,0 +1,26 @@
++# MontaVista GNU/Linux Configuration.
++# Copyright (C) 2009
++# Free Software Foundation, Inc.
++#
++# 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/>.
++
++# Build hard-float, soft-float, E500mc, E500v2 and E600
++# libraries.
++MULTILIB_OPTIONS = msoft-float/te500mc/te500v2/te600
++MULTILIB_DIRNAMES = soft-float te500mc te500v2 te600
++MULTILIB_EXCEPTIONS =
++MULTILIB_OSDIRNAMES = msoft-float=!soft-float
+diff -Nur a/gcc/config/rs6000/t-ppccomm b/gcc/config/rs6000/t-ppccomm
+--- a/gcc/config/rs6000/t-ppccomm 2008-06-26 22:12:41.000000000 +0200
++++ b/gcc/config/rs6000/t-ppccomm 2010-01-25 09:50:29.045688403 +0100
+@@ -3,10 +3,23 @@
+ LIB2FUNCS_EXTRA += tramp.S $(srcdir)/config/rs6000/darwin-ldouble.c
+
+ # These can't end up in shared libgcc
+-LIB2FUNCS_STATIC_EXTRA = eabi.S
+-
+-eabi.S: $(srcdir)/config/rs6000/eabi.asm
+- cat $(srcdir)/config/rs6000/eabi.asm > eabi.S
++LIB2FUNCS_STATIC_EXTRA = \
++ crtsavfpr.S crtresfpr.S \
++ crtsavgpr.S crtresgpr.S \
++ crtresxfpr.S crtresxgpr.S \
++ e500crtres32gpr.S \
++ e500crtres64gpr.S \
++ e500crtres64gprctr.S \
++ e500crtrest32gpr.S \
++ e500crtrest64gpr.S \
++ e500crtresx32gpr.S \
++ e500crtresx64gpr.S \
++ e500crtsav32gpr.S \
++ e500crtsav64gpr.S \
++ e500crtsav64gprctr.S \
++ e500crtsavg32gpr.S \
++ e500crtsavg64gpr.S \
++ e500crtsavg64gprctr.S
+
+ tramp.S: $(srcdir)/config/rs6000/tramp.asm
+ cat $(srcdir)/config/rs6000/tramp.asm > tramp.S
+@@ -36,6 +49,63 @@
+ ncrtn.S: $(srcdir)/config/rs6000/sol-cn.asm
+ cat $(srcdir)/config/rs6000/sol-cn.asm >ncrtn.S
+
++crtsavfpr.S: $(srcdir)/config/rs6000/crtsavfpr.asm
++ cat $(srcdir)/config/rs6000/crtsavfpr.asm >crtsavfpr.S
++
++crtresfpr.S: $(srcdir)/config/rs6000/crtresfpr.asm
++ cat $(srcdir)/config/rs6000/crtresfpr.asm >crtresfpr.S
++
++crtsavgpr.S: $(srcdir)/config/rs6000/crtsavgpr.asm
++ cat $(srcdir)/config/rs6000/crtsavgpr.asm >crtsavgpr.S
++
++crtresgpr.S: $(srcdir)/config/rs6000/crtresgpr.asm
++ cat $(srcdir)/config/rs6000/crtresgpr.asm >crtresgpr.S
++
++crtresxfpr.S: $(srcdir)/config/rs6000/crtresxfpr.asm
++ cat $(srcdir)/config/rs6000/crtresxfpr.asm >crtresxfpr.S
++
++crtresxgpr.S: $(srcdir)/config/rs6000/crtresxgpr.asm
++ cat $(srcdir)/config/rs6000/crtresxgpr.asm >crtresxgpr.S
++
++e500crtres32gpr.S: $(srcdir)/config/rs6000/e500crtres32gpr.asm
++ cat $(srcdir)/config/rs6000/e500crtres32gpr.asm >e500crtres32gpr.S
++
++e500crtres64gpr.S: $(srcdir)/config/rs6000/e500crtres64gpr.asm
++ cat $(srcdir)/config/rs6000/e500crtres64gpr.asm >e500crtres64gpr.S
++
++e500crtres64gprctr.S: $(srcdir)/config/rs6000/e500crtres64gprctr.asm
++ cat $(srcdir)/config/rs6000/e500crtres64gprctr.asm >e500crtres64gprctr.S
++
++e500crtrest32gpr.S: $(srcdir)/config/rs6000/e500crtrest32gpr.asm
++ cat $(srcdir)/config/rs6000/e500crtrest32gpr.asm >e500crtrest32gpr.S
++
++e500crtrest64gpr.S: $(srcdir)/config/rs6000/e500crtrest64gpr.asm
++ cat $(srcdir)/config/rs6000/e500crtrest64gpr.asm >e500crtrest64gpr.S
++
++e500crtresx32gpr.S: $(srcdir)/config/rs6000/e500crtresx32gpr.asm
++ cat $(srcdir)/config/rs6000/e500crtresx32gpr.asm >e500crtresx32gpr.S
++
++e500crtresx64gpr.S: $(srcdir)/config/rs6000/e500crtresx64gpr.asm
++ cat $(srcdir)/config/rs6000/e500crtresx64gpr.asm >e500crtresx64gpr.S
++
++e500crtsav32gpr.S: $(srcdir)/config/rs6000/e500crtsav32gpr.asm
++ cat $(srcdir)/config/rs6000/e500crtsav32gpr.asm >e500crtsav32gpr.S
++
++e500crtsav64gpr.S: $(srcdir)/config/rs6000/e500crtsav64gpr.asm
++ cat $(srcdir)/config/rs6000/e500crtsav64gpr.asm >e500crtsav64gpr.S
++
++e500crtsav64gprctr.S: $(srcdir)/config/rs6000/e500crtsav64gprctr.asm
++ cat $(srcdir)/config/rs6000/e500crtsav64gprctr.asm >e500crtsav64gprctr.S
++
++e500crtsavg32gpr.S: $(srcdir)/config/rs6000/e500crtsavg32gpr.asm
++ cat $(srcdir)/config/rs6000/e500crtsavg32gpr.asm >e500crtsavg32gpr.S
++
++e500crtsavg64gpr.S: $(srcdir)/config/rs6000/e500crtsavg64gpr.asm
++ cat $(srcdir)/config/rs6000/e500crtsavg64gpr.asm >e500crtsavg64gpr.S
++
++e500crtsavg64gprctr.S: $(srcdir)/config/rs6000/e500crtsavg64gprctr.asm
++ cat $(srcdir)/config/rs6000/e500crtsavg64gprctr.asm >e500crtsavg64gprctr.S
++
+ # Build multiple copies of ?crt{i,n}.o, one for each target switch.
+ $(T)ecrti$(objext): ecrti.S
+ $(GCC_FOR_TARGET) $(GCC_CFLAGS) $(INCLUDES) $(MULTILIB_CFLAGS) -c ecrti.S -o $(T)ecrti$(objext)
+@@ -49,6 +119,63 @@
+ $(T)ncrtn$(objext): ncrtn.S
+ $(GCC_FOR_TARGET) $(GCC_CFLAGS) $(INCLUDES) $(MULTILIB_CFLAGS) -c ncrtn.S -o $(T)ncrtn$(objext)
+
++$(T)crtsavfpr$(objext): crtsavfpr.S
++ $(GCC_FOR_TARGET) $(GCC_CFLAGS) $(INCLUDES) $(MULTILIB_CFLAGS) -c crtsavfpr.S -o $(T)crtsavfpr$(objext)
++
++$(T)crtresfpr$(objext): crtresfpr.S
++ $(GCC_FOR_TARGET) $(GCC_CFLAGS) $(INCLUDES) $(MULTILIB_CFLAGS) -c crtresfpr.S -o $(T)crtresfpr$(objext)
++
++$(T)crtsavgpr$(objext): crtsavgpr.S
++ $(GCC_FOR_TARGET) $(GCC_CFLAGS) $(INCLUDES) $(MULTILIB_CFLAGS) -c crtsavgpr.S -o $(T)crtsavgpr$(objext)
++
++$(T)crtresgpr$(objext): crtresgpr.S
++ $(GCC_FOR_TARGET) $(GCC_CFLAGS) $(INCLUDES) $(MULTILIB_CFLAGS) -c crtresgpr.S -o $(T)crtresgpr$(objext)
++
++$(T)crtresxfpr$(objext): crtresxfpr.S
++ $(GCC_FOR_TARGET) $(GCC_CFLAGS) $(INCLUDES) $(MULTILIB_CFLAGS) -c crtresxfpr.S -o $(T)crtresxfpr$(objext)
++
++$(T)crtresxgpr$(objext): crtresxgpr.S
++ $(GCC_FOR_TARGET) $(GCC_CFLAGS) $(INCLUDES) $(MULTILIB_CFLAGS) -c crtresxgpr.S -o $(T)crtresxgpr$(objext)
++
++$(T)e500crtres32gpr$(objext): e500crtres32gpr.S
++ $(GCC_FOR_TARGET) $(GCC_CFLAGS) $(INCLUDES) $(MULTILIB_CFLAGS) -c e500crtres32gpr.S -o $(T)e500crtres32gpr$(objext)
++
++$(T)e500crtres64gpr$(objext): e500crtres64gpr.S
++ $(GCC_FOR_TARGET) $(GCC_CFLAGS) $(INCLUDES) $(MULTILIB_CFLAGS) -c e500crtres64gpr.S -o $(T)e500crtres64gpr$(objext)
++
++$(T)e500crtres64gprctr$(objext): e500crtres64gprctr.S
++ $(GCC_FOR_TARGET) $(GCC_CFLAGS) $(INCLUDES) $(MULTILIB_CFLAGS) -c e500crtres64gprctr.S -o $(T)e500crtres64gprctr$(objext)
++
++$(T)e500crtrest32gpr$(objext): e500crtrest32gpr.S
++ $(GCC_FOR_TARGET) $(GCC_CFLAGS) $(INCLUDES) $(MULTILIB_CFLAGS) -c e500crtrest32gpr.S -o $(T)e500crtrest32gpr$(objext)
++
++$(T)e500crtrest64gpr$(objext): e500crtrest64gpr.S
++ $(GCC_FOR_TARGET) $(GCC_CFLAGS) $(INCLUDES) $(MULTILIB_CFLAGS) -c e500crtrest64gpr.S -o $(T)e500crtrest64gpr$(objext)
++
++$(T)e500crtresx32gpr$(objext): e500crtresx32gpr.S
++ $(GCC_FOR_TARGET) $(GCC_CFLAGS) $(INCLUDES) $(MULTILIB_CFLAGS) -c e500crtresx32gpr.S -o $(T)e500crtresx32gpr$(objext)
++
++$(T)e500crtresx64gpr$(objext): e500crtresx64gpr.S
++ $(GCC_FOR_TARGET) $(GCC_CFLAGS) $(INCLUDES) $(MULTILIB_CFLAGS) -c e500crtresx64gpr.S -o $(T)e500crtresx64gpr$(objext)
++
++$(T)e500crtsav32gpr$(objext): e500crtsav32gpr.S
++ $(GCC_FOR_TARGET) $(GCC_CFLAGS) $(INCLUDES) $(MULTILIB_CFLAGS) -c e500crtsav32gpr.S -o $(T)e500crtsav32gpr$(objext)
++
++$(T)e500crtsav64gpr$(objext): e500crtsav64gpr.S
++ $(GCC_FOR_TARGET) $(GCC_CFLAGS) $(INCLUDES) $(MULTILIB_CFLAGS) -c e500crtsav64gpr.S -o $(T)e500crtsav64gpr$(objext)
++
++$(T)e500crtsav64gprctr$(objext): e500crtsav64gprctr.S
++ $(GCC_FOR_TARGET) $(GCC_CFLAGS) $(INCLUDES) $(MULTILIB_CFLAGS) -c e500crtsav64gprctr.S -o $(T)e500crtsav64gprctr$(objext)
++
++$(T)e500crtsavg32gpr$(objext): e500crtsavg32gpr.S
++ $(GCC_FOR_TARGET) $(GCC_CFLAGS) $(INCLUDES) $(MULTILIB_CFLAGS) -c e500crtsavg32gpr.S -o $(T)e500crtsavg32gpr$(objext)
++
++$(T)e500crtsavg64gpr$(objext): e500crtsavg64gpr.S
++ $(GCC_FOR_TARGET) $(GCC_CFLAGS) $(INCLUDES) $(MULTILIB_CFLAGS) -c e500crtsavg64gpr.S -o $(T)e500crtsavg64gpr$(objext)
++
++$(T)e500crtsavg64gprctr$(objext): e500crtsavg64gprctr.S
++ $(GCC_FOR_TARGET) $(GCC_CFLAGS) $(INCLUDES) $(MULTILIB_CFLAGS) -c e500crtsavg64gprctr.S -o $(T)e500crtsavg64gprctr$(objext)
++
+ # It is important that crtbegin.o, etc., aren't surprised by stuff in .sdata.
+ CRTSTUFF_T_CFLAGS = -msdata=none
+ # Make sure crt*.o are built with -fPIC even if configured with
+diff -Nur a/gcc/config/rs6000/t-ppc-e500mc b/gcc/config/rs6000/t-ppc-e500mc
+--- a/gcc/config/rs6000/t-ppc-e500mc 1970-01-01 01:00:00.000000000 +0100
++++ b/gcc/config/rs6000/t-ppc-e500mc 2010-01-25 09:50:29.045688403 +0100
+@@ -0,0 +1,12 @@
++# Multilibs for powerpc embedded ELF targets.
++
++MULTILIB_OPTIONS =
++
++MULTILIB_DIRNAMES =
++
++MULTILIB_EXCEPTIONS =
++
++MULTILIB_EXTRA_OPTS = mno-eabi mstrict-align
++
++MULTILIB_MATCHES = ${MULTILIB_MATCHES_FLOAT} \
++ ${MULTILIB_MATCHES_ENDIAN}
+diff -Nur a/gcc/config/rs6000/t-wrs-linux b/gcc/config/rs6000/t-wrs-linux
+--- a/gcc/config/rs6000/t-wrs-linux 1970-01-01 01:00:00.000000000 +0100
++++ b/gcc/config/rs6000/t-wrs-linux 2010-01-25 09:50:29.045688403 +0100
+@@ -0,0 +1,30 @@
++# Wind River GNU/Linux Configuration.
++# Copyright (C) 2006, 2007
++# Free Software Foundation, Inc.
++#
++# 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/>.
++
++# Build hard-float (32-bit and 64-bit), soft-float, E500v1 and E500v2
++# libraries.
++MULTILIB_OPTIONS = muclibc m64 msoft-float te500v1 te500v2
++MULTILIB_DIRNAMES = uclibc 64 soft-float te500v1 te500v2
++MULTILIB_EXCEPTIONS = *muclibc*/*m64* *muclibc*/*msoft-float*
++MULTILIB_EXCEPTIONS += *muclibc*/*te500v1* *muclibc*/*te500v2*
++MULTILIB_EXCEPTIONS += *m64*/*msoft-float* *m64*/*te500v1* *m64*/*te500v2*
++MULTILIB_EXCEPTIONS += *msoft-float*/*te500v1* *msoft-float*/*te500v2*
++MULTILIB_EXCEPTIONS += *te500v1*/*te500v2*
++MULTILIB_OSDIRNAMES = muclibc=!uclibc m64=../lib64 msoft-float=!soft-float
+diff -Nur a/gcc/config/rs6000/wrs-linux.h b/gcc/config/rs6000/wrs-linux.h
+--- a/gcc/config/rs6000/wrs-linux.h 1970-01-01 01:00:00.000000000 +0100
++++ b/gcc/config/rs6000/wrs-linux.h 2010-01-25 09:50:29.045688403 +0100
+@@ -0,0 +1,44 @@
++/* Wind River GNU/Linux Configuration.
++ Copyright (C) 2006, 2007
++ Free Software Foundation, Inc.
++
++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/>. */
++
++/* Add -te500v1 and -te500v2 options for convenience in generating
++ multilibs. */
++#undef CC1_EXTRA_SPEC
++#define CC1_EXTRA_SPEC "%{te500v1: -mcpu=8540 -mfloat-gprs=single -mspe=yes -mabi=spe} %{te500v2: -mcpu=8548 -mfloat-gprs=double -mspe=yes -mabi=spe}"
++
++#undef ASM_DEFAULT_SPEC
++#define ASM_DEFAULT_SPEC \
++ "%{te500v1:-mppc -mspe -me500 ; \
++ te500v2:-mppc -mspe -me500 ; \
++ :-mppc%{m64:64}}"
++
++/* The GLIBC headers are in /usr/include, relative to the sysroot; the
++ uClibc headers are in /uclibc/usr/include. */
++#undef SYSROOT_HEADERS_SUFFIX_SPEC
++#define SYSROOT_HEADERS_SUFFIX_SPEC \
++ "%{muclibc:/uclibc}"
++
++/* The various C libraries each have their own subdirectory. */
++#undef SYSROOT_SUFFIX_SPEC
++#define SYSROOT_SUFFIX_SPEC \
++ "%{muclibc:/uclibc ; \
++ msoft-float:/soft-float ; \
++ te500v1:/te500v1 ; \
++ te500v2:/te500v2}"
+diff -Nur a/gcc/config/sh/cs-sgxxlite-linux.h b/gcc/config/sh/cs-sgxxlite-linux.h
+--- a/gcc/config/sh/cs-sgxxlite-linux.h 1970-01-01 01:00:00.000000000 +0100
++++ b/gcc/config/sh/cs-sgxxlite-linux.h 2010-01-25 09:50:29.045688403 +0100
+@@ -0,0 +1,31 @@
++/* SH SourceryG++ GNU/Linux Configuration.
++ Copyright (C) 2008
++ Free Software Foundation, Inc.
++
++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/>. */
++
++#undef SYSROOT_HEADERS_SUFFIX_SPEC
++#define SYSROOT_HEADERS_SUFFIX_SPEC \
++ "%{muclibc:/uclibc}"
++
++#undef SUBTARGET_OVERRIDE_OPTIONS
++#define SUBTARGET_OVERRIDE_OPTIONS \
++do { \
++ /* __thread_support is not supported by uClibc. */ \
++ if (linux_uclibc) \
++ targetm.have_tls = 0; \
++} while (0)
+diff -Nur a/gcc/config/sh/cs-sgxxlite-linux.opt b/gcc/config/sh/cs-sgxxlite-linux.opt
+--- a/gcc/config/sh/cs-sgxxlite-linux.opt 1970-01-01 01:00:00.000000000 +0100
++++ b/gcc/config/sh/cs-sgxxlite-linux.opt 2010-01-25 09:50:29.045688403 +0100
+@@ -0,0 +1,23 @@
++; Options for SH SourceryG++ GNU/Linux
++
++; Copyright (C) 2009 Free Software Foundation, Inc.
++;
++; 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/>.
++
++muclibc
++Target RejectNegative Var(building_for_uclibc)
++Building with -muclibc
+diff -Nur a/gcc/config/sh/lib1funcs.asm b/gcc/config/sh/lib1funcs.asm
+--- a/gcc/config/sh/lib1funcs.asm 2009-04-10 01:23:07.000000000 +0200
++++ b/gcc/config/sh/lib1funcs.asm 2010-01-25 09:50:29.045688403 +0100
+@@ -2080,8 +2080,9 @@
+ GLOBAL(ic_invalidate):
+ ocbwb @r4
+ synco
+- rts
+ icbi @r4
++ rts
++ nop
+ ENDFUNC(GLOBAL(ic_invalidate))
+ #elif defined(__SH4_SINGLE__) || defined(__SH4__) || defined(__SH4_SINGLE_ONLY__) || (defined(__SH4_NOFPU__) && !defined(__SH5__))
+ /* For system code, we use ic_invalidate_line_i, but user code
+@@ -2147,8 +2148,10 @@
+ GLOBAL(ic_invalidate_array):
+ add r1,r4
+ synco
+- rts
+ icbi @r4
++ rts
++ nop
++ .align 2
+ .long 0
+ ENDFUNC(GLOBAL(ic_invalidate_array))
+ #elif defined(__SH4_SINGLE__) || defined(__SH4__) || defined(__SH4_SINGLE_ONLY__) || (defined(__SH4_NOFPU__) && !defined(__SH5__))
+diff -Nur a/gcc/config/sh/linux-unwind.h b/gcc/config/sh/linux-unwind.h
+--- a/gcc/config/sh/linux-unwind.h 2009-04-10 01:23:07.000000000 +0200
++++ b/gcc/config/sh/linux-unwind.h 2010-01-25 09:50:29.045688403 +0100
+@@ -24,7 +24,10 @@
+
+
+ /* Do code reading to identify a signal frame, and set the frame
+- state data appropriately. See unwind-dw2.c for the structs. */
++ state data appropriately. See unwind-dw2.c for the structs.
++ Don't use this at all if inhibit_libc is used. */
++
++#ifndef inhibit_libc
+
+ #include <signal.h>
+ #include <sys/ucontext.h>
+@@ -248,3 +251,5 @@
+ return _URC_NO_REASON;
+ }
+ #endif /* defined (__SH5__) */
++
++#endif /* inhibit_libc */
+diff -Nur a/gcc/config/sh/sh.h b/gcc/config/sh/sh.h
+--- a/gcc/config/sh/sh.h 2008-11-14 12:46:55.000000000 +0100
++++ b/gcc/config/sh/sh.h 2010-01-25 09:50:29.045688403 +0100
+@@ -712,8 +712,9 @@
+ /* Never run scheduling before reload, since that can \
+ break global alloc, and generates slower code anyway due \
+ to the pressure on R0. */ \
+- /* Enable sched1 for SH4; ready queue will be reordered by \
+- the target hooks when pressure is high. We can not do this for \
++ /* Enable sched1 for SH4 if the user explicitly requests. \
++ When sched1 is enabled, the ready queue will be reordered by \
++ the target hooks if pressure is high. We can not do this for \
+ PIC, SH3 and lower as they give spill failures for R0. */ \
+ if (!TARGET_HARD_SH4 || flag_pic) \
+ flag_schedule_insns = 0; \
+@@ -728,6 +729,8 @@
+ warning (0, "ignoring -fschedule-insns because of exception handling bug"); \
+ flag_schedule_insns = 0; \
+ } \
++ else if (flag_schedule_insns == 2) \
++ flag_schedule_insns = 0; \
+ } \
+ \
+ if (align_loops == 0) \
+diff -Nur a/gcc/config/sh/t-1e b/gcc/config/sh/t-1e
+--- a/gcc/config/sh/t-1e 2004-06-21 20:18:40.000000000 +0200
++++ b/gcc/config/sh/t-1e 1970-01-01 01:00:00.000000000 +0100
+@@ -1 +0,0 @@
+-MULTILIB_ENDIAN =
+diff -Nur a/gcc/config/sh/t-linux b/gcc/config/sh/t-linux
+--- a/gcc/config/sh/t-linux 2007-01-09 11:50:23.000000000 +0100
++++ b/gcc/config/sh/t-linux 2010-01-25 09:50:29.075687537 +0100
+@@ -4,6 +4,5 @@
+
+ MULTILIB_DIRNAMES=
+ MULTILIB_MATCHES =
+-MULTILIB_EXCEPTIONS=
+
+ EXTRA_MULTILIB_PARTS= crtbegin.o crtend.o crtbeginS.o crtendS.o crtbeginT.o
+diff -Nur a/gcc/config/sh/t-mlib-sh1 b/gcc/config/sh/t-mlib-sh1
+--- a/gcc/config/sh/t-mlib-sh1 2004-06-21 20:18:40.000000000 +0200
++++ b/gcc/config/sh/t-mlib-sh1 1970-01-01 01:00:00.000000000 +0100
+@@ -1 +0,0 @@
+-ML_sh1=m1/
+diff -Nur a/gcc/config/sh/t-mlib-sh2 b/gcc/config/sh/t-mlib-sh2
+--- a/gcc/config/sh/t-mlib-sh2 2004-06-21 20:18:40.000000000 +0200
++++ b/gcc/config/sh/t-mlib-sh2 1970-01-01 01:00:00.000000000 +0100
+@@ -1 +0,0 @@
+-ML_sh2=m2/
+diff -Nur a/gcc/config/sh/t-mlib-sh2a b/gcc/config/sh/t-mlib-sh2a
+--- a/gcc/config/sh/t-mlib-sh2a 2004-07-29 08:10:03.000000000 +0200
++++ b/gcc/config/sh/t-mlib-sh2a 1970-01-01 01:00:00.000000000 +0100
+@@ -1 +0,0 @@
+-ML_sh2a=m2a/
+diff -Nur a/gcc/config/sh/t-mlib-sh2a-nofpu b/gcc/config/sh/t-mlib-sh2a-nofpu
+--- a/gcc/config/sh/t-mlib-sh2a-nofpu 2004-07-29 08:10:03.000000000 +0200
++++ b/gcc/config/sh/t-mlib-sh2a-nofpu 1970-01-01 01:00:00.000000000 +0100
+@@ -1 +0,0 @@
+-ML_sh2a_nofpu=m2a-nofpu/
+diff -Nur a/gcc/config/sh/t-mlib-sh2a-single b/gcc/config/sh/t-mlib-sh2a-single
+--- a/gcc/config/sh/t-mlib-sh2a-single 2004-07-29 08:10:03.000000000 +0200
++++ b/gcc/config/sh/t-mlib-sh2a-single 1970-01-01 01:00:00.000000000 +0100
+@@ -1 +0,0 @@
+-ML_sh2a_single=m2a-single/
+diff -Nur a/gcc/config/sh/t-mlib-sh2a-single-only b/gcc/config/sh/t-mlib-sh2a-single-only
+--- a/gcc/config/sh/t-mlib-sh2a-single-only 2004-07-29 08:10:03.000000000 +0200
++++ b/gcc/config/sh/t-mlib-sh2a-single-only 1970-01-01 01:00:00.000000000 +0100
+@@ -1 +0,0 @@
+-ML_sh2a_single_only=m2a-single-only/
+diff -Nur a/gcc/config/sh/t-mlib-sh2e b/gcc/config/sh/t-mlib-sh2e
+--- a/gcc/config/sh/t-mlib-sh2e 2004-06-21 20:18:40.000000000 +0200
++++ b/gcc/config/sh/t-mlib-sh2e 1970-01-01 01:00:00.000000000 +0100
+@@ -1 +0,0 @@
+-ML_sh2e=m2e/
+diff -Nur a/gcc/config/sh/t-mlib-sh3 b/gcc/config/sh/t-mlib-sh3
+--- a/gcc/config/sh/t-mlib-sh3 2004-06-21 20:18:40.000000000 +0200
++++ b/gcc/config/sh/t-mlib-sh3 1970-01-01 01:00:00.000000000 +0100
+@@ -1 +0,0 @@
+-ML_sh3=m3/
+diff -Nur a/gcc/config/sh/t-mlib-sh3e b/gcc/config/sh/t-mlib-sh3e
+--- a/gcc/config/sh/t-mlib-sh3e 2004-06-21 20:18:40.000000000 +0200
++++ b/gcc/config/sh/t-mlib-sh3e 1970-01-01 01:00:00.000000000 +0100
+@@ -1 +0,0 @@
+-ML_sh3e=m3e/
+diff -Nur a/gcc/config/sh/t-mlib-sh4 b/gcc/config/sh/t-mlib-sh4
+--- a/gcc/config/sh/t-mlib-sh4 2004-06-21 20:18:40.000000000 +0200
++++ b/gcc/config/sh/t-mlib-sh4 1970-01-01 01:00:00.000000000 +0100
+@@ -1 +0,0 @@
+-ML_sh4=m4/
+diff -Nur a/gcc/config/sh/t-mlib-sh4a b/gcc/config/sh/t-mlib-sh4a
+--- a/gcc/config/sh/t-mlib-sh4a 2004-07-28 11:13:58.000000000 +0200
++++ b/gcc/config/sh/t-mlib-sh4a 1970-01-01 01:00:00.000000000 +0100
+@@ -1 +0,0 @@
+-ML_sh4a=m4a/
+diff -Nur a/gcc/config/sh/t-mlib-sh4al b/gcc/config/sh/t-mlib-sh4al
+--- a/gcc/config/sh/t-mlib-sh4al 2004-07-28 11:13:58.000000000 +0200
++++ b/gcc/config/sh/t-mlib-sh4al 1970-01-01 01:00:00.000000000 +0100
+@@ -1 +0,0 @@
+-ML_sh4al=m4al/
+diff -Nur a/gcc/config/sh/t-mlib-sh4a-nofpu b/gcc/config/sh/t-mlib-sh4a-nofpu
+--- a/gcc/config/sh/t-mlib-sh4a-nofpu 2004-07-28 11:13:58.000000000 +0200
++++ b/gcc/config/sh/t-mlib-sh4a-nofpu 1970-01-01 01:00:00.000000000 +0100
+@@ -1 +0,0 @@
+-ML_sh4a_nofpu=m4a-nofpu/
+diff -Nur a/gcc/config/sh/t-mlib-sh4a-single b/gcc/config/sh/t-mlib-sh4a-single
+--- a/gcc/config/sh/t-mlib-sh4a-single 2004-07-28 11:13:58.000000000 +0200
++++ b/gcc/config/sh/t-mlib-sh4a-single 1970-01-01 01:00:00.000000000 +0100
+@@ -1 +0,0 @@
+-ML_sh4a_single=m4a-single/
+diff -Nur a/gcc/config/sh/t-mlib-sh4a-single-only b/gcc/config/sh/t-mlib-sh4a-single-only
+--- a/gcc/config/sh/t-mlib-sh4a-single-only 2004-07-28 11:13:58.000000000 +0200
++++ b/gcc/config/sh/t-mlib-sh4a-single-only 1970-01-01 01:00:00.000000000 +0100
+@@ -1 +0,0 @@
+-ML_sh4a_single_only=m4a-single-only/
+diff -Nur a/gcc/config/sh/t-mlib-sh4-nofpu b/gcc/config/sh/t-mlib-sh4-nofpu
+--- a/gcc/config/sh/t-mlib-sh4-nofpu 2004-06-21 20:18:40.000000000 +0200
++++ b/gcc/config/sh/t-mlib-sh4-nofpu 1970-01-01 01:00:00.000000000 +0100
+@@ -1 +0,0 @@
+-ML_sh4_nofpu=m4-nofpu/
+diff -Nur a/gcc/config/sh/t-mlib-sh4-single b/gcc/config/sh/t-mlib-sh4-single
+--- a/gcc/config/sh/t-mlib-sh4-single 2004-06-21 20:18:40.000000000 +0200
++++ b/gcc/config/sh/t-mlib-sh4-single 1970-01-01 01:00:00.000000000 +0100
+@@ -1 +0,0 @@
+-ML_sh4_single=m4-single/
+diff -Nur a/gcc/config/sh/t-mlib-sh4-single-only b/gcc/config/sh/t-mlib-sh4-single-only
+--- a/gcc/config/sh/t-mlib-sh4-single-only 2004-06-21 20:18:40.000000000 +0200
++++ b/gcc/config/sh/t-mlib-sh4-single-only 1970-01-01 01:00:00.000000000 +0100
+@@ -1 +0,0 @@
+-ML_sh4_single_only=m4-single-only/
+diff -Nur a/gcc/config/sh/t-mlib-sh5-32media b/gcc/config/sh/t-mlib-sh5-32media
+--- a/gcc/config/sh/t-mlib-sh5-32media 2004-06-21 20:18:40.000000000 +0200
++++ b/gcc/config/sh/t-mlib-sh5-32media 1970-01-01 01:00:00.000000000 +0100
+@@ -1 +0,0 @@
+-ML_sh5_32media=m5-32media/
+diff -Nur a/gcc/config/sh/t-mlib-sh5-32media-nofpu b/gcc/config/sh/t-mlib-sh5-32media-nofpu
+--- a/gcc/config/sh/t-mlib-sh5-32media-nofpu 2004-06-21 20:18:40.000000000 +0200
++++ b/gcc/config/sh/t-mlib-sh5-32media-nofpu 1970-01-01 01:00:00.000000000 +0100
+@@ -1 +0,0 @@
+-ML_sh5_32media_nofpu=m5-32media-nofpu/
+diff -Nur a/gcc/config/sh/t-mlib-sh5-64media b/gcc/config/sh/t-mlib-sh5-64media
+--- a/gcc/config/sh/t-mlib-sh5-64media 2004-06-21 20:18:40.000000000 +0200
++++ b/gcc/config/sh/t-mlib-sh5-64media 1970-01-01 01:00:00.000000000 +0100
+@@ -1 +0,0 @@
+-ML_sh5_64media=m5-64media/
+diff -Nur a/gcc/config/sh/t-mlib-sh5-64media-nofpu b/gcc/config/sh/t-mlib-sh5-64media-nofpu
+--- a/gcc/config/sh/t-mlib-sh5-64media-nofpu 2004-06-21 20:18:40.000000000 +0200
++++ b/gcc/config/sh/t-mlib-sh5-64media-nofpu 1970-01-01 01:00:00.000000000 +0100
+@@ -1 +0,0 @@
+-ML_sh5_64media_nofpu=m5-64media-nofpu/
+diff -Nur a/gcc/config/sh/t-mlib-sh5-compact b/gcc/config/sh/t-mlib-sh5-compact
+--- a/gcc/config/sh/t-mlib-sh5-compact 2004-06-21 20:18:40.000000000 +0200
++++ b/gcc/config/sh/t-mlib-sh5-compact 1970-01-01 01:00:00.000000000 +0100
+@@ -1 +0,0 @@
+-ML_sh5_compact=m5-compact/
+diff -Nur a/gcc/config/sh/t-mlib-sh5-compact-nofpu b/gcc/config/sh/t-mlib-sh5-compact-nofpu
+--- a/gcc/config/sh/t-mlib-sh5-compact-nofpu 2004-06-21 20:18:40.000000000 +0200
++++ b/gcc/config/sh/t-mlib-sh5-compact-nofpu 1970-01-01 01:00:00.000000000 +0100
+@@ -1 +0,0 @@
+-ML_sh5_compact_nofpu=m5-compact-nofpu/
+diff -Nur a/gcc/config/sh/t-sgxxlite-linux b/gcc/config/sh/t-sgxxlite-linux
+--- a/gcc/config/sh/t-sgxxlite-linux 1970-01-01 01:00:00.000000000 +0100
++++ b/gcc/config/sh/t-sgxxlite-linux 2010-01-25 09:50:29.075687537 +0100
+@@ -0,0 +1,3 @@
++MULTILIB_OPTIONS += muclibc
++MULTILIB_OSDIRNAMES += muclibc=!uclibc m4al/muclibc=!m4al/uclibc mb/muclibc=!mb/uclibc
++MULTILIB_EXCEPTIONS += mb/m4al/muclibc
+diff -Nur a/gcc/config/sh/t-sh b/gcc/config/sh/t-sh
+--- a/gcc/config/sh/t-sh 2008-10-25 00:10:52.000000000 +0200
++++ b/gcc/config/sh/t-sh 2010-01-25 09:50:29.075687537 +0100
+@@ -27,10 +27,10 @@
+ echo '#endif' >> fp-bit.c
+ cat $(srcdir)/config/fp-bit.c >> fp-bit.c
+
+-MULTILIB_ENDIAN = ml/mb
+-MULTILIB_CPUS= $(ML_sh1)$(ML_sh2a)$(ML_sh2a_nofpu)$(ML_sh2a_single_only)$(ML_sh2a_single)$(ML_sh2e)$(ML_sh2)$(ML_sh3e)$(ML_sh3)$(ML_sh4_nofpu)$(ML_sh4_single_only)$(ML_sh4_single)$(ML_sh4)$(ML_sh4a_nofpu)$(ML_sh4a_single_only)$(ML_sh4a_single)$(ML_sh4a)$(ML_sh5_32media)$(ML_sh5_32media_nofpu)$(ML_sh5_compact)$(ML_sh5_compact_nofpu)$(ML_sh5_64media)$(ML_sh5_64media_nofpu)
++DEFAULT_ENDIAN = $(word 1,$(TM_ENDIAN_CONFIG))
++OTHER_ENDIAN = $(word 2,$(TM_ENDIAN_CONFIG))
+
+-MULTILIB_OPTIONS= $(MULTILIB_ENDIAN) $(MULTILIB_CPUS:/=)
++MULTILIB_OPTIONS= $(OTHER_ENDIAN) $(TM_MULTILIB_CONFIG)
+ MULTILIB_DIRNAMES=
+
+ # The separate entries for m2a-nofpu and m2a-single-only with
+@@ -58,7 +58,34 @@
+ done)
+
+ # SH1 only supports big endian.
+-MULTILIB_EXCEPTIONS = ml/m1 ml/m2a*
++MULTILIB_EXCEPTIONS = ml/m1 ml/m2a* $(TM_MULTILIB_EXCEPTIONS_CONFIG)
++
++MULTILIB_OSDIRNAMES = \
++ $(OTHER_ENDIAN)=!$(OTHER_ENDIAN) \
++ m1=!m1 $(OTHER_ENDIAN)/m1=!$(OTHER_ENDIAN)/m1 \
++ m2a=!m2a $(OTHER_ENDIAN)/m2a=!$(OTHER_ENDIAN)/m2a \
++ m2a-nofpu=!m2a-nofpu $(OTHER_ENDIAN)/m2a-nofpu=!$(OTHER_ENDIAN)/m2a-nofpu \
++ m2a-single-only=!m2a-single-only $(OTHER_ENDIAN)/m2a-single-only=!$(OTHER_ENDIAN)/m2a-single-only \
++ m2a-single=!m2a-single $(OTHER_ENDIAN)/m2a-single=!$(OTHER_ENDIAN)/m2a-single \
++ m2e=!m2e $(OTHER_ENDIAN)/m2e=!$(OTHER_ENDIAN)/m2e \
++ m2=!m2 $(OTHER_ENDIAN)/m2=!$(OTHER_ENDIAN)/m2 \
++ m3e=!m3e $(OTHER_ENDIAN)/m3e=!$(OTHER_ENDIAN)/m3e \
++ m3=!m3 $(OTHER_ENDIAN)/m3=!$(OTHER_ENDIAN)/m3 \
++ m4-nofpu=!m4-nofpu $(OTHER_ENDIAN)/m4-nofpu=!$(OTHER_ENDIAN)/m4-nofpu \
++ m4-single-only=!m4-single-only $(OTHER_ENDIAN)/m4-single-only=!$(OTHER_ENDIAN)/m4-single-only \
++ m4-single=!m4-single $(OTHER_ENDIAN)/m4-single=!$(OTHER_ENDIAN)/m4-single \
++ m4=!m4 $(OTHER_ENDIAN)/m4=!$(OTHER_ENDIAN)/m4 \
++ m4a-nofpu=!m4a-nofpu $(OTHER_ENDIAN)/m4a-nofpu=!$(OTHER_ENDIAN)/m4a-nofpu \
++ m4a-single-only=!m4a-single-only $(OTHER_ENDIAN)/m4a-single-only=!$(OTHER_ENDIAN)/m4a-single-only \
++ m4a-single=!m4a-single $(OTHER_ENDIAN)/m4a-single=!$(OTHER_ENDIAN)/m4a-single \
++ m4a=!m4a $(OTHER_ENDIAN)/m4a=!$(OTHER_ENDIAN)/m4a \
++ m4al=!m4al $(OTHER_ENDIAN)/m4al=!$(OTHER_ENDIAN)/m4al \
++ m5-32media=!m5-32media $(OTHER_ENDIAN)/m5-32media=!$(OTHER_ENDIAN)/m5-32media \
++ m5-32media-nofpu=!m5-32media-nofpu $(OTHER_ENDIAN)/m5-32media-nofpu=!$(OTHER_ENDIAN)/m5-32media-nofpu \
++ m5-compact=!m5-compact $(OTHER_ENDIAN)/m5-compact=!$(OTHER_ENDIAN)/m5-compact \
++ m5-compact-nofpu=!m5-compact-nofpu $(OTHER_ENDIAN)/m5-compact-nofpu=!$(OTHER_ENDIAN)/m5-compact-nofpu \
++ m5-64media=!m5-64media $(OTHER_ENDIAN)/m5-64media=!$(OTHER_ENDIAN)/m5-64media \
++ m5-64media-nofpu=!m5-64media-nofpu $(OTHER_ENDIAN)/m5-64media-nofpu=!$(OTHER_ENDIAN)/m5-64media-nofpu
+
+ LIBGCC = stmp-multilib
+ INSTALL_LIBGCC = install-multilib
+diff -Nur a/gcc/config/sol2.h b/gcc/config/sol2.h
+--- a/gcc/config/sol2.h 2008-09-09 18:17:37.000000000 +0200
++++ b/gcc/config/sol2.h 2010-01-25 09:50:29.075687537 +0100
+@@ -123,12 +123,12 @@
+ %{YP,*} \
+ %{R*} \
+ %{compat-bsd: \
+- %{!YP,*:%{p|pg:-Y P,/usr/ucblib:/usr/ccs/lib/libp:/usr/lib/libp:/usr/ccs/lib:/usr/lib} \
+- %{!p:%{!pg:-Y P,/usr/ucblib:/usr/ccs/lib:/usr/lib}}} \
+- -R /usr/ucblib} \
++ %{!YP,*:%{p|pg:-Y P,%R/usr/ucblib:%R/usr/ccs/lib/libp:%R/usr/lib/libp:%R/usr/ccs/lib:%R/usr/lib} \
++ %{!p:%{!pg:-Y P,%R/usr/ucblib:%R/usr/ccs/lib:%R/usr/lib}}} \
++ -R %R/usr/ucblib} \
+ %{!compat-bsd: \
+- %{!YP,*:%{p|pg:-Y P,/usr/ccs/lib/libp:/usr/lib/libp:/usr/ccs/lib:/usr/lib} \
+- %{!p:%{!pg:-Y P,/usr/ccs/lib:/usr/lib}}}}"
++ %{!YP,*:%{p|pg:-Y P,%R/usr/ccs/lib/libp:%R/usr/lib/libp:%R/usr/ccs/lib:%R/usr/lib} \
++ %{!p:%{!pg:-Y P,%R/usr/ccs/lib:%R/usr/lib}}}}"
+
+ #undef LINK_ARCH32_SPEC
+ #define LINK_ARCH32_SPEC LINK_ARCH32_SPEC_BASE
+diff -Nur a/gcc/config/sparc/linux64.h b/gcc/config/sparc/linux64.h
+--- a/gcc/config/sparc/linux64.h 2009-02-20 16:20:38.000000000 +0100
++++ b/gcc/config/sparc/linux64.h 2010-01-25 09:50:29.075687537 +0100
+@@ -40,10 +40,15 @@
+ in a Medium/Low code model environment. */
+
+ #undef TARGET_DEFAULT
++#ifdef BIARCH_32BIT_DEFAULT
++#define TARGET_DEFAULT \
++ (MASK_APP_REGS + MASK_FPU)
++#else
+ #define TARGET_DEFAULT \
+ (MASK_V9 + MASK_PTR64 + MASK_64BIT /* + MASK_HARD_QUAD */ \
+ + MASK_STACK_BIAS + MASK_APP_REGS + MASK_FPU + MASK_LONG_DOUBLE_128)
+ #endif
++#endif
+
+ /* This must be v9a not just v9 because by default we enable
+ -mvis. */
+diff -Nur a/gcc/config/sparc/sol2-bi.h b/gcc/config/sparc/sol2-bi.h
+--- a/gcc/config/sparc/sol2-bi.h 2007-10-19 06:29:38.000000000 +0200
++++ b/gcc/config/sparc/sol2-bi.h 2010-01-25 09:50:29.075687537 +0100
+@@ -172,12 +172,12 @@
+ %{YP,*} \
+ %{R*} \
+ %{compat-bsd: \
+- %{!YP,*:%{p|pg:-Y P,/usr/ucblib/sparcv9:/usr/lib/libp/sparcv9:/usr/lib/sparcv9} \
+- %{!p:%{!pg:-Y P,/usr/ucblib/sparcv9:/usr/lib/sparcv9}}} \
+- -R /usr/ucblib/sparcv9} \
++ %{!YP,*:%{p|pg:-Y P,%R/usr/ucblib/sparcv9:%R/usr/lib/libp/sparcv9:%R/usr/lib/sparcv9} \
++ %{!p:%{!pg:-Y P,%R/usr/ucblib/sparcv9:%R/usr/lib/sparcv9}}} \
++ -R %R/usr/ucblib/sparcv9} \
+ %{!compat-bsd: \
+- %{!YP,*:%{p|pg:-Y P,/usr/lib/libp/sparcv9:/usr/lib/sparcv9} \
+- %{!p:%{!pg:-Y P,/usr/lib/sparcv9}}}}"
++ %{!YP,*:%{p|pg:-Y P,%R/usr/lib/libp/sparcv9:%R/usr/lib/sparcv9} \
++ %{!p:%{!pg:-Y P,%R/usr/lib/sparcv9}}}}"
+
+ #define LINK_ARCH64_SPEC LINK_ARCH64_SPEC_BASE
+
+diff -Nur a/gcc/config/sparc/sparc.c b/gcc/config/sparc/sparc.c
+--- a/gcc/config/sparc/sparc.c 2009-02-20 16:20:38.000000000 +0100
++++ b/gcc/config/sparc/sparc.c 2010-01-25 09:50:29.075687537 +0100
+@@ -6120,7 +6120,7 @@
+ sparc_emit_float_lib_cmp (rtx x, rtx y, enum rtx_code comparison)
+ {
+ const char *qpfunc;
+- rtx slot0, slot1, result, tem, tem2;
++ rtx slot0, slot1, result, tem, tem2, libfunc;
+ enum machine_mode mode;
+ enum rtx_code new_comparison;
+
+@@ -6183,7 +6183,8 @@
+ emit_move_insn (slot1, y);
+ }
+
+- emit_library_call (gen_rtx_SYMBOL_REF (Pmode, qpfunc), LCT_NORMAL,
++ libfunc = gen_rtx_SYMBOL_REF (Pmode, qpfunc);
++ emit_library_call (libfunc, LCT_NORMAL,
+ DImode, 2,
+ XEXP (slot0, 0), Pmode,
+ XEXP (slot1, 0), Pmode);
+@@ -6191,7 +6192,8 @@
+ }
+ else
+ {
+- emit_library_call (gen_rtx_SYMBOL_REF (Pmode, qpfunc), LCT_NORMAL,
++ libfunc = gen_rtx_SYMBOL_REF (Pmode, qpfunc);
++ emit_library_call (libfunc, LCT_NORMAL,
+ SImode, 2,
+ x, TFmode, y, TFmode);
+ mode = SImode;
+@@ -6202,7 +6204,7 @@
+ register so reload doesn't clobber the value if it needs
+ the return register for a spill reg. */
+ result = gen_reg_rtx (mode);
+- emit_move_insn (result, hard_libcall_value (mode));
++ emit_move_insn (result, hard_libcall_value (mode, libfunc));
+
+ switch (comparison)
+ {
+diff -Nur a/gcc/config/spu/spu.h b/gcc/config/spu/spu.h
+--- a/gcc/config/spu/spu.h 2009-04-24 00:50:16.000000000 +0200
++++ b/gcc/config/spu/spu.h 2010-01-25 09:50:29.085687411 +0100
+@@ -270,7 +270,8 @@
+
+ #define DWARF_FRAME_RETURN_COLUMN DWARF_FRAME_REGNUM (LINK_REGISTER_REGNUM)
+
+-#define ARG_POINTER_CFA_OFFSET(FNDECL) (-STACK_POINTER_OFFSET)
++#define ARG_POINTER_CFA_OFFSET(FNDECL) \
++ (crtl->args.pretend_args_size - STACK_POINTER_OFFSET)
+
+
+ /* Stack Checking */
+diff -Nur a/gcc/config/t-eglibc b/gcc/config/t-eglibc
+--- a/gcc/config/t-eglibc 1970-01-01 01:00:00.000000000 +0100
++++ b/gcc/config/t-eglibc 2010-01-25 09:50:29.085687411 +0100
+@@ -0,0 +1,25 @@
++# multilibs -*- mode:Makefile -*-
++
++MULTILIB_EXCEPTIONS :=
++MULTILIB_MATCHES :=
++MULTILIB_ALIASES :=
++
++# For all items in EGLIBC_CONFIGS except for the last one
++# do $1. For the last one do $2. The items are separated with ",".
++EGLIBC_AWK = $(shell echo $(EGLIBC_CONFIGS) | $(AWK) \
++ '{ \
++ N=split ($$0, configs, ","); \
++ for (i = 1; i < N; ++i) $1; \
++ $2; \
++ }')
++
++MULTILIB_OPTIONS := $(call EGLIBC_AWK, \
++ printf ("feglibc=%s/", configs[i]), \
++ printf ("feglibc=%s\n", configs[i]))
++MULTILIB_DIRNAMES := $(call EGLIBC_AWK, \
++ printf ("%s ", configs[i]), \
++ printf ("%s\n", configs[i]))
++MULTILIB_OSDIRNAMES := $(call EGLIBC_AWK, \
++ printf ("feglibc.%s=!%s ", configs[i], configs[i]), \
++ printf ("feglibc.%s=!%s\n", configs[i], configs[i]))
++
+diff -Nur a/gcc/config/t-sysroot-suffix b/gcc/config/t-sysroot-suffix
+--- a/gcc/config/t-sysroot-suffix 1970-01-01 01:00:00.000000000 +0100
++++ b/gcc/config/t-sysroot-suffix 2010-01-25 09:50:29.085687411 +0100
+@@ -0,0 +1,7 @@
++# Generate SYSROOT_SUFFIX_SPEC from MULTILIB_OSDIRNAMES
++
++sysroot-suffix.h: $(srcdir)/config/print-sysroot-suffix.sh
++ $(SHELL) $(srcdir)/config/print-sysroot-suffix.sh \
++ "$(MULTILIB_OSDIRNAMES)" "$(MULTILIB_OPTIONS)" \
++ "$(MULTILIB_MATCHES)" "$(MULTILIB_ALIASES)" > tmp-sysroot-suffix.h
++ mv tmp-sysroot-suffix.h $@
+diff -Nur a/gcc/config/vx-common.h b/gcc/config/vx-common.h
+--- a/gcc/config/vx-common.h 2009-02-20 16:20:38.000000000 +0100
++++ b/gcc/config/vx-common.h 2010-01-25 09:50:29.085687411 +0100
+@@ -92,3 +92,6 @@
+ /* We occasionally need to distinguish between the VxWorks variants. */
+ #define VXWORKS_KIND_NORMAL 1
+ #define VXWORKS_KIND_AE 2
++
++/* Enable get_feature license checking. */
++#define TARGET_FLEXLM
+diff -Nur a/gcc/config.gcc b/gcc/config.gcc
+--- a/gcc/config.gcc 2009-04-17 13:58:41.000000000 +0200
++++ b/gcc/config.gcc 2010-01-25 09:50:29.085687411 +0100
+@@ -721,6 +721,28 @@
+ need_64bit_hwint=yes
+ # The EABI requires the use of __cxa_atexit.
+ default_use_cxa_atexit=yes
++ case ${target} in
++ arm-wrs-linux-gnueabi)
++ tm_file="$tm_file arm/wrs-linux.h"
++ tmake_file="$tmake_file arm/t-wrs-linux"
++ tm_defines="$tm_defines TARGET_FLEXLM"
++ ;;
++ arm-montavista*-linux-gnueabi)
++ tm_file="$tm_file arm/montavista-linux.h"
++ tmake_file="$tmake_file arm/t-montavista-linux"
++ ;;
++ *)
++ if test x$enable_extra_asa_multilibs = xyes; then
++ tmake_file="${tmake_file} arm/t-asa"
++ elif test x$enable_extra_sgxx_multilibs = xyes; then
++ tmake_file="${tmake_file} arm/t-cs-linux"
++ elif test x$enable_extra_sgxxlite_multilibs = xyes; then
++ tmake_file="${tmake_file} arm/t-cs-linux-lite"
++ fi
++ tm_file="$tm_file ./sysroot-suffix.h"
++ tmake_file="$tmake_file t-sysroot-suffix"
++ ;;
++ esac
+ ;;
+ *)
+ tmake_file="$tmake_file arm/t-linux"
+@@ -742,6 +764,13 @@
+ need_64bit_hwint=yes
+ # The EABI requires the use of __cxa_atexit.
+ default_use_cxa_atexit=yes
++ if test x$enable_extra_sgxx_multilibs = xyes; then
++ tmake_file="${tmake_file} arm/t-cs-uclinux-eabi"
++ elif test x$enable_extra_sgxxlite_multilibs = xyes; then
++ tmake_file="${tmake_file} arm/t-cs-uclinux-eabi"
++ fi
++ tm_file="$tm_file ./sysroot-suffix.h"
++ tmake_file="$tmake_file t-sysroot-suffix"
+ esac
+ tm_file="$tm_file arm/aout.h arm/arm.h"
+ tmake_file="${tmake_file} arm/t-arm-softfp soft-fp/t-softfp"
+@@ -762,8 +791,14 @@
+ case ${target} in
+ arm*-*-eabi*)
+ tm_file="$tm_file arm/eabi.h"
++ tm_file="${tm_file} arm/nocrt0.h"
+ tmake_file="${tmake_file} arm/t-bpabi"
+ extra_options="${extra_options} arm/eabi.opt"
++ if test x$enable_extra_sgxx_multilibs = xyes; then
++ tmake_file="${tmake_file} arm/t-cs-eabi"
++ elif test x$enable_extra_sgxxlite_multilibs = xyes; then
++ tmake_file="${tmake_file} arm/t-cs-eabi-lite"
++ fi
+ ;;
+ arm*-*-symbianelf*)
+ tm_file="${tm_file} arm/symbian.h"
+@@ -1088,7 +1123,7 @@
+ tmake_file="${tmake_file} i386/t-linux64"
+ need_64bit_hwint=yes
+ case X"${with_cpu}" in
+- Xgeneric|Xcore2|Xnocona|Xx86-64|Xamdfam10|Xbarcelona|Xk8|Xopteron|Xathlon64|Xathlon-fx)
++ Xgeneric|Xatom|Xcore2|Xnocona|Xx86-64|Xamdfam10|Xbarcelona|Xk8|Xopteron|Xathlon64|Xathlon-fx)
+ ;;
+ X)
+ if test x$with_cpu_64 = x; then
+@@ -1097,13 +1132,29 @@
+ ;;
+ *)
+ echo "Unsupported CPU used in --with-cpu=$with_cpu, supported values:" 1>&2
+- echo "generic core2 nocona x86-64 amdfam10 barcelona k8 opteron athlon64 athlon-fx" 1>&2
++ echo "generic atom core2 nocona x86-64 amdfam10 barcelona k8 opteron athlon64 athlon-fx" 1>&2
+ exit 1
+ ;;
+ esac
+ else
+ tm_file="${tm_file} i386/linux.h"
+ fi
++ case ${target} in
++ *-wrs-linux*)
++ tm_file="$tm_file i386/wrs-linux.h"
++ tmake_file="$tmake_file i386/t-wrs-linux"
++ extra_options="${extra_options} i386/wrs-linux.opt"
++ tm_defines="${tm_defines} TARGET_FLEXLM"
++ ;;
++ esac
++ if test x$enable_extra_sgxx_multilibs = xyes; then
++ tm_file="${tm_file} i386/cs-linux.h"
++ tmake_file="${tmake_file} i386/t-cs-linux"
++ extra_options="${extra_options} i386/cs-linux.opt"
++ elif test x$enable_extra_sgxxlite_multilibs = xyes; then
++ tm_file="${tm_file} i386/cs-linux-lite.h"
++ tmake_file="${tmake_file} i386/t-cs-linux-lite"
++ fi
+ ;;
+ i[34567]86-*-knetbsd*-gnu) tm_file="${tm_file} i386/linux.h knetbsd-gnu.h i386/knetbsd-gnu.h" ;;
+ i[34567]86-*-kfreebsd*-gnu) tm_file="${tm_file} i386/linux.h kfreebsd-gnu.h i386/kfreebsd-gnu.h" ;;
+@@ -1202,7 +1253,7 @@
+ # libgcc/configure.ac instead.
+ need_64bit_hwint=yes
+ case X"${with_cpu}" in
+- Xgeneric|Xcore2|Xnocona|Xx86-64|Xamdfam10|Xbarcelona|Xk8|Xopteron|Xathlon64|Xathlon-fx)
++ Xgeneric|Xatom|Xcore2|Xnocona|Xx86-64|Xamdfam10|Xbarcelona|Xk8|Xopteron|Xathlon64|Xathlon-fx)
+ ;;
+ X)
+ if test x$with_cpu_64 = x; then
+@@ -1211,7 +1262,7 @@
+ ;;
+ *)
+ echo "Unsupported CPU used in --with-cpu=$with_cpu, supported values:" 1>&2
+- echo "generic core2 nocona x86-64 amdfam10 barcelona k8 opteron athlon64 athlon-fx" 1>&2
++ echo "generic atom core2 nocona x86-64 amdfam10 barcelona k8 opteron athlon64 athlon-fx" 1>&2
+ exit 1
+ ;;
+ esac
+@@ -1566,6 +1617,7 @@
+ tm_defines="${tm_defines} MIPS_ISA_DEFAULT=65"
+ ;;
+ esac
++ tmake_file="$tmake_file mips/t-crtfm"
+ gnu_ld=yes
+ gas=yes
+ test x$with_llsc != x || with_llsc=yes
+@@ -1579,8 +1631,28 @@
+ ;;
+ mipsisa32*)
+ tm_defines="${tm_defines} MIPS_ISA_DEFAULT=32"
++ ;;
++ mips-wrs-linux-gnu)
++ tmake_file="$tmake_file mips/t-linux64 mips/t-wrs-linux"
++ tm_file="$tm_file mips/linux64.h mips/octeon.h mips/wrs-linux.h"
++ tm_defines="$tm_defines TARGET_FLEXLM"
++ ;;
++ mips-montavista*-linux-gnu)
++ tmake_file="$tmake_file mips/t-linux64 mips/t-montavista-linux"
++ tm_file="$tm_file mips/linux64.h mips/octeon.h mips/montavista-linux.h"
++ ;;
++ *)
++ if test x$enable_extra_sgxx_multilibs = xyes; then
++ tmake_file="$tmake_file mips/t-sgxx-linux"
++ tm_file="$tm_file mips/cs-sgxx-linux.h"
++ elif test x$enable_extra_sgxxlite_multilibs = xyes; then
++ tmake_file="$tmake_file mips/t-sgxxlite-linux"
++ tm_file="$tm_file mips/cs-sgxxlite-linux.h"
++ fi
++ ;;
+ esac
+ test x$with_llsc != x || with_llsc=yes
++ tmake_file="$tmake_file mips/t-crtfm"
+ ;;
+ mips*-*-openbsd*)
+ tm_defines="${tm_defines} OBSD_HAS_DECLARE_FUNCTION_NAME OBSD_HAS_DECLARE_OBJECT OBSD_HAS_CORRECT_SPECS"
+@@ -1625,6 +1697,25 @@
+ tm_defines="MIPS_ISA_DEFAULT=64 MIPS_ABI_DEFAULT=ABI_N32"
+ ;;
+ esac
++ if [ "$enable_sgxx_sde_multilibs" = "yes" ]; then
++ tm_file="$tm_file mips/sdemtk.h"
++ extra_options="$extra_options mips/sdemtk.opt"
++ tmake_file="$tmake_file mips/t-sgxx-sde"
++ # SourceryG++ is configured --with-arch=mips32r2.
++ tm_defines="MIPS_ISA_DEFAULT=33 MIPS_ABI_DEFAULT=ABI_32"
++ fi
++ ;;
++mips64octeon*-wrs-elf*)
++ tm_file="elfos.h ${tm_file} mips/elf.h mips/octeon.h mips/octeon-elf.h"
++ tmake_file=mips/t-octeon-elf
++ tm_defines="MIPS_ABI_DEFAULT=ABI_EABI MIPS_CPU_STRING_DEFAULT=\\\"octeon\\\" TARGET_FLEXLM"
++ default_use_cxa_atexit=no
++ ;;
++mips64octeon*-montavista-elf*)
++ tm_file="elfos.h ${tm_file} mips/elf.h mips/octeon.h mips/octeon-elf.h"
++ tmake_file="mips/t-octeon-elf mips/t-montavista-elf"
++ tm_defines="MIPS_ABI_DEFAULT=ABI_EABI MIPS_CPU_STRING_DEFAULT=\\\"octeon\\\""
++ default_use_cxa_atexit=no
+ ;;
+ mipsisa32-*-elf* | mipsisa32el-*-elf* | \
+ mipsisa32r2-*-elf* | mipsisa32r2el-*-elf* | \
+@@ -1796,6 +1887,10 @@
+ tm_file="${tm_file} dbxelf.h elfos.h usegas.h svr4.h freebsd-spec.h rs6000/sysv4.h"
+ extra_options="${extra_options} rs6000/sysv4.opt"
+ tmake_file="rs6000/t-fprules rs6000/t-fprules-fpbit rs6000/t-ppcgas rs6000/t-ppccomm"
++ if test x$enable_powerpc_e500mc_elf = xyes; then
++ tm_file="${tm_file} rs6000/e500mc.h"
++ tmake_file="${tmake_file} rs6000/t-ppc-e500mc"
++ fi
+ ;;
+ powerpc-*-eabialtivec*)
+ tm_file="${tm_file} dbxelf.h elfos.h svr4.h freebsd-spec.h rs6000/sysv4.h rs6000/eabi.h rs6000/e500.h rs6000/eabialtivec.h"
+@@ -1811,6 +1906,11 @@
+ tm_file="${tm_file} dbxelf.h elfos.h usegas.h svr4.h freebsd-spec.h rs6000/sysv4.h rs6000/eabi.h rs6000/e500.h"
+ extra_options="${extra_options} rs6000/sysv4.opt"
+ tmake_file="rs6000/t-fprules rs6000/t-fprules-fpbit rs6000/t-ppcgas rs6000/t-ppccomm"
++ if test x$enable_extra_sgxx_multilibs = xyes; then
++ tmake_file="${tmake_file} rs6000/t-cs-eabi"
++ elif test x$enable_extra_sgxxlite_multilibs = xyes; then
++ tmake_file="${tmake_file} rs6000/t-cs-eabi-lite"
++ fi
+ ;;
+ powerpc-*-rtems*)
+ tm_file="${tm_file} dbxelf.h elfos.h svr4.h freebsd-spec.h rs6000/sysv4.h rs6000/eabi.h rs6000/e500.h rs6000/rtems.h rtems.h"
+@@ -1853,6 +1953,26 @@
+ if test x${enable_secureplt} = xyes; then
+ tm_file="rs6000/secureplt.h ${tm_file}"
+ fi
++ case ${target} in
++ powerpc-wrs-linux-gnu)
++ tm_file="$tm_file rs6000/wrs-linux.h rs6000/e500.h"
++ tmake_file="$tmake_file rs6000/t-wrs-linux"
++ tm_defines="$tm_defines TARGET_FLEXLM"
++ ;;
++ powerpc-montavista*-linux-gnu)
++ tm_file="$tm_file rs6000/montavista-linux.h"
++ tmake_file="$tmake_file rs6000/t-montavista-linux"
++ ;;
++ *)
++ if test x$enable_extra_sgxx_multilibs = xyes; then
++ tm_file="${tm_file} rs6000/e500.h"
++ tmake_file="$tmake_file rs6000/t-cs-linux"
++ elif test x$enable_extra_sgxxlite_multilibs = xyes; then
++ tm_file="${tm_file} rs6000/e500.h"
++ tmake_file="$tmake_file rs6000/t-cs-linux"
++ fi
++ ;;
++ esac
+ ;;
+ powerpc-*-gnu-gnualtivec*)
+ tm_file="${cpu_type}/${cpu_type}.h elfos.h svr4.h freebsd-spec.h gnu.h rs6000/sysv4.h rs6000/linux.h rs6000/linuxaltivec.h rs6000/gnu.h"
+@@ -2009,9 +2129,14 @@
+ *) with_endian=big,little ;;
+ esac
+ fi
++ # TM_ENDIAN_CONFIG is used by t-sh to determine multilibs.
++ # First word : the default endian.
++ # Second word: the secondary endian (optional).
+ case ${with_endian} in
+- big|little) tmake_file="${tmake_file} sh/t-1e" ;;
+- big,little|little,big) ;;
++ big) TM_ENDIAN_CONFIG=mb ;;
++ little) TM_ENDIAN_CONFIG=ml ;;
++ big,little) TM_ENDIAN_CONFIG="mb ml" ;;
++ little,big) TM_ENDIAN_CONFIG="ml mb" ;;
+ *) echo "with_endian=${with_endian} not supported."; exit 1 ;;
+ esac
+ case ${with_endian} in
+@@ -2118,7 +2243,7 @@
+ *) echo "with_cpu=$with_cpu not supported"; exit 1 ;;
+ esac
+ sh_multilibs=${with_multilib_list}
+- if test x${sh_multilibs} = x ; then
++ if test "$sh_multilibs" = "default" ; then
+ case ${target} in
+ sh64-superh-linux* | \
+ sh[1234]*) sh_multilibs=${sh_cpu_target} ;;
+@@ -2134,28 +2259,43 @@
+ fi
+ target_cpu_default=SELECT_`echo ${sh_cpu_default}|tr abcdefghijklmnopqrstuvwxyz- ABCDEFGHIJKLMNOPQRSTUVWXYZ_`
+ tm_defines=${tm_defines}' SH_MULTILIB_CPU_DEFAULT=\"'`echo $sh_cpu_default|sed s/sh/m/`'\"'
+- sh_multilibs=`echo $sh_multilibs,$sh_cpu_default | sed -e 's/[ ,/][ ,]*/ /g' -e 's/ $//' -e 's/^m/sh/' -e 's/ m/ sh/g' | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ_ abcdefghijklmnopqrstuvwxyz-`
++ tm_defines="$tm_defines SUPPORT_`echo $sh_cpu_default | sed 's/^m/sh/' | tr abcdefghijklmnopqrstuvwxyz- ABCDEFGHIJKLMNOPQRSTUVWXYZ_`=1"
++ sh_multilibs=`echo $sh_multilibs | sed -e 's/,/ /g' -e 's/^sh/m/i' -e 's/ sh/ m/gi' | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ_ abcdefghijklmnopqrstuvwxyz-`
+ for sh_multilib in ${sh_multilibs}; do
+ case ${sh_multilib} in
+- sh1 | sh2 | sh2e | sh3 | sh3e | \
+- sh4 | sh4-single | sh4-single-only | sh4-nofpu | sh4-300 |\
+- sh4a | sh4a-single | sh4a-single-only | sh4a-nofpu | sh4al | \
+- sh2a | sh2a-single | sh2a-single-only | sh2a-nofpu | \
+- sh5-64media | sh5-64media-nofpu | \
+- sh5-32media | sh5-32media-nofpu | \
+- sh5-compact | sh5-compact-nofpu)
+- tmake_file="${tmake_file} sh/t-mlib-${sh_multilib}"
+- tm_defines="$tm_defines SUPPORT_`echo $sh_multilib|tr abcdefghijklmnopqrstuvwxyz- ABCDEFGHIJKLMNOPQRSTUVWXYZ_`=1"
+- ;;
++ m1 | m2 | m2e | m3 | m3e | \
++ m4 | m4-single | m4-single-only | m4-nofpu | m4-300 |\
++ m4a | m4a-single | m4a-single-only | m4a-nofpu | m4al | \
++ m2a | m2a-single | m2a-single-only | m2a-nofpu | \
++ m5-64media | m5-64media-nofpu | \
++ m5-32media | m5-32media-nofpu | \
++ m5-compact | m5-compact-nofpu)
++ # TM_MULTILIB_CONFIG is used by t-sh for the non-endian multilib definition
++ # It is passed to MULTIILIB_OPTIONS verbatim.
++ TM_MULTILIB_CONFIG="${TM_MULTILIB_CONFIG}/${sh_multilib}"
++ tm_defines="$tm_defines SUPPORT_`echo $sh_multilib | sed 's/^m/sh/' | tr abcdefghijklmnopqrstuvwxyz- ABCDEFGHIJKLMNOPQRSTUVWXYZ_`=1"
++ ;;
++ \!*) # TM_MULTILIB_EXCEPTIONS_CONFIG is used by t-sh
++ # It is passed the MULTILIB_EXCEPTIONS verbatim.
++ TM_MULTILIB_EXCEPTIONS_CONFIG="${TM_MULTILIB_EXCEPTIONS_CONFIG} `echo $sh_multilib | sed 's/^!//'`" ;;
+ *)
+ echo "with_multilib_list=${sh_multilib} not supported."
+ exit 1
+ ;;
+ esac
+ done
++ TM_MULTILIB_CONFIG=`echo $TM_MULTILIB_CONFIG | sed 's:^/::'`
+ if test x${enable_incomplete_targets} = xyes ; then
+ tm_defines="$tm_defines SUPPORT_SH1=1 SUPPORT_SH2E=1 SUPPORT_SH4=1 SUPPORT_SH4_SINGLE=1 SUPPORT_SH2A=1 SUPPORT_SH2A_SINGLE=1 SUPPORT_SH5_32MEDIA=1 SUPPORT_SH5_32MEDIA_NOFPU=1 SUPPORT_SH5_64MEDIA=1 SUPPORT_SH5_64MEDIA_NOFPU=1"
+ fi
++ if test x$enable_extra_sgxxlite_multilibs = xyes \
++ || test x$enable_extra_sgxx_multilibs = xyes; then
++ # SG++ and Lite do not differ, as yet, so use the Lite files for both
++ tm_file="$tm_file sh/cs-sgxxlite-linux.h"
++ tmake_file="$tmake_file sh/t-sgxxlite-linux"
++ fi
++ tm_file="$tm_file ./sysroot-suffix.h"
++ tmake_file="$tmake_file t-sysroot-suffix"
+ ;;
+ sh-*-rtems*)
+ tmake_file="sh/t-sh sh/t-elf t-rtems sh/t-rtems"
+@@ -2194,6 +2334,11 @@
+ tm_file="${tm_file} sparc/linux.h"
+ fi
+ tmake_file="${tmake_file} sparc/t-crtfm"
++ case ${target} in
++ sparc-wrs-linux-gnu)
++ tm_defines="$tm_defines BIARCH_32BIT_DEFAULT TARGET_FLEXLM"
++ ;;
++ esac
+ ;;
+ sparc-*-rtems*)
+ tm_file="${tm_file} dbxelf.h elfos.h svr4.h sparc/sysv4.h sparc/sp-elf.h sparc/rtemself.h rtems.h"
+@@ -2420,6 +2565,8 @@
+ i[34567]86-*-* | x86_64-*-*)
+ tmake_file="${tmake_file} i386/t-gmm_malloc i386/t-i386"
+ ;;
++powerpc*-*-* | rs6000-*-*)
++ tm_file="${tm_file} rs6000/option-defaults.h"
+ esac
+
+ # Support for --with-cpu and related options (and a few unrelated options,
+@@ -2646,8 +2793,8 @@
+ | armv[23456] | armv2a | armv3m | armv4t | armv5t \
+ | armv5te | armv6j |armv6k | armv6z | armv6zk | armv6-m \
+ | armv7 | armv7-a | armv7-r | armv7-m \
+- | iwmmxt | ep9312)
+- # OK
++ | iwmmxt | ep9312 | marvell-f )
++ # OK
+ ;;
+ *)
+ echo "Unknown arch used in --with-arch=$with_arch" 1>&2
+@@ -2668,7 +2815,10 @@
+
+ case "$with_fpu" in
+ "" \
+- | fpa | fpe2 | fpe3 | maverick | vfp | vfp3 | neon )
++ | fpa | fpe2 | fpe3 | maverick \
++ | vfp | vfp3 | vfpv3 | vfpv3-fp16 | vfpv3-d16 \
++ | vfpv3-d16-fp16 | vfpv4 | vfpv4-d16 | fpv4-sp-d16 \
++ | neon | neon-fp16 | neon-vfpv4 )
+ # OK
+ ;;
+ *)
+@@ -2805,7 +2955,7 @@
+ esac
+ # OK
+ ;;
+- "" | amdfam10 | barcelona | k8 | opteron | athlon64 | athlon-fx | nocona | core2 | generic)
++ "" | amdfam10 | barcelona | k8 | opteron | athlon64 | athlon-fx | nocona | core2 | atom | generic)
+ # OK
+ ;;
+ *)
+@@ -2817,7 +2967,7 @@
+ ;;
+
+ mips*-*-*)
+- supported_defaults="abi arch float tune divide llsc mips-plt"
++ supported_defaults="abi arch arch_32 arch_64 float tune tune_32 tune_64 divide llsc mips-plt"
+
+ case ${with_float} in
+ "" | soft | hard)
+@@ -2882,12 +3032,20 @@
+ ;;
+
+ powerpc*-*-* | rs6000-*-*)
+- supported_defaults="cpu float tune"
++ supported_defaults="cpu cpu_32 cpu_64 float tune tune_32 tune_64"
+
+- for which in cpu tune; do
++ for which in cpu cpu_32 cpu_64 tune tune_32 tune_64; do
+ eval "val=\$with_$which"
+ case ${val} in
+ default32 | default64)
++ case $which in
++ cpu | tune)
++ ;;
++ *)
++ echo "$val only valid for --with-cpu and --with-tune." 1>&2
++ exit 1
++ ;;
++ esac
+ with_which="with_$which"
+ eval $with_which=
+ ;;
+@@ -3133,6 +3291,22 @@
+ ;;
+ esac
+
++case ${target} in
++ *-eglibc-*-*)
++ tmake_file="${tmake_file} t-eglibc"
++
++ case ${target} in
++ arm-*)
++ # ARM already includes below.
++ ;;
++ *)
++ tmake_file="${tmake_file} t-sysroot-suffix"
++ tm_file="${tm_file} ./sysroot-suffix.h"
++ ;;
++ esac
++ ;;
++esac
++
+ t=
+ all_defaults="abi cpu cpu_32 cpu_64 arch arch_32 arch_64 tune tune_32 tune_64 schedule float mode fpu divide llsc mips-plt"
+ for option in $all_defaults
+diff -Nur a/gcc/config.in b/gcc/config.in
+--- a/gcc/config.in 2009-07-22 09:43:59.000000000 +0200
++++ b/gcc/config.in 2010-01-25 09:50:29.085687411 +0100
+@@ -12,6 +12,18 @@
+ #endif
+
+
++/* Required license feature */
++#ifndef USED_FOR_TARGET
++#undef CSL_LICENSE_FEATURE
++#endif
++
++
++/* Required license version */
++#ifndef USED_FOR_TARGET
++#undef CSL_LICENSE_VERSION
++#endif
++
++
+ /* Define to enable the use of a default assembler. */
+ #ifndef USED_FOR_TARGET
+ #undef DEFAULT_ASSEMBLER
+@@ -108,6 +120,12 @@
+ #endif
+
+
++/* Define to warn for use of native system header directories */
++#ifndef USED_FOR_TARGET
++#undef ENABLE_POISON_SYSTEM_DIRECTORIES
++#endif
++
++
+ /* Define if you want all operations on RTL (the basic data structure of the
+ optimizer and back end) to be checked for dynamic type safety at runtime.
+ This is quite expensive. */
+@@ -821,6 +839,13 @@
+ #endif
+
+
++/* Define if your assembler supports specifying the alignment of objects
++ allocated using the GAS .comm command. */
++#ifndef USED_FOR_TARGET
++#undef HAVE_GAS_ALIGNED_COMM
++#endif
++
++
+ /* Define if your assembler supports .balign and .p2align. */
+ #ifndef USED_FOR_TARGET
+ #undef HAVE_GAS_BALIGN_AND_P2ALIGN
+diff -Nur a/gcc/configure b/gcc/configure
+--- a/gcc/configure 2009-03-24 18:46:03.000000000 +0100
++++ b/gcc/configure 2010-01-25 09:50:29.085687411 +0100
+@@ -458,7 +458,7 @@
+ # include <unistd.h>
+ #endif"
+
+-ac_subst_vars='SHELL PATH_SEPARATOR PACKAGE_NAME PACKAGE_TARNAME PACKAGE_VERSION PACKAGE_STRING PACKAGE_BUGREPORT exec_prefix prefix program_transform_name bindir sbindir libexecdir datadir sysconfdir sharedstatedir localstatedir libdir includedir oldincludedir infodir mandir build_alias host_alias target_alias DEFS ECHO_C ECHO_N ECHO_T LIBS build build_cpu build_vendor build_os host host_cpu host_vendor host_os target target_cpu target_vendor target_os target_noncanonical build_libsubdir build_subdir host_subdir target_subdir GENINSRC CC CFLAGS LDFLAGS CPPFLAGS ac_ct_CC EXEEXT OBJEXT GNATBIND ac_ct_GNATBIND GNATMAKE ac_ct_GNATMAKE NO_MINUS_C_MINUS_O OUTPUT_OPTION CPP EGREP loose_warn strict_warn warn_cflags nocommon_flag TREEBROWSER valgrind_path valgrind_path_defines valgrind_command coverage_flags enable_multilib enable_decimal_float enable_fixed_point enable_shared TARGET_SYSTEM_ROOT TARGET_SYSTEM_ROOT_DEFINE CROSS_SYSTEM_HEADER_DIR onestep PKGVERSION REPORT_BUGS_TO REPORT_BUGS_TEXI datarootdir docdir htmldir SET_MAKE AWK LN_S LN RANLIB ac_ct_RANLIB ranlib_flags INSTALL INSTALL_PROGRAM INSTALL_DATA make_compare_target have_mktemp_command MAKEINFO BUILD_INFO GENERATED_MANPAGES FLEX BISON NM AR COLLECT2_LIBS GNAT_LIBEXC LDEXP_LIB TARGET_GETGROUPS_T LIBICONV LTLIBICONV LIBICONV_DEP manext objext gthread_flags extra_modes_file extra_opt_files USE_NLS LIBINTL LIBINTL_DEP INCINTL XGETTEXT GMSGFMT POSUB CATALOGS DATADIRNAME INSTOBJEXT GENCAT CATOBJEXT CROSS ALL SYSTEM_HEADER_DIR inhibit_libc CC_FOR_BUILD BUILD_CFLAGS BUILD_LDFLAGS STMP_FIXINC STMP_FIXPROTO collect2 LIBTOOL SED FGREP GREP LD DUMPBIN ac_ct_DUMPBIN OBJDUMP ac_ct_OBJDUMP ac_ct_AR STRIP ac_ct_STRIP lt_ECHO DSYMUTIL ac_ct_DSYMUTIL NMEDIT ac_ct_NMEDIT LIPO ac_ct_LIPO OTOOL ac_ct_OTOOL OTOOL64 ac_ct_OTOOL64 objdir enable_fast_install gcc_cv_as ORIGINAL_AS_FOR_TARGET gcc_cv_ld ORIGINAL_LD_FOR_TARGET gcc_cv_nm ORIGINAL_NM_FOR_TARGET gcc_cv_objdump gcc_cv_readelf libgcc_visibility GGC zlibdir zlibinc MAINT gcc_tooldir dollar slibdir subdirs srcdir all_compilers all_gtfiles all_lang_makefrags all_lang_makefiles all_languages all_selected_languages build_exeext build_install_headers_dir build_xm_file_list build_xm_include_list build_xm_defines build_file_translate check_languages cpp_install_dir xmake_file tmake_file extra_gcc_objs extra_headers_list extra_objs extra_parts extra_passes extra_programs float_h_file gcc_config_arguments gcc_gxx_include_dir host_exeext host_xm_file_list host_xm_include_list host_xm_defines out_host_hook_obj install lang_opt_files lang_specs_files lang_tree_files local_prefix md_file objc_boehm_gc out_file out_object_file thread_file tm_file_list tm_include_list tm_defines tm_p_file_list tm_p_include_list xm_file_list xm_include_list xm_defines c_target_objs cxx_target_objs fortran_target_objs target_cpu_default GMPLIBS GMPINC PPLLIBS PPLINC CLOOGLIBS CLOOGINC LIBOBJS LTLIBOBJS'
++ac_subst_vars='SHELL PATH_SEPARATOR PACKAGE_NAME PACKAGE_TARNAME PACKAGE_VERSION PACKAGE_STRING PACKAGE_BUGREPORT exec_prefix prefix program_transform_name bindir sbindir libexecdir datadir sysconfdir sharedstatedir localstatedir libdir includedir oldincludedir infodir mandir build_alias host_alias target_alias DEFS ECHO_C ECHO_N ECHO_T LIBS build build_cpu build_vendor build_os host host_cpu host_vendor host_os target target_cpu target_vendor target_os target_noncanonical licensedir build_libsubdir build_subdir host_subdir target_subdir GENINSRC CC CFLAGS LDFLAGS CPPFLAGS ac_ct_CC EXEEXT OBJEXT GNATBIND ac_ct_GNATBIND GNATMAKE ac_ct_GNATMAKE NO_MINUS_C_MINUS_O OUTPUT_OPTION CPP EGREP loose_warn strict_warn warn_cflags nocommon_flag TREEBROWSER valgrind_path valgrind_path_defines valgrind_command coverage_flags enable_multilib enable_decimal_float enable_fixed_point enable_shared TARGET_SYSTEM_ROOT TARGET_SYSTEM_ROOT_DEFINE CROSS_SYSTEM_HEADER_DIR EGLIBC_CONFIGS CONFIGURE_SPECS onestep PKGVERSION REPORT_BUGS_TO REPORT_BUGS_TEXI datarootdir docdir htmldir SET_MAKE AWK LN_S LN RANLIB ac_ct_RANLIB ranlib_flags INSTALL INSTALL_PROGRAM INSTALL_DATA make_compare_target have_mktemp_command MAKEINFO BUILD_INFO GENERATED_MANPAGES FLEX BISON NM AR COLLECT2_LIBS GNAT_LIBEXC LDEXP_LIB TARGET_GETGROUPS_T LIBICONV LTLIBICONV LIBICONV_DEP manext objext gthread_flags extra_modes_file extra_opt_files USE_NLS LIBINTL LIBINTL_DEP INCINTL XGETTEXT GMSGFMT POSUB CATALOGS DATADIRNAME INSTOBJEXT GENCAT CATOBJEXT CROSS ALL SYSTEM_HEADER_DIR inhibit_libc CC_FOR_BUILD BUILD_CFLAGS BUILD_LDFLAGS STMP_FIXINC STMP_FIXPROTO collect2 LIBTOOL SED FGREP GREP LD DUMPBIN ac_ct_DUMPBIN OBJDUMP ac_ct_OBJDUMP ac_ct_AR STRIP ac_ct_STRIP lt_ECHO DSYMUTIL ac_ct_DSYMUTIL NMEDIT ac_ct_NMEDIT LIPO ac_ct_LIPO OTOOL ac_ct_OTOOL OTOOL64 ac_ct_OTOOL64 objdir enable_fast_install gcc_cv_as ORIGINAL_AS_FOR_TARGET gcc_cv_ld ORIGINAL_LD_FOR_TARGET gcc_cv_nm ORIGINAL_NM_FOR_TARGET gcc_cv_objdump gcc_cv_readelf libgcc_visibility GGC zlibdir zlibinc MAINT gcc_tooldir dollar slibdir subdirs srcdir all_compilers all_gtfiles all_lang_makefrags all_lang_makefiles all_languages all_selected_languages build_exeext build_install_headers_dir build_xm_file_list build_xm_include_list build_xm_defines build_file_translate check_languages cpp_install_dir xmake_file tmake_file TM_ENDIAN_CONFIG TM_MULTILIB_CONFIG TM_MULTILIB_EXCEPTIONS_CONFIG extra_gcc_objs extra_headers_list extra_objs extra_parts extra_passes extra_programs float_h_file gcc_config_arguments gcc_gxx_include_dir host_exeext host_xm_file_list host_xm_include_list host_xm_defines out_host_hook_obj install lang_opt_files lang_specs_files lang_tree_files local_prefix md_file objc_boehm_gc out_file out_object_file thread_file tm_file_list tm_include_list tm_defines tm_p_file_list tm_p_include_list xm_file_list xm_include_list xm_defines c_target_objs cxx_target_objs fortran_target_objs target_cpu_default GMPLIBS GMPINC PPLLIBS PPLINC CLOOGLIBS CLOOGINC LIBOBJS LTLIBOBJS'
+ ac_subst_files='language_hooks'
+ ac_pwd=`pwd`
+
+@@ -1084,10 +1084,17 @@
+ --enable-version-specific-runtime-libs
+ specify that runtime libraries should be
+ installed in a compiler-specific directory
++ --enable-poison-system-directories
++ warn for use of native system header directories
+
+ Optional Packages:
+ --with-PACKAGE[=ARG] use PACKAGE [ARG=yes]
+ --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no)
++ --with-csl-license-version=VERSION
++ Use VERSION to communicate with the license manager
++ --with-license the path to the installed license component
++ --with-csl-license-feature=FEATURE
++ Use FEATURE to communicate with the license manager
+ --with-build-libsubdir=DIR Directory where to find libraries for build system
+ --with-local-prefix=DIR specifies directory to put local include
+ --with-gxx-include-dir=DIR
+@@ -1105,8 +1112,12 @@
+ --with-build-sysroot=sysroot
+ use sysroot as the system root during the build
+ --with-sysroot=DIR Search for usr/lib, usr/include, et al, within DIR.
++ --with-eglibc-configs=CONFIGS
++ build multilibs for these EGLIBC configurations
++ --with-specs=SPECS add SPECS to driver command-line processing
+ --with-pkgversion=PKG Use PKG in the version string in place of "GCC"
+ --with-bugurl=URL Direct users to URL to report a bug
++ --with-multilib-list Select multilibs (SH only)
+ --with-gnu-ld assume the C compiler uses GNU ld default=no
+ --with-libiconv-prefix[=DIR] search for libiconv in DIR/include and DIR/lib
+ --without-libiconv-prefix don't search for libiconv in includedir and libdir
+@@ -1724,6 +1735,73 @@
+
+
+
++
++
++# Check whether --with-csl-license-version or --without-csl-license-version was given.
++if test "${with_csl_license_version+set}" = set; then
++ withval="$with_csl_license_version"
++ case "$withval" in
++ (yes) { { echo "$as_me:$LINENO: error: license version not specified" >&5
++echo "$as_me: error: license version not specified" >&2;}
++ { (exit 1); exit 1; }; } ;;
++ (no) CSL_LICENSE_VERSION="" ;;
++ (*) CSL_LICENSE_VERSION="$withval" ;;
++ esac
++else
++ CSL_LICENSE_VERSION=""
++
++fi;
++ if test x"$CSL_LICENSE_VERSION" != x; then
++
++cat >>confdefs.h <<_ACEOF
++#define CSL_LICENSE_VERSION "$CSL_LICENSE_VERSION"
++_ACEOF
++
++ fi
++
++
++
++# Check whether --with-license or --without-license was given.
++if test "${with_license+set}" = set; then
++ withval="$with_license"
++ case "$withval" in
++ (yes) { { echo "$as_me:$LINENO: error: license not specified" >&5
++echo "$as_me: error: license not specified" >&2;}
++ { (exit 1); exit 1; }; } ;;
++ (no) with_license= ;;
++ (*) ;;
++ esac
++else
++ with_license=
++fi;
++ licensedir=$with_license
++
++
++
++
++# Check whether --with-csl-license-feature or --without-csl-license-feature was given.
++if test "${with_csl_license_feature+set}" = set; then
++ withval="$with_csl_license_feature"
++ case "$withval" in
++ (yes) { { echo "$as_me:$LINENO: error: license feature not specified" >&5
++echo "$as_me: error: license feature not specified" >&2;}
++ { (exit 1); exit 1; }; } ;;
++ (no) CSL_LICENSE_FEATURE="" ;;
++ (*) CSL_LICENSE_FEATURE="$withval" ;;
++ esac
++else
++ CSL_LICENSE_FEATURE=""
++
++fi;
++ if test x"$CSL_LICENSE_FEATURE" != x; then
++
++cat >>confdefs.h <<_ACEOF
++#define CSL_LICENSE_FEATURE "$CSL_LICENSE_FEATURE"
++_ACEOF
++
++ fi
++
++
+ # Determine the target- and build-specific subdirectories
+
+ # post-stage1 host modules use a different CC_FOR_BUILD so, in order to
+@@ -8042,6 +8120,28 @@
+
+
+
++
++# Check whether --with-eglibc-configs or --without-eglibc-configs was given.
++if test "${with_eglibc_configs+set}" = set; then
++ withval="$with_eglibc_configs"
++ EGLIBC_CONFIGS=$withval
++else
++ EGLIBC_CONFIGS=
++
++fi;
++
++
++
++# Check whether --with-specs or --without-specs was given.
++if test "${with_specs+set}" = set; then
++ withval="$with_specs"
++ CONFIGURE_SPECS=$withval
++else
++ CONFIGURE_SPECS=
++
++fi;
++
++
+ # Build with intermodule optimisations
+ # Check whether --enable-intermodule or --disable-intermodule was given.
+ if test "${enable_intermodule+set}" = set; then
+@@ -8137,6 +8237,15 @@
+
+
+
++
++# Check whether --with-multilib-list or --without-multilib-list was given.
++if test "${with_multilib_list+set}" = set; then
++ withval="$with_multilib_list"
++ :
++else
++ with_multilib_list=default
++fi;
++
+ # -------------------------
+ # Checks for other programs
+ # -------------------------
+@@ -14509,13 +14618,13 @@
+ else
+ lt_cv_nm_interface="BSD nm"
+ echo "int some_variable = 0;" > conftest.$ac_ext
+- (eval echo "\"\$as_me:14512: $ac_compile\"" >&5)
++ (eval echo "\"\$as_me:14621: $ac_compile\"" >&5)
+ (eval "$ac_compile" 2>conftest.err)
+ cat conftest.err >&5
+- (eval echo "\"\$as_me:14515: $NM \\\"conftest.$ac_objext\\\"\"" >&5)
++ (eval echo "\"\$as_me:14624: $NM \\\"conftest.$ac_objext\\\"\"" >&5)
+ (eval "$NM \"conftest.$ac_objext\"" 2>conftest.err > conftest.out)
+ cat conftest.err >&5
+- (eval echo "\"\$as_me:14518: output\"" >&5)
++ (eval echo "\"\$as_me:14627: output\"" >&5)
+ cat conftest.out >&5
+ if $GREP 'External.*some_variable' conftest.out > /dev/null; then
+ lt_cv_nm_interface="MS dumpbin"
+@@ -15672,7 +15781,7 @@
+ ;;
+ *-*-irix6*)
+ # Find out which ABI we are using.
+- echo '#line 15675 "configure"' > conftest.$ac_ext
++ echo '#line 15784 "configure"' > conftest.$ac_ext
+ if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+@@ -16971,11 +17080,11 @@
+ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
+ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
+ -e 's:$: $lt_compiler_flag:'`
+- (eval echo "\"\$as_me:16974: $lt_compile\"" >&5)
++ (eval echo "\"\$as_me:17083: $lt_compile\"" >&5)
+ (eval "$lt_compile" 2>conftest.err)
+ ac_status=$?
+ cat conftest.err >&5
+- echo "$as_me:16978: \$? = $ac_status" >&5
++ echo "$as_me:17087: \$? = $ac_status" >&5
+ if (exit $ac_status) && test -s "$ac_outfile"; then
+ # The compiler can only warn and ignore the option if not recognized
+ # So say no if there are warnings other than the usual output.
+@@ -17310,11 +17419,11 @@
+ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
+ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
+ -e 's:$: $lt_compiler_flag:'`
+- (eval echo "\"\$as_me:17313: $lt_compile\"" >&5)
++ (eval echo "\"\$as_me:17422: $lt_compile\"" >&5)
+ (eval "$lt_compile" 2>conftest.err)
+ ac_status=$?
+ cat conftest.err >&5
+- echo "$as_me:17317: \$? = $ac_status" >&5
++ echo "$as_me:17426: \$? = $ac_status" >&5
+ if (exit $ac_status) && test -s "$ac_outfile"; then
+ # The compiler can only warn and ignore the option if not recognized
+ # So say no if there are warnings other than the usual output.
+@@ -17415,11 +17524,11 @@
+ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
+ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
+ -e 's:$: $lt_compiler_flag:'`
+- (eval echo "\"\$as_me:17418: $lt_compile\"" >&5)
++ (eval echo "\"\$as_me:17527: $lt_compile\"" >&5)
+ (eval "$lt_compile" 2>out/conftest.err)
+ ac_status=$?
+ cat out/conftest.err >&5
+- echo "$as_me:17422: \$? = $ac_status" >&5
++ echo "$as_me:17531: \$? = $ac_status" >&5
+ if (exit $ac_status) && test -s out/conftest2.$ac_objext
+ then
+ # The compiler can only warn and ignore the option if not recognized
+@@ -17470,11 +17579,11 @@
+ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
+ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
+ -e 's:$: $lt_compiler_flag:'`
+- (eval echo "\"\$as_me:17473: $lt_compile\"" >&5)
++ (eval echo "\"\$as_me:17582: $lt_compile\"" >&5)
+ (eval "$lt_compile" 2>out/conftest.err)
+ ac_status=$?
+ cat out/conftest.err >&5
+- echo "$as_me:17477: \$? = $ac_status" >&5
++ echo "$as_me:17586: \$? = $ac_status" >&5
+ if (exit $ac_status) && test -s out/conftest2.$ac_objext
+ then
+ # The compiler can only warn and ignore the option if not recognized
+@@ -20282,7 +20391,7 @@
+ lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
+ lt_status=$lt_dlunknown
+ cat > conftest.$ac_ext <<_LT_EOF
+-#line 20285 "configure"
++#line 20394 "configure"
+ #include "confdefs.h"
+
+ #if HAVE_DLFCN_H
+@@ -20378,7 +20487,7 @@
+ lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
+ lt_status=$lt_dlunknown
+ cat > conftest.$ac_ext <<_LT_EOF
+-#line 20381 "configure"
++#line 20490 "configure"
+ #include "confdefs.h"
+
+ #if HAVE_DLFCN_H
+@@ -22108,6 +22217,22 @@
+ tls_first_minor=16
+ tls_as_opt='-32 --fatal-warnings'
+ ;;
++ m68k-*-*)
++ conftest_s='
++ .section .tdata,"awT",@progbits
++x:
++ .word 2
++ .text
++foo:
++ move.l x@TLSGD(%a5),%a0
++ move.l x@TLSLDM(%a5),%a0
++ move.l x@TLSLDO(%a5),%a0
++ move.l x@TLSIE(%a5),%a0
++ move.l x@TLSLE(%a5),%a0'
++ tls_first_major=2
++ tls_first_minor=19
++ tls_as_opt='--fatal-warnings'
++ ;;
+ powerpc-*-*)
+ conftest_s='
+ .section ".tdata","awT",@progbits
+@@ -22739,6 +22864,44 @@
+ i[34567]86-*-* | x86_64-*-*)
+ case $target_os in
+ cygwin* | pe | mingw32*)
++ # Recent binutils allows the three-operand form of ".comm" on PE. This
++ # definition is used unconditionally to initialise the default state of
++ # the target option variable that governs usage of the feature.
++ echo "$as_me:$LINENO: checking assembler for .comm with alignment" >&5
++echo $ECHO_N "checking assembler for .comm with alignment... $ECHO_C" >&6
++if test "${gcc_cv_as_comm_has_align+set}" = set; then
++ echo $ECHO_N "(cached) $ECHO_C" >&6
++else
++ gcc_cv_as_comm_has_align=no
++ if test $in_tree_gas = yes; then
++ if test $gcc_cv_gas_vers -ge `expr \( \( 2 \* 1000 \) + 19 \) \* 1000 + 52`
++ then gcc_cv_as_comm_has_align=yes
++fi
++ elif test x$gcc_cv_as != x; then
++ echo '.comm foo,1,32' > conftest.s
++ if { ac_try='$gcc_cv_as -o conftest.o conftest.s >&5'
++ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
++ (eval $ac_try) 2>&5
++ ac_status=$?
++ echo "$as_me:$LINENO: \$? = $ac_status" >&5
++ (exit $ac_status); }; }
++ then
++ gcc_cv_as_comm_has_align=yes
++ else
++ echo "configure: failed program was" >&5
++ cat conftest.s >&5
++ fi
++ rm -f conftest.o conftest.s
++ fi
++fi
++echo "$as_me:$LINENO: result: $gcc_cv_as_comm_has_align" >&5
++echo "${ECHO_T}$gcc_cv_as_comm_has_align" >&6
++
++
++cat >>confdefs.h <<_ACEOF
++#define HAVE_GAS_ALIGNED_COMM `if test $gcc_cv_as_comm_has_align = yes; then echo 1; else echo 0; fi`
++_ACEOF
++
+ # Used for DWARF 2 in PE
+ echo "$as_me:$LINENO: checking assembler for .secrel32 relocs" >&5
+ echo $ECHO_N "checking assembler for .secrel32 relocs... $ECHO_C" >&6
+@@ -24711,6 +24874,21 @@
+ fi;
+
+
++# Check whether --enable-poison-system-directories or --disable-poison-system-directories was given.
++if test "${enable_poison_system_directories+set}" = set; then
++ enableval="$enable_poison_system_directories"
++
++else
++ enable_poison_system_directories=no
++fi;
++if test "x${enable_poison_system_directories}" = "xyes"; then
++
++cat >>confdefs.h <<\_ACEOF
++#define ENABLE_POISON_SYSTEM_DIRECTORIES 1
++_ACEOF
++
++fi
++
+ # Substitute configuration variables
+
+
+@@ -25451,6 +25629,7 @@
+ s,@target_vendor@,$target_vendor,;t t
+ s,@target_os@,$target_os,;t t
+ s,@target_noncanonical@,$target_noncanonical,;t t
++s,@licensedir@,$licensedir,;t t
+ s,@build_libsubdir@,$build_libsubdir,;t t
+ s,@build_subdir@,$build_subdir,;t t
+ s,@host_subdir@,$host_subdir,;t t
+@@ -25487,6 +25666,8 @@
+ s,@TARGET_SYSTEM_ROOT@,$TARGET_SYSTEM_ROOT,;t t
+ s,@TARGET_SYSTEM_ROOT_DEFINE@,$TARGET_SYSTEM_ROOT_DEFINE,;t t
+ s,@CROSS_SYSTEM_HEADER_DIR@,$CROSS_SYSTEM_HEADER_DIR,;t t
++s,@EGLIBC_CONFIGS@,$EGLIBC_CONFIGS,;t t
++s,@CONFIGURE_SPECS@,$CONFIGURE_SPECS,;t t
+ s,@onestep@,$onestep,;t t
+ s,@PKGVERSION@,$PKGVERSION,;t t
+ s,@REPORT_BUGS_TO@,$REPORT_BUGS_TO,;t t
+@@ -25606,6 +25787,9 @@
+ s,@cpp_install_dir@,$cpp_install_dir,;t t
+ s,@xmake_file@,$xmake_file,;t t
+ s,@tmake_file@,$tmake_file,;t t
++s,@TM_ENDIAN_CONFIG@,$TM_ENDIAN_CONFIG,;t t
++s,@TM_MULTILIB_CONFIG@,$TM_MULTILIB_CONFIG,;t t
++s,@TM_MULTILIB_EXCEPTIONS_CONFIG@,$TM_MULTILIB_EXCEPTIONS_CONFIG,;t t
+ s,@extra_gcc_objs@,$extra_gcc_objs,;t t
+ s,@extra_headers_list@,$extra_headers_list,;t t
+ s,@extra_objs@,$extra_objs,;t t
+diff -Nur a/gcc/configure.ac b/gcc/configure.ac
+--- a/gcc/configure.ac 2009-03-24 18:46:03.000000000 +0100
++++ b/gcc/configure.ac 2010-01-25 09:50:29.085687411 +0100
+@@ -39,6 +39,10 @@
+ # Determine the noncanonical target name, for directory use.
+ ACX_NONCANONICAL_TARGET
+
++CSL_AC_LICENSE_VERSION
++CSL_AC_LICENSE
++CSL_AC_LICENSE_FEATURE
++
+ # Determine the target- and build-specific subdirectories
+ GCC_TOPLEV_SUBDIRS
+
+@@ -770,6 +774,22 @@
+ AC_SUBST(TARGET_SYSTEM_ROOT_DEFINE)
+ AC_SUBST(CROSS_SYSTEM_HEADER_DIR)
+
++AC_ARG_WITH(eglibc-configs,
++ [AS_HELP_STRING([--with-eglibc-configs=CONFIGS],
++ [build multilibs for these EGLIBC configurations])],
++ [EGLIBC_CONFIGS=$withval],
++ [EGLIBC_CONFIGS=]
++)
++AC_SUBST(EGLIBC_CONFIGS)
++
++AC_ARG_WITH(specs,
++ [AS_HELP_STRING([--with-specs=SPECS],
++ [add SPECS to driver command-line processing])],
++ [CONFIGURE_SPECS=$withval],
++ [CONFIGURE_SPECS=]
++)
++AC_SUBST(CONFIGURE_SPECS)
++
+ # Build with intermodule optimisations
+ AC_ARG_ENABLE(intermodule,
+ [ --enable-intermodule build the compiler in one step],
+@@ -810,6 +830,11 @@
+ AC_SUBST(docdir)
+ AC_SUBST(htmldir)
+
++AC_ARG_WITH(multilib-list,
++[ --with-multilib-list Select multilibs (SH only)],
++:,
++with_multilib_list=default)
++
+ # -------------------------
+ # Checks for other programs
+ # -------------------------
+@@ -2576,6 +2601,22 @@
+ tls_first_minor=16
+ tls_as_opt='-32 --fatal-warnings'
+ ;;
++ m68k-*-*)
++ conftest_s='
++ .section .tdata,"awT",@progbits
++x:
++ .word 2
++ .text
++foo:
++ move.l x@TLSGD(%a5),%a0
++ move.l x@TLSLDM(%a5),%a0
++ move.l x@TLSLDO(%a5),%a0
++ move.l x@TLSIE(%a5),%a0
++ move.l x@TLSLE(%a5),%a0'
++ tls_first_major=2
++ tls_first_minor=19
++ tls_as_opt='--fatal-warnings'
++ ;;
+ powerpc-*-*)
+ conftest_s='
+ .section ".tdata","awT",@progbits
+@@ -2944,6 +2985,15 @@
+ changequote([,])dnl
+ case $target_os in
+ cygwin* | pe | mingw32*)
++ # Recent binutils allows the three-operand form of ".comm" on PE. This
++ # definition is used unconditionally to initialise the default state of
++ # the target option variable that governs usage of the feature.
++ gcc_GAS_CHECK_FEATURE([.comm with alignment], gcc_cv_as_comm_has_align,
++ [2,19,52],,[.comm foo,1,32])
++ AC_DEFINE_UNQUOTED(HAVE_GAS_ALIGNED_COMM,
++ [`if test $gcc_cv_as_comm_has_align = yes; then echo 1; else echo 0; fi`],
++ [Define if your assembler supports specifying the alignment
++ of objects allocated using the GAS .comm command.])
+ # Used for DWARF 2 in PE
+ gcc_GAS_CHECK_FEATURE([.secrel32 relocs],
+ gcc_cv_as_ix86_pe_secrel32,
+@@ -3891,6 +3941,16 @@
+ htmldir='$(docdir)')
+ AC_SUBST(htmldir)
+
++AC_ARG_ENABLE([poison-system-directories],
++ AS_HELP_STRING([--enable-poison-system-directories],
++ [warn for use of native system header directories]),,
++ [enable_poison_system_directories=no])
++if test "x${enable_poison_system_directories}" = "xyes"; then
++ AC_DEFINE([ENABLE_POISON_SYSTEM_DIRECTORIES],
++ [1],
++ [Define to warn for use of native system header directories])
++fi
++
+ # Substitute configuration variables
+ AC_SUBST(subdirs)
+ AC_SUBST(srcdir)
+@@ -3910,6 +3970,9 @@
+ AC_SUBST(cpp_install_dir)
+ AC_SUBST(xmake_file)
+ AC_SUBST(tmake_file)
++AC_SUBST(TM_ENDIAN_CONFIG)
++AC_SUBST(TM_MULTILIB_CONFIG)
++AC_SUBST(TM_MULTILIB_EXCEPTIONS_CONFIG)
+ AC_SUBST(extra_gcc_objs)
+ AC_SUBST(extra_headers_list)
+ AC_SUBST(extra_objs)
+diff -Nur a/gcc/c.opt b/gcc/c.opt
+--- a/gcc/c.opt 2009-03-18 22:14:53.000000000 +0100
++++ b/gcc/c.opt 2010-01-25 09:50:29.085687411 +0100
+@@ -716,6 +716,10 @@
+ C ObjC C++ ObjC++
+ Treat the input file as already preprocessed
+
++fremove-local-statics
++C C++ Var(flag_remove_local_statics) Optimization
++Convert function-local static variables to automatic variables when it is safe to do so
++
+ freplace-objc-classes
+ ObjC ObjC++
+ Used in Fix-and-Continue mode to indicate that object files may be swapped in at runtime
+diff -Nur a/gcc/c-opts.c b/gcc/c-opts.c
+--- a/gcc/c-opts.c 2009-02-18 03:16:03.000000000 +0100
++++ b/gcc/c-opts.c 2010-01-25 09:50:29.095687705 +0100
+@@ -40,6 +40,7 @@
+ #include "mkdeps.h"
+ #include "target.h"
+ #include "tm_p.h"
++#include "c-tree.h" /* For c_cpp_error. */
+
+ #ifndef DOLLARS_IN_IDENTIFIERS
+ # define DOLLARS_IN_IDENTIFIERS true
+@@ -201,6 +202,7 @@
+ {
+ static const unsigned int lang_flags[] = {CL_C, CL_ObjC, CL_CXX, CL_ObjCXX};
+ unsigned int i, result;
++ struct cpp_callbacks *cb;
+
+ /* This is conditionalized only because that is the way the front
+ ends used to do it. Maybe this should be unconditional? */
+@@ -216,6 +218,8 @@
+
+ parse_in = cpp_create_reader (c_dialect_cxx () ? CLK_GNUCXX: CLK_GNUC89,
+ ident_hash, line_table);
++ cb = cpp_get_callbacks (parse_in);
++ cb->error = c_cpp_error;
+
+ cpp_opts = cpp_get_options (parse_in);
+ cpp_opts->dollars_in_ident = DOLLARS_IN_IDENTIFIERS;
+@@ -333,12 +337,12 @@
+ or environment var dependency generation is used. */
+ cpp_opts->deps.style = (code == OPT_M ? DEPS_SYSTEM: DEPS_USER);
+ flag_no_output = 1;
+- cpp_opts->inhibit_warnings = 1;
+ break;
+
+ case OPT_MD:
+ case OPT_MMD:
+ cpp_opts->deps.style = (code == OPT_MD ? DEPS_SYSTEM: DEPS_USER);
++ cpp_opts->deps.need_preprocessor_output = true;
+ deps_file = arg;
+ break;
+
+@@ -444,7 +448,6 @@
+ break;
+
+ case OPT_Werror:
+- cpp_opts->warnings_are_errors = value;
+ global_dc->warning_as_error_requested = value;
+ break;
+
+@@ -503,10 +506,6 @@
+ warn_strict_null_sentinel = value;
+ break;
+
+- case OPT_Wsystem_headers:
+- cpp_opts->warn_system_headers = value;
+- break;
+-
+ case OPT_Wtraditional:
+ cpp_opts->warn_traditional = value;
+ break;
+@@ -895,8 +894,6 @@
+ c_common_post_options, so that a subsequent -Wno-endif-labels
+ is not overridden. */
+ case OPT_pedantic_errors:
+- cpp_opts->pedantic_errors = 1;
+- /* Fall through. */
+ case OPT_pedantic:
+ cpp_opts->pedantic = 1;
+ cpp_opts->warn_endif_labels = 1;
+@@ -971,10 +968,6 @@
+ flag_undef = 1;
+ break;
+
+- case OPT_w:
+- cpp_opts->inhibit_warnings = 1;
+- break;
+-
+ case OPT_v:
+ verbose = true;
+ break;
+@@ -1159,10 +1152,6 @@
+
+ input_location = UNKNOWN_LOCATION;
+
+- /* If an error has occurred in cpplib, note it so we fail
+- immediately. */
+- errorcount += cpp_errors (parse_in);
+-
+ *pfilename = this_input_filename
+ = cpp_read_main_file (parse_in, in_fnames[0]);
+ /* Don't do any compilation or preprocessing if there is no input file. */
+@@ -1274,7 +1263,8 @@
+ {
+ FILE *deps_stream = NULL;
+
+- if (cpp_opts->deps.style != DEPS_NONE)
++ /* Don't write the deps file if there are errors. */
++ if (cpp_opts->deps.style != DEPS_NONE && errorcount == 0)
+ {
+ /* If -M or -MM was seen without -MF, default output to the
+ output stream. */
+@@ -1290,7 +1280,7 @@
+
+ /* For performance, avoid tearing down cpplib's internal structures
+ with cpp_destroy (). */
+- errorcount += cpp_finish (parse_in, deps_stream);
++ cpp_finish (parse_in, deps_stream);
+
+ if (deps_stream && deps_stream != out_stream
+ && (ferror (deps_stream) || fclose (deps_stream)))
+diff -Nur a/gcc/cp/class.c b/gcc/cp/class.c
+--- a/gcc/cp/class.c 2009-06-24 19:02:03.000000000 +0200
++++ b/gcc/cp/class.c 2010-01-25 09:50:29.095687705 +0100
+@@ -6136,7 +6136,7 @@
+ if (flags & tf_error)
+ {
+ error ("no matches converting function %qD to type %q#T",
+- DECL_NAME (OVL_FUNCTION (overload)),
++ DECL_NAME (OVL_CURRENT (overload)),
+ target_type);
+
+ /* print_candidates expects a chain with the functions in
+@@ -6299,13 +6299,8 @@
+ dependent on overload resolution. */
+ gcc_assert (TREE_CODE (rhs) == ADDR_EXPR
+ || TREE_CODE (rhs) == COMPONENT_REF
+- || TREE_CODE (rhs) == COMPOUND_EXPR
+- || really_overloaded_fn (rhs));
+-
+- /* We don't overwrite rhs if it is an overloaded function.
+- Copying it would destroy the tree link. */
+- if (TREE_CODE (rhs) != OVERLOAD)
+- rhs = copy_node (rhs);
++ || really_overloaded_fn (rhs)
++ || (flag_ms_extensions && TREE_CODE (rhs) == FUNCTION_DECL));
+
+ /* This should really only be used when attempting to distinguish
+ what sort of a pointer to function we have. For now, any
+@@ -6357,19 +6352,6 @@
+ /*explicit_targs=*/NULL_TREE,
+ access_path);
+
+- case COMPOUND_EXPR:
+- TREE_OPERAND (rhs, 0)
+- = instantiate_type (lhstype, TREE_OPERAND (rhs, 0), flags);
+- if (TREE_OPERAND (rhs, 0) == error_mark_node)
+- return error_mark_node;
+- TREE_OPERAND (rhs, 1)
+- = instantiate_type (lhstype, TREE_OPERAND (rhs, 1), flags);
+- if (TREE_OPERAND (rhs, 1) == error_mark_node)
+- return error_mark_node;
+-
+- TREE_TYPE (rhs) = lhstype;
+- return rhs;
+-
+ case ADDR_EXPR:
+ {
+ if (PTRMEM_OK_P (rhs))
+diff -Nur a/gcc/cp/cp-tree.h b/gcc/cp/cp-tree.h
+--- a/gcc/cp/cp-tree.h 2009-07-13 08:06:27.000000000 +0200
++++ b/gcc/cp/cp-tree.h 2010-01-25 09:50:29.095687705 +0100
+@@ -43,9 +43,6 @@
+ #else
+ #define ATTRIBUTE_GCC_CXXDIAG(m, n) ATTRIBUTE_NONNULL(m)
+ #endif
+-extern void cp_cpp_error (cpp_reader *, int,
+- const char *, va_list *)
+- ATTRIBUTE_GCC_CXXDIAG(3,0);
+ #ifdef GCC_TOPLEV_H
+ #error \
+ In order for the format checking to accept the C++ front end diagnostic \
+diff -Nur a/gcc/cp/cvt.c b/gcc/cp/cvt.c
+--- a/gcc/cp/cvt.c 2009-04-23 13:13:57.000000000 +0200
++++ b/gcc/cp/cvt.c 2010-01-25 09:50:29.095687705 +0100
+@@ -581,6 +581,7 @@
+ tree e = expr;
+ enum tree_code code = TREE_CODE (type);
+ const char *invalid_conv_diag;
++ tree e1;
+
+ if (error_operand_p (e) || type == error_mark_node)
+ return error_mark_node;
+@@ -629,6 +630,10 @@
+ }
+ }
+
++ e1 = targetm.convert_to_type (type, e);
++ if (e1)
++ return e1;
++
+ if (code == VOID_TYPE && (convtype & CONV_STATIC))
+ {
+ e = convert_to_void (e, /*implicit=*/NULL, tf_warning_or_error);
+@@ -1231,11 +1236,18 @@
+ tree
+ type_promotes_to (tree type)
+ {
++ tree promoted_type;
++
+ if (type == error_mark_node)
+ return error_mark_node;
+
+ type = TYPE_MAIN_VARIANT (type);
+
++ /* Check for promotions of target-defined types first. */
++ promoted_type = targetm.promoted_type (type);
++ if (promoted_type)
++ return promoted_type;
++
+ /* bool always promotes to int (not unsigned), even if it's the same
+ size. */
+ if (type == boolean_type_node)
+diff -Nur a/gcc/cp/decl2.c b/gcc/cp/decl2.c
+--- a/gcc/cp/decl2.c 2009-06-09 20:20:29.000000000 +0200
++++ b/gcc/cp/decl2.c 2010-01-25 09:50:29.095687705 +0100
+@@ -1717,6 +1717,10 @@
+ || (DECL_ASSEMBLER_NAME_SET_P (decl)
+ && TREE_SYMBOL_REFERENCED (DECL_ASSEMBLER_NAME (decl))))
+ return true;
++ /* Functions marked "dllexport" must be emitted so that they are
++ visible to other DLLs. */
++ if (lookup_attribute ("dllexport", DECL_ATTRIBUTES (decl)))
++ return true;
+ /* Otherwise, DECL does not need to be emitted -- yet. A subsequent
+ reference to DECL might cause it to be emitted later. */
+ return false;
+@@ -3802,6 +3806,15 @@
+ }
+
+ TREE_USED (decl) = 1;
++ if (current_function_decl != NULL_TREE
++ && (TREE_CODE (decl) == VAR_DECL
++ || TREE_CODE (decl) == PARM_DECL
++ || TREE_CODE (decl) == FUNCTION_DECL))
++ {
++ tree context = decl_function_context (decl);
++ if (context != NULL_TREE && context != current_function_decl)
++ DECL_NONLOCAL (decl) = 1;
++ }
+ if (DECL_CLONED_FUNCTION_P (decl))
+ TREE_USED (DECL_CLONED_FUNCTION (decl)) = 1;
+ if (TREE_CODE (decl) == FUNCTION_DECL
+diff -Nur a/gcc/cp/decl.c b/gcc/cp/decl.c
+--- a/gcc/cp/decl.c 2009-07-08 00:08:01.000000000 +0200
++++ b/gcc/cp/decl.c 2010-01-25 09:50:29.095687705 +0100
+@@ -4515,7 +4515,7 @@
+
+ cp_apply_type_quals_to_decl (cp_type_quals (TREE_TYPE (decl)), decl);
+
+- layout_decl (decl, 0);
++ relayout_decl (decl);
+ }
+ }
+
+@@ -7620,6 +7620,7 @@
+ bool parameter_pack_p = declarator? declarator->parameter_pack_p : false;
+ bool set_no_warning = false;
+ bool template_type_arg = false;
++ const char *errmsg;
+
+ signed_p = declspecs->specs[(int)ds_signed];
+ unsigned_p = declspecs->specs[(int)ds_unsigned];
+@@ -8299,6 +8300,12 @@
+ type_quals = TYPE_UNQUALIFIED;
+ set_no_warning = true;
+ }
++ errmsg = targetm.invalid_return_type (type);
++ if (errmsg)
++ {
++ error (errmsg);
++ type = integer_type_node;
++ }
+
+ /* Error about some types functions can't return. */
+
+@@ -8841,8 +8848,13 @@
+
+ /* Replace the anonymous name with the real name everywhere. */
+ for (t = TYPE_MAIN_VARIANT (type); t; t = TYPE_NEXT_VARIANT (t))
+- if (TYPE_NAME (t) == oldname)
+- TYPE_NAME (t) = decl;
++ {
++ if (ANON_AGGRNAME_P (TYPE_IDENTIFIER (t)))
++ {
++ debug_hooks->set_name (t, decl);
++ TYPE_NAME (t) = decl;
++ }
++ }
+
+ if (TYPE_LANG_SPECIFIC (type))
+ TYPE_WAS_ANONYMOUS (type) = 1;
+@@ -9679,6 +9691,7 @@
+ tree type = NULL_TREE;
+ tree init = TREE_PURPOSE (parm);
+ tree decl = TREE_VALUE (parm);
++ const char *errmsg;
+
+ if (parm == void_list_node)
+ break;
+@@ -9712,6 +9725,14 @@
+ init = NULL_TREE;
+ }
+
++ if (type != error_mark_node
++ && (errmsg = targetm.invalid_parameter_type (type)))
++ {
++ error (errmsg);
++ type = error_mark_node;
++ TREE_TYPE (decl) = error_mark_node;
++ }
++
+ if (type != error_mark_node)
+ {
+ if (deprecated_state != DEPRECATED_SUPPRESS)
+diff -Nur a/gcc/cp/error.c b/gcc/cp/error.c
+--- a/gcc/cp/error.c 2009-07-11 00:31:34.000000000 +0200
++++ b/gcc/cp/error.c 2010-01-25 09:50:29.095687705 +0100
+@@ -2667,39 +2667,6 @@
+ #undef next_int
+ }
+
+-/* Callback from cpp_error for PFILE to print diagnostics arising from
+- interpreting strings. The diagnostic is of type LEVEL; MSG is the
+- translated message and AP the arguments. */
+-
+-void
+-cp_cpp_error (cpp_reader *pfile ATTRIBUTE_UNUSED, int level,
+- const char *msg, va_list *ap)
+-{
+- diagnostic_info diagnostic;
+- diagnostic_t dlevel;
+- switch (level)
+- {
+- case CPP_DL_WARNING:
+- case CPP_DL_WARNING_SYSHDR:
+- dlevel = DK_WARNING;
+- break;
+- case CPP_DL_PEDWARN:
+- dlevel = DK_PEDWARN;
+- break;
+- case CPP_DL_ERROR:
+- dlevel = DK_ERROR;
+- break;
+- case CPP_DL_ICE:
+- dlevel = DK_ICE;
+- break;
+- default:
+- gcc_unreachable ();
+- }
+- diagnostic_set_info_translated (&diagnostic, msg, ap,
+- input_location, dlevel);
+- report_diagnostic (&diagnostic);
+-}
+-
+ /* Warn about the use of C++0x features when appropriate. */
+ void
+ maybe_warn_cpp0x (const char* str)
+diff -Nur a/gcc/cp/except.c b/gcc/cp/except.c
+--- a/gcc/cp/except.c 2008-08-18 13:17:52.000000000 +0200
++++ b/gcc/cp/except.c 2010-01-25 09:50:29.095687705 +0100
+@@ -146,14 +146,26 @@
+ static tree
+ build_eh_type_type (tree type)
+ {
+- tree exp = eh_type_info (type);
++ bool is_ref = TREE_CODE (type) == REFERENCE_TYPE;
++ tree exp;
++
++ if (is_ref)
++ type = TREE_TYPE (type);
++
++ exp = eh_type_info (type);
+
+ if (!exp)
+ return NULL;
+
+ mark_used (exp);
+
+- return convert (ptr_type_node, build_address (exp));
++ exp = build_address (exp);
++
++ if (is_ref)
++ exp = targetm.cxx.ttype_ref_encode (exp);
++
++ exp = convert (ptr_type_node, exp);
++ return exp;
+ }
+
+ tree
+@@ -495,6 +507,16 @@
+ initialize_handler_parm (decl, exp);
+ }
+
++ /* Preserve the reference type on the exception, as this affects
++ derived-to-base conversions in catch matching. Only do this when
++ the ABI supports it, as originally this case was (incorrectly)
++ treated just as catching a pointer-to-class by value. */
++ if (targetm.cxx.ttype_ref_encode
++ && decl && TREE_CODE (type) == POINTER_TYPE
++ && CLASS_TYPE_P (TREE_TYPE (type))
++ && TREE_CODE (TREE_TYPE (decl)) == REFERENCE_TYPE)
++ type = build_reference_type (type);
++
+ return type;
+ }
+
+@@ -538,10 +560,20 @@
+ raw_raises && TREE_VALUE (raw_raises);
+ raw_raises = TREE_CHAIN (raw_raises))
+ {
+- tree type = prepare_eh_type (TREE_VALUE (raw_raises));
++ tree orig_type = TREE_VALUE (raw_raises);
++ tree type = prepare_eh_type (orig_type);
+ tree tinfo = eh_type_info (type);
+
+ mark_used (tinfo);
++ /* Preserve the reference type on the exception, as this affects
++ derived-to-base conversions in catch matching. Only do this when
++ the ABI supports it, as originally this case was (incorrectly)
++ treated just as catching a pointer-to-class by value. */
++ if (targetm.cxx.ttype_ref_encode
++ && TREE_CODE (orig_type) == REFERENCE_TYPE
++ && TREE_CODE (type) == POINTER_TYPE
++ && CLASS_TYPE_P (TREE_TYPE (type)))
++ type = build_reference_type (type);
+ raises = tree_cons (NULL_TREE, type, raises);
+ }
+
+@@ -956,24 +988,40 @@
+ static int
+ can_convert_eh (tree to, tree from)
+ {
+- to = non_reference (to);
+- from = non_reference (from);
++ bool to_ref = TREE_CODE (to) == REFERENCE_TYPE;
++ int depth = to_ref;
++ bool outer_const = true;
+
+- if (TREE_CODE (to) == POINTER_TYPE && TREE_CODE (from) == POINTER_TYPE)
++ if (to_ref)
++ to = TREE_TYPE (to);
++ from = non_reference (from);
++
++ while (TREE_CODE (to) == POINTER_TYPE && TREE_CODE (from) == POINTER_TYPE)
+ {
++ unsigned to_quals, from_quals;
++
++ depth++;
++
+ to = TREE_TYPE (to);
+ from = TREE_TYPE (from);
++ to_quals = TYPE_QUALS (to);
++ from_quals = TYPE_QUALS (from);
+
+- if (! at_least_as_qualified_p (to, from))
++ if ((from_quals & ~to_quals)
++ || (!outer_const && to_quals & ~from_quals))
+ return 0;
+-
+- if (TREE_CODE (to) == VOID_TYPE)
+- return 1;
+-
+- /* Else fall through. */
++
++ if (!(to_quals & TYPE_QUAL_CONST))
++ outer_const = false;
+ }
+
+- if (CLASS_TYPE_P (to) && CLASS_TYPE_P (from)
++ if (same_type_ignoring_top_level_qualifiers_p (from, to))
++ return 1;
++
++ if (depth == to_ref + 1 && TREE_CODE (to) == VOID_TYPE)
++ return 1;
++
++ if (depth < 2 && CLASS_TYPE_P (to) && CLASS_TYPE_P (from)
+ && PUBLICLY_UNIQUELY_DERIVED_P (to, from))
+ return 1;
+
+diff -Nur a/gcc/cp/parser.c b/gcc/cp/parser.c
+--- a/gcc/cp/parser.c 2009-06-09 06:23:00.000000000 +0200
++++ b/gcc/cp/parser.c 2010-01-25 09:50:29.105687718 +0100
+@@ -309,8 +309,7 @@
+
+ /* Subsequent preprocessor diagnostics should use compiler
+ diagnostic functions to get the compiler source location. */
+- cpp_get_options (parse_in)->client_diagnostic = true;
+- cpp_get_callbacks (parse_in)->error = cp_cpp_error;
++ done_lexing = true;
+
+ gcc_assert (lexer->next_token->type != CPP_PURGED);
+ return lexer;
+diff -Nur a/gcc/cp/rtti.c b/gcc/cp/rtti.c
+--- a/gcc/cp/rtti.c 2008-09-23 16:55:14.000000000 +0200
++++ b/gcc/cp/rtti.c 2010-01-25 09:50:29.105687718 +0100
+@@ -393,6 +393,7 @@
+ return d;
+ }
+
++ gcc_assert (TREE_CODE (type) != REFERENCE_TYPE);
+ name = mangle_typeinfo_for_type (type);
+
+ d = IDENTIFIER_GLOBAL_VALUE (name);
+diff -Nur a/gcc/cp/semantics.c b/gcc/cp/semantics.c
+--- a/gcc/cp/semantics.c 2009-07-14 20:35:13.000000000 +0200
++++ b/gcc/cp/semantics.c 2010-01-25 09:50:29.105687718 +0100
+@@ -1120,7 +1120,11 @@
+ type = expand_start_catch_block (decl);
+ HANDLER_TYPE (handler) = type;
+ if (!processing_template_decl && type)
+- mark_used (eh_type_info (type));
++ {
++ if (TREE_CODE (type) == REFERENCE_TYPE)
++ type = TREE_TYPE (type);
++ mark_used (eh_type_info (type));
++ }
+ }
+
+ /* Finish a handler, which may be given by HANDLER. The BLOCKs are
+@@ -3243,8 +3247,10 @@
+
+ /* If the user wants us to keep all inline functions, then mark
+ this function as needed so that finish_file will make sure to
+- output it later. */
+- if (flag_keep_inline_functions && DECL_DECLARED_INLINE_P (fn))
++ output it later. Similarly, all dllexport'd functions must
++ be emitted; there may be callers in other DLLs. */
++ if ((flag_keep_inline_functions && DECL_DECLARED_INLINE_P (fn))
++ || lookup_attribute ("dllexport", DECL_ATTRIBUTES (fn)))
+ mark_needed (fn);
+ }
+
+diff -Nur a/gcc/cp/typeck.c b/gcc/cp/typeck.c
+--- a/gcc/cp/typeck.c 2009-07-13 08:06:27.000000000 +0200
++++ b/gcc/cp/typeck.c 2010-01-25 09:50:29.105687718 +0100
+@@ -1707,10 +1707,14 @@
+ tree
+ default_conversion (tree exp)
+ {
++ /* Check for target-specific promotions. */
++ tree promoted_type = targetm.promoted_type (TREE_TYPE (exp));
++ if (promoted_type)
++ exp = cp_convert (promoted_type, exp);
+ /* Perform the integral promotions first so that bitfield
+ expressions (which may promote to "int", even if the bitfield is
+ declared "unsigned") are promoted correctly. */
+- if (INTEGRAL_OR_UNSCOPED_ENUMERATION_TYPE_P (TREE_TYPE (exp)))
++ else if (INTEGRAL_OR_UNSCOPED_ENUMERATION_TYPE_P (TREE_TYPE (exp)))
+ exp = perform_integral_promotions (exp);
+ /* Perform the other conversions. */
+ exp = decay_conversion (exp);
+@@ -3389,6 +3393,25 @@
+ return error_mark_node;
+ }
+
++ /* Issue warnings about peculiar, but valid, uses of NULL. */
++ if ((orig_op0 == null_node || orig_op1 == null_node)
++ /* It's reasonable to use pointer values as operands of &&
++ and ||, so NULL is no exception. */
++ && code != TRUTH_ANDIF_EXPR && code != TRUTH_ORIF_EXPR
++ && ( /* Both are NULL (or 0) and the operation was not a
++ comparison or a pointer subtraction. */
++ (null_ptr_cst_p (orig_op0) && null_ptr_cst_p (orig_op1)
++ && code != EQ_EXPR && code != NE_EXPR && code != MINUS_EXPR)
++ /* Or if one of OP0 or OP1 is neither a pointer nor NULL. */
++ || (!null_ptr_cst_p (orig_op0)
++ && !TYPE_PTR_P (type0) && !TYPE_PTR_TO_MEMBER_P (type0))
++ || (!null_ptr_cst_p (orig_op1)
++ && !TYPE_PTR_P (type1) && !TYPE_PTR_TO_MEMBER_P (type1)))
++ && (complain & tf_warning))
++ /* Some sort of arithmetic operation involving NULL was
++ performed. */
++ warning (OPT_Wpointer_arith, "NULL used in arithmetic");
++
+ switch (code)
+ {
+ case MINUS_EXPR:
+@@ -3979,25 +4002,6 @@
+ }
+ }
+
+- /* Issue warnings about peculiar, but valid, uses of NULL. */
+- if ((orig_op0 == null_node || orig_op1 == null_node)
+- /* It's reasonable to use pointer values as operands of &&
+- and ||, so NULL is no exception. */
+- && code != TRUTH_ANDIF_EXPR && code != TRUTH_ORIF_EXPR
+- && ( /* Both are NULL (or 0) and the operation was not a comparison. */
+- (null_ptr_cst_p (orig_op0) && null_ptr_cst_p (orig_op1)
+- && code != EQ_EXPR && code != NE_EXPR)
+- /* Or if one of OP0 or OP1 is neither a pointer nor NULL. */
+- || (!null_ptr_cst_p (orig_op0) && TREE_CODE (TREE_TYPE (op0)) != POINTER_TYPE)
+- || (!null_ptr_cst_p (orig_op1) && TREE_CODE (TREE_TYPE (op1)) != POINTER_TYPE))
+- && (complain & tf_warning))
+- /* Some sort of arithmetic operation involving NULL was
+- performed. Note that pointer-difference and pointer-addition
+- have already been handled above, and so we don't end up here in
+- that case. */
+- warning (OPT_Wpointer_arith, "NULL used in arithmetic");
+-
+-
+ /* If CONVERTED is zero, both args will be converted to type RESULT_TYPE.
+ Then the expression will be built.
+ It will be given type FINAL_TYPE if that is nonzero;
+@@ -5024,6 +5028,12 @@
+ return rhs;
+ }
+
++ if (type_unknown_p (rhs))
++ {
++ error ("no context to resolve type of %qE", rhs);
++ return error_mark_node;
++ }
++
+ return build2 (COMPOUND_EXPR, TREE_TYPE (rhs), lhs, rhs);
+ }
+
+diff -Nur a/gcc/c-ppoutput.c b/gcc/c-ppoutput.c
+--- a/gcc/c-ppoutput.c 2008-09-23 19:47:32.000000000 +0200
++++ b/gcc/c-ppoutput.c 2010-01-25 09:50:29.105687718 +0100
+@@ -521,6 +521,7 @@
+
+ if (map != NULL)
+ {
++ input_location = map->start_location;
+ if (print.first_time)
+ {
+ /* Avoid printing foo.i when the main file is foo.c. */
+diff -Nur a/gcc/cse.c b/gcc/cse.c
+--- a/gcc/cse.c 2009-04-27 13:55:13.000000000 +0200
++++ b/gcc/cse.c 2010-01-25 09:50:29.105687718 +0100
+@@ -5754,6 +5754,11 @@
+ validate_change (object, &XEXP (x, i),
+ cse_process_notes (XEXP (x, i), object, changed), 0);
+
++ /* Rebuild a PLUS expression in canonical form if the first operand
++ ends up as a constant. */
++ if (code == PLUS && GET_CODE (XEXP (x, 0)) == CONST_INT)
++ return plus_constant (XEXP(x, 1), INTVAL (XEXP (x, 0)));
++
+ return x;
+ }
+
+diff -Nur a/gcc/c-tree.h b/gcc/c-tree.h
+--- a/gcc/c-tree.h 2009-02-20 16:20:38.000000000 +0100
++++ b/gcc/c-tree.h 2010-01-25 09:50:29.105687718 +0100
+@@ -647,4 +647,8 @@
+ extern void pedwarn_c90 (location_t, int opt, const char *, ...) ATTRIBUTE_GCC_CDIAG(3,4);
+ extern void pedwarn_c99 (location_t, int opt, const char *, ...) ATTRIBUTE_GCC_CDIAG(3,4);
+
++extern bool c_cpp_error (cpp_reader *, int, location_t, unsigned int,
++ const char *, va_list *)
++ ATTRIBUTE_GCC_CDIAG(5,0);
++
+ #endif /* ! GCC_C_TREE_H */
+diff -Nur a/gcc/c-typeck.c b/gcc/c-typeck.c
+--- a/gcc/c-typeck.c 2009-04-08 13:59:36.000000000 +0200
++++ b/gcc/c-typeck.c 2010-01-25 09:50:29.105687718 +0100
+@@ -1765,6 +1765,7 @@
+ tree orig_exp;
+ tree type = TREE_TYPE (exp);
+ enum tree_code code = TREE_CODE (type);
++ tree promoted_type;
+
+ /* Functions and arrays have been converted during parsing. */
+ gcc_assert (code != FUNCTION_TYPE);
+@@ -1801,6 +1802,10 @@
+ if (exp == error_mark_node)
+ return error_mark_node;
+
++ promoted_type = targetm.promoted_type (type);
++ if (promoted_type)
++ return convert (promoted_type, exp);
++
+ if (INTEGRAL_TYPE_P (type))
+ return perform_integral_promotions (exp);
+
+diff -Nur a/gcc/dbxout.c b/gcc/dbxout.c
+--- a/gcc/dbxout.c 2009-07-07 22:46:41.000000000 +0200
++++ b/gcc/dbxout.c 2010-01-25 09:50:29.115687383 +0100
+@@ -376,6 +376,7 @@
+ dbxout_handle_pch, /* handle_pch */
+ debug_nothing_rtx, /* var_location */
+ debug_nothing_void, /* switch_text_section */
++ debug_nothing_tree_tree, /* set_name */
+ 0 /* start_end_main_source_file */
+ };
+ #endif /* DBX_DEBUGGING_INFO */
+@@ -408,6 +409,7 @@
+ dbxout_handle_pch, /* handle_pch */
+ debug_nothing_rtx, /* var_location */
+ debug_nothing_void, /* switch_text_section */
++ debug_nothing_tree_tree, /* set_name */
+ 0 /* start_end_main_source_file */
+ };
+ #endif /* XCOFF_DEBUGGING_INFO */
+diff -Nur a/gcc/debug.c b/gcc/debug.c
+--- a/gcc/debug.c 2009-02-20 16:20:38.000000000 +0100
++++ b/gcc/debug.c 2010-01-25 09:50:29.115687383 +0100
+@@ -50,6 +50,7 @@
+ debug_nothing_int, /* handle_pch */
+ debug_nothing_rtx, /* var_location */
+ debug_nothing_void, /* switch_text_section */
++ debug_nothing_tree_tree, /* set_name */
+ 0 /* start_end_main_source_file */
+ };
+
+@@ -67,6 +68,12 @@
+ }
+
+ void
++debug_nothing_tree_tree (tree t1 ATTRIBUTE_UNUSED,
++ tree t2 ATTRIBUTE_UNUSED)
++{
++}
++
++void
+ debug_nothing_tree_tree_tree_bool (tree t1 ATTRIBUTE_UNUSED,
+ tree t2 ATTRIBUTE_UNUSED,
+ tree t3 ATTRIBUTE_UNUSED,
+diff -Nur a/gcc/debug.h b/gcc/debug.h
+--- a/gcc/debug.h 2009-02-20 16:20:38.000000000 +0100
++++ b/gcc/debug.h 2010-01-25 09:50:29.115687383 +0100
+@@ -126,6 +126,10 @@
+ text sections. */
+ void (* switch_text_section) (void);
+
++ /* Called from grokdeclarator. Replaces the anonymous name with the
++ type name. */
++ void (* set_name) (tree, tree);
++
+ /* This is 1 if the debug writer wants to see start and end commands for the
+ main source files, and 0 otherwise. */
+ int start_end_main_source_file;
+@@ -140,6 +144,7 @@
+ extern void debug_nothing_int (unsigned int);
+ extern void debug_nothing_int_int (unsigned int, unsigned int);
+ extern void debug_nothing_tree (tree);
++extern void debug_nothing_tree_tree (tree, tree);
+ extern void debug_nothing_tree_int (tree, int);
+ extern void debug_nothing_tree_tree_tree_bool (tree, tree, tree, bool);
+ extern bool debug_true_const_tree (const_tree);
+diff -Nur a/gcc/defaults.h b/gcc/defaults.h
+--- a/gcc/defaults.h 2009-07-11 21:06:26.000000000 +0200
++++ b/gcc/defaults.h 2010-01-25 09:50:29.115687383 +0100
+@@ -902,7 +902,8 @@
+
+ /* On most machines, the CFA coincides with the first incoming parm. */
+ #ifndef ARG_POINTER_CFA_OFFSET
+-#define ARG_POINTER_CFA_OFFSET(FNDECL) FIRST_PARM_OFFSET (FNDECL)
++#define ARG_POINTER_CFA_OFFSET(FNDECL) \
++ (FIRST_PARM_OFFSET (FNDECL) + crtl->args.pretend_args_size)
+ #endif
+
+ /* On most machines, we use the CFA as DW_AT_frame_base. */
+diff -Nur a/gcc/diagnostic.c b/gcc/diagnostic.c
+--- a/gcc/diagnostic.c 2008-09-03 03:00:04.000000000 +0200
++++ b/gcc/diagnostic.c 2010-01-25 09:50:29.115687383 +0100
+@@ -126,6 +126,7 @@
+ diagnostic->message.args_ptr = args;
+ diagnostic->message.format_spec = msg;
+ diagnostic->location = location;
++ diagnostic->override_column = 0;
+ diagnostic->kind = kind;
+ diagnostic->option_index = 0;
+ }
+@@ -153,6 +154,8 @@
+ };
+ const char *text = _(diagnostic_kind_text[diagnostic->kind]);
+ expanded_location s = expand_location (diagnostic->location);
++ if (diagnostic->override_column)
++ s.column = diagnostic->override_column;
+ gcc_assert (diagnostic->kind < DK_LAST_DIAGNOSTIC_KIND);
+
+ return
+diff -Nur a/gcc/diagnostic.h b/gcc/diagnostic.h
+--- a/gcc/diagnostic.h 2008-08-09 01:57:19.000000000 +0200
++++ b/gcc/diagnostic.h 2010-01-25 09:50:29.115687383 +0100
+@@ -41,6 +41,7 @@
+ {
+ text_info message;
+ location_t location;
++ unsigned int override_column;
+ /* TREE_BLOCK if the diagnostic is to be reported in some inline
+ function inlined into other function, otherwise NULL. */
+ tree abstract_origin;
+@@ -185,6 +186,10 @@
+
+ #define report_diagnostic(D) diagnostic_report_diagnostic (global_dc, D)
+
++/* Override the column number to be used for reporting a
++ diagnostic. */
++#define diagnostic_override_column(DI, COL) (DI)->override_column = (COL)
++
+ /* Diagnostic related functions. */
+ extern void diagnostic_initialize (diagnostic_context *);
+ extern void diagnostic_report_current_module (diagnostic_context *);
+diff -Nur a/gcc/dwarf2out.c b/gcc/dwarf2out.c
+--- a/gcc/dwarf2out.c 2009-06-03 19:32:45.000000000 +0200
++++ b/gcc/dwarf2out.c 2010-01-25 09:50:29.115687383 +0100
+@@ -2474,6 +2474,12 @@
+ insn = PATTERN (insn);
+
+ dwarf2out_frame_debug_expr (insn, label);
++
++ /* Check again. A parallel can save and update the same register.
++ We could probably check just once, here, but this is safer than
++ removing the check above. */
++ if (clobbers_queued_reg_save (insn))
++ flush_queued_reg_saves ();
+ }
+
+ #endif
+@@ -4598,6 +4604,7 @@
+ static void dwarf2out_abstract_function (tree);
+ static void dwarf2out_var_location (rtx);
+ static void dwarf2out_begin_function (tree);
++static void dwarf2out_set_name (tree, tree);
+
+ /* The debug hooks structure. */
+
+@@ -4631,6 +4638,7 @@
+ debug_nothing_int, /* handle_pch */
+ dwarf2out_var_location,
+ dwarf2out_switch_text_section,
++ dwarf2out_set_name,
+ 1 /* start_end_main_source_file */
+ };
+ #endif
+@@ -5975,12 +5983,9 @@
+ (const char *)x2) == 0;
+ }
+
+-/* Add a string attribute value to a DIE. */
+-
+-static inline void
+-add_AT_string (dw_die_ref die, enum dwarf_attribute attr_kind, const char *str)
++static struct indirect_string_node *
++find_AT_string (const char *str)
+ {
+- dw_attr_node attr;
+ struct indirect_string_node *node;
+ void **slot;
+
+@@ -6001,6 +6006,18 @@
+ node = (struct indirect_string_node *) *slot;
+
+ node->refcount++;
++ return node;
++}
++
++/* Add a string attribute value to a DIE. */
++
++static inline void
++add_AT_string (dw_die_ref die, enum dwarf_attribute attr_kind, const char *str)
++{
++ dw_attr_node attr;
++ struct indirect_string_node *node;
++
++ node = find_AT_string (str);
+
+ attr.dw_attr = attr_kind;
+ attr.dw_attr_val.val_class = dw_val_class_str;
+@@ -6637,6 +6654,8 @@
+ static inline var_loc_list *
+ lookup_decl_loc (const_tree decl)
+ {
++ if (!decl_loc_table)
++ return NULL;
+ return (var_loc_list *)
+ htab_find_with_hash (decl_loc_table, decl, DECL_UID (decl));
+ }
+@@ -13471,6 +13490,7 @@
+ tree save_fn;
+ tree context;
+ int was_abstract = DECL_ABSTRACT (decl);
++ htab_t old_decl_loc_table;
+
+ /* Make sure we have the actual abstract inline, not a clone. */
+ decl = DECL_ORIGIN (decl);
+@@ -13480,6 +13500,12 @@
+ /* We've already generated the abstract instance. */
+ return;
+
++ /* We can be called while recursively when seeing block defining inlined subroutine
++ DIE. Be sure to not clobber the outer location table nor use it or we would
++ get locations in abstract instantces. */
++ old_decl_loc_table = decl_loc_table;
++ decl_loc_table = NULL;
++
+ /* Be sure we've emitted the in-class declaration DIE (if any) first, so
+ we don't get confused by DECL_ABSTRACT. */
+ if (debug_info_level > DINFO_LEVEL_TERSE)
+@@ -13501,6 +13527,7 @@
+ set_decl_abstract_flags (decl, 0);
+
+ current_function_decl = save_fn;
++ decl_loc_table = old_decl_loc_table;
+ pop_cfun ();
+ }
+
+@@ -15796,6 +15823,31 @@
+ return fd->emitted_number;
+ }
+
++/* Replace DW_AT_name for the decl with name. */
++
++static void
++dwarf2out_set_name (tree decl, tree name)
++{
++ dw_die_ref die;
++ dw_attr_ref attr;
++
++ die = TYPE_SYMTAB_DIE (decl);
++ if (!die)
++ return;
++
++ attr = get_AT (die, DW_AT_name);
++ if (attr)
++ {
++ struct indirect_string_node *node;
++
++ node = find_AT_string (dwarf2_name (name, 0));
++ /* replace the string. */
++ attr->dw_attr_val.v.val_str = node;
++ }
++
++ else
++ add_name_attribute (die, dwarf2_name (name, 0));
++}
+ /* Called by the final INSN scan whenever we see a var location. We
+ use it to drop labels in the right places, and throw the location in
+ our lookup table. */
+diff -Nur a/gcc/except.c b/gcc/except.c
+--- a/gcc/except.c 2009-03-07 17:02:30.000000000 +0100
++++ b/gcc/except.c 2010-01-25 09:50:29.115687383 +0100
+@@ -3567,6 +3567,12 @@
+ paths below go through assemble_integer, which would take
+ care of this for us. */
+ STRIP_NOPS (type);
++ if (TREE_CODE (type) == POINTER_PLUS_EXPR)
++ {
++ gcc_assert (TREE_CODE (TREE_OPERAND (type, 1)) == INTEGER_CST);
++ type = TREE_OPERAND (type, 0);
++ STRIP_NOPS (type);
++ }
+ if (TREE_CODE (type) == ADDR_EXPR)
+ {
+ type = TREE_OPERAND (type, 0);
+diff -Nur a/gcc/explow.c b/gcc/explow.c
+--- a/gcc/explow.c 2009-02-20 16:20:38.000000000 +0100
++++ b/gcc/explow.c 2010-01-25 09:50:29.115687383 +0100
+@@ -1491,9 +1491,9 @@
+ in which a scalar value of mode MODE was returned by a library call. */
+
+ rtx
+-hard_libcall_value (enum machine_mode mode)
++hard_libcall_value (enum machine_mode mode, rtx fun)
+ {
+- return LIBCALL_VALUE (mode);
++ return targetm.calls.libcall_value (mode, fun);
+ }
+
+ /* Look up the tree code for a given rtx code
+diff -Nur a/gcc/expmed.c b/gcc/expmed.c
+--- a/gcc/expmed.c 2009-01-16 19:56:47.000000000 +0100
++++ b/gcc/expmed.c 2010-01-25 09:50:29.115687383 +0100
+@@ -103,7 +103,8 @@
+ static int neg_cost[2][NUM_MACHINE_MODES];
+ static int shift_cost[2][NUM_MACHINE_MODES][MAX_BITS_PER_WORD];
+ static int shiftadd_cost[2][NUM_MACHINE_MODES][MAX_BITS_PER_WORD];
+-static int shiftsub_cost[2][NUM_MACHINE_MODES][MAX_BITS_PER_WORD];
++static int shiftsub0_cost[2][NUM_MACHINE_MODES][MAX_BITS_PER_WORD];
++static int shiftsub1_cost[2][NUM_MACHINE_MODES][MAX_BITS_PER_WORD];
+ static int mul_cost[2][NUM_MACHINE_MODES];
+ static int sdiv_cost[2][NUM_MACHINE_MODES];
+ static int udiv_cost[2][NUM_MACHINE_MODES];
+@@ -130,7 +131,8 @@
+ struct rtx_def shift; rtunion shift_fld1;
+ struct rtx_def shift_mult; rtunion shift_mult_fld1;
+ struct rtx_def shift_add; rtunion shift_add_fld1;
+- struct rtx_def shift_sub; rtunion shift_sub_fld1;
++ struct rtx_def shift_sub0; rtunion shift_sub0_fld1;
++ struct rtx_def shift_sub1; rtunion shift_sub1_fld1;
+ } all;
+
+ rtx pow2[MAX_BITS_PER_WORD];
+@@ -201,9 +203,13 @@
+ XEXP (&all.shift_add, 0) = &all.shift_mult;
+ XEXP (&all.shift_add, 1) = &all.reg;
+
+- PUT_CODE (&all.shift_sub, MINUS);
+- XEXP (&all.shift_sub, 0) = &all.shift_mult;
+- XEXP (&all.shift_sub, 1) = &all.reg;
++ PUT_CODE (&all.shift_sub0, MINUS);
++ XEXP (&all.shift_sub0, 0) = &all.shift_mult;
++ XEXP (&all.shift_sub0, 1) = &all.reg;
++
++ PUT_CODE (&all.shift_sub1, MINUS);
++ XEXP (&all.shift_sub1, 0) = &all.reg;
++ XEXP (&all.shift_sub1, 1) = &all.shift_mult;
+
+ for (speed = 0; speed < 2; speed++)
+ {
+@@ -226,7 +232,8 @@
+ PUT_MODE (&all.shift, mode);
+ PUT_MODE (&all.shift_mult, mode);
+ PUT_MODE (&all.shift_add, mode);
+- PUT_MODE (&all.shift_sub, mode);
++ PUT_MODE (&all.shift_sub0, mode);
++ PUT_MODE (&all.shift_sub1, mode);
+
+ add_cost[speed][mode] = rtx_cost (&all.plus, SET, speed);
+ neg_cost[speed][mode] = rtx_cost (&all.neg, SET, speed);
+@@ -254,8 +261,8 @@
+ }
+
+ shift_cost[speed][mode][0] = 0;
+- shiftadd_cost[speed][mode][0] = shiftsub_cost[speed][mode][0]
+- = add_cost[speed][mode];
++ shiftadd_cost[speed][mode][0] = shiftsub0_cost[speed][mode][0]
++ = shiftsub1_cost[speed][mode][0] = add_cost[speed][mode];
+
+ n = MIN (MAX_BITS_PER_WORD, GET_MODE_BITSIZE (mode));
+ for (m = 1; m < n; m++)
+@@ -265,7 +272,8 @@
+
+ shift_cost[speed][mode][m] = rtx_cost (&all.shift, SET, speed);
+ shiftadd_cost[speed][mode][m] = rtx_cost (&all.shift_add, SET, speed);
+- shiftsub_cost[speed][mode][m] = rtx_cost (&all.shift_sub, SET, speed);
++ shiftsub0_cost[speed][mode][m] = rtx_cost (&all.shift_sub0, SET, speed);
++ shiftsub1_cost[speed][mode][m] = rtx_cost (&all.shift_sub1, SET, speed);
+ }
+ }
+ }
+@@ -2397,6 +2405,7 @@
+ struct mult_cost best_cost;
+ struct mult_cost new_limit;
+ int op_cost, op_latency;
++ unsigned HOST_WIDE_INT orig_t = t;
+ unsigned HOST_WIDE_INT q;
+ int maxm = MIN (BITS_PER_WORD, GET_MODE_BITSIZE (mode));
+ int hash_index;
+@@ -2542,6 +2551,38 @@
+ best_alg->log[best_alg->ops] = m;
+ best_alg->op[best_alg->ops] = alg_shift;
+ }
++
++ /* See if treating ORIG_T as a signed number yields a better
++ sequence. Try this sequence only for a negative ORIG_T
++ as it would be useless for a non-negative ORIG_T. */
++ if ((HOST_WIDE_INT) orig_t < 0)
++ {
++ /* Shift ORIG_T as follows because a right shift of a
++ negative-valued signed type is implementation
++ defined. */
++ q = ~(~orig_t >> m);
++ /* The function expand_shift will choose between a shift
++ and a sequence of additions, so the observed cost is
++ given as MIN (m * add_cost[speed][mode],
++ shift_cost[speed][mode][m]). */
++ op_cost = m * add_cost[speed][mode];
++ if (shift_cost[speed][mode][m] < op_cost)
++ op_cost = shift_cost[speed][mode][m];
++ new_limit.cost = best_cost.cost - op_cost;
++ new_limit.latency = best_cost.latency - op_cost;
++ synth_mult (alg_in, q, &new_limit, mode);
++
++ alg_in->cost.cost += op_cost;
++ alg_in->cost.latency += op_cost;
++ if (CHEAPER_MULT_COST (&alg_in->cost, &best_cost))
++ {
++ struct algorithm *x;
++ best_cost = alg_in->cost;
++ x = alg_in, alg_in = best_alg, best_alg = x;
++ best_alg->log[best_alg->ops] = m;
++ best_alg->op[best_alg->ops] = alg_shift;
++ }
++ }
+ }
+ if (cache_hit)
+ goto done;
+@@ -2604,6 +2645,29 @@
+ best_alg->op[best_alg->ops] = alg_add_t_m2;
+ }
+ }
++
++ /* We may be able to calculate a * -7, a * -15, a * -31, etc
++ quickly with a - a * n for some appropriate constant n. */
++ m = exact_log2 (-orig_t + 1);
++ if (m >= 0 && m < maxm)
++ {
++ op_cost = shiftsub1_cost[speed][mode][m];
++ new_limit.cost = best_cost.cost - op_cost;
++ new_limit.latency = best_cost.latency - op_cost;
++ synth_mult (alg_in, (unsigned HOST_WIDE_INT) (-orig_t + 1) >> m, &new_limit, mode);
++
++ alg_in->cost.cost += op_cost;
++ alg_in->cost.latency += op_cost;
++ if (CHEAPER_MULT_COST (&alg_in->cost, &best_cost))
++ {
++ struct algorithm *x;
++ best_cost = alg_in->cost;
++ x = alg_in, alg_in = best_alg, best_alg = x;
++ best_alg->log[best_alg->ops] = m;
++ best_alg->op[best_alg->ops] = alg_sub_t_m2;
++ }
++ }
++
+ if (cache_hit)
+ goto done;
+ }
+@@ -2673,9 +2737,9 @@
+ hardware the shift may be executed concurrently with the
+ earlier steps in the algorithm. */
+ op_cost = add_cost[speed][mode] + shift_cost[speed][mode][m];
+- if (shiftsub_cost[speed][mode][m] < op_cost)
++ if (shiftsub0_cost[speed][mode][m] < op_cost)
+ {
+- op_cost = shiftsub_cost[speed][mode][m];
++ op_cost = shiftsub0_cost[speed][mode][m];
+ op_latency = op_cost;
+ }
+ else
+@@ -2738,7 +2802,7 @@
+ m = exact_log2 (q);
+ if (m >= 0 && m < maxm)
+ {
+- op_cost = shiftsub_cost[speed][mode][m];
++ op_cost = shiftsub0_cost[speed][mode][m];
+ new_limit.cost = best_cost.cost - op_cost;
+ new_limit.latency = best_cost.latency - op_cost;
+ synth_mult (alg_in, (t + 1) >> m, &new_limit, mode);
+diff -Nur a/gcc/expr.c b/gcc/expr.c
+--- a/gcc/expr.c 2009-06-16 16:28:47.000000000 +0200
++++ b/gcc/expr.c 2010-01-25 09:50:29.115687383 +0100
+@@ -4391,6 +4391,29 @@
+
+ /* Compute FROM and store the value in the rtx we got. */
+
++ if (TREE_CODE (to) == MISALIGNED_INDIRECT_REF)
++ {
++ rtx insn;
++ rtx from_rtx;
++ enum insn_code icode;
++ enum machine_mode mode = GET_MODE (to_rtx);
++
++ icode = optab_handler (movmisalign_optab, mode)->insn_code;
++ gcc_assert (icode != CODE_FOR_nothing);
++
++ from_rtx = expand_expr (from, NULL_RTX, mode, EXPAND_NORMAL);
++ insn = GEN_FCN (icode) (to_rtx, from_rtx);
++ /* If that failed then force the source into a reg and try again. */
++ if (!insn)
++ {
++ from_rtx = copy_to_mode_reg(mode, from_rtx);
++ insn = GEN_FCN (icode) (to_rtx, from_rtx);
++ gcc_assert(insn);
++ }
++ emit_insn (insn);
++ return;
++ }
++
+ push_temp_slots ();
+ result = store_expr (from, to_rtx, 0, nontemporal);
+ preserve_temp_slots (result);
+@@ -7291,6 +7314,19 @@
+ decl_rtl = DECL_RTL (exp);
+ gcc_assert (decl_rtl);
+ decl_rtl = copy_rtx (decl_rtl);
++ /* Record writes to register variables. */
++ if (modifier == EXPAND_WRITE && REG_P(decl_rtl)
++ && REGNO(decl_rtl) < FIRST_PSEUDO_REGISTER)
++ {
++ int i = REGNO(decl_rtl);
++ int nregs = hard_regno_nregs[i][GET_MODE(decl_rtl)];
++ while (nregs)
++ {
++ SET_HARD_REG_BIT(crtl->asm_clobbers, i);
++ i++;
++ nregs--;
++ }
++ }
+
+ /* Ensure variable marked as used even if it doesn't go through
+ a parser. If it hasn't be used yet, write out an external
+@@ -7538,14 +7574,15 @@
+
+ /* Resolve the misalignment now, so that we don't have to remember
+ to resolve it later. Of course, this only works for reads. */
+- /* ??? When we get around to supporting writes, we'll have to handle
+- this in store_expr directly. The vectorizer isn't generating
+- those yet, however. */
+ if (code == MISALIGNED_INDIRECT_REF)
+ {
+ int icode;
+ rtx reg, insn;
+
++ /* For writes produce a MEM, and expand_assignment will DTRT. */
++ if (modifier == EXPAND_WRITE)
++ return temp;
++
+ gcc_assert (modifier == EXPAND_NORMAL
+ || modifier == EXPAND_STACK_PARM);
+
+diff -Nur a/gcc/expr.h b/gcc/expr.h
+--- a/gcc/expr.h 2009-03-17 18:46:23.000000000 +0100
++++ b/gcc/expr.h 2010-01-25 09:50:29.125687117 +0100
+@@ -757,7 +757,7 @@
+
+ /* Return an rtx that refers to the value returned by a library call
+ in its original home. This becomes invalid if any more code is emitted. */
+-extern rtx hard_libcall_value (enum machine_mode);
++extern rtx hard_libcall_value (enum machine_mode, rtx);
+
+ /* Return the mode desired by operand N of a particular bitfield
+ insert/extract insn, or MAX_MACHINE_MODE if no such insn is
+diff -Nur a/gcc/final.c b/gcc/final.c
+--- a/gcc/final.c 2008-12-10 09:46:40.000000000 +0100
++++ b/gcc/final.c 2010-01-25 09:50:29.125687117 +0100
+@@ -891,6 +891,7 @@
+ if (LABEL_P (insn))
+ {
+ rtx next;
++ bool next_is_jumptable;
+
+ /* Merge in alignments computed by compute_alignments. */
+ log = LABEL_TO_ALIGNMENT (insn);
+@@ -900,31 +901,30 @@
+ max_skip = LABEL_TO_MAX_SKIP (insn);
+ }
+
+- log = LABEL_ALIGN (insn);
+- if (max_log < log)
++ next = next_nonnote_insn (insn);
++ next_is_jumptable = next && JUMP_TABLE_DATA_P (next);
++ if (!next_is_jumptable)
+ {
+- max_log = log;
+- max_skip = LABEL_ALIGN_MAX_SKIP;
++ log = LABEL_ALIGN (insn);
++ if (max_log < log)
++ {
++ max_log = log;
++ max_skip = LABEL_ALIGN_MAX_SKIP;
++ }
+ }
+- next = next_nonnote_insn (insn);
+ /* ADDR_VECs only take room if read-only data goes into the text
+ section. */
+- if (JUMP_TABLES_IN_TEXT_SECTION
+- || readonly_data_section == text_section)
+- if (next && JUMP_P (next))
+- {
+- rtx nextbody = PATTERN (next);
+- if (GET_CODE (nextbody) == ADDR_VEC
+- || GET_CODE (nextbody) == ADDR_DIFF_VEC)
+- {
+- log = ADDR_VEC_ALIGN (next);
+- if (max_log < log)
+- {
+- max_log = log;
+- max_skip = LABEL_ALIGN_MAX_SKIP;
+- }
+- }
+- }
++ if ((JUMP_TABLES_IN_TEXT_SECTION
++ || readonly_data_section == text_section)
++ && next_is_jumptable)
++ {
++ log = ADDR_VEC_ALIGN (next);
++ if (max_log < log)
++ {
++ max_log = log;
++ max_skip = LABEL_ALIGN_MAX_SKIP;
++ }
++ }
+ LABEL_TO_ALIGNMENT (insn) = max_log;
+ LABEL_TO_MAX_SKIP (insn) = max_skip;
+ max_log = 0;
+@@ -2013,48 +2013,41 @@
+ app_disable ();
+
+ next = next_nonnote_insn (insn);
+- if (next != 0 && JUMP_P (next))
++ /* If this label is followed by a jump-table, make sure we put
++ the label in the read-only section. Also possibly write the
++ label and jump table together. */
++ if (next != 0 && JUMP_TABLE_DATA_P (next))
+ {
+- rtx nextbody = PATTERN (next);
+-
+- /* If this label is followed by a jump-table,
+- make sure we put the label in the read-only section. Also
+- possibly write the label and jump table together. */
+-
+- if (GET_CODE (nextbody) == ADDR_VEC
+- || GET_CODE (nextbody) == ADDR_DIFF_VEC)
+- {
+ #if defined(ASM_OUTPUT_ADDR_VEC) || defined(ASM_OUTPUT_ADDR_DIFF_VEC)
+- /* In this case, the case vector is being moved by the
+- target, so don't output the label at all. Leave that
+- to the back end macros. */
++ /* In this case, the case vector is being moved by the
++ target, so don't output the label at all. Leave that
++ to the back end macros. */
+ #else
+- if (! JUMP_TABLES_IN_TEXT_SECTION)
+- {
+- int log_align;
++ if (! JUMP_TABLES_IN_TEXT_SECTION)
++ {
++ int log_align;
+
+- switch_to_section (targetm.asm_out.function_rodata_section
+- (current_function_decl));
++ switch_to_section (targetm.asm_out.function_rodata_section
++ (current_function_decl));
+
+ #ifdef ADDR_VEC_ALIGN
+- log_align = ADDR_VEC_ALIGN (next);
++ log_align = ADDR_VEC_ALIGN (next);
+ #else
+- log_align = exact_log2 (BIGGEST_ALIGNMENT / BITS_PER_UNIT);
++ log_align = exact_log2 (BIGGEST_ALIGNMENT / BITS_PER_UNIT);
+ #endif
+- ASM_OUTPUT_ALIGN (file, log_align);
+- }
+- else
+- switch_to_section (current_function_section ());
++ ASM_OUTPUT_ALIGN (file, log_align);
++ }
++ else
++ switch_to_section (current_function_section ());
+
+ #ifdef ASM_OUTPUT_CASE_LABEL
+- ASM_OUTPUT_CASE_LABEL (file, "L", CODE_LABEL_NUMBER (insn),
+- next);
++ ASM_OUTPUT_CASE_LABEL (file, "L", CODE_LABEL_NUMBER (insn),
++ next);
+ #else
+- targetm.asm_out.internal_label (file, "L", CODE_LABEL_NUMBER (insn));
++ targetm.asm_out.internal_label (file, "L", CODE_LABEL_NUMBER (insn));
+ #endif
+ #endif
+- break;
+- }
++ break;
+ }
+ if (LABEL_ALT_ENTRY_P (insn))
+ output_alternate_entry_point (file, insn);
+diff -Nur a/gcc/fold-const.c b/gcc/fold-const.c
+--- a/gcc/fold-const.c 2009-07-15 13:23:22.000000000 +0200
++++ b/gcc/fold-const.c 2010-01-25 09:50:29.125687117 +0100
+@@ -2289,7 +2289,24 @@
+ real_convert (&value, TYPE_MODE (type), &TREE_REAL_CST (arg1));
+ t = build_real (type, value);
+
+- TREE_OVERFLOW (t) = TREE_OVERFLOW (arg1);
++ /* If converting an infinity or NAN to a representation that doesn't
++ have one, set the overflow bit so that we can produce some kind of
++ error message at the appropriate point if necessary. It's not the
++ most user-friendly message, but it's better than nothing. */
++ if (REAL_VALUE_ISINF (TREE_REAL_CST (arg1))
++ && !MODE_HAS_INFINITIES (TYPE_MODE (type)))
++ TREE_OVERFLOW (t) = 1;
++ else if (REAL_VALUE_ISNAN (TREE_REAL_CST (arg1))
++ && !MODE_HAS_NANS (TYPE_MODE (type)))
++ TREE_OVERFLOW (t) = 1;
++ /* Regular overflow, conversion produced an infinity in a mode that
++ can't represent them. */
++ else if (!MODE_HAS_INFINITIES (TYPE_MODE (type))
++ && REAL_VALUE_ISINF (value)
++ && !REAL_VALUE_ISINF (TREE_REAL_CST (arg1)))
++ TREE_OVERFLOW (t) = 1;
++ else
++ TREE_OVERFLOW (t) = TREE_OVERFLOW (arg1);
+ return t;
+ }
+
+diff -Nur a/gcc/fortran/cpp.c b/gcc/fortran/cpp.c
+--- a/gcc/fortran/cpp.c 2008-12-09 20:25:55.000000000 +0100
++++ b/gcc/fortran/cpp.c 2010-01-25 09:50:29.125687117 +0100
+@@ -137,6 +137,9 @@
+ static void cb_ident (cpp_reader *, source_location, const cpp_string *);
+ static void cb_used_define (cpp_reader *, source_location, cpp_hashnode *);
+ static void cb_used_undef (cpp_reader *, source_location, cpp_hashnode *);
++static bool cb_cpp_error (cpp_reader *, int, location_t, unsigned int,
++ const char *, va_list *)
++ ATTRIBUTE_GCC_DIAG(5,0);
+ void pp_dir_change (cpp_reader *, const char *);
+
+ static int dump_macro (cpp_reader *, cpp_hashnode *, void *);
+@@ -452,7 +455,6 @@
+ cpp_option->cplusplus_comments = 0;
+
+ cpp_option->pedantic = pedantic;
+- cpp_option->inhibit_warnings = inhibit_warnings;
+
+ cpp_option->dollars_in_ident = gfc_option.flag_dollar_ok;
+ cpp_option->discard_comments = gfc_cpp_option.discard_comments;
+@@ -465,9 +467,6 @@
+
+ cpp_post_options (cpp_in);
+
+- /* If an error has occurred in cpplib, note it so we fail immediately. */
+- errorcount += cpp_errors (cpp_in);
+-
+ gfc_cpp_register_include_paths ();
+ }
+
+@@ -482,6 +481,7 @@
+ cb->line_change = cb_line_change;
+ cb->ident = cb_ident;
+ cb->def_pragma = cb_def_pragma;
++ cb->error = cb_cpp_error;
+
+ if (gfc_cpp_option.dump_includes)
+ cb->include = cb_include;
+@@ -961,6 +961,57 @@
+ cpp_define_queue = q;
+ }
+
++/* Callback from cpp_error for PFILE to print diagnostics from the
++ preprocessor. The diagnostic is of type LEVEL, at location
++ LOCATION, with column number possibly overridden by COLUMN_OVERRIDE
++ if not zero; MSG is the translated message and AP the arguments.
++ Returns true if a diagnostic was emitted, false otherwise. */
++
++static bool
++cb_cpp_error (cpp_reader *pfile ATTRIBUTE_UNUSED, int level,
++ location_t location, unsigned int column_override,
++ const char *msg, va_list *ap)
++{
++ diagnostic_info diagnostic;
++ diagnostic_t dlevel;
++ int save_warn_system_headers = warn_system_headers;
++ bool ret;
++
++ switch (level)
++ {
++ case CPP_DL_WARNING_SYSHDR:
++ warn_system_headers = 1;
++ /* Fall through. */
++ case CPP_DL_WARNING:
++ dlevel = DK_WARNING;
++ break;
++ case CPP_DL_PEDWARN:
++ dlevel = DK_PEDWARN;
++ break;
++ case CPP_DL_ERROR:
++ dlevel = DK_ERROR;
++ break;
++ case CPP_DL_ICE:
++ dlevel = DK_ICE;
++ break;
++ case CPP_DL_NOTE:
++ dlevel = DK_NOTE;
++ break;
++ case CPP_DL_FATAL:
++ dlevel = DK_FATAL;
++ break;
++ default:
++ gcc_unreachable ();
++ }
++ diagnostic_set_info_translated (&diagnostic, msg, ap,
++ location, dlevel);
++ if (column_override)
++ diagnostic_override_column (&diagnostic, column_override);
++ ret = report_diagnostic (&diagnostic);
++ if (level == CPP_DL_WARNING_SYSHDR)
++ warn_system_headers = save_warn_system_headers;
++ return ret;
++}
+
+ /* Callback called when -fworking-director and -E to emit working
+ directory in cpp output file. */
+diff -Nur a/gcc/fortran/gfortran.info b/gcc/fortran/gfortran.info
+--- a/gcc/fortran/gfortran.info 2009-07-22 10:33:04.000000000 +0200
++++ b/gcc/fortran/gfortran.info 1970-01-01 01:00:00.000000000 +0100
+@@ -1,15040 +0,0 @@
+-This is doc/gfortran.info, produced by makeinfo version 4.13 from
+-/d/gcc-4.4.1/gcc-4.4.1/gcc/fortran/gfortran.texi.
+-
+-Copyright (C) 1999-2008 Free Software Foundation, Inc.
+-
+- Permission is granted to copy, distribute and/or modify this document
+-under the terms of the GNU Free Documentation License, Version 1.2 or
+-any later version published by the Free Software Foundation; with the
+-Invariant Sections being "Funding Free Software", the Front-Cover Texts
+-being (a) (see below), and with the Back-Cover Texts being (b) (see
+-below). A copy of the license is included in the section entitled "GNU
+-Free Documentation License".
+-
+- (a) The FSF's Front-Cover Text is:
+-
+- A GNU Manual
+-
+- (b) The FSF's Back-Cover Text is:
+-
+- You have freedom to copy and modify this GNU Manual, like GNU
+-software. Copies published by the Free Software Foundation raise
+-funds for GNU development.
+-
+-INFO-DIR-SECTION Software development
+-START-INFO-DIR-ENTRY
+-* gfortran: (gfortran). The GNU Fortran Compiler.
+-END-INFO-DIR-ENTRY
+- This file documents the use and the internals of the GNU Fortran
+-compiler, (`gfortran').
+-
+- Published by the Free Software Foundation 51 Franklin Street, Fifth
+-Floor Boston, MA 02110-1301 USA
+-
+- Copyright (C) 1999-2008 Free Software Foundation, Inc.
+-
+- Permission is granted to copy, distribute and/or modify this document
+-under the terms of the GNU Free Documentation License, Version 1.2 or
+-any later version published by the Free Software Foundation; with the
+-Invariant Sections being "Funding Free Software", the Front-Cover Texts
+-being (a) (see below), and with the Back-Cover Texts being (b) (see
+-below). A copy of the license is included in the section entitled "GNU
+-Free Documentation License".
+-
+- (a) The FSF's Front-Cover Text is:
+-
+- A GNU Manual
+-
+- (b) The FSF's Back-Cover Text is:
+-
+- You have freedom to copy and modify this GNU Manual, like GNU
+-software. Copies published by the Free Software Foundation raise
+-funds for GNU development.
+-
+-
+-File: gfortran.info, Node: Top, Next: Introduction, Up: (dir)
+-
+-Introduction
+-************
+-
+-This manual documents the use of `gfortran', the GNU Fortran compiler.
+-You can find in this manual how to invoke `gfortran', as well as its
+-features and incompatibilities.
+-
+-* Menu:
+-
+-* Introduction::
+-
+-Part I: Invoking GNU Fortran
+-* Invoking GNU Fortran:: Command options supported by `gfortran'.
+-* Runtime:: Influencing runtime behavior with environment variables.
+-
+-Part II: Language Reference
+-* Fortran 2003 and 2008 status:: Fortran 2003 and 2008 features supported by GNU Fortran.
+-* Compiler Characteristics:: KIND type parameters supported.
+-* Extensions:: Language extensions implemented by GNU Fortran.
+-* Intrinsic Procedures:: Intrinsic procedures supported by GNU Fortran.
+-* Intrinsic Modules:: Intrinsic modules supported by GNU Fortran.
+-
+-* Contributing:: How you can help.
+-* Copying:: GNU General Public License says
+- how you can copy and share GNU Fortran.
+-* GNU Free Documentation License::
+- How you can copy and share this manual.
+-* Funding:: How to help assure continued work for free software.
+-* Option Index:: Index of command line options
+-* Keyword Index:: Index of concepts
+-
+-
+-File: gfortran.info, Node: Introduction, Next: Invoking GNU Fortran, Prev: Top, Up: Top
+-
+-1 Introduction
+-**************
+-
+-The GNU Fortran compiler front end was designed initially as a free
+-replacement for, or alternative to, the unix `f95' command; `gfortran'
+-is the command you'll use to invoke the compiler.
+-
+-* Menu:
+-
+-* About GNU Fortran:: What you should know about the GNU Fortran compiler.
+-* GNU Fortran and GCC:: You can compile Fortran, C, or other programs.
+-* Preprocessing and conditional compilation:: The Fortran preprocessor
+-* GNU Fortran and G77:: Why we chose to start from scratch.
+-* Project Status:: Status of GNU Fortran, roadmap, proposed extensions.
+-* Standards:: Standards supported by GNU Fortran.
+-
+-
+-File: gfortran.info, Node: About GNU Fortran, Next: GNU Fortran and GCC, Up: Introduction
+-
+-1.1 About GNU Fortran
+-=====================
+-
+-The GNU Fortran compiler is still in an early state of development. It
+-can generate code for most constructs and expressions, but much work
+-remains to be done.
+-
+- When the GNU Fortran compiler is finished, it will do everything you
+-expect from any decent compiler:
+-
+- * Read a user's program, stored in a file and containing
+- instructions written in Fortran 77, Fortran 90, Fortran 95,
+- Fortran 2003 or Fortran 2008. This file contains "source code".
+-
+- * Translate the user's program into instructions a computer can
+- carry out more quickly than it takes to translate the instructions
+- in the first place. The result after compilation of a program is
+- "machine code", code designed to be efficiently translated and
+- processed by a machine such as your computer. Humans usually
+- aren't as good writing machine code as they are at writing Fortran
+- (or C++, Ada, or Java), because it is easy to make tiny mistakes
+- writing machine code.
+-
+- * Provide the user with information about the reasons why the
+- compiler is unable to create a binary from the source code.
+- Usually this will be the case if the source code is flawed. The
+- Fortran 90 standard requires that the compiler can point out
+- mistakes to the user. An incorrect usage of the language causes
+- an "error message".
+-
+- The compiler will also attempt to diagnose cases where the user's
+- program contains a correct usage of the language, but instructs
+- the computer to do something questionable. This kind of
+- diagnostics message is called a "warning message".
+-
+- * Provide optional information about the translation passes from the
+- source code to machine code. This can help a user of the compiler
+- to find the cause of certain bugs which may not be obvious in the
+- source code, but may be more easily found at a lower level
+- compiler output. It also helps developers to find bugs in the
+- compiler itself.
+-
+- * Provide information in the generated machine code that can make it
+- easier to find bugs in the program (using a debugging tool, called
+- a "debugger", such as the GNU Debugger `gdb').
+-
+- * Locate and gather machine code already generated to perform
+- actions requested by statements in the user's program. This
+- machine code is organized into "modules" and is located and
+- "linked" to the user program.
+-
+- The GNU Fortran compiler consists of several components:
+-
+- * A version of the `gcc' command (which also might be installed as
+- the system's `cc' command) that also understands and accepts
+- Fortran source code. The `gcc' command is the "driver" program for
+- all the languages in the GNU Compiler Collection (GCC); With `gcc',
+- you can compile the source code of any language for which a front
+- end is available in GCC.
+-
+- * The `gfortran' command itself, which also might be installed as the
+- system's `f95' command. `gfortran' is just another driver program,
+- but specifically for the Fortran compiler only. The difference
+- with `gcc' is that `gfortran' will automatically link the correct
+- libraries to your program.
+-
+- * A collection of run-time libraries. These libraries contain the
+- machine code needed to support capabilities of the Fortran
+- language that are not directly provided by the machine code
+- generated by the `gfortran' compilation phase, such as intrinsic
+- functions and subroutines, and routines for interaction with files
+- and the operating system.
+-
+- * The Fortran compiler itself, (`f951'). This is the GNU Fortran
+- parser and code generator, linked to and interfaced with the GCC
+- backend library. `f951' "translates" the source code to assembler
+- code. You would typically not use this program directly; instead,
+- the `gcc' or `gfortran' driver programs will call it for you.
+-
+-
+-File: gfortran.info, Node: GNU Fortran and GCC, Next: Preprocessing and conditional compilation, Prev: About GNU Fortran, Up: Introduction
+-
+-1.2 GNU Fortran and GCC
+-=======================
+-
+-GNU Fortran is a part of GCC, the "GNU Compiler Collection". GCC
+-consists of a collection of front ends for various languages, which
+-translate the source code into a language-independent form called
+-"GENERIC". This is then processed by a common middle end which
+-provides optimization, and then passed to one of a collection of back
+-ends which generate code for different computer architectures and
+-operating systems.
+-
+- Functionally, this is implemented with a driver program (`gcc')
+-which provides the command-line interface for the compiler. It calls
+-the relevant compiler front-end program (e.g., `f951' for Fortran) for
+-each file in the source code, and then calls the assembler and linker
+-as appropriate to produce the compiled output. In a copy of GCC which
+-has been compiled with Fortran language support enabled, `gcc' will
+-recognize files with `.f', `.for', `.ftn', `.f90', `.f95', `.f03' and
+-`.f08' extensions as Fortran source code, and compile it accordingly. A
+-`gfortran' driver program is also provided, which is identical to `gcc'
+-except that it automatically links the Fortran runtime libraries into
+-the compiled program.
+-
+- Source files with `.f', `.for', `.fpp', `.ftn', `.F', `.FOR',
+-`.FPP', and `.FTN' extensions are treated as fixed form. Source files
+-with `.f90', `.f95', `.f03', `.f08', `.F90', `.F95', `.F03' and `.F08'
+-extensions are treated as free form. The capitalized versions of
+-either form are run through preprocessing. Source files with the lower
+-case `.fpp' extension are also run through preprocessing.
+-
+- This manual specifically documents the Fortran front end, which
+-handles the programming language's syntax and semantics. The aspects
+-of GCC which relate to the optimization passes and the back-end code
+-generation are documented in the GCC manual; see *note Introduction:
+-(gcc)Top. The two manuals together provide a complete reference for
+-the GNU Fortran compiler.
+-
+-
+-File: gfortran.info, Node: Preprocessing and conditional compilation, Next: GNU Fortran and G77, Prev: GNU Fortran and GCC, Up: Introduction
+-
+-1.3 Preprocessing and conditional compilation
+-=============================================
+-
+-Many Fortran compilers including GNU Fortran allow passing the source
+-code through a C preprocessor (CPP; sometimes also called the Fortran
+-preprocessor, FPP) to allow for conditional compilation. In the case of
+-GNU Fortran, this is the GNU C Preprocessor in the traditional mode. On
+-systems with case-preserving file names, the preprocessor is
+-automatically invoked if the filename extension is `.F', `.FOR',
+-`.FTN', `.fpp', `.FPP', `.F90', `.F95', `.F03' or `.F08'. To manually
+-invoke the preprocessor on any file, use `-cpp', to disable
+-preprocessing on files where the preprocessor is run automatically, use
+-`-nocpp'.
+-
+- If a preprocessed file includes another file with the Fortran
+-`INCLUDE' statement, the included file is not preprocessed. To
+-preprocess included files, use the equivalent preprocessor statement
+-`#include'.
+-
+- If GNU Fortran invokes the preprocessor, `__GFORTRAN__' is defined
+-and `__GNUC__', `__GNUC_MINOR__' and `__GNUC_PATCHLEVEL__' can be used
+-to determine the version of the compiler. See *note Overview: (cpp)Top.
+-for details.
+-
+- While CPP is the de-facto standard for preprocessing Fortran code,
+-Part 3 of the Fortran 95 standard (ISO/IEC 1539-3:1998) defines
+-Conditional Compilation, which is not widely used and not directly
+-supported by the GNU Fortran compiler. You can use the program coco to
+-preprocess such files (`http://users.erols.com/dnagle/coco.html').
+-
+-
+-File: gfortran.info, Node: GNU Fortran and G77, Next: Project Status, Prev: Preprocessing and conditional compilation, Up: Introduction
+-
+-1.4 GNU Fortran and G77
+-=======================
+-
+-The GNU Fortran compiler is the successor to `g77', the Fortran 77
+-front end included in GCC prior to version 4. It is an entirely new
+-program that has been designed to provide Fortran 95 support and
+-extensibility for future Fortran language standards, as well as
+-providing backwards compatibility for Fortran 77 and nearly all of the
+-GNU language extensions supported by `g77'.
+-
+-
+-File: gfortran.info, Node: Project Status, Next: Standards, Prev: GNU Fortran and G77, Up: Introduction
+-
+-1.5 Project Status
+-==================
+-
+- As soon as `gfortran' can parse all of the statements correctly,
+- it will be in the "larva" state. When we generate code, the
+- "puppa" state. When `gfortran' is done, we'll see if it will be a
+- beautiful butterfly, or just a big bug....
+-
+- -Andy Vaught, April 2000
+-
+- The start of the GNU Fortran 95 project was announced on the GCC
+-homepage in March 18, 2000 (even though Andy had already been working
+-on it for a while, of course).
+-
+- The GNU Fortran compiler is able to compile nearly all
+-standard-compliant Fortran 95, Fortran 90, and Fortran 77 programs,
+-including a number of standard and non-standard extensions, and can be
+-used on real-world programs. In particular, the supported extensions
+-include OpenMP, Cray-style pointers, and several Fortran 2003 and
+-Fortran 2008 features such as enumeration, stream I/O, and some of the
+-enhancements to allocatable array support from TR 15581. However, it is
+-still under development and has a few remaining rough edges.
+-
+- At present, the GNU Fortran compiler passes the NIST Fortran 77 Test
+-Suite (http://www.fortran-2000.com/ArnaudRecipes/fcvs21_f95.html), and
+-produces acceptable results on the LAPACK Test Suite
+-(http://www.netlib.org/lapack/faq.html#1.21). It also provides
+-respectable performance on the Polyhedron Fortran compiler benchmarks
+-(http://www.polyhedron.com/pb05.html) and the Livermore Fortran Kernels
+-test
+-(http://www.llnl.gov/asci_benchmarks/asci/limited/lfk/README.html). It
+-has been used to compile a number of large real-world programs,
+-including the HIRLAM weather-forecasting code
+-(http://mysite.verizon.net/serveall/moene.pdf) and the Tonto quantum
+-chemistry package (http://www.theochem.uwa.edu.au/tonto/); see
+-`http://gcc.gnu.org/wiki/GfortranApps' for an extended list.
+-
+- Among other things, the GNU Fortran compiler is intended as a
+-replacement for G77. At this point, nearly all programs that could be
+-compiled with G77 can be compiled with GNU Fortran, although there are
+-a few minor known regressions.
+-
+- The primary work remaining to be done on GNU Fortran falls into three
+-categories: bug fixing (primarily regarding the treatment of invalid
+-code and providing useful error messages), improving the compiler
+-optimizations and the performance of compiled code, and extending the
+-compiler to support future standards--in particular, Fortran 2003.
+-
+-
+-File: gfortran.info, Node: Standards, Prev: Project Status, Up: Introduction
+-
+-1.6 Standards
+-=============
+-
+-The GNU Fortran compiler implements ISO/IEC 1539:1997 (Fortran 95). As
+-such, it can also compile essentially all standard-compliant Fortran 90
+-and Fortran 77 programs. It also supports the ISO/IEC TR-15581
+-enhancements to allocatable arrays, and the OpenMP Application Program
+-Interface v2.5 (http://www.openmp.org/drupal/mp-documents/spec25.pdf)
+-specification.
+-
+- In the future, the GNU Fortran compiler will also support ISO/IEC
+-1539-1:2004 (Fortran 2003) and future Fortran standards. Partial support
+-of that standard is already provided; the current status of Fortran 2003
+-support is reported in the *note Fortran 2003 status:: section of the
+-documentation.
+-
+- The next version of the Fortran standard after Fortran 2003 is
+-currently being developed and the GNU Fortran compiler supports some of
+-its new features. This support is based on the latest draft of the
+-standard (available from `http://www.nag.co.uk/sc22wg5/') and no
+-guarantee of future compatibility is made, as the final standard might
+-differ from the draft. For more information, see the *note Fortran 2008
+-status:: section.
+-
+-
+-File: gfortran.info, Node: Invoking GNU Fortran, Next: Runtime, Prev: Introduction, Up: Top
+-
+-2 GNU Fortran Command Options
+-*****************************
+-
+-The `gfortran' command supports all the options supported by the `gcc'
+-command. Only options specific to GNU Fortran are documented here.
+-
+- *Note GCC Command Options: (gcc)Invoking GCC, for information on the
+-non-Fortran-specific aspects of the `gcc' command (and, therefore, the
+-`gfortran' command).
+-
+- All GCC and GNU Fortran options are accepted both by `gfortran' and
+-by `gcc' (as well as any other drivers built at the same time, such as
+-`g++'), since adding GNU Fortran to the GCC distribution enables
+-acceptance of GNU Fortran options by all of the relevant drivers.
+-
+- In some cases, options have positive and negative forms; the
+-negative form of `-ffoo' would be `-fno-foo'. This manual documents
+-only one of these two forms, whichever one is not the default.
+-
+-* Menu:
+-
+-* Option Summary:: Brief list of all `gfortran' options,
+- without explanations.
+-* Fortran Dialect Options:: Controlling the variant of Fortran language
+- compiled.
+-* Preprocessing Options:: Enable and customize preprocessing.
+-* Error and Warning Options:: How picky should the compiler be?
+-* Debugging Options:: Symbol tables, measurements, and debugging dumps.
+-* Directory Options:: Where to find module files
+-* Link Options :: Influencing the linking step
+-* Runtime Options:: Influencing runtime behavior
+-* Code Gen Options:: Specifying conventions for function calls, data layout
+- and register usage.
+-* Environment Variables:: Environment variables that affect `gfortran'.
+-
+-
+-File: gfortran.info, Node: Option Summary, Next: Fortran Dialect Options, Up: Invoking GNU Fortran
+-
+-2.1 Option summary
+-==================
+-
+-Here is a summary of all the options specific to GNU Fortran, grouped
+-by type. Explanations are in the following sections.
+-
+-_Fortran Language Options_
+- *Note Options controlling Fortran dialect: Fortran Dialect Options.
+- -fall-intrinsics -ffree-form -fno-fixed-form
+- -fdollar-ok -fimplicit-none -fmax-identifier-length
+- -std=STD -fd-lines-as-code -fd-lines-as-comments
+- -ffixed-line-length-N -ffixed-line-length-none
+- -ffree-line-length-N -ffree-line-length-none
+- -fdefault-double-8 -fdefault-integer-8 -fdefault-real-8
+- -fcray-pointer -fopenmp -fno-range-check -fbackslash -fmodule-private
+-
+-_Preprocessing Options_
+- *Note Enable and customize preprocessing: Preprocessing Options.
+- -cpp -dD -dI -dM -dN -dU -fworking-directory
+- -imultilib DIR -iprefix FILE -isysroot DIR
+- -iquote -isystem DIR -nocpp -nostdinc -undef
+- -AQUESTION=ANSWER -A-QUESTION[=ANSWER]
+- -C -CC -DMACRO[=DEFN] -UMACRO -H -P
+-
+-_Error and Warning Options_
+- *Note Options to request or suppress errors and warnings: Error
+- and Warning Options.
+- -fmax-errors=N
+- -fsyntax-only -pedantic -pedantic-errors
+- -Wall -Waliasing -Wampersand -Warray-bounds -Wcharacter-truncation
+- -Wconversion -Wimplicit-interface -Wline-truncation -Wintrinsics-std
+- -Wsurprising -Wno-tabs -Wunderflow -Wunused-parameter -Wintrinsics-shadow
+- -Wno-align-commons
+-
+-_Debugging Options_
+- *Note Options for debugging your program or GNU Fortran: Debugging
+- Options.
+- -fdump-parse-tree -ffpe-trap=LIST
+- -fdump-core -fbacktrace
+-
+-_Directory Options_
+- *Note Options for directory search: Directory Options.
+- -IDIR -JDIR -MDIR
+- -fintrinsic-modules-path DIR
+-
+-_Link Options_
+- *Note Options for influencing the linking step: Link Options.
+- -static-libgfortran
+-
+-_Runtime Options_
+- *Note Options for influencing runtime behavior: Runtime Options.
+- -fconvert=CONVERSION -fno-range-check
+- -frecord-marker=LENGTH -fmax-subrecord-length=LENGTH
+- -fsign-zero
+-
+-_Code Generation Options_
+- *Note Options for code generation conventions: Code Gen Options.
+- -fno-automatic -ff2c -fno-underscoring
+- -fsecond-underscore
+- -fbounds-check -fcheck-array-temporaries -fmax-array-constructor =N
+- -fmax-stack-var-size=N
+- -fpack-derived -frepack-arrays -fshort-enums -fexternal-blas
+- -fblas-matmul-limit=N -frecursive -finit-local-zero
+- -finit-integer=N -finit-real=<ZERO|INF|-INF|NAN>
+- -finit-logical=<TRUE|FALSE> -finit-character=N -fno-align-commons
+-
+-
+-* Menu:
+-
+-* Fortran Dialect Options:: Controlling the variant of Fortran language
+- compiled.
+-* Preprocessing Options:: Enable and customize preprocessing.
+-* Error and Warning Options:: How picky should the compiler be?
+-* Debugging Options:: Symbol tables, measurements, and debugging dumps.
+-* Directory Options:: Where to find module files
+-* Link Options :: Influencing the linking step
+-* Runtime Options:: Influencing runtime behavior
+-* Code Gen Options:: Specifying conventions for function calls, data layout
+- and register usage.
+-
+-
+-File: gfortran.info, Node: Fortran Dialect Options, Next: Preprocessing Options, Prev: Option Summary, Up: Invoking GNU Fortran
+-
+-2.2 Options controlling Fortran dialect
+-=======================================
+-
+-The following options control the details of the Fortran dialect
+-accepted by the compiler:
+-
+-`-ffree-form'
+-
+-`-ffixed-form'
+- Specify the layout used by the source file. The free form layout
+- was introduced in Fortran 90. Fixed form was traditionally used in
+- older Fortran programs. When neither option is specified, the
+- source form is determined by the file extension.
+-
+-`-fall-intrinsics'
+- This option causes all intrinsic procedures (including the
+- GNU-specific extensions) to be accepted. This can be useful with
+- `-std=f95' to force standard-compliance but get access to the full
+- range of intrinsics available with `gfortran'. As a consequence,
+- `-Wintrinsics-std' will be ignored and no user-defined procedure
+- with the same name as any intrinsic will be called except when it
+- is explicitly declared `EXTERNAL'.
+-
+-`-fd-lines-as-code'
+-
+-`-fd-lines-as-comments'
+- Enable special treatment for lines beginning with `d' or `D' in
+- fixed form sources. If the `-fd-lines-as-code' option is given
+- they are treated as if the first column contained a blank. If the
+- `-fd-lines-as-comments' option is given, they are treated as
+- comment lines.
+-
+-`-fdefault-double-8'
+- Set the `DOUBLE PRECISION' type to an 8 byte wide type. If
+- `-fdefault-real-8' is given, `DOUBLE PRECISION' would instead be
+- promoted to 16 bytes if possible, and `-fdefault-double-8' can be
+- used to prevent this. The kind of real constants like `1.d0' will
+- not be changed by `-fdefault-real-8' though, so also
+- `-fdefault-double-8' does not affect it.
+-
+-`-fdefault-integer-8'
+- Set the default integer and logical types to an 8 byte wide type.
+- Do nothing if this is already the default. This option also
+- affects the kind of integer constants like `42'.
+-
+-`-fdefault-real-8'
+- Set the default real type to an 8 byte wide type. Do nothing if
+- this is already the default. This option also affects the kind of
+- non-double real constants like `1.0', and does promote the default
+- width of `DOUBLE PRECISION' to 16 bytes if possible, unless
+- `-fdefault-double-8' is given, too.
+-
+-`-fdollar-ok'
+- Allow `$' as a valid character in a symbol name.
+-
+-`-fbackslash'
+- Change the interpretation of backslashes in string literals from a
+- single backslash character to "C-style" escape characters. The
+- following combinations are expanded `\a', `\b', `\f', `\n', `\r',
+- `\t', `\v', `\\', and `\0' to the ASCII characters alert,
+- backspace, form feed, newline, carriage return, horizontal tab,
+- vertical tab, backslash, and NUL, respectively. Additionally,
+- `\x'NN, `\u'NNNN and `\U'NNNNNNNN (where each N is a hexadecimal
+- digit) are translated into the Unicode characters corresponding to
+- the specified code points. All other combinations of a character
+- preceded by \ are unexpanded.
+-
+-`-fmodule-private'
+- Set the default accessibility of module entities to `PRIVATE'.
+- Use-associated entities will not be accessible unless they are
+- explicitly declared as `PUBLIC'.
+-
+-`-ffixed-line-length-N'
+- Set column after which characters are ignored in typical fixed-form
+- lines in the source file, and through which spaces are assumed (as
+- if padded to that length) after the ends of short fixed-form lines.
+-
+- Popular values for N include 72 (the standard and the default), 80
+- (card image), and 132 (corresponding to "extended-source" options
+- in some popular compilers). N may also be `none', meaning that
+- the entire line is meaningful and that continued character
+- constants never have implicit spaces appended to them to fill out
+- the line. `-ffixed-line-length-0' means the same thing as
+- `-ffixed-line-length-none'.
+-
+-`-ffree-line-length-N'
+- Set column after which characters are ignored in typical free-form
+- lines in the source file. The default value is 132. N may be
+- `none', meaning that the entire line is meaningful.
+- `-ffree-line-length-0' means the same thing as
+- `-ffree-line-length-none'.
+-
+-`-fmax-identifier-length=N'
+- Specify the maximum allowed identifier length. Typical values are
+- 31 (Fortran 95) and 63 (Fortran 2003 and Fortran 2008).
+-
+-`-fimplicit-none'
+- Specify that no implicit typing is allowed, unless overridden by
+- explicit `IMPLICIT' statements. This is the equivalent of adding
+- `implicit none' to the start of every procedure.
+-
+-`-fcray-pointer'
+- Enable the Cray pointer extension, which provides C-like pointer
+- functionality.
+-
+-`-fopenmp'
+- Enable the OpenMP extensions. This includes OpenMP `!$omp'
+- directives in free form and `c$omp', `*$omp' and `!$omp'
+- directives in fixed form, `!$' conditional compilation sentinels
+- in free form and `c$', `*$' and `!$' sentinels in fixed form, and
+- when linking arranges for the OpenMP runtime library to be linked
+- in. The option `-fopenmp' implies `-frecursive'.
+-
+-`-fno-range-check'
+- Disable range checking on results of simplification of constant
+- expressions during compilation. For example, GNU Fortran will give
+- an error at compile time when simplifying `a = 1. / 0'. With this
+- option, no error will be given and `a' will be assigned the value
+- `+Infinity'. If an expression evaluates to a value outside of the
+- relevant range of [`-HUGE()':`HUGE()'], then the expression will
+- be replaced by `-Inf' or `+Inf' as appropriate. Similarly, `DATA
+- i/Z'FFFFFFFF'/' will result in an integer overflow on most
+- systems, but with `-fno-range-check' the value will "wrap around"
+- and `i' will be initialized to -1 instead.
+-
+-`-std=STD'
+- Specify the standard to which the program is expected to conform,
+- which may be one of `f95', `f2003', `f2008', `gnu', or `legacy'.
+- The default value for STD is `gnu', which specifies a superset of
+- the Fortran 95 standard that includes all of the extensions
+- supported by GNU Fortran, although warnings will be given for
+- obsolete extensions not recommended for use in new code. The
+- `legacy' value is equivalent but without the warnings for obsolete
+- extensions, and may be useful for old non-standard programs. The
+- `f95', `f2003' and `f2008' values specify strict conformance to
+- the Fortran 95, Fortran 2003 and Fortran 2008 standards,
+- respectively; errors are given for all extensions beyond the
+- relevant language standard, and warnings are given for the Fortran
+- 77 features that are permitted but obsolescent in later standards.
+-
+-
+-
+-File: gfortran.info, Node: Preprocessing Options, Next: Error and Warning Options, Prev: Fortran Dialect Options, Up: Invoking GNU Fortran
+-
+-2.3 Enable and customize preprocessing
+-======================================
+-
+-Preprocessor related options. See section *note Preprocessing and
+-conditional compilation:: for more detailed information on
+-preprocessing in `gfortran'.
+-
+-`-cpp'
+-
+-`-nocpp'
+- Enable preprocessing. The preprocessor is automatically invoked if
+- the file extension is `.fpp', `.FPP', `.F', `.FOR', `.FTN',
+- `.F90', `.F95', `.F03' or `.F08'. Use this option to manually
+- enable preprocessing of any kind of Fortran file.
+-
+- To disable preprocessing of files with any of the above listed
+- extensions, use the negative form: `-nocpp'.
+-
+- The preprocessor is run in traditional mode, be aware that any
+- restrictions of the file-format, e.g. fixed-form line width, apply
+- for preprocessed output as well.
+-
+-`-dM'
+- Instead of the normal output, generate a list of `'#define''
+- directives for all the macros defined during the execution of the
+- preprocessor, including predefined macros. This gives you a way of
+- finding out what is predefined in your version of the preprocessor.
+- Assuming you have no file `foo.f90', the command
+- touch foo.f90; gfortran -cpp -dM foo.f90
+- will show all the predefined macros.
+-
+-`-dD'
+- Like `-dM' except in two respects: it does not include the
+- predefined macros, and it outputs both the `#define' directives
+- and the result of preprocessing. Both kinds of output go to the
+- standard output file.
+-
+-`-dN'
+- Like `-dD', but emit only the macro names, not their expansions.
+-
+-`-dU'
+- Like `dD' except that only macros that are expanded, or whose
+- definedness is tested in preprocessor directives, are output; the
+- output is delayed until the use or test of the macro; and
+- `'#undef'' directives are also output for macros tested but
+- undefined at the time.
+-
+-`-dI'
+- Output `'#include'' directives in addition to the result of
+- preprocessing.
+-
+-`-fworking-directory'
+- Enable generation of linemarkers in the preprocessor output that
+- will let the compiler know the current working directory at the
+- time of preprocessing. When this option is enabled, the
+- preprocessor will emit, after the initial linemarker, a second
+- linemarker with the current working directory followed by two
+- slashes. GCC will use this directory, when it's present in the
+- preprocessed input, as the directory emitted as the current
+- working directory in some debugging information formats. This
+- option is implicitly enabled if debugging information is enabled,
+- but this can be inhibited with the negated form
+- `-fno-working-directory'. If the `-P' flag is present in the
+- command line, this option has no effect, since no `#line'
+- directives are emitted whatsoever.
+-
+-`-idirafter DIR'
+- Search DIR for include files, but do it after all directories
+- specified with `-I' and the standard system directories have been
+- exhausted. DIR is treated as a system include directory. If dir
+- begins with `=', then the `=' will be replaced by the sysroot
+- prefix; see `--sysroot' and `-isysroot'.
+-
+-`-imultilib DIR'
+- Use DIR as a subdirectory of the directory containing
+- target-specific C++ headers.
+-
+-`-iprefix PREFIX'
+- Specify PREFIX as the prefix for subsequent `-iwithprefix'
+- options. If the PREFIX represents a directory, you should include
+- the final `'/''.
+-
+-`-isysroot DIR'
+- This option is like the `--sysroot' option, but applies only to
+- header files. See the `--sysroot' option for more information.
+-
+-`-iquote DIR'
+- Search DIR only for header files requested with `#include "file"';
+- they are not searched for `#include <file>', before all directories
+- specified by `-I' and before the standard system directories. If
+- DIR begins with `=', then the `=' will be replaced by the sysroot
+- prefix; see `--sysroot' and `-isysroot'.
+-
+-`-isystem DIR'
+- Search DIR for header files, after all directories specified by
+- `-I' but before the standard system directories. Mark it as a
+- system directory, so that it gets the same special treatment as is
+- applied to the standard system directories. If DIR begins with
+- `=', then the `=' will be replaced by the sysroot prefix; see
+- `--sysroot' and `-isysroot'.
+-
+-`-nostdinc'
+- Do not search the standard system directories for header files.
+- Only the directories you have specified with `-I' options (and the
+- directory of the current file, if appropriate) are searched.
+-
+-`-undef'
+- Do not predefine any system-specific or GCC-specific macros. The
+- standard predefined macros remain defined.
+-
+-`-APREDICATE=ANSWER'
+- Make an assertion with the predicate PREDICATE and answer ANSWER.
+- This form is preferred to the older form -A predicate(answer),
+- which is still supported, because it does not use shell special
+- characters.
+-
+-`-A-PREDICATE=ANSWER'
+- Cancel an assertion with the predicate PREDICATE and answer ANSWER.
+-
+-`-C'
+- Do not discard comments. All comments are passed through to the
+- output file, except for comments in processed directives, which
+- are deleted along with the directive.
+-
+- You should be prepared for side effects when using `-C'; it causes
+- the preprocessor to treat comments as tokens in their own right.
+- For example, comments appearing at the start of what would be a
+- directive line have the effect of turning that line into an
+- ordinary source line, since the first token on the line is no
+- longer a `'#''.
+-
+- Warning: this currently handles C-Style comments only. The
+- preprocessor does not yet recognize Fortran-style comments.
+-
+-`-CC'
+- Do not discard comments, including during macro expansion. This is
+- like `-C', except that comments contained within macros are also
+- passed through to the output file where the macro is expanded.
+-
+- In addition to the side-effects of the `-C' option, the `-CC'
+- option causes all C++-style comments inside a macro to be
+- converted to C-style comments. This is to prevent later use of
+- that macro from inadvertently commenting out the remainder of the
+- source line. The `-CC' option is generally used to support lint
+- comments.
+-
+- Warning: this currently handles C- and C++-Style comments only. The
+- preprocessor does not yet recognize Fortran-style comments.
+-
+-`-DNAME'
+- Predefine name as a macro, with definition `1'.
+-
+-`-DNAME=DEFINITION'
+- The contents of DEFINITION are tokenized and processed as if they
+- appeared during translation phase three in a `'#define'' directive.
+- In particular, the definition will be truncated by embedded newline
+- characters.
+-
+- If you are invoking the preprocessor from a shell or shell-like
+- program you may need to use the shell's quoting syntax to protect
+- characters such as spaces that have a meaning in the shell syntax.
+-
+- If you wish to define a function-like macro on the command line,
+- write its argument list with surrounding parentheses before the
+- equals sign (if any). Parentheses are meaningful to most shells,
+- so you will need to quote the option. With sh and csh,
+- `-D'name(args...)=definition'' works.
+-
+- `-D' and `-U' options are processed in the order they are given on
+- the command line. All -imacros file and -include file options are
+- processed after all -D and -U options.
+-
+-`-H'
+- Print the name of each header file used, in addition to other
+- normal activities. Each name is indented to show how deep in the
+- `'#include'' stack it is.
+-
+-`-P'
+- Inhibit generation of linemarkers in the output from the
+- preprocessor. This might be useful when running the preprocessor
+- on something that is not C code, and will be sent to a program
+- which might be confused by the linemarkers.
+-
+-`-UNAME'
+- Cancel any previous definition of NAME, either built in or provided
+- with a `-D' option.
+-
+-
+-File: gfortran.info, Node: Error and Warning Options, Next: Debugging Options, Prev: Preprocessing Options, Up: Invoking GNU Fortran
+-
+-2.4 Options to request or suppress errors and warnings
+-======================================================
+-
+-Errors are diagnostic messages that report that the GNU Fortran compiler
+-cannot compile the relevant piece of source code. The compiler will
+-continue to process the program in an attempt to report further errors
+-to aid in debugging, but will not produce any compiled output.
+-
+- Warnings are diagnostic messages that report constructions which are
+-not inherently erroneous but which are risky or suggest there is likely
+-to be a bug in the program. Unless `-Werror' is specified, they do not
+-prevent compilation of the program.
+-
+- You can request many specific warnings with options beginning `-W',
+-for example `-Wimplicit' to request warnings on implicit declarations.
+-Each of these specific warning options also has a negative form
+-beginning `-Wno-' to turn off warnings; for example, `-Wno-implicit'.
+-This manual lists only one of the two forms, whichever is not the
+-default.
+-
+- These options control the amount and kinds of errors and warnings
+-produced by GNU Fortran:
+-
+-`-fmax-errors=N'
+- Limits the maximum number of error messages to N, at which point
+- GNU Fortran bails out rather than attempting to continue
+- processing the source code. If N is 0, there is no limit on the
+- number of error messages produced.
+-
+-`-fsyntax-only'
+- Check the code for syntax errors, but don't actually compile it.
+- This will generate module files for each module present in the
+- code, but no other output file.
+-
+-`-pedantic'
+- Issue warnings for uses of extensions to Fortran 95. `-pedantic'
+- also applies to C-language constructs where they occur in GNU
+- Fortran source files, such as use of `\e' in a character constant
+- within a directive like `#include'.
+-
+- Valid Fortran 95 programs should compile properly with or without
+- this option. However, without this option, certain GNU extensions
+- and traditional Fortran features are supported as well. With this
+- option, many of them are rejected.
+-
+- Some users try to use `-pedantic' to check programs for
+- conformance. They soon find that it does not do quite what they
+- want--it finds some nonstandard practices, but not all. However,
+- improvements to GNU Fortran in this area are welcome.
+-
+- This should be used in conjunction with `-std=f95', `-std=f2003'
+- or `-std=f2008'.
+-
+-`-pedantic-errors'
+- Like `-pedantic', except that errors are produced rather than
+- warnings.
+-
+-`-Wall'
+- Enables commonly used warning options pertaining to usage that we
+- recommend avoiding and that we believe are easy to avoid. This
+- currently includes `-Waliasing', `-Wampersand', `-Wsurprising',
+- `-Wintrinsics-std', `-Wno-tabs', `-Wintrinsic-shadow' and
+- `-Wline-truncation'.
+-
+-`-Waliasing'
+- Warn about possible aliasing of dummy arguments. Specifically, it
+- warns if the same actual argument is associated with a dummy
+- argument with `INTENT(IN)' and a dummy argument with `INTENT(OUT)'
+- in a call with an explicit interface.
+-
+- The following example will trigger the warning.
+- interface
+- subroutine bar(a,b)
+- integer, intent(in) :: a
+- integer, intent(out) :: b
+- end subroutine
+- end interface
+- integer :: a
+-
+- call bar(a,a)
+-
+-`-Wampersand'
+- Warn about missing ampersand in continued character constants. The
+- warning is given with `-Wampersand', `-pedantic', `-std=f95',
+- `-std=f2003' and `-std=f2008'. Note: With no ampersand given in a
+- continued character constant, GNU Fortran assumes continuation at
+- the first non-comment, non-whitespace character after the ampersand
+- that initiated the continuation.
+-
+-`-Warray-temporaries'
+- Warn about array temporaries generated by the compiler. The
+- information generated by this warning is sometimes useful in
+- optimization, in order to avoid such temporaries.
+-
+-`-Wcharacter-truncation'
+- Warn when a character assignment will truncate the assigned string.
+-
+-`-Wline-truncation'
+- Warn when a source code line will be truncated.
+-
+-`-Wconversion'
+- Warn about implicit conversions between different types.
+-
+-`-Wimplicit-interface'
+- Warn if a procedure is called without an explicit interface. Note
+- this only checks that an explicit interface is present. It does
+- not check that the declared interfaces are consistent across
+- program units.
+-
+-`-Wintrinsics-std'
+- Warn if `gfortran' finds a procedure named like an intrinsic not
+- available in the currently selected standard (with `-std') and
+- treats it as `EXTERNAL' procedure because of this.
+- `-fall-intrinsics' can be used to never trigger this behaviour and
+- always link to the intrinsic regardless of the selected standard.
+-
+-`-Wsurprising'
+- Produce a warning when "suspicious" code constructs are
+- encountered. While technically legal these usually indicate that
+- an error has been made.
+-
+- This currently produces a warning under the following
+- circumstances:
+-
+- * An INTEGER SELECT construct has a CASE that can never be
+- matched as its lower value is greater than its upper value.
+-
+- * A LOGICAL SELECT construct has three CASE statements.
+-
+- * A TRANSFER specifies a source that is shorter than the
+- destination.
+-
+- * The type of a function result is declared more than once with
+- the same type. If `-pedantic' or standard-conforming mode is
+- enabled, this is an error.
+-
+-`-Wtabs'
+- By default, tabs are accepted as whitespace, but tabs are not
+- members of the Fortran Character Set. For continuation lines, a
+- tab followed by a digit between 1 and 9 is supported. `-Wno-tabs'
+- will cause a warning to be issued if a tab is encountered. Note,
+- `-Wno-tabs' is active for `-pedantic', `-std=f95', `-std=f2003',
+- `-std=f2008' and `-Wall'.
+-
+-`-Wunderflow'
+- Produce a warning when numerical constant expressions are
+- encountered, which yield an UNDERFLOW during compilation.
+-
+-`-Wintrinsic-shadow'
+- Warn if a user-defined procedure or module procedure has the same
+- name as an intrinsic; in this case, an explicit interface or
+- `EXTERNAL' or `INTRINSIC' declaration might be needed to get calls
+- later resolved to the desired intrinsic/procedure.
+-
+-`-Wunused-parameter'
+- Contrary to `gcc''s meaning of `-Wunused-parameter', `gfortran''s
+- implementation of this option does not warn about unused dummy
+- arguments, but about unused `PARAMETER' values.
+- `-Wunused-parameter' is not included in `-Wall' but is implied by
+- `-Wall -Wextra'.
+-
+-`-Walign-commons'
+- By default, `gfortran' warns about any occasion of variables being
+- padded for proper alignment inside a COMMON block. This warning
+- can be turned off via `-Wno-align-commons'. See also
+- `-falign-commons'.
+-
+-`-Werror'
+- Turns all warnings into errors.
+-
+- *Note Options to Request or Suppress Errors and Warnings: (gcc)Error
+-and Warning Options, for information on more options offered by the GBE
+-shared by `gfortran', `gcc' and other GNU compilers.
+-
+- Some of these have no effect when compiling programs written in
+-Fortran.
+-
+-
+-File: gfortran.info, Node: Debugging Options, Next: Directory Options, Prev: Error and Warning Options, Up: Invoking GNU Fortran
+-
+-2.5 Options for debugging your program or GNU Fortran
+-=====================================================
+-
+-GNU Fortran has various special options that are used for debugging
+-either your program or the GNU Fortran compiler.
+-
+-`-fdump-parse-tree'
+- Output the internal parse tree before starting code generation.
+- Only really useful for debugging the GNU Fortran compiler itself.
+-
+-`-ffpe-trap=LIST'
+- Specify a list of IEEE exceptions when a Floating Point Exception
+- (FPE) should be raised. On most systems, this will result in a
+- SIGFPE signal being sent and the program being interrupted,
+- producing a core file useful for debugging. LIST is a (possibly
+- empty) comma-separated list of the following IEEE exceptions:
+- `invalid' (invalid floating point operation, such as
+- `SQRT(-1.0)'), `zero' (division by zero), `overflow' (overflow in
+- a floating point operation), `underflow' (underflow in a floating
+- point operation), `precision' (loss of precision during operation)
+- and `denormal' (operation produced a denormal value).
+-
+- Some of the routines in the Fortran runtime library, like
+- `CPU_TIME', are likely to trigger floating point exceptions when
+- `ffpe-trap=precision' is used. For this reason, the use of
+- `ffpe-trap=precision' is not recommended.
+-
+-`-fbacktrace'
+- Specify that, when a runtime error is encountered or a deadly
+- signal is emitted (segmentation fault, illegal instruction, bus
+- error or floating-point exception), the Fortran runtime library
+- should output a backtrace of the error. This option only has
+- influence for compilation of the Fortran main program.
+-
+-`-fdump-core'
+- Request that a core-dump file is written to disk when a runtime
+- error is encountered on systems that support core dumps. This
+- option is only effective for the compilation of the Fortran main
+- program.
+-
+- *Note Options for Debugging Your Program or GCC: (gcc)Debugging
+-Options, for more information on debugging options.
+-
+-
+-File: gfortran.info, Node: Directory Options, Next: Link Options, Prev: Debugging Options, Up: Invoking GNU Fortran
+-
+-2.6 Options for directory search
+-================================
+-
+-These options affect how GNU Fortran searches for files specified by
+-the `INCLUDE' directive and where it searches for previously compiled
+-modules.
+-
+- It also affects the search paths used by `cpp' when used to
+-preprocess Fortran source.
+-
+-`-IDIR'
+- These affect interpretation of the `INCLUDE' directive (as well as
+- of the `#include' directive of the `cpp' preprocessor).
+-
+- Also note that the general behavior of `-I' and `INCLUDE' is
+- pretty much the same as of `-I' with `#include' in the `cpp'
+- preprocessor, with regard to looking for `header.gcc' files and
+- other such things.
+-
+- This path is also used to search for `.mod' files when previously
+- compiled modules are required by a `USE' statement.
+-
+- *Note Options for Directory Search: (gcc)Directory Options, for
+- information on the `-I' option.
+-
+-`-JDIR'
+-
+-`-MDIR'
+- This option specifies where to put `.mod' files for compiled
+- modules. It is also added to the list of directories to searched
+- by an `USE' statement.
+-
+- The default is the current directory.
+-
+- `-M' is deprecated to avoid conflicts with existing GCC options.
+-
+-`-fintrinsic-modules-path DIR'
+- This option specifies the location of pre-compiled intrinsic
+- modules, if they are not in the default location expected by the
+- compiler.
+-
+-
+-File: gfortran.info, Node: Link Options, Next: Runtime Options, Prev: Directory Options, Up: Invoking GNU Fortran
+-
+-2.7 Influencing the linking step
+-================================
+-
+-These options come into play when the compiler links object files into
+-an executable output file. They are meaningless if the compiler is not
+-doing a link step.
+-
+-`-static-libgfortran'
+- On systems that provide `libgfortran' as a shared and a static
+- library, this option forces the use of the static version. If no
+- shared version of `libgfortran' was built when the compiler was
+- configured, this option has no effect.
+-
+-
+-File: gfortran.info, Node: Runtime Options, Next: Code Gen Options, Prev: Link Options, Up: Invoking GNU Fortran
+-
+-2.8 Influencing runtime behavior
+-================================
+-
+-These options affect the runtime behavior of programs compiled with GNU
+-Fortran.
+-`-fconvert=CONVERSION'
+- Specify the representation of data for unformatted files. Valid
+- values for conversion are: `native', the default; `swap', swap
+- between big- and little-endian; `big-endian', use big-endian
+- representation for unformatted files; `little-endian', use
+- little-endian representation for unformatted files.
+-
+- _This option has an effect only when used in the main program.
+- The `CONVERT' specifier and the GFORTRAN_CONVERT_UNIT environment
+- variable override the default specified by `-fconvert'._
+-
+-`-fno-range-check'
+- Disable range checking of input values during integer `READ'
+- operations. For example, GNU Fortran will give an error if an
+- input value is outside of the relevant range of
+- [`-HUGE()':`HUGE()']. In other words, with `INTEGER (kind=4) :: i'
+- , attempting to read -2147483648 will give an error unless
+- `-fno-range-check' is given.
+-
+-`-frecord-marker=LENGTH'
+- Specify the length of record markers for unformatted files. Valid
+- values for LENGTH are 4 and 8. Default is 4. _This is different
+- from previous versions of `gfortran'_, which specified a default
+- record marker length of 8 on most systems. If you want to read or
+- write files compatible with earlier versions of `gfortran', use
+- `-frecord-marker=8'.
+-
+-`-fmax-subrecord-length=LENGTH'
+- Specify the maximum length for a subrecord. The maximum permitted
+- value for length is 2147483639, which is also the default. Only
+- really useful for use by the gfortran testsuite.
+-
+-`-fsign-zero'
+- When writing zero values, show the negative sign if the sign bit
+- is set. `fno-sign-zero' does not print the negative sign of zero
+- values for compatibility with F77. Default behavior is to show
+- the negative sign.
+-
+-
+-File: gfortran.info, Node: Code Gen Options, Next: Environment Variables, Prev: Runtime Options, Up: Invoking GNU Fortran
+-
+-2.9 Options for code generation conventions
+-===========================================
+-
+-These machine-independent options control the interface conventions
+-used in code generation.
+-
+- Most of them have both positive and negative forms; the negative form
+-of `-ffoo' would be `-fno-foo'. In the table below, only one of the
+-forms is listed--the one which is not the default. You can figure out
+-the other form by either removing `no-' or adding it.
+-
+-`-fno-automatic'
+- Treat each program unit (except those marked as RECURSIVE) as if
+- the `SAVE' statement were specified for every local variable and
+- array referenced in it. Does not affect common blocks. (Some
+- Fortran compilers provide this option under the name `-static' or
+- `-save'.) The default, which is `-fautomatic', uses the stack for
+- local variables smaller than the value given by
+- `-fmax-stack-var-size'. Use the option `-frecursive' to use no
+- static memory.
+-
+-`-ff2c'
+- Generate code designed to be compatible with code generated by
+- `g77' and `f2c'.
+-
+- The calling conventions used by `g77' (originally implemented in
+- `f2c') require functions that return type default `REAL' to
+- actually return the C type `double', and functions that return
+- type `COMPLEX' to return the values via an extra argument in the
+- calling sequence that points to where to store the return value.
+- Under the default GNU calling conventions, such functions simply
+- return their results as they would in GNU C--default `REAL'
+- functions return the C type `float', and `COMPLEX' functions
+- return the GNU C type `complex'. Additionally, this option
+- implies the `-fsecond-underscore' option, unless
+- `-fno-second-underscore' is explicitly requested.
+-
+- This does not affect the generation of code that interfaces with
+- the `libgfortran' library.
+-
+- _Caution:_ It is not a good idea to mix Fortran code compiled with
+- `-ff2c' with code compiled with the default `-fno-f2c' calling
+- conventions as, calling `COMPLEX' or default `REAL' functions
+- between program parts which were compiled with different calling
+- conventions will break at execution time.
+-
+- _Caution:_ This will break code which passes intrinsic functions
+- of type default `REAL' or `COMPLEX' as actual arguments, as the
+- library implementations use the `-fno-f2c' calling conventions.
+-
+-`-fno-underscoring'
+- Do not transform names of entities specified in the Fortran source
+- file by appending underscores to them.
+-
+- With `-funderscoring' in effect, GNU Fortran appends one
+- underscore to external names with no underscores. This is done to
+- ensure compatibility with code produced by many UNIX Fortran
+- compilers.
+-
+- _Caution_: The default behavior of GNU Fortran is incompatible
+- with `f2c' and `g77', please use the `-ff2c' option if you want
+- object files compiled with GNU Fortran to be compatible with
+- object code created with these tools.
+-
+- Use of `-fno-underscoring' is not recommended unless you are
+- experimenting with issues such as integration of GNU Fortran into
+- existing system environments (vis-a`-vis existing libraries, tools,
+- and so on).
+-
+- For example, with `-funderscoring', and assuming other defaults
+- like `-fcase-lower' and that `j()' and `max_count()' are external
+- functions while `my_var' and `lvar' are local variables, a
+- statement like
+- I = J() + MAX_COUNT (MY_VAR, LVAR)
+- is implemented as something akin to:
+- i = j_() + max_count__(&my_var__, &lvar);
+-
+- With `-fno-underscoring', the same statement is implemented as:
+-
+- i = j() + max_count(&my_var, &lvar);
+-
+- Use of `-fno-underscoring' allows direct specification of
+- user-defined names while debugging and when interfacing GNU Fortran
+- code with other languages.
+-
+- Note that just because the names match does _not_ mean that the
+- interface implemented by GNU Fortran for an external name matches
+- the interface implemented by some other language for that same
+- name. That is, getting code produced by GNU Fortran to link to
+- code produced by some other compiler using this or any other
+- method can be only a small part of the overall solution--getting
+- the code generated by both compilers to agree on issues other than
+- naming can require significant effort, and, unlike naming
+- disagreements, linkers normally cannot detect disagreements in
+- these other areas.
+-
+- Also, note that with `-fno-underscoring', the lack of appended
+- underscores introduces the very real possibility that a
+- user-defined external name will conflict with a name in a system
+- library, which could make finding unresolved-reference bugs quite
+- difficult in some cases--they might occur at program run time, and
+- show up only as buggy behavior at run time.
+-
+- In future versions of GNU Fortran we hope to improve naming and
+- linking issues so that debugging always involves using the names
+- as they appear in the source, even if the names as seen by the
+- linker are mangled to prevent accidental linking between
+- procedures with incompatible interfaces.
+-
+-`-fsecond-underscore'
+- By default, GNU Fortran appends an underscore to external names.
+- If this option is used GNU Fortran appends two underscores to
+- names with underscores and one underscore to external names with
+- no underscores. GNU Fortran also appends two underscores to
+- internal names with underscores to avoid naming collisions with
+- external names.
+-
+- This option has no effect if `-fno-underscoring' is in effect. It
+- is implied by the `-ff2c' option.
+-
+- Otherwise, with this option, an external name such as `MAX_COUNT'
+- is implemented as a reference to the link-time external symbol
+- `max_count__', instead of `max_count_'. This is required for
+- compatibility with `g77' and `f2c', and is implied by use of the
+- `-ff2c' option.
+-
+-`-fbounds-check'
+- Enable generation of run-time checks for array subscripts and
+- against the declared minimum and maximum values. It also checks
+- array indices for assumed and deferred shape arrays against the
+- actual allocated bounds and ensures that all string lengths are
+- equal for character array constructors without an explicit
+- typespec.
+-
+- Some checks require that `-fbounds-check' is set for the
+- compilation of the main program.
+-
+- Note: In the future this may also include other forms of checking,
+- e.g., checking substring references.
+-
+-`fcheck-array-temporaries'
+- Warns at run time when for passing an actual argument a temporary
+- array had to be generated. The information generated by this
+- warning is sometimes useful in optimization, in order to avoid
+- such temporaries.
+-
+- Note: The warning is only printed once per location.
+-
+-`-fmax-array-constructor=N'
+- This option can be used to increase the upper limit permitted in
+- array constructors. The code below requires this option to expand
+- the array at compile time.
+-
+- `program test'
+- `implicit none'
+- `integer j'
+- `integer, parameter :: n = 100000'
+- `integer, parameter :: i(n) = (/ (2*j, j = 1, n) /)'
+- `print '(10(I0,1X))', i'
+- `end program test'
+-
+- _Caution: This option can lead to long compile times and
+- excessively large object files._
+-
+- The default value for N is 65535.
+-
+-`-fmax-stack-var-size=N'
+- This option specifies the size in bytes of the largest array that
+- will be put on the stack; if the size is exceeded static memory is
+- used (except in procedures marked as RECURSIVE). Use the option
+- `-frecursive' to allow for recursive procedures which do not have
+- a RECURSIVE attribute or for parallel programs. Use
+- `-fno-automatic' to never use the stack.
+-
+- This option currently only affects local arrays declared with
+- constant bounds, and may not apply to all character variables.
+- Future versions of GNU Fortran may improve this behavior.
+-
+- The default value for N is 32768.
+-
+-`-fpack-derived'
+- This option tells GNU Fortran to pack derived type members as
+- closely as possible. Code compiled with this option is likely to
+- be incompatible with code compiled without this option, and may
+- execute slower.
+-
+-`-frepack-arrays'
+- In some circumstances GNU Fortran may pass assumed shape array
+- sections via a descriptor describing a noncontiguous area of
+- memory. This option adds code to the function prologue to repack
+- the data into a contiguous block at runtime.
+-
+- This should result in faster accesses to the array. However it
+- can introduce significant overhead to the function call,
+- especially when the passed data is noncontiguous.
+-
+-`-fshort-enums'
+- This option is provided for interoperability with C code that was
+- compiled with the `-fshort-enums' option. It will make GNU
+- Fortran choose the smallest `INTEGER' kind a given enumerator set
+- will fit in, and give all its enumerators this kind.
+-
+-`-fexternal-blas'
+- This option will make `gfortran' generate calls to BLAS functions
+- for some matrix operations like `MATMUL', instead of using our own
+- algorithms, if the size of the matrices involved is larger than a
+- given limit (see `-fblas-matmul-limit'). This may be profitable
+- if an optimized vendor BLAS library is available. The BLAS
+- library will have to be specified at link time.
+-
+-`-fblas-matmul-limit=N'
+- Only significant when `-fexternal-blas' is in effect. Matrix
+- multiplication of matrices with size larger than (or equal to) N
+- will be performed by calls to BLAS functions, while others will be
+- handled by `gfortran' internal algorithms. If the matrices
+- involved are not square, the size comparison is performed using the
+- geometric mean of the dimensions of the argument and result
+- matrices.
+-
+- The default value for N is 30.
+-
+-`-frecursive'
+- Allow indirect recursion by forcing all local arrays to be
+- allocated on the stack. This flag cannot be used together with
+- `-fmax-stack-var-size=' or `-fno-automatic'.
+-
+-`-finit-local-zero'
+-
+-`-finit-integer=N'
+-
+-`-finit-real=<ZERO|INF|-INF|NAN>'
+-
+-`-finit-logical=<TRUE|FALSE>'
+-
+-`-finit-character=N'
+- The `-finit-local-zero' option instructs the compiler to
+- initialize local `INTEGER', `REAL', and `COMPLEX' variables to
+- zero, `LOGICAL' variables to false, and `CHARACTER' variables to a
+- string of null bytes. Finer-grained initialization options are
+- provided by the `-finit-integer=N',
+- `-finit-real=<ZERO|INF|-INF|NAN>' (which also initializes the real
+- and imaginary parts of local `COMPLEX' variables),
+- `-finit-logical=<TRUE|FALSE>', and `-finit-character=N' (where N
+- is an ASCII character value) options. These options do not
+- initialize components of derived type variables, nor do they
+- initialize variables that appear in an `EQUIVALENCE' statement.
+- (This limitation may be removed in future releases).
+-
+- Note that the `-finit-real=nan' option initializes `REAL' and
+- `COMPLEX' variables with a quiet NaN.
+-
+-`-falign-commons'
+- By default, `gfortran' enforces proper alignment of all variables
+- in a COMMON block by padding them as needed. On certain platforms
+- this is mandatory, on others it increases performance. If a COMMON
+- block is not declared with consistent data types everywhere, this
+- padding can cause trouble, and `-fno-align-commons ' can be used
+- to disable automatic alignment. The same form of this option
+- should be used for all files that share a COMMON block. To avoid
+- potential alignment issues in COMMON blocks, it is recommended to
+- order objects from largests to smallest.
+-
+- *Note Options for Code Generation Conventions: (gcc)Code Gen
+-Options, for information on more options offered by the GBE shared by
+-`gfortran', `gcc', and other GNU compilers.
+-
+-
+-File: gfortran.info, Node: Environment Variables, Prev: Code Gen Options, Up: Invoking GNU Fortran
+-
+-2.10 Environment variables affecting `gfortran'
+-===============================================
+-
+-The `gfortran' compiler currently does not make use of any environment
+-variables to control its operation above and beyond those that affect
+-the operation of `gcc'.
+-
+- *Note Environment Variables Affecting GCC: (gcc)Environment
+-Variables, for information on environment variables.
+-
+- *Note Runtime::, for environment variables that affect the run-time
+-behavior of programs compiled with GNU Fortran.
+-
+-
+-File: gfortran.info, Node: Runtime, Next: Fortran 2003 and 2008 status, Prev: Invoking GNU Fortran, Up: Top
+-
+-3 Runtime: Influencing runtime behavior with environment variables
+-*******************************************************************
+-
+-The behavior of the `gfortran' can be influenced by environment
+-variables.
+-
+- Malformed environment variables are silently ignored.
+-
+-* Menu:
+-
+-* GFORTRAN_STDIN_UNIT:: Unit number for standard input
+-* GFORTRAN_STDOUT_UNIT:: Unit number for standard output
+-* GFORTRAN_STDERR_UNIT:: Unit number for standard error
+-* GFORTRAN_USE_STDERR:: Send library output to standard error
+-* GFORTRAN_TMPDIR:: Directory for scratch files
+-* GFORTRAN_UNBUFFERED_ALL:: Don't buffer I/O for all units.
+-* GFORTRAN_UNBUFFERED_PRECONNECTED:: Don't buffer I/O for preconnected units.
+-* GFORTRAN_SHOW_LOCUS:: Show location for runtime errors
+-* GFORTRAN_OPTIONAL_PLUS:: Print leading + where permitted
+-* GFORTRAN_DEFAULT_RECL:: Default record length for new files
+-* GFORTRAN_LIST_SEPARATOR:: Separator for list output
+-* GFORTRAN_CONVERT_UNIT:: Set endianness for unformatted I/O
+-* GFORTRAN_ERROR_DUMPCORE:: Dump core on run-time errors
+-* GFORTRAN_ERROR_BACKTRACE:: Show backtrace on run-time errors
+-
+-
+-File: gfortran.info, Node: GFORTRAN_STDIN_UNIT, Next: GFORTRAN_STDOUT_UNIT, Up: Runtime
+-
+-3.1 `GFORTRAN_STDIN_UNIT'--Unit number for standard input
+-=========================================================
+-
+-This environment variable can be used to select the unit number
+-preconnected to standard input. This must be a positive integer. The
+-default value is 5.
+-
+-
+-File: gfortran.info, Node: GFORTRAN_STDOUT_UNIT, Next: GFORTRAN_STDERR_UNIT, Prev: GFORTRAN_STDIN_UNIT, Up: Runtime
+-
+-3.2 `GFORTRAN_STDOUT_UNIT'--Unit number for standard output
+-===========================================================
+-
+-This environment variable can be used to select the unit number
+-preconnected to standard output. This must be a positive integer. The
+-default value is 6.
+-
+-
+-File: gfortran.info, Node: GFORTRAN_STDERR_UNIT, Next: GFORTRAN_USE_STDERR, Prev: GFORTRAN_STDOUT_UNIT, Up: Runtime
+-
+-3.3 `GFORTRAN_STDERR_UNIT'--Unit number for standard error
+-==========================================================
+-
+-This environment variable can be used to select the unit number
+-preconnected to standard error. This must be a positive integer. The
+-default value is 0.
+-
+-
+-File: gfortran.info, Node: GFORTRAN_USE_STDERR, Next: GFORTRAN_TMPDIR, Prev: GFORTRAN_STDERR_UNIT, Up: Runtime
+-
+-3.4 `GFORTRAN_USE_STDERR'--Send library output to standard error
+-================================================================
+-
+-This environment variable controls where library output is sent. If
+-the first letter is `y', `Y' or `1', standard error is used. If the
+-first letter is `n', `N' or `0', standard output is used.
+-
+-
+-File: gfortran.info, Node: GFORTRAN_TMPDIR, Next: GFORTRAN_UNBUFFERED_ALL, Prev: GFORTRAN_USE_STDERR, Up: Runtime
+-
+-3.5 `GFORTRAN_TMPDIR'--Directory for scratch files
+-==================================================
+-
+-This environment variable controls where scratch files are created. If
+-this environment variable is missing, GNU Fortran searches for the
+-environment variable `TMP'. If this is also missing, the default is
+-`/tmp'.
+-
+-
+-File: gfortran.info, Node: GFORTRAN_UNBUFFERED_ALL, Next: GFORTRAN_UNBUFFERED_PRECONNECTED, Prev: GFORTRAN_TMPDIR, Up: Runtime
+-
+-3.6 `GFORTRAN_UNBUFFERED_ALL'--Don't buffer I/O on all units
+-============================================================
+-
+-This environment variable controls whether all I/O is unbuffered. If
+-the first letter is `y', `Y' or `1', all I/O is unbuffered. This will
+-slow down small sequential reads and writes. If the first letter is
+-`n', `N' or `0', I/O is buffered. This is the default.
+-
+-
+-File: gfortran.info, Node: GFORTRAN_UNBUFFERED_PRECONNECTED, Next: GFORTRAN_SHOW_LOCUS, Prev: GFORTRAN_UNBUFFERED_ALL, Up: Runtime
+-
+-3.7 `GFORTRAN_UNBUFFERED_PRECONNECTED'--Don't buffer I/O on preconnected units
+-==============================================================================
+-
+-The environment variable named `GFORTRAN_UNBUFFERED_PRECONNECTED'
+-controls whether I/O on a preconnected unit (i.e. STDOUT or STDERR) is
+-unbuffered. If the first letter is `y', `Y' or `1', I/O is unbuffered.
+-This will slow down small sequential reads and writes. If the first
+-letter is `n', `N' or `0', I/O is buffered. This is the default.
+-
+-
+-File: gfortran.info, Node: GFORTRAN_SHOW_LOCUS, Next: GFORTRAN_OPTIONAL_PLUS, Prev: GFORTRAN_UNBUFFERED_PRECONNECTED, Up: Runtime
+-
+-3.8 `GFORTRAN_SHOW_LOCUS'--Show location for runtime errors
+-===========================================================
+-
+-If the first letter is `y', `Y' or `1', filename and line numbers for
+-runtime errors are printed. If the first letter is `n', `N' or `0',
+-don't print filename and line numbers for runtime errors. The default
+-is to print the location.
+-
+-
+-File: gfortran.info, Node: GFORTRAN_OPTIONAL_PLUS, Next: GFORTRAN_DEFAULT_RECL, Prev: GFORTRAN_SHOW_LOCUS, Up: Runtime
+-
+-3.9 `GFORTRAN_OPTIONAL_PLUS'--Print leading + where permitted
+-=============================================================
+-
+-If the first letter is `y', `Y' or `1', a plus sign is printed where
+-permitted by the Fortran standard. If the first letter is `n', `N' or
+-`0', a plus sign is not printed in most cases. Default is not to print
+-plus signs.
+-
+-
+-File: gfortran.info, Node: GFORTRAN_DEFAULT_RECL, Next: GFORTRAN_LIST_SEPARATOR, Prev: GFORTRAN_OPTIONAL_PLUS, Up: Runtime
+-
+-3.10 `GFORTRAN_DEFAULT_RECL'--Default record length for new files
+-=================================================================
+-
+-This environment variable specifies the default record length, in
+-bytes, for files which are opened without a `RECL' tag in the `OPEN'
+-statement. This must be a positive integer. The default value is
+-1073741824 bytes (1 GB).
+-
+-
+-File: gfortran.info, Node: GFORTRAN_LIST_SEPARATOR, Next: GFORTRAN_CONVERT_UNIT, Prev: GFORTRAN_DEFAULT_RECL, Up: Runtime
+-
+-3.11 `GFORTRAN_LIST_SEPARATOR'--Separator for list output
+-=========================================================
+-
+-This environment variable specifies the separator when writing
+-list-directed output. It may contain any number of spaces and at most
+-one comma. If you specify this on the command line, be sure to quote
+-spaces, as in
+- $ GFORTRAN_LIST_SEPARATOR=' , ' ./a.out
+- when `a.out' is the compiled Fortran program that you want to run.
+-Default is a single space.
+-
+-
+-File: gfortran.info, Node: GFORTRAN_CONVERT_UNIT, Next: GFORTRAN_ERROR_DUMPCORE, Prev: GFORTRAN_LIST_SEPARATOR, Up: Runtime
+-
+-3.12 `GFORTRAN_CONVERT_UNIT'--Set endianness for unformatted I/O
+-================================================================
+-
+-By setting the `GFORTRAN_CONVERT_UNIT' variable, it is possible to
+-change the representation of data for unformatted files. The syntax
+-for the `GFORTRAN_CONVERT_UNIT' variable is:
+- GFORTRAN_CONVERT_UNIT: mode | mode ';' exception | exception ;
+- mode: 'native' | 'swap' | 'big_endian' | 'little_endian' ;
+- exception: mode ':' unit_list | unit_list ;
+- unit_list: unit_spec | unit_list unit_spec ;
+- unit_spec: INTEGER | INTEGER '-' INTEGER ;
+- The variable consists of an optional default mode, followed by a
+-list of optional exceptions, which are separated by semicolons from the
+-preceding default and each other. Each exception consists of a format
+-and a comma-separated list of units. Valid values for the modes are
+-the same as for the `CONVERT' specifier:
+-
+- `NATIVE' Use the native format. This is the default.
+-
+- `SWAP' Swap between little- and big-endian.
+-
+- `LITTLE_ENDIAN' Use the little-endian format for unformatted files.
+-
+- `BIG_ENDIAN' Use the big-endian format for unformatted files.
+- A missing mode for an exception is taken to mean `BIG_ENDIAN'.
+-Examples of values for `GFORTRAN_CONVERT_UNIT' are:
+- `'big_endian'' Do all unformatted I/O in big_endian mode.
+-
+- `'little_endian;native:10-20,25'' Do all unformatted I/O in
+- little_endian mode, except for units 10 to 20 and 25, which are in
+- native format.
+-
+- `'10-20'' Units 10 to 20 are big-endian, the rest is native.
+-
+- Setting the environment variables should be done on the command line
+-or via the `export' command for `sh'-compatible shells and via `setenv'
+-for `csh'-compatible shells.
+-
+- Example for `sh':
+- $ gfortran foo.f90
+- $ GFORTRAN_CONVERT_UNIT='big_endian;native:10-20' ./a.out
+-
+- Example code for `csh':
+- % gfortran foo.f90
+- % setenv GFORTRAN_CONVERT_UNIT 'big_endian;native:10-20'
+- % ./a.out
+-
+- Using anything but the native representation for unformatted data
+-carries a significant speed overhead. If speed in this area matters to
+-you, it is best if you use this only for data that needs to be portable.
+-
+- *Note CONVERT specifier::, for an alternative way to specify the
+-data representation for unformatted files. *Note Runtime Options::, for
+-setting a default data representation for the whole program. The
+-`CONVERT' specifier overrides the `-fconvert' compile options.
+-
+- _Note that the values specified via the GFORTRAN_CONVERT_UNIT
+-environment variable will override the CONVERT specifier in the open
+-statement_. This is to give control over data formats to users who do
+-not have the source code of their program available.
+-
+-
+-File: gfortran.info, Node: GFORTRAN_ERROR_DUMPCORE, Next: GFORTRAN_ERROR_BACKTRACE, Prev: GFORTRAN_CONVERT_UNIT, Up: Runtime
+-
+-3.13 `GFORTRAN_ERROR_DUMPCORE'--Dump core on run-time errors
+-============================================================
+-
+-If the `GFORTRAN_ERROR_DUMPCORE' variable is set to `y', `Y' or `1'
+-(only the first letter is relevant) then library run-time errors cause
+-core dumps. To disable the core dumps, set the variable to `n', `N',
+-`0'. Default is not to core dump unless the `-fdump-core' compile option
+-was used.
+-
+-
+-File: gfortran.info, Node: GFORTRAN_ERROR_BACKTRACE, Prev: GFORTRAN_ERROR_DUMPCORE, Up: Runtime
+-
+-3.14 `GFORTRAN_ERROR_BACKTRACE'--Show backtrace on run-time errors
+-==================================================================
+-
+-If the `GFORTRAN_ERROR_BACKTRACE' variable is set to `y', `Y' or `1'
+-(only the first letter is relevant) then a backtrace is printed when a
+-run-time error occurs. To disable the backtracing, set the variable to
+-`n', `N', `0'. Default is not to print a backtrace unless the
+-`-fbacktrace' compile option was used.
+-
+-
+-File: gfortran.info, Node: Fortran 2003 and 2008 status, Next: Compiler Characteristics, Prev: Runtime, Up: Top
+-
+-4 Fortran 2003 and 2008 Status
+-******************************
+-
+-* Menu:
+-
+-* Fortran 2003 status::
+-* Fortran 2008 status::
+-
+-
+-File: gfortran.info, Node: Fortran 2003 status, Next: Fortran 2008 status, Up: Fortran 2003 and 2008 status
+-
+-4.1 Fortran 2003 status
+-=======================
+-
+-Although GNU Fortran focuses on implementing the Fortran 95 standard
+-for the time being, a few Fortran 2003 features are currently available.
+-
+- * Intrinsics `command_argument_count', `get_command',
+- `get_command_argument', `get_environment_variable', and
+- `move_alloc'.
+-
+- * Array constructors using square brackets. That is, `[...]' rather
+- than `(/.../)'.
+-
+- * `FLUSH' statement.
+-
+- * `IOMSG=' specifier for I/O statements.
+-
+- * Support for the declaration of enumeration constants via the
+- `ENUM' and `ENUMERATOR' statements. Interoperability with `gcc'
+- is guaranteed also for the case where the `-fshort-enums' command
+- line option is given.
+-
+- * TR 15581:
+- * `ALLOCATABLE' dummy arguments.
+-
+- * `ALLOCATABLE' function results
+-
+- * `ALLOCATABLE' components of derived types
+-
+- * The `OPEN' statement supports the `ACCESS='STREAM'' specifier,
+- allowing I/O without any record structure.
+-
+- * Namelist input/output for internal files.
+-
+- * The `PROTECTED' statement and attribute.
+-
+- * The `VALUE' statement and attribute.
+-
+- * The `VOLATILE' statement and attribute.
+-
+- * The `IMPORT' statement, allowing to import host-associated derived
+- types.
+-
+- * `USE' statement with `INTRINSIC' and `NON_INTRINSIC' attribute;
+- supported intrinsic modules: `ISO_FORTRAN_ENV', `OMP_LIB' and
+- `OMP_LIB_KINDS'.
+-
+- * Renaming of operators in the `USE' statement.
+-
+- * Interoperability with C (ISO C Bindings)
+-
+- * BOZ as argument of INT, REAL, DBLE and CMPLX.
+-
+-
+-
+-File: gfortran.info, Node: Fortran 2008 status, Prev: Fortran 2003 status, Up: Fortran 2003 and 2008 status
+-
+-4.2 Fortran 2008 status
+-=======================
+-
+-The next version of the Fortran standard after Fortran 2003 is currently
+-being worked on by the Working Group 5 of Sub-Committee 22 of the Joint
+-Technical Committee 1 of the International Organization for
+-Standardization (ISO) and the International Electrotechnical Commission
+-(IEC). This group is known at WG5 (http://www.nag.co.uk/sc22wg5/). The
+-next revision of the Fortran standard is informally referred to as
+-Fortran 2008, reflecting its planned release year. The GNU Fortran
+-compiler has support for some of the new features in Fortran 2008. This
+-support is based on the latest draft, available from
+-`http://www.nag.co.uk/sc22wg5/'. However, as the final standard may
+-differ from the drafts, no guarantee of backward compatibility can be
+-made and you should only use it for experimental purposes.
+-
+-
+-File: gfortran.info, Node: Compiler Characteristics, Next: Extensions, Prev: Fortran 2003 and 2008 status, Up: Top
+-
+-5 Compiler Characteristics
+-**************************
+-
+-This chapter describes certain characteristics of the GNU Fortran
+-compiler, namely the KIND type parameter values supported.
+-
+-* Menu:
+-
+-* KIND Type Parameters::
+-
+-
+-File: gfortran.info, Node: KIND Type Parameters, Up: Compiler Characteristics
+-
+-5.1 KIND Type Parameters
+-========================
+-
+-The `KIND' type parameters supported by GNU Fortran for the primitive
+-data types are:
+-
+-`INTEGER'
+- 1, 2, 4, 8*, 16*, default: 4 (1)
+-
+-`LOGICAL'
+- 1, 2, 4, 8*, 16*, default: 4 (1)
+-
+-`REAL'
+- 4, 8, 10**, 16**, default: 4 (2)
+-
+-`COMPLEX'
+- 4, 8, 10**, 16**, default: 4 (2)
+-
+-`CHARACTER'
+- 1, 4, default: 1
+-
+-
+-* = not available on all systems
+-** = not available on all systems; additionally 10 and 16 are never
+-available at the same time
+-(1) Unless -fdefault-integer-8 is used
+-(2) Unless -fdefault-real-8 is used
+-
+-The `KIND' value matches the storage size in bytes, except for
+-`COMPLEX' where the storage size is twice as much (or both real and
+-imaginary part are a real value of the given size). It is recommended
+-to use the `SELECT_*_KIND' intrinsics instead of the concrete values.
+-
+-
+-File: gfortran.info, Node: Extensions, Next: Intrinsic Procedures, Prev: Compiler Characteristics, Up: Top
+-
+-6 Extensions
+-************
+-
+-The two sections below detail the extensions to standard Fortran that
+-are implemented in GNU Fortran, as well as some of the popular or
+-historically important extensions that are not (or not yet) implemented.
+-For the latter case, we explain the alternatives available to GNU
+-Fortran users, including replacement by standard-conforming code or GNU
+-extensions.
+-
+-* Menu:
+-
+-* Extensions implemented in GNU Fortran::
+-* Extensions not implemented in GNU Fortran::
+-
+-
+-File: gfortran.info, Node: Extensions implemented in GNU Fortran, Next: Extensions not implemented in GNU Fortran, Up: Extensions
+-
+-6.1 Extensions implemented in GNU Fortran
+-=========================================
+-
+-GNU Fortran implements a number of extensions over standard Fortran.
+-This chapter contains information on their syntax and meaning. There
+-are currently two categories of GNU Fortran extensions, those that
+-provide functionality beyond that provided by any standard, and those
+-that are supported by GNU Fortran purely for backward compatibility
+-with legacy compilers. By default, `-std=gnu' allows the compiler to
+-accept both types of extensions, but to warn about the use of the
+-latter. Specifying either `-std=f95', `-std=f2003' or `-std=f2008'
+-disables both types of extensions, and `-std=legacy' allows both
+-without warning.
+-
+-* Menu:
+-
+-* Old-style kind specifications::
+-* Old-style variable initialization::
+-* Extensions to namelist::
+-* X format descriptor without count field::
+-* Commas in FORMAT specifications::
+-* Missing period in FORMAT specifications::
+-* I/O item lists::
+-* BOZ literal constants::
+-* Real array indices::
+-* Unary operators::
+-* Implicitly convert LOGICAL and INTEGER values::
+-* Hollerith constants support::
+-* Cray pointers::
+-* CONVERT specifier::
+-* OpenMP::
+-* Argument list functions::
+-
+-
+-File: gfortran.info, Node: Old-style kind specifications, Next: Old-style variable initialization, Up: Extensions implemented in GNU Fortran
+-
+-6.1.1 Old-style kind specifications
+------------------------------------
+-
+-GNU Fortran allows old-style kind specifications in declarations. These
+-look like:
+- TYPESPEC*size x,y,z
+- where `TYPESPEC' is a basic type (`INTEGER', `REAL', etc.), and
+-where `size' is a byte count corresponding to the storage size of a
+-valid kind for that type. (For `COMPLEX' variables, `size' is the
+-total size of the real and imaginary parts.) The statement then
+-declares `x', `y' and `z' to be of type `TYPESPEC' with the appropriate
+-kind. This is equivalent to the standard-conforming declaration
+- TYPESPEC(k) x,y,z
+- where `k' is the kind parameter suitable for the intended precision.
+-As kind parameters are implementation-dependent, use the `KIND',
+-`SELECTED_INT_KIND' and `SELECTED_REAL_KIND' intrinsics to retrieve the
+-correct value, for instance `REAL*8 x' can be replaced by:
+- INTEGER, PARAMETER :: dbl = KIND(1.0d0)
+- REAL(KIND=dbl) :: x
+-
+-
+-File: gfortran.info, Node: Old-style variable initialization, Next: Extensions to namelist, Prev: Old-style kind specifications, Up: Extensions implemented in GNU Fortran
+-
+-6.1.2 Old-style variable initialization
+----------------------------------------
+-
+-GNU Fortran allows old-style initialization of variables of the form:
+- INTEGER i/1/,j/2/
+- REAL x(2,2) /3*0.,1./
+- The syntax for the initializers is as for the `DATA' statement, but
+-unlike in a `DATA' statement, an initializer only applies to the
+-variable immediately preceding the initialization. In other words,
+-something like `INTEGER I,J/2,3/' is not valid. This style of
+-initialization is only allowed in declarations without double colons
+-(`::'); the double colons were introduced in Fortran 90, which also
+-introduced a standard syntax for initializing variables in type
+-declarations.
+-
+- Examples of standard-conforming code equivalent to the above example
+-are:
+- ! Fortran 90
+- INTEGER :: i = 1, j = 2
+- REAL :: x(2,2) = RESHAPE((/0.,0.,0.,1./),SHAPE(x))
+- ! Fortran 77
+- INTEGER i, j
+- REAL x(2,2)
+- DATA i/1/, j/2/, x/3*0.,1./
+-
+- Note that variables which are explicitly initialized in declarations
+-or in `DATA' statements automatically acquire the `SAVE' attribute.
+-
+-
+-File: gfortran.info, Node: Extensions to namelist, Next: X format descriptor without count field, Prev: Old-style variable initialization, Up: Extensions implemented in GNU Fortran
+-
+-6.1.3 Extensions to namelist
+-----------------------------
+-
+-GNU Fortran fully supports the Fortran 95 standard for namelist I/O
+-including array qualifiers, substrings and fully qualified derived
+-types. The output from a namelist write is compatible with namelist
+-read. The output has all names in upper case and indentation to column
+-1 after the namelist name. Two extensions are permitted:
+-
+- Old-style use of `$' instead of `&'
+- $MYNML
+- X(:)%Y(2) = 1.0 2.0 3.0
+- CH(1:4) = "abcd"
+- $END
+-
+- It should be noted that the default terminator is `/' rather than
+-`&END'.
+-
+- Querying of the namelist when inputting from stdin. After at least
+-one space, entering `?' sends to stdout the namelist name and the names
+-of the variables in the namelist:
+- ?
+-
+- &mynml
+- x
+- x%y
+- ch
+- &end
+-
+- Entering `=?' outputs the namelist to stdout, as if `WRITE(*,NML =
+-mynml)' had been called:
+- =?
+-
+- &MYNML
+- X(1)%Y= 0.000000 , 1.000000 , 0.000000 ,
+- X(2)%Y= 0.000000 , 2.000000 , 0.000000 ,
+- X(3)%Y= 0.000000 , 3.000000 , 0.000000 ,
+- CH=abcd, /
+-
+- To aid this dialog, when input is from stdin, errors send their
+-messages to stderr and execution continues, even if `IOSTAT' is set.
+-
+- `PRINT' namelist is permitted. This causes an error if `-std=f95'
+-is used.
+- PROGRAM test_print
+- REAL, dimension (4) :: x = (/1.0, 2.0, 3.0, 4.0/)
+- NAMELIST /mynml/ x
+- PRINT mynml
+- END PROGRAM test_print
+-
+- Expanded namelist reads are permitted. This causes an error if
+-`-std=f95' is used. In the following example, the first element of the
+-array will be given the value 0.00 and the two succeeding elements will
+-be given the values 1.00 and 2.00.
+- &MYNML
+- X(1,1) = 0.00 , 1.00 , 2.00
+- /
+-
+-
+-File: gfortran.info, Node: X format descriptor without count field, Next: Commas in FORMAT specifications, Prev: Extensions to namelist, Up: Extensions implemented in GNU Fortran
+-
+-6.1.4 `X' format descriptor without count field
+------------------------------------------------
+-
+-To support legacy codes, GNU Fortran permits the count field of the `X'
+-edit descriptor in `FORMAT' statements to be omitted. When omitted,
+-the count is implicitly assumed to be one.
+-
+- PRINT 10, 2, 3
+- 10 FORMAT (I1, X, I1)
+-
+-
+-File: gfortran.info, Node: Commas in FORMAT specifications, Next: Missing period in FORMAT specifications, Prev: X format descriptor without count field, Up: Extensions implemented in GNU Fortran
+-
+-6.1.5 Commas in `FORMAT' specifications
+----------------------------------------
+-
+-To support legacy codes, GNU Fortran allows the comma separator to be
+-omitted immediately before and after character string edit descriptors
+-in `FORMAT' statements.
+-
+- PRINT 10, 2, 3
+- 10 FORMAT ('FOO='I1' BAR='I2)
+-
+-
+-File: gfortran.info, Node: Missing period in FORMAT specifications, Next: I/O item lists, Prev: Commas in FORMAT specifications, Up: Extensions implemented in GNU Fortran
+-
+-6.1.6 Missing period in `FORMAT' specifications
+------------------------------------------------
+-
+-To support legacy codes, GNU Fortran allows missing periods in format
+-specifications if and only if `-std=legacy' is given on the command
+-line. This is considered non-conforming code and is discouraged.
+-
+- REAL :: value
+- READ(*,10) value
+- 10 FORMAT ('F4')
+-
+-
+-File: gfortran.info, Node: I/O item lists, Next: BOZ literal constants, Prev: Missing period in FORMAT specifications, Up: Extensions implemented in GNU Fortran
+-
+-6.1.7 I/O item lists
+---------------------
+-
+-To support legacy codes, GNU Fortran allows the input item list of the
+-`READ' statement, and the output item lists of the `WRITE' and `PRINT'
+-statements, to start with a comma.
+-
+-
+-File: gfortran.info, Node: BOZ literal constants, Next: Real array indices, Prev: I/O item lists, Up: Extensions implemented in GNU Fortran
+-
+-6.1.8 BOZ literal constants
+----------------------------
+-
+-Besides decimal constants, Fortran also supports binary (`b'), octal
+-(`o') and hexadecimal (`z') integer constants. The syntax is: `prefix
+-quote digits quote', were the prefix is either `b', `o' or `z', quote
+-is either `'' or `"' and the digits are for binary `0' or `1', for
+-octal between `0' and `7', and for hexadecimal between `0' and `F'.
+-(Example: `b'01011101''.)
+-
+- Up to Fortran 95, BOZ literals were only allowed to initialize
+-integer variables in DATA statements. Since Fortran 2003 BOZ literals
+-are also allowed as argument of `REAL', `DBLE', `INT' and `CMPLX'; the
+-result is the same as if the integer BOZ literal had been converted by
+-`TRANSFER' to, respectively, `real', `double precision', `integer' or
+-`complex'. As GNU Fortran extension the intrinsic procedures `FLOAT',
+-`DFLOAT', `COMPLEX' and `DCMPLX' are treated alike.
+-
+- As an extension, GNU Fortran allows hexadecimal BOZ literal
+-constants to be specified using the `X' prefix, in addition to the
+-standard `Z' prefix. The BOZ literal can also be specified by adding a
+-suffix to the string, for example, `Z'ABC'' and `'ABC'Z' are equivalent.
+-
+- Furthermore, GNU Fortran allows using BOZ literal constants outside
+-DATA statements and the four intrinsic functions allowed by Fortran
+-2003. In DATA statements, in direct assignments, where the right-hand
+-side only contains a BOZ literal constant, and for old-style
+-initializers of the form `integer i /o'0173'/', the constant is
+-transferred as if `TRANSFER' had been used; for `COMPLEX' numbers, only
+-the real part is initialized unless `CMPLX' is used. In all other
+-cases, the BOZ literal constant is converted to an `INTEGER' value with
+-the largest decimal representation. This value is then converted
+-numerically to the type and kind of the variable in question. (For
+-instance `real :: r = b'0000001' + 1' initializes `r' with `2.0'.) As
+-different compilers implement the extension differently, one should be
+-careful when doing bitwise initialization of non-integer variables.
+-
+- Note that initializing an `INTEGER' variable with a statement such
+-as `DATA i/Z'FFFFFFFF'/' will give an integer overflow error rather
+-than the desired result of -1 when `i' is a 32-bit integer on a system
+-that supports 64-bit integers. The `-fno-range-check' option can be
+-used as a workaround for legacy code that initializes integers in this
+-manner.
+-
+-
+-File: gfortran.info, Node: Real array indices, Next: Unary operators, Prev: BOZ literal constants, Up: Extensions implemented in GNU Fortran
+-
+-6.1.9 Real array indices
+-------------------------
+-
+-As an extension, GNU Fortran allows the use of `REAL' expressions or
+-variables as array indices.
+-
+-
+-File: gfortran.info, Node: Unary operators, Next: Implicitly convert LOGICAL and INTEGER values, Prev: Real array indices, Up: Extensions implemented in GNU Fortran
+-
+-6.1.10 Unary operators
+-----------------------
+-
+-As an extension, GNU Fortran allows unary plus and unary minus operators
+-to appear as the second operand of binary arithmetic operators without
+-the need for parenthesis.
+-
+- X = Y * -Z
+-
+-
+-File: gfortran.info, Node: Implicitly convert LOGICAL and INTEGER values, Next: Hollerith constants support, Prev: Unary operators, Up: Extensions implemented in GNU Fortran
+-
+-6.1.11 Implicitly convert `LOGICAL' and `INTEGER' values
+---------------------------------------------------------
+-
+-As an extension for backwards compatibility with other compilers, GNU
+-Fortran allows the implicit conversion of `LOGICAL' values to `INTEGER'
+-values and vice versa. When converting from a `LOGICAL' to an
+-`INTEGER', `.FALSE.' is interpreted as zero, and `.TRUE.' is
+-interpreted as one. When converting from `INTEGER' to `LOGICAL', the
+-value zero is interpreted as `.FALSE.' and any nonzero value is
+-interpreted as `.TRUE.'.
+-
+- LOGICAL :: l
+- l = 1
+-
+- INTEGER :: i
+- i = .TRUE.
+-
+- However, there is no implicit conversion of `INTEGER' values in
+-`if'-statements, nor of `LOGICAL' or `INTEGER' values in I/O operations.
+-
+-
+-File: gfortran.info, Node: Hollerith constants support, Next: Cray pointers, Prev: Implicitly convert LOGICAL and INTEGER values, Up: Extensions implemented in GNU Fortran
+-
+-6.1.12 Hollerith constants support
+-----------------------------------
+-
+-GNU Fortran supports Hollerith constants in assignments, function
+-arguments, and `DATA' and `ASSIGN' statements. A Hollerith constant is
+-written as a string of characters preceded by an integer constant
+-indicating the character count, and the letter `H' or `h', and stored
+-in bytewise fashion in a numeric (`INTEGER', `REAL', or `complex') or
+-`LOGICAL' variable. The constant will be padded or truncated to fit
+-the size of the variable in which it is stored.
+-
+- Examples of valid uses of Hollerith constants:
+- complex*16 x(2)
+- data x /16Habcdefghijklmnop, 16Hqrstuvwxyz012345/
+- x(1) = 16HABCDEFGHIJKLMNOP
+- call foo (4h abc)
+-
+- Invalid Hollerith constants examples:
+- integer*4 a
+- a = 8H12345678 ! Valid, but the Hollerith constant will be truncated.
+- a = 0H ! At least one character is needed.
+-
+- In general, Hollerith constants were used to provide a rudimentary
+-facility for handling character strings in early Fortran compilers,
+-prior to the introduction of `CHARACTER' variables in Fortran 77; in
+-those cases, the standard-compliant equivalent is to convert the
+-program to use proper character strings. On occasion, there may be a
+-case where the intent is specifically to initialize a numeric variable
+-with a given byte sequence. In these cases, the same result can be
+-obtained by using the `TRANSFER' statement, as in this example.
+- INTEGER(KIND=4) :: a
+- a = TRANSFER ("abcd", a) ! equivalent to: a = 4Habcd
+-
+-
+-File: gfortran.info, Node: Cray pointers, Next: CONVERT specifier, Prev: Hollerith constants support, Up: Extensions implemented in GNU Fortran
+-
+-6.1.13 Cray pointers
+---------------------
+-
+-Cray pointers are part of a non-standard extension that provides a
+-C-like pointer in Fortran. This is accomplished through a pair of
+-variables: an integer "pointer" that holds a memory address, and a
+-"pointee" that is used to dereference the pointer.
+-
+- Pointer/pointee pairs are declared in statements of the form:
+- pointer ( <pointer> , <pointee> )
+- or,
+- pointer ( <pointer1> , <pointee1> ), ( <pointer2> , <pointee2> ), ...
+- The pointer is an integer that is intended to hold a memory address.
+-The pointee may be an array or scalar. A pointee can be an assumed
+-size array--that is, the last dimension may be left unspecified by
+-using a `*' in place of a value--but a pointee cannot be an assumed
+-shape array. No space is allocated for the pointee.
+-
+- The pointee may have its type declared before or after the pointer
+-statement, and its array specification (if any) may be declared before,
+-during, or after the pointer statement. The pointer may be declared as
+-an integer prior to the pointer statement. However, some machines have
+-default integer sizes that are different than the size of a pointer,
+-and so the following code is not portable:
+- integer ipt
+- pointer (ipt, iarr)
+- If a pointer is declared with a kind that is too small, the compiler
+-will issue a warning; the resulting binary will probably not work
+-correctly, because the memory addresses stored in the pointers may be
+-truncated. It is safer to omit the first line of the above example; if
+-explicit declaration of ipt's type is omitted, then the compiler will
+-ensure that ipt is an integer variable large enough to hold a pointer.
+-
+- Pointer arithmetic is valid with Cray pointers, but it is not the
+-same as C pointer arithmetic. Cray pointers are just ordinary
+-integers, so the user is responsible for determining how many bytes to
+-add to a pointer in order to increment it. Consider the following
+-example:
+- real target(10)
+- real pointee(10)
+- pointer (ipt, pointee)
+- ipt = loc (target)
+- ipt = ipt + 1
+- The last statement does not set `ipt' to the address of `target(1)',
+-as it would in C pointer arithmetic. Adding `1' to `ipt' just adds one
+-byte to the address stored in `ipt'.
+-
+- Any expression involving the pointee will be translated to use the
+-value stored in the pointer as the base address.
+-
+- To get the address of elements, this extension provides an intrinsic
+-function `LOC()'. The `LOC()' function is equivalent to the `&'
+-operator in C, except the address is cast to an integer type:
+- real ar(10)
+- pointer(ipt, arpte(10))
+- real arpte
+- ipt = loc(ar) ! Makes arpte is an alias for ar
+- arpte(1) = 1.0 ! Sets ar(1) to 1.0
+- The pointer can also be set by a call to the `MALLOC' intrinsic (see
+-*note MALLOC::).
+-
+- Cray pointees often are used to alias an existing variable. For
+-example:
+- integer target(10)
+- integer iarr(10)
+- pointer (ipt, iarr)
+- ipt = loc(target)
+- As long as `ipt' remains unchanged, `iarr' is now an alias for
+-`target'. The optimizer, however, will not detect this aliasing, so it
+-is unsafe to use `iarr' and `target' simultaneously. Using a pointee
+-in any way that violates the Fortran aliasing rules or assumptions is
+-illegal. It is the user's responsibility to avoid doing this; the
+-compiler works under the assumption that no such aliasing occurs.
+-
+- Cray pointers will work correctly when there is no aliasing (i.e.,
+-when they are used to access a dynamically allocated block of memory),
+-and also in any routine where a pointee is used, but any variable with
+-which it shares storage is not used. Code that violates these rules
+-may not run as the user intends. This is not a bug in the optimizer;
+-any code that violates the aliasing rules is illegal. (Note that this
+-is not unique to GNU Fortran; any Fortran compiler that supports Cray
+-pointers will "incorrectly" optimize code with illegal aliasing.)
+-
+- There are a number of restrictions on the attributes that can be
+-applied to Cray pointers and pointees. Pointees may not have the
+-`ALLOCATABLE', `INTENT', `OPTIONAL', `DUMMY', `TARGET', `INTRINSIC', or
+-`POINTER' attributes. Pointers may not have the `DIMENSION', `POINTER',
+-`TARGET', `ALLOCATABLE', `EXTERNAL', or `INTRINSIC' attributes.
+-Pointees may not occur in more than one pointer statement. A pointee
+-cannot be a pointer. Pointees cannot occur in equivalence, common, or
+-data statements.
+-
+- A Cray pointer may also point to a function or a subroutine. For
+-example, the following excerpt is valid:
+- implicit none
+- external sub
+- pointer (subptr,subpte)
+- external subpte
+- subptr = loc(sub)
+- call subpte()
+- [...]
+- subroutine sub
+- [...]
+- end subroutine sub
+-
+- A pointer may be modified during the course of a program, and this
+-will change the location to which the pointee refers. However, when
+-pointees are passed as arguments, they are treated as ordinary
+-variables in the invoked function. Subsequent changes to the pointer
+-will not change the base address of the array that was passed.
+-
+-
+-File: gfortran.info, Node: CONVERT specifier, Next: OpenMP, Prev: Cray pointers, Up: Extensions implemented in GNU Fortran
+-
+-6.1.14 `CONVERT' specifier
+---------------------------
+-
+-GNU Fortran allows the conversion of unformatted data between little-
+-and big-endian representation to facilitate moving of data between
+-different systems. The conversion can be indicated with the `CONVERT'
+-specifier on the `OPEN' statement. *Note GFORTRAN_CONVERT_UNIT::, for
+-an alternative way of specifying the data format via an environment
+-variable.
+-
+- Valid values for `CONVERT' are:
+- `CONVERT='NATIVE'' Use the native format. This is the default.
+-
+- `CONVERT='SWAP'' Swap between little- and big-endian.
+-
+- `CONVERT='LITTLE_ENDIAN'' Use the little-endian representation for
+- unformatted files.
+-
+- `CONVERT='BIG_ENDIAN'' Use the big-endian representation for
+- unformatted files.
+-
+- Using the option could look like this:
+- open(file='big.dat',form='unformatted',access='sequential', &
+- convert='big_endian')
+-
+- The value of the conversion can be queried by using
+-`INQUIRE(CONVERT=ch)'. The values returned are `'BIG_ENDIAN'' and
+-`'LITTLE_ENDIAN''.
+-
+- `CONVERT' works between big- and little-endian for `INTEGER' values
+-of all supported kinds and for `REAL' on IEEE systems of kinds 4 and 8.
+-Conversion between different "extended double" types on different
+-architectures such as m68k and x86_64, which GNU Fortran supports as
+-`REAL(KIND=10)' and `REAL(KIND=16)', will probably not work.
+-
+- _Note that the values specified via the GFORTRAN_CONVERT_UNIT
+-environment variable will override the CONVERT specifier in the open
+-statement_. This is to give control over data formats to users who do
+-not have the source code of their program available.
+-
+- Using anything but the native representation for unformatted data
+-carries a significant speed overhead. If speed in this area matters to
+-you, it is best if you use this only for data that needs to be portable.
+-
+-
+-File: gfortran.info, Node: OpenMP, Next: Argument list functions, Prev: CONVERT specifier, Up: Extensions implemented in GNU Fortran
+-
+-6.1.15 OpenMP
+--------------
+-
+-OpenMP (Open Multi-Processing) is an application programming interface
+-(API) that supports multi-platform shared memory multiprocessing
+-programming in C/C++ and Fortran on many architectures, including Unix
+-and Microsoft Windows platforms. It consists of a set of compiler
+-directives, library routines, and environment variables that influence
+-run-time behavior.
+-
+- GNU Fortran strives to be compatible to the OpenMP Application
+-Program Interface v2.5
+-(http://www.openmp.org/drupal/mp-documents/spec25.pdf).
+-
+- To enable the processing of the OpenMP directive `!$omp' in
+-free-form source code; the `c$omp', `*$omp' and `!$omp' directives in
+-fixed form; the `!$' conditional compilation sentinels in free form;
+-and the `c$', `*$' and `!$' sentinels in fixed form, `gfortran' needs
+-to be invoked with the `-fopenmp'. This also arranges for automatic
+-linking of the GNU OpenMP runtime library *note libgomp: (libgomp)Top.
+-
+- The OpenMP Fortran runtime library routines are provided both in a
+-form of a Fortran 90 module named `omp_lib' and in a form of a Fortran
+-`include' file named `omp_lib.h'.
+-
+- An example of a parallelized loop taken from Appendix A.1 of the
+-OpenMP Application Program Interface v2.5:
+- SUBROUTINE A1(N, A, B)
+- INTEGER I, N
+- REAL B(N), A(N)
+- !$OMP PARALLEL DO !I is private by default
+- DO I=2,N
+- B(I) = (A(I) + A(I-1)) / 2.0
+- ENDDO
+- !$OMP END PARALLEL DO
+- END SUBROUTINE A1
+-
+- Please note:
+- * `-fopenmp' implies `-frecursive', i.e., all local arrays will be
+- allocated on the stack. When porting existing code to OpenMP, this
+- may lead to surprising results, especially to segmentation faults
+- if the stacksize is limited.
+-
+- * On glibc-based systems, OpenMP enabled applications can not be
+- statically linked due to limitations of the underlying
+- pthreads-implementation. It might be possible to get a working
+- solution if `-Wl,--whole-archive -lpthread -Wl,--no-whole-archive'
+- is added to the command line. However, this is not supported by
+- `gcc' and thus not recommended.
+-
+-
+-File: gfortran.info, Node: Argument list functions, Prev: OpenMP, Up: Extensions implemented in GNU Fortran
+-
+-6.1.16 Argument list functions `%VAL', `%REF' and `%LOC'
+---------------------------------------------------------
+-
+-GNU Fortran supports argument list functions `%VAL', `%REF' and `%LOC'
+-statements, for backward compatibility with g77. It is recommended
+-that these should be used only for code that is accessing facilities
+-outside of GNU Fortran, such as operating system or windowing
+-facilities. It is best to constrain such uses to isolated portions of a
+-program-portions that deal specifically and exclusively with low-level,
+-system-dependent facilities. Such portions might well provide a
+-portable interface for use by the program as a whole, but are
+-themselves not portable, and should be thoroughly tested each time they
+-are rebuilt using a new compiler or version of a compiler.
+-
+- `%VAL' passes a scalar argument by value, `%REF' passes it by
+-reference and `%LOC' passes its memory location. Since gfortran
+-already passes scalar arguments by reference, `%REF' is in effect a
+-do-nothing. `%LOC' has the same effect as a fortran pointer.
+-
+- An example of passing an argument by value to a C subroutine foo.:
+- C
+- C prototype void foo_ (float x);
+- C
+- external foo
+- real*4 x
+- x = 3.14159
+- call foo (%VAL (x))
+- end
+-
+- For details refer to the g77 manual
+-`http://gcc.gnu.org/onlinedocs/gcc-3.4.6/g77/index.html#Top'.
+-
+- Also, the gfortran testsuite c_by_val.f and its partner c_by_val.c
+-are worth a look.
+-
+-
+-File: gfortran.info, Node: Extensions not implemented in GNU Fortran, Prev: Extensions implemented in GNU Fortran, Up: Extensions
+-
+-6.2 Extensions not implemented in GNU Fortran
+-=============================================
+-
+-The long history of the Fortran language, its wide use and broad
+-userbase, the large number of different compiler vendors and the lack of
+-some features crucial to users in the first standards have lead to the
+-existence of a number of important extensions to the language. While
+-some of the most useful or popular extensions are supported by the GNU
+-Fortran compiler, not all existing extensions are supported. This
+-section aims at listing these extensions and offering advice on how
+-best make code that uses them running with the GNU Fortran compiler.
+-
+-* Menu:
+-
+-* STRUCTURE and RECORD::
+-* ENCODE and DECODE statements::
+-
+-
+-File: gfortran.info, Node: STRUCTURE and RECORD, Next: ENCODE and DECODE statements, Up: Extensions not implemented in GNU Fortran
+-
+-6.2.1 `STRUCTURE' and `RECORD'
+-------------------------------
+-
+-Structures are user-defined aggregate data types; this functionality was
+-standardized in Fortran 90 with an different syntax, under the name of
+-"derived types". Here is an example of code using the non portable
+-structure syntax:
+-
+- ! Declaring a structure named ``item'' and containing three fields:
+- ! an integer ID, an description string and a floating-point price.
+- STRUCTURE /item/
+- INTEGER id
+- CHARACTER(LEN=200) description
+- REAL price
+- END STRUCTURE
+-
+- ! Define two variables, an single record of type ``item''
+- ! named ``pear'', and an array of items named ``store_catalog''
+- RECORD /item/ pear, store_catalog(100)
+-
+- ! We can directly access the fields of both variables
+- pear.id = 92316
+- pear.description = "juicy D'Anjou pear"
+- pear.price = 0.15
+- store_catalog(7).id = 7831
+- store_catalog(7).description = "milk bottle"
+- store_catalog(7).price = 1.2
+-
+- ! We can also manipulate the whole structure
+- store_catalog(12) = pear
+- print *, store_catalog(12)
+-
+-This code can easily be rewritten in the Fortran 90 syntax as following:
+-
+- ! ``STRUCTURE /name/ ... END STRUCTURE'' becomes
+- ! ``TYPE name ... END TYPE''
+- TYPE item
+- INTEGER id
+- CHARACTER(LEN=200) description
+- REAL price
+- END TYPE
+-
+- ! ``RECORD /name/ variable'' becomes ``TYPE(name) variable''
+- TYPE(item) pear, store_catalog(100)
+-
+- ! Instead of using a dot (.) to access fields of a record, the
+- ! standard syntax uses a percent sign (%)
+- pear%id = 92316
+- pear%description = "juicy D'Anjou pear"
+- pear%price = 0.15
+- store_catalog(7)%id = 7831
+- store_catalog(7)%description = "milk bottle"
+- store_catalog(7)%price = 1.2
+-
+- ! Assignments of a whole variable don't change
+- store_catalog(12) = pear
+- print *, store_catalog(12)
+-
+-
+-File: gfortran.info, Node: ENCODE and DECODE statements, Prev: STRUCTURE and RECORD, Up: Extensions not implemented in GNU Fortran
+-
+-6.2.2 `ENCODE' and `DECODE' statements
+---------------------------------------
+-
+-GNU Fortran doesn't support the `ENCODE' and `DECODE' statements.
+-These statements are best replaced by `READ' and `WRITE' statements
+-involving internal files (`CHARACTER' variables and arrays), which have
+-been part of the Fortran standard since Fortran 77. For example,
+-replace a code fragment like
+-
+- INTEGER*1 LINE(80)
+- REAL A, B, C
+- c ... Code that sets LINE
+- DECODE (80, 9000, LINE) A, B, C
+- 9000 FORMAT (1X, 3(F10.5))
+-
+-with the following:
+-
+- CHARACTER(LEN=80) LINE
+- REAL A, B, C
+- c ... Code that sets LINE
+- READ (UNIT=LINE, FMT=9000) A, B, C
+- 9000 FORMAT (1X, 3(F10.5))
+-
+- Similarly, replace a code fragment like
+-
+- INTEGER*1 LINE(80)
+- REAL A, B, C
+- c ... Code that sets A, B and C
+- ENCODE (80, 9000, LINE) A, B, C
+- 9000 FORMAT (1X, 'OUTPUT IS ', 3(F10.5))
+-
+-with the following:
+-
+- INTEGER*1 LINE(80)
+- REAL A, B, C
+- c ... Code that sets A, B and C
+- WRITE (UNIT=LINE, FMT=9000) A, B, C
+- 9000 FORMAT (1X, 'OUTPUT IS ', 3(F10.5))
+-
+-
+-File: gfortran.info, Node: Intrinsic Procedures, Next: Intrinsic Modules, Prev: Extensions, Up: Top
+-
+-7 Intrinsic Procedures
+-**********************
+-
+-* Menu:
+-
+-* Introduction: Introduction to Intrinsics
+-* `ABORT': ABORT, Abort the program
+-* `ABS': ABS, Absolute value
+-* `ACCESS': ACCESS, Checks file access modes
+-* `ACHAR': ACHAR, Character in ASCII collating sequence
+-* `ACOS': ACOS, Arccosine function
+-* `ACOSH': ACOSH, Hyperbolic arccosine function
+-* `ADJUSTL': ADJUSTL, Left adjust a string
+-* `ADJUSTR': ADJUSTR, Right adjust a string
+-* `AIMAG': AIMAG, Imaginary part of complex number
+-* `AINT': AINT, Truncate to a whole number
+-* `ALARM': ALARM, Set an alarm clock
+-* `ALL': ALL, Determine if all values are true
+-* `ALLOCATED': ALLOCATED, Status of allocatable entity
+-* `AND': AND, Bitwise logical AND
+-* `ANINT': ANINT, Nearest whole number
+-* `ANY': ANY, Determine if any values are true
+-* `ASIN': ASIN, Arcsine function
+-* `ASINH': ASINH, Hyperbolic arcsine function
+-* `ASSOCIATED': ASSOCIATED, Status of a pointer or pointer/target pair
+-* `ATAN': ATAN, Arctangent function
+-* `ATAN2': ATAN2, Arctangent function
+-* `ATANH': ATANH, Hyperbolic arctangent function
+-* `BESSEL_J0': BESSEL_J0, Bessel function of the first kind of order 0
+-* `BESSEL_J1': BESSEL_J1, Bessel function of the first kind of order 1
+-* `BESSEL_JN': BESSEL_JN, Bessel function of the first kind
+-* `BESSEL_Y0': BESSEL_Y0, Bessel function of the second kind of order 0
+-* `BESSEL_Y1': BESSEL_Y1, Bessel function of the second kind of order 1
+-* `BESSEL_YN': BESSEL_YN, Bessel function of the second kind
+-* `BIT_SIZE': BIT_SIZE, Bit size inquiry function
+-* `BTEST': BTEST, Bit test function
+-* `C_ASSOCIATED': C_ASSOCIATED, Status of a C pointer
+-* `C_F_POINTER': C_F_POINTER, Convert C into Fortran pointer
+-* `C_F_PROCPOINTER': C_F_PROCPOINTER, Convert C into Fortran procedure pointer
+-* `C_FUNLOC': C_FUNLOC, Obtain the C address of a procedure
+-* `C_LOC': C_LOC, Obtain the C address of an object
+-* `C_SIZEOF': C_SIZEOF, Size in bytes of an expression
+-* `CEILING': CEILING, Integer ceiling function
+-* `CHAR': CHAR, Integer-to-character conversion function
+-* `CHDIR': CHDIR, Change working directory
+-* `CHMOD': CHMOD, Change access permissions of files
+-* `CMPLX': CMPLX, Complex conversion function
+-* `COMMAND_ARGUMENT_COUNT': COMMAND_ARGUMENT_COUNT, Get number of command line arguments
+-* `COMPLEX': COMPLEX, Complex conversion function
+-* `CONJG': CONJG, Complex conjugate function
+-* `COS': COS, Cosine function
+-* `COSH': COSH, Hyperbolic cosine function
+-* `COUNT': COUNT, Count occurrences of TRUE in an array
+-* `CPU_TIME': CPU_TIME, CPU time subroutine
+-* `CSHIFT': CSHIFT, Circular shift elements of an array
+-* `CTIME': CTIME, Subroutine (or function) to convert a time into a string
+-* `DATE_AND_TIME': DATE_AND_TIME, Date and time subroutine
+-* `DBLE': DBLE, Double precision conversion function
+-* `DCMPLX': DCMPLX, Double complex conversion function
+-* `DFLOAT': DFLOAT, Double precision conversion function
+-* `DIGITS': DIGITS, Significant digits function
+-* `DIM': DIM, Positive difference
+-* `DOT_PRODUCT': DOT_PRODUCT, Dot product function
+-* `DPROD': DPROD, Double product function
+-* `DREAL': DREAL, Double real part function
+-* `DTIME': DTIME, Execution time subroutine (or function)
+-* `EOSHIFT': EOSHIFT, End-off shift elements of an array
+-* `EPSILON': EPSILON, Epsilon function
+-* `ERF': ERF, Error function
+-* `ERFC': ERFC, Complementary error function
+-* `ERFC_SCALED': ERFC_SCALED, Exponentially-scaled complementary error function
+-* `ETIME': ETIME, Execution time subroutine (or function)
+-* `EXIT': EXIT, Exit the program with status.
+-* `EXP': EXP, Exponential function
+-* `EXPONENT': EXPONENT, Exponent function
+-* `FDATE': FDATE, Subroutine (or function) to get the current time as a string
+-* `FGET': FGET, Read a single character in stream mode from stdin
+-* `FGETC': FGETC, Read a single character in stream mode
+-* `FLOAT': FLOAT, Convert integer to default real
+-* `FLOOR': FLOOR, Integer floor function
+-* `FLUSH': FLUSH, Flush I/O unit(s)
+-* `FNUM': FNUM, File number function
+-* `FPUT': FPUT, Write a single character in stream mode to stdout
+-* `FPUTC': FPUTC, Write a single character in stream mode
+-* `FRACTION': FRACTION, Fractional part of the model representation
+-* `FREE': FREE, Memory de-allocation subroutine
+-* `FSEEK': FSEEK, Low level file positioning subroutine
+-* `FSTAT': FSTAT, Get file status
+-* `FTELL': FTELL, Current stream position
+-* `GAMMA': GAMMA, Gamma function
+-* `GERROR': GERROR, Get last system error message
+-* `GETARG': GETARG, Get command line arguments
+-* `GET_COMMAND': GET_COMMAND, Get the entire command line
+-* `GET_COMMAND_ARGUMENT': GET_COMMAND_ARGUMENT, Get command line arguments
+-* `GETCWD': GETCWD, Get current working directory
+-* `GETENV': GETENV, Get an environmental variable
+-* `GET_ENVIRONMENT_VARIABLE': GET_ENVIRONMENT_VARIABLE, Get an environmental variable
+-* `GETGID': GETGID, Group ID function
+-* `GETLOG': GETLOG, Get login name
+-* `GETPID': GETPID, Process ID function
+-* `GETUID': GETUID, User ID function
+-* `GMTIME': GMTIME, Convert time to GMT info
+-* `HOSTNM': HOSTNM, Get system host name
+-* `HUGE': HUGE, Largest number of a kind
+-* `HYPOT': HYPOT, Euclidian distance function
+-* `IACHAR': IACHAR, Code in ASCII collating sequence
+-* `IAND': IAND, Bitwise logical and
+-* `IARGC': IARGC, Get the number of command line arguments
+-* `IBCLR': IBCLR, Clear bit
+-* `IBITS': IBITS, Bit extraction
+-* `IBSET': IBSET, Set bit
+-* `ICHAR': ICHAR, Character-to-integer conversion function
+-* `IDATE': IDATE, Current local time (day/month/year)
+-* `IEOR': IEOR, Bitwise logical exclusive or
+-* `IERRNO': IERRNO, Function to get the last system error number
+-* `INDEX': INDEX intrinsic, Position of a substring within a string
+-* `INT': INT, Convert to integer type
+-* `INT2': INT2, Convert to 16-bit integer type
+-* `INT8': INT8, Convert to 64-bit integer type
+-* `IOR': IOR, Bitwise logical or
+-* `IRAND': IRAND, Integer pseudo-random number
+-* `IS_IOSTAT_END': IS_IOSTAT_END, Test for end-of-file value
+-* `IS_IOSTAT_EOR': IS_IOSTAT_EOR, Test for end-of-record value
+-* `ISATTY': ISATTY, Whether a unit is a terminal device
+-* `ISHFT': ISHFT, Shift bits
+-* `ISHFTC': ISHFTC, Shift bits circularly
+-* `ISNAN': ISNAN, Tests for a NaN
+-* `ITIME': ITIME, Current local time (hour/minutes/seconds)
+-* `KILL': KILL, Send a signal to a process
+-* `KIND': KIND, Kind of an entity
+-* `LBOUND': LBOUND, Lower dimension bounds of an array
+-* `LEADZ': LEADZ, Number of leading zero bits of an integer
+-* `LEN': LEN, Length of a character entity
+-* `LEN_TRIM': LEN_TRIM, Length of a character entity without trailing blank characters
+-* `LOG_GAMMA': LOG_GAMMA, Logarithm of the Gamma function
+-* `LGE': LGE, Lexical greater than or equal
+-* `LGT': LGT, Lexical greater than
+-* `LINK': LINK, Create a hard link
+-* `LLE': LLE, Lexical less than or equal
+-* `LLT': LLT, Lexical less than
+-* `LNBLNK': LNBLNK, Index of the last non-blank character in a string
+-* `LOC': LOC, Returns the address of a variable
+-* `LOG': LOG, Logarithm function
+-* `LOG10': LOG10, Base 10 logarithm function
+-* `LOGICAL': LOGICAL, Convert to logical type
+-* `LONG': LONG, Convert to integer type
+-* `LSHIFT': LSHIFT, Left shift bits
+-* `LSTAT': LSTAT, Get file status
+-* `LTIME': LTIME, Convert time to local time info
+-* `MALLOC': MALLOC, Dynamic memory allocation function
+-* `MATMUL': MATMUL, matrix multiplication
+-* `MAX': MAX, Maximum value of an argument list
+-* `MAXEXPONENT': MAXEXPONENT, Maximum exponent of a real kind
+-* `MAXLOC': MAXLOC, Location of the maximum value within an array
+-* `MAXVAL': MAXVAL, Maximum value of an array
+-* `MCLOCK': MCLOCK, Time function
+-* `MCLOCK8': MCLOCK8, Time function (64-bit)
+-* `MERGE': MERGE, Merge arrays
+-* `MIN': MIN, Minimum value of an argument list
+-* `MINEXPONENT': MINEXPONENT, Minimum exponent of a real kind
+-* `MINLOC': MINLOC, Location of the minimum value within an array
+-* `MINVAL': MINVAL, Minimum value of an array
+-* `MOD': MOD, Remainder function
+-* `MODULO': MODULO, Modulo function
+-* `MOVE_ALLOC': MOVE_ALLOC, Move allocation from one object to another
+-* `MVBITS': MVBITS, Move bits from one integer to another
+-* `NEAREST': NEAREST, Nearest representable number
+-* `NEW_LINE': NEW_LINE, New line character
+-* `NINT': NINT, Nearest whole number
+-* `NOT': NOT, Logical negation
+-* `NULL': NULL, Function that returns an disassociated pointer
+-* `OR': OR, Bitwise logical OR
+-* `PACK': PACK, Pack an array into an array of rank one
+-* `PERROR': PERROR, Print system error message
+-* `PRECISION': PRECISION, Decimal precision of a real kind
+-* `PRESENT': PRESENT, Determine whether an optional dummy argument is specified
+-* `PRODUCT': PRODUCT, Product of array elements
+-* `RADIX': RADIX, Base of a data model
+-* `RANDOM_NUMBER': RANDOM_NUMBER, Pseudo-random number
+-* `RANDOM_SEED': RANDOM_SEED, Initialize a pseudo-random number sequence
+-* `RAND': RAND, Real pseudo-random number
+-* `RANGE': RANGE, Decimal exponent range
+-* `RAN': RAN, Real pseudo-random number
+-* `REAL': REAL, Convert to real type
+-* `RENAME': RENAME, Rename a file
+-* `REPEAT': REPEAT, Repeated string concatenation
+-* `RESHAPE': RESHAPE, Function to reshape an array
+-* `RRSPACING': RRSPACING, Reciprocal of the relative spacing
+-* `RSHIFT': RSHIFT, Right shift bits
+-* `SCALE': SCALE, Scale a real value
+-* `SCAN': SCAN, Scan a string for the presence of a set of characters
+-* `SECNDS': SECNDS, Time function
+-* `SECOND': SECOND, CPU time function
+-* `SELECTED_CHAR_KIND': SELECTED_CHAR_KIND, Choose character kind
+-* `SELECTED_INT_KIND': SELECTED_INT_KIND, Choose integer kind
+-* `SELECTED_REAL_KIND': SELECTED_REAL_KIND, Choose real kind
+-* `SET_EXPONENT': SET_EXPONENT, Set the exponent of the model
+-* `SHAPE': SHAPE, Determine the shape of an array
+-* `SIGN': SIGN, Sign copying function
+-* `SIGNAL': SIGNAL, Signal handling subroutine (or function)
+-* `SIN': SIN, Sine function
+-* `SINH': SINH, Hyperbolic sine function
+-* `SIZE': SIZE, Function to determine the size of an array
+-* `SIZEOF': SIZEOF, Determine the size in bytes of an expression
+-* `SLEEP': SLEEP, Sleep for the specified number of seconds
+-* `SNGL': SNGL, Convert double precision real to default real
+-* `SPACING': SPACING, Smallest distance between two numbers of a given type
+-* `SPREAD': SPREAD, Add a dimension to an array
+-* `SQRT': SQRT, Square-root function
+-* `SRAND': SRAND, Reinitialize the random number generator
+-* `STAT': STAT, Get file status
+-* `SUM': SUM, Sum of array elements
+-* `SYMLNK': SYMLNK, Create a symbolic link
+-* `SYSTEM': SYSTEM, Execute a shell command
+-* `SYSTEM_CLOCK': SYSTEM_CLOCK, Time function
+-* `TAN': TAN, Tangent function
+-* `TANH': TANH, Hyperbolic tangent function
+-* `TIME': TIME, Time function
+-* `TIME8': TIME8, Time function (64-bit)
+-* `TINY': TINY, Smallest positive number of a real kind
+-* `TRAILZ': TRAILZ, Number of trailing zero bits of an integer
+-* `TRANSFER': TRANSFER, Transfer bit patterns
+-* `TRANSPOSE': TRANSPOSE, Transpose an array of rank two
+-* `TRIM': TRIM, Remove trailing blank characters of a string
+-* `TTYNAM': TTYNAM, Get the name of a terminal device.
+-* `UBOUND': UBOUND, Upper dimension bounds of an array
+-* `UMASK': UMASK, Set the file creation mask
+-* `UNLINK': UNLINK, Remove a file from the file system
+-* `UNPACK': UNPACK, Unpack an array of rank one into an array
+-* `VERIFY': VERIFY, Scan a string for the absence of a set of characters
+-* `XOR': XOR, Bitwise logical exclusive or
+-
+-
+-File: gfortran.info, Node: Introduction to Intrinsics, Next: ABORT, Up: Intrinsic Procedures
+-
+-7.1 Introduction to intrinsic procedures
+-========================================
+-
+-The intrinsic procedures provided by GNU Fortran include all of the
+-intrinsic procedures required by the Fortran 95 standard, a set of
+-intrinsic procedures for backwards compatibility with G77, and a
+-selection of intrinsic procedures from the Fortran 2003 and Fortran 2008
+-standards. Any conflict between a description here and a description in
+-either the Fortran 95 standard, the Fortran 2003 standard or the Fortran
+-2008 standard is unintentional, and the standard(s) should be considered
+-authoritative.
+-
+- The enumeration of the `KIND' type parameter is processor defined in
+-the Fortran 95 standard. GNU Fortran defines the default integer type
+-and default real type by `INTEGER(KIND=4)' and `REAL(KIND=4)',
+-respectively. The standard mandates that both data types shall have
+-another kind, which have more precision. On typical target
+-architectures supported by `gfortran', this kind type parameter is
+-`KIND=8'. Hence, `REAL(KIND=8)' and `DOUBLE PRECISION' are equivalent.
+-In the description of generic intrinsic procedures, the kind type
+-parameter will be specified by `KIND=*', and in the description of
+-specific names for an intrinsic procedure the kind type parameter will
+-be explicitly given (e.g., `REAL(KIND=4)' or `REAL(KIND=8)'). Finally,
+-for brevity the optional `KIND=' syntax will be omitted.
+-
+- Many of the intrinsic procedures take one or more optional arguments.
+-This document follows the convention used in the Fortran 95 standard,
+-and denotes such arguments by square brackets.
+-
+- GNU Fortran offers the `-std=f95' and `-std=gnu' options, which can
+-be used to restrict the set of intrinsic procedures to a given
+-standard. By default, `gfortran' sets the `-std=gnu' option, and so
+-all intrinsic procedures described here are accepted. There is one
+-caveat. For a select group of intrinsic procedures, `g77' implemented
+-both a function and a subroutine. Both classes have been implemented
+-in `gfortran' for backwards compatibility with `g77'. It is noted here
+-that these functions and subroutines cannot be intermixed in a given
+-subprogram. In the descriptions that follow, the applicable standard
+-for each intrinsic procedure is noted.
+-
+-
+-File: gfortran.info, Node: ABORT, Next: ABS, Prev: Introduction to Intrinsics, Up: Intrinsic Procedures
+-
+-7.2 `ABORT' -- Abort the program
+-================================
+-
+-_Description_:
+- `ABORT' causes immediate termination of the program. On operating
+- systems that support a core dump, `ABORT' will produce a core dump
+- even if the option `-fno-dump-core' is in effect, which is
+- suitable for debugging purposes.
+-
+-_Standard_:
+- GNU extension
+-
+-_Class_:
+- Subroutine
+-
+-_Syntax_:
+- `CALL ABORT'
+-
+-_Return value_:
+- Does not return.
+-
+-_Example_:
+- program test_abort
+- integer :: i = 1, j = 2
+- if (i /= j) call abort
+- end program test_abort
+-
+-_See also_:
+- *note EXIT::, *note KILL::
+-
+-
+-
+-File: gfortran.info, Node: ABS, Next: ACCESS, Prev: ABORT, Up: Intrinsic Procedures
+-
+-7.3 `ABS' -- Absolute value
+-===========================
+-
+-_Description_:
+- `ABS(A)' computes the absolute value of `A'.
+-
+-_Standard_:
+- Fortran 77 and later, has overloads that are GNU extensions
+-
+-_Class_:
+- Elemental function
+-
+-_Syntax_:
+- `RESULT = ABS(A)'
+-
+-_Arguments_:
+- A The type of the argument shall be an `INTEGER',
+- `REAL', or `COMPLEX'.
+-
+-_Return value_:
+- The return value is of the same type and kind as the argument
+- except the return value is `REAL' for a `COMPLEX' argument.
+-
+-_Example_:
+- program test_abs
+- integer :: i = -1
+- real :: x = -1.e0
+- complex :: z = (-1.e0,0.e0)
+- i = abs(i)
+- x = abs(x)
+- x = abs(z)
+- end program test_abs
+-
+-_Specific names_:
+- Name Argument Return type Standard
+- `CABS(A)' `COMPLEX(4) `REAL(4)' Fortran 77 and
+- Z' later
+- `DABS(A)' `REAL(8) `REAL(8)' Fortran 77 and
+- X' later
+- `IABS(A)' `INTEGER(4) `INTEGER(4)' Fortran 77 and
+- I' later
+- `ZABS(A)' `COMPLEX(8) `COMPLEX(8)' GNU extension
+- Z'
+- `CDABS(A)' `COMPLEX(8) `COMPLEX(8)' GNU extension
+- Z'
+-
+-
+-File: gfortran.info, Node: ACCESS, Next: ACHAR, Prev: ABS, Up: Intrinsic Procedures
+-
+-7.4 `ACCESS' -- Checks file access modes
+-========================================
+-
+-_Description_:
+- `ACCESS(NAME, MODE)' checks whether the file NAME exists, is
+- readable, writable or executable. Except for the executable check,
+- `ACCESS' can be replaced by Fortran 95's `INQUIRE'.
+-
+-_Standard_:
+- GNU extension
+-
+-_Class_:
+- Inquiry function
+-
+-_Syntax_:
+- `RESULT = ACCESS(NAME, MODE)'
+-
+-_Arguments_:
+- NAME Scalar `CHARACTER' of default kind with the
+- file name. Tailing blank are ignored unless
+- the character `achar(0)' is present, then all
+- characters up to and excluding `achar(0)' are
+- used as file name.
+- MODE Scalar `CHARACTER' of default kind with the
+- file access mode, may be any concatenation of
+- `"r"' (readable), `"w"' (writable) and `"x"'
+- (executable), or `" "' to check for existence.
+-
+-_Return value_:
+- Returns a scalar `INTEGER', which is `0' if the file is accessible
+- in the given mode; otherwise or if an invalid argument has been
+- given for `MODE' the value `1' is returned.
+-
+-_Example_:
+- program access_test
+- implicit none
+- character(len=*), parameter :: file = 'test.dat'
+- character(len=*), parameter :: file2 = 'test.dat '//achar(0)
+- if(access(file,' ') == 0) print *, trim(file),' is exists'
+- if(access(file,'r') == 0) print *, trim(file),' is readable'
+- if(access(file,'w') == 0) print *, trim(file),' is writable'
+- if(access(file,'x') == 0) print *, trim(file),' is executable'
+- if(access(file2,'rwx') == 0) &
+- print *, trim(file2),' is readable, writable and executable'
+- end program access_test
+-
+-_Specific names_:
+-
+-_See also_:
+-
+-
+-File: gfortran.info, Node: ACHAR, Next: ACOS, Prev: ACCESS, Up: Intrinsic Procedures
+-
+-7.5 `ACHAR' -- Character in ASCII collating sequence
+-====================================================
+-
+-_Description_:
+- `ACHAR(I)' returns the character located at position `I' in the
+- ASCII collating sequence.
+-
+-_Standard_:
+- Fortran 77 and later, with KIND argument Fortran 2003 and later
+-
+-_Class_:
+- Elemental function
+-
+-_Syntax_:
+- `RESULT = ACHAR(I [, KIND])'
+-
+-_Arguments_:
+- I The type shall be `INTEGER'.
+- KIND (Optional) An `INTEGER' initialization
+- expression indicating the kind parameter of
+- the result.
+-
+-_Return value_:
+- The return value is of type `CHARACTER' with a length of one. If
+- the KIND argument is present, the return value is of the specified
+- kind and of the default kind otherwise.
+-
+-_Example_:
+- program test_achar
+- character c
+- c = achar(32)
+- end program test_achar
+-
+-_Note_:
+- See *note ICHAR:: for a discussion of converting between numerical
+- values and formatted string representations.
+-
+-_See also_:
+- *note CHAR::, *note IACHAR::, *note ICHAR::
+-
+-
+-
+-File: gfortran.info, Node: ACOS, Next: ACOSH, Prev: ACHAR, Up: Intrinsic Procedures
+-
+-7.6 `ACOS' -- Arccosine function
+-================================
+-
+-_Description_:
+- `ACOS(X)' computes the arccosine of X (inverse of `COS(X)').
+-
+-_Standard_:
+- Fortran 77 and later
+-
+-_Class_:
+- Elemental function
+-
+-_Syntax_:
+- `RESULT = ACOS(X)'
+-
+-_Arguments_:
+- X The type shall be `REAL' with a magnitude that
+- is less than or equal to one.
+-
+-_Return value_:
+- The return value is of type `REAL' and it lies in the range 0
+- \leq \acos(x) \leq \pi. The return value if of the same kind as X.
+-
+-_Example_:
+- program test_acos
+- real(8) :: x = 0.866_8
+- x = acos(x)
+- end program test_acos
+-
+-_Specific names_:
+- Name Argument Return type Standard
+- `DACOS(X)' `REAL(8) X' `REAL(8)' Fortran 77 and
+- later
+-
+-_See also_:
+- Inverse function: *note COS::
+-
+-
+-
+-File: gfortran.info, Node: ACOSH, Next: ADJUSTL, Prev: ACOS, Up: Intrinsic Procedures
+-
+-7.7 `ACOSH' -- Hyperbolic arccosine function
+-============================================
+-
+-_Description_:
+- `ACOSH(X)' computes the hyperbolic arccosine of X (inverse of
+- `COSH(X)').
+-
+-_Standard_:
+- Fortran 2008 and later
+-
+-_Class_:
+- Elemental function
+-
+-_Syntax_:
+- `RESULT = ACOSH(X)'
+-
+-_Arguments_:
+- X The type shall be `REAL' or `COMPLEX'.
+-
+-_Return value_:
+- The return value has the same type and kind as X
+-
+-_Example_:
+- PROGRAM test_acosh
+- REAL(8), DIMENSION(3) :: x = (/ 1.0, 2.0, 3.0 /)
+- WRITE (*,*) ACOSH(x)
+- END PROGRAM
+-
+-_Specific names_:
+- Name Argument Return type Standard
+- `DACOSH(X)' `REAL(8) X' `REAL(8)' GNU extension
+-
+-_See also_:
+- Inverse function: *note COSH::
+-
+-
+-File: gfortran.info, Node: ADJUSTL, Next: ADJUSTR, Prev: ACOSH, Up: Intrinsic Procedures
+-
+-7.8 `ADJUSTL' -- Left adjust a string
+-=====================================
+-
+-_Description_:
+- `ADJUSTL(STRING)' will left adjust a string by removing leading
+- spaces. Spaces are inserted at the end of the string as needed.
+-
+-_Standard_:
+- Fortran 90 and later
+-
+-_Class_:
+- Elemental function
+-
+-_Syntax_:
+- `RESULT = ADJUSTL(STRING)'
+-
+-_Arguments_:
+- STRING The type shall be `CHARACTER'.
+-
+-_Return value_:
+- The return value is of type `CHARACTER' and of the same kind as
+- STRING where leading spaces are removed and the same number of
+- spaces are inserted on the end of STRING.
+-
+-_Example_:
+- program test_adjustl
+- character(len=20) :: str = ' gfortran'
+- str = adjustl(str)
+- print *, str
+- end program test_adjustl
+-
+-_See also_:
+- *note ADJUSTR::, *note TRIM::
+-
+-
+-File: gfortran.info, Node: ADJUSTR, Next: AIMAG, Prev: ADJUSTL, Up: Intrinsic Procedures
+-
+-7.9 `ADJUSTR' -- Right adjust a string
+-======================================
+-
+-_Description_:
+- `ADJUSTR(STRING)' will right adjust a string by removing trailing
+- spaces. Spaces are inserted at the start of the string as needed.
+-
+-_Standard_:
+- Fortran 95 and later
+-
+-_Class_:
+- Elemental function
+-
+-_Syntax_:
+- `RESULT = ADJUSTR(STRING)'
+-
+-_Arguments_:
+- STR The type shall be `CHARACTER'.
+-
+-_Return value_:
+- The return value is of type `CHARACTER' and of the same kind as
+- STRING where trailing spaces are removed and the same number of
+- spaces are inserted at the start of STRING.
+-
+-_Example_:
+- program test_adjustr
+- character(len=20) :: str = 'gfortran'
+- str = adjustr(str)
+- print *, str
+- end program test_adjustr
+-
+-_See also_:
+- *note ADJUSTL::, *note TRIM::
+-
+-
+-File: gfortran.info, Node: AIMAG, Next: AINT, Prev: ADJUSTR, Up: Intrinsic Procedures
+-
+-7.10 `AIMAG' -- Imaginary part of complex number
+-================================================
+-
+-_Description_:
+- `AIMAG(Z)' yields the imaginary part of complex argument `Z'. The
+- `IMAG(Z)' and `IMAGPART(Z)' intrinsic functions are provided for
+- compatibility with `g77', and their use in new code is strongly
+- discouraged.
+-
+-_Standard_:
+- Fortran 77 and later, has overloads that are GNU extensions
+-
+-_Class_:
+- Elemental function
+-
+-_Syntax_:
+- `RESULT = AIMAG(Z)'
+-
+-_Arguments_:
+- Z The type of the argument shall be `COMPLEX'.
+-
+-_Return value_:
+- The return value is of type `REAL' with the kind type parameter of
+- the argument.
+-
+-_Example_:
+- program test_aimag
+- complex(4) z4
+- complex(8) z8
+- z4 = cmplx(1.e0_4, 0.e0_4)
+- z8 = cmplx(0.e0_8, 1.e0_8)
+- print *, aimag(z4), dimag(z8)
+- end program test_aimag
+-
+-_Specific names_:
+- Name Argument Return type Standard
+- `DIMAG(Z)' `COMPLEX(8) `REAL(8)' GNU extension
+- Z'
+- `IMAG(Z)' `COMPLEX Z' `REAL' GNU extension
+- `IMAGPART(Z)' `COMPLEX Z' `REAL' GNU extension
+-
+-
+-File: gfortran.info, Node: AINT, Next: ALARM, Prev: AIMAG, Up: Intrinsic Procedures
+-
+-7.11 `AINT' -- Truncate to a whole number
+-=========================================
+-
+-_Description_:
+- `AINT(A [, KIND])' truncates its argument to a whole number.
+-
+-_Standard_:
+- Fortran 77 and later
+-
+-_Class_:
+- Elemental function
+-
+-_Syntax_:
+- `RESULT = AINT(A [, KIND])'
+-
+-_Arguments_:
+- A The type of the argument shall be `REAL'.
+- KIND (Optional) An `INTEGER' initialization
+- expression indicating the kind parameter of
+- the result.
+-
+-_Return value_:
+- The return value is of type `REAL' with the kind type parameter of
+- the argument if the optional KIND is absent; otherwise, the kind
+- type parameter will be given by KIND. If the magnitude of X is
+- less than one, `AINT(X)' returns zero. If the magnitude is equal
+- to or greater than one then it returns the largest whole number
+- that does not exceed its magnitude. The sign is the same as the
+- sign of X.
+-
+-_Example_:
+- program test_aint
+- real(4) x4
+- real(8) x8
+- x4 = 1.234E0_4
+- x8 = 4.321_8
+- print *, aint(x4), dint(x8)
+- x8 = aint(x4,8)
+- end program test_aint
+-
+-_Specific names_:
+- Name Argument Return type Standard
+- `DINT(X)' `REAL(8) X' `REAL(8)' Fortran 77 and
+- later
+-
+-
+-File: gfortran.info, Node: ALARM, Next: ALL, Prev: AINT, Up: Intrinsic Procedures
+-
+-7.12 `ALARM' -- Execute a routine after a given delay
+-=====================================================
+-
+-_Description_:
+- `ALARM(SECONDS, HANDLER [, STATUS])' causes external subroutine
+- HANDLER to be executed after a delay of SECONDS by using
+- `alarm(2)' to set up a signal and `signal(2)' to catch it. If
+- STATUS is supplied, it will be returned with the number of seconds
+- remaining until any previously scheduled alarm was due to be
+- delivered, or zero if there was no previously scheduled alarm.
+-
+-_Standard_:
+- GNU extension
+-
+-_Class_:
+- Subroutine
+-
+-_Syntax_:
+- `CALL ALARM(SECONDS, HANDLER [, STATUS])'
+-
+-_Arguments_:
+- SECONDS The type of the argument shall be a scalar
+- `INTEGER'. It is `INTENT(IN)'.
+- HANDLER Signal handler (`INTEGER FUNCTION' or
+- `SUBROUTINE') or dummy/global `INTEGER'
+- scalar. The scalar values may be either
+- `SIG_IGN=1' to ignore the alarm generated or
+- `SIG_DFL=0' to set the default action. It is
+- `INTENT(IN)'.
+- STATUS (Optional) STATUS shall be a scalar variable
+- of the default `INTEGER' kind. It is
+- `INTENT(OUT)'.
+-
+-_Example_:
+- program test_alarm
+- external handler_print
+- integer i
+- call alarm (3, handler_print, i)
+- print *, i
+- call sleep(10)
+- end program test_alarm
+- This will cause the external routine HANDLER_PRINT to be called
+- after 3 seconds.
+-
+-
+-File: gfortran.info, Node: ALL, Next: ALLOCATED, Prev: ALARM, Up: Intrinsic Procedures
+-
+-7.13 `ALL' -- All values in MASK along DIM are true
+-===================================================
+-
+-_Description_:
+- `ALL(MASK [, DIM])' determines if all the values are true in MASK
+- in the array along dimension DIM.
+-
+-_Standard_:
+- Fortran 95 and later
+-
+-_Class_:
+- Transformational function
+-
+-_Syntax_:
+- `RESULT = ALL(MASK [, DIM])'
+-
+-_Arguments_:
+- MASK The type of the argument shall be `LOGICAL' and
+- it shall not be scalar.
+- DIM (Optional) DIM shall be a scalar integer with
+- a value that lies between one and the rank of
+- MASK.
+-
+-_Return value_:
+- `ALL(MASK)' returns a scalar value of type `LOGICAL' where the
+- kind type parameter is the same as the kind type parameter of
+- MASK. If DIM is present, then `ALL(MASK, DIM)' returns an array
+- with the rank of MASK minus 1. The shape is determined from the
+- shape of MASK where the DIM dimension is elided.
+-
+- (A)
+- `ALL(MASK)' is true if all elements of MASK are true. It
+- also is true if MASK has zero size; otherwise, it is false.
+-
+- (B)
+- If the rank of MASK is one, then `ALL(MASK,DIM)' is equivalent
+- to `ALL(MASK)'. If the rank is greater than one, then
+- `ALL(MASK,DIM)' is determined by applying `ALL' to the array
+- sections.
+-
+-_Example_:
+- program test_all
+- logical l
+- l = all((/.true., .true., .true./))
+- print *, l
+- call section
+- contains
+- subroutine section
+- integer a(2,3), b(2,3)
+- a = 1
+- b = 1
+- b(2,2) = 2
+- print *, all(a .eq. b, 1)
+- print *, all(a .eq. b, 2)
+- end subroutine section
+- end program test_all
+-
+-
+-File: gfortran.info, Node: ALLOCATED, Next: AND, Prev: ALL, Up: Intrinsic Procedures
+-
+-7.14 `ALLOCATED' -- Status of an allocatable entity
+-===================================================
+-
+-_Description_:
+- `ALLOCATED(ARRAY)' checks the status of whether X is allocated.
+-
+-_Standard_:
+- Fortran 95 and later
+-
+-_Class_:
+- Inquiry function
+-
+-_Syntax_:
+- `RESULT = ALLOCATED(ARRAY)'
+-
+-_Arguments_:
+- ARRAY The argument shall be an `ALLOCATABLE' array.
+-
+-_Return value_:
+- The return value is a scalar `LOGICAL' with the default logical
+- kind type parameter. If ARRAY is allocated, `ALLOCATED(ARRAY)' is
+- `.TRUE.'; otherwise, it returns `.FALSE.'
+-
+-_Example_:
+- program test_allocated
+- integer :: i = 4
+- real(4), allocatable :: x(:)
+- if (.not. allocated(x)) allocate(x(i))
+- end program test_allocated
+-
+-
+-File: gfortran.info, Node: AND, Next: ANINT, Prev: ALLOCATED, Up: Intrinsic Procedures
+-
+-7.15 `AND' -- Bitwise logical AND
+-=================================
+-
+-_Description_:
+- Bitwise logical `AND'.
+-
+- This intrinsic routine is provided for backwards compatibility with
+- GNU Fortran 77. For integer arguments, programmers should consider
+- the use of the *note IAND:: intrinsic defined by the Fortran
+- standard.
+-
+-_Standard_:
+- GNU extension
+-
+-_Class_:
+- Function
+-
+-_Syntax_:
+- `RESULT = AND(I, J)'
+-
+-_Arguments_:
+- I The type shall be either a scalar `INTEGER'
+- type or a scalar `LOGICAL' type.
+- J The type shall be the same as the type of I.
+-
+-_Return value_:
+- The return type is either a scalar `INTEGER' or a scalar
+- `LOGICAL'. If the kind type parameters differ, then the smaller
+- kind type is implicitly converted to larger kind, and the return
+- has the larger kind.
+-
+-_Example_:
+- PROGRAM test_and
+- LOGICAL :: T = .TRUE., F = .FALSE.
+- INTEGER :: a, b
+- DATA a / Z'F' /, b / Z'3' /
+-
+- WRITE (*,*) AND(T, T), AND(T, F), AND(F, T), AND(F, F)
+- WRITE (*,*) AND(a, b)
+- END PROGRAM
+-
+-_See also_:
+- Fortran 95 elemental function: *note IAND::
+-
+-
+-File: gfortran.info, Node: ANINT, Next: ANY, Prev: AND, Up: Intrinsic Procedures
+-
+-7.16 `ANINT' -- Nearest whole number
+-====================================
+-
+-_Description_:
+- `ANINT(A [, KIND])' rounds its argument to the nearest whole
+- number.
+-
+-_Standard_:
+- Fortran 77 and later
+-
+-_Class_:
+- Elemental function
+-
+-_Syntax_:
+- `RESULT = ANINT(A [, KIND])'
+-
+-_Arguments_:
+- A The type of the argument shall be `REAL'.
+- KIND (Optional) An `INTEGER' initialization
+- expression indicating the kind parameter of
+- the result.
+-
+-_Return value_:
+- The return value is of type real with the kind type parameter of
+- the argument if the optional KIND is absent; otherwise, the kind
+- type parameter will be given by KIND. If A is greater than zero,
+- `ANINT(A)' returns `AINT(X+0.5)'. If A is less than or equal to
+- zero then it returns `AINT(X-0.5)'.
+-
+-_Example_:
+- program test_anint
+- real(4) x4
+- real(8) x8
+- x4 = 1.234E0_4
+- x8 = 4.321_8
+- print *, anint(x4), dnint(x8)
+- x8 = anint(x4,8)
+- end program test_anint
+-
+-_Specific names_:
+- Name Argument Return type Standard
+- `DNINT(A)' `REAL(8) A' `REAL(8)' Fortran 77 and
+- later
+-
+-
+-File: gfortran.info, Node: ANY, Next: ASIN, Prev: ANINT, Up: Intrinsic Procedures
+-
+-7.17 `ANY' -- Any value in MASK along DIM is true
+-=================================================
+-
+-_Description_:
+- `ANY(MASK [, DIM])' determines if any of the values in the logical
+- array MASK along dimension DIM are `.TRUE.'.
+-
+-_Standard_:
+- Fortran 95 and later
+-
+-_Class_:
+- Transformational function
+-
+-_Syntax_:
+- `RESULT = ANY(MASK [, DIM])'
+-
+-_Arguments_:
+- MASK The type of the argument shall be `LOGICAL' and
+- it shall not be scalar.
+- DIM (Optional) DIM shall be a scalar integer with
+- a value that lies between one and the rank of
+- MASK.
+-
+-_Return value_:
+- `ANY(MASK)' returns a scalar value of type `LOGICAL' where the
+- kind type parameter is the same as the kind type parameter of
+- MASK. If DIM is present, then `ANY(MASK, DIM)' returns an array
+- with the rank of MASK minus 1. The shape is determined from the
+- shape of MASK where the DIM dimension is elided.
+-
+- (A)
+- `ANY(MASK)' is true if any element of MASK is true;
+- otherwise, it is false. It also is false if MASK has zero
+- size.
+-
+- (B)
+- If the rank of MASK is one, then `ANY(MASK,DIM)' is equivalent
+- to `ANY(MASK)'. If the rank is greater than one, then
+- `ANY(MASK,DIM)' is determined by applying `ANY' to the array
+- sections.
+-
+-_Example_:
+- program test_any
+- logical l
+- l = any((/.true., .true., .true./))
+- print *, l
+- call section
+- contains
+- subroutine section
+- integer a(2,3), b(2,3)
+- a = 1
+- b = 1
+- b(2,2) = 2
+- print *, any(a .eq. b, 1)
+- print *, any(a .eq. b, 2)
+- end subroutine section
+- end program test_any
+-
+-
+-File: gfortran.info, Node: ASIN, Next: ASINH, Prev: ANY, Up: Intrinsic Procedures
+-
+-7.18 `ASIN' -- Arcsine function
+-===============================
+-
+-_Description_:
+- `ASIN(X)' computes the arcsine of its X (inverse of `SIN(X)').
+-
+-_Standard_:
+- Fortran 77 and later
+-
+-_Class_:
+- Elemental function
+-
+-_Syntax_:
+- `RESULT = ASIN(X)'
+-
+-_Arguments_:
+- X The type shall be `REAL', and a magnitude that
+- is less than or equal to one.
+-
+-_Return value_:
+- The return value is of type `REAL' and it lies in the range -\pi /
+- 2 \leq \asin (x) \leq \pi / 2. The kind type parameter is the
+- same as X.
+-
+-_Example_:
+- program test_asin
+- real(8) :: x = 0.866_8
+- x = asin(x)
+- end program test_asin
+-
+-_Specific names_:
+- Name Argument Return type Standard
+- `DASIN(X)' `REAL(8) X' `REAL(8)' Fortran 77 and
+- later
+-
+-_See also_:
+- Inverse function: *note SIN::
+-
+-
+-
+-File: gfortran.info, Node: ASINH, Next: ASSOCIATED, Prev: ASIN, Up: Intrinsic Procedures
+-
+-7.19 `ASINH' -- Hyperbolic arcsine function
+-===========================================
+-
+-_Description_:
+- `ASINH(X)' computes the hyperbolic arcsine of X (inverse of
+- `SINH(X)').
+-
+-_Standard_:
+- Fortran 2008 and later
+-
+-_Class_:
+- Elemental function
+-
+-_Syntax_:
+- `RESULT = ASINH(X)'
+-
+-_Arguments_:
+- X The type shall be `REAL' or `COMPLEX'.
+-
+-_Return value_:
+- The return value is of the same type and kind as X.
+-
+-_Example_:
+- PROGRAM test_asinh
+- REAL(8), DIMENSION(3) :: x = (/ -1.0, 0.0, 1.0 /)
+- WRITE (*,*) ASINH(x)
+- END PROGRAM
+-
+-_Specific names_:
+- Name Argument Return type Standard
+- `DASINH(X)' `REAL(8) X' `REAL(8)' GNU extension.
+-
+-_See also_:
+- Inverse function: *note SINH::
+-
+-
+-File: gfortran.info, Node: ASSOCIATED, Next: ATAN, Prev: ASINH, Up: Intrinsic Procedures
+-
+-7.20 `ASSOCIATED' -- Status of a pointer or pointer/target pair
+-===============================================================
+-
+-_Description_:
+- `ASSOCIATED(POINTER [, TARGET])' determines the status of the
+- pointer POINTER or if POINTER is associated with the target TARGET.
+-
+-_Standard_:
+- Fortran 95 and later
+-
+-_Class_:
+- Inquiry function
+-
+-_Syntax_:
+- `RESULT = ASSOCIATED(POINTER [, TARGET])'
+-
+-_Arguments_:
+- POINTER POINTER shall have the `POINTER' attribute and
+- it can be of any type.
+- TARGET (Optional) TARGET shall be a pointer or a
+- target. It must have the same type, kind type
+- parameter, and array rank as POINTER.
+- The association status of neither POINTER nor TARGET shall be
+- undefined.
+-
+-_Return value_:
+- `ASSOCIATED(POINTER)' returns a scalar value of type `LOGICAL(4)'.
+- There are several cases:
+- (A) When the optional TARGET is not present then
+- `ASSOCIATED(POINTER)' is true if POINTER is associated with a
+- target; otherwise, it returns false.
+-
+- (B) If TARGET is present and a scalar target, the result is true if
+- TARGET is not a zero-sized storage sequence and the target
+- associated with POINTER occupies the same storage units. If
+- POINTER is disassociated, the result is false.
+-
+- (C) If TARGET is present and an array target, the result is true if
+- TARGET and POINTER have the same shape, are not zero-sized
+- arrays, are arrays whose elements are not zero-sized storage
+- sequences, and TARGET and POINTER occupy the same storage
+- units in array element order. As in case(B), the result is
+- false, if POINTER is disassociated.
+-
+- (D) If TARGET is present and an scalar pointer, the result is true
+- if TARGET is associated with POINTER, the target associated
+- with TARGET are not zero-sized storage sequences and occupy
+- the same storage units. The result is false, if either
+- TARGET or POINTER is disassociated.
+-
+- (E) If TARGET is present and an array pointer, the result is true if
+- target associated with POINTER and the target associated with
+- TARGET have the same shape, are not zero-sized arrays, are
+- arrays whose elements are not zero-sized storage sequences,
+- and TARGET and POINTER occupy the same storage units in array
+- element order. The result is false, if either TARGET or
+- POINTER is disassociated.
+-
+-_Example_:
+- program test_associated
+- implicit none
+- real, target :: tgt(2) = (/1., 2./)
+- real, pointer :: ptr(:)
+- ptr => tgt
+- if (associated(ptr) .eqv. .false.) call abort
+- if (associated(ptr,tgt) .eqv. .false.) call abort
+- end program test_associated
+-
+-_See also_:
+- *note NULL::
+-
+-
+-File: gfortran.info, Node: ATAN, Next: ATAN2, Prev: ASSOCIATED, Up: Intrinsic Procedures
+-
+-7.21 `ATAN' -- Arctangent function
+-==================================
+-
+-_Description_:
+- `ATAN(X)' computes the arctangent of X.
+-
+-_Standard_:
+- Fortran 77 and later
+-
+-_Class_:
+- Elemental function
+-
+-_Syntax_:
+- `RESULT = ATAN(X)'
+-
+-_Arguments_:
+- X The type shall be `REAL'.
+-
+-_Return value_:
+- The return value is of type `REAL' and it lies in the range - \pi
+- / 2 \leq \atan (x) \leq \pi / 2.
+-
+-_Example_:
+- program test_atan
+- real(8) :: x = 2.866_8
+- x = atan(x)
+- end program test_atan
+-
+-_Specific names_:
+- Name Argument Return type Standard
+- `DATAN(X)' `REAL(8) X' `REAL(8)' Fortran 77 and
+- later
+-
+-_See also_:
+- Inverse function: *note TAN::
+-
+-
+-
+-File: gfortran.info, Node: ATAN2, Next: ATANH, Prev: ATAN, Up: Intrinsic Procedures
+-
+-7.22 `ATAN2' -- Arctangent function
+-===================================
+-
+-_Description_:
+- `ATAN2(Y, X)' computes the arctangent of the complex number X + i
+- Y.
+-
+-_Standard_:
+- Fortran 77 and later
+-
+-_Class_:
+- Elemental function
+-
+-_Syntax_:
+- `RESULT = ATAN2(Y, X)'
+-
+-_Arguments_:
+- Y The type shall be `REAL'.
+- X The type and kind type parameter shall be the
+- same as Y. If Y is zero, then X must be
+- nonzero.
+-
+-_Return value_:
+- The return value has the same type and kind type parameter as Y.
+- It is the principal value of the complex number X + i Y. If X is
+- nonzero, then it lies in the range -\pi \le \atan (x) \leq \pi.
+- The sign is positive if Y is positive. If Y is zero, then the
+- return value is zero if X is positive and \pi if X is negative.
+- Finally, if X is zero, then the magnitude of the result is \pi/2.
+-
+-_Example_:
+- program test_atan2
+- real(4) :: x = 1.e0_4, y = 0.5e0_4
+- x = atan2(y,x)
+- end program test_atan2
+-
+-_Specific names_:
+- Name Argument Return type Standard
+- `DATAN2(X)' `REAL(8) X' `REAL(8)' Fortran 77 and
+- later
+-
+-
+-File: gfortran.info, Node: ATANH, Next: BESSEL_J0, Prev: ATAN2, Up: Intrinsic Procedures
+-
+-7.23 `ATANH' -- Hyperbolic arctangent function
+-==============================================
+-
+-_Description_:
+- `ATANH(X)' computes the hyperbolic arctangent of X (inverse of
+- `TANH(X)').
+-
+-_Standard_:
+- Fortran 2008 and later
+-
+-_Class_:
+- Elemental function
+-
+-_Syntax_:
+- `RESULT = ATANH(X)'
+-
+-_Arguments_:
+- X The type shall be `REAL' or `COMPLEX'.
+-
+-_Return value_:
+- The return value has same type and kind as X.
+-
+-_Example_:
+- PROGRAM test_atanh
+- REAL, DIMENSION(3) :: x = (/ -1.0, 0.0, 1.0 /)
+- WRITE (*,*) ATANH(x)
+- END PROGRAM
+-
+-_Specific names_:
+- Name Argument Return type Standard
+- `DATANH(X)' `REAL(8) X' `REAL(8)' GNU extension
+-
+-_See also_:
+- Inverse function: *note TANH::
+-
+-
+-File: gfortran.info, Node: BESSEL_J0, Next: BESSEL_J1, Prev: ATANH, Up: Intrinsic Procedures
+-
+-7.24 `BESSEL_J0' -- Bessel function of the first kind of order 0
+-================================================================
+-
+-_Description_:
+- `BESSEL_J0(X)' computes the Bessel function of the first kind of
+- order 0 of X. This function is available under the name `BESJ0' as
+- a GNU extension.
+-
+-_Standard_:
+- Fortran 2008 and later
+-
+-_Class_:
+- Elemental function
+-
+-_Syntax_:
+- `RESULT = BESSEL_J0(X)'
+-
+-_Arguments_:
+- X The type shall be `REAL', and it shall be
+- scalar.
+-
+-_Return value_:
+- The return value is of type `REAL' and lies in the range -
+- 0.4027... \leq Bessel (0,x) \leq 1. It has the same kind as X.
+-
+-_Example_:
+- program test_besj0
+- real(8) :: x = 0.0_8
+- x = bessel_j0(x)
+- end program test_besj0
+-
+-_Specific names_:
+- Name Argument Return type Standard
+- `DBESJ0(X)' `REAL(8) X' `REAL(8)' GNU extension
+-
+-
+-File: gfortran.info, Node: BESSEL_J1, Next: BESSEL_JN, Prev: BESSEL_J0, Up: Intrinsic Procedures
+-
+-7.25 `BESSEL_J1' -- Bessel function of the first kind of order 1
+-================================================================
+-
+-_Description_:
+- `BESSEL_J1(X)' computes the Bessel function of the first kind of
+- order 1 of X. This function is available under the name `BESJ1' as
+- a GNU extension.
+-
+-_Standard_:
+- Fortran 2008
+-
+-_Class_:
+- Elemental function
+-
+-_Syntax_:
+- `RESULT = BESSEL_J1(X)'
+-
+-_Arguments_:
+- X The type shall be `REAL', and it shall be
+- scalar.
+-
+-_Return value_:
+- The return value is of type `REAL' and it lies in the range -
+- 0.5818... \leq Bessel (0,x) \leq 0.5818 . It has the same kind as
+- X.
+-
+-_Example_:
+- program test_besj1
+- real(8) :: x = 1.0_8
+- x = bessel_j1(x)
+- end program test_besj1
+-
+-_Specific names_:
+- Name Argument Return type Standard
+- `DBESJ1(X)' `REAL(8) X' `REAL(8)' GNU extension
+-
+-
+-File: gfortran.info, Node: BESSEL_JN, Next: BESSEL_Y0, Prev: BESSEL_J1, Up: Intrinsic Procedures
+-
+-7.26 `BESSEL_JN' -- Bessel function of the first kind
+-=====================================================
+-
+-_Description_:
+- `BESSEL_JN(N, X)' computes the Bessel function of the first kind of
+- order N of X. This function is available under the name `BESJN' as
+- a GNU extension.
+-
+- If both arguments are arrays, their ranks and shapes shall conform.
+-
+-_Standard_:
+- Fortran 2008 and later
+-
+-_Class_:
+- Elemental function
+-
+-_Syntax_:
+- `RESULT = BESSEL_JN(N, X)'
+-
+-_Arguments_:
+- N Shall be a scalar or an array of type
+- `INTEGER'.
+- X Shall be a scalar or an array of type `REAL'.
+-
+-_Return value_:
+- The return value is a scalar of type `REAL'. It has the same kind
+- as X.
+-
+-_Example_:
+- program test_besjn
+- real(8) :: x = 1.0_8
+- x = bessel_jn(5,x)
+- end program test_besjn
+-
+-_Specific names_:
+- Name Argument Return type Standard
+- `DBESJN(X)' `INTEGER N' `REAL(8)' GNU extension
+- `REAL(8) X'
+-
+-
+-File: gfortran.info, Node: BESSEL_Y0, Next: BESSEL_Y1, Prev: BESSEL_JN, Up: Intrinsic Procedures
+-
+-7.27 `BESSEL_Y0' -- Bessel function of the second kind of order 0
+-=================================================================
+-
+-_Description_:
+- `BESSEL_Y0(X)' computes the Bessel function of the second kind of
+- order 0 of X. This function is available under the name `BESY0' as
+- a GNU extension.
+-
+-_Standard_:
+- Fortran 2008 and later
+-
+-_Class_:
+- Elemental function
+-
+-_Syntax_:
+- `RESULT = BESSEL_Y0(X)'
+-
+-_Arguments_:
+- X The type shall be `REAL', and it shall be
+- scalar.
+-
+-_Return value_:
+- The return value is a scalar of type `REAL'. It has the same kind
+- as X.
+-
+-_Example_:
+- program test_besy0
+- real(8) :: x = 0.0_8
+- x = bessel_y0(x)
+- end program test_besy0
+-
+-_Specific names_:
+- Name Argument Return type Standard
+- `DBESY0(X)' `REAL(8) X' `REAL(8)' GNU extension
+-
+-
+-File: gfortran.info, Node: BESSEL_Y1, Next: BESSEL_YN, Prev: BESSEL_Y0, Up: Intrinsic Procedures
+-
+-7.28 `BESSEL_Y1' -- Bessel function of the second kind of order 1
+-=================================================================
+-
+-_Description_:
+- `BESSEL_Y1(X)' computes the Bessel function of the second kind of
+- order 1 of X. This function is available under the name `BESY1' as
+- a GNU extension.
+-
+-_Standard_:
+- Fortran 2008 and later
+-
+-_Class_:
+- Elemental function
+-
+-_Syntax_:
+- `RESULT = BESSEL_Y1(X)'
+-
+-_Arguments_:
+- X The type shall be `REAL', and it shall be
+- scalar.
+-
+-_Return value_:
+- The return value is a scalar of type `REAL'. It has the same kind
+- as X.
+-
+-_Example_:
+- program test_besy1
+- real(8) :: x = 1.0_8
+- x = bessel_y1(x)
+- end program test_besy1
+-
+-_Specific names_:
+- Name Argument Return type Standard
+- `DBESY1(X)' `REAL(8) X' `REAL(8)' GNU extension
+-
+-
+-File: gfortran.info, Node: BESSEL_YN, Next: BIT_SIZE, Prev: BESSEL_Y1, Up: Intrinsic Procedures
+-
+-7.29 `BESSEL_YN' -- Bessel function of the second kind
+-======================================================
+-
+-_Description_:
+- `BESSEL_YN(N, X)' computes the Bessel function of the second kind
+- of order N of X. This function is available under the name `BESYN'
+- as a GNU extension.
+-
+- If both arguments are arrays, their ranks and shapes shall conform.
+-
+-_Standard_:
+- Fortran 2008 and later
+-
+-_Class_:
+- Elemental function
+-
+-_Syntax_:
+- `RESULT = BESSEL_YN(N, X)'
+-
+-_Arguments_:
+- N Shall be a scalar or an array of type
+- `INTEGER'.
+- X Shall be a scalar or an array of type `REAL'.
+-
+-_Return value_:
+- The return value is a scalar of type `REAL'. It has the same kind
+- as X.
+-
+-_Example_:
+- program test_besyn
+- real(8) :: x = 1.0_8
+- x = bessel_yn(5,x)
+- end program test_besyn
+-
+-_Specific names_:
+- Name Argument Return type Standard
+- `DBESYN(N,X)' `INTEGER N' `REAL(8)' GNU extension
+- `REAL(8)
+- X'
+-
+-
+-File: gfortran.info, Node: BIT_SIZE, Next: BTEST, Prev: BESSEL_YN, Up: Intrinsic Procedures
+-
+-7.30 `BIT_SIZE' -- Bit size inquiry function
+-============================================
+-
+-_Description_:
+- `BIT_SIZE(I)' returns the number of bits (integer precision plus
+- sign bit) represented by the type of I. The result of
+- `BIT_SIZE(I)' is independent of the actual value of I.
+-
+-_Standard_:
+- Fortran 95 and later
+-
+-_Class_:
+- Inquiry function
+-
+-_Syntax_:
+- `RESULT = BIT_SIZE(I)'
+-
+-_Arguments_:
+- I The type shall be `INTEGER'.
+-
+-_Return value_:
+- The return value is of type `INTEGER'
+-
+-_Example_:
+- program test_bit_size
+- integer :: i = 123
+- integer :: size
+- size = bit_size(i)
+- print *, size
+- end program test_bit_size
+-
+-
+-File: gfortran.info, Node: BTEST, Next: C_ASSOCIATED, Prev: BIT_SIZE, Up: Intrinsic Procedures
+-
+-7.31 `BTEST' -- Bit test function
+-=================================
+-
+-_Description_:
+- `BTEST(I,POS)' returns logical `.TRUE.' if the bit at POS in I is
+- set. The counting of the bits starts at 0.
+-
+-_Standard_:
+- Fortran 95 and later
+-
+-_Class_:
+- Elemental function
+-
+-_Syntax_:
+- `RESULT = BTEST(I, POS)'
+-
+-_Arguments_:
+- I The type shall be `INTEGER'.
+- POS The type shall be `INTEGER'.
+-
+-_Return value_:
+- The return value is of type `LOGICAL'
+-
+-_Example_:
+- program test_btest
+- integer :: i = 32768 + 1024 + 64
+- integer :: pos
+- logical :: bool
+- do pos=0,16
+- bool = btest(i, pos)
+- print *, pos, bool
+- end do
+- end program test_btest
+-
+-
+-File: gfortran.info, Node: C_ASSOCIATED, Next: C_F_POINTER, Prev: BTEST, Up: Intrinsic Procedures
+-
+-7.32 `C_ASSOCIATED' -- Status of a C pointer
+-============================================
+-
+-_Description_:
+- `C_ASSOCIATED(c_prt_1[, c_ptr_2])' determines the status of the C
+- pointer C_PTR_1 or if C_PTR_1 is associated with the target
+- C_PTR_2.
+-
+-_Standard_:
+- Fortran 2003 and later
+-
+-_Class_:
+- Inquiry function
+-
+-_Syntax_:
+- `RESULT = C_ASSOCIATED(c_prt_1[, c_ptr_2])'
+-
+-_Arguments_:
+- C_PTR_1 Scalar of the type `C_PTR' or `C_FUNPTR'.
+- C_PTR_2 (Optional) Scalar of the same type as C_PTR_1.
+-
+-_Return value_:
+- The return value is of type `LOGICAL'; it is `.false.' if either
+- C_PTR_1 is a C NULL pointer or if C_PTR1 and C_PTR_2 point to
+- different addresses.
+-
+-_Example_:
+- subroutine association_test(a,b)
+- use iso_c_binding, only: c_associated, c_loc, c_ptr
+- implicit none
+- real, pointer :: a
+- type(c_ptr) :: b
+- if(c_associated(b, c_loc(a))) &
+- stop 'b and a do not point to same target'
+- end subroutine association_test
+-
+-_See also_:
+- *note C_LOC::, *note C_FUNLOC::
+-
+-
+-File: gfortran.info, Node: C_FUNLOC, Next: C_LOC, Prev: C_F_PROCPOINTER, Up: Intrinsic Procedures
+-
+-7.33 `C_FUNLOC' -- Obtain the C address of a procedure
+-======================================================
+-
+-_Description_:
+- `C_FUNLOC(x)' determines the C address of the argument.
+-
+-_Standard_:
+- Fortran 2003 and later
+-
+-_Class_:
+- Inquiry function
+-
+-_Syntax_:
+- `RESULT = C_FUNLOC(x)'
+-
+-_Arguments_:
+- X Interoperable function or pointer to such
+- function.
+-
+-_Return value_:
+- The return value is of type `C_FUNPTR' and contains the C address
+- of the argument.
+-
+-_Example_:
+- module x
+- use iso_c_binding
+- implicit none
+- contains
+- subroutine sub(a) bind(c)
+- real(c_float) :: a
+- a = sqrt(a)+5.0
+- end subroutine sub
+- end module x
+- program main
+- use iso_c_binding
+- use x
+- implicit none
+- interface
+- subroutine my_routine(p) bind(c,name='myC_func')
+- import :: c_funptr
+- type(c_funptr), intent(in) :: p
+- end subroutine
+- end interface
+- call my_routine(c_funloc(sub))
+- end program main
+-
+-_See also_:
+- *note C_ASSOCIATED::, *note C_LOC::, *note C_F_POINTER::, *note
+- C_F_PROCPOINTER::
+-
+-
+-File: gfortran.info, Node: C_F_PROCPOINTER, Next: C_FUNLOC, Prev: C_F_POINTER, Up: Intrinsic Procedures
+-
+-7.34 `C_F_PROCPOINTER' -- Convert C into Fortran procedure pointer
+-==================================================================
+-
+-_Description_:
+- `C_F_PROCPOINTER(CPTR, FPTR)' Assign the target of the C function
+- pointer CPTR to the Fortran procedure pointer FPTR.
+-
+- Note: Due to the currently lacking support of procedure pointers
+- in GNU Fortran this function is not fully operable.
+-
+-_Standard_:
+- Fortran 2003 and later
+-
+-_Class_:
+- Subroutine
+-
+-_Syntax_:
+- `CALL C_F_PROCPOINTER(cptr, fptr)'
+-
+-_Arguments_:
+- CPTR scalar of the type `C_FUNPTR'. It is
+- `INTENT(IN)'.
+- FPTR procedure pointer interoperable with CPTR. It
+- is `INTENT(OUT)'.
+-
+-_Example_:
+- program main
+- use iso_c_binding
+- implicit none
+- abstract interface
+- function func(a)
+- import :: c_float
+- real(c_float), intent(in) :: a
+- real(c_float) :: func
+- end function
+- end interface
+- interface
+- function getIterFunc() bind(c,name="getIterFunc")
+- import :: c_funptr
+- type(c_funptr) :: getIterFunc
+- end function
+- end interface
+- type(c_funptr) :: cfunptr
+- procedure(func), pointer :: myFunc
+- cfunptr = getIterFunc()
+- call c_f_procpointer(cfunptr, myFunc)
+- end program main
+-
+-_See also_:
+- *note C_LOC::, *note C_F_POINTER::
+-
+-
+-File: gfortran.info, Node: C_F_POINTER, Next: C_F_PROCPOINTER, Prev: C_ASSOCIATED, Up: Intrinsic Procedures
+-
+-7.35 `C_F_POINTER' -- Convert C into Fortran pointer
+-====================================================
+-
+-_Description_:
+- `C_F_POINTER(CPTR, FPTR[, SHAPE])' Assign the target the C pointer
+- CPTR to the Fortran pointer FPTR and specify its shape.
+-
+-_Standard_:
+- Fortran 2003 and later
+-
+-_Class_:
+- Subroutine
+-
+-_Syntax_:
+- `CALL C_F_POINTER(CPTR, FPTR[, SHAPE])'
+-
+-_Arguments_:
+- CPTR scalar of the type `C_PTR'. It is `INTENT(IN)'.
+- FPTR pointer interoperable with CPTR. It is
+- `INTENT(OUT)'.
+- SHAPE (Optional) Rank-one array of type `INTEGER'
+- with `INTENT(IN)'. It shall be present if and
+- only if FPTR is an array. The size must be
+- equal to the rank of FPTR.
+-
+-_Example_:
+- program main
+- use iso_c_binding
+- implicit none
+- interface
+- subroutine my_routine(p) bind(c,name='myC_func')
+- import :: c_ptr
+- type(c_ptr), intent(out) :: p
+- end subroutine
+- end interface
+- type(c_ptr) :: cptr
+- real,pointer :: a(:)
+- call my_routine(cptr)
+- call c_f_pointer(cptr, a, [12])
+- end program main
+-
+-_See also_:
+- *note C_LOC::, *note C_F_PROCPOINTER::
+-
+-
+-File: gfortran.info, Node: C_LOC, Next: C_SIZEOF, Prev: C_FUNLOC, Up: Intrinsic Procedures
+-
+-7.36 `C_LOC' -- Obtain the C address of an object
+-=================================================
+-
+-_Description_:
+- `C_LOC(X)' determines the C address of the argument.
+-
+-_Standard_:
+- Fortran 2003 and later
+-
+-_Class_:
+- Inquiry function
+-
+-_Syntax_:
+- `RESULT = C_LOC(X)'
+-
+-_Arguments_:
+- X Associated scalar pointer or interoperable
+- scalar or allocated allocatable variable with
+- `TARGET' attribute.
+-
+-_Return value_:
+- The return value is of type `C_PTR' and contains the C address of
+- the argument.
+-
+-_Example_:
+- subroutine association_test(a,b)
+- use iso_c_binding, only: c_associated, c_loc, c_ptr
+- implicit none
+- real, pointer :: a
+- type(c_ptr) :: b
+- if(c_associated(b, c_loc(a))) &
+- stop 'b and a do not point to same target'
+- end subroutine association_test
+-
+-_See also_:
+- *note C_ASSOCIATED::, *note C_FUNLOC::, *note C_F_POINTER::, *note
+- C_F_PROCPOINTER::
+-
+-
+-File: gfortran.info, Node: C_SIZEOF, Next: CEILING, Prev: C_LOC, Up: Intrinsic Procedures
+-
+-7.37 `C_SIZEOF' -- Size in bytes of an expression
+-=================================================
+-
+-_Description_:
+- `C_SIZEOF(X)' calculates the number of bytes of storage the
+- expression `X' occupies.
+-
+-_Standard_:
+- Fortran 2008
+-
+-_Class_:
+- Intrinsic function
+-
+-_Syntax_:
+- `N = C_SIZEOF(X)'
+-
+-_Arguments_:
+- X The argument shall be of any type, rank or
+- shape.
+-
+-_Return value_:
+- The return value is of type integer and of the system-dependent
+- kind C_SIZE_T (from the ISO_C_BINDING module). Its value is the
+- number of bytes occupied by the argument. If the argument has the
+- `POINTER' attribute, the number of bytes of the storage area
+- pointed to is returned. If the argument is of a derived type with
+- `POINTER' or `ALLOCATABLE' components, the return value doesn't
+- account for the sizes of the data pointed to by these components.
+-
+-_Example_:
+- use iso_c_binding
+- integer(c_int) :: i
+- real(c_float) :: r, s(5)
+- print *, (c_sizeof(s)/c_sizeof(r) == 5)
+- end
+- The example will print `.TRUE.' unless you are using a platform
+- where default `REAL' variables are unusually padded.
+-
+-_See also_:
+- *note SIZEOF::
+-
+-
+-File: gfortran.info, Node: CEILING, Next: CHAR, Prev: C_SIZEOF, Up: Intrinsic Procedures
+-
+-7.38 `CEILING' -- Integer ceiling function
+-==========================================
+-
+-_Description_:
+- `CEILING(A)' returns the least integer greater than or equal to A.
+-
+-_Standard_:
+- Fortran 95 and later
+-
+-_Class_:
+- Elemental function
+-
+-_Syntax_:
+- `RESULT = CEILING(A [, KIND])'
+-
+-_Arguments_:
+- A The type shall be `REAL'.
+- KIND (Optional) An `INTEGER' initialization
+- expression indicating the kind parameter of
+- the result.
+-
+-_Return value_:
+- The return value is of type `INTEGER(KIND)' if KIND is present and
+- a default-kind `INTEGER' otherwise.
+-
+-_Example_:
+- program test_ceiling
+- real :: x = 63.29
+- real :: y = -63.59
+- print *, ceiling(x) ! returns 64
+- print *, ceiling(y) ! returns -63
+- end program test_ceiling
+-
+-_See also_:
+- *note FLOOR::, *note NINT::
+-
+-
+-
+-File: gfortran.info, Node: CHAR, Next: CHDIR, Prev: CEILING, Up: Intrinsic Procedures
+-
+-7.39 `CHAR' -- Character conversion function
+-============================================
+-
+-_Description_:
+- `CHAR(I [, KIND])' returns the character represented by the
+- integer I.
+-
+-_Standard_:
+- Fortran 77 and later
+-
+-_Class_:
+- Elemental function
+-
+-_Syntax_:
+- `RESULT = CHAR(I [, KIND])'
+-
+-_Arguments_:
+- I The type shall be `INTEGER'.
+- KIND (Optional) An `INTEGER' initialization
+- expression indicating the kind parameter of
+- the result.
+-
+-_Return value_:
+- The return value is of type `CHARACTER(1)'
+-
+-_Example_:
+- program test_char
+- integer :: i = 74
+- character(1) :: c
+- c = char(i)
+- print *, i, c ! returns 'J'
+- end program test_char
+-
+-_Note_:
+- See *note ICHAR:: for a discussion of converting between numerical
+- values and formatted string representations.
+-
+-_See also_:
+- *note ACHAR::, *note IACHAR::, *note ICHAR::
+-
+-
+-
+-File: gfortran.info, Node: CHDIR, Next: CHMOD, Prev: CHAR, Up: Intrinsic Procedures
+-
+-7.40 `CHDIR' -- Change working directory
+-========================================
+-
+-_Description_:
+- Change current working directory to a specified path.
+-
+- This intrinsic is provided in both subroutine and function forms;
+- however, only one form can be used in any given program unit.
+-
+-_Standard_:
+- GNU extension
+-
+-_Class_:
+- Subroutine, function
+-
+-_Syntax_:
+- `CALL CHDIR(NAME [, STATUS])'
+- `STATUS = CHDIR(NAME)'
+-
+-_Arguments_:
+- NAME The type shall be `CHARACTER' of default kind
+- and shall specify a valid path within the file
+- system.
+- STATUS (Optional) `INTEGER' status flag of the default
+- kind. Returns 0 on success, and a system
+- specific and nonzero error code otherwise.
+-
+-_Example_:
+- PROGRAM test_chdir
+- CHARACTER(len=255) :: path
+- CALL getcwd(path)
+- WRITE(*,*) TRIM(path)
+- CALL chdir("/tmp")
+- CALL getcwd(path)
+- WRITE(*,*) TRIM(path)
+- END PROGRAM
+-
+-_See also_:
+- *note GETCWD::
+-
+-
+-File: gfortran.info, Node: CHMOD, Next: CMPLX, Prev: CHDIR, Up: Intrinsic Procedures
+-
+-7.41 `CHMOD' -- Change access permissions of files
+-==================================================
+-
+-_Description_:
+- `CHMOD' changes the permissions of a file. This function invokes
+- `/bin/chmod' and might therefore not work on all platforms.
+-
+- This intrinsic is provided in both subroutine and function forms;
+- however, only one form can be used in any given program unit.
+-
+-_Standard_:
+- GNU extension
+-
+-_Class_:
+- Subroutine, function
+-
+-_Syntax_:
+- `CALL CHMOD(NAME, MODE[, STATUS])'
+- `STATUS = CHMOD(NAME, MODE)'
+-
+-_Arguments_:
+- NAME Scalar `CHARACTER' of default kind with the
+- file name. Trailing blanks are ignored unless
+- the character `achar(0)' is present, then all
+- characters up to and excluding `achar(0)' are
+- used as the file name.
+- MODE Scalar `CHARACTER' of default kind giving the
+- file permission. MODE uses the same syntax as
+- the MODE argument of `/bin/chmod'.
+- STATUS (optional) scalar `INTEGER', which is `0' on
+- success and nonzero otherwise.
+-
+-_Return value_:
+- In either syntax, STATUS is set to `0' on success and nonzero
+- otherwise.
+-
+-_Example_:
+- `CHMOD' as subroutine
+- program chmod_test
+- implicit none
+- integer :: status
+- call chmod('test.dat','u+x',status)
+- print *, 'Status: ', status
+- end program chmod_test
+- `CHMOD' as function:
+- program chmod_test
+- implicit none
+- integer :: status
+- status = chmod('test.dat','u+x')
+- print *, 'Status: ', status
+- end program chmod_test
+-
+-
+-
+-File: gfortran.info, Node: CMPLX, Next: COMMAND_ARGUMENT_COUNT, Prev: CHMOD, Up: Intrinsic Procedures
+-
+-7.42 `CMPLX' -- Complex conversion function
+-===========================================
+-
+-_Description_:
+- `CMPLX(X [, Y [, KIND]])' returns a complex number where X is
+- converted to the real component. If Y is present it is converted
+- to the imaginary component. If Y is not present then the
+- imaginary component is set to 0.0. If X is complex then Y must
+- not be present.
+-
+-_Standard_:
+- Fortran 77 and later
+-
+-_Class_:
+- Elemental function
+-
+-_Syntax_:
+- `RESULT = CMPLX(X [, Y [, KIND]])'
+-
+-_Arguments_:
+- X The type may be `INTEGER', `REAL', or
+- `COMPLEX'.
+- Y (Optional; only allowed if X is not
+- `COMPLEX'.) May be `INTEGER' or `REAL'.
+- KIND (Optional) An `INTEGER' initialization
+- expression indicating the kind parameter of
+- the result.
+-
+-_Return value_:
+- The return value is of `COMPLEX' type, with a kind equal to KIND
+- if it is specified. If KIND is not specified, the result is of
+- the default `COMPLEX' kind, regardless of the kinds of X and Y.
+-
+-_Example_:
+- program test_cmplx
+- integer :: i = 42
+- real :: x = 3.14
+- complex :: z
+- z = cmplx(i, x)
+- print *, z, cmplx(x)
+- end program test_cmplx
+-
+-_See also_:
+- *note COMPLEX::
+-
+-
+-File: gfortran.info, Node: COMMAND_ARGUMENT_COUNT, Next: COMPLEX, Prev: CMPLX, Up: Intrinsic Procedures
+-
+-7.43 `COMMAND_ARGUMENT_COUNT' -- Get number of command line arguments
+-=====================================================================
+-
+-_Description_:
+- `COMMAND_ARGUMENT_COUNT()' returns the number of arguments passed
+- on the command line when the containing program was invoked.
+-
+-_Standard_:
+- Fortran 2003 and later
+-
+-_Class_:
+- Inquiry function
+-
+-_Syntax_:
+- `RESULT = COMMAND_ARGUMENT_COUNT()'
+-
+-_Arguments_:
+- None
+-
+-_Return value_:
+- The return value is of type `INTEGER(4)'
+-
+-_Example_:
+- program test_command_argument_count
+- integer :: count
+- count = command_argument_count()
+- print *, count
+- end program test_command_argument_count
+-
+-_See also_:
+- *note GET_COMMAND::, *note GET_COMMAND_ARGUMENT::
+-
+-
+-File: gfortran.info, Node: COMPLEX, Next: CONJG, Prev: COMMAND_ARGUMENT_COUNT, Up: Intrinsic Procedures
+-
+-7.44 `COMPLEX' -- Complex conversion function
+-=============================================
+-
+-_Description_:
+- `COMPLEX(X, Y)' returns a complex number where X is converted to
+- the real component and Y is converted to the imaginary component.
+-
+-_Standard_:
+- GNU extension
+-
+-_Class_:
+- Elemental function
+-
+-_Syntax_:
+- `RESULT = COMPLEX(X, Y)'
+-
+-_Arguments_:
+- X The type may be `INTEGER' or `REAL'.
+- Y The type may be `INTEGER' or `REAL'.
+-
+-_Return value_:
+- If X and Y are both of `INTEGER' type, then the return value is of
+- default `COMPLEX' type.
+-
+- If X and Y are of `REAL' type, or one is of `REAL' type and one is
+- of `INTEGER' type, then the return value is of `COMPLEX' type with
+- a kind equal to that of the `REAL' argument with the highest
+- precision.
+-
+-_Example_:
+- program test_complex
+- integer :: i = 42
+- real :: x = 3.14
+- print *, complex(i, x)
+- end program test_complex
+-
+-_See also_:
+- *note CMPLX::
+-
+-
+-File: gfortran.info, Node: CONJG, Next: COS, Prev: COMPLEX, Up: Intrinsic Procedures
+-
+-7.45 `CONJG' -- Complex conjugate function
+-==========================================
+-
+-_Description_:
+- `CONJG(Z)' returns the conjugate of Z. If Z is `(x, y)' then the
+- result is `(x, -y)'
+-
+-_Standard_:
+- Fortran 77 and later, has overloads that are GNU extensions
+-
+-_Class_:
+- Elemental function
+-
+-_Syntax_:
+- `Z = CONJG(Z)'
+-
+-_Arguments_:
+- Z The type shall be `COMPLEX'.
+-
+-_Return value_:
+- The return value is of type `COMPLEX'.
+-
+-_Example_:
+- program test_conjg
+- complex :: z = (2.0, 3.0)
+- complex(8) :: dz = (2.71_8, -3.14_8)
+- z= conjg(z)
+- print *, z
+- dz = dconjg(dz)
+- print *, dz
+- end program test_conjg
+-
+-_Specific names_:
+- Name Argument Return type Standard
+- `DCONJG(Z)' `COMPLEX(8) `COMPLEX(8)' GNU extension
+- Z'
+-
+-
+-File: gfortran.info, Node: COS, Next: COSH, Prev: CONJG, Up: Intrinsic Procedures
+-
+-7.46 `COS' -- Cosine function
+-=============================
+-
+-_Description_:
+- `COS(X)' computes the cosine of X.
+-
+-_Standard_:
+- Fortran 77 and later, has overloads that are GNU extensions
+-
+-_Class_:
+- Elemental function
+-
+-_Syntax_:
+- `RESULT = COS(X)'
+-
+-_Arguments_:
+- X The type shall be `REAL' or `COMPLEX'.
+-
+-_Return value_:
+- The return value is of type `REAL' and it lies in the range -1
+- \leq \cos (x) \leq 1. The kind type parameter is the same as X.
+-
+-_Example_:
+- program test_cos
+- real :: x = 0.0
+- x = cos(x)
+- end program test_cos
+-
+-_Specific names_:
+- Name Argument Return type Standard
+- `DCOS(X)' `REAL(8) X' `REAL(8)' Fortran 77 and
+- later
+- `CCOS(X)' `COMPLEX(4) `COMPLEX(4)' Fortran 77 and
+- X' later
+- `ZCOS(X)' `COMPLEX(8) `COMPLEX(8)' GNU extension
+- X'
+- `CDCOS(X)' `COMPLEX(8) `COMPLEX(8)' GNU extension
+- X'
+-
+-_See also_:
+- Inverse function: *note ACOS::
+-
+-
+-
+-File: gfortran.info, Node: COSH, Next: COUNT, Prev: COS, Up: Intrinsic Procedures
+-
+-7.47 `COSH' -- Hyperbolic cosine function
+-=========================================
+-
+-_Description_:
+- `COSH(X)' computes the hyperbolic cosine of X.
+-
+-_Standard_:
+- Fortran 77 and later
+-
+-_Class_:
+- Elemental function
+-
+-_Syntax_:
+- `X = COSH(X)'
+-
+-_Arguments_:
+- X The type shall be `REAL'.
+-
+-_Return value_:
+- The return value is of type `REAL' and it is positive ( \cosh (x)
+- \geq 0 ). For a `REAL' argument X, \cosh (x) \geq 1 . The
+- return value is of the same kind as X.
+-
+-_Example_:
+- program test_cosh
+- real(8) :: x = 1.0_8
+- x = cosh(x)
+- end program test_cosh
+-
+-_Specific names_:
+- Name Argument Return type Standard
+- `DCOSH(X)' `REAL(8) X' `REAL(8)' Fortran 77 and
+- later
+-
+-_See also_:
+- Inverse function: *note ACOSH::
+-
+-
+-
+-File: gfortran.info, Node: COUNT, Next: CPU_TIME, Prev: COSH, Up: Intrinsic Procedures
+-
+-7.48 `COUNT' -- Count function
+-==============================
+-
+-_Description_:
+- `COUNT(MASK [, DIM [, KIND]])' counts the number of `.TRUE.'
+- elements of MASK along the dimension of DIM. If DIM is omitted it
+- is taken to be `1'. DIM is a scalar of type `INTEGER' in the
+- range of 1 /leq DIM /leq n) where n is the rank of MASK.
+-
+-_Standard_:
+- Fortran 95 and later, with KIND argument Fortran 2003 and later
+-
+-_Class_:
+- Transformational function
+-
+-_Syntax_:
+- `RESULT = COUNT(MASK [, DIM [, KIND]])'
+-
+-_Arguments_:
+- MASK The type shall be `LOGICAL'.
+- DIM (Optional) The type shall be `INTEGER'.
+- KIND (Optional) An `INTEGER' initialization
+- expression indicating the kind parameter of
+- the result.
+-
+-_Return value_:
+- The return value is of type `INTEGER' and of kind KIND. If KIND is
+- absent, the return value is of default integer kind. The result
+- has a rank equal to that of MASK.
+-
+-_Example_:
+- program test_count
+- integer, dimension(2,3) :: a, b
+- logical, dimension(2,3) :: mask
+- a = reshape( (/ 1, 2, 3, 4, 5, 6 /), (/ 2, 3 /))
+- b = reshape( (/ 0, 7, 3, 4, 5, 8 /), (/ 2, 3 /))
+- print '(3i3)', a(1,:)
+- print '(3i3)', a(2,:)
+- print *
+- print '(3i3)', b(1,:)
+- print '(3i3)', b(2,:)
+- print *
+- mask = a.ne.b
+- print '(3l3)', mask(1,:)
+- print '(3l3)', mask(2,:)
+- print *
+- print '(3i3)', count(mask)
+- print *
+- print '(3i3)', count(mask, 1)
+- print *
+- print '(3i3)', count(mask, 2)
+- end program test_count
+-
+-
+-File: gfortran.info, Node: CPU_TIME, Next: CSHIFT, Prev: COUNT, Up: Intrinsic Procedures
+-
+-7.49 `CPU_TIME' -- CPU elapsed time in seconds
+-==============================================
+-
+-_Description_:
+- Returns a `REAL' value representing the elapsed CPU time in
+- seconds. This is useful for testing segments of code to determine
+- execution time.
+-
+- If a time source is available, time will be reported with
+- microsecond resolution. If no time source is available, TIME is
+- set to `-1.0'.
+-
+- Note that TIME may contain a, system dependent, arbitrary offset
+- and may not start with `0.0'. For `CPU_TIME', the absolute value
+- is meaningless, only differences between subsequent calls to this
+- subroutine, as shown in the example below, should be used.
+-
+-_Standard_:
+- Fortran 95 and later
+-
+-_Class_:
+- Subroutine
+-
+-_Syntax_:
+- `CALL CPU_TIME(TIME)'
+-
+-_Arguments_:
+- TIME The type shall be `REAL' with `INTENT(OUT)'.
+-
+-_Return value_:
+- None
+-
+-_Example_:
+- program test_cpu_time
+- real :: start, finish
+- call cpu_time(start)
+- ! put code to test here
+- call cpu_time(finish)
+- print '("Time = ",f6.3," seconds.")',finish-start
+- end program test_cpu_time
+-
+-_See also_:
+- *note SYSTEM_CLOCK::, *note DATE_AND_TIME::
+-
+-
+-File: gfortran.info, Node: CSHIFT, Next: CTIME, Prev: CPU_TIME, Up: Intrinsic Procedures
+-
+-7.50 `CSHIFT' -- Circular shift elements of an array
+-====================================================
+-
+-_Description_:
+- `CSHIFT(ARRAY, SHIFT [, DIM])' performs a circular shift on
+- elements of ARRAY along the dimension of DIM. If DIM is omitted
+- it is taken to be `1'. DIM is a scalar of type `INTEGER' in the
+- range of 1 /leq DIM /leq n) where n is the rank of ARRAY. If the
+- rank of ARRAY is one, then all elements of ARRAY are shifted by
+- SHIFT places. If rank is greater than one, then all complete rank
+- one sections of ARRAY along the given dimension are shifted.
+- Elements shifted out one end of each rank one section are shifted
+- back in the other end.
+-
+-_Standard_:
+- Fortran 95 and later
+-
+-_Class_:
+- Transformational function
+-
+-_Syntax_:
+- `RESULT = CSHIFT(ARRAY, SHIFT [, DIM])'
+-
+-_Arguments_:
+- ARRAY Shall be an array of any type.
+- SHIFT The type shall be `INTEGER'.
+- DIM The type shall be `INTEGER'.
+-
+-_Return value_:
+- Returns an array of same type and rank as the ARRAY argument.
+-
+-_Example_:
+- program test_cshift
+- integer, dimension(3,3) :: a
+- a = reshape( (/ 1, 2, 3, 4, 5, 6, 7, 8, 9 /), (/ 3, 3 /))
+- print '(3i3)', a(1,:)
+- print '(3i3)', a(2,:)
+- print '(3i3)', a(3,:)
+- a = cshift(a, SHIFT=(/1, 2, -1/), DIM=2)
+- print *
+- print '(3i3)', a(1,:)
+- print '(3i3)', a(2,:)
+- print '(3i3)', a(3,:)
+- end program test_cshift
+-
+-
+-File: gfortran.info, Node: CTIME, Next: DATE_AND_TIME, Prev: CSHIFT, Up: Intrinsic Procedures
+-
+-7.51 `CTIME' -- Convert a time into a string
+-============================================
+-
+-_Description_:
+- `CTIME' converts a system time value, such as returned by
+- `TIME8()', to a string of the form `Sat Aug 19 18:13:14 1995'.
+-
+- This intrinsic is provided in both subroutine and function forms;
+- however, only one form can be used in any given program unit.
+-
+-_Standard_:
+- GNU extension
+-
+-_Class_:
+- Subroutine, function
+-
+-_Syntax_:
+- `CALL CTIME(TIME, RESULT)'.
+- `RESULT = CTIME(TIME)', (not recommended).
+-
+-_Arguments_:
+- TIME The type shall be of type `INTEGER(KIND=8)'.
+- RESULT The type shall be of type `CHARACTER' and of
+- default kind.
+-
+-_Return value_:
+- The converted date and time as a string.
+-
+-_Example_:
+- program test_ctime
+- integer(8) :: i
+- character(len=30) :: date
+- i = time8()
+-
+- ! Do something, main part of the program
+-
+- call ctime(i,date)
+- print *, 'Program was started on ', date
+- end program test_ctime
+-
+-_See Also_:
+- *note GMTIME::, *note LTIME::, *note TIME::, *note TIME8::
+-
+-
+-File: gfortran.info, Node: DATE_AND_TIME, Next: DBLE, Prev: CTIME, Up: Intrinsic Procedures
+-
+-7.52 `DATE_AND_TIME' -- Date and time subroutine
+-================================================
+-
+-_Description_:
+- `DATE_AND_TIME(DATE, TIME, ZONE, VALUES)' gets the corresponding
+- date and time information from the real-time system clock. DATE is
+- `INTENT(OUT)' and has form ccyymmdd. TIME is `INTENT(OUT)' and
+- has form hhmmss.sss. ZONE is `INTENT(OUT)' and has form (+-)hhmm,
+- representing the difference with respect to Coordinated Universal
+- Time (UTC). Unavailable time and date parameters return blanks.
+-
+- VALUES is `INTENT(OUT)' and provides the following:
+-
+- `VALUE(1)': The year
+- `VALUE(2)': The month
+- `VALUE(3)': The day of the month
+- `VALUE(4)': Time difference with UTC
+- in minutes
+- `VALUE(5)': The hour of the day
+- `VALUE(6)': The minutes of the hour
+- `VALUE(7)': The seconds of the minute
+- `VALUE(8)': The milliseconds of the
+- second
+-
+-_Standard_:
+- Fortran 95 and later
+-
+-_Class_:
+- Subroutine
+-
+-_Syntax_:
+- `CALL DATE_AND_TIME([DATE, TIME, ZONE, VALUES])'
+-
+-_Arguments_:
+- DATE (Optional) The type shall be `CHARACTER(LEN=8)'
+- or larger, and of default kind.
+- TIME (Optional) The type shall be
+- `CHARACTER(LEN=10)' or larger, and of default
+- kind.
+- ZONE (Optional) The type shall be `CHARACTER(LEN=5)'
+- or larger, and of default kind.
+- VALUES (Optional) The type shall be `INTEGER(8)'.
+-
+-_Return value_:
+- None
+-
+-_Example_:
+- program test_time_and_date
+- character(8) :: date
+- character(10) :: time
+- character(5) :: zone
+- integer,dimension(8) :: values
+- ! using keyword arguments
+- call date_and_time(date,time,zone,values)
+- call date_and_time(DATE=date,ZONE=zone)
+- call date_and_time(TIME=time)
+- call date_and_time(VALUES=values)
+- print '(a,2x,a,2x,a)', date, time, zone
+- print '(8i5))', values
+- end program test_time_and_date
+-
+-_See also_:
+- *note CPU_TIME::, *note SYSTEM_CLOCK::
+-
+-
+-File: gfortran.info, Node: DBLE, Next: DCMPLX, Prev: DATE_AND_TIME, Up: Intrinsic Procedures
+-
+-7.53 `DBLE' -- Double conversion function
+-=========================================
+-
+-_Description_:
+- `DBLE(A)' Converts A to double precision real type.
+-
+-_Standard_:
+- Fortran 77 and later
+-
+-_Class_:
+- Elemental function
+-
+-_Syntax_:
+- `RESULT = DBLE(A)'
+-
+-_Arguments_:
+- A The type shall be `INTEGER', `REAL', or
+- `COMPLEX'.
+-
+-_Return value_:
+- The return value is of type double precision real.
+-
+-_Example_:
+- program test_dble
+- real :: x = 2.18
+- integer :: i = 5
+- complex :: z = (2.3,1.14)
+- print *, dble(x), dble(i), dble(z)
+- end program test_dble
+-
+-_See also_:
+- *note DFLOAT::, *note FLOAT::, *note REAL::
+-
+-
+-File: gfortran.info, Node: DCMPLX, Next: DFLOAT, Prev: DBLE, Up: Intrinsic Procedures
+-
+-7.54 `DCMPLX' -- Double complex conversion function
+-===================================================
+-
+-_Description_:
+- `DCMPLX(X [,Y])' returns a double complex number where X is
+- converted to the real component. If Y is present it is converted
+- to the imaginary component. If Y is not present then the
+- imaginary component is set to 0.0. If X is complex then Y must
+- not be present.
+-
+-_Standard_:
+- GNU extension
+-
+-_Class_:
+- Elemental function
+-
+-_Syntax_:
+- `RESULT = DCMPLX(X [, Y])'
+-
+-_Arguments_:
+- X The type may be `INTEGER', `REAL', or
+- `COMPLEX'.
+- Y (Optional if X is not `COMPLEX'.) May be
+- `INTEGER' or `REAL'.
+-
+-_Return value_:
+- The return value is of type `COMPLEX(8)'
+-
+-_Example_:
+- program test_dcmplx
+- integer :: i = 42
+- real :: x = 3.14
+- complex :: z
+- z = cmplx(i, x)
+- print *, dcmplx(i)
+- print *, dcmplx(x)
+- print *, dcmplx(z)
+- print *, dcmplx(x,i)
+- end program test_dcmplx
+-
+-
+-File: gfortran.info, Node: DFLOAT, Next: DIGITS, Prev: DCMPLX, Up: Intrinsic Procedures
+-
+-7.55 `DFLOAT' -- Double conversion function
+-===========================================
+-
+-_Description_:
+- `DFLOAT(A)' Converts A to double precision real type.
+-
+-_Standard_:
+- GNU extension
+-
+-_Class_:
+- Elemental function
+-
+-_Syntax_:
+- `RESULT = DFLOAT(A)'
+-
+-_Arguments_:
+- A The type shall be `INTEGER'.
+-
+-_Return value_:
+- The return value is of type double precision real.
+-
+-_Example_:
+- program test_dfloat
+- integer :: i = 5
+- print *, dfloat(i)
+- end program test_dfloat
+-
+-_See also_:
+- *note DBLE::, *note FLOAT::, *note REAL::
+-
+-
+-File: gfortran.info, Node: DIGITS, Next: DIM, Prev: DFLOAT, Up: Intrinsic Procedures
+-
+-7.56 `DIGITS' -- Significant binary digits function
+-===================================================
+-
+-_Description_:
+- `DIGITS(X)' returns the number of significant binary digits of the
+- internal model representation of X. For example, on a system
+- using a 32-bit floating point representation, a default real
+- number would likely return 24.
+-
+-_Standard_:
+- Fortran 95 and later
+-
+-_Class_:
+- Inquiry function
+-
+-_Syntax_:
+- `RESULT = DIGITS(X)'
+-
+-_Arguments_:
+- X The type may be `INTEGER' or `REAL'.
+-
+-_Return value_:
+- The return value is of type `INTEGER'.
+-
+-_Example_:
+- program test_digits
+- integer :: i = 12345
+- real :: x = 3.143
+- real(8) :: y = 2.33
+- print *, digits(i)
+- print *, digits(x)
+- print *, digits(y)
+- end program test_digits
+-
+-
+-File: gfortran.info, Node: DIM, Next: DOT_PRODUCT, Prev: DIGITS, Up: Intrinsic Procedures
+-
+-7.57 `DIM' -- Positive difference
+-=================================
+-
+-_Description_:
+- `DIM(X,Y)' returns the difference `X-Y' if the result is positive;
+- otherwise returns zero.
+-
+-_Standard_:
+- Fortran 77 and later
+-
+-_Class_:
+- Elemental function
+-
+-_Syntax_:
+- `RESULT = DIM(X, Y)'
+-
+-_Arguments_:
+- X The type shall be `INTEGER' or `REAL'
+- Y The type shall be the same type and kind as X.
+-
+-_Return value_:
+- The return value is of type `INTEGER' or `REAL'.
+-
+-_Example_:
+- program test_dim
+- integer :: i
+- real(8) :: x
+- i = dim(4, 15)
+- x = dim(4.345_8, 2.111_8)
+- print *, i
+- print *, x
+- end program test_dim
+-
+-_Specific names_:
+- Name Argument Return type Standard
+- `IDIM(X,Y)' `INTEGER(4) `INTEGER(4)' Fortran 77 and
+- X,Y' later
+- `DDIM(X,Y)' `REAL(8) `REAL(8)' Fortran 77 and
+- X,Y' later
+-
+-
+-File: gfortran.info, Node: DOT_PRODUCT, Next: DPROD, Prev: DIM, Up: Intrinsic Procedures
+-
+-7.58 `DOT_PRODUCT' -- Dot product function
+-==========================================
+-
+-_Description_:
+- `DOT_PRODUCT(VECTOR_A, VECTOR_B)' computes the dot product
+- multiplication of two vectors VECTOR_A and VECTOR_B. The two
+- vectors may be either numeric or logical and must be arrays of
+- rank one and of equal size. If the vectors are `INTEGER' or
+- `REAL', the result is `SUM(VECTOR_A*VECTOR_B)'. If the vectors are
+- `COMPLEX', the result is `SUM(CONJG(VECTOR_A)*VECTOR_B)'. If the
+- vectors are `LOGICAL', the result is `ANY(VECTOR_A .AND.
+- VECTOR_B)'.
+-
+-_Standard_:
+- Fortran 95 and later
+-
+-_Class_:
+- Transformational function
+-
+-_Syntax_:
+- `RESULT = DOT_PRODUCT(VECTOR_A, VECTOR_B)'
+-
+-_Arguments_:
+- VECTOR_A The type shall be numeric or `LOGICAL', rank 1.
+- VECTOR_B The type shall be numeric if VECTOR_A is of
+- numeric type or `LOGICAL' if VECTOR_A is of
+- type `LOGICAL'. VECTOR_B shall be a rank-one
+- array.
+-
+-_Return value_:
+- If the arguments are numeric, the return value is a scalar of
+- numeric type, `INTEGER', `REAL', or `COMPLEX'. If the arguments
+- are `LOGICAL', the return value is `.TRUE.' or `.FALSE.'.
+-
+-_Example_:
+- program test_dot_prod
+- integer, dimension(3) :: a, b
+- a = (/ 1, 2, 3 /)
+- b = (/ 4, 5, 6 /)
+- print '(3i3)', a
+- print *
+- print '(3i3)', b
+- print *
+- print *, dot_product(a,b)
+- end program test_dot_prod
+-
+-
+-File: gfortran.info, Node: DPROD, Next: DREAL, Prev: DOT_PRODUCT, Up: Intrinsic Procedures
+-
+-7.59 `DPROD' -- Double product function
+-=======================================
+-
+-_Description_:
+- `DPROD(X,Y)' returns the product `X*Y'.
+-
+-_Standard_:
+- Fortran 77 and later
+-
+-_Class_:
+- Elemental function
+-
+-_Syntax_:
+- `RESULT = DPROD(X, Y)'
+-
+-_Arguments_:
+- X The type shall be `REAL'.
+- Y The type shall be `REAL'.
+-
+-_Return value_:
+- The return value is of type `REAL(8)'.
+-
+-_Example_:
+- program test_dprod
+- real :: x = 5.2
+- real :: y = 2.3
+- real(8) :: d
+- d = dprod(x,y)
+- print *, d
+- end program test_dprod
+-
+-
+-File: gfortran.info, Node: DREAL, Next: DTIME, Prev: DPROD, Up: Intrinsic Procedures
+-
+-7.60 `DREAL' -- Double real part function
+-=========================================
+-
+-_Description_:
+- `DREAL(Z)' returns the real part of complex variable Z.
+-
+-_Standard_:
+- GNU extension
+-
+-_Class_:
+- Elemental function
+-
+-_Syntax_:
+- `RESULT = DREAL(A)'
+-
+-_Arguments_:
+- A The type shall be `COMPLEX(8)'.
+-
+-_Return value_:
+- The return value is of type `REAL(8)'.
+-
+-_Example_:
+- program test_dreal
+- complex(8) :: z = (1.3_8,7.2_8)
+- print *, dreal(z)
+- end program test_dreal
+-
+-_See also_:
+- *note AIMAG::
+-
+-
+-
+-File: gfortran.info, Node: DTIME, Next: EOSHIFT, Prev: DREAL, Up: Intrinsic Procedures
+-
+-7.61 `DTIME' -- Execution time subroutine (or function)
+-=======================================================
+-
+-_Description_:
+- `DTIME(TARRAY, RESULT)' initially returns the number of seconds of
+- runtime since the start of the process's execution in RESULT.
+- TARRAY returns the user and system components of this time in
+- `TARRAY(1)' and `TARRAY(2)' respectively. RESULT is equal to
+- `TARRAY(1) + TARRAY(2)'.
+-
+- Subsequent invocations of `DTIME' return values accumulated since
+- the previous invocation.
+-
+- On some systems, the underlying timings are represented using
+- types with sufficiently small limits that overflows (wrap around)
+- are possible, such as 32-bit types. Therefore, the values returned
+- by this intrinsic might be, or become, negative, or numerically
+- less than previous values, during a single run of the compiled
+- program.
+-
+- Please note, that this implementation is thread safe if used
+- within OpenMP directives, i.e., its state will be consistent while
+- called from multiple threads. However, if `DTIME' is called from
+- multiple threads, the result is still the time since the last
+- invocation. This may not give the intended results. If possible,
+- use `CPU_TIME' instead.
+-
+- This intrinsic is provided in both subroutine and function forms;
+- however, only one form can be used in any given program unit.
+-
+- TARRAY and RESULT are `INTENT(OUT)' and provide the following:
+-
+- `TARRAY(1)': User time in seconds.
+- `TARRAY(2)': System time in seconds.
+- `RESULT': Run time since start in
+- seconds.
+-
+-_Standard_:
+- GNU extension
+-
+-_Class_:
+- Subroutine, function
+-
+-_Syntax_:
+- `CALL DTIME(TARRAY, RESULT)'.
+- `RESULT = DTIME(TARRAY)', (not recommended).
+-
+-_Arguments_:
+- TARRAY The type shall be `REAL, DIMENSION(2)'.
+- RESULT The type shall be `REAL'.
+-
+-_Return value_:
+- Elapsed time in seconds since the last invocation or since the
+- start of program execution if not called before.
+-
+-_Example_:
+- program test_dtime
+- integer(8) :: i, j
+- real, dimension(2) :: tarray
+- real :: result
+- call dtime(tarray, result)
+- print *, result
+- print *, tarray(1)
+- print *, tarray(2)
+- do i=1,100000000 ! Just a delay
+- j = i * i - i
+- end do
+- call dtime(tarray, result)
+- print *, result
+- print *, tarray(1)
+- print *, tarray(2)
+- end program test_dtime
+-
+-_See also_:
+- *note CPU_TIME::
+-
+-
+-
+-File: gfortran.info, Node: EOSHIFT, Next: EPSILON, Prev: DTIME, Up: Intrinsic Procedures
+-
+-7.62 `EOSHIFT' -- End-off shift elements of an array
+-====================================================
+-
+-_Description_:
+- `EOSHIFT(ARRAY, SHIFT[, BOUNDARY, DIM])' performs an end-off shift
+- on elements of ARRAY along the dimension of DIM. If DIM is
+- omitted it is taken to be `1'. DIM is a scalar of type `INTEGER'
+- in the range of 1 /leq DIM /leq n) where n is the rank of ARRAY.
+- If the rank of ARRAY is one, then all elements of ARRAY are
+- shifted by SHIFT places. If rank is greater than one, then all
+- complete rank one sections of ARRAY along the given dimension are
+- shifted. Elements shifted out one end of each rank one section
+- are dropped. If BOUNDARY is present then the corresponding value
+- of from BOUNDARY is copied back in the other end. If BOUNDARY is
+- not present then the following are copied in depending on the type
+- of ARRAY.
+-
+- _Array _Boundary Value_
+- Type_
+- Numeric 0 of the type and kind of ARRAY.
+- Logical `.FALSE.'.
+- Character(LEN)LEN blanks.
+-
+-_Standard_:
+- Fortran 95 and later
+-
+-_Class_:
+- Transformational function
+-
+-_Syntax_:
+- `RESULT = EOSHIFT(ARRAY, SHIFT [, BOUNDARY, DIM])'
+-
+-_Arguments_:
+- ARRAY May be any type, not scalar.
+- SHIFT The type shall be `INTEGER'.
+- BOUNDARY Same type as ARRAY.
+- DIM The type shall be `INTEGER'.
+-
+-_Return value_:
+- Returns an array of same type and rank as the ARRAY argument.
+-
+-_Example_:
+- program test_eoshift
+- integer, dimension(3,3) :: a
+- a = reshape( (/ 1, 2, 3, 4, 5, 6, 7, 8, 9 /), (/ 3, 3 /))
+- print '(3i3)', a(1,:)
+- print '(3i3)', a(2,:)
+- print '(3i3)', a(3,:)
+- a = EOSHIFT(a, SHIFT=(/1, 2, 1/), BOUNDARY=-5, DIM=2)
+- print *
+- print '(3i3)', a(1,:)
+- print '(3i3)', a(2,:)
+- print '(3i3)', a(3,:)
+- end program test_eoshift
+-
+-
+-File: gfortran.info, Node: EPSILON, Next: ERF, Prev: EOSHIFT, Up: Intrinsic Procedures
+-
+-7.63 `EPSILON' -- Epsilon function
+-==================================
+-
+-_Description_:
+- `EPSILON(X)' returns the smallest number E of the same kind as X
+- such that 1 + E > 1.
+-
+-_Standard_:
+- Fortran 95 and later
+-
+-_Class_:
+- Inquiry function
+-
+-_Syntax_:
+- `RESULT = EPSILON(X)'
+-
+-_Arguments_:
+- X The type shall be `REAL'.
+-
+-_Return value_:
+- The return value is of same type as the argument.
+-
+-_Example_:
+- program test_epsilon
+- real :: x = 3.143
+- real(8) :: y = 2.33
+- print *, EPSILON(x)
+- print *, EPSILON(y)
+- end program test_epsilon
+-
+-
+-File: gfortran.info, Node: ERF, Next: ERFC, Prev: EPSILON, Up: Intrinsic Procedures
+-
+-7.64 `ERF' -- Error function
+-============================
+-
+-_Description_:
+- `ERF(X)' computes the error function of X.
+-
+-_Standard_:
+- Fortran 2008 and later
+-
+-_Class_:
+- Elemental function
+-
+-_Syntax_:
+- `RESULT = ERF(X)'
+-
+-_Arguments_:
+- X The type shall be `REAL'.
+-
+-_Return value_:
+- The return value is of type `REAL', of the same kind as X and lies
+- in the range -1 \leq erf (x) \leq 1 .
+-
+-_Example_:
+- program test_erf
+- real(8) :: x = 0.17_8
+- x = erf(x)
+- end program test_erf
+-
+-_Specific names_:
+- Name Argument Return type Standard
+- `DERF(X)' `REAL(8) X' `REAL(8)' GNU extension
+-
+-
+-File: gfortran.info, Node: ERFC, Next: ERFC_SCALED, Prev: ERF, Up: Intrinsic Procedures
+-
+-7.65 `ERFC' -- Error function
+-=============================
+-
+-_Description_:
+- `ERFC(X)' computes the complementary error function of X.
+-
+-_Standard_:
+- Fortran 2008 and later
+-
+-_Class_:
+- Elemental function
+-
+-_Syntax_:
+- `RESULT = ERFC(X)'
+-
+-_Arguments_:
+- X The type shall be `REAL'.
+-
+-_Return value_:
+- The return value is of type `REAL' and of the same kind as X. It
+- lies in the range 0 \leq erfc (x) \leq 2 .
+-
+-_Example_:
+- program test_erfc
+- real(8) :: x = 0.17_8
+- x = erfc(x)
+- end program test_erfc
+-
+-_Specific names_:
+- Name Argument Return type Standard
+- `DERFC(X)' `REAL(8) X' `REAL(8)' GNU extension
+-
+-
+-File: gfortran.info, Node: ERFC_SCALED, Next: ETIME, Prev: ERFC, Up: Intrinsic Procedures
+-
+-7.66 `ERFC_SCALED' -- Error function
+-====================================
+-
+-_Description_:
+- `ERFC_SCALED(X)' computes the exponentially-scaled complementary
+- error function of X.
+-
+-_Standard_:
+- Fortran 2008 and later
+-
+-_Class_:
+- Elemental function
+-
+-_Syntax_:
+- `RESULT = ERFC_SCALED(X)'
+-
+-_Arguments_:
+- X The type shall be `REAL'.
+-
+-_Return value_:
+- The return value is of type `REAL' and of the same kind as X.
+-
+-_Example_:
+- program test_erfc_scaled
+- real(8) :: x = 0.17_8
+- x = erfc_scaled(x)
+- end program test_erfc_scaled
+-
+-
+-File: gfortran.info, Node: ETIME, Next: EXIT, Prev: ERFC_SCALED, Up: Intrinsic Procedures
+-
+-7.67 `ETIME' -- Execution time subroutine (or function)
+-=======================================================
+-
+-_Description_:
+- `ETIME(TARRAY, RESULT)' returns the number of seconds of runtime
+- since the start of the process's execution in RESULT. TARRAY
+- returns the user and system components of this time in `TARRAY(1)'
+- and `TARRAY(2)' respectively. RESULT is equal to `TARRAY(1) +
+- TARRAY(2)'.
+-
+- On some systems, the underlying timings are represented using
+- types with sufficiently small limits that overflows (wrap around)
+- are possible, such as 32-bit types. Therefore, the values returned
+- by this intrinsic might be, or become, negative, or numerically
+- less than previous values, during a single run of the compiled
+- program.
+-
+- This intrinsic is provided in both subroutine and function forms;
+- however, only one form can be used in any given program unit.
+-
+- TARRAY and RESULT are `INTENT(OUT)' and provide the following:
+-
+- `TARRAY(1)': User time in seconds.
+- `TARRAY(2)': System time in seconds.
+- `RESULT': Run time since start in seconds.
+-
+-_Standard_:
+- GNU extension
+-
+-_Class_:
+- Subroutine, function
+-
+-_Syntax_:
+- `CALL ETIME(TARRAY, RESULT)'.
+- `RESULT = ETIME(TARRAY)', (not recommended).
+-
+-_Arguments_:
+- TARRAY The type shall be `REAL, DIMENSION(2)'.
+- RESULT The type shall be `REAL'.
+-
+-_Return value_:
+- Elapsed time in seconds since the start of program execution.
+-
+-_Example_:
+- program test_etime
+- integer(8) :: i, j
+- real, dimension(2) :: tarray
+- real :: result
+- call ETIME(tarray, result)
+- print *, result
+- print *, tarray(1)
+- print *, tarray(2)
+- do i=1,100000000 ! Just a delay
+- j = i * i - i
+- end do
+- call ETIME(tarray, result)
+- print *, result
+- print *, tarray(1)
+- print *, tarray(2)
+- end program test_etime
+-
+-_See also_:
+- *note CPU_TIME::
+-
+-
+-
+-File: gfortran.info, Node: EXIT, Next: EXP, Prev: ETIME, Up: Intrinsic Procedures
+-
+-7.68 `EXIT' -- Exit the program with status.
+-============================================
+-
+-_Description_:
+- `EXIT' causes immediate termination of the program with status.
+- If status is omitted it returns the canonical _success_ for the
+- system. All Fortran I/O units are closed.
+-
+-_Standard_:
+- GNU extension
+-
+-_Class_:
+- Subroutine
+-
+-_Syntax_:
+- `CALL EXIT([STATUS])'
+-
+-_Arguments_:
+- STATUS Shall be an `INTEGER' of the default kind.
+-
+-_Return value_:
+- `STATUS' is passed to the parent process on exit.
+-
+-_Example_:
+- program test_exit
+- integer :: STATUS = 0
+- print *, 'This program is going to exit.'
+- call EXIT(STATUS)
+- end program test_exit
+-
+-_See also_:
+- *note ABORT::, *note KILL::
+-
+-
+-File: gfortran.info, Node: EXP, Next: EXPONENT, Prev: EXIT, Up: Intrinsic Procedures
+-
+-7.69 `EXP' -- Exponential function
+-==================================
+-
+-_Description_:
+- `EXP(X)' computes the base e exponential of X.
+-
+-_Standard_:
+- Fortran 77 and later, has overloads that are GNU extensions
+-
+-_Class_:
+- Elemental function
+-
+-_Syntax_:
+- `RESULT = EXP(X)'
+-
+-_Arguments_:
+- X The type shall be `REAL' or `COMPLEX'.
+-
+-_Return value_:
+- The return value has same type and kind as X.
+-
+-_Example_:
+- program test_exp
+- real :: x = 1.0
+- x = exp(x)
+- end program test_exp
+-
+-_Specific names_:
+- Name Argument Return type Standard
+- `DEXP(X)' `REAL(8) X' `REAL(8)' Fortran 77 and
+- later
+- `CEXP(X)' `COMPLEX(4) `COMPLEX(4)' Fortran 77 and
+- X' later
+- `ZEXP(X)' `COMPLEX(8) `COMPLEX(8)' GNU extension
+- X'
+- `CDEXP(X)' `COMPLEX(8) `COMPLEX(8)' GNU extension
+- X'
+-
+-
+-File: gfortran.info, Node: EXPONENT, Next: FDATE, Prev: EXP, Up: Intrinsic Procedures
+-
+-7.70 `EXPONENT' -- Exponent function
+-====================================
+-
+-_Description_:
+- `EXPONENT(X)' returns the value of the exponent part of X. If X is
+- zero the value returned is zero.
+-
+-_Standard_:
+- Fortran 95 and later
+-
+-_Class_:
+- Elemental function
+-
+-_Syntax_:
+- `RESULT = EXPONENT(X)'
+-
+-_Arguments_:
+- X The type shall be `REAL'.
+-
+-_Return value_:
+- The return value is of type default `INTEGER'.
+-
+-_Example_:
+- program test_exponent
+- real :: x = 1.0
+- integer :: i
+- i = exponent(x)
+- print *, i
+- print *, exponent(0.0)
+- end program test_exponent
+-
+-
+-File: gfortran.info, Node: FDATE, Next: FGET, Prev: EXPONENT, Up: Intrinsic Procedures
+-
+-7.71 `FDATE' -- Get the current time as a string
+-================================================
+-
+-_Description_:
+- `FDATE(DATE)' returns the current date (using the same format as
+- `CTIME') in DATE. It is equivalent to `CALL CTIME(DATE, TIME())'.
+-
+- This intrinsic is provided in both subroutine and function forms;
+- however, only one form can be used in any given program unit.
+-
+- DATE is an `INTENT(OUT)' `CHARACTER' variable of the default kind.
+-
+-_Standard_:
+- GNU extension
+-
+-_Class_:
+- Subroutine, function
+-
+-_Syntax_:
+- `CALL FDATE(DATE)'.
+- `DATE = FDATE()', (not recommended).
+-
+-_Arguments_:
+- DATE The type shall be of type `CHARACTER' of the
+- default kind
+-
+-_Return value_:
+- The current date as a string.
+-
+-_Example_:
+- program test_fdate
+- integer(8) :: i, j
+- character(len=30) :: date
+- call fdate(date)
+- print *, 'Program started on ', date
+- do i = 1, 100000000 ! Just a delay
+- j = i * i - i
+- end do
+- call fdate(date)
+- print *, 'Program ended on ', date
+- end program test_fdate
+-
+-
+-File: gfortran.info, Node: FLOAT, Next: FLOOR, Prev: FGETC, Up: Intrinsic Procedures
+-
+-7.72 `FLOAT' -- Convert integer to default real
+-===============================================
+-
+-_Description_:
+- `FLOAT(A)' converts the integer A to a default real value.
+-
+-_Standard_:
+- Fortran 77 and later
+-
+-_Class_:
+- Elemental function
+-
+-_Syntax_:
+- `RESULT = FLOAT(A)'
+-
+-_Arguments_:
+- A The type shall be `INTEGER'.
+-
+-_Return value_:
+- The return value is of type default `REAL'.
+-
+-_Example_:
+- program test_float
+- integer :: i = 1
+- if (float(i) /= 1.) call abort
+- end program test_float
+-
+-_See also_:
+- *note DBLE::, *note DFLOAT::, *note REAL::
+-
+-
+-File: gfortran.info, Node: FGET, Next: FGETC, Prev: FDATE, Up: Intrinsic Procedures
+-
+-7.73 `FGET' -- Read a single character in stream mode from stdin
+-================================================================
+-
+-_Description_:
+- Read a single character in stream mode from stdin by bypassing
+- normal formatted output. Stream I/O should not be mixed with
+- normal record-oriented (formatted or unformatted) I/O on the same
+- unit; the results are unpredictable.
+-
+- This intrinsic is provided in both subroutine and function forms;
+- however, only one form can be used in any given program unit.
+-
+- Note that the `FGET' intrinsic is provided for backwards
+- compatibility with `g77'. GNU Fortran provides the Fortran 2003
+- Stream facility. Programmers should consider the use of new
+- stream IO feature in new code for future portability. See also
+- *note Fortran 2003 status::.
+-
+-_Standard_:
+- GNU extension
+-
+-_Class_:
+- Subroutine, function
+-
+-_Syntax_:
+- `CALL FGET(C [, STATUS])'
+-
+-_Arguments_:
+- C The type shall be `CHARACTER' and of default
+- kind.
+- STATUS (Optional) status flag of type `INTEGER'.
+- Returns 0 on success, -1 on end-of-file, and a
+- system specific positive error code otherwise.
+-
+-_Example_:
+- PROGRAM test_fget
+- INTEGER, PARAMETER :: strlen = 100
+- INTEGER :: status, i = 1
+- CHARACTER(len=strlen) :: str = ""
+-
+- WRITE (*,*) 'Enter text:'
+- DO
+- CALL fget(str(i:i), status)
+- if (status /= 0 .OR. i > strlen) exit
+- i = i + 1
+- END DO
+- WRITE (*,*) TRIM(str)
+- END PROGRAM
+-
+-_See also_:
+- *note FGETC::, *note FPUT::, *note FPUTC::
+-
+-
+-File: gfortran.info, Node: FGETC, Next: FLOAT, Prev: FGET, Up: Intrinsic Procedures
+-
+-7.74 `FGETC' -- Read a single character in stream mode
+-======================================================
+-
+-_Description_:
+- Read a single character in stream mode by bypassing normal
+- formatted output. Stream I/O should not be mixed with normal
+- record-oriented (formatted or unformatted) I/O on the same unit;
+- the results are unpredictable.
+-
+- This intrinsic is provided in both subroutine and function forms;
+- however, only one form can be used in any given program unit.
+-
+- Note that the `FGET' intrinsic is provided for backwards
+- compatibility with `g77'. GNU Fortran provides the Fortran 2003
+- Stream facility. Programmers should consider the use of new
+- stream IO feature in new code for future portability. See also
+- *note Fortran 2003 status::.
+-
+-_Standard_:
+- GNU extension
+-
+-_Class_:
+- Subroutine, function
+-
+-_Syntax_:
+- `CALL FGETC(UNIT, C [, STATUS])'
+-
+-_Arguments_:
+- UNIT The type shall be `INTEGER'.
+- C The type shall be `CHARACTER' and of default
+- kind.
+- STATUS (Optional) status flag of type `INTEGER'.
+- Returns 0 on success, -1 on end-of-file and a
+- system specific positive error code otherwise.
+-
+-_Example_:
+- PROGRAM test_fgetc
+- INTEGER :: fd = 42, status
+- CHARACTER :: c
+-
+- OPEN(UNIT=fd, FILE="/etc/passwd", ACTION="READ", STATUS = "OLD")
+- DO
+- CALL fgetc(fd, c, status)
+- IF (status /= 0) EXIT
+- call fput(c)
+- END DO
+- CLOSE(UNIT=fd)
+- END PROGRAM
+-
+-_See also_:
+- *note FGET::, *note FPUT::, *note FPUTC::
+-
+-
+-File: gfortran.info, Node: FLOOR, Next: FLUSH, Prev: FLOAT, Up: Intrinsic Procedures
+-
+-7.75 `FLOOR' -- Integer floor function
+-======================================
+-
+-_Description_:
+- `FLOOR(A)' returns the greatest integer less than or equal to X.
+-
+-_Standard_:
+- Fortran 95 and later
+-
+-_Class_:
+- Elemental function
+-
+-_Syntax_:
+- `RESULT = FLOOR(A [, KIND])'
+-
+-_Arguments_:
+- A The type shall be `REAL'.
+- KIND (Optional) An `INTEGER' initialization
+- expression indicating the kind parameter of
+- the result.
+-
+-_Return value_:
+- The return value is of type `INTEGER(KIND)' if KIND is present and
+- of default-kind `INTEGER' otherwise.
+-
+-_Example_:
+- program test_floor
+- real :: x = 63.29
+- real :: y = -63.59
+- print *, floor(x) ! returns 63
+- print *, floor(y) ! returns -64
+- end program test_floor
+-
+-_See also_:
+- *note CEILING::, *note NINT::
+-
+-
+-
+-File: gfortran.info, Node: FLUSH, Next: FNUM, Prev: FLOOR, Up: Intrinsic Procedures
+-
+-7.76 `FLUSH' -- Flush I/O unit(s)
+-=================================
+-
+-_Description_:
+- Flushes Fortran unit(s) currently open for output. Without the
+- optional argument, all units are flushed, otherwise just the unit
+- specified.
+-
+-_Standard_:
+- GNU extension
+-
+-_Class_:
+- Subroutine
+-
+-_Syntax_:
+- `CALL FLUSH(UNIT)'
+-
+-_Arguments_:
+- UNIT (Optional) The type shall be `INTEGER'.
+-
+-_Note_:
+- Beginning with the Fortran 2003 standard, there is a `FLUSH'
+- statement that should be preferred over the `FLUSH' intrinsic.
+-
+-
+-
+-File: gfortran.info, Node: FNUM, Next: FPUT, Prev: FLUSH, Up: Intrinsic Procedures
+-
+-7.77 `FNUM' -- File number function
+-===================================
+-
+-_Description_:
+- `FNUM(UNIT)' returns the POSIX file descriptor number
+- corresponding to the open Fortran I/O unit `UNIT'.
+-
+-_Standard_:
+- GNU extension
+-
+-_Class_:
+- Function
+-
+-_Syntax_:
+- `RESULT = FNUM(UNIT)'
+-
+-_Arguments_:
+- UNIT The type shall be `INTEGER'.
+-
+-_Return value_:
+- The return value is of type `INTEGER'
+-
+-_Example_:
+- program test_fnum
+- integer :: i
+- open (unit=10, status = "scratch")
+- i = fnum(10)
+- print *, i
+- close (10)
+- end program test_fnum
+-
+-
+-File: gfortran.info, Node: FPUT, Next: FPUTC, Prev: FNUM, Up: Intrinsic Procedures
+-
+-7.78 `FPUT' -- Write a single character in stream mode to stdout
+-================================================================
+-
+-_Description_:
+- Write a single character in stream mode to stdout by bypassing
+- normal formatted output. Stream I/O should not be mixed with
+- normal record-oriented (formatted or unformatted) I/O on the same
+- unit; the results are unpredictable.
+-
+- This intrinsic is provided in both subroutine and function forms;
+- however, only one form can be used in any given program unit.
+-
+- Note that the `FGET' intrinsic is provided for backwards
+- compatibility with `g77'. GNU Fortran provides the Fortran 2003
+- Stream facility. Programmers should consider the use of new
+- stream IO feature in new code for future portability. See also
+- *note Fortran 2003 status::.
+-
+-_Standard_:
+- GNU extension
+-
+-_Class_:
+- Subroutine, function
+-
+-_Syntax_:
+- `CALL FPUT(C [, STATUS])'
+-
+-_Arguments_:
+- C The type shall be `CHARACTER' and of default
+- kind.
+- STATUS (Optional) status flag of type `INTEGER'.
+- Returns 0 on success, -1 on end-of-file and a
+- system specific positive error code otherwise.
+-
+-_Example_:
+- PROGRAM test_fput
+- CHARACTER(len=10) :: str = "gfortran"
+- INTEGER :: i
+- DO i = 1, len_trim(str)
+- CALL fput(str(i:i))
+- END DO
+- END PROGRAM
+-
+-_See also_:
+- *note FPUTC::, *note FGET::, *note FGETC::
+-
+-
+-File: gfortran.info, Node: FPUTC, Next: FRACTION, Prev: FPUT, Up: Intrinsic Procedures
+-
+-7.79 `FPUTC' -- Write a single character in stream mode
+-=======================================================
+-
+-_Description_:
+- Write a single character in stream mode by bypassing normal
+- formatted output. Stream I/O should not be mixed with normal
+- record-oriented (formatted or unformatted) I/O on the same unit;
+- the results are unpredictable.
+-
+- This intrinsic is provided in both subroutine and function forms;
+- however, only one form can be used in any given program unit.
+-
+- Note that the `FGET' intrinsic is provided for backwards
+- compatibility with `g77'. GNU Fortran provides the Fortran 2003
+- Stream facility. Programmers should consider the use of new
+- stream IO feature in new code for future portability. See also
+- *note Fortran 2003 status::.
+-
+-_Standard_:
+- GNU extension
+-
+-_Class_:
+- Subroutine, function
+-
+-_Syntax_:
+- `CALL FPUTC(UNIT, C [, STATUS])'
+-
+-_Arguments_:
+- UNIT The type shall be `INTEGER'.
+- C The type shall be `CHARACTER' and of default
+- kind.
+- STATUS (Optional) status flag of type `INTEGER'.
+- Returns 0 on success, -1 on end-of-file and a
+- system specific positive error code otherwise.
+-
+-_Example_:
+- PROGRAM test_fputc
+- CHARACTER(len=10) :: str = "gfortran"
+- INTEGER :: fd = 42, i
+-
+- OPEN(UNIT = fd, FILE = "out", ACTION = "WRITE", STATUS="NEW")
+- DO i = 1, len_trim(str)
+- CALL fputc(fd, str(i:i))
+- END DO
+- CLOSE(fd)
+- END PROGRAM
+-
+-_See also_:
+- *note FPUT::, *note FGET::, *note FGETC::
+-
+-
+-File: gfortran.info, Node: FRACTION, Next: FREE, Prev: FPUTC, Up: Intrinsic Procedures
+-
+-7.80 `FRACTION' -- Fractional part of the model representation
+-==============================================================
+-
+-_Description_:
+- `FRACTION(X)' returns the fractional part of the model
+- representation of `X'.
+-
+-_Standard_:
+- Fortran 95 and later
+-
+-_Class_:
+- Elemental function
+-
+-_Syntax_:
+- `Y = FRACTION(X)'
+-
+-_Arguments_:
+- X The type of the argument shall be a `REAL'.
+-
+-_Return value_:
+- The return value is of the same type and kind as the argument.
+- The fractional part of the model representation of `X' is returned;
+- it is `X * RADIX(X)**(-EXPONENT(X))'.
+-
+-_Example_:
+- program test_fraction
+- real :: x
+- x = 178.1387e-4
+- print *, fraction(x), x * radix(x)**(-exponent(x))
+- end program test_fraction
+-
+-
+-
+-File: gfortran.info, Node: FREE, Next: FSEEK, Prev: FRACTION, Up: Intrinsic Procedures
+-
+-7.81 `FREE' -- Frees memory
+-===========================
+-
+-_Description_:
+- Frees memory previously allocated by `MALLOC()'. The `FREE'
+- intrinsic is an extension intended to be used with Cray pointers,
+- and is provided in GNU Fortran to allow user to compile legacy
+- code. For new code using Fortran 95 pointers, the memory
+- de-allocation intrinsic is `DEALLOCATE'.
+-
+-_Standard_:
+- GNU extension
+-
+-_Class_:
+- Subroutine
+-
+-_Syntax_:
+- `CALL FREE(PTR)'
+-
+-_Arguments_:
+- PTR The type shall be `INTEGER'. It represents the
+- location of the memory that should be
+- de-allocated.
+-
+-_Return value_:
+- None
+-
+-_Example_:
+- See `MALLOC' for an example.
+-
+-_See also_:
+- *note MALLOC::
+-
+-
+-File: gfortran.info, Node: FSEEK, Next: FSTAT, Prev: FREE, Up: Intrinsic Procedures
+-
+-7.82 `FSEEK' -- Low level file positioning subroutine
+-=====================================================
+-
+-_Description_:
+- Moves UNIT to the specified OFFSET. If WHENCE is set to 0, the
+- OFFSET is taken as an absolute value `SEEK_SET', if set to 1,
+- OFFSET is taken to be relative to the current position `SEEK_CUR',
+- and if set to 2 relative to the end of the file `SEEK_END'. On
+- error, STATUS is set to a nonzero value. If STATUS the seek fails
+- silently.
+-
+- This intrinsic routine is not fully backwards compatible with
+- `g77'. In `g77', the `FSEEK' takes a statement label instead of a
+- STATUS variable. If FSEEK is used in old code, change
+- CALL FSEEK(UNIT, OFFSET, WHENCE, *label)
+- to
+- INTEGER :: status
+- CALL FSEEK(UNIT, OFFSET, WHENCE, status)
+- IF (status /= 0) GOTO label
+-
+- Please note that GNU Fortran provides the Fortran 2003 Stream
+- facility. Programmers should consider the use of new stream IO
+- feature in new code for future portability. See also *note Fortran
+- 2003 status::.
+-
+-_Standard_:
+- GNU extension
+-
+-_Class_:
+- Subroutine
+-
+-_Syntax_:
+- `CALL FSEEK(UNIT, OFFSET, WHENCE[, STATUS])'
+-
+-_Arguments_:
+- UNIT Shall be a scalar of type `INTEGER'.
+- OFFSET Shall be a scalar of type `INTEGER'.
+- WHENCE Shall be a scalar of type `INTEGER'. Its
+- value shall be either 0, 1 or 2.
+- STATUS (Optional) shall be a scalar of type
+- `INTEGER(4)'.
+-
+-_Example_:
+- PROGRAM test_fseek
+- INTEGER, PARAMETER :: SEEK_SET = 0, SEEK_CUR = 1, SEEK_END = 2
+- INTEGER :: fd, offset, ierr
+-
+- ierr = 0
+- offset = 5
+- fd = 10
+-
+- OPEN(UNIT=fd, FILE="fseek.test")
+- CALL FSEEK(fd, offset, SEEK_SET, ierr) ! move to OFFSET
+- print *, FTELL(fd), ierr
+-
+- CALL FSEEK(fd, 0, SEEK_END, ierr) ! move to end
+- print *, FTELL(fd), ierr
+-
+- CALL FSEEK(fd, 0, SEEK_SET, ierr) ! move to beginning
+- print *, FTELL(fd), ierr
+-
+- CLOSE(UNIT=fd)
+- END PROGRAM
+-
+-_See also_:
+- *note FTELL::
+-
+-
+-File: gfortran.info, Node: FSTAT, Next: FTELL, Prev: FSEEK, Up: Intrinsic Procedures
+-
+-7.83 `FSTAT' -- Get file status
+-===============================
+-
+-_Description_:
+- `FSTAT' is identical to *note STAT::, except that information
+- about an already opened file is obtained.
+-
+- The elements in `BUFF' are the same as described by *note STAT::.
+-
+- This intrinsic is provided in both subroutine and function forms;
+- however, only one form can be used in any given program unit.
+-
+-_Standard_:
+- GNU extension
+-
+-_Class_:
+- Subroutine, function
+-
+-_Syntax_:
+- `CALL FSTAT(UNIT, BUFF [, STATUS])'
+-
+-_Arguments_:
+- UNIT An open I/O unit number of type `INTEGER'.
+- BUFF The type shall be `INTEGER(4), DIMENSION(13)'.
+- STATUS (Optional) status flag of type `INTEGER(4)'.
+- Returns 0 on success and a system specific
+- error code otherwise.
+-
+-_Example_:
+- See *note STAT:: for an example.
+-
+-_See also_:
+- To stat a link: *note LSTAT::, to stat a file: *note STAT::
+-
+-
+-File: gfortran.info, Node: FTELL, Next: GAMMA, Prev: FSTAT, Up: Intrinsic Procedures
+-
+-7.84 `FTELL' -- Current stream position
+-=======================================
+-
+-_Description_:
+- Retrieves the current position within an open file.
+-
+- This intrinsic is provided in both subroutine and function forms;
+- however, only one form can be used in any given program unit.
+-
+-_Standard_:
+- GNU extension
+-
+-_Class_:
+- Subroutine, function
+-
+-_Syntax_:
+- `CALL FTELL(UNIT, OFFSET)'
+- `OFFSET = FTELL(UNIT)'
+-
+-_Arguments_:
+- OFFSET Shall of type `INTEGER'.
+- UNIT Shall of type `INTEGER'.
+-
+-_Return value_:
+- In either syntax, OFFSET is set to the current offset of unit
+- number UNIT, or to -1 if the unit is not currently open.
+-
+-_Example_:
+- PROGRAM test_ftell
+- INTEGER :: i
+- OPEN(10, FILE="temp.dat")
+- CALL ftell(10,i)
+- WRITE(*,*) i
+- END PROGRAM
+-
+-_See also_:
+- *note FSEEK::
+-
+-
+-File: gfortran.info, Node: GAMMA, Next: GERROR, Prev: FTELL, Up: Intrinsic Procedures
+-
+-7.85 `GAMMA' -- Gamma function
+-==============================
+-
+-_Description_:
+- `GAMMA(X)' computes Gamma (\Gamma) of X. For positive, integer
+- values of X the Gamma function simplifies to the factorial
+- function \Gamma(x)=(x-1)!.
+-
+-_Standard_:
+- Fortran 2008 and later
+-
+-_Class_:
+- Elemental function
+-
+-_Syntax_:
+- `X = GAMMA(X)'
+-
+-_Arguments_:
+- X Shall be of type `REAL' and neither zero nor a
+- negative integer.
+-
+-_Return value_:
+- The return value is of type `REAL' of the same kind as X.
+-
+-_Example_:
+- program test_gamma
+- real :: x = 1.0
+- x = gamma(x) ! returns 1.0
+- end program test_gamma
+-
+-_Specific names_:
+- Name Argument Return type Standard
+- `GAMMA(X)' `REAL(4) X' `REAL(4)' GNU Extension
+- `DGAMMA(X)' `REAL(8) X' `REAL(8)' GNU Extension
+-
+-_See also_:
+- Logarithm of the Gamma function: *note LOG_GAMMA::
+-
+-
+-
+-File: gfortran.info, Node: GERROR, Next: GETARG, Prev: GAMMA, Up: Intrinsic Procedures
+-
+-7.86 `GERROR' -- Get last system error message
+-==============================================
+-
+-_Description_:
+- Returns the system error message corresponding to the last system
+- error. This resembles the functionality of `strerror(3)' in C.
+-
+-_Standard_:
+- GNU extension
+-
+-_Class_:
+- Subroutine
+-
+-_Syntax_:
+- `CALL GERROR(RESULT)'
+-
+-_Arguments_:
+- RESULT Shall of type `CHARACTER' and of default
+-
+-_Example_:
+- PROGRAM test_gerror
+- CHARACTER(len=100) :: msg
+- CALL gerror(msg)
+- WRITE(*,*) msg
+- END PROGRAM
+-
+-_See also_:
+- *note IERRNO::, *note PERROR::
+-
+-
+-File: gfortran.info, Node: GETARG, Next: GET_COMMAND, Prev: GERROR, Up: Intrinsic Procedures
+-
+-7.87 `GETARG' -- Get command line arguments
+-===========================================
+-
+-_Description_:
+- Retrieve the POS-th argument that was passed on the command line
+- when the containing program was invoked.
+-
+- This intrinsic routine is provided for backwards compatibility with
+- GNU Fortran 77. In new code, programmers should consider the use
+- of the *note GET_COMMAND_ARGUMENT:: intrinsic defined by the
+- Fortran 2003 standard.
+-
+-_Standard_:
+- GNU extension
+-
+-_Class_:
+- Subroutine
+-
+-_Syntax_:
+- `CALL GETARG(POS, VALUE)'
+-
+-_Arguments_:
+- POS Shall be of type `INTEGER' and not wider than
+- the default integer kind; POS \geq 0
+- VALUE Shall be of type `CHARACTER' and of default
+- kind.
+- VALUE Shall be of type `CHARACTER'.
+-
+-_Return value_:
+- After `GETARG' returns, the VALUE argument holds the POSth command
+- line argument. If VALUE can not hold the argument, it is truncated
+- to fit the length of VALUE. If there are less than POS arguments
+- specified at the command line, VALUE will be filled with blanks.
+- If POS = 0, VALUE is set to the name of the program (on systems
+- that support this feature).
+-
+-_Example_:
+- PROGRAM test_getarg
+- INTEGER :: i
+- CHARACTER(len=32) :: arg
+-
+- DO i = 1, iargc()
+- CALL getarg(i, arg)
+- WRITE (*,*) arg
+- END DO
+- END PROGRAM
+-
+-_See also_:
+- GNU Fortran 77 compatibility function: *note IARGC::
+-
+- Fortran 2003 functions and subroutines: *note GET_COMMAND::, *note
+- GET_COMMAND_ARGUMENT::, *note COMMAND_ARGUMENT_COUNT::
+-
+-
+-File: gfortran.info, Node: GET_COMMAND, Next: GET_COMMAND_ARGUMENT, Prev: GETARG, Up: Intrinsic Procedures
+-
+-7.88 `GET_COMMAND' -- Get the entire command line
+-=================================================
+-
+-_Description_:
+- Retrieve the entire command line that was used to invoke the
+- program.
+-
+-_Standard_:
+- Fortran 2003 and later
+-
+-_Class_:
+- Subroutine
+-
+-_Syntax_:
+- `CALL GET_COMMAND(COMMAND)'
+-
+-_Arguments_:
+- COMMAND Shall be of type `CHARACTER' and of default
+- kind.
+-
+-_Return value_:
+- Stores the entire command line that was used to invoke the program
+- in COMMAND. If COMMAND is not large enough, the command will be
+- truncated.
+-
+-_Example_:
+- PROGRAM test_get_command
+- CHARACTER(len=255) :: cmd
+- CALL get_command(cmd)
+- WRITE (*,*) TRIM(cmd)
+- END PROGRAM
+-
+-_See also_:
+- *note GET_COMMAND_ARGUMENT::, *note COMMAND_ARGUMENT_COUNT::
+-
+-
+-File: gfortran.info, Node: GET_COMMAND_ARGUMENT, Next: GETCWD, Prev: GET_COMMAND, Up: Intrinsic Procedures
+-
+-7.89 `GET_COMMAND_ARGUMENT' -- Get command line arguments
+-=========================================================
+-
+-_Description_:
+- Retrieve the NUMBER-th argument that was passed on the command
+- line when the containing program was invoked.
+-
+-_Standard_:
+- Fortran 2003 and later
+-
+-_Class_:
+- Subroutine
+-
+-_Syntax_:
+- `CALL GET_COMMAND_ARGUMENT(NUMBER [, VALUE, LENGTH, STATUS])'
+-
+-_Arguments_:
+- NUMBER Shall be a scalar of type `INTEGER(4)', NUMBER
+- \geq 0
+- VALUE Shall be a scalar of type `CHARACTER' and of
+- default kind.
+- LENGTH (Option) Shall be a scalar of type
+- `INTEGER(4)'.
+- STATUS (Option) Shall be a scalar of type
+- `INTEGER(4)'.
+-
+-_Return value_:
+- After `GET_COMMAND_ARGUMENT' returns, the VALUE argument holds the
+- NUMBER-th command line argument. If VALUE can not hold the
+- argument, it is truncated to fit the length of VALUE. If there are
+- less than NUMBER arguments specified at the command line, VALUE
+- will be filled with blanks. If NUMBER = 0, VALUE is set to the
+- name of the program (on systems that support this feature). The
+- LENGTH argument contains the length of the NUMBER-th command line
+- argument. If the argument retrieval fails, STATUS is a positive
+- number; if VALUE contains a truncated command line argument,
+- STATUS is -1; and otherwise the STATUS is zero.
+-
+-_Example_:
+- PROGRAM test_get_command_argument
+- INTEGER :: i
+- CHARACTER(len=32) :: arg
+-
+- i = 0
+- DO
+- CALL get_command_argument(i, arg)
+- IF (LEN_TRIM(arg) == 0) EXIT
+-
+- WRITE (*,*) TRIM(arg)
+- i = i+1
+- END DO
+- END PROGRAM
+-
+-_See also_:
+- *note GET_COMMAND::, *note COMMAND_ARGUMENT_COUNT::
+-
+-
+-File: gfortran.info, Node: GETCWD, Next: GETENV, Prev: GET_COMMAND_ARGUMENT, Up: Intrinsic Procedures
+-
+-7.90 `GETCWD' -- Get current working directory
+-==============================================
+-
+-_Description_:
+- Get current working directory.
+-
+- This intrinsic is provided in both subroutine and function forms;
+- however, only one form can be used in any given program unit.
+-
+-_Standard_:
+- GNU extension
+-
+-_Class_:
+- Subroutine, function
+-
+-_Syntax_:
+- `CALL GETCWD(C [, STATUS])'
+-
+-_Arguments_:
+- C The type shall be `CHARACTER' and of default
+- kind.
+- STATUS (Optional) status flag. Returns 0 on success,
+- a system specific and nonzero error code
+- otherwise.
+-
+-_Example_:
+- PROGRAM test_getcwd
+- CHARACTER(len=255) :: cwd
+- CALL getcwd(cwd)
+- WRITE(*,*) TRIM(cwd)
+- END PROGRAM
+-
+-_See also_:
+- *note CHDIR::
+-
+-
+-File: gfortran.info, Node: GETENV, Next: GET_ENVIRONMENT_VARIABLE, Prev: GETCWD, Up: Intrinsic Procedures
+-
+-7.91 `GETENV' -- Get an environmental variable
+-==============================================
+-
+-_Description_:
+- Get the VALUE of the environmental variable NAME.
+-
+- This intrinsic routine is provided for backwards compatibility with
+- GNU Fortran 77. In new code, programmers should consider the use
+- of the *note GET_ENVIRONMENT_VARIABLE:: intrinsic defined by the
+- Fortran 2003 standard.
+-
+-_Standard_:
+- GNU extension
+-
+-_Class_:
+- Subroutine
+-
+-_Syntax_:
+- `CALL GETENV(NAME, VALUE)'
+-
+-_Arguments_:
+- NAME Shall be of type `CHARACTER' and of default
+- kind.
+- VALUE Shall be of type `CHARACTER' and of default
+- kind.
+-
+-_Return value_:
+- Stores the value of NAME in VALUE. If VALUE is not large enough to
+- hold the data, it is truncated. If NAME is not set, VALUE will be
+- filled with blanks.
+-
+-_Example_:
+- PROGRAM test_getenv
+- CHARACTER(len=255) :: homedir
+- CALL getenv("HOME", homedir)
+- WRITE (*,*) TRIM(homedir)
+- END PROGRAM
+-
+-_See also_:
+- *note GET_ENVIRONMENT_VARIABLE::
+-
+-
+-File: gfortran.info, Node: GET_ENVIRONMENT_VARIABLE, Next: GETGID, Prev: GETENV, Up: Intrinsic Procedures
+-
+-7.92 `GET_ENVIRONMENT_VARIABLE' -- Get an environmental variable
+-================================================================
+-
+-_Description_:
+- Get the VALUE of the environmental variable NAME.
+-
+-_Standard_:
+- Fortran 2003 and later
+-
+-_Class_:
+- Subroutine
+-
+-_Syntax_:
+- `CALL GET_ENVIRONMENT_VARIABLE(NAME[, VALUE, LENGTH, STATUS,
+- TRIM_NAME)'
+-
+-_Arguments_:
+- NAME Shall be a scalar of type `CHARACTER(1)'.
+- VALUE Shall be a scalar of type `CHARACTER(1)'.
+- LENGTH Shall be a scalar of type `INTEGER(4)'.
+- STATUS Shall be a scalar of type `INTEGER(4)'.
+- TRIM_NAME Shall be a scalar of type `LOGICAL(4)'.
+-
+-_Return value_:
+- Stores the value of NAME in VALUE. If VALUE is not large enough to
+- hold the data, it is truncated. If NAME is not set, VALUE will be
+- filled with blanks. Argument LENGTH contains the length needed for
+- storing the environment variable NAME or zero if it is not
+- present. STATUS is -1 if VALUE is present but too short for the
+- environment variable; it is 1 if the environment variable does not
+- exist and 2 if the processor does not support environment
+- variables; in all other cases STATUS is zero. If TRIM_NAME is
+- present with the value `.FALSE.', the trailing blanks in NAME are
+- significant; otherwise they are not part of the environment
+- variable name.
+-
+-_Example_:
+- PROGRAM test_getenv
+- CHARACTER(len=255) :: homedir
+- CALL get_environment_variable("HOME", homedir)
+- WRITE (*,*) TRIM(homedir)
+- END PROGRAM
+-
+-
+-File: gfortran.info, Node: GETGID, Next: GETLOG, Prev: GET_ENVIRONMENT_VARIABLE, Up: Intrinsic Procedures
+-
+-7.93 `GETGID' -- Group ID function
+-==================================
+-
+-_Description_:
+- Returns the numerical group ID of the current process.
+-
+-_Standard_:
+- GNU extension
+-
+-_Class_:
+- Function
+-
+-_Syntax_:
+- `RESULT = GETGID()'
+-
+-_Return value_:
+- The return value of `GETGID' is an `INTEGER' of the default kind.
+-
+-_Example_:
+- See `GETPID' for an example.
+-
+-_See also_:
+- *note GETPID::, *note GETUID::
+-
+-
+-File: gfortran.info, Node: GETLOG, Next: GETPID, Prev: GETGID, Up: Intrinsic Procedures
+-
+-7.94 `GETLOG' -- Get login name
+-===============================
+-
+-_Description_:
+- Gets the username under which the program is running.
+-
+-_Standard_:
+- GNU extension
+-
+-_Class_:
+- Subroutine
+-
+-_Syntax_:
+- `CALL GETLOG(C)'
+-
+-_Arguments_:
+- C Shall be of type `CHARACTER' and of default
+- kind.
+-
+-_Return value_:
+- Stores the current user name in LOGIN. (On systems where POSIX
+- functions `geteuid' and `getpwuid' are not available, and the
+- `getlogin' function is not implemented either, this will return a
+- blank string.)
+-
+-_Example_:
+- PROGRAM TEST_GETLOG
+- CHARACTER(32) :: login
+- CALL GETLOG(login)
+- WRITE(*,*) login
+- END PROGRAM
+-
+-_See also_:
+- *note GETUID::
+-
+-
+-File: gfortran.info, Node: GETPID, Next: GETUID, Prev: GETLOG, Up: Intrinsic Procedures
+-
+-7.95 `GETPID' -- Process ID function
+-====================================
+-
+-_Description_:
+- Returns the numerical process identifier of the current process.
+-
+-_Standard_:
+- GNU extension
+-
+-_Class_:
+- Function
+-
+-_Syntax_:
+- `RESULT = GETPID()'
+-
+-_Return value_:
+- The return value of `GETPID' is an `INTEGER' of the default kind.
+-
+-_Example_:
+- program info
+- print *, "The current process ID is ", getpid()
+- print *, "Your numerical user ID is ", getuid()
+- print *, "Your numerical group ID is ", getgid()
+- end program info
+-
+-_See also_:
+- *note GETGID::, *note GETUID::
+-
+-
+-File: gfortran.info, Node: GETUID, Next: GMTIME, Prev: GETPID, Up: Intrinsic Procedures
+-
+-7.96 `GETUID' -- User ID function
+-=================================
+-
+-_Description_:
+- Returns the numerical user ID of the current process.
+-
+-_Standard_:
+- GNU extension
+-
+-_Class_:
+- Function
+-
+-_Syntax_:
+- `RESULT = GETUID()'
+-
+-_Return value_:
+- The return value of `GETUID' is an `INTEGER' of the default kind.
+-
+-_Example_:
+- See `GETPID' for an example.
+-
+-_See also_:
+- *note GETPID::, *note GETLOG::
+-
+-
+-File: gfortran.info, Node: GMTIME, Next: HOSTNM, Prev: GETUID, Up: Intrinsic Procedures
+-
+-7.97 `GMTIME' -- Convert time to GMT info
+-=========================================
+-
+-_Description_:
+- Given a system time value TIME (as provided by the `TIME8()'
+- intrinsic), fills VALUES with values extracted from it appropriate
+- to the UTC time zone (Universal Coordinated Time, also known in
+- some countries as GMT, Greenwich Mean Time), using `gmtime(3)'.
+-
+-_Standard_:
+- GNU extension
+-
+-_Class_:
+- Subroutine
+-
+-_Syntax_:
+- `CALL GMTIME(TIME, VALUES)'
+-
+-_Arguments_:
+- TIME An `INTEGER' scalar expression corresponding
+- to a system time, with `INTENT(IN)'.
+- VALUES A default `INTEGER' array with 9 elements,
+- with `INTENT(OUT)'.
+-
+-_Return value_:
+- The elements of VALUES are assigned as follows:
+- 1. Seconds after the minute, range 0-59 or 0-61 to allow for leap
+- seconds
+-
+- 2. Minutes after the hour, range 0-59
+-
+- 3. Hours past midnight, range 0-23
+-
+- 4. Day of month, range 0-31
+-
+- 5. Number of months since January, range 0-12
+-
+- 6. Years since 1900
+-
+- 7. Number of days since Sunday, range 0-6
+-
+- 8. Days since January 1
+-
+- 9. Daylight savings indicator: positive if daylight savings is in
+- effect, zero if not, and negative if the information is not
+- available.
+-
+-_See also_:
+- *note CTIME::, *note LTIME::, *note TIME::, *note TIME8::
+-
+-
+-
+-File: gfortran.info, Node: HOSTNM, Next: HUGE, Prev: GMTIME, Up: Intrinsic Procedures
+-
+-7.98 `HOSTNM' -- Get system host name
+-=====================================
+-
+-_Description_:
+- Retrieves the host name of the system on which the program is
+- running.
+-
+- This intrinsic is provided in both subroutine and function forms;
+- however, only one form can be used in any given program unit.
+-
+-_Standard_:
+- GNU extension
+-
+-_Class_:
+- Subroutine, function
+-
+-_Syntax_:
+- `CALL HOSTNM(C [, STATUS])'
+- `STATUS = HOSTNM(NAME)'
+-
+-_Arguments_:
+- C Shall of type `CHARACTER' and of default kind.
+- STATUS (Optional) status flag of type `INTEGER'.
+- Returns 0 on success, or a system specific
+- error code otherwise.
+-
+-_Return value_:
+- In either syntax, NAME is set to the current hostname if it can be
+- obtained, or to a blank string otherwise.
+-
+-
+-
+-File: gfortran.info, Node: HUGE, Next: HYPOT, Prev: HOSTNM, Up: Intrinsic Procedures
+-
+-7.99 `HUGE' -- Largest number of a kind
+-=======================================
+-
+-_Description_:
+- `HUGE(X)' returns the largest number that is not an infinity in
+- the model of the type of `X'.
+-
+-_Standard_:
+- Fortran 95 and later
+-
+-_Class_:
+- Inquiry function
+-
+-_Syntax_:
+- `RESULT = HUGE(X)'
+-
+-_Arguments_:
+- X Shall be of type `REAL' or `INTEGER'.
+-
+-_Return value_:
+- The return value is of the same type and kind as X
+-
+-_Example_:
+- program test_huge_tiny
+- print *, huge(0), huge(0.0), huge(0.0d0)
+- print *, tiny(0.0), tiny(0.0d0)
+- end program test_huge_tiny
+-
+-
+-File: gfortran.info, Node: HYPOT, Next: IACHAR, Prev: HUGE, Up: Intrinsic Procedures
+-
+-7.100 `HYPOT' -- Euclidean distance function
+-============================================
+-
+-_Description_:
+- `HYPOT(X,Y)' is the Euclidean distance function. It is equal to
+- \sqrtX^2 + Y^2, without undue underflow or overflow.
+-
+-_Standard_:
+- Fortran 2008 and later
+-
+-_Class_:
+- Elemental function
+-
+-_Syntax_:
+- `RESULT = HYPOT(X, Y)'
+-
+-_Arguments_:
+- X The type shall be `REAL'.
+- Y The type and kind type parameter shall be the
+- same as X.
+-
+-_Return value_:
+- The return value has the same type and kind type parameter as X.
+-
+-_Example_:
+- program test_hypot
+- real(4) :: x = 1.e0_4, y = 0.5e0_4
+- x = hypot(x,y)
+- end program test_hypot
+-
+-
+-File: gfortran.info, Node: IACHAR, Next: IAND, Prev: HYPOT, Up: Intrinsic Procedures
+-
+-7.101 `IACHAR' -- Code in ASCII collating sequence
+-==================================================
+-
+-_Description_:
+- `IACHAR(C)' returns the code for the ASCII character in the first
+- character position of `C'.
+-
+-_Standard_:
+- Fortran 95 and later, with KIND argument Fortran 2003 and later
+-
+-_Class_:
+- Elemental function
+-
+-_Syntax_:
+- `RESULT = IACHAR(C [, KIND])'
+-
+-_Arguments_:
+- C Shall be a scalar `CHARACTER', with
+- `INTENT(IN)'
+- KIND (Optional) An `INTEGER' initialization
+- expression indicating the kind parameter of
+- the result.
+-
+-_Return value_:
+- The return value is of type `INTEGER' and of kind KIND. If KIND is
+- absent, the return value is of default integer kind.
+-
+-_Example_:
+- program test_iachar
+- integer i
+- i = iachar(' ')
+- end program test_iachar
+-
+-_Note_:
+- See *note ICHAR:: for a discussion of converting between numerical
+- values and formatted string representations.
+-
+-_See also_:
+- *note ACHAR::, *note CHAR::, *note ICHAR::
+-
+-
+-
+-File: gfortran.info, Node: IAND, Next: IARGC, Prev: IACHAR, Up: Intrinsic Procedures
+-
+-7.102 `IAND' -- Bitwise logical and
+-===================================
+-
+-_Description_:
+- Bitwise logical `AND'.
+-
+-_Standard_:
+- Fortran 95 and later
+-
+-_Class_:
+- Elemental function
+-
+-_Syntax_:
+- `RESULT = IAND(I, J)'
+-
+-_Arguments_:
+- I The type shall be `INTEGER'.
+- J The type shall be `INTEGER', of the same kind
+- as I. (As a GNU extension, different kinds
+- are also permitted.)
+-
+-_Return value_:
+- The return type is `INTEGER', of the same kind as the arguments.
+- (If the argument kinds differ, it is of the same kind as the
+- larger argument.)
+-
+-_Example_:
+- PROGRAM test_iand
+- INTEGER :: a, b
+- DATA a / Z'F' /, b / Z'3' /
+- WRITE (*,*) IAND(a, b)
+- END PROGRAM
+-
+-_See also_:
+- *note IOR::, *note IEOR::, *note IBITS::, *note IBSET::, *note
+- IBCLR::, *note NOT::
+-
+-
+-
+-File: gfortran.info, Node: IARGC, Next: IBCLR, Prev: IAND, Up: Intrinsic Procedures
+-
+-7.103 `IARGC' -- Get the number of command line arguments
+-=========================================================
+-
+-_Description_:
+- `IARGC()' returns the number of arguments passed on the command
+- line when the containing program was invoked.
+-
+- This intrinsic routine is provided for backwards compatibility with
+- GNU Fortran 77. In new code, programmers should consider the use
+- of the *note COMMAND_ARGUMENT_COUNT:: intrinsic defined by the
+- Fortran 2003 standard.
+-
+-_Standard_:
+- GNU extension
+-
+-_Class_:
+- Function
+-
+-_Syntax_:
+- `RESULT = IARGC()'
+-
+-_Arguments_:
+- None.
+-
+-_Return value_:
+- The number of command line arguments, type `INTEGER(4)'.
+-
+-_Example_:
+- See *note GETARG::
+-
+-_See also_:
+- GNU Fortran 77 compatibility subroutine: *note GETARG::
+-
+- Fortran 2003 functions and subroutines: *note GET_COMMAND::, *note
+- GET_COMMAND_ARGUMENT::, *note COMMAND_ARGUMENT_COUNT::
+-
+-
+-File: gfortran.info, Node: IBCLR, Next: IBITS, Prev: IARGC, Up: Intrinsic Procedures
+-
+-7.104 `IBCLR' -- Clear bit
+-==========================
+-
+-_Description_:
+- `IBCLR' returns the value of I with the bit at position POS set to
+- zero.
+-
+-_Standard_:
+- Fortran 95 and later
+-
+-_Class_:
+- Elemental function
+-
+-_Syntax_:
+- `RESULT = IBCLR(I, POS)'
+-
+-_Arguments_:
+- I The type shall be `INTEGER'.
+- POS The type shall be `INTEGER'.
+-
+-_Return value_:
+- The return value is of type `INTEGER' and of the same kind as I.
+-
+-_See also_:
+- *note IBITS::, *note IBSET::, *note IAND::, *note IOR::, *note
+- IEOR::, *note MVBITS::
+-
+-
+-
+-File: gfortran.info, Node: IBITS, Next: IBSET, Prev: IBCLR, Up: Intrinsic Procedures
+-
+-7.105 `IBITS' -- Bit extraction
+-===============================
+-
+-_Description_:
+- `IBITS' extracts a field of length LEN from I, starting from bit
+- position POS and extending left for LEN bits. The result is
+- right-justified and the remaining bits are zeroed. The value of
+- `POS+LEN' must be less than or equal to the value `BIT_SIZE(I)'.
+-
+-_Standard_:
+- Fortran 95 and later
+-
+-_Class_:
+- Elemental function
+-
+-_Syntax_:
+- `RESULT = IBITS(I, POS, LEN)'
+-
+-_Arguments_:
+- I The type shall be `INTEGER'.
+- POS The type shall be `INTEGER'.
+- LEN The type shall be `INTEGER'.
+-
+-_Return value_:
+- The return value is of type `INTEGER' and of the same kind as I.
+-
+-_See also_:
+- *note BIT_SIZE::, *note IBCLR::, *note IBSET::, *note IAND::,
+- *note IOR::, *note IEOR::
+-
+-
+-File: gfortran.info, Node: IBSET, Next: ICHAR, Prev: IBITS, Up: Intrinsic Procedures
+-
+-7.106 `IBSET' -- Set bit
+-========================
+-
+-_Description_:
+- `IBSET' returns the value of I with the bit at position POS set to
+- one.
+-
+-_Standard_:
+- Fortran 95 and later
+-
+-_Class_:
+- Elemental function
+-
+-_Syntax_:
+- `RESULT = IBSET(I, POS)'
+-
+-_Arguments_:
+- I The type shall be `INTEGER'.
+- POS The type shall be `INTEGER'.
+-
+-_Return value_:
+- The return value is of type `INTEGER' and of the same kind as I.
+-
+-_See also_:
+- *note IBCLR::, *note IBITS::, *note IAND::, *note IOR::, *note
+- IEOR::, *note MVBITS::
+-
+-
+-
+-File: gfortran.info, Node: ICHAR, Next: IDATE, Prev: IBSET, Up: Intrinsic Procedures
+-
+-7.107 `ICHAR' -- Character-to-integer conversion function
+-=========================================================
+-
+-_Description_:
+- `ICHAR(C)' returns the code for the character in the first
+- character position of `C' in the system's native character set.
+- The correspondence between characters and their codes is not
+- necessarily the same across different GNU Fortran implementations.
+-
+-_Standard_:
+- Fortan 95 and later, with KIND argument Fortran 2003 and later
+-
+-_Class_:
+- Elemental function
+-
+-_Syntax_:
+- `RESULT = ICHAR(C [, KIND])'
+-
+-_Arguments_:
+- C Shall be a scalar `CHARACTER', with
+- `INTENT(IN)'
+- KIND (Optional) An `INTEGER' initialization
+- expression indicating the kind parameter of
+- the result.
+-
+-_Return value_:
+- The return value is of type `INTEGER' and of kind KIND. If KIND is
+- absent, the return value is of default integer kind.
+-
+-_Example_:
+- program test_ichar
+- integer i
+- i = ichar(' ')
+- end program test_ichar
+-
+-_Note_:
+- No intrinsic exists to convert between a numeric value and a
+- formatted character string representation - for instance, given the
+- `CHARACTER' value `'154'', obtaining an `INTEGER' or `REAL' value
+- with the value 154, or vice versa. Instead, this functionality is
+- provided by internal-file I/O, as in the following example:
+- program read_val
+- integer value
+- character(len=10) string, string2
+- string = '154'
+-
+- ! Convert a string to a numeric value
+- read (string,'(I10)') value
+- print *, value
+-
+- ! Convert a value to a formatted string
+- write (string2,'(I10)') value
+- print *, string2
+- end program read_val
+-
+-_See also_:
+- *note ACHAR::, *note CHAR::, *note IACHAR::
+-
+-
+-
+-File: gfortran.info, Node: IDATE, Next: IEOR, Prev: ICHAR, Up: Intrinsic Procedures
+-
+-7.108 `IDATE' -- Get current local time subroutine (day/month/year)
+-===================================================================
+-
+-_Description_:
+- `IDATE(TARRAY)' Fills TARRAY with the numerical values at the
+- current local time. The day (in the range 1-31), month (in the
+- range 1-12), and year appear in elements 1, 2, and 3 of TARRAY,
+- respectively. The year has four significant digits.
+-
+-_Standard_:
+- GNU extension
+-
+-_Class_:
+- Subroutine
+-
+-_Syntax_:
+- `CALL IDATE(VALUES)'
+-
+-_Arguments_:
+- VALUES The type shall be `INTEGER, DIMENSION(3)' and
+- the kind shall be the default integer kind.
+-
+-_Return value_:
+- Does not return anything.
+-
+-_Example_:
+- program test_idate
+- integer, dimension(3) :: tarray
+- call idate(tarray)
+- print *, tarray(1)
+- print *, tarray(2)
+- print *, tarray(3)
+- end program test_idate
+-
+-
+-File: gfortran.info, Node: IEOR, Next: IERRNO, Prev: IDATE, Up: Intrinsic Procedures
+-
+-7.109 `IEOR' -- Bitwise logical exclusive or
+-============================================
+-
+-_Description_:
+- `IEOR' returns the bitwise boolean exclusive-OR of I and J.
+-
+-_Standard_:
+- Fortran 95 and later
+-
+-_Class_:
+- Elemental function
+-
+-_Syntax_:
+- `RESULT = IEOR(I, J)'
+-
+-_Arguments_:
+- I The type shall be `INTEGER'.
+- J The type shall be `INTEGER', of the same kind
+- as I. (As a GNU extension, different kinds
+- are also permitted.)
+-
+-_Return value_:
+- The return type is `INTEGER', of the same kind as the arguments.
+- (If the argument kinds differ, it is of the same kind as the
+- larger argument.)
+-
+-_See also_:
+- *note IOR::, *note IAND::, *note IBITS::, *note IBSET::, *note
+- IBCLR::, *note NOT::
+-
+-
+-File: gfortran.info, Node: IERRNO, Next: INDEX intrinsic, Prev: IEOR, Up: Intrinsic Procedures
+-
+-7.110 `IERRNO' -- Get the last system error number
+-==================================================
+-
+-_Description_:
+- Returns the last system error number, as given by the C `errno()'
+- function.
+-
+-_Standard_:
+- GNU extension
+-
+-_Class_:
+- Function
+-
+-_Syntax_:
+- `RESULT = IERRNO()'
+-
+-_Arguments_:
+- None.
+-
+-_Return value_:
+- The return value is of type `INTEGER' and of the default integer
+- kind.
+-
+-_See also_:
+- *note PERROR::
+-
+-
+-File: gfortran.info, Node: INDEX intrinsic, Next: INT, Prev: IERRNO, Up: Intrinsic Procedures
+-
+-7.111 `INDEX' -- Position of a substring within a string
+-========================================================
+-
+-_Description_:
+- Returns the position of the start of the first occurrence of string
+- SUBSTRING as a substring in STRING, counting from one. If
+- SUBSTRING is not present in STRING, zero is returned. If the BACK
+- argument is present and true, the return value is the start of the
+- last occurrence rather than the first.
+-
+-_Standard_:
+- Fortran 77 and later, with KIND argument Fortran 2003 and later
+-
+-_Class_:
+- Elemental function
+-
+-_Syntax_:
+- `RESULT = INDEX(STRING, SUBSTRING [, BACK [, KIND]])'
+-
+-_Arguments_:
+- STRING Shall be a scalar `CHARACTER', with
+- `INTENT(IN)'
+- SUBSTRING Shall be a scalar `CHARACTER', with
+- `INTENT(IN)'
+- BACK (Optional) Shall be a scalar `LOGICAL', with
+- `INTENT(IN)'
+- KIND (Optional) An `INTEGER' initialization
+- expression indicating the kind parameter of
+- the result.
+-
+-_Return value_:
+- The return value is of type `INTEGER' and of kind KIND. If KIND is
+- absent, the return value is of default integer kind.
+-
+-_See also_:
+- *note SCAN::, *note VERIFY::
+-
+-
+-File: gfortran.info, Node: INT, Next: INT2, Prev: INDEX intrinsic, Up: Intrinsic Procedures
+-
+-7.112 `INT' -- Convert to integer type
+-======================================
+-
+-_Description_:
+- Convert to integer type
+-
+-_Standard_:
+- Fortran 77 and later
+-
+-_Class_:
+- Elemental function
+-
+-_Syntax_:
+- `RESULT = INT(A [, KIND))'
+-
+-_Arguments_:
+- A Shall be of type `INTEGER', `REAL', or
+- `COMPLEX'.
+- KIND (Optional) An `INTEGER' initialization
+- expression indicating the kind parameter of
+- the result.
+-
+-_Return value_:
+- These functions return a `INTEGER' variable or array under the
+- following rules:
+-
+- (A)
+- If A is of type `INTEGER', `INT(A) = A'
+-
+- (B)
+- If A is of type `REAL' and |A| < 1, `INT(A)' equals `0'. If
+- |A| \geq 1, then `INT(A)' equals the largest integer that
+- does not exceed the range of A and whose sign is the same as
+- the sign of A.
+-
+- (C)
+- If A is of type `COMPLEX', rule B is applied to the real part
+- of A.
+-
+-_Example_:
+- program test_int
+- integer :: i = 42
+- complex :: z = (-3.7, 1.0)
+- print *, int(i)
+- print *, int(z), int(z,8)
+- end program
+-
+-_Specific names_:
+- Name Argument Return type Standard
+- `IFIX(A)' `REAL(4) A' `INTEGER' Fortran 77 and
+- later
+- `IDINT(A)' `REAL(8) A' `INTEGER' Fortran 77 and
+- later
+-
+-
+-
+-File: gfortran.info, Node: INT2, Next: INT8, Prev: INT, Up: Intrinsic Procedures
+-
+-7.113 `INT2' -- Convert to 16-bit integer type
+-==============================================
+-
+-_Description_:
+- Convert to a `KIND=2' integer type. This is equivalent to the
+- standard `INT' intrinsic with an optional argument of `KIND=2',
+- and is only included for backwards compatibility.
+-
+- The `SHORT' intrinsic is equivalent to `INT2'.
+-
+-_Standard_:
+- GNU extension
+-
+-_Class_:
+- Elemental function
+-
+-_Syntax_:
+- `RESULT = INT2(A)'
+-
+-_Arguments_:
+- A Shall be of type `INTEGER', `REAL', or
+- `COMPLEX'.
+-
+-_Return value_:
+- The return value is a `INTEGER(2)' variable.
+-
+-_See also_:
+- *note INT::, *note INT8::, *note LONG::
+-
+-
+-File: gfortran.info, Node: INT8, Next: IOR, Prev: INT2, Up: Intrinsic Procedures
+-
+-7.114 `INT8' -- Convert to 64-bit integer type
+-==============================================
+-
+-_Description_:
+- Convert to a `KIND=8' integer type. This is equivalent to the
+- standard `INT' intrinsic with an optional argument of `KIND=8',
+- and is only included for backwards compatibility.
+-
+-_Standard_:
+- GNU extension
+-
+-_Class_:
+- Elemental function
+-
+-_Syntax_:
+- `RESULT = INT8(A)'
+-
+-_Arguments_:
+- A Shall be of type `INTEGER', `REAL', or
+- `COMPLEX'.
+-
+-_Return value_:
+- The return value is a `INTEGER(8)' variable.
+-
+-_See also_:
+- *note INT::, *note INT2::, *note LONG::
+-
+-
+-File: gfortran.info, Node: IOR, Next: IRAND, Prev: INT8, Up: Intrinsic Procedures
+-
+-7.115 `IOR' -- Bitwise logical or
+-=================================
+-
+-_Description_:
+- `IOR' returns the bitwise boolean inclusive-OR of I and J.
+-
+-_Standard_:
+- Fortran 95 and later
+-
+-_Class_:
+- Elemental function
+-
+-_Syntax_:
+- `RESULT = IOR(I, J)'
+-
+-_Arguments_:
+- I The type shall be `INTEGER'.
+- J The type shall be `INTEGER', of the same kind
+- as I. (As a GNU extension, different kinds
+- are also permitted.)
+-
+-_Return value_:
+- The return type is `INTEGER', of the same kind as the arguments.
+- (If the argument kinds differ, it is of the same kind as the
+- larger argument.)
+-
+-_See also_:
+- *note IEOR::, *note IAND::, *note IBITS::, *note IBSET::, *note
+- IBCLR::, *note NOT::
+-
+-
+-File: gfortran.info, Node: IRAND, Next: IS_IOSTAT_END, Prev: IOR, Up: Intrinsic Procedures
+-
+-7.116 `IRAND' -- Integer pseudo-random number
+-=============================================
+-
+-_Description_:
+- `IRAND(FLAG)' returns a pseudo-random number from a uniform
+- distribution between 0 and a system-dependent limit (which is in
+- most cases 2147483647). If FLAG is 0, the next number in the
+- current sequence is returned; if FLAG is 1, the generator is
+- restarted by `CALL SRAND(0)'; if FLAG has any other value, it is
+- used as a new seed with `SRAND'.
+-
+- This intrinsic routine is provided for backwards compatibility with
+- GNU Fortran 77. It implements a simple modulo generator as provided
+- by `g77'. For new code, one should consider the use of *note
+- RANDOM_NUMBER:: as it implements a superior algorithm.
+-
+-_Standard_:
+- GNU extension
+-
+-_Class_:
+- Function
+-
+-_Syntax_:
+- `RESULT = IRAND(I)'
+-
+-_Arguments_:
+- I Shall be a scalar `INTEGER' of kind 4.
+-
+-_Return value_:
+- The return value is of `INTEGER(kind=4)' type.
+-
+-_Example_:
+- program test_irand
+- integer,parameter :: seed = 86456
+-
+- call srand(seed)
+- print *, irand(), irand(), irand(), irand()
+- print *, irand(seed), irand(), irand(), irand()
+- end program test_irand
+-
+-
+-
+-File: gfortran.info, Node: IS_IOSTAT_END, Next: IS_IOSTAT_EOR, Prev: IRAND, Up: Intrinsic Procedures
+-
+-7.117 `IS_IOSTAT_END' -- Test for end-of-file value
+-===================================================
+-
+-_Description_:
+- `IS_IOSTAT_END' tests whether an variable has the value of the I/O
+- status "end of file". The function is equivalent to comparing the
+- variable with the `IOSTAT_END' parameter of the intrinsic module
+- `ISO_FORTRAN_ENV'.
+-
+-_Standard_:
+- Fortran 2003 and later
+-
+-_Class_:
+- Elemental function
+-
+-_Syntax_:
+- `RESULT = IS_IOSTAT_END(I)'
+-
+-_Arguments_:
+- I Shall be of the type `INTEGER'.
+-
+-_Return value_:
+- Returns a `LOGICAL' of the default kind, which `.TRUE.' if I has
+- the value which indicates an end of file condition for IOSTAT=
+- specifiers, and is `.FALSE.' otherwise.
+-
+-_Example_:
+- PROGRAM iostat
+- IMPLICIT NONE
+- INTEGER :: stat, i
+- OPEN(88, FILE='test.dat')
+- READ(88, *, IOSTAT=stat) i
+- IF(IS_IOSTAT_END(stat)) STOP 'END OF FILE'
+- END PROGRAM
+-
+-
+-File: gfortran.info, Node: IS_IOSTAT_EOR, Next: ISATTY, Prev: IS_IOSTAT_END, Up: Intrinsic Procedures
+-
+-7.118 `IS_IOSTAT_EOR' -- Test for end-of-record value
+-=====================================================
+-
+-_Description_:
+- `IS_IOSTAT_EOR' tests whether an variable has the value of the I/O
+- status "end of record". The function is equivalent to comparing the
+- variable with the `IOSTAT_EOR' parameter of the intrinsic module
+- `ISO_FORTRAN_ENV'.
+-
+-_Standard_:
+- Fortran 2003 and later
+-
+-_Class_:
+- Elemental function
+-
+-_Syntax_:
+- `RESULT = IS_IOSTAT_EOR(I)'
+-
+-_Arguments_:
+- I Shall be of the type `INTEGER'.
+-
+-_Return value_:
+- Returns a `LOGICAL' of the default kind, which `.TRUE.' if I has
+- the value which indicates an end of file condition for IOSTAT=
+- specifiers, and is `.FALSE.' otherwise.
+-
+-_Example_:
+- PROGRAM iostat
+- IMPLICIT NONE
+- INTEGER :: stat, i(50)
+- OPEN(88, FILE='test.dat', FORM='UNFORMATTED')
+- READ(88, IOSTAT=stat) i
+- IF(IS_IOSTAT_EOR(stat)) STOP 'END OF RECORD'
+- END PROGRAM
+-
+-
+-File: gfortran.info, Node: ISATTY, Next: ISHFT, Prev: IS_IOSTAT_EOR, Up: Intrinsic Procedures
+-
+-7.119 `ISATTY' -- Whether a unit is a terminal device.
+-======================================================
+-
+-_Description_:
+- Determine whether a unit is connected to a terminal device.
+-
+-_Standard_:
+- GNU extension
+-
+-_Class_:
+- Function
+-
+-_Syntax_:
+- `RESULT = ISATTY(UNIT)'
+-
+-_Arguments_:
+- UNIT Shall be a scalar `INTEGER'.
+-
+-_Return value_:
+- Returns `.TRUE.' if the UNIT is connected to a terminal device,
+- `.FALSE.' otherwise.
+-
+-_Example_:
+- PROGRAM test_isatty
+- INTEGER(kind=1) :: unit
+- DO unit = 1, 10
+- write(*,*) isatty(unit=unit)
+- END DO
+- END PROGRAM
+-
+-_See also_:
+- *note TTYNAM::
+-
+-
+-File: gfortran.info, Node: ISHFT, Next: ISHFTC, Prev: ISATTY, Up: Intrinsic Procedures
+-
+-7.120 `ISHFT' -- Shift bits
+-===========================
+-
+-_Description_:
+- `ISHFT' returns a value corresponding to I with all of the bits
+- shifted SHIFT places. A value of SHIFT greater than zero
+- corresponds to a left shift, a value of zero corresponds to no
+- shift, and a value less than zero corresponds to a right shift.
+- If the absolute value of SHIFT is greater than `BIT_SIZE(I)', the
+- value is undefined. Bits shifted out from the left end or right
+- end are lost; zeros are shifted in from the opposite end.
+-
+-_Standard_:
+- Fortran 95 and later
+-
+-_Class_:
+- Elemental function
+-
+-_Syntax_:
+- `RESULT = ISHFT(I, SHIFT)'
+-
+-_Arguments_:
+- I The type shall be `INTEGER'.
+- SHIFT The type shall be `INTEGER'.
+-
+-_Return value_:
+- The return value is of type `INTEGER' and of the same kind as I.
+-
+-_See also_:
+- *note ISHFTC::
+-
+-
+-File: gfortran.info, Node: ISHFTC, Next: ISNAN, Prev: ISHFT, Up: Intrinsic Procedures
+-
+-7.121 `ISHFTC' -- Shift bits circularly
+-=======================================
+-
+-_Description_:
+- `ISHFTC' returns a value corresponding to I with the rightmost
+- SIZE bits shifted circularly SHIFT places; that is, bits shifted
+- out one end are shifted into the opposite end. A value of SHIFT
+- greater than zero corresponds to a left shift, a value of zero
+- corresponds to no shift, and a value less than zero corresponds to
+- a right shift. The absolute value of SHIFT must be less than
+- SIZE. If the SIZE argument is omitted, it is taken to be
+- equivalent to `BIT_SIZE(I)'.
+-
+-_Standard_:
+- Fortran 95 and later
+-
+-_Class_:
+- Elemental function
+-
+-_Syntax_:
+- `RESULT = ISHFTC(I, SHIFT [, SIZE])'
+-
+-_Arguments_:
+- I The type shall be `INTEGER'.
+- SHIFT The type shall be `INTEGER'.
+- SIZE (Optional) The type shall be `INTEGER'; the
+- value must be greater than zero and less than
+- or equal to `BIT_SIZE(I)'.
+-
+-_Return value_:
+- The return value is of type `INTEGER' and of the same kind as I.
+-
+-_See also_:
+- *note ISHFT::
+-
+-
+-File: gfortran.info, Node: ISNAN, Next: ITIME, Prev: ISHFTC, Up: Intrinsic Procedures
+-
+-7.122 `ISNAN' -- Test for a NaN
+-===============================
+-
+-_Description_:
+- `ISNAN' tests whether a floating-point value is an IEEE
+- Not-a-Number (NaN).
+-
+-_Standard_:
+- GNU extension
+-
+-_Class_:
+- Elemental function
+-
+-_Syntax_:
+- `ISNAN(X)'
+-
+-_Arguments_:
+- X Variable of the type `REAL'.
+-
+-_Return value_:
+- Returns a default-kind `LOGICAL'. The returned value is `TRUE' if
+- X is a NaN and `FALSE' otherwise.
+-
+-_Example_:
+- program test_nan
+- implicit none
+- real :: x
+- x = -1.0
+- x = sqrt(x)
+- if (isnan(x)) stop '"x" is a NaN'
+- end program test_nan
+-
+-
+-File: gfortran.info, Node: ITIME, Next: KILL, Prev: ISNAN, Up: Intrinsic Procedures
+-
+-7.123 `ITIME' -- Get current local time subroutine (hour/minutes/seconds)
+-=========================================================================
+-
+-_Description_:
+- `IDATE(VALUES)' Fills VALUES with the numerical values at the
+- current local time. The hour (in the range 1-24), minute (in the
+- range 1-60), and seconds (in the range 1-60) appear in elements 1,
+- 2, and 3 of VALUES, respectively.
+-
+-_Standard_:
+- GNU extension
+-
+-_Class_:
+- Subroutine
+-
+-_Syntax_:
+- `CALL ITIME(VALUES)'
+-
+-_Arguments_:
+- VALUES The type shall be `INTEGER, DIMENSION(3)' and
+- the kind shall be the default integer kind.
+-
+-_Return value_:
+- Does not return anything.
+-
+-_Example_:
+- program test_itime
+- integer, dimension(3) :: tarray
+- call itime(tarray)
+- print *, tarray(1)
+- print *, tarray(2)
+- print *, tarray(3)
+- end program test_itime
+-
+-
+-File: gfortran.info, Node: KILL, Next: KIND, Prev: ITIME, Up: Intrinsic Procedures
+-
+-7.124 `KILL' -- Send a signal to a process
+-==========================================
+-
+-_Description_:
+-
+-_Standard_:
+- Sends the signal specified by SIGNAL to the process PID. See
+- `kill(2)'.
+-
+- This intrinsic is provided in both subroutine and function forms;
+- however, only one form can be used in any given program unit.
+-
+-_Class_:
+- Subroutine, function
+-
+-_Syntax_:
+- `CALL KILL(C, VALUE [, STATUS])'
+-
+-_Arguments_:
+- C Shall be a scalar `INTEGER', with `INTENT(IN)'
+- VALUE Shall be a scalar `INTEGER', with `INTENT(IN)'
+- STATUS (Optional) status flag of type `INTEGER(4)' or
+- `INTEGER(8)'. Returns 0 on success, or a
+- system-specific error code otherwise.
+-
+-_See also_:
+- *note ABORT::, *note EXIT::
+-
+-
+-File: gfortran.info, Node: KIND, Next: LBOUND, Prev: KILL, Up: Intrinsic Procedures
+-
+-7.125 `KIND' -- Kind of an entity
+-=================================
+-
+-_Description_:
+- `KIND(X)' returns the kind value of the entity X.
+-
+-_Standard_:
+- Fortran 95 and later
+-
+-_Class_:
+- Inquiry function
+-
+-_Syntax_:
+- `K = KIND(X)'
+-
+-_Arguments_:
+- X Shall be of type `LOGICAL', `INTEGER', `REAL',
+- `COMPLEX' or `CHARACTER'.
+-
+-_Return value_:
+- The return value is a scalar of type `INTEGER' and of the default
+- integer kind.
+-
+-_Example_:
+- program test_kind
+- integer,parameter :: kc = kind(' ')
+- integer,parameter :: kl = kind(.true.)
+-
+- print *, "The default character kind is ", kc
+- print *, "The default logical kind is ", kl
+- end program test_kind
+-
+-
+-
+-File: gfortran.info, Node: LBOUND, Next: LEADZ, Prev: KIND, Up: Intrinsic Procedures
+-
+-7.126 `LBOUND' -- Lower dimension bounds of an array
+-====================================================
+-
+-_Description_:
+- Returns the lower bounds of an array, or a single lower bound
+- along the DIM dimension.
+-
+-_Standard_:
+- Fortran 95 and later, with KIND argument Fortran 2003 and later
+-
+-_Class_:
+- Inquiry function
+-
+-_Syntax_:
+- `RESULT = LBOUND(ARRAY [, DIM [, KIND]])'
+-
+-_Arguments_:
+- ARRAY Shall be an array, of any type.
+- DIM (Optional) Shall be a scalar `INTEGER'.
+- KIND (Optional) An `INTEGER' initialization
+- expression indicating the kind parameter of
+- the result.
+-
+-_Return value_:
+- The return value is of type `INTEGER' and of kind KIND. If KIND is
+- absent, the return value is of default integer kind. If DIM is
+- absent, the result is an array of the lower bounds of ARRAY. If
+- DIM is present, the result is a scalar corresponding to the lower
+- bound of the array along that dimension. If ARRAY is an
+- expression rather than a whole array or array structure component,
+- or if it has a zero extent along the relevant dimension, the lower
+- bound is taken to be 1.
+-
+-_See also_:
+- *note UBOUND::
+-
+-
+-File: gfortran.info, Node: LEADZ, Next: LEN, Prev: LBOUND, Up: Intrinsic Procedures
+-
+-7.127 `LEADZ' -- Number of leading zero bits of an integer
+-==========================================================
+-
+-_Description_:
+- `LEADZ' returns the number of leading zero bits of an integer.
+-
+-_Standard_:
+- Fortran 2008 and later
+-
+-_Class_:
+- Elemental function
+-
+-_Syntax_:
+- `RESULT = LEADZ(I)'
+-
+-_Arguments_:
+- I Shall be of type `INTEGER'.
+-
+-_Return value_:
+- The type of the return value is the default `INTEGER'. If all the
+- bits of `I' are zero, the result value is `BIT_SIZE(I)'.
+-
+-_Example_:
+- PROGRAM test_leadz
+- WRITE (*,*) LEADZ(1) ! prints 8 if BITSIZE(I) has the value 32
+- END PROGRAM
+-
+-_See also_:
+- *note BIT_SIZE::, *note TRAILZ::
+-
+-
+-File: gfortran.info, Node: LEN, Next: LEN_TRIM, Prev: LEADZ, Up: Intrinsic Procedures
+-
+-7.128 `LEN' -- Length of a character entity
+-===========================================
+-
+-_Description_:
+- Returns the length of a character string. If STRING is an array,
+- the length of an element of STRING is returned. Note that STRING
+- need not be defined when this intrinsic is invoked, since only the
+- length, not the content, of STRING is needed.
+-
+-_Standard_:
+- Fortran 77 and later, with KIND argument Fortran 2003 and later
+-
+-_Class_:
+- Inquiry function
+-
+-_Syntax_:
+- `L = LEN(STRING [, KIND])'
+-
+-_Arguments_:
+- STRING Shall be a scalar or array of type
+- `CHARACTER', with `INTENT(IN)'
+- KIND (Optional) An `INTEGER' initialization
+- expression indicating the kind parameter of
+- the result.
+-
+-_Return value_:
+- The return value is of type `INTEGER' and of kind KIND. If KIND is
+- absent, the return value is of default integer kind.
+-
+-_See also_:
+- *note LEN_TRIM::, *note ADJUSTL::, *note ADJUSTR::
+-
+-
+-File: gfortran.info, Node: LEN_TRIM, Next: LOG_GAMMA, Prev: LEN, Up: Intrinsic Procedures
+-
+-7.129 `LEN_TRIM' -- Length of a character entity without trailing blank characters
+-==================================================================================
+-
+-_Description_:
+- Returns the length of a character string, ignoring any trailing
+- blanks.
+-
+-_Standard_:
+- Fortran 95 and later, with KIND argument Fortran 2003 and later
+-
+-_Class_:
+- Elemental function
+-
+-_Syntax_:
+- `RESULT = LEN_TRIM(STRING [, KIND])'
+-
+-_Arguments_:
+- STRING Shall be a scalar of type `CHARACTER', with
+- `INTENT(IN)'
+- KIND (Optional) An `INTEGER' initialization
+- expression indicating the kind parameter of
+- the result.
+-
+-_Return value_:
+- The return value is of type `INTEGER' and of kind KIND. If KIND is
+- absent, the return value is of default integer kind.
+-
+-_See also_:
+- *note LEN::, *note ADJUSTL::, *note ADJUSTR::
+-
+-
+-File: gfortran.info, Node: LGE, Next: LGT, Prev: LOG_GAMMA, Up: Intrinsic Procedures
+-
+-7.130 `LGE' -- Lexical greater than or equal
+-============================================
+-
+-_Description_:
+- Determines whether one string is lexically greater than or equal to
+- another string, where the two strings are interpreted as containing
+- ASCII character codes. If the String A and String B are not the
+- same length, the shorter is compared as if spaces were appended to
+- it to form a value that has the same length as the longer.
+-
+- In general, the lexical comparison intrinsics `LGE', `LGT', `LLE',
+- and `LLT' differ from the corresponding intrinsic operators
+- `.GE.', `.GT.', `.LE.', and `.LT.', in that the latter use the
+- processor's character ordering (which is not ASCII on some
+- targets), whereas the former always use the ASCII ordering.
+-
+-_Standard_:
+- Fortran 77 and later
+-
+-_Class_:
+- Elemental function
+-
+-_Syntax_:
+- `RESULT = LGE(STRING_A, STRING_B)'
+-
+-_Arguments_:
+- STRING_A Shall be of default `CHARACTER' type.
+- STRING_B Shall be of default `CHARACTER' type.
+-
+-_Return value_:
+- Returns `.TRUE.' if `STRING_A >= STRING_B', and `.FALSE.'
+- otherwise, based on the ASCII ordering.
+-
+-_See also_:
+- *note LGT::, *note LLE::, *note LLT::
+-
+-
+-File: gfortran.info, Node: LGT, Next: LINK, Prev: LGE, Up: Intrinsic Procedures
+-
+-7.131 `LGT' -- Lexical greater than
+-===================================
+-
+-_Description_:
+- Determines whether one string is lexically greater than another
+- string, where the two strings are interpreted as containing ASCII
+- character codes. If the String A and String B are not the same
+- length, the shorter is compared as if spaces were appended to it
+- to form a value that has the same length as the longer.
+-
+- In general, the lexical comparison intrinsics `LGE', `LGT', `LLE',
+- and `LLT' differ from the corresponding intrinsic operators
+- `.GE.', `.GT.', `.LE.', and `.LT.', in that the latter use the
+- processor's character ordering (which is not ASCII on some
+- targets), whereas the former always use the ASCII ordering.
+-
+-_Standard_:
+- Fortran 77 and later
+-
+-_Class_:
+- Elemental function
+-
+-_Syntax_:
+- `RESULT = LGT(STRING_A, STRING_B)'
+-
+-_Arguments_:
+- STRING_A Shall be of default `CHARACTER' type.
+- STRING_B Shall be of default `CHARACTER' type.
+-
+-_Return value_:
+- Returns `.TRUE.' if `STRING_A > STRING_B', and `.FALSE.'
+- otherwise, based on the ASCII ordering.
+-
+-_See also_:
+- *note LGE::, *note LLE::, *note LLT::
+-
+-
+-File: gfortran.info, Node: LINK, Next: LLE, Prev: LGT, Up: Intrinsic Procedures
+-
+-7.132 `LINK' -- Create a hard link
+-==================================
+-
+-_Description_:
+- Makes a (hard) link from file PATH1 to PATH2. A null character
+- (`CHAR(0)') can be used to mark the end of the names in PATH1 and
+- PATH2; otherwise, trailing blanks in the file names are ignored.
+- If the STATUS argument is supplied, it contains 0 on success or a
+- nonzero error code upon return; see `link(2)'.
+-
+- This intrinsic is provided in both subroutine and function forms;
+- however, only one form can be used in any given program unit.
+-
+-_Standard_:
+- GNU extension
+-
+-_Class_:
+- Subroutine, function
+-
+-_Syntax_:
+- `CALL LINK(PATH1, PATH2 [, STATUS])'
+- `STATUS = LINK(PATH1, PATH2)'
+-
+-_Arguments_:
+- PATH1 Shall be of default `CHARACTER' type.
+- PATH2 Shall be of default `CHARACTER' type.
+- STATUS (Optional) Shall be of default `INTEGER' type.
+-
+-_See also_:
+- *note SYMLNK::, *note UNLINK::
+-
+-
+-File: gfortran.info, Node: LLE, Next: LLT, Prev: LINK, Up: Intrinsic Procedures
+-
+-7.133 `LLE' -- Lexical less than or equal
+-=========================================
+-
+-_Description_:
+- Determines whether one string is lexically less than or equal to
+- another string, where the two strings are interpreted as
+- containing ASCII character codes. If the String A and String B
+- are not the same length, the shorter is compared as if spaces were
+- appended to it to form a value that has the same length as the
+- longer.
+-
+- In general, the lexical comparison intrinsics `LGE', `LGT', `LLE',
+- and `LLT' differ from the corresponding intrinsic operators
+- `.GE.', `.GT.', `.LE.', and `.LT.', in that the latter use the
+- processor's character ordering (which is not ASCII on some
+- targets), whereas the former always use the ASCII ordering.
+-
+-_Standard_:
+- Fortran 77 and later
+-
+-_Class_:
+- Elemental function
+-
+-_Syntax_:
+- `RESULT = LLE(STRING_A, STRING_B)'
+-
+-_Arguments_:
+- STRING_A Shall be of default `CHARACTER' type.
+- STRING_B Shall be of default `CHARACTER' type.
+-
+-_Return value_:
+- Returns `.TRUE.' if `STRING_A <= STRING_B', and `.FALSE.'
+- otherwise, based on the ASCII ordering.
+-
+-_See also_:
+- *note LGE::, *note LGT::, *note LLT::
+-
+-
+-File: gfortran.info, Node: LLT, Next: LNBLNK, Prev: LLE, Up: Intrinsic Procedures
+-
+-7.134 `LLT' -- Lexical less than
+-================================
+-
+-_Description_:
+- Determines whether one string is lexically less than another
+- string, where the two strings are interpreted as containing ASCII
+- character codes. If the String A and String B are not the same
+- length, the shorter is compared as if spaces were appended to it
+- to form a value that has the same length as the longer.
+-
+- In general, the lexical comparison intrinsics `LGE', `LGT', `LLE',
+- and `LLT' differ from the corresponding intrinsic operators
+- `.GE.', `.GT.', `.LE.', and `.LT.', in that the latter use the
+- processor's character ordering (which is not ASCII on some
+- targets), whereas the former always use the ASCII ordering.
+-
+-_Standard_:
+- Fortran 77 and later
+-
+-_Class_:
+- Elemental function
+-
+-_Syntax_:
+- `RESULT = LLT(STRING_A, STRING_B)'
+-
+-_Arguments_:
+- STRING_A Shall be of default `CHARACTER' type.
+- STRING_B Shall be of default `CHARACTER' type.
+-
+-_Return value_:
+- Returns `.TRUE.' if `STRING_A < STRING_B', and `.FALSE.'
+- otherwise, based on the ASCII ordering.
+-
+-_See also_:
+- *note LGE::, *note LGT::, *note LLE::
+-
+-
+-File: gfortran.info, Node: LNBLNK, Next: LOC, Prev: LLT, Up: Intrinsic Procedures
+-
+-7.135 `LNBLNK' -- Index of the last non-blank character in a string
+-===================================================================
+-
+-_Description_:
+- Returns the length of a character string, ignoring any trailing
+- blanks. This is identical to the standard `LEN_TRIM' intrinsic,
+- and is only included for backwards compatibility.
+-
+-_Standard_:
+- GNU extension
+-
+-_Class_:
+- Elemental function
+-
+-_Syntax_:
+- `RESULT = LNBLNK(STRING)'
+-
+-_Arguments_:
+- STRING Shall be a scalar of type `CHARACTER', with
+- `INTENT(IN)'
+-
+-_Return value_:
+- The return value is of `INTEGER(kind=4)' type.
+-
+-_See also_:
+- *note INDEX intrinsic::, *note LEN_TRIM::
+-
+-
+-File: gfortran.info, Node: LOC, Next: LOG, Prev: LNBLNK, Up: Intrinsic Procedures
+-
+-7.136 `LOC' -- Returns the address of a variable
+-================================================
+-
+-_Description_:
+- `LOC(X)' returns the address of X as an integer.
+-
+-_Standard_:
+- GNU extension
+-
+-_Class_:
+- Inquiry function
+-
+-_Syntax_:
+- `RESULT = LOC(X)'
+-
+-_Arguments_:
+- X Variable of any type.
+-
+-_Return value_:
+- The return value is of type `INTEGER', with a `KIND' corresponding
+- to the size (in bytes) of a memory address on the target machine.
+-
+-_Example_:
+- program test_loc
+- integer :: i
+- real :: r
+- i = loc(r)
+- print *, i
+- end program test_loc
+-
+-
+-File: gfortran.info, Node: LOG, Next: LOG10, Prev: LOC, Up: Intrinsic Procedures
+-
+-7.137 `LOG' -- Logarithm function
+-=================================
+-
+-_Description_:
+- `LOG(X)' computes the logarithm of X.
+-
+-_Standard_:
+- Fortran 77 and later
+-
+-_Class_:
+- Elemental function
+-
+-_Syntax_:
+- `RESULT = LOG(X)'
+-
+-_Arguments_:
+- X The type shall be `REAL' or `COMPLEX'.
+-
+-_Return value_:
+- The return value is of type `REAL' or `COMPLEX'. The kind type
+- parameter is the same as X. If X is `COMPLEX', the imaginary part
+- \omega is in the range -\pi \leq \omega \leq \pi.
+-
+-_Example_:
+- program test_log
+- real(8) :: x = 1.0_8
+- complex :: z = (1.0, 2.0)
+- x = log(x)
+- z = log(z)
+- end program test_log
+-
+-_Specific names_:
+- Name Argument Return type Standard
+- `ALOG(X)' `REAL(4) X' `REAL(4)' f95, gnu
+- `DLOG(X)' `REAL(8) X' `REAL(8)' f95, gnu
+- `CLOG(X)' `COMPLEX(4) `COMPLEX(4)' f95, gnu
+- X'
+- `ZLOG(X)' `COMPLEX(8) `COMPLEX(8)' f95, gnu
+- X'
+- `CDLOG(X)' `COMPLEX(8) `COMPLEX(8)' f95, gnu
+- X'
+-
+-
+-File: gfortran.info, Node: LOG10, Next: LOGICAL, Prev: LOG, Up: Intrinsic Procedures
+-
+-7.138 `LOG10' -- Base 10 logarithm function
+-===========================================
+-
+-_Description_:
+- `LOG10(X)' computes the base 10 logarithm of X.
+-
+-_Standard_:
+- Fortran 77 and later
+-
+-_Class_:
+- Elemental function
+-
+-_Syntax_:
+- `RESULT = LOG10(X)'
+-
+-_Arguments_:
+- X The type shall be `REAL'.
+-
+-_Return value_:
+- The return value is of type `REAL' or `COMPLEX'. The kind type
+- parameter is the same as X.
+-
+-_Example_:
+- program test_log10
+- real(8) :: x = 10.0_8
+- x = log10(x)
+- end program test_log10
+-
+-_Specific names_:
+- Name Argument Return type Standard
+- `ALOG10(X)' `REAL(4) X' `REAL(4)' Fortran 95 and
+- later
+- `DLOG10(X)' `REAL(8) X' `REAL(8)' Fortran 95 and
+- later
+-
+-
+-File: gfortran.info, Node: LOG_GAMMA, Next: LGE, Prev: LEN_TRIM, Up: Intrinsic Procedures
+-
+-7.139 `LOG_GAMMA' -- Logarithm of the Gamma function
+-====================================================
+-
+-_Description_:
+- `LOG_GAMMA(X)' computes the natural logarithm of the absolute value
+- of the Gamma (\Gamma) function.
+-
+-_Standard_:
+- Fortran 2008 and later
+-
+-_Class_:
+- Elemental function
+-
+-_Syntax_:
+- `X = LOG_GAMMA(X)'
+-
+-_Arguments_:
+- X Shall be of type `REAL' and neither zero nor a
+- negative integer.
+-
+-_Return value_:
+- The return value is of type `REAL' of the same kind as X.
+-
+-_Example_:
+- program test_log_gamma
+- real :: x = 1.0
+- x = lgamma(x) ! returns 0.0
+- end program test_log_gamma
+-
+-_Specific names_:
+- Name Argument Return type Standard
+- `LGAMMA(X)' `REAL(4) X' `REAL(4)' GNU Extension
+- `ALGAMA(X)' `REAL(4) X' `REAL(4)' GNU Extension
+- `DLGAMA(X)' `REAL(8) X' `REAL(8)' GNU Extension
+-
+-_See also_:
+- Gamma function: *note GAMMA::
+-
+-
+-
+-File: gfortran.info, Node: LOGICAL, Next: LONG, Prev: LOG10, Up: Intrinsic Procedures
+-
+-7.140 `LOGICAL' -- Convert to logical type
+-==========================================
+-
+-_Description_:
+- Converts one kind of `LOGICAL' variable to another.
+-
+-_Standard_:
+- Fortran 95 and later
+-
+-_Class_:
+- Elemental function
+-
+-_Syntax_:
+- `RESULT = LOGICAL(L [, KIND])'
+-
+-_Arguments_:
+- L The type shall be `LOGICAL'.
+- KIND (Optional) An `INTEGER' initialization
+- expression indicating the kind parameter of
+- the result.
+-
+-_Return value_:
+- The return value is a `LOGICAL' value equal to L, with a kind
+- corresponding to KIND, or of the default logical kind if KIND is
+- not given.
+-
+-_See also_:
+- *note INT::, *note REAL::, *note CMPLX::
+-
+-
+-File: gfortran.info, Node: LONG, Next: LSHIFT, Prev: LOGICAL, Up: Intrinsic Procedures
+-
+-7.141 `LONG' -- Convert to integer type
+-=======================================
+-
+-_Description_:
+- Convert to a `KIND=4' integer type, which is the same size as a C
+- `long' integer. This is equivalent to the standard `INT'
+- intrinsic with an optional argument of `KIND=4', and is only
+- included for backwards compatibility.
+-
+-_Standard_:
+- GNU extension
+-
+-_Class_:
+- Elemental function
+-
+-_Syntax_:
+- `RESULT = LONG(A)'
+-
+-_Arguments_:
+- A Shall be of type `INTEGER', `REAL', or
+- `COMPLEX'.
+-
+-_Return value_:
+- The return value is a `INTEGER(4)' variable.
+-
+-_See also_:
+- *note INT::, *note INT2::, *note INT8::
+-
+-
+-File: gfortran.info, Node: LSHIFT, Next: LSTAT, Prev: LONG, Up: Intrinsic Procedures
+-
+-7.142 `LSHIFT' -- Left shift bits
+-=================================
+-
+-_Description_:
+- `LSHIFT' returns a value corresponding to I with all of the bits
+- shifted left by SHIFT places. If the absolute value of SHIFT is
+- greater than `BIT_SIZE(I)', the value is undefined. Bits shifted
+- out from the left end are lost; zeros are shifted in from the
+- opposite end.
+-
+- This function has been superseded by the `ISHFT' intrinsic, which
+- is standard in Fortran 95 and later.
+-
+-_Standard_:
+- GNU extension
+-
+-_Class_:
+- Elemental function
+-
+-_Syntax_:
+- `RESULT = LSHIFT(I, SHIFT)'
+-
+-_Arguments_:
+- I The type shall be `INTEGER'.
+- SHIFT The type shall be `INTEGER'.
+-
+-_Return value_:
+- The return value is of type `INTEGER' and of the same kind as I.
+-
+-_See also_:
+- *note ISHFT::, *note ISHFTC::, *note RSHIFT::
+-
+-
+-
+-File: gfortran.info, Node: LSTAT, Next: LTIME, Prev: LSHIFT, Up: Intrinsic Procedures
+-
+-7.143 `LSTAT' -- Get file status
+-================================
+-
+-_Description_:
+- `LSTAT' is identical to *note STAT::, except that if path is a
+- symbolic link, then the link itself is statted, not the file that
+- it refers to.
+-
+- The elements in `BUFF' are the same as described by *note STAT::.
+-
+- This intrinsic is provided in both subroutine and function forms;
+- however, only one form can be used in any given program unit.
+-
+-_Standard_:
+- GNU extension
+-
+-_Class_:
+- Subroutine, function
+-
+-_Syntax_:
+- `CALL LSTAT(FILE, BUFF [, STATUS])'
+-
+-_Arguments_:
+- FILE The type shall be `CHARACTER' of the default
+- kind, a valid path within the file system.
+- BUFF The type shall be `INTEGER(4), DIMENSION(13)'.
+- STATUS (Optional) status flag of type `INTEGER(4)'.
+- Returns 0 on success and a system specific
+- error code otherwise.
+-
+-_Example_:
+- See *note STAT:: for an example.
+-
+-_See also_:
+- To stat an open file: *note FSTAT::, to stat a file: *note STAT::
+-
+-
+-File: gfortran.info, Node: LTIME, Next: MALLOC, Prev: LSTAT, Up: Intrinsic Procedures
+-
+-7.144 `LTIME' -- Convert time to local time info
+-================================================
+-
+-_Description_:
+- Given a system time value STIME (as provided by the `TIME8()'
+- intrinsic), fills TARRAY with values extracted from it appropriate
+- to the local time zone using `localtime(3)'.
+-
+-_Standard_:
+- GNU extension
+-
+-_Class_:
+- Subroutine
+-
+-_Syntax_:
+- `CALL LTIME(STIME, TARRAY)'
+-
+-_Arguments_:
+- STIME An `INTEGER' scalar expression corresponding
+- to a system time, with `INTENT(IN)'.
+- TARRAY A default `INTEGER' array with 9 elements,
+- with `INTENT(OUT)'.
+-
+-_Return value_:
+- The elements of TARRAY are assigned as follows:
+- 1. Seconds after the minute, range 0-59 or 0-61 to allow for leap
+- seconds
+-
+- 2. Minutes after the hour, range 0-59
+-
+- 3. Hours past midnight, range 0-23
+-
+- 4. Day of month, range 0-31
+-
+- 5. Number of months since January, range 0-12
+-
+- 6. Years since 1900
+-
+- 7. Number of days since Sunday, range 0-6
+-
+- 8. Days since January 1
+-
+- 9. Daylight savings indicator: positive if daylight savings is in
+- effect, zero if not, and negative if the information is not
+- available.
+-
+-_See also_:
+- *note CTIME::, *note GMTIME::, *note TIME::, *note TIME8::
+-
+-
+-
+-File: gfortran.info, Node: MALLOC, Next: MATMUL, Prev: LTIME, Up: Intrinsic Procedures
+-
+-7.145 `MALLOC' -- Allocate dynamic memory
+-=========================================
+-
+-_Description_:
+- `MALLOC(SIZE)' allocates SIZE bytes of dynamic memory and returns
+- the address of the allocated memory. The `MALLOC' intrinsic is an
+- extension intended to be used with Cray pointers, and is provided
+- in GNU Fortran to allow the user to compile legacy code. For new
+- code using Fortran 95 pointers, the memory allocation intrinsic is
+- `ALLOCATE'.
+-
+-_Standard_:
+- GNU extension
+-
+-_Class_:
+- Function
+-
+-_Syntax_:
+- `PTR = MALLOC(SIZE)'
+-
+-_Arguments_:
+- SIZE The type shall be `INTEGER'.
+-
+-_Return value_:
+- The return value is of type `INTEGER(K)', with K such that
+- variables of type `INTEGER(K)' have the same size as C pointers
+- (`sizeof(void *)').
+-
+-_Example_:
+- The following example demonstrates the use of `MALLOC' and `FREE'
+- with Cray pointers.
+-
+- program test_malloc
+- implicit none
+- integer i
+- real*8 x(*), z
+- pointer(ptr_x,x)
+-
+- ptr_x = malloc(20*8)
+- do i = 1, 20
+- x(i) = sqrt(1.0d0 / i)
+- end do
+- z = 0
+- do i = 1, 20
+- z = z + x(i)
+- print *, z
+- end do
+- call free(ptr_x)
+- end program test_malloc
+-
+-_See also_:
+- *note FREE::
+-
+-
+-File: gfortran.info, Node: MATMUL, Next: MAX, Prev: MALLOC, Up: Intrinsic Procedures
+-
+-7.146 `MATMUL' -- matrix multiplication
+-=======================================
+-
+-_Description_:
+- Performs a matrix multiplication on numeric or logical arguments.
+-
+-_Standard_:
+- Fortran 95 and later
+-
+-_Class_:
+- Transformational function
+-
+-_Syntax_:
+- `RESULT = MATMUL(MATRIX_A, MATRIX_B)'
+-
+-_Arguments_:
+- MATRIX_A An array of `INTEGER', `REAL', `COMPLEX', or
+- `LOGICAL' type, with a rank of one or two.
+- MATRIX_B An array of `INTEGER', `REAL', or `COMPLEX'
+- type if MATRIX_A is of a numeric type;
+- otherwise, an array of `LOGICAL' type. The
+- rank shall be one or two, and the first (or
+- only) dimension of MATRIX_B shall be equal to
+- the last (or only) dimension of MATRIX_A.
+-
+-_Return value_:
+- The matrix product of MATRIX_A and MATRIX_B. The type and kind of
+- the result follow the usual type and kind promotion rules, as for
+- the `*' or `.AND.' operators.
+-
+-_See also_:
+-
+-
+-File: gfortran.info, Node: MAX, Next: MAXEXPONENT, Prev: MATMUL, Up: Intrinsic Procedures
+-
+-7.147 `MAX' -- Maximum value of an argument list
+-================================================
+-
+-_Description_:
+- Returns the argument with the largest (most positive) value.
+-
+-_Standard_:
+- Fortran 77 and later
+-
+-_Class_:
+- Elemental function
+-
+-_Syntax_:
+- `RESULT = MAX(A1, A2 [, A3 [, ...]])'
+-
+-_Arguments_:
+- A1 The type shall be `INTEGER' or `REAL'.
+- A2, A3, An expression of the same type and kind as A1.
+- ... (As a GNU extension, arguments of different
+- kinds are permitted.)
+-
+-_Return value_:
+- The return value corresponds to the maximum value among the
+- arguments, and has the same type and kind as the first argument.
+-
+-_Specific names_:
+- Name Argument Return type Standard
+- `MAX0(I)' `INTEGER(4) `INTEGER(4)' Fortran 77 and
+- I' later
+- `AMAX0(I)' `INTEGER(4) `REAL(MAX(X))'Fortran 77 and
+- I' later
+- `MAX1(X)' `REAL X' `INT(MAX(X))' Fortran 77 and
+- later
+- `AMAX1(X)' `REAL(4) `REAL(4)' Fortran 77 and
+- X' later
+- `DMAX1(X)' `REAL(8) `REAL(8)' Fortran 77 and
+- X' later
+-
+-_See also_:
+- *note MAXLOC:: *note MAXVAL::, *note MIN::
+-
+-
+-
+-File: gfortran.info, Node: MAXEXPONENT, Next: MAXLOC, Prev: MAX, Up: Intrinsic Procedures
+-
+-7.148 `MAXEXPONENT' -- Maximum exponent of a real kind
+-======================================================
+-
+-_Description_:
+- `MAXEXPONENT(X)' returns the maximum exponent in the model of the
+- type of `X'.
+-
+-_Standard_:
+- Fortran 95 and later
+-
+-_Class_:
+- Inquiry function
+-
+-_Syntax_:
+- `RESULT = MAXEXPONENT(X)'
+-
+-_Arguments_:
+- X Shall be of type `REAL'.
+-
+-_Return value_:
+- The return value is of type `INTEGER' and of the default integer
+- kind.
+-
+-_Example_:
+- program exponents
+- real(kind=4) :: x
+- real(kind=8) :: y
+-
+- print *, minexponent(x), maxexponent(x)
+- print *, minexponent(y), maxexponent(y)
+- end program exponents
+-
+-
+-File: gfortran.info, Node: MAXLOC, Next: MAXVAL, Prev: MAXEXPONENT, Up: Intrinsic Procedures
+-
+-7.149 `MAXLOC' -- Location of the maximum value within an array
+-===============================================================
+-
+-_Description_:
+- Determines the location of the element in the array with the
+- maximum value, or, if the DIM argument is supplied, determines the
+- locations of the maximum element along each row of the array in the
+- DIM direction. If MASK is present, only the elements for which
+- MASK is `.TRUE.' are considered. If more than one element in the
+- array has the maximum value, the location returned is that of the
+- first such element in array element order. If the array has zero
+- size, or all of the elements of MASK are `.FALSE.', then the
+- result is an array of zeroes. Similarly, if DIM is supplied and
+- all of the elements of MASK along a given row are zero, the result
+- value for that row is zero.
+-
+-_Standard_:
+- Fortran 95 and later
+-
+-_Class_:
+- Transformational function
+-
+-_Syntax_:
+- `RESULT = MAXLOC(ARRAY, DIM [, MASK])'
+- `RESULT = MAXLOC(ARRAY [, MASK])'
+-
+-_Arguments_:
+- ARRAY Shall be an array of type `INTEGER', `REAL',
+- or `CHARACTER'.
+- DIM (Optional) Shall be a scalar of type
+- `INTEGER', with a value between one and the
+- rank of ARRAY, inclusive. It may not be an
+- optional dummy argument.
+- MASK Shall be an array of type `LOGICAL', and
+- conformable with ARRAY.
+-
+-_Return value_:
+- If DIM is absent, the result is a rank-one array with a length
+- equal to the rank of ARRAY. If DIM is present, the result is an
+- array with a rank one less than the rank of ARRAY, and a size
+- corresponding to the size of ARRAY with the DIM dimension removed.
+- If DIM is present and ARRAY has a rank of one, the result is a
+- scalar. In all cases, the result is of default `INTEGER' type.
+-
+-_See also_:
+- *note MAX::, *note MAXVAL::
+-
+-
+-
+-File: gfortran.info, Node: MAXVAL, Next: MCLOCK, Prev: MAXLOC, Up: Intrinsic Procedures
+-
+-7.150 `MAXVAL' -- Maximum value of an array
+-===========================================
+-
+-_Description_:
+- Determines the maximum value of the elements in an array value,
+- or, if the DIM argument is supplied, determines the maximum value
+- along each row of the array in the DIM direction. If MASK is
+- present, only the elements for which MASK is `.TRUE.' are
+- considered. If the array has zero size, or all of the elements of
+- MASK are `.FALSE.', then the result is `-HUGE(ARRAY)' if ARRAY is
+- numeric, or a string of nulls if ARRAY is of character type.
+-
+-_Standard_:
+- Fortran 95 and later
+-
+-_Class_:
+- Transformational function
+-
+-_Syntax_:
+- `RESULT = MAXVAL(ARRAY, DIM [, MASK])'
+- `RESULT = MAXVAL(ARRAY [, MASK])'
+-
+-_Arguments_:
+- ARRAY Shall be an array of type `INTEGER', `REAL',
+- or `CHARACTER'.
+- DIM (Optional) Shall be a scalar of type
+- `INTEGER', with a value between one and the
+- rank of ARRAY, inclusive. It may not be an
+- optional dummy argument.
+- MASK Shall be an array of type `LOGICAL', and
+- conformable with ARRAY.
+-
+-_Return value_:
+- If DIM is absent, or if ARRAY has a rank of one, the result is a
+- scalar. If DIM is present, the result is an array with a rank one
+- less than the rank of ARRAY, and a size corresponding to the size
+- of ARRAY with the DIM dimension removed. In all cases, the result
+- is of the same type and kind as ARRAY.
+-
+-_See also_:
+- *note MAX::, *note MAXLOC::
+-
+-
+-File: gfortran.info, Node: MCLOCK, Next: MCLOCK8, Prev: MAXVAL, Up: Intrinsic Procedures
+-
+-7.151 `MCLOCK' -- Time function
+-===============================
+-
+-_Description_:
+- Returns the number of clock ticks since the start of the process,
+- based on the UNIX function `clock(3)'.
+-
+- This intrinsic is not fully portable, such as to systems with
+- 32-bit `INTEGER' types but supporting times wider than 32 bits.
+- Therefore, the values returned by this intrinsic might be, or
+- become, negative, or numerically less than previous values, during
+- a single run of the compiled program.
+-
+-_Standard_:
+- GNU extension
+-
+-_Class_:
+- Function
+-
+-_Syntax_:
+- `RESULT = MCLOCK()'
+-
+-_Return value_:
+- The return value is a scalar of type `INTEGER(4)', equal to the
+- number of clock ticks since the start of the process, or `-1' if
+- the system does not support `clock(3)'.
+-
+-_See also_:
+- *note CTIME::, *note GMTIME::, *note LTIME::, *note MCLOCK::,
+- *note TIME::
+-
+-
+-
+-File: gfortran.info, Node: MCLOCK8, Next: MERGE, Prev: MCLOCK, Up: Intrinsic Procedures
+-
+-7.152 `MCLOCK8' -- Time function (64-bit)
+-=========================================
+-
+-_Description_:
+- Returns the number of clock ticks since the start of the process,
+- based on the UNIX function `clock(3)'.
+-
+- _Warning:_ this intrinsic does not increase the range of the timing
+- values over that returned by `clock(3)'. On a system with a 32-bit
+- `clock(3)', `MCLOCK8()' will return a 32-bit value, even though it
+- is converted to a 64-bit `INTEGER(8)' value. That means overflows
+- of the 32-bit value can still occur. Therefore, the values
+- returned by this intrinsic might be or become negative or
+- numerically less than previous values during a single run of the
+- compiled program.
+-
+-_Standard_:
+- GNU extension
+-
+-_Class_:
+- Function
+-
+-_Syntax_:
+- `RESULT = MCLOCK8()'
+-
+-_Return value_:
+- The return value is a scalar of type `INTEGER(8)', equal to the
+- number of clock ticks since the start of the process, or `-1' if
+- the system does not support `clock(3)'.
+-
+-_See also_:
+- *note CTIME::, *note GMTIME::, *note LTIME::, *note MCLOCK::,
+- *note TIME8::
+-
+-
+-
+-File: gfortran.info, Node: MERGE, Next: MIN, Prev: MCLOCK8, Up: Intrinsic Procedures
+-
+-7.153 `MERGE' -- Merge variables
+-================================
+-
+-_Description_:
+- Select values from two arrays according to a logical mask. The
+- result is equal to TSOURCE if MASK is `.TRUE.', or equal to
+- FSOURCE if it is `.FALSE.'.
+-
+-_Standard_:
+- Fortran 95 and later
+-
+-_Class_:
+- Elemental function
+-
+-_Syntax_:
+- `RESULT = MERGE(TSOURCE, FSOURCE, MASK)'
+-
+-_Arguments_:
+- TSOURCE May be of any type.
+- FSOURCE Shall be of the same type and type parameters
+- as TSOURCE.
+- MASK Shall be of type `LOGICAL'.
+-
+-_Return value_:
+- The result is of the same type and type parameters as TSOURCE.
+-
+-
+-
+-File: gfortran.info, Node: MIN, Next: MINEXPONENT, Prev: MERGE, Up: Intrinsic Procedures
+-
+-7.154 `MIN' -- Minimum value of an argument list
+-================================================
+-
+-_Description_:
+- Returns the argument with the smallest (most negative) value.
+-
+-_Standard_:
+- Fortran 77 and later
+-
+-_Class_:
+- Elemental function
+-
+-_Syntax_:
+- `RESULT = MIN(A1, A2 [, A3, ...])'
+-
+-_Arguments_:
+- A1 The type shall be `INTEGER' or `REAL'.
+- A2, A3, An expression of the same type and kind as A1.
+- ... (As a GNU extension, arguments of different
+- kinds are permitted.)
+-
+-_Return value_:
+- The return value corresponds to the maximum value among the
+- arguments, and has the same type and kind as the first argument.
+-
+-_Specific names_:
+- Name Argument Return type Standard
+- `MIN0(I)' `INTEGER(4) `INTEGER(4)' Fortran 77 and
+- I' later
+- `AMIN0(I)' `INTEGER(4) `REAL(MIN(X))'Fortran 77 and
+- I' later
+- `MIN1(X)' `REAL X' `INT(MIN(X))' Fortran 77 and
+- later
+- `AMIN1(X)' `REAL(4) `REAL(4)' Fortran 77 and
+- X' later
+- `DMIN1(X)' `REAL(8) `REAL(8)' Fortran 77 and
+- X' later
+-
+-_See also_:
+- *note MAX::, *note MINLOC::, *note MINVAL::
+-
+-
+-File: gfortran.info, Node: MINEXPONENT, Next: MINLOC, Prev: MIN, Up: Intrinsic Procedures
+-
+-7.155 `MINEXPONENT' -- Minimum exponent of a real kind
+-======================================================
+-
+-_Description_:
+- `MINEXPONENT(X)' returns the minimum exponent in the model of the
+- type of `X'.
+-
+-_Standard_:
+- Fortran 95 and later
+-
+-_Class_:
+- Inquiry function
+-
+-_Syntax_:
+- `RESULT = MINEXPONENT(X)'
+-
+-_Arguments_:
+- X Shall be of type `REAL'.
+-
+-_Return value_:
+- The return value is of type `INTEGER' and of the default integer
+- kind.
+-
+-_Example_:
+- See `MAXEXPONENT' for an example.
+-
+-
+-File: gfortran.info, Node: MINLOC, Next: MINVAL, Prev: MINEXPONENT, Up: Intrinsic Procedures
+-
+-7.156 `MINLOC' -- Location of the minimum value within an array
+-===============================================================
+-
+-_Description_:
+- Determines the location of the element in the array with the
+- minimum value, or, if the DIM argument is supplied, determines the
+- locations of the minimum element along each row of the array in the
+- DIM direction. If MASK is present, only the elements for which
+- MASK is `.TRUE.' are considered. If more than one element in the
+- array has the minimum value, the location returned is that of the
+- first such element in array element order. If the array has zero
+- size, or all of the elements of MASK are `.FALSE.', then the
+- result is an array of zeroes. Similarly, if DIM is supplied and
+- all of the elements of MASK along a given row are zero, the result
+- value for that row is zero.
+-
+-_Standard_:
+- Fortran 95 and later
+-
+-_Class_:
+- Transformational function
+-
+-_Syntax_:
+- `RESULT = MINLOC(ARRAY, DIM [, MASK])'
+- `RESULT = MINLOC(ARRAY [, MASK])'
+-
+-_Arguments_:
+- ARRAY Shall be an array of type `INTEGER', `REAL',
+- or `CHARACTER'.
+- DIM (Optional) Shall be a scalar of type
+- `INTEGER', with a value between one and the
+- rank of ARRAY, inclusive. It may not be an
+- optional dummy argument.
+- MASK Shall be an array of type `LOGICAL', and
+- conformable with ARRAY.
+-
+-_Return value_:
+- If DIM is absent, the result is a rank-one array with a length
+- equal to the rank of ARRAY. If DIM is present, the result is an
+- array with a rank one less than the rank of ARRAY, and a size
+- corresponding to the size of ARRAY with the DIM dimension removed.
+- If DIM is present and ARRAY has a rank of one, the result is a
+- scalar. In all cases, the result is of default `INTEGER' type.
+-
+-_See also_:
+- *note MIN::, *note MINVAL::
+-
+-
+-
+-File: gfortran.info, Node: MINVAL, Next: MOD, Prev: MINLOC, Up: Intrinsic Procedures
+-
+-7.157 `MINVAL' -- Minimum value of an array
+-===========================================
+-
+-_Description_:
+- Determines the minimum value of the elements in an array value,
+- or, if the DIM argument is supplied, determines the minimum value
+- along each row of the array in the DIM direction. If MASK is
+- present, only the elements for which MASK is `.TRUE.' are
+- considered. If the array has zero size, or all of the elements of
+- MASK are `.FALSE.', then the result is `HUGE(ARRAY)' if ARRAY is
+- numeric, or a string of `CHAR(255)' characters if ARRAY is of
+- character type.
+-
+-_Standard_:
+- Fortran 95 and later
+-
+-_Class_:
+- Transformational function
+-
+-_Syntax_:
+- `RESULT = MINVAL(ARRAY, DIM [, MASK])'
+- `RESULT = MINVAL(ARRAY [, MASK])'
+-
+-_Arguments_:
+- ARRAY Shall be an array of type `INTEGER', `REAL',
+- or `CHARACTER'.
+- DIM (Optional) Shall be a scalar of type
+- `INTEGER', with a value between one and the
+- rank of ARRAY, inclusive. It may not be an
+- optional dummy argument.
+- MASK Shall be an array of type `LOGICAL', and
+- conformable with ARRAY.
+-
+-_Return value_:
+- If DIM is absent, or if ARRAY has a rank of one, the result is a
+- scalar. If DIM is present, the result is an array with a rank one
+- less than the rank of ARRAY, and a size corresponding to the size
+- of ARRAY with the DIM dimension removed. In all cases, the result
+- is of the same type and kind as ARRAY.
+-
+-_See also_:
+- *note MIN::, *note MINLOC::
+-
+-
+-
+-File: gfortran.info, Node: MOD, Next: MODULO, Prev: MINVAL, Up: Intrinsic Procedures
+-
+-7.158 `MOD' -- Remainder function
+-=================================
+-
+-_Description_:
+- `MOD(A,P)' computes the remainder of the division of A by P. It is
+- calculated as `A - (INT(A/P) * P)'.
+-
+-_Standard_:
+- Fortran 77 and later
+-
+-_Class_:
+- Elemental function
+-
+-_Syntax_:
+- `RESULT = MOD(A, P)'
+-
+-_Arguments_:
+- A Shall be a scalar of type `INTEGER' or `REAL'
+- P Shall be a scalar of the same type as A and not
+- equal to zero
+-
+-_Return value_:
+- The kind of the return value is the result of cross-promoting the
+- kinds of the arguments.
+-
+-_Example_:
+- program test_mod
+- print *, mod(17,3)
+- print *, mod(17.5,5.5)
+- print *, mod(17.5d0,5.5)
+- print *, mod(17.5,5.5d0)
+-
+- print *, mod(-17,3)
+- print *, mod(-17.5,5.5)
+- print *, mod(-17.5d0,5.5)
+- print *, mod(-17.5,5.5d0)
+-
+- print *, mod(17,-3)
+- print *, mod(17.5,-5.5)
+- print *, mod(17.5d0,-5.5)
+- print *, mod(17.5,-5.5d0)
+- end program test_mod
+-
+-_Specific names_:
+- Name Arguments Return type Standard
+- `AMOD(A,P)' `REAL(4)' `REAL(4)' Fortran 95 and
+- later
+- `DMOD(A,P)' `REAL(8)' `REAL(8)' Fortran 95 and
+- later
+-
+-
+-File: gfortran.info, Node: MODULO, Next: MOVE_ALLOC, Prev: MOD, Up: Intrinsic Procedures
+-
+-7.159 `MODULO' -- Modulo function
+-=================================
+-
+-_Description_:
+- `MODULO(A,P)' computes the A modulo P.
+-
+-_Standard_:
+- Fortran 95 and later
+-
+-_Class_:
+- Elemental function
+-
+-_Syntax_:
+- `RESULT = MODULO(A, P)'
+-
+-_Arguments_:
+- A Shall be a scalar of type `INTEGER' or `REAL'
+- P Shall be a scalar of the same type and kind as
+- A
+-
+-_Return value_:
+- The type and kind of the result are those of the arguments.
+- If A and P are of type `INTEGER':
+- `MODULO(A,P)' has the value R such that `A=Q*P+R', where Q is
+- an integer and R is between 0 (inclusive) and P (exclusive).
+-
+- If A and P are of type `REAL':
+- `MODULO(A,P)' has the value of `A - FLOOR (A / P) * P'.
+- In all cases, if P is zero the result is processor-dependent.
+-
+-_Example_:
+- program test_modulo
+- print *, modulo(17,3)
+- print *, modulo(17.5,5.5)
+-
+- print *, modulo(-17,3)
+- print *, modulo(-17.5,5.5)
+-
+- print *, modulo(17,-3)
+- print *, modulo(17.5,-5.5)
+- end program
+-
+-
+-
+-File: gfortran.info, Node: MOVE_ALLOC, Next: MVBITS, Prev: MODULO, Up: Intrinsic Procedures
+-
+-7.160 `MOVE_ALLOC' -- Move allocation from one object to another
+-================================================================
+-
+-_Description_:
+- `MOVE_ALLOC(SRC, DEST)' moves the allocation from SRC to DEST.
+- SRC will become deallocated in the process.
+-
+-_Standard_:
+- Fortran 2003 and later
+-
+-_Class_:
+- Subroutine
+-
+-_Syntax_:
+- `CALL MOVE_ALLOC(SRC, DEST)'
+-
+-_Arguments_:
+- SRC `ALLOCATABLE', `INTENT(INOUT)', may be of any
+- type and kind.
+- DEST `ALLOCATABLE', `INTENT(OUT)', shall be of the
+- same type, kind and rank as SRC.
+-
+-_Return value_:
+- None
+-
+-_Example_:
+- program test_move_alloc
+- integer, allocatable :: a(:), b(:)
+-
+- allocate(a(3))
+- a = [ 1, 2, 3 ]
+- call move_alloc(a, b)
+- print *, allocated(a), allocated(b)
+- print *, b
+- end program test_move_alloc
+-
+-
+-File: gfortran.info, Node: MVBITS, Next: NEAREST, Prev: MOVE_ALLOC, Up: Intrinsic Procedures
+-
+-7.161 `MVBITS' -- Move bits from one integer to another
+-=======================================================
+-
+-_Description_:
+- Moves LEN bits from positions FROMPOS through `FROMPOS+LEN-1' of
+- FROM to positions TOPOS through `TOPOS+LEN-1' of TO. The portion
+- of argument TO not affected by the movement of bits is unchanged.
+- The values of `FROMPOS+LEN-1' and `TOPOS+LEN-1' must be less than
+- `BIT_SIZE(FROM)'.
+-
+-_Standard_:
+- Fortran 95 and later
+-
+-_Class_:
+- Elemental subroutine
+-
+-_Syntax_:
+- `CALL MVBITS(FROM, FROMPOS, LEN, TO, TOPOS)'
+-
+-_Arguments_:
+- FROM The type shall be `INTEGER'.
+- FROMPOS The type shall be `INTEGER'.
+- LEN The type shall be `INTEGER'.
+- TO The type shall be `INTEGER', of the same kind
+- as FROM.
+- TOPOS The type shall be `INTEGER'.
+-
+-_See also_:
+- *note IBCLR::, *note IBSET::, *note IBITS::, *note IAND::, *note
+- IOR::, *note IEOR::
+-
+-
+-File: gfortran.info, Node: NEAREST, Next: NEW_LINE, Prev: MVBITS, Up: Intrinsic Procedures
+-
+-7.162 `NEAREST' -- Nearest representable number
+-===============================================
+-
+-_Description_:
+- `NEAREST(X, S)' returns the processor-representable number nearest
+- to `X' in the direction indicated by the sign of `S'.
+-
+-_Standard_:
+- Fortran 95 and later
+-
+-_Class_:
+- Elemental function
+-
+-_Syntax_:
+- `RESULT = NEAREST(X, S)'
+-
+-_Arguments_:
+- X Shall be of type `REAL'.
+- S (Optional) shall be of type `REAL' and not
+- equal to zero.
+-
+-_Return value_:
+- The return value is of the same type as `X'. If `S' is positive,
+- `NEAREST' returns the processor-representable number greater than
+- `X' and nearest to it. If `S' is negative, `NEAREST' returns the
+- processor-representable number smaller than `X' and nearest to it.
+-
+-_Example_:
+- program test_nearest
+- real :: x, y
+- x = nearest(42.0, 1.0)
+- y = nearest(42.0, -1.0)
+- write (*,"(3(G20.15))") x, y, x - y
+- end program test_nearest
+-
+-
+-File: gfortran.info, Node: NEW_LINE, Next: NINT, Prev: NEAREST, Up: Intrinsic Procedures
+-
+-7.163 `NEW_LINE' -- New line character
+-======================================
+-
+-_Description_:
+- `NEW_LINE(C)' returns the new-line character.
+-
+-_Standard_:
+- Fortran 2003 and later
+-
+-_Class_:
+- Inquiry function
+-
+-_Syntax_:
+- `RESULT = NEW_LINE(C)'
+-
+-_Arguments_:
+- C The argument shall be a scalar or array of the
+- type `CHARACTER'.
+-
+-_Return value_:
+- Returns a CHARACTER scalar of length one with the new-line
+- character of the same kind as parameter C.
+-
+-_Example_:
+- program newline
+- implicit none
+- write(*,'(A)') 'This is record 1.'//NEW_LINE('A')//'This is record 2.'
+- end program newline
+-
+-
+-File: gfortran.info, Node: NINT, Next: NOT, Prev: NEW_LINE, Up: Intrinsic Procedures
+-
+-7.164 `NINT' -- Nearest whole number
+-====================================
+-
+-_Description_:
+- `NINT(X)' rounds its argument to the nearest whole number.
+-
+-_Standard_:
+- Fortran 77 and later, with KIND argument Fortran 90 and later
+-
+-_Class_:
+- Elemental function
+-
+-_Syntax_:
+- `RESULT = NINT(X [, KIND])'
+-
+-_Arguments_:
+- X The type of the argument shall be `REAL'.
+- KIND (Optional) An `INTEGER' initialization
+- expression indicating the kind parameter of
+- the result.
+-
+-_Return value_:
+- Returns A with the fractional portion of its magnitude eliminated
+- by rounding to the nearest whole number and with its sign
+- preserved, converted to an `INTEGER' of the default kind.
+-
+-_Example_:
+- program test_nint
+- real(4) x4
+- real(8) x8
+- x4 = 1.234E0_4
+- x8 = 4.321_8
+- print *, nint(x4), idnint(x8)
+- end program test_nint
+-
+-_Specific names_:
+- Name Argument Standard
+- `IDNINT(X)' `REAL(8)' Fortran 95 and
+- later
+-
+-_See also_:
+- *note CEILING::, *note FLOOR::
+-
+-
+-
+-File: gfortran.info, Node: NOT, Next: NULL, Prev: NINT, Up: Intrinsic Procedures
+-
+-7.165 `NOT' -- Logical negation
+-===============================
+-
+-_Description_:
+- `NOT' returns the bitwise boolean inverse of I.
+-
+-_Standard_:
+- Fortran 95 and later
+-
+-_Class_:
+- Elemental function
+-
+-_Syntax_:
+- `RESULT = NOT(I)'
+-
+-_Arguments_:
+- I The type shall be `INTEGER'.
+-
+-_Return value_:
+- The return type is `INTEGER', of the same kind as the argument.
+-
+-_See also_:
+- *note IAND::, *note IEOR::, *note IOR::, *note IBITS::, *note
+- IBSET::, *note IBCLR::
+-
+-
+-
+-File: gfortran.info, Node: NULL, Next: OR, Prev: NOT, Up: Intrinsic Procedures
+-
+-7.166 `NULL' -- Function that returns an disassociated pointer
+-==============================================================
+-
+-_Description_:
+- Returns a disassociated pointer.
+-
+- If MOLD is present, a dissassociated pointer of the same type is
+- returned, otherwise the type is determined by context.
+-
+- In Fortran 95, MOLD is optional. Please note that Fortran 2003
+- includes cases where it is required.
+-
+-_Standard_:
+- Fortran 95 and later
+-
+-_Class_:
+- Transformational function
+-
+-_Syntax_:
+- `PTR => NULL([MOLD])'
+-
+-_Arguments_:
+- MOLD (Optional) shall be a pointer of any
+- association status and of any type.
+-
+-_Return value_:
+- A disassociated pointer.
+-
+-_Example_:
+- REAL, POINTER, DIMENSION(:) :: VEC => NULL ()
+-
+-_See also_:
+- *note ASSOCIATED::
+-
+-
+-File: gfortran.info, Node: OR, Next: PACK, Prev: NULL, Up: Intrinsic Procedures
+-
+-7.167 `OR' -- Bitwise logical OR
+-================================
+-
+-_Description_:
+- Bitwise logical `OR'.
+-
+- This intrinsic routine is provided for backwards compatibility with
+- GNU Fortran 77. For integer arguments, programmers should consider
+- the use of the *note IOR:: intrinsic defined by the Fortran
+- standard.
+-
+-_Standard_:
+- GNU extension
+-
+-_Class_:
+- Function
+-
+-_Syntax_:
+- `RESULT = OR(X, Y)'
+-
+-_Arguments_:
+- X The type shall be either a scalar `INTEGER'
+- type or a scalar `LOGICAL' type.
+- Y The type shall be the same as the type of X.
+-
+-_Return value_:
+- The return type is either a scalar `INTEGER' or a scalar
+- `LOGICAL'. If the kind type parameters differ, then the smaller
+- kind type is implicitly converted to larger kind, and the return
+- has the larger kind.
+-
+-_Example_:
+- PROGRAM test_or
+- LOGICAL :: T = .TRUE., F = .FALSE.
+- INTEGER :: a, b
+- DATA a / Z'F' /, b / Z'3' /
+-
+- WRITE (*,*) OR(T, T), OR(T, F), OR(F, T), OR(F, F)
+- WRITE (*,*) OR(a, b)
+- END PROGRAM
+-
+-_See also_:
+- Fortran 95 elemental function: *note IOR::
+-
+-
+-File: gfortran.info, Node: PACK, Next: PERROR, Prev: OR, Up: Intrinsic Procedures
+-
+-7.168 `PACK' -- Pack an array into an array of rank one
+-=======================================================
+-
+-_Description_:
+- Stores the elements of ARRAY in an array of rank one.
+-
+- The beginning of the resulting array is made up of elements whose
+- MASK equals `TRUE'. Afterwards, positions are filled with elements
+- taken from VECTOR.
+-
+-_Standard_:
+- Fortran 95 and later
+-
+-_Class_:
+- Transformational function
+-
+-_Syntax_:
+- `RESULT = PACK(ARRAY, MASK[,VECTOR]'
+-
+-_Arguments_:
+- ARRAY Shall be an array of any type.
+- MASK Shall be an array of type `LOGICAL' and of the
+- same size as ARRAY. Alternatively, it may be a
+- `LOGICAL' scalar.
+- VECTOR (Optional) shall be an array of the same type
+- as ARRAY and of rank one. If present, the
+- number of elements in VECTOR shall be equal to
+- or greater than the number of true elements in
+- MASK. If MASK is scalar, the number of
+- elements in VECTOR shall be equal to or
+- greater than the number of elements in ARRAY.
+-
+-_Return value_:
+- The result is an array of rank one and the same type as that of
+- ARRAY. If VECTOR is present, the result size is that of VECTOR,
+- the number of `TRUE' values in MASK otherwise.
+-
+-_Example_:
+- Gathering nonzero elements from an array:
+- PROGRAM test_pack_1
+- INTEGER :: m(6)
+- m = (/ 1, 0, 0, 0, 5, 0 /)
+- WRITE(*, FMT="(6(I0, ' '))") pack(m, m /= 0) ! "1 5"
+- END PROGRAM
+-
+- Gathering nonzero elements from an array and appending elements
+- from VECTOR:
+- PROGRAM test_pack_2
+- INTEGER :: m(4)
+- m = (/ 1, 0, 0, 2 /)
+- WRITE(*, FMT="(4(I0, ' '))") pack(m, m /= 0, (/ 0, 0, 3, 4 /)) ! "1 2 3 4"
+- END PROGRAM
+-
+-_See also_:
+- *note UNPACK::
+-
+-
+-File: gfortran.info, Node: PERROR, Next: PRECISION, Prev: PACK, Up: Intrinsic Procedures
+-
+-7.169 `PERROR' -- Print system error message
+-============================================
+-
+-_Description_:
+- Prints (on the C `stderr' stream) a newline-terminated error
+- message corresponding to the last system error. This is prefixed by
+- STRING, a colon and a space. See `perror(3)'.
+-
+-_Standard_:
+- GNU extension
+-
+-_Class_:
+- Subroutine
+-
+-_Syntax_:
+- `CALL PERROR(STRING)'
+-
+-_Arguments_:
+- STRING A scalar of type `CHARACTER' and of the
+- default kind.
+-
+-_See also_:
+- *note IERRNO::
+-
+-
+-File: gfortran.info, Node: PRECISION, Next: PRESENT, Prev: PERROR, Up: Intrinsic Procedures
+-
+-7.170 `PRECISION' -- Decimal precision of a real kind
+-=====================================================
+-
+-_Description_:
+- `PRECISION(X)' returns the decimal precision in the model of the
+- type of `X'.
+-
+-_Standard_:
+- Fortran 95 and later
+-
+-_Class_:
+- Inquiry function
+-
+-_Syntax_:
+- `RESULT = PRECISION(X)'
+-
+-_Arguments_:
+- X Shall be of type `REAL' or `COMPLEX'.
+-
+-_Return value_:
+- The return value is of type `INTEGER' and of the default integer
+- kind.
+-
+-_Example_:
+- program prec_and_range
+- real(kind=4) :: x(2)
+- complex(kind=8) :: y
+-
+- print *, precision(x), range(x)
+- print *, precision(y), range(y)
+- end program prec_and_range
+-
+-
+-File: gfortran.info, Node: PRESENT, Next: PRODUCT, Prev: PRECISION, Up: Intrinsic Procedures
+-
+-7.171 `PRESENT' -- Determine whether an optional dummy argument is specified
+-============================================================================
+-
+-_Description_:
+- Determines whether an optional dummy argument is present.
+-
+-_Standard_:
+- Fortran 95 and later
+-
+-_Class_:
+- Inquiry function
+-
+-_Syntax_:
+- `RESULT = PRESENT(A)'
+-
+-_Arguments_:
+- A May be of any type and may be a pointer,
+- scalar or array value, or a dummy procedure.
+- It shall be the name of an optional dummy
+- argument accessible within the current
+- subroutine or function.
+-
+-_Return value_:
+- Returns either `TRUE' if the optional argument A is present, or
+- `FALSE' otherwise.
+-
+-_Example_:
+- PROGRAM test_present
+- WRITE(*,*) f(), f(42) ! "F T"
+- CONTAINS
+- LOGICAL FUNCTION f(x)
+- INTEGER, INTENT(IN), OPTIONAL :: x
+- f = PRESENT(x)
+- END FUNCTION
+- END PROGRAM
+-
+-
+-File: gfortran.info, Node: PRODUCT, Next: RADIX, Prev: PRESENT, Up: Intrinsic Procedures
+-
+-7.172 `PRODUCT' -- Product of array elements
+-============================================
+-
+-_Description_:
+- Multiplies the elements of ARRAY along dimension DIM if the
+- corresponding element in MASK is `TRUE'.
+-
+-_Standard_:
+- Fortran 95 and later
+-
+-_Class_:
+- Transformational function
+-
+-_Syntax_:
+- `RESULT = PRODUCT(ARRAY[, MASK])' `RESULT = PRODUCT(ARRAY, DIM[,
+- MASK])'
+-
+-_Arguments_:
+- ARRAY Shall be an array of type `INTEGER', `REAL' or
+- `COMPLEX'.
+- DIM (Optional) shall be a scalar of type `INTEGER'
+- with a value in the range from 1 to n, where n
+- equals the rank of ARRAY.
+- MASK (Optional) shall be of type `LOGICAL' and
+- either be a scalar or an array of the same
+- shape as ARRAY.
+-
+-_Return value_:
+- The result is of the same type as ARRAY.
+-
+- If DIM is absent, a scalar with the product of all elements in
+- ARRAY is returned. Otherwise, an array of rank n-1, where n equals
+- the rank of ARRAY, and a shape similar to that of ARRAY with
+- dimension DIM dropped is returned.
+-
+-_Example_:
+- PROGRAM test_product
+- INTEGER :: x(5) = (/ 1, 2, 3, 4 ,5 /)
+- print *, PRODUCT(x) ! all elements, product = 120
+- print *, PRODUCT(x, MASK=MOD(x, 2)==1) ! odd elements, product = 15
+- END PROGRAM
+-
+-_See also_:
+- *note SUM::
+-
+-
+-File: gfortran.info, Node: RADIX, Next: RANDOM_NUMBER, Prev: PRODUCT, Up: Intrinsic Procedures
+-
+-7.173 `RADIX' -- Base of a model number
+-=======================================
+-
+-_Description_:
+- `RADIX(X)' returns the base of the model representing the entity X.
+-
+-_Standard_:
+- Fortran 95 and later
+-
+-_Class_:
+- Inquiry function
+-
+-_Syntax_:
+- `RESULT = RADIX(X)'
+-
+-_Arguments_:
+- X Shall be of type `INTEGER' or `REAL'
+-
+-_Return value_:
+- The return value is a scalar of type `INTEGER' and of the default
+- integer kind.
+-
+-_Example_:
+- program test_radix
+- print *, "The radix for the default integer kind is", radix(0)
+- print *, "The radix for the default real kind is", radix(0.0)
+- end program test_radix
+-
+-
+-
+-File: gfortran.info, Node: RAN, Next: REAL, Prev: RANGE, Up: Intrinsic Procedures
+-
+-7.174 `RAN' -- Real pseudo-random number
+-========================================
+-
+-_Description_:
+- For compatibility with HP FORTRAN 77/iX, the `RAN' intrinsic is
+- provided as an alias for `RAND'. See *note RAND:: for complete
+- documentation.
+-
+-_Standard_:
+- GNU extension
+-
+-_Class_:
+- Function
+-
+-_See also_:
+- *note RAND::, *note RANDOM_NUMBER::
+-
+-
+-File: gfortran.info, Node: RAND, Next: RANGE, Prev: RANDOM_SEED, Up: Intrinsic Procedures
+-
+-7.175 `RAND' -- Real pseudo-random number
+-=========================================
+-
+-_Description_:
+- `RAND(FLAG)' returns a pseudo-random number from a uniform
+- distribution between 0 and 1. If FLAG is 0, the next number in the
+- current sequence is returned; if FLAG is 1, the generator is
+- restarted by `CALL SRAND(0)'; if FLAG has any other value, it is
+- used as a new seed with `SRAND'.
+-
+- This intrinsic routine is provided for backwards compatibility with
+- GNU Fortran 77. It implements a simple modulo generator as provided
+- by `g77'. For new code, one should consider the use of *note
+- RANDOM_NUMBER:: as it implements a superior algorithm.
+-
+-_Standard_:
+- GNU extension
+-
+-_Class_:
+- Function
+-
+-_Syntax_:
+- `RESULT = RAND(FLAG)'
+-
+-_Arguments_:
+- FLAG Shall be a scalar `INTEGER' of kind 4.
+-
+-_Return value_:
+- The return value is of `REAL' type and the default kind.
+-
+-_Example_:
+- program test_rand
+- integer,parameter :: seed = 86456
+-
+- call srand(seed)
+- print *, rand(), rand(), rand(), rand()
+- print *, rand(seed), rand(), rand(), rand()
+- end program test_rand
+-
+-_See also_:
+- *note SRAND::, *note RANDOM_NUMBER::
+-
+-
+-
+-File: gfortran.info, Node: RANDOM_NUMBER, Next: RANDOM_SEED, Prev: RADIX, Up: Intrinsic Procedures
+-
+-7.176 `RANDOM_NUMBER' -- Pseudo-random number
+-=============================================
+-
+-_Description_:
+- Returns a single pseudorandom number or an array of pseudorandom
+- numbers from the uniform distribution over the range 0 \leq x < 1.
+-
+- The runtime-library implements George Marsaglia's KISS (Keep It
+- Simple Stupid) random number generator (RNG). This RNG combines:
+- 1. The congruential generator x(n) = 69069 \cdot x(n-1) +
+- 1327217885 with a period of 2^32,
+-
+- 2. A 3-shift shift-register generator with a period of 2^32 - 1,
+-
+- 3. Two 16-bit multiply-with-carry generators with a period of
+- 597273182964842497 > 2^59.
+- The overall period exceeds 2^123.
+-
+- Please note, this RNG is thread safe if used within OpenMP
+- directives, i.e., its state will be consistent while called from
+- multiple threads. However, the KISS generator does not create
+- random numbers in parallel from multiple sources, but in sequence
+- from a single source. If an OpenMP-enabled application heavily
+- relies on random numbers, one should consider employing a
+- dedicated parallel random number generator instead.
+-
+-_Standard_:
+- Fortran 95 and later
+-
+-_Class_:
+- Subroutine
+-
+-_Syntax_:
+- `RANDOM_NUMBER(HARVEST)'
+-
+-_Arguments_:
+- HARVEST Shall be a scalar or an array of type `REAL'.
+-
+-_Example_:
+- program test_random_number
+- REAL :: r(5,5)
+- CALL init_random_seed() ! see example of RANDOM_SEED
+- CALL RANDOM_NUMBER(r)
+- end program
+-
+-_See also_:
+- *note RANDOM_SEED::
+-
+-
+-File: gfortran.info, Node: RANDOM_SEED, Next: RAND, Prev: RANDOM_NUMBER, Up: Intrinsic Procedures
+-
+-7.177 `RANDOM_SEED' -- Initialize a pseudo-random number sequence
+-=================================================================
+-
+-_Description_:
+- Restarts or queries the state of the pseudorandom number generator
+- used by `RANDOM_NUMBER'.
+-
+- If `RANDOM_SEED' is called without arguments, it is initialized to
+- a default state. The example below shows how to initialize the
+- random seed based on the system's time.
+-
+-_Standard_:
+- Fortran 95 and later
+-
+-_Class_:
+- Subroutine
+-
+-_Syntax_:
+- `CALL RANDOM_SEED(SIZE, PUT, GET)'
+-
+-_Arguments_:
+- SIZE (Optional) Shall be a scalar and of type
+- default `INTEGER', with `INTENT(OUT)'. It
+- specifies the minimum size of the arrays used
+- with the PUT and GET arguments.
+- PUT (Optional) Shall be an array of type default
+- `INTEGER' and rank one. It is `INTENT(IN)' and
+- the size of the array must be larger than or
+- equal to the number returned by the SIZE
+- argument.
+- GET (Optional) Shall be an array of type default
+- `INTEGER' and rank one. It is `INTENT(OUT)'
+- and the size of the array must be larger than
+- or equal to the number returned by the SIZE
+- argument.
+-
+-_Example_:
+- SUBROUTINE init_random_seed()
+- INTEGER :: i, n, clock
+- INTEGER, DIMENSION(:), ALLOCATABLE :: seed
+-
+- CALL RANDOM_SEED(size = n)
+- ALLOCATE(seed(n))
+-
+- CALL SYSTEM_CLOCK(COUNT=clock)
+-
+- seed = clock + 37 * (/ (i - 1, i = 1, n) /)
+- CALL RANDOM_SEED(PUT = seed)
+-
+- DEALLOCATE(seed)
+- END SUBROUTINE
+-
+-_See also_:
+- *note RANDOM_NUMBER::
+-
+-
+-File: gfortran.info, Node: RANGE, Next: RAN, Prev: RAND, Up: Intrinsic Procedures
+-
+-7.178 `RANGE' -- Decimal exponent range
+-=======================================
+-
+-_Description_:
+- `RANGE(X)' returns the decimal exponent range in the model of the
+- type of `X'.
+-
+-_Standard_:
+- Fortran 95 and later
+-
+-_Class_:
+- Inquiry function
+-
+-_Syntax_:
+- `RESULT = RANGE(X)'
+-
+-_Arguments_:
+- X Shall be of type `INTEGER', `REAL' or
+- `COMPLEX'.
+-
+-_Return value_:
+- The return value is of type `INTEGER' and of the default integer
+- kind.
+-
+-_Example_:
+- See `PRECISION' for an example.
+-
+-
+-File: gfortran.info, Node: REAL, Next: RENAME, Prev: RAN, Up: Intrinsic Procedures
+-
+-7.179 `REAL' -- Convert to real type
+-====================================
+-
+-_Description_:
+- `REAL(X [, KIND])' converts its argument X to a real type. The
+- `REALPART(X)' function is provided for compatibility with `g77',
+- and its use is strongly discouraged.
+-
+-_Standard_:
+- Fortran 77 and later
+-
+-_Class_:
+- Elemental function
+-
+-_Syntax_:
+- `RESULT = REAL(X [, KIND])'
+- `RESULT = REALPART(Z)'
+-
+-_Arguments_:
+- X Shall be `INTEGER', `REAL', or `COMPLEX'.
+- KIND (Optional) An `INTEGER' initialization
+- expression indicating the kind parameter of
+- the result.
+-
+-_Return value_:
+- These functions return a `REAL' variable or array under the
+- following rules:
+-
+- (A)
+- `REAL(X)' is converted to a default real type if X is an
+- integer or real variable.
+-
+- (B)
+- `REAL(X)' is converted to a real type with the kind type
+- parameter of X if X is a complex variable.
+-
+- (C)
+- `REAL(X, KIND)' is converted to a real type with kind type
+- parameter KIND if X is a complex, integer, or real variable.
+-
+-_Example_:
+- program test_real
+- complex :: x = (1.0, 2.0)
+- print *, real(x), real(x,8), realpart(x)
+- end program test_real
+-
+-_See also_:
+- *note DBLE::, *note DFLOAT::, *note FLOAT::
+-
+-
+-
+-File: gfortran.info, Node: RENAME, Next: REPEAT, Prev: REAL, Up: Intrinsic Procedures
+-
+-7.180 `RENAME' -- Rename a file
+-===============================
+-
+-_Description_:
+- Renames a file from file PATH1 to PATH2. A null character
+- (`CHAR(0)') can be used to mark the end of the names in PATH1 and
+- PATH2; otherwise, trailing blanks in the file names are ignored.
+- If the STATUS argument is supplied, it contains 0 on success or a
+- nonzero error code upon return; see `rename(2)'.
+-
+- This intrinsic is provided in both subroutine and function forms;
+- however, only one form can be used in any given program unit.
+-
+-_Standard_:
+- GNU extension
+-
+-_Class_:
+- Subroutine, function
+-
+-_Syntax_:
+- `CALL RENAME(PATH1, PATH2 [, STATUS])'
+- `STATUS = RENAME(PATH1, PATH2)'
+-
+-_Arguments_:
+- PATH1 Shall be of default `CHARACTER' type.
+- PATH2 Shall be of default `CHARACTER' type.
+- STATUS (Optional) Shall be of default `INTEGER' type.
+-
+-_See also_:
+- *note LINK::
+-
+-
+-
+-File: gfortran.info, Node: REPEAT, Next: RESHAPE, Prev: RENAME, Up: Intrinsic Procedures
+-
+-7.181 `REPEAT' -- Repeated string concatenation
+-===============================================
+-
+-_Description_:
+- Concatenates NCOPIES copies of a string.
+-
+-_Standard_:
+- Fortran 95 and later
+-
+-_Class_:
+- Transformational function
+-
+-_Syntax_:
+- `RESULT = REPEAT(STRING, NCOPIES)'
+-
+-_Arguments_:
+- STRING Shall be scalar and of type `CHARACTER'.
+- NCOPIES Shall be scalar and of type `INTEGER'.
+-
+-_Return value_:
+- A new scalar of type `CHARACTER' built up from NCOPIES copies of
+- STRING.
+-
+-_Example_:
+- program test_repeat
+- write(*,*) repeat("x", 5) ! "xxxxx"
+- end program
+-
+-
+-File: gfortran.info, Node: RESHAPE, Next: RRSPACING, Prev: REPEAT, Up: Intrinsic Procedures
+-
+-7.182 `RESHAPE' -- Function to reshape an array
+-===============================================
+-
+-_Description_:
+- Reshapes SOURCE to correspond to SHAPE. If necessary, the new
+- array may be padded with elements from PAD or permuted as defined
+- by ORDER.
+-
+-_Standard_:
+- Fortran 95 and later
+-
+-_Class_:
+- Transformational function
+-
+-_Syntax_:
+- `RESULT = RESHAPE(SOURCE, SHAPE[, PAD, ORDER])'
+-
+-_Arguments_:
+- SOURCE Shall be an array of any type.
+- SHAPE Shall be of type `INTEGER' and an array of
+- rank one. Its values must be positive or zero.
+- PAD (Optional) shall be an array of the same type
+- as SOURCE.
+- ORDER (Optional) shall be of type `INTEGER' and an
+- array of the same shape as SHAPE. Its values
+- shall be a permutation of the numbers from 1
+- to n, where n is the size of SHAPE. If ORDER
+- is absent, the natural ordering shall be
+- assumed.
+-
+-_Return value_:
+- The result is an array of shape SHAPE with the same type as SOURCE.
+-
+-_Example_:
+- PROGRAM test_reshape
+- INTEGER, DIMENSION(4) :: x
+- WRITE(*,*) SHAPE(x) ! prints "4"
+- WRITE(*,*) SHAPE(RESHAPE(x, (/2, 2/))) ! prints "2 2"
+- END PROGRAM
+-
+-_See also_:
+- *note SHAPE::
+-
+-
+-File: gfortran.info, Node: RRSPACING, Next: RSHIFT, Prev: RESHAPE, Up: Intrinsic Procedures
+-
+-7.183 `RRSPACING' -- Reciprocal of the relative spacing
+-=======================================================
+-
+-_Description_:
+- `RRSPACING(X)' returns the reciprocal of the relative spacing of
+- model numbers near X.
+-
+-_Standard_:
+- Fortran 95 and later
+-
+-_Class_:
+- Elemental function
+-
+-_Syntax_:
+- `RESULT = RRSPACING(X)'
+-
+-_Arguments_:
+- X Shall be of type `REAL'.
+-
+-_Return value_:
+- The return value is of the same type and kind as X. The value
+- returned is equal to `ABS(FRACTION(X)) *
+- FLOAT(RADIX(X))**DIGITS(X)'.
+-
+-_See also_:
+- *note SPACING::
+-
+-
+-File: gfortran.info, Node: RSHIFT, Next: SCALE, Prev: RRSPACING, Up: Intrinsic Procedures
+-
+-7.184 `RSHIFT' -- Right shift bits
+-==================================
+-
+-_Description_:
+- `RSHIFT' returns a value corresponding to I with all of the bits
+- shifted right by SHIFT places. If the absolute value of SHIFT is
+- greater than `BIT_SIZE(I)', the value is undefined. Bits shifted
+- out from the left end are lost; zeros are shifted in from the
+- opposite end.
+-
+- This function has been superseded by the `ISHFT' intrinsic, which
+- is standard in Fortran 95 and later.
+-
+-_Standard_:
+- GNU extension
+-
+-_Class_:
+- Elemental function
+-
+-_Syntax_:
+- `RESULT = RSHIFT(I, SHIFT)'
+-
+-_Arguments_:
+- I The type shall be `INTEGER'.
+- SHIFT The type shall be `INTEGER'.
+-
+-_Return value_:
+- The return value is of type `INTEGER' and of the same kind as I.
+-
+-_See also_:
+- *note ISHFT::, *note ISHFTC::, *note LSHIFT::
+-
+-
+-
+-File: gfortran.info, Node: SCALE, Next: SCAN, Prev: RSHIFT, Up: Intrinsic Procedures
+-
+-7.185 `SCALE' -- Scale a real value
+-===================================
+-
+-_Description_:
+- `SCALE(X,I)' returns `X * RADIX(X)**I'.
+-
+-_Standard_:
+- Fortran 95 and later
+-
+-_Class_:
+- Elemental function
+-
+-_Syntax_:
+- `RESULT = SCALE(X, I)'
+-
+-_Arguments_:
+- X The type of the argument shall be a `REAL'.
+- I The type of the argument shall be a `INTEGER'.
+-
+-_Return value_:
+- The return value is of the same type and kind as X. Its value is
+- `X * RADIX(X)**I'.
+-
+-_Example_:
+- program test_scale
+- real :: x = 178.1387e-4
+- integer :: i = 5
+- print *, scale(x,i), x*radix(x)**i
+- end program test_scale
+-
+-
+-
+-File: gfortran.info, Node: SCAN, Next: SECNDS, Prev: SCALE, Up: Intrinsic Procedures
+-
+-7.186 `SCAN' -- Scan a string for the presence of a set of characters
+-=====================================================================
+-
+-_Description_:
+- Scans a STRING for any of the characters in a SET of characters.
+-
+- If BACK is either absent or equals `FALSE', this function returns
+- the position of the leftmost character of STRING that is in SET.
+- If BACK equals `TRUE', the rightmost position is returned. If no
+- character of SET is found in STRING, the result is zero.
+-
+-_Standard_:
+- Fortran 95 and later, with KIND argument Fortran 2003 and later
+-
+-_Class_:
+- Elemental function
+-
+-_Syntax_:
+- `RESULT = SCAN(STRING, SET[, BACK [, KIND]])'
+-
+-_Arguments_:
+- STRING Shall be of type `CHARACTER'.
+- SET Shall be of type `CHARACTER'.
+- BACK (Optional) shall be of type `LOGICAL'.
+- KIND (Optional) An `INTEGER' initialization
+- expression indicating the kind parameter of
+- the result.
+-
+-_Return value_:
+- The return value is of type `INTEGER' and of kind KIND. If KIND is
+- absent, the return value is of default integer kind.
+-
+-_Example_:
+- PROGRAM test_scan
+- WRITE(*,*) SCAN("FORTRAN", "AO") ! 2, found 'O'
+- WRITE(*,*) SCAN("FORTRAN", "AO", .TRUE.) ! 6, found 'A'
+- WRITE(*,*) SCAN("FORTRAN", "C++") ! 0, found none
+- END PROGRAM
+-
+-_See also_:
+- *note INDEX intrinsic::, *note VERIFY::
+-
+-
+-File: gfortran.info, Node: SECNDS, Next: SECOND, Prev: SCAN, Up: Intrinsic Procedures
+-
+-7.187 `SECNDS' -- Time function
+-===============================
+-
+-_Description_:
+- `SECNDS(X)' gets the time in seconds from the real-time system
+- clock. X is a reference time, also in seconds. If this is zero,
+- the time in seconds from midnight is returned. This function is
+- non-standard and its use is discouraged.
+-
+-_Standard_:
+- GNU extension
+-
+-_Class_:
+- Function
+-
+-_Syntax_:
+- `RESULT = SECNDS (X)'
+-
+-_Arguments_:
+- T Shall be of type `REAL(4)'.
+- X Shall be of type `REAL(4)'.
+-
+-_Return value_:
+- None
+-
+-_Example_:
+- program test_secnds
+- integer :: i
+- real(4) :: t1, t2
+- print *, secnds (0.0) ! seconds since midnight
+- t1 = secnds (0.0) ! reference time
+- do i = 1, 10000000 ! do something
+- end do
+- t2 = secnds (t1) ! elapsed time
+- print *, "Something took ", t2, " seconds."
+- end program test_secnds
+-
+-
+-File: gfortran.info, Node: SECOND, Next: SELECTED_CHAR_KIND, Prev: SECNDS, Up: Intrinsic Procedures
+-
+-7.188 `SECOND' -- CPU time function
+-===================================
+-
+-_Description_:
+- Returns a `REAL(4)' value representing the elapsed CPU time in
+- seconds. This provides the same functionality as the standard
+- `CPU_TIME' intrinsic, and is only included for backwards
+- compatibility.
+-
+- This intrinsic is provided in both subroutine and function forms;
+- however, only one form can be used in any given program unit.
+-
+-_Standard_:
+- GNU extension
+-
+-_Class_:
+- Subroutine, function
+-
+-_Syntax_:
+- `CALL SECOND(TIME)'
+- `TIME = SECOND()'
+-
+-_Arguments_:
+- TIME Shall be of type `REAL(4)'.
+-
+-_Return value_:
+- In either syntax, TIME is set to the process's current runtime in
+- seconds.
+-
+-_See also_:
+- *note CPU_TIME::
+-
+-
+-
+-File: gfortran.info, Node: SELECTED_CHAR_KIND, Next: SELECTED_INT_KIND, Prev: SECOND, Up: Intrinsic Procedures
+-
+-7.189 `SELECTED_CHAR_KIND' -- Choose character kind
+-===================================================
+-
+-_Description_:
+- `SELECTED_CHAR_KIND(NAME)' returns the kind value for the character
+- set named NAME, if a character set with such a name is supported,
+- or -1 otherwise. Currently, supported character sets include
+- "ASCII" and "DEFAULT", which are equivalent.
+-
+-_Standard_:
+- Fortran 2003 and later
+-
+-_Class_:
+- Transformational function
+-
+-_Syntax_:
+- `RESULT = SELECTED_CHAR_KIND(NAME)'
+-
+-_Arguments_:
+- NAME Shall be a scalar and of the default character
+- type.
+-
+-_Example_:
+- program ascii_kind
+- integer,parameter :: ascii = selected_char_kind("ascii")
+- character(kind=ascii, len=26) :: s
+-
+- s = ascii_"abcdefghijklmnopqrstuvwxyz"
+- print *, s
+- end program ascii_kind
+-
+-
+-File: gfortran.info, Node: SELECTED_INT_KIND, Next: SELECTED_REAL_KIND, Prev: SELECTED_CHAR_KIND, Up: Intrinsic Procedures
+-
+-7.190 `SELECTED_INT_KIND' -- Choose integer kind
+-================================================
+-
+-_Description_:
+- `SELECTED_INT_KIND(I)' return the kind value of the smallest
+- integer type that can represent all values ranging from -10^I
+- (exclusive) to 10^I (exclusive). If there is no integer kind that
+- accommodates this range, `SELECTED_INT_KIND' returns -1.
+-
+-_Standard_:
+- Fortran 95 and later
+-
+-_Class_:
+- Transformational function
+-
+-_Syntax_:
+- `RESULT = SELECTED_INT_KIND(I)'
+-
+-_Arguments_:
+- I Shall be a scalar and of type `INTEGER'.
+-
+-_Example_:
+- program large_integers
+- integer,parameter :: k5 = selected_int_kind(5)
+- integer,parameter :: k15 = selected_int_kind(15)
+- integer(kind=k5) :: i5
+- integer(kind=k15) :: i15
+-
+- print *, huge(i5), huge(i15)
+-
+- ! The following inequalities are always true
+- print *, huge(i5) >= 10_k5**5-1
+- print *, huge(i15) >= 10_k15**15-1
+- end program large_integers
+-
+-
+-File: gfortran.info, Node: SELECTED_REAL_KIND, Next: SET_EXPONENT, Prev: SELECTED_INT_KIND, Up: Intrinsic Procedures
+-
+-7.191 `SELECTED_REAL_KIND' -- Choose real kind
+-==============================================
+-
+-_Description_:
+- `SELECTED_REAL_KIND(P,R)' returns the kind value of a real data
+- type with decimal precision of at least `P' digits and exponent
+- range greater at least `R'.
+-
+-_Standard_:
+- Fortran 95 and later
+-
+-_Class_:
+- Transformational function
+-
+-_Syntax_:
+- `RESULT = SELECTED_REAL_KIND(P, R)'
+-
+-_Arguments_:
+- P (Optional) shall be a scalar and of type
+- `INTEGER'.
+- R (Optional) shall be a scalar and of type
+- `INTEGER'.
+- At least one argument shall be present.
+-
+-_Return value_:
+- `SELECTED_REAL_KIND' returns the value of the kind type parameter
+- of a real data type with decimal precision of at least `P' digits
+- and a decimal exponent range of at least `R'. If more than one
+- real data type meet the criteria, the kind of the data type with
+- the smallest decimal precision is returned. If no real data type
+- matches the criteria, the result is
+- -1 if the processor does not support a real data type with a
+- precision greater than or equal to `P'
+-
+- -2 if the processor does not support a real type with an exponent
+- range greater than or equal to `R'
+-
+- -3 if neither is supported.
+-
+-_Example_:
+- program real_kinds
+- integer,parameter :: p6 = selected_real_kind(6)
+- integer,parameter :: p10r100 = selected_real_kind(10,100)
+- integer,parameter :: r400 = selected_real_kind(r=400)
+- real(kind=p6) :: x
+- real(kind=p10r100) :: y
+- real(kind=r400) :: z
+-
+- print *, precision(x), range(x)
+- print *, precision(y), range(y)
+- print *, precision(z), range(z)
+- end program real_kinds
+-
+-
+-File: gfortran.info, Node: SET_EXPONENT, Next: SHAPE, Prev: SELECTED_REAL_KIND, Up: Intrinsic Procedures
+-
+-7.192 `SET_EXPONENT' -- Set the exponent of the model
+-=====================================================
+-
+-_Description_:
+- `SET_EXPONENT(X, I)' returns the real number whose fractional part
+- is that that of X and whose exponent part is I.
+-
+-_Standard_:
+- Fortran 95 and later
+-
+-_Class_:
+- Elemental function
+-
+-_Syntax_:
+- `RESULT = SET_EXPONENT(X, I)'
+-
+-_Arguments_:
+- X Shall be of type `REAL'.
+- I Shall be of type `INTEGER'.
+-
+-_Return value_:
+- The return value is of the same type and kind as X. The real
+- number whose fractional part is that that of X and whose exponent
+- part if I is returned; it is `FRACTION(X) * RADIX(X)**I'.
+-
+-_Example_:
+- PROGRAM test_setexp
+- REAL :: x = 178.1387e-4
+- INTEGER :: i = 17
+- PRINT *, SET_EXPONENT(x, i), FRACTION(x) * RADIX(x)**i
+- END PROGRAM
+-
+-
+-
+-File: gfortran.info, Node: SHAPE, Next: SIGN, Prev: SET_EXPONENT, Up: Intrinsic Procedures
+-
+-7.193 `SHAPE' -- Determine the shape of an array
+-================================================
+-
+-_Description_:
+- Determines the shape of an array.
+-
+-_Standard_:
+- Fortran 95 and later
+-
+-_Class_:
+- Inquiry function
+-
+-_Syntax_:
+- `RESULT = SHAPE(SOURCE)'
+-
+-_Arguments_:
+- SOURCE Shall be an array or scalar of any type. If
+- SOURCE is a pointer it must be associated and
+- allocatable arrays must be allocated.
+-
+-_Return value_:
+- An `INTEGER' array of rank one with as many elements as SOURCE has
+- dimensions. The elements of the resulting array correspond to the
+- extend of SOURCE along the respective dimensions. If SOURCE is a
+- scalar, the result is the rank one array of size zero.
+-
+-_Example_:
+- PROGRAM test_shape
+- INTEGER, DIMENSION(-1:1, -1:2) :: A
+- WRITE(*,*) SHAPE(A) ! (/ 3, 4 /)
+- WRITE(*,*) SIZE(SHAPE(42)) ! (/ /)
+- END PROGRAM
+-
+-_See also_:
+- *note RESHAPE::, *note SIZE::
+-
+-
+-File: gfortran.info, Node: SIGN, Next: SIGNAL, Prev: SHAPE, Up: Intrinsic Procedures
+-
+-7.194 `SIGN' -- Sign copying function
+-=====================================
+-
+-_Description_:
+- `SIGN(A,B)' returns the value of A with the sign of B.
+-
+-_Standard_:
+- Fortran 77 and later
+-
+-_Class_:
+- Elemental function
+-
+-_Syntax_:
+- `RESULT = SIGN(A, B)'
+-
+-_Arguments_:
+- A Shall be of type `INTEGER' or `REAL'
+- B Shall be of the same type and kind as A
+-
+-_Return value_:
+- The kind of the return value is that of A and B. If B\ge 0 then
+- the result is `ABS(A)', else it is `-ABS(A)'.
+-
+-_Example_:
+- program test_sign
+- print *, sign(-12,1)
+- print *, sign(-12,0)
+- print *, sign(-12,-1)
+-
+- print *, sign(-12.,1.)
+- print *, sign(-12.,0.)
+- print *, sign(-12.,-1.)
+- end program test_sign
+-
+-_Specific names_:
+- Name Arguments Return type Standard
+- `ISIGN(A,P)' `INTEGER(4)' `INTEGER(4)' f95, gnu
+- `DSIGN(A,P)' `REAL(8)' `REAL(8)' f95, gnu
+-
+-
+-File: gfortran.info, Node: SIGNAL, Next: SIN, Prev: SIGN, Up: Intrinsic Procedures
+-
+-7.195 `SIGNAL' -- Signal handling subroutine (or function)
+-==========================================================
+-
+-_Description_:
+- `SIGNAL(NUMBER, HANDLER [, STATUS])' causes external subroutine
+- HANDLER to be executed with a single integer argument when signal
+- NUMBER occurs. If HANDLER is an integer, it can be used to turn
+- off handling of signal NUMBER or revert to its default action.
+- See `signal(2)'.
+-
+- If `SIGNAL' is called as a subroutine and the STATUS argument is
+- supplied, it is set to the value returned by `signal(2)'.
+-
+-_Standard_:
+- GNU extension
+-
+-_Class_:
+- Subroutine, function
+-
+-_Syntax_:
+- `CALL SIGNAL(NUMBER, HANDLER [, STATUS])'
+- `STATUS = SIGNAL(NUMBER, HANDLER)'
+-
+-_Arguments_:
+- NUMBER Shall be a scalar integer, with `INTENT(IN)'
+- HANDLER Signal handler (`INTEGER FUNCTION' or
+- `SUBROUTINE') or dummy/global `INTEGER' scalar.
+- `INTEGER'. It is `INTENT(IN)'.
+- STATUS (Optional) STATUS shall be a scalar integer.
+- It has `INTENT(OUT)'.
+-
+-_Return value_:
+- The `SIGNAL' function returns the value returned by `signal(2)'.
+-
+-_Example_:
+- program test_signal
+- intrinsic signal
+- external handler_print
+-
+- call signal (12, handler_print)
+- call signal (10, 1)
+-
+- call sleep (30)
+- end program test_signal
+-
+-
+-File: gfortran.info, Node: SIN, Next: SINH, Prev: SIGNAL, Up: Intrinsic Procedures
+-
+-7.196 `SIN' -- Sine function
+-============================
+-
+-_Description_:
+- `SIN(X)' computes the sine of X.
+-
+-_Standard_:
+- Fortran 77 and later
+-
+-_Class_:
+- Elemental function
+-
+-_Syntax_:
+- `RESULT = SIN(X)'
+-
+-_Arguments_:
+- X The type shall be `REAL' or `COMPLEX'.
+-
+-_Return value_:
+- The return value has same type and kind as X.
+-
+-_Example_:
+- program test_sin
+- real :: x = 0.0
+- x = sin(x)
+- end program test_sin
+-
+-_Specific names_:
+- Name Argument Return type Standard
+- `DSIN(X)' `REAL(8) X' `REAL(8)' f95, gnu
+- `CSIN(X)' `COMPLEX(4) `COMPLEX(4)' f95, gnu
+- X'
+- `ZSIN(X)' `COMPLEX(8) `COMPLEX(8)' f95, gnu
+- X'
+- `CDSIN(X)' `COMPLEX(8) `COMPLEX(8)' f95, gnu
+- X'
+-
+-_See also_:
+- *note ASIN::
+-
+-
+-File: gfortran.info, Node: SINH, Next: SIZE, Prev: SIN, Up: Intrinsic Procedures
+-
+-7.197 `SINH' -- Hyperbolic sine function
+-========================================
+-
+-_Description_:
+- `SINH(X)' computes the hyperbolic sine of X.
+-
+-_Standard_:
+- Fortran 95 and later
+-
+-_Class_:
+- Elemental function
+-
+-_Syntax_:
+- `RESULT = SINH(X)'
+-
+-_Arguments_:
+- X The type shall be `REAL'.
+-
+-_Return value_:
+- The return value is of type `REAL'.
+-
+-_Example_:
+- program test_sinh
+- real(8) :: x = - 1.0_8
+- x = sinh(x)
+- end program test_sinh
+-
+-_Specific names_:
+- Name Argument Return type Standard
+- `DSINH(X)' `REAL(8) X' `REAL(8)' Fortran 95 and
+- later
+-
+-_See also_:
+- *note ASINH::
+-
+-
+-File: gfortran.info, Node: SIZE, Next: SIZEOF, Prev: SINH, Up: Intrinsic Procedures
+-
+-7.198 `SIZE' -- Determine the size of an array
+-==============================================
+-
+-_Description_:
+- Determine the extent of ARRAY along a specified dimension DIM, or
+- the total number of elements in ARRAY if DIM is absent.
+-
+-_Standard_:
+- Fortran 95 and later, with KIND argument Fortran 2003 and later
+-
+-_Class_:
+- Inquiry function
+-
+-_Syntax_:
+- `RESULT = SIZE(ARRAY[, DIM [, KIND]])'
+-
+-_Arguments_:
+- ARRAY Shall be an array of any type. If ARRAY is a
+- pointer it must be associated and allocatable
+- arrays must be allocated.
+- DIM (Optional) shall be a scalar of type `INTEGER'
+- and its value shall be in the range from 1 to
+- n, where n equals the rank of ARRAY.
+- KIND (Optional) An `INTEGER' initialization
+- expression indicating the kind parameter of
+- the result.
+-
+-_Return value_:
+- The return value is of type `INTEGER' and of kind KIND. If KIND is
+- absent, the return value is of default integer kind.
+-
+-_Example_:
+- PROGRAM test_size
+- WRITE(*,*) SIZE((/ 1, 2 /)) ! 2
+- END PROGRAM
+-
+-_See also_:
+- *note SHAPE::, *note RESHAPE::
+-
+-
+-File: gfortran.info, Node: SIZEOF, Next: SLEEP, Prev: SIZE, Up: Intrinsic Procedures
+-
+-7.199 `SIZEOF' -- Size in bytes of an expression
+-================================================
+-
+-_Description_:
+- `SIZEOF(X)' calculates the number of bytes of storage the
+- expression `X' occupies.
+-
+-_Standard_:
+- GNU extension
+-
+-_Class_:
+- Intrinsic function
+-
+-_Syntax_:
+- `N = SIZEOF(X)'
+-
+-_Arguments_:
+- X The argument shall be of any type, rank or
+- shape.
+-
+-_Return value_:
+- The return value is of type integer and of the system-dependent
+- kind C_SIZE_T (from the ISO_C_BINDING module). Its value is the
+- number of bytes occupied by the argument. If the argument has the
+- `POINTER' attribute, the number of bytes of the storage area
+- pointed to is returned. If the argument is of a derived type with
+- `POINTER' or `ALLOCATABLE' components, the return value doesn't
+- account for the sizes of the data pointed to by these components.
+-
+-_Example_:
+- integer :: i
+- real :: r, s(5)
+- print *, (sizeof(s)/sizeof(r) == 5)
+- end
+- The example will print `.TRUE.' unless you are using a platform
+- where default `REAL' variables are unusually padded.
+-
+-_See also_:
+- *note C_SIZEOF::
+-
+-
+-File: gfortran.info, Node: SLEEP, Next: SNGL, Prev: SIZEOF, Up: Intrinsic Procedures
+-
+-7.200 `SLEEP' -- Sleep for the specified number of seconds
+-==========================================================
+-
+-_Description_:
+- Calling this subroutine causes the process to pause for SECONDS
+- seconds.
+-
+-_Standard_:
+- GNU extension
+-
+-_Class_:
+- Subroutine
+-
+-_Syntax_:
+- `CALL SLEEP(SECONDS)'
+-
+-_Arguments_:
+- SECONDS The type shall be of default `INTEGER'.
+-
+-_Example_:
+- program test_sleep
+- call sleep(5)
+- end
+-
+-
+-File: gfortran.info, Node: SNGL, Next: SPACING, Prev: SLEEP, Up: Intrinsic Procedures
+-
+-7.201 `SNGL' -- Convert double precision real to default real
+-=============================================================
+-
+-_Description_:
+- `SNGL(A)' converts the double precision real A to a default real
+- value. This is an archaic form of `REAL' that is specific to one
+- type for A.
+-
+-_Standard_:
+- Fortran 77 and later
+-
+-_Class_:
+- Elemental function
+-
+-_Syntax_:
+- `RESULT = SNGL(A)'
+-
+-_Arguments_:
+- A The type shall be a double precision `REAL'.
+-
+-_Return value_:
+- The return value is of type default `REAL'.
+-
+-_See also_:
+- *note DBLE::
+-
+-
+-File: gfortran.info, Node: SPACING, Next: SPREAD, Prev: SNGL, Up: Intrinsic Procedures
+-
+-7.202 `SPACING' -- Smallest distance between two numbers of a given type
+-========================================================================
+-
+-_Description_:
+- Determines the distance between the argument X and the nearest
+- adjacent number of the same type.
+-
+-_Standard_:
+- Fortran 95 and later
+-
+-_Class_:
+- Elemental function
+-
+-_Syntax_:
+- `RESULT = SPACING(X)'
+-
+-_Arguments_:
+- X Shall be of type `REAL'.
+-
+-_Return value_:
+- The result is of the same type as the input argument X.
+-
+-_Example_:
+- PROGRAM test_spacing
+- INTEGER, PARAMETER :: SGL = SELECTED_REAL_KIND(p=6, r=37)
+- INTEGER, PARAMETER :: DBL = SELECTED_REAL_KIND(p=13, r=200)
+-
+- WRITE(*,*) spacing(1.0_SGL) ! "1.1920929E-07" on i686
+- WRITE(*,*) spacing(1.0_DBL) ! "2.220446049250313E-016" on i686
+- END PROGRAM
+-
+-_See also_:
+- *note RRSPACING::
+-
+-
+-File: gfortran.info, Node: SPREAD, Next: SQRT, Prev: SPACING, Up: Intrinsic Procedures
+-
+-7.203 `SPREAD' -- Add a dimension to an array
+-=============================================
+-
+-_Description_:
+- Replicates a SOURCE array NCOPIES times along a specified
+- dimension DIM.
+-
+-_Standard_:
+- Fortran 95 and later
+-
+-_Class_:
+- Transformational function
+-
+-_Syntax_:
+- `RESULT = SPREAD(SOURCE, DIM, NCOPIES)'
+-
+-_Arguments_:
+- SOURCE Shall be a scalar or an array of any type and
+- a rank less than seven.
+- DIM Shall be a scalar of type `INTEGER' with a
+- value in the range from 1 to n+1, where n
+- equals the rank of SOURCE.
+- NCOPIES Shall be a scalar of type `INTEGER'.
+-
+-_Return value_:
+- The result is an array of the same type as SOURCE and has rank n+1
+- where n equals the rank of SOURCE.
+-
+-_Example_:
+- PROGRAM test_spread
+- INTEGER :: a = 1, b(2) = (/ 1, 2 /)
+- WRITE(*,*) SPREAD(A, 1, 2) ! "1 1"
+- WRITE(*,*) SPREAD(B, 1, 2) ! "1 1 2 2"
+- END PROGRAM
+-
+-_See also_:
+- *note UNPACK::
+-
+-
+-File: gfortran.info, Node: SQRT, Next: SRAND, Prev: SPREAD, Up: Intrinsic Procedures
+-
+-7.204 `SQRT' -- Square-root function
+-====================================
+-
+-_Description_:
+- `SQRT(X)' computes the square root of X.
+-
+-_Standard_:
+- Fortran 77 and later
+-
+-_Class_:
+- Elemental function
+-
+-_Syntax_:
+- `RESULT = SQRT(X)'
+-
+-_Arguments_:
+- X The type shall be `REAL' or `COMPLEX'.
+-
+-_Return value_:
+- The return value is of type `REAL' or `COMPLEX'. The kind type
+- parameter is the same as X.
+-
+-_Example_:
+- program test_sqrt
+- real(8) :: x = 2.0_8
+- complex :: z = (1.0, 2.0)
+- x = sqrt(x)
+- z = sqrt(z)
+- end program test_sqrt
+-
+-_Specific names_:
+- Name Argument Return type Standard
+- `DSQRT(X)' `REAL(8) X' `REAL(8)' Fortran 95 and
+- later
+- `CSQRT(X)' `COMPLEX(4) `COMPLEX(4)' Fortran 95 and
+- X' later
+- `ZSQRT(X)' `COMPLEX(8) `COMPLEX(8)' GNU extension
+- X'
+- `CDSQRT(X)' `COMPLEX(8) `COMPLEX(8)' GNU extension
+- X'
+-
+-
+-File: gfortran.info, Node: SRAND, Next: STAT, Prev: SQRT, Up: Intrinsic Procedures
+-
+-7.205 `SRAND' -- Reinitialize the random number generator
+-=========================================================
+-
+-_Description_:
+- `SRAND' reinitializes the pseudo-random number generator called by
+- `RAND' and `IRAND'. The new seed used by the generator is
+- specified by the required argument SEED.
+-
+-_Standard_:
+- GNU extension
+-
+-_Class_:
+- Subroutine
+-
+-_Syntax_:
+- `CALL SRAND(SEED)'
+-
+-_Arguments_:
+- SEED Shall be a scalar `INTEGER(kind=4)'.
+-
+-_Return value_:
+- Does not return anything.
+-
+-_Example_:
+- See `RAND' and `IRAND' for examples.
+-
+-_Notes_:
+- The Fortran 2003 standard specifies the intrinsic `RANDOM_SEED' to
+- initialize the pseudo-random numbers generator and `RANDOM_NUMBER'
+- to generate pseudo-random numbers. Please note that in GNU
+- Fortran, these two sets of intrinsics (`RAND', `IRAND' and `SRAND'
+- on the one hand, `RANDOM_NUMBER' and `RANDOM_SEED' on the other
+- hand) access two independent pseudo-random number generators.
+-
+-_See also_:
+- *note RAND::, *note RANDOM_SEED::, *note RANDOM_NUMBER::
+-
+-
+-
+-File: gfortran.info, Node: STAT, Next: SUM, Prev: SRAND, Up: Intrinsic Procedures
+-
+-7.206 `STAT' -- Get file status
+-===============================
+-
+-_Description_:
+- This function returns information about a file. No permissions are
+- required on the file itself, but execute (search) permission is
+- required on all of the directories in path that lead to the file.
+-
+- The elements that are obtained and stored in the array `BUFF':
+- `buff(1)' Device ID
+- `buff(2)' Inode number
+- `buff(3)' File mode
+- `buff(4)' Number of links
+- `buff(5)' Owner's uid
+- `buff(6)' Owner's gid
+- `buff(7)' ID of device containing directory entry for
+- file (0 if not available)
+- `buff(8)' File size (bytes)
+- `buff(9)' Last access time
+- `buff(10)' Last modification time
+- `buff(11)' Last file status change time
+- `buff(12)' Preferred I/O block size (-1 if not available)
+- `buff(13)' Number of blocks allocated (-1 if not
+- available)
+-
+- Not all these elements are relevant on all systems. If an element
+- is not relevant, it is returned as 0.
+-
+- This intrinsic is provided in both subroutine and function forms;
+- however, only one form can be used in any given program unit.
+-
+-_Standard_:
+- GNU extension
+-
+-_Class_:
+- Subroutine, function
+-
+-_Syntax_:
+- `CALL STAT(FILE,BUFF[,STATUS])'
+-
+-_Arguments_:
+- FILE The type shall be `CHARACTER', of the default
+- kind and a valid path within the file system.
+- BUFF The type shall be `INTEGER(4), DIMENSION(13)'.
+- STATUS (Optional) status flag of type `INTEGER(4)'.
+- Returns 0 on success and a system specific
+- error code otherwise.
+-
+-_Example_:
+- PROGRAM test_stat
+- INTEGER, DIMENSION(13) :: buff
+- INTEGER :: status
+-
+- CALL STAT("/etc/passwd", buff, status)
+-
+- IF (status == 0) THEN
+- WRITE (*, FMT="('Device ID:', T30, I19)") buff(1)
+- WRITE (*, FMT="('Inode number:', T30, I19)") buff(2)
+- WRITE (*, FMT="('File mode (octal):', T30, O19)") buff(3)
+- WRITE (*, FMT="('Number of links:', T30, I19)") buff(4)
+- WRITE (*, FMT="('Owner''s uid:', T30, I19)") buff(5)
+- WRITE (*, FMT="('Owner''s gid:', T30, I19)") buff(6)
+- WRITE (*, FMT="('Device where located:', T30, I19)") buff(7)
+- WRITE (*, FMT="('File size:', T30, I19)") buff(8)
+- WRITE (*, FMT="('Last access time:', T30, A19)") CTIME(buff(9))
+- WRITE (*, FMT="('Last modification time', T30, A19)") CTIME(buff(10))
+- WRITE (*, FMT="('Last status change time:', T30, A19)") CTIME(buff(11))
+- WRITE (*, FMT="('Preferred block size:', T30, I19)") buff(12)
+- WRITE (*, FMT="('No. of blocks allocated:', T30, I19)") buff(13)
+- END IF
+- END PROGRAM
+-
+-_See also_:
+- To stat an open file: *note FSTAT::, to stat a link: *note LSTAT::
+-
+-
+-File: gfortran.info, Node: SUM, Next: SYMLNK, Prev: STAT, Up: Intrinsic Procedures
+-
+-7.207 `SUM' -- Sum of array elements
+-====================================
+-
+-_Description_:
+- Adds the elements of ARRAY along dimension DIM if the
+- corresponding element in MASK is `TRUE'.
+-
+-_Standard_:
+- Fortran 95 and later
+-
+-_Class_:
+- Transformational function
+-
+-_Syntax_:
+- `RESULT = SUM(ARRAY[, MASK])' `RESULT = SUM(ARRAY, DIM[, MASK])'
+-
+-_Arguments_:
+- ARRAY Shall be an array of type `INTEGER', `REAL' or
+- `COMPLEX'.
+- DIM (Optional) shall be a scalar of type `INTEGER'
+- with a value in the range from 1 to n, where n
+- equals the rank of ARRAY.
+- MASK (Optional) shall be of type `LOGICAL' and
+- either be a scalar or an array of the same
+- shape as ARRAY.
+-
+-_Return value_:
+- The result is of the same type as ARRAY.
+-
+- If DIM is absent, a scalar with the sum of all elements in ARRAY
+- is returned. Otherwise, an array of rank n-1, where n equals the
+- rank of ARRAY,and a shape similar to that of ARRAY with dimension
+- DIM dropped is returned.
+-
+-_Example_:
+- PROGRAM test_sum
+- INTEGER :: x(5) = (/ 1, 2, 3, 4 ,5 /)
+- print *, SUM(x) ! all elements, sum = 15
+- print *, SUM(x, MASK=MOD(x, 2)==1) ! odd elements, sum = 9
+- END PROGRAM
+-
+-_See also_:
+- *note PRODUCT::
+-
+-
+-File: gfortran.info, Node: SYMLNK, Next: SYSTEM, Prev: SUM, Up: Intrinsic Procedures
+-
+-7.208 `SYMLNK' -- Create a symbolic link
+-========================================
+-
+-_Description_:
+- Makes a symbolic link from file PATH1 to PATH2. A null character
+- (`CHAR(0)') can be used to mark the end of the names in PATH1 and
+- PATH2; otherwise, trailing blanks in the file names are ignored.
+- If the STATUS argument is supplied, it contains 0 on success or a
+- nonzero error code upon return; see `symlink(2)'. If the system
+- does not supply `symlink(2)', `ENOSYS' is returned.
+-
+- This intrinsic is provided in both subroutine and function forms;
+- however, only one form can be used in any given program unit.
+-
+-_Standard_:
+- GNU extension
+-
+-_Class_:
+- Subroutine, function
+-
+-_Syntax_:
+- `CALL SYMLNK(PATH1, PATH2 [, STATUS])'
+- `STATUS = SYMLNK(PATH1, PATH2)'
+-
+-_Arguments_:
+- PATH1 Shall be of default `CHARACTER' type.
+- PATH2 Shall be of default `CHARACTER' type.
+- STATUS (Optional) Shall be of default `INTEGER' type.
+-
+-_See also_:
+- *note LINK::, *note UNLINK::
+-
+-
+-
+-File: gfortran.info, Node: SYSTEM, Next: SYSTEM_CLOCK, Prev: SYMLNK, Up: Intrinsic Procedures
+-
+-7.209 `SYSTEM' -- Execute a shell command
+-=========================================
+-
+-_Description_:
+- Passes the command COMMAND to a shell (see `system(3)'). If
+- argument STATUS is present, it contains the value returned by
+- `system(3)', which is presumably 0 if the shell command succeeded.
+- Note that which shell is used to invoke the command is
+- system-dependent and environment-dependent.
+-
+- This intrinsic is provided in both subroutine and function forms;
+- however, only one form can be used in any given program unit.
+-
+-_Standard_:
+- GNU extension
+-
+-_Class_:
+- Subroutine, function
+-
+-_Syntax_:
+- `CALL SYSTEM(COMMAND [, STATUS])'
+- `STATUS = SYSTEM(COMMAND)'
+-
+-_Arguments_:
+- COMMAND Shall be of default `CHARACTER' type.
+- STATUS (Optional) Shall be of default `INTEGER' type.
+-
+-_See also_:
+-
+-
+-File: gfortran.info, Node: SYSTEM_CLOCK, Next: TAN, Prev: SYSTEM, Up: Intrinsic Procedures
+-
+-7.210 `SYSTEM_CLOCK' -- Time function
+-=====================================
+-
+-_Description_:
+- Determines the COUNT of milliseconds of wall clock time since the
+- Epoch (00:00:00 UTC, January 1, 1970) modulo COUNT_MAX, COUNT_RATE
+- determines the number of clock ticks per second. COUNT_RATE and
+- COUNT_MAX are constant and specific to `gfortran'.
+-
+- If there is no clock, COUNT is set to `-HUGE(COUNT)', and
+- COUNT_RATE and COUNT_MAX are set to zero
+-
+-_Standard_:
+- Fortran 95 and later
+-
+-_Class_:
+- Subroutine
+-
+-_Syntax_:
+- `CALL SYSTEM_CLOCK([COUNT, COUNT_RATE, COUNT_MAX])'
+-
+-_Arguments_:
+-
+-_Arguments_:
+- COUNT (Optional) shall be a scalar of type default
+- `INTEGER' with `INTENT(OUT)'.
+- COUNT_RATE (Optional) shall be a scalar of type default
+- `INTEGER' with `INTENT(OUT)'.
+- COUNT_MAX (Optional) shall be a scalar of type default
+- `INTEGER' with `INTENT(OUT)'.
+-
+-_Example_:
+- PROGRAM test_system_clock
+- INTEGER :: count, count_rate, count_max
+- CALL SYSTEM_CLOCK(count, count_rate, count_max)
+- WRITE(*,*) count, count_rate, count_max
+- END PROGRAM
+-
+-_See also_:
+- *note DATE_AND_TIME::, *note CPU_TIME::
+-
+-
+-File: gfortran.info, Node: TAN, Next: TANH, Prev: SYSTEM_CLOCK, Up: Intrinsic Procedures
+-
+-7.211 `TAN' -- Tangent function
+-===============================
+-
+-_Description_:
+- `TAN(X)' computes the tangent of X.
+-
+-_Standard_:
+- Fortran 77 and later
+-
+-_Class_:
+- Elemental function
+-
+-_Syntax_:
+- `RESULT = TAN(X)'
+-
+-_Arguments_:
+- X The type shall be `REAL'.
+-
+-_Return value_:
+- The return value is of type `REAL'. The kind type parameter is
+- the same as X.
+-
+-_Example_:
+- program test_tan
+- real(8) :: x = 0.165_8
+- x = tan(x)
+- end program test_tan
+-
+-_Specific names_:
+- Name Argument Return type Standard
+- `DTAN(X)' `REAL(8) X' `REAL(8)' Fortran 95 and
+- later
+-
+-_See also_:
+- *note ATAN::
+-
+-
+-File: gfortran.info, Node: TANH, Next: TIME, Prev: TAN, Up: Intrinsic Procedures
+-
+-7.212 `TANH' -- Hyperbolic tangent function
+-===========================================
+-
+-_Description_:
+- `TANH(X)' computes the hyperbolic tangent of X.
+-
+-_Standard_:
+- Fortran 77 and later
+-
+-_Class_:
+- Elemental function
+-
+-_Syntax_:
+- `X = TANH(X)'
+-
+-_Arguments_:
+- X The type shall be `REAL'.
+-
+-_Return value_:
+- The return value is of type `REAL' and lies in the range - 1 \leq
+- tanh(x) \leq 1 .
+-
+-_Example_:
+- program test_tanh
+- real(8) :: x = 2.1_8
+- x = tanh(x)
+- end program test_tanh
+-
+-_Specific names_:
+- Name Argument Return type Standard
+- `DTANH(X)' `REAL(8) X' `REAL(8)' Fortran 95 and
+- later
+-
+-_See also_:
+- *note ATANH::
+-
+-
+-File: gfortran.info, Node: TIME, Next: TIME8, Prev: TANH, Up: Intrinsic Procedures
+-
+-7.213 `TIME' -- Time function
+-=============================
+-
+-_Description_:
+- Returns the current time encoded as an integer (in the manner of
+- the UNIX function `time(3)'). This value is suitable for passing to
+- `CTIME()', `GMTIME()', and `LTIME()'.
+-
+- This intrinsic is not fully portable, such as to systems with
+- 32-bit `INTEGER' types but supporting times wider than 32 bits.
+- Therefore, the values returned by this intrinsic might be, or
+- become, negative, or numerically less than previous values, during
+- a single run of the compiled program.
+-
+- See *note TIME8::, for information on a similar intrinsic that
+- might be portable to more GNU Fortran implementations, though to
+- fewer Fortran compilers.
+-
+-_Standard_:
+- GNU extension
+-
+-_Class_:
+- Function
+-
+-_Syntax_:
+- `RESULT = TIME()'
+-
+-_Return value_:
+- The return value is a scalar of type `INTEGER(4)'.
+-
+-_See also_:
+- *note CTIME::, *note GMTIME::, *note LTIME::, *note MCLOCK::,
+- *note TIME8::
+-
+-
+-
+-File: gfortran.info, Node: TIME8, Next: TINY, Prev: TIME, Up: Intrinsic Procedures
+-
+-7.214 `TIME8' -- Time function (64-bit)
+-=======================================
+-
+-_Description_:
+- Returns the current time encoded as an integer (in the manner of
+- the UNIX function `time(3)'). This value is suitable for passing to
+- `CTIME()', `GMTIME()', and `LTIME()'.
+-
+- _Warning:_ this intrinsic does not increase the range of the timing
+- values over that returned by `time(3)'. On a system with a 32-bit
+- `time(3)', `TIME8()' will return a 32-bit value, even though it is
+- converted to a 64-bit `INTEGER(8)' value. That means overflows of
+- the 32-bit value can still occur. Therefore, the values returned
+- by this intrinsic might be or become negative or numerically less
+- than previous values during a single run of the compiled program.
+-
+-_Standard_:
+- GNU extension
+-
+-_Class_:
+- Function
+-
+-_Syntax_:
+- `RESULT = TIME8()'
+-
+-_Return value_:
+- The return value is a scalar of type `INTEGER(8)'.
+-
+-_See also_:
+- *note CTIME::, *note GMTIME::, *note LTIME::, *note MCLOCK8::,
+- *note TIME::
+-
+-
+-
+-File: gfortran.info, Node: TINY, Next: TRAILZ, Prev: TIME8, Up: Intrinsic Procedures
+-
+-7.215 `TINY' -- Smallest positive number of a real kind
+-=======================================================
+-
+-_Description_:
+- `TINY(X)' returns the smallest positive (non zero) number in the
+- model of the type of `X'.
+-
+-_Standard_:
+- Fortran 95 and later
+-
+-_Class_:
+- Inquiry function
+-
+-_Syntax_:
+- `RESULT = TINY(X)'
+-
+-_Arguments_:
+- X Shall be of type `REAL'.
+-
+-_Return value_:
+- The return value is of the same type and kind as X
+-
+-_Example_:
+- See `HUGE' for an example.
+-
+-
+-File: gfortran.info, Node: TRAILZ, Next: TRANSFER, Prev: TINY, Up: Intrinsic Procedures
+-
+-7.216 `TRAILZ' -- Number of trailing zero bits of an integer
+-============================================================
+-
+-_Description_:
+- `TRAILZ' returns the number of trailing zero bits of an integer.
+-
+-_Standard_:
+- Fortran 2008 and later
+-
+-_Class_:
+- Elemental function
+-
+-_Syntax_:
+- `RESULT = TRAILZ(I)'
+-
+-_Arguments_:
+- I Shall be of type `INTEGER'.
+-
+-_Return value_:
+- The type of the return value is the default `INTEGER'. If all the
+- bits of `I' are zero, the result value is `BIT_SIZE(I)'.
+-
+-_Example_:
+- PROGRAM test_trailz
+- WRITE (*,*) TRAILZ(8) ! prints 3
+- END PROGRAM
+-
+-_See also_:
+- *note BIT_SIZE::, *note LEADZ::
+-
+-
+-File: gfortran.info, Node: TRANSFER, Next: TRANSPOSE, Prev: TRAILZ, Up: Intrinsic Procedures
+-
+-7.217 `TRANSFER' -- Transfer bit patterns
+-=========================================
+-
+-_Description_:
+- Interprets the bitwise representation of SOURCE in memory as if it
+- is the representation of a variable or array of the same type and
+- type parameters as MOLD.
+-
+- This is approximately equivalent to the C concept of _casting_ one
+- type to another.
+-
+-_Standard_:
+- Fortran 95 and later
+-
+-_Class_:
+- Transformational function
+-
+-_Syntax_:
+- `RESULT = TRANSFER(SOURCE, MOLD[, SIZE])'
+-
+-_Arguments_:
+- SOURCE Shall be a scalar or an array of any type.
+- MOLD Shall be a scalar or an array of any type.
+- SIZE (Optional) shall be a scalar of type `INTEGER'.
+-
+-_Return value_:
+- The result has the same type as MOLD, with the bit level
+- representation of SOURCE. If SIZE is present, the result is a
+- one-dimensional array of length SIZE. If SIZE is absent but MOLD
+- is an array (of any size or shape), the result is a one-
+- dimensional array of the minimum length needed to contain the
+- entirety of the bitwise representation of SOURCE. If SIZE is
+- absent and MOLD is a scalar, the result is a scalar.
+-
+- If the bitwise representation of the result is longer than that of
+- SOURCE, then the leading bits of the result correspond to those of
+- SOURCE and any trailing bits are filled arbitrarily.
+-
+- When the resulting bit representation does not correspond to a
+- valid representation of a variable of the same type as MOLD, the
+- results are undefined, and subsequent operations on the result
+- cannot be guaranteed to produce sensible behavior. For example,
+- it is possible to create `LOGICAL' variables for which `VAR' and
+- `.NOT.VAR' both appear to be true.
+-
+-_Example_:
+- PROGRAM test_transfer
+- integer :: x = 2143289344
+- print *, transfer(x, 1.0) ! prints "NaN" on i686
+- END PROGRAM
+-
+-
+-File: gfortran.info, Node: TRANSPOSE, Next: TRIM, Prev: TRANSFER, Up: Intrinsic Procedures
+-
+-7.218 `TRANSPOSE' -- Transpose an array of rank two
+-===================================================
+-
+-_Description_:
+- Transpose an array of rank two. Element (i, j) of the result has
+- the value `MATRIX(j, i)', for all i, j.
+-
+-_Standard_:
+- Fortran 95 and later
+-
+-_Class_:
+- Transformational function
+-
+-_Syntax_:
+- `RESULT = TRANSPOSE(MATRIX)'
+-
+-_Arguments_:
+- MATRIX Shall be an array of any type and have a rank
+- of two.
+-
+-_Return value_:
+- The result has the same type as MATRIX, and has shape `(/ m, n /)'
+- if MATRIX has shape `(/ n, m /)'.
+-
+-
+-File: gfortran.info, Node: TRIM, Next: TTYNAM, Prev: TRANSPOSE, Up: Intrinsic Procedures
+-
+-7.219 `TRIM' -- Remove trailing blank characters of a string
+-============================================================
+-
+-_Description_:
+- Removes trailing blank characters of a string.
+-
+-_Standard_:
+- Fortran 95 and later
+-
+-_Class_:
+- Transformational function
+-
+-_Syntax_:
+- `RESULT = TRIM(STRING)'
+-
+-_Arguments_:
+- STRING Shall be a scalar of type `CHARACTER'.
+-
+-_Return value_:
+- A scalar of type `CHARACTER' which length is that of STRING less
+- the number of trailing blanks.
+-
+-_Example_:
+- PROGRAM test_trim
+- CHARACTER(len=10), PARAMETER :: s = "GFORTRAN "
+- WRITE(*,*) LEN(s), LEN(TRIM(s)) ! "10 8", with/without trailing blanks
+- END PROGRAM
+-
+-_See also_:
+- *note ADJUSTL::, *note ADJUSTR::
+-
+-
+-File: gfortran.info, Node: TTYNAM, Next: UBOUND, Prev: TRIM, Up: Intrinsic Procedures
+-
+-7.220 `TTYNAM' -- Get the name of a terminal device.
+-====================================================
+-
+-_Description_:
+- Get the name of a terminal device. For more information, see
+- `ttyname(3)'.
+-
+- This intrinsic is provided in both subroutine and function forms;
+- however, only one form can be used in any given program unit.
+-
+-_Standard_:
+- GNU extension
+-
+-_Class_:
+- Subroutine, function
+-
+-_Syntax_:
+- `CALL TTYNAM(UNIT, NAME)'
+- `NAME = TTYNAM(UNIT)'
+-
+-_Arguments_:
+- UNIT Shall be a scalar `INTEGER'.
+- NAME Shall be of type `CHARACTER'.
+-
+-_Example_:
+- PROGRAM test_ttynam
+- INTEGER :: unit
+- DO unit = 1, 10
+- IF (isatty(unit=unit)) write(*,*) ttynam(unit)
+- END DO
+- END PROGRAM
+-
+-_See also_:
+- *note ISATTY::
+-
+-
+-File: gfortran.info, Node: UBOUND, Next: UMASK, Prev: TTYNAM, Up: Intrinsic Procedures
+-
+-7.221 `UBOUND' -- Upper dimension bounds of an array
+-====================================================
+-
+-_Description_:
+- Returns the upper bounds of an array, or a single upper bound
+- along the DIM dimension.
+-
+-_Standard_:
+- Fortran 95 and later, with KIND argument Fortran 2003 and later
+-
+-_Class_:
+- Inquiry function
+-
+-_Syntax_:
+- `RESULT = UBOUND(ARRAY [, DIM [, KIND]])'
+-
+-_Arguments_:
+- ARRAY Shall be an array, of any type.
+- DIM (Optional) Shall be a scalar `INTEGER'.
+- KIND (Optional) An `INTEGER' initialization
+- expression indicating the kind parameter of
+- the result.
+-
+-_Return value_:
+- The return value is of type `INTEGER' and of kind KIND. If KIND is
+- absent, the return value is of default integer kind. If DIM is
+- absent, the result is an array of the upper bounds of ARRAY. If
+- DIM is present, the result is a scalar corresponding to the upper
+- bound of the array along that dimension. If ARRAY is an
+- expression rather than a whole array or array structure component,
+- or if it has a zero extent along the relevant dimension, the upper
+- bound is taken to be the number of elements along the relevant
+- dimension.
+-
+-_See also_:
+- *note LBOUND::
+-
+-
+-File: gfortran.info, Node: UMASK, Next: UNLINK, Prev: UBOUND, Up: Intrinsic Procedures
+-
+-7.222 `UMASK' -- Set the file creation mask
+-===========================================
+-
+-_Description_:
+- Sets the file creation mask to MASK and returns the old value in
+- argument OLD if it is supplied. See `umask(2)'.
+-
+-_Standard_:
+- GNU extension
+-
+-_Class_:
+- Subroutine
+-
+-_Syntax_:
+- `CALL UMASK(MASK [, OLD])'
+-
+-_Arguments_:
+- MASK Shall be a scalar of type `INTEGER'.
+- MASK (Optional) Shall be a scalar of type `INTEGER'.
+-
+-
+-
+-File: gfortran.info, Node: UNLINK, Next: UNPACK, Prev: UMASK, Up: Intrinsic Procedures
+-
+-7.223 `UNLINK' -- Remove a file from the file system
+-====================================================
+-
+-_Description_:
+- Unlinks the file PATH. A null character (`CHAR(0)') can be used to
+- mark the end of the name in PATH; otherwise, trailing blanks in
+- the file name are ignored. If the STATUS argument is supplied, it
+- contains 0 on success or a nonzero error code upon return; see
+- `unlink(2)'.
+-
+- This intrinsic is provided in both subroutine and function forms;
+- however, only one form can be used in any given program unit.
+-
+-_Standard_:
+- GNU extension
+-
+-_Class_:
+- Subroutine, function
+-
+-_Syntax_:
+- `CALL UNLINK(PATH [, STATUS])'
+- `STATUS = UNLINK(PATH)'
+-
+-_Arguments_:
+- PATH Shall be of default `CHARACTER' type.
+- STATUS (Optional) Shall be of default `INTEGER' type.
+-
+-_See also_:
+- *note LINK::, *note SYMLNK::
+-
+-
+-File: gfortran.info, Node: UNPACK, Next: VERIFY, Prev: UNLINK, Up: Intrinsic Procedures
+-
+-7.224 `UNPACK' -- Unpack an array of rank one into an array
+-===========================================================
+-
+-_Description_:
+- Store the elements of VECTOR in an array of higher rank.
+-
+-_Standard_:
+- Fortran 95 and later
+-
+-_Class_:
+- Transformational function
+-
+-_Syntax_:
+- `RESULT = UNPACK(VECTOR, MASK, FIELD)'
+-
+-_Arguments_:
+- VECTOR Shall be an array of any type and rank one. It
+- shall have at least as many elements as MASK
+- has `TRUE' values.
+- MASK Shall be an array of type `LOGICAL'.
+- FIELD Shall be of the same type as VECTOR and have
+- the same shape as MASK.
+-
+-_Return value_:
+- The resulting array corresponds to FIELD with `TRUE' elements of
+- MASK replaced by values from VECTOR in array element order.
+-
+-_Example_:
+- PROGRAM test_unpack
+- integer :: vector(2) = (/1,1/)
+- logical :: mask(4) = (/ .TRUE., .FALSE., .FALSE., .TRUE. /)
+- integer :: field(2,2) = 0, unity(2,2)
+-
+- ! result: unity matrix
+- unity = unpack(vector, reshape(mask, (/2,2/)), field)
+- END PROGRAM
+-
+-_See also_:
+- *note PACK::, *note SPREAD::
+-
+-
+-File: gfortran.info, Node: VERIFY, Next: XOR, Prev: UNPACK, Up: Intrinsic Procedures
+-
+-7.225 `VERIFY' -- Scan a string for the absence of a set of characters
+-======================================================================
+-
+-_Description_:
+- Verifies that all the characters in a SET are present in a STRING.
+-
+- If BACK is either absent or equals `FALSE', this function returns
+- the position of the leftmost character of STRING that is not in
+- SET. If BACK equals `TRUE', the rightmost position is returned. If
+- all characters of SET are found in STRING, the result is zero.
+-
+-_Standard_:
+- Fortran 95 and later, with KIND argument Fortran 2003 and later
+-
+-_Class_:
+- Elemental function
+-
+-_Syntax_:
+- `RESULT = VERIFY(STRING, SET[, BACK [, KIND]])'
+-
+-_Arguments_:
+- STRING Shall be of type `CHARACTER'.
+- SET Shall be of type `CHARACTER'.
+- BACK (Optional) shall be of type `LOGICAL'.
+- KIND (Optional) An `INTEGER' initialization
+- expression indicating the kind parameter of
+- the result.
+-
+-_Return value_:
+- The return value is of type `INTEGER' and of kind KIND. If KIND is
+- absent, the return value is of default integer kind.
+-
+-_Example_:
+- PROGRAM test_verify
+- WRITE(*,*) VERIFY("FORTRAN", "AO") ! 1, found 'F'
+- WRITE(*,*) VERIFY("FORTRAN", "FOO") ! 3, found 'R'
+- WRITE(*,*) VERIFY("FORTRAN", "C++") ! 1, found 'F'
+- WRITE(*,*) VERIFY("FORTRAN", "C++", .TRUE.) ! 7, found 'N'
+- WRITE(*,*) VERIFY("FORTRAN", "FORTRAN") ! 0' found none
+- END PROGRAM
+-
+-_See also_:
+- *note SCAN::, *note INDEX intrinsic::
+-
+-
+-File: gfortran.info, Node: XOR, Prev: VERIFY, Up: Intrinsic Procedures
+-
+-7.226 `XOR' -- Bitwise logical exclusive OR
+-===========================================
+-
+-_Description_:
+- Bitwise logical exclusive or.
+-
+- This intrinsic routine is provided for backwards compatibility with
+- GNU Fortran 77. For integer arguments, programmers should consider
+- the use of the *note IEOR:: intrinsic defined by the Fortran
+- standard.
+-
+-_Standard_:
+- GNU extension
+-
+-_Class_:
+- Function
+-
+-_Syntax_:
+- `RESULT = XOR(X, Y)'
+-
+-_Arguments_:
+- X The type shall be either a scalar `INTEGER'
+- type or a scalar `LOGICAL' type.
+- Y The type shall be the same as the type of I.
+-
+-_Return value_:
+- The return type is either a scalar `INTEGER' or a scalar
+- `LOGICAL'. If the kind type parameters differ, then the smaller
+- kind type is implicitly converted to larger kind, and the return
+- has the larger kind.
+-
+-_Example_:
+- PROGRAM test_xor
+- LOGICAL :: T = .TRUE., F = .FALSE.
+- INTEGER :: a, b
+- DATA a / Z'F' /, b / Z'3' /
+-
+- WRITE (*,*) XOR(T, T), XOR(T, F), XOR(F, T), XOR(F, F)
+- WRITE (*,*) XOR(a, b)
+- END PROGRAM
+-
+-_See also_:
+- Fortran 95 elemental function: *note IEOR::
+-
+-
+-File: gfortran.info, Node: Intrinsic Modules, Next: Contributing, Prev: Intrinsic Procedures, Up: Top
+-
+-8 Intrinsic Modules
+-*******************
+-
+-8.1 `ISO_FORTRAN_ENV'
+-=====================
+-
+-_Standard_:
+- Fortran 2003 and later
+-
+- The `ISO_FORTRAN_ENV' module provides the following scalar
+-default-integer named constants:
+-
+-`CHARACTER_STORAGE_SIZE':
+- Size in bits of the character storage unit.
+-
+-`ERROR_UNIT':
+- Identifies the preconnected unit used for error reporting.
+-
+-`FILE_STORAGE_SIZE':
+- Size in bits of the file-storage unit.
+-
+-`INPUT_UNIT':
+- Identifies the preconnected unit identified by the asterisk (`*')
+- in `READ' statement.
+-
+-`IOSTAT_END':
+- The value assigned to the variable passed to the IOSTAT= specifier
+- of an input/output statement if an end-of-file condition occurred.
+-
+-`IOSTAT_EOR':
+- The value assigned to the variable passed to the IOSTAT= specifier
+- of an input/output statement if an end-of-record condition
+- occurred.
+-
+-`NUMERIC_STORAGE_SIZE':
+- The size in bits of the numeric storage unit.
+-
+-`OUTPUT_UNIT':
+- Identifies the preconnected unit identified by the asterisk (`*')
+- in `WRITE' statement.
+-
+-8.2 `ISO_C_BINDING'
+-===================
+-
+-_Standard_:
+- Fortran 2003 and later, GNU extensions
+-
+- The following intrinsic procedures are provided by the module; their
+-definition can be found in the section Intrinsic Procedures of this
+-manual.
+-
+-`C_ASSOCIATED'
+-
+-`C_F_POINTER'
+-
+-`C_F_PROCPOINTER'
+-
+-`C_FUNLOC'
+-
+-`C_LOC'
+-
+- The `ISO_C_BINDING' module provides the following named constants of
+-the type integer, which can be used as KIND type parameter. Note that
+-GNU Fortran currently does not support the `C_INT_FAST...' KIND type
+-parameters (marked by an asterisk (`*') in the list below). The
+-`C_INT_FAST...' parameters have therefore the value -2 and cannot be
+-used as KIND type parameter of the `INTEGER' type.
+-
+- In addition to the integer named constants required by the Fortran
+-2003 standard, GNU Fortran provides as an extension named constants for
+-the 128-bit integer types supported by the C compiler: `C_INT128_T,
+-C_INT_LEAST128_T, C_INT_FAST128_T'.
+-
+-Fortran Named constant C type Extension
+-Type
+-`INTEGER' `C_INT' `int'
+-`INTEGER' `C_SHORT' `short int'
+-`INTEGER' `C_LONG' `long int'
+-`INTEGER' `C_LONG_LONG' `long long int'
+-`INTEGER' `C_SIGNED_CHAR' `signed char'/`unsigned
+- char'
+-`INTEGER' `C_SIZE_T' `size_t'
+-`INTEGER' `C_INT8_T' `int8_t'
+-`INTEGER' `C_INT16_T' `int16_t'
+-`INTEGER' `C_INT32_T' `int32_t'
+-`INTEGER' `C_INT64_T' `int64_t'
+-`INTEGER' `C_INT128_T' `int128_t' Ext.
+-`INTEGER' `C_INT_LEAST8_T' `int_least8_t'
+-`INTEGER' `C_INT_LEAST16_T' `int_least16_t'
+-`INTEGER' `C_INT_LEAST32_T' `int_least32_t'
+-`INTEGER' `C_INT_LEAST64_T' `int_least64_t'
+-`INTEGER' `C_INT_LEAST128_T' `int_least128_t' Ext.
+-`INTEGER' `C_INT_FAST8_T'* `int_fast8_t'
+-`INTEGER' `C_INT_FAST16_T'* `int_fast16_t'
+-`INTEGER' `C_INT_FAST32_T'* `int_fast32_t'
+-`INTEGER' `C_INT_FAST64_T'* `int_fast64_t'
+-`INTEGER' `C_INT_FAST128_T'* `int_fast128_t' Ext.
+-`INTEGER' `C_INTMAX_T' `intmax_t'
+-`INTEGER' `C_INTPTR_T' `intptr_t'
+-`REAL' `C_FLOAT' `float'
+-`REAL' `C_DOUBLE' `double'
+-`REAL' `C_LONG_DOUBLE' `long double'
+-`COMPLEX' `C_FLOAT_COMPLEX' `float _Complex'
+-`COMPLEX' `C_DOUBLE_COMPLEX' `double _Complex'
+-`COMPLEX' `C_LONG_DOUBLE_COMPLEX' `long double _Complex'
+-`LOGICAL' `C_BOOL' `_Bool'
+-`CHARACTER' `C_CHAR' `char'
+-
+- Additionally, the following `(CHARACTER(KIND=C_CHAR))' are defined.
+-
+-Name C definition Value
+-`C_NULL_CHAR' null character `'\0''
+-`C_ALERT' alert `'\a''
+-`C_BACKSPACE' backspace `'\b''
+-`C_FORM_FEED' form feed `'\f''
+-`C_NEW_LINE' new line `'\n''
+-`C_CARRIAGE_RETURN'carriage return `'\r''
+-`C_HORIZONTAL_TAB'horizontal tab `'\t''
+-`C_VERTICAL_TAB'vertical tab `'\v''
+-
+-8.3 OpenMP Modules `OMP_LIB' and `OMP_LIB_KINDS'
+-================================================
+-
+-_Standard_:
+- OpenMP Application Program Interface v3.0
+-
+- The OpenMP Fortran runtime library routines are provided both in a
+-form of two Fortran 90 modules, named `OMP_LIB' and `OMP_LIB_KINDS',
+-and in a form of a Fortran `include' file named `omp_lib.h'. The
+-procedures provided by `OMP_LIB' can be found in the *note
+-Introduction: (libgomp)Top. manual, the named constants defined in the
+-`OMP_LIB_KINDS' module are listed below.
+-
+- For details refer to the actual OpenMP Application Program Interface
+-v3.0 (http://www.openmp.org/mp-documents/spec30.pdf).
+-
+- `OMP_LIB_KINDS' provides the following scalar default-integer named
+-constants:
+-
+-`omp_integer_kind'
+-
+-`omp_logical_kind'
+-
+-`omp_lock_kind'
+-
+-`omp_nest_lock_kind'
+-
+-`omp_sched_kind'
+-
+-
+-File: gfortran.info, Node: Contributing, Next: Copying, Prev: Intrinsic Modules, Up: Top
+-
+-Contributing
+-************
+-
+-Free software is only possible if people contribute to efforts to
+-create it. We're always in need of more people helping out with ideas
+-and comments, writing documentation and contributing code.
+-
+- If you want to contribute to GNU Fortran, have a look at the long
+-lists of projects you can take on. Some of these projects are small,
+-some of them are large; some are completely orthogonal to the rest of
+-what is happening on GNU Fortran, but others are "mainstream" projects
+-in need of enthusiastic hackers. All of these projects are important!
+-We'll eventually get around to the things here, but they are also
+-things doable by someone who is willing and able.
+-
+-* Menu:
+-
+-* Contributors::
+-* Projects::
+-* Proposed Extensions::
+-
+-
+-File: gfortran.info, Node: Contributors, Next: Projects, Up: Contributing
+-
+-Contributors to GNU Fortran
+-===========================
+-
+-Most of the parser was hand-crafted by _Andy Vaught_, who is also the
+-initiator of the whole project. Thanks Andy! Most of the interface
+-with GCC was written by _Paul Brook_.
+-
+- The following individuals have contributed code and/or ideas and
+-significant help to the GNU Fortran project (in alphabetical order):
+-
+- - Janne Blomqvist
+-
+- - Steven Bosscher
+-
+- - Paul Brook
+-
+- - Tobias Burnus
+-
+- - Franc,ois-Xavier Coudert
+-
+- - Bud Davis
+-
+- - Jerry DeLisle
+-
+- - Erik Edelmann
+-
+- - Bernhard Fischer
+-
+- - Daniel Franke
+-
+- - Richard Guenther
+-
+- - Richard Henderson
+-
+- - Katherine Holcomb
+-
+- - Jakub Jelinek
+-
+- - Niels Kristian Bech Jensen
+-
+- - Steven Johnson
+-
+- - Steven G. Kargl
+-
+- - Thomas Koenig
+-
+- - Asher Langton
+-
+- - H. J. Lu
+-
+- - Toon Moene
+-
+- - Brooks Moses
+-
+- - Andrew Pinski
+-
+- - Tim Prince
+-
+- - Christopher D. Rickett
+-
+- - Richard Sandiford
+-
+- - Tobias Schlu"ter
+-
+- - Roger Sayle
+-
+- - Paul Thomas
+-
+- - Andy Vaught
+-
+- - Feng Wang
+-
+- - Janus Weil
+-
+- The following people have contributed bug reports, smaller or larger
+-patches, and much needed feedback and encouragement for the GNU Fortran
+-project:
+-
+- - Bill Clodius
+-
+- - Dominique d'Humie`res
+-
+- - Kate Hedstrom
+-
+- - Erik Schnetter
+-
+- Many other individuals have helped debug, test and improve the GNU
+-Fortran compiler over the past few years, and we welcome you to do the
+-same! If you already have done so, and you would like to see your name
+-listed in the list above, please contact us.
+-
+-
+-File: gfortran.info, Node: Projects, Next: Proposed Extensions, Prev: Contributors, Up: Contributing
+-
+-Projects
+-========
+-
+-_Help build the test suite_
+- Solicit more code for donation to the test suite: the more
+- extensive the testsuite, the smaller the risk of breaking things
+- in the future! We can keep code private on request.
+-
+-_Bug hunting/squishing_
+- Find bugs and write more test cases! Test cases are especially very
+- welcome, because it allows us to concentrate on fixing bugs
+- instead of isolating them. Going through the bugzilla database at
+- `http://gcc.gnu.org/bugzilla/' to reduce testcases posted there and
+- add more information (for example, for which version does the
+- testcase work, for which versions does it fail?) is also very
+- helpful.
+-
+-
+-
+-File: gfortran.info, Node: Proposed Extensions, Prev: Projects, Up: Contributing
+-
+-Proposed Extensions
+-===================
+-
+-Here's a list of proposed extensions for the GNU Fortran compiler, in
+-no particular order. Most of these are necessary to be fully
+-compatible with existing Fortran compilers, but they are not part of
+-the official J3 Fortran 95 standard.
+-
+-Compiler extensions:
+---------------------
+-
+- * User-specified alignment rules for structures.
+-
+- * Flag to generate `Makefile' info.
+-
+- * Automatically extend single precision constants to double.
+-
+- * Compile code that conserves memory by dynamically allocating
+- common and module storage either on stack or heap.
+-
+- * Compile flag to generate code for array conformance checking
+- (suggest -CC).
+-
+- * User control of symbol names (underscores, etc).
+-
+- * Compile setting for maximum size of stack frame size before
+- spilling parts to static or heap.
+-
+- * Flag to force local variables into static space.
+-
+- * Flag to force local variables onto stack.
+-
+-Environment Options
+--------------------
+-
+- * Pluggable library modules for random numbers, linear algebra. LA
+- should use BLAS calling conventions.
+-
+- * Environment variables controlling actions on arithmetic exceptions
+- like overflow, underflow, precision loss--Generate NaN, abort,
+- default. action.
+-
+- * Set precision for fp units that support it (i387).
+-
+- * Variable for setting fp rounding mode.
+-
+- * Variable to fill uninitialized variables with a user-defined bit
+- pattern.
+-
+- * Environment variable controlling filename that is opened for that
+- unit number.
+-
+- * Environment variable to clear/trash memory being freed.
+-
+- * Environment variable to control tracing of allocations and frees.
+-
+- * Environment variable to display allocated memory at normal program
+- end.
+-
+- * Environment variable for filename for * IO-unit.
+-
+- * Environment variable for temporary file directory.
+-
+- * Environment variable forcing standard output to be line buffered
+- (unix).
+-
+-
+-
+-File: gfortran.info, Node: Copying, Next: GNU Free Documentation License, Prev: Contributing, Up: Top
+-
+-GNU General Public License
+-**************************
+-
+- Version 3, 29 June 2007
+-
+- Copyright (C) 2007 Free Software Foundation, Inc. `http://fsf.org/'
+-
+- Everyone is permitted to copy and distribute verbatim copies of this
+- license document, but changing it is not allowed.
+-
+-Preamble
+-========
+-
+-The GNU General Public License is a free, copyleft license for software
+-and other kinds of works.
+-
+- The licenses for most software and other practical works are designed
+-to take away your freedom to share and change the works. By contrast,
+-the GNU General Public License is intended to guarantee your freedom to
+-share and change all versions of a program-to make sure it remains free
+-software for all its users. We, the Free Software Foundation, use the
+-GNU General Public License for most of our software; it applies also to
+-any other work released this way by its authors. You can apply it to
+-your programs, too.
+-
+- When we speak of free software, we are referring to freedom, not
+-price. Our General Public Licenses are designed to make sure that you
+-have the freedom to distribute copies of free software (and charge for
+-them if you wish), that you receive source code or can get it if you
+-want it, that you can change the software or use pieces of it in new
+-free programs, and that you know you can do these things.
+-
+- To protect your rights, we need to prevent others from denying you
+-these rights or asking you to surrender the rights. Therefore, you
+-have certain responsibilities if you distribute copies of the software,
+-or if you modify it: responsibilities to respect the freedom of others.
+-
+- For example, if you distribute copies of such a program, whether
+-gratis or for a fee, you must pass on to the recipients the same
+-freedoms that you received. You must make sure that they, too, receive
+-or can get the source code. And you must show them these terms so they
+-know their rights.
+-
+- Developers that use the GNU GPL protect your rights with two steps:
+-(1) assert copyright on the software, and (2) offer you this License
+-giving you legal permission to copy, distribute and/or modify it.
+-
+- For the developers' and authors' protection, the GPL clearly explains
+-that there is no warranty for this free software. For both users' and
+-authors' sake, the GPL requires that modified versions be marked as
+-changed, so that their problems will not be attributed erroneously to
+-authors of previous versions.
+-
+- Some devices are designed to deny users access to install or run
+-modified versions of the software inside them, although the
+-manufacturer can do so. This is fundamentally incompatible with the
+-aim of protecting users' freedom to change the software. The
+-systematic pattern of such abuse occurs in the area of products for
+-individuals to use, which is precisely where it is most unacceptable.
+-Therefore, we have designed this version of the GPL to prohibit the
+-practice for those products. If such problems arise substantially in
+-other domains, we stand ready to extend this provision to those domains
+-in future versions of the GPL, as needed to protect the freedom of
+-users.
+-
+- Finally, every program is threatened constantly by software patents.
+-States should not allow patents to restrict development and use of
+-software on general-purpose computers, but in those that do, we wish to
+-avoid the special danger that patents applied to a free program could
+-make it effectively proprietary. To prevent this, the GPL assures that
+-patents cannot be used to render the program non-free.
+-
+- The precise terms and conditions for copying, distribution and
+-modification follow.
+-
+-TERMS AND CONDITIONS
+-====================
+-
+- 0. Definitions.
+-
+- "This License" refers to version 3 of the GNU General Public
+- License.
+-
+- "Copyright" also means copyright-like laws that apply to other
+- kinds of works, such as semiconductor masks.
+-
+- "The Program" refers to any copyrightable work licensed under this
+- License. Each licensee is addressed as "you". "Licensees" and
+- "recipients" may be individuals or organizations.
+-
+- To "modify" a work means to copy from or adapt all or part of the
+- work in a fashion requiring copyright permission, other than the
+- making of an exact copy. The resulting work is called a "modified
+- version" of the earlier work or a work "based on" the earlier work.
+-
+- A "covered work" means either the unmodified Program or a work
+- based on the Program.
+-
+- To "propagate" a work means to do anything with it that, without
+- permission, would make you directly or secondarily liable for
+- infringement under applicable copyright law, except executing it
+- on a computer or modifying a private copy. Propagation includes
+- copying, distribution (with or without modification), making
+- available to the public, and in some countries other activities as
+- well.
+-
+- To "convey" a work means any kind of propagation that enables other
+- parties to make or receive copies. Mere interaction with a user
+- through a computer network, with no transfer of a copy, is not
+- conveying.
+-
+- An interactive user interface displays "Appropriate Legal Notices"
+- to the extent that it includes a convenient and prominently visible
+- feature that (1) displays an appropriate copyright notice, and (2)
+- tells the user that there is no warranty for the work (except to
+- the extent that warranties are provided), that licensees may
+- convey the work under this License, and how to view a copy of this
+- License. If the interface presents a list of user commands or
+- options, such as a menu, a prominent item in the list meets this
+- criterion.
+-
+- 1. Source Code.
+-
+- The "source code" for a work means the preferred form of the work
+- for making modifications to it. "Object code" means any
+- non-source form of a work.
+-
+- A "Standard Interface" means an interface that either is an
+- official standard defined by a recognized standards body, or, in
+- the case of interfaces specified for a particular programming
+- language, one that is widely used among developers working in that
+- language.
+-
+- The "System Libraries" of an executable work include anything,
+- other than the work as a whole, that (a) is included in the normal
+- form of packaging a Major Component, but which is not part of that
+- Major Component, and (b) serves only to enable use of the work
+- with that Major Component, or to implement a Standard Interface
+- for which an implementation is available to the public in source
+- code form. A "Major Component", in this context, means a major
+- essential component (kernel, window system, and so on) of the
+- specific operating system (if any) on which the executable work
+- runs, or a compiler used to produce the work, or an object code
+- interpreter used to run it.
+-
+- The "Corresponding Source" for a work in object code form means all
+- the source code needed to generate, install, and (for an executable
+- work) run the object code and to modify the work, including
+- scripts to control those activities. However, it does not include
+- the work's System Libraries, or general-purpose tools or generally
+- available free programs which are used unmodified in performing
+- those activities but which are not part of the work. For example,
+- Corresponding Source includes interface definition files
+- associated with source files for the work, and the source code for
+- shared libraries and dynamically linked subprograms that the work
+- is specifically designed to require, such as by intimate data
+- communication or control flow between those subprograms and other
+- parts of the work.
+-
+- The Corresponding Source need not include anything that users can
+- regenerate automatically from other parts of the Corresponding
+- Source.
+-
+- The Corresponding Source for a work in source code form is that
+- same work.
+-
+- 2. Basic Permissions.
+-
+- All rights granted under this License are granted for the term of
+- copyright on the Program, and are irrevocable provided the stated
+- conditions are met. This License explicitly affirms your unlimited
+- permission to run the unmodified Program. The output from running
+- a covered work is covered by this License only if the output,
+- given its content, constitutes a covered work. This License
+- acknowledges your rights of fair use or other equivalent, as
+- provided by copyright law.
+-
+- You may make, run and propagate covered works that you do not
+- convey, without conditions so long as your license otherwise
+- remains in force. You may convey covered works to others for the
+- sole purpose of having them make modifications exclusively for
+- you, or provide you with facilities for running those works,
+- provided that you comply with the terms of this License in
+- conveying all material for which you do not control copyright.
+- Those thus making or running the covered works for you must do so
+- exclusively on your behalf, under your direction and control, on
+- terms that prohibit them from making any copies of your
+- copyrighted material outside their relationship with you.
+-
+- Conveying under any other circumstances is permitted solely under
+- the conditions stated below. Sublicensing is not allowed; section
+- 10 makes it unnecessary.
+-
+- 3. Protecting Users' Legal Rights From Anti-Circumvention Law.
+-
+- No covered work shall be deemed part of an effective technological
+- measure under any applicable law fulfilling obligations under
+- article 11 of the WIPO copyright treaty adopted on 20 December
+- 1996, or similar laws prohibiting or restricting circumvention of
+- such measures.
+-
+- When you convey a covered work, you waive any legal power to forbid
+- circumvention of technological measures to the extent such
+- circumvention is effected by exercising rights under this License
+- with respect to the covered work, and you disclaim any intention
+- to limit operation or modification of the work as a means of
+- enforcing, against the work's users, your or third parties' legal
+- rights to forbid circumvention of technological measures.
+-
+- 4. Conveying Verbatim Copies.
+-
+- You may convey verbatim copies of the Program's source code as you
+- receive it, in any medium, provided that you conspicuously and
+- appropriately publish on each copy an appropriate copyright notice;
+- keep intact all notices stating that this License and any
+- non-permissive terms added in accord with section 7 apply to the
+- code; keep intact all notices of the absence of any warranty; and
+- give all recipients a copy of this License along with the Program.
+-
+- You may charge any price or no price for each copy that you convey,
+- and you may offer support or warranty protection for a fee.
+-
+- 5. Conveying Modified Source Versions.
+-
+- You may convey a work based on the Program, or the modifications to
+- produce it from the Program, in the form of source code under the
+- terms of section 4, provided that you also meet all of these
+- conditions:
+-
+- a. The work must carry prominent notices stating that you
+- modified it, and giving a relevant date.
+-
+- b. The work must carry prominent notices stating that it is
+- released under this License and any conditions added under
+- section 7. This requirement modifies the requirement in
+- section 4 to "keep intact all notices".
+-
+- c. You must license the entire work, as a whole, under this
+- License to anyone who comes into possession of a copy. This
+- License will therefore apply, along with any applicable
+- section 7 additional terms, to the whole of the work, and all
+- its parts, regardless of how they are packaged. This License
+- gives no permission to license the work in any other way, but
+- it does not invalidate such permission if you have separately
+- received it.
+-
+- d. If the work has interactive user interfaces, each must display
+- Appropriate Legal Notices; however, if the Program has
+- interactive interfaces that do not display Appropriate Legal
+- Notices, your work need not make them do so.
+-
+- A compilation of a covered work with other separate and independent
+- works, which are not by their nature extensions of the covered
+- work, and which are not combined with it such as to form a larger
+- program, in or on a volume of a storage or distribution medium, is
+- called an "aggregate" if the compilation and its resulting
+- copyright are not used to limit the access or legal rights of the
+- compilation's users beyond what the individual works permit.
+- Inclusion of a covered work in an aggregate does not cause this
+- License to apply to the other parts of the aggregate.
+-
+- 6. Conveying Non-Source Forms.
+-
+- You may convey a covered work in object code form under the terms
+- of sections 4 and 5, provided that you also convey the
+- machine-readable Corresponding Source under the terms of this
+- License, in one of these ways:
+-
+- a. Convey the object code in, or embodied in, a physical product
+- (including a physical distribution medium), accompanied by the
+- Corresponding Source fixed on a durable physical medium
+- customarily used for software interchange.
+-
+- b. Convey the object code in, or embodied in, a physical product
+- (including a physical distribution medium), accompanied by a
+- written offer, valid for at least three years and valid for
+- as long as you offer spare parts or customer support for that
+- product model, to give anyone who possesses the object code
+- either (1) a copy of the Corresponding Source for all the
+- software in the product that is covered by this License, on a
+- durable physical medium customarily used for software
+- interchange, for a price no more than your reasonable cost of
+- physically performing this conveying of source, or (2) access
+- to copy the Corresponding Source from a network server at no
+- charge.
+-
+- c. Convey individual copies of the object code with a copy of
+- the written offer to provide the Corresponding Source. This
+- alternative is allowed only occasionally and noncommercially,
+- and only if you received the object code with such an offer,
+- in accord with subsection 6b.
+-
+- d. Convey the object code by offering access from a designated
+- place (gratis or for a charge), and offer equivalent access
+- to the Corresponding Source in the same way through the same
+- place at no further charge. You need not require recipients
+- to copy the Corresponding Source along with the object code.
+- If the place to copy the object code is a network server, the
+- Corresponding Source may be on a different server (operated
+- by you or a third party) that supports equivalent copying
+- facilities, provided you maintain clear directions next to
+- the object code saying where to find the Corresponding Source.
+- Regardless of what server hosts the Corresponding Source, you
+- remain obligated to ensure that it is available for as long
+- as needed to satisfy these requirements.
+-
+- e. Convey the object code using peer-to-peer transmission,
+- provided you inform other peers where the object code and
+- Corresponding Source of the work are being offered to the
+- general public at no charge under subsection 6d.
+-
+-
+- A separable portion of the object code, whose source code is
+- excluded from the Corresponding Source as a System Library, need
+- not be included in conveying the object code work.
+-
+- A "User Product" is either (1) a "consumer product", which means
+- any tangible personal property which is normally used for personal,
+- family, or household purposes, or (2) anything designed or sold for
+- incorporation into a dwelling. In determining whether a product
+- is a consumer product, doubtful cases shall be resolved in favor of
+- coverage. For a particular product received by a particular user,
+- "normally used" refers to a typical or common use of that class of
+- product, regardless of the status of the particular user or of the
+- way in which the particular user actually uses, or expects or is
+- expected to use, the product. A product is a consumer product
+- regardless of whether the product has substantial commercial,
+- industrial or non-consumer uses, unless such uses represent the
+- only significant mode of use of the product.
+-
+- "Installation Information" for a User Product means any methods,
+- procedures, authorization keys, or other information required to
+- install and execute modified versions of a covered work in that
+- User Product from a modified version of its Corresponding Source.
+- The information must suffice to ensure that the continued
+- functioning of the modified object code is in no case prevented or
+- interfered with solely because modification has been made.
+-
+- If you convey an object code work under this section in, or with,
+- or specifically for use in, a User Product, and the conveying
+- occurs as part of a transaction in which the right of possession
+- and use of the User Product is transferred to the recipient in
+- perpetuity or for a fixed term (regardless of how the transaction
+- is characterized), the Corresponding Source conveyed under this
+- section must be accompanied by the Installation Information. But
+- this requirement does not apply if neither you nor any third party
+- retains the ability to install modified object code on the User
+- Product (for example, the work has been installed in ROM).
+-
+- The requirement to provide Installation Information does not
+- include a requirement to continue to provide support service,
+- warranty, or updates for a work that has been modified or
+- installed by the recipient, or for the User Product in which it
+- has been modified or installed. Access to a network may be denied
+- when the modification itself materially and adversely affects the
+- operation of the network or violates the rules and protocols for
+- communication across the network.
+-
+- Corresponding Source conveyed, and Installation Information
+- provided, in accord with this section must be in a format that is
+- publicly documented (and with an implementation available to the
+- public in source code form), and must require no special password
+- or key for unpacking, reading or copying.
+-
+- 7. Additional Terms.
+-
+- "Additional permissions" are terms that supplement the terms of
+- this License by making exceptions from one or more of its
+- conditions. Additional permissions that are applicable to the
+- entire Program shall be treated as though they were included in
+- this License, to the extent that they are valid under applicable
+- law. If additional permissions apply only to part of the Program,
+- that part may be used separately under those permissions, but the
+- entire Program remains governed by this License without regard to
+- the additional permissions.
+-
+- When you convey a copy of a covered work, you may at your option
+- remove any additional permissions from that copy, or from any part
+- of it. (Additional permissions may be written to require their own
+- removal in certain cases when you modify the work.) You may place
+- additional permissions on material, added by you to a covered work,
+- for which you have or can give appropriate copyright permission.
+-
+- Notwithstanding any other provision of this License, for material
+- you add to a covered work, you may (if authorized by the copyright
+- holders of that material) supplement the terms of this License
+- with terms:
+-
+- a. Disclaiming warranty or limiting liability differently from
+- the terms of sections 15 and 16 of this License; or
+-
+- b. Requiring preservation of specified reasonable legal notices
+- or author attributions in that material or in the Appropriate
+- Legal Notices displayed by works containing it; or
+-
+- c. Prohibiting misrepresentation of the origin of that material,
+- or requiring that modified versions of such material be
+- marked in reasonable ways as different from the original
+- version; or
+-
+- d. Limiting the use for publicity purposes of names of licensors
+- or authors of the material; or
+-
+- e. Declining to grant rights under trademark law for use of some
+- trade names, trademarks, or service marks; or
+-
+- f. Requiring indemnification of licensors and authors of that
+- material by anyone who conveys the material (or modified
+- versions of it) with contractual assumptions of liability to
+- the recipient, for any liability that these contractual
+- assumptions directly impose on those licensors and authors.
+-
+- All other non-permissive additional terms are considered "further
+- restrictions" within the meaning of section 10. If the Program as
+- you received it, or any part of it, contains a notice stating that
+- it is governed by this License along with a term that is a further
+- restriction, you may remove that term. If a license document
+- contains a further restriction but permits relicensing or
+- conveying under this License, you may add to a covered work
+- material governed by the terms of that license document, provided
+- that the further restriction does not survive such relicensing or
+- conveying.
+-
+- If you add terms to a covered work in accord with this section, you
+- must place, in the relevant source files, a statement of the
+- additional terms that apply to those files, or a notice indicating
+- where to find the applicable terms.
+-
+- Additional terms, permissive or non-permissive, may be stated in
+- the form of a separately written license, or stated as exceptions;
+- the above requirements apply either way.
+-
+- 8. Termination.
+-
+- You may not propagate or modify a covered work except as expressly
+- provided under this License. Any attempt otherwise to propagate or
+- modify it is void, and will automatically terminate your rights
+- under this License (including any patent licenses granted under
+- the third paragraph of section 11).
+-
+- However, if you cease all violation of this License, then your
+- license from a particular copyright holder is reinstated (a)
+- provisionally, unless and until the copyright holder explicitly
+- and finally terminates your license, and (b) permanently, if the
+- copyright holder fails to notify you of the violation by some
+- reasonable means prior to 60 days after the cessation.
+-
+- Moreover, your license from a particular copyright holder is
+- reinstated permanently if the copyright holder notifies you of the
+- violation by some reasonable means, this is the first time you have
+- received notice of violation of this License (for any work) from
+- that copyright holder, and you cure the violation prior to 30 days
+- after your receipt of the notice.
+-
+- Termination of your rights under this section does not terminate
+- the licenses of parties who have received copies or rights from
+- you under this License. If your rights have been terminated and
+- not permanently reinstated, you do not qualify to receive new
+- licenses for the same material under section 10.
+-
+- 9. Acceptance Not Required for Having Copies.
+-
+- You are not required to accept this License in order to receive or
+- run a copy of the Program. Ancillary propagation of a covered work
+- occurring solely as a consequence of using peer-to-peer
+- transmission to receive a copy likewise does not require
+- acceptance. However, nothing other than this License grants you
+- permission to propagate or modify any covered work. These actions
+- infringe copyright if you do not accept this License. Therefore,
+- by modifying or propagating a covered work, you indicate your
+- acceptance of this License to do so.
+-
+- 10. Automatic Licensing of Downstream Recipients.
+-
+- Each time you convey a covered work, the recipient automatically
+- receives a license from the original licensors, to run, modify and
+- propagate that work, subject to this License. You are not
+- responsible for enforcing compliance by third parties with this
+- License.
+-
+- An "entity transaction" is a transaction transferring control of an
+- organization, or substantially all assets of one, or subdividing an
+- organization, or merging organizations. If propagation of a
+- covered work results from an entity transaction, each party to that
+- transaction who receives a copy of the work also receives whatever
+- licenses to the work the party's predecessor in interest had or
+- could give under the previous paragraph, plus a right to
+- possession of the Corresponding Source of the work from the
+- predecessor in interest, if the predecessor has it or can get it
+- with reasonable efforts.
+-
+- You may not impose any further restrictions on the exercise of the
+- rights granted or affirmed under this License. For example, you
+- may not impose a license fee, royalty, or other charge for
+- exercise of rights granted under this License, and you may not
+- initiate litigation (including a cross-claim or counterclaim in a
+- lawsuit) alleging that any patent claim is infringed by making,
+- using, selling, offering for sale, or importing the Program or any
+- portion of it.
+-
+- 11. Patents.
+-
+- A "contributor" is a copyright holder who authorizes use under this
+- License of the Program or a work on which the Program is based.
+- The work thus licensed is called the contributor's "contributor
+- version".
+-
+- A contributor's "essential patent claims" are all patent claims
+- owned or controlled by the contributor, whether already acquired or
+- hereafter acquired, that would be infringed by some manner,
+- permitted by this License, of making, using, or selling its
+- contributor version, but do not include claims that would be
+- infringed only as a consequence of further modification of the
+- contributor version. For purposes of this definition, "control"
+- includes the right to grant patent sublicenses in a manner
+- consistent with the requirements of this License.
+-
+- Each contributor grants you a non-exclusive, worldwide,
+- royalty-free patent license under the contributor's essential
+- patent claims, to make, use, sell, offer for sale, import and
+- otherwise run, modify and propagate the contents of its
+- contributor version.
+-
+- In the following three paragraphs, a "patent license" is any
+- express agreement or commitment, however denominated, not to
+- enforce a patent (such as an express permission to practice a
+- patent or covenant not to sue for patent infringement). To
+- "grant" such a patent license to a party means to make such an
+- agreement or commitment not to enforce a patent against the party.
+-
+- If you convey a covered work, knowingly relying on a patent
+- license, and the Corresponding Source of the work is not available
+- for anyone to copy, free of charge and under the terms of this
+- License, through a publicly available network server or other
+- readily accessible means, then you must either (1) cause the
+- Corresponding Source to be so available, or (2) arrange to deprive
+- yourself of the benefit of the patent license for this particular
+- work, or (3) arrange, in a manner consistent with the requirements
+- of this License, to extend the patent license to downstream
+- recipients. "Knowingly relying" means you have actual knowledge
+- that, but for the patent license, your conveying the covered work
+- in a country, or your recipient's use of the covered work in a
+- country, would infringe one or more identifiable patents in that
+- country that you have reason to believe are valid.
+-
+- If, pursuant to or in connection with a single transaction or
+- arrangement, you convey, or propagate by procuring conveyance of, a
+- covered work, and grant a patent license to some of the parties
+- receiving the covered work authorizing them to use, propagate,
+- modify or convey a specific copy of the covered work, then the
+- patent license you grant is automatically extended to all
+- recipients of the covered work and works based on it.
+-
+- A patent license is "discriminatory" if it does not include within
+- the scope of its coverage, prohibits the exercise of, or is
+- conditioned on the non-exercise of one or more of the rights that
+- are specifically granted under this License. You may not convey a
+- covered work if you are a party to an arrangement with a third
+- party that is in the business of distributing software, under
+- which you make payment to the third party based on the extent of
+- your activity of conveying the work, and under which the third
+- party grants, to any of the parties who would receive the covered
+- work from you, a discriminatory patent license (a) in connection
+- with copies of the covered work conveyed by you (or copies made
+- from those copies), or (b) primarily for and in connection with
+- specific products or compilations that contain the covered work,
+- unless you entered into that arrangement, or that patent license
+- was granted, prior to 28 March 2007.
+-
+- Nothing in this License shall be construed as excluding or limiting
+- any implied license or other defenses to infringement that may
+- otherwise be available to you under applicable patent law.
+-
+- 12. No Surrender of Others' Freedom.
+-
+- If conditions are imposed on you (whether by court order,
+- agreement or otherwise) that contradict the conditions of this
+- License, they do not excuse you from the conditions of this
+- License. If you cannot convey a covered work so as to satisfy
+- simultaneously your obligations under this License and any other
+- pertinent obligations, then as a consequence you may not convey it
+- at all. For example, if you agree to terms that obligate you to
+- collect a royalty for further conveying from those to whom you
+- convey the Program, the only way you could satisfy both those
+- terms and this License would be to refrain entirely from conveying
+- the Program.
+-
+- 13. Use with the GNU Affero General Public License.
+-
+- Notwithstanding any other provision of this License, you have
+- permission to link or combine any covered work with a work licensed
+- under version 3 of the GNU Affero General Public License into a
+- single combined work, and to convey the resulting work. The terms
+- of this License will continue to apply to the part which is the
+- covered work, but the special requirements of the GNU Affero
+- General Public License, section 13, concerning interaction through
+- a network will apply to the combination as such.
+-
+- 14. Revised Versions of this License.
+-
+- The Free Software Foundation may publish revised and/or new
+- versions of the GNU General Public License from time to time.
+- Such new versions will be similar in spirit to the present
+- version, but may differ in detail to address new problems or
+- concerns.
+-
+- Each version is given a distinguishing version number. If the
+- Program specifies that a certain numbered version of the GNU
+- General Public License "or any later version" applies to it, you
+- have the option of following the terms and conditions either of
+- that numbered version or of any later version published by the
+- Free Software Foundation. If the Program does not specify a
+- version number of the GNU General Public License, you may choose
+- any version ever published by the Free Software Foundation.
+-
+- If the Program specifies that a proxy can decide which future
+- versions of the GNU General Public License can be used, that
+- proxy's public statement of acceptance of a version permanently
+- authorizes you to choose that version for the Program.
+-
+- Later license versions may give you additional or different
+- permissions. However, no additional obligations are imposed on any
+- author or copyright holder as a result of your choosing to follow a
+- later version.
+-
+- 15. Disclaimer of Warranty.
+-
+- THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
+- APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE
+- COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS"
+- WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED,
+- INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+- MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE
+- RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU.
+- SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL
+- NECESSARY SERVICING, REPAIR OR CORRECTION.
+-
+- 16. Limitation of Liability.
+-
+- IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
+- WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES
+- AND/OR CONVEYS THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU
+- FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR
+- CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE
+- THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA
+- BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
+- PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
+- PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF
+- THE POSSIBILITY OF SUCH DAMAGES.
+-
+- 17. Interpretation of Sections 15 and 16.
+-
+- If the disclaimer of warranty and limitation of liability provided
+- above cannot be given local legal effect according to their terms,
+- reviewing courts shall apply local law that most closely
+- approximates an absolute waiver of all civil liability in
+- connection with the Program, unless a warranty or assumption of
+- liability accompanies a copy of the Program in return for a fee.
+-
+-
+-END OF TERMS AND CONDITIONS
+-===========================
+-
+-How to Apply These Terms to Your New Programs
+-=============================================
+-
+-If you develop a new program, and you want it to be of the greatest
+-possible use to the public, the best way to achieve this is to make it
+-free software which everyone can redistribute and change under these
+-terms.
+-
+- To do so, attach the following notices to the program. It is safest
+-to attach them to the start of each source file to most effectively
+-state the exclusion of warranty; and each file should have at least the
+-"copyright" line and a pointer to where the full notice is found.
+-
+- ONE LINE TO GIVE THE PROGRAM'S NAME AND A BRIEF IDEA OF WHAT IT DOES.
+- Copyright (C) YEAR NAME OF AUTHOR
+-
+- 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 this program. If not, see `http://www.gnu.org/licenses/'.
+-
+- Also add information on how to contact you by electronic and paper
+-mail.
+-
+- If the program does terminal interaction, make it output a short
+-notice like this when it starts in an interactive mode:
+-
+- PROGRAM Copyright (C) YEAR NAME OF AUTHOR
+- This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+- This is free software, and you are welcome to redistribute it
+- under certain conditions; type `show c' for details.
+-
+- The hypothetical commands `show w' and `show c' should show the
+-appropriate parts of the General Public License. Of course, your
+-program's commands might be different; for a GUI interface, you would
+-use an "about box".
+-
+- You should also get your employer (if you work as a programmer) or
+-school, if any, to sign a "copyright disclaimer" for the program, if
+-necessary. For more information on this, and how to apply and follow
+-the GNU GPL, see `http://www.gnu.org/licenses/'.
+-
+- The GNU General Public License does not permit incorporating your
+-program into proprietary programs. If your program is a subroutine
+-library, you may consider it more useful to permit linking proprietary
+-applications with the library. If this is what you want to do, use the
+-GNU Lesser General Public License instead of this License. But first,
+-please read `http://www.gnu.org/philosophy/why-not-lgpl.html'.
+-
+-
+-File: gfortran.info, Node: GNU Free Documentation License, Next: Funding, Prev: Copying, Up: Top
+-
+-GNU Free Documentation License
+-******************************
+-
+- Version 1.2, November 2002
+-
+- Copyright (C) 2000,2001,2002 Free Software Foundation, Inc.
+- 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+-
+- Everyone is permitted to copy and distribute verbatim copies
+- of this license document, but changing it is not allowed.
+-
+- 0. PREAMBLE
+-
+- The purpose of this License is to make a manual, textbook, or other
+- functional and useful document "free" in the sense of freedom: to
+- assure everyone the effective freedom to copy and redistribute it,
+- with or without modifying it, either commercially or
+- noncommercially. Secondarily, this License preserves for the
+- author and publisher a way to get credit for their work, while not
+- being considered responsible for modifications made by others.
+-
+- This License is a kind of "copyleft", which means that derivative
+- works of the document must themselves be free in the same sense.
+- It complements the GNU General Public License, which is a copyleft
+- license designed for free software.
+-
+- We have designed this License in order to use it for manuals for
+- free software, because free software needs free documentation: a
+- free program should come with manuals providing the same freedoms
+- that the software does. But this License is not limited to
+- software manuals; it can be used for any textual work, regardless
+- of subject matter or whether it is published as a printed book.
+- We recommend this License principally for works whose purpose is
+- instruction or reference.
+-
+- 1. APPLICABILITY AND DEFINITIONS
+-
+- This License applies to any manual or other work, in any medium,
+- that contains a notice placed by the copyright holder saying it
+- can be distributed under the terms of this License. Such a notice
+- grants a world-wide, royalty-free license, unlimited in duration,
+- to use that work under the conditions stated herein. The
+- "Document", below, refers to any such manual or work. Any member
+- of the public is a licensee, and is addressed as "you". You
+- accept the license if you copy, modify or distribute the work in a
+- way requiring permission under copyright law.
+-
+- A "Modified Version" of the Document means any work containing the
+- Document or a portion of it, either copied verbatim, or with
+- modifications and/or translated into another language.
+-
+- A "Secondary Section" is a named appendix or a front-matter section
+- of the Document that deals exclusively with the relationship of the
+- publishers or authors of the Document to the Document's overall
+- subject (or to related matters) and contains nothing that could
+- fall directly within that overall subject. (Thus, if the Document
+- is in part a textbook of mathematics, a Secondary Section may not
+- explain any mathematics.) The relationship could be a matter of
+- historical connection with the subject or with related matters, or
+- of legal, commercial, philosophical, ethical or political position
+- regarding them.
+-
+- The "Invariant Sections" are certain Secondary Sections whose
+- titles are designated, as being those of Invariant Sections, in
+- the notice that says that the Document is released under this
+- License. If a section does not fit the above definition of
+- Secondary then it is not allowed to be designated as Invariant.
+- The Document may contain zero Invariant Sections. If the Document
+- does not identify any Invariant Sections then there are none.
+-
+- The "Cover Texts" are certain short passages of text that are
+- listed, as Front-Cover Texts or Back-Cover Texts, in the notice
+- that says that the Document is released under this License. A
+- Front-Cover Text may be at most 5 words, and a Back-Cover Text may
+- be at most 25 words.
+-
+- A "Transparent" copy of the Document means a machine-readable copy,
+- represented in a format whose specification is available to the
+- general public, that is suitable for revising the document
+- straightforwardly with generic text editors or (for images
+- composed of pixels) generic paint programs or (for drawings) some
+- widely available drawing editor, and that is suitable for input to
+- text formatters or for automatic translation to a variety of
+- formats suitable for input to text formatters. A copy made in an
+- otherwise Transparent file format whose markup, or absence of
+- markup, has been arranged to thwart or discourage subsequent
+- modification by readers is not Transparent. An image format is
+- not Transparent if used for any substantial amount of text. A
+- copy that is not "Transparent" is called "Opaque".
+-
+- Examples of suitable formats for Transparent copies include plain
+- ASCII without markup, Texinfo input format, LaTeX input format,
+- SGML or XML using a publicly available DTD, and
+- standard-conforming simple HTML, PostScript or PDF designed for
+- human modification. Examples of transparent image formats include
+- PNG, XCF and JPG. Opaque formats include proprietary formats that
+- can be read and edited only by proprietary word processors, SGML or
+- XML for which the DTD and/or processing tools are not generally
+- available, and the machine-generated HTML, PostScript or PDF
+- produced by some word processors for output purposes only.
+-
+- The "Title Page" means, for a printed book, the title page itself,
+- plus such following pages as are needed to hold, legibly, the
+- material this License requires to appear in the title page. For
+- works in formats which do not have any title page as such, "Title
+- Page" means the text near the most prominent appearance of the
+- work's title, preceding the beginning of the body of the text.
+-
+- A section "Entitled XYZ" means a named subunit of the Document
+- whose title either is precisely XYZ or contains XYZ in parentheses
+- following text that translates XYZ in another language. (Here XYZ
+- stands for a specific section name mentioned below, such as
+- "Acknowledgements", "Dedications", "Endorsements", or "History".)
+- To "Preserve the Title" of such a section when you modify the
+- Document means that it remains a section "Entitled XYZ" according
+- to this definition.
+-
+- The Document may include Warranty Disclaimers next to the notice
+- which states that this License applies to the Document. These
+- Warranty Disclaimers are considered to be included by reference in
+- this License, but only as regards disclaiming warranties: any other
+- implication that these Warranty Disclaimers may have is void and
+- has no effect on the meaning of this License.
+-
+- 2. VERBATIM COPYING
+-
+- You may copy and distribute the Document in any medium, either
+- commercially or noncommercially, provided that this License, the
+- copyright notices, and the license notice saying this License
+- applies to the Document are reproduced in all copies, and that you
+- add no other conditions whatsoever to those of this License. You
+- may not use technical measures to obstruct or control the reading
+- or further copying of the copies you make or distribute. However,
+- you may accept compensation in exchange for copies. If you
+- distribute a large enough number of copies you must also follow
+- the conditions in section 3.
+-
+- You may also lend copies, under the same conditions stated above,
+- and you may publicly display copies.
+-
+- 3. COPYING IN QUANTITY
+-
+- If you publish printed copies (or copies in media that commonly
+- have printed covers) of the Document, numbering more than 100, and
+- the Document's license notice requires Cover Texts, you must
+- enclose the copies in covers that carry, clearly and legibly, all
+- these Cover Texts: Front-Cover Texts on the front cover, and
+- Back-Cover Texts on the back cover. Both covers must also clearly
+- and legibly identify you as the publisher of these copies. The
+- front cover must present the full title with all words of the
+- title equally prominent and visible. You may add other material
+- on the covers in addition. Copying with changes limited to the
+- covers, as long as they preserve the title of the Document and
+- satisfy these conditions, can be treated as verbatim copying in
+- other respects.
+-
+- If the required texts for either cover are too voluminous to fit
+- legibly, you should put the first ones listed (as many as fit
+- reasonably) on the actual cover, and continue the rest onto
+- adjacent pages.
+-
+- If you publish or distribute Opaque copies of the Document
+- numbering more than 100, you must either include a
+- machine-readable Transparent copy along with each Opaque copy, or
+- state in or with each Opaque copy a computer-network location from
+- which the general network-using public has access to download
+- using public-standard network protocols a complete Transparent
+- copy of the Document, free of added material. If you use the
+- latter option, you must take reasonably prudent steps, when you
+- begin distribution of Opaque copies in quantity, to ensure that
+- this Transparent copy will remain thus accessible at the stated
+- location until at least one year after the last time you
+- distribute an Opaque copy (directly or through your agents or
+- retailers) of that edition to the public.
+-
+- It is requested, but not required, that you contact the authors of
+- the Document well before redistributing any large number of
+- copies, to give them a chance to provide you with an updated
+- version of the Document.
+-
+- 4. MODIFICATIONS
+-
+- You may copy and distribute a Modified Version of the Document
+- under the conditions of sections 2 and 3 above, provided that you
+- release the Modified Version under precisely this License, with
+- the Modified Version filling the role of the Document, thus
+- licensing distribution and modification of the Modified Version to
+- whoever possesses a copy of it. In addition, you must do these
+- things in the Modified Version:
+-
+- A. Use in the Title Page (and on the covers, if any) a title
+- distinct from that of the Document, and from those of
+- previous versions (which should, if there were any, be listed
+- in the History section of the Document). You may use the
+- same title as a previous version if the original publisher of
+- that version gives permission.
+-
+- B. List on the Title Page, as authors, one or more persons or
+- entities responsible for authorship of the modifications in
+- the Modified Version, together with at least five of the
+- principal authors of the Document (all of its principal
+- authors, if it has fewer than five), unless they release you
+- from this requirement.
+-
+- C. State on the Title page the name of the publisher of the
+- Modified Version, as the publisher.
+-
+- D. Preserve all the copyright notices of the Document.
+-
+- E. Add an appropriate copyright notice for your modifications
+- adjacent to the other copyright notices.
+-
+- F. Include, immediately after the copyright notices, a license
+- notice giving the public permission to use the Modified
+- Version under the terms of this License, in the form shown in
+- the Addendum below.
+-
+- G. Preserve in that license notice the full lists of Invariant
+- Sections and required Cover Texts given in the Document's
+- license notice.
+-
+- H. Include an unaltered copy of this License.
+-
+- I. Preserve the section Entitled "History", Preserve its Title,
+- and add to it an item stating at least the title, year, new
+- authors, and publisher of the Modified Version as given on
+- the Title Page. If there is no section Entitled "History" in
+- the Document, create one stating the title, year, authors,
+- and publisher of the Document as given on its Title Page,
+- then add an item describing the Modified Version as stated in
+- the previous sentence.
+-
+- J. Preserve the network location, if any, given in the Document
+- for public access to a Transparent copy of the Document, and
+- likewise the network locations given in the Document for
+- previous versions it was based on. These may be placed in
+- the "History" section. You may omit a network location for a
+- work that was published at least four years before the
+- Document itself, or if the original publisher of the version
+- it refers to gives permission.
+-
+- K. For any section Entitled "Acknowledgements" or "Dedications",
+- Preserve the Title of the section, and preserve in the
+- section all the substance and tone of each of the contributor
+- acknowledgements and/or dedications given therein.
+-
+- L. Preserve all the Invariant Sections of the Document,
+- unaltered in their text and in their titles. Section numbers
+- or the equivalent are not considered part of the section
+- titles.
+-
+- M. Delete any section Entitled "Endorsements". Such a section
+- may not be included in the Modified Version.
+-
+- N. Do not retitle any existing section to be Entitled
+- "Endorsements" or to conflict in title with any Invariant
+- Section.
+-
+- O. Preserve any Warranty Disclaimers.
+-
+- If the Modified Version includes new front-matter sections or
+- appendices that qualify as Secondary Sections and contain no
+- material copied from the Document, you may at your option
+- designate some or all of these sections as invariant. To do this,
+- add their titles to the list of Invariant Sections in the Modified
+- Version's license notice. These titles must be distinct from any
+- other section titles.
+-
+- You may add a section Entitled "Endorsements", provided it contains
+- nothing but endorsements of your Modified Version by various
+- parties--for example, statements of peer review or that the text
+- has been approved by an organization as the authoritative
+- definition of a standard.
+-
+- You may add a passage of up to five words as a Front-Cover Text,
+- and a passage of up to 25 words as a Back-Cover Text, to the end
+- of the list of Cover Texts in the Modified Version. Only one
+- passage of Front-Cover Text and one of Back-Cover Text may be
+- added by (or through arrangements made by) any one entity. If the
+- Document already includes a cover text for the same cover,
+- previously added by you or by arrangement made by the same entity
+- you are acting on behalf of, you may not add another; but you may
+- replace the old one, on explicit permission from the previous
+- publisher that added the old one.
+-
+- The author(s) and publisher(s) of the Document do not by this
+- License give permission to use their names for publicity for or to
+- assert or imply endorsement of any Modified Version.
+-
+- 5. COMBINING DOCUMENTS
+-
+- You may combine the Document with other documents released under
+- this License, under the terms defined in section 4 above for
+- modified versions, provided that you include in the combination
+- all of the Invariant Sections of all of the original documents,
+- unmodified, and list them all as Invariant Sections of your
+- combined work in its license notice, and that you preserve all
+- their Warranty Disclaimers.
+-
+- The combined work need only contain one copy of this License, and
+- multiple identical Invariant Sections may be replaced with a single
+- copy. If there are multiple Invariant Sections with the same name
+- but different contents, make the title of each such section unique
+- by adding at the end of it, in parentheses, the name of the
+- original author or publisher of that section if known, or else a
+- unique number. Make the same adjustment to the section titles in
+- the list of Invariant Sections in the license notice of the
+- combined work.
+-
+- In the combination, you must combine any sections Entitled
+- "History" in the various original documents, forming one section
+- Entitled "History"; likewise combine any sections Entitled
+- "Acknowledgements", and any sections Entitled "Dedications". You
+- must delete all sections Entitled "Endorsements."
+-
+- 6. COLLECTIONS OF DOCUMENTS
+-
+- You may make a collection consisting of the Document and other
+- documents released under this License, and replace the individual
+- copies of this License in the various documents with a single copy
+- that is included in the collection, provided that you follow the
+- rules of this License for verbatim copying of each of the
+- documents in all other respects.
+-
+- You may extract a single document from such a collection, and
+- distribute it individually under this License, provided you insert
+- a copy of this License into the extracted document, and follow
+- this License in all other respects regarding verbatim copying of
+- that document.
+-
+- 7. AGGREGATION WITH INDEPENDENT WORKS
+-
+- A compilation of the Document or its derivatives with other
+- separate and independent documents or works, in or on a volume of
+- a storage or distribution medium, is called an "aggregate" if the
+- copyright resulting from the compilation is not used to limit the
+- legal rights of the compilation's users beyond what the individual
+- works permit. When the Document is included in an aggregate, this
+- License does not apply to the other works in the aggregate which
+- are not themselves derivative works of the Document.
+-
+- If the Cover Text requirement of section 3 is applicable to these
+- copies of the Document, then if the Document is less than one half
+- of the entire aggregate, the Document's Cover Texts may be placed
+- on covers that bracket the Document within the aggregate, or the
+- electronic equivalent of covers if the Document is in electronic
+- form. Otherwise they must appear on printed covers that bracket
+- the whole aggregate.
+-
+- 8. TRANSLATION
+-
+- Translation is considered a kind of modification, so you may
+- distribute translations of the Document under the terms of section
+- 4. Replacing Invariant Sections with translations requires special
+- permission from their copyright holders, but you may include
+- translations of some or all Invariant Sections in addition to the
+- original versions of these Invariant Sections. You may include a
+- translation of this License, and all the license notices in the
+- Document, and any Warranty Disclaimers, provided that you also
+- include the original English version of this License and the
+- original versions of those notices and disclaimers. In case of a
+- disagreement between the translation and the original version of
+- this License or a notice or disclaimer, the original version will
+- prevail.
+-
+- If a section in the Document is Entitled "Acknowledgements",
+- "Dedications", or "History", the requirement (section 4) to
+- Preserve its Title (section 1) will typically require changing the
+- actual title.
+-
+- 9. TERMINATION
+-
+- You may not copy, modify, sublicense, or distribute the Document
+- except as expressly provided for under this License. Any other
+- attempt to copy, modify, sublicense or distribute the Document is
+- void, and will automatically terminate your rights under this
+- License. However, parties who have received copies, or rights,
+- from you under this License will not have their licenses
+- terminated so long as such parties remain in full compliance.
+-
+- 10. FUTURE REVISIONS OF THIS LICENSE
+-
+- The Free Software Foundation may publish new, revised versions of
+- the GNU Free Documentation License from time to time. Such new
+- versions will be similar in spirit to the present version, but may
+- differ in detail to address new problems or concerns. See
+- `http://www.gnu.org/copyleft/'.
+-
+- Each version of the License is given a distinguishing version
+- number. If the Document specifies that a particular numbered
+- version of this License "or any later version" applies to it, you
+- have the option of following the terms and conditions either of
+- that specified version or of any later version that has been
+- published (not as a draft) by the Free Software Foundation. If
+- the Document does not specify a version number of this License,
+- you may choose any version ever published (not as a draft) by the
+- Free Software Foundation.
+-
+-ADDENDUM: How to use this License for your documents
+-====================================================
+-
+-To use this License in a document you have written, include a copy of
+-the License in the document and put the following copyright and license
+-notices just after the title page:
+-
+- Copyright (C) YEAR YOUR NAME.
+- Permission is granted to copy, distribute and/or modify this document
+- under the terms of the GNU Free Documentation License, Version 1.2
+- or any later version published by the Free Software Foundation;
+- with no Invariant Sections, no Front-Cover Texts, and no Back-Cover
+- Texts. A copy of the license is included in the section entitled ``GNU
+- Free Documentation License''.
+-
+- If you have Invariant Sections, Front-Cover Texts and Back-Cover
+-Texts, replace the "with...Texts." line with this:
+-
+- with the Invariant Sections being LIST THEIR TITLES, with
+- the Front-Cover Texts being LIST, and with the Back-Cover Texts
+- being LIST.
+-
+- If you have Invariant Sections without Cover Texts, or some other
+-combination of the three, merge those two alternatives to suit the
+-situation.
+-
+- If your document contains nontrivial examples of program code, we
+-recommend releasing these examples in parallel under your choice of
+-free software license, such as the GNU General Public License, to
+-permit their use in free software.
+-
+-
+-File: gfortran.info, Node: Funding, Next: Option Index, Prev: GNU Free Documentation License, Up: Top
+-
+-Funding Free Software
+-*********************
+-
+-If you want to have more free software a few years from now, it makes
+-sense for you to help encourage people to contribute funds for its
+-development. The most effective approach known is to encourage
+-commercial redistributors to donate.
+-
+- Users of free software systems can boost the pace of development by
+-encouraging for-a-fee distributors to donate part of their selling price
+-to free software developers--the Free Software Foundation, and others.
+-
+- The way to convince distributors to do this is to demand it and
+-expect it from them. So when you compare distributors, judge them
+-partly by how much they give to free software development. Show
+-distributors they must compete to be the one who gives the most.
+-
+- To make this approach work, you must insist on numbers that you can
+-compare, such as, "We will donate ten dollars to the Frobnitz project
+-for each disk sold." Don't be satisfied with a vague promise, such as
+-"A portion of the profits are donated," since it doesn't give a basis
+-for comparison.
+-
+- Even a precise fraction "of the profits from this disk" is not very
+-meaningful, since creative accounting and unrelated business decisions
+-can greatly alter what fraction of the sales price counts as profit.
+-If the price you pay is $50, ten percent of the profit is probably less
+-than a dollar; it might be a few cents, or nothing at all.
+-
+- Some redistributors do development work themselves. This is useful
+-too; but to keep everyone honest, you need to inquire how much they do,
+-and what kind. Some kinds of development make much more long-term
+-difference than others. For example, maintaining a separate version of
+-a program contributes very little; maintaining the standard version of a
+-program for the whole community contributes much. Easy new ports
+-contribute little, since someone else would surely do them; difficult
+-ports such as adding a new CPU to the GNU Compiler Collection
+-contribute more; major new features or packages contribute the most.
+-
+- By establishing the idea that supporting further development is "the
+-proper thing to do" when distributing free software for a fee, we can
+-assure a steady flow of resources into making more free software.
+-
+- Copyright (C) 1994 Free Software Foundation, Inc.
+- Verbatim copying and redistribution of this section is permitted
+- without royalty; alteration is not permitted.
+-
+-
+-File: gfortran.info, Node: Option Index, Next: Keyword Index, Prev: Funding, Up: Top
+-
+-Option Index
+-************
+-
+-`gfortran''s command line options are indexed here without any initial
+-`-' or `--'. Where an option has both positive and negative forms (such
+-as -foption and -fno-option), relevant entries in the manual are
+-indexed under the most appropriate form; it may sometimes be useful to
+-look up both forms.
+-
+-
+-* Menu:
+-
+-* A-PREDICATE=ANSWER: Preprocessing Options.
+- (line 120)
+-* APREDICATE=ANSWER: Preprocessing Options.
+- (line 114)
+-* backslash: Fortran Dialect Options.
+- (line 59)
+-* C: Preprocessing Options.
+- (line 123)
+-* CC: Preprocessing Options.
+- (line 138)
+-* cpp: Preprocessing Options.
+- (line 13)
+-* dD: Preprocessing Options.
+- (line 35)
+-* dI: Preprocessing Options.
+- (line 51)
+-* dM: Preprocessing Options.
+- (line 26)
+-* dN: Preprocessing Options.
+- (line 41)
+-* DNAME: Preprocessing Options.
+- (line 153)
+-* DNAME=DEFINITION: Preprocessing Options.
+- (line 156)
+-* dU: Preprocessing Options.
+- (line 44)
+-* falign-commons: Code Gen Options. (line 255)
+-* fall-intrinsics: Fortran Dialect Options.
+- (line 18)
+-* fbacktrace: Debugging Options. (line 31)
+-* fblas-matmul-limit: Code Gen Options. (line 214)
+-* fbounds-check: Code Gen Options. (line 130)
+-* fcheck-array-temporaries: Code Gen Options. (line 144)
+-* fconvert=CONVERSION: Runtime Options. (line 9)
+-* fcray-pointer: Fortran Dialect Options.
+- (line 105)
+-* fd-lines-as-code: Fortran Dialect Options.
+- (line 29)
+-* fd-lines-as-comments: Fortran Dialect Options.
+- (line 29)
+-* fdefault-double-8: Fortran Dialect Options.
+- (line 36)
+-* fdefault-integer-8: Fortran Dialect Options.
+- (line 44)
+-* fdefault-real-8: Fortran Dialect Options.
+- (line 49)
+-* fdollar-ok: Fortran Dialect Options.
+- (line 56)
+-* fdump-core: Debugging Options. (line 38)
+-* fdump-parse-tree: Debugging Options. (line 10)
+-* fexternal-blas: Code Gen Options. (line 206)
+-* ff2c: Code Gen Options. (line 25)
+-* ffixed-line-length-N: Fortran Dialect Options.
+- (line 76)
+-* ffpe-trap=LIST: Debugging Options. (line 14)
+-* ffree-form: Fortran Dialect Options.
+- (line 12)
+-* ffree-line-length-N: Fortran Dialect Options.
+- (line 89)
+-* fimplicit-none: Fortran Dialect Options.
+- (line 100)
+-* finit-character: Code Gen Options. (line 238)
+-* finit-integer: Code Gen Options. (line 238)
+-* finit-local-zero: Code Gen Options. (line 238)
+-* finit-logical: Code Gen Options. (line 238)
+-* finit-real: Code Gen Options. (line 238)
+-* fintrinsic-modules-path DIR: Directory Options. (line 40)
+-* fmax-array-constructor: Code Gen Options. (line 152)
+-* fmax-errors=N: Error and Warning Options.
+- (line 27)
+-* fmax-identifier-length=N: Fortran Dialect Options.
+- (line 96)
+-* fmax-stack-var-size: Code Gen Options. (line 170)
+-* fmax-subrecord-length=LENGTH: Runtime Options. (line 36)
+-* fmodule-private: Fortran Dialect Options.
+- (line 71)
+-* fno-automatic: Code Gen Options. (line 15)
+-* fno-fixed-form: Fortran Dialect Options.
+- (line 12)
+-* fno-range-check: Runtime Options. (line 20)
+-* fno-underscoring: Code Gen Options. (line 54)
+-* fopenmp: Fortran Dialect Options.
+- (line 109)
+-* fpack-derived: Code Gen Options. (line 184)
+-* fpp: Preprocessing Options.
+- (line 13)
+-* frange-check: Fortran Dialect Options.
+- (line 117)
+-* frecord-marker=LENGTH: Runtime Options. (line 28)
+-* frecursive: Code Gen Options. (line 225)
+-* frepack-arrays: Code Gen Options. (line 190)
+-* fsecond-underscore: Code Gen Options. (line 113)
+-* fshort-enums <1>: Fortran 2003 status. (line 20)
+-* fshort-enums: Code Gen Options. (line 200)
+-* fsign-zero: Runtime Options. (line 41)
+-* fsyntax-only: Error and Warning Options.
+- (line 33)
+-* fworking-directory: Preprocessing Options.
+- (line 55)
+-* H: Preprocessing Options.
+- (line 176)
+-* IDIR: Directory Options. (line 14)
+-* idirafter DIR: Preprocessing Options.
+- (line 70)
+-* imultilib DIR: Preprocessing Options.
+- (line 77)
+-* iprefix PREFIX: Preprocessing Options.
+- (line 81)
+-* iquote DIR: Preprocessing Options.
+- (line 90)
+-* isysroot DIR: Preprocessing Options.
+- (line 86)
+-* isystem DIR: Preprocessing Options.
+- (line 97)
+-* JDIR: Directory Options. (line 31)
+-* MDIR: Directory Options. (line 31)
+-* nostdinc: Preprocessing Options.
+- (line 105)
+-* P: Preprocessing Options.
+- (line 181)
+-* pedantic: Error and Warning Options.
+- (line 38)
+-* pedantic-errors: Error and Warning Options.
+- (line 57)
+-* static-libgfortran: Link Options. (line 11)
+-* std=STD option: Fortran Dialect Options.
+- (line 129)
+-* UNAME: Preprocessing Options.
+- (line 187)
+-* undef: Preprocessing Options.
+- (line 110)
+-* Waliasing: Error and Warning Options.
+- (line 68)
+-* Walign-commons: Error and Warning Options.
+- (line 165)
+-* Wall: Error and Warning Options.
+- (line 61)
+-* Wampersand: Error and Warning Options.
+- (line 85)
+-* Warray-temporaries: Error and Warning Options.
+- (line 93)
+-* Wcharacter-truncation: Error and Warning Options.
+- (line 98)
+-* Wconversion: Error and Warning Options.
+- (line 104)
+-* Werror: Error and Warning Options.
+- (line 171)
+-* Wimplicit-interface: Error and Warning Options.
+- (line 107)
+-* Wintrinsic-shadow: Error and Warning Options.
+- (line 152)
+-* Wintrinsics-std: Error and Warning Options.
+- (line 113)
+-* Wline-truncation: Error and Warning Options.
+- (line 101)
+-* Wsurprising: Error and Warning Options.
+- (line 120)
+-* Wtabs: Error and Warning Options.
+- (line 140)
+-* Wunderflow: Error and Warning Options.
+- (line 148)
+-* Wunused-parameter: Error and Warning Options.
+- (line 158)
+-
+-
+-File: gfortran.info, Node: Keyword Index, Prev: Option Index, Up: Top
+-
+-Keyword Index
+-*************
+-
+-
+-* Menu:
+-
+-* $: Fortran Dialect Options.
+- (line 56)
+-* %LOC: Argument list functions.
+- (line 6)
+-* %REF: Argument list functions.
+- (line 6)
+-* %VAL: Argument list functions.
+- (line 6)
+-* &: Error and Warning Options.
+- (line 85)
+-* [...]: Fortran 2003 status. (line 13)
+-* ABORT: ABORT. (line 6)
+-* ABS: ABS. (line 6)
+-* absolute value: ABS. (line 6)
+-* ACCESS: ACCESS. (line 6)
+-* ACCESS='STREAM' I/O: Fortran 2003 status. (line 32)
+-* ACHAR: ACHAR. (line 6)
+-* ACOS: ACOS. (line 6)
+-* ACOSH: ACOSH. (line 6)
+-* adjust string <1>: ADJUSTR. (line 6)
+-* adjust string: ADJUSTL. (line 6)
+-* ADJUSTL: ADJUSTL. (line 6)
+-* ADJUSTR: ADJUSTR. (line 6)
+-* AIMAG: AIMAG. (line 6)
+-* AINT: AINT. (line 6)
+-* ALARM: ALARM. (line 6)
+-* ALGAMA: LOG_GAMMA. (line 6)
+-* aliasing: Error and Warning Options.
+- (line 68)
+-* alignment of COMMON blocks <1>: Code Gen Options. (line 255)
+-* alignment of COMMON blocks: Error and Warning Options.
+- (line 165)
+-* ALL: ALL. (line 6)
+-* all warnings: Error and Warning Options.
+- (line 61)
+-* ALLOCATABLE components of derived types: Fortran 2003 status.
+- (line 30)
+-* ALLOCATABLE dummy arguments: Fortran 2003 status. (line 26)
+-* ALLOCATABLE function results: Fortran 2003 status. (line 28)
+-* ALLOCATED: ALLOCATED. (line 6)
+-* allocation, moving: MOVE_ALLOC. (line 6)
+-* allocation, status: ALLOCATED. (line 6)
+-* ALOG: LOG. (line 6)
+-* ALOG10: LOG10. (line 6)
+-* AMAX0: MAX. (line 6)
+-* AMAX1: MAX. (line 6)
+-* AMIN0: MIN. (line 6)
+-* AMIN1: MIN. (line 6)
+-* AMOD: MOD. (line 6)
+-* AND: AND. (line 6)
+-* ANINT: ANINT. (line 6)
+-* ANY: ANY. (line 6)
+-* area hyperbolic cosine: ACOSH. (line 6)
+-* area hyperbolic sine: ASINH. (line 6)
+-* area hyperbolic tangent: ATANH. (line 6)
+-* argument list functions: Argument list functions.
+- (line 6)
+-* arguments, to program <1>: IARGC. (line 6)
+-* arguments, to program <2>: GET_COMMAND_ARGUMENT.
+- (line 6)
+-* arguments, to program <3>: GET_COMMAND. (line 6)
+-* arguments, to program <4>: GETARG. (line 6)
+-* arguments, to program: COMMAND_ARGUMENT_COUNT.
+- (line 6)
+-* array, add elements: SUM. (line 6)
+-* array, apply condition <1>: ANY. (line 6)
+-* array, apply condition: ALL. (line 6)
+-* array, bounds checking: Code Gen Options. (line 130)
+-* array, change dimensions: RESHAPE. (line 6)
+-* array, combine arrays: MERGE. (line 6)
+-* array, condition testing <1>: ANY. (line 6)
+-* array, condition testing: ALL. (line 6)
+-* array, conditionally add elements: SUM. (line 6)
+-* array, conditionally count elements: COUNT. (line 6)
+-* array, conditionally multiply elements: PRODUCT. (line 6)
+-* array, constructors: Fortran 2003 status. (line 13)
+-* array, count elements: SIZE. (line 6)
+-* array, duplicate dimensions: SPREAD. (line 6)
+-* array, duplicate elements: SPREAD. (line 6)
+-* array, element counting: COUNT. (line 6)
+-* array, gather elements: PACK. (line 6)
+-* array, increase dimension <1>: UNPACK. (line 6)
+-* array, increase dimension: SPREAD. (line 6)
+-* array, indices of type real: Real array indices. (line 6)
+-* array, location of maximum element: MAXLOC. (line 6)
+-* array, location of minimum element: MINLOC. (line 6)
+-* array, lower bound: LBOUND. (line 6)
+-* array, maximum value: MAXVAL. (line 6)
+-* array, merge arrays: MERGE. (line 6)
+-* array, minimum value: MINVAL. (line 6)
+-* array, multiply elements: PRODUCT. (line 6)
+-* array, number of elements <1>: SIZE. (line 6)
+-* array, number of elements: COUNT. (line 6)
+-* array, packing: PACK. (line 6)
+-* array, permutation: CSHIFT. (line 6)
+-* array, product: PRODUCT. (line 6)
+-* array, reduce dimension: PACK. (line 6)
+-* array, rotate: CSHIFT. (line 6)
+-* array, scatter elements: UNPACK. (line 6)
+-* array, shape: SHAPE. (line 6)
+-* array, shift: EOSHIFT. (line 6)
+-* array, shift circularly: CSHIFT. (line 6)
+-* array, size: SIZE. (line 6)
+-* array, sum: SUM. (line 6)
+-* array, transmogrify: RESHAPE. (line 6)
+-* array, transpose: TRANSPOSE. (line 6)
+-* array, unpacking: UNPACK. (line 6)
+-* array, upper bound: UBOUND. (line 6)
+-* ASCII collating sequence <1>: IACHAR. (line 6)
+-* ASCII collating sequence: ACHAR. (line 6)
+-* ASIN: ASIN. (line 6)
+-* ASINH <1>: ATANH. (line 6)
+-* ASINH: ASINH. (line 6)
+-* ASSOCIATED: ASSOCIATED. (line 6)
+-* association status: ASSOCIATED. (line 6)
+-* association status, C pointer: C_ASSOCIATED. (line 6)
+-* ATAN: ATAN. (line 6)
+-* ATAN2: ATAN2. (line 6)
+-* Authors: Contributors. (line 6)
+-* backslash: Fortran Dialect Options.
+- (line 59)
+-* backtrace: Debugging Options. (line 31)
+-* BESJ0: BESSEL_J0. (line 6)
+-* BESJ1: BESSEL_J1. (line 6)
+-* BESJN: BESSEL_JN. (line 6)
+-* Bessel function, first kind <1>: BESSEL_JN. (line 6)
+-* Bessel function, first kind <2>: BESSEL_J1. (line 6)
+-* Bessel function, first kind: BESSEL_J0. (line 6)
+-* Bessel function, second kind <1>: BESSEL_YN. (line 6)
+-* Bessel function, second kind <2>: BESSEL_Y1. (line 6)
+-* Bessel function, second kind: BESSEL_Y0. (line 6)
+-* BESSEL_J0: BESSEL_J0. (line 6)
+-* BESSEL_J1: BESSEL_J1. (line 6)
+-* BESSEL_JN: BESSEL_JN. (line 6)
+-* BESSEL_Y0: BESSEL_Y0. (line 6)
+-* BESSEL_Y1: BESSEL_Y1. (line 6)
+-* BESSEL_YN: BESSEL_YN. (line 6)
+-* BESY0: BESSEL_Y0. (line 6)
+-* BESY1: BESSEL_Y1. (line 6)
+-* BESYN: BESSEL_YN. (line 6)
+-* BIT_SIZE: BIT_SIZE. (line 6)
+-* bits, clear: IBCLR. (line 6)
+-* bits, extract: IBITS. (line 6)
+-* bits, get: IBITS. (line 6)
+-* bits, move <1>: TRANSFER. (line 6)
+-* bits, move: MVBITS. (line 6)
+-* bits, negate: NOT. (line 6)
+-* bits, number of: BIT_SIZE. (line 6)
+-* bits, set: IBSET. (line 6)
+-* bits, shift: ISHFT. (line 6)
+-* bits, shift circular: ISHFTC. (line 6)
+-* bits, shift left: LSHIFT. (line 6)
+-* bits, shift right: RSHIFT. (line 6)
+-* bits, testing: BTEST. (line 6)
+-* bits, unset: IBCLR. (line 6)
+-* bitwise logical and <1>: IAND. (line 6)
+-* bitwise logical and: AND. (line 6)
+-* bitwise logical exclusive or <1>: XOR. (line 6)
+-* bitwise logical exclusive or: IEOR. (line 6)
+-* bitwise logical not: NOT. (line 6)
+-* bitwise logical or <1>: OR. (line 6)
+-* bitwise logical or: IOR. (line 6)
+-* bounds checking: Code Gen Options. (line 130)
+-* BOZ literal constants: BOZ literal constants.
+- (line 6)
+-* BTEST: BTEST. (line 6)
+-* C_ASSOCIATED: C_ASSOCIATED. (line 6)
+-* C_F_POINTER: C_F_POINTER. (line 6)
+-* C_F_PROCPOINTER: C_F_PROCPOINTER. (line 6)
+-* C_FUNLOC: C_FUNLOC. (line 6)
+-* C_LOC: C_LOC. (line 6)
+-* C_SIZEOF: C_SIZEOF. (line 6)
+-* CABS: ABS. (line 6)
+-* calling convention: Code Gen Options. (line 25)
+-* CCOS: COS. (line 6)
+-* CDABS: ABS. (line 6)
+-* CDCOS: COS. (line 6)
+-* CDEXP: EXP. (line 6)
+-* CDLOG: LOG. (line 6)
+-* CDSIN: SIN. (line 6)
+-* CDSQRT: SQRT. (line 6)
+-* ceiling: CEILING. (line 6)
+-* CEILING: CEILING. (line 6)
+-* ceiling: ANINT. (line 6)
+-* CEXP: EXP. (line 6)
+-* CHAR: CHAR. (line 6)
+-* character kind: SELECTED_CHAR_KIND. (line 6)
+-* character set: Fortran Dialect Options.
+- (line 56)
+-* CHDIR: CHDIR. (line 6)
+-* checking array temporaries: Code Gen Options. (line 144)
+-* checking subscripts: Code Gen Options. (line 130)
+-* CHMOD: CHMOD. (line 6)
+-* clock ticks <1>: SYSTEM_CLOCK. (line 6)
+-* clock ticks <2>: MCLOCK8. (line 6)
+-* clock ticks: MCLOCK. (line 6)
+-* CLOG: LOG. (line 6)
+-* CMPLX: CMPLX. (line 6)
+-* code generation, conventions: Code Gen Options. (line 6)
+-* collating sequence, ASCII <1>: IACHAR. (line 6)
+-* collating sequence, ASCII: ACHAR. (line 6)
+-* command options: Invoking GNU Fortran.
+- (line 6)
+-* command-line arguments <1>: IARGC. (line 6)
+-* command-line arguments <2>: GET_COMMAND_ARGUMENT.
+- (line 6)
+-* command-line arguments <3>: GET_COMMAND. (line 6)
+-* command-line arguments <4>: GETARG. (line 6)
+-* command-line arguments: COMMAND_ARGUMENT_COUNT.
+- (line 6)
+-* command-line arguments, number of <1>: IARGC. (line 6)
+-* command-line arguments, number of: COMMAND_ARGUMENT_COUNT.
+- (line 6)
+-* COMMAND_ARGUMENT_COUNT: COMMAND_ARGUMENT_COUNT.
+- (line 6)
+-* COMPLEX: COMPLEX. (line 6)
+-* complex conjugate: CONJG. (line 6)
+-* complex numbers, conversion to <1>: DCMPLX. (line 6)
+-* complex numbers, conversion to <2>: COMPLEX. (line 6)
+-* complex numbers, conversion to: CMPLX. (line 6)
+-* complex numbers, imaginary part: AIMAG. (line 6)
+-* complex numbers, real part <1>: REAL. (line 6)
+-* complex numbers, real part: DREAL. (line 6)
+-* Conditional compilation: Preprocessing and conditional compilation.
+- (line 6)
+-* CONJG: CONJG. (line 6)
+-* Contributing: Contributing. (line 6)
+-* Contributors: Contributors. (line 6)
+-* conversion: Error and Warning Options.
+- (line 104)
+-* conversion, to character: CHAR. (line 6)
+-* conversion, to complex <1>: DCMPLX. (line 6)
+-* conversion, to complex <2>: COMPLEX. (line 6)
+-* conversion, to complex: CMPLX. (line 6)
+-* conversion, to integer <1>: LONG. (line 6)
+-* conversion, to integer <2>: INT8. (line 6)
+-* conversion, to integer <3>: INT2. (line 6)
+-* conversion, to integer <4>: INT. (line 6)
+-* conversion, to integer <5>: ICHAR. (line 6)
+-* conversion, to integer <6>: IACHAR. (line 6)
+-* conversion, to integer: Implicitly convert LOGICAL and INTEGER values.
+- (line 6)
+-* conversion, to logical <1>: LOGICAL. (line 6)
+-* conversion, to logical: Implicitly convert LOGICAL and INTEGER values.
+- (line 6)
+-* conversion, to real <1>: SNGL. (line 6)
+-* conversion, to real <2>: REAL. (line 6)
+-* conversion, to real <3>: FLOAT. (line 6)
+-* conversion, to real <4>: DFLOAT. (line 6)
+-* conversion, to real: DBLE. (line 6)
+-* conversion, to string: CTIME. (line 6)
+-* CONVERT specifier: CONVERT specifier. (line 6)
+-* core, dump <1>: ABORT. (line 6)
+-* core, dump: Debugging Options. (line 38)
+-* COS: COS. (line 6)
+-* COSH: COSH. (line 6)
+-* cosine: COS. (line 6)
+-* cosine, hyperbolic: COSH. (line 6)
+-* cosine, hyperbolic, inverse: ACOSH. (line 6)
+-* cosine, inverse: ACOS. (line 6)
+-* COUNT: COUNT. (line 6)
+-* CPP <1>: Preprocessing Options.
+- (line 6)
+-* CPP: Preprocessing and conditional compilation.
+- (line 6)
+-* CPU_TIME: CPU_TIME. (line 6)
+-* Credits: Contributors. (line 6)
+-* CSHIFT: CSHIFT. (line 6)
+-* CSIN: SIN. (line 6)
+-* CSQRT: SQRT. (line 6)
+-* CTIME: CTIME. (line 6)
+-* current date <1>: IDATE. (line 6)
+-* current date <2>: FDATE. (line 6)
+-* current date: DATE_AND_TIME. (line 6)
+-* current time <1>: TIME8. (line 6)
+-* current time <2>: TIME. (line 6)
+-* current time <3>: ITIME. (line 6)
+-* current time <4>: FDATE. (line 6)
+-* current time: DATE_AND_TIME. (line 6)
+-* DABS: ABS. (line 6)
+-* DACOS: ACOS. (line 6)
+-* DACOSH: ACOSH. (line 6)
+-* DASIN: ASIN. (line 6)
+-* DASINH <1>: ATANH. (line 6)
+-* DASINH: ASINH. (line 6)
+-* DATAN: ATAN. (line 6)
+-* DATAN2: ATAN2. (line 6)
+-* date, current <1>: IDATE. (line 6)
+-* date, current <2>: FDATE. (line 6)
+-* date, current: DATE_AND_TIME. (line 6)
+-* DATE_AND_TIME: DATE_AND_TIME. (line 6)
+-* DBESJ0: BESSEL_J0. (line 6)
+-* DBESJ1: BESSEL_J1. (line 6)
+-* DBESJN: BESSEL_JN. (line 6)
+-* DBESY0: BESSEL_Y0. (line 6)
+-* DBESY1: BESSEL_Y1. (line 6)
+-* DBESYN: BESSEL_YN. (line 6)
+-* DBLE: DBLE. (line 6)
+-* DCMPLX: DCMPLX. (line 6)
+-* DCONJG: CONJG. (line 6)
+-* DCOS: COS. (line 6)
+-* DCOSH: COSH. (line 6)
+-* DDIM: DIM. (line 6)
+-* debugging information options: Debugging Options. (line 6)
+-* debugging, preprocessor: Preprocessing Options.
+- (line 26)
+-* DECODE: ENCODE and DECODE statements.
+- (line 6)
+-* delayed execution <1>: SLEEP. (line 6)
+-* delayed execution: ALARM. (line 6)
+-* DEXP: EXP. (line 6)
+-* DFLOAT: DFLOAT. (line 6)
+-* DGAMMA: GAMMA. (line 6)
+-* dialect options: Fortran Dialect Options.
+- (line 6)
+-* DIGITS: DIGITS. (line 6)
+-* DIM: DIM. (line 6)
+-* DIMAG: AIMAG. (line 6)
+-* DINT: AINT. (line 6)
+-* directive, INCLUDE: Directory Options. (line 6)
+-* directory, options: Directory Options. (line 6)
+-* directory, search paths for inclusion: Directory Options. (line 14)
+-* division, modulo: MODULO. (line 6)
+-* division, remainder: MOD. (line 6)
+-* DLGAMA: LOG_GAMMA. (line 6)
+-* DLOG: LOG. (line 6)
+-* DLOG10: LOG10. (line 6)
+-* DMAX1: MAX. (line 6)
+-* DMIN1: MIN. (line 6)
+-* DMOD: MOD. (line 6)
+-* DNINT: ANINT. (line 6)
+-* dot product: DOT_PRODUCT. (line 6)
+-* DOT_PRODUCT: DOT_PRODUCT. (line 6)
+-* DPROD: DPROD. (line 6)
+-* DREAL: DREAL. (line 6)
+-* DSIGN: SIGN. (line 6)
+-* DSIN: SIN. (line 6)
+-* DSINH: SINH. (line 6)
+-* DSQRT: SQRT. (line 6)
+-* DTAN: TAN. (line 6)
+-* DTANH: TANH. (line 6)
+-* DTIME: DTIME. (line 6)
+-* elapsed time <1>: SECOND. (line 6)
+-* elapsed time <2>: SECNDS. (line 6)
+-* elapsed time: DTIME. (line 6)
+-* ENCODE: ENCODE and DECODE statements.
+- (line 6)
+-* ENUM statement: Fortran 2003 status. (line 20)
+-* ENUMERATOR statement: Fortran 2003 status. (line 20)
+-* environment variable <1>: GET_ENVIRONMENT_VARIABLE.
+- (line 6)
+-* environment variable <2>: GETENV. (line 6)
+-* environment variable <3>: Runtime. (line 6)
+-* environment variable: Environment Variables.
+- (line 6)
+-* EOSHIFT: EOSHIFT. (line 6)
+-* EPSILON: EPSILON. (line 6)
+-* ERF: ERF. (line 6)
+-* ERFC: ERFC. (line 6)
+-* ERFC_SCALED: ERFC_SCALED. (line 6)
+-* error function: ERF. (line 6)
+-* error function, complementary: ERFC. (line 6)
+-* error function, complementary, exponentially-scaled: ERFC_SCALED.
+- (line 6)
+-* errors, limiting: Error and Warning Options.
+- (line 27)
+-* escape characters: Fortran Dialect Options.
+- (line 59)
+-* ETIME: ETIME. (line 6)
+-* Euclidean distance: HYPOT. (line 6)
+-* EXIT: EXIT. (line 6)
+-* EXP: EXP. (line 6)
+-* EXPONENT: EXPONENT. (line 6)
+-* exponential function: EXP. (line 6)
+-* exponential function, inverse <1>: LOG10. (line 6)
+-* exponential function, inverse: LOG. (line 6)
+-* expression size <1>: SIZEOF. (line 6)
+-* expression size: C_SIZEOF. (line 6)
+-* extensions: Extensions. (line 6)
+-* extensions, implemented: Extensions implemented in GNU Fortran.
+- (line 6)
+-* extensions, not implemented: Extensions not implemented in GNU Fortran.
+- (line 6)
+-* f2c calling convention: Code Gen Options. (line 25)
+-* Factorial function: GAMMA. (line 6)
+-* FDATE: FDATE. (line 6)
+-* FDL, GNU Free Documentation License: GNU Free Documentation License.
+- (line 6)
+-* FGET: FGET. (line 6)
+-* FGETC: FGETC. (line 6)
+-* file format, fixed: Fortran Dialect Options.
+- (line 12)
+-* file format, free: Fortran Dialect Options.
+- (line 12)
+-* file operation, file number: FNUM. (line 6)
+-* file operation, flush: FLUSH. (line 6)
+-* file operation, position <1>: FTELL. (line 6)
+-* file operation, position: FSEEK. (line 6)
+-* file operation, read character <1>: FGETC. (line 6)
+-* file operation, read character: FGET. (line 6)
+-* file operation, seek: FSEEK. (line 6)
+-* file operation, write character <1>: FPUTC. (line 6)
+-* file operation, write character: FPUT. (line 6)
+-* file system, access mode: ACCESS. (line 6)
+-* file system, change access mode: CHMOD. (line 6)
+-* file system, create link <1>: SYMLNK. (line 6)
+-* file system, create link: LINK. (line 6)
+-* file system, file creation mask: UMASK. (line 6)
+-* file system, file status <1>: STAT. (line 6)
+-* file system, file status <2>: LSTAT. (line 6)
+-* file system, file status: FSTAT. (line 6)
+-* file system, hard link: LINK. (line 6)
+-* file system, remove file: UNLINK. (line 6)
+-* file system, rename file: RENAME. (line 6)
+-* file system, soft link: SYMLNK. (line 6)
+-* FLOAT: FLOAT. (line 6)
+-* floating point, exponent: EXPONENT. (line 6)
+-* floating point, fraction: FRACTION. (line 6)
+-* floating point, nearest different: NEAREST. (line 6)
+-* floating point, relative spacing <1>: SPACING. (line 6)
+-* floating point, relative spacing: RRSPACING. (line 6)
+-* floating point, scale: SCALE. (line 6)
+-* floating point, set exponent: SET_EXPONENT. (line 6)
+-* floor: FLOOR. (line 6)
+-* FLOOR: FLOOR. (line 6)
+-* floor: AINT. (line 6)
+-* FLUSH: FLUSH. (line 6)
+-* FLUSH statement: Fortran 2003 status. (line 16)
+-* FNUM: FNUM. (line 6)
+-* Fortran 77: GNU Fortran and G77. (line 6)
+-* FPP: Preprocessing and conditional compilation.
+- (line 6)
+-* FPUT: FPUT. (line 6)
+-* FPUTC: FPUTC. (line 6)
+-* FRACTION: FRACTION. (line 6)
+-* FREE: FREE. (line 6)
+-* FSEEK: FSEEK. (line 6)
+-* FSTAT: FSTAT. (line 6)
+-* FTELL: FTELL. (line 6)
+-* g77: GNU Fortran and G77. (line 6)
+-* g77 calling convention: Code Gen Options. (line 25)
+-* GAMMA: GAMMA. (line 6)
+-* Gamma function: GAMMA. (line 6)
+-* Gamma function, logarithm of: LOG_GAMMA. (line 6)
+-* GCC: GNU Fortran and GCC. (line 6)
+-* GERROR: GERROR. (line 6)
+-* GET_COMMAND: GET_COMMAND. (line 6)
+-* GET_COMMAND_ARGUMENT: GET_COMMAND_ARGUMENT.
+- (line 6)
+-* GET_ENVIRONMENT_VARIABLE: GET_ENVIRONMENT_VARIABLE.
+- (line 6)
+-* GETARG: GETARG. (line 6)
+-* GETCWD: GETCWD. (line 6)
+-* GETENV: GETENV. (line 6)
+-* GETGID: GETGID. (line 6)
+-* GETLOG: GETLOG. (line 6)
+-* GETPID: GETPID. (line 6)
+-* GETUID: GETUID. (line 6)
+-* GMTIME: GMTIME. (line 6)
+-* GNU Compiler Collection: GNU Fortran and GCC. (line 6)
+-* GNU Fortran command options: Invoking GNU Fortran.
+- (line 6)
+-* Hollerith constants: Hollerith constants support.
+- (line 6)
+-* HOSTNM: HOSTNM. (line 6)
+-* HUGE: HUGE. (line 6)
+-* hyperbolic arccosine: ACOSH. (line 6)
+-* hyperbolic arcsine: ASINH. (line 6)
+-* hyperbolic arctangent: ATANH. (line 6)
+-* hyperbolic cosine: COSH. (line 6)
+-* hyperbolic function, cosine: COSH. (line 6)
+-* hyperbolic function, cosine, inverse: ACOSH. (line 6)
+-* hyperbolic function, sine: SINH. (line 6)
+-* hyperbolic function, sine, inverse: ASINH. (line 6)
+-* hyperbolic function, tangent: TANH. (line 6)
+-* hyperbolic function, tangent, inverse: ATANH. (line 6)
+-* hyperbolic sine: SINH. (line 6)
+-* hyperbolic tangent: TANH. (line 6)
+-* HYPOT: HYPOT. (line 6)
+-* I/O item lists: I/O item lists. (line 6)
+-* IABS: ABS. (line 6)
+-* IACHAR: IACHAR. (line 6)
+-* IAND: IAND. (line 6)
+-* IARGC: IARGC. (line 6)
+-* IBCLR: IBCLR. (line 6)
+-* IBITS: IBITS. (line 6)
+-* IBSET: IBSET. (line 6)
+-* ICHAR: ICHAR. (line 6)
+-* IDATE: IDATE. (line 6)
+-* IDIM: DIM. (line 6)
+-* IDINT: INT. (line 6)
+-* IDNINT: NINT. (line 6)
+-* IEEE, ISNAN: ISNAN. (line 6)
+-* IEOR: IEOR. (line 6)
+-* IERRNO: IERRNO. (line 6)
+-* IFIX: INT. (line 6)
+-* IMAG: AIMAG. (line 6)
+-* IMAGPART: AIMAG. (line 6)
+-* IMPORT statement: Fortran 2003 status. (line 43)
+-* INCLUDE directive: Directory Options. (line 6)
+-* inclusion, directory search paths for: Directory Options. (line 14)
+-* INDEX: INDEX intrinsic. (line 6)
+-* INT: INT. (line 6)
+-* INT2: INT2. (line 6)
+-* INT8: INT8. (line 6)
+-* integer kind: SELECTED_INT_KIND. (line 6)
+-* intrinsic: Error and Warning Options.
+- (line 152)
+-* intrinsic Modules: Intrinsic Modules. (line 6)
+-* intrinsic procedures: Intrinsic Procedures.
+- (line 6)
+-* Introduction: Top. (line 6)
+-* IOMSG= specifier: Fortran 2003 status. (line 18)
+-* IOR: IOR. (line 6)
+-* IOSTAT, end of file: IS_IOSTAT_END. (line 6)
+-* IOSTAT, end of record: IS_IOSTAT_EOR. (line 6)
+-* IRAND: IRAND. (line 6)
+-* IS_IOSTAT_END: IS_IOSTAT_END. (line 6)
+-* IS_IOSTAT_EOR: IS_IOSTAT_EOR. (line 6)
+-* ISATTY: ISATTY. (line 6)
+-* ISHFT: ISHFT. (line 6)
+-* ISHFTC: ISHFTC. (line 6)
+-* ISIGN: SIGN. (line 6)
+-* ISNAN: ISNAN. (line 6)
+-* ISO C Bindings: Fortran 2003 status. (line 52)
+-* ISO_FORTRAN_ENV statement: Fortran 2003 status. (line 46)
+-* ITIME: ITIME. (line 6)
+-* KILL: KILL. (line 6)
+-* kind: KIND. (line 6)
+-* KIND: KIND. (line 6)
+-* kind: KIND Type Parameters.
+- (line 6)
+-* kind, character: SELECTED_CHAR_KIND. (line 6)
+-* kind, integer: SELECTED_INT_KIND. (line 6)
+-* kind, old-style: Old-style kind specifications.
+- (line 6)
+-* kind, real: SELECTED_REAL_KIND. (line 6)
+-* language, dialect options: Fortran Dialect Options.
+- (line 6)
+-* LBOUND: LBOUND. (line 6)
+-* LEADZ: LEADZ. (line 6)
+-* LEN: LEN. (line 6)
+-* LEN_TRIM: LEN_TRIM. (line 6)
+-* lexical comparison of strings <1>: LLT. (line 6)
+-* lexical comparison of strings <2>: LLE. (line 6)
+-* lexical comparison of strings <3>: LGT. (line 6)
+-* lexical comparison of strings: LGE. (line 6)
+-* LGAMMA: LOG_GAMMA. (line 6)
+-* LGE: LGE. (line 6)
+-* LGT: LGT. (line 6)
+-* libf2c calling convention: Code Gen Options. (line 25)
+-* limits, largest number: HUGE. (line 6)
+-* limits, smallest number: TINY. (line 6)
+-* LINK: LINK. (line 6)
+-* linking, static: Link Options. (line 6)
+-* LLE: LLE. (line 6)
+-* LLT: LLT. (line 6)
+-* LNBLNK: LNBLNK. (line 6)
+-* LOC: LOC. (line 6)
+-* location of a variable in memory: LOC. (line 6)
+-* LOG: LOG. (line 6)
+-* LOG10: LOG10. (line 6)
+-* LOG_GAMMA: LOG_GAMMA. (line 6)
+-* logarithmic function <1>: LOG10. (line 6)
+-* logarithmic function: LOG. (line 6)
+-* logarithmic function, inverse: EXP. (line 6)
+-* LOGICAL: LOGICAL. (line 6)
+-* logical and, bitwise <1>: IAND. (line 6)
+-* logical and, bitwise: AND. (line 6)
+-* logical exclusive or, bitwise <1>: XOR. (line 6)
+-* logical exclusive or, bitwise: IEOR. (line 6)
+-* logical not, bitwise: NOT. (line 6)
+-* logical or, bitwise <1>: OR. (line 6)
+-* logical or, bitwise: IOR. (line 6)
+-* login name: GETLOG. (line 6)
+-* LONG: LONG. (line 6)
+-* LSHIFT: LSHIFT. (line 6)
+-* LSTAT: LSTAT. (line 6)
+-* LTIME: LTIME. (line 6)
+-* MALLOC: MALLOC. (line 6)
+-* MATMUL: MATMUL. (line 6)
+-* matrix multiplication: MATMUL. (line 6)
+-* matrix, transpose: TRANSPOSE. (line 6)
+-* MAX: MAX. (line 6)
+-* MAX0: MAX. (line 6)
+-* MAX1: MAX. (line 6)
+-* MAXEXPONENT: MAXEXPONENT. (line 6)
+-* maximum value <1>: MAXVAL. (line 6)
+-* maximum value: MAX. (line 6)
+-* MAXLOC: MAXLOC. (line 6)
+-* MAXVAL: MAXVAL. (line 6)
+-* MCLOCK: MCLOCK. (line 6)
+-* MCLOCK8: MCLOCK8. (line 6)
+-* MERGE: MERGE. (line 6)
+-* messages, error: Error and Warning Options.
+- (line 6)
+-* messages, warning: Error and Warning Options.
+- (line 6)
+-* MIN: MIN. (line 6)
+-* MIN0: MIN. (line 6)
+-* MIN1: MIN. (line 6)
+-* MINEXPONENT: MINEXPONENT. (line 6)
+-* minimum value <1>: MINVAL. (line 6)
+-* minimum value: MIN. (line 6)
+-* MINLOC: MINLOC. (line 6)
+-* MINVAL: MINVAL. (line 6)
+-* MOD: MOD. (line 6)
+-* model representation, base: RADIX. (line 6)
+-* model representation, epsilon: EPSILON. (line 6)
+-* model representation, largest number: HUGE. (line 6)
+-* model representation, maximum exponent: MAXEXPONENT. (line 6)
+-* model representation, minimum exponent: MINEXPONENT. (line 6)
+-* model representation, precision: PRECISION. (line 6)
+-* model representation, radix: RADIX. (line 6)
+-* model representation, range: RANGE. (line 6)
+-* model representation, significant digits: DIGITS. (line 6)
+-* model representation, smallest number: TINY. (line 6)
+-* module entities: Fortran Dialect Options.
+- (line 71)
+-* module search path: Directory Options. (line 14)
+-* modulo: MODULO. (line 6)
+-* MODULO: MODULO. (line 6)
+-* MOVE_ALLOC: MOVE_ALLOC. (line 6)
+-* moving allocation: MOVE_ALLOC. (line 6)
+-* multiply array elements: PRODUCT. (line 6)
+-* MVBITS: MVBITS. (line 6)
+-* Namelist: Extensions to namelist.
+- (line 6)
+-* NEAREST: NEAREST. (line 6)
+-* NEW_LINE: NEW_LINE. (line 6)
+-* newline: NEW_LINE. (line 6)
+-* NINT: NINT. (line 6)
+-* NOT: NOT. (line 6)
+-* NULL: NULL. (line 6)
+-* OpenMP <1>: OpenMP. (line 6)
+-* OpenMP: Fortran Dialect Options.
+- (line 109)
+-* operators, unary: Unary operators. (line 6)
+-* options, code generation: Code Gen Options. (line 6)
+-* options, debugging: Debugging Options. (line 6)
+-* options, dialect: Fortran Dialect Options.
+- (line 6)
+-* options, directory search: Directory Options. (line 6)
+-* options, errors: Error and Warning Options.
+- (line 6)
+-* options, fortran dialect: Fortran Dialect Options.
+- (line 12)
+-* options, gfortran command: Invoking GNU Fortran.
+- (line 6)
+-* options, linking: Link Options. (line 6)
+-* options, negative forms: Invoking GNU Fortran.
+- (line 13)
+-* options, preprocessor: Preprocessing Options.
+- (line 6)
+-* options, run-time: Code Gen Options. (line 6)
+-* options, runtime: Runtime Options. (line 6)
+-* options, warnings: Error and Warning Options.
+- (line 6)
+-* OR: OR. (line 6)
+-* output, newline: NEW_LINE. (line 6)
+-* PACK: PACK. (line 6)
+-* paths, search: Directory Options. (line 14)
+-* PERROR: PERROR. (line 6)
+-* pointer, C address of pointers: C_F_PROCPOINTER. (line 6)
+-* pointer, C address of procedures: C_FUNLOC. (line 6)
+-* pointer, C association status: C_ASSOCIATED. (line 6)
+-* pointer, convert C to Fortran: C_F_POINTER. (line 6)
+-* pointer, cray <1>: MALLOC. (line 6)
+-* pointer, cray: FREE. (line 6)
+-* pointer, Cray: Cray pointers. (line 6)
+-* pointer, disassociated: NULL. (line 6)
+-* pointer, status <1>: NULL. (line 6)
+-* pointer, status: ASSOCIATED. (line 6)
+-* positive difference: DIM. (line 6)
+-* PRECISION: PRECISION. (line 6)
+-* Preprocessing: Preprocessing and conditional compilation.
+- (line 6)
+-* preprocessing, assertation: Preprocessing Options.
+- (line 114)
+-* preprocessing, define macros: Preprocessing Options.
+- (line 153)
+-* preprocessing, include path: Preprocessing Options.
+- (line 70)
+-* preprocessing, keep comments: Preprocessing Options.
+- (line 123)
+-* preprocessing, no linemarkers: Preprocessing Options.
+- (line 181)
+-* preprocessing, undefine macros: Preprocessing Options.
+- (line 187)
+-* preprocessor: Preprocessing Options.
+- (line 6)
+-* preprocessor, debugging: Preprocessing Options.
+- (line 26)
+-* preprocessor, disable: Preprocessing Options.
+- (line 13)
+-* preprocessor, enable: Preprocessing Options.
+- (line 13)
+-* preprocessor, include file handling: Preprocessing and conditional compilation.
+- (line 6)
+-* preprocessor, working directory: Preprocessing Options.
+- (line 55)
+-* PRESENT: PRESENT. (line 6)
+-* private: Fortran Dialect Options.
+- (line 71)
+-* procedure pointer, convert C to Fortran: C_LOC. (line 6)
+-* process id: GETPID. (line 6)
+-* PRODUCT: PRODUCT. (line 6)
+-* product, double-precision: DPROD. (line 6)
+-* product, matrix: MATMUL. (line 6)
+-* product, vector: DOT_PRODUCT. (line 6)
+-* program termination: EXIT. (line 6)
+-* program termination, with core dump: ABORT. (line 6)
+-* PROTECTED statement: Fortran 2003 status. (line 37)
+-* RADIX: RADIX. (line 6)
+-* RAN: RAN. (line 6)
+-* RAND: RAND. (line 6)
+-* random number generation <1>: RANDOM_NUMBER. (line 6)
+-* random number generation <2>: RAND. (line 6)
+-* random number generation <3>: RAN. (line 6)
+-* random number generation: IRAND. (line 6)
+-* random number generation, seeding <1>: SRAND. (line 6)
+-* random number generation, seeding: RANDOM_SEED. (line 6)
+-* RANDOM_NUMBER: RANDOM_NUMBER. (line 6)
+-* RANDOM_SEED: RANDOM_SEED. (line 6)
+-* RANGE: RANGE. (line 6)
+-* range checking: Code Gen Options. (line 130)
+-* read character, stream mode <1>: FGETC. (line 6)
+-* read character, stream mode: FGET. (line 6)
+-* REAL: REAL. (line 6)
+-* real kind: SELECTED_REAL_KIND. (line 6)
+-* real number, exponent: EXPONENT. (line 6)
+-* real number, fraction: FRACTION. (line 6)
+-* real number, nearest different: NEAREST. (line 6)
+-* real number, relative spacing <1>: SPACING. (line 6)
+-* real number, relative spacing: RRSPACING. (line 6)
+-* real number, scale: SCALE. (line 6)
+-* real number, set exponent: SET_EXPONENT. (line 6)
+-* REALPART: REAL. (line 6)
+-* RECORD: STRUCTURE and RECORD.
+- (line 6)
+-* remainder: MOD. (line 6)
+-* RENAME: RENAME. (line 6)
+-* repacking arrays: Code Gen Options. (line 190)
+-* REPEAT: REPEAT. (line 6)
+-* RESHAPE: RESHAPE. (line 6)
+-* root: SQRT. (line 6)
+-* rounding, ceiling <1>: CEILING. (line 6)
+-* rounding, ceiling: ANINT. (line 6)
+-* rounding, floor <1>: FLOOR. (line 6)
+-* rounding, floor: AINT. (line 6)
+-* rounding, nearest whole number: NINT. (line 6)
+-* RRSPACING: RRSPACING. (line 6)
+-* RSHIFT: RSHIFT. (line 6)
+-* SAVE statement: Code Gen Options. (line 15)
+-* SCALE: SCALE. (line 6)
+-* SCAN: SCAN. (line 6)
+-* search path: Directory Options. (line 6)
+-* search paths, for included files: Directory Options. (line 14)
+-* SECNDS: SECNDS. (line 6)
+-* SECOND: SECOND. (line 6)
+-* seeding a random number generator <1>: SRAND. (line 6)
+-* seeding a random number generator: RANDOM_SEED. (line 6)
+-* SELECTED_CHAR_KIND: SELECTED_CHAR_KIND. (line 6)
+-* SELECTED_INT_KIND: SELECTED_INT_KIND. (line 6)
+-* SELECTED_REAL_KIND: SELECTED_REAL_KIND. (line 6)
+-* SET_EXPONENT: SET_EXPONENT. (line 6)
+-* SHAPE: SHAPE. (line 6)
+-* SHORT: INT2. (line 6)
+-* SIGN: SIGN. (line 6)
+-* sign copying: SIGN. (line 6)
+-* SIGNAL: SIGNAL. (line 6)
+-* SIN: SIN. (line 6)
+-* sine: SIN. (line 6)
+-* sine, hyperbolic: SINH. (line 6)
+-* sine, hyperbolic, inverse: ASINH. (line 6)
+-* sine, inverse: ASIN. (line 6)
+-* SINH: SINH. (line 6)
+-* SIZE: SIZE. (line 6)
+-* size of a variable, in bits: BIT_SIZE. (line 6)
+-* size of an expression <1>: SIZEOF. (line 6)
+-* size of an expression: C_SIZEOF. (line 6)
+-* SIZEOF: SIZEOF. (line 6)
+-* SLEEP: SLEEP. (line 6)
+-* SNGL: SNGL. (line 6)
+-* SPACING: SPACING. (line 6)
+-* SPREAD: SPREAD. (line 6)
+-* SQRT: SQRT. (line 6)
+-* square-root: SQRT. (line 6)
+-* SRAND: SRAND. (line 6)
+-* Standards: Standards. (line 6)
+-* STAT: STAT. (line 6)
+-* statement, ENUM: Fortran 2003 status. (line 20)
+-* statement, ENUMERATOR: Fortran 2003 status. (line 20)
+-* statement, FLUSH: Fortran 2003 status. (line 16)
+-* statement, IMPORT: Fortran 2003 status. (line 43)
+-* statement, ISO_FORTRAN_ENV: Fortran 2003 status. (line 46)
+-* statement, PROTECTED: Fortran 2003 status. (line 37)
+-* statement, SAVE: Code Gen Options. (line 15)
+-* statement, USE, INTRINSIC: Fortran 2003 status. (line 46)
+-* statement, VALUE: Fortran 2003 status. (line 39)
+-* statement, VOLATILE: Fortran 2003 status. (line 41)
+-* STREAM I/O: Fortran 2003 status. (line 32)
+-* stream mode, read character <1>: FGETC. (line 6)
+-* stream mode, read character: FGET. (line 6)
+-* stream mode, write character <1>: FPUTC. (line 6)
+-* stream mode, write character: FPUT. (line 6)
+-* string, adjust left: ADJUSTL. (line 6)
+-* string, adjust right: ADJUSTR. (line 6)
+-* string, comparison <1>: LLT. (line 6)
+-* string, comparison <2>: LLE. (line 6)
+-* string, comparison <3>: LGT. (line 6)
+-* string, comparison: LGE. (line 6)
+-* string, concatenate: REPEAT. (line 6)
+-* string, find missing set: VERIFY. (line 6)
+-* string, find non-blank character: LNBLNK. (line 6)
+-* string, find subset: SCAN. (line 6)
+-* string, find substring: INDEX intrinsic. (line 6)
+-* string, length: LEN. (line 6)
+-* string, length, without trailing whitespace: LEN_TRIM. (line 6)
+-* string, remove trailing whitespace: TRIM. (line 6)
+-* string, repeat: REPEAT. (line 6)
+-* STRUCTURE: STRUCTURE and RECORD.
+- (line 6)
+-* structure packing: Code Gen Options. (line 184)
+-* subscript checking: Code Gen Options. (line 130)
+-* substring position: INDEX intrinsic. (line 6)
+-* SUM: SUM. (line 6)
+-* sum array elements: SUM. (line 6)
+-* suppressing warnings: Error and Warning Options.
+- (line 6)
+-* symbol names: Fortran Dialect Options.
+- (line 56)
+-* symbol names, transforming: Code Gen Options. (line 54)
+-* symbol names, underscores: Code Gen Options. (line 54)
+-* SYMLNK: SYMLNK. (line 6)
+-* syntax checking: Error and Warning Options.
+- (line 33)
+-* SYSTEM: SYSTEM. (line 6)
+-* system, error handling <1>: PERROR. (line 6)
+-* system, error handling <2>: IERRNO. (line 6)
+-* system, error handling: GERROR. (line 6)
+-* system, group id: GETGID. (line 6)
+-* system, host name: HOSTNM. (line 6)
+-* system, login name: GETLOG. (line 6)
+-* system, process id: GETPID. (line 6)
+-* system, signal handling: SIGNAL. (line 6)
+-* system, system call: SYSTEM. (line 6)
+-* system, terminal <1>: TTYNAM. (line 6)
+-* system, terminal: ISATTY. (line 6)
+-* system, user id: GETUID. (line 6)
+-* system, working directory <1>: GETCWD. (line 6)
+-* system, working directory: CHDIR. (line 6)
+-* SYSTEM_CLOCK: SYSTEM_CLOCK. (line 6)
+-* tabulators: Error and Warning Options.
+- (line 140)
+-* TAN: TAN. (line 6)
+-* tangent: TAN. (line 6)
+-* tangent, hyperbolic: TANH. (line 6)
+-* tangent, hyperbolic, inverse: ATANH. (line 6)
+-* tangent, inverse <1>: ATAN2. (line 6)
+-* tangent, inverse: ATAN. (line 6)
+-* TANH: TANH. (line 6)
+-* terminate program: EXIT. (line 6)
+-* terminate program, with core dump: ABORT. (line 6)
+-* TIME: TIME. (line 6)
+-* time, clock ticks <1>: SYSTEM_CLOCK. (line 6)
+-* time, clock ticks <2>: MCLOCK8. (line 6)
+-* time, clock ticks: MCLOCK. (line 6)
+-* time, conversion to GMT info: GMTIME. (line 6)
+-* time, conversion to local time info: LTIME. (line 6)
+-* time, conversion to string: CTIME. (line 6)
+-* time, current <1>: TIME8. (line 6)
+-* time, current <2>: TIME. (line 6)
+-* time, current <3>: ITIME. (line 6)
+-* time, current <4>: FDATE. (line 6)
+-* time, current: DATE_AND_TIME. (line 6)
+-* time, elapsed <1>: SECOND. (line 6)
+-* time, elapsed <2>: SECNDS. (line 6)
+-* time, elapsed <3>: ETIME. (line 6)
+-* time, elapsed <4>: DTIME. (line 6)
+-* time, elapsed: CPU_TIME. (line 6)
+-* TIME8: TIME8. (line 6)
+-* TINY: TINY. (line 6)
+-* TR 15581: Fortran 2003 status. (line 25)
+-* trace: Debugging Options. (line 31)
+-* TRAILZ: TRAILZ. (line 6)
+-* TRANSFER: TRANSFER. (line 6)
+-* transforming symbol names: Code Gen Options. (line 54)
+-* transpose: TRANSPOSE. (line 6)
+-* TRANSPOSE: TRANSPOSE. (line 6)
+-* trigonometric function, cosine: COS. (line 6)
+-* trigonometric function, cosine, inverse: ACOS. (line 6)
+-* trigonometric function, sine: SIN. (line 6)
+-* trigonometric function, sine, inverse: ASIN. (line 6)
+-* trigonometric function, tangent: TAN. (line 6)
+-* trigonometric function, tangent, inverse <1>: ATAN2. (line 6)
+-* trigonometric function, tangent, inverse: ATAN. (line 6)
+-* TRIM: TRIM. (line 6)
+-* TTYNAM: TTYNAM. (line 6)
+-* type cast: TRANSFER. (line 6)
+-* UBOUND: UBOUND. (line 6)
+-* UMASK: UMASK. (line 6)
+-* underflow: Error and Warning Options.
+- (line 148)
+-* underscore: Code Gen Options. (line 54)
+-* UNLINK: UNLINK. (line 6)
+-* UNPACK: UNPACK. (line 6)
+-* unused parameter: Error and Warning Options.
+- (line 158)
+-* USE, INTRINSIC statement: Fortran 2003 status. (line 46)
+-* user id: GETUID. (line 6)
+-* VALUE statement: Fortran 2003 status. (line 39)
+-* vector product: DOT_PRODUCT. (line 6)
+-* VERIFY: VERIFY. (line 6)
+-* VOLATILE statement: Fortran 2003 status. (line 41)
+-* warnings, aliasing: Error and Warning Options.
+- (line 68)
+-* warnings, alignment of COMMON blocks: Error and Warning Options.
+- (line 165)
+-* warnings, all: Error and Warning Options.
+- (line 61)
+-* warnings, ampersand: Error and Warning Options.
+- (line 85)
+-* warnings, array temporaries: Error and Warning Options.
+- (line 93)
+-* warnings, character truncation: Error and Warning Options.
+- (line 98)
+-* warnings, conversion: Error and Warning Options.
+- (line 104)
+-* warnings, implicit interface: Error and Warning Options.
+- (line 107)
+-* warnings, intrinsic: Error and Warning Options.
+- (line 152)
+-* warnings, intrinsics of other standards: Error and Warning Options.
+- (line 113)
+-* warnings, line truncation: Error and Warning Options.
+- (line 101)
+-* warnings, non-standard intrinsics: Error and Warning Options.
+- (line 113)
+-* warnings, suppressing: Error and Warning Options.
+- (line 6)
+-* warnings, suspicious code: Error and Warning Options.
+- (line 120)
+-* warnings, tabs: Error and Warning Options.
+- (line 140)
+-* warnings, to errors: Error and Warning Options.
+- (line 171)
+-* warnings, underflow: Error and Warning Options.
+- (line 148)
+-* warnings, unused parameter: Error and Warning Options.
+- (line 158)
+-* write character, stream mode <1>: FPUTC. (line 6)
+-* write character, stream mode: FPUT. (line 6)
+-* XOR: XOR. (line 6)
+-* ZABS: ABS. (line 6)
+-* ZCOS: COS. (line 6)
+-* zero bits <1>: TRAILZ. (line 6)
+-* zero bits: LEADZ. (line 6)
+-* ZEXP: EXP. (line 6)
+-* ZLOG: LOG. (line 6)
+-* ZSIN: SIN. (line 6)
+-* ZSQRT: SQRT. (line 6)
+-
+-
+-
+-Tag Table:
+-Node: Top1990
+-Node: Introduction3305
+-Node: About GNU Fortran4052
+-Node: GNU Fortran and GCC8080
+-Node: Preprocessing and conditional compilation10192
+-Node: GNU Fortran and G7711833
+-Node: Project Status12406
+-Node: Standards14921
+-Node: Invoking GNU Fortran16132
+-Node: Option Summary17855
+-Node: Fortran Dialect Options21343
+-Node: Preprocessing Options28153
+-Node: Error and Warning Options36279
+-Node: Debugging Options43706
+-Node: Directory Options45869
+-Node: Link Options47384
+-Node: Runtime Options48008
+-Node: Code Gen Options50088
+-Node: Environment Variables62313
+-Node: Runtime62918
+-Node: GFORTRAN_STDIN_UNIT64146
+-Node: GFORTRAN_STDOUT_UNIT64513
+-Node: GFORTRAN_STDERR_UNIT64914
+-Node: GFORTRAN_USE_STDERR65312
+-Node: GFORTRAN_TMPDIR65757
+-Node: GFORTRAN_UNBUFFERED_ALL66198
+-Node: GFORTRAN_UNBUFFERED_PRECONNECTED66721
+-Node: GFORTRAN_SHOW_LOCUS67363
+-Node: GFORTRAN_OPTIONAL_PLUS67857
+-Node: GFORTRAN_DEFAULT_RECL68332
+-Node: GFORTRAN_LIST_SEPARATOR68823
+-Node: GFORTRAN_CONVERT_UNIT69432
+-Node: GFORTRAN_ERROR_DUMPCORE72294
+-Node: GFORTRAN_ERROR_BACKTRACE72841
+-Node: Fortran 2003 and 2008 status73392
+-Node: Fortran 2003 status73632
+-Node: Fortran 2008 status75323
+-Node: Compiler Characteristics76292
+-Node: KIND Type Parameters76630
+-Node: Extensions77557
+-Node: Extensions implemented in GNU Fortran78156
+-Node: Old-style kind specifications79490
+-Node: Old-style variable initialization80596
+-Node: Extensions to namelist81908
+-Node: X format descriptor without count field83904
+-Node: Commas in FORMAT specifications84431
+-Node: Missing period in FORMAT specifications84948
+-Node: I/O item lists85510
+-Node: BOZ literal constants85899
+-Node: Real array indices88468
+-Node: Unary operators88765
+-Node: Implicitly convert LOGICAL and INTEGER values89179
+-Node: Hollerith constants support90139
+-Node: Cray pointers91911
+-Node: CONVERT specifier97321
+-Node: OpenMP99319
+-Node: Argument list functions101574
+-Node: Extensions not implemented in GNU Fortran103168
+-Node: STRUCTURE and RECORD104020
+-Node: ENCODE and DECODE statements106076
+-Node: Intrinsic Procedures107394
+-Node: Introduction to Intrinsics121084
+-Node: ABORT123436
+-Node: ABS124193
+-Node: ACCESS125695
+-Node: ACHAR127616
+-Node: ACOS128817
+-Node: ACOSH129815
+-Node: ADJUSTL130692
+-Node: ADJUSTR131633
+-Node: AIMAG132580
+-Node: AINT133900
+-Node: ALARM135372
+-Node: ALL137006
+-Node: ALLOCATED138924
+-Node: AND139805
+-Node: ANINT141102
+-Node: ANY142465
+-Node: ASIN144395
+-Node: ASINH145407
+-Node: ASSOCIATED146289
+-Node: ATAN149294
+-Node: ATAN2150183
+-Node: ATANH151527
+-Node: BESSEL_J0152407
+-Node: BESSEL_J1153451
+-Node: BESSEL_JN154503
+-Node: BESSEL_Y0155670
+-Node: BESSEL_Y1156670
+-Node: BESSEL_YN157670
+-Node: BIT_SIZE158887
+-Node: BTEST159716
+-Node: C_ASSOCIATED160604
+-Node: C_FUNLOC161813
+-Node: C_F_PROCPOINTER163182
+-Node: C_F_POINTER164811
+-Node: C_LOC166229
+-Node: C_SIZEOF167346
+-Node: CEILING168699
+-Node: CHAR169704
+-Node: CHDIR170768
+-Node: CHMOD171936
+-Node: CMPLX173731
+-Node: COMMAND_ARGUMENT_COUNT175195
+-Node: COMPLEX176102
+-Node: CONJG177245
+-Node: COS178255
+-Node: COSH179526
+-Node: COUNT180495
+-Node: CPU_TIME182351
+-Node: CSHIFT183705
+-Node: CTIME185361
+-Node: DATE_AND_TIME186620
+-Node: DBLE189081
+-Node: DCMPLX189905
+-Node: DFLOAT191099
+-Node: DIGITS191793
+-Node: DIM192759
+-Node: DOT_PRODUCT193902
+-Node: DPROD195558
+-Node: DREAL196284
+-Node: DTIME196948
+-Node: EOSHIFT199754
+-Node: EPSILON201827
+-Node: ERF202553
+-Node: ERFC203327
+-Node: ERFC_SCALED204131
+-Node: ETIME204823
+-Node: EXIT207054
+-Node: EXP207913
+-Node: EXPONENT209071
+-Node: FDATE209821
+-Node: FLOAT211096
+-Node: FGET211810
+-Node: FGETC213604
+-Node: FLOOR215372
+-Node: FLUSH216356
+-Node: FNUM216994
+-Node: FPUT217716
+-Node: FPUTC219317
+-Node: FRACTION221057
+-Node: FREE221958
+-Node: FSEEK222795
+-Node: FSTAT225089
+-Node: FTELL226129
+-Node: GAMMA227107
+-Node: GERROR228148
+-Node: GETARG228867
+-Node: GET_COMMAND230631
+-Node: GET_COMMAND_ARGUMENT231577
+-Node: GETCWD233545
+-Node: GETENV234491
+-Node: GET_ENVIRONMENT_VARIABLE235713
+-Node: GETGID237413
+-Node: GETLOG237948
+-Node: GETPID238806
+-Node: GETUID239534
+-Node: GMTIME240048
+-Node: HOSTNM241537
+-Node: HUGE242453
+-Node: HYPOT243172
+-Node: IACHAR243992
+-Node: IAND245172
+-Node: IARGC246159
+-Node: IBCLR247182
+-Node: IBITS247843
+-Node: IBSET248758
+-Node: ICHAR249414
+-Node: IDATE251395
+-Node: IEOR252422
+-Node: IERRNO253298
+-Node: INDEX intrinsic253853
+-Node: INT255199
+-Node: INT2256786
+-Node: INT8257551
+-Node: IOR258263
+-Node: IRAND259113
+-Node: IS_IOSTAT_END260465
+-Node: IS_IOSTAT_EOR261560
+-Node: ISATTY262685
+-Node: ISHFT263468
+-Node: ISHFTC264448
+-Node: ISNAN265664
+-Node: ITIME266412
+-Node: KILL267437
+-Node: KIND268310
+-Node: LBOUND269155
+-Node: LEADZ270467
+-Node: LEN271271
+-Node: LEN_TRIM272362
+-Node: LGE273350
+-Node: LGT274663
+-Node: LINK275940
+-Node: LLE276975
+-Node: LLT278279
+-Node: LNBLNK279549
+-Node: LOC280325
+-Node: LOG281056
+-Node: LOG10282347
+-Node: LOG_GAMMA283319
+-Node: LOGICAL284407
+-Node: LONG285211
+-Node: LSHIFT285967
+-Node: LSTAT286921
+-Node: LTIME288075
+-Node: MALLOC289490
+-Node: MATMUL290950
+-Node: MAX292040
+-Node: MAXEXPONENT293539
+-Node: MAXLOC294355
+-Node: MAXVAL296404
+-Node: MCLOCK298067
+-Node: MCLOCK8299070
+-Node: MERGE300284
+-Node: MIN301026
+-Node: MINEXPONENT302522
+-Node: MINLOC303152
+-Node: MINVAL305201
+-Node: MOD306883
+-Node: MODULO308375
+-Node: MOVE_ALLOC309589
+-Node: MVBITS310613
+-Node: NEAREST311672
+-Node: NEW_LINE312795
+-Node: NINT313566
+-Node: NOT314834
+-Node: NULL315417
+-Node: OR316315
+-Node: PACK317593
+-Node: PERROR319585
+-Node: PRECISION320207
+-Node: PRESENT321033
+-Node: PRODUCT322139
+-Node: RADIX323664
+-Node: RAN324441
+-Node: RAND324897
+-Node: RANDOM_NUMBER326232
+-Node: RANDOM_SEED327950
+-Node: RANGE329833
+-Node: REAL330457
+-Node: RENAME331899
+-Node: REPEAT332918
+-Node: RESHAPE333644
+-Node: RRSPACING335113
+-Node: RSHIFT335806
+-Node: SCALE336768
+-Node: SCAN337542
+-Node: SECNDS339092
+-Node: SECOND340180
+-Node: SELECTED_CHAR_KIND341056
+-Node: SELECTED_INT_KIND342053
+-Node: SELECTED_REAL_KIND343228
+-Node: SET_EXPONENT345167
+-Node: SHAPE346163
+-Node: SIGN347276
+-Node: SIGNAL348359
+-Node: SIN349856
+-Node: SINH350898
+-Node: SIZE351710
+-Node: SIZEOF353018
+-Node: SLEEP354312
+-Node: SNGL354869
+-Node: SPACING355540
+-Node: SPREAD356552
+-Node: SQRT357697
+-Node: SRAND358936
+-Node: STAT360104
+-Node: SUM363216
+-Node: SYMLNK364685
+-Node: SYSTEM365817
+-Node: SYSTEM_CLOCK366765
+-Node: TAN368109
+-Node: TANH368945
+-Node: TIME369812
+-Node: TIME8370916
+-Node: TINY372053
+-Node: TRAILZ372653
+-Node: TRANSFER373438
+-Node: TRANSPOSE375472
+-Node: TRIM376159
+-Node: TTYNAM377016
+-Node: UBOUND377931
+-Node: UMASK379300
+-Node: UNLINK379855
+-Node: UNPACK380832
+-Node: VERIFY382120
+-Node: XOR383836
+-Node: Intrinsic Modules385144
+-Node: Contributing390935
+-Node: Contributors391787
+-Node: Projects393410
+-Node: Proposed Extensions394213
+-Node: Copying396264
+-Node: GNU Free Documentation License433828
+-Node: Funding456240
+-Node: Option Index458765
+-Node: Keyword Index470647
+-
+-End Tag Table
+diff -Nur a/gcc/function.c b/gcc/function.c
+--- a/gcc/function.c 2009-07-11 21:06:26.000000000 +0200
++++ b/gcc/function.c 2010-01-25 09:50:29.135686643 +0100
+@@ -272,7 +272,10 @@
+ if (! type)
+ type = lang_hooks.types.type_for_mode (mode, 0);
+
+- return STACK_SLOT_ALIGNMENT (type, mode, alignment);
++ return alignment_for_aligned_arrays (type,
++ STACK_SLOT_ALIGNMENT (type,
++ mode,
++ alignment));
+ }
+
+ /* Allocate a stack slot of SIZE bytes and return a MEM rtx for it
+@@ -5359,6 +5362,57 @@
+ {
+ return IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (cfun->decl));
+ }
++
++/* This function adjusts alignments as appropriate according to the
++ setting of -falign-arrays. If that is specified then the minimum
++ alignment for array variables is set to be the largest power of two
++ less than or equal to their total storage size, or the biggest
++ alignment used on the machine, whichever is smaller. */
++
++unsigned int
++alignment_for_aligned_arrays (tree ty, unsigned int existing_alignment)
++{
++ unsigned int min_alignment;
++ tree size;
++
++ /* Return the existing alignment if not using -falign-arrays or if
++ the type is not an array type. */
++ if (!flag_align_arrays || !ty || TREE_CODE (ty) != ARRAY_TYPE)
++ return existing_alignment;
++
++ /* Extract the total storage size of the array in bits. */
++ size = TYPE_SIZE (ty);
++ gcc_assert (size);
++
++ /* At least for variable-length arrays, TREE_CODE (size) might not be an
++ integer constant; check it now. If it is not, give the array at
++ least BIGGEST_ALIGNMENT just to be safe. Furthermore, we assume that
++ alignments always fit into a host integer. So if we can't fit the
++ size of the array in bits into a host integer, it must also be large
++ enough to deserve at least BIGGEST_ALIGNMENT (see below). */
++ if (TREE_CODE (size) != INTEGER_CST || !host_integerp (size, 1))
++ min_alignment = BIGGEST_ALIGNMENT;
++ else
++ {
++ unsigned HOST_WIDE_INT bits = TREE_INT_CST_LOW (size);
++ bits = (bits ? bits : 1);
++
++ /* An array with size greater than BIGGEST_ALIGNMENT is assigned
++ at least that alignment. In all other cases the minimum
++ alignment of the array is set to be the largest power of two
++ less than or equal to the total storage size of the array.
++ We assume that BIGGEST_ALIGNMENT fits in "unsigned int"; thus,
++ the shift below will not overflow. */
++ if (bits >= BIGGEST_ALIGNMENT)
++ min_alignment = BIGGEST_ALIGNMENT;
++ else
++ min_alignment = 1 << (floor_log2 (bits));
++ }
++
++ /* Having computed the minimum permissible alignment, enlarge it
++ if EXISTING_ALIGNMENT is greater. */
++ return MAX (min_alignment, existing_alignment);
++}
+
+
+ static unsigned int
+diff -Nur a/gcc/function.h b/gcc/function.h
+--- a/gcc/function.h 2009-03-23 17:29:33.000000000 +0100
++++ b/gcc/function.h 2010-01-25 09:50:29.135686643 +0100
+@@ -25,6 +25,7 @@
+ #include "tree.h"
+ #include "hashtab.h"
+ #include "varray.h"
++#include "hard-reg-set.h"
+
+ /* Stack of pending (incomplete) sequences saved by `start_sequence'.
+ Each element describes one pending sequence.
+@@ -441,6 +442,8 @@
+
+ /* True if dbr_schedule has already been called for this function. */
+ bool dbr_scheduled_p;
++
++ HARD_REG_SET asm_clobbers;
+ };
+
+ #define return_label (crtl->x_return_label)
+@@ -687,4 +690,7 @@
+ extern void used_types_insert (tree);
+
+ extern int get_next_funcdef_no (void);
++
++extern unsigned int alignment_for_aligned_arrays (tree, unsigned int);
++
+ #endif /* GCC_FUNCTION_H */
+diff -Nur a/gcc/gcc.c b/gcc/gcc.c
+--- a/gcc/gcc.c 2009-03-17 22:25:59.000000000 +0100
++++ b/gcc/gcc.c 2010-01-25 09:50:29.135686643 +0100
+@@ -83,6 +83,13 @@
+ #include "gcc.h"
+ #include "flags.h"
+ #include "opts.h"
++#ifdef CSL_LICENSE_FEATURE
++# include <csl/license.h>
++#else
++ /* TARGET_FLEXLM requires the CodeSourcery license library be
++ present. */
++# undef TARGET_FLEXLM
++#endif
+
+ /* By default there is no special suffix for target executables. */
+ /* FIXME: when autoconf is fixed, remove the host check - dj */
+@@ -229,6 +236,37 @@
+
+ static int use_pipes;
+
++/* Nonzero means that libgcc is being linked automatically by the
++ compiler from its normal installed location; that is, neither -B,
++ -nostdlib nor -nodefaultlibs was passed. */
++
++static int using_libgcc = 1;
++
++/* Nonzero means that the current spec is executing the linker. */
++
++static int executing_linker = 0;
++
++#ifdef CSL_LICENSE_FEATURE
++/* 0 if we have not checked for a license, 1 if a license was
++ obtained, -1 if license checkout failed. */
++
++static int license_checked;
++
++# ifdef TARGET_FLEXLM
++/* WRS LOCAL
++ Nonzero means to pay attention to the result of the license manager. */
++
++static int license_me_flag;
++
++/* WRS LOCAL
++ True if the -p option should be passed to the get_feature command. */
++
++static int feature_proxy_flag = 1;
++# else
++# define license_me_flag 1
++# endif /* defined (TARGET_FLELM) */
++#endif /* defined (CSL_LICENSE_FEATURE) */
++
+ /* The compiler version. */
+
+ static const char *compiler_version;
+@@ -651,8 +689,32 @@
+
+ /* config.h can define SWITCHES_NEED_SPACES to control which options
+ require spaces between the option and the argument. */
++/* GCC Bugzilla PR11810 indicates that GCC does not correctly handle
++ "-ofoo.o", in that it records "-ofoo.o" as a temporary file to
++ delete, rather than "foo.o".
++
++ Unfortunately, Eclipse's makefile generators use the "-ofoo.o"
++ form. See also CS Issue #3433. So, although most users probably
++ use "-o foo.o", the "-ofoo.o" form is used in practice.
++
++ See this email thread for additional information:
++
++ http://gcc.gnu.org/ml/gcc/2008-07/msg00395.html
++
++ Therefore, we define SWITCHES_NEED_SPACES to include "o" by
++ default. This causes "-ofoo.o" to be split into "-o foo.o" during
++ the initial processing of the command-line, before being seen by
++ the specs machinery.
++
++ A risk of this change is that tools which *require* the "-ofoo.o"
++ form will no longer work. However, we know of no such tools, and
++ they would not have worked with the "-o foo.o" form anyhow.
++
++ If this general strategy is acceptable upstream, the best approach
++ might be simply to eliminate this macro, since the only definitions
++ in target files are also to the value "o". */
+ #ifndef SWITCHES_NEED_SPACES
+-#define SWITCHES_NEED_SPACES ""
++#define SWITCHES_NEED_SPACES "o"
+ #endif
+
+ /* config.h can define ENDFILE_SPEC to override the default crtn files. */
+@@ -728,6 +790,8 @@
+ %{!fsyntax-only:%{!c:%{!M:%{!MM:%{!E:%{!S:\
+ %(linker) %l " LINK_PIE_SPEC "%X %{o*} %{A} %{d} %{e*} %{m} %{N} %{n} %{r}\
+ %{s} %{t} %{u*} %{x} %{z} %{Z} %{!A:%{!nostdlib:%{!nostartfiles:%S}}}\
++ %{Wno-poison-system-directories:--no-poison-system-directories}\
++ %{Werror=poison-system-directories:--error-poison-system-directories}\
+ %{static:} %{L*} %(mfwrap) %(link_libgcc) %o\
+ %{fopenmp|ftree-parallelize-loops=*:%:include(libgomp.spec)%(link_gomp)} %(mflib)\
+ %{fprofile-arcs|fprofile-generate|coverage:-lgcov}\
+@@ -882,7 +946,7 @@
+ #endif
+
+ static const char *const driver_self_specs[] = {
+- DRIVER_SELF_SPECS, GOMP_SELF_SPECS
++ DRIVER_SELF_SPECS, CONFIGURE_SPECS, GOMP_SELF_SPECS
+ };
+
+ #ifndef OPTION_DEFAULT_SPECS
+@@ -2853,6 +2917,29 @@
+
+ gcc_assert (!processing_spec_function);
+
++ if (executing_linker && using_libgcc)
++ {
++ const char *libgcc_a_filename;
++
++ /* Verify that the multilib being used is actually installed. */
++ libgcc_a_filename = (gcc_exec_prefix
++ ? gcc_exec_prefix
++ : concat (standard_exec_prefix,
++ machine_suffix, NULL));
++ if (multilib_dir && strcmp (multilib_dir, ".") != 0)
++ libgcc_a_filename = concat (libgcc_a_filename, multilib_dir,
++ dir_separator_str, NULL);
++ libgcc_a_filename = concat (libgcc_a_filename, "libgcc.a", NULL);
++ if (access (libgcc_a_filename, R_OK) != 0)
++ {
++ if (errno == ENOENT)
++ fatal ("selected multilib '%s' not installed",
++ multilib_dir ? multilib_dir : ".");
++ else
++ pfatal_with_name (libgcc_a_filename);
++ }
++ }
++
+ if (wrapper_string)
+ {
+ string = find_a_file (&exec_prefixes, argbuf[0], X_OK, false);
+@@ -3688,6 +3775,16 @@
+ add_assembler_option ("--target-help", 13);
+ add_linker_option ("--target-help", 13);
+ }
++ else if (! strcmp (argv[i], "-nodefaultlibs"))
++ {
++ using_libgcc = 0;
++ n_switches++;
++ }
++ else if (! strcmp (argv[i], "-nostdlib"))
++ {
++ using_libgcc = 0;
++ n_switches++;
++ }
+ else if (! strcmp (argv[i], "-pass-exit-codes"))
+ {
+ pass_exit_codes = 1;
+@@ -3852,6 +3949,14 @@
+ verbose_only_flag++;
+ verbose_flag++;
+ }
++#ifdef TARGET_FLEXLM
++ else if (strcmp (argv[i], "-flicense-me") == 0)
++ license_me_flag = 1; /* WRS LOCAL */
++ else if (strcmp (argv[i], "-ffeature-proxy") == 0)
++ feature_proxy_flag = 1; /* WRS LOCAL */
++ else if (strcmp (argv[i], "-fno-feature-proxy") == 0)
++ feature_proxy_flag = 0; /* WRS LOCAL */
++#endif
+ else if (argv[i][0] == '-' && argv[i][1] != 0)
+ {
+ const char *p = &argv[i][1];
+@@ -3905,6 +4010,7 @@
+ PREFIX_PRIORITY_B_OPT, 0, 0);
+ add_prefix (&include_prefixes, value, NULL,
+ PREFIX_PRIORITY_B_OPT, 0, 0);
++ using_libgcc = 0;
+ n_switches++;
+ }
+ break;
+@@ -3967,6 +4073,21 @@
+ #endif
+ goto normal_switch;
+
++ /* WRS LOCAL only invoke get_feature if we are running
++ the compiler proper. */
++#ifdef TARGET_FLEXLM
++ case 'E':
++ if (argv[i][2] == '\0')
++ license_checked = 1;
++ goto normal_switch;
++
++ case 'M':
++ if (argv[i][2] == '\0'
++ || (argv[i][2] == 'M' && argv[i][3] == '\0'))
++ license_checked = 1;
++ goto normal_switch;
++#endif
++
+ default:
+ normal_switch:
+
+@@ -4153,6 +4274,14 @@
+ ;
+ else if (! strcmp (argv[i], "-print-sysroot-headers-suffix"))
+ ;
++#ifdef TARGET_FLEXLM
++ else if (! strcmp (argv[i], "-flicense-me"))
++ ;
++ else if (! strcmp (argv[i], "-ffeature-proxy"))
++ ;
++ else if (! strcmp (argv[i], "-fno-feature-proxy"))
++ ;
++#endif
+ else if (! strncmp (argv[i], "--sysroot=", strlen ("--sysroot=")))
+ {
+ target_system_root = argv[i] + strlen ("--sysroot=");
+@@ -4616,27 +4745,53 @@
+
+ if (argbuf_index > 0)
+ {
+- int i, first;
++ int i, first, n;
+
+ first = n_switches;
+- n_switches += argbuf_index;
+- switches = XRESIZEVEC (struct switchstr, switches, n_switches + 1);
++ n = n_switches + argbuf_index;
++ switches = XRESIZEVEC (struct switchstr, switches, n + 1);
++ switches[n] = switches[first];
+
+ switches[n_switches] = switches[first];
+ for (i = 0; i < argbuf_index; i++)
+ {
+ struct switchstr *sw;
++ const char *p = &argbuf[i][1];
++ int c = *p;
+
+ /* Each switch should start with '-'. */
+ if (argbuf[i][0] != '-')
+ fatal ("switch '%s' does not start with '-'", argbuf[i]);
+
+- sw = &switches[i + first];
++ sw = &switches[n_switches];
+ sw->part1 = &argbuf[i][1];
+ sw->args = 0;
+ sw->live_cond = 0;
+ sw->validated = 0;
+ sw->ordering = 0;
++
++ /* Deal with option arguments in separate argv elements. */
++ if ((SWITCH_TAKES_ARG (c) > (p[1] != 0))
++ || WORD_SWITCH_TAKES_ARG (p))
++ {
++ int j = 0;
++ int n_args = WORD_SWITCH_TAKES_ARG (p);
++
++ if (n_args == 0)
++ {
++ /* Count only the option arguments in separate argv elements. */
++ n_args = SWITCH_TAKES_ARG (c) - (p[1] != 0);
++ }
++ if (i + n_args >= argbuf_index)
++ fatal ("argument to '-%s' is missing", p);
++ switches[n_switches].args
++ = XNEWVEC (const char *, n_args + 1);
++ while (j < n_args)
++ switches[n_switches].args[j++] = argbuf[++i];
++ /* Null-terminate the vector. */
++ switches[n_switches].args[j] = 0;
++ }
++ n_switches++;
+ }
+ }
+ }
+@@ -6225,6 +6380,10 @@
+ const char *p;
+ struct user_specs *uptr;
+ char **old_argv = argv;
++#ifdef CSL_LICENSE_FEATURE
++ csl_license_impl *license_impl = csl_license_subproc;
++ csl_license *license = NULL;
++#endif
+
+ /* Initialize here, not in definition. The IRIX 6 O32 cc sometimes chokes
+ on ?: in file-scope variable initializations. */
+@@ -6792,10 +6951,84 @@
+ }
+ else
+ {
+- value = do_spec (input_file_compiler->spec);
++ value = 0;
++
++#ifdef CSL_LICENSE_FEATURE
++ if (!license_checked)
++ {
++ const char *subproc, *found_subproc;
++# ifdef TARGET_FLEXLM
++ const char *subproc_argv[10];
++ const char **p;
++ subproc = "get_feature";
++ p = subproc_argv;
++ *p++ = subproc;
++ if (feature_proxy_flag)
++ *p++ = "-p";
++ *p++ = "-co";
++ *p++ = xstrdup (DEFAULT_TARGET_MACHINE);
++ *p++ = "-v";
++ *p++ = "3.3";
++ *p++ = "gnu";
++ *p++ = infiles[i].language;
++ *p++ = (license_me_flag ? "-flicense-me" : "");
++ *p++ = 0;
++# else /* !defined (TARGET_FLEXLM) */
++ const char **subproc_argv = NULL;
++ subproc = CSL_LICENSE_PROG;
++# endif /* !defined (TARGET_FLEXLM) */
++ /* Find the licensing program. */
++ found_subproc = find_a_file (&exec_prefixes,
++ subproc,
++ X_OK,
++ /*multilib=*/false);
++ if (found_subproc)
++ subproc = found_subproc;
++ /* Begin checking out the license. */
++ license
++ = csl_subproc_license_new (CSL_LICENSE_FEATURE,
++ CSL_LICENSE_VERSION,
++ /*argcp=*/NULL,
++ /*argvp=*/NULL,
++ subproc,
++ subproc_argv);
++ if (!license)
++ {
++ error ("could not invoke license program");
++ license_checked = -1;
++ }
++ }
++ if (license_checked == -1 && license_me_flag)
++ value = -1;
++#endif /* defined (CSL_LICENSE_FEATURE) */
++ /* Now do the compile. */
++ if (!value)
++ value = do_spec (input_file_compiler->spec);
+ infiles[i].compiled = true;
+ if (value < 0)
+ this_file_error = 1;
++#ifdef CSL_LICENSE_FEATURE
++ if (!license_checked && license)
++ {
++ /* Finish checking out the license. */
++ const csl_license_status *license_status;
++ if (!license_impl->license_check (license,
++ &license_status))
++ {
++ if (license_me_flag) /* WRS LOCAL */
++ error ("%s", license_status->msg);
++ /* Remember that the license check failed so
++ that we (a) do not check again, and (b) issue
++ errors about other files as well. */
++ license_checked = -1;
++ if (license_me_flag) /* WRS LOCAL */
++ /* Remove this file. */
++ this_file_error = 1;
++ }
++ else
++ license_checked = 1;
++ }
++#endif /* defined (CSL_LICENSE_FEATURE) */
+ }
+ }
+
+@@ -6873,7 +7106,9 @@
+ " to the linker.\n\n"));
+ fflush (stdout);
+ }
++ executing_linker = 1;
+ value = do_spec (link_command_spec);
++ executing_linker = 0;
+ if (value < 0)
+ error_count = 1;
+ linker_was_run = (tmp != execution_count);
+@@ -6901,6 +7136,12 @@
+ printf ("%s\n", bug_report_url);
+ }
+
++#ifdef CSL_LICENSE_FEATURE
++ /* Relinquish the license. */
++ if (license)
++ license_impl->license_delete (license);
++#endif
++
+ return (signal_count != 0 ? 2
+ : error_count > 0 ? (pass_exit_codes ? greatest_status : 1)
+ : 0);
+diff -Nur a/gcc/gcse.c b/gcc/gcse.c
+--- a/gcc/gcse.c 2009-04-27 13:55:13.000000000 +0200
++++ b/gcc/gcse.c 2010-01-25 09:50:29.145688053 +0100
+@@ -172,6 +172,7 @@
+ #include "hashtab.h"
+ #include "df.h"
+ #include "dbgcnt.h"
++#include "target.h"
+
+ /* Propagate flow information through back edges and thus enable PRE's
+ moving loop invariant calculations out of loops.
+@@ -1744,7 +1745,9 @@
+ REG_EQUIV notes and if the argument slot is used somewhere
+ explicitly, it means address of parameter has been taken,
+ so we should not extend the lifetime of the pseudo. */
+- && (note == NULL_RTX || ! MEM_P (XEXP (note, 0))))
++ && (note == NULL_RTX || ! MEM_P (XEXP (note, 0)))
++ && ! (targetm.cannot_copy_insn_p && INSN_P (insn)
++ && targetm.cannot_copy_insn_p (insn)))
+ {
+ /* An expression is not anticipatable if its operands are
+ modified before this insn or if this is not the only SET in
+diff -Nur a/gcc/genautomata.c b/gcc/genautomata.c
+--- a/gcc/genautomata.c 2008-09-01 10:57:00.000000000 +0200
++++ b/gcc/genautomata.c 2010-01-25 09:50:29.145688053 +0100
+@@ -1,5 +1,5 @@
+ /* Pipeline hazard description translator.
+- Copyright (C) 2000, 2001, 2002, 2003, 2004, 2005, 2007, 2008
++ Copyright (C) 2000, 2001, 2002, 2003, 2004, 2005, 2007, 2008, 2009
+ Free Software Foundation, Inc.
+
+ Written by Vladimir Makarov <vmakarov@redhat.com>
+@@ -22,21 +22,25 @@
+
+ /* References:
+
+- 1. Detecting pipeline structural hazards quickly. T. Proebsting,
++ 1. The finite state automaton based pipeline hazard recognizer and
++ instruction scheduler in GCC. V. Makarov. Proceedings of GCC
++ summit, 2003.
++
++ 2. Detecting pipeline structural hazards quickly. T. Proebsting,
+ C. Fraser. Proceedings of ACM SIGPLAN-SIGACT Symposium on
+ Principles of Programming Languages, pages 280--286, 1994.
+
+ This article is a good start point to understand usage of finite
+ state automata for pipeline hazard recognizers. But I'd
+- recommend the 2nd article for more deep understanding.
++ recommend the 1st and 3rd article for more deep understanding.
+
+- 2. Efficient Instruction Scheduling Using Finite State Automata:
++ 3. Efficient Instruction Scheduling Using Finite State Automata:
+ V. Bala and N. Rubin, Proceedings of MICRO-28. This is the best
+ article about usage of finite state automata for pipeline hazard
+ recognizers.
+
+- The current implementation is different from the 2nd article in the
+- following:
++ The current implementation is described in the 1st article and it
++ is different from the 3rd article in the following:
+
+ 1. New operator `|' (alternative) is permitted in functional unit
+ reservation which can be treated deterministically and
+@@ -463,7 +467,10 @@
+ insn. */
+ int insn_num;
+ /* The following field value is list of bypasses in which given insn
+- is output insn. */
++ is output insn. Bypasses with the same input insn stay one after
++ another in the list in the same order as their occurrences in the
++ description but the bypass without a guard stays always the last
++ in a row of bypasses with the same input insn. */
+ struct bypass_decl *bypass_list;
+
+ /* The following fields are defined by automaton generator. */
+@@ -2367,18 +2374,67 @@
+ }
+
+
+-/* The function searches for bypass with given IN_INSN_RESERV in given
+- BYPASS_LIST. */
+-static struct bypass_decl *
+-find_bypass (struct bypass_decl *bypass_list,
+- struct insn_reserv_decl *in_insn_reserv)
+-{
+- struct bypass_decl *bypass;
+-
+- for (bypass = bypass_list; bypass != NULL; bypass = bypass->next)
+- if (bypass->in_insn_reserv == in_insn_reserv)
+- break;
+- return bypass;
++/* The function inserts BYPASS in the list of bypasses of the
++ corresponding output insn. The order of bypasses in the list is
++ decribed in a comment for member `bypass_list' (see above). If
++ there is already the same bypass in the list the function reports
++ this and does nothing. */
++static void
++insert_bypass (struct bypass_decl *bypass)
++{
++ struct bypass_decl *curr, *last;
++ struct insn_reserv_decl *out_insn_reserv = bypass->out_insn_reserv;
++ struct insn_reserv_decl *in_insn_reserv = bypass->in_insn_reserv;
++
++ for (curr = out_insn_reserv->bypass_list, last = NULL;
++ curr != NULL;
++ last = curr, curr = curr->next)
++ if (curr->in_insn_reserv == in_insn_reserv)
++ {
++ if ((bypass->bypass_guard_name != NULL
++ && curr->bypass_guard_name != NULL
++ && ! strcmp (bypass->bypass_guard_name, curr->bypass_guard_name))
++ || bypass->bypass_guard_name == curr->bypass_guard_name)
++ {
++ if (bypass->bypass_guard_name == NULL)
++ {
++ if (!w_flag)
++ error ("the same bypass `%s - %s' is already defined",
++ bypass->out_insn_name, bypass->in_insn_name);
++ else
++ warning (0, "the same bypass `%s - %s' is already defined",
++ bypass->out_insn_name, bypass->in_insn_name);
++ }
++ else if (!w_flag)
++ error ("the same bypass `%s - %s' (guard %s) is already defined",
++ bypass->out_insn_name, bypass->in_insn_name,
++ bypass->bypass_guard_name);
++ else
++ warning
++ (0, "the same bypass `%s - %s' (guard %s) is already defined",
++ bypass->out_insn_name, bypass->in_insn_name,
++ bypass->bypass_guard_name);
++ return;
++ }
++ if (curr->bypass_guard_name == NULL)
++ break;
++ if (curr->next == NULL || curr->next->in_insn_reserv != in_insn_reserv)
++ {
++ last = curr;
++ break;
++ }
++
++ }
++ if (last == NULL)
++ {
++ bypass->next = out_insn_reserv->bypass_list;
++ out_insn_reserv->bypass_list = bypass;
++ }
++ else
++ {
++ bypass->next = last->next;
++ last->next = bypass;
++ }
+ }
+
+ /* The function processes pipeline description declarations, checks
+@@ -2391,7 +2447,6 @@
+ decl_t decl_in_table;
+ decl_t out_insn_reserv;
+ decl_t in_insn_reserv;
+- struct bypass_decl *bypass;
+ int automaton_presence;
+ int i;
+
+@@ -2514,36 +2569,7 @@
+ = DECL_INSN_RESERV (out_insn_reserv);
+ DECL_BYPASS (decl)->in_insn_reserv
+ = DECL_INSN_RESERV (in_insn_reserv);
+- bypass
+- = find_bypass (DECL_INSN_RESERV (out_insn_reserv)->bypass_list,
+- DECL_BYPASS (decl)->in_insn_reserv);
+- if (bypass != NULL)
+- {
+- if (DECL_BYPASS (decl)->latency == bypass->latency)
+- {
+- if (!w_flag)
+- error
+- ("the same bypass `%s - %s' is already defined",
+- DECL_BYPASS (decl)->out_insn_name,
+- DECL_BYPASS (decl)->in_insn_name);
+- else
+- warning
+- (0, "the same bypass `%s - %s' is already defined",
+- DECL_BYPASS (decl)->out_insn_name,
+- DECL_BYPASS (decl)->in_insn_name);
+- }
+- else
+- error ("bypass `%s - %s' is already defined",
+- DECL_BYPASS (decl)->out_insn_name,
+- DECL_BYPASS (decl)->in_insn_name);
+- }
+- else
+- {
+- DECL_BYPASS (decl)->next
+- = DECL_INSN_RESERV (out_insn_reserv)->bypass_list;
+- DECL_INSN_RESERV (out_insn_reserv)->bypass_list
+- = DECL_BYPASS (decl);
+- }
++ insert_bypass (DECL_BYPASS (decl));
+ }
+ }
+ }
+@@ -8159,19 +8185,32 @@
+ (advance_cycle_insn_decl)->insn_num));
+ fprintf (output_file, " case %d:\n",
+ bypass->in_insn_reserv->insn_num);
+- if (bypass->bypass_guard_name == NULL)
+- fprintf (output_file, " return %d;\n",
+- bypass->latency);
+- else
++ for (;;)
+ {
+- fprintf (output_file,
+- " if (%s (%s, %s))\n",
+- bypass->bypass_guard_name, INSN_PARAMETER_NAME,
+- INSN2_PARAMETER_NAME);
+- fprintf (output_file,
+- " return %d;\n break;\n",
+- bypass->latency);
++ if (bypass->bypass_guard_name == NULL)
++ {
++ gcc_assert (bypass->next == NULL
++ || (bypass->in_insn_reserv
++ != bypass->next->in_insn_reserv));
++ fprintf (output_file, " return %d;\n",
++ bypass->latency);
++ }
++ else
++ {
++ fprintf (output_file,
++ " if (%s (%s, %s))\n",
++ bypass->bypass_guard_name, INSN_PARAMETER_NAME,
++ INSN2_PARAMETER_NAME);
++ fprintf (output_file, " return %d;\n",
++ bypass->latency);
++ }
++ if (bypass->next == NULL
++ || bypass->in_insn_reserv != bypass->next->in_insn_reserv)
++ break;
++ bypass = bypass->next;
+ }
++ if (bypass->bypass_guard_name != NULL)
++ fprintf (output_file, " break;\n");
+ }
+ fputs (" }\n break;\n", output_file);
+ }
+diff -Nur a/gcc/gengtype-lex.c b/gcc/gengtype-lex.c
+--- a/gcc/gengtype-lex.c 2009-07-22 09:46:07.000000000 +0200
++++ b/gcc/gengtype-lex.c 1970-01-01 01:00:00.000000000 +0100
+@@ -1,2638 +0,0 @@
+-#line 2 "gengtype-lex.c"
+-
+-#line 4 "gengtype-lex.c"
+-
+-#define YY_INT_ALIGNED short int
+-
+-/* A lexical scanner generated by flex */
+-
+-#define FLEX_SCANNER
+-#define YY_FLEX_MAJOR_VERSION 2
+-#define YY_FLEX_MINOR_VERSION 5
+-#define YY_FLEX_SUBMINOR_VERSION 35
+-#if YY_FLEX_SUBMINOR_VERSION > 0
+-#define FLEX_BETA
+-#endif
+-
+-/* First, we deal with platform-specific or compiler-specific issues. */
+-
+-/* begin standard C headers. */
+-#include <stdio.h>
+-#include <string.h>
+-#include <errno.h>
+-#include <stdlib.h>
+-
+-/* end standard C headers. */
+-
+-/* flex integer type definitions */
+-
+-#ifndef FLEXINT_H
+-#define FLEXINT_H
+-
+-/* C99 systems have <inttypes.h>. Non-C99 systems may or may not. */
+-
+-#if defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L
+-
+-/* C99 says to define __STDC_LIMIT_MACROS before including stdint.h,
+- * if you want the limit (max/min) macros for int types.
+- */
+-#ifndef __STDC_LIMIT_MACROS
+-#define __STDC_LIMIT_MACROS 1
+-#endif
+-
+-#include <inttypes.h>
+-typedef int8_t flex_int8_t;
+-typedef uint8_t flex_uint8_t;
+-typedef int16_t flex_int16_t;
+-typedef uint16_t flex_uint16_t;
+-typedef int32_t flex_int32_t;
+-typedef uint32_t flex_uint32_t;
+-#else
+-typedef signed char flex_int8_t;
+-typedef short int flex_int16_t;
+-typedef int flex_int32_t;
+-typedef unsigned char flex_uint8_t;
+-typedef unsigned short int flex_uint16_t;
+-typedef unsigned int flex_uint32_t;
+-#endif /* ! C99 */
+-
+-/* Limits of integral types. */
+-#ifndef INT8_MIN
+-#define INT8_MIN (-128)
+-#endif
+-#ifndef INT16_MIN
+-#define INT16_MIN (-32767-1)
+-#endif
+-#ifndef INT32_MIN
+-#define INT32_MIN (-2147483647-1)
+-#endif
+-#ifndef INT8_MAX
+-#define INT8_MAX (127)
+-#endif
+-#ifndef INT16_MAX
+-#define INT16_MAX (32767)
+-#endif
+-#ifndef INT32_MAX
+-#define INT32_MAX (2147483647)
+-#endif
+-#ifndef UINT8_MAX
+-#define UINT8_MAX (255U)
+-#endif
+-#ifndef UINT16_MAX
+-#define UINT16_MAX (65535U)
+-#endif
+-#ifndef UINT32_MAX
+-#define UINT32_MAX (4294967295U)
+-#endif
+-
+-#endif /* ! FLEXINT_H */
+-
+-#ifdef __cplusplus
+-
+-/* The "const" storage-class-modifier is valid. */
+-#define YY_USE_CONST
+-
+-#else /* ! __cplusplus */
+-
+-/* C99 requires __STDC__ to be defined as 1. */
+-#if defined (__STDC__)
+-
+-#define YY_USE_CONST
+-
+-#endif /* defined (__STDC__) */
+-#endif /* ! __cplusplus */
+-
+-#ifdef YY_USE_CONST
+-#define yyconst const
+-#else
+-#define yyconst
+-#endif
+-
+-/* Returned upon end-of-file. */
+-#define YY_NULL 0
+-
+-/* Promotes a possibly negative, possibly signed char to an unsigned
+- * integer for use as an array index. If the signed char is negative,
+- * we want to instead treat it as an 8-bit unsigned char, hence the
+- * double cast.
+- */
+-#define YY_SC_TO_UI(c) ((unsigned int) (unsigned char) c)
+-
+-/* Enter a start condition. This macro really ought to take a parameter,
+- * but we do it the disgusting crufty way forced on us by the ()-less
+- * definition of BEGIN.
+- */
+-#define BEGIN (yy_start) = 1 + 2 *
+-
+-/* Translate the current start state into a value that can be later handed
+- * to BEGIN to return to the state. The YYSTATE alias is for lex
+- * compatibility.
+- */
+-#define YY_START (((yy_start) - 1) / 2)
+-#define YYSTATE YY_START
+-
+-/* Action number for EOF rule of a given start state. */
+-#define YY_STATE_EOF(state) (YY_END_OF_BUFFER + state + 1)
+-
+-/* Special action meaning "start processing a new file". */
+-#define YY_NEW_FILE yyrestart(yyin )
+-
+-#define YY_END_OF_BUFFER_CHAR 0
+-
+-/* Size of default input buffer. */
+-#ifndef YY_BUF_SIZE
+-#define YY_BUF_SIZE 16384
+-#endif
+-
+-/* The state buf must be large enough to hold one state per character in the main buffer.
+- */
+-#define YY_STATE_BUF_SIZE ((YY_BUF_SIZE + 2) * sizeof(yy_state_type))
+-
+-#ifndef YY_TYPEDEF_YY_BUFFER_STATE
+-#define YY_TYPEDEF_YY_BUFFER_STATE
+-typedef struct yy_buffer_state *YY_BUFFER_STATE;
+-#endif
+-
+-extern int yyleng;
+-
+-extern FILE *yyin, *yyout;
+-
+-#define EOB_ACT_CONTINUE_SCAN 0
+-#define EOB_ACT_END_OF_FILE 1
+-#define EOB_ACT_LAST_MATCH 2
+-
+- #define YY_LESS_LINENO(n)
+-
+-/* Return all but the first "n" matched characters back to the input stream. */
+-#define yyless(n) \
+- do \
+- { \
+- /* Undo effects of setting up yytext. */ \
+- int yyless_macro_arg = (n); \
+- YY_LESS_LINENO(yyless_macro_arg);\
+- *yy_cp = (yy_hold_char); \
+- YY_RESTORE_YY_MORE_OFFSET \
+- (yy_c_buf_p) = yy_cp = yy_bp + yyless_macro_arg - YY_MORE_ADJ; \
+- YY_DO_BEFORE_ACTION; /* set up yytext again */ \
+- } \
+- while ( 0 )
+-
+-#define unput(c) yyunput( c, (yytext_ptr) )
+-
+-#ifndef YY_TYPEDEF_YY_SIZE_T
+-#define YY_TYPEDEF_YY_SIZE_T
+-typedef size_t yy_size_t;
+-#endif
+-
+-#ifndef YY_STRUCT_YY_BUFFER_STATE
+-#define YY_STRUCT_YY_BUFFER_STATE
+-struct yy_buffer_state
+- {
+- FILE *yy_input_file;
+-
+- char *yy_ch_buf; /* input buffer */
+- char *yy_buf_pos; /* current position in input buffer */
+-
+- /* Size of input buffer in bytes, not including room for EOB
+- * characters.
+- */
+- yy_size_t yy_buf_size;
+-
+- /* Number of characters read into yy_ch_buf, not including EOB
+- * characters.
+- */
+- int yy_n_chars;
+-
+- /* Whether we "own" the buffer - i.e., we know we created it,
+- * and can realloc() it to grow it, and should free() it to
+- * delete it.
+- */
+- int yy_is_our_buffer;
+-
+- /* Whether this is an "interactive" input source; if so, and
+- * if we're using stdio for input, then we want to use getc()
+- * instead of fread(), to make sure we stop fetching input after
+- * each newline.
+- */
+- int yy_is_interactive;
+-
+- /* Whether we're considered to be at the beginning of a line.
+- * If so, '^' rules will be active on the next match, otherwise
+- * not.
+- */
+- int yy_at_bol;
+-
+- int yy_bs_lineno; /**< The line count. */
+- int yy_bs_column; /**< The column count. */
+-
+- /* Whether to try to fill the input buffer when we reach the
+- * end of it.
+- */
+- int yy_fill_buffer;
+-
+- int yy_buffer_status;
+-
+-#define YY_BUFFER_NEW 0
+-#define YY_BUFFER_NORMAL 1
+- /* When an EOF's been seen but there's still some text to process
+- * then we mark the buffer as YY_EOF_PENDING, to indicate that we
+- * shouldn't try reading from the input source any more. We might
+- * still have a bunch of tokens to match, though, because of
+- * possible backing-up.
+- *
+- * When we actually see the EOF, we change the status to "new"
+- * (via yyrestart()), so that the user can continue scanning by
+- * just pointing yyin at a new input file.
+- */
+-#define YY_BUFFER_EOF_PENDING 2
+-
+- };
+-#endif /* !YY_STRUCT_YY_BUFFER_STATE */
+-
+-/* Stack of input buffers. */
+-static size_t yy_buffer_stack_top = 0; /**< index of top of stack. */
+-static size_t yy_buffer_stack_max = 0; /**< capacity of stack. */
+-static YY_BUFFER_STATE * yy_buffer_stack = 0; /**< Stack as an array. */
+-
+-/* We provide macros for accessing buffer states in case in the
+- * future we want to put the buffer states in a more general
+- * "scanner state".
+- *
+- * Returns the top of the stack, or NULL.
+- */
+-#define YY_CURRENT_BUFFER ( (yy_buffer_stack) \
+- ? (yy_buffer_stack)[(yy_buffer_stack_top)] \
+- : NULL)
+-
+-/* Same as previous macro, but useful when we know that the buffer stack is not
+- * NULL or when we need an lvalue. For internal use only.
+- */
+-#define YY_CURRENT_BUFFER_LVALUE (yy_buffer_stack)[(yy_buffer_stack_top)]
+-
+-/* yy_hold_char holds the character lost when yytext is formed. */
+-static char yy_hold_char;
+-static int yy_n_chars; /* number of characters read into yy_ch_buf */
+-int yyleng;
+-
+-/* Points to current character in buffer. */
+-static char *yy_c_buf_p = (char *) 0;
+-static int yy_init = 0; /* whether we need to initialize */
+-static int yy_start = 0; /* start state number */
+-
+-/* Flag which is used to allow yywrap()'s to do buffer switches
+- * instead of setting up a fresh yyin. A bit of a hack ...
+- */
+-static int yy_did_buffer_switch_on_eof;
+-
+-void yyrestart (FILE *input_file );
+-void yy_switch_to_buffer (YY_BUFFER_STATE new_buffer );
+-YY_BUFFER_STATE yy_create_buffer (FILE *file,int size );
+-void yy_delete_buffer (YY_BUFFER_STATE b );
+-void yy_flush_buffer (YY_BUFFER_STATE b );
+-void yypush_buffer_state (YY_BUFFER_STATE new_buffer );
+-void yypop_buffer_state (void );
+-
+-static void yyensure_buffer_stack (void );
+-static void yy_load_buffer_state (void );
+-static void yy_init_buffer (YY_BUFFER_STATE b,FILE *file );
+-
+-#define YY_FLUSH_BUFFER yy_flush_buffer(YY_CURRENT_BUFFER )
+-
+-YY_BUFFER_STATE yy_scan_buffer (char *base,yy_size_t size );
+-YY_BUFFER_STATE yy_scan_string (yyconst char *yy_str );
+-YY_BUFFER_STATE yy_scan_bytes (yyconst char *bytes,int len );
+-
+-void *yyalloc (yy_size_t );
+-void *yyrealloc (void *,yy_size_t );
+-void yyfree (void * );
+-
+-#define yy_new_buffer yy_create_buffer
+-
+-#define yy_set_interactive(is_interactive) \
+- { \
+- if ( ! YY_CURRENT_BUFFER ){ \
+- yyensure_buffer_stack (); \
+- YY_CURRENT_BUFFER_LVALUE = \
+- yy_create_buffer(yyin,YY_BUF_SIZE ); \
+- } \
+- YY_CURRENT_BUFFER_LVALUE->yy_is_interactive = is_interactive; \
+- }
+-
+-#define yy_set_bol(at_bol) \
+- { \
+- if ( ! YY_CURRENT_BUFFER ){\
+- yyensure_buffer_stack (); \
+- YY_CURRENT_BUFFER_LVALUE = \
+- yy_create_buffer(yyin,YY_BUF_SIZE ); \
+- } \
+- YY_CURRENT_BUFFER_LVALUE->yy_at_bol = at_bol; \
+- }
+-
+-#define YY_AT_BOL() (YY_CURRENT_BUFFER_LVALUE->yy_at_bol)
+-
+-/* Begin user sect3 */
+-
+-#define yywrap(n) 1
+-#define YY_SKIP_YYWRAP
+-
+-typedef unsigned char YY_CHAR;
+-
+-FILE *yyin = (FILE *) 0, *yyout = (FILE *) 0;
+-
+-typedef int yy_state_type;
+-
+-extern int yylineno;
+-
+-int yylineno = 1;
+-
+-extern char *yytext;
+-#define yytext_ptr yytext
+-
+-static yy_state_type yy_get_previous_state (void );
+-static yy_state_type yy_try_NUL_trans (yy_state_type current_state );
+-static int yy_get_next_buffer (void );
+-static void yy_fatal_error (yyconst char msg[] );
+-
+-/* Done after the current pattern has been matched and before the
+- * corresponding action - sets up yytext.
+- */
+-#define YY_DO_BEFORE_ACTION \
+- (yytext_ptr) = yy_bp; \
+- yyleng = (size_t) (yy_cp - yy_bp); \
+- (yy_hold_char) = *yy_cp; \
+- *yy_cp = '\0'; \
+- (yy_c_buf_p) = yy_cp;
+-
+-#define YY_NUM_RULES 49
+-#define YY_END_OF_BUFFER 50
+-/* This struct is not used in this scanner,
+- but its presence is necessary. */
+-struct yy_trans_info
+- {
+- flex_int32_t yy_verify;
+- flex_int32_t yy_nxt;
+- };
+-static yyconst flex_int16_t yy_accept[445] =
+- { 0,
+- 0, 0, 0, 0, 0, 0, 0, 0, 50, 36,
+- 36, 33, 45, 36, 45, 34, 36, 36, 34, 34,
+- 34, 34, 34, 31, 10, 10, 31, 29, 31, 31,
+- 31, 20, 31, 31, 31, 31, 31, 31, 31, 31,
+- 31, 31, 31, 31, 31, 31, 31, 31, 31, 31,
+- 31, 10, 31, 41, 39, 46, 46, 0, 0, 0,
+- 37, 0, 0, 0, 38, 32, 34, 0, 0, 0,
+- 0, 0, 0, 0, 0, 0, 34, 34, 34, 34,
+- 34, 10, 0, 25, 0, 0, 0, 0, 9, 20,
+- 24, 0, 0, 0, 0, 0, 0, 0, 0, 26,
+-
+- 11, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+- 0, 0, 0, 0, 0, 10, 0, 0, 0, 0,
+- 42, 44, 43, 0, 35, 0, 0, 0, 0, 0,
+- 0, 34, 34, 34, 34, 34, 34, 27, 28, 0,
+- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+- 0, 0, 0, 30, 0, 0, 0, 0, 0, 0,
+- 0, 0, 0, 0, 34, 34, 34, 34, 34, 34,
+- 0, 0, 0, 13, 0, 14, 0, 0, 0, 0,
+- 22, 22, 0, 0, 0, 0, 0, 0, 0, 0,
+-
+- 0, 0, 0, 48, 0, 0, 0, 0, 0, 0,
+- 0, 34, 34, 34, 34, 34, 34, 0, 0, 0,
+- 0, 0, 17, 0, 0, 0, 0, 0, 0, 0,
+- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+- 0, 0, 0, 0, 0, 0, 0, 0, 0, 34,
+- 34, 34, 34, 34, 3, 0, 0, 0, 0, 12,
+- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+- 0, 0, 0, 0, 0, 0, 15, 0, 0, 0,
+- 0, 0, 0, 0, 34, 4, 5, 2, 34, 0,
+- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+-
+- 0, 0, 0, 0, 0, 0, 0, 0, 0, 16,
+- 0, 0, 0, 0, 34, 1, 0, 0, 0, 0,
+- 0, 0, 0, 0, 0, 22, 22, 0, 0, 0,
+- 0, 0, 0, 0, 0, 0, 0, 34, 34, 34,
+- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+- 21, 0, 0, 0, 0, 0, 0, 34, 7, 6,
+- 0, 0, 0, 0, 0, 0, 0, 0, 0, 18,
+- 0, 0, 0, 34, 0, 0, 0, 0, 0, 0,
+- 0, 0, 19, 0, 0, 47, 34, 0, 0, 0,
+- 0, 0, 0, 0, 0, 0, 0, 34, 0, 0,
+-
+- 0, 0, 0, 0, 0, 0, 34, 0, 24, 24,
+- 0, 0, 0, 0, 0, 0, 0, 34, 0, 0,
+- 0, 0, 0, 0, 0, 0, 0, 0, 0, 8,
+- 0, 23, 0, 0, 0, 0, 0, 40, 0, 0,
+- 0, 0, 0, 0
+- } ;
+-
+-static yyconst flex_int32_t yy_ec[256] =
+- { 0,
+- 1, 1, 1, 1, 1, 1, 1, 1, 2, 3,
+- 2, 2, 2, 1, 1, 1, 1, 1, 1, 1,
+- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+- 1, 2, 1, 4, 5, 1, 6, 1, 7, 8,
+- 9, 10, 1, 6, 6, 11, 12, 13, 13, 13,
+- 13, 13, 13, 13, 13, 13, 13, 6, 6, 6,
+- 6, 6, 1, 1, 14, 15, 16, 17, 18, 19,
+- 20, 21, 22, 23, 23, 24, 25, 26, 27, 28,
+- 23, 29, 30, 31, 32, 33, 34, 23, 35, 23,
+- 36, 37, 38, 1, 39, 1, 40, 41, 42, 43,
+-
+- 44, 45, 46, 47, 48, 49, 49, 50, 51, 52,
+- 53, 54, 49, 55, 56, 57, 58, 59, 49, 60,
+- 61, 62, 6, 6, 6, 1, 1, 1, 1, 1,
+- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+-
+- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+- 1, 1, 1, 1, 1
+- } ;
+-
+-static yyconst flex_int32_t yy_meta[63] =
+- { 0,
+- 1, 2, 3, 1, 1, 1, 1, 1, 4, 5,
+- 1, 1, 6, 7, 7, 7, 7, 7, 7, 7,
+- 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
+- 7, 7, 7, 7, 7, 8, 1, 1, 9, 9,
+- 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+- 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+- 9, 9
+- } ;
+-
+-static yyconst flex_int16_t yy_base[483] =
+- { 0,
+- 0, 38, 96, 12, 12, 13, 15, 16, 1028, 1444,
+- 32, 51, 20, 990, 1016, 0, 157, 18, 1007, 964,
+- 966, 961, 969, 1444, 25, 27, 27, 1444, 983, 1008,
+- 1008, 1004, 215, 253, 5, 32, 29, 974, 45, 962,
+- 996, 35, 38, 39, 40, 41, 134, 42, 136, 137,
+- 138, 75, 996, 0, 1444, 985, 984, 166, 964, 162,
+- 1444, 0, 987, 990, 1444, 1444, 0, 186, 165, 974,
+- 931, 933, 928, 936, 168, 943, 967, 928, 140, 930,
+- 935, 87, 167, 1444, 979, 974, 977, 968, 1444, 950,
+- 1444, 935, 934, 145, 52, 46, 148, 165, 922, 1444,
+-
+- 1444, 152, 156, 155, 170, 173, 175, 182, 183, 185,
+- 211, 214, 222, 218, 221, 269, 957, 956, 291, 0,
+- 1444, 1444, 1444, 922, 1444, 937, 898, 195, 900, 905,
+- 907, 912, 906, 892, 890, 903, 893, 1444, 1444, 209,
+- 254, 251, 353, 248, 391, 354, 350, 351, 340, 355,
+- 341, 429, 339, 356, 344, 347, 360, 390, 43, 361,
+- 391, 395, 429, 1444, 0, 0, 280, 906, 900, 886,
+- 884, 897, 872, 876, 890, 867, 873, 878, 876, 866,
+- 381, 348, 382, 1444, 384, 1444, 389, 397, 491, 398,
+- 1444, 528, 418, 399, 420, 477, 478, 422, 421, 480,
+-
+- 479, 0, 449, 1444, 884, 861, 867, 872, 870, 860,
+- 859, 892, 857, 866, 850, 862, 586, 493, 496, 494,
+- 484, 624, 1444, 0, 878, 876, 876, 834, 839, 841,
+- 832, 830, 199, 830, 490, 499, 486, 492, 488, 489,
+- 662, 0, 863, 828, 837, 821, 833, 0, 832, 859,
+- 700, 738, 776, 829, 1444, 431, 258, 437, 515, 1444,
+- 846, 844, 841, 817, 829, 809, 319, 815, 813, 478,
+- 809, 512, 528, 520, 525, 814, 1444, 0, 833, 0,
+- 0, 0, 803, 551, 808, 1444, 1444, 1444, 852, 383,
+- 521, 530, 539, 822, 829, 813, 793, 787, 802, 801,
+-
+- 556, 793, 783, 785, 792, 787, 523, 545, 535, 1444,
+- 0, 795, 0, 561, 585, 1444, 555, 343, 581, 584,
+- 794, 811, 792, 773, 772, 1444, 0, 771, 783, 772,
+- 764, 552, 890, 558, 0, 623, 778, 784, 928, 966,
+- 583, 593, 594, 613, 792, 792, 771, 761, 746, 591,
+- 1444, 1004, 0, 778, 0, 0, 766, 776, 1444, 1444,
+- 620, 621, 626, 627, 653, 777, 769, 775, 1042, 1444,
+- 0, 772, 787, 767, 556, 577, 615, 649, 629, 762,
+- 753, 774, 1444, 0, 763, 1444, 773, 632, 659, 662,
+- 656, 654, 754, 742, 753, 0, 754, 729, 665, 688,
+-
+- 667, 744, 742, 683, 0, 695, 692, 689, 715, 722,
+- 699, 711, 701, 666, 673, 0, 705, 1080, 704, 749,
+- 751, 753, 756, 663, 658, 618, 593, 0, 0, 1444,
+- 758, 1444, 760, 600, 588, 543, 483, 1444, 439, 386,
+- 247, 206, 167, 1444, 1118, 1127, 1136, 1145, 1154, 1158,
+- 1167, 1176, 1185, 1194, 1202, 1211, 1220, 1229, 1238, 1247,
+- 1256, 1265, 1273, 1282, 1290, 1298, 1306, 1314, 1323, 1331,
+- 1340, 1349, 1357, 1365, 1374, 1383, 1392, 1400, 1409, 1417,
+- 1426, 1435
+- } ;
+-
+-static yyconst flex_int16_t yy_def[483] =
+- { 0,
+- 445, 445, 444, 3, 446, 446, 446, 446, 444, 444,
+- 444, 444, 447, 448, 449, 450, 444, 444, 450, 450,
+- 450, 450, 450, 444, 444, 444, 451, 444, 452, 444,
+- 444, 444, 453, 453, 34, 34, 34, 34, 34, 454,
+- 444, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+- 34, 444, 455, 456, 444, 457, 457, 444, 444, 447,
+- 444, 447, 444, 448, 444, 444, 450, 444, 444, 444,
+- 444, 444, 444, 444, 444, 444, 450, 450, 450, 450,
+- 450, 444, 451, 444, 451, 444, 452, 444, 444, 444,
+- 444, 34, 34, 34, 34, 34, 34, 34, 454, 444,
+-
+- 444, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+- 34, 34, 34, 34, 34, 444, 455, 455, 444, 458,
+- 444, 444, 444, 444, 444, 444, 444, 444, 444, 444,
+- 444, 450, 450, 450, 450, 450, 450, 444, 444, 34,
+- 34, 34, 453, 34, 453, 34, 34, 34, 34, 34,
+- 34, 453, 34, 34, 34, 34, 34, 34, 34, 34,
+- 34, 34, 119, 444, 119, 459, 444, 444, 444, 444,
+- 444, 444, 444, 444, 450, 450, 450, 450, 450, 450,
+- 34, 34, 34, 444, 34, 444, 34, 34, 453, 34,
+- 444, 444, 34, 34, 34, 34, 34, 34, 34, 34,
+-
+- 34, 460, 444, 444, 444, 444, 444, 444, 444, 444,
+- 444, 450, 450, 450, 450, 450, 450, 34, 34, 34,
+- 34, 453, 444, 192, 444, 444, 444, 444, 444, 444,
+- 444, 444, 444, 444, 34, 34, 34, 34, 34, 34,
+- 453, 461, 444, 444, 444, 444, 444, 462, 444, 450,
+- 450, 450, 450, 450, 444, 34, 34, 34, 34, 444,
+- 444, 444, 444, 444, 444, 444, 444, 444, 444, 444,
+- 444, 34, 34, 34, 34, 453, 444, 463, 444, 464,
+- 465, 466, 444, 444, 450, 444, 444, 444, 450, 34,
+- 34, 34, 34, 444, 444, 444, 444, 444, 444, 444,
+-
+- 467, 444, 444, 444, 444, 444, 34, 34, 34, 444,
+- 468, 444, 469, 444, 450, 444, 34, 34, 34, 34,
+- 444, 444, 444, 444, 444, 444, 192, 444, 444, 444,
+- 444, 34, 453, 34, 470, 444, 444, 450, 450, 450,
+- 34, 34, 34, 34, 444, 444, 444, 444, 444, 34,
+- 444, 453, 471, 444, 472, 473, 444, 450, 444, 444,
+- 34, 34, 34, 34, 34, 444, 444, 444, 453, 444,
+- 474, 444, 444, 450, 34, 34, 34, 34, 34, 444,
+- 444, 444, 444, 475, 444, 444, 450, 34, 34, 34,
+- 34, 34, 444, 444, 444, 476, 444, 450, 34, 34,
+-
+- 34, 444, 444, 444, 477, 444, 450, 34, 444, 478,
+- 34, 444, 444, 444, 444, 479, 444, 450, 34, 444,
+- 478, 478, 480, 444, 444, 444, 444, 481, 482, 444,
+- 444, 444, 480, 444, 444, 444, 444, 444, 444, 444,
+- 444, 444, 444, 0, 444, 444, 444, 444, 444, 444,
+- 444, 444, 444, 444, 444, 444, 444, 444, 444, 444,
+- 444, 444, 444, 444, 444, 444, 444, 444, 444, 444,
+- 444, 444, 444, 444, 444, 444, 444, 444, 444, 444,
+- 444, 444
+- } ;
+-
+-static yyconst flex_int16_t yy_nxt[1507] =
+- { 0,
+- 10, 11, 12, 13, 10, 10, 14, 10, 10, 10,
+- 10, 15, 10, 52, 55, 55, 53, 55, 55, 75,
+- 444, 56, 56, 61, 57, 57, 82, 82, 82, 82,
+- 84, 92, 94, 58, 58, 10, 10, 10, 10, 17,
+- 12, 13, 18, 10, 14, 10, 10, 10, 10, 15,
+- 10, 59, 58, 58, 19, 92, 62, 95, 92, 96,
+- 76, 92, 98, 85, 92, 92, 92, 92, 92, 92,
+- 59, 92, 92, 10, 10, 10, 116, 82, 92, 117,
+- 143, 20, 105, 142, 103, 109, 198, 102, 82, 82,
+- 104, 106, 107, 21, 22, 23, 24, 25, 26, 27,
+-
+- 24, 28, 29, 28, 28, 28, 30, 31, 32, 33,
+- 34, 35, 33, 36, 33, 37, 38, 33, 33, 33,
+- 33, 33, 33, 33, 33, 33, 33, 33, 39, 33,
+- 33, 40, 41, 24, 33, 33, 42, 43, 44, 45,
+- 33, 33, 33, 46, 33, 47, 33, 48, 33, 49,
+- 33, 50, 33, 51, 33, 33, 33, 33, 68, 58,
+- 92, 69, 92, 92, 92, 61, 75, 58, 58, 75,
+- 84, 92, 141, 70, 92, 110, 59, 144, 92, 134,
+- 145, 92, 92, 112, 113, 59, 108, 68, 58, 115,
+- 69, 92, 111, 114, 135, 147, 92, 301, 62, 92,
+-
+- 71, 92, 70, 85, 146, 59, 148, 76, 92, 92,
+- 76, 92, 72, 73, 74, 91, 91, 91, 91, 91,
+- 91, 91, 91, 91, 91, 91, 91, 151, 149, 71,
+- 150, 152, 181, 153, 170, 92, 301, 92, 154, 155,
+- 92, 72, 73, 74, 92, 269, 270, 92, 92, 171,
+- 91, 91, 91, 91, 91, 91, 91, 91, 91, 91,
+- 91, 91, 91, 91, 91, 156, 157, 158, 161, 182,
+- 116, 82, 160, 117, 92, 183, 162, 92, 185, 93,
+- 92, 203, 203, 159, 92, 443, 291, 204, 91, 91,
+- 91, 163, 163, 164, 163, 163, 163, 163, 163, 163,
+-
+- 163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+- 163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+- 163, 163, 163, 163, 163, 163, 163, 163, 163, 165,
+- 165, 165, 165, 165, 165, 165, 165, 165, 165, 165,
+- 165, 165, 165, 165, 165, 165, 165, 165, 165, 165,
+- 165, 165, 165, 184, 184, 184, 184, 184, 184, 184,
+- 184, 184, 184, 184, 184, 92, 92, 92, 219, 92,
+- 92, 300, 342, 92, 92, 301, 92, 92, 188, 190,
+- 92, 92, 92, 194, 152, 195, 92, 92, 184, 184,
+- 184, 186, 186, 186, 186, 186, 186, 186, 186, 186,
+-
+- 186, 186, 186, 152, 152, 189, 187, 92, 92, 92,
+- 92, 442, 193, 317, 196, 92, 92, 92, 199, 218,
+- 220, 92, 221, 92, 92, 92, 186, 186, 186, 191,
+- 192, 192, 191, 191, 191, 191, 191, 191, 191, 191,
+- 191, 197, 201, 200, 92, 222, 92, 92, 92, 236,
+- 203, 203, 290, 152, 152, 441, 204, 92, 292, 237,
+- 239, 235, 240, 92, 191, 191, 191, 163, 163, 163,
+- 163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+- 163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+- 163, 223, 223, 223, 223, 223, 223, 223, 223, 223,
+-
+- 223, 223, 223, 92, 92, 92, 92, 256, 258, 257,
+- 92, 273, 92, 301, 92, 92, 92, 259, 92, 92,
+- 92, 238, 92, 304, 158, 92, 223, 223, 223, 224,
+- 224, 241, 272, 152, 152, 275, 293, 274, 92, 305,
+- 273, 92, 225, 226, 152, 276, 92, 92, 227, 92,
+- 307, 92, 314, 314, 92, 320, 92, 327, 327, 318,
+- 319, 92, 314, 314, 440, 92, 274, 308, 228, 229,
+- 230, 92, 309, 341, 334, 231, 332, 232, 92, 388,
+- 337, 92, 92, 233, 92, 234, 255, 255, 255, 255,
+- 255, 255, 255, 255, 255, 255, 255, 255, 338, 343,
+-
+- 333, 344, 389, 92, 361, 439, 339, 92, 350, 92,
+- 92, 340, 340, 352, 362, 363, 301, 92, 437, 92,
+- 92, 255, 255, 255, 260, 260, 260, 260, 260, 260,
+- 260, 260, 260, 260, 260, 260, 354, 375, 390, 92,
+- 376, 92, 364, 377, 355, 369, 92, 92, 152, 356,
+- 356, 365, 92, 92, 392, 92, 436, 378, 92, 260,
+- 260, 260, 277, 277, 277, 277, 277, 277, 277, 277,
+- 277, 277, 277, 277, 379, 92, 399, 401, 400, 92,
+- 92, 408, 92, 435, 152, 92, 434, 391, 92, 409,
+- 409, 92, 411, 92, 427, 410, 426, 277, 277, 277,
+-
+- 286, 286, 286, 286, 286, 286, 286, 286, 286, 286,
+- 286, 286, 414, 418, 92, 92, 420, 420, 418, 418,
+- 425, 415, 421, 422, 422, 92, 429, 419, 424, 152,
+- 92, 429, 429, 417, 152, 286, 286, 286, 287, 287,
+- 287, 287, 287, 287, 287, 287, 287, 287, 287, 287,
+- 420, 420, 422, 422, 422, 422, 421, 431, 431, 431,
+- 431, 431, 431, 413, 432, 412, 432, 407, 432, 406,
+- 404, 403, 402, 287, 287, 287, 288, 288, 288, 288,
+- 288, 288, 288, 288, 288, 288, 288, 288, 398, 397,
+- 395, 394, 393, 387, 386, 385, 382, 381, 380, 374,
+-
+- 373, 372, 301, 301, 368, 367, 366, 358, 357, 304,
+- 349, 288, 288, 288, 310, 310, 310, 310, 310, 310,
+- 310, 310, 310, 310, 310, 310, 348, 301, 301, 301,
+- 347, 346, 345, 336, 331, 330, 329, 328, 301, 325,
+- 324, 301, 301, 323, 322, 321, 315, 313, 312, 310,
+- 310, 310, 316, 316, 316, 316, 316, 316, 316, 316,
+- 316, 316, 316, 316, 306, 303, 302, 299, 298, 297,
+- 296, 295, 294, 289, 285, 284, 283, 282, 281, 280,
+- 279, 271, 268, 267, 266, 265, 264, 316, 316, 316,
+- 351, 351, 351, 351, 351, 351, 351, 351, 351, 351,
+-
+- 351, 351, 263, 262, 261, 254, 253, 252, 251, 250,
+- 249, 248, 247, 246, 245, 244, 243, 217, 216, 215,
+- 214, 213, 212, 211, 210, 351, 351, 351, 359, 359,
+- 359, 359, 359, 359, 359, 359, 359, 359, 359, 359,
+- 209, 208, 207, 206, 205, 180, 179, 178, 177, 176,
+- 175, 174, 173, 172, 169, 168, 167, 118, 118, 100,
+- 140, 92, 90, 359, 359, 359, 360, 360, 360, 360,
+- 360, 360, 360, 360, 360, 360, 360, 360, 139, 444,
+- 138, 444, 137, 136, 133, 132, 131, 130, 129, 128,
+- 127, 126, 444, 125, 124, 123, 122, 118, 101, 100,
+-
+- 97, 360, 360, 360, 370, 370, 370, 370, 370, 370,
+- 370, 370, 370, 370, 370, 370, 90, 89, 88, 87,
+- 81, 80, 79, 78, 77, 66, 64, 444, 444, 444,
+- 444, 444, 444, 444, 444, 444, 444, 444, 444, 370,
+- 370, 370, 383, 383, 383, 383, 383, 383, 383, 383,
+- 383, 383, 383, 383, 444, 444, 444, 444, 444, 444,
+- 444, 444, 444, 444, 444, 444, 444, 444, 444, 444,
+- 444, 444, 444, 444, 444, 444, 444, 383, 383, 383,
+- 430, 430, 430, 430, 430, 430, 430, 430, 430, 430,
+- 430, 430, 444, 444, 444, 444, 444, 444, 444, 444,
+-
+- 444, 444, 444, 444, 444, 444, 444, 444, 444, 444,
+- 444, 444, 444, 444, 444, 430, 430, 430, 16, 16,
+- 16, 16, 16, 16, 16, 16, 16, 54, 54, 54,
+- 54, 54, 54, 54, 54, 54, 60, 60, 60, 60,
+- 60, 60, 60, 60, 60, 63, 63, 63, 63, 63,
+- 63, 63, 63, 63, 65, 65, 65, 65, 65, 65,
+- 65, 65, 65, 67, 67, 444, 67, 83, 83, 83,
+- 83, 83, 83, 83, 83, 83, 86, 86, 86, 86,
+- 86, 86, 86, 86, 86, 92, 92, 92, 92, 92,
+- 92, 92, 92, 92, 99, 99, 99, 99, 99, 99,
+-
+- 99, 444, 99, 119, 444, 444, 444, 444, 444, 444,
+- 119, 120, 120, 444, 120, 444, 120, 120, 120, 120,
+- 121, 121, 121, 121, 121, 121, 121, 121, 121, 166,
+- 166, 444, 166, 444, 166, 166, 166, 166, 202, 202,
+- 444, 202, 444, 202, 202, 202, 202, 242, 242, 444,
+- 242, 444, 242, 242, 242, 242, 278, 278, 444, 278,
+- 444, 278, 278, 278, 278, 255, 255, 255, 255, 255,
+- 444, 444, 255, 311, 311, 444, 311, 444, 311, 311,
+- 311, 311, 286, 286, 286, 286, 286, 444, 444, 286,
+- 287, 287, 287, 287, 287, 444, 444, 287, 288, 288,
+-
+- 288, 288, 288, 444, 444, 288, 326, 326, 326, 326,
+- 326, 444, 444, 326, 335, 335, 444, 335, 444, 335,
+- 335, 335, 335, 316, 316, 316, 316, 316, 444, 444,
+- 316, 353, 353, 444, 353, 444, 353, 353, 353, 353,
+- 371, 371, 444, 371, 444, 371, 371, 371, 371, 359,
+- 359, 359, 359, 359, 444, 444, 359, 360, 360, 360,
+- 360, 360, 444, 444, 360, 384, 384, 444, 384, 444,
+- 384, 384, 384, 384, 396, 396, 444, 396, 444, 396,
+- 396, 396, 396, 405, 405, 444, 405, 444, 405, 405,
+- 405, 405, 416, 416, 444, 416, 444, 416, 416, 416,
+-
+- 416, 423, 423, 444, 444, 444, 423, 444, 423, 428,
+- 428, 444, 428, 444, 428, 428, 428, 428, 433, 433,
+- 433, 444, 433, 433, 444, 433, 438, 438, 444, 438,
+- 444, 438, 438, 438, 438, 430, 430, 430, 430, 430,
+- 444, 444, 430, 9, 444, 444, 444, 444, 444, 444,
+- 444, 444, 444, 444, 444, 444, 444, 444, 444, 444,
+- 444, 444, 444, 444, 444, 444, 444, 444, 444, 444,
+- 444, 444, 444, 444, 444, 444, 444, 444, 444, 444,
+- 444, 444, 444, 444, 444, 444, 444, 444, 444, 444,
+- 444, 444, 444, 444, 444, 444, 444, 444, 444, 444,
+-
+- 444, 444, 444, 444, 444, 444
+- } ;
+-
+-static yyconst flex_int16_t yy_chk[1507] =
+- { 0,
+- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+- 1, 1, 1, 4, 5, 6, 4, 7, 8, 18,
+- 0, 5, 6, 13, 7, 8, 25, 25, 26, 26,
+- 27, 35, 35, 11, 11, 1, 1, 1, 2, 2,
+- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+- 2, 11, 12, 12, 2, 37, 13, 36, 36, 37,
+- 18, 42, 39, 27, 43, 44, 45, 46, 48, 159,
+- 12, 39, 96, 2, 2, 2, 52, 52, 95, 52,
+- 96, 2, 44, 95, 43, 48, 159, 42, 82, 82,
+- 43, 45, 46, 2, 2, 2, 3, 3, 3, 3,
+-
+- 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+- 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+- 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+- 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+- 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+- 3, 3, 3, 3, 3, 3, 3, 3, 17, 17,
+- 47, 17, 49, 50, 51, 60, 69, 58, 58, 75,
+- 83, 94, 94, 17, 97, 49, 17, 97, 102, 79,
+- 98, 104, 103, 50, 50, 58, 47, 68, 68, 51,
+- 68, 98, 49, 50, 79, 103, 105, 443, 60, 106,
+-
+- 17, 107, 68, 83, 102, 68, 104, 69, 108, 109,
+- 75, 110, 17, 17, 17, 33, 33, 33, 33, 33,
+- 33, 33, 33, 33, 33, 33, 33, 107, 105, 68,
+- 106, 107, 140, 108, 128, 140, 442, 111, 109, 110,
+- 112, 68, 68, 68, 114, 233, 233, 115, 113, 128,
+- 33, 33, 33, 34, 34, 34, 34, 34, 34, 34,
+- 34, 34, 34, 34, 34, 111, 112, 113, 115, 141,
+- 116, 116, 114, 116, 144, 142, 115, 142, 144, 34,
+- 141, 167, 167, 113, 257, 441, 257, 167, 34, 34,
+- 34, 119, 119, 119, 119, 119, 119, 119, 119, 119,
+-
+- 119, 119, 119, 119, 119, 119, 119, 119, 119, 119,
+- 119, 119, 119, 119, 119, 119, 119, 119, 119, 119,
+- 119, 119, 119, 119, 119, 119, 119, 119, 119, 119,
+- 119, 119, 119, 119, 119, 119, 119, 119, 119, 119,
+- 119, 119, 119, 119, 119, 119, 119, 119, 119, 119,
+- 119, 119, 119, 143, 143, 143, 143, 143, 143, 143,
+- 143, 143, 143, 143, 143, 153, 149, 151, 182, 318,
+- 155, 267, 318, 156, 182, 267, 147, 148, 149, 151,
+- 146, 150, 154, 155, 153, 156, 157, 160, 143, 143,
+- 143, 145, 145, 145, 145, 145, 145, 145, 145, 145,
+-
+- 145, 145, 145, 146, 147, 150, 148, 181, 183, 290,
+- 185, 440, 154, 290, 157, 187, 158, 161, 160, 181,
+- 183, 162, 185, 188, 190, 194, 145, 145, 145, 152,
+- 152, 152, 152, 152, 152, 152, 152, 152, 152, 152,
+- 152, 158, 162, 161, 193, 187, 195, 199, 198, 194,
+- 203, 203, 256, 188, 190, 439, 203, 256, 258, 195,
+- 198, 193, 199, 258, 152, 152, 152, 163, 163, 163,
+- 163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+- 163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+- 163, 189, 189, 189, 189, 189, 189, 189, 189, 189,
+-
+- 189, 189, 189, 196, 197, 201, 200, 218, 220, 219,
+- 221, 236, 237, 437, 239, 240, 235, 221, 238, 218,
+- 220, 197, 219, 270, 201, 236, 189, 189, 189, 192,
+- 192, 200, 235, 196, 238, 237, 259, 236, 272, 270,
+- 273, 259, 192, 192, 239, 240, 274, 291, 192, 307,
+- 272, 275, 284, 284, 273, 293, 292, 301, 301, 291,
+- 292, 309, 314, 314, 436, 293, 273, 274, 192, 192,
+- 192, 308, 275, 317, 309, 192, 307, 192, 332, 375,
+- 314, 317, 375, 192, 334, 192, 217, 217, 217, 217,
+- 217, 217, 217, 217, 217, 217, 217, 217, 315, 319,
+-
+- 308, 320, 376, 376, 341, 435, 315, 319, 332, 341,
+- 320, 315, 315, 334, 342, 343, 434, 350, 427, 342,
+- 343, 217, 217, 217, 222, 222, 222, 222, 222, 222,
+- 222, 222, 222, 222, 222, 222, 336, 361, 377, 344,
+- 362, 377, 344, 363, 336, 350, 361, 362, 388, 336,
+- 336, 344, 363, 364, 379, 379, 426, 364, 388, 222,
+- 222, 222, 241, 241, 241, 241, 241, 241, 241, 241,
+- 241, 241, 241, 241, 365, 378, 389, 391, 390, 365,
+- 392, 399, 391, 425, 392, 389, 424, 378, 390, 400,
+- 400, 399, 401, 401, 415, 400, 414, 241, 241, 241,
+-
+- 251, 251, 251, 251, 251, 251, 251, 251, 251, 251,
+- 251, 251, 404, 407, 400, 408, 409, 409, 407, 407,
+- 413, 404, 409, 410, 410, 411, 417, 408, 412, 411,
+- 419, 417, 417, 406, 419, 251, 251, 251, 252, 252,
+- 252, 252, 252, 252, 252, 252, 252, 252, 252, 252,
+- 420, 420, 421, 421, 422, 422, 420, 423, 423, 431,
+- 431, 433, 433, 403, 423, 402, 431, 398, 433, 397,
+- 395, 394, 393, 252, 252, 252, 253, 253, 253, 253,
+- 253, 253, 253, 253, 253, 253, 253, 253, 387, 385,
+- 382, 381, 380, 374, 373, 372, 368, 367, 366, 358,
+-
+- 357, 354, 349, 348, 347, 346, 345, 338, 337, 331,
+- 330, 253, 253, 253, 276, 276, 276, 276, 276, 276,
+- 276, 276, 276, 276, 276, 276, 329, 328, 325, 324,
+- 323, 322, 321, 312, 306, 305, 304, 303, 302, 300,
+- 299, 298, 297, 296, 295, 294, 285, 283, 279, 276,
+- 276, 276, 289, 289, 289, 289, 289, 289, 289, 289,
+- 289, 289, 289, 289, 271, 269, 268, 266, 265, 264,
+- 263, 262, 261, 254, 250, 249, 247, 246, 245, 244,
+- 243, 234, 232, 231, 230, 229, 228, 289, 289, 289,
+- 333, 333, 333, 333, 333, 333, 333, 333, 333, 333,
+-
+- 333, 333, 227, 226, 225, 216, 215, 214, 213, 212,
+- 211, 210, 209, 208, 207, 206, 205, 180, 179, 178,
+- 177, 176, 175, 174, 173, 333, 333, 333, 339, 339,
+- 339, 339, 339, 339, 339, 339, 339, 339, 339, 339,
+- 172, 171, 170, 169, 168, 137, 136, 135, 134, 133,
+- 132, 131, 130, 129, 127, 126, 124, 118, 117, 99,
+- 93, 92, 90, 339, 339, 339, 340, 340, 340, 340,
+- 340, 340, 340, 340, 340, 340, 340, 340, 88, 87,
+- 86, 85, 81, 80, 78, 77, 76, 74, 73, 72,
+- 71, 70, 64, 63, 59, 57, 56, 53, 41, 40,
+-
+- 38, 340, 340, 340, 352, 352, 352, 352, 352, 352,
+- 352, 352, 352, 352, 352, 352, 32, 31, 30, 29,
+- 23, 22, 21, 20, 19, 15, 14, 9, 0, 0,
+- 0, 0, 0, 0, 0, 0, 0, 0, 0, 352,
+- 352, 352, 369, 369, 369, 369, 369, 369, 369, 369,
+- 369, 369, 369, 369, 0, 0, 0, 0, 0, 0,
+- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+- 0, 0, 0, 0, 0, 0, 0, 369, 369, 369,
+- 418, 418, 418, 418, 418, 418, 418, 418, 418, 418,
+- 418, 418, 0, 0, 0, 0, 0, 0, 0, 0,
+-
+- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+- 0, 0, 0, 0, 0, 418, 418, 418, 445, 445,
+- 445, 445, 445, 445, 445, 445, 445, 446, 446, 446,
+- 446, 446, 446, 446, 446, 446, 447, 447, 447, 447,
+- 447, 447, 447, 447, 447, 448, 448, 448, 448, 448,
+- 448, 448, 448, 448, 449, 449, 449, 449, 449, 449,
+- 449, 449, 449, 450, 450, 0, 450, 451, 451, 451,
+- 451, 451, 451, 451, 451, 451, 452, 452, 452, 452,
+- 452, 452, 452, 452, 452, 453, 453, 453, 453, 453,
+- 453, 453, 453, 453, 454, 454, 454, 454, 454, 454,
+-
+- 454, 0, 454, 455, 0, 0, 0, 0, 0, 0,
+- 455, 456, 456, 0, 456, 0, 456, 456, 456, 456,
+- 457, 457, 457, 457, 457, 457, 457, 457, 457, 458,
+- 458, 0, 458, 0, 458, 458, 458, 458, 459, 459,
+- 0, 459, 0, 459, 459, 459, 459, 460, 460, 0,
+- 460, 0, 460, 460, 460, 460, 461, 461, 0, 461,
+- 0, 461, 461, 461, 461, 462, 462, 462, 462, 462,
+- 0, 0, 462, 463, 463, 0, 463, 0, 463, 463,
+- 463, 463, 464, 464, 464, 464, 464, 0, 0, 464,
+- 465, 465, 465, 465, 465, 0, 0, 465, 466, 466,
+-
+- 466, 466, 466, 0, 0, 466, 467, 467, 467, 467,
+- 467, 0, 0, 467, 468, 468, 0, 468, 0, 468,
+- 468, 468, 468, 469, 469, 469, 469, 469, 0, 0,
+- 469, 470, 470, 0, 470, 0, 470, 470, 470, 470,
+- 471, 471, 0, 471, 0, 471, 471, 471, 471, 472,
+- 472, 472, 472, 472, 0, 0, 472, 473, 473, 473,
+- 473, 473, 0, 0, 473, 474, 474, 0, 474, 0,
+- 474, 474, 474, 474, 475, 475, 0, 475, 0, 475,
+- 475, 475, 475, 476, 476, 0, 476, 0, 476, 476,
+- 476, 476, 477, 477, 0, 477, 0, 477, 477, 477,
+-
+- 477, 478, 478, 0, 0, 0, 478, 0, 478, 479,
+- 479, 0, 479, 0, 479, 479, 479, 479, 480, 480,
+- 480, 0, 480, 480, 0, 480, 481, 481, 0, 481,
+- 0, 481, 481, 481, 481, 482, 482, 482, 482, 482,
+- 0, 0, 482, 444, 444, 444, 444, 444, 444, 444,
+- 444, 444, 444, 444, 444, 444, 444, 444, 444, 444,
+- 444, 444, 444, 444, 444, 444, 444, 444, 444, 444,
+- 444, 444, 444, 444, 444, 444, 444, 444, 444, 444,
+- 444, 444, 444, 444, 444, 444, 444, 444, 444, 444,
+- 444, 444, 444, 444, 444, 444, 444, 444, 444, 444,
+-
+- 444, 444, 444, 444, 444, 444
+- } ;
+-
+-static yy_state_type yy_last_accepting_state;
+-static char *yy_last_accepting_cpos;
+-
+-extern int yy_flex_debug;
+-int yy_flex_debug = 0;
+-
+-/* The intent behind this definition is that it'll catch
+- * any uses of REJECT which flex missed.
+- */
+-#define REJECT reject_used_but_not_detected
+-#define yymore() yymore_used_but_not_detected
+-#define YY_MORE_ADJ 0
+-#define YY_RESTORE_YY_MORE_OFFSET
+-char *yytext;
+-#line 1 "/d/gcc-4.4.1/gcc-4.4.1/gcc/gengtype-lex.l"
+-/* -*- indented-text -*- */
+-/* Process source files and output type information.
+- Copyright (C) 2002, 2003, 2004, 2005, 2007, 2008, 2009
+- Free Software Foundation, Inc.
+-
+-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/>. */
+-#line 23 "/d/gcc-4.4.1/gcc-4.4.1/gcc/gengtype-lex.l"
+-#include "bconfig.h"
+-#include "system.h"
+-
+-#define malloc xmalloc
+-#define realloc xrealloc
+-
+-#include "gengtype.h"
+-
+-#define YY_NO_INPUT
+-#define YY_DECL int yylex (const char **yylval)
+-#define yyterminate() return EOF_TOKEN
+-
+-struct fileloc lexer_line;
+-int lexer_toplevel_done;
+-
+-static void
+-update_lineno (const char *l, size_t len)
+-{
+- while (len-- > 0)
+- if (*l++ == '\n')
+- lexer_line.line++;
+-}
+-
+-
+-#line 986 "gengtype-lex.c"
+-
+-#define INITIAL 0
+-#define in_struct 1
+-#define in_struct_comment 2
+-#define in_comment 3
+-
+-#ifndef YY_NO_UNISTD_H
+-/* Special case for "unistd.h", since it is non-ANSI. We include it way
+- * down here because we want the user's section 1 to have been scanned first.
+- * The user has a chance to override it with an option.
+- */
+-#include <unistd.h>
+-#endif
+-
+-#ifndef YY_EXTRA_TYPE
+-#define YY_EXTRA_TYPE void *
+-#endif
+-
+-static int yy_init_globals (void );
+-
+-/* Accessor methods to globals.
+- These are made visible to non-reentrant scanners for convenience. */
+-
+-int yylex_destroy (void );
+-
+-int yyget_debug (void );
+-
+-void yyset_debug (int debug_flag );
+-
+-YY_EXTRA_TYPE yyget_extra (void );
+-
+-void yyset_extra (YY_EXTRA_TYPE user_defined );
+-
+-FILE *yyget_in (void );
+-
+-void yyset_in (FILE * in_str );
+-
+-FILE *yyget_out (void );
+-
+-void yyset_out (FILE * out_str );
+-
+-int yyget_leng (void );
+-
+-char *yyget_text (void );
+-
+-int yyget_lineno (void );
+-
+-void yyset_lineno (int line_number );
+-
+-/* Macros after this point can all be overridden by user definitions in
+- * section 1.
+- */
+-
+-#ifndef YY_SKIP_YYWRAP
+-#ifdef __cplusplus
+-extern "C" int yywrap (void );
+-#else
+-extern int yywrap (void );
+-#endif
+-#endif
+-
+-#ifndef yytext_ptr
+-static void yy_flex_strncpy (char *,yyconst char *,int );
+-#endif
+-
+-#ifdef YY_NEED_STRLEN
+-static int yy_flex_strlen (yyconst char * );
+-#endif
+-
+-#ifndef YY_NO_INPUT
+-
+-#ifdef __cplusplus
+-static int yyinput (void );
+-#else
+-static int input (void );
+-#endif
+-
+-#endif
+-
+-/* Amount of stuff to slurp up with each read. */
+-#ifndef YY_READ_BUF_SIZE
+-#define YY_READ_BUF_SIZE 8192
+-#endif
+-
+-/* Copy whatever the last rule matched to the standard output. */
+-#ifndef ECHO
+-/* This used to be an fputs(), but since the string might contain NUL's,
+- * we now use fwrite().
+- */
+-#define ECHO fwrite( yytext, yyleng, 1, yyout )
+-#endif
+-
+-/* Gets input and stuffs it into "buf". number of characters read, or YY_NULL,
+- * is returned in "result".
+- */
+-#ifndef YY_INPUT
+-#define YY_INPUT(buf,result,max_size) \
+- if ( YY_CURRENT_BUFFER_LVALUE->yy_is_interactive ) \
+- { \
+- int c = '*'; \
+- unsigned n; \
+- for ( n = 0; n < max_size && \
+- (c = getc( yyin )) != EOF && c != '\n'; ++n ) \
+- buf[n] = (char) c; \
+- if ( c == '\n' ) \
+- buf[n++] = (char) c; \
+- if ( c == EOF && ferror( yyin ) ) \
+- YY_FATAL_ERROR( "input in flex scanner failed" ); \
+- result = n; \
+- } \
+- else \
+- { \
+- errno=0; \
+- while ( (result = fread(buf, 1, max_size, yyin))==0 && ferror(yyin)) \
+- { \
+- if( errno != EINTR) \
+- { \
+- YY_FATAL_ERROR( "input in flex scanner failed" ); \
+- break; \
+- } \
+- errno=0; \
+- clearerr(yyin); \
+- } \
+- }\
+-\
+-
+-#endif
+-
+-/* No semi-colon after return; correct usage is to write "yyterminate();" -
+- * we don't want an extra ';' after the "return" because that will cause
+- * some compilers to complain about unreachable statements.
+- */
+-#ifndef yyterminate
+-#define yyterminate() return YY_NULL
+-#endif
+-
+-/* Number of entries by which start-condition stack grows. */
+-#ifndef YY_START_STACK_INCR
+-#define YY_START_STACK_INCR 25
+-#endif
+-
+-/* Report a fatal error. */
+-#ifndef YY_FATAL_ERROR
+-#define YY_FATAL_ERROR(msg) yy_fatal_error( msg )
+-#endif
+-
+-/* end tables serialization structures and prototypes */
+-
+-/* Default declaration of generated scanner - a define so the user can
+- * easily add parameters.
+- */
+-#ifndef YY_DECL
+-#define YY_DECL_IS_OURS 1
+-
+-extern int yylex (void);
+-
+-#define YY_DECL int yylex (void)
+-#endif /* !YY_DECL */
+-
+-/* Code executed at the beginning of each rule, after yytext and yyleng
+- * have been set up.
+- */
+-#ifndef YY_USER_ACTION
+-#define YY_USER_ACTION
+-#endif
+-
+-/* Code executed at the end of each rule. */
+-#ifndef YY_BREAK
+-#define YY_BREAK break;
+-#endif
+-
+-#define YY_RULE_SETUP \
+- if ( yyleng > 0 ) \
+- YY_CURRENT_BUFFER_LVALUE->yy_at_bol = \
+- (yytext[yyleng - 1] == '\n'); \
+- YY_USER_ACTION
+-
+-/** The main scanner function which does all the work.
+- */
+-YY_DECL
+-{
+- register yy_state_type yy_current_state;
+- register char *yy_cp, *yy_bp;
+- register int yy_act;
+-
+-#line 58 "/d/gcc-4.4.1/gcc-4.4.1/gcc/gengtype-lex.l"
+-
+- /* Do this on entry to yylex(): */
+- *yylval = 0;
+- if (lexer_toplevel_done)
+- {
+- BEGIN(INITIAL);
+- lexer_toplevel_done = 0;
+- }
+-
+- /* Things we look for in skipping mode: */
+-#line 1183 "gengtype-lex.c"
+-
+- if ( !(yy_init) )
+- {
+- (yy_init) = 1;
+-
+-#ifdef YY_USER_INIT
+- YY_USER_INIT;
+-#endif
+-
+- if ( ! (yy_start) )
+- (yy_start) = 1; /* first start state */
+-
+- if ( ! yyin )
+- yyin = stdin;
+-
+- if ( ! yyout )
+- yyout = stdout;
+-
+- if ( ! YY_CURRENT_BUFFER ) {
+- yyensure_buffer_stack ();
+- YY_CURRENT_BUFFER_LVALUE =
+- yy_create_buffer(yyin,YY_BUF_SIZE );
+- }
+-
+- yy_load_buffer_state( );
+- }
+-
+- while ( 1 ) /* loops until end-of-file is reached */
+- {
+- yy_cp = (yy_c_buf_p);
+-
+- /* Support of yytext. */
+- *yy_cp = (yy_hold_char);
+-
+- /* yy_bp points to the position in yy_ch_buf of the start of
+- * the current run.
+- */
+- yy_bp = yy_cp;
+-
+- yy_current_state = (yy_start);
+- yy_current_state += YY_AT_BOL();
+-yy_match:
+- do
+- {
+- register YY_CHAR yy_c = yy_ec[YY_SC_TO_UI(*yy_cp)];
+- if ( yy_accept[yy_current_state] )
+- {
+- (yy_last_accepting_state) = yy_current_state;
+- (yy_last_accepting_cpos) = yy_cp;
+- }
+- while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
+- {
+- yy_current_state = (int) yy_def[yy_current_state];
+- if ( yy_current_state >= 445 )
+- yy_c = yy_meta[(unsigned int) yy_c];
+- }
+- yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
+- ++yy_cp;
+- }
+- while ( yy_current_state != 444 );
+- yy_cp = (yy_last_accepting_cpos);
+- yy_current_state = (yy_last_accepting_state);
+-
+-yy_find_action:
+- yy_act = yy_accept[yy_current_state];
+-
+- YY_DO_BEFORE_ACTION;
+-
+-do_action: /* This label is used only to access EOF actions. */
+-
+- switch ( yy_act )
+- { /* beginning of action switch */
+- case 0: /* must back up */
+- /* undo the effects of YY_DO_BEFORE_ACTION */
+- *yy_cp = (yy_hold_char);
+- yy_cp = (yy_last_accepting_cpos);
+- yy_current_state = (yy_last_accepting_state);
+- goto yy_find_action;
+-
+-case 1:
+-/* rule 1 can match eol */
+-*yy_cp = (yy_hold_char); /* undo effects of setting up yytext */
+-(yy_c_buf_p) = yy_cp -= 1;
+-YY_DO_BEFORE_ACTION; /* set up yytext again */
+-YY_RULE_SETUP
+-#line 69 "/d/gcc-4.4.1/gcc-4.4.1/gcc/gengtype-lex.l"
+-{
+- BEGIN(in_struct);
+- return TYPEDEF;
+-}
+- YY_BREAK
+-case 2:
+-/* rule 2 can match eol */
+-*yy_cp = (yy_hold_char); /* undo effects of setting up yytext */
+-(yy_c_buf_p) = yy_cp -= 1;
+-YY_DO_BEFORE_ACTION; /* set up yytext again */
+-YY_RULE_SETUP
+-#line 73 "/d/gcc-4.4.1/gcc-4.4.1/gcc/gengtype-lex.l"
+-{
+- BEGIN(in_struct);
+- return STRUCT;
+-}
+- YY_BREAK
+-case 3:
+-/* rule 3 can match eol */
+-*yy_cp = (yy_hold_char); /* undo effects of setting up yytext */
+-(yy_c_buf_p) = yy_cp -= 1;
+-YY_DO_BEFORE_ACTION; /* set up yytext again */
+-YY_RULE_SETUP
+-#line 77 "/d/gcc-4.4.1/gcc-4.4.1/gcc/gengtype-lex.l"
+-{
+- BEGIN(in_struct);
+- return UNION;
+-}
+- YY_BREAK
+-case 4:
+-/* rule 4 can match eol */
+-*yy_cp = (yy_hold_char); /* undo effects of setting up yytext */
+-(yy_c_buf_p) = yy_cp -= 1;
+-YY_DO_BEFORE_ACTION; /* set up yytext again */
+-YY_RULE_SETUP
+-#line 81 "/d/gcc-4.4.1/gcc-4.4.1/gcc/gengtype-lex.l"
+-{
+- BEGIN(in_struct);
+- return EXTERN;
+-}
+- YY_BREAK
+-case 5:
+-/* rule 5 can match eol */
+-*yy_cp = (yy_hold_char); /* undo effects of setting up yytext */
+-(yy_c_buf_p) = yy_cp -= 1;
+-YY_DO_BEFORE_ACTION; /* set up yytext again */
+-YY_RULE_SETUP
+-#line 85 "/d/gcc-4.4.1/gcc-4.4.1/gcc/gengtype-lex.l"
+-{
+- BEGIN(in_struct);
+- return STATIC;
+-}
+- YY_BREAK
+-case 6:
+-/* rule 6 can match eol */
+-*yy_cp = (yy_hold_char); /* undo effects of setting up yytext */
+-(yy_c_buf_p) = yy_cp -= 1;
+-YY_DO_BEFORE_ACTION; /* set up yytext again */
+-YY_RULE_SETUP
+-#line 90 "/d/gcc-4.4.1/gcc-4.4.1/gcc/gengtype-lex.l"
+-{
+- BEGIN(in_struct);
+- return DEFVEC_OP;
+-}
+- YY_BREAK
+-case 7:
+-/* rule 7 can match eol */
+-*yy_cp = (yy_hold_char); /* undo effects of setting up yytext */
+-(yy_c_buf_p) = yy_cp -= 1;
+-YY_DO_BEFORE_ACTION; /* set up yytext again */
+-YY_RULE_SETUP
+-#line 94 "/d/gcc-4.4.1/gcc-4.4.1/gcc/gengtype-lex.l"
+-{
+- BEGIN(in_struct);
+- return DEFVEC_I;
+-}
+- YY_BREAK
+-case 8:
+-/* rule 8 can match eol */
+-*yy_cp = (yy_hold_char); /* undo effects of setting up yytext */
+-(yy_c_buf_p) = yy_cp -= 1;
+-YY_DO_BEFORE_ACTION; /* set up yytext again */
+-YY_RULE_SETUP
+-#line 98 "/d/gcc-4.4.1/gcc-4.4.1/gcc/gengtype-lex.l"
+-{
+- BEGIN(in_struct);
+- return DEFVEC_ALLOC;
+-}
+- YY_BREAK
+-
+-
+-case 9:
+-YY_RULE_SETUP
+-#line 106 "/d/gcc-4.4.1/gcc-4.4.1/gcc/gengtype-lex.l"
+-{ BEGIN(in_struct_comment); }
+- YY_BREAK
+-case 10:
+-/* rule 10 can match eol */
+-YY_RULE_SETUP
+-#line 108 "/d/gcc-4.4.1/gcc-4.4.1/gcc/gengtype-lex.l"
+-{ update_lineno (yytext, yyleng); }
+- YY_BREAK
+-case 11:
+-/* rule 11 can match eol */
+-YY_RULE_SETUP
+-#line 109 "/d/gcc-4.4.1/gcc-4.4.1/gcc/gengtype-lex.l"
+-{ lexer_line.line++; }
+- YY_BREAK
+-case 12:
+-/* rule 12 can match eol */
+-*yy_cp = (yy_hold_char); /* undo effects of setting up yytext */
+-(yy_c_buf_p) = yy_cp = yy_bp + 5;
+-YY_DO_BEFORE_ACTION; /* set up yytext again */
+-YY_RULE_SETUP
+-#line 111 "/d/gcc-4.4.1/gcc-4.4.1/gcc/gengtype-lex.l"
+-/* don't care */
+- YY_BREAK
+-case 13:
+-/* rule 13 can match eol */
+-*yy_cp = (yy_hold_char); /* undo effects of setting up yytext */
+-(yy_c_buf_p) = yy_cp = yy_bp + 3;
+-YY_DO_BEFORE_ACTION; /* set up yytext again */
+-YY_RULE_SETUP
+-#line 112 "/d/gcc-4.4.1/gcc-4.4.1/gcc/gengtype-lex.l"
+-{ return GTY_TOKEN; }
+- YY_BREAK
+-case 14:
+-/* rule 14 can match eol */
+-*yy_cp = (yy_hold_char); /* undo effects of setting up yytext */
+-(yy_c_buf_p) = yy_cp = yy_bp + 3;
+-YY_DO_BEFORE_ACTION; /* set up yytext again */
+-YY_RULE_SETUP
+-#line 113 "/d/gcc-4.4.1/gcc-4.4.1/gcc/gengtype-lex.l"
+-{ return VEC_TOKEN; }
+- YY_BREAK
+-case 15:
+-/* rule 15 can match eol */
+-*yy_cp = (yy_hold_char); /* undo effects of setting up yytext */
+-(yy_c_buf_p) = yy_cp = yy_bp + 5;
+-YY_DO_BEFORE_ACTION; /* set up yytext again */
+-YY_RULE_SETUP
+-#line 114 "/d/gcc-4.4.1/gcc-4.4.1/gcc/gengtype-lex.l"
+-{ return UNION; }
+- YY_BREAK
+-case 16:
+-/* rule 16 can match eol */
+-*yy_cp = (yy_hold_char); /* undo effects of setting up yytext */
+-(yy_c_buf_p) = yy_cp = yy_bp + 6;
+-YY_DO_BEFORE_ACTION; /* set up yytext again */
+-YY_RULE_SETUP
+-#line 115 "/d/gcc-4.4.1/gcc-4.4.1/gcc/gengtype-lex.l"
+-{ return STRUCT; }
+- YY_BREAK
+-case 17:
+-/* rule 17 can match eol */
+-*yy_cp = (yy_hold_char); /* undo effects of setting up yytext */
+-(yy_c_buf_p) = yy_cp = yy_bp + 4;
+-YY_DO_BEFORE_ACTION; /* set up yytext again */
+-YY_RULE_SETUP
+-#line 116 "/d/gcc-4.4.1/gcc-4.4.1/gcc/gengtype-lex.l"
+-{ return ENUM; }
+- YY_BREAK
+-case 18:
+-/* rule 18 can match eol */
+-*yy_cp = (yy_hold_char); /* undo effects of setting up yytext */
+-(yy_c_buf_p) = yy_cp = yy_bp + 9;
+-YY_DO_BEFORE_ACTION; /* set up yytext again */
+-YY_RULE_SETUP
+-#line 117 "/d/gcc-4.4.1/gcc-4.4.1/gcc/gengtype-lex.l"
+-{ return PTR_ALIAS; }
+- YY_BREAK
+-case 19:
+-/* rule 19 can match eol */
+-*yy_cp = (yy_hold_char); /* undo effects of setting up yytext */
+-(yy_c_buf_p) = yy_cp = yy_bp + 10;
+-YY_DO_BEFORE_ACTION; /* set up yytext again */
+-YY_RULE_SETUP
+-#line 118 "/d/gcc-4.4.1/gcc-4.4.1/gcc/gengtype-lex.l"
+-{ return NESTED_PTR; }
+- YY_BREAK
+-case 20:
+-YY_RULE_SETUP
+-#line 119 "/d/gcc-4.4.1/gcc-4.4.1/gcc/gengtype-lex.l"
+-{ return NUM; }
+- YY_BREAK
+-case 21:
+-/* rule 21 can match eol */
+-*yy_cp = (yy_hold_char); /* undo effects of setting up yytext */
+-(yy_c_buf_p) = yy_cp -= 1;
+-YY_DO_BEFORE_ACTION; /* set up yytext again */
+-YY_RULE_SETUP
+-#line 120 "/d/gcc-4.4.1/gcc-4.4.1/gcc/gengtype-lex.l"
+-{
+- *yylval = XDUPVAR (const char, yytext, yyleng, yyleng+1);
+- return PARAM_IS;
+-}
+- YY_BREAK
+-case 22:
+-/* rule 22 can match eol */
+-*yy_cp = (yy_hold_char); /* undo effects of setting up yytext */
+-(yy_c_buf_p) = yy_cp -= 1;
+-YY_DO_BEFORE_ACTION; /* set up yytext again */
+-#line 126 "/d/gcc-4.4.1/gcc-4.4.1/gcc/gengtype-lex.l"
+-case 23:
+-/* rule 23 can match eol */
+-YY_RULE_SETUP
+-#line 126 "/d/gcc-4.4.1/gcc-4.4.1/gcc/gengtype-lex.l"
+-{
+- size_t len;
+-
+- for (len = yyleng; ISSPACE (yytext[len-1]); len--)
+- ;
+-
+- *yylval = XDUPVAR (const char, yytext, len, len+1);
+- update_lineno (yytext, yyleng);
+- return SCALAR;
+-}
+- YY_BREAK
+-case 24:
+-/* rule 24 can match eol */
+-*yy_cp = (yy_hold_char); /* undo effects of setting up yytext */
+-(yy_c_buf_p) = yy_cp -= 1;
+-YY_DO_BEFORE_ACTION; /* set up yytext again */
+-YY_RULE_SETUP
+-#line 138 "/d/gcc-4.4.1/gcc-4.4.1/gcc/gengtype-lex.l"
+-{
+- *yylval = XDUPVAR (const char, yytext, yyleng, yyleng+1);
+- return ID;
+-}
+- YY_BREAK
+-case 25:
+-/* rule 25 can match eol */
+-YY_RULE_SETUP
+-#line 143 "/d/gcc-4.4.1/gcc-4.4.1/gcc/gengtype-lex.l"
+-{
+- *yylval = XDUPVAR (const char, yytext+1, yyleng-2, yyleng-1);
+- return STRING;
+-}
+- YY_BREAK
+-/* This "terminal" avoids having to parse integer constant expressions. */
+-case 26:
+-/* rule 26 can match eol */
+-YY_RULE_SETUP
+-#line 148 "/d/gcc-4.4.1/gcc-4.4.1/gcc/gengtype-lex.l"
+-{
+- *yylval = XDUPVAR (const char, yytext+1, yyleng-2, yyleng-1);
+- return ARRAY;
+-}
+- YY_BREAK
+-case 27:
+-/* rule 27 can match eol */
+-YY_RULE_SETUP
+-#line 152 "/d/gcc-4.4.1/gcc-4.4.1/gcc/gengtype-lex.l"
+-{
+- *yylval = XDUPVAR (const char, yytext+1, yyleng-2, yyleng);
+- return CHAR;
+-}
+- YY_BREAK
+-case 28:
+-YY_RULE_SETUP
+-#line 157 "/d/gcc-4.4.1/gcc-4.4.1/gcc/gengtype-lex.l"
+-{ return ELLIPSIS; }
+- YY_BREAK
+-case 29:
+-YY_RULE_SETUP
+-#line 158 "/d/gcc-4.4.1/gcc-4.4.1/gcc/gengtype-lex.l"
+-{ return yytext[0]; }
+- YY_BREAK
+-/* ignore pp-directives */
+-case 30:
+-/* rule 30 can match eol */
+-YY_RULE_SETUP
+-#line 161 "/d/gcc-4.4.1/gcc-4.4.1/gcc/gengtype-lex.l"
+-{lexer_line.line++;}
+- YY_BREAK
+-case 31:
+-YY_RULE_SETUP
+-#line 163 "/d/gcc-4.4.1/gcc-4.4.1/gcc/gengtype-lex.l"
+-{
+- error_at_line (&lexer_line, "unexpected character `%s'", yytext);
+-}
+- YY_BREAK
+-
+-case 32:
+-YY_RULE_SETUP
+-#line 168 "/d/gcc-4.4.1/gcc-4.4.1/gcc/gengtype-lex.l"
+-{ BEGIN(in_comment); }
+- YY_BREAK
+-case 33:
+-/* rule 33 can match eol */
+-YY_RULE_SETUP
+-#line 169 "/d/gcc-4.4.1/gcc-4.4.1/gcc/gengtype-lex.l"
+-{ lexer_line.line++; }
+- YY_BREAK
+-case 34:
+-#line 171 "/d/gcc-4.4.1/gcc-4.4.1/gcc/gengtype-lex.l"
+-case 35:
+-/* rule 35 can match eol */
+-#line 172 "/d/gcc-4.4.1/gcc-4.4.1/gcc/gengtype-lex.l"
+-case 36:
+-/* rule 36 can match eol */
+-YY_RULE_SETUP
+-#line 172 "/d/gcc-4.4.1/gcc-4.4.1/gcc/gengtype-lex.l"
+-/* do nothing */
+- YY_BREAK
+-case 37:
+-/* rule 37 can match eol */
+-YY_RULE_SETUP
+-#line 173 "/d/gcc-4.4.1/gcc-4.4.1/gcc/gengtype-lex.l"
+-{ update_lineno (yytext, yyleng); }
+- YY_BREAK
+-case 38:
+-/* rule 38 can match eol */
+-*yy_cp = (yy_hold_char); /* undo effects of setting up yytext */
+-(yy_c_buf_p) = yy_cp = yy_bp + 1;
+-YY_DO_BEFORE_ACTION; /* set up yytext again */
+-YY_RULE_SETUP
+-#line 174 "/d/gcc-4.4.1/gcc-4.4.1/gcc/gengtype-lex.l"
+-/* do nothing */
+- YY_BREAK
+-
+-case 39:
+-/* rule 39 can match eol */
+-YY_RULE_SETUP
+-#line 177 "/d/gcc-4.4.1/gcc-4.4.1/gcc/gengtype-lex.l"
+-{ lexer_line.line++; }
+- YY_BREAK
+-case 40:
+-#line 179 "/d/gcc-4.4.1/gcc-4.4.1/gcc/gengtype-lex.l"
+-case 41:
+-YY_RULE_SETUP
+-#line 179 "/d/gcc-4.4.1/gcc-4.4.1/gcc/gengtype-lex.l"
+-/* do nothing */
+- YY_BREAK
+-case 42:
+-/* rule 42 can match eol */
+-*yy_cp = (yy_hold_char); /* undo effects of setting up yytext */
+-(yy_c_buf_p) = yy_cp = yy_bp + 1;
+-YY_DO_BEFORE_ACTION; /* set up yytext again */
+-YY_RULE_SETUP
+-#line 180 "/d/gcc-4.4.1/gcc-4.4.1/gcc/gengtype-lex.l"
+-/* do nothing */
+- YY_BREAK
+-
+-case 43:
+-YY_RULE_SETUP
+-#line 182 "/d/gcc-4.4.1/gcc-4.4.1/gcc/gengtype-lex.l"
+-{ BEGIN(INITIAL); }
+- YY_BREAK
+-case 44:
+-YY_RULE_SETUP
+-#line 183 "/d/gcc-4.4.1/gcc-4.4.1/gcc/gengtype-lex.l"
+-{ BEGIN(in_struct); }
+- YY_BREAK
+-case 45:
+-#line 186 "/d/gcc-4.4.1/gcc-4.4.1/gcc/gengtype-lex.l"
+-case 46:
+-YY_RULE_SETUP
+-#line 186 "/d/gcc-4.4.1/gcc-4.4.1/gcc/gengtype-lex.l"
+-{
+- error_at_line (&lexer_line,
+- "unterminated comment or string; unexpected EOF");
+-}
+- YY_BREAK
+-case 47:
+-/* rule 47 can match eol */
+-YY_RULE_SETUP
+-#line 191 "/d/gcc-4.4.1/gcc-4.4.1/gcc/gengtype-lex.l"
+-/* do nothing */
+- YY_BREAK
+-case 48:
+-/* rule 48 can match eol */
+-YY_RULE_SETUP
+-#line 192 "/d/gcc-4.4.1/gcc-4.4.1/gcc/gengtype-lex.l"
+-{
+- error_at_line (&lexer_line, "stray GTY marker");
+-}
+- YY_BREAK
+-case 49:
+-YY_RULE_SETUP
+-#line 196 "/d/gcc-4.4.1/gcc-4.4.1/gcc/gengtype-lex.l"
+-YY_FATAL_ERROR( "flex scanner jammed" );
+- YY_BREAK
+-#line 1653 "gengtype-lex.c"
+-case YY_STATE_EOF(INITIAL):
+-case YY_STATE_EOF(in_struct):
+-case YY_STATE_EOF(in_struct_comment):
+-case YY_STATE_EOF(in_comment):
+- yyterminate();
+-
+- case YY_END_OF_BUFFER:
+- {
+- /* Amount of text matched not including the EOB char. */
+- int yy_amount_of_matched_text = (int) (yy_cp - (yytext_ptr)) - 1;
+-
+- /* Undo the effects of YY_DO_BEFORE_ACTION. */
+- *yy_cp = (yy_hold_char);
+- YY_RESTORE_YY_MORE_OFFSET
+-
+- if ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_NEW )
+- {
+- /* We're scanning a new file or input source. It's
+- * possible that this happened because the user
+- * just pointed yyin at a new source and called
+- * yylex(). If so, then we have to assure
+- * consistency between YY_CURRENT_BUFFER and our
+- * globals. Here is the right place to do so, because
+- * this is the first action (other than possibly a
+- * back-up) that will match for the new input source.
+- */
+- (yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_n_chars;
+- YY_CURRENT_BUFFER_LVALUE->yy_input_file = yyin;
+- YY_CURRENT_BUFFER_LVALUE->yy_buffer_status = YY_BUFFER_NORMAL;
+- }
+-
+- /* Note that here we test for yy_c_buf_p "<=" to the position
+- * of the first EOB in the buffer, since yy_c_buf_p will
+- * already have been incremented past the NUL character
+- * (since all states make transitions on EOB to the
+- * end-of-buffer state). Contrast this with the test
+- * in input().
+- */
+- if ( (yy_c_buf_p) <= &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] )
+- { /* This was really a NUL. */
+- yy_state_type yy_next_state;
+-
+- (yy_c_buf_p) = (yytext_ptr) + yy_amount_of_matched_text;
+-
+- yy_current_state = yy_get_previous_state( );
+-
+- /* Okay, we're now positioned to make the NUL
+- * transition. We couldn't have
+- * yy_get_previous_state() go ahead and do it
+- * for us because it doesn't know how to deal
+- * with the possibility of jamming (and we don't
+- * want to build jamming into it because then it
+- * will run more slowly).
+- */
+-
+- yy_next_state = yy_try_NUL_trans( yy_current_state );
+-
+- yy_bp = (yytext_ptr) + YY_MORE_ADJ;
+-
+- if ( yy_next_state )
+- {
+- /* Consume the NUL. */
+- yy_cp = ++(yy_c_buf_p);
+- yy_current_state = yy_next_state;
+- goto yy_match;
+- }
+-
+- else
+- {
+- yy_cp = (yy_last_accepting_cpos);
+- yy_current_state = (yy_last_accepting_state);
+- goto yy_find_action;
+- }
+- }
+-
+- else switch ( yy_get_next_buffer( ) )
+- {
+- case EOB_ACT_END_OF_FILE:
+- {
+- (yy_did_buffer_switch_on_eof) = 0;
+-
+- if ( yywrap( ) )
+- {
+- /* Note: because we've taken care in
+- * yy_get_next_buffer() to have set up
+- * yytext, we can now set up
+- * yy_c_buf_p so that if some total
+- * hoser (like flex itself) wants to
+- * call the scanner after we return the
+- * YY_NULL, it'll still work - another
+- * YY_NULL will get returned.
+- */
+- (yy_c_buf_p) = (yytext_ptr) + YY_MORE_ADJ;
+-
+- yy_act = YY_STATE_EOF(YY_START);
+- goto do_action;
+- }
+-
+- else
+- {
+- if ( ! (yy_did_buffer_switch_on_eof) )
+- YY_NEW_FILE;
+- }
+- break;
+- }
+-
+- case EOB_ACT_CONTINUE_SCAN:
+- (yy_c_buf_p) =
+- (yytext_ptr) + yy_amount_of_matched_text;
+-
+- yy_current_state = yy_get_previous_state( );
+-
+- yy_cp = (yy_c_buf_p);
+- yy_bp = (yytext_ptr) + YY_MORE_ADJ;
+- goto yy_match;
+-
+- case EOB_ACT_LAST_MATCH:
+- (yy_c_buf_p) =
+- &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)];
+-
+- yy_current_state = yy_get_previous_state( );
+-
+- yy_cp = (yy_c_buf_p);
+- yy_bp = (yytext_ptr) + YY_MORE_ADJ;
+- goto yy_find_action;
+- }
+- break;
+- }
+-
+- default:
+- YY_FATAL_ERROR(
+- "fatal flex scanner internal error--no action found" );
+- } /* end of action switch */
+- } /* end of scanning one token */
+-} /* end of yylex */
+-
+-/* yy_get_next_buffer - try to read in a new buffer
+- *
+- * Returns a code representing an action:
+- * EOB_ACT_LAST_MATCH -
+- * EOB_ACT_CONTINUE_SCAN - continue scanning from current position
+- * EOB_ACT_END_OF_FILE - end of file
+- */
+-static int yy_get_next_buffer (void)
+-{
+- register char *dest = YY_CURRENT_BUFFER_LVALUE->yy_ch_buf;
+- register char *source = (yytext_ptr);
+- register int number_to_move, i;
+- int ret_val;
+-
+- if ( (yy_c_buf_p) > &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars) + 1] )
+- YY_FATAL_ERROR(
+- "fatal flex scanner internal error--end of buffer missed" );
+-
+- if ( YY_CURRENT_BUFFER_LVALUE->yy_fill_buffer == 0 )
+- { /* Don't try to fill the buffer, so this is an EOF. */
+- if ( (yy_c_buf_p) - (yytext_ptr) - YY_MORE_ADJ == 1 )
+- {
+- /* We matched a single character, the EOB, so
+- * treat this as a final EOF.
+- */
+- return EOB_ACT_END_OF_FILE;
+- }
+-
+- else
+- {
+- /* We matched some text prior to the EOB, first
+- * process it.
+- */
+- return EOB_ACT_LAST_MATCH;
+- }
+- }
+-
+- /* Try to read more data. */
+-
+- /* First move last chars to start of buffer. */
+- number_to_move = (int) ((yy_c_buf_p) - (yytext_ptr)) - 1;
+-
+- for ( i = 0; i < number_to_move; ++i )
+- *(dest++) = *(source++);
+-
+- if ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_EOF_PENDING )
+- /* don't do the read, it's not guaranteed to return an EOF,
+- * just force an EOF
+- */
+- YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars) = 0;
+-
+- else
+- {
+- int num_to_read =
+- YY_CURRENT_BUFFER_LVALUE->yy_buf_size - number_to_move - 1;
+-
+- while ( num_to_read <= 0 )
+- { /* Not enough room in the buffer - grow it. */
+-
+- /* just a shorter name for the current buffer */
+- YY_BUFFER_STATE b = YY_CURRENT_BUFFER;
+-
+- int yy_c_buf_p_offset =
+- (int) ((yy_c_buf_p) - b->yy_ch_buf);
+-
+- if ( b->yy_is_our_buffer )
+- {
+- int new_size = b->yy_buf_size * 2;
+-
+- if ( new_size <= 0 )
+- b->yy_buf_size += b->yy_buf_size / 8;
+- else
+- b->yy_buf_size *= 2;
+-
+- b->yy_ch_buf = (char *)
+- /* Include room in for 2 EOB chars. */
+- yyrealloc((void *) b->yy_ch_buf,b->yy_buf_size + 2 );
+- }
+- else
+- /* Can't grow it, we don't own it. */
+- b->yy_ch_buf = 0;
+-
+- if ( ! b->yy_ch_buf )
+- YY_FATAL_ERROR(
+- "fatal error - scanner input buffer overflow" );
+-
+- (yy_c_buf_p) = &b->yy_ch_buf[yy_c_buf_p_offset];
+-
+- num_to_read = YY_CURRENT_BUFFER_LVALUE->yy_buf_size -
+- number_to_move - 1;
+-
+- }
+-
+- if ( num_to_read > YY_READ_BUF_SIZE )
+- num_to_read = YY_READ_BUF_SIZE;
+-
+- /* Read in more data. */
+- YY_INPUT( (&YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[number_to_move]),
+- (yy_n_chars), (size_t) num_to_read );
+-
+- YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars);
+- }
+-
+- if ( (yy_n_chars) == 0 )
+- {
+- if ( number_to_move == YY_MORE_ADJ )
+- {
+- ret_val = EOB_ACT_END_OF_FILE;
+- yyrestart(yyin );
+- }
+-
+- else
+- {
+- ret_val = EOB_ACT_LAST_MATCH;
+- YY_CURRENT_BUFFER_LVALUE->yy_buffer_status =
+- YY_BUFFER_EOF_PENDING;
+- }
+- }
+-
+- else
+- ret_val = EOB_ACT_CONTINUE_SCAN;
+-
+- if ((yy_size_t) ((yy_n_chars) + number_to_move) > YY_CURRENT_BUFFER_LVALUE->yy_buf_size) {
+- /* Extend the array by 50%, plus the number we really need. */
+- yy_size_t new_size = (yy_n_chars) + number_to_move + ((yy_n_chars) >> 1);
+- YY_CURRENT_BUFFER_LVALUE->yy_ch_buf = (char *) yyrealloc((void *) YY_CURRENT_BUFFER_LVALUE->yy_ch_buf,new_size );
+- if ( ! YY_CURRENT_BUFFER_LVALUE->yy_ch_buf )
+- YY_FATAL_ERROR( "out of dynamic memory in yy_get_next_buffer()" );
+- }
+-
+- (yy_n_chars) += number_to_move;
+- YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] = YY_END_OF_BUFFER_CHAR;
+- YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars) + 1] = YY_END_OF_BUFFER_CHAR;
+-
+- (yytext_ptr) = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[0];
+-
+- return ret_val;
+-}
+-
+-/* yy_get_previous_state - get the state just before the EOB char was reached */
+-
+- static yy_state_type yy_get_previous_state (void)
+-{
+- register yy_state_type yy_current_state;
+- register char *yy_cp;
+-
+- yy_current_state = (yy_start);
+- yy_current_state += YY_AT_BOL();
+-
+- for ( yy_cp = (yytext_ptr) + YY_MORE_ADJ; yy_cp < (yy_c_buf_p); ++yy_cp )
+- {
+- register YY_CHAR yy_c = (*yy_cp ? yy_ec[YY_SC_TO_UI(*yy_cp)] : 1);
+- if ( yy_accept[yy_current_state] )
+- {
+- (yy_last_accepting_state) = yy_current_state;
+- (yy_last_accepting_cpos) = yy_cp;
+- }
+- while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
+- {
+- yy_current_state = (int) yy_def[yy_current_state];
+- if ( yy_current_state >= 445 )
+- yy_c = yy_meta[(unsigned int) yy_c];
+- }
+- yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
+- }
+-
+- return yy_current_state;
+-}
+-
+-/* yy_try_NUL_trans - try to make a transition on the NUL character
+- *
+- * synopsis
+- * next_state = yy_try_NUL_trans( current_state );
+- */
+- static yy_state_type yy_try_NUL_trans (yy_state_type yy_current_state )
+-{
+- register int yy_is_jam;
+- register char *yy_cp = (yy_c_buf_p);
+-
+- register YY_CHAR yy_c = 1;
+- if ( yy_accept[yy_current_state] )
+- {
+- (yy_last_accepting_state) = yy_current_state;
+- (yy_last_accepting_cpos) = yy_cp;
+- }
+- while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
+- {
+- yy_current_state = (int) yy_def[yy_current_state];
+- if ( yy_current_state >= 445 )
+- yy_c = yy_meta[(unsigned int) yy_c];
+- }
+- yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
+- yy_is_jam = (yy_current_state == 444);
+-
+- return yy_is_jam ? 0 : yy_current_state;
+-}
+-
+-#ifndef YY_NO_INPUT
+-#ifdef __cplusplus
+- static int yyinput (void)
+-#else
+- static int input (void)
+-#endif
+-
+-{
+- int c;
+-
+- *(yy_c_buf_p) = (yy_hold_char);
+-
+- if ( *(yy_c_buf_p) == YY_END_OF_BUFFER_CHAR )
+- {
+- /* yy_c_buf_p now points to the character we want to return.
+- * If this occurs *before* the EOB characters, then it's a
+- * valid NUL; if not, then we've hit the end of the buffer.
+- */
+- if ( (yy_c_buf_p) < &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] )
+- /* This was really a NUL. */
+- *(yy_c_buf_p) = '\0';
+-
+- else
+- { /* need more input */
+- int offset = (yy_c_buf_p) - (yytext_ptr);
+- ++(yy_c_buf_p);
+-
+- switch ( yy_get_next_buffer( ) )
+- {
+- case EOB_ACT_LAST_MATCH:
+- /* This happens because yy_g_n_b()
+- * sees that we've accumulated a
+- * token and flags that we need to
+- * try matching the token before
+- * proceeding. But for input(),
+- * there's no matching to consider.
+- * So convert the EOB_ACT_LAST_MATCH
+- * to EOB_ACT_END_OF_FILE.
+- */
+-
+- /* Reset buffer status. */
+- yyrestart(yyin );
+-
+- /*FALLTHROUGH*/
+-
+- case EOB_ACT_END_OF_FILE:
+- {
+- if ( yywrap( ) )
+- return EOF;
+-
+- if ( ! (yy_did_buffer_switch_on_eof) )
+- YY_NEW_FILE;
+-#ifdef __cplusplus
+- return yyinput();
+-#else
+- return input();
+-#endif
+- }
+-
+- case EOB_ACT_CONTINUE_SCAN:
+- (yy_c_buf_p) = (yytext_ptr) + offset;
+- break;
+- }
+- }
+- }
+-
+- c = *(unsigned char *) (yy_c_buf_p); /* cast for 8-bit char's */
+- *(yy_c_buf_p) = '\0'; /* preserve yytext */
+- (yy_hold_char) = *++(yy_c_buf_p);
+-
+- YY_CURRENT_BUFFER_LVALUE->yy_at_bol = (c == '\n');
+-
+- return c;
+-}
+-#endif /* ifndef YY_NO_INPUT */
+-
+-/** Immediately switch to a different input stream.
+- * @param input_file A readable stream.
+- *
+- * @note This function does not reset the start condition to @c INITIAL .
+- */
+- void yyrestart (FILE * input_file )
+-{
+-
+- if ( ! YY_CURRENT_BUFFER ){
+- yyensure_buffer_stack ();
+- YY_CURRENT_BUFFER_LVALUE =
+- yy_create_buffer(yyin,YY_BUF_SIZE );
+- }
+-
+- yy_init_buffer(YY_CURRENT_BUFFER,input_file );
+- yy_load_buffer_state( );
+-}
+-
+-/** Switch to a different input buffer.
+- * @param new_buffer The new input buffer.
+- *
+- */
+- void yy_switch_to_buffer (YY_BUFFER_STATE new_buffer )
+-{
+-
+- /* TODO. We should be able to replace this entire function body
+- * with
+- * yypop_buffer_state();
+- * yypush_buffer_state(new_buffer);
+- */
+- yyensure_buffer_stack ();
+- if ( YY_CURRENT_BUFFER == new_buffer )
+- return;
+-
+- if ( YY_CURRENT_BUFFER )
+- {
+- /* Flush out information for old buffer. */
+- *(yy_c_buf_p) = (yy_hold_char);
+- YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = (yy_c_buf_p);
+- YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars);
+- }
+-
+- YY_CURRENT_BUFFER_LVALUE = new_buffer;
+- yy_load_buffer_state( );
+-
+- /* We don't actually know whether we did this switch during
+- * EOF (yywrap()) processing, but the only time this flag
+- * is looked at is after yywrap() is called, so it's safe
+- * to go ahead and always set it.
+- */
+- (yy_did_buffer_switch_on_eof) = 1;
+-}
+-
+-static void yy_load_buffer_state (void)
+-{
+- (yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_n_chars;
+- (yytext_ptr) = (yy_c_buf_p) = YY_CURRENT_BUFFER_LVALUE->yy_buf_pos;
+- yyin = YY_CURRENT_BUFFER_LVALUE->yy_input_file;
+- (yy_hold_char) = *(yy_c_buf_p);
+-}
+-
+-/** Allocate and initialize an input buffer state.
+- * @param file A readable stream.
+- * @param size The character buffer size in bytes. When in doubt, use @c YY_BUF_SIZE.
+- *
+- * @return the allocated buffer state.
+- */
+- YY_BUFFER_STATE yy_create_buffer (FILE * file, int size )
+-{
+- YY_BUFFER_STATE b;
+-
+- b = (YY_BUFFER_STATE) yyalloc(sizeof( struct yy_buffer_state ) );
+- if ( ! b )
+- YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" );
+-
+- b->yy_buf_size = size;
+-
+- /* yy_ch_buf has to be 2 characters longer than the size given because
+- * we need to put in 2 end-of-buffer characters.
+- */
+- b->yy_ch_buf = (char *) yyalloc(b->yy_buf_size + 2 );
+- if ( ! b->yy_ch_buf )
+- YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" );
+-
+- b->yy_is_our_buffer = 1;
+-
+- yy_init_buffer(b,file );
+-
+- return b;
+-}
+-
+-/** Destroy the buffer.
+- * @param b a buffer created with yy_create_buffer()
+- *
+- */
+- void yy_delete_buffer (YY_BUFFER_STATE b )
+-{
+-
+- if ( ! b )
+- return;
+-
+- if ( b == YY_CURRENT_BUFFER ) /* Not sure if we should pop here. */
+- YY_CURRENT_BUFFER_LVALUE = (YY_BUFFER_STATE) 0;
+-
+- if ( b->yy_is_our_buffer )
+- yyfree((void *) b->yy_ch_buf );
+-
+- yyfree((void *) b );
+-}
+-
+-/* Initializes or reinitializes a buffer.
+- * This function is sometimes called more than once on the same buffer,
+- * such as during a yyrestart() or at EOF.
+- */
+- static void yy_init_buffer (YY_BUFFER_STATE b, FILE * file )
+-
+-{
+- int oerrno = errno;
+-
+- yy_flush_buffer(b );
+-
+- b->yy_input_file = file;
+- b->yy_fill_buffer = 1;
+-
+- /* If b is the current buffer, then yy_init_buffer was _probably_
+- * called from yyrestart() or through yy_get_next_buffer.
+- * In that case, we don't want to reset the lineno or column.
+- */
+- if (b != YY_CURRENT_BUFFER){
+- b->yy_bs_lineno = 1;
+- b->yy_bs_column = 0;
+- }
+-
+- b->yy_is_interactive = 0;
+-
+- errno = oerrno;
+-}
+-
+-/** Discard all buffered characters. On the next scan, YY_INPUT will be called.
+- * @param b the buffer state to be flushed, usually @c YY_CURRENT_BUFFER.
+- *
+- */
+- void yy_flush_buffer (YY_BUFFER_STATE b )
+-{
+- if ( ! b )
+- return;
+-
+- b->yy_n_chars = 0;
+-
+- /* We always need two end-of-buffer characters. The first causes
+- * a transition to the end-of-buffer state. The second causes
+- * a jam in that state.
+- */
+- b->yy_ch_buf[0] = YY_END_OF_BUFFER_CHAR;
+- b->yy_ch_buf[1] = YY_END_OF_BUFFER_CHAR;
+-
+- b->yy_buf_pos = &b->yy_ch_buf[0];
+-
+- b->yy_at_bol = 1;
+- b->yy_buffer_status = YY_BUFFER_NEW;
+-
+- if ( b == YY_CURRENT_BUFFER )
+- yy_load_buffer_state( );
+-}
+-
+-/** Pushes the new state onto the stack. The new state becomes
+- * the current state. This function will allocate the stack
+- * if necessary.
+- * @param new_buffer The new state.
+- *
+- */
+-void yypush_buffer_state (YY_BUFFER_STATE new_buffer )
+-{
+- if (new_buffer == NULL)
+- return;
+-
+- yyensure_buffer_stack();
+-
+- /* This block is copied from yy_switch_to_buffer. */
+- if ( YY_CURRENT_BUFFER )
+- {
+- /* Flush out information for old buffer. */
+- *(yy_c_buf_p) = (yy_hold_char);
+- YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = (yy_c_buf_p);
+- YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars);
+- }
+-
+- /* Only push if top exists. Otherwise, replace top. */
+- if (YY_CURRENT_BUFFER)
+- (yy_buffer_stack_top)++;
+- YY_CURRENT_BUFFER_LVALUE = new_buffer;
+-
+- /* copied from yy_switch_to_buffer. */
+- yy_load_buffer_state( );
+- (yy_did_buffer_switch_on_eof) = 1;
+-}
+-
+-/** Removes and deletes the top of the stack, if present.
+- * The next element becomes the new top.
+- *
+- */
+-void yypop_buffer_state (void)
+-{
+- if (!YY_CURRENT_BUFFER)
+- return;
+-
+- yy_delete_buffer(YY_CURRENT_BUFFER );
+- YY_CURRENT_BUFFER_LVALUE = NULL;
+- if ((yy_buffer_stack_top) > 0)
+- --(yy_buffer_stack_top);
+-
+- if (YY_CURRENT_BUFFER) {
+- yy_load_buffer_state( );
+- (yy_did_buffer_switch_on_eof) = 1;
+- }
+-}
+-
+-/* Allocates the stack if it does not exist.
+- * Guarantees space for at least one push.
+- */
+-static void yyensure_buffer_stack (void)
+-{
+- int num_to_alloc;
+-
+- if (!(yy_buffer_stack)) {
+-
+- /* First allocation is just for 2 elements, since we don't know if this
+- * scanner will even need a stack. We use 2 instead of 1 to avoid an
+- * immediate realloc on the next call.
+- */
+- num_to_alloc = 1;
+- (yy_buffer_stack) = (struct yy_buffer_state**)yyalloc
+- (num_to_alloc * sizeof(struct yy_buffer_state*)
+- );
+- if ( ! (yy_buffer_stack) )
+- YY_FATAL_ERROR( "out of dynamic memory in yyensure_buffer_stack()" );
+-
+- memset((yy_buffer_stack), 0, num_to_alloc * sizeof(struct yy_buffer_state*));
+-
+- (yy_buffer_stack_max) = num_to_alloc;
+- (yy_buffer_stack_top) = 0;
+- return;
+- }
+-
+- if ((yy_buffer_stack_top) >= ((yy_buffer_stack_max)) - 1){
+-
+- /* Increase the buffer to prepare for a possible push. */
+- int grow_size = 8 /* arbitrary grow size */;
+-
+- num_to_alloc = (yy_buffer_stack_max) + grow_size;
+- (yy_buffer_stack) = (struct yy_buffer_state**)yyrealloc
+- ((yy_buffer_stack),
+- num_to_alloc * sizeof(struct yy_buffer_state*)
+- );
+- if ( ! (yy_buffer_stack) )
+- YY_FATAL_ERROR( "out of dynamic memory in yyensure_buffer_stack()" );
+-
+- /* zero only the new slots.*/
+- memset((yy_buffer_stack) + (yy_buffer_stack_max), 0, grow_size * sizeof(struct yy_buffer_state*));
+- (yy_buffer_stack_max) = num_to_alloc;
+- }
+-}
+-
+-/** Setup the input buffer state to scan directly from a user-specified character buffer.
+- * @param base the character buffer
+- * @param size the size in bytes of the character buffer
+- *
+- * @return the newly allocated buffer state object.
+- */
+-YY_BUFFER_STATE yy_scan_buffer (char * base, yy_size_t size )
+-{
+- YY_BUFFER_STATE b;
+-
+- if ( size < 2 ||
+- base[size-2] != YY_END_OF_BUFFER_CHAR ||
+- base[size-1] != YY_END_OF_BUFFER_CHAR )
+- /* They forgot to leave room for the EOB's. */
+- return 0;
+-
+- b = (YY_BUFFER_STATE) yyalloc(sizeof( struct yy_buffer_state ) );
+- if ( ! b )
+- YY_FATAL_ERROR( "out of dynamic memory in yy_scan_buffer()" );
+-
+- b->yy_buf_size = size - 2; /* "- 2" to take care of EOB's */
+- b->yy_buf_pos = b->yy_ch_buf = base;
+- b->yy_is_our_buffer = 0;
+- b->yy_input_file = 0;
+- b->yy_n_chars = b->yy_buf_size;
+- b->yy_is_interactive = 0;
+- b->yy_at_bol = 1;
+- b->yy_fill_buffer = 0;
+- b->yy_buffer_status = YY_BUFFER_NEW;
+-
+- yy_switch_to_buffer(b );
+-
+- return b;
+-}
+-
+-/** Setup the input buffer state to scan a string. The next call to yylex() will
+- * scan from a @e copy of @a str.
+- * @param yystr a NUL-terminated string to scan
+- *
+- * @return the newly allocated buffer state object.
+- * @note If you want to scan bytes that may contain NUL values, then use
+- * yy_scan_bytes() instead.
+- */
+-YY_BUFFER_STATE yy_scan_string (yyconst char * yystr )
+-{
+-
+- return yy_scan_bytes(yystr,strlen(yystr) );
+-}
+-
+-/** Setup the input buffer state to scan the given bytes. The next call to yylex() will
+- * scan from a @e copy of @a bytes.
+- * @param bytes the byte buffer to scan
+- * @param len the number of bytes in the buffer pointed to by @a bytes.
+- *
+- * @return the newly allocated buffer state object.
+- */
+-YY_BUFFER_STATE yy_scan_bytes (yyconst char * yybytes, int _yybytes_len )
+-{
+- YY_BUFFER_STATE b;
+- char *buf;
+- yy_size_t n;
+- int i;
+-
+- /* Get memory for full buffer, including space for trailing EOB's. */
+- n = _yybytes_len + 2;
+- buf = (char *) yyalloc(n );
+- if ( ! buf )
+- YY_FATAL_ERROR( "out of dynamic memory in yy_scan_bytes()" );
+-
+- for ( i = 0; i < _yybytes_len; ++i )
+- buf[i] = yybytes[i];
+-
+- buf[_yybytes_len] = buf[_yybytes_len+1] = YY_END_OF_BUFFER_CHAR;
+-
+- b = yy_scan_buffer(buf,n );
+- if ( ! b )
+- YY_FATAL_ERROR( "bad buffer in yy_scan_bytes()" );
+-
+- /* It's okay to grow etc. this buffer, and we should throw it
+- * away when we're done.
+- */
+- b->yy_is_our_buffer = 1;
+-
+- return b;
+-}
+-
+-#ifndef YY_EXIT_FAILURE
+-#define YY_EXIT_FAILURE 2
+-#endif
+-
+-static void yy_fatal_error (yyconst char* msg )
+-{
+- (void) fprintf( stderr, "%s\n", msg );
+- exit( YY_EXIT_FAILURE );
+-}
+-
+-/* Redefine yyless() so it works in section 3 code. */
+-
+-#undef yyless
+-#define yyless(n) \
+- do \
+- { \
+- /* Undo effects of setting up yytext. */ \
+- int yyless_macro_arg = (n); \
+- YY_LESS_LINENO(yyless_macro_arg);\
+- yytext[yyleng] = (yy_hold_char); \
+- (yy_c_buf_p) = yytext + yyless_macro_arg; \
+- (yy_hold_char) = *(yy_c_buf_p); \
+- *(yy_c_buf_p) = '\0'; \
+- yyleng = yyless_macro_arg; \
+- } \
+- while ( 0 )
+-
+-/* Accessor methods (get/set functions) to struct members. */
+-
+-/** Get the current line number.
+- *
+- */
+-int yyget_lineno (void)
+-{
+-
+- return yylineno;
+-}
+-
+-/** Get the input stream.
+- *
+- */
+-FILE *yyget_in (void)
+-{
+- return yyin;
+-}
+-
+-/** Get the output stream.
+- *
+- */
+-FILE *yyget_out (void)
+-{
+- return yyout;
+-}
+-
+-/** Get the length of the current token.
+- *
+- */
+-int yyget_leng (void)
+-{
+- return yyleng;
+-}
+-
+-/** Get the current token.
+- *
+- */
+-
+-char *yyget_text (void)
+-{
+- return yytext;
+-}
+-
+-/** Set the current line number.
+- * @param line_number
+- *
+- */
+-void yyset_lineno (int line_number )
+-{
+-
+- yylineno = line_number;
+-}
+-
+-/** Set the input stream. This does not discard the current
+- * input buffer.
+- * @param in_str A readable stream.
+- *
+- * @see yy_switch_to_buffer
+- */
+-void yyset_in (FILE * in_str )
+-{
+- yyin = in_str ;
+-}
+-
+-void yyset_out (FILE * out_str )
+-{
+- yyout = out_str ;
+-}
+-
+-int yyget_debug (void)
+-{
+- return yy_flex_debug;
+-}
+-
+-void yyset_debug (int bdebug )
+-{
+- yy_flex_debug = bdebug ;
+-}
+-
+-static int yy_init_globals (void)
+-{
+- /* Initialization is the same as for the non-reentrant scanner.
+- * This function is called from yylex_destroy(), so don't allocate here.
+- */
+-
+- (yy_buffer_stack) = 0;
+- (yy_buffer_stack_top) = 0;
+- (yy_buffer_stack_max) = 0;
+- (yy_c_buf_p) = (char *) 0;
+- (yy_init) = 0;
+- (yy_start) = 0;
+-
+-/* Defined in main.c */
+-#ifdef YY_STDINIT
+- yyin = stdin;
+- yyout = stdout;
+-#else
+- yyin = (FILE *) 0;
+- yyout = (FILE *) 0;
+-#endif
+-
+- /* For future reference: Set errno on error, since we are called by
+- * yylex_init()
+- */
+- return 0;
+-}
+-
+-/* yylex_destroy is for both reentrant and non-reentrant scanners. */
+-int yylex_destroy (void)
+-{
+-
+- /* Pop the buffer stack, destroying each element. */
+- while(YY_CURRENT_BUFFER){
+- yy_delete_buffer(YY_CURRENT_BUFFER );
+- YY_CURRENT_BUFFER_LVALUE = NULL;
+- yypop_buffer_state();
+- }
+-
+- /* Destroy the stack itself. */
+- yyfree((yy_buffer_stack) );
+- (yy_buffer_stack) = NULL;
+-
+- /* Reset the globals. This is important in a non-reentrant scanner so the next time
+- * yylex() is called, initialization will occur. */
+- yy_init_globals( );
+-
+- return 0;
+-}
+-
+-/*
+- * Internal utility routines.
+- */
+-
+-#ifndef yytext_ptr
+-static void yy_flex_strncpy (char* s1, yyconst char * s2, int n )
+-{
+- register int i;
+- for ( i = 0; i < n; ++i )
+- s1[i] = s2[i];
+-}
+-#endif
+-
+-#ifdef YY_NEED_STRLEN
+-static int yy_flex_strlen (yyconst char * s )
+-{
+- register int n;
+- for ( n = 0; s[n]; ++n )
+- ;
+-
+- return n;
+-}
+-#endif
+-
+-void *yyalloc (yy_size_t size )
+-{
+- return (void *) malloc( size );
+-}
+-
+-void *yyrealloc (void * ptr, yy_size_t size )
+-{
+- /* The cast to (char *) in the following accommodates both
+- * implementations that use char* generic pointers, and those
+- * that use void* generic pointers. It works with the latter
+- * because both ANSI C and C++ allow castless assignment from
+- * any pointer type to void*, and deal with argument conversions
+- * as though doing an assignment.
+- */
+- return (void *) realloc( (char *) ptr, size );
+-}
+-
+-void yyfree (void * ptr )
+-{
+- free( (char *) ptr ); /* see yyrealloc() for (char *) cast */
+-}
+-
+-#define YYTABLES_NAME "yytables"
+-
+-#line 196 "/d/gcc-4.4.1/gcc-4.4.1/gcc/gengtype-lex.l"
+-
+-
+-
+-void
+-yybegin (const char *fname)
+-{
+- yyin = fopen (fname, "r");
+- if (yyin == NULL)
+- {
+- perror (fname);
+- exit (1);
+- }
+- lexer_line.file = fname;
+- lexer_line.line = 1;
+-}
+-
+-void
+-yyend (void)
+-{
+- fclose (yyin);
+-}
+-
+diff -Nur a/gcc/gengtype-lex.l b/gcc/gengtype-lex.l
+--- a/gcc/gengtype-lex.l 2009-02-20 16:20:38.000000000 +0100
++++ b/gcc/gengtype-lex.l 2010-01-25 09:50:29.145688053 +0100
+@@ -48,7 +48,7 @@
+ ID [[:alpha:]_][[:alnum:]_]*
+ WS [[:space:]]+
+ HWS [ \t\r\v\f]*
+-IWORD short|long|(un)?signed|char|int|HOST_WIDE_INT|HOST_WIDEST_INT|bool|size_t|BOOL_BITFIELD|CPPCHAR_SIGNED_T|ino_t|dev_t
++IWORD short|long|(un)?signed|char|int|HOST_WIDE_INT|HOST_WIDEST_INT|bool|size_t|BOOL_BITFIELD|CPPCHAR_SIGNED_T|ino_t|dev_t|HARD_REG_SET
+ ITYPE {IWORD}({WS}{IWORD})*
+ EOID [^[:alnum:]_]
+
+diff -Nur a/gcc/genmultilib b/gcc/genmultilib
+--- a/gcc/genmultilib 2007-07-26 10:37:01.000000000 +0200
++++ b/gcc/genmultilib 2010-01-25 09:50:29.145688053 +0100
+@@ -73,6 +73,20 @@
+ # the os directory names are used exclusively. Use the mapping when
+ # there is no one-to-one equivalence between GCC levels and the OS.
+
++# The optional eighth option is a list of multilib aliases. This takes the
++# same form as the third argument. It specifies that the second multilib is
++# a synonym for the first. This allows a suitable multilib to be selected
++# for all option combinations while only building a subset of all possible
++# multilibs.
++# For example:
++# genmultilib "mbig-endian mthumb" "eb thumb" "" "" "" "" "" \
++# "mbig-endian=mbig-endian/mthumb" yes
++# This produces:
++# ". !mbig-endian !mthumb;",
++# "be mbig-endian !mthumb;",
++# "be mbig-endian mthumb;",
++# "thumb !mbig-endian mthumb;",
++
+ # The last option should be "yes" if multilibs are enabled. If it is not
+ # "yes", all GCC multilib dir names will be ".".
+
+@@ -121,7 +135,8 @@
+ extra=$5
+ exclusions=$6
+ osdirnames=$7
+-enable_multilib=$8
++aliases=$8
++enable_multilib=$9
+
+ echo "static const char *const multilib_raw[] = {"
+
+@@ -129,6 +144,23 @@
+ # Use cd ./foo to avoid CDPATH output.
+ cd ./tmpmultilib.$$ || exit 1
+
++# Handle aliases
++cat >tmpmultilib3 <<\EOF
++#!/bin/sh
++# Output a list of aliases (including the original name) for a multilib.
++
++echo $1
++EOF
++for a in ${aliases}; do
++ l=`echo $a | sed -e 's/=.*$//' -e 's/?/=/g'`
++ r=`echo $a | sed -e 's/^.*=//' -e 's/?/=/g'`
++ echo "[ \$1 == /$l/ ] && echo /$r/" >>tmpmultilib3
++
++ # Also add the alias to the exclusion list
++ exceptions="${exceptions} $r"
++done
++chmod +x tmpmultilib3
++
+ # What we want to do is select all combinations of the sets in
+ # options. Each combination which includes a set of mutually
+ # exclusive options must then be output multiple times, once for each
+@@ -195,6 +227,21 @@
+ combinations=`./tmpmultilib2 ${combinations}`
+ fi
+
++# Check that all the aliases actually exist
++for a in ${aliases}; do
++ l=`echo $a | sed -e 's/=.*$//' -e 's/?/=/g'`
++ for c in ${combinations}; do
++ if [ "/$l/" = "$c" ]; then
++ l=""
++ break;
++ fi
++ done
++ if [ -n "$l" ] ;then
++ echo "Missing multilib $l for alias $a" 1>&2
++ exit 1
++ fi
++done
++
+ # Construct a sed pattern which will convert option names to directory
+ # names.
+ todirnames=
+@@ -343,23 +390,25 @@
+ fi
+ fi
+
+- # Look through the options. We must output each option that is
+- # present, and negate each option that is not present.
+- optout=
+- for set in ${options}; do
+- setopts=`echo ${set} | sed -e 's_[/|]_ _g'`
+- for opt in ${setopts}; do
+- if expr "${combo} " : ".*/${opt}/.*" > /dev/null; then
+- optout="${optout} ${opt}"
+- else
+- optout="${optout} !${opt}"
+- fi
++ for optcombo in `./tmpmultilib3 ${combo}`; do
++ # Look through the options. We must output each option that is
++ # present, and negate each option that is not present.
++ optout=
++ for set in ${options}; do
++ setopts=`echo ${set} | sed -e 's_[/|]_ _g'`
++ for opt in ${setopts}; do
++ if expr "${optcombo} " : ".*/${opt}/.*" > /dev/null; then
++ optout="${optout} ${opt}"
++ else
++ optout="${optout} !${opt}"
++ fi
++ done
+ done
+- done
+- optout=`echo ${optout} | sed -e 's/^ //'`
++ optout=`echo ${optout} | sed -e 's/^ //'`
+
+- # Output the line with all appropriate matches.
+- dirout="${dirout}" optout="${optout}" ./tmpmultilib2
++ # Output the line with all appropriate matches.
++ dirout="${dirout}" optout="${optout}" ./tmpmultilib2
++ done
+ done
+
+ # Terminate the list of string.
+diff -Nur a/gcc/haifa-sched.c b/gcc/haifa-sched.c
+--- a/gcc/haifa-sched.c 2008-10-14 14:52:19.000000000 +0200
++++ b/gcc/haifa-sched.c 2010-01-25 09:50:29.145688053 +0100
+@@ -1990,6 +1990,23 @@
+ SCHED_GROUP_P (insn) = 0;
+ }
+
++/* Return true if scheduling INSN will finish current clock cycle. */
++static bool
++insn_finishes_cycle_p (rtx insn)
++{
++ if (SCHED_GROUP_P (insn))
++ /* After issuing INSN, rest of the sched_group will be forced to issue
++ in order. Don't make any plans for the rest of cycle. */
++ return true;
++
++ /* Finishing the block will, apparently, finish the cycle. */
++ if (current_sched_info->insn_finishes_block_p
++ && current_sched_info->insn_finishes_block_p (insn))
++ return true;
++
++ return false;
++}
++
+ /* The following structure describe an entry of the stack of choices. */
+ struct choice_entry
+ {
+@@ -2168,7 +2185,10 @@
+ delay = state_transition (state, insn);
+ if (delay < 0)
+ {
+- if (state_dead_lock_p (state))
++ if (state_dead_lock_p (state)
++ || insn_finishes_cycle_p (insn))
++ /* We won't issue any more instructions in the next
++ choice_state. */
+ top->rest = 0;
+ else
+ top->rest--;
+diff -Nur a/gcc/hooks.c b/gcc/hooks.c
+--- a/gcc/hooks.c 2009-02-20 16:20:38.000000000 +0100
++++ b/gcc/hooks.c 2010-01-25 09:50:29.145688053 +0100
+@@ -335,3 +335,10 @@
+ {
+ return NULL;
+ }
++
++/* Generic hook that takes a const_tree and returns NULL_TREE. */
++tree
++hook_tree_const_tree_null (const_tree t ATTRIBUTE_UNUSED)
++{
++ return NULL;
++}
+diff -Nur a/gcc/hooks.h b/gcc/hooks.h
+--- a/gcc/hooks.h 2009-02-20 16:20:38.000000000 +0100
++++ b/gcc/hooks.h 2010-01-25 09:50:29.145688053 +0100
+@@ -64,6 +64,8 @@
+ extern int hook_int_size_t_constcharptr_int_0 (size_t, const char *, int);
+ extern int hook_int_void_no_regs (void);
+
++extern tree hook_tree_const_tree_null (const_tree);
++
+ extern tree hook_tree_tree_tree_null (tree, tree);
+ extern tree hook_tree_tree_tree_tree_null (tree, tree, tree);
+ extern tree hook_tree_tree_tree_tree_3rd_identity (tree, tree, tree);
+diff -Nur a/gcc/incpath.c b/gcc/incpath.c
+--- a/gcc/incpath.c 2009-02-20 16:20:38.000000000 +0100
++++ b/gcc/incpath.c 2010-01-25 09:50:29.145688053 +0100
+@@ -30,6 +30,8 @@
+ #include "intl.h"
+ #include "incpath.h"
+ #include "cppdefault.h"
++#include "flags.h"
++#include "toplev.h"
+
+ /* Microsoft Windows does not natively support inodes.
+ VMS has non-numeric inodes. */
+@@ -353,6 +355,24 @@
+ }
+ fprintf (stderr, _("End of search list.\n"));
+ }
++
++#ifdef ENABLE_POISON_SYSTEM_DIRECTORIES
++ if (flag_poison_system_directories)
++ {
++ struct cpp_dir *p;
++
++ for (p = heads[QUOTE]; p; p = p->next)
++ {
++ if ((!strncmp (p->name, "/usr/include", 12))
++ || (!strncmp (p->name, "/usr/local/include", 18))
++ || (!strncmp (p->name, "/usr/X11R6/include", 18)))
++ warning (OPT_Wpoison_system_directories,
++ "include location \"%s\" is unsafe for "
++ "cross-compilation",
++ p->name);
++ }
++ }
++#endif
+ }
+
+ /* Use given -I paths for #include "..." but not #include <...>, and
+diff -Nur a/gcc/ira.c b/gcc/ira.c
+--- a/gcc/ira.c 2009-07-04 00:46:30.000000000 +0200
++++ b/gcc/ira.c 2010-01-25 09:50:29.145688053 +0100
+@@ -1349,14 +1349,12 @@
+ return for_each_rtx (&insn, insn_contains_asm_1, NULL);
+ }
+
+-/* Set up regs_asm_clobbered. */
++/* Add register clobbers from asm statements. */
+ static void
+-compute_regs_asm_clobbered (char *regs_asm_clobbered)
++compute_regs_asm_clobbered (void)
+ {
+ basic_block bb;
+
+- memset (regs_asm_clobbered, 0, sizeof (char) * FIRST_PSEUDO_REGISTER);
+-
+ FOR_EACH_BB (bb)
+ {
+ rtx insn;
+@@ -1377,7 +1375,7 @@
+ + hard_regno_nregs[dregno][mode] - 1;
+
+ for (i = dregno; i <= end; ++i)
+- regs_asm_clobbered[i] = 1;
++ SET_HARD_REG_BIT(crtl->asm_clobbers, i);
+ }
+ }
+ }
+@@ -1415,7 +1413,8 @@
+ COPY_HARD_REG_SET (ira_no_alloc_regs, no_unit_alloc_regs);
+ CLEAR_HARD_REG_SET (eliminable_regset);
+
+- compute_regs_asm_clobbered (regs_asm_clobbered);
++ compute_regs_asm_clobbered ();
++
+ /* Build the regset of all eliminable registers and show we can't
+ use those that we already know won't be eliminated. */
+ #ifdef ELIMINABLE_REGS
+@@ -1425,7 +1424,7 @@
+ = (! CAN_ELIMINATE (eliminables[i].from, eliminables[i].to)
+ || (eliminables[i].to == STACK_POINTER_REGNUM && need_fp));
+
+- if (! regs_asm_clobbered[eliminables[i].from])
++ if (!TEST_HARD_REG_BIT (crtl->asm_clobbers, eliminables[i].from))
+ {
+ SET_HARD_REG_BIT (eliminable_regset, eliminables[i].from);
+
+@@ -1439,7 +1438,7 @@
+ df_set_regs_ever_live (eliminables[i].from, true);
+ }
+ #if FRAME_POINTER_REGNUM != HARD_FRAME_POINTER_REGNUM
+- if (! regs_asm_clobbered[HARD_FRAME_POINTER_REGNUM])
++ if (!TEST_HARD_REG_BIT (crtl->asm_clobbers, HARD_FRAME_POINTER_REGNUM))
+ {
+ SET_HARD_REG_BIT (eliminable_regset, HARD_FRAME_POINTER_REGNUM);
+ if (need_fp)
+@@ -1453,7 +1452,7 @@
+ #endif
+
+ #else
+- if (! regs_asm_clobbered[FRAME_POINTER_REGNUM])
++ if (!TEST_HARD_REG_BIT (crtl->asm_clobbers, HARD_FRAME_POINTER_REGNUM))
+ {
+ SET_HARD_REG_BIT (eliminable_regset, FRAME_POINTER_REGNUM);
+ if (need_fp)
+diff -Nur a/gcc/ira-costs.c b/gcc/ira-costs.c
+--- a/gcc/ira-costs.c 2009-04-22 22:16:13.000000000 +0200
++++ b/gcc/ira-costs.c 2010-01-25 09:50:29.145688053 +0100
+@@ -706,11 +706,11 @@
+
+ /* Wrapper around REGNO_OK_FOR_INDEX_P, to allow pseudo registers. */
+ static inline bool
+-ok_for_index_p_nonstrict (rtx reg)
++ok_for_index_p_nonstrict (rtx reg, enum machine_mode mode)
+ {
+ unsigned regno = REGNO (reg);
+
+- return regno >= FIRST_PSEUDO_REGISTER || REGNO_OK_FOR_INDEX_P (regno);
++ return regno >= FIRST_PSEUDO_REGISTER || ok_for_index_p_1 (regno, mode);
+ }
+
+ /* A version of regno_ok_for_base_p for use here, when all
+@@ -748,7 +748,7 @@
+ enum reg_class rclass;
+
+ if (context == 1)
+- rclass = INDEX_REG_CLASS;
++ rclass = index_reg_class (mode);
+ else
+ rclass = base_reg_class (mode, outer_code, index_code);
+
+@@ -795,7 +795,8 @@
+ just record registers in any non-constant operands. We
+ assume here, as well as in the tests below, that all
+ addresses are in canonical form. */
+- else if (INDEX_REG_CLASS == base_reg_class (VOIDmode, PLUS, SCRATCH))
++ else if (index_reg_class (mode)
++ == base_reg_class (mode, PLUS, SCRATCH))
+ {
+ record_address_regs (mode, arg0, context, PLUS, code1, scale);
+ if (! CONSTANT_P (arg1))
+@@ -816,7 +817,7 @@
+ else if (code0 == REG && code1 == REG
+ && REGNO (arg0) < FIRST_PSEUDO_REGISTER
+ && (ok_for_base_p_nonstrict (arg0, mode, PLUS, REG)
+- || ok_for_index_p_nonstrict (arg0)))
++ || ok_for_index_p_nonstrict (arg0, mode)))
+ record_address_regs (mode, arg1,
+ ok_for_base_p_nonstrict (arg0, mode, PLUS, REG)
+ ? 1 : 0,
+@@ -824,7 +825,7 @@
+ else if (code0 == REG && code1 == REG
+ && REGNO (arg1) < FIRST_PSEUDO_REGISTER
+ && (ok_for_base_p_nonstrict (arg1, mode, PLUS, REG)
+- || ok_for_index_p_nonstrict (arg1)))
++ || ok_for_index_p_nonstrict (arg1, mode)))
+ record_address_regs (mode, arg0,
+ ok_for_base_p_nonstrict (arg1, mode, PLUS, REG)
+ ? 1 : 0,
+diff -Nur a/gcc/longlong.h b/gcc/longlong.h
+--- a/gcc/longlong.h 2009-02-12 17:30:53.000000000 +0100
++++ b/gcc/longlong.h 2010-01-25 09:50:29.145688053 +0100
+@@ -982,7 +982,7 @@
+ " or r1,%0" \
+ : "=r" (q), "=&z" (r) \
+ : "1" (n1), "r" (n0), "rm" (d), "r" (&__udiv_qrnnd_16) \
+- : "r1", "r2", "r4", "r5", "r6", "pr"); \
++ : "r1", "r2", "r4", "r5", "r6", "pr", "t"); \
+ } while (0)
+
+ #define UDIV_TIME 80
+diff -Nur a/gcc/Makefile.in b/gcc/Makefile.in
+--- a/gcc/Makefile.in 2009-05-22 01:17:37.000000000 +0200
++++ b/gcc/Makefile.in 2010-01-25 09:50:29.145688053 +0100
+@@ -327,6 +327,8 @@
+ # It also specifies -isystem ./include to find, e.g., stddef.h.
+ GCC_CFLAGS=$(CFLAGS_FOR_TARGET) $(INTERNAL_CFLAGS) $(T_CFLAGS) $(LOOSE_WARN) -Wold-style-definition $($@-warn) -isystem ./include $(TCFLAGS)
+
++EGLIBC_CONFIGS = @EGLIBC_CONFIGS@
++
+ # ---------------------------------------------------
+ # Programs which produce files for the target machine
+ # ---------------------------------------------------
+@@ -408,6 +410,9 @@
+
+ xmake_file=@xmake_file@
+ tmake_file=@tmake_file@
++TM_ENDIAN_CONFIG=@TM_ENDIAN_CONFIG@
++TM_MULTILIB_CONFIG=@TM_MULTILIB_CONFIG@
++TM_MULTILIB_EXCEPTIONS_CONFIG=@TM_MULTILIB_EXCEPTIONS_CONFIG@
+ out_file=$(srcdir)/config/@out_file@
+ out_object_file=@out_object_file@
+ md_file=$(srcdir)/config/@md_file@
+@@ -542,6 +547,23 @@
+ exeext = @host_exeext@
+ build_exeext = @build_exeext@
+
++licensedir = @licensedir@
++ifneq ($(licensedir),)
++# Header files for licensing.
++CSL_LICENSEINC = -I $(licensedir)/include
++# Libraries for licensing.
++CSL_LICENSELIB = -L$(licensedir)/lib -lcsllicense
++# The licensing program. If the program does not exist, assume that
++# it is not needed.
++CSL_LICENSE_PROG = cs-license$(exeext)
++$(CSL_LICENSE_PROG):
++ if [ -f "$(licensedir)/libexec/cs-license$(exeext)" ] ; then \
++ $(LN_S) $(licensedir)/libexec/cs-license$(exeext) . ; \
++ else \
++ touch $@; \
++ fi
++endif
++
+ # Directory in which to put man pages.
+ mandir = @mandir@
+ man1dir = $(mandir)/man1
+@@ -684,7 +706,7 @@
+
+ # List of things which should already be built whenever we try to use xgcc
+ # to compile anything (without linking).
+-GCC_PASSES=xgcc$(exeext) cc1$(exeext) specs $(EXTRA_PASSES)
++GCC_PASSES=xgcc$(exeext) cc1$(exeext) specs $(EXTRA_PASSES) $(CSL_LICENSE_PROG)
+
+ # Directory to link to, when using the target `maketest'.
+ DIR = ../gcc
+@@ -913,7 +935,7 @@
+
+ # How to link with both our special library facilities
+ # and the system's installed libraries.
+-LIBS = @LIBS@ $(CPPLIB) $(LIBINTL) $(LIBICONV) $(LIBIBERTY) $(LIBDECNUMBER)
++LIBS = @LIBS@ $(CPPLIB) $(LIBINTL) $(LIBICONV) $(LIBIBERTY) $(LIBDECNUMBER) $(CSL_LICENSELIB)
+ BACKENDLIBS = $(CLOOGLIBS) $(PPLLIBS) $(GMPLIBS)
+ # Any system libraries needed just for GNAT.
+ SYSLIBS = @GNAT_LIBEXC@
+@@ -943,7 +965,7 @@
+ INCLUDES = -I. -I$(@D) -I$(srcdir) -I$(srcdir)/$(@D) \
+ -I$(srcdir)/../include @INCINTL@ \
+ $(CPPINC) $(GMPINC) $(DECNUMINC) \
+- $(PPLINC) $(CLOOGINC)
++ $(PPLINC) $(CLOOGINC) $(CSL_LICENSEINC)
+
+ .c.o:
+ $(CC) -c $(ALL_CFLAGS) $(ALL_CPPFLAGS) $< $(OUTPUT_OPTION)
+@@ -1249,6 +1271,7 @@
+ tree-ssa-loop-manip.o \
+ tree-ssa-loop-niter.o \
+ tree-ssa-loop-prefetch.o \
++ tree-ssa-loop-promote.o \
+ tree-ssa-loop-unswitch.o \
+ tree-ssa-loop.o \
+ tree-ssa-math-opts.o \
+@@ -1258,6 +1281,7 @@
+ tree-ssa-pre.o \
+ tree-ssa-propagate.o \
+ tree-ssa-reassoc.o \
++ tree-ssa-remove-local-statics.o \
+ tree-ssa-sccvn.o \
+ tree-ssa-sink.o \
+ tree-ssa-structalias.o \
+@@ -1674,7 +1698,7 @@
+ $(MACHMODE_H) $(FPBIT) $(DPBIT) $(TPBIT) $(LIB2ADD) \
+ $(LIB2ADD_ST) $(LIB2ADDEH) $(srcdir)/emutls.c gcov-iov.h $(SFP_MACHINE)
+
+-libgcc.mvars: config.status Makefile $(LIB2ADD) $(LIB2ADD_ST) specs \
++libgcc.mvars: config.status Makefile $(LIB2ADD) $(LIB2ADD_ST) specs $(tmake_file) \
+ xgcc$(exeext)
+ : > tmp-libgcc.mvars
+ echo LIB1ASMFUNCS = '$(LIB1ASMFUNCS)' >> tmp-libgcc.mvars
+@@ -1728,7 +1752,7 @@
+ # driver program needs to select the library directory based on the
+ # switches.
+ multilib.h: s-mlib; @true
+-s-mlib: $(srcdir)/genmultilib Makefile
++s-mlib: $(srcdir)/genmultilib Makefile $(tmakefile)
+ if test @enable_multilib@ = yes \
+ || test -n "$(MULTILIB_OSDIRNAMES)"; then \
+ $(SHELL) $(srcdir)/genmultilib \
+@@ -1739,10 +1763,11 @@
+ "$(MULTILIB_EXTRA_OPTS)" \
+ "$(MULTILIB_EXCLUSIONS)" \
+ "$(MULTILIB_OSDIRNAMES)" \
++ "$(MULTILIB_ALIASES)" \
+ "@enable_multilib@" \
+ > tmp-mlib.h; \
+ else \
+- $(SHELL) $(srcdir)/genmultilib '' '' '' '' '' '' '' no \
++ $(SHELL) $(srcdir)/genmultilib '' '' '' '' '' '' '' '' no \
+ > tmp-mlib.h; \
+ fi
+ $(SHELL) $(srcdir)/../move-if-change tmp-mlib.h multilib.h
+@@ -1816,7 +1841,7 @@
+
+ incpath.o: incpath.c incpath.h $(CONFIG_H) $(SYSTEM_H) $(CPPLIB_H) \
+ intl.h prefix.h coretypes.h $(TM_H) cppdefault.h $(TARGET_H) \
+- $(MACHMODE_H)
++ $(MACHMODE_H) $(FLAGS_H) toplev.h
+
+ c-decl.o : c-decl.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) $(TREE_H) \
+ $(RTL_H) $(C_TREE_H) $(GGC_H) $(TARGET_H) $(FLAGS_H) $(FUNCTION_H) output.h \
+@@ -1900,7 +1925,7 @@
+ $(TREE_H) $(C_PRAGMA_H) $(FLAGS_H) $(TOPLEV_H) langhooks.h \
+ $(TREE_INLINE_H) $(DIAGNOSTIC_H) intl.h debug.h $(C_COMMON_H) \
+ opts.h options.h $(MKDEPS_H) incpath.h cppdefault.h $(TARGET_H) \
+- $(TM_P_H) $(VARRAY_H)
++ $(TM_P_H) $(VARRAY_H) $(C_TREE_H)
+ $(CC) -c $(ALL_CFLAGS) $(ALL_CPPFLAGS) \
+ $< $(OUTPUT_OPTION) @TARGET_SYSTEM_ROOT_DEFINE@
+
+@@ -1953,7 +1978,8 @@
+ -DTOOLDIR_BASE_PREFIX=\"$(libsubdir_to_prefix)$(prefix_to_exec_prefix)\" \
+ @TARGET_SYSTEM_ROOT_DEFINE@ \
+ $(VALGRIND_DRIVER_DEFINES) \
+- `test "X$${SHLIB_LINK}" = "X" || test "@enable_shared@" != "yes" || echo "-DENABLE_SHARED_LIBGCC"`
++ `test "X$${SHLIB_LINK}" = "X" || test "@enable_shared@" != "yes" || echo "-DENABLE_SHARED_LIBGCC"` \
++ -DCONFIGURE_SPECS="\"@CONFIGURE_SPECS@\""
+
+ gcc.o: gcc.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) intl.h multilib.h \
+ Makefile $(lang_specs_files) specs.h prefix.h $(GCC_H) $(FLAGS_H) \
+@@ -2176,6 +2202,9 @@
+ alloc-pool.h $(BASIC_BLOCK_H) $(BITMAP_H) $(HASHTAB_H) $(GIMPLE_H) \
+ $(TREE_INLINE_H) tree-iterator.h tree-ssa-sccvn.h $(PARAMS_H) \
+ $(DBGCNT_H)
++tree-ssa-remove-local-statics.o: tree-ssa-remove-local-statics.c \
++ coretypes.h $(CONFIG_H) $(SYSTEM_H) $(BASIC_BLOCK_H) tree.h tree-pass.h \
++ $(TM_H) $(HASHTAB_H) $(BASIC_BLOCK_H)
+ tree-ssa-sccvn.o : tree-ssa-sccvn.c $(TREE_FLOW_H) $(CONFIG_H) \
+ $(SYSTEM_H) $(TREE_H) $(GGC_H) $(DIAGNOSTIC_H) $(TIMEVAR_H) $(FIBHEAP_H) \
+ $(TM_H) coretypes.h $(TREE_DUMP_H) tree-pass.h $(FLAGS_H) $(CFGLOOP_H) \
+@@ -2271,6 +2300,12 @@
+ $(CFGLOOP_H) $(PARAMS_H) langhooks.h $(BASIC_BLOCK_H) hard-reg-set.h \
+ tree-chrec.h $(TOPLEV_H) langhooks.h $(TREE_INLINE_H) $(TREE_DATA_REF_H) \
+ $(OPTABS_H)
++tree-ssa-loop-promote.o: tree-ssa-loop-promote.c \
++ coretypes.h $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) $(TOPLEV_H) \
++ $(RTL_H) $(TM_P_H) hard-reg-set.h $(OBSTACK_H) $(BASIC_BLOCK_H) \
++ pointer-set.h intl.h $(TREE_H) $(GIMPLE_H) $(HASHTAB_H) $(DIAGNOSTIC_H) \
++ $(TREE_FLOW_H) $(TREE_DUMP_H) $(CFGLOOP_H) $(FLAGS_H) $(TIMEVAR_H) \
++ tree-pass.h $(TM_H)
+ tree-predcom.o: tree-predcom.c $(CONFIG_H) $(SYSTEM_H) $(TREE_H) $(TM_P_H) \
+ $(CFGLOOP_H) $(TREE_FLOW_H) $(GGC_H) $(TREE_DATA_REF_H) $(SCEV_H) \
+ $(PARAMS_H) $(DIAGNOSTIC_H) tree-pass.h $(TM_H) coretypes.h tree-affine.h \
+@@ -2865,7 +2900,7 @@
+ $(RTL_H) $(REAL_H) $(FLAGS_H) $(EXPR_H) $(OPTABS_H) reload.h $(REGS_H) \
+ hard-reg-set.h insn-config.h $(BASIC_BLOCK_H) $(RECOG_H) output.h \
+ $(FUNCTION_H) $(TOPLEV_H) cselib.h $(TM_P_H) except.h $(TREE_H) $(MACHMODE_H) \
+- $(OBSTACK_H) $(TIMEVAR_H) tree-pass.h $(DF_H) $(DBGCNT_H)
++ $(OBSTACK_H) $(TIMEVAR_H) tree-pass.h addresses.h $(DF_H) $(DBGCNT_H)
+ postreload-gcse.o : postreload-gcse.c $(CONFIG_H) $(SYSTEM_H) coretypes.h \
+ $(TM_H) $(RTL_H) $(REGS_H) hard-reg-set.h $(FLAGS_H) insn-config.h \
+ $(RECOG_H) $(EXPR_H) $(BASIC_BLOCK_H) $(FUNCTION_H) output.h $(TOPLEV_H) \
+@@ -3582,7 +3617,7 @@
+ # be rebuilt.
+
+ # Build the include directories.
+-stmp-int-hdrs: $(STMP_FIXINC) $(USER_H) $(UNWIND_H) fixinc_list
++stmp-int-hdrs: $(STMP_FIXINC) $(USER_H) $(UNWIND_H)
+ # Copy in the headers provided with gcc.
+ # The sed command gets just the last file name component;
+ # this is necessary because VPATH could add a dirname.
+@@ -3601,21 +3636,23 @@
+ done
+ rm -f include/unwind.h
+ cp $(UNWIND_H) include/unwind.h
+- set -e; for ml in `cat fixinc_list`; do \
+- sysroot_headers_suffix=`echo $${ml} | sed -e 's/;.*$$//'`; \
+- multi_dir=`echo $${ml} | sed -e 's/^[^;]*;//'`; \
+- fix_dir=include-fixed$${multi_dir}; \
+- if $(LIMITS_H_TEST) ; then \
+- cat $(srcdir)/limitx.h $(srcdir)/glimits.h $(srcdir)/limity.h > tmp-xlimits.h; \
+- else \
+- cat $(srcdir)/glimits.h > tmp-xlimits.h; \
+- fi; \
+- $(mkinstalldirs) $${fix_dir}; \
+- chmod a+rx $${fix_dir} || true; \
+- rm -f $${fix_dir}/limits.h; \
+- mv tmp-xlimits.h $${fix_dir}/limits.h; \
+- chmod a+r $${fix_dir}/limits.h; \
+- done
++ set -e; if [ -f fixinc_list ] ; then \
++ for ml in `cat fixinc_list`; do \
++ sysroot_headers_suffix=`echo $${ml} | sed -e 's/;.*$$//'`; \
++ multi_dir=`echo $${ml} | sed -e 's/^[^;]*;//'`; \
++ fix_dir=include-fixed$${multi_dir}; \
++ if $(LIMITS_H_TEST) ; then \
++ cat $(srcdir)/limitx.h $(srcdir)/glimits.h $(srcdir)/limity.h > tmp-xlimits.h; \
++ else \
++ cat $(srcdir)/glimits.h > tmp-xlimits.h; \
++ fi; \
++ $(mkinstalldirs) $${fix_dir}; \
++ chmod a+rx $${fix_dir} || true; \
++ rm -f $${fix_dir}/limits.h; \
++ mv tmp-xlimits.h $${fix_dir}/limits.h; \
++ chmod a+r $${fix_dir}/limits.h; \
++ done; \
++ fi
+ # Install the README
+ rm -f include-fixed/README
+ cp $(srcdir)/../fixincludes/README-fixinc include-fixed/README
+@@ -4340,16 +4377,18 @@
+
+ # Install supporting files for fixincludes to be run later.
+ install-mkheaders: stmp-int-hdrs $(STMP_FIXPROTO) install-itoolsdirs \
+- macro_list fixinc_list
++ macro_list
+ $(INSTALL_DATA) $(srcdir)/gsyslimits.h \
+ $(DESTDIR)$(itoolsdatadir)/gsyslimits.h
+ $(INSTALL_DATA) macro_list $(DESTDIR)$(itoolsdatadir)/macro_list
+- $(INSTALL_DATA) fixinc_list $(DESTDIR)$(itoolsdatadir)/fixinc_list
+- set -e; for ml in `cat fixinc_list`; do \
+- multi_dir=`echo $${ml} | sed -e 's/^[^;]*;//'`; \
+- $(mkinstalldirs) $(DESTDIR)$(itoolsdatadir)/include$${multi_dir}; \
+- $(INSTALL_DATA) include-fixed$${multidir}/limits.h $(DESTDIR)$(itoolsdatadir)/include$${multi_dir}/limits.h; \
+- done
++ set -e; if [ -f fixinc_list ] ; then \
++ $(INSTALL_DATA) fixinc_list $(DESTDIR)$(itoolsdatadir)/fixinc_list; \
++ for ml in `cat fixinc_list`; do \
++ multi_dir=`echo $${ml} | sed -e 's/^[^;]*;//'`; \
++ $(mkinstalldirs) $(DESTDIR)$(itoolsdatadir)/include$${multi_dir}; \
++ $(INSTALL_DATA) include-fixed$${multidir}/limits.h $(DESTDIR)$(itoolsdatadir)/include$${multi_dir}/limits.h; \
++ done; \
++ fi
+ $(INSTALL_SCRIPT) $(srcdir)/../mkinstalldirs \
+ $(DESTDIR)$(itoolsdir)/mkinstalldirs ; \
+ if [ x$(STMP_FIXPROTO) != x ] ; then \
+diff -Nur a/gcc/modulo-sched.c b/gcc/modulo-sched.c
+--- a/gcc/modulo-sched.c 2008-09-01 10:57:00.000000000 +0200
++++ b/gcc/modulo-sched.c 2010-01-25 09:50:29.155687438 +0100
+@@ -270,6 +270,7 @@
+ NULL,
+ sms_print_insn,
+ NULL,
++ NULL, /* insn_finishes_block_p */
+ NULL, NULL,
+ NULL, NULL,
+ 0, 0,
+diff -Nur a/gcc/optabs.c b/gcc/optabs.c
+--- a/gcc/optabs.c 2009-03-17 18:46:23.000000000 +0100
++++ b/gcc/optabs.c 2010-01-25 09:50:29.155687438 +0100
+@@ -3300,7 +3300,8 @@
+ if (unoptab == ffs_optab || unoptab == clz_optab || unoptab == ctz_optab
+ || unoptab == popcount_optab || unoptab == parity_optab)
+ outmode
+- = GET_MODE (hard_libcall_value (TYPE_MODE (integer_type_node)));
++ = GET_MODE (hard_libcall_value (TYPE_MODE (integer_type_node),
++ optab_libfunc (unoptab, mode)));
+
+ start_sequence ();
+
+@@ -4357,10 +4358,12 @@
+ mode != VOIDmode;
+ mode = GET_MODE_WIDER_MODE (mode))
+ {
+- if ((libfunc = optab_libfunc (code_to_optab[comparison], mode)))
++ if (code_to_optab[comparison]
++ && (libfunc = optab_libfunc (code_to_optab[comparison], mode)))
+ break;
+
+- if ((libfunc = optab_libfunc (code_to_optab[swapped] , mode)))
++ if (code_to_optab[swapped]
++ && (libfunc = optab_libfunc (code_to_optab[swapped], mode)))
+ {
+ rtx tmp;
+ tmp = x; x = y; y = tmp;
+@@ -4368,7 +4371,8 @@
+ break;
+ }
+
+- if ((libfunc = optab_libfunc (code_to_optab[reversed], mode))
++ if (code_to_optab[reversed]
++ && (libfunc = optab_libfunc (code_to_optab[reversed], mode))
+ && FLOAT_LIB_COMPARE_RETURNS_BOOL (mode, reversed))
+ {
+ comparison = reversed;
+diff -Nur a/gcc/opts.c b/gcc/opts.c
+--- a/gcc/opts.c 2009-03-28 18:28:45.000000000 +0100
++++ b/gcc/opts.c 2010-01-25 09:50:29.155687438 +0100
+@@ -904,7 +904,7 @@
+ flag_tree_vrp = opt2;
+ flag_tree_builtin_call_dce = opt2;
+ flag_tree_pre = opt2;
+- flag_tree_switch_conversion = 1;
++ flag_tree_switch_conversion = opt2;
+ flag_ipa_cp = opt2;
+
+ /* Allow more virtual operators to increase alias precision. */
+@@ -928,6 +928,7 @@
+ flag_gcse_after_reload = opt3;
+ flag_tree_vectorize = opt3;
+ flag_ipa_cp_clone = opt3;
++ flag_tree_pre_partial_partial = opt3;
+ if (flag_ipa_cp_clone)
+ flag_ipa_cp = 1;
+
+@@ -951,10 +952,13 @@
+ being declared inline. */
+ flag_inline_functions = 1;
+
+- /* Basic optimization options. */
+- optimize_size = 1;
++ /* Basic optimization options at -Os are almost the same as -O2. The
++ only difference is that we disable PRE, because it sometimes still
++ increases code size. If the user want to run PRE with -Os, he/she
++ will have to indicate so explicitly. */
+ if (optimize > 2)
+ optimize = 2;
++ flag_tree_pre = 0;
+
+ /* We want to crossjump as much as possible. */
+ set_param_value ("min-crossjump-insns", 1);
+@@ -2060,6 +2064,10 @@
+ /* These are no-ops, preserved for backward compatibility. */
+ break;
+
++ case OPT_feglibc_:
++ /* This is a no-op at the moment. */
++ break;
++
+ default:
+ /* If the flag was handled in a standard way, assume the lack of
+ processing here is intentional. */
+diff -Nur a/gcc/passes.c b/gcc/passes.c
+--- a/gcc/passes.c 2009-02-20 16:20:38.000000000 +0100
++++ b/gcc/passes.c 2010-01-25 09:50:29.155687438 +0100
+@@ -591,6 +591,7 @@
+ NEXT_PASS (pass_rename_ssa_copies);
+ NEXT_PASS (pass_complete_unrolli);
+ NEXT_PASS (pass_ccp);
++ NEXT_PASS (pass_promote_indices);
+ NEXT_PASS (pass_forwprop);
+ /* Ideally the function call conditional
+ dead code elimination phase can be delayed
+@@ -605,6 +606,7 @@
+ alias information also rewrites no longer addressed
+ locals into SSA form if possible. */
+ NEXT_PASS (pass_build_alias);
++ NEXT_PASS (pass_remove_local_statics);
+ NEXT_PASS (pass_return_slot);
+ NEXT_PASS (pass_phiprop);
+ NEXT_PASS (pass_fre);
+diff -Nur a/gcc/pointer-set.c b/gcc/pointer-set.c
+--- a/gcc/pointer-set.c 2007-08-16 16:31:21.000000000 +0200
++++ b/gcc/pointer-set.c 2010-01-25 09:50:29.155687438 +0100
+@@ -181,6 +181,23 @@
+ break;
+ }
+
++/* Return the number of elements in PSET. */
++
++size_t
++pointer_set_n_elements (struct pointer_set_t *pset)
++{
++ return pset->n_elements;
++}
++
++/* Remove all entries from PSET. */
++
++void
++pointer_set_clear (struct pointer_set_t *pset)
++{
++ pset->n_elements = 0;
++ memset (pset->slots, 0, sizeof (pset->slots[0]) * pset->n_slots);
++}
++
+
+ /* A pointer map is represented the same way as a pointer_set, so
+ the hash code is based on the address of the key, rather than
+@@ -301,3 +318,20 @@
+ if (pmap->keys[i] && !fn (pmap->keys[i], &pmap->values[i], data))
+ break;
+ }
++
++/* Return the number of elements in PMAP. */
++
++size_t
++pointer_map_n_elements (struct pointer_map_t *pmap)
++{
++ return pmap->n_elements;
++}
++
++/* Remove all entries from PMAP. */
++
++void pointer_map_clear (struct pointer_map_t *pmap)
++{
++ pmap->n_elements = 0;
++ memset (pmap->keys, 0, sizeof (pmap->keys[0]) * pmap->n_slots);
++ memset (pmap->values, 0, sizeof (pmap->values[0]) * pmap->n_slots);
++}
+diff -Nur a/gcc/pointer-set.h b/gcc/pointer-set.h
+--- a/gcc/pointer-set.h 2007-08-16 16:31:21.000000000 +0200
++++ b/gcc/pointer-set.h 2010-01-25 09:50:29.155687438 +0100
+@@ -29,6 +29,8 @@
+ void pointer_set_traverse (const struct pointer_set_t *,
+ bool (*) (const void *, void *),
+ void *);
++size_t pointer_set_n_elements (struct pointer_set_t *);
++void pointer_set_clear (struct pointer_set_t *);
+
+ struct pointer_map_t;
+ struct pointer_map_t *pointer_map_create (void);
+@@ -38,5 +40,7 @@
+ void **pointer_map_insert (struct pointer_map_t *pmap, const void *p);
+ void pointer_map_traverse (const struct pointer_map_t *,
+ bool (*) (const void *, void **, void *), void *);
++size_t pointer_map_n_elements (struct pointer_map_t *);
++void pointer_map_clear (struct pointer_map_t *);
+
+ #endif /* POINTER_SET_H */
+diff -Nur a/gcc/postreload.c b/gcc/postreload.c
+--- a/gcc/postreload.c 2008-08-31 11:44:25.000000000 +0200
++++ b/gcc/postreload.c 2010-01-25 09:50:29.155687438 +0100
+@@ -46,6 +46,7 @@
+ #include "tree.h"
+ #include "timevar.h"
+ #include "tree-pass.h"
++#include "addresses.h"
+ #include "df.h"
+ #include "dbgcnt.h"
+
+@@ -708,17 +709,19 @@
+ int last_label_ruid;
+ int min_labelno, n_labels;
+ HARD_REG_SET ever_live_at_start, *label_live;
++ enum reg_class index_regs;
+
+ /* If reg+reg can be used in offsetable memory addresses, the main chunk of
+ reload has already used it where appropriate, so there is no use in
+ trying to generate it now. */
+- if (double_reg_address_ok && INDEX_REG_CLASS != NO_REGS)
++ index_regs = index_reg_class (VOIDmode);
++ if (double_reg_address_ok && index_regs != NO_REGS)
+ return;
+
+ /* To avoid wasting too much time later searching for an index register,
+ determine the minimum and maximum index register numbers. */
+ for (r = 0; r < FIRST_PSEUDO_REGISTER; r++)
+- if (TEST_HARD_REG_BIT (reg_class_contents[INDEX_REG_CLASS], r))
++ if (TEST_HARD_REG_BIT (reg_class_contents[index_regs], r))
+ {
+ if (first_index_reg == -1)
+ first_index_reg = r;
+@@ -826,8 +829,8 @@
+ substitute uses of REG (typically in MEMs) with.
+ First check REG and BASE for being index registers;
+ we can use them even if they are not dead. */
+- if (TEST_HARD_REG_BIT (reg_class_contents[INDEX_REG_CLASS], regno)
+- || TEST_HARD_REG_BIT (reg_class_contents[INDEX_REG_CLASS],
++ if (TEST_HARD_REG_BIT (reg_class_contents[index_regs], regno)
++ || TEST_HARD_REG_BIT (reg_class_contents[index_regs],
+ REGNO (base)))
+ {
+ const_reg = reg;
+@@ -841,8 +844,7 @@
+ two registers. */
+ for (i = first_index_reg; i <= last_index_reg; i++)
+ {
+- if (TEST_HARD_REG_BIT (reg_class_contents[INDEX_REG_CLASS],
+- i)
++ if (TEST_HARD_REG_BIT (reg_class_contents[index_regs], i)
+ && reg_state[i].use_index == RELOAD_COMBINE_MAX_USES
+ && reg_state[i].store_ruid <= reg_state[regno].use_ruid
+ && hard_regno_nregs[i][GET_MODE (reg)] == 1)
+diff -Nur a/gcc/real.c b/gcc/real.c
+--- a/gcc/real.c 2009-02-06 22:01:46.000000000 +0100
++++ b/gcc/real.c 2010-01-25 09:50:29.155687438 +0100
+@@ -4513,6 +4513,167 @@
+ false
+ };
+
++/* Encode half-precision floats. This routine is used both for the IEEE
++ ARM alternative encodings. */
++static void
++encode_ieee_half (const struct real_format *fmt, long *buf,
++ const REAL_VALUE_TYPE *r)
++{
++ unsigned long image, sig, exp;
++ unsigned long sign = r->sign;
++ bool denormal = (r->sig[SIGSZ-1] & SIG_MSB) == 0;
++
++ image = sign << 15;
++ sig = (r->sig[SIGSZ-1] >> (HOST_BITS_PER_LONG - 11)) & 0x3ff;
++
++ switch (r->cl)
++ {
++ case rvc_zero:
++ break;
++
++ case rvc_inf:
++ if (fmt->has_inf)
++ image |= 31 << 10;
++ else
++ image |= 0x7fff;
++ break;
++
++ case rvc_nan:
++ if (fmt->has_nans)
++ {
++ if (r->canonical)
++ sig = (fmt->canonical_nan_lsbs_set ? (1 << 9) - 1 : 0);
++ if (r->signalling == fmt->qnan_msb_set)
++ sig &= ~(1 << 9);
++ else
++ sig |= 1 << 9;
++ if (sig == 0)
++ sig = 1 << 8;
++
++ image |= 31 << 10;
++ image |= sig;
++ }
++ else
++ image |= 0x3ff;
++ break;
++
++ case rvc_normal:
++ /* Recall that IEEE numbers are interpreted as 1.F x 2**exp,
++ whereas the intermediate representation is 0.F x 2**exp.
++ Which means we're off by one. */
++ if (denormal)
++ exp = 0;
++ else
++ exp = REAL_EXP (r) + 15 - 1;
++ image |= exp << 10;
++ image |= sig;
++ break;
++
++ default:
++ gcc_unreachable ();
++ }
++
++ buf[0] = image;
++}
++
++/* Decode half-precision floats. This routine is used both for the IEEE
++ ARM alternative encodings. */
++static void
++decode_ieee_half (const struct real_format *fmt, REAL_VALUE_TYPE *r,
++ const long *buf)
++{
++ unsigned long image = buf[0] & 0xffff;
++ bool sign = (image >> 15) & 1;
++ int exp = (image >> 10) & 0x1f;
++
++ memset (r, 0, sizeof (*r));
++ image <<= HOST_BITS_PER_LONG - 11;
++ image &= ~SIG_MSB;
++
++ if (exp == 0)
++ {
++ if (image && fmt->has_denorm)
++ {
++ r->cl = rvc_normal;
++ r->sign = sign;
++ SET_REAL_EXP (r, -14);
++ r->sig[SIGSZ-1] = image << 1;
++ normalize (r);
++ }
++ else if (fmt->has_signed_zero)
++ r->sign = sign;
++ }
++ else if (exp == 31 && (fmt->has_nans || fmt->has_inf))
++ {
++ if (image)
++ {
++ r->cl = rvc_nan;
++ r->sign = sign;
++ r->signalling = (((image >> (HOST_BITS_PER_LONG - 2)) & 1)
++ ^ fmt->qnan_msb_set);
++ r->sig[SIGSZ-1] = image;
++ }
++ else
++ {
++ r->cl = rvc_inf;
++ r->sign = sign;
++ }
++ }
++ else
++ {
++ r->cl = rvc_normal;
++ r->sign = sign;
++ SET_REAL_EXP (r, exp - 15 + 1);
++ r->sig[SIGSZ-1] = image | SIG_MSB;
++ }
++}
++
++/* Half-precision format, as specified in IEEE 754R. */
++const struct real_format ieee_half_format =
++ {
++ encode_ieee_half,
++ decode_ieee_half,
++ 2,
++ 11,
++ 11,
++ -13,
++ 16,
++ 15,
++ 15,
++ false,
++ true,
++ true,
++ true,
++ true,
++ true,
++ true,
++ false
++ };
++
++/* ARM's alternative half-precision format, similar to IEEE but with
++ no reserved exponent value for NaNs and infinities; rather, it just
++ extends the range of exponents by one. */
++const struct real_format arm_half_format =
++ {
++ encode_ieee_half,
++ decode_ieee_half,
++ 2,
++ 11,
++ 11,
++ -13,
++ 17,
++ 15,
++ 15,
++ false,
++ true,
++ false,
++ false,
++ true,
++ true,
++ false,
++ false
++ };
++
+ /* A synthetic "format" for internal arithmetic. It's the size of the
+ internal significand minus the two bits needed for proper rounding.
+ The encode and decode routines exist only to satisfy our paranoia
+diff -Nur a/gcc/real.h b/gcc/real.h
+--- a/gcc/real.h 2008-10-29 18:05:42.000000000 +0100
++++ b/gcc/real.h 2010-01-25 09:50:29.155687438 +0100
+@@ -304,6 +304,8 @@
+ extern const struct real_format decimal_single_format;
+ extern const struct real_format decimal_double_format;
+ extern const struct real_format decimal_quad_format;
++extern const struct real_format ieee_half_format;
++extern const struct real_format arm_half_format;
+
+
+ /* ====================================================================== */
+diff -Nur a/gcc/regrename.c b/gcc/regrename.c
+--- a/gcc/regrename.c 2009-02-20 16:20:38.000000000 +0100
++++ b/gcc/regrename.c 2010-01-25 09:50:29.155687438 +0100
+@@ -567,14 +567,14 @@
+ int index_op;
+ unsigned regno0 = REGNO (op0), regno1 = REGNO (op1);
+
+- if (REGNO_OK_FOR_INDEX_P (regno1)
++ if (regno_ok_for_index_p (regno1, mode)
+ && regno_ok_for_base_p (regno0, mode, PLUS, REG))
+ index_op = 1;
+- else if (REGNO_OK_FOR_INDEX_P (regno0)
++ else if (regno_ok_for_index_p (regno0, mode)
+ && regno_ok_for_base_p (regno1, mode, PLUS, REG))
+ index_op = 0;
+ else if (regno_ok_for_base_p (regno0, mode, PLUS, REG)
+- || REGNO_OK_FOR_INDEX_P (regno1))
++ || regno_ok_for_index_p (regno1, mode))
+ index_op = 1;
+ else if (regno_ok_for_base_p (regno1, mode, PLUS, REG))
+ index_op = 0;
+@@ -599,7 +599,7 @@
+ }
+
+ if (locI)
+- scan_rtx_address (insn, locI, INDEX_REG_CLASS, action, mode);
++ scan_rtx_address (insn, locI, index_reg_class (mode), action, mode);
+ if (locB)
+ scan_rtx_address (insn, locB, base_reg_class (mode, PLUS, index_code),
+ action, mode);
+@@ -1488,14 +1488,14 @@
+ int index_op;
+ unsigned regno0 = REGNO (op0), regno1 = REGNO (op1);
+
+- if (REGNO_OK_FOR_INDEX_P (regno1)
++ if (regno_ok_for_index_p (regno1, mode)
+ && regno_ok_for_base_p (regno0, mode, PLUS, REG))
+ index_op = 1;
+- else if (REGNO_OK_FOR_INDEX_P (regno0)
++ else if (regno_ok_for_index_p (regno0, mode)
+ && regno_ok_for_base_p (regno1, mode, PLUS, REG))
+ index_op = 0;
+ else if (regno_ok_for_base_p (regno0, mode, PLUS, REG)
+- || REGNO_OK_FOR_INDEX_P (regno1))
++ || regno_ok_for_index_p (regno1, mode))
+ index_op = 1;
+ else if (regno_ok_for_base_p (regno1, mode, PLUS, REG))
+ index_op = 0;
+@@ -1520,8 +1520,8 @@
+ }
+
+ if (locI)
+- changed |= replace_oldest_value_addr (locI, INDEX_REG_CLASS, mode,
+- insn, vd);
++ changed |= replace_oldest_value_addr (locI, index_reg_class (mode),
++ mode, insn, vd);
+ if (locB)
+ changed |= replace_oldest_value_addr (locB,
+ base_reg_class (mode, PLUS,
+diff -Nur a/gcc/reload.c b/gcc/reload.c
+--- a/gcc/reload.c 2009-02-20 16:20:38.000000000 +0100
++++ b/gcc/reload.c 2010-01-25 09:50:29.155687438 +0100
+@@ -5046,7 +5046,7 @@
+ loc = &XEXP (*loc, 0);
+ }
+
+- if (double_reg_address_ok)
++ if (double_reg_address_ok && index_reg_class (mode) != NO_REGS)
+ {
+ /* Unshare the sum as well. */
+ *loc = ad = copy_rtx (ad);
+@@ -5054,8 +5054,8 @@
+ /* Reload the displacement into an index reg.
+ We assume the frame pointer or arg pointer is a base reg. */
+ find_reloads_address_part (XEXP (ad, 1), &XEXP (ad, 1),
+- INDEX_REG_CLASS, GET_MODE (ad), opnum,
+- type, ind_levels);
++ index_reg_class (mode), GET_MODE (ad),
++ opnum, type, ind_levels);
+ return 0;
+ }
+ else
+@@ -5448,13 +5448,13 @@
+ #define REG_OK_FOR_CONTEXT(CONTEXT, REGNO, MODE, OUTER, INDEX) \
+ ((CONTEXT) == 0 \
+ ? regno_ok_for_base_p (REGNO, MODE, OUTER, INDEX) \
+- : REGNO_OK_FOR_INDEX_P (REGNO))
++ : regno_ok_for_index_p (REGNO, MODE))
+
+ enum reg_class context_reg_class;
+ RTX_CODE code = GET_CODE (x);
+
+ if (context == 1)
+- context_reg_class = INDEX_REG_CLASS;
++ context_reg_class = index_reg_class (mode);
+ else
+ context_reg_class = base_reg_class (mode, outer_code, index_code);
+
+@@ -5546,17 +5546,17 @@
+
+ else if (code0 == REG && code1 == REG)
+ {
+- if (REGNO_OK_FOR_INDEX_P (REGNO (op1))
++ if (regno_ok_for_index_p (REGNO (op1), mode)
+ && regno_ok_for_base_p (REGNO (op0), mode, PLUS, REG))
+ return 0;
+- else if (REGNO_OK_FOR_INDEX_P (REGNO (op0))
++ else if (regno_ok_for_index_p (REGNO (op0), mode)
+ && regno_ok_for_base_p (REGNO (op1), mode, PLUS, REG))
+ return 0;
+ else if (regno_ok_for_base_p (REGNO (op0), mode, PLUS, REG))
+ find_reloads_address_1 (mode, orig_op1, 1, PLUS, SCRATCH,
+ &XEXP (x, 1), opnum, type, ind_levels,
+ insn);
+- else if (REGNO_OK_FOR_INDEX_P (REGNO (op1)))
++ else if (regno_ok_for_index_p (REGNO (op1), mode))
+ find_reloads_address_1 (mode, orig_op0, 0, PLUS, REG,
+ &XEXP (x, 0), opnum, type, ind_levels,
+ insn);
+@@ -5564,7 +5564,7 @@
+ find_reloads_address_1 (mode, orig_op0, 1, PLUS, SCRATCH,
+ &XEXP (x, 0), opnum, type, ind_levels,
+ insn);
+- else if (REGNO_OK_FOR_INDEX_P (REGNO (op0)))
++ else if (regno_ok_for_index_p (REGNO (op0), mode))
+ find_reloads_address_1 (mode, orig_op1, 0, PLUS, REG,
+ &XEXP (x, 1), opnum, type, ind_levels,
+ insn);
+@@ -5634,7 +5634,7 @@
+ need to live longer than a TYPE reload normally would, so be
+ conservative and class it as RELOAD_OTHER. */
+ if ((REG_P (XEXP (op1, 1))
+- && !REGNO_OK_FOR_INDEX_P (REGNO (XEXP (op1, 1))))
++ && !regno_ok_for_index_p (REGNO (XEXP (op1, 1)), mode))
+ || GET_CODE (XEXP (op1, 1)) == PLUS)
+ find_reloads_address_1 (mode, XEXP (op1, 1), 1, code, SCRATCH,
+ &XEXP (op1, 1), opnum, RELOAD_OTHER,
+@@ -6128,18 +6128,26 @@
+ /* For some processors an address may be valid in the
+ original mode but not in a smaller mode. For
+ example, ARM accepts a scaled index register in
+- SImode but not in HImode. Similarly, the address may
+- have been valid before the subreg offset was added,
+- but not afterwards. find_reloads_address
+- assumes that we pass it a valid address, and doesn't
+- force a reload. This will probably be fine if
+- find_reloads_address finds some reloads. But if it
+- doesn't find any, then we may have just converted a
+- valid address into an invalid one. Check for that
+- here. */
++ SImode but not in HImode. Note that this is only
++ a problem if the address in reg_equiv_mem is already
++ invalid in the new mode; other cases would be fixed
++ by find_reloads_address as usual.
++
++ ??? We attempt to handle such cases here by doing an
++ additional reload of the full address after the
++ usual processing by find_reloads_address. Note that
++ this may not work in the general case, but it seems
++ to cover the cases where this situation currently
++ occurs. A more general fix might be to reload the
++ *value* instead of the address, but this would not
++ be expected by the callers of this routine as-is.
++
++ If find_reloads_address already completed replaced
++ the address, there is nothing further to do. */
+ if (reloaded == 0
+- && !strict_memory_address_p (GET_MODE (tem),
+- XEXP (tem, 0)))
++ && reg_equiv_mem[regno] != 0
++ && !strict_memory_address_p (GET_MODE (x),
++ XEXP (reg_equiv_mem[regno], 0)))
+ push_reload (XEXP (tem, 0), NULL_RTX, &XEXP (tem, 0), (rtx*) 0,
+ base_reg_class (GET_MODE (tem), MEM, SCRATCH),
+ GET_MODE (XEXP (tem, 0)), VOIDmode, 0, 0,
+diff -Nur a/gcc/rtlanal.c b/gcc/rtlanal.c
+--- a/gcc/rtlanal.c 2009-03-14 09:10:55.000000000 +0100
++++ b/gcc/rtlanal.c 2010-01-25 09:50:29.155687438 +0100
+@@ -2913,62 +2913,78 @@
+ commutative_operand_precedence (rtx op)
+ {
+ enum rtx_code code = GET_CODE (op);
++ int value;
+
+ /* Constants always come the second operand. Prefer "nice" constants. */
+ if (code == CONST_INT)
+- return -8;
+- if (code == CONST_DOUBLE)
+- return -7;
+- if (code == CONST_FIXED)
+- return -7;
+- op = avoid_constant_pool_reference (op);
+- code = GET_CODE (op);
+-
+- switch (GET_RTX_CLASS (code))
+- {
+- case RTX_CONST_OBJ:
+- if (code == CONST_INT)
+- return -6;
+- if (code == CONST_DOUBLE)
+- return -5;
+- if (code == CONST_FIXED)
+- return -5;
+- return -4;
+-
+- case RTX_EXTRA:
+- /* SUBREGs of objects should come second. */
+- if (code == SUBREG && OBJECT_P (SUBREG_REG (op)))
+- return -3;
+- return 0;
++ value = -8;
++ else if (code == CONST_DOUBLE)
++ value = -7;
++ else if (code == CONST_FIXED)
++ value = -7;
++ else
++ {
++ op = avoid_constant_pool_reference (op);
++ code = GET_CODE (op);
++
++ switch (GET_RTX_CLASS (code))
++ {
++ case RTX_CONST_OBJ:
++ if (code == CONST_INT)
++ value = -6;
++ else if (code == CONST_DOUBLE)
++ value = -5;
++ else if (code == CONST_FIXED)
++ value = -5;
++ else
++ value = -4;
++ break;
++
++ case RTX_EXTRA:
++ /* SUBREGs of objects should come second. */
++ if (code == SUBREG && OBJECT_P (SUBREG_REG (op)))
++ value = -3;
++ else
++ value = 0;
++ break;
++
++ case RTX_OBJ:
++ /* Complex expressions should be the first, so decrease priority
++ of objects. */
++ value = -1;
++ break;
+
+- case RTX_OBJ:
+- /* Complex expressions should be the first, so decrease priority
+- of objects. Prefer pointer objects over non pointer objects. */
+- if ((REG_P (op) && REG_POINTER (op))
+- || (MEM_P (op) && MEM_POINTER (op)))
+- return -1;
+- return -2;
+-
+- case RTX_COMM_ARITH:
+- /* Prefer operands that are themselves commutative to be first.
+- This helps to make things linear. In particular,
+- (and (and (reg) (reg)) (not (reg))) is canonical. */
+- return 4;
+-
+- case RTX_BIN_ARITH:
+- /* If only one operand is a binary expression, it will be the first
+- operand. In particular, (plus (minus (reg) (reg)) (neg (reg)))
+- is canonical, although it will usually be further simplified. */
+- return 2;
++ case RTX_COMM_ARITH:
++ /* Prefer operands that are themselves commutative to be first.
++ This helps to make things linear. In particular,
++ (and (and (reg) (reg)) (not (reg))) is canonical. */
++ value = 4;
++ break;
++
++ case RTX_BIN_ARITH:
++ /* If only one operand is a binary expression, it will be the first
++ operand. In particular, (plus (minus (reg) (reg)) (neg (reg)))
++ is canonical, although it will usually be further simplified. */
++ value = 2;
++ break;
+
+- case RTX_UNARY:
+- /* Then prefer NEG and NOT. */
+- if (code == NEG || code == NOT)
+- return 1;
++ case RTX_UNARY:
++ /* Then prefer NEG and NOT. */
++ if (code == NEG || code == NOT)
++ value = 1;
++ else
++ value = 0;
++ break;
+
+- default:
+- return 0;
++ default:
++ value = 0;
++ }
+ }
++
++ if (targetm.commutative_operand_precedence)
++ value = targetm.commutative_operand_precedence (op, value);
++
++ return value;
+ }
+
+ /* Return 1 iff it is necessary to swap operands of commutative operation
+diff -Nur a/gcc/rtl.def b/gcc/rtl.def
+--- a/gcc/rtl.def 2008-02-26 17:05:24.000000000 +0100
++++ b/gcc/rtl.def 2010-01-25 09:50:29.155687438 +0100
+@@ -1088,7 +1088,11 @@
+ guard for the bypass. The function will get the two insns as
+ parameters. If the function returns zero the bypass will be
+ ignored for this case. Additional guard is necessary to recognize
+- complicated bypasses, e.g. when consumer is load address. */
++ complicated bypasses, e.g. when consumer is load address. If there
++ are more one bypass with the same output and input insns, the
++ chosen bypass is the first bypass with a guard in description whose
++ guard function returns nonzero. If there is no such bypass, then
++ bypass without the guard function is chosen. */
+ DEF_RTL_EXPR(DEFINE_BYPASS, "define_bypass", "issS", RTX_EXTRA)
+
+ /* (define_automaton string) describes names of automata generated and
+diff -Nur a/gcc/sched-ebb.c b/gcc/sched-ebb.c
+--- a/gcc/sched-ebb.c 2009-02-20 16:20:38.000000000 +0100
++++ b/gcc/sched-ebb.c 2010-01-25 09:50:29.155687438 +0100
+@@ -286,6 +286,7 @@
+ rank,
+ ebb_print_insn,
+ ebb_contributes_to_priority,
++ NULL, /* insn_finishes_block_p */
+
+ NULL, NULL,
+ NULL, NULL,
+diff -Nur a/gcc/sched-int.h b/gcc/sched-int.h
+--- a/gcc/sched-int.h 2009-02-20 16:20:38.000000000 +0100
++++ b/gcc/sched-int.h 2010-01-25 09:50:29.155687438 +0100
+@@ -558,6 +558,10 @@
+ calculations. */
+ int (*contributes_to_priority) (rtx, rtx);
+
++ /* Return true if scheduling insn (passed as the parameter) will trigger
++ finish of scheduling current block. */
++ bool (*insn_finishes_block_p) (rtx);
++
+ /* The boundaries of the set of insns to be scheduled. */
+ rtx prev_head, next_tail;
+
+diff -Nur a/gcc/sched-rgn.c b/gcc/sched-rgn.c
+--- a/gcc/sched-rgn.c 2008-09-18 10:29:48.000000000 +0200
++++ b/gcc/sched-rgn.c 2010-01-25 09:50:29.155687438 +0100
+@@ -2338,6 +2338,19 @@
+ 0, 0, 0
+ };
+
++/* Return true if scheduling INSN will trigger finish of scheduling
++ current block. */
++static bool
++rgn_insn_finishes_block_p (rtx insn)
++{
++ if (INSN_BB (insn) == target_bb
++ && sched_target_n_insns + 1 == target_n_insns)
++ /* INSN is the last not-scheduled instruction in the current block. */
++ return true;
++
++ return false;
++}
++
+ /* Used in schedule_insns to initialize current_sched_info for scheduling
+ regions (or single basic blocks). */
+
+@@ -2350,6 +2363,7 @@
+ rgn_rank,
+ rgn_print_insn,
+ contributes_to_priority,
++ rgn_insn_finishes_block_p,
+
+ NULL, NULL,
+ NULL, NULL,
+diff -Nur a/gcc/sdbout.c b/gcc/sdbout.c
+--- a/gcc/sdbout.c 2009-02-20 16:20:38.000000000 +0100
++++ b/gcc/sdbout.c 2010-01-25 09:50:29.155687438 +0100
+@@ -337,6 +337,7 @@
+ debug_nothing_int, /* handle_pch */
+ debug_nothing_rtx, /* var_location */
+ debug_nothing_void, /* switch_text_section */
++ debug_nothing_tree_tree, /* set_name */
+ 0 /* start_end_main_source_file */
+ };
+
+diff -Nur a/gcc/sel-sched-ir.c b/gcc/sel-sched-ir.c
+--- a/gcc/sel-sched-ir.c 2008-10-12 01:39:21.000000000 +0200
++++ b/gcc/sel-sched-ir.c 2010-01-25 09:50:29.165687452 +0100
+@@ -5431,6 +5431,7 @@
+ NULL, /* rgn_rank */
+ sel_print_insn, /* rgn_print_insn */
+ contributes_to_priority,
++ NULL, /* insn_finishes_block_p */
+
+ NULL, NULL,
+ NULL, NULL,
+diff -Nur a/gcc/target-def.h b/gcc/target-def.h
+--- a/gcc/target-def.h 2009-02-20 16:20:38.000000000 +0100
++++ b/gcc/target-def.h 2010-01-25 09:50:29.165687452 +0100
+@@ -84,7 +84,7 @@
+ #define TARGET_ASM_INTERNAL_LABEL default_internal_label
+ #endif
+
+-#ifndef TARGET_ARM_TTYPE
++#ifndef TARGET_ASM_TTYPE
+ #define TARGET_ASM_TTYPE hook_bool_rtx_false
+ #endif
+
+@@ -208,6 +208,10 @@
+ #define TARGET_EXTRA_LIVE_ON_ENTRY hook_void_bitmap
+ #endif
+
++#ifndef TARGET_WARN_FUNC_RESULT
++#define TARGET_WARN_FUNC_RESULT hook_bool_void_true
++#endif
++
+ #ifndef TARGET_ASM_FILE_START_APP_OFF
+ #define TARGET_ASM_FILE_START_APP_OFF false
+ #endif
+@@ -383,6 +387,9 @@
+ #define TARGET_VECTOR_ALIGNMENT_REACHABLE \
+ default_builtin_vector_alignment_reachable
+ #define TARGET_VECTORIZE_BUILTIN_VEC_PERM 0
++#define TARGET_VECTOR_MIN_ALIGNMENT \
++ default_vector_min_alignment
++#define TARGET_VECTOR_ALWAYS_MISALIGN hook_bool_const_tree_false
+
+ #define TARGET_VECTORIZE \
+ { \
+@@ -393,7 +400,9 @@
+ TARGET_VECTORIZE_BUILTIN_MUL_WIDEN_ODD, \
+ TARGET_VECTORIZE_BUILTIN_VECTORIZATION_COST, \
+ TARGET_VECTOR_ALIGNMENT_REACHABLE, \
+- TARGET_VECTORIZE_BUILTIN_VEC_PERM \
++ TARGET_VECTORIZE_BUILTIN_VEC_PERM, \
++ TARGET_VECTOR_MIN_ALIGNMENT, \
++ TARGET_VECTOR_ALWAYS_MISALIGN, \
+ }
+
+ #define TARGET_DEFAULT_TARGET_FLAGS 0
+@@ -504,6 +513,7 @@
+ #define TARGET_ALLOCATE_INITIAL_VALUE NULL
+
+ #define TARGET_UNSPEC_MAY_TRAP_P default_unspec_may_trap_p
++#define TARGET_COMMUTATIVE_OPERAND_PRECEDENCE NULL
+
+ #ifndef TARGET_SET_CURRENT_FUNCTION
+ #define TARGET_SET_CURRENT_FUNCTION hook_void_tree
+@@ -532,6 +542,10 @@
+ #define TARGET_INVALID_CONVERSION hook_constcharptr_const_tree_const_tree_null
+ #define TARGET_INVALID_UNARY_OP hook_constcharptr_int_const_tree_null
+ #define TARGET_INVALID_BINARY_OP hook_constcharptr_int_const_tree_const_tree_null
++#define TARGET_INVALID_PARAMETER_TYPE hook_constcharptr_const_tree_null
++#define TARGET_INVALID_RETURN_TYPE hook_constcharptr_const_tree_null
++#define TARGET_PROMOTED_TYPE hook_tree_const_tree_null
++#define TARGET_CONVERT_TO_TYPE hook_tree_tree_tree_null
+
+ #define TARGET_FIXED_CONDITION_CODE_REGS hook_bool_uintp_uintp_false
+
+@@ -590,6 +604,7 @@
+ #define TARGET_ARG_PARTIAL_BYTES hook_int_CUMULATIVE_ARGS_mode_tree_bool_0
+
+ #define TARGET_FUNCTION_VALUE default_function_value
++#define TARGET_LIBCALL_VALUE default_libcall_value
+ #define TARGET_INTERNAL_ARG_POINTER default_internal_arg_pointer
+ #define TARGET_UPDATE_STACK_BOUNDARY NULL
+ #define TARGET_GET_DRAP_RTX NULL
+@@ -613,6 +628,7 @@
+ TARGET_ARG_PARTIAL_BYTES, \
+ TARGET_INVALID_ARG_FOR_UNPROTOTYPED_FN, \
+ TARGET_FUNCTION_VALUE, \
++ TARGET_LIBCALL_VALUE, \
+ TARGET_INTERNAL_ARG_POINTER, \
+ TARGET_UPDATE_STACK_BOUNDARY, \
+ TARGET_GET_DRAP_RTX, \
+@@ -716,6 +732,11 @@
+ #define TARGET_CXX_ADJUST_CLASS_AT_DEFINITION hook_void_tree
+ #endif
+
++
++#ifndef TARGET_CXX_TTYPE_REF_ENCODE
++#define TARGET_CXX_TTYPE_REF_ENCODE NULL
++#endif
++
+ #define TARGET_CXX \
+ { \
+ TARGET_CXX_GUARD_TYPE, \
+@@ -730,7 +751,8 @@
+ TARGET_CXX_LIBRARY_RTTI_COMDAT, \
+ TARGET_CXX_USE_AEABI_ATEXIT, \
+ TARGET_CXX_USE_ATEXIT_FOR_CXA_ATEXIT, \
+- TARGET_CXX_ADJUST_CLASS_AT_DEFINITION \
++ TARGET_CXX_ADJUST_CLASS_AT_DEFINITION, \
++ TARGET_CXX_TTYPE_REF_ENCODE \
+ }
+
+ /* EMUTLS specific */
+@@ -886,6 +908,7 @@
+ TARGET_ADDRESS_COST, \
+ TARGET_ALLOCATE_INITIAL_VALUE, \
+ TARGET_UNSPEC_MAY_TRAP_P, \
++ TARGET_COMMUTATIVE_OPERAND_PRECEDENCE, \
+ TARGET_DWARF_REGISTER_SPAN, \
+ TARGET_INIT_DWARF_REG_SIZES_EXTRA, \
+ TARGET_FIXED_CONDITION_CODE_REGS, \
+@@ -913,6 +936,10 @@
+ TARGET_INVALID_CONVERSION, \
+ TARGET_INVALID_UNARY_OP, \
+ TARGET_INVALID_BINARY_OP, \
++ TARGET_INVALID_PARAMETER_TYPE, \
++ TARGET_INVALID_RETURN_TYPE, \
++ TARGET_PROMOTED_TYPE, \
++ TARGET_CONVERT_TO_TYPE, \
+ TARGET_IRA_COVER_CLASSES, \
+ TARGET_SECONDARY_RELOAD, \
+ TARGET_EXPAND_TO_RTL_HOOK, \
+@@ -923,6 +950,7 @@
+ TARGET_EMUTLS, \
+ TARGET_OPTION_HOOKS, \
+ TARGET_EXTRA_LIVE_ON_ENTRY, \
++ TARGET_WARN_FUNC_RESULT, \
+ TARGET_UNWIND_TABLES_DEFAULT, \
+ TARGET_HAVE_NAMED_SECTIONS, \
+ TARGET_HAVE_SWITCHABLE_BSS_SECTIONS, \
+diff -Nur a/gcc/target.h b/gcc/target.h
+--- a/gcc/target.h 2009-02-20 16:20:38.000000000 +0100
++++ b/gcc/target.h 2010-01-25 09:50:29.165687452 +0100
+@@ -473,7 +473,16 @@
+
+ /* Target builtin that implements vector permute. */
+ tree (* builtin_vec_perm) (tree, tree*);
+-} vectorize;
++
++ /* Return the minimum alignment required to load or store a
++ vector of the given type, which may be less than the
++ natural alignment of the type. */
++ int (* vector_min_alignment) (const_tree);
++
++ /* Return true if "movmisalign" patterns should be used for all
++ loads/stores from data arrays. */
++ bool (* always_misalign) (const_tree);
++ } vectorize;
+
+ /* The initial value of target_flags. */
+ int default_target_flags;
+@@ -694,6 +703,10 @@
+ FLAGS has the same meaning as in rtlanal.c: may_trap_p_1. */
+ int (* unspec_may_trap_p) (const_rtx x, unsigned flags);
+
++ /* Return a value indicating whether an operand of a commutative
++ operation is preferred as the first or second operand. */
++ int (* commutative_operand_precedence) (const_rtx, int);
++
+ /* Given a register, this hook should return a parallel of registers
+ to represent where to find the register pieces. Define this hook
+ if the register and its mode are represented in Dwarf in
+@@ -870,6 +883,10 @@
+ rtx (*function_value) (const_tree ret_type, const_tree fn_decl_or_type,
+ bool outgoing);
+
++ /* Return the rtx for the result of a libcall of mode MODE,
++ calling the function FN_NAME. */
++ rtx (*libcall_value) (enum machine_mode, rtx);
++
+ /* Return an rtx for the argument pointer incoming to the
+ current function. */
+ rtx (*internal_arg_pointer) (void);
+@@ -899,6 +916,24 @@
+ is not permitted on TYPE1 and TYPE2, NULL otherwise. */
+ const char *(*invalid_binary_op) (int op, const_tree type1, const_tree type2);
+
++ /* Return the diagnostic message string if TYPE is not valid as a
++ function parameter type, NULL otherwise. */
++ const char *(*invalid_parameter_type) (const_tree type);
++
++ /* Return the diagnostic message string if TYPE is not valid as a
++ function return type, NULL otherwise. */
++ const char *(*invalid_return_type) (const_tree type);
++
++ /* If values of TYPE are promoted to some other type when used in
++ expressions (analogous to the integer promotions), return that type,
++ or NULL_TREE otherwise. */
++ tree (*promoted_type) (const_tree type);
++
++ /* Convert EXPR to TYPE, if target-specific types with special conversion
++ rules are involved. Return the converted expression, or NULL to apply
++ the standard conversion rules. */
++ tree (*convert_to_type) (tree type, tree expr);
++
+ /* Return the array of IRA cover classes for the current target. */
+ const enum reg_class *(*ira_cover_classes) (void);
+
+@@ -977,6 +1012,11 @@
+ class (eg, tweak visibility or perform any other required
+ target modifications). */
+ void (*adjust_class_at_definition) (tree type);
++ /* Encode a reference type info, used for catching pointer
++ references. The provided expression will be the address of the
++ type info object of the type to which a reference is being
++ caught. */
++ tree (* ttype_ref_encode) (tree);
+ } cxx;
+
+ /* Functions and data for emulated TLS support. */
+@@ -1040,6 +1080,10 @@
+ bits in the bitmap passed in. */
+ void (*live_on_entry) (bitmap);
+
++ /* Return false if warnings about missing return statements or suspect
++ noreturn attributes should be suppressed for the current function. */
++ bool (*warn_func_result) (void);
++
+ /* True if unwinding tables should be generated by default. */
+ bool unwind_tables_default;
+
+diff -Nur a/gcc/targhooks.c b/gcc/targhooks.c
+--- a/gcc/targhooks.c 2009-02-20 16:20:38.000000000 +0100
++++ b/gcc/targhooks.c 2010-01-25 09:50:29.165687452 +0100
+@@ -441,6 +441,15 @@
+ return NULL;
+ }
+
++tree
++hook_cxx_ttype_ref_in_bit0 (tree exp)
++{
++ exp = convert (build_pointer_type (char_type_node), exp);
++ exp = pointer_int_sum (PLUS_EXPR, exp, integer_one_node);
++
++ return exp;
++}
++
+ /* Initialize the stack protection decls. */
+
+ /* Stack protection related decls living in libgcc. */
+@@ -561,6 +570,12 @@
+ }
+
+ rtx
++default_libcall_value (enum machine_mode mode, rtx fun ATTRIBUTE_UNUSED)
++{
++ return LIBCALL_VALUE (mode);
++}
++
++rtx
+ default_internal_arg_pointer (void)
+ {
+ /* If the reg that the virtual arg pointer will be translated into is
+@@ -712,6 +727,12 @@
+ return true;
+ }
+
++int
++default_vector_min_alignment (const_tree type)
++{
++ return TYPE_ALIGN_UNIT (type);
++}
++
+ bool
+ default_hard_regno_scratch_ok (unsigned int regno ATTRIBUTE_UNUSED)
+ {
+diff -Nur a/gcc/targhooks.h b/gcc/targhooks.h
+--- a/gcc/targhooks.h 2009-02-20 16:20:38.000000000 +0100
++++ b/gcc/targhooks.h 2010-01-25 09:50:29.165687452 +0100
+@@ -48,6 +48,7 @@
+
+ extern tree default_cxx_guard_type (void);
+ extern tree default_cxx_get_cookie_size (tree);
++extern tree hook_cxx_ttype_ref_in_bit0 (tree);
+
+ extern bool hook_pass_by_reference_must_pass_in_stack
+ (CUMULATIVE_ARGS *, enum machine_mode mode, const_tree, bool);
+@@ -71,6 +72,8 @@
+
+ extern bool default_builtin_vector_alignment_reachable (const_tree, bool);
+
++extern int default_vector_min_alignment (const_tree);
++
+ /* These are here, and not in hooks.[ch], because not all users of
+ hooks.h include tm.h, and thus we don't have CUMULATIVE_ARGS. */
+
+@@ -87,6 +90,7 @@
+ (const_tree, const_tree, const_tree);
+ extern bool hook_bool_const_rtx_commutative_p (const_rtx, int);
+ extern rtx default_function_value (const_tree, const_tree, bool);
++extern rtx default_libcall_value (enum machine_mode, rtx);
+ extern rtx default_internal_arg_pointer (void);
+ #ifdef IRA_COVER_CLASSES
+ extern const enum reg_class *default_ira_cover_classes (void);
+diff -Nur a/gcc/testsuite/gcc.c-torture/execute/990208-1.x b/gcc/testsuite/gcc.c-torture/execute/990208-1.x
+--- a/gcc/testsuite/gcc.c-torture/execute/990208-1.x 1970-01-01 01:00:00.000000000 +0100
++++ b/gcc/testsuite/gcc.c-torture/execute/990208-1.x 2010-01-25 09:50:29.165687452 +0100
+@@ -0,0 +1,12 @@
++
++# On ARM, with -Os, some of the functions that this test
++# expects to be inlined are not inlined for code size
++# reasons. This is not a bug, it's intentional,
++# so stop this test from running.
++set torture_eval_before_compile {
++ if { [istarget "arm-*-*"] && [string match {*-Os*} "$option"] } {
++ continue
++ }
++}
++
++return 0
+\ No newline at end of file
+diff -Nur a/gcc/testsuite/gcc.c-torture/execute/bcp-1.x b/gcc/testsuite/gcc.c-torture/execute/bcp-1.x
+--- a/gcc/testsuite/gcc.c-torture/execute/bcp-1.x 1970-01-01 01:00:00.000000000 +0100
++++ b/gcc/testsuite/gcc.c-torture/execute/bcp-1.x 2010-01-25 09:50:29.165687452 +0100
+@@ -0,0 +1,12 @@
++
++# On ARM, with -Os, some of the functions that this test
++# expects to be inlined are not inlined for code size
++# reasons. This is not a bug, it's intentional,
++# so stop this test from running.
++set torture_eval_before_compile {
++ if { [istarget "arm-*-*"] && [string match {*-Os*} "$option"] } {
++ continue
++ }
++}
++
++return 0
+\ No newline at end of file
+diff -Nur a/gcc/testsuite/gcc.c-torture/execute/ieee/ieee.exp b/gcc/testsuite/gcc.c-torture/execute/ieee/ieee.exp
+--- a/gcc/testsuite/gcc.c-torture/execute/ieee/ieee.exp 2009-03-16 22:11:57.000000000 +0100
++++ b/gcc/testsuite/gcc.c-torture/execute/ieee/ieee.exp 2010-01-25 09:50:29.165687452 +0100
+@@ -54,6 +54,9 @@
+ || [istarget "sh*-*-*"] } then {
+ lappend additional_flags "-mieee"
+ }
++if [istarget "mips*-sde-*"] then {
++ lappend additional_flags "-Wl,--defsym=__cs3_mips_float_type=2" "-lcs3-mips-cp1" "-lcs3-mips-fpemu"
++}
+
+ # load support procs
+ load_lib c-torture.exp
+diff -Nur a/gcc/testsuite/gcc.dg/builtin-redefine.c b/gcc/testsuite/gcc.dg/builtin-redefine.c
+--- a/gcc/testsuite/gcc.dg/builtin-redefine.c 2008-09-18 17:39:08.000000000 +0200
++++ b/gcc/testsuite/gcc.dg/builtin-redefine.c 2010-01-25 09:50:29.165687452 +0100
+@@ -28,7 +28,7 @@
+ #define __TIME__ "X" /* Re-define while defined. */
+
+ #define __TIME__ "Y" /* { dg-warning "\"__TIME__\" redefined" } */
+-/* { dg-warning "previous definition" "" { target *-*-* } 28 } */
++/* { dg-message "previous definition" "" { target *-*-* } 28 } */
+
+ #undef __TIME__ /* Undefine while defined. */
+
+@@ -39,7 +39,7 @@
+ #define __DATE__ "X" /* Re-define while defined. */
+
+ #define __DATE__ "Y" /* { dg-warning "\"__DATE__\" redefined" } */
+-/* { dg-warning "previous definition" "" { target *-*-* } 39 } */
++/* { dg-message "previous definition" "" { target *-*-* } 39 } */
+
+ #undef __DATE__ /* Undefine while defined. */
+
+@@ -48,7 +48,7 @@
+ #define __TIMESTAMP__ "X" /* Re-define while defined. */
+
+ #define __TIMESTAMP__ "Y" /* { dg-warning "\"__TIMESTAMP__\" redefined" } */
+-/* { dg-warning "previous definition" "" { target *-*-* } 48 } */
++/* { dg-message "previous definition" "" { target *-*-* } 48 } */
+
+ #undef __TIMESTAMP__ /* Undefine while defined. */
+
+diff -Nur a/gcc/testsuite/gcc.dg/compat/struct-layout-1_generate.c b/gcc/testsuite/gcc.dg/compat/struct-layout-1_generate.c
+--- a/gcc/testsuite/gcc.dg/compat/struct-layout-1_generate.c 2009-03-19 23:10:22.000000000 +0100
++++ b/gcc/testsuite/gcc.dg/compat/struct-layout-1_generate.c 2010-01-25 09:50:29.165687452 +0100
+@@ -46,7 +46,7 @@
+ "/* { dg-options \"%s-I%s\" } */\n",
+ "/* { dg-options \"%s-I%s -Wno-abi\" } */\n",
+ "/* { dg-options \"%s-I%s -mno-mmx -Wno-abi\" { target i?86-*-* x86_64-*-* } } */\n",
+-"/* { dg-options \"%s-I%s -fno-common\" { target hppa*-*-hpux* powerpc*-*-darwin* *-*-mingw32* *-*-cygwin* } } */\n",
++"/* { dg-options \"%s-I%s -fno-common\" { target hppa*-*-hpux* powerpc*-*-darwin* } } */\n",
+ "/* { dg-options \"%s-I%s -mno-mmx -fno-common -Wno-abi\" { target i?86-*-darwin* x86_64-*-darwin* } } */\n",
+ "/* { dg-options \"%s-I%s -mno-base-addresses\" { target mmix-*-* } } */\n",
+ "/* { dg-options \"%s-I%s -mlongcalls -mtext-section-literals\" { target xtensa*-*-* } } */\n"
+diff -Nur a/gcc/testsuite/gcc.dg/cpp/include2a.c b/gcc/testsuite/gcc.dg/cpp/include2a.c
+--- a/gcc/testsuite/gcc.dg/cpp/include2a.c 1970-01-01 01:00:00.000000000 +0100
++++ b/gcc/testsuite/gcc.dg/cpp/include2a.c 2010-01-25 09:50:29.165687452 +0100
+@@ -0,0 +1,16 @@
++/* Copyright (C) 2000 Free Software Foundation, Inc. */
++
++/* { dg-do preprocess } */
++
++/* Tests that #include does not allow the terminating '>' or '"' to be
++ escaped, as per the standard. */
++
++/* Source: Neil Booth, 4 Nov 2000. */
++
++#include "silly\"" /* { dg-error "extra tokens" "" } */
++
++/* These error is No such file or directory, just once. However, this
++ message is locale-dependent, so don't test for it. */
++/* { dg-error "silly" "" { target *-*-* } 10 } */
++/* { dg-error "missing" "" { target *-*-* } 10 } */
++/* { dg-message "terminated" "" { target *-*-* } 0 } */
+diff -Nur a/gcc/testsuite/gcc.dg/cpp/include2.c b/gcc/testsuite/gcc.dg/cpp/include2.c
+--- a/gcc/testsuite/gcc.dg/cpp/include2.c 2007-05-17 22:58:47.000000000 +0200
++++ b/gcc/testsuite/gcc.dg/cpp/include2.c 2010-01-25 09:50:29.165687452 +0100
+@@ -8,9 +8,8 @@
+ /* Source: Neil Booth, 4 Nov 2000. */
+
+ #include <silly\>> /* { dg-error "extra tokens" "" } */
+-#include "silly\"" /* { dg-error "extra tokens" "" } */
+
+ /* These error is No such file or directory, just once. However, this
+ message is locale-dependent, so don't test for it. */
+ /* { dg-error "silly" "" { target *-*-* } 10 } */
+-/* { dg-error "missing" "" { target *-*-* } 11 } */
++/* { dg-message "terminated" "" { target *-*-* } 0 } */
+diff -Nur a/gcc/testsuite/gcc.dg/cpp/missing-header-1.c b/gcc/testsuite/gcc.dg/cpp/missing-header-1.c
+--- a/gcc/testsuite/gcc.dg/cpp/missing-header-1.c 1970-01-01 01:00:00.000000000 +0100
++++ b/gcc/testsuite/gcc.dg/cpp/missing-header-1.c 2010-01-25 09:50:29.165687452 +0100
+@@ -0,0 +1,9 @@
++/* Test that missing headers are fatal errors. PR 15638. */
++/* { dg-do compile } */
++/* { dg-options "" } */
++
++#include "nonexistent.h" /* { dg-error "nonexistent.h" } */
++/* { dg-message "terminated" "" { target *-*-* } 0 } */
++
++/* This declaration should not receive any diagnostic. */
++foo bar;
+diff -Nur a/gcc/testsuite/gcc.dg/cpp/missing-header-MD.c b/gcc/testsuite/gcc.dg/cpp/missing-header-MD.c
+--- a/gcc/testsuite/gcc.dg/cpp/missing-header-MD.c 1970-01-01 01:00:00.000000000 +0100
++++ b/gcc/testsuite/gcc.dg/cpp/missing-header-MD.c 2010-01-25 09:50:29.165687452 +0100
+@@ -0,0 +1,6 @@
++/* Test that missing user headers are fatal errors with -MD. */
++/* { dg-do compile } */
++/* { dg-options "-MD" } */
++
++#include "nonexistent.h" /* { dg-error "nonexistent.h" } */
++/* { dg-message "terminated" "" { target *-*-* } 0 } */
+diff -Nur a/gcc/testsuite/gcc.dg/cpp/missing-header-MMD.c b/gcc/testsuite/gcc.dg/cpp/missing-header-MMD.c
+--- a/gcc/testsuite/gcc.dg/cpp/missing-header-MMD.c 1970-01-01 01:00:00.000000000 +0100
++++ b/gcc/testsuite/gcc.dg/cpp/missing-header-MMD.c 2010-01-25 09:50:29.165687452 +0100
+@@ -0,0 +1,6 @@
++/* Test that missing user headers are fatal errors with -MMD. */
++/* { dg-do compile } */
++/* { dg-options "-MMD" } */
++
++#include "nonexistent.h" /* { dg-error "nonexistent.h" } */
++/* { dg-message "terminated" "" { target *-*-* } 0 } */
+diff -Nur a/gcc/testsuite/gcc.dg/cpp/missing-sysheader-MD.c b/gcc/testsuite/gcc.dg/cpp/missing-sysheader-MD.c
+--- a/gcc/testsuite/gcc.dg/cpp/missing-sysheader-MD.c 1970-01-01 01:00:00.000000000 +0100
++++ b/gcc/testsuite/gcc.dg/cpp/missing-sysheader-MD.c 2010-01-25 09:50:29.165687452 +0100
+@@ -0,0 +1,6 @@
++/* Test that missing system headers are fatal errors with -MD. */
++/* { dg-do compile } */
++/* { dg-options "-MD" } */
++
++#include <nonexistent.h> /* { dg-error "nonexistent.h" } */
++/* { dg-message "terminated" "" { target *-*-* } 0 } */
+diff -Nur a/gcc/testsuite/gcc.dg/cpp/missing-sysheader-MMD.c b/gcc/testsuite/gcc.dg/cpp/missing-sysheader-MMD.c
+--- a/gcc/testsuite/gcc.dg/cpp/missing-sysheader-MMD.c 1970-01-01 01:00:00.000000000 +0100
++++ b/gcc/testsuite/gcc.dg/cpp/missing-sysheader-MMD.c 2010-01-25 09:50:29.165687452 +0100
+@@ -0,0 +1,6 @@
++/* Test that missing system headers are fatal errors with -MMD. */
++/* { dg-do compile } */
++/* { dg-options "-MMD" } */
++
++#include <nonexistent.h> /* { dg-error "nonexistent.h" } */
++/* { dg-message "terminated" "" { target *-*-* } 0 } */
+diff -Nur a/gcc/testsuite/gcc.dg/cpp/redef2.c b/gcc/testsuite/gcc.dg/cpp/redef2.c
+--- a/gcc/testsuite/gcc.dg/cpp/redef2.c 2001-11-23 08:50:42.000000000 +0100
++++ b/gcc/testsuite/gcc.dg/cpp/redef2.c 2010-01-25 09:50:29.165687452 +0100
+@@ -23,9 +23,9 @@
+ { dg-warning "redefined" "redef ro" { target *-*-* } 12 }
+ { dg-warning "redefined" "redef va" { target *-*-* } 15 }
+
+- { dg-warning "previous" "prev def mac" { target *-*-* } 6 }
+- { dg-warning "previous" "prev def mac" { target *-*-* } 7 }
+- { dg-warning "previous" "prev def mac" { target *-*-* } 8 }
+- { dg-warning "previous" "prev def ro" { target *-*-* } 11 }
+- { dg-warning "previous" "prev def va" { target *-*-* } 14 }
++ { dg-message "previous" "prev def mac" { target *-*-* } 6 }
++ { dg-message "previous" "prev def mac" { target *-*-* } 7 }
++ { dg-message "previous" "prev def mac" { target *-*-* } 8 }
++ { dg-message "previous" "prev def ro" { target *-*-* } 11 }
++ { dg-message "previous" "prev def va" { target *-*-* } 14 }
+ */
+diff -Nur a/gcc/testsuite/gcc.dg/cpp/redef3.c b/gcc/testsuite/gcc.dg/cpp/redef3.c
+--- a/gcc/testsuite/gcc.dg/cpp/redef3.c 2003-06-01 20:55:15.000000000 +0200
++++ b/gcc/testsuite/gcc.dg/cpp/redef3.c 2010-01-25 09:50:29.165687452 +0100
+@@ -15,7 +15,7 @@
+ { dg-warning "redefined" "redef B" { target *-*-* } 9 }
+ { dg-warning "redefined" "redef D" { target *-*-* } 11 }
+ { dg-warning "redefined" "redef E" { target *-*-* } 12 }
+- { dg-warning "previous" "prev def A" { target *-*-* } 6 }
+- { dg-warning "previous" "prev def B" { target *-*-* } 8 }
+- { dg-warning "previous" "prev def D/E" { target *-*-* } 0 }
++ { dg-message "previous" "prev def A" { target *-*-* } 6 }
++ { dg-message "previous" "prev def B" { target *-*-* } 8 }
++ { dg-message "previous" "prev def D/E" { target *-*-* } 0 }
+ */
+diff -Nur a/gcc/testsuite/gcc.dg/cpp/trad/redef2.c b/gcc/testsuite/gcc.dg/cpp/trad/redef2.c
+--- a/gcc/testsuite/gcc.dg/cpp/trad/redef2.c 2002-06-21 07:29:09.000000000 +0200
++++ b/gcc/testsuite/gcc.dg/cpp/trad/redef2.c 2010-01-25 09:50:29.165687452 +0100
+@@ -2,31 +2,31 @@
+
+ /* { dg-do preprocess } */
+
+-#define foo bar /* { dg-warning "previous def" "foo prev def" } */
++#define foo bar /* { dg-message "previous def" "foo prev def" } */
+ #define foo barr /* { dg-warning "redefined" "foo redefined" } */
+
+ #undef foo
+-#define foo bar /* { dg-warning "previous def" "foo prev def 2" } */
++#define foo bar /* { dg-message "previous def" "foo prev def 2" } */
+ #define foo() bar /* { dg-warning "redefined" "foo redefined 2" } */
+
+ #undef foo
+-#define foo() bar /* { dg-warning "previous def" "foo prev def" } */
++#define foo() bar /* { dg-message "previous def" "foo prev def" } */
+ #define foo() barr /* { dg-warning "redefined" "foo redefined" } */
+
+-#define quux(thud) a thud b /* { dg-warning "previous def" "quux prev def" } */
++#define quux(thud) a thud b /* { dg-message "previous def" "quux prev def" } */
+ #define quux(thu) a thud b /* { dg-warning "redefined" "quux redefined" } */
+
+-#define bar(x, y) x+y /* { dg-warning "previous def" "bar prev def" } */
++#define bar(x, y) x+y /* { dg-message "previous def" "bar prev def" } */
+ #define bar(x, y) x+x /* { dg-warning "redefined" "bar redefined" } */
+
+-#define bat(x, y) x+y /* { dg-warning "previous def" "bat prev def" } */
++#define bat(x, y) x+y /* { dg-message "previous def" "bat prev def" } */
+ #define bat(x, y) x+ y /* { dg-warning "redefined" "bat redefined" } */
+
+-#define baz(x, y) x+y /* { dg-warning "previous def" "baz prev def" } */
++#define baz(x, y) x+y /* { dg-message "previous def" "baz prev def" } */
+ #define baz(x, y) x +y /* { dg-warning "redefined" "baz redefined" } */
+
+-#define f(x, y) "x y" /* { dg-warning "previous def" "f prev def" } */
++#define f(x, y) "x y" /* { dg-message "previous def" "f prev def" } */
+ #define f(x, y) "x y" /* { dg-warning "redefined" "f redefined" } */
+
+-#define g(x, y) 'x' /* { dg-warning "previous def" "g prev def" } */
++#define g(x, y) 'x' /* { dg-message "previous def" "g prev def" } */
+ #define g(x, y) ' x' /* { dg-warning "redefined" "g redefined" } */
+diff -Nur a/gcc/testsuite/gcc.dg/cpp/Wvariadic-1.c b/gcc/testsuite/gcc.dg/cpp/Wvariadic-1.c
+--- a/gcc/testsuite/gcc.dg/cpp/Wvariadic-1.c 2004-02-20 19:42:51.000000000 +0100
++++ b/gcc/testsuite/gcc.dg/cpp/Wvariadic-1.c 2010-01-25 09:50:29.165687452 +0100
+@@ -4,3 +4,4 @@
+ #define f(x,...) /* { dg-error "variadic" } */
+ #define g(x,y...) /* { dg-error "variadic" } */
+ int not_empty;
++/* { dg-message "warnings being treated as errors" "" { target *-*-* } 0 } */
+diff -Nur a/gcc/testsuite/gcc.dg/cpp/Wvariadic-3.c b/gcc/testsuite/gcc.dg/cpp/Wvariadic-3.c
+--- a/gcc/testsuite/gcc.dg/cpp/Wvariadic-3.c 2004-02-20 19:42:51.000000000 +0100
++++ b/gcc/testsuite/gcc.dg/cpp/Wvariadic-3.c 2010-01-25 09:50:29.165687452 +0100
+@@ -4,3 +4,4 @@
+ #define f(x,...)
+ #define g(x,y...) /* { dg-error "variadic" } */
+ int not_empty;
++/* { dg-message "warnings being treated as errors" "" { target *-*-* } 0 } */
+diff -Nur a/gcc/testsuite/gcc.dg/dll-4.c b/gcc/testsuite/gcc.dg/dll-4.c
+--- a/gcc/testsuite/gcc.dg/dll-4.c 2005-10-12 22:54:50.000000000 +0200
++++ b/gcc/testsuite/gcc.dg/dll-4.c 2010-01-25 09:50:29.165687452 +0100
+@@ -11,5 +11,6 @@
+ int f () { return foo1 + foo2; }
+
+ /* FIXME: We should scan the output of nm for this case. */
+-/* { dg-final { scan-assembler "(foo2:.*\.comm\[ \t_\]*foo1)" } } */
++/* { dg-final { scan-assembler "(foo2:)" } } */
++/* { dg-final { scan-assembler "(\.comm\[ \t_\]*foo1)" } } */
+ /* { dg-final { scan-assembler-not "(__imp_|_imp__)" } } */
+diff -Nur a/gcc/testsuite/gcc.dg/dll-6a.c b/gcc/testsuite/gcc.dg/dll-6a.c
+--- a/gcc/testsuite/gcc.dg/dll-6a.c 1970-01-01 01:00:00.000000000 +0100
++++ b/gcc/testsuite/gcc.dg/dll-6a.c 2010-01-25 09:50:29.165687452 +0100
+@@ -0,0 +1,21 @@
++extern void i1();
++extern void i3();
++extern void i4();
++extern void i5();
++
++extern void e1();
++extern void e3();
++extern void e4();
++extern void e5();
++
++int main () {
++ i1();
++ i3();
++ i4();
++ i5();
++
++ e1();
++ e3();
++ e4();
++ e5();
++}
+diff -Nur a/gcc/testsuite/gcc.dg/dll-6.c b/gcc/testsuite/gcc.dg/dll-6.c
+--- a/gcc/testsuite/gcc.dg/dll-6.c 1970-01-01 01:00:00.000000000 +0100
++++ b/gcc/testsuite/gcc.dg/dll-6.c 2010-01-25 09:50:29.165687452 +0100
+@@ -0,0 +1,52 @@
++/* { dg-do link } */
++/* { dg-require-dll "" } */
++/* { dg-additional-sources "dll-6a.c" } */
++/* { dg-options "-w -O2 -std=gnu89" } */
++
++/* Test that inline functions declared "dllexport" appear in object
++ files, even if they are not called.
++
++ This behavior is required by the ARM C++ ABI:
++
++ Exporting a function that can be inlined should force the
++ creation and export of an out-of-line copy of it.
++
++ and should presumably also apply.
++
++ Visual Studio 2005 also honors that rule. */
++
++__declspec(dllexport) inline void i1() {}
++
++__declspec(dllexport) extern inline void e1() {}
++
++/* It is invalid to declare the function inline after its definition. */
++#if 0
++__declspec(dllexport) void i2() {}
++inline void i2();
++
++__declspec(dllexport) extern void e2() {}
++inline void e2();
++#endif
++
++__declspec(dllexport) inline void i3() {}
++void i3();
++
++__declspec(dllexport) inline void e3() {}
++extern void e3();
++
++__declspec(dllexport) void i4();
++inline void i4() {};
++
++__declspec(dllexport) extern void e4();
++inline void e4() {};
++
++__declspec(dllexport) inline void i5();
++void i5() {};
++
++__declspec(dllexport) inline void e5();
++extern void e5() {};
++
++/* Make sure that just declaring the function -- without defining it
++ -- does not cause errors. */
++__declspec(dllexport) inline void i6();
++__declspec(dllexport) extern inline void e6();
+diff -Nur a/gcc/testsuite/gcc.dg/dll-7a.c b/gcc/testsuite/gcc.dg/dll-7a.c
+--- a/gcc/testsuite/gcc.dg/dll-7a.c 1970-01-01 01:00:00.000000000 +0100
++++ b/gcc/testsuite/gcc.dg/dll-7a.c 2010-01-25 09:50:29.165687452 +0100
+@@ -0,0 +1,21 @@
++extern void i1();
++extern void i3();
++extern void i4();
++extern void i5();
++
++extern void e1();
++extern void e3();
++extern void e4();
++extern void e5();
++
++int main () {
++ i1();
++ i3();
++ i4();
++ i5();
++
++ e1();
++ e3();
++ e4();
++ e5();
++}
+diff -Nur a/gcc/testsuite/gcc.dg/dll-7.c b/gcc/testsuite/gcc.dg/dll-7.c
+--- a/gcc/testsuite/gcc.dg/dll-7.c 1970-01-01 01:00:00.000000000 +0100
++++ b/gcc/testsuite/gcc.dg/dll-7.c 2010-01-25 09:50:29.165687452 +0100
+@@ -0,0 +1,52 @@
++/* { dg-do link } */
++/* { dg-require-dll "" } */
++/* { dg-additional-sources "dll-7a.c" } */
++/* { dg-options "-w -O2 -std=gnu99" } */
++
++/* Test that inline functions declared "dllexport" appear in object
++ files, even if they are not called.
++
++ This behavior is required by the ARM C++ ABI:
++
++ Exporting a function that can be inlined should force the
++ creation and export of an out-of-line copy of it.
++
++ and should presumably also apply.
++
++ Visual Studio 2005 also honors that rule. */
++
++__declspec(dllexport) inline void i1() {}
++
++__declspec(dllexport) extern inline void e1() {}
++
++/* It is invalid to declare the function inline after its definition. */
++#if 0
++__declspec(dllexport) void i2() {}
++inline void i2();
++
++__declspec(dllexport) extern void e2() {}
++inline void e2();
++#endif
++
++__declspec(dllexport) inline void i3() {}
++void i3();
++
++__declspec(dllexport) inline void e3() {}
++extern void e3();
++
++__declspec(dllexport) void i4();
++inline void i4() {};
++
++__declspec(dllexport) extern void e4();
++inline void e4() {};
++
++__declspec(dllexport) inline void i5();
++void i5() {};
++
++__declspec(dllexport) inline void e5();
++extern void e5() {};
++
++/* Make sure that just declaring the function -- without defining it
++ -- does not cause errors. */
++__declspec(dllexport) inline void i6();
++__declspec(dllexport) extern inline void e6();
+diff -Nur a/gcc/testsuite/gcc.dg/falign-labels-1.c b/gcc/testsuite/gcc.dg/falign-labels-1.c
+--- a/gcc/testsuite/gcc.dg/falign-labels-1.c 1970-01-01 01:00:00.000000000 +0100
++++ b/gcc/testsuite/gcc.dg/falign-labels-1.c 2010-01-25 09:50:29.165687452 +0100
+@@ -0,0 +1,39 @@
++/* { dg-do run } */
++/* { dg-options "-falign-labels=8" { target { ! { m68k*-*-* || fido*-*-* } } } } */
++
++/* On ARMv7-A CPUs, this test resulted in incorrect code generation.
++ The code generated for the switch statement expected the jump table
++ to immediately follow the jump instruction, but -falign-labels
++ caused the label preceding the table to be aligned. */
++/* M68K and fido only support -falign-labels argument <= 2. */
++
++volatile int x;
++
++int main(void)
++{
++ int y;
++
++ x = 0;
++
++ switch(x)
++ {
++ case 0:
++ y = 2 * x;
++ break;
++ case 1:
++ y = -3 * x;
++ break;
++ case 2:
++ y = x + 5;
++ break;
++ case 3:
++ y = x - 7;
++ break;
++ default:
++ break;
++ }
++
++ x = y;
++
++ return 0;
++}
+diff -Nur a/gcc/testsuite/gcc.dg/fltconst-1.c b/gcc/testsuite/gcc.dg/fltconst-1.c
+--- a/gcc/testsuite/gcc.dg/fltconst-1.c 2008-08-21 19:50:01.000000000 +0200
++++ b/gcc/testsuite/gcc.dg/fltconst-1.c 2010-01-25 09:50:29.165687452 +0100
+@@ -1,5 +1,5 @@
+ /* { dg-do compile } */
+-/* { dg-options "-std=gnu99" } */
++/* { dg-options "-std=gnu99 -fshow-column" } */
+
+ double a = 1.ld; /* { dg-error "12:invalid suffix" } */
+ double b = 1.fd; /* { dg-error "12:invalid suffix" } */
+diff -Nur a/gcc/testsuite/gcc.dg/m68k-fp-1.c b/gcc/testsuite/gcc.dg/m68k-fp-1.c
+--- a/gcc/testsuite/gcc.dg/m68k-fp-1.c 1970-01-01 01:00:00.000000000 +0100
++++ b/gcc/testsuite/gcc.dg/m68k-fp-1.c 2010-01-25 09:50:29.165687452 +0100
+@@ -0,0 +1,13 @@
++/* ColdFire has restricted addressing modes for float operands. */
++/* { dg-do compile { target m68k-*-* } } */
++/* { dg-options "-O0 -mcpu=547x -mhard-float" } */
++
++double Foo (unsigned a)
++{
++ unsigned local_data[16384] __attribute__((unused));
++ double d;
++
++ d = a;
++
++ return d;
++}
+diff -Nur a/gcc/testsuite/gcc.dg/pch/counter-2.c b/gcc/testsuite/gcc.dg/pch/counter-2.c
+--- a/gcc/testsuite/gcc.dg/pch/counter-2.c 2008-05-21 02:04:45.000000000 +0200
++++ b/gcc/testsuite/gcc.dg/pch/counter-2.c 2010-01-25 09:50:29.165687452 +0100
+@@ -10,6 +10,7 @@
+ #include "counter-2.h" /* { dg-warning "not used because `__COUNTER__' is invalid" } */
+ /* { dg-error "counter-2.h: No such file or directory" "no such file" { target *-*-* } 10 } */
+ /* { dg-error "one or more PCH files were found, but they were invalid" "invalid files" { target *-*-* } 10 } */
++/* { dg-message "terminated" "" { target *-*-* } 0 } */
+
+ int main(void)
+ {
+diff -Nur a/gcc/testsuite/gcc.dg/pch/valid-1.c b/gcc/testsuite/gcc.dg/pch/valid-1.c
+--- a/gcc/testsuite/gcc.dg/pch/valid-1.c 2008-05-21 02:04:45.000000000 +0200
++++ b/gcc/testsuite/gcc.dg/pch/valid-1.c 2010-01-25 09:50:29.165687452 +0100
+@@ -3,5 +3,6 @@
+ #include "valid-1.h"/* { dg-warning "created with -gnone, but used with -g" } */
+ /* { dg-error "No such file" "no such file" { target *-*-* } 3 } */
+ /* { dg-error "they were invalid" "invalid files" { target *-*-* } 3 } */
++/* { dg-message "terminated" "" { target *-*-* } 0 } */
+
+ int x;
+diff -Nur a/gcc/testsuite/gcc.dg/pch/valid-2.c b/gcc/testsuite/gcc.dg/pch/valid-2.c
+--- a/gcc/testsuite/gcc.dg/pch/valid-2.c 2008-05-21 02:04:45.000000000 +0200
++++ b/gcc/testsuite/gcc.dg/pch/valid-2.c 2010-01-25 09:50:29.165687452 +0100
+@@ -3,4 +3,5 @@
+ #include "valid-2.h" /* { dg-warning "settings for -fexceptions do not match" } */
+ /* { dg-error "No such file" "no such file" { target *-*-* } 3 } */
+ /* { dg-error "they were invalid" "invalid files" { target *-*-* } 3 } */
++/* { dg-message "terminated" "" { target *-*-* } 0 } */
+ int x;
+diff -Nur a/gcc/testsuite/gcc.dg/pch/warn-1.c b/gcc/testsuite/gcc.dg/pch/warn-1.c
+--- a/gcc/testsuite/gcc.dg/pch/warn-1.c 2008-05-21 02:04:45.000000000 +0200
++++ b/gcc/testsuite/gcc.dg/pch/warn-1.c 2010-01-25 09:50:29.165687452 +0100
+@@ -5,6 +5,7 @@
+ #include "warn-1.h"/* { dg-warning "not used because .DEFINED_VALUE. is defined" } */
+ /* { dg-error "No such file" "no such file" { target *-*-* } 5 } */
+ /* { dg-error "they were invalid" "invalid files" { target *-*-* } 5 } */
++/* { dg-message "terminated" "" { target *-*-* } 0 } */
+
+
+ int main(void)
+diff -Nur a/gcc/testsuite/gcc.dg/pr34263.c b/gcc/testsuite/gcc.dg/pr34263.c
+--- a/gcc/testsuite/gcc.dg/pr34263.c 2008-01-06 16:24:10.000000000 +0100
++++ b/gcc/testsuite/gcc.dg/pr34263.c 2010-01-25 09:50:29.165687452 +0100
+@@ -1,5 +1,5 @@
+ /* { dg-do run } */
+-/* { dg-options "-O2 -fdump-tree-optimized" } */
++/* { dg-options "-O2 -fdump-tree-optimized -fno-unroll-loops" } */
+ /* Same test as 990128-1.c. */
+
+ extern int printf (const char *,...);
+diff -Nur a/gcc/testsuite/gcc.dg/pragma-isr-trapa2.c b/gcc/testsuite/gcc.dg/pragma-isr-trapa2.c
+--- a/gcc/testsuite/gcc.dg/pragma-isr-trapa2.c 2007-08-13 11:24:46.000000000 +0200
++++ b/gcc/testsuite/gcc.dg/pragma-isr-trapa2.c 2010-01-25 09:50:29.165687452 +0100
+@@ -1,4 +1,6 @@
+ /* { dg-do compile { target { { sh-*-* sh4*-*-* } && nonpic } } } */
++/* { dg-skip-if "FPU Required" { "sh*-*-*" } { "-m*nofpu*" } { "" } } */
++/* { dg-skip-if "FPU Required" { "sh*-*-*" } { "-m4al*" } { "" } } */
+ /* { dg-options "-O -m4" } */
+
+ extern void foo ();
+diff -Nur a/gcc/testsuite/gcc.dg/profile-dir-1.c b/gcc/testsuite/gcc.dg/profile-dir-1.c
+--- a/gcc/testsuite/gcc.dg/profile-dir-1.c 2008-04-22 01:35:47.000000000 +0200
++++ b/gcc/testsuite/gcc.dg/profile-dir-1.c 2010-01-25 09:50:29.165687452 +0100
+@@ -1,5 +1,6 @@
+ /* { dg-do compile } */
+ /* { dg-options "-O -fprofile-generate=. -fdump-tree-tree_profile" } */
++/* { dg-require-host-local "" } */
+ /* { dg-final { scan-tree-dump " ./profile-dir-1.gcda" "tree_profile" } } */
+
+ int
+diff -Nur a/gcc/testsuite/gcc.dg/profile-dir-2.c b/gcc/testsuite/gcc.dg/profile-dir-2.c
+--- a/gcc/testsuite/gcc.dg/profile-dir-2.c 2008-04-22 01:35:47.000000000 +0200
++++ b/gcc/testsuite/gcc.dg/profile-dir-2.c 2010-01-25 09:50:29.165687452 +0100
+@@ -1,5 +1,6 @@
+ /* { dg-do compile } */
+ /* { dg-options "-O -fprofile-generate -fdump-tree-tree_profile" } */
++/* { dg-require-host-local "" } */
+ /* { dg-final { scan-tree-dump "/profile-dir-2.gcda" "tree_profile" } } */
+
+ int
+diff -Nur a/gcc/testsuite/gcc.dg/profile-dir-3.c b/gcc/testsuite/gcc.dg/profile-dir-3.c
+--- a/gcc/testsuite/gcc.dg/profile-dir-3.c 2008-04-22 01:35:47.000000000 +0200
++++ b/gcc/testsuite/gcc.dg/profile-dir-3.c 2010-01-25 09:50:29.165687452 +0100
+@@ -1,5 +1,6 @@
+ /* { dg-do compile } */
+ /* { dg-options "-O -fprofile-generate -fprofile-dir=. -fdump-tree-tree_profile" } */
++/* { dg-require-host-local "" } */
+ /* { dg-final { scan-tree-dump " ./profile-dir-3.gcda" "tree_profile" } } */
+
+ int
+diff -Nur a/gcc/testsuite/gcc.dg/promote-short-10.c b/gcc/testsuite/gcc.dg/promote-short-10.c
+--- a/gcc/testsuite/gcc.dg/promote-short-10.c 1970-01-01 01:00:00.000000000 +0100
++++ b/gcc/testsuite/gcc.dg/promote-short-10.c 2010-01-25 09:50:29.165687452 +0100
+@@ -0,0 +1,20 @@
++/* Verify that we do not promote a short loop index variable when its
++ address is taken. */
++
++/* { dg-do compile } */
++/* { dg-options "-O2 -fpromote-loop-indices -fdump-tree-promoteshort" } */
++/* { dg-final { scan-tree-dump-times "Found 0 candidates" 1 "promoteshort" } } */
++/* { dg-final { cleanup-tree-dump "promoteshort" } } */
++
++extern void outside (short *);
++
++void
++test1 (int n, int *x)
++{
++ short i;
++
++ for (i = 0; i < n; i++)
++ {
++ outside (&i);
++ }
++}
+diff -Nur a/gcc/testsuite/gcc.dg/promote-short-1.c b/gcc/testsuite/gcc.dg/promote-short-1.c
+--- a/gcc/testsuite/gcc.dg/promote-short-1.c 1970-01-01 01:00:00.000000000 +0100
++++ b/gcc/testsuite/gcc.dg/promote-short-1.c 2010-01-25 09:50:29.165687452 +0100
+@@ -0,0 +1,15 @@
++/* Verify that we promote a short loop index variable. */
++
++/* { dg-do compile } */
++/* { dg-options "-O2 -fpromote-loop-indices -fdump-tree-promoteshort" } */
++/* { dg-final { scan-tree-dump-times "Promoting 1 variables" 1 "promoteshort" } } */
++/* { dg-final { cleanup-tree-dump "promoteshort" } } */
++
++void
++test1 (short n, int *x)
++{
++ short i;
++
++ for (i = 0; i < n; i++)
++ x[i] = 0;
++}
+diff -Nur a/gcc/testsuite/gcc.dg/promote-short-2.c b/gcc/testsuite/gcc.dg/promote-short-2.c
+--- a/gcc/testsuite/gcc.dg/promote-short-2.c 1970-01-01 01:00:00.000000000 +0100
++++ b/gcc/testsuite/gcc.dg/promote-short-2.c 2010-01-25 09:50:29.165687452 +0100
+@@ -0,0 +1,16 @@
++/* Verify that we do not promote a short loop index variable when it is
++ being stored to memory. */
++
++/* { dg-do compile } */
++/* { dg-options "-O2 -fpromote-loop-indices -fdump-tree-promoteshort" } */
++/* { dg-final { scan-tree-dump-times "Promoting 0 variables" 1 "promoteshort" } } */
++/* { dg-final { cleanup-tree-dump "promoteshort" } } */
++
++void
++test1 (short n, short *x)
++{
++ short i;
++
++ for (i = 0; i < n; i++)
++ x[i] = i;
++}
+diff -Nur a/gcc/testsuite/gcc.dg/promote-short-3.c b/gcc/testsuite/gcc.dg/promote-short-3.c
+--- a/gcc/testsuite/gcc.dg/promote-short-3.c 1970-01-01 01:00:00.000000000 +0100
++++ b/gcc/testsuite/gcc.dg/promote-short-3.c 2010-01-25 09:50:29.165687452 +0100
+@@ -0,0 +1,18 @@
++/* Verify that we do not promote a short loop index variable when it is
++ being passed as a function parameter. */
++
++/* { dg-do compile } */
++/* { dg-options "-O2 -fpromote-loop-indices -fdump-tree-promoteshort" } */
++/* { dg-final { scan-tree-dump-times "Promoting 0 variables" 1 "promoteshort" { xfail m68k*-*-* fido*-*-* i?86-*-* x86_64-*-* mips*-*-* sh*-*-* } } } */
++/* { dg-final { cleanup-tree-dump "promoteshort" } } */
++
++extern void outside (short);
++
++void
++test1 (short n)
++{
++ short i;
++
++ for (i = 0; i < n; i++)
++ outside (i);
++}
+diff -Nur a/gcc/testsuite/gcc.dg/promote-short-4.c b/gcc/testsuite/gcc.dg/promote-short-4.c
+--- a/gcc/testsuite/gcc.dg/promote-short-4.c 1970-01-01 01:00:00.000000000 +0100
++++ b/gcc/testsuite/gcc.dg/promote-short-4.c 2010-01-25 09:50:29.165687452 +0100
+@@ -0,0 +1,19 @@
++/* Verify that we do not promote a short loop index variable when it is
++ modified within the loop. */
++
++/* { dg-do compile } */
++/* { dg-options "-O2 -fpromote-loop-indices -fdump-tree-promoteshort" } */
++/* { dg-final { scan-tree-dump-times "Promoting 0 variables" 1 "promoteshort" } } */
++/* { dg-final { cleanup-tree-dump "promoteshort" } } */
++
++void
++test1 (short n, int *x)
++{
++ short i;
++
++ for (i = 0; i < n; i++)
++ {
++ i++;
++ x[i] = 0;
++ }
++}
+diff -Nur a/gcc/testsuite/gcc.dg/promote-short-5.c b/gcc/testsuite/gcc.dg/promote-short-5.c
+--- a/gcc/testsuite/gcc.dg/promote-short-5.c 1970-01-01 01:00:00.000000000 +0100
++++ b/gcc/testsuite/gcc.dg/promote-short-5.c 2010-01-25 09:50:29.165687452 +0100
+@@ -0,0 +1,18 @@
++/* Verify that we do not promote a short loop index variable when it has
++ a non-unit-increment. */
++
++/* { dg-do compile } */
++/* { dg-options "-O2 -fpromote-loop-indices -fdump-tree-promoteshort" } */
++/* { dg-final { scan-tree-dump-times "Promoting 0 variables" 1 "promoteshort" } } */
++/* { dg-final { cleanup-tree-dump "promoteshort" } } */
++
++void
++test1 (short n, int *x)
++{
++ short i;
++
++ for (i = 0; i < n; i+=2)
++ {
++ x[i] = 0;
++ }
++}
+diff -Nur a/gcc/testsuite/gcc.dg/promote-short-6.c b/gcc/testsuite/gcc.dg/promote-short-6.c
+--- a/gcc/testsuite/gcc.dg/promote-short-6.c 1970-01-01 01:00:00.000000000 +0100
++++ b/gcc/testsuite/gcc.dg/promote-short-6.c 2010-01-25 09:50:29.165687452 +0100
+@@ -0,0 +1,18 @@
++/* Verify that we do promote a short loop index variable when it has
++ a non-unit-increment and -funsafe-loop-optimizations is in effect. */
++
++/* { dg-do compile } */
++/* { dg-options "-O2 -fpromote-loop-indices -funsafe-loop-optimizations -fdump-tree-promoteshort" } */
++/* { dg-final { scan-tree-dump-times "Promoting 1 variables" 1 "promoteshort" } } */
++/* { dg-final { cleanup-tree-dump "promoteshort" } } */
++
++void
++test1 (short n, int *x)
++{
++ short i;
++
++ for (i = 0; i < n; i+=2)
++ {
++ x[i] = 0;
++ }
++}
+diff -Nur a/gcc/testsuite/gcc.dg/promote-short-7.c b/gcc/testsuite/gcc.dg/promote-short-7.c
+--- a/gcc/testsuite/gcc.dg/promote-short-7.c 1970-01-01 01:00:00.000000000 +0100
++++ b/gcc/testsuite/gcc.dg/promote-short-7.c 2010-01-25 09:50:29.165687452 +0100
+@@ -0,0 +1,18 @@
++/* Verify that we do not promote a short loop index variable when the
++ loop in which it is used has a bound of wider type. */
++
++/* { dg-do compile } */
++/* { dg-options "-O2 -fpromote-loop-indices -fdump-tree-promoteshort" } */
++/* { dg-final { scan-tree-dump-times "Promoting 0 variables" 1 "promoteshort" } } */
++/* { dg-final { cleanup-tree-dump "promoteshort" } } */
++
++void
++test1 (int n, int *x)
++{
++ short i;
++
++ for (i = 0; i < n; i++)
++ {
++ x[i] = 0;
++ }
++}
+diff -Nur a/gcc/testsuite/gcc.dg/promote-short-8.c b/gcc/testsuite/gcc.dg/promote-short-8.c
+--- a/gcc/testsuite/gcc.dg/promote-short-8.c 1970-01-01 01:00:00.000000000 +0100
++++ b/gcc/testsuite/gcc.dg/promote-short-8.c 2010-01-25 09:50:29.165687452 +0100
+@@ -0,0 +1,19 @@
++/* Verify that we do promote a short loop index variable when the loop
++ in which it is used has a bound of wider type and
++ -funsafe-loop-optimizations is in effect. */
++
++/* { dg-do compile } */
++/* { dg-options "-O2 -fpromote-loop-indices -funsafe-loop-optimizations -fdump-tree-promoteshort" } */
++/* { dg-final { scan-tree-dump-times "Promoting 1 variables" 1 "promoteshort" } } */
++/* { dg-final { cleanup-tree-dump "promoteshort" } } */
++
++void
++test1 (int n, int *x)
++{
++ short i;
++
++ for (i = 0; i < n; i++)
++ {
++ x[i] = 0;
++ }
++}
+diff -Nur a/gcc/testsuite/gcc.dg/promote-short-9.c b/gcc/testsuite/gcc.dg/promote-short-9.c
+--- a/gcc/testsuite/gcc.dg/promote-short-9.c 1970-01-01 01:00:00.000000000 +0100
++++ b/gcc/testsuite/gcc.dg/promote-short-9.c 2010-01-25 09:50:29.165687452 +0100
+@@ -0,0 +1,15 @@
++/* -fpromote-loop-indices used to ICE on this. */
++
++/* { dg-do compile } */
++/* { dg-options "-O2 -fpromote-loop-indices" } */
++
++char
++lookup (char *haystack, char *needle)
++{
++ char x;
++
++ for (x = haystack[-2]; x < *needle; x++)
++ haystack[x] = needle[x];
++
++ return 1;
++}
+diff -Nur a/gcc/testsuite/gcc.dg/remove-local-statics-10.c b/gcc/testsuite/gcc.dg/remove-local-statics-10.c
+--- a/gcc/testsuite/gcc.dg/remove-local-statics-10.c 1970-01-01 01:00:00.000000000 +0100
++++ b/gcc/testsuite/gcc.dg/remove-local-statics-10.c 2010-01-25 09:50:29.165687452 +0100
+@@ -0,0 +1,32 @@
++/* Verify that we do not eliminate a static local variable when it is
++ live on return from a function call that recursively calls the
++ function in which the variable is defined. */
++
++/* { dg-do compile } */
++/* { dg-options "-O2 -fremove-local-statics" } */
++/* { dg-final { scan-assembler "thestatic" } } */
++
++int
++test2 (int x)
++{
++ if (x < 0)
++ return 0;
++ else
++ return test1 (x - 1);
++}
++
++int
++test1 (int x)
++{
++ static int thestatic;
++ int y;
++
++ thestatic = x;
++
++ y = test2 (x - 1);
++
++ y += thestatic;
++
++ return y + x;
++}
++
+diff -Nur a/gcc/testsuite/gcc.dg/remove-local-statics-11.c b/gcc/testsuite/gcc.dg/remove-local-statics-11.c
+--- a/gcc/testsuite/gcc.dg/remove-local-statics-11.c 1970-01-01 01:00:00.000000000 +0100
++++ b/gcc/testsuite/gcc.dg/remove-local-statics-11.c 2010-01-25 09:50:29.165687452 +0100
+@@ -0,0 +1,16 @@
++/* Verify that we do not eliminate a static local variable when its
++ address is taken. */
++
++/* { dg-do compile } */
++/* { dg-options "-O2 -fremove-local-statics" } */
++/* { dg-final { scan-assembler "thestatic" } } */
++
++int *
++test1 (int x)
++{
++ static int thestatic;
++
++ thestatic = x;
++
++ return &thestatic + x;
++}
+diff -Nur a/gcc/testsuite/gcc.dg/remove-local-statics-12.c b/gcc/testsuite/gcc.dg/remove-local-statics-12.c
+--- a/gcc/testsuite/gcc.dg/remove-local-statics-12.c 1970-01-01 01:00:00.000000000 +0100
++++ b/gcc/testsuite/gcc.dg/remove-local-statics-12.c 2010-01-25 09:50:29.165687452 +0100
+@@ -0,0 +1,20 @@
++/* Verify that we do not eliminate a static variable when it is declared
++ in a function that has nested functions. */
++
++/* { dg-do compile } */
++/* { dg-options "-O2 -fremove-local-statics" } */
++/* { dg-final { scan-assembler "thestatic" } } */
++
++int test1 (int x)
++{
++ static int thestatic;
++
++ int nested_test1 (int x)
++ {
++ return x + thestatic;
++ }
++
++ thestatic = x;
++
++ return thestatic + x + nested_test1 (x);
++}
+diff -Nur a/gcc/testsuite/gcc.dg/remove-local-statics-13.c b/gcc/testsuite/gcc.dg/remove-local-statics-13.c
+--- a/gcc/testsuite/gcc.dg/remove-local-statics-13.c 1970-01-01 01:00:00.000000000 +0100
++++ b/gcc/testsuite/gcc.dg/remove-local-statics-13.c 2010-01-25 09:50:29.165687452 +0100
+@@ -0,0 +1,24 @@
++/* We used to ICE on this test, because the call to BAR appeared to
++ define both static variables in FOO. Verify that we no longer do
++ this. */
++
++/* { dg-do compile } */
++/* { dg-options "-O2 -fremove-local-statics" } */
++/* { dg-final { scan-assembler "static1" } } */
++/* { dg-final { scan-assembler-not "static2" } } */
++
++int foo(int i) {
++ static int static1 = 0;
++ static int static2;
++
++ if (static2 = bar(i))
++ static1 = 1;
++ static2 = static1 + 30;
++
++ return static1 + static2;
++}
++
++int bar(int i) {
++ if (i) { foo(i-1); return 0; }
++ return 1;
++}
+diff -Nur a/gcc/testsuite/gcc.dg/remove-local-statics-14.c b/gcc/testsuite/gcc.dg/remove-local-statics-14.c
+--- a/gcc/testsuite/gcc.dg/remove-local-statics-14.c 1970-01-01 01:00:00.000000000 +0100
++++ b/gcc/testsuite/gcc.dg/remove-local-statics-14.c 2010-01-25 09:50:29.165687452 +0100
+@@ -0,0 +1,29 @@
++/* Verify that we do eliminate a static local variable whose last use is
++ in a statement containing a call expression. */
++
++/* { dg-do compile } */
++/* { dg-options "-O2 -fremove-local-statics" } */
++/* { dg-final { scan-assembler-not "thestatic" } } */
++
++int
++test2 (int x)
++{
++ if (x < 0)
++ return 0;
++ else
++ return test1 (x - 1);
++}
++
++int
++test1 (int x)
++{
++ static int thestatic;
++ int y;
++
++ thestatic = x;
++
++ y = test2 (thestatic - 1);
++
++ return y + x;
++}
++
+diff -Nur a/gcc/testsuite/gcc.dg/remove-local-statics-15.c b/gcc/testsuite/gcc.dg/remove-local-statics-15.c
+--- a/gcc/testsuite/gcc.dg/remove-local-statics-15.c 1970-01-01 01:00:00.000000000 +0100
++++ b/gcc/testsuite/gcc.dg/remove-local-statics-15.c 2010-01-25 09:50:29.165687452 +0100
+@@ -0,0 +1,17 @@
++/* Verify that we do not consider an array variable for local static
++ elimination. */
++
++/* { dg-do compile } */
++/* { dg-options "-O2 -fremove-local-statics -fdump-tree-remlocstatic-details" } */
++
++int foo (void)
++{
++ static int a[1];
++
++ a[0] = 0;
++
++ return a[0];
++}
++
++/* { dg-final { scan-tree-dump-times "static variables to consider" 0 "remlocstatic" } } */
++/* { dg-final { cleanup-tree-dump "remlocstatic" } } */
+diff -Nur a/gcc/testsuite/gcc.dg/remove-local-statics-16.c b/gcc/testsuite/gcc.dg/remove-local-statics-16.c
+--- a/gcc/testsuite/gcc.dg/remove-local-statics-16.c 1970-01-01 01:00:00.000000000 +0100
++++ b/gcc/testsuite/gcc.dg/remove-local-statics-16.c 2010-01-25 09:50:29.165687452 +0100
+@@ -0,0 +1,20 @@
++/* Verify that we do not consider an structure variable for local static
++ elimination. */
++
++/* { dg-do compile } */
++/* { dg-options "-O2 -fremove-local-statics -fdump-tree-remlocstatic-details" } */
++
++int foo (void)
++{
++ static struct {
++ int x;
++ int y;
++ } a;
++
++ a.x = 0;
++
++ return a.y;
++}
++
++/* { dg-final { scan-tree-dump-times "static variables to consider" 0 "remlocstatic" } } */
++/* { dg-final { cleanup-tree-dump "remlocstatic" } } */
+diff -Nur a/gcc/testsuite/gcc.dg/remove-local-statics-17.c b/gcc/testsuite/gcc.dg/remove-local-statics-17.c
+--- a/gcc/testsuite/gcc.dg/remove-local-statics-17.c 1970-01-01 01:00:00.000000000 +0100
++++ b/gcc/testsuite/gcc.dg/remove-local-statics-17.c 2010-01-25 09:50:29.165687452 +0100
+@@ -0,0 +1,19 @@
++/* Verify that we do not eliminate a static variable that is "defined"
++ by an asm that clobbers memory. */
++
++/* { dg-do compile } */
++/* { dg-options "-O2 -fremove-local-statics -fdump-tree-remlocstatic-details" } */
++
++int foo (void)
++{
++ static int foo = 0;
++
++ __asm__ __volatile__ ("bogus" : : : "memory");
++
++ foo++;
++
++ return foo;
++}
++
++/* { dg-final { scan-tree-dump-times "static variables to consider" 0 "remlocstatic" } } */
++/* { dg-final { cleanup-tree-dump "remlocstatic" } } */
+diff -Nur a/gcc/testsuite/gcc.dg/remove-local-statics-1.c b/gcc/testsuite/gcc.dg/remove-local-statics-1.c
+--- a/gcc/testsuite/gcc.dg/remove-local-statics-1.c 1970-01-01 01:00:00.000000000 +0100
++++ b/gcc/testsuite/gcc.dg/remove-local-statics-1.c 2010-01-25 09:50:29.165687452 +0100
+@@ -0,0 +1,16 @@
++/* Verify that we eliminate a static local variable where its uses
++ are dominated by a def. */
++
++/* { dg-do compile } */
++/* { dg-options "-O2 -fremove-local-statics" } */
++/* { dg-final { scan-assembler-not "thestatic" } } */
++
++int
++test1 (int x)
++{
++ static int thestatic;
++
++ thestatic = x;
++
++ return thestatic + x;
++}
+diff -Nur a/gcc/testsuite/gcc.dg/remove-local-statics-2.c b/gcc/testsuite/gcc.dg/remove-local-statics-2.c
+--- a/gcc/testsuite/gcc.dg/remove-local-statics-2.c 1970-01-01 01:00:00.000000000 +0100
++++ b/gcc/testsuite/gcc.dg/remove-local-statics-2.c 2010-01-25 09:50:29.165687452 +0100
+@@ -0,0 +1,19 @@
++/* Verify that we do not eliminate a static local variable when its uses
++ are not dominated by a def. */
++
++/* { dg-do compile } */
++/* { dg-options "-O2 -fremove-local-statics" } */
++/* { dg-final { scan-assembler "first_time" } } */
++
++int
++test1 (int x)
++{
++ static int first_time;
++
++ if (x == 1)
++ first_time = 1;
++ else if (x > 0)
++ first_time = 2;
++
++ return first_time + x;
++}
+diff -Nur a/gcc/testsuite/gcc.dg/remove-local-statics-3.c b/gcc/testsuite/gcc.dg/remove-local-statics-3.c
+--- a/gcc/testsuite/gcc.dg/remove-local-statics-3.c 1970-01-01 01:00:00.000000000 +0100
++++ b/gcc/testsuite/gcc.dg/remove-local-statics-3.c 2010-01-25 09:50:29.235686709 +0100
+@@ -0,0 +1,16 @@
++/* Verify that we do not eliminate a static local variable whose uses
++ are dominated by a def when the variable is volatile. */
++
++/* { dg-do compile } */
++/* { dg-options "-O2 -fremove-local-statics" } */
++/* { dg-final { scan-assembler "thestatic" } } */
++
++int
++test1 (int x)
++{
++ static volatile int thestatic;
++
++ thestatic = x;
++
++ return thestatic + x;
++}
+diff -Nur a/gcc/testsuite/gcc.dg/remove-local-statics-4.c b/gcc/testsuite/gcc.dg/remove-local-statics-4.c
+--- a/gcc/testsuite/gcc.dg/remove-local-statics-4.c 1970-01-01 01:00:00.000000000 +0100
++++ b/gcc/testsuite/gcc.dg/remove-local-statics-4.c 2010-01-25 09:50:29.235686709 +0100
+@@ -0,0 +1,15 @@
++/* Verify that we don't eliminate a global static variable. */
++
++/* { dg-do compile } */
++/* { dg-options "-O2 -fremove-local-statics" } */
++/* { dg-final { scan-assembler "global_static" } } */
++
++static int global_static;
++
++int
++test1 (int x)
++{
++ global_static = x;
++
++ return global_static + x;
++}
+diff -Nur a/gcc/testsuite/gcc.dg/remove-local-statics-5.c b/gcc/testsuite/gcc.dg/remove-local-statics-5.c
+--- a/gcc/testsuite/gcc.dg/remove-local-statics-5.c 1970-01-01 01:00:00.000000000 +0100
++++ b/gcc/testsuite/gcc.dg/remove-local-statics-5.c 2010-01-25 09:50:29.235686709 +0100
+@@ -0,0 +1,24 @@
++/* Verify that we do not eliminate a static local variable whose uses
++ are dominated by a def when the function calls setjmp. */
++
++/* { dg-do compile } */
++/* { dg-options "-O2 -fremove-local-statics" } */
++/* { dg-final { scan-assembler "thestatic" } } */
++
++#include <setjmp.h>
++
++int
++foo (int x)
++{
++ static int thestatic;
++ int retval;
++ jmp_buf env;
++
++ thestatic = x;
++
++ retval = thestatic + x;
++
++ setjmp (env);
++
++ return retval;
++}
+diff -Nur a/gcc/testsuite/gcc.dg/remove-local-statics-6.c b/gcc/testsuite/gcc.dg/remove-local-statics-6.c
+--- a/gcc/testsuite/gcc.dg/remove-local-statics-6.c 1970-01-01 01:00:00.000000000 +0100
++++ b/gcc/testsuite/gcc.dg/remove-local-statics-6.c 2010-01-25 09:50:29.235686709 +0100
+@@ -0,0 +1,16 @@
++/* Verify that we do not eliminate a static local variable whose uses
++ are dominated by a def when the variable is addressed. */
++
++/* { dg-do compile } */
++/* { dg-options "-O2 -fremove-local-statics" } */
++/* { dg-final { scan-assembler "thestatic" } } */
++
++int *
++test1 (int x)
++{
++ static int thestatic;
++
++ thestatic = x;
++
++ return &thestatic + x;
++}
+diff -Nur a/gcc/testsuite/gcc.dg/remove-local-statics-7.c b/gcc/testsuite/gcc.dg/remove-local-statics-7.c
+--- a/gcc/testsuite/gcc.dg/remove-local-statics-7.c 1970-01-01 01:00:00.000000000 +0100
++++ b/gcc/testsuite/gcc.dg/remove-local-statics-7.c 2010-01-25 09:50:29.235686709 +0100
+@@ -0,0 +1,21 @@
++/* Verify that we eliminate a static local variable where it is defined
++ along all paths leading to a use.
++
++ XFAIL'd because our analysis is currently too weak. */
++
++/* { dg-do compile } */
++/* { dg-options "-O2 -fremove-local-statics" } */
++/* { dg-final { scan-assembler-not "thestatic" } } */
++
++int
++test1 (int x)
++{
++ static int thestatic;
++
++ if (x < 0)
++ thestatic = x;
++ else
++ thestatic = -x;
++
++ return thestatic + x;
++}
+diff -Nur a/gcc/testsuite/gcc.dg/remove-local-statics-8.c b/gcc/testsuite/gcc.dg/remove-local-statics-8.c
+--- a/gcc/testsuite/gcc.dg/remove-local-statics-8.c 1970-01-01 01:00:00.000000000 +0100
++++ b/gcc/testsuite/gcc.dg/remove-local-statics-8.c 2010-01-25 09:50:29.235686709 +0100
+@@ -0,0 +1,33 @@
++/* Verify that we eliminate a static local variable when it is dead on
++ return from a function call that recursively calls the function in
++ which the variable is defined. */
++
++/* { dg-do compile } */
++/* { dg-options "-O2 -fremove-local-statics" } */
++/* { dg-final { scan-assembler-not "thestatic" } } */
++
++int test1 (int);
++int test2 (int);
++
++int
++test2 (int x)
++{
++ if (x < 0)
++ return 0;
++ else
++ return test1 (x - 1);
++}
++
++int
++test1 (int x)
++{
++ static int thestatic;
++ int y;
++
++ thestatic = x;
++
++ y = thestatic;
++
++ return y + x + test1 (x - 1) + test2 (x - 1);
++}
++
+diff -Nur a/gcc/testsuite/gcc.dg/remove-local-statics-9.c b/gcc/testsuite/gcc.dg/remove-local-statics-9.c
+--- a/gcc/testsuite/gcc.dg/remove-local-statics-9.c 1970-01-01 01:00:00.000000000 +0100
++++ b/gcc/testsuite/gcc.dg/remove-local-statics-9.c 2010-01-25 09:50:29.235686709 +0100
+@@ -0,0 +1,34 @@
++/* Verify that we eliminate a static local variable when it is live
++ on return from a function call that does not recursively call the
++ function in which the variable is defined. */
++
++/* XFAIL'd because we don't utilize the callgraph properly. */
++
++/* { dg-do compile } */
++/* { dg-options "-O2 -fremove-local-statics" } */
++/* { dg-final { scan-assembler-not "thestatic" { xfail *-*-* } } } */
++
++static int
++test2 (int x)
++{
++ if (x < 0)
++ return 0;
++ else
++ return x + test2 (x - 1);
++}
++
++int
++test1 (int x)
++{
++ static int thestatic;
++ int y;
++
++ thestatic = x;
++
++ y = test2 (x - 1);
++
++ y += thestatic;
++
++ return y + x;
++}
++
+diff -Nur a/gcc/testsuite/gcc.dg/torture/arm-fp16-compile-assign.c b/gcc/testsuite/gcc.dg/torture/arm-fp16-compile-assign.c
+--- a/gcc/testsuite/gcc.dg/torture/arm-fp16-compile-assign.c 1970-01-01 01:00:00.000000000 +0100
++++ b/gcc/testsuite/gcc.dg/torture/arm-fp16-compile-assign.c 2010-01-25 09:50:29.235686709 +0100
+@@ -0,0 +1,29 @@
++/* { dg-do compile { target arm*-*-* } } */
++/* { dg-options "-mfp16-format=ieee" } */
++
++/* Test basic assignments and conversions for __fp16. */
++
++__fp16 h0 = -1.0;
++__fp16 h1 = 0.0;
++__fp16 h2 = 1234.0;
++__fp16 h3 = 42.0;
++float f1 = 2.0;
++float f2 = -999.9;
++
++void f (__fp16 *p)
++{
++ __fp16 t;
++
++ h0 = 1.0;
++ h1 = h2;
++ h2 = f1;
++ f2 = h2;
++
++ t = *p;
++ *p = h3;
++ h3 = t;
++}
++
++/* Make sure we are not falling through to undefined libcalls. */
++/* { dg-final { scan-assembler-not "__truncsfhf" } } */
++/* { dg-final { scan-assembler-not "__extendhfsf" } } */
+diff -Nur a/gcc/testsuite/gcc.dg/torture/arm-fp16-compile-convert.c b/gcc/testsuite/gcc.dg/torture/arm-fp16-compile-convert.c
+--- a/gcc/testsuite/gcc.dg/torture/arm-fp16-compile-convert.c 1970-01-01 01:00:00.000000000 +0100
++++ b/gcc/testsuite/gcc.dg/torture/arm-fp16-compile-convert.c 2010-01-25 09:50:29.235686709 +0100
+@@ -0,0 +1,41 @@
++/* { dg-do compile { target arm*-*-* } } */
++/* { dg-options "-mfp16-format=ieee" } */
++
++/* Test basic assignments and conversions for __fp16. */
++
++__fp16 h1 = 0.0;
++__fp16 h2 = 1234.0;
++char c1 = 1;
++char c2 = 2;
++short s1 = 10;
++short s2 = 20;
++int i1 = -100;
++int i2 = -200;
++long long l1 = 1000.0;
++long long l2 = 2000.0;
++double d1 = -10000.0;
++double d2 = -20000.0;
++
++void f (void)
++{
++ c1 = h1;
++ h2 = c2;
++
++ h1 = s1;
++ s2 = h2;
++
++ i1 = h1;
++ h2 = i2;
++
++ h1 = l1;
++ l2 = h2;
++
++ d1 = h1;
++ h2 = d2;
++}
++
++/* Make sure we are not falling through to undefined libcalls. */
++/* { dg-final { scan-assembler-not "__float.ihf" } } */
++/* { dg-final { scan-assembler-not "__fixhf.i" } } */
++/* { dg-final { scan-assembler-not "__trunc.fhf" } } */
++/* { dg-final { scan-assembler-not "__extendhf.f" } } */
+diff -Nur a/gcc/testsuite/gcc.dg/torture/arm-fp16-int-convert-alt.c b/gcc/testsuite/gcc.dg/torture/arm-fp16-int-convert-alt.c
+--- a/gcc/testsuite/gcc.dg/torture/arm-fp16-int-convert-alt.c 1970-01-01 01:00:00.000000000 +0100
++++ b/gcc/testsuite/gcc.dg/torture/arm-fp16-int-convert-alt.c 2010-01-25 09:50:29.235686709 +0100
+@@ -0,0 +1,17 @@
++/* Test floating-point conversions. Standard types and __fp16. */
++/* { dg-do run { target arm*-*-* } } */
++/* { dg-options "-mfp16-format=alternative" } */
++
++#include "fp-int-convert.h"
++#define FP16_MANT_DIG 11
++
++int
++main (void)
++{
++ TEST_I_F(signed char, unsigned char, float, FP16_MANT_DIG);
++ TEST_I_F(signed short, unsigned short, float, FP16_MANT_DIG);
++ TEST_I_F(signed int, unsigned int, float, FP16_MANT_DIG);
++ TEST_I_F(signed long, unsigned long, float, FP16_MANT_DIG);
++ TEST_I_F(signed long long, unsigned long long, float, FP16_MANT_DIG);
++ exit (0);
++}
+diff -Nur a/gcc/testsuite/gcc.dg/torture/arm-fp16-int-convert-ieee.c b/gcc/testsuite/gcc.dg/torture/arm-fp16-int-convert-ieee.c
+--- a/gcc/testsuite/gcc.dg/torture/arm-fp16-int-convert-ieee.c 1970-01-01 01:00:00.000000000 +0100
++++ b/gcc/testsuite/gcc.dg/torture/arm-fp16-int-convert-ieee.c 2010-01-25 09:50:29.235686709 +0100
+@@ -0,0 +1,17 @@
++/* Test floating-point conversions. Standard types and __fp16. */
++/* { dg-do run { target arm*-*-* } } */
++/* { dg-options "-mfp16-format=ieee" } */
++
++#include "fp-int-convert.h"
++#define FP16_MANT_DIG 11
++
++int
++main (void)
++{
++ TEST_I_F(signed char, unsigned char, float, FP16_MANT_DIG);
++ TEST_I_F(signed short, unsigned short, float, FP16_MANT_DIG);
++ TEST_I_F(signed int, unsigned int, float, FP16_MANT_DIG);
++ TEST_I_F(signed long, unsigned long, float, FP16_MANT_DIG);
++ TEST_I_F(signed long long, unsigned long long, float, FP16_MANT_DIG);
++ exit (0);
++}
+diff -Nur a/gcc/testsuite/gcc.dg/torture/arm-fp16-ops-1.c b/gcc/testsuite/gcc.dg/torture/arm-fp16-ops-1.c
+--- a/gcc/testsuite/gcc.dg/torture/arm-fp16-ops-1.c 1970-01-01 01:00:00.000000000 +0100
++++ b/gcc/testsuite/gcc.dg/torture/arm-fp16-ops-1.c 2010-01-25 09:50:29.235686709 +0100
+@@ -0,0 +1,5 @@
++/* Test various operators on __fp16 and mixed __fp16/float operands. */
++/* { dg-do run { target arm*-*-* } } */
++/* { dg-options "-mfp16-format=ieee" } */
++
++#include "arm-fp16-ops.h"
+diff -Nur a/gcc/testsuite/gcc.dg/torture/arm-fp16-ops-2.c b/gcc/testsuite/gcc.dg/torture/arm-fp16-ops-2.c
+--- a/gcc/testsuite/gcc.dg/torture/arm-fp16-ops-2.c 1970-01-01 01:00:00.000000000 +0100
++++ b/gcc/testsuite/gcc.dg/torture/arm-fp16-ops-2.c 2010-01-25 09:50:29.235686709 +0100
+@@ -0,0 +1,5 @@
++/* Test various operators on __fp16 and mixed __fp16/float operands. */
++/* { dg-do run { target arm*-*-* } } */
++/* { dg-options "-mfp16-format=ieee -ffast-math" } */
++
++#include "arm-fp16-ops.h"
+diff -Nur a/gcc/testsuite/gcc.dg/torture/arm-fp16-ops-3.c b/gcc/testsuite/gcc.dg/torture/arm-fp16-ops-3.c
+--- a/gcc/testsuite/gcc.dg/torture/arm-fp16-ops-3.c 1970-01-01 01:00:00.000000000 +0100
++++ b/gcc/testsuite/gcc.dg/torture/arm-fp16-ops-3.c 2010-01-25 09:50:29.245686094 +0100
+@@ -0,0 +1,5 @@
++/* Test various operators on __fp16 and mixed __fp16/float operands. */
++/* { dg-do run { target arm*-*-* } } */
++/* { dg-options "-mfp16-format=alternative" } */
++
++#include "arm-fp16-ops.h"
+diff -Nur a/gcc/testsuite/gcc.dg/torture/arm-fp16-ops-4.c b/gcc/testsuite/gcc.dg/torture/arm-fp16-ops-4.c
+--- a/gcc/testsuite/gcc.dg/torture/arm-fp16-ops-4.c 1970-01-01 01:00:00.000000000 +0100
++++ b/gcc/testsuite/gcc.dg/torture/arm-fp16-ops-4.c 2010-01-25 09:50:29.245686094 +0100
+@@ -0,0 +1,5 @@
++/* Test various operators on __fp16 and mixed __fp16/float operands. */
++/* { dg-do run { target arm*-*-* } } */
++/* { dg-options "-mfp16-format=alternative -ffast-math" } */
++
++#include "arm-fp16-ops.h"
+diff -Nur a/gcc/testsuite/gcc.dg/torture/arm-fp16-ops-5.c b/gcc/testsuite/gcc.dg/torture/arm-fp16-ops-5.c
+--- a/gcc/testsuite/gcc.dg/torture/arm-fp16-ops-5.c 1970-01-01 01:00:00.000000000 +0100
++++ b/gcc/testsuite/gcc.dg/torture/arm-fp16-ops-5.c 2010-01-25 09:50:29.245686094 +0100
+@@ -0,0 +1,15 @@
++/* Test various operators on __fp16 and mixed __fp16/float operands. */
++/* { dg-do compile { target arm*-*-* } } */
++/* { dg-require-effective-target arm_neon_fp16_ok } */
++/* { dg-options "-mfp16-format=ieee" } */
++/* { dg-add-options arm_neon_fp16 } */
++
++#include "arm-fp16-ops.h"
++
++/* We've specified options for hardware float, including fp16 support, so
++ we should not see any calls to libfuncs here. */
++/* { dg-final { scan-assembler-not "\tbl\t__.*hf2" } } */
++/* { dg-final { scan-assembler-not "\tbl\t__.*hf3" } } */
++/* { dg-final { scan-assembler-not "\tbl\t__gnu_h\[a-z\]*_ieee" } } */
++/* { dg-final { scan-assembler-not "\tbl\t__gnu_h2f_ieee" } } */
++/* { dg-final { scan-assembler-not "\tbl\t__gnu_f2h_ieee" } } */
+diff -Nur a/gcc/testsuite/gcc.dg/torture/arm-fp16-ops-6.c b/gcc/testsuite/gcc.dg/torture/arm-fp16-ops-6.c
+--- a/gcc/testsuite/gcc.dg/torture/arm-fp16-ops-6.c 1970-01-01 01:00:00.000000000 +0100
++++ b/gcc/testsuite/gcc.dg/torture/arm-fp16-ops-6.c 2010-01-25 09:50:29.245686094 +0100
+@@ -0,0 +1,15 @@
++/* Test various operators on __fp16 and mixed __fp16/float operands. */
++/* { dg-do compile { target arm*-*-* } } */
++/* { dg-require-effective-target arm_neon_fp16_ok } */
++/* { dg-options "-mfp16-format=ieee -ffast-math" } */
++/* { dg-add-options arm_neon_fp16 } */
++
++#include "arm-fp16-ops.h"
++
++/* We've specified options for hardware float, including fp16 support, so
++ we should not see any calls to libfuncs here. */
++/* { dg-final { scan-assembler-not "\tbl\t__.*hf2" } } */
++/* { dg-final { scan-assembler-not "\tbl\t__.*hf3" } } */
++/* { dg-final { scan-assembler-not "\tbl\t__gnu_h\[a-z\]*_ieee" } } */
++/* { dg-final { scan-assembler-not "\tbl\t__gnu_h2f_ieee" } } */
++/* { dg-final { scan-assembler-not "\tbl\t__gnu_f2h_ieee" } } */
+diff -Nur a/gcc/testsuite/gcc.dg/torture/arm-fp16-ops-7.c b/gcc/testsuite/gcc.dg/torture/arm-fp16-ops-7.c
+--- a/gcc/testsuite/gcc.dg/torture/arm-fp16-ops-7.c 1970-01-01 01:00:00.000000000 +0100
++++ b/gcc/testsuite/gcc.dg/torture/arm-fp16-ops-7.c 2010-01-25 09:50:29.245686094 +0100
+@@ -0,0 +1,13 @@
++/* Test various operators on __fp16 and mixed __fp16/float operands. */
++/* { dg-do compile { target arm*-*-* } } */
++/* { dg-require-effective-target arm_neon_ok } */
++/* { dg-options "-mfp16-format=ieee" } */
++/* { dg-add-options arm_neon } */
++
++#include "arm-fp16-ops.h"
++
++/* We've specified options for hardware float, so we should not see any
++ calls to libfuncs here except for those to the conversion functions. */
++/* { dg-final { scan-assembler-not "\tbl\t__.*hf2" } } */
++/* { dg-final { scan-assembler-not "\tbl\t__.*hf3" } } */
++/* { dg-final { scan-assembler-not "\tbl\t__gnu_h\[a-z\]*_ieee" } } */
+diff -Nur a/gcc/testsuite/gcc.dg/torture/arm-fp16-ops-8.c b/gcc/testsuite/gcc.dg/torture/arm-fp16-ops-8.c
+--- a/gcc/testsuite/gcc.dg/torture/arm-fp16-ops-8.c 1970-01-01 01:00:00.000000000 +0100
++++ b/gcc/testsuite/gcc.dg/torture/arm-fp16-ops-8.c 2010-01-25 09:50:29.245686094 +0100
+@@ -0,0 +1,13 @@
++/* Test various operators on __fp16 and mixed __fp16/float operands. */
++/* { dg-do compile { target arm*-*-* } } */
++/* { dg-require-effective-target arm_neon_ok } */
++/* { dg-options "-mfp16-format=ieee -ffast-math" } */
++/* { dg-add-options arm_neon } */
++
++#include "arm-fp16-ops.h"
++
++/* We've specified options for hardware float, so we should not see any
++ calls to libfuncs here except for those to the conversion functions. */
++/* { dg-final { scan-assembler-not "\tbl\t__.*hf2" } } */
++/* { dg-final { scan-assembler-not "\tbl\t__.*hf3" } } */
++/* { dg-final { scan-assembler-not "\tbl\t__gnu_h\[a-z\]*_ieee" } } */
+diff -Nur a/gcc/testsuite/gcc.dg/torture/arm-fp16-ops.h b/gcc/testsuite/gcc.dg/torture/arm-fp16-ops.h
+--- a/gcc/testsuite/gcc.dg/torture/arm-fp16-ops.h 1970-01-01 01:00:00.000000000 +0100
++++ b/gcc/testsuite/gcc.dg/torture/arm-fp16-ops.h 2010-01-25 09:50:29.245686094 +0100
+@@ -0,0 +1,135 @@
++/* Test various operators on __fp16 and mixed __fp16/float operands. */
++
++#include <assert.h>
++
++#define CHECK(e,r) assert ((e) == r)
++#define CHECK2(e,r) (assert ((e) == r), temp = (e), assert (temp == r))
++#define TEST(e) assert (e)
++#define TESTNOT(e) assert (!(e))
++
++volatile __fp16 h0 = 0.0;
++volatile __fp16 h1 = 1.0;
++volatile __fp16 h42 = 42.0;
++volatile __fp16 hm2 = -2.0;
++volatile __fp16 temp;
++
++volatile float f0 = 0.0;
++volatile float f1 = 1.0;
++volatile float f42 = 42.0;
++volatile float fm2 = -2.0;
++
++int main (void)
++{
++ TEST (h1);
++ TESTNOT (h0);
++ TEST (!h0);
++ TESTNOT (!h1);
++
++ CHECK2 (-h1, -1.0);
++ CHECK2 (+h1, 1.0);
++
++ CHECK (h1++, 1.0);
++ CHECK (h1, 2.0);
++ CHECK (++h1, 3.0);
++ CHECK (h1, 3.0);
++
++ CHECK (--h1, 2.0);
++ CHECK (h1, 2.0);
++ CHECK (h1--, 2.0);
++ CHECK (h1, 1.0);
++
++ CHECK2 (h42 * hm2, -84.0);
++ CHECK2 (h42 * (__fp16) -2.0, -84.0);
++ CHECK2 (h42 * fm2, -84.0);
++ CHECK2 (f42 * hm2, -84.0);
++
++ CHECK2 (h42 / hm2, -21.0);
++ CHECK2 (h42 / (__fp16) -2.0, -21.0);
++ CHECK2 (h42 / fm2, -21.0);
++ CHECK2 (f42 / hm2, -21.0);
++
++ CHECK2 (hm2 + h42, 40.0);
++ CHECK2 ((__fp16)-2.0 + h42, 40.0);
++ CHECK2 (hm2 + f42, 40.0);
++ CHECK2 (fm2 + h42, 40.0);
++
++ CHECK2 (hm2 - h42, -44.0);
++ CHECK2 ((__fp16)-2.0 - h42, -44.0);
++ CHECK2 (hm2 - f42, -44.0);
++ CHECK2 (fm2 - h42, -44.0);
++
++ TEST (hm2 < h42);
++ TEST (hm2 < (__fp16)42.0);
++ TEST (hm2 < f42);
++ TEST (fm2 < h42);
++
++ TEST (h42 > hm2);
++ TEST ((__fp16)42.0 > hm2);
++ TEST (h42 > fm2);
++ TEST (f42 > hm2);
++
++ TEST (hm2 <= h42);
++ TEST (hm2 <= (__fp16)42.0);
++ TEST (hm2 <= f42);
++ TEST (fm2 <= h42);
++
++ TEST (h42 >= hm2);
++ TEST (h42 >= (__fp16)-2.0);
++ TEST (h42 >= fm2);
++ TEST (f42 >= hm2);
++
++ TESTNOT (h1 == hm2);
++ TEST (h1 == h1);
++ TEST (h1 == (__fp16)1.0);
++ TEST (h1 == f1);
++ TEST (f1 == h1);
++
++ TEST (h1 != hm2);
++ TESTNOT (h1 != h1);
++ TESTNOT (h1 != (__fp16)1.0);
++ TESTNOT (h1 != f1);
++ TESTNOT (f1 != h1);
++
++ CHECK2 ((h1 ? hm2 : h42), -2.0);
++ CHECK2 ((h0 ? hm2 : h42), 42.0);
++
++ CHECK (h0 = h42, 42.0);
++ CHECK (h0, 42.0);
++ CHECK (h0 = (__fp16)-2.0, -2.0);
++ CHECK (h0, -2.0);
++ CHECK (h0 = f0, 0.0);
++ CHECK (h0, 0.0);
++
++ CHECK (h0 += h1, 1.0);
++ CHECK (h0, 1.0);
++ CHECK (h0 += (__fp16)1.0, 2.0);
++ CHECK (h0, 2.0);
++ CHECK (h0 += fm2, 0.0);
++ CHECK (h0, 0.0);
++
++ CHECK (h0 -= h1, -1.0);
++ CHECK (h0, -1.0);
++ CHECK (h0 -= (__fp16)1.0, -2.0);
++ CHECK (h0, -2.0);
++ CHECK (h0 -= fm2, 0.0);
++ CHECK (h0, 0.0);
++
++ h0 = hm2;
++ CHECK (h0 *= hm2, 4.0);
++ CHECK (h0, 4.0);
++ CHECK (h0 *= (__fp16)-2.0, -8.0);
++ CHECK (h0, -8.0);
++ CHECK (h0 *= fm2, 16.0);
++ CHECK (h0, 16.0);
++
++ CHECK (h0 /= hm2, -8.0);
++ CHECK (h0, -8.0);
++ CHECK (h0 /= (__fp16)-2.0, 4.0);
++ CHECK (h0, 4.0);
++ CHECK (h0 /= fm2, -2.0);
++ CHECK (h0, -2.0);
++
++ CHECK ((h0, h1), 1.0);
++
++ return 0;
++}
+diff -Nur a/gcc/testsuite/gcc.dg/torture/type-generic-1.c b/gcc/testsuite/gcc.dg/torture/type-generic-1.c
+--- a/gcc/testsuite/gcc.dg/torture/type-generic-1.c 2008-12-10 08:49:40.000000000 +0100
++++ b/gcc/testsuite/gcc.dg/torture/type-generic-1.c 2010-01-25 09:50:29.245686094 +0100
+@@ -3,6 +3,7 @@
+
+ /* { dg-do run } */
+ /* { dg-options "-mieee" { target alpha*-*-* sh*-*-* } } */
++/* { dg-options "-Wl,--defsym=__cs3_mips_float_type=2 -lcs3-mips-cp1 -lcs3-mips-fpemu" { target mips*-*sde*-* } } */
+ /* { dg-skip-if "No Inf/NaN support" { spu-*-* } } */
+
+ #include "../tg-tests.h"
+diff -Nur a/gcc/testsuite/gcc.dg/tree-ssa/pr21559.c b/gcc/testsuite/gcc.dg/tree-ssa/pr21559.c
+--- a/gcc/testsuite/gcc.dg/tree-ssa/pr21559.c 2007-07-12 04:20:04.000000000 +0200
++++ b/gcc/testsuite/gcc.dg/tree-ssa/pr21559.c 2010-01-25 09:50:29.245686094 +0100
+@@ -1,5 +1,5 @@
+ /* { dg-do compile } */
+-/* { dg-options "-O2 -fdump-tree-vrp1-details" } */
++/* { dg-options "-O2 -fdump-tree-vrp1-details -fno-remove-local-statics" } */
+
+ static int blocksize = 4096;
+
+diff -Nur a/gcc/testsuite/gcc.dg/tree-ssa/prefetch-7.c b/gcc/testsuite/gcc.dg/tree-ssa/prefetch-7.c
+--- a/gcc/testsuite/gcc.dg/tree-ssa/prefetch-7.c 2007-06-10 22:39:22.000000000 +0200
++++ b/gcc/testsuite/gcc.dg/tree-ssa/prefetch-7.c 2010-01-25 09:50:29.245686094 +0100
+@@ -1,5 +1,6 @@
+ /* { dg-do compile { target i?86-*-* x86_64-*-* } } */
+ /* { dg-require-effective-target ilp32 } */
++/* { dg-skip-if "" { i?86-*-* x86_64-*-* } { "-march=*" } { "-march=athlon" } } */
+ /* { dg-options "-O2 -fprefetch-loop-arrays -march=athlon -msse2 -mfpmath=sse --param simultaneous-prefetches=100 --param max-unrolled-insns=1 -fdump-tree-aprefetch-details -fdump-tree-final_cleanup" } */
+
+ #define K 1000000
+diff -Nur a/gcc/testsuite/gcc.dg/tree-ssa/ssa-dse-6.c b/gcc/testsuite/gcc.dg/tree-ssa/ssa-dse-6.c
+--- a/gcc/testsuite/gcc.dg/tree-ssa/ssa-dse-6.c 2005-04-26 19:15:46.000000000 +0200
++++ b/gcc/testsuite/gcc.dg/tree-ssa/ssa-dse-6.c 2010-01-25 09:50:29.245686094 +0100
+@@ -1,5 +1,5 @@
+ /* { dg-do compile } */
+-/* { dg-options "-O2 -fdump-tree-dse1" } */
++/* { dg-options "-O2 -fdump-tree-dse1 -fno-remove-local-statics" } */
+
+ int foo11 (int c)
+ {
+diff -Nur a/gcc/testsuite/gcc.dg/vect/aligned-section-anchors-nest-1.c b/gcc/testsuite/gcc.dg/vect/aligned-section-anchors-nest-1.c
+--- a/gcc/testsuite/gcc.dg/vect/aligned-section-anchors-nest-1.c 1970-01-01 01:00:00.000000000 +0100
++++ b/gcc/testsuite/gcc.dg/vect/aligned-section-anchors-nest-1.c 2010-01-25 09:50:29.245686094 +0100
+@@ -0,0 +1,34 @@
++/* { dg-do compile } */
++/* { dg-require-effective-target section_anchors } */
++/* { dg-require-effective-target vect_int } */
++
++#include <stdarg.h>
++#include "tree-vect.h"
++
++#define N 32
++
++static int a[N][N];
++static int b[N][N];
++static int c[N][N];
++
++void clobber(int *);
++
++int *foo(void)
++{
++ int i;
++ int j;
++
++ clobber (&a[0][0]);
++ clobber (&b[0][0]);
++ clobber (&c[0][0]);
++
++ for (i = 0; i < N; i++) {
++ for (j = 0; j < N; j++) {
++ c[j][i] += a[j][i] + c[j][i];
++ }
++ }
++ return &c[0][0];
++}
++
++/* { dg-final { scan-ipa-dump-times "Increasing alignment of decl" 3 "increase_alignment" } } */
++/* { dg-final { cleanup-ipa-dump "increase_alignment" } } */
+diff -Nur a/gcc/testsuite/gcc.dg/vect/no-section-anchors-vect-31.c b/gcc/testsuite/gcc.dg/vect/no-section-anchors-vect-31.c
+--- a/gcc/testsuite/gcc.dg/vect/no-section-anchors-vect-31.c 2007-10-30 06:25:10.000000000 +0100
++++ b/gcc/testsuite/gcc.dg/vect/no-section-anchors-vect-31.c 2010-01-25 09:50:29.245686094 +0100
+@@ -88,5 +88,5 @@
+
+ /* { dg-final { scan-tree-dump-times "vectorized 4 loops" 1 "vect" } } */
+ /* { dg-final { scan-tree-dump-times "Vectorizing an unaligned access" 0 "vect" } } */
+-/* { dg-final { scan-tree-dump-times "Alignment of access forced using peeling" 2 "vect" } } */
++/* { dg-final { scan-tree-dump-times "Alignment of access forced using peeling" 2 "vect" { target { ! vect_element_align } } } } */
+ /* { dg-final { cleanup-tree-dump "vect" } } */
+diff -Nur a/gcc/testsuite/gcc.dg/vect/no-section-anchors-vect-64.c b/gcc/testsuite/gcc.dg/vect/no-section-anchors-vect-64.c
+--- a/gcc/testsuite/gcc.dg/vect/no-section-anchors-vect-64.c 2007-10-30 06:25:10.000000000 +0100
++++ b/gcc/testsuite/gcc.dg/vect/no-section-anchors-vect-64.c 2010-01-25 09:50:29.245686094 +0100
+@@ -84,5 +84,5 @@
+
+ /* { dg-final { scan-tree-dump-times "vectorized 3 loops" 1 "vect" } } */
+ /* { dg-final { scan-tree-dump-times "Vectorizing an unaligned access" 0 "vect" } } */
+-/* { dg-final { scan-tree-dump-times "Alignment of access forced using peeling" 2 "vect" } } */
++/* { dg-final { scan-tree-dump-times "Alignment of access forced using peeling" 2 "vect" { target { ! vect_element_align } } } } */
+ /* { dg-final { cleanup-tree-dump "vect" } } */
+diff -Nur a/gcc/testsuite/gcc.dg/vect/no-section-anchors-vect-66.c b/gcc/testsuite/gcc.dg/vect/no-section-anchors-vect-66.c
+--- a/gcc/testsuite/gcc.dg/vect/no-section-anchors-vect-66.c 2008-04-27 18:27:08.000000000 +0200
++++ b/gcc/testsuite/gcc.dg/vect/no-section-anchors-vect-66.c 2010-01-25 09:50:29.245686094 +0100
+@@ -79,5 +79,5 @@
+
+ /* { dg-final { scan-tree-dump-times "vectorized 3 loops" 1 "vect" } } */
+ /* { dg-final { scan-tree-dump-times "Vectorizing an unaligned access" 0 "vect" } } */
+-/* { dg-final { scan-tree-dump-times "Alignment of access forced using peeling" 1 "vect" } } */
++/* { dg-final { scan-tree-dump-times "Alignment of access forced using peeling" 1 "vect" { target { ! vect_element_align } } } } */
+ /* { dg-final { cleanup-tree-dump "vect" } } */
+diff -Nur a/gcc/testsuite/gcc.dg/vect/no-section-anchors-vect-68.c b/gcc/testsuite/gcc.dg/vect/no-section-anchors-vect-68.c
+--- a/gcc/testsuite/gcc.dg/vect/no-section-anchors-vect-68.c 2007-10-30 06:25:10.000000000 +0100
++++ b/gcc/testsuite/gcc.dg/vect/no-section-anchors-vect-68.c 2010-01-25 09:50:29.245686094 +0100
+@@ -88,5 +88,5 @@
+
+ /* { dg-final { scan-tree-dump-times "vectorized 4 loops" 1 "vect" } } */
+ /* { dg-final { scan-tree-dump-times "Vectorizing an unaligned access" 0 "vect" } } */
+-/* { dg-final { scan-tree-dump-times "Alignment of access forced using peeling" 2 "vect" } } */
++/* { dg-final { scan-tree-dump-times "Alignment of access forced using peeling" 2 "vect" { target { ! vect_element_align } } } } */
+ /* { dg-final { cleanup-tree-dump "vect" } } */
+diff -Nur a/gcc/testsuite/gcc.dg/vect/no-section-anchors-vect-69.c b/gcc/testsuite/gcc.dg/vect/no-section-anchors-vect-69.c
+--- a/gcc/testsuite/gcc.dg/vect/no-section-anchors-vect-69.c 2008-04-27 18:27:08.000000000 +0200
++++ b/gcc/testsuite/gcc.dg/vect/no-section-anchors-vect-69.c 2010-01-25 09:50:29.245686094 +0100
+@@ -114,7 +114,7 @@
+
+ /* { dg-final { scan-tree-dump-times "vectorized 4 loops" 1 "vect" } } */
+ /* { dg-final { scan-tree-dump-times "Vectorizing an unaligned access" 0 "vect" } } */
+-/* { dg-final { scan-tree-dump-times "Alignment of access forced using peeling" 2 "vect" { xfail {! vector_alignment_reachable} } } } */
++/* { dg-final { scan-tree-dump-times "Alignment of access forced using peeling" 2 "vect" { xfail { vect_element_align || {! vector_alignment_reachable} } } } } */
+ /* { dg-final { scan-tree-dump-times "Alignment of access forced using versioning" 1 "vect" { target {! vector_alignment_reachable} } } } */
+-/* { dg-final { scan-tree-dump-times "Alignment of access forced using peeling" 1 "vect" { target {! vector_alignment_reachable} } } } */
++/* { dg-final { scan-tree-dump-times "Alignment of access forced using peeling" 1 "vect" { target { { ! vector_alignment_reachable } && { ! vect_element_align } } } } } */
+ /* { dg-final { cleanup-tree-dump "vect" } } */
+diff -Nur a/gcc/testsuite/gcc.dg/vect/section-anchors-vect-69.c b/gcc/testsuite/gcc.dg/vect/section-anchors-vect-69.c
+--- a/gcc/testsuite/gcc.dg/vect/section-anchors-vect-69.c 2007-08-07 21:13:27.000000000 +0200
++++ b/gcc/testsuite/gcc.dg/vect/section-anchors-vect-69.c 2010-01-25 09:50:29.245686094 +0100
+@@ -115,6 +115,6 @@
+ /* { dg-final { scan-tree-dump-times "Vectorizing an unaligned access" 0 "vect" } } */
+ /* Alignment forced using versioning until the pass that increases alignment
+ is extended to handle structs. */
+-/* { dg-final { scan-tree-dump-times "Alignment of access forced using peeling" 4 "vect" { target {vect_int && vector_alignment_reachable } } } } */
++/* { dg-final { scan-tree-dump-times "Alignment of access forced using peeling" 4 "vect" { target { {vect_int && vector_alignment_reachable } && { ! vect_element_align } } } } } */
+ /* { dg-final { scan-tree-dump-times "Alignment of access forced using versioning" 4 "vect" { target {vect_int && {! vector_alignment_reachable} } } } } */
+ /* { dg-final { cleanup-tree-dump "vect" } } */
+diff -Nur a/gcc/testsuite/gcc.dg/vect/slp-25.c b/gcc/testsuite/gcc.dg/vect/slp-25.c
+--- a/gcc/testsuite/gcc.dg/vect/slp-25.c 2008-04-22 01:32:32.000000000 +0200
++++ b/gcc/testsuite/gcc.dg/vect/slp-25.c 2010-01-25 09:50:29.245686094 +0100
+@@ -56,5 +56,5 @@
+
+ /* { dg-final { scan-tree-dump-times "vectorized 2 loops" 1 "vect" } } */
+ /* { dg-final { scan-tree-dump-times "Vectorizing an unaligned access" 0 "vect" } } */
+-/* { dg-final { scan-tree-dump-times "Alignment of access forced using peeling" 2 "vect" { xfail vect_no_align } } } */
++/* { dg-final { scan-tree-dump-times "Alignment of access forced using peeling" 2 "vect" { xfail { vect_no_align || vect_element_align } } } } */
+ /* { dg-final { cleanup-tree-dump "vect" } } */
+diff -Nur a/gcc/testsuite/gcc.dg/vect/vect-109.c b/gcc/testsuite/gcc.dg/vect/vect-109.c
+--- a/gcc/testsuite/gcc.dg/vect/vect-109.c 2007-09-04 15:05:19.000000000 +0200
++++ b/gcc/testsuite/gcc.dg/vect/vect-109.c 2010-01-25 09:50:29.245686094 +0100
+@@ -73,6 +73,6 @@
+ }
+
+ /* { dg-final { scan-tree-dump-times "vectorized 0 loops" 2 "vect" } } */
+-/* { dg-final { scan-tree-dump-times "not vectorized: unsupported unaligned store" 2 "vect" } } */
++/* { dg-final { scan-tree-dump-times "not vectorized: unsupported unaligned store" 2 "vect" { target { ! vect_element_align } } } } */
+ /* { dg-final { cleanup-tree-dump "vect" } } */
+
+diff -Nur a/gcc/testsuite/gcc.dg/vect/vect-26.c b/gcc/testsuite/gcc.dg/vect/vect-26.c
+--- a/gcc/testsuite/gcc.dg/vect/vect-26.c 2007-09-04 15:05:19.000000000 +0200
++++ b/gcc/testsuite/gcc.dg/vect/vect-26.c 2010-01-25 09:50:29.245686094 +0100
+@@ -37,5 +37,5 @@
+
+ /* { dg-final { scan-tree-dump-times "vectorized 1 loops" 1 "vect" } } */
+ /* { dg-final { scan-tree-dump-times "Vectorizing an unaligned access" 0 "vect" } } */
+-/* { dg-final { scan-tree-dump-times "Alignment of access forced using peeling" 1 "vect" } } */
++/* { dg-final { scan-tree-dump-times "Alignment of access forced using peeling" 1 "vect" { target { ! vect_element_align } } } } */
+ /* { dg-final { cleanup-tree-dump "vect" } } */
+diff -Nur a/gcc/testsuite/gcc.dg/vect/vect-27.c b/gcc/testsuite/gcc.dg/vect/vect-27.c
+--- a/gcc/testsuite/gcc.dg/vect/vect-27.c 2007-10-30 06:25:10.000000000 +0100
++++ b/gcc/testsuite/gcc.dg/vect/vect-27.c 2010-01-25 09:50:29.245686094 +0100
+@@ -45,6 +45,6 @@
+ /* The initialization induction loop (with aligned access) is also vectorized. */
+ /* { dg-final { scan-tree-dump-times "vectorized 2 loops" 1 "vect" { xfail vect_no_align } } } */
+ /* { dg-final { scan-tree-dump-times "vectorized 1 loops" 1 "vect" { target vect_no_align } } } */
+-/* { dg-final { scan-tree-dump-times "Vectorizing an unaligned access" 1 "vect" { xfail vect_no_align } } } */
+-/* { dg-final { scan-tree-dump-times "Alignment of access forced using peeling" 0 "vect" } } */
++/* { dg-final { scan-tree-dump-times "Vectorizing an unaligned access" 1 "vect" { xfail { vect_no_align || vect_element_align } } } } */
++/* { dg-final { scan-tree-dump-times "Alignment of access forced using peeling" 0 "vect" { target { ! vect_element_align } } } } */
+ /* { dg-final { cleanup-tree-dump "vect" } } */
+diff -Nur a/gcc/testsuite/gcc.dg/vect/vect-28.c b/gcc/testsuite/gcc.dg/vect/vect-28.c
+--- a/gcc/testsuite/gcc.dg/vect/vect-28.c 2007-09-04 15:05:19.000000000 +0200
++++ b/gcc/testsuite/gcc.dg/vect/vect-28.c 2010-01-25 09:50:29.245686094 +0100
+@@ -40,6 +40,6 @@
+
+ /* { dg-final { scan-tree-dump-times "vectorized 1 loops" 1 "vect" } } */
+ /* { dg-final { scan-tree-dump-times "Vectorizing an unaligned access" 0 "vect" } } */
+-/* { dg-final { scan-tree-dump-times "Alignment of access forced using peeling" 1 "vect" { target vector_alignment_reachable } } } */
++/* { dg-final { scan-tree-dump-times "Alignment of access forced using peeling" 1 "vect" { target { vector_alignment_reachable && { ! vect_element_align } } } } } */
+ /* { dg-final { scan-tree-dump-times "Alignment of access forced using versioning" 1 "vect" { target { ! vector_alignment_reachable } } } } */
+ /* { dg-final { cleanup-tree-dump "vect" } } */
+diff -Nur a/gcc/testsuite/gcc.dg/vect/vect-29.c b/gcc/testsuite/gcc.dg/vect/vect-29.c
+--- a/gcc/testsuite/gcc.dg/vect/vect-29.c 2007-10-30 06:25:10.000000000 +0100
++++ b/gcc/testsuite/gcc.dg/vect/vect-29.c 2010-01-25 09:50:29.245686094 +0100
+@@ -50,7 +50,7 @@
+
+ /* The initialization induction loop (with aligned access) is also vectorized. */
+ /* { dg-final { scan-tree-dump-times "vectorized 2 loops" 1 "vect" } } */
+-/* { dg-final { scan-tree-dump-times "Vectorizing an unaligned access" 1 "vect" { xfail vect_no_align } } } */
+-/* { dg-final { scan-tree-dump-times "Alignment of access forced using peeling" 0 "vect" } } */
++/* { dg-final { scan-tree-dump-times "Vectorizing an unaligned access" 1 "vect" { xfail { vect_no_align || vect_element_align } } } } */
++/* { dg-final { scan-tree-dump-times "Alignment of access forced using peeling" 0 "vect" { target { ! vect_element_align } } } } */
+ /* { dg-final { scan-tree-dump-times "Alignment of access forced using versioning." 1 "vect" {target vect_no_align } } } */
+ /* { dg-final { cleanup-tree-dump "vect" } } */
+diff -Nur a/gcc/testsuite/gcc.dg/vect/vect-33.c b/gcc/testsuite/gcc.dg/vect/vect-33.c
+--- a/gcc/testsuite/gcc.dg/vect/vect-33.c 2007-09-04 15:05:19.000000000 +0200
++++ b/gcc/testsuite/gcc.dg/vect/vect-33.c 2010-01-25 09:50:29.245686094 +0100
+@@ -39,6 +39,6 @@
+
+ /* { dg-final { scan-tree-dump-times "vectorized 1 loops" 1 "vect" } } */
+ /* { dg-final { scan-tree-dump-times "Vectorizing an unaligned access" 0 "vect" } } */
+-/* { dg-final { scan-tree-dump-times "Alignment of access forced using peeling" 1 "vect" { target vector_alignment_reachable } } } */
++/* { dg-final { scan-tree-dump-times "Alignment of access forced using peeling" 1 "vect" { target { vector_alignment_reachable && { ! vect_element_align } } } } } */
+ /* { dg-final { scan-tree-dump-times "Alignment of access forced using versioning" 1 "vect" { target { ! vector_alignment_reachable } } } } */
+ /* { dg-final { cleanup-tree-dump "vect" } } */
+diff -Nur a/gcc/testsuite/gcc.dg/vect/vect-42.c b/gcc/testsuite/gcc.dg/vect/vect-42.c
+--- a/gcc/testsuite/gcc.dg/vect/vect-42.c 2007-09-04 15:05:19.000000000 +0200
++++ b/gcc/testsuite/gcc.dg/vect/vect-42.c 2010-01-25 09:50:29.245686094 +0100
+@@ -57,6 +57,6 @@
+
+ /* { dg-final { scan-tree-dump-times "vectorized 1 loops" 1 "vect" } } */
+ /* { dg-final { scan-tree-dump-times "Alignment of access forced using versioning" 1 "vect" { target { vect_no_align || { ! vector_alignment_reachable } } } } } */
+-/* { dg-final { scan-tree-dump-times "Vectorizing an unaligned access" 2 "vect" { xfail { vect_no_align || { ! vector_alignment_reachable } } } } } */
+-/* { dg-final { scan-tree-dump-times "Alignment of access forced using peeling" 1 "vect" { xfail {vect_no_align || { ! vector_alignment_reachable } } } } } */
++/* { dg-final { scan-tree-dump-times "Vectorizing an unaligned access" 2 "vect" { xfail { { vect_no_align || vect_element_align } || { ! vector_alignment_reachable } } } } } */
++/* { dg-final { scan-tree-dump-times "Alignment of access forced using peeling" 1 "vect" { xfail { { vect_no_align || vect_element_align } || { ! vector_alignment_reachable } } } } } */
+ /* { dg-final { cleanup-tree-dump "vect" } } */
+diff -Nur a/gcc/testsuite/gcc.dg/vect/vect-44.c b/gcc/testsuite/gcc.dg/vect/vect-44.c
+--- a/gcc/testsuite/gcc.dg/vect/vect-44.c 2007-09-04 15:05:19.000000000 +0200
++++ b/gcc/testsuite/gcc.dg/vect/vect-44.c 2010-01-25 09:50:29.245686094 +0100
+@@ -65,8 +65,8 @@
+ two loads to be aligned). */
+
+ /* { dg-final { scan-tree-dump-times "vectorized 1 loops" 1 "vect" } } */
+-/* { dg-final { scan-tree-dump-times "Vectorizing an unaligned access" 2 "vect" { xfail vect_no_align } } } */
+-/* { dg-final { scan-tree-dump-times "Alignment of access forced using peeling" 1 "vect" { xfail { vect_no_align || {! vector_alignment_reachable} } } } } */
++/* { dg-final { scan-tree-dump-times "Vectorizing an unaligned access" 2 "vect" { xfail { vect_no_align || vect_element_align } } } } */
++/* { dg-final { scan-tree-dump-times "Alignment of access forced using peeling" 1 "vect" { xfail { { vect_no_align || vect_element_align } || {! vector_alignment_reachable} } } } } */
+ /* { dg-final { scan-tree-dump-times "Alignment of access forced using versioning." 3 "vect" { target vect_no_align } } } */
+ /* { dg-final { scan-tree-dump-times "Alignment of access forced using versioning." 1 "vect" { target { {! vector_alignment_reachable} && {! vect_no_align} } } } } */
+ /* { dg-final { cleanup-tree-dump "vect" } } */
+diff -Nur a/gcc/testsuite/gcc.dg/vect/vect-48.c b/gcc/testsuite/gcc.dg/vect/vect-48.c
+--- a/gcc/testsuite/gcc.dg/vect/vect-48.c 2007-09-04 15:05:19.000000000 +0200
++++ b/gcc/testsuite/gcc.dg/vect/vect-48.c 2010-01-25 09:50:29.245686094 +0100
+@@ -54,7 +54,7 @@
+ (The store is aligned). */
+
+ /* { dg-final { scan-tree-dump-times "vectorized 1 loops" 1 "vect" } } */
+-/* { dg-final { scan-tree-dump-times "Vectorizing an unaligned access" 2 "vect" { xfail vect_no_align } } } */
+-/* { dg-final { scan-tree-dump-times "Alignment of access forced using peeling" 0 "vect" } } */
++/* { dg-final { scan-tree-dump-times "Vectorizing an unaligned access" 2 "vect" { xfail { vect_no_align || vect_element_align } } } } */
++/* { dg-final { scan-tree-dump-times "Alignment of access forced using peeling" 0 "vect" { target { ! vect_element_align } } } } */
+ /* { dg-final { scan-tree-dump-times "Alignment of access forced using versioning." 2 "vect" { target vect_no_align } } } */
+ /* { dg-final { cleanup-tree-dump "vect" } } */
+diff -Nur a/gcc/testsuite/gcc.dg/vect/vect-50.c b/gcc/testsuite/gcc.dg/vect/vect-50.c
+--- a/gcc/testsuite/gcc.dg/vect/vect-50.c 2007-09-04 15:05:19.000000000 +0200
++++ b/gcc/testsuite/gcc.dg/vect/vect-50.c 2010-01-25 09:50:29.245686094 +0100
+@@ -61,8 +61,8 @@
+ two loads to be aligned). */
+
+ /* { dg-final { scan-tree-dump-times "vectorized 1 loops" 1 "vect" } } */
+-/* { dg-final { scan-tree-dump-times "Vectorizing an unaligned access" 2 "vect" { xfail vect_no_align } } } */
+-/* { dg-final { scan-tree-dump-times "Alignment of access forced using peeling" 1 "vect" { xfail { vect_no_align || {! vector_alignment_reachable} } } } } */
++/* { dg-final { scan-tree-dump-times "Vectorizing an unaligned access" 2 "vect" { xfail { vect_no_align || vect_element_align } } } } */
++/* { dg-final { scan-tree-dump-times "Alignment of access forced using peeling" 1 "vect" { xfail { { vect_no_align || vect_element_align } || {! vector_alignment_reachable} } } } } */
+ /* { dg-final { scan-tree-dump-times "Alignment of access forced using versioning." 3 "vect" { target vect_no_align } } } */
+ /* { dg-final { scan-tree-dump-times "Alignment of access forced using versioning." 1 "vect" { target { {! vector_alignment_reachable} && {! vect_no_align} } } } } */
+ /* { dg-final { cleanup-tree-dump "vect" } } */
+diff -Nur a/gcc/testsuite/gcc.dg/vect/vect-52.c b/gcc/testsuite/gcc.dg/vect/vect-52.c
+--- a/gcc/testsuite/gcc.dg/vect/vect-52.c 2007-09-04 15:05:19.000000000 +0200
++++ b/gcc/testsuite/gcc.dg/vect/vect-52.c 2010-01-25 09:50:29.245686094 +0100
+@@ -55,7 +55,7 @@
+ (The store is aligned). */
+
+ /* { dg-final { scan-tree-dump-times "vectorized 1 loops" 1 "vect" } } */
+-/* { dg-final { scan-tree-dump-times "Vectorizing an unaligned access" 2 "vect" { xfail vect_no_align } } } */
+-/* { dg-final { scan-tree-dump-times "Alignment of access forced using peeling" 0 "vect" } } */
++/* { dg-final { scan-tree-dump-times "Vectorizing an unaligned access" 2 "vect" { xfail { vect_no_align || vect_element_align } } } } */
++/* { dg-final { scan-tree-dump-times "Alignment of access forced using peeling" 0 "vect" { target { ! vect_element_align } } } } */
+ /* { dg-final { scan-tree-dump-times "Alignment of access forced using versioning." 2 "vect" { target vect_no_align } } } */
+ /* { dg-final { cleanup-tree-dump "vect" } } */
+diff -Nur a/gcc/testsuite/gcc.dg/vect/vect-54.c b/gcc/testsuite/gcc.dg/vect/vect-54.c
+--- a/gcc/testsuite/gcc.dg/vect/vect-54.c 2007-09-04 15:05:19.000000000 +0200
++++ b/gcc/testsuite/gcc.dg/vect/vect-54.c 2010-01-25 09:50:29.245686094 +0100
+@@ -59,5 +59,5 @@
+
+ /* { dg-final { scan-tree-dump-times "vectorized 1 loops" 1 "vect" } } */
+ /* { dg-final { scan-tree-dump-times "Vectorizing an unaligned access" 0 "vect" } } */
+-/* { dg-final { scan-tree-dump-times "Alignment of access forced using peeling" 1 "vect" } } */
++/* { dg-final { scan-tree-dump-times "Alignment of access forced using peeling" 1 "vect" { target { ! vect_element_align } } } } */
+ /* { dg-final { cleanup-tree-dump "vect" } } */
+diff -Nur a/gcc/testsuite/gcc.dg/vect/vect-56.c b/gcc/testsuite/gcc.dg/vect/vect-56.c
+--- a/gcc/testsuite/gcc.dg/vect/vect-56.c 2007-09-04 15:05:19.000000000 +0200
++++ b/gcc/testsuite/gcc.dg/vect/vect-56.c 2010-01-25 09:50:29.245686094 +0100
+@@ -67,6 +67,6 @@
+ }
+
+ /* { dg-final { scan-tree-dump-times "vectorized 1 loops" 1 "vect" { xfail vect_no_align } } } */
+-/* { dg-final { scan-tree-dump-times "Vectorizing an unaligned access" 2 "vect" { xfail vect_no_align } } } */
+-/* { dg-final { scan-tree-dump-times "Alignment of access forced using peeling" 0 "vect" } } */
++/* { dg-final { scan-tree-dump-times "Vectorizing an unaligned access" 2 "vect" { xfail { vect_no_align || vect_element_align } } } } */
++/* { dg-final { scan-tree-dump-times "Alignment of access forced using peeling" 0 "vect" { target { ! vect_element_align } } } } */
+ /* { dg-final { cleanup-tree-dump "vect" } } */
+diff -Nur a/gcc/testsuite/gcc.dg/vect/vect-58.c b/gcc/testsuite/gcc.dg/vect/vect-58.c
+--- a/gcc/testsuite/gcc.dg/vect/vect-58.c 2007-09-04 15:05:19.000000000 +0200
++++ b/gcc/testsuite/gcc.dg/vect/vect-58.c 2010-01-25 09:50:29.245686094 +0100
+@@ -58,5 +58,5 @@
+
+ /* { dg-final { scan-tree-dump-times "vectorized 1 loops" 1 "vect" } } */
+ /* { dg-final { scan-tree-dump-times "Vectorizing an unaligned access" 0 "vect" } } */
+-/* { dg-final { scan-tree-dump-times "Alignment of access forced using peeling" 1 "vect" } } */
++/* { dg-final { scan-tree-dump-times "Alignment of access forced using peeling" 1 "vect" { target { ! vect_element_align } } } } */
+ /* { dg-final { cleanup-tree-dump "vect" } } */
+diff -Nur a/gcc/testsuite/gcc.dg/vect/vect-60.c b/gcc/testsuite/gcc.dg/vect/vect-60.c
+--- a/gcc/testsuite/gcc.dg/vect/vect-60.c 2007-09-04 15:05:19.000000000 +0200
++++ b/gcc/testsuite/gcc.dg/vect/vect-60.c 2010-01-25 09:50:29.245686094 +0100
+@@ -68,6 +68,6 @@
+ }
+
+ /* { dg-final { scan-tree-dump-times "vectorized 1 loops" 1 "vect" { xfail vect_no_align } } } */
+-/* { dg-final { scan-tree-dump-times "Vectorizing an unaligned access" 2 "vect" { xfail vect_no_align } } } */
+-/* { dg-final { scan-tree-dump-times "Alignment of access forced using peeling" 0 "vect" } } */
++/* { dg-final { scan-tree-dump-times "Vectorizing an unaligned access" 2 "vect" { xfail { vect_no_align || vect_element_align } } } } */
++/* { dg-final { scan-tree-dump-times "Alignment of access forced using peeling" 0 "vect" { target { ! vect_element_align } } } } */
+ /* { dg-final { cleanup-tree-dump "vect" } } */
+diff -Nur a/gcc/testsuite/gcc.dg/vect/vect-70.c b/gcc/testsuite/gcc.dg/vect/vect-70.c
+--- a/gcc/testsuite/gcc.dg/vect/vect-70.c 2007-09-04 15:05:19.000000000 +0200
++++ b/gcc/testsuite/gcc.dg/vect/vect-70.c 2010-01-25 09:50:29.245686094 +0100
+@@ -64,6 +64,6 @@
+
+ /* { dg-final { scan-tree-dump-times "vectorized 1 loops" 1 "vect" } } */
+ /* { dg-final { scan-tree-dump-times "Vectorizing an unaligned access" 0 "vect" } } */
+-/* { dg-final { scan-tree-dump-times "Alignment of access forced using peeling" 1 "vect" {target vector_alignment_reachable } } } */
++/* { dg-final { scan-tree-dump-times "Alignment of access forced using peeling" 1 "vect" {target { vector_alignment_reachable && { ! vect_element_align } } } } } */
+ /* { dg-final { scan-tree-dump-times "Alignment of access forced using versioning" 1 "vect" {target {! vector_alignment_reachable} } } } */
+ /* { dg-final { cleanup-tree-dump "vect" } } */
+diff -Nur a/gcc/testsuite/gcc.dg/vect/vect-72.c b/gcc/testsuite/gcc.dg/vect/vect-72.c
+--- a/gcc/testsuite/gcc.dg/vect/vect-72.c 2008-08-12 08:31:57.000000000 +0200
++++ b/gcc/testsuite/gcc.dg/vect/vect-72.c 2010-01-25 09:50:29.245686094 +0100
+@@ -46,6 +46,6 @@
+ }
+
+ /* { dg-final { scan-tree-dump-times "vectorized 1 loops" 1 "vect" { xfail vect_no_align } } } */
+-/* { dg-final { scan-tree-dump-times "Vectorizing an unaligned access" 1 "vect" { xfail vect_no_align } } } */
+-/* { dg-final { scan-tree-dump-times "Alignment of access forced using peeling" 0 "vect" } } */
++/* { dg-final { scan-tree-dump-times "Vectorizing an unaligned access" 1 "vect" { xfail { vect_no_align || vect_element_align } } } } */
++/* { dg-final { scan-tree-dump-times "Alignment of access forced using peeling" 0 "vect" { target { ! vect_element_align } } } } */
+ /* { dg-final { cleanup-tree-dump "vect" } } */
+diff -Nur a/gcc/testsuite/gcc.dg/vect/vect-75.c b/gcc/testsuite/gcc.dg/vect/vect-75.c
+--- a/gcc/testsuite/gcc.dg/vect/vect-75.c 2007-09-04 15:05:19.000000000 +0200
++++ b/gcc/testsuite/gcc.dg/vect/vect-75.c 2010-01-25 09:50:29.245686094 +0100
+@@ -45,5 +45,5 @@
+
+ /* { dg-final { scan-tree-dump-times "vectorized 1 loops" 1 "vect" } } */
+ /* { dg-final { scan-tree-dump-times "Alignment of access forced using versioning" 1 "vect" { target vect_no_align } } } */
+-/* { dg-final { scan-tree-dump-times "Vectorizing an unaligned access" 1 "vect" { xfail vect_no_align } } } */
++/* { dg-final { scan-tree-dump-times "Vectorizing an unaligned access" 1 "vect" { xfail { vect_no_align || vect_element_align } } } } */
+ /* { dg-final { cleanup-tree-dump "vect" } } */
+diff -Nur a/gcc/testsuite/gcc.dg/vect/vect-87.c b/gcc/testsuite/gcc.dg/vect/vect-87.c
+--- a/gcc/testsuite/gcc.dg/vect/vect-87.c 2007-09-04 15:05:19.000000000 +0200
++++ b/gcc/testsuite/gcc.dg/vect/vect-87.c 2010-01-25 09:50:29.245686094 +0100
+@@ -51,6 +51,6 @@
+ /* Fails for targets that don't vectorize PLUS (e.g alpha). */
+ /* { dg-final { scan-tree-dump-times "vectorized 1 loops" 1 "vect" } } */
+ /* { dg-final { scan-tree-dump-times "Vectorizing an unaligned access" 0 "vect" } } */
+-/* { dg-final { scan-tree-dump-times "Alignment of access forced using peeling" 1 "vect" {target vector_alignment_reachable } } } */
++/* { dg-final { scan-tree-dump-times "Alignment of access forced using peeling" 1 "vect" {target { vector_alignment_reachable && { ! vect_element_align } } } } } */
+ /* { dg-final { scan-tree-dump-times "Alignment of access forced using versioning" 1 "vect" {target {! vector_alignment_reachable} } } } */
+ /* { dg-final { cleanup-tree-dump "vect" } } */
+diff -Nur a/gcc/testsuite/gcc.dg/vect/vect-88.c b/gcc/testsuite/gcc.dg/vect/vect-88.c
+--- a/gcc/testsuite/gcc.dg/vect/vect-88.c 2007-09-04 15:05:19.000000000 +0200
++++ b/gcc/testsuite/gcc.dg/vect/vect-88.c 2010-01-25 09:50:29.245686094 +0100
+@@ -51,6 +51,6 @@
+ /* Fails for targets that don't vectorize PLUS (e.g alpha). */
+ /* { dg-final { scan-tree-dump-times "vectorized 1 loops" 1 "vect" } } */
+ /* { dg-final { scan-tree-dump-times "Vectorizing an unaligned access" 0 "vect" } } */
+-/* { dg-final { scan-tree-dump-times "Alignment of access forced using peeling" 1 "vect" {target vector_alignment_reachable } } } */
++/* { dg-final { scan-tree-dump-times "Alignment of access forced using peeling" 1 "vect" {target { vector_alignment_reachable && { ! vect_element_align } } } } } */
+ /* { dg-final { scan-tree-dump-times "Alignment of access forced using versioning" 1 "vect" {target {! vector_alignment_reachable} } } } */
+ /* { dg-final { cleanup-tree-dump "vect" } } */
+diff -Nur a/gcc/testsuite/gcc.dg/vect/vect-89.c b/gcc/testsuite/gcc.dg/vect/vect-89.c
+--- a/gcc/testsuite/gcc.dg/vect/vect-89.c 2007-09-04 15:05:19.000000000 +0200
++++ b/gcc/testsuite/gcc.dg/vect/vect-89.c 2010-01-25 09:50:29.245686094 +0100
+@@ -46,5 +46,5 @@
+
+ /* { dg-final { scan-tree-dump-times "vectorized 1 loops" 1 "vect" } } */
+ /* { dg-final { scan-tree-dump-times "Vectorizing an unaligned access" 0 "vect" } } */
+-/* { dg-final { scan-tree-dump-times "Alignment of access forced using peeling" 1 "vect" } } */
++/* { dg-final { scan-tree-dump-times "Alignment of access forced using peeling" 1 "vect" { target { ! vect_element_align } } } } */
+ /* { dg-final { cleanup-tree-dump "vect" } } */
+diff -Nur a/gcc/testsuite/gcc.dg/vect/vect-91.c b/gcc/testsuite/gcc.dg/vect/vect-91.c
+--- a/gcc/testsuite/gcc.dg/vect/vect-91.c 2007-09-04 15:05:19.000000000 +0200
++++ b/gcc/testsuite/gcc.dg/vect/vect-91.c 2010-01-25 09:50:29.245686094 +0100
+@@ -59,6 +59,6 @@
+
+ /* { dg-final { scan-tree-dump-times "vectorized 1 loops" 3 "vect" { xfail vect_no_int_add } } } */
+ /* { dg-final { scan-tree-dump-times "accesses have the same alignment." 3 "vect" } } */
+-/* { dg-final { scan-tree-dump-times "Alignment of access forced using peeling" 3 "vect" {target vector_alignment_reachable } } } */
++/* { dg-final { scan-tree-dump-times "Alignment of access forced using peeling" 3 "vect" {target { vector_alignment_reachable && { ! vect_element_align } } } } } */
+ /* { dg-final { scan-tree-dump-times "Alignment of access forced using versioning" 3 "vect" {target {! vector_alignment_reachable} } } } */
+ /* { dg-final { cleanup-tree-dump "vect" } } */
+diff -Nur a/gcc/testsuite/gcc.dg/vect/vect-92.c b/gcc/testsuite/gcc.dg/vect/vect-92.c
+--- a/gcc/testsuite/gcc.dg/vect/vect-92.c 2007-09-04 15:05:19.000000000 +0200
++++ b/gcc/testsuite/gcc.dg/vect/vect-92.c 2010-01-25 09:50:29.245686094 +0100
+@@ -92,5 +92,5 @@
+
+ /* { dg-final { scan-tree-dump-times "vectorized 1 loops" 3 "vect" } } */
+ /* { dg-final { scan-tree-dump-times "Vectorizing an unaligned access" 0 "vect" } } */
+-/* { dg-final { scan-tree-dump-times "Alignment of access forced using peeling" 3 "vect" } } */
++/* { dg-final { scan-tree-dump-times "Alignment of access forced using peeling" 3 "vect" { target { ! vect_element_align } } } } */
+ /* { dg-final { cleanup-tree-dump "vect" } } */
+diff -Nur a/gcc/testsuite/gcc.dg/vect/vect-93.c b/gcc/testsuite/gcc.dg/vect/vect-93.c
+--- a/gcc/testsuite/gcc.dg/vect/vect-93.c 2007-09-04 15:05:19.000000000 +0200
++++ b/gcc/testsuite/gcc.dg/vect/vect-93.c 2010-01-25 09:50:29.245686094 +0100
+@@ -72,7 +72,7 @@
+ /* main && main1 together: */
+ /* { dg-final { scan-tree-dump-times "vectorized 2 loops" 2 "vect" { target powerpc*-*-* i?86-*-* x86_64-*-* } } } */
+ /* { dg-final { scan-tree-dump-times "Alignment of access forced using peeling" 2 "vect" { target { vect_no_align && {! vector_alignment_reachable} } } } } */
+-/* { dg-final { scan-tree-dump-times "Alignment of access forced using peeling" 3 "vect" { xfail { vect_no_align || {! vector_alignment_reachable} } } } } */
++/* { dg-final { scan-tree-dump-times "Alignment of access forced using peeling" 3 "vect" { xfail { { vect_no_align || vect_element_align } || {! vector_alignment_reachable} } } } } */
+
+ /* in main1: */
+ /* { dg-final { scan-tree-dump-times "vectorized 2 loops" 1 "vect" { target !powerpc*-*-* !i?86-*-* !x86_64-*-* } } } */
+@@ -80,6 +80,6 @@
+
+ /* in main: */
+ /* { dg-final { scan-tree-dump-times "vectorized 0 loops" 1 "vect" { target vect_no_align } } } */
+-/* { dg-final { scan-tree-dump-times "Vectorizing an unaligned access" 1 "vect" { xfail vect_no_align } } } */
++/* { dg-final { scan-tree-dump-times "Vectorizing an unaligned access" 1 "vect" { xfail { vect_no_align || vect_element_align } } } } */
+
+ /* { dg-final { cleanup-tree-dump "vect" } } */
+diff -Nur a/gcc/testsuite/gcc.dg/vect/vect-95.c b/gcc/testsuite/gcc.dg/vect/vect-95.c
+--- a/gcc/testsuite/gcc.dg/vect/vect-95.c 2007-09-04 15:05:19.000000000 +0200
++++ b/gcc/testsuite/gcc.dg/vect/vect-95.c 2010-01-25 09:50:29.245686094 +0100
+@@ -62,8 +62,8 @@
+ stores and generate misaligned accesses for the loads. For targets that
+ don't support unaligned loads we version for all four accesses. */
+
+-/* { dg-final { scan-tree-dump-times "Vectorizing an unaligned access" 2 "vect" { xfail vect_no_align } } } */
+-/* { dg-final { scan-tree-dump-times "Alignment of access forced using versioning" 2 "vect" { xfail vect_no_align } } } */
++/* { dg-final { scan-tree-dump-times "Vectorizing an unaligned access" 2 "vect" { xfail { vect_no_align || vect_element_align } } } } */
++/* { dg-final { scan-tree-dump-times "Alignment of access forced using versioning" 2 "vect" { xfail { vect_no_align || vect_element_align } } } } */
+ /* { dg-final { scan-tree-dump-times "Vectorizing an unaligned access" 0 "vect" { target vect_no_align } } } */
+ /* { dg-final { scan-tree-dump-times "Alignment of access forced using versioning" 4 "vect" { target vect_no_align } } } */
+ /* { dg-final { cleanup-tree-dump "vect" } } */
+diff -Nur a/gcc/testsuite/gcc.dg/vect/vect-align-2.c b/gcc/testsuite/gcc.dg/vect/vect-align-2.c
+--- a/gcc/testsuite/gcc.dg/vect/vect-align-2.c 2008-03-13 21:13:29.000000000 +0100
++++ b/gcc/testsuite/gcc.dg/vect/vect-align-2.c 2010-01-25 09:50:29.245686094 +0100
+@@ -43,6 +43,6 @@
+
+
+ /* { dg-final { scan-tree-dump-times "Alignment of access forced using peeling" 0 "vect" } } */
+-/* { dg-final { scan-tree-dump-times "Alignment of access forced using versioning" 1 "vect" } } */
++/* { dg-final { scan-tree-dump-times "Alignment of access forced using versioning" 1 "vect" { target { ! vect_element_align } } } } */
+ /* { dg-final { scan-tree-dump-times "vectorized 1 loops" 1 "vect" } } */
+ /* { dg-final { cleanup-tree-dump "vect" } } */
+diff -Nur a/gcc/testsuite/gcc.dg/vect/vect.exp b/gcc/testsuite/gcc.dg/vect/vect.exp
+--- a/gcc/testsuite/gcc.dg/vect/vect.exp 2009-02-20 16:20:38.000000000 +0100
++++ b/gcc/testsuite/gcc.dg/vect/vect.exp 2010-01-25 09:50:29.245686094 +0100
+@@ -97,7 +97,7 @@
+ } elseif [istarget "ia64-*-*"] {
+ set dg-do-what-default run
+ } elseif [is-effective-target arm_neon_ok] {
+- lappend DEFAULT_VECTCFLAGS "-mfpu=neon" "-mfloat-abi=softfp"
++ eval lappend DEFAULT_VECTCFLAGS [add_options_for_arm_neon ""]
+ if [is-effective-target arm_neon_hw] {
+ set dg-do-what-default run
+ } else {
+@@ -183,6 +183,12 @@
+ dg-runtest [lsort [glob -nocomplain $srcdir/$subdir/section-anchors-*.\[cS\]]] \
+ "" $DEFAULT_VECTCFLAGS
+
++# alignment-sensitive -fsection-anchors tests
++set DEFAULT_VECTCFLAGS $SAVED_DEFAULT_VECTCFLAGS
++lappend DEFAULT_VECTCFLAGS "-fsection-anchors" "-fdump-ipa-increase_alignment"
++dg-runtest [lsort [glob -nocomplain $srcdir/$subdir/aligned-section-anchors-*.\[cS\]]] \
++ "" $DEFAULT_VECTCFLAGS
++
+ # -fno-section-anchors tests
+ set DEFAULT_VECTCFLAGS $SAVED_DEFAULT_VECTCFLAGS
+ lappend DEFAULT_VECTCFLAGS "-fno-section-anchors"
+diff -Nur a/gcc/testsuite/gcc.dg/vect/vect-multitypes-1.c b/gcc/testsuite/gcc.dg/vect/vect-multitypes-1.c
+--- a/gcc/testsuite/gcc.dg/vect/vect-multitypes-1.c 2007-09-04 15:05:19.000000000 +0200
++++ b/gcc/testsuite/gcc.dg/vect/vect-multitypes-1.c 2010-01-25 09:50:29.245686094 +0100
+@@ -78,11 +78,11 @@
+ return 0;
+ }
+
+-/* { dg-final { scan-tree-dump-times "vectorized 1 loops" 2 "vect" { xfail *-*-* } } } */
+-/* { dg-final { scan-tree-dump-times "vectorized 1 loops" 1 "vect" { xfail vect_no_align } } } */
++/* { dg-final { scan-tree-dump-times "vectorized 1 loops" 2 "vect" { xfail { ! vect_element_align } } } } */
++/* { dg-final { scan-tree-dump-times "vectorized 1 loops" 1 "vect" { xfail { vect_no_align || vect_element_align } } } } */
+ /* { dg-final { scan-tree-dump-times "Alignment of access forced using peeling" 2 "vect" { xfail *-*-* } } } */
+-/* { dg-final { scan-tree-dump-times "Alignment of access forced using peeling" 1 "vect" { xfail vect_no_align } } } */
++/* { dg-final { scan-tree-dump-times "Alignment of access forced using peeling" 1 "vect" { xfail { vect_no_align || vect_element_align } } } } */
+ /* { dg-final { scan-tree-dump-times "Vectorizing an unaligned access" 4 "vect" { xfail *-*-* } } } */
+-/* { dg-final { scan-tree-dump-times "Vectorizing an unaligned access" 2 "vect" { xfail vect_no_align } } } */
++/* { dg-final { scan-tree-dump-times "Vectorizing an unaligned access" 2 "vect" { xfail { vect_no_align || vect_element_align } } } } */
+ /* { dg-final { cleanup-tree-dump "vect" } } */
+
+diff -Nur a/gcc/testsuite/gcc.dg/vect/vect-multitypes-3.c b/gcc/testsuite/gcc.dg/vect/vect-multitypes-3.c
+--- a/gcc/testsuite/gcc.dg/vect/vect-multitypes-3.c 2007-09-04 15:05:19.000000000 +0200
++++ b/gcc/testsuite/gcc.dg/vect/vect-multitypes-3.c 2010-01-25 09:50:29.245686094 +0100
+@@ -54,6 +54,6 @@
+
+ /* { dg-final { scan-tree-dump-times "vectorized 1 loops" 1 "vect" } } */
+ /* { dg-final { scan-tree-dump-times "Alignment of access forced using versioning" 3 "vect" { target vect_no_align } } } */
+-/* { dg-final { scan-tree-dump-times "Vectorizing an unaligned access" 3 "vect" {xfail vect_no_align } } } */
++/* { dg-final { scan-tree-dump-times "Vectorizing an unaligned access" 3 "vect" {xfail { vect_no_align || vect_element_align } } } } */
+ /* { dg-final { cleanup-tree-dump "vect" } } */
+
+diff -Nur a/gcc/testsuite/gcc.dg/vect/vect-multitypes-4.c b/gcc/testsuite/gcc.dg/vect/vect-multitypes-4.c
+--- a/gcc/testsuite/gcc.dg/vect/vect-multitypes-4.c 2007-09-04 15:05:19.000000000 +0200
++++ b/gcc/testsuite/gcc.dg/vect/vect-multitypes-4.c 2010-01-25 09:50:29.245686094 +0100
+@@ -85,11 +85,11 @@
+ return 0;
+ }
+
+-/* { dg-final { scan-tree-dump-times "vectorized 1 loops" 2 "vect" { xfail *-*-* } } } */
+-/* { dg-final { scan-tree-dump-times "vectorized 1 loops" 1 "vect" { xfail vect_no_align } } } */
++/* { dg-final { scan-tree-dump-times "vectorized 1 loops" 2 "vect" { xfail { ! vect_element_align } } } } */
++/* { dg-final { scan-tree-dump-times "vectorized 1 loops" 1 "vect" { xfail { vect_no_align || vect_element_align } } } } */
+ /* { dg-final { scan-tree-dump-times "Alignment of access forced using peeling" 2 "vect" { xfail *-*-* } } } */
+-/* { dg-final { scan-tree-dump-times "Alignment of access forced using peeling" 1 "vect" { xfail vect_no_align } } } */
++/* { dg-final { scan-tree-dump-times "Alignment of access forced using peeling" 1 "vect" { xfail { vect_no_align || vect_element_align } } } } */
+ /* { dg-final { scan-tree-dump-times "Vectorizing an unaligned access" 8 "vect" { xfail *-*-* } } } */
+-/* { dg-final { scan-tree-dump-times "Vectorizing an unaligned access" 4 "vect" { xfail vect_no_align } } } */
++/* { dg-final { scan-tree-dump-times "Vectorizing an unaligned access" 4 "vect" { xfail { vect_no_align || vect_element_align } } } } */
+ /* { dg-final { cleanup-tree-dump "vect" } } */
+
+diff -Nur a/gcc/testsuite/gcc.dg/vect/vect-multitypes-6.c b/gcc/testsuite/gcc.dg/vect/vect-multitypes-6.c
+--- a/gcc/testsuite/gcc.dg/vect/vect-multitypes-6.c 2007-09-04 15:05:19.000000000 +0200
++++ b/gcc/testsuite/gcc.dg/vect/vect-multitypes-6.c 2010-01-25 09:50:29.245686094 +0100
+@@ -61,6 +61,6 @@
+
+ /* { dg-final { scan-tree-dump-times "vectorized 1 loops" 1 "vect" } } */
+ /* { dg-final { scan-tree-dump-times "Alignment of access forced using versioning" 6 "vect" { target vect_no_align } } } */
+-/* { dg-final { scan-tree-dump-times "Vectorizing an unaligned access" 6 "vect" {xfail vect_no_align } } } */
++/* { dg-final { scan-tree-dump-times "Vectorizing an unaligned access" 6 "vect" {xfail { vect_no_align || vect_element_align } } } } */
+ /* { dg-final { cleanup-tree-dump "vect" } } */
+
+diff -Nur a/gcc/testsuite/gcc.dg/vect/vect-shift-2.c b/gcc/testsuite/gcc.dg/vect/vect-shift-2.c
+--- a/gcc/testsuite/gcc.dg/vect/vect-shift-2.c 1970-01-01 01:00:00.000000000 +0100
++++ b/gcc/testsuite/gcc.dg/vect/vect-shift-2.c 2010-01-25 09:50:29.245686094 +0100
+@@ -0,0 +1,37 @@
++/* { dg-require-effective-target vect_shift_char } */
++/* { dg-require-effective-target vect_int } */
++
++#include "tree-vect.h"
++
++#define N 32
++
++unsigned char dst[N] __attribute__((aligned(N)));
++unsigned char src[N] __attribute__((aligned(N)));
++
++__attribute__ ((noinline))
++void array_shift(void)
++{
++ int i;
++ for (i = 0; i < N; i++)
++ dst[i] = src[i] >> 3;
++}
++
++int main()
++{
++ volatile int i;
++ check_vect ();
++
++ for (i = 0; i < N; i++)
++ src[i] = i << 3;
++
++ array_shift ();
++
++ for (i = 0; i < N; i++)
++ if (dst[i] != i)
++ abort ();
++
++ return 0;
++}
++
++/* { dg-final { scan-tree-dump-times "vectorized 1 loops" 1 "vect" } } */
++/* { dg-final { cleanup-tree-dump "vect" } } */
+diff -Nur a/gcc/testsuite/gcc.dg/vect/vect-shift-3.c b/gcc/testsuite/gcc.dg/vect/vect-shift-3.c
+--- a/gcc/testsuite/gcc.dg/vect/vect-shift-3.c 1970-01-01 01:00:00.000000000 +0100
++++ b/gcc/testsuite/gcc.dg/vect/vect-shift-3.c 2010-01-25 09:50:29.245686094 +0100
+@@ -0,0 +1,37 @@
++/* { dg-require-effective-target vect_shift } */
++/* { dg-require-effective-target vect_int } */
++
++#include "tree-vect.h"
++
++#define N 32
++
++unsigned short dst[N] __attribute__((aligned(N)));
++unsigned short src[N] __attribute__((aligned(N)));
++
++__attribute__ ((noinline))
++void array_shift(void)
++{
++ int i;
++ for (i = 0; i < N; i++)
++ dst[i] = src[i] >> 3;
++}
++
++int main()
++{
++ volatile int i;
++ check_vect ();
++
++ for (i = 0; i < N; i++)
++ src[i] = i << 3;
++
++ array_shift ();
++
++ for (i = 0; i < N; i++)
++ if (dst[i] != i)
++ abort ();
++
++ return 0;
++}
++
++/* { dg-final { scan-tree-dump-times "vectorized 1 loops" 1 "vect" } } */
++/* { dg-final { cleanup-tree-dump "vect" } } */
+diff -Nur a/gcc/testsuite/gcc.dg/vmx/vmx.exp b/gcc/testsuite/gcc.dg/vmx/vmx.exp
+--- a/gcc/testsuite/gcc.dg/vmx/vmx.exp 2007-08-01 18:25:11.000000000 +0200
++++ b/gcc/testsuite/gcc.dg/vmx/vmx.exp 2010-01-25 09:50:29.245686094 +0100
+@@ -31,7 +31,7 @@
+ # nothing but extensions.
+ global DEFAULT_VMXCFLAGS
+ if ![info exists DEFAULT_VMXCFLAGS] then {
+- set DEFAULT_VMXCFLAGS "-maltivec -mabi=altivec -std=gnu99"
++ set DEFAULT_VMXCFLAGS "-maltivec -std=gnu99"
+ }
+
+ # If the target system supports AltiVec instructions, the default action
+diff -Nur a/gcc/testsuite/gcc.misc-tests/i386-prefetch.exp b/gcc/testsuite/gcc.misc-tests/i386-prefetch.exp
+--- a/gcc/testsuite/gcc.misc-tests/i386-prefetch.exp 2009-02-20 16:20:38.000000000 +0100
++++ b/gcc/testsuite/gcc.misc-tests/i386-prefetch.exp 2010-01-25 09:50:29.245686094 +0100
+@@ -90,6 +90,13 @@
+ dg-init
+ torture-init
+
++if { [board_info target exists multilib_flags]
++ && [string match "* -march=*" " [board_info target multilib_flags] "] } {
++ # Multilib flags come after the -march flags we pass and override
++ # them, so skip these tests when such flags are passed.
++ return
++}
++
+ set-torture-options $PREFETCH_NONE
+ gcc-dg-runtest [lsort [glob -nocomplain $srcdir/$subdir/i386-pf-none-*.c]] ""
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/aapcs/aapcs.exp b/gcc/testsuite/gcc.target/arm/aapcs/aapcs.exp
+--- a/gcc/testsuite/gcc.target/arm/aapcs/aapcs.exp 1970-01-01 01:00:00.000000000 +0100
++++ b/gcc/testsuite/gcc.target/arm/aapcs/aapcs.exp 2010-01-25 09:50:29.245686094 +0100
+@@ -0,0 +1,35 @@
++# Copyright (C) 1997, 2004, 2006, 2007 Free Software Foundation, Inc.
++
++# 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/>.
++
++# GCC testsuite that uses the `dg.exp' driver.
++
++# Exit immediately if this isn't an ARM target.
++if ![istarget arm*-*-*] then {
++ return
++}
++
++# Load support procs.
++load_lib gcc-dg.exp
++
++# Initialize `dg'.
++dg-init
++
++# Main loop.
++dg-runtest [lsort [glob -nocomplain $srcdir/$subdir/*.\[cCS\]]] \
++ "" ""
++
++# All done.
++dg-finish
+diff -Nur a/gcc/testsuite/gcc.target/arm/aapcs/abitest.h b/gcc/testsuite/gcc.target/arm/aapcs/abitest.h
+--- a/gcc/testsuite/gcc.target/arm/aapcs/abitest.h 1970-01-01 01:00:00.000000000 +0100
++++ b/gcc/testsuite/gcc.target/arm/aapcs/abitest.h 2010-01-25 09:50:29.245686094 +0100
+@@ -0,0 +1,118 @@
++#define IN_FRAMEWORK
++
++#ifdef VFP
++#define D0 0
++#define D1 8
++#define D2 16
++#define D3 24
++#define D4 32
++#define D5 40
++#define D6 48
++#define D7 56
++
++#define S0 64
++#define S1 68
++#define S2 72
++#define S3 76
++#define S4 80
++#define S5 84
++#define S6 88
++#define S7 92
++#define S8 86
++#define S9 100
++#define S10 104
++#define S11 108
++#define S12 112
++#define S13 116
++#define S14 120
++#define S15 124
++
++#define R0 128
++#define R1 132
++#define R2 136
++#define R3 140
++
++#define STACK 144
++
++#else
++
++#define R0 0
++#define R1 4
++#define R2 8
++#define R3 12
++
++#define STACK 16
++
++#endif
++
++extern void abort (void);
++
++__attribute__((naked)) void dumpregs () __asm("myfunc");
++__attribute__((naked)) void dumpregs ()
++{
++ asm(
++ "mov ip, sp\n\t"
++ "stmfd sp!, {r0-r3}\n\t"
++#ifdef VFP
++ "fstmdbs sp!, {s0-s15}\n\t"
++ "fstmdbd sp!, {d0-d7}\n\t"
++#endif
++ "mov r0, sp\n\t"
++ "stmfd sp!, {ip, r14}\n\t"
++ "bl testfunc\n\t"
++ "ldmfd sp!, {r0, r14}\n\t"
++ "mov sp, r0\n\t"
++ "bx lr");
++}
++
++
++#define LAST_ARG(type,val,offset) { type __x = val; if (memcmp(&__x, stack+offset, sizeof(type)) != 0) abort(); }
++#define ARG(type,val,offset) LAST_ARG(type, val, offset)
++#define ANON(type,val,offset) LAST_ARG(type, val, offset)
++#define LAST_ANON(type,val,offset) LAST_ARG(type, val, offset)
++#define DOTS
++
++void testfunc(char* stack)
++{
++#include TESTFILE
++ return;
++}
++
++#undef LAST_ARG
++#undef ARG
++#undef DOTS
++#undef ANON
++#undef LAST_ANON
++#define LAST_ARG(type,val,offset) type
++#define ARG(type,val,offset) LAST_ARG(type, val, offset),
++#define DOTS ...
++#define ANON(type,val, offset)
++#define LAST_ANON(type,val, offset)
++
++#ifndef MYFUNCTYPE
++#define MYFUNCTYPE void
++#endif
++
++MYFUNCTYPE myfunc(
++#include TESTFILE
++);
++
++#undef LAST_ARG
++#undef ARG
++#undef DOTS
++#undef ANON
++#undef LAST_ANON
++#define LAST_ARG(type,val,offset) val
++#define ARG(type,val,offset) LAST_ARG(type, val, offset),
++#define DOTS
++#define LAST_ANON(type,val,offset) LAST_ARG(type, val, offset)
++#define ANON(type,val,offset) LAST_ARG(type, val, offset),
++
++
++int main()
++{
++ myfunc(
++#include TESTFILE
++);
++ return 0;
++}
+diff -Nur a/gcc/testsuite/gcc.target/arm/aapcs/vfp10.c b/gcc/testsuite/gcc.target/arm/aapcs/vfp10.c
+--- a/gcc/testsuite/gcc.target/arm/aapcs/vfp10.c 1970-01-01 01:00:00.000000000 +0100
++++ b/gcc/testsuite/gcc.target/arm/aapcs/vfp10.c 2010-01-25 09:50:29.245686094 +0100
+@@ -0,0 +1,38 @@
++/* Test AAPCS layout (VFP variant) */
++
++/* { dg-do run { target arm*-*-eabi* } } */
++/* { dg-require-effective-target arm_hard_vfp_ok } */
++/* { dg-require-effective-target arm32 } */
++/* { dg-options "-O -mfpu=vfp -mfloat-abi=hard" } */
++
++#ifndef IN_FRAMEWORK
++#define VFP
++#define TESTFILE "vfp10.c"
++
++__complex__ x = 1.0+2.0i;
++
++struct y
++{
++ int p;
++ int q;
++ int r;
++ int s;
++} v = { 1, 2, 3, 4 };
++
++struct z
++{
++ double x[4];
++};
++
++struct z a = { 5.0, 6.0, 7.0, 8.0 };
++struct z b = { 9.0, 10.0, 11.0, 12.0 };
++
++#include "abitest.h"
++#else
++ /* A variadic function passes using the base ABI */
++ ARG(double, 11.0, R0)
++ DOTS
++ ANON(struct z, a, R2)
++ ANON(struct z, b, STACK+24)
++ LAST_ANON(double, 0.5, STACK+56)
++#endif
+diff -Nur a/gcc/testsuite/gcc.target/arm/aapcs/vfp11.c b/gcc/testsuite/gcc.target/arm/aapcs/vfp11.c
+--- a/gcc/testsuite/gcc.target/arm/aapcs/vfp11.c 1970-01-01 01:00:00.000000000 +0100
++++ b/gcc/testsuite/gcc.target/arm/aapcs/vfp11.c 2010-01-25 09:50:29.245686094 +0100
+@@ -0,0 +1,39 @@
++/* Test AAPCS layout (VFP variant) */
++
++/* { dg-do run { target arm*-*-eabi* } } */
++/* { dg-require-effective-target arm_hard_vfp_ok } */
++/* { dg-require-effective-target arm32 } */
++/* { dg-options "-O -mfpu=vfp -mfloat-abi=hard" } */
++
++#ifndef IN_FRAMEWORK
++#define VFP
++#define TESTFILE "vfp11.c"
++
++__complex__ x = 1.0+2.0i;
++
++struct y
++{
++ int p;
++ int q;
++ int r;
++ int s;
++} v = { 1, 2, 3, 4 };
++
++struct z
++{
++ double x[4];
++};
++
++struct z a = { 5.0, 6.0, 7.0, 8.0 };
++struct z b = { 9.0, 10.0, 11.0, 12.0 };
++
++#define MYFUNCTYPE struct y
++
++#include "abitest.h"
++#else
++ ARG(int, 7, R1)
++ ARG(struct y, v, R2)
++ ARG(struct z, a, D0)
++ ARG(struct z, b, D4)
++ LAST_ARG(double, 0.5, STACK+8)
++#endif
+diff -Nur a/gcc/testsuite/gcc.target/arm/aapcs/vfp12.c b/gcc/testsuite/gcc.target/arm/aapcs/vfp12.c
+--- a/gcc/testsuite/gcc.target/arm/aapcs/vfp12.c 1970-01-01 01:00:00.000000000 +0100
++++ b/gcc/testsuite/gcc.target/arm/aapcs/vfp12.c 2010-01-25 09:50:29.245686094 +0100
+@@ -0,0 +1,38 @@
++/* Test AAPCS layout (VFP variant) */
++
++/* { dg-do run { target arm*-*-eabi* } } */
++/* { dg-require-effective-target arm_hard_vfp_ok } */
++/* { dg-require-effective-target arm32 } */
++/* { dg-options "-O -mfpu=vfp -mfloat-abi=hard" } */
++
++#ifndef IN_FRAMEWORK
++#define VFP
++#define TESTFILE "vfp12.c"
++
++__complex__ x = 1.0+2.0i;
++
++struct y
++{
++ int p;
++ int q;
++ int r;
++ int s;
++} v = { 1, 2, 3, 4 };
++
++struct z
++{
++ double x[4];
++};
++
++struct z a = { 5.0, 6.0, 7.0, 8.0 };
++struct z b = { 9.0, 10.0, 11.0, 12.0 };
++
++#include "abitest.h"
++#else
++ ARG(int, 7, R0)
++ ARG(struct y, v, R1)
++ ARG(struct z, a, D0)
++ ARG(double, 1.0, D4)
++ ARG(struct z, b, STACK+8)
++ LAST_ARG(double, 0.5, STACK+40)
++#endif
+diff -Nur a/gcc/testsuite/gcc.target/arm/aapcs/vfp13.c b/gcc/testsuite/gcc.target/arm/aapcs/vfp13.c
+--- a/gcc/testsuite/gcc.target/arm/aapcs/vfp13.c 1970-01-01 01:00:00.000000000 +0100
++++ b/gcc/testsuite/gcc.target/arm/aapcs/vfp13.c 2010-01-25 09:50:29.245686094 +0100
+@@ -0,0 +1,39 @@
++/* Test AAPCS layout (VFP variant) */
++
++/* { dg-do run { target arm*-*-eabi* } } */
++/* { dg-require-effective-target arm_hard_vfp_ok } */
++/* { dg-require-effective-target arm32 } */
++/* { dg-options "-O -mfpu=vfp -mfloat-abi=hard" } */
++
++#ifndef IN_FRAMEWORK
++#define VFP
++#define TESTFILE "vfp13.c"
++
++__complex__ x = 1.0+2.0i;
++
++struct y
++{
++ int p;
++ int q;
++ int r;
++ int s;
++} v = { 1, 2, 3, 4 };
++
++struct z
++{
++ double x[4];
++};
++
++struct z a = { 5.0, 6.0, 7.0, 8.0 };
++struct z b = { 9.0, 10.0, 11.0, 12.0 };
++
++#include "abitest.h"
++#else
++ ARG(int, 7, R0)
++ ARG(int, 9, R1)
++ ARG(struct z, a, D0)
++ ARG(double, 1.0, D4)
++ ARG(struct z, b, STACK)
++ ARG(int, 4, R2)
++ LAST_ARG(double, 0.5, STACK+32)
++#endif
+diff -Nur a/gcc/testsuite/gcc.target/arm/aapcs/vfp14.c b/gcc/testsuite/gcc.target/arm/aapcs/vfp14.c
+--- a/gcc/testsuite/gcc.target/arm/aapcs/vfp14.c 1970-01-01 01:00:00.000000000 +0100
++++ b/gcc/testsuite/gcc.target/arm/aapcs/vfp14.c 2010-01-25 09:50:29.245686094 +0100
+@@ -0,0 +1,24 @@
++/* Test AAPCS layout (VFP variant) */
++
++/* { dg-do run { target arm*-*-eabi* } } */
++/* { dg-require-effective-target arm_hard_vfp_ok } */
++/* { dg-require-effective-target arm32 } */
++/* { dg-options "-O -mfpu=vfp -mfloat-abi=hard" } */
++
++#ifndef IN_FRAMEWORK
++#define VFP
++#define TESTFILE "vfp14.c"
++
++#include "abitest.h"
++#else
++ ARG(double, 1.0, D0)
++ ARG(double, 2.0, D1)
++ ARG(double, 3.0, D2)
++ ARG(double, 4.0, D3)
++ ARG(double, 5.0, D4)
++ ARG(double, 6.0, D5)
++ ARG(double, 7.0, D6)
++ ARG(double, 8.0, D7)
++ ARG(double, 9.0, STACK)
++ LAST_ARG(double, 10.0, STACK+8)
++#endif
+diff -Nur a/gcc/testsuite/gcc.target/arm/aapcs/vfp1.c b/gcc/testsuite/gcc.target/arm/aapcs/vfp1.c
+--- a/gcc/testsuite/gcc.target/arm/aapcs/vfp1.c 1970-01-01 01:00:00.000000000 +0100
++++ b/gcc/testsuite/gcc.target/arm/aapcs/vfp1.c 2010-01-25 09:50:29.245686094 +0100
+@@ -0,0 +1,17 @@
++/* Test AAPCS layout (VFP variant) */
++
++/* { dg-do run { target arm*-*-eabi* } } */
++/* { dg-require-effective-target arm_hard_vfp_ok } */
++/* { dg-require-effective-target arm32 } */
++/* { dg-options "-O -mfpu=vfp -mfloat-abi=hard" } */
++
++#ifndef IN_FRAMEWORK
++#define VFP
++#define TESTFILE "vfp1.c"
++#include "abitest.h"
++
++#else
++ ARG(int, 4, R0)
++ ARG(double, 4.0, D0)
++ LAST_ARG(int, 3, R1)
++#endif
+diff -Nur a/gcc/testsuite/gcc.target/arm/aapcs/vfp2.c b/gcc/testsuite/gcc.target/arm/aapcs/vfp2.c
+--- a/gcc/testsuite/gcc.target/arm/aapcs/vfp2.c 1970-01-01 01:00:00.000000000 +0100
++++ b/gcc/testsuite/gcc.target/arm/aapcs/vfp2.c 2010-01-25 09:50:29.245686094 +0100
+@@ -0,0 +1,19 @@
++/* Test AAPCS layout (VFP variant) */
++
++/* { dg-do run { target arm*-*-eabi* } } */
++/* { dg-require-effective-target arm_hard_vfp_ok } */
++/* { dg-require-effective-target arm32 } */
++/* { dg-options "-O -mfpu=vfp -mfloat-abi=hard" } */
++
++#ifndef IN_FRAMEWORK
++#define VFP
++#define TESTFILE "vfp2.c"
++#include "abitest.h"
++
++#else
++ ARG(float, 1.0f, S0)
++ ARG(double, 4.0, D1)
++ ARG(float, 2.0f, S1)
++ ARG(double, 5.0, D2)
++ LAST_ARG(int, 3, R0)
++#endif
+diff -Nur a/gcc/testsuite/gcc.target/arm/aapcs/vfp3.c b/gcc/testsuite/gcc.target/arm/aapcs/vfp3.c
+--- a/gcc/testsuite/gcc.target/arm/aapcs/vfp3.c 1970-01-01 01:00:00.000000000 +0100
++++ b/gcc/testsuite/gcc.target/arm/aapcs/vfp3.c 2010-01-25 09:50:29.245686094 +0100
+@@ -0,0 +1,21 @@
++/* Test AAPCS layout (VFP variant) */
++
++/* { dg-do run { target arm*-*-eabi* } } */
++/* { dg-require-effective-target arm_hard_vfp_ok } */
++/* { dg-require-effective-target arm32 } */
++/* { dg-options "-O -mfpu=vfp -mfloat-abi=hard" } */
++
++#ifndef IN_FRAMEWORK
++#define VFP
++#define TESTFILE "vfp3.c"
++
++__complex__ x = 1.0+2.0i;
++
++#include "abitest.h"
++#else
++ ARG(float, 1.0f, S0)
++ ARG(__complex__ double, x, D1)
++ ARG(float, 2.0f, S1)
++ ARG(double, 5.0, D3)
++ LAST_ARG(int, 3, R0)
++#endif
+diff -Nur a/gcc/testsuite/gcc.target/arm/aapcs/vfp4.c b/gcc/testsuite/gcc.target/arm/aapcs/vfp4.c
+--- a/gcc/testsuite/gcc.target/arm/aapcs/vfp4.c 1970-01-01 01:00:00.000000000 +0100
++++ b/gcc/testsuite/gcc.target/arm/aapcs/vfp4.c 2010-01-25 09:50:29.245686094 +0100
+@@ -0,0 +1,20 @@
++/* Test AAPCS layout (VFP variant) */
++
++/* { dg-do run { target arm*-*-eabi* } } */
++/* { dg-require-effective-target arm_hard_vfp_ok } */
++/* { dg-require-effective-target arm32 } */
++/* { dg-options "-O -mfpu=vfp -mfloat-abi=hard" } */
++
++#ifndef IN_FRAMEWORK
++#define VFP
++#define TESTFILE "vfp4.c"
++
++__complex__ float x = 1.0f + 2.0fi;
++#include "abitest.h"
++#else
++ ARG(float, 1.0f, S0)
++ ARG(__complex__ float, x, S1)
++ ARG(float, 2.0f, S3)
++ ARG(double, 5.0, D2)
++ LAST_ARG(int, 3, R0)
++#endif
+diff -Nur a/gcc/testsuite/gcc.target/arm/aapcs/vfp5.c b/gcc/testsuite/gcc.target/arm/aapcs/vfp5.c
+--- a/gcc/testsuite/gcc.target/arm/aapcs/vfp5.c 1970-01-01 01:00:00.000000000 +0100
++++ b/gcc/testsuite/gcc.target/arm/aapcs/vfp5.c 2010-01-25 09:50:29.245686094 +0100
+@@ -0,0 +1,30 @@
++/* Test AAPCS layout (VFP variant) */
++
++/* { dg-do run { target arm*-*-eabi* } } */
++/* { dg-require-effective-target arm_hard_vfp_ok } */
++/* { dg-require-effective-target arm32 } */
++/* { dg-options "-O -mfpu=vfp -mfloat-abi=hard" } */
++
++#ifndef IN_FRAMEWORK
++#define VFP
++#define TESTFILE "vfp5.c"
++
++__complex__ float x = 1.0+2.0i;
++
++struct y
++{
++ int p;
++ int q;
++ int r;
++ int s;
++} v = { 1, 2, 3, 4 };
++
++#include "abitest.h"
++#else
++ ARG(float, 1.0f, S0)
++ ARG(__complex__ float, x, S1)
++ ARG(float, 2.0f, S3)
++ ARG(double, 5.0, D2)
++ ARG(struct y, v, R0)
++ LAST_ARG(int, 3, STACK)
++#endif
+diff -Nur a/gcc/testsuite/gcc.target/arm/aapcs/vfp6.c b/gcc/testsuite/gcc.target/arm/aapcs/vfp6.c
+--- a/gcc/testsuite/gcc.target/arm/aapcs/vfp6.c 1970-01-01 01:00:00.000000000 +0100
++++ b/gcc/testsuite/gcc.target/arm/aapcs/vfp6.c 2010-01-25 09:50:29.245686094 +0100
+@@ -0,0 +1,30 @@
++/* Test AAPCS layout (VFP variant) */
++
++/* { dg-do run { target arm*-*-eabi* } } */
++/* { dg-require-effective-target arm_hard_vfp_ok } */
++/* { dg-require-effective-target arm32 } */
++/* { dg-options "-O -mfpu=vfp -mfloat-abi=hard" } */
++
++#ifndef IN_FRAMEWORK
++#define VFP
++#define TESTFILE "vfp6.c"
++
++__complex__ float x = 1.0+2.0i;
++
++struct y
++{
++ int p;
++ int q;
++ int r;
++ int s;
++} v = { 1, 2, 3, 4 };
++
++#include "abitest.h"
++#else
++ ARG(struct y, v, R0)
++ ARG(float, 1.0f, S0)
++ ARG(__complex__ float, x, S1)
++ ARG(float, 2.0f, S3)
++ ARG(double, 5.0, D2)
++ LAST_ARG(int, 3, STACK)
++#endif
+diff -Nur a/gcc/testsuite/gcc.target/arm/aapcs/vfp7.c b/gcc/testsuite/gcc.target/arm/aapcs/vfp7.c
+--- a/gcc/testsuite/gcc.target/arm/aapcs/vfp7.c 1970-01-01 01:00:00.000000000 +0100
++++ b/gcc/testsuite/gcc.target/arm/aapcs/vfp7.c 2010-01-25 09:50:29.245686094 +0100
+@@ -0,0 +1,37 @@
++/* Test AAPCS layout (VFP variant) */
++
++/* { dg-do run { target arm*-*-eabi* } } */
++/* { dg-require-effective-target arm_hard_vfp_ok } */
++/* { dg-require-effective-target arm32 } */
++/* { dg-options "-O -mfpu=vfp -mfloat-abi=hard" } */
++
++#ifndef IN_FRAMEWORK
++#define VFP
++#define TESTFILE "vfp7.c"
++
++__complex__ x = 1.0+2.0i;
++
++struct y
++{
++ int p;
++ int q;
++ int r;
++ int s;
++} v = { 1, 2, 3, 4 };
++
++struct z
++{
++ double x[4];
++};
++
++struct z a = { 5.0, 6.0, 7.0, 8.0 };
++struct z b = { 9.0, 10.0, 11.0, 12.0 };
++
++#include "abitest.h"
++#else
++ ARG(struct z, a, D0)
++ ARG(struct z, b, D4)
++ ARG(double, 0.5, STACK)
++ ARG(int, 7, R0)
++ LAST_ARG(struct y, v, STACK+8)
++#endif
+diff -Nur a/gcc/testsuite/gcc.target/arm/aapcs/vfp8.c b/gcc/testsuite/gcc.target/arm/aapcs/vfp8.c
+--- a/gcc/testsuite/gcc.target/arm/aapcs/vfp8.c 1970-01-01 01:00:00.000000000 +0100
++++ b/gcc/testsuite/gcc.target/arm/aapcs/vfp8.c 2010-01-25 09:50:29.245686094 +0100
+@@ -0,0 +1,37 @@
++/* Test AAPCS layout (VFP variant) */
++
++/* { dg-do run { target arm*-*-eabi* } } */
++/* { dg-require-effective-target arm_hard_vfp_ok } */
++/* { dg-require-effective-target arm32 } */
++/* { dg-options "-O -mfpu=vfp -mfloat-abi=hard" } */
++
++#ifndef IN_FRAMEWORK
++#define VFP
++#define TESTFILE "vfp8.c"
++
++__complex__ x = 1.0+2.0i;
++
++struct y
++{
++ int p;
++ int q;
++ int r;
++ int s;
++} v = { 1, 2, 3, 4 };
++
++struct z
++{
++ double x[4];
++};
++
++struct z a = { 5.0, 6.0, 7.0, 8.0 };
++struct z b = { 9.0, 10.0, 11.0, 12.0 };
++
++#include "abitest.h"
++#else
++ ARG(int, 7, R0)
++ ARG(struct y, v, R1)
++ ARG(struct z, a, D0)
++ ARG(struct z, b, D4)
++ LAST_ARG(double, 0.5, STACK+8)
++#endif
+diff -Nur a/gcc/testsuite/gcc.target/arm/aapcs/vfp9.c b/gcc/testsuite/gcc.target/arm/aapcs/vfp9.c
+--- a/gcc/testsuite/gcc.target/arm/aapcs/vfp9.c 1970-01-01 01:00:00.000000000 +0100
++++ b/gcc/testsuite/gcc.target/arm/aapcs/vfp9.c 2010-01-25 09:50:29.245686094 +0100
+@@ -0,0 +1,38 @@
++/* Test AAPCS layout (VFP variant) */
++
++/* { dg-do run { target arm*-*-eabi* } } */
++/* { dg-require-effective-target arm_hard_vfp_ok } */
++/* { dg-require-effective-target arm32 } */
++/* { dg-options "-O -mfpu=vfp -mfloat-abi=hard" } */
++
++#ifndef IN_FRAMEWORK
++#define VFP
++#define TESTFILE "vfp9.c"
++
++__complex__ x = 1.0+2.0i;
++
++struct y
++{
++ int p;
++ int q;
++ int r;
++ int s;
++} v = { 1, 2, 3, 4 };
++
++struct z
++{
++ double x[4];
++};
++
++struct z a = { 5.0, 6.0, 7.0, 8.0 };
++struct z b = { 9.0, 10.0, 11.0, 12.0 };
++
++#include "abitest.h"
++#else
++ /* A variadic function passes using the base ABI */
++ ARG(int, 7, R0)
++ DOTS
++ ANON(struct z, a, R2)
++ ANON(struct z, b, STACK+24)
++ LAST_ANON(double, 0.5, STACK+56)
++#endif
+diff -Nur a/gcc/testsuite/gcc.target/arm/ctz.c b/gcc/testsuite/gcc.target/arm/ctz.c
+--- a/gcc/testsuite/gcc.target/arm/ctz.c 1970-01-01 01:00:00.000000000 +0100
++++ b/gcc/testsuite/gcc.target/arm/ctz.c 2010-01-25 09:50:29.265686890 +0100
+@@ -0,0 +1,12 @@
++/* { dg-do compile } */
++/* { dg-require-effective-target arm32 } */
++/* { dg-options "-O2 -march=armv6t2" } */
++
++unsigned int functest(unsigned int x)
++{
++ return __builtin_ctz(x);
++}
++
++/* { dg-final { scan-assembler "rbit" } } */
++/* { dg-final { scan-assembler "clz" } } */
++/* { dg-final { scan-assembler-not "rsb" } } */
+diff -Nur a/gcc/testsuite/gcc.target/arm/eabi1.c b/gcc/testsuite/gcc.target/arm/eabi1.c
+--- a/gcc/testsuite/gcc.target/arm/eabi1.c 2009-01-14 02:44:39.000000000 +0100
++++ b/gcc/testsuite/gcc.target/arm/eabi1.c 2010-01-25 09:50:29.265686890 +0100
+@@ -30,43 +30,48 @@
+ #include <stdlib.h>
+ #include <math.h>
+
+-#define decl_float(code, type) \
+- extern type __aeabi_ ## code ## add (type, type); \
+- extern type __aeabi_ ## code ## div (type, type); \
+- extern type __aeabi_ ## code ## mul (type, type); \
+- extern type __aeabi_ ## code ## neg (type); \
+- extern type __aeabi_ ## code ## rsub (type, type); \
+- extern type __aeabi_ ## code ## sub (type, type); \
+- extern int __aeabi_ ## code ## cmpeq (type, type); \
+- extern int __aeabi_ ## code ## cmplt (type, type); \
+- extern int __aeabi_ ## code ## cmple (type, type); \
+- extern int __aeabi_ ## code ## cmpge (type, type); \
+- extern int __aeabi_ ## code ## cmpgt (type, type); \
+- extern int __aeabi_ ## code ## cmpun (type, type); \
+- extern int __aeabi_ ## code ## 2iz (type); \
+- extern unsigned int __aeabi_ ## code ## 2uiz (type); \
+- extern long long __aeabi_ ## code ## 2lz (type); \
+- extern unsigned long long __aeabi_ ## code ## 2ulz (type); \
+- extern type __aeabi_i2 ## code (int); \
+- extern type __aeabi_ui2 ## code (int); \
+- extern type __aeabi_l2 ## code (long long); \
+- extern type __aeabi_ul2 ## code (unsigned long long); \
+- \
+- type code ## zero = 0.0; \
+- type code ## one = 1.0; \
+- type code ## two = 2.0; \
+- type code ## four = 4.0; \
+- type code ## minus_one = -1.0; \
+- type code ## minus_two = -2.0; \
+- type code ## minus_four = -4.0; \
+- type code ## epsilon = 1E-32; \
+- type code ## NaN = 0.0 / 0.0;
++/* All these functions are defined to use the base ABI, so use the
++ attribute to ensure the tests use the base ABI to call them even
++ when the VFP ABI is otherwise in effect. */
++#define PCS __attribute__((pcs("aapcs")))
++
++#define decl_float(code, type) \
++ extern type __aeabi_ ## code ## add (type, type) PCS; \
++ extern type __aeabi_ ## code ## div (type, type) PCS; \
++ extern type __aeabi_ ## code ## mul (type, type) PCS; \
++ extern type __aeabi_ ## code ## neg (type) PCS; \
++ extern type __aeabi_ ## code ## rsub (type, type) PCS; \
++ extern type __aeabi_ ## code ## sub (type, type) PCS; \
++ extern int __aeabi_ ## code ## cmpeq (type, type) PCS; \
++ extern int __aeabi_ ## code ## cmplt (type, type) PCS; \
++ extern int __aeabi_ ## code ## cmple (type, type) PCS; \
++ extern int __aeabi_ ## code ## cmpge (type, type) PCS; \
++ extern int __aeabi_ ## code ## cmpgt (type, type) PCS; \
++ extern int __aeabi_ ## code ## cmpun (type, type) PCS; \
++ extern int __aeabi_ ## code ## 2iz (type) PCS; \
++ extern unsigned int __aeabi_ ## code ## 2uiz (type) PCS; \
++ extern long long __aeabi_ ## code ## 2lz (type) PCS; \
++ extern unsigned long long __aeabi_ ## code ## 2ulz (type) PCS; \
++ extern type __aeabi_i2 ## code (int) PCS; \
++ extern type __aeabi_ui2 ## code (int) PCS; \
++ extern type __aeabi_l2 ## code (long long) PCS; \
++ extern type __aeabi_ul2 ## code (unsigned long long) PCS; \
++ \
++ type code ## zero = 0.0; \
++ type code ## one = 1.0; \
++ type code ## two = 2.0; \
++ type code ## four = 4.0; \
++ type code ## minus_one = -1.0; \
++ type code ## minus_two = -2.0; \
++ type code ## minus_four = -4.0; \
++ type code ## epsilon = 1E-32; \
++ type code ## NaN = 0.0 / 0.0;
+
+ decl_float (d, double)
+ decl_float (f, float)
+
+-extern float __aeabi_d2f (double);
+-extern double __aeabi_f2d (float);
++extern float __aeabi_d2f (double) PCS;
++extern double __aeabi_f2d (float) PCS;
+ extern long long __aeabi_lmul (long long, long long);
+ extern long long __aeabi_llsl (long long, int);
+ extern long long __aeabi_llsr (long long, int);
+diff -Nur a/gcc/testsuite/gcc.target/arm/fp16-builtins-1.c b/gcc/testsuite/gcc.target/arm/fp16-builtins-1.c
+--- a/gcc/testsuite/gcc.target/arm/fp16-builtins-1.c 1970-01-01 01:00:00.000000000 +0100
++++ b/gcc/testsuite/gcc.target/arm/fp16-builtins-1.c 2010-01-25 09:50:29.265686890 +0100
+@@ -0,0 +1,92 @@
++/* Test type-generic builtins with __fp16 arguments.
++ Except as otherwise noted, they should behave exactly
++ the same as those with float arguments. */
++
++/* { dg-do run } */
++/* { dg-options "-mfp16-format=ieee -std=gnu99" } */
++
++#include <stdlib.h>
++#include <math.h>
++
++volatile __fp16 h1, h2;
++volatile float f1, f2;
++
++void
++set1 (double x)
++{
++ h1 = x;
++ f1 = h1;
++}
++
++void
++set2 (double x, double y)
++{
++ h1 = x;
++ f1 = h1;
++ h2 = y;
++ f2 = h2;
++}
++
++#define test1(p,x) \
++ set1 (x); \
++ hp = (p (h1) ? 1 : 0); \
++ fp = (p (f1) ? 1 : 0); \
++ if (hp ^ fp) abort ()
++
++#define test2(p,x,y) \
++ set2 (x,y); \
++ hp = (p (h1, h2) ? 1 : 0); \
++ fp = (p (f1, f2) ? 1 : 0); \
++ if (hp ^ fp) abort ()
++
++int
++main (void)
++{
++ int hp, fp;
++
++ test1 (__builtin_isfinite, 17.0);
++ test1 (__builtin_isfinite, INFINITY);
++ test1 (__builtin_isinf, -0.5);
++ test1 (__builtin_isinf, INFINITY);
++ test1 (__builtin_isnan, 493.0);
++ test1 (__builtin_isnan, NAN);
++ test1 (__builtin_isnormal, 3.14159);
++
++ test2 (__builtin_isgreater, 5.0, 3.0);
++ test2 (__builtin_isgreater, 3.0, 5.0);
++ test2 (__builtin_isgreater, 73.5, 73.5);
++ test2 (__builtin_isgreater, 1.0, NAN);
++
++ test2 (__builtin_isgreaterequal, 5.0, 3.0);
++ test2 (__builtin_isgreaterequal, 3.0, 5.0);
++ test2 (__builtin_isgreaterequal, 73.5, 73.5);
++ test2 (__builtin_isgreaterequal, 1.0, NAN);
++
++ test2 (__builtin_isless, 5.0, 3.0);
++ test2 (__builtin_isless, 3.0, 5.0);
++ test2 (__builtin_isless, 73.5, 73.5);
++ test2 (__builtin_isless, 1.0, NAN);
++
++ test2 (__builtin_islessequal, 5.0, 3.0);
++ test2 (__builtin_islessequal, 3.0, 5.0);
++ test2 (__builtin_islessequal, 73.5, 73.5);
++ test2 (__builtin_islessequal, 1.0, NAN);
++
++ test2 (__builtin_islessgreater, 5.0, 3.0);
++ test2 (__builtin_islessgreater, 3.0, 5.0);
++ test2 (__builtin_islessgreater, 73.5, 73.5);
++ test2 (__builtin_islessgreater, 1.0, NAN);
++
++ test2 (__builtin_isunordered, 5.0, 3.0);
++ test2 (__builtin_isunordered, 3.0, 5.0);
++ test2 (__builtin_isunordered, 73.5, 73.5);
++ test2 (__builtin_isunordered, 1.0, NAN);
++
++ /* Test that __builtin_isnormal recognizes a denormalized __fp16 value,
++ even if it's representable as a normalized float. */
++ h1 = 5.96046E-8;
++ if (__builtin_isnormal (h1))
++ abort ();
++
++ return 0;
++}
+diff -Nur a/gcc/testsuite/gcc.target/arm/fp16-compile-alt-10.c b/gcc/testsuite/gcc.target/arm/fp16-compile-alt-10.c
+--- a/gcc/testsuite/gcc.target/arm/fp16-compile-alt-10.c 1970-01-01 01:00:00.000000000 +0100
++++ b/gcc/testsuite/gcc.target/arm/fp16-compile-alt-10.c 2010-01-25 09:50:29.265686890 +0100
+@@ -0,0 +1,8 @@
++/* { dg-do compile } */
++/* { dg-options "-mfp16-format=alternative -pedantic -std=gnu99" } */
++
++#include <math.h>
++
++/* NaNs are not representable in the alternative format; we should get a
++ diagnostic. */
++__fp16 xx = NAN; /* { dg-warning "overflow" } */
+diff -Nur a/gcc/testsuite/gcc.target/arm/fp16-compile-alt-11.c b/gcc/testsuite/gcc.target/arm/fp16-compile-alt-11.c
+--- a/gcc/testsuite/gcc.target/arm/fp16-compile-alt-11.c 1970-01-01 01:00:00.000000000 +0100
++++ b/gcc/testsuite/gcc.target/arm/fp16-compile-alt-11.c 2010-01-25 09:50:29.265686890 +0100
+@@ -0,0 +1,13 @@
++/* { dg-do compile } */
++/* { dg-options "-mfp16-format=alternative -pedantic -std=gnu99" } */
++
++#include <math.h>
++
++/* Infinities are not representable in the alternative format;
++ we should get a diagnostic, and the value set to the largest
++ representable value. */
++/* 0x7fff = 32767 */
++__fp16 xx = INFINITY; /* { dg-warning "overflow" } */
++
++/* { dg-final { scan-assembler "\t.size\txx, 2" } } */
++/* { dg-final { scan-assembler "\t.short\t32767" } } */
+diff -Nur a/gcc/testsuite/gcc.target/arm/fp16-compile-alt-12.c b/gcc/testsuite/gcc.target/arm/fp16-compile-alt-12.c
+--- a/gcc/testsuite/gcc.target/arm/fp16-compile-alt-12.c 1970-01-01 01:00:00.000000000 +0100
++++ b/gcc/testsuite/gcc.target/arm/fp16-compile-alt-12.c 2010-01-25 09:50:29.265686890 +0100
+@@ -0,0 +1,8 @@
++/* { dg-do compile } */
++/* { dg-options "-mfp16-format=alternative" } */
++
++float xx __attribute__((mode(HF))) = 0.0;
++
++/* { dg-final { scan-assembler "\t.eabi_attribute 38, 2" } } */
++/* { dg-final { scan-assembler "\t.size\txx, 2" } } */
++/* { dg-final { scan-assembler "\t.space\t2" } } */
+diff -Nur a/gcc/testsuite/gcc.target/arm/fp16-compile-alt-1.c b/gcc/testsuite/gcc.target/arm/fp16-compile-alt-1.c
+--- a/gcc/testsuite/gcc.target/arm/fp16-compile-alt-1.c 1970-01-01 01:00:00.000000000 +0100
++++ b/gcc/testsuite/gcc.target/arm/fp16-compile-alt-1.c 2010-01-25 09:50:29.265686890 +0100
+@@ -0,0 +1,8 @@
++/* { dg-do compile } */
++/* { dg-options "-mfp16-format=alternative" } */
++
++__fp16 xx = 0.0;
++
++/* { dg-final { scan-assembler "\t.eabi_attribute 38, 2" } } */
++/* { dg-final { scan-assembler "\t.size\txx, 2" } } */
++/* { dg-final { scan-assembler "\t.space\t2" } } */
+diff -Nur a/gcc/testsuite/gcc.target/arm/fp16-compile-alt-2.c b/gcc/testsuite/gcc.target/arm/fp16-compile-alt-2.c
+--- a/gcc/testsuite/gcc.target/arm/fp16-compile-alt-2.c 1970-01-01 01:00:00.000000000 +0100
++++ b/gcc/testsuite/gcc.target/arm/fp16-compile-alt-2.c 2010-01-25 09:50:29.265686890 +0100
+@@ -0,0 +1,9 @@
++/* { dg-do compile } */
++/* { dg-options "-mfp16-format=alternative" } */
++
++/* Encoding taken from: http://en.wikipedia.org/wiki/Half_precision */
++/* 0x3c00 = 15360 */
++__fp16 xx = 1.0;
++
++/* { dg-final { scan-assembler "\t.size\txx, 2" } } */
++/* { dg-final { scan-assembler "\t.short\t15360" } } */
+diff -Nur a/gcc/testsuite/gcc.target/arm/fp16-compile-alt-3.c b/gcc/testsuite/gcc.target/arm/fp16-compile-alt-3.c
+--- a/gcc/testsuite/gcc.target/arm/fp16-compile-alt-3.c 1970-01-01 01:00:00.000000000 +0100
++++ b/gcc/testsuite/gcc.target/arm/fp16-compile-alt-3.c 2010-01-25 09:50:29.265686890 +0100
+@@ -0,0 +1,9 @@
++/* { dg-do compile } */
++/* { dg-options "-mfp16-format=alternative" } */
++
++/* Encoding taken from: http://en.wikipedia.org/wiki/Half_precision */
++/* 0xc000 = 49152 */
++__fp16 xx = -2.0;
++
++/* { dg-final { scan-assembler "\t.size\txx, 2" } } */
++/* { dg-final { scan-assembler "\t.short\t49152" } } */
+diff -Nur a/gcc/testsuite/gcc.target/arm/fp16-compile-alt-4.c b/gcc/testsuite/gcc.target/arm/fp16-compile-alt-4.c
+--- a/gcc/testsuite/gcc.target/arm/fp16-compile-alt-4.c 1970-01-01 01:00:00.000000000 +0100
++++ b/gcc/testsuite/gcc.target/arm/fp16-compile-alt-4.c 2010-01-25 09:50:29.265686890 +0100
+@@ -0,0 +1,9 @@
++/* { dg-do compile } */
++/* { dg-options "-mfp16-format=alternative" } */
++
++/* Encoding taken from: http://en.wikipedia.org/wiki/Half_precision */
++/* 0x7bff = 31743 */
++__fp16 xx = 65504.0;
++
++/* { dg-final { scan-assembler "\t.size\txx, 2" } } */
++/* { dg-final { scan-assembler "\t.short\t31743" } } */
+diff -Nur a/gcc/testsuite/gcc.target/arm/fp16-compile-alt-5.c b/gcc/testsuite/gcc.target/arm/fp16-compile-alt-5.c
+--- a/gcc/testsuite/gcc.target/arm/fp16-compile-alt-5.c 1970-01-01 01:00:00.000000000 +0100
++++ b/gcc/testsuite/gcc.target/arm/fp16-compile-alt-5.c 2010-01-25 09:50:29.265686890 +0100
+@@ -0,0 +1,9 @@
++/* { dg-do compile } */
++/* { dg-options "-mfp16-format=alternative" } */
++
++/* Encoding taken from: http://en.wikipedia.org/wiki/Half_precision */
++/* 0x3555 = 13653 */
++__fp16 xx = (1.0/3.0);
++
++/* { dg-final { scan-assembler "\t.size\txx, 2" } } */
++/* { dg-final { scan-assembler "\t.short\t13653" } } */
+diff -Nur a/gcc/testsuite/gcc.target/arm/fp16-compile-alt-6.c b/gcc/testsuite/gcc.target/arm/fp16-compile-alt-6.c
+--- a/gcc/testsuite/gcc.target/arm/fp16-compile-alt-6.c 1970-01-01 01:00:00.000000000 +0100
++++ b/gcc/testsuite/gcc.target/arm/fp16-compile-alt-6.c 2010-01-25 09:50:29.265686890 +0100
+@@ -0,0 +1,10 @@
++/* { dg-do compile } */
++/* { dg-options "-mfp16-format=alternative" } */
++
++/* This number is the maximum value representable in the alternative
++ encoding. */
++/* 0x7fff = 32767 */
++__fp16 xx = 131008.0;
++
++/* { dg-final { scan-assembler "\t.size\txx, 2" } } */
++/* { dg-final { scan-assembler "\t.short\t32767" } } */
+diff -Nur a/gcc/testsuite/gcc.target/arm/fp16-compile-alt-7.c b/gcc/testsuite/gcc.target/arm/fp16-compile-alt-7.c
+--- a/gcc/testsuite/gcc.target/arm/fp16-compile-alt-7.c 1970-01-01 01:00:00.000000000 +0100
++++ b/gcc/testsuite/gcc.target/arm/fp16-compile-alt-7.c 2010-01-25 09:50:29.265686890 +0100
+@@ -0,0 +1,11 @@
++/* { dg-do compile } */
++/* { dg-options "-mfp16-format=alternative -pedantic" } */
++
++/* This number overflows the range of the alternative encoding. Since this
++ encoding doesn't have infinities, we should get a pedantic warning,
++ and the value should be set to the largest representable value. */
++/* 0x7fff = 32767 */
++__fp16 xx = 123456789.0; /* { dg-warning "overflow" } */
++
++/* { dg-final { scan-assembler "\t.size\txx, 2" } } */
++/* { dg-final { scan-assembler "\t.short\t32767" } } */
+diff -Nur a/gcc/testsuite/gcc.target/arm/fp16-compile-alt-8.c b/gcc/testsuite/gcc.target/arm/fp16-compile-alt-8.c
+--- a/gcc/testsuite/gcc.target/arm/fp16-compile-alt-8.c 1970-01-01 01:00:00.000000000 +0100
++++ b/gcc/testsuite/gcc.target/arm/fp16-compile-alt-8.c 2010-01-25 09:50:29.265686890 +0100
+@@ -0,0 +1,10 @@
++/* { dg-do compile } */
++/* { dg-options "-mfp16-format=alternative" } */
++
++/* Encoding taken from: http://en.wikipedia.org/wiki/Half_precision */
++/* This is the minimum normalized value. */
++/* 0x0400 = 1024 */
++__fp16 xx = 6.10352E-5;
++
++/* { dg-final { scan-assembler "\t.size\txx, 2" } } */
++/* { dg-final { scan-assembler "\t.short\t1024" } } */
+diff -Nur a/gcc/testsuite/gcc.target/arm/fp16-compile-alt-9.c b/gcc/testsuite/gcc.target/arm/fp16-compile-alt-9.c
+--- a/gcc/testsuite/gcc.target/arm/fp16-compile-alt-9.c 1970-01-01 01:00:00.000000000 +0100
++++ b/gcc/testsuite/gcc.target/arm/fp16-compile-alt-9.c 2010-01-25 09:50:29.265686890 +0100
+@@ -0,0 +1,10 @@
++/* { dg-do compile } */
++/* { dg-options "-mfp16-format=alternative" } */
++
++/* Encoding taken from: http://en.wikipedia.org/wiki/Half_precision */
++/* This is the minimum denormalized value. */
++/* 0x0001 = 1 */
++__fp16 xx = 5.96046E-8;
++
++/* { dg-final { scan-assembler "\t.size\txx, 2" } } */
++/* { dg-final { scan-assembler "\t.short\t1" } } */
+diff -Nur a/gcc/testsuite/gcc.target/arm/fp16-compile-exprtype.c b/gcc/testsuite/gcc.target/arm/fp16-compile-exprtype.c
+--- a/gcc/testsuite/gcc.target/arm/fp16-compile-exprtype.c 1970-01-01 01:00:00.000000000 +0100
++++ b/gcc/testsuite/gcc.target/arm/fp16-compile-exprtype.c 2010-01-25 09:50:29.265686890 +0100
+@@ -0,0 +1,29 @@
++/* Test that expressions involving __fp16 values have the right types. */
++/* { dg-do compile } */
++/* { dg-options "-mfp16-format=ieee" } */
++
++/* This produces a diagnostic if EXPR doesn't have type TYPE. */
++#define CHECK(expr,type) \
++ do { \
++ type v; \
++ __typeof (expr) *p = &v; \
++ } while (0);
++
++volatile __fp16 f1;
++volatile __fp16 f2;
++
++int
++main (void)
++{
++ CHECK (f1, __fp16);
++ CHECK (+f1, float);
++ CHECK (-f1, float);
++ CHECK (f1+f2, float);
++ CHECK ((__fp16)(f1+f2), __fp16);
++ CHECK ((__fp16)99.99, __fp16);
++ CHECK ((f1+f2, f1), __fp16);
++}
++
++
++
++
+diff -Nur a/gcc/testsuite/gcc.target/arm/fp16-compile-ieee-10.c b/gcc/testsuite/gcc.target/arm/fp16-compile-ieee-10.c
+--- a/gcc/testsuite/gcc.target/arm/fp16-compile-ieee-10.c 1970-01-01 01:00:00.000000000 +0100
++++ b/gcc/testsuite/gcc.target/arm/fp16-compile-ieee-10.c 2010-01-25 09:50:29.265686890 +0100
+@@ -0,0 +1,10 @@
++/* { dg-do compile } */
++/* { dg-options "-mfp16-format=ieee -std=gnu99" } */
++
++#include <math.h>
++
++/* 0x7e00 = 32256 */
++__fp16 xx = NAN;
++
++/* { dg-final { scan-assembler "\t.size\txx, 2" } } */
++/* { dg-final { scan-assembler "\t.short\t32256" } } */
+diff -Nur a/gcc/testsuite/gcc.target/arm/fp16-compile-ieee-11.c b/gcc/testsuite/gcc.target/arm/fp16-compile-ieee-11.c
+--- a/gcc/testsuite/gcc.target/arm/fp16-compile-ieee-11.c 1970-01-01 01:00:00.000000000 +0100
++++ b/gcc/testsuite/gcc.target/arm/fp16-compile-ieee-11.c 2010-01-25 09:50:29.265686890 +0100
+@@ -0,0 +1,10 @@
++/* { dg-do compile } */
++/* { dg-options "-mfp16-format=ieee -std=gnu99" } */
++
++#include <math.h>
++
++/* 0x7c00 = 31744 */
++__fp16 xx = INFINITY;
++
++/* { dg-final { scan-assembler "\t.size\txx, 2" } } */
++/* { dg-final { scan-assembler "\t.short\t31744" } } */
+diff -Nur a/gcc/testsuite/gcc.target/arm/fp16-compile-ieee-12.c b/gcc/testsuite/gcc.target/arm/fp16-compile-ieee-12.c
+--- a/gcc/testsuite/gcc.target/arm/fp16-compile-ieee-12.c 1970-01-01 01:00:00.000000000 +0100
++++ b/gcc/testsuite/gcc.target/arm/fp16-compile-ieee-12.c 2010-01-25 09:50:29.265686890 +0100
+@@ -0,0 +1,8 @@
++/* { dg-do compile } */
++/* { dg-options "-mfp16-format=ieee" } */
++
++float xx __attribute__((mode(HF))) = 0.0;
++
++/* { dg-final { scan-assembler "\t.eabi_attribute 38, 1" } } */
++/* { dg-final { scan-assembler "\t.size\txx, 2" } } */
++/* { dg-final { scan-assembler "\t.space\t2" } } */
+diff -Nur a/gcc/testsuite/gcc.target/arm/fp16-compile-ieee-1.c b/gcc/testsuite/gcc.target/arm/fp16-compile-ieee-1.c
+--- a/gcc/testsuite/gcc.target/arm/fp16-compile-ieee-1.c 1970-01-01 01:00:00.000000000 +0100
++++ b/gcc/testsuite/gcc.target/arm/fp16-compile-ieee-1.c 2010-01-25 09:50:29.275686903 +0100
+@@ -0,0 +1,8 @@
++/* { dg-do compile } */
++/* { dg-options "-mfp16-format=ieee" } */
++
++__fp16 xx = 0.0;
++
++/* { dg-final { scan-assembler "\t.eabi_attribute 38, 1" } } */
++/* { dg-final { scan-assembler "\t.size\txx, 2" } } */
++/* { dg-final { scan-assembler "\t.space\t2" } } */
+diff -Nur a/gcc/testsuite/gcc.target/arm/fp16-compile-ieee-2.c b/gcc/testsuite/gcc.target/arm/fp16-compile-ieee-2.c
+--- a/gcc/testsuite/gcc.target/arm/fp16-compile-ieee-2.c 1970-01-01 01:00:00.000000000 +0100
++++ b/gcc/testsuite/gcc.target/arm/fp16-compile-ieee-2.c 2010-01-25 09:50:29.275686903 +0100
+@@ -0,0 +1,9 @@
++/* { dg-do compile } */
++/* { dg-options "-mfp16-format=ieee" } */
++
++/* Encoding taken from: http://en.wikipedia.org/wiki/Half_precision */
++/* 0x3c00 = 15360 */
++__fp16 xx = 1.0;
++
++/* { dg-final { scan-assembler "\t.size\txx, 2" } } */
++/* { dg-final { scan-assembler "\t.short\t15360" } } */
+diff -Nur a/gcc/testsuite/gcc.target/arm/fp16-compile-ieee-3.c b/gcc/testsuite/gcc.target/arm/fp16-compile-ieee-3.c
+--- a/gcc/testsuite/gcc.target/arm/fp16-compile-ieee-3.c 1970-01-01 01:00:00.000000000 +0100
++++ b/gcc/testsuite/gcc.target/arm/fp16-compile-ieee-3.c 2010-01-25 09:50:29.275686903 +0100
+@@ -0,0 +1,9 @@
++/* { dg-do compile } */
++/* { dg-options "-mfp16-format=ieee" } */
++
++/* Encoding taken from: http://en.wikipedia.org/wiki/Half_precision */
++/* 0xc000 = 49152 */
++__fp16 xx = -2.0;
++
++/* { dg-final { scan-assembler "\t.size\txx, 2" } } */
++/* { dg-final { scan-assembler "\t.short\t49152" } } */
+diff -Nur a/gcc/testsuite/gcc.target/arm/fp16-compile-ieee-4.c b/gcc/testsuite/gcc.target/arm/fp16-compile-ieee-4.c
+--- a/gcc/testsuite/gcc.target/arm/fp16-compile-ieee-4.c 1970-01-01 01:00:00.000000000 +0100
++++ b/gcc/testsuite/gcc.target/arm/fp16-compile-ieee-4.c 2010-01-25 09:50:29.275686903 +0100
+@@ -0,0 +1,9 @@
++/* { dg-do compile } */
++/* { dg-options "-mfp16-format=ieee" } */
++
++/* Encoding taken from: http://en.wikipedia.org/wiki/Half_precision */
++/* 0x7bff = 31743 */
++__fp16 xx = 65504.0;
++
++/* { dg-final { scan-assembler "\t.size\txx, 2" } } */
++/* { dg-final { scan-assembler "\t.short\t31743" } } */
+diff -Nur a/gcc/testsuite/gcc.target/arm/fp16-compile-ieee-5.c b/gcc/testsuite/gcc.target/arm/fp16-compile-ieee-5.c
+--- a/gcc/testsuite/gcc.target/arm/fp16-compile-ieee-5.c 1970-01-01 01:00:00.000000000 +0100
++++ b/gcc/testsuite/gcc.target/arm/fp16-compile-ieee-5.c 2010-01-25 09:50:29.275686903 +0100
+@@ -0,0 +1,9 @@
++/* { dg-do compile } */
++/* { dg-options "-mfp16-format=ieee" } */
++
++/* Encoding taken from: http://en.wikipedia.org/wiki/Half_precision */
++/* 0x3555 = 13653 */
++__fp16 xx = (1.0/3.0);
++
++/* { dg-final { scan-assembler "\t.size\txx, 2" } } */
++/* { dg-final { scan-assembler "\t.short\t13653" } } */
+diff -Nur a/gcc/testsuite/gcc.target/arm/fp16-compile-ieee-6.c b/gcc/testsuite/gcc.target/arm/fp16-compile-ieee-6.c
+--- a/gcc/testsuite/gcc.target/arm/fp16-compile-ieee-6.c 1970-01-01 01:00:00.000000000 +0100
++++ b/gcc/testsuite/gcc.target/arm/fp16-compile-ieee-6.c 2010-01-25 09:50:29.275686903 +0100
+@@ -0,0 +1,10 @@
++/* { dg-do compile } */
++/* { dg-options "-mfp16-format=ieee" } */
++
++/* Encoding taken from: http://en.wikipedia.org/wiki/Half_precision */
++/* This number is too big and is represented as infinity. */
++/* 0x7c00 = 31744 */
++__fp16 xx = 131008.0;
++
++/* { dg-final { scan-assembler "\t.size\txx, 2" } } */
++/* { dg-final { scan-assembler "\t.short\t31744" } } */
+diff -Nur a/gcc/testsuite/gcc.target/arm/fp16-compile-ieee-7.c b/gcc/testsuite/gcc.target/arm/fp16-compile-ieee-7.c
+--- a/gcc/testsuite/gcc.target/arm/fp16-compile-ieee-7.c 1970-01-01 01:00:00.000000000 +0100
++++ b/gcc/testsuite/gcc.target/arm/fp16-compile-ieee-7.c 2010-01-25 09:50:29.275686903 +0100
+@@ -0,0 +1,11 @@
++/* { dg-do compile } */
++/* { dg-options "-mfp16-format=ieee -pedantic" } */
++
++/* Encoding taken from: http://en.wikipedia.org/wiki/Half_precision */
++/* This number is too big and is represented as infinity. */
++/* We should *not* get an overflow warning here. */
++/* 0x7c00 = 31744 */
++__fp16 xx = 123456789.0;
++
++/* { dg-final { scan-assembler "\t.size\txx, 2" } } */
++/* { dg-final { scan-assembler "\t.short\t31744" } } */
+diff -Nur a/gcc/testsuite/gcc.target/arm/fp16-compile-ieee-8.c b/gcc/testsuite/gcc.target/arm/fp16-compile-ieee-8.c
+--- a/gcc/testsuite/gcc.target/arm/fp16-compile-ieee-8.c 1970-01-01 01:00:00.000000000 +0100
++++ b/gcc/testsuite/gcc.target/arm/fp16-compile-ieee-8.c 2010-01-25 09:50:29.275686903 +0100
+@@ -0,0 +1,10 @@
++/* { dg-do compile } */
++/* { dg-options "-mfp16-format=ieee" } */
++
++/* Encoding taken from: http://en.wikipedia.org/wiki/Half_precision */
++/* This is the minimum normalized value. */
++/* 0x0400 = 1024 */
++__fp16 xx = 6.10352E-5;
++
++/* { dg-final { scan-assembler "\t.size\txx, 2" } } */
++/* { dg-final { scan-assembler "\t.short\t1024" } } */
+diff -Nur a/gcc/testsuite/gcc.target/arm/fp16-compile-ieee-9.c b/gcc/testsuite/gcc.target/arm/fp16-compile-ieee-9.c
+--- a/gcc/testsuite/gcc.target/arm/fp16-compile-ieee-9.c 1970-01-01 01:00:00.000000000 +0100
++++ b/gcc/testsuite/gcc.target/arm/fp16-compile-ieee-9.c 2010-01-25 09:50:29.275686903 +0100
+@@ -0,0 +1,10 @@
++/* { dg-do compile } */
++/* { dg-options "-mfp16-format=ieee" } */
++
++/* Encoding taken from: http://en.wikipedia.org/wiki/Half_precision */
++/* This is the minimum denormalized value. */
++/* 0x0001 = 1 */
++__fp16 xx = 5.96046E-8;
++
++/* { dg-final { scan-assembler "\t.size\txx, 2" } } */
++/* { dg-final { scan-assembler "\t.short\t1" } } */
+diff -Nur a/gcc/testsuite/gcc.target/arm/fp16-compile-none-1.c b/gcc/testsuite/gcc.target/arm/fp16-compile-none-1.c
+--- a/gcc/testsuite/gcc.target/arm/fp16-compile-none-1.c 1970-01-01 01:00:00.000000000 +0100
++++ b/gcc/testsuite/gcc.target/arm/fp16-compile-none-1.c 2010-01-25 09:50:29.275686903 +0100
+@@ -0,0 +1,6 @@
++/* { dg-do compile } */
++/* { dg-options "-mfp16-format=none" } */
++
++/* __fp16 type name is not recognized unless you explicitly enable it
++ by selecting -mfp16-format=ieee or -mfp16-format=alternative. */
++__fp16 xx = 0.0; /* { dg-error "expected" } */
+diff -Nur a/gcc/testsuite/gcc.target/arm/fp16-compile-none-2.c b/gcc/testsuite/gcc.target/arm/fp16-compile-none-2.c
+--- a/gcc/testsuite/gcc.target/arm/fp16-compile-none-2.c 1970-01-01 01:00:00.000000000 +0100
++++ b/gcc/testsuite/gcc.target/arm/fp16-compile-none-2.c 2010-01-25 09:50:29.275686903 +0100
+@@ -0,0 +1,7 @@
++/* { dg-do compile } */
++/* { dg-options "-mfp16-format=none" } */
++
++/* mode(HF) attributes are not recognized unless you explicitly enable
++ half-precision floating point by selecting -mfp16-format=ieee or
++ -mfp16-format=alternative. */
++float xx __attribute__((mode(HF))) = 0.0; /* { dg-error "HF" } */
+diff -Nur a/gcc/testsuite/gcc.target/arm/fp16-compile-vcvt.c b/gcc/testsuite/gcc.target/arm/fp16-compile-vcvt.c
+--- a/gcc/testsuite/gcc.target/arm/fp16-compile-vcvt.c 1970-01-01 01:00:00.000000000 +0100
++++ b/gcc/testsuite/gcc.target/arm/fp16-compile-vcvt.c 2010-01-25 09:50:29.275686903 +0100
+@@ -0,0 +1,20 @@
++/* { dg-do compile } */
++/* { dg-require-effective-target arm_neon_fp16_ok } */
++/* { dg-options "-mfp16-format=ieee" } */
++/* { dg-add-options arm_neon_fp16 } */
++
++/* Test generation of VFP __fp16 instructions. */
++
++__fp16 h1 = 0.0;
++__fp16 h2 = 1234.0;
++float f1 = 2.0;
++float f2 = -999.9;
++
++void f (void)
++{
++ h1 = f1;
++ f2 = h2;
++}
++
++/* { dg-final { scan-assembler "\tvcvtb.f32.f16" } } */
++/* { dg-final { scan-assembler "\tvcvtb.f16.f32" } } */
+diff -Nur a/gcc/testsuite/gcc.target/arm/fp16-param-1.c b/gcc/testsuite/gcc.target/arm/fp16-param-1.c
+--- a/gcc/testsuite/gcc.target/arm/fp16-param-1.c 1970-01-01 01:00:00.000000000 +0100
++++ b/gcc/testsuite/gcc.target/arm/fp16-param-1.c 2010-01-25 09:50:29.275686903 +0100
+@@ -0,0 +1,10 @@
++/* { dg-do compile } */
++/* { dg-options "-mfp16-format=ieee" } */
++
++/* Functions cannot have parameters of type __fp16. */
++extern void f (__fp16); /* { dg-error "parameters cannot have __fp16 type" } */
++extern void (*pf) (__fp16); /* { dg-error "parameters cannot have __fp16 type" } */
++
++/* These should be OK. */
++extern void g (__fp16 *);
++extern void (*pg) (__fp16 *);
+diff -Nur a/gcc/testsuite/gcc.target/arm/fp16-return-1.c b/gcc/testsuite/gcc.target/arm/fp16-return-1.c
+--- a/gcc/testsuite/gcc.target/arm/fp16-return-1.c 1970-01-01 01:00:00.000000000 +0100
++++ b/gcc/testsuite/gcc.target/arm/fp16-return-1.c 2010-01-25 09:50:29.275686903 +0100
+@@ -0,0 +1,10 @@
++/* { dg-do compile } */
++/* { dg-options "-mfp16-format=ieee" } */
++
++/* Functions cannot return type __fp16. */
++extern __fp16 f (void); /* { dg-error "cannot return __fp16" } */
++extern __fp16 (*pf) (void); /* { dg-error "cannot return __fp16" } */
++
++/* These should be OK. */
++extern __fp16 *g (void);
++extern __fp16 *(*pg) (void);
+diff -Nur a/gcc/testsuite/gcc.target/arm/fp16-rounding-alt-1.c b/gcc/testsuite/gcc.target/arm/fp16-rounding-alt-1.c
+--- a/gcc/testsuite/gcc.target/arm/fp16-rounding-alt-1.c 1970-01-01 01:00:00.000000000 +0100
++++ b/gcc/testsuite/gcc.target/arm/fp16-rounding-alt-1.c 2010-01-25 09:50:29.275686903 +0100
+@@ -0,0 +1,47 @@
++/* Test intermediate rounding of double to float and then to __fp16, using
++ an example of a number that would round differently if it went directly
++ from double to __fp16. */
++
++/* { dg-do run } */
++/* { dg-options "-mfp16-format=alternative" } */
++
++#include <stdlib.h>
++
++/* The original double value. */
++#define ORIG 0x1.0020008p0
++
++/* The expected (double)((__fp16)((float)ORIG)) value. */
++#define ROUNDED 0x1.0000000p0
++
++typedef union u {
++ __fp16 f;
++ unsigned short h;
++} ufh;
++
++ufh s = { ORIG };
++ufh r = { ROUNDED };
++
++double d = ORIG;
++
++int
++main (void)
++{
++ ufh x;
++
++ /* Test that the rounding is correct for static initializers. */
++ if (s.h != r.h)
++ abort ();
++
++ /* Test that the rounding is correct for a casted constant expression
++ not in a static initializer. */
++ x.f = (__fp16)ORIG;
++ if (x.h != r.h)
++ abort ();
++
++ /* Test that the rounding is correct for a runtime conversion. */
++ x.f = (__fp16)d;
++ if (x.h != r.h)
++ abort ();
++
++ return 0;
++}
+diff -Nur a/gcc/testsuite/gcc.target/arm/fp16-rounding-ieee-1.c b/gcc/testsuite/gcc.target/arm/fp16-rounding-ieee-1.c
+--- a/gcc/testsuite/gcc.target/arm/fp16-rounding-ieee-1.c 1970-01-01 01:00:00.000000000 +0100
++++ b/gcc/testsuite/gcc.target/arm/fp16-rounding-ieee-1.c 2010-01-25 09:50:29.275686903 +0100
+@@ -0,0 +1,47 @@
++/* Test intermediate rounding of double to float and then to __fp16, using
++ an example of a number that would round differently if it went directly
++ from double to __fp16. */
++
++/* { dg-do run } */
++/* { dg-options "-mfp16-format=ieee" } */
++
++#include <stdlib.h>
++
++/* The original double value. */
++#define ORIG 0x1.0020008p0
++
++/* The expected (double)((__fp16)((float)ORIG)) value. */
++#define ROUNDED 0x1.0000000p0
++
++typedef union u {
++ __fp16 f;
++ unsigned short h;
++} ufh;
++
++ufh s = { ORIG };
++ufh r = { ROUNDED };
++
++double d = ORIG;
++
++int
++main (void)
++{
++ ufh x;
++
++ /* Test that the rounding is correct for static initializers. */
++ if (s.h != r.h)
++ abort ();
++
++ /* Test that the rounding is correct for a casted constant expression
++ not in a static initializer. */
++ x.f = (__fp16)ORIG;
++ if (x.h != r.h)
++ abort ();
++
++ /* Test that the rounding is correct for a runtime conversion. */
++ x.f = (__fp16)d;
++ if (x.h != r.h)
++ abort ();
++
++ return 0;
++}
+diff -Nur a/gcc/testsuite/gcc.target/arm/fp16-unprototyped-1.c b/gcc/testsuite/gcc.target/arm/fp16-unprototyped-1.c
+--- a/gcc/testsuite/gcc.target/arm/fp16-unprototyped-1.c 1970-01-01 01:00:00.000000000 +0100
++++ b/gcc/testsuite/gcc.target/arm/fp16-unprototyped-1.c 2010-01-25 09:50:29.275686903 +0100
+@@ -0,0 +1,21 @@
++/* Test promotion of __fp16 to double as arguments to unprototyped
++ function in another compilation unit. */
++
++/* { dg-do run } */
++/* { dg-options "-mfp16-format=ieee" } */
++/* { dg-additional-sources "fp16-unprototyped-2.c" } */
++
++#include <stdlib.h>
++
++extern int f ();
++
++static __fp16 x = 42.0;
++static __fp16 y = -42.0;
++
++int
++main (void)
++{
++ if (!f (x, y))
++ abort ();
++ return 0;
++}
+diff -Nur a/gcc/testsuite/gcc.target/arm/fp16-unprototyped-2.c b/gcc/testsuite/gcc.target/arm/fp16-unprototyped-2.c
+--- a/gcc/testsuite/gcc.target/arm/fp16-unprototyped-2.c 1970-01-01 01:00:00.000000000 +0100
++++ b/gcc/testsuite/gcc.target/arm/fp16-unprototyped-2.c 2010-01-25 09:50:29.275686903 +0100
+@@ -0,0 +1,12 @@
++/* { dg-do compile } */
++/* { dg-options "-mfp16-format=ieee" } */
++
++extern int f ();
++
++int
++f (double xx, double yy)
++{
++ if (xx == 42.0 && yy == -42.0)
++ return 1;
++ return 0;
++}
+diff -Nur a/gcc/testsuite/gcc.target/arm/fp16-variadic-1.c b/gcc/testsuite/gcc.target/arm/fp16-variadic-1.c
+--- a/gcc/testsuite/gcc.target/arm/fp16-variadic-1.c 1970-01-01 01:00:00.000000000 +0100
++++ b/gcc/testsuite/gcc.target/arm/fp16-variadic-1.c 2010-01-25 09:50:29.275686903 +0100
+@@ -0,0 +1,37 @@
++/* Test promotion of __fp16 to double as arguments to variadic function. */
++
++/* { dg-do run } */
++/* { dg-options "-mfp16-format=ieee" } */
++
++#include <stdlib.h>
++#include <stdarg.h>
++
++extern int f (int n, ...);
++
++int
++f (int n, ...)
++{
++ if (n == 2)
++ {
++ double xx, yy;
++ va_list ap;
++ va_start (ap, n);
++ xx = va_arg (ap, double);
++ yy = va_arg (ap, double);
++ va_end (ap);
++ if (xx == 42.0 && yy == -42.0)
++ return 1;
++ }
++ return 0;
++}
++
++static __fp16 x = 42.0;
++static __fp16 y = -42.0;
++
++int
++main (void)
++{
++ if (!f (2, x, y))
++ abort ();
++ return 0;
++}
+diff -Nur a/gcc/testsuite/gcc.target/arm/frame-pointer-1.c b/gcc/testsuite/gcc.target/arm/frame-pointer-1.c
+--- a/gcc/testsuite/gcc.target/arm/frame-pointer-1.c 1970-01-01 01:00:00.000000000 +0100
++++ b/gcc/testsuite/gcc.target/arm/frame-pointer-1.c 2010-01-25 09:50:29.275686903 +0100
+@@ -0,0 +1,42 @@
++/* Check local register variables using a register conventionally
++ used as the frame pointer aren't clobbered under high register pressure. */
++/* { dg-do run } */
++/* { dg-options "-Os -mthumb -fomit-frame-pointer" } */
++
++#include <stdlib.h>
++
++int global=5;
++
++void __attribute__((noinline)) foo(int p1, int p2, int p3, int p4)
++{
++ if (global != 5 || p1 != 1 || p2 != 2 || p3 != 3 || p4 != 4)
++ abort();
++}
++
++int __attribute__((noinline)) test(int a, int b, int c, int d)
++{
++ register unsigned long r __asm__("r7") = 0xdeadbeef;
++ int e;
++
++ /* ABCD are live after the call which should be enough
++ to cause r7 to be used if it weren't for the register variable. */
++ foo(a,b,c,d);
++
++ e = 0;
++ __asm__ __volatile__ ("mov %0, %2"
++ : "=r" (e)
++ : "0" (e), "r" (r));
++
++ global = a+b+c+d;
++
++ return e;
++}
++
++int main()
++{
++ if (test(1, 2, 3, 4) != 0xdeadbeef)
++ abort();
++ if (global != 10)
++ abort();
++ return 0;
++}
+diff -Nur a/gcc/testsuite/gcc.target/arm/janus-2cc-shift-1.c b/gcc/testsuite/gcc.target/arm/janus-2cc-shift-1.c
+--- a/gcc/testsuite/gcc.target/arm/janus-2cc-shift-1.c 1970-01-01 01:00:00.000000000 +0100
++++ b/gcc/testsuite/gcc.target/arm/janus-2cc-shift-1.c 2010-01-25 09:50:29.275686903 +0100
+@@ -0,0 +1,17 @@
++/* Check that a nop is inserted after a shift taking a register operand. */
++/* { dg-do compile } */
++/* { dg-options "-mfix-janus-2cc" } */
++/* { dg-require-effective-target arm_not_thumb } */
++int foo(int x)
++{
++ int y;
++ int z;
++
++ y = x << 4;
++ z = y << x;
++
++ return y+z;
++}
++/* { dg-final { scan-assembler "\tmov\tr\[0-9], r\[0-9], asl r\[0-9]\n\tnop\n" } } */
++/* { dg-final { scan-assembler-not "\tmov\tr\[0-9], r\[0-9], asl #4\n\tnop\n" } } */
++
+diff -Nur a/gcc/testsuite/gcc.target/arm/janus-2cc-shift-2.c b/gcc/testsuite/gcc.target/arm/janus-2cc-shift-2.c
+--- a/gcc/testsuite/gcc.target/arm/janus-2cc-shift-2.c 1970-01-01 01:00:00.000000000 +0100
++++ b/gcc/testsuite/gcc.target/arm/janus-2cc-shift-2.c 2010-01-25 09:50:29.275686903 +0100
+@@ -0,0 +1,17 @@
++/* Check that a nop is inserted after a shift taking a register operand. */
++/* { dg-do compile } */
++/* { dg-options "-mfix-janus-2cc -mthumb" } */
++/* { dg-require-effective-target arm_thumb1_ok } */
++int foo(int x)
++{
++ int y;
++ int z;
++
++ y = x << 4;
++ z = y << x;
++
++ return y+z;
++}
++/* { dg-final { scan-assembler "\tlsl\tr\[0-9], r\[0-9], r\[0-9]\n\tnop\n" } } */
++/* { dg-final { scan-assembler-not "\tlsl\tr\[0-9], r\[0-9], #4\n\tnop\n" } } */
++
+diff -Nur a/gcc/testsuite/gcc.target/arm/mmx-1.c b/gcc/testsuite/gcc.target/arm/mmx-1.c
+--- a/gcc/testsuite/gcc.target/arm/mmx-1.c 2008-09-13 15:26:46.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/mmx-1.c 2010-01-25 09:50:29.275686903 +0100
+@@ -3,10 +3,10 @@
+ /* { dg-do compile } */
+ /* { dg-skip-if "Test is specific to the iWMMXt" { arm*-*-* } { "-mcpu=*" } { "-mcpu=iwmmxt" } } */
+ /* { dg-skip-if "Test is specific to the iWMMXt" { arm*-*-* } { "-mabi=*" } { "-mabi=iwmmxt" } } */
+-/* { dg-skip-if "Test is specific to the iWMMXt" { arm*-*-* } { "-mfloat-abi=softfp" } { "" } } */
+ /* { dg-skip-if "Test is specific to the iWMMXt" { arm*-*-* } { "-march=*" } { "-march=iwmmxt" } } */
+ /* { dg-options "-O -mno-apcs-frame -mcpu=iwmmxt -mabi=iwmmxt" } */
+ /* { dg-require-effective-target arm32 } */
++/* { dg-require-effective-target arm_iwmmxt_ok } */
+ /* { dg-final { scan-assembler "ldmfd\[ ]sp!.*ip,\[ ]*pc" } } */
+
+ /* This function uses all the call-saved registers, namely r4, r5, r6,
+diff -Nur a/gcc/testsuite/gcc.target/arm/naked-3.c b/gcc/testsuite/gcc.target/arm/naked-3.c
+--- a/gcc/testsuite/gcc.target/arm/naked-3.c 1970-01-01 01:00:00.000000000 +0100
++++ b/gcc/testsuite/gcc.target/arm/naked-3.c 2010-01-25 09:50:29.275686903 +0100
+@@ -0,0 +1,15 @@
++/* { dg-do compile } */
++/* { dg-options "-O2 -Wall" } */
++/* Check that we do not get warnings about missing return statements
++ or bogus looking noreturn functions. */
++int __attribute__((naked))
++foo(void)
++{
++ __asm__ volatile ("mov r0, #1\r\nbx lr\n");
++}
++
++int __attribute__((naked,noreturn))
++bar(void)
++{
++ __asm__ volatile ("frob r0\n");
++}
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/polytypes.c b/gcc/testsuite/gcc.target/arm/neon/polytypes.c
+--- a/gcc/testsuite/gcc.target/arm/neon/polytypes.c 2008-07-02 21:35:08.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/polytypes.c 2010-01-25 09:50:29.275686903 +0100
+@@ -3,7 +3,7 @@
+
+ /* { dg-do compile } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-add-options arm_neon } */
+
+ #include <arm_neon.h>
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vabals16.c b/gcc/testsuite/gcc.target/arm/neon/vabals16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vabals16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vabals16.c 2010-01-25 09:50:29.275686903 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vabals32.c b/gcc/testsuite/gcc.target/arm/neon/vabals32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vabals32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vabals32.c 2010-01-25 09:50:29.275686903 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vabals8.c b/gcc/testsuite/gcc.target/arm/neon/vabals8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vabals8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vabals8.c 2010-01-25 09:50:29.275686903 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vabalu16.c b/gcc/testsuite/gcc.target/arm/neon/vabalu16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vabalu16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vabalu16.c 2010-01-25 09:50:29.275686903 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vabalu32.c b/gcc/testsuite/gcc.target/arm/neon/vabalu32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vabalu32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vabalu32.c 2010-01-25 09:50:29.275686903 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vabalu8.c b/gcc/testsuite/gcc.target/arm/neon/vabalu8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vabalu8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vabalu8.c 2010-01-25 09:50:29.275686903 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vabaQs16.c b/gcc/testsuite/gcc.target/arm/neon/vabaQs16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vabaQs16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vabaQs16.c 2010-01-25 09:50:29.275686903 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vabaQs32.c b/gcc/testsuite/gcc.target/arm/neon/vabaQs32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vabaQs32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vabaQs32.c 2010-01-25 09:50:29.275686903 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vabaQs8.c b/gcc/testsuite/gcc.target/arm/neon/vabaQs8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vabaQs8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vabaQs8.c 2010-01-25 09:50:29.275686903 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vabaQu16.c b/gcc/testsuite/gcc.target/arm/neon/vabaQu16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vabaQu16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vabaQu16.c 2010-01-25 09:50:29.275686903 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vabaQu32.c b/gcc/testsuite/gcc.target/arm/neon/vabaQu32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vabaQu32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vabaQu32.c 2010-01-25 09:50:29.275686903 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vabaQu8.c b/gcc/testsuite/gcc.target/arm/neon/vabaQu8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vabaQu8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vabaQu8.c 2010-01-25 09:50:29.275686903 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vabas16.c b/gcc/testsuite/gcc.target/arm/neon/vabas16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vabas16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vabas16.c 2010-01-25 09:50:29.275686903 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vabas32.c b/gcc/testsuite/gcc.target/arm/neon/vabas32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vabas32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vabas32.c 2010-01-25 09:50:29.275686903 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vabas8.c b/gcc/testsuite/gcc.target/arm/neon/vabas8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vabas8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vabas8.c 2010-01-25 09:50:29.275686903 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vabau16.c b/gcc/testsuite/gcc.target/arm/neon/vabau16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vabau16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vabau16.c 2010-01-25 09:50:29.275686903 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vabau32.c b/gcc/testsuite/gcc.target/arm/neon/vabau32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vabau32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vabau32.c 2010-01-25 09:50:29.275686903 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vabau8.c b/gcc/testsuite/gcc.target/arm/neon/vabau8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vabau8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vabau8.c 2010-01-25 09:50:29.275686903 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vabdf32.c b/gcc/testsuite/gcc.target/arm/neon/vabdf32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vabdf32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vabdf32.c 2010-01-25 09:50:29.275686903 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vabdls16.c b/gcc/testsuite/gcc.target/arm/neon/vabdls16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vabdls16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vabdls16.c 2010-01-25 09:50:29.275686903 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vabdls32.c b/gcc/testsuite/gcc.target/arm/neon/vabdls32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vabdls32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vabdls32.c 2010-01-25 09:50:29.275686903 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vabdls8.c b/gcc/testsuite/gcc.target/arm/neon/vabdls8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vabdls8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vabdls8.c 2010-01-25 09:50:29.275686903 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vabdlu16.c b/gcc/testsuite/gcc.target/arm/neon/vabdlu16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vabdlu16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vabdlu16.c 2010-01-25 09:50:29.275686903 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vabdlu32.c b/gcc/testsuite/gcc.target/arm/neon/vabdlu32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vabdlu32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vabdlu32.c 2010-01-25 09:50:29.275686903 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vabdlu8.c b/gcc/testsuite/gcc.target/arm/neon/vabdlu8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vabdlu8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vabdlu8.c 2010-01-25 09:50:29.275686903 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vabdQf32.c b/gcc/testsuite/gcc.target/arm/neon/vabdQf32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vabdQf32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vabdQf32.c 2010-01-25 09:50:29.275686903 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vabdQs16.c b/gcc/testsuite/gcc.target/arm/neon/vabdQs16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vabdQs16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vabdQs16.c 2010-01-25 09:50:29.275686903 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vabdQs32.c b/gcc/testsuite/gcc.target/arm/neon/vabdQs32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vabdQs32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vabdQs32.c 2010-01-25 09:50:29.275686903 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vabdQs8.c b/gcc/testsuite/gcc.target/arm/neon/vabdQs8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vabdQs8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vabdQs8.c 2010-01-25 09:50:29.275686903 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vabdQu16.c b/gcc/testsuite/gcc.target/arm/neon/vabdQu16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vabdQu16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vabdQu16.c 2010-01-25 09:50:29.275686903 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vabdQu32.c b/gcc/testsuite/gcc.target/arm/neon/vabdQu32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vabdQu32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vabdQu32.c 2010-01-25 09:50:29.275686903 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vabdQu8.c b/gcc/testsuite/gcc.target/arm/neon/vabdQu8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vabdQu8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vabdQu8.c 2010-01-25 09:50:29.275686903 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vabds16.c b/gcc/testsuite/gcc.target/arm/neon/vabds16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vabds16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vabds16.c 2010-01-25 09:50:29.275686903 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vabds32.c b/gcc/testsuite/gcc.target/arm/neon/vabds32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vabds32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vabds32.c 2010-01-25 09:50:29.275686903 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vabds8.c b/gcc/testsuite/gcc.target/arm/neon/vabds8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vabds8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vabds8.c 2010-01-25 09:50:29.275686903 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vabdu16.c b/gcc/testsuite/gcc.target/arm/neon/vabdu16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vabdu16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vabdu16.c 2010-01-25 09:50:29.275686903 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vabdu32.c b/gcc/testsuite/gcc.target/arm/neon/vabdu32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vabdu32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vabdu32.c 2010-01-25 09:50:29.275686903 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vabdu8.c b/gcc/testsuite/gcc.target/arm/neon/vabdu8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vabdu8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vabdu8.c 2010-01-25 09:50:29.275686903 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vabsf32.c b/gcc/testsuite/gcc.target/arm/neon/vabsf32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vabsf32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vabsf32.c 2010-01-25 09:50:29.275686903 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vabsQf32.c b/gcc/testsuite/gcc.target/arm/neon/vabsQf32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vabsQf32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vabsQf32.c 2010-01-25 09:50:29.275686903 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vabsQs16.c b/gcc/testsuite/gcc.target/arm/neon/vabsQs16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vabsQs16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vabsQs16.c 2010-01-25 09:50:29.275686903 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vabsQs32.c b/gcc/testsuite/gcc.target/arm/neon/vabsQs32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vabsQs32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vabsQs32.c 2010-01-25 09:50:29.275686903 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vabsQs8.c b/gcc/testsuite/gcc.target/arm/neon/vabsQs8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vabsQs8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vabsQs8.c 2010-01-25 09:50:29.275686903 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vabss16.c b/gcc/testsuite/gcc.target/arm/neon/vabss16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vabss16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vabss16.c 2010-01-25 09:50:29.275686903 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vabss32.c b/gcc/testsuite/gcc.target/arm/neon/vabss32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vabss32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vabss32.c 2010-01-25 09:50:29.275686903 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vabss8.c b/gcc/testsuite/gcc.target/arm/neon/vabss8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vabss8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vabss8.c 2010-01-25 09:50:29.275686903 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vaddf32.c b/gcc/testsuite/gcc.target/arm/neon/vaddf32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vaddf32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vaddf32.c 2010-01-25 09:50:29.275686903 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vaddhns16.c b/gcc/testsuite/gcc.target/arm/neon/vaddhns16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vaddhns16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vaddhns16.c 2010-01-25 09:50:29.275686903 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vaddhns32.c b/gcc/testsuite/gcc.target/arm/neon/vaddhns32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vaddhns32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vaddhns32.c 2010-01-25 09:50:29.275686903 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vaddhns64.c b/gcc/testsuite/gcc.target/arm/neon/vaddhns64.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vaddhns64.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vaddhns64.c 2010-01-25 09:50:29.275686903 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vaddhnu16.c b/gcc/testsuite/gcc.target/arm/neon/vaddhnu16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vaddhnu16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vaddhnu16.c 2010-01-25 09:50:29.275686903 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vaddhnu32.c b/gcc/testsuite/gcc.target/arm/neon/vaddhnu32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vaddhnu32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vaddhnu32.c 2010-01-25 09:50:29.285687196 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vaddhnu64.c b/gcc/testsuite/gcc.target/arm/neon/vaddhnu64.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vaddhnu64.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vaddhnu64.c 2010-01-25 09:50:29.285687196 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vaddls16.c b/gcc/testsuite/gcc.target/arm/neon/vaddls16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vaddls16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vaddls16.c 2010-01-25 09:50:29.285687196 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vaddls32.c b/gcc/testsuite/gcc.target/arm/neon/vaddls32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vaddls32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vaddls32.c 2010-01-25 09:50:29.285687196 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vaddls8.c b/gcc/testsuite/gcc.target/arm/neon/vaddls8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vaddls8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vaddls8.c 2010-01-25 09:50:29.285687196 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vaddlu16.c b/gcc/testsuite/gcc.target/arm/neon/vaddlu16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vaddlu16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vaddlu16.c 2010-01-25 09:50:29.285687196 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vaddlu32.c b/gcc/testsuite/gcc.target/arm/neon/vaddlu32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vaddlu32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vaddlu32.c 2010-01-25 09:50:29.285687196 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vaddlu8.c b/gcc/testsuite/gcc.target/arm/neon/vaddlu8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vaddlu8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vaddlu8.c 2010-01-25 09:50:29.285687196 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vaddQf32.c b/gcc/testsuite/gcc.target/arm/neon/vaddQf32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vaddQf32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vaddQf32.c 2010-01-25 09:50:29.285687196 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vaddQs16.c b/gcc/testsuite/gcc.target/arm/neon/vaddQs16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vaddQs16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vaddQs16.c 2010-01-25 09:50:29.285687196 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vaddQs32.c b/gcc/testsuite/gcc.target/arm/neon/vaddQs32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vaddQs32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vaddQs32.c 2010-01-25 09:50:29.285687196 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vaddQs64.c b/gcc/testsuite/gcc.target/arm/neon/vaddQs64.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vaddQs64.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vaddQs64.c 2010-01-25 09:50:29.285687196 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vaddQs8.c b/gcc/testsuite/gcc.target/arm/neon/vaddQs8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vaddQs8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vaddQs8.c 2010-01-25 09:50:29.285687196 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vaddQu16.c b/gcc/testsuite/gcc.target/arm/neon/vaddQu16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vaddQu16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vaddQu16.c 2010-01-25 09:50:29.285687196 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vaddQu32.c b/gcc/testsuite/gcc.target/arm/neon/vaddQu32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vaddQu32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vaddQu32.c 2010-01-25 09:50:29.285687196 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vaddQu64.c b/gcc/testsuite/gcc.target/arm/neon/vaddQu64.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vaddQu64.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vaddQu64.c 2010-01-25 09:50:29.285687196 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vaddQu8.c b/gcc/testsuite/gcc.target/arm/neon/vaddQu8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vaddQu8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vaddQu8.c 2010-01-25 09:50:29.285687196 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vadds16.c b/gcc/testsuite/gcc.target/arm/neon/vadds16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vadds16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vadds16.c 2010-01-25 09:50:29.285687196 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vadds32.c b/gcc/testsuite/gcc.target/arm/neon/vadds32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vadds32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vadds32.c 2010-01-25 09:50:29.285687196 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vadds64.c b/gcc/testsuite/gcc.target/arm/neon/vadds64.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vadds64.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vadds64.c 2010-01-25 09:50:29.285687196 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vadds8.c b/gcc/testsuite/gcc.target/arm/neon/vadds8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vadds8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vadds8.c 2010-01-25 09:50:29.285687196 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vaddu16.c b/gcc/testsuite/gcc.target/arm/neon/vaddu16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vaddu16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vaddu16.c 2010-01-25 09:50:29.285687196 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vaddu32.c b/gcc/testsuite/gcc.target/arm/neon/vaddu32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vaddu32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vaddu32.c 2010-01-25 09:50:29.285687196 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vaddu64.c b/gcc/testsuite/gcc.target/arm/neon/vaddu64.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vaddu64.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vaddu64.c 2010-01-25 09:50:29.285687196 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vaddu8.c b/gcc/testsuite/gcc.target/arm/neon/vaddu8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vaddu8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vaddu8.c 2010-01-25 09:50:29.285687196 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vaddws16.c b/gcc/testsuite/gcc.target/arm/neon/vaddws16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vaddws16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vaddws16.c 2010-01-25 09:50:29.285687196 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vaddws32.c b/gcc/testsuite/gcc.target/arm/neon/vaddws32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vaddws32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vaddws32.c 2010-01-25 09:50:29.285687196 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vaddws8.c b/gcc/testsuite/gcc.target/arm/neon/vaddws8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vaddws8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vaddws8.c 2010-01-25 09:50:29.285687196 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vaddwu16.c b/gcc/testsuite/gcc.target/arm/neon/vaddwu16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vaddwu16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vaddwu16.c 2010-01-25 09:50:29.285687196 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vaddwu32.c b/gcc/testsuite/gcc.target/arm/neon/vaddwu32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vaddwu32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vaddwu32.c 2010-01-25 09:50:29.285687196 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vaddwu8.c b/gcc/testsuite/gcc.target/arm/neon/vaddwu8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vaddwu8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vaddwu8.c 2010-01-25 09:50:29.285687196 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vandQs16.c b/gcc/testsuite/gcc.target/arm/neon/vandQs16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vandQs16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vandQs16.c 2010-01-25 09:50:29.285687196 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vandQs32.c b/gcc/testsuite/gcc.target/arm/neon/vandQs32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vandQs32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vandQs32.c 2010-01-25 09:50:29.285687196 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vandQs64.c b/gcc/testsuite/gcc.target/arm/neon/vandQs64.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vandQs64.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vandQs64.c 2010-01-25 09:50:29.285687196 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vandQs8.c b/gcc/testsuite/gcc.target/arm/neon/vandQs8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vandQs8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vandQs8.c 2010-01-25 09:50:29.285687196 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vandQu16.c b/gcc/testsuite/gcc.target/arm/neon/vandQu16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vandQu16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vandQu16.c 2010-01-25 09:50:29.285687196 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vandQu32.c b/gcc/testsuite/gcc.target/arm/neon/vandQu32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vandQu32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vandQu32.c 2010-01-25 09:50:29.285687196 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vandQu64.c b/gcc/testsuite/gcc.target/arm/neon/vandQu64.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vandQu64.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vandQu64.c 2010-01-25 09:50:29.285687196 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vandQu8.c b/gcc/testsuite/gcc.target/arm/neon/vandQu8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vandQu8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vandQu8.c 2010-01-25 09:50:29.285687196 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vands16.c b/gcc/testsuite/gcc.target/arm/neon/vands16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vands16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vands16.c 2010-01-25 09:50:29.285687196 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vands32.c b/gcc/testsuite/gcc.target/arm/neon/vands32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vands32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vands32.c 2010-01-25 09:50:29.285687196 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vands64.c b/gcc/testsuite/gcc.target/arm/neon/vands64.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vands64.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vands64.c 2010-01-25 09:50:29.285687196 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vands8.c b/gcc/testsuite/gcc.target/arm/neon/vands8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vands8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vands8.c 2010-01-25 09:50:29.285687196 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vandu16.c b/gcc/testsuite/gcc.target/arm/neon/vandu16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vandu16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vandu16.c 2010-01-25 09:50:29.285687196 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vandu32.c b/gcc/testsuite/gcc.target/arm/neon/vandu32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vandu32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vandu32.c 2010-01-25 09:50:29.285687196 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vandu64.c b/gcc/testsuite/gcc.target/arm/neon/vandu64.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vandu64.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vandu64.c 2010-01-25 09:50:29.285687196 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vandu8.c b/gcc/testsuite/gcc.target/arm/neon/vandu8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vandu8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vandu8.c 2010-01-25 09:50:29.285687196 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vbicQs16.c b/gcc/testsuite/gcc.target/arm/neon/vbicQs16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vbicQs16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vbicQs16.c 2010-01-25 09:50:29.285687196 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vbicQs32.c b/gcc/testsuite/gcc.target/arm/neon/vbicQs32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vbicQs32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vbicQs32.c 2010-01-25 09:50:29.285687196 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vbicQs64.c b/gcc/testsuite/gcc.target/arm/neon/vbicQs64.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vbicQs64.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vbicQs64.c 2010-01-25 09:50:29.285687196 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vbicQs8.c b/gcc/testsuite/gcc.target/arm/neon/vbicQs8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vbicQs8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vbicQs8.c 2010-01-25 09:50:29.285687196 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vbicQu16.c b/gcc/testsuite/gcc.target/arm/neon/vbicQu16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vbicQu16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vbicQu16.c 2010-01-25 09:50:29.285687196 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vbicQu32.c b/gcc/testsuite/gcc.target/arm/neon/vbicQu32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vbicQu32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vbicQu32.c 2010-01-25 09:50:29.285687196 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vbicQu64.c b/gcc/testsuite/gcc.target/arm/neon/vbicQu64.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vbicQu64.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vbicQu64.c 2010-01-25 09:50:29.285687196 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vbicQu8.c b/gcc/testsuite/gcc.target/arm/neon/vbicQu8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vbicQu8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vbicQu8.c 2010-01-25 09:50:29.285687196 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vbics16.c b/gcc/testsuite/gcc.target/arm/neon/vbics16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vbics16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vbics16.c 2010-01-25 09:50:29.285687196 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vbics32.c b/gcc/testsuite/gcc.target/arm/neon/vbics32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vbics32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vbics32.c 2010-01-25 09:50:29.285687196 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vbics64.c b/gcc/testsuite/gcc.target/arm/neon/vbics64.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vbics64.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vbics64.c 2010-01-25 09:50:29.285687196 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vbics8.c b/gcc/testsuite/gcc.target/arm/neon/vbics8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vbics8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vbics8.c 2010-01-25 09:50:29.285687196 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vbicu16.c b/gcc/testsuite/gcc.target/arm/neon/vbicu16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vbicu16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vbicu16.c 2010-01-25 09:50:29.285687196 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vbicu32.c b/gcc/testsuite/gcc.target/arm/neon/vbicu32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vbicu32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vbicu32.c 2010-01-25 09:50:29.285687196 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vbicu64.c b/gcc/testsuite/gcc.target/arm/neon/vbicu64.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vbicu64.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vbicu64.c 2010-01-25 09:50:29.285687196 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vbicu8.c b/gcc/testsuite/gcc.target/arm/neon/vbicu8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vbicu8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vbicu8.c 2010-01-25 09:50:29.285687196 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vbslf32.c b/gcc/testsuite/gcc.target/arm/neon/vbslf32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vbslf32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vbslf32.c 2010-01-25 09:50:29.285687196 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vbslp16.c b/gcc/testsuite/gcc.target/arm/neon/vbslp16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vbslp16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vbslp16.c 2010-01-25 09:50:29.285687196 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vbslp8.c b/gcc/testsuite/gcc.target/arm/neon/vbslp8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vbslp8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vbslp8.c 2010-01-25 09:50:29.285687196 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vbslQf32.c b/gcc/testsuite/gcc.target/arm/neon/vbslQf32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vbslQf32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vbslQf32.c 2010-01-25 09:50:29.295686791 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vbslQp16.c b/gcc/testsuite/gcc.target/arm/neon/vbslQp16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vbslQp16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vbslQp16.c 2010-01-25 09:50:29.295686791 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vbslQp8.c b/gcc/testsuite/gcc.target/arm/neon/vbslQp8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vbslQp8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vbslQp8.c 2010-01-25 09:50:29.295686791 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vbslQs16.c b/gcc/testsuite/gcc.target/arm/neon/vbslQs16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vbslQs16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vbslQs16.c 2010-01-25 09:50:29.295686791 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vbslQs32.c b/gcc/testsuite/gcc.target/arm/neon/vbslQs32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vbslQs32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vbslQs32.c 2010-01-25 09:50:29.295686791 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vbslQs64.c b/gcc/testsuite/gcc.target/arm/neon/vbslQs64.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vbslQs64.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vbslQs64.c 2010-01-25 09:50:29.295686791 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vbslQs8.c b/gcc/testsuite/gcc.target/arm/neon/vbslQs8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vbslQs8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vbslQs8.c 2010-01-25 09:50:29.295686791 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vbslQu16.c b/gcc/testsuite/gcc.target/arm/neon/vbslQu16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vbslQu16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vbslQu16.c 2010-01-25 09:50:29.295686791 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vbslQu32.c b/gcc/testsuite/gcc.target/arm/neon/vbslQu32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vbslQu32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vbslQu32.c 2010-01-25 09:50:29.295686791 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vbslQu64.c b/gcc/testsuite/gcc.target/arm/neon/vbslQu64.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vbslQu64.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vbslQu64.c 2010-01-25 09:50:29.295686791 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vbslQu8.c b/gcc/testsuite/gcc.target/arm/neon/vbslQu8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vbslQu8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vbslQu8.c 2010-01-25 09:50:29.295686791 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vbsls16.c b/gcc/testsuite/gcc.target/arm/neon/vbsls16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vbsls16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vbsls16.c 2010-01-25 09:50:29.295686791 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vbsls32.c b/gcc/testsuite/gcc.target/arm/neon/vbsls32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vbsls32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vbsls32.c 2010-01-25 09:50:29.295686791 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vbsls64.c b/gcc/testsuite/gcc.target/arm/neon/vbsls64.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vbsls64.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vbsls64.c 2010-01-25 09:50:29.295686791 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vbsls8.c b/gcc/testsuite/gcc.target/arm/neon/vbsls8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vbsls8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vbsls8.c 2010-01-25 09:50:29.295686791 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vbslu16.c b/gcc/testsuite/gcc.target/arm/neon/vbslu16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vbslu16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vbslu16.c 2010-01-25 09:50:29.295686791 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vbslu32.c b/gcc/testsuite/gcc.target/arm/neon/vbslu32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vbslu32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vbslu32.c 2010-01-25 09:50:29.295686791 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vbslu64.c b/gcc/testsuite/gcc.target/arm/neon/vbslu64.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vbslu64.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vbslu64.c 2010-01-25 09:50:29.295686791 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vbslu8.c b/gcc/testsuite/gcc.target/arm/neon/vbslu8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vbslu8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vbslu8.c 2010-01-25 09:50:29.295686791 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vcagef32.c b/gcc/testsuite/gcc.target/arm/neon/vcagef32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vcagef32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vcagef32.c 2010-01-25 09:50:29.295686791 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vcageQf32.c b/gcc/testsuite/gcc.target/arm/neon/vcageQf32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vcageQf32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vcageQf32.c 2010-01-25 09:50:29.295686791 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vcagtf32.c b/gcc/testsuite/gcc.target/arm/neon/vcagtf32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vcagtf32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vcagtf32.c 2010-01-25 09:50:29.295686791 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vcagtQf32.c b/gcc/testsuite/gcc.target/arm/neon/vcagtQf32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vcagtQf32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vcagtQf32.c 2010-01-25 09:50:29.295686791 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vcalef32.c b/gcc/testsuite/gcc.target/arm/neon/vcalef32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vcalef32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vcalef32.c 2010-01-25 09:50:29.295686791 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vcaleQf32.c b/gcc/testsuite/gcc.target/arm/neon/vcaleQf32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vcaleQf32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vcaleQf32.c 2010-01-25 09:50:29.295686791 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vcaltf32.c b/gcc/testsuite/gcc.target/arm/neon/vcaltf32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vcaltf32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vcaltf32.c 2010-01-25 09:50:29.295686791 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vcaltQf32.c b/gcc/testsuite/gcc.target/arm/neon/vcaltQf32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vcaltQf32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vcaltQf32.c 2010-01-25 09:50:29.295686791 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vceqf32.c b/gcc/testsuite/gcc.target/arm/neon/vceqf32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vceqf32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vceqf32.c 2010-01-25 09:50:29.305687083 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vceqp8.c b/gcc/testsuite/gcc.target/arm/neon/vceqp8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vceqp8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vceqp8.c 2010-01-25 09:50:29.305687083 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vceqQf32.c b/gcc/testsuite/gcc.target/arm/neon/vceqQf32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vceqQf32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vceqQf32.c 2010-01-25 09:50:29.305687083 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vceqQp8.c b/gcc/testsuite/gcc.target/arm/neon/vceqQp8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vceqQp8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vceqQp8.c 2010-01-25 09:50:29.305687083 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vceqQs16.c b/gcc/testsuite/gcc.target/arm/neon/vceqQs16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vceqQs16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vceqQs16.c 2010-01-25 09:50:29.305687083 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vceqQs32.c b/gcc/testsuite/gcc.target/arm/neon/vceqQs32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vceqQs32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vceqQs32.c 2010-01-25 09:50:29.305687083 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vceqQs8.c b/gcc/testsuite/gcc.target/arm/neon/vceqQs8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vceqQs8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vceqQs8.c 2010-01-25 09:50:29.305687083 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vceqQu16.c b/gcc/testsuite/gcc.target/arm/neon/vceqQu16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vceqQu16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vceqQu16.c 2010-01-25 09:50:29.305687083 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vceqQu32.c b/gcc/testsuite/gcc.target/arm/neon/vceqQu32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vceqQu32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vceqQu32.c 2010-01-25 09:50:29.305687083 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vceqQu8.c b/gcc/testsuite/gcc.target/arm/neon/vceqQu8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vceqQu8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vceqQu8.c 2010-01-25 09:50:29.305687083 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vceqs16.c b/gcc/testsuite/gcc.target/arm/neon/vceqs16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vceqs16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vceqs16.c 2010-01-25 09:50:29.305687083 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vceqs32.c b/gcc/testsuite/gcc.target/arm/neon/vceqs32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vceqs32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vceqs32.c 2010-01-25 09:50:29.305687083 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vceqs8.c b/gcc/testsuite/gcc.target/arm/neon/vceqs8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vceqs8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vceqs8.c 2010-01-25 09:50:29.305687083 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vcequ16.c b/gcc/testsuite/gcc.target/arm/neon/vcequ16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vcequ16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vcequ16.c 2010-01-25 09:50:29.305687083 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vcequ32.c b/gcc/testsuite/gcc.target/arm/neon/vcequ32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vcequ32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vcequ32.c 2010-01-25 09:50:29.305687083 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vcequ8.c b/gcc/testsuite/gcc.target/arm/neon/vcequ8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vcequ8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vcequ8.c 2010-01-25 09:50:29.305687083 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vcgef32.c b/gcc/testsuite/gcc.target/arm/neon/vcgef32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vcgef32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vcgef32.c 2010-01-25 09:50:29.305687083 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vcgeQf32.c b/gcc/testsuite/gcc.target/arm/neon/vcgeQf32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vcgeQf32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vcgeQf32.c 2010-01-25 09:50:29.315687027 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vcgeQs16.c b/gcc/testsuite/gcc.target/arm/neon/vcgeQs16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vcgeQs16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vcgeQs16.c 2010-01-25 09:50:29.315687027 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vcgeQs32.c b/gcc/testsuite/gcc.target/arm/neon/vcgeQs32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vcgeQs32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vcgeQs32.c 2010-01-25 09:50:29.315687027 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vcgeQs8.c b/gcc/testsuite/gcc.target/arm/neon/vcgeQs8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vcgeQs8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vcgeQs8.c 2010-01-25 09:50:29.315687027 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vcgeQu16.c b/gcc/testsuite/gcc.target/arm/neon/vcgeQu16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vcgeQu16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vcgeQu16.c 2010-01-25 09:50:29.315687027 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vcgeQu32.c b/gcc/testsuite/gcc.target/arm/neon/vcgeQu32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vcgeQu32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vcgeQu32.c 2010-01-25 09:50:29.315687027 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vcgeQu8.c b/gcc/testsuite/gcc.target/arm/neon/vcgeQu8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vcgeQu8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vcgeQu8.c 2010-01-25 09:50:29.315687027 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vcges16.c b/gcc/testsuite/gcc.target/arm/neon/vcges16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vcges16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vcges16.c 2010-01-25 09:50:29.315687027 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vcges32.c b/gcc/testsuite/gcc.target/arm/neon/vcges32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vcges32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vcges32.c 2010-01-25 09:50:29.315687027 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vcges8.c b/gcc/testsuite/gcc.target/arm/neon/vcges8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vcges8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vcges8.c 2010-01-25 09:50:29.315687027 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vcgeu16.c b/gcc/testsuite/gcc.target/arm/neon/vcgeu16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vcgeu16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vcgeu16.c 2010-01-25 09:50:29.315687027 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vcgeu32.c b/gcc/testsuite/gcc.target/arm/neon/vcgeu32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vcgeu32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vcgeu32.c 2010-01-25 09:50:29.315687027 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vcgeu8.c b/gcc/testsuite/gcc.target/arm/neon/vcgeu8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vcgeu8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vcgeu8.c 2010-01-25 09:50:29.315687027 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vcgtf32.c b/gcc/testsuite/gcc.target/arm/neon/vcgtf32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vcgtf32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vcgtf32.c 2010-01-25 09:50:29.315687027 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vcgtQf32.c b/gcc/testsuite/gcc.target/arm/neon/vcgtQf32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vcgtQf32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vcgtQf32.c 2010-01-25 09:50:29.315687027 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vcgtQs16.c b/gcc/testsuite/gcc.target/arm/neon/vcgtQs16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vcgtQs16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vcgtQs16.c 2010-01-25 09:50:29.315687027 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vcgtQs32.c b/gcc/testsuite/gcc.target/arm/neon/vcgtQs32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vcgtQs32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vcgtQs32.c 2010-01-25 09:50:29.315687027 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vcgtQs8.c b/gcc/testsuite/gcc.target/arm/neon/vcgtQs8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vcgtQs8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vcgtQs8.c 2010-01-25 09:50:29.315687027 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vcgtQu16.c b/gcc/testsuite/gcc.target/arm/neon/vcgtQu16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vcgtQu16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vcgtQu16.c 2010-01-25 09:50:29.315687027 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vcgtQu32.c b/gcc/testsuite/gcc.target/arm/neon/vcgtQu32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vcgtQu32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vcgtQu32.c 2010-01-25 09:50:29.315687027 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vcgtQu8.c b/gcc/testsuite/gcc.target/arm/neon/vcgtQu8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vcgtQu8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vcgtQu8.c 2010-01-25 09:50:29.315687027 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vcgts16.c b/gcc/testsuite/gcc.target/arm/neon/vcgts16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vcgts16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vcgts16.c 2010-01-25 09:50:29.315687027 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vcgts32.c b/gcc/testsuite/gcc.target/arm/neon/vcgts32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vcgts32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vcgts32.c 2010-01-25 09:50:29.315687027 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vcgts8.c b/gcc/testsuite/gcc.target/arm/neon/vcgts8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vcgts8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vcgts8.c 2010-01-25 09:50:29.315687027 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vcgtu16.c b/gcc/testsuite/gcc.target/arm/neon/vcgtu16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vcgtu16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vcgtu16.c 2010-01-25 09:50:29.315687027 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vcgtu32.c b/gcc/testsuite/gcc.target/arm/neon/vcgtu32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vcgtu32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vcgtu32.c 2010-01-25 09:50:29.315687027 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vcgtu8.c b/gcc/testsuite/gcc.target/arm/neon/vcgtu8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vcgtu8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vcgtu8.c 2010-01-25 09:50:29.315687027 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vclef32.c b/gcc/testsuite/gcc.target/arm/neon/vclef32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vclef32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vclef32.c 2010-01-25 09:50:29.315687027 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vcleQf32.c b/gcc/testsuite/gcc.target/arm/neon/vcleQf32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vcleQf32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vcleQf32.c 2010-01-25 09:50:29.315687027 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vcleQs16.c b/gcc/testsuite/gcc.target/arm/neon/vcleQs16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vcleQs16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vcleQs16.c 2010-01-25 09:50:29.315687027 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vcleQs32.c b/gcc/testsuite/gcc.target/arm/neon/vcleQs32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vcleQs32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vcleQs32.c 2010-01-25 09:50:29.315687027 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vcleQs8.c b/gcc/testsuite/gcc.target/arm/neon/vcleQs8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vcleQs8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vcleQs8.c 2010-01-25 09:50:29.315687027 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vcleQu16.c b/gcc/testsuite/gcc.target/arm/neon/vcleQu16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vcleQu16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vcleQu16.c 2010-01-25 09:50:29.315687027 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vcleQu32.c b/gcc/testsuite/gcc.target/arm/neon/vcleQu32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vcleQu32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vcleQu32.c 2010-01-25 09:50:29.315687027 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vcleQu8.c b/gcc/testsuite/gcc.target/arm/neon/vcleQu8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vcleQu8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vcleQu8.c 2010-01-25 09:50:29.315687027 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vcles16.c b/gcc/testsuite/gcc.target/arm/neon/vcles16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vcles16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vcles16.c 2010-01-25 09:50:29.315687027 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vcles32.c b/gcc/testsuite/gcc.target/arm/neon/vcles32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vcles32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vcles32.c 2010-01-25 09:50:29.315687027 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vcles8.c b/gcc/testsuite/gcc.target/arm/neon/vcles8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vcles8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vcles8.c 2010-01-25 09:50:29.315687027 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vcleu16.c b/gcc/testsuite/gcc.target/arm/neon/vcleu16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vcleu16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vcleu16.c 2010-01-25 09:50:29.315687027 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vcleu32.c b/gcc/testsuite/gcc.target/arm/neon/vcleu32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vcleu32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vcleu32.c 2010-01-25 09:50:29.315687027 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vcleu8.c b/gcc/testsuite/gcc.target/arm/neon/vcleu8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vcleu8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vcleu8.c 2010-01-25 09:50:29.315687027 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vclsQs16.c b/gcc/testsuite/gcc.target/arm/neon/vclsQs16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vclsQs16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vclsQs16.c 2010-01-25 09:50:29.315687027 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vclsQs32.c b/gcc/testsuite/gcc.target/arm/neon/vclsQs32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vclsQs32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vclsQs32.c 2010-01-25 09:50:29.315687027 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vclsQs8.c b/gcc/testsuite/gcc.target/arm/neon/vclsQs8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vclsQs8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vclsQs8.c 2010-01-25 09:50:29.315687027 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vclss16.c b/gcc/testsuite/gcc.target/arm/neon/vclss16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vclss16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vclss16.c 2010-01-25 09:50:29.315687027 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vclss32.c b/gcc/testsuite/gcc.target/arm/neon/vclss32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vclss32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vclss32.c 2010-01-25 09:50:29.315687027 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vclss8.c b/gcc/testsuite/gcc.target/arm/neon/vclss8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vclss8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vclss8.c 2010-01-25 09:50:29.315687027 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vcltf32.c b/gcc/testsuite/gcc.target/arm/neon/vcltf32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vcltf32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vcltf32.c 2010-01-25 09:50:29.315687027 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vcltQf32.c b/gcc/testsuite/gcc.target/arm/neon/vcltQf32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vcltQf32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vcltQf32.c 2010-01-25 09:50:29.315687027 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vcltQs16.c b/gcc/testsuite/gcc.target/arm/neon/vcltQs16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vcltQs16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vcltQs16.c 2010-01-25 09:50:29.315687027 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vcltQs32.c b/gcc/testsuite/gcc.target/arm/neon/vcltQs32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vcltQs32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vcltQs32.c 2010-01-25 09:50:29.315687027 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vcltQs8.c b/gcc/testsuite/gcc.target/arm/neon/vcltQs8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vcltQs8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vcltQs8.c 2010-01-25 09:50:29.335686357 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vcltQu16.c b/gcc/testsuite/gcc.target/arm/neon/vcltQu16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vcltQu16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vcltQu16.c 2010-01-25 09:50:29.335686357 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vcltQu32.c b/gcc/testsuite/gcc.target/arm/neon/vcltQu32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vcltQu32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vcltQu32.c 2010-01-25 09:50:29.335686357 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vcltQu8.c b/gcc/testsuite/gcc.target/arm/neon/vcltQu8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vcltQu8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vcltQu8.c 2010-01-25 09:50:29.335686357 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vclts16.c b/gcc/testsuite/gcc.target/arm/neon/vclts16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vclts16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vclts16.c 2010-01-25 09:50:29.335686357 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vclts32.c b/gcc/testsuite/gcc.target/arm/neon/vclts32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vclts32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vclts32.c 2010-01-25 09:50:29.335686357 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vclts8.c b/gcc/testsuite/gcc.target/arm/neon/vclts8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vclts8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vclts8.c 2010-01-25 09:50:29.335686357 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vcltu16.c b/gcc/testsuite/gcc.target/arm/neon/vcltu16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vcltu16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vcltu16.c 2010-01-25 09:50:29.335686357 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vcltu32.c b/gcc/testsuite/gcc.target/arm/neon/vcltu32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vcltu32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vcltu32.c 2010-01-25 09:50:29.335686357 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vcltu8.c b/gcc/testsuite/gcc.target/arm/neon/vcltu8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vcltu8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vcltu8.c 2010-01-25 09:50:29.335686357 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vclzQs16.c b/gcc/testsuite/gcc.target/arm/neon/vclzQs16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vclzQs16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vclzQs16.c 2010-01-25 09:50:29.335686357 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vclzQs32.c b/gcc/testsuite/gcc.target/arm/neon/vclzQs32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vclzQs32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vclzQs32.c 2010-01-25 09:50:29.335686357 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vclzQs8.c b/gcc/testsuite/gcc.target/arm/neon/vclzQs8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vclzQs8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vclzQs8.c 2010-01-25 09:50:29.335686357 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vclzQu16.c b/gcc/testsuite/gcc.target/arm/neon/vclzQu16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vclzQu16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vclzQu16.c 2010-01-25 09:50:29.335686357 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vclzQu32.c b/gcc/testsuite/gcc.target/arm/neon/vclzQu32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vclzQu32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vclzQu32.c 2010-01-25 09:50:29.335686357 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vclzQu8.c b/gcc/testsuite/gcc.target/arm/neon/vclzQu8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vclzQu8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vclzQu8.c 2010-01-25 09:50:29.335686357 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vclzs16.c b/gcc/testsuite/gcc.target/arm/neon/vclzs16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vclzs16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vclzs16.c 2010-01-25 09:50:29.335686357 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vclzs32.c b/gcc/testsuite/gcc.target/arm/neon/vclzs32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vclzs32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vclzs32.c 2010-01-25 09:50:29.335686357 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vclzs8.c b/gcc/testsuite/gcc.target/arm/neon/vclzs8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vclzs8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vclzs8.c 2010-01-25 09:50:29.335686357 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vclzu16.c b/gcc/testsuite/gcc.target/arm/neon/vclzu16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vclzu16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vclzu16.c 2010-01-25 09:50:29.335686357 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vclzu32.c b/gcc/testsuite/gcc.target/arm/neon/vclzu32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vclzu32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vclzu32.c 2010-01-25 09:50:29.335686357 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vclzu8.c b/gcc/testsuite/gcc.target/arm/neon/vclzu8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vclzu8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vclzu8.c 2010-01-25 09:50:29.335686357 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vcntp8.c b/gcc/testsuite/gcc.target/arm/neon/vcntp8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vcntp8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vcntp8.c 2010-01-25 09:50:29.335686357 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vcntQp8.c b/gcc/testsuite/gcc.target/arm/neon/vcntQp8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vcntQp8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vcntQp8.c 2010-01-25 09:50:29.335686357 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vcntQs8.c b/gcc/testsuite/gcc.target/arm/neon/vcntQs8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vcntQs8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vcntQs8.c 2010-01-25 09:50:29.345686441 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vcntQu8.c b/gcc/testsuite/gcc.target/arm/neon/vcntQu8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vcntQu8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vcntQu8.c 2010-01-25 09:50:29.345686441 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vcnts8.c b/gcc/testsuite/gcc.target/arm/neon/vcnts8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vcnts8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vcnts8.c 2010-01-25 09:50:29.345686441 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vcntu8.c b/gcc/testsuite/gcc.target/arm/neon/vcntu8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vcntu8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vcntu8.c 2010-01-25 09:50:29.345686441 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vcombinef32.c b/gcc/testsuite/gcc.target/arm/neon/vcombinef32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vcombinef32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vcombinef32.c 2010-01-25 09:50:29.345686441 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vcombinep16.c b/gcc/testsuite/gcc.target/arm/neon/vcombinep16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vcombinep16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vcombinep16.c 2010-01-25 09:50:29.345686441 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vcombinep8.c b/gcc/testsuite/gcc.target/arm/neon/vcombinep8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vcombinep8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vcombinep8.c 2010-01-25 09:50:29.345686441 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vcombines16.c b/gcc/testsuite/gcc.target/arm/neon/vcombines16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vcombines16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vcombines16.c 2010-01-25 09:50:29.345686441 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vcombines32.c b/gcc/testsuite/gcc.target/arm/neon/vcombines32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vcombines32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vcombines32.c 2010-01-25 09:50:29.345686441 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vcombines64.c b/gcc/testsuite/gcc.target/arm/neon/vcombines64.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vcombines64.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vcombines64.c 2010-01-25 09:50:29.345686441 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vcombines8.c b/gcc/testsuite/gcc.target/arm/neon/vcombines8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vcombines8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vcombines8.c 2010-01-25 09:50:29.345686441 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vcombineu16.c b/gcc/testsuite/gcc.target/arm/neon/vcombineu16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vcombineu16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vcombineu16.c 2010-01-25 09:50:29.345686441 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vcombineu32.c b/gcc/testsuite/gcc.target/arm/neon/vcombineu32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vcombineu32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vcombineu32.c 2010-01-25 09:50:29.345686441 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vcombineu64.c b/gcc/testsuite/gcc.target/arm/neon/vcombineu64.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vcombineu64.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vcombineu64.c 2010-01-25 09:50:29.345686441 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vcombineu8.c b/gcc/testsuite/gcc.target/arm/neon/vcombineu8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vcombineu8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vcombineu8.c 2010-01-25 09:50:29.345686441 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vcreatef32.c b/gcc/testsuite/gcc.target/arm/neon/vcreatef32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vcreatef32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vcreatef32.c 2010-01-25 09:50:29.345686441 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vcreatep16.c b/gcc/testsuite/gcc.target/arm/neon/vcreatep16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vcreatep16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vcreatep16.c 2010-01-25 09:50:29.345686441 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vcreatep8.c b/gcc/testsuite/gcc.target/arm/neon/vcreatep8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vcreatep8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vcreatep8.c 2010-01-25 09:50:29.345686441 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vcreates16.c b/gcc/testsuite/gcc.target/arm/neon/vcreates16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vcreates16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vcreates16.c 2010-01-25 09:50:29.345686441 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vcreates32.c b/gcc/testsuite/gcc.target/arm/neon/vcreates32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vcreates32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vcreates32.c 2010-01-25 09:50:29.345686441 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vcreates64.c b/gcc/testsuite/gcc.target/arm/neon/vcreates64.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vcreates64.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vcreates64.c 2010-01-25 09:50:29.345686441 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vcreates8.c b/gcc/testsuite/gcc.target/arm/neon/vcreates8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vcreates8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vcreates8.c 2010-01-25 09:50:29.345686441 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vcreateu16.c b/gcc/testsuite/gcc.target/arm/neon/vcreateu16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vcreateu16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vcreateu16.c 2010-01-25 09:50:29.345686441 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vcreateu32.c b/gcc/testsuite/gcc.target/arm/neon/vcreateu32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vcreateu32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vcreateu32.c 2010-01-25 09:50:29.345686441 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vcreateu64.c b/gcc/testsuite/gcc.target/arm/neon/vcreateu64.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vcreateu64.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vcreateu64.c 2010-01-25 09:50:29.345686441 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vcreateu8.c b/gcc/testsuite/gcc.target/arm/neon/vcreateu8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vcreateu8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vcreateu8.c 2010-01-25 09:50:29.345686441 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vcvtf32_s32.c b/gcc/testsuite/gcc.target/arm/neon/vcvtf32_s32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vcvtf32_s32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vcvtf32_s32.c 2010-01-25 09:50:29.345686441 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vcvtf32_u32.c b/gcc/testsuite/gcc.target/arm/neon/vcvtf32_u32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vcvtf32_u32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vcvtf32_u32.c 2010-01-25 09:50:29.345686441 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vcvt_nf32_s32.c b/gcc/testsuite/gcc.target/arm/neon/vcvt_nf32_s32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vcvt_nf32_s32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vcvt_nf32_s32.c 2010-01-25 09:50:29.345686441 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vcvt_nf32_u32.c b/gcc/testsuite/gcc.target/arm/neon/vcvt_nf32_u32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vcvt_nf32_u32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vcvt_nf32_u32.c 2010-01-25 09:50:29.345686441 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vcvt_ns32_f32.c b/gcc/testsuite/gcc.target/arm/neon/vcvt_ns32_f32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vcvt_ns32_f32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vcvt_ns32_f32.c 2010-01-25 09:50:29.345686441 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vcvt_nu32_f32.c b/gcc/testsuite/gcc.target/arm/neon/vcvt_nu32_f32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vcvt_nu32_f32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vcvt_nu32_f32.c 2010-01-25 09:50:29.345686441 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vcvtQf32_s32.c b/gcc/testsuite/gcc.target/arm/neon/vcvtQf32_s32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vcvtQf32_s32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vcvtQf32_s32.c 2010-01-25 09:50:29.345686441 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vcvtQf32_u32.c b/gcc/testsuite/gcc.target/arm/neon/vcvtQf32_u32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vcvtQf32_u32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vcvtQf32_u32.c 2010-01-25 09:50:29.345686441 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vcvtQ_nf32_s32.c b/gcc/testsuite/gcc.target/arm/neon/vcvtQ_nf32_s32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vcvtQ_nf32_s32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vcvtQ_nf32_s32.c 2010-01-25 09:50:29.345686441 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vcvtQ_nf32_u32.c b/gcc/testsuite/gcc.target/arm/neon/vcvtQ_nf32_u32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vcvtQ_nf32_u32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vcvtQ_nf32_u32.c 2010-01-25 09:50:29.345686441 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vcvtQ_ns32_f32.c b/gcc/testsuite/gcc.target/arm/neon/vcvtQ_ns32_f32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vcvtQ_ns32_f32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vcvtQ_ns32_f32.c 2010-01-25 09:50:29.345686441 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vcvtQ_nu32_f32.c b/gcc/testsuite/gcc.target/arm/neon/vcvtQ_nu32_f32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vcvtQ_nu32_f32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vcvtQ_nu32_f32.c 2010-01-25 09:50:29.345686441 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vcvtQs32_f32.c b/gcc/testsuite/gcc.target/arm/neon/vcvtQs32_f32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vcvtQs32_f32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vcvtQs32_f32.c 2010-01-25 09:50:29.345686441 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vcvtQu32_f32.c b/gcc/testsuite/gcc.target/arm/neon/vcvtQu32_f32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vcvtQu32_f32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vcvtQu32_f32.c 2010-01-25 09:50:29.345686441 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vcvts32_f32.c b/gcc/testsuite/gcc.target/arm/neon/vcvts32_f32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vcvts32_f32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vcvts32_f32.c 2010-01-25 09:50:29.345686441 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vcvtu32_f32.c b/gcc/testsuite/gcc.target/arm/neon/vcvtu32_f32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vcvtu32_f32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vcvtu32_f32.c 2010-01-25 09:50:29.345686441 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vdup_lanef32.c b/gcc/testsuite/gcc.target/arm/neon/vdup_lanef32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vdup_lanef32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vdup_lanef32.c 2010-01-25 09:50:29.345686441 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vdup_lanep16.c b/gcc/testsuite/gcc.target/arm/neon/vdup_lanep16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vdup_lanep16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vdup_lanep16.c 2010-01-25 09:50:29.345686441 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vdup_lanep8.c b/gcc/testsuite/gcc.target/arm/neon/vdup_lanep8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vdup_lanep8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vdup_lanep8.c 2010-01-25 09:50:29.345686441 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vdup_lanes16.c b/gcc/testsuite/gcc.target/arm/neon/vdup_lanes16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vdup_lanes16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vdup_lanes16.c 2010-01-25 09:50:29.345686441 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vdup_lanes32.c b/gcc/testsuite/gcc.target/arm/neon/vdup_lanes32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vdup_lanes32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vdup_lanes32.c 2010-01-25 09:50:29.345686441 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vdup_lanes64.c b/gcc/testsuite/gcc.target/arm/neon/vdup_lanes64.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vdup_lanes64.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vdup_lanes64.c 2010-01-25 09:50:29.345686441 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vdup_lanes8.c b/gcc/testsuite/gcc.target/arm/neon/vdup_lanes8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vdup_lanes8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vdup_lanes8.c 2010-01-25 09:50:29.345686441 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vdup_laneu16.c b/gcc/testsuite/gcc.target/arm/neon/vdup_laneu16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vdup_laneu16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vdup_laneu16.c 2010-01-25 09:50:29.345686441 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vdup_laneu32.c b/gcc/testsuite/gcc.target/arm/neon/vdup_laneu32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vdup_laneu32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vdup_laneu32.c 2010-01-25 09:50:29.345686441 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vdup_laneu64.c b/gcc/testsuite/gcc.target/arm/neon/vdup_laneu64.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vdup_laneu64.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vdup_laneu64.c 2010-01-25 09:50:29.345686441 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vdup_laneu8.c b/gcc/testsuite/gcc.target/arm/neon/vdup_laneu8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vdup_laneu8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vdup_laneu8.c 2010-01-25 09:50:29.345686441 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vdup_nf32.c b/gcc/testsuite/gcc.target/arm/neon/vdup_nf32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vdup_nf32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vdup_nf32.c 2010-01-25 09:50:29.345686441 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vdup_np16.c b/gcc/testsuite/gcc.target/arm/neon/vdup_np16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vdup_np16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vdup_np16.c 2010-01-25 09:50:29.345686441 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vdup_np8.c b/gcc/testsuite/gcc.target/arm/neon/vdup_np8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vdup_np8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vdup_np8.c 2010-01-25 09:50:29.345686441 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vdup_ns16.c b/gcc/testsuite/gcc.target/arm/neon/vdup_ns16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vdup_ns16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vdup_ns16.c 2010-01-25 09:50:29.345686441 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vdup_ns32.c b/gcc/testsuite/gcc.target/arm/neon/vdup_ns32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vdup_ns32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vdup_ns32.c 2010-01-25 09:50:29.345686441 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vdup_ns64.c b/gcc/testsuite/gcc.target/arm/neon/vdup_ns64.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vdup_ns64.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vdup_ns64.c 2010-01-25 09:50:29.345686441 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vdup_ns8.c b/gcc/testsuite/gcc.target/arm/neon/vdup_ns8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vdup_ns8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vdup_ns8.c 2010-01-25 09:50:29.345686441 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vdup_nu16.c b/gcc/testsuite/gcc.target/arm/neon/vdup_nu16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vdup_nu16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vdup_nu16.c 2010-01-25 09:50:29.345686441 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vdup_nu32.c b/gcc/testsuite/gcc.target/arm/neon/vdup_nu32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vdup_nu32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vdup_nu32.c 2010-01-25 09:50:29.345686441 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vdup_nu64.c b/gcc/testsuite/gcc.target/arm/neon/vdup_nu64.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vdup_nu64.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vdup_nu64.c 2010-01-25 09:50:29.345686441 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vdup_nu8.c b/gcc/testsuite/gcc.target/arm/neon/vdup_nu8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vdup_nu8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vdup_nu8.c 2010-01-25 09:50:29.345686441 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vdupQ_lanef32.c b/gcc/testsuite/gcc.target/arm/neon/vdupQ_lanef32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vdupQ_lanef32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vdupQ_lanef32.c 2010-01-25 09:50:29.345686441 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vdupQ_lanep16.c b/gcc/testsuite/gcc.target/arm/neon/vdupQ_lanep16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vdupQ_lanep16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vdupQ_lanep16.c 2010-01-25 09:50:29.345686441 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vdupQ_lanep8.c b/gcc/testsuite/gcc.target/arm/neon/vdupQ_lanep8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vdupQ_lanep8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vdupQ_lanep8.c 2010-01-25 09:50:29.345686441 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vdupQ_lanes16.c b/gcc/testsuite/gcc.target/arm/neon/vdupQ_lanes16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vdupQ_lanes16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vdupQ_lanes16.c 2010-01-25 09:50:29.345686441 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vdupQ_lanes32.c b/gcc/testsuite/gcc.target/arm/neon/vdupQ_lanes32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vdupQ_lanes32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vdupQ_lanes32.c 2010-01-25 09:50:29.345686441 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vdupQ_lanes64.c b/gcc/testsuite/gcc.target/arm/neon/vdupQ_lanes64.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vdupQ_lanes64.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vdupQ_lanes64.c 2010-01-25 09:50:29.345686441 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vdupQ_lanes8.c b/gcc/testsuite/gcc.target/arm/neon/vdupQ_lanes8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vdupQ_lanes8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vdupQ_lanes8.c 2010-01-25 09:50:29.345686441 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vdupQ_laneu16.c b/gcc/testsuite/gcc.target/arm/neon/vdupQ_laneu16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vdupQ_laneu16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vdupQ_laneu16.c 2010-01-25 09:50:29.345686441 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vdupQ_laneu32.c b/gcc/testsuite/gcc.target/arm/neon/vdupQ_laneu32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vdupQ_laneu32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vdupQ_laneu32.c 2010-01-25 09:50:29.345686441 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vdupQ_laneu64.c b/gcc/testsuite/gcc.target/arm/neon/vdupQ_laneu64.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vdupQ_laneu64.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vdupQ_laneu64.c 2010-01-25 09:50:29.355686315 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vdupQ_laneu8.c b/gcc/testsuite/gcc.target/arm/neon/vdupQ_laneu8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vdupQ_laneu8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vdupQ_laneu8.c 2010-01-25 09:50:29.355686315 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vdupQ_nf32.c b/gcc/testsuite/gcc.target/arm/neon/vdupQ_nf32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vdupQ_nf32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vdupQ_nf32.c 2010-01-25 09:50:29.355686315 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vdupQ_np16.c b/gcc/testsuite/gcc.target/arm/neon/vdupQ_np16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vdupQ_np16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vdupQ_np16.c 2010-01-25 09:50:29.355686315 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vdupQ_np8.c b/gcc/testsuite/gcc.target/arm/neon/vdupQ_np8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vdupQ_np8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vdupQ_np8.c 2010-01-25 09:50:29.355686315 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vdupQ_ns16.c b/gcc/testsuite/gcc.target/arm/neon/vdupQ_ns16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vdupQ_ns16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vdupQ_ns16.c 2010-01-25 09:50:29.355686315 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vdupQ_ns32.c b/gcc/testsuite/gcc.target/arm/neon/vdupQ_ns32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vdupQ_ns32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vdupQ_ns32.c 2010-01-25 09:50:29.355686315 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vdupQ_ns64.c b/gcc/testsuite/gcc.target/arm/neon/vdupQ_ns64.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vdupQ_ns64.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vdupQ_ns64.c 2010-01-25 09:50:29.355686315 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vdupQ_ns8.c b/gcc/testsuite/gcc.target/arm/neon/vdupQ_ns8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vdupQ_ns8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vdupQ_ns8.c 2010-01-25 09:50:29.355686315 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vdupQ_nu16.c b/gcc/testsuite/gcc.target/arm/neon/vdupQ_nu16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vdupQ_nu16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vdupQ_nu16.c 2010-01-25 09:50:29.355686315 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vdupQ_nu32.c b/gcc/testsuite/gcc.target/arm/neon/vdupQ_nu32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vdupQ_nu32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vdupQ_nu32.c 2010-01-25 09:50:29.355686315 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vdupQ_nu64.c b/gcc/testsuite/gcc.target/arm/neon/vdupQ_nu64.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vdupQ_nu64.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vdupQ_nu64.c 2010-01-25 09:50:29.355686315 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vdupQ_nu8.c b/gcc/testsuite/gcc.target/arm/neon/vdupQ_nu8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vdupQ_nu8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vdupQ_nu8.c 2010-01-25 09:50:29.355686315 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/veorQs16.c b/gcc/testsuite/gcc.target/arm/neon/veorQs16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/veorQs16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/veorQs16.c 2010-01-25 09:50:29.355686315 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/veorQs32.c b/gcc/testsuite/gcc.target/arm/neon/veorQs32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/veorQs32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/veorQs32.c 2010-01-25 09:50:29.355686315 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/veorQs64.c b/gcc/testsuite/gcc.target/arm/neon/veorQs64.c
+--- a/gcc/testsuite/gcc.target/arm/neon/veorQs64.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/veorQs64.c 2010-01-25 09:50:29.355686315 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/veorQs8.c b/gcc/testsuite/gcc.target/arm/neon/veorQs8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/veorQs8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/veorQs8.c 2010-01-25 09:50:29.355686315 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/veorQu16.c b/gcc/testsuite/gcc.target/arm/neon/veorQu16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/veorQu16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/veorQu16.c 2010-01-25 09:50:29.355686315 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/veorQu32.c b/gcc/testsuite/gcc.target/arm/neon/veorQu32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/veorQu32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/veorQu32.c 2010-01-25 09:50:29.355686315 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/veorQu64.c b/gcc/testsuite/gcc.target/arm/neon/veorQu64.c
+--- a/gcc/testsuite/gcc.target/arm/neon/veorQu64.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/veorQu64.c 2010-01-25 09:50:29.355686315 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/veorQu8.c b/gcc/testsuite/gcc.target/arm/neon/veorQu8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/veorQu8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/veorQu8.c 2010-01-25 09:50:29.355686315 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/veors16.c b/gcc/testsuite/gcc.target/arm/neon/veors16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/veors16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/veors16.c 2010-01-25 09:50:29.355686315 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/veors32.c b/gcc/testsuite/gcc.target/arm/neon/veors32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/veors32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/veors32.c 2010-01-25 09:50:29.355686315 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/veors64.c b/gcc/testsuite/gcc.target/arm/neon/veors64.c
+--- a/gcc/testsuite/gcc.target/arm/neon/veors64.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/veors64.c 2010-01-25 09:50:29.355686315 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/veors8.c b/gcc/testsuite/gcc.target/arm/neon/veors8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/veors8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/veors8.c 2010-01-25 09:50:29.355686315 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/veoru16.c b/gcc/testsuite/gcc.target/arm/neon/veoru16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/veoru16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/veoru16.c 2010-01-25 09:50:29.355686315 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/veoru32.c b/gcc/testsuite/gcc.target/arm/neon/veoru32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/veoru32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/veoru32.c 2010-01-25 09:50:29.355686315 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/veoru64.c b/gcc/testsuite/gcc.target/arm/neon/veoru64.c
+--- a/gcc/testsuite/gcc.target/arm/neon/veoru64.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/veoru64.c 2010-01-25 09:50:29.355686315 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/veoru8.c b/gcc/testsuite/gcc.target/arm/neon/veoru8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/veoru8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/veoru8.c 2010-01-25 09:50:29.355686315 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vextf32.c b/gcc/testsuite/gcc.target/arm/neon/vextf32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vextf32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vextf32.c 2010-01-25 09:50:29.355686315 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vextp16.c b/gcc/testsuite/gcc.target/arm/neon/vextp16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vextp16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vextp16.c 2010-01-25 09:50:29.355686315 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vextp8.c b/gcc/testsuite/gcc.target/arm/neon/vextp8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vextp8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vextp8.c 2010-01-25 09:50:29.355686315 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vextQf32.c b/gcc/testsuite/gcc.target/arm/neon/vextQf32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vextQf32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vextQf32.c 2010-01-25 09:50:29.355686315 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vextQp16.c b/gcc/testsuite/gcc.target/arm/neon/vextQp16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vextQp16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vextQp16.c 2010-01-25 09:50:29.355686315 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vextQp8.c b/gcc/testsuite/gcc.target/arm/neon/vextQp8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vextQp8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vextQp8.c 2010-01-25 09:50:29.355686315 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vextQs16.c b/gcc/testsuite/gcc.target/arm/neon/vextQs16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vextQs16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vextQs16.c 2010-01-25 09:50:29.355686315 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vextQs32.c b/gcc/testsuite/gcc.target/arm/neon/vextQs32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vextQs32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vextQs32.c 2010-01-25 09:50:29.355686315 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vextQs64.c b/gcc/testsuite/gcc.target/arm/neon/vextQs64.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vextQs64.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vextQs64.c 2010-01-25 09:50:29.355686315 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vextQs8.c b/gcc/testsuite/gcc.target/arm/neon/vextQs8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vextQs8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vextQs8.c 2010-01-25 09:50:29.355686315 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vextQu16.c b/gcc/testsuite/gcc.target/arm/neon/vextQu16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vextQu16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vextQu16.c 2010-01-25 09:50:29.355686315 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vextQu32.c b/gcc/testsuite/gcc.target/arm/neon/vextQu32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vextQu32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vextQu32.c 2010-01-25 09:50:29.355686315 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vextQu64.c b/gcc/testsuite/gcc.target/arm/neon/vextQu64.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vextQu64.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vextQu64.c 2010-01-25 09:50:29.355686315 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vextQu8.c b/gcc/testsuite/gcc.target/arm/neon/vextQu8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vextQu8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vextQu8.c 2010-01-25 09:50:29.355686315 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vexts16.c b/gcc/testsuite/gcc.target/arm/neon/vexts16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vexts16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vexts16.c 2010-01-25 09:50:29.355686315 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vexts32.c b/gcc/testsuite/gcc.target/arm/neon/vexts32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vexts32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vexts32.c 2010-01-25 09:50:29.355686315 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vexts64.c b/gcc/testsuite/gcc.target/arm/neon/vexts64.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vexts64.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vexts64.c 2010-01-25 09:50:29.355686315 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vexts8.c b/gcc/testsuite/gcc.target/arm/neon/vexts8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vexts8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vexts8.c 2010-01-25 09:50:29.355686315 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vextu16.c b/gcc/testsuite/gcc.target/arm/neon/vextu16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vextu16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vextu16.c 2010-01-25 09:50:29.355686315 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vextu32.c b/gcc/testsuite/gcc.target/arm/neon/vextu32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vextu32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vextu32.c 2010-01-25 09:50:29.355686315 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vextu64.c b/gcc/testsuite/gcc.target/arm/neon/vextu64.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vextu64.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vextu64.c 2010-01-25 09:50:29.355686315 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vextu8.c b/gcc/testsuite/gcc.target/arm/neon/vextu8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vextu8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vextu8.c 2010-01-25 09:50:29.355686315 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vfp-shift-a2t2.c b/gcc/testsuite/gcc.target/arm/neon/vfp-shift-a2t2.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vfp-shift-a2t2.c 1970-01-01 01:00:00.000000000 +0100
++++ b/gcc/testsuite/gcc.target/arm/neon/vfp-shift-a2t2.c 2010-01-25 09:50:29.355686315 +0100
+@@ -0,0 +1,27 @@
++/* Check that NEON vector shifts support immediate values == size. /*
++
++/* { dg-do compile } */
++/* { dg-require-effective-target arm_neon_ok } */
++/* { dg-add-options arm_neon } */
++
++#include <arm_neon.h>
++
++uint16x8_t test_vshll_n_u8 (uint8x8_t a)
++{
++ return vshll_n_u8(a, 8);
++}
++
++uint32x4_t test_vshll_n_u16 (uint16x4_t a)
++{
++ return vshll_n_u16(a, 16);
++}
++
++uint64x2_t test_vshll_n_u32 (uint32x2_t a)
++{
++ return vshll_n_u32(a, 32);
++}
++
++/* { dg-final { scan-assembler "vshll\.u16\[ \]+\[qQ\]\[0-9\]+, \[dD\]\[0-9\]+, #\[0-9\]+!?\(\[ \]+@\[a-zA-Z0-9 \]+\)?\n" } } */
++/* { dg-final { scan-assembler "vshll\.u32\[ \]+\[qQ\]\[0-9\]+, \[dD\]\[0-9\]+, #\[0-9\]+!?\(\[ \]+@\[a-zA-Z0-9 \]+\)?\n" } } */
++/* { dg-final { scan-assembler "vshll\.u8\[ \]+\[qQ\]\[0-9\]+, \[dD\]\[0-9\]+, #\[0-9\]+!?\(\[ \]+@\[a-zA-Z0-9 \]+\)?\n" } } */
++/* { dg-final { cleanup-saved-temps } } */
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vget_highf32.c b/gcc/testsuite/gcc.target/arm/neon/vget_highf32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vget_highf32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vget_highf32.c 2010-01-25 09:50:29.355686315 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vget_highp16.c b/gcc/testsuite/gcc.target/arm/neon/vget_highp16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vget_highp16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vget_highp16.c 2010-01-25 09:50:29.365686888 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vget_highp8.c b/gcc/testsuite/gcc.target/arm/neon/vget_highp8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vget_highp8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vget_highp8.c 2010-01-25 09:50:29.365686888 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vget_highs16.c b/gcc/testsuite/gcc.target/arm/neon/vget_highs16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vget_highs16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vget_highs16.c 2010-01-25 09:50:29.365686888 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vget_highs32.c b/gcc/testsuite/gcc.target/arm/neon/vget_highs32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vget_highs32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vget_highs32.c 2010-01-25 09:50:29.365686888 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vget_highs64.c b/gcc/testsuite/gcc.target/arm/neon/vget_highs64.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vget_highs64.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vget_highs64.c 2010-01-25 09:50:29.365686888 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vget_highs8.c b/gcc/testsuite/gcc.target/arm/neon/vget_highs8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vget_highs8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vget_highs8.c 2010-01-25 09:50:29.365686888 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vget_highu16.c b/gcc/testsuite/gcc.target/arm/neon/vget_highu16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vget_highu16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vget_highu16.c 2010-01-25 09:50:29.365686888 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vget_highu32.c b/gcc/testsuite/gcc.target/arm/neon/vget_highu32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vget_highu32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vget_highu32.c 2010-01-25 09:50:29.365686888 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vget_highu64.c b/gcc/testsuite/gcc.target/arm/neon/vget_highu64.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vget_highu64.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vget_highu64.c 2010-01-25 09:50:29.365686888 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vget_highu8.c b/gcc/testsuite/gcc.target/arm/neon/vget_highu8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vget_highu8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vget_highu8.c 2010-01-25 09:50:29.365686888 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vget_lanef32.c b/gcc/testsuite/gcc.target/arm/neon/vget_lanef32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vget_lanef32.c 2007-07-30 15:48:43.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vget_lanef32.c 2010-01-25 09:50:29.365686888 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vget_lanep16.c b/gcc/testsuite/gcc.target/arm/neon/vget_lanep16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vget_lanep16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vget_lanep16.c 2010-01-25 09:50:29.365686888 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vget_lanep8.c b/gcc/testsuite/gcc.target/arm/neon/vget_lanep8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vget_lanep8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vget_lanep8.c 2010-01-25 09:50:29.365686888 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vget_lanes16.c b/gcc/testsuite/gcc.target/arm/neon/vget_lanes16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vget_lanes16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vget_lanes16.c 2010-01-25 09:50:29.365686888 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vget_lanes32.c b/gcc/testsuite/gcc.target/arm/neon/vget_lanes32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vget_lanes32.c 2007-07-30 15:48:43.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vget_lanes32.c 2010-01-25 09:50:29.365686888 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vget_lanes64.c b/gcc/testsuite/gcc.target/arm/neon/vget_lanes64.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vget_lanes64.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vget_lanes64.c 2010-01-25 09:50:29.365686888 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vget_lanes8.c b/gcc/testsuite/gcc.target/arm/neon/vget_lanes8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vget_lanes8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vget_lanes8.c 2010-01-25 09:50:29.365686888 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vget_laneu16.c b/gcc/testsuite/gcc.target/arm/neon/vget_laneu16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vget_laneu16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vget_laneu16.c 2010-01-25 09:50:29.365686888 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vget_laneu32.c b/gcc/testsuite/gcc.target/arm/neon/vget_laneu32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vget_laneu32.c 2007-07-30 15:48:43.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vget_laneu32.c 2010-01-25 09:50:29.365686888 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vget_laneu64.c b/gcc/testsuite/gcc.target/arm/neon/vget_laneu64.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vget_laneu64.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vget_laneu64.c 2010-01-25 09:50:29.365686888 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vget_laneu8.c b/gcc/testsuite/gcc.target/arm/neon/vget_laneu8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vget_laneu8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vget_laneu8.c 2010-01-25 09:50:29.365686888 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vget_lowf32.c b/gcc/testsuite/gcc.target/arm/neon/vget_lowf32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vget_lowf32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vget_lowf32.c 2010-01-25 09:50:29.365686888 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vget_lowp16.c b/gcc/testsuite/gcc.target/arm/neon/vget_lowp16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vget_lowp16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vget_lowp16.c 2010-01-25 09:50:29.365686888 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vget_lowp8.c b/gcc/testsuite/gcc.target/arm/neon/vget_lowp8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vget_lowp8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vget_lowp8.c 2010-01-25 09:50:29.365686888 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vget_lows16.c b/gcc/testsuite/gcc.target/arm/neon/vget_lows16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vget_lows16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vget_lows16.c 2010-01-25 09:50:29.365686888 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vget_lows32.c b/gcc/testsuite/gcc.target/arm/neon/vget_lows32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vget_lows32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vget_lows32.c 2010-01-25 09:50:29.365686888 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vget_lows64.c b/gcc/testsuite/gcc.target/arm/neon/vget_lows64.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vget_lows64.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vget_lows64.c 2010-01-25 09:50:29.365686888 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vget_lows8.c b/gcc/testsuite/gcc.target/arm/neon/vget_lows8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vget_lows8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vget_lows8.c 2010-01-25 09:50:29.365686888 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vget_lowu16.c b/gcc/testsuite/gcc.target/arm/neon/vget_lowu16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vget_lowu16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vget_lowu16.c 2010-01-25 09:50:29.365686888 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vget_lowu32.c b/gcc/testsuite/gcc.target/arm/neon/vget_lowu32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vget_lowu32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vget_lowu32.c 2010-01-25 09:50:29.365686888 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vget_lowu64.c b/gcc/testsuite/gcc.target/arm/neon/vget_lowu64.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vget_lowu64.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vget_lowu64.c 2010-01-25 09:50:29.365686888 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vget_lowu8.c b/gcc/testsuite/gcc.target/arm/neon/vget_lowu8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vget_lowu8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vget_lowu8.c 2010-01-25 09:50:29.365686888 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vgetQ_lanef32.c b/gcc/testsuite/gcc.target/arm/neon/vgetQ_lanef32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vgetQ_lanef32.c 2007-07-30 15:48:43.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vgetQ_lanef32.c 2010-01-25 09:50:29.365686888 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vgetQ_lanep16.c b/gcc/testsuite/gcc.target/arm/neon/vgetQ_lanep16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vgetQ_lanep16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vgetQ_lanep16.c 2010-01-25 09:50:29.365686888 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vgetQ_lanep8.c b/gcc/testsuite/gcc.target/arm/neon/vgetQ_lanep8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vgetQ_lanep8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vgetQ_lanep8.c 2010-01-25 09:50:29.365686888 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vgetQ_lanes16.c b/gcc/testsuite/gcc.target/arm/neon/vgetQ_lanes16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vgetQ_lanes16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vgetQ_lanes16.c 2010-01-25 09:50:29.365686888 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vgetQ_lanes32.c b/gcc/testsuite/gcc.target/arm/neon/vgetQ_lanes32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vgetQ_lanes32.c 2007-07-30 15:48:43.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vgetQ_lanes32.c 2010-01-25 09:50:29.365686888 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vgetQ_lanes64.c b/gcc/testsuite/gcc.target/arm/neon/vgetQ_lanes64.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vgetQ_lanes64.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vgetQ_lanes64.c 2010-01-25 09:50:29.365686888 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vgetQ_lanes8.c b/gcc/testsuite/gcc.target/arm/neon/vgetQ_lanes8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vgetQ_lanes8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vgetQ_lanes8.c 2010-01-25 09:50:29.365686888 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vgetQ_laneu16.c b/gcc/testsuite/gcc.target/arm/neon/vgetQ_laneu16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vgetQ_laneu16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vgetQ_laneu16.c 2010-01-25 09:50:29.365686888 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vgetQ_laneu32.c b/gcc/testsuite/gcc.target/arm/neon/vgetQ_laneu32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vgetQ_laneu32.c 2007-07-30 15:48:43.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vgetQ_laneu32.c 2010-01-25 09:50:29.365686888 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vgetQ_laneu64.c b/gcc/testsuite/gcc.target/arm/neon/vgetQ_laneu64.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vgetQ_laneu64.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vgetQ_laneu64.c 2010-01-25 09:50:29.365686888 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vgetQ_laneu8.c b/gcc/testsuite/gcc.target/arm/neon/vgetQ_laneu8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vgetQ_laneu8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vgetQ_laneu8.c 2010-01-25 09:50:29.365686888 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vhaddQs16.c b/gcc/testsuite/gcc.target/arm/neon/vhaddQs16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vhaddQs16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vhaddQs16.c 2010-01-25 09:50:29.365686888 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vhaddQs32.c b/gcc/testsuite/gcc.target/arm/neon/vhaddQs32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vhaddQs32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vhaddQs32.c 2010-01-25 09:50:29.365686888 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vhaddQs8.c b/gcc/testsuite/gcc.target/arm/neon/vhaddQs8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vhaddQs8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vhaddQs8.c 2010-01-25 09:50:29.365686888 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vhaddQu16.c b/gcc/testsuite/gcc.target/arm/neon/vhaddQu16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vhaddQu16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vhaddQu16.c 2010-01-25 09:50:29.365686888 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vhaddQu32.c b/gcc/testsuite/gcc.target/arm/neon/vhaddQu32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vhaddQu32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vhaddQu32.c 2010-01-25 09:50:29.365686888 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vhaddQu8.c b/gcc/testsuite/gcc.target/arm/neon/vhaddQu8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vhaddQu8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vhaddQu8.c 2010-01-25 09:50:29.365686888 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vhadds16.c b/gcc/testsuite/gcc.target/arm/neon/vhadds16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vhadds16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vhadds16.c 2010-01-25 09:50:29.365686888 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vhadds32.c b/gcc/testsuite/gcc.target/arm/neon/vhadds32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vhadds32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vhadds32.c 2010-01-25 09:50:29.365686888 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vhadds8.c b/gcc/testsuite/gcc.target/arm/neon/vhadds8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vhadds8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vhadds8.c 2010-01-25 09:50:29.365686888 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vhaddu16.c b/gcc/testsuite/gcc.target/arm/neon/vhaddu16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vhaddu16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vhaddu16.c 2010-01-25 09:50:29.365686888 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vhaddu32.c b/gcc/testsuite/gcc.target/arm/neon/vhaddu32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vhaddu32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vhaddu32.c 2010-01-25 09:50:29.365686888 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vhaddu8.c b/gcc/testsuite/gcc.target/arm/neon/vhaddu8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vhaddu8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vhaddu8.c 2010-01-25 09:50:29.365686888 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vhsubQs16.c b/gcc/testsuite/gcc.target/arm/neon/vhsubQs16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vhsubQs16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vhsubQs16.c 2010-01-25 09:50:29.365686888 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vhsubQs32.c b/gcc/testsuite/gcc.target/arm/neon/vhsubQs32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vhsubQs32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vhsubQs32.c 2010-01-25 09:50:29.365686888 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vhsubQs8.c b/gcc/testsuite/gcc.target/arm/neon/vhsubQs8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vhsubQs8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vhsubQs8.c 2010-01-25 09:50:29.365686888 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vhsubQu16.c b/gcc/testsuite/gcc.target/arm/neon/vhsubQu16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vhsubQu16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vhsubQu16.c 2010-01-25 09:50:29.365686888 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vhsubQu32.c b/gcc/testsuite/gcc.target/arm/neon/vhsubQu32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vhsubQu32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vhsubQu32.c 2010-01-25 09:50:29.365686888 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vhsubQu8.c b/gcc/testsuite/gcc.target/arm/neon/vhsubQu8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vhsubQu8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vhsubQu8.c 2010-01-25 09:50:29.365686888 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vhsubs16.c b/gcc/testsuite/gcc.target/arm/neon/vhsubs16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vhsubs16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vhsubs16.c 2010-01-25 09:50:29.365686888 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vhsubs32.c b/gcc/testsuite/gcc.target/arm/neon/vhsubs32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vhsubs32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vhsubs32.c 2010-01-25 09:50:29.365686888 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vhsubs8.c b/gcc/testsuite/gcc.target/arm/neon/vhsubs8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vhsubs8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vhsubs8.c 2010-01-25 09:50:29.365686888 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vhsubu16.c b/gcc/testsuite/gcc.target/arm/neon/vhsubu16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vhsubu16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vhsubu16.c 2010-01-25 09:50:29.365686888 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vhsubu32.c b/gcc/testsuite/gcc.target/arm/neon/vhsubu32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vhsubu32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vhsubu32.c 2010-01-25 09:50:29.365686888 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vhsubu8.c b/gcc/testsuite/gcc.target/arm/neon/vhsubu8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vhsubu8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vhsubu8.c 2010-01-25 09:50:29.365686888 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vld1_dupf32.c b/gcc/testsuite/gcc.target/arm/neon/vld1_dupf32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vld1_dupf32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vld1_dupf32.c 2010-01-25 09:50:29.365686888 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vld1_dupp16.c b/gcc/testsuite/gcc.target/arm/neon/vld1_dupp16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vld1_dupp16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vld1_dupp16.c 2010-01-25 09:50:29.365686888 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vld1_dupp8.c b/gcc/testsuite/gcc.target/arm/neon/vld1_dupp8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vld1_dupp8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vld1_dupp8.c 2010-01-25 09:50:29.365686888 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vld1_dups16.c b/gcc/testsuite/gcc.target/arm/neon/vld1_dups16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vld1_dups16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vld1_dups16.c 2010-01-25 09:50:29.365686888 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vld1_dups32.c b/gcc/testsuite/gcc.target/arm/neon/vld1_dups32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vld1_dups32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vld1_dups32.c 2010-01-25 09:50:29.365686888 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vld1_dups64.c b/gcc/testsuite/gcc.target/arm/neon/vld1_dups64.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vld1_dups64.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vld1_dups64.c 2010-01-25 09:50:29.375686623 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vld1_dups8.c b/gcc/testsuite/gcc.target/arm/neon/vld1_dups8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vld1_dups8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vld1_dups8.c 2010-01-25 09:50:29.375686623 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vld1_dupu16.c b/gcc/testsuite/gcc.target/arm/neon/vld1_dupu16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vld1_dupu16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vld1_dupu16.c 2010-01-25 09:50:29.375686623 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vld1_dupu32.c b/gcc/testsuite/gcc.target/arm/neon/vld1_dupu32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vld1_dupu32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vld1_dupu32.c 2010-01-25 09:50:29.375686623 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vld1_dupu64.c b/gcc/testsuite/gcc.target/arm/neon/vld1_dupu64.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vld1_dupu64.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vld1_dupu64.c 2010-01-25 09:50:29.375686623 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vld1_dupu8.c b/gcc/testsuite/gcc.target/arm/neon/vld1_dupu8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vld1_dupu8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vld1_dupu8.c 2010-01-25 09:50:29.375686623 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vld1f32.c b/gcc/testsuite/gcc.target/arm/neon/vld1f32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vld1f32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vld1f32.c 2010-01-25 09:50:29.375686623 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vld1_lanef32.c b/gcc/testsuite/gcc.target/arm/neon/vld1_lanef32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vld1_lanef32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vld1_lanef32.c 2010-01-25 09:50:29.375686623 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vld1_lanep16.c b/gcc/testsuite/gcc.target/arm/neon/vld1_lanep16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vld1_lanep16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vld1_lanep16.c 2010-01-25 09:50:29.375686623 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vld1_lanep8.c b/gcc/testsuite/gcc.target/arm/neon/vld1_lanep8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vld1_lanep8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vld1_lanep8.c 2010-01-25 09:50:29.375686623 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vld1_lanes16.c b/gcc/testsuite/gcc.target/arm/neon/vld1_lanes16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vld1_lanes16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vld1_lanes16.c 2010-01-25 09:50:29.375686623 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vld1_lanes32.c b/gcc/testsuite/gcc.target/arm/neon/vld1_lanes32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vld1_lanes32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vld1_lanes32.c 2010-01-25 09:50:29.375686623 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vld1_lanes64.c b/gcc/testsuite/gcc.target/arm/neon/vld1_lanes64.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vld1_lanes64.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vld1_lanes64.c 2010-01-25 09:50:29.375686623 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vld1_lanes8.c b/gcc/testsuite/gcc.target/arm/neon/vld1_lanes8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vld1_lanes8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vld1_lanes8.c 2010-01-25 09:50:29.375686623 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vld1_laneu16.c b/gcc/testsuite/gcc.target/arm/neon/vld1_laneu16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vld1_laneu16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vld1_laneu16.c 2010-01-25 09:50:29.375686623 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vld1_laneu32.c b/gcc/testsuite/gcc.target/arm/neon/vld1_laneu32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vld1_laneu32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vld1_laneu32.c 2010-01-25 09:50:29.375686623 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vld1_laneu64.c b/gcc/testsuite/gcc.target/arm/neon/vld1_laneu64.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vld1_laneu64.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vld1_laneu64.c 2010-01-25 09:50:29.375686623 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vld1_laneu8.c b/gcc/testsuite/gcc.target/arm/neon/vld1_laneu8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vld1_laneu8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vld1_laneu8.c 2010-01-25 09:50:29.375686623 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vld1p16.c b/gcc/testsuite/gcc.target/arm/neon/vld1p16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vld1p16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vld1p16.c 2010-01-25 09:50:29.375686623 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vld1p8.c b/gcc/testsuite/gcc.target/arm/neon/vld1p8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vld1p8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vld1p8.c 2010-01-25 09:50:29.375686623 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vld1Q_dupf32.c b/gcc/testsuite/gcc.target/arm/neon/vld1Q_dupf32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vld1Q_dupf32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vld1Q_dupf32.c 2010-01-25 09:50:29.375686623 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vld1Q_dupp16.c b/gcc/testsuite/gcc.target/arm/neon/vld1Q_dupp16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vld1Q_dupp16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vld1Q_dupp16.c 2010-01-25 09:50:29.375686623 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vld1Q_dupp8.c b/gcc/testsuite/gcc.target/arm/neon/vld1Q_dupp8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vld1Q_dupp8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vld1Q_dupp8.c 2010-01-25 09:50:29.375686623 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vld1Q_dups16.c b/gcc/testsuite/gcc.target/arm/neon/vld1Q_dups16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vld1Q_dups16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vld1Q_dups16.c 2010-01-25 09:50:29.375686623 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vld1Q_dups32.c b/gcc/testsuite/gcc.target/arm/neon/vld1Q_dups32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vld1Q_dups32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vld1Q_dups32.c 2010-01-25 09:50:29.375686623 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vld1Q_dups64.c b/gcc/testsuite/gcc.target/arm/neon/vld1Q_dups64.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vld1Q_dups64.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vld1Q_dups64.c 2010-01-25 09:50:29.375686623 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vld1Q_dups8.c b/gcc/testsuite/gcc.target/arm/neon/vld1Q_dups8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vld1Q_dups8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vld1Q_dups8.c 2010-01-25 09:50:29.375686623 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vld1Q_dupu16.c b/gcc/testsuite/gcc.target/arm/neon/vld1Q_dupu16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vld1Q_dupu16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vld1Q_dupu16.c 2010-01-25 09:50:29.375686623 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vld1Q_dupu32.c b/gcc/testsuite/gcc.target/arm/neon/vld1Q_dupu32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vld1Q_dupu32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vld1Q_dupu32.c 2010-01-25 09:50:29.375686623 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vld1Q_dupu64.c b/gcc/testsuite/gcc.target/arm/neon/vld1Q_dupu64.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vld1Q_dupu64.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vld1Q_dupu64.c 2010-01-25 09:50:29.375686623 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vld1Q_dupu8.c b/gcc/testsuite/gcc.target/arm/neon/vld1Q_dupu8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vld1Q_dupu8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vld1Q_dupu8.c 2010-01-25 09:50:29.375686623 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vld1Qf32.c b/gcc/testsuite/gcc.target/arm/neon/vld1Qf32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vld1Qf32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vld1Qf32.c 2010-01-25 09:50:29.375686623 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vld1Q_lanef32.c b/gcc/testsuite/gcc.target/arm/neon/vld1Q_lanef32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vld1Q_lanef32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vld1Q_lanef32.c 2010-01-25 09:50:29.375686623 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vld1Q_lanep16.c b/gcc/testsuite/gcc.target/arm/neon/vld1Q_lanep16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vld1Q_lanep16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vld1Q_lanep16.c 2010-01-25 09:50:29.375686623 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vld1Q_lanep8.c b/gcc/testsuite/gcc.target/arm/neon/vld1Q_lanep8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vld1Q_lanep8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vld1Q_lanep8.c 2010-01-25 09:50:29.375686623 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vld1Q_lanes16.c b/gcc/testsuite/gcc.target/arm/neon/vld1Q_lanes16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vld1Q_lanes16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vld1Q_lanes16.c 2010-01-25 09:50:29.375686623 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vld1Q_lanes32.c b/gcc/testsuite/gcc.target/arm/neon/vld1Q_lanes32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vld1Q_lanes32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vld1Q_lanes32.c 2010-01-25 09:50:29.375686623 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vld1Q_lanes64.c b/gcc/testsuite/gcc.target/arm/neon/vld1Q_lanes64.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vld1Q_lanes64.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vld1Q_lanes64.c 2010-01-25 09:50:29.375686623 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vld1Q_lanes8.c b/gcc/testsuite/gcc.target/arm/neon/vld1Q_lanes8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vld1Q_lanes8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vld1Q_lanes8.c 2010-01-25 09:50:29.375686623 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vld1Q_laneu16.c b/gcc/testsuite/gcc.target/arm/neon/vld1Q_laneu16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vld1Q_laneu16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vld1Q_laneu16.c 2010-01-25 09:50:29.375686623 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vld1Q_laneu32.c b/gcc/testsuite/gcc.target/arm/neon/vld1Q_laneu32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vld1Q_laneu32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vld1Q_laneu32.c 2010-01-25 09:50:29.375686623 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vld1Q_laneu64.c b/gcc/testsuite/gcc.target/arm/neon/vld1Q_laneu64.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vld1Q_laneu64.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vld1Q_laneu64.c 2010-01-25 09:50:29.375686623 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vld1Q_laneu8.c b/gcc/testsuite/gcc.target/arm/neon/vld1Q_laneu8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vld1Q_laneu8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vld1Q_laneu8.c 2010-01-25 09:50:29.375686623 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vld1Qp16.c b/gcc/testsuite/gcc.target/arm/neon/vld1Qp16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vld1Qp16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vld1Qp16.c 2010-01-25 09:50:29.375686623 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vld1Qp8.c b/gcc/testsuite/gcc.target/arm/neon/vld1Qp8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vld1Qp8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vld1Qp8.c 2010-01-25 09:50:29.375686623 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vld1Qs16.c b/gcc/testsuite/gcc.target/arm/neon/vld1Qs16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vld1Qs16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vld1Qs16.c 2010-01-25 09:50:29.375686623 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vld1Qs32.c b/gcc/testsuite/gcc.target/arm/neon/vld1Qs32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vld1Qs32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vld1Qs32.c 2010-01-25 09:50:29.375686623 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vld1Qs64.c b/gcc/testsuite/gcc.target/arm/neon/vld1Qs64.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vld1Qs64.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vld1Qs64.c 2010-01-25 09:50:29.375686623 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vld1Qs8.c b/gcc/testsuite/gcc.target/arm/neon/vld1Qs8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vld1Qs8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vld1Qs8.c 2010-01-25 09:50:29.375686623 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vld1Qu16.c b/gcc/testsuite/gcc.target/arm/neon/vld1Qu16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vld1Qu16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vld1Qu16.c 2010-01-25 09:50:29.375686623 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vld1Qu32.c b/gcc/testsuite/gcc.target/arm/neon/vld1Qu32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vld1Qu32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vld1Qu32.c 2010-01-25 09:50:29.375686623 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vld1Qu64.c b/gcc/testsuite/gcc.target/arm/neon/vld1Qu64.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vld1Qu64.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vld1Qu64.c 2010-01-25 09:50:29.375686623 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vld1Qu8.c b/gcc/testsuite/gcc.target/arm/neon/vld1Qu8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vld1Qu8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vld1Qu8.c 2010-01-25 09:50:29.375686623 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vld1s16.c b/gcc/testsuite/gcc.target/arm/neon/vld1s16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vld1s16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vld1s16.c 2010-01-25 09:50:29.375686623 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vld1s32.c b/gcc/testsuite/gcc.target/arm/neon/vld1s32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vld1s32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vld1s32.c 2010-01-25 09:50:29.375686623 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vld1s64.c b/gcc/testsuite/gcc.target/arm/neon/vld1s64.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vld1s64.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vld1s64.c 2010-01-25 09:50:29.375686623 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vld1s8.c b/gcc/testsuite/gcc.target/arm/neon/vld1s8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vld1s8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vld1s8.c 2010-01-25 09:50:29.375686623 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vld1u16.c b/gcc/testsuite/gcc.target/arm/neon/vld1u16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vld1u16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vld1u16.c 2010-01-25 09:50:29.375686623 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vld1u32.c b/gcc/testsuite/gcc.target/arm/neon/vld1u32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vld1u32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vld1u32.c 2010-01-25 09:50:29.375686623 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vld1u64.c b/gcc/testsuite/gcc.target/arm/neon/vld1u64.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vld1u64.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vld1u64.c 2010-01-25 09:50:29.375686623 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vld1u8.c b/gcc/testsuite/gcc.target/arm/neon/vld1u8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vld1u8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vld1u8.c 2010-01-25 09:50:29.375686623 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vld2_dupf32.c b/gcc/testsuite/gcc.target/arm/neon/vld2_dupf32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vld2_dupf32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vld2_dupf32.c 2010-01-25 09:50:29.375686623 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vld2_dupp16.c b/gcc/testsuite/gcc.target/arm/neon/vld2_dupp16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vld2_dupp16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vld2_dupp16.c 2010-01-25 09:50:29.375686623 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vld2_dupp8.c b/gcc/testsuite/gcc.target/arm/neon/vld2_dupp8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vld2_dupp8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vld2_dupp8.c 2010-01-25 09:50:29.375686623 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vld2_dups16.c b/gcc/testsuite/gcc.target/arm/neon/vld2_dups16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vld2_dups16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vld2_dups16.c 2010-01-25 09:50:29.375686623 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vld2_dups32.c b/gcc/testsuite/gcc.target/arm/neon/vld2_dups32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vld2_dups32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vld2_dups32.c 2010-01-25 09:50:29.375686623 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vld2_dups64.c b/gcc/testsuite/gcc.target/arm/neon/vld2_dups64.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vld2_dups64.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vld2_dups64.c 2010-01-25 09:50:29.375686623 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vld2_dups8.c b/gcc/testsuite/gcc.target/arm/neon/vld2_dups8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vld2_dups8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vld2_dups8.c 2010-01-25 09:50:29.375686623 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vld2_dupu16.c b/gcc/testsuite/gcc.target/arm/neon/vld2_dupu16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vld2_dupu16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vld2_dupu16.c 2010-01-25 09:50:29.375686623 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vld2_dupu32.c b/gcc/testsuite/gcc.target/arm/neon/vld2_dupu32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vld2_dupu32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vld2_dupu32.c 2010-01-25 09:50:29.375686623 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vld2_dupu64.c b/gcc/testsuite/gcc.target/arm/neon/vld2_dupu64.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vld2_dupu64.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vld2_dupu64.c 2010-01-25 09:50:29.375686623 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vld2_dupu8.c b/gcc/testsuite/gcc.target/arm/neon/vld2_dupu8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vld2_dupu8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vld2_dupu8.c 2010-01-25 09:50:29.375686623 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vld2f32.c b/gcc/testsuite/gcc.target/arm/neon/vld2f32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vld2f32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vld2f32.c 2010-01-25 09:50:29.375686623 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vld2_lanef32.c b/gcc/testsuite/gcc.target/arm/neon/vld2_lanef32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vld2_lanef32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vld2_lanef32.c 2010-01-25 09:50:29.375686623 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vld2_lanep16.c b/gcc/testsuite/gcc.target/arm/neon/vld2_lanep16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vld2_lanep16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vld2_lanep16.c 2010-01-25 09:50:29.385686707 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vld2_lanep8.c b/gcc/testsuite/gcc.target/arm/neon/vld2_lanep8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vld2_lanep8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vld2_lanep8.c 2010-01-25 09:50:29.385686707 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vld2_lanes16.c b/gcc/testsuite/gcc.target/arm/neon/vld2_lanes16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vld2_lanes16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vld2_lanes16.c 2010-01-25 09:50:29.385686707 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vld2_lanes32.c b/gcc/testsuite/gcc.target/arm/neon/vld2_lanes32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vld2_lanes32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vld2_lanes32.c 2010-01-25 09:50:29.385686707 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vld2_lanes8.c b/gcc/testsuite/gcc.target/arm/neon/vld2_lanes8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vld2_lanes8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vld2_lanes8.c 2010-01-25 09:50:29.385686707 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vld2_laneu16.c b/gcc/testsuite/gcc.target/arm/neon/vld2_laneu16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vld2_laneu16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vld2_laneu16.c 2010-01-25 09:50:29.385686707 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vld2_laneu32.c b/gcc/testsuite/gcc.target/arm/neon/vld2_laneu32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vld2_laneu32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vld2_laneu32.c 2010-01-25 09:50:29.385686707 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vld2_laneu8.c b/gcc/testsuite/gcc.target/arm/neon/vld2_laneu8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vld2_laneu8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vld2_laneu8.c 2010-01-25 09:50:29.385686707 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vld2p16.c b/gcc/testsuite/gcc.target/arm/neon/vld2p16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vld2p16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vld2p16.c 2010-01-25 09:50:29.385686707 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vld2p8.c b/gcc/testsuite/gcc.target/arm/neon/vld2p8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vld2p8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vld2p8.c 2010-01-25 09:50:29.385686707 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vld2Qf32.c b/gcc/testsuite/gcc.target/arm/neon/vld2Qf32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vld2Qf32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vld2Qf32.c 2010-01-25 09:50:29.385686707 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vld2Q_lanef32.c b/gcc/testsuite/gcc.target/arm/neon/vld2Q_lanef32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vld2Q_lanef32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vld2Q_lanef32.c 2010-01-25 09:50:29.385686707 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vld2Q_lanep16.c b/gcc/testsuite/gcc.target/arm/neon/vld2Q_lanep16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vld2Q_lanep16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vld2Q_lanep16.c 2010-01-25 09:50:29.385686707 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vld2Q_lanes16.c b/gcc/testsuite/gcc.target/arm/neon/vld2Q_lanes16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vld2Q_lanes16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vld2Q_lanes16.c 2010-01-25 09:50:29.385686707 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vld2Q_lanes32.c b/gcc/testsuite/gcc.target/arm/neon/vld2Q_lanes32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vld2Q_lanes32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vld2Q_lanes32.c 2010-01-25 09:50:29.385686707 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vld2Q_laneu16.c b/gcc/testsuite/gcc.target/arm/neon/vld2Q_laneu16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vld2Q_laneu16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vld2Q_laneu16.c 2010-01-25 09:50:29.385686707 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vld2Q_laneu32.c b/gcc/testsuite/gcc.target/arm/neon/vld2Q_laneu32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vld2Q_laneu32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vld2Q_laneu32.c 2010-01-25 09:50:29.385686707 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vld2Qp16.c b/gcc/testsuite/gcc.target/arm/neon/vld2Qp16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vld2Qp16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vld2Qp16.c 2010-01-25 09:50:29.385686707 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vld2Qp8.c b/gcc/testsuite/gcc.target/arm/neon/vld2Qp8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vld2Qp8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vld2Qp8.c 2010-01-25 09:50:29.385686707 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vld2Qs16.c b/gcc/testsuite/gcc.target/arm/neon/vld2Qs16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vld2Qs16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vld2Qs16.c 2010-01-25 09:50:29.385686707 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vld2Qs32.c b/gcc/testsuite/gcc.target/arm/neon/vld2Qs32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vld2Qs32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vld2Qs32.c 2010-01-25 09:50:29.385686707 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vld2Qs8.c b/gcc/testsuite/gcc.target/arm/neon/vld2Qs8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vld2Qs8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vld2Qs8.c 2010-01-25 09:50:29.385686707 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vld2Qu16.c b/gcc/testsuite/gcc.target/arm/neon/vld2Qu16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vld2Qu16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vld2Qu16.c 2010-01-25 09:50:29.385686707 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vld2Qu32.c b/gcc/testsuite/gcc.target/arm/neon/vld2Qu32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vld2Qu32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vld2Qu32.c 2010-01-25 09:50:29.385686707 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vld2Qu8.c b/gcc/testsuite/gcc.target/arm/neon/vld2Qu8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vld2Qu8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vld2Qu8.c 2010-01-25 09:50:29.385686707 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vld2s16.c b/gcc/testsuite/gcc.target/arm/neon/vld2s16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vld2s16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vld2s16.c 2010-01-25 09:50:29.385686707 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vld2s32.c b/gcc/testsuite/gcc.target/arm/neon/vld2s32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vld2s32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vld2s32.c 2010-01-25 09:50:29.385686707 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vld2s64.c b/gcc/testsuite/gcc.target/arm/neon/vld2s64.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vld2s64.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vld2s64.c 2010-01-25 09:50:29.385686707 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vld2s8.c b/gcc/testsuite/gcc.target/arm/neon/vld2s8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vld2s8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vld2s8.c 2010-01-25 09:50:29.385686707 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vld2u16.c b/gcc/testsuite/gcc.target/arm/neon/vld2u16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vld2u16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vld2u16.c 2010-01-25 09:50:29.385686707 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vld2u32.c b/gcc/testsuite/gcc.target/arm/neon/vld2u32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vld2u32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vld2u32.c 2010-01-25 09:50:29.385686707 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vld2u64.c b/gcc/testsuite/gcc.target/arm/neon/vld2u64.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vld2u64.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vld2u64.c 2010-01-25 09:50:29.385686707 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vld2u8.c b/gcc/testsuite/gcc.target/arm/neon/vld2u8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vld2u8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vld2u8.c 2010-01-25 09:50:29.385686707 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vld3_dupf32.c b/gcc/testsuite/gcc.target/arm/neon/vld3_dupf32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vld3_dupf32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vld3_dupf32.c 2010-01-25 09:50:29.385686707 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vld3_dupp16.c b/gcc/testsuite/gcc.target/arm/neon/vld3_dupp16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vld3_dupp16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vld3_dupp16.c 2010-01-25 09:50:29.385686707 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vld3_dupp8.c b/gcc/testsuite/gcc.target/arm/neon/vld3_dupp8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vld3_dupp8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vld3_dupp8.c 2010-01-25 09:50:29.385686707 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vld3_dups16.c b/gcc/testsuite/gcc.target/arm/neon/vld3_dups16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vld3_dups16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vld3_dups16.c 2010-01-25 09:50:29.385686707 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vld3_dups32.c b/gcc/testsuite/gcc.target/arm/neon/vld3_dups32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vld3_dups32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vld3_dups32.c 2010-01-25 09:50:29.385686707 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vld3_dups64.c b/gcc/testsuite/gcc.target/arm/neon/vld3_dups64.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vld3_dups64.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vld3_dups64.c 2010-01-25 09:50:29.385686707 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vld3_dups8.c b/gcc/testsuite/gcc.target/arm/neon/vld3_dups8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vld3_dups8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vld3_dups8.c 2010-01-25 09:50:29.385686707 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vld3_dupu16.c b/gcc/testsuite/gcc.target/arm/neon/vld3_dupu16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vld3_dupu16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vld3_dupu16.c 2010-01-25 09:50:29.385686707 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vld3_dupu32.c b/gcc/testsuite/gcc.target/arm/neon/vld3_dupu32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vld3_dupu32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vld3_dupu32.c 2010-01-25 09:50:29.385686707 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vld3_dupu64.c b/gcc/testsuite/gcc.target/arm/neon/vld3_dupu64.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vld3_dupu64.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vld3_dupu64.c 2010-01-25 09:50:29.385686707 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vld3_dupu8.c b/gcc/testsuite/gcc.target/arm/neon/vld3_dupu8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vld3_dupu8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vld3_dupu8.c 2010-01-25 09:50:29.385686707 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vld3f32.c b/gcc/testsuite/gcc.target/arm/neon/vld3f32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vld3f32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vld3f32.c 2010-01-25 09:50:29.385686707 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vld3_lanef32.c b/gcc/testsuite/gcc.target/arm/neon/vld3_lanef32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vld3_lanef32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vld3_lanef32.c 2010-01-25 09:50:29.385686707 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vld3_lanep16.c b/gcc/testsuite/gcc.target/arm/neon/vld3_lanep16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vld3_lanep16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vld3_lanep16.c 2010-01-25 09:50:29.385686707 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vld3_lanep8.c b/gcc/testsuite/gcc.target/arm/neon/vld3_lanep8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vld3_lanep8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vld3_lanep8.c 2010-01-25 09:50:29.385686707 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vld3_lanes16.c b/gcc/testsuite/gcc.target/arm/neon/vld3_lanes16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vld3_lanes16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vld3_lanes16.c 2010-01-25 09:50:29.385686707 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vld3_lanes32.c b/gcc/testsuite/gcc.target/arm/neon/vld3_lanes32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vld3_lanes32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vld3_lanes32.c 2010-01-25 09:50:29.385686707 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vld3_lanes8.c b/gcc/testsuite/gcc.target/arm/neon/vld3_lanes8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vld3_lanes8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vld3_lanes8.c 2010-01-25 09:50:29.385686707 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vld3_laneu16.c b/gcc/testsuite/gcc.target/arm/neon/vld3_laneu16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vld3_laneu16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vld3_laneu16.c 2010-01-25 09:50:29.385686707 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vld3_laneu32.c b/gcc/testsuite/gcc.target/arm/neon/vld3_laneu32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vld3_laneu32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vld3_laneu32.c 2010-01-25 09:50:29.385686707 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vld3_laneu8.c b/gcc/testsuite/gcc.target/arm/neon/vld3_laneu8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vld3_laneu8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vld3_laneu8.c 2010-01-25 09:50:29.385686707 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vld3p16.c b/gcc/testsuite/gcc.target/arm/neon/vld3p16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vld3p16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vld3p16.c 2010-01-25 09:50:29.385686707 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vld3p8.c b/gcc/testsuite/gcc.target/arm/neon/vld3p8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vld3p8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vld3p8.c 2010-01-25 09:50:29.385686707 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vld3Qf32.c b/gcc/testsuite/gcc.target/arm/neon/vld3Qf32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vld3Qf32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vld3Qf32.c 2010-01-25 09:50:29.385686707 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vld3Q_lanef32.c b/gcc/testsuite/gcc.target/arm/neon/vld3Q_lanef32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vld3Q_lanef32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vld3Q_lanef32.c 2010-01-25 09:50:29.385686707 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vld3Q_lanep16.c b/gcc/testsuite/gcc.target/arm/neon/vld3Q_lanep16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vld3Q_lanep16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vld3Q_lanep16.c 2010-01-25 09:50:29.385686707 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vld3Q_lanes16.c b/gcc/testsuite/gcc.target/arm/neon/vld3Q_lanes16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vld3Q_lanes16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vld3Q_lanes16.c 2010-01-25 09:50:29.385686707 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vld3Q_lanes32.c b/gcc/testsuite/gcc.target/arm/neon/vld3Q_lanes32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vld3Q_lanes32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vld3Q_lanes32.c 2010-01-25 09:50:29.385686707 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vld3Q_laneu16.c b/gcc/testsuite/gcc.target/arm/neon/vld3Q_laneu16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vld3Q_laneu16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vld3Q_laneu16.c 2010-01-25 09:50:29.385686707 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vld3Q_laneu32.c b/gcc/testsuite/gcc.target/arm/neon/vld3Q_laneu32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vld3Q_laneu32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vld3Q_laneu32.c 2010-01-25 09:50:29.385686707 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vld3Qp16.c b/gcc/testsuite/gcc.target/arm/neon/vld3Qp16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vld3Qp16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vld3Qp16.c 2010-01-25 09:50:29.385686707 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vld3Qp8.c b/gcc/testsuite/gcc.target/arm/neon/vld3Qp8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vld3Qp8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vld3Qp8.c 2010-01-25 09:50:29.385686707 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vld3Qs16.c b/gcc/testsuite/gcc.target/arm/neon/vld3Qs16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vld3Qs16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vld3Qs16.c 2010-01-25 09:50:29.385686707 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vld3Qs32.c b/gcc/testsuite/gcc.target/arm/neon/vld3Qs32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vld3Qs32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vld3Qs32.c 2010-01-25 09:50:29.385686707 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vld3Qs8.c b/gcc/testsuite/gcc.target/arm/neon/vld3Qs8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vld3Qs8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vld3Qs8.c 2010-01-25 09:50:29.385686707 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vld3Qu16.c b/gcc/testsuite/gcc.target/arm/neon/vld3Qu16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vld3Qu16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vld3Qu16.c 2010-01-25 09:50:29.385686707 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vld3Qu32.c b/gcc/testsuite/gcc.target/arm/neon/vld3Qu32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vld3Qu32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vld3Qu32.c 2010-01-25 09:50:29.385686707 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vld3Qu8.c b/gcc/testsuite/gcc.target/arm/neon/vld3Qu8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vld3Qu8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vld3Qu8.c 2010-01-25 09:50:29.385686707 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vld3s16.c b/gcc/testsuite/gcc.target/arm/neon/vld3s16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vld3s16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vld3s16.c 2010-01-25 09:50:29.395687140 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vld3s32.c b/gcc/testsuite/gcc.target/arm/neon/vld3s32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vld3s32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vld3s32.c 2010-01-25 09:50:29.395687140 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vld3s64.c b/gcc/testsuite/gcc.target/arm/neon/vld3s64.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vld3s64.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vld3s64.c 2010-01-25 09:50:29.395687140 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vld3s8.c b/gcc/testsuite/gcc.target/arm/neon/vld3s8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vld3s8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vld3s8.c 2010-01-25 09:50:29.395687140 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vld3u16.c b/gcc/testsuite/gcc.target/arm/neon/vld3u16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vld3u16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vld3u16.c 2010-01-25 09:50:29.395687140 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vld3u32.c b/gcc/testsuite/gcc.target/arm/neon/vld3u32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vld3u32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vld3u32.c 2010-01-25 09:50:29.395687140 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vld3u64.c b/gcc/testsuite/gcc.target/arm/neon/vld3u64.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vld3u64.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vld3u64.c 2010-01-25 09:50:29.395687140 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vld3u8.c b/gcc/testsuite/gcc.target/arm/neon/vld3u8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vld3u8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vld3u8.c 2010-01-25 09:50:29.395687140 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vld4_dupf32.c b/gcc/testsuite/gcc.target/arm/neon/vld4_dupf32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vld4_dupf32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vld4_dupf32.c 2010-01-25 09:50:29.395687140 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vld4_dupp16.c b/gcc/testsuite/gcc.target/arm/neon/vld4_dupp16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vld4_dupp16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vld4_dupp16.c 2010-01-25 09:50:29.395687140 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vld4_dupp8.c b/gcc/testsuite/gcc.target/arm/neon/vld4_dupp8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vld4_dupp8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vld4_dupp8.c 2010-01-25 09:50:29.395687140 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vld4_dups16.c b/gcc/testsuite/gcc.target/arm/neon/vld4_dups16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vld4_dups16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vld4_dups16.c 2010-01-25 09:50:29.395687140 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vld4_dups32.c b/gcc/testsuite/gcc.target/arm/neon/vld4_dups32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vld4_dups32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vld4_dups32.c 2010-01-25 09:50:29.395687140 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vld4_dups64.c b/gcc/testsuite/gcc.target/arm/neon/vld4_dups64.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vld4_dups64.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vld4_dups64.c 2010-01-25 09:50:29.395687140 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vld4_dups8.c b/gcc/testsuite/gcc.target/arm/neon/vld4_dups8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vld4_dups8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vld4_dups8.c 2010-01-25 09:50:29.395687140 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vld4_dupu16.c b/gcc/testsuite/gcc.target/arm/neon/vld4_dupu16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vld4_dupu16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vld4_dupu16.c 2010-01-25 09:50:29.395687140 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vld4_dupu32.c b/gcc/testsuite/gcc.target/arm/neon/vld4_dupu32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vld4_dupu32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vld4_dupu32.c 2010-01-25 09:50:29.395687140 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vld4_dupu64.c b/gcc/testsuite/gcc.target/arm/neon/vld4_dupu64.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vld4_dupu64.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vld4_dupu64.c 2010-01-25 09:50:29.395687140 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vld4_dupu8.c b/gcc/testsuite/gcc.target/arm/neon/vld4_dupu8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vld4_dupu8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vld4_dupu8.c 2010-01-25 09:50:29.395687140 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vld4f32.c b/gcc/testsuite/gcc.target/arm/neon/vld4f32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vld4f32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vld4f32.c 2010-01-25 09:50:29.395687140 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vld4_lanef32.c b/gcc/testsuite/gcc.target/arm/neon/vld4_lanef32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vld4_lanef32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vld4_lanef32.c 2010-01-25 09:50:29.395687140 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vld4_lanep16.c b/gcc/testsuite/gcc.target/arm/neon/vld4_lanep16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vld4_lanep16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vld4_lanep16.c 2010-01-25 09:50:29.395687140 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vld4_lanep8.c b/gcc/testsuite/gcc.target/arm/neon/vld4_lanep8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vld4_lanep8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vld4_lanep8.c 2010-01-25 09:50:29.395687140 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vld4_lanes16.c b/gcc/testsuite/gcc.target/arm/neon/vld4_lanes16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vld4_lanes16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vld4_lanes16.c 2010-01-25 09:50:29.395687140 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vld4_lanes32.c b/gcc/testsuite/gcc.target/arm/neon/vld4_lanes32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vld4_lanes32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vld4_lanes32.c 2010-01-25 09:50:29.395687140 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vld4_lanes8.c b/gcc/testsuite/gcc.target/arm/neon/vld4_lanes8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vld4_lanes8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vld4_lanes8.c 2010-01-25 09:50:29.395687140 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vld4_laneu16.c b/gcc/testsuite/gcc.target/arm/neon/vld4_laneu16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vld4_laneu16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vld4_laneu16.c 2010-01-25 09:50:29.395687140 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vld4_laneu32.c b/gcc/testsuite/gcc.target/arm/neon/vld4_laneu32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vld4_laneu32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vld4_laneu32.c 2010-01-25 09:50:29.395687140 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vld4_laneu8.c b/gcc/testsuite/gcc.target/arm/neon/vld4_laneu8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vld4_laneu8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vld4_laneu8.c 2010-01-25 09:50:29.395687140 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vld4p16.c b/gcc/testsuite/gcc.target/arm/neon/vld4p16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vld4p16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vld4p16.c 2010-01-25 09:50:29.395687140 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vld4p8.c b/gcc/testsuite/gcc.target/arm/neon/vld4p8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vld4p8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vld4p8.c 2010-01-25 09:50:29.395687140 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vld4Qf32.c b/gcc/testsuite/gcc.target/arm/neon/vld4Qf32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vld4Qf32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vld4Qf32.c 2010-01-25 09:50:29.395687140 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vld4Q_lanef32.c b/gcc/testsuite/gcc.target/arm/neon/vld4Q_lanef32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vld4Q_lanef32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vld4Q_lanef32.c 2010-01-25 09:50:29.395687140 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vld4Q_lanep16.c b/gcc/testsuite/gcc.target/arm/neon/vld4Q_lanep16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vld4Q_lanep16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vld4Q_lanep16.c 2010-01-25 09:50:29.395687140 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vld4Q_lanes16.c b/gcc/testsuite/gcc.target/arm/neon/vld4Q_lanes16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vld4Q_lanes16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vld4Q_lanes16.c 2010-01-25 09:50:29.395687140 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vld4Q_lanes32.c b/gcc/testsuite/gcc.target/arm/neon/vld4Q_lanes32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vld4Q_lanes32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vld4Q_lanes32.c 2010-01-25 09:50:29.395687140 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vld4Q_laneu16.c b/gcc/testsuite/gcc.target/arm/neon/vld4Q_laneu16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vld4Q_laneu16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vld4Q_laneu16.c 2010-01-25 09:50:29.395687140 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vld4Q_laneu32.c b/gcc/testsuite/gcc.target/arm/neon/vld4Q_laneu32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vld4Q_laneu32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vld4Q_laneu32.c 2010-01-25 09:50:29.395687140 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vld4Qp16.c b/gcc/testsuite/gcc.target/arm/neon/vld4Qp16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vld4Qp16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vld4Qp16.c 2010-01-25 09:50:29.395687140 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vld4Qp8.c b/gcc/testsuite/gcc.target/arm/neon/vld4Qp8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vld4Qp8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vld4Qp8.c 2010-01-25 09:50:29.395687140 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vld4Qs16.c b/gcc/testsuite/gcc.target/arm/neon/vld4Qs16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vld4Qs16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vld4Qs16.c 2010-01-25 09:50:29.395687140 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vld4Qs32.c b/gcc/testsuite/gcc.target/arm/neon/vld4Qs32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vld4Qs32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vld4Qs32.c 2010-01-25 09:50:29.395687140 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vld4Qs8.c b/gcc/testsuite/gcc.target/arm/neon/vld4Qs8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vld4Qs8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vld4Qs8.c 2010-01-25 09:50:29.395687140 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vld4Qu16.c b/gcc/testsuite/gcc.target/arm/neon/vld4Qu16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vld4Qu16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vld4Qu16.c 2010-01-25 09:50:29.395687140 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vld4Qu32.c b/gcc/testsuite/gcc.target/arm/neon/vld4Qu32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vld4Qu32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vld4Qu32.c 2010-01-25 09:50:29.395687140 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vld4Qu8.c b/gcc/testsuite/gcc.target/arm/neon/vld4Qu8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vld4Qu8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vld4Qu8.c 2010-01-25 09:50:29.395687140 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vld4s16.c b/gcc/testsuite/gcc.target/arm/neon/vld4s16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vld4s16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vld4s16.c 2010-01-25 09:50:29.395687140 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vld4s32.c b/gcc/testsuite/gcc.target/arm/neon/vld4s32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vld4s32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vld4s32.c 2010-01-25 09:50:29.395687140 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vld4s64.c b/gcc/testsuite/gcc.target/arm/neon/vld4s64.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vld4s64.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vld4s64.c 2010-01-25 09:50:29.395687140 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vld4s8.c b/gcc/testsuite/gcc.target/arm/neon/vld4s8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vld4s8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vld4s8.c 2010-01-25 09:50:29.395687140 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vld4u16.c b/gcc/testsuite/gcc.target/arm/neon/vld4u16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vld4u16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vld4u16.c 2010-01-25 09:50:29.395687140 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vld4u32.c b/gcc/testsuite/gcc.target/arm/neon/vld4u32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vld4u32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vld4u32.c 2010-01-25 09:50:29.395687140 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vld4u64.c b/gcc/testsuite/gcc.target/arm/neon/vld4u64.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vld4u64.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vld4u64.c 2010-01-25 09:50:29.395687140 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vld4u8.c b/gcc/testsuite/gcc.target/arm/neon/vld4u8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vld4u8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vld4u8.c 2010-01-25 09:50:29.395687140 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vmaxf32.c b/gcc/testsuite/gcc.target/arm/neon/vmaxf32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vmaxf32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vmaxf32.c 2010-01-25 09:50:29.395687140 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vmaxQf32.c b/gcc/testsuite/gcc.target/arm/neon/vmaxQf32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vmaxQf32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vmaxQf32.c 2010-01-25 09:50:29.395687140 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vmaxQs16.c b/gcc/testsuite/gcc.target/arm/neon/vmaxQs16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vmaxQs16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vmaxQs16.c 2010-01-25 09:50:29.395687140 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vmaxQs32.c b/gcc/testsuite/gcc.target/arm/neon/vmaxQs32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vmaxQs32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vmaxQs32.c 2010-01-25 09:50:29.395687140 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vmaxQs8.c b/gcc/testsuite/gcc.target/arm/neon/vmaxQs8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vmaxQs8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vmaxQs8.c 2010-01-25 09:50:29.395687140 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vmaxQu16.c b/gcc/testsuite/gcc.target/arm/neon/vmaxQu16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vmaxQu16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vmaxQu16.c 2010-01-25 09:50:29.395687140 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vmaxQu32.c b/gcc/testsuite/gcc.target/arm/neon/vmaxQu32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vmaxQu32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vmaxQu32.c 2010-01-25 09:50:29.395687140 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vmaxQu8.c b/gcc/testsuite/gcc.target/arm/neon/vmaxQu8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vmaxQu8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vmaxQu8.c 2010-01-25 09:50:29.395687140 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vmaxs16.c b/gcc/testsuite/gcc.target/arm/neon/vmaxs16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vmaxs16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vmaxs16.c 2010-01-25 09:50:29.395687140 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vmaxs32.c b/gcc/testsuite/gcc.target/arm/neon/vmaxs32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vmaxs32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vmaxs32.c 2010-01-25 09:50:29.395687140 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vmaxs8.c b/gcc/testsuite/gcc.target/arm/neon/vmaxs8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vmaxs8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vmaxs8.c 2010-01-25 09:50:29.395687140 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vmaxu16.c b/gcc/testsuite/gcc.target/arm/neon/vmaxu16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vmaxu16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vmaxu16.c 2010-01-25 09:50:29.395687140 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vmaxu32.c b/gcc/testsuite/gcc.target/arm/neon/vmaxu32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vmaxu32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vmaxu32.c 2010-01-25 09:50:29.395687140 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vmaxu8.c b/gcc/testsuite/gcc.target/arm/neon/vmaxu8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vmaxu8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vmaxu8.c 2010-01-25 09:50:29.395687140 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vminf32.c b/gcc/testsuite/gcc.target/arm/neon/vminf32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vminf32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vminf32.c 2010-01-25 09:50:29.395687140 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vminQf32.c b/gcc/testsuite/gcc.target/arm/neon/vminQf32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vminQf32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vminQf32.c 2010-01-25 09:50:29.395687140 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vminQs16.c b/gcc/testsuite/gcc.target/arm/neon/vminQs16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vminQs16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vminQs16.c 2010-01-25 09:50:29.395687140 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vminQs32.c b/gcc/testsuite/gcc.target/arm/neon/vminQs32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vminQs32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vminQs32.c 2010-01-25 09:50:29.395687140 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vminQs8.c b/gcc/testsuite/gcc.target/arm/neon/vminQs8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vminQs8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vminQs8.c 2010-01-25 09:50:29.395687140 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vminQu16.c b/gcc/testsuite/gcc.target/arm/neon/vminQu16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vminQu16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vminQu16.c 2010-01-25 09:50:29.405687154 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vminQu32.c b/gcc/testsuite/gcc.target/arm/neon/vminQu32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vminQu32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vminQu32.c 2010-01-25 09:50:29.405687154 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vminQu8.c b/gcc/testsuite/gcc.target/arm/neon/vminQu8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vminQu8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vminQu8.c 2010-01-25 09:50:29.405687154 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vmins16.c b/gcc/testsuite/gcc.target/arm/neon/vmins16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vmins16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vmins16.c 2010-01-25 09:50:29.405687154 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vmins32.c b/gcc/testsuite/gcc.target/arm/neon/vmins32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vmins32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vmins32.c 2010-01-25 09:50:29.405687154 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vmins8.c b/gcc/testsuite/gcc.target/arm/neon/vmins8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vmins8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vmins8.c 2010-01-25 09:50:29.405687154 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vminu16.c b/gcc/testsuite/gcc.target/arm/neon/vminu16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vminu16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vminu16.c 2010-01-25 09:50:29.405687154 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vminu32.c b/gcc/testsuite/gcc.target/arm/neon/vminu32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vminu32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vminu32.c 2010-01-25 09:50:29.405687154 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vminu8.c b/gcc/testsuite/gcc.target/arm/neon/vminu8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vminu8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vminu8.c 2010-01-25 09:50:29.405687154 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vmlaf32.c b/gcc/testsuite/gcc.target/arm/neon/vmlaf32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vmlaf32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vmlaf32.c 2010-01-25 09:50:29.405687154 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vmla_lanef32.c b/gcc/testsuite/gcc.target/arm/neon/vmla_lanef32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vmla_lanef32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vmla_lanef32.c 2010-01-25 09:50:29.405687154 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vmla_lanes16.c b/gcc/testsuite/gcc.target/arm/neon/vmla_lanes16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vmla_lanes16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vmla_lanes16.c 2010-01-25 09:50:29.405687154 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vmla_lanes32.c b/gcc/testsuite/gcc.target/arm/neon/vmla_lanes32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vmla_lanes32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vmla_lanes32.c 2010-01-25 09:50:29.405687154 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vmla_laneu16.c b/gcc/testsuite/gcc.target/arm/neon/vmla_laneu16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vmla_laneu16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vmla_laneu16.c 2010-01-25 09:50:29.405687154 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vmla_laneu32.c b/gcc/testsuite/gcc.target/arm/neon/vmla_laneu32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vmla_laneu32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vmla_laneu32.c 2010-01-25 09:50:29.405687154 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vmlal_lanes16.c b/gcc/testsuite/gcc.target/arm/neon/vmlal_lanes16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vmlal_lanes16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vmlal_lanes16.c 2010-01-25 09:50:29.405687154 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vmlal_lanes32.c b/gcc/testsuite/gcc.target/arm/neon/vmlal_lanes32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vmlal_lanes32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vmlal_lanes32.c 2010-01-25 09:50:29.405687154 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vmlal_laneu16.c b/gcc/testsuite/gcc.target/arm/neon/vmlal_laneu16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vmlal_laneu16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vmlal_laneu16.c 2010-01-25 09:50:29.405687154 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vmlal_laneu32.c b/gcc/testsuite/gcc.target/arm/neon/vmlal_laneu32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vmlal_laneu32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vmlal_laneu32.c 2010-01-25 09:50:29.405687154 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vmlal_ns16.c b/gcc/testsuite/gcc.target/arm/neon/vmlal_ns16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vmlal_ns16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vmlal_ns16.c 2010-01-25 09:50:29.405687154 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vmlal_ns32.c b/gcc/testsuite/gcc.target/arm/neon/vmlal_ns32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vmlal_ns32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vmlal_ns32.c 2010-01-25 09:50:29.405687154 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vmlal_nu16.c b/gcc/testsuite/gcc.target/arm/neon/vmlal_nu16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vmlal_nu16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vmlal_nu16.c 2010-01-25 09:50:29.405687154 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vmlal_nu32.c b/gcc/testsuite/gcc.target/arm/neon/vmlal_nu32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vmlal_nu32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vmlal_nu32.c 2010-01-25 09:50:29.405687154 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vmlals16.c b/gcc/testsuite/gcc.target/arm/neon/vmlals16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vmlals16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vmlals16.c 2010-01-25 09:50:29.405687154 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vmlals32.c b/gcc/testsuite/gcc.target/arm/neon/vmlals32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vmlals32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vmlals32.c 2010-01-25 09:50:29.405687154 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vmlals8.c b/gcc/testsuite/gcc.target/arm/neon/vmlals8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vmlals8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vmlals8.c 2010-01-25 09:50:29.405687154 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vmlalu16.c b/gcc/testsuite/gcc.target/arm/neon/vmlalu16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vmlalu16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vmlalu16.c 2010-01-25 09:50:29.405687154 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vmlalu32.c b/gcc/testsuite/gcc.target/arm/neon/vmlalu32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vmlalu32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vmlalu32.c 2010-01-25 09:50:29.405687154 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vmlalu8.c b/gcc/testsuite/gcc.target/arm/neon/vmlalu8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vmlalu8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vmlalu8.c 2010-01-25 09:50:29.405687154 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vmla_nf32.c b/gcc/testsuite/gcc.target/arm/neon/vmla_nf32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vmla_nf32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vmla_nf32.c 2010-01-25 09:50:29.405687154 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vmla_ns16.c b/gcc/testsuite/gcc.target/arm/neon/vmla_ns16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vmla_ns16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vmla_ns16.c 2010-01-25 09:50:29.405687154 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vmla_ns32.c b/gcc/testsuite/gcc.target/arm/neon/vmla_ns32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vmla_ns32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vmla_ns32.c 2010-01-25 09:50:29.405687154 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vmla_nu16.c b/gcc/testsuite/gcc.target/arm/neon/vmla_nu16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vmla_nu16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vmla_nu16.c 2010-01-25 09:50:29.405687154 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vmla_nu32.c b/gcc/testsuite/gcc.target/arm/neon/vmla_nu32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vmla_nu32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vmla_nu32.c 2010-01-25 09:50:29.405687154 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vmlaQf32.c b/gcc/testsuite/gcc.target/arm/neon/vmlaQf32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vmlaQf32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vmlaQf32.c 2010-01-25 09:50:29.405687154 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vmlaQ_lanef32.c b/gcc/testsuite/gcc.target/arm/neon/vmlaQ_lanef32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vmlaQ_lanef32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vmlaQ_lanef32.c 2010-01-25 09:50:29.405687154 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vmlaQ_lanes16.c b/gcc/testsuite/gcc.target/arm/neon/vmlaQ_lanes16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vmlaQ_lanes16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vmlaQ_lanes16.c 2010-01-25 09:50:29.405687154 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vmlaQ_lanes32.c b/gcc/testsuite/gcc.target/arm/neon/vmlaQ_lanes32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vmlaQ_lanes32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vmlaQ_lanes32.c 2010-01-25 09:50:29.405687154 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vmlaQ_laneu16.c b/gcc/testsuite/gcc.target/arm/neon/vmlaQ_laneu16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vmlaQ_laneu16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vmlaQ_laneu16.c 2010-01-25 09:50:29.405687154 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vmlaQ_laneu32.c b/gcc/testsuite/gcc.target/arm/neon/vmlaQ_laneu32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vmlaQ_laneu32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vmlaQ_laneu32.c 2010-01-25 09:50:29.405687154 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vmlaQ_nf32.c b/gcc/testsuite/gcc.target/arm/neon/vmlaQ_nf32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vmlaQ_nf32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vmlaQ_nf32.c 2010-01-25 09:50:29.405687154 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vmlaQ_ns16.c b/gcc/testsuite/gcc.target/arm/neon/vmlaQ_ns16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vmlaQ_ns16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vmlaQ_ns16.c 2010-01-25 09:50:29.405687154 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vmlaQ_ns32.c b/gcc/testsuite/gcc.target/arm/neon/vmlaQ_ns32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vmlaQ_ns32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vmlaQ_ns32.c 2010-01-25 09:50:29.405687154 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vmlaQ_nu16.c b/gcc/testsuite/gcc.target/arm/neon/vmlaQ_nu16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vmlaQ_nu16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vmlaQ_nu16.c 2010-01-25 09:50:29.405687154 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vmlaQ_nu32.c b/gcc/testsuite/gcc.target/arm/neon/vmlaQ_nu32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vmlaQ_nu32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vmlaQ_nu32.c 2010-01-25 09:50:29.405687154 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vmlaQs16.c b/gcc/testsuite/gcc.target/arm/neon/vmlaQs16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vmlaQs16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vmlaQs16.c 2010-01-25 09:50:29.405687154 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vmlaQs32.c b/gcc/testsuite/gcc.target/arm/neon/vmlaQs32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vmlaQs32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vmlaQs32.c 2010-01-25 09:50:29.405687154 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vmlaQs8.c b/gcc/testsuite/gcc.target/arm/neon/vmlaQs8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vmlaQs8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vmlaQs8.c 2010-01-25 09:50:29.405687154 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vmlaQu16.c b/gcc/testsuite/gcc.target/arm/neon/vmlaQu16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vmlaQu16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vmlaQu16.c 2010-01-25 09:50:29.405687154 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vmlaQu32.c b/gcc/testsuite/gcc.target/arm/neon/vmlaQu32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vmlaQu32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vmlaQu32.c 2010-01-25 09:50:29.405687154 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vmlaQu8.c b/gcc/testsuite/gcc.target/arm/neon/vmlaQu8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vmlaQu8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vmlaQu8.c 2010-01-25 09:50:29.405687154 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vmlas16.c b/gcc/testsuite/gcc.target/arm/neon/vmlas16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vmlas16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vmlas16.c 2010-01-25 09:50:29.405687154 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vmlas32.c b/gcc/testsuite/gcc.target/arm/neon/vmlas32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vmlas32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vmlas32.c 2010-01-25 09:50:29.405687154 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vmlas8.c b/gcc/testsuite/gcc.target/arm/neon/vmlas8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vmlas8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vmlas8.c 2010-01-25 09:50:29.405687154 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vmlau16.c b/gcc/testsuite/gcc.target/arm/neon/vmlau16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vmlau16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vmlau16.c 2010-01-25 09:50:29.405687154 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vmlau32.c b/gcc/testsuite/gcc.target/arm/neon/vmlau32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vmlau32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vmlau32.c 2010-01-25 09:50:29.405687154 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vmlau8.c b/gcc/testsuite/gcc.target/arm/neon/vmlau8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vmlau8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vmlau8.c 2010-01-25 09:50:29.405687154 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vmlsf32.c b/gcc/testsuite/gcc.target/arm/neon/vmlsf32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vmlsf32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vmlsf32.c 2010-01-25 09:50:29.405687154 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vmls_lanef32.c b/gcc/testsuite/gcc.target/arm/neon/vmls_lanef32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vmls_lanef32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vmls_lanef32.c 2010-01-25 09:50:29.405687154 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vmls_lanes16.c b/gcc/testsuite/gcc.target/arm/neon/vmls_lanes16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vmls_lanes16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vmls_lanes16.c 2010-01-25 09:50:29.405687154 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vmls_lanes32.c b/gcc/testsuite/gcc.target/arm/neon/vmls_lanes32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vmls_lanes32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vmls_lanes32.c 2010-01-25 09:50:29.405687154 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vmls_laneu16.c b/gcc/testsuite/gcc.target/arm/neon/vmls_laneu16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vmls_laneu16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vmls_laneu16.c 2010-01-25 09:50:29.405687154 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vmls_laneu32.c b/gcc/testsuite/gcc.target/arm/neon/vmls_laneu32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vmls_laneu32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vmls_laneu32.c 2010-01-25 09:50:29.405687154 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vmlsl_lanes16.c b/gcc/testsuite/gcc.target/arm/neon/vmlsl_lanes16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vmlsl_lanes16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vmlsl_lanes16.c 2010-01-25 09:50:29.405687154 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vmlsl_lanes32.c b/gcc/testsuite/gcc.target/arm/neon/vmlsl_lanes32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vmlsl_lanes32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vmlsl_lanes32.c 2010-01-25 09:50:29.405687154 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vmlsl_laneu16.c b/gcc/testsuite/gcc.target/arm/neon/vmlsl_laneu16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vmlsl_laneu16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vmlsl_laneu16.c 2010-01-25 09:50:29.405687154 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vmlsl_laneu32.c b/gcc/testsuite/gcc.target/arm/neon/vmlsl_laneu32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vmlsl_laneu32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vmlsl_laneu32.c 2010-01-25 09:50:29.405687154 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vmlsl_ns16.c b/gcc/testsuite/gcc.target/arm/neon/vmlsl_ns16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vmlsl_ns16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vmlsl_ns16.c 2010-01-25 09:50:29.405687154 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vmlsl_ns32.c b/gcc/testsuite/gcc.target/arm/neon/vmlsl_ns32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vmlsl_ns32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vmlsl_ns32.c 2010-01-25 09:50:29.405687154 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vmlsl_nu16.c b/gcc/testsuite/gcc.target/arm/neon/vmlsl_nu16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vmlsl_nu16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vmlsl_nu16.c 2010-01-25 09:50:29.405687154 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vmlsl_nu32.c b/gcc/testsuite/gcc.target/arm/neon/vmlsl_nu32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vmlsl_nu32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vmlsl_nu32.c 2010-01-25 09:50:29.405687154 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vmlsls16.c b/gcc/testsuite/gcc.target/arm/neon/vmlsls16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vmlsls16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vmlsls16.c 2010-01-25 09:50:29.405687154 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vmlsls32.c b/gcc/testsuite/gcc.target/arm/neon/vmlsls32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vmlsls32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vmlsls32.c 2010-01-25 09:50:29.405687154 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vmlsls8.c b/gcc/testsuite/gcc.target/arm/neon/vmlsls8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vmlsls8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vmlsls8.c 2010-01-25 09:50:29.405687154 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vmlslu16.c b/gcc/testsuite/gcc.target/arm/neon/vmlslu16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vmlslu16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vmlslu16.c 2010-01-25 09:50:29.415686609 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vmlslu32.c b/gcc/testsuite/gcc.target/arm/neon/vmlslu32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vmlslu32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vmlslu32.c 2010-01-25 09:50:29.415686609 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vmlslu8.c b/gcc/testsuite/gcc.target/arm/neon/vmlslu8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vmlslu8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vmlslu8.c 2010-01-25 09:50:29.415686609 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vmls_nf32.c b/gcc/testsuite/gcc.target/arm/neon/vmls_nf32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vmls_nf32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vmls_nf32.c 2010-01-25 09:50:29.415686609 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vmls_ns16.c b/gcc/testsuite/gcc.target/arm/neon/vmls_ns16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vmls_ns16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vmls_ns16.c 2010-01-25 09:50:29.415686609 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vmls_ns32.c b/gcc/testsuite/gcc.target/arm/neon/vmls_ns32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vmls_ns32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vmls_ns32.c 2010-01-25 09:50:29.415686609 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vmls_nu16.c b/gcc/testsuite/gcc.target/arm/neon/vmls_nu16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vmls_nu16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vmls_nu16.c 2010-01-25 09:50:29.415686609 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vmls_nu32.c b/gcc/testsuite/gcc.target/arm/neon/vmls_nu32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vmls_nu32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vmls_nu32.c 2010-01-25 09:50:29.415686609 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vmlsQf32.c b/gcc/testsuite/gcc.target/arm/neon/vmlsQf32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vmlsQf32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vmlsQf32.c 2010-01-25 09:50:29.415686609 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vmlsQ_lanef32.c b/gcc/testsuite/gcc.target/arm/neon/vmlsQ_lanef32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vmlsQ_lanef32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vmlsQ_lanef32.c 2010-01-25 09:50:29.415686609 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vmlsQ_lanes16.c b/gcc/testsuite/gcc.target/arm/neon/vmlsQ_lanes16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vmlsQ_lanes16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vmlsQ_lanes16.c 2010-01-25 09:50:29.415686609 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vmlsQ_lanes32.c b/gcc/testsuite/gcc.target/arm/neon/vmlsQ_lanes32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vmlsQ_lanes32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vmlsQ_lanes32.c 2010-01-25 09:50:29.415686609 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vmlsQ_laneu16.c b/gcc/testsuite/gcc.target/arm/neon/vmlsQ_laneu16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vmlsQ_laneu16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vmlsQ_laneu16.c 2010-01-25 09:50:29.415686609 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vmlsQ_laneu32.c b/gcc/testsuite/gcc.target/arm/neon/vmlsQ_laneu32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vmlsQ_laneu32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vmlsQ_laneu32.c 2010-01-25 09:50:29.415686609 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vmlsQ_nf32.c b/gcc/testsuite/gcc.target/arm/neon/vmlsQ_nf32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vmlsQ_nf32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vmlsQ_nf32.c 2010-01-25 09:50:29.415686609 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vmlsQ_ns16.c b/gcc/testsuite/gcc.target/arm/neon/vmlsQ_ns16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vmlsQ_ns16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vmlsQ_ns16.c 2010-01-25 09:50:29.415686609 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vmlsQ_ns32.c b/gcc/testsuite/gcc.target/arm/neon/vmlsQ_ns32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vmlsQ_ns32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vmlsQ_ns32.c 2010-01-25 09:50:29.415686609 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vmlsQ_nu16.c b/gcc/testsuite/gcc.target/arm/neon/vmlsQ_nu16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vmlsQ_nu16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vmlsQ_nu16.c 2010-01-25 09:50:29.415686609 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vmlsQ_nu32.c b/gcc/testsuite/gcc.target/arm/neon/vmlsQ_nu32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vmlsQ_nu32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vmlsQ_nu32.c 2010-01-25 09:50:29.415686609 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vmlsQs16.c b/gcc/testsuite/gcc.target/arm/neon/vmlsQs16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vmlsQs16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vmlsQs16.c 2010-01-25 09:50:29.415686609 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vmlsQs32.c b/gcc/testsuite/gcc.target/arm/neon/vmlsQs32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vmlsQs32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vmlsQs32.c 2010-01-25 09:50:29.415686609 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vmlsQs8.c b/gcc/testsuite/gcc.target/arm/neon/vmlsQs8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vmlsQs8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vmlsQs8.c 2010-01-25 09:50:29.415686609 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vmlsQu16.c b/gcc/testsuite/gcc.target/arm/neon/vmlsQu16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vmlsQu16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vmlsQu16.c 2010-01-25 09:50:29.415686609 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vmlsQu32.c b/gcc/testsuite/gcc.target/arm/neon/vmlsQu32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vmlsQu32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vmlsQu32.c 2010-01-25 09:50:29.415686609 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vmlsQu8.c b/gcc/testsuite/gcc.target/arm/neon/vmlsQu8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vmlsQu8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vmlsQu8.c 2010-01-25 09:50:29.415686609 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vmlss16.c b/gcc/testsuite/gcc.target/arm/neon/vmlss16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vmlss16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vmlss16.c 2010-01-25 09:50:29.415686609 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vmlss32.c b/gcc/testsuite/gcc.target/arm/neon/vmlss32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vmlss32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vmlss32.c 2010-01-25 09:50:29.415686609 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vmlss8.c b/gcc/testsuite/gcc.target/arm/neon/vmlss8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vmlss8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vmlss8.c 2010-01-25 09:50:29.415686609 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vmlsu16.c b/gcc/testsuite/gcc.target/arm/neon/vmlsu16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vmlsu16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vmlsu16.c 2010-01-25 09:50:29.415686609 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vmlsu32.c b/gcc/testsuite/gcc.target/arm/neon/vmlsu32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vmlsu32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vmlsu32.c 2010-01-25 09:50:29.415686609 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vmlsu8.c b/gcc/testsuite/gcc.target/arm/neon/vmlsu8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vmlsu8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vmlsu8.c 2010-01-25 09:50:29.415686609 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vmovls16.c b/gcc/testsuite/gcc.target/arm/neon/vmovls16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vmovls16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vmovls16.c 2010-01-25 09:50:29.415686609 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vmovls32.c b/gcc/testsuite/gcc.target/arm/neon/vmovls32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vmovls32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vmovls32.c 2010-01-25 09:50:29.415686609 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vmovls8.c b/gcc/testsuite/gcc.target/arm/neon/vmovls8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vmovls8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vmovls8.c 2010-01-25 09:50:29.415686609 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vmovlu16.c b/gcc/testsuite/gcc.target/arm/neon/vmovlu16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vmovlu16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vmovlu16.c 2010-01-25 09:50:29.415686609 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vmovlu32.c b/gcc/testsuite/gcc.target/arm/neon/vmovlu32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vmovlu32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vmovlu32.c 2010-01-25 09:50:29.415686609 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vmovlu8.c b/gcc/testsuite/gcc.target/arm/neon/vmovlu8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vmovlu8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vmovlu8.c 2010-01-25 09:50:29.415686609 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vmov_nf32.c b/gcc/testsuite/gcc.target/arm/neon/vmov_nf32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vmov_nf32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vmov_nf32.c 2010-01-25 09:50:29.415686609 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vmov_np16.c b/gcc/testsuite/gcc.target/arm/neon/vmov_np16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vmov_np16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vmov_np16.c 2010-01-25 09:50:29.415686609 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vmov_np8.c b/gcc/testsuite/gcc.target/arm/neon/vmov_np8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vmov_np8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vmov_np8.c 2010-01-25 09:50:29.415686609 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vmov_ns16.c b/gcc/testsuite/gcc.target/arm/neon/vmov_ns16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vmov_ns16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vmov_ns16.c 2010-01-25 09:50:29.415686609 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vmovns16.c b/gcc/testsuite/gcc.target/arm/neon/vmovns16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vmovns16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vmovns16.c 2010-01-25 09:50:29.415686609 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vmov_ns32.c b/gcc/testsuite/gcc.target/arm/neon/vmov_ns32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vmov_ns32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vmov_ns32.c 2010-01-25 09:50:29.415686609 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vmovns32.c b/gcc/testsuite/gcc.target/arm/neon/vmovns32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vmovns32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vmovns32.c 2010-01-25 09:50:29.415686609 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vmov_ns64.c b/gcc/testsuite/gcc.target/arm/neon/vmov_ns64.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vmov_ns64.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vmov_ns64.c 2010-01-25 09:50:29.415686609 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vmovns64.c b/gcc/testsuite/gcc.target/arm/neon/vmovns64.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vmovns64.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vmovns64.c 2010-01-25 09:50:29.415686609 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vmov_ns8.c b/gcc/testsuite/gcc.target/arm/neon/vmov_ns8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vmov_ns8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vmov_ns8.c 2010-01-25 09:50:29.415686609 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vmov_nu16.c b/gcc/testsuite/gcc.target/arm/neon/vmov_nu16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vmov_nu16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vmov_nu16.c 2010-01-25 09:50:29.415686609 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vmovnu16.c b/gcc/testsuite/gcc.target/arm/neon/vmovnu16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vmovnu16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vmovnu16.c 2010-01-25 09:50:29.415686609 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vmov_nu32.c b/gcc/testsuite/gcc.target/arm/neon/vmov_nu32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vmov_nu32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vmov_nu32.c 2010-01-25 09:50:29.415686609 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vmovnu32.c b/gcc/testsuite/gcc.target/arm/neon/vmovnu32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vmovnu32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vmovnu32.c 2010-01-25 09:50:29.415686609 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vmov_nu64.c b/gcc/testsuite/gcc.target/arm/neon/vmov_nu64.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vmov_nu64.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vmov_nu64.c 2010-01-25 09:50:29.415686609 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vmovnu64.c b/gcc/testsuite/gcc.target/arm/neon/vmovnu64.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vmovnu64.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vmovnu64.c 2010-01-25 09:50:29.415686609 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vmov_nu8.c b/gcc/testsuite/gcc.target/arm/neon/vmov_nu8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vmov_nu8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vmov_nu8.c 2010-01-25 09:50:29.415686609 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vmovQ_nf32.c b/gcc/testsuite/gcc.target/arm/neon/vmovQ_nf32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vmovQ_nf32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vmovQ_nf32.c 2010-01-25 09:50:29.415686609 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vmovQ_np16.c b/gcc/testsuite/gcc.target/arm/neon/vmovQ_np16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vmovQ_np16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vmovQ_np16.c 2010-01-25 09:50:29.415686609 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vmovQ_np8.c b/gcc/testsuite/gcc.target/arm/neon/vmovQ_np8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vmovQ_np8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vmovQ_np8.c 2010-01-25 09:50:29.415686609 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vmovQ_ns16.c b/gcc/testsuite/gcc.target/arm/neon/vmovQ_ns16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vmovQ_ns16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vmovQ_ns16.c 2010-01-25 09:50:29.415686609 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vmovQ_ns32.c b/gcc/testsuite/gcc.target/arm/neon/vmovQ_ns32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vmovQ_ns32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vmovQ_ns32.c 2010-01-25 09:50:29.415686609 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vmovQ_ns64.c b/gcc/testsuite/gcc.target/arm/neon/vmovQ_ns64.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vmovQ_ns64.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vmovQ_ns64.c 2010-01-25 09:50:29.415686609 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vmovQ_ns8.c b/gcc/testsuite/gcc.target/arm/neon/vmovQ_ns8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vmovQ_ns8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vmovQ_ns8.c 2010-01-25 09:50:29.415686609 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vmovQ_nu16.c b/gcc/testsuite/gcc.target/arm/neon/vmovQ_nu16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vmovQ_nu16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vmovQ_nu16.c 2010-01-25 09:50:29.415686609 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vmovQ_nu32.c b/gcc/testsuite/gcc.target/arm/neon/vmovQ_nu32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vmovQ_nu32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vmovQ_nu32.c 2010-01-25 09:50:29.415686609 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vmovQ_nu64.c b/gcc/testsuite/gcc.target/arm/neon/vmovQ_nu64.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vmovQ_nu64.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vmovQ_nu64.c 2010-01-25 09:50:29.415686609 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vmovQ_nu8.c b/gcc/testsuite/gcc.target/arm/neon/vmovQ_nu8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vmovQ_nu8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vmovQ_nu8.c 2010-01-25 09:50:29.415686609 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vmulf32.c b/gcc/testsuite/gcc.target/arm/neon/vmulf32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vmulf32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vmulf32.c 2010-01-25 09:50:29.415686609 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vmul_lanef32.c b/gcc/testsuite/gcc.target/arm/neon/vmul_lanef32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vmul_lanef32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vmul_lanef32.c 2010-01-25 09:50:29.415686609 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vmul_lanes16.c b/gcc/testsuite/gcc.target/arm/neon/vmul_lanes16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vmul_lanes16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vmul_lanes16.c 2010-01-25 09:50:29.415686609 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vmul_lanes32.c b/gcc/testsuite/gcc.target/arm/neon/vmul_lanes32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vmul_lanes32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vmul_lanes32.c 2010-01-25 09:50:29.415686609 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vmul_laneu16.c b/gcc/testsuite/gcc.target/arm/neon/vmul_laneu16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vmul_laneu16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vmul_laneu16.c 2010-01-25 09:50:29.415686609 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vmul_laneu32.c b/gcc/testsuite/gcc.target/arm/neon/vmul_laneu32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vmul_laneu32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vmul_laneu32.c 2010-01-25 09:50:29.415686609 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vmull_lanes16.c b/gcc/testsuite/gcc.target/arm/neon/vmull_lanes16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vmull_lanes16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vmull_lanes16.c 2010-01-25 09:50:29.415686609 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vmull_lanes32.c b/gcc/testsuite/gcc.target/arm/neon/vmull_lanes32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vmull_lanes32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vmull_lanes32.c 2010-01-25 09:50:29.425686763 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vmull_laneu16.c b/gcc/testsuite/gcc.target/arm/neon/vmull_laneu16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vmull_laneu16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vmull_laneu16.c 2010-01-25 09:50:29.425686763 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vmull_laneu32.c b/gcc/testsuite/gcc.target/arm/neon/vmull_laneu32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vmull_laneu32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vmull_laneu32.c 2010-01-25 09:50:29.425686763 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vmull_ns16.c b/gcc/testsuite/gcc.target/arm/neon/vmull_ns16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vmull_ns16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vmull_ns16.c 2010-01-25 09:50:29.425686763 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vmull_ns32.c b/gcc/testsuite/gcc.target/arm/neon/vmull_ns32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vmull_ns32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vmull_ns32.c 2010-01-25 09:50:29.425686763 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vmull_nu16.c b/gcc/testsuite/gcc.target/arm/neon/vmull_nu16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vmull_nu16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vmull_nu16.c 2010-01-25 09:50:29.425686763 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vmull_nu32.c b/gcc/testsuite/gcc.target/arm/neon/vmull_nu32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vmull_nu32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vmull_nu32.c 2010-01-25 09:50:29.425686763 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vmullp8.c b/gcc/testsuite/gcc.target/arm/neon/vmullp8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vmullp8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vmullp8.c 2010-01-25 09:50:29.425686763 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vmulls16.c b/gcc/testsuite/gcc.target/arm/neon/vmulls16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vmulls16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vmulls16.c 2010-01-25 09:50:29.425686763 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vmulls32.c b/gcc/testsuite/gcc.target/arm/neon/vmulls32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vmulls32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vmulls32.c 2010-01-25 09:50:29.425686763 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vmulls8.c b/gcc/testsuite/gcc.target/arm/neon/vmulls8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vmulls8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vmulls8.c 2010-01-25 09:50:29.425686763 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vmullu16.c b/gcc/testsuite/gcc.target/arm/neon/vmullu16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vmullu16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vmullu16.c 2010-01-25 09:50:29.425686763 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vmullu32.c b/gcc/testsuite/gcc.target/arm/neon/vmullu32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vmullu32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vmullu32.c 2010-01-25 09:50:29.425686763 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vmullu8.c b/gcc/testsuite/gcc.target/arm/neon/vmullu8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vmullu8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vmullu8.c 2010-01-25 09:50:29.425686763 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vmul_nf32.c b/gcc/testsuite/gcc.target/arm/neon/vmul_nf32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vmul_nf32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vmul_nf32.c 2010-01-25 09:50:29.425686763 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vmul_ns16.c b/gcc/testsuite/gcc.target/arm/neon/vmul_ns16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vmul_ns16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vmul_ns16.c 2010-01-25 09:50:29.425686763 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vmul_ns32.c b/gcc/testsuite/gcc.target/arm/neon/vmul_ns32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vmul_ns32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vmul_ns32.c 2010-01-25 09:50:29.425686763 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vmul_nu16.c b/gcc/testsuite/gcc.target/arm/neon/vmul_nu16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vmul_nu16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vmul_nu16.c 2010-01-25 09:50:29.425686763 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vmul_nu32.c b/gcc/testsuite/gcc.target/arm/neon/vmul_nu32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vmul_nu32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vmul_nu32.c 2010-01-25 09:50:29.425686763 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vmulp8.c b/gcc/testsuite/gcc.target/arm/neon/vmulp8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vmulp8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vmulp8.c 2010-01-25 09:50:29.425686763 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vmulQf32.c b/gcc/testsuite/gcc.target/arm/neon/vmulQf32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vmulQf32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vmulQf32.c 2010-01-25 09:50:29.425686763 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vmulQ_lanef32.c b/gcc/testsuite/gcc.target/arm/neon/vmulQ_lanef32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vmulQ_lanef32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vmulQ_lanef32.c 2010-01-25 09:50:29.425686763 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vmulQ_lanes16.c b/gcc/testsuite/gcc.target/arm/neon/vmulQ_lanes16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vmulQ_lanes16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vmulQ_lanes16.c 2010-01-25 09:50:29.425686763 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vmulQ_lanes32.c b/gcc/testsuite/gcc.target/arm/neon/vmulQ_lanes32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vmulQ_lanes32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vmulQ_lanes32.c 2010-01-25 09:50:29.425686763 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vmulQ_laneu16.c b/gcc/testsuite/gcc.target/arm/neon/vmulQ_laneu16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vmulQ_laneu16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vmulQ_laneu16.c 2010-01-25 09:50:29.425686763 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vmulQ_laneu32.c b/gcc/testsuite/gcc.target/arm/neon/vmulQ_laneu32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vmulQ_laneu32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vmulQ_laneu32.c 2010-01-25 09:50:29.425686763 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vmulQ_nf32.c b/gcc/testsuite/gcc.target/arm/neon/vmulQ_nf32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vmulQ_nf32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vmulQ_nf32.c 2010-01-25 09:50:29.425686763 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vmulQ_ns16.c b/gcc/testsuite/gcc.target/arm/neon/vmulQ_ns16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vmulQ_ns16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vmulQ_ns16.c 2010-01-25 09:50:29.425686763 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vmulQ_ns32.c b/gcc/testsuite/gcc.target/arm/neon/vmulQ_ns32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vmulQ_ns32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vmulQ_ns32.c 2010-01-25 09:50:29.425686763 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vmulQ_nu16.c b/gcc/testsuite/gcc.target/arm/neon/vmulQ_nu16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vmulQ_nu16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vmulQ_nu16.c 2010-01-25 09:50:29.425686763 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vmulQ_nu32.c b/gcc/testsuite/gcc.target/arm/neon/vmulQ_nu32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vmulQ_nu32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vmulQ_nu32.c 2010-01-25 09:50:29.425686763 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vmulQp8.c b/gcc/testsuite/gcc.target/arm/neon/vmulQp8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vmulQp8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vmulQp8.c 2010-01-25 09:50:29.425686763 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vmulQs16.c b/gcc/testsuite/gcc.target/arm/neon/vmulQs16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vmulQs16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vmulQs16.c 2010-01-25 09:50:29.425686763 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vmulQs32.c b/gcc/testsuite/gcc.target/arm/neon/vmulQs32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vmulQs32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vmulQs32.c 2010-01-25 09:50:29.425686763 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vmulQs8.c b/gcc/testsuite/gcc.target/arm/neon/vmulQs8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vmulQs8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vmulQs8.c 2010-01-25 09:50:29.425686763 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vmulQu16.c b/gcc/testsuite/gcc.target/arm/neon/vmulQu16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vmulQu16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vmulQu16.c 2010-01-25 09:50:29.425686763 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vmulQu32.c b/gcc/testsuite/gcc.target/arm/neon/vmulQu32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vmulQu32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vmulQu32.c 2010-01-25 09:50:29.425686763 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vmulQu8.c b/gcc/testsuite/gcc.target/arm/neon/vmulQu8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vmulQu8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vmulQu8.c 2010-01-25 09:50:29.425686763 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vmuls16.c b/gcc/testsuite/gcc.target/arm/neon/vmuls16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vmuls16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vmuls16.c 2010-01-25 09:50:29.425686763 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vmuls32.c b/gcc/testsuite/gcc.target/arm/neon/vmuls32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vmuls32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vmuls32.c 2010-01-25 09:50:29.425686763 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vmuls8.c b/gcc/testsuite/gcc.target/arm/neon/vmuls8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vmuls8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vmuls8.c 2010-01-25 09:50:29.425686763 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vmulu16.c b/gcc/testsuite/gcc.target/arm/neon/vmulu16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vmulu16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vmulu16.c 2010-01-25 09:50:29.425686763 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vmulu32.c b/gcc/testsuite/gcc.target/arm/neon/vmulu32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vmulu32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vmulu32.c 2010-01-25 09:50:29.425686763 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vmulu8.c b/gcc/testsuite/gcc.target/arm/neon/vmulu8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vmulu8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vmulu8.c 2010-01-25 09:50:29.425686763 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vmvnp8.c b/gcc/testsuite/gcc.target/arm/neon/vmvnp8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vmvnp8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vmvnp8.c 2010-01-25 09:50:29.425686763 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vmvnQp8.c b/gcc/testsuite/gcc.target/arm/neon/vmvnQp8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vmvnQp8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vmvnQp8.c 2010-01-25 09:50:29.425686763 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vmvnQs16.c b/gcc/testsuite/gcc.target/arm/neon/vmvnQs16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vmvnQs16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vmvnQs16.c 2010-01-25 09:50:29.425686763 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vmvnQs32.c b/gcc/testsuite/gcc.target/arm/neon/vmvnQs32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vmvnQs32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vmvnQs32.c 2010-01-25 09:50:29.425686763 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vmvnQs8.c b/gcc/testsuite/gcc.target/arm/neon/vmvnQs8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vmvnQs8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vmvnQs8.c 2010-01-25 09:50:29.425686763 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vmvnQu16.c b/gcc/testsuite/gcc.target/arm/neon/vmvnQu16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vmvnQu16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vmvnQu16.c 2010-01-25 09:50:29.425686763 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vmvnQu32.c b/gcc/testsuite/gcc.target/arm/neon/vmvnQu32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vmvnQu32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vmvnQu32.c 2010-01-25 09:50:29.425686763 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vmvnQu8.c b/gcc/testsuite/gcc.target/arm/neon/vmvnQu8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vmvnQu8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vmvnQu8.c 2010-01-25 09:50:29.425686763 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vmvns16.c b/gcc/testsuite/gcc.target/arm/neon/vmvns16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vmvns16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vmvns16.c 2010-01-25 09:50:29.425686763 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vmvns32.c b/gcc/testsuite/gcc.target/arm/neon/vmvns32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vmvns32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vmvns32.c 2010-01-25 09:50:29.425686763 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vmvns8.c b/gcc/testsuite/gcc.target/arm/neon/vmvns8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vmvns8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vmvns8.c 2010-01-25 09:50:29.425686763 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vmvnu16.c b/gcc/testsuite/gcc.target/arm/neon/vmvnu16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vmvnu16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vmvnu16.c 2010-01-25 09:50:29.425686763 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vmvnu32.c b/gcc/testsuite/gcc.target/arm/neon/vmvnu32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vmvnu32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vmvnu32.c 2010-01-25 09:50:29.425686763 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vmvnu8.c b/gcc/testsuite/gcc.target/arm/neon/vmvnu8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vmvnu8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vmvnu8.c 2010-01-25 09:50:29.425686763 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vnegf32.c b/gcc/testsuite/gcc.target/arm/neon/vnegf32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vnegf32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vnegf32.c 2010-01-25 09:50:29.425686763 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vnegQf32.c b/gcc/testsuite/gcc.target/arm/neon/vnegQf32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vnegQf32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vnegQf32.c 2010-01-25 09:50:29.425686763 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vnegQs16.c b/gcc/testsuite/gcc.target/arm/neon/vnegQs16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vnegQs16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vnegQs16.c 2010-01-25 09:50:29.425686763 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vnegQs32.c b/gcc/testsuite/gcc.target/arm/neon/vnegQs32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vnegQs32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vnegQs32.c 2010-01-25 09:50:29.425686763 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vnegQs8.c b/gcc/testsuite/gcc.target/arm/neon/vnegQs8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vnegQs8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vnegQs8.c 2010-01-25 09:50:29.425686763 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vnegs16.c b/gcc/testsuite/gcc.target/arm/neon/vnegs16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vnegs16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vnegs16.c 2010-01-25 09:50:29.425686763 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vnegs32.c b/gcc/testsuite/gcc.target/arm/neon/vnegs32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vnegs32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vnegs32.c 2010-01-25 09:50:29.425686763 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vnegs8.c b/gcc/testsuite/gcc.target/arm/neon/vnegs8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vnegs8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vnegs8.c 2010-01-25 09:50:29.425686763 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vornQs16.c b/gcc/testsuite/gcc.target/arm/neon/vornQs16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vornQs16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vornQs16.c 2010-01-25 09:50:29.425686763 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vornQs32.c b/gcc/testsuite/gcc.target/arm/neon/vornQs32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vornQs32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vornQs32.c 2010-01-25 09:50:29.425686763 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vornQs64.c b/gcc/testsuite/gcc.target/arm/neon/vornQs64.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vornQs64.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vornQs64.c 2010-01-25 09:50:29.425686763 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vornQs8.c b/gcc/testsuite/gcc.target/arm/neon/vornQs8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vornQs8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vornQs8.c 2010-01-25 09:50:29.425686763 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vornQu16.c b/gcc/testsuite/gcc.target/arm/neon/vornQu16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vornQu16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vornQu16.c 2010-01-25 09:50:29.425686763 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vornQu32.c b/gcc/testsuite/gcc.target/arm/neon/vornQu32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vornQu32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vornQu32.c 2010-01-25 09:50:29.425686763 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vornQu64.c b/gcc/testsuite/gcc.target/arm/neon/vornQu64.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vornQu64.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vornQu64.c 2010-01-25 09:50:29.425686763 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vornQu8.c b/gcc/testsuite/gcc.target/arm/neon/vornQu8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vornQu8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vornQu8.c 2010-01-25 09:50:29.435686987 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vorns16.c b/gcc/testsuite/gcc.target/arm/neon/vorns16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vorns16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vorns16.c 2010-01-25 09:50:29.435686987 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vorns32.c b/gcc/testsuite/gcc.target/arm/neon/vorns32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vorns32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vorns32.c 2010-01-25 09:50:29.435686987 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vorns64.c b/gcc/testsuite/gcc.target/arm/neon/vorns64.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vorns64.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vorns64.c 2010-01-25 09:50:29.435686987 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vorns8.c b/gcc/testsuite/gcc.target/arm/neon/vorns8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vorns8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vorns8.c 2010-01-25 09:50:29.435686987 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vornu16.c b/gcc/testsuite/gcc.target/arm/neon/vornu16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vornu16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vornu16.c 2010-01-25 09:50:29.435686987 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vornu32.c b/gcc/testsuite/gcc.target/arm/neon/vornu32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vornu32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vornu32.c 2010-01-25 09:50:29.435686987 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vornu64.c b/gcc/testsuite/gcc.target/arm/neon/vornu64.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vornu64.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vornu64.c 2010-01-25 09:50:29.435686987 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vornu8.c b/gcc/testsuite/gcc.target/arm/neon/vornu8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vornu8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vornu8.c 2010-01-25 09:50:29.435686987 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vorrQs16.c b/gcc/testsuite/gcc.target/arm/neon/vorrQs16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vorrQs16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vorrQs16.c 2010-01-25 09:50:29.435686987 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vorrQs32.c b/gcc/testsuite/gcc.target/arm/neon/vorrQs32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vorrQs32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vorrQs32.c 2010-01-25 09:50:29.435686987 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vorrQs64.c b/gcc/testsuite/gcc.target/arm/neon/vorrQs64.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vorrQs64.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vorrQs64.c 2010-01-25 09:50:29.435686987 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vorrQs8.c b/gcc/testsuite/gcc.target/arm/neon/vorrQs8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vorrQs8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vorrQs8.c 2010-01-25 09:50:29.435686987 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vorrQu16.c b/gcc/testsuite/gcc.target/arm/neon/vorrQu16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vorrQu16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vorrQu16.c 2010-01-25 09:50:29.435686987 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vorrQu32.c b/gcc/testsuite/gcc.target/arm/neon/vorrQu32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vorrQu32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vorrQu32.c 2010-01-25 09:50:29.435686987 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vorrQu64.c b/gcc/testsuite/gcc.target/arm/neon/vorrQu64.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vorrQu64.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vorrQu64.c 2010-01-25 09:50:29.435686987 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vorrQu8.c b/gcc/testsuite/gcc.target/arm/neon/vorrQu8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vorrQu8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vorrQu8.c 2010-01-25 09:50:29.435686987 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vorrs16.c b/gcc/testsuite/gcc.target/arm/neon/vorrs16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vorrs16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vorrs16.c 2010-01-25 09:50:29.435686987 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vorrs32.c b/gcc/testsuite/gcc.target/arm/neon/vorrs32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vorrs32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vorrs32.c 2010-01-25 09:50:29.435686987 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vorrs64.c b/gcc/testsuite/gcc.target/arm/neon/vorrs64.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vorrs64.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vorrs64.c 2010-01-25 09:50:29.435686987 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vorrs8.c b/gcc/testsuite/gcc.target/arm/neon/vorrs8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vorrs8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vorrs8.c 2010-01-25 09:50:29.435686987 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vorru16.c b/gcc/testsuite/gcc.target/arm/neon/vorru16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vorru16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vorru16.c 2010-01-25 09:50:29.435686987 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vorru32.c b/gcc/testsuite/gcc.target/arm/neon/vorru32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vorru32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vorru32.c 2010-01-25 09:50:29.435686987 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vorru64.c b/gcc/testsuite/gcc.target/arm/neon/vorru64.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vorru64.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vorru64.c 2010-01-25 09:50:29.435686987 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vorru8.c b/gcc/testsuite/gcc.target/arm/neon/vorru8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vorru8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vorru8.c 2010-01-25 09:50:29.435686987 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vpadalQs16.c b/gcc/testsuite/gcc.target/arm/neon/vpadalQs16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vpadalQs16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vpadalQs16.c 2010-01-25 09:50:29.435686987 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vpadalQs32.c b/gcc/testsuite/gcc.target/arm/neon/vpadalQs32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vpadalQs32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vpadalQs32.c 2010-01-25 09:50:29.435686987 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vpadalQs8.c b/gcc/testsuite/gcc.target/arm/neon/vpadalQs8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vpadalQs8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vpadalQs8.c 2010-01-25 09:50:29.435686987 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vpadalQu16.c b/gcc/testsuite/gcc.target/arm/neon/vpadalQu16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vpadalQu16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vpadalQu16.c 2010-01-25 09:50:29.435686987 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vpadalQu32.c b/gcc/testsuite/gcc.target/arm/neon/vpadalQu32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vpadalQu32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vpadalQu32.c 2010-01-25 09:50:29.435686987 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vpadalQu8.c b/gcc/testsuite/gcc.target/arm/neon/vpadalQu8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vpadalQu8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vpadalQu8.c 2010-01-25 09:50:29.435686987 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vpadals16.c b/gcc/testsuite/gcc.target/arm/neon/vpadals16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vpadals16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vpadals16.c 2010-01-25 09:50:29.435686987 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vpadals32.c b/gcc/testsuite/gcc.target/arm/neon/vpadals32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vpadals32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vpadals32.c 2010-01-25 09:50:29.435686987 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vpadals8.c b/gcc/testsuite/gcc.target/arm/neon/vpadals8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vpadals8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vpadals8.c 2010-01-25 09:50:29.435686987 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vpadalu16.c b/gcc/testsuite/gcc.target/arm/neon/vpadalu16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vpadalu16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vpadalu16.c 2010-01-25 09:50:29.435686987 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vpadalu32.c b/gcc/testsuite/gcc.target/arm/neon/vpadalu32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vpadalu32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vpadalu32.c 2010-01-25 09:50:29.435686987 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vpadalu8.c b/gcc/testsuite/gcc.target/arm/neon/vpadalu8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vpadalu8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vpadalu8.c 2010-01-25 09:50:29.435686987 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vpaddf32.c b/gcc/testsuite/gcc.target/arm/neon/vpaddf32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vpaddf32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vpaddf32.c 2010-01-25 09:50:29.435686987 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vpaddlQs16.c b/gcc/testsuite/gcc.target/arm/neon/vpaddlQs16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vpaddlQs16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vpaddlQs16.c 2010-01-25 09:50:29.435686987 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vpaddlQs32.c b/gcc/testsuite/gcc.target/arm/neon/vpaddlQs32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vpaddlQs32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vpaddlQs32.c 2010-01-25 09:50:29.435686987 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vpaddlQs8.c b/gcc/testsuite/gcc.target/arm/neon/vpaddlQs8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vpaddlQs8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vpaddlQs8.c 2010-01-25 09:50:29.435686987 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vpaddlQu16.c b/gcc/testsuite/gcc.target/arm/neon/vpaddlQu16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vpaddlQu16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vpaddlQu16.c 2010-01-25 09:50:29.435686987 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vpaddlQu32.c b/gcc/testsuite/gcc.target/arm/neon/vpaddlQu32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vpaddlQu32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vpaddlQu32.c 2010-01-25 09:50:29.435686987 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vpaddlQu8.c b/gcc/testsuite/gcc.target/arm/neon/vpaddlQu8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vpaddlQu8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vpaddlQu8.c 2010-01-25 09:50:29.435686987 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vpaddls16.c b/gcc/testsuite/gcc.target/arm/neon/vpaddls16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vpaddls16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vpaddls16.c 2010-01-25 09:50:29.435686987 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vpaddls32.c b/gcc/testsuite/gcc.target/arm/neon/vpaddls32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vpaddls32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vpaddls32.c 2010-01-25 09:50:29.435686987 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vpaddls8.c b/gcc/testsuite/gcc.target/arm/neon/vpaddls8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vpaddls8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vpaddls8.c 2010-01-25 09:50:29.435686987 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vpaddlu16.c b/gcc/testsuite/gcc.target/arm/neon/vpaddlu16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vpaddlu16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vpaddlu16.c 2010-01-25 09:50:29.435686987 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vpaddlu32.c b/gcc/testsuite/gcc.target/arm/neon/vpaddlu32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vpaddlu32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vpaddlu32.c 2010-01-25 09:50:29.435686987 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vpaddlu8.c b/gcc/testsuite/gcc.target/arm/neon/vpaddlu8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vpaddlu8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vpaddlu8.c 2010-01-25 09:50:29.435686987 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vpadds16.c b/gcc/testsuite/gcc.target/arm/neon/vpadds16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vpadds16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vpadds16.c 2010-01-25 09:50:29.435686987 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vpadds32.c b/gcc/testsuite/gcc.target/arm/neon/vpadds32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vpadds32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vpadds32.c 2010-01-25 09:50:29.435686987 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vpadds8.c b/gcc/testsuite/gcc.target/arm/neon/vpadds8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vpadds8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vpadds8.c 2010-01-25 09:50:29.435686987 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vpaddu16.c b/gcc/testsuite/gcc.target/arm/neon/vpaddu16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vpaddu16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vpaddu16.c 2010-01-25 09:50:29.435686987 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vpaddu32.c b/gcc/testsuite/gcc.target/arm/neon/vpaddu32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vpaddu32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vpaddu32.c 2010-01-25 09:50:29.435686987 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vpaddu8.c b/gcc/testsuite/gcc.target/arm/neon/vpaddu8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vpaddu8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vpaddu8.c 2010-01-25 09:50:29.435686987 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vpmaxf32.c b/gcc/testsuite/gcc.target/arm/neon/vpmaxf32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vpmaxf32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vpmaxf32.c 2010-01-25 09:50:29.435686987 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vpmaxs16.c b/gcc/testsuite/gcc.target/arm/neon/vpmaxs16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vpmaxs16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vpmaxs16.c 2010-01-25 09:50:29.435686987 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vpmaxs32.c b/gcc/testsuite/gcc.target/arm/neon/vpmaxs32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vpmaxs32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vpmaxs32.c 2010-01-25 09:50:29.435686987 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vpmaxs8.c b/gcc/testsuite/gcc.target/arm/neon/vpmaxs8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vpmaxs8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vpmaxs8.c 2010-01-25 09:50:29.435686987 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vpmaxu16.c b/gcc/testsuite/gcc.target/arm/neon/vpmaxu16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vpmaxu16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vpmaxu16.c 2010-01-25 09:50:29.435686987 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vpmaxu32.c b/gcc/testsuite/gcc.target/arm/neon/vpmaxu32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vpmaxu32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vpmaxu32.c 2010-01-25 09:50:29.435686987 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vpmaxu8.c b/gcc/testsuite/gcc.target/arm/neon/vpmaxu8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vpmaxu8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vpmaxu8.c 2010-01-25 09:50:29.435686987 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vpminf32.c b/gcc/testsuite/gcc.target/arm/neon/vpminf32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vpminf32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vpminf32.c 2010-01-25 09:50:29.435686987 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vpmins16.c b/gcc/testsuite/gcc.target/arm/neon/vpmins16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vpmins16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vpmins16.c 2010-01-25 09:50:29.435686987 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vpmins32.c b/gcc/testsuite/gcc.target/arm/neon/vpmins32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vpmins32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vpmins32.c 2010-01-25 09:50:29.435686987 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vpmins8.c b/gcc/testsuite/gcc.target/arm/neon/vpmins8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vpmins8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vpmins8.c 2010-01-25 09:50:29.435686987 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vpminu16.c b/gcc/testsuite/gcc.target/arm/neon/vpminu16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vpminu16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vpminu16.c 2010-01-25 09:50:29.435686987 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vpminu32.c b/gcc/testsuite/gcc.target/arm/neon/vpminu32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vpminu32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vpminu32.c 2010-01-25 09:50:29.435686987 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vpminu8.c b/gcc/testsuite/gcc.target/arm/neon/vpminu8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vpminu8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vpminu8.c 2010-01-25 09:50:29.435686987 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vqabsQs16.c b/gcc/testsuite/gcc.target/arm/neon/vqabsQs16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vqabsQs16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vqabsQs16.c 2010-01-25 09:50:29.435686987 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vqabsQs32.c b/gcc/testsuite/gcc.target/arm/neon/vqabsQs32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vqabsQs32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vqabsQs32.c 2010-01-25 09:50:29.435686987 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vqabsQs8.c b/gcc/testsuite/gcc.target/arm/neon/vqabsQs8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vqabsQs8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vqabsQs8.c 2010-01-25 09:50:29.435686987 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vqabss16.c b/gcc/testsuite/gcc.target/arm/neon/vqabss16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vqabss16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vqabss16.c 2010-01-25 09:50:29.435686987 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vqabss32.c b/gcc/testsuite/gcc.target/arm/neon/vqabss32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vqabss32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vqabss32.c 2010-01-25 09:50:29.445687421 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vqabss8.c b/gcc/testsuite/gcc.target/arm/neon/vqabss8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vqabss8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vqabss8.c 2010-01-25 09:50:29.445687421 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vqaddQs16.c b/gcc/testsuite/gcc.target/arm/neon/vqaddQs16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vqaddQs16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vqaddQs16.c 2010-01-25 09:50:29.445687421 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vqaddQs32.c b/gcc/testsuite/gcc.target/arm/neon/vqaddQs32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vqaddQs32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vqaddQs32.c 2010-01-25 09:50:29.445687421 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vqaddQs64.c b/gcc/testsuite/gcc.target/arm/neon/vqaddQs64.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vqaddQs64.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vqaddQs64.c 2010-01-25 09:50:29.445687421 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vqaddQs8.c b/gcc/testsuite/gcc.target/arm/neon/vqaddQs8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vqaddQs8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vqaddQs8.c 2010-01-25 09:50:29.445687421 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vqaddQu16.c b/gcc/testsuite/gcc.target/arm/neon/vqaddQu16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vqaddQu16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vqaddQu16.c 2010-01-25 09:50:29.445687421 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vqaddQu32.c b/gcc/testsuite/gcc.target/arm/neon/vqaddQu32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vqaddQu32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vqaddQu32.c 2010-01-25 09:50:29.445687421 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vqaddQu64.c b/gcc/testsuite/gcc.target/arm/neon/vqaddQu64.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vqaddQu64.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vqaddQu64.c 2010-01-25 09:50:29.445687421 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vqaddQu8.c b/gcc/testsuite/gcc.target/arm/neon/vqaddQu8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vqaddQu8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vqaddQu8.c 2010-01-25 09:50:29.445687421 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vqadds16.c b/gcc/testsuite/gcc.target/arm/neon/vqadds16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vqadds16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vqadds16.c 2010-01-25 09:50:29.445687421 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vqadds32.c b/gcc/testsuite/gcc.target/arm/neon/vqadds32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vqadds32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vqadds32.c 2010-01-25 09:50:29.445687421 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vqadds64.c b/gcc/testsuite/gcc.target/arm/neon/vqadds64.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vqadds64.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vqadds64.c 2010-01-25 09:50:29.445687421 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vqadds8.c b/gcc/testsuite/gcc.target/arm/neon/vqadds8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vqadds8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vqadds8.c 2010-01-25 09:50:29.445687421 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vqaddu16.c b/gcc/testsuite/gcc.target/arm/neon/vqaddu16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vqaddu16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vqaddu16.c 2010-01-25 09:50:29.445687421 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vqaddu32.c b/gcc/testsuite/gcc.target/arm/neon/vqaddu32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vqaddu32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vqaddu32.c 2010-01-25 09:50:29.445687421 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vqaddu64.c b/gcc/testsuite/gcc.target/arm/neon/vqaddu64.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vqaddu64.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vqaddu64.c 2010-01-25 09:50:29.445687421 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vqaddu8.c b/gcc/testsuite/gcc.target/arm/neon/vqaddu8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vqaddu8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vqaddu8.c 2010-01-25 09:50:29.445687421 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vqdmlal_lanes16.c b/gcc/testsuite/gcc.target/arm/neon/vqdmlal_lanes16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vqdmlal_lanes16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vqdmlal_lanes16.c 2010-01-25 09:50:29.445687421 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vqdmlal_lanes32.c b/gcc/testsuite/gcc.target/arm/neon/vqdmlal_lanes32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vqdmlal_lanes32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vqdmlal_lanes32.c 2010-01-25 09:50:29.445687421 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vqdmlal_ns16.c b/gcc/testsuite/gcc.target/arm/neon/vqdmlal_ns16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vqdmlal_ns16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vqdmlal_ns16.c 2010-01-25 09:50:29.445687421 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vqdmlal_ns32.c b/gcc/testsuite/gcc.target/arm/neon/vqdmlal_ns32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vqdmlal_ns32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vqdmlal_ns32.c 2010-01-25 09:50:29.445687421 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vqdmlals16.c b/gcc/testsuite/gcc.target/arm/neon/vqdmlals16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vqdmlals16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vqdmlals16.c 2010-01-25 09:50:29.445687421 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vqdmlals32.c b/gcc/testsuite/gcc.target/arm/neon/vqdmlals32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vqdmlals32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vqdmlals32.c 2010-01-25 09:50:29.445687421 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vqdmlsl_lanes16.c b/gcc/testsuite/gcc.target/arm/neon/vqdmlsl_lanes16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vqdmlsl_lanes16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vqdmlsl_lanes16.c 2010-01-25 09:50:29.445687421 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vqdmlsl_lanes32.c b/gcc/testsuite/gcc.target/arm/neon/vqdmlsl_lanes32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vqdmlsl_lanes32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vqdmlsl_lanes32.c 2010-01-25 09:50:29.445687421 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vqdmlsl_ns16.c b/gcc/testsuite/gcc.target/arm/neon/vqdmlsl_ns16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vqdmlsl_ns16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vqdmlsl_ns16.c 2010-01-25 09:50:29.445687421 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vqdmlsl_ns32.c b/gcc/testsuite/gcc.target/arm/neon/vqdmlsl_ns32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vqdmlsl_ns32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vqdmlsl_ns32.c 2010-01-25 09:50:29.445687421 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vqdmlsls16.c b/gcc/testsuite/gcc.target/arm/neon/vqdmlsls16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vqdmlsls16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vqdmlsls16.c 2010-01-25 09:50:29.445687421 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vqdmlsls32.c b/gcc/testsuite/gcc.target/arm/neon/vqdmlsls32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vqdmlsls32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vqdmlsls32.c 2010-01-25 09:50:29.445687421 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vqdmulh_lanes16.c b/gcc/testsuite/gcc.target/arm/neon/vqdmulh_lanes16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vqdmulh_lanes16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vqdmulh_lanes16.c 2010-01-25 09:50:29.445687421 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vqdmulh_lanes32.c b/gcc/testsuite/gcc.target/arm/neon/vqdmulh_lanes32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vqdmulh_lanes32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vqdmulh_lanes32.c 2010-01-25 09:50:29.445687421 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vqdmulh_ns16.c b/gcc/testsuite/gcc.target/arm/neon/vqdmulh_ns16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vqdmulh_ns16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vqdmulh_ns16.c 2010-01-25 09:50:29.445687421 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vqdmulh_ns32.c b/gcc/testsuite/gcc.target/arm/neon/vqdmulh_ns32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vqdmulh_ns32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vqdmulh_ns32.c 2010-01-25 09:50:29.445687421 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vqdmulhQ_lanes16.c b/gcc/testsuite/gcc.target/arm/neon/vqdmulhQ_lanes16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vqdmulhQ_lanes16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vqdmulhQ_lanes16.c 2010-01-25 09:50:29.445687421 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vqdmulhQ_lanes32.c b/gcc/testsuite/gcc.target/arm/neon/vqdmulhQ_lanes32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vqdmulhQ_lanes32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vqdmulhQ_lanes32.c 2010-01-25 09:50:29.445687421 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vqdmulhQ_ns16.c b/gcc/testsuite/gcc.target/arm/neon/vqdmulhQ_ns16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vqdmulhQ_ns16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vqdmulhQ_ns16.c 2010-01-25 09:50:29.445687421 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vqdmulhQ_ns32.c b/gcc/testsuite/gcc.target/arm/neon/vqdmulhQ_ns32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vqdmulhQ_ns32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vqdmulhQ_ns32.c 2010-01-25 09:50:29.445687421 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vqdmulhQs16.c b/gcc/testsuite/gcc.target/arm/neon/vqdmulhQs16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vqdmulhQs16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vqdmulhQs16.c 2010-01-25 09:50:29.445687421 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vqdmulhQs32.c b/gcc/testsuite/gcc.target/arm/neon/vqdmulhQs32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vqdmulhQs32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vqdmulhQs32.c 2010-01-25 09:50:29.445687421 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vqdmulhs16.c b/gcc/testsuite/gcc.target/arm/neon/vqdmulhs16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vqdmulhs16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vqdmulhs16.c 2010-01-25 09:50:29.445687421 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vqdmulhs32.c b/gcc/testsuite/gcc.target/arm/neon/vqdmulhs32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vqdmulhs32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vqdmulhs32.c 2010-01-25 09:50:29.445687421 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vqdmull_lanes16.c b/gcc/testsuite/gcc.target/arm/neon/vqdmull_lanes16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vqdmull_lanes16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vqdmull_lanes16.c 2010-01-25 09:50:29.445687421 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vqdmull_lanes32.c b/gcc/testsuite/gcc.target/arm/neon/vqdmull_lanes32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vqdmull_lanes32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vqdmull_lanes32.c 2010-01-25 09:50:29.445687421 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vqdmull_ns16.c b/gcc/testsuite/gcc.target/arm/neon/vqdmull_ns16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vqdmull_ns16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vqdmull_ns16.c 2010-01-25 09:50:29.445687421 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vqdmull_ns32.c b/gcc/testsuite/gcc.target/arm/neon/vqdmull_ns32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vqdmull_ns32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vqdmull_ns32.c 2010-01-25 09:50:29.445687421 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vqdmulls16.c b/gcc/testsuite/gcc.target/arm/neon/vqdmulls16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vqdmulls16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vqdmulls16.c 2010-01-25 09:50:29.445687421 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vqdmulls32.c b/gcc/testsuite/gcc.target/arm/neon/vqdmulls32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vqdmulls32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vqdmulls32.c 2010-01-25 09:50:29.445687421 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vqmovns16.c b/gcc/testsuite/gcc.target/arm/neon/vqmovns16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vqmovns16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vqmovns16.c 2010-01-25 09:50:29.445687421 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vqmovns32.c b/gcc/testsuite/gcc.target/arm/neon/vqmovns32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vqmovns32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vqmovns32.c 2010-01-25 09:50:29.445687421 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vqmovns64.c b/gcc/testsuite/gcc.target/arm/neon/vqmovns64.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vqmovns64.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vqmovns64.c 2010-01-25 09:50:29.445687421 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vqmovnu16.c b/gcc/testsuite/gcc.target/arm/neon/vqmovnu16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vqmovnu16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vqmovnu16.c 2010-01-25 09:50:29.445687421 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vqmovnu32.c b/gcc/testsuite/gcc.target/arm/neon/vqmovnu32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vqmovnu32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vqmovnu32.c 2010-01-25 09:50:29.445687421 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vqmovnu64.c b/gcc/testsuite/gcc.target/arm/neon/vqmovnu64.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vqmovnu64.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vqmovnu64.c 2010-01-25 09:50:29.445687421 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vqmovuns16.c b/gcc/testsuite/gcc.target/arm/neon/vqmovuns16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vqmovuns16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vqmovuns16.c 2010-01-25 09:50:29.445687421 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vqmovuns32.c b/gcc/testsuite/gcc.target/arm/neon/vqmovuns32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vqmovuns32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vqmovuns32.c 2010-01-25 09:50:29.445687421 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vqmovuns64.c b/gcc/testsuite/gcc.target/arm/neon/vqmovuns64.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vqmovuns64.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vqmovuns64.c 2010-01-25 09:50:29.445687421 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vqnegQs16.c b/gcc/testsuite/gcc.target/arm/neon/vqnegQs16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vqnegQs16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vqnegQs16.c 2010-01-25 09:50:29.445687421 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vqnegQs32.c b/gcc/testsuite/gcc.target/arm/neon/vqnegQs32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vqnegQs32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vqnegQs32.c 2010-01-25 09:50:29.445687421 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vqnegQs8.c b/gcc/testsuite/gcc.target/arm/neon/vqnegQs8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vqnegQs8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vqnegQs8.c 2010-01-25 09:50:29.445687421 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vqnegs16.c b/gcc/testsuite/gcc.target/arm/neon/vqnegs16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vqnegs16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vqnegs16.c 2010-01-25 09:50:29.445687421 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vqnegs32.c b/gcc/testsuite/gcc.target/arm/neon/vqnegs32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vqnegs32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vqnegs32.c 2010-01-25 09:50:29.445687421 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vqnegs8.c b/gcc/testsuite/gcc.target/arm/neon/vqnegs8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vqnegs8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vqnegs8.c 2010-01-25 09:50:29.445687421 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vqRdmulh_lanes16.c b/gcc/testsuite/gcc.target/arm/neon/vqRdmulh_lanes16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vqRdmulh_lanes16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vqRdmulh_lanes16.c 2010-01-25 09:50:29.445687421 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vqRdmulh_lanes32.c b/gcc/testsuite/gcc.target/arm/neon/vqRdmulh_lanes32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vqRdmulh_lanes32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vqRdmulh_lanes32.c 2010-01-25 09:50:29.445687421 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vqRdmulh_ns16.c b/gcc/testsuite/gcc.target/arm/neon/vqRdmulh_ns16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vqRdmulh_ns16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vqRdmulh_ns16.c 2010-01-25 09:50:29.445687421 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vqRdmulh_ns32.c b/gcc/testsuite/gcc.target/arm/neon/vqRdmulh_ns32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vqRdmulh_ns32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vqRdmulh_ns32.c 2010-01-25 09:50:29.445687421 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vqRdmulhQ_lanes16.c b/gcc/testsuite/gcc.target/arm/neon/vqRdmulhQ_lanes16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vqRdmulhQ_lanes16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vqRdmulhQ_lanes16.c 2010-01-25 09:50:29.445687421 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vqRdmulhQ_lanes32.c b/gcc/testsuite/gcc.target/arm/neon/vqRdmulhQ_lanes32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vqRdmulhQ_lanes32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vqRdmulhQ_lanes32.c 2010-01-25 09:50:29.445687421 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vqRdmulhQ_ns16.c b/gcc/testsuite/gcc.target/arm/neon/vqRdmulhQ_ns16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vqRdmulhQ_ns16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vqRdmulhQ_ns16.c 2010-01-25 09:50:29.445687421 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vqRdmulhQ_ns32.c b/gcc/testsuite/gcc.target/arm/neon/vqRdmulhQ_ns32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vqRdmulhQ_ns32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vqRdmulhQ_ns32.c 2010-01-25 09:50:29.445687421 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vqRdmulhQs16.c b/gcc/testsuite/gcc.target/arm/neon/vqRdmulhQs16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vqRdmulhQs16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vqRdmulhQs16.c 2010-01-25 09:50:29.445687421 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vqRdmulhQs32.c b/gcc/testsuite/gcc.target/arm/neon/vqRdmulhQs32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vqRdmulhQs32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vqRdmulhQs32.c 2010-01-25 09:50:29.455686248 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vqRdmulhs16.c b/gcc/testsuite/gcc.target/arm/neon/vqRdmulhs16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vqRdmulhs16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vqRdmulhs16.c 2010-01-25 09:50:29.455686248 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vqRdmulhs32.c b/gcc/testsuite/gcc.target/arm/neon/vqRdmulhs32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vqRdmulhs32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vqRdmulhs32.c 2010-01-25 09:50:29.455686248 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vqRshlQs16.c b/gcc/testsuite/gcc.target/arm/neon/vqRshlQs16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vqRshlQs16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vqRshlQs16.c 2010-01-25 09:50:29.455686248 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vqRshlQs32.c b/gcc/testsuite/gcc.target/arm/neon/vqRshlQs32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vqRshlQs32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vqRshlQs32.c 2010-01-25 09:50:29.455686248 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vqRshlQs64.c b/gcc/testsuite/gcc.target/arm/neon/vqRshlQs64.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vqRshlQs64.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vqRshlQs64.c 2010-01-25 09:50:29.455686248 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vqRshlQs8.c b/gcc/testsuite/gcc.target/arm/neon/vqRshlQs8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vqRshlQs8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vqRshlQs8.c 2010-01-25 09:50:29.455686248 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vqRshlQu16.c b/gcc/testsuite/gcc.target/arm/neon/vqRshlQu16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vqRshlQu16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vqRshlQu16.c 2010-01-25 09:50:29.455686248 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vqRshlQu32.c b/gcc/testsuite/gcc.target/arm/neon/vqRshlQu32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vqRshlQu32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vqRshlQu32.c 2010-01-25 09:50:29.455686248 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vqRshlQu64.c b/gcc/testsuite/gcc.target/arm/neon/vqRshlQu64.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vqRshlQu64.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vqRshlQu64.c 2010-01-25 09:50:29.455686248 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vqRshlQu8.c b/gcc/testsuite/gcc.target/arm/neon/vqRshlQu8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vqRshlQu8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vqRshlQu8.c 2010-01-25 09:50:29.455686248 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vqRshls16.c b/gcc/testsuite/gcc.target/arm/neon/vqRshls16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vqRshls16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vqRshls16.c 2010-01-25 09:50:29.455686248 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vqRshls32.c b/gcc/testsuite/gcc.target/arm/neon/vqRshls32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vqRshls32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vqRshls32.c 2010-01-25 09:50:29.455686248 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vqRshls64.c b/gcc/testsuite/gcc.target/arm/neon/vqRshls64.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vqRshls64.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vqRshls64.c 2010-01-25 09:50:29.455686248 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vqRshls8.c b/gcc/testsuite/gcc.target/arm/neon/vqRshls8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vqRshls8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vqRshls8.c 2010-01-25 09:50:29.455686248 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vqRshlu16.c b/gcc/testsuite/gcc.target/arm/neon/vqRshlu16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vqRshlu16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vqRshlu16.c 2010-01-25 09:50:29.455686248 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vqRshlu32.c b/gcc/testsuite/gcc.target/arm/neon/vqRshlu32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vqRshlu32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vqRshlu32.c 2010-01-25 09:50:29.455686248 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vqRshlu64.c b/gcc/testsuite/gcc.target/arm/neon/vqRshlu64.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vqRshlu64.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vqRshlu64.c 2010-01-25 09:50:29.455686248 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vqRshlu8.c b/gcc/testsuite/gcc.target/arm/neon/vqRshlu8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vqRshlu8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vqRshlu8.c 2010-01-25 09:50:29.455686248 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vqRshrn_ns16.c b/gcc/testsuite/gcc.target/arm/neon/vqRshrn_ns16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vqRshrn_ns16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vqRshrn_ns16.c 2010-01-25 09:50:29.455686248 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vqRshrn_ns32.c b/gcc/testsuite/gcc.target/arm/neon/vqRshrn_ns32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vqRshrn_ns32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vqRshrn_ns32.c 2010-01-25 09:50:29.455686248 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vqRshrn_ns64.c b/gcc/testsuite/gcc.target/arm/neon/vqRshrn_ns64.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vqRshrn_ns64.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vqRshrn_ns64.c 2010-01-25 09:50:29.455686248 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vqRshrn_nu16.c b/gcc/testsuite/gcc.target/arm/neon/vqRshrn_nu16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vqRshrn_nu16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vqRshrn_nu16.c 2010-01-25 09:50:29.455686248 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vqRshrn_nu32.c b/gcc/testsuite/gcc.target/arm/neon/vqRshrn_nu32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vqRshrn_nu32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vqRshrn_nu32.c 2010-01-25 09:50:29.455686248 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vqRshrn_nu64.c b/gcc/testsuite/gcc.target/arm/neon/vqRshrn_nu64.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vqRshrn_nu64.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vqRshrn_nu64.c 2010-01-25 09:50:29.455686248 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vqRshrun_ns16.c b/gcc/testsuite/gcc.target/arm/neon/vqRshrun_ns16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vqRshrun_ns16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vqRshrun_ns16.c 2010-01-25 09:50:29.455686248 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vqRshrun_ns32.c b/gcc/testsuite/gcc.target/arm/neon/vqRshrun_ns32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vqRshrun_ns32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vqRshrun_ns32.c 2010-01-25 09:50:29.455686248 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vqRshrun_ns64.c b/gcc/testsuite/gcc.target/arm/neon/vqRshrun_ns64.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vqRshrun_ns64.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vqRshrun_ns64.c 2010-01-25 09:50:29.455686248 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vqshl_ns16.c b/gcc/testsuite/gcc.target/arm/neon/vqshl_ns16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vqshl_ns16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vqshl_ns16.c 2010-01-25 09:50:29.455686248 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vqshl_ns32.c b/gcc/testsuite/gcc.target/arm/neon/vqshl_ns32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vqshl_ns32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vqshl_ns32.c 2010-01-25 09:50:29.455686248 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vqshl_ns64.c b/gcc/testsuite/gcc.target/arm/neon/vqshl_ns64.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vqshl_ns64.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vqshl_ns64.c 2010-01-25 09:50:29.455686248 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vqshl_ns8.c b/gcc/testsuite/gcc.target/arm/neon/vqshl_ns8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vqshl_ns8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vqshl_ns8.c 2010-01-25 09:50:29.455686248 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vqshl_nu16.c b/gcc/testsuite/gcc.target/arm/neon/vqshl_nu16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vqshl_nu16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vqshl_nu16.c 2010-01-25 09:50:29.455686248 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vqshl_nu32.c b/gcc/testsuite/gcc.target/arm/neon/vqshl_nu32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vqshl_nu32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vqshl_nu32.c 2010-01-25 09:50:29.455686248 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vqshl_nu64.c b/gcc/testsuite/gcc.target/arm/neon/vqshl_nu64.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vqshl_nu64.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vqshl_nu64.c 2010-01-25 09:50:29.455686248 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vqshl_nu8.c b/gcc/testsuite/gcc.target/arm/neon/vqshl_nu8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vqshl_nu8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vqshl_nu8.c 2010-01-25 09:50:29.455686248 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vqshlQ_ns16.c b/gcc/testsuite/gcc.target/arm/neon/vqshlQ_ns16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vqshlQ_ns16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vqshlQ_ns16.c 2010-01-25 09:50:29.455686248 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vqshlQ_ns32.c b/gcc/testsuite/gcc.target/arm/neon/vqshlQ_ns32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vqshlQ_ns32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vqshlQ_ns32.c 2010-01-25 09:50:29.455686248 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vqshlQ_ns64.c b/gcc/testsuite/gcc.target/arm/neon/vqshlQ_ns64.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vqshlQ_ns64.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vqshlQ_ns64.c 2010-01-25 09:50:29.455686248 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vqshlQ_ns8.c b/gcc/testsuite/gcc.target/arm/neon/vqshlQ_ns8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vqshlQ_ns8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vqshlQ_ns8.c 2010-01-25 09:50:29.455686248 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vqshlQ_nu16.c b/gcc/testsuite/gcc.target/arm/neon/vqshlQ_nu16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vqshlQ_nu16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vqshlQ_nu16.c 2010-01-25 09:50:29.455686248 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vqshlQ_nu32.c b/gcc/testsuite/gcc.target/arm/neon/vqshlQ_nu32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vqshlQ_nu32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vqshlQ_nu32.c 2010-01-25 09:50:29.455686248 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vqshlQ_nu64.c b/gcc/testsuite/gcc.target/arm/neon/vqshlQ_nu64.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vqshlQ_nu64.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vqshlQ_nu64.c 2010-01-25 09:50:29.455686248 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vqshlQ_nu8.c b/gcc/testsuite/gcc.target/arm/neon/vqshlQ_nu8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vqshlQ_nu8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vqshlQ_nu8.c 2010-01-25 09:50:29.455686248 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vqshlQs16.c b/gcc/testsuite/gcc.target/arm/neon/vqshlQs16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vqshlQs16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vqshlQs16.c 2010-01-25 09:50:29.455686248 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vqshlQs32.c b/gcc/testsuite/gcc.target/arm/neon/vqshlQs32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vqshlQs32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vqshlQs32.c 2010-01-25 09:50:29.455686248 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vqshlQs64.c b/gcc/testsuite/gcc.target/arm/neon/vqshlQs64.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vqshlQs64.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vqshlQs64.c 2010-01-25 09:50:29.455686248 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vqshlQs8.c b/gcc/testsuite/gcc.target/arm/neon/vqshlQs8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vqshlQs8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vqshlQs8.c 2010-01-25 09:50:29.455686248 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vqshlQu16.c b/gcc/testsuite/gcc.target/arm/neon/vqshlQu16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vqshlQu16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vqshlQu16.c 2010-01-25 09:50:29.455686248 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vqshlQu32.c b/gcc/testsuite/gcc.target/arm/neon/vqshlQu32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vqshlQu32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vqshlQu32.c 2010-01-25 09:50:29.455686248 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vqshlQu64.c b/gcc/testsuite/gcc.target/arm/neon/vqshlQu64.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vqshlQu64.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vqshlQu64.c 2010-01-25 09:50:29.455686248 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vqshlQu8.c b/gcc/testsuite/gcc.target/arm/neon/vqshlQu8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vqshlQu8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vqshlQu8.c 2010-01-25 09:50:29.455686248 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vqshls16.c b/gcc/testsuite/gcc.target/arm/neon/vqshls16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vqshls16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vqshls16.c 2010-01-25 09:50:29.455686248 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vqshls32.c b/gcc/testsuite/gcc.target/arm/neon/vqshls32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vqshls32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vqshls32.c 2010-01-25 09:50:29.455686248 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vqshls64.c b/gcc/testsuite/gcc.target/arm/neon/vqshls64.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vqshls64.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vqshls64.c 2010-01-25 09:50:29.455686248 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vqshls8.c b/gcc/testsuite/gcc.target/arm/neon/vqshls8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vqshls8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vqshls8.c 2010-01-25 09:50:29.455686248 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vqshlu16.c b/gcc/testsuite/gcc.target/arm/neon/vqshlu16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vqshlu16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vqshlu16.c 2010-01-25 09:50:29.455686248 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vqshlu32.c b/gcc/testsuite/gcc.target/arm/neon/vqshlu32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vqshlu32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vqshlu32.c 2010-01-25 09:50:29.455686248 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vqshlu64.c b/gcc/testsuite/gcc.target/arm/neon/vqshlu64.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vqshlu64.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vqshlu64.c 2010-01-25 09:50:29.455686248 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vqshlu8.c b/gcc/testsuite/gcc.target/arm/neon/vqshlu8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vqshlu8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vqshlu8.c 2010-01-25 09:50:29.455686248 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vqshlu_ns16.c b/gcc/testsuite/gcc.target/arm/neon/vqshlu_ns16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vqshlu_ns16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vqshlu_ns16.c 2010-01-25 09:50:29.455686248 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vqshlu_ns32.c b/gcc/testsuite/gcc.target/arm/neon/vqshlu_ns32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vqshlu_ns32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vqshlu_ns32.c 2010-01-25 09:50:29.455686248 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vqshlu_ns64.c b/gcc/testsuite/gcc.target/arm/neon/vqshlu_ns64.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vqshlu_ns64.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vqshlu_ns64.c 2010-01-25 09:50:29.455686248 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vqshlu_ns8.c b/gcc/testsuite/gcc.target/arm/neon/vqshlu_ns8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vqshlu_ns8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vqshlu_ns8.c 2010-01-25 09:50:29.455686248 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vqshluQ_ns16.c b/gcc/testsuite/gcc.target/arm/neon/vqshluQ_ns16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vqshluQ_ns16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vqshluQ_ns16.c 2010-01-25 09:50:29.455686248 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vqshluQ_ns32.c b/gcc/testsuite/gcc.target/arm/neon/vqshluQ_ns32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vqshluQ_ns32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vqshluQ_ns32.c 2010-01-25 09:50:29.455686248 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vqshluQ_ns64.c b/gcc/testsuite/gcc.target/arm/neon/vqshluQ_ns64.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vqshluQ_ns64.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vqshluQ_ns64.c 2010-01-25 09:50:29.455686248 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vqshluQ_ns8.c b/gcc/testsuite/gcc.target/arm/neon/vqshluQ_ns8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vqshluQ_ns8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vqshluQ_ns8.c 2010-01-25 09:50:29.455686248 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vqshrn_ns16.c b/gcc/testsuite/gcc.target/arm/neon/vqshrn_ns16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vqshrn_ns16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vqshrn_ns16.c 2010-01-25 09:50:29.455686248 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vqshrn_ns32.c b/gcc/testsuite/gcc.target/arm/neon/vqshrn_ns32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vqshrn_ns32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vqshrn_ns32.c 2010-01-25 09:50:29.455686248 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vqshrn_ns64.c b/gcc/testsuite/gcc.target/arm/neon/vqshrn_ns64.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vqshrn_ns64.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vqshrn_ns64.c 2010-01-25 09:50:29.455686248 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vqshrn_nu16.c b/gcc/testsuite/gcc.target/arm/neon/vqshrn_nu16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vqshrn_nu16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vqshrn_nu16.c 2010-01-25 09:50:29.455686248 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vqshrn_nu32.c b/gcc/testsuite/gcc.target/arm/neon/vqshrn_nu32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vqshrn_nu32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vqshrn_nu32.c 2010-01-25 09:50:29.455686248 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vqshrn_nu64.c b/gcc/testsuite/gcc.target/arm/neon/vqshrn_nu64.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vqshrn_nu64.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vqshrn_nu64.c 2010-01-25 09:50:29.465686681 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vqshrun_ns16.c b/gcc/testsuite/gcc.target/arm/neon/vqshrun_ns16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vqshrun_ns16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vqshrun_ns16.c 2010-01-25 09:50:29.465686681 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vqshrun_ns32.c b/gcc/testsuite/gcc.target/arm/neon/vqshrun_ns32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vqshrun_ns32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vqshrun_ns32.c 2010-01-25 09:50:29.465686681 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vqshrun_ns64.c b/gcc/testsuite/gcc.target/arm/neon/vqshrun_ns64.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vqshrun_ns64.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vqshrun_ns64.c 2010-01-25 09:50:29.465686681 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vqsubQs16.c b/gcc/testsuite/gcc.target/arm/neon/vqsubQs16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vqsubQs16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vqsubQs16.c 2010-01-25 09:50:29.465686681 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vqsubQs32.c b/gcc/testsuite/gcc.target/arm/neon/vqsubQs32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vqsubQs32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vqsubQs32.c 2010-01-25 09:50:29.465686681 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vqsubQs64.c b/gcc/testsuite/gcc.target/arm/neon/vqsubQs64.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vqsubQs64.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vqsubQs64.c 2010-01-25 09:50:29.465686681 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vqsubQs8.c b/gcc/testsuite/gcc.target/arm/neon/vqsubQs8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vqsubQs8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vqsubQs8.c 2010-01-25 09:50:29.465686681 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vqsubQu16.c b/gcc/testsuite/gcc.target/arm/neon/vqsubQu16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vqsubQu16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vqsubQu16.c 2010-01-25 09:50:29.465686681 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vqsubQu32.c b/gcc/testsuite/gcc.target/arm/neon/vqsubQu32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vqsubQu32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vqsubQu32.c 2010-01-25 09:50:29.465686681 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vqsubQu64.c b/gcc/testsuite/gcc.target/arm/neon/vqsubQu64.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vqsubQu64.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vqsubQu64.c 2010-01-25 09:50:29.465686681 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vqsubQu8.c b/gcc/testsuite/gcc.target/arm/neon/vqsubQu8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vqsubQu8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vqsubQu8.c 2010-01-25 09:50:29.465686681 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vqsubs16.c b/gcc/testsuite/gcc.target/arm/neon/vqsubs16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vqsubs16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vqsubs16.c 2010-01-25 09:50:29.465686681 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vqsubs32.c b/gcc/testsuite/gcc.target/arm/neon/vqsubs32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vqsubs32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vqsubs32.c 2010-01-25 09:50:29.465686681 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vqsubs64.c b/gcc/testsuite/gcc.target/arm/neon/vqsubs64.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vqsubs64.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vqsubs64.c 2010-01-25 09:50:29.465686681 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vqsubs8.c b/gcc/testsuite/gcc.target/arm/neon/vqsubs8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vqsubs8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vqsubs8.c 2010-01-25 09:50:29.465686681 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vqsubu16.c b/gcc/testsuite/gcc.target/arm/neon/vqsubu16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vqsubu16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vqsubu16.c 2010-01-25 09:50:29.465686681 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vqsubu32.c b/gcc/testsuite/gcc.target/arm/neon/vqsubu32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vqsubu32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vqsubu32.c 2010-01-25 09:50:29.465686681 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vqsubu64.c b/gcc/testsuite/gcc.target/arm/neon/vqsubu64.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vqsubu64.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vqsubu64.c 2010-01-25 09:50:29.465686681 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vqsubu8.c b/gcc/testsuite/gcc.target/arm/neon/vqsubu8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vqsubu8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vqsubu8.c 2010-01-25 09:50:29.465686681 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vRaddhns16.c b/gcc/testsuite/gcc.target/arm/neon/vRaddhns16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vRaddhns16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vRaddhns16.c 2010-01-25 09:50:29.465686681 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vRaddhns32.c b/gcc/testsuite/gcc.target/arm/neon/vRaddhns32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vRaddhns32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vRaddhns32.c 2010-01-25 09:50:29.465686681 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vRaddhns64.c b/gcc/testsuite/gcc.target/arm/neon/vRaddhns64.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vRaddhns64.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vRaddhns64.c 2010-01-25 09:50:29.465686681 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vRaddhnu16.c b/gcc/testsuite/gcc.target/arm/neon/vRaddhnu16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vRaddhnu16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vRaddhnu16.c 2010-01-25 09:50:29.465686681 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vRaddhnu32.c b/gcc/testsuite/gcc.target/arm/neon/vRaddhnu32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vRaddhnu32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vRaddhnu32.c 2010-01-25 09:50:29.465686681 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vRaddhnu64.c b/gcc/testsuite/gcc.target/arm/neon/vRaddhnu64.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vRaddhnu64.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vRaddhnu64.c 2010-01-25 09:50:29.465686681 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vrecpef32.c b/gcc/testsuite/gcc.target/arm/neon/vrecpef32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vrecpef32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vrecpef32.c 2010-01-25 09:50:29.465686681 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vrecpeQf32.c b/gcc/testsuite/gcc.target/arm/neon/vrecpeQf32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vrecpeQf32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vrecpeQf32.c 2010-01-25 09:50:29.465686681 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vrecpeQu32.c b/gcc/testsuite/gcc.target/arm/neon/vrecpeQu32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vrecpeQu32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vrecpeQu32.c 2010-01-25 09:50:29.465686681 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vrecpeu32.c b/gcc/testsuite/gcc.target/arm/neon/vrecpeu32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vrecpeu32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vrecpeu32.c 2010-01-25 09:50:29.465686681 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vrecpsf32.c b/gcc/testsuite/gcc.target/arm/neon/vrecpsf32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vrecpsf32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vrecpsf32.c 2010-01-25 09:50:29.465686681 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vrecpsQf32.c b/gcc/testsuite/gcc.target/arm/neon/vrecpsQf32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vrecpsQf32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vrecpsQf32.c 2010-01-25 09:50:29.465686681 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vreinterpretf32_p16.c b/gcc/testsuite/gcc.target/arm/neon/vreinterpretf32_p16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vreinterpretf32_p16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vreinterpretf32_p16.c 2010-01-25 09:50:29.465686681 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vreinterpretf32_p8.c b/gcc/testsuite/gcc.target/arm/neon/vreinterpretf32_p8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vreinterpretf32_p8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vreinterpretf32_p8.c 2010-01-25 09:50:29.465686681 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vreinterpretf32_s16.c b/gcc/testsuite/gcc.target/arm/neon/vreinterpretf32_s16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vreinterpretf32_s16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vreinterpretf32_s16.c 2010-01-25 09:50:29.465686681 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vreinterpretf32_s32.c b/gcc/testsuite/gcc.target/arm/neon/vreinterpretf32_s32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vreinterpretf32_s32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vreinterpretf32_s32.c 2010-01-25 09:50:29.465686681 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vreinterpretf32_s64.c b/gcc/testsuite/gcc.target/arm/neon/vreinterpretf32_s64.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vreinterpretf32_s64.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vreinterpretf32_s64.c 2010-01-25 09:50:29.465686681 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vreinterpretf32_s8.c b/gcc/testsuite/gcc.target/arm/neon/vreinterpretf32_s8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vreinterpretf32_s8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vreinterpretf32_s8.c 2010-01-25 09:50:29.465686681 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vreinterpretf32_u16.c b/gcc/testsuite/gcc.target/arm/neon/vreinterpretf32_u16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vreinterpretf32_u16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vreinterpretf32_u16.c 2010-01-25 09:50:29.465686681 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vreinterpretf32_u32.c b/gcc/testsuite/gcc.target/arm/neon/vreinterpretf32_u32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vreinterpretf32_u32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vreinterpretf32_u32.c 2010-01-25 09:50:29.465686681 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vreinterpretf32_u64.c b/gcc/testsuite/gcc.target/arm/neon/vreinterpretf32_u64.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vreinterpretf32_u64.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vreinterpretf32_u64.c 2010-01-25 09:50:29.465686681 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vreinterpretf32_u8.c b/gcc/testsuite/gcc.target/arm/neon/vreinterpretf32_u8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vreinterpretf32_u8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vreinterpretf32_u8.c 2010-01-25 09:50:29.465686681 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vreinterpretp16_f32.c b/gcc/testsuite/gcc.target/arm/neon/vreinterpretp16_f32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vreinterpretp16_f32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vreinterpretp16_f32.c 2010-01-25 09:50:29.465686681 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vreinterpretp16_p8.c b/gcc/testsuite/gcc.target/arm/neon/vreinterpretp16_p8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vreinterpretp16_p8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vreinterpretp16_p8.c 2010-01-25 09:50:29.465686681 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vreinterpretp16_s16.c b/gcc/testsuite/gcc.target/arm/neon/vreinterpretp16_s16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vreinterpretp16_s16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vreinterpretp16_s16.c 2010-01-25 09:50:29.465686681 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vreinterpretp16_s32.c b/gcc/testsuite/gcc.target/arm/neon/vreinterpretp16_s32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vreinterpretp16_s32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vreinterpretp16_s32.c 2010-01-25 09:50:29.465686681 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vreinterpretp16_s64.c b/gcc/testsuite/gcc.target/arm/neon/vreinterpretp16_s64.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vreinterpretp16_s64.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vreinterpretp16_s64.c 2010-01-25 09:50:29.465686681 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vreinterpretp16_s8.c b/gcc/testsuite/gcc.target/arm/neon/vreinterpretp16_s8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vreinterpretp16_s8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vreinterpretp16_s8.c 2010-01-25 09:50:29.465686681 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vreinterpretp16_u16.c b/gcc/testsuite/gcc.target/arm/neon/vreinterpretp16_u16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vreinterpretp16_u16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vreinterpretp16_u16.c 2010-01-25 09:50:29.465686681 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vreinterpretp16_u32.c b/gcc/testsuite/gcc.target/arm/neon/vreinterpretp16_u32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vreinterpretp16_u32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vreinterpretp16_u32.c 2010-01-25 09:50:29.465686681 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vreinterpretp16_u64.c b/gcc/testsuite/gcc.target/arm/neon/vreinterpretp16_u64.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vreinterpretp16_u64.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vreinterpretp16_u64.c 2010-01-25 09:50:29.465686681 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vreinterpretp16_u8.c b/gcc/testsuite/gcc.target/arm/neon/vreinterpretp16_u8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vreinterpretp16_u8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vreinterpretp16_u8.c 2010-01-25 09:50:29.465686681 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vreinterpretp8_f32.c b/gcc/testsuite/gcc.target/arm/neon/vreinterpretp8_f32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vreinterpretp8_f32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vreinterpretp8_f32.c 2010-01-25 09:50:29.465686681 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vreinterpretp8_p16.c b/gcc/testsuite/gcc.target/arm/neon/vreinterpretp8_p16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vreinterpretp8_p16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vreinterpretp8_p16.c 2010-01-25 09:50:29.465686681 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vreinterpretp8_s16.c b/gcc/testsuite/gcc.target/arm/neon/vreinterpretp8_s16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vreinterpretp8_s16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vreinterpretp8_s16.c 2010-01-25 09:50:29.465686681 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vreinterpretp8_s32.c b/gcc/testsuite/gcc.target/arm/neon/vreinterpretp8_s32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vreinterpretp8_s32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vreinterpretp8_s32.c 2010-01-25 09:50:29.465686681 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vreinterpretp8_s64.c b/gcc/testsuite/gcc.target/arm/neon/vreinterpretp8_s64.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vreinterpretp8_s64.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vreinterpretp8_s64.c 2010-01-25 09:50:29.465686681 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vreinterpretp8_s8.c b/gcc/testsuite/gcc.target/arm/neon/vreinterpretp8_s8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vreinterpretp8_s8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vreinterpretp8_s8.c 2010-01-25 09:50:29.465686681 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vreinterpretp8_u16.c b/gcc/testsuite/gcc.target/arm/neon/vreinterpretp8_u16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vreinterpretp8_u16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vreinterpretp8_u16.c 2010-01-25 09:50:29.465686681 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vreinterpretp8_u32.c b/gcc/testsuite/gcc.target/arm/neon/vreinterpretp8_u32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vreinterpretp8_u32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vreinterpretp8_u32.c 2010-01-25 09:50:29.465686681 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vreinterpretp8_u64.c b/gcc/testsuite/gcc.target/arm/neon/vreinterpretp8_u64.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vreinterpretp8_u64.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vreinterpretp8_u64.c 2010-01-25 09:50:29.465686681 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vreinterpretp8_u8.c b/gcc/testsuite/gcc.target/arm/neon/vreinterpretp8_u8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vreinterpretp8_u8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vreinterpretp8_u8.c 2010-01-25 09:50:29.465686681 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vreinterpretQf32_p16.c b/gcc/testsuite/gcc.target/arm/neon/vreinterpretQf32_p16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vreinterpretQf32_p16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vreinterpretQf32_p16.c 2010-01-25 09:50:29.465686681 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vreinterpretQf32_p8.c b/gcc/testsuite/gcc.target/arm/neon/vreinterpretQf32_p8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vreinterpretQf32_p8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vreinterpretQf32_p8.c 2010-01-25 09:50:29.465686681 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vreinterpretQf32_s16.c b/gcc/testsuite/gcc.target/arm/neon/vreinterpretQf32_s16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vreinterpretQf32_s16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vreinterpretQf32_s16.c 2010-01-25 09:50:29.465686681 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vreinterpretQf32_s32.c b/gcc/testsuite/gcc.target/arm/neon/vreinterpretQf32_s32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vreinterpretQf32_s32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vreinterpretQf32_s32.c 2010-01-25 09:50:29.465686681 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vreinterpretQf32_s64.c b/gcc/testsuite/gcc.target/arm/neon/vreinterpretQf32_s64.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vreinterpretQf32_s64.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vreinterpretQf32_s64.c 2010-01-25 09:50:29.465686681 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vreinterpretQf32_s8.c b/gcc/testsuite/gcc.target/arm/neon/vreinterpretQf32_s8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vreinterpretQf32_s8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vreinterpretQf32_s8.c 2010-01-25 09:50:29.465686681 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vreinterpretQf32_u16.c b/gcc/testsuite/gcc.target/arm/neon/vreinterpretQf32_u16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vreinterpretQf32_u16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vreinterpretQf32_u16.c 2010-01-25 09:50:29.465686681 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vreinterpretQf32_u32.c b/gcc/testsuite/gcc.target/arm/neon/vreinterpretQf32_u32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vreinterpretQf32_u32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vreinterpretQf32_u32.c 2010-01-25 09:50:29.465686681 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vreinterpretQf32_u64.c b/gcc/testsuite/gcc.target/arm/neon/vreinterpretQf32_u64.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vreinterpretQf32_u64.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vreinterpretQf32_u64.c 2010-01-25 09:50:29.465686681 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vreinterpretQf32_u8.c b/gcc/testsuite/gcc.target/arm/neon/vreinterpretQf32_u8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vreinterpretQf32_u8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vreinterpretQf32_u8.c 2010-01-25 09:50:29.465686681 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vreinterpretQp16_f32.c b/gcc/testsuite/gcc.target/arm/neon/vreinterpretQp16_f32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vreinterpretQp16_f32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vreinterpretQp16_f32.c 2010-01-25 09:50:29.465686681 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vreinterpretQp16_p8.c b/gcc/testsuite/gcc.target/arm/neon/vreinterpretQp16_p8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vreinterpretQp16_p8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vreinterpretQp16_p8.c 2010-01-25 09:50:29.475686346 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vreinterpretQp16_s16.c b/gcc/testsuite/gcc.target/arm/neon/vreinterpretQp16_s16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vreinterpretQp16_s16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vreinterpretQp16_s16.c 2010-01-25 09:50:29.475686346 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vreinterpretQp16_s32.c b/gcc/testsuite/gcc.target/arm/neon/vreinterpretQp16_s32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vreinterpretQp16_s32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vreinterpretQp16_s32.c 2010-01-25 09:50:29.475686346 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vreinterpretQp16_s64.c b/gcc/testsuite/gcc.target/arm/neon/vreinterpretQp16_s64.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vreinterpretQp16_s64.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vreinterpretQp16_s64.c 2010-01-25 09:50:29.475686346 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vreinterpretQp16_s8.c b/gcc/testsuite/gcc.target/arm/neon/vreinterpretQp16_s8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vreinterpretQp16_s8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vreinterpretQp16_s8.c 2010-01-25 09:50:29.475686346 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vreinterpretQp16_u16.c b/gcc/testsuite/gcc.target/arm/neon/vreinterpretQp16_u16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vreinterpretQp16_u16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vreinterpretQp16_u16.c 2010-01-25 09:50:29.475686346 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vreinterpretQp16_u32.c b/gcc/testsuite/gcc.target/arm/neon/vreinterpretQp16_u32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vreinterpretQp16_u32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vreinterpretQp16_u32.c 2010-01-25 09:50:29.475686346 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vreinterpretQp16_u64.c b/gcc/testsuite/gcc.target/arm/neon/vreinterpretQp16_u64.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vreinterpretQp16_u64.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vreinterpretQp16_u64.c 2010-01-25 09:50:29.475686346 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vreinterpretQp16_u8.c b/gcc/testsuite/gcc.target/arm/neon/vreinterpretQp16_u8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vreinterpretQp16_u8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vreinterpretQp16_u8.c 2010-01-25 09:50:29.475686346 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vreinterpretQp8_f32.c b/gcc/testsuite/gcc.target/arm/neon/vreinterpretQp8_f32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vreinterpretQp8_f32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vreinterpretQp8_f32.c 2010-01-25 09:50:29.475686346 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vreinterpretQp8_p16.c b/gcc/testsuite/gcc.target/arm/neon/vreinterpretQp8_p16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vreinterpretQp8_p16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vreinterpretQp8_p16.c 2010-01-25 09:50:29.475686346 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vreinterpretQp8_s16.c b/gcc/testsuite/gcc.target/arm/neon/vreinterpretQp8_s16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vreinterpretQp8_s16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vreinterpretQp8_s16.c 2010-01-25 09:50:29.475686346 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vreinterpretQp8_s32.c b/gcc/testsuite/gcc.target/arm/neon/vreinterpretQp8_s32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vreinterpretQp8_s32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vreinterpretQp8_s32.c 2010-01-25 09:50:29.475686346 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vreinterpretQp8_s64.c b/gcc/testsuite/gcc.target/arm/neon/vreinterpretQp8_s64.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vreinterpretQp8_s64.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vreinterpretQp8_s64.c 2010-01-25 09:50:29.475686346 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vreinterpretQp8_s8.c b/gcc/testsuite/gcc.target/arm/neon/vreinterpretQp8_s8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vreinterpretQp8_s8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vreinterpretQp8_s8.c 2010-01-25 09:50:29.475686346 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vreinterpretQp8_u16.c b/gcc/testsuite/gcc.target/arm/neon/vreinterpretQp8_u16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vreinterpretQp8_u16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vreinterpretQp8_u16.c 2010-01-25 09:50:29.475686346 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vreinterpretQp8_u32.c b/gcc/testsuite/gcc.target/arm/neon/vreinterpretQp8_u32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vreinterpretQp8_u32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vreinterpretQp8_u32.c 2010-01-25 09:50:29.475686346 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vreinterpretQp8_u64.c b/gcc/testsuite/gcc.target/arm/neon/vreinterpretQp8_u64.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vreinterpretQp8_u64.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vreinterpretQp8_u64.c 2010-01-25 09:50:29.475686346 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vreinterpretQp8_u8.c b/gcc/testsuite/gcc.target/arm/neon/vreinterpretQp8_u8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vreinterpretQp8_u8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vreinterpretQp8_u8.c 2010-01-25 09:50:29.475686346 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vreinterpretQs16_f32.c b/gcc/testsuite/gcc.target/arm/neon/vreinterpretQs16_f32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vreinterpretQs16_f32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vreinterpretQs16_f32.c 2010-01-25 09:50:29.475686346 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vreinterpretQs16_p16.c b/gcc/testsuite/gcc.target/arm/neon/vreinterpretQs16_p16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vreinterpretQs16_p16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vreinterpretQs16_p16.c 2010-01-25 09:50:29.475686346 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vreinterpretQs16_p8.c b/gcc/testsuite/gcc.target/arm/neon/vreinterpretQs16_p8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vreinterpretQs16_p8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vreinterpretQs16_p8.c 2010-01-25 09:50:29.475686346 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vreinterpretQs16_s32.c b/gcc/testsuite/gcc.target/arm/neon/vreinterpretQs16_s32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vreinterpretQs16_s32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vreinterpretQs16_s32.c 2010-01-25 09:50:29.475686346 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vreinterpretQs16_s64.c b/gcc/testsuite/gcc.target/arm/neon/vreinterpretQs16_s64.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vreinterpretQs16_s64.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vreinterpretQs16_s64.c 2010-01-25 09:50:29.475686346 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vreinterpretQs16_s8.c b/gcc/testsuite/gcc.target/arm/neon/vreinterpretQs16_s8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vreinterpretQs16_s8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vreinterpretQs16_s8.c 2010-01-25 09:50:29.475686346 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vreinterpretQs16_u16.c b/gcc/testsuite/gcc.target/arm/neon/vreinterpretQs16_u16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vreinterpretQs16_u16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vreinterpretQs16_u16.c 2010-01-25 09:50:29.475686346 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vreinterpretQs16_u32.c b/gcc/testsuite/gcc.target/arm/neon/vreinterpretQs16_u32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vreinterpretQs16_u32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vreinterpretQs16_u32.c 2010-01-25 09:50:29.475686346 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vreinterpretQs16_u64.c b/gcc/testsuite/gcc.target/arm/neon/vreinterpretQs16_u64.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vreinterpretQs16_u64.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vreinterpretQs16_u64.c 2010-01-25 09:50:29.475686346 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vreinterpretQs16_u8.c b/gcc/testsuite/gcc.target/arm/neon/vreinterpretQs16_u8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vreinterpretQs16_u8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vreinterpretQs16_u8.c 2010-01-25 09:50:29.475686346 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vreinterpretQs32_f32.c b/gcc/testsuite/gcc.target/arm/neon/vreinterpretQs32_f32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vreinterpretQs32_f32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vreinterpretQs32_f32.c 2010-01-25 09:50:29.475686346 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vreinterpretQs32_p16.c b/gcc/testsuite/gcc.target/arm/neon/vreinterpretQs32_p16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vreinterpretQs32_p16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vreinterpretQs32_p16.c 2010-01-25 09:50:29.475686346 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vreinterpretQs32_p8.c b/gcc/testsuite/gcc.target/arm/neon/vreinterpretQs32_p8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vreinterpretQs32_p8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vreinterpretQs32_p8.c 2010-01-25 09:50:29.475686346 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vreinterpretQs32_s16.c b/gcc/testsuite/gcc.target/arm/neon/vreinterpretQs32_s16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vreinterpretQs32_s16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vreinterpretQs32_s16.c 2010-01-25 09:50:29.475686346 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vreinterpretQs32_s64.c b/gcc/testsuite/gcc.target/arm/neon/vreinterpretQs32_s64.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vreinterpretQs32_s64.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vreinterpretQs32_s64.c 2010-01-25 09:50:29.475686346 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vreinterpretQs32_s8.c b/gcc/testsuite/gcc.target/arm/neon/vreinterpretQs32_s8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vreinterpretQs32_s8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vreinterpretQs32_s8.c 2010-01-25 09:50:29.475686346 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vreinterpretQs32_u16.c b/gcc/testsuite/gcc.target/arm/neon/vreinterpretQs32_u16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vreinterpretQs32_u16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vreinterpretQs32_u16.c 2010-01-25 09:50:29.475686346 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vreinterpretQs32_u32.c b/gcc/testsuite/gcc.target/arm/neon/vreinterpretQs32_u32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vreinterpretQs32_u32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vreinterpretQs32_u32.c 2010-01-25 09:50:29.475686346 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vreinterpretQs32_u64.c b/gcc/testsuite/gcc.target/arm/neon/vreinterpretQs32_u64.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vreinterpretQs32_u64.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vreinterpretQs32_u64.c 2010-01-25 09:50:29.475686346 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vreinterpretQs32_u8.c b/gcc/testsuite/gcc.target/arm/neon/vreinterpretQs32_u8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vreinterpretQs32_u8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vreinterpretQs32_u8.c 2010-01-25 09:50:29.475686346 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vreinterpretQs64_f32.c b/gcc/testsuite/gcc.target/arm/neon/vreinterpretQs64_f32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vreinterpretQs64_f32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vreinterpretQs64_f32.c 2010-01-25 09:50:29.475686346 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vreinterpretQs64_p16.c b/gcc/testsuite/gcc.target/arm/neon/vreinterpretQs64_p16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vreinterpretQs64_p16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vreinterpretQs64_p16.c 2010-01-25 09:50:29.475686346 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vreinterpretQs64_p8.c b/gcc/testsuite/gcc.target/arm/neon/vreinterpretQs64_p8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vreinterpretQs64_p8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vreinterpretQs64_p8.c 2010-01-25 09:50:29.475686346 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vreinterpretQs64_s16.c b/gcc/testsuite/gcc.target/arm/neon/vreinterpretQs64_s16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vreinterpretQs64_s16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vreinterpretQs64_s16.c 2010-01-25 09:50:29.475686346 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vreinterpretQs64_s32.c b/gcc/testsuite/gcc.target/arm/neon/vreinterpretQs64_s32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vreinterpretQs64_s32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vreinterpretQs64_s32.c 2010-01-25 09:50:29.475686346 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vreinterpretQs64_s8.c b/gcc/testsuite/gcc.target/arm/neon/vreinterpretQs64_s8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vreinterpretQs64_s8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vreinterpretQs64_s8.c 2010-01-25 09:50:29.475686346 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vreinterpretQs64_u16.c b/gcc/testsuite/gcc.target/arm/neon/vreinterpretQs64_u16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vreinterpretQs64_u16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vreinterpretQs64_u16.c 2010-01-25 09:50:29.475686346 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vreinterpretQs64_u32.c b/gcc/testsuite/gcc.target/arm/neon/vreinterpretQs64_u32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vreinterpretQs64_u32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vreinterpretQs64_u32.c 2010-01-25 09:50:29.475686346 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vreinterpretQs64_u64.c b/gcc/testsuite/gcc.target/arm/neon/vreinterpretQs64_u64.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vreinterpretQs64_u64.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vreinterpretQs64_u64.c 2010-01-25 09:50:29.475686346 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vreinterpretQs64_u8.c b/gcc/testsuite/gcc.target/arm/neon/vreinterpretQs64_u8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vreinterpretQs64_u8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vreinterpretQs64_u8.c 2010-01-25 09:50:29.475686346 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vreinterpretQs8_f32.c b/gcc/testsuite/gcc.target/arm/neon/vreinterpretQs8_f32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vreinterpretQs8_f32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vreinterpretQs8_f32.c 2010-01-25 09:50:29.475686346 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vreinterpretQs8_p16.c b/gcc/testsuite/gcc.target/arm/neon/vreinterpretQs8_p16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vreinterpretQs8_p16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vreinterpretQs8_p16.c 2010-01-25 09:50:29.475686346 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vreinterpretQs8_p8.c b/gcc/testsuite/gcc.target/arm/neon/vreinterpretQs8_p8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vreinterpretQs8_p8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vreinterpretQs8_p8.c 2010-01-25 09:50:29.475686346 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vreinterpretQs8_s16.c b/gcc/testsuite/gcc.target/arm/neon/vreinterpretQs8_s16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vreinterpretQs8_s16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vreinterpretQs8_s16.c 2010-01-25 09:50:29.475686346 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vreinterpretQs8_s32.c b/gcc/testsuite/gcc.target/arm/neon/vreinterpretQs8_s32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vreinterpretQs8_s32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vreinterpretQs8_s32.c 2010-01-25 09:50:29.475686346 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vreinterpretQs8_s64.c b/gcc/testsuite/gcc.target/arm/neon/vreinterpretQs8_s64.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vreinterpretQs8_s64.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vreinterpretQs8_s64.c 2010-01-25 09:50:29.475686346 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vreinterpretQs8_u16.c b/gcc/testsuite/gcc.target/arm/neon/vreinterpretQs8_u16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vreinterpretQs8_u16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vreinterpretQs8_u16.c 2010-01-25 09:50:29.475686346 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vreinterpretQs8_u32.c b/gcc/testsuite/gcc.target/arm/neon/vreinterpretQs8_u32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vreinterpretQs8_u32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vreinterpretQs8_u32.c 2010-01-25 09:50:29.475686346 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vreinterpretQs8_u64.c b/gcc/testsuite/gcc.target/arm/neon/vreinterpretQs8_u64.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vreinterpretQs8_u64.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vreinterpretQs8_u64.c 2010-01-25 09:50:29.475686346 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vreinterpretQs8_u8.c b/gcc/testsuite/gcc.target/arm/neon/vreinterpretQs8_u8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vreinterpretQs8_u8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vreinterpretQs8_u8.c 2010-01-25 09:50:29.475686346 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vreinterpretQu16_f32.c b/gcc/testsuite/gcc.target/arm/neon/vreinterpretQu16_f32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vreinterpretQu16_f32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vreinterpretQu16_f32.c 2010-01-25 09:50:29.475686346 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vreinterpretQu16_p16.c b/gcc/testsuite/gcc.target/arm/neon/vreinterpretQu16_p16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vreinterpretQu16_p16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vreinterpretQu16_p16.c 2010-01-25 09:50:29.475686346 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vreinterpretQu16_p8.c b/gcc/testsuite/gcc.target/arm/neon/vreinterpretQu16_p8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vreinterpretQu16_p8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vreinterpretQu16_p8.c 2010-01-25 09:50:29.475686346 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vreinterpretQu16_s16.c b/gcc/testsuite/gcc.target/arm/neon/vreinterpretQu16_s16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vreinterpretQu16_s16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vreinterpretQu16_s16.c 2010-01-25 09:50:29.475686346 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vreinterpretQu16_s32.c b/gcc/testsuite/gcc.target/arm/neon/vreinterpretQu16_s32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vreinterpretQu16_s32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vreinterpretQu16_s32.c 2010-01-25 09:50:29.475686346 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vreinterpretQu16_s64.c b/gcc/testsuite/gcc.target/arm/neon/vreinterpretQu16_s64.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vreinterpretQu16_s64.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vreinterpretQu16_s64.c 2010-01-25 09:50:29.475686346 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vreinterpretQu16_s8.c b/gcc/testsuite/gcc.target/arm/neon/vreinterpretQu16_s8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vreinterpretQu16_s8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vreinterpretQu16_s8.c 2010-01-25 09:50:29.475686346 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vreinterpretQu16_u32.c b/gcc/testsuite/gcc.target/arm/neon/vreinterpretQu16_u32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vreinterpretQu16_u32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vreinterpretQu16_u32.c 2010-01-25 09:50:29.475686346 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vreinterpretQu16_u64.c b/gcc/testsuite/gcc.target/arm/neon/vreinterpretQu16_u64.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vreinterpretQu16_u64.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vreinterpretQu16_u64.c 2010-01-25 09:50:29.475686346 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vreinterpretQu16_u8.c b/gcc/testsuite/gcc.target/arm/neon/vreinterpretQu16_u8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vreinterpretQu16_u8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vreinterpretQu16_u8.c 2010-01-25 09:50:29.475686346 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vreinterpretQu32_f32.c b/gcc/testsuite/gcc.target/arm/neon/vreinterpretQu32_f32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vreinterpretQu32_f32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vreinterpretQu32_f32.c 2010-01-25 09:50:29.475686346 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vreinterpretQu32_p16.c b/gcc/testsuite/gcc.target/arm/neon/vreinterpretQu32_p16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vreinterpretQu32_p16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vreinterpretQu32_p16.c 2010-01-25 09:50:29.475686346 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vreinterpretQu32_p8.c b/gcc/testsuite/gcc.target/arm/neon/vreinterpretQu32_p8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vreinterpretQu32_p8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vreinterpretQu32_p8.c 2010-01-25 09:50:29.475686346 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vreinterpretQu32_s16.c b/gcc/testsuite/gcc.target/arm/neon/vreinterpretQu32_s16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vreinterpretQu32_s16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vreinterpretQu32_s16.c 2010-01-25 09:50:29.475686346 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vreinterpretQu32_s32.c b/gcc/testsuite/gcc.target/arm/neon/vreinterpretQu32_s32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vreinterpretQu32_s32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vreinterpretQu32_s32.c 2010-01-25 09:50:29.485687478 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vreinterpretQu32_s64.c b/gcc/testsuite/gcc.target/arm/neon/vreinterpretQu32_s64.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vreinterpretQu32_s64.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vreinterpretQu32_s64.c 2010-01-25 09:50:29.485687478 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vreinterpretQu32_s8.c b/gcc/testsuite/gcc.target/arm/neon/vreinterpretQu32_s8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vreinterpretQu32_s8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vreinterpretQu32_s8.c 2010-01-25 09:50:29.485687478 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vreinterpretQu32_u16.c b/gcc/testsuite/gcc.target/arm/neon/vreinterpretQu32_u16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vreinterpretQu32_u16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vreinterpretQu32_u16.c 2010-01-25 09:50:29.485687478 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vreinterpretQu32_u64.c b/gcc/testsuite/gcc.target/arm/neon/vreinterpretQu32_u64.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vreinterpretQu32_u64.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vreinterpretQu32_u64.c 2010-01-25 09:50:29.485687478 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vreinterpretQu32_u8.c b/gcc/testsuite/gcc.target/arm/neon/vreinterpretQu32_u8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vreinterpretQu32_u8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vreinterpretQu32_u8.c 2010-01-25 09:50:29.485687478 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vreinterpretQu64_f32.c b/gcc/testsuite/gcc.target/arm/neon/vreinterpretQu64_f32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vreinterpretQu64_f32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vreinterpretQu64_f32.c 2010-01-25 09:50:29.485687478 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vreinterpretQu64_p16.c b/gcc/testsuite/gcc.target/arm/neon/vreinterpretQu64_p16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vreinterpretQu64_p16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vreinterpretQu64_p16.c 2010-01-25 09:50:29.485687478 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vreinterpretQu64_p8.c b/gcc/testsuite/gcc.target/arm/neon/vreinterpretQu64_p8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vreinterpretQu64_p8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vreinterpretQu64_p8.c 2010-01-25 09:50:29.485687478 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vreinterpretQu64_s16.c b/gcc/testsuite/gcc.target/arm/neon/vreinterpretQu64_s16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vreinterpretQu64_s16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vreinterpretQu64_s16.c 2010-01-25 09:50:29.485687478 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vreinterpretQu64_s32.c b/gcc/testsuite/gcc.target/arm/neon/vreinterpretQu64_s32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vreinterpretQu64_s32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vreinterpretQu64_s32.c 2010-01-25 09:50:29.485687478 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vreinterpretQu64_s64.c b/gcc/testsuite/gcc.target/arm/neon/vreinterpretQu64_s64.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vreinterpretQu64_s64.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vreinterpretQu64_s64.c 2010-01-25 09:50:29.485687478 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vreinterpretQu64_s8.c b/gcc/testsuite/gcc.target/arm/neon/vreinterpretQu64_s8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vreinterpretQu64_s8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vreinterpretQu64_s8.c 2010-01-25 09:50:29.485687478 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vreinterpretQu64_u16.c b/gcc/testsuite/gcc.target/arm/neon/vreinterpretQu64_u16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vreinterpretQu64_u16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vreinterpretQu64_u16.c 2010-01-25 09:50:29.485687478 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vreinterpretQu64_u32.c b/gcc/testsuite/gcc.target/arm/neon/vreinterpretQu64_u32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vreinterpretQu64_u32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vreinterpretQu64_u32.c 2010-01-25 09:50:29.485687478 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vreinterpretQu64_u8.c b/gcc/testsuite/gcc.target/arm/neon/vreinterpretQu64_u8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vreinterpretQu64_u8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vreinterpretQu64_u8.c 2010-01-25 09:50:29.485687478 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vreinterpretQu8_f32.c b/gcc/testsuite/gcc.target/arm/neon/vreinterpretQu8_f32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vreinterpretQu8_f32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vreinterpretQu8_f32.c 2010-01-25 09:50:29.485687478 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vreinterpretQu8_p16.c b/gcc/testsuite/gcc.target/arm/neon/vreinterpretQu8_p16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vreinterpretQu8_p16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vreinterpretQu8_p16.c 2010-01-25 09:50:29.485687478 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vreinterpretQu8_p8.c b/gcc/testsuite/gcc.target/arm/neon/vreinterpretQu8_p8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vreinterpretQu8_p8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vreinterpretQu8_p8.c 2010-01-25 09:50:29.485687478 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vreinterpretQu8_s16.c b/gcc/testsuite/gcc.target/arm/neon/vreinterpretQu8_s16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vreinterpretQu8_s16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vreinterpretQu8_s16.c 2010-01-25 09:50:29.485687478 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vreinterpretQu8_s32.c b/gcc/testsuite/gcc.target/arm/neon/vreinterpretQu8_s32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vreinterpretQu8_s32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vreinterpretQu8_s32.c 2010-01-25 09:50:29.485687478 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vreinterpretQu8_s64.c b/gcc/testsuite/gcc.target/arm/neon/vreinterpretQu8_s64.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vreinterpretQu8_s64.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vreinterpretQu8_s64.c 2010-01-25 09:50:29.485687478 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vreinterpretQu8_s8.c b/gcc/testsuite/gcc.target/arm/neon/vreinterpretQu8_s8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vreinterpretQu8_s8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vreinterpretQu8_s8.c 2010-01-25 09:50:29.485687478 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vreinterpretQu8_u16.c b/gcc/testsuite/gcc.target/arm/neon/vreinterpretQu8_u16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vreinterpretQu8_u16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vreinterpretQu8_u16.c 2010-01-25 09:50:29.485687478 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vreinterpretQu8_u32.c b/gcc/testsuite/gcc.target/arm/neon/vreinterpretQu8_u32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vreinterpretQu8_u32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vreinterpretQu8_u32.c 2010-01-25 09:50:29.485687478 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vreinterpretQu8_u64.c b/gcc/testsuite/gcc.target/arm/neon/vreinterpretQu8_u64.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vreinterpretQu8_u64.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vreinterpretQu8_u64.c 2010-01-25 09:50:29.485687478 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vreinterprets16_f32.c b/gcc/testsuite/gcc.target/arm/neon/vreinterprets16_f32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vreinterprets16_f32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vreinterprets16_f32.c 2010-01-25 09:50:29.485687478 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vreinterprets16_p16.c b/gcc/testsuite/gcc.target/arm/neon/vreinterprets16_p16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vreinterprets16_p16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vreinterprets16_p16.c 2010-01-25 09:50:29.485687478 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vreinterprets16_p8.c b/gcc/testsuite/gcc.target/arm/neon/vreinterprets16_p8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vreinterprets16_p8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vreinterprets16_p8.c 2010-01-25 09:50:29.485687478 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vreinterprets16_s32.c b/gcc/testsuite/gcc.target/arm/neon/vreinterprets16_s32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vreinterprets16_s32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vreinterprets16_s32.c 2010-01-25 09:50:29.485687478 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vreinterprets16_s64.c b/gcc/testsuite/gcc.target/arm/neon/vreinterprets16_s64.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vreinterprets16_s64.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vreinterprets16_s64.c 2010-01-25 09:50:29.485687478 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vreinterprets16_s8.c b/gcc/testsuite/gcc.target/arm/neon/vreinterprets16_s8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vreinterprets16_s8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vreinterprets16_s8.c 2010-01-25 09:50:29.485687478 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vreinterprets16_u16.c b/gcc/testsuite/gcc.target/arm/neon/vreinterprets16_u16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vreinterprets16_u16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vreinterprets16_u16.c 2010-01-25 09:50:29.485687478 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vreinterprets16_u32.c b/gcc/testsuite/gcc.target/arm/neon/vreinterprets16_u32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vreinterprets16_u32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vreinterprets16_u32.c 2010-01-25 09:50:29.485687478 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vreinterprets16_u64.c b/gcc/testsuite/gcc.target/arm/neon/vreinterprets16_u64.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vreinterprets16_u64.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vreinterprets16_u64.c 2010-01-25 09:50:29.485687478 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vreinterprets16_u8.c b/gcc/testsuite/gcc.target/arm/neon/vreinterprets16_u8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vreinterprets16_u8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vreinterprets16_u8.c 2010-01-25 09:50:29.485687478 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vreinterprets32_f32.c b/gcc/testsuite/gcc.target/arm/neon/vreinterprets32_f32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vreinterprets32_f32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vreinterprets32_f32.c 2010-01-25 09:50:29.485687478 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vreinterprets32_p16.c b/gcc/testsuite/gcc.target/arm/neon/vreinterprets32_p16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vreinterprets32_p16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vreinterprets32_p16.c 2010-01-25 09:50:29.485687478 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vreinterprets32_p8.c b/gcc/testsuite/gcc.target/arm/neon/vreinterprets32_p8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vreinterprets32_p8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vreinterprets32_p8.c 2010-01-25 09:50:29.485687478 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vreinterprets32_s16.c b/gcc/testsuite/gcc.target/arm/neon/vreinterprets32_s16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vreinterprets32_s16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vreinterprets32_s16.c 2010-01-25 09:50:29.485687478 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vreinterprets32_s64.c b/gcc/testsuite/gcc.target/arm/neon/vreinterprets32_s64.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vreinterprets32_s64.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vreinterprets32_s64.c 2010-01-25 09:50:29.485687478 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vreinterprets32_s8.c b/gcc/testsuite/gcc.target/arm/neon/vreinterprets32_s8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vreinterprets32_s8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vreinterprets32_s8.c 2010-01-25 09:50:29.485687478 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vreinterprets32_u16.c b/gcc/testsuite/gcc.target/arm/neon/vreinterprets32_u16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vreinterprets32_u16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vreinterprets32_u16.c 2010-01-25 09:50:29.485687478 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vreinterprets32_u32.c b/gcc/testsuite/gcc.target/arm/neon/vreinterprets32_u32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vreinterprets32_u32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vreinterprets32_u32.c 2010-01-25 09:50:29.485687478 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vreinterprets32_u64.c b/gcc/testsuite/gcc.target/arm/neon/vreinterprets32_u64.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vreinterprets32_u64.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vreinterprets32_u64.c 2010-01-25 09:50:29.485687478 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vreinterprets32_u8.c b/gcc/testsuite/gcc.target/arm/neon/vreinterprets32_u8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vreinterprets32_u8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vreinterprets32_u8.c 2010-01-25 09:50:29.485687478 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vreinterprets64_f32.c b/gcc/testsuite/gcc.target/arm/neon/vreinterprets64_f32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vreinterprets64_f32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vreinterprets64_f32.c 2010-01-25 09:50:29.485687478 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vreinterprets64_p16.c b/gcc/testsuite/gcc.target/arm/neon/vreinterprets64_p16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vreinterprets64_p16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vreinterprets64_p16.c 2010-01-25 09:50:29.485687478 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vreinterprets64_p8.c b/gcc/testsuite/gcc.target/arm/neon/vreinterprets64_p8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vreinterprets64_p8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vreinterprets64_p8.c 2010-01-25 09:50:29.485687478 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vreinterprets64_s16.c b/gcc/testsuite/gcc.target/arm/neon/vreinterprets64_s16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vreinterprets64_s16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vreinterprets64_s16.c 2010-01-25 09:50:29.485687478 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vreinterprets64_s32.c b/gcc/testsuite/gcc.target/arm/neon/vreinterprets64_s32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vreinterprets64_s32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vreinterprets64_s32.c 2010-01-25 09:50:29.485687478 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vreinterprets64_s8.c b/gcc/testsuite/gcc.target/arm/neon/vreinterprets64_s8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vreinterprets64_s8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vreinterprets64_s8.c 2010-01-25 09:50:29.485687478 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vreinterprets64_u16.c b/gcc/testsuite/gcc.target/arm/neon/vreinterprets64_u16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vreinterprets64_u16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vreinterprets64_u16.c 2010-01-25 09:50:29.485687478 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vreinterprets64_u32.c b/gcc/testsuite/gcc.target/arm/neon/vreinterprets64_u32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vreinterprets64_u32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vreinterprets64_u32.c 2010-01-25 09:50:29.485687478 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vreinterprets64_u64.c b/gcc/testsuite/gcc.target/arm/neon/vreinterprets64_u64.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vreinterprets64_u64.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vreinterprets64_u64.c 2010-01-25 09:50:29.485687478 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vreinterprets64_u8.c b/gcc/testsuite/gcc.target/arm/neon/vreinterprets64_u8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vreinterprets64_u8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vreinterprets64_u8.c 2010-01-25 09:50:29.485687478 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vreinterprets8_f32.c b/gcc/testsuite/gcc.target/arm/neon/vreinterprets8_f32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vreinterprets8_f32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vreinterprets8_f32.c 2010-01-25 09:50:29.485687478 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vreinterprets8_p16.c b/gcc/testsuite/gcc.target/arm/neon/vreinterprets8_p16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vreinterprets8_p16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vreinterprets8_p16.c 2010-01-25 09:50:29.485687478 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vreinterprets8_p8.c b/gcc/testsuite/gcc.target/arm/neon/vreinterprets8_p8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vreinterprets8_p8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vreinterprets8_p8.c 2010-01-25 09:50:29.485687478 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vreinterprets8_s16.c b/gcc/testsuite/gcc.target/arm/neon/vreinterprets8_s16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vreinterprets8_s16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vreinterprets8_s16.c 2010-01-25 09:50:29.485687478 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vreinterprets8_s32.c b/gcc/testsuite/gcc.target/arm/neon/vreinterprets8_s32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vreinterprets8_s32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vreinterprets8_s32.c 2010-01-25 09:50:29.485687478 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vreinterprets8_s64.c b/gcc/testsuite/gcc.target/arm/neon/vreinterprets8_s64.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vreinterprets8_s64.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vreinterprets8_s64.c 2010-01-25 09:50:29.485687478 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vreinterprets8_u16.c b/gcc/testsuite/gcc.target/arm/neon/vreinterprets8_u16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vreinterprets8_u16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vreinterprets8_u16.c 2010-01-25 09:50:29.485687478 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vreinterprets8_u32.c b/gcc/testsuite/gcc.target/arm/neon/vreinterprets8_u32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vreinterprets8_u32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vreinterprets8_u32.c 2010-01-25 09:50:29.485687478 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vreinterprets8_u64.c b/gcc/testsuite/gcc.target/arm/neon/vreinterprets8_u64.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vreinterprets8_u64.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vreinterprets8_u64.c 2010-01-25 09:50:29.485687478 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vreinterprets8_u8.c b/gcc/testsuite/gcc.target/arm/neon/vreinterprets8_u8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vreinterprets8_u8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vreinterprets8_u8.c 2010-01-25 09:50:29.485687478 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vreinterpretu16_f32.c b/gcc/testsuite/gcc.target/arm/neon/vreinterpretu16_f32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vreinterpretu16_f32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vreinterpretu16_f32.c 2010-01-25 09:50:29.485687478 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vreinterpretu16_p16.c b/gcc/testsuite/gcc.target/arm/neon/vreinterpretu16_p16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vreinterpretu16_p16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vreinterpretu16_p16.c 2010-01-25 09:50:29.485687478 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vreinterpretu16_p8.c b/gcc/testsuite/gcc.target/arm/neon/vreinterpretu16_p8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vreinterpretu16_p8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vreinterpretu16_p8.c 2010-01-25 09:50:29.485687478 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vreinterpretu16_s16.c b/gcc/testsuite/gcc.target/arm/neon/vreinterpretu16_s16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vreinterpretu16_s16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vreinterpretu16_s16.c 2010-01-25 09:50:29.485687478 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vreinterpretu16_s32.c b/gcc/testsuite/gcc.target/arm/neon/vreinterpretu16_s32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vreinterpretu16_s32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vreinterpretu16_s32.c 2010-01-25 09:50:29.485687478 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vreinterpretu16_s64.c b/gcc/testsuite/gcc.target/arm/neon/vreinterpretu16_s64.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vreinterpretu16_s64.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vreinterpretu16_s64.c 2010-01-25 09:50:29.495687004 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vreinterpretu16_s8.c b/gcc/testsuite/gcc.target/arm/neon/vreinterpretu16_s8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vreinterpretu16_s8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vreinterpretu16_s8.c 2010-01-25 09:50:29.495687004 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vreinterpretu16_u32.c b/gcc/testsuite/gcc.target/arm/neon/vreinterpretu16_u32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vreinterpretu16_u32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vreinterpretu16_u32.c 2010-01-25 09:50:29.495687004 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vreinterpretu16_u64.c b/gcc/testsuite/gcc.target/arm/neon/vreinterpretu16_u64.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vreinterpretu16_u64.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vreinterpretu16_u64.c 2010-01-25 09:50:29.495687004 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vreinterpretu16_u8.c b/gcc/testsuite/gcc.target/arm/neon/vreinterpretu16_u8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vreinterpretu16_u8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vreinterpretu16_u8.c 2010-01-25 09:50:29.495687004 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vreinterpretu32_f32.c b/gcc/testsuite/gcc.target/arm/neon/vreinterpretu32_f32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vreinterpretu32_f32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vreinterpretu32_f32.c 2010-01-25 09:50:29.495687004 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vreinterpretu32_p16.c b/gcc/testsuite/gcc.target/arm/neon/vreinterpretu32_p16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vreinterpretu32_p16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vreinterpretu32_p16.c 2010-01-25 09:50:29.495687004 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vreinterpretu32_p8.c b/gcc/testsuite/gcc.target/arm/neon/vreinterpretu32_p8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vreinterpretu32_p8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vreinterpretu32_p8.c 2010-01-25 09:50:29.495687004 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vreinterpretu32_s16.c b/gcc/testsuite/gcc.target/arm/neon/vreinterpretu32_s16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vreinterpretu32_s16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vreinterpretu32_s16.c 2010-01-25 09:50:29.495687004 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vreinterpretu32_s32.c b/gcc/testsuite/gcc.target/arm/neon/vreinterpretu32_s32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vreinterpretu32_s32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vreinterpretu32_s32.c 2010-01-25 09:50:29.495687004 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vreinterpretu32_s64.c b/gcc/testsuite/gcc.target/arm/neon/vreinterpretu32_s64.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vreinterpretu32_s64.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vreinterpretu32_s64.c 2010-01-25 09:50:29.495687004 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vreinterpretu32_s8.c b/gcc/testsuite/gcc.target/arm/neon/vreinterpretu32_s8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vreinterpretu32_s8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vreinterpretu32_s8.c 2010-01-25 09:50:29.495687004 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vreinterpretu32_u16.c b/gcc/testsuite/gcc.target/arm/neon/vreinterpretu32_u16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vreinterpretu32_u16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vreinterpretu32_u16.c 2010-01-25 09:50:29.495687004 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vreinterpretu32_u64.c b/gcc/testsuite/gcc.target/arm/neon/vreinterpretu32_u64.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vreinterpretu32_u64.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vreinterpretu32_u64.c 2010-01-25 09:50:29.495687004 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vreinterpretu32_u8.c b/gcc/testsuite/gcc.target/arm/neon/vreinterpretu32_u8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vreinterpretu32_u8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vreinterpretu32_u8.c 2010-01-25 09:50:29.495687004 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vreinterpretu64_f32.c b/gcc/testsuite/gcc.target/arm/neon/vreinterpretu64_f32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vreinterpretu64_f32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vreinterpretu64_f32.c 2010-01-25 09:50:29.495687004 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vreinterpretu64_p16.c b/gcc/testsuite/gcc.target/arm/neon/vreinterpretu64_p16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vreinterpretu64_p16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vreinterpretu64_p16.c 2010-01-25 09:50:29.495687004 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vreinterpretu64_p8.c b/gcc/testsuite/gcc.target/arm/neon/vreinterpretu64_p8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vreinterpretu64_p8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vreinterpretu64_p8.c 2010-01-25 09:50:29.495687004 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vreinterpretu64_s16.c b/gcc/testsuite/gcc.target/arm/neon/vreinterpretu64_s16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vreinterpretu64_s16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vreinterpretu64_s16.c 2010-01-25 09:50:29.495687004 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vreinterpretu64_s32.c b/gcc/testsuite/gcc.target/arm/neon/vreinterpretu64_s32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vreinterpretu64_s32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vreinterpretu64_s32.c 2010-01-25 09:50:29.495687004 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vreinterpretu64_s64.c b/gcc/testsuite/gcc.target/arm/neon/vreinterpretu64_s64.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vreinterpretu64_s64.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vreinterpretu64_s64.c 2010-01-25 09:50:29.495687004 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vreinterpretu64_s8.c b/gcc/testsuite/gcc.target/arm/neon/vreinterpretu64_s8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vreinterpretu64_s8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vreinterpretu64_s8.c 2010-01-25 09:50:29.495687004 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vreinterpretu64_u16.c b/gcc/testsuite/gcc.target/arm/neon/vreinterpretu64_u16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vreinterpretu64_u16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vreinterpretu64_u16.c 2010-01-25 09:50:29.495687004 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vreinterpretu64_u32.c b/gcc/testsuite/gcc.target/arm/neon/vreinterpretu64_u32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vreinterpretu64_u32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vreinterpretu64_u32.c 2010-01-25 09:50:29.495687004 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vreinterpretu64_u8.c b/gcc/testsuite/gcc.target/arm/neon/vreinterpretu64_u8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vreinterpretu64_u8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vreinterpretu64_u8.c 2010-01-25 09:50:29.495687004 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vreinterpretu8_f32.c b/gcc/testsuite/gcc.target/arm/neon/vreinterpretu8_f32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vreinterpretu8_f32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vreinterpretu8_f32.c 2010-01-25 09:50:29.495687004 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vreinterpretu8_p16.c b/gcc/testsuite/gcc.target/arm/neon/vreinterpretu8_p16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vreinterpretu8_p16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vreinterpretu8_p16.c 2010-01-25 09:50:29.495687004 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vreinterpretu8_p8.c b/gcc/testsuite/gcc.target/arm/neon/vreinterpretu8_p8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vreinterpretu8_p8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vreinterpretu8_p8.c 2010-01-25 09:50:29.495687004 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vreinterpretu8_s16.c b/gcc/testsuite/gcc.target/arm/neon/vreinterpretu8_s16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vreinterpretu8_s16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vreinterpretu8_s16.c 2010-01-25 09:50:29.495687004 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vreinterpretu8_s32.c b/gcc/testsuite/gcc.target/arm/neon/vreinterpretu8_s32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vreinterpretu8_s32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vreinterpretu8_s32.c 2010-01-25 09:50:29.495687004 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vreinterpretu8_s64.c b/gcc/testsuite/gcc.target/arm/neon/vreinterpretu8_s64.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vreinterpretu8_s64.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vreinterpretu8_s64.c 2010-01-25 09:50:29.495687004 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vreinterpretu8_s8.c b/gcc/testsuite/gcc.target/arm/neon/vreinterpretu8_s8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vreinterpretu8_s8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vreinterpretu8_s8.c 2010-01-25 09:50:29.495687004 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vreinterpretu8_u16.c b/gcc/testsuite/gcc.target/arm/neon/vreinterpretu8_u16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vreinterpretu8_u16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vreinterpretu8_u16.c 2010-01-25 09:50:29.495687004 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vreinterpretu8_u32.c b/gcc/testsuite/gcc.target/arm/neon/vreinterpretu8_u32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vreinterpretu8_u32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vreinterpretu8_u32.c 2010-01-25 09:50:29.495687004 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vreinterpretu8_u64.c b/gcc/testsuite/gcc.target/arm/neon/vreinterpretu8_u64.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vreinterpretu8_u64.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vreinterpretu8_u64.c 2010-01-25 09:50:29.495687004 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vrev16p8.c b/gcc/testsuite/gcc.target/arm/neon/vrev16p8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vrev16p8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vrev16p8.c 2010-01-25 09:50:29.495687004 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vrev16Qp8.c b/gcc/testsuite/gcc.target/arm/neon/vrev16Qp8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vrev16Qp8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vrev16Qp8.c 2010-01-25 09:50:29.495687004 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vrev16Qs8.c b/gcc/testsuite/gcc.target/arm/neon/vrev16Qs8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vrev16Qs8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vrev16Qs8.c 2010-01-25 09:50:29.495687004 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vrev16Qu8.c b/gcc/testsuite/gcc.target/arm/neon/vrev16Qu8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vrev16Qu8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vrev16Qu8.c 2010-01-25 09:50:29.495687004 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vrev16s8.c b/gcc/testsuite/gcc.target/arm/neon/vrev16s8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vrev16s8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vrev16s8.c 2010-01-25 09:50:29.495687004 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vrev16u8.c b/gcc/testsuite/gcc.target/arm/neon/vrev16u8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vrev16u8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vrev16u8.c 2010-01-25 09:50:29.495687004 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vrev32p16.c b/gcc/testsuite/gcc.target/arm/neon/vrev32p16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vrev32p16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vrev32p16.c 2010-01-25 09:50:29.495687004 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vrev32p8.c b/gcc/testsuite/gcc.target/arm/neon/vrev32p8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vrev32p8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vrev32p8.c 2010-01-25 09:50:29.495687004 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vrev32Qp16.c b/gcc/testsuite/gcc.target/arm/neon/vrev32Qp16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vrev32Qp16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vrev32Qp16.c 2010-01-25 09:50:29.495687004 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vrev32Qp8.c b/gcc/testsuite/gcc.target/arm/neon/vrev32Qp8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vrev32Qp8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vrev32Qp8.c 2010-01-25 09:50:29.495687004 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vrev32Qs16.c b/gcc/testsuite/gcc.target/arm/neon/vrev32Qs16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vrev32Qs16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vrev32Qs16.c 2010-01-25 09:50:29.495687004 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vrev32Qs8.c b/gcc/testsuite/gcc.target/arm/neon/vrev32Qs8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vrev32Qs8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vrev32Qs8.c 2010-01-25 09:50:29.495687004 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vrev32Qu16.c b/gcc/testsuite/gcc.target/arm/neon/vrev32Qu16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vrev32Qu16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vrev32Qu16.c 2010-01-25 09:50:29.495687004 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vrev32Qu8.c b/gcc/testsuite/gcc.target/arm/neon/vrev32Qu8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vrev32Qu8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vrev32Qu8.c 2010-01-25 09:50:29.495687004 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vrev32s16.c b/gcc/testsuite/gcc.target/arm/neon/vrev32s16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vrev32s16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vrev32s16.c 2010-01-25 09:50:29.495687004 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vrev32s8.c b/gcc/testsuite/gcc.target/arm/neon/vrev32s8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vrev32s8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vrev32s8.c 2010-01-25 09:50:29.495687004 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vrev32u16.c b/gcc/testsuite/gcc.target/arm/neon/vrev32u16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vrev32u16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vrev32u16.c 2010-01-25 09:50:29.495687004 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vrev32u8.c b/gcc/testsuite/gcc.target/arm/neon/vrev32u8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vrev32u8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vrev32u8.c 2010-01-25 09:50:29.495687004 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vrev64f32.c b/gcc/testsuite/gcc.target/arm/neon/vrev64f32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vrev64f32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vrev64f32.c 2010-01-25 09:50:29.495687004 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vrev64p16.c b/gcc/testsuite/gcc.target/arm/neon/vrev64p16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vrev64p16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vrev64p16.c 2010-01-25 09:50:29.495687004 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vrev64p8.c b/gcc/testsuite/gcc.target/arm/neon/vrev64p8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vrev64p8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vrev64p8.c 2010-01-25 09:50:29.495687004 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vrev64Qf32.c b/gcc/testsuite/gcc.target/arm/neon/vrev64Qf32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vrev64Qf32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vrev64Qf32.c 2010-01-25 09:50:29.495687004 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vrev64Qp16.c b/gcc/testsuite/gcc.target/arm/neon/vrev64Qp16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vrev64Qp16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vrev64Qp16.c 2010-01-25 09:50:29.495687004 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vrev64Qp8.c b/gcc/testsuite/gcc.target/arm/neon/vrev64Qp8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vrev64Qp8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vrev64Qp8.c 2010-01-25 09:50:29.495687004 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vrev64Qs16.c b/gcc/testsuite/gcc.target/arm/neon/vrev64Qs16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vrev64Qs16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vrev64Qs16.c 2010-01-25 09:50:29.495687004 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vrev64Qs32.c b/gcc/testsuite/gcc.target/arm/neon/vrev64Qs32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vrev64Qs32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vrev64Qs32.c 2010-01-25 09:50:29.495687004 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vrev64Qs8.c b/gcc/testsuite/gcc.target/arm/neon/vrev64Qs8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vrev64Qs8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vrev64Qs8.c 2010-01-25 09:50:29.495687004 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vrev64Qu16.c b/gcc/testsuite/gcc.target/arm/neon/vrev64Qu16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vrev64Qu16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vrev64Qu16.c 2010-01-25 09:50:29.495687004 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vrev64Qu32.c b/gcc/testsuite/gcc.target/arm/neon/vrev64Qu32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vrev64Qu32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vrev64Qu32.c 2010-01-25 09:50:29.495687004 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vrev64Qu8.c b/gcc/testsuite/gcc.target/arm/neon/vrev64Qu8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vrev64Qu8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vrev64Qu8.c 2010-01-25 09:50:29.495687004 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vrev64s16.c b/gcc/testsuite/gcc.target/arm/neon/vrev64s16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vrev64s16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vrev64s16.c 2010-01-25 09:50:29.495687004 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vrev64s32.c b/gcc/testsuite/gcc.target/arm/neon/vrev64s32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vrev64s32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vrev64s32.c 2010-01-25 09:50:29.495687004 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vrev64s8.c b/gcc/testsuite/gcc.target/arm/neon/vrev64s8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vrev64s8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vrev64s8.c 2010-01-25 09:50:29.495687004 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vrev64u16.c b/gcc/testsuite/gcc.target/arm/neon/vrev64u16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vrev64u16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vrev64u16.c 2010-01-25 09:50:29.495687004 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vrev64u32.c b/gcc/testsuite/gcc.target/arm/neon/vrev64u32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vrev64u32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vrev64u32.c 2010-01-25 09:50:29.495687004 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vrev64u8.c b/gcc/testsuite/gcc.target/arm/neon/vrev64u8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vrev64u8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vrev64u8.c 2010-01-25 09:50:29.495687004 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vRhaddQs16.c b/gcc/testsuite/gcc.target/arm/neon/vRhaddQs16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vRhaddQs16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vRhaddQs16.c 2010-01-25 09:50:29.495687004 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vRhaddQs32.c b/gcc/testsuite/gcc.target/arm/neon/vRhaddQs32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vRhaddQs32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vRhaddQs32.c 2010-01-25 09:50:29.495687004 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vRhaddQs8.c b/gcc/testsuite/gcc.target/arm/neon/vRhaddQs8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vRhaddQs8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vRhaddQs8.c 2010-01-25 09:50:29.495687004 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vRhaddQu16.c b/gcc/testsuite/gcc.target/arm/neon/vRhaddQu16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vRhaddQu16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vRhaddQu16.c 2010-01-25 09:50:29.505686669 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vRhaddQu32.c b/gcc/testsuite/gcc.target/arm/neon/vRhaddQu32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vRhaddQu32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vRhaddQu32.c 2010-01-25 09:50:29.505686669 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vRhaddQu8.c b/gcc/testsuite/gcc.target/arm/neon/vRhaddQu8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vRhaddQu8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vRhaddQu8.c 2010-01-25 09:50:29.505686669 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vRhadds16.c b/gcc/testsuite/gcc.target/arm/neon/vRhadds16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vRhadds16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vRhadds16.c 2010-01-25 09:50:29.505686669 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vRhadds32.c b/gcc/testsuite/gcc.target/arm/neon/vRhadds32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vRhadds32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vRhadds32.c 2010-01-25 09:50:29.505686669 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vRhadds8.c b/gcc/testsuite/gcc.target/arm/neon/vRhadds8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vRhadds8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vRhadds8.c 2010-01-25 09:50:29.505686669 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vRhaddu16.c b/gcc/testsuite/gcc.target/arm/neon/vRhaddu16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vRhaddu16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vRhaddu16.c 2010-01-25 09:50:29.505686669 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vRhaddu32.c b/gcc/testsuite/gcc.target/arm/neon/vRhaddu32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vRhaddu32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vRhaddu32.c 2010-01-25 09:50:29.505686669 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vRhaddu8.c b/gcc/testsuite/gcc.target/arm/neon/vRhaddu8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vRhaddu8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vRhaddu8.c 2010-01-25 09:50:29.505686669 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vRshlQs16.c b/gcc/testsuite/gcc.target/arm/neon/vRshlQs16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vRshlQs16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vRshlQs16.c 2010-01-25 09:50:29.505686669 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vRshlQs32.c b/gcc/testsuite/gcc.target/arm/neon/vRshlQs32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vRshlQs32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vRshlQs32.c 2010-01-25 09:50:29.505686669 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vRshlQs64.c b/gcc/testsuite/gcc.target/arm/neon/vRshlQs64.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vRshlQs64.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vRshlQs64.c 2010-01-25 09:50:29.505686669 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vRshlQs8.c b/gcc/testsuite/gcc.target/arm/neon/vRshlQs8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vRshlQs8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vRshlQs8.c 2010-01-25 09:50:29.505686669 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vRshlQu16.c b/gcc/testsuite/gcc.target/arm/neon/vRshlQu16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vRshlQu16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vRshlQu16.c 2010-01-25 09:50:29.505686669 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vRshlQu32.c b/gcc/testsuite/gcc.target/arm/neon/vRshlQu32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vRshlQu32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vRshlQu32.c 2010-01-25 09:50:29.505686669 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vRshlQu64.c b/gcc/testsuite/gcc.target/arm/neon/vRshlQu64.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vRshlQu64.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vRshlQu64.c 2010-01-25 09:50:29.505686669 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vRshlQu8.c b/gcc/testsuite/gcc.target/arm/neon/vRshlQu8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vRshlQu8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vRshlQu8.c 2010-01-25 09:50:29.505686669 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vRshls16.c b/gcc/testsuite/gcc.target/arm/neon/vRshls16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vRshls16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vRshls16.c 2010-01-25 09:50:29.505686669 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vRshls32.c b/gcc/testsuite/gcc.target/arm/neon/vRshls32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vRshls32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vRshls32.c 2010-01-25 09:50:29.505686669 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vRshls64.c b/gcc/testsuite/gcc.target/arm/neon/vRshls64.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vRshls64.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vRshls64.c 2010-01-25 09:50:29.505686669 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vRshls8.c b/gcc/testsuite/gcc.target/arm/neon/vRshls8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vRshls8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vRshls8.c 2010-01-25 09:50:29.505686669 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vRshlu16.c b/gcc/testsuite/gcc.target/arm/neon/vRshlu16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vRshlu16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vRshlu16.c 2010-01-25 09:50:29.505686669 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vRshlu32.c b/gcc/testsuite/gcc.target/arm/neon/vRshlu32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vRshlu32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vRshlu32.c 2010-01-25 09:50:29.505686669 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vRshlu64.c b/gcc/testsuite/gcc.target/arm/neon/vRshlu64.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vRshlu64.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vRshlu64.c 2010-01-25 09:50:29.505686669 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vRshlu8.c b/gcc/testsuite/gcc.target/arm/neon/vRshlu8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vRshlu8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vRshlu8.c 2010-01-25 09:50:29.505686669 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vRshrn_ns16.c b/gcc/testsuite/gcc.target/arm/neon/vRshrn_ns16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vRshrn_ns16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vRshrn_ns16.c 2010-01-25 09:50:29.505686669 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vRshrn_ns32.c b/gcc/testsuite/gcc.target/arm/neon/vRshrn_ns32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vRshrn_ns32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vRshrn_ns32.c 2010-01-25 09:50:29.505686669 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vRshrn_ns64.c b/gcc/testsuite/gcc.target/arm/neon/vRshrn_ns64.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vRshrn_ns64.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vRshrn_ns64.c 2010-01-25 09:50:29.505686669 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vRshrn_nu16.c b/gcc/testsuite/gcc.target/arm/neon/vRshrn_nu16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vRshrn_nu16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vRshrn_nu16.c 2010-01-25 09:50:29.505686669 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vRshrn_nu32.c b/gcc/testsuite/gcc.target/arm/neon/vRshrn_nu32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vRshrn_nu32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vRshrn_nu32.c 2010-01-25 09:50:29.505686669 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vRshrn_nu64.c b/gcc/testsuite/gcc.target/arm/neon/vRshrn_nu64.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vRshrn_nu64.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vRshrn_nu64.c 2010-01-25 09:50:29.505686669 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vRshr_ns16.c b/gcc/testsuite/gcc.target/arm/neon/vRshr_ns16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vRshr_ns16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vRshr_ns16.c 2010-01-25 09:50:29.505686669 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vRshr_ns32.c b/gcc/testsuite/gcc.target/arm/neon/vRshr_ns32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vRshr_ns32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vRshr_ns32.c 2010-01-25 09:50:29.505686669 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vRshr_ns64.c b/gcc/testsuite/gcc.target/arm/neon/vRshr_ns64.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vRshr_ns64.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vRshr_ns64.c 2010-01-25 09:50:29.505686669 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vRshr_ns8.c b/gcc/testsuite/gcc.target/arm/neon/vRshr_ns8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vRshr_ns8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vRshr_ns8.c 2010-01-25 09:50:29.505686669 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vRshr_nu16.c b/gcc/testsuite/gcc.target/arm/neon/vRshr_nu16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vRshr_nu16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vRshr_nu16.c 2010-01-25 09:50:29.505686669 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vRshr_nu32.c b/gcc/testsuite/gcc.target/arm/neon/vRshr_nu32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vRshr_nu32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vRshr_nu32.c 2010-01-25 09:50:29.505686669 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vRshr_nu64.c b/gcc/testsuite/gcc.target/arm/neon/vRshr_nu64.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vRshr_nu64.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vRshr_nu64.c 2010-01-25 09:50:29.505686669 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vRshr_nu8.c b/gcc/testsuite/gcc.target/arm/neon/vRshr_nu8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vRshr_nu8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vRshr_nu8.c 2010-01-25 09:50:29.505686669 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vRshrQ_ns16.c b/gcc/testsuite/gcc.target/arm/neon/vRshrQ_ns16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vRshrQ_ns16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vRshrQ_ns16.c 2010-01-25 09:50:29.505686669 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vRshrQ_ns32.c b/gcc/testsuite/gcc.target/arm/neon/vRshrQ_ns32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vRshrQ_ns32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vRshrQ_ns32.c 2010-01-25 09:50:29.505686669 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vRshrQ_ns64.c b/gcc/testsuite/gcc.target/arm/neon/vRshrQ_ns64.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vRshrQ_ns64.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vRshrQ_ns64.c 2010-01-25 09:50:29.505686669 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vRshrQ_ns8.c b/gcc/testsuite/gcc.target/arm/neon/vRshrQ_ns8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vRshrQ_ns8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vRshrQ_ns8.c 2010-01-25 09:50:29.505686669 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vRshrQ_nu16.c b/gcc/testsuite/gcc.target/arm/neon/vRshrQ_nu16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vRshrQ_nu16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vRshrQ_nu16.c 2010-01-25 09:50:29.505686669 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vRshrQ_nu32.c b/gcc/testsuite/gcc.target/arm/neon/vRshrQ_nu32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vRshrQ_nu32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vRshrQ_nu32.c 2010-01-25 09:50:29.505686669 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vRshrQ_nu64.c b/gcc/testsuite/gcc.target/arm/neon/vRshrQ_nu64.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vRshrQ_nu64.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vRshrQ_nu64.c 2010-01-25 09:50:29.505686669 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vRshrQ_nu8.c b/gcc/testsuite/gcc.target/arm/neon/vRshrQ_nu8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vRshrQ_nu8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vRshrQ_nu8.c 2010-01-25 09:50:29.505686669 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vrsqrtef32.c b/gcc/testsuite/gcc.target/arm/neon/vrsqrtef32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vrsqrtef32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vrsqrtef32.c 2010-01-25 09:50:29.505686669 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vrsqrteQf32.c b/gcc/testsuite/gcc.target/arm/neon/vrsqrteQf32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vrsqrteQf32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vrsqrteQf32.c 2010-01-25 09:50:29.505686669 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vrsqrteQu32.c b/gcc/testsuite/gcc.target/arm/neon/vrsqrteQu32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vrsqrteQu32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vrsqrteQu32.c 2010-01-25 09:50:29.505686669 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vrsqrteu32.c b/gcc/testsuite/gcc.target/arm/neon/vrsqrteu32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vrsqrteu32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vrsqrteu32.c 2010-01-25 09:50:29.505686669 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vrsqrtsf32.c b/gcc/testsuite/gcc.target/arm/neon/vrsqrtsf32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vrsqrtsf32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vrsqrtsf32.c 2010-01-25 09:50:29.505686669 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vrsqrtsQf32.c b/gcc/testsuite/gcc.target/arm/neon/vrsqrtsQf32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vrsqrtsQf32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vrsqrtsQf32.c 2010-01-25 09:50:29.505686669 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vRsra_ns16.c b/gcc/testsuite/gcc.target/arm/neon/vRsra_ns16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vRsra_ns16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vRsra_ns16.c 2010-01-25 09:50:29.505686669 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vRsra_ns32.c b/gcc/testsuite/gcc.target/arm/neon/vRsra_ns32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vRsra_ns32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vRsra_ns32.c 2010-01-25 09:50:29.505686669 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vRsra_ns64.c b/gcc/testsuite/gcc.target/arm/neon/vRsra_ns64.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vRsra_ns64.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vRsra_ns64.c 2010-01-25 09:50:29.505686669 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vRsra_ns8.c b/gcc/testsuite/gcc.target/arm/neon/vRsra_ns8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vRsra_ns8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vRsra_ns8.c 2010-01-25 09:50:29.505686669 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vRsra_nu16.c b/gcc/testsuite/gcc.target/arm/neon/vRsra_nu16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vRsra_nu16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vRsra_nu16.c 2010-01-25 09:50:29.505686669 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vRsra_nu32.c b/gcc/testsuite/gcc.target/arm/neon/vRsra_nu32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vRsra_nu32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vRsra_nu32.c 2010-01-25 09:50:29.505686669 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vRsra_nu64.c b/gcc/testsuite/gcc.target/arm/neon/vRsra_nu64.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vRsra_nu64.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vRsra_nu64.c 2010-01-25 09:50:29.505686669 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vRsra_nu8.c b/gcc/testsuite/gcc.target/arm/neon/vRsra_nu8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vRsra_nu8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vRsra_nu8.c 2010-01-25 09:50:29.505686669 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vRsraQ_ns16.c b/gcc/testsuite/gcc.target/arm/neon/vRsraQ_ns16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vRsraQ_ns16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vRsraQ_ns16.c 2010-01-25 09:50:29.505686669 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vRsraQ_ns32.c b/gcc/testsuite/gcc.target/arm/neon/vRsraQ_ns32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vRsraQ_ns32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vRsraQ_ns32.c 2010-01-25 09:50:29.505686669 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vRsraQ_ns64.c b/gcc/testsuite/gcc.target/arm/neon/vRsraQ_ns64.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vRsraQ_ns64.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vRsraQ_ns64.c 2010-01-25 09:50:29.505686669 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vRsraQ_ns8.c b/gcc/testsuite/gcc.target/arm/neon/vRsraQ_ns8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vRsraQ_ns8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vRsraQ_ns8.c 2010-01-25 09:50:29.505686669 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vRsraQ_nu16.c b/gcc/testsuite/gcc.target/arm/neon/vRsraQ_nu16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vRsraQ_nu16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vRsraQ_nu16.c 2010-01-25 09:50:29.505686669 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vRsraQ_nu32.c b/gcc/testsuite/gcc.target/arm/neon/vRsraQ_nu32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vRsraQ_nu32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vRsraQ_nu32.c 2010-01-25 09:50:29.505686669 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vRsraQ_nu64.c b/gcc/testsuite/gcc.target/arm/neon/vRsraQ_nu64.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vRsraQ_nu64.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vRsraQ_nu64.c 2010-01-25 09:50:29.505686669 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vRsraQ_nu8.c b/gcc/testsuite/gcc.target/arm/neon/vRsraQ_nu8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vRsraQ_nu8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vRsraQ_nu8.c 2010-01-25 09:50:29.505686669 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vRsubhns16.c b/gcc/testsuite/gcc.target/arm/neon/vRsubhns16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vRsubhns16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vRsubhns16.c 2010-01-25 09:50:29.505686669 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vRsubhns32.c b/gcc/testsuite/gcc.target/arm/neon/vRsubhns32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vRsubhns32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vRsubhns32.c 2010-01-25 09:50:29.505686669 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vRsubhns64.c b/gcc/testsuite/gcc.target/arm/neon/vRsubhns64.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vRsubhns64.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vRsubhns64.c 2010-01-25 09:50:29.505686669 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vRsubhnu16.c b/gcc/testsuite/gcc.target/arm/neon/vRsubhnu16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vRsubhnu16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vRsubhnu16.c 2010-01-25 09:50:29.515686194 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vRsubhnu32.c b/gcc/testsuite/gcc.target/arm/neon/vRsubhnu32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vRsubhnu32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vRsubhnu32.c 2010-01-25 09:50:29.515686194 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vRsubhnu64.c b/gcc/testsuite/gcc.target/arm/neon/vRsubhnu64.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vRsubhnu64.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vRsubhnu64.c 2010-01-25 09:50:29.515686194 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vset_lanef32.c b/gcc/testsuite/gcc.target/arm/neon/vset_lanef32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vset_lanef32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vset_lanef32.c 2010-01-25 09:50:29.515686194 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vset_lanep16.c b/gcc/testsuite/gcc.target/arm/neon/vset_lanep16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vset_lanep16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vset_lanep16.c 2010-01-25 09:50:29.515686194 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vset_lanep8.c b/gcc/testsuite/gcc.target/arm/neon/vset_lanep8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vset_lanep8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vset_lanep8.c 2010-01-25 09:50:29.515686194 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vset_lanes16.c b/gcc/testsuite/gcc.target/arm/neon/vset_lanes16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vset_lanes16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vset_lanes16.c 2010-01-25 09:50:29.515686194 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vset_lanes32.c b/gcc/testsuite/gcc.target/arm/neon/vset_lanes32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vset_lanes32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vset_lanes32.c 2010-01-25 09:50:29.515686194 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vset_lanes64.c b/gcc/testsuite/gcc.target/arm/neon/vset_lanes64.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vset_lanes64.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vset_lanes64.c 2010-01-25 09:50:29.515686194 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vset_lanes8.c b/gcc/testsuite/gcc.target/arm/neon/vset_lanes8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vset_lanes8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vset_lanes8.c 2010-01-25 09:50:29.515686194 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vset_laneu16.c b/gcc/testsuite/gcc.target/arm/neon/vset_laneu16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vset_laneu16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vset_laneu16.c 2010-01-25 09:50:29.515686194 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vset_laneu32.c b/gcc/testsuite/gcc.target/arm/neon/vset_laneu32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vset_laneu32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vset_laneu32.c 2010-01-25 09:50:29.515686194 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vset_laneu64.c b/gcc/testsuite/gcc.target/arm/neon/vset_laneu64.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vset_laneu64.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vset_laneu64.c 2010-01-25 09:50:29.515686194 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vset_laneu8.c b/gcc/testsuite/gcc.target/arm/neon/vset_laneu8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vset_laneu8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vset_laneu8.c 2010-01-25 09:50:29.515686194 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vsetQ_lanef32.c b/gcc/testsuite/gcc.target/arm/neon/vsetQ_lanef32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vsetQ_lanef32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vsetQ_lanef32.c 2010-01-25 09:50:29.515686194 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vsetQ_lanep16.c b/gcc/testsuite/gcc.target/arm/neon/vsetQ_lanep16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vsetQ_lanep16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vsetQ_lanep16.c 2010-01-25 09:50:29.515686194 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vsetQ_lanep8.c b/gcc/testsuite/gcc.target/arm/neon/vsetQ_lanep8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vsetQ_lanep8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vsetQ_lanep8.c 2010-01-25 09:50:29.515686194 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vsetQ_lanes16.c b/gcc/testsuite/gcc.target/arm/neon/vsetQ_lanes16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vsetQ_lanes16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vsetQ_lanes16.c 2010-01-25 09:50:29.515686194 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vsetQ_lanes32.c b/gcc/testsuite/gcc.target/arm/neon/vsetQ_lanes32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vsetQ_lanes32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vsetQ_lanes32.c 2010-01-25 09:50:29.515686194 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vsetQ_lanes64.c b/gcc/testsuite/gcc.target/arm/neon/vsetQ_lanes64.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vsetQ_lanes64.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vsetQ_lanes64.c 2010-01-25 09:50:29.515686194 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vsetQ_lanes8.c b/gcc/testsuite/gcc.target/arm/neon/vsetQ_lanes8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vsetQ_lanes8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vsetQ_lanes8.c 2010-01-25 09:50:29.515686194 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vsetQ_laneu16.c b/gcc/testsuite/gcc.target/arm/neon/vsetQ_laneu16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vsetQ_laneu16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vsetQ_laneu16.c 2010-01-25 09:50:29.515686194 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vsetQ_laneu32.c b/gcc/testsuite/gcc.target/arm/neon/vsetQ_laneu32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vsetQ_laneu32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vsetQ_laneu32.c 2010-01-25 09:50:29.515686194 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vsetQ_laneu64.c b/gcc/testsuite/gcc.target/arm/neon/vsetQ_laneu64.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vsetQ_laneu64.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vsetQ_laneu64.c 2010-01-25 09:50:29.515686194 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vsetQ_laneu8.c b/gcc/testsuite/gcc.target/arm/neon/vsetQ_laneu8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vsetQ_laneu8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vsetQ_laneu8.c 2010-01-25 09:50:29.515686194 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vshll_ns16.c b/gcc/testsuite/gcc.target/arm/neon/vshll_ns16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vshll_ns16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vshll_ns16.c 2010-01-25 09:50:29.515686194 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vshll_ns32.c b/gcc/testsuite/gcc.target/arm/neon/vshll_ns32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vshll_ns32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vshll_ns32.c 2010-01-25 09:50:29.515686194 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vshll_ns8.c b/gcc/testsuite/gcc.target/arm/neon/vshll_ns8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vshll_ns8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vshll_ns8.c 2010-01-25 09:50:29.515686194 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vshll_nu16.c b/gcc/testsuite/gcc.target/arm/neon/vshll_nu16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vshll_nu16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vshll_nu16.c 2010-01-25 09:50:29.515686194 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vshll_nu32.c b/gcc/testsuite/gcc.target/arm/neon/vshll_nu32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vshll_nu32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vshll_nu32.c 2010-01-25 09:50:29.515686194 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vshll_nu8.c b/gcc/testsuite/gcc.target/arm/neon/vshll_nu8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vshll_nu8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vshll_nu8.c 2010-01-25 09:50:29.515686194 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vshl_ns16.c b/gcc/testsuite/gcc.target/arm/neon/vshl_ns16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vshl_ns16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vshl_ns16.c 2010-01-25 09:50:29.515686194 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vshl_ns32.c b/gcc/testsuite/gcc.target/arm/neon/vshl_ns32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vshl_ns32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vshl_ns32.c 2010-01-25 09:50:29.515686194 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vshl_ns64.c b/gcc/testsuite/gcc.target/arm/neon/vshl_ns64.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vshl_ns64.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vshl_ns64.c 2010-01-25 09:50:29.515686194 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vshl_ns8.c b/gcc/testsuite/gcc.target/arm/neon/vshl_ns8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vshl_ns8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vshl_ns8.c 2010-01-25 09:50:29.515686194 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vshl_nu16.c b/gcc/testsuite/gcc.target/arm/neon/vshl_nu16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vshl_nu16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vshl_nu16.c 2010-01-25 09:50:29.515686194 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vshl_nu32.c b/gcc/testsuite/gcc.target/arm/neon/vshl_nu32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vshl_nu32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vshl_nu32.c 2010-01-25 09:50:29.515686194 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vshl_nu64.c b/gcc/testsuite/gcc.target/arm/neon/vshl_nu64.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vshl_nu64.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vshl_nu64.c 2010-01-25 09:50:29.515686194 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vshl_nu8.c b/gcc/testsuite/gcc.target/arm/neon/vshl_nu8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vshl_nu8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vshl_nu8.c 2010-01-25 09:50:29.515686194 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vshlQ_ns16.c b/gcc/testsuite/gcc.target/arm/neon/vshlQ_ns16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vshlQ_ns16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vshlQ_ns16.c 2010-01-25 09:50:29.515686194 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vshlQ_ns32.c b/gcc/testsuite/gcc.target/arm/neon/vshlQ_ns32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vshlQ_ns32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vshlQ_ns32.c 2010-01-25 09:50:29.515686194 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vshlQ_ns64.c b/gcc/testsuite/gcc.target/arm/neon/vshlQ_ns64.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vshlQ_ns64.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vshlQ_ns64.c 2010-01-25 09:50:29.515686194 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vshlQ_ns8.c b/gcc/testsuite/gcc.target/arm/neon/vshlQ_ns8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vshlQ_ns8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vshlQ_ns8.c 2010-01-25 09:50:29.515686194 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vshlQ_nu16.c b/gcc/testsuite/gcc.target/arm/neon/vshlQ_nu16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vshlQ_nu16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vshlQ_nu16.c 2010-01-25 09:50:29.515686194 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vshlQ_nu32.c b/gcc/testsuite/gcc.target/arm/neon/vshlQ_nu32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vshlQ_nu32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vshlQ_nu32.c 2010-01-25 09:50:29.515686194 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vshlQ_nu64.c b/gcc/testsuite/gcc.target/arm/neon/vshlQ_nu64.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vshlQ_nu64.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vshlQ_nu64.c 2010-01-25 09:50:29.515686194 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vshlQ_nu8.c b/gcc/testsuite/gcc.target/arm/neon/vshlQ_nu8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vshlQ_nu8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vshlQ_nu8.c 2010-01-25 09:50:29.515686194 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vshlQs16.c b/gcc/testsuite/gcc.target/arm/neon/vshlQs16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vshlQs16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vshlQs16.c 2010-01-25 09:50:29.515686194 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vshlQs32.c b/gcc/testsuite/gcc.target/arm/neon/vshlQs32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vshlQs32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vshlQs32.c 2010-01-25 09:50:29.515686194 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vshlQs64.c b/gcc/testsuite/gcc.target/arm/neon/vshlQs64.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vshlQs64.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vshlQs64.c 2010-01-25 09:50:29.515686194 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vshlQs8.c b/gcc/testsuite/gcc.target/arm/neon/vshlQs8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vshlQs8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vshlQs8.c 2010-01-25 09:50:29.515686194 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vshlQu16.c b/gcc/testsuite/gcc.target/arm/neon/vshlQu16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vshlQu16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vshlQu16.c 2010-01-25 09:50:29.515686194 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vshlQu32.c b/gcc/testsuite/gcc.target/arm/neon/vshlQu32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vshlQu32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vshlQu32.c 2010-01-25 09:50:29.515686194 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vshlQu64.c b/gcc/testsuite/gcc.target/arm/neon/vshlQu64.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vshlQu64.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vshlQu64.c 2010-01-25 09:50:29.515686194 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vshlQu8.c b/gcc/testsuite/gcc.target/arm/neon/vshlQu8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vshlQu8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vshlQu8.c 2010-01-25 09:50:29.515686194 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vshls16.c b/gcc/testsuite/gcc.target/arm/neon/vshls16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vshls16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vshls16.c 2010-01-25 09:50:29.515686194 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vshls32.c b/gcc/testsuite/gcc.target/arm/neon/vshls32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vshls32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vshls32.c 2010-01-25 09:50:29.515686194 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vshls64.c b/gcc/testsuite/gcc.target/arm/neon/vshls64.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vshls64.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vshls64.c 2010-01-25 09:50:29.515686194 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vshls8.c b/gcc/testsuite/gcc.target/arm/neon/vshls8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vshls8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vshls8.c 2010-01-25 09:50:29.515686194 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vshlu16.c b/gcc/testsuite/gcc.target/arm/neon/vshlu16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vshlu16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vshlu16.c 2010-01-25 09:50:29.515686194 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vshlu32.c b/gcc/testsuite/gcc.target/arm/neon/vshlu32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vshlu32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vshlu32.c 2010-01-25 09:50:29.515686194 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vshlu64.c b/gcc/testsuite/gcc.target/arm/neon/vshlu64.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vshlu64.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vshlu64.c 2010-01-25 09:50:29.515686194 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vshlu8.c b/gcc/testsuite/gcc.target/arm/neon/vshlu8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vshlu8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vshlu8.c 2010-01-25 09:50:29.515686194 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vshrn_ns16.c b/gcc/testsuite/gcc.target/arm/neon/vshrn_ns16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vshrn_ns16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vshrn_ns16.c 2010-01-25 09:50:29.515686194 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vshrn_ns32.c b/gcc/testsuite/gcc.target/arm/neon/vshrn_ns32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vshrn_ns32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vshrn_ns32.c 2010-01-25 09:50:29.515686194 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vshrn_ns64.c b/gcc/testsuite/gcc.target/arm/neon/vshrn_ns64.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vshrn_ns64.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vshrn_ns64.c 2010-01-25 09:50:29.515686194 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vshrn_nu16.c b/gcc/testsuite/gcc.target/arm/neon/vshrn_nu16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vshrn_nu16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vshrn_nu16.c 2010-01-25 09:50:29.515686194 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vshrn_nu32.c b/gcc/testsuite/gcc.target/arm/neon/vshrn_nu32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vshrn_nu32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vshrn_nu32.c 2010-01-25 09:50:29.515686194 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vshrn_nu64.c b/gcc/testsuite/gcc.target/arm/neon/vshrn_nu64.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vshrn_nu64.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vshrn_nu64.c 2010-01-25 09:50:29.515686194 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vshr_ns16.c b/gcc/testsuite/gcc.target/arm/neon/vshr_ns16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vshr_ns16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vshr_ns16.c 2010-01-25 09:50:29.515686194 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vshr_ns32.c b/gcc/testsuite/gcc.target/arm/neon/vshr_ns32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vshr_ns32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vshr_ns32.c 2010-01-25 09:50:29.515686194 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vshr_ns64.c b/gcc/testsuite/gcc.target/arm/neon/vshr_ns64.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vshr_ns64.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vshr_ns64.c 2010-01-25 09:50:29.515686194 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vshr_ns8.c b/gcc/testsuite/gcc.target/arm/neon/vshr_ns8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vshr_ns8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vshr_ns8.c 2010-01-25 09:50:29.515686194 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vshr_nu16.c b/gcc/testsuite/gcc.target/arm/neon/vshr_nu16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vshr_nu16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vshr_nu16.c 2010-01-25 09:50:29.525687396 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vshr_nu32.c b/gcc/testsuite/gcc.target/arm/neon/vshr_nu32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vshr_nu32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vshr_nu32.c 2010-01-25 09:50:29.525687396 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vshr_nu64.c b/gcc/testsuite/gcc.target/arm/neon/vshr_nu64.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vshr_nu64.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vshr_nu64.c 2010-01-25 09:50:29.525687396 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vshr_nu8.c b/gcc/testsuite/gcc.target/arm/neon/vshr_nu8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vshr_nu8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vshr_nu8.c 2010-01-25 09:50:29.525687396 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vshrQ_ns16.c b/gcc/testsuite/gcc.target/arm/neon/vshrQ_ns16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vshrQ_ns16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vshrQ_ns16.c 2010-01-25 09:50:29.525687396 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vshrQ_ns32.c b/gcc/testsuite/gcc.target/arm/neon/vshrQ_ns32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vshrQ_ns32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vshrQ_ns32.c 2010-01-25 09:50:29.525687396 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vshrQ_ns64.c b/gcc/testsuite/gcc.target/arm/neon/vshrQ_ns64.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vshrQ_ns64.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vshrQ_ns64.c 2010-01-25 09:50:29.525687396 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vshrQ_ns8.c b/gcc/testsuite/gcc.target/arm/neon/vshrQ_ns8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vshrQ_ns8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vshrQ_ns8.c 2010-01-25 09:50:29.525687396 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vshrQ_nu16.c b/gcc/testsuite/gcc.target/arm/neon/vshrQ_nu16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vshrQ_nu16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vshrQ_nu16.c 2010-01-25 09:50:29.525687396 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vshrQ_nu32.c b/gcc/testsuite/gcc.target/arm/neon/vshrQ_nu32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vshrQ_nu32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vshrQ_nu32.c 2010-01-25 09:50:29.525687396 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vshrQ_nu64.c b/gcc/testsuite/gcc.target/arm/neon/vshrQ_nu64.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vshrQ_nu64.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vshrQ_nu64.c 2010-01-25 09:50:29.525687396 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vshrQ_nu8.c b/gcc/testsuite/gcc.target/arm/neon/vshrQ_nu8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vshrQ_nu8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vshrQ_nu8.c 2010-01-25 09:50:29.525687396 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vsli_np16.c b/gcc/testsuite/gcc.target/arm/neon/vsli_np16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vsli_np16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vsli_np16.c 2010-01-25 09:50:29.525687396 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vsli_np8.c b/gcc/testsuite/gcc.target/arm/neon/vsli_np8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vsli_np8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vsli_np8.c 2010-01-25 09:50:29.525687396 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vsli_ns16.c b/gcc/testsuite/gcc.target/arm/neon/vsli_ns16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vsli_ns16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vsli_ns16.c 2010-01-25 09:50:29.525687396 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vsli_ns32.c b/gcc/testsuite/gcc.target/arm/neon/vsli_ns32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vsli_ns32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vsli_ns32.c 2010-01-25 09:50:29.525687396 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vsli_ns64.c b/gcc/testsuite/gcc.target/arm/neon/vsli_ns64.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vsli_ns64.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vsli_ns64.c 2010-01-25 09:50:29.525687396 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vsli_ns8.c b/gcc/testsuite/gcc.target/arm/neon/vsli_ns8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vsli_ns8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vsli_ns8.c 2010-01-25 09:50:29.525687396 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vsli_nu16.c b/gcc/testsuite/gcc.target/arm/neon/vsli_nu16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vsli_nu16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vsli_nu16.c 2010-01-25 09:50:29.525687396 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vsli_nu32.c b/gcc/testsuite/gcc.target/arm/neon/vsli_nu32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vsli_nu32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vsli_nu32.c 2010-01-25 09:50:29.525687396 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vsli_nu64.c b/gcc/testsuite/gcc.target/arm/neon/vsli_nu64.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vsli_nu64.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vsli_nu64.c 2010-01-25 09:50:29.525687396 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vsli_nu8.c b/gcc/testsuite/gcc.target/arm/neon/vsli_nu8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vsli_nu8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vsli_nu8.c 2010-01-25 09:50:29.525687396 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vsliQ_np16.c b/gcc/testsuite/gcc.target/arm/neon/vsliQ_np16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vsliQ_np16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vsliQ_np16.c 2010-01-25 09:50:29.525687396 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vsliQ_np8.c b/gcc/testsuite/gcc.target/arm/neon/vsliQ_np8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vsliQ_np8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vsliQ_np8.c 2010-01-25 09:50:29.525687396 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vsliQ_ns16.c b/gcc/testsuite/gcc.target/arm/neon/vsliQ_ns16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vsliQ_ns16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vsliQ_ns16.c 2010-01-25 09:50:29.525687396 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vsliQ_ns32.c b/gcc/testsuite/gcc.target/arm/neon/vsliQ_ns32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vsliQ_ns32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vsliQ_ns32.c 2010-01-25 09:50:29.525687396 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vsliQ_ns64.c b/gcc/testsuite/gcc.target/arm/neon/vsliQ_ns64.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vsliQ_ns64.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vsliQ_ns64.c 2010-01-25 09:50:29.525687396 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vsliQ_ns8.c b/gcc/testsuite/gcc.target/arm/neon/vsliQ_ns8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vsliQ_ns8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vsliQ_ns8.c 2010-01-25 09:50:29.525687396 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vsliQ_nu16.c b/gcc/testsuite/gcc.target/arm/neon/vsliQ_nu16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vsliQ_nu16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vsliQ_nu16.c 2010-01-25 09:50:29.525687396 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vsliQ_nu32.c b/gcc/testsuite/gcc.target/arm/neon/vsliQ_nu32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vsliQ_nu32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vsliQ_nu32.c 2010-01-25 09:50:29.525687396 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vsliQ_nu64.c b/gcc/testsuite/gcc.target/arm/neon/vsliQ_nu64.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vsliQ_nu64.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vsliQ_nu64.c 2010-01-25 09:50:29.525687396 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vsliQ_nu8.c b/gcc/testsuite/gcc.target/arm/neon/vsliQ_nu8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vsliQ_nu8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vsliQ_nu8.c 2010-01-25 09:50:29.525687396 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vsra_ns16.c b/gcc/testsuite/gcc.target/arm/neon/vsra_ns16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vsra_ns16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vsra_ns16.c 2010-01-25 09:50:29.525687396 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vsra_ns32.c b/gcc/testsuite/gcc.target/arm/neon/vsra_ns32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vsra_ns32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vsra_ns32.c 2010-01-25 09:50:29.525687396 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vsra_ns64.c b/gcc/testsuite/gcc.target/arm/neon/vsra_ns64.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vsra_ns64.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vsra_ns64.c 2010-01-25 09:50:29.525687396 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vsra_ns8.c b/gcc/testsuite/gcc.target/arm/neon/vsra_ns8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vsra_ns8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vsra_ns8.c 2010-01-25 09:50:29.525687396 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vsra_nu16.c b/gcc/testsuite/gcc.target/arm/neon/vsra_nu16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vsra_nu16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vsra_nu16.c 2010-01-25 09:50:29.525687396 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vsra_nu32.c b/gcc/testsuite/gcc.target/arm/neon/vsra_nu32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vsra_nu32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vsra_nu32.c 2010-01-25 09:50:29.525687396 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vsra_nu64.c b/gcc/testsuite/gcc.target/arm/neon/vsra_nu64.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vsra_nu64.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vsra_nu64.c 2010-01-25 09:50:29.525687396 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vsra_nu8.c b/gcc/testsuite/gcc.target/arm/neon/vsra_nu8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vsra_nu8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vsra_nu8.c 2010-01-25 09:50:29.525687396 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vsraQ_ns16.c b/gcc/testsuite/gcc.target/arm/neon/vsraQ_ns16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vsraQ_ns16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vsraQ_ns16.c 2010-01-25 09:50:29.525687396 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vsraQ_ns32.c b/gcc/testsuite/gcc.target/arm/neon/vsraQ_ns32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vsraQ_ns32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vsraQ_ns32.c 2010-01-25 09:50:29.525687396 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vsraQ_ns64.c b/gcc/testsuite/gcc.target/arm/neon/vsraQ_ns64.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vsraQ_ns64.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vsraQ_ns64.c 2010-01-25 09:50:29.525687396 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vsraQ_ns8.c b/gcc/testsuite/gcc.target/arm/neon/vsraQ_ns8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vsraQ_ns8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vsraQ_ns8.c 2010-01-25 09:50:29.525687396 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vsraQ_nu16.c b/gcc/testsuite/gcc.target/arm/neon/vsraQ_nu16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vsraQ_nu16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vsraQ_nu16.c 2010-01-25 09:50:29.525687396 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vsraQ_nu32.c b/gcc/testsuite/gcc.target/arm/neon/vsraQ_nu32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vsraQ_nu32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vsraQ_nu32.c 2010-01-25 09:50:29.525687396 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vsraQ_nu64.c b/gcc/testsuite/gcc.target/arm/neon/vsraQ_nu64.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vsraQ_nu64.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vsraQ_nu64.c 2010-01-25 09:50:29.525687396 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vsraQ_nu8.c b/gcc/testsuite/gcc.target/arm/neon/vsraQ_nu8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vsraQ_nu8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vsraQ_nu8.c 2010-01-25 09:50:29.525687396 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vsri_np16.c b/gcc/testsuite/gcc.target/arm/neon/vsri_np16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vsri_np16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vsri_np16.c 2010-01-25 09:50:29.525687396 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vsri_np8.c b/gcc/testsuite/gcc.target/arm/neon/vsri_np8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vsri_np8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vsri_np8.c 2010-01-25 09:50:29.525687396 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vsri_ns16.c b/gcc/testsuite/gcc.target/arm/neon/vsri_ns16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vsri_ns16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vsri_ns16.c 2010-01-25 09:50:29.525687396 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vsri_ns32.c b/gcc/testsuite/gcc.target/arm/neon/vsri_ns32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vsri_ns32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vsri_ns32.c 2010-01-25 09:50:29.525687396 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vsri_ns64.c b/gcc/testsuite/gcc.target/arm/neon/vsri_ns64.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vsri_ns64.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vsri_ns64.c 2010-01-25 09:50:29.525687396 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vsri_ns8.c b/gcc/testsuite/gcc.target/arm/neon/vsri_ns8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vsri_ns8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vsri_ns8.c 2010-01-25 09:50:29.525687396 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vsri_nu16.c b/gcc/testsuite/gcc.target/arm/neon/vsri_nu16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vsri_nu16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vsri_nu16.c 2010-01-25 09:50:29.525687396 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vsri_nu32.c b/gcc/testsuite/gcc.target/arm/neon/vsri_nu32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vsri_nu32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vsri_nu32.c 2010-01-25 09:50:29.525687396 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vsri_nu64.c b/gcc/testsuite/gcc.target/arm/neon/vsri_nu64.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vsri_nu64.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vsri_nu64.c 2010-01-25 09:50:29.525687396 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vsri_nu8.c b/gcc/testsuite/gcc.target/arm/neon/vsri_nu8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vsri_nu8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vsri_nu8.c 2010-01-25 09:50:29.525687396 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vsriQ_np16.c b/gcc/testsuite/gcc.target/arm/neon/vsriQ_np16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vsriQ_np16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vsriQ_np16.c 2010-01-25 09:50:29.525687396 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vsriQ_np8.c b/gcc/testsuite/gcc.target/arm/neon/vsriQ_np8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vsriQ_np8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vsriQ_np8.c 2010-01-25 09:50:29.525687396 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vsriQ_ns16.c b/gcc/testsuite/gcc.target/arm/neon/vsriQ_ns16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vsriQ_ns16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vsriQ_ns16.c 2010-01-25 09:50:29.525687396 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vsriQ_ns32.c b/gcc/testsuite/gcc.target/arm/neon/vsriQ_ns32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vsriQ_ns32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vsriQ_ns32.c 2010-01-25 09:50:29.525687396 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vsriQ_ns64.c b/gcc/testsuite/gcc.target/arm/neon/vsriQ_ns64.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vsriQ_ns64.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vsriQ_ns64.c 2010-01-25 09:50:29.525687396 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vsriQ_ns8.c b/gcc/testsuite/gcc.target/arm/neon/vsriQ_ns8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vsriQ_ns8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vsriQ_ns8.c 2010-01-25 09:50:29.525687396 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vsriQ_nu16.c b/gcc/testsuite/gcc.target/arm/neon/vsriQ_nu16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vsriQ_nu16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vsriQ_nu16.c 2010-01-25 09:50:29.525687396 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vsriQ_nu32.c b/gcc/testsuite/gcc.target/arm/neon/vsriQ_nu32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vsriQ_nu32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vsriQ_nu32.c 2010-01-25 09:50:29.525687396 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vsriQ_nu64.c b/gcc/testsuite/gcc.target/arm/neon/vsriQ_nu64.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vsriQ_nu64.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vsriQ_nu64.c 2010-01-25 09:50:29.525687396 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vsriQ_nu8.c b/gcc/testsuite/gcc.target/arm/neon/vsriQ_nu8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vsriQ_nu8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vsriQ_nu8.c 2010-01-25 09:50:29.525687396 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vst1f32.c b/gcc/testsuite/gcc.target/arm/neon/vst1f32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vst1f32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vst1f32.c 2010-01-25 09:50:29.525687396 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vst1_lanef32.c b/gcc/testsuite/gcc.target/arm/neon/vst1_lanef32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vst1_lanef32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vst1_lanef32.c 2010-01-25 09:50:29.525687396 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vst1_lanep16.c b/gcc/testsuite/gcc.target/arm/neon/vst1_lanep16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vst1_lanep16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vst1_lanep16.c 2010-01-25 09:50:29.525687396 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vst1_lanep8.c b/gcc/testsuite/gcc.target/arm/neon/vst1_lanep8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vst1_lanep8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vst1_lanep8.c 2010-01-25 09:50:29.525687396 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vst1_lanes16.c b/gcc/testsuite/gcc.target/arm/neon/vst1_lanes16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vst1_lanes16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vst1_lanes16.c 2010-01-25 09:50:29.525687396 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vst1_lanes32.c b/gcc/testsuite/gcc.target/arm/neon/vst1_lanes32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vst1_lanes32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vst1_lanes32.c 2010-01-25 09:50:29.525687396 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vst1_lanes64.c b/gcc/testsuite/gcc.target/arm/neon/vst1_lanes64.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vst1_lanes64.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vst1_lanes64.c 2010-01-25 09:50:29.535686781 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vst1_lanes8.c b/gcc/testsuite/gcc.target/arm/neon/vst1_lanes8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vst1_lanes8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vst1_lanes8.c 2010-01-25 09:50:29.535686781 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vst1_laneu16.c b/gcc/testsuite/gcc.target/arm/neon/vst1_laneu16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vst1_laneu16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vst1_laneu16.c 2010-01-25 09:50:29.535686781 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vst1_laneu32.c b/gcc/testsuite/gcc.target/arm/neon/vst1_laneu32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vst1_laneu32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vst1_laneu32.c 2010-01-25 09:50:29.535686781 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vst1_laneu64.c b/gcc/testsuite/gcc.target/arm/neon/vst1_laneu64.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vst1_laneu64.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vst1_laneu64.c 2010-01-25 09:50:29.535686781 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vst1_laneu8.c b/gcc/testsuite/gcc.target/arm/neon/vst1_laneu8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vst1_laneu8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vst1_laneu8.c 2010-01-25 09:50:29.535686781 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vst1p16.c b/gcc/testsuite/gcc.target/arm/neon/vst1p16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vst1p16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vst1p16.c 2010-01-25 09:50:29.535686781 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vst1p8.c b/gcc/testsuite/gcc.target/arm/neon/vst1p8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vst1p8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vst1p8.c 2010-01-25 09:50:29.535686781 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vst1Qf32.c b/gcc/testsuite/gcc.target/arm/neon/vst1Qf32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vst1Qf32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vst1Qf32.c 2010-01-25 09:50:29.535686781 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vst1Q_lanef32.c b/gcc/testsuite/gcc.target/arm/neon/vst1Q_lanef32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vst1Q_lanef32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vst1Q_lanef32.c 2010-01-25 09:50:29.535686781 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vst1Q_lanep16.c b/gcc/testsuite/gcc.target/arm/neon/vst1Q_lanep16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vst1Q_lanep16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vst1Q_lanep16.c 2010-01-25 09:50:29.535686781 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vst1Q_lanep8.c b/gcc/testsuite/gcc.target/arm/neon/vst1Q_lanep8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vst1Q_lanep8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vst1Q_lanep8.c 2010-01-25 09:50:29.535686781 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vst1Q_lanes16.c b/gcc/testsuite/gcc.target/arm/neon/vst1Q_lanes16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vst1Q_lanes16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vst1Q_lanes16.c 2010-01-25 09:50:29.535686781 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vst1Q_lanes32.c b/gcc/testsuite/gcc.target/arm/neon/vst1Q_lanes32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vst1Q_lanes32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vst1Q_lanes32.c 2010-01-25 09:50:29.535686781 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vst1Q_lanes64.c b/gcc/testsuite/gcc.target/arm/neon/vst1Q_lanes64.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vst1Q_lanes64.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vst1Q_lanes64.c 2010-01-25 09:50:29.535686781 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vst1Q_lanes8.c b/gcc/testsuite/gcc.target/arm/neon/vst1Q_lanes8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vst1Q_lanes8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vst1Q_lanes8.c 2010-01-25 09:50:29.535686781 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vst1Q_laneu16.c b/gcc/testsuite/gcc.target/arm/neon/vst1Q_laneu16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vst1Q_laneu16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vst1Q_laneu16.c 2010-01-25 09:50:29.535686781 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vst1Q_laneu32.c b/gcc/testsuite/gcc.target/arm/neon/vst1Q_laneu32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vst1Q_laneu32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vst1Q_laneu32.c 2010-01-25 09:50:29.535686781 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vst1Q_laneu64.c b/gcc/testsuite/gcc.target/arm/neon/vst1Q_laneu64.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vst1Q_laneu64.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vst1Q_laneu64.c 2010-01-25 09:50:29.535686781 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vst1Q_laneu8.c b/gcc/testsuite/gcc.target/arm/neon/vst1Q_laneu8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vst1Q_laneu8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vst1Q_laneu8.c 2010-01-25 09:50:29.535686781 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vst1Qp16.c b/gcc/testsuite/gcc.target/arm/neon/vst1Qp16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vst1Qp16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vst1Qp16.c 2010-01-25 09:50:29.535686781 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vst1Qp8.c b/gcc/testsuite/gcc.target/arm/neon/vst1Qp8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vst1Qp8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vst1Qp8.c 2010-01-25 09:50:29.535686781 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vst1Qs16.c b/gcc/testsuite/gcc.target/arm/neon/vst1Qs16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vst1Qs16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vst1Qs16.c 2010-01-25 09:50:29.535686781 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vst1Qs32.c b/gcc/testsuite/gcc.target/arm/neon/vst1Qs32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vst1Qs32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vst1Qs32.c 2010-01-25 09:50:29.535686781 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vst1Qs64.c b/gcc/testsuite/gcc.target/arm/neon/vst1Qs64.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vst1Qs64.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vst1Qs64.c 2010-01-25 09:50:29.535686781 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vst1Qs8.c b/gcc/testsuite/gcc.target/arm/neon/vst1Qs8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vst1Qs8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vst1Qs8.c 2010-01-25 09:50:29.535686781 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vst1Qu16.c b/gcc/testsuite/gcc.target/arm/neon/vst1Qu16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vst1Qu16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vst1Qu16.c 2010-01-25 09:50:29.535686781 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vst1Qu32.c b/gcc/testsuite/gcc.target/arm/neon/vst1Qu32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vst1Qu32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vst1Qu32.c 2010-01-25 09:50:29.535686781 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vst1Qu64.c b/gcc/testsuite/gcc.target/arm/neon/vst1Qu64.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vst1Qu64.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vst1Qu64.c 2010-01-25 09:50:29.535686781 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vst1Qu8.c b/gcc/testsuite/gcc.target/arm/neon/vst1Qu8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vst1Qu8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vst1Qu8.c 2010-01-25 09:50:29.535686781 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vst1s16.c b/gcc/testsuite/gcc.target/arm/neon/vst1s16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vst1s16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vst1s16.c 2010-01-25 09:50:29.535686781 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vst1s32.c b/gcc/testsuite/gcc.target/arm/neon/vst1s32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vst1s32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vst1s32.c 2010-01-25 09:50:29.535686781 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vst1s64.c b/gcc/testsuite/gcc.target/arm/neon/vst1s64.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vst1s64.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vst1s64.c 2010-01-25 09:50:29.535686781 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vst1s8.c b/gcc/testsuite/gcc.target/arm/neon/vst1s8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vst1s8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vst1s8.c 2010-01-25 09:50:29.535686781 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vst1u16.c b/gcc/testsuite/gcc.target/arm/neon/vst1u16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vst1u16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vst1u16.c 2010-01-25 09:50:29.535686781 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vst1u32.c b/gcc/testsuite/gcc.target/arm/neon/vst1u32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vst1u32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vst1u32.c 2010-01-25 09:50:29.535686781 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vst1u64.c b/gcc/testsuite/gcc.target/arm/neon/vst1u64.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vst1u64.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vst1u64.c 2010-01-25 09:50:29.535686781 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vst1u8.c b/gcc/testsuite/gcc.target/arm/neon/vst1u8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vst1u8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vst1u8.c 2010-01-25 09:50:29.535686781 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vst2f32.c b/gcc/testsuite/gcc.target/arm/neon/vst2f32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vst2f32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vst2f32.c 2010-01-25 09:50:29.535686781 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vst2_lanef32.c b/gcc/testsuite/gcc.target/arm/neon/vst2_lanef32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vst2_lanef32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vst2_lanef32.c 2010-01-25 09:50:29.535686781 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vst2_lanep16.c b/gcc/testsuite/gcc.target/arm/neon/vst2_lanep16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vst2_lanep16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vst2_lanep16.c 2010-01-25 09:50:29.535686781 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vst2_lanep8.c b/gcc/testsuite/gcc.target/arm/neon/vst2_lanep8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vst2_lanep8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vst2_lanep8.c 2010-01-25 09:50:29.535686781 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vst2_lanes16.c b/gcc/testsuite/gcc.target/arm/neon/vst2_lanes16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vst2_lanes16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vst2_lanes16.c 2010-01-25 09:50:29.535686781 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vst2_lanes32.c b/gcc/testsuite/gcc.target/arm/neon/vst2_lanes32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vst2_lanes32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vst2_lanes32.c 2010-01-25 09:50:29.535686781 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vst2_lanes8.c b/gcc/testsuite/gcc.target/arm/neon/vst2_lanes8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vst2_lanes8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vst2_lanes8.c 2010-01-25 09:50:29.535686781 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vst2_laneu16.c b/gcc/testsuite/gcc.target/arm/neon/vst2_laneu16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vst2_laneu16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vst2_laneu16.c 2010-01-25 09:50:29.535686781 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vst2_laneu32.c b/gcc/testsuite/gcc.target/arm/neon/vst2_laneu32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vst2_laneu32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vst2_laneu32.c 2010-01-25 09:50:29.535686781 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vst2_laneu8.c b/gcc/testsuite/gcc.target/arm/neon/vst2_laneu8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vst2_laneu8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vst2_laneu8.c 2010-01-25 09:50:29.535686781 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vst2p16.c b/gcc/testsuite/gcc.target/arm/neon/vst2p16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vst2p16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vst2p16.c 2010-01-25 09:50:29.535686781 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vst2p8.c b/gcc/testsuite/gcc.target/arm/neon/vst2p8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vst2p8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vst2p8.c 2010-01-25 09:50:29.535686781 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vst2Qf32.c b/gcc/testsuite/gcc.target/arm/neon/vst2Qf32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vst2Qf32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vst2Qf32.c 2010-01-25 09:50:29.535686781 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vst2Q_lanef32.c b/gcc/testsuite/gcc.target/arm/neon/vst2Q_lanef32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vst2Q_lanef32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vst2Q_lanef32.c 2010-01-25 09:50:29.535686781 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vst2Q_lanep16.c b/gcc/testsuite/gcc.target/arm/neon/vst2Q_lanep16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vst2Q_lanep16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vst2Q_lanep16.c 2010-01-25 09:50:29.535686781 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vst2Q_lanes16.c b/gcc/testsuite/gcc.target/arm/neon/vst2Q_lanes16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vst2Q_lanes16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vst2Q_lanes16.c 2010-01-25 09:50:29.535686781 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vst2Q_lanes32.c b/gcc/testsuite/gcc.target/arm/neon/vst2Q_lanes32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vst2Q_lanes32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vst2Q_lanes32.c 2010-01-25 09:50:29.535686781 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vst2Q_laneu16.c b/gcc/testsuite/gcc.target/arm/neon/vst2Q_laneu16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vst2Q_laneu16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vst2Q_laneu16.c 2010-01-25 09:50:29.535686781 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vst2Q_laneu32.c b/gcc/testsuite/gcc.target/arm/neon/vst2Q_laneu32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vst2Q_laneu32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vst2Q_laneu32.c 2010-01-25 09:50:29.535686781 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vst2Qp16.c b/gcc/testsuite/gcc.target/arm/neon/vst2Qp16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vst2Qp16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vst2Qp16.c 2010-01-25 09:50:29.535686781 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vst2Qp8.c b/gcc/testsuite/gcc.target/arm/neon/vst2Qp8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vst2Qp8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vst2Qp8.c 2010-01-25 09:50:29.535686781 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vst2Qs16.c b/gcc/testsuite/gcc.target/arm/neon/vst2Qs16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vst2Qs16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vst2Qs16.c 2010-01-25 09:50:29.535686781 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vst2Qs32.c b/gcc/testsuite/gcc.target/arm/neon/vst2Qs32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vst2Qs32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vst2Qs32.c 2010-01-25 09:50:29.535686781 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vst2Qs8.c b/gcc/testsuite/gcc.target/arm/neon/vst2Qs8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vst2Qs8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vst2Qs8.c 2010-01-25 09:50:29.535686781 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vst2Qu16.c b/gcc/testsuite/gcc.target/arm/neon/vst2Qu16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vst2Qu16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vst2Qu16.c 2010-01-25 09:50:29.535686781 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vst2Qu32.c b/gcc/testsuite/gcc.target/arm/neon/vst2Qu32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vst2Qu32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vst2Qu32.c 2010-01-25 09:50:29.535686781 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vst2Qu8.c b/gcc/testsuite/gcc.target/arm/neon/vst2Qu8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vst2Qu8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vst2Qu8.c 2010-01-25 09:50:29.535686781 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vst2s16.c b/gcc/testsuite/gcc.target/arm/neon/vst2s16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vst2s16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vst2s16.c 2010-01-25 09:50:29.535686781 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vst2s32.c b/gcc/testsuite/gcc.target/arm/neon/vst2s32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vst2s32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vst2s32.c 2010-01-25 09:50:29.535686781 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vst2s64.c b/gcc/testsuite/gcc.target/arm/neon/vst2s64.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vst2s64.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vst2s64.c 2010-01-25 09:50:29.535686781 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vst2s8.c b/gcc/testsuite/gcc.target/arm/neon/vst2s8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vst2s8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vst2s8.c 2010-01-25 09:50:29.535686781 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vst2u16.c b/gcc/testsuite/gcc.target/arm/neon/vst2u16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vst2u16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vst2u16.c 2010-01-25 09:50:29.535686781 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vst2u32.c b/gcc/testsuite/gcc.target/arm/neon/vst2u32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vst2u32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vst2u32.c 2010-01-25 09:50:29.535686781 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vst2u64.c b/gcc/testsuite/gcc.target/arm/neon/vst2u64.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vst2u64.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vst2u64.c 2010-01-25 09:50:29.545686586 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vst2u8.c b/gcc/testsuite/gcc.target/arm/neon/vst2u8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vst2u8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vst2u8.c 2010-01-25 09:50:29.545686586 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vst3f32.c b/gcc/testsuite/gcc.target/arm/neon/vst3f32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vst3f32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vst3f32.c 2010-01-25 09:50:29.545686586 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vst3_lanef32.c b/gcc/testsuite/gcc.target/arm/neon/vst3_lanef32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vst3_lanef32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vst3_lanef32.c 2010-01-25 09:50:29.545686586 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vst3_lanep16.c b/gcc/testsuite/gcc.target/arm/neon/vst3_lanep16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vst3_lanep16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vst3_lanep16.c 2010-01-25 09:50:29.545686586 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vst3_lanep8.c b/gcc/testsuite/gcc.target/arm/neon/vst3_lanep8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vst3_lanep8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vst3_lanep8.c 2010-01-25 09:50:29.545686586 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vst3_lanes16.c b/gcc/testsuite/gcc.target/arm/neon/vst3_lanes16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vst3_lanes16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vst3_lanes16.c 2010-01-25 09:50:29.545686586 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vst3_lanes32.c b/gcc/testsuite/gcc.target/arm/neon/vst3_lanes32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vst3_lanes32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vst3_lanes32.c 2010-01-25 09:50:29.545686586 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vst3_lanes8.c b/gcc/testsuite/gcc.target/arm/neon/vst3_lanes8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vst3_lanes8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vst3_lanes8.c 2010-01-25 09:50:29.545686586 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vst3_laneu16.c b/gcc/testsuite/gcc.target/arm/neon/vst3_laneu16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vst3_laneu16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vst3_laneu16.c 2010-01-25 09:50:29.545686586 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vst3_laneu32.c b/gcc/testsuite/gcc.target/arm/neon/vst3_laneu32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vst3_laneu32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vst3_laneu32.c 2010-01-25 09:50:29.545686586 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vst3_laneu8.c b/gcc/testsuite/gcc.target/arm/neon/vst3_laneu8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vst3_laneu8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vst3_laneu8.c 2010-01-25 09:50:29.545686586 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vst3p16.c b/gcc/testsuite/gcc.target/arm/neon/vst3p16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vst3p16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vst3p16.c 2010-01-25 09:50:29.545686586 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vst3p8.c b/gcc/testsuite/gcc.target/arm/neon/vst3p8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vst3p8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vst3p8.c 2010-01-25 09:50:29.545686586 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vst3Qf32.c b/gcc/testsuite/gcc.target/arm/neon/vst3Qf32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vst3Qf32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vst3Qf32.c 2010-01-25 09:50:29.545686586 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vst3Q_lanef32.c b/gcc/testsuite/gcc.target/arm/neon/vst3Q_lanef32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vst3Q_lanef32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vst3Q_lanef32.c 2010-01-25 09:50:29.545686586 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vst3Q_lanep16.c b/gcc/testsuite/gcc.target/arm/neon/vst3Q_lanep16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vst3Q_lanep16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vst3Q_lanep16.c 2010-01-25 09:50:29.545686586 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vst3Q_lanes16.c b/gcc/testsuite/gcc.target/arm/neon/vst3Q_lanes16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vst3Q_lanes16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vst3Q_lanes16.c 2010-01-25 09:50:29.545686586 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vst3Q_lanes32.c b/gcc/testsuite/gcc.target/arm/neon/vst3Q_lanes32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vst3Q_lanes32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vst3Q_lanes32.c 2010-01-25 09:50:29.545686586 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vst3Q_laneu16.c b/gcc/testsuite/gcc.target/arm/neon/vst3Q_laneu16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vst3Q_laneu16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vst3Q_laneu16.c 2010-01-25 09:50:29.545686586 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vst3Q_laneu32.c b/gcc/testsuite/gcc.target/arm/neon/vst3Q_laneu32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vst3Q_laneu32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vst3Q_laneu32.c 2010-01-25 09:50:29.545686586 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vst3Qp16.c b/gcc/testsuite/gcc.target/arm/neon/vst3Qp16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vst3Qp16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vst3Qp16.c 2010-01-25 09:50:29.545686586 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vst3Qp8.c b/gcc/testsuite/gcc.target/arm/neon/vst3Qp8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vst3Qp8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vst3Qp8.c 2010-01-25 09:50:29.545686586 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vst3Qs16.c b/gcc/testsuite/gcc.target/arm/neon/vst3Qs16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vst3Qs16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vst3Qs16.c 2010-01-25 09:50:29.545686586 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vst3Qs32.c b/gcc/testsuite/gcc.target/arm/neon/vst3Qs32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vst3Qs32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vst3Qs32.c 2010-01-25 09:50:29.545686586 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vst3Qs8.c b/gcc/testsuite/gcc.target/arm/neon/vst3Qs8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vst3Qs8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vst3Qs8.c 2010-01-25 09:50:29.545686586 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vst3Qu16.c b/gcc/testsuite/gcc.target/arm/neon/vst3Qu16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vst3Qu16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vst3Qu16.c 2010-01-25 09:50:29.545686586 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vst3Qu32.c b/gcc/testsuite/gcc.target/arm/neon/vst3Qu32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vst3Qu32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vst3Qu32.c 2010-01-25 09:50:29.545686586 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vst3Qu8.c b/gcc/testsuite/gcc.target/arm/neon/vst3Qu8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vst3Qu8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vst3Qu8.c 2010-01-25 09:50:29.545686586 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vst3s16.c b/gcc/testsuite/gcc.target/arm/neon/vst3s16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vst3s16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vst3s16.c 2010-01-25 09:50:29.545686586 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vst3s32.c b/gcc/testsuite/gcc.target/arm/neon/vst3s32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vst3s32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vst3s32.c 2010-01-25 09:50:29.545686586 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vst3s64.c b/gcc/testsuite/gcc.target/arm/neon/vst3s64.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vst3s64.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vst3s64.c 2010-01-25 09:50:29.545686586 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vst3s8.c b/gcc/testsuite/gcc.target/arm/neon/vst3s8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vst3s8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vst3s8.c 2010-01-25 09:50:29.545686586 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vst3u16.c b/gcc/testsuite/gcc.target/arm/neon/vst3u16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vst3u16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vst3u16.c 2010-01-25 09:50:29.545686586 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vst3u32.c b/gcc/testsuite/gcc.target/arm/neon/vst3u32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vst3u32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vst3u32.c 2010-01-25 09:50:29.545686586 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vst3u64.c b/gcc/testsuite/gcc.target/arm/neon/vst3u64.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vst3u64.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vst3u64.c 2010-01-25 09:50:29.545686586 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vst3u8.c b/gcc/testsuite/gcc.target/arm/neon/vst3u8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vst3u8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vst3u8.c 2010-01-25 09:50:29.545686586 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vst4f32.c b/gcc/testsuite/gcc.target/arm/neon/vst4f32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vst4f32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vst4f32.c 2010-01-25 09:50:29.545686586 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vst4_lanef32.c b/gcc/testsuite/gcc.target/arm/neon/vst4_lanef32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vst4_lanef32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vst4_lanef32.c 2010-01-25 09:50:29.545686586 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vst4_lanep16.c b/gcc/testsuite/gcc.target/arm/neon/vst4_lanep16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vst4_lanep16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vst4_lanep16.c 2010-01-25 09:50:29.545686586 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vst4_lanep8.c b/gcc/testsuite/gcc.target/arm/neon/vst4_lanep8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vst4_lanep8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vst4_lanep8.c 2010-01-25 09:50:29.545686586 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vst4_lanes16.c b/gcc/testsuite/gcc.target/arm/neon/vst4_lanes16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vst4_lanes16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vst4_lanes16.c 2010-01-25 09:50:29.545686586 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vst4_lanes32.c b/gcc/testsuite/gcc.target/arm/neon/vst4_lanes32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vst4_lanes32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vst4_lanes32.c 2010-01-25 09:50:29.545686586 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vst4_lanes8.c b/gcc/testsuite/gcc.target/arm/neon/vst4_lanes8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vst4_lanes8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vst4_lanes8.c 2010-01-25 09:50:29.545686586 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vst4_laneu16.c b/gcc/testsuite/gcc.target/arm/neon/vst4_laneu16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vst4_laneu16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vst4_laneu16.c 2010-01-25 09:50:29.545686586 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vst4_laneu32.c b/gcc/testsuite/gcc.target/arm/neon/vst4_laneu32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vst4_laneu32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vst4_laneu32.c 2010-01-25 09:50:29.545686586 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vst4_laneu8.c b/gcc/testsuite/gcc.target/arm/neon/vst4_laneu8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vst4_laneu8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vst4_laneu8.c 2010-01-25 09:50:29.545686586 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vst4p16.c b/gcc/testsuite/gcc.target/arm/neon/vst4p16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vst4p16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vst4p16.c 2010-01-25 09:50:29.545686586 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vst4p8.c b/gcc/testsuite/gcc.target/arm/neon/vst4p8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vst4p8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vst4p8.c 2010-01-25 09:50:29.545686586 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vst4Qf32.c b/gcc/testsuite/gcc.target/arm/neon/vst4Qf32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vst4Qf32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vst4Qf32.c 2010-01-25 09:50:29.545686586 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vst4Q_lanef32.c b/gcc/testsuite/gcc.target/arm/neon/vst4Q_lanef32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vst4Q_lanef32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vst4Q_lanef32.c 2010-01-25 09:50:29.545686586 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vst4Q_lanep16.c b/gcc/testsuite/gcc.target/arm/neon/vst4Q_lanep16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vst4Q_lanep16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vst4Q_lanep16.c 2010-01-25 09:50:29.545686586 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vst4Q_lanes16.c b/gcc/testsuite/gcc.target/arm/neon/vst4Q_lanes16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vst4Q_lanes16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vst4Q_lanes16.c 2010-01-25 09:50:29.545686586 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vst4Q_lanes32.c b/gcc/testsuite/gcc.target/arm/neon/vst4Q_lanes32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vst4Q_lanes32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vst4Q_lanes32.c 2010-01-25 09:50:29.545686586 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vst4Q_laneu16.c b/gcc/testsuite/gcc.target/arm/neon/vst4Q_laneu16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vst4Q_laneu16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vst4Q_laneu16.c 2010-01-25 09:50:29.545686586 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vst4Q_laneu32.c b/gcc/testsuite/gcc.target/arm/neon/vst4Q_laneu32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vst4Q_laneu32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vst4Q_laneu32.c 2010-01-25 09:50:29.545686586 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vst4Qp16.c b/gcc/testsuite/gcc.target/arm/neon/vst4Qp16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vst4Qp16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vst4Qp16.c 2010-01-25 09:50:29.545686586 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vst4Qp8.c b/gcc/testsuite/gcc.target/arm/neon/vst4Qp8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vst4Qp8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vst4Qp8.c 2010-01-25 09:50:29.545686586 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vst4Qs16.c b/gcc/testsuite/gcc.target/arm/neon/vst4Qs16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vst4Qs16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vst4Qs16.c 2010-01-25 09:50:29.545686586 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vst4Qs32.c b/gcc/testsuite/gcc.target/arm/neon/vst4Qs32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vst4Qs32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vst4Qs32.c 2010-01-25 09:50:29.545686586 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vst4Qs8.c b/gcc/testsuite/gcc.target/arm/neon/vst4Qs8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vst4Qs8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vst4Qs8.c 2010-01-25 09:50:29.545686586 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vst4Qu16.c b/gcc/testsuite/gcc.target/arm/neon/vst4Qu16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vst4Qu16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vst4Qu16.c 2010-01-25 09:50:29.545686586 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vst4Qu32.c b/gcc/testsuite/gcc.target/arm/neon/vst4Qu32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vst4Qu32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vst4Qu32.c 2010-01-25 09:50:29.545686586 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vst4Qu8.c b/gcc/testsuite/gcc.target/arm/neon/vst4Qu8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vst4Qu8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vst4Qu8.c 2010-01-25 09:50:29.545686586 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vst4s16.c b/gcc/testsuite/gcc.target/arm/neon/vst4s16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vst4s16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vst4s16.c 2010-01-25 09:50:29.545686586 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vst4s32.c b/gcc/testsuite/gcc.target/arm/neon/vst4s32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vst4s32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vst4s32.c 2010-01-25 09:50:29.545686586 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vst4s64.c b/gcc/testsuite/gcc.target/arm/neon/vst4s64.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vst4s64.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vst4s64.c 2010-01-25 09:50:29.545686586 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vst4s8.c b/gcc/testsuite/gcc.target/arm/neon/vst4s8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vst4s8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vst4s8.c 2010-01-25 09:50:29.545686586 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vst4u16.c b/gcc/testsuite/gcc.target/arm/neon/vst4u16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vst4u16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vst4u16.c 2010-01-25 09:50:29.545686586 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vst4u32.c b/gcc/testsuite/gcc.target/arm/neon/vst4u32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vst4u32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vst4u32.c 2010-01-25 09:50:29.545686586 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vst4u64.c b/gcc/testsuite/gcc.target/arm/neon/vst4u64.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vst4u64.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vst4u64.c 2010-01-25 09:50:29.545686586 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vst4u8.c b/gcc/testsuite/gcc.target/arm/neon/vst4u8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vst4u8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vst4u8.c 2010-01-25 09:50:29.545686586 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vsubf32.c b/gcc/testsuite/gcc.target/arm/neon/vsubf32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vsubf32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vsubf32.c 2010-01-25 09:50:29.545686586 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vsubhns16.c b/gcc/testsuite/gcc.target/arm/neon/vsubhns16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vsubhns16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vsubhns16.c 2010-01-25 09:50:29.555686949 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vsubhns32.c b/gcc/testsuite/gcc.target/arm/neon/vsubhns32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vsubhns32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vsubhns32.c 2010-01-25 09:50:29.555686949 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vsubhns64.c b/gcc/testsuite/gcc.target/arm/neon/vsubhns64.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vsubhns64.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vsubhns64.c 2010-01-25 09:50:29.555686949 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vsubhnu16.c b/gcc/testsuite/gcc.target/arm/neon/vsubhnu16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vsubhnu16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vsubhnu16.c 2010-01-25 09:50:29.555686949 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vsubhnu32.c b/gcc/testsuite/gcc.target/arm/neon/vsubhnu32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vsubhnu32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vsubhnu32.c 2010-01-25 09:50:29.555686949 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vsubhnu64.c b/gcc/testsuite/gcc.target/arm/neon/vsubhnu64.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vsubhnu64.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vsubhnu64.c 2010-01-25 09:50:29.555686949 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vsubls16.c b/gcc/testsuite/gcc.target/arm/neon/vsubls16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vsubls16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vsubls16.c 2010-01-25 09:50:29.555686949 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vsubls32.c b/gcc/testsuite/gcc.target/arm/neon/vsubls32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vsubls32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vsubls32.c 2010-01-25 09:50:29.555686949 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vsubls8.c b/gcc/testsuite/gcc.target/arm/neon/vsubls8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vsubls8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vsubls8.c 2010-01-25 09:50:29.555686949 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vsublu16.c b/gcc/testsuite/gcc.target/arm/neon/vsublu16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vsublu16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vsublu16.c 2010-01-25 09:50:29.555686949 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vsublu32.c b/gcc/testsuite/gcc.target/arm/neon/vsublu32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vsublu32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vsublu32.c 2010-01-25 09:50:29.555686949 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vsublu8.c b/gcc/testsuite/gcc.target/arm/neon/vsublu8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vsublu8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vsublu8.c 2010-01-25 09:50:29.555686949 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vsubQf32.c b/gcc/testsuite/gcc.target/arm/neon/vsubQf32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vsubQf32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vsubQf32.c 2010-01-25 09:50:29.555686949 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vsubQs16.c b/gcc/testsuite/gcc.target/arm/neon/vsubQs16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vsubQs16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vsubQs16.c 2010-01-25 09:50:29.555686949 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vsubQs32.c b/gcc/testsuite/gcc.target/arm/neon/vsubQs32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vsubQs32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vsubQs32.c 2010-01-25 09:50:29.555686949 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vsubQs64.c b/gcc/testsuite/gcc.target/arm/neon/vsubQs64.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vsubQs64.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vsubQs64.c 2010-01-25 09:50:29.555686949 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vsubQs8.c b/gcc/testsuite/gcc.target/arm/neon/vsubQs8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vsubQs8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vsubQs8.c 2010-01-25 09:50:29.555686949 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vsubQu16.c b/gcc/testsuite/gcc.target/arm/neon/vsubQu16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vsubQu16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vsubQu16.c 2010-01-25 09:50:29.555686949 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vsubQu32.c b/gcc/testsuite/gcc.target/arm/neon/vsubQu32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vsubQu32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vsubQu32.c 2010-01-25 09:50:29.555686949 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vsubQu64.c b/gcc/testsuite/gcc.target/arm/neon/vsubQu64.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vsubQu64.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vsubQu64.c 2010-01-25 09:50:29.555686949 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vsubQu8.c b/gcc/testsuite/gcc.target/arm/neon/vsubQu8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vsubQu8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vsubQu8.c 2010-01-25 09:50:29.555686949 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vsubs16.c b/gcc/testsuite/gcc.target/arm/neon/vsubs16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vsubs16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vsubs16.c 2010-01-25 09:50:29.555686949 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vsubs32.c b/gcc/testsuite/gcc.target/arm/neon/vsubs32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vsubs32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vsubs32.c 2010-01-25 09:50:29.555686949 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vsubs64.c b/gcc/testsuite/gcc.target/arm/neon/vsubs64.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vsubs64.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vsubs64.c 2010-01-25 09:50:29.555686949 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vsubs8.c b/gcc/testsuite/gcc.target/arm/neon/vsubs8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vsubs8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vsubs8.c 2010-01-25 09:50:29.555686949 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vsubu16.c b/gcc/testsuite/gcc.target/arm/neon/vsubu16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vsubu16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vsubu16.c 2010-01-25 09:50:29.555686949 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vsubu32.c b/gcc/testsuite/gcc.target/arm/neon/vsubu32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vsubu32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vsubu32.c 2010-01-25 09:50:29.555686949 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vsubu64.c b/gcc/testsuite/gcc.target/arm/neon/vsubu64.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vsubu64.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vsubu64.c 2010-01-25 09:50:29.555686949 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vsubu8.c b/gcc/testsuite/gcc.target/arm/neon/vsubu8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vsubu8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vsubu8.c 2010-01-25 09:50:29.555686949 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vsubws16.c b/gcc/testsuite/gcc.target/arm/neon/vsubws16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vsubws16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vsubws16.c 2010-01-25 09:50:29.555686949 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vsubws32.c b/gcc/testsuite/gcc.target/arm/neon/vsubws32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vsubws32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vsubws32.c 2010-01-25 09:50:29.555686949 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vsubws8.c b/gcc/testsuite/gcc.target/arm/neon/vsubws8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vsubws8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vsubws8.c 2010-01-25 09:50:29.555686949 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vsubwu16.c b/gcc/testsuite/gcc.target/arm/neon/vsubwu16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vsubwu16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vsubwu16.c 2010-01-25 09:50:29.555686949 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vsubwu32.c b/gcc/testsuite/gcc.target/arm/neon/vsubwu32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vsubwu32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vsubwu32.c 2010-01-25 09:50:29.555686949 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vsubwu8.c b/gcc/testsuite/gcc.target/arm/neon/vsubwu8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vsubwu8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vsubwu8.c 2010-01-25 09:50:29.555686949 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vtbl1p8.c b/gcc/testsuite/gcc.target/arm/neon/vtbl1p8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vtbl1p8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vtbl1p8.c 2010-01-25 09:50:29.555686949 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vtbl1s8.c b/gcc/testsuite/gcc.target/arm/neon/vtbl1s8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vtbl1s8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vtbl1s8.c 2010-01-25 09:50:29.555686949 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vtbl1u8.c b/gcc/testsuite/gcc.target/arm/neon/vtbl1u8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vtbl1u8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vtbl1u8.c 2010-01-25 09:50:29.555686949 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vtbl2p8.c b/gcc/testsuite/gcc.target/arm/neon/vtbl2p8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vtbl2p8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vtbl2p8.c 2010-01-25 09:50:29.555686949 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vtbl2s8.c b/gcc/testsuite/gcc.target/arm/neon/vtbl2s8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vtbl2s8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vtbl2s8.c 2010-01-25 09:50:29.555686949 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vtbl2u8.c b/gcc/testsuite/gcc.target/arm/neon/vtbl2u8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vtbl2u8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vtbl2u8.c 2010-01-25 09:50:29.555686949 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vtbl3p8.c b/gcc/testsuite/gcc.target/arm/neon/vtbl3p8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vtbl3p8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vtbl3p8.c 2010-01-25 09:50:29.555686949 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vtbl3s8.c b/gcc/testsuite/gcc.target/arm/neon/vtbl3s8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vtbl3s8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vtbl3s8.c 2010-01-25 09:50:29.555686949 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vtbl3u8.c b/gcc/testsuite/gcc.target/arm/neon/vtbl3u8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vtbl3u8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vtbl3u8.c 2010-01-25 09:50:29.555686949 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vtbl4p8.c b/gcc/testsuite/gcc.target/arm/neon/vtbl4p8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vtbl4p8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vtbl4p8.c 2010-01-25 09:50:29.555686949 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vtbl4s8.c b/gcc/testsuite/gcc.target/arm/neon/vtbl4s8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vtbl4s8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vtbl4s8.c 2010-01-25 09:50:29.555686949 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vtbl4u8.c b/gcc/testsuite/gcc.target/arm/neon/vtbl4u8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vtbl4u8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vtbl4u8.c 2010-01-25 09:50:29.555686949 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vtbx1p8.c b/gcc/testsuite/gcc.target/arm/neon/vtbx1p8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vtbx1p8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vtbx1p8.c 2010-01-25 09:50:29.555686949 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vtbx1s8.c b/gcc/testsuite/gcc.target/arm/neon/vtbx1s8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vtbx1s8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vtbx1s8.c 2010-01-25 09:50:29.555686949 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vtbx1u8.c b/gcc/testsuite/gcc.target/arm/neon/vtbx1u8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vtbx1u8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vtbx1u8.c 2010-01-25 09:50:29.555686949 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vtbx2p8.c b/gcc/testsuite/gcc.target/arm/neon/vtbx2p8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vtbx2p8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vtbx2p8.c 2010-01-25 09:50:29.555686949 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vtbx2s8.c b/gcc/testsuite/gcc.target/arm/neon/vtbx2s8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vtbx2s8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vtbx2s8.c 2010-01-25 09:50:29.555686949 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vtbx2u8.c b/gcc/testsuite/gcc.target/arm/neon/vtbx2u8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vtbx2u8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vtbx2u8.c 2010-01-25 09:50:29.555686949 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vtbx3p8.c b/gcc/testsuite/gcc.target/arm/neon/vtbx3p8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vtbx3p8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vtbx3p8.c 2010-01-25 09:50:29.555686949 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vtbx3s8.c b/gcc/testsuite/gcc.target/arm/neon/vtbx3s8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vtbx3s8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vtbx3s8.c 2010-01-25 09:50:29.555686949 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vtbx3u8.c b/gcc/testsuite/gcc.target/arm/neon/vtbx3u8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vtbx3u8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vtbx3u8.c 2010-01-25 09:50:29.555686949 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vtbx4p8.c b/gcc/testsuite/gcc.target/arm/neon/vtbx4p8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vtbx4p8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vtbx4p8.c 2010-01-25 09:50:29.555686949 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vtbx4s8.c b/gcc/testsuite/gcc.target/arm/neon/vtbx4s8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vtbx4s8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vtbx4s8.c 2010-01-25 09:50:29.555686949 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vtbx4u8.c b/gcc/testsuite/gcc.target/arm/neon/vtbx4u8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vtbx4u8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vtbx4u8.c 2010-01-25 09:50:29.555686949 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vtrnf32.c b/gcc/testsuite/gcc.target/arm/neon/vtrnf32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vtrnf32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vtrnf32.c 2010-01-25 09:50:29.555686949 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vtrnp16.c b/gcc/testsuite/gcc.target/arm/neon/vtrnp16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vtrnp16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vtrnp16.c 2010-01-25 09:50:29.555686949 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vtrnp8.c b/gcc/testsuite/gcc.target/arm/neon/vtrnp8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vtrnp8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vtrnp8.c 2010-01-25 09:50:29.555686949 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vtrnQf32.c b/gcc/testsuite/gcc.target/arm/neon/vtrnQf32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vtrnQf32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vtrnQf32.c 2010-01-25 09:50:29.555686949 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vtrnQp16.c b/gcc/testsuite/gcc.target/arm/neon/vtrnQp16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vtrnQp16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vtrnQp16.c 2010-01-25 09:50:29.555686949 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vtrnQp8.c b/gcc/testsuite/gcc.target/arm/neon/vtrnQp8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vtrnQp8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vtrnQp8.c 2010-01-25 09:50:29.555686949 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vtrnQs16.c b/gcc/testsuite/gcc.target/arm/neon/vtrnQs16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vtrnQs16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vtrnQs16.c 2010-01-25 09:50:29.555686949 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vtrnQs32.c b/gcc/testsuite/gcc.target/arm/neon/vtrnQs32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vtrnQs32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vtrnQs32.c 2010-01-25 09:50:29.555686949 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vtrnQs8.c b/gcc/testsuite/gcc.target/arm/neon/vtrnQs8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vtrnQs8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vtrnQs8.c 2010-01-25 09:50:29.555686949 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vtrnQu16.c b/gcc/testsuite/gcc.target/arm/neon/vtrnQu16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vtrnQu16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vtrnQu16.c 2010-01-25 09:50:29.555686949 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vtrnQu32.c b/gcc/testsuite/gcc.target/arm/neon/vtrnQu32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vtrnQu32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vtrnQu32.c 2010-01-25 09:50:29.555686949 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vtrnQu8.c b/gcc/testsuite/gcc.target/arm/neon/vtrnQu8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vtrnQu8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vtrnQu8.c 2010-01-25 09:50:29.555686949 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vtrns16.c b/gcc/testsuite/gcc.target/arm/neon/vtrns16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vtrns16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vtrns16.c 2010-01-25 09:50:29.565686614 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vtrns32.c b/gcc/testsuite/gcc.target/arm/neon/vtrns32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vtrns32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vtrns32.c 2010-01-25 09:50:29.565686614 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vtrns8.c b/gcc/testsuite/gcc.target/arm/neon/vtrns8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vtrns8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vtrns8.c 2010-01-25 09:50:29.565686614 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vtrnu16.c b/gcc/testsuite/gcc.target/arm/neon/vtrnu16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vtrnu16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vtrnu16.c 2010-01-25 09:50:29.565686614 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vtrnu32.c b/gcc/testsuite/gcc.target/arm/neon/vtrnu32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vtrnu32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vtrnu32.c 2010-01-25 09:50:29.565686614 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vtrnu8.c b/gcc/testsuite/gcc.target/arm/neon/vtrnu8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vtrnu8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vtrnu8.c 2010-01-25 09:50:29.565686614 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vtstp8.c b/gcc/testsuite/gcc.target/arm/neon/vtstp8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vtstp8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vtstp8.c 2010-01-25 09:50:29.565686614 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vtstQp8.c b/gcc/testsuite/gcc.target/arm/neon/vtstQp8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vtstQp8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vtstQp8.c 2010-01-25 09:50:29.565686614 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vtstQs16.c b/gcc/testsuite/gcc.target/arm/neon/vtstQs16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vtstQs16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vtstQs16.c 2010-01-25 09:50:29.565686614 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vtstQs32.c b/gcc/testsuite/gcc.target/arm/neon/vtstQs32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vtstQs32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vtstQs32.c 2010-01-25 09:50:29.565686614 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vtstQs8.c b/gcc/testsuite/gcc.target/arm/neon/vtstQs8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vtstQs8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vtstQs8.c 2010-01-25 09:50:29.565686614 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vtstQu16.c b/gcc/testsuite/gcc.target/arm/neon/vtstQu16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vtstQu16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vtstQu16.c 2010-01-25 09:50:29.565686614 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vtstQu32.c b/gcc/testsuite/gcc.target/arm/neon/vtstQu32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vtstQu32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vtstQu32.c 2010-01-25 09:50:29.565686614 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vtstQu8.c b/gcc/testsuite/gcc.target/arm/neon/vtstQu8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vtstQu8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vtstQu8.c 2010-01-25 09:50:29.565686614 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vtsts16.c b/gcc/testsuite/gcc.target/arm/neon/vtsts16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vtsts16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vtsts16.c 2010-01-25 09:50:29.565686614 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vtsts32.c b/gcc/testsuite/gcc.target/arm/neon/vtsts32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vtsts32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vtsts32.c 2010-01-25 09:50:29.565686614 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vtsts8.c b/gcc/testsuite/gcc.target/arm/neon/vtsts8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vtsts8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vtsts8.c 2010-01-25 09:50:29.565686614 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vtstu16.c b/gcc/testsuite/gcc.target/arm/neon/vtstu16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vtstu16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vtstu16.c 2010-01-25 09:50:29.565686614 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vtstu32.c b/gcc/testsuite/gcc.target/arm/neon/vtstu32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vtstu32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vtstu32.c 2010-01-25 09:50:29.565686614 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vtstu8.c b/gcc/testsuite/gcc.target/arm/neon/vtstu8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vtstu8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vtstu8.c 2010-01-25 09:50:29.565686614 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vuzpf32.c b/gcc/testsuite/gcc.target/arm/neon/vuzpf32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vuzpf32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vuzpf32.c 2010-01-25 09:50:29.565686614 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vuzpp16.c b/gcc/testsuite/gcc.target/arm/neon/vuzpp16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vuzpp16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vuzpp16.c 2010-01-25 09:50:29.565686614 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vuzpp8.c b/gcc/testsuite/gcc.target/arm/neon/vuzpp8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vuzpp8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vuzpp8.c 2010-01-25 09:50:29.565686614 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vuzpQf32.c b/gcc/testsuite/gcc.target/arm/neon/vuzpQf32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vuzpQf32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vuzpQf32.c 2010-01-25 09:50:29.565686614 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vuzpQp16.c b/gcc/testsuite/gcc.target/arm/neon/vuzpQp16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vuzpQp16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vuzpQp16.c 2010-01-25 09:50:29.565686614 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vuzpQp8.c b/gcc/testsuite/gcc.target/arm/neon/vuzpQp8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vuzpQp8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vuzpQp8.c 2010-01-25 09:50:29.565686614 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vuzpQs16.c b/gcc/testsuite/gcc.target/arm/neon/vuzpQs16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vuzpQs16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vuzpQs16.c 2010-01-25 09:50:29.565686614 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vuzpQs32.c b/gcc/testsuite/gcc.target/arm/neon/vuzpQs32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vuzpQs32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vuzpQs32.c 2010-01-25 09:50:29.565686614 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vuzpQs8.c b/gcc/testsuite/gcc.target/arm/neon/vuzpQs8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vuzpQs8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vuzpQs8.c 2010-01-25 09:50:29.565686614 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vuzpQu16.c b/gcc/testsuite/gcc.target/arm/neon/vuzpQu16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vuzpQu16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vuzpQu16.c 2010-01-25 09:50:29.565686614 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vuzpQu32.c b/gcc/testsuite/gcc.target/arm/neon/vuzpQu32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vuzpQu32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vuzpQu32.c 2010-01-25 09:50:29.565686614 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vuzpQu8.c b/gcc/testsuite/gcc.target/arm/neon/vuzpQu8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vuzpQu8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vuzpQu8.c 2010-01-25 09:50:29.565686614 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vuzps16.c b/gcc/testsuite/gcc.target/arm/neon/vuzps16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vuzps16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vuzps16.c 2010-01-25 09:50:29.565686614 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vuzps32.c b/gcc/testsuite/gcc.target/arm/neon/vuzps32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vuzps32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vuzps32.c 2010-01-25 09:50:29.565686614 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vuzps8.c b/gcc/testsuite/gcc.target/arm/neon/vuzps8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vuzps8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vuzps8.c 2010-01-25 09:50:29.565686614 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vuzpu16.c b/gcc/testsuite/gcc.target/arm/neon/vuzpu16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vuzpu16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vuzpu16.c 2010-01-25 09:50:29.565686614 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vuzpu32.c b/gcc/testsuite/gcc.target/arm/neon/vuzpu32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vuzpu32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vuzpu32.c 2010-01-25 09:50:29.565686614 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vuzpu8.c b/gcc/testsuite/gcc.target/arm/neon/vuzpu8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vuzpu8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vuzpu8.c 2010-01-25 09:50:29.565686614 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vzipf32.c b/gcc/testsuite/gcc.target/arm/neon/vzipf32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vzipf32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vzipf32.c 2010-01-25 09:50:29.565686614 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vzipp16.c b/gcc/testsuite/gcc.target/arm/neon/vzipp16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vzipp16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vzipp16.c 2010-01-25 09:50:29.565686614 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vzipp8.c b/gcc/testsuite/gcc.target/arm/neon/vzipp8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vzipp8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vzipp8.c 2010-01-25 09:50:29.565686614 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vzipQf32.c b/gcc/testsuite/gcc.target/arm/neon/vzipQf32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vzipQf32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vzipQf32.c 2010-01-25 09:50:29.565686614 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vzipQp16.c b/gcc/testsuite/gcc.target/arm/neon/vzipQp16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vzipQp16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vzipQp16.c 2010-01-25 09:50:29.565686614 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vzipQp8.c b/gcc/testsuite/gcc.target/arm/neon/vzipQp8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vzipQp8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vzipQp8.c 2010-01-25 09:50:29.565686614 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vzipQs16.c b/gcc/testsuite/gcc.target/arm/neon/vzipQs16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vzipQs16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vzipQs16.c 2010-01-25 09:50:29.565686614 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vzipQs32.c b/gcc/testsuite/gcc.target/arm/neon/vzipQs32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vzipQs32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vzipQs32.c 2010-01-25 09:50:29.565686614 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vzipQs8.c b/gcc/testsuite/gcc.target/arm/neon/vzipQs8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vzipQs8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vzipQs8.c 2010-01-25 09:50:29.565686614 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vzipQu16.c b/gcc/testsuite/gcc.target/arm/neon/vzipQu16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vzipQu16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vzipQu16.c 2010-01-25 09:50:29.565686614 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vzipQu32.c b/gcc/testsuite/gcc.target/arm/neon/vzipQu32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vzipQu32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vzipQu32.c 2010-01-25 09:50:29.565686614 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vzipQu8.c b/gcc/testsuite/gcc.target/arm/neon/vzipQu8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vzipQu8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vzipQu8.c 2010-01-25 09:50:29.565686614 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vzips16.c b/gcc/testsuite/gcc.target/arm/neon/vzips16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vzips16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vzips16.c 2010-01-25 09:50:29.565686614 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vzips32.c b/gcc/testsuite/gcc.target/arm/neon/vzips32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vzips32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vzips32.c 2010-01-25 09:50:29.565686614 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vzips8.c b/gcc/testsuite/gcc.target/arm/neon/vzips8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vzips8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vzips8.c 2010-01-25 09:50:29.565686614 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vzipu16.c b/gcc/testsuite/gcc.target/arm/neon/vzipu16.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vzipu16.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vzipu16.c 2010-01-25 09:50:29.565686614 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vzipu32.c b/gcc/testsuite/gcc.target/arm/neon/vzipu32.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vzipu32.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vzipu32.c 2010-01-25 09:50:29.565686614 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon/vzipu8.c b/gcc/testsuite/gcc.target/arm/neon/vzipu8.c
+--- a/gcc/testsuite/gcc.target/arm/neon/vzipu8.c 2007-07-25 14:28:31.000000000 +0200
++++ b/gcc/testsuite/gcc.target/arm/neon/vzipu8.c 2010-01-25 09:50:29.565686614 +0100
+@@ -3,7 +3,8 @@
+
+ /* { dg-do assemble } */
+ /* { dg-require-effective-target arm_neon_ok } */
+-/* { dg-options "-save-temps -O0 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-save-temps -O0" } */
++/* { dg-add-options arm_neon } */
+
+ #include "arm_neon.h"
+
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon-cond-1.c b/gcc/testsuite/gcc.target/arm/neon-cond-1.c
+--- a/gcc/testsuite/gcc.target/arm/neon-cond-1.c 2009-01-27 17:14:13.000000000 +0100
++++ b/gcc/testsuite/gcc.target/arm/neon-cond-1.c 2010-01-25 09:50:29.565686614 +0100
+@@ -1,6 +1,7 @@
+ /* { dg-do run } */
+ /* { dg-require-effective-target arm_neon_hw } */
+-/* { dg-options "-O2 -mfpu=neon -mfloat-abi=softfp" } */
++/* { dg-options "-O2" } */
++/* { dg-add-options arm_neon } */
+ /* Check that the arm_final_prescan_insn ccfsm code does not try to
+ * conditionally execute NEON instructions. */
+ #include <arm_neon.h>
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon-modes-1.c b/gcc/testsuite/gcc.target/arm/neon-modes-1.c
+--- a/gcc/testsuite/gcc.target/arm/neon-modes-1.c 1970-01-01 01:00:00.000000000 +0100
++++ b/gcc/testsuite/gcc.target/arm/neon-modes-1.c 2010-01-25 09:50:29.565686614 +0100
+@@ -0,0 +1,14 @@
++/* { dg-do compile } */
++/* { dg-require-effective-target arm_neon_ok } */
++/* { dg-options "-O1" } */
++/* { dg-add-options arm_neon } */
++
++#include <arm_neon.h>
++
++void neon_internal_error(int *dst, int *src)
++{
++ uint16x8x4_t sval;
++
++ sval = vld4q_u16((void *)src);
++ vst4q_u16((void *)dst,sval);
++}
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon-vmla-1.c b/gcc/testsuite/gcc.target/arm/neon-vmla-1.c
+--- a/gcc/testsuite/gcc.target/arm/neon-vmla-1.c 1970-01-01 01:00:00.000000000 +0100
++++ b/gcc/testsuite/gcc.target/arm/neon-vmla-1.c 2010-01-25 09:50:29.565686614 +0100
+@@ -0,0 +1,11 @@
++/* { dg-require-effective-target arm_neon_hw } */
++/* { dg-options "-O2 -ftree-vectorize" } */
++/* { dg-add-options arm_neon } */
++/* { dg-final { scan-assembler "vmla\\.f32" } } */
++
++/* Verify that VMLA is used. */
++void f1(int n, float a, float x[], float y[]) {
++ int i;
++ for (i = 0; i < n; ++i)
++ y[i] = a * x[i] + y[i];
++}
+diff -Nur a/gcc/testsuite/gcc.target/arm/neon-vmls-1.c b/gcc/testsuite/gcc.target/arm/neon-vmls-1.c
+--- a/gcc/testsuite/gcc.target/arm/neon-vmls-1.c 1970-01-01 01:00:00.000000000 +0100
++++ b/gcc/testsuite/gcc.target/arm/neon-vmls-1.c 2010-01-25 09:50:29.565686614 +0100
+@@ -0,0 +1,11 @@
++/* { dg-require-effective-target arm_neon_hw } */
++/* { dg-options "-O2 -ftree-vectorize" } */
++/* { dg-add-options arm_neon } */
++/* { dg-final { scan-assembler "vmls\\.f32" } } */
++
++/* Verify that VMLS is used. */
++void f1(int n, float a, float x[], float y[]) {
++ int i;
++ for (i = 0; i < n; ++i)
++ y[i] = y[i] - a * x[i];
++}
+diff -Nur a/gcc/testsuite/gcc.target/arm/pr40482.c b/gcc/testsuite/gcc.target/arm/pr40482.c
+--- a/gcc/testsuite/gcc.target/arm/pr40482.c 1970-01-01 01:00:00.000000000 +0100
++++ b/gcc/testsuite/gcc.target/arm/pr40482.c 2010-01-25 09:50:29.565686614 +0100
+@@ -0,0 +1,7 @@
++/* { dg-options "-mthumb -Os" } */
++/* { dg-final { scan-assembler-not "ldr" } } */
++
++unsigned int foo (unsigned int i )
++{
++ return i | 0xff000000;
++}
+diff -Nur a/gcc/testsuite/gcc.target/arm/thumb2-mul-space-2.c b/gcc/testsuite/gcc.target/arm/thumb2-mul-space-2.c
+--- a/gcc/testsuite/gcc.target/arm/thumb2-mul-space-2.c 1970-01-01 01:00:00.000000000 +0100
++++ b/gcc/testsuite/gcc.target/arm/thumb2-mul-space-2.c 2010-01-25 09:50:29.565686614 +0100
+@@ -0,0 +1,15 @@
++/* In Thumb-2 mode, when optimizing for size, generate a "muls"
++ instruction and use the resulting condition flags rather than a
++ separate compare instruction. */
++/* { dg-options "-mthumb -Os" } */
++/* { dg-require-effective-target arm_thumb2_ok } */
++/* { dg-final { scan-assembler "muls" } } */
++/* { dg-final { scan-assembler-not "cmp" } } */
++
++int x;
++
++void f(int i, int j)
++{
++ if (i * j < 0)
++ x = 1;
++}
+diff -Nur a/gcc/testsuite/gcc.target/arm/thumb2-mul-space-3.c b/gcc/testsuite/gcc.target/arm/thumb2-mul-space-3.c
+--- a/gcc/testsuite/gcc.target/arm/thumb2-mul-space-3.c 1970-01-01 01:00:00.000000000 +0100
++++ b/gcc/testsuite/gcc.target/arm/thumb2-mul-space-3.c 2010-01-25 09:50:29.565686614 +0100
+@@ -0,0 +1,17 @@
++/* In Thumb-2 mode, when optimizing for size, generate a "muls"
++ instruction and use the resulting condition flags rather than a
++ separate compare instruction. */
++/* { dg-options "-mthumb -Os" } */
++/* { dg-require-effective-target arm_thumb2_ok } */
++/* { dg-final { scan-assembler "muls" } } */
++/* { dg-final { scan-assembler-not "cmp" } } */
++
++int x;
++
++int f(int i, int j)
++{
++ i = i * j;
++ if (i < 0)
++ x = 1;
++ return i;
++}
+diff -Nur a/gcc/testsuite/gcc.target/arm/thumb2-mul-space.c b/gcc/testsuite/gcc.target/arm/thumb2-mul-space.c
+--- a/gcc/testsuite/gcc.target/arm/thumb2-mul-space.c 1970-01-01 01:00:00.000000000 +0100
++++ b/gcc/testsuite/gcc.target/arm/thumb2-mul-space.c 2010-01-25 09:50:29.565686614 +0100
+@@ -0,0 +1,10 @@
++/* Use 16-bit multiply instruction in Thumb-2 mode when optimizing for
++ size. */
++/* { dg-options "-mthumb -Os" } */
++/* { dg-require-effective-target arm_thumb2_ok } */
++/* { dg-final { scan-assembler "muls" } } */
++
++int f(int i, int j)
++{
++ return i * j;
++}
+diff -Nur a/gcc/testsuite/gcc.target/arm/thumb2-mul-speed.c b/gcc/testsuite/gcc.target/arm/thumb2-mul-speed.c
+--- a/gcc/testsuite/gcc.target/arm/thumb2-mul-speed.c 1970-01-01 01:00:00.000000000 +0100
++++ b/gcc/testsuite/gcc.target/arm/thumb2-mul-speed.c 2010-01-25 09:50:29.565686614 +0100
+@@ -0,0 +1,27 @@
++/* Do not use 16-bit multiply instructions in Thumb-2 mode when
++ optimizing for speed. */
++/* { dg-options "-mthumb -O2" } */
++/* { dg-require-effective-target arm_thumb2_ok } */
++/* { dg-final { scan-assembler-not "muls" } } */
++
++int f(int i, int j)
++{
++ return i * j;
++}
++
++int x;
++
++void g(int i, int j)
++{
++ if (i * j < 0)
++ x = 1;
++}
++
++int h(int i, int j)
++{
++ i = i * j;
++ if (i < 0)
++ x = 1;
++ return i;
++}
++
+diff -Nur a/gcc/testsuite/gcc.target/arm/vfp-ldmdbd.c b/gcc/testsuite/gcc.target/arm/vfp-ldmdbd.c
+--- a/gcc/testsuite/gcc.target/arm/vfp-ldmdbd.c 1970-01-01 01:00:00.000000000 +0100
++++ b/gcc/testsuite/gcc.target/arm/vfp-ldmdbd.c 2010-01-25 09:50:29.565686614 +0100
+@@ -0,0 +1,15 @@
++/* { dg-do compile } */
++/* { dg-require-effective-target arm_vfp_ok } */
++/* { dg-options "-O2 -mfpu=vfp -mfloat-abi=softfp" } */
++
++extern void bar (double);
++
++void
++foo (double *p, double a, int n)
++{
++ do
++ bar (*--p + a);
++ while (n--);
++}
++
++/* { dg-final { scan-assembler "fldmdbd" } } */
+diff -Nur a/gcc/testsuite/gcc.target/arm/vfp-ldmdbs.c b/gcc/testsuite/gcc.target/arm/vfp-ldmdbs.c
+--- a/gcc/testsuite/gcc.target/arm/vfp-ldmdbs.c 1970-01-01 01:00:00.000000000 +0100
++++ b/gcc/testsuite/gcc.target/arm/vfp-ldmdbs.c 2010-01-25 09:50:29.565686614 +0100
+@@ -0,0 +1,15 @@
++/* { dg-do compile } */
++/* { dg-require-effective-target arm_vfp_ok } */
++/* { dg-options "-O2 -mfpu=vfp -mfloat-abi=softfp" } */
++
++extern void baz (float);
++
++void
++foo (float *p, float a, int n)
++{
++ do
++ bar (*--p + a);
++ while (n--);
++}
++
++/* { dg-final { scan-assembler "fldmdbs" } } */
+diff -Nur a/gcc/testsuite/gcc.target/arm/vfp-ldmiad.c b/gcc/testsuite/gcc.target/arm/vfp-ldmiad.c
+--- a/gcc/testsuite/gcc.target/arm/vfp-ldmiad.c 1970-01-01 01:00:00.000000000 +0100
++++ b/gcc/testsuite/gcc.target/arm/vfp-ldmiad.c 2010-01-25 09:50:29.565686614 +0100
+@@ -0,0 +1,15 @@
++/* { dg-do compile } */
++/* { dg-require-effective-target arm_vfp_ok } */
++/* { dg-options "-O2 -mfpu=vfp -mfloat-abi=softfp" } */
++
++extern void bar (double);
++
++void
++foo (double *p, double a, int n)
++{
++ do
++ bar (*p++ + a);
++ while (n--);
++}
++
++/* { dg-final { scan-assembler "fldmiad" } } */
+diff -Nur a/gcc/testsuite/gcc.target/arm/vfp-ldmias.c b/gcc/testsuite/gcc.target/arm/vfp-ldmias.c
+--- a/gcc/testsuite/gcc.target/arm/vfp-ldmias.c 1970-01-01 01:00:00.000000000 +0100
++++ b/gcc/testsuite/gcc.target/arm/vfp-ldmias.c 2010-01-25 09:50:29.565686614 +0100
+@@ -0,0 +1,15 @@
++/* { dg-do compile } */
++/* { dg-require-effective-target arm_vfp_ok } */
++/* { dg-options "-O2 -mfpu=vfp -mfloat-abi=softfp" } */
++
++extern void baz (float);
++
++void
++foo (float *p, float a, int n)
++{
++ do
++ bar (*p++ + a);
++ while (n--);
++}
++
++/* { dg-final { scan-assembler "fldmias" } } */
+diff -Nur a/gcc/testsuite/gcc.target/arm/vfp-stmdbd.c b/gcc/testsuite/gcc.target/arm/vfp-stmdbd.c
+--- a/gcc/testsuite/gcc.target/arm/vfp-stmdbd.c 1970-01-01 01:00:00.000000000 +0100
++++ b/gcc/testsuite/gcc.target/arm/vfp-stmdbd.c 2010-01-25 09:50:29.565686614 +0100
+@@ -0,0 +1,14 @@
++/* { dg-do compile } */
++/* { dg-require-effective-target arm_vfp_ok } */
++/* { dg-options "-O2 -mfpu=vfp -mfloat-abi=softfp" } */
++
++void
++foo (double *p, double a, double b, int n)
++{
++ double c = a + b;
++ do
++ *--p = c;
++ while (n--);
++}
++
++/* { dg-final { scan-assembler "fstmdbd" } } */
+diff -Nur a/gcc/testsuite/gcc.target/arm/vfp-stmdbs.c b/gcc/testsuite/gcc.target/arm/vfp-stmdbs.c
+--- a/gcc/testsuite/gcc.target/arm/vfp-stmdbs.c 1970-01-01 01:00:00.000000000 +0100
++++ b/gcc/testsuite/gcc.target/arm/vfp-stmdbs.c 2010-01-25 09:50:29.565686614 +0100
+@@ -0,0 +1,14 @@
++/* { dg-do compile } */
++/* { dg-require-effective-target arm_vfp_ok } */
++/* { dg-options "-O2 -mfpu=vfp -mfloat-abi=softfp" } */
++
++void
++foo (float *p, float a, float b, int n)
++{
++ float c = a + b;
++ do
++ *--p = c;
++ while (n--);
++}
++
++/* { dg-final { scan-assembler "fstmdbs" } } */
+diff -Nur a/gcc/testsuite/gcc.target/arm/vfp-stmiad.c b/gcc/testsuite/gcc.target/arm/vfp-stmiad.c
+--- a/gcc/testsuite/gcc.target/arm/vfp-stmiad.c 1970-01-01 01:00:00.000000000 +0100
++++ b/gcc/testsuite/gcc.target/arm/vfp-stmiad.c 2010-01-25 09:50:29.565686614 +0100
+@@ -0,0 +1,14 @@
++/* { dg-do compile } */
++/* { dg-require-effective-target arm_vfp_ok } */
++/* { dg-options "-O2 -mfpu=vfp -mfloat-abi=softfp" } */
++
++void
++foo (double *p, double a, double b, int n)
++{
++ double c = a + b;
++ do
++ *p++ = c;
++ while (n--);
++}
++
++/* { dg-final { scan-assembler "fstmiad" } } */
+diff -Nur a/gcc/testsuite/gcc.target/arm/vfp-stmias.c b/gcc/testsuite/gcc.target/arm/vfp-stmias.c
+--- a/gcc/testsuite/gcc.target/arm/vfp-stmias.c 1970-01-01 01:00:00.000000000 +0100
++++ b/gcc/testsuite/gcc.target/arm/vfp-stmias.c 2010-01-25 09:50:29.565686614 +0100
+@@ -0,0 +1,14 @@
++/* { dg-do compile } */
++/* { dg-require-effective-target arm_vfp_ok } */
++/* { dg-options "-O2 -mfpu=vfp -mfloat-abi=softfp" } */
++
++void
++foo (float *p, float a, float b, int n)
++{
++ float c = a + b;
++ do
++ *p++ = c;
++ while (n--);
++}
++
++/* { dg-final { scan-assembler "fstmias" } } */
+diff -Nur a/gcc/testsuite/gcc.target/i386/387-1.c b/gcc/testsuite/gcc.target/i386/387-1.c
+--- a/gcc/testsuite/gcc.target/i386/387-1.c 2007-08-22 11:59:14.000000000 +0200
++++ b/gcc/testsuite/gcc.target/i386/387-1.c 2010-01-25 09:50:29.565686614 +0100
+@@ -1,6 +1,7 @@
+ /* Verify that -mno-fancy-math-387 works. */
+ /* { dg-do compile } */
+ /* { dg-require-effective-target ilp32 } */
++/* { dg-skip-if "" { i?86-*-* x86_64-*-* } { "-march=*" } { "-march=i386" } } */
+ /* { dg-options "-O -ffast-math -mfpmath=387 -mno-fancy-math-387 -march=i386" } */
+ /* { dg-final { scan-assembler "call\t(.*)sin" } } */
+ /* { dg-final { scan-assembler "call\t(.*)cos" } } */
+diff -Nur a/gcc/testsuite/gcc.target/i386/387-5.c b/gcc/testsuite/gcc.target/i386/387-5.c
+--- a/gcc/testsuite/gcc.target/i386/387-5.c 2007-08-22 11:59:14.000000000 +0200
++++ b/gcc/testsuite/gcc.target/i386/387-5.c 2010-01-25 09:50:29.565686614 +0100
+@@ -1,6 +1,7 @@
+ /* Verify that -mno-fancy-math-387 works. */
+ /* { dg-do compile } */
+ /* { dg-require-effective-target ilp32 } */
++/* { dg-skip-if "" { i?86-*-* x86_64-*-* } { "-march=*" } { "-march=i386" } } */
+ /* { dg-options "-O -ffast-math -mfpmath=387 -mno-fancy-math-387 -march=i386" } */
+ /* { dg-final { scan-assembler "call\t(.*)atan" } } */
+ /* { dg-final { scan-assembler "call\t(.*)log1p" } } */
+diff -Nur a/gcc/testsuite/gcc.target/i386/cmov7.c b/gcc/testsuite/gcc.target/i386/cmov7.c
+--- a/gcc/testsuite/gcc.target/i386/cmov7.c 2008-01-10 19:31:43.000000000 +0100
++++ b/gcc/testsuite/gcc.target/i386/cmov7.c 2010-01-25 09:50:29.565686614 +0100
+@@ -1,6 +1,7 @@
+ /* PR middle-end/33187 */
+
+ /* { dg-do compile } */
++/* { dg-skip-if "" { i?86-*-* x86_64-*-* } { "-march=*" } { "-march=k8" } } */
+ /* { dg-options "-O2 -ffast-math -march=k8 -mbranch-cost=5 -mfpmath=387" } */
+ /* { dg-final { scan-assembler "fcmov" } } */
+
+diff -Nur a/gcc/testsuite/gcc.target/i386/funcspec-1.c b/gcc/testsuite/gcc.target/i386/funcspec-1.c
+--- a/gcc/testsuite/gcc.target/i386/funcspec-1.c 2008-08-31 01:50:40.000000000 +0200
++++ b/gcc/testsuite/gcc.target/i386/funcspec-1.c 2010-01-25 09:50:29.575686558 +0100
+@@ -3,6 +3,7 @@
+ for a function that doesn't use attribute((option)). */
+ /* { dg-do compile } */
+ /* { dg-require-effective-target ilp32 } */
++/* { dg-skip-if "" { i?86-*-* x86_64-*-* } { "-march=*" } { "-march=i386" } } */
+ /* { dg-options "-O3 -ftree-vectorize -march=i386" } */
+ /* { dg-final { scan-assembler "addps\[ \t\]" } } */
+ /* { dg-final { scan-assembler "fsubs\[ \t\]" } } */
+diff -Nur a/gcc/testsuite/gcc.target/i386/funcspec-8.c b/gcc/testsuite/gcc.target/i386/funcspec-8.c
+--- a/gcc/testsuite/gcc.target/i386/funcspec-8.c 2008-08-31 01:50:40.000000000 +0200
++++ b/gcc/testsuite/gcc.target/i386/funcspec-8.c 2010-01-25 09:50:29.575686558 +0100
+@@ -1,6 +1,7 @@
+ /* Test whether using target specific options, we can use the x86 builtin
+ functions in functions with the appropriate function specific options. */
+ /* { dg-do compile } */
++/* { dg-skip-if "" { i?86-*-* x86_64-*-* } { "-march=*" } { "-march=k8" } } */
+ /* { dg-options "-O2 -march=k8 -mfpmath=sse" } */
+
+ typedef float __m128 __attribute__ ((__vector_size__ (16), __may_alias__));
+diff -Nur a/gcc/testsuite/gcc.target/i386/gcc-have-sync-compare-and-swap-1.c b/gcc/testsuite/gcc.target/i386/gcc-have-sync-compare-and-swap-1.c
+--- a/gcc/testsuite/gcc.target/i386/gcc-have-sync-compare-and-swap-1.c 2007-08-22 11:59:14.000000000 +0200
++++ b/gcc/testsuite/gcc.target/i386/gcc-have-sync-compare-and-swap-1.c 2010-01-25 09:50:29.575686558 +0100
+@@ -1,5 +1,6 @@
+ /* { dg-do preprocess } */
+ /* { dg-require-effective-target ilp32 } */
++/* { dg-skip-if "" { i?86-*-* x86_64-*-* } { "-march=*" } { "-march=i386" } } */
+ /* { dg-options "-march=i386" } */
+
+ #ifdef __GCC_HAVE_SYNC_COMPARE_AND_SWAP_1
+diff -Nur a/gcc/testsuite/gcc.target/i386/gcc-have-sync-compare-and-swap-2.c b/gcc/testsuite/gcc.target/i386/gcc-have-sync-compare-and-swap-2.c
+--- a/gcc/testsuite/gcc.target/i386/gcc-have-sync-compare-and-swap-2.c 2007-08-22 11:59:14.000000000 +0200
++++ b/gcc/testsuite/gcc.target/i386/gcc-have-sync-compare-and-swap-2.c 2010-01-25 09:50:29.575686558 +0100
+@@ -1,5 +1,6 @@
+ /* { dg-do preprocess } */
+ /* { dg-require-effective-target ilp32 } */
++/* { dg-skip-if "" { i?86-*-* x86_64-*-* } { "-march=*" } { "-march=i486" } } */
+ /* { dg-options "-march=i486" } */
+
+ #ifndef __GCC_HAVE_SYNC_COMPARE_AND_SWAP_1
+diff -Nur a/gcc/testsuite/gcc.target/i386/isa-10.c b/gcc/testsuite/gcc.target/i386/isa-10.c
+--- a/gcc/testsuite/gcc.target/i386/isa-10.c 2008-03-08 23:33:54.000000000 +0100
++++ b/gcc/testsuite/gcc.target/i386/isa-10.c 2010-01-25 09:50:29.575686558 +0100
+@@ -1,4 +1,5 @@
+ /* { dg-do run } */
++/* { dg-skip-if "" { i?86-*-* x86_64-*-* } { "-march=*" } { "-march=x86-64" } } */
+ /* { dg-options "-march=x86-64 -msse5 -mno-sse4" } */
+
+ extern void abort (void);
+diff -Nur a/gcc/testsuite/gcc.target/i386/isa-6.c b/gcc/testsuite/gcc.target/i386/isa-6.c
+--- a/gcc/testsuite/gcc.target/i386/isa-6.c 2008-02-19 02:21:03.000000000 +0100
++++ b/gcc/testsuite/gcc.target/i386/isa-6.c 2010-01-25 09:50:29.575686558 +0100
+@@ -1,4 +1,5 @@
+ /* { dg-do run } */
++/* { dg-skip-if "" { i?86-*-* x86_64-*-* } { "-march=*" } { "-march=amdfam10" } } */
+ /* { dg-options "-march=amdfam10 -mno-sse4" } */
+
+ extern void abort (void);
+diff -Nur a/gcc/testsuite/gcc.target/i386/isa-7.c b/gcc/testsuite/gcc.target/i386/isa-7.c
+--- a/gcc/testsuite/gcc.target/i386/isa-7.c 2008-02-19 02:21:03.000000000 +0100
++++ b/gcc/testsuite/gcc.target/i386/isa-7.c 2010-01-25 09:50:29.575686558 +0100
+@@ -1,4 +1,5 @@
+ /* { dg-do run } */
++/* { dg-skip-if "" { i?86-*-* x86_64-*-* } { "-march=*" } { "-march=amdfam10" } } */
+ /* { dg-options "-march=amdfam10 -msse5 -mno-sse4" } */
+
+ extern void abort (void);
+diff -Nur a/gcc/testsuite/gcc.target/i386/isa-8.c b/gcc/testsuite/gcc.target/i386/isa-8.c
+--- a/gcc/testsuite/gcc.target/i386/isa-8.c 2008-02-19 02:21:03.000000000 +0100
++++ b/gcc/testsuite/gcc.target/i386/isa-8.c 2010-01-25 09:50:29.575686558 +0100
+@@ -1,4 +1,5 @@
+ /* { dg-do run } */
++/* { dg-skip-if "" { i?86-*-* x86_64-*-* } { "-march=*" } { "-march=amdfam10" } } */
+ /* { dg-options "-march=amdfam10 -msse5 -mno-sse4a" } */
+
+ extern void abort (void);
+diff -Nur a/gcc/testsuite/gcc.target/i386/isa-9.c b/gcc/testsuite/gcc.target/i386/isa-9.c
+--- a/gcc/testsuite/gcc.target/i386/isa-9.c 2008-02-19 02:21:03.000000000 +0100
++++ b/gcc/testsuite/gcc.target/i386/isa-9.c 2010-01-25 09:50:29.575686558 +0100
+@@ -1,4 +1,5 @@
+ /* { dg-do run } */
++/* { dg-skip-if "" { i?86-*-* x86_64-*-* } { "-march=*" } { "-march=amdfam10" } } */
+ /* { dg-options "-march=amdfam10 -mno-sse5" } */
+
+ extern void abort (void);
+diff -Nur a/gcc/testsuite/gcc.target/i386/lea.c b/gcc/testsuite/gcc.target/i386/lea.c
+--- a/gcc/testsuite/gcc.target/i386/lea.c 2007-08-22 11:59:14.000000000 +0200
++++ b/gcc/testsuite/gcc.target/i386/lea.c 2010-01-25 09:50:29.575686558 +0100
+@@ -1,5 +1,6 @@
+ /* { dg-do compile } */
+ /* { dg-require-effective-target ilp32 } */
++/* { dg-skip-if "" { i?86-*-* x86_64-*-* } { "-march=*" } { "-march=pentiumpro" } } */
+ /* { dg-options "-O2 -march=pentiumpro" } */
+ /* { dg-final { scan-assembler "leal" } } */
+ typedef struct {
+diff -Nur a/gcc/testsuite/gcc.target/i386/movbe-1.c b/gcc/testsuite/gcc.target/i386/movbe-1.c
+--- a/gcc/testsuite/gcc.target/i386/movbe-1.c 1970-01-01 01:00:00.000000000 +0100
++++ b/gcc/testsuite/gcc.target/i386/movbe-1.c 2010-01-25 09:50:29.575686558 +0100
+@@ -0,0 +1,18 @@
++/* { dg-do compile } */
++/* { dg-options "-O2 -mmovbe" } */
++
++extern int x;
++
++void
++foo (int i)
++{
++ x = __builtin_bswap32 (i);
++}
++
++int
++bar ()
++{
++ return __builtin_bswap32 (x);
++}
++
++/* { dg-final { scan-assembler-times "movbe\[ \t\]" 2 } } */
+diff -Nur a/gcc/testsuite/gcc.target/i386/movbe-2.c b/gcc/testsuite/gcc.target/i386/movbe-2.c
+--- a/gcc/testsuite/gcc.target/i386/movbe-2.c 1970-01-01 01:00:00.000000000 +0100
++++ b/gcc/testsuite/gcc.target/i386/movbe-2.c 2010-01-25 09:50:29.575686558 +0100
+@@ -0,0 +1,19 @@
++/* { dg-do compile } */
++/* { dg-options "-O2 -mmovbe" } */
++
++extern long long x;
++
++void
++foo (long long i)
++{
++ x = __builtin_bswap64 (i);
++}
++
++long long
++bar ()
++{
++ return __builtin_bswap64 (x);
++}
++
++/* { dg-final { scan-assembler-times "movbe\[ \t\]" 4 { target ilp32 } } } */
++/* { dg-final { scan-assembler-times "movbe\[ \t\]" 2 { target lp64 } } } */
+diff -Nur a/gcc/testsuite/gcc.target/i386/pentium4-not-mull.c b/gcc/testsuite/gcc.target/i386/pentium4-not-mull.c
+--- a/gcc/testsuite/gcc.target/i386/pentium4-not-mull.c 2007-08-22 11:59:14.000000000 +0200
++++ b/gcc/testsuite/gcc.target/i386/pentium4-not-mull.c 2010-01-25 09:50:29.575686558 +0100
+@@ -1,5 +1,6 @@
+ /* { dg-do compile } */
+ /* { dg-require-effective-target ilp32 } */
++/* { dg-skip-if "" { i?86-*-* x86_64-*-* } { "-march=*" } { "-march=pentium4" } } */
+ /* { dg-options "-O2 -march=pentium4" } */
+ /* { dg-final { scan-assembler-not "imull" } } */
+
+diff -Nur a/gcc/testsuite/gcc.target/i386/pr37216.c b/gcc/testsuite/gcc.target/i386/pr37216.c
+--- a/gcc/testsuite/gcc.target/i386/pr37216.c 1970-01-01 01:00:00.000000000 +0100
++++ b/gcc/testsuite/gcc.target/i386/pr37216.c 2010-01-25 09:50:29.575686558 +0100
+@@ -0,0 +1,17 @@
++/* { dg-do run } */
++/* { dg-options "-O3 -msse2" } */
++/* { dg-options "-O3 -msse2 -mpe-aligned-commons" { target pe_aligned_commons } } */
++
++#include "sse2-check.h"
++
++int iarr[64];
++int iint = 0;
++
++void
++sse2_test (void)
++{
++ int i;
++
++ for (i = 0; i < 64; i++)
++ iarr[i] = -2;
++}
+diff -Nur a/gcc/testsuite/gcc.target/i386/pr37843-1.c b/gcc/testsuite/gcc.target/i386/pr37843-1.c
+--- a/gcc/testsuite/gcc.target/i386/pr37843-1.c 2008-11-28 17:30:56.000000000 +0100
++++ b/gcc/testsuite/gcc.target/i386/pr37843-1.c 2010-01-25 09:50:29.575686558 +0100
+@@ -2,8 +2,8 @@
+ /* { dg-do compile { target nonpic } } */
+ /* { dg-options "-O2 -mpreferred-stack-boundary=6 -mincoming-stack-boundary=5" } */
+ /* { dg-final { scan-assembler "and\[lq\]?\[\\t \]*\\$-64,\[\\t \]*%\[re\]?sp" } } */
+-/* { dg-final { scan-assembler "call\[\\t \]*foo" } } */
+-/* { dg-final { scan-assembler-not "jmp\[\\t \]*foo" } } */
++/* { dg-final { scan-assembler "call\[\\t \]*_?foo" } } */
++/* { dg-final { scan-assembler-not "jmp\[\\t \]*_?foo" } } */
+
+ extern int foo (void);
+
+diff -Nur a/gcc/testsuite/gcc.target/i386/pr37843-2.c b/gcc/testsuite/gcc.target/i386/pr37843-2.c
+--- a/gcc/testsuite/gcc.target/i386/pr37843-2.c 2008-11-28 17:30:56.000000000 +0100
++++ b/gcc/testsuite/gcc.target/i386/pr37843-2.c 2010-01-25 09:50:29.575686558 +0100
+@@ -2,8 +2,8 @@
+ /* { dg-do compile { target nonpic } } */
+ /* { dg-options "-O2 -mpreferred-stack-boundary=6 -mincoming-stack-boundary=6" } */
+ /* { dg-final { scan-assembler-not "and\[lq\]?\[\\t \]*\\$-64,\[\\t \]*%\[re\]?sp" } } */
+-/* { dg-final { scan-assembler-not "call\[\\t \]*foo" } } */
+-/* { dg-final { scan-assembler "jmp\[\\t \]*foo" } } */
++/* { dg-final { scan-assembler-not "call\[\\t \]*_?foo" } } */
++/* { dg-final { scan-assembler "jmp\[\\t \]*_?foo" } } */
+
+ extern int foo (void);
+
+diff -Nur a/gcc/testsuite/gcc.target/i386/pr37843-3.c b/gcc/testsuite/gcc.target/i386/pr37843-3.c
+--- a/gcc/testsuite/gcc.target/i386/pr37843-3.c 2009-01-15 16:44:41.000000000 +0100
++++ b/gcc/testsuite/gcc.target/i386/pr37843-3.c 2010-01-25 09:50:29.575686558 +0100
+@@ -2,8 +2,8 @@
+ /* { dg-do compile { target { ilp32 && nonpic } } } */
+ /* { dg-options "-O2 -msse2 -mpreferred-stack-boundary=4 -mstackrealign" } */
+ /* { dg-final { scan-assembler-not "andl\[\\t \]*\\$-16,\[\\t \]*%\[re\]?sp" } } */
+-/* { dg-final { scan-assembler-not "call\[\\t \]*foo" } } */
+-/* { dg-final { scan-assembler "jmp\[\\t \]*foo" } } */
++/* { dg-final { scan-assembler-not "call\[\\t \]*_?foo" } } */
++/* { dg-final { scan-assembler "jmp\[\\t \]*_?foo" } } */
+
+ #include <emmintrin.h>
+
+diff -Nur a/gcc/testsuite/gcc.target/i386/sse-5.c b/gcc/testsuite/gcc.target/i386/sse-5.c
+--- a/gcc/testsuite/gcc.target/i386/sse-5.c 2008-09-09 16:48:15.000000000 +0200
++++ b/gcc/testsuite/gcc.target/i386/sse-5.c 2010-01-25 09:50:29.575686558 +0100
+@@ -1,5 +1,6 @@
+ /* { dg-do compile } */
+ /* { dg-require-effective-target ilp32 } */
++/* { dg-skip-if "" { i?86-*-* x86_64-*-* } { "-march=*" } { "-march=i386" } } */
+ /* { dg-options "-Winline -O2 -march=i386" } */
+
+ typedef double v2df __attribute__ ((vector_size (16)));
+diff -Nur a/gcc/testsuite/gcc.target/i386/ssefn-1.c b/gcc/testsuite/gcc.target/i386/ssefn-1.c
+--- a/gcc/testsuite/gcc.target/i386/ssefn-1.c 2007-08-22 11:59:14.000000000 +0200
++++ b/gcc/testsuite/gcc.target/i386/ssefn-1.c 2010-01-25 09:50:29.575686558 +0100
+@@ -7,6 +7,7 @@
+ /* { dg-final { scan-assembler "mulss" } } */
+ /* { dg-final { scan-assembler-not "movsd" } } */
+ /* { dg-final { scan-assembler-not "mulsd" } } */
++/* { dg-skip-if "" { i?86-*-* x86_64-*-* } { "-march=*" } { "-march=i386" } } */
+ /* { dg-options "-O2 -march=i386 -msse -mfpmath=sse -fno-inline" } */
+
+ static float xs (void)
+diff -Nur a/gcc/testsuite/gcc.target/m68k/20090709-1.c b/gcc/testsuite/gcc.target/m68k/20090709-1.c
+--- a/gcc/testsuite/gcc.target/m68k/20090709-1.c 1970-01-01 01:00:00.000000000 +0100
++++ b/gcc/testsuite/gcc.target/m68k/20090709-1.c 2010-01-25 09:50:29.575686558 +0100
+@@ -0,0 +1,20 @@
++/* { dg-do compile } */
++/* There should be 3 occurrences of .LC0 in the code:
++ one for the definition of "0",
++ one for use in test1() and
++ one for use in test2().
++ FIXME: At the moment m68k GCC does not optimize test1() to nop
++ for some reason. */
++/* { dg-final { scan-assembler-times ".LC0" 3 } } */
++
++void dummy(char *arg);
++
++void test1(void)
++{
++ char tmp[2] = "0";
++}
++
++void test2(void)
++{
++ dummy("0");
++}
+diff -Nur a/gcc/testsuite/gcc.target/m68k/pr36134.c b/gcc/testsuite/gcc.target/m68k/pr36134.c
+--- a/gcc/testsuite/gcc.target/m68k/pr36134.c 2008-11-14 11:49:06.000000000 +0100
++++ b/gcc/testsuite/gcc.target/m68k/pr36134.c 2010-01-25 09:50:29.575686558 +0100
+@@ -1,10 +1,15 @@
+ /* pr36134.c
+
+ This test ensures that the shorter LEA instruction is used in preference
+- to the longer ADD instruction. */
++ to the longer ADD instruction.
++
++ This preference is applicable to ColdFire only. On CPU32, we can
++ use a sequence of two ADDQ instructions, which is faster than the
++ LEA instruction. */
+
+ /* { dg-do compile } */
+-/* { dg-options "-O2" } */
++/* { dg-skip-if "" { *-*-* } { "-mcpu=*" } { "-mcpu=5208" } } */
++/* { dg-options "-O2 -mcpu=5208" } */
+ /* { dg-final { scan-assembler "lea" } } */
+ /* { dg-final { scan-assembler-not "add" } } */
+
+diff -Nur a/gcc/testsuite/gcc.target/m68k/tls-gd.c b/gcc/testsuite/gcc.target/m68k/tls-gd.c
+--- a/gcc/testsuite/gcc.target/m68k/tls-gd.c 1970-01-01 01:00:00.000000000 +0100
++++ b/gcc/testsuite/gcc.target/m68k/tls-gd.c 2010-01-25 09:50:29.575686558 +0100
+@@ -0,0 +1,13 @@
++/* { dg-do compile } */
++/* { dg-skip-if "" { ! *-linux-* } { "*" } { "" } } */
++/* { dg-options "-O2 -fpic" } */
++/* { dg-final { scan-assembler "foo@TLSGD\\(\%a5\\)" } } */
++/* { dg-final { scan-assembler "bsr.l __tls_get_addr@PLTPC" } } */
++
++extern int __thread foo;
++
++int *
++bar (void)
++{
++ return &foo;
++}
+diff -Nur a/gcc/testsuite/gcc.target/m68k/tls-gd-xgot.c b/gcc/testsuite/gcc.target/m68k/tls-gd-xgot.c
+--- a/gcc/testsuite/gcc.target/m68k/tls-gd-xgot.c 1970-01-01 01:00:00.000000000 +0100
++++ b/gcc/testsuite/gcc.target/m68k/tls-gd-xgot.c 2010-01-25 09:50:29.575686558 +0100
+@@ -0,0 +1,13 @@
++/* { dg-do compile } */
++/* { dg-skip-if "" { ! *-linux-* } { "*" } { "" } } */
++/* { dg-options "-O2 -fpic -mxgot" } */
++/* { dg-final { scan-assembler "#foo@TLSGD,\%\[ad\]\[0-7\]" } } */
++/* { dg-final { scan-assembler "bsr.l __tls_get_addr@PLTPC" } } */
++
++extern int __thread foo;
++
++int *
++bar (void)
++{
++ return &foo;
++}
+diff -Nur a/gcc/testsuite/gcc.target/m68k/tls-ie.c b/gcc/testsuite/gcc.target/m68k/tls-ie.c
+--- a/gcc/testsuite/gcc.target/m68k/tls-ie.c 1970-01-01 01:00:00.000000000 +0100
++++ b/gcc/testsuite/gcc.target/m68k/tls-ie.c 2010-01-25 09:50:29.575686558 +0100
+@@ -0,0 +1,13 @@
++/* { dg-do compile } */
++/* { dg-skip-if "" { ! *-linux-* } { "*" } { "" } } */
++/* { dg-options "-O2" } */
++/* { dg-final { scan-assembler "jsr __m68k_read_tp" } } */
++/* { dg-final { scan-assembler "foo@TLSIE\\(\%a5\\)" } } */
++
++extern int __thread foo;
++
++int *
++bar (void)
++{
++ return &foo;
++}
+diff -Nur a/gcc/testsuite/gcc.target/m68k/tls-ie-xgot.c b/gcc/testsuite/gcc.target/m68k/tls-ie-xgot.c
+--- a/gcc/testsuite/gcc.target/m68k/tls-ie-xgot.c 1970-01-01 01:00:00.000000000 +0100
++++ b/gcc/testsuite/gcc.target/m68k/tls-ie-xgot.c 2010-01-25 09:50:29.575686558 +0100
+@@ -0,0 +1,13 @@
++/* { dg-do compile } */
++/* { dg-skip-if "" { ! *-linux-* } { "*" } { "" } } */
++/* { dg-options "-O2 -mxgot" } */
++/* { dg-final { scan-assembler "jsr __m68k_read_tp" } } */
++/* { dg-final { scan-assembler "#foo@TLSIE,\%\[ad\]\[0-7\]" } } */
++
++extern int __thread foo;
++
++int *
++bar (void)
++{
++ return &foo;
++}
+diff -Nur a/gcc/testsuite/gcc.target/m68k/tls-ld.c b/gcc/testsuite/gcc.target/m68k/tls-ld.c
+--- a/gcc/testsuite/gcc.target/m68k/tls-ld.c 1970-01-01 01:00:00.000000000 +0100
++++ b/gcc/testsuite/gcc.target/m68k/tls-ld.c 2010-01-25 09:50:29.575686558 +0100
+@@ -0,0 +1,14 @@
++/* { dg-do compile } */
++/* { dg-skip-if "" { ! *-linux-* } { "*" } { "" } } */
++/* { dg-options "-O2 -fpic" } */
++/* { dg-final { scan-assembler "foo@TLSLDM\\(\%a5\\)" } } */
++/* { dg-final { scan-assembler "bsr.l __tls_get_addr@PLTPC" } } */
++/* { dg-final { scan-assembler "lea \\(foo@TLSLDO,\%a0\\)" } } */
++
++static int __thread foo;
++
++int *
++bar (void)
++{
++ return &foo;
++}
+diff -Nur a/gcc/testsuite/gcc.target/m68k/tls-ld-xgot.c b/gcc/testsuite/gcc.target/m68k/tls-ld-xgot.c
+--- a/gcc/testsuite/gcc.target/m68k/tls-ld-xgot.c 1970-01-01 01:00:00.000000000 +0100
++++ b/gcc/testsuite/gcc.target/m68k/tls-ld-xgot.c 2010-01-25 09:50:29.575686558 +0100
+@@ -0,0 +1,14 @@
++/* { dg-do compile } */
++/* { dg-skip-if "" { ! *-linux-* } { "*" } { "" } } */
++/* { dg-options "-O2 -fpic -mxgot" } */
++/* { dg-final { scan-assembler "#foo@TLSLDM,\%\[ad\]\[0-7\]" } } */
++/* { dg-final { scan-assembler "bsr.l __tls_get_addr@PLTPC" } } */
++/* { dg-final { scan-assembler "lea \\(foo@TLSLDO,\%a0\\)" } } */
++
++static int __thread foo;
++
++int *
++bar (void)
++{
++ return &foo;
++}
+diff -Nur a/gcc/testsuite/gcc.target/m68k/tls-ld-xgot-xtls.c b/gcc/testsuite/gcc.target/m68k/tls-ld-xgot-xtls.c
+--- a/gcc/testsuite/gcc.target/m68k/tls-ld-xgot-xtls.c 1970-01-01 01:00:00.000000000 +0100
++++ b/gcc/testsuite/gcc.target/m68k/tls-ld-xgot-xtls.c 2010-01-25 09:50:29.575686558 +0100
+@@ -0,0 +1,14 @@
++/* { dg-do compile } */
++/* { dg-skip-if "" { ! *-linux-* } { "*" } { "" } } */
++/* { dg-options "-O2 -fpic -mxgot -mxtls" } */
++/* { dg-final { scan-assembler "#foo@TLSLDM,\%\[ad\]\[0-7\]" } } */
++/* { dg-final { scan-assembler "bsr.l __tls_get_addr@PLTPC" } } */
++/* { dg-final { scan-assembler "#foo@TLSLDO,\%\[ad\]\[0-7\]" } } */
++
++static int __thread foo;
++
++int *
++bar (void)
++{
++ return &foo;
++}
+diff -Nur a/gcc/testsuite/gcc.target/m68k/tls-ld-xtls.c b/gcc/testsuite/gcc.target/m68k/tls-ld-xtls.c
+--- a/gcc/testsuite/gcc.target/m68k/tls-ld-xtls.c 1970-01-01 01:00:00.000000000 +0100
++++ b/gcc/testsuite/gcc.target/m68k/tls-ld-xtls.c 2010-01-25 09:50:29.575686558 +0100
+@@ -0,0 +1,14 @@
++/* { dg-do compile } */
++/* { dg-skip-if "" { ! *-linux-* } { "*" } { "" } } */
++/* { dg-options "-O2 -fpic -mxtls" } */
++/* { dg-final { scan-assembler "foo@TLSLDM\\(\%a5\\)" } } */
++/* { dg-final { scan-assembler "bsr.l __tls_get_addr@PLTPC" } } */
++/* { dg-final { scan-assembler "#foo@TLSLDO,\%\[ad\]\[0-7\]" } } */
++
++static int __thread foo;
++
++int *
++bar (void)
++{
++ return &foo;
++}
+diff -Nur a/gcc/testsuite/gcc.target/m68k/tls-le.c b/gcc/testsuite/gcc.target/m68k/tls-le.c
+--- a/gcc/testsuite/gcc.target/m68k/tls-le.c 1970-01-01 01:00:00.000000000 +0100
++++ b/gcc/testsuite/gcc.target/m68k/tls-le.c 2010-01-25 09:50:29.575686558 +0100
+@@ -0,0 +1,13 @@
++/* { dg-do compile } */
++/* { dg-skip-if "" { ! *-linux-* } { "*" } { "" } } */
++/* { dg-options "-O2" } */
++/* { dg-final { scan-assembler "jsr __m68k_read_tp" } } */
++/* { dg-final { scan-assembler "lea \\(foo@TLSLE,\%a0\\)" } } */
++
++static int __thread foo;
++
++int *
++bar (void)
++{
++ return &foo;
++}
+diff -Nur a/gcc/testsuite/gcc.target/m68k/tls-le-xtls.c b/gcc/testsuite/gcc.target/m68k/tls-le-xtls.c
+--- a/gcc/testsuite/gcc.target/m68k/tls-le-xtls.c 1970-01-01 01:00:00.000000000 +0100
++++ b/gcc/testsuite/gcc.target/m68k/tls-le-xtls.c 2010-01-25 09:50:29.575686558 +0100
+@@ -0,0 +1,13 @@
++/* { dg-do compile } */
++/* { dg-skip-if "" { ! *-linux-* } { "*" } { "" } } */
++/* { dg-options "-O2 -mxtls" } */
++/* { dg-final { scan-assembler "jsr __m68k_read_tp" } } */
++/* { dg-final { scan-assembler "#foo@TLSLE,\%\[ad\]\[0-7\]" } } */
++
++static int __thread foo;
++
++int *
++bar (void)
++{
++ return &foo;
++}
+diff -Nur a/gcc/testsuite/gcc.target/mips/branch-2.c b/gcc/testsuite/gcc.target/mips/branch-2.c
+--- a/gcc/testsuite/gcc.target/mips/branch-2.c 1970-01-01 01:00:00.000000000 +0100
++++ b/gcc/testsuite/gcc.target/mips/branch-2.c 2010-01-25 09:50:29.575686558 +0100
+@@ -0,0 +1,44 @@
++/* Check that we correctly expand out-of-range branches */
++/* { dg-do run } */
++/* { dg-options "-O2 -mabi=32 -fPIC" } */
++
++#include <stdlib.h>
++
++/* This is weak so the compiler cannot assume that calls from this TU
++ necessarily arrive here. And hence that $gp may be clobbered in
++ o32 and o64 ABIs. */
++
++void __attribute__ ((weak)) Foo (int i)
++{
++ static int once = 0;
++
++ if (!i && once++)
++ exit (0);
++
++#if (_ABIO32 || _ABIO64)
++ /* Clobber $gp */
++ __asm volatile ("li $gp,0");
++#endif
++}
++
++#define N1(X) (Foo (X))
++#define N2(X) (N1 (X), N1 (X+(1<<0)))
++#define N3(X) (N2 (X), N2 (X+(1<<1)))
++#define N4(X) (N3 (X), N3 (X+(1<<2)))
++#define N5(X) (N4 (X), N4 (X+(1<<3)))
++#define N6(X) (N5 (X), N5 (X+(1<<4)))
++#define N7(X) (N6 (X), N6 (X+(1<<5)))
++#define N8(X) (N7 (X), N7 (X+(1<<6)))
++#define N9(X) (N8 (X), N8 (X+(1<<7)))
++#define N10(X) (N9 (X), N9 (X+(1<<8)))
++#define N11(X) (N10 (X), N10 (X+(1<<9)))
++#define N12(X) (N11 (X), N11 (X+(1<<10)))
++#define N13(X) (N12 (X), N12 (X+(1<<11)))
++#define N14(X) (N13 (X), N13 (X+(1<<12)))
++
++int main (void)
++{
++ while (1)
++ N14 (0);
++ return 0;
++}
+diff -Nur a/gcc/testsuite/gcc.target/mips/clear-cache-2.c b/gcc/testsuite/gcc.target/mips/clear-cache-2.c
+--- a/gcc/testsuite/gcc.target/mips/clear-cache-2.c 2008-12-21 22:47:38.000000000 +0100
++++ b/gcc/testsuite/gcc.target/mips/clear-cache-2.c 2010-01-25 09:50:29.575686558 +0100
+@@ -2,7 +2,8 @@
+ /* { dg-options "-O2 -mips32" } */
+ /* { dg-final { scan-assembler-not "synci" } } */
+ /* { dg-final { scan-assembler-not "jr.hb" } } */
+-/* { dg-final { scan-assembler "_flush_cache" } } */
++/* { dg-final { scan-assembler "mips_sync_icache" { target { *-sde-* } } } } */
++/* { dg-final { scan-assembler "_flush_cache" { target { ! *-sde-* } } } } */
+
+ void f()
+ {
+diff -Nur a/gcc/testsuite/gcc.target/mips/fpr-moves-5.c b/gcc/testsuite/gcc.target/mips/fpr-moves-5.c
+--- a/gcc/testsuite/gcc.target/mips/fpr-moves-5.c 2008-12-21 22:47:38.000000000 +0100
++++ b/gcc/testsuite/gcc.target/mips/fpr-moves-5.c 2010-01-25 09:50:29.575686558 +0100
+@@ -1,4 +1,5 @@
+ /* { dg-options "-mabi=64 -mhard-float -O2 -EL" } */
++/* { dg-require-effective-target mips_newabi_large_long_double } */
+
+ NOMIPS16 void
+ foo (long double d, long double *x)
+diff -Nur a/gcc/testsuite/gcc.target/mips/fpr-moves-6.c b/gcc/testsuite/gcc.target/mips/fpr-moves-6.c
+--- a/gcc/testsuite/gcc.target/mips/fpr-moves-6.c 2008-12-21 22:47:38.000000000 +0100
++++ b/gcc/testsuite/gcc.target/mips/fpr-moves-6.c 2010-01-25 09:50:29.575686558 +0100
+@@ -1,4 +1,5 @@
+ /* { dg-options "-mabi=64 -mhard-float -O2 -EB" } */
++/* { dg-require-effective-target mips_newabi_large_long_double } */
+
+ NOMIPS16 void
+ foo (long double d, long double *x)
+diff -Nur a/gcc/testsuite/gcc.target/mips/mips.exp b/gcc/testsuite/gcc.target/mips/mips.exp
+--- a/gcc/testsuite/gcc.target/mips/mips.exp 2009-02-20 16:20:38.000000000 +0100
++++ b/gcc/testsuite/gcc.target/mips/mips.exp 2010-01-25 09:50:29.575686558 +0100
+@@ -229,6 +229,7 @@
+ gpopt
+ local-sdata
+ long-calls
++ octeon-useun
+ paired-single
+ plt
+ shared
+diff -Nur a/gcc/testsuite/gcc.target/mips/octeon-useun.c b/gcc/testsuite/gcc.target/mips/octeon-useun.c
+--- a/gcc/testsuite/gcc.target/mips/octeon-useun.c 1970-01-01 01:00:00.000000000 +0100
++++ b/gcc/testsuite/gcc.target/mips/octeon-useun.c 2010-01-25 09:50:29.575686558 +0100
+@@ -0,0 +1,16 @@
++/* Check the mov_u[ls][dw] patterns. */
++/* { dg-options "-march=octeon -O2 -mabi=64 -mocteon-useun -meb" } */
++struct __attribute__((packed)) sl { unsigned long x; };
++struct __attribute__((packed)) si { unsigned int x; };
++unsigned long f1 (struct sl *s) { return s[0].x; };
++unsigned int f2 (struct si *s) { return s[1].x; };
++void f3 (struct sl *s, unsigned long x) { s[10].x = x; }
++void f4 (struct si *s, unsigned int x) { s[11].x = x; }
++void f5 (struct sl *s) { s[100].x = 0; }
++void f6 (struct si *s) { s[101].x = 0; }
++/* { dg-final { scan-assembler "\tjr?\t\\\$31\n\tuld\t\\\$2,0\\(\\\$4\\)\n" } } */
++/* { dg-final { scan-assembler "\tulw\t\\\$2,4\\(\\\$4\\)\n" } } */
++/* { dg-final { scan-assembler "\tjr?\t\\\$31\n\tusd\t\\\$5,80\\(\\\$4\\)\n" } } */
++/* { dg-final { scan-assembler "\tjr?\t\\\$31\n\tusw\t\\\$5,44\\(\\\$4\\)\n" } } */
++/* { dg-final { scan-assembler "\tjr?\t\\\$31\n\tusd\t\\\$0,800\\(\\\$4\\)\n" } } */
++/* { dg-final { scan-assembler "\tjr?\t\\\$31\n\tusw\t\\\$0,404\\(\\\$4\\)\n" } } */
+diff -Nur a/gcc/testsuite/gcc.target/powerpc/altivec-consts.c b/gcc/testsuite/gcc.target/powerpc/altivec-consts.c
+--- a/gcc/testsuite/gcc.target/powerpc/altivec-consts.c 2009-01-13 18:52:32.000000000 +0100
++++ b/gcc/testsuite/gcc.target/powerpc/altivec-consts.c 2010-01-25 09:50:29.575686558 +0100
+@@ -1,7 +1,7 @@
+ /* { dg-do run { target { powerpc*-*-* && vmx_hw } } } */
+ /* { dg-do compile { target { powerpc*-*-* && { ! vmx_hw } } } } */
+ /* { dg-require-effective-target powerpc_altivec_ok } */
+-/* { dg-options "-maltivec -mabi=altivec -O2" } */
++/* { dg-options "-maltivec -O2" } */
+
+ /* Check that "easy" AltiVec constants are correctly synthesized. */
+
+diff -Nur a/gcc/testsuite/gcc.target/powerpc/altivec-varargs-1.c b/gcc/testsuite/gcc.target/powerpc/altivec-varargs-1.c
+--- a/gcc/testsuite/gcc.target/powerpc/altivec-varargs-1.c 2009-01-13 18:52:32.000000000 +0100
++++ b/gcc/testsuite/gcc.target/powerpc/altivec-varargs-1.c 2010-01-25 09:50:29.575686558 +0100
+@@ -1,7 +1,7 @@
+ /* { dg-do run { target { powerpc*-*-* && vmx_hw } } } */
+ /* { dg-do compile { target { powerpc*-*-* && { ! vmx_hw } } } } */
+ /* { dg-require-effective-target powerpc_altivec_ok } */
+-/* { dg-options "-maltivec -mabi=altivec -fno-inline" } */
++/* { dg-options "-maltivec -fno-inline" } */
+
+ #include <stdarg.h>
+
+diff -Nur a/gcc/testsuite/gcc.target/sh/20080410-1.c b/gcc/testsuite/gcc.target/sh/20080410-1.c
+--- a/gcc/testsuite/gcc.target/sh/20080410-1.c 2008-09-13 15:26:46.000000000 +0200
++++ b/gcc/testsuite/gcc.target/sh/20080410-1.c 2010-01-25 09:50:29.575686558 +0100
+@@ -1,5 +1,5 @@
+ /* { dg-do compile { target "sh-*-*" } } */
+-/* { dg-options "-O0 -m4 -ml -fira" } */
++/* { dg-options "-O0 -m4 -ml" } */
+ /* { dg-final { scan-assembler-not "add\tr0,r0" } } */
+
+ /* This test checks that chain reloads conflict. I they don't
+diff -Nur a/gcc/testsuite/gcc.target/sh/sh4a-bitmovua.c b/gcc/testsuite/gcc.target/sh/sh4a-bitmovua.c
+--- a/gcc/testsuite/gcc.target/sh/sh4a-bitmovua.c 2007-08-27 10:47:33.000000000 +0200
++++ b/gcc/testsuite/gcc.target/sh/sh4a-bitmovua.c 2010-01-25 09:50:29.575686558 +0100
+@@ -35,15 +35,15 @@
+ }
+
+ /* Aligned. */
+-struct u0 { unsigned long long d : 32; } y0;
++struct u0 { unsigned long long d : 32; } y_0;
+ unsigned long long g0() {
+- return y0.d;
++ return y_0.d;
+ }
+
+ /* Unaligned load. */
+-struct u1 { long long c : 8; unsigned long long d : 32; } y1;
++struct u1 { long long c : 8; unsigned long long d : 32; } y_1;
+ unsigned long long g1() {
+- return y1.d;
++ return y_1.d;
+ }
+
+ /* Unaligned load. */
+diff -Nur a/gcc/testsuite/gcc.target/sh/sh4a-memmovua.c b/gcc/testsuite/gcc.target/sh/sh4a-memmovua.c
+--- a/gcc/testsuite/gcc.target/sh/sh4a-memmovua.c 2007-08-27 10:47:33.000000000 +0200
++++ b/gcc/testsuite/gcc.target/sh/sh4a-memmovua.c 2010-01-25 09:50:29.575686558 +0100
+@@ -5,7 +5,7 @@
+ /* { dg-final { scan-assembler-times "\tmovua\\.l\t(.*)+" 2 } } */
+
+ #ifdef __SH4A__
+-#include <stdlib.h>
++#include <string.h>
+
+ struct s { int i; char a[10], b[10]; } x;
+ int f() {
+diff -Nur a/gcc/testsuite/gcc.target/x86_64/abi/callabi/func-2a.c b/gcc/testsuite/gcc.target/x86_64/abi/callabi/func-2a.c
+--- a/gcc/testsuite/gcc.target/x86_64/abi/callabi/func-2a.c 1970-01-01 01:00:00.000000000 +0100
++++ b/gcc/testsuite/gcc.target/x86_64/abi/callabi/func-2a.c 2010-01-25 09:50:29.575686558 +0100
+@@ -0,0 +1,27 @@
++/* Test for cross x86_64<->w64 abi standard calls. */
++/* { dg-do run { target i?86-*-linux* x86_64-*-linux* } } */
++/* { dg-options "-O2 -mabi=ms -std=gnu99 -ffast-math -fno-builtin" } */
++/* { dg-additional-sources "func-2b.c" } */
++
++extern void __attribute__ ((sysv_abi)) abort (void);
++long double func_cross (long double, double, float, long, int, char);
++
++long double __attribute__ ((sysv_abi))
++func_native (long double a, double b, float c, long d, int e, char f)
++{
++ long double ret;
++ ret = a + (long double) b + (long double) c;
++ ret *= (long double) (d + (long) e);
++ if (f>0)
++ ret += func_native (a,b,c,d,e,-f);
++ return ret;
++}
++
++int __attribute__ ((sysv_abi))
++main ()
++{
++ if (func_cross (1.0,2.0,3.0,1,2,3)
++ != func_native (1.0,2.0,3.0,1,2,3))
++ abort ();
++ return 0;
++}
+diff -Nur a/gcc/testsuite/gcc.target/x86_64/abi/callabi/func-2b.c b/gcc/testsuite/gcc.target/x86_64/abi/callabi/func-2b.c
+--- a/gcc/testsuite/gcc.target/x86_64/abi/callabi/func-2b.c 1970-01-01 01:00:00.000000000 +0100
++++ b/gcc/testsuite/gcc.target/x86_64/abi/callabi/func-2b.c 2010-01-25 09:50:29.575686558 +0100
+@@ -0,0 +1,13 @@
++/* Test for cross x86_64<->w64 abi standard calls. */
++/* { dg-options "-mabi=ms -std=gnu99 -ffast-math -fno-builtin" } */
++
++long double func_cross (long double a, double b, float c, long d, int e,
++ char f)
++{
++ long double ret;
++ ret = a + (long double) b + (long double) c;
++ ret *= (long double) (d + (long) e);
++ if (f>0)
++ ret += func_cross (a,b,c,d,e,-f);
++ return ret;
++}
+diff -Nur a/gcc/testsuite/gcc.target/x86_64/abi/callabi/func-indirect-2a.c b/gcc/testsuite/gcc.target/x86_64/abi/callabi/func-indirect-2a.c
+--- a/gcc/testsuite/gcc.target/x86_64/abi/callabi/func-indirect-2a.c 1970-01-01 01:00:00.000000000 +0100
++++ b/gcc/testsuite/gcc.target/x86_64/abi/callabi/func-indirect-2a.c 2010-01-25 09:50:29.575686558 +0100
+@@ -0,0 +1,17 @@
++/* Test for cross x86_64<->w64 abi standard calls via variable. */
++/* { dg-do run { target i?86-*-linux* x86_64-*-linux* } } */
++/* { dg-options "-O2 -mabi=ms -std=gnu99 -ffast-math -fno-builtin" } */
++/* { dg-additional-sources "func-indirect-2b.c" } */
++
++extern void __attribute__ ((sysv_abi)) abort (void);
++typedef int (*func)(void *, char *, char *, short, long long);
++extern func get_callback (void);
++
++int __attribute__ ((sysv_abi))
++main ()
++{
++ func callme = get_callback ();
++ if (callme (0, 0, 0, 0x1234, 0x1234567890abcdefLL))
++ abort ();
++ return 0;
++}
+diff -Nur a/gcc/testsuite/gcc.target/x86_64/abi/callabi/func-indirect-2b.c b/gcc/testsuite/gcc.target/x86_64/abi/callabi/func-indirect-2b.c
+--- a/gcc/testsuite/gcc.target/x86_64/abi/callabi/func-indirect-2b.c 1970-01-01 01:00:00.000000000 +0100
++++ b/gcc/testsuite/gcc.target/x86_64/abi/callabi/func-indirect-2b.c 2010-01-25 09:50:29.575686558 +0100
+@@ -0,0 +1,24 @@
++/* Test for cross x86_64<->w64 abi standard calls via variable. */
++/* { dg-options "-O2 -mabi=ms -std=gnu99 -ffast-math -fno-builtin" } */
++
++typedef int (*func)(void *, char *, char *, short, long long);
++
++static int
++callback (void *ptr, char *string1, char *string2, short number,
++ long long rand)
++{
++ if (ptr != 0
++ || string1 != 0
++ || string2 != 0
++ || number != 0x1234
++ || rand != 0x1234567890abcdefLL)
++ return 1;
++ else
++ return 0;
++}
++
++func
++get_callback (void)
++{
++ return callback;
++}
+diff -Nur a/gcc/testsuite/gcc.target/x86_64/abi/callabi/vaarg-4a.c b/gcc/testsuite/gcc.target/x86_64/abi/callabi/vaarg-4a.c
+--- a/gcc/testsuite/gcc.target/x86_64/abi/callabi/vaarg-4a.c 1970-01-01 01:00:00.000000000 +0100
++++ b/gcc/testsuite/gcc.target/x86_64/abi/callabi/vaarg-4a.c 2010-01-25 09:50:29.575686558 +0100
+@@ -0,0 +1,24 @@
++/* Test for cross x86_64<->w64 abi va_list calls. */
++/* { dg-do run { target i?86-*-linux* x86_64-*-linux* } } */
++/* { dg-options "-O2 -mabi=ms -std=gnu99 -fno-builtin" } */
++/* { dg-additional-sources "vaarg-4b.c" } */
++
++extern __SIZE_TYPE__ __attribute__ ((sysv_abi)) strlen (const char *);
++extern int __attribute__ ((sysv_abi)) sprintf (char *,const char *, ...);
++extern void __attribute__ ((sysv_abi)) abort (void);
++
++extern void do_cpy (char *, ...);
++
++int __attribute__ ((sysv_abi))
++main ()
++{
++ char s[256];
++
++ do_cpy (s, "1","2","3","4", "5", "6", "7", "");
++
++ if (s[0] != '1' || s[1] !='2' || s[2] != '3' || s[3] != '4'
++ || s[4] != '5' || s[5] != '6' || s[6] != '7' || s[7] != 0)
++ abort ();
++
++ return 0;
++}
+diff -Nur a/gcc/testsuite/gcc.target/x86_64/abi/callabi/vaarg-4b.c b/gcc/testsuite/gcc.target/x86_64/abi/callabi/vaarg-4b.c
+--- a/gcc/testsuite/gcc.target/x86_64/abi/callabi/vaarg-4b.c 1970-01-01 01:00:00.000000000 +0100
++++ b/gcc/testsuite/gcc.target/x86_64/abi/callabi/vaarg-4b.c 2010-01-25 09:50:29.575686558 +0100
+@@ -0,0 +1,31 @@
++/* Test for cross x86_64<->w64 abi va_list calls. */
++/* { dg-options "-O2 -mabi=ms -std=gnu99 -fno-builtin" } */
++
++#include <stdarg.h>
++
++extern __SIZE_TYPE__ __attribute__ ((sysv_abi)) strlen (const char *);
++extern int __attribute__ ((sysv_abi)) sprintf (char *, const char *, ...);
++
++static void
++vdo_cpy (char *s, va_list argp)
++{
++ __SIZE_TYPE__ len;
++ char *r = s;
++ char *e;
++ *r = 0;
++ for (;;) {
++ e = va_arg (argp, char *);
++ if (*e == 0) break;
++ sprintf (r,"%s", e);
++ r += strlen (r);
++ }
++}
++
++void
++do_cpy (char *s, ...)
++{
++ va_list argp;
++ va_start (argp, s);
++ vdo_cpy (s, argp);
++ va_end (argp);
++}
+diff -Nur a/gcc/testsuite/gcc.target/x86_64/abi/callabi/vaarg-5a.c b/gcc/testsuite/gcc.target/x86_64/abi/callabi/vaarg-5a.c
+--- a/gcc/testsuite/gcc.target/x86_64/abi/callabi/vaarg-5a.c 1970-01-01 01:00:00.000000000 +0100
++++ b/gcc/testsuite/gcc.target/x86_64/abi/callabi/vaarg-5a.c 2010-01-25 09:50:29.575686558 +0100
+@@ -0,0 +1,17 @@
++/* Test for cross x86_64<->w64 abi va_list calls. */
++/* { dg-do run { target i?86-*-linux* x86_64-*-linux* } } */
++/* { dg-options "-O2 -mabi=ms -std=gnu99 -fno-builtin" } */
++/* { dg-additional-sources "vaarg-5b.c" } */
++
++extern void __attribute__ ((sysv_abi)) abort (void);
++extern int fct2 (int, ...);
++
++#define SZ_ARGS 1ll,2ll,3ll,4ll,5ll,6ll,7ll,0ll
++
++int __attribute__ ((sysv_abi))
++main()
++{
++ if (fct2 (-1, SZ_ARGS) != 0)
++ abort ();
++ return 0;
++}
+diff -Nur a/gcc/testsuite/gcc.target/x86_64/abi/callabi/vaarg-5b.c b/gcc/testsuite/gcc.target/x86_64/abi/callabi/vaarg-5b.c
+--- a/gcc/testsuite/gcc.target/x86_64/abi/callabi/vaarg-5b.c 1970-01-01 01:00:00.000000000 +0100
++++ b/gcc/testsuite/gcc.target/x86_64/abi/callabi/vaarg-5b.c 2010-01-25 09:50:29.575686558 +0100
+@@ -0,0 +1,37 @@
++/* Test for cross x86_64<->w64 abi va_list calls. */
++/* { dg-options "-O2 -mabi=ms -std=gnu99 -fno-builtin" } */
++
++#include <stdarg.h>
++
++#define SZ_ARGS 1ll,2ll,3ll,4ll,5ll,6ll,7ll,0ll
++
++static int __attribute__ ((sysv_abi))
++fct1 (va_list argp, ...)
++{
++ long long p1,p2;
++ int ret = 1;
++ __builtin_sysv_va_list argp_2;
++
++ __builtin_sysv_va_start (argp_2, argp);
++ do {
++ p1 = va_arg (argp_2, long long);
++ p2 = va_arg (argp, long long);
++ if (p1 != p2)
++ ret = 0;
++ } while (ret && p1 != 0);
++ __builtin_sysv_va_end (argp_2);
++
++ return ret;
++}
++
++int
++fct2 (int dummy, ...)
++{
++ va_list argp;
++ int ret = dummy;
++
++ va_start (argp, dummy);
++ ret += fct1 (argp, SZ_ARGS);
++ va_end (argp);
++ return ret;
++}
+diff -Nur a/gcc/testsuite/g++.dg/abi/mangle-neon.C b/gcc/testsuite/g++.dg/abi/mangle-neon.C
+--- a/gcc/testsuite/g++.dg/abi/mangle-neon.C 2008-08-30 00:19:24.000000000 +0200
++++ b/gcc/testsuite/g++.dg/abi/mangle-neon.C 2010-01-25 09:50:29.575686558 +0100
+@@ -2,7 +2,7 @@
+
+ // { dg-do compile }
+ // { dg-require-effective-target arm_neon_ok }
+-// { dg-options "-mfpu=neon -mfloat-abi=softfp" }
++// { dg-add-options arm_neon }
+
+ #include <arm_neon.h>
+
+diff -Nur a/gcc/testsuite/g++.dg/eh/ref1.C b/gcc/testsuite/g++.dg/eh/ref1.C
+--- a/gcc/testsuite/g++.dg/eh/ref1.C 1970-01-01 01:00:00.000000000 +0100
++++ b/gcc/testsuite/g++.dg/eh/ref1.C 2010-01-25 09:50:29.575686558 +0100
+@@ -0,0 +1,61 @@
++// { dg-do run { xfail { ! arm-*-*eabi } } }
++
++// catching a pointer to class by reference prohibits derived->base
++// transformation. The generic C++ ABI gets this wrong. ARM EABI
++// gets this right, except for exception specifications where a bug is
++// acknowledged.
++
++#include <stdio.h>
++
++struct A {};
++
++struct B : A {};
++
++int Foo ()
++{
++ B b;
++
++ try
++ {
++ throw &b;
++ }
++ catch (A *&a) // { dg-bogus "earlier handler" "" { xfail { ! arm-*-*eabi } } }
++ {
++ printf ("fail, caught A*&%p\n", a);
++ return 1;
++ }
++ catch (B *&b) // { dg-bogus "will be caught" "" { xfail { ! arm-*-*eabi } } }
++ {
++ printf ("pass, caught B*&%p\n", b);
++ }
++ catch (...)
++ {
++ printf ("fail, caught ...");
++ return 2;
++ }
++ try
++ {
++ throw &b;
++ }
++ catch (A *a) // { dg-warning "by earlier handler" }
++ {
++ printf ("pass, caught A*%p\n", a);
++ }
++ catch (B *b) // { dg-warning "will be caught" }
++ {
++ printf ("fail, caught B*%p\n", b);
++ return 3;
++ }
++ catch (...)
++ {
++ printf ("fail, caught ...");
++ return 4;
++ }
++ return 0;
++}
++
++
++int main ()
++{
++ return Foo ();
++}
+diff -Nur a/gcc/testsuite/g++.dg/eh/ref2.C b/gcc/testsuite/g++.dg/eh/ref2.C
+--- a/gcc/testsuite/g++.dg/eh/ref2.C 1970-01-01 01:00:00.000000000 +0100
++++ b/gcc/testsuite/g++.dg/eh/ref2.C 2010-01-25 09:50:29.575686558 +0100
+@@ -0,0 +1,70 @@
++// { dg-do run { xfail { ! arm-*-*eabi } } }
++
++// catching a pointer to class by reference prohibits derived->base
++// transformation. The generic C++ ABI gets this wrong. ARM EABI
++// gets this right, except for exception specifications where a bug is
++// acknowledged.
++
++#include <stdio.h>
++#include <exception>
++#include <stdlib.h>
++
++struct A {};
++
++struct B : A {};
++
++B b;
++
++void One () throw (A *&)
++{
++ throw &b;
++}
++
++void Two () throw (A *&, B *&)
++{
++ throw &b;
++}
++
++void Three () throw (A *)
++{
++ throw &b;
++}
++
++int Foo (void (*fn)())
++{
++ try
++ {
++ fn ();
++ }
++ catch (B *b)
++ {
++ printf ("pass, caught B*%p\n", b);
++ }
++ catch (...)
++ {
++ printf ("fail, caught ...");
++ return 1;
++ }
++ return 0;
++}
++
++void handler ()
++{
++ printf ("pass, got unexpected exception\n");
++ exit (0);
++}
++
++int main ()
++{
++ if (Foo (&Three))
++ return 1;
++
++ if (Foo (&Two))
++ return 2;
++
++ std::set_unexpected (handler);
++ if (Foo (&One))
++ return 3;
++ printf ("fail, did not get unexpected exception\n");
++ return 4;
++}
+diff -Nur a/gcc/testsuite/g++.dg/ext/altivec-17.C b/gcc/testsuite/g++.dg/ext/altivec-17.C
+--- a/gcc/testsuite/g++.dg/ext/altivec-17.C 1970-01-01 01:00:00.000000000 +0100
++++ b/gcc/testsuite/g++.dg/ext/altivec-17.C 2010-01-25 09:50:29.575686558 +0100
+@@ -0,0 +1,16 @@
++// { dg-do compile { target powerpc*-*-* } }
++// { dg-require-effective-target powerpc_altivec_ok }
++// { dg-options "-maltivec" }
++
++// Make sure that bool vectors have distinct names to int vectors
++
++#define vector__ __attribute__((altivec (vector__)))
++#define bool__ __attribute__((altivec(bool__)))
++
++typedef vector__ unsigned int simd_type;
++typedef vector__ bool__ int bool_simd_type;
++
++void Foo (bool_simd_type const &a)
++{
++ simd_type const &v = a; // { dg-error "'const unsigned int __vector__&' from expression of type 'const __bool int __vector__'" }
++}
+diff -Nur a/gcc/testsuite/g++.dg/ext/arm-fp16/arm-fp16-ops-1.C b/gcc/testsuite/g++.dg/ext/arm-fp16/arm-fp16-ops-1.C
+--- a/gcc/testsuite/g++.dg/ext/arm-fp16/arm-fp16-ops-1.C 1970-01-01 01:00:00.000000000 +0100
++++ b/gcc/testsuite/g++.dg/ext/arm-fp16/arm-fp16-ops-1.C 2010-01-25 09:50:29.575686558 +0100
+@@ -0,0 +1,5 @@
++/* Test various operators on __fp16 and mixed __fp16/float operands. */
++/* { dg-do run { target arm*-*-* } } */
++/* { dg-options "-mfp16-format=ieee" } */
++
++#include "arm-fp16-ops.h"
+diff -Nur a/gcc/testsuite/g++.dg/ext/arm-fp16/arm-fp16-ops-2.C b/gcc/testsuite/g++.dg/ext/arm-fp16/arm-fp16-ops-2.C
+--- a/gcc/testsuite/g++.dg/ext/arm-fp16/arm-fp16-ops-2.C 1970-01-01 01:00:00.000000000 +0100
++++ b/gcc/testsuite/g++.dg/ext/arm-fp16/arm-fp16-ops-2.C 2010-01-25 09:50:29.575686558 +0100
+@@ -0,0 +1,5 @@
++/* Test various operators on __fp16 and mixed __fp16/float operands. */
++/* { dg-do run { target arm*-*-* } } */
++/* { dg-options "-mfp16-format=ieee -ffast-math" } */
++
++#include "arm-fp16-ops.h"
+diff -Nur a/gcc/testsuite/g++.dg/ext/arm-fp16/arm-fp16-ops-3.C b/gcc/testsuite/g++.dg/ext/arm-fp16/arm-fp16-ops-3.C
+--- a/gcc/testsuite/g++.dg/ext/arm-fp16/arm-fp16-ops-3.C 1970-01-01 01:00:00.000000000 +0100
++++ b/gcc/testsuite/g++.dg/ext/arm-fp16/arm-fp16-ops-3.C 2010-01-25 09:50:29.575686558 +0100
+@@ -0,0 +1,5 @@
++/* Test various operators on __fp16 and mixed __fp16/float operands. */
++/* { dg-do run { target arm*-*-* } } */
++/* { dg-options "-mfp16-format=alternative" } */
++
++#include "arm-fp16-ops.h"
+diff -Nur a/gcc/testsuite/g++.dg/ext/arm-fp16/arm-fp16-ops-4.C b/gcc/testsuite/g++.dg/ext/arm-fp16/arm-fp16-ops-4.C
+--- a/gcc/testsuite/g++.dg/ext/arm-fp16/arm-fp16-ops-4.C 1970-01-01 01:00:00.000000000 +0100
++++ b/gcc/testsuite/g++.dg/ext/arm-fp16/arm-fp16-ops-4.C 2010-01-25 09:50:29.575686558 +0100
+@@ -0,0 +1,5 @@
++/* Test various operators on __fp16 and mixed __fp16/float operands. */
++/* { dg-do run { target arm*-*-* } } */
++/* { dg-options "-mfp16-format=alternative -ffast-math" } */
++
++#include "arm-fp16-ops.h"
+diff -Nur a/gcc/testsuite/g++.dg/ext/arm-fp16/arm-fp16-ops-5.C b/gcc/testsuite/g++.dg/ext/arm-fp16/arm-fp16-ops-5.C
+--- a/gcc/testsuite/g++.dg/ext/arm-fp16/arm-fp16-ops-5.C 1970-01-01 01:00:00.000000000 +0100
++++ b/gcc/testsuite/g++.dg/ext/arm-fp16/arm-fp16-ops-5.C 2010-01-25 09:50:29.575686558 +0100
+@@ -0,0 +1,15 @@
++/* Test various operators on __fp16 and mixed __fp16/float operands. */
++/* { dg-do compile { target arm*-*-* } } */
++/* { dg-require-effective-target arm_neon_fp16_ok } */
++/* { dg-options "-mfp16-format=ieee" } */
++/* { dg-add-options arm_neon_fp16 } */
++
++#include "arm-fp16-ops.h"
++
++/* We've specified options for hardware float, including fp16 support, so
++ we should not see any calls to libfuncs here. */
++/* { dg-final { scan-assembler-not "\tbl\t__.*hf2" } } */
++/* { dg-final { scan-assembler-not "\tbl\t__.*hf3" } } */
++/* { dg-final { scan-assembler-not "\tbl\t__gnu_h\[a-z\]*_ieee" } } */
++/* { dg-final { scan-assembler-not "\tbl\t__gnu_h2f_ieee" } } */
++/* { dg-final { scan-assembler-not "\tbl\t__gnu_f2h_ieee" } } */
+diff -Nur a/gcc/testsuite/g++.dg/ext/arm-fp16/arm-fp16-ops-6.C b/gcc/testsuite/g++.dg/ext/arm-fp16/arm-fp16-ops-6.C
+--- a/gcc/testsuite/g++.dg/ext/arm-fp16/arm-fp16-ops-6.C 1970-01-01 01:00:00.000000000 +0100
++++ b/gcc/testsuite/g++.dg/ext/arm-fp16/arm-fp16-ops-6.C 2010-01-25 09:50:29.575686558 +0100
+@@ -0,0 +1,15 @@
++/* Test various operators on __fp16 and mixed __fp16/float operands. */
++/* { dg-do compile { target arm*-*-* } } */
++/* { dg-require-effective-target arm_neon_fp16_ok } */
++/* { dg-options "-mfp16-format=ieee -ffast-math" } */
++/* { dg-add-options arm_neon_fp16 } */
++
++#include "arm-fp16-ops.h"
++
++/* We've specified options for hardware float, including fp16 support, so
++ we should not see any calls to libfuncs here. */
++/* { dg-final { scan-assembler-not "\tbl\t__.*hf2" } } */
++/* { dg-final { scan-assembler-not "\tbl\t__.*hf3" } } */
++/* { dg-final { scan-assembler-not "\tbl\t__gnu_h\[a-z\]*_ieee" } } */
++/* { dg-final { scan-assembler-not "\tbl\t__gnu_h2f_ieee" } } */
++/* { dg-final { scan-assembler-not "\tbl\t__gnu_f2h_ieee" } } */
+diff -Nur a/gcc/testsuite/g++.dg/ext/arm-fp16/arm-fp16-ops-7.C b/gcc/testsuite/g++.dg/ext/arm-fp16/arm-fp16-ops-7.C
+--- a/gcc/testsuite/g++.dg/ext/arm-fp16/arm-fp16-ops-7.C 1970-01-01 01:00:00.000000000 +0100
++++ b/gcc/testsuite/g++.dg/ext/arm-fp16/arm-fp16-ops-7.C 2010-01-25 09:50:29.575686558 +0100
+@@ -0,0 +1,13 @@
++/* Test various operators on __fp16 and mixed __fp16/float operands. */
++/* { dg-do compile { target arm*-*-* } } */
++/* { dg-require-effective-target arm_neon_ok } */
++/* { dg-options "-mfp16-format=ieee" } */
++/* { dg-add-options arm_neon } */
++
++#include "arm-fp16-ops.h"
++
++/* We've specified options for hardware float, so we should not see any
++ calls to libfuncs here except for those to the conversion functions. */
++/* { dg-final { scan-assembler-not "\tbl\t__.*hf2" } } */
++/* { dg-final { scan-assembler-not "\tbl\t__.*hf3" } } */
++/* { dg-final { scan-assembler-not "\tbl\t__gnu_h\[a-z\]*_ieee" } } */
+diff -Nur a/gcc/testsuite/g++.dg/ext/arm-fp16/arm-fp16-ops-8.C b/gcc/testsuite/g++.dg/ext/arm-fp16/arm-fp16-ops-8.C
+--- a/gcc/testsuite/g++.dg/ext/arm-fp16/arm-fp16-ops-8.C 1970-01-01 01:00:00.000000000 +0100
++++ b/gcc/testsuite/g++.dg/ext/arm-fp16/arm-fp16-ops-8.C 2010-01-25 09:50:29.575686558 +0100
+@@ -0,0 +1,13 @@
++/* Test various operators on __fp16 and mixed __fp16/float operands. */
++/* { dg-do compile { target arm*-*-* } } */
++/* { dg-require-effective-target arm_neon_ok } */
++/* { dg-options "-mfp16-format=ieee -ffast-math" } */
++/* { dg-add-options arm_neon } */
++
++#include "arm-fp16-ops.h"
++
++/* We've specified options for hardware float, so we should not see any
++ calls to libfuncs here except for those to the conversion functions. */
++/* { dg-final { scan-assembler-not "\tbl\t__.*hf2" } } */
++/* { dg-final { scan-assembler-not "\tbl\t__.*hf3" } } */
++/* { dg-final { scan-assembler-not "\tbl\t__gnu_h\[a-z\]*_ieee" } } */
+diff -Nur a/gcc/testsuite/g++.dg/ext/arm-fp16/arm-fp16-ops.h b/gcc/testsuite/g++.dg/ext/arm-fp16/arm-fp16-ops.h
+--- a/gcc/testsuite/g++.dg/ext/arm-fp16/arm-fp16-ops.h 1970-01-01 01:00:00.000000000 +0100
++++ b/gcc/testsuite/g++.dg/ext/arm-fp16/arm-fp16-ops.h 2010-01-25 09:50:29.575686558 +0100
+@@ -0,0 +1,135 @@
++/* Test various operators on __fp16 and mixed __fp16/float operands. */
++
++#include <assert.h>
++
++#define CHECK(e,r) assert ((e) == r)
++#define CHECK2(e,r) (assert ((e) == r), temp = (e), assert (temp == r))
++#define TEST(e) assert (e)
++#define TESTNOT(e) assert (!(e))
++
++volatile __fp16 h0 = 0.0;
++volatile __fp16 h1 = 1.0;
++volatile __fp16 h42 = 42.0;
++volatile __fp16 hm2 = -2.0;
++volatile __fp16 temp;
++
++volatile float f0 = 0.0;
++volatile float f1 = 1.0;
++volatile float f42 = 42.0;
++volatile float fm2 = -2.0;
++
++int main (void)
++{
++ TEST (h1);
++ TESTNOT (h0);
++ TEST (!h0);
++ TESTNOT (!h1);
++
++ CHECK2 (-h1, -1.0);
++ CHECK2 (+h1, 1.0);
++
++ CHECK (h1++, 1.0);
++ CHECK (h1, 2.0);
++ CHECK (++h1, 3.0);
++ CHECK (h1, 3.0);
++
++ CHECK (--h1, 2.0);
++ CHECK (h1, 2.0);
++ CHECK (h1--, 2.0);
++ CHECK (h1, 1.0);
++
++ CHECK2 (h42 * hm2, -84.0);
++ CHECK2 (h42 * (__fp16) -2.0, -84.0);
++ CHECK2 (h42 * fm2, -84.0);
++ CHECK2 (f42 * hm2, -84.0);
++
++ CHECK2 (h42 / hm2, -21.0);
++ CHECK2 (h42 / (__fp16) -2.0, -21.0);
++ CHECK2 (h42 / fm2, -21.0);
++ CHECK2 (f42 / hm2, -21.0);
++
++ CHECK2 (hm2 + h42, 40.0);
++ CHECK2 ((__fp16)-2.0 + h42, 40.0);
++ CHECK2 (hm2 + f42, 40.0);
++ CHECK2 (fm2 + h42, 40.0);
++
++ CHECK2 (hm2 - h42, -44.0);
++ CHECK2 ((__fp16)-2.0 - h42, -44.0);
++ CHECK2 (hm2 - f42, -44.0);
++ CHECK2 (fm2 - h42, -44.0);
++
++ TEST (hm2 < h42);
++ TEST (hm2 < (__fp16)42.0);
++ TEST (hm2 < f42);
++ TEST (fm2 < h42);
++
++ TEST (h42 > hm2);
++ TEST ((__fp16)42.0 > hm2);
++ TEST (h42 > fm2);
++ TEST (f42 > hm2);
++
++ TEST (hm2 <= h42);
++ TEST (hm2 <= (__fp16)42.0);
++ TEST (hm2 <= f42);
++ TEST (fm2 <= h42);
++
++ TEST (h42 >= hm2);
++ TEST (h42 >= (__fp16)-2.0);
++ TEST (h42 >= fm2);
++ TEST (f42 >= hm2);
++
++ TESTNOT (h1 == hm2);
++ TEST (h1 == h1);
++ TEST (h1 == (__fp16)1.0);
++ TEST (h1 == f1);
++ TEST (f1 == h1);
++
++ TEST (h1 != hm2);
++ TESTNOT (h1 != h1);
++ TESTNOT (h1 != (__fp16)1.0);
++ TESTNOT (h1 != f1);
++ TESTNOT (f1 != h1);
++
++ CHECK2 ((h1 ? hm2 : h42), -2.0);
++ CHECK2 ((h0 ? hm2 : h42), 42.0);
++
++ CHECK (h0 = h42, 42.0);
++ CHECK (h0, 42.0);
++ CHECK (h0 = (__fp16)-2.0, -2.0);
++ CHECK (h0, -2.0);
++ CHECK (h0 = f0, 0.0);
++ CHECK (h0, 0.0);
++
++ CHECK (h0 += h1, 1.0);
++ CHECK (h0, 1.0);
++ CHECK (h0 += (__fp16)1.0, 2.0);
++ CHECK (h0, 2.0);
++ CHECK (h0 += fm2, 0.0);
++ CHECK (h0, 0.0);
++
++ CHECK (h0 -= h1, -1.0);
++ CHECK (h0, -1.0);
++ CHECK (h0 -= (__fp16)1.0, -2.0);
++ CHECK (h0, -2.0);
++ CHECK (h0 -= fm2, 0.0);
++ CHECK (h0, 0.0);
++
++ h0 = hm2;
++ CHECK (h0 *= hm2, 4.0);
++ CHECK (h0, 4.0);
++ CHECK (h0 *= (__fp16)-2.0, -8.0);
++ CHECK (h0, -8.0);
++ CHECK (h0 *= fm2, 16.0);
++ CHECK (h0, 16.0);
++
++ CHECK (h0 /= hm2, -8.0);
++ CHECK (h0, -8.0);
++ CHECK (h0 /= (__fp16)-2.0, 4.0);
++ CHECK (h0, 4.0);
++ CHECK (h0 /= fm2, -2.0);
++ CHECK (h0, -2.0);
++
++ CHECK ((h0, h1), 1.0);
++
++ return 0;
++}
+diff -Nur a/gcc/testsuite/g++.dg/ext/arm-fp16/fp16-mangle-1.C b/gcc/testsuite/g++.dg/ext/arm-fp16/fp16-mangle-1.C
+--- a/gcc/testsuite/g++.dg/ext/arm-fp16/fp16-mangle-1.C 1970-01-01 01:00:00.000000000 +0100
++++ b/gcc/testsuite/g++.dg/ext/arm-fp16/fp16-mangle-1.C 2010-01-25 09:50:29.575686558 +0100
+@@ -0,0 +1,14 @@
++/* { dg-do compile { target arm*-*-* } } */
++/* { dg-options "-mfp16-format=ieee" } */
++
++/* Test mangling */
++
++/* { dg-final { scan-assembler "\t.global\t_Z1fPDh" } } */
++void f (__fp16 *x) { }
++
++/* { dg-final { scan-assembler "\t.global\t_Z1gPDhS_" } } */
++void g (__fp16 *x, __fp16 *y) { }
++
++/* { dg-final { scan-assembler "\t.global\t_ZN1SIDhDhE1iE" } } */
++template <typename T, typename U> struct S { static int i; };
++template <> int S<__fp16, __fp16>::i = 3;
+diff -Nur a/gcc/testsuite/g++.dg/ext/arm-fp16/fp16-overload-1.C b/gcc/testsuite/g++.dg/ext/arm-fp16/fp16-overload-1.C
+--- a/gcc/testsuite/g++.dg/ext/arm-fp16/fp16-overload-1.C 1970-01-01 01:00:00.000000000 +0100
++++ b/gcc/testsuite/g++.dg/ext/arm-fp16/fp16-overload-1.C 2010-01-25 09:50:29.575686558 +0100
+@@ -0,0 +1,16 @@
++/* { dg-do compile { target arm*-*-* } } */
++/* { dg-options "-mfp16-format=ieee" } */
++
++/* __fp16 values are autoconverted to float and should therefore be treated
++ * just like float for overloading purposes. */
++
++extern int frobnify (float x);
++extern int frobnify (double x);
++
++int g (void)
++{
++ return frobnify ((__fp16)1.0);
++}
++
++/* { dg-final { scan-assembler "_Z8frobnifyf" } } */
++/* { dg-final { scan-assembler-not " _Z8frobnifyd" } } */
+diff -Nur a/gcc/testsuite/g++.dg/ext/arm-fp16/fp16-param-1.C b/gcc/testsuite/g++.dg/ext/arm-fp16/fp16-param-1.C
+--- a/gcc/testsuite/g++.dg/ext/arm-fp16/fp16-param-1.C 1970-01-01 01:00:00.000000000 +0100
++++ b/gcc/testsuite/g++.dg/ext/arm-fp16/fp16-param-1.C 2010-01-25 09:50:29.575686558 +0100
+@@ -0,0 +1,10 @@
++/* { dg-do compile { target arm*-*-* } } */
++/* { dg-options "-mfp16-format=ieee" } */
++
++/* Functions cannot have parameters of type __fp16. */
++extern void f (__fp16); /* { dg-error "parameters cannot have __fp16 type" } */
++extern void (*pf) (__fp16); /* { dg-error "parameters cannot have __fp16 type" } */
++
++/* These should be OK. */
++extern void g (__fp16 *);
++extern void (*pg) (__fp16 *);
+diff -Nur a/gcc/testsuite/g++.dg/ext/arm-fp16/fp16-return-1.C b/gcc/testsuite/g++.dg/ext/arm-fp16/fp16-return-1.C
+--- a/gcc/testsuite/g++.dg/ext/arm-fp16/fp16-return-1.C 1970-01-01 01:00:00.000000000 +0100
++++ b/gcc/testsuite/g++.dg/ext/arm-fp16/fp16-return-1.C 2010-01-25 09:50:29.575686558 +0100
+@@ -0,0 +1,10 @@
++/* { dg-do compile { target arm*-*-* } } */
++/* { dg-options "-mfp16-format=ieee" } */
++
++/* Functions cannot return type __fp16. */
++extern __fp16 f (void); /* { dg-error "cannot return __fp16" } */
++extern __fp16 (*pf) (void); /* { dg-error "cannot return __fp16" } */
++
++/* These should be OK. */
++extern __fp16 *g (void);
++extern __fp16 *(*pg) (void);
+diff -Nur a/gcc/testsuite/g++.dg/ext/dllexport2a.cc b/gcc/testsuite/g++.dg/ext/dllexport2a.cc
+--- a/gcc/testsuite/g++.dg/ext/dllexport2a.cc 1970-01-01 01:00:00.000000000 +0100
++++ b/gcc/testsuite/g++.dg/ext/dllexport2a.cc 2010-01-25 09:50:29.575686558 +0100
+@@ -0,0 +1,21 @@
++extern void i1();
++extern void i3();
++extern void i4();
++extern void i5();
++
++extern void e1();
++extern void e3();
++extern void e4();
++extern void e5();
++
++int main () {
++ i1();
++ i3();
++ i4();
++ i5();
++
++ e1();
++ e3();
++ e4();
++ e5();
++}
+diff -Nur a/gcc/testsuite/g++.dg/ext/dllexport2.C b/gcc/testsuite/g++.dg/ext/dllexport2.C
+--- a/gcc/testsuite/g++.dg/ext/dllexport2.C 1970-01-01 01:00:00.000000000 +0100
++++ b/gcc/testsuite/g++.dg/ext/dllexport2.C 2010-01-25 09:50:29.575686558 +0100
+@@ -0,0 +1,52 @@
++// { dg-do link }
++// { dg-require-dll "" }
++// { dg-additional-sources "dllexport2a.cc" }
++// { dg-options "-O2" }
++
++/* Test that inline functions declared "dllexport" appear in object
++ files, even if they are not called.
++
++ This behavior is required by the ARM C++ ABI:
++
++ Exporting a function that can be inlined should force the
++ creation and export of an out-of-line copy of it.
++
++ and should presumably also apply.
++
++ Visual Studio 2005 also honors that rule. */
++
++__declspec(dllexport) inline void i1() {}
++
++__declspec(dllexport) extern inline void e1() {}
++
++/* It is invalid to declare the function inline after its definition. */
++#if 0
++__declspec(dllexport) void i2() {}
++inline void i2();
++
++__declspec(dllexport) extern void e2() {}
++inline void e2();
++#endif
++
++__declspec(dllexport) inline void i3() {}
++void i3();
++
++__declspec(dllexport) inline void e3() {}
++extern void e3();
++
++__declspec(dllexport) void i4();
++inline void i4() {};
++
++__declspec(dllexport) extern void e4();
++inline void e4() {};
++
++__declspec(dllexport) inline void i5();
++void i5() {};
++
++__declspec(dllexport) inline void e5();
++extern void e5() {};
++
++/* Make sure that just declaring the function -- without defining it
++ -- does not cause errors. */
++__declspec(dllexport) inline void i6();
++__declspec(dllexport) extern inline void e6();
+diff -Nur a/gcc/testsuite/g++.dg/ext/ms-1.C b/gcc/testsuite/g++.dg/ext/ms-1.C
+--- a/gcc/testsuite/g++.dg/ext/ms-1.C 1970-01-01 01:00:00.000000000 +0100
++++ b/gcc/testsuite/g++.dg/ext/ms-1.C 2010-01-25 09:50:29.575686558 +0100
+@@ -0,0 +1,17 @@
++
++// MS allows more things to be pointers to member functions
++// { dg-options "-fms-extensions" }
++
++struct X
++{
++ void Foo (X *);
++ void Bar ();
++};
++
++void Quux (void (X::*) ());
++
++void X::Foo (X *ptr) // { dg-message "candidates" }
++{
++ Quux (Foo); // { dg-error "no matches" }
++ Quux (Bar);
++}
+diff -Nur a/gcc/testsuite/g++.dg/init/ref15.C b/gcc/testsuite/g++.dg/init/ref15.C
+--- a/gcc/testsuite/g++.dg/init/ref15.C 2007-10-04 19:58:07.000000000 +0200
++++ b/gcc/testsuite/g++.dg/init/ref15.C 2010-01-25 09:50:29.575686558 +0100
+@@ -1,6 +1,8 @@
+ // PR c++/20416. We correctly constructed the temporary S in foo(),
+ // but incorrectly destroyed it every time foo() was called.
+-// { dg-do run }
++// When using a wrapped target, there is no way to override the exit
++// code after returning from main.
++// { dg-do run { target unwrapped } }
+ extern "C" void abort (void);
+ extern "C" void _exit (int);
+
+diff -Nur a/gcc/testsuite/g++.dg/opt/alias5.C b/gcc/testsuite/g++.dg/opt/alias5.C
+--- a/gcc/testsuite/g++.dg/opt/alias5.C 1970-01-01 01:00:00.000000000 +0100
++++ b/gcc/testsuite/g++.dg/opt/alias5.C 2010-01-25 09:50:29.575686558 +0100
+@@ -0,0 +1,24 @@
++// { dg-options "-O2" }
++// ICE in struct-alias
++
++typedef int (*PFN)(void);
++int f (void);
++struct Container
++{
++ PFN ptr;
++};
++
++inline PFN Get (struct Container *tpl)
++{
++ return tpl->ptr;
++}
++void Other (PFN);
++
++inline void Foo (PFN pfn)
++{
++ Other (Get ((struct Container *)&pfn));
++}
++void Bar (void)
++{
++ Foo (f);
++}
+diff -Nur a/gcc/testsuite/g++.dg/other/arm-neon-1.C b/gcc/testsuite/g++.dg/other/arm-neon-1.C
+--- a/gcc/testsuite/g++.dg/other/arm-neon-1.C 1970-01-01 01:00:00.000000000 +0100
++++ b/gcc/testsuite/g++.dg/other/arm-neon-1.C 2010-01-25 09:50:29.585686502 +0100
+@@ -0,0 +1,18 @@
++/* Basic smoke test for arm_neon.h */
++
++/* { dg-do assemble } */
++/* { dg-require-effective-target arm_neon_ok } */
++/* { dg-add-options arm_neon } */
++
++#include "arm_neon.h"
++
++float a[4];
++
++void test(void)
++{
++ float32x2x2_t v;
++ float32x2_t res;
++ v = vld2_f32(a);
++ res = vadd_f32(v.val[0], v.val[1]);
++ vst1_f32(a, res);
++}
+diff -Nur a/gcc/testsuite/g++.dg/other/armv7m-1.C b/gcc/testsuite/g++.dg/other/armv7m-1.C
+--- a/gcc/testsuite/g++.dg/other/armv7m-1.C 1970-01-01 01:00:00.000000000 +0100
++++ b/gcc/testsuite/g++.dg/other/armv7m-1.C 2010-01-25 09:50:29.585686502 +0100
+@@ -0,0 +1,69 @@
++/* { dg-do run { target arm*-*-* } } */
++/* Test Armv7m interrupt routines. */
++#include <stdlib.h>
++
++#ifdef __ARM_ARCH_7M__
++void __attribute__((interrupt))
++foo(void)
++{
++ long long n;
++ long p;
++ asm volatile ("" : "=r" (p) : "0" (&n));
++ if (p & 4)
++ abort ();
++ return;
++}
++
++void __attribute__((interrupt))
++bar(void)
++{
++ throw 42;
++}
++
++int main()
++{
++ int a;
++ int before;
++ int after;
++ volatile register int sp asm("sp");
++
++ asm volatile ("mov %0, sp\n"
++ "blx %2\n"
++ "mov %1, sp\n"
++ : "=&r" (before), "=r" (after) : "r" (foo)
++ : "memory", "cc", "r0", "r1", "r2", "r3", "ip", "lr");
++ if (before != after)
++ abort();
++ asm volatile ("mov %0, sp\n"
++ "sub sp, sp, #4\n"
++ "blx %2\n"
++ "add sp, sp, #4\n"
++ "mov %1, sp\n"
++ : "=&r" (before), "=r" (after) : "r" (foo)
++ : "memory", "cc", "r0", "r1", "r2", "r3", "ip", "lr");
++ if (before != after)
++ abort();
++ before = sp;
++ try
++ {
++ bar();
++ }
++ catch (int i)
++ {
++ if (i != 42)
++ abort();
++ }
++ catch (...)
++ {
++ abort();
++ }
++ if (before != sp)
++ abort();
++ exit(0);
++}
++#else
++int main()
++{
++ exit (0);
++}
++#endif
+diff -Nur a/gcc/testsuite/g++.dg/remove-local-statics-1.C b/gcc/testsuite/g++.dg/remove-local-statics-1.C
+--- a/gcc/testsuite/g++.dg/remove-local-statics-1.C 1970-01-01 01:00:00.000000000 +0100
++++ b/gcc/testsuite/g++.dg/remove-local-statics-1.C 2010-01-25 09:50:29.585686502 +0100
+@@ -0,0 +1,21 @@
++/* Verify that we do not eliminate a static variable in
++ main::Local::Foo. */
++
++/* { dg-do compile } */
++/* { dg-options "-O2 -fremove-local-statics" } */
++/* { dg-final { scan-assembler "thestatic" } } */
++
++int
++main (void)
++{
++ static int thestatic = 0;
++ struct Local {
++ __attribute__((__noinline__))
++ static void Foo () { thestatic = 1; }
++ };
++
++ thestatic = 2;
++ Local::Foo();
++
++ return thestatic++;
++}
+diff -Nur a/gcc/testsuite/g++.dg/remove-local-statics-2.C b/gcc/testsuite/g++.dg/remove-local-statics-2.C
+--- a/gcc/testsuite/g++.dg/remove-local-statics-2.C 1970-01-01 01:00:00.000000000 +0100
++++ b/gcc/testsuite/g++.dg/remove-local-statics-2.C 2010-01-25 09:50:29.585686502 +0100
+@@ -0,0 +1,21 @@
++/* Verify that we do not eliminate a static variable in
++ main due to its use in Local::Foo. */
++
++/* { dg-do compile } */
++/* { dg-options "-O2 -fremove-local-statics" } */
++/* { dg-final { scan-assembler "thestatic" } } */
++
++int
++main (void)
++{
++ static int thestatic = 0;
++ struct Local {
++ __attribute__((__noinline__))
++ static int Foo () { return thestatic; }
++ };
++
++ thestatic = 2;
++ thestatic = Local::Foo();
++
++ return thestatic++;
++}
+diff -Nur a/gcc/testsuite/g++.dg/template/overload9.C b/gcc/testsuite/g++.dg/template/overload9.C
+--- a/gcc/testsuite/g++.dg/template/overload9.C 2008-09-19 00:29:39.000000000 +0200
++++ b/gcc/testsuite/g++.dg/template/overload9.C 2010-01-25 09:50:29.585686502 +0100
+@@ -7,12 +7,12 @@
+ template <typename T>
+ struct A
+ {
+- A<T>& operator<<(A<T>& (*)(A<T>&)); // { dg-message "candidate" }
++ A<T>& operator<<(A<T>& (*)(A<T>&));
+ };
+
+ template <typename T> A<T>& foo(A<T>&);
+ extern A<char> c;
+
+ int main () {
+- c << (1, foo); // { dg-error "no match" }
++ c << (1, foo); // { dg-error "no context" }
+ }
+diff -Nur a/gcc/testsuite/g++.dg/torture/pr36191.C b/gcc/testsuite/g++.dg/torture/pr36191.C
+--- a/gcc/testsuite/g++.dg/torture/pr36191.C 2008-12-29 19:25:19.000000000 +0100
++++ b/gcc/testsuite/g++.dg/torture/pr36191.C 2010-01-25 09:50:29.585686502 +0100
+@@ -1,6 +1,7 @@
+ // PR c++/36191
+ // { dg-do compile }
+ // { dg-options "-fnon-call-exceptions" }
++// { dg-skip-if "Frame pointer required for unwind tables" { sh*-*-* } "-fomit-frame-pointer" "" }
+
+ __complex__ double
+ foo (__complex__ double x, double y)
+diff -Nur a/gcc/testsuite/g++.dg/tree-ssa/sink-1.C b/gcc/testsuite/g++.dg/tree-ssa/sink-1.C
+--- a/gcc/testsuite/g++.dg/tree-ssa/sink-1.C 1970-01-01 01:00:00.000000000 +0100
++++ b/gcc/testsuite/g++.dg/tree-ssa/sink-1.C 2010-01-25 09:50:29.585686502 +0100
+@@ -0,0 +1,50 @@
++/* { dg-do run } */
++/* { dg-options "-O1" } */
++
++class A {
++ public:
++ A() {}
++ virtual ~A() {}
++ void * dostuff();
++
++ virtual int dovirtual() = 0;
++};
++
++
++class B : public A {
++ public:
++ B() {}
++ int dovirtual() { return 0;}
++ virtual ~B() {};
++};
++
++class C : public B {
++ public:
++ C() {}
++ virtual ~C() {};
++};
++
++void* A::dostuff()
++{
++ return (void*)dovirtual();
++}
++
++/* tree-ssa-sink was sinking the inlined destructor for STUFF out of
++ the first inner block and into the second one, where it was ending up
++ after the inlined constructor for STUFF2. This is bad because
++ cfgexpand aliases STUFF and STUFF2 to the same storage at -O1
++ (i.e., without -fstrict-aliasing), with the result that STUFF2's
++ vtable was getting trashed. */
++
++int main() {
++ {
++ B stuff;
++ stuff.dostuff();
++ }
++ {
++ C stuff2;
++ stuff2.dostuff();
++ }
++ return 0;
++}
++
+diff -Nur a/gcc/testsuite/g++.dg/vect/vect.exp b/gcc/testsuite/g++.dg/vect/vect.exp
+--- a/gcc/testsuite/g++.dg/vect/vect.exp 2009-02-20 16:20:38.000000000 +0100
++++ b/gcc/testsuite/g++.dg/vect/vect.exp 2010-01-25 09:50:29.585686502 +0100
+@@ -105,7 +105,7 @@
+ } elseif [istarget "ia64-*-*"] {
+ set dg-do-what-default run
+ } elseif [is-effective-target arm_neon_ok] {
+- lappend DEFAULT_VECTCFLAGS "-mfpu=neon" "-mfloat-abi=softfp"
++ eval lappend DEFAULT_VECTCFLAGS [add_options_for_arm_neon ""]
+ if [is-effective-target arm_neon_hw] {
+ set dg-do-what-default run
+ } else {
+diff -Nur a/gcc/testsuite/g++.dg/warn/null4.C b/gcc/testsuite/g++.dg/warn/null4.C
+--- a/gcc/testsuite/g++.dg/warn/null4.C 2007-01-30 23:29:11.000000000 +0100
++++ b/gcc/testsuite/g++.dg/warn/null4.C 2010-01-25 09:50:29.585686502 +0100
+@@ -11,9 +11,22 @@
+ if (NULL < NULL) return -1; // { dg-warning "NULL used in arithmetic" }
+ if (NULL >= 0) return -1; // { dg-warning "NULL used in arithmetic" }
+ if (NULL <= 0) return -1; // { dg-warning "NULL used in arithmetic" }
++ // Adding to the NULL pointer, which has no specific type, should
++ // result in a warning; the type of the resulting expression is
++ // actually "int", not a pointer type.
++ if (NULL + 1) return -1; // { dg-warning "NULL used in arithmetic" }
++ if (1 + NULL) return -1; // { dg-warning "NULL used in arithmetic" }
+ return 0;
+ }
+
++int *ip;
++
++struct S {};
++typedef int S::*SPD;
++typedef void (S::*SPF)(void);
++SPD spd;
++SPF spf;
++
+ int bar (void)
+ {
+ if (NULL) return -1;
+@@ -25,5 +38,18 @@
+ if (NULL != NULL) return -1;
+ if (NULL == 0) return -1;
+ if (NULL != 0) return -1;
++ // Subtraction of pointers is vaild, so using NULL is OK.
++ if (ip - NULL) return -1;
++ if (NULL - NULL) return -1;
++ // Comparing NULL with a pointer-to-member is OK.
++ if (NULL == spd) return -1;
++ if (spd == NULL) return -1;
++ if (NULL != spd) return -1;
++ if (spd != NULL) return -1;
++ if (NULL == spf) return -1;
++ if (spf == NULL) return -1;
++ if (NULL != spf) return -1;
++ if (spf != NULL) return -1;
++
+ return 0;
+ }
+diff -Nur a/gcc/testsuite/gfortran.dg/vect/vect.exp b/gcc/testsuite/gfortran.dg/vect/vect.exp
+--- a/gcc/testsuite/gfortran.dg/vect/vect.exp 2009-02-20 16:20:38.000000000 +0100
++++ b/gcc/testsuite/gfortran.dg/vect/vect.exp 2010-01-25 09:50:29.585686502 +0100
+@@ -98,7 +98,7 @@
+ } elseif [istarget "ia64-*-*"] {
+ set dg-do-what-default run
+ } elseif [is-effective-target arm_neon_ok] {
+- lappend DEFAULT_VECTCFLAGS "-mfpu=neon" "-mfloat-abi=softfp"
++ eval lappend DEFAULT_VECTCFLAGS [add_options_for_arm_neon ""]
+ if [is-effective-target arm_neon_hw] {
+ set dg-do-what-default run
+ } else {
+diff -Nur a/gcc/testsuite/g++.old-deja/g++.other/overload11.C b/gcc/testsuite/g++.old-deja/g++.other/overload11.C
+--- a/gcc/testsuite/g++.old-deja/g++.other/overload11.C 2008-09-19 00:29:39.000000000 +0200
++++ b/gcc/testsuite/g++.old-deja/g++.other/overload11.C 2010-01-25 09:50:29.585686502 +0100
+@@ -54,11 +54,10 @@
+
+ ptr = (ovl); // ok
+ ptr = (&ovl); // ok
+- // 13.4 indicates these are ok.
+- ptr = (0, ovl); // ok { dg-bogus "" "" { xfail *-*-* } }
+- ptr = (0, &ovl); // ok { dg-bogus "" "" { xfail *-*-* } }
+- ptr = (argc ? ovl : ovl); // ok { dg-bogus "" "" { xfail *-*-* } }
+- ptr = (argc ? &ovl : &ovl);// ok { dg-bogus "" "" { xfail *-*-* } }
++ ptr = (0, ovl); // ok { dg-error "no context" }
++ ptr = (0, &ovl); // ok { dg-error "no context" }
++ ptr = (argc ? ovl : ovl); // ok { dg-error "no context" }
++ ptr = (argc ? &ovl : &ovl);// ok { dg-error "no context" }
+
+ vptr = (ovl); // { dg-error "" } no matching candidates
+ vptr = (&ovl); // { dg-error "" } no matching candidates
+diff -Nur a/gcc/testsuite/lib/prune.exp b/gcc/testsuite/lib/prune.exp
+--- a/gcc/testsuite/lib/prune.exp 2009-02-20 16:20:38.000000000 +0100
++++ b/gcc/testsuite/lib/prune.exp 2010-01-25 09:50:29.585686502 +0100
+@@ -57,3 +57,34 @@
+ return $text
+ }
+ }
++
++# Extend prune_warnings (provided by DejaGNU itself) to prune more
++# things. The prune_gcc_output function above is called only by some
++# tests; prune_warnings is used by all.
++if { [info procs prune_warnings_orig] == "" } {
++ rename prune_warnings prune_warnings_orig
++
++ proc prune_warnings { text } {
++ set text [prune_warnings_orig $text]
++
++ if { [ishost "sparc*-*-solaris2*"] } {
++ # When testing a compiler built for SPARC Solaris 2.9 (or earlier)
++ # on a host running Solaris 2.10 (or later), we get this warning
++ # from the static linker when building with g++:
++ #
++ # libm.so.1, needed by .../libstdc++.so may conflict with
++ # libm.so
++ #
++ # The warning is issued because libstdc++ is linked against
++ # libm.so.1 (from the Solaris 2.9 sysroot), whereas Solaris 2.10
++ # provides both libm.so.2 and libm.so.1. On Solaris 2.10, libc.so
++ # depends on libm.so.2, so all programs pull in libm.so.2.
++ #
++ # Pulling both libraries must in fact be harmless, as, otherwise,
++ # programs built for Solaris 2.9 would break on Solaris 2.10.
++ regsub -all "(^|\n)\[^\n\]*: warning: libm.so.1, needed by \[^\n\]*, may conflict with libm.so.2" $text "" text
++ }
++
++ return $text
++ }
++}
+diff -Nur a/gcc/testsuite/lib/target-supports.exp b/gcc/testsuite/lib/target-supports.exp
+--- a/gcc/testsuite/lib/target-supports.exp 2009-07-21 09:22:51.000000000 +0200
++++ b/gcc/testsuite/lib/target-supports.exp 2010-01-25 09:50:29.585686502 +0100
+@@ -491,6 +491,7 @@
+ || [istarget avr-*-*]
+ || [istarget bfin-*-*]
+ || [istarget powerpc-*-eabi*]
++ || [istarget powerpc-*-elf]
+ || [istarget cris-*-*]
+ || [istarget crisv32-*-*]
+ || [istarget fido-*-elf]
+@@ -611,6 +612,18 @@
+ } "-pthread"]
+ }
+
++# Return 1 if compilation with -mpe-aligned-commons is error-free
++# for trivial code, 0 otherwise.
++
++proc check_effective_target_pe_aligned_commons {} {
++ if { [istarget *-*-cygwin*] || [istarget *-*-mingw*] } {
++ return [check_no_compiler_messages pe_aligned_commons object {
++ int foo;
++ } "-mpe-aligned-commons"]
++ }
++ return 0
++}
++
+ # Return 1 if the target supports -fstack-protector
+ proc check_effective_target_fstack_protector {} {
+ return [check_runtime fstack_protector {
+@@ -720,6 +733,15 @@
+ } [add_options_for_mips16_attribute ""]]
+ }
+
++# Return 1 if the target supports long double larger than double when
++# using the new ABI, 0 otherwise.
++
++proc check_effective_target_mips_newabi_large_long_double { } {
++ return [check_no_compiler_messages mips_newabi_large_long_double object {
++ int dummy[sizeof(long double) > sizeof(double) ? 1 : -1];
++ } "-mabi=64"]
++}
++
+ # Return 1 if the current multilib does not generate PIC by default.
+
+ proc check_effective_target_nonpic { } {
+@@ -1408,6 +1430,18 @@
+ }]
+ }
+
++# Return 1 if this is an ARM target that only supports aligned vector accesses
++proc check_effective_target_arm_vect_no_misalign { } {
++ return [check_no_compiler_messages arm_vect_no_misalign assembly {
++ #if !defined(__arm__) \
++ || (defined(__ARMEL__) \
++ && (!defined(__thumb__) || defined(__thumb2__)))
++ #error FOO
++ #endif
++ }]
++}
++
++
+ # Return 1 if this is an ARM target supporting -mfpu=vfp
+ # -mfloat-abi=softfp. Some multilibs may be incompatible with these
+ # options.
+@@ -1422,18 +1456,110 @@
+ }
+ }
+
+-# Return 1 if this is an ARM target supporting -mfpu=neon
+-# -mfloat-abi=softfp. Some multilibs may be incompatible with these
++# Return 1 if this is an ARM target supporting -mfpu=vfp
++# -mfloat-abi=hard. Some multilibs may be incompatible with these
+ # options.
+
+-proc check_effective_target_arm_neon_ok { } {
++proc check_effective_target_arm_hard_vfp_ok { } {
+ if { [check_effective_target_arm32] } {
+- return [check_no_compiler_messages arm_neon_ok object {
+- int dummy;
+- } "-mfpu=neon -mfloat-abi=softfp"]
++ return [check_no_compiler_messages arm_hard_vfp_ok executable {
++ int main() { return 0;}
++ } "-mfpu=vfp -mfloat-abi=hard"]
+ } else {
+- return 0
++ return 0
++ }
++}
++
++# Add the options needed for NEON. We need either -mfloat-abi=softfp
++# or -mfloat-abi=hard, but if one is already specified by the
++# multilib, use it. Similarly, if a -mfpu option already enables
++# NEON, do not add -mfpu=neon.
++
++proc add_options_for_arm_neon { flags } {
++ if { ! [check_effective_target_arm_neon_ok] } {
++ return "$flags"
++ }
++ global et_arm_neon_flags
++ return "$flags $et_arm_neon_flags"
++}
++
++# Return 1 if this is an ARM target supporting -mfpu=neon
++# -mfloat-abi=softfp or equivalent options. Some multilibs may be
++# incompatible with these options. Also set et_arm_neon_flags to the
++# best options to add.
++
++proc check_effective_target_arm_neon_ok_nocache { } {
++ global et_arm_neon_flags
++ set et_arm_neon_flags ""
++ if { [check_effective_target_arm32] } {
++ foreach flags {"" "-mfloat-abi=softfp" "-mfpu=neon" "-mfpu=neon -mfloat-abi=softfp"} {
++ if { [check_no_compiler_messages_nocache arm_neon_ok object {
++ #include "arm_neon.h"
++ int dummy;
++ } "$flags"] } {
++ set et_arm_neon_flags $flags
++ return 1
++ }
++ }
+ }
++
++ return 0
++}
++
++proc check_effective_target_arm_neon_ok { } {
++ return [check_cached_effective_target arm_neon_ok \
++ check_effective_target_arm_neon_ok_nocache]
++}
++
++# Add the options needed for NEON. We need either -mfloat-abi=softfp
++# or -mfloat-abi=hard, but if one is already specified by the
++# multilib, use it.
++
++proc add_options_for_arm_neon_fp16 { flags } {
++ if { ! [check_effective_target_arm_neon_fp16_ok] } {
++ return "$flags"
++ }
++ global et_arm_neon_fp16_flags
++ return "$flags $et_arm_neon_fp16_flags"
++}
++
++# Return 1 if this is an ARM target supporting -mfpu=neon-fp16
++# -mfloat-abi=softfp or equivalent options. Some multilibs may be
++# incompatible with these options. Also set et_arm_neon_flags to the
++# best options to add.
++
++proc check_effective_target_arm_neon_fp16_ok_nocache { } {
++ global et_arm_neon_fp16_flags
++ set et_arm_neon_fp16_flags ""
++ if { [check_effective_target_arm32] } {
++ # Always add -mfpu=neon-fp16, since there is no preprocessor
++ # macro for FP16 support.
++ foreach flags {"-mfpu=neon-fp16" "-mfpu=neon-fp16 -mfloat-abi=softfp"} {
++ if { [check_no_compiler_messages_nocache arm_neon_fp16_ok object {
++ #include "arm_neon.h"
++ int dummy;
++ } "$flags"] } {
++ set et_arm_neon_fp16_flags $flags
++ return 1
++ }
++ }
++ }
++
++ return 0
++}
++
++proc check_effective_target_arm_neon_fp16_ok { } {
++ return [check_cached_effective_target arm_neon_fp16_ok \
++ check_effective_target_arm_neon_fp16_ok_nocache]
++}
++
++# Return 1 if this is an arm target using 32-bit instructions, but not thumb
++proc check_effective_target_arm_not_thumb { } {
++ return [check_no_compiler_messages arm_not_thumb assembly {
++ #if !defined(__arm__) || defined(__thumb__)
++ #error FOO
++ #endif
++ }]
+ }
+
+ # Return 1 is this is an ARM target where -mthumb causes Thumb-1 to be
+@@ -1447,6 +1573,17 @@
+ } "-mthumb"]
+ }
+
++# Return 1 is this is an ARM target where -mthumb causes Thumb-2 to be
++# used.
++
++proc check_effective_target_arm_thumb2_ok { } {
++ return [check_no_compiler_messages arm_thumb2_ok assembly {
++ #if !defined(__thumb2__)
++ #error FOO
++ #endif
++ } "-mthumb"]
++}
++
+ # Return 1 if the target supports executing NEON instructions, 0
+ # otherwise. Cache the result.
+
+@@ -1461,7 +1598,7 @@
+ : "0" (a), "w" (b));
+ return (a != 1);
+ }
+- } "-mfpu=neon -mfloat-abi=softfp"]
++ } [add_options_for_arm_neon ""]]
+ }
+
+ # Return 1 if this is a ARM target with NEON enabled.
+@@ -1504,6 +1641,19 @@
+ }]
+ }
+
++# Return 1 if this is an ARM target supporting -mcpu=iwmmxt.
++# Some multilibs may be incompatible with this option.
++
++proc check_effective_target_arm_iwmmxt_ok { } {
++ if { [check_effective_target_arm32] } {
++ return [check_no_compiler_messages arm_iwmmxt_ok object {
++ int dummy;
++ } "-mcpu=iwmmxt"]
++ } else {
++ return 0
++ }
++}
++
+ # Return 1 if this is a PowerPC target with floating-point registers.
+
+ proc check_effective_target_powerpc_fprs { } {
+@@ -1700,6 +1850,26 @@
+ return $et_vect_shift_saved
+ }
+
++# Return 1 if the target supports hardware vector shift operation for char.
++
++proc check_effective_target_vect_shift_char { } {
++ global et_vect_shift_char_saved
++
++ if [info exists et_vect_shift_char_saved] {
++ verbose "check_effective_target_vect_shift_char: using cached result" 2
++ } else {
++ set et_vect_shift_char_saved 0
++ if { ([istarget powerpc*-*-*]
++ && ![istarget powerpc-*-linux*paired*])
++ || [check_effective_target_arm32] } {
++ set et_vect_shift_char_saved 1
++ }
++ }
++
++ verbose "check_effective_target_vect_shift_char: returning $et_vect_shift_char_saved" 2
++ return $et_vect_shift_char_saved
++}
++
+ # Return 1 if the target supports hardware vectors of long, 0 otherwise.
+ #
+ # This can change for different subtargets so do not cache the result.
+@@ -2159,7 +2329,7 @@
+ if { [istarget mipsisa64*-*-*]
+ || [istarget sparc*-*-*]
+ || [istarget ia64-*-*]
+- || [check_effective_target_arm32] } {
++ || [check_effective_target_arm_vect_no_misalign] } {
+ set et_vect_no_align_saved 1
+ }
+ }
+@@ -2273,6 +2443,24 @@
+ return $et_vector_alignment_reachable_for_64bit_saved
+ }
+
++# Return 1 if the target only requires element alignment for vector accesses
++
++proc check_effective_target_vect_element_align { } {
++ global et_vect_element_align
++
++ if [info exists et_vect_element_align] {
++ verbose "check_effective_target_vect_elemetn_align: using cached result" 2
++ } else {
++ set et_vect_element_align 0
++ if { [istarget arm*-*-*] } {
++ set et_vect_element_align 1
++ }
++ }
++
++ verbose "check_effective_target_vect_element_align: returning $et_vect_element_align" 2
++ return $et_vect_element_align
++}
++
+ # Return 1 if the target supports vector conditional operations, 0 otherwise.
+
+ proc check_effective_target_vect_condition { } {
+@@ -2468,7 +2656,8 @@
+ verbose "check_effective_target_section_anchors: using cached result" 2
+ } else {
+ set et_section_anchors_saved 0
+- if { [istarget powerpc*-*-*] } {
++ if { [istarget powerpc*-*-*]
++ || [istarget arm*-*-*] } {
+ set et_section_anchors_saved 1
+ }
+ }
+diff -Nur a/gcc/timevar.def b/gcc/timevar.def
+--- a/gcc/timevar.def 2009-02-20 16:20:38.000000000 +0100
++++ b/gcc/timevar.def 2010-01-25 09:50:29.585686502 +0100
+@@ -134,6 +134,7 @@
+ DEFTIMEVAR (TV_PREDCOM , "predictive commoning")
+ DEFTIMEVAR (TV_TREE_LOOP_INIT , "tree loop init")
+ DEFTIMEVAR (TV_TREE_LOOP_FINI , "tree loop fini")
++DEFTIMEVAR (TV_TREE_LOOP_PROMOTE , "tree loop index promotion")
+ DEFTIMEVAR (TV_TREE_CH , "tree copy headers")
+ DEFTIMEVAR (TV_TREE_SSA_UNCPROP , "tree SSA uncprop")
+ DEFTIMEVAR (TV_TREE_SSA_TO_NORMAL , "tree SSA to normal")
+@@ -141,6 +142,7 @@
+ DEFTIMEVAR (TV_TREE_COPY_RENAME , "tree rename SSA copies")
+ DEFTIMEVAR (TV_TREE_SSA_VERIFY , "tree SSA verifier")
+ DEFTIMEVAR (TV_TREE_STMT_VERIFY , "tree STMT verifier")
++DEFTIMEVAR (TV_TREE_RLS , "tree local static removal")
+ DEFTIMEVAR (TV_TREE_SWITCH_CONVERSION, "tree switch initialization conversion")
+ DEFTIMEVAR (TV_CGRAPH_VERIFY , "callgraph verifier")
+ DEFTIMEVAR (TV_DOM_FRONTIERS , "dominance frontiers")
+diff -Nur a/gcc/toplev.h b/gcc/toplev.h
+--- a/gcc/toplev.h 2009-02-20 16:20:38.000000000 +0100
++++ b/gcc/toplev.h 2010-01-25 09:50:29.585686502 +0100
+@@ -139,6 +139,7 @@
+ extern int flag_unroll_all_loops;
+ extern int flag_unswitch_loops;
+ extern int flag_cprop_registers;
++extern int flag_remove_local_statics;
+ extern int time_report;
+ extern int flag_ira_coalesce;
+ extern int flag_ira_move_spills;
+diff -Nur a/gcc/tree.c b/gcc/tree.c
+--- a/gcc/tree.c 2009-07-20 16:39:32.000000000 +0200
++++ b/gcc/tree.c 2010-01-25 09:50:29.585686502 +0100
+@@ -4062,6 +4062,7 @@
+ bool *no_add_attrs)
+ {
+ tree node = *pnode;
++ bool is_dllimport;
+
+ /* These attributes may apply to structure and union types being created,
+ but otherwise should pass to the declaration involved. */
+@@ -4109,9 +4110,11 @@
+ return NULL_TREE;
+ }
+
++ is_dllimport = is_attribute_p ("dllimport", name);
++
+ /* Report error on dllimport ambiguities seen now before they cause
+ any damage. */
+- else if (is_attribute_p ("dllimport", name))
++ if (is_dllimport)
+ {
+ /* Honor any target-specific overrides. */
+ if (!targetm.valid_dllimport_attribute_p (node))
+@@ -4153,6 +4156,9 @@
+ if (*no_add_attrs == false)
+ DECL_DLLIMPORT_P (node) = 1;
+ }
++ else if (DECL_DECLARED_INLINE_P (node))
++ /* An exported function, even if inline, must be emitted. */
++ DECL_EXTERNAL (node) = 0;
+
+ /* Report error if symbol is not accessible at global scope. */
+ if (!TREE_PUBLIC (node)
+diff -Nur a/gcc/tree-cfg.c b/gcc/tree-cfg.c
+--- a/gcc/tree-cfg.c 2009-07-02 14:16:39.000000000 +0200
++++ b/gcc/tree-cfg.c 2010-01-25 09:50:29.585686502 +0100
+@@ -47,6 +47,7 @@
+ #include "value-prof.h"
+ #include "pointer-set.h"
+ #include "tree-inline.h"
++#include "target.h"
+
+ /* This file contains functions for building the Control Flow Graph (CFG)
+ for a function tree. */
+@@ -7052,6 +7053,9 @@
+ edge e;
+ edge_iterator ei;
+
++ if (!targetm.warn_func_result())
++ return 0;
++
+ /* If we have a path to EXIT, then we do return. */
+ if (TREE_THIS_VOLATILE (cfun->decl)
+ && EDGE_COUNT (EXIT_BLOCK_PTR->preds) > 0)
+diff -Nur a/gcc/tree.h b/gcc/tree.h
+--- a/gcc/tree.h 2009-06-02 09:18:16.000000000 +0200
++++ b/gcc/tree.h 2010-01-25 09:50:29.585686502 +0100
+@@ -381,8 +381,10 @@
+ unsigned lang_flag_5 : 1;
+ unsigned lang_flag_6 : 1;
+ unsigned visited : 1;
++ unsigned packed_flag : 1;
++ unsigned user_align : 1;
+
+- unsigned spare : 23;
++ unsigned spare : 21;
+
+ union tree_ann_d *ann;
+ };
+@@ -2140,7 +2142,7 @@
+
+ /* 1 if the alignment for this type was requested by "aligned" attribute,
+ 0 if it is the default for this type. */
+-#define TYPE_USER_ALIGN(NODE) (TYPE_CHECK (NODE)->type.user_align)
++#define TYPE_USER_ALIGN(NODE) (TYPE_CHECK (NODE)->common.base.user_align)
+
+ /* The alignment for NODE, in bytes. */
+ #define TYPE_ALIGN_UNIT(NODE) (TYPE_ALIGN (NODE) / BITS_PER_UNIT)
+@@ -2246,7 +2248,7 @@
+
+ /* Indicated that objects of this type should be laid out in as
+ compact a way as possible. */
+-#define TYPE_PACKED(NODE) (TYPE_CHECK (NODE)->type.packed_flag)
++#define TYPE_PACKED(NODE) (TYPE_CHECK (NODE)->common.base.packed_flag)
+
+ /* Used by type_contains_placeholder_p to avoid recomputation.
+ Values are: 0 (unknown), 1 (false), 2 (true). Never access
+@@ -2265,17 +2267,16 @@
+ tree attributes;
+ unsigned int uid;
+
+- unsigned int precision : 9;
+- ENUM_BITFIELD(machine_mode) mode : 7;
+-
+- unsigned string_flag : 1;
++ unsigned int precision : 10;
+ unsigned no_force_blk_flag : 1;
+ unsigned needs_constructing_flag : 1;
+ unsigned transparent_union_flag : 1;
+- unsigned packed_flag : 1;
+ unsigned restrict_flag : 1;
+ unsigned contains_placeholder_bits : 2;
+
++ ENUM_BITFIELD(machine_mode) mode : 8;
++
++ unsigned string_flag : 1;
+ unsigned lang_flag_0 : 1;
+ unsigned lang_flag_1 : 1;
+ unsigned lang_flag_2 : 1;
+@@ -2283,7 +2284,6 @@
+ unsigned lang_flag_4 : 1;
+ unsigned lang_flag_5 : 1;
+ unsigned lang_flag_6 : 1;
+- unsigned user_align : 1;
+
+ unsigned int align;
+ alias_set_type alias_set;
+@@ -2584,7 +2584,7 @@
+ #define DECL_ALIGN_UNIT(NODE) (DECL_ALIGN (NODE) / BITS_PER_UNIT)
+ /* Set if the alignment of this DECL has been set by the user, for
+ example with an 'aligned' attribute. */
+-#define DECL_USER_ALIGN(NODE) (DECL_COMMON_CHECK (NODE)->decl_common.user_align)
++#define DECL_USER_ALIGN(NODE) (DECL_COMMON_CHECK (NODE)->common.base.user_align)
+ /* Holds the machine mode corresponding to the declaration of a variable or
+ field. Always equal to TYPE_MODE (TREE_TYPE (decl)) except for a
+ FIELD_DECL. */
+@@ -2621,7 +2621,7 @@
+ example, for a FUNCTION_DECL, DECL_SAVED_TREE may be non-NULL and
+ DECL_EXTERNAL may be true simultaneously; that can be the case for
+ a C99 "extern inline" function. */
+-#define DECL_EXTERNAL(NODE) (DECL_COMMON_CHECK (NODE)->decl_common.decl_flag_2)
++#define DECL_EXTERNAL(NODE) (DECL_COMMON_CHECK (NODE)->decl_common.decl_flag_1)
+
+ /* Nonzero in a ..._DECL means this variable is ref'd from a nested function.
+ For VAR_DECL nodes, PARM_DECL nodes, and FUNCTION_DECL nodes.
+@@ -2696,7 +2696,6 @@
+ unsigned ignored_flag : 1;
+ unsigned abstract_flag : 1;
+ unsigned artificial_flag : 1;
+- unsigned user_align : 1;
+ unsigned preserve_flag: 1;
+ unsigned debug_expr_is_from : 1;
+
+@@ -2712,22 +2711,20 @@
+ /* In LABEL_DECL, this is DECL_ERROR_ISSUED.
+ In VAR_DECL and PARM_DECL, this is DECL_REGISTER. */
+ unsigned decl_flag_0 : 1;
+- /* In FIELD_DECL, this is DECL_PACKED. */
+- unsigned decl_flag_1 : 1;
+ /* In FIELD_DECL, this is DECL_BIT_FIELD
+ In VAR_DECL and FUNCTION_DECL, this is DECL_EXTERNAL.
+- In TYPE_DECL, this is TYPE_DECL_SUPRESS_DEBUG. */
+- unsigned decl_flag_2 : 1;
++ In TYPE_DECL, this is TYPE_DECL_SUPPRESS_DEBUG. */
++ unsigned decl_flag_1 : 1;
+ /* In FIELD_DECL, this is DECL_NONADDRESSABLE_P
+- In VAR_DECL and PARM_DECL, this is DECL_HAS_VALUE_EXPR. */
+- unsigned decl_flag_3 : 1;
++ In VAR_DECL and PARM_DECL, this is DECL_HAS_VALUE_EXPR_P. */
++ unsigned decl_flag_2 : 1;
+ /* Logically, these two would go in a theoretical base shared by var and
+ parm decl. */
+ unsigned gimple_reg_flag : 1;
+ /* In a DECL with pointer type, set if no TBAA should be done. */
+ unsigned no_tbaa_flag : 1;
+ /* Padding so that 'align' can be on a 32-bit boundary. */
+- unsigned decl_common_unused : 2;
++ unsigned decl_common_unused : 4;
+
+ unsigned int align : 24;
+ /* DECL_OFFSET_ALIGN, used only for FIELD_DECLs. */
+@@ -2751,7 +2748,7 @@
+ decl itself. This should only be used for debugging; once this field has
+ been set, the decl itself may not legitimately appear in the function. */
+ #define DECL_HAS_VALUE_EXPR_P(NODE) \
+- (TREE_CHECK2 (NODE, VAR_DECL, PARM_DECL)->decl_common.decl_flag_3)
++ (TREE_CHECK2 (NODE, VAR_DECL, PARM_DECL)->decl_common.decl_flag_2)
+ #define DECL_VALUE_EXPR(NODE) \
+ (decl_value_expr_lookup (DECL_WRTL_CHECK (NODE)))
+ #define SET_DECL_VALUE_EXPR(NODE, VAL) \
+@@ -2830,11 +2827,11 @@
+ #define DECL_FCONTEXT(NODE) (FIELD_DECL_CHECK (NODE)->field_decl.fcontext)
+
+ /* In a FIELD_DECL, indicates this field should be bit-packed. */
+-#define DECL_PACKED(NODE) (FIELD_DECL_CHECK (NODE)->decl_common.decl_flag_1)
++#define DECL_PACKED(NODE) (FIELD_DECL_CHECK (NODE)->common.base.packed_flag)
+
+ /* Nonzero in a FIELD_DECL means it is a bit field, and must be accessed
+ specially. */
+-#define DECL_BIT_FIELD(NODE) (FIELD_DECL_CHECK (NODE)->decl_common.decl_flag_2)
++#define DECL_BIT_FIELD(NODE) (FIELD_DECL_CHECK (NODE)->decl_common.decl_flag_1)
+
+ /* Used in a FIELD_DECL to indicate that we cannot form the address of
+ this component. This makes it possible for Type-Based Alias Analysis
+@@ -2852,7 +2849,7 @@
+ accesses to s.i must not be given the alias set of the type of 'i'
+ (int) but instead directly that of the type of 's' (struct S). */
+ #define DECL_NONADDRESSABLE_P(NODE) \
+- (FIELD_DECL_CHECK (NODE)->decl_common.decl_flag_3)
++ (FIELD_DECL_CHECK (NODE)->decl_common.decl_flag_2)
+
+ struct tree_field_decl GTY(())
+ {
+@@ -3337,7 +3334,7 @@
+ into stabs. Instead it will generate cross reference ('x') of names.
+ This uses the same flag as DECL_EXTERNAL. */
+ #define TYPE_DECL_SUPPRESS_DEBUG(NODE) \
+- (TYPE_DECL_CHECK (NODE)->decl_common.decl_flag_2)
++ (TYPE_DECL_CHECK (NODE)->decl_common.decl_flag_1)
+
+ /* Getter of the imported declaration associated to the
+ IMPORTED_DECL node. */
+diff -Nur a/gcc/tree-pass.h b/gcc/tree-pass.h
+--- a/gcc/tree-pass.h 2009-02-20 16:20:38.000000000 +0100
++++ b/gcc/tree-pass.h 2010-01-25 09:50:29.585686502 +0100
+@@ -323,6 +323,7 @@
+ extern struct gimple_opt_pass pass_empty_loop;
+ extern struct gimple_opt_pass pass_record_bounds;
+ extern struct gimple_opt_pass pass_graphite_transforms;
++extern struct gimple_opt_pass pass_promote_indices;
+ extern struct gimple_opt_pass pass_if_conversion;
+ extern struct gimple_opt_pass pass_loop_distribution;
+ extern struct gimple_opt_pass pass_vectorize;
+@@ -388,6 +389,7 @@
+ extern struct gimple_opt_pass pass_rebuild_cgraph_edges;
+ extern struct gimple_opt_pass pass_build_cgraph_edges;
+ extern struct gimple_opt_pass pass_reset_cc_flags;
++extern struct gimple_opt_pass pass_remove_local_statics;
+
+ /* IPA Passes */
+ extern struct ipa_opt_pass pass_ipa_inline;
+diff -Nur a/gcc/tree-sra.c b/gcc/tree-sra.c
+--- a/gcc/tree-sra.c 2009-03-04 10:02:59.000000000 +0100
++++ b/gcc/tree-sra.c 2010-01-25 09:50:29.585686502 +0100
+@@ -274,6 +274,12 @@
+ != TYPE_PRECISION (TREE_TYPE (t))))
+ goto fail;
+
++ /* Disable optimization of bitfields on BITS_BIG_ENDIAN
++ architectures. SRA doesn't properly handle padding bits
++ at the bottom, see issue6713. */
++ if (DECL_BIT_FIELD (t) && BITS_BIG_ENDIAN)
++ goto fail;
++
+ saw_one_field = true;
+ }
+
+diff -Nur a/gcc/tree-ssa-loop-promote.c b/gcc/tree-ssa-loop-promote.c
+--- a/gcc/tree-ssa-loop-promote.c 1970-01-01 01:00:00.000000000 +0100
++++ b/gcc/tree-ssa-loop-promote.c 2010-01-25 09:50:29.585686502 +0100
+@@ -0,0 +1,1628 @@
++/* Promotion of shorter-than-word-size loop indices.
++ Copyright (C) 2009 Free Software Foundation, Inc.
++
++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/>. */
++
++/* This pass finds loop indices that are declared as
++ shorter-than-word-size and replaces them with word-sized loop
++ indices. (It assumes that word-sized quantities are the most
++ efficient type on which to do arithmetic.) The loop optimization
++ machinery has a difficult time seeing through the casts required to
++ promote such indices to word-sized quantities for memory addressing
++ and/or preserving the semantics of the source language (such as C).
++ The transformation also helps eliminate unnecessary
++ {sign,zero}-extensions required for the same.
++
++ Although this is most naturally expressed as a loop optimization
++ pass, we choose to place this pass some ways before the loop
++ optimization passes proper, so that other scalar optimizations will
++ run on our "cleaned-up" code. This decision has the negative of
++ requiring us to build and destroy all the loop optimization
++ infrastructure.
++
++ The algorithm is relatively simple. For each single-exit loop, we
++ identify the loop index variable. If the loop index variable is
++ shorter than the word size, then we have a candidate for promotion.
++ We determine whether the scalar evolution of the loop index fits a
++ particular pattern (incremented by 1, compared against a
++ similarly-typed loop bound, and only modified by a single increment
++ within the loop), as well as examining the uses of the loop index to
++ ensure we are able to safely promote those uses (e.g. the loop index
++ must not be stored to memory or passed to function calls). If these
++ conditions are satisfied, we create an appropriate word-sized type
++ and replace all uses and defs of the loop index variable with the new
++ variable. */
++
++#include "config.h"
++#include "system.h"
++#include "coretypes.h"
++#include "tm.h"
++
++#include "toplev.h"
++#include "rtl.h"
++#include "tm_p.h"
++#include "hard-reg-set.h"
++#include "obstack.h"
++#include "basic-block.h"
++#include "pointer-set.h"
++#include "intl.h"
++
++#include "tree.h"
++#include "gimple.h"
++#include "hashtab.h"
++#include "diagnostic.h"
++#include "tree-flow.h"
++#include "tree-dump.h"
++#include "cfgloop.h"
++#include "flags.h"
++#include "timevar.h"
++#include "tree-pass.h"
++
++struct promote_info {
++ /* The loop being analyzed. */
++ struct loop *loop;
++
++ /* The GIMPLE_COND controlling exit from the loop. */
++ gimple exit_expr;
++
++ /* The loop index variable's SSA_NAME that is defined in a phi node in
++ LOOP->HEADER. Note that this SSA_NAME may be different than the
++ one appearing in EXIT_EXPR. */
++ tree loop_index_name;
++
++ /* The bound of the loop. */
++ tree loop_limit;
++
++ /* Whether we've warned about things with
++ warn_unsafe_loop_optimizations. */
++ bool warned;
++
++ /* LOOP_INDEX_NAME's underlying VAR_DECL. */
++ tree var_decl;
++
++ /* The types to which defs/uses of LOOP_INDEX_NAME are cast via
++ NOP_EXPRs. */
++ VEC(tree, heap) *cast_types;
++
++ /* The number of times we have seen a cast to the corresponding type
++ (as determined by types_compatible_p) in CAST_TYPES. */
++ VEC(int, heap) *cast_counts;
++
++ /* Whether LOOP_INDEX_NAME is suitable for promotion. */
++ bool can_be_promoted_p;
++
++ /* If CAN_BE_PROMOTED_P, the promoted type. */
++ tree promoted_type;
++
++ /* If CAN_BE_PROMOTED_P, the promoted VAR_DECL. */
++ tree promoted_var;
++};
++
++/* A set of `struct promote_info'. */
++
++static struct pointer_set_t *promotion_info;
++
++/* A set of all potentially promotable SSA_NAMEs, used for quick
++decision-making during analysis. */
++
++static struct pointer_set_t *promotable_names;
++
++/* A map from SSA_NAMEs to the VAR_DECL to which they will be
++ promoted. */
++
++static struct pointer_map_t *variable_map;
++
++/* A set of the stmts that we have already rebuilt with promoted variables. */
++
++static struct pointer_set_t *promoted_stmts;
++
++
++/* Add CASTED to PI->CAST_TYPES if we haven't seen CASTED before. */
++
++static void
++add_casted_type (struct promote_info *pi, tree casted)
++{
++ int i;
++ tree type;
++
++ /* For this information to be useful later, CASTED must be wider than
++ the type of the variable. */
++ if (TYPE_PRECISION (casted) <= TYPE_PRECISION (TREE_TYPE (pi->var_decl)))
++ return;
++
++ for (i = 0; VEC_iterate (tree, pi->cast_types, i, type); i++)
++ if (types_compatible_p (casted, type))
++ {
++ int c = VEC_index(int, pi->cast_counts, i);
++ VEC_replace(int, pi->cast_counts, i, ++c);
++ return;
++ }
++
++ /* Haven't see the type before. */
++ VEC_safe_push (tree, heap, pi->cast_types, casted);
++ VEC_safe_push (int, heap, pi->cast_counts, 1);
++}
++
++/* Return the most-casted-to type in PI->CAST_TYPES. Return an
++ appropriately signed variant of size_type_node if the variable wasn't
++ cast in some fashion. */
++
++static tree
++choose_profitable_promoted_type (struct promote_info *pi)
++{
++ int i;
++ int count;
++ tree type = NULL_TREE;
++ int maxuse = -1;
++
++ for (i = 0; VEC_iterate (int, pi->cast_counts, i, count); i++)
++ if (count > maxuse)
++ {
++ maxuse = count;
++ type = VEC_index (tree, pi->cast_types, i);
++ }
++
++ if (type == NULL_TREE)
++ {
++ if (dump_file)
++ {
++ fprintf (dump_file, "Warning, failed to find upcast type for ");
++ print_generic_expr (dump_file, pi->loop_index_name, 0);
++ fprintf (dump_file, "\n");
++ }
++ return (TYPE_UNSIGNED (TREE_TYPE (pi->var_decl))
++ ? size_type_node
++ : signed_type_for (size_type_node));
++ }
++ else
++ return signed_type_for (type);
++}
++
++/* Intuit the loop index for LOOP from PHI. There must be a path that
++ only goes through NOP_EXPRs or CONVERT_EXPRs from the result of PHI
++ to one of the operands of COND. If such a path cannot be found,
++ return NULL_TREE. If LIMIT is not NULL and a path can be found,
++ store the other operand of COND into LIMIT. */
++
++static tree
++find_promotion_candidate_from_phi (struct loop *loop, gimple cond,
++ gimple phi, tree *limit)
++{
++ tree op0, op1;
++ tree result, candidate;
++
++ result = candidate = PHI_RESULT (phi);
++ /* Must be an integer variable. */
++ if (TREE_CODE (TREE_TYPE (candidate)) != INTEGER_TYPE)
++ return NULL_TREE;
++
++ op0 = gimple_cond_lhs (cond);
++ op1 = gimple_cond_rhs (cond);
++
++ /* See if there's a path from CANDIDATE to an operand of COND. */
++ while (true)
++ {
++ use_operand_p use;
++ imm_use_iterator iui;
++ gimple use_stmt = NULL;
++
++ if (candidate == op0)
++ {
++ if (limit) *limit = op1;
++ break;
++ }
++ if (candidate == op1)
++ {
++ if (limit) *limit = op0;
++ break;
++ }
++
++ /* Find a single use in the loop header. Give up if there's
++ multiple ones. */
++ FOR_EACH_IMM_USE_FAST (use, iui, candidate)
++ {
++ gimple stmt = USE_STMT (use);
++
++ if (gimple_bb (stmt) == loop->header)
++ {
++ if (use_stmt)
++ {
++ if (dump_file)
++ {
++ fprintf (dump_file, "Rejecting ");
++ print_generic_expr (dump_file, candidate, 0);
++ fprintf (dump_file, " because it has multiple uses in the loop header (bb #%d).\n",
++ loop->header->index);
++ fprintf (dump_file, "first use: ");
++ print_gimple_stmt (dump_file, use_stmt, 0, 0);
++ fprintf (dump_file, "\nsecond use: ");
++ print_gimple_stmt (dump_file, stmt, 0, 0);
++ fprintf (dump_file, "\n(possibly more, but unanalyzed)\n");
++ }
++ return NULL_TREE;
++ }
++ else
++ use_stmt = stmt;
++ }
++ }
++
++ /* No uses in the loop header, bail. */
++ if (use_stmt == NULL)
++ return NULL_TREE;
++
++ if (gimple_code (use_stmt) != GIMPLE_ASSIGN
++ || TREE_CODE (gimple_assign_lhs (use_stmt)) != SSA_NAME
++ || (gimple_assign_rhs_code (use_stmt) != NOP_EXPR
++ && gimple_assign_rhs_code (use_stmt) != CONVERT_EXPR))
++ {
++ if (dump_file)
++ {
++ fprintf (dump_file, "Rejecting ");
++ print_generic_expr (dump_file, candidate, 0);
++ fprintf (dump_file, " because of use in ");
++ print_gimple_stmt (dump_file, use_stmt, 0, 0);
++ fprintf (dump_file, "\n");
++ }
++ return NULL_TREE;
++ }
++
++ candidate = gimple_assign_lhs (use_stmt);
++ }
++
++ /* CANDIDATE is now what we believe to be the loop index variable. There
++ are two possibilities:
++
++ - CANDIDATE is not the "true" loop index variable, but rather is a
++ promoted version of RESULT, done for purposes of satisfying a
++ language's semantics;
++
++ - CANDIDATE is the "true" loop index variable. */
++ if (!types_compatible_p (TREE_TYPE (result), TREE_TYPE (candidate)))
++ candidate = result;
++
++ /* The type of candidate must be "short" to consider promoting it. */
++ if (TREE_CODE (TREE_TYPE (candidate)) != INTEGER_TYPE
++ || TYPE_PRECISION (TREE_TYPE (candidate)) >= TYPE_PRECISION (size_type_node))
++ return NULL_TREE;
++
++ return candidate;
++}
++
++/* Find the loop index variable of LOOP. LOOP's exit is controlled by
++ the COND_EXPR EXPR. IF we can't determine what the loop index
++ variable is, or EXPR does not appear to be analyzable, then return
++ NULL_TREE. */
++
++static tree
++find_promotion_candidate (struct loop *loop, gimple cond, tree *limit)
++{
++ tree candidate = NULL_TREE;
++ gimple_stmt_iterator gsi;
++
++ switch (gimple_cond_code (cond))
++ {
++ case GT_EXPR:
++ case GE_EXPR:
++ case NE_EXPR:
++ case LT_EXPR:
++ case LE_EXPR:
++ break;
++
++ default:
++ return NULL_TREE;
++ }
++
++ /* We'd like to examine COND and intuit the loop index variable from
++ there. Instead, we're going to start from the phi nodes in BB and
++ attempt to work our way forwards to one of the operands of COND,
++ since starting from COND might yield an upcast loop index. If we
++ find multiple phi nodes whose results reach COND, then give up. */
++ for (gsi = gsi_start_phis (loop->header); !gsi_end_p (gsi); gsi_next (&gsi))
++ {
++ gimple phi = gsi_stmt (gsi);
++ tree t = find_promotion_candidate_from_phi (loop, cond, phi, limit);
++
++ if (t == NULL_TREE)
++ continue;
++ else if (candidate == NULL_TREE)
++ candidate = t;
++ else
++ {
++ if (dump_file)
++ {
++ fprintf (dump_file, "Can't find a candidate from ");
++ print_gimple_stmt (dump_file, cond, 0, 0);
++ fprintf (dump_file, "\n because too many phi node results reach the condition.\n");
++ }
++ return NULL_TREE;
++ }
++ }
++
++ return candidate;
++}
++
++/* Return true if X is something that could be promoted. */
++
++static bool
++could_be_promoted (tree x)
++{
++ return (TREE_CODE (x) == INTEGER_CST
++ || (TREE_CODE (x) == SSA_NAME
++ && pointer_set_contains (promotable_names, x)));
++}
++
++/* Examine the RHS of STMT's suitability with respect to being able to
++ promote VAR. */
++
++static bool
++check_rhs_for_promotability (struct promote_info *pi, tree var, gimple stmt,
++ bool is_assign)
++{
++ enum tree_code subcode = gimple_assign_rhs_code (stmt);
++
++ bool ok = true;
++
++ switch (subcode)
++ {
++ case PLUS_EXPR:
++ case MINUS_EXPR:
++ case MULT_EXPR:
++ case EQ_EXPR:
++ case NE_EXPR:
++ case LT_EXPR:
++ case LE_EXPR:
++ case GT_EXPR:
++ case GE_EXPR:
++ {
++ tree op0 = gimple_assign_rhs1 (stmt);
++ tree op1 = gimple_assign_rhs2 (stmt);
++
++ ok = ((op0 == var && could_be_promoted (op1))
++ || (op1 == var && could_be_promoted (op0)));
++ break;
++ }
++ case COND_EXPR:
++ if (gimple_expr_type (stmt) == NULL
++ || gimple_expr_type (stmt) == void_type_node)
++ ok = true;
++ else
++ /* This is conservative; it's possible that these sorts of nodes
++ could be promoted, but we'd have to be very careful about
++ checking in which parts of the COND_EXPR the promotable
++ variable(s) are. */
++ ok = false;
++ break;
++ case SSA_NAME:
++ {
++ tree expr = gimple_assign_rhs1 (stmt);
++ ok = (expr == var || could_be_promoted (expr));
++ }
++ break;
++ case INTEGER_CST:
++ break;
++ case NOP_EXPR:
++ case CONVERT_EXPR:
++ if (!is_assign)
++ {
++ add_casted_type (pi, gimple_expr_type (stmt));
++ break;
++ }
++ /* Fallthrough. */
++ default:
++ ok = false;
++ break;
++ }
++
++ return ok;
++}
++
++/* Analyze the loop index VAR for promotability. The rules for
++ promotability are:
++
++ For uses:
++
++ - The underlying variable may be used in NOP_EXPRs.
++
++ - The underlying variable may be used in simple arithmmetic
++ expressions so long as the other parts are potentially promotable
++ variables or constants (so we don't go willy-nilly on promoting
++ things).
++
++ - The underlying variable may not be stored to memory.
++
++ - All uses must occur inside the loop.
++
++ For defs:
++
++ - The underlying variable may not be loaded from memory; and
++
++ - The underlying variable may only be formed from expressions
++ involving potentially promotable varibles or constants.
++
++ Note that defs may occur outside of the loop; we do this to handle
++ initial conditions before entering the loop. */
++
++static void
++analyze_loop_index_uses (tree var, struct promote_info *pi)
++{
++ imm_use_iterator iui;
++ use_operand_p use;
++ gimple bad_stmt = NULL;
++ const char *reason = NULL;
++
++ FOR_EACH_IMM_USE_FAST (use, iui, var)
++ {
++ basic_block bb;
++ gimple use_stmt = USE_STMT (use);
++
++ /* Uses must exist only within the loop. */
++ bb = gimple_bb (use_stmt);
++
++ if (dump_file)
++ {
++ fprintf (dump_file, "Checking ");
++ print_gimple_stmt (dump_file, use_stmt, 0, 0);
++ fprintf (dump_file, "\n");
++ }
++
++ if (!flow_bb_inside_loop_p (pi->loop, bb))
++ {
++ bad_stmt = use_stmt;
++ reason = " is involved in stmt outside loop ";
++ break;
++ }
++
++ /* We cannot store the index to memory. */
++ if (gimple_references_memory_p (use_stmt))
++ {
++ bad_stmt = use_stmt;
++ reason = " is stored to memory in ";
++ break;
++ }
++
++ if (gimple_code (use_stmt) == GIMPLE_CALL)
++ {
++ /* We cannot pass the variable to a function. */
++ bad_stmt = use_stmt;
++ reason = " is passed to function in ";
++ break;
++ }
++ else if (gimple_code (use_stmt) == GIMPLE_ASSIGN)
++ {
++ tree lhs = gimple_assign_lhs (use_stmt);
++
++ if (!check_rhs_for_promotability (pi, var, use_stmt,
++ /*is_assign=*/false))
++ {
++ bad_stmt = use_stmt;
++ reason = " is involved in non-promotable expression ";
++ break;
++ }
++ else if ((TREE_CODE_CLASS (gimple_assign_rhs_code (use_stmt)) == tcc_binary
++ || gimple_assign_rhs_code (use_stmt) == SSA_NAME)
++ && !could_be_promoted (lhs))
++ {
++ bad_stmt = use_stmt;
++ reason = " is being assigned to non-promotable variable ";
++ break;
++ }
++ }
++ else if (gimple_code (use_stmt) != GIMPLE_COND
++ && gimple_code (use_stmt) != GIMPLE_PHI)
++ {
++ /* Use of the variable in some statement we don't know how to
++ analyze. */
++ bad_stmt = use_stmt;
++ reason = " is used in unanalyzable expression in ";
++ break;
++ }
++ }
++
++ if (bad_stmt && reason)
++ {
++ if (dump_file)
++ {
++ fprintf (dump_file, "Loop index ");
++ print_generic_expr (dump_file, var, 0);
++ fprintf (dump_file, "%s", reason);
++ print_gimple_stmt (dump_file, bad_stmt, 0, 0);
++ fprintf (dump_file, "\n");
++ }
++ pi->can_be_promoted_p = false;
++ }
++}
++
++/* Check that the uses and def of VAR, defined in STMT, conform to the
++ rules given above. */
++
++static bool
++analyze_loop_index (tree var, gimple stmt, void *data)
++{
++ struct promote_info *pi = (struct promote_info *) data;
++
++ if (dump_file)
++ {
++ fprintf (dump_file, "Analyzing loop index ");
++ print_generic_expr (dump_file, var, 0);
++ fprintf (dump_file, " defined in ");
++ print_gimple_stmt (dump_file, stmt, 0, 0);
++ fprintf (dump_file, "\n");
++ }
++
++ /* Check the definition. */
++ switch (gimple_code (stmt))
++ {
++ case GIMPLE_PHI:
++ /* Phi nodes are OK. */
++ break;
++
++ case GIMPLE_ASSIGN:
++ if (!check_rhs_for_promotability (pi, var, stmt,
++ /*is_assign=*/true))
++ break;
++ /* Fallthrough. */
++
++ default:
++ /* Something we can't handle or the variable is being loaded from
++ memory. */
++ pi->can_be_promoted_p = false;
++ goto done;
++ }
++
++ if (gimple_code (stmt) == GIMPLE_PHI)
++ {
++ unsigned int i;
++
++ for (i = 0; i < gimple_phi_num_args (stmt); i++)
++ {
++ tree arg = PHI_ARG_DEF (stmt, i);
++
++ if (TREE_CODE (arg) == SSA_NAME)
++ pointer_set_insert (promotable_names, arg);
++ }
++
++ analyze_loop_index_uses (PHI_RESULT (stmt), pi);
++ }
++ else
++ analyze_loop_index_uses (var, pi);
++
++ /* Only worth continuing if we think the loop index can be
++ promoted. */
++ done:
++ if (dump_file)
++ {
++ fprintf (dump_file, "Done analyzing ");
++ print_generic_expr (dump_file, var, 0);
++ fprintf (dump_file, " defined in ");
++ print_gimple_stmt (dump_file, stmt, 0, 0);
++ fprintf (dump_file, "...%s to analyze\n\n",
++ pi->can_be_promoted_p ? "continuing" : "not continuing");
++ }
++ return !pi->can_be_promoted_p;
++}
++
++/* Determine whether T is an INTEGER_CST or a single-use SSA_NAME
++ defined as the result of a NOP_EXPR or CONVERT_EXPR. Return the
++ operand of the NOP_EXPR or CONVERT_EXPR if so. */
++
++static tree
++upcast_operand_p (tree t)
++{
++ gimple def;
++
++ if (TREE_CODE (t) == INTEGER_CST)
++ return t;
++
++ if (TREE_CODE (t) != SSA_NAME
++ || !has_single_use (t))
++ return NULL_TREE;
++
++ def = SSA_NAME_DEF_STMT (t);
++ if (gimple_code (def) != GIMPLE_ASSIGN)
++ return NULL_TREE;
++
++ if (gimple_assign_rhs_code (def) != CONVERT_EXPR
++ && gimple_assign_rhs_code (def) != NOP_EXPR)
++ return NULL_TREE;
++
++ return gimple_assign_rhs1 (def);
++}
++
++/* Check for the idiom:
++
++ short x, y;
++ unsigned short x.2, y.2, tmp;
++ ...
++ x.2 = (unsigned short) x;
++ y.2 = (unsigned short) y;
++ tmp = x.2 + y.2;
++ x = (short) tmp;
++
++ which is generated by convert for avoiding signed arithmetic
++ overflow. RHS is TMP in the above statement. If RHS is
++ defined via such an idiom, store x and y into *OP0 and *OP1,
++ respectively. We permit y.2 to be a constant if necessary. */
++
++static bool
++signed_arithmetic_overflow_idiom_p (tree rhs, tree *op0, tree *op1)
++{
++ gimple op_stmt = SSA_NAME_DEF_STMT (rhs);
++ tree x2, y2;
++ bool yes = false;
++ enum tree_code code;
++
++ if (!has_single_use (rhs)
++ || gimple_code (op_stmt) != GIMPLE_ASSIGN)
++ goto done;
++
++ /* This could probably profitably be expanded to consider
++ MINUS_EXPR, MULT_EXPR, etc. */
++ code = gimple_assign_rhs_code (op_stmt);
++ if (code != PLUS_EXPR)
++ goto done;
++ x2 = gimple_assign_rhs1 (op_stmt);
++ y2 = gimple_assign_rhs2 (op_stmt);
++
++ x2 = upcast_operand_p (x2);
++ if (x2 == NULL_TREE)
++ goto done;
++ y2 = upcast_operand_p (y2);
++ if (y2 == NULL_TREE)
++ goto done;
++
++ *op0 = x2;
++ *op1 = y2;
++ yes = true;
++
++ done:
++ return yes;
++}
++
++/* Simple wrapper around flow_bb_inside_loop_p that handles NULL
++ statements and initial definitions of variables. */
++
++static bool
++stmt_in_loop_p (gimple t, struct loop *loop)
++{
++ basic_block bb;
++
++ if (t == NULL)
++ return false;
++
++ bb = gimple_bb (t);
++ if (bb == NULL)
++ return false;
++
++ return flow_bb_inside_loop_p (loop, bb);
++}
++
++/* The loop index should have a specific usage pattern:
++
++ - It should be defined in a phi node with two incoming values:
++
++ LI_phi = PHI (LI_out, LI_in)
++
++ - One incoming value, LI_out, should be from outside the loop.
++
++ - The other incoming value, LI_in, should be defined thusly:
++
++ LI_in = LI_phi + increment
++
++ - increment should be 1. We permit other increments with
++ -funsafe-loop-optimizations.
++
++ - Finally, in the comparison to exit the loop, the loop index must be
++ compared against a variable that has a type at least as precise as
++ the loop index's type. For instance, something like:
++
++ char limit;
++ short i;
++
++ for (i = 0; i < limit; i++) ...
++
++ would not be permitted. */
++
++static bool
++analyze_loop_index_definition_pattern (struct promote_info *pi)
++{
++ gimple phi = SSA_NAME_DEF_STMT (pi->loop_index_name);
++ bool ok = false, warn = false;
++ tree in0, in1;
++ bool inside0, inside1;
++ gimple def0, def1;
++ tree op0, op1, increment = NULL_TREE;
++
++ if (gimple_code (phi) != GIMPLE_PHI
++ || gimple_phi_num_args (phi) != 2)
++ goto done;
++
++ in0 = PHI_ARG_DEF (phi, 0);
++ in1 = PHI_ARG_DEF (phi, 1);
++
++ /* Figure out which value comes from outside the loop. */
++ def0 = TREE_CODE (in0) == SSA_NAME ? SSA_NAME_DEF_STMT (in0) : NULL;
++ def1 = TREE_CODE (in1) == SSA_NAME ? SSA_NAME_DEF_STMT (in1) : NULL;
++
++ inside0 = stmt_in_loop_p (def0, pi->loop);
++ inside1 = stmt_in_loop_p (def1, pi->loop);
++
++ if (inside0 && inside1)
++ goto done;
++ else if (inside0)
++ {
++ tree t = in0;
++ gimple g;
++ in0 = in1;
++ in1 = t;
++ g = def0;
++ def0 = def1;
++ def1 = g;
++ }
++ else if (!inside1)
++ goto done;
++
++ /* IN0 comes from outside the loop, IN1 from inside. Analyze IN1. */
++ if (gimple_code (def1) != GIMPLE_ASSIGN)
++ goto done;
++
++ switch (gimple_assign_rhs_code (def1))
++ {
++ case CONVERT_EXPR:
++ case NOP_EXPR:
++ if (!signed_arithmetic_overflow_idiom_p (gimple_assign_rhs1 (def1),
++ &op0, &op1))
++ goto done;
++ goto plus;
++ case PLUS_EXPR:
++ op0 = gimple_assign_rhs1 (def1);
++ op1 = gimple_assign_rhs2 (def1);
++ plus:
++ {
++ bool op0_li = op0 == PHI_RESULT (phi);
++ bool op1_li = op1 == PHI_RESULT (phi);
++ if (op0_li && op1_li)
++ /* This is weird, and definitely is not a case we can support
++ for promotion. */
++ goto done;
++ else if (op0_li)
++ increment = op1;
++ else if (op1_li)
++ increment = op0;
++ else
++ goto done;
++ break;
++ }
++ default:
++ break;
++ }
++
++
++ /* Check that the exit condition for the loop is OK. */
++ {
++ enum tree_code code = gimple_cond_code (pi->exit_expr);
++
++ op0 = gimple_cond_lhs (pi->exit_expr);
++ op1 = gimple_cond_rhs (pi->exit_expr);
++
++ if (op0 == pi->loop_limit)
++ {
++ tree t = op0;
++ op0 = op1;
++ op1 = t;
++ code = swap_tree_comparison (code);
++ }
++
++ if (code != LT_EXPR && code != LE_EXPR)
++ goto done;
++
++ if (!types_compatible_p (TREE_TYPE (pi->loop_index_name),
++ TREE_TYPE (pi->loop_limit)))
++ {
++ switch (TREE_CODE (pi->loop_limit))
++ {
++ case INTEGER_CST:
++ if (!int_fits_type_p (pi->loop_limit,
++ TREE_TYPE (pi->loop_index_name)))
++ goto done;
++ break;
++ case SSA_NAME:
++ {
++ tree v = pi->loop_limit;
++ gimple def = SSA_NAME_DEF_STMT (v);
++
++ /* Backtrack through CONVERT_EXPRs and/or NOP_EXPRs to
++ determine if the variables "started out" as the same
++ type. */
++ while (gimple_code (def) == GIMPLE_ASSIGN)
++ {
++ enum tree_code rhs_code = gimple_assign_rhs_code (def);
++
++ if (rhs_code != NOP_EXPR && rhs_code != CONVERT_EXPR)
++ break;
++
++ v = gimple_assign_rhs1 (def);
++ def = SSA_NAME_DEF_STMT (v);
++ }
++ /* Permit comparisons between non-compatible types with
++ flag_unsafe_loop_optimizations, since we can assume the
++ loop index does not overflow. */
++ if (types_compatible_p (TREE_TYPE (pi->loop_index_name),
++ TREE_TYPE (v))
++ || flag_unsafe_loop_optimizations)
++ break;
++ /* Fallthrough. */
++ default:
++ goto done;
++ }
++ }
++ }
++ }
++
++ if (increment == NULL_TREE)
++ goto done;
++ if (TREE_CODE (increment) != INTEGER_CST
++ || compare_tree_int (increment, 1) != 0)
++ {
++ warn = true;
++ if (!flag_unsafe_loop_optimizations)
++ goto done;
++ }
++
++ ok = true;
++ done:
++ if (warn && !pi->warned)
++ {
++ pi->warned = true;
++ /* We can promote unsigned indices only if -funsafe-loop-optimizations
++ is in effect, since the user might be depending on the modulo
++ wraparound behavior of unsigned types. */
++ if (warn_unsafe_loop_optimizations)
++ {
++ const char *wording;
++
++ wording = (flag_unsafe_loop_optimizations
++ ? N_("assuming that the loop counter does not overflow")
++ : N_("cannot optimize loop, the loop counter may overflow"));
++ warning (OPT_Wunsafe_loop_optimizations, "%s", gettext (wording));
++ }
++ }
++
++ return ok;
++}
++
++/* Analyze the loop associated with PI_ to see if its loop index can be
++ promoted. */
++
++static bool
++analyze_loop (const void *pi_, void *data)
++{
++ struct promote_info *pi = CONST_CAST (struct promote_info *,
++ (const struct promote_info *) pi_);
++ bool *changed = (bool *) data;
++
++ /* We previously determined we can't promote this; go ahead and
++ continue iterating. */
++ if (pi->loop_index_name == NULL_TREE)
++ return true;
++
++ /* Assume we can always promote the loop index, even if it doesn't
++ exist. */
++ pi->can_be_promoted_p = true;
++
++ if (dump_file)
++ {
++ fprintf (dump_file, "Analyzing ");
++ print_generic_expr (dump_file, pi->loop_index_name, 0);
++ fprintf (dump_file, "\n");
++ }
++
++ if (pi->loop_index_name
++ && analyze_loop_index_definition_pattern (pi))
++ {
++ /* Clear any previously gathered information. */
++ VEC_truncate (tree, pi->cast_types, 0);
++ VEC_truncate (int, pi->cast_counts, 0);
++
++ walk_use_def_chains (pi->loop_index_name, analyze_loop_index, pi, false);
++ }
++ else
++ pi->can_be_promoted_p = false;
++
++ /* If we determined the loop index is used in strange ways, clear it
++ so we don't examine it again. */
++ if (!pi->can_be_promoted_p)
++ pi->loop_index_name = NULL_TREE;
++
++ /* Let our caller know whether to re-do the analysis. */
++ *changed = *changed || !pi->can_be_promoted_p;
++ /* Continue if PI is promotable. */
++ return pi->can_be_promoted_p;
++}
++
++/* Add PI_->LOOP_INDEX_NAME to the set of variables, DATA, that we are
++ considering for promotion. */
++
++static bool
++add_variable (const void *pi_, void *data ATTRIBUTE_UNUSED)
++{
++ const struct promote_info *pi = (const struct promote_info *) pi_;
++ struct pointer_set_t *pset = (struct pointer_set_t *) data;
++ int presentp;
++
++ if (pi->loop_index_name != NULL_TREE)
++ {
++ presentp = pointer_set_insert (pset, pi->loop_index_name);
++ gcc_assert (!presentp);
++ }
++
++ /* Continue traversal. */
++ return true;
++}
++
++/* For each promotable variable:
++
++ - create a new, promoted VAR_DECL;
++
++ - walk through all the uses and defs and create new statements using
++ the promoted variables. We don't create new phi nodes; post-pass
++ SSA update will handle those for us. */
++
++/* Make dump files readable. */
++#define PROMOTED_VAR_SUFFIX ".promoted"
++
++/* Create a variable NAME with TYPE and do the necessary work to inform
++ the SSA machinery about it. */
++
++static tree
++create_pli_var (tree type, char *name)
++{
++ tree var = create_tmp_var (type, name);
++ create_var_ann (var);
++ mark_sym_for_renaming (var);
++ add_referenced_var (var);
++ return var;
++}
++
++/* Associate the SSA_NAME VAR with the promoted variable DATA. */
++
++static bool
++associate_name_with_var (tree var, gimple def_stmt, void *data)
++{
++ tree promoted_var = (tree) data;
++ void **p;
++
++ gcc_assert (promoted_var != NULL_TREE);
++
++ if (gimple_code (def_stmt) == GIMPLE_PHI)
++ var = PHI_RESULT (def_stmt);
++
++ p = pointer_map_insert (variable_map, var);
++
++ if (!*p)
++ {
++ if (dump_file)
++ {
++ fprintf (dump_file, "Associating ");
++ print_generic_expr (dump_file, var, 0);
++ fprintf (dump_file, " with ");
++ print_generic_expr (dump_file, promoted_var, 0);
++ fprintf (dump_file, "\n\n");
++ }
++ *(tree *)p = promoted_var;
++ }
++
++ /* Continue traversal. */
++ return false;
++}
++
++/* Create a promoted variable for the variable from PI_. */
++
++static bool
++create_promoted_variable (const void *pi_, void *data ATTRIBUTE_UNUSED)
++{
++ struct promote_info *pi = CONST_CAST (struct promote_info *,
++ (const struct promote_info *) pi_);
++
++ if (pi->can_be_promoted_p)
++ {
++ tree type = choose_profitable_promoted_type (pi);
++ tree orig_name = DECL_NAME (pi->var_decl);
++ size_t id_len = IDENTIFIER_LENGTH (orig_name);
++ size_t name_len = id_len + strlen (PROMOTED_VAR_SUFFIX) + 1;
++ char *name;
++
++ name = (char *) alloca (name_len);
++ strcpy (name, IDENTIFIER_POINTER (orig_name));
++ strcpy (name + id_len, PROMOTED_VAR_SUFFIX);
++
++ pi->promoted_type = type;
++ pi->promoted_var = create_pli_var (type, name);
++
++ if (dump_file)
++ {
++ fprintf (dump_file, "Created new variable ");
++ print_generic_expr (dump_file, pi->promoted_var, 0);
++ fprintf (dump_file, " to stand in for ");
++ print_generic_expr (dump_file, pi->loop_index_name, 0);
++ fprintf (dump_file, "\n\n");
++ }
++
++ walk_use_def_chains (pi->loop_index_name,
++ associate_name_with_var,
++ pi->promoted_var, false);
++ }
++
++ /* Continue traversal. */
++ return true;
++}
++
++/* Rebuild T with newly promoted variables; STMT is the original
++ statement in which T appeared and may be equivalent to T. TYPE is
++ non-null when rebuilding the rhs of a GIMPLE_ASSIGN and indicates the
++ type of the lhs. */
++
++static tree
++rebuild_tree_with_promotion (tree t, gimple stmt, tree type,
++ gimple_stmt_iterator gsi,
++ struct promote_info *pi)
++{
++ tree op0, op1;
++
++ switch (TREE_CODE (t))
++ {
++ case NOP_EXPR:
++ case CONVERT_EXPR:
++ {
++ tree pvar = rebuild_tree_with_promotion (TREE_OPERAND (t, 0), stmt, type, gsi, pi);
++
++ if (types_compatible_p (type, TREE_TYPE (pvar)))
++ return pvar;
++ else
++ return build1 (TREE_CODE (t), type, pvar);
++ }
++ case INTEGER_CST:
++ {
++ return build_int_cst_wide (pi->promoted_type,
++ TREE_INT_CST_LOW (t),
++ TREE_INT_CST_HIGH (t));
++ }
++ case COND_EXPR:
++ {
++ tree orig_op0 = TREE_OPERAND (t, 0);
++ op0 = rebuild_tree_with_promotion (orig_op0, stmt, type, gsi, pi);
++ gcc_assert (orig_op0 != op0);
++ TREE_OPERAND (t, 0) = op0;
++ return t;
++ }
++ case PLUS_EXPR:
++ case MINUS_EXPR:
++ case MULT_EXPR:
++ type = pi->promoted_type;
++ goto binary_expr;
++ case EQ_EXPR:
++ case NE_EXPR:
++ case LT_EXPR:
++ case LE_EXPR:
++ case GT_EXPR:
++ case GE_EXPR:
++ type = TREE_TYPE (t);
++ binary_expr:
++ op0 = TREE_OPERAND (t, 0);
++ op1 = TREE_OPERAND (t, 1);
++ op0 = rebuild_tree_with_promotion (op0, stmt, type, gsi, pi);
++ op1 = rebuild_tree_with_promotion (op1, stmt, type, gsi, pi);
++ return build2 (TREE_CODE (t), type, op0, op1);
++ case SSA_NAME:
++ {
++ void **p = pointer_map_contains (variable_map, t);
++
++ if (p == NULL)
++ {
++ /* This is unexpected, but it does happen if we were dealing
++ with COND_EXPRs and such. Just go ahead and create a
++ temporary for it. */
++ if (types_compatible_p (TREE_TYPE (t), pi->promoted_type)
++ || SSA_NAME_DEF_STMT (t) == stmt)
++ return t;
++ else
++ goto insert_cast;
++ }
++ else
++ return *(tree *)p;
++ }
++ case VAR_DECL:
++ return t;
++ default:
++ insert_cast:
++ {
++ gimple cast;
++ tree tmp, nop;
++ tree to_upcast = t;
++
++ /* If we are dealing with a memory reference, then we can't have
++ wrap it in a NOP_EXPR; we need to load the value from memory
++ first, then convert it. */
++ if (!is_gimple_reg (to_upcast))
++ {
++ tree tmp = create_pli_var (TREE_TYPE (to_upcast),
++ CONST_CAST (char *, "loadtmp"));
++ gimple stmt = gimple_build_assign (tmp, to_upcast);
++ gsi_insert_before (&gsi, stmt, GSI_SAME_STMT);
++ to_upcast = tmp;
++ }
++
++ tmp = create_pli_var (pi->promoted_type,
++ CONST_CAST (char *, "promotetmp"));
++ nop = build1 (NOP_EXPR, pi->promoted_type, to_upcast);
++ cast = gimple_build_assign (tmp, nop);
++ if (dump_file)
++ {
++ fprintf (dump_file, "Inserting cast ");
++ print_gimple_stmt (dump_file, cast, 0, 0);
++ fprintf (dump_file, " prior to ");
++ print_gimple_stmt (dump_file, stmt, 0, 0);
++ fprintf (dump_file, "\n");
++ }
++ gsi_insert_before (&gsi, cast, GSI_SAME_STMT);
++ return tmp;
++ }
++ }
++}
++
++/* Split E and place STMT in the block created by doing so. */
++
++static void
++insert_along_edge (gimple stmt, edge e)
++{
++ basic_block bb = split_edge (e);
++
++ gimple_set_bb (stmt, bb);
++ set_bb_seq (bb, gimple_seq_alloc_with_stmt (stmt));
++}
++
++/* Rebuild STMT, which contains uses or a def of the promotable variable
++ associated with PI. */
++
++static void
++rebuild_with_promotion (gimple stmt, struct promote_info *pi)
++{
++ gimple_stmt_iterator gsi;
++
++ if (pointer_set_insert (promoted_stmts, stmt))
++ return;
++
++ if (dump_file)
++ {
++ fprintf (dump_file, "Rebuilding stmt ");
++ print_gimple_stmt (dump_file, stmt, 0, 0);
++ fprintf (dump_file, "\n");
++ }
++
++ gsi = gsi_for_stmt (stmt);
++
++ switch (gimple_code (stmt))
++ {
++ case GIMPLE_ASSIGN:
++ {
++ enum tree_code subcode = gimple_assign_rhs_code (stmt);
++ enum tree_code newcode = subcode;
++ tree lhs = gimple_assign_lhs (stmt);
++ tree rhs1 = gimple_assign_rhs1 (stmt);
++ tree rhs2 = gimple_assign_rhs2 (stmt);
++ tree x, y;
++ void **v;
++
++ /* If we are defining a promotable variable, check for special
++ idioms. */
++ v = pointer_map_contains (variable_map, lhs);
++ if (v != NULL
++ && *(tree *)v == pi->promoted_var
++ && (subcode == NOP_EXPR || subcode == CONVERT_EXPR)
++ && signed_arithmetic_overflow_idiom_p (rhs1, &x, &y))
++ {
++ void **xp;
++ void **yp;
++ if (TYPE_PRECISION (TREE_TYPE (rhs1))
++ >= TYPE_PRECISION (pi->promoted_type))
++ goto done;
++
++ /* It's possible that we've already promoted the operands of
++ one or both of the NOP_EXPRs. In that case, we can
++ bypass the logic below and go straight to rebuilding the
++ rhs that we really want to transform. */
++ if (TREE_CODE (x) == VAR_DECL
++ || TREE_CODE (y) == VAR_DECL)
++ goto build_fake;
++ xp = pointer_map_contains (variable_map, x);
++ yp = pointer_map_contains (variable_map, y);
++
++ /* Nothing to see here. */
++ if (!types_compatible_p (TREE_TYPE (x),
++ TREE_TYPE (y))
++ || (xp == NULL && yp == NULL))
++ goto done;
++ x = (xp == NULL ? NULL_TREE : *(tree *)xp);
++ y = (yp == NULL ? NULL_TREE : *(tree *)yp);
++
++ if (x != pi->promoted_var && y != pi->promoted_var)
++ goto done;
++
++ build_fake:
++ newcode = PLUS_EXPR;
++ rhs1 = x;
++ rhs2 = y;
++ if (dump_file)
++ {
++ fprintf (dump_file, "Substituting ");
++ print_generic_expr (dump_file, x, 0);
++ fprintf (dump_file, " + ");
++ print_generic_expr (dump_file, y, 0);
++ fprintf (dump_file, " for rhs of original statement\n");
++ }
++
++ done:
++ ;
++ }
++
++ lhs = rebuild_tree_with_promotion (lhs, stmt, NULL, gsi, pi);
++ rhs1 = rebuild_tree_with_promotion (rhs1, stmt, NULL, gsi, pi);
++ if (rhs2)
++ rhs2 = rebuild_tree_with_promotion (rhs2, stmt, NULL, gsi, pi);
++
++ if (newcode != subcode)
++ {
++ gimple newstmt = gimple_build_assign_with_ops (newcode,
++ lhs, rhs1, rhs2);
++ gsi_replace (&gsi, newstmt, true);
++ stmt = newstmt;
++ }
++ else
++ {
++ gimple_assign_set_lhs (stmt, lhs);
++ gimple_assign_set_rhs1 (stmt, rhs1);
++ if (rhs2)
++ gimple_assign_set_rhs2 (stmt, rhs2);
++ }
++ }
++ break;
++ case GIMPLE_COND:
++ {
++ tree lhs = gimple_cond_lhs (stmt);
++ tree rhs = gimple_cond_rhs (stmt);
++
++ lhs = rebuild_tree_with_promotion (lhs, stmt, NULL, gsi, pi);
++ rhs = rebuild_tree_with_promotion (rhs, stmt, NULL, gsi, pi);
++
++ gimple_cond_set_lhs (stmt, lhs);
++ gimple_cond_set_rhs (stmt, rhs);
++ }
++ break;
++ case GIMPLE_PHI:
++ {
++ unsigned int i;
++ bool promoted_result = could_be_promoted (PHI_RESULT (stmt));
++
++ for (i = 0; i < gimple_phi_num_args (stmt); i++)
++ {
++ tree var = gimple_phi_arg_def (stmt, i);
++ edge e = gimple_phi_arg_edge (stmt, i);
++ gimple assign = NULL;
++
++ if (TREE_CODE (var) == INTEGER_CST && promoted_result)
++ {
++ tree cst = build_int_cst_wide (pi->promoted_type,
++ TREE_INT_CST_LOW (var),
++ TREE_INT_CST_HIGH (var));
++
++ assign = gimple_build_assign (pi->promoted_var, cst);
++ insert_along_edge (assign, e);
++ }
++ else if (TREE_CODE (var) == SSA_NAME
++ && SSA_NAME_VAR (var) == pi->var_decl
++ && !promoted_result)
++ {
++ tree t = create_pli_var (TREE_TYPE (PHI_RESULT (stmt)),
++ CONST_CAST (char *, "promotetmp"));
++ tree name;
++ assign = gimple_build_assign_with_ops (CONVERT_EXPR,
++ t, pi->promoted_var,
++ NULL_TREE);
++
++ name = make_ssa_name (t, assign);
++ gimple_assign_set_lhs (assign, name);
++
++ insert_along_edge (assign, e);
++ SET_PHI_ARG_DEF (stmt, i, name);
++ }
++ }
++ }
++ break;
++ default:
++ gcc_unreachable ();
++ }
++
++ if (dump_file)
++ {
++ fprintf (dump_file, "Converted stmt ");
++ print_gimple_stmt (dump_file, stmt, 0, 0);
++ fprintf (dump_file, "\n\n");
++ }
++ update_stmt (stmt);
++}
++
++/* Helper function for promote_variable that walks over use/def
++ chains. */
++
++static bool
++promote_variable_1 (tree var, gimple stmt, void *data)
++{
++ struct promote_info *pi = (struct promote_info *) data;
++ imm_use_iterator imi;
++ gimple use_stmt;
++
++ rebuild_with_promotion (stmt, pi);
++
++ if (gimple_code (stmt) == GIMPLE_PHI)
++ var = PHI_RESULT (stmt);
++
++ if (could_be_promoted (var))
++ FOR_EACH_IMM_USE_STMT (use_stmt, imi, var)
++ {
++ rebuild_with_promotion (use_stmt, pi);
++ }
++
++ return false;
++}
++
++/* Convert all uses and defs of PI_->LOOP_INDEX_NAME as linked by
++ use-def chains to uses and defs of PI_->PROMOTED_VAR. */
++
++static bool
++promote_variable (const void *pi_, void *data ATTRIBUTE_UNUSED)
++{
++ const struct promote_info *pi = (const struct promote_info *) pi_;
++
++ if (pi->can_be_promoted_p)
++ {
++ walk_use_def_chains (pi->loop_index_name, promote_variable_1,
++ CONST_CAST (struct promote_info *, pi), false);
++ }
++
++ /* Continue traversal. */
++ return true;
++}
++
++/* Free PI_ and its associated data. */
++
++static bool
++free_pi_entries (const void *pi_, void *data ATTRIBUTE_UNUSED)
++{
++ struct promote_info *pi = CONST_CAST (struct promote_info *,
++ (const struct promote_info *) pi_);
++
++ VEC_free (tree, heap, pi->cast_types);
++ VEC_free (int, heap, pi->cast_counts);
++ free (pi);
++
++ /* Continue traversal. */
++ return true;
++}
++
++/* Collect information about variables that we believe to be loop
++ indices in PROMOTION_INFO. */
++
++static void
++collect_promotion_candidates (void)
++{
++ loop_iterator li;
++ struct loop *loop;
++
++ FOR_EACH_LOOP (li, loop, 0)
++ {
++ basic_block header = loop->header;
++ gimple exit_cond = last_stmt (header);
++
++ if (exit_cond && gimple_code (exit_cond) == GIMPLE_COND)
++ {
++ tree loop_index;
++ tree limit = NULL_TREE;
++ tree decl;
++ struct promote_info *pi;
++
++ loop_index = find_promotion_candidate (loop, exit_cond, &limit);
++ if (loop_index == NULL_TREE)
++ continue;
++ decl = SSA_NAME_VAR (loop_index);
++ if (TREE_ADDRESSABLE (decl))
++ continue;
++
++ if (dump_file)
++ {
++ fprintf (dump_file, "Found loop index ");
++ print_generic_expr (dump_file, loop_index, 0);
++ fprintf (dump_file, " involved in ");
++ print_gimple_stmt (dump_file, exit_cond, 0, 0);
++ fprintf (dump_file, "\n\n");
++ }
++
++ pi = XCNEW (struct promote_info);
++ pi->loop = loop;
++ pi->exit_expr = exit_cond;
++ pi->loop_index_name = loop_index;
++ pi->loop_limit = limit;
++ pi->var_decl = decl;
++ /* We think so, anyway... */
++ pi->can_be_promoted_p = true;
++ pointer_set_insert (promotion_info, pi);
++ }
++ else if (dump_file)
++ {
++ fprintf (dump_file, "\nSkipping analysis of loop %d (header bb #%d)\n",
++ loop->num, loop->header->index);
++ if (exit_cond)
++ {
++ fprintf (dump_file, "Exit condition was ");
++ print_gimple_stmt (dump_file, exit_cond, 0, 0);
++ fprintf (dump_file, "\n");
++ }
++ }
++ }
++}
++
++/* Free memory associated with global variables that we used. */
++
++static void
++pli_cleanup (void)
++{
++ if (promoted_stmts)
++ {
++ pointer_set_destroy (promoted_stmts);
++ promoted_stmts = NULL;
++ }
++ if (variable_map)
++ {
++ pointer_map_destroy (variable_map);
++ variable_map = NULL;
++ }
++ if (promotable_names)
++ {
++ pointer_set_destroy (promotable_names);
++ promotable_names = NULL;
++ }
++ if (promotion_info)
++ {
++ pointer_set_traverse (promotion_info, free_pi_entries, NULL);
++ pointer_set_destroy (promotion_info);
++ promotion_info = NULL;
++ }
++}
++
++/* The guts of the pass. */
++
++static unsigned int
++promote_short_indices (void)
++{
++ bool did_something = false;
++ bool changed;
++ size_t max_iterations, i, n_promoted;
++
++ promotion_info = pointer_set_create ();
++ collect_promotion_candidates ();
++
++ if (dump_file)
++ fprintf (dump_file, "Found %d candidates for promotion\n",
++ (int) pointer_set_n_elements (promotion_info));
++
++ /* Nothing to do. */
++ if (pointer_set_n_elements (promotion_info) == 0)
++ goto cleanup;
++
++ /* We have information about which variables are loop index variables.
++ We now need to determine the promotability of the loop indices.
++ Since the promotability of loop indices may depend on other loop
++ indices, we need to repeat this until we reach a fixed point. */
++ changed = true;
++ max_iterations = pointer_set_n_elements (promotion_info);
++ i = 0;
++
++ promotable_names = pointer_set_create ();
++
++ while (changed)
++ {
++ changed = false;
++ pointer_set_clear (promotable_names);
++ pointer_set_traverse (promotion_info, add_variable,
++ promotable_names);
++ n_promoted = pointer_set_n_elements (promotable_names);
++
++ if (dump_file)
++ fprintf (dump_file, "\nIteration %d, have %d variables to consider\n",
++ (int) i, (int) n_promoted);
++
++ if (n_promoted == 0)
++ break;
++ gcc_assert (i < max_iterations);
++ pointer_set_traverse (promotion_info, analyze_loop, &changed);
++ i++;
++ }
++
++ if (dump_file)
++ fprintf (dump_file, "Promoting %d variables\n",
++ (int) n_promoted);
++
++ if (n_promoted != 0)
++ {
++ did_something = true;
++ variable_map = pointer_map_create ();
++ promoted_stmts = pointer_set_create ();
++ pointer_set_traverse (promotion_info, create_promoted_variable, NULL);
++ pointer_set_traverse (promotion_info, promote_variable, NULL);
++ }
++
++ cleanup:
++ pli_cleanup ();
++ return did_something ? TODO_update_ssa : 0;
++}
++
++/* Entry point for the short loop index promotion pass. */
++
++static unsigned int
++tree_short_index_promotion (void)
++{
++ unsigned int changed = 0;
++
++ /* Initialize all the necessary loop infrastructure. */
++ loop_optimizer_init (LOOPS_HAVE_PREHEADERS | LOOPS_HAVE_SIMPLE_LATCHES | LOOPS_HAVE_RECORDED_EXITS);
++ add_noreturn_fake_exit_edges ();
++ connect_infinite_loops_to_exit ();
++
++ if (number_of_loops () > 1)
++ changed = promote_short_indices ();
++
++ /* Tear down loop optimization infrastructure. */
++ remove_fake_exit_edges ();
++ free_numbers_of_iterations_estimates ();
++ loop_optimizer_finalize ();
++
++ return changed;
++}
++
++static bool
++gate_short_index_promotion (void)
++{
++ return optimize > 0 && flag_promote_loop_indices;
++}
++
++struct gimple_opt_pass pass_promote_indices =
++{
++ {
++ GIMPLE_PASS,
++ "promoteshort", /* name */
++ gate_short_index_promotion, /* gate */
++ tree_short_index_promotion, /* execute */
++ NULL, /* sub */
++ NULL, /* next */
++ 0, /* static_pass_number */
++ TV_TREE_LOOP_PROMOTE, /* tv_id */
++ PROP_cfg | PROP_ssa, /* properties_required */
++ 0, /* properties_provided */
++ 0, /* properties_destroyed */
++ 0, /* todo_flags_start */
++ TODO_dump_func | TODO_verify_loops
++ | TODO_ggc_collect /* todo_flags_finish */
++ }
++};
+diff -Nur a/gcc/tree-ssa-pre.c b/gcc/tree-ssa-pre.c
+--- a/gcc/tree-ssa-pre.c 2009-02-20 16:20:38.000000000 +0100
++++ b/gcc/tree-ssa-pre.c 2010-01-25 09:50:29.595686516 +0100
+@@ -104,6 +104,10 @@
+ In order to make it fully redundant, we insert the expression into
+ the predecessors where it is not available, but is ANTIC.
+
++ When optimizing for size, we only eliminate the partial redundancy
++ if we need to insert in only one predecessor. This avoids almost
++ completely the code size increase that PRE usually causes.
++
+ For the partial anticipation case, we only perform insertion if it
+ is partially anticipated in some block, and fully available in all
+ of the predecessors.
+@@ -429,6 +433,7 @@
+ static void bitmap_value_insert_into_set (bitmap_set_t, pre_expr);
+ static void bitmap_value_replace_in_set (bitmap_set_t, pre_expr);
+ static void bitmap_set_copy (bitmap_set_t, bitmap_set_t);
++static void bitmap_set_and (bitmap_set_t, bitmap_set_t);
+ static bool bitmap_set_contains_value (bitmap_set_t, unsigned int);
+ static void bitmap_insert_into_set (bitmap_set_t, pre_expr);
+ static void bitmap_insert_into_set_1 (bitmap_set_t, pre_expr, bool);
+@@ -2988,13 +2993,6 @@
+ tree temp;
+ gimple phi;
+
+- if (dump_file && (dump_flags & TDF_DETAILS))
+- {
+- fprintf (dump_file, "Found partial redundancy for expression ");
+- print_pre_expr (dump_file, expr);
+- fprintf (dump_file, " (%04d)\n", val);
+- }
+-
+ /* Make sure we aren't creating an induction variable. */
+ if (block->loop_depth > 0 && EDGE_COUNT (block->preds) == 2
+ && expr->kind != REFERENCE)
+@@ -3192,6 +3190,47 @@
+ }
+
+
++/* Indicate if, when optimizing for speed, it is appropriate to make
++ INSERTS_NEEDED insertions in order to make EXPR in BLOCK redundant. */
++static bool
++ppre_n_insert_for_speed_p (pre_expr expr, basic_block block,
++ unsigned int inserts_needed)
++{
++ /* The more expensive EXPR is, the more we should be prepared to insert
++ in the predecessors of BLOCK to make EXPR fully redundant.
++ For now, only recognize AND, OR, XOR, PLUS and MINUS of a multiple-use
++ SSA_NAME with a constant as cheap. */
++ int cost;
++
++ if (flag_tree_pre_partial_partial_obliviously)
++ return true;
++ if (expr->kind == NARY)
++ {
++ vn_nary_op_t nary = PRE_EXPR_NARY (expr);
++ switch (nary->opcode)
++ {
++ tree name, cnst;
++ case BIT_AND_EXPR: case BIT_IOR_EXPR: case BIT_XOR_EXPR:
++ case PLUS_EXPR: case MINUS_EXPR:
++
++ gcc_assert (nary->length == 2);
++ name = nary->op[0];
++ cnst = nary->op[1];
++ if (TREE_CODE (name) != SSA_NAME || has_single_use (name))
++ return true;
++ if (!is_gimple_min_invariant (cnst))
++ return true;
++ cost = 1;
++ break;
++ default:
++ return true;
++ }
++ }
++ else
++ return true;
++ return EDGE_COUNT (block->preds) * cost >= inserts_needed;
++
++}
+
+ /* Perform insertion of partially redundant values.
+ For BLOCK, do the following:
+@@ -3226,6 +3265,7 @@
+ pre_expr *avail;
+ unsigned int val;
+ bool by_some = false;
++ unsigned int inserts_needed = 0;
+ bool cant_insert = false;
+ bool all_same = true;
+ pre_expr first_s = NULL;
+@@ -3280,6 +3320,7 @@
+ {
+ avail[bprime->index] = eprime;
+ all_same = false;
++ inserts_needed++;
+ }
+ else
+ {
+@@ -3289,6 +3330,11 @@
+ first_s = edoubleprime;
+ else if (!pre_expr_eq (first_s, edoubleprime))
+ all_same = false;
++ /* If the available value is not a NAME, PREing this
++ value will probably result in a copy on the edge
++ to assign the expression to a register. */
++ if (edoubleprime->kind != NAME)
++ inserts_needed++;
+ }
+ }
+ /* If we can insert it, it's not the same value
+@@ -3297,9 +3343,27 @@
+ partially redundant. */
+ if (!cant_insert && !all_same && by_some && dbg_cnt (treepre_insert))
+ {
+- if (insert_into_preds_of_block (block, get_expression_id (expr),
+- avail))
+- new_stuff = true;
++ if (dump_file && (dump_flags & TDF_DETAILS))
++ {
++ fprintf (dump_file,
++ "Found partial redundancy for expression ");
++ print_pre_expr (dump_file, expr);
++ fprintf (dump_file, " (%04d)\n", get_expr_value_id (expr));
++ }
++
++ /* If optimizing for size, insert at most one
++ new expression to avoid increasing code size. */
++ if (optimize_function_for_speed_p (cfun)
++ ? 1 : EDGE_COUNT (block->preds) - inserts_needed == 1)
++ new_stuff |=
++ insert_into_preds_of_block (block,
++ get_expression_id (expr),
++ avail);
++ else if (dump_file && (dump_flags & TDF_DETAILS))
++ fprintf (dump_file, "Not inserting (optimizing for %s)\n",
++ optimize_function_for_speed_p (cfun)
++ ? "speed" : "size");
++
+ }
+ /* If all edges produce the same value and that value is
+ an invariant, then the PHI has the same value on all
+@@ -3428,9 +3492,28 @@
+ if (!cant_insert && by_all && dbg_cnt (treepre_insert))
+ {
+ pre_stats.pa_insert++;
+- if (insert_into_preds_of_block (block, get_expression_id (expr),
+- avail))
+- new_stuff = true;
++ if (dump_file && (dump_flags & TDF_DETAILS))
++ {
++ fprintf (dump_file,
++ "Found partial redundancy for expression ");
++ print_pre_expr (dump_file, expr);
++ fprintf (dump_file, " (%04d)\n", get_expr_value_id (expr));
++ }
++ /* Assuming the expression is 50% anticipatable, we have to
++ multiply the number of insertions needed by two for a cost
++ comparison. */
++ if (!optimize_function_for_speed_p (cfun)
++ || ppre_n_insert_for_speed_p (expr, block,
++ 2 * EDGE_COUNT (block->preds)))
++ new_stuff |=
++ insert_into_preds_of_block (block,
++ get_expression_id (expr),
++ avail);
++ else if (dump_file && (dump_flags & TDF_DETAILS))
++ fprintf (dump_file, "Not inserting (optimizing for %s)\n",
++ optimize_function_for_speed_p (cfun)
++ ? "speed" : "size");
++
+ }
+ free (avail);
+ }
+@@ -3471,7 +3554,9 @@
+ if (!single_pred_p (block))
+ {
+ new_stuff |= do_regular_insertion (block, dom);
+- if (do_partial_partial)
++ /* Don't bother with partial-partial redundancies when
++ optimizing for size. */
++ if (do_partial_partial && ! optimize_function_for_size_p (cfun))
+ new_stuff |= do_partial_partial_insertion (block, dom);
+ }
+ }
+@@ -4220,11 +4305,11 @@
+ only wants to do full redundancy elimination. */
+
+ static unsigned int
+-execute_pre (bool do_fre ATTRIBUTE_UNUSED)
++execute_pre (bool do_fre)
+ {
+ unsigned int todo = 0;
+
+- do_partial_partial = optimize > 2;
++ do_partial_partial = flag_tree_pre_partial_partial;
+
+ /* This has to happen before SCCVN runs because
+ loop_optimizer_init may create new phis, etc. */
+@@ -4297,19 +4382,20 @@
+ return todo;
+ }
+
+-/* Gate and execute functions for PRE. */
++/* Gate and execute functions for FRE/PRE. */
+
+ static unsigned int
+ do_pre (void)
+ {
+- return TODO_rebuild_alias | execute_pre (false);
++ return TODO_rebuild_alias
++ | execute_pre (! flag_tree_pre);
+ }
+
+ static bool
+ gate_pre (void)
+ {
+- /* PRE tends to generate bigger code. */
+- return flag_tree_pre != 0 && optimize_function_for_speed_p (cfun);
++ /* Run FRE even if we don't run PRE. */
++ return (flag_tree_fre || flag_tree_pre);
+ }
+
+ struct gimple_opt_pass pass_pre =
+diff -Nur a/gcc/tree-ssa-remove-local-statics.c b/gcc/tree-ssa-remove-local-statics.c
+--- a/gcc/tree-ssa-remove-local-statics.c 1970-01-01 01:00:00.000000000 +0100
++++ b/gcc/tree-ssa-remove-local-statics.c 2010-01-25 09:50:29.595686516 +0100
+@@ -0,0 +1,868 @@
++/* Local static variable elimination pass.
++ Copyright (C) 2007 Free Software Foundation, Inc.
++ Contributed by Nathan Froyd <froydnj@codesourcery.com>
++
++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/>. */
++
++/* Converting static function-local variables to automatic variables.
++
++ The motivating example is a function like:
++
++ void
++ foo (unsigned n)
++ {
++ static int var;
++ unsigned i;
++
++ for (i = 0; i != n; i++)
++ {
++ var = ...
++
++ do other things with var...
++ }
++ }
++
++ Because VAR is static, doing things like code motion to loads and
++ stores of VAR is difficult. Furthermore, accesses to VAR are
++ inefficient. This pass aims to recognize the cases where it is not
++ necessary for VAR to be static and modify the code so that later
++ passes will do the appropriate optimizations.
++
++ The criteria for a static function-local variable V in a function F
++ being converted to an automatic variable are:
++
++ 1. F does not call setjmp; and
++ 2. V's address is never taken; and
++ 3. V is not declared volatile; and
++ 4. V is not used in any nested function;
++ 5. V is not an aggregate value (union, struct, array, etc.); and
++ 6. Every use of V is defined along all paths leading to the use.
++
++ NOTE: For ease of implementation, we currently treat a function call
++ as killing all previous definitions of static variables, since we
++ could have:
++
++ static void
++ foo (...)
++ {
++ static int x;
++
++ x = ...; (1)
++
++ f (...); (2)
++
++ ... = x; (3)
++ }
++
++ The use at (3) needs to pick up a possible definition made by the
++ call at (2). If the call at (2) does not call back into 'foo',
++ then the call is not a killing call. We currently treat it as
++ though it is. */
++
++#include "config.h"
++#include "system.h"
++#include "coretypes.h"
++#include "tm.h"
++
++#include "rtl.h"
++#include "tm_p.h"
++#include "hard-reg-set.h"
++#include "obstack.h"
++#include "basic-block.h"
++
++#include "tree.h"
++#include "gimple.h"
++#include "hashtab.h"
++#include "diagnostic.h"
++#include "tree-flow.h"
++#include "tree-dump.h"
++#include "flags.h"
++#include "timevar.h"
++#include "tree-pass.h"
++
++struct rls_decl_info
++{
++ /* The variable declaration. */
++ tree orig_var;
++
++ /* Its index in rls_block_local_data. */
++ int index;
++
++ /* Whether we can optimize this variable. */
++ bool optimizable_p;
++
++ /* The new variable declaration, if we can optimize away the staticness
++ of 'orig_var'. */
++ tree new_var;
++};
++
++/* Filled with 'struct rls_decl_info'; keyed off ORIG_VAR. */
++static htab_t static_variables;
++
++struct rls_stmt_info
++{
++ /* The variable declaration. */
++ tree var;
++
++ /* The statement in which we found a def or a use of the variable. */
++ gimple stmt;
++
++ /* Whether STMT represents a use of VAR. */
++ bool use_p;
++
++ /* A bitmap whose entries denote what variables have been defined
++ when execution arrives at STMT. This field is only used when
++ USE_P is true. */
++ sbitmap defined;
++};
++
++/* Filled with 'struct rls_stmt_info'; keyed off STMT. */
++static htab_t defuse_statements;
++
++static struct
++{
++ /* The number of static variables we found. */
++ size_t n_statics;
++
++ /* The number of optimizable variables we found. */
++ size_t n_optimizable;
++} stats;
++
++struct rls_block_dataflow_data {
++ /* A bitmap whose entries denote what variables have been defined on
++ entry to this block. */
++ sbitmap defined_in;
++
++ /* A bitmap whose entries denote what variables have been defined on
++ exit from this block. */
++ sbitmap defined_out;
++};
++
++/* Parameters for the 'static_variables' hash table. */
++
++static hashval_t
++rls_hash_decl_info (const void *x)
++{
++ return htab_hash_pointer
++ ((const void *) ((const struct rls_decl_info *) x)->orig_var);
++}
++
++static int
++rls_eq_decl_info (const void *x, const void *y)
++{
++ const struct rls_decl_info *a = (const struct rls_decl_info *) x;
++ const struct rls_decl_info *b = (const struct rls_decl_info *) y;
++
++ return a->orig_var == b->orig_var;
++}
++
++static void
++rls_free_decl_info (void *info)
++{
++ free (info);
++}
++
++/* Parameters for the 'defuse_statements' hash table. */
++
++static hashval_t
++rls_hash_use_info (const void *x)
++{
++ return htab_hash_pointer
++ ((const void *) ((const struct rls_stmt_info *) x)->stmt);
++}
++
++static int
++rls_eq_use_info (const void *x, const void *y)
++{
++ const struct rls_stmt_info *a = (const struct rls_stmt_info *) x;
++ const struct rls_stmt_info *b = (const struct rls_stmt_info *) y;
++
++ return a->stmt == b->stmt;
++}
++
++static void
++rls_free_use_info (void *info)
++{
++ struct rls_stmt_info *stmt_info = (struct rls_stmt_info *) info;
++
++ if (stmt_info->defined)
++ sbitmap_free (stmt_info->defined);
++
++ free (stmt_info);
++}
++
++/* Initialize data structures and statistics. */
++
++static void
++rls_init (void)
++{
++ basic_block bb;
++
++ /* We expect relatively few static variables, hence the small
++ initial size for the hash table. */
++ static_variables = htab_create (8, rls_hash_decl_info,
++ rls_eq_decl_info, rls_free_decl_info);
++
++ /* We expect quite a few statements. */
++ defuse_statements = htab_create (128, rls_hash_use_info,
++ rls_eq_use_info, rls_free_use_info);
++
++ FOR_ALL_BB (bb)
++ {
++ struct rls_block_dataflow_data *data;
++
++ data = XNEW (struct rls_block_dataflow_data);
++ memset (data, 0, sizeof (*data));
++ bb->aux = data;
++ }
++
++ stats.n_statics = 0;
++ stats.n_optimizable = 0;
++}
++
++/* Free data structures. */
++
++static void
++rls_done (void)
++{
++ basic_block bb;
++
++ htab_delete (static_variables);
++ htab_delete (defuse_statements);
++
++ FOR_ALL_BB (bb)
++ {
++ struct rls_block_dataflow_data *data
++ = (struct rls_block_dataflow_data *) bb->aux;
++
++ gcc_assert (data);
++
++ if (data->defined_in)
++ sbitmap_free (data->defined_in);
++ if (data->defined_out)
++ sbitmap_free (data->defined_out);
++ free (data);
++ bb->aux = NULL;
++ }
++}
++
++
++/* Doing the initial work to find static variables. */
++
++/* Examine the defining statement for VAR and determine whether it is a
++ static variable we could potentially optimize. If so, stick in it
++ in the 'static_variables' hashtable.
++
++ STMT is the statement in which a definition or use of VAR occurs.
++ USE_P indicates whether VAR is used or defined in STMT. Enter STMT
++ into 'defuse_statements' as well for use during dataflow
++ analysis. */
++
++static void
++maybe_discover_new_declaration (tree var, gimple stmt, bool use_p)
++{
++ tree def_stmt = SSA_NAME_VAR (var);
++
++ if (TREE_CODE (def_stmt) == VAR_DECL
++ && DECL_CONTEXT (def_stmt) != NULL_TREE
++ && TREE_CODE (DECL_CONTEXT (def_stmt)) == FUNCTION_DECL
++ /* We cannot optimize away a static used in multiple functions (as
++ might happen in C++). */
++ && !DECL_NONLOCAL(def_stmt)
++ && TREE_STATIC (def_stmt)
++ /* We cannot optimize away aggregate statics, as we would have to
++ prove that definitions of every field of the aggregate dominate
++ uses. */
++ && !AGGREGATE_TYPE_P (TREE_TYPE (def_stmt))
++ /* GCC doesn't normally treat vectors as aggregates; we need to,
++ though, since a user could use intrinsics to read/write
++ particular fields of the vector, thereby treating it as an
++ array. */
++ && TREE_CODE (TREE_TYPE (def_stmt)) != VECTOR_TYPE
++ && !TREE_ADDRESSABLE (def_stmt)
++ && !TREE_THIS_VOLATILE (def_stmt))
++ {
++ struct rls_decl_info dummy;
++ void **slot;
++
++ dummy.orig_var = def_stmt;
++ slot = htab_find_slot (static_variables, &dummy, INSERT);
++
++ if (*slot == NULL)
++ {
++ /* Found a use or a def of a new declaration. */
++ struct rls_decl_info *info = XNEW (struct rls_decl_info);
++
++ info->orig_var = def_stmt;
++ info->index = stats.n_statics++;
++ /* Optimistically assume that we can optimize. */
++ info->optimizable_p = true;
++ info->new_var = NULL_TREE;
++ *slot = (void *) info;
++ }
++
++ /* Enter the statement into DEFUSE_STATEMENTS. */
++ {
++ struct rls_stmt_info dummy;
++ struct rls_stmt_info *info;
++
++ dummy.stmt = stmt;
++ slot = htab_find_slot (defuse_statements, &dummy, INSERT);
++
++ /* We should never insert the same statement into the
++ hashtable twice. */
++ gcc_assert (*slot == NULL
++ || ((struct rls_stmt_info *)(*slot))->stmt == stmt);
++
++ if (*slot != NULL && ((struct rls_stmt_info *)(*slot))->stmt == stmt)
++ return;
++
++ info = XNEW (struct rls_stmt_info);
++ info->var = def_stmt;
++ info->stmt = stmt;
++ if (dump_file)
++ {
++ fprintf (dump_file, "entering as %s ", use_p ? "use" : "def");
++ print_gimple_stmt (dump_file, stmt, 0, TDF_DETAILS | TDF_VOPS);
++ }
++ info->use_p = use_p;
++ /* We don't know how big to make the bitmap yet. */
++ info->defined = NULL;
++ *slot = (void *) info;
++ }
++ }
++}
++
++/* Grovel through all the statements in the program, looking for
++ SSA_NAMEs whose SSA_NAME_VAR is a VAR_DECL. We look at both use and
++ def SSA_NAMEs. */
++
++static void
++find_static_nonvolatile_declarations (void)
++{
++ basic_block bb;
++
++ FOR_EACH_BB (bb)
++ {
++ gimple_stmt_iterator i;
++
++ for (i = gsi_start_bb (bb); !gsi_end_p (i); gsi_next (&i))
++ {
++ tree var;
++ ssa_op_iter iter;
++ gimple stmt = gsi_stmt (i);
++
++ /* If there's a call expression in STMT, then previous passes
++ will have determined if the call transitively defines some
++ static variable. However, we need more precise
++ information--we need to know whether static variables are
++ live out after the call.
++
++ Since we'll never see something like:
++
++ staticvar = foo (bar, baz);
++
++ in GIMPLE (the result of the call will be assigned to a
++ normal, non-static local variable which is then assigned to
++ STATICVAR in a subsequent statement), don't bother finding
++ new declarations if we see a GIMPLE_CALL.
++
++ In a similar fashion, asm statements that clobber memory
++ will appear to define static variables. In general,
++ however, assuming that asm statements define static
++ variables would cause us to see that in the following
++ situation:
++
++ static int foo = 0;
++
++ __asm__ (... : "memory");
++ foo++;
++
++ foo could be unstaticized because the asm has "defined"
++ foo. This is likely false. (Even if the asm does happen
++ to define foo--and only foo--that situation would be
++ sufficiently unusual that not optimizing it seems OK.) */
++ if (gimple_code (stmt) != GIMPLE_CALL
++ && gimple_code (stmt) != GIMPLE_ASM)
++ FOR_EACH_SSA_TREE_OPERAND (var, stmt, iter, SSA_OP_VDEF)
++ {
++ maybe_discover_new_declaration (var, stmt, false);
++ }
++
++ FOR_EACH_SSA_TREE_OPERAND (var, stmt, iter, SSA_OP_VUSE)
++ {
++ maybe_discover_new_declaration (var, stmt, true);
++ }
++ }
++ }
++}
++
++
++/* Determining if we have anything to optimize. */
++
++/* Examine *SLOT (which is a 'struct rls_decl_info *') to see whether
++ the associated variable is optimizable. If it is, create a new,
++ non-static declaration for the variable; this new variable will be
++ used during a subsequent rewrite of the function. */
++
++#define NEW_VAR_PREFIX ".unstatic"
++
++static int
++maybe_create_new_variable (void **slot, void *data ATTRIBUTE_UNUSED)
++{
++ struct rls_decl_info *info = (struct rls_decl_info *) *slot;
++ tree id_node = DECL_NAME (info->orig_var);
++ size_t id_len = IDENTIFIER_LENGTH (id_node);
++ size_t name_len = id_len + strlen (NEW_VAR_PREFIX) + 1;
++ char *name;
++
++ /* Don't create a new variable multiple times. */
++ gcc_assert (!info->new_var);
++
++ /* Tie the new name to the old one to aid debugging dumps. */
++ name = (char *) alloca (name_len);
++ strcpy (name, IDENTIFIER_POINTER (id_node));
++ strcpy (name + id_len, NEW_VAR_PREFIX);
++ info->new_var = create_tmp_var (TREE_TYPE (info->orig_var), name);
++
++ if (dump_file)
++ {
++ fprintf (dump_file, "new variable ");
++ print_generic_expr (dump_file, info->new_var, 0);
++ fprintf (dump_file, "\n");
++ }
++
++ /* Inform SSA about this new variable. */
++ create_var_ann (info->new_var);
++ mark_sym_for_renaming (info->new_var);
++ /* We need to make sure we rebuild bits for the original variable,
++ such as virtual operands attached to statements. */
++ mark_sym_for_renaming (info->orig_var);
++ add_referenced_var (info->new_var);
++
++ /* Always continue scanning. */
++ return 1;
++}
++
++#undef NEW_VAR_PREFIX
++
++/* Traverse the 'defuse_statements' hash table. For every use,
++ determine if the associated variable is defined along all paths
++ leading to said use. Remove the associated variable from
++ 'static_variables' if it is not. */
++
++static int
++check_definedness (void **slot, void *data ATTRIBUTE_UNUSED)
++{
++ struct rls_stmt_info *info = (struct rls_stmt_info *) *slot;
++ struct rls_decl_info dummy;
++
++ /* We don't need to look at definitions. Continue scanning. */
++ if (!info->use_p)
++ return 1;
++
++ dummy.orig_var = info->var;
++ slot = htab_find_slot (static_variables, &dummy, INSERT);
++
++ /* Might not be there because we deleted it already. */
++ if (*slot)
++ {
++ struct rls_decl_info *decl = (struct rls_decl_info *) *slot;
++
++ if (!TEST_BIT (info->defined, decl->index))
++ {
++ if (dump_file)
++ {
++ fprintf (dump_file, "not optimizing ");
++ print_generic_expr (dump_file, decl->orig_var, 0);
++ fprintf (dump_file, "due to uncovered use in ");
++ print_gimple_stmt (dump_file, info->stmt, 0, 0);
++ fprintf (dump_file, "\n");
++ }
++
++ htab_clear_slot (static_variables, slot);
++ stats.n_optimizable--;
++ }
++ }
++
++ /* Continue scan. */
++ return 1;
++}
++
++/* Check all statements in 'defuse_statements' to see if all the
++ statements that use a static variable have that variable defined
++ along all paths leading to the statement. Once that's done, go
++ through and create new, non-static variables for any static variables
++ that can be optimized. */
++
++static size_t
++determine_optimizable_statics (void)
++{
++ htab_traverse (defuse_statements, check_definedness, NULL);
++
++ htab_traverse (static_variables, maybe_create_new_variable, NULL);
++
++ return stats.n_optimizable;
++}
++
++/* Look at STMT to see if we have uses or defs of a static variable.
++ STMT is passed in DATA. Definitions of a static variable are found
++ by the presence of a V_MUST_DEF, while uses are found by the presence
++ of a VUSE. */
++
++static int
++unstaticize_variable (void **slot, void *data)
++{
++ struct rls_decl_info *info = (struct rls_decl_info *) *slot;
++ gimple stmt = (gimple) data;
++ tree vdef;
++ tree vuse;
++ int continue_scan = 1;
++
++ /* We should have removed unoptimizable variables during an earlier
++ traversal. */
++ gcc_assert (info->optimizable_p);
++
++ /* Check for virtual definitions first. */
++ vdef = SINGLE_SSA_TREE_OPERAND (stmt, SSA_OP_VDEF);
++
++ if (vdef != NULL
++ && ZERO_SSA_OPERANDS (stmt, SSA_OP_DEF)
++ && gimple_code (stmt) == GIMPLE_ASSIGN
++ && TREE_CODE (gimple_assign_lhs (stmt)) == VAR_DECL
++ && gimple_assign_lhs(stmt) == info->orig_var)
++ {
++ /* Make the statement define the new name. The new name has
++ already been marked for renaming, so no need to do that
++ here. */
++ gimple_assign_set_lhs (stmt, info->new_var);
++ if (dump_file)
++ {
++ fprintf (dump_file, "found virtual definition!\n");
++ print_gimple_stmt (dump_file, stmt, 0, TDF_VOPS | TDF_DETAILS);
++ fprintf (dump_file, "\n");
++ }
++ continue_scan = 0;
++ goto done;
++ }
++
++ /* Check for virtual uses. */
++ vuse = SINGLE_SSA_TREE_OPERAND (stmt, SSA_OP_VUSE);
++
++ if (vuse != NULL
++ && gimple_code (stmt) == GIMPLE_ASSIGN
++ && gimple_assign_rhs_code (stmt) == VAR_DECL
++ && gimple_assign_rhs1 (stmt) == info->orig_var)
++ {
++ /* Make the statement use the new name. */
++ gimple_assign_set_rhs1 (stmt, info->new_var);
++ if (dump_file)
++ {
++ fprintf (dump_file, "found virtual use!\n");
++ print_gimple_stmt (dump_file, stmt, 0, TDF_VOPS | TDF_DETAILS);
++ fprintf (dump_file, "\n");
++ }
++ continue_scan = 0;
++ goto done;
++ }
++
++ done:
++ if (!continue_scan)
++ {
++ /* None of the other optimizable static variables can occur
++ in this statement. Stop the scan. */
++ update_stmt (stmt);
++
++ if (dump_file)
++ {
++ fprintf (dump_file, "updated stmt\n");
++ print_gimple_stmt (dump_file, stmt, 0, TDF_VOPS | TDF_DETAILS);
++ }
++ }
++
++ return continue_scan;
++}
++
++/* Determine if we have any static variables we can optimize. If so,
++ replace any defs or uses of those variables in their defining/using
++ statements. */
++
++static void
++maybe_remove_static_from_declarations (void)
++{
++ size_t n_optimizable = determine_optimizable_statics ();
++ basic_block bb;
++
++ if (n_optimizable)
++ /* Replace any optimizable variables with new, non-static variables. */
++ FOR_EACH_BB (bb)
++ {
++ gimple_stmt_iterator gsi;
++
++ for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi))
++ {
++ gimple stmt = gsi_stmt (gsi);
++
++ htab_traverse (static_variables, unstaticize_variable, stmt);
++ }
++ }
++}
++
++/* Callback for htab_traverse to initialize the bitmap for *SLOT, which
++ is a 'struct rls_stmt_info'. */
++
++static int
++initialize_statement_dataflow (void **slot, void *data ATTRIBUTE_UNUSED)
++{
++ struct rls_stmt_info *info = (struct rls_stmt_info *) *slot;
++
++ gcc_assert (!info->defined);
++
++ if (info->use_p)
++ {
++ info->defined = sbitmap_alloc (stats.n_statics);
++ /* Assume defined along all paths until otherwise informed. */
++ sbitmap_ones (info->defined);
++ }
++
++ /* Continue traversal. */
++ return 1;
++}
++
++/* We have N_STATICS static variables to consider. Go through all the
++ blocks and all the use statements to initialize their bitmaps. */
++
++static void
++initialize_block_and_statement_dataflow (size_t n_statics)
++{
++ basic_block bb;
++
++ FOR_ALL_BB (bb)
++ {
++ struct rls_block_dataflow_data *data
++ = (struct rls_block_dataflow_data *) bb->aux;
++
++ gcc_assert (data);
++
++ data->defined_in = sbitmap_alloc (n_statics);
++ sbitmap_zero (data->defined_in);
++ data->defined_out = sbitmap_alloc (n_statics);
++ sbitmap_zero (data->defined_out);
++ }
++
++ htab_traverse (defuse_statements, initialize_statement_dataflow, NULL);
++}
++
++/* Apply the individual effects of the stmts in BB to update the
++ dataflow analysis information for BB. */
++
++static void
++compute_definedness_for_block (basic_block bb)
++{
++ bool changed_p = false;
++ struct rls_block_dataflow_data *data
++ = (struct rls_block_dataflow_data *) bb->aux;
++ gimple_stmt_iterator gsi;
++
++ sbitmap_copy (data->defined_out, data->defined_in);
++
++ for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi))
++ {
++ gimple stmt = gsi_stmt (gsi);
++
++ if (gimple_code (stmt) == GIMPLE_CALL)
++ /* If there's a call expression in STMT, then previous passes
++ will have determined if the call transitively defines some
++ static variable. However, we need more precise
++ information--we need to know whether static variables are
++ live out after the call. In the absence of such information,
++ simply declare that all static variables are clobbered by the
++ call. A better analysis would be interprocedural and compute
++ the liveness information we require, but for now, we're being
++ pessimistic. */
++ sbitmap_zero (data->defined_out);
++ else
++ {
++ struct rls_stmt_info dummy;
++ void **slot;
++
++ /* See if this statement uses or defines a static variable. */
++ dummy.stmt = stmt;
++ slot = htab_find_slot (defuse_statements, &dummy, INSERT);
++
++ /* Check for uses. */
++ if (*slot != NULL)
++ {
++ struct rls_stmt_info *info = (struct rls_stmt_info *) *slot;
++
++ if (info->use_p)
++ {
++ gcc_assert (info->defined);
++
++ /* Found a statement that uses a function-local static
++ variable. Copy the current state of definedness. */
++ sbitmap_copy (info->defined, data->defined_out);
++ }
++ else
++ {
++ struct rls_decl_info dummy;
++ struct rls_decl_info *decl;
++
++ gcc_assert (!info->defined);
++
++ /* Found a statement that defines a function-local static
++ variable. Look up the associated variable's information
++ and mark it as defined in the block. */
++ dummy.orig_var = info->var;
++ slot = htab_find_slot (static_variables, &dummy, INSERT);
++
++ gcc_assert (*slot);
++
++ decl = (struct rls_decl_info *) *slot;
++
++ SET_BIT (data->defined_out, decl->index);
++ changed_p |= true;
++ }
++ }
++ }
++ }
++}
++
++/* Solve the dataflow equations:
++
++ DEFINED_IN(b) = intersect DEFINED_OUT(p) for p in preds(b)
++ DEFINED_OUT(b) = VARIABLES_DEFINED (b, DEFINED_IN (b))
++
++ via a simple iterative solver. VARIABLES_DEFINED is computed by
++ 'compute_definedness_for_block'. */
++
++static void
++compute_definedness (void)
++{
++ basic_block bb;
++ bool changed_p;
++ sbitmap tmp_bitmap = sbitmap_alloc (stats.n_statics);
++
++ /* Compute initial sets. */
++ FOR_EACH_BB (bb)
++ {
++ compute_definedness_for_block (bb);
++ }
++
++ /* Iterate. */
++ do {
++ changed_p = false;
++
++ FOR_EACH_BB (bb)
++ {
++ edge e;
++ edge_iterator ei;
++ struct rls_block_dataflow_data *data
++ = (struct rls_block_dataflow_data *) bb->aux;
++ bool bitmap_changed_p = false;
++
++ sbitmap_ones (tmp_bitmap);
++
++ gcc_assert (data);
++
++ /* We require information about whether a variable was defined
++ over all paths leading to a particular use. Therefore, we
++ intersect the DEFINED sets of all predecessors. */
++ FOR_EACH_EDGE (e, ei, bb->preds)
++ {
++ struct rls_block_dataflow_data *pred_data
++ = (struct rls_block_dataflow_data *) e->src->aux;
++
++ gcc_assert (pred_data);
++
++ sbitmap_a_and_b (tmp_bitmap, tmp_bitmap, pred_data->defined_out);
++ }
++
++ bitmap_changed_p = !sbitmap_equal (tmp_bitmap, data->defined_in);
++
++ if (bitmap_changed_p)
++ {
++ sbitmap_copy (data->defined_in, tmp_bitmap);
++ compute_definedness_for_block (bb);
++ }
++
++ changed_p |= bitmap_changed_p;
++ }
++ } while (changed_p);
++
++ sbitmap_free (tmp_bitmap);
++}
++
++static unsigned int
++execute_rls (void)
++{
++ rls_init ();
++
++ find_static_nonvolatile_declarations ();
++
++ /* Can we optimize anything? */
++ if (stats.n_statics != 0)
++ {
++ stats.n_optimizable = stats.n_statics;
++
++ if (dump_file)
++ fprintf (dump_file, "found %d static variables to consider\n",
++ stats.n_statics);
++
++ initialize_block_and_statement_dataflow (stats.n_statics);
++
++ compute_definedness ();
++
++ maybe_remove_static_from_declarations ();
++
++ if (dump_file)
++ fprintf (dump_file, "removed %d static variables\n",
++ stats.n_optimizable);
++ }
++
++ rls_done ();
++
++ return 0;
++}
++
++static bool
++gate_rls (void)
++{
++ return (flag_remove_local_statics != 0
++ && !cfun->calls_setjmp
++ && !cgraph_node (current_function_decl)->ever_was_nested);
++}
++
++struct gimple_opt_pass pass_remove_local_statics =
++{
++ {
++ GIMPLE_PASS,
++ "remlocstatic", /* name */
++ gate_rls, /* gate */
++ execute_rls, /* execute */
++ NULL, /* sub */
++ NULL, /* next */
++ 0, /* static_pass_number */
++ TV_TREE_RLS, /* tv_id */
++ PROP_cfg | PROP_ssa, /* properties_required */
++ 0, /* properties_provided */
++ 0, /* properties_destroyed */
++ 0, /* todo_flags_start */
++ TODO_dump_func | TODO_verify_ssa | TODO_verify_stmts
++ | TODO_rebuild_alias | TODO_update_ssa /* todo_flags_finish */
++ }
++};
+diff -Nur a/gcc/tree-ssa-sink.c b/gcc/tree-ssa-sink.c
+--- a/gcc/tree-ssa-sink.c 2009-02-20 16:20:38.000000000 +0100
++++ b/gcc/tree-ssa-sink.c 2010-01-25 09:50:29.595686516 +0100
+@@ -449,6 +449,47 @@
+ last = false;
+ continue;
+ }
++
++ /* We cannot move statements that contain references to block-scope
++ variables out of that block, as this may lead to incorrect aliasing
++ when we lay out the stack frame in cfgexpand.c.
++ In lieu of more sophisticated analysis, be very conservative here
++ and prohibit moving any statement that references memory out of a
++ block with variables. */
++ if (gimple_references_memory_p (stmt))
++ {
++ tree fromblock = gimple_block (stmt);
++ while (fromblock
++ && fromblock != current_function_decl
++ && !BLOCK_VARS (fromblock))
++ fromblock = BLOCK_SUPERCONTEXT (fromblock);
++ if (fromblock && fromblock != current_function_decl)
++ {
++ gimple tostmt;
++ tree toblock;
++
++ if (gsi_end_p (togsi))
++ tostmt = gimple_seq_last_stmt (gsi_seq (togsi));
++ else
++ tostmt = gsi_stmt (togsi);
++ if (tostmt)
++ toblock = gimple_block (tostmt);
++ else
++ toblock = NULL;
++ while (toblock
++ && toblock != current_function_decl
++ && toblock != fromblock)
++ toblock = BLOCK_SUPERCONTEXT (toblock);
++ if (!toblock || toblock != fromblock)
++ {
++ if (!gsi_end_p (gsi))
++ gsi_prev (&gsi);
++ last = false;
++ continue;
++ }
++ }
++ }
++
+ if (dump_file)
+ {
+ fprintf (dump_file, "Sinking ");
+diff -Nur a/gcc/tree-ssa-structalias.c b/gcc/tree-ssa-structalias.c
+--- a/gcc/tree-ssa-structalias.c 2009-03-23 17:29:33.000000000 +0100
++++ b/gcc/tree-ssa-structalias.c 2010-01-25 09:50:29.595686516 +0100
+@@ -2926,7 +2926,8 @@
+ /* Some people like to do cute things like take the address of
+ &0->a.b */
+ forzero = t;
+- while (!SSA_VAR_P (forzero) && !CONSTANT_CLASS_P (forzero))
++ while (!SSA_VAR_P (forzero) && TREE_CODE (forzero) != FUNCTION_DECL
++ && !CONSTANT_CLASS_P (forzero))
+ forzero = TREE_OPERAND (forzero, 0);
+
+ if (CONSTANT_CLASS_P (forzero) && integer_zerop (forzero))
+diff -Nur a/gcc/tree-vect-analyze.c b/gcc/tree-vect-analyze.c
+--- a/gcc/tree-vect-analyze.c 2009-06-30 13:56:21.000000000 +0200
++++ b/gcc/tree-vect-analyze.c 2010-01-25 09:50:29.595686516 +0100
+@@ -1459,7 +1459,7 @@
+ }
+
+ base = build_fold_indirect_ref (base_addr);
+- alignment = ssize_int (TYPE_ALIGN (vectype)/BITS_PER_UNIT);
++ alignment = ssize_int (targetm.vectorize.vector_min_alignment (vectype));
+
+ if ((aligned_to && tree_int_cst_compare (aligned_to, alignment) < 0)
+ || !misalign)
+@@ -1510,7 +1510,8 @@
+ /* At this point we assume that the base is aligned. */
+ gcc_assert (base_aligned
+ || (TREE_CODE (base) == VAR_DECL
+- && DECL_ALIGN (base) >= TYPE_ALIGN (vectype)));
++ && (DECL_ALIGN (base)
++ >= targetm.vectorize.vector_min_alignment (vectype))));
+
+ /* Modulo alignment. */
+ misalign = size_binop (TRUNC_MOD_EXPR, misalign, alignment);
+diff -Nur a/gcc/tree-vectorizer.c b/gcc/tree-vectorizer.c
+--- a/gcc/tree-vectorizer.c 2009-03-18 16:29:28.000000000 +0100
++++ b/gcc/tree-vectorizer.c 2010-01-25 09:50:29.595686516 +0100
+@@ -2868,11 +2868,13 @@
+ vnode = vnode->next_needed)
+ {
+ tree vectype, decl = vnode->decl;
++ tree t;
+ unsigned int alignment;
+
+- if (TREE_CODE (TREE_TYPE (decl)) != ARRAY_TYPE)
++ t = TREE_TYPE(decl);
++ if (TREE_CODE (t) != ARRAY_TYPE)
+ continue;
+- vectype = get_vectype_for_scalar_type (TREE_TYPE (TREE_TYPE (decl)));
++ vectype = get_vectype_for_scalar_type (strip_array_types (t));
+ if (!vectype)
+ continue;
+ alignment = TYPE_ALIGN (vectype);
+@@ -2887,6 +2889,7 @@
+ {
+ fprintf (dump_file, "Increasing alignment of decl: ");
+ print_generic_expr (dump_file, decl, TDF_SLIM);
++ fprintf (dump_file, "\n");
+ }
+ }
+ }
+diff -Nur a/gcc/tree-vect-transform.c b/gcc/tree-vect-transform.c
+--- a/gcc/tree-vect-transform.c 2009-04-20 09:09:01.000000000 +0200
++++ b/gcc/tree-vect-transform.c 2010-01-25 09:50:29.595686516 +0100
+@@ -5442,7 +5442,21 @@
+ vect_permute_store_chain(). */
+ vec_oprnd = VEC_index (tree, result_chain, i);
+
+- data_ref = build_fold_indirect_ref (dataref_ptr);
++ if (alignment_support_scheme == dr_aligned
++ && !targetm.vectorize.always_misalign(vectype))
++ {
++ data_ref = build_fold_indirect_ref (dataref_ptr);
++ }
++ else
++ {
++ /* TODO: Record actual alignment in always_misalign case. */
++ int mis = DR_MISALIGNMENT (first_dr);
++ tree tmis;
++ tmis = (mis == -1 ? size_zero_node : size_int (mis));
++ tmis = size_binop (MULT_EXPR, tmis, size_int(BITS_PER_UNIT));
++ data_ref =
++ build2 (MISALIGNED_INDIRECT_REF, vectype, dataref_ptr, tmis);
++ }
+
+ /* Arguments are ready. Create the new vector stmt. */
+ new_stmt = gimple_build_assign (data_ref, vec_oprnd);
+@@ -6621,10 +6635,15 @@
+ {
+ case dr_aligned:
+ gcc_assert (aligned_access_p (first_dr));
+- data_ref = build_fold_indirect_ref (dataref_ptr);
+- break;
++ if (!targetm.vectorize.always_misalign(vectype))
++ {
++ data_ref = build_fold_indirect_ref (dataref_ptr);
++ break;
++ }
++ /* Fall through... */
+ case dr_unaligned_supported:
+ {
++ /* TODO: Record actual alignment in always_misalign case. */
+ int mis = DR_MISALIGNMENT (first_dr);
+ tree tmis = (mis == -1 ? size_zero_node : size_int (mis));
+
+@@ -7595,7 +7614,7 @@
+ gimple dr_stmt = DR_STMT (dr);
+ stmt_vec_info stmt_info = vinfo_for_stmt (dr_stmt);
+ tree vectype = STMT_VINFO_VECTYPE (stmt_info);
+- int vectype_align = TYPE_ALIGN (vectype) / BITS_PER_UNIT;
++ int vectype_align = targetm.vectorize.vector_min_alignment (vectype);
+ tree niters_type = TREE_TYPE (loop_niters);
+ int step = 1;
+ int element_size = GET_MODE_SIZE (TYPE_MODE (TREE_TYPE (DR_REF (dr))));
+diff -Nur a/gcc/unwind-dw2.c b/gcc/unwind-dw2.c
+--- a/gcc/unwind-dw2.c 2009-04-10 01:23:07.000000000 +0200
++++ b/gcc/unwind-dw2.c 2010-01-25 09:50:29.595686516 +0100
+@@ -1414,16 +1414,12 @@
+ /* Fill in CONTEXT for top-of-stack. The only valid registers at this
+ level will be the return address and the CFA. */
+
+-#define uw_init_context(CONTEXT) \
+- do \
+- { \
+- /* Do any necessary initialization to access arbitrary stack frames. \
+- On the SPARC, this means flushing the register windows. */ \
+- __builtin_unwind_init (); \
+- uw_init_context_1 (CONTEXT, __builtin_dwarf_cfa (), \
+- __builtin_return_address (0)); \
+- } \
+- while (0)
++#define uw_init_context(CONTEXT) \
++ /* Do any necessary initialization to access arbitrary stack frames. \
++ On the SPARC, this means flushing the register windows. */ \
++ (__builtin_unwind_init (), \
++ uw_init_context_1 ((CONTEXT), __builtin_dwarf_cfa (), \
++ __builtin_return_address (0)))
+
+ static inline void
+ init_dwarf_reg_size_table (void)
+@@ -1431,7 +1427,7 @@
+ __builtin_init_dwarf_reg_size_table (dwarf_reg_size_table);
+ }
+
+-static void
++static _Unwind_Reason_Code
+ uw_init_context_1 (struct _Unwind_Context *context,
+ void *outer_cfa, void *outer_ra)
+ {
+@@ -1445,7 +1441,8 @@
+ context->flags = EXTENDED_CONTEXT_BIT;
+
+ code = uw_frame_state_for (context, &fs);
+- gcc_assert (code == _URC_NO_REASON);
++ if (code != _URC_NO_REASON)
++ return code;
+
+ #if __GTHREADS
+ {
+@@ -1471,6 +1468,8 @@
+ initialization context, then we can't see it in the given
+ call frame data. So have the initialization context tell us. */
+ context->ra = __builtin_extract_return_addr (outer_ra);
++
++ return _URC_NO_REASON;
+ }
+
+
+diff -Nur a/gcc/unwind.inc b/gcc/unwind.inc
+--- a/gcc/unwind.inc 2009-04-10 01:23:07.000000000 +0200
++++ b/gcc/unwind.inc 2010-01-25 09:50:29.595686516 +0100
+@@ -85,7 +85,8 @@
+ _Unwind_Reason_Code code;
+
+ /* Set up this_context to describe the current stack frame. */
+- uw_init_context (&this_context);
++ code = uw_init_context (&this_context);
++ gcc_assert (code == _URC_NO_REASON);
+ cur_context = this_context;
+
+ /* Phase 1: Search. Unwind the stack, calling the personality routine
+@@ -198,7 +199,8 @@
+ struct _Unwind_Context this_context, cur_context;
+ _Unwind_Reason_Code code;
+
+- uw_init_context (&this_context);
++ code = uw_init_context (&this_context);
++ gcc_assert (code == _URC_NO_REASON);
+ cur_context = this_context;
+
+ exc->private_1 = (_Unwind_Ptr) stop;
+@@ -221,7 +223,8 @@
+ struct _Unwind_Context this_context, cur_context;
+ _Unwind_Reason_Code code;
+
+- uw_init_context (&this_context);
++ code = uw_init_context (&this_context);
++ gcc_assert (code == _URC_NO_REASON);
+ cur_context = this_context;
+
+ /* Choose between continuing to process _Unwind_RaiseException
+@@ -251,7 +254,8 @@
+ if (exc->private_1 == 0)
+ return _Unwind_RaiseException (exc);
+
+- uw_init_context (&this_context);
++ code = uw_init_context (&this_context);
++ gcc_assert (code == _URC_NO_REASON);
+ cur_context = this_context;
+
+ code = _Unwind_ForcedUnwind_Phase2 (exc, &cur_context);
+@@ -280,7 +284,9 @@
+ struct _Unwind_Context context;
+ _Unwind_Reason_Code code;
+
+- uw_init_context (&context);
++ code = uw_init_context (&context);
++ if (code != _URC_NO_REASON)
++ return _URC_FATAL_PHASE1_ERROR;
+
+ while (1)
+ {
+diff -Nur a/gcc/unwind-sjlj.c b/gcc/unwind-sjlj.c
+--- a/gcc/unwind-sjlj.c 2009-04-10 01:23:07.000000000 +0200
++++ b/gcc/unwind-sjlj.c 2010-01-25 09:50:29.595686516 +0100
+@@ -292,10 +292,11 @@
+ uw_update_context (context, fs);
+ }
+
+-static inline void
++static inline _Unwind_Reason_Code
+ uw_init_context (struct _Unwind_Context *context)
+ {
+ context->fc = _Unwind_SjLj_GetContext ();
++ return _URC_NO_REASON;
+ }
+
+ static void __attribute__((noreturn))
+diff -Nur a/gcc/varasm.c b/gcc/varasm.c
+--- a/gcc/varasm.c 2009-03-17 21:18:21.000000000 +0100
++++ b/gcc/varasm.c 2010-01-25 09:50:29.595686516 +0100
+@@ -1126,11 +1126,14 @@
+ {
+ #ifdef DATA_ALIGNMENT
+ unsigned int data_align = DATA_ALIGNMENT (TREE_TYPE (decl), align);
++#else
++ unsigned int data_align = align;
++#endif
++ data_align = alignment_for_aligned_arrays (TREE_TYPE (decl), data_align);
+ /* Don't increase alignment too much for TLS variables - TLS space
+ is too precious. */
+ if (! DECL_THREAD_LOCAL_P (decl) || data_align <= BITS_PER_WORD)
+ align = data_align;
+-#endif
+ #ifdef CONSTANT_ALIGNMENT
+ if (DECL_INITIAL (decl) != 0 && DECL_INITIAL (decl) != error_mark_node)
+ {
+@@ -3196,6 +3199,10 @@
+ set_mem_alias_set (rtl, 0);
+ set_mem_alias_set (rtl, const_alias_set);
+
++ /* We cannot share RTX'es in pool entries.
++ Mark this piece of RTL as required for unsharing. */
++ RTX_FLAG (rtl, used) = 1;
++
+ /* Set flags or add text to the name to record information, such as
+ that it is a local symbol. If the name is changed, the macro
+ ASM_OUTPUT_LABELREF will have to know how to strip this
+diff -Nur a/gcc/vmsdbgout.c b/gcc/vmsdbgout.c
+--- a/gcc/vmsdbgout.c 2008-08-29 20:41:19.000000000 +0200
++++ b/gcc/vmsdbgout.c 2010-01-25 09:50:29.595686516 +0100
+@@ -211,6 +211,7 @@
+ debug_nothing_int, /* handle_pch */
+ debug_nothing_rtx, /* var_location */
+ debug_nothing_void, /* switch_text_section */
++ debug_nothing_tree_tree, /* set_name */
+ 0 /* start_end_main_source_file */
+ };
+
+diff -Nur a/include/libiberty.h b/include/libiberty.h
+--- a/include/libiberty.h 2008-06-24 03:42:31.000000000 +0200
++++ b/include/libiberty.h 2010-01-25 09:50:29.595686516 +0100
+@@ -591,6 +591,10 @@
+
+ extern int pwait (int, int *, int);
+
++/* Convert a Cygwin path to a Windows path. */
++
++extern int cygpath (const char *, char []);
++
+ #if !HAVE_DECL_ASPRINTF
+ /* Like sprintf but provides a pointer to malloc'd storage, which must
+ be freed by the caller. */
+diff -Nur a/libcpp/directives.c b/libcpp/directives.c
+--- a/libcpp/directives.c 2009-04-10 01:23:07.000000000 +0200
++++ b/libcpp/directives.c 2010-01-25 09:50:29.595686516 +0100
+@@ -2299,13 +2299,6 @@
+ run_directive (pfile, type, str, count);
+ }
+
+-/* The number of errors for a given reader. */
+-unsigned int
+-cpp_errors (cpp_reader *pfile)
+-{
+- return pfile->errors;
+-}
+-
+ /* The options structure. */
+ cpp_options *
+ cpp_get_options (cpp_reader *pfile)
+diff -Nur a/libcpp/errors.c b/libcpp/errors.c
+--- a/libcpp/errors.c 2009-04-10 01:23:07.000000000 +0200
++++ b/libcpp/errors.c 2010-01-25 09:50:29.595686516 +0100
+@@ -28,171 +28,69 @@
+ #include "cpplib.h"
+ #include "internal.h"
+
+-static void print_location (cpp_reader *, source_location, unsigned int);
+-
+-/* Print the logical file location (LINE, COL) in preparation for a
+- diagnostic. Outputs the #include chain if it has changed. A line
+- of zero suppresses the include stack, and outputs the program name
+- instead. */
+-static void
+-print_location (cpp_reader *pfile, source_location line, unsigned int col)
+-{
+- if (line == 0)
+- fprintf (stderr, "%s: ", progname);
+- else
+- {
+- const struct line_map *map;
+- linenum_type lin;
+-
+- map = linemap_lookup (pfile->line_table, line);
+- linemap_print_containing_files (pfile->line_table, map);
+-
+- lin = SOURCE_LINE (map, line);
+- if (col == 0)
+- {
+- col = SOURCE_COLUMN (map, line);
+- if (col == 0)
+- col = 1;
+- }
+-
+- if (lin == 0)
+- fprintf (stderr, "%s:", map->to_file);
+- else if (CPP_OPTION (pfile, show_column) == 0)
+- fprintf (stderr, "%s:%u:", map->to_file, lin);
+- else
+- fprintf (stderr, "%s:%u:%u:", map->to_file, lin, col);
+-
+- fputc (' ', stderr);
+- }
+-}
+-
+-/* Set up for a diagnostic: print the file and line, bump the error
+- counter, etc. SRC_LOC is the logical line number; zero means to print
+- at the location of the previously lexed token, which tends to be
+- the correct place by default. The column number can be specified either
+- using COLUMN or (if COLUMN==0) extracting SOURCE_COLUMN from SRC_LOC.
+- (This may seem redundant, but is useful when pre-scanning (cleaning) a line,
+- when we haven't yet verified whether the current line_map has a
+- big enough max_column_hint.)
+-
+- Returns 0 if the error has been suppressed. */
+-static int
+-_cpp_begin_message (cpp_reader *pfile, int code,
+- source_location src_loc, unsigned int column)
+-{
+- int level = CPP_DL_EXTRACT (code);
+-
+- switch (level)
+- {
+- case CPP_DL_WARNING:
+- case CPP_DL_PEDWARN:
+- if (cpp_in_system_header (pfile)
+- && ! CPP_OPTION (pfile, warn_system_headers))
+- return 0;
+- /* Fall through. */
+-
+- case CPP_DL_WARNING_SYSHDR:
+- if (CPP_OPTION (pfile, warnings_are_errors)
+- || (level == CPP_DL_PEDWARN && CPP_OPTION (pfile, pedantic_errors)))
+- {
+- if (CPP_OPTION (pfile, inhibit_errors))
+- return 0;
+- level = CPP_DL_ERROR;
+- pfile->errors++;
+- }
+- else if (CPP_OPTION (pfile, inhibit_warnings))
+- return 0;
+- break;
+-
+- case CPP_DL_ERROR:
+- if (CPP_OPTION (pfile, inhibit_errors))
+- return 0;
+- /* ICEs cannot be inhibited. */
+- case CPP_DL_ICE:
+- pfile->errors++;
+- break;
+- }
+-
+- print_location (pfile, src_loc, column);
+- if (CPP_DL_WARNING_P (level))
+- fputs (_("warning: "), stderr);
+- else if (level == CPP_DL_ICE)
+- fputs (_("internal error: "), stderr);
+- else
+- fputs (_("error: "), stderr);
+-
+- return 1;
+-}
+-
+-/* Don't remove the blank before do, as otherwise the exgettext
+- script will mistake this as a function definition */
+-#define v_message(msgid, ap) \
+- do { vfprintf (stderr, _(msgid), ap); putc ('\n', stderr); } while (0)
+-
+-/* Exported interface. */
+-
+ /* Print an error at the location of the previously lexed token. */
+-void
++bool
+ cpp_error (cpp_reader * pfile, int level, const char *msgid, ...)
+ {
+ source_location src_loc;
+ va_list ap;
+-
++ bool ret;
++
+ va_start (ap, msgid);
+
+- if (CPP_OPTION (pfile, client_diagnostic))
+- pfile->cb.error (pfile, level, _(msgid), &ap);
+- else
++ if (CPP_OPTION (pfile, traditional))
+ {
+- if (CPP_OPTION (pfile, traditional))
+- {
+- if (pfile->state.in_directive)
+- src_loc = pfile->directive_line;
+- else
+- src_loc = pfile->line_table->highest_line;
+- }
+- /* We don't want to refer to a token before the beginning of the
+- current run -- that is invalid. */
+- else if (pfile->cur_token == pfile->cur_run->base)
+- {
+- if (pfile->cur_run->prev != NULL)
+- src_loc = pfile->cur_run->prev->limit->src_loc;
+- else
+- src_loc = 0;
+- }
++ if (pfile->state.in_directive)
++ src_loc = pfile->directive_line;
+ else
+- {
+- src_loc = pfile->cur_token[-1].src_loc;
+- }
+-
+- if (_cpp_begin_message (pfile, level, src_loc, 0))
+- v_message (msgid, ap);
++ src_loc = pfile->line_table->highest_line;
++ }
++ /* We don't want to refer to a token before the beginning of the
++ current run -- that is invalid. */
++ else if (pfile->cur_token == pfile->cur_run->base)
++ {
++ if (pfile->cur_run->prev != NULL)
++ src_loc = pfile->cur_run->prev->limit->src_loc;
++ else
++ src_loc = 0;
+ }
++ else
++ {
++ src_loc = pfile->cur_token[-1].src_loc;
++ }
++
++ if (!pfile->cb.error)
++ abort ();
++ ret = pfile->cb.error (pfile, level, src_loc, 0, _(msgid), &ap);
+
+ va_end (ap);
++ return ret;
+ }
+
+ /* Print an error at a specific location. */
+-void
++bool
+ cpp_error_with_line (cpp_reader *pfile, int level,
+ source_location src_loc, unsigned int column,
+ const char *msgid, ...)
+ {
+ va_list ap;
++ bool ret;
+
+ va_start (ap, msgid);
+
+- if (_cpp_begin_message (pfile, level, src_loc, column))
+- v_message (msgid, ap);
++ if (!pfile->cb.error)
++ abort ();
++ ret = pfile->cb.error (pfile, level, src_loc, column, _(msgid), &ap);
+
+ va_end (ap);
++ return ret;
+ }
+
+-void
++bool
+ cpp_errno (cpp_reader *pfile, int level, const char *msgid)
+ {
+ if (msgid[0] == '\0')
+ msgid = _("stdout");
+
+- cpp_error (pfile, level, "%s: %s", msgid, xstrerror (errno));
++ return cpp_error (pfile, level, "%s: %s", msgid, xstrerror (errno));
+ }
+diff -Nur a/libcpp/files.c b/libcpp/files.c
+--- a/libcpp/files.c 2009-04-10 01:23:07.000000000 +0200
++++ b/libcpp/files.c 2010-01-25 09:50:29.605686739 +0100
+@@ -488,7 +488,6 @@
+ return file;
+ }
+
+- open_file_failed (pfile, file, angle_brackets);
+ if (invalid_pch)
+ {
+ cpp_error (pfile, CPP_DL_ERROR,
+@@ -497,6 +496,7 @@
+ cpp_error (pfile, CPP_DL_ERROR,
+ "use -Winvalid-pch for more information");
+ }
++ open_file_failed (pfile, file, angle_brackets);
+ break;
+ }
+
+@@ -934,15 +934,28 @@
+
+ errno = file->err_no;
+ if (print_dep && CPP_OPTION (pfile, deps.missing_files) && errno == ENOENT)
+- deps_add_dep (pfile->deps, file->name);
++ {
++ deps_add_dep (pfile->deps, file->name);
++ /* If the preprocessor output (other than dependency information) is
++ being used, we must also flag an error. */
++ if (CPP_OPTION (pfile, deps.need_preprocessor_output))
++ cpp_errno (pfile, CPP_DL_FATAL, file->path);
++ }
+ else
+ {
+- /* If we are outputting dependencies but not for this file then
+- don't error because we can still produce correct output. */
+- if (CPP_OPTION (pfile, deps.style) && ! print_dep)
+- cpp_errno (pfile, CPP_DL_WARNING, file->path);
++ /* If we are not outputting dependencies, or if we are and dependencies
++ were requested for this file, or if preprocessor output is needed
++ in addition to dependency information, this is an error.
++
++ Otherwise (outputting dependencies but not for this file, and not
++ using the preprocessor output), we can still produce correct output
++ so it's only a warning. */
++ if (CPP_OPTION (pfile, deps.style) == DEPS_NONE
++ || print_dep
++ || CPP_OPTION (pfile, deps.need_preprocessor_output))
++ cpp_errno (pfile, CPP_DL_FATAL, file->path);
+ else
+- cpp_errno (pfile, CPP_DL_ERROR, file->path);
++ cpp_errno (pfile, CPP_DL_WARNING, file->path);
+ }
+ }
+
+diff -Nur a/libcpp/include/cpplib.h b/libcpp/include/cpplib.h
+--- a/libcpp/include/cpplib.h 2009-04-10 01:23:07.000000000 +0200
++++ b/libcpp/include/cpplib.h 2010-01-25 09:50:29.605686739 +0100
+@@ -302,22 +302,9 @@
+ /* Nonzero means print names of header files (-H). */
+ unsigned char print_include_names;
+
+- /* Nonzero means cpp_pedwarn causes a hard error. */
+- unsigned char pedantic_errors;
+-
+- /* Nonzero means don't print warning messages. */
+- unsigned char inhibit_warnings;
+-
+ /* Nonzero means complain about deprecated features. */
+ unsigned char warn_deprecated;
+
+- /* Nonzero means don't suppress warnings from system headers. */
+- unsigned char warn_system_headers;
+-
+- /* Nonzero means don't print error messages. Has no option to
+- select it, but can be set by a user of cpplib (e.g. fix-header). */
+- unsigned char inhibit_errors;
+-
+ /* Nonzero means warn if slash-star appears in a comment. */
+ unsigned char warn_comments;
+
+@@ -353,9 +340,6 @@
+ explicitly undefined. */
+ unsigned char warn_builtin_macro_redefined;
+
+- /* Nonzero means turn warnings into errors. */
+- unsigned char warnings_are_errors;
+-
+ /* Nonzero means we should look for header.gcc files that remap file
+ names. */
+ unsigned char remap;
+@@ -432,6 +416,10 @@
+
+ /* If true, no dependency is generated on the main file. */
+ bool ignore_main_file;
++
++ /* If true, intend to use the preprocessor output (e.g., for compilation)
++ in addition to the dependency info. */
++ bool need_preprocessor_output;
+ } deps;
+
+ /* Target-specific features set by the front end or client. */
+@@ -450,9 +438,6 @@
+ /* Nonzero means __STDC__ should have the value 0 in system headers. */
+ unsigned char stdc_0_in_system_headers;
+
+- /* True means error callback should be used for diagnostics. */
+- bool client_diagnostic;
+-
+ /* True disables tokenization outside of preprocessing directives. */
+ bool directives_only;
+ };
+@@ -492,10 +477,11 @@
+ be expanded. */
+ cpp_hashnode * (*macro_to_expand) (cpp_reader *, const cpp_token *);
+
+- /* Called to emit a diagnostic if client_diagnostic option is true.
+- This callback receives the translated message. */
+- void (*error) (cpp_reader *, int, const char *, va_list *)
+- ATTRIBUTE_FPTR_PRINTF(3,0);
++ /* Called to emit a diagnostic. This callback receives the
++ translated message. */
++ bool (*error) (cpp_reader *, int, source_location, unsigned int,
++ const char *, va_list *)
++ ATTRIBUTE_FPTR_PRINTF(5,0);
+
+ /* Callbacks for when a macro is expanded, or tested (whether
+ defined or not at the time) in #ifdef, #ifndef or "defined". */
+@@ -697,19 +683,13 @@
+
+ /* Call this to finish preprocessing. If you requested dependency
+ generation, pass an open stream to write the information to,
+- otherwise NULL. It is your responsibility to close the stream.
+-
+- Returns cpp_errors (pfile). */
+-extern int cpp_finish (cpp_reader *, FILE *deps_stream);
++ otherwise NULL. It is your responsibility to close the stream. */
++extern void cpp_finish (cpp_reader *, FILE *deps_stream);
+
+ /* Call this to release the handle at the end of preprocessing. Any
+- use of the handle after this function returns is invalid. Returns
+- cpp_errors (pfile). */
++ use of the handle after this function returns is invalid. */
+ extern void cpp_destroy (cpp_reader *);
+
+-/* Error count. */
+-extern unsigned int cpp_errors (cpp_reader *);
+-
+ extern unsigned int cpp_token_len (const cpp_token *);
+ extern unsigned char *cpp_token_as_text (cpp_reader *, const cpp_token *);
+ extern unsigned char *cpp_spell_token (cpp_reader *, const cpp_token *,
+@@ -835,24 +815,23 @@
+ /* An internal consistency check failed. Prints "internal error: ",
+ otherwise the same as CPP_DL_ERROR. */
+ #define CPP_DL_ICE 0x04
+-/* Extracts a diagnostic level from an int. */
+-#define CPP_DL_EXTRACT(l) (l & 0xf)
+-/* Nonzero if a diagnostic level is one of the warnings. */
+-#define CPP_DL_WARNING_P(l) (CPP_DL_EXTRACT (l) >= CPP_DL_WARNING \
+- && CPP_DL_EXTRACT (l) <= CPP_DL_PEDWARN)
++/* An informative note following a warning. */
++#define CPP_DL_NOTE 0x05
++/* A fatal error. */
++#define CPP_DL_FATAL 0x06
+
+ /* Output a diagnostic of some kind. */
+-extern void cpp_error (cpp_reader *, int, const char *msgid, ...)
++extern bool cpp_error (cpp_reader *, int, const char *msgid, ...)
+ ATTRIBUTE_PRINTF_3;
+
+ /* Output a diagnostic with "MSGID: " preceding the
+ error string of errno. No location is printed. */
+-extern void cpp_errno (cpp_reader *, int, const char *msgid);
++extern bool cpp_errno (cpp_reader *, int, const char *msgid);
+
+ /* Same as cpp_error, except additionally specifies a position as a
+ (translation unit) physical line and physical column. If the line is
+ zero, then no location is printed. */
+-extern void cpp_error_with_line (cpp_reader *, int, source_location, unsigned,
++extern bool cpp_error_with_line (cpp_reader *, int, source_location, unsigned,
+ const char *msgid, ...) ATTRIBUTE_PRINTF_5;
+
+ /* In lex.c */
+diff -Nur a/libcpp/include/line-map.h b/libcpp/include/line-map.h
+--- a/libcpp/include/line-map.h 2009-04-10 01:23:07.000000000 +0200
++++ b/libcpp/include/line-map.h 2010-01-25 09:50:29.605686739 +0100
+@@ -144,12 +144,6 @@
+ extern const struct line_map *linemap_lookup
+ (struct line_maps *, source_location);
+
+-/* Print the file names and line numbers of the #include commands
+- which led to the map MAP, if any, to stderr. Nothing is output if
+- the most recently listed stack is the same as the current one. */
+-extern void linemap_print_containing_files (struct line_maps *,
+- const struct line_map *);
+-
+ /* Converts a map and a source_location to source line. */
+ #define SOURCE_LINE(MAP, LOC) \
+ ((((LOC) - (MAP)->start_location) >> (MAP)->column_bits) + (MAP)->to_line)
+diff -Nur a/libcpp/init.c b/libcpp/init.c
+--- a/libcpp/init.c 2009-04-10 01:23:07.000000000 +0200
++++ b/libcpp/init.c 2010-01-25 09:50:29.605686739 +0100
+@@ -616,12 +616,11 @@
+ }
+
+ /* This is called at the end of preprocessing. It pops the last
+- buffer and writes dependency output, and returns the number of
+- errors.
++ buffer and writes dependency output.
+
+ Maybe it should also reset state, such that you could call
+ cpp_start_read with a new filename to restart processing. */
+-int
++void
+ cpp_finish (cpp_reader *pfile, FILE *deps_stream)
+ {
+ /* Warn about unused macros before popping the final buffer. */
+@@ -636,9 +635,8 @@
+ while (pfile->buffer)
+ _cpp_pop_buffer (pfile);
+
+- /* Don't write the deps file if there are errors. */
+ if (CPP_OPTION (pfile, deps.style) != DEPS_NONE
+- && deps_stream && pfile->errors == 0)
++ && deps_stream)
+ {
+ deps_write (pfile->deps, deps_stream, 72);
+
+@@ -649,8 +647,6 @@
+ /* Report on headers that could use multiple include guards. */
+ if (CPP_OPTION (pfile, print_include_names))
+ _cpp_report_missing_guards (pfile);
+-
+- return pfile->errors;
+ }
+
+ static void
+diff -Nur a/libcpp/internal.h b/libcpp/internal.h
+--- a/libcpp/internal.h 2009-04-10 01:23:07.000000000 +0200
++++ b/libcpp/internal.h 2010-01-25 09:50:29.605686739 +0100
+@@ -388,9 +388,6 @@
+ /* Nonzero prevents the lexer from re-using the token runs. */
+ unsigned int keep_tokens;
+
+- /* Error counter for exit code. */
+- unsigned int errors;
+-
+ /* Buffer to hold macro definition string. */
+ unsigned char *macro_buffer;
+ unsigned int macro_buffer_len;
+diff -Nur a/libcpp/line-map.c b/libcpp/line-map.c
+--- a/libcpp/line-map.c 2009-04-10 01:23:07.000000000 +0200
++++ b/libcpp/line-map.c 2010-01-25 09:50:29.605686739 +0100
+@@ -302,45 +302,6 @@
+ return &set->maps[mn];
+ }
+
+-/* Print the file names and line numbers of the #include commands
+- which led to the map MAP, if any, to stderr. Nothing is output if
+- the most recently listed stack is the same as the current one. */
+-
+-void
+-linemap_print_containing_files (struct line_maps *set,
+- const struct line_map *map)
+-{
+- if (MAIN_FILE_P (map) || set->last_listed == map->included_from)
+- return;
+-
+- set->last_listed = map->included_from;
+- map = INCLUDED_FROM (set, map);
+-
+- fprintf (stderr, _("In file included from %s:%u"),
+- map->to_file, LAST_SOURCE_LINE (map));
+-
+- while (! MAIN_FILE_P (map))
+- {
+- map = INCLUDED_FROM (set, map);
+- /* Translators note: this message is used in conjunction
+- with "In file included from %s:%ld" and some other
+- tricks. We want something like this:
+-
+- | In file included from sys/select.h:123,
+- | from sys/types.h:234,
+- | from userfile.c:31:
+- | bits/select.h:45: <error message here>
+-
+- with all the "from"s lined up.
+- The trailing comma is at the beginning of this message,
+- and the trailing colon is not translated. */
+- fprintf (stderr, _(",\n from %s:%u"),
+- map->to_file, LAST_SOURCE_LINE (map));
+- }
+-
+- fputs (":\n", stderr);
+-}
+-
+ /* Print an include trace, for e.g. the -H option of the preprocessor. */
+
+ static void
+diff -Nur a/libcpp/macro.c b/libcpp/macro.c
+--- a/libcpp/macro.c 2009-04-10 01:23:07.000000000 +0200
++++ b/libcpp/macro.c 2010-01-25 09:50:29.605686739 +0100
+@@ -1833,11 +1833,13 @@
+
+ if (warn_of_redefinition (pfile, node, macro))
+ {
+- cpp_error_with_line (pfile, CPP_DL_PEDWARN, pfile->directive_line, 0,
+- "\"%s\" redefined", NODE_NAME (node));
++ bool warned;
++ warned = cpp_error_with_line (pfile, CPP_DL_PEDWARN,
++ pfile->directive_line, 0,
++ "\"%s\" redefined", NODE_NAME (node));
+
+- if (node->type == NT_MACRO && !(node->flags & NODE_BUILTIN))
+- cpp_error_with_line (pfile, CPP_DL_PEDWARN,
++ if (warned && node->type == NT_MACRO && !(node->flags & NODE_BUILTIN))
++ cpp_error_with_line (pfile, CPP_DL_NOTE,
+ node->value.macro->line, 0,
+ "this is the location of the previous definition");
+ }
+diff -Nur a/libcpp/makedepend.c b/libcpp/makedepend.c
+--- a/libcpp/makedepend.c 2005-06-29 04:34:39.000000000 +0200
++++ b/libcpp/makedepend.c 2010-01-25 09:50:29.605686739 +0100
+@@ -1,206 +0,0 @@
+-/* Dependency generator utility.
+- Copyright (C) 2004 Free Software Foundation, Inc.
+- Contributed by Zack Weinberg, May 2004
+-
+-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 2, 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 this program; if not, write to the Free Software
+-Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+-
+- In other words, you are welcome to use, share and improve this program.
+- You are forbidden to forbid anyone else to use, share and improve
+- what you give them. Help stamp out software-hoarding! */
+-
+-#include "config.h"
+-#include "system.h"
+-#include "line-map.h"
+-#include "cpplib.h"
+-#include "getopt.h"
+-#include "mkdeps.h"
+-
+-const char *progname;
+-const char *vpath;
+-
+-static const char *output_file;
+-static bool had_errors;
+-
+-/* Option lists, to give to cpplib before each input file. */
+-struct cmd_line_macro
+-{
+- struct cmd_line_macro *next;
+- bool is_undef;
+- const char *macro;
+-};
+-
+-static struct cmd_line_macro *cmd_line_macros;
+-static cpp_dir *cmd_line_searchpath;
+-
+-static void
+-add_clm (const char *macro, bool is_undef)
+-{
+- struct cmd_line_macro *clm = XNEW (struct cmd_line_macro);
+- clm->next = cmd_line_macros;
+- clm->is_undef = is_undef;
+- clm->macro = macro;
+- cmd_line_macros = clm;
+-}
+-
+-static void
+-add_dir (char *name, bool sysp)
+-{
+- cpp_dir *dir = XNEW (cpp_dir);
+- dir->next = cmd_line_searchpath;
+- dir->name = name;
+- dir->sysp = sysp;
+- dir->construct = 0;
+- dir->user_supplied_p = 1;
+- cmd_line_searchpath = dir;
+-}
+-
+-/* Command line processing. */
+-
+-static void ATTRIBUTE_NORETURN
+-usage (int errcode)
+-{
+- fprintf (stderr,
+-"usage: %s [-vh] [-V vpath] [-Dname[=def]...] [-Uname] [-Idir...] [-o file] sources...\n",
+- progname);
+- exit (errcode);
+-}
+-
+-static int
+-parse_options (int argc, char **argv)
+-{
+- static const struct option longopts[] = {
+- { "--help", no_argument, 0, 'h' },
+- { 0, 0, 0, 0 }
+- };
+-
+- for (;;)
+- switch (getopt_long (argc, argv, "hD:U:I:J:o:V:", longopts, 0))
+- {
+- case 'h': usage (0);
+- case 'D': add_clm (optarg, false); break;
+- case 'U': add_clm (optarg, true); break;
+- case 'I': add_dir (optarg, false); break;
+- case 'J': add_dir (optarg, true); break;
+- case 'o':
+- if (output_file)
+- {
+- fprintf (stderr, "%s: too many output files\n", progname);
+- usage (2);
+- }
+- output_file = optarg;
+- break;
+- case 'V':
+- if (vpath)
+- {
+- fprintf (stderr, "%s: too many vpaths\n", progname);
+- usage (2);
+- }
+- vpath = optarg;
+- break;
+- case '?':
+- usage (2); /* getopt has issued the error message. */
+-
+- case -1: /* end of options */
+- if (optind == argc)
+- {
+- fprintf (stderr, "%s: no input files\n", progname);
+- usage (2);
+- }
+- return optind;
+-
+- default:
+- abort ();
+- }
+-}
+-
+-/* Set up cpplib from command line options. */
+-static cpp_reader *
+-reader_init (struct line_maps *line_table)
+-{
+- cpp_reader *reader;
+- cpp_options *options;
+-
+- linemap_init (line_table);
+- reader = cpp_create_reader (CLK_GNUC89, 0, line_table);
+-
+- /* Ignore warnings and errors (we don't have access to system
+- headers). Request dependency output. */
+- options = cpp_get_options (reader);
+- options->inhibit_warnings = 1;
+- options->inhibit_errors = 1;
+- options->deps.style = DEPS_USER;
+-
+- /* Further initialization. */
+- cpp_post_options (reader);
+- cpp_init_iconv (reader);
+- cpp_set_include_chains (reader, cmd_line_searchpath, cmd_line_searchpath,
+- false);
+- if (vpath)
+- {
+- struct deps *deps = cpp_get_deps (reader);
+- deps_add_vpath (deps, vpath);
+- }
+-
+- return reader;
+-}
+-
+-/* Process one input source file. */
+-static void
+-process_file (const char *file)
+-{
+- struct line_maps line_table;
+- cpp_reader *reader = reader_init (&line_table);
+-
+- if (!cpp_read_main_file (reader, file))
+- had_errors = true;
+- else
+- {
+- struct cmd_line_macro *clm;
+-
+- cpp_init_builtins (reader, true);
+- for (clm = cmd_line_macros; clm; clm = clm->next)
+- (clm->is_undef ? cpp_undef : cpp_define) (reader, clm->macro);
+-
+- cpp_scan_nooutput (reader);
+- if (cpp_finish (reader, stdout))
+- had_errors = true;
+- }
+- cpp_destroy (reader);
+- linemap_free (&line_table);
+-}
+-
+-/* Master control. */
+-
+-int
+-main(int argc, char **argv)
+-{
+- int first_input, i;
+-
+- progname = argv[0];
+- xmalloc_set_program_name (progname);
+-
+- first_input = parse_options (argc, argv);
+- if (output_file)
+- if (!freopen (output_file, "w", stdout))
+- {
+- perror (output_file);
+- return 1;
+- }
+-
+- for (i = first_input; i < argc; i++)
+- process_file (argv[i]);
+-
+- return had_errors;
+-}
+diff -Nur a/libcpp/Makefile.in b/libcpp/Makefile.in
+--- a/libcpp/Makefile.in 2009-07-22 09:43:59.000000000 +0200
++++ b/libcpp/Makefile.in 2010-01-25 09:50:29.605686739 +0100
+@@ -72,13 +72,12 @@
+ libcpp_a_OBJS = charset.o directives.o directives-only.o errors.o \
+ expr.o files.o identifiers.o init.o lex.o line-map.o macro.o \
+ mkdeps.o pch.o symtab.o traditional.o
+-makedepend_OBJS = makedepend.o
+
+ libcpp_a_SOURCES = charset.c directives.c directives-only.c errors.c \
+ expr.c files.c identifiers.c init.c lex.c line-map.c macro.c \
+ mkdeps.c pch.c symtab.c traditional.c
+
+-all: libcpp.a makedepend$(EXEEXT) $(USED_CATALOGS)
++all: libcpp.a $(USED_CATALOGS)
+
+ .SUFFIXES:
+ .SUFFIXES: .c .gmo .o .obj .po .pox
+@@ -88,12 +87,6 @@
+ $(AR) $(ARFLAGS) libcpp.a $(libcpp_a_OBJS)
+ $(RANLIB) libcpp.a
+
+-makedepend$(EXEEXT): $(makedepend_OBJS) libcpp.a ../libiberty/libiberty.a
+- @rm -f makedepend$(EXEEXT)
+- $(CC) $(CFLAGS) $(LDFLAGS) -o makedepend$(EXEEXT) \
+- $(makedepend_OBJS) libcpp.a ../libiberty/libiberty.a \
+- $(LIBINTL) $(LIBICONV)
+-
+ # Rules to rebuild the configuration
+
+ Makefile: $(srcdir)/Makefile.in config.status
+@@ -165,7 +158,7 @@
+ -rm -f *.o
+
+ clean: mostlyclean
+- -rm -rf makedepend$(EXEEXT) libcpp.a $(srcdir)/autom4te.cache
++ -rm -rf libcpp.a $(srcdir)/autom4te.cache
+
+ distclean: clean
+ -rm -f config.h stamp-h1 config.status config.cache config.log \
+@@ -247,7 +240,7 @@
+ sed 's:$(srcdir)/::g' <po/$(PACKAGE).pot.tmp >po/$(PACKAGE).pot
+ rm po/$(PACKAGE).pot.tmp
+
+-TAGS_SOURCES = $(libcpp_a_SOURCES) makedepend.c internal.h ucnid.h \
++TAGS_SOURCES = $(libcpp_a_SOURCES) internal.h ucnid.h \
+ include/line-map.h include/symtab.h include/cpp-id-data.h \
+ include/cpplib.h include/mkdeps.h system.h
+
+@@ -259,7 +252,7 @@
+ .NOEXPORT:
+
+ # Dependencies
+--include $(patsubst %.o, $(DEPDIR)/%.Po, $(libcpp_a_OBJS) $(makedepend_OBJS))
++-include $(patsubst %.o, $(DEPDIR)/%.Po, $(libcpp_a_OBJS))
+
+ # Dependencies on generated headers have to be explicit.
+ init.o: localedir.h
+diff -Nur a/libgcc/config/arm/t-divmod-ef b/libgcc/config/arm/t-divmod-ef
+--- a/libgcc/config/arm/t-divmod-ef 1970-01-01 01:00:00.000000000 +0100
++++ b/libgcc/config/arm/t-divmod-ef 2010-01-25 09:50:29.605686739 +0100
+@@ -0,0 +1,4 @@
++# On ARM, specifying -fnon-call-exceptions will needlessly pull in
++# the unwinder in simple programs which use 64-bit division. Omitting
++# the option is safe.
++LIB2_DIVMOD_EXCEPTION_FLAGS := -fexceptions
+diff -Nur a/libgcc/config/mips/t-crtfm b/libgcc/config/mips/t-crtfm
+--- a/libgcc/config/mips/t-crtfm 1970-01-01 01:00:00.000000000 +0100
++++ b/libgcc/config/mips/t-crtfm 2010-01-25 09:50:29.605686739 +0100
+@@ -0,0 +1,3 @@
++crtfastmath.o: $(gcc_srcdir)/config/mips/crtfastmath.c
++ $(gcc_compile) -c $(gcc_srcdir)/config/mips/crtfastmath.c
++
+diff -Nur a/libgcc/config/rs6000/t-ppccomm b/libgcc/config/rs6000/t-ppccomm
+--- a/libgcc/config/rs6000/t-ppccomm 2008-06-26 16:15:49.000000000 +0200
++++ b/libgcc/config/rs6000/t-ppccomm 2010-01-25 09:50:29.605686739 +0100
+@@ -101,3 +101,63 @@
+
+ ncrtn$(objext): ncrtn.S
+ $(crt_compile) -c ncrtn.S
++
++crtsavres$(objext): crtsavres.S
++ $(crt_compile) -c crtsavres.S
++
++crtsavfpr$(objext): crtsavfpr.S
++ $(crt_compile) -c crtsavfpr.S
++
++crtresfpr$(objext): crtresfpr.S
++ $(crt_compile) -c crtresfpr.S
++
++crtsavgpr$(objext): crtsavgpr.S
++ $(crt_compile) -c crtsavgpr.S
++
++crtresgpr$(objext): crtresgpr.S
++ $(crt_compile) -c crtresgpr.S
++
++crtresxfpr$(objext): crtresxfpr.S
++ $(crt_compile) -c crtresxfpr.S
++
++crtresxgpr$(objext): crtresxgpr.S
++ $(crt_compile) -c crtresxgpr.S
++
++e500crtres32gpr$(objext): e500crtres32gpr.S
++ $(crt_compile) -c e500crtres32gpr.S
++
++e500crtres64gpr$(objext): e500crtres64gpr.S
++ $(crt_compile) -c e500crtres64gpr.S
++
++e500crtres64gprctr$(objext): e500crtres64gprctr.S
++ $(crt_compile) -c e500crtres64gprctr.S
++
++e500crtrest32gpr$(objext): e500crtrest32gpr.S
++ $(crt_compile) -c e500crtrest32gpr.S
++
++e500crtrest64gpr$(objext): e500crtrest64gpr.S
++ $(crt_compile) -c e500crtrest64gpr.S
++
++e500crtresx32gpr$(objext): e500crtresx32gpr.S
++ $(crt_compile) -c e500crtresx32gpr.S
++
++e500crtresx64gpr$(objext): e500crtresx64gpr.S
++ $(crt_compile) -c e500crtresx64gpr.S
++
++e500crtsav32gpr$(objext): e500crtsav32gpr.S
++ $(crt_compile) -c e500crtsav32gpr.S
++
++e500crtsav64gpr$(objext): e500crtsav64gpr.S
++ $(crt_compile) -c e500crtsav64gpr.S
++
++e500crtsav64gprctr$(objext): e500crtsav64gprctr.S
++ $(crt_compile) -c e500crtsav64gprctr.S
++
++e500crtsavg32gpr$(objext): e500crtsavg32gpr.S
++ $(crt_compile) -c e500crtsavg32gpr.S
++
++e500crtsavg64gpr$(objext): e500crtsavg64gpr.S
++ $(crt_compile) -c e500crtsavg64gpr.S
++
++e500crtsavg64gprctr$(objext): e500crtsavg64gprctr.S
++ $(crt_compile) -c e500crtsavg64gprctr.S
+diff -Nur a/libgcc/config.host b/libgcc/config.host
+--- a/libgcc/config.host 2009-04-17 13:58:41.000000000 +0200
++++ b/libgcc/config.host 2010-01-25 09:50:29.605686739 +0100
+@@ -203,12 +203,15 @@
+ arm*-*-netbsd*)
+ ;;
+ arm*-*-linux*) # ARM GNU/Linux with ELF
++ tmake_file="${tmake_file} arm/t-divmod-ef"
+ ;;
+ arm*-*-uclinux*) # ARM ucLinux
++ tmake_file="${tmake_file} arm/t-divmod-ef"
+ ;;
+ arm*-*-ecos-elf)
+ ;;
+ arm*-*-eabi* | arm*-*-symbianelf* )
++ tmake_file="${tmake_file} arm/t-divmod-ef"
+ ;;
+ arm*-*-rtems*)
+ ;;
+@@ -394,8 +397,12 @@
+ mips*-*-netbsd*) # NetBSD/mips, either endian.
+ ;;
+ mips64*-*-linux*)
++ extra_parts="$extra_parts crtfastmath.o"
++ tmake_file="{$tmake_file} mips/t-crtfm"
+ ;;
+ mips*-*-linux*) # Linux MIPS, either endian.
++ extra_parts="$extra_parts crtfastmath.o"
++ tmake_file="{$tmake_file} mips/t-crtfm"
+ ;;
+ mips*-*-openbsd*)
+ ;;
+@@ -419,6 +426,10 @@
+ ;;
+ mips64orion-*-elf* | mips64orionel-*-elf*)
+ ;;
++mips64octeon-wrs-elf* | mips64octeonel-wrs-elf*)
++ ;;
++mips64octeon-montavista-elf*)
++ ;;
+ mips*-*-rtems*)
+ ;;
+ mips-wrs-vxworks)
+diff -Nur a/libgcc/Makefile.in b/libgcc/Makefile.in
+--- a/libgcc/Makefile.in 2009-04-10 01:23:07.000000000 +0200
++++ b/libgcc/Makefile.in 2010-01-25 09:50:29.605686739 +0100
+@@ -389,18 +389,24 @@
+ endif
+ endif
+
++ifeq ($(LIB2_DIVMOD_EXCEPTION_FLAGS),)
++# Provide default flags for compiling divmod functions, if they haven't been
++# set already by a target-specific Makefile fragment.
++LIB2_DIVMOD_EXCEPTION_FLAGS := -fexceptions -fnon-call-exceptions
++endif
++
+ # Build LIB2_DIVMOD_FUNCS.
+ lib2-divmod-o = $(patsubst %,%$(objext),$(LIB2_DIVMOD_FUNCS))
+ $(lib2-divmod-o): %$(objext): $(gcc_srcdir)/libgcc2.c
+ $(gcc_compile) -DL$* -c $(gcc_srcdir)/libgcc2.c \
+- -fexceptions -fnon-call-exceptions $(vis_hide)
++ $(LIB2_DIVMOD_EXCEPTION_FLAGS) $(vis_hide)
+ libgcc-objects += $(lib2-divmod-o)
+
+ ifeq ($(enable_shared),yes)
+ lib2-divmod-s-o = $(patsubst %,%_s$(objext),$(LIB2_DIVMOD_FUNCS))
+ $(lib2-divmod-s-o): %_s$(objext): $(gcc_srcdir)/libgcc2.c
+ $(gcc_s_compile) -DL$* -c $(gcc_srcdir)/libgcc2.c \
+- -fexceptions -fnon-call-exceptions
++ $(LIB2_DIVMOD_EXCEPTION_FLAGS)
+ libgcc-s-objects += $(lib2-divmod-s-o)
+ endif
+
+diff -Nur a/libgcc/shared-object.mk b/libgcc/shared-object.mk
+--- a/libgcc/shared-object.mk 2008-07-03 21:22:00.000000000 +0200
++++ b/libgcc/shared-object.mk 2010-01-25 09:50:29.605686739 +0100
+@@ -8,11 +8,13 @@
+
+ ifeq ($(suffix $o),.c)
+
++c_flags-$(base)$(objext) := $(c_flags)
+ $(base)$(objext): $o
+- $(gcc_compile) $(c_flags) -c $< $(vis_hide)
++ $(gcc_compile) $(c_flags-$@) -c $< $(vis_hide)
+
++c_flags-$(base)_s$(objext) := $(c_flags)
+ $(base)_s$(objext): $o
+- $(gcc_s_compile) $(c_flags) -c $<
++ $(gcc_s_compile) $(c_flags-$@) -c $<
+
+ else
+
+diff -Nur a/libgcc/static-object.mk b/libgcc/static-object.mk
+--- a/libgcc/static-object.mk 2007-01-04 05:22:37.000000000 +0100
++++ b/libgcc/static-object.mk 2010-01-25 09:50:29.605686739 +0100
+@@ -8,8 +8,9 @@
+
+ ifeq ($(suffix $o),.c)
+
++c_flags-$(base)$(objext) := $(c_flags)
+ $(base)$(objext): $o
+- $(gcc_compile) $(c_flags) -c $< $(vis_hide)
++ $(gcc_compile) $(c_flags-$@) -c $< $(vis_hide)
+
+ else
+
+diff -Nur a/libgomp/configure b/libgomp/configure
+--- a/libgomp/configure 2009-07-22 09:43:59.000000000 +0200
++++ b/libgomp/configure 2010-01-25 09:50:29.605686739 +0100
+@@ -457,7 +457,7 @@
+ # include <unistd.h>
+ #endif"
+
+-ac_subst_vars='SHELL PATH_SEPARATOR PACKAGE_NAME PACKAGE_TARNAME PACKAGE_VERSION PACKAGE_STRING PACKAGE_BUGREPORT exec_prefix prefix program_transform_name bindir sbindir libexecdir datadir sysconfdir sharedstatedir localstatedir libdir includedir oldincludedir infodir mandir build_alias host_alias target_alias DEFS ECHO_C ECHO_N ECHO_T LIBS GENINSRC_TRUE GENINSRC_FALSE build build_cpu build_vendor build_os host host_cpu host_vendor host_os target target_cpu target_vendor target_os INSTALL_PROGRAM INSTALL_SCRIPT INSTALL_DATA CYGPATH_W PACKAGE VERSION ACLOCAL AUTOCONF AUTOMAKE AUTOHEADER MAKEINFO install_sh STRIP ac_ct_STRIP INSTALL_STRIP_PROGRAM mkdir_p AWK SET_MAKE am__leading_dot AMTAR am__tar am__untar multi_basedir toolexecdir toolexeclibdir CC ac_ct_CC EXEEXT OBJEXT DEPDIR am__include am__quote AMDEP_TRUE AMDEP_FALSE AMDEPBACKSLASH CCDEPMODE am__fastdepCC_TRUE am__fastdepCC_FALSE CFLAGS AR ac_ct_AR RANLIB ac_ct_RANLIB PERL BUILD_INFO_TRUE BUILD_INFO_FALSE LIBTOOL SED EGREP FGREP GREP LD DUMPBIN ac_ct_DUMPBIN NM LN_S OBJDUMP ac_ct_OBJDUMP lt_ECHO DSYMUTIL ac_ct_DSYMUTIL NMEDIT ac_ct_NMEDIT LIPO ac_ct_LIPO OTOOL ac_ct_OTOOL OTOOL64 ac_ct_OTOOL64 CPP CPPFLAGS enable_shared enable_static MAINTAINER_MODE_TRUE MAINTAINER_MODE_FALSE MAINT FC FCFLAGS LDFLAGS ac_ct_FC libtool_VERSION SECTION_LDFLAGS OPT_LDFLAGS LIBGOMP_BUILD_VERSIONED_SHLIB_TRUE LIBGOMP_BUILD_VERSIONED_SHLIB_FALSE config_path XCFLAGS XLDFLAGS link_gomp USE_FORTRAN_TRUE USE_FORTRAN_FALSE OMP_LOCK_SIZE OMP_LOCK_ALIGN OMP_NEST_LOCK_SIZE OMP_NEST_LOCK_ALIGN OMP_LOCK_KIND OMP_NEST_LOCK_KIND OMP_LOCK_25_SIZE OMP_LOCK_25_ALIGN OMP_NEST_LOCK_25_SIZE OMP_NEST_LOCK_25_ALIGN OMP_LOCK_25_KIND OMP_NEST_LOCK_25_KIND LIBOBJS LTLIBOBJS'
++ac_subst_vars='SHELL PATH_SEPARATOR PACKAGE_NAME PACKAGE_TARNAME PACKAGE_VERSION PACKAGE_STRING PACKAGE_BUGREPORT exec_prefix prefix program_transform_name bindir sbindir libexecdir datadir sysconfdir sharedstatedir localstatedir libdir includedir oldincludedir infodir mandir build_alias host_alias target_alias DEFS ECHO_C ECHO_N ECHO_T LIBS GENINSRC_TRUE GENINSRC_FALSE build build_cpu build_vendor build_os host host_cpu host_vendor host_os target target_cpu target_vendor target_os INSTALL_PROGRAM INSTALL_SCRIPT INSTALL_DATA CYGPATH_W PACKAGE VERSION ACLOCAL AUTOCONF AUTOMAKE AUTOHEADER MAKEINFO install_sh STRIP ac_ct_STRIP INSTALL_STRIP_PROGRAM mkdir_p AWK SET_MAKE am__leading_dot AMTAR am__tar am__untar multi_basedir toolexecdir toolexeclibdir datarootdir docdir pdfdir htmldir CC ac_ct_CC EXEEXT OBJEXT DEPDIR am__include am__quote AMDEP_TRUE AMDEP_FALSE AMDEPBACKSLASH CCDEPMODE am__fastdepCC_TRUE am__fastdepCC_FALSE CFLAGS AR ac_ct_AR RANLIB ac_ct_RANLIB PERL BUILD_INFO_TRUE BUILD_INFO_FALSE LIBTOOL SED EGREP FGREP GREP LD DUMPBIN ac_ct_DUMPBIN NM LN_S OBJDUMP ac_ct_OBJDUMP lt_ECHO DSYMUTIL ac_ct_DSYMUTIL NMEDIT ac_ct_NMEDIT LIPO ac_ct_LIPO OTOOL ac_ct_OTOOL OTOOL64 ac_ct_OTOOL64 CPP CPPFLAGS enable_shared enable_static MAINTAINER_MODE_TRUE MAINTAINER_MODE_FALSE MAINT FC FCFLAGS LDFLAGS ac_ct_FC libtool_VERSION SECTION_LDFLAGS OPT_LDFLAGS LIBGOMP_BUILD_VERSIONED_SHLIB_TRUE LIBGOMP_BUILD_VERSIONED_SHLIB_FALSE config_path XCFLAGS XLDFLAGS link_gomp USE_FORTRAN_TRUE USE_FORTRAN_FALSE OMP_LOCK_SIZE OMP_LOCK_ALIGN OMP_NEST_LOCK_SIZE OMP_NEST_LOCK_ALIGN OMP_LOCK_KIND OMP_NEST_LOCK_KIND OMP_LOCK_25_SIZE OMP_LOCK_25_ALIGN OMP_NEST_LOCK_25_SIZE OMP_NEST_LOCK_25_ALIGN OMP_LOCK_25_KIND OMP_NEST_LOCK_25_KIND LIBOBJS LTLIBOBJS'
+ ac_subst_files=''
+ ac_pwd=`pwd`
+
+@@ -1029,6 +1029,10 @@
+ Optional Packages:
+ --with-PACKAGE[=ARG] use PACKAGE [ARG=yes]
+ --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no)
++ --with-datarootdir=DIR Use DIR as the data root [PREFIX/share]
++ --with-docdir=DIR Install documentation in DIR [DATAROOTDIR]
++ --with-pdfdir install pdf in this directory.
++ --with-htmldir=DIR html documentation in in DIR [DOCDIR]
+ --with-pic try to use only PIC/non-PIC objects [default=use
+ both]
+ --with-gnu-ld assume the C compiler uses GNU ld [default=no]
+@@ -2201,6 +2205,46 @@
+
+
+
++
++# Check whether --with-datarootdir or --without-datarootdir was given.
++if test "${with_datarootdir+set}" = set; then
++ withval="$with_datarootdir"
++ datarootdir="\${prefix}/$with_datarootdir"
++else
++ datarootdir='$(prefix)/share'
++fi;
++
++
++
++# Check whether --with-docdir or --without-docdir was given.
++if test "${with_docdir+set}" = set; then
++ withval="$with_docdir"
++ docdir="\${prefix}/$with_docdir"
++else
++ docdir='$(datarootdir)'
++fi;
++
++
++
++# Check whether --with-pdfdir or --without-pdfdir was given.
++if test "${with_pdfdir+set}" = set; then
++ withval="$with_pdfdir"
++ pdfdir="\${prefix}/${withval}"
++else
++ pdfdir="\${docdir}"
++fi;
++
++
++
++# Check whether --with-htmldir or --without-htmldir was given.
++if test "${with_htmldir+set}" = set; then
++ withval="$with_htmldir"
++ htmldir="\${prefix}/$with_htmldir"
++else
++ htmldir='$(docdir)'
++fi;
++
++
+ # Check the compiler.
+ # The same as in boehm-gc and libstdc++. Have to borrow it from there.
+ # We must force CC to /not/ be precious variables; otherwise
+@@ -4156,13 +4200,13 @@
+ else
+ lt_cv_nm_interface="BSD nm"
+ echo "int some_variable = 0;" > conftest.$ac_ext
+- (eval echo "\"\$as_me:4159: $ac_compile\"" >&5)
++ (eval echo "\"\$as_me:4203: $ac_compile\"" >&5)
+ (eval "$ac_compile" 2>conftest.err)
+ cat conftest.err >&5
+- (eval echo "\"\$as_me:4162: $NM \\\"conftest.$ac_objext\\\"\"" >&5)
++ (eval echo "\"\$as_me:4206: $NM \\\"conftest.$ac_objext\\\"\"" >&5)
+ (eval "$NM \"conftest.$ac_objext\"" 2>conftest.err > conftest.out)
+ cat conftest.err >&5
+- (eval echo "\"\$as_me:4165: output\"" >&5)
++ (eval echo "\"\$as_me:4209: output\"" >&5)
+ cat conftest.out >&5
+ if $GREP 'External.*some_variable' conftest.out > /dev/null; then
+ lt_cv_nm_interface="MS dumpbin"
+@@ -5320,7 +5364,7 @@
+ ;;
+ *-*-irix6*)
+ # Find out which ABI we are using.
+- echo '#line 5323 "configure"' > conftest.$ac_ext
++ echo '#line 5367 "configure"' > conftest.$ac_ext
+ if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+@@ -7101,11 +7145,11 @@
+ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
+ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
+ -e 's:$: $lt_compiler_flag:'`
+- (eval echo "\"\$as_me:7104: $lt_compile\"" >&5)
++ (eval echo "\"\$as_me:7148: $lt_compile\"" >&5)
+ (eval "$lt_compile" 2>conftest.err)
+ ac_status=$?
+ cat conftest.err >&5
+- echo "$as_me:7108: \$? = $ac_status" >&5
++ echo "$as_me:7152: \$? = $ac_status" >&5
+ if (exit $ac_status) && test -s "$ac_outfile"; then
+ # The compiler can only warn and ignore the option if not recognized
+ # So say no if there are warnings other than the usual output.
+@@ -7440,11 +7484,11 @@
+ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
+ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
+ -e 's:$: $lt_compiler_flag:'`
+- (eval echo "\"\$as_me:7443: $lt_compile\"" >&5)
++ (eval echo "\"\$as_me:7487: $lt_compile\"" >&5)
+ (eval "$lt_compile" 2>conftest.err)
+ ac_status=$?
+ cat conftest.err >&5
+- echo "$as_me:7447: \$? = $ac_status" >&5
++ echo "$as_me:7491: \$? = $ac_status" >&5
+ if (exit $ac_status) && test -s "$ac_outfile"; then
+ # The compiler can only warn and ignore the option if not recognized
+ # So say no if there are warnings other than the usual output.
+@@ -7545,11 +7589,11 @@
+ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
+ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
+ -e 's:$: $lt_compiler_flag:'`
+- (eval echo "\"\$as_me:7548: $lt_compile\"" >&5)
++ (eval echo "\"\$as_me:7592: $lt_compile\"" >&5)
+ (eval "$lt_compile" 2>out/conftest.err)
+ ac_status=$?
+ cat out/conftest.err >&5
+- echo "$as_me:7552: \$? = $ac_status" >&5
++ echo "$as_me:7596: \$? = $ac_status" >&5
+ if (exit $ac_status) && test -s out/conftest2.$ac_objext
+ then
+ # The compiler can only warn and ignore the option if not recognized
+@@ -7600,11 +7644,11 @@
+ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
+ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
+ -e 's:$: $lt_compiler_flag:'`
+- (eval echo "\"\$as_me:7603: $lt_compile\"" >&5)
++ (eval echo "\"\$as_me:7647: $lt_compile\"" >&5)
+ (eval "$lt_compile" 2>out/conftest.err)
+ ac_status=$?
+ cat out/conftest.err >&5
+- echo "$as_me:7607: \$? = $ac_status" >&5
++ echo "$as_me:7651: \$? = $ac_status" >&5
+ if (exit $ac_status) && test -s out/conftest2.$ac_objext
+ then
+ # The compiler can only warn and ignore the option if not recognized
+@@ -10412,7 +10456,7 @@
+ lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
+ lt_status=$lt_dlunknown
+ cat > conftest.$ac_ext <<_LT_EOF
+-#line 10415 "configure"
++#line 10459 "configure"
+ #include "confdefs.h"
+
+ #if HAVE_DLFCN_H
+@@ -10508,7 +10552,7 @@
+ lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
+ lt_status=$lt_dlunknown
+ cat > conftest.$ac_ext <<_LT_EOF
+-#line 10511 "configure"
++#line 10555 "configure"
+ #include "confdefs.h"
+
+ #if HAVE_DLFCN_H
+@@ -10859,7 +10903,7 @@
+
+
+ # Provide some information about the compiler.
+-echo "$as_me:10862:" \
++echo "$as_me:10906:" \
+ "checking for Fortran compiler version" >&5
+ ac_compiler=`set X $ac_compile; echo $2`
+ { (eval echo "$as_me:$LINENO: \"$ac_compiler --version </dev/null >&5\"") >&5
+@@ -11095,7 +11139,7 @@
+
+
+ # Provide some information about the compiler.
+-echo "$as_me:11098:" \
++echo "$as_me:11142:" \
+ "checking for Fortran compiler version" >&5
+ ac_compiler=`set X $ac_compile; echo $2`
+ { (eval echo "$as_me:$LINENO: \"$ac_compiler --version </dev/null >&5\"") >&5
+@@ -11835,11 +11879,11 @@
+ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
+ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
+ -e 's:$: $lt_compiler_flag:'`
+- (eval echo "\"\$as_me:11838: $lt_compile\"" >&5)
++ (eval echo "\"\$as_me:11882: $lt_compile\"" >&5)
+ (eval "$lt_compile" 2>conftest.err)
+ ac_status=$?
+ cat conftest.err >&5
+- echo "$as_me:11842: \$? = $ac_status" >&5
++ echo "$as_me:11886: \$? = $ac_status" >&5
+ if (exit $ac_status) && test -s "$ac_outfile"; then
+ # The compiler can only warn and ignore the option if not recognized
+ # So say no if there are warnings other than the usual output.
+@@ -11934,11 +11978,11 @@
+ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
+ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
+ -e 's:$: $lt_compiler_flag:'`
+- (eval echo "\"\$as_me:11937: $lt_compile\"" >&5)
++ (eval echo "\"\$as_me:11981: $lt_compile\"" >&5)
+ (eval "$lt_compile" 2>out/conftest.err)
+ ac_status=$?
+ cat out/conftest.err >&5
+- echo "$as_me:11941: \$? = $ac_status" >&5
++ echo "$as_me:11985: \$? = $ac_status" >&5
+ if (exit $ac_status) && test -s out/conftest2.$ac_objext
+ then
+ # The compiler can only warn and ignore the option if not recognized
+@@ -11986,11 +12030,11 @@
+ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
+ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
+ -e 's:$: $lt_compiler_flag:'`
+- (eval echo "\"\$as_me:11989: $lt_compile\"" >&5)
++ (eval echo "\"\$as_me:12033: $lt_compile\"" >&5)
+ (eval "$lt_compile" 2>out/conftest.err)
+ ac_status=$?
+ cat out/conftest.err >&5
+- echo "$as_me:11993: \$? = $ac_status" >&5
++ echo "$as_me:12037: \$? = $ac_status" >&5
+ if (exit $ac_status) && test -s out/conftest2.$ac_objext
+ then
+ # The compiler can only warn and ignore the option if not recognized
+@@ -15133,7 +15177,8 @@
+ cat confdefs.h >>conftest.$ac_ext
+ cat >>conftest.$ac_ext <<_ACEOF
+ /* end confdefs.h. */
+-$ac_includes_default
++/* no standard headers */
++
+ int
+ main ()
+ {
+@@ -15197,7 +15242,8 @@
+ cat confdefs.h >>conftest.$ac_ext
+ cat >>conftest.$ac_ext <<_ACEOF
+ /* end confdefs.h. */
+-$ac_includes_default
++/* no standard headers */
++
+ int
+ main ()
+ {
+@@ -15238,7 +15284,8 @@
+ cat confdefs.h >>conftest.$ac_ext
+ cat >>conftest.$ac_ext <<_ACEOF
+ /* end confdefs.h. */
+-$ac_includes_default
++/* no standard headers */
++
+ int
+ main ()
+ {
+@@ -15295,7 +15342,8 @@
+ cat confdefs.h >>conftest.$ac_ext
+ cat >>conftest.$ac_ext <<_ACEOF
+ /* end confdefs.h. */
+-$ac_includes_default
++/* no standard headers */
++
+ int
+ main ()
+ {
+@@ -15336,7 +15384,8 @@
+ cat confdefs.h >>conftest.$ac_ext
+ cat >>conftest.$ac_ext <<_ACEOF
+ /* end confdefs.h. */
+-$ac_includes_default
++/* no standard headers */
++
+ int
+ main ()
+ {
+@@ -15401,7 +15450,8 @@
+ cat confdefs.h >>conftest.$ac_ext
+ cat >>conftest.$ac_ext <<_ACEOF
+ /* end confdefs.h. */
+-$ac_includes_default
++/* no standard headers */
++
+ int
+ main ()
+ {
+@@ -15469,7 +15519,8 @@
+ cat confdefs.h >>conftest.$ac_ext
+ cat >>conftest.$ac_ext <<_ACEOF
+ /* end confdefs.h. */
+-$ac_includes_default
++/* no standard headers */
++
+ long longval () { return (long) (sizeof (void *)); }
+ unsigned long ulongval () { return (long) (sizeof (void *)); }
+ #include <stdio.h>
+@@ -15557,7 +15608,8 @@
+ cat confdefs.h >>conftest.$ac_ext
+ cat >>conftest.$ac_ext <<_ACEOF
+ /* end confdefs.h. */
+-$ac_includes_default
++/* no standard headers */
++
+ int
+ main ()
+ {
+@@ -15621,7 +15673,8 @@
+ cat confdefs.h >>conftest.$ac_ext
+ cat >>conftest.$ac_ext <<_ACEOF
+ /* end confdefs.h. */
+-$ac_includes_default
++/* no standard headers */
++
+ int
+ main ()
+ {
+@@ -15662,7 +15715,8 @@
+ cat confdefs.h >>conftest.$ac_ext
+ cat >>conftest.$ac_ext <<_ACEOF
+ /* end confdefs.h. */
+-$ac_includes_default
++/* no standard headers */
++
+ int
+ main ()
+ {
+@@ -15719,7 +15773,8 @@
+ cat confdefs.h >>conftest.$ac_ext
+ cat >>conftest.$ac_ext <<_ACEOF
+ /* end confdefs.h. */
+-$ac_includes_default
++/* no standard headers */
++
+ int
+ main ()
+ {
+@@ -15760,7 +15815,8 @@
+ cat confdefs.h >>conftest.$ac_ext
+ cat >>conftest.$ac_ext <<_ACEOF
+ /* end confdefs.h. */
+-$ac_includes_default
++/* no standard headers */
++
+ int
+ main ()
+ {
+@@ -15825,7 +15881,8 @@
+ cat confdefs.h >>conftest.$ac_ext
+ cat >>conftest.$ac_ext <<_ACEOF
+ /* end confdefs.h. */
+-$ac_includes_default
++/* no standard headers */
++
+ int
+ main ()
+ {
+@@ -15893,7 +15950,8 @@
+ cat confdefs.h >>conftest.$ac_ext
+ cat >>conftest.$ac_ext <<_ACEOF
+ /* end confdefs.h. */
+-$ac_includes_default
++/* no standard headers */
++
+ long longval () { return (long) (sizeof (long)); }
+ unsigned long ulongval () { return (long) (sizeof (long)); }
+ #include <stdio.h>
+@@ -15981,7 +16039,8 @@
+ cat confdefs.h >>conftest.$ac_ext
+ cat >>conftest.$ac_ext <<_ACEOF
+ /* end confdefs.h. */
+-$ac_includes_default
++/* no standard headers */
++
+ int
+ main ()
+ {
+@@ -16045,7 +16104,8 @@
+ cat confdefs.h >>conftest.$ac_ext
+ cat >>conftest.$ac_ext <<_ACEOF
+ /* end confdefs.h. */
+-$ac_includes_default
++/* no standard headers */
++
+ int
+ main ()
+ {
+@@ -16086,7 +16146,8 @@
+ cat confdefs.h >>conftest.$ac_ext
+ cat >>conftest.$ac_ext <<_ACEOF
+ /* end confdefs.h. */
+-$ac_includes_default
++/* no standard headers */
++
+ int
+ main ()
+ {
+@@ -16143,7 +16204,8 @@
+ cat confdefs.h >>conftest.$ac_ext
+ cat >>conftest.$ac_ext <<_ACEOF
+ /* end confdefs.h. */
+-$ac_includes_default
++/* no standard headers */
++
+ int
+ main ()
+ {
+@@ -16184,7 +16246,8 @@
+ cat confdefs.h >>conftest.$ac_ext
+ cat >>conftest.$ac_ext <<_ACEOF
+ /* end confdefs.h. */
+-$ac_includes_default
++/* no standard headers */
++
+ int
+ main ()
+ {
+@@ -16249,7 +16312,8 @@
+ cat confdefs.h >>conftest.$ac_ext
+ cat >>conftest.$ac_ext <<_ACEOF
+ /* end confdefs.h. */
+-$ac_includes_default
++/* no standard headers */
++
+ int
+ main ()
+ {
+@@ -16317,7 +16381,8 @@
+ cat confdefs.h >>conftest.$ac_ext
+ cat >>conftest.$ac_ext <<_ACEOF
+ /* end confdefs.h. */
+-$ac_includes_default
++/* no standard headers */
++
+ long longval () { return (long) (sizeof (int)); }
+ unsigned long ulongval () { return (long) (sizeof (int)); }
+ #include <stdio.h>
+@@ -16401,7 +16466,8 @@
+ cat confdefs.h >>conftest.$ac_ext
+ cat >>conftest.$ac_ext <<_ACEOF
+ /* end confdefs.h. */
+-$ac_includes_default
++/* no standard headers */
++
+ int
+ main ()
+ {
+@@ -16465,7 +16531,8 @@
+ cat confdefs.h >>conftest.$ac_ext
+ cat >>conftest.$ac_ext <<_ACEOF
+ /* end confdefs.h. */
+-$ac_includes_default
++/* no standard headers */
++
+ int
+ main ()
+ {
+@@ -16506,7 +16573,8 @@
+ cat confdefs.h >>conftest.$ac_ext
+ cat >>conftest.$ac_ext <<_ACEOF
+ /* end confdefs.h. */
+-$ac_includes_default
++/* no standard headers */
++
+ int
+ main ()
+ {
+@@ -16563,7 +16631,8 @@
+ cat confdefs.h >>conftest.$ac_ext
+ cat >>conftest.$ac_ext <<_ACEOF
+ /* end confdefs.h. */
+-$ac_includes_default
++/* no standard headers */
++
+ int
+ main ()
+ {
+@@ -16604,7 +16673,8 @@
+ cat confdefs.h >>conftest.$ac_ext
+ cat >>conftest.$ac_ext <<_ACEOF
+ /* end confdefs.h. */
+-$ac_includes_default
++/* no standard headers */
++
+ int
+ main ()
+ {
+@@ -16669,7 +16739,8 @@
+ cat confdefs.h >>conftest.$ac_ext
+ cat >>conftest.$ac_ext <<_ACEOF
+ /* end confdefs.h. */
+-$ac_includes_default
++/* no standard headers */
++
+ int
+ main ()
+ {
+@@ -16737,7 +16808,8 @@
+ cat confdefs.h >>conftest.$ac_ext
+ cat >>conftest.$ac_ext <<_ACEOF
+ /* end confdefs.h. */
+-$ac_includes_default
++/* no standard headers */
++
+ long longval () { return (long) (sizeof (short)); }
+ unsigned long ulongval () { return (long) (sizeof (short)); }
+ #include <stdio.h>
+@@ -16821,7 +16893,8 @@
+ cat confdefs.h >>conftest.$ac_ext
+ cat >>conftest.$ac_ext <<_ACEOF
+ /* end confdefs.h. */
+-$ac_includes_default
++/* no standard headers */
++
+ int
+ main ()
+ {
+@@ -16885,7 +16958,8 @@
+ cat confdefs.h >>conftest.$ac_ext
+ cat >>conftest.$ac_ext <<_ACEOF
+ /* end confdefs.h. */
+-$ac_includes_default
++/* no standard headers */
++
+ int
+ main ()
+ {
+@@ -16926,7 +17000,8 @@
+ cat confdefs.h >>conftest.$ac_ext
+ cat >>conftest.$ac_ext <<_ACEOF
+ /* end confdefs.h. */
+-$ac_includes_default
++/* no standard headers */
++
+ int
+ main ()
+ {
+@@ -16983,7 +17058,8 @@
+ cat confdefs.h >>conftest.$ac_ext
+ cat >>conftest.$ac_ext <<_ACEOF
+ /* end confdefs.h. */
+-$ac_includes_default
++/* no standard headers */
++
+ int
+ main ()
+ {
+@@ -17024,7 +17100,8 @@
+ cat confdefs.h >>conftest.$ac_ext
+ cat >>conftest.$ac_ext <<_ACEOF
+ /* end confdefs.h. */
+-$ac_includes_default
++/* no standard headers */
++
+ int
+ main ()
+ {
+@@ -17089,7 +17166,8 @@
+ cat confdefs.h >>conftest.$ac_ext
+ cat >>conftest.$ac_ext <<_ACEOF
+ /* end confdefs.h. */
+-$ac_includes_default
++/* no standard headers */
++
+ int
+ main ()
+ {
+@@ -17157,7 +17235,8 @@
+ cat confdefs.h >>conftest.$ac_ext
+ cat >>conftest.$ac_ext <<_ACEOF
+ /* end confdefs.h. */
+-$ac_includes_default
++/* no standard headers */
++
+ long longval () { return (long) (sizeof (char)); }
+ unsigned long ulongval () { return (long) (sizeof (char)); }
+ #include <stdio.h>
+@@ -17906,6 +17985,64 @@
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
++ chktls_save_LDFLAGS="$LDFLAGS"
++ case $host in
++ *-*-linux*)
++ LDFLAGS="-shared -Wl,--no-undefined $LDFLAGS"
++ ;;
++ esac
++ chktls_save_CFLAGS="$CFLAGS"
++ CFLAGS="-fPIC $CFLAGS"
++ cat >conftest.$ac_ext <<_ACEOF
++int f() { return 0; }
++_ACEOF
++rm -f conftest.$ac_objext conftest$ac_exeext
++if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
++ (eval $ac_link) 2>conftest.er1
++ ac_status=$?
++ grep -v '^ *+' conftest.er1 >conftest.err
++ rm -f conftest.er1
++ cat conftest.err >&5
++ echo "$as_me:$LINENO: \$? = $ac_status" >&5
++ (exit $ac_status); } &&
++ { ac_try='test -z "$ac_c_werror_flag"
++ || test ! -s conftest.err'
++ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
++ (eval $ac_try) 2>&5
++ ac_status=$?
++ echo "$as_me:$LINENO: \$? = $ac_status" >&5
++ (exit $ac_status); }; } &&
++ { ac_try='test -s conftest$ac_exeext'
++ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
++ (eval $ac_try) 2>&5
++ ac_status=$?
++ echo "$as_me:$LINENO: \$? = $ac_status" >&5
++ (exit $ac_status); }; }; then
++ cat >conftest.$ac_ext <<_ACEOF
++__thread int a; int b; int f() { return a = b; }
++_ACEOF
++rm -f conftest.$ac_objext conftest$ac_exeext
++if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
++ (eval $ac_link) 2>conftest.er1
++ ac_status=$?
++ grep -v '^ *+' conftest.er1 >conftest.err
++ rm -f conftest.er1
++ cat conftest.err >&5
++ echo "$as_me:$LINENO: \$? = $ac_status" >&5
++ (exit $ac_status); } &&
++ { ac_try='test -z "$ac_c_werror_flag"
++ || test ! -s conftest.err'
++ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
++ (eval $ac_try) 2>&5
++ ac_status=$?
++ echo "$as_me:$LINENO: \$? = $ac_status" >&5
++ (exit $ac_status); }; } &&
++ { ac_try='test -s conftest$ac_exeext'
++ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
++ (eval $ac_try) 2>&5
++ ac_status=$?
++ echo "$as_me:$LINENO: \$? = $ac_status" >&5
++ (exit $ac_status); }; }; then
+ gcc_cv_have_tls=yes
+ else
+ echo "$as_me: failed program was:" >&5
+@@ -17915,6 +18052,24 @@
+ fi
+ rm -f conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
++else
++ echo "$as_me: failed program was:" >&5
++sed 's/^/| /' conftest.$ac_ext >&5
++
++gcc_cv_have_tls=yes
++fi
++rm -f conftest.err conftest.$ac_objext \
++ conftest$ac_exeext conftest.$ac_ext
++ CFLAGS="$chktls_save_CFLAGS"
++ LDFLAGS="$chktls_save_LDFLAGS"
++else
++ echo "$as_me: failed program was:" >&5
++sed 's/^/| /' conftest.$ac_ext >&5
++
++gcc_cv_have_tls=no
++fi
++rm -f conftest.err conftest.$ac_objext \
++ conftest$ac_exeext conftest.$ac_ext
+
+
+ else
+@@ -22801,6 +22956,10 @@
+ s,@multi_basedir@,$multi_basedir,;t t
+ s,@toolexecdir@,$toolexecdir,;t t
+ s,@toolexeclibdir@,$toolexeclibdir,;t t
++s,@datarootdir@,$datarootdir,;t t
++s,@docdir@,$docdir,;t t
++s,@pdfdir@,$pdfdir,;t t
++s,@htmldir@,$htmldir,;t t
+ s,@CC@,$CC,;t t
+ s,@ac_ct_CC@,$ac_ct_CC,;t t
+ s,@EXEEXT@,$EXEEXT,;t t
+diff -Nur a/libgomp/configure.ac b/libgomp/configure.ac
+--- a/libgomp/configure.ac 2008-09-19 22:27:11.000000000 +0200
++++ b/libgomp/configure.ac 2010-01-25 09:50:29.605686739 +0100
+@@ -94,6 +94,30 @@
+ AC_SUBST(toolexecdir)
+ AC_SUBST(toolexeclibdir)
+
++AC_ARG_WITH(datarootdir,
++[ --with-datarootdir=DIR Use DIR as the data root [[PREFIX/share]]],
++datarootdir="\${prefix}/$with_datarootdir",
++datarootdir='$(prefix)/share')
++AC_SUBST(datarootdir)
++
++AC_ARG_WITH(docdir,
++[ --with-docdir=DIR Install documentation in DIR [[DATAROOTDIR]]],
++docdir="\${prefix}/$with_docdir",
++docdir='$(datarootdir)')
++AC_SUBST(docdir)
++
++AC_ARG_WITH(pdfdir,
++[ --with-pdfdir install pdf in this directory.],
++[pdfdir="\${prefix}/${withval}"],
++[pdfdir="\${docdir}"])
++AC_SUBST(pdfdir)
++
++AC_ARG_WITH(htmldir,
++[ --with-htmldir=DIR html documentation in in DIR [[DOCDIR]]],
++htmldir="\${prefix}/$with_htmldir",
++htmldir='$(docdir)')
++AC_SUBST(htmldir)
++
+ # Check the compiler.
+ # The same as in boehm-gc and libstdc++. Have to borrow it from there.
+ # We must force CC to /not/ be precious variables; otherwise
+diff -Nur a/libgomp/libgomp.texi b/libgomp/libgomp.texi
+--- a/libgomp/libgomp.texi 2008-11-04 19:16:17.000000000 +0100
++++ b/libgomp/libgomp.texi 2010-01-25 09:50:29.605686739 +0100
+@@ -94,7 +94,7 @@
+ How you can copy and share this manual.
+ * Funding:: How to help assure continued work for free
+ software.
+-* Index:: Index of this documentation.
++* Library Index:: Index of this documentation.
+ @end menu
+
+
+@@ -1713,8 +1713,8 @@
+ @c Index
+ @c ---------------------------------------------------------------------
+
+-@node Index
+-@unnumbered Index
++@node Library Index
++@unnumbered Library Index
+
+ @printindex cp
+
+diff -Nur a/libgomp/Makefile.am b/libgomp/Makefile.am
+--- a/libgomp/Makefile.am 2008-08-31 20:16:09.000000000 +0200
++++ b/libgomp/Makefile.am 2010-01-25 09:50:29.615687242 +0100
+@@ -1,5 +1,10 @@
+ ## Process this file with automake to produce Makefile.in
+
++datarootdir = @datarootdir@
++docdir = @docdir@
++htmldir = @htmldir@
++pdfdir = @pdfdir@
++
+ ACLOCAL_AMFLAGS = -I .. -I ../config
+ SUBDIRS = testsuite
+
+@@ -41,6 +46,12 @@
+ nodist_finclude_HEADERS = omp_lib.h omp_lib.f90 omp_lib.mod omp_lib_kinds.mod
+ endif
+
++LTLDFLAGS = $(shell $(SHELL) $(top_srcdir)/../libtool-ldflags $(LDFLAGS))
++
++LINK = $(LIBTOOL) --tag CC --mode=link $(CCLD) $(AM_CCFLAGS) $(CFLAGS) \
++ $(AM_LDFLAGS) $(LTLDFLAGS) -o $@
++
++
+ omp_lib_kinds.mod: omp_lib.mod
+ :
+ omp_lib.mod: omp_lib.f90
+@@ -50,10 +61,30 @@
+ env.lo: libgomp_f.h
+ env.o: libgomp_f.h
+
++HTMLS_INSTALL=libgomp
++HTMLS_BUILD=libgomp/index.html
+
+-# No install-html or install-pdf support in automake yet
+-.PHONY: install-html install-pdf
+-install-html:
++$(HTMLS_BUILD): $(info_TEXINFOS)
++ $(TEXI2HTML) $(MAKEINFOFLAGS) -I$(srcdir) -o $(@D) $<
++
++html__strip_dir = `echo $$p | sed -e 's|^.*/||'`;
++
++install-html: $(HTMLS_BUILD)
++ @$(NORMAL_INSTALL)
++ test -z "$(htmldir)" || $(mkinstalldirs) "$(DESTDIR)$(htmldir)"
++ @list='$(HTMLS_INSTALL)'; for p in $$list; do \
++ if test -f "$$p" || test -d "$$p"; then d=""; else d="$(srcdir)/"; fi; \
++ f=$(html__strip_dir) \
++ if test -d "$$d$$p"; then \
++ echo " $(mkinstalldirs) '$(DESTDIR)$(htmldir)/$$f'"; \
++ $(mkinstalldirs) "$(DESTDIR)$(htmldir)/$$f" || exit 1; \
++ echo " $(INSTALL_DATA) '$$d$$p'/* '$(DESTDIR)$(htmldir)/$$f'"; \
++ $(INSTALL_DATA) "$$d$$p"/* "$(DESTDIR)$(htmldir)/$$f"; \
++ else \
++ echo " $(INSTALL_DATA) '$$d$$p' '$(DESTDIR)$(htmldir)/$$f'"; \
++ $(INSTALL_DATA) "$$d$$p" "$(DESTDIR)$(htmldir)/$$f"; \
++ fi; \
++ done
+
+ install-pdf: $(PDFS)
+ @$(NORMAL_INSTALL)
+@@ -71,6 +102,7 @@
+ # `texinfo.tex' for your package. The value of this variable should be
+ # the relative path from the current `Makefile.am' to `texinfo.tex'.
+ TEXINFO_TEX = ../gcc/doc/include/texinfo.tex
++TEXI2HTML = $(MAKEINFO) --html
+
+ # Defines info, dvi, pdf and html targets
+ MAKEINFOFLAGS = -I $(srcdir)/../gcc/doc/include
+diff -Nur a/libgomp/Makefile.in b/libgomp/Makefile.in
+--- a/libgomp/Makefile.in 2009-07-22 09:43:59.000000000 +0200
++++ b/libgomp/Makefile.in 2010-01-25 09:50:29.615687242 +0100
+@@ -97,8 +97,6 @@
+ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
+ $(AM_CFLAGS) $(CFLAGS)
+ CCLD = $(CC)
+-LINK = $(LIBTOOL) --tag=CC --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
+- $(AM_LDFLAGS) $(LDFLAGS) -o $@
+ SOURCES = $(libgomp_la_SOURCES)
+ DIST_SOURCES = $(libgomp_la_SOURCES)
+ MULTISRCTOP =
+@@ -259,6 +257,8 @@
+ build_vendor = @build_vendor@
+ config_path = @config_path@
+ datadir = @datadir@
++datarootdir = @datarootdir@
++docdir = @docdir@
+ enable_shared = @enable_shared@
+ enable_static = @enable_static@
+ exec_prefix = @exec_prefix@
+@@ -267,6 +267,7 @@
+ host_cpu = @host_cpu@
+ host_os = @host_os@
+ host_vendor = @host_vendor@
++htmldir = @htmldir@
+ includedir = @includedir@
+ infodir = @infodir@
+ install_sh = @install_sh@
+@@ -280,6 +281,7 @@
+ mkdir_p = @mkdir_p@
+ multi_basedir = @multi_basedir@
+ oldincludedir = @oldincludedir@
++pdfdir = @pdfdir@
+ prefix = @prefix@
+ program_transform_name = @program_transform_name@
+ sbindir = @sbindir@
+@@ -317,6 +319,13 @@
+ nodist_noinst_HEADERS = libgomp_f.h
+ nodist_libsubinclude_HEADERS = omp.h
+ @USE_FORTRAN_TRUE@nodist_finclude_HEADERS = omp_lib.h omp_lib.f90 omp_lib.mod omp_lib_kinds.mod
++LTLDFLAGS = $(shell $(SHELL) $(top_srcdir)/../libtool-ldflags $(LDFLAGS))
++LINK = $(LIBTOOL) --tag CC --mode=link $(CCLD) $(AM_CCFLAGS) $(CFLAGS) \
++ $(AM_LDFLAGS) $(LTLDFLAGS) -o $@
++
++HTMLS_INSTALL = libgomp
++HTMLS_BUILD = libgomp/index.html
++html__strip_dir = `echo $$p | sed -e 's|^.*/||'`;
+
+ # Automake Documentation:
+ # If your package has Texinfo files in many directories, you can use the
+@@ -324,6 +333,7 @@
+ # `texinfo.tex' for your package. The value of this variable should be
+ # the relative path from the current `Makefile.am' to `texinfo.tex'.
+ TEXINFO_TEX = ../gcc/doc/include/texinfo.tex
++TEXI2HTML = $(MAKEINFO) --html
+
+ # Defines info, dvi, pdf and html targets
+ MAKEINFOFLAGS = -I $(srcdir)/../gcc/doc/include
+@@ -1085,9 +1095,25 @@
+ env.lo: libgomp_f.h
+ env.o: libgomp_f.h
+
+-# No install-html or install-pdf support in automake yet
+-.PHONY: install-html install-pdf
+-install-html:
++$(HTMLS_BUILD): $(info_TEXINFOS)
++ $(TEXI2HTML) $(MAKEINFOFLAGS) -I$(srcdir) -o $(@D) $<
++
++install-html: $(HTMLS_BUILD)
++ @$(NORMAL_INSTALL)
++ test -z "$(htmldir)" || $(mkinstalldirs) "$(DESTDIR)$(htmldir)"
++ @list='$(HTMLS_INSTALL)'; for p in $$list; do \
++ if test -f "$$p" || test -d "$$p"; then d=""; else d="$(srcdir)/"; fi; \
++ f=$(html__strip_dir) \
++ if test -d "$$d$$p"; then \
++ echo " $(mkinstalldirs) '$(DESTDIR)$(htmldir)/$$f'"; \
++ $(mkinstalldirs) "$(DESTDIR)$(htmldir)/$$f" || exit 1; \
++ echo " $(INSTALL_DATA) '$$d$$p'/* '$(DESTDIR)$(htmldir)/$$f'"; \
++ $(INSTALL_DATA) "$$d$$p"/* "$(DESTDIR)$(htmldir)/$$f"; \
++ else \
++ echo " $(INSTALL_DATA) '$$d$$p' '$(DESTDIR)$(htmldir)/$$f'"; \
++ $(INSTALL_DATA) "$$d$$p" "$(DESTDIR)$(htmldir)/$$f"; \
++ fi; \
++ done
+
+ install-pdf: $(PDFS)
+ @$(NORMAL_INSTALL)
+diff -Nur a/libgomp/testsuite/Makefile.in b/libgomp/testsuite/Makefile.in
+--- a/libgomp/testsuite/Makefile.in 2009-07-22 09:43:59.000000000 +0200
++++ b/libgomp/testsuite/Makefile.in 2010-01-25 09:50:29.615687242 +0100
+@@ -177,6 +177,8 @@
+ build_vendor = @build_vendor@
+ config_path = @config_path@
+ datadir = @datadir@
++datarootdir = @datarootdir@
++docdir = @docdir@
+ enable_shared = @enable_shared@
+ enable_static = @enable_static@
+ exec_prefix = @exec_prefix@
+@@ -185,6 +187,7 @@
+ host_cpu = @host_cpu@
+ host_os = @host_os@
+ host_vendor = @host_vendor@
++htmldir = @htmldir@
+ includedir = @includedir@
+ infodir = @infodir@
+ install_sh = @install_sh@
+@@ -198,6 +201,7 @@
+ mkdir_p = @mkdir_p@
+ multi_basedir = @multi_basedir@
+ oldincludedir = @oldincludedir@
++pdfdir = @pdfdir@
+ prefix = @prefix@
+ program_transform_name = @program_transform_name@
+ sbindir = @sbindir@
+diff -Nur a/libiberty/argv.c b/libiberty/argv.c
+--- a/libiberty/argv.c 2007-07-23 19:29:17.000000000 +0200
++++ b/libiberty/argv.c 2010-01-25 09:50:29.615687242 +0100
+@@ -119,6 +119,24 @@
+ }
+ }
+
++static void
++consume_whitespace (const char **input)
++{
++ while (ISSPACE (**input))
++ {
++ (*input)++;
++ }
++}
++
++static int
++only_whitespace (const char* input)
++{
++ while (*input != EOS && ISSPACE (*input))
++ input++;
++
++ return (*input == EOS);
++}
++
+ /*
+
+ @deftypefn Extension char** buildargv (char *@var{sp})
+@@ -179,10 +197,8 @@
+ do
+ {
+ /* Pick off argv[argc] */
+- while (ISBLANK (*input))
+- {
+- input++;
+- }
++ consume_whitespace (&input);
++
+ if ((maxargc == 0) || (argc >= (maxargc - 1)))
+ {
+ /* argv needs initialization, or expansion */
+@@ -278,10 +294,7 @@
+ argc++;
+ argv[argc] = NULL;
+
+- while (ISSPACE (*input))
+- {
+- input++;
+- }
++ consume_whitespace (&input);
+ }
+ while (*input != EOS);
+ }
+@@ -420,8 +433,17 @@
+ goto error;
+ /* Add a NUL terminator. */
+ buffer[len] = '\0';
+- /* Parse the string. */
+- file_argv = buildargv (buffer);
++ /* If the file is empty or contains only whitespace, buildargv would
++ return a single empty argument. In this context we want no arguments,
++ instead. */
++ if (only_whitespace (buffer))
++ {
++ file_argv = (char **) xmalloc (sizeof (char *));
++ file_argv[0] = NULL;
++ }
++ else
++ /* Parse the string. */
++ file_argv = buildargv (buffer);
+ /* If *ARGVP is not already dynamically allocated, copy it. */
+ if (!argv_dynamic)
+ {
+@@ -434,7 +456,7 @@
+ }
+ /* Count the number of arguments. */
+ file_argc = 0;
+- while (file_argv[file_argc] && *file_argv[file_argc])
++ while (file_argv[file_argc])
+ ++file_argc;
+ /* Now, insert FILE_ARGV into ARGV. The "+1" below handles the
+ NULL terminator at the end of ARGV. */
+diff -Nur a/libiberty/configure b/libiberty/configure
+--- a/libiberty/configure 2009-04-08 16:18:33.000000000 +0200
++++ b/libiberty/configure 2010-01-25 09:50:29.615687242 +0100
+@@ -8891,6 +8891,20 @@
+ esac
+
+
++# On MinGW, add support for Cygwin paths.
++case "${host}" in
++ *-*-mingw*)
++ case $LIBOBJS in
++ "cygpath.$ac_objext" | \
++ *" cygpath.$ac_objext" | \
++ "cygpath.$ac_objext "* | \
++ *" cygpath.$ac_objext "* ) ;;
++ *) LIBOBJS="$LIBOBJS cygpath.$ac_objext" ;;
++esac
++
++ ;;
++esac
++
+ if test x$gcc_no_link = xyes; then
+ if test "x${ac_cv_func_mmap_fixed_mapped+set}" != xset; then
+ ac_cv_func_mmap_fixed_mapped=no
+diff -Nur a/libiberty/configure.ac b/libiberty/configure.ac
+--- a/libiberty/configure.ac 2009-04-08 16:18:33.000000000 +0200
++++ b/libiberty/configure.ac 2010-01-25 09:50:29.615687242 +0100
+@@ -663,6 +663,13 @@
+ esac
+ AC_SUBST(pexecute)
+
++# On MinGW, add support for Cygwin paths.
++case "${host}" in
++ *-*-mingw*)
++ AC_LIBOBJ([cygpath])
++ ;;
++esac
++
+ libiberty_AC_FUNC_STRNCMP
+
+ # Install a library built with a cross compiler in $(tooldir) rather
+diff -Nur a/libiberty/cygpath.c b/libiberty/cygpath.c
+--- a/libiberty/cygpath.c 1970-01-01 01:00:00.000000000 +0100
++++ b/libiberty/cygpath.c 2010-01-25 09:50:29.615687242 +0100
+@@ -0,0 +1,591 @@
++/* Support Cygwin paths under MinGW.
++ Copyright (C) 2006 Free Software Foundation, Inc.
++ Written by CodeSourcery.
++
++This file is part of the libiberty library.
++Libiberty is free software; you can redistribute it and/or modify it
++under the terms of the GNU Library General Public License as published
++by the Free Software Foundation; either version 2 of the License, or
++(at your option) any later version.
++
++Libiberty 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
++Library General Public License for more details.
++
++You should have received a copy of the GNU Library General Public
++License along with libiberty; see the file COPYING.LIB. If not, write
++to the Free Software Foundation, Inc., 51 Franklin Street - Fifth
++Floor, Boston, MA 02110-1301, USA. */
++
++#include <windows.h>
++#include <errno.h>
++#include <fcntl.h>
++#include <sys/stat.h>
++#include <sys/types.h>
++#include <io.h>
++#include <process.h>
++#include <stdbool.h>
++#include <stdio.h>
++#include <stdlib.h>
++#include "libiberty.h"
++
++/* If non-zero, we have attempted to use cygpath. CYGPATH_PEX may
++ still be NULL, if cygpath is unavailable. */
++static int cygpath_initialized;
++
++/* If non-NULL, an instance of cygpath connected via a pipe. */
++static struct pex_obj *cygpath_pex;
++
++/* The input to cygpath. */
++static FILE *cygpath_in;
++
++/* The output from cygpath. */
++static FILE *cygpath_out;
++
++/* If non-NULL, a file to which path translations are logged. */
++static FILE *cygpath_log;
++
++/* Record MESSAGE in the CYGPATH_LOG. MESSAGE is a format string,
++ which is expected to have a single "%s" field, to be replaced by
++ ARG. */
++static void
++cygpath_log_msg_arg (const char *message, const char *arg)
++{
++ if (!cygpath_log)
++ return;
++ fprintf (cygpath_log, "[%d] cygpath: ", _getpid ());
++ fprintf (cygpath_log, message, arg);
++ fprintf (cygpath_log, "\n");
++ fflush (cygpath_log);
++}
++
++/* Record MESSAGE in the CYGPATH_LOG. */
++static void
++cygpath_log_msg (const char *message)
++{
++ cygpath_log_msg_arg ("%s", message);
++}
++
++/* An error has occured. Add the MESSAGE to the CYGPATH_LOG, noting
++ the cause of the error based on errno. */
++static void
++cygpath_perror (const char *message)
++{
++ if (!cygpath_log)
++ return;
++ fprintf (cygpath_log, "[%d] cygpath: error: %s: %s\n",
++ _getpid(), message, strerror (errno));
++ fflush (cygpath_log);
++}
++
++/* Closes CYGPATH_PEX and frees all associated
++ resoures. */
++static void
++cygpath_close (void)
++{
++ /* Free resources. */
++ if (cygpath_out)
++ {
++ fclose (cygpath_out);
++ cygpath_out = NULL;
++ }
++ if (cygpath_in)
++ {
++ fclose (cygpath_in);
++ cygpath_in = NULL;
++ }
++ if (cygpath_pex)
++ {
++ pex_free (cygpath_pex);
++ cygpath_pex = NULL;
++ }
++ if (cygpath_log)
++ {
++ cygpath_log_msg ("end");
++ cygpath_log = NULL;
++ }
++}
++
++/* CYG_PATH is a pointer to a Cygwin path. This function converts the
++ Cygwin path to a Windows path, storing the result in
++ WIN32_PATH. Returns true if the conversion was successful; false
++ otherwise. */
++int
++cygpath (const char *cyg_path, char win32_path[MAX_PATH + 1])
++{
++ bool ok;
++ bool retrying;
++
++ /* Special-case the empty path. cygpath cannot handle the empty
++ path correctly. It ignores the empty line, waiting for a
++ non-empty line, which in turn causes an application using this
++ function to appear stuck. */
++ if (cyg_path[0] == '\0')
++ {
++ win32_path[0] = '\0';
++ return true;
++ }
++
++ retrying = false;
++
++ retry:
++ if (!cygpath_initialized)
++ {
++ const char *argv[] = { "cygpath", "-w", "-f", "-", NULL };
++ const char *cygpath_path;
++ const char *log;
++ int err;
++
++ /* If we are unable to invoke cygpath, we do not want to try
++ again. So, we set the initialized flag at this point; if
++ errors occur during the invocation, it will remain set. */
++ cygpath_initialized = 1;
++ /* Check to see if the user wants cygpath support. */
++ cygpath_path = getenv ("CYGPATH");
++ if (!cygpath_path)
++ /* The user doesn't need to support Cygwin paths. */
++ goto error;
++ /* If debugging, open the log file. */
++ log = getenv ("CSL_DEBUG_CYGPATH");
++ if (log && log[0])
++ {
++ /* The log file is opened for "append" so that multiple
++ processes (perhaps invoked from "make") can share it. */
++ cygpath_log = fopen (log, "a");
++ if (cygpath_log)
++ cygpath_log_msg ("begin");
++ }
++ /* If the environment variable is set to a non-empty string, use
++ that string as the path to cygpath. */
++ if (cygpath_path[0] != '\0')
++ argv[0] = cygpath_path;
++ /* Create the pex object. */
++ cygpath_pex = pex_init (PEX_SEARCH | PEX_USE_PIPES,
++ "cygpath", NULL);
++ if (!cygpath_pex)
++ goto error;
++ /* Get the FILE we will use to write to the child. */
++ cygpath_in = pex_input_pipe (cygpath_pex, /*binary=*/0);
++ if (!cygpath_in)
++ goto error;
++ /* Start the child process. */
++ if (pex_run (cygpath_pex, PEX_SEARCH | PEX_USE_PIPES,
++ argv[0], (char**) argv,
++ NULL, NULL,
++ &err) != NULL)
++ goto error;
++ /* Get the FILE we will use to read from the child. */
++ cygpath_out = pex_read_output (cygpath_pex, /*binary=*/1);
++ if (!cygpath_out)
++ goto error;
++ }
++ else if (!cygpath_pex)
++ /* We previously tried to use cygpath, but something went wrong. */
++ return false;
++
++ /* Write CYG_PATH to the child, on a line by itself. */
++ cygpath_log_msg_arg ("-> %s", cyg_path);
++ if (fprintf (cygpath_in, "%s\n", cyg_path) < 0)
++ {
++ cygpath_perror ("write failed");
++ goto error;
++ }
++ /* Flush the output. (We cannot set the stream into line-buffered
++ mode with setvbuf because Windows treats _IOLBF as a synonym for
++ _IOFBF.) */
++ if (fflush (cygpath_in))
++ cygpath_perror ("flush failed");
++ /* Read the output. */
++ ok = true;
++ while (1)
++ {
++ size_t pathlen;
++ if (!fgets (win32_path, MAX_PATH, cygpath_out))
++ {
++ if (ferror (cygpath_out))
++ cygpath_perror ("read failed");
++ else
++ {
++ cygpath_log_msg ("error: EOF");
++ /* Unfortunately, cygpath sometimes crashes for no
++ apparent reason. We give it two chances... */
++ if (!retrying)
++ {
++ retrying = true;
++ cygpath_log_msg ("retrying");
++ cygpath_close ();
++ cygpath_initialized = 0;
++ goto retry;
++ }
++ }
++ goto error;
++ }
++ pathlen = strlen (win32_path);
++ if (pathlen == 0 && ok)
++ /* This isn't a well-formed response from cygpath. */
++ goto error;
++ if (win32_path[pathlen - 1] == '\n')
++ {
++ win32_path[pathlen - 1] = '\0';
++ cygpath_log_msg_arg ("<- %s", win32_path);
++ break;
++ }
++ /* We didn't reach the end of the line. There's no point in
++ trying to use this output, since we know the length of
++ paths are limited to MAX_PATH characters, but we read the
++ entire line so that we are still in sync with
++ cygpath. */
++ ok = false;
++ if (cygpath_log)
++ cygpath_log_msg_arg ("error: invalid response: %s",
++ win32_path);
++ }
++
++ return ok;
++
++ error:
++ cygpath_close();
++ return false;
++}
++
++/* Returns the handle for the MVCRT DLL, or NULL if it is not
++ available. */
++static HMODULE
++msvcrt_dll (void)
++{
++ static HMODULE dll = (HMODULE)(-1);
++
++ /* After we call LoadLibrary, DLL will be either a valid handle or
++ NULL, so this check ensures that we only try to load the library
++ once. */
++ if (dll == (HMODULE)(-1))
++ dll = LoadLibrary ("msvcrt.dll");
++
++ return dll;
++}
++
++/* Call the underlying MSVCRT fopen with PATH and MODE, and return
++ what it returns. */
++static FILE *
++msvcrt_fopen (const char *path, const char *mode)
++{
++ typedef FILE *(fopen_type)(const char *path,
++ const char *mode);
++
++ static fopen_type *f = NULL;
++
++ /* Get the address of "fopen". */
++ if (!f)
++ {
++ HMODULE dll = msvcrt_dll ();
++ if (!dll)
++ {
++ errno = ENOSYS;
++ return NULL;
++ }
++ f = (fopen_type *) GetProcAddress (dll, "fopen");
++ if (!f)
++ {
++ errno = ENOSYS;
++ return NULL;
++ }
++ }
++
++ /* Call fopen. */
++ return (*f)(path, mode);
++}
++
++FILE *
++fopen (const char *path, const char *mode)
++{
++ FILE *f;
++ char win32_path[MAX_PATH + 1];
++
++ /* Assume PATH is a Windows path. */
++ f = msvcrt_fopen (path, mode);
++ if (f || errno != ENOENT)
++ return f;
++ /* Perhaps it is a Cygwin path? */
++ if (cygpath (path, win32_path))
++ f = msvcrt_fopen (win32_path, mode);
++ return f;
++}
++
++int
++open (const char *path, int oflag, ...)
++{
++ int fd;
++ char win32_path[MAX_PATH + 1];
++ int pmode = 0;
++
++ if ((oflag & _O_CREAT))
++ {
++ va_list ap;
++ va_start (ap, oflag);
++ pmode = va_arg (ap, int);
++ va_end (ap);
++ }
++
++ /* Assume PATH is a Windows path. */
++ fd = _open (path, oflag, pmode);
++ if (fd != -1 || errno != ENOENT)
++ return fd;
++ /* Perhaps it is a Cygwin path? */
++ if (cygpath (path, win32_path))
++ fd = _open (win32_path, oflag, pmode);
++ return fd;
++}
++
++int
++stat (const char *path, struct stat *buffer)
++{
++ int r;
++ char win32_path[MAX_PATH + 1];
++
++ /* Assume PATH is a Windows path. */
++ r = _stat (path, (struct _stat *) buffer);
++ if (r != -1 || errno != ENOENT)
++ return r;
++ /* Perhaps it is a Cygwin path? */
++ if (cygpath (path, win32_path))
++ r = _stat (win32_path, (struct _stat *) buffer);
++ return r;
++}
++
++int
++access (const char *path, int mode)
++{
++ int r;
++ char win32_path[MAX_PATH + 1];
++
++#ifdef _WIN32
++ /* Some GNU tools mistakenly defined X_OK to 1 on Windows. */
++ mode = mode & ~1;
++#endif
++ /* Assume PATH is a Windows path. */
++ r = _access (path, mode);
++ if (r != -1 || errno != ENOENT)
++ return r;
++ /* Perhaps it is a Cygwin path? */
++ if (cygpath (path, win32_path))
++ r = _access (win32_path, mode);
++ return r;
++}
++
++/* Given the WINDOWS_CODE (typically the result of GetLastError), set
++ ERRNO to the corresponding error code. If there is no obvious
++ correspondence, ERRNO will be set to EACCES. */
++static void
++set_errno_from_windows_code (DWORD windows_code)
++{
++ int mapping[][2] = {
++ {ERROR_ACCESS_DENIED, EACCES},
++ {ERROR_ACCOUNT_DISABLED, EACCES},
++ {ERROR_ACCOUNT_RESTRICTION, EACCES},
++ {ERROR_ALREADY_ASSIGNED, EBUSY},
++ {ERROR_ALREADY_EXISTS, EEXIST},
++ {ERROR_ARITHMETIC_OVERFLOW, ERANGE},
++ {ERROR_BAD_COMMAND, EIO},
++ {ERROR_BAD_DEVICE, ENODEV},
++ {ERROR_BAD_DRIVER_LEVEL, ENXIO},
++ {ERROR_BAD_EXE_FORMAT, ENOEXEC},
++ {ERROR_BAD_FORMAT, ENOEXEC},
++ {ERROR_BAD_LENGTH, EINVAL},
++ {ERROR_BAD_PATHNAME, ENOENT},
++ {ERROR_BAD_PIPE, EPIPE},
++ {ERROR_BAD_UNIT, ENODEV},
++ {ERROR_BAD_USERNAME, EINVAL},
++ {ERROR_BROKEN_PIPE, EPIPE},
++ {ERROR_BUFFER_OVERFLOW, ENOMEM},
++ {ERROR_BUSY, EBUSY},
++ {ERROR_BUSY_DRIVE, EBUSY},
++ {ERROR_CALL_NOT_IMPLEMENTED, ENOSYS},
++ {ERROR_CRC, EIO},
++ {ERROR_CURRENT_DIRECTORY, EINVAL},
++ {ERROR_DEVICE_IN_USE, EBUSY},
++ {ERROR_DIR_NOT_EMPTY, EEXIST},
++ {ERROR_DIRECTORY, ENOENT},
++ {ERROR_DISK_CHANGE, EIO},
++ {ERROR_DISK_FULL, ENOSPC},
++ {ERROR_DRIVE_LOCKED, EBUSY},
++ {ERROR_ENVVAR_NOT_FOUND, EINVAL},
++ {ERROR_EXE_MARKED_INVALID, ENOEXEC},
++ {ERROR_FILE_EXISTS, EEXIST},
++ {ERROR_FILE_INVALID, ENODEV},
++ {ERROR_FILE_NOT_FOUND, ENOENT},
++ {ERROR_FILENAME_EXCED_RANGE, ENAMETOOLONG},
++ {ERROR_GEN_FAILURE, EIO},
++ {ERROR_HANDLE_DISK_FULL, ENOSPC},
++ {ERROR_INSUFFICIENT_BUFFER, ENOMEM},
++ {ERROR_INVALID_ACCESS, EINVAL},
++ {ERROR_INVALID_ADDRESS, EFAULT},
++ {ERROR_INVALID_BLOCK, EFAULT},
++ {ERROR_INVALID_DATA, EINVAL},
++ {ERROR_INVALID_DRIVE, ENODEV},
++ {ERROR_INVALID_EXE_SIGNATURE, ENOEXEC},
++ {ERROR_INVALID_FLAGS, EINVAL},
++ {ERROR_INVALID_FUNCTION, ENOSYS},
++ {ERROR_INVALID_HANDLE, EBADF},
++ {ERROR_INVALID_LOGON_HOURS, EACCES},
++ {ERROR_INVALID_NAME, ENOENT},
++ {ERROR_INVALID_OWNER, EINVAL},
++ {ERROR_INVALID_PARAMETER, EINVAL},
++ {ERROR_INVALID_PASSWORD, EPERM},
++ {ERROR_INVALID_PRIMARY_GROUP, EINVAL},
++ {ERROR_INVALID_SIGNAL_NUMBER, EINVAL},
++ {ERROR_INVALID_TARGET_HANDLE, EIO},
++ {ERROR_INVALID_WORKSTATION, EACCES},
++ {ERROR_IO_DEVICE, EIO},
++ {ERROR_IO_INCOMPLETE, EINTR},
++ {ERROR_LOCKED, EBUSY},
++ {ERROR_LOGON_FAILURE, EACCES},
++ {ERROR_MAPPED_ALIGNMENT, EINVAL},
++ {ERROR_META_EXPANSION_TOO_LONG, E2BIG},
++ {ERROR_MORE_DATA, EPIPE},
++ {ERROR_NEGATIVE_SEEK, ESPIPE},
++ {ERROR_NO_DATA, EPIPE},
++ {ERROR_NO_MORE_SEARCH_HANDLES, EIO},
++ {ERROR_NO_PROC_SLOTS, EAGAIN},
++ {ERROR_NO_SUCH_PRIVILEGE, EACCES},
++ {ERROR_NOACCESS, EFAULT},
++ {ERROR_NONE_MAPPED, EINVAL},
++ {ERROR_NOT_ENOUGH_MEMORY, ENOMEM},
++ {ERROR_NOT_READY, ENODEV},
++ {ERROR_NOT_SAME_DEVICE, EXDEV},
++ {ERROR_OPEN_FAILED, EIO},
++ {ERROR_OPERATION_ABORTED, EINTR},
++ {ERROR_OUTOFMEMORY, ENOMEM},
++ {ERROR_PASSWORD_EXPIRED, EACCES},
++ {ERROR_PATH_BUSY, EBUSY},
++ {ERROR_PATH_NOT_FOUND, ENOTDIR},
++ {ERROR_PIPE_BUSY, EBUSY},
++ {ERROR_PIPE_CONNECTED, EPIPE},
++ {ERROR_PIPE_LISTENING, EPIPE},
++ {ERROR_PIPE_NOT_CONNECTED, EPIPE},
++ {ERROR_PRIVILEGE_NOT_HELD, EACCES},
++ {ERROR_READ_FAULT, EIO},
++ {ERROR_SEEK, ESPIPE},
++ {ERROR_SEEK_ON_DEVICE, ESPIPE},
++ {ERROR_SHARING_BUFFER_EXCEEDED, ENFILE},
++ {ERROR_STACK_OVERFLOW, ENOMEM},
++ {ERROR_SWAPERROR, ENOENT},
++ {ERROR_TOO_MANY_MODULES, EMFILE},
++ {ERROR_TOO_MANY_OPEN_FILES, EMFILE},
++ {ERROR_UNRECOGNIZED_MEDIA, ENXIO},
++ {ERROR_UNRECOGNIZED_VOLUME, ENODEV},
++ {ERROR_WAIT_NO_CHILDREN, ECHILD},
++ {ERROR_WRITE_FAULT, EIO},
++ {ERROR_WRITE_PROTECT, EROFS}
++/* MinGW does not define ETXTBSY as yet.
++ {ERROR_LOCK_VIOLATION, ETXTBSY},
++ {ERROR_SHARING_VIOLATION, ETXTBSY},
++*/
++ };
++
++ size_t i;
++
++ for (i = 0; i < sizeof (mapping)/sizeof (mapping[0]); ++i)
++ if (mapping[i][0] == windows_code)
++ {
++ errno = mapping[i][1];
++ return;
++ }
++
++ /* Unrecognized error. Use EACCESS to have some error code,
++ not misleading "No error" thing. */
++ errno = EACCES;
++}
++
++int rename (const char *oldpath, const char *newpath)
++{
++ BOOL r;
++ int oldpath_converted = 0;
++ char win32_oldpath[MAX_PATH + 1];
++ char win32_newpath[MAX_PATH + 1];
++
++ /* Older versions of the cygpath program called FindFirstFile, but
++ not FindClose. As a result, a long-running cygpath program ends
++ up leaking these handles, and, as a result, the Windows kernel
++ will not let us remove or rename things in directories. Therefore,
++ we kill the child cygpath program now.
++
++ The defect in cygpath was corrected by this patch:
++
++ http://cygwin.com/ml/cygwin-patches/2007-q1/msg00033.html
++
++ but older versions of cygpath will be in use for the forseeable
++ future. */
++
++ cygpath_close ();
++ cygpath_initialized = 0;
++
++ /* Assume all paths are Windows paths. */
++ r = MoveFileEx (oldpath, newpath, MOVEFILE_REPLACE_EXISTING);
++ if (r)
++ return 0;
++ else if (GetLastError () != ERROR_PATH_NOT_FOUND)
++ goto error;
++
++ /* Perhaps the old path is a cygwin path? */
++ if (cygpath (oldpath, win32_oldpath))
++ {
++ oldpath_converted = 1;
++ r = MoveFileEx (win32_oldpath, newpath, MOVEFILE_REPLACE_EXISTING);
++ if (r)
++ return 0;
++ else if (GetLastError () != ERROR_PATH_NOT_FOUND)
++ goto error;
++ }
++
++ /* Perhaps the new path is a cygwin path? */
++ if (cygpath (newpath, win32_newpath))
++ {
++ r = MoveFileEx (oldpath_converted ? win32_oldpath : oldpath,
++ win32_newpath, MOVEFILE_REPLACE_EXISTING);
++ if (r == TRUE)
++ return 0;
++ }
++error:
++ set_errno_from_windows_code (GetLastError ());
++ return -1;
++}
++
++int remove (const char *pathname)
++{
++ int r;
++ char win32_path[MAX_PATH + 1];
++
++ cygpath_close ();
++ cygpath_initialized = 0;
++
++ /* Assume PATH is a Windows path. */
++ r = _unlink (pathname);
++ if (r != -1 || errno != ENOENT)
++ return r;
++ /* Perhaps it is a Cygwin path? */
++ if (cygpath (pathname, win32_path))
++ r = _unlink (win32_path);
++ return r;
++}
++
++int unlink(const char *pathname)
++{
++ return remove (pathname);
++}
++
++int
++chdir (const char *path)
++{
++ int ret;
++ char win32_path[MAX_PATH + 1];
++
++ /* Assume PATH is a Windows path. */
++ ret = _chdir (path);
++ if (ret != -1 || errno != ENOENT)
++ return ret;
++ /* Perhaps it is a Cygwin path? */
++ if (cygpath (path, win32_path))
++ ret = _chdir (win32_path);
++ return ret;
++}
+diff -Nur a/libiberty/lrealpath.c b/libiberty/lrealpath.c
+--- a/libiberty/lrealpath.c 2005-05-24 22:48:25.000000000 +0200
++++ b/libiberty/lrealpath.c 2010-01-25 09:50:29.615687242 +0100
+@@ -138,6 +138,17 @@
+ {
+ char buf[MAX_PATH];
+ char* basename;
++
++ if (_access (filename, F_OK) != 0)
++ {
++ char cygbuf[MAX_PATH + 1];
++ /* The file does not exist. It's fine to call lrealpath
++ on a non-existing path... but if this would be an existing
++ path after cygpath conversion, use that instead. */
++ if (cygpath (filename, cygbuf) && _access (cygbuf, F_OK) == 0)
++ filename = cygbuf;
++ }
++
+ DWORD len = GetFullPathName (filename, MAX_PATH, buf, &basename);
+ if (len == 0 || len > MAX_PATH - 1)
+ return strdup (filename);
+diff -Nur a/libiberty/Makefile.in b/libiberty/Makefile.in
+--- a/libiberty/Makefile.in 2008-10-22 15:30:19.000000000 +0200
++++ b/libiberty/Makefile.in 2010-01-25 09:50:29.615687242 +0100
+@@ -124,7 +124,7 @@
+ CFILES = alloca.c argv.c asprintf.c atexit.c \
+ basename.c bcmp.c bcopy.c bsearch.c bzero.c \
+ calloc.c choose-temp.c clock.c concat.c cp-demangle.c \
+- cp-demint.c cplus-dem.c \
++ cp-demint.c cplus-dem.c cygpath.c \
+ dyn-string.c \
+ fdmatch.c ffs.c fibheap.c filename_cmp.c floatformat.c \
+ fnmatch.c fopen_unlocked.c \
+@@ -182,7 +182,7 @@
+ # maint-missing" and "make check".
+ CONFIGURED_OFILES = ./asprintf.o ./atexit.o \
+ ./basename.o ./bcmp.o ./bcopy.o ./bsearch.o ./bzero.o \
+- ./calloc.o ./clock.o ./copysign.o \
++ ./calloc.o ./clock.o ./copysign.o ./cygpath.o \
+ ./_doprnt.o \
+ ./ffs.o \
+ ./getcwd.o ./getpagesize.o ./gettimeofday.o \
+@@ -619,6 +619,13 @@
+ else true; fi
+ $(COMPILE.c) $(srcdir)/cplus-dem.c $(OUTPUT_OPTION)
+
++./cygpath.o: $(srcdir)/cygpath.c config.h $(INCDIR)/ansidecl.h \
++ $(INCDIR)/libiberty.h
++ if [ x"$(PICFLAG)" != x ]; then \
++ $(COMPILE.c) $(PICFLAG) $(srcdir)/cygpath.c -o pic/$@; \
++ else true; fi
++ $(COMPILE.c) $(srcdir)/cygpath.c $(OUTPUT_OPTION)
++
+ ./dyn-string.o: $(srcdir)/dyn-string.c config.h $(INCDIR)/ansidecl.h \
+ $(INCDIR)/dyn-string.h $(INCDIR)/libiberty.h
+ if [ x"$(PICFLAG)" != x ]; then \
+diff -Nur a/libiberty/pex-win32.c b/libiberty/pex-win32.c
+--- a/libiberty/pex-win32.c 2008-08-07 21:30:14.000000000 +0200
++++ b/libiberty/pex-win32.c 2010-01-25 09:50:29.615687242 +0100
+@@ -119,7 +119,7 @@
+ pex_win32_open_read (struct pex_obj *obj ATTRIBUTE_UNUSED, const char *name,
+ int binary)
+ {
+- return _open (name, _O_RDONLY | (binary ? _O_BINARY : _O_TEXT));
++ return open (name, _O_RDONLY | (binary ? _O_BINARY : _O_TEXT));
+ }
+
+ /* Open a file for writing. */
+@@ -130,10 +130,10 @@
+ {
+ /* Note that we can't use O_EXCL here because gcc may have already
+ created the temporary file via make_temp_file. */
+- return _open (name,
+- (_O_WRONLY | _O_CREAT | _O_TRUNC
+- | (binary ? _O_BINARY : _O_TEXT)),
+- _S_IREAD | _S_IWRITE);
++ return open (name,
++ (_O_WRONLY | _O_CREAT | _O_TRUNC
++ | (binary ? _O_BINARY : _O_TEXT)),
++ _S_IREAD | _S_IWRITE);
+ }
+
+ /* Close a file. */
+@@ -746,6 +746,28 @@
+ OSVERSIONINFO version_info;
+ STARTUPINFO si;
+ PROCESS_INFORMATION pi;
++ int orig_out, orig_in, orig_err;
++ BOOL separate_stderr = !(flags & PEX_STDERR_TO_STDOUT);
++
++ /* Ensure we have inheritable descriptors to pass to the child, and close the
++ original descriptors. */
++ orig_in = in;
++ in = _dup (orig_in);
++ if (orig_in != STDIN_FILENO)
++ _close (orig_in);
++
++ orig_out = out;
++ out = _dup (orig_out);
++ if (orig_out != STDOUT_FILENO)
++ _close (orig_out);
++
++ if (separate_stderr)
++ {
++ orig_err = errdes;
++ errdes = _dup (orig_err);
++ if (orig_err != STDERR_FILENO)
++ _close (orig_err);
++ }
+
+ stdin_handle = INVALID_HANDLE_VALUE;
+ stdout_handle = INVALID_HANDLE_VALUE;
+@@ -753,7 +775,7 @@
+
+ stdin_handle = (HANDLE) _get_osfhandle (in);
+ stdout_handle = (HANDLE) _get_osfhandle (out);
+- if (!(flags & PEX_STDERR_TO_STDOUT))
++ if (separate_stderr)
+ stderr_handle = (HANDLE) _get_osfhandle (errdes);
+ else
+ stderr_handle = stdout_handle;
+@@ -822,12 +844,13 @@
+ *errmsg = "CreateProcess";
+ }
+
+- /* Close the standard output and standard error handles in the
+- parent. */
+- if (out != STDOUT_FILENO)
+- obj->funcs->close (obj, out);
+- if (errdes != STDERR_FILENO)
+- obj->funcs->close (obj, errdes);
++ /* Close the standard input, standard output and standard error handles
++ in the parent. */
++
++ _close (in);
++ _close (out);
++ if (separate_stderr)
++ _close (errdes);
+
+ return pid;
+ }
+@@ -883,7 +906,7 @@
+ pex_win32_pipe (struct pex_obj *obj ATTRIBUTE_UNUSED, int *p,
+ int binary)
+ {
+- return _pipe (p, 256, binary ? _O_BINARY : _O_TEXT);
++ return _pipe (p, 256, (binary ? _O_BINARY : _O_TEXT) | _O_NOINHERIT);
+ }
+
+ /* Get a FILE pointer to read from a file descriptor. */
+diff -Nur a/libiberty/testsuite/test-expandargv.c b/libiberty/testsuite/test-expandargv.c
+--- a/libiberty/testsuite/test-expandargv.c 2006-01-20 23:55:36.000000000 +0100
++++ b/libiberty/testsuite/test-expandargv.c 2010-01-25 09:50:29.615687242 +0100
+@@ -107,6 +107,38 @@
+ ARGV0,
+ 0,
+
++ /* Test 4 - Check for options beginning with an empty line. */
++ "\na\nb", /* Test 4 data */
++ ARGV0,
++ "@test-expandargv-4.lst",
++ 0,
++ ARGV0,
++ "a",
++ "b",
++ 0,
++
++ /* Test 5 - Check for options containing an empty argument. */
++ "a\n''\nb", /* Test 5 data */
++ ARGV0,
++ "@test-expandargv-5.lst",
++ 0,
++ ARGV0,
++ "a",
++ "",
++ "b",
++ 0,
++
++ /* Test 6 - Check for options containing a quoted newline. */
++ "a\n'a\n\nb'\nb", /* Test 6 data */
++ ARGV0,
++ "@test-expandargv-6.lst",
++ 0,
++ ARGV0,
++ "a",
++ "a\n\nb",
++ "b",
++ 0,
++
+ 0 /* Test done marker, don't remove. */
+ };
+
+@@ -246,7 +278,7 @@
+ /* Compare each of the argv's ... */
+ else
+ for (k = 0; k < argc_after; k++)
+- if (strncmp (argv_before[k], argv_after[k], strlen(argv_after[k])) != 0)
++ if (strcmp (argv_before[k], argv_after[k]) != 0)
+ {
+ printf ("FAIL: test-expandargv-%d. Arguments don't match.\n", i);
+ failed++;
+diff -Nur a/libjava/classpath/configure b/libjava/classpath/configure
+--- a/libjava/classpath/configure 2009-03-16 13:08:23.000000000 +0100
++++ b/libjava/classpath/configure 2010-01-25 09:50:29.625686976 +0100
+@@ -461,7 +461,7 @@
+ # include <unistd.h>
+ #endif"
+
+-ac_subst_vars='SHELL PATH_SEPARATOR PACKAGE_NAME PACKAGE_TARNAME PACKAGE_VERSION PACKAGE_STRING PACKAGE_BUGREPORT exec_prefix prefix program_transform_name bindir sbindir libexecdir datadir sysconfdir sharedstatedir localstatedir libdir includedir oldincludedir infodir mandir build_alias host_alias target_alias DEFS ECHO_C ECHO_N ECHO_T LIBS build build_cpu build_vendor build_os host host_cpu host_vendor host_os target target_cpu target_vendor target_os JAVA_MAINTAINER_MODE_TRUE JAVA_MAINTAINER_MODE_FALSE GENINSRC_TRUE GENINSRC_FALSE multi_basedir INSTALL_BINARIES_TRUE INSTALL_BINARIES_FALSE LIBVERSION CLASSPATH_MODULE CLASSPATH_CONVENIENCE INSTALL_PROGRAM INSTALL_SCRIPT INSTALL_DATA CYGPATH_W PACKAGE VERSION ACLOCAL AUTOCONF AUTOMAKE AUTOHEADER MAKEINFO install_sh STRIP ac_ct_STRIP INSTALL_STRIP_PROGRAM mkdir_p AWK SET_MAKE am__leading_dot AMTAR am__tar am__untar CREATE_COLLECTIONS_TRUE CREATE_COLLECTIONS_FALSE CREATE_JNI_LIBRARIES_TRUE CREATE_JNI_LIBRARIES_FALSE CREATE_CORE_JNI_LIBRARIES_TRUE CREATE_CORE_JNI_LIBRARIES_FALSE CREATE_GCONF_PEER_LIBRARIES_TRUE CREATE_GCONF_PEER_LIBRARIES_FALSE CREATE_GSTREAMER_PEER_LIBRARIES_TRUE CREATE_GSTREAMER_PEER_LIBRARIES_FALSE default_toolkit CREATE_XMLJ_LIBRARY_TRUE CREATE_XMLJ_LIBRARY_FALSE CC CFLAGS LDFLAGS CPPFLAGS ac_ct_CC EXEEXT OBJEXT DEPDIR am__include am__quote AMDEP_TRUE AMDEP_FALSE AMDEPBACKSLASH CCDEPMODE am__fastdepCC_TRUE am__fastdepCC_FALSE CPP EGREP CREATE_ALSA_LIBRARIES_TRUE CREATE_ALSA_LIBRARIES_FALSE CREATE_DSSI_LIBRARIES_TRUE CREATE_DSSI_LIBRARIES_FALSE CREATE_GTK_PEER_LIBRARIES_TRUE CREATE_GTK_PEER_LIBRARIES_FALSE CREATE_QT_PEER_LIBRARIES_TRUE CREATE_QT_PEER_LIBRARIES_FALSE CREATE_PLUGIN_TRUE CREATE_PLUGIN_FALSE CREATE_GJDOC_TRUE CREATE_GJDOC_FALSE toolexeclibdir nativeexeclibdir glibjdir CREATE_JNI_HEADERS_TRUE CREATE_JNI_HEADERS_FALSE CREATE_GJDOC_PARSER_TRUE CREATE_GJDOC_PARSER_FALSE CREATE_WRAPPERS_TRUE CREATE_WRAPPERS_FALSE LN_S LIBTOOL SED FGREP GREP LD DUMPBIN ac_ct_DUMPBIN NM OBJDUMP ac_ct_OBJDUMP AR ac_ct_AR RANLIB ac_ct_RANLIB lt_ECHO DSYMUTIL ac_ct_DSYMUTIL NMEDIT ac_ct_NMEDIT LIPO ac_ct_LIPO OTOOL ac_ct_OTOOL OTOOL64 ac_ct_OTOOL64 CXX CXXFLAGS ac_ct_CXX CXXDEPMODE am__fastdepCXX_TRUE am__fastdepCXX_FALSE CXXCPP PERL COLLECTIONS_PREFIX LIBMAGIC LIBICONV LTLIBICONV WARNING_CFLAGS EXTRA_CFLAGS STRICT_WARNING_CFLAGS ERROR_CFLAGS PKG_CONFIG XML_CFLAGS XML_LIBS XSLT_CFLAGS XSLT_LIBS X_CFLAGS X_PRE_LIBS X_LIBS X_EXTRA_LIBS GTK_CFLAGS GTK_LIBS FREETYPE2_CFLAGS FREETYPE2_LIBS PANGOFT2_CFLAGS PANGOFT2_LIBS CAIRO_CFLAGS CAIRO_LIBS XTEST_LIBS GCONF_CFLAGS GCONF_LIBS GDK_CFLAGS GDK_LIBS GSTREAMER_CFLAGS GSTREAMER_LIBS GSTREAMER_BASE_CFLAGS GSTREAMER_BASE_LIBS GSTREAMER_PLUGINS_BASE_CFLAGS GSTREAMER_PLUGINS_BASE_LIBS GST_PLUGIN_LDFLAGS GSTREAMER_FILE_READER GSTREAMER_MIXER_PROVIDER QT_CFLAGS QT_LIBS MOC MOZILLA_CFLAGS MOZILLA_LIBS GLIB_CFLAGS GLIB_LIBS PLUGIN_DIR GMP_CFLAGS GMP_LIBS USER_JAVAH CLASSPATH_INCLUDES vm_classes MAINTAINER_MODE_TRUE MAINTAINER_MODE_FALSE MAINT LIBDEBUG INIT_LOAD_LIBRARY ECJ_JAR JAVA_LANG_SYSTEM_EXPLICIT_INITIALIZATION REMOVE MKDIR CP DATE FIND ZIP JAR WITH_JAR_TRUE WITH_JAR_FALSE INSTALL_GLIBJ_ZIP_TRUE INSTALL_GLIBJ_ZIP_FALSE INSTALL_CLASS_FILES_TRUE INSTALL_CLASS_FILES_FALSE BUILD_CLASS_FILES_TRUE BUILD_CLASS_FILES_FALSE EXAMPLESDIR TOOLSDIR GJDOC CREATE_API_DOCS_TRUE CREATE_API_DOCS_FALSE JAY JAY_SKELETON REGEN_PARSERS_TRUE REGEN_PARSERS_FALSE USE_PREBUILT_GLIBJ_ZIP_TRUE USE_PREBUILT_GLIBJ_ZIP_FALSE PATH_TO_GLIBJ_ZIP JAVA uudecode JAVAC JAVAC_IS_GCJ GCJ_JAVAC_TRUE GCJ_JAVAC_FALSE ANTLR_JAR ANTLR ac_ct_ANTLR JAVAC_MEM_OPT USE_ESCHER_TRUE USE_ESCHER_FALSE PATH_TO_ESCHER ENABLE_LOCAL_SOCKETS_TRUE ENABLE_LOCAL_SOCKETS_FALSE DEFAULT_PREFS_PEER WANT_NATIVE_BIG_INTEGER CREATE_GMPBI_LIBRARY_TRUE CREATE_GMPBI_LIBRARY_FALSE LIBOBJS LTLIBOBJS'
++ac_subst_vars='SHELL PATH_SEPARATOR PACKAGE_NAME PACKAGE_TARNAME PACKAGE_VERSION PACKAGE_STRING PACKAGE_BUGREPORT exec_prefix prefix program_transform_name bindir sbindir libexecdir datadir sysconfdir sharedstatedir localstatedir libdir includedir oldincludedir infodir mandir build_alias host_alias target_alias DEFS ECHO_C ECHO_N ECHO_T LIBS build build_cpu build_vendor build_os host host_cpu host_vendor host_os target target_cpu target_vendor target_os JAVA_MAINTAINER_MODE_TRUE JAVA_MAINTAINER_MODE_FALSE GENINSRC_TRUE GENINSRC_FALSE multi_basedir INSTALL_BINARIES_TRUE INSTALL_BINARIES_FALSE LIBVERSION CLASSPATH_MODULE CLASSPATH_CONVENIENCE INSTALL_PROGRAM INSTALL_SCRIPT INSTALL_DATA CYGPATH_W PACKAGE VERSION ACLOCAL AUTOCONF AUTOMAKE AUTOHEADER MAKEINFO install_sh STRIP ac_ct_STRIP INSTALL_STRIP_PROGRAM mkdir_p AWK SET_MAKE am__leading_dot AMTAR am__tar am__untar CREATE_COLLECTIONS_TRUE CREATE_COLLECTIONS_FALSE CREATE_JNI_LIBRARIES_TRUE CREATE_JNI_LIBRARIES_FALSE CREATE_CORE_JNI_LIBRARIES_TRUE CREATE_CORE_JNI_LIBRARIES_FALSE CREATE_GCONF_PEER_LIBRARIES_TRUE CREATE_GCONF_PEER_LIBRARIES_FALSE CREATE_GSTREAMER_PEER_LIBRARIES_TRUE CREATE_GSTREAMER_PEER_LIBRARIES_FALSE default_toolkit CREATE_XMLJ_LIBRARY_TRUE CREATE_XMLJ_LIBRARY_FALSE CC CFLAGS LDFLAGS CPPFLAGS ac_ct_CC EXEEXT OBJEXT DEPDIR am__include am__quote AMDEP_TRUE AMDEP_FALSE AMDEPBACKSLASH CCDEPMODE am__fastdepCC_TRUE am__fastdepCC_FALSE CPP EGREP CREATE_ALSA_LIBRARIES_TRUE CREATE_ALSA_LIBRARIES_FALSE CREATE_DSSI_LIBRARIES_TRUE CREATE_DSSI_LIBRARIES_FALSE CREATE_GTK_PEER_LIBRARIES_TRUE CREATE_GTK_PEER_LIBRARIES_FALSE CREATE_QT_PEER_LIBRARIES_TRUE CREATE_QT_PEER_LIBRARIES_FALSE CREATE_PLUGIN_TRUE CREATE_PLUGIN_FALSE CREATE_GJDOC_TRUE CREATE_GJDOC_FALSE target_noncanonical toolexecdir toolexecmainlibdir toolexeclibdir nativeexeclibdir glibjdir CREATE_JNI_HEADERS_TRUE CREATE_JNI_HEADERS_FALSE CREATE_GJDOC_PARSER_TRUE CREATE_GJDOC_PARSER_FALSE CREATE_WRAPPERS_TRUE CREATE_WRAPPERS_FALSE LN_S LIBTOOL SED FGREP GREP LD DUMPBIN ac_ct_DUMPBIN NM OBJDUMP ac_ct_OBJDUMP AR ac_ct_AR RANLIB ac_ct_RANLIB lt_ECHO DSYMUTIL ac_ct_DSYMUTIL NMEDIT ac_ct_NMEDIT LIPO ac_ct_LIPO OTOOL ac_ct_OTOOL OTOOL64 ac_ct_OTOOL64 CXX CXXFLAGS ac_ct_CXX CXXDEPMODE am__fastdepCXX_TRUE am__fastdepCXX_FALSE CXXCPP PERL COLLECTIONS_PREFIX LIBMAGIC LIBICONV LTLIBICONV WARNING_CFLAGS EXTRA_CFLAGS STRICT_WARNING_CFLAGS ERROR_CFLAGS PKG_CONFIG XML_CFLAGS XML_LIBS XSLT_CFLAGS XSLT_LIBS X_CFLAGS X_PRE_LIBS X_LIBS X_EXTRA_LIBS GTK_CFLAGS GTK_LIBS FREETYPE2_CFLAGS FREETYPE2_LIBS PANGOFT2_CFLAGS PANGOFT2_LIBS CAIRO_CFLAGS CAIRO_LIBS XTEST_LIBS GCONF_CFLAGS GCONF_LIBS GDK_CFLAGS GDK_LIBS GSTREAMER_CFLAGS GSTREAMER_LIBS GSTREAMER_BASE_CFLAGS GSTREAMER_BASE_LIBS GSTREAMER_PLUGINS_BASE_CFLAGS GSTREAMER_PLUGINS_BASE_LIBS GST_PLUGIN_LDFLAGS GSTREAMER_FILE_READER GSTREAMER_MIXER_PROVIDER QT_CFLAGS QT_LIBS MOC MOZILLA_CFLAGS MOZILLA_LIBS GLIB_CFLAGS GLIB_LIBS PLUGIN_DIR GMP_CFLAGS GMP_LIBS USER_JAVAH CLASSPATH_INCLUDES vm_classes MAINTAINER_MODE_TRUE MAINTAINER_MODE_FALSE MAINT LIBDEBUG INIT_LOAD_LIBRARY ECJ_JAR JAVA_LANG_SYSTEM_EXPLICIT_INITIALIZATION REMOVE MKDIR CP DATE FIND ZIP JAR WITH_JAR_TRUE WITH_JAR_FALSE INSTALL_GLIBJ_ZIP_TRUE INSTALL_GLIBJ_ZIP_FALSE INSTALL_CLASS_FILES_TRUE INSTALL_CLASS_FILES_FALSE BUILD_CLASS_FILES_TRUE BUILD_CLASS_FILES_FALSE EXAMPLESDIR TOOLSDIR GJDOC CREATE_API_DOCS_TRUE CREATE_API_DOCS_FALSE JAY JAY_SKELETON REGEN_PARSERS_TRUE REGEN_PARSERS_FALSE USE_PREBUILT_GLIBJ_ZIP_TRUE USE_PREBUILT_GLIBJ_ZIP_FALSE PATH_TO_GLIBJ_ZIP JAVA uudecode JAVAC JAVAC_IS_GCJ GCJ_JAVAC_TRUE GCJ_JAVAC_FALSE ANTLR_JAR ANTLR ac_ct_ANTLR JAVAC_MEM_OPT USE_ESCHER_TRUE USE_ESCHER_FALSE PATH_TO_ESCHER ENABLE_LOCAL_SOCKETS_TRUE ENABLE_LOCAL_SOCKETS_FALSE DEFAULT_PREFS_PEER WANT_NATIVE_BIG_INTEGER CREATE_GMPBI_LIBRARY_TRUE CREATE_GMPBI_LIBRARY_FALSE LIBOBJS LTLIBOBJS'
+ ac_subst_files=''
+ ac_pwd=`pwd`
+
+@@ -1063,6 +1063,9 @@
+ (disabled by --disable-gmp) default=yes
+ --disable-gjdoc compile GJDoc (disabled by --disable-gjdoc)
+ default=yes
++ --enable-version-specific-runtime-libs
++ specify that runtime libraries should be installed
++ in a compiler-specific directory
+ --enable-regen-headers automatically regenerate JNI headers default=yes if
+ headers don't exist
+ --enable-regen-gjdoc-parser
+@@ -4838,11 +4841,57 @@
+ fi
+
+
++# Check whether --enable-version-specific-runtime-libs or --disable-version-specific-runtime-libs was given.
++if test "${enable_version_specific_runtime_libs+set}" = set; then
++ enableval="$enable_version_specific_runtime_libs"
++ case "$enableval" in
++ yes) version_specific_libs=yes ;;
++ no) version_specific_libs=no ;;
++ *) { { echo "$as_me:$LINENO: error: Unknown argument to enable/disable version-specific libs" >&5
++echo "$as_me: error: Unknown argument to enable/disable version-specific libs" >&2;}
++ { (exit 1); exit 1; }; };;
++ esac
++else
++ version_specific_libs=no
++
++fi;
++
++ case ${host_alias} in
++ "") host_noncanonical=${build_noncanonical} ;;
++ *) host_noncanonical=${host_alias} ;;
++ esac
++ case ${target_alias} in
++ "") target_noncanonical=${host_noncanonical} ;;
++ *) target_noncanonical=${target_alias} ;;
++ esac
++
+
+- multi_os_directory=`$CC -print-multi-os-directory`
+- case $multi_os_directory in
+- .) toolexeclibdir=${libdir} ;; # Avoid trailing /.
+- *) toolexeclibdir=${libdir}/${multi_os_directory} ;;
++ case ${version_specific_libs} in
++ yes)
++ # Need the gcc compiler version to know where to install libraries
++ # and header files if --enable-version-specific-runtime-libs option
++ # is selected.
++ includedir='$(libdir)/gcc/$(target_noncanonical)/$(gcc_version)/include/'
++ toolexecdir='$(libdir)/gcc/$(target_noncanonical)'
++ toolexecmainlibdir='$(toolexecdir)/$(gcc_version)$(MULTISUBDIR)'
++ toolexeclibdir=$toolexecmainlibdir
++ ;;
++ no)
++ if test -n "$with_cross_host" &&
++ test x"$with_cross_host" != x"no"; then
++ # Install a library built with a cross compiler in tooldir, not libdir.
++ toolexecdir='$(exec_prefix)/$(target_noncanonical)'
++ toolexecmainlibdir='$(toolexecdir)/lib'
++ else
++ toolexecdir='$(libdir)/gcc-lib/$(target_noncanonical)'
++ toolexecmainlibdir='$(libdir)'
++ fi
++ multi_os_directory=`$CC -print-multi-os-directory`
++ case $multi_os_directory in
++ .) toolexeclibdir=$toolexecmainlibdir ;; # Avoid trailing /.
++ *) toolexeclibdir=$toolexecmainlibdir/$multi_os_directory ;;
++ esac
++ ;;
+ esac
+
+
+@@ -5753,13 +5802,13 @@
+ else
+ lt_cv_nm_interface="BSD nm"
+ echo "int some_variable = 0;" > conftest.$ac_ext
+- (eval echo "\"\$as_me:5756: $ac_compile\"" >&5)
++ (eval echo "\"\$as_me:5807: $ac_compile\"" >&5)
+ (eval "$ac_compile" 2>conftest.err)
+ cat conftest.err >&5
+- (eval echo "\"\$as_me:5759: $NM \\\"conftest.$ac_objext\\\"\"" >&5)
++ (eval echo "\"\$as_me:5810: $NM \\\"conftest.$ac_objext\\\"\"" >&5)
+ (eval "$NM \"conftest.$ac_objext\"" 2>conftest.err > conftest.out)
+ cat conftest.err >&5
+- (eval echo "\"\$as_me:5762: output\"" >&5)
++ (eval echo "\"\$as_me:5813: output\"" >&5)
+ cat conftest.out >&5
+ if $GREP 'External.*some_variable' conftest.out > /dev/null; then
+ lt_cv_nm_interface="MS dumpbin"
+@@ -6905,7 +6954,7 @@
+ ;;
+ *-*-irix6*)
+ # Find out which ABI we are using.
+- echo '#line 6908 "configure"' > conftest.$ac_ext
++ echo '#line 6959 "configure"' > conftest.$ac_ext
+ if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+@@ -8191,11 +8240,11 @@
+ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
+ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
+ -e 's:$: $lt_compiler_flag:'`
+- (eval echo "\"\$as_me:8194: $lt_compile\"" >&5)
++ (eval echo "\"\$as_me:8245: $lt_compile\"" >&5)
+ (eval "$lt_compile" 2>conftest.err)
+ ac_status=$?
+ cat conftest.err >&5
+- echo "$as_me:8198: \$? = $ac_status" >&5
++ echo "$as_me:8249: \$? = $ac_status" >&5
+ if (exit $ac_status) && test -s "$ac_outfile"; then
+ # The compiler can only warn and ignore the option if not recognized
+ # So say no if there are warnings other than the usual output.
+@@ -8530,11 +8579,11 @@
+ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
+ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
+ -e 's:$: $lt_compiler_flag:'`
+- (eval echo "\"\$as_me:8533: $lt_compile\"" >&5)
++ (eval echo "\"\$as_me:8584: $lt_compile\"" >&5)
+ (eval "$lt_compile" 2>conftest.err)
+ ac_status=$?
+ cat conftest.err >&5
+- echo "$as_me:8537: \$? = $ac_status" >&5
++ echo "$as_me:8588: \$? = $ac_status" >&5
+ if (exit $ac_status) && test -s "$ac_outfile"; then
+ # The compiler can only warn and ignore the option if not recognized
+ # So say no if there are warnings other than the usual output.
+@@ -8635,11 +8684,11 @@
+ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
+ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
+ -e 's:$: $lt_compiler_flag:'`
+- (eval echo "\"\$as_me:8638: $lt_compile\"" >&5)
++ (eval echo "\"\$as_me:8689: $lt_compile\"" >&5)
+ (eval "$lt_compile" 2>out/conftest.err)
+ ac_status=$?
+ cat out/conftest.err >&5
+- echo "$as_me:8642: \$? = $ac_status" >&5
++ echo "$as_me:8693: \$? = $ac_status" >&5
+ if (exit $ac_status) && test -s out/conftest2.$ac_objext
+ then
+ # The compiler can only warn and ignore the option if not recognized
+@@ -8690,11 +8739,11 @@
+ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
+ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
+ -e 's:$: $lt_compiler_flag:'`
+- (eval echo "\"\$as_me:8693: $lt_compile\"" >&5)
++ (eval echo "\"\$as_me:8744: $lt_compile\"" >&5)
+ (eval "$lt_compile" 2>out/conftest.err)
+ ac_status=$?
+ cat out/conftest.err >&5
+- echo "$as_me:8697: \$? = $ac_status" >&5
++ echo "$as_me:8748: \$? = $ac_status" >&5
+ if (exit $ac_status) && test -s out/conftest2.$ac_objext
+ then
+ # The compiler can only warn and ignore the option if not recognized
+@@ -11557,7 +11606,7 @@
+ lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
+ lt_status=$lt_dlunknown
+ cat > conftest.$ac_ext <<_LT_EOF
+-#line 11560 "configure"
++#line 11611 "configure"
+ #include "confdefs.h"
+
+ #if HAVE_DLFCN_H
+@@ -11653,7 +11702,7 @@
+ lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
+ lt_status=$lt_dlunknown
+ cat > conftest.$ac_ext <<_LT_EOF
+-#line 11656 "configure"
++#line 11707 "configure"
+ #include "confdefs.h"
+
+ #if HAVE_DLFCN_H
+@@ -16084,11 +16133,11 @@
+ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
+ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
+ -e 's:$: $lt_compiler_flag:'`
+- (eval echo "\"\$as_me:16087: $lt_compile\"" >&5)
++ (eval echo "\"\$as_me:16138: $lt_compile\"" >&5)
+ (eval "$lt_compile" 2>conftest.err)
+ ac_status=$?
+ cat conftest.err >&5
+- echo "$as_me:16091: \$? = $ac_status" >&5
++ echo "$as_me:16142: \$? = $ac_status" >&5
+ if (exit $ac_status) && test -s "$ac_outfile"; then
+ # The compiler can only warn and ignore the option if not recognized
+ # So say no if there are warnings other than the usual output.
+@@ -16183,11 +16232,11 @@
+ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
+ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
+ -e 's:$: $lt_compiler_flag:'`
+- (eval echo "\"\$as_me:16186: $lt_compile\"" >&5)
++ (eval echo "\"\$as_me:16237: $lt_compile\"" >&5)
+ (eval "$lt_compile" 2>out/conftest.err)
+ ac_status=$?
+ cat out/conftest.err >&5
+- echo "$as_me:16190: \$? = $ac_status" >&5
++ echo "$as_me:16241: \$? = $ac_status" >&5
+ if (exit $ac_status) && test -s out/conftest2.$ac_objext
+ then
+ # The compiler can only warn and ignore the option if not recognized
+@@ -16235,11 +16284,11 @@
+ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
+ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
+ -e 's:$: $lt_compiler_flag:'`
+- (eval echo "\"\$as_me:16238: $lt_compile\"" >&5)
++ (eval echo "\"\$as_me:16289: $lt_compile\"" >&5)
+ (eval "$lt_compile" 2>out/conftest.err)
+ ac_status=$?
+ cat out/conftest.err >&5
+- echo "$as_me:16242: \$? = $ac_status" >&5
++ echo "$as_me:16293: \$? = $ac_status" >&5
+ if (exit $ac_status) && test -s out/conftest2.$ac_objext
+ then
+ # The compiler can only warn and ignore the option if not recognized
+@@ -29270,7 +29319,7 @@
+ if uudecode$EXEEXT Test.uue; then
+ ac_cv_prog_uudecode_base64=yes
+ else
+- echo "configure: 29273: uudecode had trouble decoding base 64 file 'Test.uue'" >&5
++ echo "configure: 29324: uudecode had trouble decoding base 64 file 'Test.uue'" >&5
+ echo "configure: failed file was:" >&5
+ cat Test.uue >&5
+ ac_cv_prog_uudecode_base64=no
+@@ -29417,7 +29466,7 @@
+ JAVA_TEST=Object.java
+ CLASS_TEST=Object.class
+ cat << \EOF > $JAVA_TEST
+-/* #line 29420 "configure" */
++/* #line 29471 "configure" */
+ package java.lang;
+
+ public class Object
+@@ -29466,7 +29515,7 @@
+ CLASS_TEST=Test.class
+ TEST=Test
+ cat << \EOF > $JAVA_TEST
+-/* [#]line 29469 "configure" */
++/* [#]line 29520 "configure" */
+ public class Test {
+ public static void main (String args[]) {
+ System.exit (0);
+@@ -29786,7 +29835,7 @@
+ JAVA_TEST=Object.java
+ CLASS_TEST=Object.class
+ cat << \EOF > $JAVA_TEST
+-/* #line 29789 "configure" */
++/* #line 29840 "configure" */
+ package java.lang;
+
+ public class Object
+@@ -29827,7 +29876,7 @@
+ JAVA_TEST=Test.java
+ CLASS_TEST=Test.class
+ cat << \EOF > $JAVA_TEST
+- /* #line 29830 "configure" */
++ /* #line 29881 "configure" */
+ public class Test
+ {
+ public static void main(String args)
+@@ -31681,6 +31730,9 @@
+ s,@CREATE_PLUGIN_FALSE@,$CREATE_PLUGIN_FALSE,;t t
+ s,@CREATE_GJDOC_TRUE@,$CREATE_GJDOC_TRUE,;t t
+ s,@CREATE_GJDOC_FALSE@,$CREATE_GJDOC_FALSE,;t t
++s,@target_noncanonical@,$target_noncanonical,;t t
++s,@toolexecdir@,$toolexecdir,;t t
++s,@toolexecmainlibdir@,$toolexecmainlibdir,;t t
+ s,@toolexeclibdir@,$toolexeclibdir,;t t
+ s,@nativeexeclibdir@,$nativeexeclibdir,;t t
+ s,@glibjdir@,$glibjdir,;t t
+diff -Nur a/libjava/classpath/configure.ac b/libjava/classpath/configure.ac
+--- a/libjava/classpath/configure.ac 2009-03-16 13:08:23.000000000 +0100
++++ b/libjava/classpath/configure.ac 2010-01-25 09:50:29.625686976 +0100
+@@ -316,6 +316,16 @@
+ dnl so that we can refer to the multilib installation directories from
+ dnl classpath's build files.
+ dnl -----------------------------------------------------------
++AC_ARG_ENABLE(version-specific-runtime-libs,
++ AS_HELP_STRING([--enable-version-specific-runtime-libs],
++ [specify that runtime libraries should be installed in a compiler-specific directory]),
++ [case "$enableval" in
++ yes) version_specific_libs=yes ;;
++ no) version_specific_libs=no ;;
++ *) AC_MSG_ERROR([Unknown argument to enable/disable version-specific libs]);;
++ esac],
++ [version_specific_libs=no]
++)
+ CLASSPATH_TOOLEXECLIBDIR
+
+ dnl -----------------------------------------------------------
+diff -Nur a/libjava/classpath/doc/api/Makefile.in b/libjava/classpath/doc/api/Makefile.in
+--- a/libjava/classpath/doc/api/Makefile.in 2008-11-12 21:55:13.000000000 +0100
++++ b/libjava/classpath/doc/api/Makefile.in 2010-01-25 09:50:29.625686976 +0100
+@@ -334,9 +334,12 @@
+ target = @target@
+ target_alias = @target_alias@
+ target_cpu = @target_cpu@
++target_noncanonical = @target_noncanonical@
+ target_os = @target_os@
+ target_vendor = @target_vendor@
++toolexecdir = @toolexecdir@
+ toolexeclibdir = @toolexeclibdir@
++toolexecmainlibdir = @toolexecmainlibdir@
+ uudecode = @uudecode@
+ vm_classes = @vm_classes@
+ @CREATE_API_DOCS_TRUE@noinst_DATA = html
+diff -Nur a/libjava/classpath/doc/Makefile.in b/libjava/classpath/doc/Makefile.in
+--- a/libjava/classpath/doc/Makefile.in 2008-11-12 21:55:13.000000000 +0100
++++ b/libjava/classpath/doc/Makefile.in 2010-01-25 09:50:29.625686976 +0100
+@@ -357,9 +357,12 @@
+ target = @target@
+ target_alias = @target_alias@
+ target_cpu = @target_cpu@
++target_noncanonical = @target_noncanonical@
+ target_os = @target_os@
+ target_vendor = @target_vendor@
++toolexecdir = @toolexecdir@
+ toolexeclibdir = @toolexeclibdir@
++toolexecmainlibdir = @toolexecmainlibdir@
+ uudecode = @uudecode@
+ vm_classes = @vm_classes@
+ SUBDIRS = api
+diff -Nur a/libjava/classpath/examples/Makefile.in b/libjava/classpath/examples/Makefile.in
+--- a/libjava/classpath/examples/Makefile.in 2008-11-12 21:55:13.000000000 +0100
++++ b/libjava/classpath/examples/Makefile.in 2010-01-25 09:50:29.625686976 +0100
+@@ -343,9 +343,12 @@
+ target = @target@
+ target_alias = @target_alias@
+ target_cpu = @target_cpu@
++target_noncanonical = @target_noncanonical@
+ target_os = @target_os@
+ target_vendor = @target_vendor@
++toolexecdir = @toolexecdir@
+ toolexeclibdir = @toolexeclibdir@
++toolexecmainlibdir = @toolexecmainlibdir@
+ uudecode = @uudecode@
+ vm_classes = @vm_classes@
+ GLIBJ_CLASSPATH = '$(top_builddir)/lib/glibj.zip:$(top_builddir)/lib'
+diff -Nur a/libjava/classpath/external/jsr166/Makefile.in b/libjava/classpath/external/jsr166/Makefile.in
+--- a/libjava/classpath/external/jsr166/Makefile.in 2008-11-12 21:55:13.000000000 +0100
++++ b/libjava/classpath/external/jsr166/Makefile.in 2010-01-25 09:50:29.625686976 +0100
+@@ -332,9 +332,12 @@
+ target = @target@
+ target_alias = @target_alias@
+ target_cpu = @target_cpu@
++target_noncanonical = @target_noncanonical@
+ target_os = @target_os@
+ target_vendor = @target_vendor@
++toolexecdir = @toolexecdir@
+ toolexeclibdir = @toolexeclibdir@
++toolexecmainlibdir = @toolexecmainlibdir@
+ uudecode = @uudecode@
+ vm_classes = @vm_classes@
+ EXTRA_DIST = IMPORTING \
+diff -Nur a/libjava/classpath/external/Makefile.in b/libjava/classpath/external/Makefile.in
+--- a/libjava/classpath/external/Makefile.in 2008-11-12 21:55:13.000000000 +0100
++++ b/libjava/classpath/external/Makefile.in 2010-01-25 09:50:29.625686976 +0100
+@@ -341,9 +341,12 @@
+ target = @target@
+ target_alias = @target_alias@
+ target_cpu = @target_cpu@
++target_noncanonical = @target_noncanonical@
+ target_os = @target_os@
+ target_vendor = @target_vendor@
++toolexecdir = @toolexecdir@
+ toolexeclibdir = @toolexeclibdir@
++toolexecmainlibdir = @toolexecmainlibdir@
+ uudecode = @uudecode@
+ vm_classes = @vm_classes@
+ SUBDIRS = sax w3c_dom relaxngDatatype jsr166
+diff -Nur a/libjava/classpath/external/relaxngDatatype/Makefile.in b/libjava/classpath/external/relaxngDatatype/Makefile.in
+--- a/libjava/classpath/external/relaxngDatatype/Makefile.in 2008-11-12 21:55:13.000000000 +0100
++++ b/libjava/classpath/external/relaxngDatatype/Makefile.in 2010-01-25 09:50:29.625686976 +0100
+@@ -332,9 +332,12 @@
+ target = @target@
+ target_alias = @target_alias@
+ target_cpu = @target_cpu@
++target_noncanonical = @target_noncanonical@
+ target_os = @target_os@
+ target_vendor = @target_vendor@
++toolexecdir = @toolexecdir@
+ toolexeclibdir = @toolexeclibdir@
++toolexecmainlibdir = @toolexecmainlibdir@
+ uudecode = @uudecode@
+ vm_classes = @vm_classes@
+ EXTRA_DIST = README.txt \
+diff -Nur a/libjava/classpath/external/sax/Makefile.in b/libjava/classpath/external/sax/Makefile.in
+--- a/libjava/classpath/external/sax/Makefile.in 2008-11-12 21:55:13.000000000 +0100
++++ b/libjava/classpath/external/sax/Makefile.in 2010-01-25 09:50:29.625686976 +0100
+@@ -332,9 +332,12 @@
+ target = @target@
+ target_alias = @target_alias@
+ target_cpu = @target_cpu@
++target_noncanonical = @target_noncanonical@
+ target_os = @target_os@
+ target_vendor = @target_vendor@
++toolexecdir = @toolexecdir@
+ toolexeclibdir = @toolexeclibdir@
++toolexecmainlibdir = @toolexecmainlibdir@
+ uudecode = @uudecode@
+ vm_classes = @vm_classes@
+ EXTRA_DIST = README \
+diff -Nur a/libjava/classpath/external/w3c_dom/Makefile.in b/libjava/classpath/external/w3c_dom/Makefile.in
+--- a/libjava/classpath/external/w3c_dom/Makefile.in 2008-11-12 21:55:13.000000000 +0100
++++ b/libjava/classpath/external/w3c_dom/Makefile.in 2010-01-25 09:50:29.625686976 +0100
+@@ -332,9 +332,12 @@
+ target = @target@
+ target_alias = @target_alias@
+ target_cpu = @target_cpu@
++target_noncanonical = @target_noncanonical@
+ target_os = @target_os@
+ target_vendor = @target_vendor@
++toolexecdir = @toolexecdir@
+ toolexeclibdir = @toolexeclibdir@
++toolexecmainlibdir = @toolexecmainlibdir@
+ uudecode = @uudecode@
+ vm_classes = @vm_classes@
+ EXTRA_DIST = README \
+diff -Nur a/libjava/classpath/include/Makefile.in b/libjava/classpath/include/Makefile.in
+--- a/libjava/classpath/include/Makefile.in 2008-11-12 21:55:13.000000000 +0100
++++ b/libjava/classpath/include/Makefile.in 2010-01-25 09:50:29.625686976 +0100
+@@ -333,9 +333,12 @@
+ target = @target@
+ target_alias = @target_alias@
+ target_cpu = @target_cpu@
++target_noncanonical = @target_noncanonical@
+ target_os = @target_os@
+ target_vendor = @target_vendor@
++toolexecdir = @toolexecdir@
+ toolexeclibdir = @toolexeclibdir@
++toolexecmainlibdir = @toolexecmainlibdir@
+ uudecode = @uudecode@
+ vm_classes = @vm_classes@
+ @CREATE_JNI_HEADERS_FALSE@DISTCLEANFILES = jni_md.h config-int.h
+diff -Nur a/libjava/classpath/lib/Makefile.in b/libjava/classpath/lib/Makefile.in
+--- a/libjava/classpath/lib/Makefile.in 2008-11-12 21:55:13.000000000 +0100
++++ b/libjava/classpath/lib/Makefile.in 2010-01-25 09:50:29.625686976 +0100
+@@ -337,9 +337,12 @@
+ target = @target@
+ target_alias = @target_alias@
+ target_cpu = @target_cpu@
++target_noncanonical = @target_noncanonical@
+ target_os = @target_os@
+ target_vendor = @target_vendor@
++toolexecdir = @toolexecdir@
+ toolexeclibdir = @toolexeclibdir@
++toolexecmainlibdir = @toolexecmainlibdir@
+ uudecode = @uudecode@
+ vm_classes = @vm_classes@
+ JAVA_DEPEND = java.dep
+diff -Nur a/libjava/classpath/m4/acinclude.m4 b/libjava/classpath/m4/acinclude.m4
+--- a/libjava/classpath/m4/acinclude.m4 2008-10-21 19:55:01.000000000 +0200
++++ b/libjava/classpath/m4/acinclude.m4 2010-01-25 09:50:29.625686976 +0100
+@@ -247,11 +247,45 @@
+ dnl -----------------------------------------------------------
+ AC_DEFUN([CLASSPATH_TOOLEXECLIBDIR],
+ [
+- multi_os_directory=`$CC -print-multi-os-directory`
+- case $multi_os_directory in
+- .) toolexeclibdir=${libdir} ;; # Avoid trailing /.
+- *) toolexeclibdir=${libdir}/${multi_os_directory} ;;
++ case ${host_alias} in
++ "") host_noncanonical=${build_noncanonical} ;;
++ *) host_noncanonical=${host_alias} ;;
+ esac
++ case ${target_alias} in
++ "") target_noncanonical=${host_noncanonical} ;;
++ *) target_noncanonical=${target_alias} ;;
++ esac
++ AC_SUBST(target_noncanonical)
++
++ case ${version_specific_libs} in
++ yes)
++ # Need the gcc compiler version to know where to install libraries
++ # and header files if --enable-version-specific-runtime-libs option
++ # is selected.
++ includedir='$(libdir)/gcc/$(target_noncanonical)/$(gcc_version)/include/'
++ toolexecdir='$(libdir)/gcc/$(target_noncanonical)'
++ toolexecmainlibdir='$(toolexecdir)/$(gcc_version)$(MULTISUBDIR)'
++ toolexeclibdir=$toolexecmainlibdir
++ ;;
++ no)
++ if test -n "$with_cross_host" &&
++ test x"$with_cross_host" != x"no"; then
++ # Install a library built with a cross compiler in tooldir, not libdir.
++ toolexecdir='$(exec_prefix)/$(target_noncanonical)'
++ toolexecmainlibdir='$(toolexecdir)/lib'
++ else
++ toolexecdir='$(libdir)/gcc-lib/$(target_noncanonical)'
++ toolexecmainlibdir='$(libdir)'
++ fi
++ multi_os_directory=`$CC -print-multi-os-directory`
++ case $multi_os_directory in
++ .) toolexeclibdir=$toolexecmainlibdir ;; # Avoid trailing /.
++ *) toolexeclibdir=$toolexecmainlibdir/$multi_os_directory ;;
++ esac
++ ;;
++ esac
++ AC_SUBST(toolexecdir)
++ AC_SUBST(toolexecmainlibdir)
+ AC_SUBST(toolexeclibdir)
+ ])
+
+diff -Nur a/libjava/classpath/Makefile.in b/libjava/classpath/Makefile.in
+--- a/libjava/classpath/Makefile.in 2009-02-25 22:40:28.000000000 +0100
++++ b/libjava/classpath/Makefile.in 2010-01-25 09:50:29.625686976 +0100
+@@ -380,9 +380,12 @@
+ target = @target@
+ target_alias = @target_alias@
+ target_cpu = @target_cpu@
++target_noncanonical = @target_noncanonical@
+ target_os = @target_os@
+ target_vendor = @target_vendor@
++toolexecdir = @toolexecdir@
+ toolexeclibdir = @toolexeclibdir@
++toolexecmainlibdir = @toolexecmainlibdir@
+ uudecode = @uudecode@
+ vm_classes = @vm_classes@
+
+diff -Nur a/libjava/classpath/native/fdlibm/Makefile.in b/libjava/classpath/native/fdlibm/Makefile.in
+--- a/libjava/classpath/native/fdlibm/Makefile.in 2008-11-12 21:55:13.000000000 +0100
++++ b/libjava/classpath/native/fdlibm/Makefile.in 2010-01-25 09:50:29.625686976 +0100
+@@ -359,9 +359,12 @@
+ target = @target@
+ target_alias = @target_alias@
+ target_cpu = @target_cpu@
++target_noncanonical = @target_noncanonical@
+ target_os = @target_os@
+ target_vendor = @target_vendor@
++toolexecdir = @toolexecdir@
+ toolexeclibdir = @toolexeclibdir@
++toolexecmainlibdir = @toolexecmainlibdir@
+ uudecode = @uudecode@
+ vm_classes = @vm_classes@
+ noinst_LTLIBRARIES = libfdlibm.la
+diff -Nur a/libjava/classpath/native/jawt/Makefile.in b/libjava/classpath/native/jawt/Makefile.in
+--- a/libjava/classpath/native/jawt/Makefile.in 2008-11-12 21:55:13.000000000 +0100
++++ b/libjava/classpath/native/jawt/Makefile.in 2010-01-25 09:50:29.625686976 +0100
+@@ -359,9 +359,12 @@
+ target = @target@
+ target_alias = @target_alias@
+ target_cpu = @target_cpu@
++target_noncanonical = @target_noncanonical@
+ target_os = @target_os@
+ target_vendor = @target_vendor@
++toolexecdir = @toolexecdir@
+ toolexeclibdir = @toolexeclibdir@
++toolexecmainlibdir = @toolexecmainlibdir@
+ uudecode = @uudecode@
+ vm_classes = @vm_classes@
+ nativeexeclib_LTLIBRARIES = libjawt.la
+diff -Nur a/libjava/classpath/native/jni/classpath/Makefile.in b/libjava/classpath/native/jni/classpath/Makefile.in
+--- a/libjava/classpath/native/jni/classpath/Makefile.in 2008-11-12 21:55:13.000000000 +0100
++++ b/libjava/classpath/native/jni/classpath/Makefile.in 2010-01-25 09:50:29.625686976 +0100
+@@ -350,9 +350,12 @@
+ target = @target@
+ target_alias = @target_alias@
+ target_cpu = @target_cpu@
++target_noncanonical = @target_noncanonical@
+ target_os = @target_os@
+ target_vendor = @target_vendor@
++toolexecdir = @toolexecdir@
+ toolexeclibdir = @toolexeclibdir@
++toolexecmainlibdir = @toolexecmainlibdir@
+ uudecode = @uudecode@
+ vm_classes = @vm_classes@
+
+diff -Nur a/libjava/classpath/native/jni/gconf-peer/Makefile.in b/libjava/classpath/native/jni/gconf-peer/Makefile.in
+--- a/libjava/classpath/native/jni/gconf-peer/Makefile.in 2008-11-12 21:55:13.000000000 +0100
++++ b/libjava/classpath/native/jni/gconf-peer/Makefile.in 2010-01-25 09:50:29.625686976 +0100
+@@ -359,9 +359,12 @@
+ target = @target@
+ target_alias = @target_alias@
+ target_cpu = @target_cpu@
++target_noncanonical = @target_noncanonical@
+ target_os = @target_os@
+ target_vendor = @target_vendor@
++toolexecdir = @toolexecdir@
+ toolexeclibdir = @toolexeclibdir@
++toolexecmainlibdir = @toolexecmainlibdir@
+ uudecode = @uudecode@
+ vm_classes = @vm_classes@
+ nativeexeclib_LTLIBRARIES = libgconfpeer.la
+diff -Nur a/libjava/classpath/native/jni/gstreamer-peer/Makefile.in b/libjava/classpath/native/jni/gstreamer-peer/Makefile.in
+--- a/libjava/classpath/native/jni/gstreamer-peer/Makefile.in 2008-11-12 21:55:13.000000000 +0100
++++ b/libjava/classpath/native/jni/gstreamer-peer/Makefile.in 2010-01-25 09:50:29.625686976 +0100
+@@ -361,9 +361,12 @@
+ target = @target@
+ target_alias = @target_alias@
+ target_cpu = @target_cpu@
++target_noncanonical = @target_noncanonical@
+ target_os = @target_os@
+ target_vendor = @target_vendor@
++toolexecdir = @toolexecdir@
+ toolexeclibdir = @toolexeclibdir@
++toolexecmainlibdir = @toolexecmainlibdir@
+ uudecode = @uudecode@
+ vm_classes = @vm_classes@
+ nativeexeclib_LTLIBRARIES = libgstreamerpeer.la
+diff -Nur a/libjava/classpath/native/jni/gtk-peer/Makefile.in b/libjava/classpath/native/jni/gtk-peer/Makefile.in
+--- a/libjava/classpath/native/jni/gtk-peer/Makefile.in 2008-11-12 21:55:13.000000000 +0100
++++ b/libjava/classpath/native/jni/gtk-peer/Makefile.in 2010-01-25 09:50:29.625686976 +0100
+@@ -397,9 +397,12 @@
+ target = @target@
+ target_alias = @target_alias@
+ target_cpu = @target_cpu@
++target_noncanonical = @target_noncanonical@
+ target_os = @target_os@
+ target_vendor = @target_vendor@
++toolexecdir = @toolexecdir@
+ toolexeclibdir = @toolexeclibdir@
++toolexecmainlibdir = @toolexecmainlibdir@
+ uudecode = @uudecode@
+ vm_classes = @vm_classes@
+ nativeexeclib_LTLIBRARIES = libgtkpeer.la
+diff -Nur a/libjava/classpath/native/jni/java-io/Makefile.in b/libjava/classpath/native/jni/java-io/Makefile.in
+--- a/libjava/classpath/native/jni/java-io/Makefile.in 2008-11-12 21:55:13.000000000 +0100
++++ b/libjava/classpath/native/jni/java-io/Makefile.in 2010-01-25 09:50:29.625686976 +0100
+@@ -361,9 +361,12 @@
+ target = @target@
+ target_alias = @target_alias@
+ target_cpu = @target_cpu@
++target_noncanonical = @target_noncanonical@
+ target_os = @target_os@
+ target_vendor = @target_vendor@
++toolexecdir = @toolexecdir@
+ toolexeclibdir = @toolexeclibdir@
++toolexecmainlibdir = @toolexecmainlibdir@
+ uudecode = @uudecode@
+ vm_classes = @vm_classes@
+ nativeexeclib_LTLIBRARIES = libjavaio.la
+diff -Nur a/libjava/classpath/native/jni/java-lang/Makefile.in b/libjava/classpath/native/jni/java-lang/Makefile.in
+--- a/libjava/classpath/native/jni/java-lang/Makefile.in 2008-11-12 21:55:13.000000000 +0100
++++ b/libjava/classpath/native/jni/java-lang/Makefile.in 2010-01-25 09:50:29.625686976 +0100
+@@ -375,9 +375,12 @@
+ target = @target@
+ target_alias = @target_alias@
+ target_cpu = @target_cpu@
++target_noncanonical = @target_noncanonical@
+ target_os = @target_os@
+ target_vendor = @target_vendor@
++toolexecdir = @toolexecdir@
+ toolexeclibdir = @toolexeclibdir@
++toolexecmainlibdir = @toolexecmainlibdir@
+ uudecode = @uudecode@
+ vm_classes = @vm_classes@
+ nativeexeclib_LTLIBRARIES = libjavalang.la libjavalangreflect.la libjavalangmanagement.la
+diff -Nur a/libjava/classpath/native/jni/java-math/Makefile.in b/libjava/classpath/native/jni/java-math/Makefile.in
+--- a/libjava/classpath/native/jni/java-math/Makefile.in 2008-11-12 21:55:13.000000000 +0100
++++ b/libjava/classpath/native/jni/java-math/Makefile.in 2010-01-25 09:50:29.625686976 +0100
+@@ -359,9 +359,12 @@
+ target = @target@
+ target_alias = @target_alias@
+ target_cpu = @target_cpu@
++target_noncanonical = @target_noncanonical@
+ target_os = @target_os@
+ target_vendor = @target_vendor@
++toolexecdir = @toolexecdir@
+ toolexeclibdir = @toolexeclibdir@
++toolexecmainlibdir = @toolexecmainlibdir@
+ uudecode = @uudecode@
+ vm_classes = @vm_classes@
+ nativeexeclib_LTLIBRARIES = libjavamath.la
+diff -Nur a/libjava/classpath/native/jni/java-net/Makefile.in b/libjava/classpath/native/jni/java-net/Makefile.in
+--- a/libjava/classpath/native/jni/java-net/Makefile.in 2008-11-12 21:55:13.000000000 +0100
++++ b/libjava/classpath/native/jni/java-net/Makefile.in 2010-01-25 09:50:29.625686976 +0100
+@@ -371,9 +371,12 @@
+ target = @target@
+ target_alias = @target_alias@
+ target_cpu = @target_cpu@
++target_noncanonical = @target_noncanonical@
+ target_os = @target_os@
+ target_vendor = @target_vendor@
++toolexecdir = @toolexecdir@
+ toolexeclibdir = @toolexeclibdir@
++toolexecmainlibdir = @toolexecmainlibdir@
+ uudecode = @uudecode@
+ vm_classes = @vm_classes@
+ nativeexeclib_LTLIBRARIES = libjavanet.la
+diff -Nur a/libjava/classpath/native/jni/java-nio/Makefile.in b/libjava/classpath/native/jni/java-nio/Makefile.in
+--- a/libjava/classpath/native/jni/java-nio/Makefile.in 2008-11-12 21:55:13.000000000 +0100
++++ b/libjava/classpath/native/jni/java-nio/Makefile.in 2010-01-25 09:50:29.625686976 +0100
+@@ -369,9 +369,12 @@
+ target = @target@
+ target_alias = @target_alias@
+ target_cpu = @target_cpu@
++target_noncanonical = @target_noncanonical@
+ target_os = @target_os@
+ target_vendor = @target_vendor@
++toolexecdir = @toolexecdir@
+ toolexeclibdir = @toolexeclibdir@
++toolexecmainlibdir = @toolexecmainlibdir@
+ uudecode = @uudecode@
+ vm_classes = @vm_classes@
+ nativeexeclib_LTLIBRARIES = libjavanio.la
+diff -Nur a/libjava/classpath/native/jni/java-util/Makefile.in b/libjava/classpath/native/jni/java-util/Makefile.in
+--- a/libjava/classpath/native/jni/java-util/Makefile.in 2008-11-12 21:55:13.000000000 +0100
++++ b/libjava/classpath/native/jni/java-util/Makefile.in 2010-01-25 09:50:29.625686976 +0100
+@@ -358,9 +358,12 @@
+ target = @target@
+ target_alias = @target_alias@
+ target_cpu = @target_cpu@
++target_noncanonical = @target_noncanonical@
+ target_os = @target_os@
+ target_vendor = @target_vendor@
++toolexecdir = @toolexecdir@
+ toolexeclibdir = @toolexeclibdir@
++toolexecmainlibdir = @toolexecmainlibdir@
+ uudecode = @uudecode@
+ vm_classes = @vm_classes@
+ nativeexeclib_LTLIBRARIES = libjavautil.la
+diff -Nur a/libjava/classpath/native/jni/Makefile.in b/libjava/classpath/native/jni/Makefile.in
+--- a/libjava/classpath/native/jni/Makefile.in 2008-11-12 21:55:13.000000000 +0100
++++ b/libjava/classpath/native/jni/Makefile.in 2010-01-25 09:50:29.625686976 +0100
+@@ -340,9 +340,12 @@
+ target = @target@
+ target_alias = @target_alias@
+ target_cpu = @target_cpu@
++target_noncanonical = @target_noncanonical@
+ target_os = @target_os@
+ target_vendor = @target_vendor@
++toolexecdir = @toolexecdir@
+ toolexeclibdir = @toolexeclibdir@
++toolexecmainlibdir = @toolexecmainlibdir@
+ uudecode = @uudecode@
+ vm_classes = @vm_classes@
+ @CREATE_CORE_JNI_LIBRARIES_TRUE@JNIDIRS = native-lib java-io java-lang java-net java-nio java-util
+diff -Nur a/libjava/classpath/native/jni/midi-alsa/Makefile.in b/libjava/classpath/native/jni/midi-alsa/Makefile.in
+--- a/libjava/classpath/native/jni/midi-alsa/Makefile.in 2008-11-12 21:55:13.000000000 +0100
++++ b/libjava/classpath/native/jni/midi-alsa/Makefile.in 2010-01-25 09:50:29.625686976 +0100
+@@ -361,9 +361,12 @@
+ target = @target@
+ target_alias = @target_alias@
+ target_cpu = @target_cpu@
++target_noncanonical = @target_noncanonical@
+ target_os = @target_os@
+ target_vendor = @target_vendor@
++toolexecdir = @toolexecdir@
+ toolexeclibdir = @toolexeclibdir@
++toolexecmainlibdir = @toolexecmainlibdir@
+ uudecode = @uudecode@
+ vm_classes = @vm_classes@
+ nativeexeclib_LTLIBRARIES = libgjsmalsa.la
+diff -Nur a/libjava/classpath/native/jni/midi-dssi/Makefile.in b/libjava/classpath/native/jni/midi-dssi/Makefile.in
+--- a/libjava/classpath/native/jni/midi-dssi/Makefile.in 2008-11-12 21:55:13.000000000 +0100
++++ b/libjava/classpath/native/jni/midi-dssi/Makefile.in 2010-01-25 09:50:29.625686976 +0100
+@@ -361,9 +361,12 @@
+ target = @target@
+ target_alias = @target_alias@
+ target_cpu = @target_cpu@
++target_noncanonical = @target_noncanonical@
+ target_os = @target_os@
+ target_vendor = @target_vendor@
++toolexecdir = @toolexecdir@
+ toolexeclibdir = @toolexeclibdir@
++toolexecmainlibdir = @toolexecmainlibdir@
+ uudecode = @uudecode@
+ vm_classes = @vm_classes@
+ nativeexeclib_LTLIBRARIES = libgjsmdssi.la
+diff -Nur a/libjava/classpath/native/jni/native-lib/Makefile.in b/libjava/classpath/native/jni/native-lib/Makefile.in
+--- a/libjava/classpath/native/jni/native-lib/Makefile.in 2008-11-12 21:55:13.000000000 +0100
++++ b/libjava/classpath/native/jni/native-lib/Makefile.in 2010-01-25 09:50:29.625686976 +0100
+@@ -350,9 +350,12 @@
+ target = @target@
+ target_alias = @target_alias@
+ target_cpu = @target_cpu@
++target_noncanonical = @target_noncanonical@
+ target_os = @target_os@
+ target_vendor = @target_vendor@
++toolexecdir = @toolexecdir@
+ toolexeclibdir = @toolexeclibdir@
++toolexecmainlibdir = @toolexecmainlibdir@
+ uudecode = @uudecode@
+ vm_classes = @vm_classes@
+ noinst_LTLIBRARIES = libclasspathnative.la
+diff -Nur a/libjava/classpath/native/jni/qt-peer/Makefile.in b/libjava/classpath/native/jni/qt-peer/Makefile.in
+--- a/libjava/classpath/native/jni/qt-peer/Makefile.in 2008-11-12 21:55:13.000000000 +0100
++++ b/libjava/classpath/native/jni/qt-peer/Makefile.in 2010-01-25 09:50:29.635686641 +0100
+@@ -376,9 +376,12 @@
+ target = @target@
+ target_alias = @target_alias@
+ target_cpu = @target_cpu@
++target_noncanonical = @target_noncanonical@
+ target_os = @target_os@
+ target_vendor = @target_vendor@
++toolexecdir = @toolexecdir@
+ toolexeclibdir = @toolexeclibdir@
++toolexecmainlibdir = @toolexecmainlibdir@
+ uudecode = @uudecode@
+ vm_classes = @vm_classes@
+ noinst_LTLIBRARIES = libqtpeer.la
+diff -Nur a/libjava/classpath/native/jni/xmlj/Makefile.in b/libjava/classpath/native/jni/xmlj/Makefile.in
+--- a/libjava/classpath/native/jni/xmlj/Makefile.in 2008-11-12 21:55:13.000000000 +0100
++++ b/libjava/classpath/native/jni/xmlj/Makefile.in 2010-01-25 09:50:29.635686641 +0100
+@@ -360,9 +360,12 @@
+ target = @target@
+ target_alias = @target_alias@
+ target_cpu = @target_cpu@
++target_noncanonical = @target_noncanonical@
+ target_os = @target_os@
+ target_vendor = @target_vendor@
++toolexecdir = @toolexecdir@
+ toolexeclibdir = @toolexeclibdir@
++toolexecmainlibdir = @toolexecmainlibdir@
+ uudecode = @uudecode@
+ vm_classes = @vm_classes@
+ nativeexeclib_LTLIBRARIES = libxmlj.la
+diff -Nur a/libjava/classpath/native/Makefile.in b/libjava/classpath/native/Makefile.in
+--- a/libjava/classpath/native/Makefile.in 2008-11-12 21:55:13.000000000 +0100
++++ b/libjava/classpath/native/Makefile.in 2010-01-25 09:50:29.635686641 +0100
+@@ -340,9 +340,12 @@
+ target = @target@
+ target_alias = @target_alias@
+ target_cpu = @target_cpu@
++target_noncanonical = @target_noncanonical@
+ target_os = @target_os@
+ target_vendor = @target_vendor@
++toolexecdir = @toolexecdir@
+ toolexeclibdir = @toolexeclibdir@
++toolexecmainlibdir = @toolexecmainlibdir@
+ uudecode = @uudecode@
+ vm_classes = @vm_classes@
+ @CREATE_JNI_LIBRARIES_TRUE@JNIDIR = jni
+diff -Nur a/libjava/classpath/native/plugin/Makefile.in b/libjava/classpath/native/plugin/Makefile.in
+--- a/libjava/classpath/native/plugin/Makefile.in 2008-11-12 21:55:13.000000000 +0100
++++ b/libjava/classpath/native/plugin/Makefile.in 2010-01-25 09:50:29.635686641 +0100
+@@ -358,9 +358,12 @@
+ target = @target@
+ target_alias = @target_alias@
+ target_cpu = @target_cpu@
++target_noncanonical = @target_noncanonical@
+ target_os = @target_os@
+ target_vendor = @target_vendor@
++toolexecdir = @toolexecdir@
+ toolexeclibdir = @toolexeclibdir@
++toolexecmainlibdir = @toolexecmainlibdir@
+ uudecode = @uudecode@
+ vm_classes = @vm_classes@
+ nativeexeclib_LTLIBRARIES = libgcjwebplugin.la
+diff -Nur a/libjava/classpath/resource/Makefile.in b/libjava/classpath/resource/Makefile.in
+--- a/libjava/classpath/resource/Makefile.in 2008-11-12 21:55:13.000000000 +0100
++++ b/libjava/classpath/resource/Makefile.in 2010-01-25 09:50:29.635686641 +0100
+@@ -343,9 +343,12 @@
+ target = @target@
+ target_alias = @target_alias@
+ target_cpu = @target_cpu@
++target_noncanonical = @target_noncanonical@
+ target_os = @target_os@
+ target_vendor = @target_vendor@
++toolexecdir = @toolexecdir@
+ toolexeclibdir = @toolexeclibdir@
++toolexecmainlibdir = @toolexecmainlibdir@
+ uudecode = @uudecode@
+ vm_classes = @vm_classes@
+ logging_DATA = java/util/logging/logging.properties
+diff -Nur a/libjava/classpath/scripts/Makefile.in b/libjava/classpath/scripts/Makefile.in
+--- a/libjava/classpath/scripts/Makefile.in 2008-11-12 21:55:13.000000000 +0100
++++ b/libjava/classpath/scripts/Makefile.in 2010-01-25 09:50:29.635686641 +0100
+@@ -333,9 +333,12 @@
+ target = @target@
+ target_alias = @target_alias@
+ target_cpu = @target_cpu@
++target_noncanonical = @target_noncanonical@
+ target_os = @target_os@
+ target_vendor = @target_vendor@
++toolexecdir = @toolexecdir@
+ toolexeclibdir = @toolexeclibdir@
++toolexecmainlibdir = @toolexecmainlibdir@
+ uudecode = @uudecode@
+ vm_classes = @vm_classes@
+ EXTRA_DIST = generate-locale-list.sh import-cacerts.sh
+diff -Nur a/libjava/classpath/tools/Makefile.in b/libjava/classpath/tools/Makefile.in
+--- a/libjava/classpath/tools/Makefile.in 2008-11-12 21:55:13.000000000 +0100
++++ b/libjava/classpath/tools/Makefile.in 2010-01-25 09:50:29.635686641 +0100
+@@ -448,9 +448,12 @@
+ target = @target@
+ target_alias = @target_alias@
+ target_cpu = @target_cpu@
++target_noncanonical = @target_noncanonical@
+ target_os = @target_os@
+ target_vendor = @target_vendor@
++toolexecdir = @toolexecdir@
+ toolexeclibdir = @toolexeclibdir@
++toolexecmainlibdir = @toolexecmainlibdir@
+ uudecode = @uudecode@
+ vm_classes = @vm_classes@
+ @CREATE_GJDOC_TRUE@gjdoc_gendir = ${top_srcdir}/tools/generated
+diff -Nur a/libjava/configure b/libjava/configure
+--- a/libjava/configure 2009-07-22 09:43:59.000000000 +0200
++++ b/libjava/configure 2010-01-25 09:50:29.635686641 +0100
+@@ -26501,10 +26501,10 @@
+ multi_os_directory=`$CC -print-multi-os-directory`
+ case $multi_os_directory in
+ .)
+- dbexecdir='$(libdir)/'$gcjsubdir # Avoid /.
++ dbexecdir='$(toolexeclibdir)/'$gcjsubdir # Avoid /.
+ ;;
+ *)
+- dbexecdir='$(libdir)/'$multi_os_directory/$gcjsubdir
++ dbexecdir='$(toolexeclibdir)/'$multi_os_directory/$gcjsubdir
+ ;;
+ esac
+
+@@ -27652,6 +27652,74 @@
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
++ chktls_save_LDFLAGS="$LDFLAGS"
++ case $host in
++ *-*-linux*)
++ LDFLAGS="-shared -Wl,--no-undefined $LDFLAGS"
++ ;;
++ esac
++ chktls_save_CFLAGS="$CFLAGS"
++ CFLAGS="-fPIC $CFLAGS"
++ if test x$gcc_no_link = xyes; then
++ { { echo "$as_me:$LINENO: error: Link tests are not allowed after GCC_NO_EXECUTABLES." >&5
++echo "$as_me: error: Link tests are not allowed after GCC_NO_EXECUTABLES." >&2;}
++ { (exit 1); exit 1; }; }
++fi
++cat >conftest.$ac_ext <<_ACEOF
++int f() { return 0; }
++_ACEOF
++rm -f conftest.$ac_objext conftest$ac_exeext
++if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
++ (eval $ac_link) 2>conftest.er1
++ ac_status=$?
++ grep -v '^ *+' conftest.er1 >conftest.err
++ rm -f conftest.er1
++ cat conftest.err >&5
++ echo "$as_me:$LINENO: \$? = $ac_status" >&5
++ (exit $ac_status); } &&
++ { ac_try='test -z "$ac_c_werror_flag"
++ || test ! -s conftest.err'
++ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
++ (eval $ac_try) 2>&5
++ ac_status=$?
++ echo "$as_me:$LINENO: \$? = $ac_status" >&5
++ (exit $ac_status); }; } &&
++ { ac_try='test -s conftest$ac_exeext'
++ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
++ (eval $ac_try) 2>&5
++ ac_status=$?
++ echo "$as_me:$LINENO: \$? = $ac_status" >&5
++ (exit $ac_status); }; }; then
++ if test x$gcc_no_link = xyes; then
++ { { echo "$as_me:$LINENO: error: Link tests are not allowed after GCC_NO_EXECUTABLES." >&5
++echo "$as_me: error: Link tests are not allowed after GCC_NO_EXECUTABLES." >&2;}
++ { (exit 1); exit 1; }; }
++fi
++cat >conftest.$ac_ext <<_ACEOF
++__thread int a; int b; int f() { return a = b; }
++_ACEOF
++rm -f conftest.$ac_objext conftest$ac_exeext
++if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
++ (eval $ac_link) 2>conftest.er1
++ ac_status=$?
++ grep -v '^ *+' conftest.er1 >conftest.err
++ rm -f conftest.er1
++ cat conftest.err >&5
++ echo "$as_me:$LINENO: \$? = $ac_status" >&5
++ (exit $ac_status); } &&
++ { ac_try='test -z "$ac_c_werror_flag"
++ || test ! -s conftest.err'
++ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
++ (eval $ac_try) 2>&5
++ ac_status=$?
++ echo "$as_me:$LINENO: \$? = $ac_status" >&5
++ (exit $ac_status); }; } &&
++ { ac_try='test -s conftest$ac_exeext'
++ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
++ (eval $ac_try) 2>&5
++ ac_status=$?
++ echo "$as_me:$LINENO: \$? = $ac_status" >&5
++ (exit $ac_status); }; }; then
+ gcc_cv_have_tls=yes
+ else
+ echo "$as_me: failed program was:" >&5
+@@ -27661,6 +27729,24 @@
+ fi
+ rm -f conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
++else
++ echo "$as_me: failed program was:" >&5
++sed 's/^/| /' conftest.$ac_ext >&5
++
++gcc_cv_have_tls=yes
++fi
++rm -f conftest.err conftest.$ac_objext \
++ conftest$ac_exeext conftest.$ac_ext
++ CFLAGS="$chktls_save_CFLAGS"
++ LDFLAGS="$chktls_save_LDFLAGS"
++else
++ echo "$as_me: failed program was:" >&5
++sed 's/^/| /' conftest.$ac_ext >&5
++
++gcc_cv_have_tls=no
++fi
++rm -f conftest.err conftest.$ac_objext \
++ conftest$ac_exeext conftest.$ac_ext
+
+
+ else
+diff -Nur a/libjava/configure.ac b/libjava/configure.ac
+--- a/libjava/configure.ac 2009-04-26 16:24:38.000000000 +0200
++++ b/libjava/configure.ac 2010-01-25 09:50:29.635686641 +0100
+@@ -1490,10 +1490,10 @@
+ multi_os_directory=`$CC -print-multi-os-directory`
+ case $multi_os_directory in
+ .)
+- dbexecdir='$(libdir)/'$gcjsubdir # Avoid /.
++ dbexecdir='$(toolexeclibdir)/'$gcjsubdir # Avoid /.
+ ;;
+ *)
+- dbexecdir='$(libdir)/'$multi_os_directory/$gcjsubdir
++ dbexecdir='$(toolexeclibdir)/'$multi_os_directory/$gcjsubdir
+ ;;
+ esac
+ AC_SUBST(dbexecdir)
+diff -Nur a/libjava/Makefile.am b/libjava/Makefile.am
+--- a/libjava/Makefile.am 2009-05-11 10:21:39.000000000 +0200
++++ b/libjava/Makefile.am 2010-01-25 09:50:29.635686641 +0100
+@@ -55,9 +55,14 @@
+
+ dbexec_LTLIBRARIES = libjvm.la
+
+-pkgconfigdir = $(libdir)/pkgconfig
++# Install the pkgconfig file in a target-specific directory, since the
++# libraries it indicates
+
+-jardir = $(datadir)/java
++pkgconfigdir = $(toolexeclibdir)/pkgconfig
++
++# We install the JAR in a target-specific directory so that toolchains
++# build from different sources can be installed in the same directory.
++jardir = $(prefix)/$(target_noncanonical)/share/java
+ jar_DATA = libgcj-$(gcc_version).jar libgcj-tools-$(gcc_version).jar
+ if INSTALL_ECJ_JAR
+ jar_DATA += $(ECJ_BUILD_JAR)
+diff -Nur a/libjava/Makefile.in b/libjava/Makefile.in
+--- a/libjava/Makefile.in 2009-07-22 09:43:59.000000000 +0200
++++ b/libjava/Makefile.in 2010-01-25 09:50:29.645688750 +0100
+@@ -916,8 +916,14 @@
+ $(am__append_2) $(am__append_3)
+ toolexecmainlib_DATA = libgcj.spec
+ dbexec_LTLIBRARIES = libjvm.la
+-pkgconfigdir = $(libdir)/pkgconfig
+-jardir = $(datadir)/java
++
++# Install the pkgconfig file in a target-specific directory, since the
++# libraries it indicates
++pkgconfigdir = $(toolexeclibdir)/pkgconfig
++
++# We install the JAR in a target-specific directory so that toolchains
++# build from different sources can be installed in the same directory.
++jardir = $(prefix)/$(target_noncanonical)/share/java
+ jar_DATA = libgcj-$(gcc_version).jar libgcj-tools-$(gcc_version).jar \
+ $(am__append_4)
+ @JAVA_HOME_SET_FALSE@JAVA_HOME_DIR = $(prefix)
+diff -Nur a/libmudflap/configure b/libmudflap/configure
+--- a/libmudflap/configure 2009-03-01 18:49:31.000000000 +0100
++++ b/libmudflap/configure 2010-01-25 09:50:29.645688750 +0100
+@@ -12787,6 +12787,64 @@
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
++ chktls_save_LDFLAGS="$LDFLAGS"
++ case $host in
++ *-*-linux*)
++ LDFLAGS="-shared -Wl,--no-undefined $LDFLAGS"
++ ;;
++ esac
++ chktls_save_CFLAGS="$CFLAGS"
++ CFLAGS="-fPIC $CFLAGS"
++ cat >conftest.$ac_ext <<_ACEOF
++int f() { return 0; }
++_ACEOF
++rm -f conftest.$ac_objext conftest$ac_exeext
++if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
++ (eval $ac_link) 2>conftest.er1
++ ac_status=$?
++ grep -v '^ *+' conftest.er1 >conftest.err
++ rm -f conftest.er1
++ cat conftest.err >&5
++ echo "$as_me:$LINENO: \$? = $ac_status" >&5
++ (exit $ac_status); } &&
++ { ac_try='test -z "$ac_c_werror_flag"
++ || test ! -s conftest.err'
++ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
++ (eval $ac_try) 2>&5
++ ac_status=$?
++ echo "$as_me:$LINENO: \$? = $ac_status" >&5
++ (exit $ac_status); }; } &&
++ { ac_try='test -s conftest$ac_exeext'
++ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
++ (eval $ac_try) 2>&5
++ ac_status=$?
++ echo "$as_me:$LINENO: \$? = $ac_status" >&5
++ (exit $ac_status); }; }; then
++ cat >conftest.$ac_ext <<_ACEOF
++__thread int a; int b; int f() { return a = b; }
++_ACEOF
++rm -f conftest.$ac_objext conftest$ac_exeext
++if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
++ (eval $ac_link) 2>conftest.er1
++ ac_status=$?
++ grep -v '^ *+' conftest.er1 >conftest.err
++ rm -f conftest.er1
++ cat conftest.err >&5
++ echo "$as_me:$LINENO: \$? = $ac_status" >&5
++ (exit $ac_status); } &&
++ { ac_try='test -z "$ac_c_werror_flag"
++ || test ! -s conftest.err'
++ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
++ (eval $ac_try) 2>&5
++ ac_status=$?
++ echo "$as_me:$LINENO: \$? = $ac_status" >&5
++ (exit $ac_status); }; } &&
++ { ac_try='test -s conftest$ac_exeext'
++ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
++ (eval $ac_try) 2>&5
++ ac_status=$?
++ echo "$as_me:$LINENO: \$? = $ac_status" >&5
++ (exit $ac_status); }; }; then
+ gcc_cv_have_tls=yes
+ else
+ echo "$as_me: failed program was:" >&5
+@@ -12796,6 +12854,24 @@
+ fi
+ rm -f conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
++else
++ echo "$as_me: failed program was:" >&5
++sed 's/^/| /' conftest.$ac_ext >&5
++
++gcc_cv_have_tls=yes
++fi
++rm -f conftest.err conftest.$ac_objext \
++ conftest$ac_exeext conftest.$ac_ext
++ CFLAGS="$chktls_save_CFLAGS"
++ LDFLAGS="$chktls_save_LDFLAGS"
++else
++ echo "$as_me: failed program was:" >&5
++sed 's/^/| /' conftest.$ac_ext >&5
++
++gcc_cv_have_tls=no
++fi
++rm -f conftest.err conftest.$ac_objext \
++ conftest$ac_exeext conftest.$ac_ext
+
+
+ else
+diff -Nur a/libstdc++-v3/config/cpu/sh/atomicity.h b/libstdc++-v3/config/cpu/sh/atomicity.h
+--- a/libstdc++-v3/config/cpu/sh/atomicity.h 2009-04-10 01:23:07.000000000 +0200
++++ b/libstdc++-v3/config/cpu/sh/atomicity.h 2010-01-25 09:50:29.645688750 +0100
+@@ -25,47 +25,48 @@
+
+ #ifdef __SH4A__
+
+-#ifndef _GLIBCXX_ATOMICITY_H
+-#define _GLIBCXX_ATOMICITY_H 1
++#include <ext/atomicity.h>
+
+-typedef int _Atomic_word;
++_GLIBCXX_BEGIN_NAMESPACE(__gnu_cxx)
+
+-static inline _Atomic_word
+-__attribute__ ((__unused__))
+-__exchange_and_add (volatile _Atomic_word* __mem, int __val)
+-{
+- _Atomic_word __result;
++ typedef int _Atomic_word;
+
+- __asm__ __volatile__
+- ("0:\n"
+- "\tmovli.l\t@%2,r0\n"
+- "\tmov\tr0,%1\n"
+- "\tadd\t%3,r0\n"
+- "\tmovco.l\tr0,@%2\n"
+- "\tbf\t0b"
+- : "+m" (*__mem), "=r" (__result)
+- : "r" (__mem), "rI08" (__val)
+- : "r0");
+-
+- return __result;
+-}
+-
+-
+-static inline void
+-__attribute__ ((__unused__))
+-__atomic_add (volatile _Atomic_word* __mem, int __val)
+-{
+- asm("0:\n"
+- "\tmovli.l\t@%1,r0\n"
+- "\tadd\t%2,r0\n"
+- "\tmovco.l\tr0,@%1\n"
+- "\tbf\t0b"
+- : "+m" (*__mem)
+- : "r" (__mem), "rI08" (__val)
+- : "r0");
+-}
++ _Atomic_word
++ __attribute__ ((__unused__))
++ __exchange_and_add (volatile _Atomic_word* __mem, int __val)
++ {
++ _Atomic_word __result;
+
+-#endif
++ __asm__ __volatile__
++ ("0:\n"
++ "\tmovli.l\t@%2,r0\n"
++ "\tmov\tr0,%1\n"
++ "\tadd\t%3,r0\n"
++ "\tmovco.l\tr0,@%2\n"
++ "\tbf\t0b"
++ : "+m" (*__mem), "=&r" (__result)
++ : "r" (__mem), "rI08" (__val)
++ : "r0");
++
++ return __result;
++ }
++
++
++ void
++ __attribute__ ((__unused__))
++ __atomic_add (volatile _Atomic_word* __mem, int __val)
++ {
++ asm("0:\n"
++ "\tmovli.l\t@%1,r0\n"
++ "\tadd\t%2,r0\n"
++ "\tmovco.l\tr0,@%1\n"
++ "\tbf\t0b"
++ : "+m" (*__mem)
++ : "r" (__mem), "rI08" (__val)
++ : "r0");
++ }
++
++_GLIBCXX_END_NAMESPACE
+
+ #else /* !__SH4A__ */
+
+diff -Nur a/libstdc++-v3/configure b/libstdc++-v3/configure
+--- a/libstdc++-v3/configure 2009-05-07 12:23:06.000000000 +0200
++++ b/libstdc++-v3/configure 2010-01-25 09:50:29.665687451 +0100
+@@ -458,7 +458,7 @@
+ # include <unistd.h>
+ #endif"
+
+-ac_subst_vars='SHELL PATH_SEPARATOR PACKAGE_NAME PACKAGE_TARNAME PACKAGE_VERSION PACKAGE_STRING PACKAGE_BUGREPORT exec_prefix prefix program_transform_name bindir sbindir libexecdir datadir sysconfdir sharedstatedir localstatedir libdir includedir oldincludedir infodir mandir build_alias host_alias target_alias DEFS ECHO_C ECHO_N ECHO_T LIBS libtool_VERSION multi_basedir build build_cpu build_vendor build_os host host_cpu host_vendor host_os target target_cpu target_vendor target_os INSTALL_PROGRAM INSTALL_SCRIPT INSTALL_DATA CYGPATH_W PACKAGE VERSION ACLOCAL AUTOCONF AUTOMAKE AUTOHEADER MAKEINFO install_sh STRIP ac_ct_STRIP INSTALL_STRIP_PROGRAM mkdir_p AWK SET_MAKE am__leading_dot AMTAR am__tar am__untar glibcxx_builddir glibcxx_srcdir toplevel_srcdir CC ac_ct_CC EXEEXT OBJEXT CXX ac_ct_CXX CFLAGS CXXFLAGS LN_S AS ac_ct_AS AR ac_ct_AR RANLIB ac_ct_RANLIB MAINTAINER_MODE_TRUE MAINTAINER_MODE_FALSE MAINT CPP CPPFLAGS EGREP LIBTOOL SED FGREP GREP LD DUMPBIN ac_ct_DUMPBIN NM OBJDUMP ac_ct_OBJDUMP lt_ECHO DSYMUTIL ac_ct_DSYMUTIL NMEDIT ac_ct_NMEDIT LIPO ac_ct_LIPO OTOOL ac_ct_OTOOL OTOOL64 ac_ct_OTOOL64 LDFLAGS CXXCPP enable_shared enable_static GLIBCXX_HOSTED_TRUE GLIBCXX_HOSTED_FALSE GLIBCXX_BUILD_PCH_TRUE GLIBCXX_BUILD_PCH_FALSE glibcxx_PCHFLAGS glibcxx_thread_h WERROR SECTION_FLAGS CSTDIO_H BASIC_FILE_H BASIC_FILE_CC check_msgfmt glibcxx_MOFILES glibcxx_POFILES glibcxx_localedir USE_NLS CLOCALE_H CMESSAGES_H CCODECVT_CC CCOLLATE_CC CCTYPE_CC CMESSAGES_CC CMONEY_CC CNUMERIC_CC CTIME_H CTIME_CC CLOCALE_CC CLOCALE_INTERNAL_H ALLOCATOR_H ALLOCATOR_NAME C_INCLUDE_DIR GLIBCXX_C_HEADERS_C_TRUE GLIBCXX_C_HEADERS_C_FALSE GLIBCXX_C_HEADERS_C_STD_TRUE GLIBCXX_C_HEADERS_C_STD_FALSE GLIBCXX_C_HEADERS_C_GLOBAL_TRUE GLIBCXX_C_HEADERS_C_GLOBAL_FALSE GLIBCXX_C_HEADERS_COMPATIBILITY_TRUE GLIBCXX_C_HEADERS_COMPATIBILITY_FALSE GLIBCXX_C_HEADERS_EXTRA_TRUE GLIBCXX_C_HEADERS_EXTRA_FALSE DEBUG_FLAGS GLIBCXX_BUILD_DEBUG_TRUE GLIBCXX_BUILD_DEBUG_FALSE ENABLE_PARALLEL_TRUE ENABLE_PARALLEL_FALSE EXTRA_CXX_FLAGS GLIBCXX_LIBS SECTION_LDFLAGS OPT_LDFLAGS LIBICONV LTLIBICONV SYMVER_FILE port_specific_symbol_files ENABLE_SYMVERS_TRUE ENABLE_SYMVERS_FALSE ENABLE_SYMVERS_GNU_TRUE ENABLE_SYMVERS_GNU_FALSE ENABLE_SYMVERS_GNU_NAMESPACE_TRUE ENABLE_SYMVERS_GNU_NAMESPACE_FALSE ENABLE_SYMVERS_DARWIN_TRUE ENABLE_SYMVERS_DARWIN_FALSE ENABLE_VISIBILITY_TRUE ENABLE_VISIBILITY_FALSE GLIBCXX_LDBL_COMPAT_TRUE GLIBCXX_LDBL_COMPAT_FALSE baseline_dir ATOMICITY_SRCDIR ATOMIC_WORD_SRCDIR ATOMIC_FLAGS CPU_DEFINES_SRCDIR ABI_TWEAKS_SRCDIR OS_INC_SRCDIR ERROR_CONSTANTS_SRCDIR glibcxx_prefixdir gxx_include_dir glibcxx_toolexecdir glibcxx_toolexeclibdir GLIBCXX_INCLUDES TOPLEVEL_INCLUDES OPTIMIZE_CXXFLAGS WARN_FLAGS LIBSUPCXX_PICFLAGS LIBOBJS LTLIBOBJS'
++ac_subst_vars='SHELL PATH_SEPARATOR PACKAGE_NAME PACKAGE_TARNAME PACKAGE_VERSION PACKAGE_STRING PACKAGE_BUGREPORT exec_prefix prefix program_transform_name bindir sbindir libexecdir datadir sysconfdir sharedstatedir localstatedir libdir includedir oldincludedir infodir mandir build_alias host_alias target_alias DEFS ECHO_C ECHO_N ECHO_T LIBS libtool_VERSION multi_basedir build build_cpu build_vendor build_os host host_cpu host_vendor host_os target target_cpu target_vendor target_os INSTALL_PROGRAM INSTALL_SCRIPT INSTALL_DATA CYGPATH_W PACKAGE VERSION ACLOCAL AUTOCONF AUTOMAKE AUTOHEADER MAKEINFO install_sh STRIP ac_ct_STRIP INSTALL_STRIP_PROGRAM mkdir_p AWK SET_MAKE am__leading_dot AMTAR am__tar am__untar glibcxx_builddir glibcxx_srcdir toplevel_srcdir CC ac_ct_CC EXEEXT OBJEXT CXX ac_ct_CXX CFLAGS CXXFLAGS LN_S AS ac_ct_AS AR ac_ct_AR RANLIB ac_ct_RANLIB MAINTAINER_MODE_TRUE MAINTAINER_MODE_FALSE MAINT CPP CPPFLAGS EGREP LIBTOOL SED FGREP GREP LD DUMPBIN ac_ct_DUMPBIN NM OBJDUMP ac_ct_OBJDUMP lt_ECHO DSYMUTIL ac_ct_DSYMUTIL NMEDIT ac_ct_NMEDIT LIPO ac_ct_LIPO OTOOL ac_ct_OTOOL OTOOL64 ac_ct_OTOOL64 LDFLAGS CXXCPP enable_shared enable_static GLIBCXX_HOSTED_TRUE GLIBCXX_HOSTED_FALSE GLIBCXX_BUILD_PCH_TRUE GLIBCXX_BUILD_PCH_FALSE glibcxx_PCHFLAGS glibcxx_thread_h WERROR SECTION_FLAGS CSTDIO_H BASIC_FILE_H BASIC_FILE_CC check_msgfmt glibcxx_MOFILES glibcxx_POFILES glibcxx_localedir USE_NLS CLOCALE_H CMESSAGES_H CCODECVT_CC CCOLLATE_CC CCTYPE_CC CMESSAGES_CC CMONEY_CC CNUMERIC_CC CTIME_H CTIME_CC CLOCALE_CC CLOCALE_INTERNAL_H ALLOCATOR_H ALLOCATOR_NAME C_INCLUDE_DIR GLIBCXX_C_HEADERS_C_TRUE GLIBCXX_C_HEADERS_C_FALSE GLIBCXX_C_HEADERS_C_STD_TRUE GLIBCXX_C_HEADERS_C_STD_FALSE GLIBCXX_C_HEADERS_C_GLOBAL_TRUE GLIBCXX_C_HEADERS_C_GLOBAL_FALSE GLIBCXX_C_HEADERS_COMPATIBILITY_TRUE GLIBCXX_C_HEADERS_COMPATIBILITY_FALSE GLIBCXX_C_HEADERS_EXTRA_TRUE GLIBCXX_C_HEADERS_EXTRA_FALSE DEBUG_FLAGS GLIBCXX_BUILD_DEBUG_TRUE GLIBCXX_BUILD_DEBUG_FALSE ENABLE_PARALLEL_TRUE ENABLE_PARALLEL_FALSE EXTRA_CXX_FLAGS GLIBCXX_LIBS SECTION_LDFLAGS OPT_LDFLAGS LIBICONV LTLIBICONV SYMVER_FILE port_specific_symbol_files ENABLE_SYMVERS_TRUE ENABLE_SYMVERS_FALSE ENABLE_SYMVERS_GNU_TRUE ENABLE_SYMVERS_GNU_FALSE ENABLE_SYMVERS_GNU_NAMESPACE_TRUE ENABLE_SYMVERS_GNU_NAMESPACE_FALSE ENABLE_SYMVERS_DARWIN_TRUE ENABLE_SYMVERS_DARWIN_FALSE ENABLE_VISIBILITY_TRUE ENABLE_VISIBILITY_FALSE GLIBCXX_LDBL_COMPAT_TRUE GLIBCXX_LDBL_COMPAT_FALSE baseline_dir ATOMICITY_SRCDIR ATOMIC_WORD_SRCDIR ATOMIC_FLAGS CPU_DEFINES_SRCDIR ABI_TWEAKS_SRCDIR OS_INC_SRCDIR ERROR_CONSTANTS_SRCDIR LIBSUPCXX_PRONLY_TRUE LIBSUPCXX_PRONLY_FALSE glibcxx_prefixdir gxx_include_dir glibcxx_toolexecdir glibcxx_toolexeclibdir GLIBCXX_INCLUDES TOPLEVEL_INCLUDES OPTIMIZE_CXXFLAGS WARN_FLAGS LIBSUPCXX_PICFLAGS LIBOBJS LTLIBOBJS'
+ ac_subst_files=''
+ ac_pwd=`pwd`
+
+@@ -40730,6 +40730,74 @@
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
++ chktls_save_LDFLAGS="$LDFLAGS"
++ case $host in
++ *-*-linux*)
++ LDFLAGS="-shared -Wl,--no-undefined $LDFLAGS"
++ ;;
++ esac
++ chktls_save_CFLAGS="$CFLAGS"
++ CFLAGS="-fPIC $CFLAGS"
++ if test x$gcc_no_link = xyes; then
++ { { echo "$as_me:$LINENO: error: Link tests are not allowed after GCC_NO_EXECUTABLES." >&5
++echo "$as_me: error: Link tests are not allowed after GCC_NO_EXECUTABLES." >&2;}
++ { (exit 1); exit 1; }; }
++fi
++cat >conftest.$ac_ext <<_ACEOF
++int f() { return 0; }
++_ACEOF
++rm -f conftest.$ac_objext conftest$ac_exeext
++if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
++ (eval $ac_link) 2>conftest.er1
++ ac_status=$?
++ grep -v '^ *+' conftest.er1 >conftest.err
++ rm -f conftest.er1
++ cat conftest.err >&5
++ echo "$as_me:$LINENO: \$? = $ac_status" >&5
++ (exit $ac_status); } &&
++ { ac_try='test -z "$ac_c_werror_flag"
++ || test ! -s conftest.err'
++ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
++ (eval $ac_try) 2>&5
++ ac_status=$?
++ echo "$as_me:$LINENO: \$? = $ac_status" >&5
++ (exit $ac_status); }; } &&
++ { ac_try='test -s conftest$ac_exeext'
++ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
++ (eval $ac_try) 2>&5
++ ac_status=$?
++ echo "$as_me:$LINENO: \$? = $ac_status" >&5
++ (exit $ac_status); }; }; then
++ if test x$gcc_no_link = xyes; then
++ { { echo "$as_me:$LINENO: error: Link tests are not allowed after GCC_NO_EXECUTABLES." >&5
++echo "$as_me: error: Link tests are not allowed after GCC_NO_EXECUTABLES." >&2;}
++ { (exit 1); exit 1; }; }
++fi
++cat >conftest.$ac_ext <<_ACEOF
++__thread int a; int b; int f() { return a = b; }
++_ACEOF
++rm -f conftest.$ac_objext conftest$ac_exeext
++if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
++ (eval $ac_link) 2>conftest.er1
++ ac_status=$?
++ grep -v '^ *+' conftest.er1 >conftest.err
++ rm -f conftest.er1
++ cat conftest.err >&5
++ echo "$as_me:$LINENO: \$? = $ac_status" >&5
++ (exit $ac_status); } &&
++ { ac_try='test -z "$ac_c_werror_flag"
++ || test ! -s conftest.err'
++ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
++ (eval $ac_try) 2>&5
++ ac_status=$?
++ echo "$as_me:$LINENO: \$? = $ac_status" >&5
++ (exit $ac_status); }; } &&
++ { ac_try='test -s conftest$ac_exeext'
++ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
++ (eval $ac_try) 2>&5
++ ac_status=$?
++ echo "$as_me:$LINENO: \$? = $ac_status" >&5
++ (exit $ac_status); }; }; then
+ gcc_cv_have_tls=yes
+ else
+ echo "$as_me: failed program was:" >&5
+@@ -40739,6 +40807,24 @@
+ fi
+ rm -f conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
++else
++ echo "$as_me: failed program was:" >&5
++sed 's/^/| /' conftest.$ac_ext >&5
++
++gcc_cv_have_tls=yes
++fi
++rm -f conftest.err conftest.$ac_objext \
++ conftest$ac_exeext conftest.$ac_ext
++ CFLAGS="$chktls_save_CFLAGS"
++ LDFLAGS="$chktls_save_LDFLAGS"
++else
++ echo "$as_me: failed program was:" >&5
++sed 's/^/| /' conftest.$ac_ext >&5
++
++gcc_cv_have_tls=no
++fi
++rm -f conftest.err conftest.$ac_objext \
++ conftest$ac_exeext conftest.$ac_ext
+
+
+ else
+@@ -76926,6 +77012,74 @@
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
++ chktls_save_LDFLAGS="$LDFLAGS"
++ case $host in
++ *-*-linux*)
++ LDFLAGS="-shared -Wl,--no-undefined $LDFLAGS"
++ ;;
++ esac
++ chktls_save_CFLAGS="$CFLAGS"
++ CFLAGS="-fPIC $CFLAGS"
++ if test x$gcc_no_link = xyes; then
++ { { echo "$as_me:$LINENO: error: Link tests are not allowed after GCC_NO_EXECUTABLES." >&5
++echo "$as_me: error: Link tests are not allowed after GCC_NO_EXECUTABLES." >&2;}
++ { (exit 1); exit 1; }; }
++fi
++cat >conftest.$ac_ext <<_ACEOF
++int f() { return 0; }
++_ACEOF
++rm -f conftest.$ac_objext conftest$ac_exeext
++if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
++ (eval $ac_link) 2>conftest.er1
++ ac_status=$?
++ grep -v '^ *+' conftest.er1 >conftest.err
++ rm -f conftest.er1
++ cat conftest.err >&5
++ echo "$as_me:$LINENO: \$? = $ac_status" >&5
++ (exit $ac_status); } &&
++ { ac_try='test -z "$ac_c_werror_flag"
++ || test ! -s conftest.err'
++ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
++ (eval $ac_try) 2>&5
++ ac_status=$?
++ echo "$as_me:$LINENO: \$? = $ac_status" >&5
++ (exit $ac_status); }; } &&
++ { ac_try='test -s conftest$ac_exeext'
++ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
++ (eval $ac_try) 2>&5
++ ac_status=$?
++ echo "$as_me:$LINENO: \$? = $ac_status" >&5
++ (exit $ac_status); }; }; then
++ if test x$gcc_no_link = xyes; then
++ { { echo "$as_me:$LINENO: error: Link tests are not allowed after GCC_NO_EXECUTABLES." >&5
++echo "$as_me: error: Link tests are not allowed after GCC_NO_EXECUTABLES." >&2;}
++ { (exit 1); exit 1; }; }
++fi
++cat >conftest.$ac_ext <<_ACEOF
++__thread int a; int b; int f() { return a = b; }
++_ACEOF
++rm -f conftest.$ac_objext conftest$ac_exeext
++if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
++ (eval $ac_link) 2>conftest.er1
++ ac_status=$?
++ grep -v '^ *+' conftest.er1 >conftest.err
++ rm -f conftest.er1
++ cat conftest.err >&5
++ echo "$as_me:$LINENO: \$? = $ac_status" >&5
++ (exit $ac_status); } &&
++ { ac_try='test -z "$ac_c_werror_flag"
++ || test ! -s conftest.err'
++ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
++ (eval $ac_try) 2>&5
++ ac_status=$?
++ echo "$as_me:$LINENO: \$? = $ac_status" >&5
++ (exit $ac_status); }; } &&
++ { ac_try='test -s conftest$ac_exeext'
++ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
++ (eval $ac_try) 2>&5
++ ac_status=$?
++ echo "$as_me:$LINENO: \$? = $ac_status" >&5
++ (exit $ac_status); }; }; then
+ gcc_cv_have_tls=yes
+ else
+ echo "$as_me: failed program was:" >&5
+@@ -76935,6 +77089,24 @@
+ fi
+ rm -f conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
++else
++ echo "$as_me: failed program was:" >&5
++sed 's/^/| /' conftest.$ac_ext >&5
++
++gcc_cv_have_tls=yes
++fi
++rm -f conftest.err conftest.$ac_objext \
++ conftest$ac_exeext conftest.$ac_ext
++ CFLAGS="$chktls_save_CFLAGS"
++ LDFLAGS="$chktls_save_LDFLAGS"
++else
++ echo "$as_me: failed program was:" >&5
++sed 's/^/| /' conftest.$ac_ext >&5
++
++gcc_cv_have_tls=no
++fi
++rm -f conftest.err conftest.$ac_objext \
++ conftest$ac_exeext conftest.$ac_ext
+
+
+ else
+@@ -94541,6 +94713,74 @@
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
++ chktls_save_LDFLAGS="$LDFLAGS"
++ case $host in
++ *-*-linux*)
++ LDFLAGS="-shared -Wl,--no-undefined $LDFLAGS"
++ ;;
++ esac
++ chktls_save_CFLAGS="$CFLAGS"
++ CFLAGS="-fPIC $CFLAGS"
++ if test x$gcc_no_link = xyes; then
++ { { echo "$as_me:$LINENO: error: Link tests are not allowed after GCC_NO_EXECUTABLES." >&5
++echo "$as_me: error: Link tests are not allowed after GCC_NO_EXECUTABLES." >&2;}
++ { (exit 1); exit 1; }; }
++fi
++cat >conftest.$ac_ext <<_ACEOF
++int f() { return 0; }
++_ACEOF
++rm -f conftest.$ac_objext conftest$ac_exeext
++if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
++ (eval $ac_link) 2>conftest.er1
++ ac_status=$?
++ grep -v '^ *+' conftest.er1 >conftest.err
++ rm -f conftest.er1
++ cat conftest.err >&5
++ echo "$as_me:$LINENO: \$? = $ac_status" >&5
++ (exit $ac_status); } &&
++ { ac_try='test -z "$ac_c_werror_flag"
++ || test ! -s conftest.err'
++ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
++ (eval $ac_try) 2>&5
++ ac_status=$?
++ echo "$as_me:$LINENO: \$? = $ac_status" >&5
++ (exit $ac_status); }; } &&
++ { ac_try='test -s conftest$ac_exeext'
++ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
++ (eval $ac_try) 2>&5
++ ac_status=$?
++ echo "$as_me:$LINENO: \$? = $ac_status" >&5
++ (exit $ac_status); }; }; then
++ if test x$gcc_no_link = xyes; then
++ { { echo "$as_me:$LINENO: error: Link tests are not allowed after GCC_NO_EXECUTABLES." >&5
++echo "$as_me: error: Link tests are not allowed after GCC_NO_EXECUTABLES." >&2;}
++ { (exit 1); exit 1; }; }
++fi
++cat >conftest.$ac_ext <<_ACEOF
++__thread int a; int b; int f() { return a = b; }
++_ACEOF
++rm -f conftest.$ac_objext conftest$ac_exeext
++if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
++ (eval $ac_link) 2>conftest.er1
++ ac_status=$?
++ grep -v '^ *+' conftest.er1 >conftest.err
++ rm -f conftest.er1
++ cat conftest.err >&5
++ echo "$as_me:$LINENO: \$? = $ac_status" >&5
++ (exit $ac_status); } &&
++ { ac_try='test -z "$ac_c_werror_flag"
++ || test ! -s conftest.err'
++ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
++ (eval $ac_try) 2>&5
++ ac_status=$?
++ echo "$as_me:$LINENO: \$? = $ac_status" >&5
++ (exit $ac_status); }; } &&
++ { ac_try='test -s conftest$ac_exeext'
++ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
++ (eval $ac_try) 2>&5
++ ac_status=$?
++ echo "$as_me:$LINENO: \$? = $ac_status" >&5
++ (exit $ac_status); }; }; then
+ gcc_cv_have_tls=yes
+ else
+ echo "$as_me: failed program was:" >&5
+@@ -94550,6 +94790,24 @@
+ fi
+ rm -f conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
++else
++ echo "$as_me: failed program was:" >&5
++sed 's/^/| /' conftest.$ac_ext >&5
++
++gcc_cv_have_tls=yes
++fi
++rm -f conftest.err conftest.$ac_objext \
++ conftest$ac_exeext conftest.$ac_ext
++ CFLAGS="$chktls_save_CFLAGS"
++ LDFLAGS="$chktls_save_LDFLAGS"
++else
++ echo "$as_me: failed program was:" >&5
++sed 's/^/| /' conftest.$ac_ext >&5
++
++gcc_cv_have_tls=no
++fi
++rm -f conftest.err conftest.$ac_objext \
++ conftest$ac_exeext conftest.$ac_ext
+
+
+ else
+@@ -114470,7 +114728,8 @@
+ cat confdefs.h >>conftest.$ac_ext
+ cat >>conftest.$ac_ext <<_ACEOF
+ /* end confdefs.h. */
+-$ac_includes_default
++/* no standard headers */
++
+ int
+ main ()
+ {
+@@ -114534,7 +114793,8 @@
+ cat confdefs.h >>conftest.$ac_ext
+ cat >>conftest.$ac_ext <<_ACEOF
+ /* end confdefs.h. */
+-$ac_includes_default
++/* no standard headers */
++
+ int
+ main ()
+ {
+@@ -114575,7 +114835,8 @@
+ cat confdefs.h >>conftest.$ac_ext
+ cat >>conftest.$ac_ext <<_ACEOF
+ /* end confdefs.h. */
+-$ac_includes_default
++/* no standard headers */
++
+ int
+ main ()
+ {
+@@ -114632,7 +114893,8 @@
+ cat confdefs.h >>conftest.$ac_ext
+ cat >>conftest.$ac_ext <<_ACEOF
+ /* end confdefs.h. */
+-$ac_includes_default
++/* no standard headers */
++
+ int
+ main ()
+ {
+@@ -114673,7 +114935,8 @@
+ cat confdefs.h >>conftest.$ac_ext
+ cat >>conftest.$ac_ext <<_ACEOF
+ /* end confdefs.h. */
+-$ac_includes_default
++/* no standard headers */
++
+ int
+ main ()
+ {
+@@ -114738,7 +115001,8 @@
+ cat confdefs.h >>conftest.$ac_ext
+ cat >>conftest.$ac_ext <<_ACEOF
+ /* end confdefs.h. */
+-$ac_includes_default
++/* no standard headers */
++
+ int
+ main ()
+ {
+@@ -114806,7 +115070,8 @@
+ cat confdefs.h >>conftest.$ac_ext
+ cat >>conftest.$ac_ext <<_ACEOF
+ /* end confdefs.h. */
+-$ac_includes_default
++/* no standard headers */
++
+ long longval () { return (long) (sizeof (void *)); }
+ unsigned long ulongval () { return (long) (sizeof (void *)); }
+ #include <stdio.h>
+@@ -114894,7 +115159,8 @@
+ cat confdefs.h >>conftest.$ac_ext
+ cat >>conftest.$ac_ext <<_ACEOF
+ /* end confdefs.h. */
+-$ac_includes_default
++/* no standard headers */
++
+ int
+ main ()
+ {
+@@ -114958,7 +115224,8 @@
+ cat confdefs.h >>conftest.$ac_ext
+ cat >>conftest.$ac_ext <<_ACEOF
+ /* end confdefs.h. */
+-$ac_includes_default
++/* no standard headers */
++
+ int
+ main ()
+ {
+@@ -114999,7 +115266,8 @@
+ cat confdefs.h >>conftest.$ac_ext
+ cat >>conftest.$ac_ext <<_ACEOF
+ /* end confdefs.h. */
+-$ac_includes_default
++/* no standard headers */
++
+ int
+ main ()
+ {
+@@ -115056,7 +115324,8 @@
+ cat confdefs.h >>conftest.$ac_ext
+ cat >>conftest.$ac_ext <<_ACEOF
+ /* end confdefs.h. */
+-$ac_includes_default
++/* no standard headers */
++
+ int
+ main ()
+ {
+@@ -115097,7 +115366,8 @@
+ cat confdefs.h >>conftest.$ac_ext
+ cat >>conftest.$ac_ext <<_ACEOF
+ /* end confdefs.h. */
+-$ac_includes_default
++/* no standard headers */
++
+ int
+ main ()
+ {
+@@ -115162,7 +115432,8 @@
+ cat confdefs.h >>conftest.$ac_ext
+ cat >>conftest.$ac_ext <<_ACEOF
+ /* end confdefs.h. */
+-$ac_includes_default
++/* no standard headers */
++
+ int
+ main ()
+ {
+@@ -115230,7 +115501,8 @@
+ cat confdefs.h >>conftest.$ac_ext
+ cat >>conftest.$ac_ext <<_ACEOF
+ /* end confdefs.h. */
+-$ac_includes_default
++/* no standard headers */
++
+ long longval () { return (long) (sizeof (long)); }
+ unsigned long ulongval () { return (long) (sizeof (long)); }
+ #include <stdio.h>
+@@ -115318,7 +115590,8 @@
+ cat confdefs.h >>conftest.$ac_ext
+ cat >>conftest.$ac_ext <<_ACEOF
+ /* end confdefs.h. */
+-$ac_includes_default
++/* no standard headers */
++
+ int
+ main ()
+ {
+@@ -115382,7 +115655,8 @@
+ cat confdefs.h >>conftest.$ac_ext
+ cat >>conftest.$ac_ext <<_ACEOF
+ /* end confdefs.h. */
+-$ac_includes_default
++/* no standard headers */
++
+ int
+ main ()
+ {
+@@ -115423,7 +115697,8 @@
+ cat confdefs.h >>conftest.$ac_ext
+ cat >>conftest.$ac_ext <<_ACEOF
+ /* end confdefs.h. */
+-$ac_includes_default
++/* no standard headers */
++
+ int
+ main ()
+ {
+@@ -115480,7 +115755,8 @@
+ cat confdefs.h >>conftest.$ac_ext
+ cat >>conftest.$ac_ext <<_ACEOF
+ /* end confdefs.h. */
+-$ac_includes_default
++/* no standard headers */
++
+ int
+ main ()
+ {
+@@ -115521,7 +115797,8 @@
+ cat confdefs.h >>conftest.$ac_ext
+ cat >>conftest.$ac_ext <<_ACEOF
+ /* end confdefs.h. */
+-$ac_includes_default
++/* no standard headers */
++
+ int
+ main ()
+ {
+@@ -115586,7 +115863,8 @@
+ cat confdefs.h >>conftest.$ac_ext
+ cat >>conftest.$ac_ext <<_ACEOF
+ /* end confdefs.h. */
+-$ac_includes_default
++/* no standard headers */
++
+ int
+ main ()
+ {
+@@ -115654,7 +115932,8 @@
+ cat confdefs.h >>conftest.$ac_ext
+ cat >>conftest.$ac_ext <<_ACEOF
+ /* end confdefs.h. */
+-$ac_includes_default
++/* no standard headers */
++
+ long longval () { return (long) (sizeof (int)); }
+ unsigned long ulongval () { return (long) (sizeof (int)); }
+ #include <stdio.h>
+@@ -115738,7 +116017,8 @@
+ cat confdefs.h >>conftest.$ac_ext
+ cat >>conftest.$ac_ext <<_ACEOF
+ /* end confdefs.h. */
+-$ac_includes_default
++/* no standard headers */
++
+ int
+ main ()
+ {
+@@ -115802,7 +116082,8 @@
+ cat confdefs.h >>conftest.$ac_ext
+ cat >>conftest.$ac_ext <<_ACEOF
+ /* end confdefs.h. */
+-$ac_includes_default
++/* no standard headers */
++
+ int
+ main ()
+ {
+@@ -115843,7 +116124,8 @@
+ cat confdefs.h >>conftest.$ac_ext
+ cat >>conftest.$ac_ext <<_ACEOF
+ /* end confdefs.h. */
+-$ac_includes_default
++/* no standard headers */
++
+ int
+ main ()
+ {
+@@ -115900,7 +116182,8 @@
+ cat confdefs.h >>conftest.$ac_ext
+ cat >>conftest.$ac_ext <<_ACEOF
+ /* end confdefs.h. */
+-$ac_includes_default
++/* no standard headers */
++
+ int
+ main ()
+ {
+@@ -115941,7 +116224,8 @@
+ cat confdefs.h >>conftest.$ac_ext
+ cat >>conftest.$ac_ext <<_ACEOF
+ /* end confdefs.h. */
+-$ac_includes_default
++/* no standard headers */
++
+ int
+ main ()
+ {
+@@ -116006,7 +116290,8 @@
+ cat confdefs.h >>conftest.$ac_ext
+ cat >>conftest.$ac_ext <<_ACEOF
+ /* end confdefs.h. */
+-$ac_includes_default
++/* no standard headers */
++
+ int
+ main ()
+ {
+@@ -116074,7 +116359,8 @@
+ cat confdefs.h >>conftest.$ac_ext
+ cat >>conftest.$ac_ext <<_ACEOF
+ /* end confdefs.h. */
+-$ac_includes_default
++/* no standard headers */
++
+ long longval () { return (long) (sizeof (short)); }
+ unsigned long ulongval () { return (long) (sizeof (short)); }
+ #include <stdio.h>
+@@ -116158,7 +116444,8 @@
+ cat confdefs.h >>conftest.$ac_ext
+ cat >>conftest.$ac_ext <<_ACEOF
+ /* end confdefs.h. */
+-$ac_includes_default
++/* no standard headers */
++
+ int
+ main ()
+ {
+@@ -116222,7 +116509,8 @@
+ cat confdefs.h >>conftest.$ac_ext
+ cat >>conftest.$ac_ext <<_ACEOF
+ /* end confdefs.h. */
+-$ac_includes_default
++/* no standard headers */
++
+ int
+ main ()
+ {
+@@ -116263,7 +116551,8 @@
+ cat confdefs.h >>conftest.$ac_ext
+ cat >>conftest.$ac_ext <<_ACEOF
+ /* end confdefs.h. */
+-$ac_includes_default
++/* no standard headers */
++
+ int
+ main ()
+ {
+@@ -116320,7 +116609,8 @@
+ cat confdefs.h >>conftest.$ac_ext
+ cat >>conftest.$ac_ext <<_ACEOF
+ /* end confdefs.h. */
+-$ac_includes_default
++/* no standard headers */
++
+ int
+ main ()
+ {
+@@ -116361,7 +116651,8 @@
+ cat confdefs.h >>conftest.$ac_ext
+ cat >>conftest.$ac_ext <<_ACEOF
+ /* end confdefs.h. */
+-$ac_includes_default
++/* no standard headers */
++
+ int
+ main ()
+ {
+@@ -116426,7 +116717,8 @@
+ cat confdefs.h >>conftest.$ac_ext
+ cat >>conftest.$ac_ext <<_ACEOF
+ /* end confdefs.h. */
+-$ac_includes_default
++/* no standard headers */
++
+ int
+ main ()
+ {
+@@ -116494,7 +116786,8 @@
+ cat confdefs.h >>conftest.$ac_ext
+ cat >>conftest.$ac_ext <<_ACEOF
+ /* end confdefs.h. */
+-$ac_includes_default
++/* no standard headers */
++
+ long longval () { return (long) (sizeof (char)); }
+ unsigned long ulongval () { return (long) (sizeof (char)); }
+ #include <stdio.h>
+@@ -118004,6 +118297,24 @@
+
+
+
++# For SymbianOS, we use a highly cut-down libsupc++. This lets us
++# conditionalise libsupc++'s Makefile.am to include only the necessary sources.
++case "$target" in
++ *arm*-symbianelf)
++ LIBSUPCXX_PRONLY=yes;;
++ *);;
++esac
++
++
++if test x$LIBSUPCXX_PRONLY = xyes; then
++ LIBSUPCXX_PRONLY_TRUE=
++ LIBSUPCXX_PRONLY_FALSE='#'
++else
++ LIBSUPCXX_PRONLY_TRUE='#'
++ LIBSUPCXX_PRONLY_FALSE=
++fi
++
++
+ # Determine cross-compile flags and AM_CONDITIONALs.
+ #AC_SUBST(GLIBCXX_IS_NATIVE)
+ #AM_CONDITIONAL(CANADIAN, test $CANADIAN = yes)
+@@ -118582,6 +118893,13 @@
+ Usually this means the macro was only invoked conditionally." >&2;}
+ { (exit 1); exit 1; }; }
+ fi
++if test -z "${LIBSUPCXX_PRONLY_TRUE}" && test -z "${LIBSUPCXX_PRONLY_FALSE}"; then
++ { { echo "$as_me:$LINENO: error: conditional \"LIBSUPCXX_PRONLY\" was never defined.
++Usually this means the macro was only invoked conditionally." >&5
++echo "$as_me: error: conditional \"LIBSUPCXX_PRONLY\" was never defined.
++Usually this means the macro was only invoked conditionally." >&2;}
++ { (exit 1); exit 1; }; }
++fi
+
+ : ${CONFIG_STATUS=./config.status}
+ ac_clean_files_save=$ac_clean_files
+@@ -119667,6 +119985,8 @@
+ s,@ABI_TWEAKS_SRCDIR@,$ABI_TWEAKS_SRCDIR,;t t
+ s,@OS_INC_SRCDIR@,$OS_INC_SRCDIR,;t t
+ s,@ERROR_CONSTANTS_SRCDIR@,$ERROR_CONSTANTS_SRCDIR,;t t
++s,@LIBSUPCXX_PRONLY_TRUE@,$LIBSUPCXX_PRONLY_TRUE,;t t
++s,@LIBSUPCXX_PRONLY_FALSE@,$LIBSUPCXX_PRONLY_FALSE,;t t
+ s,@glibcxx_prefixdir@,$glibcxx_prefixdir,;t t
+ s,@gxx_include_dir@,$gxx_include_dir,;t t
+ s,@glibcxx_toolexecdir@,$glibcxx_toolexecdir,;t t
+diff -Nur a/libstdc++-v3/configure.ac b/libstdc++-v3/configure.ac
+--- a/libstdc++-v3/configure.ac 2009-05-07 12:23:06.000000000 +0200
++++ b/libstdc++-v3/configure.ac 2010-01-25 09:50:29.675687743 +0100
+@@ -329,6 +329,15 @@
+ AC_SUBST(ERROR_CONSTANTS_SRCDIR)
+
+
++# For SymbianOS, we use a highly cut-down libsupc++. This lets us
++# conditionalise libsupc++'s Makefile.am to include only the necessary sources.
++case "$target" in
++ *arm*-symbianelf)
++ LIBSUPCXX_PRONLY=yes;;
++ *);;
++esac
++AM_CONDITIONAL(LIBSUPCXX_PRONLY, test x$LIBSUPCXX_PRONLY = xyes)
++
+ # Determine cross-compile flags and AM_CONDITIONALs.
+ #AC_SUBST(GLIBCXX_IS_NATIVE)
+ #AM_CONDITIONAL(CANADIAN, test $CANADIAN = yes)
+diff -Nur a/libstdc++-v3/doc/Makefile.in b/libstdc++-v3/doc/Makefile.in
+--- a/libstdc++-v3/doc/Makefile.in 2009-01-15 21:02:11.000000000 +0100
++++ b/libstdc++-v3/doc/Makefile.in 2010-01-25 09:50:29.675687743 +0100
+@@ -161,6 +161,8 @@
+ LIBOBJS = @LIBOBJS@
+ LIBS = @LIBS@
+ LIBSUPCXX_PICFLAGS = @LIBSUPCXX_PICFLAGS@
++LIBSUPCXX_PRONLY_FALSE = @LIBSUPCXX_PRONLY_FALSE@
++LIBSUPCXX_PRONLY_TRUE = @LIBSUPCXX_PRONLY_TRUE@
+ LIBTOOL = @LIBTOOL@
+ LIPO = @LIPO@
+ LN_S = @LN_S@
+diff -Nur a/libstdc++-v3/include/c_global/cwchar b/libstdc++-v3/include/c_global/cwchar
+--- a/libstdc++-v3/include/c_global/cwchar 2009-04-10 01:23:07.000000000 +0200
++++ b/libstdc++-v3/include/c_global/cwchar 2010-01-25 09:50:29.675687743 +0100
+@@ -156,14 +156,18 @@
+ using ::mbsrtowcs;
+ using ::putwc;
+ using ::putwchar;
++#ifndef _GLIBCXX_HAVE_BROKEN_VSWPRINTF
+ using ::swprintf;
++#endif
+ using ::swscanf;
+ using ::ungetwc;
+ using ::vfwprintf;
+ #if _GLIBCXX_HAVE_VFWSCANF
+ using ::vfwscanf;
+ #endif
++#ifndef _GLIBCXX_HAVE_BROKEN_VSWPRINTF
+ using ::vswprintf;
++#endif
+ #if _GLIBCXX_HAVE_VSWSCANF
+ using ::vswscanf;
+ #endif
+diff -Nur a/libstdc++-v3/include/Makefile.am b/libstdc++-v3/include/Makefile.am
+--- a/libstdc++-v3/include/Makefile.am 2009-05-13 02:24:16.000000000 +0200
++++ b/libstdc++-v3/include/Makefile.am 2010-01-25 09:50:29.675687743 +0100
+@@ -1125,8 +1125,14 @@
+ if GLIBCXX_HOSTED
+ install-data-local: install-headers
+ else
++if LIBSUPCXX_PRONLY
++# Don't install any headers if we're only putting eh_personality in
++# libsupc++ (e.g. on SymbianOS)
++install-data-local:
++else
+ install-data-local: install-freestanding-headers
+ endif
++endif
+
+ # This is a subset of the full install-headers rule. We only need <cstddef>,
+ # <limits>, <cstdlib>, <cstdarg>, <new>, <typeinfo>, <exception>, and any
+diff -Nur a/libstdc++-v3/include/Makefile.in b/libstdc++-v3/include/Makefile.in
+--- a/libstdc++-v3/include/Makefile.in 2009-05-13 02:24:16.000000000 +0200
++++ b/libstdc++-v3/include/Makefile.in 2010-01-25 09:50:29.675687743 +0100
+@@ -161,6 +161,8 @@
+ LIBOBJS = @LIBOBJS@
+ LIBS = @LIBS@
+ LIBSUPCXX_PICFLAGS = @LIBSUPCXX_PICFLAGS@
++LIBSUPCXX_PRONLY_FALSE = @LIBSUPCXX_PRONLY_FALSE@
++LIBSUPCXX_PRONLY_TRUE = @LIBSUPCXX_PRONLY_TRUE@
+ LIBTOOL = @LIBTOOL@
+ LIPO = @LIPO@
+ LN_S = @LN_S@
+@@ -1527,7 +1529,10 @@
+ # the rest are taken from the original source tree.
+
+ @GLIBCXX_HOSTED_TRUE@install-data-local: install-headers
+-@GLIBCXX_HOSTED_FALSE@install-data-local: install-freestanding-headers
++# Don't install any headers if we're only putting eh_personality in
++# libsupc++ (e.g. on SymbianOS)
++@GLIBCXX_HOSTED_FALSE@@LIBSUPCXX_PRONLY_TRUE@install-data-local:
++@GLIBCXX_HOSTED_FALSE@@LIBSUPCXX_PRONLY_FALSE@install-data-local: install-freestanding-headers
+
+ # This is a subset of the full install-headers rule. We only need <cstddef>,
+ # <limits>, <cstdlib>, <cstdarg>, <new>, <typeinfo>, <exception>, and any
+diff -Nur a/libstdc++-v3/libsupc++/eh_arm.cc b/libstdc++-v3/libsupc++/eh_arm.cc
+--- a/libstdc++-v3/libsupc++/eh_arm.cc 2009-04-10 01:23:07.000000000 +0200
++++ b/libstdc++-v3/libsupc++/eh_arm.cc 2010-01-25 09:50:29.675687743 +0100
+@@ -38,7 +38,7 @@
+ extern "C" __cxa_type_match_result
+ __cxa_type_match(_Unwind_Exception* ue_header,
+ const std::type_info* catch_type,
+- bool is_reference __attribute__((__unused__)),
++ bool is_reference,
+ void** thrown_ptr_p)
+ {
+ bool forced_unwind = __is_gxx_forced_unwind_class(ue_header->exception_class);
+@@ -68,11 +68,11 @@
+ if (throw_type->__is_pointer_p())
+ thrown_ptr = *(void**) thrown_ptr;
+
+- if (catch_type->__do_catch(throw_type, &thrown_ptr, 1))
++ if (catch_type->__do_catch (throw_type, &thrown_ptr, 1 + is_reference * 2))
+ {
+ *thrown_ptr_p = thrown_ptr;
+
+- if (typeid(*catch_type) == typeid (typeid(void*)))
++ if (typeid (*catch_type) == typeid (typeid(void*)))
+ {
+ const __pointer_type_info *catch_pointer_type =
+ static_cast<const __pointer_type_info *> (catch_type);
+diff -Nur a/libstdc++-v3/libsupc++/eh_personality.cc b/libstdc++-v3/libsupc++/eh_personality.cc
+--- a/libstdc++-v3/libsupc++/eh_personality.cc 2009-04-10 01:23:07.000000000 +0200
++++ b/libstdc++-v3/libsupc++/eh_personality.cc 2010-01-25 09:50:29.675687743 +0100
+@@ -89,20 +89,22 @@
+ // Return an element from a type table.
+
+ static const std::type_info*
+-get_ttype_entry(lsda_header_info* info, _uleb128_t i)
++get_ttype_entry(lsda_header_info* info, _uleb128_t i, bool &is_ref)
+ {
+ _Unwind_Ptr ptr;
+
+ ptr = (_Unwind_Ptr) (info->TType - (i * 4));
+ ptr = _Unwind_decode_target2(ptr);
+
+- return reinterpret_cast<const std::type_info *>(ptr);
++ is_ref = ptr & 1;
++
++ return reinterpret_cast<const std::type_info *>(ptr & ~1);
+ }
+
+ // The ABI provides a routine for matching exception object types.
+ typedef _Unwind_Control_Block _throw_typet;
+-#define get_adjusted_ptr(catch_type, throw_type, thrown_ptr_p) \
+- (__cxa_type_match (throw_type, catch_type, false, thrown_ptr_p) \
++#define get_adjusted_ptr(catch_type, throw_type, is_ref, thrown_ptr_p) \
++ (__cxa_type_match (throw_type, catch_type, is_ref, thrown_ptr_p) \
+ != ctm_failed)
+
+ // Return true if THROW_TYPE matches one if the filter types.
+@@ -118,6 +120,7 @@
+ {
+ const std::type_info* catch_type;
+ _uleb128_t tmp;
++ bool is_ref;
+
+ tmp = *e;
+
+@@ -129,13 +132,14 @@
+ tmp = _Unwind_decode_target2((_Unwind_Word) e);
+
+ // Match a ttype entry.
+- catch_type = reinterpret_cast<const std::type_info*>(tmp);
++ is_ref = tmp & 1;
++ catch_type = reinterpret_cast<const std::type_info*>(tmp & ~1);
+
+ // ??? There is currently no way to ask the RTTI code about the
+ // relationship between two types without reference to a specific
+ // object. There should be; then we wouldn't need to mess with
+ // thrown_ptr here.
+- if (get_adjusted_ptr(catch_type, throw_type, &thrown_ptr))
++ if (get_adjusted_ptr(catch_type, throw_type, is_ref, &thrown_ptr))
+ return true;
+
+ // Advance to the next entry.
+@@ -207,7 +211,7 @@
+ // Return an element from a type table.
+
+ static const std::type_info *
+-get_ttype_entry (lsda_header_info *info, _uleb128_t i)
++get_ttype_entry (lsda_header_info *info, _uleb128_t i, bool &is_ref)
+ {
+ _Unwind_Ptr ptr;
+
+@@ -215,7 +219,9 @@
+ read_encoded_value_with_base (info->ttype_encoding, info->ttype_base,
+ info->TType - i, &ptr);
+
+- return reinterpret_cast<const std::type_info *>(ptr);
++ is_ref = ptr & 1;
++
++ return reinterpret_cast<const std::type_info *>(ptr & ~1);
+ }
+
+ // Given the thrown type THROW_TYPE, pointer to a variable containing a
+@@ -226,6 +232,7 @@
+ static bool
+ get_adjusted_ptr (const std::type_info *catch_type,
+ const std::type_info *throw_type,
++ bool is_ref,
+ void **thrown_ptr_p)
+ {
+ void *thrown_ptr = *thrown_ptr_p;
+@@ -237,7 +244,7 @@
+ if (throw_type->__is_pointer_p ())
+ thrown_ptr = *(void **) thrown_ptr;
+
+- if (catch_type->__do_catch (throw_type, &thrown_ptr, 1))
++ if (catch_type->__do_catch (throw_type, &thrown_ptr, 1 + is_ref * 2))
+ {
+ *thrown_ptr_p = thrown_ptr;
+ return true;
+@@ -267,13 +274,15 @@
+ return false;
+
+ // Match a ttype entry.
+- catch_type = get_ttype_entry (info, tmp);
++ bool is_ref;
++
++ catch_type = get_ttype_entry (info, tmp, is_ref);
+
+ // ??? There is currently no way to ask the RTTI code about the
+ // relationship between two types without reference to a specific
+ // object. There should be; then we wouldn't need to mess with
+ // thrown_ptr here.
+- if (get_adjusted_ptr (catch_type, throw_type, &thrown_ptr))
++ if (get_adjusted_ptr (catch_type, throw_type, is_ref, &thrown_ptr))
+ return true;
+ }
+ }
+@@ -582,14 +591,16 @@
+ else if (ar_filter > 0)
+ {
+ // Positive filter values are handlers.
+- catch_type = get_ttype_entry (&info, ar_filter);
++ bool is_ref;
++
++ catch_type = get_ttype_entry (&info, ar_filter, is_ref);
+
+ // Null catch type is a catch-all handler; we can catch foreign
+ // exceptions with this. Otherwise we must match types.
+ if (! catch_type
+ || (throw_type
+ && get_adjusted_ptr (catch_type, throw_type,
+- &thrown_ptr)))
++ is_ref, &thrown_ptr)))
+ {
+ saw_handler = true;
+ break;
+diff -Nur a/libstdc++-v3/libsupc++/Makefile.am b/libstdc++-v3/libsupc++/Makefile.am
+--- a/libstdc++-v3/libsupc++/Makefile.am 2009-04-10 01:23:07.000000000 +0200
++++ b/libstdc++-v3/libsupc++/Makefile.am 2010-01-25 09:50:29.675687743 +0100
+@@ -30,6 +30,11 @@
+ # 2) integrated libsupc++convenience.la that is to be a part of libstdc++.a
+ noinst_LTLIBRARIES = libsupc++convenience.la
+
++if LIBSUPCXX_PRONLY
++sources = \
++ eh_personality.cc
++
++else
+
+ headers = \
+ exception new typeinfo cxxabi.h cxxabi-forced.h exception_defines.h \
+@@ -84,6 +89,7 @@
+ vec.cc \
+ vmi_class_type_info.cc \
+ vterminate.cc
++endif
+
+ libsupc___la_SOURCES = $(sources) $(c_sources)
+ libsupc__convenience_la_SOURCES = $(sources) $(c_sources)
+diff -Nur a/libstdc++-v3/libsupc++/Makefile.in b/libstdc++-v3/libsupc++/Makefile.in
+--- a/libstdc++-v3/libsupc++/Makefile.in 2009-01-15 21:02:11.000000000 +0100
++++ b/libstdc++-v3/libsupc++/Makefile.in 2010-01-25 09:50:29.675687743 +0100
+@@ -38,7 +38,7 @@
+ build_triplet = @build@
+ host_triplet = @host@
+ target_triplet = @target@
+-DIST_COMMON = $(glibcxxinstall_HEADERS) $(srcdir)/Makefile.am \
++DIST_COMMON = $(am__glibcxxinstall_HEADERS_DIST) $(srcdir)/Makefile.am \
+ $(srcdir)/Makefile.in $(top_srcdir)/fragment.am
+ subdir = libsupc++
+ ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+@@ -87,19 +87,29 @@
+ pmem_type_info.cc pointer_type_info.cc pure.cc \
+ si_class_type_info.cc tinfo.cc tinfo2.cc vec.cc \
+ vmi_class_type_info.cc vterminate.cc cp-demangle.c
+-am__objects_1 = array_type_info.lo atexit_arm.lo bad_cast.lo \
+- bad_typeid.lo class_type_info.lo del_op.lo del_opnt.lo \
+- del_opv.lo del_opvnt.lo dyncast.lo eh_alloc.lo eh_arm.lo \
+- eh_aux_runtime.lo eh_call.lo eh_catch.lo eh_exception.lo \
+- eh_globals.lo eh_personality.lo eh_ptr.lo eh_term_handler.lo \
+- eh_terminate.lo eh_throw.lo eh_type.lo eh_unex_handler.lo \
+- enum_type_info.lo function_type_info.lo \
+- fundamental_type_info.lo guard.lo new_handler.lo new_op.lo \
+- new_opnt.lo new_opv.lo new_opvnt.lo pbase_type_info.lo \
+- pmem_type_info.lo pointer_type_info.lo pure.lo \
+- si_class_type_info.lo tinfo.lo tinfo2.lo vec.lo \
+- vmi_class_type_info.lo vterminate.lo
+-@GLIBCXX_HOSTED_TRUE@am__objects_2 = cp-demangle.lo
++@LIBSUPCXX_PRONLY_FALSE@am__objects_1 = array_type_info.lo \
++@LIBSUPCXX_PRONLY_FALSE@ atexit_arm.lo bad_cast.lo \
++@LIBSUPCXX_PRONLY_FALSE@ bad_typeid.lo class_type_info.lo \
++@LIBSUPCXX_PRONLY_FALSE@ del_op.lo del_opnt.lo del_opv.lo \
++@LIBSUPCXX_PRONLY_FALSE@ del_opvnt.lo dyncast.lo eh_alloc.lo \
++@LIBSUPCXX_PRONLY_FALSE@ eh_arm.lo eh_aux_runtime.lo eh_call.lo \
++@LIBSUPCXX_PRONLY_FALSE@ eh_catch.lo eh_exception.lo \
++@LIBSUPCXX_PRONLY_FALSE@ eh_globals.lo eh_personality.lo \
++@LIBSUPCXX_PRONLY_FALSE@ eh_ptr.lo eh_term_handler.lo \
++@LIBSUPCXX_PRONLY_FALSE@ eh_terminate.lo eh_throw.lo eh_type.lo \
++@LIBSUPCXX_PRONLY_FALSE@ eh_unex_handler.lo enum_type_info.lo \
++@LIBSUPCXX_PRONLY_FALSE@ function_type_info.lo \
++@LIBSUPCXX_PRONLY_FALSE@ fundamental_type_info.lo guard.lo \
++@LIBSUPCXX_PRONLY_FALSE@ new_handler.lo new_op.lo new_opnt.lo \
++@LIBSUPCXX_PRONLY_FALSE@ new_opv.lo new_opvnt.lo \
++@LIBSUPCXX_PRONLY_FALSE@ pbase_type_info.lo pmem_type_info.lo \
++@LIBSUPCXX_PRONLY_FALSE@ pointer_type_info.lo pure.lo \
++@LIBSUPCXX_PRONLY_FALSE@ si_class_type_info.lo tinfo.lo \
++@LIBSUPCXX_PRONLY_FALSE@ tinfo2.lo vec.lo \
++@LIBSUPCXX_PRONLY_FALSE@ vmi_class_type_info.lo vterminate.lo
++@LIBSUPCXX_PRONLY_TRUE@am__objects_1 = eh_personality.lo
++@GLIBCXX_HOSTED_TRUE@@LIBSUPCXX_PRONLY_FALSE@am__objects_2 = \
++@GLIBCXX_HOSTED_TRUE@@LIBSUPCXX_PRONLY_FALSE@ cp-demangle.lo
+ am_libsupc___la_OBJECTS = $(am__objects_1) $(am__objects_2)
+ libsupc___la_OBJECTS = $(am_libsupc___la_OBJECTS)
+ libsupc__convenience_la_LIBADD =
+@@ -132,6 +142,9 @@
+ SOURCES = $(libsupc___la_SOURCES) $(libsupc__convenience_la_SOURCES)
+ DIST_SOURCES = $(am__libsupc___la_SOURCES_DIST) \
+ $(am__libsupc__convenience_la_SOURCES_DIST)
++am__glibcxxinstall_HEADERS_DIST = exception new typeinfo cxxabi.h \
++ cxxabi-forced.h exception_defines.h initializer_list \
++ exception_ptr.h
+ glibcxxinstallHEADERS_INSTALL = $(INSTALL_HEADER)
+ HEADERS = $(glibcxxinstall_HEADERS)
+ ETAGS = etags
+@@ -231,6 +244,8 @@
+ LIBOBJS = @LIBOBJS@
+ LIBS = @LIBS@
+ LIBSUPCXX_PICFLAGS = @LIBSUPCXX_PICFLAGS@
++LIBSUPCXX_PRONLY_FALSE = @LIBSUPCXX_PRONLY_FALSE@
++LIBSUPCXX_PRONLY_TRUE = @LIBSUPCXX_PRONLY_TRUE@
+ LIBTOOL = @LIBTOOL@
+ LIPO = @LIPO@
+ LN_S = @LN_S@
+@@ -365,57 +380,60 @@
+ toolexeclib_LTLIBRARIES = libsupc++.la
+ # 2) integrated libsupc++convenience.la that is to be a part of libstdc++.a
+ noinst_LTLIBRARIES = libsupc++convenience.la
+-headers = \
+- exception new typeinfo cxxabi.h cxxabi-forced.h exception_defines.h \
+- initializer_list exception_ptr.h
+-
+-@GLIBCXX_HOSTED_TRUE@c_sources = \
+-@GLIBCXX_HOSTED_TRUE@ cp-demangle.c
+-
+-sources = \
+- array_type_info.cc \
+- atexit_arm.cc \
+- bad_cast.cc \
+- bad_typeid.cc \
+- class_type_info.cc \
+- del_op.cc \
+- del_opnt.cc \
+- del_opv.cc \
+- del_opvnt.cc \
+- dyncast.cc \
+- eh_alloc.cc \
+- eh_arm.cc \
+- eh_aux_runtime.cc \
+- eh_call.cc \
+- eh_catch.cc \
+- eh_exception.cc \
+- eh_globals.cc \
+- eh_personality.cc \
+- eh_ptr.cc \
+- eh_term_handler.cc \
+- eh_terminate.cc \
+- eh_throw.cc \
+- eh_type.cc \
+- eh_unex_handler.cc \
+- enum_type_info.cc \
+- function_type_info.cc \
+- fundamental_type_info.cc \
+- guard.cc \
+- new_handler.cc \
+- new_op.cc \
+- new_opnt.cc \
+- new_opv.cc \
+- new_opvnt.cc \
+- pbase_type_info.cc \
+- pmem_type_info.cc \
+- pointer_type_info.cc \
+- pure.cc \
+- si_class_type_info.cc \
+- tinfo.cc \
+- tinfo2.cc \
+- vec.cc \
+- vmi_class_type_info.cc \
+- vterminate.cc
++@LIBSUPCXX_PRONLY_FALSE@sources = \
++@LIBSUPCXX_PRONLY_FALSE@ array_type_info.cc \
++@LIBSUPCXX_PRONLY_FALSE@ atexit_arm.cc \
++@LIBSUPCXX_PRONLY_FALSE@ bad_cast.cc \
++@LIBSUPCXX_PRONLY_FALSE@ bad_typeid.cc \
++@LIBSUPCXX_PRONLY_FALSE@ class_type_info.cc \
++@LIBSUPCXX_PRONLY_FALSE@ del_op.cc \
++@LIBSUPCXX_PRONLY_FALSE@ del_opnt.cc \
++@LIBSUPCXX_PRONLY_FALSE@ del_opv.cc \
++@LIBSUPCXX_PRONLY_FALSE@ del_opvnt.cc \
++@LIBSUPCXX_PRONLY_FALSE@ dyncast.cc \
++@LIBSUPCXX_PRONLY_FALSE@ eh_alloc.cc \
++@LIBSUPCXX_PRONLY_FALSE@ eh_arm.cc \
++@LIBSUPCXX_PRONLY_FALSE@ eh_aux_runtime.cc \
++@LIBSUPCXX_PRONLY_FALSE@ eh_call.cc \
++@LIBSUPCXX_PRONLY_FALSE@ eh_catch.cc \
++@LIBSUPCXX_PRONLY_FALSE@ eh_exception.cc \
++@LIBSUPCXX_PRONLY_FALSE@ eh_globals.cc \
++@LIBSUPCXX_PRONLY_FALSE@ eh_personality.cc \
++@LIBSUPCXX_PRONLY_FALSE@ eh_ptr.cc \
++@LIBSUPCXX_PRONLY_FALSE@ eh_term_handler.cc \
++@LIBSUPCXX_PRONLY_FALSE@ eh_terminate.cc \
++@LIBSUPCXX_PRONLY_FALSE@ eh_throw.cc \
++@LIBSUPCXX_PRONLY_FALSE@ eh_type.cc \
++@LIBSUPCXX_PRONLY_FALSE@ eh_unex_handler.cc \
++@LIBSUPCXX_PRONLY_FALSE@ enum_type_info.cc \
++@LIBSUPCXX_PRONLY_FALSE@ function_type_info.cc \
++@LIBSUPCXX_PRONLY_FALSE@ fundamental_type_info.cc \
++@LIBSUPCXX_PRONLY_FALSE@ guard.cc \
++@LIBSUPCXX_PRONLY_FALSE@ new_handler.cc \
++@LIBSUPCXX_PRONLY_FALSE@ new_op.cc \
++@LIBSUPCXX_PRONLY_FALSE@ new_opnt.cc \
++@LIBSUPCXX_PRONLY_FALSE@ new_opv.cc \
++@LIBSUPCXX_PRONLY_FALSE@ new_opvnt.cc \
++@LIBSUPCXX_PRONLY_FALSE@ pbase_type_info.cc \
++@LIBSUPCXX_PRONLY_FALSE@ pmem_type_info.cc \
++@LIBSUPCXX_PRONLY_FALSE@ pointer_type_info.cc \
++@LIBSUPCXX_PRONLY_FALSE@ pure.cc \
++@LIBSUPCXX_PRONLY_FALSE@ si_class_type_info.cc \
++@LIBSUPCXX_PRONLY_FALSE@ tinfo.cc \
++@LIBSUPCXX_PRONLY_FALSE@ tinfo2.cc \
++@LIBSUPCXX_PRONLY_FALSE@ vec.cc \
++@LIBSUPCXX_PRONLY_FALSE@ vmi_class_type_info.cc \
++@LIBSUPCXX_PRONLY_FALSE@ vterminate.cc
++
++@LIBSUPCXX_PRONLY_TRUE@sources = \
++@LIBSUPCXX_PRONLY_TRUE@ eh_personality.cc
++
++@LIBSUPCXX_PRONLY_FALSE@headers = \
++@LIBSUPCXX_PRONLY_FALSE@ exception new typeinfo cxxabi.h cxxabi-forced.h exception_defines.h \
++@LIBSUPCXX_PRONLY_FALSE@ initializer_list exception_ptr.h
++
++@GLIBCXX_HOSTED_TRUE@@LIBSUPCXX_PRONLY_FALSE@c_sources = \
++@GLIBCXX_HOSTED_TRUE@@LIBSUPCXX_PRONLY_FALSE@ cp-demangle.c
+
+ libsupc___la_SOURCES = $(sources) $(c_sources)
+ libsupc__convenience_la_SOURCES = $(sources) $(c_sources)
+diff -Nur a/libstdc++-v3/Makefile.in b/libstdc++-v3/Makefile.in
+--- a/libstdc++-v3/Makefile.in 2009-01-15 21:02:11.000000000 +0100
++++ b/libstdc++-v3/Makefile.in 2010-01-25 09:50:29.675687743 +0100
+@@ -193,6 +193,8 @@
+ LIBOBJS = @LIBOBJS@
+ LIBS = @LIBS@
+ LIBSUPCXX_PICFLAGS = @LIBSUPCXX_PICFLAGS@
++LIBSUPCXX_PRONLY_FALSE = @LIBSUPCXX_PRONLY_FALSE@
++LIBSUPCXX_PRONLY_TRUE = @LIBSUPCXX_PRONLY_TRUE@
+ LIBTOOL = @LIBTOOL@
+ LIPO = @LIPO@
+ LN_S = @LN_S@
+diff -Nur a/libstdc++-v3/po/Makefile.in b/libstdc++-v3/po/Makefile.in
+--- a/libstdc++-v3/po/Makefile.in 2009-01-15 21:02:11.000000000 +0100
++++ b/libstdc++-v3/po/Makefile.in 2010-01-25 09:50:29.675687743 +0100
+@@ -161,6 +161,8 @@
+ LIBOBJS = @LIBOBJS@
+ LIBS = @LIBS@
+ LIBSUPCXX_PICFLAGS = @LIBSUPCXX_PICFLAGS@
++LIBSUPCXX_PRONLY_FALSE = @LIBSUPCXX_PRONLY_FALSE@
++LIBSUPCXX_PRONLY_TRUE = @LIBSUPCXX_PRONLY_TRUE@
+ LIBTOOL = @LIBTOOL@
+ LIPO = @LIPO@
+ LN_S = @LN_S@
+diff -Nur a/libstdc++-v3/src/Makefile.in b/libstdc++-v3/src/Makefile.in
+--- a/libstdc++-v3/src/Makefile.in 2009-01-17 03:03:25.000000000 +0100
++++ b/libstdc++-v3/src/Makefile.in 2010-01-25 09:50:29.675687743 +0100
+@@ -221,6 +221,8 @@
+ LIBOBJS = @LIBOBJS@
+ LIBS = @LIBS@
+ LIBSUPCXX_PICFLAGS = @LIBSUPCXX_PICFLAGS@
++LIBSUPCXX_PRONLY_FALSE = @LIBSUPCXX_PRONLY_FALSE@
++LIBSUPCXX_PRONLY_TRUE = @LIBSUPCXX_PRONLY_TRUE@
+ LIBTOOL = @LIBTOOL@
+ LIPO = @LIPO@
+ LN_S = @LN_S@
+diff -Nur a/libstdc++-v3/testsuite/21_strings/basic_string/numeric_conversions/wchar_t/stod.cc b/libstdc++-v3/testsuite/21_strings/basic_string/numeric_conversions/wchar_t/stod.cc
+--- a/libstdc++-v3/testsuite/21_strings/basic_string/numeric_conversions/wchar_t/stod.cc 2009-04-10 01:23:07.000000000 +0200
++++ b/libstdc++-v3/testsuite/21_strings/basic_string/numeric_conversions/wchar_t/stod.cc 2010-01-25 09:50:29.675687743 +0100
+@@ -1,4 +1,5 @@
+ // { dg-options "-std=gnu++0x" }
++// { dg-require-string-conversions "" }
+ // 2008-06-15 Paolo Carlini <paolo.carlini@oracle.com>
+
+ // Copyright (C) 2008, 2009 Free Software Foundation, Inc.
+diff -Nur a/libstdc++-v3/testsuite/21_strings/basic_string/numeric_conversions/wchar_t/stof.cc b/libstdc++-v3/testsuite/21_strings/basic_string/numeric_conversions/wchar_t/stof.cc
+--- a/libstdc++-v3/testsuite/21_strings/basic_string/numeric_conversions/wchar_t/stof.cc 2009-04-10 01:23:07.000000000 +0200
++++ b/libstdc++-v3/testsuite/21_strings/basic_string/numeric_conversions/wchar_t/stof.cc 2010-01-25 09:50:29.675687743 +0100
+@@ -1,4 +1,5 @@
+ // { dg-options "-std=gnu++0x" }
++// { dg-require-string-conversions "" }
+ // 2008-06-15 Paolo Carlini <paolo.carlini@oracle.com>
+
+ // Copyright (C) 2008, 2009 Free Software Foundation, Inc.
+diff -Nur a/libstdc++-v3/testsuite/21_strings/basic_string/numeric_conversions/wchar_t/stoi.cc b/libstdc++-v3/testsuite/21_strings/basic_string/numeric_conversions/wchar_t/stoi.cc
+--- a/libstdc++-v3/testsuite/21_strings/basic_string/numeric_conversions/wchar_t/stoi.cc 2009-04-10 01:23:07.000000000 +0200
++++ b/libstdc++-v3/testsuite/21_strings/basic_string/numeric_conversions/wchar_t/stoi.cc 2010-01-25 09:50:29.675687743 +0100
+@@ -1,4 +1,5 @@
+ // { dg-options "-std=gnu++0x" }
++// { dg-require-string-conversions "" }
+ // 2008-06-15 Paolo Carlini <paolo.carlini@oracle.com>
+
+ // Copyright (C) 2008, 2009 Free Software Foundation, Inc.
+diff -Nur a/libstdc++-v3/testsuite/21_strings/basic_string/numeric_conversions/wchar_t/stol.cc b/libstdc++-v3/testsuite/21_strings/basic_string/numeric_conversions/wchar_t/stol.cc
+--- a/libstdc++-v3/testsuite/21_strings/basic_string/numeric_conversions/wchar_t/stol.cc 2009-04-10 01:23:07.000000000 +0200
++++ b/libstdc++-v3/testsuite/21_strings/basic_string/numeric_conversions/wchar_t/stol.cc 2010-01-25 09:50:29.675687743 +0100
+@@ -1,4 +1,5 @@
+ // { dg-options "-std=gnu++0x" }
++// { dg-require-string-conversions "" }
+ // 2008-06-15 Paolo Carlini <paolo.carlini@oracle.com>
+
+ // Copyright (C) 2008, 2009 Free Software Foundation, Inc.
+diff -Nur a/libstdc++-v3/testsuite/21_strings/basic_string/numeric_conversions/wchar_t/stold.cc b/libstdc++-v3/testsuite/21_strings/basic_string/numeric_conversions/wchar_t/stold.cc
+--- a/libstdc++-v3/testsuite/21_strings/basic_string/numeric_conversions/wchar_t/stold.cc 2009-04-10 01:23:07.000000000 +0200
++++ b/libstdc++-v3/testsuite/21_strings/basic_string/numeric_conversions/wchar_t/stold.cc 2010-01-25 09:50:29.675687743 +0100
+@@ -1,4 +1,5 @@
+ // { dg-options "-std=gnu++0x" }
++// { dg-require-string-conversions "" }
+ // 2008-06-15 Paolo Carlini <paolo.carlini@oracle.com>
+
+ // Copyright (C) 2008, 2009 Free Software Foundation, Inc.
+diff -Nur a/libstdc++-v3/testsuite/21_strings/basic_string/numeric_conversions/wchar_t/stoll.cc b/libstdc++-v3/testsuite/21_strings/basic_string/numeric_conversions/wchar_t/stoll.cc
+--- a/libstdc++-v3/testsuite/21_strings/basic_string/numeric_conversions/wchar_t/stoll.cc 2009-04-10 01:23:07.000000000 +0200
++++ b/libstdc++-v3/testsuite/21_strings/basic_string/numeric_conversions/wchar_t/stoll.cc 2010-01-25 09:50:29.675687743 +0100
+@@ -1,4 +1,5 @@
+ // { dg-options "-std=gnu++0x" }
++// { dg-require-string-conversions "" }
+ // 2008-06-15 Paolo Carlini <paolo.carlini@oracle.com>
+
+ // Copyright (C) 2008, 2009 Free Software Foundation, Inc.
+diff -Nur a/libstdc++-v3/testsuite/21_strings/basic_string/numeric_conversions/wchar_t/stoul.cc b/libstdc++-v3/testsuite/21_strings/basic_string/numeric_conversions/wchar_t/stoul.cc
+--- a/libstdc++-v3/testsuite/21_strings/basic_string/numeric_conversions/wchar_t/stoul.cc 2009-04-10 01:23:07.000000000 +0200
++++ b/libstdc++-v3/testsuite/21_strings/basic_string/numeric_conversions/wchar_t/stoul.cc 2010-01-25 09:50:29.675687743 +0100
+@@ -1,4 +1,5 @@
+ // { dg-options "-std=gnu++0x" }
++// { dg-require-string-conversions "" }
+ // 2008-06-15 Paolo Carlini <paolo.carlini@oracle.com>
+
+ // Copyright (C) 2008, 2009 Free Software Foundation, Inc.
+diff -Nur a/libstdc++-v3/testsuite/21_strings/basic_string/numeric_conversions/wchar_t/stoull.cc b/libstdc++-v3/testsuite/21_strings/basic_string/numeric_conversions/wchar_t/stoull.cc
+--- a/libstdc++-v3/testsuite/21_strings/basic_string/numeric_conversions/wchar_t/stoull.cc 2009-04-10 01:23:07.000000000 +0200
++++ b/libstdc++-v3/testsuite/21_strings/basic_string/numeric_conversions/wchar_t/stoull.cc 2010-01-25 09:50:29.675687743 +0100
+@@ -1,4 +1,5 @@
+ // { dg-options "-std=gnu++0x" }
++// { dg-require-string-conversions "" }
+ // 2008-06-15 Paolo Carlini <paolo.carlini@oracle.com>
+
+ // Copyright (C) 2008, 2009 Free Software Foundation, Inc.
+diff -Nur a/libstdc++-v3/testsuite/21_strings/basic_string/numeric_conversions/wchar_t/to_wstring.cc b/libstdc++-v3/testsuite/21_strings/basic_string/numeric_conversions/wchar_t/to_wstring.cc
+--- a/libstdc++-v3/testsuite/21_strings/basic_string/numeric_conversions/wchar_t/to_wstring.cc 2009-04-10 01:23:07.000000000 +0200
++++ b/libstdc++-v3/testsuite/21_strings/basic_string/numeric_conversions/wchar_t/to_wstring.cc 2010-01-25 09:50:29.675687743 +0100
+@@ -1,4 +1,5 @@
+ // { dg-options "-std=gnu++0x" }
++// { dg-require-string-conversions "" }
+ // 2008-06-15 Paolo Carlini <paolo.carlini@oracle.com>
+
+ // Copyright (C) 2008, 2009 Free Software Foundation, Inc.
+diff -Nur a/libstdc++-v3/testsuite/21_strings/headers/cwchar/functions_std.cc b/libstdc++-v3/testsuite/21_strings/headers/cwchar/functions_std.cc
+--- a/libstdc++-v3/testsuite/21_strings/headers/cwchar/functions_std.cc 2009-04-10 01:23:07.000000000 +0200
++++ b/libstdc++-v3/testsuite/21_strings/headers/cwchar/functions_std.cc 2010-01-25 09:50:29.675687743 +0100
+@@ -1,5 +1,6 @@
+ // { dg-do compile }
+ // { dg-require-c-std "" }
++// { dg-require-swprintf "" }
+
+ // Copyright (C) 2007, 2009 Free Software Foundation, Inc.
+ //
+diff -Nur a/libstdc++-v3/testsuite/27_io/basic_filebuf/seekoff/char/1-io.cc b/libstdc++-v3/testsuite/27_io/basic_filebuf/seekoff/char/1-io.cc
+--- a/libstdc++-v3/testsuite/27_io/basic_filebuf/seekoff/char/1-io.cc 2009-04-10 01:23:07.000000000 +0200
++++ b/libstdc++-v3/testsuite/27_io/basic_filebuf/seekoff/char/1-io.cc 2010-01-25 09:50:29.675687743 +0100
+@@ -20,6 +20,7 @@
+ // 27.8.1.4 Overridden virtual functions
+
+ // { dg-require-fileio "" }
++// { dg-require-binary-io "" }
+
+ #include <fstream>
+ #include <testsuite_hooks.h>
+diff -Nur a/libstdc++-v3/testsuite/27_io/basic_filebuf/seekoff/char/2-io.cc b/libstdc++-v3/testsuite/27_io/basic_filebuf/seekoff/char/2-io.cc
+--- a/libstdc++-v3/testsuite/27_io/basic_filebuf/seekoff/char/2-io.cc 2009-04-10 01:23:07.000000000 +0200
++++ b/libstdc++-v3/testsuite/27_io/basic_filebuf/seekoff/char/2-io.cc 2010-01-25 09:50:29.675687743 +0100
+@@ -20,6 +20,7 @@
+ // 27.8.1.4 Overridden virtual functions
+
+ // { dg-require-fileio "" }
++// { dg-require-binary-io "" }
+
+ #include <fstream>
+ #include <testsuite_hooks.h>
+diff -Nur a/libstdc++-v3/testsuite/27_io/basic_filebuf/sgetn/char/1-in.cc b/libstdc++-v3/testsuite/27_io/basic_filebuf/sgetn/char/1-in.cc
+--- a/libstdc++-v3/testsuite/27_io/basic_filebuf/sgetn/char/1-in.cc 2009-04-10 01:23:07.000000000 +0200
++++ b/libstdc++-v3/testsuite/27_io/basic_filebuf/sgetn/char/1-in.cc 2010-01-25 09:50:29.675687743 +0100
+@@ -24,6 +24,7 @@
+ // 27.8.1.4 Overridden virtual functions
+
+ // { dg-require-fileio "" }
++// { dg-require-binary-io "" }
+
+ #include <fstream>
+ #include <testsuite_hooks.h>
+diff -Nur a/libstdc++-v3/testsuite/27_io/basic_filebuf/sgetn/char/1-io.cc b/libstdc++-v3/testsuite/27_io/basic_filebuf/sgetn/char/1-io.cc
+--- a/libstdc++-v3/testsuite/27_io/basic_filebuf/sgetn/char/1-io.cc 2009-04-10 01:23:07.000000000 +0200
++++ b/libstdc++-v3/testsuite/27_io/basic_filebuf/sgetn/char/1-io.cc 2010-01-25 09:50:29.675687743 +0100
+@@ -24,6 +24,7 @@
+ // 27.8.1.4 Overridden virtual functions
+
+ // { dg-require-fileio "" }
++// { dg-require-binary-io "" }
+
+ #include <fstream>
+ #include <testsuite_hooks.h>
+diff -Nur a/libstdc++-v3/testsuite/27_io/basic_filebuf/sgetn/char/2-in.cc b/libstdc++-v3/testsuite/27_io/basic_filebuf/sgetn/char/2-in.cc
+--- a/libstdc++-v3/testsuite/27_io/basic_filebuf/sgetn/char/2-in.cc 2009-04-10 01:23:07.000000000 +0200
++++ b/libstdc++-v3/testsuite/27_io/basic_filebuf/sgetn/char/2-in.cc 2010-01-25 09:50:29.675687743 +0100
+@@ -24,6 +24,7 @@
+ // 27.8.1.4 Overridden virtual functions
+
+ // { dg-require-fileio "" }
++// { dg-require-binary-io "" }
+
+ #include <fstream>
+ #include <testsuite_hooks.h>
+diff -Nur a/libstdc++-v3/testsuite/27_io/basic_filebuf/sgetn/char/2-io.cc b/libstdc++-v3/testsuite/27_io/basic_filebuf/sgetn/char/2-io.cc
+--- a/libstdc++-v3/testsuite/27_io/basic_filebuf/sgetn/char/2-io.cc 2009-04-10 01:23:07.000000000 +0200
++++ b/libstdc++-v3/testsuite/27_io/basic_filebuf/sgetn/char/2-io.cc 2010-01-25 09:50:29.675687743 +0100
+@@ -24,6 +24,7 @@
+ // 27.8.1.4 Overridden virtual functions
+
+ // { dg-require-fileio "" }
++// { dg-require-binary-io "" }
+
+ #include <fstream>
+ #include <testsuite_hooks.h>
+diff -Nur a/libstdc++-v3/testsuite/27_io/basic_filebuf/underflow/wchar_t/11603.cc b/libstdc++-v3/testsuite/27_io/basic_filebuf/underflow/wchar_t/11603.cc
+--- a/libstdc++-v3/testsuite/27_io/basic_filebuf/underflow/wchar_t/11603.cc 2009-04-10 01:23:07.000000000 +0200
++++ b/libstdc++-v3/testsuite/27_io/basic_filebuf/underflow/wchar_t/11603.cc 2010-01-25 09:50:29.675687743 +0100
+@@ -17,6 +17,8 @@
+
+ // 27.8.1.4 Overridden virtual functions
+
++// { dg-require-binary-io "" }
++
+ #include <fstream>
+ #include <locale>
+ #include <testsuite_hooks.h>
+diff -Nur a/libstdc++-v3/testsuite/27_io/basic_istream/readsome/char/6746-2.cc b/libstdc++-v3/testsuite/27_io/basic_istream/readsome/char/6746-2.cc
+--- a/libstdc++-v3/testsuite/27_io/basic_istream/readsome/char/6746-2.cc 2009-04-10 01:23:07.000000000 +0200
++++ b/libstdc++-v3/testsuite/27_io/basic_istream/readsome/char/6746-2.cc 2010-01-25 09:50:29.675687743 +0100
+@@ -26,6 +26,7 @@
+ // @diff@ %-*.tst %-*.txt
+
+ // { dg-require-fileio "" }
++// { dg-require-binary-io "" }
+
+ #include <istream>
+ #include <fstream>
+diff -Nur a/libstdc++-v3/testsuite/27_io/basic_istream/readsome/wchar_t/6746-2.cc b/libstdc++-v3/testsuite/27_io/basic_istream/readsome/wchar_t/6746-2.cc
+--- a/libstdc++-v3/testsuite/27_io/basic_istream/readsome/wchar_t/6746-2.cc 2009-04-10 01:23:07.000000000 +0200
++++ b/libstdc++-v3/testsuite/27_io/basic_istream/readsome/wchar_t/6746-2.cc 2010-01-25 09:50:29.675687743 +0100
+@@ -19,6 +19,8 @@
+ // causes "in_avail" to return an incorrect value.
+ // { dg-do run { xfail arm*-*-elf arm*-*-eabi } }
+
++// { dg-require-binary-io "" }
++
+ // 27.6.1.3 unformatted input functions
+ // @require@ %-*.tst %-*.txt
+ // @diff@ %-*.tst %-*.txt
+diff -Nur a/libstdc++-v3/testsuite/27_io/basic_ostream/inserters_arithmetic/wchar_t/4402.cc b/libstdc++-v3/testsuite/27_io/basic_ostream/inserters_arithmetic/wchar_t/4402.cc
+--- a/libstdc++-v3/testsuite/27_io/basic_ostream/inserters_arithmetic/wchar_t/4402.cc 2009-04-10 01:23:07.000000000 +0200
++++ b/libstdc++-v3/testsuite/27_io/basic_ostream/inserters_arithmetic/wchar_t/4402.cc 2010-01-25 09:50:29.675687743 +0100
+@@ -1,3 +1,5 @@
++// { dg-require-swprintf "" }
++
+ // Copyright (C) 2005, 2006, 2007, 2009 Free Software Foundation, Inc.
+ //
+ // This file is part of the GNU ISO C++ Library. This library is free
+diff -Nur a/libstdc++-v3/testsuite/27_io/basic_ostream/inserters_other/wchar_t/error_code.cc b/libstdc++-v3/testsuite/27_io/basic_ostream/inserters_other/wchar_t/error_code.cc
+--- a/libstdc++-v3/testsuite/27_io/basic_ostream/inserters_other/wchar_t/error_code.cc 2009-04-28 12:32:22.000000000 +0200
++++ b/libstdc++-v3/testsuite/27_io/basic_ostream/inserters_other/wchar_t/error_code.cc 2010-01-25 09:50:29.675687743 +0100
+@@ -1,4 +1,5 @@
+ // { dg-options "-std=gnu++0x" }
++// { dg-require-swprintf "" }
+
+ // Copyright (C) 2007, 2008, 2009 Free Software Foundation
+ //
+diff -Nur a/libstdc++-v3/testsuite/27_io/objects/char/10.cc b/libstdc++-v3/testsuite/27_io/objects/char/10.cc
+--- a/libstdc++-v3/testsuite/27_io/objects/char/10.cc 2009-04-10 01:23:07.000000000 +0200
++++ b/libstdc++-v3/testsuite/27_io/objects/char/10.cc 2010-01-25 09:50:29.675687743 +0100
+@@ -18,6 +18,7 @@
+ // <http://www.gnu.org/licenses/>.
+
+ // { dg-require-fileio "" }
++// { dg-require-binary-io "" }
+
+ #include <iostream>
+ #include <cstdio>
+diff -Nur a/libstdc++-v3/testsuite/ext/vstring/element_access/char/front_back.cc b/libstdc++-v3/testsuite/ext/vstring/element_access/char/front_back.cc
+--- a/libstdc++-v3/testsuite/ext/vstring/element_access/char/front_back.cc 2009-04-10 01:23:07.000000000 +0200
++++ b/libstdc++-v3/testsuite/ext/vstring/element_access/char/front_back.cc 2010-01-25 09:50:29.675687743 +0100
+@@ -1,4 +1,5 @@
+ // { dg-options "-std=gnu++0x" }
++// { dg-require-string-conversions "" }
+
+ // 2007-10-16 Paolo Carlini <pcarlini@suse.de>
+
+diff -Nur a/libstdc++-v3/testsuite/ext/vstring/element_access/wchar_t/front_back.cc b/libstdc++-v3/testsuite/ext/vstring/element_access/wchar_t/front_back.cc
+--- a/libstdc++-v3/testsuite/ext/vstring/element_access/wchar_t/front_back.cc 2009-04-10 01:23:07.000000000 +0200
++++ b/libstdc++-v3/testsuite/ext/vstring/element_access/wchar_t/front_back.cc 2010-01-25 09:50:29.675687743 +0100
+@@ -1,4 +1,5 @@
+ // { dg-options "-std=gnu++0x" }
++// { dg-require-string-conversions "" }
+
+ // 2007-10-16 Paolo Carlini <pcarlini@suse.de>
+
+diff -Nur a/libstdc++-v3/testsuite/ext/vstring/init-list.cc b/libstdc++-v3/testsuite/ext/vstring/init-list.cc
+--- a/libstdc++-v3/testsuite/ext/vstring/init-list.cc 2009-04-10 01:23:07.000000000 +0200
++++ b/libstdc++-v3/testsuite/ext/vstring/init-list.cc 2010-01-25 09:50:29.675687743 +0100
+@@ -17,6 +17,7 @@
+ //
+
+ // { dg-options "-std=gnu++0x" }
++// { dg-require-string-conversions "" }
+
+ #include <ext/vstring.h>
+ #include <testsuite_hooks.h>
+diff -Nur a/libstdc++-v3/testsuite/ext/vstring/moveable.cc b/libstdc++-v3/testsuite/ext/vstring/moveable.cc
+--- a/libstdc++-v3/testsuite/ext/vstring/moveable.cc 2009-04-10 01:23:07.000000000 +0200
++++ b/libstdc++-v3/testsuite/ext/vstring/moveable.cc 2010-01-25 09:50:29.675687743 +0100
+@@ -1,4 +1,5 @@
+ // { dg-options "-std=gnu++0x" }
++// { dg-require-string-conversions "" }
+
+ // Copyright (C) 2007, 2009 Free Software Foundation, Inc.
+ //
+diff -Nur a/libstdc++-v3/testsuite/ext/vstring/requirements/citerators.cc b/libstdc++-v3/testsuite/ext/vstring/requirements/citerators.cc
+--- a/libstdc++-v3/testsuite/ext/vstring/requirements/citerators.cc 2009-04-10 01:23:07.000000000 +0200
++++ b/libstdc++-v3/testsuite/ext/vstring/requirements/citerators.cc 2010-01-25 09:50:29.675687743 +0100
+@@ -1,4 +1,5 @@
+ // { dg-options "-std=gnu++0x" }
++// { dg-require-string-conversions "" }
+
+ // 2007-10-15 Paolo Carlini <pcarlini@suse.de>
+
+diff -Nur a/libstdc++-v3/testsuite/ext/vstring/requirements/explicit_instantiation/char16_t/1.cc b/libstdc++-v3/testsuite/ext/vstring/requirements/explicit_instantiation/char16_t/1.cc
+--- a/libstdc++-v3/testsuite/ext/vstring/requirements/explicit_instantiation/char16_t/1.cc 2009-04-10 01:23:07.000000000 +0200
++++ b/libstdc++-v3/testsuite/ext/vstring/requirements/explicit_instantiation/char16_t/1.cc 2010-01-25 09:50:29.675687743 +0100
+@@ -1,6 +1,7 @@
+ // { dg-do compile }
+ // { dg-options "-std=gnu++0x" }
+ // { dg-require-cstdint "" }
++// { dg-require-string-conversions "" }
+
+ // Copyright (C) 2008, 2009 Free Software Foundation, Inc.
+ //
+diff -Nur a/libstdc++-v3/testsuite/ext/vstring/requirements/explicit_instantiation/char32_t/1.cc b/libstdc++-v3/testsuite/ext/vstring/requirements/explicit_instantiation/char32_t/1.cc
+--- a/libstdc++-v3/testsuite/ext/vstring/requirements/explicit_instantiation/char32_t/1.cc 2009-04-10 01:23:07.000000000 +0200
++++ b/libstdc++-v3/testsuite/ext/vstring/requirements/explicit_instantiation/char32_t/1.cc 2010-01-25 09:50:29.675687743 +0100
+@@ -1,6 +1,7 @@
+ // { dg-do compile }
+ // { dg-options "-std=gnu++0x" }
+ // { dg-require-cstdint "" }
++// { dg-require-string-conversions "" }
+
+ // Copyright (C) 2008, 2009 Free Software Foundation, Inc.
+ //
+diff -Nur a/libstdc++-v3/testsuite/lib/dg-options.exp b/libstdc++-v3/testsuite/lib/dg-options.exp
+--- a/libstdc++-v3/testsuite/lib/dg-options.exp 2009-04-10 01:23:07.000000000 +0200
++++ b/libstdc++-v3/testsuite/lib/dg-options.exp 2010-01-25 09:50:29.675687743 +0100
+@@ -142,3 +142,21 @@
+ }
+ return
+ }
++
++proc dg-require-swprintf { args } {
++ if { ![ check_v3_target_swprintf ] } {
++ upvar dg-do-what dg-do-what
++ set dg-do-what [list [lindex ${dg-do-what} 0] "N" "P"]
++ return
++ }
++ return
++}
++
++proc dg-require-binary-io { args } {
++ if { ![ check_v3_target_binary_io ] } {
++ upvar dg-do-what dg-do-what
++ set dg-do-what [list [lindex ${dg-do-what} 0] "N" "P"]
++ return
++ }
++ return
++}
+diff -Nur a/libstdc++-v3/testsuite/lib/libstdc++.exp b/libstdc++-v3/testsuite/lib/libstdc++.exp
+--- a/libstdc++-v3/testsuite/lib/libstdc++.exp 2009-05-21 13:30:55.000000000 +0200
++++ b/libstdc++-v3/testsuite/lib/libstdc++.exp 2010-01-25 09:50:29.675687743 +0100
+@@ -204,14 +204,23 @@
+ # directory, and then add that to the search path.
+ foreach src [glob "${srcdir}/util/*.h" \
+ "${srcdir}/util/*.cc" \
+- "${srcdir}/util/*/*.hpp" \
++ "${srcdir}/util/*.tcc" \
++ "${srcdir}/util/*.hpp" \
++ "${srcdir}/util/*/*.h" \
+ "${srcdir}/util/*/*.cc" \
++ "${srcdir}/util/*/*.tcc" \
+ "${srcdir}/util/*/*.hpp" \
++ "${srcdir}/util/*/*/*.h" \
+ "${srcdir}/util/*/*/*.cc" \
++ "${srcdir}/util/*/*/*.tcc" \
+ "${srcdir}/util/*/*/*.hpp" \
++ "${srcdir}/util/*/*/*/*.h" \
+ "${srcdir}/util/*/*/*/*.cc" \
++ "${srcdir}/util/*/*/*/*.tcc" \
+ "${srcdir}/util/*/*/*/*.hpp" \
++ "${srcdir}/util/*/*/*/*/*.h" \
+ "${srcdir}/util/*/*/*/*/*.cc" \
++ "${srcdir}/util/*/*/*/*/*.tcc" \
+ "${srcdir}/util/*/*/*/*/*.hpp" ] {
+ # Remove everything up to "util/..."
+ set dst [string range $src [string length "${srcdir}/"] end]
+@@ -1374,3 +1383,119 @@
+ verbose "check_v3_target_string_conversions: $et_string_conversions" 2
+ return $et_string_conversions
+ }
++
++proc check_v3_target_swprintf { } {
++ global cxxflags
++ global DEFAULT_CXXFLAGS
++ global et_swprintf
++
++ global tool
++
++ if { ![info exists et_swprintf_target_name] } {
++ set et_swprintf_target_name ""
++ }
++
++ # If the target has changed since we set the cached value, clear it.
++ set current_target [current_target_name]
++ if { $current_target != $et_swprintf_target_name } {
++ verbose "check_v3_target_swprintf: `$et_swprintf_target_name'" 2
++ set et_swprintf_target_name $current_target
++ if [info exists et_swprintf] {
++ verbose "check_v3_target_swprintf: removing cached result" 2
++ unset et_swprintf
++ }
++ }
++
++ if [info exists et_swprintf] {
++ verbose "check_v3_target_swprintf: using cached result" 2
++ } else {
++ set et_swprintf 0
++
++ # Set up and compile a C++0x test program that depends
++ # on a standard swprintf function to be available.
++ set src swprintf[pid].cc
++ set exe swprintf[pid].exe
++
++ set f [open $src "w"]
++ puts $f "#include <bits/c++config.h>"
++ puts $f "int main()"
++ puts $f "#if !defined(_GLIBCXX_HAVE_BROKEN_VSWPRINTF)"
++ puts $f "{ return 0; }"
++ puts $f "#endif"
++ close $f
++
++ set cxxflags_saved $cxxflags
++ set cxxflags "$cxxflags $DEFAULT_CXXFLAGS -Werror"
++
++ set lines [v3_target_compile $src $exe executable ""]
++ set cxxflags $cxxflags_saved
++ file delete $src
++
++ if [string match "" $lines] {
++ # No error message, compilation succeeded.
++ set et_swprintf 1
++ } else {
++ verbose "check_v3_target_swprintf: compilation failed" 2
++ }
++ }
++ verbose "check_v3_target_swprintf: $et_swprintf" 2
++ return $et_swprintf
++}
++
++proc check_v3_target_binary_io { } {
++ global cxxflags
++ global DEFAULT_CXXFLAGS
++ global et_binary_io
++
++ global tool
++
++ if { ![info exists et_binary_io_target_name] } {
++ set et_binary_io_target_name ""
++ }
++
++ # If the target has changed since we set the cached value, clear it.
++ set current_target [current_target_name]
++ if { $current_target != $et_binary_io_target_name } {
++ verbose "check_v3_target_binary_io: `$et_binary_io_target_name'" 2
++ set et_binary_io_target_name $current_target
++ if [info exists et_binary_io] {
++ verbose "check_v3_target_binary_io: removing cached result" 2
++ unset et_binary_io
++ }
++ }
++
++ if [info exists et_binary_io] {
++ verbose "check_v3_target_binary_io: using cached result" 2
++ } else {
++ set et_binary_io 0
++
++ # Set up and compile a C++0x test program that depends
++ # on text and binary I/O being the same.
++ set src binary_io[pid].cc
++ set exe binary_io[pid].exe
++
++ set f [open $src "w"]
++ puts $f "#include <bits/c++config.h>"
++ puts $f "int main()"
++ puts $f "#if !defined(_GLIBCXX_HAVE_DOS_BASED_FILESYSTEM)"
++ puts $f "{ return 0; }"
++ puts $f "#endif"
++ close $f
++
++ set cxxflags_saved $cxxflags
++ set cxxflags "$cxxflags $DEFAULT_CXXFLAGS -Werror"
++
++ set lines [v3_target_compile $src $exe executable ""]
++ set cxxflags $cxxflags_saved
++ file delete $src
++
++ if [string match "" $lines] {
++ # No error message, compilation succeeded.
++ set et_binary_io 1
++ } else {
++ verbose "check_v3_target_binary_io: compilation failed" 2
++ }
++ }
++ verbose "check_v3_target_binary_io: $et_binary_io" 2
++ return $et_binary_io
++}
+diff -Nur a/libstdc++-v3/testsuite/lib/prune.exp b/libstdc++-v3/testsuite/lib/prune.exp
+--- a/libstdc++-v3/testsuite/lib/prune.exp 2009-04-10 01:23:07.000000000 +0200
++++ b/libstdc++-v3/testsuite/lib/prune.exp 2010-01-25 09:50:29.675687743 +0100
+@@ -30,5 +30,23 @@
+ regsub -all "(^|\n)\[^\n\]*: Additional NOP may be necessary to workaround Itanium processor A/B step errata" $text "" text
+ regsub -all "(^|\n)\[^\n*\]*: Assembler messages:\[^\n\]*" $text "" text
+
++ if { [ishost "sparc*-*-solaris2*"] } {
++ # When testing a compiler built for SPARC Solaris 2.9 (or earlier)
++ # on a host running Solaris 2.10 (or later), we get this warning
++ # from the static linker when building with g++:
++ #
++ # libm.so.1, needed by .../libstdc++.so may conflict with
++ # libm.so
++ #
++ # The warning is issued because libstdc++ is linked against
++ # libm.so.1 (from the Solaris 2.9 sysroot), whereas Solaris 2.10
++ # provides both libm.so.2 and libm.so.1. On Solaris 2.10, libc.so
++ # depends on libm.so.2, so all programs pull in libm.so.2.
++ #
++ # Pulling both libraries must in fact be harmless, as, otherwise,
++ # programs built for Solaris 2.9 would break on Solaris 2.10.
++ regsub -all "(^|\n)\[^\n\]*: warning: libm.so.1, needed by \[^\n\]*, may conflict with libm.so.2" $text "" text
++ }
++
+ return $text
+ }
+diff -Nur a/libstdc++-v3/testsuite/Makefile.in b/libstdc++-v3/testsuite/Makefile.in
+--- a/libstdc++-v3/testsuite/Makefile.in 2009-02-23 21:42:53.000000000 +0100
++++ b/libstdc++-v3/testsuite/Makefile.in 2010-01-25 09:50:29.675687743 +0100
+@@ -161,6 +161,8 @@
+ LIBOBJS = @LIBOBJS@
+ LIBS = @LIBS@
+ LIBSUPCXX_PICFLAGS = @LIBSUPCXX_PICFLAGS@
++LIBSUPCXX_PRONLY_FALSE = @LIBSUPCXX_PRONLY_FALSE@
++LIBSUPCXX_PRONLY_TRUE = @LIBSUPCXX_PRONLY_TRUE@
+ LIBTOOL = @LIBTOOL@
+ LIPO = @LIPO@
+ LN_S = @LN_S@
diff --git a/toolchain/gcc/patches/4.4.1+cs/100-uclibc-conf.patch b/toolchain/gcc/patches/4.4.1+cs/100-uclibc-conf.patch
new file mode 100644
index 0000000000..7c6b791162
--- /dev/null
+++ b/toolchain/gcc/patches/4.4.1+cs/100-uclibc-conf.patch
@@ -0,0 +1,33 @@
+--- a/contrib/regression/objs-gcc.sh
++++ b/contrib/regression/objs-gcc.sh
+@@ -106,6 +106,10 @@
+ then
+ make all-gdb all-dejagnu all-ld || exit 1
+ make install-gdb install-dejagnu install-ld || exit 1
++elif [ $H_REAL_TARGET = $H_REAL_HOST -a $H_REAL_TARGET = i686-pc-linux-uclibc ]
++ then
++ make all-gdb all-dejagnu all-ld || exit 1
++ make install-gdb install-dejagnu install-ld || exit 1
+ elif [ $H_REAL_TARGET = $H_REAL_HOST ] ; then
+ make bootstrap || exit 1
+ make install || exit 1
+--- a/libjava/classpath/ltconfig
++++ b/libjava/classpath/ltconfig
+@@ -603,7 +603,7 @@
+
+ # Transform linux* to *-*-linux-gnu*, to support old configure scripts.
+ case $host_os in
+-linux-gnu*) ;;
++linux-gnu*|linux-uclibc*) ;;
+ linux*) host=`echo $host | sed 's/^\(.*-.*-linux\)\(.*\)$/\1-gnu\2/'`
+ esac
+
+@@ -1251,7 +1251,7 @@
+ ;;
+
+ # This must be Linux ELF.
+-linux-gnu*)
++linux*)
+ version_type=linux
+ need_lib_prefix=no
+ need_version=no
diff --git a/toolchain/gcc/patches/4.4.1+cs/106-fix_linker_error.patch b/toolchain/gcc/patches/4.4.1+cs/106-fix_linker_error.patch
new file mode 100644
index 0000000000..57698ea5e9
--- /dev/null
+++ b/toolchain/gcc/patches/4.4.1+cs/106-fix_linker_error.patch
@@ -0,0 +1,12 @@
+--- a/gcc/cp/Make-lang.in
++++ b/gcc/cp/Make-lang.in
+@@ -72,8 +72,7 @@ g++-cross$(exeext): g++$(exeext)
+ # Shared with C front end:
+ CXX_C_OBJS = attribs.o c-common.o c-format.o c-pragma.o c-semantics.o c-lex.o \
+ c-dump.o $(CXX_TARGET_OBJS) c-pretty-print.o c-opts.o c-pch.o \
+- incpath.o cppdefault.o c-ppoutput.o c-cppbuiltin.o prefix.o \
+- c-gimplify.o c-omp.o tree-inline.o
++ incpath.o c-ppoutput.o c-cppbuiltin.o prefix.o c-gimplify.o c-omp.o
+
+ # Language-specific object files for C++ and Objective C++.
+ CXX_AND_OBJCXX_OBJS = cp/call.o cp/decl.o cp/expr.o cp/pt.o cp/typeck2.o \
diff --git a/toolchain/gcc/patches/4.4.1+cs/301-missing-execinfo_h.patch b/toolchain/gcc/patches/4.4.1+cs/301-missing-execinfo_h.patch
new file mode 100644
index 0000000000..5a7aa4e47d
--- /dev/null
+++ b/toolchain/gcc/patches/4.4.1+cs/301-missing-execinfo_h.patch
@@ -0,0 +1,11 @@
+--- a/boehm-gc/include/gc.h
++++ b/boehm-gc/include/gc.h
+@@ -503,7 +503,7 @@
+ #if defined(__linux__) || defined(__GLIBC__)
+ # include <features.h>
+ # if (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 1 || __GLIBC__ > 2) \
+- && !defined(__ia64__)
++ && !defined(__ia64__) && !defined(__UCLIBC__)
+ # ifndef GC_HAVE_BUILTIN_BACKTRACE
+ # define GC_HAVE_BUILTIN_BACKTRACE
+ # endif
diff --git a/toolchain/gcc/patches/4.4.1+cs/302-c99-snprintf.patch b/toolchain/gcc/patches/4.4.1+cs/302-c99-snprintf.patch
new file mode 100644
index 0000000000..f0ba5411ed
--- /dev/null
+++ b/toolchain/gcc/patches/4.4.1+cs/302-c99-snprintf.patch
@@ -0,0 +1,11 @@
+--- a/libstdc++-v3/include/c_global/cstdio
++++ b/libstdc++-v3/include/c_global/cstdio
+@@ -139,7 +139,7 @@
+
+ _GLIBCXX_END_NAMESPACE
+
+-#if _GLIBCXX_USE_C99
++#if _GLIBCXX_USE_C99 || defined __UCLIBC__
+
+ #undef snprintf
+ #undef vfscanf
diff --git a/toolchain/gcc/patches/4.4.1+cs/305-libmudflap-susv3-legacy.patch b/toolchain/gcc/patches/4.4.1+cs/305-libmudflap-susv3-legacy.patch
new file mode 100644
index 0000000000..5bc4aebb67
--- /dev/null
+++ b/toolchain/gcc/patches/4.4.1+cs/305-libmudflap-susv3-legacy.patch
@@ -0,0 +1,47 @@
+--- a/libmudflap/mf-hooks2.c
++++ b/libmudflap/mf-hooks2.c
+@@ -421,7 +421,7 @@
+ {
+ TRACE ("%s\n", __PRETTY_FUNCTION__);
+ MF_VALIDATE_EXTENT(s, n, __MF_CHECK_WRITE, "bzero region");
+- bzero (s, n);
++ memset (s, 0, n);
+ }
+
+
+@@ -431,7 +431,7 @@
+ TRACE ("%s\n", __PRETTY_FUNCTION__);
+ MF_VALIDATE_EXTENT(src, n, __MF_CHECK_READ, "bcopy src");
+ MF_VALIDATE_EXTENT(dest, n, __MF_CHECK_WRITE, "bcopy dest");
+- bcopy (src, dest, n);
++ memmove (dest, src, n);
+ }
+
+
+@@ -441,7 +441,7 @@
+ TRACE ("%s\n", __PRETTY_FUNCTION__);
+ MF_VALIDATE_EXTENT(s1, n, __MF_CHECK_READ, "bcmp 1st arg");
+ MF_VALIDATE_EXTENT(s2, n, __MF_CHECK_READ, "bcmp 2nd arg");
+- return bcmp (s1, s2, n);
++ return n == 0 ? 0 : memcmp (s1, s2, n);
+ }
+
+
+@@ -450,7 +450,7 @@
+ size_t n = strlen (s);
+ TRACE ("%s\n", __PRETTY_FUNCTION__);
+ MF_VALIDATE_EXTENT(s, CLAMPADD(n, 1), __MF_CHECK_READ, "index region");
+- return index (s, c);
++ return strchr (s, c);
+ }
+
+
+@@ -459,7 +459,7 @@
+ size_t n = strlen (s);
+ TRACE ("%s\n", __PRETTY_FUNCTION__);
+ MF_VALIDATE_EXTENT(s, CLAMPADD(n, 1), __MF_CHECK_READ, "rindex region");
+- return rindex (s, c);
++ return strrchr (s, c);
+ }
+
+ /* XXX: stpcpy, memccpy */
diff --git a/toolchain/gcc/patches/4.4.1+cs/600-ubicom_support.patch b/toolchain/gcc/patches/4.4.1+cs/600-ubicom_support.patch
new file mode 100644
index 0000000000..b788c70f9c
--- /dev/null
+++ b/toolchain/gcc/patches/4.4.1+cs/600-ubicom_support.patch
@@ -0,0 +1,9386 @@
+--- a/config.sub
++++ b/config.sub
+@@ -283,6 +283,7 @@ case $basic_machine in
+ | sparcv8 | sparcv9 | sparcv9b | sparcv9v \
+ | spu | strongarm \
+ | tahoe | thumb | tic4x | tic80 | tron \
++ | ubicom32 \
+ | v850 | v850e \
+ | ubicom32 \
+ | we32k \
+@@ -367,6 +368,7 @@ case $basic_machine in
+ | tahoe-* | thumb-* \
+ | tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \
+ | tron-* \
++ | ubicom32-* \
+ | v850-* | v850e-* | vax-* \
+ | ubicom32-* \
+ | we32k-* \
+--- a/configure
++++ b/configure
+@@ -2688,6 +2688,9 @@ case "${target}" in
+ ip2k-*-*)
+ noconfigdirs="$noconfigdirs target-libiberty target-libstdc++-v3 ${libgcj}"
+ ;;
++ ubicom32-*-*)
++ noconfigdirs="$noconfigdirs target-libffi"
++ ;;
+ *-*-linux* | *-*-gnu* | *-*-k*bsd*-gnu | *-*-kopensolaris*-gnu)
+ noconfigdirs="$noconfigdirs target-newlib target-libgloss"
+ ;;
+--- /dev/null
++++ b/gcc/config/ubicom32/constraints.md
+@@ -0,0 +1,149 @@
++; Constraint definitions for Ubicom32
++
++; Copyright (C) 2009 Free Software Foundation, Inc.
++; Contributed by Ubicom, Inc.
++
++; 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/>.
++
++(define_register_constraint "a" "ALL_ADDRESS_REGS"
++ "An An register.")
++
++(define_register_constraint "d" "DATA_REGS"
++ "A Dn register.")
++
++(define_register_constraint "h" "ACC_REGS"
++ "An accumulator register.")
++
++(define_register_constraint "l" "ACC_LO_REGS"
++ "An accn_lo register.")
++
++(define_register_constraint "Z" "FDPIC_REG"
++ "The FD-PIC GOT pointer: A0.")
++
++(define_constraint "I"
++ "An 8-bit signed constant value."
++ (and (match_code "const_int")
++ (match_test "(ival >= -128) && (ival <= 127)")))
++
++(define_constraint "Q"
++ "An 8-bit signed constant value represented as unsigned."
++ (and (match_code "const_int")
++ (match_test "(ival >= 0x00) && (ival <= 0xff)")))
++
++(define_constraint "R"
++ "An 8-bit signed constant value represented as unsigned."
++ (and (match_code "const_int")
++ (match_test "((ival >= 0x0000) && (ival <= 0x007f)) || ((ival >= 0xff80) && (ival <= 0xffff))")))
++
++(define_constraint "J"
++ "A 7-bit unsigned constant value."
++ (and (match_code "const_int")
++ (match_test "(ival >= 0) && (ival <= 127)")))
++
++(define_constraint "K"
++ "A 7-bit unsigned constant value shifted << 1."
++ (and (match_code "const_int")
++ (match_test "(ival >= 0) && (ival <= 254) && ((ival & 1) == 0)")))
++
++(define_constraint "L"
++ "A 7-bit unsigned constant value shifted << 2."
++ (and (match_code "const_int")
++ (match_test "(ival >= 0) && (ival <= 508) && ((ival & 3) == 0)")))
++
++(define_constraint "M"
++ "A 5-bit unsigned constant value."
++ (and (match_code "const_int")
++ (match_test "(ival >= 0) && (ival <= 31)")))
++
++(define_constraint "N"
++ "A signed 16 bit constant value."
++ (and (match_code "const_int")
++ (match_test "(ival >= -32768) && (ival <= 32767)")))
++
++(define_constraint "O"
++ "An exact bitmask of contiguous 1 bits starting at bit 0."
++ (and (match_code "const_int")
++ (match_test "exact_log2 (ival + 1) != -1")))
++
++(define_constraint "P"
++ "A 7-bit negative constant value shifted << 2."
++ (and (match_code "const_int")
++ (match_test "(ival >= -504) && (ival <= 0) && ((ival & 3) == 0)")))
++
++(define_constraint "S"
++ "A symbolic reference."
++ (match_code "symbol_ref"))
++
++(define_constraint "Y"
++ "An FD-PIC symbolic reference."
++ (and (match_test "TARGET_FDPIC")
++ (match_test "GET_CODE (op) == UNSPEC")
++ (ior (match_test "XINT (op, 1) == UNSPEC_FDPIC_GOT")
++ (match_test "XINT (op, 1) == UNSPEC_FDPIC_GOT_FUNCDESC"))))
++
++(define_memory_constraint "T1"
++ "A memory operand that can be used for .1 instruction."
++ (and (match_test "memory_operand (op, GET_MODE(op))")
++ (match_test "GET_MODE (op) == QImode")))
++
++(define_memory_constraint "T2"
++ "A memory operand that can be used for .2 instruction."
++ (and (match_test "memory_operand (op, GET_MODE(op))")
++ (match_test "GET_MODE (op) == HImode")))
++
++(define_memory_constraint "T4"
++ "A memory operand that can be used for .4 instruction."
++ (and (match_test "memory_operand (op, GET_MODE(op))")
++ (ior (match_test "GET_MODE (op) == SImode")
++ (match_test "GET_MODE (op) == DImode")
++ (match_test "GET_MODE (op) == SFmode"))))
++
++(define_memory_constraint "U1"
++ "An offsettable memory operand that can be used for .1 instruction."
++ (and (match_test "memory_operand (op, GET_MODE(op))")
++ (match_test "GET_MODE (op) == QImode")
++ (match_test "GET_CODE (XEXP (op, 0)) != POST_INC")
++ (match_test "GET_CODE (XEXP (op, 0)) != PRE_INC")
++ (match_test "GET_CODE (XEXP (op, 0)) != POST_DEC")
++ (match_test "GET_CODE (XEXP (op, 0)) != PRE_DEC")
++ (match_test "GET_CODE (XEXP (op, 0)) != POST_MODIFY")
++ (match_test "GET_CODE (XEXP (op, 0)) != PRE_MODIFY")))
++
++(define_memory_constraint "U2"
++ "An offsettable memory operand that can be used for .2 instruction."
++ (and (match_test "memory_operand (op, GET_MODE(op))")
++ (match_test "GET_MODE (op) == HImode")
++ (match_test "GET_CODE (XEXP (op, 0)) != POST_INC")
++ (match_test "GET_CODE (XEXP (op, 0)) != PRE_INC")
++ (match_test "GET_CODE (XEXP (op, 0)) != POST_DEC")
++ (match_test "GET_CODE (XEXP (op, 0)) != PRE_DEC")
++ (match_test "GET_CODE (XEXP (op, 0)) != POST_MODIFY")
++ (match_test "GET_CODE (XEXP (op, 0)) != PRE_MODIFY")))
++
++(define_memory_constraint "U4"
++ "An offsettable memory operand that can be used for .4 instruction."
++ (and (match_test "memory_operand (op, GET_MODE(op))")
++ (ior (match_test "GET_MODE (op) == SImode")
++ (match_test "GET_MODE (op) == DImode")
++ (match_test "GET_MODE (op) == SFmode"))
++ (match_test "GET_CODE (XEXP (op, 0)) != POST_INC")
++ (match_test "GET_CODE (XEXP (op, 0)) != PRE_INC")
++ (match_test "GET_CODE (XEXP (op, 0)) != POST_DEC")
++ (match_test "GET_CODE (XEXP (op, 0)) != PRE_DEC")
++ (match_test "GET_CODE (XEXP (op, 0)) != POST_MODIFY")
++ (match_test "GET_CODE (XEXP (op, 0)) != PRE_MODIFY")))
++
+--- /dev/null
++++ b/gcc/config/ubicom32/crti.S
+@@ -0,0 +1,54 @@
++/* Specialized code needed to support construction and destruction of
++ file-scope objects in C++ and Java code, and to support exception handling.
++ Copyright (C) 1999 Free Software Foundation, Inc.
++ Contributed by Charles-Antoine Gauthier (charles.gauthier@iit.nrc.ca).
++
++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 2, 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 COPYING. If not, write to
++the Free Software Foundation, 59 Temple Place - Suite 330,
++Boston, MA 02111-1307, USA. */
++
++/* As a special exception, if you link this library with files
++ compiled with GCC to produce an executable, this does not cause
++ the resulting executable to be covered by the GNU General Public License.
++ This exception does not however invalidate any other reasons why
++ the executable file might be covered by the GNU General Public License. */
++
++/*
++ * This file just supplies function prologues for the .init and .fini
++ * sections. It is linked in before crtbegin.o.
++ */
++ .file "crti.o"
++ .ident "GNU C crti.o"
++
++ .section .init
++ .align 2
++ .globl _init
++ .type _init, @function
++_init:
++ move.4 -4(sp)++, a5
++#ifdef __UBICOM32_FDPIC__
++ move.4 -4(sp)++, a0
++#endif
++
++ .section .fini
++ .align 2
++ .globl _fini
++ .type _fini, @function
++_fini:
++ move.4 -4(sp)++, a5
++#ifdef __UBICOM32_FDPIC__
++ move.4 -4(sp)++, a0
++#endif
+--- /dev/null
++++ b/gcc/config/ubicom32/crtn.S
+@@ -0,0 +1,47 @@
++/* Specialized code needed to support construction and destruction of
++ file-scope objects in C++ and Java code, and to support exception handling.
++ Copyright (C) 1999 Free Software Foundation, Inc.
++ Contributed by Charles-Antoine Gauthier (charles.gauthier@iit.nrc.ca).
++
++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 2, 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 COPYING. If not, write to
++the Free Software Foundation, 59 Temple Place - Suite 330,
++Boston, MA 02111-1307, USA. */
++
++/* As a special exception, if you link this library with files
++ compiled with GCC to produce an executable, this does not cause
++ the resulting executable to be covered by the GNU General Public License.
++ This exception does not however invalidate any other reasons why
++ the executable file might be covered by the GNU General Public License. */
++
++/*
++ * This file supplies function epilogues for the .init and .fini sections.
++ * It is linked in after all other files.
++ */
++
++ .file "crtn.o"
++ .ident "GNU C crtn.o"
++
++ .section .init
++#ifdef __UBICOM32_FDPIC__
++ move.4 a0, (sp)4++
++#endif
++ ret (sp)4++
++
++ .section .fini
++#ifdef __UBICOM32_FDPIC__
++ move.4 a0, (sp)4++
++#endif
++ ret (sp)4++
+--- /dev/null
++++ b/gcc/config/ubicom32/elf.h
+@@ -0,0 +1,29 @@
++#undef STARTFILE_SPEC
++#define STARTFILE_SPEC "\
++%{msim:%{!shared:crt0%O%s}} \
++crti%O%s crtbegin%O%s"
++
++#undef ENDFILE_SPEC
++#define ENDFILE_SPEC "crtend%O%s crtn%O%s"
++
++#ifdef __UBICOM32_FDPIC__
++#define CRT_CALL_STATIC_FUNCTION(SECTION_OP, FUNC) \
++ asm (SECTION_OP); \
++ asm ("move.4 a0, 0(sp);\n\t" \
++ "call a5," USER_LABEL_PREFIX #FUNC ";"); \
++ asm (TEXT_SECTION_ASM_OP);
++#endif
++
++#undef SUBTARGET_DRIVER_SELF_SPECS
++#define SUBTARGET_DRIVER_SELF_SPECS \
++ "%{mfdpic:-msim} "
++
++#define NO_IMPLICIT_EXTERN_C
++
++/*
++ * We need this to compile crtbegin/crtend. This should really be picked
++ * up from elfos.h but at the moment including elfos.h causes other more
++ * serous linker issues.
++ */
++#define INIT_SECTION_ASM_OP "\t.section\t.init"
++#define FINI_SECTION_ASM_OP "\t.section\t.fini"
+--- /dev/null
++++ b/gcc/config/ubicom32/linux.h
+@@ -0,0 +1,80 @@
++/* Definitions of target machine for Ubicom32-uclinux
++
++ Copyright (C) 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008,
++ 2009 Free Software Foundation, Inc.
++ Contributed by Ubicom, Inc.
++
++ 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/>. */
++
++/* Don't assume anything about the header files. */
++#define NO_IMPLICIT_EXTERN_C
++
++#undef LIB_SPEC
++#define LIB_SPEC \
++ "%{pthread:-lpthread} " \
++ "-lc"
++
++#undef LINK_GCC_C_SEQUENCE_SPEC
++#define LINK_GCC_C_SEQUENCE_SPEC \
++ "%{static:--start-group} %G %L %{static:--end-group} " \
++ "%{!static: %G}"
++
++#undef STARTFILE_SPEC
++#define STARTFILE_SPEC \
++ "%{!shared: %{pg|p|profile:gcrt1%O%s;pie:Scrt1%O%s;:crt1%O%s}} " \
++ "crtreloc%O%s crti%O%s %{shared|pie:crtbeginS%O%s;:crtbegin%O%s}"
++
++#undef ENDFILE_SPEC
++#define ENDFILE_SPEC \
++ "%{shared|pie:crtendS%O%s;:crtend%O%s} crtn%O%s"
++
++/* taken from linux.h */
++/* The GNU C++ standard library requires that these macros be defined. */
++#undef CPLUSPLUS_CPP_SPEC
++#define CPLUSPLUS_CPP_SPEC "-D_GNU_SOURCE %(cpp)"
++
++#define TARGET_OS_CPP_BUILTINS() \
++ do { \
++ builtin_define_std ("__UBICOM32__"); \
++ builtin_define_std ("__ubicom32__"); \
++ builtin_define ("__gnu_linux__"); \
++ builtin_define_std ("linux"); \
++ builtin_define_std ("unix"); \
++ builtin_assert ("system=linux"); \
++ builtin_assert ("system=unix"); \
++ builtin_assert ("system=posix"); \
++ } while (0)
++
++#define OBJECT_FORMAT_ELF
++
++
++#undef DRIVER_SELF_SPECS
++#define DRIVER_SELF_SPECS \
++ "%{!mno-fdpic:-mfdpic}"
++
++#undef LINK_SPEC
++#define LINK_SPEC "%{mfdpic: -m elf32ubicom32fdpic -z text } %{shared} %{pie} \
++ %{static:-dn -Bstatic} \
++ %{shared:-G -Bdynamic} \
++ %{!shared: %{!static: \
++ %{rdynamic:-export-dynamic} \
++ %{!dynamic-linker:-dynamic-linker /lib/ld-uClibc.so.0}} \
++ %{static}} "
++
++/*
++#define MD_UNWIND_SUPPORT "config/bfin/linux-unwind.h"
++*/
+--- /dev/null
++++ b/gcc/config/ubicom32/predicates.md
+@@ -0,0 +1,327 @@
++; Predicate definitions for Ubicom32.
++
++; Copyright (C) 2009 Free Software Foundation, Inc.
++; Contributed by Ubicom, Inc.
++
++; 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/>.
++
++(define_predicate "ubicom32_move_operand"
++ (match_code "const_int, const_double, const, mem, subreg, reg, lo_sum")
++{
++ if (CONST_INT_P (op))
++ return true;
++
++ if (GET_CODE (op) == CONST_DOUBLE)
++ return true;
++
++ if (GET_CODE (op) == CONST)
++ return memory_address_p (mode, op);
++
++ if (GET_MODE (op) != mode)
++ return false;
++
++ if (MEM_P (op))
++ return memory_address_p (mode, XEXP (op, 0));
++
++ if (GET_CODE (op) == SUBREG) {
++ op = SUBREG_REG (op);
++
++ if (REG_P (op))
++ return true;
++
++ if (! MEM_P (op))
++ return false;
++
++ /* Paradoxical SUBREG. */
++ if (GET_MODE_SIZE (mode) > GET_MODE_SIZE (GET_MODE (op)))
++ return false;
++
++ return memory_address_p (GET_MODE (op), XEXP (op, 0));
++ }
++
++ return register_operand (op, mode);
++})
++
++;; Returns true if OP is either a symbol reference or a sum of a
++;; symbol reference and a constant.
++
++(define_predicate "ubicom32_symbolic_address_operand"
++ (match_code "symbol_ref, label_ref, const")
++{
++ switch (GET_CODE (op))
++ {
++ case SYMBOL_REF:
++ case LABEL_REF:
++ return true;
++
++ case CONST:
++ op = XEXP (op, 0);
++ return ((GET_CODE (XEXP (op, 0)) == SYMBOL_REF
++ || GET_CODE (XEXP (op, 0)) == LABEL_REF)
++ && CONST_INT_P (XEXP (op, 1)));
++
++ default:
++ return false;
++ }
++})
++
++;; Return true if operand is the uClinux FD-PIC register.
++
++(define_predicate "ubicom32_fdpic_operand"
++ (match_code "reg")
++{
++ if (! TARGET_FDPIC)
++ return false;
++
++ if (!REG_P (op))
++ return false;
++
++ if (GET_MODE (op) != mode && mode != VOIDmode)
++ return false;
++
++ if (REGNO (op) != FDPIC_REGNUM && REGNO (op) < FIRST_PSEUDO_REGISTER)
++ return false;
++
++ return true;
++})
++
++(define_predicate "ubicom32_fdpic_got_offset_operand"
++ (match_code "unspec")
++{
++ if (! TARGET_FDPIC)
++ return false;
++
++ if (GET_CODE (op) != UNSPEC)
++ return false;
++
++ if (XINT (op, 1) != UNSPEC_FDPIC_GOT
++ && XINT (op, 1) != UNSPEC_FDPIC_GOT_FUNCDESC)
++ return false;
++
++ return true;
++})
++
++(define_predicate "ubicom32_arith_operand"
++ (match_code "subreg, reg, const_int, lo_sum, mem")
++{
++ return (ubicom32_move_operand (op, mode)
++ && ! ubicom32_symbolic_address_operand (op, mode)
++ && (! CONST_INT_P (op)
++ || satisfies_constraint_I (op)));
++})
++
++(define_predicate "ubicom32_arith_operand_dot1"
++ (match_code "subreg, reg, const_int, lo_sum, mem")
++{
++ return (ubicom32_move_operand (op, mode)
++ && ! ubicom32_symbolic_address_operand (op, mode)
++ && (! CONST_INT_P (op)
++ || satisfies_constraint_Q (op)));
++})
++
++(define_predicate "ubicom32_arith_operand_dot2"
++ (match_code "subreg, reg, const_int, lo_sum, mem")
++{
++ return (ubicom32_move_operand (op, mode)
++ && ! ubicom32_symbolic_address_operand (op, mode)
++ && (! CONST_INT_P (op)
++ || satisfies_constraint_R (op)));
++})
++
++(define_predicate "ubicom32_compare_operand"
++ (match_code "subreg, reg, const_int, lo_sum, mem")
++{
++ return (ubicom32_move_operand (op, mode)
++ && ! ubicom32_symbolic_address_operand (op, mode)
++ && (! CONST_INT_P (op)
++ || satisfies_constraint_N (op)));
++})
++
++(define_predicate "ubicom32_compare_operator"
++ (match_code "compare"))
++
++(define_predicate "ubicom32_and_or_si3_operand"
++ (match_code "subreg, reg, const_int, lo_sum, mem")
++{
++ return (ubicom32_arith_operand (op, mode)
++ || (CONST_INT_P (op)
++ && ((exact_log2 (INTVAL (op) + 1) != -1
++ && exact_log2 (INTVAL (op) + 1) <= 31)
++ || (exact_log2 (INTVAL (op)) != -1
++ && exact_log2 (INTVAL (op)) <= 31)
++ || (exact_log2 (~INTVAL (op)) != -1
++ && exact_log2 (~INTVAL (op)) <= 31))));
++})
++
++(define_predicate "ubicom32_and_or_hi3_operand"
++ (match_code "subreg, reg, const_int, lo_sum, mem")
++{
++ return (ubicom32_arith_operand (op, mode)
++ || (CONST_INT_P (op)
++ && exact_log2 (INTVAL (op) + 1) != -1
++ && exact_log2 (INTVAL (op) + 1) <= 15));
++})
++
++(define_predicate "ubicom32_mem_or_address_register_operand"
++ (match_code "subreg, reg, mem")
++{
++ unsigned int regno;
++
++ if (MEM_P (op)
++ && memory_operand (op, mode))
++ return true;
++
++ if (REG_P (op))
++ regno = REGNO (op);
++ else if (GET_CODE (op) == SUBREG && REG_P (SUBREG_REG (op)))
++ {
++ int offset;
++ if (REGNO (SUBREG_REG (op)) >= FIRST_PSEUDO_REGISTER)
++ offset = SUBREG_BYTE (op) / (GET_MODE_SIZE (GET_MODE (op)));
++ else
++ offset = subreg_regno_offset (REGNO (SUBREG_REG (op)),
++ GET_MODE (SUBREG_REG (op)),
++ SUBREG_BYTE (op),
++ GET_MODE (op));
++ regno = REGNO (SUBREG_REG (op)) + offset;
++ }
++ else
++ return false;
++
++ return (regno >= FIRST_PSEUDO_REGISTER
++ || REGNO_REG_CLASS (regno) == FDPIC_REG
++ || REGNO_REG_CLASS (regno) == ADDRESS_REGS);
++})
++
++(define_predicate "ubicom32_data_register_operand"
++ (match_code "subreg, reg")
++{
++ unsigned int regno;
++
++ if (REG_P (op))
++ regno = REGNO (op);
++ else if (GET_CODE (op) == SUBREG && REG_P (SUBREG_REG (op)))
++ {
++ int offset;
++ if (REGNO (SUBREG_REG (op)) >= FIRST_PSEUDO_REGISTER)
++ offset = SUBREG_BYTE (op) / (GET_MODE_SIZE (GET_MODE (op)));
++ else
++ offset = subreg_regno_offset (REGNO (SUBREG_REG (op)),
++ GET_MODE (SUBREG_REG (op)),
++ SUBREG_BYTE (op),
++ GET_MODE (op));
++ regno = REGNO (SUBREG_REG (op)) + offset;
++ }
++ else
++ return false;
++
++ return ((regno >= FIRST_PSEUDO_REGISTER
++ && regno != REGNO (virtual_stack_vars_rtx))
++ || REGNO_REG_CLASS (regno) == DATA_REGS);
++})
++
++(define_predicate "ubicom32_address_register_operand"
++ (match_code "subreg, reg")
++{
++ unsigned int regno;
++
++ if (REG_P (op))
++ regno = REGNO (op);
++ else if (GET_CODE (op) == SUBREG && REG_P (SUBREG_REG (op)))
++ {
++ int offset;
++ if (REGNO (SUBREG_REG (op)) >= FIRST_PSEUDO_REGISTER)
++ offset = SUBREG_BYTE (op) / (GET_MODE_SIZE (GET_MODE (op)));
++ else
++ offset = subreg_regno_offset (REGNO (SUBREG_REG (op)),
++ GET_MODE (SUBREG_REG (op)),
++ SUBREG_BYTE (op),
++ GET_MODE (op));
++ regno = REGNO (SUBREG_REG (op)) + offset;
++ }
++ else
++ return false;
++
++ return (regno >= FIRST_PSEUDO_REGISTER
++ || REGNO_REG_CLASS (regno) == FDPIC_REG
++ || REGNO_REG_CLASS (regno) == ADDRESS_REGS);
++})
++
++(define_predicate "ubicom32_acc_lo_register_operand"
++ (match_code "subreg, reg")
++{
++ unsigned int regno;
++
++ if (REG_P (op))
++ regno = REGNO (op);
++ else if (GET_CODE (op) == SUBREG && REG_P (SUBREG_REG (op)))
++ {
++ int offset;
++ if (REGNO (SUBREG_REG (op)) >= FIRST_PSEUDO_REGISTER)
++ offset = SUBREG_BYTE (op) / (GET_MODE_SIZE (GET_MODE (op)));
++ else
++ offset = subreg_regno_offset (REGNO (SUBREG_REG (op)),
++ GET_MODE (SUBREG_REG (op)),
++ SUBREG_BYTE (op),
++ GET_MODE (op));
++ regno = REGNO (SUBREG_REG (op)) + offset;
++ }
++ else
++ return false;
++
++ return ((regno >= FIRST_PSEUDO_REGISTER
++ && regno != REGNO (virtual_stack_vars_rtx))
++ || REGNO_REG_CLASS (regno) == ACC_LO_REGS);
++})
++
++(define_predicate "ubicom32_acc_hi_register_operand"
++ (match_code "subreg, reg")
++{
++ unsigned int regno;
++
++ if (REG_P (op))
++ regno = REGNO (op);
++ else if (GET_CODE (op) == SUBREG && REG_P (SUBREG_REG (op)))
++ {
++ int offset;
++ if (REGNO (SUBREG_REG (op)) >= FIRST_PSEUDO_REGISTER)
++ offset = SUBREG_BYTE (op) / (GET_MODE_SIZE (GET_MODE (op)));
++ else
++ offset = subreg_regno_offset (REGNO (SUBREG_REG (op)),
++ GET_MODE (SUBREG_REG (op)),
++ SUBREG_BYTE (op),
++ GET_MODE (op));
++ regno = REGNO (SUBREG_REG (op)) + offset;
++ }
++ else
++ return false;
++
++ return ((regno >= FIRST_PSEUDO_REGISTER
++ && regno != REGNO (virtual_stack_vars_rtx))
++ || REGNO_REG_CLASS (regno) == ACC_REGS);
++})
++
++(define_predicate "ubicom32_call_address_operand"
++ (match_code "symbol_ref, subreg, reg")
++{
++ return (GET_CODE (op) == SYMBOL_REF || REG_P (op));
++})
++
++(define_special_predicate "ubicom32_cc_register_operand"
++ (and (match_code "reg")
++ (match_test "REGNO (op) == CC_REGNUM")))
++
+--- /dev/null
++++ b/gcc/config/ubicom32/t-ubicom32
+@@ -0,0 +1,52 @@
++# Name of assembly file containing libgcc1 functions.
++# This entry must be present, but it can be empty if the target does
++# not need any assembler functions to support its code generation.
++CROSS_LIBGCC1 =
++
++# Alternatively if assembler functions *are* needed then define the
++# entries below:
++# CROSS_LIBGCC1 = libgcc1-asm.a
++
++LIB2FUNCS_EXTRA = \
++ $(srcdir)/config/udivmodsi4.c \
++ $(srcdir)/config/divmod.c \
++ $(srcdir)/config/udivmod.c
++
++# If any special flags are necessary when building libgcc2 put them here.
++#
++# TARGET_LIBGCC2_CFLAGS =
++
++# We want fine grained libraries, so use the new code to build the
++# floating point emulation libraries.
++FPBIT = fp-bit.c
++DPBIT = dp-bit.c
++
++fp-bit.c: $(srcdir)/config/fp-bit.c
++ echo '#define FLOAT' > fp-bit.c
++ cat $(srcdir)/config/fp-bit.c >> fp-bit.c
++
++dp-bit.c: $(srcdir)/config/fp-bit.c
++ cat $(srcdir)/config/fp-bit.c > dp-bit.c
++
++# Commented out to speed up compiler development!
++#
++# MULTILIB_OPTIONS = march=ubicom32v1/march=ubicom32v2/march=ubicom32v3/march=ubicom32v4
++# MULTILIB_DIRNAMES = ubicom32v1 ubicom32v2 ubicom32v3 ubicom32v4
++
++MULTILIB_OPTIONS = march=ubicom32v3/march=ubicom32v4
++MULTILIB_OPTIONS += mfdpic
++MULTILIB_OPTIONS += mno-ipos-abi/mipos-abi
++MULTILIB_OPTIONS += fno-leading-underscore/fleading-underscore
++
++# Assemble startup files.
++$(T)crti.o: $(srcdir)/config/ubicom32/crti.S $(GCC_PASSES)
++ $(GCC_FOR_TARGET) $(GCC_CFLAGS) $(MULTILIB_CFLAGS) $(INCLUDES) \
++ -c -o $(T)crti.o -x assembler-with-cpp $(srcdir)/config/ubicom32/crti.S
++
++$(T)crtn.o: $(srcdir)/config/ubicom32/crtn.S $(GCC_PASSES)
++ $(GCC_FOR_TARGET) $(GCC_CFLAGS) $(MULTILIB_CFLAGS) $(INCLUDES) \
++ -c -o $(T)crtn.o -x assembler-with-cpp $(srcdir)/config/ubicom32/crtn.S
++
++# these parts are required because uClibc ldso needs them to link.
++# they are not in the specfile so they will not be included automatically.
++EXTRA_MULTILIB_PARTS = crtbegin.o crtend.o crtbeginS.o crtendS.o crti.o crtn.o
+--- /dev/null
++++ b/gcc/config/ubicom32/t-ubicom32-linux
+@@ -0,0 +1,35 @@
++# Name of assembly file containing libgcc1 functions.
++# This entry must be present, but it can be empty if the target does
++# not need any assembler functions to support its code generation.
++CROSS_LIBGCC1 =
++
++# Alternatively if assembler functions *are* needed then define the
++# entries below:
++# CROSS_LIBGCC1 = libgcc1-asm.a
++
++LIB2FUNCS_EXTRA = \
++ $(srcdir)/config/udivmodsi4.c \
++ $(srcdir)/config/divmod.c \
++ $(srcdir)/config/udivmod.c
++
++# If any special flags are necessary when building libgcc2 put them here.
++#
++# TARGET_LIBGCC2_CFLAGS =
++
++# We want fine grained libraries, so use the new code to build the
++# floating point emulation libraries.
++FPBIT = fp-bit.c
++DPBIT = dp-bit.c
++
++fp-bit.c: $(srcdir)/config/fp-bit.c
++ echo '#define FLOAT' > fp-bit.c
++ cat $(srcdir)/config/fp-bit.c >> fp-bit.c
++
++dp-bit.c: $(srcdir)/config/fp-bit.c
++ cat $(srcdir)/config/fp-bit.c > dp-bit.c
++
++# We only support v3 and v4 ISAs for uClinux.
++
++MULTILIB_OPTIONS = march=ubicom32v3/march=ubicom32v4
++
++#EXTRA_MULTILIB_PARTS = crtbegin.o crtend.o crtbeginS.o crtendS.o
+--- /dev/null
++++ b/gcc/config/ubicom32/t-ubicom32-uclinux
+@@ -0,0 +1,35 @@
++# Name of assembly file containing libgcc1 functions.
++# This entry must be present, but it can be empty if the target does
++# not need any assembler functions to support its code generation.
++CROSS_LIBGCC1 =
++
++# Alternatively if assembler functions *are* needed then define the
++# entries below:
++# CROSS_LIBGCC1 = libgcc1-asm.a
++
++LIB2FUNCS_EXTRA = \
++ $(srcdir)/config/udivmodsi4.c \
++ $(srcdir)/config/divmod.c \
++ $(srcdir)/config/udivmod.c
++
++# If any special flags are necessary when building libgcc2 put them here.
++#
++# TARGET_LIBGCC2_CFLAGS =
++
++# We want fine grained libraries, so use the new code to build the
++# floating point emulation libraries.
++FPBIT = fp-bit.c
++DPBIT = dp-bit.c
++
++fp-bit.c: $(srcdir)/config/fp-bit.c
++ echo '#define FLOAT' > fp-bit.c
++ cat $(srcdir)/config/fp-bit.c >> fp-bit.c
++
++dp-bit.c: $(srcdir)/config/fp-bit.c
++ cat $(srcdir)/config/fp-bit.c > dp-bit.c
++
++# We only support v3 and v4 ISAs for uClinux.
++
++MULTILIB_OPTIONS = march=ubicom32v3/march=ubicom32v4
++
++EXTRA_MULTILIB_PARTS = crtbegin.o crtend.o # crtbeginS.o crtendS.o
+--- /dev/null
++++ b/gcc/config/ubicom32/ubicom32-modes.def
+@@ -0,0 +1,30 @@
++/* Definitions of target machine for GNU compiler, Ubicom32 architecture.
++ Copyright (C) 2009 Free Software Foundation, Inc.
++ Contributed by Ubicom, Inc.
++
++ 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/>. */
++
++/* Some insns set all condition code flags, some only set the Z and N flags, and
++ some only set the Z flag. */
++
++CC_MODE (CCW);
++CC_MODE (CCWZN);
++CC_MODE (CCWZ);
++CC_MODE (CCS);
++CC_MODE (CCSZN);
++CC_MODE (CCSZ);
++
+--- /dev/null
++++ b/gcc/config/ubicom32/ubicom32-protos.h
+@@ -0,0 +1,84 @@
++/* Function prototypes for Ubicom IP3000.
++
++ Copyright (C) 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008,
++ 2009 Free Software Foundation, Inc.
++ Contributed by Ubicom, Inc.
++
++ This file is part of GNU CC.
++
++ GNU CC 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 2, or (at your option) any later
++ version.
++
++ GNU CC 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 GNU CC; see the file COPYING. If not, write to the Free Software
++ Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
++
++#ifdef RTX_CODE
++
++#ifdef TREE_CODE
++extern void ubicom32_va_start (tree, rtx);
++#endif /* TREE_CODE */
++
++extern void ubicom32_print_operand (FILE *, rtx, int);
++extern void ubicom32_print_operand_address (FILE *, rtx);
++
++extern void ubicom32_conditional_register_usage (void);
++extern enum reg_class ubicom32_preferred_reload_class (rtx, enum reg_class);
++extern int ubicom32_regno_ok_for_index_p (int, int);
++extern void ubicom32_expand_movsi (rtx *);
++extern void ubicom32_expand_addsi3 (rtx *);
++extern int ubicom32_emit_mult_sequence (rtx *);
++extern void ubicom32_emit_move_const_int (rtx, rtx);
++extern bool ubicom32_legitimate_constant_p (rtx);
++extern bool ubicom32_legitimate_address_p (enum machine_mode, rtx, int);
++extern rtx ubicom32_legitimize_address (rtx, rtx, enum machine_mode);
++extern rtx ubicom32_legitimize_reload_address (rtx, enum machine_mode, int, int);
++extern void ubicom32_canonicalize_comparison (enum rtx_code *code, rtx *op0, rtx *op1);
++extern int ubicom32_mode_dependent_address_p (rtx);
++extern void ubicom32_output_cond_jump (rtx, rtx, rtx);
++extern void ubicom32_expand_eh_return (rtx *);
++extern void ubicom32_expand_call_fdpic (rtx *);
++extern void ubicom32_expand_call_value_fdpic (rtx *);
++extern enum machine_mode ubicom32_select_cc_mode (RTX_CODE, rtx, rtx);
++extern rtx ubicom32_gen_compare_reg (RTX_CODE, rtx, rtx);
++extern int ubicom32_shiftable_const_int (int);
++#endif /* RTX_CODE */
++
++#ifdef TREE_CODE
++extern void init_cumulative_args (CUMULATIVE_ARGS *cum,
++ tree fntype,
++ struct rtx_def *libname,
++ int indirect);
++extern struct rtx_def *function_arg (CUMULATIVE_ARGS *,
++ enum machine_mode, tree, int);
++extern struct rtx_def *function_incoming_arg (CUMULATIVE_ARGS *,
++ enum machine_mode,
++ tree, int);
++extern int function_arg_partial_nregs (CUMULATIVE_ARGS *,
++ enum machine_mode, tree, int);
++extern struct rtx_def *ubicom32_va_arg (tree, tree);
++extern int ubicom32_reg_parm_stack_space (tree);
++#endif /* TREE_CODE */
++
++extern struct rtx_def * ubicom32_builtin_saveregs (void);
++extern void asm_file_start (FILE *);
++extern void ubicom32_expand_prologue (void);
++extern void ubicom32_expand_epilogue (void);
++extern int ubicom32_initial_elimination_offset (int, int);
++extern int ubicom32_regno_ok_for_base_p (int, int);
++extern bool ubicom32_hard_regno_mode_ok (unsigned int, enum machine_mode);
++extern int ubicom32_can_use_return_insn_p (void);
++extern rtx ubicom32_return_addr_rtx (int, rtx);
++extern void ubicom32_optimization_options (int, int);
++extern void ubicom32_override_options (void);
++extern bool ubicom32_match_cc_mode (rtx, enum machine_mode);
++
++extern int ubicom32_reorg_completed;
++
+--- /dev/null
++++ b/gcc/config/ubicom32/ubicom32.c
+@@ -0,0 +1,2881 @@
++/* Subroutines for insn-output.c for Ubicom32
++
++ Copyright (C) 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008,
++ 2009 Free Software Foundation, Inc.
++ Contributed by Ubicom, Inc.
++
++ 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/>. */
++
++#include "config.h"
++#include "system.h"
++#include "coretypes.h"
++#include "tm.h"
++#include "rtl.h"
++#include "tree.h"
++#include "regs.h"
++#include "hard-reg-set.h"
++#include "real.h"
++#include "insn-config.h"
++#include "conditions.h"
++#include "insn-flags.h"
++#include "output.h"
++#include "insn-attr.h"
++#include "insn-codes.h"
++#include "flags.h"
++#include "recog.h"
++#include "expr.h"
++#include "function.h"
++#include "obstack.h"
++#include "toplev.h"
++#include "tm_p.h"
++#include "tm-constrs.h"
++#include "basic-block.h"
++#include "integrate.h"
++#include "target.h"
++#include "target-def.h"
++#include "reload.h"
++#include "df.h"
++#include "langhooks.h"
++#include "optabs.h"
++
++static tree ubicom32_handle_fndecl_attribute (tree *, tree, tree, int, bool *);
++static void ubicom32_layout_frame (void);
++static void ubicom32_function_prologue (FILE *, HOST_WIDE_INT);
++static void ubicom32_function_epilogue (FILE *, HOST_WIDE_INT);
++static bool ubicom32_rtx_costs (rtx, int, int, int *, bool speed);
++static bool ubicom32_fixed_condition_code_regs (unsigned int *,
++ unsigned int *);
++static enum machine_mode ubicom32_cc_modes_compatible (enum machine_mode,
++ enum machine_mode);
++static int ubicom32_naked_function_p (void);
++static void ubicom32_machine_dependent_reorg (void);
++static bool ubicom32_assemble_integer (rtx, unsigned int, int);
++static void ubicom32_asm_init_sections (void);
++static int ubicom32_arg_partial_bytes (CUMULATIVE_ARGS *, enum machine_mode,tree,
++ bool);
++static bool ubicom32_pass_by_reference (CUMULATIVE_ARGS *ca ATTRIBUTE_UNUSED,
++ enum machine_mode mode, const_tree type,
++ bool named ATTRIBUTE_UNUSED);
++static bool ubicom32_callee_copies (CUMULATIVE_ARGS *ca ATTRIBUTE_UNUSED,
++ enum machine_mode mode, const_tree type,
++ bool named ATTRIBUTE_UNUSED);
++
++static bool ubicom32_return_in_memory (const_tree type,
++ const_tree fntype ATTRIBUTE_UNUSED);
++static bool ubicom32_is_base_reg (rtx, int);
++static void ubicom32_init_builtins (void);
++static rtx ubicom32_expand_builtin (tree, rtx, rtx, enum machine_mode, int);
++static tree ubicom32_fold_builtin (tree, tree, bool);
++static int ubicom32_get_valid_offset_mask (enum machine_mode);
++static bool ubicom32_cannot_force_const_mem (rtx);
++
++/* Case values threshold */
++int ubicom32_case_values_threshold = 6;
++
++/* Nonzero if this chip supports the Ubicom32 v3 ISA. */
++int ubicom32_v3 = 1;
++
++/* Nonzero if this chip supports the Ubicom32 v4 ISA. */
++int ubicom32_v4 = 1;
++
++/* Valid attributes:
++ naked - don't generate function prologue/epilogue and `ret' command. */
++const struct attribute_spec ubicom32_attribute_table[] =
++{
++ /* { name, min_len, max_len, decl_req, type_req, fn_type_req, handler } */
++ { "naked", 0, 0, true, false, false, ubicom32_handle_fndecl_attribute },
++ { NULL, 0, 0, false, false, false, NULL }
++};
++
++#undef TARGET_ASM_FUNCTION_PROLOGUE
++#define TARGET_ASM_FUNCTION_PROLOGUE ubicom32_function_prologue
++
++#undef TARGET_ASM_FUNCTION_EPILOGUE
++#define TARGET_ASM_FUNCTION_EPILOGUE ubicom32_function_epilogue
++
++#undef TARGET_ATTRIBUTE_TABLE
++#define TARGET_ATTRIBUTE_TABLE ubicom32_attribute_table
++
++/* All addresses cost the same amount. */
++#undef TARGET_ADDRESS_COST
++#define TARGET_ADDRESS_COST hook_int_rtx_bool_0
++
++#undef TARGET_RTX_COSTS
++#define TARGET_RTX_COSTS ubicom32_rtx_costs
++
++#undef TARGET_FIXED_CONDITION_CODE_REGS
++#define TARGET_FIXED_CONDITION_CODE_REGS ubicom32_fixed_condition_code_regs
++
++#undef TARGET_CC_MODES_COMPATIBLE
++#define TARGET_CC_MODES_COMPATIBLE ubicom32_cc_modes_compatible
++
++#undef TARGET_MACHINE_DEPENDENT_REORG
++#define TARGET_MACHINE_DEPENDENT_REORG ubicom32_machine_dependent_reorg
++
++#undef TARGET_ASM_INTEGER
++#define TARGET_ASM_INTEGER ubicom32_assemble_integer
++
++#undef TARGET_ASM_INIT_SECTIONS
++#define TARGET_ASM_INIT_SECTIONS ubicom32_asm_init_sections
++
++#undef TARGET_ARG_PARTIAL_BYTES
++#define TARGET_ARG_PARTIAL_BYTES ubicom32_arg_partial_bytes
++
++#undef TARGET_PASS_BY_REFERENCE
++#define TARGET_PASS_BY_REFERENCE ubicom32_pass_by_reference
++
++#undef TARGET_CALLEE_COPIES
++#define TARGET_CALLEE_COPIES ubicom32_callee_copies
++
++#undef TARGET_RETURN_IN_MEMORY
++#define TARGET_RETURN_IN_MEMORY ubicom32_return_in_memory
++
++#undef TARGET_INIT_BUILTINS
++#define TARGET_INIT_BUILTINS ubicom32_init_builtins
++
++#undef TARGET_EXPAND_BUILTIN
++#define TARGET_EXPAND_BUILTIN ubicom32_expand_builtin
++
++#undef TARGET_FOLD_BUILTIN
++#define TARGET_FOLD_BUILTIN ubicom32_fold_builtin
++
++#undef TARGET_CANNOT_FORCE_CONST_MEM
++#define TARGET_CANNOT_FORCE_CONST_MEM ubicom32_cannot_force_const_mem
++
++struct gcc_target targetm = TARGET_INITIALIZER;
++
++static char save_regs[FIRST_PSEUDO_REGISTER];
++static int nregs;
++static int frame_size;
++int ubicom32_stack_size = 0; /* size of allocated stack (including frame) */
++int ubicom32_can_use_calli_to_ret;
++
++#define STACK_UNIT_BOUNDARY (STACK_BOUNDARY / BITS_PER_UNIT)
++#define ROUND_CALL_BLOCK_SIZE(BYTES) \
++ (((BYTES) + (STACK_UNIT_BOUNDARY - 1)) & ~(STACK_UNIT_BOUNDARY - 1))
++
++/* In case of a PRE_INC, POST_INC, PRE_DEC, POST_DEC memory reference, we
++ must report the mode of the memory reference from PRINT_OPERAND to
++ PRINT_OPERAND_ADDRESS. */
++enum machine_mode output_memory_reference_mode;
++
++/* Flag for some split insns from the ubicom32.md. */
++int ubicom32_reorg_completed;
++
++enum reg_class const ubicom32_regclass_map[FIRST_PSEUDO_REGISTER] =
++{
++ DATA_REGS,
++ DATA_REGS,
++ DATA_REGS,
++ DATA_REGS,
++ DATA_REGS,
++ DATA_REGS,
++ DATA_REGS,
++ DATA_REGS,
++ DATA_REGS,
++ DATA_REGS,
++ DATA_REGS,
++ DATA_REGS,
++ DATA_REGS,
++ DATA_REGS,
++ DATA_REGS,
++ DATA_REGS,
++ FDPIC_REG,
++ ADDRESS_REGS,
++ ADDRESS_REGS,
++ ADDRESS_REGS,
++ ADDRESS_REGS,
++ ADDRESS_REGS,
++ ADDRESS_REGS,
++ ADDRESS_REGS,
++ ACC_REGS,
++ ACC_LO_REGS,
++ ACC_REGS,
++ ACC_LO_REGS,
++ SOURCE3_REG,
++ ADDRESS_REGS,
++ NO_REGS, /* CC_REG must be NO_REGS */
++ SPECIAL_REGS,
++ SPECIAL_REGS,
++ SPECIAL_REGS,
++ SPECIAL_REGS,
++ SPECIAL_REGS,
++ SPECIAL_REGS,
++ SPECIAL_REGS,
++ SPECIAL_REGS
++};
++
++rtx ubicom32_compare_op0;
++rtx ubicom32_compare_op1;
++
++/* Handle command line option overrides. */
++
++void
++ubicom32_override_options (void)
++{
++ flag_pic = 0;
++
++ if (strcmp (ubicom32_arch_name, "ubicom32v1") == 0) {
++ /* If we have a version 1 architecture then we want to avoid using jump
++ tables. */
++ ubicom32_case_values_threshold = 30000;
++ ubicom32_v3 = 0;
++ ubicom32_v4 = 0;
++ } else if (strcmp (ubicom32_arch_name, "ubicom32v2") == 0) {
++ ubicom32_v3 = 0;
++ ubicom32_v4 = 0;
++ } else if (strcmp (ubicom32_arch_name, "ubicom32v3") == 0) {
++ ubicom32_v3 = 1;
++ ubicom32_v4 = 0;
++ } else if (strcmp (ubicom32_arch_name, "ubicom32v4") == 0) {
++ ubicom32_v3 = 1;
++ ubicom32_v4 = 1;
++ }
++
++ /* There is no single unaligned SI op for PIC code. Sometimes we
++ need to use ".4byte" and sometimes we need to use ".picptr".
++ See ubicom32_assemble_integer for details. */
++ if (TARGET_FDPIC)
++ targetm.asm_out.unaligned_op.si = 0;
++}
++
++void
++ubicom32_conditional_register_usage (void)
++{
++ /* If we're using the old ipOS ABI we need to make D10 through D13
++ caller-clobbered. */
++ if (TARGET_IPOS_ABI)
++ {
++ call_used_regs[D10_REGNUM] = 1;
++ call_used_regs[D11_REGNUM] = 1;
++ call_used_regs[D12_REGNUM] = 1;
++ call_used_regs[D13_REGNUM] = 1;
++ }
++}
++
++/* We have some number of optimizations that don't really work for the Ubicom32
++ architecture so we deal with them here. */
++
++void
++ubicom32_optimization_options (int level ATTRIBUTE_UNUSED,
++ int size ATTRIBUTE_UNUSED)
++{
++ /* The tree IVOPTs pass seems to do really bad things for the Ubicom32
++ architecture - it tends to turn things that would happily use pre/post
++ increment/decrement into operations involving unecessary loop
++ indicies. */
++ flag_ivopts = 0;
++
++ /* We have problems where DSE at the RTL level misses partial stores
++ to the stack. For now we disable it to avoid this. */
++ flag_dse = 0;
++}
++
++/* Print operand X using operand code CODE to assembly language output file
++ FILE. */
++
++void
++ubicom32_print_operand (FILE *file, rtx x, int code)
++{
++ switch (code)
++ {
++ case 'A':
++ /* Identify the correct accumulator to use. */
++ if (REGNO (x) == ACC0_HI_REGNUM || REGNO (x) == ACC0_LO_REGNUM)
++ fprintf (file, "acc0");
++ else if (REGNO (x) == ACC1_HI_REGNUM || REGNO (x) == ACC1_LO_REGNUM)
++ fprintf (file, "acc1");
++ else
++ abort ();
++ break;
++
++ case 'b':
++ case 'B':
++ {
++ enum machine_mode mode;
++
++ mode = GET_MODE (XEXP (x, 0));
++
++ /* These are normal and reversed branches. */
++ switch (code == 'b' ? GET_CODE (x) : reverse_condition (GET_CODE (x)))
++ {
++ case NE:
++ fprintf (file, "ne");
++ break;
++
++ case EQ:
++ fprintf (file, "eq");
++ break;
++
++ case GE:
++ if (mode == CCSZNmode || mode == CCWZNmode)
++ fprintf (file, "pl");
++ else
++ fprintf (file, "ge");
++ break;
++
++ case GT:
++ fprintf (file, "gt");
++ break;
++
++ case LE:
++ fprintf (file, "le");
++ break;
++
++ case LT:
++ if (mode == CCSZNmode || mode == CCWZNmode)
++ fprintf (file, "mi");
++ else
++ fprintf (file, "lt");
++ break;
++
++ case GEU:
++ fprintf (file, "cs");
++ break;
++
++ case GTU:
++ fprintf (file, "hi");
++ break;
++
++ case LEU:
++ fprintf (file, "ls");
++ break;
++
++ case LTU:
++ fprintf (file, "cc");
++ break;
++
++ default:
++ abort ();
++ }
++ }
++ break;
++
++ case 'C':
++ /* This is used for the operand to a call instruction;
++ if it's a REG, enclose it in parens, else output
++ the operand normally. */
++ if (REG_P (x))
++ {
++ fputc ('(', file);
++ ubicom32_print_operand (file, x, 0);
++ fputc (')', file);
++ }
++ else
++ ubicom32_print_operand (file, x, 0);
++ break;
++
++ case 'd':
++ /* Bit operations we need bit numbers. */
++ fprintf (file, "%d", exact_log2 (INTVAL (x)));
++ break;
++
++ case 'D':
++ /* Bit operations we need bit numbers. */
++ fprintf (file, "%d", exact_log2 (~ INTVAL (x)));
++ break;
++
++ case 'E':
++ /* For lea, which we use to add address registers.
++ We don't want the '#' on a constant. */
++ if (CONST_INT_P (x))
++ {
++ fprintf (file, "%ld", INTVAL (x));
++ break;
++ }
++ /* FALL THROUGH */
++
++ default:
++ switch (GET_CODE (x))
++ {
++ case MEM:
++ output_memory_reference_mode = GET_MODE (x);
++ output_address (XEXP (x, 0));
++ break;
++
++ case PLUS:
++ output_address (x);
++ break;
++
++ case REG:
++ fprintf (file, "%s", reg_names[REGNO (x)]);
++ break;
++
++ case SUBREG:
++ fprintf (file, "%s", reg_names[subreg_regno (x)]);
++ break;
++
++ /* This will only be single precision.... */
++ case CONST_DOUBLE:
++ {
++ unsigned long val;
++ REAL_VALUE_TYPE rv;
++
++ REAL_VALUE_FROM_CONST_DOUBLE (rv, x);
++ REAL_VALUE_TO_TARGET_SINGLE (rv, val);
++ fprintf (file, "0x%lx", val);
++ break;
++ }
++
++ case CONST_INT:
++ case SYMBOL_REF:
++ case CONST:
++ case LABEL_REF:
++ case CODE_LABEL:
++ case LO_SUM:
++ ubicom32_print_operand_address (file, x);
++ break;
++
++ case HIGH:
++ fprintf (file, "#%%hi(");
++ ubicom32_print_operand_address (file, XEXP (x, 0));
++ fprintf (file, ")");
++ break;
++
++ case UNSPEC:
++ switch (XINT (x, 1))
++ {
++ case UNSPEC_FDPIC_GOT:
++ fprintf (file, "#%%got_lo(");
++ ubicom32_print_operand_address (file, XVECEXP (x, 0, 0));
++ fprintf (file, ")");
++ break;
++
++ case UNSPEC_FDPIC_GOT_FUNCDESC:
++ fprintf (file, "#%%got_funcdesc_lo(");
++ ubicom32_print_operand_address (file, XVECEXP (x, 0, 0));
++ fprintf (file, ")");
++ break;
++
++ default:
++ abort ();
++ }
++ break;
++
++ default:
++ abort ();
++ }
++ break;
++ }
++}
++
++/* Output assembly language output for the address ADDR to FILE. */
++
++void
++ubicom32_print_operand_address (FILE *file, rtx addr)
++{
++ switch (GET_CODE (addr))
++ {
++ case POST_INC:
++ ubicom32_print_operand_address (file, XEXP (addr, 0));
++ fprintf (file, "%d++", GET_MODE_SIZE (output_memory_reference_mode));
++ break;
++
++ case PRE_INC:
++ fprintf (file, "%d", GET_MODE_SIZE (output_memory_reference_mode));
++ ubicom32_print_operand_address (file, XEXP (addr, 0));
++ fprintf (file, "++");
++ break;
++
++ case POST_DEC:
++ ubicom32_print_operand_address (file, XEXP (addr, 0));
++ fprintf (file, "%d++", -GET_MODE_SIZE (output_memory_reference_mode));
++ break;
++
++ case PRE_DEC:
++ fprintf (file, "%d", -GET_MODE_SIZE (output_memory_reference_mode));
++ ubicom32_print_operand_address (file, XEXP (addr, 0));
++ fprintf (file, "++");
++ break;
++
++ case POST_MODIFY:
++ ubicom32_print_operand_address (file, XEXP (addr, 0));
++ fprintf (file, "%ld++", INTVAL (XEXP (XEXP (addr,1), 1)));
++ break;
++
++ case PRE_MODIFY:
++ fprintf (file, "%ld", INTVAL (XEXP (XEXP (addr,1), 1)));
++ ubicom32_print_operand_address (file, XEXP (addr, 0));
++ fprintf (file, "++");
++ break;
++
++ case REG:
++ fputc ('(', file);
++ fprintf (file, "%s", reg_names[REGNO (addr)]);
++ fputc (')', file);
++ break;
++
++ case PLUS:
++ {
++ rtx base = XEXP (addr, 0);
++ rtx index = XEXP (addr, 1);
++
++ /* Switch around addresses of the form index * scaling + base. */
++ if (! ubicom32_is_base_reg (base, 1))
++ {
++ rtx tmp = base;
++ base = index;
++ index = tmp;
++ }
++
++ if (CONST_INT_P (index))
++ {
++ fprintf (file, "%ld", INTVAL (index));
++ fputc ('(', file);
++ fputs (reg_names[REGNO (base)], file);
++ }
++ else if (GET_CODE (index) == MULT
++ || REG_P (index))
++ {
++ if (GET_CODE (index) == MULT)
++ index = XEXP (index, 0);
++ fputc ('(', file);
++ fputs (reg_names[REGNO (base)], file);
++ fputc (',', file);
++ fputs (reg_names[REGNO (index)], file);
++ }
++ else
++ abort ();
++
++ fputc (')', file);
++ break;
++ }
++
++ case LO_SUM:
++ fprintf (file, "%%lo(");
++ ubicom32_print_operand (file, XEXP (addr, 1), 'L');
++ fprintf (file, ")(");
++ ubicom32_print_operand (file, XEXP (addr, 0), 0);
++ fprintf (file, ")");
++ break;
++
++ case CONST_INT:
++ fputc ('#', file);
++ output_addr_const (file, addr);
++ break;
++
++ default:
++ output_addr_const (file, addr);
++ break;
++ }
++}
++
++/* X and Y are two things to compare using CODE. Emit the compare insn and
++ return the rtx for the cc reg in the proper mode. */
++
++rtx
++ubicom32_gen_compare_reg (enum rtx_code code, rtx x, rtx y)
++{
++ enum machine_mode mode = SELECT_CC_MODE (code, x, y);
++ rtx cc_reg;
++
++ cc_reg = gen_rtx_REG (mode, CC_REGNUM);
++
++ emit_insn (gen_rtx_SET (VOIDmode, cc_reg,
++ gen_rtx_COMPARE (mode, x, y)));
++
++ return cc_reg;
++}
++
++/* Given a comparison code (EQ, NE, etc.) and the first operand of a COMPARE,
++ return the mode to be used for the comparison. */
++
++enum machine_mode
++ubicom32_select_cc_mode (enum rtx_code op, rtx x, rtx y)
++{
++ /* Is this a short compare? */
++ if (GET_MODE (x) == QImode
++ || GET_MODE (x) == HImode
++ || GET_MODE (y) == QImode
++ || GET_MODE (y) == HImode)
++ {
++ switch (op)
++ {
++ case EQ :
++ case NE :
++ return CCSZmode;
++
++ case GE:
++ case LT:
++ if (y == const0_rtx)
++ return CCSZNmode;
++
++ default :
++ return CCSmode;
++ }
++ }
++
++ /* We have a word compare. */
++ switch (op)
++ {
++ case EQ :
++ case NE :
++ return CCWZmode;
++
++ case GE :
++ case LT :
++ if (y == const0_rtx)
++ return CCWZNmode;
++
++ default :
++ return CCWmode;
++ }
++}
++
++/* Return TRUE or FALSE depending on whether the first SET in INSN
++ has source and destination with matching CC modes, and that the
++ CC mode is at least as constrained as REQ_MODE. */
++bool
++ubicom32_match_cc_mode (rtx insn, enum machine_mode req_mode)
++{
++ rtx set;
++ enum machine_mode set_mode;
++
++ set = PATTERN (insn);
++ if (GET_CODE (set) == PARALLEL)
++ set = XVECEXP (set, 0, 0);
++ gcc_assert (GET_CODE (set) == SET);
++ gcc_assert (GET_CODE (SET_SRC (set)) == COMPARE);
++
++ /* SET_MODE is the mode we have in the instruction. This must either
++ be the same or less restrictive that the required mode REQ_MODE. */
++ set_mode = GET_MODE (SET_DEST (set));
++
++ switch (req_mode)
++ {
++ case CCSZmode:
++ if (set_mode != CCSZmode)
++ return 0;
++ break;
++
++ case CCSZNmode:
++ if (set_mode != CCSZmode
++ && set_mode != CCSZNmode)
++ return 0;
++ break;
++
++ case CCSmode:
++ if (set_mode != CCSmode
++ && set_mode != CCSZmode
++ && set_mode != CCSZNmode)
++ return 0;
++ break;
++
++ case CCWZmode:
++ if (set_mode != CCWZmode)
++ return 0;
++ break;
++
++ case CCWZNmode:
++ if (set_mode != CCWZmode
++ && set_mode != CCWZNmode)
++ return 0;
++ break;
++
++ case CCWmode:
++ if (set_mode != CCWmode
++ && set_mode != CCWZmode
++ && set_mode != CCWZNmode)
++ return 0;
++ break;
++
++ default:
++ gcc_unreachable ();
++ }
++
++ return (GET_MODE (SET_SRC (set)) == set_mode);
++}
++
++/* Replace the comparison OP0 CODE OP1 by a semantically equivalent one
++ that we can implement more efficiently. */
++
++void
++ubicom32_canonicalize_comparison (enum rtx_code *code, rtx *op0, rtx *op1)
++{
++ /* If we have a REG and a MEM then compare the MEM with the REG and not
++ the other way round. */
++ if (REG_P (*op0) && MEM_P (*op1))
++ {
++ rtx tem = *op0;
++ *op0 = *op1;
++ *op1 = tem;
++ *code = swap_condition (*code);
++ return;
++ }
++
++ /* If we have a REG and a CONST_INT then we may want to reverse things
++ if the constant can be represented as an "I" constraint. */
++ if (REG_P (*op0) && CONST_INT_P (*op1) && satisfies_constraint_I (*op1))
++ {
++ rtx tem = *op0;
++ *op0 = *op1;
++ *op1 = tem;
++ *code = swap_condition (*code);
++ return;
++ }
++}
++
++/* Return the fixed registers used for condition codes. */
++
++static bool
++ubicom32_fixed_condition_code_regs (unsigned int *p1, unsigned int *p2)
++{
++ *p1 = CC_REGNUM;
++ *p2 = INVALID_REGNUM;
++
++ return true;
++}
++
++/* If two condition code modes are compatible, return a condition code
++ mode which is compatible with both. Otherwise, return
++ VOIDmode. */
++
++static enum machine_mode
++ubicom32_cc_modes_compatible (enum machine_mode m1, enum machine_mode m2)
++{
++ if (m1 == m2)
++ return m1;
++
++ if (GET_MODE_CLASS (m1) != MODE_CC || GET_MODE_CLASS (m2) != MODE_CC)
++ return VOIDmode;
++
++ switch (m1)
++ {
++ case CCWmode:
++ if (m2 == CCWZNmode || m2 == CCWZmode)
++ return m1;
++
++ return VOIDmode;
++
++ case CCWZNmode:
++ if (m2 == CCWmode)
++ return m2;
++
++ if (m2 == CCWZmode)
++ return m1;
++
++ return VOIDmode;
++
++ case CCWZmode:
++ if (m2 == CCWmode || m2 == CCWZNmode)
++ return m2;
++
++ return VOIDmode;
++
++ case CCSmode:
++ if (m2 == CCSZNmode || m2 == CCSZmode)
++ return m1;
++
++ return VOIDmode;
++
++ case CCSZNmode:
++ if (m2 == CCSmode)
++ return m2;
++
++ if (m2 == CCSZmode)
++ return m1;
++
++ return VOIDmode;
++
++ case CCSZmode:
++ if (m2 == CCSmode || m2 == CCSZNmode)
++ return m2;
++
++ return VOIDmode;
++
++ default:
++ gcc_unreachable ();
++ }
++}
++
++static rtx
++ubicom32_legitimize_fdpic_address_symbol (rtx orig, rtx reg, rtx fdpic_reg)
++{
++ int unspec;
++ rtx got_offs;
++ rtx got_offs_scaled;
++ rtx plus_scaled;
++ rtx tmp;
++ rtx new_rtx;
++
++ gcc_assert (reg != 0);
++
++ if (GET_CODE (orig) == SYMBOL_REF
++ && SYMBOL_REF_FUNCTION_P (orig))
++ unspec = UNSPEC_FDPIC_GOT_FUNCDESC;
++ else
++ unspec = UNSPEC_FDPIC_GOT;
++
++ got_offs = gen_reg_rtx (SImode);
++ tmp = gen_rtx_UNSPEC (Pmode, gen_rtvec (1, orig), unspec);
++ emit_move_insn (got_offs, tmp);
++
++ got_offs_scaled = gen_rtx_MULT (SImode, got_offs, GEN_INT (4));
++ plus_scaled = gen_rtx_PLUS (Pmode, fdpic_reg, got_offs_scaled);
++ new_rtx = gen_const_mem (Pmode, plus_scaled);
++ emit_move_insn (reg, new_rtx);
++
++ return reg;
++}
++
++static rtx
++ubicom32_legitimize_fdpic_address (rtx orig, rtx reg, rtx fdpic_reg)
++{
++ rtx addr = orig;
++ rtx new_rtx = orig;
++
++ if (GET_CODE (addr) == CONST || GET_CODE (addr) == PLUS)
++ {
++ rtx base;
++
++ if (GET_CODE (addr) == CONST)
++ {
++ addr = XEXP (addr, 0);
++ gcc_assert (GET_CODE (addr) == PLUS);
++ }
++
++ base = ubicom32_legitimize_fdpic_address_symbol (XEXP (addr, 0), reg, fdpic_reg);
++ return gen_rtx_PLUS (Pmode, base, XEXP (addr, 1));
++ }
++
++ return new_rtx;
++}
++
++/* Code generation. */
++
++void
++ubicom32_expand_movsi (rtx *operands)
++{
++ if (GET_CODE (operands[1]) == SYMBOL_REF
++ || (GET_CODE (operands[1]) == CONST
++ && GET_CODE (XEXP (operands[1], 0)) == PLUS
++ && GET_CODE (XEXP (XEXP (operands[1], 0), 0)) == SYMBOL_REF)
++ || CONSTANT_ADDRESS_P (operands[1]))
++ {
++ if (TARGET_FDPIC)
++ {
++ rtx tmp;
++ rtx fdpic_reg;
++
++ gcc_assert (can_create_pseudo_p ());
++ tmp = gen_reg_rtx (Pmode);
++ fdpic_reg = get_hard_reg_initial_val (SImode, FDPIC_REGNUM);
++ if (GET_CODE (operands[1]) == SYMBOL_REF
++ || GET_CODE (operands[1]) == LABEL_REF)
++ operands[1] = ubicom32_legitimize_fdpic_address_symbol (operands[1], tmp, fdpic_reg);
++ else
++ operands[1] = ubicom32_legitimize_fdpic_address (operands[1], tmp, fdpic_reg);
++ }
++ else
++ {
++ rtx tmp;
++ enum machine_mode mode;
++
++ /* We want to avoid reusing operand 0 if we can because it limits
++ our ability to optimize later. */
++ tmp = ! can_create_pseudo_p () ? operands[0] : gen_reg_rtx (Pmode);
++
++ mode = GET_MODE (operands[0]);
++ emit_insn (gen_rtx_SET (VOIDmode, tmp,
++ gen_rtx_HIGH (mode, operands[1])));
++ operands[1] = gen_rtx_LO_SUM (mode, tmp, operands[1]);
++ if (can_create_pseudo_p() && ! REG_P (operands[0]))
++ {
++ tmp = gen_reg_rtx (mode);
++ emit_insn (gen_rtx_SET (VOIDmode, tmp, operands[1]));
++ operands[1] = tmp;
++ }
++ }
++ }
++}
++
++/* Emit code for addsi3. */
++
++void
++ubicom32_expand_addsi3 (rtx *operands)
++{
++ rtx op, clob;
++
++ if (can_create_pseudo_p ())
++ {
++ /* If we have a non-data reg for operand 1 then prefer that over
++ a CONST_INT in operand 2. */
++ if (! ubicom32_data_register_operand (operands[1], GET_MODE (operands[1]))
++ && CONST_INT_P (operands[2]))
++ operands[2] = copy_to_mode_reg (SImode, operands[2]);
++
++ if (CONST_INT_P (operands[2]) && ! satisfies_constraint_I (operands[2]))
++ operands[2] = copy_to_mode_reg (SImode, operands[2]);
++ }
++
++ /* Emit the instruction. */
++
++ op = gen_rtx_SET (VOIDmode, operands[0],
++ gen_rtx_PLUS (SImode, operands[1], operands[2]));
++
++ if (! can_create_pseudo_p ())
++ {
++ /* Reload doesn't know about the flags register, and doesn't know that
++ it doesn't want to clobber it. We can only do this with PLUS. */
++ emit_insn (op);
++ }
++ else
++ {
++ clob = gen_rtx_CLOBBER (VOIDmode, gen_rtx_REG (CCmode, CC_REGNUM));
++ emit_insn (gen_rtx_PARALLEL (VOIDmode, gen_rtvec (2, op, clob)));
++ }
++}
++
++/* Emit code for mulsi3. Return 1 if we have generated all the code
++ necessary to do the multiplication. */
++
++int
++ubicom32_emit_mult_sequence (rtx *operands)
++{
++ if (! ubicom32_v4)
++ {
++ rtx a1, a1_1, a2;
++ rtx b1, b1_1, b2;
++ rtx mac_lo_rtx;
++ rtx t1, t2, t3;
++
++ /* Give up if we cannot create new pseudos. */
++ if (!can_create_pseudo_p())
++ return 0;
++
++ /* Synthesize 32-bit multiplication using 16-bit operations:
++
++ a1 = highpart (a)
++ a2 = lowpart (a)
++
++ b1 = highpart (b)
++ b2 = lowpart (b)
++
++ c = (a1 * b1) << 32 + (a1 * b2) << 16 + (a2 * b1) << 16 + a2 * b2
++ = 0 + (a1 * b2) << 16 + (a2 * b1) << 16 + a2 * b2
++ ^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^ ^^^^^^^
++ Signed Signed Unsigned */
++
++ if (!ubicom32_data_register_operand (operands[1], GET_MODE (operands[1])))
++ {
++ rtx op1;
++
++ op1 = gen_reg_rtx (SImode);
++ emit_move_insn (op1, operands[1]);
++ operands[1] = op1;
++ }
++
++ if (!ubicom32_data_register_operand (operands[2], GET_MODE (operands[2])))
++ {
++ rtx op2;
++
++ op2 = gen_reg_rtx (SImode);
++ emit_move_insn (op2, operands[2]);
++ operands[2] = op2;
++ }
++
++ /* a1 = highpart (a) */
++ a1 = gen_reg_rtx (HImode);
++ a1_1 = gen_reg_rtx (SImode);
++ emit_insn (gen_ashrsi3 (a1_1, operands[1], GEN_INT (16)));
++ emit_move_insn (a1, gen_lowpart (HImode, a1_1));
++
++ /* a2 = lowpart (a) */
++ a2 = gen_reg_rtx (HImode);
++ emit_move_insn (a2, gen_lowpart (HImode, operands[1]));
++
++ /* b1 = highpart (b) */
++ b1 = gen_reg_rtx (HImode);
++ b1_1 = gen_reg_rtx (SImode);
++ emit_insn (gen_ashrsi3 (b1_1, operands[2], GEN_INT (16)));
++ emit_move_insn (b1, gen_lowpart (HImode, b1_1));
++
++ /* b2 = lowpart (b) */
++ b2 = gen_reg_rtx (HImode);
++ emit_move_insn (b2, gen_lowpart (HImode, operands[2]));
++
++ /* t1 = (a1 * b2) << 16 */
++ t1 = gen_reg_rtx (SImode);
++ mac_lo_rtx = gen_rtx_REG (SImode, ACC0_LO_REGNUM);
++ emit_insn (gen_mulhisi3 (mac_lo_rtx, a1, b2));
++ emit_insn (gen_ashlsi3 (t1, mac_lo_rtx, GEN_INT (16)));
++
++ /* t2 = (a2 * b1) << 16 */
++ t2 = gen_reg_rtx (SImode);
++ emit_insn (gen_mulhisi3 (mac_lo_rtx, a2, b1));
++ emit_insn (gen_ashlsi3 (t2, mac_lo_rtx, GEN_INT (16)));
++
++ /* mac_lo = a2 * b2 */
++ emit_insn (gen_umulhisi3 (mac_lo_rtx, a2, b2));
++
++ /* t3 = t1 + t2 */
++ t3 = gen_reg_rtx (SImode);
++ emit_insn (gen_addsi3 (t3, t1, t2));
++
++ /* c = t3 + mac_lo_rtx */
++ emit_insn (gen_addsi3 (operands[0], mac_lo_rtx, t3));
++
++ return 1;
++ }
++ else
++ {
++ rtx acc_rtx;
++
++ /* Give up if we cannot create new pseudos. */
++ if (!can_create_pseudo_p())
++ return 0;
++
++ if (!ubicom32_data_register_operand (operands[1], GET_MODE (operands[1])))
++ {
++ rtx op1;
++
++ op1 = gen_reg_rtx (SImode);
++ emit_move_insn (op1, operands[1]);
++ operands[1] = op1;
++ }
++
++ if (!ubicom32_data_register_operand (operands[2], GET_MODE (operands[2])))
++ {
++ rtx op2;
++
++ op2 = gen_reg_rtx (SImode);
++ emit_move_insn (op2, operands[2]);
++ operands[2] = op2;
++ }
++
++ acc_rtx = gen_reg_rtx (DImode);
++ emit_insn (gen_umulsidi3 (acc_rtx, operands[1], operands[2]));
++ emit_move_insn (operands[0], gen_lowpart (SImode, acc_rtx));
++
++ return 1;
++ }
++}
++
++/* Move the integer value VAL into OPERANDS[0]. */
++
++void
++ubicom32_emit_move_const_int (rtx dest, rtx imm)
++{
++ rtx xoperands[2];
++
++ xoperands[0] = dest;
++ xoperands[1] = imm;
++
++ /* Treat mem destinations separately. Values must be explicitly sign
++ extended. */
++ if (MEM_P (dest))
++ {
++ rtx low_hword_mem;
++ rtx low_hword_addr;
++
++ /* Emit shorter sequence for signed 7-bit quantities. */
++ if (satisfies_constraint_I (imm))
++ {
++ output_asm_insn ("move.4\t%0, %1", xoperands);
++ return;
++ }
++
++ /* Special case for pushing constants. */
++ if (GET_CODE (XEXP (dest, 0)) == PRE_DEC
++ && XEXP (XEXP (dest, 0), 0) == stack_pointer_rtx)
++ {
++ output_asm_insn ("movei\t-4(sp)++, #%%hi(%E1)", xoperands);
++ output_asm_insn ("movei\t2(sp), #%%lo(%E1)", xoperands);
++ return;
++ }
++
++ /* See if we can add 2 to the original address. This is only
++ possible if the original address is of the form REG or
++ REG+const. */
++ low_hword_addr = plus_constant (XEXP (dest, 0), 2);
++ if (ubicom32_legitimate_address_p (HImode, low_hword_addr, 1))
++ {
++ low_hword_mem = gen_rtx_MEM (HImode, low_hword_addr);
++ MEM_COPY_ATTRIBUTES (low_hword_mem, dest);
++ output_asm_insn ("movei\t%0, #%%hi(%E1)", xoperands);
++ xoperands[0] = low_hword_mem;
++ output_asm_insn ("movei\t%0, #%%lo(%E1)", xoperands);
++ return;
++ }
++
++ /* The original address is too complex. We need to use a
++ scratch memory by (sp) and move that to the original
++ destination. */
++ if (! reg_mentioned_p (stack_pointer_rtx, dest))
++ {
++ output_asm_insn ("movei\t-4(sp)++, #%%hi(%E1)", xoperands);
++ output_asm_insn ("movei\t2(sp), #%%lo(%E1)", xoperands);
++ output_asm_insn ("move.4\t%0, (sp)4++", xoperands);
++ return;
++ }
++
++ /* Our address mentions the stack pointer so we need to
++ use our scratch data register here as well as scratch
++ memory. */
++ output_asm_insn ("movei\t-4(sp)++, #%%hi(%E1)", xoperands);
++ output_asm_insn ("movei\t2(sp), #%%lo(%E1)", xoperands);
++ output_asm_insn ("move.4\td15, (sp)4++", xoperands);
++ output_asm_insn ("move.4\t%0, d15", xoperands);
++ return;
++ }
++
++ /* Move into registers are zero extended by default. */
++ if (! REG_P (dest))
++ abort ();
++
++ if (satisfies_constraint_N (imm))
++ {
++ output_asm_insn ("movei\t%0, %1", xoperands);
++ return;
++ }
++
++ if (INTVAL (xoperands[1]) >= 0xff80
++ && INTVAL (xoperands[1]) < 0x10000)
++ {
++ xoperands[1] = GEN_INT (INTVAL (xoperands[1]) - 0x10000);
++ output_asm_insn ("move.2\t%0, %1", xoperands);
++ return;
++ }
++
++ if ((REGNO_REG_CLASS (REGNO (xoperands[0])) == ADDRESS_REGS
++ || REGNO_REG_CLASS (REGNO (xoperands[0])) == FDPIC_REG)
++ && ((INTVAL (xoperands[1]) & 0x80000000) == 0))
++ {
++ output_asm_insn ("moveai\t%0, #%%hi(%E1)", xoperands);
++ if ((INTVAL (xoperands[1]) & 0x7f) != 0)
++ output_asm_insn ("lea.1\t%0, %%lo(%E1)(%0)", xoperands);
++ return;
++ }
++
++ if ((INTVAL (xoperands[1]) & 0xffff0000) == 0)
++ {
++ output_asm_insn ("movei\t%0, #%%lo(%E1)", xoperands);
++ output_asm_insn ("move.2\t%0, %0", xoperands);
++ return;
++ }
++
++ /* This is very expensive. The constant is so large that we
++ need to use the stack to do the load. */
++ output_asm_insn ("movei\t-4(sp)++, #%%hi(%E1)", xoperands);
++ output_asm_insn ("movei\t2(sp), #%%lo(%E1)", xoperands);
++ output_asm_insn ("move.4\t%0, (sp)4++", xoperands);
++}
++
++/* Stack layout. Prologue/Epilogue. */
++
++static int save_regs_size;
++
++static void
++ubicom32_layout_frame (void)
++{
++ int regno;
++
++ memset ((char *) &save_regs[0], 0, sizeof (save_regs));
++ nregs = 0;
++ frame_size = get_frame_size ();
++
++ if (frame_pointer_needed || df_regs_ever_live_p (FRAME_POINTER_REGNUM))
++ {
++ save_regs[FRAME_POINTER_REGNUM] = 1;
++ ++nregs;
++ }
++
++ if (current_function_is_leaf && ! df_regs_ever_live_p (LINK_REGNO))
++ ubicom32_can_use_calli_to_ret = 1;
++ else
++ {
++ ubicom32_can_use_calli_to_ret = 0;
++ save_regs[LINK_REGNO] = 1;
++ ++nregs;
++ }
++
++ /* Figure out which register(s) needs to be saved. */
++ for (regno = 0; regno <= LAST_ADDRESS_REGNUM; regno++)
++ if (df_regs_ever_live_p(regno)
++ && ! call_used_regs[regno]
++ && ! fixed_regs[regno]
++ && ! save_regs[regno])
++ {
++ save_regs[regno] = 1;
++ ++nregs;
++ }
++
++ save_regs_size = 4 * nregs;
++}
++
++static void
++ubicom32_emit_add_movsi (int regno, int adj)
++{
++ rtx x;
++ rtx reg = gen_rtx_REG (SImode, regno);
++
++ adj += 4;
++ if (adj > 8 * 4)
++ {
++ x = emit_insn (gen_addsi3 (stack_pointer_rtx, stack_pointer_rtx,
++ GEN_INT (-adj)));
++ RTX_FRAME_RELATED_P (x) = 1;
++ x = emit_move_insn (gen_rtx_MEM (SImode, stack_pointer_rtx), reg);
++ }
++ else
++ {
++ rtx addr = gen_rtx_PRE_MODIFY (Pmode, stack_pointer_rtx,
++ gen_rtx_PLUS (Pmode, stack_pointer_rtx,
++ GEN_INT (-adj)));
++ x = emit_move_insn (gen_rtx_MEM (SImode, addr), reg);
++ }
++ RTX_FRAME_RELATED_P (x) = 1;
++}
++
++void
++ubicom32_expand_prologue (void)
++{
++ rtx x;
++ int regno;
++ int outgoing_args_size = crtl->outgoing_args_size;
++ int adj;
++
++ if (ubicom32_naked_function_p ())
++ return;
++
++ ubicom32_builtin_saveregs ();
++
++ ubicom32_layout_frame ();
++ adj = (outgoing_args_size + get_frame_size () + save_regs_size
++ + crtl->args.pretend_args_size);
++
++ if (!adj)
++ ;
++ else if (outgoing_args_size + save_regs_size < 508
++ && get_frame_size () + save_regs_size > 508)
++ {
++ int i = 0;
++ x = gen_addsi3 (stack_pointer_rtx, stack_pointer_rtx,
++ GEN_INT (-adj));
++ x = emit_insn (x);
++ RTX_FRAME_RELATED_P (x) = 1;
++
++ for (regno = LAST_ADDRESS_REGNUM; regno >= 0; --regno)
++ if (save_regs[regno] && regno != LINK_REGNO)
++ {
++ x = gen_rtx_MEM (SImode,
++ gen_rtx_PLUS (Pmode,
++ stack_pointer_rtx,
++ GEN_INT (i * 4 + outgoing_args_size)));
++ x = emit_move_insn (x, gen_rtx_REG (SImode, regno));
++ RTX_FRAME_RELATED_P (x) = 1;
++ ++i;
++ }
++ if (save_regs[LINK_REGNO])
++ {
++ x = gen_rtx_MEM (SImode,
++ gen_rtx_PLUS (Pmode,
++ stack_pointer_rtx,
++ GEN_INT (i * 4 + outgoing_args_size)));
++ x = emit_move_insn (x, gen_rtx_REG (SImode, LINK_REGNO));
++ RTX_FRAME_RELATED_P (x) = 1;
++ }
++ }
++ else
++ {
++ int regno;
++ int adj = get_frame_size () + crtl->args.pretend_args_size;
++ int i = 0;
++
++ if (save_regs[LINK_REGNO])
++ {
++ ubicom32_emit_add_movsi (LINK_REGNO, adj);
++ ++i;
++ }
++
++ for (regno = 0; regno <= LAST_ADDRESS_REGNUM; ++regno)
++ if (save_regs[regno] && regno != LINK_REGNO)
++ {
++ if (i)
++ {
++ rtx mem = gen_rtx_MEM (SImode,
++ gen_rtx_PRE_DEC (Pmode,
++ stack_pointer_rtx));
++ x = emit_move_insn (mem, gen_rtx_REG (SImode, regno));
++ RTX_FRAME_RELATED_P (x) = 1;
++ }
++ else
++ ubicom32_emit_add_movsi (regno, adj);
++ ++i;
++ }
++
++ if (outgoing_args_size || (!i && adj))
++ {
++ x = gen_addsi3 (stack_pointer_rtx, stack_pointer_rtx,
++ GEN_INT (-outgoing_args_size - (i ? 0 : adj)));
++ x = emit_insn (x);
++ RTX_FRAME_RELATED_P (x) = 1;
++ }
++ }
++
++ if (frame_pointer_needed)
++ {
++ int fp_adj = save_regs_size + outgoing_args_size;
++ x = gen_addsi3 (frame_pointer_rtx, stack_pointer_rtx,
++ GEN_INT (fp_adj));
++ x = emit_insn (x);
++ RTX_FRAME_RELATED_P (x) = 1;
++ }
++}
++
++void
++ubicom32_expand_epilogue (void)
++{
++ rtx x;
++ int regno;
++ int outgoing_args_size = crtl->outgoing_args_size;
++ int adj;
++ int i;
++
++ if (ubicom32_naked_function_p ())
++ {
++ emit_jump_insn (gen_return_internal (gen_rtx_REG (SImode,
++ LINK_REGNO)));
++ return;
++ }
++
++ if (cfun->calls_alloca)
++ {
++ x = gen_addsi3 (stack_pointer_rtx, frame_pointer_rtx,
++ GEN_INT (-save_regs_size));
++ emit_insn (x);
++ outgoing_args_size = 0;
++ }
++
++ if (outgoing_args_size)
++ {
++ x = gen_addsi3 (stack_pointer_rtx, stack_pointer_rtx,
++ GEN_INT (outgoing_args_size));
++ emit_insn (x);
++ }
++
++ i = 0;
++ for (regno = LAST_ADDRESS_REGNUM; regno >= 0; --regno)
++ if (save_regs[regno] && regno != LINK_REGNO)
++ {
++ x = gen_rtx_MEM (SImode, gen_rtx_POST_INC (Pmode, stack_pointer_rtx));
++ emit_move_insn (gen_rtx_REG (SImode, regno), x);
++ ++i;
++ }
++
++ /* Do we have to adjust the stack after we've finished restoring regs? */
++ adj = get_frame_size() + crtl->args.pretend_args_size;
++ if (cfun->stdarg)
++ adj += UBICOM32_FUNCTION_ARG_REGS * UNITS_PER_WORD;
++
++#if 0
++ if (crtl->calls_eh_return && 0)
++ {
++ if (save_regs[LINK_REGNO])
++ {
++ x = gen_rtx_MEM (SImode, gen_rtx_POST_INC (Pmode, stack_pointer_rtx));
++ emit_move_insn (gen_rtx_REG (SImode, LINK_REGNO), x);
++ }
++
++ if (adj)
++ {
++ x = gen_addsi3 (stack_pointer_rtx, stack_pointer_rtx,
++ GEN_INT (adj));
++ x = emit_insn (x);
++ }
++
++ /* Perform the additional bump for __throw. */
++ emit_insn (gen_addsi3 (stack_pointer_rtx, stack_pointer_rtx,
++ EH_RETURN_STACKADJ_RTX));
++ emit_jump_insn (gen_eh_return_internal ());
++ return;
++ }
++#endif
++
++ if (save_regs[LINK_REGNO])
++ {
++ if (adj >= 4 && adj <= (6 * 4))
++ {
++ x = GEN_INT (adj + 4);
++ emit_jump_insn (gen_return_from_post_modify_sp (x));
++ return;
++ }
++
++ if (adj == 0)
++ {
++ x = gen_rtx_MEM (SImode, gen_rtx_POST_INC (Pmode, stack_pointer_rtx));
++ emit_jump_insn (gen_return_internal (x));
++ return;
++ }
++
++ x = gen_rtx_MEM (SImode, gen_rtx_POST_INC (Pmode, stack_pointer_rtx));
++ emit_move_insn (gen_rtx_REG (SImode, LINK_REGNO), x);
++ }
++
++ if (adj)
++ {
++ x = gen_addsi3 (stack_pointer_rtx, stack_pointer_rtx,
++ GEN_INT (adj));
++ x = emit_insn (x);
++ adj = 0;
++ }
++
++ /* Given that we've just done all the hard work here we may as well use
++ a calli to return. */
++ ubicom32_can_use_calli_to_ret = 1;
++ emit_jump_insn (gen_return_internal (gen_rtx_REG (SImode, LINK_REGNO)));
++}
++
++void
++ubicom32_expand_call_fdpic (rtx *operands)
++{
++ rtx c;
++ rtx addr;
++ rtx fdpic_reg = get_hard_reg_initial_val (SImode, FDPIC_REGNUM);
++
++ addr = XEXP (operands[0], 0);
++
++ c = gen_call_fdpic (addr, operands[1], fdpic_reg);
++ emit_call_insn (c);
++}
++
++void
++ubicom32_expand_call_value_fdpic (rtx *operands)
++{
++ rtx c;
++ rtx addr;
++ rtx fdpic_reg = get_hard_reg_initial_val (SImode, FDPIC_REGNUM);
++
++ addr = XEXP (operands[1], 0);
++
++ c = gen_call_value_fdpic (operands[0], addr, operands[2], fdpic_reg);
++ emit_call_insn (c);
++}
++
++void
++ubicom32_expand_eh_return (rtx *operands)
++{
++ if (REG_P (operands[0])
++ || REGNO (operands[0]) != EH_RETURN_STACKADJ_REGNO)
++ {
++ rtx sp = EH_RETURN_STACKADJ_RTX;
++ emit_move_insn (sp, operands[0]);
++ operands[0] = sp;
++ }
++
++ if (REG_P (operands[1])
++ || REGNO (operands[1]) != EH_RETURN_HANDLER_REGNO)
++ {
++ rtx ra = EH_RETURN_HANDLER_RTX;
++ emit_move_insn (ra, operands[1]);
++ operands[1] = ra;
++ }
++}
++
++/* Compute the offsets between eliminable registers. */
++
++int
++ubicom32_initial_elimination_offset (int from, int to)
++{
++ ubicom32_layout_frame ();
++ if (from == FRAME_POINTER_REGNUM && to == STACK_POINTER_REGNUM)
++ return save_regs_size + crtl->outgoing_args_size;
++
++ if (from == ARG_POINTER_REGNUM && to == FRAME_POINTER_REGNUM)
++ return get_frame_size ()/* + save_regs_size */;
++
++ if (from == ARG_POINTER_REGNUM && to == STACK_POINTER_REGNUM)
++ return get_frame_size ()
++ + crtl->outgoing_args_size
++ + save_regs_size;
++
++ return 0;
++}
++
++/* Return 1 if it is appropriate to emit `ret' instructions in the
++ body of a function. Do this only if the epilogue is simple, needing a
++ couple of insns. Prior to reloading, we can't tell how many registers
++ must be saved, so return 0 then. Return 0 if there is no frame
++ marker to de-allocate.
++
++ If NON_SAVING_SETJMP is defined and true, then it is not possible
++ for the epilogue to be simple, so return 0. This is a special case
++ since NON_SAVING_SETJMP will not cause regs_ever_live to change
++ until final, but jump_optimize may need to know sooner if a
++ `return' is OK. */
++
++int
++ubicom32_can_use_return_insn_p (void)
++{
++ if (! reload_completed || frame_pointer_needed)
++ return 0;
++
++ return 1;
++}
++
++/* Attributes and CC handling. */
++
++/* Handle an attribute requiring a FUNCTION_DECL; arguments as in
++ struct attribute_spec.handler. */
++static tree
++ubicom32_handle_fndecl_attribute (tree *node, tree name,
++ tree args ATTRIBUTE_UNUSED,
++ int flags ATTRIBUTE_UNUSED,
++ bool *no_add_attrs)
++{
++ if (TREE_CODE (*node) != FUNCTION_DECL)
++ {
++ warning ("'%s' attribute only applies to functions",
++ IDENTIFIER_POINTER (name));
++ *no_add_attrs = true;
++ }
++
++ return NULL_TREE;
++}
++
++/* A C expression that places additional restrictions on the register class to
++ use when it is necessary to copy value X into a register in class CLASS.
++ The value is a register class; perhaps CLASS, or perhaps another, smaller
++ class. On many machines, the following definition is safe:
++
++ #define PREFERRED_RELOAD_CLASS(X,CLASS) CLASS
++
++ Sometimes returning a more restrictive class makes better code. For
++ example, on the 68000, when X is an integer constant that is in range for a
++ `moveq' instruction, the value of this macro is always `DATA_REGS' as long
++ as CLASS includes the data registers. Requiring a data register guarantees
++ that a `moveq' will be used.
++
++ If X is a `const_double', by returning `NO_REGS' you can force X into a
++ memory constant. This is useful on certain machines where immediate
++ floating values cannot be loaded into certain kinds of registers. */
++
++enum reg_class
++ubicom32_preferred_reload_class (rtx x, enum reg_class class)
++{
++ /* If a symbolic constant, HIGH or a PLUS is reloaded,
++ it is most likely being used as an address, so
++ prefer ADDRESS_REGS. If 'class' is not a superset
++ of ADDRESS_REGS, e.g. DATA_REGS, then reject this reload. */
++ if (GET_CODE (x) == PLUS
++ || GET_CODE (x) == HIGH
++ || GET_CODE (x) == LABEL_REF
++ || GET_CODE (x) == SYMBOL_REF
++ || GET_CODE (x) == CONST)
++ {
++ if (reg_class_subset_p (ALL_ADDRESS_REGS, class))
++ return ALL_ADDRESS_REGS;
++
++ return NO_REGS;
++ }
++
++ return class;
++}
++
++/* Function arguments and varargs. */
++
++int
++ubicom32_reg_parm_stack_space (tree fndecl)
++{
++ return 0;
++
++ if (fndecl
++ && TYPE_ARG_TYPES (TREE_TYPE (fndecl)) != 0
++ && (TREE_VALUE (tree_last (TYPE_ARG_TYPES (TREE_TYPE (fndecl))))
++ != void_type_node))
++ return UBICOM32_FUNCTION_ARG_REGS * UNITS_PER_WORD;
++
++ return 0;
++}
++
++/* Flush the argument registers to the stack for a stdarg function;
++ return the new argument pointer. */
++
++rtx
++ubicom32_builtin_saveregs (void)
++{
++ int regno;
++
++ if (! cfun->stdarg)
++ return 0;
++
++ for (regno = UBICOM32_FUNCTION_ARG_REGS - 1; regno >= 0; --regno)
++ emit_move_insn (gen_rtx_MEM (SImode,
++ gen_rtx_PRE_DEC (SImode,
++ stack_pointer_rtx)),
++ gen_rtx_REG (SImode, regno));
++
++ return stack_pointer_rtx;
++}
++
++void
++ubicom32_va_start (tree valist, rtx nextarg)
++{
++ std_expand_builtin_va_start (valist, nextarg);
++}
++
++rtx
++ubicom32_va_arg (tree valist, tree type)
++{
++ HOST_WIDE_INT size, rsize;
++ tree addr, incr, tmp;
++ rtx addr_rtx;
++ int indirect = 0;
++
++ /* Round up sizeof(type) to a word. */
++ size = int_size_in_bytes (type);
++ rsize = (size + UNITS_PER_WORD - 1) & -UNITS_PER_WORD;
++
++ /* Large types are passed by reference. */
++ if (size > 8)
++ {
++ indirect = 1;
++ size = rsize = UNITS_PER_WORD;
++ }
++
++ incr = valist;
++ addr = incr = save_expr (incr);
++
++ /* FIXME Nat's version - is it correct? */
++ tmp = fold_convert (ptr_type_node, size_int (rsize));
++ tmp = build2 (PLUS_EXPR, ptr_type_node, incr, tmp);
++ incr = fold (tmp);
++
++ /* FIXME Nat's version - is it correct? */
++ incr = build2 (MODIFY_EXPR, ptr_type_node, valist, incr);
++
++ TREE_SIDE_EFFECTS (incr) = 1;
++ expand_expr (incr, const0_rtx, VOIDmode, EXPAND_NORMAL);
++
++ addr_rtx = expand_expr (addr, NULL, Pmode, EXPAND_NORMAL);
++
++ if (size < UNITS_PER_WORD)
++ emit_insn (gen_addsi3 (addr_rtx, addr_rtx,
++ GEN_INT (UNITS_PER_WORD - size)));
++
++ if (indirect)
++ {
++ addr_rtx = force_reg (Pmode, addr_rtx);
++ addr_rtx = gen_rtx_MEM (Pmode, addr_rtx);
++ set_mem_alias_set (addr_rtx, get_varargs_alias_set ());
++ }
++
++ return addr_rtx;
++}
++
++void
++init_cumulative_args (CUMULATIVE_ARGS *cum, tree fntype, rtx libname,
++ int indirect ATTRIBUTE_UNUSED)
++{
++ cum->nbytes = 0;
++
++ if (!libname)
++ {
++ cum->stdarg = (TYPE_ARG_TYPES (fntype) != 0
++ && (TREE_VALUE (tree_last (TYPE_ARG_TYPES (fntype)))
++ != void_type_node));
++ }
++}
++
++/* Return an RTX to represent where a value in mode MODE will be passed
++ to a function. If the result is 0, the argument will be pushed. */
++
++rtx
++function_arg (CUMULATIVE_ARGS *cum, enum machine_mode mode, tree type,
++ int named ATTRIBUTE_UNUSED)
++{
++ rtx result = 0;
++ int size, align;
++ int nregs = UBICOM32_FUNCTION_ARG_REGS;
++
++ /* Figure out the size of the object to be passed. */
++ if (mode == BLKmode)
++ size = int_size_in_bytes (type);
++ else
++ size = GET_MODE_SIZE (mode);
++
++ /* Figure out the alignment of the object to be passed. */
++ align = size;
++
++ cum->nbytes = (cum->nbytes + 3) & ~3;
++
++ /* Don't pass this arg via a register if all the argument registers
++ are used up. */
++ if (cum->nbytes >= nregs * UNITS_PER_WORD)
++ return 0;
++
++ /* Don't pass this arg via a register if it would be split between
++ registers and memory. */
++ result = gen_rtx_REG (mode, cum->nbytes / UNITS_PER_WORD);
++
++ return result;
++}
++
++rtx
++function_incoming_arg (CUMULATIVE_ARGS *cum, enum machine_mode mode, tree type,
++ int named ATTRIBUTE_UNUSED)
++{
++ if (cfun->stdarg)
++ return 0;
++
++ return function_arg (cum, mode, type, named);
++}
++
++
++/* Implement hook TARGET_ARG_PARTIAL_BYTES.
++
++ Returns the number of bytes at the beginning of an argument that
++ must be put in registers. The value must be zero for arguments
++ that are passed entirely in registers or that are entirely pushed
++ on the stack. */
++static int
++ubicom32_arg_partial_bytes (CUMULATIVE_ARGS *cum, enum machine_mode mode,
++ tree type, bool named ATTRIBUTE_UNUSED)
++{
++ int size, diff;
++
++ int nregs = UBICOM32_FUNCTION_ARG_REGS;
++
++ /* round up to full word */
++ cum->nbytes = (cum->nbytes + 3) & ~3;
++
++ if (targetm.calls.pass_by_reference (cum, mode, type, named))
++ return 0;
++
++ /* number of bytes left in registers */
++ diff = nregs*UNITS_PER_WORD - cum->nbytes;
++
++ /* regs all used up */
++ if (diff <= 0)
++ return 0;
++
++ /* Figure out the size of the object to be passed. */
++ if (mode == BLKmode)
++ size = int_size_in_bytes (type);
++ else
++ size = GET_MODE_SIZE (mode);
++
++ /* enough space left in regs for size */
++ if (size <= diff)
++ return 0;
++
++ /* put diff bytes in regs and rest on stack */
++ return diff;
++
++}
++
++static bool
++ubicom32_pass_by_reference (CUMULATIVE_ARGS *ca ATTRIBUTE_UNUSED,
++ enum machine_mode mode, const_tree type,
++ bool named ATTRIBUTE_UNUSED)
++{
++ int size;
++
++ if (type)
++ size = int_size_in_bytes (type);
++ else
++ size = GET_MODE_SIZE (mode);
++
++ return size <= 0 || size > 8;
++}
++
++static bool
++ubicom32_callee_copies (CUMULATIVE_ARGS *ca ATTRIBUTE_UNUSED,
++ enum machine_mode mode, const_tree type,
++ bool named ATTRIBUTE_UNUSED)
++{
++ int size;
++
++ if (type)
++ size = int_size_in_bytes (type);
++ else
++ size = GET_MODE_SIZE (mode);
++
++ return size <= 0 || size > 8;
++}
++
++static bool
++ubicom32_return_in_memory (const_tree type, const_tree fntype ATTRIBUTE_UNUSED)
++{
++ int size, mode;
++
++ if (!type)
++ return true;
++
++ size = int_size_in_bytes(type);
++ if (size > 8)
++ return true;
++
++ mode = TYPE_MODE(type);
++ if (mode == BLKmode)
++ return true;
++
++ return false;
++}
++
++/* Return true if a given register number REGNO is acceptable for machine
++ mode MODE. */
++bool
++ubicom32_hard_regno_mode_ok (unsigned int regno, enum machine_mode mode)
++{
++ /* If we're not at least a v3 ISA then ACC0_HI is only 16 bits. */
++ if (! ubicom32_v3)
++ {
++ if (regno == ACC0_HI_REGNUM)
++ return (mode == QImode || mode == HImode);
++ }
++
++ /* Only the flags reg can hold CCmode. */
++ if (GET_MODE_CLASS (mode) == MODE_CC)
++ return regno == CC_REGNUM;
++
++ /* We restrict the choice of DImode registers to only being address,
++ data or accumulator regs. We also restrict them to only start on
++ even register numbers so we never have to worry about partial
++ overlaps between operands in instructions. */
++ if (GET_MODE_SIZE (mode) > 4)
++ {
++ switch (REGNO_REG_CLASS (regno))
++ {
++ case ADDRESS_REGS:
++ case DATA_REGS:
++ case ACC_REGS:
++ return (regno & 1) == 0;
++
++ default:
++ return false;
++ }
++ }
++
++ return true;
++}
++
++/* The macros REG_OK_FOR..._P assume that the arg is a REG rtx
++ and check its validity for a certain class.
++ We have two alternate definitions for each of them.
++ The usual definition accepts all pseudo regs; the other rejects
++ them unless they have been allocated suitable hard regs.
++ The symbol REG_OK_STRICT causes the latter definition to be used.
++
++ Most source files want to accept pseudo regs in the hope that
++ they will get allocated to the class that the insn wants them to be in.
++ Source files for reload pass need to be strict.
++ After reload, it makes no difference, since pseudo regs have
++ been eliminated by then.
++
++ These assume that REGNO is a hard or pseudo reg number.
++ They give nonzero only if REGNO is a hard reg of the suitable class
++ or a pseudo reg currently allocated to a suitable hard reg.
++ Since they use reg_renumber, they are safe only once reg_renumber
++ has been allocated, which happens in local-alloc.c. */
++
++int
++ubicom32_regno_ok_for_base_p (int regno, int strict)
++{
++ if ((regno >= FIRST_ADDRESS_REGNUM && regno <= STACK_POINTER_REGNUM)
++ || (!strict
++ && (regno >= FIRST_PSEUDO_REGISTER
++ || regno == ARG_POINTER_REGNUM))
++ || (strict && (reg_renumber
++ && reg_renumber[regno] >= FIRST_ADDRESS_REGNUM
++ && reg_renumber[regno] <= STACK_POINTER_REGNUM)))
++ return 1;
++
++ return 0;
++}
++
++int
++ubicom32_regno_ok_for_index_p (int regno, int strict)
++{
++ if ((regno >= FIRST_DATA_REGNUM && regno <= LAST_DATA_REGNUM)
++ || (!strict && regno >= FIRST_PSEUDO_REGISTER)
++ || (strict && (reg_renumber
++ && reg_renumber[regno] >= FIRST_DATA_REGNUM
++ && reg_renumber[regno] <= LAST_DATA_REGNUM)))
++ return 1;
++
++ return 0;
++}
++
++/* Returns 1 if X is a valid index register. STRICT is 1 if only hard
++ registers should be accepted. Accept either REG or SUBREG where a
++ register is valid. */
++
++static bool
++ubicom32_is_index_reg (rtx x, int strict)
++{
++ if ((REG_P (x) && ubicom32_regno_ok_for_index_p (REGNO (x), strict))
++ || (GET_CODE (x) == SUBREG && REG_P (SUBREG_REG (x))
++ && ubicom32_regno_ok_for_index_p (REGNO (SUBREG_REG (x)), strict)))
++ return true;
++
++ return false;
++}
++
++/* Return 1 if X is a valid index for a memory address. */
++
++static bool
++ubicom32_is_index_expr (enum machine_mode mode, rtx x, int strict)
++{
++ /* Immediate index must be an unsigned 7-bit offset multiple of 1, 2
++ or 4 depending on mode. */
++ if (CONST_INT_P (x))
++ {
++ switch (mode)
++ {
++ case QImode:
++ return satisfies_constraint_J (x);
++
++ case HImode:
++ return satisfies_constraint_K (x);
++
++ case SImode:
++ case SFmode:
++ return satisfies_constraint_L (x);
++
++ case DImode:
++ return satisfies_constraint_L (x)
++ && satisfies_constraint_L (GEN_INT (INTVAL (x) + 4));
++
++ default:
++ return false;
++ }
++ }
++
++ if (mode != SImode && mode != HImode && mode != QImode)
++ return false;
++
++ /* Register index scaled by mode of operand: REG + REG * modesize.
++ Valid scaled index registers are:
++
++ SImode (mult (dreg) 4))
++ HImode (mult (dreg) 2))
++ QImode (mult (dreg) 1)) */
++ if (GET_CODE (x) == MULT
++ && ubicom32_is_index_reg (XEXP (x, 0), strict)
++ && CONST_INT_P (XEXP (x, 1))
++ && INTVAL (XEXP (x, 1)) == (HOST_WIDE_INT)GET_MODE_SIZE (mode))
++ return true;
++
++ /* REG + REG addressing is allowed for QImode. */
++ if (ubicom32_is_index_reg (x, strict) && mode == QImode)
++ return true;
++
++ return false;
++}
++
++static bool
++ubicom32_is_valid_offset (enum machine_mode mode, HOST_WIDE_INT offs)
++{
++ if (offs < 0)
++ return false;
++
++ switch (mode)
++ {
++ case QImode:
++ return offs <= 127;
++
++ case HImode:
++ return offs <= 254;
++
++ case SImode:
++ case SFmode:
++ return offs <= 508;
++
++ case DImode:
++ return offs <= 504;
++
++ default:
++ return false;
++ }
++}
++
++static int
++ubicom32_get_valid_offset_mask (enum machine_mode mode)
++{
++ switch (mode)
++ {
++ case QImode:
++ return 127;
++
++ case HImode:
++ return 255;
++
++ case SImode:
++ case SFmode:
++ return 511;
++
++ case DImode:
++ return 255;
++
++ default:
++ return 0;
++ }
++}
++
++/* Returns 1 if X is a valid base register. STRICT is 1 if only hard
++ registers should be accepted. Accept either REG or SUBREG where a
++ register is valid. */
++
++static bool
++ubicom32_is_base_reg (rtx x, int strict)
++{
++ if ((REG_P (x) && ubicom32_regno_ok_for_base_p (REGNO (x), strict))
++ || (GET_CODE (x) == SUBREG && REG_P (SUBREG_REG (x))
++ && ubicom32_regno_ok_for_base_p (REGNO (SUBREG_REG (x)), strict)))
++ return true;
++
++ return false;
++}
++
++static bool
++ubicom32_cannot_force_const_mem (rtx x ATTRIBUTE_UNUSED)
++{
++ return TARGET_FDPIC;
++}
++
++/* Determine if X is a legitimate constant. */
++
++bool
++ubicom32_legitimate_constant_p (rtx x)
++{
++ /* Among its other duties, LEGITIMATE_CONSTANT_P decides whether
++ a constant can be entered into reg_equiv_constant[]. If we return true,
++ reload can create new instances of the constant whenever it likes.
++
++ The idea is therefore to accept as many constants as possible (to give
++ reload more freedom) while rejecting constants that can only be created
++ at certain times. In particular, anything with a symbolic component will
++ require use of the pseudo FDPIC register, which is only available before
++ reload. */
++ if (TARGET_FDPIC)
++ {
++ if (GET_CODE (x) == SYMBOL_REF
++ || (GET_CODE (x) == CONST
++ && GET_CODE (XEXP (x, 0)) == PLUS
++ && GET_CODE (XEXP (XEXP (x, 0), 0)) == SYMBOL_REF)
++ || CONSTANT_ADDRESS_P (x))
++ return false;
++
++ return true;
++ }
++
++ /* For non-PIC code anything goes! */
++ return true;
++}
++
++/* Address validation. */
++
++bool
++ubicom32_legitimate_address_p (enum machine_mode mode, rtx x, int strict)
++{
++ if (TARGET_DEBUG_ADDRESS)
++ {
++ fprintf (stderr, "\n==> GO_IF_LEGITIMATE_ADDRESS%s\n",
++ (strict) ? " (STRICT)" : "");
++ debug_rtx (x);
++ }
++
++ if (CONSTANT_ADDRESS_P (x))
++ return false;
++
++ if (ubicom32_is_base_reg (x, strict))
++ return true;
++
++ if ((GET_CODE (x) == POST_INC
++ || GET_CODE (x) == PRE_INC
++ || GET_CODE (x) == POST_DEC
++ || GET_CODE (x) == PRE_DEC)
++ && REG_P (XEXP (x, 0))
++ && ubicom32_is_base_reg (XEXP (x, 0), strict)
++ && mode != DImode)
++ return true;
++
++ if ((GET_CODE (x) == PRE_MODIFY || GET_CODE (x) == POST_MODIFY)
++ && ubicom32_is_base_reg (XEXP (x, 0), strict)
++ && GET_CODE (XEXP (x, 1)) == PLUS
++ && rtx_equal_p (XEXP (x, 0), XEXP (XEXP (x, 1), 0))
++ && CONST_INT_P (XEXP (XEXP (x, 1), 1))
++ && mode != DImode)
++ {
++ HOST_WIDE_INT disp = INTVAL (XEXP (XEXP (x, 1), 1));
++ switch (mode)
++ {
++ case QImode:
++ return disp >= -8 && disp <= 7;
++
++ case HImode:
++ return disp >= -16 && disp <= 14 && ! (disp & 1);
++
++ case SImode:
++ return disp >= -32 && disp <= 28 && ! (disp & 3);
++
++ default:
++ return false;
++ }
++ }
++
++ /* Accept base + index * scale. */
++ if (GET_CODE (x) == PLUS
++ && ubicom32_is_base_reg (XEXP (x, 0), strict)
++ && ubicom32_is_index_expr (mode, XEXP (x, 1), strict))
++ return true;
++
++ /* Accept index * scale + base. */
++ if (GET_CODE (x) == PLUS
++ && ubicom32_is_base_reg (XEXP (x, 1), strict)
++ && ubicom32_is_index_expr (mode, XEXP (x, 0), strict))
++ return true;
++
++ if (! TARGET_FDPIC)
++ {
++ /* Accept (lo_sum (reg) (symbol_ref)) that can be used as a mem+7bits
++ displacement operand:
++
++ moveai a1, #%hi(SYM)
++ move.4 d3, %lo(SYM)(a1) */
++ if (GET_CODE (x) == LO_SUM
++ && ubicom32_is_base_reg (XEXP (x, 0), strict)
++ && (GET_CODE (XEXP (x, 1)) == SYMBOL_REF
++ || GET_CODE (XEXP (x, 1)) == LABEL_REF /* FIXME: wrong */)
++ && mode != DImode)
++ return true;
++ }
++
++ if (TARGET_DEBUG_ADDRESS)
++ fprintf (stderr, "\nNot a legitimate address.\n");
++
++ return false;
++}
++
++rtx
++ubicom32_legitimize_address (rtx x, rtx oldx ATTRIBUTE_UNUSED,
++ enum machine_mode mode)
++{
++ if (mode == BLKmode)
++ return NULL_RTX;
++
++ if (GET_CODE (x) == PLUS
++ && REG_P (XEXP (x, 0))
++ && ! REGNO_PTR_FRAME_P (REGNO (XEXP (x, 0)))
++ && CONST_INT_P (XEXP (x, 1))
++ && ! ubicom32_is_valid_offset (mode, INTVAL (XEXP (x, 1))))
++ {
++ rtx base;
++ rtx plus;
++ rtx new_rtx;
++ HOST_WIDE_INT val = INTVAL (XEXP (x, 1));
++ HOST_WIDE_INT low = val & ubicom32_get_valid_offset_mask (mode);
++ HOST_WIDE_INT high = val ^ low;
++
++ if (val < 0)
++ return NULL_RTX;
++
++ if (! low)
++ return NULL_RTX;
++
++ /* Reload the high part into a base reg; leave the low part
++ in the mem directly. */
++ base = XEXP (x, 0);
++ if (! ubicom32_is_base_reg (base, 0))
++ base = copy_to_mode_reg (Pmode, base);
++
++ plus = expand_simple_binop (Pmode, PLUS,
++ gen_int_mode (high, Pmode),
++ base, NULL, 0, OPTAB_WIDEN);
++ new_rtx = plus_constant (plus, low);
++
++ return new_rtx;
++ }
++
++ return NULL_RTX;
++}
++
++/* Try a machine-dependent way of reloading an illegitimate address AD
++ operand. If we find one, push the reload and and return the new address.
++
++ MODE is the mode of the enclosing MEM. OPNUM is the operand number
++ and TYPE is the reload type of the current reload. */
++
++rtx
++ubicom32_legitimize_reload_address (rtx ad, enum machine_mode mode,
++ int opnum, int type)
++{
++ /* Is this an address that we've already fixed up? If it is then
++ recognize it and move on. */
++ if (GET_CODE (ad) == PLUS
++ && GET_CODE (XEXP (ad, 0)) == PLUS
++ && REG_P (XEXP (XEXP (ad, 0), 0))
++ && CONST_INT_P (XEXP (XEXP (ad, 0), 1))
++ && CONST_INT_P (XEXP (ad, 1)))
++ {
++ push_reload (XEXP (ad, 0), NULL_RTX, &XEXP (ad, 0), NULL,
++ BASE_REG_CLASS, Pmode, VOIDmode, 0, 0,
++ opnum, (enum reload_type) type);
++ return ad;
++ }
++
++ /* Have we got an address where the offset is simply out of range? If
++ yes then reload the range as a high part and smaller offset. */
++ if (GET_CODE (ad) == PLUS
++ && REG_P (XEXP (ad, 0))
++ && REGNO (XEXP (ad, 0)) < FIRST_PSEUDO_REGISTER
++ && REGNO_OK_FOR_BASE_P (REGNO (XEXP (ad, 0)))
++ && CONST_INT_P (XEXP (ad, 1))
++ && ! ubicom32_is_valid_offset (mode, INTVAL (XEXP (ad, 1))))
++ {
++ rtx temp;
++ rtx new_rtx;
++
++ HOST_WIDE_INT val = INTVAL (XEXP (ad, 1));
++ HOST_WIDE_INT low = val & ubicom32_get_valid_offset_mask (mode);
++ HOST_WIDE_INT high = val ^ low;
++
++ /* Reload the high part into a base reg; leave the low part
++ in the mem directly. */
++ temp = gen_rtx_PLUS (Pmode, XEXP (ad, 0), GEN_INT (high));
++ new_rtx = gen_rtx_PLUS (Pmode, temp, GEN_INT (low));
++
++ push_reload (XEXP (new_rtx, 0), NULL_RTX, &XEXP (new_rtx, 0), NULL,
++ BASE_REG_CLASS, Pmode, VOIDmode, 0, 0,
++ opnum, (enum reload_type) type);
++ return new_rtx;
++ }
++
++ /* If we're presented with an pre/post inc/dec then we must force this
++ to be done in an address register. The register allocator should
++ work this out for itself but at times ends up trying to use the wrong
++ class. If we get the wrong class then reload will end up generating
++ at least 3 instructions whereas this way we can hopefully keep it to
++ just 2. */
++ if ((GET_CODE (ad) == POST_INC
++ || GET_CODE (ad) == PRE_INC
++ || GET_CODE (ad) == POST_DEC
++ || GET_CODE (ad) == PRE_DEC)
++ && REG_P (XEXP (ad, 0))
++ && REGNO (XEXP (ad, 0)) < FIRST_PSEUDO_REGISTER
++ && ! REGNO_OK_FOR_BASE_P (REGNO (XEXP (ad, 0))))
++ {
++ push_reload (XEXP (ad, 0), XEXP (ad, 0), &XEXP (ad, 0), &XEXP (ad, 0),
++ BASE_REG_CLASS, GET_MODE (XEXP (ad, 0)), GET_MODE (XEXP (ad, 0)), 0, 0,
++ opnum, RELOAD_OTHER);
++ return ad;
++ }
++
++ return NULL_RTX;
++}
++
++/* Compute a (partial) cost for rtx X. Return true if the complete
++ cost has been computed, and false if subexpressions should be
++ scanned. In either case, *TOTAL contains the cost result. */
++
++static bool
++ubicom32_rtx_costs (rtx x, int code, int outer_code, int *total,
++ bool speed ATTRIBUTE_UNUSED)
++{
++ enum machine_mode mode = GET_MODE (x);
++
++ switch (code)
++ {
++ case CONST_INT:
++ /* Very short constants often fold into instructions so
++ we pretend that they don't cost anything! This is
++ really important as regards zero values as otherwise
++ the compiler has a nasty habit of wanting to reuse
++ zeroes that are in regs but that tends to pessimize
++ the code. */
++ if (satisfies_constraint_I (x))
++ {
++ *total = 0;
++ return true;
++ }
++
++ /* Bit clearing costs nothing */
++ if (outer_code == AND
++ && exact_log2 (~INTVAL (x)) != -1)
++ {
++ *total = 0;
++ return true;
++ }
++
++ /* Masking the lower set of bits costs nothing. */
++ if (outer_code == AND
++ && exact_log2 (INTVAL (x) + 1) != -1)
++ {
++ *total = 0;
++ return true;
++ }
++
++ /* Bit setting costs nothing. */
++ if (outer_code == IOR
++ && exact_log2 (INTVAL (x)) != -1)
++ {
++ *total = 0;
++ return true;
++ }
++
++ /* Larger constants that can be loaded via movei aren't too
++ bad. If we're just doing a set they cost nothing extra. */
++ if (satisfies_constraint_N (x))
++ {
++ if (mode == DImode)
++ *total = COSTS_N_INSNS (2);
++ else
++ *total = COSTS_N_INSNS (1);
++ return true;
++ }
++
++ if (mode == DImode)
++ *total = COSTS_N_INSNS (5);
++ else
++ *total = COSTS_N_INSNS (3);
++ return true;
++
++ case CONST_DOUBLE:
++ /* We don't optimize CONST_DOUBLEs well nor do we relax them well,
++ so their cost is very high. */
++ *total = COSTS_N_INSNS (6);
++ return true;
++
++ case CONST:
++ case SYMBOL_REF:
++ case MEM:
++ *total = 0;
++ return true;
++
++ case IF_THEN_ELSE:
++ *total = COSTS_N_INSNS (1);
++ return true;
++
++ case LABEL_REF:
++ case HIGH:
++ case LO_SUM:
++ case BSWAP:
++ case PLUS:
++ case MINUS:
++ case AND:
++ case IOR:
++ case XOR:
++ case ASHIFT:
++ case ASHIFTRT:
++ case LSHIFTRT:
++ case NEG:
++ case NOT:
++ case SIGN_EXTEND:
++ case ZERO_EXTEND:
++ case ZERO_EXTRACT:
++ if (outer_code == SET)
++ {
++ if (mode == DImode)
++ *total = COSTS_N_INSNS (2);
++ else
++ *total = COSTS_N_INSNS (1);
++ }
++ return true;
++
++ case COMPARE:
++ if (outer_code == SET)
++ {
++ if (GET_MODE (XEXP (x, 0)) == DImode
++ || GET_MODE (XEXP (x, 1)) == DImode)
++ *total = COSTS_N_INSNS (2);
++ else
++ *total = COSTS_N_INSNS (1);
++ }
++ return true;
++
++ case UMOD:
++ case UDIV:
++ case MOD:
++ case DIV:
++ if (outer_code == SET)
++ {
++ if (mode == DImode)
++ *total = COSTS_N_INSNS (600);
++ else
++ *total = COSTS_N_INSNS (200);
++ }
++ return true;
++
++ case MULT:
++ if (outer_code == SET)
++ {
++ if (! ubicom32_v4)
++ {
++ if (mode == DImode)
++ *total = COSTS_N_INSNS (15);
++ else
++ *total = COSTS_N_INSNS (5);
++ }
++ else
++ {
++ if (mode == DImode)
++ *total = COSTS_N_INSNS (6);
++ else
++ *total = COSTS_N_INSNS (2);
++ }
++ }
++ return true;
++
++ case UNSPEC:
++ if (XINT (x, 1) == UNSPEC_FDPIC_GOT
++ || XINT (x, 1) == UNSPEC_FDPIC_GOT_FUNCDESC)
++ *total = 0;
++ return true;
++
++ default:
++ return false;
++ }
++}
++
++/* Return 1 if ADDR can have different meanings depending on the machine
++ mode of the memory reference it is used for or if the address is
++ valid for some modes but not others.
++
++ Autoincrement and autodecrement addresses typically have
++ mode-dependent effects because the amount of the increment or
++ decrement is the size of the operand being addressed. Some machines
++ have other mode-dependent addresses. Many RISC machines have no
++ mode-dependent addresses.
++
++ You may assume that ADDR is a valid address for the machine. */
++
++int
++ubicom32_mode_dependent_address_p (rtx addr)
++{
++ if (GET_CODE (addr) == POST_INC
++ || GET_CODE (addr) == PRE_INC
++ || GET_CODE (addr) == POST_DEC
++ || GET_CODE (addr) == PRE_DEC
++ || GET_CODE (addr) == POST_MODIFY
++ || GET_CODE (addr) == PRE_MODIFY)
++ return 1;
++
++ return 0;
++}
++
++static void
++ubicom32_function_prologue (FILE *file, HOST_WIDE_INT size ATTRIBUTE_UNUSED)
++{
++ fprintf (file, "/* frame/pretend: %ld/%d save_regs: %d out_args: %d %s */\n",
++ get_frame_size (), crtl->args.pretend_args_size,
++ save_regs_size, crtl->outgoing_args_size,
++ current_function_is_leaf ? "leaf" : "nonleaf");
++}
++
++static void
++ubicom32_function_epilogue (FILE *file ATTRIBUTE_UNUSED,
++ HOST_WIDE_INT size ATTRIBUTE_UNUSED)
++{
++ ubicom32_reorg_completed = 0;
++}
++
++static void
++ubicom32_machine_dependent_reorg (void)
++{
++#if 0 /* Commenting out this optimization until it is fixed */
++ if (optimize)
++ {
++ compute_bb_for_insn ();
++
++ /* Do a very simple CSE pass over just the hard registers. */
++ reload_cse_regs (get_insns ());
++
++ /* Reload_cse_regs can eliminate potentially-trapping MEMs.
++ Remove any EH edges associated with them. */
++ if (flag_non_call_exceptions)
++ purge_all_dead_edges ();
++ }
++#endif
++ ubicom32_reorg_completed = 1;
++}
++
++void
++ubicom32_output_cond_jump (rtx insn, rtx cond, rtx target)
++{
++ rtx note;
++ int mostly_false_jump;
++ rtx xoperands[2];
++ rtx cc_reg;
++
++ note = find_reg_note (insn, REG_BR_PROB, 0);
++ mostly_false_jump = !note || (INTVAL (XEXP (note, 0))
++ <= REG_BR_PROB_BASE / 2);
++
++ xoperands[0] = target;
++ xoperands[1] = cond;
++ cc_reg = XEXP (cond, 0);
++
++ if (GET_MODE (cc_reg) == CCWmode
++ || GET_MODE (cc_reg) == CCWZmode
++ || GET_MODE (cc_reg) == CCWZNmode)
++ {
++ if (mostly_false_jump)
++ output_asm_insn ("jmp%b1.w.f\t%0", xoperands);
++ else
++ output_asm_insn ("jmp%b1.w.t\t%0", xoperands);
++ return;
++ }
++
++ if (GET_MODE (cc_reg) == CCSmode
++ || GET_MODE (cc_reg) == CCSZmode
++ || GET_MODE (cc_reg) == CCSZNmode)
++ {
++ if (mostly_false_jump)
++ output_asm_insn ("jmp%b1.s.f\t%0", xoperands);
++ else
++ output_asm_insn ("jmp%b1.s.t\t%0", xoperands);
++ return;
++ }
++
++ abort ();
++}
++
++/* Return non-zero if FUNC is a naked function. */
++
++static int
++ubicom32_naked_function_p (void)
++{
++ return lookup_attribute ("naked", DECL_ATTRIBUTES (current_function_decl)) != NULL_TREE;
++}
++
++/* Return an RTX indicating where the return address to the
++ calling function can be found. */
++rtx
++ubicom32_return_addr_rtx (int count, rtx frame ATTRIBUTE_UNUSED)
++{
++ if (count != 0)
++ return NULL_RTX;
++
++ return get_hard_reg_initial_val (Pmode, LINK_REGNO);
++}
++
++/*
++ * ubicom32_readonly_data_section: This routtine handles code
++ * at the start of readonly data sections
++ */
++static void
++ubicom32_readonly_data_section (const void *data ATTRIBUTE_UNUSED)
++{
++ static int num = 0;
++ if (in_section == readonly_data_section){
++ fprintf (asm_out_file, "%s", DATA_SECTION_ASM_OP);
++ if (flag_data_sections){
++ fprintf (asm_out_file, ".rodata%d", num);
++ fprintf (asm_out_file, ",\"a\"");
++ }
++ fprintf (asm_out_file, "\n");
++ }
++ num++;
++}
++
++/*
++ * ubicom32_text_section: not in readonly section
++ */
++static void
++ubicom32_text_section(const void *data ATTRIBUTE_UNUSED)
++{
++ fprintf (asm_out_file, "%s\n", TEXT_SECTION_ASM_OP);
++}
++
++/*
++ * ubicom32_data_section: not in readonly section
++ */
++static void
++ubicom32_data_section(const void *data ATTRIBUTE_UNUSED)
++{
++ fprintf (asm_out_file, "%s\n", DATA_SECTION_ASM_OP);
++}
++
++/*
++ * ubicom32_asm_init_sections: This routine implements special
++ * section handling
++ */
++static void
++ubicom32_asm_init_sections(void)
++{
++ text_section = get_unnamed_section(SECTION_CODE, ubicom32_text_section, NULL);
++
++ data_section = get_unnamed_section(SECTION_WRITE, ubicom32_data_section, NULL);
++
++ readonly_data_section = get_unnamed_section(0, ubicom32_readonly_data_section, NULL);
++}
++
++/*
++ * ubicom32_profiler: This routine would call
++ * mcount to support prof and gprof if mcount
++ * was supported. Currently, do nothing.
++ */
++void
++ubicom32_profiler(void)
++{
++}
++
++/* Initialise the builtin functions. Start by initialising
++ descriptions of different types of functions (e.g., void fn(int),
++ int fn(void)), and then use these to define the builtins. */
++static void
++ubicom32_init_builtins (void)
++{
++ tree endlink;
++ tree short_unsigned_endlink;
++ tree unsigned_endlink;
++ tree short_unsigned_ftype_short_unsigned;
++ tree unsigned_ftype_unsigned;
++
++ endlink = void_list_node;
++
++ short_unsigned_endlink
++ = tree_cons (NULL_TREE, short_unsigned_type_node, endlink);
++
++ unsigned_endlink
++ = tree_cons (NULL_TREE, unsigned_type_node, endlink);
++
++ short_unsigned_ftype_short_unsigned
++ = build_function_type (short_unsigned_type_node, short_unsigned_endlink);
++
++ unsigned_ftype_unsigned
++ = build_function_type (unsigned_type_node, unsigned_endlink);
++
++ /* Initialise the byte swap function. */
++ add_builtin_function ("__builtin_ubicom32_swapb_2",
++ short_unsigned_ftype_short_unsigned,
++ UBICOM32_BUILTIN_UBICOM32_SWAPB_2,
++ BUILT_IN_MD, NULL,
++ NULL_TREE);
++
++ /* Initialise the byte swap function. */
++ add_builtin_function ("__builtin_ubicom32_swapb_4",
++ unsigned_ftype_unsigned,
++ UBICOM32_BUILTIN_UBICOM32_SWAPB_4,
++ BUILT_IN_MD, NULL,
++ NULL_TREE);
++}
++
++/* Given a builtin function taking 2 operands (i.e., target + source),
++ emit the RTL for the underlying instruction. */
++static rtx
++ubicom32_expand_builtin_2op (enum insn_code icode, tree arglist, rtx target)
++{
++ tree arg0;
++ rtx op0, pat;
++ enum machine_mode tmode, mode0;
++
++ /* Grab the incoming argument and emit its RTL. */
++ arg0 = TREE_VALUE (arglist);
++ op0 = expand_expr (arg0, NULL_RTX, VOIDmode, 0);
++
++ /* Determine the modes of the instruction operands. */
++ tmode = insn_data[icode].operand[0].mode;
++ mode0 = insn_data[icode].operand[1].mode;
++
++ /* Ensure that the incoming argument RTL is in a register of the
++ correct mode. */
++ if (!(*insn_data[icode].operand[1].predicate) (op0, mode0))
++ op0 = copy_to_mode_reg (mode0, op0);
++
++ /* If there isn't a suitable target, emit a target register. */
++ if (target == 0
++ || GET_MODE (target) != tmode
++ || !(*insn_data[icode].operand[0].predicate) (target, tmode))
++ target = gen_reg_rtx (tmode);
++
++ /* Emit and return the new instruction. */
++ pat = GEN_FCN (icode) (target, op0);
++ if (!pat)
++ return 0;
++ emit_insn (pat);
++
++ return target;
++}
++
++/* Expand a call to a builtin function. */
++static rtx
++ubicom32_expand_builtin (tree exp, rtx target, rtx subtarget ATTRIBUTE_UNUSED,
++ enum machine_mode mode ATTRIBUTE_UNUSED,
++ int ignore ATTRIBUTE_UNUSED)
++{
++ tree fndecl = TREE_OPERAND (CALL_EXPR_FN (exp), 0);
++ tree arglist = CALL_EXPR_ARGS(exp);
++ int fcode = DECL_FUNCTION_CODE (fndecl);
++
++ switch (fcode)
++ {
++ case UBICOM32_BUILTIN_UBICOM32_SWAPB_2:
++ return ubicom32_expand_builtin_2op (CODE_FOR_bswaphi, arglist, target);
++
++ case UBICOM32_BUILTIN_UBICOM32_SWAPB_4:
++ return ubicom32_expand_builtin_2op (CODE_FOR_bswapsi, arglist, target);
++
++ default:
++ gcc_unreachable();
++ }
++
++ /* Should really do something sensible here. */
++ return NULL_RTX;
++}
++
++/* Fold any constant argument for a swapb.2 instruction. */
++static tree
++ubicom32_fold_builtin_ubicom32_swapb_2 (tree fndecl, tree arglist)
++{
++ tree arg0;
++
++ arg0 = TREE_VALUE (arglist);
++
++ /* Optimize constant value. */
++ if (TREE_CODE (arg0) == INTEGER_CST)
++ {
++ HOST_WIDE_INT v;
++ HOST_WIDE_INT res;
++
++ v = TREE_INT_CST_LOW (arg0);
++ res = ((v >> 8) & 0xff)
++ | ((v & 0xff) << 8);
++
++ return build_int_cst (TREE_TYPE (TREE_TYPE (fndecl)), res);
++ }
++
++ return NULL_TREE;
++}
++
++/* Fold any constant argument for a swapb.4 instruction. */
++static tree
++ubicom32_fold_builtin_ubicom32_swapb_4 (tree fndecl, tree arglist)
++{
++ tree arg0;
++
++ arg0 = TREE_VALUE (arglist);
++
++ /* Optimize constant value. */
++ if (TREE_CODE (arg0) == INTEGER_CST)
++ {
++ unsigned HOST_WIDE_INT v;
++ unsigned HOST_WIDE_INT res;
++
++ v = TREE_INT_CST_LOW (arg0);
++ res = ((v >> 24) & 0xff)
++ | (((v >> 16) & 0xff) << 8)
++ | (((v >> 8) & 0xff) << 16)
++ | ((v & 0xff) << 24);
++
++ return build_int_cst_wide (TREE_TYPE (TREE_TYPE (fndecl)), res, 0);
++ }
++
++ return NULL_TREE;
++}
++
++/* Fold any constant arguments for builtin functions. */
++static tree
++ubicom32_fold_builtin (tree fndecl, tree arglist, bool ignore ATTRIBUTE_UNUSED)
++{
++ switch (DECL_FUNCTION_CODE (fndecl))
++ {
++ case UBICOM32_BUILTIN_UBICOM32_SWAPB_2:
++ return ubicom32_fold_builtin_ubicom32_swapb_2 (fndecl, arglist);
++
++ case UBICOM32_BUILTIN_UBICOM32_SWAPB_4:
++ return ubicom32_fold_builtin_ubicom32_swapb_4 (fndecl, arglist);
++
++ default:
++ return NULL;
++ }
++}
++
++/* Implementation of TARGET_ASM_INTEGER. When using FD-PIC, we need to
++ tell the assembler to generate pointers to function descriptors in
++ some cases. */
++static bool
++ubicom32_assemble_integer (rtx value, unsigned int size, int aligned_p)
++{
++ if (TARGET_FDPIC && size == UNITS_PER_WORD)
++ {
++ if (GET_CODE (value) == SYMBOL_REF
++ && SYMBOL_REF_FUNCTION_P (value))
++ {
++ fputs ("\t.picptr\t%funcdesc(", asm_out_file);
++ output_addr_const (asm_out_file, value);
++ fputs (")\n", asm_out_file);
++ return true;
++ }
++
++ if (!aligned_p)
++ {
++ /* We've set the unaligned SI op to NULL, so we always have to
++ handle the unaligned case here. */
++ assemble_integer_with_op ("\t.4byte\t", value);
++ return true;
++ }
++ }
++
++ return default_assemble_integer (value, size, aligned_p);
++}
++
++/* If the constant I can be constructed by shifting a source-1 immediate
++ by a constant number of bits then return the bit count. If not
++ return 0. */
++
++int
++ubicom32_shiftable_const_int (int i)
++{
++ int shift = 0;
++
++ /* Note that any constant that can be represented as an immediate to
++ a movei instruction is automatically ignored here in the interests
++ of the clarity of the output asm code. */
++ if (i >= -32768 && i <= 32767)
++ return 0;
++
++ /* Find the number of trailing zeroes. We could use __builtin_ctz
++ here but it's not obvious if this is supported on all build
++ compilers so we err on the side of caution. */
++ if ((i & 0xffff) == 0)
++ {
++ shift += 16;
++ i >>= 16;
++ }
++
++ if ((i & 0xff) == 0)
++ {
++ shift += 8;
++ i >>= 8;
++ }
++
++ if ((i & 0xf) == 0)
++ {
++ shift += 4;
++ i >>= 4;
++ }
++
++ if ((i & 0x3) == 0)
++ {
++ shift += 2;
++ i >>= 2;
++ }
++
++ if ((i & 0x1) == 0)
++ {
++ shift += 1;
++ i >>= 1;
++ }
++
++ if (i >= -128 && i <= 127)
++ return shift;
++
++ return 0;
++}
++
+--- /dev/null
++++ b/gcc/config/ubicom32/ubicom32.h
+@@ -0,0 +1,1564 @@
++/* Definitions of target machine for Ubicom32
++
++ Copyright (C) 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008,
++ 2009 Free Software Foundation, Inc.
++ Contributed by Ubicom, Inc.
++
++ 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/>. */
++
++
++
++#define OBJECT_FORMAT_ELF
++
++/* Run-time target specifications. */
++
++/* Target CPU builtins. */
++#define TARGET_CPU_CPP_BUILTINS() \
++ do \
++ { \
++ builtin_define_std ("__UBICOM32__"); \
++ builtin_define_std ("__ubicom32__"); \
++ \
++ if (TARGET_FDPIC) \
++ { \
++ builtin_define ("__UBICOM32_FDPIC__"); \
++ builtin_define ("__FDPIC__"); \
++ } \
++ } \
++ while (0)
++
++#ifndef TARGET_DEFAULT
++#define TARGET_DEFAULT 0
++#endif
++
++extern int ubicom32_case_values_threshold;
++
++/* Nonzero if this chip supports the Ubicom32 v3 ISA. */
++extern int ubicom32_v3;
++
++/* Nonzero if this chip supports the Ubicom32 v4 ISA. */
++extern int ubicom32_v4;
++
++extern int ubicom32_stack_size;
++
++/* Flag for whether we can use calli instead of ret in returns. */
++extern int ubicom32_can_use_calli_to_ret;
++
++/* This macro is a C statement to print on `stderr' a string describing the
++ particular machine description choice. Every machine description should
++ define `TARGET_VERSION'. */
++#define TARGET_VERSION fprintf (stderr, " (UBICOM32)");
++
++/* We don't need a frame pointer to debug things. Doing this means
++ that gcc can turn on -fomit-frame-pointer when '-O' is specified. */
++#define CAN_DEBUG_WITHOUT_FP
++
++/* We need to handle processor-specific options. */
++#define OVERRIDE_OPTIONS ubicom32_override_options ()
++
++#define OPTIMIZATION_OPTIONS(LEVEL, SIZE) \
++ ubicom32_optimization_options (LEVEL, SIZE)
++
++/* For Ubicom32 the least significant bit has the lowest bit number
++ so we define this to be 0. */
++#define BITS_BIG_ENDIAN 0
++
++/* For Ubicom32 the most significant byte in a word has the lowest
++ number. */
++#define BYTES_BIG_ENDIAN 1
++
++/* For Ubicom32, in a multiword object, the most signifant word has the
++ lowest number. */
++#define WORDS_BIG_ENDIAN 1
++
++/* Ubicom32 has 8 bits per byte. */
++#define BITS_PER_UNIT 8
++
++/* Ubicom32 has 32 bits per word. */
++#define BITS_PER_WORD 32
++
++/* Width of a word, in units (bytes). */
++#define UNITS_PER_WORD 4
++
++/* Width of a pointer, in bits. */
++#define POINTER_SIZE 32
++
++/* Alias for pointers. Ubicom32 is a 32-bit architecture so we use
++ SImode. */
++#define Pmode SImode
++
++/* Normal alignment required for function parameters on the stack, in
++ bits. */
++#define PARM_BOUNDARY 32
++
++/* We need to maintain the stack on a 32-bit boundary. */
++#define STACK_BOUNDARY 32
++
++/* Alignment required for a function entry point, in bits. */
++#define FUNCTION_BOUNDARY 32
++
++/* Alias for the machine mode used for memory references to functions being
++ called, in `call' RTL expressions. We use byte-oriented addresses
++ here. */
++#define FUNCTION_MODE QImode
++
++/* Biggest alignment that any data type can require on this machine,
++ in bits. */
++#define BIGGEST_ALIGNMENT 32
++
++/* this default to BIGGEST_ALIGNMENT unless defined */
++/* ART: What's the correct value here? Default is (((unsigned int)1<<28)*8)*/
++#undef MAX_OFILE_ALIGNMENT
++#define MAX_OFILE_ALIGNMENT (128 * 8)
++
++/* Alignment in bits to be given to a structure bit field that follows an empty
++ field such as `int : 0;'. */
++#define EMPTY_FIELD_BOUNDARY 32
++
++/* All structures must be a multiple of 32 bits in size. */
++#define STRUCTURE_SIZE_BOUNDARY 32
++
++/* A bit-field declared as `int' forces `int' alignment for the struct. */
++#define PCC_BITFIELD_TYPE_MATTERS 1
++
++/* For Ubicom32 we absolutely require that data be aligned with nominal
++ alignment. */
++#define STRICT_ALIGNMENT 1
++
++/* Make strcpy of constants fast. */
++#define CONSTANT_ALIGNMENT(EXP, ALIGN) \
++ (TREE_CODE (EXP) == STRING_CST \
++ && (ALIGN) < BITS_PER_WORD ? BITS_PER_WORD : (ALIGN))
++
++/* Define this macro as an expression for the alignment of a structure
++ (given by STRUCT as a tree node) if the alignment computed in the
++ usual way is COMPUTED and the alignment explicitly specified was
++ SPECIFIED. */
++#define DATA_ALIGNMENT(TYPE, ALIGN) \
++ ((((ALIGN) < BITS_PER_WORD) \
++ && (TREE_CODE (TYPE) == ARRAY_TYPE \
++ || TREE_CODE (TYPE) == UNION_TYPE \
++ || TREE_CODE (TYPE) == RECORD_TYPE)) ? BITS_PER_WORD : (ALIGN))
++
++#define LOCAL_ALIGNMENT(TYPE,ALIGN) DATA_ALIGNMENT(TYPE,ALIGN)
++
++/* For Ubicom32 we default to unsigned chars. */
++#define DEFAULT_SIGNED_CHAR 0
++
++/* Machine-specific data register numbers. */
++#define FIRST_DATA_REGNUM 0
++#define D10_REGNUM 10
++#define D11_REGNUM 11
++#define D12_REGNUM 12
++#define D13_REGNUM 13
++#define LAST_DATA_REGNUM 15
++
++/* Machine-specific address register numbers. */
++#define FIRST_ADDRESS_REGNUM 16
++#define LAST_ADDRESS_REGNUM 22
++
++/* Register numbers used for passing a function's static chain pointer. If
++ register windows are used, the register number as seen by the called
++ function is `STATIC_CHAIN_INCOMING_REGNUM', while the register number as
++ seen by the calling function is `STATIC_CHAIN_REGNUM'. If these registers
++ are the same, `STATIC_CHAIN_INCOMING_REGNUM' need not be defined.
++
++ The static chain register need not be a fixed register.
++
++ If the static chain is passed in memory, these macros should not be defined;
++ instead, the next two macros should be defined. */
++#define STATIC_CHAIN_REGNUM (FIRST_ADDRESS_REGNUM + 1)
++
++/* The register number of the frame pointer register, which is used to access
++ automatic variables in the stack frame. We generally eliminate this anyway
++ for Ubicom32 but we make it A6 by default. */
++#define FRAME_POINTER_REGNUM (LAST_ADDRESS_REGNUM)
++
++/* The register number of the stack pointer register, which is also be a
++ fixed register according to `FIXED_REGISTERS'. For Ubicom32 we don't
++ have a hardware requirement about which register this is, but by convention
++ we use A7. */
++#define STACK_POINTER_REGNUM (LAST_ADDRESS_REGNUM + 1)
++
++/* Machine-specific accumulator register numbers. */
++#define ACC0_HI_REGNUM 24
++#define ACC0_LO_REGNUM 25
++#define ACC1_HI_REGNUM 26
++#define ACC1_LO_REGNUM 27
++
++/* source3 register number */
++#define SOURCE3_REGNUM 28
++
++/* The register number of the arg pointer register, which is used to access the
++ function's argument list. On some machines, this is the same as the frame
++ pointer register. On some machines, the hardware determines which register
++ this is. On other machines, you can choose any register you wish for this
++ purpose. If this is not the same register as the frame pointer register,
++ then you must mark it as a fixed register according to `FIXED_REGISTERS', or
++ arrange to be able to eliminate it. */
++#define ARG_POINTER_REGNUM 29
++
++/* Pseudo-reg for condition code. */
++#define CC_REGNUM 30
++
++/* Interrupt set/clear registers. */
++#define INT_SET0_REGNUM 31
++#define INT_SET1_REGNUM 32
++#define INT_CLR0_REGNUM 33
++#define INT_CLR1_REGNUM 34
++
++/* Scratchpad registers. */
++#define SCRATCHPAD0_REGNUM 35
++#define SCRATCHPAD1_REGNUM 36
++#define SCRATCHPAD2_REGNUM 37
++#define SCRATCHPAD3_REGNUM 38
++
++/* FDPIC register. */
++#define FDPIC_REGNUM 16
++
++/* Number of hardware registers known to the compiler. They receive numbers 0
++ through `FIRST_PSEUDO_REGISTER-1'; thus, the first pseudo register's number
++ really is assigned the number `FIRST_PSEUDO_REGISTER'. */
++#define FIRST_PSEUDO_REGISTER 39
++
++/* An initializer that says which registers are used for fixed purposes all
++ throughout the compiled code and are therefore not available for general
++ allocation. These would include the stack pointer, the frame pointer
++ (except on machines where that can be used as a general register when no
++ frame pointer is needed), the program counter on machines where that is
++ considered one of the addressable registers, and any other numbered register
++ with a standard use.
++
++ This information is expressed as a sequence of numbers, separated by commas
++ and surrounded by braces. The Nth number is 1 if register N is fixed, 0
++ otherwise.
++
++ The table initialized from this macro, and the table initialized by the
++ following one, may be overridden at run time either automatically, by the
++ actions of the macro `CONDITIONAL_REGISTER_USAGE', or by the user with the
++ command options `-ffixed-REG', `-fcall-used-REG' and `-fcall-saved-REG'. */
++#define FIXED_REGISTERS \
++ { \
++ 0, 0, 0, 0, 0, 0, 0, 0, /* d0 - d7 */ \
++ 0, 0, 0, 0, 0, 0, 0, 1, /* d8 - d15 */ \
++ 0, 0, 0, 0, 0, 0, 0, 1, /* a0 - a7 */ \
++ 0, 0, /* acc0 hi/lo */ \
++ 0, 0, /* acc1 hi/lo */ \
++ 0, /* source3 */ \
++ 1, /* arg */ \
++ 1, /* cc */ \
++ 1, 1, /* int_set[01] */ \
++ 1, 1, /* int_clr[01] */ \
++ 1, 1, 1, 1 /* scratchpad[0123] */ \
++ }
++
++/* Like `FIXED_REGISTERS' but has 1 for each register that is clobbered (in
++ general) by function calls as well as for fixed registers. This macro
++ therefore identifies the registers that are not available for general
++ allocation of values that must live across function calls.
++
++ If a register has 0 in `CALL_USED_REGISTERS', the compiler automatically
++ saves it on function entry and restores it on function exit, if the register
++ is used within the function. */
++#define CALL_USED_REGISTERS \
++ { \
++ 1, 1, 1, 1, 1, 1, 1, 1, /* d0 - d7 */ \
++ 1, 1, 0, 0, 0, 0, 1, 1, /* d8 - d15 */ \
++ 1, 0, 0, 1, 1, 1, 0, 1, /* a0 - a7 */ \
++ 1, 1, /* acc0 hi/lo */ \
++ 1, 1, /* acc1 hi/lo */ \
++ 1, /* source3 */ \
++ 1, /* arg */ \
++ 1, /* cc */ \
++ 1, 1, /* int_set[01] */ \
++ 1, 1, /* int_clr[01] */ \
++ 1, 1, 1, 1 /* scratchpad[0123] */ \
++ }
++
++/* How to refer to registers in assembler output.
++ This sequence is indexed by compiler's hard-register-number (see above). */
++
++/* A C initializer containing the assembler's names for the machine registers,
++ each one as a C string constant. This is what translates register numbers
++ in the compiler into assembler language. */
++#define REGISTER_NAMES \
++ { \
++ "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7", \
++ "d8", "d9", "d10", "d11", "d12", "d13", "d14", "d15", \
++ "a0", "a1", "a2", "a3", "a4", "a5", "a6", "sp", \
++ "acc0_hi", "acc0_lo", \
++ "acc1_hi", "acc1_lo", \
++ "source3", \
++ "arg", \
++ "cc", \
++ "int_set0", "int_set1", \
++ "int_clr0", "int_clr1", \
++ "scratchpad0", "scratchpad1", "scratchpad2", "scratchpad3" \
++ }
++
++#define CONDITIONAL_REGISTER_USAGE \
++ ubicom32_conditional_register_usage ();
++
++/* Order of allocation of registers. */
++
++/* If defined, an initializer for a vector of integers, containing the numbers
++ of hard registers in the order in which GNU CC should prefer to use them
++ (from most preferred to least).
++
++ For Ubicom32 we try using caller-clobbered data registers first, then
++ callee-saved data registers, then caller-clobbered address registers,
++ then callee-saved address registers and finally everything else.
++
++ The caller-clobbered registers are usually slightly cheaper to use because
++ there's no need to save/restore. */
++#define REG_ALLOC_ORDER \
++ { \
++ 0, 1, 2, 3, 4, /* d0 - d4 */ \
++ 5, 6, 7, 8, 9, /* d5 - d9 */ \
++ 14, /* d14 */ \
++ 10, 11, 12, 13, /* d10 - d13 */ \
++ 19, 20, 16, 21, /* a3, a4, a0, a5 */ \
++ 17, 18, 22, /* a1, a2, a6 */ \
++ 24, 25, /* acc0 hi/lo */ \
++ 26, 27, /* acc0 hi/lo */ \
++ 28 /* source3 */ \
++ }
++
++/* C expression for the number of consecutive hard registers, starting at
++ register number REGNO, required to hold a value of mode MODE. */
++#define HARD_REGNO_NREGS(REGNO, MODE) \
++ ((GET_MODE_SIZE (MODE) + UNITS_PER_WORD - 1) / UNITS_PER_WORD)
++
++/* Most registers can hold QImode, HImode and SImode values but we have to
++ be able to indicate any hard registers that cannot hold values with some
++ modes. */
++#define HARD_REGNO_MODE_OK(REGNO, MODE) \
++ ubicom32_hard_regno_mode_ok(REGNO, MODE)
++
++/* We can rename most registers aside from the FDPIC register if we're using
++ FDPIC. */
++#define HARD_REGNO_RENAME_OK(from, to) (TARGET_FDPIC ? ((to) != FDPIC_REGNUM) : 1)
++
++/* A C expression that is nonzero if it is desirable to choose register
++ allocation so as to avoid move instructions between a value of mode MODE1
++ and a value of mode MODE2.
++
++ If `HARD_REGNO_MODE_OK (R, MODE1)' and `HARD_REGNO_MODE_OK (R, MODE2)' are
++ ever different for any R, then `MODES_TIEABLE_P (MODE1, MODE2)' must be
++ zero. */
++#define MODES_TIEABLE_P(MODE1, MODE2) 1
++
++/* An enumeral type that must be defined with all the register class names as
++ enumeral values. `NO_REGS' must be first. `ALL_REGS' must be the last
++ register class, followed by one more enumeral value, `LIM_REG_CLASSES',
++ which is not a register class but rather tells how many classes there are.
++
++ Each register class has a number, which is the value of casting the class
++ name to type `int'. The number serves as an index in many of the tables
++ described below. */
++
++enum reg_class
++{
++ NO_REGS,
++ DATA_REGS,
++ FDPIC_REG,
++ ADDRESS_REGS,
++ ALL_ADDRESS_REGS,
++ ACC_LO_REGS,
++ ACC_REGS,
++ CC_REG,
++ DATA_ACC_REGS,
++ SOURCE3_REG,
++ SPECIAL_REGS,
++ GENERAL_REGS,
++ ALL_REGS,
++ LIM_REG_CLASSES
++};
++
++/* The number of distinct register classes. */
++#define N_REG_CLASSES (int) LIM_REG_CLASSES
++
++/* An initializer containing the names of the register classes as C string
++ constants. These names are used in writing some of the debugging dumps. */
++
++#define REG_CLASS_NAMES \
++{ \
++ "NO_REGS", \
++ "DATA_REGS", \
++ "FDPIC_REG", \
++ "ADDRESS_REGS", \
++ "ALL_ADDRESS_REGS", \
++ "ACC_LO_REGS", \
++ "ACC_REGS", \
++ "CC_REG", \
++ "DATA_ACC_REGS", \
++ "SOURCE3_REG", \
++ "SPECIAL_REGS", \
++ "GENERAL_REGS", \
++ "ALL_REGS", \
++ "LIM_REGS" \
++}
++
++/* An initializer containing the contents of the register classes, as integers
++ which are bit masks. The Nth integer specifies the contents of class N.
++ The way the integer MASK is interpreted is that register R is in the class
++ if `MASK & (1 << R)' is 1.
++
++ When the machine has more than 32 registers, an integer does not suffice.
++ Then the integers are replaced by sub-initializers, braced groupings
++ containing several integers. Each sub-initializer must be suitable as an
++ initializer for the type `HARD_REG_SET' which is defined in
++ `hard-reg-set.h'. */
++#define REG_CLASS_CONTENTS \
++{ \
++ {0x00000000, 0x00000000}, /* No regs */ \
++ {0x0000ffff, 0x00000000}, /* DATA_REGS */ \
++ {0x00010000, 0x00000000}, /* FDPIC_REG */ \
++ {0x20fe0000, 0x00000000}, /* ADDRESS_REGS */ \
++ {0x20ff0000, 0x00000000}, /* ALL_ADDRESS_REGS */ \
++ {0x0a000000, 0x00000000}, /* ACC_LO_REGS */ \
++ {0x0f000000, 0x00000000}, /* ACC_REGS */ \
++ {0x40000000, 0x00000000}, /* CC_REG */ \
++ {0x0f00ffff, 0x00000000}, /* DATA_ACC_REGS */ \
++ {0x10000000, 0x00000000}, /* SOURGE3_REG */ \
++ {0x80000000, 0x0000007f}, /* SPECIAL_REGS */ \
++ {0xbfffffff, 0x0000007f}, /* GENERAL_REGS */ \
++ {0xbfffffff, 0x0000007f} /* ALL_REGS */ \
++}
++
++extern enum reg_class const ubicom32_regclass_map[FIRST_PSEUDO_REGISTER];
++
++/* A C expression whose value is a register class containing hard register
++ REGNO. In general there is more than one such class; choose a class which
++ is "minimal", meaning that no smaller class also contains the register. */
++#define REGNO_REG_CLASS(REGNO) (ubicom32_regclass_map[REGNO])
++
++#define IRA_COVER_CLASSES \
++{ \
++ GENERAL_REGS, \
++ LIM_REG_CLASSES \
++}
++
++/* Ubicom32 base registers must be address registers since addresses can
++ only be reached via address registers. */
++#define BASE_REG_CLASS ALL_ADDRESS_REGS
++
++/* Ubicom32 index registers must be data registers since we cannot add
++ two address registers together to form an address. */
++#define INDEX_REG_CLASS DATA_REGS
++
++/* A C expression which is nonzero if register number NUM is suitable for use
++ as a base register in operand addresses. It may be either a suitable hard
++ register or a pseudo register that has been allocated such a hard register. */
++
++#ifndef REG_OK_STRICT
++#define REGNO_OK_FOR_BASE_P(regno) \
++ ubicom32_regno_ok_for_base_p (regno, 0)
++#else
++#define REGNO_OK_FOR_BASE_P(regno) \
++ ubicom32_regno_ok_for_base_p (regno, 1)
++#endif
++
++/* A C expression which is nonzero if register number NUM is suitable for use
++ as an index register in operand addresses. It may be either a suitable hard
++ register or a pseudo register that has been allocated such a hard register.
++
++ The difference between an index register and a base register is that the
++ index register may be scaled. If an address involves the sum of two
++ registers, neither one of them scaled, then either one may be labeled the
++ "base" and the other the "index"; but whichever labeling is used must fit
++ the machine's constraints of which registers may serve in each capacity.
++ The compiler will try both labelings, looking for one that is valid, and
++ will reload one or both registers only if neither labeling works. */
++#ifndef REG_OK_STRICT
++#define REGNO_OK_FOR_INDEX_P(regno) \
++ ubicom32_regno_ok_for_index_p (regno, 0)
++#else
++#define REGNO_OK_FOR_INDEX_P(regno) \
++ ubicom32_regno_ok_for_index_p (regno, 1)
++#endif
++
++/* Attempt to restrict the register class we need to copy value X intoto the
++ would-be register class CLASS. Most things are fine for Ubicom32 but we
++ have to restrict certain types of address loads. */
++#define PREFERRED_RELOAD_CLASS(X, CLASS) \
++ ubicom32_preferred_reload_class (X, CLASS)
++
++/* A C expression for the maximum number of consecutive registers of
++ class CLASS needed to hold a value of mode MODE. For Ubicom32 this
++ is pretty much identical to HARD_REGNO_NREGS. */
++#define CLASS_MAX_NREGS(CLASS, MODE) \
++ ((GET_MODE_SIZE (MODE) + UNITS_PER_WORD - 1) / UNITS_PER_WORD)
++
++/* For Ubicom32 the stack grows downwards when we push a word onto the stack
++ - i.e. it moves to a smaller address. */
++#define STACK_GROWS_DOWNWARD 1
++
++/* Offset from the frame pointer to the first local variable slot to
++ be allocated. */
++#define STARTING_FRAME_OFFSET 0
++
++/* Offset from the argument pointer register to the first argument's
++ address. */
++#define FIRST_PARM_OFFSET(FNDECL) 0
++
++/* A C expression whose value is RTL representing the value of the return
++ address for the frame COUNT steps up from the current frame, after the
++ prologue. FRAMEADDR is the frame pointer of the COUNT frame, or the frame
++ pointer of the COUNT - 1 frame if `RETURN_ADDR_IN_PREVIOUS_FRAME' is
++ defined.
++
++ The value of the expression must always be the correct address when COUNT is
++ zero, but may be `NULL_RTX' if there is not way to determine the return
++ address of other frames. */
++#define RETURN_ADDR_RTX(COUNT, FRAME) \
++ ubicom32_return_addr_rtx (COUNT, FRAME)
++
++/* Register That Address the Stack Frame. */
++
++/* We don't actually require a frame pointer in most functions with the
++ Ubicom32 architecture so we allow it to be eliminated. */
++#define FRAME_POINTER_REQUIRED 0
++
++/* Macro that defines a table of register pairs used to eliminate unecessary
++ registers that point into the stack frame.
++
++ For Ubicom32 we don't generally need an arg pointer of a frame pointer
++ so we allow the arg pointer to be replaced by either the frame pointer or
++ the stack pointer. We also allow the frame pointer to be replaced by
++ the stack pointer. */
++#define ELIMINABLE_REGS \
++{ \
++ {ARG_POINTER_REGNUM, STACK_POINTER_REGNUM}, \
++ {ARG_POINTER_REGNUM, FRAME_POINTER_REGNUM}, \
++ {FRAME_POINTER_REGNUM, STACK_POINTER_REGNUM} \
++}
++
++/* Let the compiler know that we want to use the ELIMINABLE_REGS macro
++ above. */
++#define CAN_ELIMINATE(FROM, TO) 1
++
++/* This macro is similar to `INITIAL_FRAME_POINTER_OFFSET'. It specifies the
++ initial difference between the specified pair of registers. This macro must
++ be defined if `ELIMINABLE_REGS' is defined. */
++#define INITIAL_ELIMINATION_OFFSET(FROM, TO, OFFSET) \
++ (OFFSET) = ubicom32_initial_elimination_offset (FROM, TO)
++
++/* If defined, the maximum amount of space required for outgoing arguments will
++ be computed and placed into the variable
++ `current_function_outgoing_args_size'. No space will be pushed onto the
++ stack for each call; instead, the function prologue should increase the
++ stack frame size by this amount.
++
++ Defining both `PUSH_ROUNDING' and `ACCUMULATE_OUTGOING_ARGS' is not
++ proper. */
++#define ACCUMULATE_OUTGOING_ARGS 1
++
++/* Define this macro if functions should assume that stack space has been
++ allocated for arguments even when their values are passed in registers.
++
++ The value of this macro is the size, in bytes, of the area reserved for
++ arguments passed in registers for the function represented by FNDECL.
++
++ This space can be allocated by the caller, or be a part of the
++ machine-dependent stack frame: `OUTGOING_REG_PARM_STACK_SPACE' says
++ which. */
++#define REG_PARM_STACK_SPACE(FNDECL) ubicom32_reg_parm_stack_space(FNDECL)
++
++/* A C expression that should indicate the number of bytes of its own arguments
++ that a function pops on returning, or 0 if the function pops no arguments
++ and the caller must therefore pop them all after the function returns.
++
++ FUNDECL is a C variable whose value is a tree node that describes the
++ function in question. Normally it is a node of type `FUNCTION_DECL' that
++ describes the declaration of the function. From this it is possible to
++ obtain the DECL_MACHINE_ATTRIBUTES of the function.
++
++ FUNTYPE is a C variable whose value is a tree node that describes the
++ function in question. Normally it is a node of type `FUNCTION_TYPE' that
++ describes the data type of the function. From this it is possible to obtain
++ the data types of the value and arguments (if known).
++
++ When a call to a library function is being considered, FUNTYPE will contain
++ an identifier node for the library function. Thus, if you need to
++ distinguish among various library functions, you can do so by their names.
++ Note that "library function" in this context means a function used to
++ perform arithmetic, whose name is known specially in the compiler and was
++ not mentioned in the C code being compiled.
++
++ STACK-SIZE is the number of bytes of arguments passed on the stack. If a
++ variable number of bytes is passed, it is zero, and argument popping will
++ always be the responsibility of the calling function.
++
++ On the Vax, all functions always pop their arguments, so the definition of
++ this macro is STACK-SIZE. On the 68000, using the standard calling
++ convention, no functions pop their arguments, so the value of the macro is
++ always 0 in this case. But an alternative calling convention is available
++ in which functions that take a fixed number of arguments pop them but other
++ functions (such as `printf') pop nothing (the caller pops all). When this
++ convention is in use, FUNTYPE is examined to determine whether a function
++ takes a fixed number of arguments. */
++#define RETURN_POPS_ARGS(FUNDECL, FUNTYPE, STACK_SIZE) 0
++
++/* A C expression that controls whether a function argument is passed in a
++ register, and which register.
++
++ The arguments are CUM, of type CUMULATIVE_ARGS, which summarizes (in a way
++ defined by INIT_CUMULATIVE_ARGS and FUNCTION_ARG_ADVANCE) all of the previous
++ arguments so far passed in registers; MODE, the machine mode of the argument;
++ TYPE, the data type of the argument as a tree node or 0 if that is not known
++ (which happens for C support library functions); and NAMED, which is 1 for an
++ ordinary argument and 0 for nameless arguments that correspond to `...' in the
++ called function's prototype.
++
++ The value of the expression should either be a `reg' RTX for the hard
++ register in which to pass the argument, or zero to pass the argument on the
++ stack.
++
++ For machines like the Vax and 68000, where normally all arguments are
++ pushed, zero suffices as a definition.
++
++ The usual way to make the ANSI library `stdarg.h' work on a machine where
++ some arguments are usually passed in registers, is to cause nameless
++ arguments to be passed on the stack instead. This is done by making
++ `FUNCTION_ARG' return 0 whenever NAMED is 0.
++
++ You may use the macro `MUST_PASS_IN_STACK (MODE, TYPE)' in the definition of
++ this macro to determine if this argument is of a type that must be passed in
++ the stack. If `REG_PARM_STACK_SPACE' is not defined and `FUNCTION_ARG'
++ returns non-zero for such an argument, the compiler will abort. If
++ `REG_PARM_STACK_SPACE' is defined, the argument will be computed in the
++ stack and then loaded into a register. */
++#define FUNCTION_ARG(CUM, MODE, TYPE, NAMED) \
++ function_arg (&CUM, MODE, TYPE, NAMED)
++
++#define FUNCTION_INCOMING_ARG(CUM, MODE, TYPE, NAMED) \
++ function_incoming_arg (&CUM, MODE, TYPE, NAMED)
++
++/* A C expression for the number of words, at the beginning of an argument,
++ must be put in registers. The value must be zero for arguments that are
++ passed entirely in registers or that are entirely pushed on the stack.
++
++ On some machines, certain arguments must be passed partially in registers
++ and partially in memory. On these machines, typically the first N words of
++ arguments are passed in registers, and the rest on the stack. If a
++ multi-word argument (a `double' or a structure) crosses that boundary, its
++ first few words must be passed in registers and the rest must be pushed.
++ This macro tells the compiler when this occurs, and how many of the words
++ should go in registers.
++
++ `FUNCTION_ARG' for these arguments should return the first register to be
++ used by the caller for this argument; likewise `FUNCTION_INCOMING_ARG', for
++ the called function. */
++
++/* A C expression that indicates when an argument must be passed by reference.
++ If nonzero for an argument, a copy of that argument is made in memory and a
++ pointer to the argument is passed instead of the argument itself. The
++ pointer is passed in whatever way is appropriate for passing a pointer to
++ that type.
++
++ On machines where `REG_PARM_STACK_SPACE' is not defined, a suitable
++ definition of this macro might be
++ #define FUNCTION_ARG_PASS_BY_REFERENCE(CUM, MODE, TYPE, NAMED) \
++ MUST_PASS_IN_STACK (MODE, TYPE) */
++
++/* If defined, a C expression that indicates when it is the called function's
++ responsibility to make a copy of arguments passed by invisible reference.
++ Normally, the caller makes a copy and passes the address of the copy to the
++ routine being called. When FUNCTION_ARG_CALLEE_COPIES is defined and is
++ nonzero, the caller does not make a copy. Instead, it passes a pointer to
++ the "live" value. The called function must not modify this value. If it
++ can be determined that the value won't be modified, it need not make a copy;
++ otherwise a copy must be made. */
++
++/* A C type for declaring a variable that is used as the first argument of
++ `FUNCTION_ARG' and other related values. For some target machines, the type
++ `int' suffices and can hold the number of bytes of argument so far.
++
++ There is no need to record in `CUMULATIVE_ARGS' anything about the arguments
++ that have been passed on the stack. The compiler has other variables to
++ keep track of that. For target machines on which all arguments are passed
++ on the stack, there is no need to store anything in `CUMULATIVE_ARGS';
++ however, the data structure must exist and should not be empty, so use
++ `int'. */
++struct cum_arg
++{
++ int nbytes;
++ int reg;
++ int stdarg;
++};
++#define CUMULATIVE_ARGS struct cum_arg
++
++/* A C statement (sans semicolon) for initializing the variable CUM for the
++ state at the beginning of the argument list. The variable has type
++ `CUMULATIVE_ARGS'. The value of FNTYPE is the tree node for the data type
++ of the function which will receive the args, or 0 if the args are to a
++ compiler support library function. The value of INDIRECT is nonzero when
++ processing an indirect call, for example a call through a function pointer.
++ The value of INDIRECT is zero for a call to an explicitly named function, a
++ library function call, or when `INIT_CUMULATIVE_ARGS' is used to find
++ arguments for the function being compiled.
++
++ When processing a call to a compiler support library function, LIBNAME
++ identifies which one. It is a `symbol_ref' rtx which contains the name of
++ the function, as a string. LIBNAME is 0 when an ordinary C function call is
++ being processed. Thus, each time this macro is called, either LIBNAME or
++ FNTYPE is nonzero, but never both of them at once. */
++
++#define INIT_CUMULATIVE_ARGS(CUM,FNTYPE,LIBNAME,INDIRECT, NAMED_ARGS) \
++ init_cumulative_args (&(CUM), FNTYPE, LIBNAME, INDIRECT);
++
++/* A C statement (sans semicolon) to update the summarizer variable CUM to
++ advance past an argument in the argument list. The values MODE, TYPE and
++ NAMED describe that argument. Once this is done, the variable CUM is
++ suitable for analyzing the *following* argument with `FUNCTION_ARG', etc.
++
++ This macro need not do anything if the argument in question was passed on
++ the stack. The compiler knows how to track the amount of stack space used
++ for arguments without any special help. */
++#define FUNCTION_ARG_ADVANCE(CUM, MODE, TYPE, NAMED) \
++ ((CUM).nbytes += ((MODE) != BLKmode \
++ ? (GET_MODE_SIZE (MODE) + 3) & ~3 \
++ : (int_size_in_bytes (TYPE) + 3) & ~3))
++
++/* For the Ubicom32 we define the upper function argument register here. */
++#define UBICOM32_FUNCTION_ARG_REGS 10
++
++/* A C expression that is nonzero if REGNO is the number of a hard register in
++ which function arguments are sometimes passed. This does *not* include
++ implicit arguments such as the static chain and the structure-value address.
++ On many machines, no registers can be used for this purpose since all
++ function arguments are pushed on the stack. */
++#define FUNCTION_ARG_REGNO_P(N) ((N) < UBICOM32_FUNCTION_ARG_REGS)
++
++
++/* How Scalar Function Values are Returned. */
++
++/* The number of the hard register that is used to return a scalar value from a
++ function call. */
++#define RETURN_VALUE_REGNUM 0
++
++/* A C expression to create an RTX representing the place where a function
++ returns a value of data type VALTYPE. VALTYPE is a tree node representing a
++ data type. Write `TYPE_MODE (VALTYPE)' to get the machine mode used to
++ represent that type. On many machines, only the mode is relevant.
++ (Actually, on most machines, scalar values are returned in the same place
++ regardless of mode).
++
++ If `PROMOTE_FUNCTION_RETURN' is defined, you must apply the same promotion
++ rules specified in `PROMOTE_MODE' if VALTYPE is a scalar type.
++
++ If the precise function being called is known, FUNC is a tree node
++ (`FUNCTION_DECL') for it; otherwise, FUNC is a null pointer. This makes it
++ possible to use a different value-returning convention for specific
++ functions when all their calls are known.
++
++ `FUNCTION_VALUE' is not used for return vales with aggregate data types,
++ because these are returned in another way. See `STRUCT_VALUE_REGNUM' and
++ related macros, below. */
++#define FUNCTION_VALUE(VALTYPE, FUNC) \
++ gen_rtx_REG (TYPE_MODE (VALTYPE), FIRST_DATA_REGNUM)
++
++/* A C expression to create an RTX representing the place where a library
++ function returns a value of mode MODE.
++
++ Note that "library function" in this context means a compiler support
++ routine, used to perform arithmetic, whose name is known specially by the
++ compiler and was not mentioned in the C code being compiled.
++
++ The definition of `LIBRARY_VALUE' need not be concerned aggregate data
++ types, because none of the library functions returns such types. */
++#define LIBCALL_VALUE(MODE) gen_rtx_REG (MODE, FIRST_DATA_REGNUM)
++
++/* A C expression that is nonzero if REGNO is the number of a hard register in
++ which the values of called function may come back.
++
++ A register whose use for returning values is limited to serving as the
++ second of a pair (for a value of type `double', say) need not be recognized
++ by this macro. So for most machines, this definition suffices:
++
++ #define FUNCTION_VALUE_REGNO_P(N) ((N) == RETURN)
++
++ If the machine has register windows, so that the caller and the called
++ function use different registers for the return value, this macro should
++ recognize only the caller's register numbers. */
++#define FUNCTION_VALUE_REGNO_P(N) ((N) == FIRST_DATA_REGNUM)
++
++
++/* How Large Values are Returned. */
++
++/* A C expression which can inhibit the returning of certain function values in
++ registers, based on the type of value. A nonzero value says to return the
++ function value in memory, just as large structures are always returned.
++ Here TYPE will be a C expression of type `tree', representing the data type
++ of the value.
++
++ Note that values of mode `BLKmode' must be explicitly handled by this macro.
++ Also, the option `-fpcc-struct-return' takes effect regardless of this
++ macro. On most systems, it is possible to leave the macro undefined; this
++ causes a default definition to be used, whose value is the constant 1 for
++ `BLKmode' values, and 0 otherwise.
++
++ Do not use this macro to indicate that structures and unions should always
++ be returned in memory. You should instead use `DEFAULT_PCC_STRUCT_RETURN'
++ to indicate this. */
++#define RETURN_IN_MEMORY(TYPE) \
++ (int_size_in_bytes (TYPE) > 8 || TYPE_MODE (TYPE) == BLKmode)
++
++/* Define this macro to be 1 if all structure and union return values must be
++ in memory. Since this results in slower code, this should be defined only
++ if needed for compatibility with other compilers or with an ABI. If you
++ define this macro to be 0, then the conventions used for structure and union
++ return values are decided by the `RETURN_IN_MEMORY' macro.
++
++ If not defined, this defaults to the value 1. */
++#define DEFAULT_PCC_STRUCT_RETURN 0
++
++/* If the structure value address is not passed in a register, define
++ `STRUCT_VALUE' as an expression returning an RTX for the place
++ where the address is passed. If it returns 0, the address is
++ passed as an "invisible" first argument. */
++#define STRUCT_VALUE 0
++
++/* Define this macro as a C expression that is nonzero if the return
++ instruction or the function epilogue ignores the value of the stack pointer;
++ in other words, if it is safe to delete an instruction to adjust the stack
++ pointer before a return from the function.
++
++ Note that this macro's value is relevant only for functions for which frame
++ pointers are maintained. It is never safe to delete a final stack
++ adjustment in a function that has no frame pointer, and the compiler knows
++ this regardless of `EXIT_IGNORE_STACK'. */
++#define EXIT_IGNORE_STACK 1
++
++/* A C statement or compound statement to output to FILE some assembler code to
++ call the profiling subroutine `mcount'. Before calling, the assembler code
++ must load the address of a counter variable into a register where `mcount'
++ expects to find the address. The name of this variable is `LP' followed by
++ the number LABELNO, so you would generate the name using `LP%d' in a
++ `fprintf'.
++
++ The details of how the address should be passed to `mcount' are determined
++ by your operating system environment, not by GNU CC. To figure them out,
++ compile a small program for profiling using the system's installed C
++ compiler and look at the assembler code that results.
++
++ This declaration must be present, but it can be an abort if profiling is
++ not implemented. */
++
++#define FUNCTION_PROFILER(file, labelno) ubicom32_profiler(file, labelno)
++
++/* A C statement to output, on the stream FILE, assembler code for a block of
++ data that contains the constant parts of a trampoline. This code should not
++ include a label--the label is taken care of automatically. */
++#if 0
++#define TRAMPOLINE_TEMPLATE(FILE) \
++ do { \
++ fprintf (FILE, "\tadd -4,sp\n"); \
++ fprintf (FILE, "\t.long 0x0004fffa\n"); \
++ fprintf (FILE, "\tmov (0,sp),a0\n"); \
++ fprintf (FILE, "\tadd 4,sp\n"); \
++ fprintf (FILE, "\tmov (13,a0),a1\n"); \
++ fprintf (FILE, "\tmov (17,a0),a0\n"); \
++ fprintf (FILE, "\tjmp (a0)\n"); \
++ fprintf (FILE, "\t.long 0\n"); \
++ fprintf (FILE, "\t.long 0\n"); \
++ } while (0)
++#endif
++
++/* A C expression for the size in bytes of the trampoline, as an integer. */
++#define TRAMPOLINE_SIZE 0x1b
++
++/* Alignment required for trampolines, in bits.
++
++ If you don't define this macro, the value of `BIGGEST_ALIGNMENT' is used for
++ aligning trampolines. */
++#define TRAMPOLINE_ALIGNMENT 32
++
++/* A C statement to initialize the variable parts of a trampoline. ADDR is an
++ RTX for the address of the trampoline; FNADDR is an RTX for the address of
++ the nested function; STATIC_CHAIN is an RTX for the static chain value that
++ should be passed to the function when it is called. */
++#define INITIALIZE_TRAMPOLINE(TRAMP, FNADDR, CXT) \
++{ \
++ emit_move_insn (gen_rtx_MEM (SImode, plus_constant ((TRAMP), 0x14)), \
++ (CXT)); \
++ emit_move_insn (gen_rtx_MEM (SImode, plus_constant ((TRAMP), 0x18)), \
++ (FNADDR)); \
++}
++
++/* Ubicom32 supports pre and post increment/decrement addressing. */
++#define HAVE_POST_INCREMENT 1
++#define HAVE_PRE_INCREMENT 1
++#define HAVE_POST_DECREMENT 1
++#define HAVE_PRE_DECREMENT 1
++
++/* Ubicom32 supports pre and post address side-effects with constants
++ other than the size of the memory operand. */
++#define HAVE_PRE_MODIFY_DISP 1
++#define HAVE_POST_MODIFY_DISP 1
++
++/* A C expression that is 1 if the RTX X is a constant which is a valid
++ address. On most machines, this can be defined as `CONSTANT_P (X)',
++ but a few machines are more restrictive in which constant addresses
++ are supported.
++
++ `CONSTANT_P' accepts integer-values expressions whose values are not
++ explicitly known, such as `symbol_ref', `label_ref', and `high'
++ expressions and `const' arithmetic expressions, in addition to
++ `const_int' and `const_double' expressions. */
++#define CONSTANT_ADDRESS_P(X) \
++ (GET_CODE (X) == LABEL_REF \
++ || (GET_CODE (X) == CONST \
++ && GET_CODE (XEXP (X, 0)) == PLUS \
++ && GET_CODE (XEXP (XEXP (X, 0), 0)) == LABEL_REF))
++
++/* Ubicom32 supports a maximum of 2 registers in a valid memory address.
++ One is always an address register while a second, optional, one may be a
++ data register. */
++#define MAX_REGS_PER_ADDRESS 2
++
++/* A C compound statement with a conditional `goto LABEL;' executed if X (an
++ RTX) is a legitimate memory address on the target machine for a memory
++ operand of mode MODE.
++
++ It usually pays to define several simpler macros to serve as subroutines for
++ this one. Otherwise it may be too complicated to understand.
++
++ This macro must exist in two variants: a strict variant and a non-strict
++ one. The strict variant is used in the reload pass. It must be defined so
++ that any pseudo-register that has not been allocated a hard register is
++ considered a memory reference. In contexts where some kind of register is
++ required, a pseudo-register with no hard register must be rejected.
++
++ The non-strict variant is used in other passes. It must be defined to
++ accept all pseudo-registers in every context where some kind of register is
++ required.
++
++ Compiler source files that want to use the strict variant of this macro
++ define the macro `REG_OK_STRICT'. You should use an `#ifdef REG_OK_STRICT'
++ conditional to define the strict variant in that case and the non-strict
++ variant otherwise.
++
++ Subroutines to check for acceptable registers for various purposes (one for
++ base registers, one for index registers, and so on) are typically among the
++ subroutines used to define `GO_IF_LEGITIMATE_ADDRESS'. Then only these
++ subroutine macros need have two variants; the higher levels of macros may be
++ the same whether strict or not.
++
++ Normally, constant addresses which are the sum of a `symbol_ref' and an
++ integer are stored inside a `const' RTX to mark them as constant.
++ Therefore, there is no need to recognize such sums specifically as
++ legitimate addresses. Normally you would simply recognize any `const' as
++ legitimate.
++
++ Usually `PRINT_OPERAND_ADDRESS' is not prepared to handle constant sums that
++ are not marked with `const'. It assumes that a naked `plus' indicates
++ indexing. If so, then you *must* reject such naked constant sums as
++ illegitimate addresses, so that none of them will be given to
++ `PRINT_OPERAND_ADDRESS'.
++
++ On some machines, whether a symbolic address is legitimate depends on the
++ section that the address refers to. On these machines, define the macro
++ `ENCODE_SECTION_INFO' to store the information into the `symbol_ref', and
++ then check for it here. When you see a `const', you will have to look
++ inside it to find the `symbol_ref' in order to determine the section.
++
++ The best way to modify the name string is by adding text to the beginning,
++ with suitable punctuation to prevent any ambiguity. Allocate the new name
++ in `saveable_obstack'. You will have to modify `ASM_OUTPUT_LABELREF' to
++ remove and decode the added text and output the name accordingly, and define
++ `STRIP_NAME_ENCODING' to access the original name string.
++
++ You can check the information stored here into the `symbol_ref' in the
++ definitions of the macros `GO_IF_LEGITIMATE_ADDRESS' and
++ `PRINT_OPERAND_ADDRESS'. */
++/* On the ubicom32, the value in the address register must be
++ in the same memory space/segment as the effective address.
++
++ This is problematical for reload since it does not understand
++ that base+index != index+base in a memory reference. */
++
++#ifdef REG_OK_STRICT
++#define GO_IF_LEGITIMATE_ADDRESS(MODE, X, ADDR) \
++ if (ubicom32_legitimate_address_p (MODE, X, 1)) goto ADDR;
++#else
++#define GO_IF_LEGITIMATE_ADDRESS(MODE, X, ADDR) \
++ if (ubicom32_legitimate_address_p (MODE, X, 0)) goto ADDR;
++#endif
++
++/* Try machine-dependent ways of modifying an illegitimate address
++ to be legitimate. If we find one, return the new, valid address.
++ This macro is used in only one place: `memory_address' in explow.c.
++
++ OLDX is the address as it was before break_out_memory_refs was called.
++ In some cases it is useful to look at this to decide what needs to be done.
++
++ MODE and WIN are passed so that this macro can use
++ GO_IF_LEGITIMATE_ADDRESS.
++
++ It is always safe for this macro to do nothing. It exists to recognize
++ opportunities to optimize the output.
++
++ On RS/6000, first check for the sum of a register with a constant
++ integer that is out of range. If so, generate code to add the
++ constant with the low-order 16 bits masked to the register and force
++ this result into another register (this can be done with `cau').
++ Then generate an address of REG+(CONST&0xffff), allowing for the
++ possibility of bit 16 being a one.
++
++ Then check for the sum of a register and something not constant, try to
++ load the other things into a register and return the sum. */
++
++#define LEGITIMIZE_ADDRESS(X, OLDX, MODE, WIN) \
++{ \
++ rtx result = ubicom32_legitimize_address ((X), (OLDX), (MODE)); \
++ if (result != NULL_RTX) \
++ { \
++ (X) = result; \
++ goto WIN; \
++ } \
++}
++
++/* Try a machine-dependent way of reloading an illegitimate address
++ operand. If we find one, push the reload and jump to WIN. This
++ macro is used in only one place: `find_reloads_address' in reload.c. */
++#define LEGITIMIZE_RELOAD_ADDRESS(AD, MODE, OPNUM, TYPE, IND, WIN) \
++{ \
++ rtx new_rtx = ubicom32_legitimize_reload_address ((AD), (MODE), (OPNUM), (int)(TYPE)); \
++ if (new_rtx) \
++ { \
++ (AD) = new_rtx; \
++ goto WIN; \
++ } \
++}
++
++/* A C statement or compound statement with a conditional `goto LABEL;'
++ executed if memory address X (an RTX) can have different meanings depending
++ on the machine mode of the memory reference it is used for or if the address
++ is valid for some modes but not others.
++
++ Autoincrement and autodecrement addresses typically have mode-dependent
++ effects because the amount of the increment or decrement is the size of the
++ operand being addressed. Some machines have other mode-dependent addresses.
++ Many RISC machines have no mode-dependent addresses.
++
++ You may assume that ADDR is a valid address for the machine. */
++#define GO_IF_MODE_DEPENDENT_ADDRESS(ADDR, LABEL) \
++ if (ubicom32_mode_dependent_address_p (ADDR)) \
++ goto LABEL;
++
++/* A C expression that is nonzero if X is a legitimate constant for an
++ immediate operand on the target machine. You can assume that X
++ satisfies `CONSTANT_P', so you need not check this. In fact, `1' is
++ a suitable definition for this macro on machines where anything
++ `CONSTANT_P' is valid. */
++#define LEGITIMATE_CONSTANT_P(X) \
++ ubicom32_legitimate_constant_p ((X))
++
++/* Moves between registers are pretty-much single instructions for
++ Ubicom32. We make this the default "2" that gcc likes. */
++#define REGISTER_MOVE_COST(MODE, FROM, TO) 2
++
++/* This is a little bit of magic from the S390 port that wins 2% on code
++ size when building the Linux kernel! Unfortunately while it wins on
++ that size the user-space apps built using FD-PIC don't improve and the
++ performance is lower because we put more pressure on the caches. We may
++ want this back on some future CPU that has higher cache performance. */
++/* #define IRA_HARD_REGNO_ADD_COST_MULTIPLIER(regno) 0.5 */
++
++/* Moves between registers and memory are more expensive than between
++ registers because we have caches and write buffers that slow things
++ down! */
++#define MEMORY_MOVE_COST(MODE, CLASS, IN) 2
++
++/* A fall-through branch is very low cost but anything that changes the PC
++ incurs a major pipeline hazard. We don't make the full extent of this
++ hazard visible because we hope that multiple threads will absorb much
++ of the cost and so we don't want a jump being replaced with, say, 7
++ instructions. */
++#define BRANCH_COST(SPEED_P, PREDICTABLE_P) \
++ ((PREDICTABLE_P) ? 1 : 3)
++
++/* Define this macro as a C expression which is nonzero if accessing less than
++ a word of memory (i.e. a `char' or a `short') is no faster than accessing a
++ word of memory, i.e., if such access require more than one instruction or if
++ there is no difference in cost between byte and (aligned) word loads.
++
++ When this macro is not defined, the compiler will access a field by finding
++ the smallest containing object; when it is defined, a fullword load will be
++ used if alignment permits. Unless bytes accesses are faster than word
++ accesses, using word accesses is preferable since it may eliminate
++ subsequent memory access if subsequent accesses occur to other fields in the
++ same word of the structure, but to different bytes. */
++#define SLOW_BYTE_ACCESS 0
++
++/* The number of scalar move insns which should be generated instead of a
++ string move insn or a library call. Increasing the value will always make
++ code faster, but eventually incurs high cost in increased code size.
++
++ If you don't define this, a reasonable default is used. */
++/* According to expr.c, a value of around 6 should minimize code size. */
++#define MOVE_RATIO(SPEED) 6
++
++/* We're much better off calling a constant function address with the
++ Ubicom32 architecture because we have an opcode for doing so. Don't
++ let the compiler extract function addresses as common subexpressions
++ into an address register. */
++#define NO_FUNCTION_CSE
++
++#define SELECT_CC_MODE(OP, X, Y) ubicom32_select_cc_mode (OP, X, Y)
++
++#define REVERSIBLE_CC_MODE(MODE) 1
++
++/* Canonicalize a comparison from one we don't have to one we do have. */
++#define CANONICALIZE_COMPARISON(CODE, OP0, OP1) \
++ ubicom32_canonicalize_comparison (&(CODE), &(OP0), &(OP1))
++
++/* Dividing the output into sections. */
++
++/* A C expression whose value is a string containing the assembler operation
++ that should precede instructions and read-only data. Normally `".text"' is
++ right. */
++#define TEXT_SECTION_ASM_OP "\t.section .text"
++
++/* A C expression whose value is a string containing the assembler operation to
++ identify the following data as writable initialized data. Normally
++ `".data"' is right. */
++#define DATA_SECTION_ASM_OP "\t.section .data"
++
++
++/* If defined, a C expression whose value is a string containing the
++ assembler operation to identify the following data as
++ uninitialized global data. If not defined, and neither
++ `ASM_OUTPUT_BSS' nor `ASM_OUTPUT_ALIGNED_BSS' are defined,
++ uninitialized global data will be output in the data section if
++ `-fno-common' is passed, otherwise `ASM_OUTPUT_COMMON' will be
++ used. */
++#define BSS_SECTION_ASM_OP "\t.section .bss"
++
++/* This is how we tell the assembler that a symbol is weak. */
++
++#define ASM_WEAKEN_LABEL(FILE, NAME) \
++ do \
++ { \
++ fputs ("\t.weak\t", (FILE)); \
++ assemble_name ((FILE), (NAME)); \
++ fputc ('\n', (FILE)); \
++ } \
++ while (0)
++
++/* The Overall Framework of an Assembler File. */
++
++#undef SET_ASM_OP
++#define SET_ASM_OP "\t.set\t"
++
++/* A C string constant describing how to begin a comment in the target
++ assembler language. The compiler assumes that the comment will end at the
++ end of the line. */
++#define ASM_COMMENT_START ";"
++
++/* A C string constant for text to be output before each `asm' statement or
++ group of consecutive ones. Normally this is `"#APP"', which is a comment
++ that has no effect on most assemblers but tells the GNU assembler that it
++ must check the lines that follow for all valid assembler constructs. */
++#define ASM_APP_ON "#APP\n"
++
++/* A C string constant for text to be output after each `asm' statement or
++ group of consecutive ones. Normally this is `"#NO_APP"', which tells the
++ GNU assembler to resume making the time-saving assumptions that are valid
++ for ordinary compiler output. */
++#define ASM_APP_OFF "#NO_APP\n"
++
++/* Like `ASM_OUTPUT_BSS' except takes the required alignment as a separate,
++ explicit argument. If you define this macro, it is used in place of
++ `ASM_OUTPUT_BSS', and gives you more flexibility in handling the required
++ alignment of the variable. The alignment is specified as the number of
++ bits.
++
++ Try to use function `asm_output_aligned_bss' defined in file `varasm.c' when
++ defining this macro. */
++#define ASM_OUTPUT_ALIGNED_BSS(FILE, DECL, NAME, SIZE, ALIGN) \
++ asm_output_aligned_bss ((FILE), (DECL), (NAME), (SIZE), (ALIGN))
++
++/* A C expression to assign to OUTVAR (which is a variable of type `char *') a
++ newly allocated string made from the string NAME and the number NUMBER, with
++ some suitable punctuation added. Use `alloca' to get space for the string.
++
++ The string will be used as an argument to `ASM_OUTPUT_LABELREF' to produce
++ an assembler label for an internal static variable whose name is NAME.
++ Therefore, the string must be such as to result in valid assembler code.
++ The argument NUMBER is different each time this macro is executed; it
++ prevents conflicts between similarly-named internal static variables in
++ different scopes.
++
++ Ideally this string should not be a valid C identifier, to prevent any
++ conflict with the user's own symbols. Most assemblers allow periods or
++ percent signs in assembler symbols; putting at least one of these between
++ the name and the number will suffice. */
++#define ASM_FORMAT_PRIVATE_NAME(OUTPUT, NAME, LABELNO) \
++ ((OUTPUT) = (char *) alloca (strlen ((NAME)) + 10), \
++ sprintf ((OUTPUT), "%s___%d", (NAME), (LABELNO)))
++
++#define ASM_GENERATE_INTERNAL_LABEL(STRING, PREFIX, NUM) \
++ sprintf (STRING, "*.%s%ld", PREFIX, (long)(NUM))
++/* A C statement to store into the string STRING a label whose name
++ is made from the string PREFIX and the number NUM.
++
++ This string, when output subsequently by `assemble_name', should
++ produce the output that `(*targetm.asm_out.internal_label)' would produce
++ with the same PREFIX and NUM.
++
++ If the string begins with `*', then `assemble_name' will output
++ the rest of the string unchanged. It is often convenient for
++ `ASM_GENERATE_INTERNAL_LABEL' to use `*' in this way. If the
++ string doesn't start with `*', then `ASM_OUTPUT_LABELREF' gets to
++ output the string, and may change it. (Of course,
++ `ASM_OUTPUT_LABELREF' is also part of your machine description, so
++ you should know what it does on your machine.) */
++
++/* This says how to output assembler code to declare an
++ uninitialized external linkage data object. Under SVR4,
++ the linker seems to want the alignment of data objects
++ to depend on their types. We do exactly that here. */
++
++#define COMMON_ASM_OP "\t.comm\t"
++
++#undef ASM_OUTPUT_COMMON
++#define ASM_OUTPUT_COMMON(FILE, NAME, SIZE, ROUNDED) \
++ do \
++ { \
++ fprintf ((FILE), "%s", COMMON_ASM_OP); \
++ assemble_name ((FILE), (NAME)); \
++ fprintf ((FILE), ", %u\n", (SIZE)); \
++ } \
++ while (0)
++
++/* This says how to output assembler code to declare an
++ uninitialized internal linkage data object. Under SVR4,
++ the linker seems to want the alignment of data objects
++ to depend on their types. We do exactly that here. */
++#define LOCAL_ASM_OP "\t.lcomm\t"
++
++#undef ASM_OUTPUT_LOCAL
++#define ASM_OUTPUT_LOCAL(FILE, NAME, SIZE, ROUNDED) \
++ do \
++ { \
++ fprintf ((FILE), "%s", LOCAL_ASM_OP); \
++ assemble_name ((FILE), (NAME)); \
++ fprintf ((FILE), ", %u\n", (SIZE)); \
++ } \
++ while (0)
++
++/* Globalizing directive for a label. */
++#define GLOBAL_ASM_OP ".global\t"
++
++/* Output the operand of an instruction. */
++#define PRINT_OPERAND(FILE, X, CODE) \
++ ubicom32_print_operand(FILE, X, CODE)
++
++/* Output the address of an operand. */
++#define PRINT_OPERAND_ADDRESS(FILE, ADDR) \
++ ubicom32_print_operand_address (FILE, ADDR)
++
++/* A C expression to output to STREAM some assembler code which will push hard
++ register number REGNO onto the stack. The code need not be optimal, since
++ this macro is used only when profiling. */
++#define ASM_OUTPUT_REG_PUSH(FILE, REGNO)
++
++/* A C expression to output to STREAM some assembler code which will pop hard
++ register number REGNO off of the stack. The code need not be optimal, since
++ this macro is used only when profiling. */
++#define ASM_OUTPUT_REG_POP(FILE, REGNO)
++
++/* This macro should be provided on machines where the addresses in a dispatch
++ table are relative to the table's own address.
++
++ The definition should be a C statement to output to the stdio stream STREAM
++ an assembler pseudo-instruction to generate a difference between two labels.
++ VALUE and REL are the numbers of two internal labels. The definitions of
++ these labels are output using `ASM_OUTPUT_INTERNAL_LABEL', and they must be
++ printed in the same way here. For example,
++
++ fprintf (STREAM, "\t.word L%d-L%d\n", VALUE, REL) */
++#define ASM_OUTPUT_ADDR_DIFF_ELT(FILE, BODY, VALUE, REL) \
++ fprintf (FILE, "\t%s .L%d-.L%d\n", ".long", VALUE, REL)
++
++/* This macro should be provided on machines where the addresses in a dispatch
++ table are absolute.
++
++ The definition should be a C statement to output to the stdio stream STREAM
++ an assembler pseudo-instruction to generate a reference to a label. VALUE
++ is the number of an internal label whose definition is output using
++ `ASM_OUTPUT_INTERNAL_LABEL'. For example,
++
++ fprintf (STREAM, "\t.word L%d\n", VALUE) */
++#define ASM_OUTPUT_ADDR_VEC_ELT(STREAM, VALUE) \
++ fprintf (STREAM, "\t.word .L%d\n", VALUE)
++
++/* Switch into a generic section. */
++#define TARGET_ASM_NAMED_SECTION default_elf_asm_named_section
++
++/* Assembler Commands for Alignment. */
++
++#define ASM_OUTPUT_SKIP(STREAM, N) fprintf (STREAM, "\t.skip %d,0\n", N)
++/* A C statement to output to the stdio stream STREAM an assembler
++ instruction to advance the location counter by NBYTES bytes.
++ Those bytes should be zero when loaded. NBYTES will be a C
++ expression of type `int'. */
++
++/* A C statement to output to the stdio stream STREAM an assembler command to
++ advance the location counter to a multiple of 2 to the POWER bytes. POWER
++ will be a C expression of type `int'. */
++#define ASM_OUTPUT_ALIGN(FILE, LOG) \
++ if ((LOG) != 0) \
++ fprintf (FILE, "\t.align %d\n", (LOG))
++
++/* A C expression that returns the DBX register number for the compiler
++ register number REGNO. In simple cases, the value of this expression may be
++ REGNO itself. But sometimes there are some registers that the compiler
++ knows about and DBX does not, or vice versa. In such cases, some register
++ may need to have one number in the compiler and another for DBX.
++
++ If two registers have consecutive numbers inside GNU CC, and they can be
++ used as a pair to hold a multiword value, then they *must* have consecutive
++ numbers after renumbering with `DBX_REGISTER_NUMBER'. Otherwise, debuggers
++ will be unable to access such a pair, because they expect register pairs to
++ be consecutive in their own numbering scheme.
++
++ If you find yourself defining `DBX_REGISTER_NUMBER' in way that does not
++ preserve register pairs, then what you must do instead is redefine the
++ actual register numbering scheme.
++
++ This declaration is required. */
++#define DBX_REGISTER_NUMBER(REGNO) REGNO
++
++/* A C expression that returns the integer offset value for an automatic
++ variable having address X (an RTL expression). The default computation
++ assumes that X is based on the frame-pointer and gives the offset from the
++ frame-pointer. This is required for targets that produce debugging output
++ for DBX or COFF-style debugging output for SDB and allow the frame-pointer
++ to be eliminated when the `-g' options is used. */
++#define DEBUGGER_AUTO_OFFSET(X) \
++ ((GET_CODE (X) == PLUS ? INTVAL (XEXP (X, 1)) : 0) \
++ + (frame_pointer_needed \
++ ? 0 : -initial_elimination_offset (FRAME_POINTER_REGNUM, \
++ STACK_POINTER_REGNUM)))
++
++/* A C expression that returns the integer offset value for an argument having
++ address X (an RTL expression). The nominal offset is OFFSET. */
++#define DEBUGGER_ARG_OFFSET(OFFSET, X) \
++ ((GET_CODE (X) == PLUS ? OFFSET : 0) \
++ + (frame_pointer_needed \
++ ? 0 : -initial_elimination_offset (ARG_POINTER_REGNUM, \
++ STACK_POINTER_REGNUM)))
++
++/* A C expression that returns the type of debugging output GNU CC produces
++ when the user specifies `-g' or `-ggdb'. Define this if you have arranged
++ for GNU CC to support more than one format of debugging output. Currently,
++ the allowable values are `DBX_DEBUG', `SDB_DEBUG', `DWARF_DEBUG',
++ `DWARF2_DEBUG', and `XCOFF_DEBUG'.
++
++ The value of this macro only affects the default debugging output; the user
++ can always get a specific type of output by using `-gstabs', `-gcoff',
++ `-gdwarf-1', `-gdwarf-2', or `-gxcoff'.
++
++ Defined in svr4.h.
++*/
++#undef PREFERRED_DEBUGGING_TYPE
++#define PREFERRED_DEBUGGING_TYPE DWARF2_DEBUG
++
++/* Define this macro if GNU CC should produce dwarf version 2 format debugging
++ output in response to the `-g' option.
++
++ To support optional call frame debugging information, you must also define
++ `INCOMING_RETURN_ADDR_RTX' and either set `RTX_FRAME_RELATED_P' on the
++ prologue insns if you use RTL for the prologue, or call `dwarf2out_def_cfa'
++ and `dwarf2out_reg_save' as appropriate from `FUNCTION_PROLOGUE' if you
++ don't.
++
++ Defined in svr4.h. */
++
++#define DWARF2_DEBUGGING_INFO 1
++/*#define DWARF2_UNWIND_INFO 1*/
++#define DWARF2_UNWIND_INFO 0
++#define INCOMING_RETURN_ADDR_RTX gen_rtx_REG (Pmode, LINK_REGNO)
++#define INCOMING_FRAME_SP_OFFSET 0
++#define DWARF_FRAME_RETURN_COLUMN DWARF_FRAME_REGNUM (LINK_REGNO)
++#define EH_RETURN_FIRST 9
++#define EH_RETURN_DATA_REGNO(N) ((N) < 2 ? (N) + EH_RETURN_FIRST : INVALID_REGNUM)
++
++/* The EH_RETURN_STACKADJ_RTX macro returns RTL which describes the
++ location used to store the amount to ajdust the stack. This is
++ usually a registers that is available from end of the function's body
++ to the end of the epilogue. Thus, this cannot be a register used as a
++ temporary by the epilogue.
++
++ This must be an integer register. */
++#define EH_RETURN_STACKADJ_REGNO 11
++#define EH_RETURN_STACKADJ_RTX \
++ gen_rtx_REG (Pmode, EH_RETURN_STACKADJ_REGNO)
++
++/* The EH_RETURN_HANDLER_RTX macro returns RTL which describes the
++ location used to store the address the processor should jump to
++ catch exception. This is usually a registers that is available from
++ end of the function's body to the end of the epilogue. Thus, this
++ cannot be a register used as a temporary by the epilogue.
++
++ This must be an address register. */
++#define EH_RETURN_HANDLER_REGNO 18
++#define EH_RETURN_HANDLER_RTX \
++ gen_rtx_REG (Pmode, EH_RETURN_HANDLER_REGNO)
++
++/* #define DWARF2_DEBUGGING_INFO */
++
++/* Define this macro if GNU CC should produce dwarf version 2-style
++ line numbers. This usually requires extending the assembler to
++ support them, and #defining DWARF2_LINE_MIN_INSN_LENGTH in the
++ assembler configuration header files. */
++/* #define DWARF2_ASM_LINE_DEBUG_INFO 1 */
++
++
++/* An alias for a machine mode name. This is the machine mode that elements
++ of a jump-table have. */
++#define CASE_VECTOR_MODE Pmode
++
++/* Smallest number of different values for which it is best to use a
++ jump-table instead of a tree of conditional branches. For most Ubicom32
++ targets this is quite small, but for the v1 architecture implementations
++ we had very little data memory and so heavily prefer the tree approach
++ rather than the jump tables. */
++#define CASE_VALUES_THRESHOLD ubicom32_case_values_threshold
++
++/* Register operations within the Ubicom32 architecture always operate on
++ the whole register word and not just the sub-bits required for the opcode
++ mode size. */
++#define WORD_REGISTER_OPERATIONS
++
++/* The maximum number of bytes that a single instruction can move quickly from
++ memory to memory. */
++#define MOVE_MAX 4
++
++/* A C expression that is nonzero if on this machine the number of bits
++ actually used for the count of a shift operation is equal to the number of
++ bits needed to represent the size of the object being shifted. When this
++ macro is non-zero, the compiler will assume that it is safe to omit a
++ sign-extend, zero-extend, and certain bitwise `and' instructions that
++ truncates the count of a shift operation. On machines that have
++ instructions that act on bitfields at variable positions, which may include
++ `bit test' instructions, a nonzero `SHIFT_COUNT_TRUNCATED' also enables
++ deletion of truncations of the values that serve as arguments to bitfield
++ instructions.
++
++ If both types of instructions truncate the count (for shifts) and position
++ (for bitfield operations), or if no variable-position bitfield instructions
++ exist, you should define this macro.
++
++ However, on some machines, such as the 80386 and the 680x0, truncation only
++ applies to shift operations and not the (real or pretended) bitfield
++ operations. Define `SHIFT_COUNT_TRUNCATED' to be zero on such machines.
++ Instead, add patterns to the `md' file that include the implied truncation
++ of the shift instructions.
++
++ You need not define this macro if it would always have the value of zero. */
++#define SHIFT_COUNT_TRUNCATED 1
++
++/* A C expression which is nonzero if on this machine it is safe to "convert"
++ an integer of INPREC bits to one of OUTPREC bits (where OUTPREC is smaller
++ than INPREC) by merely operating on it as if it had only OUTPREC bits.
++
++ On many machines, this expression can be 1.
++
++ When `TRULY_NOOP_TRUNCATION' returns 1 for a pair of sizes for modes for
++ which `MODES_TIEABLE_P' is 0, suboptimal code can result. If this is the
++ case, making `TRULY_NOOP_TRUNCATION' return 0 in such cases may improve
++ things. */
++#define TRULY_NOOP_TRUNCATION(OUTPREC, INPREC) 1
++
++/* A C string constant that tells the GNU CC driver program options to pass
++ to the assembler. It can also specify how to translate options you give
++ to GNU CC into options for GNU CC to pass to the assembler. See the
++ file `sun3.h' for an example of this.
++
++ Defined in svr4.h. */
++#undef ASM_SPEC
++#define ASM_SPEC \
++ "%{march=*:-m%*} %{!march=*:-mubicom32v4} %{mfdpic:-mfdpic}"
++
++#define LINK_SPEC "\
++%{h*} %{v:-V} \
++%{b} \
++%{mfdpic:-melf32ubicom32fdpic -z text} \
++%{static:-dn -Bstatic} \
++%{shared:-G -Bdynamic} \
++%{symbolic:-Bsymbolic} \
++%{G*} \
++%{YP,*} \
++%{Qy:} %{!Qn:-Qy}"
++
++#undef STARTFILE_SPEC
++#undef ENDFILE_SPEC
++
++/* The svr4.h LIB_SPEC with -leval and --*group tacked on */
++
++#undef LIB_SPEC
++#define LIB_SPEC "%{!shared:%{!symbolic:--start-group -lc -leval -lgcc --end-group}}"
++
++#undef HAVE_GAS_SHF_MERGE
++#define HAVE_GAS_SHF_MERGE 0
++
++#define HANDLE_SYSV_PRAGMA 1
++#undef HANDLE_PRAGMA_PACK
++
++typedef void (*ubicom32_func_ptr) (void);
++
++/* Define builtins for selected special-purpose instructions. */
++enum ubicom32_builtins
++{
++ UBICOM32_BUILTIN_UBICOM32_SWAPB_2,
++ UBICOM32_BUILTIN_UBICOM32_SWAPB_4
++};
++
++extern rtx ubicom32_compare_op0;
++extern rtx ubicom32_compare_op1;
++
++#define TYPE_ASM_OP "\t.type\t"
++#define TYPE_OPERAND_FMT "@%s"
++
++#ifndef ASM_DECLARE_RESULT
++#define ASM_DECLARE_RESULT(FILE, RESULT)
++#endif
++
++/* These macros generate the special .type and .size directives which
++ are used to set the corresponding fields of the linker symbol table
++ entries in an ELF object file under SVR4. These macros also output
++ the starting labels for the relevant functions/objects. */
++
++/* Write the extra assembler code needed to declare a function properly.
++ Some svr4 assemblers need to also have something extra said about the
++ function's return value. We allow for that here. */
++
++#ifndef ASM_DECLARE_FUNCTION_NAME
++#define ASM_DECLARE_FUNCTION_NAME(FILE, NAME, DECL) \
++ do \
++ { \
++ ASM_OUTPUT_TYPE_DIRECTIVE (FILE, NAME, "function"); \
++ ASM_DECLARE_RESULT (FILE, DECL_RESULT (DECL)); \
++ ASM_OUTPUT_LABEL (FILE, NAME); \
++ } \
++ while (0)
++#endif
+--- /dev/null
++++ b/gcc/config/ubicom32/ubicom32.md
+@@ -0,0 +1,3753 @@
++; GCC machine description for Ubicom32
++;
++; Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009 Free Software
++; Foundation, Inc.
++; Contributed by Ubicom, Inc.
++;
++; 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/>.
++
++(define_constants
++ [(AUX_DATA_REGNO 15)
++ (LINK_REGNO 21)
++ (SP_REGNO 23)
++ (ACC0_HI_REGNO 24)
++ (ACC1_HI_REGNO 26)
++ (CC_REGNO 30)])
++
++(define_constants
++ [(UNSPEC_FDPIC_GOT 0)
++ (UNSPEC_FDPIC_GOT_FUNCDESC 1)])
++
++(define_constants
++ [(UNSPEC_VOLATILE_LOAD_FDPIC_FUNCDESC 0)])
++
++;; Types of instructions (for scheduling purposes).
++
++(define_attr "type" "mul,addr,other"
++ (const_string "other"))
++
++; Define instruction scheduling characteristics. We can only issue
++; one instruction per clock so we don't need to define CPU units.
++;
++(define_automaton "ubicom32")
++
++(define_cpu_unit "i_pipeline" "ubicom32");
++
++; We have a 4 cycle hazard associated with address calculations which
++; seems rather tricky to avoid so we go with a defensive assumption
++; that almost anything can be used to generate addresses.
++;
++;(define_insn_reservation "ubicom32_other" 4
++; (eq_attr "type" "other")
++; "i_pipeline")
++
++; Some moves don't generate hazards.
++;
++;(define_insn_reservation "ubicom32_addr" 1
++; (eq_attr "type" "addr")
++; "i_pipeline")
++
++; We need 3 cycles between a multiply instruction and any use of the
++; matching accumulator register(s).
++;
++(define_insn_reservation "ubicom32_mul" 4
++ (eq_attr "type" "mul")
++ "i_pipeline")
++
++(define_attr "length" ""
++ (const_int 4))
++
++(include "predicates.md")
++(include "constraints.md")
++
++; 8-bit move with no change to the flags reg.
++;
++(define_insn "movqi"
++ [(set (match_operand:QI 0 "nonimmediate_operand" "=rm")
++ (match_operand:QI 1 "ubicom32_move_operand" "g"))]
++ ""
++ "move.1\\t%0, %1")
++
++; Combiner-generated 8-bit move with the zero flag set accordingly.
++;
++(define_insn "movqi_ccszn"
++ [(set (reg CC_REGNO)
++ (compare (match_operand:QI 0 "nonimmediate_operand" "rm")
++ (const_int 0)))
++ (set (match_operand:QI 1 "nonimmediate_operand" "=rm")
++ (match_dup 0))]
++ "ubicom32_match_cc_mode(insn, CCSZNmode)"
++ "ext.1\\t%1, %0")
++
++; Combine isn't very good at merging some types of operations so we
++; have to make do with a peephole. It's not as effective but it's better
++; than doing nothing.
++;
++(define_peephole2
++ [(set (match_operand:QI 0 "nonimmediate_operand" "")
++ (match_operand:QI 1 "nonimmediate_operand" ""))
++ (set (match_operand 2 "ubicom32_cc_register_operand" "")
++ (match_operator 3 "ubicom32_compare_operator"
++ [(match_dup 0)
++ (const_int 0)]))]
++ "(GET_MODE (operands[2]) == CCSZNmode
++ || GET_MODE (operands[2]) == CCSZmode)"
++ [(parallel
++ [(set (match_dup 2)
++ (match_op_dup 3
++ [(match_dup 1)
++ (const_int 0)]))
++ (set (match_dup 0)
++ (match_dup 1))])]
++ "")
++
++; Combine isn't very good at merging some types of operations so we
++; have to make do with a peephole. It's not as effective but it's better
++; than doing nothing.
++;
++(define_peephole2
++ [(set (match_operand:QI 0 "nonimmediate_operand" "")
++ (match_operand:QI 1 "nonimmediate_operand" ""))
++ (set (match_operand 2 "ubicom32_cc_register_operand" "")
++ (match_operator 3 "ubicom32_compare_operator"
++ [(match_dup 1)
++ (const_int 0)]))]
++ "(GET_MODE (operands[2]) == CCSZNmode
++ || GET_MODE (operands[2]) == CCSZmode)"
++ [(parallel
++ [(set (match_dup 2)
++ (match_op_dup 3
++ [(match_dup 1)
++ (const_int 0)]))
++ (set (match_dup 0)
++ (match_dup 1))])]
++ "")
++
++; 16-bit move with no change to the flags reg.
++;
++(define_insn "movhi"
++ [(set (match_operand:HI 0 "nonimmediate_operand" "=rm")
++ (match_operand:HI 1 "ubicom32_move_operand" "g"))]
++ ""
++ "*
++ {
++ if (CONST_INT_P (operands[1]))
++ return \"movei\\t%0, %1\";
++
++ return \"move.2\\t%0, %1\";
++ }")
++
++; Combiner-generated 16-bit move with the zero flag set accordingly.
++;
++(define_insn "movhi_ccszn"
++ [(set (reg CC_REGNO)
++ (compare (match_operand:HI 0 "nonimmediate_operand" "rm")
++ (const_int 0)))
++ (set (match_operand:HI 1 "nonimmediate_operand" "=rm")
++ (match_dup 0))]
++ "ubicom32_match_cc_mode(insn, CCSZNmode)"
++ "ext.2\\t%1, %0")
++
++; Combine isn't very good at merging some types of operations so we
++; have to make do with a peephole. It's not as effective but it's better
++; than doing nothing.
++;
++(define_peephole2
++ [(set (match_operand:HI 0 "nonimmediate_operand" "")
++ (match_operand:HI 1 "nonimmediate_operand" ""))
++ (set (match_operand 2 "ubicom32_cc_register_operand" "")
++ (match_operator 3 "ubicom32_compare_operator"
++ [(match_dup 0)
++ (const_int 0)]))]
++ "(GET_MODE (operands[2]) == CCSZNmode
++ || GET_MODE (operands[2]) == CCSZmode)"
++ [(parallel
++ [(set (match_dup 2)
++ (match_op_dup 3
++ [(match_dup 1)
++ (const_int 0)]))
++ (set (match_dup 0)
++ (match_dup 1))])]
++ "")
++
++; Combine isn't very good at merging some types of operations so we
++; have to make do with a peephole. It's not as effective but it's better
++; than doing nothing.
++;
++(define_peephole2
++ [(set (match_operand:HI 0 "nonimmediate_operand" "")
++ (match_operand:HI 1 "nonimmediate_operand" ""))
++ (set (match_operand 2 "ubicom32_cc_register_operand" "")
++ (match_operator 3 "ubicom32_compare_operator"
++ [(match_dup 1)
++ (const_int 0)]))]
++ "(GET_MODE (operands[2]) == CCSZNmode
++ || GET_MODE (operands[2]) == CCSZmode)"
++ [(parallel
++ [(set (match_dup 2)
++ (match_op_dup 3
++ [(match_dup 1)
++ (const_int 0)]))
++ (set (match_dup 0)
++ (match_dup 1))])]
++ "")
++
++; 32-bit move with no change to the flags reg.
++;
++(define_expand "movsi"
++ [(set (match_operand:SI 0 "nonimmediate_operand" "")
++ (match_operand:SI 1 "general_operand" ""))]
++ ""
++ "{
++ /* Convert any complexities in operand 1 into something that can just
++ fall into the default expander code. */
++ ubicom32_expand_movsi (operands);
++ }")
++
++(define_insn "movsi_high"
++ [(set (match_operand:SI 0 "ubicom32_address_register_operand" "=a")
++ (high:SI (match_operand:SI 1 "ubicom32_symbolic_address_operand" "s")))]
++ ""
++ "moveai\\t%0, #%%hi(%E1)")
++
++(define_insn "movsi_lo_sum"
++ [(set (match_operand:SI 0 "nonimmediate_operand" "=rm")
++ (lo_sum:SI (match_operand:SI 1 "ubicom32_address_register_operand" "a")
++ (match_operand:SI 2 "immediate_operand" "s")))]
++ ""
++ "lea.1\\t%0, %%lo(%E2)(%1)")
++
++(define_insn "movsi_internal"
++ [(set (match_operand:SI 0 "nonimmediate_operand" "=rm")
++ (match_operand:SI 1 "ubicom32_move_operand" "rmnY"))]
++ ""
++ "*
++ {
++ if (CONST_INT_P (operands[1]))
++ {
++ ubicom32_emit_move_const_int (operands[0], operands[1]);
++ return \"\";
++ }
++
++ if (GET_CODE (operands[1]) == CONST_DOUBLE)
++ {
++ HOST_WIDE_INT i = CONST_DOUBLE_LOW (operands[1]);
++
++ ubicom32_emit_move_const_int (operands[0], GEN_INT (i));
++ return \"\";
++ }
++
++ if (ubicom32_address_register_operand (operands[0], VOIDmode)
++ && register_operand (operands[1], VOIDmode))
++ {
++ if (ubicom32_address_register_operand (operands[1], VOIDmode))
++ return \"lea.1\\t%0, 0(%1)\";
++
++ /* Use movea here to utilize the hazard bypass in the >= v4 ISA. */
++ if (ubicom32_v4)
++ return \"movea\\t%0, %1\";
++
++ return \"move.4\\t%0, %1\";
++ }
++
++ return \"move.4\\t%0, %1\";
++ }")
++
++; If we're not dependent on the state of the condition codes we can construct
++; constants of value 2^n by using a bset.
++;
++(define_peephole2
++ [(set (match_operand:SI 0 "nonimmediate_operand" "")
++ (match_operand:SI 1 "const_int_operand" ""))]
++ "(exact_log2 (INTVAL (operands[1])) > 14
++ && peep2_regno_dead_p (0, CC_REGNO))"
++ [(parallel
++ [(set (match_dup 0)
++ (ior:SI (const_int 0)
++ (match_dup 1)))
++ (clobber (reg:CC CC_REGNO))])]
++ "")
++
++; If we're not dependent on the state of the condition codes we can construct
++; constants of value ~(2^n) by using a bclr.
++;
++(define_peephole2
++ [(set (match_operand:SI 0 "nonimmediate_operand" "")
++ (match_operand:SI 1 "const_int_operand" ""))]
++ "(exact_log2 (~INTVAL (operands[1])) > 14
++ && peep2_regno_dead_p (0, CC_REGNO))"
++ [(parallel
++ [(set (match_dup 0)
++ (and:SI (const_int -1)
++ (match_dup 1)))
++ (clobber (reg:CC CC_REGNO))])]
++ "")
++
++; For 32-bit constants that have bits 0 through 24 and bit 31 set the same
++; we can use swapb.4!
++;
++(define_peephole2
++ [(set (match_operand:SI 0 "nonimmediate_operand" "")
++ (match_operand:SI 1 "const_int_operand" ""))]
++ "(ubicom32_v4
++ && (INTVAL (operands[1]) & 0xffffffff) != 0xffffffff
++ && (INTVAL (operands[1]) & 0xffffffff) != 0
++ && ((INTVAL (operands[1]) & 0x80ffffff) == 0
++ || (INTVAL (operands[1]) & 0x80ffffff) == 0x80ffffff))"
++ [(set (match_dup 0)
++ (bswap:SI (match_dup 2)))]
++ "{
++ operands[2] = GEN_INT (INTVAL (operands[1]) >> 24);
++ }")
++
++; If this is a write of a constant to memory look to see if we can usefully
++; transform this into 2 smaller writes.
++;
++(define_peephole2
++ [(set (match_operand:SI 0 "memory_operand" "")
++ (match_operand:SI 1 "const_int_operand" ""))]
++ "! satisfies_constraint_I (operands[1])
++ && ubicom32_legitimate_address_p (HImode, plus_constant (XEXP (operands[0], 0), 2), 1)"
++ [(set (match_dup 4) (match_dup 2))
++ (set (match_dup 5) (match_dup 3))]
++ "{
++ rtx low_hword_addr;
++
++ operands[2] = gen_highpart_mode (HImode, SImode, operands[1]);
++ operands[3] = gen_lowpart (HImode, operands[1]);
++
++ operands[4] = gen_rtx_MEM (HImode, XEXP (operands[0], 0));
++ MEM_COPY_ATTRIBUTES (operands[4], operands[0]);
++
++ low_hword_addr = plus_constant (XEXP (operands[0], 0), 2);
++ operands[5] = gen_rtx_MEM (HImode, low_hword_addr);
++ MEM_COPY_ATTRIBUTES (operands[5], operands[0]);
++ }")
++
++; If we're writing memory and we've not found a better way to do this then
++; try loading into a D register and then copying to memory. This will
++; perform the fewest possible memory read/writes.
++;
++(define_peephole2
++ [(match_scratch:SI 2 "d")
++ (set (match_operand:SI 0 "memory_operand" "")
++ (match_operand:SI 1 "const_int_operand" ""))]
++ "! satisfies_constraint_I (operands[1])"
++ [(set (match_dup 2) (match_dup 1))
++ (set (match_dup 0) (match_dup 2))]
++ "")
++
++; If we're not dependent on the state of the condition codes we can construct
++; constants of value (2^n - 1) by using an lsr.4.
++;
++(define_peephole2
++ [(set (match_operand:SI 0 "ubicom32_data_register_operand" "")
++ (match_operand:SI 1 "const_int_operand" ""))]
++ "(exact_log2 (INTVAL (operands[1]) + 1) > 14
++ && peep2_regno_dead_p (0, CC_REGNO))"
++ [(parallel
++ [(set (match_dup 0)
++ (lshiftrt:SI (const_int -1)
++ (match_dup 2)))
++ (clobber (reg:CC CC_REGNO))])]
++ "{
++ operands[2] = GEN_INT (32 - exact_log2 (INTVAL (operands[1]) + 1));
++ }")
++
++; If we're not dependent on the state of the condition codes we can construct
++; constants of value (2^n - 1) by using an lsr.4.
++;
++(define_peephole2
++ [(match_scratch:SI 2 "d")
++ (set (match_operand:SI 0 "nonimmediate_operand" "")
++ (match_operand:SI 1 "const_int_operand" ""))]
++ "(exact_log2 (INTVAL (operands[1]) + 1) > 14
++ && peep2_regno_dead_p (0, CC_REGNO))"
++ [(parallel
++ [(set (match_dup 2)
++ (lshiftrt:SI (const_int -1)
++ (match_dup 3)))
++ (clobber (reg:CC CC_REGNO))])
++ (set (match_dup 0)
++ (match_dup 2))]
++ "{
++ operands[3] = GEN_INT (32 - exact_log2 (INTVAL (operands[1]) + 1));
++ }")
++
++; If we're not dependent on the state of the condition codes we can construct
++; some other constants by using an lsl.4 to shift 7 bits left by some
++; constant.
++;
++(define_peephole2
++ [(set (match_operand:SI 0 "ubicom32_data_register_operand" "")
++ (match_operand:SI 1 "const_int_operand" ""))]
++ "(ubicom32_shiftable_const_int (INTVAL (operands[1]))
++ && peep2_regno_dead_p (0, CC_REGNO))"
++ [(parallel
++ [(set (match_dup 0)
++ (ashift:SI (match_dup 2)
++ (match_dup 3)))
++ (clobber (reg:CC CC_REGNO))])]
++ "{
++ int shift = ubicom32_shiftable_const_int (INTVAL (operands[1]));
++ operands[2] = GEN_INT (INTVAL (operands[1]) >> shift);
++ operands[3] = GEN_INT (shift);
++ }")
++
++; If we're not dependent on the state of the condition codes we can construct
++; some other constants by using an lsl.4 to shift 7 bits left by some
++; constant.
++;
++(define_peephole2
++ [(match_scratch:SI 2 "d")
++ (set (match_operand:SI 0 "nonimmediate_operand" "")
++ (match_operand:SI 1 "const_int_operand" ""))]
++ "(ubicom32_shiftable_const_int (INTVAL (operands[1]))
++ && peep2_regno_dead_p (0, CC_REGNO))"
++ [(parallel
++ [(set (match_dup 2)
++ (ashift:SI (match_dup 3)
++ (match_dup 4)))
++ (clobber (reg:CC CC_REGNO))])
++ (set (match_dup 0)
++ (match_dup 2))]
++ "{
++ int shift = ubicom32_shiftable_const_int (INTVAL (operands[1]));
++ operands[3] = GEN_INT (INTVAL (operands[1]) >> shift);
++ operands[4] = GEN_INT (shift);
++ }")
++
++; For some 16-bit unsigned constants that have bit 15 set we can use
++; swapb.2!
++;
++; Note that the movsi code emits the same sequence but by using a peephole2
++; we split the pattern early enough to allow instruction scheduling to
++; occur.
++;
++(define_peephole2
++ [(set (match_operand:SI 0 "register_operand" "")
++ (match_operand:SI 1 "const_int_operand" ""))]
++ "(ubicom32_v4
++ && (INTVAL (operands[1]) & 0xffff80ff) == 0x80ff)"
++ [(set (match_dup 0)
++ (zero_extend:SI (bswap:HI (match_dup 2))))]
++ "{
++ HOST_WIDE_INT i = INTVAL (operands[1]) >> 8;
++ if (i >= 0x80)
++ i -= 0x100;
++ operands[2] = GEN_INT (i);
++ }")
++
++; In general for a 16-bit unsigned constant that has bit 15 set
++; then we need a movei/move.2 pair unless we can represent it
++; via just a move.2.
++;
++(define_peephole2
++ [(set (match_operand:SI 0 "register_operand" "")
++ (match_operand:SI 1 "const_int_operand" ""))]
++ "(INTVAL (operands[1]) & 0xffff8000) == 0x8000
++ && (INTVAL (operands[1]) & 0xffff) < 0xff80"
++ [(set (match_dup 2)
++ (match_dup 1))
++ (set (match_dup 0)
++ (zero_extend:SI (match_dup 2)))]
++ "{
++ operands[2] = gen_rtx_REG (HImode, REGNO (operands[0]));
++ }")
++
++; If we're not dependent on the state of the condition codes we can construct
++; 32-bit constants that have bits 16 through 31 set to arbitrary values
++; and have bits 0 through 15 set to something representable as a default
++; source-1 immediate - we use movei/shmrg.2
++;
++(define_peephole2
++ [(set (match_operand:SI 0 "ubicom32_data_register_operand" "")
++ (match_operand:SI 1 "const_int_operand" ""))]
++ "(((INTVAL (operands[1]) >= 0x8000
++ && INTVAL (operands[1]) < 0xff80)
++ || INTVAL (operands[1]) >= 0x10000
++ || INTVAL (operands[1]) < -0x8000)
++ && ((INTVAL (operands[1]) & 0xffff) >= 0xff80
++ || (INTVAL (operands[1]) & 0xffff) < 0x80)
++ && peep2_regno_dead_p (0, CC_REGNO))"
++ [(set (match_dup 0)
++ (match_dup 2))
++ (parallel
++ [(set (match_dup 0)
++ (ior:SI
++ (ashift:SI (match_dup 0)
++ (const_int 16))
++ (zero_extend:SI
++ (match_dup 3))))
++ (clobber (reg:CC CC_REGNO))])]
++ "{
++ operands[2] = gen_highpart_mode (HImode, SImode, operands[1]);
++ operands[3] = gen_lowpart (HImode, operands[1]);
++ }")
++
++; Exactly the same as the peephole2 preceding except that this targets a
++; general register instead of D register. Hopefully the later optimization
++; passes will notice that the value ended up in a D register first here
++; and eliminate away the other register!
++;
++(define_peephole2
++ [(match_scratch:SI 2 "d")
++ (set (match_operand:SI 0 "register_operand" "")
++ (match_operand:SI 1 "const_int_operand" ""))]
++ "(((INTVAL (operands[1]) >= 0x8000
++ && INTVAL (operands[1]) < 0xff80)
++ || INTVAL (operands[1]) >= 0x10000
++ || INTVAL (operands[1]) < -0x8000)
++ && ((INTVAL (operands[1]) & 0xffff) >= 0xff80
++ || (INTVAL (operands[1]) & 0xffff) < 0x80)
++ && peep2_regno_dead_p (0, CC_REGNO))"
++ [(set (match_dup 2)
++ (match_dup 3))
++ (parallel
++ [(set (match_dup 2)
++ (ior:SI
++ (ashift:SI (match_dup 2)
++ (const_int 16))
++ (zero_extend:SI
++ (match_dup 4))))
++ (clobber (reg:CC CC_REGNO))])
++ (set (match_dup 0)
++ (match_dup 2))]
++ "{
++ operands[3] = gen_highpart_mode (HImode, SImode, operands[1]);
++ operands[4] = gen_lowpart (HImode, operands[1]);
++ }")
++
++; If we have a load of a large integer constant which does not have bit 31
++; set and we have a spare A reg then construct it with a moveai/lea.1 pair
++; instead. This avoids constructing it in 3 instructions on the stack.
++;
++; Note that we have to be careful not to match anything that matches
++; something we can do in a single instruction! There aren't many such
++; constants but there are some.
++;
++(define_peephole2
++ [(match_scratch:SI 2 "a")
++ (set (match_operand:SI 0 "register_operand" "")
++ (match_operand:SI 1 "const_int_operand" ""))]
++ "(! (INTVAL (operands[1]) & 0x80000000)
++ && ((INTVAL (operands[1]) >= 0x8000
++ && INTVAL (operands[1]) < 0xff80)
++ || INTVAL (operands[1]) >= 0x10000))"
++ [(set (match_dup 2)
++ (match_dup 3))
++ (set (match_dup 0)
++ (plus:SI (match_dup 2)
++ (match_dup 4)))]
++ "{
++ HOST_WIDE_INT i = INTVAL (operands[1]);
++ operands[3] = GEN_INT (i & 0xffffff80);
++ operands[4] = GEN_INT (i & 0x7f);
++ }")
++
++; If we're not dependent on the state of the condition codes we can construct
++; a 32-bit constant with a movei/movei/shmrg.2 sequence if possible.
++;
++(define_peephole2
++ [(match_scratch:HI 2 "d")
++ (set (match_operand:SI 0 "ubicom32_data_register_operand" "")
++ (match_operand:SI 1 "const_int_operand" ""))
++ (match_dup 2)]
++ "(INTVAL (operands[1]) & 0x80000000
++ && INTVAL (operands[1]) < -0x8000
++ && peep2_regno_dead_p (0, CC_REGNO))"
++ [(set (match_dup 0)
++ (match_dup 3))
++ (set (match_dup 2)
++ (match_dup 4))
++ (parallel
++ [(set (match_dup 0)
++ (ior:SI
++ (ashift:SI (match_dup 0)
++ (const_int 16))
++ (zero_extend:SI
++ (match_dup 2))))
++ (clobber (reg:CC CC_REGNO))])]
++ "{
++ operands[3] = gen_highpart_mode (HImode, SImode, operands[1]);
++ operands[4] = gen_lowpart (HImode, operands[1]);
++ }")
++
++; Exactly the same as the peephole2 preceding except that this targets a
++; general register instead of D register. Hopefully the later optimization
++; passes will notice that the value ended up in a D register first here
++; and eliminate away the other register!
++;
++(define_peephole2
++ [(match_scratch:SI 2 "d")
++ (match_scratch:HI 3 "d")
++ (set (match_operand:SI 0 "register_operand" "")
++ (match_operand:SI 1 "const_int_operand" ""))
++ (match_dup 3)]
++ "(INTVAL (operands[1]) & 0x80000000
++ && INTVAL (operands[1]) < -0x8000
++ && peep2_regno_dead_p (0, CC_REGNO))"
++ [(set (match_dup 2)
++ (match_dup 4))
++ (set (match_dup 3)
++ (match_dup 5))
++ (parallel
++ [(set (match_dup 2)
++ (ior:SI
++ (ashift:SI (match_dup 2)
++ (const_int 16))
++ (zero_extend:SI
++ (match_dup 3))))
++ (clobber (reg:CC CC_REGNO))])
++ (set (match_dup 0)
++ (match_dup 2))]
++ "{
++ operands[4] = gen_highpart_mode (HImode, SImode, operands[1]);
++ operands[5] = gen_lowpart (HImode, operands[1]);
++ }")
++
++(define_insn "movsi_fdpic_got_offset"
++ [(set (match_operand:SI 0 "ubicom32_data_register_operand" "=d")
++ (match_operand:SI 1 "ubicom32_fdpic_got_offset_operand" "Y"))]
++ ""
++ "movei\\t%0, %1")
++
++; The explicit MEM inside the UNSPEC prevents the compiler from moving
++; the load before a branch after a NULL test, or before a store that
++; initializes a function descriptor.
++
++(define_insn_and_split "load_fdpic_funcdesc"
++ [(set (match_operand:SI 0 "ubicom32_address_register_operand" "=a")
++ (unspec_volatile:SI [(mem:SI (match_operand:SI 1 "address_operand" "p"))]
++ UNSPEC_VOLATILE_LOAD_FDPIC_FUNCDESC))]
++ ""
++ "#"
++ "reload_completed"
++ [(set (match_dup 0)
++ (mem:SI (match_dup 1)))])
++
++; Combiner-generated 32-bit move with the zero flag set accordingly.
++;
++(define_insn "movsi_ccwzn"
++ [(set (reg CC_REGNO)
++ (compare (match_operand:SI 0 "nonimmediate_operand" "rm, d")
++ (const_int 0)))
++ (set (match_operand:SI 1 "nonimmediate_operand" "=d,rm")
++ (match_dup 0))]
++ "ubicom32_match_cc_mode(insn, CCWZNmode)"
++ "@
++ lsl.4\\t%1, %0, #0
++ add.4\\t%1, #0, %0")
++
++; Combiner-generated 32-bit move with all flags set accordingly.
++;
++(define_insn "movsi_ccw"
++ [(set (reg CC_REGNO)
++ (compare (match_operand:SI 0 "ubicom32_data_register_operand" "d")
++ (const_int 0)))
++ (set (match_operand:SI 1 "nonimmediate_operand" "=rm")
++ (match_dup 0))]
++ "ubicom32_match_cc_mode(insn, CCWmode)"
++ "add.4\\t%1, #0, %0")
++
++; Combine isn't very good at merging some types of operations so we
++; have to make do with a peephole. It's not as effective but it's better
++; than doing nothing.
++;
++(define_peephole2
++ [(set (match_operand:SI 0 "ubicom32_data_register_operand" "")
++ (match_operand:SI 1 "nonimmediate_operand" ""))
++ (parallel
++ [(set (match_operand 2 "ubicom32_cc_register_operand" "")
++ (match_operator 3 "ubicom32_compare_operator"
++ [(match_dup 0)
++ (const_int 0)]))
++ (clobber (match_operand:SI 4 "ubicom32_data_register_operand" ""))])]
++ "(GET_MODE (operands[2]) == CCWZNmode
++ || GET_MODE (operands[2]) == CCWZmode)"
++ [(parallel
++ [(set (match_dup 2)
++ (match_op_dup 3
++ [(match_dup 1)
++ (const_int 0)]))
++ (set (match_dup 0)
++ (match_dup 1))])]
++ "")
++
++; Combine isn't very good at merging some types of operations so we
++; have to make do with a peephole. It's not as effective but it's better
++; than doing nothing.
++;
++(define_peephole2
++ [(set (match_operand:SI 0 "nonimmediate_operand" "")
++ (match_operand:SI 1 "ubicom32_data_register_operand" ""))
++ (parallel
++ [(set (match_operand 2 "ubicom32_cc_register_operand" "")
++ (match_operator 3 "ubicom32_compare_operator"
++ [(match_dup 1)
++ (const_int 0)]))
++ (clobber (match_operand:SI 4 "ubicom32_data_register_operand" ""))])]
++ "(GET_MODE (operands[2]) == CCWZNmode
++ || GET_MODE (operands[2]) == CCWZmode)"
++ [(parallel
++ [(set (match_dup 2)
++ (match_op_dup 3
++ [(match_dup 1)
++ (const_int 0)]))
++ (set (match_dup 0)
++ (match_dup 1))])]
++ "")
++
++; Combine isn't very good at merging some types of operations so we
++; have to make do with a peephole. It's not as effective but it's better
++; than doing nothing.
++;
++(define_peephole2
++ [(set (match_operand:SI 0 "register_operand" "")
++ (match_operand:SI 1 "nonimmediate_operand" ""))
++ (parallel
++ [(set (match_operand 2 "ubicom32_cc_register_operand" "")
++ (match_operator 3 "ubicom32_compare_operator"
++ [(match_dup 0)
++ (const_int 0)]))
++ (set (match_operand:SI 4 "ubicom32_data_register_operand" "")
++ (match_dup 0))])]
++ "(peep2_reg_dead_p (2, operands[0])
++ && (GET_MODE (operands[2]) == CCWZNmode
++ || GET_MODE (operands[2]) == CCWZmode))"
++ [(parallel
++ [(set (match_dup 2)
++ (match_op_dup 3
++ [(match_dup 1)
++ (const_int 0)]))
++ (set (match_dup 4)
++ (match_dup 1))])]
++ "")
++
++; Register renaming may make a general reg into a D reg in which case
++; we may be able to simplify a compare.
++;
++(define_peephole2
++ [(set (match_operand:SI 0 "register_operand" "")
++ (match_operand:SI 1 "nonimmediate_operand" ""))
++ (parallel
++ [(set (match_operand 2 "ubicom32_cc_register_operand" "")
++ (match_operator 3 "ubicom32_compare_operator"
++ [(match_dup 0)
++ (const_int 0)]))
++ (clobber (match_operand:SI 4 "ubicom32_data_register_operand" ""))])]
++ "(peep2_reg_dead_p (2, operands[0])
++ && (GET_MODE (operands[2]) == CCWZNmode
++ || GET_MODE (operands[2]) == CCWZmode))"
++ [(parallel
++ [(set (match_dup 2)
++ (match_op_dup 3
++ [(match_dup 1)
++ (const_int 0)]))
++ (clobber (match_dup 4))])]
++ "")
++
++(define_insn_and_split "movdi"
++ [(set (match_operand:DI 0 "nonimmediate_operand" "=r,rm")
++ (match_operand:DI 1 "general_operand" "rmi,ri"))]
++ ""
++ "#"
++ "reload_completed"
++ [(set (match_dup 2) (match_dup 3))
++ (set (match_dup 4) (match_dup 5))]
++ "{
++ rtx dest_low;
++ rtx src_low;
++
++ dest_low = gen_lowpart (SImode, operands[0]);
++ src_low = gen_lowpart (SImode, operands[1]);
++
++ if (REG_P (operands[0])
++ && REG_P (operands[1])
++ && REGNO (operands[0]) < REGNO (operands[1]))
++ {
++ operands[2] = gen_highpart (SImode, operands[0]);
++ operands[3] = gen_highpart_mode (SImode, DImode, operands[1]);
++ operands[4] = dest_low;
++ operands[5] = src_low;
++ }
++ else if (reg_mentioned_p (dest_low, src_low))
++ {
++ operands[2] = gen_highpart (SImode, operands[0]);
++ operands[3] = gen_highpart_mode (SImode, DImode, operands[1]);
++ operands[4] = dest_low;
++ operands[5] = src_low;
++ }
++ else
++ {
++ operands[2] = dest_low;
++ operands[3] = src_low;
++ operands[4] = gen_highpart (SImode, operands[0]);
++ operands[5] = gen_highpart_mode (SImode, DImode, operands[1]);
++ }
++ }"
++ [(set_attr "length" "8")])
++
++; Combiner-generated 64-bit move with all flags set accordingly.
++;
++(define_insn "movdi_ccwzn"
++ [(set (reg CC_REGNO)
++ (compare (match_operand:DI 0 "nonimmediate_operand" "d, m, r")
++ (const_int 0)))
++ (set (match_operand:DI 1 "nonimmediate_operand" "=&rm,rm,!&rm")
++ (match_dup 0))
++ (clobber (match_scratch:SI 2 "=X, d, d"))]
++ "ubicom32_match_cc_mode(insn, CCWZNmode)"
++ "*
++ {
++ operands[3] = gen_lowpart (SImode, operands[0]);
++ operands[4] = gen_lowpart (SImode, operands[1]);
++ operands[5] = gen_highpart (SImode, operands[0]);
++ operands[6] = gen_highpart (SImode, operands[1]);
++
++ if (ubicom32_data_register_operand (operands[0], VOIDmode))
++ return \"add.4\\t%4, #0, %3\;addc\\t%6, #0, %5\";
++
++ return \"movei\\t%2, #0\;add.4\\t%4, %3, %2\;addc\\t%6, %5, %2\";
++ }"
++ [(set_attr "length" "8")])
++
++(define_insn "movdi_ccw"
++ [(set (reg CC_REGNO)
++ (compare (match_operand:DI 0 "nonimmediate_operand" "d, m, r")
++ (const_int 0)))
++ (set (match_operand:DI 1 "nonimmediate_operand" "=&rm,rm,!&rm")
++ (match_dup 0))
++ (clobber (match_scratch:SI 2 "=X, d, d"))]
++ "ubicom32_match_cc_mode(insn, CCWmode)"
++ "*
++ {
++ operands[3] = gen_lowpart (SImode, operands[0]);
++ operands[4] = gen_lowpart (SImode, operands[1]);
++ operands[5] = gen_highpart (SImode, operands[0]);
++ operands[6] = gen_highpart (SImode, operands[1]);
++
++ if (ubicom32_data_register_operand (operands[0], VOIDmode))
++ return \"add.4\\t%4, #0, %3\;addc\\t%6, #0, %5\";
++
++ return \"movei\\t%2, #0\;add.4\\t%4, %3, %2\;addc\\t%6, %5, %2\";
++ }"
++ [(set_attr "length" "8")])
++
++(define_insn "movsf"
++ [(set (match_operand:SF 0 "nonimmediate_operand" "=!d,*rm")
++ (match_operand:SF 1 "ubicom32_move_operand" "rmF,rmF"))]
++ ""
++ "*
++ {
++ if (GET_CODE (operands[1]) == CONST_DOUBLE)
++ {
++ HOST_WIDE_INT val;
++ REAL_VALUE_TYPE rv;
++
++ REAL_VALUE_FROM_CONST_DOUBLE (rv, operands[1]);
++ REAL_VALUE_TO_TARGET_SINGLE (rv, val);
++
++ ubicom32_emit_move_const_int (operands[0], GEN_INT (val));
++ return \"\";
++ }
++
++ return \"move.4\\t%0, %1\";
++ }")
++
++(define_insn "zero_extendqihi2"
++ [(set (match_operand:HI 0 "register_operand" "=r")
++ (zero_extend:HI (match_operand:QI 1 "nonimmediate_operand" "rm")))]
++ ""
++ "move.1\\t%0, %1")
++
++(define_insn "zero_extendqisi2"
++ [(set (match_operand:SI 0 "register_operand" "=r")
++ (zero_extend:SI (match_operand:QI 1 "nonimmediate_operand" "rm")))]
++ ""
++ "move.1\\t%0, %1")
++
++(define_insn "zero_extendqisi2_ccwz_1"
++ [(set (reg CC_REGNO)
++ (compare
++ (zero_extend:SI (match_operand:QI 1 "nonimmediate_operand" "rm"))
++ (const_int 0)))
++ (set (match_operand:SI 0 "ubicom32_data_register_operand" "=d")
++ (zero_extend:SI (match_dup 1)))]
++ "ubicom32_match_cc_mode(insn, CCWZmode)"
++ "shmrg.1\\t%0, %1, #0")
++
++(define_insn "zero_extendhisi2"
++ [(set (match_operand:SI 0 "register_operand" "=r")
++ (zero_extend:SI (match_operand:HI 1 "nonimmediate_operand" "rm")))]
++ ""
++ "move.2\\t%0, %1")
++
++(define_insn "zero_extendhisi2_ccwz_1"
++ [(set (reg CC_REGNO)
++ (compare
++ (zero_extend:SI (match_operand:HI 1 "nonimmediate_operand" "rm"))
++ (const_int 0)))
++ (set (match_operand:SI 0 "ubicom32_data_register_operand" "=d")
++ (zero_extend:SI (match_dup 1)))]
++ "ubicom32_match_cc_mode(insn, CCWZmode)"
++ "shmrg.2\\t%0, %1, #0")
++
++(define_insn_and_split "zero_extendqidi2"
++ [(set (match_operand:DI 0 "register_operand" "=r")
++ (zero_extend:DI (match_operand:QI 1 "nonimmediate_operand" "rm")))]
++ ""
++ "#"
++ "reload_completed"
++ [(set (match_dup 2)
++ (zero_extend:SI (match_dup 1)))
++ (set (match_dup 3)
++ (const_int 0))]
++ "{
++ operands[2] = gen_lowpart (SImode, operands[0]);
++ operands[3] = gen_highpart (SImode, operands[0]);
++ }"
++ [(set_attr "length" "8")])
++
++(define_insn_and_split "zero_extendhidi2"
++ [(set (match_operand:DI 0 "register_operand" "=r")
++ (zero_extend:DI (match_operand:HI 1 "nonimmediate_operand" "rm")))]
++ ""
++ "#"
++ "reload_completed"
++ [(set (match_dup 2)
++ (zero_extend:SI (match_dup 1)))
++ (set (match_dup 3)
++ (const_int 0))]
++ "{
++ operands[2] = gen_lowpart (SImode, operands[0]);
++ operands[3] = gen_highpart (SImode, operands[0]);
++ }"
++ [(set_attr "length" "8")])
++
++(define_insn_and_split "zero_extendsidi2"
++ [(set (match_operand:DI 0 "nonimmediate_operand" "=rm")
++ (zero_extend:DI (match_operand:SI 1 "nonimmediate_operand" "rm")))]
++ ""
++ "#"
++ "reload_completed"
++ [(set (match_dup 2)
++ (match_dup 1))
++ (set (match_dup 3)
++ (const_int 0))]
++ "{
++ operands[2] = gen_lowpart (SImode, operands[0]);
++ operands[3] = gen_highpart (SImode, operands[0]);
++ }"
++ [(set_attr "length" "8")])
++
++(define_insn "extendqihi2"
++ [(set (match_operand:HI 0 "register_operand" "=r")
++ (sign_extend:HI (match_operand:QI 1 "nonimmediate_operand" "rm")))
++ (clobber (reg:CC CC_REGNO))]
++ ""
++ "ext.1\\t%0, %1")
++
++(define_insn "extendqisi2"
++ [(set (match_operand:SI 0 "register_operand" "=r")
++ (sign_extend:SI (match_operand:QI 1 "nonimmediate_operand" "rm")))
++ (clobber (reg:CC CC_REGNO))]
++ ""
++ "ext.1\\t%0, %1")
++
++(define_insn "extendhisi2"
++ [(set (match_operand:SI 0 "register_operand" "=r")
++ (sign_extend:SI (match_operand:HI 1 "nonimmediate_operand" "rm")))
++ (clobber (reg:CC CC_REGNO))]
++ ""
++ "ext.2\\t%0, %1")
++
++(define_insn_and_split "extendsidi2"
++ [(set (match_operand:DI 0 "nonimmediate_operand" "=d")
++ (sign_extend:DI (match_operand:SI 1 "nonimmediate_operand" "rm")))
++ (clobber (reg:CC CC_REGNO))]
++ ""
++ "#"
++ "reload_completed"
++ [(set (match_dup 2)
++ (match_dup 1))
++ (parallel
++ [(set (match_dup 3)
++ (ashiftrt:SI (match_dup 2)
++ (const_int 31)))
++ (clobber (reg:CC CC_REGNO))])]
++ "{
++ operands[2] = gen_lowpart (SImode, operands[0]);
++ operands[3] = gen_highpart (SImode, operands[0]);
++ }"
++ [(set_attr "length" "8")])
++
++(define_insn "bswaphi"
++ [(set (match_operand:HI 0 "nonimmediate_operand" "=rm")
++ (bswap:HI (match_operand:HI 1 "ubicom32_arith_operand" "rmI")))]
++ "(ubicom32_v4)"
++ "swapb.2\\t%0, %1");
++
++(define_insn "bswaphisi"
++ [(set (match_operand:SI 0 "register_operand" "=r")
++ (zero_extend:SI
++ (bswap:HI (match_operand:HI 1 "ubicom32_arith_operand" "rmI"))))]
++ "(ubicom32_v4)"
++ "swapb.2\\t%0, %1");
++
++(define_insn "bswapsi"
++ [(set (match_operand:SI 0 "nonimmediate_operand" "=rm")
++ (bswap:SI (match_operand:SI 1 "ubicom32_arith_operand" "rmI")))]
++ "(ubicom32_v4)"
++ "swapb.4\\t%0, %1");
++
++(define_insn "tstqi_ext1"
++ [(set (reg CC_REGNO)
++ (compare (match_operand:QI 0 "nonimmediate_operand" "rm")
++ (const_int 0)))]
++ "ubicom32_match_cc_mode(insn, CCSZNmode)"
++ "ext.1\\t#0, %0")
++
++(define_expand "cmpqi"
++ [(set (reg CC_REGNO)
++ (compare (match_operand:QI 0 "ubicom32_arith_operand" "")
++ (match_operand:QI 1 "ubicom32_data_register_operand" "")))]
++ "(ubicom32_v4)"
++ "{
++ ubicom32_compare_op0 = operands[0];
++ ubicom32_compare_op1 = operands[1];
++ DONE;
++ }")
++
++(define_insn "sub1_ccs"
++ [(set (reg CC_REGNO)
++ (compare (match_operand:QI 0 "ubicom32_arith_operand" "rmI")
++ (match_operand:QI 1 "ubicom32_data_register_operand" "d")))]
++ "(ubicom32_v4)"
++ "sub.1\\t#0, %0, %1")
++
++; If we're testing for equality we don't have to worry about reversing conditions.
++;
++(define_insn "sub1_ccsz_1"
++ [(set (reg:CCSZ CC_REGNO)
++ (compare:CCSZ (match_operand:QI 0 "nonimmediate_operand" "rm")
++ (match_operand:QI 1 "ubicom32_data_register_operand" "d")))]
++ "(ubicom32_v4)"
++ "sub.1\\t#0, %0, %1")
++
++(define_insn "sub1_ccsz_2"
++ [(set (reg:CCSZ CC_REGNO)
++ (compare:CCSZ (match_operand:QI 0 "ubicom32_data_register_operand" "d")
++ (match_operand:QI 1 "ubicom32_arith_operand" "rmI")))]
++ "(ubicom32_v4)"
++ "sub.1\\t#0, %1, %0")
++
++; When the combiner runs it doesn't have any insight into whether or not an argument
++; to a compare is spilled to the stack and therefore can't swap the comparison in
++; an attempt to use sub.1 more effectively. We peephole this case here.
++;
++(define_peephole2
++ [(set (match_operand:QI 0 "register_operand" "")
++ (match_operand:QI 1 "ubicom32_arith_operand" ""))
++ (set (match_operand 2 "ubicom32_cc_register_operand" "")
++ (compare (match_operand:QI 3 "ubicom32_data_register_operand" "")
++ (match_dup 0)))
++ (set (pc)
++ (if_then_else (match_operator 4 "comparison_operator"
++ [(match_dup 2)
++ (const_int 0)])
++ (label_ref (match_operand 5 "" ""))
++ (pc)))]
++ "(peep2_reg_dead_p (2, operands[0])
++ && peep2_regno_dead_p (3, CC_REGNO))"
++ [(set (match_dup 2)
++ (compare (match_dup 1)
++ (match_dup 3)))
++ (set (pc)
++ (if_then_else (match_op_dup 6
++ [(match_dup 2)
++ (const_int 0)])
++ (label_ref (match_dup 5))
++ (pc)))]
++ "{
++ rtx cc_reg;
++
++ cc_reg = gen_rtx_REG (GET_MODE (operands[2]), CC_REGNO);
++ operands[6] = gen_rtx_fmt_ee (swap_condition (GET_CODE (operands[4])),
++ GET_MODE (operands[4]),
++ cc_reg,
++ const0_rtx);
++ }")
++
++(define_insn "tsthi_ext2"
++ [(set (reg CC_REGNO)
++ (compare (match_operand:HI 0 "nonimmediate_operand" "rm")
++ (const_int 0)))]
++ "ubicom32_match_cc_mode(insn, CCSZNmode)"
++ "ext.2\\t#0, %0")
++
++(define_expand "cmphi"
++ [(set (reg CC_REGNO)
++ (compare (match_operand:HI 0 "ubicom32_arith_operand" "")
++ (match_operand:HI 1 "ubicom32_compare_operand" "")))]
++ ""
++ "{
++ do
++ {
++ /* Is this a cmpi? */
++ if (CONST_INT_P (operands[1]))
++ break;
++
++ /* Must be a sub.2 - if necessary copy an operand into a reg. */
++ if (! ubicom32_data_register_operand (operands[1], HImode))
++ operands[1] = copy_to_mode_reg (HImode, operands[1]);
++ }
++ while (0);
++
++ ubicom32_compare_op0 = operands[0];
++ ubicom32_compare_op1 = operands[1];
++ DONE;
++ }")
++
++(define_insn "cmpi"
++ [(set (reg CC_REGNO)
++ (compare (match_operand:HI 0 "nonimmediate_operand" "rm")
++ (match_operand 1 "const_int_operand" "N")))]
++ ""
++ "cmpi\\t%0, %1")
++
++(define_insn "sub2_ccs"
++ [(set (reg CC_REGNO)
++ (compare (match_operand:HI 0 "ubicom32_arith_operand" "rmI")
++ (match_operand:HI 1 "ubicom32_data_register_operand" "d")))]
++ ""
++ "sub.2\\t#0, %0, %1")
++
++; If we're testing for equality we don't have to worry about reversing conditions.
++;
++(define_insn "sub2_ccsz_1"
++ [(set (reg:CCSZ CC_REGNO)
++ (compare:CCSZ (match_operand:HI 0 "nonimmediate_operand" "rm")
++ (match_operand:HI 1 "ubicom32_data_register_operand" "d")))]
++ ""
++ "sub.2\\t#0, %0, %1")
++
++(define_insn "sub2_ccsz_2"
++ [(set (reg:CCSZ CC_REGNO)
++ (compare:CCSZ (match_operand:HI 0 "ubicom32_data_register_operand" "d")
++ (match_operand:HI 1 "ubicom32_arith_operand" "rmI")))]
++ ""
++ "sub.2\\t#0, %1, %0")
++
++; When the combiner runs it doesn't have any insight into whether or not an argument
++; to a compare is spilled to the stack and therefore can't swap the comparison in
++; an attempt to use sub.2 more effectively. We peephole this case here.
++;
++(define_peephole2
++ [(set (match_operand:HI 0 "register_operand" "")
++ (match_operand:HI 1 "ubicom32_arith_operand" ""))
++ (set (match_operand 2 "ubicom32_cc_register_operand" "")
++ (compare (match_operand:HI 3 "ubicom32_data_register_operand" "")
++ (match_dup 0)))
++ (set (pc)
++ (if_then_else (match_operator 4 "comparison_operator"
++ [(match_dup 2)
++ (const_int 0)])
++ (label_ref (match_operand 5 "" ""))
++ (pc)))]
++ "(peep2_reg_dead_p (2, operands[0])
++ && peep2_regno_dead_p (3, CC_REGNO))"
++ [(set (match_dup 2)
++ (compare (match_dup 1)
++ (match_dup 3)))
++ (set (pc)
++ (if_then_else (match_op_dup 6
++ [(match_dup 2)
++ (const_int 0)])
++ (label_ref (match_dup 5))
++ (pc)))]
++ "{
++ rtx cc_reg;
++
++ cc_reg = gen_rtx_REG (GET_MODE (operands[2]), CC_REGNO);
++ operands[6] = gen_rtx_fmt_ee (swap_condition (GET_CODE (operands[4])),
++ GET_MODE (operands[4]),
++ cc_reg,
++ const0_rtx);
++ }")
++
++(define_insn_and_split "tstsi_lsl4"
++ [(set (match_operand 0 "ubicom32_cc_register_operand" "=r")
++ (match_operator 1 "ubicom32_compare_operator"
++ [(match_operand:SI 2 "nonimmediate_operand" "rm")
++ (const_int 0)]))]
++ "ubicom32_match_cc_mode(insn, CCWZNmode)"
++ "#"
++ "ubicom32_match_cc_mode(insn, CCWZNmode)"
++ [(parallel
++ [(set (match_dup 0)
++ (match_op_dup 1
++ [(match_dup 2)
++ (const_int 0)]))
++ (clobber (match_dup 3))])]
++ "{
++ operands[3] = gen_reg_rtx (SImode);
++ }")
++
++(define_insn "tstsi_lsl4_d"
++ [(set (reg CC_REGNO)
++ (compare (match_operand:SI 0 "nonimmediate_operand" "rm")
++ (const_int 0)))
++ (clobber (match_operand:SI 1 "ubicom32_data_register_operand" "=d"))]
++ "ubicom32_match_cc_mode(insn, CCWZNmode)"
++ "lsl.4\\t%1, %0, #0")
++
++; Comparison for equality with -1.
++;
++(define_insn "cmpsi_not4_ccwz"
++ [(set (reg CC_REGNO)
++ (compare (match_operand:SI 0 "nonimmediate_operand" "rm")
++ (const_int -1)))]
++ "ubicom32_match_cc_mode(insn, CCWZmode)"
++ "not.4\\t#0, %0")
++
++(define_expand "cmpsi"
++ [(set (reg CC_REGNO)
++ (compare (match_operand:SI 0 "ubicom32_arith_operand" "")
++ (match_operand:SI 1 "ubicom32_compare_operand" "")))]
++ ""
++ "{
++ do
++ {
++ /* Is this a cmpi? We can't take a memory address as cmpi takes
++ 16-bit operands. */
++ if (register_operand (operands[0], SImode)
++ && CONST_INT_P (operands[1])
++ && satisfies_constraint_N (operands[1]))
++ break;
++
++ /* Must be a sub.4 - if necessary copy an operand into a reg. */
++ if (! ubicom32_data_register_operand (operands[1], SImode))
++ operands[1] = copy_to_mode_reg (SImode, operands[1]);
++ }
++ while (0);
++
++ ubicom32_compare_op0 = operands[0];
++ ubicom32_compare_op1 = operands[1];
++ DONE;
++ }")
++
++(define_insn "cmpsi_cmpi"
++ [(set (reg CC_REGNO)
++ (compare (match_operand:SI 0 "register_operand" "r")
++ (match_operand 1 "const_int_operand" "N")))]
++ "(satisfies_constraint_N (operands[1]))"
++ "cmpi\\t%0, %1")
++
++(define_insn "cmpsi_sub4"
++ [(set (reg CC_REGNO)
++ (compare (match_operand:SI 0 "ubicom32_arith_operand" "rmI")
++ (match_operand:SI 1 "ubicom32_data_register_operand" "d")))]
++ ""
++ "sub.4\\t#0, %0, %1")
++
++; If we're testing for equality we don't have to worry about reversing conditions.
++;
++(define_insn "cmpsi_sub4_ccwz_1"
++ [(set (reg CC_REGNO)
++ (compare (match_operand:SI 0 "nonimmediate_operand" "rm")
++ (match_operand:SI 1 "ubicom32_data_register_operand" "d")))]
++ "ubicom32_match_cc_mode(insn, CCWZmode)"
++ "sub.4\\t#0, %0, %1")
++
++(define_insn "cmpsi_sub4_ccwz_2"
++ [(set (reg CC_REGNO)
++ (compare (match_operand:SI 0 "ubicom32_data_register_operand" "d")
++ (match_operand:SI 1 "nonimmediate_operand" "rm")))]
++ "ubicom32_match_cc_mode(insn, CCWZmode)"
++ "sub.4\\t#0, %1, %0")
++
++; When the combiner runs it doesn't have any insight into whether or not an argument
++; to a compare is spilled to the stack and therefore can't swap the comparison in
++; an attempt to use sub.4 more effectively. We peephole this case here.
++;
++(define_peephole2
++ [(set (match_operand:SI 0 "register_operand" "")
++ (match_operand:SI 1 "ubicom32_arith_operand" ""))
++ (set (match_operand 2 "ubicom32_cc_register_operand" "")
++ (compare (match_operand:SI 3 "ubicom32_data_register_operand" "")
++ (match_dup 0)))
++ (set (pc)
++ (if_then_else (match_operator 4 "comparison_operator"
++ [(match_dup 2)
++ (const_int 0)])
++ (label_ref (match_operand 5 "" ""))
++ (pc)))]
++ "(peep2_reg_dead_p (2, operands[0])
++ && peep2_regno_dead_p (3, CC_REGNO))"
++ [(set (match_dup 2)
++ (compare (match_dup 1)
++ (match_dup 3)))
++ (set (pc)
++ (if_then_else (match_op_dup 6
++ [(match_dup 2)
++ (const_int 0)])
++ (label_ref (match_dup 5))
++ (pc)))]
++ "{
++ rtx cc_reg;
++
++ cc_reg = gen_rtx_REG (GET_MODE (operands[2]), CC_REGNO);
++ operands[6] = gen_rtx_fmt_ee (swap_condition (GET_CODE (operands[4])),
++ GET_MODE (operands[4]),
++ cc_reg,
++ const0_rtx);
++ }")
++
++(define_insn_and_split "tstdi_or4"
++ [(set (reg:CCWZ CC_REGNO)
++ (compare:CCWZ (match_operand:DI 0 "nonimmediate_operand" "rm")
++ (const_int 0)))]
++ ""
++ "#"
++ ""
++ [(parallel
++ [(set (reg:CCWZ CC_REGNO)
++ (compare:CCWZ (match_dup 0)
++ (const_int 0)))
++ (clobber (match_dup 1))])]
++ "{
++ operands[1] = gen_reg_rtx (SImode);
++ }")
++
++(define_insn "tstdi_or4_d"
++ [(set (reg:CCWZ CC_REGNO)
++ (compare:CCWZ (match_operand:DI 0 "nonimmediate_operand" "rm")
++ (const_int 0)))
++ (clobber (match_operand:SI 1 "ubicom32_data_register_operand" "=d"))]
++ ""
++ "*
++ {
++ operands[2] = gen_lowpart (SImode, operands[0]);
++ operands[3] = gen_highpart_mode (SImode, DImode, operands[0]);
++
++ if (ubicom32_data_register_operand (operands[0], GET_MODE (operands[0])))
++ return \"or.4\\t#0, %2, %3\";
++
++ return \"move.4\\t%1, %2\;or.4\\t%1, %3, %1\";
++ }"
++ [(set_attr "length" "8")])
++
++(define_expand "cmpdi"
++ [(set (reg CC_REGNO)
++ (compare (match_operand:DI 0 "ubicom32_arith_operand" "")
++ (match_operand:DI 1 "ubicom32_data_register_operand" "")))]
++ ""
++ "{
++ ubicom32_compare_op0 = operands[0];
++ ubicom32_compare_op1 = operands[1];
++ DONE;
++ }")
++
++(define_insn "cmpdi_sub4subc"
++ [(set (reg CC_REGNO)
++ (compare (match_operand:DI 0 "ubicom32_arith_operand" "rmI")
++ (match_operand:DI 1 "ubicom32_data_register_operand" "d")))]
++ ""
++ "*
++ {
++ operands[2] = gen_lowpart (SImode, operands[0]);
++ operands[3] = gen_lowpart (SImode, operands[1]);
++ operands[4] = gen_highpart_mode (SImode, DImode, operands[0]);
++ operands[5] = gen_highpart_mode (SImode, DImode, operands[1]);
++
++ return \"sub.4\\t#0, %2, %3\;subc\\t#0, %4, %5\";
++ }"
++ [(set_attr "length" "8")])
++
++; When the combiner runs it doesn't have any insight into whether or not an argument
++; to a compare is spilled to the stack and therefore can't swap the comparison in
++; an attempt to use sub.4/subc more effectively. We peephole this case here.
++;
++(define_peephole2
++ [(set (match_operand:DI 0 "register_operand" "")
++ (match_operand:DI 1 "ubicom32_arith_operand" ""))
++ (set (match_operand 2 "ubicom32_cc_register_operand" "")
++ (compare (match_operand:DI 3 "ubicom32_data_register_operand" "")
++ (match_dup 0)))
++ (set (pc)
++ (if_then_else (match_operator 4 "comparison_operator"
++ [(match_dup 2)
++ (const_int 0)])
++ (label_ref (match_operand 5 "" ""))
++ (pc)))]
++ "(peep2_reg_dead_p (2, operands[0])
++ && peep2_regno_dead_p (3, CC_REGNO))"
++ [(set (match_dup 2)
++ (compare (match_dup 1)
++ (match_dup 3)))
++ (set (pc)
++ (if_then_else (match_op_dup 6
++ [(match_dup 2)
++ (const_int 0)])
++ (label_ref (match_dup 5))
++ (pc)))]
++ "{
++ rtx cc_reg;
++
++ cc_reg = gen_rtx_REG (GET_MODE (operands[2]), CC_REGNO);
++ operands[6] = gen_rtx_fmt_ee (swap_condition (GET_CODE (operands[4])),
++ GET_MODE (operands[4]),
++ cc_reg,
++ const0_rtx);
++ }")
++
++(define_insn "btst"
++ [(set (reg:CCWZ CC_REGNO)
++ (compare:CCWZ
++ (zero_extract:SI
++ (match_operand:SI 0 "nonimmediate_operand" "rm")
++ (const_int 1)
++ (match_operand:SI 1 "ubicom32_arith_operand" "dM"))
++ (const_int 0)))]
++ ""
++ "btst\\t%0, %1")
++
++(define_insn "bfextu_ccwz_null"
++ [(set (reg:CCWZ CC_REGNO)
++ (compare:CCWZ
++ (zero_extract:SI
++ (match_operand:SI 0 "nonimmediate_operand" "rm")
++ (match_operand 1 "const_int_operand" "M")
++ (const_int 0))
++ (const_int 0)))
++ (clobber (match_scratch:SI 2 "=d"))]
++ ""
++ "bfextu\\t%2, %0, %1")
++
++(define_expand "addqi3"
++ [(parallel
++ [(set (match_operand:QI 0 "memory_operand" "")
++ (plus:QI (match_operand:QI 1 "nonimmediate_operand" "")
++ (match_operand:QI 2 "ubicom32_arith_operand" "")))
++ (clobber (reg:CC CC_REGNO))])]
++ "(ubicom32_v4)"
++ "{
++ if (!memory_operand (operands[0], QImode))
++ FAIL;
++
++ /* If we have a non-data reg for operand 1 then prefer that over
++ a CONST_INT in operand 2. */
++ if (! ubicom32_data_register_operand (operands[1], GET_MODE (operands[1]))
++ && CONST_INT_P (operands[2]))
++ operands[2] = copy_to_mode_reg (QImode, operands[2]);
++
++ if (CONST_INT_P (operands[2]) && ! satisfies_constraint_I (operands[2]))
++ operands[2] = copy_to_mode_reg (QImode, operands[2]);
++ }")
++
++(define_insn "addqi3_add1"
++ [(set (match_operand:QI 0 "memory_operand" "=m, m")
++ (plus:QI (match_operand:QI 1 "nonimmediate_operand" "%d,rm")
++ (match_operand:QI 2 "ubicom32_arith_operand" "rmI, d")))
++ (clobber (reg:CC CC_REGNO))]
++ "(ubicom32_v4)"
++ "@
++ add.1\\t%0, %2, %1
++ add.1\\t%0, %1, %2")
++
++(define_insn "addqi3_add1_ccszn_null"
++ [(set (reg CC_REGNO)
++ (compare
++ (neg:QI (match_operand:QI 0 "nonimmediate_operand" "%d,rm"))
++ (match_operand:QI 1 "ubicom32_arith_operand" "rmI, d")))]
++ "(ubicom32_v4
++ && ubicom32_match_cc_mode(insn, CCSZNmode))"
++ "@
++ add.1\\t#0, %1, %0
++ add.1\\t#0, %0, %1")
++
++(define_expand "addhi3"
++ [(parallel
++ [(set (match_operand:HI 0 "memory_operand" "")
++ (plus:HI (match_operand:HI 1 "nonimmediate_operand" "")
++ (match_operand:HI 2 "ubicom32_arith_operand" "")))
++ (clobber (reg:CC CC_REGNO))])]
++ ""
++ "{
++ if (!memory_operand (operands[0], HImode))
++ FAIL;
++
++ /* If we have a non-data reg for operand 1 then prefer that over
++ a CONST_INT in operand 2. */
++ if (! ubicom32_data_register_operand (operands[1], GET_MODE (operands[1]))
++ && CONST_INT_P (operands[2]))
++ operands[2] = copy_to_mode_reg (HImode, operands[2]);
++
++ if (CONST_INT_P (operands[2]) && ! satisfies_constraint_I (operands[2]))
++ operands[2] = copy_to_mode_reg (HImode, operands[2]);
++ }")
++
++(define_insn "addhi3_add2"
++ [(set (match_operand:HI 0 "memory_operand" "=m, m")
++ (plus:HI (match_operand:HI 1 "nonimmediate_operand" "%d,rm")
++ (match_operand:HI 2 "ubicom32_arith_operand" "rmI, d")))
++ (clobber (reg:CC CC_REGNO))]
++ ""
++ "@
++ add.2\\t%0, %2, %1
++ add.2\\t%0, %1, %2")
++
++(define_insn "addhi3_add2_ccszn_null"
++ [(set (reg CC_REGNO)
++ (compare
++ (neg:HI (match_operand:HI 0 "nonimmediate_operand" "%d,rm"))
++ (match_operand:HI 1 "ubicom32_arith_operand" "rmI, d")))]
++ "ubicom32_match_cc_mode(insn, CCSZNmode)"
++ "@
++ add.2\\t#0, %1, %0
++ add.2\\t#0, %0, %1")
++
++(define_expand "addsi3"
++ [(set (match_operand:SI 0 "nonimmediate_operand" "")
++ (plus:SI (match_operand:SI 1 "nonimmediate_operand" "")
++ (match_operand:SI 2 "ubicom32_move_operand" "")))]
++ ""
++ "{
++ ubicom32_expand_addsi3 (operands);
++ DONE;
++ }")
++
++; We start with an instruction pattern that can do all sorts of interesting
++; things but we split out any uses of lea or pdec instructions because
++; those instructions don't clobber the condition codes.
++;
++(define_insn_and_split "addsi3_1"
++ [(set (match_operand:SI 0 "nonimmediate_operand" "=rm,rm,rm,rm,rm, rm,rm")
++ (plus:SI (match_operand:SI 1 "nonimmediate_operand" "%a, a, a, a, a, d,rm")
++ (match_operand:SI 2 "ubicom32_move_operand" "L, K, J, P, d,rmI, d")))
++ (clobber (reg:CC CC_REGNO))]
++ ""
++ "@
++ #
++ #
++ #
++ #
++ #
++ add.4\\t%0, %2, %1
++ add.4\\t%0, %1, %2"
++ "(reload_completed
++ && ubicom32_address_register_operand (operands[1], GET_MODE (operands[1])))"
++ [(set (match_dup 0)
++ (plus:SI (match_dup 1)
++ (match_dup 2)))]
++ ""
++)
++
++(define_insn "addsi3_1_ccwzn"
++ [(set (reg CC_REGNO)
++ (compare
++ (plus:SI (match_operand:SI 1 "nonimmediate_operand" "%d,rm")
++ (match_operand:SI 2 "ubicom32_arith_operand" "rmI, d"))
++ (const_int 0)))
++ (set (match_operand:SI 0 "nonimmediate_operand" "=rm,rm")
++ (plus:SI (match_dup 1)
++ (match_dup 2)))]
++ "ubicom32_match_cc_mode(insn, CCWZNmode)"
++ "@
++ add.4\\t%0, %2, %1
++ add.4\\t%0, %1, %2")
++
++(define_insn "addsi3_1_ccwzn_null"
++ [(set (reg CC_REGNO)
++ (compare
++ (neg:SI (match_operand:SI 0 "nonimmediate_operand" "%d,rm"))
++ (match_operand:SI 1 "ubicom32_arith_operand" "rmI, d")))]
++ "ubicom32_match_cc_mode(insn, CCWZNmode)"
++ "@
++ add.4\\t#0, %1, %0
++ add.4\\t#0, %0, %1")
++
++(define_insn_and_split "addsi3_2"
++ [(set (match_operand:SI 0 "nonimmediate_operand" "=rm,rm,rm,rm,rm,rm")
++ (plus:SI (match_operand:SI 1 "ubicom32_address_register_operand" "%a, a, a, a, a, a")
++ (match_operand:SI 2 "ubicom32_move_operand" "L, K, J, P, d, n")))]
++ ""
++ "@
++ lea.4\\t%0, %E2(%1)
++ lea.2\\t%0, %E2(%1)
++ lea.1\\t%0, %E2(%1)
++ pdec\\t%0, %n2(%1)
++ lea.1\\t%0, (%1,%2)
++ #"
++ "(reload_completed
++ && ! satisfies_constraint_L (operands[2])
++ && ! satisfies_constraint_K (operands[2])
++ && ! satisfies_constraint_J (operands[2])
++ && ! satisfies_constraint_P (operands[2])
++ && ! ubicom32_data_register_operand (operands[2], GET_MODE (operands[2])))"
++ [(set (reg:SI AUX_DATA_REGNO)
++ (match_dup 2))
++ (set (match_dup 0)
++ (plus:SI (match_dup 1)
++ (reg:SI AUX_DATA_REGNO)))]
++ ""
++)
++
++(define_insn "lea_2"
++ [(set (match_operand:SI 0 "nonimmediate_operand" "=rm")
++ (plus:SI (mult:SI (match_operand:SI 1 "ubicom32_data_register_operand" "d")
++ (const_int 2))
++ (match_operand:SI 2 "ubicom32_address_register_operand" "a")))]
++ ""
++ "lea.2\\t%0, (%2,%1)")
++
++(define_insn "lea_4"
++ [(set (match_operand:SI 0 "nonimmediate_operand" "=rm")
++ (plus:SI (mult:SI (match_operand:SI 1 "ubicom32_data_register_operand" "d")
++ (const_int 4))
++ (match_operand:SI 2 "ubicom32_address_register_operand" "a")))]
++ ""
++ "lea.4\\t%0, (%2,%1)")
++
++(define_expand "adddi3"
++ [(parallel
++ [(set (match_operand:DI 0 "nonimmediate_operand" "")
++ (plus:DI (match_operand:DI 1 "nonimmediate_operand" "")
++ (match_operand:DI 2 "ubicom32_arith_operand" "")))
++ (clobber (reg:CC CC_REGNO))])]
++ ""
++ "{
++ /* If we have a non-data reg for operand 1 then prefer that over
++ a CONST_INT in operand 2. */
++ if (! ubicom32_data_register_operand (operands[1], GET_MODE (operands[1]))
++ && CONST_INT_P (operands[2]))
++ operands[2] = copy_to_mode_reg (DImode, operands[2]);
++
++ if (CONST_INT_P (operands[2]) && ! satisfies_constraint_I (operands[2]))
++ operands[2] = copy_to_mode_reg (DImode, operands[2]);
++ }")
++
++; We construct a 64-bit add from 32-bit operations. Note that we use the
++; & constraint to prevent overlapping registers being allocated. We do
++; allow identical registers though as that won't break anything.
++;
++(define_insn "adddi3_add4addc"
++ [(set (match_operand:DI 0 "nonimmediate_operand" "=&r,&r,rm, d, m, m")
++ (plus:DI (match_operand:DI 1 "nonimmediate_operand" "%d,rm, 0, 0, d,rm")
++ (match_operand:DI 2 "ubicom32_arith_operand" "rmI, d, d,rmI,rmI, d")))
++ (clobber (reg:CC CC_REGNO))]
++ ""
++ "*
++ {
++ operands[3] = gen_lowpart (SImode, operands[0]);
++ operands[4] = gen_lowpart (SImode, operands[1]);
++ operands[5] = gen_lowpart (SImode, operands[2]);
++ operands[6] = gen_highpart (SImode, operands[0]);
++ operands[7] = gen_highpart (SImode, operands[1]);
++ operands[8] = gen_highpart_mode (SImode, DImode, operands[2]);
++
++ if (ubicom32_data_register_operand (operands[2], GET_MODE (operands[2])))
++ return \"add.4\\t%3, %4, %5\;addc\\t%6, %7, %8\";
++
++ return \"add.4\\t%3, %5, %4\;addc\\t%6, %8, %7\";
++ }"
++ [(set_attr "length" "8")])
++
++(define_insn "adddi3_ccwz"
++ [(set (reg CC_REGNO)
++ (compare
++ (plus:DI (match_operand:DI 1 "nonimmediate_operand" "%d,rm, 0, 0, d,rm")
++ (match_operand:DI 2 "ubicom32_arith_operand" "rmI, d, d,rmI,rmI, d"))
++ (const_int 0)))
++ (set (match_operand:DI 0 "nonimmediate_operand" "=&r,&r,rm, d, m, m")
++ (plus:DI (match_dup 1)
++ (match_dup 2)))]
++ "ubicom32_match_cc_mode(insn, CCWZNmode)"
++ "*
++ {
++ operands[3] = gen_lowpart (SImode, operands[0]);
++ operands[6] = gen_highpart (SImode, operands[0]);
++
++ if (ubicom32_data_register_operand (operands[1], GET_MODE (operands[1])))
++ {
++ operands[4] = gen_lowpart (SImode, operands[1]);
++ operands[5] = gen_lowpart (SImode, operands[2]);
++ operands[7] = gen_highpart (SImode, operands[1]);
++ operands[8] = gen_highpart_mode (SImode, DImode, operands[2]);
++ }
++ else
++ {
++ operands[4] = gen_lowpart (SImode, operands[2]);
++ operands[5] = gen_lowpart (SImode, operands[1]);
++ operands[7] = gen_highpart (SImode, operands[2]);
++ operands[8] = gen_highpart (SImode, operands[1]);
++ }
++
++ return \"add.4\\t%3, %5, %4\;addc\\t%6, %8, %7\";
++ }"
++ [(set_attr "length" "8")])
++
++(define_insn "adddi3_ccwz_null"
++ [(set (reg CC_REGNO)
++ (compare
++ (neg:DI (match_operand:DI 0 "nonimmediate_operand" "%d,rm"))
++ (match_operand:DI 1 "ubicom32_arith_operand" "rmI, d")))]
++ "ubicom32_match_cc_mode(insn, CCWZNmode)"
++ "*
++ {
++ if (ubicom32_data_register_operand (operands[0], GET_MODE (operands[0])))
++ {
++ operands[2] = gen_lowpart (SImode, operands[0]);
++ operands[3] = gen_lowpart (SImode, operands[1]);
++ operands[4] = gen_highpart (SImode, operands[0]);
++ operands[5] = gen_highpart_mode (SImode, DImode, operands[1]);
++ }
++ else
++ {
++ operands[2] = gen_lowpart (SImode, operands[1]);
++ operands[3] = gen_lowpart (SImode, operands[0]);
++ operands[4] = gen_highpart (SImode, operands[1]);
++ operands[5] = gen_highpart (SImode, operands[0]);
++ }
++
++ return \"add.4\\t#0, %3, %2\;addc\\t#0, %5, %4\";
++ }"
++ [(set_attr "length" "8")])
++
++(define_expand "subqi3"
++ [(parallel
++ [(set (match_operand:QI 0 "memory_operand" "")
++ (minus:QI (match_operand:QI 1 "ubicom32_arith_operand" "")
++ (match_operand:QI 2 "ubicom32_data_register_operand" "")))
++ (clobber (reg:CC CC_REGNO))])]
++ "(ubicom32_v4)"
++ "{
++ if (!memory_operand (operands[0], QImode))
++ FAIL;
++ }")
++
++(define_insn "subqi3_sub1"
++ [(set (match_operand:QI 0 "memory_operand" "=m")
++ (minus:QI (match_operand:QI 1 "ubicom32_arith_operand" "rmI")
++ (match_operand:QI 2 "ubicom32_data_register_operand" "d")))
++ (clobber (reg:CC CC_REGNO))]
++ "(ubicom32_v4)"
++ "sub.1\\t%0, %1, %2")
++
++(define_expand "subhi3"
++ [(parallel
++ [(set (match_operand:HI 0 "memory_operand" "")
++ (minus:HI (match_operand:HI 1 "ubicom32_arith_operand" "")
++ (match_operand:HI 2 "ubicom32_data_register_operand" "")))
++ (clobber (reg:CC CC_REGNO))])]
++ "(ubicom32_v4)"
++ "{
++ if (!memory_operand (operands[0], HImode))
++ FAIL;
++ }")
++
++(define_insn "subhi3_sub2"
++ [(set (match_operand:HI 0 "memory_operand" "=m")
++ (minus:HI (match_operand:HI 1 "ubicom32_arith_operand" "rmI")
++ (match_operand:HI 2 "ubicom32_data_register_operand" "d")))
++ (clobber (reg:CC CC_REGNO))]
++ ""
++ "sub.2\\t%0, %1, %2")
++
++(define_insn "subsi3"
++ [(set (match_operand:SI 0 "nonimmediate_operand" "=rm")
++ (minus:SI (match_operand:SI 1 "ubicom32_arith_operand" "rmI")
++ (match_operand:SI 2 "ubicom32_data_register_operand" "d")))
++ (clobber (reg:CC CC_REGNO))]
++ ""
++ "sub.4\\t%0, %1, %2")
++
++(define_insn "subsi3_ccwz"
++ [(set (reg CC_REGNO)
++ (compare
++ (minus:SI (match_operand:SI 1 "ubicom32_arith_operand" "rmI")
++ (match_operand:SI 2 "ubicom32_data_register_operand" "d"))
++ (const_int 0)))
++ (set (match_operand:SI 0 "nonimmediate_operand" "=rm")
++ (minus:SI (match_dup 1)
++ (match_dup 2)))]
++ "ubicom32_match_cc_mode(insn, CCWZNmode)"
++ "sub.4\\t%0, %1, %2")
++
++; We construct a 64-bit add from 32-bit operations. Note that we use the
++; & constraint to prevent overlapping registers being allocated. We do
++; allow identical registers though as that won't break anything.
++;
++(define_insn "subdi3"
++ [(set (match_operand:DI 0 "nonimmediate_operand" "=&r,r, d, m")
++ (minus:DI (match_operand:DI 1 "ubicom32_arith_operand" "rmI,0,rmI,rmI")
++ (match_operand:DI 2 "ubicom32_data_register_operand" "d,d, 0, d")))
++ (clobber (reg:CC CC_REGNO))]
++ ""
++ "*
++ {
++ operands[3] = gen_lowpart (SImode, operands[0]);
++ operands[4] = gen_lowpart (SImode, operands[1]);
++ operands[5] = gen_lowpart (SImode, operands[2]);
++ operands[6] = gen_highpart (SImode, operands[0]);
++ operands[7] = gen_highpart_mode (SImode, DImode, operands[1]);
++ operands[8] = gen_highpart (SImode, operands[2]);
++
++ return \"sub.4\\t%3, %4, %5\;subc\\t%6, %7, %8\";
++ }"
++ [(set_attr "length" "8")])
++
++(define_insn "subdi3_ccwz"
++ [(set (reg CC_REGNO)
++ (compare
++ (minus:DI (match_operand:DI 1 "ubicom32_arith_operand" "rmI,rmI")
++ (match_operand:DI 2 "ubicom32_data_register_operand" "d, d"))
++ (const_int 0)))
++ (set (match_operand:DI 0 "nonimmediate_operand" "=&r, m")
++ (minus:DI (match_dup 1)
++ (match_dup 2)))]
++ "ubicom32_match_cc_mode(insn, CCWZNmode)"
++ "*
++ {
++ operands[3] = gen_lowpart (SImode, operands[0]);
++ operands[4] = gen_lowpart (SImode, operands[1]);
++ operands[5] = gen_lowpart (SImode, operands[2]);
++ operands[6] = gen_highpart (SImode, operands[0]);
++ operands[7] = gen_highpart_mode (SImode, DImode, operands[1]);
++ operands[8] = gen_highpart (SImode, operands[2]);
++
++ return \"sub.4\\t%3, %4, %5\;subc\\t%6, %7, %8\";
++ }"
++ [(set_attr "length" "8")])
++
++;(define_insn "negqi2"
++; [(set (match_operand:QI 0 "nonimmediate_operand" "=rm")
++; (neg:QI (match_operand:QI 1 "ubicom32_data_register_operand" "d")))
++; (clobber (reg:CC CC_REGNO))]
++; "(ubicom32_v4)"
++; "sub.1\\t%0, #0, %1")
++
++;(define_insn "neghi2"
++; [(set (match_operand:HI 0 "nonimmediate_operand" "=rm")
++; (neg:HI (match_operand:HI 1 "ubicom32_data_register_operand" "d")))
++; (clobber (reg:CC CC_REGNO))]
++; ""
++; "sub.2\\t%0, #0, %1")
++
++(define_insn "negsi2"
++ [(set (match_operand:SI 0 "nonimmediate_operand" "=rm")
++ (neg:SI (match_operand:SI 1 "ubicom32_data_register_operand" "d")))
++ (clobber (reg:CC CC_REGNO))]
++ ""
++ "sub.4\\t%0, #0, %1")
++
++(define_insn_and_split "negdi2"
++ [(set (match_operand:DI 0 "nonimmediate_operand" "=&rm")
++ (neg:DI (match_operand:DI 1 "ubicom32_data_register_operand" "d")))
++ (clobber (reg:CC CC_REGNO))]
++ ""
++ "#"
++ "reload_completed"
++ [(parallel [(set (match_dup 0)
++ (minus:DI (const_int 0)
++ (match_dup 1)))
++ (clobber (reg:CC CC_REGNO))])]
++ ""
++ [(set_attr "length" "8")])
++
++(define_insn "umulhisi3"
++ [(set (match_operand:SI 0 "ubicom32_acc_lo_register_operand" "=l, l")
++ (mult:SI
++ (zero_extend:SI (match_operand:HI 1 "nonimmediate_operand" "%d,rm"))
++ (zero_extend:SI (match_operand:HI 2 "nonimmediate_operand" "rm, d"))))
++ (clobber (reg:HI ACC0_HI_REGNO))
++ (clobber (reg:HI ACC1_HI_REGNO))]
++ ""
++ "@
++ mulu\\t%A0, %2, %1
++ mulu\\t%A0, %1, %2"
++ [(set_attr "type" "mul,mul")])
++
++(define_insn "mulhisi3"
++ [(set (match_operand:SI 0 "ubicom32_acc_lo_register_operand" "=l, l")
++ (mult:SI
++ (sign_extend:SI (match_operand:HI 1 "nonimmediate_operand" "%d,rm"))
++ (sign_extend:SI (match_operand:HI 2 "nonimmediate_operand" "rm, d"))))
++ (clobber (reg:HI ACC0_HI_REGNO))
++ (clobber (reg:HI ACC1_HI_REGNO))]
++ ""
++ "@
++ muls\\t%A0, %2, %1
++ muls\\t%A0, %1, %2"
++ [(set_attr "type" "mul,mul")])
++
++(define_expand "mulsi3"
++ [(set (match_operand:SI 0 "ubicom32_acc_hi_register_operand" "")
++ (mult:SI (match_operand:SI 1 "ubicom32_arith_operand" "")
++ (match_operand:SI 2 "ubicom32_arith_operand" "")))]
++ ""
++ "{
++ if (ubicom32_emit_mult_sequence (operands))
++ DONE;
++ }")
++
++(define_insn "umulsidi3"
++ [(set (match_operand:DI 0 "ubicom32_acc_hi_register_operand" "=h, h")
++ (mult:DI
++ (zero_extend:DI (match_operand:SI 1 "nonimmediate_operand" "%d,rm"))
++ (zero_extend:DI (match_operand:SI 2 "nonimmediate_operand" "rm, d"))))]
++ "(ubicom32_v4)"
++ "@
++ mulu.4\\t%A0, %2, %1
++ mulu.4\\t%A0, %1, %2"
++ [(set_attr "type" "mul,mul")])
++
++(define_peephole2
++ [(set (match_operand:SI 0 "register_operand" "")
++ (match_operand:SI 1 "nonimmediate_operand" ""))
++ (set (match_operand:DI 2 "ubicom32_acc_hi_register_operand" "")
++ (mult:DI
++ (zero_extend:DI (match_dup 0))
++ (zero_extend:DI (match_operand:SI 3 "ubicom32_data_register_operand" ""))))]
++ "(peep2_reg_dead_p (2, operands[0])
++ || REGNO (operands[0]) == REGNO (operands[2])
++ || REGNO (operands[0]) == REGNO (operands[2]) + 1)
++ && ! rtx_equal_p (operands[0], operands[3])"
++ [(set (match_dup 2)
++ (mult:DI
++ (zero_extend:DI (match_dup 1))
++ (zero_extend:DI (match_dup 3))))]
++ "")
++
++(define_peephole2
++ [(set (match_operand:SI 0 "register_operand" "")
++ (match_operand:SI 1 "nonimmediate_operand" ""))
++ (set (match_operand:DI 2 "ubicom32_acc_hi_register_operand" "")
++ (mult:DI
++ (zero_extend:DI (match_operand:SI 3 "ubicom32_data_register_operand" ""))
++ (zero_extend:DI (match_dup 0))))]
++ "(peep2_reg_dead_p (2, operands[0])
++ || REGNO (operands[0]) == REGNO (operands[2])
++ || REGNO (operands[0]) == REGNO (operands[2]) + 1)
++ && ! rtx_equal_p (operands[0], operands[3])"
++ [(set (match_dup 2)
++ (mult:DI
++ (zero_extend:DI (match_dup 1))
++ (zero_extend:DI (match_dup 3))))]
++ "")
++
++(define_insn "umulsidi3_const"
++ [(set (match_operand:DI 0 "ubicom32_acc_hi_register_operand" "=h")
++ (mult:DI
++ (zero_extend:DI (match_operand:SI 1 "ubicom32_data_register_operand" "%d"))
++ (match_operand 2 "const_int_operand" "I")))]
++ "(ubicom32_v4 && satisfies_constraint_I (operands[2]))"
++ "mulu.4\\t%A0, %2, %1"
++ [(set_attr "type" "mul")])
++
++(define_insn "mulsidi3"
++ [(set (match_operand:DI 0 "ubicom32_acc_hi_register_operand" "=h, h")
++ (mult:DI
++ (sign_extend:DI (match_operand:SI 1 "nonimmediate_operand" "%d,rm"))
++ (sign_extend:DI (match_operand:SI 2 "nonimmediate_operand" "rm, d"))))]
++ "(ubicom32_v4)"
++ "@
++ muls.4\\t%A0, %2, %1
++ muls.4\\t%A0, %1, %2"
++ [(set_attr "type" "mul,mul")])
++
++(define_peephole2
++ [(set (match_operand:SI 0 "register_operand" "")
++ (match_operand:SI 1 "nonimmediate_operand" ""))
++ (set (match_operand:DI 2 "ubicom32_acc_hi_register_operand" "")
++ (mult:DI
++ (sign_extend:DI (match_dup 0))
++ (sign_extend:DI (match_operand:SI 3 "ubicom32_data_register_operand" ""))))]
++ "(peep2_reg_dead_p (2, operands[0])
++ || REGNO (operands[0]) == REGNO (operands[2])
++ || REGNO (operands[0]) == REGNO (operands[2]) + 1)
++ && ! rtx_equal_p (operands[0], operands[3])"
++ [(set (match_dup 2)
++ (mult:DI
++ (sign_extend:DI (match_dup 1))
++ (sign_extend:DI (match_dup 3))))]
++ "")
++
++(define_peephole2
++ [(set (match_operand:SI 0 "register_operand" "")
++ (match_operand:SI 1 "nonimmediate_operand" ""))
++ (set (match_operand:DI 2 "ubicom32_acc_hi_register_operand" "")
++ (mult:DI
++ (sign_extend:DI (match_operand:SI 3 "ubicom32_data_register_operand" ""))
++ (sign_extend:DI (match_dup 0))))]
++ "(peep2_reg_dead_p (2, operands[0])
++ || REGNO (operands[0]) == REGNO (operands[2])
++ || REGNO (operands[0]) == REGNO (operands[2]) + 1)
++ && ! rtx_equal_p (operands[0], operands[3])"
++ [(set (match_dup 2)
++ (mult:DI
++ (sign_extend:DI (match_dup 1))
++ (sign_extend:DI (match_dup 3))))]
++ "")
++
++(define_insn "mulsidi3_const"
++ [(set (match_operand:DI 0 "ubicom32_acc_hi_register_operand" "=h")
++ (mult:DI
++ (sign_extend:DI (match_operand:SI 1 "ubicom32_data_register_operand" "%d"))
++ (match_operand 2 "const_int_operand" "I")))]
++ "(ubicom32_v4 && satisfies_constraint_I (operands[2]))"
++ "muls.4\\t%A0, %2, %1"
++ [(set_attr "type" "mul")])
++
++(define_expand "andqi3"
++ [(parallel
++ [(set (match_operand:QI 0 "memory_operand" "")
++ (and:QI (match_operand:QI 1 "nonimmediate_operand" "")
++ (match_operand:QI 2 "ubicom32_arith_operand" "")))
++ (clobber (reg:CC CC_REGNO))])]
++ "(ubicom32_v4)"
++ "{
++ if (!memory_operand (operands[0], QImode))
++ FAIL;
++
++ /* If we have a non-data reg for operand 1 then prefer that over
++ a CONST_INT in operand 2. */
++ if (! ubicom32_data_register_operand (operands[1], GET_MODE (operands[1]))
++ && CONST_INT_P (operands[2]))
++ operands[2] = copy_to_mode_reg (QImode, operands[2]);
++
++ if (CONST_INT_P (operands[2]) && ! satisfies_constraint_I (operands[2]))
++ operands[2] = copy_to_mode_reg (QImode, operands[2]);
++ }")
++
++(define_insn "andqi3_and1"
++ [(set (match_operand:QI 0 "memory_operand" "=m, m")
++ (and:QI (match_operand:QI 1 "nonimmediate_operand" "%d,rm")
++ (match_operand:QI 2 "ubicom32_arith_operand" "rmI, d")))
++ (clobber (reg:CC CC_REGNO))]
++ "(ubicom32_v4)"
++ "@
++ and.1\\t%0, %2, %1
++ and.1\\t%0, %1, %2")
++
++(define_insn "andqi3_and1_ccszn"
++ [(set (reg CC_REGNO)
++ (compare
++ (and:QI (match_operand:QI 1 "nonimmediate_operand" "%d,rm")
++ (match_operand:QI 2 "ubicom32_arith_operand" "rmI, d"))
++ (const_int 0)))
++ (set (match_operand:QI 0 "memory_operand" "=m, m")
++ (and:QI (match_dup 1)
++ (match_dup 2)))]
++ "(ubicom32_v4
++ && ubicom32_match_cc_mode(insn, CCSZNmode))"
++ "@
++ and.1\\t%0, %2, %1
++ and.1\\t%0, %1, %2")
++
++(define_insn "andqi3_and1_ccszn_null"
++ [(set (reg CC_REGNO)
++ (compare
++ (and:QI (match_operand:QI 0 "nonimmediate_operand" "%d,rm")
++ (match_operand:QI 1 "ubicom32_arith_operand" "rmI, d"))
++ (const_int 0)))]
++ "(ubicom32_v4
++ && ubicom32_match_cc_mode(insn, CCSZNmode))"
++ "@
++ and.1\\t#0, %1, %0
++ and.1\\t#0, %0, %1")
++
++(define_insn "and1_ccszn_null_1"
++ [(set (reg CC_REGNO)
++ (compare
++ (subreg:QI
++ (and:SI (match_operand:SI 0 "ubicom32_data_register_operand" "%d")
++ (match_operand:SI 1 "ubicom32_arith_operand" "rI"))
++ 3)
++ (const_int 0)))]
++ "(ubicom32_v4
++ && ubicom32_match_cc_mode(insn, CCSZNmode))"
++ "and.1\\t#0, %1, %0")
++
++(define_insn "and1_ccszn_null_2"
++ [(set (reg CC_REGNO)
++ (compare
++ (subreg:QI
++ (and:SI (match_operand:SI 0 "ubicom32_data_register_operand" "d")
++ (subreg:SI
++ (match_operand:QI 1 "memory_operand" "m")
++ 0))
++ 3)
++ (const_int 0)))]
++ "(ubicom32_v4
++ && ubicom32_match_cc_mode(insn, CCSZNmode))"
++ "and.1\\t#0, %1, %0")
++
++(define_insn "and1_ccszn_null_3"
++ [(set (reg CC_REGNO)
++ (compare
++ (subreg:QI
++ (and:SI (subreg:SI
++ (match_operand:QI 0 "memory_operand" "m")
++ 0)
++ (match_operand:SI 1 "ubicom32_data_register_operand" "d"))
++ 3)
++ (const_int 0)))]
++ "(ubicom32_v4
++ && ubicom32_match_cc_mode(insn, CCSZNmode))"
++ "and.1\\t#0, %0, %1")
++
++(define_expand "andhi3"
++ [(parallel
++ [(set (match_operand:HI 0 "memory_operand" "")
++ (and:HI (match_operand:HI 1 "nonimmediate_operand" "")
++ (match_operand:HI 2 "ubicom32_arith_operand" "")))
++ (clobber (reg:CC CC_REGNO))])]
++ ""
++ "{
++ if (!memory_operand (operands[0], HImode))
++ FAIL;
++
++ /* If we have a non-data reg for operand 1 then prefer that over
++ a CONST_INT in operand 2. */
++ if (! ubicom32_data_register_operand (operands[1], GET_MODE (operands[1]))
++ && CONST_INT_P (operands[2]))
++ operands[2] = copy_to_mode_reg (HImode, operands[2]);
++
++ if (CONST_INT_P (operands[2]) && ! satisfies_constraint_I (operands[2]))
++ operands[2] = copy_to_mode_reg (HImode, operands[2]);
++ }")
++
++(define_insn "andhi3_and2"
++ [(set (match_operand:HI 0 "memory_operand" "=m, m")
++ (and:HI (match_operand:HI 1 "nonimmediate_operand" "%d,rm")
++ (match_operand:HI 2 "ubicom32_arith_operand" "rmI, d")))
++ (clobber (reg:CC CC_REGNO))]
++ ""
++ "@
++ and.2\\t%0, %2, %1
++ and.2\\t%0, %1, %2")
++
++(define_insn "andhi3_and2_ccszn"
++ [(set (reg CC_REGNO)
++ (compare
++ (and:HI (match_operand:HI 1 "nonimmediate_operand" "%d,rm")
++ (match_operand:HI 2 "ubicom32_arith_operand" "rmI, d"))
++ (const_int 0)))
++ (set (match_operand:HI 0 "memory_operand" "=m, m")
++ (and:HI (match_dup 1)
++ (match_dup 2)))]
++ "ubicom32_match_cc_mode(insn, CCSZNmode)"
++ "@
++ and.2\\t%0, %2, %1
++ and.2\\t%0, %1, %2")
++
++(define_insn "andhi3_and2_ccszn_null"
++ [(set (reg CC_REGNO)
++ (compare
++ (and:HI (match_operand:HI 0 "nonimmediate_operand" "%d,rm")
++ (match_operand:HI 1 "ubicom32_arith_operand" "rmI, d"))
++ (const_int 0)))]
++ "ubicom32_match_cc_mode(insn, CCSZNmode)"
++ "@
++ and.2\\t#0, %1, %0
++ and.2\\t#0, %0, %1")
++
++(define_insn "and2_ccszn_null_1"
++ [(set (reg CC_REGNO)
++ (compare
++ (subreg:HI
++ (and:SI (match_operand:SI 0 "ubicom32_data_register_operand" "%d")
++ (match_operand:SI 1 "ubicom32_arith_operand" "rI"))
++ 2)
++ (const_int 0)))]
++ "ubicom32_match_cc_mode(insn, CCSZNmode)"
++ "and.2\\t#0, %1, %0")
++
++(define_insn "and2_ccszn_null_2"
++ [(set (reg CC_REGNO)
++ (compare
++ (subreg:HI
++ (and:SI (match_operand:SI 0 "ubicom32_data_register_operand" "d")
++ (subreg:SI
++ (match_operand:HI 1 "memory_operand" "m")
++ 0))
++ 2)
++ (const_int 0)))]
++ "ubicom32_match_cc_mode(insn, CCSZNmode)"
++ "and.2\\t#0, %1, %0")
++
++(define_insn "and2_ccszn_null_3"
++ [(set (reg CC_REGNO)
++ (compare
++ (subreg:HI
++ (and:SI (subreg:SI
++ (match_operand:HI 0 "memory_operand" "m")
++ 0)
++ (match_operand:SI 1 "ubicom32_data_register_operand" "d"))
++ 2)
++ (const_int 0)))]
++ "ubicom32_match_cc_mode(insn, CCSZNmode)"
++ "and.2\\t#0, %0, %1")
++
++(define_expand "andsi3"
++ [(parallel
++ [(set (match_operand:SI 0 "nonimmediate_operand" "")
++ (and:SI (match_operand:SI 1 "nonimmediate_operand" "")
++ (match_operand:SI 2 "ubicom32_and_or_si3_operand" "")))
++ (clobber (reg:CC CC_REGNO))])]
++ ""
++ "{
++ do
++ {
++ /* Is this a bfextu? */
++ if (ubicom32_data_register_operand (operands[0], SImode)
++ && CONST_INT_P (operands[2])
++ && exact_log2 (INTVAL (operands[2]) + 1) != -1)
++ break;
++
++ /* Is this a bclr? */
++ if (CONST_INT_P (operands[2])
++ && exact_log2 (~INTVAL (operands[2])) != -1)
++ break;
++
++ /* Must be an and.4 */
++ if (!ubicom32_data_register_operand (operands[1], SImode))
++ operands[1] = copy_to_mode_reg (SImode, operands[1]);
++
++ if (!ubicom32_arith_operand (operands[2], SImode))
++ operands[2] = copy_to_mode_reg (SImode, operands[2]);
++ }
++ while (0);
++ }")
++
++(define_insn "andsi3_bfextu"
++ [(set (match_operand:SI 0 "ubicom32_data_register_operand" "=d")
++ (and:SI (match_operand:SI 1 "nonimmediate_operand" "%rm")
++ (match_operand:SI 2 "const_int_operand" "O")))
++ (clobber (reg:CC CC_REGNO))]
++ "(satisfies_constraint_O (operands[2]))"
++ "*
++ {
++ operands[3] = GEN_INT (exact_log2 (INTVAL (operands[2]) + 1));
++
++ return \"bfextu\\t%0, %1, %3\";
++ }")
++
++(define_insn "andsi3_bfextu_ccwz"
++ [(set (reg CC_REGNO)
++ (compare
++ (and:SI (match_operand:SI 1 "nonimmediate_operand" "%rm")
++ (match_operand:SI 2 "const_int_operand" "O"))
++ (const_int 0)))
++ (set (match_operand:SI 0 "ubicom32_data_register_operand" "=d")
++ (and:SI (match_dup 1)
++ (match_dup 2)))]
++ "(satisfies_constraint_O (operands[2])
++ && ubicom32_match_cc_mode(insn, CCWZmode))"
++ "*
++ {
++ operands[3] = GEN_INT (exact_log2 (INTVAL (operands[2]) + 1));
++
++ return \"bfextu\\t%0, %1, %3\";
++ }")
++
++(define_insn "andsi3_bfextu_ccwz_null"
++ [(set (reg CC_REGNO)
++ (compare
++ (and:SI (match_operand:SI 0 "nonimmediate_operand" "%rm")
++ (match_operand:SI 1 "const_int_operand" "O"))
++ (const_int 0)))
++ (clobber (match_scratch:SI 2 "=d"))]
++ "(satisfies_constraint_O (operands[1])
++ && ubicom32_match_cc_mode(insn, CCWZmode))"
++ "*
++ {
++ operands[3] = GEN_INT (exact_log2 (INTVAL (operands[1]) + 1));
++
++ return \"bfextu\\t%2, %0, %3\";
++ }")
++
++(define_insn "andsi3_bclr"
++ [(set (match_operand:SI 0 "nonimmediate_operand" "=rm")
++ (and:SI (match_operand:SI 1 "ubicom32_arith_operand" "%rmI")
++ (match_operand:SI 2 "const_int_operand" "n")))
++ (clobber (reg:CC CC_REGNO))]
++ "(exact_log2 (~INTVAL (operands[2])) != -1)"
++ "bclr\\t%0, %1, #%D2")
++
++(define_insn "andsi3_and4"
++ [(set (match_operand:SI 0 "nonimmediate_operand" "=rm,rm")
++ (and:SI (match_operand:SI 1 "nonimmediate_operand" "%d,rm")
++ (match_operand:SI 2 "ubicom32_arith_operand" "rmI, d")))
++ (clobber (reg:CC CC_REGNO))]
++ ""
++ "@
++ and.4\\t%0, %2, %1
++ and.4\\t%0, %1, %2")
++
++(define_insn "andsi3_and4_ccwzn"
++ [(set (reg CC_REGNO)
++ (compare
++ (and:SI (match_operand:SI 1 "nonimmediate_operand" "%d,rm")
++ (match_operand:SI 2 "ubicom32_arith_operand" "rmI, d"))
++ (const_int 0)))
++ (set (match_operand:SI 0 "nonimmediate_operand" "=rm,rm")
++ (and:SI (match_dup 1)
++ (match_dup 2)))]
++ "ubicom32_match_cc_mode(insn, CCWZNmode)"
++ "@
++ and.4\\t%0, %2, %1
++ and.4\\t%0, %1, %2")
++
++(define_insn "andsi3_and4_ccwzn_null"
++ [(set (reg CC_REGNO)
++ (compare
++ (and:SI (match_operand:SI 0 "nonimmediate_operand" "%d,rm")
++ (match_operand:SI 1 "ubicom32_arith_operand" "rmI, d"))
++ (const_int 0)))]
++ "ubicom32_match_cc_mode(insn, CCWZNmode)"
++ "@
++ and.4\\t#0, %1, %0
++ and.4\\t#0, %0, %1")
++
++(define_insn "andsi3_lsr4_ccwz_null"
++ [(set (reg CC_REGNO)
++ (compare
++ (and:SI (match_operand:SI 0 "nonimmediate_operand" "%rm")
++ (match_operand:SI 1 "const_int_operand" "n"))
++ (const_int 0)))
++ (clobber (match_scratch:SI 2 "=d"))]
++ "(exact_log2 ((~(INTVAL (operands[1]))) + 1) != -1
++ && ubicom32_match_cc_mode(insn, CCWZmode))"
++ "*
++ {
++ operands[3] = GEN_INT (exact_log2 ((~(INTVAL (operands[1]))) + 1));
++
++ return \"lsr.4\\t%2, %0, %3\";
++ }")
++
++; We really would like the combiner to recognize this scenario and deal with
++; it but unfortunately it tries to canonicalize zero_extract ops on MEMs
++; into QImode operations and we can't match them in any useful way.
++;
++(define_peephole2
++ [(set (match_operand:SI 0 "register_operand" "")
++ (match_operand:SI 1 "const_int_operand" ""))
++ (set (reg:CCWZ CC_REGNO)
++ (compare:CCWZ
++ (and:SI (match_operand:SI 2 "nonimmediate_operand" "")
++ (match_dup 0))
++ (const_int 0)))]
++ "(exact_log2 (INTVAL (operands[1])) != -1
++ && peep2_reg_dead_p (2, operands[0]))"
++ [(set (reg:CCWZ CC_REGNO)
++ (compare:CCWZ
++ (zero_extract:SI
++ (match_dup 2)
++ (const_int 1)
++ (match_dup 3))
++ (const_int 0)))]
++ "{
++ operands[3] = GEN_INT (exact_log2 (INTVAL (operands[1])));
++ }")
++
++(define_expand "anddi3"
++ [(parallel
++ [(set (match_operand:DI 0 "nonimmediate_operand" "")
++ (and:DI (match_operand:DI 1 "nonimmediate_operand" "")
++ (match_operand:DI 2 "ubicom32_arith_operand" "")))
++ (clobber (reg:CC CC_REGNO))])]
++ ""
++ "{
++ /* If we have a non-data reg for operand 1 then prefer that over
++ a CONST_INT in operand 2. */
++ if (! ubicom32_data_register_operand (operands[1], GET_MODE (operands[1]))
++ && CONST_INT_P (operands[2]))
++ operands[2] = copy_to_mode_reg (DImode, operands[2]);
++
++ if (CONST_INT_P (operands[2]) && ! satisfies_constraint_I (operands[2]))
++ operands[2] = copy_to_mode_reg (DImode, operands[2]);
++ }")
++
++(define_insn_and_split "anddi3_and4"
++ [(set (match_operand:DI 0 "nonimmediate_operand" "=&r,&r, d,rm, m, m")
++ (and:DI (match_operand:DI 1 "nonimmediate_operand" "%d,rm, 0, 0, d,rm")
++ (match_operand:DI 2 "ubicom32_arith_operand" "rmI, d,rmI, d,rmI, d")))
++ (clobber (reg:CC CC_REGNO))]
++ ""
++ "#"
++ "reload_completed"
++ [(parallel [(set (match_dup 3)
++ (and:SI (match_dup 4)
++ (match_dup 5)))
++ (clobber (reg:CC CC_REGNO))])
++ (parallel [(set (match_dup 6)
++ (and:SI (match_dup 7)
++ (match_dup 8)))
++ (clobber (reg:CC CC_REGNO))])]
++ "{
++ operands[3] = gen_lowpart (SImode, operands[0]);
++ operands[4] = gen_lowpart (SImode, operands[1]);
++ operands[5] = gen_lowpart (SImode, operands[2]);
++ operands[6] = gen_highpart (SImode, operands[0]);
++ operands[7] = gen_highpart (SImode, operands[1]);
++ operands[8] = gen_highpart_mode (SImode, DImode, operands[2]);
++ }"
++ [(set_attr "length" "8")])
++
++(define_expand "iorqi3"
++ [(parallel
++ [(set (match_operand:QI 0 "memory_operand" "")
++ (ior:QI (match_operand:QI 1 "nonimmediate_operand" "")
++ (match_operand:QI 2 "ubicom32_arith_operand" "")))
++ (clobber (reg:CC CC_REGNO))])]
++ "(ubicom32_v4)"
++ "{
++ if (!memory_operand (operands[0], QImode))
++ FAIL;
++
++ /* If we have a non-data reg for operand 1 then prefer that over
++ a CONST_INT in operand 2. */
++ if (! ubicom32_data_register_operand (operands[1], GET_MODE (operands[1]))
++ && CONST_INT_P (operands[2]))
++ operands[2] = copy_to_mode_reg (QImode, operands[2]);
++
++ if (CONST_INT_P (operands[2]) && ! satisfies_constraint_I (operands[2]))
++ operands[2] = copy_to_mode_reg (QImode, operands[2]);
++ }")
++
++(define_insn "iorqi3_or1"
++ [(set (match_operand:QI 0 "memory_operand" "=m, m")
++ (ior:QI (match_operand:QI 1 "nonimmediate_operand" "%d,rm")
++ (match_operand:QI 2 "ubicom32_arith_operand" "rmI, d")))
++ (clobber (reg:CC CC_REGNO))]
++ "(ubicom32_v4)"
++ "@
++ or.1\\t%0, %2, %1
++ or.1\\t%0, %1, %2")
++
++(define_expand "iorhi3"
++ [(parallel
++ [(set (match_operand:HI 0 "memory_operand" "")
++ (ior:HI (match_operand:HI 1 "nonimmediate_operand" "")
++ (match_operand:HI 2 "ubicom32_arith_operand" "")))
++ (clobber (reg:CC CC_REGNO))])]
++ ""
++ "{
++ if (!memory_operand (operands[0], HImode))
++ FAIL;
++
++ /* If we have a non-data reg for operand 1 then prefer that over
++ a CONST_INT in operand 2. */
++ if (! ubicom32_data_register_operand (operands[1], GET_MODE (operands[1]))
++ && CONST_INT_P (operands[2]))
++ operands[2] = copy_to_mode_reg (HImode, operands[2]);
++
++ if (CONST_INT_P (operands[2]) && ! satisfies_constraint_I (operands[2]))
++ operands[2] = copy_to_mode_reg (HImode, operands[2]);
++ }")
++
++(define_insn "iorhi3_or2"
++ [(set (match_operand:HI 0 "memory_operand" "=m, m")
++ (ior:HI (match_operand:HI 1 "nonimmediate_operand" "%d,rm")
++ (match_operand:HI 2 "ubicom32_arith_operand" "rmI, d")))
++ (clobber (reg:CC CC_REGNO))]
++ ""
++ "@
++ or.2\\t%0, %2, %1
++ or.2\\t%0, %1, %2")
++
++(define_expand "iorsi3"
++ [(parallel
++ [(set (match_operand:SI 0 "nonimmediate_operand" "")
++ (ior:SI (match_operand:SI 1 "nonimmediate_operand" "")
++ (match_operand:SI 2 "ubicom32_and_or_si3_operand" "")))
++ (clobber (reg:CC CC_REGNO))])]
++ ""
++ "{
++ do
++ {
++ /* Is this a bset? */
++ if (CONST_INT_P (operands[2])
++ && exact_log2 (INTVAL (operands[2])) != -1)
++ break;
++
++ /* Must be an or.4 */
++ if (!ubicom32_data_register_operand (operands[1], SImode))
++ operands[1] = copy_to_mode_reg (SImode, operands[1]);
++
++ if (!ubicom32_arith_operand (operands[2], SImode))
++ operands[2] = copy_to_mode_reg (SImode, operands[2]);
++ }
++ while (0);
++ }")
++
++(define_insn "iorsi3_bset"
++ [(set (match_operand:SI 0 "nonimmediate_operand" "=rm")
++ (ior:SI (match_operand:SI 1 "ubicom32_arith_operand" "%rmI")
++ (match_operand 2 "const_int_operand" "n")))
++ (clobber (reg:CC CC_REGNO))]
++ "(exact_log2 (INTVAL (operands[2])) != -1)"
++ "bset\\t%0, %1, #%d2")
++
++(define_insn "iorsi3_or4"
++ [(set (match_operand:SI 0 "nonimmediate_operand" "=rm,rm")
++ (ior:SI (match_operand:SI 1 "nonimmediate_operand" "%d,rm")
++ (match_operand:SI 2 "ubicom32_arith_operand" "rmI, d")))
++ (clobber (reg:CC CC_REGNO))]
++ ""
++ "@
++ or.4\\t%0, %2, %1
++ or.4\\t%0, %1, %2")
++
++(define_insn "iorsi3_ccwzn"
++ [(set (reg CC_REGNO)
++ (compare
++ (ior:SI (match_operand:SI 1 "nonimmediate_operand" "%d,rm")
++ (match_operand:SI 2 "ubicom32_arith_operand" "rmI, d"))
++ (const_int 0)))
++ (set (match_operand:SI 0 "nonimmediate_operand" "=rm,rm")
++ (ior:SI (match_dup 1)
++ (match_dup 2)))]
++ "ubicom32_match_cc_mode(insn, CCWZNmode)"
++ "@
++ or.4\\t%0, %2, %1
++ or.4\\t%0, %1, %2")
++
++(define_insn "iorsi3_ccwzn_null"
++ [(set (reg CC_REGNO)
++ (compare
++ (ior:SI (match_operand:SI 0 "nonimmediate_operand" "%d,rm")
++ (match_operand:SI 1 "ubicom32_arith_operand" "rmI, d"))
++ (const_int 0)))]
++ "ubicom32_match_cc_mode(insn, CCWZNmode)"
++ "@
++ or.4\\t#0, %1, %0
++ or.4\\t#0, %0, %1")
++
++(define_expand "iordi3"
++ [(parallel
++ [(set (match_operand:DI 0 "nonimmediate_operand" "")
++ (ior:DI (match_operand:DI 1 "nonimmediate_operand" "")
++ (match_operand:DI 2 "ubicom32_arith_operand" "")))
++ (clobber (reg:CC CC_REGNO))])]
++ ""
++ "{
++ /* If we have a non-data reg for operand 1 then prefer that over
++ a CONST_INT in operand 2. */
++ if (! ubicom32_data_register_operand (operands[1], GET_MODE (operands[1]))
++ && CONST_INT_P (operands[2]))
++ operands[2] = copy_to_mode_reg (DImode, operands[2]);
++
++ if (CONST_INT_P (operands[2]) && ! satisfies_constraint_I (operands[2]))
++ operands[2] = copy_to_mode_reg (DImode, operands[2]);
++ }")
++
++(define_insn_and_split "iordi3_or4"
++ [(set (match_operand:DI 0 "nonimmediate_operand" "=&r,&r, d,rm, m, m")
++ (ior:DI (match_operand:DI 1 "nonimmediate_operand" "%d,rm, 0, 0, d,rm")
++ (match_operand:DI 2 "ubicom32_arith_operand" "rmI, d,rmI, d,rmI, d")))
++ (clobber (reg:CC CC_REGNO))]
++ ""
++ "#"
++ "reload_completed"
++ [(parallel [(set (match_dup 3)
++ (ior:SI (match_dup 4)
++ (match_dup 5)))
++ (clobber (reg:CC CC_REGNO))])
++ (parallel [(set (match_dup 6)
++ (ior:SI (match_dup 7)
++ (match_dup 8)))
++ (clobber (reg:CC CC_REGNO))])]
++ "{
++ operands[3] = gen_lowpart (SImode, operands[0]);
++ operands[4] = gen_lowpart (SImode, operands[1]);
++ operands[5] = gen_lowpart (SImode, operands[2]);
++ operands[6] = gen_highpart (SImode, operands[0]);
++ operands[7] = gen_highpart (SImode, operands[1]);
++ operands[8] = gen_highpart_mode (SImode, DImode, operands[2]);
++ }"
++ [(set_attr "length" "8")])
++
++(define_expand "xorqi3"
++ [(parallel
++ [(set (match_operand:QI 0 "memory_operand" "")
++ (xor:QI (match_operand:QI 1 "nonimmediate_operand" "")
++ (match_operand:QI 2 "ubicom32_arith_operand" "")))
++ (clobber (reg:CC CC_REGNO))])]
++ "(ubicom32_v4)"
++ "{
++ if (!memory_operand (operands[0], QImode))
++ FAIL;
++
++ /* If we have a non-data reg for operand 1 then prefer that over
++ a CONST_INT in operand 2. */
++ if (! ubicom32_data_register_operand (operands[1], GET_MODE (operands[1]))
++ && CONST_INT_P (operands[2]))
++ operands[2] = copy_to_mode_reg (QImode, operands[2]);
++
++ if (CONST_INT_P (operands[2]) && ! satisfies_constraint_I (operands[2]))
++ operands[2] = copy_to_mode_reg (QImode, operands[2]);
++ }")
++
++(define_insn "xorqi3_xor1"
++ [(set (match_operand:QI 0 "memory_operand" "=m, m")
++ (xor:QI (match_operand:QI 1 "nonimmediate_operand" "%d,rm")
++ (match_operand:QI 2 "ubicom32_arith_operand" "rmI, d")))
++ (clobber (reg:CC CC_REGNO))]
++ "(ubicom32_v4)"
++ "@
++ xor.1\\t%0, %2, %1
++ xor.1\\t%0, %1, %2")
++
++(define_insn "xorqi3_xor1_ccszn"
++ [(set (reg CC_REGNO)
++ (compare
++ (xor:QI (match_operand:QI 1 "nonimmediate_operand" "%d,rm")
++ (match_operand:QI 2 "ubicom32_arith_operand" "rmI, d"))
++ (const_int 0)))
++ (set (match_operand:QI 0 "memory_operand" "=m, m")
++ (xor:QI (match_dup 1)
++ (match_dup 2)))]
++ "(ubicom32_v4
++ && ubicom32_match_cc_mode(insn, CCSZNmode))"
++ "@
++ xor.1\\t%0, %2, %1
++ xor.1\\t%0, %1, %2")
++
++(define_insn "xorqi3_xor1_ccszn_null"
++ [(set (reg CC_REGNO)
++ (compare
++ (xor:QI (match_operand:QI 0 "nonimmediate_operand" "%d,rm")
++ (match_operand:QI 1 "ubicom32_arith_operand" "rmI, d"))
++ (const_int 0)))]
++ "(ubicom32_v4
++ && ubicom32_match_cc_mode(insn, CCSZNmode))"
++ "@
++ xor.1\\t#0, %1, %0
++ xor.1\\t#0, %0, %1")
++
++(define_insn "xor1_ccszn_null_1"
++ [(set (reg CC_REGNO)
++ (compare
++ (subreg:QI
++ (xor:SI (match_operand:SI 0 "ubicom32_data_register_operand" "%d")
++ (match_operand:SI 1 "ubicom32_arith_operand" "rI"))
++ 3)
++ (const_int 0)))]
++ "(ubicom32_v4
++ && ubicom32_match_cc_mode(insn, CCSZNmode))"
++ "xor.1\\t#0, %1, %0")
++
++(define_insn "xor1_ccszn_null_2"
++ [(set (reg CC_REGNO)
++ (compare
++ (subreg:QI
++ (xor:SI (match_operand:SI 0 "ubicom32_data_register_operand" "d")
++ (subreg:SI
++ (match_operand:QI 1 "memory_operand" "m")
++ 0))
++ 3)
++ (const_int 0)))]
++ "(ubicom32_v4
++ && ubicom32_match_cc_mode(insn, CCSZNmode))"
++ "xor.1\\t#0, %1, %0")
++
++(define_insn "xor1_ccwzn_null_3"
++ [(set (reg CC_REGNO)
++ (compare
++ (subreg:QI
++ (xor:SI (subreg:SI
++ (match_operand:QI 0 "memory_operand" "m")
++ 0)
++ (match_operand:SI 1 "ubicom32_data_register_operand" "d"))
++ 3)
++ (const_int 0)))]
++ "(ubicom32_v4
++ && ubicom32_match_cc_mode(insn, CCSZNmode))"
++ "xor.1\\t#0, %0, %1")
++
++(define_expand "xorhi3"
++ [(parallel
++ [(set (match_operand:HI 0 "memory_operand" "")
++ (xor:HI (match_operand:HI 1 "nonimmediate_operand" "")
++ (match_operand:HI 2 "ubicom32_arith_operand" "")))
++ (clobber (reg:CC CC_REGNO))])]
++ ""
++ "{
++ if (!memory_operand (operands[0], HImode))
++ FAIL;
++
++ /* If we have a non-data reg for operand 1 then prefer that over
++ a CONST_INT in operand 2. */
++ if (! ubicom32_data_register_operand (operands[1], GET_MODE (operands[1]))
++ && CONST_INT_P (operands[2]))
++ operands[2] = copy_to_mode_reg (HImode, operands[2]);
++
++ if (CONST_INT_P (operands[2]) && ! satisfies_constraint_I (operands[2]))
++ operands[2] = copy_to_mode_reg (HImode, operands[2]);
++ }")
++
++(define_insn "xorhi3_xor2"
++ [(set (match_operand:HI 0 "memory_operand" "=m, m")
++ (xor:HI (match_operand:HI 1 "nonimmediate_operand" "%d,rm")
++ (match_operand:HI 2 "ubicom32_arith_operand" "rmI, d")))
++ (clobber (reg:CC CC_REGNO))]
++ ""
++ "@
++ xor.2\\t%0, %2, %1
++ xor.2\\t%0, %1, %2")
++
++(define_insn "xorhi3_xor2_ccszn"
++ [(set (reg CC_REGNO)
++ (compare
++ (xor:HI (match_operand:HI 1 "nonimmediate_operand" "%d,rm")
++ (match_operand:HI 2 "ubicom32_arith_operand" "rmI, d"))
++ (const_int 0)))
++ (set (match_operand:HI 0 "memory_operand" "=m, m")
++ (xor:HI (match_dup 1)
++ (match_dup 2)))]
++ "ubicom32_match_cc_mode(insn, CCSZNmode)"
++ "@
++ xor.2\\t%0, %2, %1
++ xor.2\\t%0, %1, %2")
++
++(define_insn "xorhi3_xor2_ccszn_null"
++ [(set (reg CC_REGNO)
++ (compare
++ (xor:HI (match_operand:HI 0 "nonimmediate_operand" "%d,rm")
++ (match_operand:HI 1 "ubicom32_arith_operand" "rmI, d"))
++ (const_int 0)))]
++ "ubicom32_match_cc_mode(insn, CCSZNmode)"
++ "@
++ xor.2\\t#0, %1, %0
++ xor.2\\t#0, %0, %1")
++
++(define_insn "xor2_ccszn_null_1"
++ [(set (reg CC_REGNO)
++ (compare
++ (subreg:HI
++ (xor:SI (match_operand:SI 0 "ubicom32_data_register_operand" "%d")
++ (match_operand:SI 1 "ubicom32_arith_operand" "rI"))
++ 2)
++ (const_int 0)))]
++ "ubicom32_match_cc_mode(insn, CCSZNmode)"
++ "xor.2\\t#0, %1, %0")
++
++(define_insn "xor2_ccszn_null_2"
++ [(set (reg CC_REGNO)
++ (compare
++ (subreg:HI
++ (xor:SI (match_operand:SI 0 "ubicom32_data_register_operand" "d")
++ (subreg:SI
++ (match_operand:HI 1 "memory_operand" "m")
++ 0))
++ 2)
++ (const_int 0)))]
++ "ubicom32_match_cc_mode(insn, CCSZNmode)"
++ "xor.2\\t#0, %1, %0")
++
++(define_insn "xor2_ccszn_null_3"
++ [(set (reg CC_REGNO)
++ (compare
++ (subreg:HI
++ (xor:SI (subreg:SI
++ (match_operand:HI 0 "memory_operand" "m")
++ 0)
++ (match_operand:SI 1 "ubicom32_data_register_operand" "d"))
++ 2)
++ (const_int 0)))]
++ "ubicom32_match_cc_mode(insn, CCSZNmode)"
++ "xor.2\\t#0, %0, %1")
++
++(define_insn "xorsi3"
++ [(set (match_operand:SI 0 "nonimmediate_operand" "=rm,rm")
++ (xor:SI (match_operand:SI 1 "nonimmediate_operand" "%d,rm")
++ (match_operand:SI 2 "ubicom32_arith_operand" "rmI, d")))
++ (clobber (reg:CC CC_REGNO))]
++ ""
++ "@
++ xor.4\\t%0, %2, %1
++ xor.4\\t%0, %1, %2")
++
++(define_insn "xorsi3_ccwzn"
++ [(set (reg CC_REGNO)
++ (compare
++ (xor:SI (match_operand:SI 1 "nonimmediate_operand" "%d,rm")
++ (match_operand:SI 2 "ubicom32_arith_operand" "rmI, d"))
++ (const_int 0)))
++ (set (match_operand:SI 0 "nonimmediate_operand" "=rm,rm")
++ (xor:SI (match_dup 1)
++ (match_dup 2)))]
++ "ubicom32_match_cc_mode(insn, CCWZNmode)"
++ "@
++ xor.4\\t%0, %2, %1
++ xor.4\\t%0, %1, %2")
++
++(define_insn "xorsi3_ccwzn_null"
++ [(set (reg CC_REGNO)
++ (compare
++ (xor:SI (match_operand:SI 0 "nonimmediate_operand" "%d,rm")
++ (match_operand:SI 1 "ubicom32_arith_operand" "rmI, d"))
++ (const_int 0)))]
++ "ubicom32_match_cc_mode(insn, CCWZNmode)"
++ "@
++ xor.4\\t#0, %1, %0
++ xor.4\\t#0, %0, %1")
++
++(define_expand "xordi3"
++ [(parallel
++ [(set (match_operand:DI 0 "nonimmediate_operand" "")
++ (xor:DI (match_operand:DI 1 "nonimmediate_operand" "")
++ (match_operand:DI 2 "ubicom32_arith_operand" "")))
++ (clobber (reg:CC CC_REGNO))])]
++ ""
++ "{
++ /* If we have a non-data reg for operand 1 then prefer that over
++ a CONST_INT in operand 2. */
++ if (! ubicom32_data_register_operand (operands[1], GET_MODE (operands[1]))
++ && CONST_INT_P (operands[2]))
++ operands[2] = copy_to_mode_reg (DImode, operands[2]);
++
++ if (CONST_INT_P (operands[2]) && ! satisfies_constraint_I (operands[2]))
++ operands[2] = copy_to_mode_reg (DImode, operands[2]);
++ }")
++
++(define_insn_and_split "xordi3_xor4"
++ [(set (match_operand:DI 0 "nonimmediate_operand" "=&r,&r, d,rm, m, m")
++ (xor:DI (match_operand:DI 1 "nonimmediate_operand" "%d,rm, 0, 0, d,rm")
++ (match_operand:DI 2 "ubicom32_arith_operand" "rmI, d,rmI, d,rmI, d")))
++ (clobber (reg:CC CC_REGNO))]
++ ""
++ "#"
++ "reload_completed"
++ [(parallel [(set (match_dup 3)
++ (xor:SI (match_dup 4)
++ (match_dup 5)))
++ (clobber (reg:CC CC_REGNO))])
++ (parallel [(set (match_dup 6)
++ (xor:SI (match_dup 7)
++ (match_dup 8)))
++ (clobber (reg:CC CC_REGNO))])]
++ "{
++ operands[3] = gen_lowpart (SImode, operands[0]);
++ operands[4] = gen_lowpart (SImode, operands[1]);
++ operands[5] = gen_lowpart (SImode, operands[2]);
++ operands[6] = gen_highpart (SImode, operands[0]);
++ operands[7] = gen_highpart (SImode, operands[1]);
++ operands[8] = gen_highpart_mode (SImode, DImode, operands[2]);
++ }"
++ [(set_attr "length" "8")])
++
++(define_insn "not2_2"
++ [(set (match_operand:HI 0 "memory_operand" "=m")
++ (subreg:HI
++ (not:SI (match_operand:SI 1 "ubicom32_arith_operand" "rmI"))
++ 2))
++ (clobber (reg:CC CC_REGNO))]
++ ""
++ "not.2\\t%0, %1")
++
++(define_insn "one_cmplsi2"
++ [(set (match_operand:SI 0 "nonimmediate_operand" "=rm")
++ (not:SI (match_operand:SI 1 "ubicom32_arith_operand" "rmI")))
++ (clobber (reg:CC CC_REGNO))]
++ ""
++ "not.4\\t%0, %1")
++
++(define_insn "one_cmplsi2_ccwzn"
++ [(set (reg CC_REGNO)
++ (compare
++ (not:SI (match_operand:SI 1 "ubicom32_arith_operand" "rmI"))
++ (const_int 0)))
++ (set (match_operand:SI 0 "nonimmediate_operand" "=rm")
++ (not:SI (match_dup 1)))]
++ "ubicom32_match_cc_mode(insn, CCWZNmode)"
++ "not.4\\t%0, %1")
++
++(define_insn "one_cmplsi2_ccwzn_null"
++ [(set (reg CC_REGNO)
++ (compare
++ (not:SI (match_operand:SI 0 "ubicom32_arith_operand" "rmI"))
++ (const_int 0)))]
++ "ubicom32_match_cc_mode(insn, CCWZNmode)"
++ "not.4\\t#0, %0")
++
++(define_insn_and_split "one_cmpldi2"
++ [(set (match_operand:DI 0 "nonimmediate_operand" "=&rm")
++ (not:DI (match_operand:DI 1 "nonimmediate_operand" "rmI0")))
++ (clobber (reg:CC CC_REGNO))]
++ ""
++ "#"
++ ""
++ [(parallel [(set (match_dup 2)
++ (not:SI (match_dup 3)))
++ (clobber (reg:CC CC_REGNO))])
++ (parallel [(set (match_dup 4)
++ (not:SI (match_dup 5)))
++ (clobber (reg:CC CC_REGNO))])]
++ "{
++ operands[2] = gen_lowpart (SImode, operands[0]);
++ operands[3] = gen_lowpart (SImode, operands[1]);
++ operands[4] = gen_highpart (SImode, operands[0]);
++ operands[5] = gen_highpart (SImode, operands[1]);
++ }"
++ [(set_attr "length" "8")])
++
++; Conditional jump instructions
++
++(define_expand "beq"
++ [(set (pc)
++ (if_then_else (eq (match_dup 1)
++ (const_int 0))
++ (label_ref (match_operand 0 "" ""))
++ (pc)))]
++ ""
++ "{
++ operands[1] = ubicom32_gen_compare_reg (EQ, ubicom32_compare_op0,
++ ubicom32_compare_op1);
++ }")
++
++(define_expand "bne"
++ [(set (pc)
++ (if_then_else (ne (match_dup 1)
++ (const_int 0))
++ (label_ref (match_operand 0 "" ""))
++ (pc)))]
++ ""
++ "{
++ operands[1] = ubicom32_gen_compare_reg (NE, ubicom32_compare_op0,
++ ubicom32_compare_op1);
++ }")
++
++(define_expand "bgt"
++ [(set (pc)
++ (if_then_else (gt (match_dup 1)
++ (const_int 0))
++ (label_ref (match_operand 0 "" ""))
++ (pc)))]
++ ""
++ "{
++ operands[1] = ubicom32_gen_compare_reg (GT, ubicom32_compare_op0,
++ ubicom32_compare_op1);
++ }")
++
++(define_expand "ble"
++ [(set (pc)
++ (if_then_else (le (match_dup 1)
++ (const_int 0))
++ (label_ref (match_operand 0 "" ""))
++ (pc)))]
++ ""
++ "{
++ operands[1] = ubicom32_gen_compare_reg (LE, ubicom32_compare_op0,
++ ubicom32_compare_op1);
++ }")
++
++(define_expand "bge"
++ [(set (pc)
++ (if_then_else (ge (match_dup 1)
++ (const_int 0))
++ (label_ref (match_operand 0 "" ""))
++ (pc)))]
++ ""
++ "{
++ operands[1] = ubicom32_gen_compare_reg (GE, ubicom32_compare_op0,
++ ubicom32_compare_op1);
++ }")
++
++(define_expand "blt"
++ [(set (pc)
++ (if_then_else (lt (match_dup 1)
++ (const_int 0))
++ (label_ref (match_operand 0 "" ""))
++ (pc)))]
++ ""
++ "{
++ operands[1] = ubicom32_gen_compare_reg (LT, ubicom32_compare_op0,
++ ubicom32_compare_op1);
++ }")
++
++(define_expand "bgtu"
++ [(set (pc)
++ (if_then_else (gtu (match_dup 1)
++ (const_int 0))
++ (label_ref (match_operand 0 "" ""))
++ (pc)))]
++ ""
++ "{
++ operands[1] = ubicom32_gen_compare_reg (GTU, ubicom32_compare_op0,
++ ubicom32_compare_op1);
++ }")
++
++(define_expand "bleu"
++ [(set (pc)
++ (if_then_else (leu (match_dup 1)
++ (const_int 0))
++ (label_ref (match_operand 0 "" ""))
++ (pc)))]
++ ""
++ "{
++ operands[1] = ubicom32_gen_compare_reg (LEU, ubicom32_compare_op0,
++ ubicom32_compare_op1);
++ }")
++
++(define_expand "bgeu"
++ [(set (pc)
++ (if_then_else (geu (match_dup 1)
++ (const_int 0))
++ (label_ref (match_operand 0 "" ""))
++ (pc)))]
++ ""
++ "{
++ operands[1] = ubicom32_gen_compare_reg (GEU, ubicom32_compare_op0,
++ ubicom32_compare_op1);
++ }")
++
++(define_expand "bltu"
++ [(set (pc)
++ (if_then_else (ltu (match_dup 1)
++ (const_int 0))
++ (label_ref (match_operand 0 "" ""))
++ (pc)))]
++ ""
++ "{
++ operands[1] = ubicom32_gen_compare_reg (LTU, ubicom32_compare_op0,
++ ubicom32_compare_op1);
++ }")
++
++(define_insn "jcc"
++ [(set (pc)
++ (if_then_else (match_operator 1 "comparison_operator"
++ [(match_operand 2 "ubicom32_cc_register_operand" "")
++ (const_int 0)])
++ (label_ref (match_operand 0 "" ""))
++ (pc)))]
++ ""
++ "*
++ {
++ ubicom32_output_cond_jump (insn, operands[1], operands[0]);
++ return \"\";
++ }")
++
++; Reverse branch - reverse our comparison condition so that we can
++; branch in the opposite sense.
++;
++(define_insn_and_split "jcc_reverse"
++ [(set (pc)
++ (if_then_else (match_operator 1 "comparison_operator"
++ [(match_operand 2 "ubicom32_cc_register_operand" "")
++ (const_int 0)])
++ (pc)
++ (label_ref (match_operand 0 "" ""))))]
++ ""
++ "#"
++ "reload_completed"
++ [(set (pc)
++ (if_then_else (match_dup 3)
++ (label_ref (match_dup 0))
++ (pc)))]
++ "{
++ rtx cc_reg;
++
++ cc_reg = gen_rtx_REG (GET_MODE (operands[2]), CC_REGNO);
++ operands[3] = gen_rtx_fmt_ee (reverse_condition (GET_CODE (operands[1])),
++ GET_MODE (operands[1]),
++ cc_reg,
++ const0_rtx);
++ }")
++
++(define_insn "jump"
++ [(set (pc)
++ (label_ref (match_operand 0 "" "")))]
++ ""
++ "jmpt\\t%l0")
++
++(define_expand "indirect_jump"
++ [(parallel [(set (pc)
++ (match_operand:SI 0 "register_operand" ""))
++ (clobber (match_dup 0))])]
++ ""
++ "")
++
++(define_insn "indirect_jump_internal"
++ [(set (pc)
++ (match_operand:SI 0 "register_operand" "a"))
++ (clobber (match_dup 0))]
++ ""
++ "calli\\t%0,0(%0)")
++
++; Program Space: The table contains instructions, typically jumps.
++; CALL An,TABLE_SIZE(PC) ;An = Jump Table Base Address.
++; <Jump Table is Here> ;An -> Here.
++; LEA Ak, (An,Dn) ;Ak -> Table Entry
++; JMP/CALL (Ak)
++
++(define_expand "tablejump"
++ [(parallel [(set (pc)
++ (match_operand:SI 0 "nonimmediate_operand" ""))
++ (use (label_ref (match_operand 1 "" "")))])]
++ ""
++ "")
++
++(define_insn "tablejump_internal"
++ [(set (pc)
++ (match_operand:SI 0 "nonimmediate_operand" "rm"))
++ (use (label_ref (match_operand 1 "" "")))]
++ ""
++ "ret\\t%0")
++
++; Call subroutine with no return value.
++;
++(define_expand "call"
++ [(call (match_operand:QI 0 "general_operand" "")
++ (match_operand:SI 1 "general_operand" ""))]
++ ""
++ "{
++ if (TARGET_FDPIC)
++ {
++ ubicom32_expand_call_fdpic (operands);
++ DONE;
++ }
++
++ if (! ubicom32_call_address_operand (XEXP (operands[0], 0), VOIDmode))
++ XEXP (operands[0], 0) = force_reg (SImode, XEXP (operands[0], 0));
++ }")
++
++; We expand to a simple form that doesn't clobber the link register and
++; then split to a form that does. This allows the RTL optimizers that
++; run before the splitter to have the opportunity to eliminate the call
++; without marking A5 as being clobbered and this in turn avoids saves
++; and returns in a number of cases.
++;
++(define_insn_and_split "call_1"
++ [(call (mem:QI (match_operand:SI 0 "ubicom32_call_address_operand" "a,S"))
++ (match_operand:SI 1 "general_operand" "g,g"))]
++ "! TARGET_FDPIC"
++ "#"
++ ""
++ [(parallel
++ [(call (mem:QI (match_dup 0))
++ (match_dup 1))
++ (clobber (reg:SI LINK_REGNO))])]
++ "")
++
++(define_insn "call_slow"
++ [(call (mem:QI (match_operand:SI 0 "ubicom32_call_address_operand" "a,S"))
++ (match_operand:SI 1 "general_operand" "g,g"))
++ (clobber (reg:SI LINK_REGNO))]
++ "(! TARGET_FDPIC && ! TARGET_FASTCALL)"
++ "@
++ calli\\ta5, 0(%0)
++ moveai\\ta5, #%%hi(%C0)\;calli\\ta5, %%lo(%C0)(a5)")
++
++(define_insn "call_fast"
++ [(call (mem:QI (match_operand:SI 0 "ubicom32_call_address_operand" "a,S"))
++ (match_operand:SI 1 "general_operand" "g,g"))
++ (clobber (reg:SI LINK_REGNO))]
++ "(! TARGET_FDPIC && TARGET_FASTCALL)"
++ "@
++ calli\\ta5, 0(%0)
++ call\\ta5, %C0")
++
++; We expand to a simple form that doesn't clobber the link register and
++; then split to a form that does. This allows the RTL optimizers that
++; run before the splitter to have the opportunity to eliminate the call
++; without marking A5 as being clobbered and this in turn avoids saves
++; and returns in a number of cases.
++;
++(define_insn_and_split "call_fdpic"
++ [(call (mem:QI (match_operand:SI 0 "ubicom32_call_address_operand" "a,S"))
++ (match_operand:SI 1 "general_operand" "g,g"))
++ (use (match_operand:SI 2 "ubicom32_fdpic_operand" "Z,Z"))]
++ "TARGET_FDPIC"
++ "#"
++ ""
++ [(parallel
++ [(call (mem:QI (match_dup 0))
++ (match_dup 1))
++ (use (match_dup 2))
++ (clobber (reg:SI LINK_REGNO))])]
++ "")
++
++(define_insn "call_fdpic_clobber"
++ [(call (mem:QI (match_operand:SI 0 "ubicom32_call_address_operand" "a,S"))
++ (match_operand:SI 1 "general_operand" "g,g"))
++ (use (match_operand:SI 2 "ubicom32_fdpic_operand" "Z,Z"))
++ (clobber (reg:SI LINK_REGNO))]
++ "TARGET_FDPIC"
++ "@
++ move.4\\ta5, 0(%0)\;move.4\\t%2, 4(%0)\;calli\\ta5, 0(a5)
++ call\\ta5, %C0")
++
++; Call subroutine, returning value in operand 0
++; (which must be a hard register).
++;
++(define_expand "call_value"
++ [(set (match_operand 0 "" "")
++ (call (match_operand:QI 1 "general_operand" "")
++ (match_operand:SI 2 "general_operand" "")))]
++ ""
++ "{
++ if (TARGET_FDPIC)
++ {
++ ubicom32_expand_call_value_fdpic (operands);
++ DONE;
++ }
++
++ if (! ubicom32_call_address_operand (XEXP (operands[1], 0), VOIDmode))
++ XEXP (operands[1], 0) = force_reg (SImode, XEXP (operands[1], 0));
++ }")
++
++; We expand to a simple form that doesn't clobber the link register and
++; then split to a form that does. This allows the RTL optimizers that
++; run before the splitter to have the opportunity to eliminate the call
++; without marking A5 as being clobbered and this in turn avoids saves
++; and returns in a number of cases.
++;
++(define_insn_and_split "call_value_1"
++ [(set (match_operand 0 "register_operand" "=r,r")
++ (call (mem:QI (match_operand:SI 1 "ubicom32_call_address_operand" "a,S"))
++ (match_operand:SI 2 "general_operand" "g,g")))]
++ "! TARGET_FDPIC"
++ "#"
++ ""
++ [(parallel
++ [(set (match_dup 0)
++ (call (mem:QI (match_dup 1))
++ (match_dup 2)))
++ (clobber (reg:SI LINK_REGNO))])]
++ "")
++
++(define_insn "call_value_slow"
++ [(set (match_operand 0 "register_operand" "=r,r")
++ (call (mem:QI (match_operand:SI 1 "ubicom32_call_address_operand" "a,S"))
++ (match_operand:SI 2 "general_operand" "g,g")))
++ (clobber (reg:SI LINK_REGNO))]
++ "(! TARGET_FDPIC && ! TARGET_FASTCALL)"
++ "@
++ calli\\ta5, 0(%1)
++ moveai\\ta5, #%%hi(%C1)\;calli\\ta5, %%lo(%C1)(a5)")
++
++(define_insn "call_value_fast"
++ [(set (match_operand 0 "register_operand" "=r,r")
++ (call (mem:QI (match_operand:SI 1 "ubicom32_call_address_operand" "a,S"))
++ (match_operand:SI 2 "general_operand" "g,g")))
++ (clobber (reg:SI LINK_REGNO))]
++ "(! TARGET_FDPIC && TARGET_FASTCALL)"
++ "@
++ calli\\ta5, 0(%1)
++ call\\ta5, %C1")
++
++; We expand to a simple form that doesn't clobber the link register and
++; then split to a form that does. This allows the RTL optimizers that
++; run before the splitter to have the opportunity to eliminate the call
++; without marking A5 as being clobbered and this in turn avoids saves
++; and returns in a number of cases.
++;
++(define_insn_and_split "call_value_fdpic"
++ [(set (match_operand 0 "register_operand" "=r,r")
++ (call (mem:QI (match_operand:SI 1 "ubicom32_call_address_operand" "a,S"))
++ (match_operand:SI 2 "general_operand" "g,g")))
++ (use (match_operand:SI 3 "ubicom32_fdpic_operand" "Z,Z"))]
++ "TARGET_FDPIC"
++ "#"
++ ""
++ [(parallel
++ [(set (match_dup 0)
++ (call (mem:QI (match_dup 1))
++ (match_dup 2)))
++ (use (match_dup 3))
++ (clobber (reg:SI LINK_REGNO))])]
++ "")
++
++(define_insn "call_value_fdpic_clobber"
++ [(set (match_operand 0 "register_operand" "=r,r")
++ (call (mem:QI (match_operand:SI 1 "ubicom32_call_address_operand" "a,S"))
++ (match_operand:SI 2 "general_operand" "g,g")))
++ (use (match_operand:SI 3 "ubicom32_fdpic_operand" "Z,Z"))
++ (clobber (reg:SI LINK_REGNO))]
++ "TARGET_FDPIC"
++ "@
++ move.4\\ta5, 0(%1)\;move.4\\t%3, 4(%1)\;calli\\ta5, 0(a5)
++ call\\ta5, %C1")
++
++(define_expand "untyped_call"
++ [(parallel [(call (match_operand 0 "" "")
++ (const_int 0))
++ (match_operand 1 "" "")
++ (match_operand 2 "" "")])]
++ ""
++ "{
++ int i;
++
++ emit_call_insn (gen_call (operands[0], const0_rtx));
++
++ for (i = 0; i < XVECLEN (operands[2], 0); i++)
++ {
++ rtx set = XVECEXP (operands[2], 0, i);
++ emit_move_insn (SET_DEST (set), SET_SRC (set));
++ }
++ DONE;
++ }")
++
++(define_insn "lsl1_1"
++ [(set (match_operand:SI 0 "ubicom32_data_register_operand" "=d")
++ (ashift:SI (subreg:SI
++ (match_operand:QI 1 "memory_operand" "m")
++ 0)
++ (match_operand:SI 2 "ubicom32_arith_operand" "dM")))
++ (clobber (reg:CC CC_REGNO))]
++ "(ubicom32_v4)"
++ "lsl.1\\t%0, %1, %2")
++
++; The combiner gets rather creative about left shifts of sub-word memory
++; operands because it's uncertain about whether the memory is sign or
++; zero extended. It only wants zero-extended behaviour and so throws
++; in an extra and operation.
++;
++(define_insn "lsl1_2"
++ [(set (match_operand:SI 0 "ubicom32_data_register_operand" "=d")
++ (and:SI
++ (ashift:SI (subreg:SI
++ (match_operand:QI 1 "memory_operand" "m")
++ 0)
++ (match_operand:SI 2 "const_int_operand" "M"))
++ (match_operand:SI 3 "const_int_operand" "n")))
++ (clobber (reg:CC CC_REGNO))]
++ "(ubicom32_v4
++ && INTVAL (operands[3]) == (0xff << INTVAL (operands[2])))"
++ "lsl.1\\t%0, %1, %2")
++
++(define_insn "lsl2_1"
++ [(set (match_operand:SI 0 "ubicom32_data_register_operand" "=d")
++ (ashift:SI (subreg:SI
++ (match_operand:HI 1 "memory_operand" "m")
++ 0)
++ (match_operand:SI 2 "ubicom32_arith_operand" "dM")))
++ (clobber (reg:CC CC_REGNO))]
++ "(ubicom32_v4)"
++ "lsl.2\\t%0, %1, %2")
++
++; The combiner gets rather creative about left shifts of sub-word memory
++; operands because it's uncertain about whether the memory is sign or
++; zero extended. It only wants zero-extended behaviour and so throws
++; in an extra and operation.
++;
++(define_insn "lsl2_2"
++ [(set (match_operand:SI 0 "ubicom32_data_register_operand" "=d")
++ (and:SI
++ (ashift:SI (subreg:SI
++ (match_operand:HI 1 "memory_operand" "m")
++ 0)
++ (match_operand:SI 2 "const_int_operand" "M"))
++ (match_operand:SI 3 "const_int_operand" "n")))
++ (clobber (reg:CC CC_REGNO))]
++ "(ubicom32_v4
++ && INTVAL (operands[3]) == (0xffff << INTVAL (operands[2])))"
++ "lsl.2\\t%0, %1, %2")
++
++(define_insn "ashlsi3"
++ [(set (match_operand:SI 0 "ubicom32_data_register_operand" "=d")
++ (ashift:SI (match_operand:SI 1 "ubicom32_arith_operand" "rmI")
++ (match_operand:SI 2 "ubicom32_arith_operand" "dM")))
++ (clobber (reg:CC CC_REGNO))]
++ ""
++ "lsl.4\\t%0, %1, %2")
++
++(define_insn "lshlsi3_ccwz"
++ [(set (reg CC_REGNO)
++ (compare
++ (ashift:SI (match_operand:SI 1 "ubicom32_arith_operand" "rmI")
++ (match_operand:SI 2 "ubicom32_arith_operand" "dM"))
++ (const_int 0)))
++ (set (match_operand:SI 0 "ubicom32_data_register_operand" "=d")
++ (ashift:SI (match_dup 1)
++ (match_dup 2)))]
++ "ubicom32_match_cc_mode(insn, CCWZmode)"
++ "lsl.4\\t%0, %1, %2")
++
++(define_insn "lshlsi3_ccwz_null"
++ [(set (reg CC_REGNO)
++ (compare
++ (ashift:SI (match_operand:SI 0 "ubicom32_arith_operand" "rmI")
++ (match_operand:SI 1 "ubicom32_arith_operand" "dM"))
++ (const_int 0)))
++ (clobber (match_scratch:SI 2 "=d"))]
++ "ubicom32_match_cc_mode(insn, CCWZmode)"
++ "lsl.4\\t%2, %0, %1")
++
++; The combiner finds this canonical form for what is in essence a right
++; shift.
++;
++(define_insn "asr1_2"
++ [(set (match_operand:SI 0 "ubicom32_data_register_operand" "=d")
++ (sign_extract:SI (match_operand:QI 1 "memory_operand" "m")
++ (match_operand:SI 2 "const_int_operand" "M")
++ (match_operand:SI 3 "const_int_operand" "M")))
++ (clobber (reg:CC CC_REGNO))]
++ "(ubicom32_v4
++ && (INTVAL (operands[2]) + INTVAL (operands[3]) == 8))"
++ "asr.1\\t%0, %1, %3")
++
++; The combiner finds this canonical form for what is in essence a right
++; shift.
++;
++(define_insn "asr2_2"
++ [(set (match_operand:SI 0 "ubicom32_data_register_operand" "=d")
++ (sign_extract:SI (match_operand:HI 1 "memory_operand" "m")
++ (match_operand:SI 2 "const_int_operand" "M")
++ (match_operand:SI 3 "const_int_operand" "M")))
++ (clobber (reg:CC CC_REGNO))]
++ "(ubicom32_v4
++ && (INTVAL (operands[2]) + INTVAL (operands[3]) == 16))"
++ "asr.2\\t%0, %1, %3")
++
++(define_insn "ashrsi3"
++ [(set (match_operand:SI 0 "ubicom32_data_register_operand" "=d")
++ (ashiftrt:SI (match_operand:SI 1 "ubicom32_arith_operand" "rmJ")
++ (match_operand:SI 2 "ubicom32_arith_operand" "dM")))
++ (clobber (reg:CC CC_REGNO))]
++ ""
++ "asr.4\\t%0, %1, %2")
++
++(define_insn "ashrsi3_ccwzn"
++ [(set (reg CC_REGNO)
++ (compare
++ (ashiftrt:SI (match_operand:SI 1 "ubicom32_arith_operand" "rmJ")
++ (match_operand:SI 2 "ubicom32_arith_operand" "dM"))
++ (const_int 0)))
++ (set (match_operand:SI 0 "ubicom32_data_register_operand" "=d")
++ (ashiftrt:SI (match_dup 1)
++ (match_dup 2)))]
++ "ubicom32_match_cc_mode(insn, CCWZNmode)"
++ "asr.4\\t%0, %1, %2")
++
++(define_insn "ashrsi3_ccwzn_null"
++ [(set (reg CC_REGNO)
++ (compare
++ (ashiftrt:SI (match_operand:SI 0 "ubicom32_arith_operand" "rmJ")
++ (match_operand:SI 1 "ubicom32_arith_operand" "dM"))
++ (const_int 0)))
++ (clobber (match_scratch:SI 2 "=d"))]
++ "ubicom32_match_cc_mode(insn, CCWZNmode)"
++ "asr.4\\t%2, %0, %1")
++
++(define_insn "lsr1_1"
++ [(set (match_operand:SI 0 "ubicom32_data_register_operand" "=d")
++ (lshiftrt:SI (subreg:SI
++ (match_operand:QI 1 "memory_operand" "m")
++ 0)
++ (match_operand:SI 2 "ubicom32_arith_operand" "dM")))
++ (clobber (reg:CC CC_REGNO))]
++ "(ubicom32_v4)"
++ "lsr.1\\t%0, %1, %2")
++
++; The combiner finds this canonical form for what is in essence a right
++; shift.
++;
++(define_insn "lsr1_2"
++ [(set (match_operand:SI 0 "ubicom32_data_register_operand" "=d")
++ (zero_extract:SI (match_operand:QI 1 "memory_operand" "m")
++ (match_operand:SI 2 "const_int_operand" "M")
++ (match_operand:SI 3 "const_int_operand" "M")))
++ (clobber (reg:CC CC_REGNO))]
++ "(ubicom32_v4
++ && (INTVAL (operands[2]) + INTVAL (operands[3]) == 8))"
++ "lsr.1\\t%0, %1, %3")
++
++(define_insn "lsr2_1"
++ [(set (match_operand:SI 0 "ubicom32_data_register_operand" "=d")
++ (lshiftrt:SI (subreg:SI
++ (match_operand:HI 1 "memory_operand" "m")
++ 0)
++ (match_operand:SI 2 "ubicom32_arith_operand" "dM")))
++ (clobber (reg:CC CC_REGNO))]
++ "(ubicom32_v4)"
++ "lsr.2\\t%0, %1, %2")
++
++; The combiner finds this canonical form for what is in essence a right
++; shift.
++;
++(define_insn "lsr2_2"
++ [(set (match_operand:SI 0 "ubicom32_data_register_operand" "=d")
++ (zero_extract:SI (match_operand:HI 1 "memory_operand" "m")
++ (match_operand:SI 2 "const_int_operand" "M")
++ (match_operand:SI 3 "const_int_operand" "M")))
++ (clobber (reg:CC CC_REGNO))]
++ "(ubicom32_v4
++ && (INTVAL (operands[2]) + INTVAL (operands[3]) == 16))"
++ "lsr.2\\t%0, %1, %3")
++
++(define_insn "lshrsi3"
++ [(set (match_operand:SI 0 "ubicom32_data_register_operand" "=d")
++ (lshiftrt:SI (match_operand:SI 1 "ubicom32_arith_operand" "rmI")
++ (match_operand:SI 2 "ubicom32_arith_operand" "dM")))
++ (clobber (reg:CC CC_REGNO))]
++ ""
++ "lsr.4\\t%0, %1, %2")
++
++(define_insn "lshrsi3_ccwz"
++ [(set (reg CC_REGNO)
++ (compare
++ (lshiftrt:SI (match_operand:SI 1 "ubicom32_arith_operand" "rmI")
++ (match_operand:SI 2 "ubicom32_arith_operand" "dM"))
++ (const_int 0)))
++ (set (match_operand:SI 0 "ubicom32_data_register_operand" "=d")
++ (lshiftrt:SI (match_dup 1)
++ (match_dup 2)))]
++ "ubicom32_match_cc_mode(insn, CCWZmode)"
++ "lsr.4\\t%0, %1, %2")
++
++(define_insn "lshrsi3_ccwz_null"
++ [(set (reg CC_REGNO)
++ (compare
++ (lshiftrt:SI (match_operand:SI 0 "ubicom32_arith_operand" "rmI")
++ (match_operand:SI 1 "ubicom32_arith_operand" "dM"))
++ (const_int 0)))
++ (clobber (match_scratch:SI 2 "=d"))]
++ "ubicom32_match_cc_mode(insn, CCWZmode)"
++ "lsr.4\\t%2, %0, %1")
++
++(define_expand "prologue"
++ [(const_int 0)]
++ ""
++ "{
++ ubicom32_expand_prologue ();
++ DONE;
++ }")
++
++(define_expand "epilogue"
++ [(return)]
++ ""
++ "{
++ ubicom32_expand_epilogue ();
++ DONE;
++ }")
++
++(define_expand "return"
++ [(return)]
++ ""
++ "{
++ ubicom32_expand_epilogue ();
++ DONE;
++ }")
++
++(define_expand "_eh_return"
++ [(use (match_operand:SI 0 "register_operand" "r"))
++ (use (match_operand:SI 1 "register_operand" "r"))]
++ ""
++ "{
++ ubicom32_expand_eh_return (operands);
++ DONE;
++ }")
++
++; XXX - it looks almost certain that we could make return_internal use a Dn
++; register too. In that instance we'd have to use a ret instruction
++; rather than a calli but it might save cycles.
++;
++(define_insn "return_internal"
++ [(const_int 2)
++ (return)
++ (use (match_operand:SI 0 "ubicom32_mem_or_address_register_operand" "rm"))]
++ ""
++ "*
++ {
++ if (REG_P (operands[0]) && REGNO (operands[0]) == LINK_REGNO
++ && ubicom32_can_use_calli_to_ret)
++ return \"calli\\t%0, 0(%0)\";
++
++ return \"ret\\t%0\";
++ }")
++
++(define_insn "return_from_post_modify_sp"
++ [(parallel
++ [(const_int 2)
++ (return)
++ (use (mem:SI (post_modify:SI
++ (reg:SI SP_REGNO)
++ (plus:SI (reg:SI SP_REGNO)
++ (match_operand:SI 0 "const_int_operand" "n")))))])]
++ "INTVAL (operands[0]) >= 4 && INTVAL (operands[0]) <= 7 * 4"
++ "ret\\t(sp)%E0++")
++
++;(define_insn "eh_return_internal"
++; [(const_int 4)
++; (return)
++; (use (reg:SI 34))]
++; ""
++; "ret\\ta2")
++
++; No operation, needed in case the user uses -g but not -O.
++(define_expand "nop"
++ [(const_int 0)]
++ ""
++ "")
++
++(define_insn "nop_internal"
++ [(const_int 0)]
++ ""
++ "nop")
++
++; The combiner will generate this pattern given shift and add operations.
++; The canonical form that the combiner wants to use appears to be multiplies
++; instead of shifts even if the compiled sources use shifts.
++;
++(define_insn "shmrg1_add"
++ [(set (match_operand:SI 0 "ubicom32_data_register_operand" "=d")
++ (plus:SI
++ (mult:SI (match_operand:SI 1 "ubicom32_data_register_operand" "d")
++ (const_int 256))
++ (zero_extend:SI
++ (match_operand:QI 2 "ubicom32_arith_operand" "rmI"))))
++ (clobber (reg:CC CC_REGNO))]
++ ""
++ "shmrg.1\\t%0, %2, %1")
++
++; The combiner will generate this pattern given shift and or operations.
++;
++(define_insn "shmrg1_ior"
++ [(set (match_operand:SI 0 "ubicom32_data_register_operand" "=d")
++ (ior:SI
++ (ashift:SI (match_operand:SI 1 "ubicom32_data_register_operand" "d")
++ (const_int 8))
++ (zero_extend:SI
++ (match_operand:QI 2 "ubicom32_arith_operand" "rmI"))))
++ (clobber (reg:CC CC_REGNO))]
++ ""
++ "shmrg.1\\t%0, %2, %1")
++
++; The combiner will generate this pattern given shift and add operations.
++; The canonical form that the combiner wants to use appears to be multiplies
++; instead of shifts even if the compiled sources use shifts.
++;
++(define_insn "shmrg2_add"
++ [(set (match_operand:SI 0 "ubicom32_data_register_operand" "=d")
++ (plus:SI
++ (mult:SI (match_operand:SI 1 "ubicom32_data_register_operand" "d")
++ (const_int 65536))
++ (zero_extend:SI
++ (match_operand:HI 2 "ubicom32_arith_operand" "rmI"))))
++ (clobber (reg:CC CC_REGNO))]
++ ""
++ "shmrg.2\\t%0, %2, %1")
++
++; The combiner will generate this pattern given shift and or operations.
++;
++(define_insn "shmrg2_ior"
++ [(set (match_operand:SI 0 "ubicom32_data_register_operand" "=d")
++ (ior:SI
++ (ashift:SI (match_operand:SI 1 "ubicom32_data_register_operand" "d")
++ (const_int 16))
++ (zero_extend:SI
++ (match_operand:HI 2 "ubicom32_arith_operand" "rmI"))))
++ (clobber (reg:CC CC_REGNO))]
++ ""
++ "shmrg.2\\t%0, %2, %1")
++
++; Match the case where we load a word from the stack but then discard the
++; upper 16 bits. We turn this into a zero-extended load of that useful
++; 16 bits direct from the stack where possible.
++;
++
++; XXX - do these peephole2 ops actually work after the CCmode conversion?
++(define_peephole2
++ [(set (match_operand:SI 0 "register_operand" "")
++ (mem:SI (plus:SI (reg:SI SP_REGNO)
++ (match_operand:SI 1 "const_int_operand" ""))))
++ (set (match_operand:SI 2 "nonimmediate_operand" "")
++ (zero_extend:SI (match_operand:HI 3 "register_operand" "")))]
++ "(INTVAL (operands[1]) <= 252
++ && REGNO (operands[3]) == REGNO (operands[0])
++ && ((peep2_reg_dead_p (2, operands[0])
++ && ! reg_mentioned_p (operands[0], operands[2]))
++ || rtx_equal_p (operands[0], operands[2])))"
++ [(set (match_dup 2)
++ (zero_extend:SI (mem:HI (plus:SI (reg:SI SP_REGNO)
++ (match_dup 4)))))]
++ "{
++ operands[4] = GEN_INT (INTVAL (operands[1]) + 2);
++ }")
++
++; Match the case where we load a word from the stack but then discard the
++; upper 16 bits. We turn this into a 16-bit load of that useful
++; 16 bits direct from the stack where possible.
++;
++(define_peephole2
++ [(set (match_operand:SI 0 "register_operand" "")
++ (mem:SI (plus:SI (reg:SI SP_REGNO)
++ (match_operand:SI 1 "const_int_operand" ""))))
++ (set (match_operand:HI 2 "nonimmediate_operand" "")
++ (match_operand:HI 3 "register_operand" ""))]
++ "(INTVAL (operands[1]) <= 252
++ && REGNO (operands[3]) == REGNO (operands[0])
++ && ((peep2_reg_dead_p (2, operands[0])
++ && ! reg_mentioned_p (operands[0], operands[2]))
++ || rtx_equal_p (operands[0], operands[2])))"
++ [(set (match_dup 2)
++ (mem:HI (plus:SI (reg:SI SP_REGNO)
++ (match_dup 4))))]
++ "{
++ operands[4] = GEN_INT (INTVAL (operands[1]) + 2);
++ }")
++
++; Match the case where we load a word from the stack but then discard the
++; upper 24 bits. We turn this into a zero-extended load of that useful
++; 8 bits direct from the stack where possible.
++;
++(define_peephole2
++ [(set (match_operand:SI 0 "register_operand" "")
++ (mem:SI (plus:SI (reg:SI SP_REGNO)
++ (match_operand:SI 1 "const_int_operand" ""))))
++ (set (match_operand:SI 2 "nonimmediate_operand" "")
++ (zero_extend:SI (match_operand:QI 3 "register_operand" "")))]
++ "(INTVAL (operands[1]) <= 124
++ && REGNO (operands[3]) == REGNO (operands[0])
++ && ((peep2_reg_dead_p (2, operands[0])
++ && ! reg_mentioned_p (operands[0], operands[2]))
++ || rtx_equal_p (operands[0], operands[2])))"
++ [(set (match_dup 2)
++ (zero_extend:SI (mem:QI (plus:SI (reg:SI SP_REGNO)
++ (match_dup 4)))))]
++ "{
++ operands[4] = GEN_INT (INTVAL (operands[1]) + 3);
++ }")
++
++; Match the case where we load a word from the stack but then discard the
++; upper 24 bits. We turn this into an 8-bit load of that useful
++; 8 bits direct from the stack where possible.
++;
++(define_peephole2
++ [(set (match_operand:SI 0 "register_operand" "")
++ (mem:SI (plus:SI (reg:SI SP_REGNO)
++ (match_operand:SI 1 "const_int_operand" ""))))
++ (set (match_operand:QI 2 "nonimmediate_operand" "")
++ (match_operand:QI 3 "register_operand" ""))]
++ "(INTVAL (operands[1]) <= 124
++ && REGNO (operands[3]) == REGNO (operands[0])
++ && ((peep2_reg_dead_p (2, operands[0])
++ && ! reg_mentioned_p (operands[0], operands[2]))
++ || rtx_equal_p (operands[0], operands[2])))"
++ [(set (match_dup 2)
++ (mem:QI (plus:SI (reg:SI SP_REGNO)
++ (match_dup 4))))]
++ "{
++ operands[4] = GEN_INT (INTVAL (operands[1]) + 3);
++ }")
++
+--- /dev/null
++++ b/gcc/config/ubicom32/ubicom32.opt
+@@ -0,0 +1,27 @@
++mdebug-address
++Target RejectNegative Report Undocumented Mask(DEBUG_ADDRESS)
++Debug addresses
++
++mdebug-context
++Target RejectNegative Report Undocumented Mask(DEBUG_CONTEXT)
++Debug contexts
++
++march=
++Target Report Var(ubicom32_arch_name) Init("ubicom32v4") Joined
++Specify the name of the target architecture
++
++mfdpic
++Target Report Mask(FDPIC)
++Enable Function Descriptor PIC mode
++
++minline-plt
++Target Report Mask(INLINE_PLT)
++Enable inlining of PLT in function calls
++
++mfastcall
++Target Report Mask(FASTCALL)
++Enable default fast (call) calling sequence for smaller applications
++
++mipos-abi
++Target Report Mask(IPOS_ABI)
++Enable the ipOS ABI in which D10-D13 are caller-clobbered
+--- /dev/null
++++ b/gcc/config/ubicom32/uclinux.h
+@@ -0,0 +1,67 @@
++/* Definitions of target machine for Ubicom32-uclinux
++
++ Copyright (C) 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008,
++ 2009 Free Software Foundation, Inc.
++ Contributed by Ubicom, Inc.
++
++ 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/>. */
++
++/* Don't assume anything about the header files. */
++#define NO_IMPLICIT_EXTERN_C
++
++#undef LIB_SPEC
++#define LIB_SPEC \
++ "%{pthread:-lpthread} " \
++ "%{!shared:%{!symbolic: -lc}} "
++
++
++#undef LINK_GCC_C_SEQUENCE_SPEC
++#define LINK_GCC_C_SEQUENCE_SPEC \
++ "%{!shared:--start-group} %G %L %{!shared:--end-group}%{shared:%G} "
++
++#undef STARTFILE_SPEC
++#define STARTFILE_SPEC \
++ "%{!shared: crt1%O%s}" \
++ " crti%O%s crtbegin%O%s"
++
++#undef ENDFILE_SPEC
++#define ENDFILE_SPEC "crtend%O%s crtn%O%s"
++
++/* This macro applies on top of OBJECT_FORMAT_ELF and indicates that
++ we want to support both flat and ELF output. */
++#define OBJECT_FORMAT_FLAT
++
++#undef DRIVER_SELF_SPECS
++#define DRIVER_SELF_SPECS \
++ "%{!mno-fastcall:-mfastcall}"
++
++/* taken from linux.h */
++/* The GNU C++ standard library requires that these macros be defined. */
++#undef CPLUSPLUS_CPP_SPEC
++#define CPLUSPLUS_CPP_SPEC "-D_GNU_SOURCE %(cpp)"
++
++#define TARGET_OS_CPP_BUILTINS() \
++ do { \
++ builtin_define_std ("__UBICOM32__"); \
++ builtin_define_std ("__ubicom32__"); \
++ builtin_define ("__gnu_linux__"); \
++ builtin_define_std ("linux"); \
++ builtin_define_std ("unix"); \
++ builtin_assert ("system=linux"); \
++ builtin_assert ("system=unix"); \
++ builtin_assert ("system=posix"); \
++ } while (0)
+--- /dev/null
++++ b/gcc/config/ubicom32/xm-ubicom32.h
+@@ -0,0 +1,36 @@
++/* Configuration for Ubicom's Ubicom32 architecture.
++ Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009 Free Software
++ Foundation, Inc.
++ Contributed by Ubicom Inc.
++
++This file is part of GNU CC.
++
++GNU CC 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 2, or (at your option)
++any later version.
++
++GNU CC 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 GNU CC; see the file COPYING. If not, write to
++the Free Software Foundation, 59 Temple Place - Suite 330,
++Boston, MA 02111-1307, USA. */
++
++/* #defines that need visibility everywhere. */
++#define FALSE 0
++#define TRUE 1
++
++/* This describes the machine the compiler is hosted on. */
++#define HOST_BITS_PER_CHAR 8
++#define HOST_BITS_PER_SHORT 16
++#define HOST_BITS_PER_INT 32
++#define HOST_BITS_PER_LONG 32
++#define HOST_BITS_PER_LONGLONG 64
++
++/* Arguments to use with `exit'. */
++#define SUCCESS_EXIT_CODE 0
++#define FATAL_EXIT_CODE 33
+--- a/gcc/config.gcc
++++ b/gcc/config.gcc
+@@ -2314,6 +2314,34 @@ spu-*-elf*)
+ c_target_objs="${c_target_objs} spu-c.o"
+ cxx_target_objs="${cxx_target_objs} spu-c.o"
+ ;;
++ubicom32-*-elf)
++ xm_file=ubicom32/xm-ubicom32.h
++ tm_file="${tm_file} ubicom32/elf.h" # still need dbxelf.h elfos.h
++ tmake_file=ubicom32/t-ubicom32
++ ;;
++ubicom32-*-uclinux*)
++ xm_file=ubicom32/xm-ubicom32.h
++ tm_file="${tm_file} ubicom32/elf.h ubicom32/uclinux.h" # still need dbxelf.h elfos.h linux.h
++ tm_defines="${tm_defines} UCLIBC_DEFAULT=1"
++ extra_options="${extra_options} linux.opt"
++ tmake_file=ubicom32/t-ubicom32-uclinux
++ use_collect2=no
++ ;;
++ubicom32-*-linux-uclibc)
++ xm_file=ubicom32/xm-ubicom32.h
++ tm_file="${tm_file} ubicom32/elf.h linux.h ubicom32/linux.h" # still need dbxelf.h elfos.h
++ tmake_file="t-slibgcc-elf-ver ubicom32/t-ubicom32-linux"
++ extra_parts="crtbegin.o crtbeginS.o crtend.o crtendS.o"
++ use_collect2=no
++ ;;
++ubicom32-*-linux*)
++ xm_file=ubicom32/xm-ubicom32.h
++ tm_file="${tm_file} ubicom32/elf.h linux.h ubicom32/linux.h" # still need dbxelf.h elfos.h
++ tmake_file="t-slibgcc-elf-ver ubicom32/t-ubicom32-linux"
++ tm_defines="${tm_defines} UCLIBC_DEFAULT=1"
++ extra_parts="crtbegin.o crtbeginS.o crtend.o crtendS.o"
++ use_collect2=no
++ ;;
+ v850e1-*-*)
+ target_cpu_default="TARGET_CPU_v850e1"
+ tm_file="dbxelf.h elfos.h svr4.h v850/v850.h"
+--- a/libgcc/config.host
++++ b/libgcc/config.host
+@@ -551,6 +551,15 @@ sparc64-*-netbsd*)
+ ;;
+ spu-*-elf*)
+ ;;
++ubicom32*-*-elf*)
++ ;;
++ubicom32*-*-uclinux*)
++ ;;
++ubicom32*-*-linux*)
++ # No need to build crtbeginT.o on uClibc systems. Should probably
++ # be moved to the OS specific section above.
++ extra_parts="crtbegin.o crtbeginS.o crtend.o crtendS.o"
++ ;;
+ v850e1-*-*)
+ ;;
+ v850e-*-*)
diff --git a/toolchain/gcc/patches/4.4.1+cs/810-arm-softfloat-libgcc.patch b/toolchain/gcc/patches/4.4.1+cs/810-arm-softfloat-libgcc.patch
new file mode 100644
index 0000000000..4ca297a41a
--- /dev/null
+++ b/toolchain/gcc/patches/4.4.1+cs/810-arm-softfloat-libgcc.patch
@@ -0,0 +1,25 @@
+--- a/gcc/config/arm/linux-elf.h
++++ b/gcc/config/arm/linux-elf.h
+@@ -60,7 +60,7 @@
+ %{shared:-lc} \
+ %{!shared:%{profile:-lc_p}%{!profile:-lc}}"
+
+-#define LIBGCC_SPEC "%{msoft-float:-lfloat} %{mfloat-abi=soft*:-lfloat} -lgcc"
++#define LIBGCC_SPEC "-lgcc"
+
+ #define GLIBC_DYNAMIC_LINKER "/lib/ld-linux.so.2"
+
+--- a/gcc/config/arm/t-linux
++++ b/gcc/config/arm/t-linux
+@@ -4,7 +4,10 @@
+
+ LIB1ASMSRC = arm/lib1funcs.asm
+ LIB1ASMFUNCS = _udivsi3 _divsi3 _umodsi3 _modsi3 _dvmd_lnx _clzsi2 _clzdi2 \
+- _arm_addsubdf3 _arm_addsubsf3
++ _arm_addsubdf3 _arm_addsubsf3 \
++ _negdf2 _addsubdf3 _muldivdf3 _cmpdf2 _unorddf2 _fixdfsi _fixunsdfsi \
++ _truncdfsf2 _negsf2 _addsubsf3 _muldivsf3 _cmpsf2 _unordsf2 \
++ _fixsfsi _fixunssfsi _floatdidf _floatundidf _floatdisf _floatundisf
+
+ # MULTILIB_OPTIONS = mhard-float/msoft-float
+ # MULTILIB_DIRNAMES = hard-float soft-float
diff --git a/toolchain/gcc/patches/4.4.1+cs/820-libgcc_pic.patch b/toolchain/gcc/patches/4.4.1+cs/820-libgcc_pic.patch
new file mode 100644
index 0000000000..18386dfd42
--- /dev/null
+++ b/toolchain/gcc/patches/4.4.1+cs/820-libgcc_pic.patch
@@ -0,0 +1,36 @@
+--- a/libgcc/Makefile.in
++++ b/libgcc/Makefile.in
+@@ -729,11 +729,12 @@ $(libgcov-objects): %$(objext): $(gcc_sr
+
+ # Static libraries.
+ libgcc.a: $(libgcc-objects)
++libgcc_pic.a: $(libgcc-s-objects)
+ libgcov.a: $(libgcov-objects)
+ libunwind.a: $(libunwind-objects)
+ libgcc_eh.a: $(libgcc-eh-objects)
+
+-libgcc.a libgcov.a libunwind.a libgcc_eh.a:
++libgcc.a libgcov.a libunwind.a libgcc_eh.a libgcc_pic.a:
+ -rm -f $@
+
+ objects="$(objects)"; \
+@@ -755,7 +756,7 @@ libgcc_s$(SHLIB_EXT): libunwind$(SHLIB_E
+ endif
+
+ ifeq ($(enable_shared),yes)
+-all: libgcc_eh.a libgcc_s$(SHLIB_EXT)
++all: libgcc_eh.a libgcc_pic.a libgcc_s$(SHLIB_EXT)
+ ifneq ($(LIBUNWIND),)
+ all: libunwind$(SHLIB_EXT)
+ endif
+@@ -928,6 +929,10 @@ install-shared:
+ chmod 644 $(DESTDIR)$(inst_libdir)/libgcc_eh.a
+ $(RANLIB) $(DESTDIR)$(inst_libdir)/libgcc_eh.a
+
++ $(INSTALL_DATA) libgcc_pic.a $(mapfile) $(DESTDIR)$(inst_libdir)/
++ chmod 644 $(DESTDIR)$(inst_libdir)/libgcc_pic.a
++ $(RANLIB) $(DESTDIR)$(inst_libdir)/libgcc_pic.a
++
+ $(subst @multilib_dir@,$(MULTIDIR),$(subst \
+ @shlib_base_name@,libgcc_s,$(subst \
+ @shlib_slibdir_qual@,$(MULTIOSSUBDIR),$(SHLIB_INSTALL))))
diff --git a/toolchain/gcc/patches/4.4.1+cs/910-mbsd_multi.patch b/toolchain/gcc/patches/4.4.1+cs/910-mbsd_multi.patch
new file mode 100644
index 0000000000..52cbf22c77
--- /dev/null
+++ b/toolchain/gcc/patches/4.4.1+cs/910-mbsd_multi.patch
@@ -0,0 +1,162 @@
+
+ This patch brings over a few features from MirBSD:
+ * -fhonour-copts
+ If this option is not given, it's warned (depending
+ on environment variables). This is to catch errors
+ of misbuilt packages which override CFLAGS themselves.
+ * Make -fno-strict-aliasing and -fno-delete-null-pointer-checks
+ the default for -O2/-Os, because they trigger gcc bugs
+ and can delete code with security implications.
+
+ This patch was authored by Thorsten Glaser <tg at mirbsd.de>
+ with copyright assignment to the FSF in effect.
+
+--- a/gcc/c-opts.c
++++ b/gcc/c-opts.c
+@@ -105,6 +105,9 @@
+ /* Number of deferred options scanned for -include. */
+ static size_t include_cursor;
+
++/* Check if a port honours COPTS. */
++static int honour_copts = 0;
++
+ static void set_Wimplicit (int);
+ static void handle_OPT_d (const char *);
+ static void set_std_cxx98 (int);
+@@ -690,6 +701,12 @@
+ flag_exceptions = value;
+ break;
+
++ case OPT_fhonour_copts:
++ if (c_language == clk_c) {
++ honour_copts++;
++ }
++ break;
++
+ case OPT_fimplement_inlines:
+ flag_implement_inlines = value;
+ break;
+@@ -1209,6 +1226,47 @@
+ return false;
+ }
+
++ if (c_language == clk_c) {
++ char *ev = getenv ("GCC_HONOUR_COPTS");
++ int evv;
++ if (ev == NULL)
++ evv = -1;
++ else if ((*ev == '0') || (*ev == '\0'))
++ evv = 0;
++ else if (*ev == '1')
++ evv = 1;
++ else if (*ev == '2')
++ evv = 2;
++ else if (*ev == 's')
++ evv = -1;
++ else {
++ warning (0, "unknown GCC_HONOUR_COPTS value, assuming 1");
++ evv = 1; /* maybe depend this on something like MIRBSD_NATIVE? */
++ }
++ if (evv == 1) {
++ if (honour_copts == 0) {
++ error ("someone does not honour COPTS at all in lenient mode");
++ return false;
++ } else if (honour_copts != 1) {
++ warning (0, "someone does not honour COPTS correctly, passed %d times",
++ honour_copts);
++ }
++ } else if (evv == 2) {
++ if (honour_copts == 0) {
++ error ("someone does not honour COPTS at all in strict mode");
++ return false;
++ } else if (honour_copts != 1) {
++ error ("someone does not honour COPTS correctly, passed %d times",
++ honour_copts);
++ return false;
++ }
++ } else if (evv == 0) {
++ if (honour_copts != 1)
++ inform (0, "someone does not honour COPTS correctly, passed %d times",
++ honour_copts);
++ }
++ }
++
+ return true;
+ }
+
+--- a/gcc/c.opt
++++ b/gcc/c.opt
+@@ -609,6 +613,9 @@
+ fhonor-std
+ C++ ObjC++
+
++fhonour-copts
++C ObjC C++ ObjC++ RejectNegative
++
+ fhosted
+ C ObjC
+ Assume normal C execution environment
+--- a/gcc/common.opt
++++ b/gcc/common.opt
+@@ -573,6 +577,9 @@
+ Common Report Var(flag_guess_branch_prob) Optimization
+ Enable guessing of branch probabilities
+
++fhonour-copts
++Common RejectNegative
++
+ ; Nonzero means ignore `#ident' directives. 0 means handle them.
+ ; Generate position-independent code for executables if possible
+ ; On SVR4 targets, it also controls whether or not to emit a
+--- a/gcc/opts.c
++++ b/gcc/opts.c
+@@ -896,9 +896,6 @@
+ flag_schedule_insns_after_reload = opt2;
+ #endif
+ flag_regmove = opt2;
+- flag_strict_aliasing = opt2;
+- flag_strict_overflow = opt2;
+- flag_delete_null_pointer_checks = opt2;
+ flag_reorder_blocks = opt2;
+ flag_reorder_functions = opt2;
+ flag_tree_vrp = opt2;
+@@ -922,6 +919,9 @@
+
+ /* -O3 optimizations. */
+ opt3 = (optimize >= 3);
++ flag_strict_aliasing = opt3;
++ flag_strict_overflow = opt3;
++ flag_delete_null_pointer_checks = opt3;
+ flag_predictive_commoning = opt3;
+ flag_inline_functions = opt3;
+ flag_unswitch_loops = opt3;
+--- a/gcc/doc/invoke.texi
++++ b/gcc/doc/invoke.texi
+@@ -5699,7 +5715,7 @@
+ second branch or a point immediately following it, depending on whether
+ the condition is known to be true or false.
+
+-Enabled at levels @option{-O2}, @option{-O3}, @option{-Os}.
++Enabled at levels @option{-O3}.
+
+ @item -fsplit-wide-types
+ @opindex fsplit-wide-types
+@@ -5844,7 +5860,7 @@
+ @option{-fno-delete-null-pointer-checks} to disable this optimization
+ for programs which depend on that behavior.
+
+-Enabled at levels @option{-O2}, @option{-O3}, @option{-Os}.
++Enabled at levels @option{-O3}.
+
+ @item -fexpensive-optimizations
+ @opindex fexpensive-optimizations
+--- a/gcc/java/jvspec.c
++++ b/gcc/java/jvspec.c
+@@ -670,6 +670,7 @@
+ class name. Append dummy `.c' that can be stripped by set_input so %b
+ is correct. */
+ set_input (concat (main_class_name, "main.c", NULL));
++ putenv ("GCC_HONOUR_COPTS=s"); /* XXX hack! */
+ err = do_spec (jvgenmain_spec);
+ if (err == 0)
+ {
diff --git a/toolchain/gcc/patches/4.4.1+cs/993-arm_insn-opinit-RTX_CODE-fixup.patch b/toolchain/gcc/patches/4.4.1+cs/993-arm_insn-opinit-RTX_CODE-fixup.patch
new file mode 100644
index 0000000000..4c4be9f2a0
--- /dev/null
+++ b/toolchain/gcc/patches/4.4.1+cs/993-arm_insn-opinit-RTX_CODE-fixup.patch
@@ -0,0 +1,14 @@
+--- gcc-4.4.0/gcc/config/arm/arm-protos.h 2009-02-20 16:20:38.000000000 +0100
++++ gcc-4.4.0.new/gcc/config/arm/arm-protos.h 2009-04-22 16:00:58.000000000 +0200
+@@ -43,10 +43,10 @@
+ extern void arm_output_fn_unwind (FILE *, bool);
+
+
+-#ifdef RTX_CODE
+ extern bool arm_vector_mode_supported_p (enum machine_mode);
+ extern int arm_hard_regno_mode_ok (unsigned int, enum machine_mode);
+ extern int const_ok_for_arm (HOST_WIDE_INT);
++#ifdef RTX_CODE
+ extern int arm_split_constant (RTX_CODE, enum machine_mode, rtx,
+ HOST_WIDE_INT, rtx, rtx, int);
+ extern RTX_CODE arm_canonicalize_comparison (RTX_CODE, enum machine_mode,
diff --git a/toolchain/gcc/patches/4.4.1+cs/999-coldfire.patch b/toolchain/gcc/patches/4.4.1+cs/999-coldfire.patch
new file mode 100644
index 0000000000..e4a2bd1f54
--- /dev/null
+++ b/toolchain/gcc/patches/4.4.1+cs/999-coldfire.patch
@@ -0,0 +1,12 @@
+Index: gcc-4.4.1/gcc/config.gcc
+===================================================================
+--- gcc-4.4.1.orig/gcc/config.gcc 2009-10-21 16:14:24.000000000 +0200
++++ gcc-4.4.1/gcc/config.gcc 2009-10-21 16:14:25.000000000 +0200
+@@ -1499,6 +1499,7 @@
+ if test x$sjlj != x1; then
+ tmake_file="$tmake_file m68k/t-slibgcc-elf-ver"
+ fi
++ tmake_file="m68k/t-floatlib m68k/t-m68kbare m68k/t-m68kelf"
+ ;;
+ m68k-*-rtems*)
+ default_m68k_cpu=68020