fix x86_64 32-bit store to an immediate 64-bit address

svn: r16855
This commit is contained in:
Matthew Flatt 2009-11-18 02:29:38 +00:00
parent 99978206b0
commit 4322965b21
3 changed files with 14 additions and 9 deletions

View File

@ -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);

View File

@ -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,7 +669,7 @@ 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 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 )

View File

@ -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)