evas: add SSE3 support

Readme entry
configure --[enable/disable]-cpu-sse3
processor capability test

Patch by: Jim Kukunas <james.t.kukunas@linux.intel.com>



SVN revision: 63697
This commit is contained in:
Jim Kukunas 2011-09-30 02:35:31 +00:00 committed by Lucas De Marchi
parent 17881b57a4
commit eec4b913ea
6 changed files with 81 additions and 4 deletions

View File

@ -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 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. 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 --enable-cpu-neon

View File

@ -1219,6 +1219,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 ## ALTIVEC
build_cpu_altivec="no" build_cpu_altivec="no"
@ -1883,6 +1926,7 @@ echo "CPU Specific Extensions:"
echo " Fallback C Code.........: $build_cpu_c" echo " Fallback C Code.........: $build_cpu_c"
echo " MMX.....................: $build_cpu_mmx" echo " MMX.....................: $build_cpu_mmx"
echo " SSE.....................: $build_cpu_sse" echo " SSE.....................: $build_cpu_sse"
echo " SSE3....................: $build_cpu_sse3"
echo " ALTIVEC.................: $build_cpu_altivec" echo " ALTIVEC.................: $build_cpu_altivec"
echo " NEON....................: $build_cpu_neon" echo " NEON....................: $build_cpu_neon"
echo " Thread Support..........: $build_pthreads" echo " Thread Support..........: $build_pthreads"

View File

@ -3,6 +3,10 @@
#include "evas_mmx.h" #include "evas_mmx.h"
#endif #endif
#if defined BUILD_SSE3
#include <immintrin.h>
#endif
#if defined (HAVE_STRUCT_SIGACTION) && defined (HAVE_SIGLONGJMP) #if defined (HAVE_STRUCT_SIGACTION) && defined (HAVE_SIGLONGJMP)
#include <signal.h> #include <signal.h>
#include <setjmp.h> #include <setjmp.h>
@ -60,6 +64,16 @@ evas_common_cpu_sse_test(void)
#endif #endif
} }
void
evas_common_cpu_sse3_test(void)
{
#ifdef BUILD_SSE3
int data[4];
__m128i val = _mm_lddqu_si128((__m128i *)data);
#endif
}
void void
evas_common_cpu_altivec_test(void) evas_common_cpu_altivec_test(void)
{ {
@ -154,6 +168,13 @@ evas_common_cpu_init(void)
evas_common_cpu_end_opt(); evas_common_cpu_end_opt();
if (getenv("EVAS_CPU_NO_SSE")) if (getenv("EVAS_CPU_NO_SSE"))
cpu_feature_mask &= ~CPU_FEATURE_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_SSE */
#endif /* BUILD_MMX */ #endif /* BUILD_MMX */
#ifdef __POWERPC__ #ifdef __POWERPC__

View File

@ -67,8 +67,10 @@
#define CPU_SSE2 4 #define CPU_SSE2 4
/* cpu flags count */ /* cpu flags count */
#define CPU_NEON 5 #define CPU_NEON 5
/* CPU SSE3 */
#define CPU_SSE3 6
/* cpu flags count */ /* cpu flags count */
#define CPU_LAST 6 #define CPU_LAST 7
/* some useful constants */ /* some useful constants */

View File

@ -458,7 +458,8 @@ typedef enum _CPU_Features
CPU_FEATURE_ALTIVEC = (1 << 3), CPU_FEATURE_ALTIVEC = (1 << 3),
CPU_FEATURE_VIS = (1 << 4), CPU_FEATURE_VIS = (1 << 4),
CPU_FEATURE_VIS2 = (1 << 5), CPU_FEATURE_VIS2 = (1 << 5),
CPU_FEATURE_NEON = (1 << 6) CPU_FEATURE_NEON = (1 << 6),
CPU_FEATURE_SSE3 = (1 << 7)
} CPU_Features; } CPU_Features;
typedef enum _Font_Hint_Flags typedef enum _Font_Hint_Flags

View File

@ -43,6 +43,7 @@
/*#define BUILD_MMX*/ /*#define BUILD_MMX*/
/*#define BUILD_SSE*/ /*#define BUILD_SSE*/
/*#define BUILD_SSE3*/
/*#define BUILD_C*/ /*#define BUILD_C*/
/*#define BUILD_LOADER_PNG*/ /*#define BUILD_LOADER_PNG*/
@ -54,9 +55,11 @@
/* check in that the user configured it right */ /* check in that the user configured it right */
#ifndef BUILD_MMX #ifndef BUILD_MMX
# ifndef BUILD_SSE # ifndef BUILD_SSE3
# ifndef BUILD_C # ifndef BUILD_SSE
# ifndef BUILD_C
# error "Please Read the README" # error "Please Read the README"
#endif
# endif # endif
# endif # endif
#endif #endif