diff options
author | Andy Wingo <wingo@pobox.com> | 2019-04-04 17:07:09 +0200 |
---|---|---|
committer | Andy Wingo <wingo@pobox.com> | 2019-04-04 17:07:09 +0200 |
commit | b35662fb4e71553bdd4b2b358c45d930ddf0bbcb (patch) | |
tree | 43645567a30649b3125de22bdedad6600d08853a /libguile/lightening | |
parent | cfffd5b241e02a6780a6842fbaf9984bce150aa4 (diff) | |
parent | 4e1876f294685470990733ed10629313d593a4d0 (diff) | |
download | guile-b35662fb4e71553bdd4b2b358c45d930ddf0bbcb.tar.gz |
Merge from upstream Lightening
Diffstat (limited to 'libguile/lightening')
-rw-r--r-- | libguile/lightening/lightening/x86-cpu.c | 6 | ||||
-rw-r--r-- | libguile/lightening/lightening/x86.c | 65 |
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[]) { |