void testConditionalMove(){ registers[0] = 1; registers[1] = 10; registers[2] = 11; conditionalMove(registers, 0, 1, 2); registers[3] = 2000; registers[4] = 5555; registers[5] = 0; conditionalMove(registers, 3, 4, 5); printf("Output Move: \n"); printf("Expected in %d: %d ", 0, 10); printf("Expected in %d: %d\n", 3, 2000); for(int i = 0; i < numReg; i++){ printf("Index %d: %u\n", i, registers[i]); } }
/* * Executes the Instruction based on the opcode. */ static inline void execute_instruction(Instruction instr){ switch(instr.op) { case MOVE:{ conditionalMove(registers, instr.reg1, instr.reg2, instr.reg3); programCounter++; break; } case SEGLOAD:{ UM_Word ID = registers[instr.reg2]; UM_Word offset = registers[instr.reg3]; UM_Word toStore = segmentedLoad(memorySegments, ID, offset); registers[instr.reg1] = toStore; programCounter++; break; } case SEGSTORE:{ UM_Word ID = registers[instr.reg1]; UM_Word offset = registers[instr.reg2]; UM_Word value = registers[instr.reg3]; segmentedStore(memorySegments, ID, offset, value); programCounter++; break; } case ADD:{ addition(registers, instr.reg1, instr.reg2, instr.reg3); programCounter++; break; } case MULTIPLY:{ multiplication(registers, instr.reg1, instr.reg2, instr.reg3); programCounter++; break; } case DIVIDE:{ division(registers, instr.reg1, instr.reg2, instr.reg3); programCounter++; break; } case NAND:{ bitwiseNAND(registers, instr.reg1, instr.reg2, instr.reg3); programCounter++; break; } case HALT: { programCounter = 0; break; } case MAP:{ UM_Word length = registers[instr.reg3]; registers[instr.reg2] = mapSegment(memorySegments, length); programCounter++; break; } case UNMAP:{ UM_Word ID = registers[instr.reg3]; unmapSegment(memorySegments, ID); programCounter++; break; } case OUTPUT:{ output(registers, instr.reg3); programCounter++; break; } case INPUT:{ input(registers, instr.reg3); programCounter++; break; } case LOADPROG:{ UM_Word ID = registers[instr.reg2]; if(ID != 0){ loadProgram(memorySegments, ID); numInstructions = instructionLength(memorySegments); //programPointer = getInstructions(memorySegments); } programCounter = registers[instr.reg3]; break; } case LOADVAL:{ registers[instr.reg1] = instr.value; programCounter++; break; } } }
static void CNDGT(State &state, const ControlFlowInst &cf, const AluInst &alu) { conditionalMove(state, cf, alu, " > "); }