diff options
author | Andy Wingo <wingo@igalia.com> | 2019-04-25 23:22:44 +0200 |
---|---|---|
committer | Andy Wingo <wingo@igalia.com> | 2019-04-25 23:22:44 +0200 |
commit | e29977a82bb1bdfd040a8143276df521a69b9a6f (patch) | |
tree | 1926759839258e8d0c8ef732f124780d40d76e6a | |
parent | 2602f17fb4e472b5a89af026fe00bffe662f1d43 (diff) | |
download | guile-e29977a82bb1bdfd040a8143276df521a69b9a6f.tar.gz |
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.
-rw-r--r-- | lightening.h | 48 | ||||
-rw-r--r-- | lightening/x86.h | 142 |
2 files changed, 80 insertions, 110 deletions
diff --git a/lightening.h b/lightening.h index e8e097ad1..d5a96fa8b 100644 --- a/lightening.h +++ b/lightening.h @@ -43,44 +43,26 @@ typedef ptrdiff_t jit_off_t; typedef intptr_t jit_imm_t; typedef uintptr_t jit_uimm_t; -typedef struct jit_gpr { uint8_t bits; } jit_gpr_t; -typedef struct jit_fpr { uint8_t bits; } jit_fpr_t; - -enum jit_register_flags -{ - JIT_REGISTER_CALLEE_SAVE = 0x40 -}; +typedef struct jit_gpr { uint8_t regno; } jit_gpr_t; +typedef struct jit_fpr { uint8_t regno; } jit_fpr_t; // Precondition: regno between 0 and 63, inclusive. #define JIT_GPR(regno) ((jit_gpr_t) { regno }) #define JIT_FPR(regno) ((jit_fpr_t) { regno }) -#define JIT_CALLEE_SAVE_GPR(regno) \ - ((jit_gpr_t) { (regno) | JIT_REGISTER_CALLEE_SAVE }) -#define JIT_CALLEE_SAVE_FPR(regno) \ - ((jit_fpr_t) { (regno) | JIT_REGISTER_CALLEE_SAVE }) -static inline jit_bool_t -jit_gpr_is_callee_save (jit_gpr_t reg) -{ - return reg.bits & JIT_REGISTER_CALLEE_SAVE; -} +static inline uint8_t jit_gpr_regno (jit_gpr_t reg) { return reg.regno; } +static inline uint8_t jit_fpr_regno (jit_fpr_t reg) { return reg.regno; } static inline jit_bool_t -jit_fpr_is_callee_save (jit_fpr_t reg) -{ - return reg.bits & JIT_REGISTER_CALLEE_SAVE; -} - -static inline uint8_t -jit_gpr_regno (jit_gpr_t reg) +jit_same_gprs (jit_gpr_t a, jit_gpr_t b) { - return reg.bits & 0x3f; + return jit_gpr_regno (a) == jit_gpr_regno (b); } -static inline uint8_t -jit_fpr_regno (jit_fpr_t reg) +static inline jit_bool_t +jit_same_fprs (jit_fpr_t a, jit_fpr_t b) { - return reg.bits & 0x3f; + return jit_fpr_regno (a) == jit_fpr_regno (b); } enum jit_reloc_kind @@ -128,18 +110,6 @@ typedef struct jit_reloc # include "lightening/alpha.h" #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; enum jit_operand_abi diff --git a/lightening/x86.h b/lightening/x86.h index 47a8750d5..de47df8a9 100644 --- a/lightening/x86.h +++ b/lightening/x86.h @@ -44,81 +44,33 @@ # define __X32 0 #endif -#if __X32 -# 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_CALLEE_SAVE_GPR(6) -# define _RDI JIT_CALLEE_SAVE_GPR(7) -# 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_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 _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_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 _RAX JIT_GPR(0) +#define _RCX JIT_GPR(1) +#define _RDX JIT_GPR(2) +#define _RBX JIT_GPR(3) +#define _RSP JIT_GPR(4) +#define _RBP JIT_GPR(5) +#define _RSI JIT_GPR(6) +#define _RDI JIT_GPR(7) + +#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) + +#if __X64 # 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 _R12 JIT_GPR(12) +# define _R13 JIT_GPR(13) +# define _R14 JIT_GPR(14) +# define _R15 JIT_GPR(15) # define _XMM8 JIT_FPR(8) # define _XMM9 JIT_FPR(9) # define _XMM10 JIT_FPR(10) @@ -129,6 +81,54 @@ # define _XMM15 JIT_FPR(15) #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_FP _RBP #if __X32 |