mirror of
https://git.savannah.gnu.org/git/guile.git
synced 2025-06-24 04:15:36 +02:00
Renumber x86 registers
Now that there's no hazard to using a register used for passing arguments, renumber to give JIT_R/JIT_F/JIT_V names to all registers. Choose a temp register that's not used for passing arguments. Our previous choice was an argument register (doh!) which made function calls with many arguments fail.
This commit is contained in:
parent
ddd66a2f34
commit
99e5672726
4 changed files with 90 additions and 29 deletions
|
@ -270,11 +270,11 @@ get_temp_gpr(jit_state_t *_jit)
|
|||
{
|
||||
ASSERT(!_jit->temp_gpr_saved);
|
||||
_jit->temp_gpr_saved = 1;
|
||||
#if __X32
|
||||
#ifdef JIT_RTMP
|
||||
return JIT_RTMP;
|
||||
#else
|
||||
pushr(_jit, _RBP_REGNO);
|
||||
return _RBP;
|
||||
#else
|
||||
return _R8;
|
||||
#endif
|
||||
}
|
||||
|
||||
|
@ -283,7 +283,7 @@ unget_temp_gpr(jit_state_t *_jit)
|
|||
{
|
||||
ASSERT(_jit->temp_gpr_saved);
|
||||
_jit->temp_gpr_saved = 0;
|
||||
#if __X32
|
||||
#ifndef JIT_RTMP
|
||||
popr(_jit, _RBP_REGNO);
|
||||
#endif
|
||||
}
|
||||
|
|
|
@ -190,10 +190,9 @@ popr_d(jit_state_t *_jit, int32_t r0)
|
|||
static jit_fpr_t
|
||||
get_temp_xpr(jit_state_t *_jit)
|
||||
{
|
||||
/* Reserve XMM7 for the JIT. */
|
||||
ASSERT(!_jit->temp_fpr_saved);
|
||||
_jit->temp_fpr_saved = 1;
|
||||
return _XMM7;
|
||||
return JIT_FTMP;
|
||||
}
|
||||
|
||||
static void
|
||||
|
|
|
@ -145,14 +145,18 @@
|
|||
# define JIT_F4 _XMM4
|
||||
# define JIT_F5 _XMM5
|
||||
# define JIT_F6 _XMM6
|
||||
# define JIT_F7 _XMM6
|
||||
# define JIT_FTMP _XMM7
|
||||
#elif __CYGWIN__
|
||||
# define JIT_R0 _RAX
|
||||
# define JIT_R1 _R10
|
||||
# define JIT_R2 _R11
|
||||
# define JIT_R1 _RCX
|
||||
# define JIT_R2 _RDX
|
||||
# define JIT_R3 _R8
|
||||
# define JIT_R4 _R9
|
||||
# define JIT_R5 _R10
|
||||
# define JIT_RTMP _R11
|
||||
# define JIT_V0 _RBX
|
||||
# define JIT_V1 _RDI
|
||||
# define JIT_V2 _RSI
|
||||
# define JIT_V1 _RSI
|
||||
# define JIT_V2 _RDI
|
||||
# define JIT_V3 _R12
|
||||
# define JIT_V4 _R13
|
||||
# define JIT_V5 _R14
|
||||
|
@ -162,26 +166,32 @@
|
|||
# define JIT_F2 _XMM2
|
||||
# define JIT_F3 _XMM3
|
||||
# define JIT_F4 _XMM4
|
||||
# define JIT_F5 _XMM5
|
||||
# define JIT_F6 _XMM6
|
||||
# define JIT_F7 _XMM7
|
||||
# define JIT_F8 _XMM8
|
||||
# define JIT_F9 _XMM9
|
||||
# define JIT_F10 _XMM10
|
||||
# define JIT_F11 _XMM11
|
||||
# define JIT_F12 _XMM12
|
||||
# define JIT_F13 _XMM13
|
||||
# define JIT_F14 _XMM14
|
||||
# define JIT_F15 _XMM15
|
||||
# define JIT_FTMP _XMM5
|
||||
# define JIT_VF0 _XMM6
|
||||
# define JIT_VF1 _XMM7
|
||||
# define JIT_VF2 _XMM8
|
||||
# define JIT_VF3 _XMM9
|
||||
# define JIT_VF4 _XMM10
|
||||
# define JIT_VF5 _XMM11
|
||||
# define JIT_VF6 _XMM12
|
||||
# define JIT_VF7 _XMM13
|
||||
# define JIT_VF8 _XMM14
|
||||
# define JIT_VF9 _XMM15
|
||||
#else
|
||||
# define JIT_R0 _RAX
|
||||
# define JIT_R1 _R10
|
||||
# define JIT_R2 _R11
|
||||
# define JIT_R3 _R12
|
||||
# define JIT_R1 _RCX
|
||||
# define JIT_R2 _RDX
|
||||
# define JIT_R3 _RSI
|
||||
# define JIT_R4 _RDI
|
||||
# define JIT_R5 _R8
|
||||
# define JIT_R6 _R9
|
||||
# define JIT_R7 _R10
|
||||
# define JIT_RTMP _R11
|
||||
# define JIT_V0 _RBX
|
||||
# define JIT_V1 _R13
|
||||
# define JIT_V2 _R14
|
||||
# define JIT_V3 _R15
|
||||
# define JIT_V1 _R12
|
||||
# define JIT_V2 _R13
|
||||
# define JIT_V3 _R14
|
||||
# define JIT_V4 _R15
|
||||
# define JIT_F0 _XMM0
|
||||
# define JIT_F1 _XMM1
|
||||
# define JIT_F2 _XMM2
|
||||
|
@ -197,7 +207,7 @@
|
|||
# define JIT_F12 _XMM12
|
||||
# define JIT_F13 _XMM13
|
||||
# define JIT_F14 _XMM14
|
||||
# define JIT_F15 _XMM15
|
||||
# define JIT_FTMP _XMM15
|
||||
#endif
|
||||
|
||||
typedef struct {
|
||||
|
|
52
tests/call_10.c
Normal file
52
tests/call_10.c
Normal file
|
@ -0,0 +1,52 @@
|
|||
#include "test.h"
|
||||
|
||||
static int32_t f(int32_t a, int32_t b, int32_t c, int32_t d, int32_t e,
|
||||
int32_t f, int32_t g, int32_t h, int32_t i, int32_t j) {
|
||||
ASSERT(a == 0);
|
||||
ASSERT(b == 1);
|
||||
ASSERT(c == 2);
|
||||
ASSERT(d == 3);
|
||||
ASSERT(e == 4);
|
||||
ASSERT(f == 5);
|
||||
ASSERT(g == 6);
|
||||
ASSERT(h == 7);
|
||||
ASSERT(i == 8);
|
||||
ASSERT(j == 9);
|
||||
return 42;
|
||||
}
|
||||
|
||||
static void
|
||||
run_test(jit_state_t *j, uint8_t *arena_base, size_t arena_size)
|
||||
{
|
||||
jit_begin(j, arena_base, arena_size);
|
||||
jit_load_args_1(j, jit_operand_gpr (JIT_OPERAND_ABI_POINTER, JIT_R0));
|
||||
|
||||
jit_operand_t args[10] = {
|
||||
jit_operand_mem(JIT_OPERAND_ABI_INT32, JIT_R0, 0 * sizeof(int32_t)),
|
||||
jit_operand_mem(JIT_OPERAND_ABI_INT32, JIT_R0, 1 * sizeof(int32_t)),
|
||||
jit_operand_mem(JIT_OPERAND_ABI_INT32, JIT_R0, 2 * sizeof(int32_t)),
|
||||
jit_operand_mem(JIT_OPERAND_ABI_INT32, JIT_R0, 3 * sizeof(int32_t)),
|
||||
jit_operand_mem(JIT_OPERAND_ABI_INT32, JIT_R0, 4 * sizeof(int32_t)),
|
||||
jit_operand_mem(JIT_OPERAND_ABI_INT32, JIT_R0, 5 * sizeof(int32_t)),
|
||||
jit_operand_mem(JIT_OPERAND_ABI_INT32, JIT_R0, 6 * sizeof(int32_t)),
|
||||
jit_operand_mem(JIT_OPERAND_ABI_INT32, JIT_R0, 7 * sizeof(int32_t)),
|
||||
jit_operand_mem(JIT_OPERAND_ABI_INT32, JIT_R0, 8 * sizeof(int32_t)),
|
||||
jit_operand_mem(JIT_OPERAND_ABI_INT32, JIT_R0, 9 * sizeof(int32_t))
|
||||
};
|
||||
jit_calli(j, f, 10, args);
|
||||
jit_ret(j);
|
||||
|
||||
size_t size = 0;
|
||||
void* ret = jit_end(j, &size);
|
||||
|
||||
int32_t (*f)(int32_t*) = ret;
|
||||
|
||||
int32_t iargs[10] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
|
||||
ASSERT(f(iargs) == 42);
|
||||
}
|
||||
|
||||
int
|
||||
main (int argc, char *argv[])
|
||||
{
|
||||
return main_helper(argc, argv, run_test);
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue