| /* Data structure for x86 CPU features. |
| This file is part of the GNU C Library. |
| Copyright (C) 2008-2021 Free Software Foundation, Inc. |
| |
| The GNU C Library is free software; you can redistribute it and/or |
| modify it under the terms of the GNU Lesser General Public |
| License as published by the Free Software Foundation; either |
| version 2.1 of the License, or (at your option) any later version. |
| |
| The GNU C Library is distributed in the hope that it will be useful, |
| but WITHOUT ANY WARRANTY; without even the implied warranty of |
| MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
| Lesser General Public License for more details. |
| |
| You should have received a copy of the GNU Lesser General Public |
| License along with the GNU C Library; if not, see |
| <https://www.gnu.org/licenses/>. */ |
| |
| #ifndef _SYS_PLATFORM_X86_H |
| #define _SYS_PLATFORM_X86_H |
| |
| #include <features.h> |
| #include <stdbool.h> |
| #include <bits/platform/x86.h> |
| |
| __BEGIN_DECLS |
| |
| /* Get a pointer to the CPU feature structure. */ |
| extern const struct cpuid_feature *__x86_get_cpuid_feature_leaf (unsigned int) |
| __attribute__ ((pure)); |
| |
| static __inline__ _Bool |
| x86_cpu_has_feature (unsigned int __index) |
| { |
| const struct cpuid_feature *__ptr = __x86_get_cpuid_feature_leaf |
| (__index / (8 * sizeof (unsigned int) * 4)); |
| unsigned int __reg |
| = __index & (8 * sizeof (unsigned int) * 4 - 1); |
| unsigned int __bit = __reg & (8 * sizeof (unsigned int) - 1); |
| __reg /= 8 * sizeof (unsigned int); |
| |
| return __ptr->cpuid_array[__reg] & (1 << __bit); |
| } |
| |
| static __inline__ _Bool |
| x86_cpu_is_usable (unsigned int __index) |
| { |
| const struct cpuid_feature *__ptr = __x86_get_cpuid_feature_leaf |
| (__index / (8 * sizeof (unsigned int) * 4)); |
| unsigned int __reg |
| = __index & (8 * sizeof (unsigned int) * 4 - 1); |
| unsigned int __bit = __reg & (8 * sizeof (unsigned int) - 1); |
| __reg /= 8 * sizeof (unsigned int); |
| |
| return __ptr->usable_array[__reg] & (1 << __bit); |
| } |
| |
| /* HAS_CPU_FEATURE evaluates to true if CPU supports the feature. */ |
| #define HAS_CPU_FEATURE(name) x86_cpu_has_feature (x86_cpu_##name) |
| /* CPU_FEATURE_USABLE evaluates to true if the feature is usable. */ |
| #define CPU_FEATURE_USABLE(name) x86_cpu_is_usable (x86_cpu_##name) |
| |
| __END_DECLS |
| |
| #endif /* _SYS_PLATFORM_X86_H */ |