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
diff options
context:
space:
mode:
authorpcpa <paulo.cesar.pereira.de.andrade@gmail.com>2023年02月17日 11:55:21 -0300
committerpcpa <paulo.cesar.pereira.de.andrade@gmail.com>2023年02月17日 11:55:21 -0300
commit2bcbc50e1cb795b9379a69e84374bf705ab12ef5 (patch)
tree33cc321cb0c8e2d9efebb7c5eff8f25713870bdb /lib
parent516dfc1743d4bce3a09c1594fc0adfc2ee5308a3 (diff)
downloadlightning-2bcbc50e1cb795b9379a69e84374bf705ab12ef5.tar.gz
ia64: The clz instruction is optional
Add assembly code to test for the clz instruction feature and correct call to the fallback_cto to reduce generated code size. Also increment default JIT_INSTR_MAX to avoid crashes due to out of bounds write in "make get_jit_size".
Diffstat (limited to 'lib')
-rw-r--r--lib/jit_ia64-cpu.c 42
-rw-r--r--lib/jit_ia64-sz.c 4
-rw-r--r--lib/jit_ia64.c 6
-rw-r--r--lib/jit_size.c 2
4 files changed, 31 insertions, 23 deletions
diff --git a/lib/jit_ia64-cpu.c b/lib/jit_ia64-cpu.c
index 35338a0..73a3b14 100644
--- a/lib/jit_ia64-cpu.c
+++ b/lib/jit_ia64-cpu.c
@@ -3524,41 +3524,43 @@ _bitswap(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
static void
_clzr(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
{
-#if 0 /* FIXME Encoding is correct but gives SIGILL -
- * binutils also does not disassemble it */
- CLZ(r0, r1);
-#else
- fallback_clz(r0, r1);
-#endif
+ if (jit_cpu.clz)
+ CLZ(r0, r1);
+ else
+ fallback_clz(r0, r1);
}
static void
_clor(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
{
-#if 0
- comr(r0, r1);
- clzr(r0, r0);
-#else
- fallback_clo(r0, r1);
-#endif
+ if (jit_cpu.clz) {
+ comr(r0, r1);
+ clzr(r0, r0);
+ }
+ else
+ fallback_clo(r0, r1);
}
static void
_ctor(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
{
-#if 0
- bitswap(r0, r1);
- clor(r0, r0);
-#else
- fallback_cto(r0, r1);
-#endif
+ if (jit_cpu.clz) {
+ bitswap(r0, r1);
+ clor(r0, r0);
+ }
+ else
+ fallback_cto(r0, r1);
}
static void
_ctzr(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
{
- bitswap(r0, r1);
- clzr(r0, r0);
+ if (jit_cpu.clz) {
+ bitswap(r0, r1);
+ clzr(r0, r0);
+ }
+ else
+ fallback_ctz(r0, r1);
}
static void
diff --git a/lib/jit_ia64-sz.c b/lib/jit_ia64-sz.c
index d9c912a..e1d973c 100644
--- a/lib/jit_ia64-sz.c
+++ b/lib/jit_ia64-sz.c
@@ -1,5 +1,5 @@
#if __WORDSIZE == 64
-#define JIT_INSTR_MAX 896
+#define JIT_INSTR_MAX 608
0, /* data */
0, /* live */
48, /* align */
@@ -448,5 +448,5 @@
608, /* clo */
544, /* clz */
608, /* cto */
- 896, /* ctz */
+ 544, /* ctz */
#endif /* __WORDSIZE */
diff --git a/lib/jit_ia64.c b/lib/jit_ia64.c
index 7ee1bd1..90915a2 100644
--- a/lib/jit_ia64.c
+++ b/lib/jit_ia64.c
@@ -58,6 +58,7 @@ extern void __clear_cache(void *, void *);
/*
* Initialization
*/
+jit_cpu_t jit_cpu;
jit_register_t _rvs[] = {
/* Always 0 */
{ 0, "r0" },
@@ -239,6 +240,11 @@ jit_register_t _rvs[] = {
void
jit_get_cpu(void)
{
+ jit_word_t clz = -1;
+ __asm__ volatile("tf.nz.unc p6,p7=32;(p6)mov %0=1;(p7)mov %0=0"
+ : "=r" (clz));
+ assert(clz == 0 || clz == 1);
+ jit_cpu.clz = clz;
}
void
diff --git a/lib/jit_size.c b/lib/jit_size.c
index 2578277..e9a1491 100644
--- a/lib/jit_size.c
+++ b/lib/jit_size.c
@@ -28,7 +28,7 @@
*/
static jit_int16_t _szs[jit_code_last_code] = {
#if GET_JIT_SIZE
-# define JIT_INSTR_MAX 512
+# define JIT_INSTR_MAX 1024
#else
# if defined(__i386__) || defined(__x86_64__)
# include "jit_x86-sz.c"
generated by cgit v1.2.3 (git 2.25.1) at 2025年09月17日 06:20:59 +0000

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