Exemplo n.º 1
0
        /// <summary>
        ///     Register RR and RI formats of the SLL/SRL/SRA/ROL/ROR instructions.
        /// </summary>
        private static void RegisterShifterInstructions([NotNull] InstructionRegistry registry)
        {
            const Int32 SHIFTER_RR_OPCODE = 3;
            const Int32 SHIFTER_RI_OPCODE = 4;

            Tuple <string, Int32>[] shifter_instructions =
            {
                /* (Mnemonic, Function) */
                new Tuple <string, Int32>("sll", 0),
                new Tuple <string, Int32>("srl", 1),
                new Tuple <string, Int32>("sra", 2),
                new Tuple <string, Int32>("rol", 3),
                new Tuple <string, Int32>("ror", 4),
            };

            // Add RR and RI formats for each instruction.
            foreach (var pair in shifter_instructions)
            {
                registry.Register(InstructionDefinitionFactory.CreateRRInstruction(
                                      pair.Item1, SHIFTER_RR_OPCODE, pair.Item2)); // SLL $t0, $t1    :=: $t0 << $t1
                registry.Register(InstructionDefinitionFactory.CreateRIStandardInstruction(
                                      pair.Item1, SHIFTER_RI_OPCODE, pair.Item2)); // SLL $t0, $t1, 8 :=: $t0 = $t1 << 8
                registry.Register(InstructionDefinitionFactory.CreateRIImplicitDestinationInstruction(
                                      pair.Item1, SHIFTER_RI_OPCODE, pair.Item2)); // SLL $t0, 8      :=: $t0 <<= 8
            }
        }
Exemplo n.º 2
0
        // Static Functions ///////////////////////////////////////////////////

        /// <summary>
        ///     Register RR,RI,RI(C) formats of the AND/NAND/OR/NOR/XOR/XNOR/ADD/SUB instructions.
        /// </summary>
        private static void RegisterALUInstructions([NotNull] InstructionRegistry registry)
        {
            const Int32 ALU_RR_OPCODE  = 0;
            const Int32 ALU_RI_OPCODE  = 1;
            const Int32 ALU_RIC_OPCODE = 2;

            Tuple <string, Int32>[] alu_instructions =
            {
                /* (Mnemonic, Function) */
                new Tuple <string, Int32>("and",  0),
                new Tuple <string, Int32>("nand", 1),
                new Tuple <string, Int32>("or",   2),
                new Tuple <string, Int32>("nor",  3),
                new Tuple <string, Int32>("xor",  4),
                new Tuple <string, Int32>("xnor", 5),
                new Tuple <string, Int32>("add",  6),
                new Tuple <string, Int32>("sub",  7),
            };

            // Add RR, RI, and RI(C) formats for each instruction.
            foreach (var pair in alu_instructions)
            {
                registry.Register(InstructionDefinitionFactory.CreateRRInstruction(
                                      pair.Item1, ALU_RR_OPCODE, pair.Item2));        ///////// ADD $t0, $t1     :=: $t0 += $t1
                registry.Register(InstructionDefinitionFactory.CreateRIStandardInstruction(
                                      pair.Item1, ALU_RI_OPCODE, pair.Item2));        ///////// ADD $t0, $t1, 8  :=: $t0 = $t1 + 8
                registry.Register(InstructionDefinitionFactory.CreateRIImplicitDestinationInstruction(
                                      pair.Item1, ALU_RI_OPCODE, pair.Item2));        ///////// ADD $t0, 8       :=: $t0 += 8
                registry.Register(InstructionDefinitionFactory.CreateRIStandardInstruction(
                                      pair.Item1 + 'c', ALU_RIC_OPCODE, pair.Item2)); // ADDC $t0, $t1, 8 :=: if(c) $t0 = $t1 + 8
                registry.Register(InstructionDefinitionFactory.CreateRIImplicitDestinationInstruction(
                                      pair.Item1 + 'c', ALU_RIC_OPCODE, pair.Item2)); // ADDC $t0, 8      :=: if(c) $t0 += 8
            }
        }