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

            CollectionAssert.AreEqual(new[] { "A1" }, i.Def(RegType.Address));
        }
Exemple #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));
        }
Exemple #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));
        }
Exemple #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));
        }
Exemple #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));
        }
Exemple #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));
        }
Exemple #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));
        }
Exemple #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));
        }
Exemple #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));
        }
Exemple #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));
        }
Exemple #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));
        }
        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);
        }