@ -93,7 +93,7 @@
SBUTTERFLY qdq , % 4 , % 8 , % 2
SWAP % 2 , % 5
SWAP % 4 , % 7
% if 0<11
% if % 0<11
movdqa m % 5 , % 10
% endif
% endif
@ -165,28 +165,203 @@
palignr % 1 , % 2 , % 3
% endmacro
% macro SUMSUB_BA 2
% macro DEINTB 5 ; mask, reg1, mask, reg2, optional src to fill masks from
% ifnum %5
mova m % 1 , m % 5
mova m % 3 , m % 5
% else
mova m % 1 , % 5
mova m % 3 , m % 1
% endif
pand m % 1 , m % 2 ; dst .. y6 .. y4
pand m % 3 , m % 4 ; src .. y6 .. y4
psrlw m % 2 , 8 ; dst .. y7 .. y5
psrlw m % 4 , 8 ; src .. y7 .. y5
% endmacro
% macro SUMSUB_BA 2-3
% if %0==2
paddw % 1 , % 2
paddw % 2 , % 2
psubw % 2 , % 1
% else
mova % 3 , % 1
paddw % 1 , % 2
psubw % 2 , % 3
% endif
% endmacro
% macro SUMSUB_BADC 4
% macro SUMSUB_BADC 4-5
% if %0==5
SUMSUB_BA % 1 , % 2 , % 5
SUMSUB_BA % 3 , % 4 , % 5
% else
paddw % 1 , % 2
paddw % 3 , % 4
paddw % 2 , % 2
paddw % 4 , % 4
psubw % 2 , % 1
psubw % 4 , % 3
% endif
% endmacro
% macro HADAMARD8_1D 8
SUMSUB_BADC % 1 , % 5 , % 2 , % 6
SUMSUB_BADC % 3 , % 7 , % 4 , % 8
% macro HADAMARD4_V 4+
SUMSUB_BADC % 1 , % 2 , % 3 , % 4
SUMSUB_BADC % 1 , % 3 , % 2 , % 4
SUMSUB_BADC % 5 , % 7 , % 6 , % 8
% endmacro
% macro HADAMARD8_V 8+
SUMSUB_BADC % 1 , % 2 , % 3 , % 4
SUMSUB_BADC % 5 , % 6 , % 7 , % 8
SUMSUB_BADC % 1 , % 3 , % 2 , % 4
SUMSUB_BADC % 5 , % 7 , % 6 , % 8
SUMSUB_BADC % 1 , % 5 , % 2 , % 6
SUMSUB_BADC % 3 , % 7 , % 4 , % 8
% endmacro
% macro TRANS_SSE2 5-6
; TRANSPOSE2x2
; %1: transpose width (d/q) - use SBUTTERFLY qdq for dq
; %2: ord/unord (for compat with sse4, unused)
; %3/%4: source regs
; %5/%6: tmp regs
% ifidn %1, d
% define mask [mask_10 GLOBAL]
% define shift 16
% elifidn %1, q
% define mask [mask_1100 GLOBAL]
% define shift 32
% endif
% if %0==6 ; less dependency if we have two tmp
mova m % 5 , mask ; ff00
mova m % 6 , m % 4 ; x5x4
psll % 1 m % 4 , shift ; x4..
pand m % 6 , m % 5 ; x5..
pandn m % 5 , m % 3 ; ..x0
psrl % 1 m % 3 , shift ; ..x1
por m % 4 , m % 5 ; x4x0
por m % 3 , m % 6 ; x5x1
% else ; more dependency, one insn less. sometimes faster, sometimes not
mova m % 5 , m % 4 ; x5x4
psll % 1 m % 4 , shift ; x4..
pxor m % 4 , m % 3 ; (x4^x1)x0
pand m % 4 , mask ; (x4^x1)..
pxor m % 3 , m % 4 ; x4x0
psrl % 1 m % 4 , shift ; ..(x1^x4)
pxor m % 5 , m % 4 ; x5x1
SWAP % 4 , % 3 , % 5
% endif
% endmacro
% macro TRANS_SSE4 5-6 ; see above
% ifidn %1, d
mova m % 5 , m % 3
% ifidn %2, ord
psrl % 1 m % 3 , 16
% endif
pblendw m % 3 , m % 4 , 10101010b
psll % 1 m % 4 , 16
% ifidn %2, ord
pblendw m % 4 , m % 5 , 01010101b
% else
psrl % 1 m % 5 , 16
por m % 4 , m % 5
% endif
% elifidn %1, q
mova m % 5 , m % 3
shufps m % 3 , m % 4 , 10001000b
shufps m % 5 , m % 4 , 11011101b
SWAP % 4 , % 5
% endif
% endmacro
% macro HADAMARD 5-6
; %1=distance in words (0 for vertical pass, 1/2/4 for horizontal passes)
; %2=sumsub/max/amax (sum and diff / maximum / maximum of absolutes)
; %3/%4: regs
; %5(%6): tmpregs
% if %1!=0 ; have to reorder stuff for horizontal op
% ifidn %2, sumsub
% define ORDER ord
; sumsub needs order because a-b != b-a unless a=b
% else
% define ORDER unord
; if we just max, order doesn't matter (allows pblendw+or in sse4)
% endif
% if %1==1
TRANS d , ORDER , % 3 , % 4 , % 5 , % 6
% elif %1==2
% if mmsize==8
SBUTTERFLY dq , % 3 , % 4 , % 5
% else
TRANS q , ORDER , % 3 , % 4 , % 5 , % 6
% endif
% elif %1==4
SBUTTERFLY qdq , % 3 , % 4 , % 5
% endif
% endif
% ifidn %2, sumsub
SUMSUB_BA m % 3 , m % 4 , m % 5
% else
% ifidn %2, amax
% if %0==6
ABS2 m % 3 , m % 4 , m % 5 , m % 6
% else
ABS1 m % 3 , m % 5
ABS1 m % 4 , m % 5
% endif
% endif
pmaxsw m % 3 , m % 4
% endif
% endmacro
% macro HADAMARD2_2D 6-7 sumsub
HADAMARD 0 , sumsub , % 1 , % 2 , % 5
HADAMARD 0 , sumsub , % 3 , % 4 , % 5
SBUTTERFLY % 6 , % 1 , % 2 , % 5
% ifnum %7
HADAMARD 0 , amax , % 1 , % 2 , % 5 , % 7
% else
HADAMARD 0 , % 7 , % 1 , % 2 , % 5
% endif
SBUTTERFLY % 6 , % 3 , % 4 , % 5
% ifnum %7
HADAMARD 0 , amax , % 3 , % 4 , % 5 , % 7
% else
HADAMARD 0 , % 7 , % 3 , % 4 , % 5
% endif
% endmacro
% macro HADAMARD4_2D 5-6 sumsub
HADAMARD2_2D % 1 , % 2 , % 3 , % 4 , % 5 , wd
HADAMARD2_2D % 1 , % 3 , % 2 , % 4 , % 5 , dq , % 6
SWAP % 2 , % 3
% endmacro
% macro HADAMARD4_2D_SSE 5-6 sumsub
HADAMARD 0 , sumsub , % 1 , % 2 , % 5 ; 1st V row 0 + 1
HADAMARD 0 , sumsub , % 3 , % 4 , % 5 ; 1st V row 2 + 3
SBUTTERFLY wd , % 1 , % 2 , % 5 ; %1: m0 1+0 %2: m1 1+0
SBUTTERFLY wd , % 3 , % 4 , % 5 ; %3: m0 3+2 %4: m1 3+2
HADAMARD2_2D % 1 , % 3 , % 2 , % 4 , % 5 , dq
SBUTTERFLY qdq , % 1 , % 2 , % 5
HADAMARD 0 , % 6 , % 1 , % 2 , % 5 ; 2nd H m1/m0 row 0+1
SBUTTERFLY qdq , % 3 , % 4 , % 5
HADAMARD 0 , % 6 , % 3 , % 4 , % 5 ; 2nd H m1/m0 row 2+3
% endmacro
% macro HADAMARD8_2D 9-10 sumsub
HADAMARD2_2D % 1 , % 2 , % 3 , % 4 , % 9 , wd
HADAMARD2_2D % 5 , % 6 , % 7 , % 8 , % 9 , wd
HADAMARD2_2D % 1 , % 3 , % 2 , % 4 , % 9 , dq
HADAMARD2_2D % 5 , % 7 , % 6 , % 8 , % 9 , dq
HADAMARD2_2D % 1 , % 5 , % 3 , % 7 , % 9 , qdq , % 10
HADAMARD2_2D % 2 , % 6 , % 4 , % 8 , % 9 , qdq , % 10
% ifnidn %10, amax
SWAP % 2 , % 5
SWAP % 4 , % 7
% endif
% endmacro
% macro SUMSUB2_AB 3
@ -197,13 +372,49 @@
psubw % 3 , % 2
% endmacro
% macro SUMSUB2_BA 3
mova m % 3 , m % 1
paddw m % 1 , m % 2
paddw m % 1 , m % 2
psubw m % 2 , m % 3
psubw m % 2 , m % 3
% endmacro
% macro SUMSUBD2_AB 4
mova % 4 , % 1
mova % 3 , % 2
psraw % 2 , 1
psraw % 4 , 1
paddw % 1 , % 2
psubw % 4 , % 3
psraw % 1 , 1
paddw % 2 , % 4
psubw % 1 , % 3
% endmacro
% macro DCT4_1D 5
% ifnum %5
SUMSUB_BADC m % 4 , m % 1 , m % 3 , m % 2 ; m%5
SUMSUB_BA m % 3 , m % 4 , m % 5
SUMSUB2_AB m % 1 , m % 2 , m % 5
SWAP % 1 , % 3 , % 4 , % 5 , % 2
% else
SUMSUB_BADC m % 4 , m % 1 , m % 3 , m % 2
SUMSUB_BA m % 3 , m % 4
mova [ % 5 ], m % 2
SUMSUB2_AB m % 1 , [ % 5 ], m % 2
SWAP % 1 , % 3 , % 4 , % 2
% endif
% endmacro
% macro IDCT4_1D 5-6
% ifnum %5
SUMSUBD2_AB m % 2 , m % 4 , m % 6 , m % 5
SUMSUB_BA m % 3 , m % 1 , m % 6
SUMSUB_BADC m % 4 , m % 3 , m % 2 , m % 1 , m % 6
% else
SUMSUBD2_AB m % 2 , m % 4 , [ % 5 ], [ % 5 + 16 ]
SUMSUB_BA m % 3 , m % 1
SUMSUB_BADC m % 4 , m % 3 , m % 2 , m % 1
% endif
SWAP % 1 , % 4 , % 3
% endmacro
% macro LOAD_DIFF 5
@ -222,17 +433,81 @@
% endif
% endmacro
% macro LOAD_DIFF_8x4P 6-8 r0,r2 ; 4x dest, 2x temp, 2x pointer
LOAD_DIFF % 1 , % 5 , none , [ % 7 ], [ % 8 ]
LOAD_DIFF % 2 , % 6 , none , [ % 7 + r1 ], [ % 8 + r3 ]
LOAD_DIFF % 3 , % 5 , none , [ % 7 + 2 * r1 ], [ % 8 + 2 * r3 ]
LOAD_DIFF % 4 , % 6 , none , [ % 7 + r4 ], [ % 8 + r5 ]
% macro LOAD_DIFF8x4_SSE2 8
LOAD_DIFF m % 1 , m % 5 , m % 6 , [ % 7 +% 1 * FENC_STRIDE ], [ % 8 +% 1 * FDEC_STRIDE ]
LOAD_DIFF m % 2 , m % 5 , m % 6 , [ % 7 +% 2 * FENC_STRIDE ], [ % 8 +% 2 * FDEC_STRIDE ]
LOAD_DIFF m % 3 , m % 5 , m % 6 , [ % 7 +% 3 * FENC_STRIDE ], [ % 8 +% 3 * FDEC_STRIDE ]
LOAD_DIFF m % 4 , m % 5 , m % 6 , [ % 7 +% 4 * FENC_STRIDE ], [ % 8 +% 4 * FDEC_STRIDE ]
% endmacro
% macro STORE_DIFF 4
% macro LOAD_DIFF8x4_SSSE3 8 ; 4x dst, 1x tmp, 1x mul, 2x ptr
movh m % 2 , [ % 8 +% 1 * FDEC_STRIDE ]
movh m % 1 , [ % 7 +% 1 * FENC_STRIDE ]
punpcklbw m % 1 , m % 2
movh m % 3 , [ % 8 +% 2 * FDEC_STRIDE ]
movh m % 2 , [ % 7 +% 2 * FENC_STRIDE ]
punpcklbw m % 2 , m % 3
movh m % 4 , [ % 8 +% 3 * FDEC_STRIDE ]
movh m % 3 , [ % 7 +% 3 * FENC_STRIDE ]
punpcklbw m % 3 , m % 4
movh m % 5 , [ % 8 +% 4 * FDEC_STRIDE ]
movh m % 4 , [ % 7 +% 4 * FENC_STRIDE ]
punpcklbw m % 4 , m % 5
pmaddubsw m % 1 , m % 6
pmaddubsw m % 2 , m % 6
pmaddubsw m % 3 , m % 6
pmaddubsw m % 4 , m % 6
% endmacro
% macro STORE_DCT 6
movq [ % 5 +% 6 + 0 ], m % 1
movq [ % 5 +% 6 + 8 ], m % 2
movq [ % 5 +% 6 + 16 ], m % 3
movq [ % 5 +% 6 + 24 ], m % 4
movhps [ % 5 +% 6 + 32 ], m % 1
movhps [ % 5 +% 6 + 40 ], m % 2
movhps [ % 5 +% 6 + 48 ], m % 3
movhps [ % 5 +% 6 + 56 ], m % 4
% endmacro
% macro STORE_IDCT 4
movhps [ r0 - 4 * FDEC_STRIDE ], % 1
movh [ r0 - 3 * FDEC_STRIDE ], % 1
movhps [ r0 - 2 * FDEC_STRIDE ], % 2
movh [ r0 - 1 * FDEC_STRIDE ], % 2
movhps [ r0 + 0 * FDEC_STRIDE ], % 3
movh [ r0 + 1 * FDEC_STRIDE ], % 3
movhps [ r0 + 2 * FDEC_STRIDE ], % 4
movh [ r0 + 3 * FDEC_STRIDE ], % 4
% endmacro
% macro LOAD_DIFF_8x4P 7-10 r0,r2,0 ; 4x dest, 2x temp, 2x pointer, increment?
LOAD_DIFF m % 1 , m % 5 , m % 7 , [ % 8 ], [ % 9 ]
LOAD_DIFF m % 2 , m % 6 , m % 7 , [ % 8 + r1 ], [ % 9 + r3 ]
LOAD_DIFF m % 3 , m % 5 , m % 7 , [ % 8 + 2 * r1 ], [ % 9 + 2 * r3 ]
LOAD_DIFF m % 4 , m % 6 , m % 7 , [ % 8 + r4 ], [ % 9 + r5 ]
% if %10
lea % 8 , [ % 8 + 4 * r1 ]
lea % 9 , [ % 9 + 4 * r3 ]
% endif
% endmacro
% macro DIFFx2 6-7
movh % 3 , % 5
punpcklbw % 3 , % 4
psraw % 1 , 6
paddsw % 1 , % 3
movh % 3 , % 6
punpcklbw % 3 , % 4
psraw % 2 , 6
paddsw % 2 , % 3
packuswb % 2 , % 1
% endmacro
% macro STORE_DIFF 4
movh % 2 , % 4
punpcklbw % 2 , % 3
psraw % 1 , 6
paddsw % 1 , % 2
packuswb % 1 , % 1
movh % 4 , % 1