[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Guile-commits] 11/13: Support immediate arguments
From: |
Andy Wingo |
Subject: |
[Guile-commits] 11/13: Support immediate arguments |
Date: |
Thu, 4 Apr 2019 06:11:44 -0400 (EDT) |
wingo pushed a commit to branch lightening
in repository guile.
commit ede10b101b6052f1bebc0ff04bd135be53907058
Author: Andy Wingo <address@hidden>
Date: Thu Apr 4 12:09:41 2019 +0200
Support immediate arguments
---
lightening/x86.c | 67 +++++++++++++++++++++++++++++++++++++++++++++++++++++---
1 file changed, 64 insertions(+), 3 deletions(-)
diff --git a/lightening/x86.c b/lightening/x86.c
index 16bb518..08460dd 100644
--- a/lightening/x86.c
+++ b/lightening/x86.c
@@ -441,6 +441,47 @@ next_abi_arg(struct abi_arg_iterator *iter, jit_arg_t *arg)
}
static void
+abi_imm_to_gpr(jit_state_t *_jit, jit_arg_abi_t abi, jit_gpr_t dst, intptr_t
imm)
+{
+ switch (abi) {
+ case JIT_ARG_ABI_UINT8:
+ ASSERT(0 <= imm);
+ ASSERT(imm <= UINT8_MAX);
+ break;
+ case JIT_ARG_ABI_INT8:
+ ASSERT(INT8_MIN <= imm);
+ ASSERT(imm <= INT8_MAX);
+ break;
+ case JIT_ARG_ABI_UINT16:
+ ASSERT(0 <= imm);
+ ASSERT(imm <= UINT16_MAX);
+ break;
+ case JIT_ARG_ABI_INT16:
+ ASSERT(INT16_MIN <= imm);
+ ASSERT(imm <= INT16_MAX);
+ break;
+ case JIT_ARG_ABI_UINT32:
+ ASSERT(0 <= imm);
+ ASSERT(imm <= UINT32_MAX);
+ break;
+ case JIT_ARG_ABI_INT32:
+ ASSERT(INT32_MIN <= imm);
+ ASSERT(imm <= INT32_MAX);
+ break;
+#if __WORDSIZE > 32
+ case JIT_ARG_ABI_UINT64:
+ case JIT_ARG_ABI_INT64:
+ break;
+#endif
+ case JIT_ARG_ABI_POINTER:
+ break;
+ default:
+ abort();
+ }
+ jit_movi (_jit, dst, imm);
+}
+
+static void
abi_gpr_to_mem(jit_state_t *_jit, jit_arg_abi_t abi,
jit_gpr_t src, jit_gpr_t base, ptrdiff_t offset)
{
@@ -568,6 +609,19 @@ store_mem_abi_arg(jit_state_t *_jit, jit_arg_abi_t abi,
}
break;
+ case JIT_ARG_LOC_IMM: {
+ if (is_gpr_arg(abi)) {
+ jit_gpr_t tmp = get_temp_gpr(_jit);
+ abi_imm_to_gpr(_jit, abi, tmp, arg->loc.imm);
+ abi_gpr_to_mem(_jit, abi, tmp, base, offset);
+ unget_temp_gpr(_jit);
+ } else {
+ /* Floating-point immediates not supported yet. */
+ abort ();
+ }
+ break;
+ }
+
default:
abort();
}
@@ -682,8 +736,8 @@ prepare_args(jit_state_t *_jit, size_t argc, const
jit_arg_abi_t abi[],
// We move on now to the ABI register arguments. All args whose values are
in
// registers are ABI register arguments, but they might not be the right
// register for the correponding ABI argument. Note that there may be ABI
- // register arguments whose values are still in memory; we will load them
- // later.
+ // register arguments whose values are still in memory or as immediates; we
+ // will load them later.
reset_abi_arg_iterator(&iter, argc, abi);
for (size_t i = 0; i < argc; i++)
{
@@ -705,7 +759,7 @@ prepare_args(jit_state_t *_jit, size_t argc, const
jit_arg_abi_t abi[],
}
// The only thing that's left is ABI register arguments whose values are
still
- // in memory; load them now.
+ // in memory or immediates; load them now.
reset_abi_arg_iterator(&iter, argc, abi);
for (size_t i = 0; i < argc; i++)
{
@@ -717,6 +771,10 @@ prepare_args(jit_state_t *_jit, size_t argc, const
jit_arg_abi_t abi[],
args[i].loc.mem.offset);
args[i].kind = JIT_ARG_LOC_GPR;
args[i].loc.gpr = scratch.loc.gpr;
+ } else if (args[i].kind == JIT_ARG_LOC_IMM) {
+ abi_imm_to_gpr(_jit, abi[i], scratch.loc.gpr, args[i].loc.imm);
+ args[i].kind = JIT_ARG_LOC_GPR;
+ args[i].loc.gpr = scratch.loc.gpr;
}
break;
@@ -726,6 +784,9 @@ prepare_args(jit_state_t *_jit, size_t argc, const
jit_arg_abi_t abi[],
args[i].loc.mem.offset);
args[i].kind = JIT_ARG_LOC_FPR;
args[i].loc.fpr = scratch.loc.fpr;
+ } else if (args[i].kind == JIT_ARG_LOC_IMM) {
+ /* Currently unsupported. */
+ abort ();
}
break;
- [Guile-commits] 03/13: Merge from upstream Lightening, (continued)
- [Guile-commits] 03/13: Merge from upstream Lightening, Andy Wingo, 2019/04/04
- [Guile-commits] 02/13: Fix implementation of jit_{gpr, fpr}_is_callee_save, Andy Wingo, 2019/04/04
- [Guile-commits] 01/13: jit: Fix inter-instruction relocs., Andy Wingo, 2019/04/04
- [Guile-commits] 05/13: Fix jit_gpr_is_callee_save usage, Andy Wingo, 2019/04/04
- [Guile-commits] 07/13: Fix JIT bugs, Andy Wingo, 2019/04/04
- [Guile-commits] 08/13: Add assert for jit_address, Andy Wingo, 2019/04/04
- [Guile-commits] 10/13: Merge from upstream Lightening, Andy Wingo, 2019/04/04
- [Guile-commits] 06/13: Merge from upstream Lightening, Andy Wingo, 2019/04/04
- [Guile-commits] 09/13: Fix some aspects of instruction mcode addresses, Andy Wingo, 2019/04/04
- [Guile-commits] 12/13: More various JIT fixen, Andy Wingo, 2019/04/04
- [Guile-commits] 11/13: Support immediate arguments,
Andy Wingo <=
- [Guile-commits] 13/13: Merge from upstream Lightening, Andy Wingo, 2019/04/04