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

Reply via email to