コード例 #1
0
        public void DefWhenAddressRegsUsed()
        {
            var i = new M68kInstruction
            {
                Opcode   = M68kOpcode.RegDef,
                DefsUses = new[] { "A1", "D1" }
            };

            CollectionAssert.AreEqual(new[] { "A1" }, i.Def(RegType.Address));
        }
コード例 #2
0
        public void CmpUse()
        {
            var cmp = new M68kInstruction(M68kOpcode.Cmp, new Register {
                Type = RegType.Data, Number = 1
            }, new Register {
                Type = RegType.Data, Number = 2
            });

            CollectionAssert.AreEquivalent(new[] { "D1", "D2" }, cmp.Use(RegType.Data));
        }
コード例 #3
0
        public void CmpDef()
        {
            var cmp = new M68kInstruction(M68kOpcode.Cmp, new Register {
                Type = RegType.Data, Number = 1
            }, new Register {
                Type = RegType.Data, Number = 2
            });

            CollectionAssert.IsEmpty(cmp.Def(RegType.Data));
        }
コード例 #4
0
        public void LsrDef()
        {
            var cmp = new M68kInstruction(M68kOpcode.Lsr, new Register {
                Type = RegType.Data, Number = 1
            }, new Register {
                Type = RegType.Data, Number = 2
            });

            CollectionAssert.AreEqual(new[] { "D2" }, cmp.Def(RegType.Data));
        }
コード例 #5
0
        public void TstDef()
        {
            var tst = new M68kInstruction
            {
                Opcode    = M68kOpcode.Tst,
                Register1 = new Register {
                    Type = RegType.Data, Number = 1
                }
            };

            CollectionAssert.IsEmpty(tst.Def(RegType.Data));
        }
コード例 #6
0
        public void TstUse()
        {
            var tst = new M68kInstruction
            {
                Opcode    = M68kOpcode.Tst,
                Register1 = new Register {
                    Type = RegType.Data, Number = 1
                }
            };

            CollectionAssert.AreEquivalent(new[] { "D1" }, tst.Use(RegType.Data));
        }
コード例 #7
0
        public void LeaDef()
        {
            var cmp = new M68kInstruction
            {
                Opcode          = M68kOpcode.Lea,
                Variable        = "foobar",
                AddressingMode1 = M68kAddressingMode.Absolute,
                AddressingMode2 = M68kAddressingMode.Register,
                Register2       = new Register {
                    Type = RegType.Address, Number = 2
                }
            };

            CollectionAssert.AreEqual(new[] { "A2" }, cmp.Def(RegType.Address));
        }
コード例 #8
0
        public void UseWhenLoadBySp()
        {
            var i = new M68kInstruction
            {
                Opcode          = M68kOpcode.Move,
                FinalRegister1  = M68kRegister.SP,
                AddressingMode1 = M68kAddressingMode.AddressWithOffset,
                Offset          = 0,
                Register2       = new Register {
                    Type = RegType.Address, Number = 15
                },
                AddressingMode2 = M68kAddressingMode.Register
            };

            CollectionAssert.AreEqual(new[] { "A15" }, i.Def(RegType.Address));
        }
コード例 #9
0
        public void LeaUse()
        {
            var cmp = new M68kInstruction
            {
                Opcode          = M68kOpcode.Lea,
                Variable        = "foobar",
                AddressingMode1 = M68kAddressingMode.Absolute,
                AddressingMode2 = M68kAddressingMode.Register,
                Register2       = new Register {
                    Type = RegType.Address, Number = 2
                }
            };

            CollectionAssert.IsEmpty(cmp.Use(RegType.Address));
            CollectionAssert.IsEmpty(cmp.Use(RegType.Data));
        }
コード例 #10
0
        public void AddressStoreDef()
        {
            var i = new M68kInstruction
            {
                Opcode          = M68kOpcode.Move,
                AddressingMode1 = M68kAddressingMode.Register,
                Register1       = new Register {
                    Type = RegType.Data, Number = 1
                },
                AddressingMode2 = M68kAddressingMode.Address,
                Register2       = new Register {
                    Type = RegType.Address, Number = 2
                }
            };

            CollectionAssert.IsEmpty(i.Def(RegType.Address));
            CollectionAssert.IsEmpty(i.Def(RegType.Data));
        }
コード例 #11
0
        public void AddressLoadDef()
        {
            var i = new M68kInstruction
            {
                Opcode          = M68kOpcode.Move,
                AddressingMode1 = M68kAddressingMode.Address,
                Register1       = new Register {
                    Type = RegType.Address, Number = 2
                },
                AddressingMode2 = M68kAddressingMode.Register,
                Register2       = new Register {
                    Type = RegType.Data, Number = 1
                },
            };

            CollectionAssert.IsEmpty(i.Def(RegType.Address));
            CollectionAssert.AreEquivalent(new[] { "D1", }, i.Def(RegType.Data));
        }
コード例 #12
0
        public void Test2()
        {
            var b = d11;
            var c = d12;
            var d = d13;
            var e = d14;
            var f = d15;
            var g = d16;
            var h = d17;
            var j = d19;
            var k = d20;
            var m = d21;

            /*
             * g := mem[j+12]
             * h := k - 1
             * f := g * h
             * e := mem[j+8]
             * m := mem[j+16]
             * b := mem[f]
             * c := e + 8
             * d := c
             * k := m + 4
             * j := b*/

            var instructions = new[]
            {
                M68kInstruction.LoadFromMemory(j, g),

                new M68kInstruction(M68kOpcode.Move, k, d0),
                new M68kInstruction(M68kOpcode.Sub, 1, d0),
                new M68kInstruction(M68kOpcode.Move, d0, h),

                new M68kInstruction(M68kOpcode.Move, g, d0),
                new M68kInstruction(M68kOpcode.Add, h, d0),
                new M68kInstruction(M68kOpcode.Move, d0, f),

                M68kInstruction.LoadFromMemory(j, e),
                M68kInstruction.LoadFromMemory(j, m),
                M68kInstruction.LoadFromMemory(f, b),

                new M68kInstruction(M68kOpcode.Move, e, d0),
                new M68kInstruction(M68kOpcode.Add, 8, d0),
                new M68kInstruction(M68kOpcode.Move, d0, c),

                new M68kInstruction(M68kOpcode.Move, c, d),

                new M68kInstruction(M68kOpcode.Move, m, d0),
                new M68kInstruction(M68kOpcode.Add, 4, d0),
                new M68kInstruction(M68kOpcode.Move, d0, k),

                new M68kInstruction(M68kOpcode.Move, b, j),

                // Cause Live out: d k j

                M68kInstruction.StoreToMemory(d, j),
                M68kInstruction.StoreToMemory(k, j),
                M68kInstruction.StoreToMemory(j, j),

                //new M68kInstruction(M68kOpcode.Rts)
            };

            var la = new LivenessAnalysis(instructions);

            var gr = InterferenceGraphGenerator.MakeGraph(la.Nodes, RegType.Data, "D0,D1,D2,D3,D4,D5,D6,D7".Split(',').ToList());

            AssertEdge(gr, j, f);
            AssertEdge(gr, j, e);
            AssertEdge(gr, j, k);
            AssertEdge(gr, j, h);
            AssertEdge(gr, j, g);

            AssertEdge(gr, f, e);
            AssertEdge(gr, f, m);
            AssertEdge(gr, f, m);

            AssertEdge(gr, k, b);
            AssertEdge(gr, k, d);
            AssertEdge(gr, k, g);

            AssertEdge(gr, h, g);

            AssertEdge(gr, b, m);
            AssertEdge(gr, b, c);
            AssertEdge(gr, b, d);

            AssertNoEdge(gr, j, b);
            AssertNoEdge(gr, d, c);
        }