swscale/x86/ops: simplify SWS_OP_CLEAR patterns

Mark the components to be cleared, not the components to be preserved.

Signed-off-by: Niklas Haas <git@haasn.dev>
This commit is contained in:
Niklas Haas
2026-03-31 16:24:05 +02:00
parent 08707934cc
commit 96f82f4fbb
2 changed files with 44 additions and 46 deletions

View File

@@ -141,7 +141,7 @@ static int setup_clear(const SwsImplParams *params, SwsImplResult *out)
DECL_ASM(U8, SWS_COMP_ALL, p##X##Y##Z##W##_clear##EXT, \ DECL_ASM(U8, SWS_COMP_ALL, p##X##Y##Z##W##_clear##EXT, \
.op = SWS_OP_CLEAR, \ .op = SWS_OP_CLEAR, \
.setup = setup_clear, \ .setup = setup_clear, \
.clear.mask = SWS_COMP_MASK(!X, !Y, !Z, !W), \ .clear.mask = SWS_COMP_MASK(X, Y, Z, W), \
); );
#define DECL_SWIZZLE(EXT, X, Y, Z, W) \ #define DECL_SWIZZLE(EXT, X, Y, Z, W) \
@@ -589,16 +589,16 @@ static int setup_filter_4x4_h(const SwsImplParams *params, SwsImplResult *out)
DECL_CLEAR_ZERO(EXT, 0) \ DECL_CLEAR_ZERO(EXT, 0) \
DECL_CLEAR_ZERO(EXT, 1) \ DECL_CLEAR_ZERO(EXT, 1) \
DECL_CLEAR_ZERO(EXT, 3) \ DECL_CLEAR_ZERO(EXT, 3) \
DECL_CLEAR(EXT, 1, 1, 1, 0) \ DECL_CLEAR(EXT, 0, 0, 0, 1) \
DECL_CLEAR(EXT, 0, 1, 1, 1) \
DECL_CLEAR(EXT, 0, 0, 1, 1) \
DECL_CLEAR(EXT, 1, 0, 0, 1) \
DECL_CLEAR(EXT, 1, 1, 0, 0) \
DECL_CLEAR(EXT, 0, 1, 0, 1) \
DECL_CLEAR(EXT, 1, 0, 1, 0) \
DECL_CLEAR(EXT, 1, 0, 0, 0) \ DECL_CLEAR(EXT, 1, 0, 0, 0) \
DECL_CLEAR(EXT, 0, 1, 0, 0) \ DECL_CLEAR(EXT, 1, 1, 0, 0) \
DECL_CLEAR(EXT, 0, 0, 1, 0) \ DECL_CLEAR(EXT, 0, 1, 1, 0) \
DECL_CLEAR(EXT, 0, 0, 1, 1) \
DECL_CLEAR(EXT, 1, 0, 1, 0) \
DECL_CLEAR(EXT, 0, 1, 0, 1) \
DECL_CLEAR(EXT, 0, 1, 1, 1) \
DECL_CLEAR(EXT, 1, 0, 1, 1) \
DECL_CLEAR(EXT, 1, 1, 0, 1) \
\ \
static const SwsOpTable ops8##EXT = { \ static const SwsOpTable ops8##EXT = { \
.cpu_flags = AV_CPU_FLAG_##FLAG, \ .cpu_flags = AV_CPU_FLAG_##FLAG, \
@@ -656,16 +656,16 @@ static const SwsOpTable ops8##EXT = {
&op_clear_zero0##EXT, \ &op_clear_zero0##EXT, \
&op_clear_zero1##EXT, \ &op_clear_zero1##EXT, \
&op_clear_zero3##EXT, \ &op_clear_zero3##EXT, \
REF_PATTERN(clear##EXT, 1, 1, 1, 0), \ REF_PATTERN(clear##EXT, 0, 0, 0, 1), \
REF_PATTERN(clear##EXT, 0, 1, 1, 1), \
REF_PATTERN(clear##EXT, 0, 0, 1, 1), \
REF_PATTERN(clear##EXT, 1, 0, 0, 1), \
REF_PATTERN(clear##EXT, 1, 1, 0, 0), \
REF_PATTERN(clear##EXT, 0, 1, 0, 1), \
REF_PATTERN(clear##EXT, 1, 0, 1, 0), \
REF_PATTERN(clear##EXT, 1, 0, 0, 0), \ REF_PATTERN(clear##EXT, 1, 0, 0, 0), \
REF_PATTERN(clear##EXT, 0, 1, 0, 0), \ REF_PATTERN(clear##EXT, 1, 1, 0, 0), \
REF_PATTERN(clear##EXT, 0, 0, 1, 0), \ REF_PATTERN(clear##EXT, 0, 1, 1, 0), \
REF_PATTERN(clear##EXT, 0, 0, 1, 1), \
REF_PATTERN(clear##EXT, 1, 0, 1, 0), \
REF_PATTERN(clear##EXT, 0, 1, 0, 1), \
REF_PATTERN(clear##EXT, 0, 1, 1, 1), \
REF_PATTERN(clear##EXT, 1, 0, 1, 1), \
REF_PATTERN(clear##EXT, 1, 1, 0, 1), \
NULL \ NULL \
}, \ }, \
}; };

View File

@@ -602,47 +602,45 @@ IF V2, mova %3, %2
CONTINUE tmp0q CONTINUE tmp0q
%endmacro %endmacro
; note: the pattern is inverted for these functions; i.e. X=1 implies that we
; *keep* the X component, not that we clear it
%macro clear_generic 0 %macro clear_generic 0
op clear op clear
LOAD_CONT tmp0q LOAD_CONT tmp0q
%if cpuflag(avx2) %if cpuflag(avx2)
IF !X, vpbroadcastd mx, [implq + SwsOpImpl.priv + 0] IF X, vpbroadcastd mx, [implq + SwsOpImpl.priv + 0]
IF !Y, vpbroadcastd my, [implq + SwsOpImpl.priv + 4] IF Y, vpbroadcastd my, [implq + SwsOpImpl.priv + 4]
IF !Z, vpbroadcastd mz, [implq + SwsOpImpl.priv + 8] IF Z, vpbroadcastd mz, [implq + SwsOpImpl.priv + 8]
IF !W, vpbroadcastd mw, [implq + SwsOpImpl.priv + 12] IF W, vpbroadcastd mw, [implq + SwsOpImpl.priv + 12]
%else ; !cpuflag(avx2) %else ; !cpuflag(avx2)
IF !X, movd mx, [implq + SwsOpImpl.priv + 0] IF X, movd mx, [implq + SwsOpImpl.priv + 0]
IF !Y, movd my, [implq + SwsOpImpl.priv + 4] IF Y, movd my, [implq + SwsOpImpl.priv + 4]
IF !Z, movd mz, [implq + SwsOpImpl.priv + 8] IF Z, movd mz, [implq + SwsOpImpl.priv + 8]
IF !W, movd mw, [implq + SwsOpImpl.priv + 12] IF W, movd mw, [implq + SwsOpImpl.priv + 12]
IF !X, pshufd mx, mx, 0 IF X, pshufd mx, mx, 0
IF !Y, pshufd my, my, 0 IF Y, pshufd my, my, 0
IF !Z, pshufd mz, mz, 0 IF Z, pshufd mz, mz, 0
IF !W, pshufd mw, mw, 0 IF W, pshufd mw, mw, 0
%endif %endif
%if V2 %if V2
IF !X, mova mx2, mx IF X, mova mx2, mx
IF !Y, mova my2, my IF Y, mova my2, my
IF !Z, mova mz2, mz IF Z, mova mz2, mz
IF !W, mova mw2, mw IF W, mova mw2, mw
%endif %endif
CONTINUE tmp0q CONTINUE tmp0q
%endmacro %endmacro
%macro clear_funcs 0 %macro clear_funcs 0
decl_pattern 1, 1, 1, 0, clear_generic decl_pattern 0, 0, 0, 1, clear_generic
decl_pattern 0, 1, 1, 1, clear_generic
decl_pattern 0, 0, 1, 1, clear_generic
decl_pattern 1, 0, 1, 1, clear_generic
decl_pattern 1, 0, 0, 1, clear_generic
decl_pattern 1, 1, 0, 0, clear_generic
decl_pattern 0, 1, 0, 1, clear_generic
decl_pattern 1, 0, 1, 0, clear_generic
decl_pattern 1, 0, 0, 0, clear_generic decl_pattern 1, 0, 0, 0, clear_generic
decl_pattern 1, 1, 0, 0, clear_generic
decl_pattern 0, 1, 0, 0, clear_generic decl_pattern 0, 1, 0, 0, clear_generic
decl_pattern 0, 0, 1, 0, clear_generic decl_pattern 0, 1, 1, 0, clear_generic
decl_pattern 0, 0, 1, 1, clear_generic
decl_pattern 1, 0, 1, 0, clear_generic
decl_pattern 0, 1, 0, 1, clear_generic
decl_pattern 0, 1, 1, 1, clear_generic
decl_pattern 1, 0, 1, 1, clear_generic
decl_pattern 1, 1, 0, 1, clear_generic
%endmacro %endmacro
;--------------------------------------------------------- ;---------------------------------------------------------