Example #1
0
        public void RejoinTest()
        {
            // i1 -> f2 -> (t3, t6)
            //              t3 -> f4 -> t5
            //              t6 -> f7 -> t8
            //                          (t5, t8) -> f9 -> t10 -> o11
            InputNode i1 = new InputNode(Shape.Scalar());

            VariableNode t3 = new TemporaryNode(Shape.Scalar());
            VariableNode t6 = new TemporaryNode(Shape.Scalar());
            FunctionNode f2 = new FunctionNode(new DummyFunction(1, 2), new VariableNode[] { i1 }, new VariableNode[] { t3, t6 });

            VariableNode t5 = new TemporaryNode(Shape.Scalar());
            FunctionNode f4 = new FunctionNode(new DummyFunction(1, 1), new VariableNode[] { t3 }, new VariableNode[] { t5 });

            VariableNode t8 = new TemporaryNode(Shape.Scalar());
            FunctionNode f7 = new FunctionNode(new DummyFunction(1, 1), new VariableNode[] { t6 }, new VariableNode[] { t8 });

            VariableNode t10 = new TemporaryNode(Shape.Scalar());
            FunctionNode f9  = new FunctionNode(new DummyFunction(2, 1), new VariableNode[] { t5, t8 }, new VariableNode[] { t10 });

            VariableNode o11 = t10.Save();

            List <Node> nodes_sorted = Flow.ExecutionOrderSort(new List <InputNode> {
                i1
            });

            CollectionAssert.AreEqual(new Node[] { i1, f2, t3, f4, t5, t6, f7, t8, f9, t10, o11 }, nodes_sorted);
        }
Example #2
0
        public void ResidualConnectionTest()
        {
            // i1 -> f2 -> t3 -> f4 -> t5 -> f6 -> t7
            //                                    (t5, t7) -> f8 -> t9
            //                                                     (t3, t9) -> f10 -> t11
            //                                                                       (i1, t11) -> f12 -> t13 -> o14
            InputNode i1 = new InputNode(Shape.Scalar());

            VariableNode t3 = new TemporaryNode(Shape.Scalar());
            FunctionNode f2 = new FunctionNode(new DummyFunction(1, 1), new VariableNode[] { i1 }, new VariableNode[] { t3 });

            VariableNode t5 = new TemporaryNode(Shape.Scalar());
            FunctionNode f4 = new FunctionNode(new DummyFunction(1, 1), new VariableNode[] { t3 }, new VariableNode[] { t5 });

            VariableNode t7 = new TemporaryNode(Shape.Scalar());
            FunctionNode f6 = new FunctionNode(new DummyFunction(1, 1), new VariableNode[] { t5 }, new VariableNode[] { t7 });

            VariableNode t9 = new TemporaryNode(Shape.Scalar());
            FunctionNode f8 = new FunctionNode(new DummyFunction(2, 1), new VariableNode[] { t5, t7 }, new VariableNode[] { t9 });

            VariableNode t11 = new TemporaryNode(Shape.Scalar());
            FunctionNode f10 = new FunctionNode(new DummyFunction(2, 1), new VariableNode[] { t3, t9 }, new VariableNode[] { t11 });

            VariableNode t13 = new TemporaryNode(Shape.Scalar());
            FunctionNode f12 = new FunctionNode(new DummyFunction(2, 1), new VariableNode[] { i1, t11 }, new VariableNode[] { t13 });

            VariableNode o14 = t13.Save();

            List <Node> nodes_sorted = Flow.ExecutionOrderSort(new List <InputNode> {
                i1
            });

            CollectionAssert.AreEqual(new Node[] { i1, f2, t3, f4, t5, f6, t7, f8, t9, f10, t11, f12, t13, o14 }, nodes_sorted);
        }
Example #3
0
        public void In2Out1Test()
        {
            // i1 -> f2 -> t3
            // i4 -> f5 -> t6
            //             (t3, t6) -> f7 -> t8 -> o9
            InputNode i1 = new InputNode(Shape.Scalar());

            VariableNode t3 = new TemporaryNode(Shape.Scalar());
            FunctionNode f2 = new FunctionNode(new DummyFunction(1, 1), new VariableNode[] { i1 }, new VariableNode[] { t3 });

            InputNode i4 = new InputNode(Shape.Scalar());

            VariableNode t6 = new TemporaryNode(Shape.Scalar());
            FunctionNode f5 = new FunctionNode(new DummyFunction(1, 1), new VariableNode[] { i4 }, new VariableNode[] { t6 });

            VariableNode t8 = new TemporaryNode(Shape.Scalar());
            FunctionNode f7 = new FunctionNode(new DummyFunction(2, 1), new VariableNode[] { t3, t6 }, new VariableNode[] { t8 });

            VariableNode o9 = t8.Save();

            List <Node> nodes_sorted = Flow.ExecutionOrderSort(new List <InputNode> {
                i1, i4
            });

            CollectionAssert.AreEqual(new Node[] { i1, f2, t3, i4, f5, t6, f7, t8, o9 }, nodes_sorted);
        }
Example #4
0
        public void In2Out2BridgeTest()
        {
            // i1 -> f2 -> t3
            // i4 -> f5 -> t6
            //             (t3, t6) -> f7 -> t8 -> f9 -> (t10, t12)
            //                                            t10 -> o11
            //                                            t12 -> o13
            InputNode i1 = new InputNode(Shape.Scalar());

            VariableNode t3 = new TemporaryNode(Shape.Scalar());
            FunctionNode f2 = new FunctionNode(new DummyFunction(1, 1), new VariableNode[] { i1 }, new VariableNode[] { t3 });

            InputNode i4 = new InputNode(Shape.Scalar());

            VariableNode t6 = new TemporaryNode(Shape.Scalar());
            FunctionNode f5 = new FunctionNode(new DummyFunction(1, 1), new VariableNode[] { i4 }, new VariableNode[] { t6 });

            VariableNode t8 = new TemporaryNode(Shape.Scalar());
            FunctionNode f7 = new FunctionNode(new DummyFunction(2, 1), new VariableNode[] { t3, t6 }, new VariableNode[] { t8 });

            VariableNode t10 = new TemporaryNode(Shape.Scalar());
            VariableNode t12 = new TemporaryNode(Shape.Scalar());
            FunctionNode f9  = new FunctionNode(new DummyFunction(1, 2), new VariableNode[] { t8 }, new VariableNode[] { t10, t12 });

            VariableNode o11 = t10.Save();
            VariableNode o13 = t12.Save();

            List <Node> nodes_sorted = Flow.ExecutionOrderSort(new List <InputNode> {
                i1, i4
            });

            CollectionAssert.AreEqual(new Node[] { i1, f2, t3, i4, f5, t6, f7, t8, f9, t10, o11, t12, o13 }, nodes_sorted);
        }
Example #5
0
        public void DirectTest()
        {
            // i1 -> f2 -> t3 -> o4
            InputNode    i1 = new InputNode(Shape.Scalar());
            VariableNode t3 = new TemporaryNode(Shape.Scalar());
            FunctionNode f2 = new FunctionNode(new DummyFunction(1, 1), new VariableNode[] { i1 }, new VariableNode[] { t3 });
            VariableNode o4 = t3.Save();

            List <Node> nodes_sorted = Flow.ExecutionOrderSort(new List <InputNode> {
                i1
            });

            CollectionAssert.AreEqual(new Node[] { i1, f2, t3, o4 }, nodes_sorted);
        }
Example #6
0
        public void DoubleRejoinTest()
        {
            // i1 -> f2 -> (t3, t6)
            //              t3 -> f4 -> t5
            // i7 -> f8 -> (t9, t12)
            //              t9 -> f10 -> t11
            //              (t6, t12) -> f13 -> (t14, t17)
            //                                   ( t5, t14) -> f15 -> t16
            //                                   (t11, t17) -> f18 -> t19
            //                                                        (t16, t19) -> f20 -> t21 -> o22
            InputNode i1 = new InputNode(Shape.Scalar());

            VariableNode t3 = new TemporaryNode(Shape.Scalar());
            VariableNode t6 = new TemporaryNode(Shape.Scalar());
            FunctionNode f2 = new FunctionNode(new DummyFunction(1, 2), new VariableNode[] { i1 }, new VariableNode[] { t3, t6 });

            VariableNode t5 = new TemporaryNode(Shape.Scalar());
            FunctionNode f4 = new FunctionNode(new DummyFunction(1, 1), new VariableNode[] { t3 }, new VariableNode[] { t5 });

            InputNode i7 = new InputNode(Shape.Scalar());

            VariableNode t9  = new TemporaryNode(Shape.Scalar());
            VariableNode t12 = new TemporaryNode(Shape.Scalar());
            FunctionNode f8  = new FunctionNode(new DummyFunction(1, 2), new VariableNode[] { i7 }, new VariableNode[] { t9, t12 });

            VariableNode t11 = new TemporaryNode(Shape.Scalar());
            FunctionNode f10 = new FunctionNode(new DummyFunction(1, 1), new VariableNode[] { t9 }, new VariableNode[] { t11 });

            VariableNode t14 = new TemporaryNode(Shape.Scalar());
            VariableNode t17 = new TemporaryNode(Shape.Scalar());
            FunctionNode f13 = new FunctionNode(new DummyFunction(2, 2), new VariableNode[] { t6, t12 }, new VariableNode[] { t14, t17 });

            VariableNode t16 = new TemporaryNode(Shape.Scalar());
            FunctionNode f15 = new FunctionNode(new DummyFunction(2, 1), new VariableNode[] { t5, t14 }, new VariableNode[] { t16 });

            VariableNode t19 = new TemporaryNode(Shape.Scalar());
            FunctionNode f18 = new FunctionNode(new DummyFunction(2, 1), new VariableNode[] { t11, t17 }, new VariableNode[] { t19 });

            VariableNode t21 = new TemporaryNode(Shape.Scalar());
            FunctionNode f20 = new FunctionNode(new DummyFunction(2, 1), new VariableNode[] { t16, t19 }, new VariableNode[] { t21 });

            VariableNode o22 = t21.Save();

            List <Node> nodes_sorted = Flow.ExecutionOrderSort(new List <InputNode> {
                i1, i7
            });

            CollectionAssert.AreEqual(new Node[] { i1, f2, t3, f4, t5, t6, i7, f8, t9, f10, t11, t12, f13, t14, f15, t16, t17, f18, t19, f20, t21, o22 }, nodes_sorted);
        }
        static void testRegConst(long value, string expected)
        {
            var dst    = new TemporaryNode();
            var src    = new ConstantNode <long> (value);
            var assign = new AssignmentNode(dst, src);

            var map = TileFactoryTestUtils.createMapping();

            map.Add(dst, TileFactoryTestUtils.RAX);

            var instructions = TileFactory.Assign.Reg_Const().Cover(assign);

            TileFactoryTestUtils.updateMapping(instructions, map);

            var got = TileFactoryTestUtils.getASM(instructions, map);

            Assert.AreEqual(expected, got);
        }
Example #8
0
        public void LoopTest()
        {
            // i1 -> f2 -> t3 -> o4
            //             t3 -> f5 -> t3
            InputNode    i1 = new InputNode(Shape.Scalar());
            VariableNode t3 = new TemporaryNode(Shape.Scalar());

            _ = new FunctionNode(new DummyFunction(1, 1), new VariableNode[] { i1 }, new VariableNode[] { t3 });
            _ = t3.Save();
            _ = new FunctionNode(new DummyFunction(1, 1), new VariableNode[] { t3 }, new VariableNode[] { t3 });

            Assert.ThrowsException <ArgumentException>(
                () => {
                List <Node> nodes_sorted = Flow.ExecutionOrderSort(new List <InputNode> {
                    i1
                });
            }
                );
        }
        public void Test_MemAccess()
        {
            var reg = new TemporaryNode();
            var mem = new MemoryNode(reg);

            var map = TileFactoryTestUtils.createMapping();

            map.Add(reg, TileFactoryTestUtils.RAX);

            var instructions = TileFactory.MemAccessTile().Cover(mem);

            TileFactoryTestUtils.updateMapping(instructions, map);

            var got      = TileFactoryTestUtils.getASM(instructions, map);
            var expected =
                "mov " + TileFactoryTestUtils.SPECIAL + ", [" + TileFactoryTestUtils.RAX + "]\n";

            Assert.AreEqual(expected, got);
        }
Example #10
0
        public void Test_LogAnd_ConstReg_False()
        {
            var l     = new ConstantNode <long> (0L);
            var r     = new TemporaryNode();
            var binop = new LogAndOperatorNode(l, r);

            var map = TileFactoryTestUtils.createMapping();

            map.Add(r, TileFactoryTestUtils.R9);

            var instructions = TileFactory.LogAnd.ConstReg().Cover(binop);

            TileFactoryTestUtils.updateMapping(instructions, map);

            var got      = TileFactoryTestUtils.getASM(instructions, map);
            var expected =
                "xor " + TileFactoryTestUtils.SPECIAL + ", " + TileFactoryTestUtils.SPECIAL + "\n";

            Assert.AreEqual(expected, got);
        }
        public void Test_MemConst_Reg()
        {
            var dst    = new ConstantNode <long> (1111L);
            var src    = new TemporaryNode();
            var assign = new AssignmentNode(new MemoryNode(dst), src);

            var map = TileFactoryTestUtils.createMapping();

            map.Add(src, TileFactoryTestUtils.RBX);

            var instructions = TileFactory.Assign.MemConst_Reg().Cover(assign);

            TileFactoryTestUtils.updateMapping(instructions, map);

            var got      = TileFactoryTestUtils.getASM(instructions, map);
            var expected =
                "mov [1111], " + TileFactoryTestUtils.RBX + "\n" +
                "mov " + TileFactoryTestUtils.SPECIAL + ", " + TileFactoryTestUtils.RBX + "\n";

            Assert.AreEqual(expected, got);
        }
        static void testCondRegConstJump(
            Func <RegisterNode, ConstantNode <long>, BinaryOperatorNode> condMaker, Tile tile, string cond_type)
        {
            var l   = new TemporaryNode();
            var r   = new ConstantNode <long> (15L);
            var lbl = new LabelNode("target");
            var jmp = new ConditionalJumpToLabelNode(condMaker(l, r), lbl);

            var map = TileFactoryTestUtils.createMapping();

            map.Add(l, TileFactoryTestUtils.RAX);

            var instructions = tile.Cover(jmp);

            TileFactoryTestUtils.updateMapping(instructions, map);

            var got      = TileFactoryTestUtils.getASM(instructions, map);
            var expected = "cmp " + TileFactoryTestUtils.RAX + ", 15\n" +
                           "j" + cond_type + " " + lbl.Label + "\n";

            Assert.AreEqual(expected, got);
        }
Example #13
0
        public void In1Out2Test()
        {
            // i1 -> f2 -> t3 -> o4
            //             t3 -> f5 -> t6 -> o7
            InputNode i1 = new InputNode(Shape.Scalar());

            VariableNode t3 = new TemporaryNode(Shape.Scalar());
            FunctionNode f2 = new FunctionNode(new DummyFunction(1, 1), new VariableNode[] { i1 }, new VariableNode[] { t3 });

            VariableNode o4 = t3.Save();

            VariableNode t6 = new TemporaryNode(Shape.Scalar());
            FunctionNode f5 = new FunctionNode(new DummyFunction(1, 1), new VariableNode[] { t3 }, new VariableNode[] { t6 });

            VariableNode o7 = t6.Save();

            List <Node> nodes_sorted = Flow.ExecutionOrderSort(new List <InputNode> {
                i1
            });

            CollectionAssert.AreEqual(new Node[] { i1, f2, t3, o4, f5, t6, o7 }, nodes_sorted);
        }
Example #14
0
        static void testBinopConstReg(
            Func <ConstantNode <long>, RegisterNode, BinaryOperatorNode> condMaker, Tile tile, string mnemonik)
        {
            var l     = new ConstantNode <long> (4L);
            var r     = new TemporaryNode();
            var binop = condMaker(l, r);

            var map = TileFactoryTestUtils.createMapping();

            map.Add(r, TileFactoryTestUtils.RAX);

            var instructions = tile.Cover(binop);

            TileFactoryTestUtils.updateMapping(instructions, map);

            var got      = TileFactoryTestUtils.getASM(instructions, map);
            var expected =
                "mov " + TileFactoryTestUtils.SPECIAL + ", 4\n" +
                mnemonik + " " + TileFactoryTestUtils.SPECIAL + ", " + TileFactoryTestUtils.RAX + "\n";

            Assert.AreEqual(expected, got);
        }
        static void testCompareConstReg(
            Func <ConstantNode <long>, RegisterNode, BinaryOperatorNode> condMaker, Tile tile, string cond_type)
        {
            var l   = new ConstantNode <long> (15L);
            var r   = new TemporaryNode();
            var jmp = condMaker(l, r);

            var map = TileFactoryTestUtils.createMapping();

            map.Add(r, TileFactoryTestUtils.RAX);

            var instructions = tile.Cover(jmp);

            TileFactoryTestUtils.updateMapping(instructions, map);

            var got      = TileFactoryTestUtils.getASM(instructions, map);
            var expected =
                "cmp 15, " + TileFactoryTestUtils.RAX + "\n" +
                "set" + cond_type + " " + TileFactoryTestUtils.SPECIAL + "\n";

            Assert.AreEqual(expected, got);
        }
Example #16
0
        public void Test_Mul_ConstReg()
        {
            var l     = new ConstantNode <long> (13L);
            var r     = new TemporaryNode();
            var binop = new MulOperatorNode(l, r);

            var map = TileFactoryTestUtils.createMapping();

            map.Add(r, TileFactoryTestUtils.R10);

            var instructions = TileFactory.Mul.ConstReg <long>().Cover(binop);

            TileFactoryTestUtils.updateMapping(instructions, map);

            var got      = TileFactoryTestUtils.getASM(instructions, map);
            var expected =
                "mov " + Target.RAX + ", 13\n" +
                "mul " + TileFactoryTestUtils.R10 + "\n" +
                "mov " + TileFactoryTestUtils.SPECIAL + ", " + Target.RAX + "\n";

            Assert.AreEqual(expected, got);
        }
Example #17
0
        public void Test_LogAnd_RegReg()
        {
            var l     = new TemporaryNode();
            var r     = new TemporaryNode();
            var binop = new LogAndOperatorNode(l, r);

            var map = TileFactoryTestUtils.createMapping();

            map.Add(l, TileFactoryTestUtils.R9);
            map.Add(r, TileFactoryTestUtils.R10);

            var instructions = TileFactory.LogAnd.RegReg().Cover(binop);

            TileFactoryTestUtils.updateMapping(instructions, map);

            var got      = TileFactoryTestUtils.getASM(instructions, map);
            var expected =
                "mov " + TileFactoryTestUtils.SPECIAL + ", " + TileFactoryTestUtils.R9 + "\n" +
                "xor " + TileFactoryTestUtils.R9 + ", " + TileFactoryTestUtils.R9 + "\n" +
                "cmp " + TileFactoryTestUtils.R10 + ", " + TileFactoryTestUtils.R9 + "\n" +
                "cmove " + TileFactoryTestUtils.SPECIAL + ", " + TileFactoryTestUtils.R9 + "\n";

            Assert.AreEqual(expected, got);
        }
Example #18
0
        public void Test_Mod_RegConst()
        {
            var l     = new TemporaryNode();
            var r     = new ConstantNode <long> (13L);
            var binop = new ModOperatorNode(l, r);

            var map = TileFactoryTestUtils.createMapping();

            map.Add(l, TileFactoryTestUtils.R9);

            var instructions = TileFactory.Mod.RegConst <long> ().Cover(binop);

            TileFactoryTestUtils.updateMapping(instructions, map);

            var got      = TileFactoryTestUtils.getASM(instructions, map);
            var expected =
                "xor " + Target.RDX + ", " + Target.RDX + "\n" +
                "mov " + Target.RAX + ", " + TileFactoryTestUtils.R9 + "\n" +
                "mov " + TileFactoryTestUtils.SPECIAL + ", 13\n" +
                "div " + TileFactoryTestUtils.SPECIAL + "\n" +
                "mov " + TileFactoryTestUtils.SPECIAL + ", " + Target.RDX + "\n";

            Assert.AreEqual(expected, got);
        }
        static void generalTest(
            Func <RegisterNode, RegisterNode, RegisterNode> target,
            Func <RegisterNode, ConstantNode <long>, BinaryOperatorNode> condMaker,
            Tile tile, long value, string expected)
        {
            var dst    = new TemporaryNode();
            var src    = new TemporaryNode();
            var cons   = new ConstantNode <long> (value);
            var oper   = condMaker(src, cons);
            var assign = new AssignmentNode(target(src, dst), oper);

            var map = TileFactoryTestUtils.createMapping();

            map.Add(dst, TileFactoryTestUtils.RAX);
            map.Add(src, TileFactoryTestUtils.RBX);

            var instructions = tile.Cover(assign);

            TileFactoryTestUtils.updateMapping(instructions, map);

            var got = TileFactoryTestUtils.getASM(instructions, map);

            Assert.AreEqual(expected, got);
        }
Example #20
0
        public void TreeTest()
        {
            // i1 -> f2 -> t3
            //            (t3, i4) -> f5 -> t6 -> f7 -> (t8, t9)
            //                                           t8 -> o10
            //                                           t9 -> o11
            //                              t6 -> o12
            InputNode i1 = new InputNode(Shape.Scalar());

            VariableNode t3 = new TemporaryNode(Shape.Scalar());
            FunctionNode f2 = new FunctionNode(new DummyFunction(1, 1), new VariableNode[] { i1 }, new VariableNode[] { t3 });

            InputNode i4 = new InputNode(Shape.Scalar());

            VariableNode t6 = new TemporaryNode(Shape.Scalar());
            FunctionNode f5 = new FunctionNode(new DummyFunction(2, 1), new VariableNode[] { t3, i4 }, new VariableNode[] { t6 });

            VariableNode t8 = new TemporaryNode(Shape.Scalar());
            VariableNode t9 = new TemporaryNode(Shape.Scalar());
            FunctionNode f7 = new FunctionNode(new DummyFunction(1, 2), new VariableNode[] { t6 }, new VariableNode[] { t8, t9 });

            VariableNode o10 = t8.Save();
            VariableNode o11 = t9.Save();
            VariableNode o12 = t6.Save();

            CollectionAssert.AreEqual(new Node[] {}, i1.InNodes.ToArray());
            CollectionAssert.AreEqual(new Node[] { f2 }, i1.OutNodes.ToArray());

            CollectionAssert.AreEqual(new Node[] { i1 }, f2.InNodes.ToArray());
            CollectionAssert.AreEqual(new Node[] { t3 }, f2.OutNodes.ToArray());

            CollectionAssert.AreEqual(new Node[] { f2 }, t3.InNodes.ToArray());
            CollectionAssert.AreEqual(new Node[] { f5 }, t3.OutNodes.ToArray());

            CollectionAssert.AreEqual(new Node[] {}, i4.InNodes.ToArray());
            CollectionAssert.AreEqual(new Node[] { f5 }, i4.OutNodes.ToArray());

            CollectionAssert.AreEqual(new Node[] { t3, i4 }, f5.InNodes.ToArray());
            CollectionAssert.AreEqual(new Node[] { t6 }, f5.OutNodes.ToArray());

            CollectionAssert.AreEqual(new Node[] { f5 }, t6.InNodes.ToArray());
            CollectionAssert.AreEqual(new Node[] { f7, o12 }, t6.OutNodes.ToArray());

            CollectionAssert.AreEqual(new Node[] { t6 }, f7.InNodes.ToArray());
            CollectionAssert.AreEqual(new Node[] { t8, t9 }, f7.OutNodes.ToArray());

            CollectionAssert.AreEqual(new Node[] { f7 }, t8.InNodes.ToArray());
            CollectionAssert.AreEqual(new Node[] { o10 }, t8.OutNodes.ToArray());

            CollectionAssert.AreEqual(new Node[] { f7 }, t9.InNodes.ToArray());
            CollectionAssert.AreEqual(new Node[] { o11 }, t9.OutNodes.ToArray());

            CollectionAssert.AreEqual(new Node[] { t8 }, o10.InNodes.ToArray());
            CollectionAssert.AreEqual(new Node[] {}, o10.OutNodes.ToArray());

            CollectionAssert.AreEqual(new Node[] { t9 }, o11.InNodes.ToArray());
            CollectionAssert.AreEqual(new Node[] {}, o11.OutNodes.ToArray());

            CollectionAssert.AreEqual(new Node[] { t6 }, o12.InNodes.ToArray());
            CollectionAssert.AreEqual(new Node[] {}, o12.OutNodes.ToArray());
        }
 public override void Visit(TemporaryNode node)
 {
     Visit(node as RegisterNode);
 }