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:
parent
796f263ed8
commit
04d89a7ce2
4 changed files with 79 additions and 103 deletions
|
@ -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
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue