Beispiel #1
0
        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, m.Word32(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, m.Word32(12));
                m.Assign(r, m.ISub(r, 4));
                m.BranchIf(m.Eq0(r), "l0002");

                m.Return();
            });
            RunFileTest(b.BuildProgram(), "Analysis/VpLoop.txt");
        }
        private void __swl(Expression mem, Expression reg)
        {
            var app = m.Fn(
                new PseudoProcedure(PseudoProcedure.SwL, PrimitiveType.Word32, 2),
                mem, reg);

            if (mem is Identifier id)
            {
                m.Assign(id, app);
            }
            else
            {
                m.Store(mem, app);
            }
        }
Beispiel #3
0
        private void __swl(Expression mem, Expression reg)
        {
            var app = m.Fn(
                new PseudoProcedure(PseudoProcedure.SwL, PrimitiveType.Word32, 2),
                mem, reg);

            if (mem is Identifier)
            {
                m.Assign((Identifier)mem, app);
            }
            else
            {
                m.Store(((MemoryAccess)mem).EffectiveAddress, app);
            }
        }
        public void FPUG_NegateFpuStackReturn()
        {
            var top_1   = m.Reg("FakeTop_1", Top);
            var top_2   = m.Reg("FakeTop_2", Top);
            var top_3   = m.Reg("FakeTop_3", Top);
            var a       = m.Reg64("a");
            var f       = m.Reg32("f");
            var uses    = new Identifier[] { top_1 };
            var defines = new Identifier[] { top_2 };

            m.Call(f, 4, uses, defines);
            m.Store(MemST(top_2), m.Neg(MemST(top_2)));

            RunFpuStackReturnGuesser();

            var expected =
                @"
call f (retsize: 4;)
	uses: Top:FakeTop_1
	defs: FPU -1:rRet0
FakeST9[FakeTop_1 - 1<8>:real64] = rRet0
FakeTop_2 = FakeTop_1 - 1<i8>
FakeST[FakeTop_2:real64] = -FakeST[FakeTop_2:real64]
";

            AssertProcedureCode(expected);
        }
Beispiel #5
0
        public void VpUndoSlicingOfSegmentPointerCheckUses()
        {
            var es      = m.Reg16("es");
            var es_2    = m.Reg16("es_2");
            var bx      = m.Reg16("bx");
            var bx_3    = m.Reg16("bx_3");
            var bx_4    = m.Reg16("bx_4");
            var es_bx_1 = m.Reg32("es_bx_1");

            m.Store(m.SegMem(PrimitiveType.Byte, es, m.IAdd(bx, 4)), m.Byte(3));
            m.Assign(es_bx_1, m.SegMem(PrimitiveType.Word32, es, bx));
            m.Assign(es_2, m.Slice(PrimitiveType.Word16, es_bx_1, 16));
            m.Assign(bx_3, m.Cast(PrimitiveType.Word16, es_bx_1));
            var instr = m.Assign(bx_4, m.SegMem(PrimitiveType.Word16, es_2, m.IAdd(bx_3, 4)));

            RunValuePropagator();
            Assert.AreEqual("bx_4 = Mem8[es_bx_1 + 0x0004:word16]", instr.ToString());
        }