diff --git a/de4dot.blocks/cflow/InstructionEmulator.cs b/de4dot.blocks/cflow/InstructionEmulator.cs index 1e768c1f..447812b5 100644 --- a/de4dot.blocks/cflow/InstructionEmulator.cs +++ b/de4dot.blocks/cflow/InstructionEmulator.cs @@ -433,9 +433,9 @@ namespace de4dot.blocks.cflow { case Code.Unbox: - case Code.Conv_R_Un: - case Code.Conv_R4: - case Code.Conv_R8: + case Code.Conv_R_Un:Emulate_Conv_R_Un(instr); break; + case Code.Conv_R4: Emulate_Conv_R4(instr); break; + case Code.Conv_R8: Emulate_Conv_R8(instr); break; case Code.Arglist: case Code.Beq: @@ -786,6 +786,36 @@ namespace de4dot.blocks.cflow { } } + void Emulate_Conv_R_Un(Instruction instr) { + var val1 = valueStack.Pop(); + switch (val1.valueType) { + case ValueType.Int32: valueStack.Push(Int32Value.Conv_R_Un((Int32Value)val1)); break; + case ValueType.Int64: valueStack.Push(Int64Value.Conv_R_Un((Int64Value)val1)); break; + case ValueType.Real8: valueStack.Push(Real8Value.Conv_R_Un((Real8Value)val1)); break; + default: valueStack.Push(Real8Value.CreateUnknown()); break; + } + } + + void Emulate_Conv_R4(Instruction instr) { + var val1 = valueStack.Pop(); + switch (val1.valueType) { + case ValueType.Int32: valueStack.Push(Int32Value.Conv_R4((Int32Value)val1)); break; + case ValueType.Int64: valueStack.Push(Int64Value.Conv_R4((Int64Value)val1)); break; + case ValueType.Real8: valueStack.Push(Real8Value.Conv_R4((Real8Value)val1)); break; + default: valueStack.Push(Real8Value.CreateUnknown()); break; + } + } + + void Emulate_Conv_R8(Instruction instr) { + var val1 = valueStack.Pop(); + switch (val1.valueType) { + case ValueType.Int32: valueStack.Push(Int32Value.Conv_R8((Int32Value)val1)); break; + case ValueType.Int64: valueStack.Push(Int64Value.Conv_R8((Int64Value)val1)); break; + case ValueType.Real8: valueStack.Push(Real8Value.Conv_R8((Real8Value)val1)); break; + default: valueStack.Push(Real8Value.CreateUnknown()); break; + } + } + void Emulate_Add(Instruction instr) { var val2 = valueStack.Pop(); var val1 = valueStack.Pop(); diff --git a/de4dot.blocks/cflow/Int32Value.cs b/de4dot.blocks/cflow/Int32Value.cs index 2574a36c..bdb60482 100644 --- a/de4dot.blocks/cflow/Int32Value.cs +++ b/de4dot.blocks/cflow/Int32Value.cs @@ -331,6 +331,24 @@ namespace de4dot.blocks.cflow { return new Int64Value((long)(uint)a.Value, a.ValidMask | (Int64Value.NO_UNKNOWN_BITS << 32)); } + public static Real8Value Conv_R_Un(Int32Value a) { + if (a.AllBitsValid()) + return new Real8Value((float)(uint)a.Value); + return Real8Value.CreateUnknown(); + } + + public static Real8Value Conv_R4(Int32Value a) { + if (a.AllBitsValid()) + return new Real8Value((float)(int)a.Value); + return Real8Value.CreateUnknown(); + } + + public static Real8Value Conv_R8(Int32Value a) { + if (a.AllBitsValid()) + return new Real8Value((double)(int)a.Value); + return Real8Value.CreateUnknown(); + } + public static Int32Value Add(Int32Value a, Int32Value b) { if (a.AllBitsValid() && b.AllBitsValid()) return new Int32Value(a.Value + b.Value); diff --git a/de4dot.blocks/cflow/Int64Value.cs b/de4dot.blocks/cflow/Int64Value.cs index cef25e09..20303704 100644 --- a/de4dot.blocks/cflow/Int64Value.cs +++ b/de4dot.blocks/cflow/Int64Value.cs @@ -224,6 +224,24 @@ namespace de4dot.blocks.cflow { return a; } + public static Real8Value Conv_R_Un(Int64Value a) { + if (a.AllBitsValid()) + return new Real8Value((float)(ulong)a.Value); + return Real8Value.CreateUnknown(); + } + + public static Real8Value Conv_R4(Int64Value a) { + if (a.AllBitsValid()) + return new Real8Value((float)(long)a.Value); + return Real8Value.CreateUnknown(); + } + + public static Real8Value Conv_R8(Int64Value a) { + if (a.AllBitsValid()) + return new Real8Value((double)(long)a.Value); + return Real8Value.CreateUnknown(); + } + public static Int64Value Add(Int64Value a, Int64Value b) { if (a.AllBitsValid() && b.AllBitsValid()) return new Int64Value(a.Value + b.Value); diff --git a/de4dot.blocks/cflow/Real8Value.cs b/de4dot.blocks/cflow/Real8Value.cs index 1cce6ea1..f7e17a35 100644 --- a/de4dot.blocks/cflow/Real8Value.cs +++ b/de4dot.blocks/cflow/Real8Value.cs @@ -168,6 +168,20 @@ namespace de4dot.blocks.cflow { return Int64Value.CreateUnknown(); } + public static Real8Value Conv_R_Un(Real8Value a) { + return CreateUnknown(); + } + + public static Real8Value Conv_R4(Real8Value a) { + if (a.IsValid) + return new Real8Value((float)a.Value); + return CreateUnknown(); + } + + public static Real8Value Conv_R8(Real8Value a) { + return a; + } + public static Int32Value Ceq(Real8Value a, Real8Value b) { return Int32Value.Create(CompareEq(a, b)); }