X-Git-Url: https://notaz.gp2x.de/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=deps%2Flightning%2Flib%2Fjit_loongarch-cpu.c;fp=deps%2Flightning%2Flib%2Fjit_loongarch-cpu.c;h=22ca0f0969a54c8965ca40c293dd4ecb9271fac0;hb=ba86ff938a6b17c171dd68ebdf897ca3e30550f8;hp=ab058521b36ac2f7d5d7c3b37c63ec6313baf489;hpb=56e500f3428614e677ba5e9719f002046e87d980;p=pcsx_rearmed.git diff --git a/deps/lightning/lib/jit_loongarch-cpu.c b/deps/lightning/lib/jit_loongarch-cpu.c index ab058521..22ca0f09 100644 --- a/deps/lightning/lib/jit_loongarch-cpu.c +++ b/deps/lightning/lib/jit_loongarch-cpu.c @@ -18,6 +18,7 @@ */ #if PROTO +# define jit_unaligned_p() (jit_cpu.unaligned) # define ii(i) *_jit->pc.ui++ = (i) # define can_sign_extend_si12_p(s12) ((s12) <= 2047 && (s12) >= -2048) # define can_zero_extend_u12_p(u12) ((u12) <= 4095 && (u12) >= 0) @@ -33,8 +34,11 @@ # define _FP_REGNO 22 # define ldr(u, v) ldr_l(u, v) # define ldi(u, v) ldi_l(u, v) +# define ldxr(u, v, w) ldxr_l(u, v, w) # define ldxi(u, v, w) ldxi_l(u, v, w) +# define str(u, v) str_l(u, v) # define sti(u, v) sti_l(u, v) +# define stxr(u, v, w) stxr_l(u, v, w) # define stxi(u, v, w) stxi_l(u, v, w) # define orrr(op, rk, rj, rd) _orrr(_jit, op, rk, rj, rd) # define ou5rr(op, i5, rj, rd) _orrr(_jit, op, i5, rj, rd) @@ -338,6 +342,7 @@ static void _oj26(jit_state_t*, jit_int32_t,jit_int32_t); # define clzr(r0, r1) CLZ_D(r0, r1) # define ctor(r0, r1) CTO_D(r0, r1) # define ctzr(r0, r1) CTZ_D(r0, r1) +# define rbitr(r0, r1) BITREV_D(r0, r1) static void _nop(jit_state_t*,jit_int32_t); # define movr(r0, r1) _movr(_jit, r0, r1) static void _movr(jit_state_t*, jit_int32_t, jit_int32_t); @@ -381,6 +386,12 @@ static void _rsbi(jit_state_t*, jit_int32_t, jit_int32_t, jit_word_t); # define mulr(r0, r1, r2) MUL_D(r0, r1, r2) # define muli(r0, r1, i0) _muli(_jit, r0, r1, i0) static void _muli(jit_state_t*, jit_int32_t, jit_int32_t, jit_word_t); +# define hmulr(r0, r1, r2) MULH_D(r0, r1, r2) +# define hmuli(r0, r1, i0) _hmuli(_jit, r0, r1, i0) +static void _hmuli(jit_state_t*, jit_int32_t, jit_int32_t, jit_word_t); +# define hmulr_u(r0, r1, r2) MULH_DU(r0, r1, r2) +# define hmuli_u(r0, r1, i0) _hmuli_u(_jit, r0, r1, i0) +static void _hmuli_u(jit_state_t*, jit_int32_t, jit_int32_t, jit_word_t); # define qmulr(r0, r1, r2, r3) iqmulr(r0, r1, r2, r3, 1) # define qmulr_u(r0, r1, r2, r3) iqmulr(r0, r1, r2, r3, 0) # define iqmulr(r0, r1, r2, r3, sign) _iqmulr(_jit, r0, r1, r2, r3, sign) @@ -419,6 +430,11 @@ static void _remi_u(jit_state_t*, jit_int32_t, jit_int32_t, jit_word_t); # define rshi(r0, r1, i0) SRAI_D(r0, r1, i0) # define rshr_u(r0, r1, r2) SRL_D(r0, r1, r2) # define rshi_u(r0, r1, i0) SRLI_D(r0, r1, i0) +# define lrotr(r0, r1, r2) _lrotr(_jit, r0, r1, r2) +static void _lrotr(jit_state_t*, jit_int32_t, jit_int32_t, jit_int32_t); +# define lroti(r0, r1, i0) rroti(r0, r1, __WORDSIZE - i0) +# define rrotr(r0, r1, r2) ROTR_D(r0, r1, r2) +# define rroti(r0, r1, i0) ROTRI_D(r0, r1, i0) # define andr(r0, r1, r2) AND(r0, r1, r2) # define andi(r0, r1, i0) _andi(_jit, r0, r1, i0) static void _andi(jit_state_t*, jit_int32_t, jit_int32_t, jit_word_t); @@ -470,6 +486,14 @@ static void _ldxi_ui(jit_state_t*, jit_int32_t, jit_int32_t, jit_word_t); # define ldxr_l(r0, r1, r2) LDX_D(r0, r1, r2) # define ldxi_l(r0, r1, i0) _ldxi_l(_jit, r0, r1, i0) static void _ldxi_l(jit_state_t*, jit_int32_t, jit_int32_t, jit_word_t); +# define unldr(r0, r1, i0) _unldr(_jit, r0, r1, i0) +static void _unldr(jit_state_t*, jit_int32_t, jit_int32_t, jit_word_t); +# define unldi(r0, i0, i1) _unldi(_jit, r0, i0, i1) +static void _unldi(jit_state_t*, jit_int32_t, jit_word_t, jit_word_t); +# define unldr_u(r0, r1, i0) _unldr_u(_jit, r0, r1, i0) +static void _unldr_u(jit_state_t*, jit_int32_t, jit_int32_t, jit_word_t); +# define unldi_u(r0, i0, i1) _unldi_u(_jit, r0, i0, i1) +static void _unldi_u(jit_state_t*, jit_int32_t, jit_word_t, jit_word_t); # define str_c(r0, r1) ST_B(r1, r0, 0) # define sti_c(i0, r0) _sti_c(_jit, i0, r0) static void _sti_c(jit_state_t*, jit_word_t, jit_int32_t); @@ -494,11 +518,19 @@ static void _stxi_i(jit_state_t*, jit_word_t, jit_int32_t, jit_int32_t); # define stxr_l(r0, r1, r2) STX_D(r2, r1, r0) # define stxi_l(i0, r0, r1) _stxi_l(_jit, i0, r0, r1) static void _stxi_l(jit_state_t*, jit_word_t, jit_int32_t, jit_int32_t); +#define unstr(r0, r1, i0) _unstr(_jit, r0, r1, i0) +static void _unstr(jit_state_t*, jit_int32_t, jit_int32_t, jit_word_t); +#define unsti(i0, r0, i1) _unsti(_jit, i0, r0, i1) +static void _unsti(jit_state_t*, jit_word_t, jit_int32_t, jit_word_t); # define bswapr_us(r0,r1) _bswapr_us(_jit,r0,r1) 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 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) BSTRPICK_D(r0, r1, i0 + i1 - 1, i0) +# define depr(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) @@ -1217,6 +1249,26 @@ _muli(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0) jit_unget_reg(reg); } +static void +_hmuli(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0) +{ + jit_int32_t reg; + reg = jit_get_reg(jit_class_gpr); + movi(rn(reg), i0); + hmulr(r0, r1, rn(reg)); + jit_unget_reg(reg); +} + +static void +_hmuli_u(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0) +{ + jit_int32_t reg; + reg = jit_get_reg(jit_class_gpr); + movi(rn(reg), i0); + hmulr_u(r0, r1, rn(reg)); + jit_unget_reg(reg); +} + static void _iqmulr(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2, jit_int32_t r3, jit_bool_t sign) @@ -1329,6 +1381,22 @@ _remi_u(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0) jit_unget_reg(reg); } +static void +_lrotr(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2) +{ + jit_int32_t reg; + if (r0 != r1 && r0 != r2) { + rsbi(r0, r2, __WORDSIZE); + rrotr(r0, r1, r0); + } + else { + reg = jit_get_reg(jit_class_gpr); + rsbi(rn(reg), r2, __WORDSIZE); + rrotr(r0, r1, rn(reg)); + jit_unget_reg(reg); + } +} + static void _andi(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0) { @@ -1567,6 +1635,44 @@ _ldxi_l(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0) } } +static void +_unldr(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0) +{ + if (jit_unaligned_p()) + fallback_unldr(r0, r1, i0); + else + generic_unldr(r0, r1, i0); +} + +static void +_unldi(jit_state_t *_jit, jit_int32_t r0, jit_word_t i0, jit_word_t i1) +{ + jit_int32_t t0, r2; + if (jit_unaligned_p()) + fallback_unldi(r0, i0, i1); + else + generic_unldi(r0, i0, i1); +} + +static void +_unldr_u(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0) +{ + if (jit_unaligned_p()) + fallback_unldr_u(r0, r1, i0); + else + generic_unldr_u(r0, r1, i0); +} + +static void +_unldi_u(jit_state_t *_jit, jit_int32_t r0, jit_word_t i0, jit_word_t i1) +{ + jit_int32_t t0, r2; + if (jit_unaligned_p()) + fallback_unldi_u(r0, i0, i1); + else + generic_unldi_u(r0, i0, i1); +} + static void _sti_c(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0) { @@ -1679,6 +1785,24 @@ _stxi_l(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_int32_t r1) } } +static void +_unstr(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0) +{ + if (jit_unaligned_p()) + fallback_unstr(r0, r1, i0); + else + generic_unstr(r0, r1, i0); +} + +static void +_unsti(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_word_t i1) +{ + if (jit_unaligned_p()) + fallback_unsti(i0, r0, i1); + else + generic_unsti(i0, r0, i1); +} + static void _bswapr_us(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1) { @@ -1693,6 +1817,19 @@ _bswapr_ui(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1) extr_ui(r0, r0); } +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); + if (__WORDSIZE - (i0 + i1)) { + lshi(r0, r1, __WORDSIZE - (i0 + i1)); + rshi(r0, r0, __WORDSIZE - i1); + } + else + rshi(r0, r1, __WORDSIZE - i1); +} + static void _lti(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0) {