mirror of
https://github.com/google/cpu_features.git
synced 2025-04-28 07:23:37 +02:00
58 lines
2.1 KiB
C
58 lines
2.1 KiB
C
// Copyright 2017 Google LLC
|
|
//
|
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
// you may not use this file except in compliance with the License.
|
|
// You may obtain a copy of the License at
|
|
//
|
|
// http://www.apache.org/licenses/LICENSE-2.0
|
|
//
|
|
// Unless required by applicable law or agreed to in writing, software
|
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
// See the License for the specific language governing permissions and
|
|
// limitations under the License.
|
|
|
|
#include "cpu_features_macros.h"
|
|
|
|
#ifdef CPU_FEATURES_ARCH_X86
|
|
#ifdef CPU_FEATURES_OS_MACOS
|
|
|
|
#include "impl_x86__base_implementation.inl"
|
|
|
|
#if !defined(HAVE_SYSCTLBYNAME)
|
|
#error "Darwin needs support for sysctlbyname"
|
|
#endif
|
|
#include <sys/sysctl.h>
|
|
|
|
#if defined(CPU_FEATURES_MOCK_CPUID_X86)
|
|
extern bool GetDarwinSysCtlByName(const char*);
|
|
#else // CPU_FEATURES_MOCK_CPUID_X86
|
|
static bool GetDarwinSysCtlByName(const char* name) {
|
|
int enabled;
|
|
size_t enabled_len = sizeof(enabled);
|
|
const int failure = sysctlbyname(name, &enabled, &enabled_len, NULL, 0);
|
|
return failure ? false : enabled;
|
|
}
|
|
#endif
|
|
|
|
static void OverrideOsPreserves(OsPreserves* os_preserves) {
|
|
// On Darwin AVX512 support is On-demand.
|
|
// We have to query the OS instead of querying the Zmm save/restore state.
|
|
// https://github.com/apple/darwin-xnu/blob/8f02f2a044b9bb1ad951987ef5bab20ec9486310/osfmk/i386/fpu.c#L173-L199
|
|
os_preserves->avx512_registers = GetDarwinSysCtlByName("hw.optional.avx512f");
|
|
}
|
|
|
|
static void DetectFeaturesFromOs(X86Info* info, X86Features* features) {
|
|
(void)info;
|
|
// Handling Darwin platform through sysctlbyname.
|
|
features->sse = GetDarwinSysCtlByName("hw.optional.sse");
|
|
features->sse2 = GetDarwinSysCtlByName("hw.optional.sse2");
|
|
features->sse3 = GetDarwinSysCtlByName("hw.optional.sse3");
|
|
features->ssse3 = GetDarwinSysCtlByName("hw.optional.supplementalsse3");
|
|
features->sse4_1 = GetDarwinSysCtlByName("hw.optional.sse4_1");
|
|
features->sse4_2 = GetDarwinSysCtlByName("hw.optional.sse4_2");
|
|
}
|
|
|
|
#endif // CPU_FEATURES_OS_MACOS
|
|
#endif // CPU_FEATURES_ARCH_X86
|