Author: leo
Date: Sun Feb 19 09:27:08 2006
New Revision: 11667
Modified:
trunk/src/jit/i386/core.jit
trunk/src/jit/i386/jit_emit.h
Log:
JIT/x86 - implement better mul, add ops
* jit_emit_<op>_rr_n uses specialized opcodes if either register is
TOS (top of stack)
* use it in pow
Modified: trunk/src/jit/i386/core.jit
==============================================================================
--- trunk/src/jit/i386/core.jit (original)
+++ trunk/src/jit/i386/core.jit Sun Feb 19 09:27:08 2006
@@ -1724,11 +1724,11 @@ Parrot_pow_n_n_i {
jit_emit_test_ri_i(NATIVECODE, emit_EAX, 1); /* e & 1 ? */
L5 = NATIVECODE;
emitm_jxs(NATIVECODE, emitm_jz, 0); /* jz L5 */
- emitm_fmulr(NATIVECODE, 1); /* res *= n2 */
+ jit_emit_mul_rr_n(NATIVECODE, 1, 0); /* res *= n2 */
/* L5: */
L5[1] = NATIVECODE - L5 - 2;
jit_emit_lsr_ri_i(NATIVECODE, emit_EAX, 1); /* e >>= 1 */
- emitm_fmul(NATIVECODE, 0); /* n2 *= n2 */
+ jit_emit_mul_rr_n(NATIVECODE, 0, 0); /* n2 *= n2 */
/* lsr is setting flags - branch past test at L3 */
emitm_jxs(NATIVECODE, emitm_jnz, (L3 - NATIVECODE - 1)); /* jmp L3 */
/* endwhile */
Modified: trunk/src/jit/i386/jit_emit.h
==============================================================================
--- trunk/src/jit/i386/jit_emit.h (original)
+++ trunk/src/jit/i386/jit_emit.h Sun Feb 19 09:27:08 2006
@@ -1076,6 +1076,7 @@ static unsigned char *lastpc;
/* FCMOV*, FCOMI PPRO */
/* 0xDC like 0xD8 with reversed operands */
+# define emitm_faddr(pc, sti) emitm_fl_3(pc, emit_b100, emit_b000, sti)
# define emitm_fmulr(pc, sti) emitm_fl_3(pc, emit_b100, emit_b001, sti)
/* 0xDD ops */
@@ -1581,11 +1582,22 @@ static unsigned char *lastpc;
/* ST(r1) += ST(r2) */
-# define jit_emit_add_rr_n(pc, r1, r2) { \
- emitm_fld(pc, r2); \
- emitm_faddp(pc, (r1+1)); \
-}
-
+/* r1 == 0: ST(0) <- ST(0) + ST(i)
+ * r2 == 0: ST(i) <- ST(0) + ST(i)
+ */
+# define jit_emit_add_rr_n(pc, r1, r2) do { \
+ if (!r1) { \
+ emitm_fadd(pc, r2); \
+ } \
+ else if (!r2) { \
+ emitm_faddr(pc, r1); \
+ } \
+ else { \
+ emitm_fld(pc, r2); \
+ emitm_faddp(pc, (r1+1)); \
+ } \
+ } \
+ while (0)
/*
* ST(r) += INT_REG
*/
@@ -1625,10 +1637,22 @@ static unsigned char *lastpc;
}
/* ST(r1) *= ST(r2) */
-# define jit_emit_mul_rr_n(pc, r1, r2) { \
- emitm_fld(pc, r2); \
- emitm_fmulp(pc, (r1+1)); \
-}
+/* r1 == 0: ST(0) <- ST(0) * ST(i)
+ * r2 == 0: ST(i) <- ST(0) * ST(i)
+ */
+# define jit_emit_mul_rr_n(pc, r1, r2) do { \
+ if (!r1) { \
+ emitm_fmul(pc, r2); \
+ } \
+ else if (!r2) { \
+ emitm_fmulr(pc, r1); \
+ } \
+ else { \
+ emitm_fld(pc, r2); \
+ emitm_fmulp(pc, (r1+1)); \
+ } \
+ } \
+ while (0)
/*
* ST(r) *= INT_REG