lightning.git - Portable just-in-time compiler library

index : lightning.git
Portable just-in-time compiler library
summary refs log tree commit diff
diff options
context:
space:
mode:
Diffstat
-rw-r--r--lib/jit_fallback.c 145
1 files changed, 103 insertions, 42 deletions
diff --git a/lib/jit_fallback.c b/lib/jit_fallback.c
index d8b260f..ca9db02 100644
--- a/lib/jit_fallback.c
+++ b/lib/jit_fallback.c
@@ -21,13 +21,41 @@ static void _fallback_cto(jit_state_t*, jit_int32_t, jit_int32_t);
#define fallback_ctz(r0,r1) _fallback_ctz(_jit,r0,r1)
static void _fallback_ctz(jit_state_t*, jit_int32_t, jit_int32_t);
# if defined(__ia64__)
-# define fallback_patch_jmpi(inst,lbl) \
- do { \
- sync(); \
- patch_at(jit_code_jmpi, inst, lbl); \
- } while (0)
+# define fallback_flush() sync()
+# elif defined(__mips__)
+# define fallback_flush() flush()
+# else
+# define fallback_flush() /**/
+# endif
+# if defined(__mips__)
+# define fallback_jmpi(i0) jmpi(i0, 1)
+# elif defined(__arm__)
+# define fallback_jmpi(i0) jmpi_p(i0, 1)
+# elif defined(__s390__) || defined(__s390x__)
+# define fallback_jmpi(i0) jmpi(i0, 1)
# else
-# define fallback_patch_jmpi(inst,lbl) fallback_patch_at(inst,lbl)
+# define fallback_jmpi(i0) jmpi(i0)
+# endif
+# if defined(__s390__) || defined(__s390x__)
+# define fallback_bnei(i0,r0,i1) bnei_p(i0,r0,i1)
+# define fallback_blei(i0,r0,i1) blei_p(i0,r0,i1)
+# define fallback_bmsr(i0,r0,r1) bmsr_p(i0,r0,r1)
+# define fallback_bmsi(i0,r0,i1) bmsi_p(i0,r0,i1)
+# else
+# define fallback_bnei(i0,r0,r1) bnei(i0,r0,r1)
+# define fallback_blei(i0,r0,r1) blei(i0,r0,r1)
+# define fallback_bmsr(i0,r0,r1) bmsr(i0,r0,r1)
+# define fallback_bmsi(i0,r0,i1) bmsi(i0,r0,i1)
+# endif
+# if defined(__ia64__)
+# define fallback_patch_jmpi(inst, lbl) \
+ patch_at(jit_code_jmpi, inst, lbl)
+ # elif defined(__arm__)
+# define fallback_patch_jmpi(inst, lbl) \
+ patch_at(arm_patch_jump, inst, lbl)
+# else
+# define fallback_patch_jmpi(inst, lbl) \
+ patch_at(inst, lbl)
# endif
# if defined(__arm__)
# define fallback_patch_at(inst,lbl) patch_at(arm_patch_jump,inst,lbl)
@@ -46,26 +74,39 @@ static void _fallback_ctz(jit_state_t*, jit_int32_t, jit_int32_t);
# else
# define fallback_patch_at(inst,lbl) patch_at(inst,lbl)
# endif
-# if defined(__mips__)
-# define fallback_jmpi(i0) jmpi(i0,1)
+# if defined(__ia64__)
+# define fallback_patch_jmpi(inst, lbl) \
+ patch_at(jit_code_jmpi, inst, lbl)
+# define fallback_patch_bnei(inst, lbl) \
+ patch_at(jit_code_bnei, inst, lbl)
+# define fallback_patch_blei(inst, lbl) \
+ patch_at(jit_code_blei, inst, lbl)
+# define fallback_patch_bmsr(inst, lbl) \
+ patch_at(jit_code_bmsr, inst, lbl)
+# define fallback_patch_bmsi(inst, lbl) \
+ patch_at(jit_code_bmsi, inst, lbl)
# elif defined(__arm__)
-# define fallback_jmpi(i0) jmpi_p(i0,1)
-# elif defined(__s390__) || defined(__s390x__)
-# define fallback_jmpi(i0) jmpi(i0,1)
-# else
-# define fallback_jmpi(i0) jmpi(i0)
-# endif
-# if defined(__mips__)
-# define fallback_bnei(i0,r0,i1) bnei(i0,r0,i1)
-# elif defined(__s390__) || defined(__s390x__)
-# define fallback_bnei(i0,r0,i1) bnei_p(i0,r0,i1)
-# else
-# define fallback_bnei(i0,r0,i1) bnei(i0,r0,i1)
-# endif
-# if defined(__s390__) || defined(__s390x__)
-# define fallback_bmsr(i0,r0,r1) bmsr_p(i0,r0,r1)
-# else
-# define fallback_bmsr(i0,r0,r1) bmsr(i0,r0,r1)
+# define fallback_patch_jmpi(inst, lbl) \
+ patch_at(arm_patch_jump,inst, lbl)
+# define fallback_patch_bnei(inst, lbl) \
+ patch_at(arm_patch_jump,inst, lbl)
+# define fallback_patch_blei(inst, lbl) \
+ patch_at(arm_patch_jump,inst, lbl)
+# define fallback_patch_bmsr(inst, lbl) \
+ patch_at(arm_patch_jump,inst, lbl)
+# define fallback_patch_bmsi(inst, lbl) \
+ patch_at(arm_patch_jump,inst, lbl)
+ # else
+# define fallback_patch_jmpi(inst, lbl) \
+ patch_at(inst, lbl)
+# define fallback_patch_bnei(inst, lbl) \
+ patch_at(inst, lbl)
+# define fallback_patch_blei(inst, lbl) \
+ patch_at(inst, lbl)
+# define fallback_patch_bmsr(inst, lbl) \
+ patch_at(inst, lbl)
+# define fallback_patch_bmsi(inst, lbl) \
+ patch_at(inst, lbl)
# endif
#endif
@@ -195,10 +236,11 @@ _fallback_casx(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1,
str_l(r1, r3);
# endif
/* done: */
+ fallback_flush();
done = _jit->pc.w;
fallback_calli((jit_word_t)pthread_mutex_unlock, (jit_word_t)&mutex);
fallback_load(r0);
- fallback_patch_at(jump, done);
+ fallback_patch_bnei(jump, done);
fallback_load_regs(r0);
if (iscasi)
jit_unget_reg(r1_reg);
@@ -211,9 +253,12 @@ _fallback_clo(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
comr(r0, r1);
clz = fallback_bnei(_jit->pc.w, r0, 0);
movi(r0, __WORDSIZE);
+ fallback_flush();
done = fallback_jmpi(_jit->pc.w);
- fallback_patch_at(clz, _jit->pc.w);
+ fallback_flush();
+ fallback_patch_bnei(clz, _jit->pc.w);
fallback_clz(r0, r0);
+ fallback_flush();
fallback_patch_jmpi(done, _jit->pc.w);
}
@@ -225,7 +270,8 @@ _fallback_clz(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
l32 = fallback_bnei(_jit->pc.w, r1, 0);
movi(r0, __WORDSIZE);
clz = fallback_jmpi(_jit->pc.w);
- fallback_patch_at(l32, _jit->pc.w);
+ fallback_flush();
+ fallback_patch_bnei(l32, _jit->pc.w);
r2_reg = jit_get_reg(jit_class_gpr);
r2 = rn(r2_reg);
r1_reg = jit_get_reg(jit_class_gpr);
@@ -237,7 +283,8 @@ _fallback_clz(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
l32 = fallback_bmsr(_jit->pc.w, r1, r2);
lshi(r1, r1, 32);
addi(r0, r0, 32);
- fallback_patch_at(l32, _jit->pc.w);
+ fallback_flush();
+ fallback_patch_bmsr(l32, _jit->pc.w);
lshi(r2, r2, 16);
# else
movi(r2, 0xffff0000UL);
@@ -245,26 +292,31 @@ _fallback_clz(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
l16 = fallback_bmsr(_jit->pc.w, r1, r2);
lshi(r1, r1, 16);
addi(r0, r0, 16);
- fallback_patch_at(l16, _jit->pc.w);
+ fallback_flush();
+ fallback_patch_bmsr(l16, _jit->pc.w);
lshi(r2, r2, 8);
l8 = fallback_bmsr(_jit->pc.w, r1, r2);
lshi(r1, r1, 8);
addi(r0, r0, 8);
- fallback_patch_at(l8, _jit->pc.w);
+ fallback_flush();
+ fallback_patch_bmsr(l8, _jit->pc.w);
lshi(r2, r2, 4);
l4 = fallback_bmsr(_jit->pc.w, r1, r2);
lshi(r1, r1, 4);
addi(r0, r0, 4);
- fallback_patch_at(l4, _jit->pc.w);
+ fallback_flush();
+ fallback_patch_bmsr(l4, _jit->pc.w);
lshi(r2, r2, 2);
l2 = fallback_bmsr(_jit->pc.w, r1, r2);
lshi(r1, r1, 2);
addi(r0, r0, 2);
- fallback_patch_at(l2, _jit->pc.w);
+ fallback_flush();
+ fallback_patch_bmsr(l2, _jit->pc.w);
lshi(r2, r2, 1);
l1 = fallback_bmsr(_jit->pc.w, r1, r2);
addi(r0, r0, 1);
- fallback_patch_at(l1, _jit->pc.w);
+ fallback_flush();
+ fallback_patch_bmsr(l1, _jit->pc.w);
fallback_patch_jmpi(clz, _jit->pc.w);
jit_unget_reg(r2_reg);
jit_unget_reg(r1_reg);
@@ -278,8 +330,10 @@ _fallback_cto(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
ctz = fallback_bnei(_jit->pc.w, r0, 0);
movi(r0, __WORDSIZE);
done = fallback_jmpi(_jit->pc.w);
- fallback_patch_at(ctz, _jit->pc.w);
+ fallback_flush();
+ fallback_patch_bnei(ctz, _jit->pc.w);
fallback_ctz(r0, r0);
+ fallback_flush();
fallback_patch_jmpi(done, _jit->pc.w);
}
@@ -291,7 +345,8 @@ _fallback_ctz(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
l32 = fallback_bnei(_jit->pc.w, r1, 0);
movi(r0, __WORDSIZE);
ctz = fallback_jmpi(_jit->pc.w);
- fallback_patch_at(l32, _jit->pc.w);
+ fallback_flush();
+ fallback_patch_bnei(l32, _jit->pc.w);
r2_reg = jit_get_reg(jit_class_gpr);
r2 = rn(r2_reg);
r1_reg = jit_get_reg(jit_class_gpr);
@@ -303,7 +358,8 @@ _fallback_ctz(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
l32 = fallback_bmsr(_jit->pc.w, r1, r2);
rshi_u(r1, r1, 32);
addi(r0, r0, 32);
- fallback_patch_at(l32, _jit->pc.w);
+ fallback_flush();
+ fallback_patch_bmsr(l32, _jit->pc.w);
rshi(r2, r2, 16);
# else
movi(r2, 0xffffUL);
@@ -311,26 +367,31 @@ _fallback_ctz(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
l16 = fallback_bmsr(_jit->pc.w, r1, r2);
rshi_u(r1, r1, 16);
addi(r0, r0, 16);
- fallback_patch_at(l16, _jit->pc.w);
+ fallback_flush();
+ fallback_patch_bmsr(l16, _jit->pc.w);
rshi(r2, r2, 8);
l8 = fallback_bmsr(_jit->pc.w, r1, r2);
rshi_u(r1, r1, 8);
addi(r0, r0, 8);
- fallback_patch_at(l8, _jit->pc.w);
+ fallback_flush();
+ fallback_patch_bmsr(l8, _jit->pc.w);
rshi(r2, r2, 4);
l4 = fallback_bmsr(_jit->pc.w, r1, r2);
rshi_u(r1, r1, 4);
addi(r0, r0, 4);
- fallback_patch_at(l4, _jit->pc.w);
+ fallback_flush();
+ fallback_patch_bmsr(l4, _jit->pc.w);
rshi(r2, r2, 2);
l2 = fallback_bmsr(_jit->pc.w, r1, r2);
rshi_u(r1, r1, 2);
addi(r0, r0, 2);
- fallback_patch_at(l2, _jit->pc.w);
+ fallback_flush();
+ fallback_patch_bmsr(l2, _jit->pc.w);
rshi(r2, r2, 1);
l1 = fallback_bmsr(_jit->pc.w, r1, r2);
addi(r0, r0, 1);
- fallback_patch_at(l1, _jit->pc.w);
+ fallback_flush();
+ fallback_patch_bmsr(l1, _jit->pc.w);
fallback_patch_jmpi(ctz, _jit->pc.w);
jit_unget_reg(r2_reg);
jit_unget_reg(r1_reg);
generated by cgit v1.2.3 (git 2.39.1) at 2025年09月20日 23:20:48 +0000

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