# This patch replaces all constants which are casted to constants # Most of the code is copied out of cs_semvalue.c # double a=10; is now ldc.i4.10, conv.r8 # it becomes ldc.r4 10.00 Index: cg_optable.c =================================================================== RCS file: /cvsroot/dotgnu-pnet/pnet/codegen/cg_optable.c,v retrieving revision 1.18 diff -u -r1.18 cg_optable.c --- cg_optable.c 2 Apr 2003 16:28:22 -0000 1.18 +++ cg_optable.c 18 Oct 2003 07:32:37 -0000 @@ -1397,6 +1397,171 @@ return 0; } + +/* Note: this is copied out of the cs_semvalue.c */ +static void ReplaceWithConstant(ILNode **parent, ILEvalValue *value) +{ + if(!value) + { + return; + } + switch(value->valueType) + { + case ILMachineType_Boolean: + { + if(value->un.i4Value) + { + *parent = ILNode_True_create(); + } + else + { + *parent = ILNode_False_create(); + } + } + break; + + case ILMachineType_Int8: + { + if(value->un.i4Value >= 0) + { + *parent = ILNode_Int8_create + ((ILUInt64)(ILInt64)(value->un.i4Value), 0, 0); + } + else + { + *parent = ILNode_Int8_create + ((ILUInt64)(ILInt64)(-(value->un.i4Value)), 1, 0); + } + } + break; + + case ILMachineType_UInt8: + { + *parent = ILNode_UInt8_create + ((ILUInt64)(ILInt64)(value->un.i4Value), 0, 0); + } + break; + + case ILMachineType_Int16: + { + if(value->un.i4Value >= 0) + { + *parent = ILNode_Int16_create + ((ILUInt64)(ILInt64)(value->un.i4Value), 0, 0); + } + else + { + *parent = ILNode_Int16_create + ((ILUInt64)(ILInt64)(-(value->un.i4Value)), 1, 0); + } + } + break; + + case ILMachineType_UInt16: + { + *parent = ILNode_UInt16_create + ((ILUInt64)(ILInt64)(value->un.i4Value), 0, 0); + } + break; + + case ILMachineType_Char: + { + *parent = ILNode_Char_create + ((ILUInt64)(ILInt64)(value->un.i4Value), 0, 0); + } + break; + + case ILMachineType_Int32: + { + if(value->un.i4Value >= 0) + { + *parent = ILNode_Int32_create + ((ILUInt64)(ILInt64)(value->un.i4Value), 0, 0); + } + else + { + *parent = ILNode_Int32_create + ((ILUInt64)(-((ILInt64)(value->un.i4Value))), 1, 0); + } + } + break; + + case ILMachineType_UInt32: + { + *parent = ILNode_UInt32_create + ((ILUInt64)(ILUInt32)(value->un.i4Value), 0, 0); + } + break; + + case ILMachineType_Int64: + { + if(value->un.i8Value >= 0) + { + *parent = ILNode_Int64_create + ((ILUInt64)(value->un.i8Value), 0, 0); + } + else + { + *parent = ILNode_Int64_create + ((ILUInt64)(-(value->un.i8Value)), 1, 0); + } + } + break; + + case ILMachineType_UInt64: + { + *parent = ILNode_UInt64_create + ((ILUInt64)(value->un.i8Value), 0, 0); + } + break; + + case ILMachineType_Float32: + { + *parent = ILNode_Float32_create((ILDouble)(value->un.r4Value)); + } + break; + + case ILMachineType_Float64: + { + *parent = ILNode_Float64_create(value->un.r8Value); + } + break; + + case ILMachineType_NativeFloat: + { + *parent = ILNode_Float_create(value->un.r8Value); + } + break; + + case ILMachineType_Decimal: + { + *parent = ILNode_Decimal_create(value->un.decValue); + } + break; + + case ILMachineType_String: + { + *parent = ILNode_String_create(value->un.strValue.str, + value->un.strValue.len); + } + break; + + case ILMachineType_ObjectRef: + { + *parent = ILNode_Null_create(); + } + break; + + case ILMachineType_UnmanagedPtr: + { + *parent = ILNode_NullPtr_create(); + } + break; + + default: break; + } +} + /* * Insert a primitive type cast to up-convert a node * if the node does not already have the requested type. @@ -1404,9 +1569,14 @@ static void InsertPrimitive(ILGenInfo *info, ILNode *node, ILNode **parent, ILMachineType type) { + ILEvalValue eValue; if(node != 0 && ILNode_GetType(node, info) != type) { *parent = ILNode_CastSimple_create(node, type); + if(ILNode_EvalConst(*parent,info,&eValue)) + { + ReplaceWithConstant(parent,&eValue); + } yysetfilename(*parent, yygetfilename(node)); yysetlinenum(*parent, yygetlinenum(node)); }