s390: build and pass all tests. - 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:
authorpcpa <paulo.cesar.pereira.de.andrade@gmail.com>2023年03月20日 17:56:19 -0300
committerpcpa <paulo.cesar.pereira.de.andrade@gmail.com>2023年03月20日 17:56:19 -0300
commit942c13e8b208d6616023cfe76635206317267d27 (patch)
treee710825310256587e0458bd392da4ee18ee0d87b
parent31389c0cf8d3719c126e56fcbdc494e352d0e7b8 (diff)
downloadlightning-942c13e8b208d6616023cfe76635206317267d27.tar.gz
s390: build and pass all tests.
It is not possible to use IC or ICM for jit_dep as is. It must read from a memory address, so, it would be usable only on multi instruction optimization. The s390 port also shows jit_depi() actually can be optimized, using IIHF, IIHH, IIHL, IILF, IILH and IILL. But before this, would be far more important to optimize load of constants and andi/ori, that can use less instructions, and are currently badly implemented (works, but can be shorter).
Diffstat
-rw-r--r--lib/jit_s390-cpu.c 65
-rw-r--r--lib/jit_s390-sz.c 92
-rw-r--r--lib/jit_s390.c 3
3 files changed, 143 insertions, 17 deletions
diff --git a/lib/jit_s390-cpu.c b/lib/jit_s390-cpu.c
index 8ff6e48..99533c9 100644
--- a/lib/jit_s390-cpu.c
+++ b/lib/jit_s390-cpu.c
@@ -1110,6 +1110,12 @@ static void _ori(jit_state_t*,jit_int32_t,jit_int32_t,jit_word_t);
static void _xorr(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t);
# define xori(r0,r1,i0) _xori(_jit,r0,r1,i0)
static void _xori(jit_state_t*,jit_int32_t,jit_int32_t,jit_word_t);
+#define extr(r0,r1,i0,i1) _extr(_jit,r0,r1,i0,i1)
+static void _extr(jit_state_t*,jit_int32_t,jit_int32_t,jit_word_t,jit_word_t);
+#define extr_u(r0,r1,i0,i1) _extr_u(_jit,r0,r1,i0,i1)
+static void _extr_u(jit_state_t*,jit_int32_t,jit_int32_t,jit_word_t,jit_word_t);
+#define depr(r0,r1,i0,i1) _depr(_jit,r0,r1,i0,i1)
+static void _depr(jit_state_t*,jit_int32_t,jit_int32_t,jit_word_t,jit_word_t);
# define extr_c(r0,r1) LGBR(r0,r1)
# define extr_uc(r0,r1) LLGCR(r0,r1)
# define extr_s(r0,r1) LGHR(r0,r1)
@@ -3099,6 +3105,65 @@ _ctzr(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
}
static void
+_extr(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);
+ /* Big Endian always */
+ i0 = __WORDSIZE - (i0 + i1);
+ if (i1 == __WORDSIZE)
+ movr(r0, r1);
+ else {
+ if (__WORDSIZE - (i0 + i1)) {
+ lshi(r0, r1, __WORDSIZE - (i0 + i1));
+ rshi(r0, r0, __WORDSIZE - i1);
+ }
+ else
+ rshi(r0, r1, __WORDSIZE - i1);
+ }
+}
+
+static void
+_extr_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);
+ /* Big Endian always */
+ i0 = __WORDSIZE - (i0 + i1);
+ if (i1 == __WORDSIZE)
+ movr(r0, r1);
+ else {
+ if (i0)
+ rshi_u(r0, r1, i0);
+ andi(r0, r0, (1L << i1) - 1);
+ }
+}
+
+static void
+_depr(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;
+ /* Big Endian always */
+ i0 = __WORDSIZE - (i0 + i1);
+ if (i1 == __WORDSIZE)
+ movr(r0, r1);
+ else {
+ mask = (1L << i1) - 1;
+ t0 = jit_get_reg(jit_class_gpr);
+ andi(rn(t0), r1, mask);
+ if (i0) {
+ lshi(rn(t0), rn(t0), i0);
+ mask <<= i0;
+ }
+ andi(r0, r0, ~mask);
+ orr(r0, r0, rn(t0));
+ jit_unget_reg(t0);
+ }
+}
+
+static void
_comr(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
{
jit_int32_t reg;
diff --git a/lib/jit_s390-sz.c b/lib/jit_s390-sz.c
index a830712..34d52e9 100644
--- a/lib/jit_s390-sz.c
+++ b/lib/jit_s390-sz.c
@@ -1,5 +1,5 @@
#if __WORDSIZE == 32
-#define JIT_INSTR_MAX 164
+#define JIT_INSTR_MAX 82
0, /* data */
0, /* live */
4, /* align */
@@ -394,7 +394,7 @@
4, /* extr_d */
4, /* extr_f_d */
2, /* movr_d */
- 30, /* movi_d */
+ 40, /* movi_d */
4, /* ldr_d */
10, /* ldi_d */
8, /* ldxr_d */
@@ -408,7 +408,7 @@
10, /* bler_d */
38, /* blei_d */
10, /* beqr_d */
- 40, /* beqi_d */
+ 50, /* beqi_d */
10, /* bger_d */
40, /* bgei_d */
10, /* bgtr_d */
@@ -447,18 +447,50 @@
0, /* movi_d_w */
36, /* clor */
28, /* clzr */
- 98, /* ctor */
- 92, /* ctzr */
- 64, /* rbitr */
+ 62, /* ctor */
+ 54, /* ctzr */
+ 64, /* rbitr */
60, /* popcntr */
6, /* lrotr */
6, /* lroti */
16, /* rrotr */
6, /* rroti */
+ 10, /* extr */
+ 14, /* extr_u */
+ 24, /* depr */
+ 28, /* depi */
+ 4, /* negi */
+ 4, /* comi */
+ 4, /* exti_c */
+ 4, /* exti_uc */
+ 4, /* exti_s */
+ 8, /* exti_us */
+ 0, /* exti_i */
+ 0, /* exti_ui */
+ 4, /* bswapi_us */
+ 6, /* bswapi_ui */
+ 0, /* bswapi_ul */
+ 8, /* htoni_us */
+ 6, /* htoni_ui */
+ 0, /* htoni_ul */
+ 0, /* negi_f */
+ 0, /* absi_f */
+ 0, /* sqrti_f */
+ 0, /* negi_d */
+ 0, /* absi_d */
+ 0, /* sqrti_d */
+ 4, /* cloi */
+ 4, /* clzi */
+ 4, /* ctoi */
+ 4, /* ctzi */
+ 6, /* rbiti */
+ 4, /* popcnti */
+ 4, /* exti */
+ 4, /* exti_u */
#endif /* __WORDSIZE */
#if __WORDSIZE == 64
-#define JIT_INSTR_MAX 280
+#define JIT_INSTR_MAX 100
0, /* data */
0, /* live */
20, /* align */
@@ -672,7 +704,7 @@
2, /* jmpr */
6, /* jmpi */
2, /* callr */
- 14, /* calli */
+ 26, /* calli */
0, /* prepare */
0, /* pushargr_c */
0, /* pushargi_c */
@@ -762,7 +794,7 @@
4, /* extr_f */
4, /* extr_d_f */
2, /* movr_f */
- 20, /* movi_f */
+ 32, /* movi_f */
4, /* ldr_f */
16, /* ldi_f */
12, /* ldxr_f */
@@ -853,7 +885,7 @@
4, /* extr_d */
4, /* extr_f_d */
2, /* movr_d */
- 24, /* movi_d */
+ 32, /* movi_d */
4, /* ldr_d */
16, /* ldi_d */
12, /* ldxr_d */
@@ -867,7 +899,7 @@
10, /* bler_d */
30, /* blei_d */
10, /* beqr_d */
- 34, /* beqi_d */
+ 42, /* beqi_d */
10, /* bger_d */
30, /* bgei_d */
10, /* bgtr_d */
@@ -906,12 +938,44 @@
0, /* movi_d_w */
24, /* clor */
12, /* clzr */
- 98, /* ctor */
- 90, /* ctzr */
- 78, /* rbitr */
+ 62, /* ctor */
+ 50, /* ctzr */
+ 78, /* rbitr */
72, /* popcntr */
6, /* lrotr */
6, /* lroti */
16, /* rrotr */
6, /* rroti */
+ 12, /* extr */
+ 22, /* extr_u */
+ 46, /* depr */
+ 50, /* depi */
+ 4, /* negi */
+ 4, /* comi */
+ 4, /* exti_c */
+ 4, /* exti_uc */
+ 4, /* exti_s */
+ 8, /* exti_us */
+ 16, /* exti_i */
+ 8, /* exti_ui */
+ 4, /* bswapi_us */
+ 12, /* bswapi_ui */
+ 16, /* bswapi_ul */
+ 8, /* htoni_us */
+ 12, /* htoni_ui */
+ 16, /* htoni_ul */
+ 0, /* negi_f */
+ 0, /* absi_f */
+ 0, /* sqrti_f */
+ 0, /* negi_d */
+ 0, /* absi_d */
+ 0, /* sqrti_d */
+ 4, /* cloi */
+ 4, /* clzi */
+ 4, /* ctoi */
+ 4, /* ctzi */
+ 16, /* rbiti */
+ 4, /* popcnti */
+ 4, /* exti */
+ 4, /* exti_u */
#endif /* __WORDSIZE */
diff --git a/lib/jit_s390.c b/lib/jit_s390.c
index fc9a288..f766211 100644
--- a/lib/jit_s390.c
+++ b/lib/jit_s390.c
@@ -1219,9 +1219,6 @@ _emit_code(jit_state_t *_jit)
#if __WORDSIZE == 64
case_rr(bswap, _ul);
#endif
-#define extr(r0, r1, i0, i1) fallback_ext(r0, r1, i0, i1)
-#define extr_u(r0, r1, i0, i1) fallback_ext_u(r0, r1, i0, i1)
-#define depr(r0, r1, i0, i1) fallback_dep(r0, r1, i0, i1)
case jit_code_extr:
extr(rn(node->u.w), rn(node->v.w), node->w.q.l, node->w.q.h);
break;
generated by cgit v1.2.3 (git 2.39.1) at 2025年09月18日 11:41:42 +0000

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