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_conv.c


From: Klaus Treichel
Subject: [dotgnu-pnet-commits] pnet ./ChangeLog engine/jitc.c engine/jitc_conv.c
Date: Sun, 09 Apr 2006 16:30:44 +0000

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

Modified files:
        .              : ChangeLog 
        engine         : jitc.c jitc_conv.c 

Log message:
        2006-04-09  Klaus Treichel  <address@hidden>
        
        * engine/jitc.c, engine/jitc_conv.c: Fix bugs in type conversion.

CVSWeb URLs:
http://cvs.savannah.gnu.org/viewcvs/dotgnu-pnet/pnet/ChangeLog.diff?tr1=1.3311&tr2=1.3312&r1=text&r2=text
http://cvs.savannah.gnu.org/viewcvs/dotgnu-pnet/pnet/engine/jitc.c.diff?tr1=1.28&tr2=1.29&r1=text&r2=text
http://cvs.savannah.gnu.org/viewcvs/dotgnu-pnet/pnet/engine/jitc_conv.c.diff?tr1=1.3&tr2=1.4&r1=text&r2=text

Patches:
Index: pnet/ChangeLog
diff -u pnet/ChangeLog:1.3311 pnet/ChangeLog:1.3312
--- pnet/ChangeLog:1.3311       Sun Apr  2 17:32:42 2006
+++ pnet/ChangeLog      Sun Apr  9 16:30:44 2006
@@ -1,3 +1,7 @@
+2006-04-09  Klaus Treichel  <address@hidden>
+
+       * engine/jitc.c, engine/jitc_conv.c: Fix bugs in type conversion.
+
 2006-03-25  Klaus Treichel  <address@hidden>
 
        * enjine/jitc_obj.c: Fix a bug in ILJITCoder_CastClass that caused a
Index: pnet/engine/jitc.c
diff -u pnet/engine/jitc.c:1.28 pnet/engine/jitc.c:1.29
--- pnet/engine/jitc.c:1.28     Sun Apr  2 18:03:27 2006
+++ pnet/engine/jitc.c  Sun Apr  9 16:30:44 2006
@@ -361,6 +361,109 @@
  (typeKind == JIT_TYPE_SBYTE))
 
 /*
+ * Convert a value to the corresponding signed/unsigned type.
+ * Returns 1 if the value is converted 0 otherwise.
+ */
+static int AdjustSign(ILJitFunction func, ILJitValue *value, int toUnsigned,
+                                                                               
                                          int checkOverflow)
+{
+       ILJitType type = jit_value_get_type(*value);
+       int typeKind = jit_type_get_kind(type);
+       
+       if(_JIT_TYPEKIND_IS_SIGNED(typeKind) && toUnsigned)
+       {
+               switch(typeKind)
+               {
+                       case JIT_TYPE_SBYTE:
+                       {
+                               *value = jit_insn_convert(func, *value, 
_IL_JIT_TYPE_BYTE,
+                                                                               
                                checkOverflow);
+                               return 1;
+                       }
+                       break;
+
+                       case JIT_TYPE_SHORT:
+                       {
+                               *value = jit_insn_convert(func, *value, 
_IL_JIT_TYPE_UINT16,
+                                                                               
                                checkOverflow);
+                               return 1;
+                       }
+                       break;
+
+                       case JIT_TYPE_INT:
+                       {
+                               *value = jit_insn_convert(func, *value, 
_IL_JIT_TYPE_UINT32,
+                                                                               
                                checkOverflow);
+                               return 1;
+                       }
+                       break;
+
+                       case JIT_TYPE_NINT:
+                       {
+                               *value = jit_insn_convert(func, *value, 
_IL_JIT_TYPE_NUINT,
+                                                                               
                                checkOverflow);
+                               return 1;
+                       }
+                       break;
+
+                       case JIT_TYPE_LONG:
+                       {
+                               *value = jit_insn_convert(func, *value, 
_IL_JIT_TYPE_UINT64,
+                                                                               
                                checkOverflow);
+                               return 1;
+                       }
+                       break;
+               }
+       }
+       else if(_JIT_TYPEKIND_IS_UNSIGNED(typeKind) && !toUnsigned)
+       {
+               switch(typeKind)
+               {
+                       case JIT_TYPE_UBYTE:
+                       {
+                               *value = jit_insn_convert(func, *value, 
_IL_JIT_TYPE_SBYTE,
+                                                                               
                                checkOverflow);
+                               return 1;
+                       }
+                       break;
+
+                       case JIT_TYPE_USHORT:
+                       {
+                               *value = jit_insn_convert(func, *value, 
_IL_JIT_TYPE_INT16,
+                                                                               
                                checkOverflow);
+                               return 1;
+                       }
+                       break;
+
+                       case JIT_TYPE_UINT:
+                       {
+                               *value = jit_insn_convert(func, *value, 
_IL_JIT_TYPE_INT32,
+                                                                               
                                checkOverflow);
+                               return 1;
+                       }
+                       break;
+
+                       case JIT_TYPE_NUINT:
+                       {
+                               *value = jit_insn_convert(func, *value, 
_IL_JIT_TYPE_NINT,
+                                                                               
                                checkOverflow);
+                               return 1;
+                       }
+                       break;
+
+                       case JIT_TYPE_ULONG:
+                       {
+                               *value = jit_insn_convert(func, *value, 
_IL_JIT_TYPE_INT64,
+                                                                               
                                checkOverflow);
+                               return 1;
+                       }
+                       break;
+               }
+       }
+       return 0;
+}
+
+/*
  * Readjust the stack to normalize binary operands when
  * I and I4 are mixed together.  Also determine which of
  * I4 or I8 to use if the operation involves I.
@@ -384,6 +487,25 @@
                return;
        }
 
+       /* When converted to unsigned the values have to be extended with 0s. */
+       /* So we have to adjust the sign first. */
+       if(isUnsigned)
+       {
+               if(AdjustSign(coder->jitFunction, value1, isUnsigned, 0))
+               {
+                       type1 = jit_value_get_type(*value1);
+                       newType1 = type1;
+                       type1Kind = jit_type_get_kind(type1);
+               }
+
+               if(AdjustSign(coder->jitFunction, value2, isUnsigned, 0))
+               {
+                       type2 = jit_value_get_type(*value2);
+                       newType2 = type2;
+                       type2Kind = jit_type_get_kind(type2);
+               }
+       }
+
        /* If the arguments mix I8 and I4, then cast the I4 value to I8 */
        if(type1IsLong && !type2IsLong)
        {
@@ -1517,14 +1639,19 @@
 static ILJitValue _ILJitValueConvertToStackType(ILJitFunction func,
                                                                                
                ILJitValue value)
 {
-       ILJitType type = jit_value_get_type(value);
+       ILJitValue temp = value;
+       ILJitType type = jit_value_get_type(temp);
        ILJitType stackType = _ILJitTypeToStackType(type);
 
        if(type != stackType)
        {
-               value = jit_insn_convert(func, value, stackType, 0);
+               temp = jit_insn_convert(func, temp, stackType, 0);
        }
-       return value;
+
+       /* We have only signed values on the stack. */
+       AdjustSign(func, &temp, 0, 0);
+
+       return temp;
 }
 
 /*
Index: pnet/engine/jitc_conv.c
diff -u pnet/engine/jitc_conv.c:1.3 pnet/engine/jitc_conv.c:1.4
--- pnet/engine/jitc_conv.c:1.3 Mon Feb 27 15:51:19 2006
+++ pnet/engine/jitc_conv.c     Sun Apr  9 16:30:44 2006
@@ -21,55 +21,6 @@
 #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.
@@ -80,7 +31,7 @@
 {
        ILJitValue value = jitCoder->jitStack[jitCoder->stackTop - 1];
 
-       value = ConvertSign(jitCoder, value, isUnsigned, checkOverflow);
+       AdjustSign(jitCoder->jitFunction, &value, isUnsigned, checkOverflow);
        switch(opcode)
        {
                case IL_OP_CONV_I1:
@@ -217,7 +168,7 @@
 static void JITCoder_Conv(ILCoder *coder, int opcode, ILEngineType type)
 {
        ILJITCoder *jitCoder = _ILCoderToILJITCoder(coder);
-       ILJitValue value;
+       ILJitValue value = jitCoder->jitStack[jitCoder->stackTop - 1];
 
        /* Determine how to convert the value */
        switch(opcode)
@@ -226,11 +177,6 @@
                {
                        /* 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;
 
@@ -238,11 +184,6 @@
                {
                        /* 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;
 
@@ -253,7 +194,6 @@
                {
                        /* Convert to "int32" */
                        value = ConvertValue(jitCoder, IL_OP_CONV_I4, 0, 0);
-                       jitCoder->jitStack[jitCoder->stackTop - 1] = value;
                }
                break;
 
@@ -264,7 +204,6 @@
                {
                        /* Convert to "int64" */
                        value = ConvertValue(jitCoder, IL_OP_CONV_I8, 0, 0);
-                       jitCoder->jitStack[jitCoder->stackTop - 1] = value;
                }
                break;
 
@@ -272,11 +211,6 @@
                {
                        /* 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;
 
@@ -284,11 +218,6 @@
                {
                        /* 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;
 
@@ -296,11 +225,6 @@
                {
                        /* 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;
 
@@ -308,11 +232,6 @@
                {
                        /* 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;
 
@@ -323,7 +242,6 @@
                {
                        /* Convert to "unsigned int32" */
                        value = ConvertValue(jitCoder, IL_OP_CONV_U4, 0, 0);
-                       jitCoder->jitStack[jitCoder->stackTop - 1] = value;
                }
                break;
 
@@ -333,8 +251,7 @@
        #endif
                {
                        /* Convert to "unsigned int64" */
-                       value = ConvertValue(jitCoder, IL_OP_CONV_U8, 0, 0);
-                       jitCoder->jitStack[jitCoder->stackTop - 1] = value;
+                       value = ConvertValue(jitCoder, IL_OP_CONV_U8, 1, 0);
                }
                break;
 
@@ -342,7 +259,6 @@
                {
                        /* Convert to "native float" with unsigned input */
                        value = ConvertValue(jitCoder, IL_OP_CONV_R_UN, 1, 0);
-                       jitCoder->jitStack[jitCoder->stackTop - 1] = value;
                }
                break;
 
@@ -350,11 +266,6 @@
                {
                        /* 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;
 
@@ -362,11 +273,6 @@
                {
                        /* 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;
 
@@ -377,7 +283,6 @@
                {
                        /* Convert to "int32" with unsigned input and overflow 
*/
                        value = ConvertValue(jitCoder, IL_OP_CONV_I4, 1, 1);
-                       jitCoder->jitStack[jitCoder->stackTop - 1] = value;
                }
                break;
 
@@ -388,7 +293,6 @@
                {
                        /* Convert to "int64" with unsigned input and overflow 
*/
                        value = ConvertValue(jitCoder, IL_OP_CONV_I8, 1, 1);
-                       jitCoder->jitStack[jitCoder->stackTop - 1] = value;
                }
                break;
 
@@ -396,11 +300,6 @@
                {
                        /* 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;
 
@@ -408,11 +307,6 @@
                {
                        /* 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;
 
@@ -423,7 +317,6 @@
                {
                        /* 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;
 
@@ -434,7 +327,6 @@
                {
                        /* 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;
 
@@ -442,11 +334,6 @@
                {
                        /* 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;
 
@@ -454,11 +341,6 @@
                {
                        /* 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;
 
@@ -466,11 +348,6 @@
                {
                        /* 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;
 
@@ -478,11 +355,6 @@
                {
                        /* 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;
 
@@ -493,7 +365,6 @@
                {
                        /* Convert to "int32" with signed input and overflow */
                        value = ConvertValue(jitCoder, IL_OP_CONV_I4, 0, 1);
-                       jitCoder->jitStack[jitCoder->stackTop - 1] = value;
                }
                break;
 
@@ -504,7 +375,6 @@
                {
                        /* 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;
 
@@ -515,7 +385,6 @@
                {
                        /* Convert to "int64" with signed input and overflow */
                        value = ConvertValue(jitCoder, IL_OP_CONV_I8, 0, 1);
-                       jitCoder->jitStack[jitCoder->stackTop - 1] = value;
                }
                break;
 
@@ -525,11 +394,12 @@
        #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;
+                       value = ConvertValue(jitCoder, IL_OP_CONV_U8, 1, 1);
                }
                break;
        }
+       jitCoder->jitStack[jitCoder->stackTop - 1] =
+                               
_ILJitValueConvertToStackType(jitCoder->jitFunction, value);
 }
 
 /*




reply via email to

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