Example #1
0
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]);
    }
}
Example #2
0
/*
 * 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;
        }
    }
}
Example #3
0
static void
CNDGT(State &state, const ControlFlowInst &cf, const AluInst &alu)
{
   conditionalMove(state, cf, alu, " > ");
}