Author: leo
Date: Sun Feb 19 10:47:37 2006
New Revision: 11668
Modified:
trunk/src/jit/i386/jit_emit.h
Log:
JIT/x86 - implement better sub op
* jit_emit_sub_rr_n uses specialized opcodes if either register is
TOS (top of stack)
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 10:47:37 2006
@@ -1078,6 +1078,7 @@ static unsigned char *lastpc;
/* 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)
+# define emitm_fsubr(pc, sti) emitm_fl_3(pc, emit_b100, emit_b100, sti)
/* 0xDD ops */
/* FFree ST(i) */
@@ -1608,10 +1609,22 @@ static unsigned char *lastpc;
}
/* ST(r1) -= ST(r2) */
-# define jit_emit_sub_rr_n(pc, r1, r2) { \
- emitm_fld(pc, r2); \
- emitm_fsubp(pc, (r1+1)); \
-}
+/* r1 == 0: ST(0) <- ST(0) - ST(i)
+ * r2 == 0: ST(i) <- ST(i) - ST(0)
+ */
+# define jit_emit_sub_rr_n(pc, r1, r2) do { \
+ if (!r1) { \
+ emitm_fsub(pc, r2); \
+ } \
+ else if (!r2) { \
+ emitm_fsubr(pc, r1); \
+ } \
+ else { \
+ emitm_fld(pc, r2); \
+ emitm_fsubp(pc, (r1+1)); \
+ } \
+ } \
+ while (0)
/*
* ST(r) -= INT_REG