Make sure the working coefficients are aligned for the SSE mixer

This commit is contained in:
Chris Robinson 2012-08-15 03:43:36 -07:00
parent 64cd763e19
commit 4d157d2849
4 changed files with 12 additions and 6 deletions

View File

@ -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;

View File

@ -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);
}

View File

@ -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()

View File

@ -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