Author: leo
Date: Tue Jan 10 13:01:06 2006
New Revision: 11059
Modified:
trunk/src/jit/i386/jit_emit.h
Log:
Math - Divide by zero #6
* throw exception for JIT/i386 mod Nx, y (y = 0.0)
Modified: trunk/src/jit/i386/jit_emit.h
==============================================================================
--- trunk/src/jit/i386/jit_emit.h (original)
+++ trunk/src/jit/i386/jit_emit.h Tue Jan 10 13:01:06 2006
@@ -1638,44 +1638,56 @@ div_rr_n(Parrot_jit_info_t *jit_info, in
jit_info->native_ptr = pc; \
pc = div_rr_n(jit_info, r)
+static char *
+mod_rr_n(Parrot_jit_info_t *jit_info, int r)
+{
+ char *L1;
+ static const char* div_by_zero = "Divide by zero";
+ char *pc = jit_info->native_ptr;
+
+ jit_emit_test_r_n(pc, 0); /* TOS */
+ L1 = pc;
+ emitm_jxs(pc, emitm_jnz, 0);
+ emitm_pushl_i(pc, div_by_zero);
+ emitm_pushl_i(pc, E_ZeroDivisionError);
+ emitm_pushl_i(pc, 0); /* NULL */
+ Parrot_jit_emit_get_INTERP(pc, emit_ECX);
+ emitm_pushl_r(pc, emit_ECX);
+ jit_info->native_ptr = pc;
+ call_func(jit_info, (void*) real_exception);
+ pc = jit_info->native_ptr;
+ /* L1: */
+ L1[1] = pc - L1 - 2;
+ /* L2: */
+ emitm_fxch(pc, 1);
+ emitm_fprem(pc);
+ emitm_fstw(pc);
+ emitm_sahf(pc);
+ emitm_jxs(pc, emitm_jp, -7); /* jo L2 */
+ emitm_fstp(pc, (r+1));
+ return pc;
+}
+
/* ST(i) %= MEM
* please note the hardccded jumps */
-# define jit_emit_cmod_RM_n(pc, r, offs) { \
+# define jit_emit_cmod_RM_n(pc, r, offs) \
if (r) \
emitm_fxch(pc, r); \
jit_emit_fload_mb_n(pc, emit_EBX, offs); \
- emitm_fxch(pc, 1); \
- emitm_fprem(pc); \
- emitm_fstw(pc); \
- emitm_sahf(pc); \
- emitm_jxs(pc, emitm_jp, -7); \
- emitm_fstp(pc, (r+1)); \
-}
+ pc = mod_rr_n(jit_info, r)
-# define jit_emit_cmod_ri_n(pc, r, mem) { \
+# define jit_emit_cmod_ri_n(pc, r, mem) \
if (r) \
emitm_fxch(pc, r); \
jit_emit_fload_m_n(pc, mem); \
- emitm_fxch(pc, 1); \
- emitm_fprem(pc); \
- emitm_fstw(pc); \
- emitm_sahf(pc); \
- emitm_jxs(pc, emitm_jp, -7); \
- emitm_fstp(pc, (r+1)); \
-}
+ pc = mod_rr_n(jit_info, r)
/* ST(r1) %= ST(r2) */
-# define jit_emit_cmod_rr_n(pc, r1, r2) { \
+# define jit_emit_cmod_rr_n(pc, r1, r2) \
if (r1) \
emitm_fxch(pc, r1); \
emitm_fld(pc, r2); \
- emitm_fxch(pc, 1); \
- emitm_fprem(pc); \
- emitm_fstw(pc); \
- emitm_sahf(pc); \
- emitm_jxs(pc, emitm_jp, -7); \
- emitm_fstp(pc, (r1+1)); \
-}
+ pc = mod_rr_n(jit_info, r1)
/* compare ST(r) <-> mem i.e. constant */
# define jit_emit_cmp_ri_n(pc, r, mem) { \