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);