On Mon, 25 Jun 2012, Justin Ruggles wrote:

> +;------------------------------------------------------------------------------
> +; void ff_conv_s16p_to_s16_6ch(int16_t *dst, int16_t *const *src, int len,
> +;                              int channels);
> +;------------------------------------------------------------------------------
> +
> +INIT_XMM sse2
> +cglobal conv_s16p_to_s16_6ch, 2,8,6, dst, src, src1, src2, src3, src4, src5, 
> len
> +%if ARCH_X86_64
> +    mov     lend, r2d
> +%else
> +    %define lend dword r2m
> +%endif
> +    mov     src1q, [srcq+1*gprsize]
> +    mov     src2q, [srcq+2*gprsize]
> +    mov     src3q, [srcq+3*gprsize]
> +    mov     src4q, [srcq+4*gprsize]
> +    mov     src5q, [srcq+5*gprsize]
> +    mov      srcq, [srcq]
> +    sub     src1q, srcq
> +    sub     src2q, srcq
> +    sub     src3q, srcq
> +    sub     src4q, srcq
> +    sub     src5q, srcq
> +.loop:
> +    movlpd     m0, [srcq      ]
> +    movlpd     m1, [srcq+src1q]
> +    movlpd     m2, [srcq+src2q]

movq is better than movlpd. movq is just a load whereas movlpd also has an
arithmetic uop to merge the halves; and movlpd instroduces an unnecessary
dependency on the previous value of the reg.

> +    movhpd     m0, [srcq+src3q] ; m0 =  0,  6, 12, 18,  3,  9, 15, 21
> +    movhpd     m1, [srcq+src4q] ; m1 =  1,  7, 13, 19,  4, 10, 16, 22
> +    movhpd     m2, [srcq+src5q] ; m2 =  2,  8, 14, 20,  5, 11, 17, 23
> +                                ; unpack words:
> +    movhlps    m3, m0           ; m3 =  3,  9, 15, 21,  x,  x,  x,  x

Here too. No need to merge data and then unmerge it; just 6 movq and 6
regs.

--Loren Merritt
_______________________________________________
libav-devel mailing list
[email protected]
https://lists.libav.org/mailman/listinfo/libav-devel

Reply via email to