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

Reply via email to