mirror of
https://github.com/vortexgpgpu/vortex.git
synced 2025-04-23 21:39:10 -04:00
SimX split.N fix
This commit is contained in:
parent
0f41774fea
commit
a38960674e
4 changed files with 31 additions and 15 deletions
|
@ -86,7 +86,7 @@ static const char* op_string(const Instr &instr) {
|
|||
auto func3 = instr.getFunc3();
|
||||
auto func7 = instr.getFunc7();
|
||||
auto rd = instr.getRDest();
|
||||
auto rs2 = instr.getRSrc(1);
|
||||
auto rs1 = instr.getRSrc(1);
|
||||
auto imm = instr.getImm();
|
||||
|
||||
switch (opcode) {
|
||||
|
@ -343,7 +343,7 @@ static const char* op_string(const Instr &instr) {
|
|||
std::abort();
|
||||
}
|
||||
case 0x60:
|
||||
switch (rs2) {
|
||||
switch (rs1) {
|
||||
case 0: return "FCVT.W.S";
|
||||
case 1: return "FCVT.WU.S";
|
||||
case 2: return "FCVT.L.S";
|
||||
|
@ -352,7 +352,7 @@ static const char* op_string(const Instr &instr) {
|
|||
std::abort();
|
||||
}
|
||||
case 0x61:
|
||||
switch (rs2) {
|
||||
switch (rs1) {
|
||||
case 0: return "FCVT.W.D";
|
||||
case 1: return "FCVT.WU.D";
|
||||
case 2: return "FCVT.L.D";
|
||||
|
@ -361,7 +361,7 @@ static const char* op_string(const Instr &instr) {
|
|||
std::abort();
|
||||
}
|
||||
case 0x68:
|
||||
switch (rs2) {
|
||||
switch (rs1) {
|
||||
case 0: return "FCVT.S.W";
|
||||
case 1: return "FCVT.S.WU";
|
||||
case 2: return "FCVT.S.L";
|
||||
|
@ -370,7 +370,7 @@ static const char* op_string(const Instr &instr) {
|
|||
std::abort();
|
||||
}
|
||||
case 0x69:
|
||||
switch (rs2) {
|
||||
switch (rs1) {
|
||||
case 0: return "FCVT.D.W";
|
||||
case 1: return "FCVT.D.WU";
|
||||
case 2: return "FCVT.D.L";
|
||||
|
@ -395,7 +395,7 @@ static const char* op_string(const Instr &instr) {
|
|||
switch (func3) {
|
||||
case 0: return "TMC";
|
||||
case 1: return "WSPAWN";
|
||||
case 2: return rs2 ? "SPLIT.N" : "SPLIT";
|
||||
case 2: return rs1 ? "SPLIT.N" : "SPLIT";
|
||||
case 3: return "JOIN";
|
||||
case 4: return "BAR";
|
||||
case 5: return rd ? "PRED.N" : "PRED";
|
||||
|
|
|
@ -162,10 +162,8 @@ instr_trace_t* Emulator::step() {
|
|||
uint64_t uuid = 0;
|
||||
#endif
|
||||
|
||||
DPH(1, "Fetch: cid=" << core_->id() << ", wid=" << scheduled_warp << ", tmask=");
|
||||
for (uint32_t i = 0, n = arch_.num_threads(); i < n; ++i)
|
||||
DPN(1, warp.tmask.test(i));
|
||||
DPN(1, ", PC=0x" << std::hex << warp.PC << " (#" << std::dec << uuid << ")" << std::endl);
|
||||
DP(1, "Fetch: cid=" << core_->id() << ", wid=" << scheduled_warp << ", tmask=" << ThreadMaskOS(warp.tmask, arch_.num_threads())
|
||||
<< ", PC=0x" << std::hex << warp.PC << " (#" << std::dec << uuid << ")");
|
||||
|
||||
// Fetch
|
||||
uint32_t instr_code = 0;
|
||||
|
|
|
@ -1328,7 +1328,7 @@ void Emulator::execute(const Instr &instr, uint32_t wid, instr_trace_t *trace) {
|
|||
auto stack_size = warp.ipdom_stack.size();
|
||||
|
||||
ThreadMask then_tmask, else_tmask;
|
||||
auto not_pred = rsrc2 & 0x1;
|
||||
auto not_pred = (rsrc1 != 0);
|
||||
for (uint32_t t = 0; t < num_threads; ++t) {
|
||||
auto cond = (warp.ireg_file.at(t).at(rsrc0) & 0x1) ^ not_pred;
|
||||
then_tmask[t] = warp.tmask.test(t) && cond;
|
||||
|
@ -1472,10 +1472,7 @@ void Emulator::execute(const Instr &instr, uint32_t wid, instr_trace_t *trace) {
|
|||
}
|
||||
|
||||
if (warp.tmask != next_tmask) {
|
||||
DPH(3, "*** New Tmask=");
|
||||
for (uint32_t i = 0; i < num_threads; ++i)
|
||||
DPN(3, next_tmask.test(i));
|
||||
DPN(3, std::endl);
|
||||
DP(3, "*** New Tmask=" << ThreadMaskOS(next_tmask, num_threads));
|
||||
warp.tmask = next_tmask;
|
||||
if (!next_tmask.any()) {
|
||||
active_warps_.reset(wid);
|
||||
|
|
|
@ -58,6 +58,27 @@ typedef std::bitset<MAX_NUM_WARPS> WarpMask;
|
|||
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
class ThreadMaskOS {
|
||||
public:
|
||||
ThreadMaskOS(const ThreadMask& mask, int size)
|
||||
: mask_(mask)
|
||||
, size_(size)
|
||||
{}
|
||||
|
||||
friend std::ostream& operator<<(std::ostream& os, const ThreadMaskOS& wrapper) {
|
||||
for (int i = 0; i < wrapper.size_; ++i) {
|
||||
os << wrapper.mask_[i];
|
||||
}
|
||||
return os;
|
||||
}
|
||||
|
||||
private:
|
||||
const ThreadMask& mask_;
|
||||
int size_;
|
||||
};
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
enum class RegType {
|
||||
None,
|
||||
Integer,
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue