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:
authorpcpa <paulo.cesar.pereira.de.andrade@gmail.com>2023年03月17日 17:00:32 -0300
committerpcpa <paulo.cesar.pereira.de.andrade@gmail.com>2023年03月17日 17:00:32 -0300
commit4542c50f5d702efaa122753341744a3b06f0434f (patch)
tree7a86e5986fa089c31947e96bc62e5f45d15f5faa /lib/jit_mips-cpu.c
parent126f30d797d858222b6341a0f2ce7260e2b11243 (diff)
downloadlightning-4542c50f5d702efaa122753341744a3b06f0434f.tar.gz
mips: Implement ext, ext_u and dep.
Diffstat (limited to 'lib/jit_mips-cpu.c')
-rw-r--r--lib/jit_mips-cpu.c 82
1 files changed, 82 insertions, 0 deletions
diff --git a/lib/jit_mips-cpu.c b/lib/jit_mips-cpu.c
index c2a6070..9f85043 100644
--- a/lib/jit_mips-cpu.c
+++ b/lib/jit_mips-cpu.c
@@ -747,6 +747,12 @@ static void _bswapr_ui(jit_state_t*,jit_int32_t,jit_int32_t);
# define bswapr_ul(r0,r1) _bswapr_ul(_jit,r0,r1)
static void _bswapr_ul(jit_state_t*,jit_int32_t,jit_int32_t);
# endif
+#define ext(r0,r1,i0,i1) _ext(_jit,r0,r1,i0,i1)
+static void _ext(jit_state_t*,jit_int32_t,jit_int32_t,jit_word_t,jit_word_t);
+#define ext_u(r0,r1,i0,i1) _ext_u(_jit,r0,r1,i0,i1)
+static void _ext_u(jit_state_t*,jit_int32_t,jit_int32_t,jit_word_t,jit_word_t);
+#define dep(r0,r1,i0,i1) _dep(_jit,r0,r1,i0,i1)
+static void _dep(jit_state_t*,jit_int32_t,jit_int32_t,jit_word_t,jit_word_t);
# define extr_c(r0,r1) _extr_c(_jit,r0,r1)
static void _extr_c(jit_state_t*,jit_int32_t,jit_int32_t);
# define extr_uc(r0,r1) ANDI(r0,r1,0xff)
@@ -2938,6 +2944,82 @@ _bswapr_ul(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
#endif
static void
+_ext(jit_state_t *_jit,
+ jit_int32_t r0, jit_int32_t r1, jit_word_t i0, jit_word_t i1)
+{
+ assert(i0 >= 0 && i1 >= 1 && i0 + i1 <= __WORDSIZE);
+ if ( i1 == __WORDSIZE)
+ movr(r0, r1);
+ else {
+# if __BYTE_ORDER == __BIG_ENDIAN
+ i0 = __WORDSIZE - (i0 + i1);
+# endif
+ lshi(r0, r1, __WORDSIZE - (i0 + i1));
+ rshi(r0, r0, __WORDSIZE - i1);
+ }
+}
+
+static void
+_ext_u(jit_state_t *_jit,
+ jit_int32_t r0, jit_int32_t r1, jit_word_t i0, jit_word_t i1)
+{
+ assert(i0 >= 0 && i1 >= 1 && i0 + i1 <= __WORDSIZE);
+ if (jit_mips2_p()) {
+ if (i1 == __WORDSIZE)
+ movr(r0, r1);
+ else {
+# if __BYTE_ORDER == __BIG_ENDIAN
+ i0 = __WORDSIZE - (i0 + i1);
+# endif
+#if __WORDSIZE == 32
+ EXT(r0, r1, i0, i1);
+#else
+ if (i0 < 32 && i1 <= 32)
+ DEXT(r0, r1, i0, i1);
+ else if (i0 < 32 && i1 > 32)
+ DEXTM(r0, r1, i0, i1);
+ else {
+ assert(i0 >= 32 && i1 <= 32);
+ DEXTU(r0, r1, i0, i1);
+ }
+ }
+#endif
+ }
+ else
+ fallback_ext_u(r0, r1, i0, i1);
+}
+
+static void
+_dep(jit_state_t *_jit,
+ jit_int32_t r0, jit_int32_t r1, jit_word_t i0, jit_word_t i1)
+{
+ assert(i0 >= 0 && i1 >= 1 && i0 + i1 <= __WORDSIZE);
+ if (jit_mips2_p()) {
+ if (i1 == __WORDSIZE)
+ movr(r0, r1);
+ else {
+# if __BYTE_ORDER == __BIG_ENDIAN
+ i0 = __WORDSIZE - (i0 + i1);
+# endif
+#if __WORDSIZE == 32
+ INS(r0, r1, i0, i1);
+#else
+ if (i0 < 32 && i1 <= 32 && (i0 + i1) <= 32)
+ DINS(r0, r1, i0, i1);
+ else if (i0 < 32 && i1 >= 2 && (i0 + i1) > 32)
+ DINSM(r0, r1, i0, i1);
+ else {
+ assert(i0 >= 32 && i1 >= 1 && i1 <= 32 && (i0 + i1) > 32);
+ DINSU(r0, r1, i0, i1);
+ }
+ }
+#endif
+ }
+ else
+ fallback_dep(r0, r1, i0, i1);
+}
+
+static void
_extr_c(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
{
if (jit_mips2_p())
generated by cgit v1.2.3 (git 2.25.1) at 2025年09月10日 21:23:47 +0000

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