Ticket #352: tt352-jit-i386-ld.3.patch

File tt352-jit-i386-ld.3.patch, 6.4 KB (added by rurban, 13 years ago)
  • src/jit/i386/jit_defs.c

    old new  
    11191119                emitm_fstpl(interp, jit_info->native_ptr, emit_ESP, emit_None, 1, 0); 
    11201120                /* additional stack adjustment */ 
    11211121                st += 4; 
    1122 #else 
     1122#else /* NUMVAL_SIZE == 12 */ 
    11231123                emitm_addb_i_r(jit_info->native_ptr, -12, emit_ESP); 
    1124                 emitm_fstpt(jit_info->native_ptr, emit_ESP, emit_None, 1, 0); 
     1124                emitm_fstpt(interp, jit_info->native_ptr, emit_ESP, emit_None, 1, 0); 
    11251125                st += 8; 
    11261126#endif 
    11271127                break; 
  • src/jit/i386/jit_emit.h

    old new  
    11/* 
    2  * Copyright (C) 2002-2008, Parrot Foundation. 
     2 * Copyright (C) 2002-2009, Parrot Foundation. 
    33 */ 
    44 
    55/* 
     
    218218    *(long *)(pc) = (long)(imm); \ 
    219219    (pc) += 4; } 
    220220 
     221/* TODO: remove duplicate */ 
    221222#if EXEC_CAPABLE 
    222223#  define emitm_pushl_m(pc, mem) { \ 
    223224       *((pc)++) = (char) 0xff; \ 
     
    691692#  define emitm_fstps(interp, pc, b, i, s, d) \ 
    692693    emitm_fl_2((interp), (pc), emit_b00, 1, emit_b010, (b), (i), (s), (d)) 
    693694 
     695#  define emitm_fstt(interp, pc, b, i, s, d) \ 
     696    emitm_fl_2((interp), (pc), emit_b10, 1, emit_b010, (b), (i), (s), (d)) 
     697 
    694698#if NUMVAL_SIZE == 8 
    695699 
    696700#  define jit_emit_fload_m_n(interp, pc, address) \ 
     
    708712#  define jit_emit_fst_mb_n(interp, pc, base, offs) \ 
    709713      emitm_fstl((interp), (pc), (base), emit_None, 1, (offs)) 
    710714 
    711 #else /* NUMVAL_SIZE */ 
     715#else /* NUMVAL_SIZE = 12 */ 
    712716 
    713717#  define jit_emit_fload_m_n(interp, pc, address) \ 
    714       emitm_fldt((pc), emit_None, emit_None, emit_None, (address)) 
     718      emitm_fldt((interp), (pc), emit_None, emit_None, emit_None, (address)) 
    715719 
    716720#  define jit_emit_fload_mb_n(interp, pc, base, offs) \ 
    717       emitm_fldt((pc), (base), emit_None, 1, (offs)) 
     721      emitm_fldt((interp), (pc), (base), emit_None, 1, (offs)) 
    718722 
    719 #  define jit_emit_fstore_m_n(pc, address) \ 
    720       emitm_fstpt((pc), emit_None, emit_None, emit_None, (address)) 
     723#  define jit_emit_fstore_m_n(interp, pc, address) \ 
     724      emitm_fstpt((interp), (pc), emit_None, emit_None, emit_None, (address)) 
    721725 
    722726#  define jit_emit_fstore_mb_n(interp, pc, base, offs) \ 
    723       emitm_fstpt((pc), (base), emit_None, 1, (offs)) 
     727      emitm_fstpt((interp), (pc), (base), emit_None, 1, (offs)) 
    724728 
    725729#  define jit_emit_fst_mb_n(interp, pc, base, offs) \ 
    726       emitm_fstt((pc), (base), emit_None, 1, (offs)) 
     730      emitm_fstt((interp), (pc), (base), emit_None, 1, (offs)) 
    727731 
    728732#endif /* NUMVAL_SIZE */ 
    729733 
     
    736740#  define jit_emit_fstore_m_i(pc, m) \ 
    737741      emitm_fistpl((pc), emit_None, emit_None, emit_None, (m)) 
    738742 
    739 #else /* INTVAL_SIZE */ 
     743#else /* INTVAL_SIZE = 8 */ 
    740744 
    741745#  define jit_emit_fload_m_i(interp, pc, address) \ 
    742746      emitm_fildll((interp), (pc), emit_None, emit_None, emit_None, (address)) 
     
    937941       emitm_fsubrp((pc), 1); \ 
    938942       jit_emit_fstore_mb_n((interp), (pc), emit_EBX, (mem)); \ 
    939943     } 
    940 #else 
     944 
     945#else /* without NEG_MINUS_ZERO and NEG_ZERO_SUB */ 
    941946 
    942947#  define jit_emit_neg_r_n(pc, r) { \ 
    943948       if (r) { \ 
     
    962967       emitm_fchs(pc); \ 
    963968       jit_emit_fstore_mb_n((interp), (pc), emit_EBX, (mem)); \ 
    964969     } 
    965 #endif 
     970#endif /* NEG_MINUS_ZERO, NEG_ZERO_SUB */ 
    966971 
    967972#  define jit_emit_sin_r_n(pc, r) \ 
    968973     if (r) { \ 
     
    10111016#  define jit_emit_abs_m_n(interp, pc, mem) { \ 
    10121017     jit_emit_fload_m_n((interp), (pc), (mem)); \ 
    10131018     emitm_fabs(pc); \ 
    1014      jit_emit_fstore_m_n((pc), (mem)); \ 
     1019     jit_emit_fstore_m_n((interp), (pc), (mem));        \ 
    10151020   } 
    10161021 
    10171022/* Integer comparisons */ 
     
    10401045    *((pc)++) = (char) 0xff; \ 
    10411046    *((pc)++) = (char) 0xd0 | ((reg) - 1); } 
    10421047 
     1048/* TODO: remove duplicate */ 
    10431049#if EXEC_CAPABLE 
    10441050#  define emitm_callm(pc, b, i, s, d) { \ 
    10451051       *((pc)++) = (char) 0xff; \ 
     
    10631069    *((pc)++) = (char) 0xff; \ 
    10641070    *((pc)++) = (char)(0xe0 | ((reg) - 1)); } 
    10651071 
     1072/* TODO: remove duplicate */ 
    10661073#if EXEC_CAPABLE 
    10671074#  define emitm_jumpm(pc, b, i, s, d) { \ 
    10681075       *((pc)++) = (char) 0xff; \ 
     
    12061213} 
    12071214 
    12081215/* INT_REG <= ST(i) */ 
     1216/* TODO: unused. jit_emit_mov_MR_in is used instead. 
     1217   TODO: rounding => trunc */ 
    12091218#  define jit_emit_mov_mr_in(pc, mem, r) { \ 
    12101219    emitm_fld((pc), (r)); \ 
    12111220    jit_emit_fstore_m_i((pc), (mem)); \ 
    12121221} 
    12131222 
     1223/* TODO: rounding => trunc */ 
     1224#  define jit_emit_mov_MR_in(interp, pc, mem, r) {       \ 
     1225    if (r) { \ 
     1226        emitm_fld((pc), (r)); \ 
     1227        jit_emit_fstore_m_i((pc), (mem)); \ 
     1228    } \ 
     1229    else { \ 
     1230        jit_emit_fst_m_i((interp), (pc), emit_EBX, (d)); \ 
     1231    } \ 
     1232} 
     1233 
    12141234/* numvar <- ST(i) */ 
    1215 #  define jit_emit_mov_mr_n(pc, d, r) { \ 
     1235/* TODO: unused. jit_emit_mov_MR_n is used instead */ 
     1236#  define jit_emit_mov_mr_n(interp, pc, d, r) {  \ 
    12161237    emitm_fld((pc), (r)); \ 
    1217     jit_emit_fstore_m_n((pc), (d)); \ 
     1238    jit_emit_fstore_m_n((interp), (pc), (d)); \ 
    12181239} 
    12191240 
    12201241#  define jit_emit_mov_MR_n(interp, pc, d, r) { \ 
  • src/jit/i386/core.jit

    old new  
    101101    } 
    102102} 
    103103 
    104 ; these are wrong: fist does rounding, but we should truncate 
     104; These are wrong: first does rounding, but we should truncate 
     105; TODO: [5487]: JIT/i386 set_i_n did round. Test t/op/jitn.t  
    105106;Parrot_set_i_n { 
    106107;    if (MAP[2]) { 
    107 ;        jit_emit_mov_MR_in(NATIVECODE, ROFFS_INT(1), MAP[2]); 
     108;        jit_emit_mov_MR_in(interp, NATIVECODE, ROFFS_INT(1), MAP[2]); 
    108109;    } 
    109110;    else { 
    110 ;        jit_emit_mov_RM_n(NATIVECODE, FSR1, ROFFS_NUM(2)); 
    111 ;        jit_emit_mov_MR_in(NATIVECODE, ROFFS_INT(1), FSR1); 
     111;        jit_emit_mov_RM_n(interp, NATIVECODE, FSR1, ROFFS_NUM(2)); 
     112;        jit_emit_mov_MR_in(interp, NATIVECODE, ROFFS_INT(1), FSR1); 
    112113;    } 
    113114;    if (MAP[1]) { 
    114115;        jit_emit_mov_RM_i(interp, NATIVECODE, MAP[1], ROFFS_INT(1));