diff options
author | Chris Robinson <[email protected]> | 2012-08-15 03:43:36 -0700 |
---|---|---|
committer | Chris Robinson <[email protected]> | 2012-08-15 03:43:36 -0700 |
commit | 4d157d2849a6cda4fb05eea7ebed91793985b709 (patch) | |
tree | baa06a85fe0f4e7b859c21cde4d8dee7afbf6577 | |
parent | 64cd763e190eeff0f0631babebc150893e5f3ecf (diff) |
Make sure the working coefficients are aligned for the SSE mixer
-rw-r--r-- | Alc/mixer_inc.c | 2 | ||||
-rw-r--r-- | Alc/mixer_sse.c | 6 | ||||
-rw-r--r-- | CMakeLists.txt | 8 | ||||
-rw-r--r-- | config.h.in | 2 |
4 files changed, 12 insertions, 6 deletions
diff --git a/Alc/mixer_inc.c b/Alc/mixer_inc.c index 21166b60..b7051f64 100644 --- a/Alc/mixer_inc.c +++ b/Alc/mixer_inc.c @@ -53,7 +53,7 @@ void MERGE4(MixDirect_Hrtf_,SAMPLER,_,SUFFIX)( ALfloat (*RESTRICT Values)[2] = Source->Hrtf.Values[i]; ALint Counter = maxu(Source->Hrtf.Counter, OutPos) - OutPos; ALuint Offset = Source->Hrtf.Offset + OutPos; - ALfloat Coeffs[HRIR_LENGTH][2]; + ALfloat Coeffs[HRIR_LENGTH][2] ALIGN(16); ALuint Delay[2]; ALfloat left, right; diff --git a/Alc/mixer_sse.c b/Alc/mixer_sse.c index e189971a..2da2b6b8 100644 --- a/Alc/mixer_sse.c +++ b/Alc/mixer_sse.c @@ -20,16 +20,12 @@ static __inline void ApplyCoeffs(ALuint Offset, ALfloat (*RESTRICT Values)[2], { const ALuint o0 = (Offset++)&HRIR_MASK; const ALuint o1 = (Offset++)&HRIR_MASK; + __m128 coeffs = _mm_load_ps(&Coeffs[c][0]); __m128 vals = { 0.0f, 0.0f, 0.0f, 0.0f }; - __m128 coeffs = { 0.0f, 0.0f, 0.0f, 0.0f }; - vals = _mm_loadl_pi(vals, (__m64*)&Values[o0][0]); vals = _mm_loadh_pi(vals, (__m64*)&Values[o1][0]); - coeffs = _mm_loadl_pi(coeffs, (__m64*)&Coeffs[c ][0]); - coeffs = _mm_loadh_pi(coeffs, (__m64*)&Coeffs[c+1][0]); vals = _mm_add_ps(vals, _mm_mul_ps(coeffs, lrlr)); - _mm_storel_pi((__m64*)&Values[o0][0], vals); _mm_storeh_pi((__m64*)&Values[o1][0], vals); } diff --git a/CMakeLists.txt b/CMakeLists.txt index fdee264e..f2265b87 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -85,6 +85,7 @@ SET(LIB_MINOR_VERSION "14") SET(LIB_VERSION "${LIB_MAJOR_VERSION}.${LIB_MINOR_VERSION}") SET(EXPORT_DECL "") +SET(ALIGN_DECL "") CHECK_TYPE_SIZE("long" SIZEOF_LONG) @@ -173,6 +174,7 @@ ENDIF() # Set visibility/export options if available IF(WIN32) SET(EXPORT_DECL "__declspec(dllexport)") + SET(ALIGN_DECL "__declspec(aligned((x)))") OPTION(WINE "Enable use of Wine headers when compiling" OFF) IF(WINE) @@ -218,6 +220,12 @@ ELSE() ENDIF() ENDIF() + CHECK_C_SOURCE_COMPILES("int foo __attribute__((aligned(16))); + int main() {return 0;}" HAVE_ATTRIBUTE_ALIGNED) + IF(HAVE_ATTRIBUTE_ALIGNED) + SET(ALIGN_DECL "__attribute__((aligned((x))))") + ENDIF() + SET(CMAKE_REQUIRED_FLAGS "${OLD_REQUIRED_FLAGS}") ENDIF() diff --git a/config.h.in b/config.h.in index 7368bba3..8f9c14c8 100644 --- a/config.h.in +++ b/config.h.in @@ -5,6 +5,8 @@ /* Define to the library version */ #define ALSOFT_VERSION "${LIB_VERSION}" +#define ALIGN(x) ${ALIGN_DECL} + /* Define if we have SSE CPU extensions */ #cmakedefine HAVE_SSE |