[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