1
Fork 0
mirror of https://git.savannah.gnu.org/git/guile.git synced 2025-06-06 12:10:28 +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); 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) { static inline void emit_u8(jit_state_t *_jit, uint8_t u8) {
if (UNLIKELY(_jit->pc.uc + 1 > _jit->limit)) { if (UNLIKELY(_jit->pc.uc + 1 > _jit->limit)) {
_jit->overflow = 1; _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); abi_gpr_to_mem(_jit, abi, base, offset, tmp);
unget_temp_gpr(_jit); unget_temp_gpr(_jit);
} else { } 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_mem_to_fpr(_jit, abi, tmp, src_base, src_offset);
abi_fpr_to_mem(_jit, abi, base, offset, tmp); 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; jit_operand_t tmp;
if (is_fpr_arg (src[j].kind)) { if (is_fpr_arg (src[j].kind)) {
tmp_fpr = 1; 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 { } else {
tmp_gpr = 1; tmp_gpr = 1;
/* Preserve addend, if any, from source operand, to be applied /* 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) if (tmp_gpr)
unget_temp_gpr(_jit); unget_temp_gpr(_jit);
else if (tmp_fpr) else if (tmp_fpr)
unget_temp_xpr(_jit); unget_temp_fpr(_jit);
} }
static void static void
@ -868,6 +902,12 @@ static const jit_gpr_t V[] = {
#endif #endif
#ifdef JIT_V7 #ifdef JIT_V7
, JIT_V7 , JIT_V7
#endif
#ifdef JIT_V8
, JIT_V8
#endif
#ifdef JIT_V9
, JIT_V9
#endif #endif
}; };

View file

@ -265,25 +265,6 @@ popr(jit_state_t *_jit, int32_t r0)
ic(_jit, 0x58 | r7(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 static void
nop(jit_state_t *_jit, int32_t count) 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); 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 static void
addssr(jit_state_t *_jit, int32_t r0, int32_t r1) 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)); movdqxr(_jit, r0, jit_gpr_regno(ireg));
unget_temp_gpr(_jit); unget_temp_gpr(_jit);
#else #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]); movi(_jit, jit_gpr_regno(ireg), data.ii[1]);
movdlxr(_jit, jit_fpr_regno(freg), jit_gpr_regno(ireg)); movdlxr(_jit, jit_fpr_regno(freg), jit_gpr_regno(ireg));
pslq(_jit, jit_fpr_regno(freg), 32); pslq(_jit, jit_fpr_regno(freg), 32);
movi(_jit, jit_gpr_regno(ireg), data.ii[0]); movi(_jit, jit_gpr_regno(ireg), data.ii[0]);
movdlxr(_jit, r0, jit_gpr_regno(ireg)); movdlxr(_jit, r0, jit_gpr_regno(ireg));
orpdr(_jit, r0, jit_fpr_regno(freg)); orpdr(_jit, r0, jit_fpr_regno(freg));
unget_temp_xpr(_jit); unget_temp_fpr(_jit);
unget_temp_gpr(_jit); unget_temp_gpr(_jit);
#endif #endif
} }
@ -543,11 +528,11 @@ subr_f(jit_state_t *_jit, int32_t r0, int32_t r1, int32_t r2)
if (r0 == r1) if (r0 == r1)
subssr(_jit, r0, r2); subssr(_jit, r0, r2);
else if (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, jit_fpr_regno(reg), r0);
movr_f(_jit, r0, r1); movr_f(_jit, r0, r1);
subssr(_jit, r0, jit_fpr_regno(reg)); subssr(_jit, r0, jit_fpr_regno(reg));
unget_temp_xpr(_jit); unget_temp_fpr(_jit);
} }
else { else {
movr_f(_jit, r0, r1); 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) if (r0 == r1)
subsdr(_jit, r0, r2); subsdr(_jit, r0, r2);
else if (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, jit_fpr_regno(reg), r0);
movr_d(_jit, r0, r1); movr_d(_jit, r0, r1);
subsdr(_jit, r0, jit_fpr_regno(reg)); subsdr(_jit, r0, jit_fpr_regno(reg));
unget_temp_xpr(_jit); unget_temp_fpr(_jit);
} }
else { else {
movr_d(_jit, r0, r1); 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) if (r0 == r1)
divssr(_jit, r0, r2); divssr(_jit, r0, r2);
else if (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, jit_fpr_regno(reg), r0);
movr_f(_jit, r0, r1); movr_f(_jit, r0, r1);
divssr(_jit, r0, jit_fpr_regno(reg)); divssr(_jit, r0, jit_fpr_regno(reg));
unget_temp_xpr(_jit); unget_temp_fpr(_jit);
} }
else { else {
movr_f(_jit, r0, r1); 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) if (r0 == r1)
divsdr(_jit, r0, r2); divsdr(_jit, r0, r2);
else if (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, jit_fpr_regno(reg), r0);
movr_d(_jit, r0, r1); movr_d(_jit, r0, r1);
divsdr(_jit, r0, jit_fpr_regno(reg)); divsdr(_jit, r0, jit_fpr_regno(reg));
unget_temp_xpr(_jit); unget_temp_fpr(_jit);
} }
else { else {
movr_d(_jit, r0, r1); movr_d(_jit, r0, r1);
@ -639,11 +624,11 @@ static void
absr_f(jit_state_t *_jit, int32_t r0, int32_t r1) absr_f(jit_state_t *_jit, int32_t r0, int32_t r1)
{ {
if (r0 == 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)); pcmpeqlr(_jit, jit_fpr_regno(reg), jit_fpr_regno(reg));
psrl(_jit, jit_fpr_regno(reg), 1); psrl(_jit, jit_fpr_regno(reg), 1);
andpsr(_jit, r0, jit_fpr_regno(reg)); andpsr(_jit, r0, jit_fpr_regno(reg));
unget_temp_xpr(_jit); unget_temp_fpr(_jit);
} }
else { else {
pcmpeqlr(_jit, r0, r0); pcmpeqlr(_jit, r0, r0);
@ -656,11 +641,11 @@ static void
absr_d(jit_state_t *_jit, int32_t r0, int32_t r1) absr_d(jit_state_t *_jit, int32_t r0, int32_t r1)
{ {
if (r0 == 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)); pcmpeqlr(_jit, jit_fpr_regno(reg), jit_fpr_regno(reg));
psrq(_jit, jit_fpr_regno(reg), 1); psrq(_jit, jit_fpr_regno(reg), 1);
andpdr(_jit, r0, jit_fpr_regno(reg)); andpdr(_jit, r0, jit_fpr_regno(reg));
unget_temp_xpr(_jit); unget_temp_fpr(_jit);
} }
else { else {
pcmpeqlr(_jit, r0, r0); 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); jit_gpr_t ireg = get_temp_gpr(_jit);
imovi(_jit, jit_gpr_regno(ireg), 0x80000000); imovi(_jit, jit_gpr_regno(ireg), 0x80000000);
if (r0 == r1) { 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)); movdlxr(_jit, jit_fpr_regno(freg), jit_gpr_regno(ireg));
xorpsr(_jit, r0, jit_fpr_regno(freg)); xorpsr(_jit, r0, jit_fpr_regno(freg));
unget_temp_xpr(_jit); unget_temp_fpr(_jit);
} else { } else {
movdlxr(_jit, r0, jit_gpr_regno(ireg)); movdlxr(_jit, r0, jit_gpr_regno(ireg));
xorpsr(_jit, r0, r1); 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); jit_gpr_t ireg = get_temp_gpr(_jit);
imovi(_jit, jit_gpr_regno(ireg), 0x80000000); imovi(_jit, jit_gpr_regno(ireg), 0x80000000);
if (r0 == r1) { 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)); movdlxr(_jit, jit_fpr_regno(freg), jit_gpr_regno(ireg));
pslq(_jit, jit_fpr_regno(freg), 32); pslq(_jit, jit_fpr_regno(freg), 32);
xorpdr(_jit, r0, jit_fpr_regno(freg)); xorpdr(_jit, r0, jit_fpr_regno(freg));
unget_temp_xpr(_jit); unget_temp_fpr(_jit);
} else { } else {
movdlxr(_jit, r0, jit_gpr_regno(ireg)); movdlxr(_jit, r0, jit_gpr_regno(ireg));
pslq(_jit, r0, 32); pslq(_jit, r0, 32);

View file

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