guile-commits
[Top][All Lists]
Advanced

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

[Guile-commits] 01/02: Support spilling args to stack


From: Andy Wingo
Subject: [Guile-commits] 01/02: Support spilling args to stack
Date: Thu, 4 Apr 2019 11:08:42 -0400 (EDT)

wingo pushed a commit to branch lightening
in repository guile.

commit 4e1876f294685470990733ed10629313d593a4d0
Author: Andy Wingo <address@hidden>
Date:   Thu Apr 4 17:06:57 2019 +0200

    Support spilling args to stack
---
 lightening/x86-cpu.c |  6 ++---
 lightening/x86.c     | 65 +++++++++++++++++++++++++++++++++++++++++++---------
 2 files changed, 57 insertions(+), 14 deletions(-)

diff --git a/lightening/x86-cpu.c b/lightening/x86-cpu.c
index 5c1b298..c8bb9c8 100644
--- a/lightening/x86-cpu.c
+++ b/lightening/x86-cpu.c
@@ -1392,11 +1392,11 @@ andi(jit_state_t *_jit, int32_t r0, int32_t r1, 
jit_word_t i0)
 static void
 orr(jit_state_t *_jit, int32_t r0, int32_t r1, int32_t r2)
 {
-  if (r1 == r2)
+  if (r1 == r2) {
     movr(_jit, r0, r1);
-  else if (r0 == r1)
+  } else if (r0 == r1) {
     iorr(_jit, r0, r2);
-  else if (r0 == r2) {
+  } else if (r0 == r2) {
     iorr(_jit, r0, r1);
   } else {
     movr(_jit, r0, r1);
diff --git a/lightening/x86.c b/lightening/x86.c
index 08460dd..0ec8c2f 100644
--- a/lightening/x86.c
+++ b/lightening/x86.c
@@ -410,6 +410,50 @@ struct abi_arg_iterator
   size_t stack_size;
 };
 
+static size_t
+jit_arg_abi_sizeof(jit_arg_abi_t abi)
+{
+  switch (abi) {
+  case JIT_ARG_ABI_UINT8:
+  case JIT_ARG_ABI_INT8:
+    return 1;
+  case JIT_ARG_ABI_UINT16:
+  case JIT_ARG_ABI_INT16:
+    return 2;
+  case JIT_ARG_ABI_UINT32:
+  case JIT_ARG_ABI_INT32:
+    return 4;
+  case JIT_ARG_ABI_UINT64:
+  case JIT_ARG_ABI_INT64:
+    return 8;
+  case JIT_ARG_ABI_POINTER:
+    return CHOOSE_32_64(4, 8);
+  case JIT_ARG_ABI_FLOAT:
+    return 4;
+  case JIT_ARG_ABI_DOUBLE:
+    return 8;
+  default:
+    abort();
+  }
+}
+
+static size_t
+round_size_up_to_words(size_t bytes)
+{
+  size_t word_size = CHOOSE_32_64(4, 8);
+  size_t words = (bytes + word_size - 1) / word_size;
+  return words * word_size;
+}
+
+static void
+reset_abi_arg_iterator(struct abi_arg_iterator *iter, size_t argc,
+                       const jit_arg_abi_t *abi)
+{
+  memset(iter, 0, sizeof *iter);
+  iter->argc = argc;
+  iter->abi = abi;
+}
+
 static void
 next_abi_arg(struct abi_arg_iterator *iter, jit_arg_t *arg)
 {
@@ -423,7 +467,11 @@ next_abi_arg(struct abi_arg_iterator *iter, jit_arg_t *arg)
       iter->fpr_idx++;
 #endif
     } else {
-      abort();
+      arg->kind = JIT_ARG_LOC_MEM;
+      arg->loc.mem.base = JIT_GPR(_RSP);
+      arg->loc.mem.offset = iter->stack_size;
+      size_t bytes = jit_arg_abi_sizeof (abi);
+      iter->stack_size += round_size_up_to_words (bytes);
     }
   } else {
     ASSERT(is_fpr_arg(abi));
@@ -434,7 +482,11 @@ next_abi_arg(struct abi_arg_iterator *iter, jit_arg_t *arg)
       iter->gpr_idx++;
 #endif
     } else {
-      abort();
+      arg->kind = JIT_ARG_LOC_MEM;
+      arg->loc.mem.base = JIT_GPR(_RSP);
+      arg->loc.mem.offset = iter->stack_size;
+      size_t bytes = jit_arg_abi_sizeof (abi);
+      iter->stack_size += round_size_up_to_words (bytes);
     }
   }
   iter->arg_idx++;
@@ -698,15 +750,6 @@ shuffle_fpr_arg(jit_state_t *_jit, jit_fpr_t dst, size_t 
argc,
 }
 
 static void
-reset_abi_arg_iterator(struct abi_arg_iterator *iter, size_t argc,
-                       const jit_arg_abi_t *abi)
-{
-  memset(iter, 0, sizeof *iter);
-  iter->argc = argc;
-  iter->abi = abi;
-}
-
-static void
 prepare_args(jit_state_t *_jit, size_t argc, const jit_arg_abi_t abi[],
              jit_arg_t args[])
 {



reply via email to

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