dotgnu-pnet-commits
[Top][All Lists]
Advanced

[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, &reg, &reg2, 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, &reg, &reg2, 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:
  {





reply via email to

[Prev in Thread] Current Thread [Next in Thread]