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:
parent
100fbd17fb
commit
d04cfb05ac
2 changed files with 16 additions and 8 deletions
|
@ -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++])
|
||||
|
|
|
@ -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++)
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue