On 09/25/2012 04:11 PM, Loren Merritt wrote:
> On Tue, 25 Sep 2012, Justin Ruggles wrote:
> 
>> +;------------------------------------------------------------------------------
>> +; void ff_scale_samples_s16(VolumeContext *ctx, uint8_t *src, int len,
>> +;                           int volume)
>> +;------------------------------------------------------------------------------
>> +
>> +INIT_XMM sse4
>> +cglobal scale_samples_s16, 4,4,4, ctx, src, len, volume
>> +    movd        m0, volumed
>> +    pshufd      m0, m0, 0
>> +    mova        m1, [pd_128]
>> +    lea       lenq, [lend*2-mmsize]
>> +.loop:
>> +    ; src[i] = av_clip_int16((src[i] * volume + 128) >> 8);
>> +    mova        m2, [srcq+lenq]
>> +    pmovsxwd    m3, m2
>> +    psrldq      m2, 8
>> +    pmovsxwd    m2, m2
>> +    pmulld      m2, m0
>> +    pmulld      m3, m0
>> +    paddd       m2, m1
>> +    paddd       m3, m1
>> +    psrad       m2, 8
>> +    psrad       m3, 8
>> +    packssdw    m3, m2
>> +    mova  [srcq+lenq], m3
>> +    sub    lenq, mmsize
>> +    jge .loop
>> +    REP_RET
> 
> INIT_XMM sse2
> cglobal scale_samples_s16, 3,3,4, ctx, src, len, volume
>     movd        m0, volumem
>     pshuflw     m0, m0, 0
>     punpcklwd   m0, [pw_1]
>     mova        m1, [pw_128]
>     lea       lenq, [lend*2-mmsize]
> .loop:
>     ; src[i] = av_clip_int16((src[i] * volume + 128) >> 8);
>     mova        m2, [srcq+lenq]
>     punpcklwd   m3, m2, m1
>     punpckhwd   m2, m1
>     pmaddwd     m3, m0
>     pmaddwd     m2, m0
>     psrad       m3, 8
>     psrad       m2, 8
>     packssdw    m3, m2
>     mova  [srcq+lenq], m3
>     sub    lenq, mmsize
>     jge .loop
>     REP_RET
> 
> (untested)

Very nice. It works well, is faster, and only requires SSE2. Thanks!
I'll send an updated patch set when I revise all the other patches.

-Justin
_______________________________________________
libav-devel mailing list
[email protected]
https://lists.libav.org/mailman/listinfo/libav-devel

Reply via email to