@ -59,14 +59,14 @@ SECTION .text
% macro yuv2planeX_fn 3
% macro yuv2planeX_fn 3
% if ARCH_X86_32
% if ARCH_X86_32
% define cntr_reg r1
% define cntr_reg filterq
% define movsx mov
% define movsx mov
% else
% else
% define cntr_reg r11
% define cntr_reg r11
% define movsx movsxd
% define movsx movsxd
% endif
% endif
cglobal yuv2planeX_ % 1 , % 3 , 7 , % 2
cglobal yuv2planeX_ % 1 , % 3 , 7 , % 2 , filter , fltsize , src , ds t , w , di ther , offset
% if %1 == 8 || %1 == 9 || %1 == 10
% if %1 == 8 || %1 == 9 || %1 == 10
pxor m6 , m6
pxor m6 , m6
% endif ; %1 == 8/9/10
% endif ; %1 == 8/9/10
@ -81,8 +81,8 @@ cglobal yuv2planeX_%1, %3, 7, %2
% endif ; x86-32
% endif ; x86-32
; create registers holding dither
; create registers holding dither
movq m_dith , [ r5 ] ; dither
movq m_dith , [ di therq ] ; dither
test r6d , r6 d
test offsetd , offset d
jz .no_rot
jz .no_rot
% if mmsize == 16
% if mmsize == 16
punpcklqdq m_dith , m_dith
punpcklqdq m_dith , m_dith
@ -146,17 +146,17 @@ cglobal yuv2planeX_%1, %3, 7, %2
mova m1 , [ yuv2yuvX_ % 1 _start ]
mova m1 , [ yuv2yuvX_ % 1 _start ]
mova m2 , m1
mova m2 , m1
% endif ; %1 == 8/9/10/16
% endif ; %1 == 8/9/10/16
movsx cntr_reg , r1 m
movsx cntr_reg , fltsize m
.filterloop_ %+ %% i :
.filterloop_ %+ %% i :
; input pixels
; input pixels
mov r6 , [ r2 + gprsize * cntr_reg - 2 * gprsize ]
mov r6 , [ srcq + gprsize * cntr_reg - 2 * gprsize ]
% if %1 == 16
% if %1 == 16
mova m3 , [ r6 + r5 * 4 ]
mova m3 , [ r6 + r5 * 4 ]
mova m5 , [ r6 + r5 * 4 + mmsize ]
mova m5 , [ r6 + r5 * 4 + mmsize ]
% else ; %1 == 8/9/10
% else ; %1 == 8/9/10
mova m3 , [ r6 + r5 * 2 ]
mova m3 , [ r6 + r5 * 2 ]
% endif ; %1 == 8/9/10/16
% endif ; %1 == 8/9/10/16
mov r6 , [ r2 + gprsize * cntr_reg - gprsize ]
mov r6 , [ srcq + gprsize * cntr_reg - gprsize ]
% if %1 == 16
% if %1 == 16
mova m4 , [ r6 + r5 * 4 ]
mova m4 , [ r6 + r5 * 4 ]
mova m6 , [ r6 + r5 * 4 + mmsize ]
mova m6 , [ r6 + r5 * 4 + mmsize ]
@ -165,7 +165,7 @@ cglobal yuv2planeX_%1, %3, 7, %2
% endif ; %1 == 8/9/10/16
% endif ; %1 == 8/9/10/16
; coefficients
; coefficients
movd m0 , [ r0 + 2 * cntr_reg - 4 ] ; coeff[0], coeff[1]
movd m0 , [ filterq + 2 * cntr_reg - 4 ] ; coeff[0], coeff[1]
% if %1 == 16
% if %1 == 16
pshuflw m7 , m0 , 0 ; coeff[0]
pshuflw m7 , m0 , 0 ; coeff[0]
pshuflw m0 , m0 , 0x55 ; coeff[1]
pshuflw m0 , m0 , 0x55 ; coeff[1]
@ -207,7 +207,7 @@ cglobal yuv2planeX_%1, %3, 7, %2
% if %1 == 8
% if %1 == 8
packssdw m2 , m1
packssdw m2 , m1
packuswb m2 , m2
packuswb m2 , m2
movh [ r3 + r5 * 1 ], m2
movh [ ds tq + r5 * 1 ], m2
% else ; %1 == 9/10/16
% else ; %1 == 9/10/16
% if %1 == 16
% if %1 == 16
packssdw m2 , m1
packssdw m2 , m1
@ -221,11 +221,11 @@ cglobal yuv2planeX_%1, %3, 7, %2
% endif ; mmx2/sse2/sse4/avx
% endif ; mmx2/sse2/sse4/avx
pminsw m2 , [ yuv2yuvX_ % 1 _upper ]
pminsw m2 , [ yuv2yuvX_ % 1 _upper ]
% endif ; %1 == 9/10/16
% endif ; %1 == 9/10/16
mova [ r3 + r5 * 2 ], m2
mova [ ds tq + r5 * 2 ], m2
% endif ; %1 == 8/9/10/16
% endif ; %1 == 8/9/10/16
add r5 , mmsize / 2
add r5 , mmsize / 2
sub r4d , mmsize / 2
sub wd , mmsize / 2
% if %1 == 8
% if %1 == 8
% assign %%i %%i+2
% assign %%i %%i+2
% endrep
% endrep
@ -275,17 +275,17 @@ yuv2planeX_fn 10, 7, 5
% macro yuv2plane1_mainloop 2
% macro yuv2plane1_mainloop 2
.loop_ % 2 :
.loop_ % 2 :
% if %1 == 8
% if %1 == 8
paddsw m0 , m2 , [ srcq + ds t wq* 2 + mmsize * 0 ]
paddsw m0 , m2 , [ srcq + wq * 2 + mmsize * 0 ]
paddsw m1 , m3 , [ srcq + ds t wq* 2 + mmsize * 1 ]
paddsw m1 , m3 , [ srcq + wq * 2 + mmsize * 1 ]
psraw m0 , 7
psraw m0 , 7
psraw m1 , 7
psraw m1 , 7
packuswb m0 , m1
packuswb m0 , m1
mov % 2 [ r1 + r2 ], m0
mov % 2 [ ds tq + wq ], m0
% elif %1 == 16
% elif %1 == 16
paddd m0 , m4 , [ srcq + ds t wq* 4 + mmsize * 0 ]
paddd m0 , m4 , [ srcq + wq * 4 + mmsize * 0 ]
paddd m1 , m4 , [ srcq + ds t wq* 4 + mmsize * 1 ]
paddd m1 , m4 , [ srcq + wq * 4 + mmsize * 1 ]
paddd m2 , m4 , [ srcq + ds t wq* 4 + mmsize * 2 ]
paddd m2 , m4 , [ srcq + wq * 4 + mmsize * 2 ]
paddd m3 , m4 , [ srcq + ds t wq* 4 + mmsize * 3 ]
paddd m3 , m4 , [ srcq + wq * 4 + mmsize * 3 ]
psrad m0 , 3
psrad m0 , 3
psrad m1 , 3
psrad m1 , 3
psrad m2 , 3
psrad m2 , 3
@ -299,40 +299,40 @@ yuv2planeX_fn 10, 7, 5
paddw m0 , m5
paddw m0 , m5
paddw m2 , m5
paddw m2 , m5
% endif ; mmx/sse2/sse4/avx
% endif ; mmx/sse2/sse4/avx
mov % 2 [ ds tq + ds t wq* 2 + mmsize * 0 ], m0
mov % 2 [ ds tq + wq * 2 + mmsize * 0 ], m0
mov % 2 [ ds tq + ds t wq* 2 + mmsize * 1 ], m2
mov % 2 [ ds tq + wq * 2 + mmsize * 1 ], m2
% else ; %1 == 9/10
% else ; %1 == 9/10
paddsw m0 , m2 , [ srcq + ds t wq* 2 + mmsize * 0 ]
paddsw m0 , m2 , [ srcq + wq * 2 + mmsize * 0 ]
paddsw m1 , m2 , [ srcq + ds t wq* 2 + mmsize * 1 ]
paddsw m1 , m2 , [ srcq + wq * 2 + mmsize * 1 ]
psraw m0 , 15 - % 1
psraw m0 , 15 - % 1
psraw m1 , 15 - % 1
psraw m1 , 15 - % 1
pmaxsw m0 , m4
pmaxsw m0 , m4
pmaxsw m1 , m4
pmaxsw m1 , m4
pminsw m0 , m3
pminsw m0 , m3
pminsw m1 , m3
pminsw m1 , m3
mov % 2 [ ds tq + ds t wq* 2 + mmsize * 0 ], m0
mov % 2 [ ds tq + wq * 2 + mmsize * 0 ], m0
mov % 2 [ ds tq + ds t wq* 2 + mmsize * 1 ], m1
mov % 2 [ ds tq + wq * 2 + mmsize * 1 ], m1
% endif
% endif
add ds t wq, mmsize
add wq , mmsize
jl .loop_ % 2
jl .loop_ % 2
% endmacro
% endmacro
% macro yuv2plane1_fn 3
% macro yuv2plane1_fn 3
cglobal yuv2plane1_ % 1 , % 3 , % 3 , % 2 , src , ds t , ds t w, di ther , offset
cglobal yuv2plane1_ % 1 , % 3 , % 3 , % 2 , src , ds t , w , di ther , offset
movsxdifnidn ds twq , ds t wd
movsxdifnidn wq , wd
add ds t wq, mmsize - 1
add wq , mmsize - 1
and ds t wq, ~ ( mmsize - 1 )
and wq , ~ ( mmsize - 1 )
% if %1 == 8
% if %1 == 8
add ds tq , ds t wq
add ds tq , wq
% else ; %1 != 8
% else ; %1 != 8
lea ds tq , [ ds tq + ds t wq* 2 ]
lea ds tq , [ ds tq + wq * 2 ]
% endif ; %1 == 8
% endif ; %1 == 8
% if %1 == 16
% if %1 == 16
lea srcq , [ srcq + ds t wq* 4 ]
lea srcq , [ srcq + wq * 4 ]
% else ; %1 != 16
% else ; %1 != 16
lea srcq , [ srcq + ds t wq* 2 ]
lea srcq , [ srcq + wq * 2 ]
% endif ; %1 == 16
% endif ; %1 == 16
neg ds t wq
neg wq
% if %1 == 8
% if %1 == 8
pxor m4 , m4 ; zero
pxor m4 , m4 ; zero