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