From 96efecea83294167ca0122f7b08f6bccc0a30374 Mon Sep 17 00:00:00 2001 From: lucas Date: Fri, 30 Sep 2011 02:35:31 +0000 Subject: [PATCH] evas: add SSE3 support Readme entry configure --[enable/disable]-cpu-sse3 processor capability test Patch by: Jim Kukunas git-svn-id: http://svn.enlightenment.org/svn/e/trunk/evas@63697 7cbeb6ba-43b4-40fd-8cce-4c39aea84d33 --- README.in | 6 ++++++ configure.ac | 44 +++++++++++++++++++++++++++++++++++++++ src/lib/engines/common/evas_cpu.c | 21 +++++++++++++++++++ src/lib/include/evas_blend_ops.h | 4 +++- src/lib/include/evas_common.h | 3 ++- src/lib/include/evas_options.h | 7 +++++-- 6 files changed, 81 insertions(+), 4 deletions(-) diff --git a/README.in b/README.in index 36b2d95..22face7 100644 --- a/README.in +++ b/README.in @@ -416,6 +416,12 @@ ALTIVEC asm routines yet. :) arm owners will also have to rely on the c fallback routines as i haven't managed to come up with any arm assembly that actually can beat the c code (when compiled with all optimizations) in speed. +--enable-cpu-sse3 + +this enables sse3 optimizations available in the Intel Pentium4, Core, Xeon, +and Atom processors, as well as the AMD Athlon64, Phenom, Opteron, and Turion +processors. + --enable-cpu-neon diff --git a/configure.ac b/configure.ac index 4768bd6..131c383 100644 --- a/configure.ac +++ b/configure.ac @@ -1220,6 +1220,49 @@ AC_ARG_ENABLE(cpu-sse, ) ####################################### +## SSE3 +build_cpu_sse3="no" +case $host_cpu in + i*86) + build_cpu_sse3="yes" + ;; + x86_64) + build_cpu_sse3="yes" + ;; + amd64) + build_cpu_sse3="yes" + ;; +esac +AC_MSG_CHECKING(whether to build sse3 code) +AC_ARG_ENABLE(cpu-sse3, + AS_HELP_STRING([--enable-cpu-sse3],[enable sse3 code]), + [ + if test "x$enableval" = "xyes" ; then + AC_MSG_RESULT(yes) + AC_DEFINE(BUILD_SSE3, 1, [Build SSE3 Code]) + build_cpu_sse3="yes" + else + AC_MSG_RESULT(no) + build_cpu_sse3="no" + fi + ], + [ + AC_MSG_RESULT($build_cpu_sse3) + if test "x$build_cpu_sse3" = "xyes" ; then + AC_DEFINE(BUILD_SSE3, 1, [Build SSE3 Code]) + fi + ] +) + + +EVAS_SSE3_CFLAGS="-msse3 " +if test "x$build_cpu_sse3" = "xyes" ; then + CFLAGS="${CFLAGS} ${EVAS_SSE3_CFLAGS}" +fi + +AC_SUBST(CFLAGS) + +####################################### ## ALTIVEC build_cpu_altivec="no" case $host_cpu in @@ -1883,6 +1926,7 @@ echo "CPU Specific Extensions:" echo " Fallback C Code.........: $build_cpu_c" echo " MMX.....................: $build_cpu_mmx" echo " SSE.....................: $build_cpu_sse" +echo " SSE3....................: $build_cpu_sse3" echo " ALTIVEC.................: $build_cpu_altivec" echo " NEON....................: $build_cpu_neon" echo " Thread Support..........: $build_pthreads" diff --git a/src/lib/engines/common/evas_cpu.c b/src/lib/engines/common/evas_cpu.c index f9aef68..65a9018 100644 --- a/src/lib/engines/common/evas_cpu.c +++ b/src/lib/engines/common/evas_cpu.c @@ -3,6 +3,10 @@ #include "evas_mmx.h" #endif +#if defined BUILD_SSE3 +#include +#endif + #if defined (HAVE_STRUCT_SIGACTION) && defined (HAVE_SIGLONGJMP) #include #include @@ -61,6 +65,16 @@ evas_common_cpu_sse_test(void) } void +evas_common_cpu_sse3_test(void) +{ +#ifdef BUILD_SSE3 + int data[4]; + + __m128i val = _mm_lddqu_si128((__m128i *)data); +#endif +} + +void evas_common_cpu_altivec_test(void) { #ifdef __POWERPC__ @@ -154,6 +168,13 @@ evas_common_cpu_init(void) evas_common_cpu_end_opt(); if (getenv("EVAS_CPU_NO_SSE")) cpu_feature_mask &= ~CPU_FEATURE_SSE; +#ifdef BUILD_SSE3 + cpu_feature_mask |= CPU_FEATURE_SSE3 * + evas_common_cpu_feature_test(evas_common_cpu_sse3_test); + evas_common_cpu_end_opt(); + if(getenv("EVAS_CPU_NO_SSE3")) + cpu_feature_mask &= ~CPU_FEATURE_SSE3; +#endif /* BUILD_SSE3 */ #endif /* BUILD_SSE */ #endif /* BUILD_MMX */ #ifdef __POWERPC__ diff --git a/src/lib/include/evas_blend_ops.h b/src/lib/include/evas_blend_ops.h index 9627f87..9647800 100644 --- a/src/lib/include/evas_blend_ops.h +++ b/src/lib/include/evas_blend_ops.h @@ -67,8 +67,10 @@ #define CPU_SSE2 4 /* cpu flags count */ #define CPU_NEON 5 +/* CPU SSE3 */ +#define CPU_SSE3 6 /* cpu flags count */ -#define CPU_LAST 6 +#define CPU_LAST 7 /* some useful constants */ diff --git a/src/lib/include/evas_common.h b/src/lib/include/evas_common.h index 81a2785..e00398c 100644 --- a/src/lib/include/evas_common.h +++ b/src/lib/include/evas_common.h @@ -458,7 +458,8 @@ typedef enum _CPU_Features CPU_FEATURE_ALTIVEC = (1 << 3), CPU_FEATURE_VIS = (1 << 4), CPU_FEATURE_VIS2 = (1 << 5), - CPU_FEATURE_NEON = (1 << 6) + CPU_FEATURE_NEON = (1 << 6), + CPU_FEATURE_SSE3 = (1 << 7) } CPU_Features; typedef enum _Font_Hint_Flags diff --git a/src/lib/include/evas_options.h b/src/lib/include/evas_options.h index a54291d..f6739c0 100644 --- a/src/lib/include/evas_options.h +++ b/src/lib/include/evas_options.h @@ -43,6 +43,7 @@ /*#define BUILD_MMX*/ /*#define BUILD_SSE*/ +/*#define BUILD_SSE3*/ /*#define BUILD_C*/ /*#define BUILD_LOADER_PNG*/ @@ -54,9 +55,11 @@ /* check in that the user configured it right */ #ifndef BUILD_MMX -# ifndef BUILD_SSE -# ifndef BUILD_C +# ifndef BUILD_SSE3 +# ifndef BUILD_SSE +# ifndef BUILD_C # error "Please Read the README" + #endif # endif # endif #endif -- 2.7.4