Merge pull request #189 from KevinRamharak/possible-implementation-aliases

add implementation for instruction aliases
This commit is contained in:
Simon Fortier 2019-01-21 19:55:17 -05:00 committed by GitHub
commit a768cf0f4b
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -4,6 +4,7 @@ import net.simon987.server.assembly.instruction.*;
import net.simon987.server.logging.LogManager; import net.simon987.server.logging.LogManager;
import java.util.HashMap; import java.util.HashMap;
import java.util.Map;
/** /**
* Default instruction set for the CPU * Default instruction set for the CPU
@ -13,7 +14,12 @@ public class DefaultInstructionSet implements InstructionSet {
/** /**
* Map of instructions, stored in opcode : Instruction format * Map of instructions, stored in opcode : Instruction format
*/ */
private HashMap<Integer, Instruction> instructionMap = new HashMap<>(32); private Map<Integer, Instruction> instructionMap = new HashMap<>(32);
/**
* Map of aliasses, stored in mnemonic : Instruction format
*/
private Map<String, Instruction> aliasesMap = new HashMap<>(16);
private Instruction defaultInstruction; private Instruction defaultInstruction;
@ -32,7 +38,6 @@ public class DefaultInstructionSet implements InstructionSet {
add(new AndInstruction()); add(new AndInstruction());
add(new OrInstruction()); add(new OrInstruction());
add(new ShlInstruction()); add(new ShlInstruction());
add(new SalInstruction()); //Alias is added
add(new ShrInstruction()); add(new ShrInstruction());
add(new XorInstruction()); add(new XorInstruction());
add(new TestInstruction()); add(new TestInstruction());
@ -46,6 +51,9 @@ public class DefaultInstructionSet implements InstructionSet {
add(new SarInstruction()); add(new SarInstruction());
add(new IncInstruction()); add(new IncInstruction());
add(new DecInstruction()); add(new DecInstruction());
// aliases
add(new SalInstruction());
} }
/** /**
@ -86,16 +94,22 @@ public class DefaultInstructionSet implements InstructionSet {
} }
} }
Instruction aliasedInstruction = aliasesMap.get(mnemonic.toLowerCase());
if (aliasedInstruction != null) {
return aliasedInstruction;
}
return null; return null;
} }
@Override @Override
public void add(Instruction instruction) { public void add(Instruction instruction) {
if (instructionMap.containsKey(instruction.getOpCode())) { Instruction aliasedInstruction = instructionMap.get(instruction.getOpCode());
LogManager.LOGGER.fine(instruction.getMnemonic() + " instruction is an alias for " + if (aliasedInstruction != null) {
instructionMap.get(instruction.getOpCode()).getMnemonic()); aliasesMap.put(instruction.getMnemonic(), aliasedInstruction);
} else {
instructionMap.put(instruction.getOpCode(), instruction);
} }
instructionMap.put(instruction.getOpCode(), instruction);
} }
} }