コード例 #1
0
ファイル: DataFlowAnalysisTests.cs プロジェクト: tgiphil/reko
        public void DfaConvertConvert()
        {
            var m  = new ProcedureBuilder();
            var r1 = m.Register("r1");
            var r2 = m.Reg64("r2", 2);

            m.Assign(m.Frame.EnsureRegister(m.Architecture.StackRegister), m.Frame.FramePointer);
            r1.DataType = PrimitiveType.Real32;
            r2.DataType = PrimitiveType.Real64;
            m.Assign(r2, m.Convert(r1, PrimitiveType.Real32, PrimitiveType.Real64));
            m.MStore(m.Word32(0x123408), m.Convert(r2, PrimitiveType.Real64, PrimitiveType.Real32));
            m.Return();

            RunFileTest(m, "Analysis/DfaCastCast.txt");
        }
コード例 #2
0
ファイル: Backwalker_x86_Tests.cs プロジェクト: ghmole/reko
        public void BwIndexInMemoryAddress()
        {
            // samples of switch statement emitted
            // by the Microsoft VC compiler

            var ebp = m.Frame.EnsureRegister(Registers.ebp);
            var eax = m.Frame.EnsureRegister(Registers.eax);
            var edx = m.Frame.EnsureRegister(Registers.edx);

            // cmp [ebp-66],1D

            m.Assign(SCZO, m.Cond(m.ISub(m.Mem32(m.ISub(ebp, 0xC4)), 0x1D)));
            var block0 = m.CurrentBlock;

            m.BranchIf(new TestCondition(ConditionCode.UGT, SCZO), "default");

            // mov edx,[ebp-66]
            // movzx eax,byte ptr [edx + 0x10000]
            // jmp [eax + 0x12000]

            m.Assign(edx, m.Mem32(m.ISub(ebp, 0xC4)));
            m.Assign(eax, m.Convert(m.Mem8(m.IAdd(edx, 0x10000)), PrimitiveType.Byte, PrimitiveType.Word32));
            var xfer = new RtlGoto(m.Mem32(m.IAdd(eax, 0x12000)), InstrClass.Transfer);

            var block1 = m.CurrentBlock;
            var bw     = new Backwalker <Block, Instruction>(host, xfer, expSimp);
            var ret    = bw.BackwalkInstructions(Registers.eax, block1);

            Assert.AreEqual("None", bw.Index.ToString());
            Assert.AreEqual("Mem0[ebp - 0xC4<32>:word32]", bw.IndexExpression.ToString());
            Assert.AreEqual(4, bw.JumpSize);
            Assert.IsTrue(ret);

            ret = bw.BackwalkInstructions(null, block0);
        }
コード例 #3
0
ファイル: ValuePropagationTests.cs プロジェクト: nemerle/reko
        public void VpCastRealConstant()
        {
            var m  = new ProcedureBuilder();
            var r1 = m.Reg32("r1", 1);

            m.Assign(r1, m.Convert(Constant.Real64(1), PrimitiveType.Real64, PrimitiveType.Real32));

            var ssa  = RunTest(m);
            var sExp =
                #region Expected
                @"r1_1: orig: r1
    def:  r1_1 = 1.0F
// ProcedureBuilder
// Return size: 0
define ProcedureBuilder
ProcedureBuilder_entry:
	// succ:  l1
l1:
	r1_1 = 1.0F
ProcedureBuilder_exit:
";

            #endregion

            AssertStringsEqual(sExp, ssa);
        }
コード例 #4
0
ファイル: ValuePropagationTests.cs プロジェクト: nemerle/reko
        public void VpCastCast()
        {
            var m = new ProcedureBuilder();

            m.MStore(
                m.Word32(0x1234000),
                m.Convert(
                    m.Convert(
                        m.Mem(PrimitiveType.Real32, m.Word32(0x123400)),
                        PrimitiveType.Real32,
                        PrimitiveType.Real64),
                    PrimitiveType.Real64,
                    PrimitiveType.Real32));
            m.Return();

            Assert.IsNotNull(dynamicLinker);
            RunFileTest(m, "Analysis/VpCastCast.txt");
        }
コード例 #5
0
        public void Vse_Cast_Truncate_SingleValue()
        {
            var r1 = m.Reg32("r1", 1);

            Given_ValueSet(r1, IVS(0, -0x43F, -0x43F));
            Given_Evaluator();

            var vs = vse.Evaluate(m.Convert(r1, r1.DataType, PrimitiveType.Byte));

            Assert.AreEqual("0[-3F,-3F]", vs.Item1.ToString());
        }
コード例 #6
0
        public void Larw_Multiply_Accumulate()
        {
            var sExp =
                @"l1:
	eax_2 = CONVERT(Mem0[0x5418<32>:word16], word16, int32)
	edx_3 = 0xF000<32>
	edx_eax_4 = edx_3 *s64 eax_2
	eax_5 = SLICE(edx_eax_4, word32, 0) (alias)
	edx_9 = SLICE(edx_eax_4, word32, 32) (alias)
	edx_eax_17 = SEQ(edx_9, eax_5)
	tmp2_tmp1_18 = Mem0[0x6FF0<32>:ui64] - edx_eax_17
	tmp1_6 = SLICE(tmp2_tmp1_18, word32, 0) (alias)
	tmp2_11 = SLICE(tmp2_tmp1_18, word32, 32) (alias)
	Mem7[0x6FF0<32>:word32] = tmp1_6
	SCZ_8 = cond(tmp1_6)
	C_10 = SLICE(SCZ_8, bool, 2) (alias)
	Mem12[0x6FF4<32>:word32] = tmp2_11
	SCZ_13 = cond(tmp2_11)
	C_14 = SLICE(SCZ_13, bool, 2) (alias)
	S_15 = SLICE(SCZ_13, bool, 0) (alias)
	Z_16 = SLICE(SCZ_13, bool, 1) (alias)
	return
";

            RunTest(sExp, m =>
            {
                var eax     = m.Reg32("eax", 0);
                var edx     = m.Reg32("edx", 2);
                var edx_eax = m.Frame.EnsureSequence(PrimitiveType.Word64, edx.Storage, eax.Storage);
                var tmp1    = m.Temp(PrimitiveType.Word32, "tmp1");
                var tmp2    = m.Temp(PrimitiveType.Word32, "tmp2");
                m.Assign(eax, m.Convert(m.Mem16(m.Word32(0x5418)), PrimitiveType.Word16, PrimitiveType.Int32));
                m.Assign(edx, m.Word32(0xF000));
                m.Assign(edx_eax, m.SMul(PrimitiveType.Int64, edx, eax));
                m.Assign(tmp1, m.ISub(m.Mem32(m.Word32(0x6FF0)), eax));
                m.MStore(m.Word32(0x6FF0), tmp1);
                m.Assign(this.SCZ, m.Cond(tmp1));
                m.Assign(tmp2, m.ISub(m.ISub(m.Mem32(m.Word32(0x6FF4)), edx), this.CF));
                m.MStore(m.Word32(0x6FF4), tmp2);
                m.Assign(this.SCZ, m.Cond(tmp2));
                block = m.Block;
                m.Return();
            });
        }
コード例 #7
0
ファイル: BackwalkerTests.cs プロジェクト: claunia/reko
        public void BwZeroExtend()
        {
            var rax = m.Reg64("rax", 0);
            var eax = m.Reg32("eax", 0);
            var al  = m.Reg8("al", 0);
            var ecx = m.Reg32("ecx", 1);
            var CZ  = m.Flags("CZ");

            m.Assign(eax, m.Mem8(rax));
            m.Assign(CZ, m.Cond(m.ISub(al, 0x78)));
            m.BranchIf(m.Test(ConditionCode.UGT, CZ), "ldefault");
            m.Assign(ecx, m.Convert(al, al.DataType, PrimitiveType.Word32));
            var xfer = new RtlGoto(m.Mem32(m.IAdd(Constant.Word32(0x00411F40), m.IMul(ecx, 8))), InstrClass.Transfer);

            var bw = new Backwalker <Block, Instruction>(host, xfer, expSimp);

            Assert.IsTrue(bw.CanBackwalk());
            var ops = bw.BackWalk(m.Block);

            Assert.AreEqual(3, ops.Count);
            Assert.AreEqual("cmp 120", ops[0].ToString());
            Assert.AreEqual("branch UGT", ops[1].ToString());
            Assert.AreEqual("* 8", ops[2].ToString());
        }
コード例 #8
0
        public void Exs_Cast_real()
        {
            Given_ExpressionSimplifier();
            var expr = m.Convert(Constant.Real64(1.5), PrimitiveType.Real64, PrimitiveType.Real32);

            Assert.AreEqual("1.5F", expr.Accept(simplifier).ToString());
        }
コード例 #9
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();
            });
        }