예제 #1
0
        public void TrashInLoop()
        {
            p.Add("main", m =>
            {
                var eax = m.Frame.EnsureRegister(Registers.eax);
                var ebx = m.Frame.EnsureRegister(Registers.ebx);
                m.Assign(eax, 1);
                m.Label("Lupe");
                m.Store(m.IAdd(ebx, eax), m.Word16(0));
                m.Assign(eax, m.IAdd(eax, 2));
                m.BranchIf(m.Le(eax, 10), "Lupe");
                m.Return();
            });

            var sExp =
                @"main eax ax al ah
const eax:<invalid>
    main_entry esp:fp
    l1 esp:fp
    l2 eax:<invalid> esp:fp
    Lupe eax:<invalid> esp:fp
    main_exit eax:<invalid> esp:fp";

            RunTest(p, sExp);
        }
예제 #2
0
        public void Exs_CompareWithConstant()
        {
            Given_ExpressionSimplifier();
            var expr = m.Le(m.Word32(0x00123400), foo);

            Assert.AreEqual("foo_1 >= 0x123400<32>", expr.Accept(simplifier).ToString());
        }
예제 #3
0
        public void ProcStr_IfThen()
        {
            var r1 = m.Reg32("r1");

            m.Label("head");
            m.BranchIf(m.Le(r1, 0), "tail");
            m.Label("doit");
            m.Assign(r1, 0);
            m.Label("tail");
            m.Return(r1);

            var sExp =
                @"    if (r1 > 0x00)
        r1 = 0x00;
    return r1;
";

            RunTest(sExp, m.Procedure);
        }
예제 #4
0
        public void CceMultibitCcFromPhiNode()
        {
            var sExp =
                #region Expected
                @"// ProcedureBuilder
// Return size: 0
define ProcedureBuilder
ProcedureBuilder_entry:
	def r0
	def r2
	// succ:  l1
l1:
	branch r0 <= r2 m1
	// succ:  m0 m1
m0:
	r0_5 = r0 + r2
	v12_18 = r0_5 == 0<32>
	v9_15 = r0_5 <=u 0<32>
	v6_12 = r0_5 >u 0<32>
	goto m2
	// succ:  m2
m1:
	r0_3 = r2 - r0
	v13_19 = r0_3 == 0<32>
	v10_16 = r0_3 <=u 0<32>
	v7_13 = r0_3 >u 0<32>
	// succ:  m2
m2:
	v11_17 = PHI((v9_15, m0), (v10_16, m1))
	v8_14 = PHI((v6_12, m0), (v7_13, m1))
	v14_20 = PHI((v12_18, m0), (v13_19, m1))
	Mem8[0x123400<32>:int8] = CONVERT(v8_14, bool, int8)
	Mem9[0x123402<32>:int8] = CONVERT(v11_17, bool, int8)
	Mem11[0x123404<32>:int8] = CONVERT(v14_20, bool, int8)
	return
	// succ:  ProcedureBuilder_exit
ProcedureBuilder_exit:

";

            #endregion
            RunStringTest(sExp, m =>
            {
                var r0 = m.Reg32("r0", 0);
                var r2 = m.Reg32("r2", 2);
                var CZ = m.Flags("CZ");
                var Z  = m.Flags("Z");
                m.BranchIf(m.Le(r0, r2), "m1");

                m.Label("m0");
                m.Assign(r0, m.IAdd(r0, r2));
                m.Assign(CZ, m.Cond(r0));
                m.Goto("m2");

                m.Label("m1");
                m.Assign(r0, m.ISub(r2, r0));
                m.Assign(CZ, m.Cond(r0));

                m.Label("m2");
                //m.Assign(tmp, m.Convert(m.Test(ConditionCode.UGT, CZ), PrimitiveType.Bool, PrimitiveType.SByte));
                m.MStore(m.Word32(0x00123400), m.Convert(m.Test(ConditionCode.UGT, CZ), PrimitiveType.Bool, PrimitiveType.SByte));
                m.MStore(m.Word32(0x00123402), m.Convert(m.Test(ConditionCode.ULE, CZ), PrimitiveType.Bool, PrimitiveType.SByte));
                m.MStore(m.Word32(0x00123404), m.Convert(m.Test(ConditionCode.EQ, Z), PrimitiveType.Bool, PrimitiveType.SByte));
                m.Return();
            });
        }