diff options
author | Andy Wingo <wingo@igalia.com> | 2019-04-25 17:14:28 +0200 |
---|---|---|
committer | Andy Wingo <wingo@igalia.com> | 2019-04-25 17:14:28 +0200 |
commit | 99e5672726ff13ae761bc4da92253b6545268f06 (patch) | |
tree | 97f2bb2c59705d9bc48b614a67c18735c57cc9f4 | |
parent | ddd66a2f344e9d59bb1bc928ca90ddabbfd0afbb (diff) | |
download | guile-99e5672726ff13ae761bc4da92253b6545268f06.tar.gz |
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.
-rw-r--r-- | lightening/x86-cpu.c | 8 | ||||
-rw-r--r-- | lightening/x86-sse.c | 3 | ||||
-rw-r--r-- | lightening/x86.h | 56 | ||||
-rw-r--r-- | tests/call_10.c | 52 |
4 files changed, 90 insertions, 29 deletions
diff --git a/lightening/x86-cpu.c b/lightening/x86-cpu.c index 901d4ea4e..f49ba7e37 100644 --- a/lightening/x86-cpu.c +++ b/lightening/x86-cpu.c @@ -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 } diff --git a/lightening/x86-sse.c b/lightening/x86-sse.c index 4e0a414b6..370f5f401 100644 --- a/lightening/x86-sse.c +++ b/lightening/x86-sse.c @@ -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 diff --git a/lightening/x86.h b/lightening/x86.h index 7c7aab972..c2a2500f2 100644 --- a/lightening/x86.h +++ b/lightening/x86.h @@ -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 { diff --git a/tests/call_10.c b/tests/call_10.c new file mode 100644 index 000000000..9c3c94358 --- /dev/null +++ b/tests/call_10.c @@ -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); +} |