Avoid expensive bit reverse for count of trailing zeros or ones - lightning.git - Portable just-in-time compiler library

index : lightning.git
Portable just-in-time compiler library
summary refs log tree commit diff
path: root/lib/jit_ia64-cpu.c
diff options
context:
space:
mode:
authorpcpa <paulo.cesar.pereira.de.andrade@gmail.com>2023年03月09日 09:32:03 -0300
committerpcpa <paulo.cesar.pereira.de.andrade@gmail.com>2023年03月09日 09:32:03 -0300
commita78fda56dcf723fcdd6cb032c394a0330d4fe36f (patch)
tree8087e99c7a1aac69cc08e8cd22bb070a93e9e9bf /lib/jit_ia64-cpu.c
parent9ad57b7a90803b95a2c822e259cfb7113a38a72c (diff)
downloadlightning-a78fda56dcf723fcdd6cb032c394a0330d4fe36f.tar.gz
Avoid expensive bit reverse for count of trailing zeros or ones
Diffstat (limited to 'lib/jit_ia64-cpu.c')
-rw-r--r--lib/jit_ia64-cpu.c 16
1 files changed, 12 insertions, 4 deletions
diff --git a/lib/jit_ia64-cpu.c b/lib/jit_ia64-cpu.c
index 9e3cee1..1c89029 100644
--- a/lib/jit_ia64-cpu.c
+++ b/lib/jit_ia64-cpu.c
@@ -3498,8 +3498,8 @@ static void
_ctor(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
{
if (jit_cpu.clz) {
- fallback_bitswap(r0, r1);
- clor(r0, r0);
+ comr(r0, r1);
+ ctzr(r0, r0);
}
else
fallback_cto(r0, r1);
@@ -3508,9 +3508,17 @@ _ctor(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
static void
_ctzr(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
{
+ jit_int32_t t0, t1;
if (jit_cpu.clz) {
- fallback_bitswap(r0, r1);
- clzr(r0, r0);
+ 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);
generated by cgit v1.2.3 (git 2.39.1) at 2025年09月16日 11:27:00 +0000

AltStyle によって変換されたページ (->オリジナル) /