PR #24104 opened by shiyou
URL: https://code.ffmpeg.org/FFmpeg/FFmpeg/pulls/24104
Patch URL: https://code.ffmpeg.org/FFmpeg/FFmpeg/pulls/24104.patch

The base implementation has been updated to runtime coeff and offset.
Benchmark results:
  name                             ticks (vs ref)
  chrRangeFromJpeg8_1920_c:        237.9
  chrRangeFromJpeg8_1920_lsx:       39.3 ( 5.91x)
  chrRangeFromJpeg8_1920_lasx:      19.6 (11.95x)
  chrRangeFromJpeg16_1920_c:       240.3
  chrRangeToJpeg8_1920_c:          444.3
  chrRangeToJpeg8_1920_lsx:         63.7 ( 6.36x)
  chrRangeToJpeg8_1920_lasx:        28.9 (15.31x)
  chrRangeToJpeg16_1920_c:         502.9
  lumRangeFromJpeg8_1920_c:        140.3
  lumRangeFromJpeg8_1920_lsx:       29.0 ( 4.83x)
  lumRangeFromJpeg8_1920_lasx:      15.8 ( 8.39x)
  lumRangeFromJpeg16_1920_c:        71.7
  lumRangeToJpeg8_1920_c:          303.4
  lumRangeToJpeg8_1920_lsx:         29.2 (10.34x)
  lumRangeToJpeg8_1920_lasx:        14.8 (20.47x)
  lumRangeToJpeg16_1920_c:         294.1

# Summary of changes

Briefly describe what this PR does and why.

<!--
If this PR requires new FATE test samples, attach them to the PR and
list their target paths below (relative to the fate-suite root).

Attached filenames must match the sample's filename:

```fate-samples
# e.g. vorbis/new-sample.ogg
```
-->



>From 9fa9cc761a27e4d56e10ea4e312291c2ec1cc996 Mon Sep 17 00:00:00 2001
From: Shiyou Yin <[email protected]>
Date: Wed, 12 Aug 2026 11:24:59 +0800
Subject: [PATCH] swscale/range_convert: Enable range_convert optimization for
 LA.

The base implementation has been updated to runtime coeff and offset.
Benchmark results:
  name                             ticks (vs ref)
  chrRangeFromJpeg8_1920_c:        237.9
  chrRangeFromJpeg8_1920_lsx:       39.3 ( 5.91x)
  chrRangeFromJpeg8_1920_lasx:      19.6 (11.95x)
  chrRangeFromJpeg16_1920_c:       240.3
  chrRangeToJpeg8_1920_c:          444.3
  chrRangeToJpeg8_1920_lsx:         63.7 ( 6.36x)
  chrRangeToJpeg8_1920_lasx:        28.9 (15.31x)
  chrRangeToJpeg16_1920_c:         502.9
  lumRangeFromJpeg8_1920_c:        140.3
  lumRangeFromJpeg8_1920_lsx:       29.0 ( 4.83x)
  lumRangeFromJpeg8_1920_lasx:      15.8 ( 8.39x)
  lumRangeFromJpeg16_1920_c:        71.7
  lumRangeToJpeg8_1920_c:          303.4
  lumRangeToJpeg8_1920_lsx:         29.2 (10.34x)
  lumRangeToJpeg8_1920_lasx:        14.8 (20.47x)
  lumRangeToJpeg16_1920_c:         294.1
---
 libswscale/loongarch/swscale.S                | 478 +++++++++---------
 libswscale/loongarch/swscale_init_loongarch.c |  36 +-
 libswscale/loongarch/swscale_loongarch.h      |  16 +-
 3 files changed, 267 insertions(+), 263 deletions(-)

diff --git a/libswscale/loongarch/swscale.S b/libswscale/loongarch/swscale.S
index a7e8513192..38e75d1143 100644
--- a/libswscale/loongarch/swscale.S
+++ b/libswscale/loongarch/swscale.S
@@ -1868,16 +1868,15 @@ function ff_hscale_16_to_19_sub_lsx
 endfunc
 
 function lumRangeFromJpeg_lsx
-    li.w          t0,    14071
-    li.w          t1,    33561947
-    vreplgr2vr.h  vr0,   t0
-    srli.w        t2,    a1,    3
-    andi          t3,    a1,    7
-    beqz          t2,    2f
+    vreplgr2vr.h  vr0,   a2
+    vreplgr2vr.w  vr4,   a3
+    srli.w        t0,    a1,    3
+    andi          t1,    a1,    7
+    beqz          t0,    2f
 1:
     vld           vr1,   a0,    0
-    vreplgr2vr.w  vr2,   t1
-    vreplgr2vr.w  vr3,   t1
+    vor.v         vr2,   vr4,   vr4
+    vor.v         vr3,   vr4,   vr4
     vmaddwev.w.h  vr2,   vr0,   vr1
     vmaddwod.w.h  vr3,   vr0,   vr1
     vsrai.w       vr2,   vr2,   14
@@ -1885,33 +1884,32 @@ function lumRangeFromJpeg_lsx
     vpackev.h     vr1,   vr3,   vr2
     vst           vr1,   a0,    0
     addi.d        a0,    a0,    16
-    addi.d        t2,    t2,    -1
-    bnez          t2,    1b
+    addi.d        t0,    t0,    -1
+    bnez          t0,    1b
 2:
-    beqz          t3,    4f
+    beqz          t1,    4f
 3:
-    ld.h          t4,    a0,    0
-    mul.w         t4,    t4,    t0
-    add.w         t4,    t4,    t1
-    srai.w        t4,    t4,    14
-    st.h          t4,    a0,    0
+    ld.h          t2,    a0,    0
+    mul.w         t2,    t2,    a2
+    add.w         t2,    t2,    a3
+    srai.w        t2,    t2,    14
+    st.h          t2,    a0,    0
     addi.d        a0,    a0,    2
-    addi.d        t3,    t3,    -1
-    bnez          t3,    3b
+    addi.d        t1,    t1,    -1
+    bnez          t1,    3b
 4:
 endfunc
 
 function lumRangeFromJpeg_lasx
-    li.w           t0,    14071
-    li.w           t1,    33561947
-    xvreplgr2vr.h  xr0,   t0
-    srli.w         t2,    a1,    4
-    andi           t3,    a1,    15
-    beqz           t2,    2f
+    xvreplgr2vr.h  xr0,   a2
+    xvreplgr2vr.w  xr4,   a3
+    srli.w         t0,    a1,    4
+    andi           t1,    a1,    15
+    beqz           t0,    2f
 1:
     xvld           xr1,   a0,    0
-    xvreplgr2vr.w  xr2,   t1
-    xvreplgr2vr.w  xr3,   t1
+    xvor.v         xr2,   xr4,   xr4
+    xvor.v         xr3,   xr4,   xr4
     xvmaddwev.w.h  xr2,   xr0,   xr1
     xvmaddwod.w.h  xr3,   xr0,   xr1
     xvsrai.w       xr2,   xr2,   14
@@ -1919,318 +1917,330 @@ function lumRangeFromJpeg_lasx
     xvpackev.h     xr1,   xr3,   xr2
     xvst           xr1,   a0,    0
     addi.d         a0,    a0,    32
-    addi.d         t2,    t2,    -1
-    bnez           t2,    1b
+    addi.d         t0,    t0,    -1
+    bnez           t0,    1b
 2:
-    beqz          t3,    4f
+    beqz           t1,    4f
 3:
-    ld.h          t4,    a0,    0
-    mul.w         t4,    t4,    t0
-    add.w         t4,    t4,    t1
-    srai.w        t4,    t4,    14
-    st.h          t4,    a0,    0
-    addi.d        a0,    a0,    2
-    addi.d        t3,    t3,    -1
-    bnez          t3,    3b
+    ld.h           t2,    a0,    0
+    mul.w          t2,    t2,    a2
+    add.w          t2,    t2,    a3
+    srai.w         t2,    t2,    14
+    st.h           t2,    a0,    0
+    addi.d         a0,    a0,    2
+    addi.d         t1,    t1,    -1
+    bnez           t1,    3b
 4:
 endfunc
 
 function lumRangeToJpeg_lsx
-    li.w          t0,    19077
-    li.w          t1,    -39057361
-    li.w          t2,    30189
-    vreplgr2vr.h  vr0,   t0
-    vreplgr2vr.h  vr4,   t2
-    srli.w        t2,    a1,    3
-    andi          t3,    a1,    7
-    beqz          t2,    2f
+    vreplgr2vr.h  vr0,   a2
+    vreplgr2vr.w  vr4,   a3
+    lu12i.w       t4,    0x8
+    addi.w        t4,    t4,    -1
+    srli.w        t0,    a1,    3
+    andi          t1,    a1,    7
+    beqz          t0,    2f
 1:
     vld           vr1,   a0,    0
-    vreplgr2vr.w  vr2,   t1
-    vreplgr2vr.w  vr3,   t1
-    vmin.h        vr1,   vr1,   vr4
+    vor.v         vr2,   vr4,   vr4
+    vor.v         vr3,   vr4,   vr4
     vmaddwev.w.h  vr2,   vr0,   vr1
     vmaddwod.w.h  vr3,   vr0,   vr1
     vsrai.w       vr2,   vr2,   14
     vsrai.w       vr3,   vr3,   14
-    vpackev.h     vr1,   vr3,   vr2
-    vst           vr1,   a0,    0
+    vilvl.w       vr1,   vr3,   vr2
+    vilvh.w       vr2,   vr3,   vr2
+    vssrani.h.w   vr2,   vr1,   0
+    vst           vr2,   a0,    0
     addi.d        a0,    a0,    16
-    addi.d        t2,    t2,    -1
-    bnez          t2,    1b
+    addi.d        t0,    t0,    -1
+    bnez          t0,    1b
 2:
-    beqz          t3,    4f
+    beqz          t1,    4f
 3:
-    ld.h          t4,    a0,    0
-    vreplgr2vr.h  vr1,   t4
-    vmin.h        vr1,   vr1,   vr4
-    vpickve2gr.h  t4,    vr1,   0
-    mul.w         t4,    t4,    t0
-    add.w         t4,    t4,    t1
-    srai.w        t4,    t4,    14
+    ld.h          t2,    a0,    0
+    mul.w         t2,    t2,    a2
+    add.w         t2,    t2,    a3
+    srai.w        t2,    t2,    14
+    blt           t4,    t2,    5f
+    st.h          t2,    a0,    0
+    b             6f
+5:
     st.h          t4,    a0,    0
+6:
     addi.d        a0,    a0,    2
-    addi.d        t3,    t3,    -1
-    bnez          t3,    3b
+    addi.d        t1,    t1,    -1
+    bnez          t1,    3b
 4:
 endfunc
 
 function lumRangeToJpeg_lasx
-    li.w           t0,    19077
-    li.w           t1,    -39057361
-    li.w           t2,    30189
-    xvreplgr2vr.h  xr0,   t0
-    xvreplgr2vr.h  xr4,   t2
-    srli.w         t2,    a1,    4
-    andi           t3,    a1,    15
-    beqz           t2,    2f
+    xvreplgr2vr.h  xr0,   a2
+    xvreplgr2vr.w  xr4,   a3
+    lu12i.w        t4,    0x8
+    addi.w         t4,    t4,    -1
+    srli.w         t0,    a1,    4
+    andi           t1,    a1,    15
+    beqz           t0,    2f
 1:
     xvld           xr1,   a0,    0
-    xvreplgr2vr.w  xr2,   t1
-    xvreplgr2vr.w  xr3,   t1
-    xvmin.h        xr1,   xr1,   xr4
+    xvor.v         xr2,   xr4,   xr4
+    xvor.v         xr3,   xr4,   xr4
     xvmaddwev.w.h  xr2,   xr0,   xr1
     xvmaddwod.w.h  xr3,   xr0,   xr1
     xvsrai.w       xr2,   xr2,   14
     xvsrai.w       xr3,   xr3,   14
-    xvpackev.h     xr1,   xr3,   xr2
-    xvst           xr1,   a0,    0
+    xvilvl.w       xr1,   xr3,   xr2
+    xvilvh.w       xr2,   xr3,   xr2
+    xvssrani.h.w   xr2,   xr1,   0
+    xvst           xr2,   a0,    0
     addi.d         a0,    a0,    32
-    addi.d         t2,    t2,    -1
-    bnez           t2,    1b
+    addi.d         t0,    t0,    -1
+    bnez           t0,    1b
 2:
-    beqz           t3,    4f
+    beqz           t1,    4f
 3:
-    ld.h           t4,    a0,    0
-    vreplgr2vr.h   vr1,   t4
-    vmin.h         vr1,   vr1,   vr4
-    vpickve2gr.h   t4,    vr1,   0
-    mul.w          t4,    t4,    t0
-    add.w          t4,    t4,    t1
-    srai.w         t4,    t4,    14
+    ld.h           t2,    a0,    0
+    mul.w          t2,    t2,    a2
+    add.w          t2,    t2,    a3
+    srai.w         t2,    t2,    14
+    blt            t4,    t2,    5f
+    st.h           t2,    a0,    0
+    b              6f
+5:
     st.h           t4,    a0,    0
+6:
     addi.d         a0,    a0,    2
-    addi.d         t3,    t3,    -1
-    bnez           t3,    3b
+    addi.d         t1,    t1,    -1
+    bnez           t1,    3b
 4:
 endfunc
 
 function chrRangeFromJpeg_lsx
-    li.w          t0,    1799
-    li.w          t1,    4081085
-    vreplgr2vr.h  vr0,   t0
-    srli.w        t2,    a2,    3
-    andi          t3,    a2,    7
-    beqz          t2,    2f
+    vreplgr2vr.h  vr0,   a3
+    vreplgr2vr.w  vr7,   a4
+    srli.w        t0,    a2,    3
+    andi          t1,    a2,    7
+    beqz          t0,    2f
 1:
     vld           vr1,   a0,    0
     vld           vr2,   a1,    0
-    vreplgr2vr.w  vr3,   t1
-    vreplgr2vr.w  vr4,   t1
-    vreplgr2vr.w  vr5,   t1
-    vreplgr2vr.w  vr6,   t1
+    vor.v         vr3,   vr7,   vr7
+    vor.v         vr4,   vr7,   vr7
+    vor.v         vr5,   vr7,   vr7
+    vor.v         vr6,   vr7,   vr7
     vmaddwev.w.h  vr3,   vr0,   vr1
     vmaddwod.w.h  vr4,   vr0,   vr1
     vmaddwev.w.h  vr5,   vr0,   vr2
     vmaddwod.w.h  vr6,   vr0,   vr2
-    vsrai.w       vr3,   vr3,   11
-    vsrai.w       vr4,   vr4,   11
-    vsrai.w       vr5,   vr5,   11
-    vsrai.w       vr6,   vr6,   11
+    vsrai.w       vr3,   vr3,   14
+    vsrai.w       vr4,   vr4,   14
+    vsrai.w       vr5,   vr5,   14
+    vsrai.w       vr6,   vr6,   14
     vpackev.h     vr1,   vr4,   vr3
     vpackev.h     vr2,   vr6,   vr5
     vst           vr1,   a0,    0
     vst           vr2,   a1,    0
     addi.d        a0,    a0,    16
     addi.d        a1,    a1,    16
-    addi.d        t2,    t2,    -1
-    bnez          t2,    1b
+    addi.d        t0,    t0,    -1
+    bnez          t0,    1b
 2:
-    beqz          t3,    4f
+    beqz          t1,    4f
 3:
-    ld.h          t4,    a0,    0
-    ld.h          t5,    a1,    0
-    mul.w         t4,    t4,    t0
-    mul.w         t5,    t5,    t0
-    add.w         t4,    t4,    t1
-    add.w         t5,    t5,    t1
-    srai.w        t4,    t4,    11
-    srai.w        t5,    t5,    11
-    st.h          t4,    a0,    0
-    st.h          t5,    a1,    0
+    ld.h          t2,    a0,    0
+    ld.h          t3,    a1,    0
+    mul.w         t2,    t2,    a3
+    mul.w         t3,    t3,    a3
+    add.w         t2,    t2,    a4
+    add.w         t3,    t3,    a4
+    srai.w        t2,    t2,    14
+    srai.w        t3,    t3,    14
+    st.h          t2,    a0,    0
+    st.h          t3,    a1,    0
     addi.d        a0,    a0,    2
     addi.d        a1,    a1,    2
-    addi.d        t3,    t3,    -1
-    bnez          t3,    3b
+    addi.d        t1,    t1,    -1
+    bnez          t1,    3b
 4:
 endfunc
 
 function chrRangeFromJpeg_lasx
-    li.w           t0,    1799
-    li.w           t1,    4081085
-    xvreplgr2vr.h  xr0,   t0
-    srli.w         t2,    a2,    4
-    andi           t3,    a2,    15
-    beqz           t2,    2f
+    xvreplgr2vr.h  xr0,   a3
+    xvreplgr2vr.w  xr7,   a4
+    srli.w         t0,    a2,    4
+    andi           t1,    a2,    15
+    beqz           t0,    2f
 1:
     xvld           xr1,   a0,    0
     xvld           xr2,   a1,    0
-    xvreplgr2vr.w  xr3,   t1
-    xvreplgr2vr.w  xr4,   t1
-    xvreplgr2vr.w  xr5,   t1
-    xvreplgr2vr.w  xr6,   t1
+    xvor.v         xr3,   xr7,   xr7
+    xvor.v         xr4,   xr7,   xr7
+    xvor.v         xr5,   xr7,   xr7
+    xvor.v         xr6,   xr7,   xr7
     xvmaddwev.w.h  xr3,   xr0,   xr1
     xvmaddwod.w.h  xr4,   xr0,   xr1
     xvmaddwev.w.h  xr5,   xr0,   xr2
     xvmaddwod.w.h  xr6,   xr0,   xr2
-    xvsrai.w       xr3,   xr3,   11
-    xvsrai.w       xr4,   xr4,   11
-    xvsrai.w       xr5,   xr5,   11
-    xvsrai.w       xr6,   xr6,   11
+    xvsrai.w       xr3,   xr3,   14
+    xvsrai.w       xr4,   xr4,   14
+    xvsrai.w       xr5,   xr5,   14
+    xvsrai.w       xr6,   xr6,   14
     xvpackev.h     xr1,   xr4,   xr3
     xvpackev.h     xr2,   xr6,   xr5
     xvst           xr1,   a0,    0
     xvst           xr2,   a1,    0
     addi.d         a0,    a0,    32
     addi.d         a1,    a1,    32
-    addi.d         t2,    t2,    -1
-    bnez           t2,    1b
+    addi.d         t0,    t0,    -1
+    bnez           t0,    1b
 2:
-    beqz          t3,    4f
+    beqz           t1,    4f
 3:
-    ld.h          t4,    a0,    0
-    ld.h          t5,    a1,    0
-    mul.w         t4,    t4,    t0
-    mul.w         t5,    t5,    t0
-    add.w         t4,    t4,    t1
-    add.w         t5,    t5,    t1
-    srai.w        t4,    t4,    11
-    srai.w        t5,    t5,    11
-    st.h          t4,    a0,    0
-    st.h          t5,    a1,    0
-    addi.d        a0,    a0,    2
-    addi.d        a1,    a1,    2
-    addi.d        t3,    t3,    -1
-    bnez          t3,    3b
+    ld.h           t2,    a0,    0
+    ld.h           t3,    a1,    0
+    mul.w          t2,    t2,    a3
+    mul.w          t3,    t3,    a3
+    add.w          t2,    t2,    a4
+    add.w          t3,    t3,    a4
+    srai.w         t2,    t2,    14
+    srai.w         t3,    t3,    14
+    st.h           t2,    a0,    0
+    st.h           t3,    a1,    0
+    addi.d         a0,    a0,    2
+    addi.d         a1,    a1,    2
+    addi.d         t1,    t1,    -1
+    bnez           t1,    3b
 4:
 endfunc
 
 function chrRangeToJpeg_lsx
-    li.w          t0,    4663
-    li.w          t1,    -9289992
-    li.w          t2,    30775
-    vreplgr2vr.h  vr0,   t0
-    vreplgr2vr.h  vr7,   t2
-    srli.w        t2,    a2,    3
-    andi          t3,    a2,    7
-    beqz          t2,    2f
+    vreplgr2vr.h  vr0,   a3
+    vreplgr2vr.w  vr7,   a4
+    lu12i.w       t4,    0x8
+    addi.w        t4,    t4,    -1
+    srli.w        t0,    a2,    3
+    andi          t1,    a2,    7
+    beqz          t0,    2f
 1:
     vld           vr1,   a0,    0
     vld           vr2,   a1,    0
-    vreplgr2vr.w  vr3,   t1
-    vreplgr2vr.w  vr4,   t1
-    vreplgr2vr.w  vr5,   t1
-    vreplgr2vr.w  vr6,   t1
-    vmin.h        vr1,   vr1,   vr7
-    vmin.h        vr2,   vr2,   vr7
+    vor.v         vr3,   vr7,   vr7
+    vor.v         vr4,   vr7,   vr7
+    vor.v         vr5,   vr7,   vr7
+    vor.v         vr6,   vr7,   vr7
     vmaddwev.w.h  vr3,   vr0,   vr1
     vmaddwod.w.h  vr4,   vr0,   vr1
     vmaddwev.w.h  vr5,   vr0,   vr2
     vmaddwod.w.h  vr6,   vr0,   vr2
-    vsrai.w       vr3,   vr3,   12
-    vsrai.w       vr4,   vr4,   12
-    vsrai.w       vr5,   vr5,   12
-    vsrai.w       vr6,   vr6,   12
-    vpackev.h     vr1,   vr4,   vr3
-    vpackev.h     vr2,   vr6,   vr5
-    vst           vr1,   a0,    0
-    vst           vr2,   a1,    0
+    vsrai.w       vr3,   vr3,   14
+    vsrai.w       vr4,   vr4,   14
+    vsrai.w       vr5,   vr5,   14
+    vsrai.w       vr6,   vr6,   14
+    vilvl.w       vr1,   vr4,   vr3
+    vilvh.w       vr3,   vr4,   vr3
+    vssrani.h.w   vr3,   vr1,   0
+    vilvl.w       vr2,   vr6,   vr5
+    vilvh.w       vr5,   vr6,   vr5
+    vssrani.h.w   vr5,   vr2,   0
+    vst           vr3,   a0,    0
+    vst           vr5,   a1,    0
     addi.d        a0,    a0,    16
     addi.d        a1,    a1,    16
-    addi.d        t2,    t2,    -1
-    bnez          t2,    1b
+    addi.d        t0,    t0,    -1
+    bnez          t0,    1b
 2:
-    beqz          t3,    4f
+    beqz          t1,    4f
 3:
-    ld.h          t4,    a0,    0
-    ld.h          t5,    a1,    0
-    vreplgr2vr.h  vr1,   t4
-    vreplgr2vr.h  vr2,   t5
-    vmin.h        vr1,   vr1,   vr7
-    vmin.h        vr2,   vr2,   vr7
-    vpickve2gr.h  t4,    vr1,   0
-    vpickve2gr.h  t5,    vr2,   0
-    mul.w         t4,    t4,    t0
-    mul.w         t5,    t5,    t0
-    add.w         t4,    t4,    t1
-    add.w         t5,    t5,    t1
-    srai.w        t4,    t4,    12
-    srai.w        t5,    t5,    12
+    ld.h          t2,    a0,    0
+    ld.h          t3,    a1,    0
+    mul.w         t2,    t2,    a3
+    mul.w         t3,    t3,    a3
+    add.w         t2,    t2,    a4
+    add.w         t3,    t3,    a4
+    srai.w        t2,    t2,    14
+    srai.w        t3,    t3,    14
+    blt           t4,    t2,    5f
+    st.h          t2,    a0,    0
+    b             6f
+5:
     st.h          t4,    a0,    0
-    st.h          t5,    a1,    0
+6:
+    blt           t4,    t3,    7f
+    st.h          t3,    a1,    0
+    b             8f
+7:
+    st.h          t4,    a1,    0
+8:
     addi.d        a0,    a0,    2
     addi.d        a1,    a1,    2
-    addi.d        t3,    t3,    -1
-    bnez          t3,    3b
+    addi.d        t1,    t1,    -1
+    bnez          t1,    3b
 4:
 endfunc
 
 function chrRangeToJpeg_lasx
-    li.w           t0,    4663
-    li.w           t1,    -9289992
-    li.w           t2,    30775
-    xvreplgr2vr.h  xr0,   t0
-    xvreplgr2vr.h  xr7,   t2
-    srli.w         t2,    a2,    4
-    andi           t3,    a2,    15
-    beqz           t2,    2f
+    xvreplgr2vr.h  xr0,   a3
+    xvreplgr2vr.w  xr7,   a4
+    lu12i.w        t4,    0x8
+    addi.w         t4,    t4,    -1
+    srli.w         t0,    a2,    4
+    andi           t1,    a2,    15
+    beqz           t0,    2f
 1:
     xvld           xr1,   a0,    0
     xvld           xr2,   a1,    0
-    xvreplgr2vr.w  xr3,   t1
-    xvreplgr2vr.w  xr4,   t1
-    xvreplgr2vr.w  xr5,   t1
-    xvreplgr2vr.w  xr6,   t1
-    xvmin.h        xr1,   xr1,   xr7
-    xvmin.h        xr2,   xr2,   xr7
+    xvor.v         xr3,   xr7,   xr7
+    xvor.v         xr4,   xr7,   xr7
+    xvor.v         xr5,   xr7,   xr7
+    xvor.v         xr6,   xr7,   xr7
     xvmaddwev.w.h  xr3,   xr0,   xr1
     xvmaddwod.w.h  xr4,   xr0,   xr1
     xvmaddwev.w.h  xr5,   xr0,   xr2
     xvmaddwod.w.h  xr6,   xr0,   xr2
-    xvsrai.w       xr3,   xr3,   12
-    xvsrai.w       xr4,   xr4,   12
-    xvsrai.w       xr5,   xr5,   12
-    xvsrai.w       xr6,   xr6,   12
-    xvpackev.h     xr1,   xr4,   xr3
-    xvpackev.h     xr2,   xr6,   xr5
-    xvst           xr1,   a0,    0
-    xvst           xr2,   a1,    0
+    xvsrai.w       xr3,   xr3,   14
+    xvsrai.w       xr4,   xr4,   14
+    xvsrai.w       xr5,   xr5,   14
+    xvsrai.w       xr6,   xr6,   14
+    xvilvl.w       xr1,   xr4,   xr3
+    xvilvh.w       xr3,   xr4,   xr3
+    xvssrani.h.w   xr3,   xr1,   0
+    xvilvl.w       xr2,   xr6,   xr5
+    xvilvh.w       xr5,   xr6,   xr5
+    xvssrani.h.w   xr5,   xr2,   0
+    xvst           xr3,   a0,    0
+    xvst           xr5,   a1,    0
     addi.d         a0,    a0,    32
     addi.d         a1,    a1,    32
-    addi.d         t2,    t2,    -1
-    bnez           t2,    1b
+    addi.d         t0,    t0,    -1
+    bnez           t0,    1b
 2:
-    beqz          t3,    4f
+    beqz           t1,    4f
 3:
-    ld.h          t4,    a0,    0
-    ld.h          t5,    a1,    0
-    vreplgr2vr.h  vr1,   t4
-    vreplgr2vr.h  vr2,   t5
-    vmin.h        vr1,   vr1,   vr7
-    vmin.h        vr2,   vr2,   vr7
-    vpickve2gr.h  t4,    vr1,   0
-    vpickve2gr.h  t5,    vr2,   0
-    mul.w         t4,    t4,    t0
-    mul.w         t5,    t5,    t0
-    add.w         t4,    t4,    t1
-    add.w         t5,    t5,    t1
-    srai.w        t4,    t4,    12
-    srai.w        t5,    t5,    12
-    st.h          t4,    a0,    0
-    st.h          t5,    a1,    0
-    addi.d        a0,    a0,    2
-    addi.d        a1,    a1,    2
-    addi.d        t3,    t3,    -1
-    bnez          t3,    3b
+    ld.h           t2,    a0,    0
+    ld.h           t3,    a1,    0
+    mul.w          t2,    t2,    a3
+    mul.w          t3,    t3,    a3
+    add.w          t2,    t2,    a4
+    add.w          t3,    t3,    a4
+    srai.w         t2,    t2,    14
+    srai.w         t3,    t3,    14
+    blt            t4,    t2,    5f
+    st.h           t2,    a0,    0
+    b              6f
+5:
+    st.h           t4,    a0,    0
+6:
+    blt            t4,    t3,    7f
+    st.h           t3,    a1,    0
+    b              8f
+7:
+    st.h           t4,    a1,    0
+8:
+    addi.d         a0,    a0,    2
+    addi.d         a1,    a1,    2
+    addi.d         t1,    t1,    -1
+    bnez           t1,    3b
 4:
 endfunc
diff --git a/libswscale/loongarch/swscale_init_loongarch.c 
b/libswscale/loongarch/swscale_init_loongarch.c
index f0b8a7db12..0c937b047f 100644
--- a/libswscale/loongarch/swscale_init_loongarch.c
+++ b/libswscale/loongarch/swscale_init_loongarch.c
@@ -26,37 +26,31 @@
 
 av_cold void ff_sws_init_range_convert_loongarch(SwsInternal *c)
 {
-    /* This code is currently disabled because of changes in the base
-     * implementation of these functions. This code should be enabled
-     * again once those changes are ported to this architecture. */
-#if 0
     int cpu_flags = av_get_cpu_flags();
 
+    if (c->dstBpc > 14)
+        return;
+
     if (have_lsx(cpu_flags)) {
-        if (c->dstBpc <= 14) {
-            if (c->opts.src_range) {
-                c->lumConvertRange = lumRangeFromJpeg_lsx;
-                c->chrConvertRange = chrRangeFromJpeg_lsx;
-            } else {
-                c->lumConvertRange = lumRangeToJpeg_lsx;
-                c->chrConvertRange = chrRangeToJpeg_lsx;
-            }
+        if (c->opts.src_range) {
+            c->lumConvertRange = lumRangeFromJpeg_lsx;
+            c->chrConvertRange = chrRangeFromJpeg_lsx;
+        } else {
+            c->lumConvertRange = lumRangeToJpeg_lsx;
+            c->chrConvertRange = chrRangeToJpeg_lsx;
         }
     }
 #if HAVE_LASX
     if (have_lasx(cpu_flags)) {
-        if (c->dstBpc <= 14) {
-            if (c->opts.src_range) {
-                c->lumConvertRange = lumRangeFromJpeg_lasx;
-                c->chrConvertRange = chrRangeFromJpeg_lasx;
-            } else {
-                c->lumConvertRange = lumRangeToJpeg_lasx;
-                c->chrConvertRange = chrRangeToJpeg_lasx;
-            }
+        if (c->opts.src_range) {
+            c->lumConvertRange = lumRangeFromJpeg_lasx;
+            c->chrConvertRange = chrRangeFromJpeg_lasx;
+        } else {
+            c->lumConvertRange = lumRangeToJpeg_lasx;
+            c->chrConvertRange = chrRangeToJpeg_lasx;
         }
     }
 #endif // #if HAVE_LASX
-#endif
 }
 
 av_cold void ff_sws_init_swscale_loongarch(SwsInternal *c)
diff --git a/libswscale/loongarch/swscale_loongarch.h 
b/libswscale/loongarch/swscale_loongarch.h
index 15aa983f20..cff3964c22 100644
--- a/libswscale/loongarch/swscale_loongarch.h
+++ b/libswscale/loongarch/swscale_loongarch.h
@@ -50,10 +50,10 @@ void ff_hscale_16_to_19_sub_lsx(SwsInternal *c, int16_t 
*_dst, int dstW,
                                 const uint8_t *_src, const int16_t *filter,
                                 const int32_t *filterPos, int filterSize, int 
sh);
 
-void lumRangeFromJpeg_lsx(int16_t *dst, int width);
-void chrRangeFromJpeg_lsx(int16_t *dstU, int16_t *dstV, int width);
-void lumRangeToJpeg_lsx(int16_t *dst, int width);
-void chrRangeToJpeg_lsx(int16_t *dstU, int16_t *dstV, int width);
+void lumRangeFromJpeg_lsx(int16_t *dst, int width, uint32_t coeff, int64_t 
offset);
+void chrRangeFromJpeg_lsx(int16_t *dstU, int16_t *dstV, int width, uint32_t 
coeff, int64_t offset);
+void lumRangeToJpeg_lsx(int16_t *dst, int width, uint32_t coeff, int64_t 
offset);
+void chrRangeToJpeg_lsx(int16_t *dstU, int16_t *dstV, int width, uint32_t 
coeff, int64_t offset);
 
 void planar_rgb_to_uv_lsx(uint8_t *_dstU, uint8_t *_dstV, const uint8_t 
*src[4],
                           int width, int32_t *rgb2yuv, void *opq);
@@ -135,10 +135,10 @@ void ff_hscale_16_to_15_lasx(SwsInternal *c, int16_t 
*dst, int dstW,
                              const uint8_t *_src, const int16_t *filter,
                              const int32_t *filterPos, int filterSize);
 
-void lumRangeFromJpeg_lasx(int16_t *dst, int width);
-void chrRangeFromJpeg_lasx(int16_t *dstU, int16_t *dstV, int width);
-void lumRangeToJpeg_lasx(int16_t *dst, int width);
-void chrRangeToJpeg_lasx(int16_t *dstU, int16_t *dstV, int width);
+void lumRangeFromJpeg_lasx(int16_t *dst, int width, uint32_t coeff, int64_t 
offset);
+void chrRangeFromJpeg_lasx(int16_t *dstU, int16_t *dstV, int width, uint32_t 
coeff, int64_t offset);
+void lumRangeToJpeg_lasx(int16_t *dst, int width, uint32_t coeff, int64_t 
offset);
+void chrRangeToJpeg_lasx(int16_t *dstU, int16_t *dstV, int width, uint32_t 
coeff, int64_t offset);
 
 void planar_rgb_to_uv_lasx(uint8_t *_dstU, uint8_t *_dstV, const uint8_t 
*src[4],
                            int width, int32_t *rgb2yuv, void *opq);
-- 
2.52.0

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

Reply via email to