author | pcpa <paulo.cesar.pereira.de.andrade@gmail.com> | 2023年03月20日 17:56:19 -0300 |
---|---|---|
committer | pcpa <paulo.cesar.pereira.de.andrade@gmail.com> | 2023年03月20日 17:56:19 -0300 |
commit | 942c13e8b208d6616023cfe76635206317267d27 (patch) | |
tree | e710825310256587e0458bd392da4ee18ee0d87b | |
parent | 31389c0cf8d3719c126e56fcbdc494e352d0e7b8 (diff) | |
download | lightning-942c13e8b208d6616023cfe76635206317267d27.tar.gz |
-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 |
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; |