SimX split.N fix

This commit is contained in:
Blaise Tine 2024-08-28 21:10:05 -07:00
parent 0f41774fea
commit a38960674e
4 changed files with 31 additions and 15 deletions

View file

@ -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";

View file

@ -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;

View file

@ -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);

View file

@ -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,