mirror of
https://git.savannah.gnu.org/git/guile.git
synced 2025-06-27 21:40:34 +02:00
Add the new ccall test case to test interleaved C and jit function calls
* check/cccall.c, check/ccall.ok: New test case to validate interleaved calls from/to C code and jit. * check/Makefile.am: Update for the new ccall test case. * include/lightning.h, lib/lightning.c: Add the new jit_address call that returns the real/final address of a "note" in the generated jit. It requires a jit_node_t as returned by the jit_note call, and is only valid after calling jit_emit. Add an intermediate solution to properly handle arm soft and softfp modes that move a double to an integer register pair. Currently it just adds extra tests for the condition, but the proper solution should be to have extra lightning codes for these conditions, codes which should be only used by the backends that need it, and merged with the existing jit_pusharg*_{f,d}. * include/lightning/jit_private.h: Add new jit_state_t flag to know it finished jit_emit, so that calls to jit_address are valid. * lib/jit_mips.c: Correct abi implementation so that the new ccall test case pass. Major problem was using _jit->function.self.arg{i,f} as boolean values, but that would cause lightning.c:patch_registers() to incorrectly assume only one register was used as argument when calling jit_regarg_p(); _jit->function.self.arg{i,f} must be the number of registers used as arguments (in all backends). * lib/jit_x86.c: Add workaround, by marking %rax as used, to a special condition, when running out of registers and the allocator trying to spill and reload %rax, but %rax was used as a pointer to a function, what would cause the reload to destroy the return value. This condition can be better generalized, but the current solution is good enough. * include/lightning/jit_ppc.h, lib/jit_ppc-cpu.c, lib/jit_ppc.c: Rewrite logic to handle arguments, as the original code was written based on a SysV pdf about the generic powerpc ABI, what did "invent" a new abi for the previous test cases, but failed in the new ccall test in Darwin PPC. Now it properly handles 13 float registers for arguments, as well as proper computation of stack offsets when running out of registers for arguments.
This commit is contained in:
parent
d7f94379ed
commit
9d2566ee0a
13 changed files with 1245 additions and 164 deletions
|
@ -30,8 +30,8 @@ typedef enum {
|
|||
#define jit_r_num() 3
|
||||
#define jit_v(i) (_R30 - (i))
|
||||
#define jit_v_num() 17
|
||||
#define jit_arg_f_reg_p(i) ((i) >= 0 && (i) < 8)
|
||||
#define jit_f(i) (_F0 + (i))
|
||||
#define jit_arg_f_reg_p(i) ((i) >= 0 && (i) < 13)
|
||||
#define jit_f(i) (_F14 + (i))
|
||||
#define jit_f_num() 6
|
||||
_R0,
|
||||
#define JIT_R0 _R11
|
||||
|
@ -73,13 +73,7 @@ typedef enum {
|
|||
#define JIT_RA6 _R9
|
||||
#define JIT_RA7 _R10
|
||||
_R10, _R9, _R8, _R7, _R6, _R5, _R4, _R3,
|
||||
# define JIT_F0 _F0
|
||||
# define JIT_F1 _F9
|
||||
# define JIT_F2 _F10
|
||||
# define JIT_F3 _F11
|
||||
# define JIT_F4 _F12
|
||||
# define JIT_F5 _F13
|
||||
_F0, _F9, _F10, _F11, _F12, _F13,
|
||||
_F0,
|
||||
#define JIT_FS0 _F14
|
||||
#define JIT_FS1 _F15
|
||||
#define JIT_FS2 _F16
|
||||
|
@ -98,9 +92,17 @@ typedef enum {
|
|||
#define JIT_FS15 _F29
|
||||
#define JIT_FS16 _F30
|
||||
#define JIT_FS17 _F31
|
||||
_F14, _F15, _F16, _F17, _F18, _F19, _F20,
|
||||
_F21, _F22, _F23, _F24, _F25, _F26, _F27,
|
||||
_F28, _F29, _F30, _F31,
|
||||
_F14, _F15, _F16, _F17, _F18, _F19, _F20, _F21,
|
||||
#define JIT_F0 _F14
|
||||
#define JIT_F1 _F15
|
||||
#define JIT_F2 _F16
|
||||
#define JIT_F3 _F17
|
||||
#define JIT_F4 _F18
|
||||
#define JIT_F5 _F19
|
||||
/* FIXME _F20-_F31 not (easily) accesible and only _F14-_F21
|
||||
* saved/restored (if used) */
|
||||
_F22, _F23, _F24, _F25, _F26, _F27, _F28, _F29,
|
||||
_F30, _F31,
|
||||
#define JIT_FRET _F1
|
||||
#define JIT_FA0 _F1
|
||||
#define JIT_FA1 _F2
|
||||
|
@ -110,7 +112,13 @@ typedef enum {
|
|||
#define JIT_FA5 _F6
|
||||
#define JIT_FA6 _F7
|
||||
#define JIT_FA7 _F8
|
||||
_F8, _F7, _F6, _F5, _F4, _F3, _F2, _F1,
|
||||
#define JIT_FA8 _F9
|
||||
#define JIT_FA9 _F10
|
||||
#define JIT_FA10 _F11
|
||||
#define JIT_FA11 _F12
|
||||
#define JIT_FA12 _F13
|
||||
_F13, _F12, _F11, _F10, _F9, _F8, _F7, _F6,
|
||||
_F5, _F4, _F3, _F2, _F1,
|
||||
_NOREG,
|
||||
#define JIT_NOREG _NOREG
|
||||
} jit_reg_t;
|
||||
|
|
|
@ -222,6 +222,7 @@ struct jit_state {
|
|||
} pc;
|
||||
jit_node_t *head;
|
||||
jit_node_t *tail;
|
||||
jit_uint32_t done : 1; /* emit state finished */
|
||||
jit_uint32_t emit : 1; /* emit state entered */
|
||||
jit_uint32_t again : 1; /* start over emiting function */
|
||||
jit_uint32_t prepare : 1; /* inside prepare/finish* block */
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue