/// <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 }
/// <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 } }
/// <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) } }