From 4322965b2153e6c13bce91a1a7fb4510d2c021a0 Mon Sep 17 00:00:00 2001 From: Matthew Flatt Date: Wed, 18 Nov 2009 02:29:38 +0000 Subject: [PATCH] fix x86_64 32-bit store to an immediate 64-bit address svn: r16855 --- src/mzscheme/src/jit.c | 6 +++--- src/mzscheme/src/lightning/i386/asm.h | 11 ++++++++--- src/mzscheme/src/lightning/i386/core.h | 6 +++--- 3 files changed, 14 insertions(+), 9 deletions(-) diff --git a/src/mzscheme/src/jit.c b/src/mzscheme/src/jit.c index e1bba24b5e..25ded8c074 100644 --- a/src/mzscheme/src/jit.c +++ b/src/mzscheme/src/jit.c @@ -2302,7 +2302,7 @@ static int generate_tail_call(mz_jit_state *jitter, int num_rands, int direct_na ref5 = jit_blei_i(jit_forward(), JIT_R2, 0); #ifndef FUEL_AUTODECEREMENTS jit_subi_p(JIT_R2, JIT_R2, 0x1); - (void)mz_tl_sti_i(tl_scheme_fuel_counter, JIT_R2); + (void)mz_tl_sti_i(tl_scheme_fuel_counter, JIT_R2, JIT_R1); #endif CHECK_LIMIT(); @@ -2608,7 +2608,7 @@ static int generate_non_tail_call(mz_jit_state *jitter, int num_rands, int direc (void)mz_tl_ldi_i(JIT_R2, tl_scheme_fuel_counter); ref11 = jit_blei_i(jit_forward(), JIT_R2, 0); jit_subi_p(JIT_R2, JIT_R2, 0x1); - (void)mz_tl_sti_i(tl_scheme_fuel_counter, JIT_R2); + (void)mz_tl_sti_i(tl_scheme_fuel_counter, JIT_R2, JIT_R1); #endif /* Fast inlined-native jump ok (proc will check argc, if necessary) */ @@ -2861,7 +2861,7 @@ static int generate_self_tail_call(Scheme_Object *rator, mz_jit_state *jitter, i refslow = jit_blei_i(jit_forward(), JIT_R2, 0); #ifndef FUEL_AUTODECEREMENTS jit_subi_p(JIT_R2, JIT_R2, 0x1); - (void)mz_tl_sti_i(tl_scheme_fuel_counter, JIT_R2); + (void)mz_tl_sti_i(tl_scheme_fuel_counter, JIT_R2, JIT_R1); #endif __END_TINY_OR_SHORT_JUMPS__(jmp_tiny, jmp_short); diff --git a/src/mzscheme/src/lightning/i386/asm.h b/src/mzscheme/src/lightning/i386/asm.h index d69691d2f4..bc5b4c5473 100644 --- a/src/mzscheme/src/lightning/i386/asm.h +++ b/src/mzscheme/src/lightning/i386/asm.h @@ -205,10 +205,14 @@ typedef _uc jit_insn; #define _d16() ( _jit_B(0x66 ) ) #define _O( OP ) ( _jit_B( OP ) ) #ifdef JIT_X86_64 -# define _REX(R,X,B) ( _jit_B(0x48|((R&0x8)>>1)|((X&0x8)>>2)|((B&0x8)>>3)) ) +# define _REX_(P,R,X,B) ( _jit_B(P|((R&0x8)>>1)|((X&0x8)>>2)|((B&0x8)>>3)) ) +# define _REX(R,X,B) _REX_(0x48,R,X,B) +# define _REXd(R,X,B) _REX_(0x40,R,X,B) # define _qO( OP, R,X,B ) ( _REX(R,X,B), _jit_B( OP ) ) +# define _qOd( OP, R,X,B ) ( _REXd(R,X,B), _jit_B( OP ) ) #else # define _qO( OP, R,X,B ) _O(OP) +# define _qOd( OP, R,X,B ) _O(OP) #endif #define _Or( OP,R ) ( _jit_B( (OP)|_r(R)) ) #ifdef JIT_X86_64 @@ -259,6 +263,7 @@ typedef _uc jit_insn; #define _O_r_X( OP ,R ,MD,MB,MI,MS ) ( _O ( OP ),_r_X( R ,MD,MB,MI,MS) ) #define _qO_r_X( OP ,R ,MD,MB,MI,MS ) ( _qO ( OP,R,0,MS),_qr_X(R,MD,MB,MI,MS) ) #define _qO_r_XB( OP ,R ,MD,MB,MI,MS ) ( _qO ( OP,R,0,MB),_qr_X(R,MD,MB,MI,MS) ) +#define _qO_r_Xd( OP ,R ,MD,MB,MI,MS ) ( _qOd ( OP,R,0,MB),_qr_X(R,MD,MB,MI,MS) ) #define _OO_r_X( OP ,R ,MD,MB,MI,MS ) ( _OO ( OP ),_r_X( R ,MD,MB,MI,MS) ) #define _O_r_X_B( OP ,R ,MD,MB,MI,MS,B ) ( _O ( OP ),_r_X( R ,MD,MB,MI,MS) ,_jit_B(B) ) #define _O_r_X_W( OP ,R ,MD,MB,MI,MS,W ) ( _O ( OP ),_r_X( R ,MD,MB,MI,MS) ,_jit_W(W) ) @@ -664,8 +669,8 @@ typedef _uc jit_insn; #define MOVQmr(MD, MB, MI, MS, RD) _qO_r_X (0x8b ,_r8(RD) ,MD,MB,MI,MS ) #define MOVQmQr(MD, MB, MI, MS, RD) _qO_r_XB (0x8b ,_r8(RD) ,MD,MB,MI,MS ) -#define MOVQrm(RS, MD, MB, MI, MS) _qO_r_X (0x89 ,_r8(RS) ,MD,MB,MI,MS ) -#define MOVQrQm(RS, MD, MB, MI, MS) _qO_r_XB (0x89 ,_r8(RS) ,MD,MB,MI,MS ) +#define MOVQrm(RS, MD, MB, MI, MS) _qO_r_Xd (0x89 ,_r8(RS) ,MD,MB,MI,MS ) +#define MOVQrQm(RS, MD, MB, MI, MS) _qO_r_XB (0x89 ,_r8(RS) ,MD,MB,MI,MS ) #define MOVQir(IM, R) _qOr_Q (0xb8,_r8(R) ,IM ) #define MOVQrr(RS, RD) _qO_Mrm (0x89 ,_b11,_r8(RS),_r8(RD) ) diff --git a/src/mzscheme/src/lightning/i386/core.h b/src/mzscheme/src/lightning/i386/core.h index 314972dbe5..f41bb3cd43 100644 --- a/src/mzscheme/src/lightning/i386/core.h +++ b/src/mzscheme/src/lightning/i386/core.h @@ -611,9 +611,9 @@ static int jit_arg_reg_order[] = { _EDI, _ESI, _EDX, _ECX }; #ifdef JIT_X86_64 # define jit_ldi_l(d, is) (_u32P((long)(is)) ? _jit_ldi_l(d, is) : (jit_movi_l(d, is), jit_ldr_l(d, d))) -# define jit_sti_l(id, rs) (_u32P((long)(id)) ? _jit_sti_l(id, rs) : (jit_movi_l(JIT_REXTMP, id), MOVQrQm(rs, 0, JIT_REXTMP, 0, 0))) -# define jit_ldi_i(d, is) (_s32P((long)(is)) ? _jit_ldi_i(d, is) : (jit_movi_l(d, is), jit_ldr_i(d, d))) -# define jit_sti_i(id, rs) (_s32P((long)(id)) ? _jit_ldi_i(id, rs) : (jit_movi_l(JIT_REXTMP, id), MOVQrm(d, JIT_REXTMP))) +# define jit_sti_l(id, rs) (_u32P((long)(id)) ? _jit_sti_l(id, rs) : (jit_movi_l(JIT_REXTMP, (long)(id)), MOVQrQm(rs, 0, JIT_REXTMP, 0, 0))) +# define jit_ldi_i(d, is) (_u32P((long)(is)) ? _jit_ldi_i(d, is) : (jit_movi_l(d, is), jit_ldr_i(d, d))) +# define jit_sti_i(id, rs) (_u32P((long)(id)) ? _jit_sti_i(id, rs) : (jit_movi_l(JIT_REXTMP, (long)(id)), MOVQrm(rs, 0, JIT_REXTMP, 0, 0))) #else # define jit_ldi_l(d, is) _jit_ldi_l(d, is) # define jit_sti_l(id, rs) _jit_sti_l(id, rs)