From a056826cc78bd6a55881c2e306eaa0d09a9a030c Mon Sep 17 00:00:00 2001 From: jsm28 Date: Sat, 9 Nov 2013 16:32:34 +0000 Subject: [PATCH] * 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. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@204618 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/c-family/ChangeLog | 8 ++++++++ gcc/c-family/c-common.c | 29 +++++++++++++++++++++++++---- 2 files changed, 33 insertions(+), 4 deletions(-) diff --git a/gcc/c-family/ChangeLog b/gcc/c-family/ChangeLog index 4ff4310e8b6..6b2a5ab811b 100644 --- a/gcc/c-family/ChangeLog +++ b/gcc/c-family/ChangeLog @@ -1,3 +1,11 @@ +2013-11-09 Joseph Myers + + * 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 Joseph Myers diff --git a/gcc/c-family/c-common.c b/gcc/c-family/c-common.c index e237926c573..93481b93027 100644 --- a/gcc/c-family/c-common.c +++ b/gcc/c-family/c-common.c @@ -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; -- 2.11.4.GIT