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
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/>. */
28 extern unsigned int libat_feat1_ecx HIDDEN
;
29 extern unsigned int libat_feat1_edx HIDDEN
;
32 # define IFUNC_COND_1 (libat_feat1_ecx & bit_CMPXCHG16B)
34 # define IFUNC_COND_1 (libat_feat1_edx & bit_CMPXCHG8B)
38 # define IFUNC_NCOND(N) (N == 16)
40 # define IFUNC_NCOND(N) (N == 8)
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
54 # undef HAVE_ATOMIC_CAS_16
55 # define HAVE_ATOMIC_CAS_16 1
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
65 # undef HAVE_ATOMIC_CAS_8
66 # define HAVE_ATOMIC_CAS_8 1
70 #if defined(__x86_64__) && N == 16 && IFUNC_ALT == 1
72 atomic_compare_exchange_n (UTYPE
*mptr
, UTYPE
*eptr
, UTYPE newval
,
73 bool weak_p UNUSED
, int sm UNUSED
, int fm UNUSED
)
76 UTYPE oldval
= __sync_val_compare_and_swap_16 (mptr
, cmpval
, newval
);
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>