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"); }
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); }
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); }