guile-commits
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Guile-commits] 02/05: Renumber x86 registers


From: Andy Wingo
Subject: [Guile-commits] 02/05: Renumber x86 registers
Date: Thu, 25 Apr 2019 12:14:40 -0400 (EDT)

wingo pushed a commit to branch lightening
in repository guile.

commit 99e5672726ff13ae761bc4da92253b6545268f06
Author: Andy Wingo <address@hidden>
Date:   Thu Apr 25 17:14:28 2019 +0200

    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.
---
 lightening/x86-cpu.c |  8 ++++----
 lightening/x86-sse.c |  3 +--
 lightening/x86.h     | 56 +++++++++++++++++++++++++++++++---------------------
 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 901d4ea..f49ba7e 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 4e0a414..370f5f4 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 7c7aab9..c2a2500 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 0000000..9c3c943
--- /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);
+}



reply via email to

[Prev in Thread] Current Thread [Next in Thread]