diff --git a/lightening/lightening.c b/lightening/lightening.c index 0973d8a69..719423857 100644 --- a/lightening/lightening.c +++ b/lightening/lightening.c @@ -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 }; diff --git a/lightening/x86-cpu.c b/lightening/x86-cpu.c index 041c54906..0b39e5a15 100644 --- a/lightening/x86-cpu.c +++ b/lightening/x86-cpu.c @@ -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) { diff --git a/lightening/x86-sse.c b/lightening/x86-sse.c index 9f4084c85..59b7c7471 100644 --- a/lightening/x86-sse.c +++ b/lightening/x86-sse.c @@ -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); diff --git a/lightening/x86.h b/lightening/x86.h index 6e029d631..41c136e27 100644 --- a/lightening/x86.h +++ b/lightening/x86.h @@ -20,9 +20,6 @@ #ifndef _jit_x86_h #define _jit_x86_h -/* - * Types - */ #if __WORDSIZE == 32 # if defined(__x86_64__) # define __X64 1