summaryrefslogtreecommitdiff
path: root/libguile/lightening
diff options
context:
space:
mode:
authorAndy Wingo <wingo@pobox.com>2019-04-04 17:07:09 +0200
committerAndy Wingo <wingo@pobox.com>2019-04-04 17:07:09 +0200
commitb35662fb4e71553bdd4b2b358c45d930ddf0bbcb (patch)
tree43645567a30649b3125de22bdedad6600d08853a /libguile/lightening
parentcfffd5b241e02a6780a6842fbaf9984bce150aa4 (diff)
parent4e1876f294685470990733ed10629313d593a4d0 (diff)
downloadguile-b35662fb4e71553bdd4b2b358c45d930ddf0bbcb.tar.gz
Merge from upstream Lightening
Diffstat (limited to 'libguile/lightening')
-rw-r--r--libguile/lightening/lightening/x86-cpu.c6
-rw-r--r--libguile/lightening/lightening/x86.c65
2 files changed, 57 insertions, 14 deletions
diff --git a/libguile/lightening/lightening/x86-cpu.c b/libguile/lightening/lightening/x86-cpu.c
index 5c1b298d5..c8bb9c8b9 100644
--- a/libguile/lightening/lightening/x86-cpu.c
+++ b/libguile/lightening/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/libguile/lightening/lightening/x86.c b/libguile/lightening/lightening/x86.c
index 08460dd65..0ec8c2f84 100644
--- a/libguile/lightening/lightening/x86.c
+++ b/libguile/lightening/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[])
{