c-common.c (atomic_size_supported_p): New function.

* 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.

From-SVN: r204618
This commit is contained in:
Joseph Myers 2013-11-09 16:32:34 +00:00 committed by Joseph Myers
parent 86dedeba36
commit 6b28e19721
2 changed files with 33 additions and 4 deletions

View File

@ -1,3 +1,11 @@
2013-11-09 Joseph Myers <joseph@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.
2013-11-07 Andrew MacLeod <amacleod@redhat.com>
Joseph Myers <joseph@codesourcery.com>

View File

@ -10403,6 +10403,27 @@ add_atomic_size_parameter (unsigned n, location_t loc, tree function,
}
/* 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, tree function,
}
/* 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 (location_t loc, tree function,
}
/* 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, tree function,
}
/* 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, tree function,
}
/* 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;