You've already forked FFmpeg
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:
+115
-3
@@ -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,
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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, ...)
|
||||
|
||||
Reference in New Issue
Block a user