1
Fork 0
mirror of https://git.savannah.gnu.org/git/guile.git synced 2025-04-30 03:40:34 +02:00

Merge from upstream Lightening

This commit is contained in:
Andy Wingo 2019-04-04 17:07:09 +02:00
commit b35662fb4e
2 changed files with 57 additions and 14 deletions

View file

@ -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);

View file

@ -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++;
@ -697,15 +749,6 @@ shuffle_fpr_arg(jit_state_t *_jit, jit_fpr_t dst, size_t argc,
args[idx].loc.fpr = dst;
}
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[])