shithub: opus

Download patch

ref: 9c779ed8fd5ad2cc38ab22b3fe2f8f024444b05f
parent: aa0e5a020afab95e1cfb81c7a96f698208e73ae3
author: Brad Smith <brad@comstyle.com>
date: Sat Aug 17 23:03:12 EDT 2024

Add Arm RTCD for OpenBSD

Also fix FreeBSD CMake support on ARM.

Signed-off-by: Jean-Marc Valin <jeanmarcv@google.com>

--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -599,7 +599,8 @@
 target_compile_definitions(opus
                            PRIVATE
                            $<$<BOOL:${HAVE_LRINT}>:HAVE_LRINT>
-                           $<$<BOOL:${HAVE_LRINTF}>:HAVE_LRINTF>)
+                           $<$<BOOL:${HAVE_LRINTF}>:HAVE_LRINTF>
+                           $<$<BOOL:${HAVE_ELF_AUX_INFO}>:HAVE_ELF_AUX_INFO>)
 
 if(OPUS_BUILD_FRAMEWORK)
   set_target_properties(opus PROPERTIES
--- a/celt/arm/armcpu.c
+++ b/celt/arm/armcpu.c
@@ -191,7 +191,7 @@
   return flags;
 }
 
-#elif defined(__FreeBSD__)
+#elif defined(HAVE_ELF_AUX_INFO)
 #include <sys/auxv.h>
 
 static opus_uint32 opus_cpu_capabilities(void)
@@ -237,6 +237,38 @@
 #endif
 
   return (flags);
+}
+
+#elif defined(__OpenBSD__)
+#include <sys/types.h>
+#include <sys/sysctl.h>
+#include <machine/armreg.h>
+#include <machine/cpu.h>
+
+static opus_uint32 opus_cpu_capabilities(void)
+{
+  opus_uint32 flags = 0;
+
+#if defined(OPUS_ARM_MAY_HAVE_DOTPROD) && defined(CPU_ID_AA64ISAR0)
+  const int isar0_mib[] = { CTL_MACHDEP, CPU_ID_AA64ISAR0 };
+  uint64_t isar0;
+  size_t len = sizeof(isar0);
+
+  if (sysctl(isar0_mib, 2, &isar0, &len, NULL, 0) != -1)
+  {
+    if (ID_AA64ISAR0_DP(isar0) >= ID_AA64ISAR0_DP_IMPL)
+      flags |= OPUS_CPU_ARM_DOTPROD_FLAG;
+  }
+#endif
+
+#if defined(OPUS_ARM_PRESUME_NEON_INTR) \
+ || defined(OPUS_ARM_PRESUME_AARCH64_NEON_INTR)
+  flags |= OPUS_CPU_ARM_EDSP_FLAG | OPUS_CPU_ARM_MEDIA_FLAG | OPUS_CPU_ARM_NEON_FLAG;
+# if defined(OPUS_ARM_PRESUME_DOTPROD)
+  flags |= OPUS_CPU_ARM_DOTPROD_FLAG;
+# endif
+#endif
+  return flags;
 }
 
 #else
--- a/cmake/OpusConfig.cmake
+++ b/cmake/OpusConfig.cmake
@@ -48,6 +48,7 @@
 
 check_symbol_exists(lrintf "math.h" HAVE_LRINTF)
 check_symbol_exists(lrint "math.h" HAVE_LRINT)
+check_symbol_exists(elf_aux_info "sys/auxv.h" HAVE_ELF_AUX_INFO)
 cmake_pop_check_state()
 
 if(CMAKE_SYSTEM_PROCESSOR MATCHES "(i[0-9]86|x86|X86|amd64|AMD64|x86_64)")
--- a/cmake/OpusFunctions.cmake
+++ b/cmake/OpusFunctions.cmake
@@ -166,9 +166,9 @@
       endif()
     endif()
   elseif(OPUS_CPU_ARM)
-    # ARM cpu detection is implemented for Windows and anything
-    # using a Linux kernel (such as Android).
-    if (CMAKE_SYSTEM_NAME MATCHES "(Windows|Linux|Android)")
+    # ARM cpu detection is implemented for Windows, Linux, Android, FreeBSD
+    # and OpenBSD.
+    if (CMAKE_SYSTEM_NAME MATCHES "(Windows|Linux|Android|FreeBSD|OpenBSD)")
       set(RUNTIME_CPU_CAPABILITY_DETECTION 1 PARENT_SCOPE)
     endif ()
   else()
--- a/configure.ac
+++ b/configure.ac
@@ -1041,7 +1041,7 @@
 AC_CHECK_FUNCS([lrint])
 LIBS="$saved_LIBS"
 
-AC_CHECK_FUNCS([__malloc_hook])
+AC_CHECK_FUNCS([__malloc_hook elf_aux_info])
 
 AC_SUBST([PC_BUILD])
 
--- a/meson.build
+++ b/meson.build
@@ -83,6 +83,7 @@
 opus_conf.set('HAVE_LRINTF', cc.has_function('lrintf', prefix: '#include <math.h>', dependencies: libm))
 opus_conf.set('HAVE_LRINT', cc.has_function('lrint', prefix: '#include <math.h>', dependencies: libm))
 opus_conf.set('HAVE___MALLOC_HOOK', cc.has_function('__malloc_hook', prefix: '#include <malloc.h>'))
+opus_conf.set('HAVE_ELF_AUX_INFO', cc.has_function('elf_aux_info', prefix: '#include <sys/auxv.h>'))
 opus_conf.set('HAVE_STDINT_H', cc.check_header('stdint.h'))
 
 # Check for restrict keyword
--