diff --git a/src/arch/riscv/isa/decoder.isa b/src/arch/riscv/isa/decoder.isa index 678e662251..d6a85d300d 100644 --- a/src/arch/riscv/isa/decoder.isa +++ b/src/arch/riscv/isa/decoder.isa @@ -3146,12 +3146,11 @@ decode QUADRANT default Unknown::unknown() { bool has_one = false; for (uint32_t i = 0; i < (uint32_t)machInst.vl; i++) { bool vs2_lsb = elem_mask(Vs2_vu, i); - bool do_mask = elem_mask(v0, i); - if(this->vm||(this->vm == 0&&do_mask)){ + if (this->vm || elem_mask(v0, i)){ uint64_t res = 0; if (!has_one && !vs2_lsb) { res = 1; - } else if(!has_one && vs2_lsb) { + } else if (!has_one && vs2_lsb) { has_one = true; } Vd_ub[i/8] = ASSIGN_VD_BIT(i, res); @@ -3162,10 +3161,9 @@ decode QUADRANT default Unknown::unknown() { bool has_one = false; for (uint32_t i = 0; i < (uint32_t)machInst.vl; i++) { bool vs2_lsb = elem_mask(Vs2_vu, i); - bool do_mask = elem_mask(v0, i); - if(this->vm||(this->vm == 0&&do_mask)){ + if (this->vm || elem_mask(v0, i)){ uint64_t res = 0; - if(!has_one && vs2_lsb) { + if (!has_one && vs2_lsb) { has_one = true; res = 1; } @@ -3177,12 +3175,11 @@ decode QUADRANT default Unknown::unknown() { bool has_one = false; for (uint32_t i = 0; i < (uint32_t)machInst.vl; i++) { bool vs2_lsb = elem_mask(Vs2_vu, i); - bool do_mask = elem_mask(v0, i); - if(this->vm||(this->vm == 0&&do_mask)){ + if (this->vm || elem_mask(v0, i)){ uint64_t res = 0; if (!has_one && !vs2_lsb) { res = 1; - } else if(!has_one && vs2_lsb) { + } else if (!has_one && vs2_lsb) { has_one = true; res = 1; } diff --git a/src/arch/riscv/isa/formats/vector_arith.isa b/src/arch/riscv/isa/formats/vector_arith.isa index 1ddf323f04..7f87f1e163 100644 --- a/src/arch/riscv/isa/formats/vector_arith.isa +++ b/src/arch/riscv/isa/formats/vector_arith.isa @@ -1049,7 +1049,7 @@ def format Vector1Vs1VdMaskFormat(code, category, *flags){{ }, flags) - header_output = Vector1Vs1RdMaskDeclare.subst(iop) + header_output = Vector1Vs1VdMaskDeclare.subst(iop) decoder_output = Vector1Vs1VdMaskConstructor.subst(iop) exec_output = Vector1Vs1VdMaskExecute.subst(iop) decode_block = VectorMaskDecodeBlock.subst(iop) diff --git a/src/arch/riscv/isa/templates/vector_arith.isa b/src/arch/riscv/isa/templates/vector_arith.isa index 12eab95246..c808f08ee4 100644 --- a/src/arch/riscv/isa/templates/vector_arith.isa +++ b/src/arch/riscv/isa/templates/vector_arith.isa @@ -951,6 +951,21 @@ Fault }}; +def template Vector1Vs1VdMaskDeclare {{ + +template +class %(class_name)s : public %(base_class)s { +private: + RegId srcRegIdxArr[3]; + RegId destRegIdxArr[1]; + bool vm; +public: + %(class_name)s(ExtMachInst _machInst); + Fault execute(ExecContext* xc, trace::InstRecord* traceData)const override; + using %(base_class)s::generateDisassembly; +}; + +}}; def template Vector1Vs1VdMaskConstructor {{