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 cvm_lengths.c,1.6,1.7 cvm_ptr.c,


From: Rhys Weatherley <address@hidden>
Subject: [Dotgnu-pnet-commits] CVS: pnet/engine cvm_lengths.c,1.6,1.7 cvm_ptr.c,1.32,1.33 cvmc_call.c,1.21,1.22 verify_call.c,1.29,1.30
Date: Fri, 27 Dec 2002 07:25:11 -0500

Update of /cvsroot/dotgnu-pnet/pnet/engine
In directory subversions:/tmp/cvs-serv9438/engine

Modified Files:
        cvm_lengths.c cvm_ptr.c cvmc_call.c verify_call.c 
Log Message:


Inline 2-D array accesses with new CVM instructions, which speeds up the Float
benchmark in PNetMark quite considerably.


Index: cvm_lengths.c
===================================================================
RCS file: /cvsroot/dotgnu-pnet/pnet/engine/cvm_lengths.c,v
retrieving revision 1.6
retrieving revision 1.7
diff -C2 -r1.6 -r1.7
*** cvm_lengths.c       28 Jun 2002 01:05:53 -0000      1.6
--- cvm_lengths.c       27 Dec 2002 12:25:09 -0000      1.7
***************
*** 408,411 ****
--- 408,413 ----
        /* fwrite_elem */               CVMP_LEN_NONE,
        /* dwrite_elem */               CVMP_LEN_NONE,
+       /* get2d */                             CVMP_LEN_NONE,
+       /* set2d */                             CVMP_LEN_WORD,
  
        /*
***************
*** 428,433 ****
         * Reserved opcodes.
         */
-       /* preserved_1c */              CVMP_LEN_NONE,
-       /* preserved_1d */              CVMP_LEN_NONE,
        /* preserved_1e */              CVMP_LEN_NONE,
  
--- 430,433 ----

Index: cvm_ptr.c
===================================================================
RCS file: /cvsroot/dotgnu-pnet/pnet/engine/cvm_ptr.c,v
retrieving revision 1.32
retrieving revision 1.33
diff -C2 -r1.32 -r1.33
*** cvm_ptr.c   1 Dec 2002 07:43:05 -0000       1.32
--- cvm_ptr.c   27 Dec 2002 12:25:09 -0000      1.33
***************
*** 3300,3308 ****
                        (stacktop - tempNum - 3)->ptrValue = (void *)
                                (((unsigned char *)(array->data)) +
!                                index1 * array->bounds[0].multiplier +
!                                index2 * array->bounds[1].multiplier);
                        ILMemMove(stacktop - tempNum - 2, stacktop - tempNum,
                                          tempNum * sizeof(CVMWord));
!                       MODIFY_PC_AND_STACK(CVMP_LEN_NONE, -2);
                }
                else
--- 3300,3308 ----
                        (stacktop - tempNum - 3)->ptrValue = (void *)
                                (((unsigned char *)(array->data)) +
!                                (index1 * array->bounds[0].multiplier +
!                                 index2 * array->bounds[1].multiplier) * 
array->elemSize);
                        ILMemMove(stacktop - tempNum - 2, stacktop - tempNum,
                                          tempNum * sizeof(CVMWord));
!                       MODIFY_PC_AND_STACK(CVMP_LEN_WORD, -2);
                }
                else

Index: cvmc_call.c
===================================================================
RCS file: /cvsroot/dotgnu-pnet/pnet/engine/cvmc_call.c,v
retrieving revision 1.21
retrieving revision 1.22
diff -C2 -r1.21 -r1.22
*** cvmc_call.c 15 Nov 2002 01:37:42 -0000      1.21
--- cvmc_call.c 27 Dec 2002 12:25:09 -0000      1.22
***************
*** 302,305 ****
--- 302,353 ----
                }
                /* Not reached */
+ 
+               case IL_INLINEMETHOD_GET2D_INT:
+               {
+                       CVMP_OUT_NONE(COP_PREFIX_GET2D);
+                       CVM_OUT_NONE(COP_IREAD);
+                       return 1;
+               }
+               /* Not reached */
+ 
+               case IL_INLINEMETHOD_GET2D_OBJECT:
+               {
+                       CVMP_OUT_NONE(COP_PREFIX_GET2D);
+                       CVM_OUT_NONE(COP_PREAD);
+                       return 1;
+               }
+               /* Not reached */
+ 
+               case IL_INLINEMETHOD_GET2D_DOUBLE:
+               {
+                       CVMP_OUT_NONE(COP_PREFIX_GET2D);
+                       CVM_OUT_NONE(COP_DREAD);
+                       return 1;
+               }
+               /* Not reached */
+ 
+               case IL_INLINEMETHOD_SET2D_INT:
+               {
+                       CVMP_OUT_WORD(COP_PREFIX_SET2D, 1);
+                       CVM_OUT_NONE(COP_IWRITE);
+                       return 1;
+               }
+               /* Not reached */
+ 
+               case IL_INLINEMETHOD_SET2D_OBJECT:
+               {
+                       CVMP_OUT_WORD(COP_PREFIX_SET2D, 1);
+                       CVM_OUT_NONE(COP_PWRITE);
+                       return 1;
+               }
+               /* Not reached */
+ 
+               case IL_INLINEMETHOD_SET2D_DOUBLE:
+               {
+                       CVMP_OUT_WORD(COP_PREFIX_SET2D, 
CVM_WORDS_PER_NATIVE_FLOAT);
+                       CVM_OUT_NONE(COP_DWRITE);
+                       return 1;
+               }
+               /* Not reached */
        }
  

Index: verify_call.c
===================================================================
RCS file: /cvsroot/dotgnu-pnet/pnet/engine/verify_call.c,v
retrieving revision 1.29
retrieving revision 1.30
diff -C2 -r1.29 -r1.30
*** verify_call.c       22 Nov 2002 23:03:26 -0000      1.29
--- verify_call.c       27 Dec 2002 12:25:09 -0000      1.30
***************
*** 799,802 ****
--- 799,820 ----
  
  /*
+  * Determine if a class corresponds to a synthetic 2-D array type.
+  */
+ static int Is2DArrayClass(ILClass *classInfo)
+ {
+       ILType *type;
+       type = ILClassGetSynType(ILClassResolve(classInfo));
+       if(type && ILType_IsArray(type))
+       {
+               if(ILType_Kind(type) == IL_TYPE_COMPLEX_ARRAY_CONTINUE &&
+                  ILType_Kind(ILType_ElemType(type)) == IL_TYPE_COMPLEX_ARRAY)
+               {
+                       return 1;
+               }
+       }
+       return 0;
+ }
+ 
+ /*
   * Determine if a method is inlineable, and return its inline type.
   * Returns -1 if the method is not inlineable.
***************
*** 927,930 ****
--- 945,987 ----
                {
                        return IL_INLINEMETHOD_TYPE_FROM_HANDLE;
+               }
+               return -1;
+       }
+       else if(Is2DArrayClass(owner))
+       {
+               /* Two-dimensional array operation */
+               name = ILMethod_Name(method);
+               signature = ILMethod_Signature(method);
+               if(!strcmp(name, "Get"))
+               {
+                       signature = ILTypeGetReturn(signature);
+                       if(signature == ILType_Int32)
+                       {
+                               return IL_INLINEMETHOD_GET2D_INT;
+                       }
+                       else if(signature == ILType_Float64)
+                       {
+                               return IL_INLINEMETHOD_GET2D_DOUBLE;
+                       }
+                       else if(ILType_IsClass(signature))
+                       {
+                               return IL_INLINEMETHOD_GET2D_OBJECT;
+                       }
+               }
+               else if(!strcmp(name, "Set") && ILTypeNumParams(signature) > 0)
+               {
+                       signature = ILTypeGetParam(signature, 
ILTypeNumParams(signature));
+                       if(signature == ILType_Int32)
+                       {
+                               return IL_INLINEMETHOD_SET2D_INT;
+                       }
+                       else if(signature == ILType_Float64)
+                       {
+                               return IL_INLINEMETHOD_SET2D_DOUBLE;
+                       }
+                       else if(ILType_IsClass(signature))
+                       {
+                               return IL_INLINEMETHOD_SET2D_OBJECT;
+                       }
                }
                return -1;




reply via email to

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