* gcc-interface/trans.c (Subprogram_Body_to_gnu): Initialize locus.
[official-gcc.git] / libatomic / config / x86 / host-config.h
blob2e9f85aee5f9fe69a298a7efa17389b5120226a2
1 /* Copyright (C) 2012-2017 Free Software Foundation, Inc.
2 Contributed by Richard Henderson <rth@redhat.com>.
4 This file is part of the GNU Atomic Library (libatomic).
6 Libatomic is free software; you can redistribute it and/or modify it
7 under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 3 of the License, or
9 (at your option) any later version.
11 Libatomic is distributed in the hope that it will be useful, but WITHOUT ANY
12 WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
13 FOR A PARTICULAR PURPOSE. See the GNU General Public License for
14 more details.
16 Under Section 7 of GPL version 3, you are granted additional
17 permissions described in the GCC Runtime Library Exception, version
18 3.1, as published by the Free Software Foundation.
20 You should have received a copy of the GNU General Public License and
21 a copy of the GCC Runtime Library Exception along with this program;
22 see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
23 <http://www.gnu.org/licenses/>. */
25 #if HAVE_IFUNC
26 #include <cpuid.h>
28 extern unsigned int libat_feat1_ecx HIDDEN;
29 extern unsigned int libat_feat1_edx HIDDEN;
31 #ifdef __x86_64__
32 # define IFUNC_COND_1 (libat_feat1_ecx & bit_CMPXCHG16B)
33 #else
34 # define IFUNC_COND_1 (libat_feat1_edx & bit_CMPXCHG8B)
35 #endif
37 #ifdef __x86_64__
38 # define IFUNC_NCOND(N) (N == 16)
39 #else
40 # define IFUNC_NCOND(N) (N == 8)
41 #endif
43 #ifdef __x86_64__
44 # undef MAYBE_HAVE_ATOMIC_CAS_16
45 # define MAYBE_HAVE_ATOMIC_CAS_16 IFUNC_COND_1
46 # undef MAYBE_HAVE_ATOMIC_EXCHANGE_16
47 # define MAYBE_HAVE_ATOMIC_EXCHANGE_16 IFUNC_COND_1
48 # undef MAYBE_HAVE_ATOMIC_LDST_16
49 # define MAYBE_HAVE_ATOMIC_LDST_16 IFUNC_COND_1
50 /* Since load and store are implemented with CAS, they are not fast. */
51 # undef FAST_ATOMIC_LDST_16
52 # define FAST_ATOMIC_LDST_16 0
53 # if IFUNC_ALT == 1
54 # undef HAVE_ATOMIC_CAS_16
55 # define HAVE_ATOMIC_CAS_16 1
56 # endif
57 #else
58 # undef MAYBE_HAVE_ATOMIC_CAS_8
59 # define MAYBE_HAVE_ATOMIC_CAS_8 IFUNC_COND_1
60 # undef MAYBE_HAVE_ATOMIC_EXCHANGE_8
61 # define MAYBE_HAVE_ATOMIC_EXCHANGE_8 IFUNC_COND_1
62 # undef MAYBE_HAVE_ATOMIC_LDST_8
63 # define MAYBE_HAVE_ATOMIC_LDST_8 IFUNC_COND_1
64 # if IFUNC_ALT == 1
65 # undef HAVE_ATOMIC_CAS_8
66 # define HAVE_ATOMIC_CAS_8 1
67 # endif
68 #endif
70 #if defined(__x86_64__) && N == 16 && IFUNC_ALT == 1
71 static inline bool
72 atomic_compare_exchange_n (UTYPE *mptr, UTYPE *eptr, UTYPE newval,
73 bool weak_p UNUSED, int sm UNUSED, int fm UNUSED)
75 UTYPE cmpval = *eptr;
76 UTYPE oldval = __sync_val_compare_and_swap_16 (mptr, cmpval, newval);
77 if (oldval == cmpval)
78 return true;
79 *eptr = oldval;
80 return false;
82 # define atomic_compare_exchange_n atomic_compare_exchange_n
83 #endif /* Have CAS 16 */
85 #endif /* HAVE_IFUNC */
87 #include_next <host-config.h>