Changeset 3574

Show
Ignore:
Timestamp:
07/03/09 03:48:03 (8 months ago)
Author:
sletz
Message:

Another Tim Bechmann memops.c optimization patch.

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • jack2/trunk/jackmp/ChangeLog

    r3572 r3574  
    2626--------------------------- 
    2727 
     282009-07-03 Stephane Letz  <letz@grame.fr> 
     29 
     30        * Another Tim Bechmann memops.c optimization patch. 
     31 
    28322009-07-01 Stephane Letz  <letz@grame.fr> 
    2933 
  • jack2/trunk/jackmp/common/memops.c

    r3573 r3574  
    164164        } 
    165165 
     166 
     167#if defined (__SSE2__) && !defined (__sun__) 
     168 
     169/* generates same as _mm_set_ps(1.f, 1.f, 1f., 1f) but faster  */ 
     170static inline __m128 gen_one(void) 
     171{ 
     172    volatile __m128i x; 
     173    __m128i ones = _mm_cmpeq_epi32(x, x); 
     174    return (__m128)_mm_slli_epi32 (_mm_srli_epi32(ones, 25), 23); 
     175} 
     176 
     177static inline __m128 clip(__m128 s, __m128 min, __m128 max) 
     178{ 
     179    return _mm_min_ps(max, _mm_max_ps(s, min)); 
     180} 
     181 
     182static inline __m128i float_24_sse(__m128 s) 
     183{ 
     184    const __m128 upper_bound = gen_one(); /* NORMALIZED_FLOAT_MAX */ 
     185    const __m128 lower_bound = _mm_sub_ps(_mm_setzero_ps(), upper_bound); 
     186 
     187    __m128 clipped = clip(s, lower_bound, upper_bound); 
     188    __m128 scaled = _mm_mul_ps(clipped, _mm_set1_ps(SAMPLE_24BIT_SCALING)); 
     189    return _mm_cvtps_epi32(scaled); 
     190} 
     191#endif 
    166192 
    167193/* Linear Congruential noise generator. From the music-dsp list 
     
    255281                __m128 in = _mm_load_ps(src); 
    256282                __m128 scaled = _mm_mul_ps(in, factor); 
    257                 __m128 clipped = _mm_min_ps(int_max, _mm_max_ps(scaled, int_min)); 
     283                __m128 clipped = clip(scaled, int_min, int_max); 
    258284 
    259285                __m128i y = _mm_cvttps_epi32(clipped); 
     
    265291 
    266292                _mm_store_ss((float*)dst, (__m128)shifted); 
    267                 dst += dst_skip; 
    268                 _mm_store_ss((float*)dst, (__m128)shuffled1); 
    269                 dst += dst_skip; 
    270                 _mm_store_ss((float*)dst, (__m128)shuffled2); 
    271                 dst += dst_skip; 
    272                 _mm_store_ss((float*)dst, (__m128)shuffled3); 
    273                 dst += dst_skip; 
     293 
     294                _mm_store_ss((float*)(dst+dst_skip), (__m128)shuffled1); 
     295                _mm_store_ss((float*)(dst+2*dst_skip), (__m128)shuffled2); 
     296                _mm_store_ss((float*)(dst+3*dst_skip), (__m128)shuffled3); 
     297                dst += 4*dst_skip; 
    274298 
    275299                src+= 4; 
     
    390414void sample_move_d24_sS (char *dst, jack_default_audio_sample_t *src, unsigned long nsamples, unsigned long dst_skip, dither_state_t *state) 
    391415{ 
    392         int32_t z; 
    393          
     416#if defined (__SSE2__) && !defined (__sun__) 
     417        _MM_SET_ROUNDING_MODE(_MM_ROUND_NEAREST); 
     418        while (nsamples >= 4) { 
     419                int i; 
     420                int32_t z[4]; 
     421                __m128 samples = _mm_loadu_ps(src); 
     422                __m128i converted = float_24_sse(samples); 
     423 
     424                __m128i shuffled1 = _mm_shuffle_epi32(converted, _MM_SHUFFLE(0, 3, 2, 1)); 
     425                __m128i shuffled2 = _mm_shuffle_epi32(converted, _MM_SHUFFLE(1, 0, 3, 2)); 
     426                __m128i shuffled3 = _mm_shuffle_epi32(converted, _MM_SHUFFLE(2, 1, 0, 3)); 
     427 
     428                _mm_store_ss((float*)z, (__m128)converted); 
     429                _mm_store_ss((float*)z+1, (__m128)shuffled1); 
     430                _mm_store_ss((float*)z+2, (__m128)shuffled2); 
     431                _mm_store_ss((float*)z+3, (__m128)shuffled3); 
     432 
     433                for (i = 0; i != 4; ++i) { 
     434#if __BYTE_ORDER == __LITTLE_ENDIAN 
     435                        memcpy (dst, z+i, 3); 
     436#elif __BYTE_ORDER == __BIG_ENDIAN 
     437                        memcpy (dst, (float*)((char *)&z + 1)+i, 3); 
     438#endif 
     439                        dst += dst_skip; 
     440                } 
     441                nsamples -= 4; 
     442                src += 4; 
     443        } 
     444#endif 
     445 
     446    int32_t z; 
     447 
    394448        while (nsamples--) { 
    395449                float_24 (*src, z); 
     
    402456                src++; 
    403457        } 
    404 }       
     458} 
    405459 
    406460void sample_move_dS_s24s (jack_default_audio_sample_t *dst, char *src, unsigned long nsamples, unsigned long src_skip) 
     
    444498#if defined (__SSE2__) && !defined (__sun__) 
    445499        const __m128 scaling_block = _mm_set_ps1(scaling); 
    446         while (nsamples > 4) { 
     500        while (nsamples >= 4) { 
    447501                int x0, x1, x2, x3; 
    448502