-rw-r--r-- | lib/jit_arm-swf.c | 36 | ||||
-rw-r--r-- | lib/jit_arm.c | 4 | ||||
-rw-r--r-- | lib/jit_mips.c | 140 | ||||
-rw-r--r-- | lib/jit_ppc.c | 16 |
diff --git a/lib/jit_arm-swf.c b/lib/jit_arm-swf.c index ad0d12d..1315693 100644 --- a/lib/jit_arm-swf.c +++ b/lib/jit_arm-swf.c @@ -1740,25 +1740,25 @@ _swf_absr_d(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1) 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) { - LDRDIN(rn(reg), _FP_REGNO, swf_off(r1) + 8); + LDRDIN(rn(reg), _FP_REGNO, swf_off(r1) + 4); swf_bici(rn(reg), rn(reg), 0x80000000); - STRDIN(rn(reg), _FP_REGNO, swf_off(r0) + 8); + STRDIN(rn(reg), _FP_REGNO, swf_off(r0) + 4); jit_unget_reg_pair(reg); } else { reg = jit_get_reg(jit_class_gpr); - swf_ldrin(rn(reg), _FP_REGNO, swf_off(r1) + 8); + swf_ldrin(rn(reg), _FP_REGNO, swf_off(r1) + 4); swf_bici(rn(reg), rn(reg), 0x80000000); if (jit_fpr_p(r0)) { - swf_strin(rn(reg), _FP_REGNO, swf_off(r0) + 8); + swf_strin(rn(reg), _FP_REGNO, swf_off(r0) + 4); if (r0 != r1) { - swf_ldrin(rn(reg), _FP_REGNO, swf_off(r1) + 4); - swf_strin(rn(reg), _FP_REGNO, swf_off(r0) + 4); + swf_ldrin(rn(reg), _FP_REGNO, swf_off(r1) + 8); + 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); + swf_ldrin(rn(reg), _FP_REGNO, swf_off(r1) + 8); movr(r0 + 1, rn(reg)); } jit_unget_reg(reg); @@ -1768,9 +1768,9 @@ _swf_absr_d(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1) reg = jit_get_reg(jit_class_gpr); movr(rn(reg), r1); swf_bici(rn(reg), rn(reg), 0x80000000); - swf_strin(rn(reg), _FP_REGNO, swf_off(r0) + 8); - movr(rn(reg), r1 + 1); swf_strin(rn(reg), _FP_REGNO, swf_off(r0) + 4); + movr(rn(reg), r1 + 1); + swf_strin(rn(reg), _FP_REGNO, swf_off(r0) + 8); jit_unget_reg(reg); } else { @@ -1812,25 +1812,25 @@ _swf_negr_d(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1) 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) { - LDRDIN(rn(reg), _FP_REGNO, swf_off(r1) + 8); + LDRDIN(rn(reg), _FP_REGNO, swf_off(r1) + 4); EORI(rn(reg), rn(reg), encode_arm_immediate(0x80000000)); - STRDIN(rn(reg), _FP_REGNO, swf_off(r0) + 8); + STRDIN(rn(reg), _FP_REGNO, swf_off(r0) + 4); jit_unget_reg_pair(reg); } else { reg = jit_get_reg(jit_class_gpr); - swf_ldrin(rn(reg), _FP_REGNO, swf_off(r1) + 8); + swf_ldrin(rn(reg), _FP_REGNO, swf_off(r1) + 4); xori(rn(reg), rn(reg), 0x80000000); if (jit_fpr_p(r0)) { - swf_strin(rn(reg), _FP_REGNO, swf_off(r0) + 8); + swf_strin(rn(reg), _FP_REGNO, swf_off(r0) + 4); if (r0 != r1) { - swf_ldrin(rn(reg), _FP_REGNO, swf_off(r1) + 4); - swf_strin(rn(reg), _FP_REGNO, swf_off(r0) + 4); + swf_ldrin(rn(reg), _FP_REGNO, swf_off(r1) + 8); + 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); + swf_ldrin(rn(reg), _FP_REGNO, swf_off(r1) + 8); movr(r0 + 1, rn(reg)); } jit_unget_reg(reg); @@ -1840,9 +1840,9 @@ _swf_negr_d(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1) reg = jit_get_reg(jit_class_gpr); movr(rn(reg), r1); xori(rn(reg), rn(reg), 0x80000000); - swf_strin(rn(reg), _FP_REGNO, swf_off(r0) + 8); - movr(rn(reg), r1 + 1); swf_strin(rn(reg), _FP_REGNO, swf_off(r0) + 4); + movr(rn(reg), r1 + 1); + swf_strin(rn(reg), _FP_REGNO, swf_off(r0) + 8); jit_unget_reg(reg); } else { diff --git a/lib/jit_arm.c b/lib/jit_arm.c index adafcb2..e4af92e 100644 --- a/lib/jit_arm.c +++ b/lib/jit_arm.c @@ -563,7 +563,7 @@ _jit_pushargi_f(jit_state_t *_jit, jit_float32_t u) return; } } - regno = jit_get_reg(jit_class_gpr); + regno = jit_get_reg(jit_class_fpr); jit_movi_f(regno, u); jit_stxi_f(_jit->function->call.size, JIT_SP, regno); jit_unget_reg(regno); @@ -624,7 +624,7 @@ _jit_pushargi_d(jit_state_t *_jit, jit_float64_t u) } if (_jit->function->call.size & 7) _jit->function->call.size += 4; - regno = jit_get_reg(jit_class_gpr); + regno = jit_get_reg(jit_class_fpr); jit_movi_d(regno, u); jit_stxi_d(_jit->function->call.size, JIT_SP, regno); jit_unget_reg(regno); diff --git a/lib/jit_mips.c b/lib/jit_mips.c index 7b6f99d..bfca206 100644 --- a/lib/jit_mips.c +++ b/lib/jit_mips.c @@ -421,58 +421,69 @@ _jit_getarg_d(jit_state_t *_jit, jit_int32_t u, jit_int32_t v) void _jit_pushargr(jit_state_t *_jit, jit_int32_t u) { + jit_word_t offset; + assert(_jit->function); - if (_jit->function->call.argf) { - _jit->function->call.argi = _jit->function->call.argf; + offset = _jit->function->call.size >> 2; + if (_jit->function->call.argf) _jit->function->call.argf = 0; - } - if (_jit->function->call.argi < 4) { - jit_movr(_A0 - _jit->function->call.argi, u); - ++_jit->function->call.argi; - } + if (offset < 4) + jit_movr(_A0 - offset, u); else jit_stxi(_jit->function->call.size, JIT_SP, u); + _jit->function->call.argi = offset + 1; _jit->function->call.size += sizeof(jit_word_t); } void _jit_pushargi(jit_state_t *_jit, jit_word_t u) { - jit_int32_t regno; + jit_int32_t regno; + jit_word_t offset; assert(_jit->function); - if (_jit->function->call.argf) { - _jit->function->call.argi = _jit->function->call.argf; + offset = _jit->function->call.size >> 2; + if (_jit->function->call.argf) _jit->function->call.argf = 0; - } - if (_jit->function->call.argi < 4) { - jit_movi(_A0 - _jit->function->call.argi, u); - ++_jit->function->call.argi; - } + if (offset < 4) + jit_movi(_A0 - offset, u); else { regno = jit_get_reg(jit_class_gpr); jit_movi(regno, u); jit_stxi(_jit->function->call.size, JIT_SP, regno); jit_unget_reg(regno); } + _jit->function->call.argi = offset + 1; _jit->function->call.size += sizeof(jit_word_t); } void _jit_pushargr_f(jit_state_t *_jit, jit_int32_t u) { + jit_word_t offset; + assert(_jit->function); - if (_jit->function->call.argi) { - jit_new_node_ww(jit_code_pushargr_f, - _A0 - _jit->function->call.argi, u); - _jit->function->call.argi += 2; - } - else if (_jit->function->call.argf < 4) { - jit_movr_f(_F12 - (_jit->function->call.argf >> 1), u); - _jit->function->call.argf += 2; + offset = _jit->function->call.size >> 2; + if (offset < 3) { + if (offset & 1) { + ++offset; + _jit->function->call.size += 4; + } + if (_jit->function->call.argi) + jit_new_node_ww(jit_code_pushargr_f, _A0 - offset, u); + else + jit_movr_f(_F12 - (offset >> 1), u); } else jit_stxi_f(_jit->function->call.size, JIT_SP, u); + if (offset < 3) { + if (!_jit->function->call.argi) + _jit->function->call.argf = offset + 2; + else + _jit->function->call.argi = offset + 2; + } + else + _jit->function->call.argi = offset + 1; _jit->function->call.size += sizeof(jit_float32_t); } @@ -480,17 +491,19 @@ void _jit_pushargi_f(jit_state_t *_jit, jit_float32_t u) { jit_int32_t regno; + jit_word_t offset; - if (_jit->function->call.argi) { - if (_jit->function->call.argi & 1) - ++_jit->function->call.argi; - jit_new_node_wf(jit_code_pushargi_f, - _A0 - _jit->function->call.argi, u); - _jit->function->call.argi += 2; - } - else if (_jit->function->call.argf < 4) { - jit_movi_f(_F12 - (_jit->function->call.argf >> 1), u); - _jit->function->call.argf += 2; + assert(_jit->function); + offset = _jit->function->call.size >> 2; + if (offset < 3) { + if (offset & 1) { + ++offset; + _jit->function->call.size += 4; + } + if (_jit->function->call.argi) + jit_new_node_ww(jit_code_pushargi_f, _A0 - offset, u); + else + jit_movi_f(_F12 - (offset >> 1), u); } else { assert(_jit->function); @@ -499,26 +512,38 @@ _jit_pushargi_f(jit_state_t *_jit, jit_float32_t u) jit_stxi_f(_jit->function->call.size, JIT_SP, regno); jit_unget_reg(regno); } + if (offset < 3) { + if (!_jit->function->call.argi) + _jit->function->call.argf = offset + 2; + else + _jit->function->call.argi = offset + 2; + } + else + _jit->function->call.argi = offset + 1; _jit->function->call.size += sizeof(jit_float32_t); } void _jit_pushargr_d(jit_state_t *_jit, jit_int32_t u) { + jit_word_t offset; + assert(_jit->function); - if (_jit->function->call.argi) { - if (_jit->function->call.argi & 1) - ++_jit->function->call.argi; - jit_new_node_ww(jit_code_pushargr_d, - _A0 - _jit->function->call.argi, u); - _jit->function->call.argi += 2; - } - else if (_jit->function->call.argf < 4) { - jit_movr_d(_F12 - (_jit->function->call.argf >> 1), u); - _jit->function->call.argf += 2; + if (_jit->function->call.size & 7) + _jit->function->call.size += 4; + offset = _jit->function->call.size >> 2; + if (offset < 3) { + if (_jit->function->call.argi) + jit_new_node_ww(jit_code_pushargr_d, _A0 - offset, u); + else + jit_movr_d(_F12 - (offset >> 1), u); } else jit_stxi_d(_jit->function->call.size, JIT_SP, u); + if (offset < 3 && !_jit->function->call.argi) + _jit->function->call.argf = offset + 2; + else + _jit->function->call.argi = offset + 2; _jit->function->call.size += sizeof(jit_float64_t); } @@ -526,25 +551,28 @@ void _jit_pushargi_d(jit_state_t *_jit, jit_float64_t u) { jit_int32_t regno; + jit_word_t offset; - if (_jit->function->call.argi) { - if (_jit->function->call.argi & 1) - ++_jit->function->call.argi; - jit_new_node_wd(jit_code_pushargi_d, - _A0 - _jit->function->call.argi, u); - _jit->function->call.argi += 2; - } - else if (_jit->function->call.argf < 4) { - jit_movi_d(_F12 - (_jit->function->call.argf >> 1), u); - _jit->function->call.argf += 2; + assert(_jit->function); + if (_jit->function->call.size & 7) + _jit->function->call.size += 4; + offset = _jit->function->call.size >> 2; + if (offset < 3) { + if (_jit->function->call.argi) + jit_new_node_ww(jit_code_pushargi_d, _A0 - offset, u); + else + jit_movi_d(_F12 - (offset >> 1), u); } else { - assert(_jit->function); regno = jit_get_reg(jit_class_fpr); - jit_movi_f(regno, u); - jit_stxi_f(_jit->function->call.size, JIT_SP, regno); + jit_movi_d(regno, u); + jit_stxi_d(_jit->function->call.size, JIT_SP, regno); jit_unget_reg(regno); } + if (offset < 3 && !_jit->function->call.argi) + _jit->function->call.argf = offset + 2; + else + _jit->function->call.argi = offset + 2; _jit->function->call.size += sizeof(jit_float64_t); } diff --git a/lib/jit_ppc.c b/lib/jit_ppc.c index 618adef..6e5da81 100644 --- a/lib/jit_ppc.c +++ b/lib/jit_ppc.c @@ -379,6 +379,8 @@ _jit_pushargr(jit_state_t *_jit, jit_int32_t u) ++_jit->function->call.argi; } else { + if (!_jit->function->call.size) + _jit->function->call.size = 56; jit_stxi(_jit->function->call.size, JIT_SP, u); _jit->function->call.size += sizeof(jit_word_t); } @@ -394,6 +396,8 @@ _jit_pushargi(jit_state_t *_jit, jit_word_t u) ++_jit->function->call.argi; } else { + if (!_jit->function->call.size) + _jit->function->call.size = 56; regno = jit_get_reg(jit_class_gpr); jit_movi(regno, u); jit_stxi(_jit->function->call.size, JIT_SP, regno); @@ -424,7 +428,7 @@ _jit_pushargr_d(jit_state_t *_jit, jit_int32_t u) if (!(_jit->function->call.kind & jit_call_varargs)) return; } - if (_jit->function->call.argi < 6) { + if (_jit->function->call.argi < 8) { jit_stxi_d(-8, JIT_FP, u); jit_ldxi(JIT_RA0 - _jit->function->call.argi, JIT_FP, -8); _jit->function->call.argi++; @@ -432,8 +436,10 @@ _jit_pushargr_d(jit_state_t *_jit, jit_int32_t u) _jit->function->call.argi++; } else { + if (!_jit->function->call.size) + _jit->function->call.size = 56; jit_stxi_d(_jit->function->call.size, JIT_SP, u); - _jit->function->call.size += (sizeof(jit_float64_t) + 8) & -8; + _jit->function->call.size += sizeof(jit_float64_t); } } @@ -451,7 +457,7 @@ _jit_pushargi_d(jit_state_t *_jit, jit_float64_t u) } regno = jit_get_reg(jit_class_fpr); jit_movi_d(regno, u); - if (_jit->function->call.argi < 6) { + if (_jit->function->call.argi < 8) { jit_stxi_d(-8, JIT_FP, regno); jit_ldxi(JIT_RA0 - _jit->function->call.argi, JIT_FP, -8); _jit->function->call.argi++; @@ -459,8 +465,10 @@ _jit_pushargi_d(jit_state_t *_jit, jit_float64_t u) _jit->function->call.argi++; } else { + if (!_jit->function->call.size) + _jit->function->call.size = 56; jit_stxi_d(_jit->function->call.size, JIT_SP, regno); - _jit->function->call.size += (sizeof(jit_float64_t) + 8) & -8; + _jit->function->call.size += sizeof(jit_float64_t); } jit_unget_reg(regno); } |