From 07379b8a010bbba59a6916b3e0a4ab58e6d36295 Mon Sep 17 00:00:00 2001 From: Paolo Bonzini Date: Sun, 13 Jan 2008 10:22:29 +0100 Subject: [PATCH] don't truncate function pointers on amd64 2008-01-13 Paolo Bonzini * lightning/i386/core-i386.h: Move jit_calli and jit_callr... * lightning/i386/core-32.h: ... here. * lightning/i386/core-64.h: Redefine them. --- ChangeLog | 6 ++++++ lightning/i386/core-32.h | 3 +++ lightning/i386/core-64.h | 12 +++++++++--- lightning/i386/core-i386.h | 2 -- 4 files changed, 18 insertions(+), 5 deletions(-) diff --git a/ChangeLog b/ChangeLog index a7e8841c1..cbe534de9 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +2008-01-13 Paolo Bonzini + + * lightning/i386/core-i386.h: Move jit_calli and jit_callr... + * lightning/i386/core-32.h: ... here. + * lightning/i386/core-64.h: Redefine them. + 2008-01-05 Paolo Bonzini * lightning/i386/fp-32.h: Fix sub(a,0,a). diff --git a/lightning/i386/core-32.h b/lightning/i386/core-32.h index c48c44a94..48153e6df 100644 --- a/lightning/i386/core-32.h +++ b/lightning/i386/core-32.h @@ -85,6 +85,9 @@ struct jit_local_state { jit_allocai_internal ((n), 0) #endif +#define jit_calli(label) (CALLm( ((unsigned long) (label))), _jit.x.pc) +#define jit_callr(reg) CALLsr(reg) + #define jit_pusharg_i(rs) PUSHLr(rs) #define jit_finish(sub) ((void)jit_calli((sub)), ADDLir(sizeof(long) * _jitl.argssize, JIT_SP), _jitl.argssize = 0) #define jit_finishr(reg) (jit_callr((reg)), ADDLir(sizeof(long) * _jitl.argssize, JIT_SP), _jitl.argssize = 0) diff --git a/lightning/i386/core-64.h b/lightning/i386/core-64.h index 03d105311..917a212ca 100644 --- a/lightning/i386/core-64.h +++ b/lightning/i386/core-64.h @@ -120,15 +120,21 @@ struct jit_local_state { #define jit_base_prolog() (PUSHQr(_EBX), PUSHQr(_R12), PUSHQr(_R13), PUSHQr(_EBP), MOVQrr(_ESP, _EBP)) #define jit_prolog(n) (_jitl.nextarg_getfp = _jitl.nextarg_geti = 0, _jitl.alloca_offset = 0, jit_base_prolog()) +#define jit_calli(sub) (MOVQir((long) (sub), JIT_REXTMP), CALLLsr(JIT_REXTMP)) +#define jit_callr(reg) CALLLsr((reg)) + /* Stack isn't used for arguments: */ #define jit_prepare_i(ni) (_jitl.argssize = 0) #define jit_pusharg_i(rs) (_jitl.argssize++, MOVQrr(rs, JIT_CALLTMPSTART + _jitl.argssize - 1)) -#define jit_finish(sub) (jit_shift_args(), (void)jit_calli((sub)), jit_restore_locals()) -#define jit_reg_is_arg(reg) ((reg == _EDI) || (reg ==_ESI) || (reg == _EDX)) +#define jit_finish(sub) (MOVQir((long) (sub), JIT_REXTMP), \ + jit_shift_args(), \ + CALLLsr(JIT_REXTMP), \ + jit_restore_locals()) +#define jit_reg_is_arg(reg) ((reg == _EDI) || (reg ==_ESI) || (reg == _EDX)) #define jit_finishr(reg) ((jit_reg_is_arg((reg)) ? MOVQrr(reg, JIT_REXTMP) : (void)0), \ jit_shift_args(), \ - jit_reg_is_arg((reg)) ? CALLsr((JIT_REXTMP)) : jit_callr((reg)), \ + CALLLsr(jit_reg_is_arg((reg)) ? JIT_REXTMP : (reg)), \ jit_restore_locals()) /* R12 and R13 are callee-save, instead of EDI and ESI. Can be improved. */ diff --git a/lightning/i386/core-i386.h b/lightning/i386/core-i386.h index 754cdff73..f8df54be1 100644 --- a/lightning/i386/core-i386.h +++ b/lightning/i386/core-i386.h @@ -316,8 +316,6 @@ #define jit_bmci_i(label, rs, is) (jit_reduce(TEST, (is), (rs)), JZm(label), _jit.x.pc) #define jit_jmpi(label) (JMPm( ((unsigned long) (label))), _jit.x.pc) -#define jit_calli(label) (CALLm( ((unsigned long) (label))), _jit.x.pc) -#define jit_callr(reg) CALLsr(reg) #define jit_jmpr(reg) JMPsr(reg) /* Memory */