Author: leo
Date: Tue Jan 10 12:41:12 2006
New Revision: 11056

Modified:
   trunk/src/jit/i386/jit_emit.h
Log:
Math - Divide by zero #5

* throw exception for JIT/i386 div Nx, 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 12:41:12 2006
@@ -1511,12 +1511,10 @@ static unsigned char *lastpc;
 #  define jit_emit_add_ri_n(pc, r, m) jit_emit_xxx_rm_n(add, pc, r, m)
 #  define jit_emit_sub_ri_n(pc, r, m) jit_emit_xxx_rm_n(sub, pc, r, m)
 #  define jit_emit_mul_ri_n(pc, r, m) jit_emit_xxx_rm_n(mul, pc, r, m)
-#  define jit_emit_div_ri_n(pc, r, m) jit_emit_xxx_rm_n(div, pc, r, m)
 
 #  define jit_emit_add_RM_n(pc, r, o) jit_emit_xxx_RM_n(add, pc, r, o)
 #  define jit_emit_sub_RM_n(pc, r, o) jit_emit_xxx_RM_n(sub, pc, r, o)
 #  define jit_emit_mul_RM_n(pc, r, o) jit_emit_xxx_RM_n(mul, pc, r, o)
-#  define jit_emit_div_RM_n(pc, r, o) jit_emit_xxx_RM_n(div, pc, r, o)
 
 
 /* ST(r1) += ST(r2) */
@@ -1602,14 +1600,13 @@ static unsigned char *lastpc;
 
 /* ST(r1) /= ST(r2) */
 static char *
-div_rr_n(Parrot_jit_info_t *jit_info, int r1, int r2)
+div_rr_n(Parrot_jit_info_t *jit_info, int r1)
 {
     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);
+    jit_emit_test_r_n(pc, 0);   /* TOS */
     L1 = pc;
     emitm_jxs(pc, emitm_jnz, 0);
     emitm_pushl_i(pc, div_by_zero);
@@ -1626,7 +1623,20 @@ div_rr_n(Parrot_jit_info_t *jit_info, in
     return pc;
 }
 
-#  define jit_emit_div_rr_n(pc, r1, r2) pc = div_rr_n(jit_info, r1, r2)
+#  define jit_emit_div_rr_n(pc, r1, r2) \
+    emitm_fld(pc, r2); \
+    jit_info->native_ptr = pc; \
+    pc = div_rr_n(jit_info, r1)
+
+#  define jit_emit_div_ri_n(pc, r, m) \
+    jit_emit_fload_m_n(pc, m); \
+    jit_info->native_ptr = pc; \
+    pc = div_rr_n(jit_info, r)
+
+#  define jit_emit_div_RM_n(pc, r, o) \
+    jit_emit_fload_mb_n(pc, emit_EBX, o); \
+    jit_info->native_ptr = pc; \
+    pc = div_rr_n(jit_info, r)
 
 /* ST(i) %= MEM
  * please note the hardccded jumps */

Reply via email to