diff --git a/src/instruction.cpp b/src/instruction.cpp index 68a4febf..86f10695 100644 --- a/src/instruction.cpp +++ b/src/instruction.cpp @@ -187,6 +187,9 @@ void Instruction::executeOn(Core &c) { case NEG: reg[rdest] = -(Word_s)reg[rsrc[0]]; reg[rdest].trunc(wordSz); break; + case NOT: reg[rdest] = ~(Word_s)reg[rsrc[0]]; + reg[rdest].trunc(wordSz); + break; case ADDI: reg[rdest] = reg[rsrc[0]] + immsrc; reg[rdest].trunc(wordSz); break; @@ -218,6 +221,9 @@ void Instruction::executeOn(Core &c) { case JALI: reg[rdest] = c.pc; c.pc += immsrc; break; + case JALR: reg[rdest] = c.pc; + c.pc = reg[rsrc[0]]; + break; case JMPR: c.pc = reg[rsrc[0]]; break; case CLONE: c.reg[reg[rsrc[0]]] = reg; @@ -226,6 +232,10 @@ void Instruction::executeOn(Core &c) { reg[rdest] = c.pc; c.pc += immsrc; break; + case JALRS: nextActiveThreads = reg[rsrc[0]]; + reg[rdest] = c.pc; + c.pc = reg[rsrc[0]]; + break; case JMPRT: nextActiveThreads = 1; c.pc = reg[rsrc[0]]; break; @@ -256,6 +266,8 @@ void Instruction::executeOn(Core &c) { break; case ORP: pReg[pdest] = pReg[psrc[0]] | pReg[psrc[1]]; break; + case XORP: pReg[pdest] = pReg[psrc[0]] != pReg[psrc[1]]; + break; case ISNEG: pReg[pdest] = (1ll<<(wordSz*8 - 1))®[rsrc[0]]; break; case HALT: c.activeThreads = 0;