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

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[dotgnu-pnet-commits] pnet ./ChangeLog engine/jitc_obj.c


From: Klaus Treichel
Subject: [dotgnu-pnet-commits] pnet ./ChangeLog engine/jitc_obj.c
Date: Sun, 15 Jan 2006 19:03:05 +0000

CVSROOT:        /cvsroot/dotgnu-pnet
Module name:    pnet
Branch:         
Changes by:     Klaus Treichel <address@hidden> 06/01/15 19:03:05

Modified files:
        .              : ChangeLog 
        engine         : jitc_obj.c 

Log message:
        Add the rest of the opcodes (thanks _terminus_).

CVSWeb URLs:
http://cvs.savannah.gnu.org/viewcvs/dotgnu-pnet/pnet/ChangeLog.diff?tr1=1.3277&tr2=1.3278&r1=text&r2=text
http://cvs.savannah.gnu.org/viewcvs/dotgnu-pnet/pnet/engine/jitc_obj.c.diff?tr1=1.5&tr2=1.6&r1=text&r2=text

Patches:
Index: pnet/ChangeLog
diff -u pnet/ChangeLog:1.3277 pnet/ChangeLog:1.3278
--- pnet/ChangeLog:1.3277       Sun Jan 15 17:42:12 2006
+++ pnet/ChangeLog      Sun Jan 15 19:03:05 2006
@@ -1,3 +1,7 @@
+2006-01.15  Klaus Treichel  <address@hidden>
+
+       * engine/jitc_obj.c: Add the rest of the opcodes. (thanks_terminus_)
+       
 2006-01-15  Kirill Kononenko  <address@hidden>
 
        * engine/jitc.c: Add jit type for typed references.
Index: pnet/engine/jitc_obj.c
diff -u pnet/engine/jitc_obj.c:1.5 pnet/engine/jitc_obj.c:1.6
--- pnet/engine/jitc_obj.c:1.5  Sun Jan 15 17:42:12 2006
+++ pnet/engine/jitc_obj.c      Sun Jan 15 19:03:05 2006
@@ -23,17 +23,17 @@
 /*
  * Get a ILJitValue with a pointer to the class' static area.
  */
-static ILJitValue _ILJitGetClassStaticArea(ILExecThread *thread,
-                                                                               
   ILJitFunction func,
+static ILJitValue _ILJitGetClassStaticArea(ILJitFunction func,
                                                                                
   ILField *field)
 {
        /* Get the static data area for a particular class */
        ILClass *classInfo = ILField_Owner(field);
        void *classStaticData = ((ILClassPrivate 
*)(classInfo->userData))->staticData;
-       ILJitValue staticData;
 
        if(!classStaticData)
        {
+               ILExecThread *thread = ILExecThreadCurrent();
+
                if(((ILClassPrivate *)(classInfo->userData))->managedStatic)
                {
                        classStaticData = _ILEngineAlloc(thread, 0,
@@ -55,9 +55,8 @@
                        ((ILClassPrivate *)(classInfo->userData))->staticData = 
classStaticData;
                }
        }
-       staticData = jit_value_create_nint_constant(func, _IL_JIT_TYPE_VPTR,
+       return jit_value_create_nint_constant(func, _IL_JIT_TYPE_VPTR,
                                                                                
                (jit_nint)classStaticData);
-       return staticData;
 }
 
 /*
@@ -92,6 +91,60 @@
        return valuePtr;
 }
 
+/*
+ * Process the ldflda / ldsflda opcodes.
+ * Returns the ILJitValue with the field address.
+ */
+static ILJitValue _ILJitLoadFieldAddress(ILJITCoder *coder, ILJitValue base,
+                                                                               
 ILUInt32 offset, int mayBeNull)
+{
+       if(mayBeNull)
+       {
+               jit_insn_check_null(coder->jitFunction, base);
+       }
+       return jit_insn_add_relative(coder->jitFunction, base, offset);
+}
+
+/*
+ * Process the ldfld / ldsfld opcodes.
+ * Returns the ILJitValue with the field contents.
+ */
+static ILJitValue _ILJitLoadField(ILJITCoder *coder, ILJitValue base,
+                                                                 ILType 
*fieldType, ILUInt32 offset,
+                                                                 int mayBeNull)
+{
+       ILJitType type = _ILJitGetReturnType(fieldType, coder->process);
+       ILJitValue value;
+
+       if(mayBeNull)
+       {
+               jit_insn_check_null(coder->jitFunction, base);
+       }
+       value =  jit_insn_load_relative(coder->jitFunction, base, offset, type);
+       return _ILJitValueConvertToStackType(coder->jitFunction, value);
+}
+
+/*
+ * Process the stfld / stsfld opcodes.
+ */
+static void _ILJitStoreField(ILJITCoder *coder, ILJitValue base,
+                                                                  ILJitValue 
value, ILType *fieldType,
+                                                                  ILUInt32 
offset, int mayBeNull)
+                                                                  
+{
+       ILJitType type = _ILJitGetReturnType(fieldType, coder->process);
+
+       if(mayBeNull)
+       {
+               jit_insn_check_null(coder->jitFunction, base);
+       }
+       if(jit_value_get_type(value) != type)
+       {
+               value = jit_insn_convert(coder->jitFunction, value, type, 0);
+       }
+       jit_insn_store_relative(coder->jitFunction, base, offset, value);
+}
+
 static void JITCoder_CastClass(ILCoder *coder, ILClass *classInfo,
                                                           int throwException)
 {
@@ -154,57 +207,169 @@
                                                           ILType *objectType, 
ILField *field,
                                                           ILType *fieldType)
 {
+       ILJITCoder *jitCoder = _ILCoderToILJITCoder(coder);
+       ILJitValue ptr = jitCoder->jitStack[jitCoder->stackTop - 1];
+
+       jitCoder->jitStack[jitCoder->stackTop - 1] =
+               _ILJitLoadField(jitCoder, ptr, fieldType, field->offset, 1);
 }
 
 static void JITCoder_LoadThisField(ILCoder *coder, ILField *field,
                                                                   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);
+
+       jitCoder->jitStack[jitCoder->stackTop] = param;
+       JITC_ADJUST(jitCoder, 1);
 }
 
 static void JITCoder_LoadStaticField(ILCoder *coder, ILField *field,
                                                                 ILType 
*fieldType)
 {
+       ILJITCoder *jitCoder = _ILCoderToILJITCoder(coder);
+       ILJitValue ptr = _ILJitGetClassStaticArea(jitCoder->jitFunction,
+                                                                               
          field);
+       /* Output a call to the static constructor */
+       _ILJitCallStaticConstructor(jitCoder, ILField_Owner(field), 0);
+
+       jitCoder->jitStack[jitCoder->stackTop] =
+               _ILJitLoadField(jitCoder, ptr, fieldType, field->offset, 0);
+       JITC_ADJUST(jitCoder, 1);
 }
 
 static void JITCoder_LoadFieldAddr(ILCoder *coder, ILEngineType ptrType,
                                                               ILType 
*objectType, ILField *field,
                                                               ILType 
*fieldType)
 {
+       ILJITCoder *jitCoder = _ILCoderToILJITCoder(coder);
+       ILJitValue ptr = jitCoder->jitStack[jitCoder->stackTop - 1];
+
+       jitCoder->jitStack[jitCoder->stackTop - 1] =
+               _ILJitLoadFieldAddress(jitCoder, ptr, field->offset, 1);
 }
 
 static void JITCoder_LoadStaticFieldAddr(ILCoder *coder, ILField *field,
                                         ILType *fieldType)
 {
+       ILJITCoder *jitCoder = _ILCoderToILJITCoder(coder);
+       ILJitValue ptr = _ILJitGetClassStaticArea(jitCoder->jitFunction,
+                                                                               
          field);
+
+       /* Output a call to the static constructor */
+       _ILJitCallStaticConstructor(jitCoder, ILField_Owner(field), 0);
+
+       jitCoder->jitStack[jitCoder->stackTop] =
+               _ILJitLoadFieldAddress(jitCoder, ptr, field->offset, 0);
+       JITC_ADJUST(jitCoder, 1);
 }
 
 static void JITCoder_StoreField(ILCoder *coder, ILEngineType ptrType,
                                                            ILType *objectType, 
ILField *field,
                                                            ILType *fieldType, 
ILEngineType valueType)
 {
+       ILJITCoder *jitCoder = _ILCoderToILJITCoder(coder);
+       ILJitValue ptr = jitCoder->jitStack[jitCoder->stackTop - 2];
+       ILJitValue value = jitCoder->jitStack[jitCoder->stackTop - 1];
+
+       _ILJitStoreField(jitCoder, ptr, value, fieldType, field->offset, 1);
+       JITC_ADJUST(jitCoder, -2);
 }
 
 static void JITCoder_StoreStaticField(ILCoder *coder, ILField *field,
                                      ILType *fieldType, ILEngineType valueType)
 {
+       ILJITCoder *jitCoder = _ILCoderToILJITCoder(coder);
+       ILJitValue ptr = _ILJitGetClassStaticArea(jitCoder->jitFunction,
+                                                                               
          field);
+       ILJitValue value = jitCoder->jitStack[jitCoder->stackTop - 1];
+
+       /* Output a call to the static constructor */
+       _ILJitCallStaticConstructor(jitCoder, ILField_Owner(field), 0);
+
+       _ILJitStoreField(jitCoder, ptr, value, fieldType, field->offset, 1);
+       JITC_ADJUST(jitCoder, -1);
 }
 
 static void JITCoder_CopyObject(ILCoder *coder, ILEngineType destPtrType,
                                                            ILEngineType 
srcPtrType, ILClass *classInfo)
 {
+       ILJITCoder *jitCoder = _ILCoderToILJITCoder(coder);
+       ILJitValue  dest = jitCoder->jitStack[jitCoder->stackTop - 2];
+       ILJitValue  src = jitCoder->jitStack[jitCoder->stackTop - 1];
+       ILType *type = ILClassToType(classInfo);
+    ILUInt32 size = _ILSizeOfTypeLocked(jitCoder->process, type);
+       ILJitValue  memSize = 
jit_value_create_nint_constant(jitCoder->jitFunction,
+                                                                               
                                 _IL_JIT_TYPE_UINT32,
+                                                                               
                                 (jit_nint)size);
+
+       /*
+        * Do the verification early.
+        */
+       jit_insn_check_null(jitCoder->jitFunction, dest);
+       jit_insn_check_null(jitCoder->jitFunction, src);
+
+       jit_insn_memcpy(jitCoder->jitFunction, dest, src, memSize);
+       JITC_ADJUST(jitCoder, -3);
 }
 
 static void JITCoder_CopyBlock(ILCoder *coder, ILEngineType destPtrType,
                                                           ILEngineType 
srcPtrType)
 {
+       ILJITCoder *jitCoder = _ILCoderToILJITCoder(coder);
+       ILJitValue  src = jitCoder->jitStack[jitCoder->stackTop - 2];
+       ILJitValue  dest = jitCoder->jitStack[jitCoder->stackTop - 3];
+       ILJitValue  size = jitCoder->jitStack[jitCoder->stackTop - 1];
+
+       /*
+        * Do the verification early.
+        */
+       jit_insn_check_null(jitCoder->jitFunction, dest);
+       jit_insn_check_null(jitCoder->jitFunction, src);
+
+       jit_insn_memcpy(jitCoder->jitFunction, dest, src, size);
+       JITC_ADJUST(jitCoder, -3);
 }
 
 static void JITCoder_InitObject(ILCoder *coder, ILEngineType ptrType,
                                ILClass *classInfo)
 {
+       ILJITCoder *jitCoder = _ILCoderToILJITCoder(coder);
+       ILType *type = ILClassToType(classInfo);
+    ILUInt32 size = _ILSizeOfTypeLocked(jitCoder->process, type);
+       ILJitValue  dest = jitCoder->jitStack[jitCoder->stackTop - 1];
+       ILJitValue  value = 
jit_value_create_nint_constant(jitCoder->jitFunction,
+                                                                               
                           _IL_JIT_TYPE_BYTE,
+                                                                               
                           (jit_nint)0);
+       ILJitValue  memSize = 
jit_value_create_nint_constant(jitCoder->jitFunction,
+                                                                               
                                 _IL_JIT_TYPE_UINT32,
+                                                                               
                                 (jit_nint)size);
+       /*
+        * Do the verification early.
+        */
+       jit_insn_check_null(jitCoder->jitFunction, dest);
+
+       jit_insn_memset(jitCoder->jitFunction, dest, value, memSize);
+
+       JITC_ADJUST(jitCoder, -1);
 }
 
 static void JITCoder_InitBlock(ILCoder *coder, ILEngineType ptrType)
 {
+       ILJITCoder *jitCoder = _ILCoderToILJITCoder(coder);
+       ILJitValue  dest = jitCoder->jitStack[jitCoder->stackTop - 3];
+       ILJitValue  value = jitCoder->jitStack[jitCoder->stackTop - 2];
+       ILJitValue  size = jitCoder->jitStack[jitCoder->stackTop - 1];
+
+       /*
+        * Do the verification early.
+        */
+       jit_insn_check_null(jitCoder->jitFunction, dest);
+
+       value = jit_insn_convert(jitCoder->jitFunction, value, 
_IL_JIT_TYPE_BYTE, 0);
+       jit_insn_memset(jitCoder->jitFunction, dest, value, size);
+       JITC_ADJUST(jitCoder, -3);
 }
 
 static void JITCoder_Box(ILCoder *coder, ILClass *boxClass,
@@ -354,6 +519,13 @@
 
 static void JITCoder_SizeOf(ILCoder *coder, ILType *type)
 {
+       ILJITCoder *jitCoder = _ILCoderToILJITCoder(coder);
+    ILUInt32 size = _ILSizeOfTypeLocked(jitCoder->process, type);
+       ILJitValue constSize = 
jit_value_create_nint_constant(jitCoder->jitFunction,
+                                                                               
                                  _IL_JIT_TYPE_UINT32,
+                                                                               
                                  (jit_nint)size);
+       jitCoder->jitStack[jitCoder->stackTop] = constSize;
+       JITC_ADJUST(jitCoder, 1);
 }
 
 static void JITCoder_ArgList(ILCoder *coder)




reply via email to

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