Ejemplo n.º 1
0
        /// <summary>
        ///     Register the LI/LIC/LA/LAC/MOV/MOVC pseudo instructions.
        /// </summary>
        private static void RegisterDataTransferPseudoInstructions([NotNull] InstructionRegistry registry)
        {
            // LI $t0, 8 :=: $t0 = 8
            registry.Register(
                InstructionDefinitionFactory.CreateRISourceRegisterUnusedInstruction(
                    "li", 1, 2)); // OR $t0, $zero, 8

            // LIC $t0, 8 :=: if(c) $t0 = 8
            registry.Register(
                InstructionDefinitionFactory.CreateRISourceRegisterUnusedInstruction(
                    "lic", 2, 2)); // ORC $t0, $zero, 8

            // LA $t0, 8 :=: $t0 = 8
            registry.Register(
                InstructionDefinitionFactory.CreateRISourceRegisterUnusedInstruction(
                    "la", 1, 2)); // OR $t0, $zero, 8

            // LAC $t0, 8 :=: if(c) $t0 = 8
            registry.Register(
                InstructionDefinitionFactory.CreateRISourceRegisterUnusedInstruction(
                    "lac", 2, 2)); // ORC $t0, $zero, 8

            // MOV $t0, $t1 :=: $t0 = $t1
            registry.Register(
                InstructionDefinitionFactory.CreateRRInstruction(
                    "la", 1, 2)); // OR $t0, $t1, 0

            // MOVC $t0, $t1 :=: if(c) $t0 = $t1
            registry.Register(
                InstructionDefinitionFactory.CreateRRInstruction(
                    "lac", 2, 2)); // ORC $t0, $t1, 0
        }
Ejemplo n.º 2
0
        /// <summary>
        ///     Register: Register address, Immediate address, and Base-Offset addressing formats of the SB/SH instructions.
        /// </summary>
        private static void RegisterMemoryStoreInstructions([NotNull] InstructionRegistry registry)
        {
            const Int32 MEMORY_STORE_OPCODE = 8;

            Tuple <string, Int32>[] memory_store_instructions =
            {
                /* (Mnemonic, Function) */
                new Tuple <string, Int32>("sb", 7),
                new Tuple <string, Int32>("sh", 6),
            };

            // Add Register, Immediate, and BaseOffset formats for each instruction.
            foreach (var pair in memory_store_instructions)
            {
                registry.Register(InstructionDefinitionFactory.CreateRRInstruction(
                                      pair.Item1, MEMORY_STORE_OPCODE, pair.Item2)); // SH $t0, $t1       :=: *($t1) = $t0
                registry.Register(InstructionDefinitionFactory.CreateRISourceRegisterUnusedInstruction(
                                      pair.Item1, MEMORY_STORE_OPCODE, pair.Item2)); // SH $t0, 0xFF      :=: *(0xFF) = $t0
                registry.Register(InstructionDefinitionFactory.CreateBaseOffsetInstruction(
                                      pair.Item1, MEMORY_STORE_OPCODE, pair.Item2)); // SH $t0, 0xFF($t1) :=: *($t1 + 0xFF) = $t0
            }
        }
Ejemplo n.º 3
0
        /// <summary>
        ///     Register: Register address, Immediate address, and Base-Offset addressing formats of the LB/LBU/LH instructions.
        /// </summary>
        private static void RegisterMemoryLoadInstructions([NotNull] InstructionRegistry registry)
        {
            const Int32 MEMORY_LOAD_OPCODE = 7;

            Tuple <string, Int32>[] memory_load_instructions =
            {
                /* (Mnemonic, Function) */
                new Tuple <string, Int32>("lb",  3),
                new Tuple <string, Int32>("lbu", 4),
                new Tuple <string, Int32>("lh",  1),
            };

            // Add Register, Immediate, and BaseOffset formats for each instruction.
            foreach (var pair in memory_load_instructions)
            {
                registry.Register(InstructionDefinitionFactory.CreateRRInstruction(
                                      pair.Item1, MEMORY_LOAD_OPCODE, pair.Item2)); // LH $t0, $t1       :=: $t0 = *($t1)
                registry.Register(InstructionDefinitionFactory.CreateRISourceRegisterUnusedInstruction(
                                      pair.Item1, MEMORY_LOAD_OPCODE, pair.Item2)); // LH $t0, 0xFF      :=: $t0 = *(0xFF)
                registry.Register(InstructionDefinitionFactory.CreateBaseOffsetInstruction(
                                      pair.Item1, MEMORY_LOAD_OPCODE, pair.Item2)); // LH $t0, 0xFF($t1) :=: $t0 = *($t1 + 0xFF)
            }
        }