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

Reply via email to