On 09/25/2012 04:33 PM, Loren Merritt wrote: > On Tue, 25 Sep 2012, Justin Ruggles wrote: > >> SECTION_RODATA 32 >> >> pd_128: times 4 dd 128 >> +pq_128: times 2 dq 128 >> +pq_maxsq: times 2 dq 549755813632 ; INT_MAX << 8 >> +pb_packqd_rsh8: db 1, 2, 3, 4, 9, 10, 11, 12, -1, -1, -1, -1, -1, -1, -1, -1 >> >> SECTION_TEXT >> >> @@ -55,3 +58,58 @@ cglobal scale_samples_s16, 4,4,4, ctx, src, len, volume >> sub lenq, mmsize >> jge .loop >> REP_RET >> + >> +;------------------------------------------------------------------------------ >> +; void ff_scale_samples_s32(VolumeContext *ctx, uint8_t *src, int len, >> +; int volume) >> +;------------------------------------------------------------------------------ >> + >> +; NOTE: This is not bit-identical with the C version because it clips to >> +; [-INT_MAX, INT_MAX] instead of [INT_MIN, INT_MAX] >> + >> +%macro PMINSQ 3 ; dst, src, tmp >> + pcmpgtq %3, %2, %1 >> + pxor %1, %2 >> + pand %1, %3 >> + pxor %1, %2 >> +%endmacro >> + >> +%macro SCALE_SAMPLES_S32 0 >> +cglobal scale_samples_s32, 4,4,8, ctx, src, len, volume >> + movd m0, volumed >> + pshufd m0, m0, 0 >> + mova m3, [pq_128] >> + mova m4, [pq_maxsq] >> + mova m5, [pb_packqd_rsh8] >> + lea lenq, [lend*4-mmsize] >> +.loop: >> + ; src[i] = av_clipl_int32((src[i] * volume + 128) >> 8); >> + mova m1, [srcq+lenq] >> + mova m6, m1 >> + mova m2, m1 >> + punpckhdq m2, m1, m1 >> + punpckldq m1, m1, m1 >> + pabsd m1, m1 >> + pabsd m2, m2 >> + pmuludq m1, m0 >> + pmuludq m2, m0 >> + paddq m1, m3 >> + paddq m2, m3 >> + PMINSQ m1, m4, m7 >> + PMINSQ m2, m4, m7 >> + pshufb m1, m5 >> + pshufb m2, m5 >> + punpcklqdq m1, m2 >> + psignd m1, m6 >> + mova [srcq+lenq], m1 >> + sub lenq, mmsize >> + jge .loop >> + REP_RET >> +%endmacro > > cglobal scale_samples_s32, 3,3,7, ctx, src, len, volume > movd m4, volumem > pshufd m4, m4, 0 > mova m5, [pq_128] > pxor m6, m6 > lea lenq, [lend*4-mmsize] > .loop: > ; src[i] = av_clipl_int32((src[i] * volume + 128) >> 8); > pabsd m3, [srcq+lenq] > pshufd m0, m3, q0100 > pshufd m1, m3, q0302 > pmuludq m0, m4 > pmuludq m1, m4 > paddq m0, m5 > paddq m1, m5 > psrlq m0, 7 > psrlq m1, 7 > shufps m2, m0, m1, q3131 > shufps m0, m0, m1, q2020 > pcmpgtd m2, m6 > por m0, m2 > psrld m0, 1 > psignd m0, m3 > mova [srcq+lenq], m0 > sub lenq, mmsize > jge .loop > REP_RET > > (untested)
Using pabsd directly do m3 doesn't work because we need to keep the sign. It works putting [srcq+lenq] in a separate register then pabsd to m3. Thanks, Justin _______________________________________________ libav-devel mailing list [email protected] https://lists.libav.org/mailman/listinfo/libav-devel
