public void VpLoop() { var b = new ProgramBuilder(); b.Add("main", m => { var r = m.Reg32("r0", 0); var zf = m.Flags("Z"); m.Label("l0000"); m.Store(r, 0); m.Assign(r, m.ISub(r, 4)); m.Assign(zf, m.Cond(r)); m.BranchCc(ConditionCode.NE, "l0000"); m.Label("l0001"); m.Assign(r, 42); m.Label("l0002"); m.Store(r, 12); m.Assign(r, m.ISub(r, 4)); m.BranchIf(m.Eq0(r), "l0002"); m.Return(); }); RunFileTest(b.BuildProgram(), "Analysis/VpLoop.txt"); }
public void TrashFlagProcedure() { p.Add("main", m => { var eax = m.Frame.EnsureRegister(Registers.eax); m.Assign(eax, m.IAdd(eax, 4)); m.Assign(m.Flags("SZCO"), m.Cond(eax)); m.Return(); }); var sExp = @"main SCZO eax ax al ah const eax:<invalid> main_entry esp:fp l1 esp:fp main_exit eax:eax + 0x00000004 esp:fp"; RunTest(p, sExp); }
public void CceShrRcrPattern() { var p = new ProgramBuilder(new FakeArchitecture()); p.Add("main", (m) => { var C = m.Flags("C"); var r1 = MockReg(m, 1); var r2 = MockReg(m, 2); m.Assign(r1, m.Shr(r1, 1)); m.Assign(C, m.Cond(r1)); m.Assign(r2, m.Fn( new PseudoProcedure(PseudoProcedure.RorC, r2.DataType, 2), r2, Constant.Byte(1), C)); m.Assign(C, m.Cond(r2)); m.MStore(m.Word32(0x3000), r2); m.MStore(m.Word32(0x3004), r1); }); RunTest(p, "Analysis/CceShrRcrPattern.txt"); }
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.Slice(PrimitiveType.Word16, d0, 0), 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.Slice(PrimitiveType.Byte, d0, 0), 2)); m.Assign(d0, m.Dpb(d0, v39, 0)); m.Assign(CVZNX, m.Cond(v39)); m.Assign(v40, m.ISub(m.Slice(PrimitiveType.Word16, d0, 0), 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, InstrClass.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()); }