[Top][All Lists]
[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);
}
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [dotgnu-pnet-commits] pnet ./ChangeLog engine/jitc.c engine/jitc_bran...,
Klaus Treichel <=