1
Fork 0
mirror of https://git.savannah.gnu.org/git/guile.git synced 2025-05-01 04:10:18 +02:00

Simplify register representation

Instead of JIT_R0 being a wrapped index into a table which then gives
the regno and class, just have JIT_R0 be the wrapped regno and class.
This commit is contained in:
Andy Wingo 2019-04-25 17:03:46 +02:00
parent b34e230413
commit ddd66a2f34
6 changed files with 206 additions and 342 deletions

View file

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

View file

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

View file

@ -272,9 +272,9 @@ get_temp_gpr(jit_state_t *_jit)
_jit->temp_gpr_saved = 1;
#if __X32
pushr(_jit, _RBP_REGNO);
return JIT_GPR(_RBP);
return _RBP;
#else
return JIT_GPR(_R8);
return _R8;
#endif
}

View file

@ -193,7 +193,7 @@ 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 _XMM7;
}
static void

View file

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

View file

@ -44,129 +44,161 @@
# 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_F7 _XMM6
#elif __CYGWIN__
# define JIT_R0 _RAX
# define JIT_R1 _R10
# define JIT_R2 _R11
# define JIT_V0 _RBX
# define JIT_V1 _RDI
# define JIT_V2 _RSI
# 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_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_F15 _XMM15
#else
# define JIT_R0 _RAX
# define JIT_R1 _R10
# define JIT_R2 _R11
# define JIT_R3 _R12
# define JIT_V0 _RBX
# define JIT_V1 _R13
# define JIT_V2 _R14
# define JIT_V3 _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_F15 _XMM15
#endif
# define JIT_NOREG _NOREG
_NOREG,
} jit_reg_t;
typedef struct {
/* x87 present */