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:
Steve Checkoway
2007-01-28 23:12:06 +00:00
parent 1bb3190d62
commit 58715e319f
+30 -21
View File
@@ -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++);
}