-rw-r--r-- | lib/jit_loongarch-cpu.c | 13 | ||||
-rw-r--r-- | lib/jit_loongarch-sz.c | 35 | ||||
-rw-r--r-- | lib/jit_loongarch.c | 9 |
diff --git a/lib/jit_loongarch-cpu.c b/lib/jit_loongarch-cpu.c index aceff17..e33401e 100644 --- a/lib/jit_loongarch-cpu.c +++ b/lib/jit_loongarch-cpu.c @@ -505,6 +505,10 @@ static void _bswapr_us(jit_state_t*, jit_int32_t, jit_int32_t); # define bswapr_ui(r0,r1) _bswapr_ui(_jit,r0,r1) static void _bswapr_ui(jit_state_t*, jit_int32_t, jit_int32_t); # define bswapr_ul(r0, r1) REVB_D(r0, r1) +# 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) BSTRPICK_D(r0, r1, i0 + i1 - 1, i0) +# define dep(r0,r1,i0,i1) BSTRINS_D(r0, r1, i0 + i1 - 1, i0) # define extr_c(r0, r1) EXT_W_B(r0, r1) # define extr_uc(r0, r1) BSTRPICK_D(r0, r1, 7, 0) # define extr_s(r0, r1) EXT_W_H(r0, r1) @@ -1716,6 +1720,15 @@ _bswapr_ui(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1) } 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); + lshi(r0, r1, __WORDSIZE - (i0 + i1)); + rshi(r0, r0, __WORDSIZE - i1); +} + +static void _lti(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0) { jit_int32_t reg; diff --git a/lib/jit_loongarch-sz.c b/lib/jit_loongarch-sz.c index b919d4a..31d65dd 100644 --- a/lib/jit_loongarch-sz.c +++ b/lib/jit_loongarch-sz.c @@ -2,7 +2,7 @@ #define JIT_INSTR_MAX 88 0, /* data */ 0, /* live */ - 28, /* align */ + 12, /* align */ 0, /* save */ 0, /* load */ 4, /* skip */ @@ -127,17 +127,17 @@ 8, /* htonr_ui */ 4, /* htonr_ul */ 4, /* ldr_c */ - 20, /* ldi_c */ + 16, /* ldi_c */ 4, /* ldr_uc */ - 20, /* ldi_uc */ + 16, /* ldi_uc */ 4, /* ldr_s */ - 20, /* ldi_s */ + 16, /* ldi_s */ 4, /* ldr_us */ - 20, /* ldi_us */ + 16, /* ldi_us */ 4, /* ldr_i */ - 20, /* ldi_i */ + 16, /* ldi_i */ 4, /* ldr_ui */ - 20, /* ldi_ui */ + 16, /* ldi_ui */ 4, /* ldr_l */ 20, /* ldi_l */ 4, /* ldxr_c */ @@ -155,11 +155,11 @@ 4, /* ldxr_l */ 16, /* ldxi_l */ 4, /* str_c */ - 20, /* sti_c */ + 16, /* sti_c */ 4, /* str_s */ - 20, /* sti_s */ + 16, /* sti_s */ 4, /* str_i */ - 20, /* sti_i */ + 16, /* sti_i */ 4, /* str_l */ 20, /* sti_l */ 4, /* stxr_c */ @@ -305,11 +305,11 @@ 4, /* movr_f */ 8, /* movi_f */ 4, /* ldr_f */ - 20, /* ldi_f */ + 16, /* ldi_f */ 4, /* ldxr_f */ 16, /* ldxi_f */ 4, /* str_f */ - 20, /* sti_f */ + 16, /* sti_f */ 4, /* stxr_f */ 16, /* stxi_f */ 8, /* bltr_f */ @@ -396,11 +396,11 @@ 4, /* movr_d */ 16, /* movi_d */ 4, /* ldr_d */ - 20, /* ldi_d */ + 16, /* ldi_d */ 4, /* ldxr_d */ 16, /* ldxi_d */ 4, /* str_d */ - 20, /* sti_d */ + 16, /* sti_d */ 4, /* stxr_d */ 16, /* stxi_d */ 8, /* bltr_d */ @@ -439,7 +439,7 @@ 4, /* movr_w_f */ 0, /* movr_ww_d */ 4, /* movr_w_d */ - 0, /* movr_f_w */ + 4, /* movr_f_w */ 4, /* movi_f_w */ 0, /* movr_d_ww */ 0, /* movi_d_ww */ @@ -449,10 +449,13 @@ 4, /* clzr */ 4, /* ctor */ 4, /* ctzr */ - 4, /* rbitr */ + 4, /* rbitr */ 52, /* popcntr */ 12, /* lrotr */ 4, /* lroti */ 4, /* rrotr */ 4, /* rroti */ + 8, /* ext */ + 4, /* ext_u */ + 4, /* dep */ #endif /* __WORDSIZE */ diff --git a/lib/jit_loongarch.c b/lib/jit_loongarch.c index 09fa541..7604f15 100644 --- a/lib/jit_loongarch.c +++ b/lib/jit_loongarch.c @@ -1184,6 +1184,15 @@ _emit_code(jit_state_t *_jit) case_rr(bswap, _us); case_rr(bswap, _ui); case_rr(bswap, _ul); + 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); |