Author: leo
Date: Tue Jan 10 15:31:10 2006
New Revision: 11069

Modified:
   trunk/src/jit/ppc/core.jit
   trunk/src/jit/ppc/jit_emit.h
Log:
Math - Divide by zero #9 / cmod

* implement all cmod Ix, I.. JIT/ppc variants


Modified: trunk/src/jit/ppc/core.jit
==============================================================================
--- trunk/src/jit/ppc/core.jit  (original)
+++ trunk/src/jit/ppc/core.jit  Tue Jan 10 15:31:10 2006
@@ -245,8 +245,12 @@ Parrot_mul_i_i {
     Parrot_binop_x_x s/<_N>/_i/ s/<op>/mul/ s/<s1>/ISR1/ s/<s2>/ISR2/ 
s/<T>/INT/
 }
 
-Parrot_div_i_i {
-    Parrot_binop_x_x s/<_N>/_i/ s/<op>/div/ s/<s1>/ISR1/ s/<s2>/ISR2/ 
s/<T>/INT/
+parrot_div_i_i {
+    parrot_binop_x_x s/<_n>/_i/ s/<op>/div/ s/<s1>/isr1/ s/<s2>/isr2/ 
s/<t>/int/
+}
+
+parrot_cmod_i_i {
+    parrot_binop_x_x s/<_n>/_i/ s/<op>/cmod/ s/<s1>/isr1/ s/<s2>/isr2/ 
s/<t>/int/
 }
 
 Parrot_band_i_ic {
@@ -277,6 +281,10 @@ Parrot_div_i_ic {
     Parrot_binop_i_ic s/<op>/div/
 }
 
+Parrot_cmod_i_ic {
+    Parrot_binop_i_ic s/<op>/cmod/
+}
+
 Parrot_add_n_n {
     Parrot_binop_x_x s/<_N>/_n/ s/<op>/fadd/ s/<s1>/FSR1/ s/<s2>/FSR2/ 
s/<T>/NUM/
 }
@@ -321,6 +329,10 @@ Parrot_div_i_i_i {
     Parrot_binop_x_x_x s/<_N>/_i/ s/<op>/div/ s/<s1>/ISR1/ s/<s2>/ISR2/ 
s/<T>/INT/
 }
 
+Parrot_cmod_i_i_i {
+    Parrot_binop_x_x_x s/<_N>/_i/ s/<op>/cmod/ s/<s1>/ISR1/ s/<s2>/ISR2/ 
s/<T>/INT/
+}
+
 Parrot_band_i_i_ic {
     Parrot_binop_i_i_ic s/<op>/and/
 }
@@ -349,6 +361,10 @@ Parrot_div_i_i_ic {
     Parrot_binop_i_i_ic s/<op>/div/
 }
 
+Parrot_cmod_i_i_ic {
+    Parrot_binop_i_i_ic s/<op>/cmod/
+}
+
 Parrot_band_i_ic_i {
     Parrot_binop_i_ic_i s/<op>/and/
 }
@@ -377,6 +393,10 @@ Parrot_div_i_ic_i {
     Parrot_binop_i_ic_i s/<op>/div/
 }
 
+Parrot_cmod_i_ic_i {
+    Parrot_binop_i_ic_i s/<op>/cmod/
+}
+
 Parrot_add_n_n_n {
     Parrot_binop_x_x_x s/<_N>/_n/ s/<op>/fadd/ s/<s1>/FSR1/ s/<s2>/FSR2/ 
s/<T>/NUM/
 }
@@ -393,63 +413,6 @@ Parrot_div_n_n_n {
     Parrot_binop_x_x_x s/<_N>/_n/ s/<op>/fdiv/ s/<s1>/FSR1/ s/<s2>/FSR2/ 
s/<T>/NUM/
 }
 
-Parrot_cmod_i_i_i {
-    if (MAP[1] && MAP[2] && MAP[3]) {
-        jit_emit_div_rrr(NATIVECODE, MAP[1], MAP[2], MAP[3]);
-        jit_emit_mul_rrr(NATIVECODE, MAP[1], MAP[1], MAP[3]);
-        jit_emit_sub_rrr(NATIVECODE, MAP[1], MAP[2], MAP[1]);
-    }
-    else if (MAP[1] && MAP[2]) {
-        jit_emit_mov_rm_i(NATIVECODE, ISR1, ROFFS_INT(3));
-        jit_emit_div_rrr(NATIVECODE, MAP[1], MAP[2], ISR1);
-        jit_emit_mul_rrr(NATIVECODE, MAP[1], MAP[1], ISR1);
-        jit_emit_sub_rrr(NATIVECODE, MAP[1], MAP[2], MAP[1]);
-    }
-    else if (MAP[1] && MAP[3]) {
-        jit_emit_mov_rm_i(NATIVECODE, ISR1, ROFFS_INT(2));
-        jit_emit_div_rrr(NATIVECODE, MAP[1], ISR1, MAP[3]);
-        jit_emit_mul_rrr(NATIVECODE, MAP[1], MAP[1], MAP[3]);
-        jit_emit_sub_rrr(NATIVECODE, MAP[1], ISR1, MAP[1]);
-    }
-    else if (MAP[2] && MAP[3]) {
-        jit_emit_div_rrr(NATIVECODE, ISR1, MAP[2], MAP[3]);
-        jit_emit_mul_rrr(NATIVECODE, ISR1, ISR1, MAP[3]);
-        jit_emit_sub_rrr(NATIVECODE, ISR1, MAP[2], ISR1);
-        jit_emit_mov_mr_i(NATIVECODE, ROFFS_INT(1), ISR1);
-    }
-    else if (MAP[1]) {
-        jit_emit_mov_rm_i(NATIVECODE, ISR2, ROFFS_INT(3));
-        jit_emit_mov_rm_i(NATIVECODE, ISR1, ROFFS_INT(2));
-        jit_emit_div_rrr(NATIVECODE, MAP[1], ISR1, ISR2);
-        jit_emit_mul_rrr(NATIVECODE, MAP[1], MAP[1], ISR2);
-        jit_emit_sub_rrr(NATIVECODE, MAP[1], ISR1, MAP[1]);
-    }
-    else if (MAP[2]) {
-        jit_emit_mov_rm_i(NATIVECODE, ISR1, ROFFS_INT(3));
-        jit_emit_div_rrr(NATIVECODE, ISR2, MAP[2], ISR1);
-        jit_emit_mul_rrr(NATIVECODE, ISR2, ISR2, ISR1);
-        jit_emit_sub_rrr(NATIVECODE, ISR2, MAP[2], ISR2);
-        jit_emit_mov_mr_i(NATIVECODE, ROFFS_INT(1), ISR2);
-    }
-    else if (MAP[3]) {
-        jit_emit_mov_rm_i(NATIVECODE, ISR2, ROFFS_INT(2));
-        jit_emit_div_rrr(NATIVECODE, ISR1, ISR2, MAP[3]);
-        jit_emit_mul_rrr(NATIVECODE, ISR1, ISR1, MAP[3]);
-        jit_emit_sub_rrr(NATIVECODE, ISR1, ISR2, ISR1);
-        jit_emit_mov_mr_i(NATIVECODE, ROFFS_INT(1), ISR1);
-    }
-    else {
-; XXX: blech.  Not enough temp registers.
-        jit_emit_mov_rm_i(NATIVECODE, ISR2, ROFFS_INT(3));
-        jit_emit_mov_rm_i(NATIVECODE, ISR1, ROFFS_INT(2));
-        jit_emit_div_rrr(NATIVECODE, ISR1, ISR1, ISR2);
-        jit_emit_mul_rrr(NATIVECODE, ISR1, ISR1, ISR2);
-        jit_emit_mov_rm_i(NATIVECODE, ISR2, ROFFS_INT(2));
-        jit_emit_sub_rrr(NATIVECODE, ISR1, ISR1, ISR2);
-        jit_emit_mov_mr_i(NATIVECODE, ROFFS_INT(1), ISR1);
-    }
-}
-
 Parrot_inc_i {
     if (MAP[1]) {
         jit_emit_add_rri_i (NATIVECODE, MAP[1], MAP[1], 1);

Modified: trunk/src/jit/ppc/jit_emit.h
==============================================================================
--- trunk/src/jit/ppc/jit_emit.h        (original)
+++ trunk/src/jit/ppc/jit_emit.h        Tue Jan 10 15:31:10 2006
@@ -679,9 +679,24 @@ fdiv_rrr(Parrot_jit_info_t *jit_info, ch
     jit_emit_fdiv_rrr_no_check(pc, D, A, B);
     return pc;
 }
+
 #  define jit_emit_div_rrr(pc, D, A, B) pc = div_rrr(jit_info, D, A, B)
 #  define jit_emit_fdiv_rrr(pc, D, A, B) pc = fdiv_rrr(jit_info, D, A, B)
 
+/* XXX except A = -2^31 and B = -1 */
+
+static char *
+cmod_rrr(Parrot_jit_info_t *jit_info, char D, char A, char B)
+{
+    char *pc;
+    pc = div_rrr(jit_info, D, A, B); 
+    jit_emit_mul_rrr(pc, D, D, B); 
+    jit_emit_sub_rrr(pc, D, A, D); 
+    return pc;
+}
+
+#  define jit_emit_cmod_rrr(pc, D, A, B) pc = cmod_rrr(jit_info, D, A, B)
+
 #endif /* JIT_EMIT */
 
 void Parrot_ppc_jit_restore_nonvolatile_registers(void);

Reply via email to