Update div and rem emu code

This commit is contained in:
de4dot 2011-10-17 20:19:17 +02:00
parent 778bc7e940
commit 122878a094
2 changed files with 20 additions and 4 deletions

View File

@ -73,6 +73,10 @@ namespace de4dot.blocks.cflow {
return hasValue(0); return hasValue(0);
} }
public bool isNonZero() {
return (value & validMask) != 0;
}
public bool hasValue(int value) { public bool hasValue(int value) {
return allBitsValid() && this.value == value; return allBitsValid() && this.value == value;
} }
@ -224,6 +228,8 @@ namespace de4dot.blocks.cflow {
return createUnknown(); return createUnknown();
} }
} }
if (ReferenceEquals(a, b) && a.isNonZero())
return new Int32Value(1);
if (b.hasValue(1)) if (b.hasValue(1))
return a; return a;
return createUnknown(); return createUnknown();
@ -238,6 +244,8 @@ namespace de4dot.blocks.cflow {
return createUnknown(); return createUnknown();
} }
} }
if (ReferenceEquals(a, b) && a.isNonZero())
return new Int32Value(1);
if (b.hasValue(1)) if (b.hasValue(1))
return a; return a;
return createUnknown(); return createUnknown();
@ -252,7 +260,7 @@ namespace de4dot.blocks.cflow {
return createUnknown(); return createUnknown();
} }
} }
if (b.hasValue(1)) if ((ReferenceEquals(a, b) && a.isNonZero()) || b.hasValue(1))
return new Int32Value(0); return new Int32Value(0);
return createUnknown(); return createUnknown();
} }
@ -266,7 +274,7 @@ namespace de4dot.blocks.cflow {
return createUnknown(); return createUnknown();
} }
} }
if (b.hasValue(1)) if ((ReferenceEquals(a, b) && a.isNonZero()) || b.hasValue(1))
return new Int32Value(0); return new Int32Value(0);
return createUnknown(); return createUnknown();
} }

View File

@ -61,6 +61,10 @@ namespace de4dot.blocks.cflow {
return hasValue(0); return hasValue(0);
} }
public bool isNonZero() {
return ((ulong)value & validMask) != 0;
}
public bool hasValue(long value) { public bool hasValue(long value) {
return allBitsValid() && this.value == value; return allBitsValid() && this.value == value;
} }
@ -139,6 +143,8 @@ namespace de4dot.blocks.cflow {
return createUnknown(); return createUnknown();
} }
} }
if (ReferenceEquals(a, b) && a.isNonZero())
return new Int64Value(1);
if (b.hasValue(1)) if (b.hasValue(1))
return a; return a;
return createUnknown(); return createUnknown();
@ -153,6 +159,8 @@ namespace de4dot.blocks.cflow {
return createUnknown(); return createUnknown();
} }
} }
if (ReferenceEquals(a, b) && a.isNonZero())
return new Int64Value(1);
if (b.hasValue(1)) if (b.hasValue(1))
return a; return a;
return createUnknown(); return createUnknown();
@ -167,7 +175,7 @@ namespace de4dot.blocks.cflow {
return createUnknown(); return createUnknown();
} }
} }
if (b.hasValue(1)) if ((ReferenceEquals(a, b) && a.isNonZero()) || b.hasValue(1))
return new Int64Value(0); return new Int64Value(0);
return createUnknown(); return createUnknown();
} }
@ -181,7 +189,7 @@ namespace de4dot.blocks.cflow {
return createUnknown(); return createUnknown();
} }
} }
if (b.hasValue(1)) if ((ReferenceEquals(a, b) && a.isNonZero()) || b.hasValue(1))
return new Int64Value(0); return new Int64Value(0);
return createUnknown(); return createUnknown();
} }