1
Fork 0
mirror of https://git.savannah.gnu.org/git/guile.git synced 2025-06-06 04:00:26 +02:00

Simplify register representation even more

The register structures just contain the regno.  Since the only flag is
the callee-save flag, we can punt that to a separate per-backend,
per-target predicate.
This commit is contained in:
Andy Wingo 2019-04-25 23:22:44 +02:00
parent 2602f17fb4
commit e29977a82b
2 changed files with 80 additions and 110 deletions

View file

@ -43,44 +43,26 @@ typedef ptrdiff_t jit_off_t;
typedef intptr_t jit_imm_t; typedef intptr_t jit_imm_t;
typedef uintptr_t jit_uimm_t; typedef uintptr_t jit_uimm_t;
typedef struct jit_gpr { uint8_t bits; } jit_gpr_t; typedef struct jit_gpr { uint8_t regno; } jit_gpr_t;
typedef struct jit_fpr { uint8_t bits; } jit_fpr_t; typedef struct jit_fpr { uint8_t regno; } jit_fpr_t;
enum jit_register_flags
{
JIT_REGISTER_CALLEE_SAVE = 0x40
};
// Precondition: regno between 0 and 63, inclusive. // Precondition: regno between 0 and 63, inclusive.
#define JIT_GPR(regno) ((jit_gpr_t) { regno }) #define JIT_GPR(regno) ((jit_gpr_t) { regno })
#define JIT_FPR(regno) ((jit_fpr_t) { regno }) #define JIT_FPR(regno) ((jit_fpr_t) { regno })
#define JIT_CALLEE_SAVE_GPR(regno) \
((jit_gpr_t) { (regno) | JIT_REGISTER_CALLEE_SAVE }) static inline uint8_t jit_gpr_regno (jit_gpr_t reg) { return reg.regno; }
#define JIT_CALLEE_SAVE_FPR(regno) \ static inline uint8_t jit_fpr_regno (jit_fpr_t reg) { return reg.regno; }
((jit_fpr_t) { (regno) | JIT_REGISTER_CALLEE_SAVE })
static inline jit_bool_t static inline jit_bool_t
jit_gpr_is_callee_save (jit_gpr_t reg) jit_same_gprs (jit_gpr_t a, jit_gpr_t b)
{ {
return reg.bits & JIT_REGISTER_CALLEE_SAVE; return jit_gpr_regno (a) == jit_gpr_regno (b);
} }
static inline jit_bool_t static inline jit_bool_t
jit_fpr_is_callee_save (jit_fpr_t reg) jit_same_fprs (jit_fpr_t a, jit_fpr_t b)
{ {
return reg.bits & JIT_REGISTER_CALLEE_SAVE; return jit_fpr_regno (a) == jit_fpr_regno (b);
}
static inline uint8_t
jit_gpr_regno (jit_gpr_t reg)
{
return reg.bits & 0x3f;
}
static inline uint8_t
jit_fpr_regno (jit_fpr_t reg)
{
return reg.bits & 0x3f;
} }
enum jit_reloc_kind enum jit_reloc_kind
@ -128,18 +110,6 @@ typedef struct jit_reloc
# include "lightening/alpha.h" # include "lightening/alpha.h"
#endif #endif
static inline jit_bool_t
jit_same_gprs (jit_gpr_t a, jit_gpr_t b)
{
return a.bits == b.bits;
}
static inline jit_bool_t
jit_same_fprs (jit_fpr_t a, jit_fpr_t b)
{
return a.bits == b.bits;
}
typedef struct jit_state jit_state_t; typedef struct jit_state jit_state_t;
enum jit_operand_abi enum jit_operand_abi

View file

@ -44,81 +44,33 @@
# define __X32 0 # define __X32 0
#endif #endif
#if __X32 #define _RAX JIT_GPR(0)
# define _RAX JIT_GPR(0) #define _RCX JIT_GPR(1)
# define _RCX JIT_GPR(1) #define _RDX JIT_GPR(2)
# define _RDX JIT_GPR(2) #define _RBX JIT_GPR(3)
# define _RBX JIT_CALLEE_SAVE_GPR(3) #define _RSP JIT_GPR(4)
# define _RSP JIT_CALLEE_SAVE_GPR(4) #define _RBP JIT_GPR(5)
# define _RBP JIT_CALLEE_SAVE_GPR(5) #define _RSI JIT_GPR(6)
# define _RSI JIT_CALLEE_SAVE_GPR(6) #define _RDI JIT_GPR(7)
# define _RDI JIT_CALLEE_SAVE_GPR(7)
# define _XMM0 JIT_FPR(0) #define _XMM0 JIT_FPR(0)
# define _XMM1 JIT_FPR(1) #define _XMM1 JIT_FPR(1)
# define _XMM2 JIT_FPR(2) #define _XMM2 JIT_FPR(2)
# define _XMM3 JIT_FPR(3) #define _XMM3 JIT_FPR(3)
# define _XMM4 JIT_FPR(4) #define _XMM4 JIT_FPR(4)
# define _XMM5 JIT_FPR(5) #define _XMM5 JIT_FPR(5)
# define _XMM6 JIT_FPR(6) #define _XMM6 JIT_FPR(6)
# define _XMM7 JIT_FPR(7) #define _XMM7 JIT_FPR(7)
#elif __CYGWIN__
# define _RAX JIT_GPR(0) #if __X64
# define _RCX JIT_GPR(1)
# define _RDX JIT_GPR(2)
# define _RBX JIT_CALLEE_SAVE_GPR(3)
# define _RSP JIT_CALLEE_SAVE_GPR(4)
# define _RBP JIT_CALLEE_SAVE_GPR(5)
# define _RSI JIT_CALLEE_SAVE_GPR(6)
# define _RDI JIT_CALLEE_SAVE_GPR(7)
# define _R8 JIT_GPR(8) # define _R8 JIT_GPR(8)
# define _R9 JIT_GPR(9) # define _R9 JIT_GPR(9)
# define _R10 JIT_GPR(10) # define _R10 JIT_GPR(10)
# define _R11 JIT_GPR(11) # define _R11 JIT_GPR(11)
# define _R12 JIT_CALLEE_SAVE_GPR(12) # define _R12 JIT_GPR(12)
# define _R13 JIT_CALLEE_SAVE_GPR(13) # define _R13 JIT_GPR(13)
# define _R14 JIT_CALLEE_SAVE_GPR(14) # define _R14 JIT_GPR(14)
# define _R15 JIT_CALLEE_SAVE_GPR(15) # define _R15 JIT_GPR(15)
# 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_CALLEE_SAVE_FPR(6)
# define _XMM7 JIT_CALLEE_SAVE_FPR(7)
# define _XMM8 JIT_CALLEE_SAVE_FPR(8)
# define _XMM9 JIT_CALLEE_SAVE_FPR(9)
# define _XMM10 JIT_CALLEE_SAVE_FPR(10)
# define _XMM11 JIT_CALLEE_SAVE_FPR(11)
# define _XMM12 JIT_CALLEE_SAVE_FPR(12)
# define _XMM13 JIT_CALLEE_SAVE_FPR(13)
# define _XMM14 JIT_CALLEE_SAVE_FPR(14)
# define _XMM15 JIT_CALLEE_SAVE_FPR(15)
#else
# define _RAX JIT_GPR(0)
# define _RCX JIT_GPR(1)
# define _RDX JIT_GPR(2)
# define _RBX JIT_CALLEE_SAVE_GPR(3)
# define _RSP JIT_CALLEE_SAVE_GPR(4)
# define _RBP JIT_CALLEE_SAVE_GPR(5)
# 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_CALLEE_SAVE_GPR(12)
# define _R13 JIT_CALLEE_SAVE_GPR(13)
# define _R14 JIT_CALLEE_SAVE_GPR(14)
# define _R15 JIT_CALLEE_SAVE_GPR(15)
# 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 _XMM8 JIT_FPR(8)
# define _XMM9 JIT_FPR(9) # define _XMM9 JIT_FPR(9)
# define _XMM10 JIT_FPR(10) # define _XMM10 JIT_FPR(10)
@ -129,6 +81,54 @@
# define _XMM15 JIT_FPR(15) # define _XMM15 JIT_FPR(15)
#endif #endif
static inline jit_bool_t
jit_gpr_is_callee_save (jit_gpr_t reg)
{
#if __X32
return jit_same_gprs (reg, _RBX) ||
jit_same_gprs (reg, _RBP) ||
jit_same_gprs (reg, _RSI) ||
jit_same_gprs (reg, _RDI);
#elif __CYGWIN__
return jit_same_gprs (reg, _RBX) ||
jit_same_gprs (reg, _RBP) ||
jit_same_gprs (reg, _RSI) ||
jit_same_gprs (reg, _RDI) ||
jit_same_gprs (reg, _R12) ||
jit_same_gprs (reg, _R13) ||
jit_same_gprs (reg, _R14) ||
jit_same_gprs (reg, _R15);
#else
return jit_same_gprs (reg, _RBX) ||
jit_same_gprs (reg, _RBP) ||
jit_same_gprs (reg, _R12) ||
jit_same_gprs (reg, _R13) ||
jit_same_gprs (reg, _R14) ||
jit_same_gprs (reg, _R15);
#endif
}
static inline jit_bool_t
jit_fpr_is_callee_save (jit_fpr_t reg)
{
#if __X32
return 0;
#elif __CYGWIN__
return jit_same_fprs (reg, _XMM6) ||
jit_same_fprs (reg, _XMM7) ||
jit_same_fprs (reg, _XMM8) ||
jit_same_fprs (reg, _XMM9) ||
jit_same_fprs (reg, _XMM10) ||
jit_same_fprs (reg, _XMM11) ||
jit_same_fprs (reg, _XMM12) ||
jit_same_fprs (reg, _XMM13) ||
jit_same_fprs (reg, _XMM14) ||
jit_same_fprs (reg, _XMM15);
#else
return 0;
#endif
}
#define JIT_SP _RSP #define JIT_SP _RSP
#define JIT_FP _RBP #define JIT_FP _RBP
#if __X32 #if __X32