summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndy Wingo <wingo@igalia.com>2019-04-25 23:22:44 +0200
committerAndy Wingo <wingo@igalia.com>2019-04-25 23:22:44 +0200
commite29977a82bb1bdfd040a8143276df521a69b9a6f (patch)
tree1926759839258e8d0c8ef732f124780d40d76e6a
parent2602f17fb4e472b5a89af026fe00bffe662f1d43 (diff)
downloadguile-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.h48
-rw-r--r--lightening/x86.h142
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