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_mips-cpu.c
diff options
context:
space:
mode:
Diffstat (limited to 'lib/jit_mips-cpu.c')
-rw-r--r--lib/jit_mips-cpu.c 28
1 files changed, 20 insertions, 8 deletions
diff --git a/lib/jit_mips-cpu.c b/lib/jit_mips-cpu.c
index 033315e..028b806 100644
--- a/lib/jit_mips-cpu.c
+++ b/lib/jit_mips-cpu.c
@@ -757,8 +757,8 @@ static jit_word_t _bmsi(jit_state_t*,jit_word_t,jit_int32_t,jit_word_t);
static jit_word_t _bmcr(jit_state_t*,jit_word_t,jit_int32_t,jit_int32_t);
# define bmci(i0,r0,i1) _bmci(_jit,i0,r0,i1)
static jit_word_t _bmci(jit_state_t*,jit_word_t,jit_int32_t,jit_word_t);
-# define callr(r0) _callr(_jit,r0)
-static void _callr(jit_state_t*,jit_int32_t);
+# define callr(r0,prev) _callr(_jit,r0,prev)
+static void _callr(jit_state_t*,jit_int32_t,jit_node_t*);
# define calli(i0) _calli(_jit,i0)
static void _calli(jit_state_t*,jit_word_t);
# define calli_p(i0) _calli_p(_jit,i0)
@@ -3167,13 +3167,25 @@ _bmci(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_word_t i1)
}
static void
-_callr(jit_state_t *_jit, jit_int32_t r0)
+_callr(jit_state_t *_jit, jit_int32_t r0, jit_node_t *prev)
{
- JALR(r0);
- if (r0 != _T9_REGNO)
- movr(_T9_REGNO, r0);
- else
- NOP(1);
+ jit_bool_t swap_ds;
+ jit_int32_t op;
+
+ if (r0 != _T9_REGNO) {
+ JALR(r0);
+ movr(_T9_REGNO, r0);
+ } else {
+ swap_ds = can_swap_ds(prev, r0, 0);
+ if (swap_ds)
+ op = *--_jit->pc.ui;
+
+ JALR(r0);
+ if (swap_ds)
+ ii(op);
+ else
+ NOP(1);
+ }
}
static void
generated by cgit v1.2.3 (git 2.39.1) at 2025年09月12日 18:53:26 +0000

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