const VectorMask& mask)
{
assert(mask.count());
- reconvergenceStack.emplace(new ReconvergenceStackEntry(pc, rpc, mask));
+ reconvergenceStack.emplace_back(new ReconvergenceStackEntry{pc, rpc, mask});
}
void
execMask().to_string<char, std::string::traits_type,
std::string::allocator_type>().c_str(), pc());
- reconvergenceStack.pop();
+ reconvergenceStack.pop_back();
DPRINTF(WavefrontStack, "%3i %s\n", pc(),
execMask().to_string<char, std::string::traits_type,
uint32_t
Wavefront::pc() const
{
- return reconvergenceStack.top()->pc;
+ return reconvergenceStack.back()->pc;
}
uint32_t
Wavefront::rpc() const
{
- return reconvergenceStack.top()->rpc;
+ return reconvergenceStack.back()->rpc;
}
VectorMask
Wavefront::execMask() const
{
- return reconvergenceStack.top()->execMask;
+ return reconvergenceStack.back()->execMask;
}
bool
Wavefront::execMask(int lane) const
{
- return reconvergenceStack.top()->execMask[lane];
+ return reconvergenceStack.back()->execMask[lane];
}
void
Wavefront::pc(uint32_t new_pc)
{
- reconvergenceStack.top()->pc = new_pc;
+ reconvergenceStack.back()->pc = new_pc;
}
uint32_t
static const int MAX_NUM_INSTS_PER_WF = 12;
+/**
+ * A reconvergence stack entry conveys the necessary state to implement
+ * control flow divergence.
+ */
+struct ReconvergenceStackEntry {
+ /**
+ * PC of current instruction.
+ */
+ uint32_t pc;
+ /**
+ * PC of the immediate post-dominator instruction, i.e., the value of
+ * @a pc for the first instruction that will be executed by the wavefront
+ * when a reconvergence point is reached.
+ */
+ uint32_t rpc;
+ /**
+ * Execution mask.
+ */
+ VectorMask execMask;
+};
+
/*
* Arguments for the hsail opcode call, are user defined and variable length.
* The hardware/finalizer can support arguments in hardware or use memory to
}
};
-/**
- * A reconvergence stack entry conveys the necessary state to implement
- * control flow divergence.
- */
-class ReconvergenceStackEntry {
-
- public:
- ReconvergenceStackEntry(uint32_t new_pc, uint32_t new_rpc,
- VectorMask new_mask) : pc(new_pc), rpc(new_rpc),
- execMask(new_mask) {
- }
-
- /**
- * PC of current instruction.
- */
- uint32_t pc;
- /**
- * PC of the immediate post-dominator instruction, i.e., the value of
- * @a pc for the first instruction that will be executed by the wavefront
- * when a reconvergence point is reached.
- */
- uint32_t rpc;
- /**
- * Execution mask.
- */
- VectorMask execMask;
-};
-
class Wavefront : public SimObject
{
public:
* point (branch instruction), and shrinks every time the wavefront
* reaches a reconvergence point (immediate post-dominator instruction).
*/
- std::stack<std::unique_ptr<ReconvergenceStackEntry>> reconvergenceStack;
+ std::deque<std::unique_ptr<ReconvergenceStackEntry>> reconvergenceStack;
};
#endif // __WAVEFRONT_HH__