From 09e71475f4d86106708e8d5e77684e59c47cca48 Mon Sep 17 00:00:00 2001 From: Andy Wingo Date: Wed, 15 May 2019 16:19:33 +0200 Subject: [PATCH] Allow a backend to have multiple temporary registers --- lightening/aarch64.h | 4 ++-- lightening/lightening.c | 30 +++++++++++++++++++----------- lightening/x86.h | 8 ++++---- 3 files changed, 25 insertions(+), 17 deletions(-) diff --git a/lightening/aarch64.h b/lightening/aarch64.h index fe1b1810d..13a0f1ca3 100644 --- a/lightening/aarch64.h +++ b/lightening/aarch64.h @@ -121,8 +121,8 @@ jit_fpr_is_callee_save (jit_fpr_t reg) #define JIT_R14 _X14 #define JIT_R15 _X15 #define JIT_R16 _X16 -#define JIT_R17 _X17 -#define JIT_RTMP _X18 +#define JIT_TMP0 _X17 +#define JIT_TMP1 _X18 #define JIT_V0 _X19 #define JIT_V1 _X20 #define JIT_V2 _X21 diff --git a/lightening/lightening.c b/lightening/lightening.c index c08ebab6c..fe71c58b2 100644 --- a/lightening/lightening.c +++ b/lightening/lightening.c @@ -332,35 +332,43 @@ jit_align(jit_state_t *_jit, unsigned align) 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; + switch(_jit->temp_gpr_saved++) + { + case 0: + return JIT_TMP0; +#ifdef JIT_TMP1 + case 1: + return JIT_TMP1; #endif + default: + abort(); + } } static jit_fpr_t get_temp_fpr(jit_state_t *_jit) { - ASSERT(!_jit->temp_fpr_saved); - _jit->temp_fpr_saved = 1; - return JIT_FTMP; + switch(_jit->temp_gpr_saved++) + { + case 0: + return JIT_FTMP; + default: + abort(); + } } static void unget_temp_fpr(jit_state_t *_jit) { ASSERT(_jit->temp_fpr_saved); - _jit->temp_fpr_saved = 0; + _jit->temp_fpr_saved--; } static void unget_temp_gpr(jit_state_t *_jit) { ASSERT(_jit->temp_gpr_saved); - _jit->temp_gpr_saved = 0; + _jit->temp_gpr_saved--; } static inline void emit_u8(jit_state_t *_jit, uint8_t u8) { diff --git a/lightening/x86.h b/lightening/x86.h index 8ed27e85b..647490380 100644 --- a/lightening/x86.h +++ b/lightening/x86.h @@ -129,7 +129,7 @@ jit_fpr_is_callee_save (jit_fpr_t reg) # define JIT_V0 _RBP # define JIT_V1 _RSI # define JIT_V2 _RDI -# define JIT_TMP _RBX +# define JIT_TMP0 _RBX # define JIT_F0 _XMM0 # define JIT_F1 _XMM1 # define JIT_F2 _XMM2 @@ -138,7 +138,7 @@ jit_fpr_is_callee_save (jit_fpr_t reg) # define JIT_F5 _XMM5 # define JIT_F6 _XMM6 # define JIT_FTMP _XMM7 -# define JIT_PLATFORM_CALLEE_SAVE_GPRS JIT_TMP +# define JIT_PLATFORM_CALLEE_SAVE_GPRS JIT_TMP0 #elif __CYGWIN__ # define JIT_R0 _RAX # define JIT_R1 _RCX @@ -146,7 +146,7 @@ jit_fpr_is_callee_save (jit_fpr_t reg) # define JIT_R3 _R8 # define JIT_R4 _R9 # define JIT_R5 _R10 -# define JIT_RTMP _R11 +# define JIT_TMP0 _R11 # define JIT_V0 _RBX # define JIT_V1 _RSI # define JIT_V2 _RDI @@ -180,7 +180,7 @@ jit_fpr_is_callee_save (jit_fpr_t reg) # define JIT_R5 _R8 # define JIT_R6 _R9 # define JIT_R7 _R10 -# define JIT_RTMP _R11 +# define JIT_TMP0 _R11 # define JIT_V0 _RBX # define JIT_V1 _R12 # define JIT_V2 _R13