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