guile-commits
[Top][All Lists]
Advanced

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

[Guile-commits] 12/20: Fix jit_leave_jit_abi to pop correct registers


From: Andy Wingo
Subject: [Guile-commits] 12/20: Fix jit_leave_jit_abi to pop correct registers
Date: Sun, 28 Apr 2019 07:54:20 -0400 (EDT)

wingo pushed a commit to branch lightening
in repository guile.

commit d617315fdb5c3ebbc771932a6fe2fcb3e72806fc
Author: Andy Wingo <address@hidden>
Date:   Sat Apr 27 22:27:39 2019 +0200

    Fix jit_leave_jit_abi to pop correct registers
    
    Also relax stack alignment on 32-bit x86
---
 lightening/lightening.c |  6 +++---
 lightening/x86.c        | 10 ++++++++++
 2 files changed, 13 insertions(+), 3 deletions(-)

diff --git a/lightening/lightening.c b/lightening/lightening.c
index 75460cd..d18aa83 100644
--- a/lightening/lightening.c
+++ b/lightening/lightening.c
@@ -846,7 +846,7 @@ jit_align_stack(jit_state_t *_jit, size_t expand)
   size_t new_size = _jit->frame_size + expand;
   // Align stack to double-word boundaries.  This isn't really a
   // principle but it does work for Aarch32, AArch64 and x86-64.
-  size_t alignment = __WORDSIZE / 8 * 2;
+  size_t alignment = jit_stack_alignment ();
   size_t aligned_size = (new_size + alignment - 1) & ~(alignment - 1);
   size_t diff = aligned_size - _jit->frame_size;
   if (diff)
@@ -954,10 +954,10 @@ jit_leave_jit_abi(jit_state_t *_jit, size_t v, size_t vf, 
size_t frame_size)
 
   /* Restore callee-save registers.  */
   for (size_t i = 0; i < vf; i++)
-    jit_popr_d (_jit, VF[vf_count - i - 1]);
+    jit_popr_d (_jit, VF[vf - i - 1]);
 
   for (size_t i = 0; i < v; i++)
-    jit_popr (_jit, V[v_count - i - 1]);
+    jit_popr (_jit, V[v - i - 1]);
 }
 
 
diff --git a/lightening/x86.c b/lightening/x86.c
index 3adfd72..c14133c 100644
--- a/lightening/x86.c
+++ b/lightening/x86.c
@@ -356,6 +356,16 @@ jit_flush(void *fptr, void *tptr)
 {
 }
 
+static inline size_t
+jit_stack_alignment(void)
+{
+#if __X64
+  return 16;
+#else
+  return 4;
+#endif
+}
+
 static void
 jit_try_shorten(jit_state_t *_jit, jit_reloc_t reloc, jit_pointer_t addr)
 {



reply via email to

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