public void VpSliceShift() { Constant eight = Constant.Word16(8); Identifier C = m.Reg8("C"); Expression e = new Slice(PrimitiveType.Byte, new BinaryExpression(Operator.Shl, PrimitiveType.Word16, C, eight), 8); var vp = new ExpressionSimplifier(segmentMap, new SsaEvaluationContext(arch.Object, m.Ssa.Identifiers, dynamicLinker.Object), listener); e = e.Accept(vp); Assert.AreEqual("C", e.ToString()); }
public void SliceShift() { Constant eight = Constant.Word16(8); Identifier C = Reg8("C"); Expression e = new Slice(PrimitiveType.Byte, new BinaryExpression(Operator.Shl, PrimitiveType.Word16, C, eight), 8); var vp = new ExpressionSimplifier(new SsaEvaluationContext(arch, ssaIds), listener); e = e.Accept(vp); Assert.AreEqual("C", e.ToString()); }
public void SliceShift() { Constant eight = Constant.Word16(8); Constant ate = Constant.Word32(8); Identifier C = Reg8("C"); Identifier ax = Reg16("ax"); Expression e = new Slice(PrimitiveType.Byte, new BinaryExpression(Operator.Shl, PrimitiveType.Word16, C, eight), 8); var vp = new ExpressionSimplifier(new SsaEvaluationContext(arch, ssaIds)); e = e.Accept(vp); Assert.AreEqual("C", e.ToString()); }
private Expression FuseAdjacentSlices(DataType dataType, Expression[] elems) { var fused = new List <Expression> { AsSlice(elems[0]) ?? elems[0] }; bool changed = false; for (int i = 1; i < elems.Length; ++i) { Slice slNext = AsSlice(elems[i]); if (fused[fused.Count - 1] is Slice slPrev && slNext != null && cmp.Equals(slPrev.Expression, slNext.Expression) && slPrev.Offset == slNext.Offset + slNext.DataType.BitSize) { // Fuse the two consecutive slices. var newSlice = new Slice( PrimitiveType.CreateWord(slPrev.DataType.BitSize + slNext.DataType.BitSize), slNext.Expression, slNext.Offset); fused[fused.Count - 1] = newSlice.Accept(this); changed = true; }
private Expression FuseAdjacentSlices(DataType dataType, Expression[] elements) { var fused = new List <Expression> { elements[0] }; for (int i = 1; i < elements.Length; ++i) { var e = elements[i]; if (fused[fused.Count - 1] is Slice slPrev && e is Slice slNext && cmp.Equals(slPrev.Expression, slNext.Expression) && slPrev.Offset == slNext.Offset + slNext.DataType.BitSize) { // Found two consecutive slices. Fuse them into one slice and // un-use the shared expression. var newSlice = new Slice( PrimitiveType.CreateWord(slPrev.DataType.BitSize + slNext.DataType.BitSize), slNext.Expression, slNext.Offset); ctx.RemoveExpressionUse(slPrev); fused[fused.Count - 1] = newSlice.Accept(this); }