[Top][All Lists]
[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;
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [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,
Rhys Weatherley <address@hidden> <=