public void BwAndMask() { var eax = m.Frame.EnsureRegister(Registers.eax); var bw = new Backwalker <Block, Instruction>(host, new RtlGoto(m.Mem32(m.IAdd(eax, 0x10000)), InstrClass.Transfer), expSimp); Assert.IsFalse(bw.BackwalkInstruction(m.Assign(eax, m.And(eax, 0x7)))); Assert.AreSame(Registers.eax, bw.Index); Assert.AreEqual(0x10000ul, bw.VectorAddress.ToLinear()); Assert.AreEqual("cmp 8", bw.Operations[0].ToString()); }
public void Vse_And() { var r1 = m.Reg32("r1", 1); Given_ValueSet(r1, IVS(4, -4000, 4000)); Given_Evaluator(); var vs = vse.Evaluate(m.And(r1, 0x1F)); Assert.AreEqual("1[0,1F]", vs.Item1.ToString()); }
public void CceTestBe() { var SZO = m.Flags("SZO"); var C = m.Flags("C"); var CZ = m.Flags("CZ"); var r1 = m.Reg32("r1", 1); m.Assign(SZO, m.Cond(m.And(r1, r1))); m.Assign(C, false); var block = m.Block; m.BranchIf(m.Test(ConditionCode.ULE, CZ), "yay"); m.Label("nay"); m.Return(m.Word32(0)); m.Label("yay"); m.Return(m.Word32(1)); var ssa = new SsaTransform( new Program { Architecture = m.Architecture }, m.Procedure, new HashSet <Procedure> { m.Procedure }, null, new ProgramDataFlow()); this.ssaState = ssa.Transform(); var vp = new ValuePropagator(segmentMap, ssaState, new CallGraph(), null, new FakeDecompilerEventListener()); vp.Transform(); Given_ConditionCodeEliminator(); cce.Transform(); Assert.AreEqual("branch r1 <=u 0<32> yay", block.Statements.Last.Instruction.ToString()); }
public void BwReg_00121() { var d0 = m.Reg32("d0", 0); var d3 = m.Reg32("d3", 3); var a5 = m.Reg32("a5", 5); var v38 = m.Temp(PrimitiveType.Word16, "v38"); var v39 = m.Temp(PrimitiveType.Byte, "v39"); var v40 = m.Temp(PrimitiveType.Word16, "v40"); var VZN = m.Flags("VZN"); var ZN = m.Flags("ZN"); var C = m.Flags("C"); var V = m.Flags("V"); var CVZN = m.Flags("CVZN"); var CVZNX = m.Flags("CVZNX"); m.Assign(d0, d3); m.Assign(CVZN, m.Cond(d0)); m.Assign(v38, m.And(m.Cast(PrimitiveType.Word16, d0), 0xF0)); m.Assign(d0, m.Dpb(d0, v38, 0)); m.Assign(ZN, m.Cond(v38)); m.Assign(C, false); m.Assign(V, false); m.Assign(v39, m.Shl(m.Cast(PrimitiveType.Byte, d0), 2)); m.Assign(d0, m.Dpb(d0, v39, 0)); m.Assign(CVZNX, m.Cond(v39)); m.Assign(v40, m.ISub(m.Cast(PrimitiveType.Word16, d0), 44)); m.Assign(CVZN, m.Cond(v40)); m.BranchIf(m.Test(ConditionCode.GT, VZN), "lDefault"); m.Assign(a5, m.Mem32(m.IAdd(Address.Ptr32(0x0000C046), d0))); var xfer = new RtlCall(a5, 4, RtlClass.Transfer); var bw = new Backwalker <Block, Instruction>(host, xfer, expSimp); Assert.IsTrue(bw.CanBackwalk()); Assert.AreEqual("a5", bw.Index.Name); bw.BackWalk(m.Block); Assert.AreEqual("v40", bw.IndexExpression.ToString()); }