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:
parent
570f361c6c
commit
f7080facb4
4 changed files with 62 additions and 59 deletions
|
@ -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
|
||||
};
|
||||
|
||||
|
|
|
@ -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)
|
||||
{
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -20,9 +20,6 @@
|
|||
#ifndef _jit_x86_h
|
||||
#define _jit_x86_h
|
||||
|
||||
/*
|
||||
* Types
|
||||
*/
|
||||
#if __WORDSIZE == 32
|
||||
# if defined(__x86_64__)
|
||||
# define __X64 1
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue