diff --git a/src/lib/eina/eina_cpu.c b/src/lib/eina/eina_cpu.c index 45b3b9295d..c61297803b 100644 --- a/src/lib/eina/eina_cpu.c +++ b/src/lib/eina/eina_cpu.c @@ -130,10 +130,7 @@ void _x86_simd(Eina_Cpu_Features *features) static void _arm_cpu_features(Eina_Cpu_Features *features) { - unsigned long aux; - - aux = getauxval(AT_HWCAP); - + unsigned long aux = getauxval(AT_HWCAP); # if defined(__aarch64__) *features |= EINA_CPU_NEON; # endif @@ -146,6 +143,17 @@ _arm_cpu_features(Eina_Cpu_Features *features) } #endif +#if defined(HAVE_SYS_AUXV_H) && defined(HAVE_ASM_HWCAP_H) && (defined(__POWERPC__) && defined(__VEC__)) && defined(__linux__) +static void +_ppc_cpu_features(Eina_Cpu_Features *features) +{ +# ifdef PPC_FEATURE_HAS_ALTIVEC + unsigned long aux = getauxval(AT_HWCAP); + if (aux & PPC_FEATURE_HAS_ALTIVEC) *features |= EINA_CPU_ALTIVEC; +# endif +} +#endif + /*============================================================================* * Global * *============================================================================*/ diff --git a/src/lib/evas/common/evas_cpu.c b/src/lib/evas/common/evas_cpu.c index d9f5c015ee..a91ffe6930 100644 --- a/src/lib/evas/common/evas_cpu.c +++ b/src/lib/evas/common/evas_cpu.c @@ -1,193 +1,13 @@ #include "evas_common_private.h" -#ifdef BUILD_NEON -# ifdef BUILD_NEON_INTRINSICS -# include -# endif -#endif static int cpu_feature_mask = 0; -#ifdef BUILD_ALTIVEC -# ifdef __POWERPC__ -# ifdef __VEC__ -# define NEED_FEATURE_TEST -# endif -# endif -#endif - -#ifdef __SPARC__ -# define NEED_FEATURE_TEST -#endif - -#if defined(__ARM_ARCH__) -# ifdef BUILD_NEON -# define NEED_FEATURE_TEST -# endif -#endif - -#if defined(__aarch64__) -# ifdef BUILD_NEON -# define NEED_FEATURE_TEST -# endif -#endif - -#ifdef NEED_FEATURE_TEST -# ifdef HAVE_SIGLONGJMP -# include -# include -# include - -static sigjmp_buf detect_buf; -static void evas_common_cpu_catch_ill(int sig); -static void evas_common_cpu_catch_segv(int sig); - -static void -evas_common_cpu_catch_ill(int sig EINA_UNUSED) -{ - siglongjmp(detect_buf, 1); -} - -static void -evas_common_cpu_catch_segv(int sig EINA_UNUSED) -{ - siglongjmp(detect_buf, 1); -} -# endif - -# ifdef BUILD_ALTIVEC -void -evas_common_cpu_altivec_test(void) -{ -# ifdef __POWERPC__ -# ifdef __VEC__ - vector unsigned int zero; - - zero = vec_splat_u32(0); -# endif /* __VEC__ */ -# endif /* __POWERPC__ */ -} -# endif /* BUILD_ALTIVEC */ - -void -evas_common_cpu_neon_test(void) -{ -//#if defined(__ARM_ARCH__) && (__ARM_ARCH__ >= 70) -# ifdef BUILD_NEON -# ifdef BUILD_NEON_INTRINSICS - volatile uint32x4_t temp = vdupq_n_u32(0x1); - vaddq_u32(temp, temp); -# else - asm volatile ( - ".fpu neon \n\t" - "vqadd.u8 d0, d1, d0\n" - : /* Out */ - : /* In */ - : /* Clobbered */ - "d0", "d1" - ); -# endif -# endif -//#endif -} - -void -evas_common_cpu_vis_test(void) -{ -# ifdef __SPARC__ -# endif /* __SPARC__ */ -} -#endif /* NEED_FEATURE_TEST */ - - -#if defined(BUILD_MMX) || defined(BUILD_SSE3) -# define NEED_CPU_CHECK -#endif - -#ifdef NEED_FEATURE_TEST -# ifndef HAVE_SIGLONGJMP -# undef NEED_CPU_CHECK -# define NEED_CPU_CHECK -# endif -#endif - -#ifdef NEED_CPU_CHECK static Eina_Bool _cpu_check(Eina_Cpu_Features f) { - Eina_Cpu_Features features; - - features = eina_cpu_features_get(); + Eina_Cpu_Features features = eina_cpu_features_get(); return (features & f) == f; } -#endif - -#if defined(__aarch64__) -void -evas_common_cpu_sve_test(void) -{ - volatile int result = 123; - asm("movz %w[res], #10" : [res] "=r" (result)); -} -#endif - -#ifdef NEED_FEATURE_TEST -int -evas_common_cpu_feature_test(void (*feature)(void)) -{ -# ifdef HAVE_SIGLONGJMP - int enabled = 1; - struct sigaction act, oact, oact2; - - act.sa_handler = evas_common_cpu_catch_ill; - act.sa_flags = SA_RESTART; - sigemptyset(&act.sa_mask); - sigaction(SIGILL, &act, &oact); - - act.sa_handler = evas_common_cpu_catch_segv; - act.sa_flags = SA_RESTART; - sigemptyset(&act.sa_mask); - sigaction(SIGSEGV, &act, &oact2); - - if (sigsetjmp(detect_buf, 1)) - { - sigaction(SIGILL, &oact, NULL); - sigaction(SIGSEGV, &oact2, NULL); - return 0; - } - - feature(); - - sigaction(SIGILL, &oact, NULL); - sigaction(SIGSEGV, &oact2, NULL); - return enabled; -# else -# ifdef BUILD_MMX - if (feature == evas_common_cpu_mmx_test) - return _cpu_check(EINA_CPU_MMX); - /* no mmx2 support in eina */ - if (feature == evas_common_cpu_sse_test) - return _cpu_check(EINA_CPU_SSE); -# endif -# ifdef BUILD_SSE3 - if (feature == evas_common_cpu_sse3_test) - return _cpu_check(EINA_CPU_SSE3); -# endif -# ifdef BUILD_ALTIVEC - if (feature == evas_common_cpu_altivec_test) - return _cpu_check(CPU_FEATURE_ALTIVEC); -# endif -# ifdef BUILD_NEON - if (feature == evas_common_cpu_neon_test) - return _cpu_check(EINA_CPU_NEON); -# endif -# if defined(__aarch64__) - if (feature == evas_common_cpu_sve_test) - return _cpu_check(EINA_CPU_SVE); -# endif - return 0; -# endif -} -#endif EAPI void evas_common_cpu_init(void) @@ -218,71 +38,32 @@ evas_common_cpu_init(void) #endif /* BUILD_MMX */ #ifdef BUILD_ALTIVEC -# ifdef __POWERPC__ -# ifdef __VEC__ if (getenv("EVAS_CPU_NO_ALTIVEC")) cpu_feature_mask &= ~CPU_FEATURE_ALTIVEC; else - { - cpu_feature_mask |= CPU_FEATURE_ALTIVEC * - evas_common_cpu_feature_test(evas_common_cpu_altivec_test); - evas_common_cpu_end_opt(); - } -# endif /* __VEC__ */ -# endif /* __POWERPC__ */ + cpu_feature_mask |= _cpu_check(CPU_FEATURE_ALTIVEC) * CPU_FEATURE_ALTIVEC; #endif /* BUILD_ALTIVEC */ -#ifdef __SPARC__ - if (getenv("EVAS_CPU_NO_VIS")) - cpu_feature_mask &= ~CPU_FEATURE_VIS; - else - { - cpu_feature_mask |= CPU_FEATURE_VIS * - evas_common_cpu_feature_test(evas_common_cpu_vis_test); - evas_common_cpu_end_opt(); - } -#endif /* __SPARC__ */ - #if defined(__ARM_ARCH__) # ifdef BUILD_NEON if (getenv("EVAS_CPU_NO_NEON")) cpu_feature_mask &= ~CPU_FEATURE_NEON; else - { - /* On linux eina_cpu sets this up with getauxval() */ -# if defined(HAVE_SYS_AUXV_H) && defined(HAVE_ASM_HWCAP_H) && defined(__arm__) && defined(__linux__) - cpu_feature_mask |= CPU_FEATURE_NEON * - !!(eina_cpu_features_get() & EINA_CPU_NEON); -# else - cpu_feature_mask |= CPU_FEATURE_NEON * - evas_common_cpu_feature_test(evas_common_cpu_neon_test); - evas_common_cpu_end_opt(); -# endif - } + cpu_feature_mask |= _cpu_check(EINA_CPU_NEON) * CPU_FEATURE_NEON; # endif #endif #if defined(__aarch64__) +# ifdef BUILD_NEON if (getenv("EVAS_CPU_NO_NEON")) cpu_feature_mask &= ~CPU_FEATURE_NEON; else cpu_feature_mask |= CPU_FEATURE_NEON; -#endif - -#if defined(__aarch64__) +# endif if (getenv("EVAS_CPU_NO_SVE")) cpu_feature_mask &= ~CPU_FEATURE_SVE; else - { -# if defined(HAVE_SYS_AUXV_H) && defined(HAVE_ASM_HWCAP_H) && defined(__arm__) && defined(__linux__) - cpu_feature_mask |= CPU_FEATURE_SVE * - !!(eina_cpu_features_get() & EINA_CPU_SVE); -# else - cpu_feature_mask |= CPU_FEATURE_SVE * - evas_common_cpu_feature_test(evas_common_cpu_sve_test); - evas_common_cpu_end_opt(); -# endif - } + cpu_feature_mask |= _cpu_check(EINA_CPU_SVE) * CPU_FEATURE_SVE; #endif } @@ -296,17 +77,6 @@ int evas_common_cpu_have_cpuid(void) { return 0; -/* -#ifdef BUILD_MMX - unsigned int have_cpu_id; - - have_cpu_id = 0; - have_cpuid(have_cpu_id); - return have_cpu_id; -#else - return 0; -#endif - */ } EAPI void @@ -333,7 +103,7 @@ evas_common_cpu_end_opt(void) { if (cpu_feature_mask & (CPU_FEATURE_MMX | CPU_FEATURE_MMX2)) { - emms(); + emms(); } } #else