From 6227bf5bf996f94249e34246b78d9b3ef5031b78 Mon Sep 17 00:00:00 2001 From: pcpa Date: Thu, 13 Dec 2012 18:26:57 -0200 Subject: [PATCH] Add new varargs test and correct related test case failures in all ports. --- ChangeLog | 21 ++++ check/Makefile.am | 4 +- check/varargs.ok | 3 + check/varargs.tst | 283 ++++++++++++++++++++++++++++++++++++++++++++ include/lightning.h | 4 + lib/jit_arm-swf.c | 36 +++--- lib/jit_arm.c | 4 +- lib/jit_mips.c | 140 +++++++++++++--------- lib/jit_ppc.c | 16 ++- 9 files changed, 430 insertions(+), 81 deletions(-) create mode 100644 check/varargs.ok create mode 100644 check/varargs.tst diff --git a/ChangeLog b/ChangeLog index 2fe54b3da..23b4c7ce7 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,24 @@ +2012-12-13 Paulo Andrade + + * check/varargs.ok, check/varargs.tst: New test cases implementing + simple varargs calls with a large amount of arguments to exercise + excess arguments on stack. + + * include/lightning.h: Include config.h if HAVE_CONFIG_H is + defined. + + * lib/jit_arm.c: Allocate a fpr register, not a gpr one for + temporary when pushing varargs arguments in the stack. + + * lib/jit_arm-swf.c: Correct code changing the wrong offset + in jit_absr_d and jit_negr_d in software float. + + * lib/jit_mips.c: Correct calculation of offsets of arguments + on stack. + + * lib/jit_ppc.c: Correct bogus logic for "next" offset of arguments + on stack and adjust for fixed offset of stack arguments. + 2012-12-12 Paulo Andrade * include/lightning.h, lib/jit_arm.c, lib/jit_mips.c, diff --git a/check/Makefile.am b/check/Makefile.am index 4ecc2432d..a5e9163be 100644 --- a/check/Makefile.am +++ b/check/Makefile.am @@ -57,6 +57,7 @@ EXTRA_DIST = \ alu_rsh.tst alu_rsh.ok \ alu_com.tst alu_com.ok \ alu_neg.tst alu_neg.ok \ + varargs.tst varargs.ok \ check.sh run-test \ all.tst @@ -71,7 +72,8 @@ TESTS = 3to2 add allocai \ alu_mul alu_div alu_rem \ alu_and alu_or alu_xor \ alu_lsh alu_rsh \ - alu_com alu_neg + alu_com alu_neg \ + varargs CLEANFILES = $(TESTS) diff --git a/check/varargs.ok b/check/varargs.ok new file mode 100644 index 000000000..5dcccb0e4 --- /dev/null +++ b/check/varargs.ok @@ -0,0 +1,3 @@ +0 1 2 3 4 5 6 7 8 9 +0.0 1.0 2.0 3.0 4.0 5.0 6.0 7.0 8.0 9.0 +0 0.0 1 1.0 2 2.0 3 3.0 4 4.0 5 5.0 6 6.0 7 7.0 8 8.0 9 9.0 diff --git a/check/varargs.tst b/check/varargs.tst new file mode 100644 index 000000000..65c81a4a4 --- /dev/null +++ b/check/varargs.tst @@ -0,0 +1,283 @@ +.data 1024 +ifmt: +.c "%d %d %d %d %d %d %d %d %d %d\n" +.align 4 +ichk: +.i 9 8 7 6 5 4 3 2 1 0 +dfmt: +.c "%.1f %.1f %.1f %.1f %.1f %.1f %.1f %.1f %.1f %.1f\n" +lfmt: +.c "%lf %lf %lf %lf %lf %lf %lf %lf %lf %lf\n" +dchk: +.align 8 +.d 9.0 8.0 7.0 6.0 5.0 4.0 3.0 2.0 1.0 0.0 +idfmt: +.c "%d %.1f %d %.1f %d %.1f %d %.1f %d %.1f %d %.1f %d %.1f %d %.1f %d %.1f %d %.1f\n" +ldfmt: +.c "%d %lf %d %lf %d %lf %d %lf %d %lf %d %lf %d %lf %d %lf %d %lf %d %lf\n" +buff: +.align 4 +.size 256 + +.code + jmpi main + +main: + prolog + + /* + sprintf(buff, "%d %d %d %d %d %d %d %d %d %d\n", + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9); + */ + prepare + pushargi buff + pushargi ifmt + ellipsis + pushargi 0 + pushargi 1 + pushargi 2 + pushargi 3 + pushargi 4 + pushargi 5 + pushargi 6 + pushargi 7 + pushargi 8 + pushargi 9 + finishi @sprintf + + /* + sscanf(buff, "%d %d %d %d %d %d %d %d %d %d\n", + ichk+0, ichk+1, ichk+2, ichk+3, ichk+4, + ichk+5, ichk+6, ichk+7, ichk+8, ichk+9); + */ + movi %v0 ichk + prepare + pushargi buff + pushargi ifmt + ellipsis + pushargr %v0 /* 0 */ + addi %v0 %v0 4 + pushargr %v0 /* 1 */ + addi %v0 %v0 4 + pushargr %v0 /* 2 */ + addi %v0 %v0 4 + pushargr %v0 /* 3 */ + addi %v0 %v0 4 + pushargr %v0 /* 4 */ + addi %v0 %v0 4 + pushargr %v0 /* 5 */ + addi %v0 %v0 4 + pushargr %v0 /* 6 */ + addi %v0 %v0 4 + pushargr %v0 /* 7 */ + addi %v0 %v0 4 + pushargr %v0 /* 8 */ + addi %v0 %v0 4 + pushargr %v0 /* 9 */ + finishi @sscanf + + movi %v0 ichk + movi %r0 0 +loopi: + ldr_i %r1 %v0 + beqr nexti %r0 %r1 + calli @abort +nexti: + addi %r0 %r0 1 + bgei outi %r0 10 + addi %v0 %v0 4 + jmpi loopi +outi: + + prepare + pushargi buff + ellipsis + finishi @printf + + /* + sprintf(buff, + "%.1f %.1f %.1f %.1f %.1f " + "%.1f %.1f %.1f %.1f %.1f\n", + 0.0, 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0); + */ + prepare + pushargi buff + pushargi dfmt + ellipsis + pushargi_d 0.0 + pushargi_d 1.0 + pushargi_d 2.0 + pushargi_d 3.0 + pushargi_d 4.0 + pushargi_d 5.0 + pushargi_d 6.0 + pushargi_d 7.0 + pushargi_d 8.0 + pushargi_d 9.0 + finishi @sprintf + + /* + sscanf(buff, "%lf %lf %lf %lf %lf %lf %lf %lf %lf %lf\n", + dchk+0, dchk+1, dchk+2, dchk+3, dchk+4, + dchk+5, dchk+6, dchk+7, dchk+8, dchk+9); + */ + movi %v0 dchk + prepare + pushargi buff + pushargi lfmt + ellipsis + pushargr %v0 /* 0 */ + addi %v0 %v0 8 + pushargr %v0 /* 1 */ + addi %v0 %v0 8 + pushargr %v0 /* 2 */ + addi %v0 %v0 8 + pushargr %v0 /* 3 */ + addi %v0 %v0 8 + pushargr %v0 /* 4 */ + addi %v0 %v0 8 + pushargr %v0 /* 5 */ + addi %v0 %v0 8 + pushargr %v0 /* 6 */ + addi %v0 %v0 8 + pushargr %v0 /* 7 */ + addi %v0 %v0 8 + pushargr %v0 /* 8 */ + addi %v0 %v0 8 + pushargr %v0 /* 9 */ + finishi @sscanf + + movi %v0 dchk + movi_d %f0 0.0 +loopd: + ldr_d %f1 %v0 + beqr_d nextd %f0 %f1 + calli @abort +nextd: + addi_d %f0 %f0 1.0 + bgei_d outd %f0 10.0 + addi %v0 %v0 8 + jmpi loopd +outd: + + prepare + pushargi buff + ellipsis + finishi @printf + + /* + sprintf(buff, + "%d %.1f %d %.1f %d %.1f %d %.1f %d %.1f " + "%d %.1f %d %.1f %d %.1f %d %.1f %d %.1f\n", + 0, 0.0, 1, 1.0, 2, 2.0, 3, 3.0, 4, 4.0, + 5, 5.0, 6, 6.0, 7, 7.0, 8, 8.0, 9, 9.0); + */ + prepare + pushargi buff + pushargi idfmt + ellipsis + pushargi 0 + pushargi_d 0.0 + pushargi 1 + pushargi_d 1.0 + pushargi 2 + pushargi_d 2.0 + pushargi 3 + pushargi_d 3.0 + pushargi 4 + pushargi_d 4.0 + pushargi 5 + pushargi_d 5.0 + pushargi 6 + pushargi_d 6.0 + pushargi 7 + pushargi_d 7.0 + pushargi 8 + pushargi_d 8.0 + pushargi 9 + pushargi_d 9.0 + finishi @sprintf + + /* + sscanf(buff, + "%d %lf %d %lf %d %lf %d %lf %d %lf " + "%d %lf %d %lf %d %lf %d %lf %d %lf\n", + ichk+0, dchk+0, ichk+1, dchk+1, ichk+2, + dchk+2, ichk+3, dchk+3, ichk+4, dchk+4, + ichk+5, dchk+5, ichk+6, dchk+6, ichk+7, + dchk+7, ichk+8, dchk+8, ichk+9, dchk+9); + */ + movi %v0 ichk + movi %v1 dchk + prepare + pushargi buff + pushargi ldfmt + ellipsis + pushargr %v0 /* 0 */ + addi %v0 %v0 4 + pushargr %v1 + addi %v1 %v1 8 + pushargr %v0 /* 1 */ + addi %v0 %v0 4 + pushargr %v1 + addi %v1 %v1 8 + pushargr %v0 /* 2 */ + addi %v0 %v0 4 + pushargr %v1 + addi %v1 %v1 8 + pushargr %v0 /* 3 */ + addi %v0 %v0 4 + pushargr %v1 + addi %v1 %v1 8 + pushargr %v0 /* 4 */ + addi %v0 %v0 4 + pushargr %v1 + addi %v1 %v1 8 + pushargr %v0 /* 5 */ + addi %v0 %v0 4 + pushargr %v1 + addi %v1 %v1 8 + pushargr %v0 /* 6 */ + addi %v0 %v0 4 + pushargr %v1 + addi %v1 %v1 8 + pushargr %v0 /* 7 */ + addi %v0 %v0 4 + pushargr %v1 + addi %v1 %v1 8 + pushargr %v0 /* 8 */ + addi %v0 %v0 4 + pushargr %v1 + addi %v1 %v1 8 + pushargr %v0 /* 9 */ + pushargr %v1 + finishi @sscanf + + movi %v0 ichk + movi %v1 dchk + movi %r0 0 + movi_d %f0 0.0 +loopid: + ldr_i %r1 %v0 + beqr checkd %r0 %r1 + calli @abort +checkd: + ldr_d %f1 %v1 + beqr_d nextid %f0 %f1 + calli @abort +nextid: + addi %r0 %r0 1 + addi_d %f0 %f0 1.0 + bgei outid %r0 10 + addi %v0 %v0 4 + addi %v1 %v1 8 + jmpi loopid +outid: + + prepare + pushargi buff + ellipsis + finishi @printf + + ret + epilog diff --git a/include/lightning.h b/include/lightning.h index 56cefe56d..7a382761c 100644 --- a/include/lightning.h +++ b/include/lightning.h @@ -18,6 +18,10 @@ #ifndef _lightning_h #define _lightning_h +#if HAVE_CONFIG_H +# include "config.h" +#endif + #include #include #include diff --git a/lib/jit_arm-swf.c b/lib/jit_arm-swf.c index ad0d12d84..1315693f7 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 adafcb294..e4af92ef0 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 7b6f99de2..bfca2062c 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 618adefe8..6e5da810e 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); }