Reactos
at master 65 lines 1.5 kB view raw
1// 2// isa_available.c 3// 4// Copyright (c) 2024 Timo Kreuzer 5// 6// Implementation of __isa_available_init. 7// 8// SPDX-License-Identifier: MIT 9// 10 11#include <isa_availability.h> 12#include <intrin.h> 13#include <windef.h> 14#include <winbase.h> 15 16extern "C" { int __isa_available = 0; } 17 18extern "C" 19int 20__cdecl 21__isa_available_init(void) 22{ 23#if defined(_M_IX86) || defined(_M_X64) 24 if (IsProcessorFeaturePresent(PF_AVX512F_INSTRUCTIONS_AVAILABLE)) 25 { 26 __isa_available = __ISA_AVAILABLE_AVX512; 27 } 28 else if (IsProcessorFeaturePresent(PF_AVX2_INSTRUCTIONS_AVAILABLE)) 29 { 30 __isa_available = __ISA_AVAILABLE_AVX2; 31 } 32 else if (IsProcessorFeaturePresent(PF_AVX_INSTRUCTIONS_AVAILABLE)) 33 { 34 __isa_available = __ISA_AVAILABLE_AVX; 35 } 36 else if (IsProcessorFeaturePresent(PF_SSE4_2_INSTRUCTIONS_AVAILABLE)) 37 { 38 __isa_available = __ISA_AVAILABLE_SSE42; 39 } 40 else if (IsProcessorFeaturePresent(PF_XMMI64_INSTRUCTIONS_AVAILABLE)) 41 { 42 __isa_available = __ISA_AVAILABLE_SSE2; 43 } 44 else 45 { 46 __isa_available = __ISA_AVAILABLE_X86; 47 } 48#elif defined(_M_ARM) || defined(_M_ARM64) 49 // CHECKME: Is this correct? 50 if (IsProcessorFeaturePresent(PF_ARM_V8_INSTRUCTIONS_AVAILABLE)) 51 { 52#ifdef _M_ARM64 53 __isa_available = __ISA_AVAILABLE_NEON_ARM64; 54#else 55 __isa_available = __ISA_AVAILABLE_NEON; 56#endif 57 } 58 else 59 { 60 __isa_available = __ISA_AVAILABLE_ARMNT; 61 } 62#endif 63 64 return 0; 65}