[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Dotgnu-pnet-commits] CVS: pnet/engine md_default.h, 1.2, 1.3 md_x86.c,
From: |
Rhys Weatherley <address@hidden> |
Subject: |
[Dotgnu-pnet-commits] CVS: pnet/engine md_default.h, 1.2, 1.3 md_x86.c, 1.3, 1.4 md_x86.h, 1.4, 1.5 unroll.c, 1.6, 1.7 unroll_arith.c, 1.1, 1.2 |
Date: |
Sat, 12 Jul 2003 00:47:53 -0400 |
Update of /cvsroot/dotgnu-pnet/pnet/engine
In directory subversions:/tmp/cvs-serv5952/engine
Modified Files:
md_default.h md_x86.c md_x86.h unroll.c unroll_arith.c
Log Message:
Unroll "fcmpl" and "fcmpg" for x86.
Index: md_default.h
===================================================================
RCS file: /cvsroot/dotgnu-pnet/pnet/engine/md_default.h,v
retrieving revision 1.2
retrieving revision 1.3
diff -C2 -r1.2 -r1.3
*** md_default.h 10 Jul 2003 07:28:17 -0000 1.2
--- md_default.h 12 Jul 2003 04:47:50 -0000 1.3
***************
*** 79,82 ****
--- 79,84 ----
#define md_neg_reg_float(inst,reg) \
do { ; } while (0)
+ #define md_cmp_reg_reg_float(inst,dreg,sreg1,sreg2,lessop) \
+ do { ; } while (0)
#endif
Index: md_x86.c
===================================================================
RCS file: /cvsroot/dotgnu-pnet/pnet/engine/md_x86.c,v
retrieving revision 1.3
retrieving revision 1.4
diff -C2 -r1.3 -r1.4
*** md_x86.c 11 Jul 2003 03:32:32 -0000 1.3
--- md_x86.c 12 Jul 2003 04:47:50 -0000 1.4
***************
*** 200,203 ****
--- 200,260 ----
}
+ md_inst_ptr _md_x86_cmp_float(md_inst_ptr inst, int dreg, int lessop)
+ {
+ md_inst_ptr patch1, patch2, patch3;
+
+ /* We need the EAX register to store the FPU status word */
+ if(dreg != X86_EAX)
+ {
+ x86_push_reg(inst, X86_EAX);
+ }
+
+ /* Compare the values and get the FPU status word */
+ x86_fcompp(inst);
+ x86_fnstsw(inst);
+ x86_alu_reg_imm(inst, X86_AND, X86_EAX, 0x4500);
+
+ /* Decode the FPU status word to determine the result */
+ x86_alu_reg_imm(inst, X86_CMP, X86_EAX, 0x4000); /* eq */
+ patch1 = inst;
+ x86_branch8(inst, X86_CC_NE, 0, 0);
+ x86_clear_reg(inst, X86_EAX);
+ patch2 = inst;
+ x86_jump8(inst, 0);
+ x86_patch(patch1, inst);
+ if(lessop)
+ {
+ x86_alu_reg_imm(inst, X86_CMP, X86_EAX, 0x0100); /* gt */
+ patch1 = inst;
+ x86_branch8(inst, X86_CC_NE, 0, 0);
+ x86_mov_reg_imm(inst, X86_EAX, 1);
+ patch3 = inst;
+ x86_jump8(inst, 0);
+ x86_patch(patch1, inst);
+ x86_mov_reg_imm(inst, X86_EAX, -1);
+ }
+ else
+ {
+ x86_alu_reg_imm(inst, X86_CMP, X86_EAX, 0x0000); /* lt */
+ patch1 = inst;
+ x86_branch8(inst, X86_CC_NE, 0, 0);
+ x86_mov_reg_imm(inst, X86_EAX, -1);
+ patch3 = inst;
+ x86_jump8(inst, 0);
+ x86_patch(patch1, inst);
+ x86_mov_reg_imm(inst, X86_EAX, 1);
+ }
+ x86_patch(patch2, inst);
+ x86_patch(patch3, inst);
+
+ /* Shift the result into the destination register */
+ if(dreg != X86_EAX)
+ {
+ x86_mov_reg_reg(inst, dreg, X86_EAX, 4);
+ x86_pop_reg(inst, X86_EAX);
+ }
+ return inst;
+ }
+
#ifdef __cplusplus
};
Index: md_x86.h
===================================================================
RCS file: /cvsroot/dotgnu-pnet/pnet/engine/md_x86.h,v
retrieving revision 1.4
retrieving revision 1.5
diff -C2 -r1.4 -r1.5
*** md_x86.h 11 Jul 2003 03:32:32 -0000 1.4
--- md_x86.h 12 Jul 2003 04:47:50 -0000 1.5
***************
*** 377,380 ****
--- 377,389 ----
/*
+ * Compare two floating point values and produce a -1, 0, or 1 result.
+ */
+ extern md_inst_ptr _md_x86_cmp_float(md_inst_ptr inst, int dreg, int lessop);
+ #define md_cmp_reg_reg_float(inst, dreg, sreg1, sreg2, lessop) \
+ do { \
+ (inst) = _md_x86_cmp_float((inst), (dreg),
(lessop)); \
+ } while (0)
+
+ /*
* Convert word registers between various types.
*/
Index: unroll.c
===================================================================
RCS file: /cvsroot/dotgnu-pnet/pnet/engine/unroll.c,v
retrieving revision 1.6
retrieving revision 1.7
diff -C2 -r1.6 -r1.7
*** unroll.c 12 Jul 2003 03:52:58 -0000 1.6
--- unroll.c 12 Jul 2003 04:47:50 -0000 1.7
***************
*** 470,473 ****
--- 470,500 ----
/*
+ * Check to see if the word register array/stack is full.
+ * If it is, then flush the entire register stack.
+ */
+ static void CheckWordFull(MDUnroll *unroll)
+ {
+ int index, reg, regmask;
+
+ /* Clear the cached local information */
+ unroll->cachedLocal = -1;
+ unroll->cachedReg = -1;
+
+ /* Search for an unused word register */
+ for(index = 0; index < 16 && regAllocOrder[index] != -1; ++index)
+ {
+ reg = regAllocOrder[index];
+ regmask = (1 << reg);
+ if((unroll->regsUsed & regmask) == 0)
+ {
+ return;
+ }
+ }
+
+ /* Flush the entire register stack */
+ FlushRegisterStack(unroll);
+ }
+
+ /*
* Check to see if the floating-point register array/stack is full.
* If it is, then flush the entire register stack.
Index: unroll_arith.c
===================================================================
RCS file: /cvsroot/dotgnu-pnet/pnet/engine/unroll_arith.c,v
retrieving revision 1.1
retrieving revision 1.2
diff -C2 -r1.1 -r1.2
*** unroll_arith.c 10 Jul 2003 07:28:17 -0000 1.1
--- unroll_arith.c 12 Jul 2003 04:47:50 -0000 1.2
***************
*** 319,322 ****
--- 319,358 ----
break;
+ #ifdef MD_HAS_FP
+
+ case 0x100 + COP_PREFIX_FCMPL:
+ {
+ /* Compare floating point values */
+ UNROLL_START();
+ CheckWordFull(&unroll);
+ GetTopTwoFPRegisters(&unroll, ®, ®2, 0);
+ reg3 = GetWordRegister(&unroll, MD_REG1_32BIT);
+ md_cmp_reg_reg_float(unroll.out, reg3, reg, reg2, 1);
+ FreeTopRegister(&unroll, -1);
+ FreeTopRegister(&unroll, -1);
+ FreeTopRegister(&unroll, -1);
+ PushRegister(&unroll, reg3, MD_REG1_32BIT);
+ MODIFY_UNROLL_PC(CVMP_LEN_NONE);
+ }
+ break;
+
+ case 0x100 + COP_PREFIX_FCMPG:
+ {
+ /* Compare floating point values */
+ UNROLL_START();
+ CheckWordFull(&unroll);
+ GetTopTwoFPRegisters(&unroll, ®, ®2, 0);
+ reg3 = GetWordRegister(&unroll, MD_REG1_32BIT);
+ md_cmp_reg_reg_float(unroll.out, reg3, reg, reg2, 0);
+ FreeTopRegister(&unroll, -1);
+ FreeTopRegister(&unroll, -1);
+ FreeTopRegister(&unroll, -1);
+ PushRegister(&unroll, reg3, MD_REG1_32BIT);
+ MODIFY_UNROLL_PC(CVMP_LEN_NONE);
+ }
+ break;
+
+ #endif /* MD_HAS_FP */
+
case 0x100 + COP_PREFIX_ICMP:
{
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [Dotgnu-pnet-commits] CVS: pnet/engine md_default.h, 1.2, 1.3 md_x86.c, 1.3, 1.4 md_x86.h, 1.4, 1.5 unroll.c, 1.6, 1.7 unroll_arith.c, 1.1, 1.2,
Rhys Weatherley <address@hidden> <=