Author: leo
Date: Tue Jan 10 12:21:00 2006
New Revision: 11054
Modified:
trunk/src/jit/i386/jit_emit.h
Log:
Math - Divide by zero #4
* throw exception for JIT/i386 div Nx, Ny (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 12:21:00 2006
@@ -1587,12 +1587,47 @@ static unsigned char *lastpc;
emitm_fstp(pc, (r+1)); \
}
+/* test r for zero */
+# define jit_emit_test_r_n(pc, r) { \
+ if (r) { \
+ emitm_fxch(pc, r); \
+ } \
+ emitm_ftst(pc); \
+ emitm_fstw(pc); \
+ emitm_sahf(pc); \
+ if (r) { \
+ emitm_fxch(pc, r); \
+ } \
+}
+
/* ST(r1) /= ST(r2) */
-# define jit_emit_div_rr_n(pc, r1, r2) { \
- emitm_fld(pc, r2); \
- emitm_fdivp(pc, (r1+1)); \
+static char *
+div_rr_n(Parrot_jit_info_t *jit_info, int r1, int r2)
+{
+ char *L1;
+ static const char* div_by_zero = "Divide by zero";
+ char *pc = jit_info->native_ptr;
+
+ emitm_fld(pc, r2);
+ jit_emit_test_r_n(pc, r2);
+ 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;
+ emitm_fdivp(pc, (r1+1));
+ return pc;
}
+# define jit_emit_div_rr_n(pc, r1, r2) pc = div_rr_n(jit_info, r1, r2)
+
/* ST(i) %= MEM
* please note the hardccded jumps */
# define jit_emit_cmod_RM_n(pc, r, offs) { \
@@ -1679,19 +1714,6 @@ static unsigned char *lastpc;
} \
}
-/* test r for zero */
-# define jit_emit_test_r_n(pc, r) { \
- if (r) { \
- emitm_fxch(pc, r); \
- } \
- emitm_ftst(pc); \
- emitm_fstw(pc); \
- emitm_sahf(pc); \
- if (r) { \
- emitm_fxch(pc, r); \
- } \
-}
-
# define jit_emit_neg_M_i(pc, offs) \
emitm_negl_m(pc, emit_EBX, emit_None, 1, (long)offs)