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

Refactor to move temp register acquire to core

This commit is contained in:
Andy Wingo 2019-05-09 16:02:39 +02:00
parent 570f361c6c
commit f7080facb4
4 changed files with 62 additions and 59 deletions

View file

@ -189,6 +189,40 @@ jit_align(jit_state_t *_jit, unsigned align)
jit_nop(_jit, there - here);
}
static jit_gpr_t
get_temp_gpr(jit_state_t *_jit)
{
ASSERT(!_jit->temp_gpr_saved);
_jit->temp_gpr_saved = 1;
#ifdef JIT_RTMP
return JIT_RTMP;
#else
return JIT_VTMP;
#endif
}
static jit_fpr_t
get_temp_fpr(jit_state_t *_jit)
{
ASSERT(!_jit->temp_fpr_saved);
_jit->temp_fpr_saved = 1;
return JIT_FTMP;
}
static void
unget_temp_fpr(jit_state_t *_jit)
{
ASSERT(_jit->temp_fpr_saved);
_jit->temp_fpr_saved = 0;
}
static void
unget_temp_gpr(jit_state_t *_jit)
{
ASSERT(_jit->temp_gpr_saved);
_jit->temp_gpr_saved = 0;
}
static inline void emit_u8(jit_state_t *_jit, uint8_t u8) {
if (UNLIKELY(_jit->pc.uc + 1 > _jit->limit)) {
_jit->overflow = 1;
@ -570,10 +604,10 @@ abi_mem_to_mem(jit_state_t *_jit, enum jit_operand_abi abi, jit_gpr_t base,
abi_gpr_to_mem(_jit, abi, base, offset, tmp);
unget_temp_gpr(_jit);
} else {
jit_fpr_t tmp = get_temp_xpr(_jit);
jit_fpr_t tmp = get_temp_fpr(_jit);
abi_mem_to_fpr(_jit, abi, tmp, src_base, src_offset);
abi_fpr_to_mem(_jit, abi, base, offset, tmp);
unget_temp_xpr(_jit);
unget_temp_fpr(_jit);
}
}
@ -704,7 +738,7 @@ move_one(jit_state_t *_jit, jit_operand_t *dst, jit_operand_t *src,
jit_operand_t tmp;
if (is_fpr_arg (src[j].kind)) {
tmp_fpr = 1;
tmp = jit_operand_fpr(src[j].abi, get_temp_xpr(_jit));
tmp = jit_operand_fpr(src[j].abi, get_temp_fpr(_jit));
} else {
tmp_gpr = 1;
/* Preserve addend, if any, from source operand, to be applied
@ -729,7 +763,7 @@ move_one(jit_state_t *_jit, jit_operand_t *dst, jit_operand_t *src,
if (tmp_gpr)
unget_temp_gpr(_jit);
else if (tmp_fpr)
unget_temp_xpr(_jit);
unget_temp_fpr(_jit);
}
static void
@ -868,6 +902,12 @@ static const jit_gpr_t V[] = {
#endif
#ifdef JIT_V7
, JIT_V7
#endif
#ifdef JIT_V8
, JIT_V8
#endif
#ifdef JIT_V9
, JIT_V9
#endif
};

View file

@ -265,25 +265,6 @@ popr(jit_state_t *_jit, int32_t r0)
ic(_jit, 0x58 | r7(r0));
}
static jit_gpr_t
get_temp_gpr(jit_state_t *_jit)
{
ASSERT(!_jit->temp_gpr_saved);
_jit->temp_gpr_saved = 1;
#ifdef JIT_RTMP
return JIT_RTMP;
#else
return JIT_VTMP;
#endif
}
static void
unget_temp_gpr(jit_state_t *_jit)
{
ASSERT(_jit->temp_gpr_saved);
_jit->temp_gpr_saved = 0;
}
static void
nop(jit_state_t *_jit, int32_t count)
{

View file

@ -187,21 +187,6 @@ popr_d(jit_state_t *_jit, int32_t r0)
unget_temp_gpr(_jit);
}
static jit_fpr_t
get_temp_xpr(jit_state_t *_jit)
{
ASSERT(!_jit->temp_fpr_saved);
_jit->temp_fpr_saved = 1;
return JIT_FTMP;
}
static void
unget_temp_xpr(jit_state_t *_jit)
{
ASSERT(_jit->temp_fpr_saved);
_jit->temp_fpr_saved = 0;
}
static void
addssr(jit_state_t *_jit, int32_t r0, int32_t r1)
{
@ -409,14 +394,14 @@ movi_d(jit_state_t *_jit, int32_t r0, jit_float64_t i0)
movdqxr(_jit, r0, jit_gpr_regno(ireg));
unget_temp_gpr(_jit);
#else
jit_fpr_t freg = get_temp_xpr(_jit);
jit_fpr_t freg = get_temp_fpr(_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));
orpdr(_jit, r0, jit_fpr_regno(freg));
unget_temp_xpr(_jit);
unget_temp_fpr(_jit);
unget_temp_gpr(_jit);
#endif
}
@ -543,11 +528,11 @@ subr_f(jit_state_t *_jit, int32_t r0, int32_t r1, int32_t r2)
if (r0 == r1)
subssr(_jit, r0, r2);
else if (r0 == r2) {
jit_fpr_t reg = get_temp_xpr(_jit);
jit_fpr_t reg = get_temp_fpr(_jit);
movr_f(_jit, jit_fpr_regno(reg), r0);
movr_f(_jit, r0, r1);
subssr(_jit, r0, jit_fpr_regno(reg));
unget_temp_xpr(_jit);
unget_temp_fpr(_jit);
}
else {
movr_f(_jit, r0, r1);
@ -561,11 +546,11 @@ subr_d(jit_state_t *_jit, int32_t r0, int32_t r1, int32_t r2)
if (r0 == r1)
subsdr(_jit, r0, r2);
else if (r0 == r2) {
jit_fpr_t reg = get_temp_xpr(_jit);
jit_fpr_t reg = get_temp_fpr(_jit);
movr_d(_jit, jit_fpr_regno(reg), r0);
movr_d(_jit, r0, r1);
subsdr(_jit, r0, jit_fpr_regno(reg));
unget_temp_xpr(_jit);
unget_temp_fpr(_jit);
}
else {
movr_d(_jit, r0, r1);
@ -605,11 +590,11 @@ divr_f(jit_state_t *_jit, int32_t r0, int32_t r1, int32_t r2)
if (r0 == r1)
divssr(_jit, r0, r2);
else if (r0 == r2) {
jit_fpr_t reg = get_temp_xpr(_jit);
jit_fpr_t reg = get_temp_fpr(_jit);
movr_f(_jit, jit_fpr_regno(reg), r0);
movr_f(_jit, r0, r1);
divssr(_jit, r0, jit_fpr_regno(reg));
unget_temp_xpr(_jit);
unget_temp_fpr(_jit);
}
else {
movr_f(_jit, r0, r1);
@ -623,11 +608,11 @@ divr_d(jit_state_t *_jit, int32_t r0, int32_t r1, int32_t r2)
if (r0 == r1)
divsdr(_jit, r0, r2);
else if (r0 == r2) {
jit_fpr_t reg = get_temp_xpr(_jit);
jit_fpr_t reg = get_temp_fpr(_jit);
movr_d(_jit, jit_fpr_regno(reg), r0);
movr_d(_jit, r0, r1);
divsdr(_jit, r0, jit_fpr_regno(reg));
unget_temp_xpr(_jit);
unget_temp_fpr(_jit);
}
else {
movr_d(_jit, r0, r1);
@ -639,11 +624,11 @@ static void
absr_f(jit_state_t *_jit, int32_t r0, int32_t r1)
{
if (r0 == r1) {
jit_fpr_t reg = get_temp_xpr(_jit);
jit_fpr_t reg = get_temp_fpr(_jit);
pcmpeqlr(_jit, jit_fpr_regno(reg), jit_fpr_regno(reg));
psrl(_jit, jit_fpr_regno(reg), 1);
andpsr(_jit, r0, jit_fpr_regno(reg));
unget_temp_xpr(_jit);
unget_temp_fpr(_jit);
}
else {
pcmpeqlr(_jit, r0, r0);
@ -656,11 +641,11 @@ static void
absr_d(jit_state_t *_jit, int32_t r0, int32_t r1)
{
if (r0 == r1) {
jit_fpr_t reg = get_temp_xpr(_jit);
jit_fpr_t reg = get_temp_fpr(_jit);
pcmpeqlr(_jit, jit_fpr_regno(reg), jit_fpr_regno(reg));
psrq(_jit, jit_fpr_regno(reg), 1);
andpdr(_jit, r0, jit_fpr_regno(reg));
unget_temp_xpr(_jit);
unget_temp_fpr(_jit);
}
else {
pcmpeqlr(_jit, r0, r0);
@ -675,10 +660,10 @@ negr_f(jit_state_t *_jit, int32_t r0, int32_t r1)
jit_gpr_t ireg = get_temp_gpr(_jit);
imovi(_jit, jit_gpr_regno(ireg), 0x80000000);
if (r0 == r1) {
jit_fpr_t freg = get_temp_xpr(_jit);
jit_fpr_t freg = get_temp_fpr(_jit);
movdlxr(_jit, jit_fpr_regno(freg), jit_gpr_regno(ireg));
xorpsr(_jit, r0, jit_fpr_regno(freg));
unget_temp_xpr(_jit);
unget_temp_fpr(_jit);
} else {
movdlxr(_jit, r0, jit_gpr_regno(ireg));
xorpsr(_jit, r0, r1);
@ -692,11 +677,11 @@ negr_d(jit_state_t *_jit, int32_t r0, int32_t r1)
jit_gpr_t ireg = get_temp_gpr(_jit);
imovi(_jit, jit_gpr_regno(ireg), 0x80000000);
if (r0 == r1) {
jit_fpr_t freg = get_temp_xpr(_jit);
jit_fpr_t freg = get_temp_fpr(_jit);
movdlxr(_jit, jit_fpr_regno(freg), jit_gpr_regno(ireg));
pslq(_jit, jit_fpr_regno(freg), 32);
xorpdr(_jit, r0, jit_fpr_regno(freg));
unget_temp_xpr(_jit);
unget_temp_fpr(_jit);
} else {
movdlxr(_jit, r0, jit_gpr_regno(ireg));
pslq(_jit, r0, 32);

View file

@ -20,9 +20,6 @@
#ifndef _jit_x86_h
#define _jit_x86_h
/*
* Types
*/
#if __WORDSIZE == 32
# if defined(__x86_64__)
# define __X64 1