[FFmpeg-cvslog] avcodec/mips: cabac.h provide fallback for wsbh instruction

Jiaxun Yang git at videolan.org
Thu Jul 29 00:32:56 EEST 2021


ffmpeg | branch: master | Jiaxun Yang <jiaxun.yang at flygoat.com> | Fri Jul 23 13:53:44 2021 +0800| [2323d3a92376f34c4499ba9851a52e7ca9031d46] | committer: Michael Niedermayer

avcodec/mips: cabac.h provide fallback for wsbh instruction

wsbh is only avilable for MIPS R2+.
Provide a fallback for older processors.

Signed-off-by: Jiaxun Yang <jiaxun.yang at flygoat.com>
Reviewed-by: Shiyou Yin <yinshiyou-hf at loongson.cn>
Signed-off-by: Michael Niedermayer <michael at niedermayer.cc>

> http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=2323d3a92376f34c4499ba9851a52e7ca9031d46
---

 libavcodec/mips/cabac.h | 24 ++++++++++++++++++++++++
 1 file changed, 24 insertions(+)

diff --git a/libavcodec/mips/cabac.h b/libavcodec/mips/cabac.h
index f1e953dabe..39c308c7e0 100644
--- a/libavcodec/mips/cabac.h
+++ b/libavcodec/mips/cabac.h
@@ -77,7 +77,15 @@ static av_always_inline int get_cabac_inline_mips(CABACContext *c,
         "lhu          %[tmp0],       0(%[c_bytestream])            \n\t"
 #else
         "lhu          %[tmp0],       0(%[c_bytestream])            \n\t"
+#if HAVE_MIPS32R2 || HAVE_MIPS64R2
         "wsbh         %[tmp0],       %[tmp0]                       \n\t"
+#else
+        "and          %[tmp1],      %[tmp0],         0xff00ff00    \n\t"
+        "srl          %[tmp1],      %[tmp1],         8             \n\t"
+        "and          %[tmp0],      %[tmp0],         0x00ff00ff    \n\t"
+        "sll          %[tmp0],      %[tmp0],         8             \n\t"
+        "or           %[tmp0],      %[tmp0],         %[tmp1]       \n\t"
+#endif
 #endif
         PTR_SLL      "%[tmp0],       %[tmp0],        0x01          \n\t"
         PTR_SUBU     "%[tmp0],       %[tmp0],        %[cabac_mask] \n\t"
@@ -125,7 +133,15 @@ static av_always_inline int get_cabac_bypass_mips(CABACContext *c)
         "lhu        %[tmp1],         0(%[c_bytestream])                   \n\t"
 #else
         "lhu        %[tmp1],         0(%[c_bytestream])                   \n\t"
+#if HAVE_MIPS32R2 || HAVE_MIPS64R2
         "wsbh       %[tmp1],         %[tmp1]                              \n\t"
+#else
+        "and        %[tmp0],         %[tmp1],         0xff00ff00          \n\t"
+        "srl        %[tmp0],         %[tmp0],         8                   \n\t"
+        "and        %[tmp1],         %[tmp1],         0x00ff00ff          \n\t"
+        "sll        %[tmp1],         %[tmp1],         8                   \n\t"
+        "or         %[tmp1],         %[tmp1],         %[tmp0]             \n\t"
+#endif
 #endif
         PTR_SLL    "%[tmp1],         %[tmp1],         0x01                \n\t"
         PTR_SUBU   "%[tmp1],         %[tmp1],         %[cabac_mask]       \n\t"
@@ -169,7 +185,15 @@ static av_always_inline int get_cabac_bypass_sign_mips(CABACContext *c, int val)
         "lhu        %[tmp1],         0(%[c_bytestream])                   \n\t"
 #else
         "lhu        %[tmp1],         0(%[c_bytestream])                   \n\t"
+#if HAVE_MIPS32R2 || HAVE_MIPS64R2
         "wsbh       %[tmp1],         %[tmp1]                              \n\t"
+#else
+        "and        %[tmp0],         %[tmp1],         0xff00ff00          \n\t"
+        "srl        %[tmp0],         %[tmp0],         8                   \n\t"
+        "and        %[tmp1],         %[tmp1],         0x00ff00ff          \n\t"
+        "sll        %[tmp1],         %[tmp1],         8                   \n\t"
+        "or         %[tmp1],         %[tmp1],         %[tmp0]             \n\t"
+#endif
 #endif
         PTR_SLL    "%[tmp1],         %[tmp1],         0x01                \n\t"
         PTR_SUBU   "%[tmp1],         %[tmp1],         %[cabac_mask]       \n\t"



More information about the ffmpeg-cvslog mailing list