I hope this patch will fix the issues people have seen with atomics
tests failing on 32-bit architectures with missing __atomic_*_16 (or
at least replace them by different problems).  I'm running tests on
x86_64-unknown-linux-gnu; perhaps someone seeing the 32-bit problems
could test it there?

2013-11-08  Joseph Myers  <jos...@codesourcery.com>

        * c-common.c (atomic_size_supported_p): New function.
        (resolve_overloaded_atomic_exchange)
        (resolve_overloaded_atomic_compare_exchange)
        (resolve_overloaded_atomic_load, resolve_overloaded_atomic_store):
        Use it instead of comparing size with a local list of sizes.

Index: c-family/c-common.c
===================================================================
--- c-family/c-common.c (revision 204602)
+++ c-family/c-common.c (working copy)
@@ -10403,6 +10403,27 @@ add_atomic_size_parameter (unsigned n, location_t
 }
 
 
+/* Return whether atomic operations for naturally aligned N-byte
+   arguments are supported, whether inline or through libatomic.  */
+static bool
+atomic_size_supported_p (int n)
+{
+  switch (n)
+    {
+    case 1:
+    case 2:
+    case 4:
+    case 8:
+      return true;
+
+    case 16:
+      return targetm.scalar_mode_supported_p (TImode);
+
+    default:
+      return false;
+    }
+}
+
 /* This will process an __atomic_exchange function call, determine whether it
    needs to be mapped to the _N variation, or turned into a library call.
    LOC is the location of the builtin call.
@@ -10428,7 +10449,7 @@ resolve_overloaded_atomic_exchange (location_t loc
     }
 
   /* If not a lock-free size, change to the library generic format.  */
-  if (n != 1 && n != 2 && n != 4 && n != 8 && n != 16)
+  if (!atomic_size_supported_p (n))
     {
       *new_return = add_atomic_size_parameter (n, loc, function, params);
       return true;
@@ -10493,7 +10514,7 @@ resolve_overloaded_atomic_compare_exchange (locati
     }
 
   /* If not a lock-free size, change to the library generic format.  */
-  if (n != 1 && n != 2 && n != 4 && n != 8 && n != 16)
+  if (!atomic_size_supported_p (n))
     {
       /* The library generic format does not have the weak parameter, so 
         remove it from the param list.  Since a parameter has been removed,
@@ -10569,7 +10590,7 @@ resolve_overloaded_atomic_load (location_t loc, tr
     }
 
   /* If not a lock-free size, change to the library generic format.  */
-  if (n != 1 && n != 2 && n != 4 && n != 8 && n != 16)
+  if (!atomic_size_supported_p (n))
     {
       *new_return = add_atomic_size_parameter (n, loc, function, params);
       return true;
@@ -10629,7 +10650,7 @@ resolve_overloaded_atomic_store (location_t loc, t
     }
 
   /* If not a lock-free size, change to the library generic format.  */
-  if (n != 1 && n != 2 && n != 4 && n != 8 && n != 16)
+  if (!atomic_size_supported_p (n))
     {
       *new_return = add_atomic_size_parameter (n, loc, function, params);
       return true;

-- 
Joseph S. Myers
jos...@codesourcery.com

Reply via email to