Emulate more instrs: conv.r.un, conv.r4, conv.r8

This commit is contained in:
de4dot 2014-04-21 15:36:25 +02:00
parent cf8183ce74
commit b0a183a1b2
4 changed files with 83 additions and 3 deletions

View File

@ -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();

View File

@ -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);

View File

@ -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);

View File

@ -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));
}