[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Guile-commits] 09/20: Remove most __X64_32 code
From: |
Andy Wingo |
Subject: |
[Guile-commits] 09/20: Remove most __X64_32 code |
Date: |
Sun, 28 Apr 2019 07:54:20 -0400 (EDT) |
wingo pushed a commit to branch lightening
in repository guile.
commit 9906cd5f84e3ccab6aba9a91cebe2035918f5672
Author: Andy Wingo <address@hidden>
Date: Fri Apr 26 16:37:24 2019 +0200
Remove most __X64_32 code
The x32 ABI (i.e., amd64 with 32-bit pointers) is mostly a C language
question. From a JIT perspective it mostly looks just like amd64. We
can fix any differences in a followup, but x32 is also a pretty dead
ABI, so I feel OK with this.
---
lightening/x86-cpu.c | 81 ++++++++--------------------------------------------
lightening/x86-sse.c | 68 ++++---------------------------------------
2 files changed, 18 insertions(+), 131 deletions(-)
diff --git a/lightening/x86-cpu.c b/lightening/x86-cpu.c
index b32c850..537e331 100644
--- a/lightening/x86-cpu.c
+++ b/lightening/x86-cpu.c
@@ -20,7 +20,7 @@
/* avoid using it due to partial stalls */
#define USE_INC_DEC 0
-#if __X32 || __X64_32
+#if __X32
# define WIDE 0
# define IF_WIDE(wide, narrow) narrow
#else
@@ -46,7 +46,7 @@
#define _R15_REGNO 15
#define r7(reg) ((reg) & 7)
#define r8(reg) ((reg) & 15)
-#if __X32 || __CYGWIN__ || __X64_32
+#if __X32
# define reg8_p(rn) ((rn) >= _RAX_REGNO && (rn) <= _RBX_REGNO)
#else
# define reg8_p(rn) 1
@@ -160,15 +160,13 @@ ii(jit_state_t *_jit, uint32_t i)
emit_u32(_jit, i);
}
+#if __X64
static inline void
-iw(jit_state_t *_jit, jit_word_t l)
+il(jit_state_t *_jit, uint64_t l)
{
-#if __X64
emit_u64(_jit, l);
-#else
- ii(_jit, l);
-#endif
}
+#endif
static void
rex(jit_state_t *_jit, int32_t l, int32_t w,
@@ -417,7 +415,7 @@ imovi(jit_state_t *_jit, int32_t r0, jit_word_t i0)
} else {
rex(_jit, 0, 1, _NOREG, _NOREG, r0);
ic(_jit, 0xb8 | r7(r0));
- iw(_jit, i0);
+ il(_jit, i0);
}
#else
ic(_jit, 0xb8 | r7(r0));
@@ -1490,7 +1488,7 @@ extr_us(jit_state_t *_jit, int32_t r0, int32_t r1)
return movsr_u(_jit, r0, r1);
}
-#if __X64 && !__X64_32
+#if __X64
static void
extr_i(jit_state_t *_jit, int32_t r0, int32_t r1)
{
@@ -1523,7 +1521,7 @@ bswapr_ui(jit_state_t *_jit, int32_t r0, int32_t r1)
ic(_jit, 0xc8 | r7(r0));
}
-#if __X64 && !__X64_32
+#if __X64
static void
bswapr_ul(jit_state_t *_jit, int32_t r0, int32_t r1)
{
@@ -1634,7 +1632,6 @@ ldi_us(jit_state_t *_jit, int32_t r0, jit_word_t i0)
}
}
-#if __X32 || !__X64_32
static void
ldr_i(jit_state_t *_jit, int32_t r0, int32_t r1)
{
@@ -1665,7 +1662,6 @@ ldi_i(jit_state_t *_jit, int32_t r0, jit_word_t i0)
unget_temp_gpr(_jit);
}
}
-#endif
#if __X64
static void
@@ -1691,7 +1687,6 @@ ldi_ui(jit_state_t *_jit, int32_t r0, jit_word_t i0)
}
}
-# if !__X64_32
static void
ldr_l(jit_state_t *_jit, int32_t r0, int32_t r1)
{
@@ -1714,21 +1709,15 @@ ldi_l(jit_state_t *_jit, int32_t r0, jit_word_t i0)
unget_temp_gpr(_jit);
}
}
-# endif
#endif
static void
ldxr_c(jit_state_t *_jit, int32_t r0, int32_t r1, int32_t r2)
{
-#if __X64_32
- addr(_jit, r0, r1, r2);
- ldr_c(r0, r0);
-#else
rex(_jit, 0, WIDE, r0, r1, r2);
ic(_jit, 0x0f);
ic(_jit, 0xbe);
rx(_jit, r0, 0, r2, r1, _SCL1);
-#endif
}
static void
@@ -1750,15 +1739,10 @@ ldxi_c(jit_state_t *_jit, int32_t r0, int32_t r1,
jit_word_t i0)
static void
ldxr_uc(jit_state_t *_jit, int32_t r0, int32_t r1, int32_t r2)
{
-#if __X64_32
- addr(_jit, r0, r1, r2);
- ldr_uc(_jit, r0, r0);
-#else
rex(_jit, 0, WIDE, r0, r1, r2);
ic(_jit, 0x0f);
ic(_jit, 0xb6);
rx(_jit, r0, 0, r2, r1, _SCL1);
-#endif
}
static void
@@ -1780,15 +1764,10 @@ ldxi_uc(jit_state_t *_jit, int32_t r0, int32_t r1,
jit_word_t i0)
static void
ldxr_s(jit_state_t *_jit, int32_t r0, int32_t r1, int32_t r2)
{
-#if __X64_32
- addr(_jit, r0, r1, r2);
- ldr_s(_jit, r0, r0);
-#else
rex(_jit, 0, WIDE, r0, r1, r2);
ic(_jit, 0x0f);
ic(_jit, 0xbf);
rx(_jit, r0, 0, r2, r1, _SCL1);
-#endif
}
static void
@@ -1810,15 +1789,10 @@ ldxi_s(jit_state_t *_jit, int32_t r0, int32_t r1,
jit_word_t i0)
static void
ldxr_us(jit_state_t *_jit, int32_t r0, int32_t r1, int32_t r2)
{
-#if __X64_32
- addr(_jit, r0, r1, r2);
- ldr_us(_jit, r0, r0);
-#else
rex(_jit, 0, WIDE, r0, r1, r2);
ic(_jit, 0x0f);
ic(_jit, 0xb7);
rx(_jit, r0, 0, r2, r1, _SCL1);
-#endif
}
static void
@@ -1837,7 +1811,6 @@ ldxi_us(jit_state_t *_jit, int32_t r0, int32_t r1,
jit_word_t i0)
}
}
-#if __X64 || !__X64_32
static void
ldxr_i(jit_state_t *_jit, int32_t r0, int32_t r1, int32_t r2)
{
@@ -1868,21 +1841,14 @@ ldxi_i(jit_state_t *_jit, int32_t r0, int32_t r1,
jit_word_t i0)
unget_temp_gpr(_jit);
}
}
-#endif
#if __X64
static void
ldxr_ui(jit_state_t *_jit, int32_t r0, int32_t r1, int32_t r2)
{
-#if __X64_32
- addr(_jit, r0, r1, r2);
- /* to avoid confusion with macro renames */
- _ldr_ui(_jit, r0, r0);
-#else
rex(_jit, 0, 0, r0, r1, r2);
ic(_jit, 0x8b);
rx(_jit, r0, 0, r2, r1, _SCL1);
-#endif
}
static void
@@ -1900,7 +1866,6 @@ ldxi_ui(jit_state_t *_jit, int32_t r0, int32_t r1,
jit_word_t i0)
}
}
-# if !__X64_32
static void
ldxr_l(jit_state_t *_jit, int32_t r0, int32_t r1, int32_t r2)
{
@@ -1923,7 +1888,6 @@ ldxi_l(jit_state_t *_jit, int32_t r0, int32_t r1,
jit_word_t i0)
unget_temp_gpr(_jit);
}
}
-# endif
#endif
static void
@@ -2015,7 +1979,7 @@ sti_i(jit_state_t *_jit, jit_word_t i0, int32_t r0)
}
}
-#if __X64 && !__X64_32
+#if __X64
static void
str_l(jit_state_t *_jit, int32_t r0, int32_t r1)
{
@@ -2043,12 +2007,6 @@ sti_l(jit_state_t *_jit, jit_word_t i0, int32_t r0)
static void
stxr_c(jit_state_t *_jit, int32_t r0, int32_t r1, int32_t r2)
{
-#if __X64_32
- jit_gpr_t reg = get_temp_gpr(_jit);
- addr(_jit, jit_gpr_regno(reg), r0, r1);
- str_c(_jit, jit_gpr_regno(reg), r2);
- unget_temp_gpr(_jit);
-#else
if (reg8_p(r2)) {
rex(_jit, 0, 0, r2, r1, r0);
ic(_jit, 0x88);
@@ -2061,7 +2019,6 @@ stxr_c(jit_state_t *_jit, int32_t r0, int32_t r1, int32_t
r2)
rx(_jit, jit_gpr_regno(reg), 0, r0, r1, _SCL1);
unget_temp_gpr(_jit);
}
-#endif
}
static void
@@ -2091,17 +2048,10 @@ stxi_c(jit_state_t *_jit, jit_word_t i0, int32_t r0,
int32_t r1)
static void
stxr_s(jit_state_t *_jit, int32_t r0, int32_t r1, int32_t r2)
{
-#if __X64_32
- jit_gpr_t reg = get_temp_gpr(_jit);
- addr(_jit, jit_gpr_regno(reg), r0, r1);
- str_s(_jit, jit_gpr_regno(reg), r2);
- unget_temp_gpr(_jit);
-#else
ic(_jit, 0x66);
rex(_jit, 0, 0, r2, r1, r0);
ic(_jit, 0x89);
rx(_jit, r2, 0, r0, r1, _SCL1);
-#endif
}
static void
@@ -2123,16 +2073,9 @@ stxi_s(jit_state_t *_jit, jit_word_t i0, int32_t r0,
int32_t r1)
static void
stxr_i(jit_state_t *_jit, int32_t r0, int32_t r1, int32_t r2)
{
-#if __X64_32
- jit_gpr_t reg = get_temp_gpr(_jit);
- addr(_jit, jit_gpr_regno(reg), r0, r1);
- str_i(jit_gpr_regno(reg), r2);
- unget_temp_gpr(_jit);
-#else
rex(_jit, 0, 0, r2, r1, r0);
ic(_jit, 0x89);
rx(_jit, r2, 0, r0, r1, _SCL1);
-#endif
}
static void
@@ -2150,7 +2093,7 @@ stxi_i(jit_state_t *_jit, jit_word_t i0, int32_t r0,
int32_t r1)
}
}
-#if __X64 && !__X64_32
+#if __X64
static void
stxr_l(jit_state_t *_jit, int32_t r0, int32_t r1, int32_t r2)
{
@@ -2684,14 +2627,14 @@ retval_us(jit_state_t *_jit, int32_t r0)
static void
retval_i(jit_state_t *_jit, int32_t r0)
{
-#if __X32 || __X64_32
+#if __X32
movr(_jit, r0, _RAX_REGNO);
#else
extr_i(_jit, r0, _RAX_REGNO);
#endif
}
-#if __X64 && !__X64_32
+#if __X64
static void
retval_ui(jit_state_t *_jit, int32_t r0)
{
diff --git a/lightening/x86-sse.c b/lightening/x86-sse.c
index 34a39e8..3aca97f 100644
--- a/lightening/x86-sse.c
+++ b/lightening/x86-sse.c
@@ -101,7 +101,7 @@ ssexi(jit_state_t *_jit, int32_t c, int32_t r0,
static void
sselxr(jit_state_t *_jit, int32_t p, int32_t c, int32_t r0, int32_t r1)
{
- if (__X64 && !__X64_32) {
+ if (__X64) {
ic(_jit, p);
rex(_jit, 0, 1, r0, 0, r1);
ic(_jit, 0x0f);
@@ -404,7 +404,7 @@ movi_d(jit_state_t *_jit, int32_t r0, jit_float64_t i0)
xorpdr(_jit, r0, r0);
else {
jit_gpr_t ireg = get_temp_gpr(_jit);
-#if __X64 && !__X64_32
+#if __X64
movi(_jit, jit_gpr_regno(ireg), data.w);
movdqxr(_jit, r0, jit_gpr_regno(ireg));
unget_temp_gpr(_jit);
@@ -705,18 +705,10 @@ negr_d(jit_state_t *_jit, int32_t r0, int32_t r1)
unget_temp_gpr(_jit);
}
-#if __X32
-# define sse_address_p(i0) 1
-#elif __X64_32
-# define sse_address_p(i0) ((jit_word_t)(i0) >= 0)
-# else
-# define sse_address_p(i0) can_sign_extend_int_p(i0)
-#endif
-
static void
ldi_f(jit_state_t *_jit, int32_t r0, jit_word_t i0)
{
- if (sse_address_p(i0))
+ if (can_sign_extend_int_p(i0))
movssmr(_jit, i0, _NOREG, _NOREG, _SCL1, r0);
else {
jit_gpr_t reg = get_temp_gpr(_jit);
@@ -729,14 +721,7 @@ ldi_f(jit_state_t *_jit, int32_t r0, jit_word_t i0)
static void
ldxr_f(jit_state_t *_jit, int32_t r0, int32_t r1, int32_t r2)
{
-#if __X64_32
- jit_gpr_t reg = get_temp_gpr(_jit);
- addr(_jit, jit_gpr_regno(reg), r1, r2);
- ldr_f(_jit, r0, jit_gpr_regno(reg));
- unget_temp_gpr(_jit);
-#else
movssmr(_jit, 0, r1, r2, _SCL1, r0);
-#endif
}
static void
@@ -746,13 +731,8 @@ ldxi_f(jit_state_t *_jit, int32_t r0, int32_t r1,
jit_word_t i0)
movssmr(_jit, i0, r1, _NOREG, _SCL1, r0);
else {
jit_gpr_t reg = get_temp_gpr(_jit);
-#if __X64_32
- addi(jit_gpr_regno(reg), r1, i0);
- ldr_f(_jit, r0, jit_gpr_regno(reg));
-#else
movi(_jit, jit_gpr_regno(reg), i0);
ldxr_f(_jit, r0, r1, jit_gpr_regno(reg));
-#endif
unget_temp_gpr(_jit);
}
}
@@ -760,7 +740,7 @@ ldxi_f(jit_state_t *_jit, int32_t r0, int32_t r1,
jit_word_t i0)
static void
sti_f(jit_state_t *_jit, jit_word_t i0, int32_t r0)
{
- if (sse_address_p(i0))
+ if (can_sign_extend_int_p(i0))
movssrm(_jit, r0, i0, _NOREG, _NOREG, _SCL1);
else {
jit_gpr_t reg = get_temp_gpr(_jit);
@@ -773,14 +753,7 @@ sti_f(jit_state_t *_jit, jit_word_t i0, int32_t r0)
static void
stxr_f(jit_state_t *_jit, int32_t r0, int32_t r1, int32_t r2)
{
-#if __X64_32
- jit_gpr_t reg = get_temp_gpr(_jit);
- addr(_jit, jit_gpr_regno(reg), r0, r1);
- str_f(_jit, jit_gpr_regno(reg), r2);
- unget_temp_gpr(_jit);
-#else
movssrm(_jit, r2, 0, r0, r1, _SCL1);
-#endif
}
static void
@@ -790,13 +763,8 @@ stxi_f(jit_state_t *_jit, jit_word_t i0, int32_t r0,
int32_t r1)
movssrm(_jit, r1, i0, r0, _NOREG, _SCL1);
else {
jit_gpr_t reg = get_temp_gpr(_jit);
-#if __X64_32
- addi(jit_gpr_regno(reg), r0, i0);
- str_f(_jit, jit_gpr_regno(reg), r1);
-#else
movi(_jit, jit_gpr_regno(reg), i0);
stxr_f(_jit, jit_gpr_regno(reg), r0, r1);
-#endif
unget_temp_gpr(_jit);
}
}
@@ -910,7 +878,7 @@ bunordr_f(jit_state_t *_jit, int32_t r0, int32_t r1)
static void
ldi_d(jit_state_t *_jit, int32_t r0, jit_word_t i0)
{
- if (sse_address_p(i0))
+ if (can_sign_extend_int_p(i0))
movsdmr(_jit, i0, _NOREG, _NOREG, _SCL1, r0);
else {
jit_gpr_t reg = get_temp_gpr(_jit);
@@ -923,14 +891,7 @@ ldi_d(jit_state_t *_jit, int32_t r0, jit_word_t i0)
static void
ldxr_d(jit_state_t *_jit, int32_t r0, int32_t r1, int32_t r2)
{
-#if __X64_32
- jit_gpr_t reg = get_temp_gpr(_jit);
- addr(_jit, jit_gpr_regno(reg), r1, r2);
- ldr_d(_jit, r0, jit_gpr_regno(reg));
- unget_temp_gpr(_jit);
-#else
movsdmr(_jit, 0, r1, r2, _SCL1, r0);
-#endif
}
static void
@@ -940,13 +901,8 @@ ldxi_d(jit_state_t *_jit, int32_t r0, int32_t r1,
jit_word_t i0)
movsdmr(_jit, i0, r1, _NOREG, _SCL1, r0);
else {
jit_gpr_t reg = get_temp_gpr(_jit);
-#if __X64_32
- addi(jit_gpr_regno(reg), r1, i0);
- ldr_d(_jit, r0, jit_gpr_regno(reg));
-#else
movi(_jit, jit_gpr_regno(reg), i0);
ldxr_d(_jit, r0, r1, jit_gpr_regno(reg));
-#endif
unget_temp_gpr(_jit);
}
}
@@ -954,7 +910,7 @@ ldxi_d(jit_state_t *_jit, int32_t r0, int32_t r1,
jit_word_t i0)
static void
sti_d(jit_state_t *_jit, jit_word_t i0, int32_t r0)
{
- if (sse_address_p(i0))
+ if (can_sign_extend_int_p(i0))
movsdrm(_jit, r0, i0, _NOREG, _NOREG, _SCL1);
else {
jit_gpr_t reg = get_temp_gpr(_jit);
@@ -967,14 +923,7 @@ sti_d(jit_state_t *_jit, jit_word_t i0, int32_t r0)
static void
stxr_d(jit_state_t *_jit, int32_t r0, int32_t r1, int32_t r2)
{
-#if __X64_32
- jit_gpr_t reg = get_temp_gpr(_jit);
- addr(_jit, jit_gpr_regno(reg), r0, r1);
- str_d(_jit, jit_gpr_regno(reg), r2);
- unget_temp_gpr(_jit);
-#else
movsdrm(_jit, r2, 0, r0, r1, _SCL1);
-#endif
}
static void
@@ -984,13 +933,8 @@ stxi_d(jit_state_t *_jit, jit_word_t i0, int32_t r0,
int32_t r1)
movsdrm(_jit, r1, i0, r0, _NOREG, _SCL1);
else {
jit_gpr_t reg = get_temp_gpr(_jit);
-#if __X64_32
- addi(jit_gpr_regno(reg), r0, i0);
- str_d(_jit, jit_gpr_regno(reg), r1);
-#else
movi(_jit, jit_gpr_regno(reg), i0);
stxr_d(_jit, jit_gpr_regno(reg), r0, r1);
-#endif
unget_temp_gpr(_jit);
}
}
- [Guile-commits] branch lightening updated (14e64a8 -> 51618e7), Andy Wingo, 2019/04/28
- [Guile-commits] 04/20: Use jit_word_t for register-sized values instead of intmax_t, Andy Wingo, 2019/04/28
- [Guile-commits] 19/20: Stack alignment takes saved return address into account, Andy Wingo, 2019/04/28
- [Guile-commits] 20/20: Merge from upstream lightening, Andy Wingo, 2019/04/28
- [Guile-commits] 18/20: Merge branch 'x86-32-ci' into 'master', Andy Wingo, 2019/04/28
- [Guile-commits] 16/20: Mark test files as precious to prevent them from being deleted by make, Andy Wingo, 2019/04/28
- [Guile-commits] 17/20: Add x86-32 tests to default test target, Andy Wingo, 2019/04/28
- [Guile-commits] 15/20: Add test for JIT callee with many args, Andy Wingo, 2019/04/28
- [Guile-commits] 14/20: Add {enter,leave}_jit_abi calls in tests, Andy Wingo, 2019/04/28
- [Guile-commits] 09/20: Remove most __X64_32 code,
Andy Wingo <=
- [Guile-commits] 10/20: Add facility to enter and leave JIT ABI, Andy Wingo, 2019/04/28
- [Guile-commits] 03/20: Fix lightening to compile on 32-bit x86, Andy Wingo, 2019/04/28
- [Guile-commits] 13/20: Fix ABI of arg to extr_d_f test, Andy Wingo, 2019/04/28
- [Guile-commits] 12/20: Fix jit_leave_jit_abi to pop correct registers, Andy Wingo, 2019/04/28
- [Guile-commits] 08/20: Simplify 64/32 concerns in x86-cpu.c, Andy Wingo, 2019/04/28
- [Guile-commits] 07/20: Make jit_cpu private, Andy Wingo, 2019/04/28
- [Guile-commits] 11/20: Small bug fixes for ia32, Andy Wingo, 2019/04/28
- [Guile-commits] 01/20: Inline some internal definitions into backend-specific files, Andy Wingo, 2019/04/28
- [Guile-commits] 02/20: Account for saved return address when locating args, Andy Wingo, 2019/04/28
- [Guile-commits] 05/20: Fix compile warnings for 32-bit tests, Andy Wingo, 2019/04/28