1
0
mirror of https://github.com/FFmpeg/FFmpeg.git synced 2026-06-19 19:03:00 +02:00

swscale/uops: add SWS_UOP_MOVE for optimal register-register swizzles

This decomposes a swizzle mask into a series of optimal register-register
moves, using at most two temporary scratch registers.

This is a better match for ASM-style backends than the existing PERMUTE/COPY
uops that are designed for the needs of the C backend (or other backends which
either apply the swizzle mask directly or permute pointers).

I originally had logic equivalent to this written in NASM macros, but it was
just such a complicated mess that I think it's better to rewrite it in C and
have the resulting metadata be an explicit part of the uop definition.

This commit only adds the uop, I'll update the x86 implementation in the
next step.

Co-authored-by: Ramiro Polla <ramiro.polla@gmail.com>
Signed-off-by: Niklas Haas <git@haasn.dev>
This commit is contained in:
Niklas Haas
2026-06-09 01:48:24 +02:00
parent 228ef8d97b
commit 36004d681f
3 changed files with 316 additions and 3 deletions
+115 -3
View File
@@ -60,6 +60,7 @@ static const struct {
UOP_NAME(WRITE_BIT, "write_bit"),
UOP_NAME(PERMUTE, "permute"),
UOP_NAME(COPY, "copy"),
UOP_NAME(MOVE, "move"),
UOP_NAME(SWAP_BYTES, "swap_bytes"),
UOP_NAME(EXPAND_BIT, "expand_bit"),
UOP_NAME(EXPAND_PAIR, "expand_pair"),
@@ -161,6 +162,14 @@ void ff_sws_uop_name(const SwsUOp *op, char buf[SWS_UOP_NAME_MAX])
av_bprint_chars(&bp, "xyzw"[par->swizzle.in[i]], 1);
}
break;
case SWS_UOP_MOVE:
av_bprint_chars(&bp, '_', 1);
for (int i = 0; i < par->move.num_moves; i++)
av_bprint_chars(&bp, "txyzw"[par->move.dst[i] + 1], 1);
av_bprint_chars(&bp, '_', 1);
for (int i = 0; i < par->move.num_moves; i++)
av_bprint_chars(&bp, "txyzw"[par->move.src[i] + 1], 1);
break;
case SWS_UOP_PACK:
case SWS_UOP_UNPACK:
av_bprint_chars(&bp, '_', 1);
@@ -239,6 +248,15 @@ static int generate_entry_struct(void *opaque, void *key)
par->swizzle.in[0], par->swizzle.in[1],
par->swizzle.in[2], par->swizzle.in[3]);
break;
case SWS_UOP_MOVE:
av_bprintf(bp, ", .par.move.num_moves = %d", par->move.num_moves);
av_bprintf(bp, ", .par.move.dst = {%d, %d, %d, %d, %d, %d}",
par->move.dst[0], par->move.dst[1], par->move.dst[2],
par->move.dst[3], par->move.dst[4], par->move.dst[5]);
av_bprintf(bp, ", .par.move.src = {%d, %d, %d, %d, %d, %d}",
par->move.src[0], par->move.src[1], par->move.src[2],
par->move.src[3], par->move.src[4], par->move.src[5]);
break;
case SWS_UOP_PACK:
case SWS_UOP_UNPACK:
av_bprintf(bp, ", .par.pack.pattern = {%d, %d, %d, %d}",
@@ -295,6 +313,15 @@ static int generate_entry_args(void *opaque, void *key)
par->swizzle.in[0], par->swizzle.in[1],
par->swizzle.in[2], par->swizzle.in[3]);
break;
case SWS_UOP_MOVE:
av_bprintf(bp, ", %d", par->move.num_moves);
av_bprintf(bp, ", %d, %d, %d, %d, %d, %d",
par->move.dst[0], par->move.dst[1], par->move.dst[2],
par->move.dst[3], par->move.dst[4], par->move.dst[5]);
av_bprintf(bp, ", %d, %d, %d, %d, %d, %d",
par->move.src[0], par->move.src[1], par->move.src[2],
par->move.src[3], par->move.src[4], par->move.src[5]);
break;
case SWS_UOP_PACK:
case SWS_UOP_UNPACK:
av_bprintf(bp, ", %d, %d, %d, %d",
@@ -480,8 +507,93 @@ static int translate_rw_op(SwsContext *ctx, SwsUOpList *ops, SwsUOpFlags flags,
return ff_sws_uop_list_append(ops, &uop);
}
static int translate_swizzle(SwsUOpList *ops, const SwsOp *op)
static int count_idx(const int *arr, size_t size, int val)
{
int num = 0;
for (size_t i = 0; i < size; i++) {
if (arr[i] == val)
num++;
}
return num;
}
static int translate_move(SwsUOpList *ops, const SwsOp *op)
{
SwsUOp uop = {
.uop = SWS_UOP_MOVE,
.type = pixel_type_to_int(op->type),
};
SwsMoveUOp *par = &uop.par.move;
/* Mask of components that are not yet satisfied */
SwsCompMask todo = ff_sws_comp_mask_needed(op);
for (int i = 0; i < 4; i++) {
if (op->swizzle.in[i] == i)
todo &= ~SWS_COMP(i);
}
/* Mask of components whose value is required for the final output */
SwsCompMask needed = 0;
for (int i = 0; i < 4; i++) {
if (SWS_OP_NEEDED(op, i))
needed |= SWS_COMP(op->swizzle.in[i]);
}
/* Current mapping of registers to components */
int idx[4 + 1] = { 0, 1, 2, 3, -1 }; /* +1 for tmp */
/* Decompose the swizzle mask into a series of register-register moves */
while (todo) {
int dst = -1, src = -1;
/* Find next unsatisfied dst <- src move that doesn't clobber a value */
for (dst = 0; dst < 4; dst++) {
if (!SWS_COMP_TEST(todo, dst))
continue; /* already satisfied */
const int cur = idx[dst];
if (count_idx(idx, FF_ARRAY_ELEMS(idx), cur) == 1 && SWS_COMP_TEST(needed, cur))
continue; /* clobbers last remaining, still-needed value */
for (src = 0; src < FF_ARRAY_ELEMS(idx); src++) {
if (idx[src] == op->swizzle.in[dst]) {
/* Prevent read-after-write dependency. */
if (par->num_moves > 0 && src == par->dst[par->num_moves - 1])
src = par->src[par->num_moves - 1];
break;
}
}
av_assert1(src < FF_ARRAY_ELEMS(idx));
todo &= ~SWS_COMP(dst);
break;
}
if (dst == 4) {
/* Stuck in a cycle, break it by saving to the scratch register */
dst = 4;
for (src = 0; src < 4; src++) {
if (SWS_COMP_TEST(todo, src)) {
needed &= ~SWS_COMP(idx[src]);
break;
}
}
av_assert1(src < 4);
}
av_assert0(par->num_moves < SWS_UOP_MOVE_MAX);
par->dst[par->num_moves] = dst > 3 ? -1 : dst;
par->src[par->num_moves] = src > 3 ? -1 : src;
par->num_moves++;
idx[dst] = idx[src];
}
return ff_sws_uop_list_append(ops, &uop);
}
static int translate_swizzle(SwsUOpList *ops, SwsUOpFlags flags, const SwsOp *op)
{
if (flags & SWS_UOP_FLAG_MOVE)
return translate_move(ops, op);
SwsUOp uop = {
.type = pixel_type_to_int(op->type),
.uop = SWS_UOP_PERMUTE,
@@ -645,7 +757,7 @@ static int translate_op(SwsContext *ctx, SwsUOpList *uops, SwsUOpFlags flags,
case SWS_OP_WRITE:
return translate_rw_op(ctx, uops, flags, op);
case SWS_OP_SWIZZLE:
return translate_swizzle(uops, op);
return translate_swizzle(uops, flags, op);
case SWS_OP_DITHER:
return translate_dither_op(uops, op);
case SWS_OP_LINEAR:
@@ -793,7 +905,7 @@ fail:
static const SwsUOpFlags uop_flags[] = {
0,
SWS_UOP_FLAG_FMA, /* x86 backend */
SWS_UOP_FLAG_FMA | SWS_UOP_FLAG_MOVE, /* x86 backend */
};
static int register_uops(SwsContext *ctx, const SwsOpList *ops,
+13
View File
@@ -82,6 +82,7 @@ typedef uint32_t SwsUOpFlags;
typedef enum SwsUOpFlagBits {
SWS_UOP_FLAG_NONE = 0,
SWS_UOP_FLAG_FMA = (1 << 0), /* platform supports FMA ops */
SWS_UOP_FLAG_MOVE = (1 << 1), /* platform supports SWS_UOP_MOVE */
} SwsUOpFlagBits;
typedef enum SwsUOpType {
@@ -104,6 +105,7 @@ typedef enum SwsUOpType {
/* Data rearrangement uops; mask = non-trivial and needed components */
SWS_UOP_PERMUTE, /* rearrange components (no duplicates) */
SWS_UOP_COPY, /* copy/duplicate components */
SWS_UOP_MOVE, /* series of register-register assignments */
/* Data conversion / manipulation uops; mask = affected components */
SWS_UOP_SWAP_BYTES, /* swap byte order in components */
@@ -147,6 +149,16 @@ typedef struct SwsSwizzleUOp {
uint8_t in[4]; /* input component for each output component */
} SwsSwizzleUOp;
typedef struct SwsMoveUOp {
/* The worst case number of moves (for two independent cycles) */
#define SWS_UOP_MOVE_MAX 6
int num_moves;
/* This may involve a temporary register (index -1) */
int8_t dst[SWS_UOP_MOVE_MAX]; /* destination register index */
int8_t src[SWS_UOP_MOVE_MAX]; /* source register index */
} SwsMoveUOp;
typedef struct SwsPackUOp {
uint8_t pattern[4]; /* bit depth pattern, from MSB to LSB */
} SwsPackUOp;
@@ -179,6 +191,7 @@ typedef union SwsUOpParams {
SwsFilterUOp filter; /* for SWS_UOP_READ_*_FV/FH */
SwsShiftUOp shift;
SwsSwizzleUOp swizzle;
SwsMoveUOp move;
SwsPackUOp pack;
SwsClearUOp clear;
SwsLinearUOp lin;
+188
View File
@@ -173,6 +173,76 @@
MACRO(__VA_ARGS__, u8_copy_yzw_xxx , .type = SWS_PIXEL_U8 , .uop = SWS_UOP_COPY , .mask = 0xe, .par.swizzle.in = {0, 0, 0, 0}) \
MACRO(__VA_ARGS__, u8_copy_yzw_xxy , .type = SWS_PIXEL_U8 , .uop = SWS_UOP_COPY , .mask = 0xe, .par.swizzle.in = {0, 0, 0, 1}) \
MACRO(__VA_ARGS__, u8_copy_xyzw_yxxx , .type = SWS_PIXEL_U8 , .uop = SWS_UOP_COPY , .mask = 0xf, .par.swizzle.in = {1, 0, 0, 0})
#define SWS_FOR_U8_MOVE(MACRO, ...) \
MACRO(__VA_ARGS__, u8_move_x_y , SWS_PIXEL_U8 , SWS_UOP_MOVE , 0x0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0) \
MACRO(__VA_ARGS__, u8_move_x_z , SWS_PIXEL_U8 , SWS_UOP_MOVE , 0x0, 1, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0) \
MACRO(__VA_ARGS__, u8_move_x_w , SWS_PIXEL_U8 , SWS_UOP_MOVE , 0x0, 1, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0) \
MACRO(__VA_ARGS__, u8_move_y_x , SWS_PIXEL_U8 , SWS_UOP_MOVE , 0x0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0) \
MACRO(__VA_ARGS__, u8_move_y_w , SWS_PIXEL_U8 , SWS_UOP_MOVE , 0x0, 1, 1, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0) \
MACRO(__VA_ARGS__, u8_move_z_x , SWS_PIXEL_U8 , SWS_UOP_MOVE , 0x0, 1, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0) \
MACRO(__VA_ARGS__, u8_move_w_x , SWS_PIXEL_U8 , SWS_UOP_MOVE , 0x0, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0) \
MACRO(__VA_ARGS__, u8_move_xy_yw , SWS_PIXEL_U8 , SWS_UOP_MOVE , 0x0, 2, 0, 1, 0, 0, 0, 0, 1, 3, 0, 0, 0, 0) \
MACRO(__VA_ARGS__, u8_move_xy_zw , SWS_PIXEL_U8 , SWS_UOP_MOVE , 0x0, 2, 0, 1, 0, 0, 0, 0, 2, 3, 0, 0, 0, 0) \
MACRO(__VA_ARGS__, u8_move_yx_xw , SWS_PIXEL_U8 , SWS_UOP_MOVE , 0x0, 2, 1, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0) \
MACRO(__VA_ARGS__, u8_move_yz_xx , SWS_PIXEL_U8 , SWS_UOP_MOVE , 0x0, 2, 1, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0) \
MACRO(__VA_ARGS__, u8_move_wz_zx , SWS_PIXEL_U8 , SWS_UOP_MOVE , 0x0, 2, 3, 2, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0) \
MACRO(__VA_ARGS__, u8_move_xyz_yzw , SWS_PIXEL_U8 , SWS_UOP_MOVE , 0x0, 3, 0, 1, 2, 0, 0, 0, 1, 2, 3, 0, 0, 0) \
MACRO(__VA_ARGS__, u8_move_xzy_zyw , SWS_PIXEL_U8 , SWS_UOP_MOVE , 0x0, 3, 0, 2, 1, 0, 0, 0, 2, 1, 3, 0, 0, 0) \
MACRO(__VA_ARGS__, u8_move_yzw_xxx , SWS_PIXEL_U8 , SWS_UOP_MOVE , 0x0, 3, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0) \
MACRO(__VA_ARGS__, u8_move_zwy_xyx , SWS_PIXEL_U8 , SWS_UOP_MOVE , 0x0, 3, 2, 3, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0) \
MACRO(__VA_ARGS__, u8_move_wyz_yzx , SWS_PIXEL_U8 , SWS_UOP_MOVE , 0x0, 3, 3, 1, 2, 0, 0, 0, 1, 2, 0, 0, 0, 0) \
MACRO(__VA_ARGS__, u8_move_wzy_zyx , SWS_PIXEL_U8 , SWS_UOP_MOVE , 0x0, 3, 3, 2, 1, 0, 0, 0, 2, 1, 0, 0, 0, 0) \
MACRO(__VA_ARGS__, u8_move_txy_xyt , SWS_PIXEL_U8 , SWS_UOP_MOVE , 0x0, 3, -1, 0, 1, 0, 0, 0, 0, 1, -1, 0, 0, 0) \
MACRO(__VA_ARGS__, u8_move_txz_xzt , SWS_PIXEL_U8 , SWS_UOP_MOVE , 0x0, 3, -1, 0, 2, 0, 0, 0, 0, 2, -1, 0, 0, 0) \
MACRO(__VA_ARGS__, u8_move_tyz_yzt , SWS_PIXEL_U8 , SWS_UOP_MOVE , 0x0, 3, -1, 1, 2, 0, 0, 0, 1, 2, -1, 0, 0, 0) \
MACRO(__VA_ARGS__, u8_move_tyw_ywt , SWS_PIXEL_U8 , SWS_UOP_MOVE , 0x0, 3, -1, 1, 3, 0, 0, 0, 1, 3, -1, 0, 0, 0) \
MACRO(__VA_ARGS__, u8_move_xtyz_wyzt , SWS_PIXEL_U8 , SWS_UOP_MOVE , 0x0, 4, 0, -1, 1, 2, 0, 0, 3, 1, 2, -1, 0, 0) \
MACRO(__VA_ARGS__, u8_move_zxyw_xyzz , SWS_PIXEL_U8 , SWS_UOP_MOVE , 0x0, 4, 2, 0, 1, 3, 0, 0, 0, 1, 2, 2, 0, 0) \
MACRO(__VA_ARGS__, u8_move_wtyz_xyzt , SWS_PIXEL_U8 , SWS_UOP_MOVE , 0x0, 4, 3, -1, 1, 2, 0, 0, 0, 1, 2, -1, 0, 0) \
MACRO(__VA_ARGS__, u8_move_txyz_xyzt , SWS_PIXEL_U8 , SWS_UOP_MOVE , 0x0, 4, -1, 0, 1, 2, 0, 0, 0, 1, 2, -1, 0, 0) \
MACRO(__VA_ARGS__, u8_move_txzy_xzyt , SWS_PIXEL_U8 , SWS_UOP_MOVE , 0x0, 4, -1, 0, 2, 1, 0, 0, 0, 2, 1, -1, 0, 0) \
MACRO(__VA_ARGS__, u8_move_txzw_xzwt , SWS_PIXEL_U8 , SWS_UOP_MOVE , 0x0, 4, -1, 0, 2, 3, 0, 0, 0, 2, 3, -1, 0, 0) \
MACRO(__VA_ARGS__, u8_move_txwz_xwzt , SWS_PIXEL_U8 , SWS_UOP_MOVE , 0x0, 4, -1, 0, 3, 2, 0, 0, 0, 3, 2, -1, 0, 0) \
MACRO(__VA_ARGS__, u8_move_tyzw_yzwt , SWS_PIXEL_U8 , SWS_UOP_MOVE , 0x0, 4, -1, 1, 2, 3, 0, 0, 1, 2, 3, -1, 0, 0) \
MACRO(__VA_ARGS__, u8_move_txyzw_xyzwt , SWS_PIXEL_U8 , SWS_UOP_MOVE , 0x0, 5, -1, 0, 1, 2, 3, 0, 0, 1, 2, 3, -1, 0) \
MACRO(__VA_ARGS__, u8_move_txwyz_xwyzt , SWS_PIXEL_U8 , SWS_UOP_MOVE , 0x0, 5, -1, 0, 3, 1, 2, 0, 0, 3, 1, 2, -1, 0) \
MACRO(__VA_ARGS__, u8_move_txwzy_xwzyt , SWS_PIXEL_U8 , SWS_UOP_MOVE , 0x0, 5, -1, 0, 3, 2, 1, 0, 0, 3, 2, 1, -1, 0) \
MACRO(__VA_ARGS__, u8_move_txwtyz_xwtyzt , SWS_PIXEL_U8 , SWS_UOP_MOVE , 0x0, 6, -1, 0, 3, -1, 1, 2, 0, 3, -1, 1, 2, -1)
#define SWS_FOR_STRUCT_U8_MOVE(MACRO, ...) \
MACRO(__VA_ARGS__, u8_move_x_y , .type = SWS_PIXEL_U8 , .uop = SWS_UOP_MOVE , .mask = 0x0, .par.move.num_moves = 1, .par.move.dst = {0, 0, 0, 0, 0, 0}, .par.move.src = {1, 0, 0, 0, 0, 0}) \
MACRO(__VA_ARGS__, u8_move_x_z , .type = SWS_PIXEL_U8 , .uop = SWS_UOP_MOVE , .mask = 0x0, .par.move.num_moves = 1, .par.move.dst = {0, 0, 0, 0, 0, 0}, .par.move.src = {2, 0, 0, 0, 0, 0}) \
MACRO(__VA_ARGS__, u8_move_x_w , .type = SWS_PIXEL_U8 , .uop = SWS_UOP_MOVE , .mask = 0x0, .par.move.num_moves = 1, .par.move.dst = {0, 0, 0, 0, 0, 0}, .par.move.src = {3, 0, 0, 0, 0, 0}) \
MACRO(__VA_ARGS__, u8_move_y_x , .type = SWS_PIXEL_U8 , .uop = SWS_UOP_MOVE , .mask = 0x0, .par.move.num_moves = 1, .par.move.dst = {1, 0, 0, 0, 0, 0}, .par.move.src = {0, 0, 0, 0, 0, 0}) \
MACRO(__VA_ARGS__, u8_move_y_w , .type = SWS_PIXEL_U8 , .uop = SWS_UOP_MOVE , .mask = 0x0, .par.move.num_moves = 1, .par.move.dst = {1, 0, 0, 0, 0, 0}, .par.move.src = {3, 0, 0, 0, 0, 0}) \
MACRO(__VA_ARGS__, u8_move_z_x , .type = SWS_PIXEL_U8 , .uop = SWS_UOP_MOVE , .mask = 0x0, .par.move.num_moves = 1, .par.move.dst = {2, 0, 0, 0, 0, 0}, .par.move.src = {0, 0, 0, 0, 0, 0}) \
MACRO(__VA_ARGS__, u8_move_w_x , .type = SWS_PIXEL_U8 , .uop = SWS_UOP_MOVE , .mask = 0x0, .par.move.num_moves = 1, .par.move.dst = {3, 0, 0, 0, 0, 0}, .par.move.src = {0, 0, 0, 0, 0, 0}) \
MACRO(__VA_ARGS__, u8_move_xy_yw , .type = SWS_PIXEL_U8 , .uop = SWS_UOP_MOVE , .mask = 0x0, .par.move.num_moves = 2, .par.move.dst = {0, 1, 0, 0, 0, 0}, .par.move.src = {1, 3, 0, 0, 0, 0}) \
MACRO(__VA_ARGS__, u8_move_xy_zw , .type = SWS_PIXEL_U8 , .uop = SWS_UOP_MOVE , .mask = 0x0, .par.move.num_moves = 2, .par.move.dst = {0, 1, 0, 0, 0, 0}, .par.move.src = {2, 3, 0, 0, 0, 0}) \
MACRO(__VA_ARGS__, u8_move_yx_xw , .type = SWS_PIXEL_U8 , .uop = SWS_UOP_MOVE , .mask = 0x0, .par.move.num_moves = 2, .par.move.dst = {1, 0, 0, 0, 0, 0}, .par.move.src = {0, 3, 0, 0, 0, 0}) \
MACRO(__VA_ARGS__, u8_move_yz_xx , .type = SWS_PIXEL_U8 , .uop = SWS_UOP_MOVE , .mask = 0x0, .par.move.num_moves = 2, .par.move.dst = {1, 2, 0, 0, 0, 0}, .par.move.src = {0, 0, 0, 0, 0, 0}) \
MACRO(__VA_ARGS__, u8_move_wz_zx , .type = SWS_PIXEL_U8 , .uop = SWS_UOP_MOVE , .mask = 0x0, .par.move.num_moves = 2, .par.move.dst = {3, 2, 0, 0, 0, 0}, .par.move.src = {2, 0, 0, 0, 0, 0}) \
MACRO(__VA_ARGS__, u8_move_xyz_yzw , .type = SWS_PIXEL_U8 , .uop = SWS_UOP_MOVE , .mask = 0x0, .par.move.num_moves = 3, .par.move.dst = {0, 1, 2, 0, 0, 0}, .par.move.src = {1, 2, 3, 0, 0, 0}) \
MACRO(__VA_ARGS__, u8_move_xzy_zyw , .type = SWS_PIXEL_U8 , .uop = SWS_UOP_MOVE , .mask = 0x0, .par.move.num_moves = 3, .par.move.dst = {0, 2, 1, 0, 0, 0}, .par.move.src = {2, 1, 3, 0, 0, 0}) \
MACRO(__VA_ARGS__, u8_move_yzw_xxx , .type = SWS_PIXEL_U8 , .uop = SWS_UOP_MOVE , .mask = 0x0, .par.move.num_moves = 3, .par.move.dst = {1, 2, 3, 0, 0, 0}, .par.move.src = {0, 0, 0, 0, 0, 0}) \
MACRO(__VA_ARGS__, u8_move_zwy_xyx , .type = SWS_PIXEL_U8 , .uop = SWS_UOP_MOVE , .mask = 0x0, .par.move.num_moves = 3, .par.move.dst = {2, 3, 1, 0, 0, 0}, .par.move.src = {0, 1, 0, 0, 0, 0}) \
MACRO(__VA_ARGS__, u8_move_wyz_yzx , .type = SWS_PIXEL_U8 , .uop = SWS_UOP_MOVE , .mask = 0x0, .par.move.num_moves = 3, .par.move.dst = {3, 1, 2, 0, 0, 0}, .par.move.src = {1, 2, 0, 0, 0, 0}) \
MACRO(__VA_ARGS__, u8_move_wzy_zyx , .type = SWS_PIXEL_U8 , .uop = SWS_UOP_MOVE , .mask = 0x0, .par.move.num_moves = 3, .par.move.dst = {3, 2, 1, 0, 0, 0}, .par.move.src = {2, 1, 0, 0, 0, 0}) \
MACRO(__VA_ARGS__, u8_move_txy_xyt , .type = SWS_PIXEL_U8 , .uop = SWS_UOP_MOVE , .mask = 0x0, .par.move.num_moves = 3, .par.move.dst = {-1, 0, 1, 0, 0, 0}, .par.move.src = {0, 1, -1, 0, 0, 0}) \
MACRO(__VA_ARGS__, u8_move_txz_xzt , .type = SWS_PIXEL_U8 , .uop = SWS_UOP_MOVE , .mask = 0x0, .par.move.num_moves = 3, .par.move.dst = {-1, 0, 2, 0, 0, 0}, .par.move.src = {0, 2, -1, 0, 0, 0}) \
MACRO(__VA_ARGS__, u8_move_tyz_yzt , .type = SWS_PIXEL_U8 , .uop = SWS_UOP_MOVE , .mask = 0x0, .par.move.num_moves = 3, .par.move.dst = {-1, 1, 2, 0, 0, 0}, .par.move.src = {1, 2, -1, 0, 0, 0}) \
MACRO(__VA_ARGS__, u8_move_tyw_ywt , .type = SWS_PIXEL_U8 , .uop = SWS_UOP_MOVE , .mask = 0x0, .par.move.num_moves = 3, .par.move.dst = {-1, 1, 3, 0, 0, 0}, .par.move.src = {1, 3, -1, 0, 0, 0}) \
MACRO(__VA_ARGS__, u8_move_xtyz_wyzt , .type = SWS_PIXEL_U8 , .uop = SWS_UOP_MOVE , .mask = 0x0, .par.move.num_moves = 4, .par.move.dst = {0, -1, 1, 2, 0, 0}, .par.move.src = {3, 1, 2, -1, 0, 0}) \
MACRO(__VA_ARGS__, u8_move_zxyw_xyzz , .type = SWS_PIXEL_U8 , .uop = SWS_UOP_MOVE , .mask = 0x0, .par.move.num_moves = 4, .par.move.dst = {2, 0, 1, 3, 0, 0}, .par.move.src = {0, 1, 2, 2, 0, 0}) \
MACRO(__VA_ARGS__, u8_move_wtyz_xyzt , .type = SWS_PIXEL_U8 , .uop = SWS_UOP_MOVE , .mask = 0x0, .par.move.num_moves = 4, .par.move.dst = {3, -1, 1, 2, 0, 0}, .par.move.src = {0, 1, 2, -1, 0, 0}) \
MACRO(__VA_ARGS__, u8_move_txyz_xyzt , .type = SWS_PIXEL_U8 , .uop = SWS_UOP_MOVE , .mask = 0x0, .par.move.num_moves = 4, .par.move.dst = {-1, 0, 1, 2, 0, 0}, .par.move.src = {0, 1, 2, -1, 0, 0}) \
MACRO(__VA_ARGS__, u8_move_txzy_xzyt , .type = SWS_PIXEL_U8 , .uop = SWS_UOP_MOVE , .mask = 0x0, .par.move.num_moves = 4, .par.move.dst = {-1, 0, 2, 1, 0, 0}, .par.move.src = {0, 2, 1, -1, 0, 0}) \
MACRO(__VA_ARGS__, u8_move_txzw_xzwt , .type = SWS_PIXEL_U8 , .uop = SWS_UOP_MOVE , .mask = 0x0, .par.move.num_moves = 4, .par.move.dst = {-1, 0, 2, 3, 0, 0}, .par.move.src = {0, 2, 3, -1, 0, 0}) \
MACRO(__VA_ARGS__, u8_move_txwz_xwzt , .type = SWS_PIXEL_U8 , .uop = SWS_UOP_MOVE , .mask = 0x0, .par.move.num_moves = 4, .par.move.dst = {-1, 0, 3, 2, 0, 0}, .par.move.src = {0, 3, 2, -1, 0, 0}) \
MACRO(__VA_ARGS__, u8_move_tyzw_yzwt , .type = SWS_PIXEL_U8 , .uop = SWS_UOP_MOVE , .mask = 0x0, .par.move.num_moves = 4, .par.move.dst = {-1, 1, 2, 3, 0, 0}, .par.move.src = {1, 2, 3, -1, 0, 0}) \
MACRO(__VA_ARGS__, u8_move_txyzw_xyzwt , .type = SWS_PIXEL_U8 , .uop = SWS_UOP_MOVE , .mask = 0x0, .par.move.num_moves = 5, .par.move.dst = {-1, 0, 1, 2, 3, 0}, .par.move.src = {0, 1, 2, 3, -1, 0}) \
MACRO(__VA_ARGS__, u8_move_txwyz_xwyzt , .type = SWS_PIXEL_U8 , .uop = SWS_UOP_MOVE , .mask = 0x0, .par.move.num_moves = 5, .par.move.dst = {-1, 0, 3, 1, 2, 0}, .par.move.src = {0, 3, 1, 2, -1, 0}) \
MACRO(__VA_ARGS__, u8_move_txwzy_xwzyt , .type = SWS_PIXEL_U8 , .uop = SWS_UOP_MOVE , .mask = 0x0, .par.move.num_moves = 5, .par.move.dst = {-1, 0, 3, 2, 1, 0}, .par.move.src = {0, 3, 2, 1, -1, 0}) \
MACRO(__VA_ARGS__, u8_move_txwtyz_xwtyzt , .type = SWS_PIXEL_U8 , .uop = SWS_UOP_MOVE , .mask = 0x0, .par.move.num_moves = 6, .par.move.dst = {-1, 0, 3, -1, 1, 2}, .par.move.src = {0, 3, -1, 1, 2, -1})
#define SWS_FOR_U8_SWAP_BYTES(MACRO, ...)
#define SWS_FOR_STRUCT_U8_SWAP_BYTES(MACRO, ...)
#define SWS_FOR_U8_EXPAND_BIT(MACRO, ...) \
@@ -421,6 +491,56 @@
#define SWS_FOR_STRUCT_U16_COPY(MACRO, ...) \
MACRO(__VA_ARGS__, u16_copy_yz_xx , .type = SWS_PIXEL_U16, .uop = SWS_UOP_COPY , .mask = 0x6, .par.swizzle.in = {0, 0, 0, 3}) \
MACRO(__VA_ARGS__, u16_copy_yzw_xxy , .type = SWS_PIXEL_U16, .uop = SWS_UOP_COPY , .mask = 0xe, .par.swizzle.in = {0, 0, 0, 1})
#define SWS_FOR_U16_MOVE(MACRO, ...) \
MACRO(__VA_ARGS__, u16_move_x_y , SWS_PIXEL_U16, SWS_UOP_MOVE , 0x0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0) \
MACRO(__VA_ARGS__, u16_move_x_z , SWS_PIXEL_U16, SWS_UOP_MOVE , 0x0, 1, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0) \
MACRO(__VA_ARGS__, u16_move_x_w , SWS_PIXEL_U16, SWS_UOP_MOVE , 0x0, 1, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0) \
MACRO(__VA_ARGS__, u16_move_y_x , SWS_PIXEL_U16, SWS_UOP_MOVE , 0x0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0) \
MACRO(__VA_ARGS__, u16_move_y_w , SWS_PIXEL_U16, SWS_UOP_MOVE , 0x0, 1, 1, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0) \
MACRO(__VA_ARGS__, u16_move_w_x , SWS_PIXEL_U16, SWS_UOP_MOVE , 0x0, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0) \
MACRO(__VA_ARGS__, u16_move_xz_zw , SWS_PIXEL_U16, SWS_UOP_MOVE , 0x0, 2, 0, 2, 0, 0, 0, 0, 2, 3, 0, 0, 0, 0) \
MACRO(__VA_ARGS__, u16_move_yx_xw , SWS_PIXEL_U16, SWS_UOP_MOVE , 0x0, 2, 1, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0) \
MACRO(__VA_ARGS__, u16_move_yz_xx , SWS_PIXEL_U16, SWS_UOP_MOVE , 0x0, 2, 1, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0) \
MACRO(__VA_ARGS__, u16_move_wz_zx , SWS_PIXEL_U16, SWS_UOP_MOVE , 0x0, 2, 3, 2, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0) \
MACRO(__VA_ARGS__, u16_move_xyz_yzw , SWS_PIXEL_U16, SWS_UOP_MOVE , 0x0, 3, 0, 1, 2, 0, 0, 0, 1, 2, 3, 0, 0, 0) \
MACRO(__VA_ARGS__, u16_move_xzy_zyw , SWS_PIXEL_U16, SWS_UOP_MOVE , 0x0, 3, 0, 2, 1, 0, 0, 0, 2, 1, 3, 0, 0, 0) \
MACRO(__VA_ARGS__, u16_move_zwy_xyx , SWS_PIXEL_U16, SWS_UOP_MOVE , 0x0, 3, 2, 3, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0) \
MACRO(__VA_ARGS__, u16_move_wzy_zyx , SWS_PIXEL_U16, SWS_UOP_MOVE , 0x0, 3, 3, 2, 1, 0, 0, 0, 2, 1, 0, 0, 0, 0) \
MACRO(__VA_ARGS__, u16_move_txy_xyt , SWS_PIXEL_U16, SWS_UOP_MOVE , 0x0, 3, -1, 0, 1, 0, 0, 0, 0, 1, -1, 0, 0, 0) \
MACRO(__VA_ARGS__, u16_move_txz_xzt , SWS_PIXEL_U16, SWS_UOP_MOVE , 0x0, 3, -1, 0, 2, 0, 0, 0, 0, 2, -1, 0, 0, 0) \
MACRO(__VA_ARGS__, u16_move_xtyz_wyzt , SWS_PIXEL_U16, SWS_UOP_MOVE , 0x0, 4, 0, -1, 1, 2, 0, 0, 3, 1, 2, -1, 0, 0) \
MACRO(__VA_ARGS__, u16_move_wtyz_xyzt , SWS_PIXEL_U16, SWS_UOP_MOVE , 0x0, 4, 3, -1, 1, 2, 0, 0, 0, 1, 2, -1, 0, 0) \
MACRO(__VA_ARGS__, u16_move_txyz_xyzt , SWS_PIXEL_U16, SWS_UOP_MOVE , 0x0, 4, -1, 0, 1, 2, 0, 0, 0, 1, 2, -1, 0, 0) \
MACRO(__VA_ARGS__, u16_move_txzy_xzyt , SWS_PIXEL_U16, SWS_UOP_MOVE , 0x0, 4, -1, 0, 2, 1, 0, 0, 0, 2, 1, -1, 0, 0) \
MACRO(__VA_ARGS__, u16_move_tyzw_yzwt , SWS_PIXEL_U16, SWS_UOP_MOVE , 0x0, 4, -1, 1, 2, 3, 0, 0, 1, 2, 3, -1, 0, 0) \
MACRO(__VA_ARGS__, u16_move_txyzw_xyzwt , SWS_PIXEL_U16, SWS_UOP_MOVE , 0x0, 5, -1, 0, 1, 2, 3, 0, 0, 1, 2, 3, -1, 0) \
MACRO(__VA_ARGS__, u16_move_txwzy_xwzyt , SWS_PIXEL_U16, SWS_UOP_MOVE , 0x0, 5, -1, 0, 3, 2, 1, 0, 0, 3, 2, 1, -1, 0) \
MACRO(__VA_ARGS__, u16_move_txwtyz_xwtyzt , SWS_PIXEL_U16, SWS_UOP_MOVE , 0x0, 6, -1, 0, 3, -1, 1, 2, 0, 3, -1, 1, 2, -1)
#define SWS_FOR_STRUCT_U16_MOVE(MACRO, ...) \
MACRO(__VA_ARGS__, u16_move_x_y , .type = SWS_PIXEL_U16, .uop = SWS_UOP_MOVE , .mask = 0x0, .par.move.num_moves = 1, .par.move.dst = {0, 0, 0, 0, 0, 0}, .par.move.src = {1, 0, 0, 0, 0, 0}) \
MACRO(__VA_ARGS__, u16_move_x_z , .type = SWS_PIXEL_U16, .uop = SWS_UOP_MOVE , .mask = 0x0, .par.move.num_moves = 1, .par.move.dst = {0, 0, 0, 0, 0, 0}, .par.move.src = {2, 0, 0, 0, 0, 0}) \
MACRO(__VA_ARGS__, u16_move_x_w , .type = SWS_PIXEL_U16, .uop = SWS_UOP_MOVE , .mask = 0x0, .par.move.num_moves = 1, .par.move.dst = {0, 0, 0, 0, 0, 0}, .par.move.src = {3, 0, 0, 0, 0, 0}) \
MACRO(__VA_ARGS__, u16_move_y_x , .type = SWS_PIXEL_U16, .uop = SWS_UOP_MOVE , .mask = 0x0, .par.move.num_moves = 1, .par.move.dst = {1, 0, 0, 0, 0, 0}, .par.move.src = {0, 0, 0, 0, 0, 0}) \
MACRO(__VA_ARGS__, u16_move_y_w , .type = SWS_PIXEL_U16, .uop = SWS_UOP_MOVE , .mask = 0x0, .par.move.num_moves = 1, .par.move.dst = {1, 0, 0, 0, 0, 0}, .par.move.src = {3, 0, 0, 0, 0, 0}) \
MACRO(__VA_ARGS__, u16_move_w_x , .type = SWS_PIXEL_U16, .uop = SWS_UOP_MOVE , .mask = 0x0, .par.move.num_moves = 1, .par.move.dst = {3, 0, 0, 0, 0, 0}, .par.move.src = {0, 0, 0, 0, 0, 0}) \
MACRO(__VA_ARGS__, u16_move_xz_zw , .type = SWS_PIXEL_U16, .uop = SWS_UOP_MOVE , .mask = 0x0, .par.move.num_moves = 2, .par.move.dst = {0, 2, 0, 0, 0, 0}, .par.move.src = {2, 3, 0, 0, 0, 0}) \
MACRO(__VA_ARGS__, u16_move_yx_xw , .type = SWS_PIXEL_U16, .uop = SWS_UOP_MOVE , .mask = 0x0, .par.move.num_moves = 2, .par.move.dst = {1, 0, 0, 0, 0, 0}, .par.move.src = {0, 3, 0, 0, 0, 0}) \
MACRO(__VA_ARGS__, u16_move_yz_xx , .type = SWS_PIXEL_U16, .uop = SWS_UOP_MOVE , .mask = 0x0, .par.move.num_moves = 2, .par.move.dst = {1, 2, 0, 0, 0, 0}, .par.move.src = {0, 0, 0, 0, 0, 0}) \
MACRO(__VA_ARGS__, u16_move_wz_zx , .type = SWS_PIXEL_U16, .uop = SWS_UOP_MOVE , .mask = 0x0, .par.move.num_moves = 2, .par.move.dst = {3, 2, 0, 0, 0, 0}, .par.move.src = {2, 0, 0, 0, 0, 0}) \
MACRO(__VA_ARGS__, u16_move_xyz_yzw , .type = SWS_PIXEL_U16, .uop = SWS_UOP_MOVE , .mask = 0x0, .par.move.num_moves = 3, .par.move.dst = {0, 1, 2, 0, 0, 0}, .par.move.src = {1, 2, 3, 0, 0, 0}) \
MACRO(__VA_ARGS__, u16_move_xzy_zyw , .type = SWS_PIXEL_U16, .uop = SWS_UOP_MOVE , .mask = 0x0, .par.move.num_moves = 3, .par.move.dst = {0, 2, 1, 0, 0, 0}, .par.move.src = {2, 1, 3, 0, 0, 0}) \
MACRO(__VA_ARGS__, u16_move_zwy_xyx , .type = SWS_PIXEL_U16, .uop = SWS_UOP_MOVE , .mask = 0x0, .par.move.num_moves = 3, .par.move.dst = {2, 3, 1, 0, 0, 0}, .par.move.src = {0, 1, 0, 0, 0, 0}) \
MACRO(__VA_ARGS__, u16_move_wzy_zyx , .type = SWS_PIXEL_U16, .uop = SWS_UOP_MOVE , .mask = 0x0, .par.move.num_moves = 3, .par.move.dst = {3, 2, 1, 0, 0, 0}, .par.move.src = {2, 1, 0, 0, 0, 0}) \
MACRO(__VA_ARGS__, u16_move_txy_xyt , .type = SWS_PIXEL_U16, .uop = SWS_UOP_MOVE , .mask = 0x0, .par.move.num_moves = 3, .par.move.dst = {-1, 0, 1, 0, 0, 0}, .par.move.src = {0, 1, -1, 0, 0, 0}) \
MACRO(__VA_ARGS__, u16_move_txz_xzt , .type = SWS_PIXEL_U16, .uop = SWS_UOP_MOVE , .mask = 0x0, .par.move.num_moves = 3, .par.move.dst = {-1, 0, 2, 0, 0, 0}, .par.move.src = {0, 2, -1, 0, 0, 0}) \
MACRO(__VA_ARGS__, u16_move_xtyz_wyzt , .type = SWS_PIXEL_U16, .uop = SWS_UOP_MOVE , .mask = 0x0, .par.move.num_moves = 4, .par.move.dst = {0, -1, 1, 2, 0, 0}, .par.move.src = {3, 1, 2, -1, 0, 0}) \
MACRO(__VA_ARGS__, u16_move_wtyz_xyzt , .type = SWS_PIXEL_U16, .uop = SWS_UOP_MOVE , .mask = 0x0, .par.move.num_moves = 4, .par.move.dst = {3, -1, 1, 2, 0, 0}, .par.move.src = {0, 1, 2, -1, 0, 0}) \
MACRO(__VA_ARGS__, u16_move_txyz_xyzt , .type = SWS_PIXEL_U16, .uop = SWS_UOP_MOVE , .mask = 0x0, .par.move.num_moves = 4, .par.move.dst = {-1, 0, 1, 2, 0, 0}, .par.move.src = {0, 1, 2, -1, 0, 0}) \
MACRO(__VA_ARGS__, u16_move_txzy_xzyt , .type = SWS_PIXEL_U16, .uop = SWS_UOP_MOVE , .mask = 0x0, .par.move.num_moves = 4, .par.move.dst = {-1, 0, 2, 1, 0, 0}, .par.move.src = {0, 2, 1, -1, 0, 0}) \
MACRO(__VA_ARGS__, u16_move_tyzw_yzwt , .type = SWS_PIXEL_U16, .uop = SWS_UOP_MOVE , .mask = 0x0, .par.move.num_moves = 4, .par.move.dst = {-1, 1, 2, 3, 0, 0}, .par.move.src = {1, 2, 3, -1, 0, 0}) \
MACRO(__VA_ARGS__, u16_move_txyzw_xyzwt , .type = SWS_PIXEL_U16, .uop = SWS_UOP_MOVE , .mask = 0x0, .par.move.num_moves = 5, .par.move.dst = {-1, 0, 1, 2, 3, 0}, .par.move.src = {0, 1, 2, 3, -1, 0}) \
MACRO(__VA_ARGS__, u16_move_txwzy_xwzyt , .type = SWS_PIXEL_U16, .uop = SWS_UOP_MOVE , .mask = 0x0, .par.move.num_moves = 5, .par.move.dst = {-1, 0, 3, 2, 1, 0}, .par.move.src = {0, 3, 2, 1, -1, 0}) \
MACRO(__VA_ARGS__, u16_move_txwtyz_xwtyzt , .type = SWS_PIXEL_U16, .uop = SWS_UOP_MOVE , .mask = 0x0, .par.move.num_moves = 6, .par.move.dst = {-1, 0, 3, -1, 1, 2}, .par.move.src = {0, 3, -1, 1, 2, -1})
#define SWS_FOR_U16_SWAP_BYTES(MACRO, ...) \
MACRO(__VA_ARGS__, u16_swap_bytes_x , SWS_PIXEL_U16, SWS_UOP_SWAP_BYTES , 0x1) \
MACRO(__VA_ARGS__, u16_swap_bytes_y , SWS_PIXEL_U16, SWS_UOP_SWAP_BYTES , 0x2) \
@@ -691,6 +811,72 @@
MACRO(__VA_ARGS__, u32_copy_yz_xx , .type = SWS_PIXEL_U32, .uop = SWS_UOP_COPY , .mask = 0x6, .par.swizzle.in = {0, 0, 0, 3}) \
MACRO(__VA_ARGS__, u32_copy_yzw_xxx , .type = SWS_PIXEL_U32, .uop = SWS_UOP_COPY , .mask = 0xe, .par.swizzle.in = {0, 0, 0, 0}) \
MACRO(__VA_ARGS__, u32_copy_yzw_xxy , .type = SWS_PIXEL_U32, .uop = SWS_UOP_COPY , .mask = 0xe, .par.swizzle.in = {0, 0, 0, 1})
#define SWS_FOR_U32_MOVE(MACRO, ...) \
MACRO(__VA_ARGS__, u32_move_x_y , SWS_PIXEL_U32, SWS_UOP_MOVE , 0x0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0) \
MACRO(__VA_ARGS__, u32_move_x_z , SWS_PIXEL_U32, SWS_UOP_MOVE , 0x0, 1, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0) \
MACRO(__VA_ARGS__, u32_move_x_w , SWS_PIXEL_U32, SWS_UOP_MOVE , 0x0, 1, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0) \
MACRO(__VA_ARGS__, u32_move_y_x , SWS_PIXEL_U32, SWS_UOP_MOVE , 0x0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0) \
MACRO(__VA_ARGS__, u32_move_y_w , SWS_PIXEL_U32, SWS_UOP_MOVE , 0x0, 1, 1, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0) \
MACRO(__VA_ARGS__, u32_move_z_x , SWS_PIXEL_U32, SWS_UOP_MOVE , 0x0, 1, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0) \
MACRO(__VA_ARGS__, u32_move_w_x , SWS_PIXEL_U32, SWS_UOP_MOVE , 0x0, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0) \
MACRO(__VA_ARGS__, u32_move_w_y , SWS_PIXEL_U32, SWS_UOP_MOVE , 0x0, 1, 3, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0) \
MACRO(__VA_ARGS__, u32_move_xz_zw , SWS_PIXEL_U32, SWS_UOP_MOVE , 0x0, 2, 0, 2, 0, 0, 0, 0, 2, 3, 0, 0, 0, 0) \
MACRO(__VA_ARGS__, u32_move_yz_xx , SWS_PIXEL_U32, SWS_UOP_MOVE , 0x0, 2, 1, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0) \
MACRO(__VA_ARGS__, u32_move_zx_xw , SWS_PIXEL_U32, SWS_UOP_MOVE , 0x0, 2, 2, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0) \
MACRO(__VA_ARGS__, u32_move_wx_xy , SWS_PIXEL_U32, SWS_UOP_MOVE , 0x0, 2, 3, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0) \
MACRO(__VA_ARGS__, u32_move_wy_yx , SWS_PIXEL_U32, SWS_UOP_MOVE , 0x0, 2, 3, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0) \
MACRO(__VA_ARGS__, u32_move_wz_zx , SWS_PIXEL_U32, SWS_UOP_MOVE , 0x0, 2, 3, 2, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0) \
MACRO(__VA_ARGS__, u32_move_xyz_yzw , SWS_PIXEL_U32, SWS_UOP_MOVE , 0x0, 3, 0, 1, 2, 0, 0, 0, 1, 2, 3, 0, 0, 0) \
MACRO(__VA_ARGS__, u32_move_xzy_zyw , SWS_PIXEL_U32, SWS_UOP_MOVE , 0x0, 3, 0, 2, 1, 0, 0, 0, 2, 1, 3, 0, 0, 0) \
MACRO(__VA_ARGS__, u32_move_yzw_xxx , SWS_PIXEL_U32, SWS_UOP_MOVE , 0x0, 3, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0) \
MACRO(__VA_ARGS__, u32_move_zwy_xyx , SWS_PIXEL_U32, SWS_UOP_MOVE , 0x0, 3, 2, 3, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0) \
MACRO(__VA_ARGS__, u32_move_wyz_yzx , SWS_PIXEL_U32, SWS_UOP_MOVE , 0x0, 3, 3, 1, 2, 0, 0, 0, 1, 2, 0, 0, 0, 0) \
MACRO(__VA_ARGS__, u32_move_wzy_zyx , SWS_PIXEL_U32, SWS_UOP_MOVE , 0x0, 3, 3, 2, 1, 0, 0, 0, 2, 1, 0, 0, 0, 0) \
MACRO(__VA_ARGS__, u32_move_txy_xyt , SWS_PIXEL_U32, SWS_UOP_MOVE , 0x0, 3, -1, 0, 1, 0, 0, 0, 0, 1, -1, 0, 0, 0) \
MACRO(__VA_ARGS__, u32_move_txz_xzt , SWS_PIXEL_U32, SWS_UOP_MOVE , 0x0, 3, -1, 0, 2, 0, 0, 0, 0, 2, -1, 0, 0, 0) \
MACRO(__VA_ARGS__, u32_move_tyz_yzt , SWS_PIXEL_U32, SWS_UOP_MOVE , 0x0, 3, -1, 1, 2, 0, 0, 0, 1, 2, -1, 0, 0, 0) \
MACRO(__VA_ARGS__, u32_move_tyw_ywt , SWS_PIXEL_U32, SWS_UOP_MOVE , 0x0, 3, -1, 1, 3, 0, 0, 0, 1, 3, -1, 0, 0, 0) \
MACRO(__VA_ARGS__, u32_move_xtyz_wyzt , SWS_PIXEL_U32, SWS_UOP_MOVE , 0x0, 4, 0, -1, 1, 2, 0, 0, 3, 1, 2, -1, 0, 0) \
MACRO(__VA_ARGS__, u32_move_wtyz_xyzt , SWS_PIXEL_U32, SWS_UOP_MOVE , 0x0, 4, 3, -1, 1, 2, 0, 0, 0, 1, 2, -1, 0, 0) \
MACRO(__VA_ARGS__, u32_move_txyz_xyzt , SWS_PIXEL_U32, SWS_UOP_MOVE , 0x0, 4, -1, 0, 1, 2, 0, 0, 0, 1, 2, -1, 0, 0) \
MACRO(__VA_ARGS__, u32_move_txzy_xzyt , SWS_PIXEL_U32, SWS_UOP_MOVE , 0x0, 4, -1, 0, 2, 1, 0, 0, 0, 2, 1, -1, 0, 0) \
MACRO(__VA_ARGS__, u32_move_txyzw_xyzwt , SWS_PIXEL_U32, SWS_UOP_MOVE , 0x0, 5, -1, 0, 1, 2, 3, 0, 0, 1, 2, 3, -1, 0) \
MACRO(__VA_ARGS__, u32_move_txwyz_xwyzt , SWS_PIXEL_U32, SWS_UOP_MOVE , 0x0, 5, -1, 0, 3, 1, 2, 0, 0, 3, 1, 2, -1, 0) \
MACRO(__VA_ARGS__, u32_move_txwzy_xwzyt , SWS_PIXEL_U32, SWS_UOP_MOVE , 0x0, 5, -1, 0, 3, 2, 1, 0, 0, 3, 2, 1, -1, 0) \
MACRO(__VA_ARGS__, u32_move_txwtyz_xwtyzt , SWS_PIXEL_U32, SWS_UOP_MOVE , 0x0, 6, -1, 0, 3, -1, 1, 2, 0, 3, -1, 1, 2, -1)
#define SWS_FOR_STRUCT_U32_MOVE(MACRO, ...) \
MACRO(__VA_ARGS__, u32_move_x_y , .type = SWS_PIXEL_U32, .uop = SWS_UOP_MOVE , .mask = 0x0, .par.move.num_moves = 1, .par.move.dst = {0, 0, 0, 0, 0, 0}, .par.move.src = {1, 0, 0, 0, 0, 0}) \
MACRO(__VA_ARGS__, u32_move_x_z , .type = SWS_PIXEL_U32, .uop = SWS_UOP_MOVE , .mask = 0x0, .par.move.num_moves = 1, .par.move.dst = {0, 0, 0, 0, 0, 0}, .par.move.src = {2, 0, 0, 0, 0, 0}) \
MACRO(__VA_ARGS__, u32_move_x_w , .type = SWS_PIXEL_U32, .uop = SWS_UOP_MOVE , .mask = 0x0, .par.move.num_moves = 1, .par.move.dst = {0, 0, 0, 0, 0, 0}, .par.move.src = {3, 0, 0, 0, 0, 0}) \
MACRO(__VA_ARGS__, u32_move_y_x , .type = SWS_PIXEL_U32, .uop = SWS_UOP_MOVE , .mask = 0x0, .par.move.num_moves = 1, .par.move.dst = {1, 0, 0, 0, 0, 0}, .par.move.src = {0, 0, 0, 0, 0, 0}) \
MACRO(__VA_ARGS__, u32_move_y_w , .type = SWS_PIXEL_U32, .uop = SWS_UOP_MOVE , .mask = 0x0, .par.move.num_moves = 1, .par.move.dst = {1, 0, 0, 0, 0, 0}, .par.move.src = {3, 0, 0, 0, 0, 0}) \
MACRO(__VA_ARGS__, u32_move_z_x , .type = SWS_PIXEL_U32, .uop = SWS_UOP_MOVE , .mask = 0x0, .par.move.num_moves = 1, .par.move.dst = {2, 0, 0, 0, 0, 0}, .par.move.src = {0, 0, 0, 0, 0, 0}) \
MACRO(__VA_ARGS__, u32_move_w_x , .type = SWS_PIXEL_U32, .uop = SWS_UOP_MOVE , .mask = 0x0, .par.move.num_moves = 1, .par.move.dst = {3, 0, 0, 0, 0, 0}, .par.move.src = {0, 0, 0, 0, 0, 0}) \
MACRO(__VA_ARGS__, u32_move_w_y , .type = SWS_PIXEL_U32, .uop = SWS_UOP_MOVE , .mask = 0x0, .par.move.num_moves = 1, .par.move.dst = {3, 0, 0, 0, 0, 0}, .par.move.src = {1, 0, 0, 0, 0, 0}) \
MACRO(__VA_ARGS__, u32_move_xz_zw , .type = SWS_PIXEL_U32, .uop = SWS_UOP_MOVE , .mask = 0x0, .par.move.num_moves = 2, .par.move.dst = {0, 2, 0, 0, 0, 0}, .par.move.src = {2, 3, 0, 0, 0, 0}) \
MACRO(__VA_ARGS__, u32_move_yz_xx , .type = SWS_PIXEL_U32, .uop = SWS_UOP_MOVE , .mask = 0x0, .par.move.num_moves = 2, .par.move.dst = {1, 2, 0, 0, 0, 0}, .par.move.src = {0, 0, 0, 0, 0, 0}) \
MACRO(__VA_ARGS__, u32_move_zx_xw , .type = SWS_PIXEL_U32, .uop = SWS_UOP_MOVE , .mask = 0x0, .par.move.num_moves = 2, .par.move.dst = {2, 0, 0, 0, 0, 0}, .par.move.src = {0, 3, 0, 0, 0, 0}) \
MACRO(__VA_ARGS__, u32_move_wx_xy , .type = SWS_PIXEL_U32, .uop = SWS_UOP_MOVE , .mask = 0x0, .par.move.num_moves = 2, .par.move.dst = {3, 0, 0, 0, 0, 0}, .par.move.src = {0, 1, 0, 0, 0, 0}) \
MACRO(__VA_ARGS__, u32_move_wy_yx , .type = SWS_PIXEL_U32, .uop = SWS_UOP_MOVE , .mask = 0x0, .par.move.num_moves = 2, .par.move.dst = {3, 1, 0, 0, 0, 0}, .par.move.src = {1, 0, 0, 0, 0, 0}) \
MACRO(__VA_ARGS__, u32_move_wz_zx , .type = SWS_PIXEL_U32, .uop = SWS_UOP_MOVE , .mask = 0x0, .par.move.num_moves = 2, .par.move.dst = {3, 2, 0, 0, 0, 0}, .par.move.src = {2, 0, 0, 0, 0, 0}) \
MACRO(__VA_ARGS__, u32_move_xyz_yzw , .type = SWS_PIXEL_U32, .uop = SWS_UOP_MOVE , .mask = 0x0, .par.move.num_moves = 3, .par.move.dst = {0, 1, 2, 0, 0, 0}, .par.move.src = {1, 2, 3, 0, 0, 0}) \
MACRO(__VA_ARGS__, u32_move_xzy_zyw , .type = SWS_PIXEL_U32, .uop = SWS_UOP_MOVE , .mask = 0x0, .par.move.num_moves = 3, .par.move.dst = {0, 2, 1, 0, 0, 0}, .par.move.src = {2, 1, 3, 0, 0, 0}) \
MACRO(__VA_ARGS__, u32_move_yzw_xxx , .type = SWS_PIXEL_U32, .uop = SWS_UOP_MOVE , .mask = 0x0, .par.move.num_moves = 3, .par.move.dst = {1, 2, 3, 0, 0, 0}, .par.move.src = {0, 0, 0, 0, 0, 0}) \
MACRO(__VA_ARGS__, u32_move_zwy_xyx , .type = SWS_PIXEL_U32, .uop = SWS_UOP_MOVE , .mask = 0x0, .par.move.num_moves = 3, .par.move.dst = {2, 3, 1, 0, 0, 0}, .par.move.src = {0, 1, 0, 0, 0, 0}) \
MACRO(__VA_ARGS__, u32_move_wyz_yzx , .type = SWS_PIXEL_U32, .uop = SWS_UOP_MOVE , .mask = 0x0, .par.move.num_moves = 3, .par.move.dst = {3, 1, 2, 0, 0, 0}, .par.move.src = {1, 2, 0, 0, 0, 0}) \
MACRO(__VA_ARGS__, u32_move_wzy_zyx , .type = SWS_PIXEL_U32, .uop = SWS_UOP_MOVE , .mask = 0x0, .par.move.num_moves = 3, .par.move.dst = {3, 2, 1, 0, 0, 0}, .par.move.src = {2, 1, 0, 0, 0, 0}) \
MACRO(__VA_ARGS__, u32_move_txy_xyt , .type = SWS_PIXEL_U32, .uop = SWS_UOP_MOVE , .mask = 0x0, .par.move.num_moves = 3, .par.move.dst = {-1, 0, 1, 0, 0, 0}, .par.move.src = {0, 1, -1, 0, 0, 0}) \
MACRO(__VA_ARGS__, u32_move_txz_xzt , .type = SWS_PIXEL_U32, .uop = SWS_UOP_MOVE , .mask = 0x0, .par.move.num_moves = 3, .par.move.dst = {-1, 0, 2, 0, 0, 0}, .par.move.src = {0, 2, -1, 0, 0, 0}) \
MACRO(__VA_ARGS__, u32_move_tyz_yzt , .type = SWS_PIXEL_U32, .uop = SWS_UOP_MOVE , .mask = 0x0, .par.move.num_moves = 3, .par.move.dst = {-1, 1, 2, 0, 0, 0}, .par.move.src = {1, 2, -1, 0, 0, 0}) \
MACRO(__VA_ARGS__, u32_move_tyw_ywt , .type = SWS_PIXEL_U32, .uop = SWS_UOP_MOVE , .mask = 0x0, .par.move.num_moves = 3, .par.move.dst = {-1, 1, 3, 0, 0, 0}, .par.move.src = {1, 3, -1, 0, 0, 0}) \
MACRO(__VA_ARGS__, u32_move_xtyz_wyzt , .type = SWS_PIXEL_U32, .uop = SWS_UOP_MOVE , .mask = 0x0, .par.move.num_moves = 4, .par.move.dst = {0, -1, 1, 2, 0, 0}, .par.move.src = {3, 1, 2, -1, 0, 0}) \
MACRO(__VA_ARGS__, u32_move_wtyz_xyzt , .type = SWS_PIXEL_U32, .uop = SWS_UOP_MOVE , .mask = 0x0, .par.move.num_moves = 4, .par.move.dst = {3, -1, 1, 2, 0, 0}, .par.move.src = {0, 1, 2, -1, 0, 0}) \
MACRO(__VA_ARGS__, u32_move_txyz_xyzt , .type = SWS_PIXEL_U32, .uop = SWS_UOP_MOVE , .mask = 0x0, .par.move.num_moves = 4, .par.move.dst = {-1, 0, 1, 2, 0, 0}, .par.move.src = {0, 1, 2, -1, 0, 0}) \
MACRO(__VA_ARGS__, u32_move_txzy_xzyt , .type = SWS_PIXEL_U32, .uop = SWS_UOP_MOVE , .mask = 0x0, .par.move.num_moves = 4, .par.move.dst = {-1, 0, 2, 1, 0, 0}, .par.move.src = {0, 2, 1, -1, 0, 0}) \
MACRO(__VA_ARGS__, u32_move_txyzw_xyzwt , .type = SWS_PIXEL_U32, .uop = SWS_UOP_MOVE , .mask = 0x0, .par.move.num_moves = 5, .par.move.dst = {-1, 0, 1, 2, 3, 0}, .par.move.src = {0, 1, 2, 3, -1, 0}) \
MACRO(__VA_ARGS__, u32_move_txwyz_xwyzt , .type = SWS_PIXEL_U32, .uop = SWS_UOP_MOVE , .mask = 0x0, .par.move.num_moves = 5, .par.move.dst = {-1, 0, 3, 1, 2, 0}, .par.move.src = {0, 3, 1, 2, -1, 0}) \
MACRO(__VA_ARGS__, u32_move_txwzy_xwzyt , .type = SWS_PIXEL_U32, .uop = SWS_UOP_MOVE , .mask = 0x0, .par.move.num_moves = 5, .par.move.dst = {-1, 0, 3, 2, 1, 0}, .par.move.src = {0, 3, 2, 1, -1, 0}) \
MACRO(__VA_ARGS__, u32_move_txwtyz_xwtyzt , .type = SWS_PIXEL_U32, .uop = SWS_UOP_MOVE , .mask = 0x0, .par.move.num_moves = 6, .par.move.dst = {-1, 0, 3, -1, 1, 2}, .par.move.src = {0, 3, -1, 1, 2, -1})
#define SWS_FOR_U32_SWAP_BYTES(MACRO, ...) \
MACRO(__VA_ARGS__, u32_swap_bytes_x , SWS_PIXEL_U32, SWS_UOP_SWAP_BYTES , 0x1) \
MACRO(__VA_ARGS__, u32_swap_bytes_xy , SWS_PIXEL_U32, SWS_UOP_SWAP_BYTES , 0x3) \
@@ -837,6 +1023,8 @@
#define SWS_FOR_STRUCT_F32_PERMUTE(MACRO, ...)
#define SWS_FOR_F32_COPY(MACRO, ...)
#define SWS_FOR_STRUCT_F32_COPY(MACRO, ...)
#define SWS_FOR_F32_MOVE(MACRO, ...)
#define SWS_FOR_STRUCT_F32_MOVE(MACRO, ...)
#define SWS_FOR_F32_SWAP_BYTES(MACRO, ...)
#define SWS_FOR_STRUCT_F32_SWAP_BYTES(MACRO, ...)
#define SWS_FOR_F32_EXPAND_BIT(MACRO, ...)