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.c engine/jitc_bran...


From: Klaus Treichel
Subject: [dotgnu-pnet-commits] pnet ./ChangeLog engine/jitc.c engine/jitc_bran...
Date: Wed, 08 Mar 2006 21:03:52 +0000

CVSROOT:        /cvsroot/dotgnu-pnet
Module name:    pnet
Branch:         
Changes by:     Klaus Treichel <address@hidden> 06/03/08 21:03:52

Modified files:
        .              : ChangeLog 
        engine         : jitc.c jitc_branch.c jitc_call.c jitc_obj.c 
                         jitc_setup.c jitc_stack.c jitc_var.c 
                         Makefile.am 
Added files:
        engine         : jitc_locals.c 

Log message:
        2006-03-08  Klaus Treichel  <address@hidden>
        
        * engine/jitc.c: Add the new locals management and include 
jitc_locals.c.
        Fix a problem in ILJitCompileInternal when a struct is returned.
        
        * engine/jitc_branch.c: Replace locals on the stack with copies when the
        stach state is saved. Reset the NullChecked flag when a label
        (branch target) is inserted.
        
        * engine/jitc_call.c: Add suppport of argument packing in an object 
array.
        
        * engine/jitc_locals.c: Added.
        
        * engine/jitc_obj.c: Use the new locals / parameter management in
        jitc_locals.c and replace calls of jit_insn_check_null with calls of
        _ILJitCheckNull.
        
        * engine/jitc_setup.c: Use the new locals / parameter management in
        jitc_locals.c.
        
        * engine/jitc_stack.c: Start with some basic optimizations to avoid
        duplicating values.
        
        * engine/jitc_var.c: Use the functions in jitc_locals to accedd the 
locals
        and parameters. Start with some basic optimizations.
        
        * engine/Makefile.am: Add jitc_locals.c to the jitc dependencies.

CVSWeb URLs:
http://cvs.savannah.gnu.org/viewcvs/dotgnu-pnet/pnet/ChangeLog.diff?tr1=1.3300&tr2=1.3301&r1=text&r2=text
http://cvs.savannah.gnu.org/viewcvs/dotgnu-pnet/pnet/engine/jitc.c.diff?tr1=1.22&tr2=1.23&r1=text&r2=text
http://cvs.savannah.gnu.org/viewcvs/dotgnu-pnet/pnet/engine/jitc_branch.c.diff?tr1=1.8&tr2=1.9&r1=text&r2=text
http://cvs.savannah.gnu.org/viewcvs/dotgnu-pnet/pnet/engine/jitc_call.c.diff?tr1=1.10&tr2=1.11&r1=text&r2=text
http://cvs.savannah.gnu.org/viewcvs/dotgnu-pnet/pnet/engine/jitc_locals.c?rev=1.1
http://cvs.savannah.gnu.org/viewcvs/dotgnu-pnet/pnet/engine/jitc_obj.c.diff?tr1=1.12&tr2=1.13&r1=text&r2=text
http://cvs.savannah.gnu.org/viewcvs/dotgnu-pnet/pnet/engine/jitc_setup.c.diff?tr1=1.10&tr2=1.11&r1=text&r2=text
http://cvs.savannah.gnu.org/viewcvs/dotgnu-pnet/pnet/engine/jitc_stack.c.diff?tr1=1.4&tr2=1.5&r1=text&r2=text
http://cvs.savannah.gnu.org/viewcvs/dotgnu-pnet/pnet/engine/jitc_var.c.diff?tr1=1.6&tr2=1.7&r1=text&r2=text
http://cvs.savannah.gnu.org/viewcvs/dotgnu-pnet/pnet/engine/Makefile.am.diff?tr1=1.81&tr2=1.82&r1=text&r2=text

Patches:
Index: pnet/ChangeLog
diff -u pnet/ChangeLog:1.3300 pnet/ChangeLog:1.3301
--- pnet/ChangeLog:1.3300       Sat Mar  4 14:36:08 2006
+++ pnet/ChangeLog      Wed Mar  8 21:03:52 2006
@@ -1,3 +1,31 @@
+2006-03-08  Klaus Treichel  <address@hidden>
+
+       * engine/jitc.c: Add the new locals management and include 
jitc_locals.c.
+       Fix a problem in ILJitCompileInternal when a struct is returned.
+
+       * engine/jitc_branch.c: Replace locals on the stack with copies when the
+       stach state is saved. Reset the NullChecked flag when a label 
+       (branch target) is inserted.
+
+       * engine/jitc_call.c: Add suppport of argument packing in an object 
array.
+
+       * engine/jitc_locals.c: Added.
+
+       * engine/jitc_obj.c: Use the new locals / parameter management in
+       jitc_locals.c and replace calls of jit_insn_check_null with calls of
+       _ILJitCheckNull.
+
+       * engine/jitc_setup.c: Use the new locals / parameter management in
+       jitc_locals.c.
+
+       * engine/jitc_stack.c: Start with some basic optimizations to avoid
+       duplicating values.
+
+       * engine/jitc_var.c: Use the functions in jitc_locals to accedd the 
locals
+       and parameters. Start with some basic optimizations.
+
+       * engine/Makefile.am: Add jitc_locals.c to the jitc dependencies.
+
 2006-03-04  Klaus Treichel  <address@hidden>
 
        * engine/jitc.c, engine/jitc_obj.c: Fix the TypedRef so that the layout 
of
Index: pnet/engine/Makefile.am
diff -u pnet/engine/Makefile.am:1.81 pnet/engine/Makefile.am:1.82
--- pnet/engine/Makefile.am:1.81        Mon Dec 19 18:00:35 2005
+++ pnet/engine/Makefile.am     Wed Mar  8 21:03:52 2006
@@ -20,6 +20,7 @@
                                jitc_const.c \
                                jitc_conv.c \
                                jitc_except.c \
+                               jitc_locals.c \
                                jitc_obj.c \
                                jitc_ptr.c \
                                jitc_setup.c \
Index: pnet/engine/jitc.c
diff -u pnet/engine/jitc.c:1.22 pnet/engine/jitc.c:1.23
--- pnet/engine/jitc.c:1.22     Sat Mar  4 14:36:08 2006
+++ pnet/engine/jitc.c  Wed Mar  8 21:03:52 2006
@@ -53,6 +53,15 @@
  */
 /* #define _IL_JIT_DISASSEMBLE_FUNCTION 1 */
 
+/*
+ * To enable parameter / locals optimizations uncomment the following define.
+ */
+/* #define _IL_JIT_OPTIMIZE_LOCALS 1 */
+
+/*
+ * To enable null check optimizations uncomment the following define.
+ */
+/* #define _IL_JIT_OPTIMIZE_NULLCHECKS 1 */
 
 #ifdef _IL_JIT_DUMP_FUNCTION
 #ifndef _IL_JIT_ENABLE_DEBUG
@@ -165,6 +174,44 @@
        ILJitValue *jitStack;           /* Values on the stack. */
 };
 
+/*
+ * Define the structure of a local/argument slot.
+ */
+typedef struct _tagILJitLocalSlot ILJitLocalSlot;
+struct _tagILJitLocalSlot
+{
+       ILJitValue      value;                  /* the ILJitValue */
+       ILUInt32        flags;                  /* State of the local/arg. */
+};
+
+/*
+ * Define the structure for managing the local slots.
+ */
+typedef struct _tagILJitLocalSlots ILJitLocalSlots;
+struct _tagILJitLocalSlots
+{
+       ILJitLocalSlot *slots;          /* Pointer to the slots. */
+       int                             numSlots;       /* Number of used 
slots. */
+       int                             maxSlots;       /* Number of allocated 
slots. */
+};
+
+#define _ILJitLocalSlotsInit(s) \
+       do { \
+               (s).slots = 0;          \
+               (s).numSlots = 0;       \
+               (s).maxSlots = 0;       \
+       } while (0);
+
+#define _ILJitLocalSlotsDestroy(s) \
+       do { \
+               if((s).slots)                   \
+               {                                               \
+                       ILFree((s).slots);      \
+               }                                               \
+               (s).slots = 0;                  \
+               (s).numSlots = 0;               \
+               (s).maxSlots = 0;               \
+       } while (0);
 
 /*
  * Define the structure of a JIT coder's instance block.
@@ -181,14 +228,15 @@
        int                             flags;
 
        /* Members to manage the evaluation stack. */
-       jit_value_t        *jitStack;
+       ILJitValue         *jitStack;
        int                             stackSize;
        int                             stackTop;
 
+       /* Members to manage the fixed arguments. */
+       ILJitLocalSlots jitParams;
+
        /* Members to manage the local variables. */
-       jit_value_t        *jitLocals;
-       int                             numLocals;
-       int                             maxLocals;
+       ILJitLocalSlots jitLocals;
 
        /* Handle the labels. */
        ILMemPool               labelPool;
@@ -1196,10 +1244,12 @@
        coder->jitStack = 0;
        coder->stackTop = -1;
        coder->stackSize = 0;
+
+       /* Initialize the parameter management. */
+       _ILJitLocalSlotsInit(coder->jitParams)
+
        /* Initialize the locals management. */
-       coder->jitLocals = 0;
-       coder->numLocals = 0;
-       coder->maxLocals = 0;
+       _ILJitLocalSlotsInit(coder->jitLocals)
 
        /* Init the current jitted function. */
        coder->jitFunction = 0;
@@ -1258,11 +1308,11 @@
                ILFree(coder->jitStack);
                coder->jitStack = 0;
        }
-       if(coder->jitLocals)
-       {
-               ILFree(coder->jitLocals);
-               coder->jitLocals = 0;
-       }
+
+       _ILJitLocalSlotsDestroy(coder->jitLocals)
+
+       _ILJitLocalSlotsDestroy(coder->jitParams)
+
        if(coder->context)
        {
                jit_context_destroy(coder->context);
@@ -1443,7 +1493,10 @@
 {
        ILJitType signature = jit_function_get_signature(func);
        unsigned int numParams = jit_type_num_params(signature);
-       ILJitValue returnValue;
+       unsigned int totalParams = numParams;
+       ILJitType returnType = jit_type_get_return(signature);;
+       ILJitValue returnValue = 0;
+       int hasStructReturn = 0;
        char *methodName = 0;
 
 #if !defined(IL_CONFIG_REDUCE_CODE) && !defined(IL_WITHOUT_TOOLS) && 
defined(_IL_JIT_ENABLE_DEBUG)
@@ -1452,6 +1505,28 @@
        fprintf(stdout, "CompileInternalMethod: %s\n", methodName);
        ILMutexUnlock(globalTraceMutex);
 #endif
+
+       if(jit_type_is_struct(returnType))
+       {
+               /* We need to create a new Signature for the native Call with */
+               /* a pointer to the return value as last arg. */
+               ++totalParams;
+               ILJitType jitParamTypes[totalParams];
+               ILUInt32 current;
+               
+               for(current = 0; current < numParams; current++)
+               {
+                       jitParamTypes[current] = jit_type_get_param(signature, 
current); 
+               }
+               jitParamTypes[totalParams -1] = _IL_JIT_TYPE_VPTR;
+               signature = jit_type_create_signature(IL_JIT_CALLCONV_CDECL,
+                                                                               
          _IL_JIT_TYPE_VOID,
+                                                                               
          jitParamTypes,
+                                                                               
          totalParams, 1);
+               returnValue = jit_value_create(func, returnType);
+               hasStructReturn = 1;
+       }
+
        /* We need to set the method member in the ILExecThread == arg[0]. */
        if(numParams > 0)
        {
@@ -1466,7 +1541,19 @@
                        }
                }
                _ILJitSetMethodInThread(func, jitParams[0], method);
-               returnValue = jit_insn_call_native(func, methodName, 
nativeFunction, signature, jitParams, numParams, 0);
+               if(!hasStructReturn)
+               {
+                       returnValue = jit_insn_call_native(func, methodName, 
nativeFunction,
+                                                                               
           signature,
+                                                                               
           jitParams, numParams, 0);
+               }
+               else
+               {
+                       jitParams[totalParams -1] = jit_insn_address_of(func, 
returnValue);
+                       jit_insn_call_native(func, methodName, nativeFunction,
+                                                                signature,
+                                                                jitParams, 
totalParams, 0);
+               }
        }
        else
        {
@@ -2109,6 +2196,8 @@
        return 0;
 }
 
+#include "jitc_locals.c"
+
 /*
  * Include the rest of the JIT conversion routines from other files.
  * We split the implementation to make it easier to maintain the code.
Index: pnet/engine/jitc_branch.c
diff -u pnet/engine/jitc_branch.c:1.8 pnet/engine/jitc_branch.c:1.9
--- pnet/engine/jitc_branch.c:1.8       Mon Feb 27 15:51:19 2006
+++ pnet/engine/jitc_branch.c   Wed Mar  8 21:03:52 2006
@@ -51,6 +51,14 @@
                                /* Now replace the constant with the new 
temporary. */
                                coder->jitStack[current] = temp;
                        }
+                       else
+                       {
+                               if(_ILJitValueIsArgOrLocal(coder, 
coder->jitStack[current]))
+                               {
+                                       coder->jitStack[current] = 
jit_insn_dup(coder->jitFunction,
+                                                                               
                        coder->jitStack[current]);
+                               }
+                       }
                        stack[current] = coder->jitStack[current];
                }
                label->jitStack = stack;
@@ -168,6 +176,9 @@
 
        if(label)
        {
+       #ifdef _IL_JIT_OPTIMIZE_NULLCHECKS
+               _ILJitValuesResetNullChecked(jitCoder);
+       #endif
                if(label->labelType == _IL_JIT_LABEL_STARTFINALLY)
                {
                #if !defined(IL_CONFIG_REDUCE_CODE) && 
!defined(IL_WITHOUT_TOOLS)
Index: pnet/engine/jitc_call.c
diff -u pnet/engine/jitc_call.c:1.10 pnet/engine/jitc_call.c:1.11
--- pnet/engine/jitc_call.c:1.10        Sat Mar  4 14:36:08 2006
+++ pnet/engine/jitc_call.c     Wed Mar  8 21:03:52 2006
@@ -30,6 +30,10 @@
        int argCount = info->numBaseArgs + info->numVarArgs;
        int current = 0;
        
+       if(info->hasParamArray)
+       {
+               ++argCount;
+       }
        JITC_ADJUST(coder, -argCount);
        for(current = 0; current < argCount; current++)
        {
@@ -115,6 +119,404 @@
        *newArg = newObj;
 }
 
+/*
+ * Pack a set of arguments into a params "Object[]" array and replaces
+ * them with the new array on the stack.
+ * This is not included in VarArgs as this is needed by non-vararg operations 
+ * like BeginInvoke.
+ */
+void _ILJitPackVarArgs(ILJITCoder *jitCoder,
+                                                       ILUInt32 firstParam, 
ILUInt32 numArgs,
+                                                       ILType *callSiteSig)
+{
+       ILExecThread *_thread = ILExecThreadCurrent();
+       ILUInt32 param;
+       ILType *paramType;
+       ILType *enumType;
+       ILClass *info;
+       ILMethod *ctor;
+       ILUInt32 typeSize;
+       ILJitFunction jitCtor;
+       ILJitValue thread = jit_value_get_param(jitCoder->jitFunction, 0);
+       ILJitValue arrayLength = 
jit_value_create_nint_constant(jitCoder->jitFunction,
+                                                                               
                                        _IL_JIT_TYPE_UINT32,
+                                                                               
                                        (jit_nint)numArgs);
+       ILJitValue array;
+       ILJitValue arrayBase;
+       ILJitValue boxObject;
+       ILJitValue boxValue;
+       ILJitValue ptr;
+       jit_label_t labelException = jit_label_undefined;
+       jit_label_t label = jit_label_undefined;
+       ILJitValue args[3];
+
+
+       /* Allocate an array to hold all of the arguments */
+       /* Find the constructor for the array. */
+       ctor = ILExecThreadLookupMethod(_thread, "[oSystem.Object;", ".ctor",
+                                                                       
"(Ti)V");
+       jitCtor = ILJitFunctionFromILMethod(ctor);
+       if(!jitCtor)
+       {
+               /* We have to layout the class first. */
+               if(!_LayoutClass(_thread, ILMethod_Owner(ctor)))
+               {
+                       return;
+               }
+               jitCtor = ILJitFunctionFromILMethod(ctor);
+       }
+       args[0] = thread;
+       args[1] = arrayLength;
+       array = jit_insn_call(jitCoder->jitFunction, 0, jitCtor,
+                                                 0, args, 2, 0);
+       jit_insn_branch_if_not(jitCoder->jitFunction, array, &labelException);
+       arrayBase = jit_insn_add_relative(jitCoder->jitFunction,
+                                                                         array,
+                                                                         
sizeof(void *));
+       /* Adjust the stack just to the first vararg. */
+       JITC_ADJUST(jitCoder, -numArgs);
+
+       /* Convert the arguments into objects in the array */
+       for(param = 0; param < numArgs; ++param)
+       {
+               paramType = ILTypeGetParam(callSiteSig, firstParam + param);
+               boxValue = 0;
+               ptr = 0;
+
+               if (ILType_IsComplex(paramType)
+                       && ILType_Kind(paramType) == IL_TYPE_COMPLEX_BYREF)
+               {
+                       paramType = ILType_Ref(paramType);
+
+                       enumType = ILTypeGetEnumType(paramType);
+                       if(ILType_IsPrimitive(enumType))
+                       {
+                               /* Box a primitive value after aligning it 
properly */
+                               switch(ILType_ToElement(enumType))
+                               {
+                                       case IL_META_ELEMTYPE_I1:
+                                       {
+                                               boxValue = 
jit_insn_load_relative(jitCoder->jitFunction,
+                                                               
jitCoder->jitStack[jitCoder->stackTop + param],
+                                                                               
                                  0, _IL_JIT_TYPE_SBYTE);
+                                       }
+                                       break;
+
+                                       case IL_META_ELEMTYPE_U1:
+                                       case IL_META_ELEMTYPE_BOOLEAN:
+                                       {
+                                               boxValue = 
jit_insn_load_relative(jitCoder->jitFunction,
+                                                               
jitCoder->jitStack[jitCoder->stackTop + param],
+                                                                               
                                  0, _IL_JIT_TYPE_BYTE);
+                                       }
+                                       break;
+
+                                       case IL_META_ELEMTYPE_I2:
+                                       {
+                                               boxValue = 
jit_insn_load_relative(jitCoder->jitFunction,
+                                                               
jitCoder->jitStack[jitCoder->stackTop + param],
+                                                                               
                                  0, _IL_JIT_TYPE_INT16);
+                                       }
+                                       break;
+
+                                       case IL_META_ELEMTYPE_U2:
+                                       case IL_META_ELEMTYPE_CHAR:
+                                       {
+                                               boxValue = 
jit_insn_load_relative(jitCoder->jitFunction,
+                                                               
jitCoder->jitStack[jitCoder->stackTop + param],
+                                                                               
                                  0, _IL_JIT_TYPE_UINT16);
+                                       }
+                                       break;
+
+                                       case IL_META_ELEMTYPE_I4:
+#ifdef IL_NATIVE_INT32
+                                       case IL_META_ELEMTYPE_I:
+#endif
+                                       {
+                                               boxValue = 
jit_insn_load_relative(jitCoder->jitFunction,
+                                                               
jitCoder->jitStack[jitCoder->stackTop + param],
+                                                                               
                                  0, _IL_JIT_TYPE_INT32);
+                                       }
+                                       break;
+
+                                       case IL_META_ELEMTYPE_U4:
+#ifdef IL_NATIVE_INT32
+                                       case IL_META_ELEMTYPE_U:
+#endif
+                                       {
+                                               boxValue = 
jit_insn_load_relative(jitCoder->jitFunction,
+                                                               
jitCoder->jitStack[jitCoder->stackTop + param],
+                                                                               
                                  0, _IL_JIT_TYPE_UINT32);
+                                       }
+                                       break;
+
+                                       case IL_META_ELEMTYPE_I8:
+#ifdef IL_NATIVE_INT64
+                                       case IL_META_ELEMTYPE_I:
+#endif
+                                       {
+                                               boxValue = 
jit_insn_load_relative(jitCoder->jitFunction,
+                                                               
jitCoder->jitStack[jitCoder->stackTop + param],
+                                                                               
                                  0, _IL_JIT_TYPE_INT64);
+                                       }
+                                       break;
+
+                                       case IL_META_ELEMTYPE_U8:
+#ifdef IL_NATIVE_INT64
+                                       case IL_META_ELEMTYPE_U:
+#endif
+                                       {
+                                               boxValue = 
jit_insn_load_relative(jitCoder->jitFunction,
+                                                               
jitCoder->jitStack[jitCoder->stackTop + param],
+                                                                               
                                  0, _IL_JIT_TYPE_UINT64);
+                                       }
+                                       break;
+
+                                       case IL_META_ELEMTYPE_R4:
+                                       {
+                                               boxValue = 
jit_insn_load_relative(jitCoder->jitFunction,
+                                                               
jitCoder->jitStack[jitCoder->stackTop + param],
+                                                                               
                                  0, _IL_JIT_TYPE_SINGLE);
+                                       }
+                                       break;
+
+                                       case IL_META_ELEMTYPE_R8:
+                                       {
+                                               boxValue = 
jit_insn_load_relative(jitCoder->jitFunction,
+                                                               
jitCoder->jitStack[jitCoder->stackTop + param],
+                                                                               
                                  0, _IL_JIT_TYPE_DOUBLE);
+                                       }
+                                       break;
+
+                                       case IL_META_ELEMTYPE_R:
+                                       {
+                                               boxValue = 
jit_insn_load_relative(jitCoder->jitFunction,
+                                                               
jitCoder->jitStack[jitCoder->stackTop + param],
+                                                                               
                                  0, _IL_JIT_TYPE_NFLOAT);
+                                       }
+                                       break;
+
+                                       default:
+                                       {
+                                               boxValue = 
jit_insn_load_relative(jitCoder->jitFunction,
+                                                               
jitCoder->jitStack[jitCoder->stackTop + param],
+                                                                               
                                  0, _IL_JIT_TYPE_VPTR);
+                                       }
+                                       break;
+                               }
+                       }
+                       else if(ILType_IsValueType(paramType))
+                       {
+                               ptr = jitCoder->jitStack[jitCoder->stackTop + 
param];
+                       }
+                       else if(ILTypeIsReference(paramType))
+                       {
+                               /* Ref to an object reference type: pass the 
object reference */
+                               boxValue = 
jit_insn_load_relative(jitCoder->jitFunction,
+                                                               
jitCoder->jitStack[jitCoder->stackTop + param],
+                                                                               
                                  0, _IL_JIT_TYPE_VPTR);
+                               jit_insn_store_relative(jitCoder->jitFunction, 
arrayBase, 0,
+                                                                               
boxValue);
+                               boxValue = 0;
+                       }
+                       else
+                       {
+                               /* Assume that everything else is a pointer, 
and wrap
+                               it up within a "System.IntPtr" object */
+                               boxValue = 
jit_insn_load_relative(jitCoder->jitFunction,
+                                                               
jitCoder->jitStack[jitCoder->stackTop + param],
+                                                                               
                                  0, _IL_JIT_TYPE_VPTR);
+                               paramType = ILType_Int;
+                       }
+               }
+               else
+               {
+                       enumType = ILTypeGetEnumType(paramType);
+                       if(ILType_IsPrimitive(enumType))
+                       {
+                               int x;
+
+                               x = ILType_ToElement(enumType);
+                               /* Box a primitive value after aligning it 
properly */
+                               switch(ILType_ToElement(paramType))
+                               {
+                                       case IL_META_ELEMTYPE_I1:
+                                       {
+                                               boxValue = 
jit_insn_convert(jitCoder->jitFunction, 
+                                                               
jitCoder->jitStack[jitCoder->stackTop + param],
+                                                               
_IL_JIT_TYPE_SBYTE, 0);
+                                       }
+                                       break;
+
+                                       case IL_META_ELEMTYPE_U1:
+                                       case IL_META_ELEMTYPE_BOOLEAN:
+                                       {
+                                               boxValue = 
jit_insn_convert(jitCoder->jitFunction, 
+                                                               
jitCoder->jitStack[jitCoder->stackTop + param],
+                                                               
_IL_JIT_TYPE_BYTE, 0);
+                                       }
+                                       break;
+
+                                       case IL_META_ELEMTYPE_I2:
+                                       {
+                                               boxValue = 
jit_insn_convert(jitCoder->jitFunction, 
+                                                               
jitCoder->jitStack[jitCoder->stackTop + param],
+                                                               
_IL_JIT_TYPE_INT16, 0);
+                                       }
+                                       break;
+
+                                       case IL_META_ELEMTYPE_U2:
+                                       case IL_META_ELEMTYPE_CHAR:
+                                       {
+                                               boxValue = 
jit_insn_convert(jitCoder->jitFunction, 
+                                                               
jitCoder->jitStack[jitCoder->stackTop + param],
+                                                               
_IL_JIT_TYPE_UINT16, 0);
+                                       }
+                                       break;
+
+                                       case IL_META_ELEMTYPE_I4:
+#ifdef IL_NATIVE_INT32
+                                       case IL_META_ELEMTYPE_I:
+#endif
+                                       {
+                                               boxValue = 
jit_insn_convert(jitCoder->jitFunction, 
+                                                               
jitCoder->jitStack[jitCoder->stackTop + param],
+                                                               
_IL_JIT_TYPE_INT32, 0);
+                                       }
+                                       break;
+
+                                       case IL_META_ELEMTYPE_U4:
+#ifdef IL_NATIVE_INT32
+                                       case IL_META_ELEMTYPE_U:
+#endif
+                                       {
+                                               boxValue = 
jit_insn_convert(jitCoder->jitFunction, 
+                                                               
jitCoder->jitStack[jitCoder->stackTop + param],
+                                                               
_IL_JIT_TYPE_UINT32, 0);
+                                       }
+                                       break;
+
+                                       case IL_META_ELEMTYPE_I8:
+#ifdef IL_NATIVE_INT64
+                                       case IL_META_ELEMTYPE_I:
+#endif
+                                       {
+                                               boxValue = 
jit_insn_convert(jitCoder->jitFunction, 
+                                                               
jitCoder->jitStack[jitCoder->stackTop + param],
+                                                               
_IL_JIT_TYPE_INT64, 0);
+                                       }
+                                       break;
+
+                                       case IL_META_ELEMTYPE_U8:
+#ifdef IL_NATIVE_INT64
+                                       case IL_META_ELEMTYPE_U:
+#endif
+                                       {
+                                               boxValue = 
jit_insn_convert(jitCoder->jitFunction, 
+                                                               
jitCoder->jitStack[jitCoder->stackTop + param],
+                                                               
_IL_JIT_TYPE_UINT64, 0);
+                                       }
+                                       break;
+
+                                       case IL_META_ELEMTYPE_R4:
+                                       {
+                                               boxValue = 
jit_insn_convert(jitCoder->jitFunction, 
+                                                               
jitCoder->jitStack[jitCoder->stackTop + param],
+                                                               
_IL_JIT_TYPE_SINGLE, 0);
+                                       }
+                                       break;
+
+                                       case IL_META_ELEMTYPE_R8:
+                                       {
+                                               boxValue = 
jit_insn_convert(jitCoder->jitFunction, 
+                                                               
jitCoder->jitStack[jitCoder->stackTop + param],
+                                                               
_IL_JIT_TYPE_DOUBLE, 0);
+                                       }
+                                       break;
+
+                                       case IL_META_ELEMTYPE_R:
+                                       {
+                                               boxValue = 
jit_insn_convert(jitCoder->jitFunction, 
+                                                               
jitCoder->jitStack[jitCoder->stackTop + param],
+                                                               
_IL_JIT_TYPE_NFLOAT, 0);
+                                       }
+
+                                       default:
+                                       {
+                                               boxValue = 
jitCoder->jitStack[jitCoder->stackTop + param];
+                                       }
+                                       break;
+                               }
+                       }
+                       else if(ILType_IsValueType(paramType))
+                       {
+                               ptr = jit_insn_address_of(jitCoder->jitFunction,
+                                                       
jitCoder->jitStack[jitCoder->stackTop + param]);
+                       }
+                       else if(ILTypeIsReference(paramType))
+                       {
+                               /* Object reference type: pass it directly */
+                               jit_insn_store_relative(jitCoder->jitFunction, 
arrayBase, 0,
+                                                       
jitCoder->jitStack[jitCoder->stackTop + param]);
+                       }
+                       else
+                       {
+                               /* Assume that everything else is a pointer, 
and wrap
+                               it up within a "System.IntPtr" object */
+                               boxValue = 
jit_insn_convert(jitCoder->jitFunction, 
+                                                               
jitCoder->jitStack[jitCoder->stackTop + param],
+                                                               
_IL_JIT_TYPE_VPTR, 0);
+                               paramType = ILType_Int;
+                       }
+               }
+               if(boxValue || ptr)
+               {
+                       /* We have to box the argument. */
+                       info = ILClassFromType
+                                                       
(ILContextNextImage(_thread->process->context, 0),
+                                                       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,
+                                                                               
                _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);
+                       if(boxValue)
+                       {
+                               jit_insn_store_relative(jitCoder->jitFunction, 
boxObject, 0,
+                                                                               
boxValue);
+                       }
+                       else
+                       {
+                               jit_insn_memcpy(jitCoder->jitFunction, 
boxObject, ptr, args[2]);
+                       }
+                       jit_insn_store_relative(jitCoder->jitFunction, 
arrayBase, 0,
+                                                                       
boxObject);
+               }
+               arrayBase = jit_insn_add_relative(jitCoder->jitFunction,
+                                                                               
  arrayBase,
+                                                                               
  sizeof(void *));
+       }
+
+       jit_insn_branch(jitCoder->jitFunction, &label);
+       jit_insn_label(jitCoder->jitFunction, &labelException);
+       _ILJitThrowCurrentException(jitCoder);
+       jit_insn_label(jitCoder->jitFunction, &label);
+
+       /* push the array on the stack */
+       jitCoder->jitStack[jitCoder->stackTop] = array;
+       JITC_ADJUST(jitCoder, 1);
+}
 
 static int _ILJitIsStringClass(ILClass *info)
 {
@@ -153,6 +555,20 @@
                                                     ILUInt32 firstParam, 
ILEngineStackItem *args,
                                                         ILUInt32 numArgs)
 {
+       ILJITCoder *jitCoder = _ILCoderToILJITCoder(coder);
+
+#if !defined(IL_CONFIG_REDUCE_CODE) && !defined(IL_WITHOUT_TOOLS)
+       if (jitCoder->flags & IL_CODER_FLAG_STATS)
+       {
+               ILMutexLock(globalTraceMutex);
+               fprintf(stdout,
+                       "PackVarArgs: firstParam: %i, numArgs %i\n", 
+                       firstParam,
+                       numArgs);
+               ILMutexUnlock(globalTraceMutex);
+       }
+#endif
+       _ILJitPackVarArgs(jitCoder, firstParam, numArgs, callSiteSig);
 }
 
 static void JITCoder_ValueCtorArgs(ILCoder *coder, ILClass *classInfo,
Index: pnet/engine/jitc_obj.c
diff -u pnet/engine/jitc_obj.c:1.12 pnet/engine/jitc_obj.c:1.13
--- pnet/engine/jitc_obj.c:1.12 Sat Mar  4 14:36:08 2006
+++ pnet/engine/jitc_obj.c      Wed Mar  8 21:03:52 2006
@@ -127,7 +127,7 @@
 {
        if(mayBeNull)
        {
-               jit_insn_check_null(coder->jitFunction, base);
+               _ILJitCheckNull(coder, base);
        }
        return jit_insn_add_relative(coder->jitFunction, base, offset);
 }
@@ -145,7 +145,7 @@
 
        if(mayBeNull)
        {
-               jit_insn_check_null(coder->jitFunction, base);
+               _ILJitCheckNull(coder, base);
        }
        value =  jit_insn_load_relative(coder->jitFunction, base, offset, type);
        return _ILJitValueConvertToStackType(coder->jitFunction, value);
@@ -163,7 +163,7 @@
 
        if(mayBeNull)
        {
-               jit_insn_check_null(coder->jitFunction, base);
+               _ILJitCheckNull(coder, base);
        }
        if(jit_value_get_type(value) != type)
        {
@@ -259,8 +259,7 @@
                                                                   ILType 
*fieldType)
 {
        ILJITCoder *jitCoder = _ILCoderToILJITCoder(coder);
-       /* We need argNum + 1 because the ILExecThread is added as param 0 */
-       ILJitValue param = jit_value_get_param(jitCoder->jitFunction, 1);
+       ILJitValue param = _ILJitParamValue(jitCoder, 0);
 
 #if !defined(IL_CONFIG_REDUCE_CODE) && !defined(IL_WITHOUT_TOOLS)
        if (jitCoder->flags & IL_CODER_FLAG_STATS)
@@ -490,8 +489,8 @@
        /*
         * Do the verification early.
         */
-       jit_insn_check_null(jitCoder->jitFunction, dest);
-       jit_insn_check_null(jitCoder->jitFunction, src);
+       _ILJitCheckNull(jitCoder, dest);
+       _ILJitCheckNull(jitCoder, src);
 
        jit_insn_memcpy(jitCoder->jitFunction, dest, src, memSize);
        JITC_ADJUST(jitCoder, -2);
@@ -508,8 +507,8 @@
        /*
         * Do the verification early.
         */
-       jit_insn_check_null(jitCoder->jitFunction, dest);
-       jit_insn_check_null(jitCoder->jitFunction, src);
+       _ILJitCheckNull(jitCoder, dest);
+       _ILJitCheckNull(jitCoder, src);
 
        jit_insn_memcpy(jitCoder->jitFunction, dest, src, size);
        JITC_ADJUST(jitCoder, -3);
@@ -531,7 +530,7 @@
        /*
         * Do the verification early.
         */
-       jit_insn_check_null(jitCoder->jitFunction, dest);
+       _ILJitCheckNull(jitCoder, dest);
 
        jit_insn_memset(jitCoder->jitFunction, dest, value, memSize);
 
@@ -548,7 +547,7 @@
        /*
         * Do the verification early.
         */
-       jit_insn_check_null(jitCoder->jitFunction, dest);
+       _ILJitCheckNull(jitCoder, dest);
 
        value = jit_insn_convert(jitCoder->jitFunction, value, 
_IL_JIT_TYPE_BYTE, 0);
        jit_insn_memset(jitCoder->jitFunction, dest, value, size);
Index: pnet/engine/jitc_setup.c
diff -u pnet/engine/jitc_setup.c:1.10 pnet/engine/jitc_setup.c:1.11
--- pnet/engine/jitc_setup.c:1.10       Sun Feb 19 18:31:11 2006
+++ pnet/engine/jitc_setup.c    Wed Mar  8 21:03:52 2006
@@ -21,73 +21,6 @@
 #ifdef IL_JITC_CODE
 
 /*
- * Allocate enough space for "n" locals.
- */
-#define        ALLOC_LOCALS(n) \
-                       do { \
-                               ILUInt32 temp = (ILUInt32)(((n) + 7) & ~7); \
-                               if(temp > coder->maxLocals) \
-                               { \
-                                       jit_value_t *newLocals = \
-                                               (jit_value_t 
*)ILRealloc(coder->jitLocals, \
-                                                                               
          temp * sizeof(jit_value_t)); \
-                                       if(!newLocals) \
-                                       { \
-                                               return 0; \
-                                       } \
-                                       coder->jitLocals = newLocals; \
-                                       coder->maxLocals = temp; \
-                               } \
-                       } while (0)
-
-
-/*
- * Create the jit vars for the declared local variables.
- * Returns zero if out of memory.
- */
-static int _JITCreateLocals(ILJITCoder *coder, ILStandAloneSig *localVarSig)
-{
-       ILType *signature;
-       ILType *type;
-       ILJitType jitType;
-       ILUInt32 num;
-       ILUInt32 current;
-
-       if(localVarSig)
-       {
-               /* Determine the number of locals to allocate */
-               signature = ILStandAloneSigGetType(localVarSig);
-               num = ILTypeNumLocals(signature);
-
-               /* Allocate the "jitLocals" array for the variables */
-               ALLOC_LOCALS(num);
-
-               /* Set the offsets for each of the local variables */
-               for(current = 0; current < num; ++current)
-               {
-                       type = ILTypeGetLocal(signature, current);
-                       if(!(jitType = _ILJitGetLocalsType(type, 
coder->process)))
-                       {
-                               return 0;
-                       }
-                       if(!(coder->jitLocals[current] = 
jit_value_create(coder->jitFunction, jitType)))
-                       {
-                               return 0;
-                       }
-               }
-               /* Record the number of used locals in the coder. */
-               coder->numLocals = num;
-       }
-       else
-       {
-               /* Set the number of used locals to 0. */
-               coder->numLocals = 0;
-       }
-
-       return 1;
-}
-
-/*
  * Set up a JIT coder instance to process a specific method.
  */
 static int JITCoder_Setup(ILCoder *_coder, unsigned char **start,
@@ -114,8 +47,14 @@
        /* Initialize the mem stack for the label stackstates. */
        ILMemStackInit(&(coder->stackStates), 0);
 
+       /* Create the parameters. */
+       if(!_ILJitParamsCreate(coder))
+       {
+               return 0;
+       }
+
        /* Create the local variables. */
-       if(!_JITCreateLocals(coder, code->localVarSig))
+       if(!_ILJitLocalsCreate(coder, code->localVarSig))
        {
                return 0;
        }
Index: pnet/engine/jitc_stack.c
diff -u pnet/engine/jitc_stack.c:1.4 pnet/engine/jitc_stack.c:1.5
--- pnet/engine/jitc_stack.c:1.4        Sun Feb 19 18:31:11 2006
+++ pnet/engine/jitc_stack.c    Wed Mar  8 21:03:52 2006
@@ -48,9 +48,23 @@
 {
        ILJITCoder *jitCoder = _ILCoderToILJITCoder(coder);
 
+#if !defined(IL_CONFIG_REDUCE_CODE) && !defined(IL_WITHOUT_TOOLS)
+       if (jitCoder->flags & IL_CODER_FLAG_STATS)
+       {
+               ILMutexLock(globalTraceMutex);
+               fprintf(stdout,
+                       "Dup: \n");
+               ILMutexUnlock(globalTraceMutex);
+       }
+#endif
+#ifdef _IL_JIT_OPTIMIZE_LOCALS
+       jitCoder->jitStack[jitCoder->stackTop] = 
+                                        jitCoder->jitStack[jitCoder->stackTop 
- 1];
+#else
        jitCoder->jitStack[jitCoder->stackTop] = 
                jit_insn_dup(jitCoder->jitFunction,
                                         jitCoder->jitStack[jitCoder->stackTop 
- 1]);
+#endif
        JITC_ADJUST(jitCoder, 1);
 }
 
Index: pnet/engine/jitc_var.c
diff -u pnet/engine/jitc_var.c:1.6 pnet/engine/jitc_var.c:1.7
--- pnet/engine/jitc_var.c:1.6  Fri Feb 10 18:16:21 2006
+++ pnet/engine/jitc_var.c      Wed Mar  8 21:03:52 2006
@@ -27,10 +27,14 @@
 static void JITCoder_LoadArg(ILCoder *coder, ILUInt32 argNum, ILType *type)
 {
        ILJITCoder *jitCoder = _ILCoderToILJITCoder(coder);
-       /* We need argNum + 1 because the ILExecThread is added as param 0 */
-       ILJitValue param = jit_value_get_param(jitCoder->jitFunction, argNum + 
1);
+       ILJitValue param = _ILJitParamValue(jitCoder, argNum);
+#ifdef _IL_JIT_OPTIMIZE_LOCALS
+       ILJitValue newParam = 
_ILJitValueConvertToStackType(jitCoder->jitFunction,
+                                                                               
                                param);
+#else
        ILJitValue newParam = 
_ILJitValueConvertToStackType(jitCoder->jitFunction,
                                                                        
jit_insn_dup(jitCoder->jitFunction, param));
+#endif
 
 #if !defined(IL_CONFIG_REDUCE_CODE) && !defined(IL_WITHOUT_TOOLS)
        if (jitCoder->flags & IL_CODER_FLAG_STATS)
@@ -52,8 +56,12 @@
 static void JITCoder_LoadLocal(ILCoder *coder, ILUInt32 localNum, ILType *type)
 {
        ILJITCoder *jitCoder = _ILCoderToILJITCoder(coder);
+#ifdef _IL_JIT_OPTIMIZE_LOCALS
+       ILJitValue localValue = _ILJitLocalValue(jitCoder, localNum);
+#else
        ILJitValue localValue = jit_insn_dup(jitCoder->jitFunction,
-                                                                               
 jitCoder->jitLocals[localNum]);
+                                                                               
 _ILJitLocalValue(jitCoder, localNum));
+#endif
 
 #if !defined(IL_CONFIG_REDUCE_CODE) && !defined(IL_WITHOUT_TOOLS)
        if (jitCoder->flags & IL_CODER_FLAG_STATS)
@@ -78,8 +86,7 @@
                                                          ILEngineType 
engineType, ILType *type)
 {
        ILJITCoder *jitCoder = _ILCoderToILJITCoder(coder);
-       /* We need argNum + 1 because the ILExecThread is added as param 0 */
-       ILJitValue argValue = jit_value_get_param(jitCoder->jitFunction, argNum 
+ 1);
+       ILJitValue argValue = _ILJitParamValue(jitCoder, argNum);
 
 #if !defined(IL_CONFIG_REDUCE_CODE) && !defined(IL_WITHOUT_TOOLS)
        if (jitCoder->flags & IL_CODER_FLAG_STATS)
@@ -91,10 +98,15 @@
                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 - 
1]);
+                                       jitCoder->jitStack[jitCoder->stackTop]);
 
-       JITC_ADJUST(jitCoder, -1);
 }
 
 /*
@@ -104,6 +116,7 @@
                                                                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)
@@ -115,10 +128,16 @@
                ILMutexUnlock(globalTraceMutex);
        }
 #endif
-       jit_insn_store(jitCoder->jitFunction, jitCoder->jitLocals[localNum],
-                                       jitCoder->jitStack[jitCoder->stackTop - 
1]);
 
        JITC_ADJUST(jitCoder, -1);
+
+#ifdef _IL_JIT_OPTIMIZE_LOCALS
+       _ILJitValueFindAndDup(jitCoder, localValue);
+#endif
+
+       jit_insn_store(jitCoder->jitFunction, localValue,
+                                       jitCoder->jitStack[jitCoder->stackTop]);
+
 }
 
 /*
@@ -127,11 +146,9 @@
 static void JITCoder_AddrOfArg(ILCoder *coder, ILUInt32 argNum)
 {
        ILJITCoder *jitCoder = _ILCoderToILJITCoder(coder);
-       /* We need argNum + 1 because the ILExecThread is added as param 0 */
-       ILJitValue argValue = jit_value_get_param(jitCoder->jitFunction, argNum 
+ 1);
 
-       jitCoder->jitStack[jitCoder->stackTop] = 
-                                       
jit_insn_address_of(jitCoder->jitFunction, argValue);
+       jitCoder->jitStack[jitCoder->stackTop] = 
_ILJitParamGetPointerTo(jitCoder,
+                                                                               
                                                         argNum);
        JITC_ADJUST(jitCoder, 1);
 }
 
@@ -141,10 +158,9 @@
 static void JITCoder_AddrOfLocal(ILCoder *coder, ILUInt32 localNum)
 {
        ILJITCoder *jitCoder = _ILCoderToILJITCoder(coder);
-       ILJitValue localValue = jitCoder->jitLocals[localNum];
 
-       jitCoder->jitStack[jitCoder->stackTop] = 
-                                       
jit_insn_address_of(jitCoder->jitFunction, localValue);
+       jitCoder->jitStack[jitCoder->stackTop] = 
_ILJitLocalGetPointerTo(jitCoder,
+                                                                               
                                                         localNum);
        JITC_ADJUST(jitCoder, 1);
 }
 




reply via email to

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