21#ifndef SWSCALE_UOPS_TMPL_H
22#define SWSCALE_UOPS_TMPL_H
40# define SWS_BLOCK_SIZE 32
50#define SIZEOF_BLOCK (sizeof(pixel_t) * SWS_BLOCK_SIZE)
66# define SWS_LOOP AV_PRAGMA(clang loop vectorize(assume_safety))
67#elif defined(__GNUC__)
68# define SWS_LOOP AV_PRAGMA(GCC ivdep)
74#define bitfn2(name, ext) name ## _ ## ext
75#define bitfn(name, ext) bitfn2(name, ext)
76#define fn(name) bitfn(name, PX)
78#define bump_ptr(ptr, bump) ((pixel_t *) ((uintptr_t) (ptr) + (bump)))
81#define X SWS_COMP_TEST(mask, 0)
82#define Y SWS_COMP_TEST(mask, 1)
83#define Z SWS_COMP_TEST(mask, 2)
84#define W SWS_COMP_TEST(mask, 3)
87#define DECL_FUNC(NAME, ...) \
88 av_always_inline static void \
89 fn(NAME)(SwsOpIter *restrict iter, const SwsOpImpl *restrict impl, \
90 pixel_t *restrict x, pixel_t *restrict y, \
91 pixel_t *restrict z, pixel_t *restrict w, \
94#define DECL_READ(NAME, ...) \
95 DECL_FUNC(NAME, __VA_ARGS__, \
96 const pixel_t *restrict in0, const pixel_t *restrict in1, \
97 const pixel_t *restrict in2, const pixel_t *restrict in3) \
99#define DECL_WRITE(NAME, ...) \
100 DECL_FUNC(NAME, __VA_ARGS__, \
101 pixel_t *restrict out0, pixel_t *restrict out1, \
102 pixel_t *restrict out2, pixel_t *restrict out3) \
104#define CALL(NAME, ...) fn(NAME)(iter, impl, x, y, z, w, __VA_ARGS__)
107#define CONTINUE(...) \
108 ((void (*)(SwsOpIter *, const SwsOpImpl *, \
109 void *restrict x, void *restrict y, \
110 void *restrict z, void *restrict w)) impl->cont) \
111 (iter, &impl[1], __VA_ARGS__)
114#define DECL_SETUP(NAME, PARAMS, OUT) \
115 av_unused static int fn(NAME)(const SwsImplParams *PARAMS, \
119#define DECL_IMPL(FUNC, NAME, TYPE, UOP, ...) \
120 av_flatten static void NAME##_c(SwsOpIter *restrict iter, \
121 const SwsOpImpl *restrict impl, \
122 void *restrict x, void *restrict y, \
123 void *restrict z, void *restrict w) \
125 CALL(FUNC, __VA_ARGS__); \
128#define DECL_IMPL_READ(...) \
129 DECL_IMPL(__VA_ARGS__, \
130 (const pixel_t *) iter->in[0], (const pixel_t *) iter->in[1], \
131 (const pixel_t *) iter->in[2], (const pixel_t *) iter->in[3])
133#define DECL_IMPL_WRITE(...) \
134 DECL_IMPL(__VA_ARGS__, \
135 (pixel_t *) iter->out[0], (pixel_t *) iter->out[1], \
136 (pixel_t *) iter->out[2], (pixel_t *) iter->out[3])
138#define REF_ENTRY(DUMMY, NAME, ...) &uop_##NAME,
139#define DECL_ENTRY(SETUP, NAME, ...) \
140 static const SwsUOpEntry uop_##NAME = { \
141 .func = (SwsFuncPtr) NAME##_c, \
Macro definitions for various function/variable attributes.
Copyright (C) 2026 Niklas Haas.
Internal context holding per-iter execution data.
uint32_t u32[SWS_BLOCK_SIZE]
float f32[SWS_BLOCK_SIZE]
uint16_t u16[SWS_BLOCK_SIZE]
uint8_t u8[SWS_BLOCK_SIZE]
#define SWS_BLOCK_SIZE
Copyright (C) 2026 Niklas Haas.