> +cglobal conv_fltp_to_s16_6ch, 2,8,7, 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 > + movaps xmm6, [pf_s16_scale] > + ALIGN 16 > +.loop: > +%if cpuflag(sse2) > + mulps m0, m6, [srcq ] > + mulps m1, m6, [srcq+src1q] > + mulps m2, m6, [srcq+src2q] > + mulps m3, m6, [srcq+src3q] > + mulps m4, m6, [srcq+src4q] > + mulps m5, m6, [srcq+src5q]
Same comment as in a previous email about 3-operand mulps with memory operands. Additionally, I notice there isn't an AVX version of this function; why? > + cvtps2dq m0, m0 > + cvtps2dq m1, m1 > + cvtps2dq m2, m2 > + cvtps2dq m3, m3 > + cvtps2dq m4, m4 > + cvtps2dq m5, m5 > + packssdw m0, m3 ; m0 = 0, 6, 12, 18, 3, 9, 15, 21 > + packssdw m1, m4 ; m1 = 1, 7, 13, 19, 4, 10, 16, 22 > + packssdw m2, m5 ; m2 = 2, 8, 14, 20, 5, 11, 17, 23 > + ; unpack words: > + movhlps m3, m0 ; m3 = 3, 9, 15, 21, x, x, x, x > + punpcklwd m0, m1 ; m0 = 0, 1, 6, 7, 12, 13, 18, 19 > + punpckhwd m1, m2 ; m1 = 4, 5, 10, 11, 16, 17, 22, 23 > + punpcklwd m2, m3 ; m2 = 2, 3, 8, 9, 14, 15, 20, 21 > + ; unpack dwords: > + punpckhdq m3, m0, m2 ; m3 = 12, 13, 14, 15, 18, 19, 20, 21 > + punpckldq m2, m1 ; m2 = 2, 3, 4, 5, 8, 9, 10, 11 > + ; shuffle qwords: > + movhlps m4, m2 ; m4 = 8, 9, 10, 11, x, x, x, x > + movlhps m4, m3 ; m4 = 8, 9, 10, 11, 12, 13, 14, 15 (final) > + movlhps m2, m0 ; m2 = 2, 3, 4, 5, 0, 1, 6, 7 > + movhlps m3, m1 ; m3 = 16, 17, 22, 23, 18, 19, 20, 21 > + ; shuffle dwords: > + pshufd m2, m2, q3102 ; m2 = 0, 1, 2, 3, 4, 5, 6, 7 (final) > + pshufd m3, m3, q1320 ; m3 = 16, 17, 18, 19, 20, 21, 22, 23 (final) Could some shuffps be used here instead? > + mova [dstq ], m2 > + mova [dstq+16], m4 > + mova [dstq+32], m3 > +%else ; sse > + mova xmm0, [srcq ] > + mova xmm1, [srcq+src1q] > + mova xmm2, [srcq+src2q] > + mova xmm3, [srcq+src3q] > + mova xmm4, [srcq+src4q] > + mova xmm5, [srcq+src5q] > + mulps xmm0, xmm6 > + mulps xmm1, xmm6 > + mulps xmm2, xmm6 > + mulps xmm3, xmm6 > + mulps xmm4, xmm6 > + mulps xmm5, xmm6 > + cvtps2pi m0, xmm0 > + cvtps2pi m1, xmm1 > + cvtps2pi m2, xmm2 > + cvtps2pi m3, xmm3 > + cvtps2pi m4, xmm4 > + cvtps2pi m5, xmm5 > + packssdw m0, m3 ; m0 = 0, 6, 3, 9 > + packssdw m1, m4 ; m1 = 1, 7, 4, 10 > + packssdw m2, m5 ; m2 = 2, 8, 5, 11 > + ; unpack words > + pshufw m3, m0, q1032 ; m3 = 3, 9, 0, 6 > + punpcklwd m0, m1 ; m0 = 0, 1, 6, 7 > + punpckhwd m1, m2 ; m1 = 4, 5, 10, 11 > + punpcklwd m2, m3 ; m2 = 2, 3, 8, 9 > + ; unpack dwords > + pshufw m3, m0, q1032 ; m3 = 6, 7, 0, 1 > + punpckldq m0, m2 ; m0 = 0, 1, 2, 3 (final) > + punpckhdq m2, m1 ; m2 = 8, 9, 10, 11 (final) > + punpckldq m1, m3 ; m1 = 4, 5, 6, 7 (final) > + mova [dstq ], m0 > + mova [dstq+ 8], m1 > + mova [dstq+16], m2 > +%endif > + add srcq, mmsize > + add dstq, mmsize*3 > + sub lend, mmsize/4 > + jg .loop > +%if mmsize == 8 > + emms > + RET > +%else > + REP_RET > +%endif > +%endmacro Jason _______________________________________________ libav-devel mailing list [email protected] https://lists.libav.org/mailman/listinfo/libav-devel
