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)

Reply via email to