From 3594bf8eeb619c317130da688b4e661ede276d91 Mon Sep 17 00:00:00 2001 From: "Ryan C. Gordon" Date: Mon, 23 Jan 2017 01:05:44 -0500 Subject: [PATCH] audio: Wired up new SSE code to build system. --- CMakeLists.txt | 29 +++++++++++++++-- configure | 61 +++++++++++++++++++++++++++++++++++- configure.in | 39 ++++++++++++++++++++++- include/SDL_cpuinfo.h | 3 ++ src/audio/SDL_audiocvt.c | 7 ++--- src/audio/SDL_audiotypecvt.c | 7 ++--- 6 files changed, 132 insertions(+), 14 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 00e1e46e5359f..65d7cc2019bf6 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -262,6 +262,7 @@ set_option(MMX "Use MMX assembly routines" ${OPT_DEF_ASM}) set_option(3DNOW "Use 3Dnow! MMX assembly routines" ${OPT_DEF_ASM}) set_option(SSE "Use SSE assembly routines" ${OPT_DEF_ASM}) set_option(SSE2 "Use SSE2 assembly routines" ${OPT_DEF_SSEMATH}) +set_option(SSE3 "Use SSE3 assembly routines" ${OPT_DEF_SSEMATH}) set_option(ALTIVEC "Use Altivec assembly routines" ${OPT_DEF_ASM}) set_option(DISKAUDIO "Support the disk writer audio driver" ON) set_option(DUMMYAUDIO "Support the dummy audio driver" ON) @@ -516,8 +517,31 @@ if(ASSEMBLY) set(CMAKE_REQUIRED_FLAGS ${ORIG_CMAKE_REQUIRED_FLAGS}) endif() + if(SSE3) + set(CMAKE_REQUIRED_FLAGS "-msse3") + check_c_source_compiles(" + #ifdef __MINGW32__ + #include <_mingw.h> + #ifdef __MINGW64_VERSION_MAJOR + #include + #else + #include + #endif + #else + #include + #endif + #ifndef __SSE3__ + #error Assembler CPP flag not enabled + #endif + int main(int argc, char **argv) { }" HAVE_SSE3) + if(HAVE_SSE3) + list(APPEND EXTRA_CFLAGS "-msse3") + endif() + set(CMAKE_REQUIRED_FLAGS ${ORIG_CMAKE_REQUIRED_FLAGS}) + endif() + if(SSEMATH) - if(SSE OR SSE2) + if(SSE OR SSE2 OR SSE3) if(USE_GCC) list(APPEND EXTRA_CFLAGS "-mfpmath=387") endif() @@ -557,12 +581,13 @@ if(ASSEMBLY) endif() set(HAVE_SSE TRUE) set(HAVE_SSE2 TRUE) + set(HAVE_SSE3 TRUE) set(SDL_ASSEMBLY_ROUTINES 1) endif() # TODO: #else() # if(USE_GCC OR USE_CLANG) -# list(APPEND EXTRA_CFLAGS "-mno-sse" "-mno-sse2" "-mno-mmx") +# list(APPEND EXTRA_CFLAGS "-mno-sse" "-mno-sse2" "-mno-sse3" "-mno-mmx") # endif() endif() diff --git a/configure b/configure index 9c93953ff7c0f..a0ff763fe64c5 100755 --- a/configure +++ b/configure @@ -798,6 +798,7 @@ enable_mmx enable_3dnow enable_sse enable_sse2 +enable_sse3 enable_altivec enable_oss enable_alsa @@ -1527,7 +1528,8 @@ Optional Features: --enable-mmx use MMX assembly routines [[default=yes]] --enable-3dnow use 3DNow! assembly routines [[default=yes]] --enable-sse use SSE assembly routines [[default=yes]] - --enable-sse2 use SSE2 assembly routines [[default=no]] + --enable-sse2 use SSE2 assembly routines [[default=maybe]] + --enable-sse3 use SSE3 assembly routines [[default=maybe]] --enable-altivec use Altivec assembly routines [[default=yes]] --enable-oss support the OSS audio API [[default=maybe]] --enable-alsa support the ALSA audio API [[default=yes]] @@ -17308,6 +17310,63 @@ $as_echo "$have_gcc_sse2" >&6; } fi fi + # Check whether --enable-sse3 was given. +if test "${enable_sse3+set}" = set; then : + enableval=$enable_sse3; +else + enable_sse3=$default_ssemath +fi + + if test x$enable_sse3 = xyes; then + save_CFLAGS="$CFLAGS" + have_gcc_sse3=no + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GCC -msse3 option" >&5 +$as_echo_n "checking for GCC -msse3 option... " >&6; } + sse3_CFLAGS="-msse3" + CFLAGS="$save_CFLAGS $sse3_CFLAGS" + + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + + #ifdef __MINGW32__ + #include <_mingw.h> + #ifdef __MINGW64_VERSION_MAJOR + #include + #else + #include + #endif + #else + #include + #endif + #ifndef __SSE2__ + #error Assembler CPP flag not enabled + #endif + +int +main () +{ + + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + + have_gcc_sse3=yes + +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $have_gcc_sse3" >&5 +$as_echo "$have_gcc_sse3" >&6; } + CFLAGS="$save_CFLAGS" + + if test x$have_gcc_sse3 = xyes; then + EXTRA_CFLAGS="$EXTRA_CFLAGS $sse3_CFLAGS" + SUMMARY_math="${SUMMARY_math} sse3" + fi + fi + # Check whether --enable-altivec was given. if test "${enable_altivec+set}" = set; then : enableval=$enable_altivec; diff --git a/configure.in b/configure.in index 073c15255f413..9eacefa6b0b16 100644 --- a/configure.in +++ b/configure.in @@ -593,7 +593,7 @@ AC_HELP_STRING([--enable-sse], [use SSE assembly routines [[default=yes]]]), fi AC_ARG_ENABLE(sse2, -AC_HELP_STRING([--enable-sse2], [use SSE2 assembly routines [[default=no]]]), +AC_HELP_STRING([--enable-sse2], [use SSE2 assembly routines [[default=maybe]]]), , enable_sse2=$default_ssemath) if test x$enable_sse2 = xyes; then save_CFLAGS="$CFLAGS" @@ -629,6 +629,43 @@ AC_HELP_STRING([--enable-sse2], [use SSE2 assembly routines [[default=no]]]), fi fi + AC_ARG_ENABLE(sse3, +AC_HELP_STRING([--enable-sse3], [use SSE3 assembly routines [[default=maybe]]]), + , enable_sse3=$default_ssemath) + if test x$enable_sse3 = xyes; then + save_CFLAGS="$CFLAGS" + have_gcc_sse3=no + AC_MSG_CHECKING(for GCC -msse3 option) + sse3_CFLAGS="-msse3" + CFLAGS="$save_CFLAGS $sse3_CFLAGS" + + AC_TRY_COMPILE([ + #ifdef __MINGW32__ + #include <_mingw.h> + #ifdef __MINGW64_VERSION_MAJOR + #include + #else + #include + #endif + #else + #include + #endif + #ifndef __SSE2__ + #error Assembler CPP flag not enabled + #endif + ],[ + ],[ + have_gcc_sse3=yes + ]) + AC_MSG_RESULT($have_gcc_sse3) + CFLAGS="$save_CFLAGS" + + if test x$have_gcc_sse3 = xyes; then + EXTRA_CFLAGS="$EXTRA_CFLAGS $sse3_CFLAGS" + SUMMARY_math="${SUMMARY_math} sse3" + fi + fi + AC_ARG_ENABLE(altivec, AC_HELP_STRING([--enable-altivec], [use Altivec assembly routines [[default=yes]]]), , enable_altivec=yes) diff --git a/include/SDL_cpuinfo.h b/include/SDL_cpuinfo.h index 3b260f1a72871..25e2ff4f61902 100644 --- a/include/SDL_cpuinfo.h +++ b/include/SDL_cpuinfo.h @@ -61,6 +61,9 @@ #ifdef __SSE2__ #include #endif +#ifdef __SSE3__ +#include +#endif #endif #include "begin_code.h" diff --git a/src/audio/SDL_audiocvt.c b/src/audio/SDL_audiocvt.c index 85196b141056d..7a915a6b52c57 100644 --- a/src/audio/SDL_audiocvt.c +++ b/src/audio/SDL_audiocvt.c @@ -28,13 +28,10 @@ #include "SDL_loadso.h" #include "SDL_assert.h" #include "../SDL_dataqueue.h" - -/* !!! FIXME: wire this up to the configure script, etc. */ #include "SDL_cpuinfo.h" -#define HAVE_SSE3_INTRINSICS 0 -#if HAVE_SSE3_INTRINSICS -#include +#ifdef __SSE3__ +#define HAVE_SSE3_INTRINSICS 1 #endif #if HAVE_SSE3_INTRINSICS diff --git a/src/audio/SDL_audiotypecvt.c b/src/audio/SDL_audiotypecvt.c index 505e25a007573..91e9c6458c519 100644 --- a/src/audio/SDL_audiotypecvt.c +++ b/src/audio/SDL_audiotypecvt.c @@ -28,11 +28,8 @@ /* !!! FIXME: write NEON code. */ #define HAVE_NEON_INTRINSICS 0 -/* !!! FIXME: wire this up to the configure script, etc. */ -#define HAVE_SSE2_INTRINSICS 0 - -#if HAVE_SSE2_INTRINSICS -#include +#ifdef __SSE2__ +#define HAVE_SSE2_INTRINSICS 1 #endif #if defined(__x86_64__) && HAVE_SSE2_INTRINSICS