lightning
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[PATCH 2/2] mips: Optimize jit_ctor() / jit_ctzr()


From: Paul Cercueil
Subject: [PATCH 2/2] mips: Optimize jit_ctor() / jit_ctzr()
Date: Wed, 8 Mar 2023 00:33:01 +0000

The jit_ctzr() can be performed with just 5 instructions and 2 temporary
registers. The jit_ctor() can be performed by just inversing all bits
then calculating the ctzr().

Signed-off-by: Paul Cercueil <paul@crapouillou.net>
---
 lib/jit_mips-cpu.c | 61 +++++++++++++++++++---------------------------
 1 file changed, 25 insertions(+), 36 deletions(-)

diff --git a/lib/jit_mips-cpu.c b/lib/jit_mips-cpu.c
index d71a5b5..7babc86 100644
--- a/lib/jit_mips-cpu.c
+++ b/lib/jit_mips-cpu.c
@@ -1670,49 +1670,38 @@ _clzr(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
 static void
 _ctor(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
 {
-    if (jit_mips2_p()) {
-       if (jit_mips6_p()) {
-#if __WORDSIZE == 32
-           BITSWAP(r0, r1);
-           bswapr_ui(r0, r0);
-           CLO_R6(r0, r0);
-#else
-           DBITSWAP(r0, r1);
-           bswapr_ul(r0, r0);
-           DCLO_R6(r0, r0);
-#endif
-       }
-       else {
-           fallback_bitswap(r0, r1);
-           clor(r0, r0);
-       }
+    if (jit_mips6_p()) {
+        rbitr(r0, r1);
+        clor(r0, r0);
+    }
+    else {
+        comr(r0, r1);
+        ctzr(r0, r0);
     }
-    else
-       fallback_cto(r0, r1);
 }
 
 static void
 _ctzr(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
 {
-  if (jit_mips2_p()) {
-       if (jit_mips6_p()) {
-#if __WORDSIZE == 32
-           BITSWAP(r0, r1);
-           bswapr_ui(r0, r0);
-           CLZ_R6(r0, r0);
-#else
-           DBITSWAP(r0, r1);
-           bswapr_ul(r0, r0);
-           DCLZ_R6(r0, r0);
-#endif
-       }
-       else {
-           fallback_bitswap(r0, r1);
-           clzr(r0, r0);
-       }
+    if (jit_mips6_p()) {
+        rbitr(r0, r1);
+        clzr(r0, r0);
+    }
+    else {
+        jit_int32_t     t0, t1;
+
+        t0 = jit_get_reg(jit_class_gpr);
+        t1 = jit_get_reg(jit_class_gpr);
+
+        negr(rn(t0), r1);
+        andr(rn(t0), rn(t0), r1);
+        clzr(r0, rn(t0));
+        xori(rn(t1), r0, __WORDSIZE - 1);
+        movnr(r0, rn(t1), rn(t0));
+
+        jit_unget_reg(t0);
+        jit_unget_reg(t1);
     }
-    else
-       fallback_ctz(r0, r1);
 }
 
 static void
-- 
2.39.2




reply via email to

[Prev in Thread] Current Thread [Next in Thread]