X-Git-Url: https://git.libre-soc.org/?p=mesa.git;a=blobdiff_plain;f=src%2Futil%2Fu_cpu_detect.c;h=79da996a7aa5952d47dfcfa612608e9913719193;hp=19b21b0aa44a98dbbe24ad489395cf0c9da06a38;hb=6ea0a918bb87076e7d7f63314929760e6bc72041;hpb=601a098338a5c276a538d55bde516624aff99a49 diff --git a/src/util/u_cpu_detect.c b/src/util/u_cpu_detect.c index 19b21b0aa44..79da996a7aa 100644 --- a/src/util/u_cpu_detect.c +++ b/src/util/u_cpu_detect.c @@ -47,15 +47,13 @@ #endif #endif -#if defined(PIPE_OS_NETBSD) || defined(PIPE_OS_OPENBSD) +#if defined(PIPE_OS_BSD) #include #include #include #endif -#if defined(PIPE_OS_FREEBSD) || defined(PIPE_OS_DRAGONFLY) -#include -#include +#if defined(PIPE_OS_FREEBSD) #if __has_include() #include #define HAVE_ELF_AUX_INFO @@ -96,7 +94,7 @@ static int has_cpuid(void); #endif -#if defined(PIPE_ARCH_PPC) && !defined(PIPE_OS_APPLE) && !defined(PIPE_OS_LINUX) +#if defined(PIPE_ARCH_PPC) && !defined(PIPE_OS_APPLE) && !defined(PIPE_OS_BSD) && !defined(PIPE_OS_LINUX) static jmp_buf __lv_powerpc_jmpbuf; static volatile sig_atomic_t __lv_powerpc_canjump = 0; @@ -117,8 +115,20 @@ sigill_handler(int sig) static void check_os_altivec_support(void) { -#if defined(PIPE_OS_APPLE) +#if defined(__ALTIVEC__) + util_cpu_caps.has_altivec = 1; +#endif +#if defined(__VSX__) + util_cpu_caps.has_vsx = 1; +#endif +#if defined(__ALTIVEC__) && defined(__VSX__) +/* Do nothing */ +#elif defined(PIPE_OS_APPLE) || defined(PIPE_OS_NETBSD) || defined(PIPE_OS_OPENBSD) +#ifdef HW_VECTORUNIT int sels[2] = {CTL_HW, HW_VECTORUNIT}; +#else + int sels[2] = {CTL_MACHDEP, CPU_ALTIVEC}; +#endif int has_vu = 0; int len = sizeof (has_vu); int err; @@ -130,7 +140,19 @@ check_os_altivec_support(void) util_cpu_caps.has_altivec = 1; } } -#elif defined(PIPE_OS_LINUX) /* !PIPE_OS_APPLE */ +#elif defined(PIPE_OS_FREEBSD) /* !PIPE_OS_APPLE && !PIPE_OS_NETBSD && !PIPE_OS_OPENBSD */ + unsigned long hwcap = 0; +#ifdef HAVE_ELF_AUX_INFO + elf_aux_info(AT_HWCAP, &hwcap, sizeof(hwcap)); +#else + size_t len = sizeof(hwcap); + sysctlbyname("hw.cpu_features", &hwcap, &len, NULL, 0); +#endif + if (hwcap & PPC_FEATURE_HAS_ALTIVEC) + util_cpu_caps.has_altivec = 1; + if (hwcap & PPC_FEATURE_HAS_VSX) + util_cpu_caps.has_vsx = 1; +#elif defined(PIPE_OS_LINUX) /* !PIPE_OS_FREEBSD */ #if defined(PIPE_ARCH_PPC_64) Elf64_auxv_t aux; #else @@ -151,7 +173,7 @@ check_os_altivec_support(void) } close(fd); } -#else /* !PIPE_OS_APPLE && !PIPE_OS_LINUX */ +#else /* !PIPE_OS_APPLE && !PIPE_OS_BSD && !PIPE_OS_LINUX */ /* not on Apple/Darwin or Linux, do it the brute-force way */ /* this is borrowed from the libmpeg2 library */ signal(SIGILL, sigill_handler);