PR #25670 opened by Kacper Michajłow (kasper93)
URL: https://code.ffmpeg.org/FFmpeg/FFmpeg/pulls/25670
Patch URL: https://code.ffmpeg.org/FFmpeg/FFmpeg/pulls/25670.patch


From 6b2c1a4166e0d222d5e062b85108b243dc87a5e8 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Kacper=20Michaj=C5=82ow?= <[email protected]>
Date: Thu, 29 Oct 2026 10:44:22 +0100
Subject: [PATCH 1/2] swscale/uops: round every float operation of the
 reference backend
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

With x87 math the compiler keeps the intermediate results of an
expression with excess precision. Round them, so that they produce the
same results.

Signed-off-by: Kacper Michajłow <[email protected]>
---
 libswscale/uops.h      |  2 +-
 libswscale/uops_tmpl.c | 52 +++++++++++++++++++++++++++---------------
 2 files changed, 34 insertions(+), 20 deletions(-)

diff --git a/libswscale/uops.h b/libswscale/uops.h
index 506b3ff6222..4d25107927b 100644
--- a/libswscale/uops.h
+++ b/libswscale/uops.h
@@ -94,7 +94,7 @@ static inline SwsPixel ff_sws_pixel_from_q64(SwsPixelType 
type, AVRational64 val
     case SWS_PIXEL_U8:  return (SwsPixel) { .u8  = val.num / val.den };
     case SWS_PIXEL_U16: return (SwsPixel) { .u16 = val.num / val.den };
     case SWS_PIXEL_U32: return (SwsPixel) { .u32 = val.num / val.den };
-    case SWS_PIXEL_F32: return (SwsPixel) { .f32 = (float) val.num / val.den };
+    case SWS_PIXEL_F32: return (SwsPixel) { .f32 = (float) val.num / (float) 
val.den };
     case SWS_PIXEL_NONE:
     case SWS_PIXEL_TYPE_NB: break;
     }
diff --git a/libswscale/uops_tmpl.c b/libswscale/uops_tmpl.c
index e94bfca417f..56e28749b12 100644
--- a/libswscale/uops_tmpl.c
+++ b/libswscale/uops_tmpl.c
@@ -61,6 +61,9 @@
 #  error Invalid BIT_DEPTH
 #endif
 
+/* Every intermediate float result is cast to pixel_t, which rounds away the
+ * excess precision of x87 math for the same results as everywhere else */
+
 /*********************************
  * Generic read/write operations *
  *********************************/
@@ -285,10 +288,10 @@ DECL_READ(read_planar_fv, const SwsCompMask mask, const 
SwsPixelType type)
 
         SWS_LOOP
         for (int i = 0; i < SWS_BLOCK_SIZE; i++) {
-            if (X) xs.f32[i] += weight * in0[i];
-            if (Y) ys.f32[i] += weight * in1[i];
-            if (Z) zs.f32[i] += weight * in2[i];
-            if (W) ws.f32[i] += weight * in3[i];
+            if (X) xs.f32[i] += (float) (weight * in0[i]);
+            if (Y) ys.f32[i] += (float) (weight * in1[i]);
+            if (Z) zs.f32[i] += (float) (weight * in2[i]);
+            if (W) ws.f32[i] += (float) (weight * in3[i]);
         }
 
         if (X) in0 = bump_ptr(in0, exec->in_stride[0]);
@@ -355,10 +358,10 @@ DECL_READ(read_planar_fh, const SwsCompMask mask, const 
SwsPixelType type)
         inter_t sx = 0, sy = 0, sz = 0, sw = 0;
         for (int j = 0; j < filter_size; j++) {
             const int weight = weights[j];
-            if (X) sx += weight * start0[j];
-            if (Y) sy += weight * start1[j];
-            if (Z) sz += weight * start2[j];
-            if (W) sw += weight * start3[j];
+            if (X) sx += (inter_t) (weight * start0[j]);
+            if (Y) sy += (inter_t) (weight * start1[j]);
+            if (Z) sz += (inter_t) (weight * start2[j]);
+            if (W) sw += (inter_t) (weight * start3[j]);
         }
 
         if (X) xs.f32[i] = (float) sx * scale;
@@ -838,7 +841,7 @@ DECL_FUNC(linear, const SwsCompMask mask, const uint32_t 
one, const uint32_t zer
         const pixel_t ww = w[i];
 
 #define LIN_VAL(I, J, val) \
-    ((one & SWS_MASK(I, J)) ? (val) : (uinter_t) c.m[I][J] * (val))
+    ((one & SWS_MASK(I, J)) ? (val) : (pixel_t) ((uinter_t) c.m[I][J] * (val)))
 
 #define LIN_ROW(I, var) do {                                    \
     pixel_t tmp = (zero & SWS_MASK(I, 4)) ? 0 : c.k[I];         \
@@ -879,7 +882,18 @@ av_always_inline static vec3_t fn(vec3)(v3u16_t v)
     return (vec3_t) { v.x, v.y, v.z };
 }
 
-#define lerp(a, b, w) ((a) + (w) * ((pixel_t) (b) - (a)))
+#define lerp(a, b, w) ((pixel_t) ((a) + (pixel_t) ((w) * (pixel_t) ((pixel_t) 
(b) - (a)))))
+
+av_always_inline static
+pixel_t fn(sum4)(pixel_t w0, pixel_t a, pixel_t w1, pixel_t b,
+                 pixel_t w2, pixel_t c, pixel_t w3, pixel_t d)
+{
+    pixel_t sum = (pixel_t) (w0 * a);
+    sum += (pixel_t) (w1 * b);
+    sum += (pixel_t) (w2 * c);
+    sum += (pixel_t) (w3 * d);
+    return sum;
+}
 
 av_always_inline static
 vec3_t fn(lerp3)(vec3_t a, vec3_t b, pixel_t w)
@@ -932,16 +946,16 @@ vec3_t fn(lut3d_static)(const SwsLut3D *restrict lut3d, 
vec3_t rgb)
     const vec3_t v3 = fn(vec3)(base[off0 + off1 + off2]);
 
     return (vec3_t) {
-        w0 * v0.x + w1 * v1.x + w2 * v2.x + w3 * v3.x,
-        w0 * v0.y + w1 * v1.y + w2 * v2.y + w3 * v3.y,
-        w0 * v0.z + w1 * v1.z + w2 * v2.z + w3 * v3.z,
+        fn(sum4)(w0, v0.x, w1, v1.x, w2, v2.x, w3, v3.x),
+        fn(sum4)(w0, v0.y, w1, v1.y, w2, v2.y, w3, v3.y),
+        fn(sum4)(w0, v0.z, w1, v1.z, w2, v2.z, w3, v3.z),
     };
 }
 
 av_always_inline static
 vec3_t fn(lut3d_dynamic)(const SwsLut3D *restrict lut3d, vec3_t rgb)
 {
-    rgb.x *= (TONE_LUT_SIZE - 1) / (pixel_t) UINT16_MAX;
+    rgb.x *= (pixel_t) ((TONE_LUT_SIZE - 1) / (pixel_t) UINT16_MAX);
 
     /* Linear interpolation */
     const int     Ix = (int) rgb.x;
@@ -955,13 +969,13 @@ vec3_t fn(lut3d_dynamic)(const SwsLut3D *restrict lut3d, 
vec3_t rgb)
     const pixel_t scale = k / (pixel_t) (1 << 15);
 
     rgb.x = lerp(a.x, b.x, If);
-    rgb.y = bias + scale * rgb.y;
-    rgb.z = bias + scale * rgb.z;
+    rgb.y = bias + (pixel_t) (scale * rgb.y);
+    rgb.z = bias + (pixel_t) (scale * rgb.z);
 
     /* Re-scale to output LUT size */
-    rgb.x *= (OUTPUT_LUT_SIZE_I  - 1) / (pixel_t) UINT16_MAX;
-    rgb.y *= (OUTPUT_LUT_SIZE_PT - 1) / (pixel_t) UINT16_MAX;
-    rgb.z *= (OUTPUT_LUT_SIZE_PT - 1) / (pixel_t) UINT16_MAX;
+    rgb.x *= (pixel_t) ((OUTPUT_LUT_SIZE_I  - 1) / (pixel_t) UINT16_MAX);
+    rgb.y *= (pixel_t) ((OUTPUT_LUT_SIZE_PT - 1) / (pixel_t) UINT16_MAX);
+    rgb.z *= (pixel_t) ((OUTPUT_LUT_SIZE_PT - 1) / (pixel_t) UINT16_MAX);
 
     /* Trilinear interpolation */
     const int lo0 = (int) rgb.x;
-- 
2.54.0


From 03ef9aba552e65cc336d2a53c690d10d5cbe0d94 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Kacper=20Michaj=C5=82ow?= <[email protected]>
Date: Thu, 29 Oct 2026 18:38:17 +0100
Subject: [PATCH 2/2] swscale/uops: check every product of an input before
 fusing it
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

exact_prod() only checked the products with the two ends of the input
range, so a coefficient times inputs in [0, 1] or [0, 2] passed as
exact although the values in between are not, and with SWS_BITEXACT the
x86 backend fused those products with FMA where the C backend rounds
them. A product is exact for every input when the coefficient is a power
of two, or when the inputs are integers whose bits fit in the
significand next to those of the coefficient.

Signed-off-by: Kacper Michajłow <[email protected]>
---
 libswscale/uops.c              | 30 +++++++++++++++++++-----------
 libswscale/x86/uops_macros.asm | 16 ++++++++++++++--
 libswscale/x86/uops_macros.h   | 32 ++++++++++++++++++++++++++++----
 3 files changed, 61 insertions(+), 17 deletions(-)

diff --git a/libswscale/uops.c b/libswscale/uops.c
index a7150c11307..5fcfd6dea21 100644
--- a/libswscale/uops.c
+++ b/libswscale/uops.c
@@ -18,9 +18,12 @@
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  */
 
+#include <float.h>
+#include <math.h>
 #include <stdbool.h>
 
 #include "libavutil/avassert.h"
+#include "libavutil/intmath.h"
 #include "libavutil/mem.h"
 #include "libavutil/refstruct.h"
 
@@ -236,26 +239,31 @@ static SwsPixelType pixel_type_to_int(SwsUOpFlags flags, 
const SwsPixelType type
     return SWS_PIXEL_NONE;
 }
 
-static bool exact_product_f32(float a, float b)
+static int significant_bits_f32(float f)
 {
-    volatile float prod   = a * b;
-    volatile float result = b ? prod / b : 0.0f;
-    return !b || result == a;
+    int exp;
+    const uint32_t mant = ldexpf(frexpf(fabsf(f), &exp), FLT_MANT_DIG);
+    return mant ? FLT_MANT_DIG - ff_ctz(mant) : 0;
 }
 
 static bool exact_prod(SwsPixel coef, const SwsOpPad *input)
 {
     if (ff_sws_pixel_type_is_int(input->type))
         return true;
-    else if (!input->min.den || !input->max.den)
-        return false; /* unknown bounds */
 
-    const SwsPixel min = ff_sws_pixel_from_q64(input->type, input->min);
-    const SwsPixel max = ff_sws_pixel_from_q64(input->type, input->max);
     switch (input->type) {
-    case SWS_PIXEL_F32:
-        return exact_product_f32(coef.f32, min.f32) &&
-               exact_product_f32(coef.f32, max.f32);
+    case SWS_PIXEL_F32: {
+        const int bits = significant_bits_f32(coef.f32);
+        if (bits <= 1)
+            return true; /* power of two */
+        if (!(input->flags & SWS_COMP_EXACT) || !input->min.den || 
!input->max.den)
+            return false; /* not only integers, or unknown bounds */
+
+        const double max = FFMAX(fabs(ff_q2d_64(input->min)), 
fabs(ff_q2d_64(input->max)));
+        if (max >= 1 << FLT_MANT_DIG)
+            return false;
+        return bits + (max >= 1.0 ? av_log2((unsigned) max) + 1 : 0) <= 
FLT_MANT_DIG;
+    }
     }
 
     av_unreachable("Invalid pixel type!");
diff --git a/libswscale/x86/uops_macros.asm b/libswscale/x86/uops_macros.asm
index 09bc564ba3e..ba002f0edcf 100644
--- a/libswscale/x86/uops_macros.asm
+++ b/libswscale/x86/uops_macros.asm
@@ -825,6 +825,7 @@
 
 %macro DECL_F32_LINEAR_FMA 1
     DECL_OP %1, f32_linear_fma_x_xxx0x                  , SWS_PIXEL_F32, 
SWS_UOP_LINEAR_FMA      , 0x1, 0x41040, 0xbefa8, 0xfffe8
+    DECL_OP %1, f32_linear_fma_x_xXx0x                  , SWS_PIXEL_F32, 
SWS_UOP_LINEAR_FMA      , 0x1, 0x41040, 0xbefa8, 0xfffea
     DECL_OP %1, f32_linear_fma_x_XXX0x                  , SWS_PIXEL_F32, 
SWS_UOP_LINEAR_FMA      , 0x1, 0x41040, 0xbefa8, 0xfffef
     DECL_OP %1, f32_linear_fma_x_x000x                  , SWS_PIXEL_F32, 
SWS_UOP_LINEAR_FMA      , 0x1, 0x41040, 0xbefae, 0xfffee
     DECL_OP %1, f32_linear_fma_x_X000x                  , SWS_PIXEL_F32, 
SWS_UOP_LINEAR_FMA      , 0x1, 0x41040, 0xbefae, 0xfffef
@@ -834,14 +835,24 @@
     DECL_OP %1, f32_linear_fma_x_xXX00                  , SWS_PIXEL_F32, 
SWS_UOP_LINEAR_FMA      , 0x1, 0x41040, 0xbefb8, 0xffffe
     DECL_OP %1, f32_linear_fma_y_0x000                  , SWS_PIXEL_F32, 
SWS_UOP_LINEAR_FMA      , 0x2, 0x41001, 0xbefbe, 0xfffbf
     DECL_OP %1, f32_linear_fma_xyz_xxx0x_xxx0x_xxx0x    , SWS_PIXEL_F32, 
SWS_UOP_LINEAR_FMA      , 0x7, 0x40000, 0xba108, 0xfa108
-    DECL_OP %1, f32_linear_fma_xyz_XXX0x_XxX0x_XXX0x    , SWS_PIXEL_F32, 
SWS_UOP_LINEAR_FMA      , 0x7, 0x40000, 0xba108, 0xfbdaf
+    DECL_OP %1, f32_linear_fma_xyz_xxx0x_xxx0x_Xxx0x    , SWS_PIXEL_F32, 
SWS_UOP_LINEAR_FMA      , 0x7, 0x40000, 0xba108, 0xfa508
+    DECL_OP %1, f32_linear_fma_xyz_xxx0x_xxx0x_XXx0x    , SWS_PIXEL_F32, 
SWS_UOP_LINEAR_FMA      , 0x7, 0x40000, 0xba108, 0xfad08
+    DECL_OP %1, f32_linear_fma_xyz_XxX0x_xxX0x_Xxx0x    , SWS_PIXEL_F32, 
SWS_UOP_LINEAR_FMA      , 0x7, 0x40000, 0xba108, 0xfa58d
     DECL_OP %1, f32_linear_fma_xyz_XXX0x_XXX0x_XXX0x    , SWS_PIXEL_F32, 
SWS_UOP_LINEAR_FMA      , 0x7, 0x40000, 0xba108, 0xfbdef
+    DECL_OP %1, f32_linear_fma_xyz_x0x0x_xxx0x_xx00x    , SWS_PIXEL_F32, 
SWS_UOP_LINEAR_FMA      , 0x7, 0x40000, 0xbb10a, 0xfb10a
+    DECL_OP %1, f32_linear_fma_xyz_X0x0x_Xxx0x_Xx00x    , SWS_PIXEL_F32, 
SWS_UOP_LINEAR_FMA      , 0x7, 0x40000, 0xbb10a, 0xfb52b
     DECL_OP %1, f32_linear_fma_xyz_X0X0x_XXX0x_XX00x    , SWS_PIXEL_F32, 
SWS_UOP_LINEAR_FMA      , 0x7, 0x40000, 0xbb10a, 0xfbdef
     DECL_OP %1, f32_linear_fma_xyz_xxx00_xxx0x_xxx0x    , SWS_PIXEL_F32, 
SWS_UOP_LINEAR_FMA      , 0x7, 0x40000, 0xba118, 0xfa118
-    DECL_OP %1, f32_linear_fma_xyz_xXX00_XxX0x_XXX0x    , SWS_PIXEL_F32, 
SWS_UOP_LINEAR_FMA      , 0x7, 0x40000, 0xba118, 0xfbdbe
+    DECL_OP %1, f32_linear_fma_xyz_xxx00_xXx0x_xxx0x    , SWS_PIXEL_F32, 
SWS_UOP_LINEAR_FMA      , 0x7, 0x40000, 0xba118, 0xfa158
+    DECL_OP %1, f32_linear_fma_xyz_xxx00_xxX0x_xxx0x    , SWS_PIXEL_F32, 
SWS_UOP_LINEAR_FMA      , 0x7, 0x40000, 0xba118, 0xfa198
+    DECL_OP %1, f32_linear_fma_xyz_xxx00_xxX0x_Xxx0x    , SWS_PIXEL_F32, 
SWS_UOP_LINEAR_FMA      , 0x7, 0x40000, 0xba118, 0xfa598
+    DECL_OP %1, f32_linear_fma_xyz_xxX00_xxX0x_XxX0x    , SWS_PIXEL_F32, 
SWS_UOP_LINEAR_FMA      , 0x7, 0x40000, 0xba118, 0xfb59c
     DECL_OP %1, f32_linear_fma_xyz_xXX00_XXX0x_XXX0x    , SWS_PIXEL_F32, 
SWS_UOP_LINEAR_FMA      , 0x7, 0x40000, 0xba118, 0xfbdfe
+    DECL_OP %1, f32_linear_fma_xyz_x000x_0x00x_00x0x    , SWS_PIXEL_F32, 
SWS_UOP_LINEAR_FMA      , 0x7, 0x40000, 0xbadae, 0xfadae
+    DECL_OP %1, f32_linear_fma_xyz_X000x_0x00x_00X0x    , SWS_PIXEL_F32, 
SWS_UOP_LINEAR_FMA      , 0x7, 0x40000, 0xbadae, 0xfbdaf
     DECL_OP %1, f32_linear_fma_xyz_X000x_0X00x_00X0x    , SWS_PIXEL_F32, 
SWS_UOP_LINEAR_FMA      , 0x7, 0x40000, 0xbadae, 0xfbdef
     DECL_OP %1, f32_linear_fma_xyz_x0000_0x000_00x00    , SWS_PIXEL_F32, 
SWS_UOP_LINEAR_FMA      , 0x7, 0x40000, 0xbefbe, 0xfefbe
+    DECL_OP %1, f32_linear_fma_xyz_10x0x_1xx0x_1x00x    , SWS_PIXEL_F32, 
SWS_UOP_LINEAR_FMA      , 0x7, 0x40421, 0xbb10a, 0xfb52b
     DECL_OP %1, f32_linear_fma_xyz_10X0x_1XX0x_1X00x    , SWS_PIXEL_F32, 
SWS_UOP_LINEAR_FMA      , 0x7, 0x40421, 0xbb10a, 0xfbdef
     DECL_OP %1, f32_linear_fma_w_000x0                  , SWS_PIXEL_F32, 
SWS_UOP_LINEAR_FMA      , 0x8, 0x01041, 0xbefbe, 0xbffff
     DECL_OP %1, f32_linear_fma_xw_x000x_000x0           , SWS_PIXEL_F32, 
SWS_UOP_LINEAR_FMA      , 0x9, 0x01040, 0xbefae, 0xbffee
@@ -850,6 +861,7 @@
     DECL_OP %1, f32_linear_fma_xw_xXX00_000x0           , SWS_PIXEL_F32, 
SWS_UOP_LINEAR_FMA      , 0x9, 0x01040, 0xbefb8, 0xbfffe
     DECL_OP %1, f32_linear_fma_xyzw_xxx0x_xxx0x_xxx0x_000x0, SWS_PIXEL_F32, 
SWS_UOP_LINEAR_FMA      , 0xf, 0x00000, 0xba108, 0xba108
     DECL_OP %1, f32_linear_fma_xyzw_XXX0x_XXX0x_XXX0x_000x0, SWS_PIXEL_F32, 
SWS_UOP_LINEAR_FMA      , 0xf, 0x00000, 0xba108, 0xbbdef
+    DECL_OP %1, f32_linear_fma_xyzw_x0x0x_xxx0x_xx00x_000x0, SWS_PIXEL_F32, 
SWS_UOP_LINEAR_FMA      , 0xf, 0x00000, 0xbb10a, 0xbb10a
     DECL_OP %1, f32_linear_fma_xyzw_X0X0x_XXX0x_XX00x_000x0, SWS_PIXEL_F32, 
SWS_UOP_LINEAR_FMA      , 0xf, 0x00000, 0xbb10a, 0xbbdef
     DECL_OP %1, f32_linear_fma_xyzw_x0000_0x000_00x00_000x0, SWS_PIXEL_F32, 
SWS_UOP_LINEAR_FMA      , 0xf, 0x00000, 0xbefbe, 0xbefbe
 %endmacro
diff --git a/libswscale/x86/uops_macros.h b/libswscale/x86/uops_macros.h
index 66b3a6afe27..b3312873713 100644
--- a/libswscale/x86/uops_macros.h
+++ b/libswscale/x86/uops_macros.h
@@ -1087,6 +1087,7 @@
     MACRO(__VA_ARGS__, f32_linear_xyzw_x0000_0x000_00x00_000x0 , .type = 
SWS_PIXEL_F32, .uop = SWS_UOP_LINEAR          , .mask = 0xf, .par.lin.one = 
0x00000, .par.lin.zero = 0xbefbe)
 #define SWS_FOR_F32_LINEAR_FMA(MACRO, ...) \
     MACRO(__VA_ARGS__, f32_linear_fma_x_xxx0x                  , 
SWS_PIXEL_F32, SWS_UOP_LINEAR_FMA      , 0x1, 0x41040, 0xbefa8, 0xfffe8) \
+    MACRO(__VA_ARGS__, f32_linear_fma_x_xXx0x                  , 
SWS_PIXEL_F32, SWS_UOP_LINEAR_FMA      , 0x1, 0x41040, 0xbefa8, 0xfffea) \
     MACRO(__VA_ARGS__, f32_linear_fma_x_XXX0x                  , 
SWS_PIXEL_F32, SWS_UOP_LINEAR_FMA      , 0x1, 0x41040, 0xbefa8, 0xfffef) \
     MACRO(__VA_ARGS__, f32_linear_fma_x_x000x                  , 
SWS_PIXEL_F32, SWS_UOP_LINEAR_FMA      , 0x1, 0x41040, 0xbefae, 0xfffee) \
     MACRO(__VA_ARGS__, f32_linear_fma_x_X000x                  , 
SWS_PIXEL_F32, SWS_UOP_LINEAR_FMA      , 0x1, 0x41040, 0xbefae, 0xfffef) \
@@ -1096,14 +1097,24 @@
     MACRO(__VA_ARGS__, f32_linear_fma_x_xXX00                  , 
SWS_PIXEL_F32, SWS_UOP_LINEAR_FMA      , 0x1, 0x41040, 0xbefb8, 0xffffe) \
     MACRO(__VA_ARGS__, f32_linear_fma_y_0x000                  , 
SWS_PIXEL_F32, SWS_UOP_LINEAR_FMA      , 0x2, 0x41001, 0xbefbe, 0xfffbf) \
     MACRO(__VA_ARGS__, f32_linear_fma_xyz_xxx0x_xxx0x_xxx0x    , 
SWS_PIXEL_F32, SWS_UOP_LINEAR_FMA      , 0x7, 0x40000, 0xba108, 0xfa108) \
-    MACRO(__VA_ARGS__, f32_linear_fma_xyz_XXX0x_XxX0x_XXX0x    , 
SWS_PIXEL_F32, SWS_UOP_LINEAR_FMA      , 0x7, 0x40000, 0xba108, 0xfbdaf) \
+    MACRO(__VA_ARGS__, f32_linear_fma_xyz_xxx0x_xxx0x_Xxx0x    , 
SWS_PIXEL_F32, SWS_UOP_LINEAR_FMA      , 0x7, 0x40000, 0xba108, 0xfa508) \
+    MACRO(__VA_ARGS__, f32_linear_fma_xyz_xxx0x_xxx0x_XXx0x    , 
SWS_PIXEL_F32, SWS_UOP_LINEAR_FMA      , 0x7, 0x40000, 0xba108, 0xfad08) \
+    MACRO(__VA_ARGS__, f32_linear_fma_xyz_XxX0x_xxX0x_Xxx0x    , 
SWS_PIXEL_F32, SWS_UOP_LINEAR_FMA      , 0x7, 0x40000, 0xba108, 0xfa58d) \
     MACRO(__VA_ARGS__, f32_linear_fma_xyz_XXX0x_XXX0x_XXX0x    , 
SWS_PIXEL_F32, SWS_UOP_LINEAR_FMA      , 0x7, 0x40000, 0xba108, 0xfbdef) \
+    MACRO(__VA_ARGS__, f32_linear_fma_xyz_x0x0x_xxx0x_xx00x    , 
SWS_PIXEL_F32, SWS_UOP_LINEAR_FMA      , 0x7, 0x40000, 0xbb10a, 0xfb10a) \
+    MACRO(__VA_ARGS__, f32_linear_fma_xyz_X0x0x_Xxx0x_Xx00x    , 
SWS_PIXEL_F32, SWS_UOP_LINEAR_FMA      , 0x7, 0x40000, 0xbb10a, 0xfb52b) \
     MACRO(__VA_ARGS__, f32_linear_fma_xyz_X0X0x_XXX0x_XX00x    , 
SWS_PIXEL_F32, SWS_UOP_LINEAR_FMA      , 0x7, 0x40000, 0xbb10a, 0xfbdef) \
     MACRO(__VA_ARGS__, f32_linear_fma_xyz_xxx00_xxx0x_xxx0x    , 
SWS_PIXEL_F32, SWS_UOP_LINEAR_FMA      , 0x7, 0x40000, 0xba118, 0xfa118) \
-    MACRO(__VA_ARGS__, f32_linear_fma_xyz_xXX00_XxX0x_XXX0x    , 
SWS_PIXEL_F32, SWS_UOP_LINEAR_FMA      , 0x7, 0x40000, 0xba118, 0xfbdbe) \
+    MACRO(__VA_ARGS__, f32_linear_fma_xyz_xxx00_xXx0x_xxx0x    , 
SWS_PIXEL_F32, SWS_UOP_LINEAR_FMA      , 0x7, 0x40000, 0xba118, 0xfa158) \
+    MACRO(__VA_ARGS__, f32_linear_fma_xyz_xxx00_xxX0x_xxx0x    , 
SWS_PIXEL_F32, SWS_UOP_LINEAR_FMA      , 0x7, 0x40000, 0xba118, 0xfa198) \
+    MACRO(__VA_ARGS__, f32_linear_fma_xyz_xxx00_xxX0x_Xxx0x    , 
SWS_PIXEL_F32, SWS_UOP_LINEAR_FMA      , 0x7, 0x40000, 0xba118, 0xfa598) \
+    MACRO(__VA_ARGS__, f32_linear_fma_xyz_xxX00_xxX0x_XxX0x    , 
SWS_PIXEL_F32, SWS_UOP_LINEAR_FMA      , 0x7, 0x40000, 0xba118, 0xfb59c) \
     MACRO(__VA_ARGS__, f32_linear_fma_xyz_xXX00_XXX0x_XXX0x    , 
SWS_PIXEL_F32, SWS_UOP_LINEAR_FMA      , 0x7, 0x40000, 0xba118, 0xfbdfe) \
+    MACRO(__VA_ARGS__, f32_linear_fma_xyz_x000x_0x00x_00x0x    , 
SWS_PIXEL_F32, SWS_UOP_LINEAR_FMA      , 0x7, 0x40000, 0xbadae, 0xfadae) \
+    MACRO(__VA_ARGS__, f32_linear_fma_xyz_X000x_0x00x_00X0x    , 
SWS_PIXEL_F32, SWS_UOP_LINEAR_FMA      , 0x7, 0x40000, 0xbadae, 0xfbdaf) \
     MACRO(__VA_ARGS__, f32_linear_fma_xyz_X000x_0X00x_00X0x    , 
SWS_PIXEL_F32, SWS_UOP_LINEAR_FMA      , 0x7, 0x40000, 0xbadae, 0xfbdef) \
     MACRO(__VA_ARGS__, f32_linear_fma_xyz_x0000_0x000_00x00    , 
SWS_PIXEL_F32, SWS_UOP_LINEAR_FMA      , 0x7, 0x40000, 0xbefbe, 0xfefbe) \
+    MACRO(__VA_ARGS__, f32_linear_fma_xyz_10x0x_1xx0x_1x00x    , 
SWS_PIXEL_F32, SWS_UOP_LINEAR_FMA      , 0x7, 0x40421, 0xbb10a, 0xfb52b) \
     MACRO(__VA_ARGS__, f32_linear_fma_xyz_10X0x_1XX0x_1X00x    , 
SWS_PIXEL_F32, SWS_UOP_LINEAR_FMA      , 0x7, 0x40421, 0xbb10a, 0xfbdef) \
     MACRO(__VA_ARGS__, f32_linear_fma_w_000x0                  , 
SWS_PIXEL_F32, SWS_UOP_LINEAR_FMA      , 0x8, 0x01041, 0xbefbe, 0xbffff) \
     MACRO(__VA_ARGS__, f32_linear_fma_xw_x000x_000x0           , 
SWS_PIXEL_F32, SWS_UOP_LINEAR_FMA      , 0x9, 0x01040, 0xbefae, 0xbffee) \
@@ -1112,10 +1123,12 @@
     MACRO(__VA_ARGS__, f32_linear_fma_xw_xXX00_000x0           , 
SWS_PIXEL_F32, SWS_UOP_LINEAR_FMA      , 0x9, 0x01040, 0xbefb8, 0xbfffe) \
     MACRO(__VA_ARGS__, f32_linear_fma_xyzw_xxx0x_xxx0x_xxx0x_000x0, 
SWS_PIXEL_F32, SWS_UOP_LINEAR_FMA      , 0xf, 0x00000, 0xba108, 0xba108) \
     MACRO(__VA_ARGS__, f32_linear_fma_xyzw_XXX0x_XXX0x_XXX0x_000x0, 
SWS_PIXEL_F32, SWS_UOP_LINEAR_FMA      , 0xf, 0x00000, 0xba108, 0xbbdef) \
+    MACRO(__VA_ARGS__, f32_linear_fma_xyzw_x0x0x_xxx0x_xx00x_000x0, 
SWS_PIXEL_F32, SWS_UOP_LINEAR_FMA      , 0xf, 0x00000, 0xbb10a, 0xbb10a) \
     MACRO(__VA_ARGS__, f32_linear_fma_xyzw_X0X0x_XXX0x_XX00x_000x0, 
SWS_PIXEL_F32, SWS_UOP_LINEAR_FMA      , 0xf, 0x00000, 0xbb10a, 0xbbdef) \
     MACRO(__VA_ARGS__, f32_linear_fma_xyzw_x0000_0x000_00x00_000x0, 
SWS_PIXEL_F32, SWS_UOP_LINEAR_FMA      , 0xf, 0x00000, 0xbefbe, 0xbefbe)
 #define SWS_FOR_STRUCT_F32_LINEAR_FMA(MACRO, ...) \
     MACRO(__VA_ARGS__, f32_linear_fma_x_xxx0x                  , .type = 
SWS_PIXEL_F32, .uop = SWS_UOP_LINEAR_FMA      , .mask = 0x1, .par.lin.one = 
0x41040, .par.lin.zero = 0xbefa8, .par.lin.exact = 0xfffe8) \
+    MACRO(__VA_ARGS__, f32_linear_fma_x_xXx0x                  , .type = 
SWS_PIXEL_F32, .uop = SWS_UOP_LINEAR_FMA      , .mask = 0x1, .par.lin.one = 
0x41040, .par.lin.zero = 0xbefa8, .par.lin.exact = 0xfffea) \
     MACRO(__VA_ARGS__, f32_linear_fma_x_XXX0x                  , .type = 
SWS_PIXEL_F32, .uop = SWS_UOP_LINEAR_FMA      , .mask = 0x1, .par.lin.one = 
0x41040, .par.lin.zero = 0xbefa8, .par.lin.exact = 0xfffef) \
     MACRO(__VA_ARGS__, f32_linear_fma_x_x000x                  , .type = 
SWS_PIXEL_F32, .uop = SWS_UOP_LINEAR_FMA      , .mask = 0x1, .par.lin.one = 
0x41040, .par.lin.zero = 0xbefae, .par.lin.exact = 0xfffee) \
     MACRO(__VA_ARGS__, f32_linear_fma_x_X000x                  , .type = 
SWS_PIXEL_F32, .uop = SWS_UOP_LINEAR_FMA      , .mask = 0x1, .par.lin.one = 
0x41040, .par.lin.zero = 0xbefae, .par.lin.exact = 0xfffef) \
@@ -1125,14 +1138,24 @@
     MACRO(__VA_ARGS__, f32_linear_fma_x_xXX00                  , .type = 
SWS_PIXEL_F32, .uop = SWS_UOP_LINEAR_FMA      , .mask = 0x1, .par.lin.one = 
0x41040, .par.lin.zero = 0xbefb8, .par.lin.exact = 0xffffe) \
     MACRO(__VA_ARGS__, f32_linear_fma_y_0x000                  , .type = 
SWS_PIXEL_F32, .uop = SWS_UOP_LINEAR_FMA      , .mask = 0x2, .par.lin.one = 
0x41001, .par.lin.zero = 0xbefbe, .par.lin.exact = 0xfffbf) \
     MACRO(__VA_ARGS__, f32_linear_fma_xyz_xxx0x_xxx0x_xxx0x    , .type = 
SWS_PIXEL_F32, .uop = SWS_UOP_LINEAR_FMA      , .mask = 0x7, .par.lin.one = 
0x40000, .par.lin.zero = 0xba108, .par.lin.exact = 0xfa108) \
-    MACRO(__VA_ARGS__, f32_linear_fma_xyz_XXX0x_XxX0x_XXX0x    , .type = 
SWS_PIXEL_F32, .uop = SWS_UOP_LINEAR_FMA      , .mask = 0x7, .par.lin.one = 
0x40000, .par.lin.zero = 0xba108, .par.lin.exact = 0xfbdaf) \
+    MACRO(__VA_ARGS__, f32_linear_fma_xyz_xxx0x_xxx0x_Xxx0x    , .type = 
SWS_PIXEL_F32, .uop = SWS_UOP_LINEAR_FMA      , .mask = 0x7, .par.lin.one = 
0x40000, .par.lin.zero = 0xba108, .par.lin.exact = 0xfa508) \
+    MACRO(__VA_ARGS__, f32_linear_fma_xyz_xxx0x_xxx0x_XXx0x    , .type = 
SWS_PIXEL_F32, .uop = SWS_UOP_LINEAR_FMA      , .mask = 0x7, .par.lin.one = 
0x40000, .par.lin.zero = 0xba108, .par.lin.exact = 0xfad08) \
+    MACRO(__VA_ARGS__, f32_linear_fma_xyz_XxX0x_xxX0x_Xxx0x    , .type = 
SWS_PIXEL_F32, .uop = SWS_UOP_LINEAR_FMA      , .mask = 0x7, .par.lin.one = 
0x40000, .par.lin.zero = 0xba108, .par.lin.exact = 0xfa58d) \
     MACRO(__VA_ARGS__, f32_linear_fma_xyz_XXX0x_XXX0x_XXX0x    , .type = 
SWS_PIXEL_F32, .uop = SWS_UOP_LINEAR_FMA      , .mask = 0x7, .par.lin.one = 
0x40000, .par.lin.zero = 0xba108, .par.lin.exact = 0xfbdef) \
+    MACRO(__VA_ARGS__, f32_linear_fma_xyz_x0x0x_xxx0x_xx00x    , .type = 
SWS_PIXEL_F32, .uop = SWS_UOP_LINEAR_FMA      , .mask = 0x7, .par.lin.one = 
0x40000, .par.lin.zero = 0xbb10a, .par.lin.exact = 0xfb10a) \
+    MACRO(__VA_ARGS__, f32_linear_fma_xyz_X0x0x_Xxx0x_Xx00x    , .type = 
SWS_PIXEL_F32, .uop = SWS_UOP_LINEAR_FMA      , .mask = 0x7, .par.lin.one = 
0x40000, .par.lin.zero = 0xbb10a, .par.lin.exact = 0xfb52b) \
     MACRO(__VA_ARGS__, f32_linear_fma_xyz_X0X0x_XXX0x_XX00x    , .type = 
SWS_PIXEL_F32, .uop = SWS_UOP_LINEAR_FMA      , .mask = 0x7, .par.lin.one = 
0x40000, .par.lin.zero = 0xbb10a, .par.lin.exact = 0xfbdef) \
     MACRO(__VA_ARGS__, f32_linear_fma_xyz_xxx00_xxx0x_xxx0x    , .type = 
SWS_PIXEL_F32, .uop = SWS_UOP_LINEAR_FMA      , .mask = 0x7, .par.lin.one = 
0x40000, .par.lin.zero = 0xba118, .par.lin.exact = 0xfa118) \
-    MACRO(__VA_ARGS__, f32_linear_fma_xyz_xXX00_XxX0x_XXX0x    , .type = 
SWS_PIXEL_F32, .uop = SWS_UOP_LINEAR_FMA      , .mask = 0x7, .par.lin.one = 
0x40000, .par.lin.zero = 0xba118, .par.lin.exact = 0xfbdbe) \
+    MACRO(__VA_ARGS__, f32_linear_fma_xyz_xxx00_xXx0x_xxx0x    , .type = 
SWS_PIXEL_F32, .uop = SWS_UOP_LINEAR_FMA      , .mask = 0x7, .par.lin.one = 
0x40000, .par.lin.zero = 0xba118, .par.lin.exact = 0xfa158) \
+    MACRO(__VA_ARGS__, f32_linear_fma_xyz_xxx00_xxX0x_xxx0x    , .type = 
SWS_PIXEL_F32, .uop = SWS_UOP_LINEAR_FMA      , .mask = 0x7, .par.lin.one = 
0x40000, .par.lin.zero = 0xba118, .par.lin.exact = 0xfa198) \
+    MACRO(__VA_ARGS__, f32_linear_fma_xyz_xxx00_xxX0x_Xxx0x    , .type = 
SWS_PIXEL_F32, .uop = SWS_UOP_LINEAR_FMA      , .mask = 0x7, .par.lin.one = 
0x40000, .par.lin.zero = 0xba118, .par.lin.exact = 0xfa598) \
+    MACRO(__VA_ARGS__, f32_linear_fma_xyz_xxX00_xxX0x_XxX0x    , .type = 
SWS_PIXEL_F32, .uop = SWS_UOP_LINEAR_FMA      , .mask = 0x7, .par.lin.one = 
0x40000, .par.lin.zero = 0xba118, .par.lin.exact = 0xfb59c) \
     MACRO(__VA_ARGS__, f32_linear_fma_xyz_xXX00_XXX0x_XXX0x    , .type = 
SWS_PIXEL_F32, .uop = SWS_UOP_LINEAR_FMA      , .mask = 0x7, .par.lin.one = 
0x40000, .par.lin.zero = 0xba118, .par.lin.exact = 0xfbdfe) \
+    MACRO(__VA_ARGS__, f32_linear_fma_xyz_x000x_0x00x_00x0x    , .type = 
SWS_PIXEL_F32, .uop = SWS_UOP_LINEAR_FMA      , .mask = 0x7, .par.lin.one = 
0x40000, .par.lin.zero = 0xbadae, .par.lin.exact = 0xfadae) \
+    MACRO(__VA_ARGS__, f32_linear_fma_xyz_X000x_0x00x_00X0x    , .type = 
SWS_PIXEL_F32, .uop = SWS_UOP_LINEAR_FMA      , .mask = 0x7, .par.lin.one = 
0x40000, .par.lin.zero = 0xbadae, .par.lin.exact = 0xfbdaf) \
     MACRO(__VA_ARGS__, f32_linear_fma_xyz_X000x_0X00x_00X0x    , .type = 
SWS_PIXEL_F32, .uop = SWS_UOP_LINEAR_FMA      , .mask = 0x7, .par.lin.one = 
0x40000, .par.lin.zero = 0xbadae, .par.lin.exact = 0xfbdef) \
     MACRO(__VA_ARGS__, f32_linear_fma_xyz_x0000_0x000_00x00    , .type = 
SWS_PIXEL_F32, .uop = SWS_UOP_LINEAR_FMA      , .mask = 0x7, .par.lin.one = 
0x40000, .par.lin.zero = 0xbefbe, .par.lin.exact = 0xfefbe) \
+    MACRO(__VA_ARGS__, f32_linear_fma_xyz_10x0x_1xx0x_1x00x    , .type = 
SWS_PIXEL_F32, .uop = SWS_UOP_LINEAR_FMA      , .mask = 0x7, .par.lin.one = 
0x40421, .par.lin.zero = 0xbb10a, .par.lin.exact = 0xfb52b) \
     MACRO(__VA_ARGS__, f32_linear_fma_xyz_10X0x_1XX0x_1X00x    , .type = 
SWS_PIXEL_F32, .uop = SWS_UOP_LINEAR_FMA      , .mask = 0x7, .par.lin.one = 
0x40421, .par.lin.zero = 0xbb10a, .par.lin.exact = 0xfbdef) \
     MACRO(__VA_ARGS__, f32_linear_fma_w_000x0                  , .type = 
SWS_PIXEL_F32, .uop = SWS_UOP_LINEAR_FMA      , .mask = 0x8, .par.lin.one = 
0x01041, .par.lin.zero = 0xbefbe, .par.lin.exact = 0xbffff) \
     MACRO(__VA_ARGS__, f32_linear_fma_xw_x000x_000x0           , .type = 
SWS_PIXEL_F32, .uop = SWS_UOP_LINEAR_FMA      , .mask = 0x9, .par.lin.one = 
0x01040, .par.lin.zero = 0xbefae, .par.lin.exact = 0xbffee) \
@@ -1141,6 +1164,7 @@
     MACRO(__VA_ARGS__, f32_linear_fma_xw_xXX00_000x0           , .type = 
SWS_PIXEL_F32, .uop = SWS_UOP_LINEAR_FMA      , .mask = 0x9, .par.lin.one = 
0x01040, .par.lin.zero = 0xbefb8, .par.lin.exact = 0xbfffe) \
     MACRO(__VA_ARGS__, f32_linear_fma_xyzw_xxx0x_xxx0x_xxx0x_000x0, .type = 
SWS_PIXEL_F32, .uop = SWS_UOP_LINEAR_FMA      , .mask = 0xf, .par.lin.one = 
0x00000, .par.lin.zero = 0xba108, .par.lin.exact = 0xba108) \
     MACRO(__VA_ARGS__, f32_linear_fma_xyzw_XXX0x_XXX0x_XXX0x_000x0, .type = 
SWS_PIXEL_F32, .uop = SWS_UOP_LINEAR_FMA      , .mask = 0xf, .par.lin.one = 
0x00000, .par.lin.zero = 0xba108, .par.lin.exact = 0xbbdef) \
+    MACRO(__VA_ARGS__, f32_linear_fma_xyzw_x0x0x_xxx0x_xx00x_000x0, .type = 
SWS_PIXEL_F32, .uop = SWS_UOP_LINEAR_FMA      , .mask = 0xf, .par.lin.one = 
0x00000, .par.lin.zero = 0xbb10a, .par.lin.exact = 0xbb10a) \
     MACRO(__VA_ARGS__, f32_linear_fma_xyzw_X0X0x_XXX0x_XX00x_000x0, .type = 
SWS_PIXEL_F32, .uop = SWS_UOP_LINEAR_FMA      , .mask = 0xf, .par.lin.one = 
0x00000, .par.lin.zero = 0xbb10a, .par.lin.exact = 0xbbdef) \
     MACRO(__VA_ARGS__, f32_linear_fma_xyzw_x0000_0x000_00x00_000x0, .type = 
SWS_PIXEL_F32, .uop = SWS_UOP_LINEAR_FMA      , .mask = 0xf, .par.lin.one = 
0x00000, .par.lin.zero = 0xbefbe, .par.lin.exact = 0xbefbe)
 #define SWS_FOR_F32_DITHER(MACRO, ...) \
-- 
2.54.0

_______________________________________________
ffmpeg-devel mailing list -- [email protected]
To unsubscribe send an email to [email protected]

Reply via email to