@ -21,7 +21,7 @@
% include "libavutil/x86/x86util.asm"
SECTION _RODATA 32
SECTION _RODATA 64
cextern pw_4
% define v210_enc_min_10 pw_4
@ -46,6 +46,16 @@ v210_enc_chroma_shuf2_8: times 2 db 3,-1,4,-1,5,-1,7,-1,11,-1,12,-1,13,-1,15,-1
v210_enc_chroma_mult_8: times 2 dw 4 , 16 , 64 , 0 , 64 , 4 , 16 , 0
v210enc_8_permb: db 32 , 0 , 48 , - 1 , 1 , 33 , 2 , - 1 , 49 , 3 , 34 , - 1 , 4 , 50 , 5 , - 1
db 35 , 6 , 51 , - 1 , 7 , 36 , 8 , - 1 , 52 , 9 , 37 , - 1 , 10 , 53 , 11 , - 1
db 38 , 12 , 54 , - 1 , 13 , 39 , 14 , - 1 , 55 , 15 , 40 , - 1 , 16 , 56 , 17 , - 1
db 41 , 18 , 57 , - 1 , 19 , 42 , 20 , - 1 , 58 , 21 , 43 , - 1 , 22 , 59 , 23 , - 1
v210enc_8_shufb: db 0 , 8 , 1 , - 1 , 9 , 2 , 10 , - 1 , 3 , 11 , 4 , - 1 , 12 , 5 , 13 , - 1
db 2 , 10 , 3 , - 1 , 11 , 4 , 12 , - 1 , 5 , 13 , 6 , - 1 , 14 , 7 , 15 , - 1
v210enc_8_permd: dd 0 , 1 , 4 , 5 , 1 , 2 , 5 , 6
v210enc_8_mult: db 4 , 0 , 64 , 0
v210enc_8_mask: dd 255 << 12
SECTION .text
% macro v210_planar_pack_10 0
@ -178,7 +188,73 @@ INIT_XMM avx
v210_planar_pack_8
% endif
% macro v210_planar_pack_8_new 0
cglobal v210_planar_pack_8 , 5 , 5 , 7 + notcpuflag ( avx512icl ), y , u , v , ds t , width
add yq , widthq
shr widthq , 1
add uq , widthq
add vq , widthq
neg widthq
% if cpuflag(avx512icl)
mova m2 , [ v210enc_8_permb ]
% else
mova m2 , [ v210enc_8_permd ]
% endif
vpbroadcastd m3 , [ v210enc_8_mult ]
VBROADCASTI128 m4 , [ v210_enc_min_8 ] ; only ymm sized
VBROADCASTI128 m5 , [ v210_enc_max_8 ] ; only ymm sized
vpbroadcastd m6 , [ v210enc_8_mask ]
% if notcpuflag(avx512icl)
movu m7 , [ v210enc_8_shufb ]
% endif
.loop:
% if cpuflag(avx512icl)
movu ym1 , [ yq + 2 * widthq ]
vinserti32x4 m1 , [ uq + 1 * widthq ], 2
vinserti32x4 m1 , [ vq + 1 * widthq ], 3
vpermb m1 , m2 , m1 ; uyv0 yuy0 vyu0 yvy0
% else
movq xm0 , [ uq + 1 * widthq ] ; uuuu uuxx
movq xm1 , [ vq + 1 * widthq ] ; vvvv vvxx
punpcklbw xm1 , xm0 , xm1 ; uvuv uvuv uvuv xxxx
vinserti128 m1 , m1 , [ yq + 2 * widthq ], 1 ; uvuv uvuv uvuv xxxx yyyy yyyy yyyy xxxx
vpermd m1 , m2 , m1 ; uvuv uvxx yyyy yyxx xxuv uvuv xxyy yyyy
pshufb m1 , m7 ; uyv0 yuy0 vyu0 yvy0
% endif
CLIPUB m1 , m4 , m5
pmaddubsw m0 , m1 , m3
pslld m1 , 4
% if cpuflag(avx512)
vpternlogd m0 , m1 , m6 , 0xd8 ; C?B:A
% else
pand m1 , m6 , m1
pandn m0 , m6 , m0
por m0 , m0 , m1
% endif
movu [ ds tq ], m0
add ds tq , mmsize
add widthq , ( mmsize * 3 ) / 16
jl .loop
RET
% endmacro
% if HAVE_AVX2_EXTERNAL
INIT_YMM avx2
v210_planar_pack_8
v210_planar_pack_8_new
% endif
% if HAVE_AVX512_EXTERNAL
INIT_YMM avx512
v210_planar_pack_8_new
% endif
% if HAVE_AVX512ICL_EXTERNAL
INIT_ZMM avx512icl
v210_planar_pack_8_new
% endif