Emulate more instrs: conv.r.un, conv.r4, conv.r8
This commit is contained in:
parent
cf8183ce74
commit
b0a183a1b2
|
@ -433,9 +433,9 @@ namespace de4dot.blocks.cflow {
|
||||||
|
|
||||||
case Code.Unbox:
|
case Code.Unbox:
|
||||||
|
|
||||||
case Code.Conv_R_Un:
|
case Code.Conv_R_Un:Emulate_Conv_R_Un(instr); break;
|
||||||
case Code.Conv_R4:
|
case Code.Conv_R4: Emulate_Conv_R4(instr); break;
|
||||||
case Code.Conv_R8:
|
case Code.Conv_R8: Emulate_Conv_R8(instr); break;
|
||||||
|
|
||||||
case Code.Arglist:
|
case Code.Arglist:
|
||||||
case Code.Beq:
|
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) {
|
void Emulate_Add(Instruction instr) {
|
||||||
var val2 = valueStack.Pop();
|
var val2 = valueStack.Pop();
|
||||||
var val1 = valueStack.Pop();
|
var val1 = valueStack.Pop();
|
||||||
|
|
|
@ -331,6 +331,24 @@ namespace de4dot.blocks.cflow {
|
||||||
return new Int64Value((long)(uint)a.Value, a.ValidMask | (Int64Value.NO_UNKNOWN_BITS << 32));
|
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) {
|
public static Int32Value Add(Int32Value a, Int32Value b) {
|
||||||
if (a.AllBitsValid() && b.AllBitsValid())
|
if (a.AllBitsValid() && b.AllBitsValid())
|
||||||
return new Int32Value(a.Value + b.Value);
|
return new Int32Value(a.Value + b.Value);
|
||||||
|
|
|
@ -224,6 +224,24 @@ namespace de4dot.blocks.cflow {
|
||||||
return a;
|
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) {
|
public static Int64Value Add(Int64Value a, Int64Value b) {
|
||||||
if (a.AllBitsValid() && b.AllBitsValid())
|
if (a.AllBitsValid() && b.AllBitsValid())
|
||||||
return new Int64Value(a.Value + b.Value);
|
return new Int64Value(a.Value + b.Value);
|
||||||
|
|
|
@ -168,6 +168,20 @@ namespace de4dot.blocks.cflow {
|
||||||
return Int64Value.CreateUnknown();
|
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) {
|
public static Int32Value Ceq(Real8Value a, Real8Value b) {
|
||||||
return Int32Value.Create(CompareEq(a, b));
|
return Int32Value.Create(CompareEq(a, b));
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue
Block a user