17f2b7720SXuan Hupackage xiangshan.backend.decode 27f2b7720SXuan Hu 37f2b7720SXuan Huimport chipsalliance.rocketchip.config.Parameters 47f2b7720SXuan Huimport chisel3._ 57f2b7720SXuan Huimport chisel3.util._ 67f2b7720SXuan Huimport freechips.rocketchip.util.uintToBitPat 77f2b7720SXuan Huimport utils._ 87f2b7720SXuan Huimport xiangshan.ExceptionNO.illegalInstr 97f2b7720SXuan Huimport xiangshan._ 107f2b7720SXuan Huimport freechips.rocketchip.rocket.Instructions._ 117f2b7720SXuan Hu 127f2b7720SXuan Huabstract class VecType { 137f2b7720SXuan Hu def X = BitPat("b?") 147f2b7720SXuan Hu def N = BitPat("b0") 157f2b7720SXuan Hu def Y = BitPat("b1") 167f2b7720SXuan Hu def generate() : List[BitPat] 177f2b7720SXuan Hu def asOldDecodeOutput(): List[BitPat] = { 187f2b7720SXuan Hu val src1::src2::src3::fu::fuOp::xWen::fWen::vWen::mWen::xsTrap::noSpec::blockBack::flushPipe::selImm::Nil = generate() 197f2b7720SXuan Hu List (src1, src2, src3, fu, fuOp, xWen, fWen, xsTrap, noSpec, blockBack, flushPipe, selImm) 207f2b7720SXuan Hu } 217f2b7720SXuan Hu} 227f2b7720SXuan Hu 237f2b7720SXuan Hucase class OPIVV(fu: BitPat, fuOp: BitPat, vWen: Boolean, mWen: Boolean) extends VecType { 247f2b7720SXuan Hu def generate() : List[BitPat] = { 257f2b7720SXuan Hu List (SrcType.vp, SrcType.vp, SrcType.X, fu, fuOp, N, N, vWen.B, mWen.B, N, N, N, N, SelImm.X) 267f2b7720SXuan Hu } 277f2b7720SXuan Hu} 287f2b7720SXuan Hu 297f2b7720SXuan Hucase class OPIVX() extends VecType { 307f2b7720SXuan Hu def generate() : List[BitPat] = { null } 317f2b7720SXuan Hu} 327f2b7720SXuan Hu 337f2b7720SXuan Hucase class OPIVI() extends VecType { 347f2b7720SXuan Hu def generate() : List[BitPat] = { null } 357f2b7720SXuan Hu} 367f2b7720SXuan Hu 37*c6661c33SHaojin Tangcase class OPMVV(vdRen: Boolean, fu: BitPat, fuOp: BitPat, xWen: Boolean, vWen: Boolean, mWen: Boolean, others: Any) extends VecType { 38*c6661c33SHaojin Tang private def src3: BitPat = if (vdRen) SrcType.vp else SrcType.X 397f2b7720SXuan Hu def generate() : List[BitPat] = { 40*c6661c33SHaojin Tang List (SrcType.vp, SrcType.vp, src3, fu, fuOp, xWen.B, N, vWen.B, mWen.B, N, N, N, N, SelImm.X) 417f2b7720SXuan Hu } 427f2b7720SXuan Hu} 437f2b7720SXuan Hu 44*c6661c33SHaojin Tangcase class OPMVX(vdRen: Boolean, fu: BitPat, fuOp: BitPat, xWen: Boolean, vWen: Boolean, mWen: Boolean, others: Any) extends VecType { 45*c6661c33SHaojin Tang private def src3: BitPat = if (vdRen) SrcType.vp else SrcType.X 46*c6661c33SHaojin Tang def generate() : List[BitPat] = { 47*c6661c33SHaojin Tang List (SrcType.xp, SrcType.vp, src3, fu, fuOp, xWen.B, N, vWen.B, mWen.B, N, N, N, N, SelImm.X) 48*c6661c33SHaojin Tang } 497f2b7720SXuan Hu} 507f2b7720SXuan Hu 517f2b7720SXuan Hucase class OPFVV() extends VecType { 527f2b7720SXuan Hu def generate() : List[BitPat] = { null } 537f2b7720SXuan Hu} 547f2b7720SXuan Hu 557f2b7720SXuan Hucase class OPFVF(fu: BitPat, fuOp: BitPat, fWen: Boolean, vWen: Boolean, mWen: Boolean) extends VecType { 567f2b7720SXuan Hu def generate() : List[BitPat] = { 577f2b7720SXuan Hu List (SrcType.vp, SrcType.fp, SrcType.X, fu, fuOp, N, fWen.B, vWen.B, mWen.B, N, N, N, N, SelImm.X) 587f2b7720SXuan Hu } 597f2b7720SXuan Hu} 607f2b7720SXuan Hu 617f2b7720SXuan Hucase class VSET() extends VecType { 627f2b7720SXuan Hu def generate() : List[BitPat] = { null } 637f2b7720SXuan Hu} 647f2b7720SXuan Hu 657f2b7720SXuan Hucase class VLS() extends VecType { 667f2b7720SXuan Hu def generate() : List[BitPat] = { null } 677f2b7720SXuan Hu} 687f2b7720SXuan Hu 697f2b7720SXuan Huobject VecDecoder extends DecodeConstants { 707f2b7720SXuan Hu private def F = false 717f2b7720SXuan Hu private def T = true 727f2b7720SXuan Hu 737f2b7720SXuan Hu val opivvTable: Array[(BitPat, List[BitPat])] = Array( 747f2b7720SXuan Hu VADD_VV -> OPIVV(FuType.vipu, VipuType.dummy, T, F).generate(), 757f2b7720SXuan Hu 767f2b7720SXuan Hu VMSEQ_VV -> OPIVV(FuType.vipu, VipuType.dummy, F, T).generate(), 777f2b7720SXuan Hu ) 787f2b7720SXuan Hu 797f2b7720SXuan Hu val opivxTable: Array[(BitPat, List[BitPat])] = Array() 807f2b7720SXuan Hu val opiviTable: Array[(BitPat, List[BitPat])] = Array() 817f2b7720SXuan Hu 82*c6661c33SHaojin Tang val opmvv: Array[(BitPat, OPMVV)] = Array( 83*c6661c33SHaojin Tang VAADD_VV -> OPMVV(F, FuType.vipu, VipuType.dummy, F, T, F, T), 84*c6661c33SHaojin Tang VAADDU_VV -> OPMVV(F, FuType.vipu, VipuType.dummy, F, T, F, T), 85*c6661c33SHaojin Tang VASUB_VV -> OPMVV(F, FuType.vipu, VipuType.dummy, F, T, F, T), 86*c6661c33SHaojin Tang VASUBU_VV -> OPMVV(F, FuType.vipu, VipuType.dummy, F, T, F, T), 87*c6661c33SHaojin Tang VCOMPRESS_VM -> OPMVV(F, FuType.vipu, VipuType.dummy, F, T, F, T), 88*c6661c33SHaojin Tang VCPOP_M -> OPMVV(F, FuType.vipu, VipuType.dummy, T, F, F, T), 89*c6661c33SHaojin Tang VDIV_VV -> OPMVV(F, FuType.vipu, VipuType.dummy, F, T, F, T), 90*c6661c33SHaojin Tang VDIVU_VV -> OPMVV(F, FuType.vipu, VipuType.dummy, F, T, F, T), 91*c6661c33SHaojin Tang VFIRST_M -> OPMVV(F, FuType.vipu, VipuType.dummy, T, F, F, T), 92*c6661c33SHaojin Tang VID_V -> OPMVV(F, FuType.vipu, VipuType.dummy, F, T, F, T), 93*c6661c33SHaojin Tang VIOTA_M -> OPMVV(F, FuType.vipu, VipuType.dummy, F, T, F, T), 94*c6661c33SHaojin Tang VMACC_VV -> OPMVV(T, FuType.vipu, VipuType.dummy, F, T, F, T), 95*c6661c33SHaojin Tang VMADD_VV -> OPMVV(T, FuType.vipu, VipuType.dummy, F, T, F, T), 96*c6661c33SHaojin Tang VMAND_MM -> OPMVV(F, FuType.vipu, VipuType.dummy, F, T, F, T), 97*c6661c33SHaojin Tang VMANDN_MM -> OPMVV(F, FuType.vipu, VipuType.dummy, F, T, F, T), 98*c6661c33SHaojin Tang VMNAND_MM -> OPMVV(F, FuType.vipu, VipuType.dummy, F, T, F, T), 99*c6661c33SHaojin Tang VMNOR_MM -> OPMVV(F, FuType.vipu, VipuType.dummy, F, T, F, T), 100*c6661c33SHaojin Tang VMOR_MM -> OPMVV(F, FuType.vipu, VipuType.dummy, F, T, F, T), 101*c6661c33SHaojin Tang VMORN_MM -> OPMVV(F, FuType.vipu, VipuType.dummy, F, T, F, T), 102*c6661c33SHaojin Tang VMXNOR_MM -> OPMVV(F, FuType.vipu, VipuType.dummy, F, T, F, T), 103*c6661c33SHaojin Tang VMXOR_MM -> OPMVV(F, FuType.vipu, VipuType.dummy, F, T, F, T), 104*c6661c33SHaojin Tang VMSBF_M -> OPMVV(F, FuType.vipu, VipuType.dummy, F, T, F, T), 105*c6661c33SHaojin Tang VMSIF_M -> OPMVV(F, FuType.vipu, VipuType.dummy, F, T, F, T), 106*c6661c33SHaojin Tang VMSOF_M -> OPMVV(F, FuType.vipu, VipuType.dummy, F, T, F, T), 107*c6661c33SHaojin Tang VMUL_VV -> OPMVV(F, FuType.vipu, VipuType.dummy, F, T, F, T), 108*c6661c33SHaojin Tang VMULH_VV -> OPMVV(F, FuType.vipu, VipuType.dummy, F, T, F, T), 109*c6661c33SHaojin Tang VMULHSU_VV -> OPMVV(F, FuType.vipu, VipuType.dummy, F, T, F, T), 110*c6661c33SHaojin Tang VMULHU_VV -> OPMVV(F, FuType.vipu, VipuType.dummy, F, T, F, T), 111*c6661c33SHaojin Tang VMV_X_S -> OPMVV(F, FuType.vipu, VipuType.dummy, T, F, F, T), 112*c6661c33SHaojin Tang VNMSAC_VV -> OPMVV(F, FuType.vipu, VipuType.dummy, F, T, F, T), 113*c6661c33SHaojin Tang VNMSUB_VV -> OPMVV(F, FuType.vipu, VipuType.dummy, F, T, F, T), 114*c6661c33SHaojin Tang VREDAND_VS -> OPMVV(F, FuType.vipu, VipuType.dummy, F, T, F, T), 115*c6661c33SHaojin Tang VREDMAX_VS -> OPMVV(F, FuType.vipu, VipuType.dummy, F, T, F, T), 116*c6661c33SHaojin Tang VREDMAXU_VS -> OPMVV(F, FuType.vipu, VipuType.dummy, F, T, F, T), 117*c6661c33SHaojin Tang VREDMIN_VS -> OPMVV(F, FuType.vipu, VipuType.dummy, F, T, F, T), 118*c6661c33SHaojin Tang VREDMINU_VS -> OPMVV(F, FuType.vipu, VipuType.dummy, F, T, F, T), 119*c6661c33SHaojin Tang VREDOR_VS -> OPMVV(F, FuType.vipu, VipuType.dummy, F, T, F, T), 120*c6661c33SHaojin Tang VREDSUM_VS -> OPMVV(F, FuType.vipu, VipuType.dummy, F, T, F, T), 121*c6661c33SHaojin Tang VREDXOR_VS -> OPMVV(F, FuType.vipu, VipuType.dummy, F, T, F, T), 122*c6661c33SHaojin Tang VREM_VV -> OPMVV(F, FuType.vipu, VipuType.dummy, F, T, F, T), 123*c6661c33SHaojin Tang VREMU_VV -> OPMVV(F, FuType.vipu, VipuType.dummy, F, T, F, T), 124*c6661c33SHaojin Tang VSEXT_VF2 -> OPMVV(F, FuType.vipu, VipuType.dummy, F, T, F, T), 125*c6661c33SHaojin Tang VSEXT_VF4 -> OPMVV(F, FuType.vipu, VipuType.dummy, F, T, F, T), 126*c6661c33SHaojin Tang VSEXT_VF8 -> OPMVV(F, FuType.vipu, VipuType.dummy, F, T, F, T), 127*c6661c33SHaojin Tang VZEXT_VF2 -> OPMVV(F, FuType.vipu, VipuType.dummy, F, T, F, T), 128*c6661c33SHaojin Tang VZEXT_VF4 -> OPMVV(F, FuType.vipu, VipuType.dummy, F, T, F, T), 129*c6661c33SHaojin Tang VZEXT_VF8 -> OPMVV(F, FuType.vipu, VipuType.dummy, F, T, F, T), 130*c6661c33SHaojin Tang VWADD_VV -> OPMVV(F, FuType.vipu, VipuType.dummy, F, T, F, T), 131*c6661c33SHaojin Tang VWADD_WV -> OPMVV(F, FuType.vipu, VipuType.dummy, F, T, F, T), 132*c6661c33SHaojin Tang VWADDU_VV -> OPMVV(F, FuType.vipu, VipuType.dummy, F, T, F, T), 133*c6661c33SHaojin Tang VWADDU_WV -> OPMVV(F, FuType.vipu, VipuType.dummy, F, T, F, T), 134*c6661c33SHaojin Tang VWMACC_VV -> OPMVV(T, FuType.vipu, VipuType.dummy, F, T, F, T), 135*c6661c33SHaojin Tang VWMACCSU_VV -> OPMVV(T, FuType.vipu, VipuType.dummy, F, T, F, T), 136*c6661c33SHaojin Tang VWMACCU_VV -> OPMVV(T, FuType.vipu, VipuType.dummy, F, T, F, T), 137*c6661c33SHaojin Tang VWMUL_VV -> OPMVV(F, FuType.vipu, VipuType.dummy, F, T, F, T), 138*c6661c33SHaojin Tang VWMULSU_VV -> OPMVV(F, FuType.vipu, VipuType.dummy, F, T, F, T), 139*c6661c33SHaojin Tang VWMULU_VV -> OPMVV(F, FuType.vipu, VipuType.dummy, F, T, F, T), 140*c6661c33SHaojin Tang VWSUB_VV -> OPMVV(F, FuType.vipu, VipuType.dummy, F, T, F, T), 141*c6661c33SHaojin Tang VWSUB_WV -> OPMVV(F, FuType.vipu, VipuType.dummy, F, T, F, T), 142*c6661c33SHaojin Tang VWSUBU_VV -> OPMVV(F, FuType.vipu, VipuType.dummy, F, T, F, T), 143*c6661c33SHaojin Tang VWSUBU_WV -> OPMVV(F, FuType.vipu, VipuType.dummy, F, T, F, T) 144*c6661c33SHaojin Tang ) 145*c6661c33SHaojin Tang val opmvx: Array[(BitPat, OPMVX)] = Array( 146*c6661c33SHaojin Tang VAADD_VX -> OPMVX(F, FuType.vipu, VipuType.dummy, F, T, F, T), 147*c6661c33SHaojin Tang VAADDU_VX -> OPMVX(F, FuType.vipu, VipuType.dummy, F, T, F, T), 148*c6661c33SHaojin Tang VASUB_VX -> OPMVX(F, FuType.vipu, VipuType.dummy, F, T, F, T), 149*c6661c33SHaojin Tang VASUBU_VX -> OPMVX(F, FuType.vipu, VipuType.dummy, F, T, F, T), 150*c6661c33SHaojin Tang VDIV_VX -> OPMVX(F, FuType.vipu, VipuType.dummy, F, T, F, T), 151*c6661c33SHaojin Tang VDIVU_VX -> OPMVX(F, FuType.vipu, VipuType.dummy, F, T, F, T), 152*c6661c33SHaojin Tang VMACC_VX -> OPMVX(T, FuType.vipu, VipuType.dummy, F, T, F, T), 153*c6661c33SHaojin Tang VMADD_VX -> OPMVX(T, FuType.vipu, VipuType.dummy, F, T, F, T), 154*c6661c33SHaojin Tang VMUL_VX -> OPMVX(F, FuType.vipu, VipuType.dummy, F, T, F, T), 155*c6661c33SHaojin Tang VMULH_VX -> OPMVX(F, FuType.vipu, VipuType.dummy, F, T, F, T), 156*c6661c33SHaojin Tang VMULHSU_VX -> OPMVX(F, FuType.vipu, VipuType.dummy, F, T, F, T), 157*c6661c33SHaojin Tang VMULHU_VX -> OPMVX(F, FuType.vipu, VipuType.dummy, F, T, F, T), 158*c6661c33SHaojin Tang VMV_S_X -> OPMVX(F, FuType.vipu, VipuType.dummy, F, T, F, T), 159*c6661c33SHaojin Tang VNMSAC_VX -> OPMVX(F, FuType.vipu, VipuType.dummy, F, T, F, T), 160*c6661c33SHaojin Tang VNMSUB_VX -> OPMVX(F, FuType.vipu, VipuType.dummy, F, T, F, T), 161*c6661c33SHaojin Tang VREM_VX -> OPMVX(F, FuType.vipu, VipuType.dummy, F, T, F, T), 162*c6661c33SHaojin Tang VREMU_VX -> OPMVX(F, FuType.vipu, VipuType.dummy, F, T, F, T), 163*c6661c33SHaojin Tang VSLIDE1DOWN_VX -> OPMVX(F, FuType.vipu, VipuType.dummy, F, T, F, T), 164*c6661c33SHaojin Tang VSLIDE1UP_VX -> OPMVX(F, FuType.vipu, VipuType.dummy, F, T, F, T), 165*c6661c33SHaojin Tang VWADD_VX -> OPMVX(F, FuType.vipu, VipuType.dummy, F, T, F, T), 166*c6661c33SHaojin Tang VWADD_WX -> OPMVX(F, FuType.vipu, VipuType.dummy, F, T, F, T), 167*c6661c33SHaojin Tang VWADDU_VX -> OPMVX(F, FuType.vipu, VipuType.dummy, F, T, F, T), 168*c6661c33SHaojin Tang VWADDU_WX -> OPMVX(F, FuType.vipu, VipuType.dummy, F, T, F, T), 169*c6661c33SHaojin Tang VWMACC_VX -> OPMVX(T, FuType.vipu, VipuType.dummy, F, T, F, T), 170*c6661c33SHaojin Tang VWMACCSU_VX -> OPMVX(T, FuType.vipu, VipuType.dummy, F, T, F, T), 171*c6661c33SHaojin Tang VWMACCU_VX -> OPMVX(T, FuType.vipu, VipuType.dummy, F, T, F, T), 172*c6661c33SHaojin Tang VWMACCUS_VX -> OPMVX(T, FuType.vipu, VipuType.dummy, F, T, F, T), 173*c6661c33SHaojin Tang VWMUL_VX -> OPMVX(F, FuType.vipu, VipuType.dummy, F, T, F, T), 174*c6661c33SHaojin Tang VWMULSU_VX -> OPMVX(F, FuType.vipu, VipuType.dummy, F, T, F, T), 175*c6661c33SHaojin Tang VWMULU_VX -> OPMVX(F, FuType.vipu, VipuType.dummy, F, T, F, T), 176*c6661c33SHaojin Tang VWSUB_VX -> OPMVX(F, FuType.vipu, VipuType.dummy, F, T, F, T), 177*c6661c33SHaojin Tang VWSUB_WX -> OPMVX(F, FuType.vipu, VipuType.dummy, F, T, F, T), 178*c6661c33SHaojin Tang VWSUBU_VX -> OPMVX(F, FuType.vipu, VipuType.dummy, F, T, F, T), 179*c6661c33SHaojin Tang VWSUBU_WX -> OPMVX(F, FuType.vipu, VipuType.dummy, F, T, F, T) 180*c6661c33SHaojin Tang ) 181*c6661c33SHaojin Tang val opmvvTable: Array[(BitPat, List[BitPat])] = opmvv.map(x => (x._1, x._2.generate())) 182*c6661c33SHaojin Tang val opmvxTable: Array[(BitPat, List[BitPat])] = opmvx.map(x => (x._1, x._2.generate())) 1837f2b7720SXuan Hu 1847f2b7720SXuan Hu val opfvvTable: Array[(BitPat, List[BitPat])] = Array() 1857f2b7720SXuan Hu 1867f2b7720SXuan Hu val opfvfTable: Array[(BitPat, List[BitPat])] = Array( 1877f2b7720SXuan Hu VFADD_VF -> OPFVF(FuType.vfpu, VfpuType.dummy, F, T, F).generate(), 1887f2b7720SXuan Hu VMFEQ_VF -> OPFVF(FuType.vfpu, VfpuType.dummy, F, F, T).generate(), 1897f2b7720SXuan Hu ) 1907f2b7720SXuan Hu 1917f2b7720SXuan Hu val vsetTable: Array[(BitPat, List[BitPat])] = Array() 1927f2b7720SXuan Hu val vlsTable: Array[(BitPat, List[BitPat])] = Array() 1937f2b7720SXuan Hu 1947f2b7720SXuan Hu val table = opivvTable ++ opivxTable ++ opiviTable ++ 1957f2b7720SXuan Hu opmvvTable ++ opmvxTable ++ 1967f2b7720SXuan Hu opfvvTable ++ opfvfTable ++ 1977f2b7720SXuan Hu vsetTable ++ vlsTable 1987f2b7720SXuan Hu} 199