1/* Copyright (C) 2012-2015 Free Software Foundation, Inc. 2 Contributed by Richard Henderson <rth@redhat.com>. 3 4 This file is part of the GNU Atomic Library (libatomic). 5 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. 10 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. 15 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. 19 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/>. */ 24 25#if HAVE_IFUNC 26#include <cpuid.h> 27 28extern unsigned int libat_feat1_ecx HIDDEN; 29extern unsigned int libat_feat1_edx HIDDEN; 30 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 36 37#ifdef __x86_64__ 38# define IFUNC_NCOND(N) (N == 16) 39#else 40# define IFUNC_NCOND(N) (N == 8) 41#endif 42 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# if IFUNC_ALT == 1 51# undef HAVE_ATOMIC_CAS_16 52# define HAVE_ATOMIC_CAS_16 1 53# endif 54#else 55# undef MAYBE_HAVE_ATOMIC_CAS_8 56# define MAYBE_HAVE_ATOMIC_CAS_8 IFUNC_COND_1 57# undef MAYBE_HAVE_ATOMIC_EXCHANGE_8 58# define MAYBE_HAVE_ATOMIC_EXCHANGE_8 IFUNC_COND_1 59# undef MAYBE_HAVE_ATOMIC_LDST_8 60# define MAYBE_HAVE_ATOMIC_LDST_8 IFUNC_COND_1 61# if IFUNC_ALT == 1 62# undef HAVE_ATOMIC_CAS_8 63# define HAVE_ATOMIC_CAS_8 1 64# endif 65#endif 66 67#endif /* HAVE_IFUNC */ 68 69#include_next <host-config.h> 70