1
Fork 0
mirror of https://git.savannah.gnu.org/git/guile.git synced 2025-05-13 17:20:21 +02:00

Implement reloc shortening, and remove unused functionality

This commit is contained in:
Andy Wingo 2019-04-26 12:40:44 +02:00
parent 796f263ed8
commit 04d89a7ce2
4 changed files with 79 additions and 103 deletions

View file

@ -403,7 +403,7 @@ mov_addr(jit_state_t *_jit, int32_t r0)
rex(_jit, 0, WIDE, _NOREG, _NOREG, r0);
ic(_jit, 0xb8 | r7(r0));
ptrdiff_t inst_start = _jit->pc.uc - pc_start;
return jit_reloc(_jit, JIT_RELOC_ABSOLUTE, inst_start, 0);
return jit_reloc(_jit, JIT_RELOC_ABSOLUTE, inst_start);
}
static void
@ -659,15 +659,6 @@ testi(jit_state_t *_jit, int32_t r0, jit_word_t i0)
ii(_jit, i0);
}
static void
cc(jit_state_t *_jit, int32_t code, int32_t r0)
{
rex(_jit, 0, 0, _NOREG, _NOREG, r0);
ic(_jit, 0x0f);
ic(_jit, 0x90 | code);
mrm(_jit, 0x03, 0x00, r7(r0));
}
static void
negr(jit_state_t *_jit, int32_t r0, int32_t r1)
{
@ -1465,69 +1456,6 @@ xori(jit_state_t *_jit, int32_t r0, int32_t r1, jit_word_t i0)
}
}
static void
cr(jit_state_t *_jit, int32_t code, int32_t r0, int32_t r1, int32_t r2)
{
if (reg8_p(r0)) {
jit_bool_t same = r0 == r1 || r0 == r2;
if (!same)
ixorr(_jit, r0, r0);
icmpr(_jit, r1, r2);
if (same)
imovi(_jit, r0, 0);
cc(_jit, code, r0);
} else {
jit_gpr_t reg = get_temp_gpr(_jit);
ixorr(_jit, jit_gpr_regno(reg), jit_gpr_regno(reg));
icmpr(_jit, r1, r2);
cc(_jit, code, jit_gpr_regno(reg));
movr(_jit, r0, jit_gpr_regno(reg));
unget_temp_gpr(_jit);
}
}
static void
ci(jit_state_t *_jit, int32_t code, int32_t r0, int32_t r1, jit_word_t i0)
{
if (reg8_p(r0)) {
jit_bool_t same = r0 == r1;
if (!same)
ixorr(_jit, r0, r0);
icmpi(_jit, r1, i0);
if (same)
imovi(_jit, r0, 0);
cc(_jit, code, r0);
} else {
jit_gpr_t reg = get_temp_gpr(_jit);
ixorr(_jit, jit_gpr_regno(reg), jit_gpr_regno(reg));
icmpi(_jit, r1, i0);
cc(_jit, code, jit_gpr_regno(reg));
movr(_jit, r0, jit_gpr_regno(reg));
unget_temp_gpr(_jit);
}
}
static void
ci0(jit_state_t *_jit, int32_t code, int32_t r0, int32_t r1)
{
if (reg8_p(r0)) {
jit_bool_t same = r0 == r1;
if (!same)
ixorr(_jit, r0, r0);
testr(_jit, r1, r1);
if (same)
imovi(_jit, r0, 0);
cc(_jit, code, r0);
} else {
jit_gpr_t reg = get_temp_gpr(_jit);
ixorr(_jit, jit_gpr_regno(reg), jit_gpr_regno(reg));
testr(_jit, r1, r1);
cc(_jit, code, jit_gpr_regno(reg));
movr(_jit, r0, jit_gpr_regno(reg));
unget_temp_gpr(_jit);
}
}
static void
extr_c(jit_state_t *_jit, int32_t r0, int32_t r1)
{
@ -2255,7 +2183,7 @@ static jit_reloc_t
jccs(jit_state_t *_jit, int32_t code)
{
ic(_jit, 0x70 | code);
return jit_reloc(_jit, JIT_RELOC_REL8, 1, 0);
return jit_reloc(_jit, JIT_RELOC_REL8, 1);
}
static jit_reloc_t
@ -2263,7 +2191,26 @@ jcc(jit_state_t *_jit, int32_t code)
{
ic(_jit, 0x0f);
ic(_jit, 0x80 | code);
return jit_reloc(_jit, JIT_RELOC_REL32, 2, 0);
return jit_reloc(_jit, JIT_RELOC_REL32, 2);
}
static void
jcci(jit_state_t *_jit, int32_t code, jit_word_t i0)
{
ptrdiff_t rel8 = i0 - (_jit->pc.w + 1 + 1);
ptrdiff_t rel32 = i0 - (_jit->pc.w + 2 + 4);
if (INT8_MIN <= rel8 && rel8 <= INT8_MAX)
{
ic(_jit, 0x70 | code);
ic(_jit, rel8);
}
else
{
ASSERT(INT32_MIN <= rel32 && rel32 <= INT32_MAX);
ic(_jit, 0x0f);
ic(_jit, 0x80 | code);
ii(_jit, rel32);
}
}
#define DEFINE_JUMPS(cc, CC, code) \
@ -2666,8 +2613,14 @@ jmpr(jit_state_t *_jit, int32_t r0)
static void
jmpi(jit_state_t *_jit, jit_word_t i0)
{
ptrdiff_t rel8 = i0 - (_jit->pc.w + 1 + 1);
ptrdiff_t rel32 = i0 - (_jit->pc.w + 1 + 4);
if (INT32_MIN <= rel32 && rel32 <= INT32_MAX)
if (INT8_MIN <= rel8 && rel8 <= INT8_MAX)
{
ic(_jit, 0xeb);
ic(_jit, rel8);
}
else if (INT32_MIN <= rel32 && rel32 <= INT32_MAX)
{
ic(_jit, 0xe9);
ii(_jit, rel32);
@ -2685,14 +2638,7 @@ static jit_reloc_t
jmp(jit_state_t *_jit)
{
ic(_jit, 0xe9);
return jit_reloc(_jit, JIT_RELOC_REL32, 1, 0);
}
static jit_reloc_t
jmpsi(jit_state_t *_jit)
{
ic(_jit, 0xeb);
return jit_reloc(_jit, JIT_RELOC_REL8, 1, 0);
return jit_reloc(_jit, JIT_RELOC_REL32, 1);
}
static void