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