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:
Diffstat (limited to 'lib')
-rw-r--r--lib/jit_hppa-cpu.c 53
-rw-r--r--lib/jit_hppa-sz.c 5
-rw-r--r--lib/jit_hppa.c 10
3 files changed, 67 insertions, 1 deletions
diff --git a/lib/jit_hppa-cpu.c b/lib/jit_hppa-cpu.c
index fb02efe..5640e4f 100644
--- a/lib/jit_hppa-cpu.c
+++ b/lib/jit_hppa-cpu.c
@@ -663,6 +663,12 @@ static void _casx(jit_state_t *_jit,jit_int32_t,jit_int32_t,
#define casi(r0, i0, r1, r2) casx(r0, _NOREG, r1, r2, i0)
#define comr(r0,r1) UADDCM(_R0_REGNO,r1,r0)
#define negr(r0,r1) SUB(_R0_REGNO,r1,r0)
+#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) EXTRWR(r1,31,8,r0)
#define extr_uc(r0,r1) EXTRWR_U(r1,31,8,r0)
#define extr_s(r0,r1) EXTRWR(r1,31,16,r0)
@@ -1704,6 +1710,53 @@ _movzr(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
}
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
+ EXTRWR(r1, 32 - (i0 + 1), i1, r0);
+ }
+}
+
+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 (i1 == __WORDSIZE)
+ movr(r0, r1);
+ else {
+# if __BYTE_ORDER == __BIG_ENDIAN
+ i0 = __WORDSIZE - (i0 + i1);
+# endif
+ EXTRWR_U(r1, 32 - (i0 + 1), i1, r0);
+ }
+}
+
+static void
+_dep(jit_state_t *_jit,
+ jit_int32_t r0, jit_int32_t r1, jit_word_t i0, jit_word_t i1)
+{
+ jit_int32_t t0;
+ jit_word_t mask;
+ 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
+ DEPWR(r1, 32 - (i0 + 1), i1, r0);
+ }
+}
+
+static void
_casx(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1,
jit_int32_t r2, jit_int32_t r3, jit_word_t i0)
{
diff --git a/lib/jit_hppa-sz.c b/lib/jit_hppa-sz.c
index 211474b..48f66dc 100644
--- a/lib/jit_hppa-sz.c
+++ b/lib/jit_hppa-sz.c
@@ -451,9 +451,12 @@
76, /* ctor */
56, /* ctzr */
68, /* rbitr */
- 0, /* popcntr */
+ 64, /* popcntr */
32, /* lrotr */
8, /* lroti */
32, /* rrotr */
8, /* rroti */
+ 4, /* ext */
+ 4, /* ext_u */
+ 4, /* dep */
#endif /* __WORDSIZE */
diff --git a/lib/jit_hppa.c b/lib/jit_hppa.c
index 389e5d0..a65be62 100644
--- a/lib/jit_hppa.c
+++ b/lib/jit_hppa.c
@@ -1083,6 +1083,16 @@ _emit_code(jit_state_t *_jit)
case_rr(cto,);
case_rr(ctz,);
case_rr(rbit,);
+ case_rr(popcnt,);
+ case jit_code_ext:
+ ext(rn(node->u.w), rn(node->v.w), node->w.q.l, node->w.q.h);
+ break;
+ case jit_code_ext_u:
+ ext_u(rn(node->u.w), rn(node->v.w), node->w.q.l, node->w.q.h);
+ break;
+ case jit_code_dep:
+ dep(rn(node->u.w), rn(node->v.w), node->w.q.l, node->w.q.h);
+ break;
case_rr(ext, _c);
case_rr(ext, _uc);
case_rr(ext, _s);
generated by cgit v1.2.3 (git 2.39.1) at 2025年09月17日 02:31:56 +0000

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