1
Fork 0
mirror of https://git.savannah.gnu.org/git/guile.git synced 2025-05-20 11:40:18 +02:00

Fix lightening to compile on 32-bit x86

This commit is contained in:
Andy Wingo 2019-04-26 14:44:09 +02:00
parent 89fd69fc00
commit bab1f40b5e
5 changed files with 96 additions and 1376 deletions

View file

@ -525,21 +525,23 @@ abi_mem_to_gpr(jit_state_t *_jit, enum jit_operand_abi abi,
case JIT_OPERAND_ABI_INT16:
jit_ldxi_s(_jit, dst, base, offset);
break;
#if __WORDSIZE == 32
case JIT_OPERAND_ABI_UINT32:
jit_ldxi_ui(_jit, dst, base, offset);
break;
case JIT_OPERAND_ABI_POINTER:
#endif
case JIT_OPERAND_ABI_INT32:
jit_ldxi_i(_jit, dst, base, offset);
break;
case JIT_OPERAND_ABI_UINT64:
jit_ldxi_l(_jit, dst, base, offset);
#if __WORDSIZE == 64
case JIT_OPERAND_ABI_UINT32:
jit_ldxi_ui(_jit, dst, base, offset);
break;
case JIT_OPERAND_ABI_UINT64:
case JIT_OPERAND_ABI_POINTER:
case JIT_OPERAND_ABI_INT64:
jit_ldxi_l(_jit, dst, base, offset);
break;
case JIT_OPERAND_ABI_POINTER:
jit_ldxi_l(_jit, dst, base, offset);
break;
#endif
default:
abort();
}

View file

@ -1024,7 +1024,7 @@ ffsw(jit_word_t i)
return ffs(i);
int bit = ffs((int)i);
if (bit == 0) {
bit = ffs((int)((unsigned long)i >> 32));
bit = ffs((int)((uint64_t)i >> 32));
if (bit)
bit += 32;
}
@ -2664,34 +2664,34 @@ reti(jit_state_t *_jit, jit_word_t i0)
static void
retval_c(jit_state_t *_jit, int32_t r0)
{
extr_c(_jit, r0, jit_gpr_regno(JIT_RET));
extr_c(_jit, r0, _RAX_REGNO);
}
static void
retval_uc(jit_state_t *_jit, int32_t r0)
{
extr_uc(_jit, r0, jit_gpr_regno(JIT_RET));
extr_uc(_jit, r0, _RAX_REGNO);
}
static void
retval_s(jit_state_t *_jit, int32_t r0)
{
extr_s(_jit, r0, jit_gpr_regno(JIT_RET));
extr_s(_jit, r0, _RAX_REGNO);
}
static void
retval_us(jit_state_t *_jit, int32_t r0)
{
extr_us(_jit, r0, jit_gpr_regno(JIT_RET));
extr_us(_jit, r0, _RAX_REGNO);
}
static void
retval_i(jit_state_t *_jit, int32_t r0)
{
#if __X32 || __X64_32
movr(_jit, r0, jit_gpr_regno(JIT_RET));
movr(_jit, r0, _RAX_REGNO);
#else
extr_i(_jit, r0, jit_gpr_regno(JIT_RET));
extr_i(_jit, r0, _RAX_REGNO);
#endif
}
@ -2699,12 +2699,12 @@ retval_i(jit_state_t *_jit, int32_t r0)
static void
retval_ui(jit_state_t *_jit, int32_t r0)
{
extr_ui(_jit, r0, jit_gpr_regno(JIT_RET));
extr_ui(_jit, r0, _RAX_REGNO);
}
static void
retval_l(jit_state_t *_jit, int32_t r0)
{
movr(_jit, r0, jit_gpr_regno(JIT_RET));
movr(_jit, r0, _RAX_REGNO);
}
#endif

View file

@ -398,49 +398,111 @@ movi_d(jit_state_t *_jit, int32_t r0, jit_float64_t i0)
if (data.d == 0.0 && !(data.ii[1] & 0x80000000))
xorpdr(_jit, r0, r0);
else {
jit_gpr_t reg = get_temp_gpr(_jit);
jit_gpr_t ireg = get_temp_gpr(_jit);
#if __X64 && !__X64_32
movi(_jit, jit_gpr_regno(reg), data.w);
movdqxr(_jit, r0, jit_gpr_regno(reg));
movi(_jit, jit_gpr_regno(ireg), data.w);
movdqxr(_jit, r0, jit_gpr_regno(ireg));
unget_temp_gpr(_jit);
#else
movi(_jit, jit_gpr_regno(reg), data.ii[0]);
stxi_i(CVT_OFFSET, _RBP_REGNO, jit_gpr_regno(reg));
movi(_jit, jit_gpr_regno(reg), data.ii[1]);
stxi_i(CVT_OFFSET + 4, _RBP_REGNO, jit_gpr_regno(reg));
jit_fpr_t freg = get_temp_xpr(_jit);
movi(_jit, jit_gpr_regno(ireg), data.ii[1]);
movdlxr(_jit, jit_fpr_regno(freg), jit_gpr_regno(ireg));
pslq(_jit, jit_fpr_regno(freg), 32);
movi(_jit, jit_gpr_regno(ireg), data.ii[0]);
movdlxr(_jit, r0, jit_gpr_regno(ireg));
xorpdr(_jit, r0, jit_fpr_regno(freg));
unget_temp_xpr(_jit);
unget_temp_gpr(_jit);
ldxi_d(_jit, r0, _RBP_REGNO, CVT_OFFSET);
#endif
}
}
#if __X32
static void
x87rx(jit_state_t *_jit, int32_t code, int32_t md,
int32_t rb, int32_t ri, int32_t ms)
{
rex(_jit, 0, 1, rb, ri, _NOREG);
ic(_jit, 0xd8 | (code >> 3));
rx(_jit, (code & 7), md, rb, ri, ms);
}
static void
fldsm(jit_state_t *_jit, int32_t md, int32_t rb, int32_t ri, int32_t ms)
{
return x87rx(_jit, 010, md, rb, ri, ms);
}
static void
fstsm(jit_state_t *_jit, int32_t md, int32_t rb, int32_t ri, int32_t ms)
{
return x87rx(_jit, 012, md, rb, ri, ms);
}
static void
fldlm(jit_state_t *_jit, int32_t md, int32_t rb, int32_t ri, int32_t ms)
{
return x87rx(_jit, 050, md, rb, ri, ms);
}
static void
fstlm(jit_state_t *_jit, int32_t md, int32_t rb, int32_t ri, int32_t ms)
{
return x87rx(_jit, 052, md, rb, ri, ms);
}
#endif
static void
retval_f(jit_state_t *_jit, int32_t r0)
{
#if __X64
movr_f(_jit, r0, jit_fpr_regno(JIT_FRET));
#if __X32
subi(_jit, _RSP_REGNO, _RSP_REGNO, 4);
fstsm(_jit, 0, _RSP_REGNO, _NOREG, _SCL1);
ldr_f(_jit, r0, _RSP_REGNO);
addi(_jit, _RSP_REGNO, _RSP_REGNO, 4);
#else
movr_f(_jit, r0, _XMM0_REGNO);
#endif
}
static void
retval_d(jit_state_t *_jit, int32_t r0)
{
#if __X64
movr_d(_jit, r0, jit_fpr_regno(JIT_FRET));
#if __X32
subi(_jit, _RSP_REGNO, _RSP_REGNO, 8);
fstlm(_jit, 0, _RSP_REGNO, _NOREG, _SCL1);
ldr_d(_jit, r0, _RSP_REGNO);
addi(_jit, _RSP_REGNO, _RSP_REGNO, 8);
#else
movr_d(_jit, r0, _XMM0_REGNO);
#endif
}
static void
retr_f(jit_state_t *_jit, int32_t u)
{
movr_f(_jit, jit_fpr_regno(JIT_FRET), u);
#if __X32
subi(_jit, _RSP_REGNO, _RSP_REGNO, 4);
str_f(_jit, _RSP_REGNO, u);
fldsm(_jit, 0, _RSP_REGNO, _NOREG, _SCL1);
addi(_jit, _RSP_REGNO, _RSP_REGNO, 4);
#else
movr_f(_jit, _XMM0_REGNO, u);
#endif
ret(_jit);
}
static void
retr_d(jit_state_t *_jit, int32_t u)
{
movr_d(_jit, jit_fpr_regno(JIT_FRET), u);
#if __X32
subi(_jit, _RSP_REGNO, _RSP_REGNO, 8);
str_d(_jit, _RSP_REGNO, u);
fldlm(_jit, 0, _RSP_REGNO, _NOREG, _SCL1);
addi(_jit, _RSP_REGNO, _RSP_REGNO, 8);
#else
movr_d(_jit, _XMM0_REGNO, u);
#endif
ret(_jit);
}

File diff suppressed because it is too large Load diff

View file

@ -159,7 +159,7 @@ jit_get_cpu(void)
/* i386 or i486 without cpuid */
if ((ac & (1 << 21)) == 0)
/* probably without x87 as well */
return false;
return 0;
#endif
/* query %eax = 1 function */
@ -192,8 +192,8 @@ jit_get_cpu(void)
jit_cpu.avx = ecx.bits.avx;
/* query %eax = 0x80000001 function */
__asm__ volatile (
#if __X64
__asm__ volatile (
# if __X64_32
"xchgl %%ebx, %1; cpuid; xchgl %%ebx, %1"
# else