Skip to content

Commit 3704fb8

Browse files
Piotr Pawlowskijmvalin
authored andcommitted
MSVC ARM64/ARM64EC support - removed xmmintrin.h, updated platform detection in CMake script
Signed-off-by: Jean-Marc Valin <jmvalin@jmvalin.ca>
1 parent 3a9d586 commit 3704fb8

File tree

2 files changed

+17
-6
lines changed

2 files changed

+17
-6
lines changed

celt/float_cast.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,7 @@ static OPUS_INLINE opus_int32 float2int(float x) {return _mm_cvt_ss2si(_mm_set_s
6969

7070
#elif (defined(_MSC_VER) && _MSC_VER >= 1400) && (defined(_M_X64) || (defined(_M_IX86_FP) && _M_IX86_FP >= 1))
7171

72-
#include <xmmintrin.h>
72+
#include <intrin.h>
7373
static OPUS_INLINE opus_int32 float2int(float value)
7474
{
7575
/* _mm_load_ss will generate same code as _mm_set_ss

cmake/OpusConfig.cmake

Lines changed: 16 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -51,14 +51,21 @@ check_symbol_exists(lrint "math.h" HAVE_LRINT)
5151
check_symbol_exists(elf_aux_info "sys/auxv.h" HAVE_ELF_AUX_INFO)
5252
cmake_pop_check_state()
5353

54-
if(CMAKE_SYSTEM_PROCESSOR MATCHES "(i[0-9]86|x86|X86|amd64|AMD64|x86_64)")
54+
message(STATUS "Check CPU arch: CMAKE_GENERATOR_PLATFORM=${CMAKE_GENERATOR_PLATFORM} CMAKE_SYSTEM_PROCESSOR=${CMAKE_SYSTEM_PROCESSOR}")
55+
56+
if(CMAKE_GENERATOR_PLATFORM MATCHES "(arm64|ARM64|arm64ec|ARM64EC)")
57+
# Microsoft ARM mode, override other checks
58+
# CMake still doesn't recognize it, CMAKE_SYSTEM_PROCESSOR is AMD64
59+
set(OPUS_CPU_ARM_MS)
60+
set(OPUS_CPU_ARM 1)
61+
elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "(arm|aarch64|ARM)")
62+
set(OPUS_CPU_ARM 1)
63+
elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "(i[0-9]86|x86|X86|amd64|AMD64|x86_64)")
5564
if(CMAKE_SIZEOF_VOID_P EQUAL 8)
5665
set(OPUS_CPU_X64 1)
5766
else()
5867
set(OPUS_CPU_X86 1)
5968
endif()
60-
elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "(arm|aarch64|ARM)")
61-
set(OPUS_CPU_ARM 1)
6269
endif()
6370

6471
if(NOT OPUS_DISABLE_INTRINSICS)
@@ -68,12 +75,16 @@ endif()
6875
if(OPUS_CPU_X86 OR OPUS_CPU_X64 AND NOT OPUS_DISABLE_INTRINSICS)
6976
opus_detect_sse(COMPILER_SUPPORT_SIMD)
7077
elseif(OPUS_CPU_ARM AND NOT OPUS_DISABLE_INTRINSICS)
71-
opus_detect_neon(COMPILER_SUPPORT_NEON)
78+
if (OPUS_CPU_ARM_MS)
79+
set(COMPILER_SUPPORT_NEON 1)
80+
else()
81+
opus_detect_neon(COMPILER_SUPPORT_NEON)
82+
endif()
7283
if(COMPILER_SUPPORT_NEON)
7384
option(OPUS_USE_NEON "Option to enable NEON" ON)
7485
option(OPUS_MAY_HAVE_NEON "Does runtime check for neon support" ON)
7586
option(OPUS_PRESUME_NEON "Assume target CPU has NEON support" OFF)
76-
if(CMAKE_SYSTEM_PROCESSOR MATCHES "aarch64")
87+
if(OPUS_CPU_ARM_MS OR CMAKE_SYSTEM_PROCESSOR MATCHES "aarch64")
7788
set(OPUS_PRESUME_NEON ON)
7889
elseif(CMAKE_SYSTEM_NAME MATCHES "iOS")
7990
set(OPUS_PRESUME_NEON ON)

0 commit comments

Comments
 (0)