1
Fork 0
mirror of https://git.savannah.gnu.org/git/guile.git synced 2025-06-05 03:30:24 +02:00

Change jit_finish to work with varargs functions in x86_64.

It is required to set %al to 0-8 inclusive, telling the number of
xmm registers used to pass arguments.
  This also corrects the calculation of _jitl.nextarg_putfp, that
would be incorrect if calling a function with both, float and double
arguments.
This commit is contained in:
PCPA 2010-08-25 06:55:50 -03:00
parent 100fbd17fb
commit d04cfb05ac
2 changed files with 16 additions and 8 deletions

View file

@ -55,6 +55,7 @@ struct jit_local_state {
int nextarg_putfp;
int nextarg_geti;
int argssize;
int fprssize;
int alloca_offset;
int alloca_slack;
};
@ -145,11 +146,18 @@ struct jit_local_state {
#define jit_pusharg_i(rs) (--_jitl.argssize, MOVQrr(rs, jit_arg_reg_order[_jitl.argssize]))
#define jit_finish(sub) (MOVQir((long) (sub), JIT_REXTMP), \
CALLsr(JIT_REXTMP))
#define jit_finish(sub) (MOVBir(_jitl.fprssize < JIT_FP_ARG_MAX \
? _jitl.fprssize \
: JIT_FP_ARG_MAX, _AL), \
jit_calli(sub))
#define jit_reg_is_arg(reg) ((reg) == _ECX || (reg) == _EDX)
#define jit_finishr(reg) ((jit_reg_is_arg((reg)) ? MOVQrr(reg, JIT_REXTMP) : (void)0), \
CALLsr(jit_reg_is_arg((reg)) ? JIT_REXTMP : (reg)))
#define jit_finishr(reg) (MOVBir(_jitl.fprssize < JIT_FP_ARG_MAX \
? _jitl.fprssize \
: JIT_FP_ARG_MAX, _AL), \
(jit_reg_is_arg((reg)) \
? (MOVQrr(reg, JIT_REXTMP), \
jit_callr(JIT_REXTMP)) \
: jit_callr(reg)))
#define jit_retval_l(rd) ((void)jit_movr_l ((rd), _EAX))
#define jit_arg_c() (jit_arg_reg_order[_jitl.nextarg_geti++])

View file

@ -291,11 +291,11 @@ union jit_double_imm {
#define jit_unordr_d(d, s1, s2) (XORLrr ((d), (d)), UCOMISDrr ((s1), (s2)), SETPr (jit_reg8((d))))
#if !defined(_ASM_SAFETY)
#define jit_prepare_f(num) (_jitl.nextarg_putfp = _XMM0 + (num))
#define jit_prepare_d(num) (_jitl.nextarg_putfp = _XMM0 + (num))
#define jit_prepare_f(num) (_jitl.fprssize += (num), _jitl.nextarg_putfp = _XMM0 + _jitl.fprssize)
#define jit_prepare_d(num) (_jitl.fprssize += (num), _jitl.nextarg_putfp = _XMM0 + _jitl.fprssize)
#else
#define jit_prepare_f(num) ((num) <= JIT_FP_ARG_MAX ? (_jitl.nextarg_putfp = _XMM0 + (num)) : JITFAIL("too many float arguments"))
#define jit_prepare_d(num) ((num) <= JIT_FP_ARG_MAX ? (_jitl.nextarg_putfp = _XMM0 + (num)) : JITFAIL("too many float arguments"))
#define jit_prepare_f(num) (_jitl.fprssize += (num) <= JIT_FP_ARG_MAX ? (_jitl.nextarg_putfp = _XMM0 + _jitl.fprssize) : JITFAIL("too many float arguments"))
#define jit_prepare_d(num) (_jitl.fprssize += (num) <= JIT_FP_ARG_MAX ? (_jitl.nextarg_putfp = _XMM0 + _jitl.fprssize) : JITFAIL("too many float arguments"))
#endif
#define jit_arg_f() (_XMM0 + _jitl.nextarg_getfp++)