It seems that gcc decided that even though _mm_load_ps and _mm_loadu_ps are static inline functions calling a gcc builtin, it should emit a call to them because they were used as template parameters. Oh well, the code is short enough to just copy.
This commit is contained in:
@@ -203,25 +203,6 @@ bool Vector::CheckForVector()
|
||||
return true;
|
||||
}
|
||||
|
||||
template<typename T>
|
||||
static inline void __attribute__((always_inline)) Write( T load, float *&dest, const float *&src, unsigned &size )
|
||||
{
|
||||
// There are only 8 XMM registers so no 8x unrolling. Let's do 2 though.
|
||||
while( size >= 8 )
|
||||
{
|
||||
__m128 data1 = load( src + 0 );
|
||||
__m128 data2 = load( src + 4 );
|
||||
|
||||
data1 = _mm_add_ps( data1, *(__m128 *)(dest + 0) );
|
||||
data2 = _mm_add_ps( data2, *(__m128 *)(dest + 4) );
|
||||
_mm_store_ps( dest + 0, data1 );
|
||||
_mm_store_ps( dest + 4, data2 );
|
||||
src += 8;
|
||||
dest += 8;
|
||||
size -= 8;
|
||||
}
|
||||
}
|
||||
|
||||
void Vector::FastSoundWrite( float *dest, const float *src, unsigned size )
|
||||
{
|
||||
while( (intptr_t(dest) & 0xF) && size )
|
||||
@@ -233,9 +214,37 @@ void Vector::FastSoundWrite( float *dest, const float *src, unsigned size )
|
||||
|
||||
// Misaligned loads are slower so specialize to aligned loads when possible.
|
||||
if( intptr_t(src) & 0xF )
|
||||
Write( _mm_loadu_ps, dest, src, size );
|
||||
{
|
||||
while( size >= 8 )
|
||||
{
|
||||
__m128 data1 = _mm_loadu_ps( src + 0 );
|
||||
__m128 data2 = _mm_loadu_ps( src + 4 );
|
||||
|
||||
data1 = _mm_add_ps( data1, *(__m128 *)(dest + 0) );
|
||||
data2 = _mm_add_ps( data2, *(__m128 *)(dest + 4) );
|
||||
_mm_store_ps( dest + 0, data1 );
|
||||
_mm_store_ps( dest + 4, data2 );
|
||||
src += 8;
|
||||
dest += 8;
|
||||
size -= 8;
|
||||
}
|
||||
}
|
||||
else
|
||||
Write( _mm_load_ps, dest, src, size );
|
||||
{
|
||||
while( size >= 8 )
|
||||
{
|
||||
__m128 data1 = _mm_load_ps( src + 0 );
|
||||
__m128 data2 = _mm_load_ps( src + 4 );
|
||||
|
||||
data1 = _mm_add_ps( data1, *(__m128 *)(dest + 0) );
|
||||
data2 = _mm_add_ps( data2, *(__m128 *)(dest + 4) );
|
||||
_mm_store_ps( dest + 0, data1 );
|
||||
_mm_store_ps( dest + 4, data2 );
|
||||
src += 8;
|
||||
dest += 8;
|
||||
size -= 8;
|
||||
}
|
||||
}
|
||||
while( size-- )
|
||||
*(dest++) += *(src++);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user