Ticket #353: tt353-jit-i386-set_i_n.patch
File tt353-jit-i386-set_i_n.patch, 3.8 KB (added by rurban, 13 years ago) |
---|
-
src/jit/i386/core.jit
old new 103 103 104 104 ; These are wrong: first does rounding, but we should truncate 105 105 ; TODO: [5487]: JIT/i386 set_i_n did round. Test t/op/jitn.t 106 ;Parrot_set_i_n {107 ;if (MAP[2]) {108 ;jit_emit_mov_MR_in(interp, NATIVECODE, ROFFS_INT(1), MAP[2]);109 ;}110 ;else {111 ;jit_emit_mov_RM_n(interp, NATIVECODE, FSR1, ROFFS_NUM(2));112 ;jit_emit_mov_MR_in(interp, NATIVECODE, ROFFS_INT(1), FSR1);113 ;}114 ;if (MAP[1]) {115 ;jit_emit_mov_RM_i(interp, NATIVECODE, MAP[1], ROFFS_INT(1));116 ;}117 ;}118 ; 119 ;Parrot_set_i_nc {120 ;jit_emit_mov_ri_n(interp, NATIVECODE, FSR1, &NUM_CONST[2]);121 ; jit_emit_mov_MR_in(NATIVECODE, ROFFS_INT(1), FSR1);122 ;if (MAP[1]) {123 ;jit_emit_mov_RM_i(interp, NATIVECODE, MAP[1], ROFFS_INT(1));124 ;}125 ;}106 Parrot_set_i_n { 107 if (MAP[2]) { 108 jit_emit_mov_MR_in(interp, NATIVECODE, ROFFS_INT(1), MAP[2]); 109 } 110 else { 111 jit_emit_mov_RM_n(interp, NATIVECODE, FSR1, ROFFS_NUM(2)); 112 jit_emit_mov_MR_in(interp, NATIVECODE, ROFFS_INT(1), FSR1); 113 } 114 if (MAP[1]) { 115 jit_emit_mov_RM_i(interp, NATIVECODE, MAP[1], ROFFS_INT(1)); 116 } 117 } 118 119 Parrot_set_i_nc { 120 jit_emit_mov_ri_n(interp, NATIVECODE, FSR1, &NUM_CONST[2]); 121 jit_emit_mov_MR_in(interp, NATIVECODE, ROFFS_INT(1), FSR1); 122 if (MAP[1]) { 123 jit_emit_mov_RM_i(interp, NATIVECODE, MAP[1], ROFFS_INT(1)); 124 } 125 } 126 126 127 127 ; -- null op. 128 128 TEMPLATE Parrot_null_x { -
src/jit/i386/jit_emit.h
old new 737 737 emitm_fildl((interp), (pc), emit_None, emit_None, emit_None, (address)) 738 738 # define jit_emit_fload_mb_i(interp, pc, offs) \ 739 739 emitm_fildl((interp), (pc), emit_EBX, emit_None, 1, (offs)) 740 # define jit_emit_fstore_m_i(pc, m) \ 741 emitm_fistpl((pc), emit_None, emit_None, emit_None, (m)) 740 # define jit_emit_fstore_m_i(interp, pc, m) \ 741 emitm_fistpl((interp), (pc), emit_None, emit_None, emit_None, (m)) 742 # define jit_emit_fst_m_i(interp, pc, base, offs) \ 743 emitm_fstl((interp), (pc), (base), emit_None, 1, (offs)) 742 744 743 745 #else /* INTVAL_SIZE = 8 */ 744 746 … … 746 748 emitm_fildll((interp), (pc), emit_None, emit_None, emit_None, (address)) 747 749 # define jit_emit_fload_mb_i(interp, pc, offs) \ 748 750 emitm_fildll((interp), (pc), emit_EBX, emit_None, 1, (offs)) 749 # define jit_emit_fstore_m_i(pc, m) \ 750 emitm_fistpll((pc), emit_None, emit_None, emit_None, (m)) 751 # define jit_emit_fstore_m_i(interp, pc, m) \ 752 emitm_fistpll((interp), (pc), emit_None, emit_None, emit_None, (m)) 753 # define jit_emit_fst_m_i(interp, pc, base, offs) \ 754 emitm_fstll((interp), (pc), (base), emit_None, 1, (offs)) 751 755 752 756 #endif /* INTVAL_SIZE */ 753 757 … … 1215 1219 /* INT_REG <= ST(i) */ 1216 1220 /* TODO: unused. jit_emit_mov_MR_in is used instead. 1217 1221 TODO: rounding => trunc */ 1218 # define jit_emit_mov_mr_in( pc, mem, r) { \1222 # define jit_emit_mov_mr_in(interp, pc, mem, r) { \ 1219 1223 emitm_fld((pc), (r)); \ 1220 jit_emit_fstore_m_i(( pc), (mem)); \1224 jit_emit_fstore_m_i((interp), (pc), (mem)); \ 1221 1225 } 1222 1226 1223 1227 /* TODO: rounding => trunc */ 1224 1228 # define jit_emit_mov_MR_in(interp, pc, mem, r) { \ 1225 1229 if (r) { \ 1226 1230 emitm_fld((pc), (r)); \ 1227 jit_emit_fstore_m_i(( pc), (mem)); \1231 jit_emit_fstore_m_i((interp), (pc), (mem)); \ 1228 1232 } \ 1229 1233 else { \ 1230 jit_emit_fst_m_i((interp), (pc), emit_EBX, ( d)); \1234 jit_emit_fst_m_i((interp), (pc), emit_EBX, (mem)); \ 1231 1235 } \ 1232 1236 } 1233 1237