Index: parrot-svn/src/jit/i386/jit_defs.c =================================================================== --- parrot-svn.orig/src/jit/i386/jit_defs.c +++ parrot-svn/src/jit/i386/jit_defs.c @@ -1119,9 +1119,9 @@ store: emitm_fstpl(interp, jit_info->native_ptr, emit_ESP, emit_None, 1, 0); /* additional stack adjustment */ st += 4; -#else +#else /* NUMVAL_SIZE == 12 */ emitm_addb_i_r(jit_info->native_ptr, -12, emit_ESP); - emitm_fstpt(jit_info->native_ptr, emit_ESP, emit_None, 1, 0); + emitm_fstpt(interp, jit_info->native_ptr, emit_ESP, emit_None, 1, 0); st += 8; #endif break; Index: parrot-svn/src/jit/i386/jit_emit.h =================================================================== --- parrot-svn.orig/src/jit/i386/jit_emit.h +++ parrot-svn/src/jit/i386/jit_emit.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 2002-2008, Parrot Foundation. + * Copyright (C) 2002-2009, Parrot Foundation. */ /* @@ -218,6 +218,7 @@ char * emit_shift_r_m(PARROT_INTERP, cha *(long *)(pc) = (long)(imm); \ (pc) += 4; } +/* TODO: remove duplicate */ #if EXEC_CAPABLE # define emitm_pushl_m(pc, mem) { \ *((pc)++) = (char) 0xff; \ @@ -691,6 +692,9 @@ char * opt_shift_rm(PARROT_INTERP, Parro # define emitm_fstps(interp, pc, b, i, s, d) \ emitm_fl_2((interp), (pc), emit_b00, 1, emit_b010, (b), (i), (s), (d)) +# define emitm_fstt(interp, pc, b, i, s, d) \ + emitm_fl_2((interp), (pc), emit_b10, 1, emit_b010, (b), (i), (s), (d)) + #if NUMVAL_SIZE == 8 # define jit_emit_fload_m_n(interp, pc, address) \ @@ -708,22 +712,22 @@ char * opt_shift_rm(PARROT_INTERP, Parro # define jit_emit_fst_mb_n(interp, pc, base, offs) \ emitm_fstl((interp), (pc), (base), emit_None, 1, (offs)) -#else /* NUMVAL_SIZE */ +#else /* NUMVAL_SIZE = 12 */ # define jit_emit_fload_m_n(interp, pc, address) \ - emitm_fldt((pc), emit_None, emit_None, emit_None, (address)) + emitm_fldt((interp), (pc), emit_None, emit_None, emit_None, (address)) # define jit_emit_fload_mb_n(interp, pc, base, offs) \ - emitm_fldt((pc), (base), emit_None, 1, (offs)) + emitm_fldt((interp), (pc), (base), emit_None, 1, (offs)) -# define jit_emit_fstore_m_n(pc, address) \ - emitm_fstpt((pc), emit_None, emit_None, emit_None, (address)) +# define jit_emit_fstore_m_n(interp, pc, address) \ + emitm_fstpt((interp), (pc), emit_None, emit_None, emit_None, (address)) # define jit_emit_fstore_mb_n(interp, pc, base, offs) \ - emitm_fstpt((pc), (base), emit_None, 1, (offs)) + emitm_fstpt((interp), (pc), (base), emit_None, 1, (offs)) # define jit_emit_fst_mb_n(interp, pc, base, offs) \ - emitm_fstt((pc), (base), emit_None, 1, (offs)) + emitm_fstt((interp), (pc), (base), emit_None, 1, (offs)) #endif /* NUMVAL_SIZE */ @@ -736,7 +740,7 @@ char * opt_shift_rm(PARROT_INTERP, Parro # define jit_emit_fstore_m_i(pc, m) \ emitm_fistpl((pc), emit_None, emit_None, emit_None, (m)) -#else /* INTVAL_SIZE */ +#else /* INTVAL_SIZE = 8 */ # define jit_emit_fload_m_i(interp, pc, address) \ emitm_fildll((interp), (pc), emit_None, emit_None, emit_None, (address)) @@ -937,7 +941,8 @@ extern unsigned char *lastpc; emitm_fsubrp((pc), 1); \ jit_emit_fstore_mb_n((interp), (pc), emit_EBX, (mem)); \ } -#else + +#else /* without NEG_MINUS_ZERO and NEG_ZERO_SUB */ # define jit_emit_neg_r_n(pc, r) { \ if (r) { \ @@ -962,7 +967,7 @@ extern unsigned char *lastpc; emitm_fchs(pc); \ jit_emit_fstore_mb_n((interp), (pc), emit_EBX, (mem)); \ } -#endif +#endif /* NEG_MINUS_ZERO, NEG_ZERO_SUB */ # define jit_emit_sin_r_n(pc, r) \ if (r) { \ @@ -1011,7 +1016,7 @@ extern unsigned char *lastpc; # define jit_emit_abs_m_n(interp, pc, mem) { \ jit_emit_fload_m_n((interp), (pc), (mem)); \ emitm_fabs(pc); \ - jit_emit_fstore_m_n((pc), (mem)); \ + jit_emit_fstore_m_n((interp), (pc), (mem)); \ } /* Integer comparisons */ @@ -1040,6 +1045,7 @@ extern unsigned char *lastpc; *((pc)++) = (char) 0xff; \ *((pc)++) = (char) 0xd0 | ((reg) - 1); } +/* TODO: remove duplicate */ #if EXEC_CAPABLE # define emitm_callm(pc, b, i, s, d) { \ *((pc)++) = (char) 0xff; \ @@ -1063,6 +1069,7 @@ extern unsigned char *lastpc; *((pc)++) = (char) 0xff; \ *((pc)++) = (char)(0xe0 | ((reg) - 1)); } +/* TODO: remove duplicate */ #if EXEC_CAPABLE # define emitm_jumpm(pc, b, i, s, d) { \ *((pc)++) = (char) 0xff; \ @@ -1206,15 +1213,29 @@ extern unsigned char *lastpc; } /* INT_REG <= ST(i) */ +/* TODO: unused. jit_emit_mov_MR_in is used instead. + TODO: rounding => trunc */ # define jit_emit_mov_mr_in(pc, mem, r) { \ emitm_fld((pc), (r)); \ jit_emit_fstore_m_i((pc), (mem)); \ } +/* TODO: rounding => trunc */ +# define jit_emit_mov_MR_in(interp, pc, mem, r) { \ + if (r) { \ + emitm_fld((pc), (r)); \ + jit_emit_fstore_m_i((pc), (mem)); \ + } \ + else { \ + jit_emit_fst_m_i((interp), (pc), emit_EBX, (d)); \ + } \ +} + /* numvar <- ST(i) */ -# define jit_emit_mov_mr_n(pc, d, r) { \ +/* TODO: unused. jit_emit_mov_MR_n is used instead */ +# define jit_emit_mov_mr_n(interp, pc, d, r) { \ emitm_fld((pc), (r)); \ - jit_emit_fstore_m_n((pc), (d)); \ + jit_emit_fstore_m_n((interp), (pc), (d)); \ } # define jit_emit_mov_MR_n(interp, pc, d, r) { \