lightning
[Top][All Lists]
Advanced

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

[PATCH] ppc: Optimize jit_andi()


From: Paul Cercueil
Subject: [PATCH] ppc: Optimize jit_andi()
Date: Sat, 10 Sep 2022 12:36:15 +0100

When the immediate value is a mask (all bits set to 1 are consecutive)
or an inverted mask (all bits set to 0 are consecutive), it is possible
to simplify the code generation by using the RLWINM opcode.

Signed-off-by: Paul Cercueil <paul@crapouillou.net>
---
 lib/jit_ppc-cpu.c | 12 ++++++++++--
 1 file changed, 10 insertions(+), 2 deletions(-)

diff --git a/lib/jit_ppc-cpu.c b/lib/jit_ppc-cpu.c
index 24ea5b2..ef47f9a 100644
--- a/lib/jit_ppc-cpu.c
+++ b/lib/jit_ppc-cpu.c
@@ -1524,15 +1524,23 @@ _remi_u(jit_state_t *_jit, jit_int32_t r0, jit_int32_t 
r1, jit_word_t i0)
     jit_unget_reg(reg);
 }
 
+#  define is_mask(im)          ((im) ? (__builtin_popcountl((im) + (1 << 
__builtin_ctzl(im))) <= 1) : 0)
+
 static void
 _andi(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
 {
-    jit_int32_t                reg;
+    jit_int32_t                reg, offt;
     if (can_zero_extend_short_p(i0))
        ANDI_(r0, r1, i0);
     else if (can_zero_extend_int_p(i0) && !(i0 & 0x0000ffff))
        ANDIS_(r0, r1, (jit_uword_t)i0 >> 16);
-    else {
+    else if (__WORDSIZE == 32 && is_mask(i0)) {
+       offt = __builtin_ctzl(i0);
+       RLWINM(r0, r1, 0, 32 - offt - __builtin_popcountl(i0), 31 - offt);
+    } else if (__WORDSIZE == 32 && is_mask(~i0)) {
+       offt = __builtin_ctzl(~i0);
+       RLWINM(r0, r1, 0, 32 - offt, 31 - offt - __builtin_popcountl(~i0));
+    } else {
        reg = jit_get_reg(jit_class_gpr);
        movi(rn(reg), i0);
        AND(r0, r1, rn(reg));
-- 
2.35.1




reply via email to

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