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:
parent
89fd69fc00
commit
bab1f40b5e
5 changed files with 96 additions and 1376 deletions
|
@ -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();
|
||||
}
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
1344
lightening/x86-x87.c
1344
lightening/x86-x87.c
File diff suppressed because it is too large
Load diff
|
@ -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
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue