Пример #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);
        }