128 lines
3.4 KiB
Java
128 lines
3.4 KiB
Java
package processor.pipeline;
|
|
import processor.Processor;
|
|
import generic.Instruction;
|
|
import generic.Instruction.OperationType;
|
|
import generic.Simulator;
|
|
import generic.Operand.OperandType;
|
|
|
|
public class Execute {
|
|
Processor containingProcessor;
|
|
OF_EX_LatchType OF_EX_Latch;
|
|
EX_MA_LatchType EX_MA_Latch;
|
|
EX_IF_LatchType EX_IF_Latch;
|
|
|
|
public Execute(Processor containingProcessor, OF_EX_LatchType oF_EX_Latch, EX_MA_LatchType eX_MA_Latch, EX_IF_LatchType eX_IF_Latch)
|
|
{
|
|
this.containingProcessor = containingProcessor;
|
|
this.OF_EX_Latch = oF_EX_Latch;
|
|
this.EX_MA_Latch = eX_MA_Latch;
|
|
this.EX_IF_Latch = eX_IF_Latch;
|
|
}
|
|
|
|
public void performEX()
|
|
{
|
|
//TODO
|
|
if(OF_EX_Latch.isEX_enable())
|
|
{
|
|
int op1 = OF_EX_Latch.getOp1();
|
|
int op2 = OF_EX_Latch.getOp2();
|
|
int imm = OF_EX_Latch.getImm();
|
|
Instruction instruction = OF_EX_Latch.getInstruction();
|
|
int cur_pc = containingProcessor.getRegisterFile().getProgramCounter();
|
|
int alu_result = 0;
|
|
OperationType alu_op = OF_EX_Latch.getInstruction().getOperationType();
|
|
switch(alu_op)
|
|
{
|
|
case add: alu_result = op1 + op2; break;
|
|
case addi: alu_result = op1 + imm; break;
|
|
case sub: alu_result = op1 - op2; break;
|
|
case subi: alu_result = op1 - imm; break;
|
|
case mul: alu_result = op1 * op2; break;
|
|
case muli: alu_result = op1 * imm; break;
|
|
case div: alu_result = op1 / op2; break;
|
|
case divi: alu_result = op1 / imm; break;
|
|
case and: alu_result = op1 & op2; break;
|
|
case andi: alu_result = op1 & imm; break;
|
|
case or: alu_result = op1 | op2; break;
|
|
case ori: alu_result = op1 | imm; break;
|
|
case xor: alu_result = op1 ^ op2; break;
|
|
case xori: alu_result = op1 ^ imm; break;
|
|
case slt: alu_result= (op1 < op2) ? 1 : 0; break;
|
|
case slti: alu_result= (op1 < imm) ? 1 : 0; break;
|
|
case sll: alu_result = op1 << op2; break;
|
|
case slli: alu_result = op1 << imm; break;
|
|
case srl: alu_result = op1 >>> op2; break;
|
|
case srli: alu_result = op1 >>> imm; break;
|
|
case sra: alu_result = op1 >> op2; break;
|
|
case srai: alu_result = op1 >> imm; break;
|
|
case jmp:
|
|
{
|
|
OperandType optype = instruction.getDestinationOperand().getOperandType();
|
|
if (optype == OperandType.Register){
|
|
imm = containingProcessor.getRegisterFile().getValue(
|
|
instruction.getDestinationOperand().getValue());
|
|
}
|
|
else{
|
|
imm = OF_EX_Latch.getImm();
|
|
}
|
|
alu_result = cur_pc + imm;
|
|
EX_IF_Latch.setIF_enable(true);
|
|
EX_IF_Latch.setPC(alu_result);
|
|
}
|
|
break;
|
|
case beq:
|
|
{
|
|
if(op1 == op2)
|
|
{
|
|
alu_result = cur_pc + imm;
|
|
EX_IF_Latch.setIF_enable(true);
|
|
EX_IF_Latch.setPC(alu_result);
|
|
}
|
|
}
|
|
break;
|
|
case bne:
|
|
{
|
|
if(op1 != op2)
|
|
{
|
|
alu_result = cur_pc + imm;
|
|
EX_IF_Latch.setIF_enable(true);
|
|
EX_IF_Latch.setPC(alu_result);
|
|
}
|
|
}
|
|
break;
|
|
case blt:
|
|
{
|
|
if(op1 < op2)
|
|
{
|
|
alu_result = cur_pc + imm;
|
|
EX_IF_Latch.setIF_enable(true);
|
|
EX_IF_Latch.setPC(alu_result);
|
|
}
|
|
}
|
|
break;
|
|
case bgt:
|
|
{
|
|
if(op1 > op2)
|
|
{
|
|
alu_result = cur_pc + imm;
|
|
EX_IF_Latch.setIF_enable(true);
|
|
EX_IF_Latch.setPC(alu_result);
|
|
}
|
|
}
|
|
break;
|
|
case end:
|
|
{
|
|
Simulator.setSimulationComplete(true);
|
|
}
|
|
default:
|
|
break;
|
|
|
|
}
|
|
EX_MA_Latch.setALUResult(alu_result);
|
|
EX_MA_Latch.setInstruction(OF_EX_Latch.getInstruction());
|
|
EX_MA_Latch.setMA_enable(true);
|
|
OF_EX_Latch.setEX_enable(false);
|
|
}
|
|
}
|
|
}
|