X-Git-Url: https://notaz.gp2x.de/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=deps%2Flightning%2Flib%2Fjit_s390-fpu.c;h=b43f4f60decf657c510a7afb4231c9661d406a85;hb=ba86ff938a6b17c171dd68ebdf897ca3e30550f8;hp=6c3c4ac203b6a153929d2e382cf4523329a8886e;hpb=56e500f3428614e677ba5e9719f002046e87d980;p=pcsx_rearmed.git diff --git a/deps/lightning/lib/jit_s390-fpu.c b/deps/lightning/lib/jit_s390-fpu.c index 6c3c4ac2..b43f4f60 100644 --- a/deps/lightning/lib/jit_s390-fpu.c +++ b/deps/lightning/lib/jit_s390-fpu.c @@ -342,6 +342,8 @@ static jit_word_t _bltgti(jit_state_t*,jit_int32_t, static void _movr_f(jit_state_t*,jit_int32_t,jit_int32_t); # define movi_f(r0,i0) _movi_f(_jit,r0,i0) static void _movi_f(jit_state_t*,jit_int32_t,jit_float32_t*); +#define movi_w_f(r0, i0) _movi_w_f(_jit, r0, i0) +static void _movi_w_f(jit_state_t*, jit_int32_t, jit_word_t); # define movr_d(r0,r1) _movr_d(_jit,r0,r1) static void _movr_d(jit_state_t*,jit_int32_t,jit_int32_t); # define movi_d(r0,i0) _movi_d(_jit,r0,i0) @@ -351,7 +353,31 @@ static void _movi_d(jit_state_t*,jit_int32_t,jit_float64_t*); # define negr_f(r0,r1) LCEBR(r0,r1) # define negr_d(r0,r1) LCDBR(r0,r1) # define sqrtr_f(r0,r1) SQEBR(r0,r1) +# define fmar_f(r0,r1,r2,r3) _fmar_f(_jit,r0,r1,r2,r3) +static void _fmar_f(jit_state_t*, + jit_int32_t,jit_int32_t,jit_int32_t,jit_int32_t); +# define fmsr_f(r0,r1,r2,r3) _fmsr_f(_jit,r0,r1,r2,r3) +static void _fmsr_f(jit_state_t*, + jit_int32_t,jit_int32_t,jit_int32_t,jit_int32_t); +# define fnmar_f(r0,r1,r2,r3) _fnmar_f(_jit,r0,r1,r2,r3) +static void _fnmar_f(jit_state_t*, + jit_int32_t,jit_int32_t,jit_int32_t,jit_int32_t); +# define fnmsr_f(r0,r1,r2,r3) _fnmsr_f(_jit,r0,r1,r2,r3) +static void _fnmsr_f(jit_state_t*, + jit_int32_t,jit_int32_t,jit_int32_t,jit_int32_t); # define sqrtr_d(r0,r1) SQDBR(r0,r1) +# define fmar_d(r0,r1,r2,r3) _fmar_d(_jit,r0,r1,r2,r3) +static void _fmar_d(jit_state_t*, + jit_int32_t,jit_int32_t,jit_int32_t,jit_int32_t); +# define fmsr_d(r0,r1,r2,r3) _fmsr_d(_jit,r0,r1,r2,r3) +static void _fmsr_d(jit_state_t*, + jit_int32_t,jit_int32_t,jit_int32_t,jit_int32_t); +# define fnmar_d(r0,r1,r2,r3) _fnmar_d(_jit,r0,r1,r2,r3) +static void _fnmar_d(jit_state_t*, + jit_int32_t,jit_int32_t,jit_int32_t,jit_int32_t); +# define fnmsr_d(r0,r1,r2,r3) _fnmsr_d(_jit,r0,r1,r2,r3) +static void _fnmsr_d(jit_state_t*, + jit_int32_t,jit_int32_t,jit_int32_t,jit_int32_t); # define truncr_f_i(r0,r1) CFEBR(r0,RND_ZERO,r1) # define truncr_d_i(r0,r1) CFDBR(r0,RND_ZERO,r1) # if __WORDSIZE == 64 @@ -361,9 +387,13 @@ static void _movi_d(jit_state_t*,jit_int32_t,jit_float64_t*); # if __WORDSIZE == 32 # define extr_f(r0,r1) CEFBR(r0,r1) # define extr_d(r0,r1) CDFBR(r0,r1) +# define movi_ww_d(r0, i0, i1) _movi_ww_d(_jit, r0, i0, i1) +static void _movi_ww_d(jit_state_t*, jit_int32_t, jit_word_t, jit_word_t); # else # define extr_f(r0,r1) CEGBR(r0,r1) # define extr_d(r0,r1) CDGBR(r0,r1) +# define movi_w_d(r0, i0) _movi_w_d(_jit, r0, i0) +static void _movi_w_d(jit_state_t*, jit_int32_t, jit_word_t); # endif # define extr_d_f(r0,r1) LEDBR(r0,r1) # define extr_f_d(r0,r1) LDEBR(r0,r1) @@ -887,6 +917,16 @@ _movi_f(jit_state_t *_jit, jit_int32_t r0, jit_float32_t *i0) ldi_f(r0, (jit_word_t)i0); } +static void +_movi_w_f(jit_state_t *_jit, jit_int32_t r0, jit_word_t i0) +{ + jit_int32_t reg; + reg = jit_get_reg(jit_class_gpr); + movi(rn(reg), i0); + movr_w_f(r0, rn(reg)); + jit_unget_reg(reg); +} + static void _movr_d(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1) { @@ -928,6 +968,167 @@ _movi_d(jit_state_t *_jit, jit_int32_t r0, jit_float64_t *i0) ldi_d(r0, (jit_word_t)i0); } +#if __WORDSIZE == 32 +static void +_movi_ww_d(jit_state_t *_jit, jit_int32_t r0, jit_word_t i0, jit_word_t i1) +{ + jit_int32_t t0, t1; + t0 = jit_get_reg(jit_class_gpr); + t1 = jit_get_reg(jit_class_gpr); + movi(rn(t0), i0); + movi(rn(t1), i1); + movr_ww_d(r0, rn(t0), rn(t1)); + jit_unget_reg(t1); + jit_unget_reg(t0); +} +#else +static void +_movi_w_d(jit_state_t *_jit, jit_int32_t r0, jit_word_t i0) +{ + jit_int32_t reg; + reg = jit_get_reg(jit_class_gpr); + movi(rn(reg), i0); + movr_w_d(r0, rn(reg)); + jit_unget_reg(reg); +} +#endif + +static void +_fmar_f(jit_state_t* _jit, + jit_int32_t r0, jit_int32_t r1, jit_int32_t r2, jit_int32_t r3) +{ + jit_int32_t t0; + if (r0 == r3) + MAEBR(r0, r2, r1); + else { + t0 = jit_get_reg(jit_class_fpr); + movr_f(rn(t0), r3); + MAEBR(rn(t0), r2, r1); + movr_f(r0, rn(t0)); + jit_unget_reg(t0); + } +} + +static void +_fmsr_f(jit_state_t* _jit, + jit_int32_t r0, jit_int32_t r1, jit_int32_t r2, jit_int32_t r3) +{ + jit_int32_t t0; + if (r0 == r3) + MSEBR(r0, r2, r1); + else { + t0 = jit_get_reg(jit_class_fpr); + movr_f(rn(t0), r3); + MSEBR(rn(t0), r2, r1); + movr_f(r0, rn(t0)); + jit_unget_reg(t0); + } +} + +static void +_fnmar_f(jit_state_t* _jit, + jit_int32_t r0, jit_int32_t r1, jit_int32_t r2, jit_int32_t r3) +{ + jit_int32_t t0; + if (r0 == r3) { + MAEBR(r0, r2, r1); + negr_f(r0, r0); + } + else { + t0 = jit_get_reg(jit_class_fpr); + movr_f(rn(t0), r3); + MAEBR(rn(t0), r2, r1); + negr_f(r0, rn(t0)); + jit_unget_reg(t0); + } +} + +static void +_fnmsr_f(jit_state_t* _jit, + jit_int32_t r0, jit_int32_t r1, jit_int32_t r2, jit_int32_t r3) +{ + jit_int32_t t0; + if (r0 == r3) { + MSEBR(r0, r2, r1); + negr_f(r0, r0); + } + else { + t0 = jit_get_reg(jit_class_fpr); + movr_f(rn(t0), r3); + MSEBR(rn(t0), r2, r1); + negr_f(r0, rn(t0)); + jit_unget_reg(t0); + } +} + +static void +_fmar_d(jit_state_t* _jit, + jit_int32_t r0, jit_int32_t r1, jit_int32_t r2, jit_int32_t r3) +{ + jit_int32_t t0; + if (r0 == r3) + MADBR(r0, r2, r1); + else { + t0 = jit_get_reg(jit_class_fpr); + movr_d(rn(t0), r3); + MADBR(rn(t0), r2, r1); + movr_d(r0, rn(t0)); + jit_unget_reg(t0); + } +} + +static void +_fmsr_d(jit_state_t* _jit, + jit_int32_t r0, jit_int32_t r1, jit_int32_t r2, jit_int32_t r3) +{ + jit_int32_t t0; + if (r0 == r3) + MSDBR(r0, r2, r1); + else { + t0 = jit_get_reg(jit_class_fpr); + movr_d(rn(t0), r3); + MSDBR(rn(t0), r2, r1); + movr_d(r0, rn(t0)); + jit_unget_reg(t0); + } +} + +static void +_fnmar_d(jit_state_t* _jit, + jit_int32_t r0, jit_int32_t r1, jit_int32_t r2, jit_int32_t r3) +{ + jit_int32_t t0; + if (r0 == r3) { + MADBR(r0, r2, r1); + negr_d(r0, r0); + } + else { + t0 = jit_get_reg(jit_class_fpr); + movr_f(rn(t0), r3); + MADBR(rn(t0), r2, r1); + negr_d(r0, rn(t0)); + jit_unget_reg(t0); + } +} + +static void +_fnmsr_d(jit_state_t* _jit, + jit_int32_t r0, jit_int32_t r1, jit_int32_t r2, jit_int32_t r3) +{ + jit_int32_t t0; + if (r0 == r3) { + MSDBR(r0, r2, r1); + negr_d(r0, r0); + } + else { + t0 = jit_get_reg(jit_class_fpr); + movr_d(rn(t0), r3); + MSDBR(rn(t0), r2, r1); + negr_d(r0, rn(t0)); + jit_unget_reg(t0); + } +} + static void _addr_f(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2) {