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.h en...


From: Klaus Treichel
Subject: [dotgnu-pnet-commits] pnet ./ChangeLog engine/jitc.c engine/jitc.h en...
Date: Wed, 04 Jan 2006 18:54:39 +0000

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

Modified files:
        .              : ChangeLog 
        engine         : jitc.c jitc.h jitc_branch.c jitc_conv.c 
                         jitc_ptr.c 

Log message:
        Add more of the jit coder.

CVSWeb URLs:
http://cvs.savannah.gnu.org/viewcvs/dotgnu-pnet/pnet/ChangeLog.diff?tr1=1.3266&tr2=1.3267&r1=text&r2=text
http://cvs.savannah.gnu.org/viewcvs/dotgnu-pnet/pnet/engine/jitc.c.diff?tr1=1.7&tr2=1.8&r1=text&r2=text
http://cvs.savannah.gnu.org/viewcvs/dotgnu-pnet/pnet/engine/jitc.h.diff?tr1=1.5&tr2=1.6&r1=text&r2=text
http://cvs.savannah.gnu.org/viewcvs/dotgnu-pnet/pnet/engine/jitc_branch.c.diff?tr1=1.3&tr2=1.4&r1=text&r2=text
http://cvs.savannah.gnu.org/viewcvs/dotgnu-pnet/pnet/engine/jitc_conv.c.diff?tr1=1.1&tr2=1.2&r1=text&r2=text
http://cvs.savannah.gnu.org/viewcvs/dotgnu-pnet/pnet/engine/jitc_ptr.c.diff?tr1=1.1&tr2=1.2&r1=text&r2=text

Patches:
Index: pnet/ChangeLog
diff -u pnet/ChangeLog:1.3266 pnet/ChangeLog:1.3267
--- pnet/ChangeLog:1.3266       Mon Jan  2 11:39:23 2006
+++ pnet/ChangeLog      Wed Jan  4 18:54:38 2006
@@ -1,3 +1,9 @@
+2006-01-04  Klaus Treichel  <address@hidden>
+
+       * engine/jitc.c, engine/jitc.h, engine/jitc_branch.c, 
engine/jitc_conv.c,
+       engine/jitc_ptr.c: Implement the type conversion opcodes, the array 
stuff
+       and some other pointer related opcodes.
+.
 2006-01-02  Klaus Treichel  <address@hidden>
 
        * engine/jitc_stack.c: Implement JITCoder_StackRefresh.
Index: pnet/engine/jitc.c
diff -u pnet/engine/jitc.c:1.7 pnet/engine/jitc.c:1.8
--- pnet/engine/jitc.c:1.7      Fri Dec 30 17:42:19 2005
+++ pnet/engine/jitc.c  Wed Jan  4 18:54:39 2006
@@ -459,10 +459,10 @@
        _ILJitTypesInitBase(&_ILJitType_VPTR, jit_type_void_ptr);
 
        /* Initialize the native method signatures. */
-       args[0] = jit_type_void_ptr;
-       args[1] = jit_type_void_ptr;
+       args[0] = _IL_JIT_TYPE_VPTR;
+       args[1] = _IL_JIT_TYPE_VPTR;
        args[2] = jit_type_int;
-       returnType = jit_type_void_ptr;
+       returnType = _IL_JIT_TYPE_VPTR;
        if(!(_ILJitSignature_ILEngineAlloc = 
                jit_type_create_signature(IL_JIT_CALLCONV_CDECL, returnType, 
args, 3, 1)))
        {
@@ -562,6 +562,8 @@
                jit_context_destroy(coder->context);
                coder->context = 0;
        }
+       ILMemPoolDestroy(&(coder->labelPool));
+
        ILFree(coder);
 }
 
@@ -673,15 +675,23 @@
 #endif /* IL_CONFIG_PINVOKE */
 
 /*
+ * Set the method member in the ILExecThread instance.
+ */
+static void SetMethodInThread(jit_function_t func, ILJitValue thread, ILMethod 
*method)
+{
+       ILJitValue methodPtr = jit_value_create_nint_constant(func, 
_IL_JIT_TYPE_VPTR, (jit_nint)method);
+
+       jit_insn_store_relative(func, thread, offsetof(ILExecThread, method), 
methodPtr);
+}
+
+/*
  * Generate the stub for calling an internal function.
  */
 static int _ILJitCompileInternal(jit_function_t func, ILMethod *method, void 
*nativeFunction)
 {
        ILJitType signature = jit_function_get_signature(func);
-       ILJitType returnType = jit_type_get_return(signature);
        unsigned int numParams = jit_type_num_params(signature);
        ILJitValue returnValue;
-       ILJitValue methodPtr = jit_value_create_nint_constant(func, 
jit_type_void_ptr, (jit_nint)method);
 
        /* We need to set the method member in the ILExecThread == arg[0]. */
        if(numParams > 0)
@@ -696,7 +706,7 @@
                                return JIT_RESULT_OUT_OF_MEMORY;
                        }
                }
-               jit_insn_store_relative(func, jitParams[0], 
offsetof(ILExecThread, method), methodPtr);
+               SetMethodInThread(func, jitParams[0], method);
                returnValue = jit_insn_call_native(func, 0, nativeFunction, 
signature, jitParams, numParams, 0);
        }
        else
Index: pnet/engine/jitc.h
diff -u pnet/engine/jitc.h:1.5 pnet/engine/jitc.h:1.6
--- pnet/engine/jitc.h:1.5      Fri Dec 30 17:42:19 2005
+++ pnet/engine/jitc.h  Wed Jan  4 18:54:39 2006
@@ -43,7 +43,7 @@
 #define _IL_JIT_TYPE_UINT32    jit_type_uint
 #define _IL_JIT_TYPE_UINT64    jit_type_ulong
 #define _IL_JIT_TYPE_NUINT     jit_type_nuint
-#define _IL_JIT_TYPE_VPTR      jit_type_void_ptr;
+#define _IL_JIT_TYPE_VPTR      jit_type_void_ptr
  
 /*
  * Definition of method metadata indexes.
Index: pnet/engine/jitc_branch.c
diff -u pnet/engine/jitc_branch.c:1.3 pnet/engine/jitc_branch.c:1.4
--- pnet/engine/jitc_branch.c:1.3       Sat Dec 31 09:16:04 2005
+++ pnet/engine/jitc_branch.c   Wed Jan  4 18:54:39 2006
@@ -227,7 +227,7 @@
                {
                        /* Test two values for equality */
                        AdjustMixedBinary(coder, 0, value1, value2);
-                       return jit_insn_eq(coder->jitFunction, *value2, 
*value1);
+                       return jit_insn_eq(coder->jitFunction, *value1, 
*value2);
                }
                break;
 
@@ -235,7 +235,7 @@
                {
                        /* Test two unsigned values for inequality */
                        AdjustMixedBinary(coder, 1, value1, value2);
-                       return jit_insn_ne(coder->jitFunction, *value2, 
*value1);
+                       return jit_insn_ne(coder->jitFunction, *value1, 
*value2);
                }
                break;
 
@@ -244,7 +244,7 @@
                {
                        /* Test two signed values for greater than */
                        AdjustMixedBinary(coder, 0, value1, value2);
-                       return jit_insn_gt(coder->jitFunction, *value2, 
*value1);
+                       return jit_insn_gt(coder->jitFunction, *value1, 
*value2);
                }
                break;
 
@@ -253,7 +253,7 @@
                {
                        /* Test two unsigned values for greater than */
                        AdjustMixedBinary(coder, 1, value1, value2);
-                       return jit_insn_gt(coder->jitFunction, *value2, 
*value1);
+                       return jit_insn_gt(coder->jitFunction, *value1, 
*value2);
                }
                break;
 
@@ -261,7 +261,7 @@
                {
                        /* Test two signed values for greater than  or equal */
                        AdjustMixedBinary(coder, 0, value1, value2);
-                       return jit_insn_ge(coder->jitFunction, *value2, 
*value1);
+                       return jit_insn_ge(coder->jitFunction, *value1, 
*value2);
                }
                break;
 
@@ -269,7 +269,7 @@
                {
                        /* Test two unsigned values for greater than  or equal 
*/
                        AdjustMixedBinary(coder, 1, value1, value2);
-                       return jit_insn_ge(coder->jitFunction, *value2, 
*value1);
+                       return jit_insn_ge(coder->jitFunction, *value1, 
*value2);
                }
                break;
 
@@ -278,7 +278,7 @@
                {
                        /* Test two signed values for less than */
                        AdjustMixedBinary(coder, 0, value1, value2);
-                       return jit_insn_lt(coder->jitFunction, *value2, 
*value1);
+                       return jit_insn_lt(coder->jitFunction, *value1, 
*value2);
                }
                break;
 
@@ -287,7 +287,7 @@
                {
                        /* Test two unsigned values for less than */
                        AdjustMixedBinary(coder, 1, value1, value2);
-                       return jit_insn_lt(coder->jitFunction, *value2, 
*value1);
+                       return jit_insn_lt(coder->jitFunction, *value1, 
*value2);
                }
                break;
 
@@ -295,7 +295,7 @@
                {
                        /* Test two signed values for less than or equal */
                        AdjustMixedBinary(coder, 0, value1, value2);
-                       return jit_insn_le(coder->jitFunction, *value2, 
*value1);
+                       return jit_insn_le(coder->jitFunction, *value1, 
*value2);
                }
                break;
 
@@ -303,7 +303,7 @@
                {
                        /* Test two unsigned values for less than  or equal */
                        AdjustMixedBinary(coder, 1, value1, value2);
-                       return jit_insn_lt(coder->jitFunction, *value2, 
*value1);
+                       return jit_insn_lt(coder->jitFunction, *value1, 
*value2);
                }
                break;
        }
@@ -360,8 +360,8 @@
                {
                        /* Equality testing branch */
                        temp = OutputCompare(jitCoder, IL_OP_BEQ,
-                                                                
&(jitCoder->jitStack[jitCoder->stackTop - 1]),
-                                                                
&(jitCoder->jitStack[jitCoder->stackTop - 2]));
+                                                                
&(jitCoder->jitStack[jitCoder->stackTop - 2]),
+                                                                
&(jitCoder->jitStack[jitCoder->stackTop - 1]));
                        jit_insn_branch_if(jitCoder->jitFunction, temp, 
&(label->label));
                        JITC_ADJUST(jitCoder, -2);
                }
@@ -372,8 +372,8 @@
                {
                        /* Unsigned inequality testing branch */
                        temp = OutputCompare(jitCoder, IL_OP_BNE_UN,
-                                                                
&(jitCoder->jitStack[jitCoder->stackTop - 1]),
-                                                                
&(jitCoder->jitStack[jitCoder->stackTop - 2]));
+                                                                
&(jitCoder->jitStack[jitCoder->stackTop - 2]),
+                                                                
&(jitCoder->jitStack[jitCoder->stackTop - 1]));
                        jit_insn_branch_if(jitCoder->jitFunction, temp, 
&(label->label));
                        JITC_ADJUST(jitCoder, -2);
                }
@@ -384,8 +384,8 @@
                {
                        /* Signed greater than testing branch */
                        temp = OutputCompare(jitCoder, IL_OP_BGT,
-                                                                
&(jitCoder->jitStack[jitCoder->stackTop - 1]),
-                                                                
&(jitCoder->jitStack[jitCoder->stackTop - 2]));
+                                                                
&(jitCoder->jitStack[jitCoder->stackTop - 2]),
+                                                                
&(jitCoder->jitStack[jitCoder->stackTop - 1]));
                        jit_insn_branch_if(jitCoder->jitFunction, temp, 
&(label->label));
                        JITC_ADJUST(jitCoder, -2);
                }
@@ -396,8 +396,8 @@
                {
                        /* Unsigned greater than testing branch */
                        temp = OutputCompare(jitCoder, IL_OP_BGT_UN,
-                                                                
&(jitCoder->jitStack[jitCoder->stackTop - 1]),
-                                                                
&(jitCoder->jitStack[jitCoder->stackTop - 2]));
+                                                                
&(jitCoder->jitStack[jitCoder->stackTop - 2]),
+                                                                
&(jitCoder->jitStack[jitCoder->stackTop - 1]));
                        jit_insn_branch_if(jitCoder->jitFunction, temp, 
&(label->label));
                        JITC_ADJUST(jitCoder, -2);
                }
@@ -408,8 +408,8 @@
                {
                        /* Signed greater than or equal testing branch */
                        temp = OutputCompare(jitCoder, IL_OP_BGE,
-                                                                
&(jitCoder->jitStack[jitCoder->stackTop - 1]),
-                                                                
&(jitCoder->jitStack[jitCoder->stackTop - 2]));
+                                                                
&(jitCoder->jitStack[jitCoder->stackTop - 2]),
+                                                                
&(jitCoder->jitStack[jitCoder->stackTop - 1]));
                        jit_insn_branch_if(jitCoder->jitFunction, temp, 
&(label->label));
                        JITC_ADJUST(jitCoder, -2);
                }
@@ -420,8 +420,8 @@
                {
                        /* Unsigned greater than or equal testing branch */
                        temp = OutputCompare(jitCoder, IL_OP_BGE_UN,
-                                                                
&(jitCoder->jitStack[jitCoder->stackTop - 1]),
-                                                                
&(jitCoder->jitStack[jitCoder->stackTop - 2]));
+                                                                
&(jitCoder->jitStack[jitCoder->stackTop - 2]),
+                                                                
&(jitCoder->jitStack[jitCoder->stackTop - 1]));
                        jit_insn_branch_if(jitCoder->jitFunction, temp, 
&(label->label));
                        JITC_ADJUST(jitCoder, -2);
                }
@@ -432,8 +432,8 @@
                {
                        /* Signed less than testing branch */
                        temp = OutputCompare(jitCoder, IL_OP_BLT,
-                                                                
&(jitCoder->jitStack[jitCoder->stackTop - 1]),
-                                                                
&(jitCoder->jitStack[jitCoder->stackTop - 2]));
+                                                                
&(jitCoder->jitStack[jitCoder->stackTop - 2]),
+                                                                
&(jitCoder->jitStack[jitCoder->stackTop - 1]));
                        jit_insn_branch_if(jitCoder->jitFunction, temp, 
&(label->label));
                        JITC_ADJUST(jitCoder, -2);
                }
@@ -444,8 +444,8 @@
                {
                        /* Unsigned less than testing branch */
                        temp = OutputCompare(jitCoder, IL_OP_BLT_UN,
-                                                                
&(jitCoder->jitStack[jitCoder->stackTop - 1]),
-                                                                
&(jitCoder->jitStack[jitCoder->stackTop - 2]));
+                                                                
&(jitCoder->jitStack[jitCoder->stackTop - 2]),
+                                                                
&(jitCoder->jitStack[jitCoder->stackTop - 1]));
                        jit_insn_branch_if(jitCoder->jitFunction, temp, 
&(label->label));
                        JITC_ADJUST(jitCoder, -2);
                }
@@ -456,8 +456,8 @@
                {
                        /* Signed less than or equal testing branch */
                        temp = OutputCompare(jitCoder, IL_OP_BLE,
-                                                                
&(jitCoder->jitStack[jitCoder->stackTop - 1]),
-                                                                
&(jitCoder->jitStack[jitCoder->stackTop - 2]));
+                                                                
&(jitCoder->jitStack[jitCoder->stackTop - 2]),
+                                                                
&(jitCoder->jitStack[jitCoder->stackTop - 1]));
                        jit_insn_branch_if(jitCoder->jitFunction, temp, 
&(label->label));
                        JITC_ADJUST(jitCoder, -2);
                }
@@ -468,8 +468,8 @@
                {
                        /* Unsigned less than or equal testing branch */
                        temp = OutputCompare(jitCoder, IL_OP_BLE_UN,
-                                                                
&(jitCoder->jitStack[jitCoder->stackTop - 1]),
-                                                                
&(jitCoder->jitStack[jitCoder->stackTop - 2]));
+                                                                
&(jitCoder->jitStack[jitCoder->stackTop - 2]),
+                                                                
&(jitCoder->jitStack[jitCoder->stackTop - 1]));
                        jit_insn_branch_if(jitCoder->jitFunction, temp, 
&(label->label));
                        JITC_ADJUST(jitCoder, -2);
                }
@@ -503,8 +503,8 @@
        ILJitValue temp;
 
        temp = OutputCompare(jitCoder, opcode,
-                                                
&(jitCoder->jitStack[jitCoder->stackTop - 1]),
-                                                
&(jitCoder->jitStack[jitCoder->stackTop - 2]));
+                                                
&(jitCoder->jitStack[jitCoder->stackTop - 2]),
+                                                
&(jitCoder->jitStack[jitCoder->stackTop - 1]));
        if(invertTest)
        {
                temp = jit_insn_to_not_bool(jitCoder->jitFunction, temp);
Index: pnet/engine/jitc_conv.c
diff -u pnet/engine/jitc_conv.c:1.1 pnet/engine/jitc_conv.c:1.2
--- pnet/engine/jitc_conv.c:1.1 Mon Dec 19 18:00:35 2005
+++ pnet/engine/jitc_conv.c     Wed Jan  4 18:54:39 2006
@@ -21,10 +21,515 @@
 #ifdef IL_JITC_CODE
 
 /*
+ * Make sure that the given value is signed or unsigned.
+ * Does a conversion if necessairy and returns the converted item
+ * or returns the item as it is.
+ */
+static ILJitValue ConvertSign(ILJITCoder *jitCoder, ILJitValue value,
+                                                         int isUnsigned, int 
checkOverflow)
+{
+       ILJitType type = jit_value_get_type(value);
+       
+       type = jit_type_normalize(type);
+
+       if(isUnsigned)
+       {
+               if(type == _IL_JIT_TYPE_INT32)
+               {
+                       return jit_insn_convert(jitCoder->jitFunction,
+                                                                       value,
+                                                                       
_IL_JIT_TYPE_UINT32,
+                                                                       
checkOverflow);
+               }
+               else if(type == _IL_JIT_TYPE_INT64)
+               {
+                       return jit_insn_convert(jitCoder->jitFunction,
+                                                                       value,
+                                                                       
_IL_JIT_TYPE_UINT64,
+                                                                       
checkOverflow);
+               }
+       }
+       else
+       {
+               if(type == _IL_JIT_TYPE_UINT32)
+               {
+                       return jit_insn_convert(jitCoder->jitFunction,
+                                                                       value,
+                                                                       
_IL_JIT_TYPE_INT32,
+                                                                       
checkOverflow);
+               }
+               else if(type == _IL_JIT_TYPE_UINT64)
+               {
+                       return jit_insn_convert(jitCoder->jitFunction,
+                                                                       value,
+                                                                       
_IL_JIT_TYPE_INT64,
+                                                                       
checkOverflow);
+               }
+       }
+       return value;
+}
+
+/*
+ * 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];
+
+       value = ConvertSign(jitCoder, 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)
 {
+       ILJITCoder *jitCoder = _ILCoderToILJITCoder(coder);
+       ILJitValue value;
+
+       /* Determine how to convert the value */
+       switch(opcode)
+       {
+               case IL_OP_CONV_I1:
+               {
+                       /* Convert to "int8" */
+                       value = ConvertValue(jitCoder, IL_OP_CONV_I1, 0, 0);
+                       jitCoder->jitStack[jitCoder->stackTop - 1] =
+                                       jit_insn_convert(jitCoder->jitFunction,
+                                                                        value,
+                                                                        
_IL_JIT_TYPE_INT32,
+                                                                        0);
+               }
+               break;
+
+               case IL_OP_CONV_I2:
+               {
+                       /* Convert to "int16" */
+                       value = ConvertValue(jitCoder, IL_OP_CONV_I2, 0, 0);
+                       jitCoder->jitStack[jitCoder->stackTop - 1] =
+                                       jit_insn_convert(jitCoder->jitFunction,
+                                                                        value,
+                                                                        
_IL_JIT_TYPE_INT32,
+                                                                        0);
+               }
+               break;
+
+               case IL_OP_CONV_I4:
+       #ifdef IL_NATIVE_INT32
+               case IL_OP_CONV_I:
+       #endif
+               {
+                       /* Convert to "int32" */
+                       value = ConvertValue(jitCoder, IL_OP_CONV_I4, 0, 0);
+                       jitCoder->jitStack[jitCoder->stackTop - 1] = value;
+               }
+               break;
+
+               case IL_OP_CONV_I8:
+       #ifdef IL_NATIVE_INT64
+               case IL_OP_CONV_I:
+       #endif
+               {
+                       /* Convert to "int64" */
+                       value = ConvertValue(jitCoder, IL_OP_CONV_I8, 0, 0);
+                       jitCoder->jitStack[jitCoder->stackTop - 1] = value;
+               }
+               break;
+
+               case IL_OP_CONV_R4:
+               {
+                       /* Convert to "float32" */
+                       value = ConvertValue(jitCoder, IL_OP_CONV_R4, 0, 0);
+                       jitCoder->jitStack[jitCoder->stackTop - 1] =
+                                       jit_insn_convert(jitCoder->jitFunction,
+                                                                        value,
+                                                                        
_IL_JIT_TYPE_NFLOAT,
+                                                                        0);
+               }
+               break;
+
+               case IL_OP_CONV_R8:
+               {
+                       /* Convert to "float64" */
+                       value = ConvertValue(jitCoder, IL_OP_CONV_R8, 0, 0);
+                       jitCoder->jitStack[jitCoder->stackTop - 1] =
+                                       jit_insn_convert(jitCoder->jitFunction,
+                                                                        value,
+                                                                        
_IL_JIT_TYPE_NFLOAT,
+                                                                        0);
+               }
+               break;
+
+               case IL_OP_CONV_U1:
+               {
+                       /* Convert to "unsigned int8" */
+                       value = ConvertValue(jitCoder, IL_OP_CONV_U1, 0, 0);
+                       jitCoder->jitStack[jitCoder->stackTop - 1] =
+                                       jit_insn_convert(jitCoder->jitFunction,
+                                                                        value,
+                                                                        
_IL_JIT_TYPE_UINT32,
+                                                                        0);
+               }
+               break;
+
+               case IL_OP_CONV_U2:
+               {
+                       /* Convert to "unsigned int16" */
+                       value = ConvertValue(jitCoder, IL_OP_CONV_U2, 0, 0);
+                       jitCoder->jitStack[jitCoder->stackTop - 1] =
+                                       jit_insn_convert(jitCoder->jitFunction,
+                                                                        value,
+                                                                        
_IL_JIT_TYPE_UINT32,
+                                                                        0);
+               }
+               break;
+
+               case IL_OP_CONV_U4:
+       #ifdef IL_NATIVE_INT32
+               case IL_OP_CONV_U:
+       #endif
+               {
+                       /* Convert to "unsigned int32" */
+                       value = ConvertValue(jitCoder, IL_OP_CONV_U8, 0, 0);
+                       jitCoder->jitStack[jitCoder->stackTop - 1] = value;
+               }
+               break;
+
+               case IL_OP_CONV_U8:
+       #ifdef IL_NATIVE_INT64
+               case IL_OP_CONV_U:
+       #endif
+               {
+                       /* Convert to "unsigned int64" */
+                       value = ConvertValue(jitCoder, IL_OP_CONV_U8, 0, 0);
+                       jitCoder->jitStack[jitCoder->stackTop - 1] = value;
+               }
+               break;
+
+               case IL_OP_CONV_R_UN:
+               {
+                       /* Convert to "native float" with unsigned input */
+                       value = ConvertValue(jitCoder, IL_OP_CONV_R_UN, 1, 0);
+                       jitCoder->jitStack[jitCoder->stackTop - 1] = value;
+               }
+               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);
+                       jitCoder->jitStack[jitCoder->stackTop - 1] =
+                                       jit_insn_convert(jitCoder->jitFunction,
+                                                                        value,
+                                                                        
_IL_JIT_TYPE_INT32,
+                                                                        0);
+               }
+               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);
+                       jitCoder->jitStack[jitCoder->stackTop - 1] =
+                                       jit_insn_convert(jitCoder->jitFunction,
+                                                                        value,
+                                                                        
_IL_JIT_TYPE_INT32,
+                                                                        0);
+               }
+               break;
+
+               case IL_OP_CONV_OVF_I4_UN:
+       #ifdef IL_NATIVE_INT32
+               case IL_OP_CONV_OVF_I_UN:
+       #endif
+               {
+                       /* Convert to "int32" with unsigned input and overflow 
*/
+                       value = ConvertValue(jitCoder, IL_OP_CONV_I4, 1, 1);
+                       jitCoder->jitStack[jitCoder->stackTop - 1] = value;
+               }
+               break;
+
+               case IL_OP_CONV_OVF_I8_UN:
+       #ifdef IL_NATIVE_INT64
+               case IL_OP_CONV_OVF_I_UN:
+       #endif
+               {
+                       /* Convert to "int64" with unsigned input and overflow 
*/
+                       value = ConvertValue(jitCoder, IL_OP_CONV_I8, 1, 1);
+                       jitCoder->jitStack[jitCoder->stackTop - 1] = value;
+               }
+               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);
+                       jitCoder->jitStack[jitCoder->stackTop - 1] =
+                                       jit_insn_convert(jitCoder->jitFunction,
+                                                                        value,
+                                                                        
_IL_JIT_TYPE_UINT32,
+                                                                        0);
+               }
+               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);
+                       jitCoder->jitStack[jitCoder->stackTop - 1] =
+                                       jit_insn_convert(jitCoder->jitFunction,
+                                                                        value,
+                                                                        
_IL_JIT_TYPE_UINT32,
+                                                                        0);
+               }
+               break;
+
+               case IL_OP_CONV_OVF_U4_UN:
+       #ifdef IL_NATIVE_INT32
+               case IL_OP_CONV_OVF_U_UN:
+       #endif
+               {
+                       /* Convert to "unsigned int32" with unsigned input and 
overflow */
+                       value = ConvertValue(jitCoder, IL_OP_CONV_U4, 1, 1);
+                       jitCoder->jitStack[jitCoder->stackTop - 1] = value;
+               }
+               break;
+
+               case IL_OP_CONV_OVF_U8_UN:
+       #ifdef IL_NATIVE_INT64
+               case IL_OP_CONV_OVF_U_UN:
+       #endif
+               {
+                       /* Convert to "unsigned int64" with unsigned input and 
overflow */
+                       value = ConvertValue(jitCoder, IL_OP_CONV_U8, 1, 1);
+                       jitCoder->jitStack[jitCoder->stackTop - 1] = value;
+               }
+               break;
+
+               case IL_OP_CONV_OVF_I1:
+               {
+                       /* Convert to "int8" with signed input and overflow */
+                       value = ConvertValue(jitCoder, IL_OP_CONV_I1, 0, 1);
+                       jitCoder->jitStack[jitCoder->stackTop - 1] =
+                                       jit_insn_convert(jitCoder->jitFunction,
+                                                                        value,
+                                                                        
_IL_JIT_TYPE_INT32,
+                                                                        0);
+               }
+               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);
+                       jitCoder->jitStack[jitCoder->stackTop - 1] =
+                                       jit_insn_convert(jitCoder->jitFunction,
+                                                                        value,
+                                                                        
_IL_JIT_TYPE_UINT32,
+                                                                        0);
+               }
+               break;
+
+               case IL_OP_CONV_OVF_I2:
+               {
+                       /* Convert to "int16" with signed input and overflow */
+                       value = ConvertValue(jitCoder, IL_OP_CONV_I2, 0, 1);
+                       jitCoder->jitStack[jitCoder->stackTop - 1] =
+                                       jit_insn_convert(jitCoder->jitFunction,
+                                                                        value,
+                                                                        
_IL_JIT_TYPE_INT32,
+                                                                        0);
+               }
+               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);
+                       jitCoder->jitStack[jitCoder->stackTop - 1] =
+                                       jit_insn_convert(jitCoder->jitFunction,
+                                                                        value,
+                                                                        
_IL_JIT_TYPE_UINT32,
+                                                                        0);
+               }
+               break;
+
+               case IL_OP_CONV_OVF_I4:
+       #ifdef IL_NATIVE_INT32
+               case IL_OP_CONV_OVF_I:
+       #endif
+               {
+                       /* Convert to "int32" with signed input and overflow */
+                       value = ConvertValue(jitCoder, IL_OP_CONV_I4, 0, 1);
+                       jitCoder->jitStack[jitCoder->stackTop - 1] = value;
+               }
+               break;
+
+               case IL_OP_CONV_OVF_U4:
+       #ifdef IL_NATIVE_INT32
+               case IL_OP_CONV_OVF_U:
+       #endif
+               {
+                       /* Convert to "unsigned int32" with signed input and 
overflow */
+                       value = ConvertValue(jitCoder, IL_OP_CONV_U4, 0, 1);
+                       jitCoder->jitStack[jitCoder->stackTop - 1] = value;
+               }
+               break;
+
+               case IL_OP_CONV_OVF_I8:
+       #ifdef IL_NATIVE_INT64
+               case IL_OP_CONV_OVF_I:
+       #endif
+               {
+                       /* Convert to "int64" with signed input and overflow */
+                       value = ConvertValue(jitCoder, IL_OP_CONV_I8, 0, 1);
+                       jitCoder->jitStack[jitCoder->stackTop - 1] = value;
+               }
+               break;
+
+               case IL_OP_CONV_OVF_U8:
+       #ifdef IL_NATIVE_INT64
+               case IL_OP_CONV_OVF_U:
+       #endif
+               {
+                       /* Convert to "unsigned int64" with signed input and 
overflow */
+                       value = ConvertValue(jitCoder, IL_OP_CONV_U8, 0, 1);
+                       jitCoder->jitStack[jitCoder->stackTop - 1] = value;
+               }
+               break;
+       }
 }
 
 /*
@@ -33,6 +538,19 @@
 static void JITCoder_ToPointer(ILCoder *coder, ILEngineType type1,
                                                           ILEngineStackItem 
*type2)
 {
+       ILJITCoder *jitCoder = _ILCoderToILJITCoder(coder);
+       ILJitValue *value;
+
+       if(!type2)
+       {
+               value = &(jitCoder->jitStack[jitCoder->stackTop - 1]);
+       }
+       else
+       {
+               value = &(jitCoder->jitStack[jitCoder->stackTop - 2]);
+       }
+       *value = jit_insn_convert(jitCoder->jitFunction,
+                                                         *value, 
_IL_JIT_TYPE_VPTR, 0);
 }
 
 /*
Index: pnet/engine/jitc_ptr.c
diff -u pnet/engine/jitc_ptr.c:1.1 pnet/engine/jitc_ptr.c:1.2
--- pnet/engine/jitc_ptr.c:1.1  Mon Dec 19 18:00:35 2005
+++ pnet/engine/jitc_ptr.c      Wed Jan  4 18:54:39 2006
@@ -21,11 +21,345 @@
 #ifdef IL_JITC_CODE
 
 /*
+ * Validate the address.
+ */
+static void ValidateAddress(ILJITCoder *coder, ILJitValue address)
+{
+       jit_insn_check_null(coder->jitFunction, address);
+}
+
+/*
+ * Get the base pointer to the array data.
+ */
+static ILJitValue GetArrayBase(ILJITCoder *coder, ILJitValue array)
+{
+       return jit_insn_add_relative(coder->jitFunction, array, sizeof(void *));
+}
+
+/*
+ * Get the array length.
+ */
+static ILJitValue GetArrayLength(ILJITCoder *coder, ILJitValue array)
+{
+       ILJitValue len;
+
+       len = jit_insn_load_relative(coder->jitFunction, array, 0,
+                                                                
_IL_JIT_TYPE_UINT32);
+       return len;
+}
+
+/*
+ * Validate the array index.
+ */
+static void ValidateArrayIndex(ILJITCoder *coder, ILJitValue length,
+                                                                               
                  ILJitValue index)
+{
+       jit_label_t label1 = jit_label_undefined;
+       jit_label_t label2 = jit_label_undefined;
+       ILJitValue constNull = 
jit_value_create_nint_constant(coder->jitFunction,
+                                                                               
                                  _IL_JIT_TYPE_NINT,
+                                                                               
                                  (jit_nint)0);
+       ILJitValue temp = jit_insn_lt(coder->jitFunction, index, constNull);
+
+       jit_insn_branch_if(coder->jitFunction, temp, &label1);
+       temp = jit_insn_lt(coder->jitFunction, index, length);
+       jit_insn_branch_if(coder->jitFunction, temp, &label2);
+       jit_insn_label(coder->jitFunction, &label1);
+       /* TODO throw the System.IndexOutOfRange exception here. */
+
+       jit_insn_label(coder->jitFunction, &label2);
+
+
+}
+
+/*
+ * Handle the ldelem* instructions.
+ */
+static void LoadArrayElem(ILJITCoder *coder, ILJitType type)
+{
+       ILJitValue array = coder->jitStack[coder->stackTop - 2];
+       ILJitValue index = coder->jitStack[coder->stackTop - 1];
+       ILJitValue length;
+       ILJitValue value;
+       ILJitValue arrayBase;
+       ILJitType  stackType = jit_type_promote_int(type);;
+
+       ValidateAddress(coder, array);
+       length = GetArrayLength(coder, array);
+       ValidateArrayIndex(coder, length, index);
+       arrayBase = GetArrayBase(coder, array);
+       if(type == stackType)
+       {
+               if((type == _IL_JIT_TYPE_SINGLE) || (type == 
_IL_JIT_TYPE_DOUBLE))
+               {
+                       stackType = _IL_JIT_TYPE_NFLOAT;
+               }
+       }
+       value = jit_insn_load_elem(coder->jitFunction, arrayBase, index,
+                                                          type);
+       if(type != stackType)
+       {
+               coder->jitStack[coder->stackTop - 2] =
+                       jit_insn_convert(coder->jitFunction, value,
+                                                        stackType, 0);
+       }
+       else
+       {
+               coder->jitStack[coder->stackTop - 2] = value;
+       }
+       JITC_ADJUST(coder, -1);
+}
+
+/*
+ * Handle the stelem* instructions.
+ */
+static void StoreArrayElem(ILJITCoder *coder, ILJitType type)
+{
+       ILJitValue array = coder->jitStack[coder->stackTop - 3];
+       ILJitValue index = coder->jitStack[coder->stackTop - 2];
+       ILJitValue value = coder->jitStack[coder->stackTop - 1];
+       ILJitValue length;
+       ILJitValue arrayBase;
+
+       ValidateAddress(coder, array);
+       length = GetArrayLength(coder, array);
+       ValidateArrayIndex(coder, length, index);
+       arrayBase = GetArrayBase(coder, array);
+
+       jit_insn_store_elem(coder->jitFunction, arrayBase, index, value);
+       JITC_ADJUST(coder, -3);
+}
+
+/*
+ * Handle the ldind* instructions.
+ */
+static void LoadRelative(ILJITCoder *coder, ILJitType type)
+{
+       ILJitValue ptr = coder->jitStack[coder->stackTop - 1];
+       ILJitValue value;
+       ILJitType  stackType = jit_type_promote_int(type);;
+
+       ValidateAddress(coder, ptr);
+       if(type == stackType)
+       {
+               if((type == _IL_JIT_TYPE_SINGLE) || (type == 
_IL_JIT_TYPE_DOUBLE))
+               {
+                       stackType = _IL_JIT_TYPE_NFLOAT;
+               }
+       }
+       value = jit_insn_load_relative(coder->jitFunction, ptr, (jit_nint)0, 
type);
+       if(type != stackType)
+       {
+               coder->jitStack[coder->stackTop - 1] =
+                       jit_insn_convert(coder->jitFunction, value,
+                                                        stackType, 0);
+       }
+       else
+       {
+               coder->jitStack[coder->stackTop - 1] = value;
+       }
+}
+
+/*
+ * Handle the stind* instructions.
+ */
+static void StoreRelative(ILJITCoder *coder, ILJitType type)
+{
+       ILJitValue ptr = coder->jitStack[coder->stackTop - 2];
+       ILJitValue value  = coder->jitStack[coder->stackTop - 1];
+       ILJitType valueType = jit_value_get_type(value);
+
+       ValidateAddress(coder, ptr);
+       if(valueType != type)
+       {
+               value = jit_insn_convert(coder->jitFunction, value, type, 0);
+       }
+       jit_insn_store_relative(coder->jitFunction, ptr, (jit_nint)0, value);
+       JITC_ADJUST(coder, -2);
+}
+
+/*
  * Handle an array access opcode.
  */
 static void JITCoder_ArrayAccess(ILCoder *coder, int opcode,
                                                                 ILEngineType 
indexType, ILType *elemType)
 {
+       ILJITCoder *jitCoder = _ILCoderToILJITCoder(coder);
+       ILJitValue array;
+       ILJitValue index;
+       ILJitValue len;
+       ILJitValue value;
+       ILJitValue arrayBase;
+
+       switch(opcode)
+       {
+               case IL_OP_LDELEMA:
+               {
+                       array = jitCoder->jitStack[jitCoder->stackTop - 2];
+                       index = jitCoder->jitStack[jitCoder->stackTop - 1];
+
+                       ValidateAddress(jitCoder, array);
+                       len = GetArrayLength(jitCoder, array);
+                       ValidateArrayIndex(jitCoder, array, index);
+                       arrayBase = GetArrayBase(jitCoder, array);
+
+                       ILJitType type = _ILJitGetReturnType(elemType, 
jitCoder->process);
+
+                       value = 
jit_insn_load_elem_address(jitCoder->jitFunction, arrayBase,
+                                                                           
index, type);
+                       jitCoder->jitStack[jitCoder->stackTop - 2] = value;
+                       JITC_ADJUST(jitCoder, -1);
+               }
+               break;
+
+               case IL_OP_LDELEM_I1:
+               {
+                       /* Load a signed byte from an array */
+                       LoadArrayElem(jitCoder, _IL_JIT_TYPE_SBYTE);
+               }
+               break;
+
+               case IL_OP_LDELEM_I2:
+               {
+                       /* Load a signed short from an array */
+                       LoadArrayElem(jitCoder, _IL_JIT_TYPE_INT16);
+               }
+               break;
+
+               case IL_OP_LDELEM_I4:
+       #ifdef IL_NATIVE_INT32
+               case IL_OP_LDELEM_I:
+       #endif
+               {
+                       /* Load an integer from an array */
+                       LoadArrayElem(jitCoder, _IL_JIT_TYPE_INT32);
+               }
+               break;
+
+               case IL_OP_LDELEM_I8:
+       #ifdef IL_NATIVE_INT64
+               case IL_OP_LDELEM_I:
+       #endif
+               {
+                       /* Load a long from an array */
+                       LoadArrayElem(jitCoder, _IL_JIT_TYPE_INT64);
+               }
+               break;
+
+               case IL_OP_LDELEM_U1:
+               {
+                       /* Load an unsigned byte from an array */
+                       LoadArrayElem(jitCoder, _IL_JIT_TYPE_BYTE);
+               }
+               break;
+
+               case IL_OP_LDELEM_U2:
+               {
+                       /* Load an unsigned short from an array */
+                       LoadArrayElem(jitCoder, _IL_JIT_TYPE_UINT16);
+               }
+               break;
+
+               case IL_OP_LDELEM_U4:
+               {
+                       /* Load an unsigned integer from an array */
+                       LoadArrayElem(jitCoder, _IL_JIT_TYPE_UINT32);
+               }
+               break;
+
+               case IL_OP_LDELEM_R4:
+               {
+                       /* Load a 32-bit float from an array */
+                       LoadArrayElem(jitCoder, _IL_JIT_TYPE_SINGLE);
+               }
+               break;
+
+               case IL_OP_LDELEM_R8:
+               {
+                       /* Load a 64-bit float from an array */
+                       LoadArrayElem(jitCoder, _IL_JIT_TYPE_DOUBLE);
+               }
+               break;
+
+               case IL_OP_LDELEM_REF:
+               {
+                       /* Load a pointer from an array */
+                       LoadArrayElem(jitCoder, _IL_JIT_TYPE_VPTR);
+               }
+               break;
+
+               case IL_OP_LDELEM:
+               {
+                       ILJitType type = _ILJitGetReturnType(elemType, 
jitCoder->process);
+                       LoadArrayElem(jitCoder, type);
+               }
+               break;
+
+               case IL_OP_STELEM_I1:
+               {
+                       /* Store a byte value to an array */
+                       StoreArrayElem(jitCoder, _IL_JIT_TYPE_SBYTE);
+               }
+               break;
+
+               case IL_OP_STELEM_I2:
+               {
+                       /* Store a short value to an array */
+                       StoreArrayElem(jitCoder, _IL_JIT_TYPE_INT16);
+               }
+               break;
+
+               case IL_OP_STELEM_I4:
+       #ifdef IL_NATIVE_INT32
+               case IL_OP_STELEM_I:
+       #endif
+               {
+                       /* Store an integer value to an array */
+                       StoreArrayElem(jitCoder, _IL_JIT_TYPE_INT32);
+               }
+               break;
+
+               case IL_OP_STELEM_I8:
+       #ifdef IL_NATIVE_INT64
+               case IL_OP_STELEM_I:
+       #endif
+               {
+                       /* Store a long value to an array */
+                       StoreArrayElem(jitCoder, _IL_JIT_TYPE_INT64);
+               }
+               break;
+
+               case IL_OP_STELEM_R4:
+               {
+                       /* Store a 32-bit floating point value to an array */
+                       StoreArrayElem(jitCoder, _IL_JIT_TYPE_SINGLE);
+               }
+               break;
+
+               case IL_OP_STELEM_R8:
+               {
+                       /* Store a 64-bit floating point value to an array */
+                       StoreArrayElem(jitCoder, _IL_JIT_TYPE_DOUBLE);
+               }
+               break;
+
+               case IL_OP_STELEM_REF:
+               {
+                       /* Store a pointer to an array */
+                       /* TODO: Check if the types are assignmentcompatible. */
+                       StoreArrayElem(jitCoder, _IL_JIT_TYPE_VPTR);
+               }
+               break;
+
+               case IL_OP_STELEM:
+               {
+                       /* Store a pointer to an array */
+                       /* TODO: Check if the types are assignmentcompatible. */
+                       ILJitType type = _ILJitGetReturnType(elemType, 
jitCoder->process);
+                       StoreArrayElem(jitCoder, type);
+               }
+               break;
+       }
 }
 
 /*
@@ -33,6 +367,141 @@
  */
 static void JITCoder_PtrAccess(ILCoder *coder, int opcode)
 {
+       ILJITCoder *jitCoder = _ILCoderToILJITCoder(coder);
+
+       switch(opcode)
+       {
+               case IL_OP_LDIND_I1:
+               {
+                       /* Load a signed byte from a pointer */
+                       LoadRelative(jitCoder, _IL_JIT_TYPE_SBYTE);
+               }
+               break;
+
+               case IL_OP_LDIND_U1:
+               {
+                       /* Load an unsigned byte from a pointer */
+                       LoadRelative(jitCoder, _IL_JIT_TYPE_BYTE);
+               }
+               break;
+
+               case IL_OP_LDIND_I2:
+               {
+                       /* Load a signed short from a pointer */
+                       LoadRelative(jitCoder, _IL_JIT_TYPE_INT16);
+               }
+               break;
+
+               case IL_OP_LDIND_U2:
+               {
+                       /* Load an unsigned short from a pointer */
+                       LoadRelative(jitCoder, _IL_JIT_TYPE_UINT16);
+               }
+               break;
+
+               case IL_OP_LDIND_I4:
+       #ifdef IL_NATIVE_INT32
+               case IL_OP_LDIND_I:
+       #endif
+               {
+                       /* Load an integer from a pointer */
+                       LoadRelative(jitCoder, _IL_JIT_TYPE_INT32);
+               }
+               break;
+
+               case IL_OP_LDIND_U4:
+               {
+                       /* Load an unsigned integer from a pointer */
+                       LoadRelative(jitCoder, _IL_JIT_TYPE_UINT32);
+               }
+               break;
+
+               case IL_OP_LDIND_I8:
+       #ifdef IL_NATIVE_INT64
+               case IL_OP_LDIND_I:
+       #endif
+               {
+                       /* Load a long from a pointer */
+                       LoadRelative(jitCoder, _IL_JIT_TYPE_INT64);
+               }
+               break;
+
+               case IL_OP_LDIND_R4:
+               {
+                       /* Load a 32-bit float from a pointer */
+                       LoadRelative(jitCoder, _IL_JIT_TYPE_SINGLE);
+               }
+               break;
+
+               case IL_OP_LDIND_R8:
+               {
+                       /* Load a 64-bit float from a pointer */
+                       LoadRelative(jitCoder, _IL_JIT_TYPE_DOUBLE);
+               }
+               break;
+
+               case IL_OP_LDIND_REF:
+               {
+                       /* Load a pointer from a pointer */
+                       LoadRelative(jitCoder, _IL_JIT_TYPE_VPTR);
+               }
+               break;
+
+               case IL_OP_STIND_REF:
+               {
+                       /* Store a pointer to a pointer */
+                       StoreRelative(jitCoder, _IL_JIT_TYPE_VPTR);
+               }
+               break;
+
+               case IL_OP_STIND_I1:
+               {
+                       /* Store a byte to a pointer */
+                       StoreRelative(jitCoder, _IL_JIT_TYPE_SBYTE);
+               }
+               break;
+
+               case IL_OP_STIND_I2:
+               {
+                       /* Store a short to a pointer */
+                       StoreRelative(jitCoder, _IL_JIT_TYPE_INT16);
+               }
+               break;
+
+               case IL_OP_STIND_I4:
+       #ifdef IL_NATIVE_INT32
+               case IL_OP_STIND_I:
+       #endif
+               {
+                       /* Store an integer to a pointer */
+                       StoreRelative(jitCoder, _IL_JIT_TYPE_INT32);
+               }
+               break;
+
+               case IL_OP_STIND_I8:
+       #ifdef IL_NATIVE_INT64
+               case IL_OP_STIND_I:
+       #endif
+               {
+                       /* Store a long to a pointer */
+                       StoreRelative(jitCoder, _IL_JIT_TYPE_INT64);
+               }
+               break;
+
+               case IL_OP_STIND_R4:
+               {
+                       /* Store a 32-bit float to a pointer */
+                       StoreRelative(jitCoder, _IL_JIT_TYPE_SINGLE);
+               }
+               break;
+
+               case IL_OP_STIND_R8:
+               {
+                       /* Store a 64-bit float to a pointer */
+                       StoreRelative(jitCoder, _IL_JIT_TYPE_DOUBLE);
+               }
+               break;
+       }
 }
 
 /*
@@ -41,6 +510,36 @@
 static void JITCoder_PtrAccessManaged(ILCoder *coder, int opcode,
                                                                          
ILClass *classInfo)
 {
+       ILJITCoder *jitCoder = _ILCoderToILJITCoder(coder);
+       ILType *type = ILClassToType(classInfo);
+       ILJitType jitType = _ILJitGetReturnType(type, jitCoder->process);
+       ILJitValue address;
+
+       if(opcode == IL_OP_LDOBJ)
+       {
+               /* Load from a pointer */
+               address = jitCoder->jitStack[jitCoder->stackTop - 1];
+               ValidateAddress(jitCoder, address);
+               jitCoder->jitStack[jitCoder->stackTop - 1] =
+                       jit_insn_load_relative(jitCoder->jitFunction, address, 
(jit_nint)0,
+                                                                  jitType);
+       }
+       else
+       {
+               /* Store to a pointer */
+               ILJitValue object = jitCoder->jitStack[jitCoder->stackTop - 1];;
+
+               address = jitCoder->jitStack[jitCoder->stackTop - 2];
+               ValidateAddress(jitCoder, address);
+               
+               if(jit_value_get_type(object) != jitType)
+               {
+                       object = jit_insn_convert(jitCoder->jitFunction, 
object, jitType, 0);
+               }
+               jit_insn_store_relative(jitCoder->jitFunction, address, 
(jit_nint)0, object);
+               JITC_ADJUST(jitCoder, -2);
+       }
+
 }
 
 /*
@@ -56,6 +555,14 @@
  */
 static void JITCoder_ArrayLength(ILCoder *coder)
 {
+       ILJITCoder *jitCoder = _ILCoderToILJITCoder(coder);
+       ILJitValue array = jitCoder->jitStack[jitCoder->stackTop - 1];
+       ILJitValue len;
+
+       ValidateAddress(jitCoder, array);
+       len = GetArrayLength(jitCoder, array);
+       jitCoder->jitStack[jitCoder->stackTop - 1] = 
+               jit_insn_convert(jitCoder->jitFunction, len, 
_IL_JIT_TYPE_NUINT, 0);
 }
 
 /*
@@ -64,6 +571,46 @@
 static void JITCoder_NewArray(ILCoder *coder, ILType *arrayType,
                                                          ILClass *arrayClass, 
ILEngineType lengthType)
 {
+       ILJITCoder *jitCoder = _ILCoderToILJITCoder(coder);
+       ILJitValue length = jitCoder->jitStack[jitCoder->stackTop - 1];
+       ILJitValue args[2];
+       ILMethod *ctor;
+       ILJitFunction jitFunction;
+       ILJitValue returnValue;
+       jit_label_t label = jit_label_undefined;
+       ILJitValue nullConst = 
jit_value_create_nint_constant(jitCoder->jitFunction,
+                                                                               
                                  _IL_JIT_TYPE_VPTR, 0);
+       ILJitValue temp;
+
+       /* Find the allocation constructor within the array class.
+          We know that the class only has one method, so it must
+          be the constructor that we are looking for */
+       ctor = (ILMethod *)ILClassNextMemberByKind
+                                       (arrayClass, 0, 
IL_META_MEMBERKIND_METHOD);
+
+       jitFunction = ILJitFunctionFromILMethod(ctor);
+       if(!jitFunction)
+       {
+               /* We have to layout the class first. */
+               if(!_LayoutClass(ILExecThreadCurrent(), arrayClass))
+               {
+                       return;
+               }
+               jitFunction = ILJitFunctionFromILMethod(ctor);
+       }
+       args[0] = jit_value_get_param(jitCoder->jitFunction, 0);
+       args[1] = length;
+       JITC_ADJUST(jitCoder, -1);
+       SetMethodInThread(jitCoder->jitFunction, args[0], ctor);
+       /* Output code to call the array type's constructor */
+       returnValue = jit_insn_call(jitCoder->jitFunction, 0, jitFunction,
+                                                               0, args, 2, 0);
+       temp = jit_insn_ne(jitCoder->jitFunction, returnValue, nullConst);
+       jit_insn_branch_if(jitCoder->jitFunction, temp, &label);
+       _ILJitThrowCurrentException(jitCoder);
+       jit_insn_label(jitCoder->jitFunction, &label);
+       jitCoder->jitStack[jitCoder->stackTop] = returnValue;
+       JITC_ADJUST(jitCoder, 1);
 }
 
 /*
@@ -71,6 +618,10 @@
  */
 static void JITCoder_CheckNull(ILCoder *coder)
 {
+       ILJITCoder *jitCoder = _ILCoderToILJITCoder(coder);
+
+       jit_insn_check_null(jitCoder->jitFunction,
+                                               
jitCoder->jitStack[jitCoder->stackTop - 1]);
 }
 
 #endif /* IL_JITC_CODE */




reply via email to

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