diff --git a/src/core.cpp b/src/core.cpp index 8bdf0a0c..c6c95625 100644 --- a/src/core.cpp +++ b/src/core.cpp @@ -36,6 +36,7 @@ Core::Core(const ArchDef &a, Decoder &d, MemoryUnit &mem, Word id): w.push_back(Warp(this)); w[0].activeThreads = 1; + w[0].spawned = true; } bool Core::interrupt(Word r0) { @@ -61,7 +62,8 @@ bool Core::running() const { Warp::Warp(Core *c, Word id) : core(c), pc(0), interruptEnable(false), supervisorMode(true), activeThreads(0), reg(0), pred(0), - shadowReg(core->a.getNRegs()), shadowPReg(core->a.getNPRegs()), id(id) + shadowReg(core->a.getNRegs()), shadowPReg(core->a.getNPRegs()), id(id), + spawned(false) { /* Build the register file. */ Word regNum(0); diff --git a/src/include/core.h b/src/include/core.h index 4f4b50dc..01c16634 100644 --- a/src/include/core.h +++ b/src/include/core.h @@ -115,7 +115,7 @@ namespace Harp { std::vector shadowPReg; bool interruptEnable, shadowInterruptEnable, supervisorMode, - shadowSupervisorMode; + shadowSupervisorMode, spawned; friend class Instruction; }; diff --git a/src/instruction.cpp b/src/instruction.cpp index 2dc114af..0d6fe8d2 100644 --- a/src/instruction.cpp +++ b/src/instruction.cpp @@ -349,11 +349,12 @@ void Instruction::executeOn(Warp &c) { D(0, "Spawning a new warp."); for (unsigned i = 0; i < c.core->w.size(); ++i) { Warp &newWarp(c.core->w[i]); - if (newWarp.activeThreads == 0) { + if (newWarp.spawned == false) { newWarp.pc = reg[rsrc[0]]; newWarp.reg[0][rdest] = reg[rsrc[1]]; newWarp.activeThreads = 1; newWarp.supervisorMode = false; + newWarp.spawned = true; break; } }