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)
--Loren Merritt
_______________________________________________
libav-devel mailing list
[email protected]
https://lists.libav.org/mailman/listinfo/libav-devel