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
