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:
commit
b35662fb4e
2 changed files with 57 additions and 14 deletions
|
@ -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);
|
||||
|
|
|
@ -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[])
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue