Vector mask changes

This commit is contained in:
proshan3
2019-11-22 08:19:23 -05:00
35 changed files with 1839 additions and 430040 deletions

View File

@@ -405,11 +405,11 @@ void Core::fetch()
printTrace(&inst_in_fetch, "Fetch");
// #ifdef PRINT_ACTIVE_THREADS
// for (unsigned j = 0; j < w[schedule_w].tmask.size(); ++j) {
// if (w[schedule_w].activeThreads > j && w[schedule_w].tmask[j]) cout << " 1";
// else cout << " 0";
// if (j != w[schedule_w].tmask.size()-1 || schedule_w != w.size()-1) cout << ',';
// }
for (unsigned j = 0; j < w[schedule_w].tmask.size(); ++j) {
if (w[schedule_w].activeThreads > j && w[schedule_w].tmask[j]) cout << " 1";
else cout << " 0";
if (j != w[schedule_w].tmask.size()-1 || schedule_w != w.size()-1) cout << ',';
}
// #endif
@@ -430,7 +430,7 @@ void Core::decode()
INIT_TRACE(inst_in_fetch);
}
printTrace(&inst_in_decode, "Decode");
//printTrace(&inst_in_decode, "Decode");
}
void Core::scheduler()
@@ -442,7 +442,7 @@ void Core::scheduler()
INIT_TRACE(inst_in_decode);
}
printTrace(&inst_in_scheduler, "scheduler");
//printTrace(&inst_in_scheduler, "scheduler");
}
void Core::load_store()
@@ -496,7 +496,7 @@ void Core::load_store()
if (inst_in_lsu.mem_stall_cycles > 0) inst_in_lsu.mem_stall_cycles--;
printTrace(&inst_in_lsu, "LSU");
//printTrace(&inst_in_lsu, "LSU");
}
void Core::execute_unit()
@@ -548,7 +548,7 @@ void Core::execute_unit()
// }
printTrace(&inst_in_exe, "execute_unit");
//printTrace(&inst_in_exe, "execute_unit");
// INIT_TRACE(inst_in_exe);
}
@@ -604,7 +604,7 @@ void Core::writeback()
// if (!serviced_exe && !serviced_mem) INIT_TRACE(inst_in_wb);
printTrace(&inst_in_wb, "Writeback");
//printTrace(&inst_in_wb, "Writeback");
}
@@ -712,12 +712,12 @@ void Warp::step(trace_inst_t * trace_inst) {
// At Debug Level 3, print debug info after each instruction.
#ifdef USE_DEBUG
if (USE_DEBUG >= 3) {
// #ifdef USE_DEBUG
// if (USE_DEBUG >= 3) {
D(3, "Register state:");
for (unsigned i = 0; i < reg[0].size(); ++i) {
D_RAW(" %r" << setfill(' ') << setw(2) << dec << i << ':');
for (unsigned j = 0; j < reg.size(); ++j)
for (unsigned j = 0; j < (this->activeThreads); ++j)
D_RAW(' ' << setfill('0') << setw(8) << hex << reg[j][i] << setfill(' ') << ' ');
D_RAW('(' << shadowReg[i] << ')' << endl);
}
@@ -729,8 +729,8 @@ void Warp::step(trace_inst_t * trace_inst) {
D_RAW(endl);
D_RAW(endl);
D_RAW(endl);
}
#endif
// }
// #endif
// Clean up.
delete inst;

View File

@@ -219,7 +219,13 @@ Instruction *WordDecoder::decode(const std::vector<Byte> &v, Size &idx, trace_in
imeed = 0 | (bits_10_1 << 1) | (bit_11 << 11) | (bits_19_12 << 12) | (bit_20 << 20);
inst.setSrcImm(signExt(imeed, 20, j_immed_mask));
if (bit_20)
{
imeed |= ~j_immed_mask;
}
// inst.setSrcImm(signExt(imeed, 20, j_immed_mask));
inst.setSrcImm(imeed);
usedImm = true;
trace_inst->valid_inst = true;

View File

@@ -1508,6 +1508,7 @@ void Instruction::executeOn(Warp &c, trace_inst_t * trace_inst) {
case 2:
{
Word VLMAX = (c.vtype.vlmul * c.VLEN)/c.vtype.vsew;
switch(func6){
case 24: //vmandnot
{
@@ -1532,6 +1533,7 @@ void Instruction::executeOn(Warp &c, trace_inst_t * trace_inst) {
*result_ptr = 0;
}
} else if(c.vtype.vsew == 16) {
for(uint16_t i = 0; i < c.vl; i++){
uint16_t *first_ptr = (uint16_t *)vr1[i].val;
@@ -1549,6 +1551,7 @@ void Instruction::executeOn(Warp &c, trace_inst_t * trace_inst) {
*result_ptr = 0;
}
} else if(c.vtype.vsew == 32) {
for(uint32_t i = 0; i < c.vl; i++){
uint32_t *first_ptr = (uint32_t *)vr1[i].val;
@@ -1565,6 +1568,7 @@ void Instruction::executeOn(Warp &c, trace_inst_t * trace_inst) {
uint32_t *result_ptr = (uint32_t *) vd[i].val;
*result_ptr = 0;
}
}
}
break;
@@ -1603,6 +1607,7 @@ void Instruction::executeOn(Warp &c, trace_inst_t * trace_inst) {
uint16_t * result_ptr = (uint16_t *) vd[i].val;
*result_ptr = result;
}
for(uint16_t i = c.vl; i < VLMAX; i++){
uint16_t *result_ptr = (uint16_t *) vd[i].val;
*result_ptr = 0;
@@ -1620,6 +1625,7 @@ void Instruction::executeOn(Warp &c, trace_inst_t * trace_inst) {
uint32_t * result_ptr = (uint32_t *) vd[i].val;
*result_ptr = result;
}
for(Word i = c.vl; i < VLMAX; i++){
uint32_t *result_ptr = (uint32_t *) vd[i].val;
*result_ptr = 0;
@@ -1667,7 +1673,6 @@ void Instruction::executeOn(Warp &c, trace_inst_t * trace_inst) {
result_ptr = (uint16_t *) vd[i].val;
*result_ptr = 0;
}
} else if(c.vtype.vsew == 32) {
uint32_t *result_ptr;
for(uint32_t i = 0; i < c.vl; i++){
@@ -1692,11 +1697,11 @@ void Instruction::executeOn(Warp &c, trace_inst_t * trace_inst) {
case 27: //vmxor
{
D(3, "vmxor");
uint8_t *result_ptr;
vector<Reg<char *>> vr1 = c.vreg[rsrc[0]];
vector<Reg<char *>> vr2 = c.vreg[rsrc[1]];
vector<Reg<char *>> vd = c.vreg[rdest];
if(c.vtype.vsew == 8){
uint8_t *result_ptr;
for(uint8_t i = 0; i < c.vl; i++){
uint8_t *first_ptr = (uint8_t *)vr1[i].val;
uint8_t *second_ptr = (uint8_t *)vr2[i].val;
@@ -1704,7 +1709,6 @@ void Instruction::executeOn(Warp &c, trace_inst_t * trace_inst) {
uint8_t second_value = (*second_ptr & 0x1);
uint8_t result = (first_value ^ second_value);
cout << "Comparing " << *first_ptr << " + " << *second_ptr << " = " << result << '\n';
result_ptr = (uint8_t *) vd[i].val;
*result_ptr = result;
}
@@ -1712,7 +1716,6 @@ void Instruction::executeOn(Warp &c, trace_inst_t * trace_inst) {
result_ptr = (uint8_t *) vd[i].val;
*result_ptr = 0;
}
} else if(c.vtype.vsew == 16) {
uint16_t *result_ptr;
for(uint16_t i = 0; i < c.vl; i++){
@@ -1733,6 +1736,7 @@ void Instruction::executeOn(Warp &c, trace_inst_t * trace_inst) {
} else if(c.vtype.vsew == 32) {
uint32_t *result_ptr;
for(uint32_t i = 0; i < c.vl; i++){
uint32_t *first_ptr = (uint32_t *)vr1[i].val;
uint32_t *second_ptr = (uint32_t *)vr2[i].val;
@@ -1773,7 +1777,6 @@ void Instruction::executeOn(Warp &c, trace_inst_t * trace_inst) {
uint8_t *result_ptr = (uint8_t *) vd[i].val;
*result_ptr = 0;
}
} else if(c.vtype.vsew == 16) {
for(uint16_t i = 0; i < c.vl; i++){
uint16_t *first_ptr = (uint16_t *)vr1[i].val;
@@ -1845,6 +1848,7 @@ void Instruction::executeOn(Warp &c, trace_inst_t * trace_inst) {
uint16_t * result_ptr = (uint16_t *) vd[i].val;
*result_ptr = result;
}
for(uint16_t i = c.vl; i < VLMAX; i++){
uint16_t *result_ptr = (uint16_t *) vd[i].val;
*result_ptr = 0;
@@ -1862,10 +1866,12 @@ void Instruction::executeOn(Warp &c, trace_inst_t * trace_inst) {
uint32_t * result_ptr = (uint32_t *) vd[i].val;
*result_ptr = result;
}
for(Word i = c.vl; i < VLMAX; i++){
uint32_t *result_ptr = (uint32_t *) vd[i].val;
*result_ptr = 0;
}
}
}
break;
@@ -1877,6 +1883,7 @@ void Instruction::executeOn(Warp &c, trace_inst_t * trace_inst) {
vector<Reg<char *>> vd = c.vreg[rdest];
if(c.vtype.vsew == 8){
uint8_t *result_ptr;
for(uint8_t i = 0; i < c.vl; i++){
uint8_t *first_ptr = (uint8_t *)vr1[i].val;
uint8_t *second_ptr = (uint8_t *)vr2[i].val;
@@ -1892,7 +1899,6 @@ void Instruction::executeOn(Warp &c, trace_inst_t * trace_inst) {
result_ptr = (uint8_t *) vd[i].val;
*result_ptr = 0;
}
} else if(c.vtype.vsew == 16) {
for(uint16_t i = 0; i < c.vl; i++){
uint16_t *first_ptr = (uint16_t *)vr1[i].val;
@@ -1927,6 +1933,7 @@ void Instruction::executeOn(Warp &c, trace_inst_t * trace_inst) {
uint32_t *result_ptr = (uint32_t *) vd[i].val;
*result_ptr = 0;
}
}
}
break;
@@ -1934,6 +1941,7 @@ void Instruction::executeOn(Warp &c, trace_inst_t * trace_inst) {
{
D(3, "vmxnor");
uint8_t *result_ptr;
vector<Reg<char *>> vr1 = c.vreg[rsrc[0]];
vector<Reg<char *>> vr2 = c.vreg[rsrc[1]];
vector<Reg<char *>> vd = c.vreg[rdest];
@@ -1953,7 +1961,8 @@ void Instruction::executeOn(Warp &c, trace_inst_t * trace_inst) {
result_ptr = (uint8_t *) vd[i].val;
*result_ptr = 0;
}
} else if(c.vtype.vsew == 16) {
}
else if(c.vtype.vsew == 16) {
uint16_t *result_ptr;
for(uint16_t i = 0; i < c.vl; i++){
uint16_t *first_ptr = (uint16_t *)vr1[i].val;
@@ -1973,6 +1982,7 @@ void Instruction::executeOn(Warp &c, trace_inst_t * trace_inst) {
} else if(c.vtype.vsew == 32) {
uint32_t *result_ptr;
for(uint32_t i = 0; i < c.vl; i++){
uint32_t *first_ptr = (uint32_t *)vr1[i].val;
uint32_t *second_ptr = (uint32_t *)vr2[i].val;
@@ -1988,6 +1998,7 @@ void Instruction::executeOn(Warp &c, trace_inst_t * trace_inst) {
result_ptr = (uint32_t *) vd[i].val;
*result_ptr = 0;
}
}
}
break;