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
