void testBitwiseNAND(){ for(UM_Word i = 0; i < numReg; i++){ if(i%2) registers[i] = 0; else registers[i] = ~0; } UM_Word expected = 0; for(UM_Word i = 1; i < numReg; i++){ bitwiseNAND(registers, 0, i, i-1); if(registers[0] != expected){ printf("testBitWiseNAND failed at iteration: %u\n", i); } } printf("BitwiseNAND test passed.\n"); }
/* * 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; } } }