xref: /XiangShan/src/main/scala/xiangshan/backend/decode/VecDecoder.scala (revision 3a2e64c4cc8eb6361b77f8cc81e35f391922dd99)
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