X-Git-Url: https://notaz.gp2x.de/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=deps%2Flightning%2Flib%2Fjit_arm-swf.c;h=46e4308cc52f26e57f274c7f62ab63a9d0235a7a;hb=ba86ff938a6b17c171dd68ebdf897ca3e30550f8;hp=bf86ca1ccdb0e04f616d236125030ff5eeff2939;hpb=3918505613cb814f8f5e0e8e0471f7b2a2cd8464;p=pcsx_rearmed.git diff --git a/deps/lightning/lib/jit_arm-swf.c b/deps/lightning/lib/jit_arm-swf.c index bf86ca1c..46e4308c 100644 --- a/deps/lightning/lib/jit_arm-swf.c +++ b/deps/lightning/lib/jit_arm-swf.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2012-2019 Free Software Foundation, Inc. + * Copyright (C) 2012-2023 Free Software Foundation, Inc. * * This file is part of GNU lightning. * @@ -128,12 +128,24 @@ static void _swf_truncr_f_i(jit_state_t*,jit_int32_t,jit_int32_t); static void _swf_truncr_d_i(jit_state_t*,jit_int32_t,jit_int32_t); # define swf_movr_f(r0,r1) _swf_movr_f(_jit,r0,r1) static void _swf_movr_f(jit_state_t*,jit_int32_t,jit_int32_t); -# define swf_movr_d(r0,r1) _swf_movr_d(_jit,r0,r1) -static void _swf_movr_d(jit_state_t*,jit_int32_t,jit_int32_t); # define swf_movi_f(r0,i0) _swf_movi_f(_jit,r0,i0) static void _swf_movi_f(jit_state_t*,jit_int32_t,jit_float32_t); +# define swf_movr_w_f(r0, r1) _swf_movr_w_f(_jit, r0, r1) +static void _swf_movr_w_f(jit_state_t*,jit_int32_t,jit_int32_t); +# define swf_movr_f_w(r0, r1) _swf_movr_f_w(_jit, r0, r1) +static void _swf_movr_f_w(jit_state_t*,jit_int32_t,jit_int32_t); +#define swf_movi_w_f(r0, i0) _swf_movi_w_f(_jit, r0, i0) +static void _swf_movi_w_f(jit_state_t*, jit_int32_t, jit_word_t); +# define swf_movr_d(r0,r1) _swf_movr_d(_jit,r0,r1) +static void _swf_movr_d(jit_state_t*,jit_int32_t,jit_int32_t); # define swf_movi_d(r0,i0) _swf_movi_d(_jit,r0,i0) static void _swf_movi_d(jit_state_t*,jit_int32_t,jit_float64_t); +# define swf_movr_ww_d(r0, r1, r2) _swf_movr_ww_d(_jit, r0, r1, r2) +static void _swf_movr_ww_d(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t); +# define swf_movr_d_ww(r0, r1, r2) _swf_movr_d_ww(_jit, r0, r1, r2) +static void _swf_movr_d_ww(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t); +# define swf_movi_ww_d(r0, i0, i1) _swf_movi_ww_d(_jit, r0, i0, i1) +static void _swf_movi_ww_d(jit_state_t*, jit_int32_t, jit_word_t, jit_word_t); # define swf_absr_f(r0,r1) _swf_absr_f(_jit,r0,r1) static void _swf_absr_f(jit_state_t*,jit_int32_t,jit_int32_t); # define swf_absr_d(r0,r1) _swf_absr_d(_jit,r0,r1) @@ -144,6 +156,30 @@ static void _swf_negr_f(jit_state_t*,jit_int32_t,jit_int32_t); static void _swf_negr_d(jit_state_t*,jit_int32_t,jit_int32_t); # define swf_sqrtr_f(r0,r1) swf_ff(sqrtf,r0,r1) # define swf_sqrtr_d(r0,r1) swf_dd(sqrt,r0,r1) +# define swf_fmar_f(r0,r1,r2,r3) _swf_fmar_f(_jit,r0,r1,r2,r3) +static void _swf_fmar_f(jit_state_t*, + jit_int32_t, jit_int32_t, jit_int32_t, jit_int32_t); +# define swf_fmsr_f(r0,r1,r2,r3) _swf_fmsr_f(_jit,r0,r1,r2,r3) +static void _swf_fmsr_f(jit_state_t*, + jit_int32_t, jit_int32_t, jit_int32_t, jit_int32_t); +# define swf_fmar_d(r0,r1,r2,r3) _swf_fmar_d(_jit,r0,r1,r2,r3) +static void _swf_fmar_d(jit_state_t*, + jit_int32_t, jit_int32_t, jit_int32_t, jit_int32_t); +# define swf_fmsr_d(r0,r1,r2,r3) _swf_fmsr_d(_jit,r0,r1,r2,r3) +static void _swf_fmsr_d(jit_state_t*, + jit_int32_t, jit_int32_t, jit_int32_t, jit_int32_t); +# define swf_fnmar_f(r0,r1,r2,r3) _swf_fnmar_f(_jit,r0,r1,r2,r3) +static void _swf_fnmar_f(jit_state_t*, + jit_int32_t, jit_int32_t, jit_int32_t, jit_int32_t); +# define swf_fnmsr_f(r0,r1,r2,r3) _swf_fnmsr_f(_jit,r0,r1,r2,r3) +static void _swf_fnmsr_f(jit_state_t*, + jit_int32_t, jit_int32_t, jit_int32_t, jit_int32_t); +# define swf_fnmar_d(r0,r1,r2,r3) _swf_fnmar_d(_jit,r0,r1,r2,r3) +static void _swf_fnmar_d(jit_state_t*, + jit_int32_t, jit_int32_t, jit_int32_t, jit_int32_t); +# define swf_fnmsr_d(r0,r1,r2,r3) _swf_fnmsr_d(_jit,r0,r1,r2,r3) +static void _swf_fnmsr_d(jit_state_t*, + jit_int32_t, jit_int32_t, jit_int32_t, jit_int32_t); # define swf_addr_f(r0,r1,r2) swf_fff(__addsf3,r0,r1,r2) # define swf_addi_f(r0,r1,i0) swf_fff_(__addsf3,r0,r1,i0) # define swf_addr_d(r0,r1,r2) swf_ddd(__adddf3,r0,r1,r2) @@ -306,12 +342,20 @@ static void _swf_ldxr_d(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t); static void _swf_ldxi_f(jit_state_t*,jit_int32_t,jit_int32_t,jit_word_t); # define swf_ldxi_d(r0,r1,i0) _swf_ldxi_d(_jit,r0,r1,i0) static void _swf_ldxi_d(jit_state_t*,jit_int32_t,jit_int32_t,jit_word_t); +# define swf_unldr_x(r0, r1, i0) _swf_unldr_x(_jit, r0, r1, i0) +static void _swf_unldr_x(jit_state_t*, jit_int32_t, jit_int32_t, jit_word_t); +# define swf_unldi_x(r0, i0, i1) _swf_unldi_x(_jit, r0, i0, i1) +static void _swf_unldi_x(jit_state_t*, jit_int32_t, jit_word_t, jit_word_t); # define swf_str_f(r0,r1) _swf_str_f(_jit,r0,r1) static void _swf_str_f(jit_state_t*,jit_int32_t,jit_int32_t); # define swf_str_d(r0,r1) _swf_str_d(_jit,r0,r1) static void _swf_str_d(jit_state_t*,jit_int32_t,jit_int32_t); # define swf_sti_f(r0,i0) _swf_sti_f(_jit,r0,i0) static void _swf_sti_f(jit_state_t*,jit_word_t,jit_int32_t); +#define swf_unstr_x(r0, r1, i0) _swf_unstr_x(_jit, r0, r1, i0) +static void _swf_unstr_x(jit_state_t*, jit_int32_t, jit_int32_t, jit_word_t); +#define swf_unsti_x(i0, r0, i1) _swf_unsti_x(_jit, i0, r0, i1) +static void _swf_unsti_x(jit_state_t*, jit_word_t, jit_int32_t, jit_word_t); # define swf_sti_d(r0,i0) _swf_sti_d(_jit,r0,i0) static void _swf_sti_d(jit_state_t*,jit_word_t,jit_int32_t); # define swf_stxr_f(r0,r1,r2) _swf_stxr_f(_jit,r0,r1,r2) @@ -564,6 +608,8 @@ _swf_ff(jit_state_t *_jit, float(*i0)(float), jit_int32_t r0, jit_int32_t r1) { jit_get_reg_args(); + if (jit_fpr_p(r0) || jit_fpr_p(r1)) + CHECK_SWF_OFFSET(); if (jit_fpr_p(r1)) swf_ldrin(_R0_REGNO, _FP_REGNO, swf_off(r1) + 8); else @@ -581,6 +627,8 @@ _swf_dd(jit_state_t *_jit, double (*i0)(double), jit_int32_t r0, jit_int32_t r1) { jit_get_reg_args(); + if (jit_fpr_p(r0) || jit_fpr_p(r1)) + CHECK_SWF_OFFSET(); if (jit_fpr_p(r1)) { if (!jit_thumb_p() && jit_armv5e_p()) LDRDIN(_R0_REGNO, _FP_REGNO, swf_off(r1) + 8); @@ -614,6 +662,8 @@ _swf_fff(jit_state_t *_jit, float (*i0)(float, float), jit_int32_t r0, jit_int32_t r1, jit_int32_t r2) { jit_get_reg_args(); + if (jit_fpr_p(r0) || jit_fpr_p(r1) || jit_fpr_p(r2)) + CHECK_SWF_OFFSET(); if (jit_fpr_p(r1)) swf_ldrin(_R0_REGNO, _FP_REGNO, swf_off(r1) + 8); else @@ -635,6 +685,8 @@ _swf_ddd(jit_state_t *_jit, double (*i0)(double, double), jit_int32_t r0, jit_int32_t r1, jit_int32_t r2) { jit_get_reg_args(); + if (jit_fpr_p(r0) || jit_fpr_p(r1) || jit_fpr_p(r2)) + CHECK_SWF_OFFSET(); if (jit_fpr_p(r1)) { if (!jit_thumb_p() && jit_armv5e_p()) LDRDIN(_R0_REGNO, _FP_REGNO, swf_off(r1) + 8); @@ -684,6 +736,8 @@ _swf_fff_(jit_state_t *_jit, float (*i0)(float, float), jit_float32_t f; } data; jit_get_reg_args(); + if (jit_fpr_p(r0) || jit_fpr_p(r1)) + CHECK_SWF_OFFSET(); data.f = i1; if (jit_fpr_p(r1)) swf_ldrin(_R0_REGNO, _FP_REGNO, swf_off(r1) + 8); @@ -706,6 +760,8 @@ _swf_rsbi_f(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_float32_t i0) jit_float32_t f; } data; jit_get_reg_args(); + if (jit_fpr_p(r0) || jit_fpr_p(r1)) + CHECK_SWF_OFFSET(); data.f = i0; movi(_R0_REGNO, data.i); if (jit_fpr_p(r1)) @@ -729,7 +785,8 @@ _swf_ddd_(jit_state_t *_jit, double (*i0)(double, double), jit_float64_t d; } data; jit_get_reg_args(); - + if (jit_fpr_p(r0) || jit_fpr_p(r1)) + CHECK_SWF_OFFSET(); data.d = i1; if (jit_fpr_p(r1)) { if (!jit_thumb_p() && jit_armv5e_p()) @@ -769,6 +826,8 @@ _swf_rsbi_d(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_float64_t i0) jit_float64_t d; } data; jit_get_reg_args(); + if (jit_fpr_p(r0) || jit_fpr_p(r1)) + CHECK_SWF_OFFSET(); data.d = i0; movi(_R0_REGNO, data.i[0]); movi(_R1_REGNO, data.i[1]); @@ -805,6 +864,8 @@ _swf_iff(jit_state_t *_jit, int (*i0)(float, float), jit_int32_t r0, jit_int32_t r1, jit_int32_t r2) { jit_get_reg_args(); + if (jit_fpr_p(r1) || jit_fpr_p(r2)) + CHECK_SWF_OFFSET(); if (jit_fpr_p(r1)) swf_ldrin(_R0_REGNO, _FP_REGNO, swf_off(r1) + 8); else @@ -823,6 +884,8 @@ _swf_idd(jit_state_t *_jit, int (*i0)(double, double), jit_int32_t r0, jit_int32_t r1, jit_int32_t r2) { jit_get_reg_args(); + if (jit_fpr_p(r1) || jit_fpr_p(r2)) + CHECK_SWF_OFFSET(); if (jit_fpr_p(r1)) { if (!jit_thumb_p() && jit_armv5e_p()) LDRDIN(_R0_REGNO, _FP_REGNO, swf_off(r1) + 8); @@ -861,6 +924,8 @@ _swf_iff_(jit_state_t *_jit, int (*i0)(float, float), jit_float32_t f; } data; jit_get_reg_args(); + if (jit_fpr_p(r1)) + CHECK_SWF_OFFSET(); data.f = i1; if (jit_fpr_p(r1)) swf_ldrin(_R0_REGNO, _FP_REGNO, swf_off(r1) + 8); @@ -881,6 +946,8 @@ _swf_idd_(jit_state_t *_jit, int (*i0)(double, double), jit_float64_t d; } data; jit_get_reg_args(); + if (jit_fpr_p(r1)) + CHECK_SWF_OFFSET(); data.d = i1; if (jit_fpr_p(r1)) { if (!jit_thumb_p() && jit_armv5e_p()) @@ -907,6 +974,8 @@ _swf_iunff(jit_state_t *_jit, int (*i0)(float, float), { jit_word_t instr; jit_get_reg_args(); + if (jit_fpr_p(r1) || jit_fpr_p(r2)) + CHECK_SWF_OFFSET(); if (jit_fpr_p(r1)) swf_ldrin(_R0_REGNO, _FP_REGNO, swf_off(r1) + 8); else @@ -952,6 +1021,8 @@ _swf_iundd(jit_state_t *_jit, int (*i0)(double, double), { jit_word_t instr; jit_get_reg_args(); + if (jit_fpr_p(r1) || jit_fpr_p(r2)) + CHECK_SWF_OFFSET(); if (jit_fpr_p(r1)) { if (!jit_thumb_p() && jit_armv5e_p()) LDRDIN(_R0_REGNO, _FP_REGNO, swf_off(r1) + 8); @@ -1033,6 +1104,8 @@ _swf_iunff_(jit_state_t *_jit, int (*i0)(float, float), jit_float32_t f; } data; jit_get_reg_args(); + if (jit_fpr_p(r1)) + CHECK_SWF_OFFSET(); data.f = i1; if (jit_fpr_p(r1)) swf_ldrin(_R0_REGNO, _FP_REGNO, swf_off(r1) + 8); @@ -1077,6 +1150,8 @@ _swf_iundd_(jit_state_t *_jit, int (*i0)(double, double), jit_float64_t d; } data; jit_get_reg_args(); + if (jit_fpr_p(r1)) + CHECK_SWF_OFFSET(); data.d = i1; if (jit_fpr_p(r1)) { if (!jit_thumb_p() && jit_armv5e_p()) @@ -1135,6 +1210,8 @@ _swf_bff(jit_state_t *_jit, int (*i0)(float, float), int cc, { jit_word_t w, d; jit_get_reg_args(); + if (jit_fpr_p(r0) || jit_fpr_p(r1)) + CHECK_SWF_OFFSET(); if (jit_fpr_p(r0)) swf_ldrin(_R0_REGNO, _FP_REGNO, swf_off(r0) + 8); else @@ -1168,6 +1245,8 @@ _swf_bdd(jit_state_t *_jit, int (*i0)(double, double), int cc, { jit_word_t w, d; jit_get_reg_args(); + if (jit_fpr_p(r0) || jit_fpr_p(r1)) + CHECK_SWF_OFFSET(); if (jit_fpr_p(r0)) { if (!jit_thumb_p() && jit_armv5e_p()) LDRDIN(_R0_REGNO, _FP_REGNO, swf_off(r0) + 8); @@ -1221,6 +1300,8 @@ _swf_bff_(jit_state_t *_jit, int (*i0)(float, float), int cc, } data; jit_word_t w, d; jit_get_reg_args(); + if (jit_fpr_p(r0)) + CHECK_SWF_OFFSET(); data.f = i2; if (jit_fpr_p(r0)) swf_ldrin(_R0_REGNO, _FP_REGNO, swf_off(r0) + 8); @@ -1256,6 +1337,8 @@ _swf_bdd_(jit_state_t *_jit, int (*i0)(double, double), int cc, jit_float64_t d; } data; jit_get_reg_args(); + if (jit_fpr_p(r0)) + CHECK_SWF_OFFSET(); data.d = i2; if (jit_fpr_p(r0)) { if (!jit_thumb_p() && jit_armv5e_p()) @@ -1296,6 +1379,8 @@ _swf_bunff(jit_state_t *_jit, int eq, { jit_word_t w, d, j0, j1; jit_get_reg_args(); + if (jit_fpr_p(r0) || jit_fpr_p(r1)) + CHECK_SWF_OFFSET(); if (jit_fpr_p(r0)) swf_ldrin(_R0_REGNO, _FP_REGNO, swf_off(r0) + 8); else @@ -1366,6 +1451,8 @@ _swf_bundd(jit_state_t *_jit, int eq, { jit_word_t w, d, j0, j1; jit_get_reg_args(); + if (jit_fpr_p(r0) || jit_fpr_p(r1)) + CHECK_SWF_OFFSET(); if (jit_fpr_p(r0)) { if (!jit_thumb_p() && jit_armv5e_p()) LDRDIN(_R0_REGNO, _FP_REGNO, swf_off(r0) + 8); @@ -1473,6 +1560,8 @@ _swf_bunff_(jit_state_t *_jit, int eq, jit_word_t w, d, j0, j1; data.f = i1; jit_get_reg_args(); + if (jit_fpr_p(r0)) + CHECK_SWF_OFFSET(); if (jit_fpr_p(r0)) swf_ldrin(_R0_REGNO, _FP_REGNO, swf_off(r0) + 8); else @@ -1541,6 +1630,8 @@ _swf_bundd_(jit_state_t *_jit, int eq, jit_float64_t d; } data; jit_get_reg_args(); + if (jit_fpr_p(r0)) + CHECK_SWF_OFFSET(); data.d = i1; if (jit_fpr_p(r0)) { if (!jit_thumb_p() && jit_armv5e_p()) @@ -1622,6 +1713,8 @@ static void _swf_extr_f(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1) { jit_get_reg_args(); + if (jit_fpr_p(r0)) + CHECK_SWF_OFFSET(); movr(_R0_REGNO, r1); swf_call(__aeabi_i2f, i2f, _R1_REGNO); if (jit_fpr_p(r0)) @@ -1635,6 +1728,8 @@ static void _swf_extr_d(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1) { jit_get_reg_args(); + if (jit_fpr_p(r0)) + CHECK_SWF_OFFSET(); movr(_R0_REGNO, r1); swf_call(__aeabi_i2d, i2d, _R2_REGNO); if (jit_fpr_p(r0)) { @@ -1656,6 +1751,8 @@ static void _swf_extr_d_f(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1) { jit_get_reg_args(); + if (jit_fpr_p(r0) || jit_fpr_p(r1)) + CHECK_SWF_OFFSET(); if (jit_fpr_p(r1)) { if (!jit_thumb_p() && jit_armv5e_p()) LDRDIN(_R0_REGNO, _FP_REGNO, swf_off(r1) + 8); @@ -1680,6 +1777,8 @@ static void _swf_extr_f_d(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1) { jit_get_reg_args(); + if (jit_fpr_p(r0) || jit_fpr_p(r1)) + CHECK_SWF_OFFSET(); if (jit_fpr_p(r1)) swf_ldrin(_R0_REGNO, _FP_REGNO, swf_off(r1) + 8); else @@ -1709,6 +1808,8 @@ _swf_truncr_f_i(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1) jit_word_t slow_not_nan; #endif jit_get_reg_args(); + if (jit_fpr_p(r1)) + CHECK_SWF_OFFSET(); if (jit_fpr_p(r1)) swf_ldrin(_R0_REGNO, _FP_REGNO, swf_off(r1) + 8); else @@ -1763,6 +1864,8 @@ _swf_truncr_d_i(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1) jit_word_t slow_not_nan; #endif jit_get_reg_args(); + if (jit_fpr_p(r1)) + CHECK_SWF_OFFSET(); if (jit_fpr_p(r1)) { if (!jit_thumb_p() && jit_armv5e_p()) LDRDIN(_R0_REGNO, _FP_REGNO, swf_off(r1) + 8); @@ -1823,66 +1926,12 @@ _swf_movr_f(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1) { jit_int32_t reg; if (r0 != r1) { - if (jit_fpr_p(r1)) { - reg = jit_get_reg(jit_class_gpr); - swf_ldrin(rn(reg), _FP_REGNO, swf_off(r1) + 8); - if (jit_fpr_p(r0)) - swf_strin(rn(reg), _FP_REGNO, swf_off(r0) + 8); - else - movr(r0, rn(reg)); - jit_unget_reg(reg); - } - else if (jit_fpr_p(r0)) - swf_strin(r1, _FP_REGNO, swf_off(r0) + 8); - else - movr(r0, r1); - } -} - -static void -_swf_movr_d(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1) -{ - jit_int32_t reg; - if (r0 != r1) { - if (jit_fpr_p(r1)) { - if (!jit_thumb_p() && jit_armv5e_p() && - (reg = jit_get_reg_pair()) != JIT_NOREG) { - LDRDIN(rn(reg), _FP_REGNO, swf_off(r1) + 8); - if (jit_fpr_p(r0)) - STRDIN(rn(reg), _FP_REGNO, swf_off(r0) + 8); - else { - movr(r0, rn(reg)); - movr(r0 + 1, rn(reg) + 1); - } - jit_unget_reg_pair(reg); - } - else { - reg = jit_get_reg(jit_class_gpr); - swf_ldrin(rn(reg), _FP_REGNO, swf_off(r1) + 8); - if (jit_fpr_p(r0)) - swf_strin(rn(reg), _FP_REGNO, swf_off(r0) + 8); - else - movr(r0, rn(reg)); - swf_ldrin(rn(reg), _FP_REGNO, swf_off(r1) + 4); - if (jit_fpr_p(r0)) - swf_strin(rn(reg), _FP_REGNO, swf_off(r0) + 4); - else - movr(r0 + 1, rn(reg)); - jit_unget_reg(reg); - } - } - else if (jit_fpr_p(r0)) { - if (!jit_thumb_p() && jit_armv5e_p() && !(r1 & 1)) - STRDIN(r1, _FP_REGNO, swf_off(r0) + 8); - else { - swf_strin(r1, _FP_REGNO, swf_off(r0) + 8); - swf_strin(r1 + 1, _FP_REGNO, swf_off(r0) + 4); - } - } - else { - movr(r0, r1); - movr(r0 + 1, r1 + 1); - } + assert(jit_fpr_p(r0) && jit_fpr_p(r1)); + CHECK_SWF_OFFSET(); + reg = jit_get_reg(jit_class_gpr); + swf_ldrin(rn(reg), _FP_REGNO, swf_off(r1) + 8); + swf_strin(rn(reg), _FP_REGNO, swf_off(r0) + 8); + jit_unget_reg(reg); } } @@ -1894,53 +1943,135 @@ _swf_movi_f(jit_state_t *_jit, jit_int32_t r0, jit_float32_t i0) jit_float32_t f; } data; jit_int32_t reg; + assert(jit_fpr_p(r0)); + CHECK_SWF_OFFSET(); data.f = i0; - if (jit_fpr_p(r0)) { - reg = jit_get_reg(jit_class_gpr); - movi(rn(reg), data.i); - swf_strin(rn(reg), _FP_REGNO, swf_off(r0) + 8); - jit_unget_reg(reg); - } - else - movi(r0, data.i); + reg = jit_get_reg(jit_class_gpr); + movi(rn(reg), data.i); + swf_strin(rn(reg), _FP_REGNO, swf_off(r0) + 8); + jit_unget_reg(reg); } static void -_swf_movi_d(jit_state_t *_jit, jit_int32_t r0, jit_float64_t i0) +_swf_movr_w_f(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1) +{ + assert(jit_fpr_p(r0)); + CHECK_SWF_OFFSET(); + swf_strin(r1, _FP_REGNO, swf_off(r0) + 8); +} + +static void +_swf_movr_f_w(jit_state_t *_jit ,jit_int32_t r0, jit_int32_t r1) +{ + assert(jit_fpr_p(r1)); + CHECK_SWF_OFFSET(); + swf_ldrin(r0, _FP_REGNO, swf_off(r1) + 8); +} + +static void +_swf_movi_w_f(jit_state_t *_jit, jit_int32_t r0, jit_word_t i0) { jit_int32_t reg; - union { - jit_int32_t i[2]; - jit_float64_t d; - } data; - data.d = i0; - if (jit_fpr_p(r0)) { + CHECK_SWF_OFFSET(); + reg = jit_get_reg(jit_class_gpr); + movi(rn(reg), i0); + swf_movr_w_f(r0, rn(reg)); + jit_unget_reg(reg); +} + +static void +_swf_movr_d(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1) +{ + jit_int32_t reg; + if (r0 != r1) { + assert(jit_fpr_p(r0) && jit_fpr_p(r1)); + CHECK_SWF_OFFSET(); if (!jit_thumb_p() && jit_armv5e_p() && (reg = jit_get_reg_pair()) != JIT_NOREG) { - movi(rn(reg), data.i[0]); - movi(rn(reg) + 1, data.i[1]); + LDRDIN(rn(reg), _FP_REGNO, swf_off(r1) + 8); STRDIN(rn(reg), _FP_REGNO, swf_off(r0) + 8); jit_unget_reg_pair(reg); } else { reg = jit_get_reg(jit_class_gpr); - movi(rn(reg), data.i[0]); + swf_ldrin(rn(reg), _FP_REGNO, swf_off(r1) + 8); swf_strin(rn(reg), _FP_REGNO, swf_off(r0) + 8); - movi(rn(reg), data.i[1]); + swf_ldrin(rn(reg), _FP_REGNO, swf_off(r1) + 4); swf_strin(rn(reg), _FP_REGNO, swf_off(r0) + 4); jit_unget_reg(reg); } } +} + +static void +_swf_movi_d(jit_state_t *_jit, jit_int32_t r0, jit_float64_t i0) +{ + jit_int32_t reg; + union { + jit_int32_t i[2]; + jit_float64_t d; + } data; + assert(jit_fpr_p(r0)); + CHECK_SWF_OFFSET(); + data.d = i0; + if (!jit_thumb_p() && jit_armv5e_p() && + (reg = jit_get_reg_pair()) != JIT_NOREG) { + movi(rn(reg), data.i[0]); + movi(rn(reg) + 1, data.i[1]); + STRDIN(rn(reg), _FP_REGNO, swf_off(r0) + 8); + jit_unget_reg_pair(reg); + } else { - movi(r0, data.i[0]); - movi(r0 + 1, data.i[1]); + reg = jit_get_reg(jit_class_gpr); + movi(rn(reg), data.i[0]); + swf_strin(rn(reg), _FP_REGNO, swf_off(r0) + 8); + movi(rn(reg), data.i[1]); + swf_strin(rn(reg), _FP_REGNO, swf_off(r0) + 4); + jit_unget_reg(reg); } } +static void +_swf_movr_ww_d(jit_state_t *_jit, + jit_int32_t r0, jit_int32_t r1, jit_int32_t r2) +{ + assert(jit_fpr_p(r0)); + CHECK_SWF_OFFSET(); + swf_strin(r1, _FP_REGNO, swf_off(r0) + 8); + swf_strin(r2, _FP_REGNO, swf_off(r0) + 4); +} + +static void +_swf_movr_d_ww(jit_state_t *_jit, + jit_int32_t r0, jit_int32_t r1, jit_int32_t r2) +{ + assert(jit_fpr_p(r2)); + CHECK_SWF_OFFSET(); + swf_ldrin(r0, _FP_REGNO, swf_off(r2) + 8); + swf_ldrin(r1, _FP_REGNO, swf_off(r2) + 4); +} + +static void +_swf_movi_ww_d(jit_state_t *_jit, + jit_int32_t r0, jit_word_t i0, jit_word_t i1) +{ + jit_int32_t reg; + assert(jit_fpr_p(r0)); + CHECK_SWF_OFFSET(); + reg = jit_get_reg(jit_class_gpr); + movi(rn(reg), i0); + swf_strin(rn(reg), _FP_REGNO, swf_off(r0) + 8); + movi(rn(reg), i1); + swf_strin(rn(reg), _FP_REGNO, swf_off(r0) + 4); + jit_unget_reg(reg); +} + static void _swf_absr_f(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1) { jit_int32_t reg; + if (jit_fpr_p(r0) || jit_fpr_p(r1)) + CHECK_SWF_OFFSET(); if (jit_fpr_p(r1)) { reg = jit_get_reg(jit_class_gpr); swf_ldrin(rn(reg), _FP_REGNO, swf_off(r1) + 8); @@ -1966,6 +2097,8 @@ static void _swf_absr_d(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1) { jit_int32_t reg; + if (jit_fpr_p(r0) || jit_fpr_p(r1)) + CHECK_SWF_OFFSET(); if (jit_fpr_p(r1)) { if (jit_fpr_p(r0) && !jit_thumb_p() && jit_armv5e_p() && r0 != r1 && (reg = jit_get_reg_pair()) != JIT_NOREG) { @@ -2013,6 +2146,8 @@ static void _swf_negr_f(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1) { jit_int32_t reg; + if (jit_fpr_p(r0) || jit_fpr_p(r1)) + CHECK_SWF_OFFSET(); if (jit_fpr_p(r1)) { reg = jit_get_reg(jit_class_gpr); swf_ldrin(rn(reg), _FP_REGNO, swf_off(r1) + 8); @@ -2038,6 +2173,8 @@ static void _swf_negr_d(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1) { jit_int32_t reg; + if (jit_fpr_p(r0) || jit_fpr_p(r1)) + CHECK_SWF_OFFSET(); if (jit_fpr_p(r1)) { if (jit_fpr_p(r0) && !jit_thumb_p() && jit_armv5e_p() && r0 != r1 && (reg = jit_get_reg_pair()) != JIT_NOREG) { @@ -2081,6 +2218,122 @@ _swf_negr_d(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1) } } +static void +_swf_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) { + swf_mulr_f(r0, r1, r2); + swf_addr_f(r0, r0, r3); + } + else { + t0 = jit_get_reg(jit_class_fpr); + swf_mulr_f(rn(t0), r1, r2); + swf_addr_f(r0, rn(t0), r3); + jit_unget_reg(t0); + } +} + +static void +_swf_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) { + swf_mulr_f(r0, r1, r2); + swf_subr_f(r0, r0, r3); + } + else { + t0 = jit_get_reg(jit_class_fpr); + swf_mulr_f(rn(t0), r1, r2); + swf_subr_f(r0, rn(t0), r3); + jit_unget_reg(t0); + } +} + +static void +_swf_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; + t0 = jit_get_reg(jit_class_fpr); + swf_negr_f(rn(t0), r1); + swf_mulr_f(rn(t0), rn(t0), r2); + swf_subr_f(r0, rn(t0), r3); + jit_unget_reg(t0); +} + +static void +_swf_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; + t0 = jit_get_reg(jit_class_fpr); + swf_negr_f(rn(t0), r1); + swf_mulr_f(rn(t0), rn(t0), r2); + swf_addr_f(r0, rn(t0), r3); + jit_unget_reg(t0); +} + +static void +_swf_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) { + swf_mulr_d(r0, r1, r2); + swf_addr_d(r0, r0, r3); + } + else { + t0 = jit_get_reg(jit_class_fpr); + swf_mulr_d(rn(t0), r1, r2); + swf_addr_d(r0, rn(t0), r3); + jit_unget_reg(t0); + } +} + +static void +_swf_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) { + swf_mulr_d(r0, r1, r2); + swf_subr_d(r0, r0, r3); + } + else { + t0 = jit_get_reg(jit_class_fpr); + swf_mulr_d(rn(t0), r1, r2); + swf_subr_d(r0, rn(t0), r3); + jit_unget_reg(t0); + } +} + +static void +_swf_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; + t0 = jit_get_reg(jit_class_fpr); + swf_negr_d(rn(t0), r1); + swf_mulr_d(rn(t0), rn(t0), r2); + swf_subr_d(r0, rn(t0), r3); + jit_unget_reg(t0); +} + +static void +_swf_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; + t0 = jit_get_reg(jit_class_fpr); + swf_negr_d(rn(t0), r1); + swf_mulr_d(rn(t0), rn(t0), r2); + swf_addr_d(r0, rn(t0), r3); + jit_unget_reg(t0); +} + static void _swf_ner_f(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2) { @@ -2170,6 +2423,7 @@ _swf_ldr_f(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1) { jit_int32_t reg; if (jit_fpr_p(r0)) { + CHECK_SWF_OFFSET(); reg = jit_get_reg(jit_class_gpr); ldxi_i(rn(reg), r1, 0); swf_strin(rn(reg), _FP_REGNO, swf_off(r0) + 8); @@ -2184,6 +2438,7 @@ _swf_ldr_d(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1) { jit_int32_t reg; if (jit_fpr_p(r0)) { + CHECK_SWF_OFFSET(); if (!jit_thumb_p() && jit_armv5e_p() && (reg = jit_get_reg_pair()) != JIT_NOREG) { LDRDI(rn(reg), r1, 0); @@ -2212,6 +2467,7 @@ _swf_ldi_f(jit_state_t *_jit, jit_int32_t r0, jit_word_t i0) { jit_int32_t reg; if (jit_fpr_p(r0)) { + CHECK_SWF_OFFSET(); reg = jit_get_reg(jit_class_gpr); ldi_i(rn(reg), i0); swf_strin(rn(reg), _FP_REGNO, swf_off(r0) + 8); @@ -2225,6 +2481,8 @@ static void _swf_ldi_d(jit_state_t *_jit, jit_int32_t r0, jit_word_t i0) { jit_int32_t rg0, rg1; + if (jit_fpr_p(r0)) + CHECK_SWF_OFFSET(); if (jit_fpr_p(r0) && !jit_thumb_p() && jit_armv5e_p() && (rg0 = jit_get_reg_pair()) != JIT_NOREG) { movi(rn(rg0), i0); @@ -2258,6 +2516,7 @@ _swf_ldxr_f(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2) { jit_int32_t reg; if (jit_fpr_p(r0)) { + CHECK_SWF_OFFSET(); reg = jit_get_reg(jit_class_gpr); ldxr_i(rn(reg), r1, r2); swf_strin(rn(reg), _FP_REGNO, swf_off(r0) + 8); @@ -2272,6 +2531,7 @@ _swf_ldxr_d(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2) { jit_int32_t rg0, rg1; if (jit_fpr_p(r0)) { + CHECK_SWF_OFFSET(); if (!jit_thumb_p() && jit_armv5e_p() && (rg0 = jit_get_reg_pair()) != JIT_NOREG) { LDRD(rn(rg0), r1, r2); @@ -2307,6 +2567,8 @@ static void _swf_ldxi_f(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0) { jit_int32_t reg; + if (jit_fpr_p(r0)) + CHECK_SWF_OFFSET(); if (jit_fpr_p(r0)) { reg = jit_get_reg(jit_class_gpr); ldxi_i(rn(reg), r1, i0); @@ -2317,11 +2579,86 @@ _swf_ldxi_f(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0) ldxi_i(r0, r1, i0); } +static void +_swf_unldr_x(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0) +{ + jit_int32_t t0, r2; + jit_int32_t t1, r3; + assert(i0 == 4 || i0 == 8); + if (jit_unaligned_p()) { + t0 = fallback_jit_get_reg(jit_class_gpr); + r2 = rn(t0); + if (i0 == 4) { + unldr(r2, r1, 4); + swf_movr_w_f(r0, r2); + } + else { + t1 = fallback_jit_get_reg(jit_class_gpr); + r3 = rn(t1); +#if __BYTE_ORDER == __LITTLE_ENDIAN + unldr(r2, r1, 4); + addi(r3, r1, 4); + unldr(r3, r3, 4); +#else + unldr(r3, r1, 4); + addi(r2, r1, 4); + unldr(r2, r2, 4); +#endif + swf_movr_ww_d(r0, r2, r3); + jit_unget_reg(t1); + } + jit_unget_reg(t0); + } + else { + if (i0 == 4) + swf_ldr_f(r0, r1); + else + swf_ldr_d(r0, r1); + } +} + +static void +_swf_unldi_x(jit_state_t *_jit, jit_int32_t r0, jit_word_t i0, jit_word_t i1) +{ + jit_int32_t t0, r2; + jit_int32_t t1, r3; + assert(i1 == 4 || i1 == 8); + if (jit_unaligned_p()) { + t0 = fallback_jit_get_reg(jit_class_gpr); + r2 = rn(t0); + if (i1 == 4) { + unldi(r2, i0, 4); + swf_movr_w_f(r0, r2); + } + else { + t1 = fallback_jit_get_reg(jit_class_gpr); + r3 = rn(t1); +#if __BYTE_ORDER == __LITTLE_ENDIAN + unldi(r2, i0, 4); + unldi(r3, i0 + 4, 4); +#else + unldi(r3, i0, 4); + unldi(r2, i0 + 4, 4); +#endif + swf_movr_ww_d(r0, r3, r2); + jit_unget_reg(t1); + } + jit_unget_reg(t0); + } + else { + if (i0 == 4) + swf_ldi_f(r0, i0); + else + swf_ldi_d(r0, i0); + } +} + static void _swf_ldxi_d(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0) { jit_int32_t rg0, rg1; if (jit_fpr_p(r0)) { + CHECK_SWF_OFFSET(); if (!jit_thumb_p() && jit_armv5e_p() && ((i0 >= 0 && i0 <= 255) || (i0 < 0 && i0 >= -255)) && (rg0 = jit_get_reg_pair()) != JIT_NOREG) { @@ -2391,6 +2728,7 @@ _swf_str_f(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1) { jit_int32_t reg; if (jit_fpr_p(r1)) { + CHECK_SWF_OFFSET(); reg = jit_get_reg(jit_class_gpr); swf_ldrin(rn(reg), _FP_REGNO, swf_off(r1) + 8); stxi_i(0, r0, rn(reg)); @@ -2405,6 +2743,7 @@ _swf_str_d(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1) { jit_int32_t reg; if (jit_fpr_p(r1)) { + CHECK_SWF_OFFSET(); if (!jit_thumb_p() && jit_armv5e_p() && (reg = jit_get_reg_pair()) != JIT_NOREG) { LDRDIN(rn(reg), _FP_REGNO, swf_off(r1) + 8); @@ -2435,6 +2774,7 @@ _swf_sti_f(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0) { jit_int32_t reg; if (jit_fpr_p(r0)) { + CHECK_SWF_OFFSET(); reg = jit_get_reg(jit_class_gpr); swf_ldrin(rn(reg), _FP_REGNO, swf_off(r0) + 8); sti_i(i0, rn(reg)); @@ -2444,11 +2784,86 @@ _swf_sti_f(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0) sti_i(i0, r0); } +static void +_swf_unstr_x(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0) +{ + jit_int32_t t0, r2; + jit_int32_t t1, r3; + assert(i0 == 4 || i0 == 8); + if (jit_unaligned_p()) { + t0 = fallback_jit_get_reg(jit_class_gpr); + r2 = rn(t0); + if (i0 == 4) { + swf_movr_f_w(r2, r1); + unstr(r0, r2, 4); + } + else { + t1 = fallback_jit_get_reg(jit_class_gpr); + r3 = rn(t1); + swf_movr_d_ww(r2, r3, r1); +#if __BYTE_ORDER == __LITTLE_ENDIAN + unstr(r0, r2, 4); + addi(r2, r0, 4); + unstr(r2, r3, 4); +#else + unstr(r0, r3, 4); + addi(r3, r0, 4); + unstr(r3, r2, 4); +#endif + jit_unget_reg(t1); + } + jit_unget_reg(t0); + } + else { + if (i0 == 4) + swf_str_f(r0, r1); + else + swf_str_d(r0, r1); + } +} + +static void +_swf_unsti_x(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_word_t i1) +{ + jit_int32_t t0, r2; + jit_int32_t t1, r3; + assert(i1 == 4 || i1 == 8); + if (jit_unaligned_p()) { + t0 = fallback_jit_get_reg(jit_class_gpr); + r2 = rn(t0); + if (i1 == 4) { + swf_movr_f_w(r2, r0); + unsti(i0, r2, 4); + } + else { + t1 = fallback_jit_get_reg(jit_class_gpr); + r3 = rn(t1); + swf_movr_d_ww(r2, r3, r0); +#if __BYTE_ORDER == __LITTLE_ENDIAN + unsti(i0, r3, 4); + unsti(i0 + 4, r2, 4); +#else + unsti(i0, r2, 4); + unsti(i0 + 4, r3, 4); +#endif + jit_unget_reg(t1); + } + jit_unget_reg(t0); + } + else { + if (i1 == 4) + swf_sti_f(i0, r0); + else + swf_sti_d(i0, r0); + } +} + static void _swf_sti_d(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0) { jit_int32_t rg0, rg1; if (jit_fpr_p(r0)) { + CHECK_SWF_OFFSET(); if (!jit_thumb_p() && jit_armv5e_p() && (rg0 = jit_get_reg_pair()) != JIT_NOREG) { rg1 = jit_get_reg(jit_class_gpr); @@ -2488,6 +2903,7 @@ _swf_stxr_f(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2) { jit_int32_t reg; if (jit_fpr_p(r2)) { + CHECK_SWF_OFFSET(); reg = jit_get_reg(jit_class_gpr); swf_ldrin(rn(reg), _FP_REGNO, swf_off(r2) + 8); stxr_i(r1, r0, rn(reg)); @@ -2502,6 +2918,7 @@ _swf_stxr_d(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2) { jit_int32_t rg0, rg1; if (jit_fpr_p(r2)) { + CHECK_SWF_OFFSET(); if (!jit_thumb_p() && jit_armv5e_p() && (rg0 = jit_get_reg_pair()) != JIT_NOREG) { LDRDIN(rn(rg0), _FP_REGNO, swf_off(r2) + 8); @@ -2538,6 +2955,7 @@ _swf_stxi_f(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_int32_t r1) { jit_int32_t reg; if (jit_fpr_p(r1)) { + CHECK_SWF_OFFSET(); reg = jit_get_reg(jit_class_gpr); swf_ldrin(rn(reg), _FP_REGNO, swf_off(r1) + 8); stxi_i(i0, r0, rn(reg)); @@ -2552,6 +2970,7 @@ _swf_stxi_d(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_int32_t r1) { jit_int32_t rg0, rg1; if (jit_fpr_p(r1)) { + CHECK_SWF_OFFSET(); if (!jit_thumb_p() && jit_armv5e_p() && ((i0 >= 0 && i0 <= 255) || (i0 < 0 && i0 >= -255)) && (rg0 = jit_get_reg_pair()) != JIT_NOREG) {