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