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/Makefile.am engine/jitc...


From: Klaus Treichel
Subject: [dotgnu-pnet-commits] pnet ./ChangeLog engine/Makefile.am engine/jitc...
Date: Mon, 17 Apr 2006 17:39:44 +0000

CVSROOT:        /cvsroot/dotgnu-pnet
Module name:    pnet
Branch:         
Changes by:     Klaus Treichel <address@hidden> 06/04/17 17:39:44

Modified files:
        .              : ChangeLog 
        engine         : Makefile.am jitc.c jitc_call.c jitc_conv.c 
                         jitc_labels.c jitc_locals.c jitc_obj.c 
                         jitc_ptr.c jitc_setup.c jitc_var.c 
Added files:
        engine         : jitc_alloc.c 

Log message:
        2006-04-17  Klaus Treichel  <address@hidden>
        
        * engine/Makefile.am: Add jitc_alloc.c to jitc.o sources.
        
        * engine/jitc_alloc.c: Add object allocation functions.
        
        * engine/jitc.c, engine/jitc_call.c, engine/jitc_conv.c,
        engine/jitc_labels.c, engine/jitc_locals.c, engine/jitc_obj.c,
        engine/jitc_ptr.c, engine/jitc_setup.c, engine/jitc_var.c: Replace the
        calls of EngineAlloc with calls to the new allocation functions.
        Add initialization of locals. Redo the value conversion.

CVSWeb URLs:
http://cvs.savannah.gnu.org/viewcvs/dotgnu-pnet/pnet/ChangeLog.diff?tr1=1.3313&tr2=1.3314&r1=text&r2=text
http://cvs.savannah.gnu.org/viewcvs/dotgnu-pnet/pnet/engine/Makefile.am.diff?tr1=1.83&tr2=1.84&r1=text&r2=text
http://cvs.savannah.gnu.org/viewcvs/dotgnu-pnet/pnet/engine/jitc.c.diff?tr1=1.29&tr2=1.30&r1=text&r2=text
http://cvs.savannah.gnu.org/viewcvs/dotgnu-pnet/pnet/engine/jitc_alloc.c?rev=1.1
http://cvs.savannah.gnu.org/viewcvs/dotgnu-pnet/pnet/engine/jitc_call.c.diff?tr1=1.12&tr2=1.13&r1=text&r2=text
http://cvs.savannah.gnu.org/viewcvs/dotgnu-pnet/pnet/engine/jitc_conv.c.diff?tr1=1.4&tr2=1.5&r1=text&r2=text
http://cvs.savannah.gnu.org/viewcvs/dotgnu-pnet/pnet/engine/jitc_labels.c.diff?tr1=1.1&tr2=1.2&r1=text&r2=text
http://cvs.savannah.gnu.org/viewcvs/dotgnu-pnet/pnet/engine/jitc_locals.c.diff?tr1=1.1&tr2=1.2&r1=text&r2=text
http://cvs.savannah.gnu.org/viewcvs/dotgnu-pnet/pnet/engine/jitc_obj.c.diff?tr1=1.14&tr2=1.15&r1=text&r2=text
http://cvs.savannah.gnu.org/viewcvs/dotgnu-pnet/pnet/engine/jitc_ptr.c.diff?tr1=1.8&tr2=1.9&r1=text&r2=text
http://cvs.savannah.gnu.org/viewcvs/dotgnu-pnet/pnet/engine/jitc_setup.c.diff?tr1=1.12&tr2=1.13&r1=text&r2=text
http://cvs.savannah.gnu.org/viewcvs/dotgnu-pnet/pnet/engine/jitc_var.c.diff?tr1=1.7&tr2=1.8&r1=text&r2=text

Patches:
Index: pnet/ChangeLog
diff -u pnet/ChangeLog:1.3313 pnet/ChangeLog:1.3314
--- pnet/ChangeLog:1.3313       Mon Apr 10 19:40:26 2006
+++ pnet/ChangeLog      Mon Apr 17 17:39:44 2006
@@ -1,3 +1,15 @@
+2006-04-17  Klaus Treichel  <address@hidden>
+
+       * engine/Makefile.am: Add jitc_alloc.c to jitc.o sources.
+
+       * engine/jitc_alloc.c: Add object allocation functions.
+
+       * engine/jitc.c, engine/jitc_call.c, engine/jitc_conv.c,
+       engine/jitc_labels.c, engine/jitc_locals.c, engine/jitc_obj.c,
+       engine/jitc_ptr.c, engine/jitc_setup.c, engine/jitc_var.c: Replace the
+       calls of EngineAlloc with calls to the new allocation functions.
+       Add initialization of locals. Redo the value conversion.
+
 2006-04-10  Klaus Treichel  <address@hidden>
 
        * engine/jitc_ptr.c: Do some optimizations in the array index 
verification
Index: pnet/engine/Makefile.am
diff -u pnet/engine/Makefile.am:1.83 pnet/engine/Makefile.am:1.84
--- pnet/engine/Makefile.am:1.83        Sun Mar 19 11:29:11 2006
+++ pnet/engine/Makefile.am     Mon Apr 17 17:39:44 2006
@@ -14,6 +14,7 @@
 INTERNAL_INCLUDES = int_table.c
 
 JITC_INCLUDES = jitc.h \
+                               jitc_alloc.c \
                                jitc_arith.c \
                                jitc_branch.c \
                                jitc_call.c \
Index: pnet/engine/jitc.c
diff -u pnet/engine/jitc.c:1.29 pnet/engine/jitc.c:1.30
--- pnet/engine/jitc.c:1.29     Sun Apr  9 16:30:44 2006
+++ pnet/engine/jitc.c  Mon Apr 17 17:39:44 2006
@@ -63,6 +63,11 @@
  */
 /* #define _IL_JIT_OPTIMIZE_NULLCHECKS 1 */
 
+/*
+ * To delay the initialization of the locals uncomment the following define.
+ */
+/* #define _IL_JIT_OPTIMIZE_INIT_LOCALS 1 */
+
 #ifdef _IL_JIT_DUMP_FUNCTION
 #ifndef _IL_JIT_ENABLE_DEBUG
 #define _IL_JIT_ENABLE_DEBUG 1
@@ -112,10 +117,9 @@
  */
 
 /*
- * ILObject *_ILEngineAlloc(ILExecThread *thread, ILClass *classInfo,
- *                                                     ILUInt32 size)
+ * ILObject *_ILJitAlloc(ILClass *classInfo, ILUInt32 size)
  */
-static ILJitType _ILJitSignature_ILEngineAlloc = 0;
+static ILJitType _ILJitSignature_ILJitAlloc = 0;
 
 /*
  * System_Array *_ILJitGetExceptionStackTrace(ILExecThread *thread)
@@ -157,6 +161,12 @@
 static ILJitType _ILJitSignature_JitExceptionClearLast = 0;
 
 /*
+ * void *malloc(size_t nbytes)
+ * This signature is used for GCAlloc and GCAllocAtomic too.
+ */
+static ILJitType _ILJitSignature_malloc = 0;
+
+/*
  * Define offsetof macro if not present.
  */
 #ifndef offsetof
@@ -248,6 +258,9 @@
 
        /* Members to manage the local variables. */
        ILJitLocalSlots jitLocals;
+#ifdef _IL_JIT_OPTIMIZE_INIT_LOCALS
+       int                             localsInitialized;
+#endif
 
        /* Handle the labels. */
        ILMemPool               labelPool;
@@ -275,6 +288,19 @@
 #define _ILCoderToILJITCoder(coder) ((ILJITCoder *)coder)
 
 /*
+ * Generate the code to allocate the memory for an object.
+ * Returns the ILJitValue with the pointer to the new object.
+ */
+static ILJitValue _ILJitAllocGen(ILJITCoder *jitCoder, ILClass *classInfo,
+                                                                ILUInt32 size);
+
+/*
+ * Generate the code to allocate the memory for an object.
+ * Returns the ILJitValue with the pointer to the new object.
+ */
+static ILJitValue _ILJitAllocObjectGen(ILJITCoder *jitCoder, ILClass 
*classInfo);
+
+/*
  * Initialize a ILJitTypes base structure 
  */
 #define _ILJitTypesInitBase(jitTypes, jitType) \
@@ -325,7 +351,31 @@
  (typeKind == JIT_TYPE_NFLOAT))
 
 /*
- * Check if the typeKind is a long.
+ * Check if the typeKind is an int (<=32 bit value).
+ */
+#ifdef IL_NATIVE_INT64
+#define _JIT_TYPEKIND_IS_INT(typeKind) \
+((typeKind == JIT_TYPE_INT)            || \
+ (typeKind == JIT_TYPE_UINT)   || \
+ (typeKind == JIT_TYPE_SHORT)  || \
+ (typeKind == JIT_TYPE_USHORT) || \
+ (typeKind == JIT_TYPE_SBYTE)  || \
+ (typeKind == JIT_TYPE_UBYTE))
+#else
+#define _JIT_TYPEKIND_IS_INT(typeKind) \
+((typeKind == JIT_TYPE_NINT)   || \
+ (typeKind == JIT_TYPE_NUINT)  || \
+ (typeKind == JIT_TYPE_INT)            || \
+ (typeKind == JIT_TYPE_UINT)   || \
+ (typeKind == JIT_TYPE_SHORT)  || \
+ (typeKind == JIT_TYPE_USHORT) || \
+ (typeKind == JIT_TYPE_SBYTE)  || \
+ (typeKind == JIT_TYPE_UBYTE)  || \
+ (typeKind == JIT_TYPE_PTR))
+#endif
+
+/*
+ * Check if the typeKind is a long (64 bit value).
  */
 #ifdef IL_NATIVE_INT64
 #define _JIT_TYPEKIND_IS_LONG(typeKind) \
@@ -361,6 +411,12 @@
  (typeKind == JIT_TYPE_SBYTE))
 
 /*
+ * Check if the typeKind is a pointer type.
+ */
+#define _JIT_TYPEKIND_IS_POINTER(typeKind) \
+(typeKind == JIT_TYPE_PTR)
+
+/*
  * Convert a value to the corresponding signed/unsigned type.
  * Returns 1 if the value is converted 0 otherwise.
  */
@@ -464,6 +520,289 @@
 }
 
 /*
+ * Do the explicit conversion of an ILJitValue to the given target type.
+ * The value to convert is on the stack in it's source type. This means that no
+ * implicit conversion to the stacktype (either INT32, INT64 or a pointer type
+ * was done.
+ * Because of this we have to take into account that unsigned values with a
+ * length < 4 should have been zero extended to a size of an INT32 and signed
+ * values would have been sign extended.
+ */
+static ILJitValue _ILJitValueConvertExplicit(ILJitFunction func,
+                                                                               
         ILJitValue value,
+                                                                               
         ILJitType targetType,
+                                                                               
         int isUnsigned,
+                                                                               
         int overflowCheck)
+{
+       ILJitType sourceType = jit_value_get_type(value);
+       int sourceSize;
+       int sourceTypeKind;
+       int targetSize;
+       int targetTypeKind;
+
+       if(sourceType == targetType)
+       {
+               /* Nothing to do here. */
+               return value;
+       }
+       if(jit_type_is_struct(sourceType) || jit_type_is_union(sourceType))
+       {
+               /* something is wrong here. */
+               return value;
+       }
+       sourceTypeKind = jit_type_get_kind(sourceType);
+       targetTypeKind = jit_type_get_kind(targetType);
+       if(_JIT_TYPEKIND_IS_FLOAT(sourceTypeKind))
+       {
+               /* We can convert these values directly */
+               return jit_insn_convert(func, value, targetType, overflowCheck);
+       }
+       else
+       {
+               if(_JIT_TYPEKIND_IS_FLOAT(targetTypeKind))
+               {
+                       if(_JIT_TYPEKIND_IS_SIGNED(sourceTypeKind))
+                       {
+                               if(isUnsigned)
+                               {
+                                       AdjustSign(func, &value, 1, 
overflowCheck);
+                               }
+                       }
+                       else if(_JIT_TYPEKIND_IS_UNSIGNED(sourceTypeKind))
+                       {
+                               if(!isUnsigned)
+                               {
+                                       AdjustSign(func, &value, 0, 
overflowCheck);
+                               }
+                       }
+                       else if(_JIT_TYPEKIND_IS_POINTER(sourceTypeKind))
+                       {
+                               if(isUnsigned)
+                               {
+                                       value = jit_insn_convert(func, value, 
_IL_JIT_TYPE_NUINT,
+                                                                               
                                  overflowCheck);
+                               }
+                               else
+                               {
+                                               value = jit_insn_convert(func, 
value, _IL_JIT_TYPE_NINT,
+                                                                               
                          overflowCheck);
+                               }
+                       }
+                       value = jit_insn_convert(func, value, targetType, 
overflowCheck);
+               }
+               else
+               {
+                       sourceSize = jit_type_get_size(sourceType);
+                       targetSize = jit_type_get_size(targetType);
+
+                       if(targetSize <= sourceSize)
+                       {
+                               /* The value is truncated or the sign is 
changed. */
+                       }
+                       else
+                       {
+                               if(_JIT_TYPEKIND_IS_LONG(targetTypeKind))
+                               {
+                                       
if(_JIT_TYPEKIND_IS_SIGNED(targetTypeKind))
+                                       {
+                                               /* In this case we have to zero 
extend unsigned source */
+                                               /* values to the size of an 
INT32 first. */
+                                               
if(_JIT_TYPEKIND_IS_UNSIGNED(sourceTypeKind))
+                                               {
+                                                       /* We have to zero 
extend the value to the */
+                                                       /* size an INT32 first. 
*/
+                                                       /* I assume that 
unsigned source values will be  */
+                                                       /* zero extended to the 
target size. */
+                                                       value = 
jit_insn_convert(func, value,
+                                                                               
                                 _IL_JIT_TYPE_INT32,
+                                                                               
                                 overflowCheck);
+                                               }
+                                               else 
if(_JIT_TYPEKIND_IS_POINTER(sourceTypeKind))
+                                               {
+                                                       /* Pointers have to be 
sign extended in this case. */
+                                                       /* So we convert to a 
signed NINT first. */
+                                                       value = 
jit_insn_convert(func, value,
+                                                                               
                                 _IL_JIT_TYPE_NINT,
+                                                                               
                                 overflowCheck);
+                                               }
+                                       }
+                                       else 
if(_JIT_TYPEKIND_IS_UNSIGNED(targetTypeKind))
+                                       {
+
+                                               /* In this case we have to sign 
extend signed source */
+                                               /* values to the size of an 
INT32 first. */
+                                               
if(_JIT_TYPEKIND_IS_SIGNED(sourceTypeKind))
+                                               {
+                                                       /* We have to sign 
extend the value to the */
+                                                       /* size an INT32 first. 
*/
+                                                       /* I assume that signed 
source values will be  */
+                                                       /* sign extended to the 
target size. */
+                                                       value = 
jit_insn_convert(func, value,
+                                                                               
                                 _IL_JIT_TYPE_UINT32,
+                                                                               
                                 overflowCheck);
+                                               }
+                                               else 
if(_JIT_TYPEKIND_IS_POINTER(sourceTypeKind))
+                                               {
+                                                       /* Pointers have to be 
zero extended in this case. */
+                                                       /* So we convert to a 
unsigned NUINT first. */
+                                                       value = 
jit_insn_convert(func, value,
+                                                                               
                                 _IL_JIT_TYPE_NUINT,
+                                                                               
                                 overflowCheck);
+                                               }
+                                       }
+#ifdef IL_NATIVE_INT64
+                                       else 
if(_JIT_TYPEKIND_IS_POINTER(targetTypeKind))
+                                       {
+                                               /* This is not allowed in 
explicit conversion. */
+                                               /* But we treat pointers like 
unsigned values. */
+                                               
if(_JIT_TYPEKIND_IS_SIGNED(sourceTypeKind))
+                                               {
+                                                       AdjustSign(func, 
&value, 1, overflowCheck);
+                                               }
+                                       }
+#endif
+                               }
+                               else
+                               {
+                                       /* The value would have been zero- or 
sign extended to */
+                                       /* the size of an INT32 depending on 
the signedness of */
+                                       /* the value. Now we have the less or 
the same size so */
+                                       /* we can safely simply convert to the 
target type.    */
+                               }
+                       }
+                       value = jit_insn_convert(func, value, targetType, 
overflowCheck);
+               }
+       }
+       return value;
+}
+
+/*
+ * Do the implicit conversion of an ILJitValue to the given target type.
+ * The value to convert is on the stack in it's source type. This means that no
+ * implicit conversion to the stacktype (either INT32, INT64 or a pointer type
+ * was done.
+ * Because of this we have to take into account that unsigned values with a
+ * length < 4 should have been zero extended to a size of an INT32 and signed
+ * values would have been sign extended.
+ */
+static ILJitValue _ILJitValueConvertImplicit(ILJitFunction func,
+                                                                               
         ILJitValue value,
+                                                                               
         ILJitType targetType)
+{
+       ILJitType sourceType = jit_value_get_type(value);
+       int sourceTypeKind;
+       int targetTypeKind;
+
+       if(sourceType == targetType)
+       {
+               /* Nothing to do here. */
+               return value;
+       }
+       if(jit_type_is_struct(sourceType) || jit_type_is_union(sourceType))
+       {
+               /* something is wrong here. */
+               return value;
+       }
+       sourceTypeKind = jit_type_get_kind(sourceType);
+       targetTypeKind = jit_type_get_kind(targetType);
+       if(_JIT_TYPEKIND_IS_FLOAT(sourceTypeKind))
+       {
+               /* We can convert these values directly */
+               return jit_insn_convert(func, value, targetType, 0);
+       }
+       else
+       {
+               if(_JIT_TYPEKIND_IS_FLOAT(targetTypeKind))
+               {
+                       value = jit_insn_convert(func, value, targetType, 0);
+               }
+               else
+               {
+                       int sourceSize = jit_type_get_size(sourceType);
+                       int targetSize = jit_type_get_size(targetType);
+
+                       if(targetSize <= sourceSize)
+                       {
+                               /* The value is truncated or the sign is 
changed. */
+                       }
+                       else
+                       {
+                               if(_JIT_TYPEKIND_IS_LONG(targetTypeKind))
+                               {
+                                       
if(_JIT_TYPEKIND_IS_SIGNED(targetTypeKind))
+                                       {
+                                               /* In this case we have to zero 
extend unsigned source */
+                                               /* values to the size of an 
INT32 first. */
+                                               
if(_JIT_TYPEKIND_IS_UNSIGNED(sourceTypeKind))
+                                               {
+                                                       /* We have to zero 
extend the value to the */
+                                                       /* size an INT32 first. 
*/
+                                                       /* I assume that 
unsigned source values will be  */
+                                                       /* zero extended to the 
target size. */
+                                                       value = 
jit_insn_convert(func, value,
+                                                                               
                                 _IL_JIT_TYPE_INT32,
+                                                                               
                                 0);
+                                               }
+                                               else 
if(_JIT_TYPEKIND_IS_POINTER(sourceTypeKind))
+                                               {
+                                                       /* Pointers have to be 
sign extended in this case. */
+                                                       /* So we convert to a 
signed NINT first. */
+                                                       value = 
jit_insn_convert(func, value,
+                                                                               
                                 _IL_JIT_TYPE_NINT,
+                                                                               
                                 0);
+                                               }
+                                       }
+                                       else 
if(_JIT_TYPEKIND_IS_UNSIGNED(targetTypeKind))
+                                       {
+
+                                               /* In this case we have to sign 
extend signed source */
+                                               /* values to the size of an 
INT32 first. */
+                                               
if(_JIT_TYPEKIND_IS_SIGNED(sourceTypeKind))
+                                               {
+                                                       /* We have to sign 
extend the value to the */
+                                                       /* size an INT32 first. 
*/
+                                                       /* I assume that signed 
source values will be  */
+                                                       /* sign extended to the 
target size. */
+                                                       value = 
jit_insn_convert(func, value,
+                                                                               
                                 _IL_JIT_TYPE_UINT32,
+                                                                               
                                 0);
+                                               }
+                                               else 
if(_JIT_TYPEKIND_IS_POINTER(sourceTypeKind))
+                                               {
+                                                       /* Pointers have to be 
zero extended in this case. */
+                                                       /* So we convert to a 
unsigned NUINT first. */
+                                                       value = 
jit_insn_convert(func, value,
+                                                                               
                                 _IL_JIT_TYPE_NUINT,
+                                                                               
                                 0);
+                                               }
+                                       }
+#ifdef IL_NATIVE_INT64
+                                       else 
if(_JIT_TYPEKIND_IS_POINTER(targetTypeKind))
+                                       {
+                                               /* This is not allowed in 
explicit conversion. */
+                                               /* But we treat pointers like 
unsigned values. */
+                                               
if(_JIT_TYPEKIND_IS_SIGNED(sourceTypeKind))
+                                               {
+                                                       AdjustSign(func, 
&value, 1, 0);
+                                               }
+                                       }
+#endif
+                               }
+                               else
+                               {
+                                       /* The value would have been zero- or 
sign extended to */
+                                       /* the size of an INT32 depending on 
the signedness of */
+                                       /* the value. Now we have the less or 
the same size so */
+                                       /* we can safely simply convert to the 
target type.    */
+                               }
+                       }
+                       value = jit_insn_convert(func, value, targetType, 0);
+               }
+       }
+       return value;
+}
+
+/*
  * Readjust the stack to normalize binary operands when
  * I and I4 are mixed together.  Also determine which of
  * I4 or I8 to use if the operation involves I.
@@ -487,25 +826,6 @@
                return;
        }
 
-       /* When converted to unsigned the values have to be extended with 0s. */
-       /* So we have to adjust the sign first. */
-       if(isUnsigned)
-       {
-               if(AdjustSign(coder->jitFunction, value1, isUnsigned, 0))
-               {
-                       type1 = jit_value_get_type(*value1);
-                       newType1 = type1;
-                       type1Kind = jit_type_get_kind(type1);
-               }
-
-               if(AdjustSign(coder->jitFunction, value2, isUnsigned, 0))
-               {
-                       type2 = jit_value_get_type(*value2);
-                       newType2 = type2;
-                       type2Kind = jit_type_get_kind(type2);
-               }
-       }
-
        /* If the arguments mix I8 and I4, then cast the I4 value to I8 */
        if(type1IsLong && !type2IsLong)
        {
@@ -592,11 +912,13 @@
        /* now do the conversion if necessairy. */
        if(type1 != newType1)
        {
-               *value1 = jit_insn_convert(coder->jitFunction, *value1, 
newType1, 0);
+               *value1 = _ILJitValueConvertImplicit(coder->jitFunction, 
*value1,
+                                                                               
         newType1);
        }
        if(type2 != newType2)
        {
-               *value2 = jit_insn_convert(coder->jitFunction, *value2, 
newType2, 0);
+               *value2 = _ILJitValueConvertImplicit(coder->jitFunction, 
*value2,
+                                                                               
         newType2);
        }
 }
 
@@ -607,6 +929,11 @@
 {
        int result = 0;
 
+       /* Check if the class is allready layouted. */
+       if((info->userData) && !(((ILClassPrivate 
*)(info->userData))->inLayout))
+       {
+               return 1;
+       }
        METADATA_WRLOCK(thread);
        result = _ILLayoutClass(_ILExecThreadProcess(thread), info);
        METADATA_UNLOCK(thread);
@@ -1309,11 +1636,10 @@
 
        /* Initialize the native method signatures. */
        args[0] = _IL_JIT_TYPE_VPTR;
-       args[1] = _IL_JIT_TYPE_VPTR;
-       args[2] = _IL_JIT_TYPE_UINT32;
+       args[1] = _IL_JIT_TYPE_UINT32;
        returnType = _IL_JIT_TYPE_VPTR;
-       if(!(_ILJitSignature_ILEngineAlloc = 
-               jit_type_create_signature(IL_JIT_CALLCONV_CDECL, returnType, 
args, 3, 1)))
+       if(!(_ILJitSignature_ILJitAlloc = 
+               jit_type_create_signature(IL_JIT_CALLCONV_CDECL, returnType, 
args, 2, 1)))
        {
                return 0;
        }
@@ -1380,6 +1706,14 @@
                return 0;
        }
 
+       args[0] = _IL_JIT_TYPE_NINT;
+       returnType = _IL_JIT_TYPE_VPTR;
+       if(!(_ILJitSignature_malloc =
+               jit_type_create_signature(IL_JIT_CALLCONV_CDECL, returnType, 
args, 1, 1)))
+       {
+               return 0;
+       }
+
        return 1;
 }
 /*
@@ -2556,6 +2890,7 @@
        return 0;
 }
 
+#include "jitc_alloc.c"
 #include "jitc_diag.c"
 #include "jitc_locals.c"
 #include "jitc_labels.c"
Index: pnet/engine/jitc_call.c
diff -u pnet/engine/jitc_call.c:1.12 pnet/engine/jitc_call.c:1.13
--- pnet/engine/jitc_call.c:1.12        Sun Apr  2 17:32:43 2006
+++ pnet/engine/jitc_call.c     Mon Apr 17 17:39:44 2006
@@ -99,24 +99,7 @@
  */
 static void _ILJitNewObj(ILJITCoder *coder, ILClass *info, ILJitValue *newArg)
 {
-       ILUInt32 objSize = _ILJitGetSizeOfClass(info);
-       ILJitValue newObj;
-       ILJitValue args[3];
-       jit_label_t label1 = jit_label_undefined;
-       
-       args[0] = jit_value_get_param(coder->jitFunction, 0);
-       args[1] = jit_value_create_nint_constant(coder->jitFunction,
-                                                                               
                jit_type_void_ptr, (jit_nint)info);
-       args[2] = jit_value_create_nint_constant(coder->jitFunction,
-                                                                               
                jit_type_int, objSize);
-       newObj = jit_insn_call_native(coder->jitFunction, "_ILEngineAlloc",
-                                                                 
_ILEngineAlloc,
-                                                                 
_ILJitSignature_ILEngineAlloc, args, 3,
-                                                                 
JIT_CALL_NOTHROW);
-       jit_insn_branch_if(coder->jitFunction, newObj, &label1);
-       _ILJitThrowCurrentException(coder);
-       jit_insn_label(coder->jitFunction, &label1);
-       *newArg = newObj;
+       *newArg = _ILJitAllocObjectGen(coder, info);
 }
 
 /*
@@ -145,6 +128,7 @@
        ILJitValue arrayBase;
        ILJitValue boxObject;
        ILJitValue boxValue;
+       ILJitValue boxObjectSize;
        ILJitValue ptr;
        jit_label_t labelException = jit_label_undefined;
        jit_label_t label = jit_label_undefined;
@@ -477,20 +461,10 @@
                                                        0, paramType, 0);
                        info = ILClassResolve(info);
                        typeSize = ILSizeOfType(_thread, paramType);
-
-                       args[0] = thread;
-                       args[1] = 
jit_value_create_nint_constant(jitCoder->jitFunction,
-                                                                       
_IL_JIT_TYPE_VPTR, (jit_nint)info);
-                       args[2] = 
jit_value_create_nint_constant(jitCoder->jitFunction,
+                       boxObjectSize = 
jit_value_create_nint_constant(jitCoder->jitFunction,
                                                                                
                _IL_JIT_TYPE_UINT32, typeSize);
 
-                       boxObject = jit_insn_call_native(jitCoder->jitFunction,
-                                                                               
         "_ILEngineAlloc",
-                                                                               
         _ILEngineAlloc,
-                                                                               
         _ILJitSignature_ILEngineAlloc,
-                                                                               
         args, 3, JIT_CALL_NOTHROW);
-                       jit_insn_branch_if_not(jitCoder->jitFunction, boxObject,
-                                                                  
&labelException);
+                       boxObject = _ILJitAllocGen(jitCoder, info, typeSize);
                        if(boxValue)
                        {
                                jit_insn_store_relative(jitCoder->jitFunction, 
boxObject, 0,
@@ -498,7 +472,7 @@
                        }
                        else
                        {
-                               jit_insn_memcpy(jitCoder->jitFunction, 
boxObject, ptr, args[2]);
+                               jit_insn_memcpy(jitCoder->jitFunction, 
boxObject, ptr, boxObjectSize);
                        }
                        jit_insn_store_relative(jitCoder->jitFunction, 
arrayBase, 0,
                                                                        
boxObject);
@@ -616,7 +590,7 @@
        ILJITCoder *jitCoder = _ILCoderToILJITCoder(coder);
        ILJitFunction jitFunction = ILJitFunctionFromILMethod(methodInfo);
        int argCount = info->numBaseArgs + info->numVarArgs;
-       ILJitValue jitParams[argCount + 1];
+       ILJitValue jitParams[argCount + 2];
        ILJitValue returnValue;
        char *methodName = 0;
        ILInternalInfo fnInfo;
@@ -664,14 +638,15 @@
        methodName = _ILJitFunctionGetMethodName(jitFunction);
 #endif
 
+       if(info->hasParamArray)
+       {
+               ++argCount;
+       }
+
        /* Check if the function is implemented in the engine. */
        if(_ILJitFunctionIsInternal(jitCoder, methodInfo, &fnInfo, 0))
        {
                /* Call the engine function directly with the supplied args. */
-               if(info->hasParamArray)
-               {
-                       ++argCount;
-               }
                JITC_ADJUST(jitCoder, -argCount);
                returnValue = _ILJitCallInternal(jitCoder->jitFunction, 
methodInfo,
                                                                                
 fnInfo.func, methodName,
Index: pnet/engine/jitc_conv.c
diff -u pnet/engine/jitc_conv.c:1.4 pnet/engine/jitc_conv.c:1.5
--- pnet/engine/jitc_conv.c:1.4 Sun Apr  9 16:30:44 2006
+++ pnet/engine/jitc_conv.c     Mon Apr 17 17:39:44 2006
@@ -21,148 +21,6 @@
 #ifdef IL_JITC_CODE
 
 /*
- * Convert the topmost stackitem according to the given opcode.
- * When unsigned is 0 then a sign extension will be done.
- * When checkOberflow is not 0 then an overflow check will be done.
- * The converted value will be returned.
- */
-static ILJitValue ConvertValue(ILJITCoder *jitCoder, int opcode, int 
isUnsigned,
-                                                                               
                                        int checkOverflow)
-{
-       ILJitValue value = jitCoder->jitStack[jitCoder->stackTop - 1];
-
-       AdjustSign(jitCoder->jitFunction, &value, isUnsigned, checkOverflow);
-       switch(opcode)
-       {
-               case IL_OP_CONV_I1:
-               {
-                       /* Convert to "int8" */
-                       return jit_insn_convert(jitCoder->jitFunction,
-                                                                       value,
-                                                                       
_IL_JIT_TYPE_SBYTE,
-                                                                       
checkOverflow);
-               }
-               break;
-
-               case IL_OP_CONV_I2:
-               {
-                       /* Convert to "int16" */
-                       return jit_insn_convert(jitCoder->jitFunction,
-                                                                       value,
-                                                                       
_IL_JIT_TYPE_INT16,
-                                                                       
checkOverflow);
-               }
-               break;
-
-               case IL_OP_CONV_I4:
-       #ifdef IL_NATIVE_INT32
-               case IL_OP_CONV_I:
-       #endif
-               {
-                       /* Convert to "int32" */
-                       return jit_insn_convert(jitCoder->jitFunction,
-                                                                       value,
-                                                                       
_IL_JIT_TYPE_INT32,
-                                                                       
checkOverflow);
-
-               }
-               break;
-
-               case IL_OP_CONV_I8:
-       #ifdef IL_NATIVE_INT64
-               case IL_OP_CONV_I:
-       #endif
-               {
-                       /* Convert to "int64" */
-                       return jit_insn_convert(jitCoder->jitFunction,
-                                                                       value,
-                                                                       
_IL_JIT_TYPE_INT64,
-                                                                       
checkOverflow);
-               }
-               break;
-
-               case IL_OP_CONV_R4:
-               {
-                       /* Convert to "float32" */
-                       return jit_insn_convert(jitCoder->jitFunction,
-                                                                       value,
-                                                                       
_IL_JIT_TYPE_SINGLE,
-                                                                       
checkOverflow);
-               }
-               break;
-
-               case IL_OP_CONV_R8:
-               {
-                       /* Convert to "float64" */
-                       return jit_insn_convert(jitCoder->jitFunction,
-                                                                       value,
-                                                                       
_IL_JIT_TYPE_DOUBLE,
-                                                                       
checkOverflow);
-               }
-               break;
-
-               case IL_OP_CONV_U1:
-               {
-                       /* Convert to "unsigned int8" */
-                       return jit_insn_convert(jitCoder->jitFunction,
-                                                                       value,
-                                                                       
_IL_JIT_TYPE_BYTE,
-                                                                       
checkOverflow);
-               }
-               break;
-
-               case IL_OP_CONV_U2:
-               {
-                       /* Convert to "unsigned int16" */
-                       return jit_insn_convert(jitCoder->jitFunction,
-                                                                       value,
-                                                                       
_IL_JIT_TYPE_UINT16,
-                                                                       
checkOverflow);
-               }
-               break;
-
-               case IL_OP_CONV_U4:
-       #ifdef IL_NATIVE_INT32
-               case IL_OP_CONV_U:
-       #endif
-               {
-                       /* Convert to "unsigned int32" */
-                       return jit_insn_convert(jitCoder->jitFunction,
-                                                                       value,
-                                                                       
_IL_JIT_TYPE_UINT32,
-                                                                       
checkOverflow);
-               }
-               break;
-
-               case IL_OP_CONV_U8:
-       #ifdef IL_NATIVE_INT64
-               case IL_OP_CONV_U:
-       #endif
-               {
-                       /* Convert to "unsigned int64" */
-                       return jit_insn_convert(jitCoder->jitFunction,
-                                                                       value,
-                                                                       
_IL_JIT_TYPE_UINT64,
-                                                                       
checkOverflow);
-               }
-               break;
-
-               case IL_OP_CONV_R_UN:
-               {
-                       /* Convert to "native float" with unsigned input */
-                       return jit_insn_convert(jitCoder->jitFunction,
-                                                                       value,
-                                                                       
_IL_JIT_TYPE_NFLOAT,
-                                                                       
checkOverflow);
-               }
-               break;
-       }
-
-       /* Just to keep gcc happy. */
-       return value;
-}
-
-/*
  * Handle a conversion opcode.
  */
 static void JITCoder_Conv(ILCoder *coder, int opcode, ILEngineType type)
@@ -176,14 +34,20 @@
                case IL_OP_CONV_I1:
                {
                        /* Convert to "int8" */
-                       value = ConvertValue(jitCoder, IL_OP_CONV_I1, 0, 0);
+                       value = 
_ILJitValueConvertExplicit(jitCoder->jitFunction,
+                                                                               
           value,
+                                                                               
           _IL_JIT_TYPE_SBYTE,
+                                                                               
           0, 0);
                }
                break;
 
                case IL_OP_CONV_I2:
                {
                        /* Convert to "int16" */
-                       value = ConvertValue(jitCoder, IL_OP_CONV_I2, 0, 0);
+                       value = 
_ILJitValueConvertExplicit(jitCoder->jitFunction,
+                                                                               
           value,
+                                                                               
           _IL_JIT_TYPE_INT16,
+                                                                               
           0, 0);
                }
                break;
 
@@ -193,7 +57,10 @@
        #endif
                {
                        /* Convert to "int32" */
-                       value = ConvertValue(jitCoder, IL_OP_CONV_I4, 0, 0);
+                       value = 
_ILJitValueConvertExplicit(jitCoder->jitFunction,
+                                                                               
           value,
+                                                                               
           _IL_JIT_TYPE_INT32,
+                                                                               
           0, 0);
                }
                break;
 
@@ -203,35 +70,50 @@
        #endif
                {
                        /* Convert to "int64" */
-                       value = ConvertValue(jitCoder, IL_OP_CONV_I8, 0, 0);
+                       value = 
_ILJitValueConvertExplicit(jitCoder->jitFunction,
+                                                                               
           value,
+                                                                               
           _IL_JIT_TYPE_INT64,
+                                                                               
           0, 0);
                }
                break;
 
                case IL_OP_CONV_R4:
                {
                        /* Convert to "float32" */
-                       value = ConvertValue(jitCoder, IL_OP_CONV_R4, 0, 0);
+                       value = 
_ILJitValueConvertExplicit(jitCoder->jitFunction,
+                                                                               
           value,
+                                                                               
           _IL_JIT_TYPE_SINGLE,
+                                                                               
           0, 0);
                }
                break;
 
                case IL_OP_CONV_R8:
                {
                        /* Convert to "float64" */
-                       value = ConvertValue(jitCoder, IL_OP_CONV_R8, 0, 0);
+                       value = 
_ILJitValueConvertExplicit(jitCoder->jitFunction,
+                                                                               
           value,
+                                                                               
           _IL_JIT_TYPE_DOUBLE,
+                                                                               
           0, 0);
                }
                break;
 
                case IL_OP_CONV_U1:
                {
                        /* Convert to "unsigned int8" */
-                       value = ConvertValue(jitCoder, IL_OP_CONV_U1, 0, 0);
+                       value = 
_ILJitValueConvertExplicit(jitCoder->jitFunction,
+                                                                               
           value,
+                                                                               
           _IL_JIT_TYPE_BYTE,
+                                                                               
           0, 0);
                }
                break;
 
                case IL_OP_CONV_U2:
                {
                        /* Convert to "unsigned int16" */
-                       value = ConvertValue(jitCoder, IL_OP_CONV_U2, 0, 0);
+                       value = 
_ILJitValueConvertExplicit(jitCoder->jitFunction,
+                                                                               
           value,
+                                                                               
           _IL_JIT_TYPE_UINT16,
+                                                                               
           0, 0);
                }
                break;
 
@@ -241,7 +123,10 @@
        #endif
                {
                        /* Convert to "unsigned int32" */
-                       value = ConvertValue(jitCoder, IL_OP_CONV_U4, 0, 0);
+                       value = 
_ILJitValueConvertExplicit(jitCoder->jitFunction,
+                                                                               
           value,
+                                                                               
           _IL_JIT_TYPE_UINT32,
+                                                                               
           0, 0);
                }
                break;
 
@@ -251,28 +136,40 @@
        #endif
                {
                        /* Convert to "unsigned int64" */
-                       value = ConvertValue(jitCoder, IL_OP_CONV_U8, 1, 0);
+                       value = 
_ILJitValueConvertExplicit(jitCoder->jitFunction,
+                                                                               
           value,
+                                                                               
           _IL_JIT_TYPE_UINT64,
+                                                                               
           0, 0);
                }
                break;
 
                case IL_OP_CONV_R_UN:
                {
                        /* Convert to "native float" with unsigned input */
-                       value = ConvertValue(jitCoder, IL_OP_CONV_R_UN, 1, 0);
+                       value = 
_ILJitValueConvertExplicit(jitCoder->jitFunction,
+                                                                               
           value,
+                                                                               
           _IL_JIT_TYPE_NFLOAT,
+                                                                               
           1, 0);
                }
                break;
 
                case IL_OP_CONV_OVF_I1_UN:
                {
                        /* Convert to "int8" with unsigned input and overflow */
-                       value = ConvertValue(jitCoder, IL_OP_CONV_I1, 1, 1);
+                       value = 
_ILJitValueConvertExplicit(jitCoder->jitFunction,
+                                                                               
           value,
+                                                                               
           _IL_JIT_TYPE_SBYTE,
+                                                                               
           1, 1);
                }
                break;
 
                case IL_OP_CONV_OVF_I2_UN:
                {
                        /* Convert to "int16" with unsigned input and overflow 
*/
-                       value = ConvertValue(jitCoder, IL_OP_CONV_I2, 1, 1);
+                       value = 
_ILJitValueConvertExplicit(jitCoder->jitFunction,
+                                                                               
           value,
+                                                                               
           _IL_JIT_TYPE_INT16,
+                                                                               
           1, 1);
                }
                break;
 
@@ -282,7 +179,10 @@
        #endif
                {
                        /* Convert to "int32" with unsigned input and overflow 
*/
-                       value = ConvertValue(jitCoder, IL_OP_CONV_I4, 1, 1);
+                       value = 
_ILJitValueConvertExplicit(jitCoder->jitFunction,
+                                                                               
           value,
+                                                                               
           _IL_JIT_TYPE_INT32,
+                                                                               
           1, 1);
                }
                break;
 
@@ -292,21 +192,30 @@
        #endif
                {
                        /* Convert to "int64" with unsigned input and overflow 
*/
-                       value = ConvertValue(jitCoder, IL_OP_CONV_I8, 1, 1);
+                       value = 
_ILJitValueConvertExplicit(jitCoder->jitFunction,
+                                                                               
           value,
+                                                                               
           _IL_JIT_TYPE_INT64,
+                                                                               
           1, 1);
                }
                break;
 
                case IL_OP_CONV_OVF_U1_UN:
                {
                        /* Convert to "unsigned int8" with unsigned input and 
overflow */
-                       value = ConvertValue(jitCoder, IL_OP_CONV_U1, 1, 1);
+                       value = 
_ILJitValueConvertExplicit(jitCoder->jitFunction,
+                                                                               
           value,
+                                                                               
           _IL_JIT_TYPE_BYTE,
+                                                                               
           1, 1);
                }
                break;
 
                case IL_OP_CONV_OVF_U2_UN:
                {
                        /* Convert to "unsigned int16" with unsigned input and 
overflow */
-                       value = ConvertValue(jitCoder, IL_OP_CONV_U2, 1, 1);
+                       value = 
_ILJitValueConvertExplicit(jitCoder->jitFunction,
+                                                                               
           value,
+                                                                               
           _IL_JIT_TYPE_UINT16,
+                                                                               
           1, 1);
                }
                break;
 
@@ -316,7 +225,10 @@
        #endif
                {
                        /* Convert to "unsigned int32" with unsigned input and 
overflow */
-                       value = ConvertValue(jitCoder, IL_OP_CONV_U4, 1, 1);
+                       value = 
_ILJitValueConvertExplicit(jitCoder->jitFunction,
+                                                                               
           value,
+                                                                               
           _IL_JIT_TYPE_UINT32,
+                                                                               
           1, 1);
                }
                break;
 
@@ -326,35 +238,50 @@
        #endif
                {
                        /* Convert to "unsigned int64" with unsigned input and 
overflow */
-                       value = ConvertValue(jitCoder, IL_OP_CONV_U8, 1, 1);
+                       value = 
_ILJitValueConvertExplicit(jitCoder->jitFunction,
+                                                                               
           value,
+                                                                               
           _IL_JIT_TYPE_UINT64,
+                                                                               
           1, 1);
                }
                break;
 
                case IL_OP_CONV_OVF_I1:
                {
                        /* Convert to "int8" with signed input and overflow */
-                       value = ConvertValue(jitCoder, IL_OP_CONV_I1, 0, 1);
+                       value = 
_ILJitValueConvertExplicit(jitCoder->jitFunction,
+                                                                               
           value,
+                                                                               
           _IL_JIT_TYPE_SBYTE,
+                                                                               
           0, 1);
                }
                break;
 
                case IL_OP_CONV_OVF_U1:
                {
                        /* Convert to "unsigned int8" with signed input and 
overflow */
-                       value = ConvertValue(jitCoder, IL_OP_CONV_U1, 0, 1);
+                       value = 
_ILJitValueConvertExplicit(jitCoder->jitFunction,
+                                                                               
           value,
+                                                                               
           _IL_JIT_TYPE_BYTE,
+                                                                               
           0, 1);
                }
                break;
 
                case IL_OP_CONV_OVF_I2:
                {
                        /* Convert to "int16" with signed input and overflow */
-                       value = ConvertValue(jitCoder, IL_OP_CONV_I2, 0, 1);
+                       value = 
_ILJitValueConvertExplicit(jitCoder->jitFunction,
+                                                                               
           value,
+                                                                               
           _IL_JIT_TYPE_INT16,
+                                                                               
           0, 1);
                }
                break;
 
                case IL_OP_CONV_OVF_U2:
                {
                        /* Convert to "unsigned int16" with signed input and 
overflow */
-                       value = ConvertValue(jitCoder, IL_OP_CONV_U2, 0, 1);
+                       value = 
_ILJitValueConvertExplicit(jitCoder->jitFunction,
+                                                                               
           value,
+                                                                               
           _IL_JIT_TYPE_UINT16,
+                                                                               
           0, 1);
                }
                break;
 
@@ -364,7 +291,10 @@
        #endif
                {
                        /* Convert to "int32" with signed input and overflow */
-                       value = ConvertValue(jitCoder, IL_OP_CONV_I4, 0, 1);
+                       value = 
_ILJitValueConvertExplicit(jitCoder->jitFunction,
+                                                                               
           value,
+                                                                               
           _IL_JIT_TYPE_INT32,
+                                                                               
           0, 1);
                }
                break;
 
@@ -374,7 +304,10 @@
        #endif
                {
                        /* Convert to "unsigned int32" with signed input and 
overflow */
-                       value = ConvertValue(jitCoder, IL_OP_CONV_U4, 0, 1);
+                       value = 
_ILJitValueConvertExplicit(jitCoder->jitFunction,
+                                                                               
           value,
+                                                                               
           _IL_JIT_TYPE_UINT32,
+                                                                               
           0, 1);
                }
                break;
 
@@ -384,7 +317,10 @@
        #endif
                {
                        /* Convert to "int64" with signed input and overflow */
-                       value = ConvertValue(jitCoder, IL_OP_CONV_I8, 0, 1);
+                       value = 
_ILJitValueConvertExplicit(jitCoder->jitFunction,
+                                                                               
           value,
+                                                                               
           _IL_JIT_TYPE_INT64,
+                                                                               
           0, 1);
                }
                break;
 
@@ -394,7 +330,10 @@
        #endif
                {
                        /* Convert to "unsigned int64" with signed input and 
overflow */
-                       value = ConvertValue(jitCoder, IL_OP_CONV_U8, 1, 1);
+                       value = 
_ILJitValueConvertExplicit(jitCoder->jitFunction,
+                                                                               
           value,
+                                                                               
           _IL_JIT_TYPE_UINT64,
+                                                                               
           0, 1);
                }
                break;
        }
Index: pnet/engine/jitc_labels.c
diff -u pnet/engine/jitc_labels.c:1.1 pnet/engine/jitc_labels.c:1.2
--- pnet/engine/jitc_labels.c:1.1       Sun Mar 19 11:29:11 2006
+++ pnet/engine/jitc_labels.c   Mon Apr 17 17:39:44 2006
@@ -167,6 +167,17 @@
                        }
                        label->next = coder->labelList;
                        coder->labelList = label;
+#ifdef _IL_JIT_OPTIMIZE_INIT_LOCALS
+                       if((coder->localsInitialized == 0) && (address != 0))
+                       {
+                               /* Initialize the locals. */
+                               if(!_ILJitLocalsInit(coder))
+                               {
+                                       return 0;
+                               }
+                               coder->localsInitialized = 1;
+                       }
+#endif
                }
                else
                {
Index: pnet/engine/jitc_locals.c
diff -u pnet/engine/jitc_locals.c:1.1 pnet/engine/jitc_locals.c:1.2
--- pnet/engine/jitc_locals.c:1.1       Wed Mar  8 21:03:52 2006
+++ pnet/engine/jitc_locals.c   Mon Apr 17 17:39:44 2006
@@ -19,6 +19,12 @@
  */
 
 /*
+ * definitions used in the slot's flags
+ */
+#define _IL_JIT_VALUE_NULLCHECKED 1
+#define _IL_JIT_VALUE_INITIALIZED 2
+
+/*
  * Allocate enough space for "n" slots.
  */
 #define        _ILJitLocalsAlloc(s, n) \
@@ -104,6 +110,100 @@
 }
 
 /*
+ * Initialize the local value to 0.
+ */
+static int _ILJitLocalInit(ILJITCoder *coder, ILJitLocalSlot *slot)
+{
+       if((slot->flags & _IL_JIT_VALUE_INITIALIZED) == 0)
+       {
+               ILJitType type = jit_value_get_type(slot->value);
+
+               if(!jit_type_is_struct(type))
+               {
+                       int typeKind = jit_type_get_kind(type);
+                       ILJitValue constant = 0;
+
+                       if(_JIT_TYPEKIND_IS_FLOAT(typeKind))
+                       {
+                               if(!(constant = 
jit_value_create_nfloat_constant(coder->jitFunction,
+                                                                               
                                        type,
+                                                                               
                                        (jit_nfloat)0)))
+                               {
+                                       return 0;
+                               }
+                               jit_insn_store(coder->jitFunction, slot->value, 
constant);
+                       }
+                       else
+                       {
+                               if(_JIT_TYPEKIND_IS_LONG(typeKind))
+                               {
+                                       if(!(constant = 
jit_value_create_long_constant(coder->jitFunction,
+                                                                               
                                          type, (jit_long)0)))
+                                       {
+                                               return 0;
+                                       }
+                                       jit_insn_store(coder->jitFunction, 
slot->value, constant);
+                               }
+                               else
+                               {
+                                       if(!(constant = 
jit_value_create_nint_constant(coder->jitFunction,
+                                                                               
                                          type, (jit_nint)0)))
+                                       {
+                                               return 0;
+                                       }
+                                       jit_insn_store(coder->jitFunction, 
slot->value, constant);
+                               }
+                       }
+               }
+               slot->flags |= _IL_JIT_VALUE_INITIALIZED;
+       }
+       return 1;
+}
+
+/*
+ * Initialize the not yet initialized local values to 0 and move the
+ * initialization sequence to the start of the function.
+ */
+static int _ILJitLocalsInit(ILJITCoder *coder)
+{
+       ILUInt32 num = coder->jitLocals.numSlots;
+       ILUInt32 current;
+
+       if(num > 0)
+       {
+               jit_label_t startLabel = jit_label_undefined;
+               jit_label_t endLabel = jit_label_undefined;
+               ILJitLocalSlot *slot;
+
+               if(!jit_insn_label(coder->jitFunction, &startLabel))
+               {
+                       return 0;
+               }
+
+               for(current = 0; current < num; ++current)
+               {
+                       slot = &_ILJitLocalGet(coder, current);
+
+                       if(!_ILJitLocalInit(coder, slot))
+                       {
+                               return 0;
+                       }
+               }
+
+               if(!jit_insn_label(coder->jitFunction, &endLabel))
+               {
+                       return 0;
+               }
+               if(!jit_insn_move_blocks_to_start(coder->jitFunction, 
startLabel,
+                                                                               
                                          endLabel))
+               {
+                       return 0;
+               }
+       }
+       return 1;
+}
+
+/*
  * Create the slots for the declared local variables.
  * Returns zero if out of memory.
  */
@@ -142,6 +242,14 @@
                }
                /* Record the number of used locals in the coder. */
                coder->jitLocals.numSlots = num;
+
+#ifndef _IL_JIT_OPTIMIZE_INIT_LOCALS
+               /* Initialize the locals. */
+               if(!_ILJitLocalsInit(coder))
+               {
+                       return 0;
+               }
+#endif
        }
        else
        {
@@ -191,6 +299,90 @@
        return 0;
 }
 
+#ifdef _IL_JIT_OPTIMIZE_LOCALS
+
+/*
+ * Find the given value on the stack and replace it by a duplicate.
+ */
+static void _ILJitValueFindAndDup(ILJITCoder *coder, ILJitValue value)
+{
+       ILJitValue dupValue = 0;
+       ILInt32 stackPos = 0;
+
+       for(stackPos = 0; stackPos < coder->stackTop; ++stackPos)
+       {
+               if(coder->jitStack[stackPos] == value)
+               {
+                       if(!dupValue)
+                       {
+                               dupValue = jit_insn_dup(coder->jitFunction, 
value);
+                       }
+                       coder->jitStack[stackPos] = dupValue;
+               }
+       }
+}
+#endif
+
+/*
+ * Get the value of a local slot.
+ * The value in the local slot is initialized to 0 if it is not yet 
initialized.
+ */
+static ILJitValue _ILJitLocalGetValue(ILJITCoder *coder, ILUInt32 localNum)
+{
+       ILJitLocalSlot *slot = &_ILJitLocalGet(coder, localNum);
+
+       if((slot->flags & _IL_JIT_VALUE_INITIALIZED) == 0)
+       {
+               _ILJitLocalInit(coder, slot);
+       }
+       return slot->value;
+}
+
+/*
+ * Store a value in a local variable.
+ */
+static void _ILJitLocalStoreValue(ILJITCoder *coder, ILUInt32 localNum,
+                                                                               
                         ILJitValue value)
+{
+       ILJitLocalSlot *slot = &_ILJitLocalGet(coder, localNum);
+
+#ifdef _IL_JIT_OPTIMIZE_LOCALS
+       _ILJitValueFindAndDup(coder, slot->value);
+#endif
+
+       jit_insn_store(coder->jitFunction, slot->value, value);
+
+       slot->flags |= _IL_JIT_VALUE_INITIALIZED;
+       slot->flags &= ~_IL_JIT_VALUE_NULLCHECKED;
+}
+
+/*
+ * Get the value of a parameter slot.
+ */
+static ILJitValue _ILJitParamGetValue(ILJITCoder *coder, ILUInt32 paramNum)
+{
+       ILJitLocalSlot *slot = &_ILJitParamGet(coder, paramNum);
+
+       return slot->value;
+}
+
+/*
+ * Store a value in a parameter.
+ */
+static void _ILJitParamStoreValue(ILJITCoder *coder, ILUInt32 paramNum,
+                                                                               
                         ILJitValue value)
+{
+       ILJitLocalSlot *slot = &_ILJitParamGet(coder, paramNum);
+
+#ifdef _IL_JIT_OPTIMIZE_LOCALS
+       _ILJitValueFindAndDup(coder, slot->value);
+#endif
+
+       jit_insn_store(coder->jitFunction, slot->value, value);
+
+       slot->flags &= ~_IL_JIT_VALUE_NULLCHECKED;
+}
+
 /*
  * Check if the given value is a parameter or local.
  * Returns 1 if the value is either a param or local value or pointer to
@@ -224,41 +416,15 @@
        return 0;
 }
 
-#ifdef _IL_JIT_OPTIMIZE_LOCALS
-
-/*
- * Find the given value on the stack and replace it by a duplicate.
- */
-static void _ILJitValueFindAndDup(ILJITCoder *coder, ILJitValue value)
-{
-       ILJitValue dupValue = 0;
-       ILInt32 stackPos = 0;
-
-       for(stackPos = 0; stackPos < coder->stackTop; ++stackPos)
-       {
-               if(coder->jitStack[stackPos] == value)
-               {
-                       if(!dupValue)
-                       {
-                               dupValue = jit_insn_dup(coder->jitFunction, 
value);
-                       }
-                       coder->jitStack[stackPos] = dupValue;
-               }
-       }
-}
-#endif
-
 #ifdef _IL_JIT_OPTIMIZE_NULLCHECKS
 
-#define _IL_JIT_VALUE_NULLCHECKED 1
-
 #define _ILJitValuesResetNullChecked(coder) \
                _ILJitValuesSetFlags((coder), 0, _IL_JIT_VALUE_NULLCHECKED)
 #endif
 
 /*
  * Find the slot for the given value.
- * Returns the slot with the valuewhen found otherwise 0.
+ * Returns the slot with the value when found otherwise 0.
  */
 static ILJitLocalSlot *_ILJitValueFindSlot(ILJITCoder *coder, ILJitValue value)
 {
Index: pnet/engine/jitc_obj.c
diff -u pnet/engine/jitc_obj.c:1.14 pnet/engine/jitc_obj.c:1.15
--- pnet/engine/jitc_obj.c:1.14 Sat Mar 25 07:06:54 2006
+++ pnet/engine/jitc_obj.c      Mon Apr 17 17:39:44 2006
@@ -562,10 +562,8 @@
 
        ILJitValue value = jitCoder->jitStack[jitCoder->stackTop - 1];
        ILJitValue newObj;
-       ILJitValue args[3];
        ILType *type = ILClassToType(boxClass);
        ILJitType jitType = _ILJitGetReturnType(type, jitCoder->process);
-       jit_label_t label1 = jit_label_undefined;
 
        if(valueType == ILEngineType_TypedRef)
        {
@@ -600,20 +598,7 @@
 #endif
 
        /* Allocate the object. */
-       args[0] = jit_value_get_param(jitCoder->jitFunction, 0);
-       args[1] = jit_value_create_nint_constant(jitCoder->jitFunction,
-                                                       _IL_JIT_TYPE_VPTR, 
(jit_nint)boxClass);
-
-       args[2] = jit_value_create_nint_constant(jitCoder->jitFunction,
-                                                       _IL_JIT_TYPE_UINT32, 
size);
-
-       newObj = jit_insn_call_native(jitCoder->jitFunction, "_ILEngineAlloc",
-                                                                 
_ILEngineAlloc, _ILJitSignature_ILEngineAlloc,
-                                                                 args, 3, 
JIT_CALL_NOTHROW);
-
-       jit_insn_branch_if(jitCoder->jitFunction, newObj, &label1);
-       _ILJitThrowCurrentException(jitCoder);
-       jit_insn_label(jitCoder->jitFunction, &label1);
+       newObj = _ILJitAllocObjectGen(jitCoder, boxClass);
 
        if(jit_value_get_type(value)!=jitType)
        {
@@ -632,27 +617,9 @@
        ILJitType jitType = _ILJitGetReturnType(smallerType, jitCoder->process);
 
        ILJitValue newObj;
-       ILJitValue args[3];
-
-       jit_label_t label1 = jit_label_undefined;
 
        /* Allocate memory */
-       args[0] = jit_value_get_param(jitCoder->jitFunction, 0);
-       args[1] = jit_value_create_nint_constant(jitCoder->jitFunction,
-                                                                               
         _IL_JIT_TYPE_VPTR,
-                                                                               
         (jit_nint)boxClass);
-       args[2] = jit_value_create_nint_constant(jitCoder->jitFunction,
-                                                                               
         _IL_JIT_TYPE_UINT32,
-                                                                               
         jit_type_get_size(jitType));
-                                                       
-       newObj = jit_insn_call_native(jitCoder->jitFunction, "_ILEngineAlloc",
-                                                                 
_ILEngineAlloc, _ILJitSignature_ILEngineAlloc,
-                                                                 args, 3, 0);
-                                       
-       jit_insn_branch_if(jitCoder->jitFunction, newObj, &label1);
-       _ILJitThrowCurrentException(jitCoder);
-       jit_insn_label(jitCoder->jitFunction, &label1);
-
+       newObj = _ILJitAllocGen(jitCoder, boxClass, jit_type_get_size(jitType));
        
        /* If the smallerType is smaller then the initiale type then convert to 
it. */
        if(jit_value_get_type(value) != jitType)
Index: pnet/engine/jitc_ptr.c
diff -u pnet/engine/jitc_ptr.c:1.8 pnet/engine/jitc_ptr.c:1.9
--- pnet/engine/jitc_ptr.c:1.8  Mon Apr 10 19:40:26 2006
+++ pnet/engine/jitc_ptr.c      Mon Apr 17 17:39:44 2006
@@ -102,7 +102,7 @@
        /* Convert the value to the array type when needed. */
        if(valueType != type)
        {
-               value = jit_insn_convert(coder->jitFunction, value, type, 0);
+               value = _ILJitValueConvertImplicit(coder->jitFunction, value, 
type);
        }
        jit_insn_store_elem(coder->jitFunction, arrayBase, index, value);
        JITC_ADJUST(coder, -3);
@@ -134,7 +134,7 @@
        _ILJitCheckNull(coder, ptr);
        if(valueType != type)
        {
-               value = jit_insn_convert(coder->jitFunction, value, type, 0);
+               value = _ILJitValueConvertImplicit(coder->jitFunction, value, 
type);
        }
        jit_insn_store_relative(coder->jitFunction, ptr, (jit_nint)0, value);
        JITC_ADJUST(coder, -2);
@@ -483,8 +483,10 @@
                address = jitCoder->jitStack[jitCoder->stackTop - 1];
                _ILJitCheckNull(jitCoder, address);
                jitCoder->jitStack[jitCoder->stackTop - 1] =
-                       jit_insn_load_relative(jitCoder->jitFunction, address, 
(jit_nint)0,
-                                                                  jitType);
+               _ILJitValueConvertToStackType(jitCoder->jitFunction,
+                                                                         
jit_insn_load_relative(jitCoder->jitFunction,
+                                                                               
                                         address, (jit_nint)0,
+                                                                               
                                         jitType));
        }
        else
        {
@@ -496,7 +498,8 @@
                
                if(jit_value_get_type(object) != jitType)
                {
-                       object = jit_insn_convert(jitCoder->jitFunction, 
object, jitType, 0);
+                       object = 
_ILJitValueConvertImplicit(jitCoder->jitFunction, object,
+                                                                               
                jitType);
                }
                jit_insn_store_relative(jitCoder->jitFunction, address, 
(jit_nint)0, object);
                JITC_ADJUST(jitCoder, -2);
@@ -524,7 +527,10 @@
        _ILJitCheckNull(jitCoder, array);
        len = GetArrayLength(jitCoder, array);
        jitCoder->jitStack[jitCoder->stackTop - 1] = 
-               jit_insn_convert(jitCoder->jitFunction, len, 
_IL_JIT_TYPE_NUINT, 0);
+               _ILJitValueConvertToStackType(jitCoder->jitFunction,
+                                                                         
jit_insn_convert(jitCoder->jitFunction,
+                                                                               
                           len,
+                                                                               
                           _IL_JIT_TYPE_NUINT, 0));
 }
 
 /*
Index: pnet/engine/jitc_setup.c
diff -u pnet/engine/jitc_setup.c:1.12 pnet/engine/jitc_setup.c:1.13
--- pnet/engine/jitc_setup.c:1.12       Sun Mar 19 11:29:11 2006
+++ pnet/engine/jitc_setup.c    Mon Apr 17 17:39:44 2006
@@ -59,6 +59,9 @@
        {
                return 0;
        }
+#ifdef _IL_JIT_OPTIMIZE_INIT_LOCALS
+       coder->localsInitialized = 0;
+#endif
 
        /* Ensure that the evaluation stack can hold at least the methods 
maxStack */
        /* items. */
Index: pnet/engine/jitc_var.c
diff -u pnet/engine/jitc_var.c:1.7 pnet/engine/jitc_var.c:1.8
--- pnet/engine/jitc_var.c:1.7  Wed Mar  8 21:03:52 2006
+++ pnet/engine/jitc_var.c      Mon Apr 17 17:39:44 2006
@@ -86,7 +86,6 @@
                                                          ILEngineType 
engineType, ILType *type)
 {
        ILJITCoder *jitCoder = _ILCoderToILJITCoder(coder);
-       ILJitValue argValue = _ILJitParamValue(jitCoder, argNum);
 
 #if !defined(IL_CONFIG_REDUCE_CODE) && !defined(IL_WITHOUT_TOOLS)
        if (jitCoder->flags & IL_CODER_FLAG_STATS)
@@ -98,15 +97,11 @@
                ILMutexUnlock(globalTraceMutex);
        }
 #endif
-       JITC_ADJUST(jitCoder, -1);
-
-#ifdef _IL_JIT_OPTIMIZE_LOCALS
-       _ILJitValueFindAndDup(jitCoder, argValue);
-#endif
 
-       jit_insn_store(jitCoder->jitFunction, argValue,
-                                       jitCoder->jitStack[jitCoder->stackTop]);
+       JITC_ADJUST(jitCoder, -1);
 
+       _ILJitParamStoreValue(jitCoder, argNum,
+                                                 
jitCoder->jitStack[jitCoder->stackTop]);
 }
 
 /*
@@ -116,7 +111,6 @@
                                                                ILEngineType 
engineType, ILType *type)
 {
        ILJITCoder *jitCoder = _ILCoderToILJITCoder(coder);
-       ILJitValue localValue = _ILJitLocalValue(jitCoder, localNum);
 
 #if !defined(IL_CONFIG_REDUCE_CODE) && !defined(IL_WITHOUT_TOOLS)
        if (jitCoder->flags & IL_CODER_FLAG_STATS)
@@ -131,13 +125,8 @@
 
        JITC_ADJUST(jitCoder, -1);
 
-#ifdef _IL_JIT_OPTIMIZE_LOCALS
-       _ILJitValueFindAndDup(jitCoder, localValue);
-#endif
-
-       jit_insn_store(jitCoder->jitFunction, localValue,
-                                       jitCoder->jitStack[jitCoder->stackTop]);
-
+       _ILJitLocalStoreValue(jitCoder, localNum,
+                                                 
jitCoder->jitStack[jitCoder->stackTop]);
 }
 
 /*




reply via email to

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