summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChris Robinson <[email protected]>2012-08-15 03:43:36 -0700
committerChris Robinson <[email protected]>2012-08-15 03:43:36 -0700
commit4d157d2849a6cda4fb05eea7ebed91793985b709 (patch)
treebaa06a85fe0f4e7b859c21cde4d8dee7afbf6577
parent64cd763e190eeff0f0631babebc150893e5f3ecf (diff)
Make sure the working coefficients are aligned for the SSE mixer
-rw-r--r--Alc/mixer_inc.c2
-rw-r--r--Alc/mixer_sse.c6
-rw-r--r--CMakeLists.txt8
-rw-r--r--config.h.in2
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