From cf8183ce74c209ee83363c2e8aafd851695ba427 Mon Sep 17 00:00:00 2001 From: de4dot Date: Mon, 21 Apr 2014 15:27:58 +0200 Subject: [PATCH] Add more Real8Value methods --- de4dot.blocks/cflow/BranchEmulator.cs | 24 +++++++ de4dot.blocks/cflow/InstructionEmulator.cs | 10 +++ de4dot.blocks/cflow/Real8Value.cs | 80 ++++++++++++++++++++++ 3 files changed, 114 insertions(+) diff --git a/de4dot.blocks/cflow/BranchEmulator.cs b/de4dot.blocks/cflow/BranchEmulator.cs index 3e3f71a1..8d9269b9 100644 --- a/de4dot.blocks/cflow/BranchEmulator.cs +++ b/de4dot.blocks/cflow/BranchEmulator.cs @@ -95,6 +95,8 @@ namespace de4dot.blocks.cflow { return EmulateBranch(2, Int32Value.CompareEq((Int32Value)val1, (Int32Value)val2)); else if (val1.IsInt64() && val2.IsInt64()) return EmulateBranch(2, Int64Value.CompareEq((Int64Value)val1, (Int64Value)val2)); + else if (val1.IsReal8() && val2.IsReal8()) + return EmulateBranch(2, Real8Value.CompareEq((Real8Value)val1, (Real8Value)val2)); else if (val1.IsNull() && val2.IsNull()) return EmulateBranch(2, true); else @@ -109,6 +111,8 @@ namespace de4dot.blocks.cflow { return EmulateBranch(2, Int32Value.CompareNeq((Int32Value)val1, (Int32Value)val2)); else if (val1.IsInt64() && val2.IsInt64()) return EmulateBranch(2, Int64Value.CompareNeq((Int64Value)val1, (Int64Value)val2)); + else if (val1.IsReal8() && val2.IsReal8()) + return EmulateBranch(2, Real8Value.CompareNeq((Real8Value)val1, (Real8Value)val2)); else if (val1.IsNull() && val2.IsNull()) return EmulateBranch(2, false); else @@ -123,6 +127,8 @@ namespace de4dot.blocks.cflow { return EmulateBranch(2, Int32Value.CompareGe((Int32Value)val1, (Int32Value)val2)); else if (val1.IsInt64() && val2.IsInt64()) return EmulateBranch(2, Int64Value.CompareGe((Int64Value)val1, (Int64Value)val2)); + else if (val1.IsReal8() && val2.IsReal8()) + return EmulateBranch(2, Real8Value.CompareGe((Real8Value)val1, (Real8Value)val2)); else return false; } @@ -135,6 +141,8 @@ namespace de4dot.blocks.cflow { return EmulateBranch(2, Int32Value.CompareGe_Un((Int32Value)val1, (Int32Value)val2)); else if (val1.IsInt64() && val2.IsInt64()) return EmulateBranch(2, Int64Value.CompareGe_Un((Int64Value)val1, (Int64Value)val2)); + else if (val1.IsReal8() && val2.IsReal8()) + return EmulateBranch(2, Real8Value.CompareGe_Un((Real8Value)val1, (Real8Value)val2)); else return false; } @@ -147,6 +155,8 @@ namespace de4dot.blocks.cflow { return EmulateBranch(2, Int32Value.CompareGt((Int32Value)val1, (Int32Value)val2)); else if (val1.IsInt64() && val2.IsInt64()) return EmulateBranch(2, Int64Value.CompareGt((Int64Value)val1, (Int64Value)val2)); + else if (val1.IsReal8() && val2.IsReal8()) + return EmulateBranch(2, Real8Value.CompareGt((Real8Value)val1, (Real8Value)val2)); else return false; } @@ -159,6 +169,8 @@ namespace de4dot.blocks.cflow { return EmulateBranch(2, Int32Value.CompareGt_Un((Int32Value)val1, (Int32Value)val2)); else if (val1.IsInt64() && val2.IsInt64()) return EmulateBranch(2, Int64Value.CompareGt_Un((Int64Value)val1, (Int64Value)val2)); + else if (val1.IsReal8() && val2.IsReal8()) + return EmulateBranch(2, Real8Value.CompareGt_Un((Real8Value)val1, (Real8Value)val2)); else return false; } @@ -171,6 +183,8 @@ namespace de4dot.blocks.cflow { return EmulateBranch(2, Int32Value.CompareLe((Int32Value)val1, (Int32Value)val2)); else if (val1.IsInt64() && val2.IsInt64()) return EmulateBranch(2, Int64Value.CompareLe((Int64Value)val1, (Int64Value)val2)); + else if (val1.IsReal8() && val2.IsReal8()) + return EmulateBranch(2, Real8Value.CompareLe((Real8Value)val1, (Real8Value)val2)); else return false; } @@ -183,6 +197,8 @@ namespace de4dot.blocks.cflow { return EmulateBranch(2, Int32Value.CompareLe_Un((Int32Value)val1, (Int32Value)val2)); else if (val1.IsInt64() && val2.IsInt64()) return EmulateBranch(2, Int64Value.CompareLe_Un((Int64Value)val1, (Int64Value)val2)); + else if (val1.IsReal8() && val2.IsReal8()) + return EmulateBranch(2, Real8Value.CompareLe_Un((Real8Value)val1, (Real8Value)val2)); else return false; } @@ -195,6 +211,8 @@ namespace de4dot.blocks.cflow { return EmulateBranch(2, Int32Value.CompareLt((Int32Value)val1, (Int32Value)val2)); else if (val1.IsInt64() && val2.IsInt64()) return EmulateBranch(2, Int64Value.CompareLt((Int64Value)val1, (Int64Value)val2)); + else if (val1.IsReal8() && val2.IsReal8()) + return EmulateBranch(2, Real8Value.CompareLt((Real8Value)val1, (Real8Value)val2)); else return false; } @@ -207,6 +225,8 @@ namespace de4dot.blocks.cflow { return EmulateBranch(2, Int32Value.CompareLt_Un((Int32Value)val1, (Int32Value)val2)); else if (val1.IsInt64() && val2.IsInt64()) return EmulateBranch(2, Int64Value.CompareLt_Un((Int64Value)val1, (Int64Value)val2)); + else if (val1.IsReal8() && val2.IsReal8()) + return EmulateBranch(2, Real8Value.CompareLt_Un((Real8Value)val1, (Real8Value)val2)); else return false; } @@ -218,6 +238,8 @@ namespace de4dot.blocks.cflow { return EmulateBranch(1, Int32Value.CompareFalse((Int32Value)val1)); else if (val1.IsInt64()) return EmulateBranch(1, Int64Value.CompareFalse((Int64Value)val1)); + else if (val1.IsReal8()) + return EmulateBranch(1, Real8Value.CompareFalse((Real8Value)val1)); else if (val1.IsNull()) return EmulateBranch(1, true); else if (val1.IsObject() || val1.IsString()) @@ -233,6 +255,8 @@ namespace de4dot.blocks.cflow { return EmulateBranch(1, Int32Value.CompareTrue((Int32Value)val1)); else if (val1.IsInt64()) return EmulateBranch(1, Int64Value.CompareTrue((Int64Value)val1)); + else if (val1.IsReal8()) + return EmulateBranch(1, Real8Value.CompareTrue((Real8Value)val1)); else if (val1.IsNull()) return EmulateBranch(1, false); else if (val1.IsObject() || val1.IsString()) diff --git a/de4dot.blocks/cflow/InstructionEmulator.cs b/de4dot.blocks/cflow/InstructionEmulator.cs index 519b0896..1e768c1f 100644 --- a/de4dot.blocks/cflow/InstructionEmulator.cs +++ b/de4dot.blocks/cflow/InstructionEmulator.cs @@ -1068,6 +1068,8 @@ namespace de4dot.blocks.cflow { valueStack.Push(Int32Value.Ceq((Int32Value)val1, (Int32Value)val2)); else if (val1.IsInt64() && val2.IsInt64()) valueStack.Push(Int64Value.Ceq((Int64Value)val1, (Int64Value)val2)); + else if (val1.IsReal8() && val2.IsReal8()) + valueStack.Push(Real8Value.Ceq((Real8Value)val1, (Real8Value)val2)); else if (val1.IsNull() && val2.IsNull()) valueStack.Push(Int32Value.One); else @@ -1082,6 +1084,8 @@ namespace de4dot.blocks.cflow { valueStack.Push(Int32Value.Cgt((Int32Value)val1, (Int32Value)val2)); else if (val1.IsInt64() && val2.IsInt64()) valueStack.Push(Int64Value.Cgt((Int64Value)val1, (Int64Value)val2)); + else if (val1.IsReal8() && val2.IsReal8()) + valueStack.Push(Real8Value.Cgt((Real8Value)val1, (Real8Value)val2)); else valueStack.Push(Int32Value.CreateUnknownBool()); } @@ -1094,6 +1098,8 @@ namespace de4dot.blocks.cflow { valueStack.Push(Int32Value.Cgt_Un((Int32Value)val1, (Int32Value)val2)); else if (val1.IsInt64() && val2.IsInt64()) valueStack.Push(Int64Value.Cgt_Un((Int64Value)val1, (Int64Value)val2)); + else if (val1.IsReal8() && val2.IsReal8()) + valueStack.Push(Real8Value.Cgt_Un((Real8Value)val1, (Real8Value)val2)); else valueStack.Push(Int32Value.CreateUnknownBool()); } @@ -1106,6 +1112,8 @@ namespace de4dot.blocks.cflow { valueStack.Push(Int32Value.Clt((Int32Value)val1, (Int32Value)val2)); else if (val1.IsInt64() && val2.IsInt64()) valueStack.Push(Int64Value.Clt((Int64Value)val1, (Int64Value)val2)); + else if (val1.IsReal8() && val2.IsReal8()) + valueStack.Push(Real8Value.Clt((Real8Value)val1, (Real8Value)val2)); else valueStack.Push(Int32Value.CreateUnknownBool()); } @@ -1118,6 +1126,8 @@ namespace de4dot.blocks.cflow { valueStack.Push(Int32Value.Clt_Un((Int32Value)val1, (Int32Value)val2)); else if (val1.IsInt64() && val2.IsInt64()) valueStack.Push(Int64Value.Clt_Un((Int64Value)val1, (Int64Value)val2)); + else if (val1.IsReal8() && val2.IsReal8()) + valueStack.Push(Real8Value.Clt_Un((Real8Value)val1, (Real8Value)val2)); else valueStack.Push(Int32Value.CreateUnknownBool()); } diff --git a/de4dot.blocks/cflow/Real8Value.cs b/de4dot.blocks/cflow/Real8Value.cs index 77206e5a..1cce6ea1 100644 --- a/de4dot.blocks/cflow/Real8Value.cs +++ b/de4dot.blocks/cflow/Real8Value.cs @@ -168,6 +168,86 @@ namespace de4dot.blocks.cflow { return Int64Value.CreateUnknown(); } + public static Int32Value Ceq(Real8Value a, Real8Value b) { + return Int32Value.Create(CompareEq(a, b)); + } + + public static Int32Value Cgt(Real8Value a, Real8Value b) { + return Int32Value.Create(CompareGt(a, b)); + } + + public static Int32Value Cgt_Un(Real8Value a, Real8Value b) { + return Int32Value.Create(CompareGt_Un(a, b)); + } + + public static Int32Value Clt(Real8Value a, Real8Value b) { + return Int32Value.Create(CompareLt(a, b)); + } + + public static Int32Value Clt_Un(Real8Value a, Real8Value b) { + return Int32Value.Create(CompareLt_Un(a, b)); + } + + public static Bool3 CompareEq(Real8Value a, Real8Value b) { + if (a.IsValid && b.IsValid) + return a.Value == b.Value ? Bool3.True : Bool3.False; + return Bool3.Unknown; + } + + public static Bool3 CompareNeq(Real8Value a, Real8Value b) { + if (a.IsValid && b.IsValid) + return a.Value != b.Value ? Bool3.True : Bool3.False; + return Bool3.Unknown; + } + + public static Bool3 CompareGt(Real8Value a, Real8Value b) { + if (a.IsValid && b.IsValid) + return a.Value > b.Value ? Bool3.True : Bool3.False; + return Bool3.Unknown; + } + + public static Bool3 CompareGt_Un(Real8Value a, Real8Value b) { + return Bool3.Unknown; //TODO: + } + + public static Bool3 CompareGe(Real8Value a, Real8Value b) { + if (a.IsValid && b.IsValid) + return a.Value >= b.Value ? Bool3.True : Bool3.False; + return Bool3.Unknown; + } + + public static Bool3 CompareGe_Un(Real8Value a, Real8Value b) { + return Bool3.Unknown; //TODO: + } + + public static Bool3 CompareLe(Real8Value a, Real8Value b) { + if (a.IsValid && b.IsValid) + return a.Value <= b.Value ? Bool3.True : Bool3.False; + return Bool3.Unknown; + } + + public static Bool3 CompareLe_Un(Real8Value a, Real8Value b) { + return Bool3.Unknown; //TODO: + } + + public static Bool3 CompareLt(Real8Value a, Real8Value b) { + if (a.IsValid && b.IsValid) + return a.Value < b.Value ? Bool3.True : Bool3.False; + return Bool3.Unknown; + } + + public static Bool3 CompareLt_Un(Real8Value a, Real8Value b) { + return Bool3.Unknown; //TODO: + } + + public static Bool3 CompareTrue(Real8Value a) { + return Bool3.Unknown; + } + + public static Bool3 CompareFalse(Real8Value a) { + return Bool3.Unknown; + } + public override string ToString() { if (!IsValid) return "";