Index: lib/target-supports.exp
===================================================================
--- lib/target-supports.exp	(revision 181721)
+++ lib/target-supports.exp	(working copy)
@@ -3620,17 +3620,80 @@
     }
 }
 
+# Return 1 if the target supports atomic operations on "int_128" values
+# and can execute them.
+
+proc check_effective_target_sync_int_128_runtime { } {
+    if { ([istarget x86_64-*-*] || [istarget i?86-*-*])
+	 && ![is-effective-target ia32] } {
+	return [check_cached_effective_target sync_int_128_available {
+	    check_runtime_nocache sync_int_128_available {
+		#include "cpuid.h"
+		int main ()
+		{
+		  unsigned int eax, ebx, ecx, edx;
+		  if (__get_cpuid (1, &eax, &ebx, &ecx, &edx))
+		    return !(ecx & bit_CMPXCHG16B);
+		  return 1;
+		}
+	    } ""
+	}]
+    } else {
+	return 0
+    }
+}
+
 # Return 1 if the target supports atomic operations on "long long".
 
 proc check_effective_target_sync_long_long { } {
     if { ([istarget x86_64-*-*] || [istarget i?86-*-*])
-	 && ![is-effective-target ia32] } {
+	 && ![is-effective-target ia32]
+	 || [istarget arm*-*-*] } {
 	return 1
     } else {
 	return 0
     }
 }
 
+# Return 1 if the target supports atomic operations on "long long"
+# and can execute them.
+
+proc check_effective_target_sync_long_long_runtime { } {
+    if { ([istarget x86_64-*-*] || [istarget i?86-*-*])
+	 && ![is-effective-target ia32] } {
+	return [check_cached_effective_target sync_long_long_available {
+	    check_runtime_nocache sync_long_long_available {
+		#include "cpuid.h"
+		int main ()
+		{
+		  unsigned int eax, ebx, ecx, edx;
+		  if (__get_cpuid (1, &eax, &ebx, &ecx, &edx))
+		    return !(edx & bit_CMPXCHG8B);
+		  return 1;
+		}
+	    } ""
+	}]
+    } elseif { [istarget arm*-*-linux-gnueabi] } {
+	return [check_runtime sync_longlong_runtime {
+	    #include <stdlib.h>
+	    int main ()
+	    {
+	      long long l1;
+
+	      if (sizeof (long long) != 8)
+		exit (1);
+
+	      /* Just check for native; checking for kernel fallback is tricky.  */
+	      asm volatile ("ldrexd r0,r1, [%0]" : : "r" (&l1) : "r0", "r1");
+
+	      exit (0);
+	    }
+	} "" ]
+    } else {
+	return 0
+    }
+}
+
 # Return 1 if the target supports atomic operations on "int" and "long".
 
 proc check_effective_target_sync_int_long { } {
@@ -3662,31 +3725,6 @@
     return $et_sync_int_long_saved
 }
 
-# Return 1 if the target supports atomic operations on "long long" and can
-# execute them
-# So far only put checks in for ARM, others may want to add their own
-proc check_effective_target_sync_longlong { } {
-    return [check_runtime sync_longlong_runtime {
-      #include <stdlib.h>
-      int main ()
-      {
-	long long l1;
-
-	if (sizeof (long long) != 8)
-	  exit (1);
-
-      #ifdef __arm__
-	/* Just check for native; checking for kernel fallback is tricky.  */
-	asm volatile ("ldrexd r0,r1, [%0]" : : "r" (&l1) : "r0", "r1");
-      #else
-      # error "Add other suitable archs here"
-      #endif
-
-	exit (0);
-      }
-    } "" ]
-}
-
 # Return 1 if the target supports atomic operations on "char" and "short".
 
 proc check_effective_target_sync_char_short { } {
Index: gcc.dg/atomic-exchange-5.c
===================================================================
--- gcc.dg/atomic-exchange-5.c	(revision 181721)
+++ gcc.dg/atomic-exchange-5.c	(working copy)
@@ -1,7 +1,7 @@
 /* Test __atomic routines for existence and proper execution on 16 byte 
    values with each valid memory model.  */
 /* { dg-do run } */
-/* { dg-require-effective-target sync_int_128 } */
+/* { dg-require-effective-target sync_int_128_runtime } */
 /* { dg-options "-mcx16" { target { i?86-*-* x86_64-*-* } } } */
 
 /* Test the execution of the __atomic_X builtin for a 16 byte value.  */
Index: gcc.dg/atomic-op-5.c
===================================================================
--- gcc.dg/atomic-op-5.c	(revision 181721)
+++ gcc.dg/atomic-op-5.c	(working copy)
@@ -1,7 +1,7 @@
 /* Test __atomic routines for existence and proper execution on 16 byte 
    values with each valid memory model.  */
 /* { dg-do run } */
-/* { dg-require-effective-target sync_int_128 } */
+/* { dg-require-effective-target sync_int_128_runtime } */
 /* { dg-options "-mcx16" { target { i?86-*-* x86_64-*-* } } } */
 
 /* Test the execution of the __atomic_*OP builtin routines for an int_128.  */
Index: gcc.dg/atomic-compare-exchange-4.c
===================================================================
--- gcc.dg/atomic-compare-exchange-4.c	(revision 181721)
+++ gcc.dg/atomic-compare-exchange-4.c	(working copy)
@@ -1,7 +1,7 @@
 /* Test __atomic routines for existence and proper execution on 8 byte 
    values with each valid memory model.  */
 /* { dg-do run } */
-/* { dg-require-effective-target sync_long_long } */
+/* { dg-require-effective-target sync_long_long_runtime } */
 /* { dg-options "" } */
 
 /* Test the execution of __atomic_compare_exchange_n builtin for a long_long.  */
Index: gcc.dg/di-longlong64-sync-1.c
===================================================================
--- gcc.dg/di-longlong64-sync-1.c	(revision 181721)
+++ gcc.dg/di-longlong64-sync-1.c	(working copy)
@@ -1,5 +1,5 @@
 /* { dg-do run } */
-/* { dg-require-effective-target sync_longlong } */
+/* { dg-require-effective-target sync_long_long_runtime } */
 /* { dg-options "-std=gnu99" } */
 /* { dg-message "note: '__sync_fetch_and_nand' changed semantics in GCC 4.4" "" { target *-*-* } 0 } */
 /* { dg-message "note: '__sync_nand_and_fetch' changed semantics in GCC 4.4" "" { target *-*-* } 0 } */
Index: gcc.dg/atomic-load-4.c
===================================================================
--- gcc.dg/atomic-load-4.c	(revision 181721)
+++ gcc.dg/atomic-load-4.c	(working copy)
@@ -1,7 +1,7 @@
 /* Test __atomic routines for existence and proper execution on 8 byte 
    values with each valid memory model.  */
 /* { dg-do run } */
-/* { dg-require-effective-target sync_long_long } */
+/* { dg-require-effective-target sync_long_long_runtime } */
 /* { dg-options "" } */
 
 extern void abort(void);
Index: gcc.dg/simulate-thread/atomic-load-longlong.c
===================================================================
--- gcc.dg/simulate-thread/atomic-load-longlong.c	(revision 181721)
+++ gcc.dg/simulate-thread/atomic-load-longlong.c	(working copy)
@@ -1,5 +1,5 @@
 /* { dg-do link } */
-/* { dg-require-effective-target sync_long_long } */
+/* { dg-require-effective-target sync_long_long_runtime } */
 /* { dg-options "" } */
 /* { dg-final { simulate-thread } } */
 
Index: gcc.dg/simulate-thread/atomic-other-longlong.c
===================================================================
--- gcc.dg/simulate-thread/atomic-other-longlong.c	(revision 181721)
+++ gcc.dg/simulate-thread/atomic-other-longlong.c	(working copy)
@@ -1,5 +1,5 @@
 /* { dg-do link } */
-/* { dg-require-effective-target sync_long_long } */
+/* { dg-require-effective-target sync_long_long_runtime } */
 /* { dg-options "" } */
 /* { dg-final { simulate-thread } } */
 
Index: gcc.dg/simulate-thread/atomic-load-int128.c
===================================================================
--- gcc.dg/simulate-thread/atomic-load-int128.c	(revision 181721)
+++ gcc.dg/simulate-thread/atomic-load-int128.c	(working copy)
@@ -1,5 +1,5 @@
 /* { dg-do link } */
-/* { dg-require-effective-target sync_int_128 } */
+/* { dg-require-effective-target sync_int_128_runtime } */
 /* { dg-options "-mcx16" { target { x86_64-*-* i?86-*-* } } } */
 /* { dg-final { simulate-thread } } */
 
Index: gcc.dg/simulate-thread/atomic-other-int128.c
===================================================================
--- gcc.dg/simulate-thread/atomic-other-int128.c	(revision 181721)
+++ gcc.dg/simulate-thread/atomic-other-int128.c	(working copy)
@@ -1,5 +1,5 @@
 /* { dg-do link } */
-/* { dg-require-effective-target sync_int_128 } */
+/* { dg-require-effective-target sync_int_128_runtime } */
 /* { dg-options "-mcx16" { target { x86_64-*-* i?86-*-* } } } */
 /* { dg-final { simulate-thread } } */
 
Index: gcc.dg/atomic-store-4.c
===================================================================
--- gcc.dg/atomic-store-4.c	(revision 181721)
+++ gcc.dg/atomic-store-4.c	(working copy)
@@ -1,7 +1,7 @@
 /* Test __atomic routines for existence and proper execution on 8 byte 
    values with each valid memory model.  */
 /* { dg-do run } */
-/* { dg-require-effective-target sync_long_long } */
+/* { dg-require-effective-target sync_long_long_runtime } */
 /* { dg-options "" } */
 
 /* Test the execution of the __atomic_store_n builtin for a long long.  */
Index: gcc.dg/atomic-compare-exchange-5.c
===================================================================
--- gcc.dg/atomic-compare-exchange-5.c	(revision 181721)
+++ gcc.dg/atomic-compare-exchange-5.c	(working copy)
@@ -1,7 +1,7 @@
 /* Test __atomic routines for existence and proper execution on 16 byte 
    values with each valid memory model.  */
 /* { dg-do run } */
-/* { dg-require-effective-target sync_int_128 } */
+/* { dg-require-effective-target sync_int_128_runtime } */
 /* { dg-options "-mcx16" { target { i?86-*-* x86_64-*-* } } } */
 
 /* Test the execution of __atomic_compare_exchange_n builtin for an int_128.  */
Index: gcc.dg/atomic-load-5.c
===================================================================
--- gcc.dg/atomic-load-5.c	(revision 181721)
+++ gcc.dg/atomic-load-5.c	(working copy)
@@ -1,7 +1,7 @@
 /* Test __atomic routines for existence and proper execution on 16 byte 
    values with each valid memory model.  */
 /* { dg-do run } */
-/* { dg-require-effective-target sync_int_128 } */
+/* { dg-require-effective-target sync_int_128_runtime } */
 /* { dg-options "-mcx16" { target { i?86-*-* x86_64-*-* } } } */
 
 extern void abort(void);
Index: gcc.dg/atomic-exchange-4.c
===================================================================
--- gcc.dg/atomic-exchange-4.c	(revision 181721)
+++ gcc.dg/atomic-exchange-4.c	(working copy)
@@ -1,7 +1,7 @@
 /* Test __atomic routines for existence and proper execution on 8 byte 
    values with each valid memory model.  */
 /* { dg-do run } */
-/* { dg-require-effective-target sync_long_long } */
+/* { dg-require-effective-target sync_long_long_runtime } */
 /* { dg-options "" } */
 
 /* Test the execution of the __atomic_X builtin for a long_long.  */
Index: gcc.dg/atomic-op-4.c
===================================================================
--- gcc.dg/atomic-op-4.c	(revision 181721)
+++ gcc.dg/atomic-op-4.c	(working copy)
@@ -1,7 +1,7 @@
 /* Test __atomic routines for existence and proper execution on 8 byte 
    values with each valid memory model.  */
 /* { dg-do run } */
-/* { dg-require-effective-target sync_long_long } */
+/* { dg-require-effective-target sync_long_long_runtime } */
 /* { dg-options "" } */
 
 /* Test the execution of the __atomic_*OP builtin routines for long long.  */
Index: gcc.dg/atomic-store-5.c
===================================================================
--- gcc.dg/atomic-store-5.c	(revision 181721)
+++ gcc.dg/atomic-store-5.c	(working copy)
@@ -1,7 +1,7 @@
 /* Test __atomic routines for existence and proper execution on 16 byte 
    values with each valid memory model.  */
 /* { dg-do run } */
-/* { dg-require-effective-target sync_int_128 } */
+/* { dg-require-effective-target sync_int_128_runtime } */
 /* { dg-options "-mcx16" { target { i?86-*-* x86_64-*-* } } } */
 
 /* Test the execution of the __atomic_store_n builtin for a 16 byte value.  */
Index: gcc.dg/di-sync-multithread.c
===================================================================
--- gcc.dg/di-sync-multithread.c	(revision 181721)
+++ gcc.dg/di-sync-multithread.c	(working copy)
@@ -1,5 +1,5 @@
 /* { dg-do run } */
-/* { dg-require-effective-target sync_longlong } */
+/* { dg-require-effective-target sync_long_long_runtime } */
 /* { dg-require-effective-target pthread_h } */
 /* { dg-require-effective-target pthread } */
 /* { dg-options "-pthread -std=gnu99" } */
