summaryrefslogtreecommitdiff
path: root/libguile/lightening
diff options
context:
space:
mode:
authorAndy Wingo <wingo@pobox.com>2019-04-25 17:16:54 +0200
committerAndy Wingo <wingo@pobox.com>2019-04-25 17:16:54 +0200
commitb0cd9c0b77e9ca39dd3b52df2698f068fae516e3 (patch)
tree32c67379886423f07e28fe7507b7b22e141cbc67 /libguile/lightening
parentfa6093c4ef9b34c67b12e9f0550634c7d033978f (diff)
parent99e5672726ff13ae761bc4da92253b6545268f06 (diff)
downloadguile-b0cd9c0b77e9ca39dd3b52df2698f068fae516e3.tar.gz
Merge from upstream lightening
Diffstat (limited to 'libguile/lightening')
-rw-r--r--libguile/lightening/lightening.h11
-rw-r--r--libguile/lightening/lightening/lightening.c122
-rw-r--r--libguile/lightening/lightening/x86-cpu.c10
-rw-r--r--libguile/lightening/lightening/x86-sse.c3
-rw-r--r--libguile/lightening/lightening/x86.c137
-rw-r--r--libguile/lightening/lightening/x86.h282
-rw-r--r--libguile/lightening/tests/call_10.c52
7 files changed, 271 insertions, 346 deletions
diff --git a/libguile/lightening/lightening.h b/libguile/lightening/lightening.h
index 4fcec669b..4747a7149 100644
--- a/libguile/lightening/lightening.h
+++ b/libguile/lightening/lightening.h
@@ -95,18 +95,7 @@ typedef struct jit_reloc
# include "lightening/alpha.h"
#endif
-#define JIT_R(index) JIT_GPR(jit_r(index))
-#define JIT_V(index) JIT_GPR(jit_v(index))
-#define JIT_F(index) JIT_FPR(jit_f(index))
-#define JIT_R_NUM jit_r_num()
-#define JIT_V_NUM jit_v_num()
-#define JIT_F_NUM jit_f_num()
-
-#define jit_class_chk 0x02000000 /* just checking */
-#define jit_class_arg 0x08000000 /* argument register */
#define jit_class_sav 0x10000000 /* callee save */
-#define jit_class_gpr 0x20000000 /* general purpose */
-#define jit_class_fpr 0x40000000 /* float */
#define jit_class(bits) ((bits) & 0xffff0000)
#define jit_regno(bits) ((bits) & 0x00007fff)
diff --git a/libguile/lightening/lightening/lightening.c b/libguile/lightening/lightening/lightening.c
index d3494fd14..c2d55bd2b 100644
--- a/libguile/lightening/lightening/lightening.c
+++ b/libguile/lightening/lightening/lightening.c
@@ -35,89 +35,73 @@
# define maybe_unused /**/
#endif
+#define _NOREG 0xffff
#define rc(value) jit_class_##value
-#define rn(reg) (jit_regno(_rvs[jit_regno(reg.bits)].spec))
+#define rn(reg) jit_regno(reg.bits)
#if defined(__i386__) || defined(__x86_64__)
-# define JIT_SP JIT_GPR(_RSP)
-# define JIT_RET JIT_GPR(_RAX)
+# define JIT_RET _RAX
# if __X32
-# define JIT_FRET JIT_FPR(_ST0)
+# define JIT_FRET _ST0
# else
# if __CYGWIN__
-# define JIT_RA0 JIT_GPR(_RCX)
+# define JIT_RA0 _RCX
# else
-# define JIT_RA0 JIT_GPR(_RDI)
+# define JIT_RA0 _RDI
# endif
-# define JIT_FA0 JIT_FPR(_XMM0)
-# define JIT_FRET JIT_FPR(_XMM0)
+# define JIT_FA0 _XMM0
+# define JIT_FRET _XMM0
# endif
#elif defined(__mips__)
-# define JIT_RA0 JIT_GPR(_A0)
-# define JIT_FA0 JIT_FPR(_F12)
-# define JIT_SP JIT_GPR(_SP)
-# define JIT_RET JIT_GPR(_V0)
-# define JIT_FRET JIT_FPR(_F0)
+# define JIT_RA0 _A0
+# define JIT_FA0 _F12
+# define JIT_SP _SP
+# define JIT_RET _V0
+# define JIT_FRET _F0
#elif defined(__arm__)
-# define JIT_RA0 JIT_GPR(_R0)
-# define JIT_FA0 JIT_FPR(_D0)
-# define JIT_SP JIT_GPR(_R13)
-# define JIT_RET JIT_GPR(_R0)
+# define JIT_RA0 _R0
+# define JIT_FA0 _D0
+# define JIT_SP _R13
+# define JIT_RET _R0
# if defined(__ARM_PCS_VFP)
-# define JIT_FRET JIT_FPR(_D0)
+# define JIT_FRET _D0
# else
-# define JIT_FRET JIT_FPR(_R0)
+# define JIT_FRET _R0
# endif
#elif defined(__ppc__) || defined(__powerpc__)
-# define JIT_RA0 JIT_GPR(_R3)
-# define JIT_FA0 JIT_FPR(_F1)
-# define JIT_SP JIT_GPR(_R1)
-# define JIT_RET JIT_GPR(_R3)
-# define JIT_FRET JIT_FPR(_F1)
+# define JIT_RA0 _R3
+# define JIT_FA0 _F1
+# define JIT_SP _R1
+# define JIT_RET _R3
+# define JIT_FRET _F1
#elif defined(__sparc__)
-# define JIT_SP JIT_GPR(_SP)
-# define JIT_RET JIT_GPR(_I0)
-# define JIT_FRET JIT_FPR(_F0)
+# define JIT_SP _SP
+# define JIT_RET _I0
+# define JIT_FRET _F0
#elif defined(__ia64__)
-# define JIT_SP JIT_GPR(_R12)
-# define JIT_RET JIT_GPR(_R8)
-# define JIT_FRET JIT_FPR(_F8)
+# define JIT_SP _R12
+# define JIT_RET _R8
+# define JIT_FRET _F8
#elif defined(__hppa__)
-# define JIT_SP JIT_GPR(_R30)
-# define JIT_RET JIT_GPR(_R28)
-# define JIT_FRET JIT_FPR(_F4)
+# define JIT_SP _R30
+# define JIT_RET _R28
+# define JIT_FRET _F4
#elif defined(__aarch64__)
-# define JIT_RA0 JIT_GPR(_R0)
-# define JIT_FA0 JIT_FPR(_V0)
-# define JIT_SP JIT_GPR(_SP)
-# define JIT_RET JIT_GPR(_R0)
-# define JIT_FRET JIT_FPR(_V0)
+# define JIT_RA0 _R0
+# define JIT_FA0 _V0
+# define JIT_SP _SP
+# define JIT_RET _R0
+# define JIT_FRET _V0
#elif defined(__s390__) || defined(__s390x__)
-# define JIT_SP JIT_GPR(_R15)
-# define JIT_RET JIT_GPR(_R2)
-# define JIT_FRET JIT_FPR(_F0)
+# define JIT_SP _R15
+# define JIT_RET _R2
+# define JIT_FRET _F0
#elif defined(__alpha__)
-# define JIT_SP JIT_GPR(_SP)
-# define JIT_RET JIT_GPR(_V0)
-# define JIT_FRET JIT_FPR(_F0)
+# define JIT_SP _SP
+# define JIT_RET _V0
+# define JIT_FRET _F0
#endif
-/*
- * Private jit_class bitmasks
- */
-#define jit_class_named 0x00400000 /* hit must be the named reg */
-#define jit_class_nospill 0x00800000 /* hint to fail if need spill */
-#define jit_class_sft 0x01000000 /* not a hardware register */
-#define jit_class_rg8 0x04000000 /* x86 8 bits */
-#define jit_class_xpr 0x80000000 /* float / vector */
-/* Used on sparc64 where %f0-%f31 can be encode for single float
- * but %f32 to %f62 only as double precision */
-#define jit_class_sng 0x10000000 /* Single precision float */
-#define jit_class_dbl 0x20000000 /* Only double precision float */
-#define jit_regno_patch 0x00008000 /* this is a register
- * returned by a "user" call
- * to jit_get_reg() */
-
union jit_pc
{
uint8_t *uc;
@@ -146,20 +130,6 @@ enum jit_reloc_flags
JIT_RELOC_CAN_SHORTEN = 1<<0
};
-struct jit_register
-{
- jit_reg_t spec;
- char *name;
-};
-
-typedef struct jit_register jit_register_t;
-
-static const jit_register_t _rvs[];
-
-#define jit_regload_reload 0 /* convert to reload */
-#define jit_regload_delete 1 /* just remove node */
-#define jit_regload_isdead 2 /* delete and unset live bit */
-
#define ASSERT(x) do { if (!(x)) abort(); } while (0)
#if defined(__GNUC__)
# define UNLIKELY(exprn) __builtin_expect(exprn, 0)
@@ -406,13 +376,13 @@ jit_patch_there(jit_state_t* _jit, jit_reloc_t reloc, jit_pointer_t addr)
jit_bool_t
jit_gpr_is_callee_save (jit_state_t *_jit, jit_gpr_t reg)
{
- return jit_class(_rvs[jit_regno(reg.bits)].spec) & jit_class_sav;
+ return jit_class(reg.bits) & jit_class_sav;
}
jit_bool_t
jit_fpr_is_callee_save (jit_state_t *_jit, jit_fpr_t reg)
{
- return jit_class(_rvs[jit_regno(reg.bits)].spec) & jit_class_sav;
+ return jit_class(reg.bits) & jit_class_sav;
}
#if defined(__i386__) || defined(__x86_64__)
diff --git a/libguile/lightening/lightening/x86-cpu.c b/libguile/lightening/lightening/x86-cpu.c
index c8bb9c8b9..f49ba7e37 100644
--- a/libguile/lightening/lightening/x86-cpu.c
+++ b/libguile/lightening/lightening/x86-cpu.c
@@ -270,11 +270,11 @@ get_temp_gpr(jit_state_t *_jit)
{
ASSERT(!_jit->temp_gpr_saved);
_jit->temp_gpr_saved = 1;
-#if __X32
- pushr(_jit, _RBP_REGNO);
- return JIT_GPR(_RBP);
+#ifdef JIT_RTMP
+ return JIT_RTMP;
#else
- return JIT_GPR(_R8);
+ pushr(_jit, _RBP_REGNO);
+ return _RBP;
#endif
}
@@ -283,7 +283,7 @@ unget_temp_gpr(jit_state_t *_jit)
{
ASSERT(_jit->temp_gpr_saved);
_jit->temp_gpr_saved = 0;
-#if __X32
+#ifndef JIT_RTMP
popr(_jit, _RBP_REGNO);
#endif
}
diff --git a/libguile/lightening/lightening/x86-sse.c b/libguile/lightening/lightening/x86-sse.c
index 44d990545..370f5f401 100644
--- a/libguile/lightening/lightening/x86-sse.c
+++ b/libguile/lightening/lightening/x86-sse.c
@@ -190,10 +190,9 @@ popr_d(jit_state_t *_jit, int32_t r0)
static jit_fpr_t
get_temp_xpr(jit_state_t *_jit)
{
- /* Reserve XMM7 for the JIT. */
ASSERT(!_jit->temp_fpr_saved);
_jit->temp_fpr_saved = 1;
- return JIT_FPR(_XMM7);
+ return JIT_FTMP;
}
static void
diff --git a/libguile/lightening/lightening/x86.c b/libguile/lightening/lightening/x86.c
index c9676fe5a..7b0c4a16c 100644
--- a/libguile/lightening/lightening/x86.c
+++ b/libguile/lightening/lightening/x86.c
@@ -17,45 +17,6 @@
* Paulo Cesar Pereira de Andrade
*/
-#if __X32
-# define jit_arg_reg_p(i) 0
-# define jit_arg_f_reg_p(i) 0
-# define stack_framesize 20
-# define stack_adjust 12
-# define CVT_OFFSET -12
-# define REAL_WORDSIZE 4
-# define va_gp_increment 4
-# define va_fp_increment 8
-#else
-# if __CYGWIN__
-# define jit_arg_reg_p(i) ((i) >= 0 && (i) < 4)
-# define jit_arg_f_reg_p(i) jit_arg_reg_p(i)
-# define stack_framesize 152
-# define va_fp_increment 8
-# else
-# define jit_arg_reg_p(i) ((i) >= 0 && (i) < 6)
-# define jit_arg_f_reg_p(i) ((i) >= 0 && (i) < 8)
-# define stack_framesize 56
-# define first_gp_argument rdi
-# define first_gp_offset offsetof(jit_va_list_t, rdi)
-# define first_gp_from_offset(gp) ((gp) / 8)
-# define last_gp_argument r9
-# define va_gp_max_offset \
- (offsetof(jit_va_list_t, r9) - offsetof(jit_va_list_t, rdi) + 8)
-# define first_fp_argument xmm0
-# define first_fp_offset offsetof(jit_va_list_t, xmm0)
-# define last_fp_argument xmm7
-# define va_fp_max_offset \
- (offsetof(jit_va_list_t, xmm7) - offsetof(jit_va_list_t, rdi) + 16)
-# define va_fp_increment 16
-# define first_fp_from_offset(fp) (((fp) - va_gp_max_offset) / 16)
-# endif
-# define va_gp_increment 8
-# define stack_adjust 8
-# define CVT_OFFSET -8
-# define REAL_WORDSIZE 8
-#endif
-
/*
* Types
*/
@@ -94,94 +55,6 @@ typedef struct jit_va_list {
#endif
jit_cpu_t jit_cpu;
-static const jit_register_t _rvs[] = {
-#if __X32
- { rc(gpr) | rc(rg8) | 0, "%eax" },
- { rc(gpr) | rc(rg8) | 1, "%ecx" },
- { rc(gpr) | rc(rg8) | 2, "%edx" },
- { rc(sav) | rc(rg8) | rc(gpr) | 3, "%ebx" },
- { rc(sav) | rc(gpr) | 6, "%esi" },
- { rc(sav) | rc(gpr) | 7, "%edi" },
- { rc(sav) | 4, "%esp" },
- { rc(sav) | 5, "%ebp" },
- { rc(xpr) | rc(fpr) | 0, "%xmm0" },
- { rc(xpr) | rc(fpr) | 1, "%xmm1" },
- { rc(xpr) | rc(fpr) | 2, "%xmm2" },
- { rc(xpr) | rc(fpr) | 3, "%xmm3" },
- { rc(xpr) | rc(fpr) | 4, "%xmm4" },
- { rc(xpr) | rc(fpr) | 5, "%xmm5" },
- { rc(xpr) | rc(fpr) | 6, "%xmm6" },
- { rc(xpr) | rc(fpr) | 7, "%xmm7" },
-#elif __CYGWIN__
- { rc(gpr) | rc(rg8) | 0, "%rax" },
- { rc(gpr) | rc(rg8) | rc(rg8) | 10, "%r10" },
- { rc(gpr) | rc(rg8) | rc(rg8) | 11, "%r11" },
- { rc(sav) | rc(rg8) | rc(gpr) | 3, "%rbx" },
- { rc(sav) | rc(gpr) | 7, "%rdi" },
- { rc(sav) | rc(gpr) | 6, "%rsi" },
- { rc(sav) | rc(gpr) | 12, "%r12" },
- { rc(sav) | rc(gpr) | 13, "%r13" },
- { rc(sav) | rc(gpr) | 14, "%r14" },
- { rc(sav) | rc(gpr) | 15, "%r15" },
- { rc(arg) | rc(rg8) | rc(gpr) | 9, "%r9" },
- { rc(arg) | rc(rg8) | rc(gpr) | 8, "%r8" },
- { rc(arg) | rc(rg8) | rc(gpr) | 2, "%rdx" },
- { rc(arg) | rc(rg8) | rc(gpr) | 1, "%rcx" },
- { rc(sav) | 4, "%rsp" },
- { rc(sav) | 5, "%rbp" },
- { rc(xpr) | rc(fpr) | 4, "%xmm4" },
- { rc(xpr) | rc(fpr) | 5, "%xmm5" },
- { rc(sav) | rc(xpr) | rc(fpr) | 6, "%xmm6" },
- { rc(sav) | rc(xpr) | rc(fpr) | 7, "%xmm7" },
- { rc(sav) | rc(xpr) | rc(fpr) | 8, "%xmm8" },
- { rc(sav) | rc(xpr) | rc(fpr) | 9, "%xmm9" },
- { rc(sav) | rc(xpr) | rc(fpr) | 10, "%xmm10" },
- { rc(sav) | rc(xpr) | rc(fpr) | 11, "%xmm11" },
- { rc(sav) | rc(xpr) | rc(fpr) | 12, "%xmm12" },
- { rc(sav) | rc(xpr) | rc(fpr) | 13, "%xmm13" },
- { rc(sav) | rc(xpr) | rc(fpr) | 14, "%xmm14" },
- { rc(sav) | rc(xpr) | rc(fpr) | 15, "%xmm15" },
- { rc(xpr) | rc(arg) | rc(fpr) | 3, "%xmm3" },
- { rc(xpr) | rc(arg) | rc(fpr) | 2, "%xmm2" },
- { rc(xpr) | rc(arg) | rc(fpr) | 1, "%xmm1" },
- { rc(xpr) | rc(arg) | rc(fpr) | 0, "%xmm0" },
-#else
- /* %rax is a pseudo flag argument for varargs functions */
- { rc(arg) | rc(gpr) | rc(rg8) | 0, "%rax" },
- { rc(gpr) | rc(rg8) | 10, "%r10" },
- { rc(gpr) | rc(rg8) | 11, "%r11" },
- { rc(gpr) | rc(rg8) | 12, "%r12" },
- { rc(sav) | rc(rg8) | rc(gpr) | 3, "%rbx" },
- { rc(sav) | rc(rg8) | rc(gpr) | 13, "%r13" },
- { rc(sav) | rc(rg8) | rc(gpr) | 14, "%r14" },
- { rc(sav) | rc(rg8) | rc(gpr) | 15, "%r15" },
- { rc(arg) | rc(rg8) | rc(gpr) | 9, "%r9" },
- { rc(arg) | rc(rg8) | rc(gpr) | 8, "%r8" },
- { rc(arg) | rc(rg8) | rc(gpr) | 1, "%rcx" },
- { rc(arg) | rc(rg8) | rc(gpr) | 2, "%rdx" },
- { rc(arg) | rc(rg8) | rc(gpr) | 6, "%rsi" },
- { rc(arg) | rc(rg8) | rc(gpr) | 7, "%rdi" },
- { rc(sav) | 4, "%rsp" },
- { rc(sav) | 5, "%rbp" },
- { rc(xpr) | rc(fpr) | 8, "%xmm8" },
- { rc(xpr) | rc(fpr) | 9, "%xmm9" },
- { rc(xpr) | rc(fpr) | 10, "%xmm10" },
- { rc(xpr) | rc(fpr) | 11, "%xmm11" },
- { rc(xpr) | rc(fpr) | 12, "%xmm12" },
- { rc(xpr) | rc(fpr) | 13, "%xmm13" },
- { rc(xpr) | rc(fpr) | 14, "%xmm14" },
- { rc(xpr) | rc(fpr) | 15, "%xmm15" },
- { rc(xpr) | rc(arg) | rc(fpr) | 7, "%xmm7" },
- { rc(xpr) | rc(arg) | rc(fpr) | 6, "%xmm6" },
- { rc(xpr) | rc(arg) | rc(fpr) | 5, "%xmm5" },
- { rc(xpr) | rc(arg) | rc(fpr) | 4, "%xmm4" },
- { rc(xpr) | rc(arg) | rc(fpr) | 3, "%xmm3" },
- { rc(xpr) | rc(arg) | rc(fpr) | 2, "%xmm2" },
- { rc(xpr) | rc(arg) | rc(fpr) | 1, "%xmm1" },
- { rc(xpr) | rc(arg) | rc(fpr) | 0, "%xmm0" },
-#endif
- { _NOREG, "<none>" },
-};
#include "x86-cpu.c"
#include "x86-sse.c"
@@ -800,9 +673,9 @@ static const jit_gpr_t abi_gpr_args[] = {
#if __X32
/* No GPRs in args. */
#elif __CYGWIN__
- JIT_GPR(_RCX), JIT_GPR(_RDX), JIT_GPR(_R8), JIT_GPR(_R9)
+ _RCX, _RDX, _R8, _R9
#else
- JIT_GPR(_RDI), JIT_GPR(_RSI), JIT_GPR(_RDX), JIT_GPR(_RCX), JIT_GPR(_R8), JIT_GPR(_R9)
+ _RDI, _RSI, _RDX, _RCX, _R8, _R9
#endif
};
@@ -810,9 +683,9 @@ static const jit_fpr_t abi_fpr_args[] = {
#if __X32
/* No FPRs in args. */
#elif __CYGWIN__
- JIT_FPR(_XMM0), JIT_FPR(_XMM1), JIT_FPR(_XMM2), JIT_FPR(_XMM3)
+ _XMM0, _XMM1, _XMM2, _XMM3
#else
- JIT_FPR(_XMM0), JIT_FPR(_XMM1), JIT_FPR(_XMM2), JIT_FPR(_XMM3), JIT_FPR(_XMM4), JIT_FPR(_XMM5), JIT_FPR(_XMM6), JIT_FPR(_XMM7)
+ _XMM0, _XMM1, _XMM2, _XMM3, _XMM4, _XMM5, _XMM6, _XMM7
#endif
};
@@ -890,7 +763,7 @@ next_abi_arg(struct abi_arg_iterator *iter, jit_operand_t *arg)
iter->gpr_idx++;
#endif
} else {
- *arg = jit_operand_mem (abi, JIT_GPR(_RSP), iter->stack_size);
+ *arg = jit_operand_mem (abi, JIT_SP, iter->stack_size);
size_t bytes = jit_operand_abi_sizeof (abi);
iter->stack_size += round_size_up_to_words (bytes);
}
diff --git a/libguile/lightening/lightening/x86.h b/libguile/lightening/lightening/x86.h
index b275e5e8b..c2a2500f2 100644
--- a/libguile/lightening/lightening/x86.h
+++ b/libguile/lightening/lightening/x86.h
@@ -44,129 +44,171 @@
# define __X32 0
#endif
-#define JIT_FP JIT_GPR(_RBP)
-typedef enum {
#if __X32
-# define jit_r(i) (_RAX + (i))
-# define jit_r_num() 3
-# define jit_v(i) (_RBX + (i))
-# define jit_v_num() 3
-# define jit_f(i) (jit_cpu.sse2 ? _XMM0 + (i) : _ST0 + (i))
-# define jit_f_num() (jit_cpu.sse2 ? 8 : 6)
-# define JIT_R0 JIT_GPR(_RAX)
-# define JIT_R1 JIT_GPR(_RCX)
-# define JIT_R2 JIT_GPR(_RDX)
- _RAX, _RCX, _RDX,
-# define JIT_V0 JIT_GPR(_RBX)
-# define JIT_V1 JIT_GPR(_RSI)
-# define JIT_V2 JIT_GPR(_RDI)
- _RBX, _RSI, _RDI,
- _RSP, _RBP,
-# define JIT_F0 JIT_FPR(_XMM0)
-# define JIT_F1 JIT_FPR(_XMM1)
-# define JIT_F2 JIT_FPR(_XMM2)
-# define JIT_F3 JIT_FPR(_XMM3)
-# define JIT_F4 JIT_FPR(_XMM4)
-# define JIT_F5 JIT_FPR(_XMM5)
-# define JIT_F6 JIT_FPR(_XMM6)
- _XMM0, _XMM1, _XMM2, _XMM3, _XMM4, _XMM5, _XMM6, _XMM7,
-# define jit_sse_reg_p(reg) ((reg) >= _XMM0 && (reg) <= _XMM7)
+# define _RAX JIT_GPR(0)
+# define _RCX JIT_GPR(1)
+# define _RDX JIT_GPR(2)
+# define _RBX JIT_GPR(3 | jit_class_sav)
+# define _RSP JIT_GPR(4 | jit_class_sav)
+# define _RBP JIT_GPR(5 | jit_class_sav)
+# define _RSI JIT_GPR(6 | jit_class_sav)
+# define _RDI JIT_GPR(7 | jit_class_sav)
+# define _XMM0 JIT_FPR(0)
+# define _XMM1 JIT_FPR(1)
+# define _XMM2 JIT_FPR(2)
+# define _XMM3 JIT_FPR(3)
+# define _XMM4 JIT_FPR(4)
+# define _XMM5 JIT_FPR(5)
+# define _XMM6 JIT_FPR(6)
+# define _XMM7 JIT_FPR(7)
+#elif __CYGWIN__
+# define _RAX JIT_GPR(0)
+# define _RCX JIT_GPR(1)
+# define _RDX JIT_GPR(2)
+# define _RBX JIT_GPR(3 | jit_class_sav)
+# define _RSP JIT_GPR(4 | jit_class_sav)
+# define _RBP JIT_GPR(5 | jit_class_sav)
+# define _RSI JIT_GPR(6 | jit_class_sav)
+# define _RDI JIT_GPR(7 | jit_class_sav)
+# define _R8 JIT_GPR(8)
+# define _R9 JIT_GPR(9)
+# define _R10 JIT_GPR(10)
+# define _R11 JIT_GPR(11)
+# define _R12 JIT_GPR(12 | jit_class_sav)
+# define _R13 JIT_GPR(13 | jit_class_sav)
+# define _R14 JIT_GPR(14 | jit_class_sav)
+# define _R15 JIT_GPR(15 | jit_class_sav)
+# define _XMM0 JIT_FPR(0)
+# define _XMM1 JIT_FPR(1)
+# define _XMM2 JIT_FPR(2)
+# define _XMM3 JIT_FPR(3)
+# define _XMM4 JIT_FPR(4)
+# define _XMM5 JIT_FPR(5)
+# define _XMM6 JIT_FPR(6 | jit_class_sav)
+# define _XMM7 JIT_FPR(7 | jit_class_sav)
+# define _XMM8 JIT_FPR(8 | jit_class_sav)
+# define _XMM9 JIT_FPR(9 | jit_class_sav)
+# define _XMM10 JIT_FPR(10 | jit_class_sav)
+# define _XMM11 JIT_FPR(11 | jit_class_sav)
+# define _XMM12 JIT_FPR(12 | jit_class_sav)
+# define _XMM13 JIT_FPR(13 | jit_class_sav)
+# define _XMM14 JIT_FPR(14 | jit_class_sav)
+# define _XMM15 JIT_FPR(15 | jit_class_sav)
#else
-# if __CYGWIN__
-# define jit_r(i) (_RAX + (i))
-# define jit_r_num() 3
-# define jit_v(i) (_RBX + (i))
-# define jit_v_num() 7
-# define jit_f(index) (_XMM4 + (index))
-# define jit_f_num() 12
-# define JIT_R0 JIT_GPR(_RAX)
-# define JIT_R1 JIT_GPR(_R10)
-# define JIT_R2 JIT_GPR(_R11)
-# define JIT_V0 JIT_GPR(_RBX)
-# define JIT_V1 JIT_GPR(_RDI)
-# define JIT_V2 JIT_GPR(_RSI)
-# define JIT_V3 JIT_GPR(_R12)
-# define JIT_V4 JIT_GPR(_R13)
-# define JIT_V5 JIT_GPR(_R14)
-# define JIT_V6 JIT_GPR(_R15)
- /* Volatile - Return value register */
- _RAX,
- /* Volatile */
- _R10, _R11,
- /* Nonvolatile */
- _RBX, _RDI, _RSI,
- _R12, _R13, _R14, _R15,
- /* Volatile - Integer arguments (4 to 1) */
- _R9, _R8, _RDX, _RCX,
- /* Nonvolatile */
- _RSP, _RBP,
-# define JIT_F0 JIT_FPR(_XMM0)
-# define JIT_F1 JIT_FPR(_XMM1)
-# define JIT_F2 JIT_FPR(_XMM2)
-# define JIT_F3 JIT_FPR(_XMM3)
-# define JIT_F4 JIT_FPR(_XMM4)
-# define JIT_F5 JIT_FPR(_XMM5)
-# define JIT_F6 JIT_FPR(_XMM6)
-# define JIT_F7 JIT_FPR(_XMM7)
-# define JIT_F8 JIT_FPR(_XMM8)
-# define JIT_F9 JIT_FPR(_XMM9)
-# define JIT_F10 JIT_FPR(_XMM10)
-# define JIT_F11 JIT_FPR(_XMM11)
-# define JIT_F12 JIT_FPR(_XMM12)
-# define JIT_F13 JIT_FPR(_XMM13)
-# define JIT_F14 JIT_FPR(_XMM14)
-# define JIT_F15 JIT_FPR(_XMM15)
- /* Volatile */
- _XMM4, _XMM5,
- /* Nonvolatile */
- _XMM6, _XMM7, _XMM8, _XMM9, _XMM10,
- _XMM11, _XMM12, _XMM13, _XMM14, _XMM15,
- /* Volatile - FP arguments (4 to 1) */
- _XMM3, _XMM2, _XMM1, _XMM0,
-# define jit_sse_reg_p(reg) ((reg) >= _XMM4 && (reg) <= _XMM0)
-# else
-# define jit_r(i) (_RAX + (i))
-# define jit_r_num() 4
-# define jit_v(i) (_RBX + (i))
-# define jit_v_num() 4
-# define jit_f(index) (_XMM8 + (index))
-# define jit_f_num() 8
-# define JIT_R0 JIT_GPR(_RAX)
-# define JIT_R1 JIT_GPR(_R10)
-# define JIT_R2 JIT_GPR(_R11)
-# define JIT_R3 JIT_GPR(_R12)
- _RAX, _R10, _R11, _R12,
-# define JIT_V0 JIT_GPR(_RBX)
-# define JIT_V1 JIT_GPR(_R13)
-# define JIT_V2 JIT_GPR(_R14)
-# define JIT_V3 JIT_GPR(_R15)
- _RBX, _R13, _R14, _R15,
- _R9, _R8, _RCX, _RDX, _RSI, _RDI,
- _RSP, _RBP,
-# define JIT_F0 JIT_FPR(_XMM0)
-# define JIT_F1 JIT_FPR(_XMM1)
-# define JIT_F2 JIT_FPR(_XMM2)
-# define JIT_F3 JIT_FPR(_XMM3)
-# define JIT_F4 JIT_FPR(_XMM4)
-# define JIT_F5 JIT_FPR(_XMM5)
-# define JIT_F6 JIT_FPR(_XMM6)
-# define JIT_F7 JIT_FPR(_XMM7)
-# define JIT_F8 JIT_FPR(_XMM8)
-# define JIT_F9 JIT_FPR(_XMM9)
-# define JIT_F10 JIT_FPR(_XMM10)
-# define JIT_F11 JIT_FPR(_XMM11)
-# define JIT_F12 JIT_FPR(_XMM12)
-# define JIT_F13 JIT_FPR(_XMM13)
-# define JIT_F14 JIT_FPR(_XMM14)
-# define JIT_F15 JIT_FPR(_XMM15)
- _XMM8, _XMM9, _XMM10, _XMM11, _XMM12, _XMM13, _XMM14, _XMM15,
- _XMM7, _XMM6, _XMM5, _XMM4, _XMM3, _XMM2, _XMM1, _XMM0,
-# define jit_sse_reg_p(reg) ((reg) >= _XMM8 && (reg) <= _XMM0)
-# endif
+# define _RAX JIT_GPR(0)
+# define _RCX JIT_GPR(1)
+# define _RDX JIT_GPR(2)
+# define _RBX JIT_GPR(3 | jit_class_sav)
+# define _RSP JIT_GPR(4 | jit_class_sav)
+# define _RBP JIT_GPR(5 | jit_class_sav)
+# define _RSI JIT_GPR(6)
+# define _RDI JIT_GPR(7)
+# define _R8 JIT_GPR(8)
+# define _R9 JIT_GPR(9)
+# define _R10 JIT_GPR(10)
+# define _R11 JIT_GPR(11)
+# define _R12 JIT_GPR(12 | jit_class_sav)
+# define _R13 JIT_GPR(13 | jit_class_sav)
+# define _R14 JIT_GPR(14 | jit_class_sav)
+# define _R15 JIT_GPR(15 | jit_class_sav)
+# define _XMM0 JIT_FPR(0)
+# define _XMM1 JIT_FPR(1)
+# define _XMM2 JIT_FPR(2)
+# define _XMM3 JIT_FPR(3)
+# define _XMM4 JIT_FPR(4)
+# define _XMM5 JIT_FPR(5)
+# define _XMM6 JIT_FPR(6)
+# define _XMM7 JIT_FPR(7)
+# define _XMM8 JIT_FPR(8)
+# define _XMM9 JIT_FPR(9)
+# define _XMM10 JIT_FPR(10)
+# define _XMM11 JIT_FPR(11)
+# define _XMM12 JIT_FPR(12)
+# define _XMM13 JIT_FPR(13)
+# define _XMM14 JIT_FPR(14)
+# define _XMM15 JIT_FPR(15)
+#endif
+
+#define JIT_SP _RSP
+#define JIT_FP _RBP
+#if __X32
+# define JIT_R0 _RAX
+# define JIT_R1 _RCX
+# define JIT_R2 _RDX
+# define JIT_V0 _RBX
+# define JIT_V1 _RSI
+# define JIT_V2 _RDI
+# define JIT_F0 _XMM0
+# define JIT_F1 _XMM1
+# define JIT_F2 _XMM2
+# define JIT_F3 _XMM3
+# define JIT_F4 _XMM4
+# define JIT_F5 _XMM5
+# define JIT_F6 _XMM6
+# define JIT_FTMP _XMM7
+#elif __CYGWIN__
+# define JIT_R0 _RAX
+# define JIT_R1 _RCX
+# define JIT_R2 _RDX
+# define JIT_R3 _R8
+# define JIT_R4 _R9
+# define JIT_R5 _R10
+# define JIT_RTMP _R11
+# define JIT_V0 _RBX
+# define JIT_V1 _RSI
+# define JIT_V2 _RDI
+# define JIT_V3 _R12
+# define JIT_V4 _R13
+# define JIT_V5 _R14
+# define JIT_V6 _R15
+# define JIT_F0 _XMM0
+# define JIT_F1 _XMM1
+# define JIT_F2 _XMM2
+# define JIT_F3 _XMM3
+# define JIT_F4 _XMM4
+# define JIT_FTMP _XMM5
+# define JIT_VF0 _XMM6
+# define JIT_VF1 _XMM7
+# define JIT_VF2 _XMM8
+# define JIT_VF3 _XMM9
+# define JIT_VF4 _XMM10
+# define JIT_VF5 _XMM11
+# define JIT_VF6 _XMM12
+# define JIT_VF7 _XMM13
+# define JIT_VF8 _XMM14
+# define JIT_VF9 _XMM15
+#else
+# define JIT_R0 _RAX
+# define JIT_R1 _RCX
+# define JIT_R2 _RDX
+# define JIT_R3 _RSI
+# define JIT_R4 _RDI
+# define JIT_R5 _R8
+# define JIT_R6 _R9
+# define JIT_R7 _R10
+# define JIT_RTMP _R11
+# define JIT_V0 _RBX
+# define JIT_V1 _R12
+# define JIT_V2 _R13
+# define JIT_V3 _R14
+# define JIT_V4 _R15
+# define JIT_F0 _XMM0
+# define JIT_F1 _XMM1
+# define JIT_F2 _XMM2
+# define JIT_F3 _XMM3
+# define JIT_F4 _XMM4
+# define JIT_F5 _XMM5
+# define JIT_F6 _XMM6
+# define JIT_F7 _XMM7
+# define JIT_F8 _XMM8
+# define JIT_F9 _XMM9
+# define JIT_F10 _XMM10
+# define JIT_F11 _XMM11
+# define JIT_F12 _XMM12
+# define JIT_F13 _XMM13
+# define JIT_F14 _XMM14
+# define JIT_FTMP _XMM15
#endif
-# define JIT_NOREG _NOREG
- _NOREG,
-} jit_reg_t;
typedef struct {
/* x87 present */
diff --git a/libguile/lightening/tests/call_10.c b/libguile/lightening/tests/call_10.c
new file mode 100644
index 000000000..9c3c94358
--- /dev/null
+++ b/libguile/lightening/tests/call_10.c
@@ -0,0 +1,52 @@
+#include "test.h"
+
+static int32_t f(int32_t a, int32_t b, int32_t c, int32_t d, int32_t e,
+ int32_t f, int32_t g, int32_t h, int32_t i, int32_t j) {
+ ASSERT(a == 0);
+ ASSERT(b == 1);
+ ASSERT(c == 2);
+ ASSERT(d == 3);
+ ASSERT(e == 4);
+ ASSERT(f == 5);
+ ASSERT(g == 6);
+ ASSERT(h == 7);
+ ASSERT(i == 8);
+ ASSERT(j == 9);
+ return 42;
+}
+
+static void
+run_test(jit_state_t *j, uint8_t *arena_base, size_t arena_size)
+{
+ jit_begin(j, arena_base, arena_size);
+ jit_load_args_1(j, jit_operand_gpr (JIT_OPERAND_ABI_POINTER, JIT_R0));
+
+ jit_operand_t args[10] = {
+ jit_operand_mem(JIT_OPERAND_ABI_INT32, JIT_R0, 0 * sizeof(int32_t)),
+ jit_operand_mem(JIT_OPERAND_ABI_INT32, JIT_R0, 1 * sizeof(int32_t)),
+ jit_operand_mem(JIT_OPERAND_ABI_INT32, JIT_R0, 2 * sizeof(int32_t)),
+ jit_operand_mem(JIT_OPERAND_ABI_INT32, JIT_R0, 3 * sizeof(int32_t)),
+ jit_operand_mem(JIT_OPERAND_ABI_INT32, JIT_R0, 4 * sizeof(int32_t)),
+ jit_operand_mem(JIT_OPERAND_ABI_INT32, JIT_R0, 5 * sizeof(int32_t)),
+ jit_operand_mem(JIT_OPERAND_ABI_INT32, JIT_R0, 6 * sizeof(int32_t)),
+ jit_operand_mem(JIT_OPERAND_ABI_INT32, JIT_R0, 7 * sizeof(int32_t)),
+ jit_operand_mem(JIT_OPERAND_ABI_INT32, JIT_R0, 8 * sizeof(int32_t)),
+ jit_operand_mem(JIT_OPERAND_ABI_INT32, JIT_R0, 9 * sizeof(int32_t))
+ };
+ jit_calli(j, f, 10, args);
+ jit_ret(j);
+
+ size_t size = 0;
+ void* ret = jit_end(j, &size);
+
+ int32_t (*f)(int32_t*) = ret;
+
+ int32_t iargs[10] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
+ ASSERT(f(iargs) == 42);
+}
+
+int
+main (int argc, char *argv[])
+{
+ return main_helper(argc, argv, run_test);
+}