[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[dotgnu-pnet-commits] pnet ChangeLog engine/jitc_obj.c engine/jitc_pt...
From: |
Klaus Treichel |
Subject: |
[dotgnu-pnet-commits] pnet ChangeLog engine/jitc_obj.c engine/jitc_pt... |
Date: |
Fri, 13 Oct 2006 15:04:03 +0000 |
CVSROOT: /cvsroot/dotgnu-pnet
Module name: pnet
Changes by: Klaus Treichel <ktreichel> 06/10/13 15:04:03
Modified files:
. : ChangeLog
engine : jitc_obj.c jitc_ptr.c jitc_stack.c
Log message:
2006-10-13 Klaus Treichel <address@hidden>
* engine/jitc_obj.c, engine/jitc_ptr.c: Handle the pointer
relative store
of value types correctly which are subclasses of the type to
store.
* engine/jitc_stack.c: Add macros to handle memcpy, memmove and
memset.
CVSWeb URLs:
http://cvs.savannah.gnu.org/viewcvs/pnet/ChangeLog?cvsroot=dotgnu-pnet&r1=1.3373&r2=1.3374
http://cvs.savannah.gnu.org/viewcvs/pnet/engine/jitc_obj.c?cvsroot=dotgnu-pnet&r1=1.21&r2=1.22
http://cvs.savannah.gnu.org/viewcvs/pnet/engine/jitc_ptr.c?cvsroot=dotgnu-pnet&r1=1.15&r2=1.16
http://cvs.savannah.gnu.org/viewcvs/pnet/engine/jitc_stack.c?cvsroot=dotgnu-pnet&r1=1.10&r2=1.11
Patches:
Index: ChangeLog
===================================================================
RCS file: /cvsroot/dotgnu-pnet/pnet/ChangeLog,v
retrieving revision 1.3373
retrieving revision 1.3374
diff -u -b -r1.3373 -r1.3374
--- ChangeLog 13 Oct 2006 10:03:53 -0000 1.3373
+++ ChangeLog 13 Oct 2006 15:04:03 -0000 1.3374
@@ -1,3 +1,9 @@
+2006-10-13 Klaus Treichel <address@hidden>
+
+ * engine/jitc_obj.c, engine/jitc_ptr.c: Handle the pointer relative
store
+ of value types correctly which are subclasses of the type to store.
+
+ * engine/jitc_stack.c: Add macros to handle memcpy, memmove and memset.
2006-10-13 Gopal V <address@hidden>
Index: engine/jitc_obj.c
===================================================================
RCS file: /cvsroot/dotgnu-pnet/pnet/engine/jitc_obj.c,v
retrieving revision 1.21
retrieving revision 1.22
diff -u -b -r1.21 -r1.22
--- engine/jitc_obj.c 10 Oct 2006 17:10:45 -0000 1.21
+++ engine/jitc_obj.c 13 Oct 2006 15:04:03 -0000 1.22
@@ -793,8 +793,8 @@
_ILJitStackItemCheckNull(jitCoder, dest);
_ILJitStackItemCheckNull(jitCoder, src);
- jit_insn_memcpy(jitCoder->jitFunction,
- _ILJitStackItemValue(dest),
+ _ILJitStackItemMemCpy(jitCoder,
+ dest,
_ILJitStackItemValue(src),
memSize);
}
@@ -816,8 +816,8 @@
_ILJitStackItemCheckNull(jitCoder, dest);
_ILJitStackItemCheckNull(jitCoder, src);
- jit_insn_memcpy(jitCoder->jitFunction,
- _ILJitStackItemValue(dest),
+ _ILJitStackItemMemCpy(jitCoder,
+ dest,
_ILJitStackItemValue(src),
_ILJitStackItemValue(size));
}
@@ -842,8 +842,8 @@
*/
_ILJitStackItemCheckNull(jitCoder, dest);
- jit_insn_memset(jitCoder->jitFunction,
- _ILJitStackItemValue(dest),
+ _ILJitStackItemMemSet(jitCoder,
+ dest,
value,
memSize);
}
@@ -867,8 +867,8 @@
filler = _ILJitValueConvertImplicit(jitCoder->jitFunction,
_ILJitStackItemValue(value),
_IL_JIT_TYPE_BYTE);
- jit_insn_memset(jitCoder->jitFunction,
- _ILJitStackItemValue(dest),
+ _ILJitStackItemMemSet(jitCoder,
+ dest,
filler,
_ILJitStackItemValue(size));
}
@@ -943,21 +943,57 @@
_ILJitStackItemNew(stackItem);
ILJitValue value;
ILJitValue newObj;
+ ILJitType jitValueType;
/* Pop the value off the stack. */
_ILJitStackPop(jitCoder, stackItem);
+ /* Get the type of the popped object. */
+ jitValueType = jit_value_get_type(_ILJitStackItemValue(stackItem));
+
/* Allocate memory */
newObj = _ILJitAllocGen(jitCoder->jitFunction,
boxClass,
jit_type_get_size(jitType));
/* If the smallerType is smaller then the initiale type then convert to
it. */
- if(jit_value_get_type(_ILJitStackItemValue(stackItem)) != jitType)
+ if(jitValueType != jitType)
+ {
+ int valueIsStruct = (jit_type_is_struct(jitValueType) ||
jit_type_is_union(jitValueType));
+ int destIsStruct = (jit_type_is_struct(jitType) ||
jit_type_is_union(jitType));
+
+ if(valueIsStruct || destIsStruct)
+ {
+ int valueSize = jit_type_get_size(jitValueType);
+ int destSize = jit_type_get_size(jitType);
+
+ if(destSize == valueSize)
+ {
+ /* The sizes match so we can safely use store
relative. */
+ value = _ILJitStackItemValue(stackItem);
+ }
+ else
+ {
+ /* We assume that destSize is smaller than
valueSize because */
+ /* the values have to be assignment compatible.
*/
+ /* But we have to use memcpy instead. */
+ ILJitValue srcPtr =
jit_insn_address_of(jitCoder->jitFunction,
+
_ILJitStackItemValue(stackItem));
+ ILJitValue size =
jit_value_create_nint_constant(jitCoder->jitFunction,
+
_IL_JIT_TYPE_NINT,
+
(jit_nint)destSize);
+
+ _ILJitStackItemInitWithNotNullValue(stackItem,
newObj);
+ _ILJitStackItemMemCpy(jitCoder, stackItem,
srcPtr, size);
+ return;
+ }
+ }
+ else
{
value = _ILJitValueConvertImplicit(jitCoder->jitFunction,
_ILJitStackItemValue(stackItem),
jitType);
}
+ }
else
{
value = _ILJitStackItemValue(stackItem);
Index: engine/jitc_ptr.c
===================================================================
RCS file: /cvsroot/dotgnu-pnet/pnet/engine/jitc_ptr.c,v
retrieving revision 1.15
retrieving revision 1.16
diff -u -b -r1.15 -r1.16
--- engine/jitc_ptr.c 12 Oct 2006 16:07:38 -0000 1.15
+++ engine/jitc_ptr.c 13 Oct 2006 15:04:03 -0000 1.16
@@ -131,10 +131,47 @@
/* Convert the value to the array type when needed. */
if(valueType != type)
{
+ int valueIsStruct = (jit_type_is_struct(valueType) ||
jit_type_is_union(valueType));
+ int destIsStruct = (jit_type_is_struct(type) ||
jit_type_is_union(type));
+
+ if(valueIsStruct || destIsStruct)
+ {
+ int valueSize = jit_type_get_size(valueType);
+ int destSize = jit_type_get_size(type);
+
+ if(destSize == valueSize)
+ {
+ /* The sizes match so we can safely use store
element. */
+ temp = _ILJitStackItemValue(value);
+ }
+ else
+ {
+ /* We assume that destSize is smaller than
valueSize because */
+ /* the values have to be assignment compatible.
*/
+ /* But we have to use memcpy instead. */
+ _ILJitStackItemNew(dest);
+ ILJitValue destPtr =
jit_insn_load_elem_address(coder->jitFunction,
+
arrayBase,
+
_ILJitStackItemValue(index),
+
type);
+ ILJitValue srcPtr =
jit_insn_address_of(coder->jitFunction,
+
_ILJitStackItemValue(value));
+ ILJitValue size =
jit_value_create_nint_constant(coder->jitFunction,
+
_IL_JIT_TYPE_NINT,
+
(jit_nint)destSize);
+
+ _ILJitStackItemInitWithNotNullValue(dest,
destPtr);
+ _ILJitStackItemMemCpy(coder, dest, srcPtr,
size);
+ return;
+ }
+ }
+ else
+ {
temp = _ILJitValueConvertImplicit(coder->jitFunction,
_ILJitStackItemValue(value),
type);
}
+ }
else
{
temp = _ILJitStackItemValue(value);
@@ -178,10 +215,41 @@
_ILJitStackItemCheckNull(coder, ptr);
if(valueType != type)
{
+ int valueIsStruct = (jit_type_is_struct(valueType) ||
jit_type_is_union(valueType));
+ int destIsStruct = (jit_type_is_struct(type) ||
jit_type_is_union(type));
+
+ if(valueIsStruct || destIsStruct)
+ {
+ int valueSize = jit_type_get_size(valueType);
+ int destSize = jit_type_get_size(type);
+
+ if(destSize == valueSize)
+ {
+ /* The sizes match so we can safely use store
relative. */
+ temp = _ILJitStackItemValue(value);
+ }
+ else
+ {
+ /* We assume that destSize is smaller than
valueSize because */
+ /* the values have to be assignment compatible.
*/
+ /* But we have to use memcpy instead. */
+ ILJitValue srcPtr =
jit_insn_address_of(coder->jitFunction,
+
_ILJitStackItemValue(value));
+ ILJitValue size =
jit_value_create_nint_constant(coder->jitFunction,
+
_IL_JIT_TYPE_NINT,
+
(jit_nint)destSize);
+
+ _ILJitStackItemMemCpy(coder, ptr, srcPtr, size);
+ return;
+ }
+ }
+ else
+ {
temp = _ILJitValueConvertImplicit(coder->jitFunction,
_ILJitStackItemValue(value),
type);
}
+ }
else
{
temp = _ILJitStackItemValue(value);
@@ -544,18 +612,51 @@
else
{
/* Store to a pointer */
+ ILJitType valueType;
/* Pop the object off the evaluation stack. */
_ILJitStackPop(jitCoder, object);
/* Pop the address off the evaluation stack. */
_ILJitStackPop(jitCoder, address);
+ valueType = jit_value_get_type(_ILJitStackItemValue(object));
_ILJitStackItemCheckNull(jitCoder, address);
- if(jit_value_get_type(_ILJitStackItemValue(object)) != jitType)
+ if(valueType != jitType)
+ {
+ int valueIsStruct = (jit_type_is_struct(valueType) ||
jit_type_is_union(valueType));
+ int destIsStruct = (jit_type_is_struct(jitType) ||
jit_type_is_union(jitType));
+
+ if(valueIsStruct || destIsStruct)
+ {
+ int valueSize = jit_type_get_size(valueType);
+ int destSize = jit_type_get_size(jitType);
+
+ if(destSize == valueSize)
+ {
+ /* The sizes match so we can safely use
store relative. */
+ value = _ILJitStackItemValue(object);
+ }
+ else
+ {
+ /* We assume that destSize is smaller
than valueSize because */
+ /* the values have to be assignment
compatible. */
+ /* But we have to use memcpy instead. */
+ ILJitValue srcPtr =
jit_insn_address_of(jitCoder->jitFunction,
+
_ILJitStackItemValue(object));
+ ILJitValue size =
jit_value_create_nint_constant(jitCoder->jitFunction,
+
_IL_JIT_TYPE_NINT,
+
(jit_nint)destSize);
+
+ _ILJitStackItemMemCpy(jitCoder,
address, srcPtr, size);
+ return;
+ }
+ }
+ else
{
value =
_ILJitValueConvertImplicit(jitCoder->jitFunction,
_ILJitStackItemValue(object),
jitType);
}
+ }
else
{
value = _ILJitStackItemValue(object);
Index: engine/jitc_stack.c
===================================================================
RCS file: /cvsroot/dotgnu-pnet/pnet/engine/jitc_stack.c,v
retrieving revision 1.10
retrieving revision 1.11
diff -u -b -r1.10 -r1.11
--- engine/jitc_stack.c 12 Oct 2006 17:54:23 -0000 1.10
+++ engine/jitc_stack.c 13 Oct 2006 15:04:03 -0000 1.11
@@ -518,6 +518,42 @@
jit_insn_store_relative((coder)->jitFunction, (dest).value,
(jit_nint)(offset), (v)); \
} while(0)
+/*
+ * Copy an amount of data relative to a stack item.
+ */
+#define _ILJitStackItemMemCpy(coder, dest, src, size) \
+ do { \
+ if((dest).refValue && ((dest).flags &
_IL_JIT_VALUE_POINTER_TO)) \
+ { \
+ _ILJitStackDupLocal(coder, (dest).refValue); \
+ } \
+ jit_insn_memcpy((coder)->jitFunction, (dest).value, (src),
(size)); \
+ } while(0)
+
+/*
+ * Move an amount of data relative to a stack item.
+ */
+#define _ILJitStackItemMemMove(coder, dest, src, size) \
+ do { \
+ if((dest).refValue && ((dest).flags &
_IL_JIT_VALUE_POINTER_TO)) \
+ { \
+ _ILJitStackDupLocal(coder, (dest).refValue); \
+ } \
+ jit_insn_memmove((coder)->jitFunction, (dest).value, (src),
(size)); \
+ } while(0)
+
+/*
+ * Set size bytes relative to a stack item to v.
+ */
+#define _ILJitStackItemMemSet(coder, dest, v, size) \
+ do { \
+ if((dest).refValue && ((dest).flags &
_IL_JIT_VALUE_POINTER_TO)) \
+ { \
+ _ILJitStackDupLocal(coder, (dest).refValue); \
+ } \
+ jit_insn_memset((coder)->jitFunction, (dest).value, (v),
(size)); \
+ } while(0)
+
#else /* !_IL_JIT_OPTIMIZE_LOCALS */
/*
@@ -682,6 +718,30 @@
jit_insn_store_relative((coder)->jitFunction, (dest),
(jit_nint)(offset), (v)); \
} while(0)
+/*
+ * Copy an amount of data relative to s stack item.
+ */
+#define _ILJitStackItemMemCpy(coder, dest, src, size) \
+ do { \
+ jit_insn_memcpy((coder)->jitFunction, (dest), (src), (size)); \
+ } while(0)
+
+/*
+ * Move an amount of data relative to a stack item.
+ */
+#define _ILJitStackItemMemMove(coder, dest, src, size) \
+ do { \
+ jit_insn_memmove((coder)->jitFunction, (dest), (src), (size)); \
+ } while(0)
+
+/*
+ * Set size bytes relative to a stack item to v.
+ */
+#define _ILJitStackItemMemSet(coder, dest, v, size) \
+ do { \
+ jit_insn_memset((coder)->jitFunction, (dest), (v), (size)); \
+ } while(0)
+
#endif /* _IL_JIT_OPTIMIZE_LOCALS */
#endif /* IL_JITC_FUNCTIONS */
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [dotgnu-pnet-commits] pnet ChangeLog engine/jitc_obj.c engine/jitc_pt...,
Klaus Treichel <=