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

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.
This commit is contained in:
Andy Wingo 2019-04-26 16:37:24 +02:00
parent 24950994ef
commit 9906cd5f84
2 changed files with 19 additions and 132 deletions

View file

@ -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);
}
static inline void
iw(jit_state_t *_jit, jit_word_t l)
{
#if __X64
static inline void
il(jit_state_t *_jit, uint64_t l)
{
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)
{

View file

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