예제 #1
0
        public void VpConstantHighByte()
        {
            var pb = new ProgramBuilder();

            pb.Add("sum", m =>
            {
                var _ax = new RegisterStorage("ax", 0, 0, PrimitiveType.Word16);
                var _al = new RegisterStorage("al", 0, 0, PrimitiveType.Byte);
                var _ah = new RegisterStorage("ah", 0, 8, PrimitiveType.Byte);
                var _dx = new RegisterStorage("dx", 2, 0, PrimitiveType.Word16);
                var _si = new RegisterStorage("si", 6, 0, PrimitiveType.Word16);
                var ax  = m.Frame.EnsureRegister(_ax);
                var ah  = m.Frame.EnsureRegister(_ah);
                var al  = m.Frame.EnsureRegister(_al);
                var dx  = m.Frame.EnsureRegister(_dx);
                var si  = m.Frame.EnsureRegister(_si);

                m.Assign(ah, 0);

                m.Label("m0");
                m.BranchIf(m.Eq0(m.Mem8(si)), "m3done");

                m.Label("m1");
                m.Assign(al, m.Mem8(si));
                m.Assign(dx, m.IAdd(dx, ax));
                m.Goto("m0");

                m.Label("m3done");
                m.Return();
            });
            RunFileTest(pb.BuildProgram(), "Analysis/VpConstantHighByte.txt");
        }
예제 #2
0
        public void Urb_Remove_many_blocks()
        {
            var m = new SsaProcedureBuilder(name: nameof(Urb_Remove_many_blocks));

            var r1_1 = m.Reg32("r1_1");
            var r1_2 = m.Reg32("r1_2");
            var r1_3 = m.Reg32("r1_3");
            var r1_4 = m.Reg32("r1_4");
            var r2   = m.Reg32("r2");

            m.AddDefToEntryBlock(r2);
            m.BranchIf(Constant.False(), "m2");

            m.Label("m1");
            m.Assign(r1_1, 1);
            m.Goto("m4");

            m.Label("m2");  // dead code
            m.BranchIf(m.Eq0(r2), "m3");

            m.Label("m2a");
            m.Assign(r1_2, 2);
            m.Goto("m4");

            m.Label("m3");
            m.Assign(r1_3, 3);
            // end of dead code.

            m.Label("m4");
            m.Phi(r1_4, (r1_1, "m1"), (r1_2, "m2a"), (r1_3, "m3"));
            m.Return(r1_4);

            var sExp =
                #region
                @"// Urb_Remove_many_blocks
// Return size: 0
define Urb_Remove_many_blocks
Urb_Remove_many_blocks_entry:
	def r2
	// succ:  l1
l1:
	// succ:  m1
m1:
	r1_1 = 1<32>
	// succ:  m4
m4:
	r1_4 = r1_1
	return r1_4
	// succ:  Urb_Remove_many_blocks_exit
Urb_Remove_many_blocks_exit:
";

            #endregion

            RunTest(sExp, m);
        }
예제 #3
0
        public void Urb_Remove_false()
        {
            var m = new SsaProcedureBuilder(name: nameof(Urb_Remove_false));

            var r1_1 = m.Reg32("r1_1");
            var r1_2 = m.Reg32("r1_2");
            var r1_3 = m.Reg32("r1_3");

            m.BranchIf(Constant.False(), "m2");

            m.Label("m1");
            m.Assign(r1_1, 1);
            m.Goto("m3");

            m.Label("m2");  // dead code
            m.Assign(r1_2, 2);

            m.Label("m3");
            m.Phi(r1_3, (r1_1, "m1"), (r1_2, "m2"));
            m.Return(r1_3);

            var sExp =
                #region
                @"// Urb_Remove_false
// Return size: 0
define Urb_Remove_false
Urb_Remove_false_entry:
	// succ:  l1
l1:
	// succ:  m1
m1:
	r1_1 = 1<32>
	// succ:  m3
m3:
	r1_3 = r1_1
	return r1_3
	// succ:  Urb_Remove_false_exit
Urb_Remove_false_exit:
";

            #endregion

            RunTest(sExp, m);
        }