From 574ffce14b33fc59d30aeaefc68be58481d01413 Mon Sep 17 00:00:00 2001 From: cdkersey Date: Thu, 30 Jul 2015 14:38:15 -0600 Subject: [PATCH] Better-working ipdom instructions. --- src/core.cpp | 3 +++ src/include/core.h | 13 +++++-------- src/instruction.cpp | 40 ++++++++++++++++++++++++++-------------- 3 files changed, 34 insertions(+), 22 deletions(-) diff --git a/src/core.cpp b/src/core.cpp index 5413d71a..340416e3 100644 --- a/src/core.cpp +++ b/src/core.cpp @@ -48,6 +48,7 @@ Core::Core(const ArchDef &a, Decoder &d, MemoryUnit &mem, Word id) : } tmask.push_back(true); + shadowTmask.push_back(true); } /* Set initial register contents. */ @@ -153,11 +154,13 @@ bool Core::interrupt(Word r0) { #endif shadowActiveThreads = activeThreads; + shadowTmask = tmask; shadowInterruptEnable = interruptEnable; /* For traps. */ shadowSupervisorMode = supervisorMode; for (Word i = 0; i < reg[0].size(); ++i) shadowReg[i] = reg[0][i]; for (Word i = 0; i < pred[0].size(); ++i) shadowPReg[i] = pred[0][i]; + for (Word i = 0; i < reg.size(); ++i) tmask[i] = 1; shadowPc = pc; activeThreads = 1; diff --git a/src/include/core.h b/src/include/core.h index adf57d46..46e9e791 100644 --- a/src/include/core.h +++ b/src/include/core.h @@ -51,15 +51,12 @@ namespace Harp { // Entry in the IPDOM Stack struct DomStackEntry { DomStackEntry( - unsigned p, const std::vector > >& m, Word pc + unsigned p, const std::vector > >& m, + std::vector &tm, Word pc ): pc(pc), fallThrough(false) { - std::cout << "New DomStackEntry:"; - for (unsigned i = 0; i < m.size(); ++i) { - tmask.push_back(!bool(m[i][p])); - std::cout << ' ' << bool(m[i][p]); - } - std::cout << std::endl; + for (unsigned i = 0; i < m.size(); ++i) + tmask.push_back(!bool(m[i][p]) && tm[i]); } DomStackEntry(const std::vector &tmask): @@ -90,7 +87,7 @@ namespace Harp { std::vector > > reg; std::vector > > pred; - std::vector tmask; + std::vector tmask, shadowTmask; std::stack domStack; std::vector shadowReg; diff --git a/src/instruction.cpp b/src/instruction.cpp index b3fa34c0..8195b220 100644 --- a/src/instruction.cpp +++ b/src/instruction.cpp @@ -138,7 +138,8 @@ void Instruction::executeOn(Core &c) { Size wordSz = c.a.getWordSize(); Word nextPc = c.pc; - bool sjOnce(true); // Has split or joined once already + bool sjOnce(true), // Has not yet split or joined once. + pcSet(false); // PC has already been set for (Size t = 0; t < c.activeThreads; t++) { vector > ®(c.reg[t]); vector > &pReg(c.pred[t]); @@ -219,28 +220,35 @@ void Instruction::executeOn(Core &c) { break; case XORI: reg[rdest] = reg[rsrc[0]] ^ immsrc; break; - case JMPI: nextPc = c.pc + immsrc; + case JMPI: if (!pcSet) nextPc = c.pc + immsrc; + pcSet = true; break; case JALI: reg[rdest] = c.pc; - nextPc = c.pc + immsrc; + if (!pcSet) nextPc = c.pc + immsrc; + pcSet = true; break; case JALR: reg[rdest] = c.pc; - nextPc = reg[rsrc[0]]; + if (!pcSet) nextPc = reg[rsrc[0]]; + pcSet = true; break; - case JMPR: nextPc = reg[rsrc[0]]; + case JMPR: if (!pcSet) nextPc = reg[rsrc[0]]; + pcSet = true; break; case CLONE: c.reg[reg[rsrc[0]]] = reg; break; case JALIS: nextActiveThreads = reg[rsrc[0]]; reg[rdest] = c.pc; - nextPc = c.pc + immsrc; + if (!pcSet) nextPc = c.pc + immsrc; + pcSet = true; break; case JALRS: nextActiveThreads = reg[rsrc[0]]; reg[rdest] = c.pc; - nextPc = reg[rsrc[1]]; + if (!pcSet) nextPc = reg[rsrc[1]]; + pcSet = true; break; case JMPRT: nextActiveThreads = 1; - nextPc = reg[rsrc[0]]; + if (!pcSet) nextPc = reg[rsrc[0]]; + pcSet = true; break; case LD: memAddr = reg[rsrc[0]] + immsrc; #ifdef EMU_INSTRUMENTATION @@ -279,11 +287,13 @@ void Instruction::executeOn(Core &c) { case TRAP: c.interrupt(0); break; case JMPRU: c.supervisorMode = false; - nextPc = reg[rsrc[0]]; + if (!pcSet) nextPc = reg[rsrc[0]]; + pcSet = true; break; case SKEP: c.interruptEntry = reg[rsrc[0]]; break; case RETI: if (t == 0) { + c.tmask = c.shadowTmask; nextActiveThreads = c.shadowActiveThreads; c.interruptEnable = c.shadowInterruptEnable; c.supervisorMode = c.shadowSupervisorMode; @@ -291,7 +301,7 @@ void Instruction::executeOn(Core &c) { reg[i] = c.shadowReg[i]; for (unsigned i = 0; i < pReg.size(); ++i) pReg[i] = c.shadowPReg[i]; - nextPc = c.shadowPc; + if (!pcSet) nextPc = c.shadowPc; } break; case ITOF: reg[rdest] = Float(double(Word_s(reg[rsrc[0]])), wordSz); @@ -316,18 +326,20 @@ void Instruction::executeOn(Core &c) { case SPLIT: if (sjOnce) { sjOnce = false; // TODO: if mask becomes all-zero, fall through - DomStackEntry e(pred, c.pred, c.pc); + DomStackEntry e(pred, c.pred, c.tmask, c.pc); c.domStack.push(c.tmask); c.domStack.push(e); for (unsigned i = 0; i < e.tmask.size(); ++i) - c.tmask[i] = !e.tmask[i]; + c.tmask[i] = !e.tmask[i] && c.tmask[i]; } break; case JOIN: if (sjOnce) { sjOnce = false; // TODO: if mask becomes all-zero, fall through - if (!c.domStack.top().fallThrough) - nextPc = c.domStack.top().pc; + if (!c.domStack.top().fallThrough) { + if (!pcSet) nextPc = c.domStack.top().pc; + pcSet = true; + } c.tmask = c.domStack.top().tmask; c.domStack.pop(); }