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

[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 */




reply via email to

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