summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndy Wingo <wingo@igalia.com>2019-04-25 17:14:28 +0200
committerAndy Wingo <wingo@igalia.com>2019-04-25 17:14:28 +0200
commit99e5672726ff13ae761bc4da92253b6545268f06 (patch)
tree97f2bb2c59705d9bc48b614a67c18735c57cc9f4
parentddd66a2f344e9d59bb1bc928ca90ddabbfd0afbb (diff)
downloadguile-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.c8
-rw-r--r--lightening/x86-sse.c3
-rw-r--r--lightening/x86.h56
-rw-r--r--tests/call_10.c52
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);
+}