xref: /XiangShan/src/main/scala/xiangshan/backend/decode/VecDecoder.scala (revision cb81ef427bb932e6e2a2e4fc10d2e4860ad55562)
17f2b7720SXuan Hupackage xiangshan.backend.decode
27f2b7720SXuan Hu
3d91483a6Sfdyimport chipsalliance.rocketchip.config.Parameters
4d91483a6Sfdyimport chisel3._
5912e2179SXuan Huimport chisel3.util.BitPat.bitPatToUInt
67f2b7720SXuan Huimport chisel3.util._
73b739f49SXuan Huimport freechips.rocketchip.util.uintToBitPat
8d91483a6Sfdyimport freechips.rocketchip.rocket.Instructions._
9d91483a6Sfdyimport utils._
10d91483a6Sfdyimport xiangshan.ExceptionNO.illegalInstr
11730cfbc0SXuan Huimport xiangshan.backend.fu.FuType
12d91483a6Sfdyimport xiangshan._
13efdf5c1cSxiaofeibao-xjtuimport yunsuan.{VfpuType, VipuType, VimacType, VpermType, VialuFixType, VfaluType, VfmaType, VfdivType}
147f2b7720SXuan Hu
15b65b9ebaSXuan Huabstract class VecDecode extends XSDecodeBase {
167f2b7720SXuan Hu  def generate() : List[BitPat]
177f2b7720SXuan Hu  def asOldDecodeOutput(): List[BitPat] = {
18912e2179SXuan Hu    val src1::src2::src3::fu::fuOp::xWen::fWen::vWen::mWen::vxsatWen::xsTrap::noSpec::blockBack::flushPipe::selImm::Nil = generate()
197f2b7720SXuan Hu    List (src1, src2, src3, fu, fuOp, xWen, fWen, xsTrap, noSpec, blockBack, flushPipe, selImm)
207f2b7720SXuan Hu  }
21912e2179SXuan Hu  def asFirstStageDecodeOutput(): List[BitPat] = {
22912e2179SXuan Hu    val src1::src2::src3::fu::fuOp::xWen::fWen::vWen::mWen::vxsatWen::xsTrap::noSpec::blockBack::flushPipe::selImm::Nil = generate()
23912e2179SXuan Hu    List (src1, src2, src3, fu, fuOp, xWen, fWen, bitPatToUInt(vWen) | bitPatToUInt(mWen), xsTrap, noSpec, blockBack, flushPipe, selImm)
24912e2179SXuan Hu  }
257f2b7720SXuan Hu}
267f2b7720SXuan Hu
2717ec87f2SXuan Hucase class OPIVV(fu: Int, fuOp: BitPat, vWen: Boolean, mWen: Boolean, vxsatWen: Boolean, uopSplitType: BitPat = UopSplitType.VEC_VVV, src3: BitPat = SrcType.vp) extends XSDecodeBase {
287f2b7720SXuan Hu  def generate() : List[BitPat] = {
29e2695e90SzhanglyGit    XSDecode(SrcType.vp, SrcType.vp, src3, fu, fuOp, SelImm.X, uopSplitType,
30b65b9ebaSXuan Hu      xWen = F, fWen = F, vWen = vWen, mWen = mWen, xsTrap = F, noSpec = F, blockBack = F, flushPipe = F).generate()
317f2b7720SXuan Hu  }
327f2b7720SXuan Hu}
337f2b7720SXuan Hu
3417ec87f2SXuan Hucase class OPIVX(fu: Int, fuOp: BitPat, vWen: Boolean, mWen: Boolean, vxsatWen: Boolean, uopSplitType: BitPat = UopSplitType.VEC_VXV, src3: BitPat = SrcType.vp) extends XSDecodeBase {
3558c35d23Shuxuan0307  def generate() : List[BitPat] = {
36e2695e90SzhanglyGit    XSDecode(SrcType.xp, SrcType.vp, src3, fu, fuOp, SelImm.X, uopSplitType,
37b65b9ebaSXuan Hu      xWen = F, fWen = F, vWen = vWen, mWen = mWen, xsTrap = F, noSpec = F, blockBack = F, flushPipe = F).generate()
3858c35d23Shuxuan0307  }
397f2b7720SXuan Hu}
407f2b7720SXuan Hu
4117ec87f2SXuan Hucase class OPIVI(fu: Int, fuOp: BitPat, vWen: Boolean, mWen: Boolean, vxsatWen: Boolean, selImm: BitPat = SelImm.IMM_OPIVIS, uopSplitType: BitPat = UopSplitType.VEC_VVV, src3: BitPat = SrcType.vp) extends XSDecodeBase {
4258c35d23Shuxuan0307  def generate() : List[BitPat] = {
43e2695e90SzhanglyGit    XSDecode(SrcType.imm, SrcType.vp, src3, fu, fuOp, selImm, uopSplitType,
44b65b9ebaSXuan Hu      xWen = F, fWen = F, vWen = vWen, mWen = mWen, xsTrap = F, noSpec = F, blockBack = F, flushPipe = F).generate()
4558c35d23Shuxuan0307  }
467f2b7720SXuan Hu}
477f2b7720SXuan Hu
4817ec87f2SXuan Hucase class OPMVV(vdRen: Boolean, fu: Int, fuOp: BitPat, xWen: Boolean, vWen: Boolean, mWen: Boolean, uopSplitType: BitPat = UopSplitType.dummy) extends XSDecodeBase {
49c6661c33SHaojin Tang  private def src3: BitPat = if (vdRen) SrcType.vp else SrcType.X
507f2b7720SXuan Hu  def generate() : List[BitPat] = {
51e2695e90SzhanglyGit    XSDecode(SrcType.vp, SrcType.vp, src3, fu, fuOp, SelImm.X, uopSplitType, xWen, F, vWen, mWen, F, F, F, F).generate()
527f2b7720SXuan Hu  }
537f2b7720SXuan Hu}
547f2b7720SXuan Hu
5517ec87f2SXuan Hucase class OPMVX(vdRen: Boolean, fu: Int, fuOp: BitPat, xWen: Boolean, vWen: Boolean, mWen: Boolean, uopSplitType: BitPat = UopSplitType.dummy) extends XSDecodeBase {
56c6661c33SHaojin Tang  private def src3: BitPat = if (vdRen) SrcType.vp else SrcType.X
57c6661c33SHaojin Tang  def generate() : List[BitPat] = {
58e2695e90SzhanglyGit    XSDecode(SrcType.xp, SrcType.vp, src3, fu, fuOp, SelImm.X, uopSplitType,
59b65b9ebaSXuan Hu      xWen = xWen, fWen = F, vWen = vWen, mWen = mWen, xsTrap = F, noSpec = F, blockBack = F, flushPipe = F).generate()
60c6661c33SHaojin Tang  }
617f2b7720SXuan Hu}
627f2b7720SXuan Hu
6317ec87f2SXuan Hucase class OPFVV(src1: BitPat, src3: BitPat, fu: Int, fuOp: BitPat, fWen: Boolean, vWen: Boolean, mWen: Boolean, uopSplitType: BitPat = UopSplitType.dummy) extends XSDecodeBase {
64b448988dSczw  def generate() : List[BitPat] = {
65e2695e90SzhanglyGit    XSDecode(src1, SrcType.vp, src3, fu, fuOp, SelImm.X, uopSplitType,
66b65b9ebaSXuan Hu      xWen = F, fWen = fWen, vWen = vWen, mWen = mWen, xsTrap = F, noSpec = F, blockBack = F, flushPipe = F).generate()
67b448988dSczw  }
687f2b7720SXuan Hu}
697f2b7720SXuan Hu
70bdda74fdSxiaofeibao-xjtucase class OPFFF(src1: BitPat, src3: BitPat, fu: Int, fuOp: BitPat, xWen: Boolean, fWen: Boolean, vWen: Boolean, uopSplitType: BitPat = UopSplitType.dummy) extends XSDecodeBase {
71bdda74fdSxiaofeibao-xjtu  def generate() : List[BitPat] = {
72bdda74fdSxiaofeibao-xjtu    XSDecode(src1, SrcType.fp, src3, fu, fuOp, SelImm.X, uopSplitType,
73bdda74fdSxiaofeibao-xjtu      xWen = xWen, fWen = fWen, vWen = vWen, mWen = F, xsTrap = F, noSpec = F, blockBack = F, flushPipe = F, canRobCompress = T).generate()
74bdda74fdSxiaofeibao-xjtu  }
75bdda74fdSxiaofeibao-xjtu}
76bdda74fdSxiaofeibao-xjtu
779bb931c8Sxiaofeibao-xjtucase class OPFVF(src1: BitPat, src3: BitPat, fu: Int, fuOp: BitPat, fWen: Boolean, vWen: Boolean, mWen: Boolean, uopSplitType: BitPat = UopSplitType.dummy, src2: BitPat = SrcType.vp) extends XSDecodeBase {
787f2b7720SXuan Hu  def generate() : List[BitPat] = {
799bb931c8Sxiaofeibao-xjtu    XSDecode(src1, src2, src3, fu, fuOp, SelImm.X, uopSplitType,
80b65b9ebaSXuan Hu      xWen = F, fWen = fWen, vWen = vWen, mWen = mWen, xsTrap = F, noSpec = F, blockBack = F, flushPipe = F).generate()
817f2b7720SXuan Hu  }
827f2b7720SXuan Hu}
837f2b7720SXuan Hu
84e2695e90SzhanglyGitcase class VSET(vli: Boolean, vtypei: Boolean, fuOp: BitPat, flushPipe: Boolean, selImm: BitPat, uopSplitType: BitPat = UopSplitType.DIR) extends XSDecodeBase {
85912e2179SXuan Hu  def generate() : List[BitPat] = {
86912e2179SXuan Hu    val src1 = if (vli) SrcType.imm else SrcType.xp
87912e2179SXuan Hu    val src2 = if (vtypei) SrcType.imm else SrcType.xp
8817ec87f2SXuan Hu    XSDecode(src1, src2, SrcType.X, FuType.vsetiwf, fuOp, selImm, uopSplitType,
899896b9c4Sfdy      xWen = F, fWen = F, vWen = T, mWen = F, xsTrap = F, noSpec = F, blockBack = F, flushPipe = flushPipe).generate()
90912e2179SXuan Hu  }
917f2b7720SXuan Hu}
927f2b7720SXuan Hu
93912e2179SXuan Hucase class VLD(src2: BitPat, fuOp: BitPat, strided: Boolean = false, indexed: Boolean = false, ff: Boolean = false,
944ee69032SzhanglyGit  mask: Boolean = false, whole: Boolean = false, ordered: Boolean = false, uopSplitType: BitPat = UopSplitType.VEC_US_LD) extends XSDecodeBase {
95912e2179SXuan Hu  def generate() : List[BitPat] = {
96912e2179SXuan Hu    val fu = FuType.vldu
97912e2179SXuan Hu    val src1 = SrcType.xp
98912e2179SXuan Hu    val src3 = SrcType.X
99e2695e90SzhanglyGit    XSDecode(src1, src2, src3, fu, fuOp, SelImm.X, uopSplitType,
100b65b9ebaSXuan Hu      xWen = F, fWen = F, vWen = T, mWen = F, xsTrap = F, noSpec = F, blockBack = F, flushPipe = F).generate()
101912e2179SXuan Hu  }
102912e2179SXuan Hu}
103912e2179SXuan Hu
104912e2179SXuan Hucase class VST(src2: BitPat, fuOp: BitPat, strided: Boolean = false, indexed: Boolean = false,
105e2695e90SzhanglyGit  mask: Boolean = false, whole: Boolean = false, ordered: Boolean = false, uopSplitType: BitPat = UopSplitType.dummy) extends XSDecodeBase {
106912e2179SXuan Hu  def generate() : List[BitPat] = {
107912e2179SXuan Hu    val fu = FuType.vstu
108912e2179SXuan Hu    val src1 = SrcType.xp
109912e2179SXuan Hu    val src3 = SrcType.vp
110e2695e90SzhanglyGit    XSDecode(src1, src2, src3, fu, fuOp, SelImm.X, uopSplitType,
111b65b9ebaSXuan Hu      xWen = F, fWen = F, vWen = F, mWen = F, xsTrap = F, noSpec = F, blockBack = F, flushPipe = F).generate()
112912e2179SXuan Hu  }
1137f2b7720SXuan Hu}
1147f2b7720SXuan Hu
1157f2b7720SXuan Huobject VecDecoder extends DecodeConstants {
116b65b9ebaSXuan Hu  val opivv: Array[(BitPat, XSDecodeBase)] = Array(
117d91483a6Sfdy    VADD_VV         -> OPIVV(FuType.vialuF, VialuFixType.vadd_vv, T, F, F),
118d91483a6Sfdy    VSUB_VV         -> OPIVV(FuType.vialuF, VialuFixType.vsub_vv, T, F, F),
1197f2b7720SXuan Hu
120d91483a6Sfdy    VMINU_VV        -> OPIVV(FuType.vialuF, VialuFixType.vminu_vv, T, F, F),
121d91483a6Sfdy    VMIN_VV         -> OPIVV(FuType.vialuF, VialuFixType.vmin_vv, T, F, F),
122d91483a6Sfdy    VMAXU_VV        -> OPIVV(FuType.vialuF, VialuFixType.vmaxu_vv, T, F, F),
123d91483a6Sfdy    VMAX_VV         -> OPIVV(FuType.vialuF, VialuFixType.vmax_vv, T, F, F),
12458c35d23Shuxuan0307
125d91483a6Sfdy    VAND_VV         -> OPIVV(FuType.vialuF, VialuFixType.vand_vv, T, F, F),
126d91483a6Sfdy    VOR_VV          -> OPIVV(FuType.vialuF, VialuFixType.vor_vv, T, F, F),
127d91483a6Sfdy    VXOR_VV         -> OPIVV(FuType.vialuF, VialuFixType.vxor_vv, T, F, F),
12858c35d23Shuxuan0307
129e2695e90SzhanglyGit    VRGATHER_VV     -> OPIVV(FuType.vppu, VpermType.vrgather, T, F, F, UopSplitType.VEC_RGATHER),
130e2695e90SzhanglyGit    VRGATHEREI16_VV -> OPIVV(FuType.vppu, VpermType.vrgatherei16, T, F, F, UopSplitType.VEC_RGATHEREI16),
13158c35d23Shuxuan0307
132d91483a6Sfdy    VADC_VVM        -> OPIVV(FuType.vialuF, VialuFixType.vadc_vvm, T, F, F),
133e2695e90SzhanglyGit    VMADC_VVM       -> OPIVV(FuType.vialuF, VialuFixType.vmadc_vvm, F, T, F, UopSplitType.VEC_VVM),
134e2695e90SzhanglyGit    VMADC_VV        -> OPIVV(FuType.vialuF, VialuFixType.vmadc_vv, F, T, F, UopSplitType.VEC_VVM),
13558c35d23Shuxuan0307
136d91483a6Sfdy    VSBC_VVM        -> OPIVV(FuType.vialuF, VialuFixType.vsbc_vvm, T, F, F),
137e2695e90SzhanglyGit    VMSBC_VV        -> OPIVV(FuType.vialuF, VialuFixType.vmsbc_vv, F, T, F, UopSplitType.VEC_VVM),
138e2695e90SzhanglyGit    VMSBC_VVM       -> OPIVV(FuType.vialuF, VialuFixType.vmsbc_vvm, F, T, F, UopSplitType.VEC_VVM),
13958c35d23Shuxuan0307
140d91483a6Sfdy    VMERGE_VVM      -> OPIVV(FuType.vialuF, VialuFixType.vmerge_vvm, T, F, F),
14158c35d23Shuxuan0307
142d91483a6Sfdy    VMV_V_V      -> OPIVV(FuType.vialuF, VialuFixType.vmv_v_v, T, F, F),
14358c35d23Shuxuan0307
144e2695e90SzhanglyGit    VMSEQ_VV        -> OPIVV(FuType.vialuF, VialuFixType.vmseq_vv, F, T, F, UopSplitType.VEC_VVM),
145e2695e90SzhanglyGit    VMSNE_VV        -> OPIVV(FuType.vialuF, VialuFixType.vmsne_vv, F, T, F, UopSplitType.VEC_VVM),
146e2695e90SzhanglyGit    VMSLTU_VV       -> OPIVV(FuType.vialuF, VialuFixType.vmsltu_vv, F, T, F, UopSplitType.VEC_VVM),
147e2695e90SzhanglyGit    VMSLT_VV        -> OPIVV(FuType.vialuF, VialuFixType.vmslt_vv, F, T, F, UopSplitType.VEC_VVM),
148e2695e90SzhanglyGit    VMSLEU_VV       -> OPIVV(FuType.vialuF, VialuFixType.vmsleu_vv, F, T, F, UopSplitType.VEC_VVM),
149e2695e90SzhanglyGit    VMSLE_VV        -> OPIVV(FuType.vialuF, VialuFixType.vmsle_vv, F, T, F, UopSplitType.VEC_VVM),
15058c35d23Shuxuan0307
151d91483a6Sfdy    VSLL_VV         -> OPIVV(FuType.vialuF, VialuFixType.vsll_vv, T, F, F),
152d91483a6Sfdy    VSRL_VV         -> OPIVV(FuType.vialuF, VialuFixType.vsrl_vv, T, F, F),
153d91483a6Sfdy    VSRA_VV         -> OPIVV(FuType.vialuF, VialuFixType.vsra_vv, T, F, F),
154e2695e90SzhanglyGit    VNSRL_WV        -> OPIVV(FuType.vialuF, VialuFixType.vnsrl_wv, T, F, F, UopSplitType.VEC_WVV),
155e2695e90SzhanglyGit    VNSRA_WV        -> OPIVV(FuType.vialuF, VialuFixType.vnsra_wv, T, F, F, UopSplitType.VEC_WVV),
15658c35d23Shuxuan0307
157d91483a6Sfdy    VSADDU_VV       -> OPIVV(FuType.vialuF, VialuFixType.vsaddu_vv, T, F, T),
158d91483a6Sfdy    VSADD_VV        -> OPIVV(FuType.vialuF, VialuFixType.vsadd_vv, T, F, T),
159d91483a6Sfdy    VSSUBU_VV       -> OPIVV(FuType.vialuF, VialuFixType.vssubu_vv, T, F, T),
160d91483a6Sfdy    VSSUB_VV        -> OPIVV(FuType.vialuF, VialuFixType.vssub_vv, T, F, T),
16158c35d23Shuxuan0307
162adf68ff3Sczw    VSMUL_VV        -> OPIVV(FuType.vimac, VimacType.vsmul, T, F, T, UopSplitType.VEC_VVV),
16358c35d23Shuxuan0307
164d91483a6Sfdy    VSSRL_VV        -> OPIVV(FuType.vialuF, VialuFixType.vssrl_vv, T, F, F),
165d91483a6Sfdy    VSSRA_VV        -> OPIVV(FuType.vialuF, VialuFixType.vssra_vv, T, F, F),
16658c35d23Shuxuan0307
167e2695e90SzhanglyGit    VNCLIPU_WV      -> OPIVV(FuType.vialuF, VialuFixType.vnclipu_wv, T, F, T, UopSplitType.VEC_WVV),
168e2695e90SzhanglyGit    VNCLIP_WV       -> OPIVV(FuType.vialuF, VialuFixType.vnclip_wv, T, F, T, UopSplitType.VEC_WVV),
169d91483a6Sfdy
170e2695e90SzhanglyGit    VWREDSUMU_VS    -> OPIVV(FuType.vipu, VipuType.vwredsumu_vs, T, F, F, UopSplitType.VEC_VWW),
171e2695e90SzhanglyGit    VWREDSUM_VS     -> OPIVV(FuType.vipu, VipuType.vwredsum_vs, T, F, F, UopSplitType.VEC_VWW),
1727f2b7720SXuan Hu  )
1737f2b7720SXuan Hu
174b65b9ebaSXuan Hu  val opivx: Array[(BitPat, XSDecodeBase)] = Array(
175d91483a6Sfdy    VADD_VX       -> OPIVX(FuType.vialuF, VialuFixType.vadd_vv, T, F, F),
176d91483a6Sfdy    VSUB_VX       -> OPIVX(FuType.vialuF, VialuFixType.vsub_vv, T, F, F),
177d91483a6Sfdy    VRSUB_VX      -> OPIVX(FuType.vialuF, VialuFixType.vrsub_vv, T, F, F),
17858c35d23Shuxuan0307
179d91483a6Sfdy    VMINU_VX      -> OPIVX(FuType.vialuF, VialuFixType.vminu_vv, T, F, F),
180d91483a6Sfdy    VMIN_VX       -> OPIVX(FuType.vialuF, VialuFixType.vmin_vv, T, F, F),
181d91483a6Sfdy    VMAXU_VX      -> OPIVX(FuType.vialuF, VialuFixType.vmaxu_vv, T, F, F),
182d91483a6Sfdy    VMAX_VX       -> OPIVX(FuType.vialuF, VialuFixType.vmax_vv, T, F, F),
18358c35d23Shuxuan0307
184d91483a6Sfdy    VAND_VX       -> OPIVX(FuType.vialuF, VialuFixType.vand_vv, T, F, F),
185d91483a6Sfdy    VOR_VX        -> OPIVX(FuType.vialuF, VialuFixType.vor_vv, T, F, F),
186d91483a6Sfdy    VXOR_VX       -> OPIVX(FuType.vialuF, VialuFixType.vxor_vv, T, F, F),
18758c35d23Shuxuan0307
188e2695e90SzhanglyGit    VRGATHER_VX   -> OPIVX(FuType.vppu, VpermType.vrgather_vx, T, F, F, UopSplitType.VEC_RGATHER_VX),
18958c35d23Shuxuan0307
190e2695e90SzhanglyGit    VSLIDEUP_VX   -> OPIVX(FuType.vppu, VpermType.vslideup, T, F, F, UopSplitType.VEC_SLIDEUP),
191e2695e90SzhanglyGit    VSLIDEDOWN_VX -> OPIVX(FuType.vppu, VpermType.vslidedown, T, F, F, UopSplitType.VEC_SLIDEDOWN),
19258c35d23Shuxuan0307
193d91483a6Sfdy    VADC_VXM      -> OPIVX(FuType.vialuF, VialuFixType.vadc_vvm, T, F, F),
194e2695e90SzhanglyGit    VMADC_VXM      -> OPIVX(FuType.vialuF, VialuFixType.vmadc_vvm, F, T, F, UopSplitType.VEC_VXM),
195e2695e90SzhanglyGit    VMADC_VX      -> OPIVX(FuType.vialuF, VialuFixType.vmadc_vv, F, T, F, UopSplitType.VEC_VXM),
196d91483a6Sfdy    VSBC_VXM      -> OPIVX(FuType.vialuF, VialuFixType.vsbc_vvm, T, F, F),
197e2695e90SzhanglyGit    VMSBC_VX      -> OPIVX(FuType.vialuF, VialuFixType.vmsbc_vv, F, T, F, UopSplitType.VEC_VXM),
198e2695e90SzhanglyGit    VMSBC_VXM     -> OPIVX(FuType.vialuF, VialuFixType.vmsbc_vvm, F, T, F, UopSplitType.VEC_VXM),
19958c35d23Shuxuan0307
200d91483a6Sfdy    VMERGE_VXM    -> OPIVX(FuType.vialuF, VialuFixType.vmerge_vvm, T, F, F),
20158c35d23Shuxuan0307
202d91483a6Sfdy    VMV_V_X    -> OPIVX(FuType.vialuF, VialuFixType.vmv_v_v, T, F, F),
20358c35d23Shuxuan0307
204e2695e90SzhanglyGit    VMSEQ_VX      -> OPIVX(FuType.vialuF, VialuFixType.vmseq_vv, F, T, F, UopSplitType.VEC_VXM),
205e2695e90SzhanglyGit    VMSNE_VX      -> OPIVX(FuType.vialuF, VialuFixType.vmsne_vv, F, T, F, UopSplitType.VEC_VXM),
206e2695e90SzhanglyGit    VMSLTU_VX     -> OPIVX(FuType.vialuF, VialuFixType.vmsltu_vv, F, T, F, UopSplitType.VEC_VXM),
207e2695e90SzhanglyGit    VMSLT_VX      -> OPIVX(FuType.vialuF, VialuFixType.vmslt_vv, F, T, F, UopSplitType.VEC_VXM),
208e2695e90SzhanglyGit    VMSLEU_VX     -> OPIVX(FuType.vialuF, VialuFixType.vmsleu_vv, F, T, F, UopSplitType.VEC_VXM),
209e2695e90SzhanglyGit    VMSLE_VX      -> OPIVX(FuType.vialuF, VialuFixType.vmsle_vv, F, T, F, UopSplitType.VEC_VXM),
210e2695e90SzhanglyGit    VMSGTU_VX     -> OPIVX(FuType.vialuF, VialuFixType.vmsgtu_vv, F, T, F, UopSplitType.VEC_VXM),
211e2695e90SzhanglyGit    VMSGT_VX      -> OPIVX(FuType.vialuF, VialuFixType.vmsgt_vv, F, T, F, UopSplitType.VEC_VXM),
21258c35d23Shuxuan0307
213d91483a6Sfdy    VSLL_VX       -> OPIVX(FuType.vialuF, VialuFixType.vsll_vv, T, F, F),
214d91483a6Sfdy    VSRL_VX       -> OPIVX(FuType.vialuF, VialuFixType.vsrl_vv, T, F, F),
215d91483a6Sfdy    VSRA_VX       -> OPIVX(FuType.vialuF, VialuFixType.vsra_vv, T, F, F),
216e2695e90SzhanglyGit    VNSRL_WX      -> OPIVX(FuType.vialuF, VialuFixType.vnsrl_wv, T, F, F, UopSplitType.VEC_WXV),
217e2695e90SzhanglyGit    VNSRA_WX      -> OPIVX(FuType.vialuF, VialuFixType.vnsra_wv, T, F, F, UopSplitType.VEC_WXV),
218d91483a6Sfdy
219d91483a6Sfdy    VSADDU_VX     -> OPIVX(FuType.vialuF, VialuFixType.vsaddu_vv, T, F, T),
220d91483a6Sfdy    VSADD_VX      -> OPIVX(FuType.vialuF, VialuFixType.vsadd_vv, T, F, T),
221d91483a6Sfdy    VSSUBU_VX     -> OPIVX(FuType.vialuF, VialuFixType.vssubu_vv, T, F, T),
222d91483a6Sfdy    VSSUB_VX      -> OPIVX(FuType.vialuF, VialuFixType.vssub_vv, T, F, T),
22358c35d23Shuxuan0307
2248fb63ad6SXuan Hu    VSMUL_VX      -> OPIVX(FuType.vimac, VimacType.vsmul, T, F, T, UopSplitType.VEC_VXV),
22558c35d23Shuxuan0307
226d91483a6Sfdy    VSSRL_VX      -> OPIVX(FuType.vialuF, VialuFixType.vssrl_vv, T, F, F),
227d91483a6Sfdy    VSSRA_VX      -> OPIVX(FuType.vialuF, VialuFixType.vssra_vv, T, F, F),
22858c35d23Shuxuan0307
229e2695e90SzhanglyGit    VNCLIPU_WX    -> OPIVX(FuType.vialuF, VialuFixType.vnclipu_wv, T, F, T, UopSplitType.VEC_WXV),
230e2695e90SzhanglyGit    VNCLIP_WX     -> OPIVX(FuType.vialuF, VialuFixType.vnclip_wv, T, F, T, UopSplitType.VEC_WXV),
23158c35d23Shuxuan0307  )
23258c35d23Shuxuan0307
233b65b9ebaSXuan Hu  val opivi: Array[(BitPat, XSDecodeBase)] = Array(
234d91483a6Sfdy    VADD_VI       -> OPIVI(FuType.vialuF, VialuFixType.vadd_vv,   T, F, F),
235d91483a6Sfdy    VRSUB_VI      -> OPIVI(FuType.vialuF, VialuFixType.vrsub_vv, T, F, F),
23658c35d23Shuxuan0307
237d91483a6Sfdy    VAND_VI       -> OPIVI(FuType.vialuF, VialuFixType.vand_vv, T, F, F),
238d91483a6Sfdy    VOR_VI        -> OPIVI(FuType.vialuF, VialuFixType.vor_vv, T, F, F),
239d91483a6Sfdy    VXOR_VI       -> OPIVI(FuType.vialuF, VialuFixType.vxor_vv, T, F, F),
24058c35d23Shuxuan0307
241e2695e90SzhanglyGit    VRGATHER_VI   -> OPIVI(FuType.vppu, VpermType.vrgather, T, F, F, selImm = SelImm.IMM_OPIVIU, uopSplitType = UopSplitType.VEC_RGATHER),
24258c35d23Shuxuan0307
243e2695e90SzhanglyGit    VSLIDEUP_VI   -> OPIVI(FuType.vppu, VpermType.vslideup, T, F, F, selImm = SelImm.IMM_OPIVIU, uopSplitType = UopSplitType.VEC_ISLIDEUP),
244e2695e90SzhanglyGit    VSLIDEDOWN_VI -> OPIVI(FuType.vppu, VpermType.vslidedown, T, F, F, selImm = SelImm.IMM_OPIVIU, uopSplitType = UopSplitType.VEC_ISLIDEDOWN),
24558c35d23Shuxuan0307
246d91483a6Sfdy    VADC_VIM      -> OPIVI(FuType.vialuF, VialuFixType.vadc_vvm, T, F, F),
247e2695e90SzhanglyGit    VMADC_VIM     -> OPIVI(FuType.vialuF, VialuFixType.vmadc_vvm, T, F, F, uopSplitType = UopSplitType.VEC_VVM),
248e2695e90SzhanglyGit    VMADC_VI      -> OPIVI(FuType.vialuF, VialuFixType.vmadc_vv, T, F, F, uopSplitType = UopSplitType.VEC_VVM),
24958c35d23Shuxuan0307
250d91483a6Sfdy    VMERGE_VIM    -> OPIVI(FuType.vialuF, VialuFixType.vmerge_vvm, T, F, F),
25158c35d23Shuxuan0307
252d91483a6Sfdy    VMV_V_I    -> OPIVI(FuType.vialuF, VialuFixType.vmv_v_v, T, F, F),
25358c35d23Shuxuan0307
254e2695e90SzhanglyGit    VMSEQ_VI      -> OPIVI(FuType.vialuF, VialuFixType.vmseq_vv, F, T, F, uopSplitType = UopSplitType.VEC_VVM),
255e2695e90SzhanglyGit    VMSNE_VI      -> OPIVI(FuType.vialuF, VialuFixType.vmsne_vv, F, T, F, uopSplitType = UopSplitType.VEC_VVM),
256e2695e90SzhanglyGit    VMSLEU_VI     -> OPIVI(FuType.vialuF, VialuFixType.vmsleu_vv, F, T, F, selImm = SelImm.IMM_OPIVIU, uopSplitType = UopSplitType.VEC_VVM),
257e2695e90SzhanglyGit    VMSLE_VI      -> OPIVI(FuType.vialuF, VialuFixType.vmsle_vv, F, T, F, uopSplitType = UopSplitType.VEC_VVM),
258e2695e90SzhanglyGit    VMSGTU_VI     -> OPIVI(FuType.vialuF, VialuFixType.vmsgtu_vv, F, T, F, selImm = SelImm.IMM_OPIVIU, uopSplitType = UopSplitType.VEC_VVM),
259e2695e90SzhanglyGit    VMSGT_VI      -> OPIVI(FuType.vialuF, VialuFixType.vmsgt_vv, F, T, F, uopSplitType = UopSplitType.VEC_VVM),
26058c35d23Shuxuan0307
261d91483a6Sfdy    VSLL_VI       -> OPIVI(FuType.vialuF, VialuFixType.vsll_vv, T, F, F, selImm = SelImm.IMM_OPIVIU),
262d91483a6Sfdy    VSRL_VI       -> OPIVI(FuType.vialuF, VialuFixType.vsrl_vv, T, F, F, selImm = SelImm.IMM_OPIVIU),
263d91483a6Sfdy    VSRA_VI       -> OPIVI(FuType.vialuF, VialuFixType.vsra_vv, T, F, F, selImm = SelImm.IMM_OPIVIU),
264e2695e90SzhanglyGit    VNSRL_WI      -> OPIVI(FuType.vialuF, VialuFixType.vnsrl_wv, T, F, F, selImm = SelImm.IMM_OPIVIU, uopSplitType = UopSplitType.VEC_WVV),
265e2695e90SzhanglyGit    VNSRA_WI      -> OPIVI(FuType.vialuF, VialuFixType.vnsra_wv, T, F, F, selImm = SelImm.IMM_OPIVIU, uopSplitType = UopSplitType.VEC_WVV),
26658c35d23Shuxuan0307
267d91483a6Sfdy    VSADDU_VI     -> OPIVI(FuType.vialuF, VialuFixType.vsaddu_vv, T, F, T, selImm = SelImm.IMM_OPIVIU),
268d91483a6Sfdy    VSADD_VI      -> OPIVI(FuType.vialuF, VialuFixType.vsadd_vv, T, F, T),
26958c35d23Shuxuan0307
270d91483a6Sfdy    VSSRL_VI      -> OPIVI(FuType.vialuF, VialuFixType.vssrl_vv, T, F, F, selImm = SelImm.IMM_OPIVIU),
271d91483a6Sfdy    VSSRA_VI      -> OPIVI(FuType.vialuF, VialuFixType.vssra_vv, T, F, F, selImm = SelImm.IMM_OPIVIU),
27258c35d23Shuxuan0307
273e2695e90SzhanglyGit    VNCLIPU_WI    -> OPIVI(FuType.vialuF, VialuFixType.vnclipu_wv, T, F, T, selImm = SelImm.IMM_OPIVIU, uopSplitType = UopSplitType.VEC_WVV),
274e2695e90SzhanglyGit    VNCLIP_WI     -> OPIVI(FuType.vialuF, VialuFixType.vnclip_wv, T, F, T, uopSplitType = UopSplitType.VEC_WVV),
275d91483a6Sfdy
276d91483a6Sfdy    VMV1R_V       -> OPIVI(FuType.vipu, VipuType.dummy, T, F, F),
277d91483a6Sfdy    VMV2R_V       -> OPIVI(FuType.vipu, VipuType.dummy, T, F, F),
278d91483a6Sfdy    VMV4R_V       -> OPIVI(FuType.vipu, VipuType.dummy, T, F, F),
279d91483a6Sfdy    VMV8R_V       -> OPIVI(FuType.vipu, VipuType.dummy, T, F, F),
28058c35d23Shuxuan0307  )
2817f2b7720SXuan Hu
282b65b9ebaSXuan Hu  val opmvv: Array[(BitPat, XSDecodeBase)] = Array(
283e2695e90SzhanglyGit    VAADD_VV     -> OPMVV(T, FuType.vialuF, VialuFixType.vaadd_vv, F, T, F, UopSplitType.VEC_VVV),
284e2695e90SzhanglyGit    VAADDU_VV    -> OPMVV(T, FuType.vialuF, VialuFixType.vaaddu_vv, F, T, F, UopSplitType.VEC_VVV),
285e2695e90SzhanglyGit    VASUB_VV     -> OPMVV(T, FuType.vialuF, VialuFixType.vasub_vv, F, T, F, UopSplitType.VEC_VVV),
286e2695e90SzhanglyGit    VASUBU_VV    -> OPMVV(T, FuType.vialuF, VialuFixType.vasubu_vv, F, T, F, UopSplitType.VEC_VVV),
287adf68ff3Sczw    VCOMPRESS_VM -> OPMVV(T, FuType.vppu, VpermType.vcompress, F, T, F, UopSplitType.VEC_COMPRESS),
288e2695e90SzhanglyGit    VCPOP_M      -> OPMVV(T, FuType.vipu, VipuType.vcpop_m, T, F, F, UopSplitType.VEC_M0X),
289d91483a6Sfdy    VDIV_VV      -> OPMVV(T, FuType.vipu, VipuType.dummy, F, T, F),
290d91483a6Sfdy    VDIVU_VV     -> OPMVV(T, FuType.vipu, VipuType.dummy, F, T, F),
291e2695e90SzhanglyGit    VFIRST_M     -> OPMVV(T, FuType.vipu, VipuType.vfirst_m, T, F, F, UopSplitType.VEC_M0X_VFIRST),
292e2695e90SzhanglyGit    VID_V        -> OPMVV(T, FuType.vipu, VipuType.vid_v, F, T, F, UopSplitType.VEC_MVV),
293e2695e90SzhanglyGit    VIOTA_M      -> OPMVV(T, FuType.vipu, VipuType.viota_m, F, T, F, UopSplitType.VEC_MVV),
294b65b9ebaSXuan Hu
295adf68ff3Sczw    VMACC_VV     -> OPMVV(T, FuType.vimac, VimacType.vmacc, F, T, F, UopSplitType.VEC_VVV),
296b65b9ebaSXuan Hu
297adf68ff3Sczw    VMADD_VV     -> OPMVV(T, FuType.vimac, VimacType.vmadd, F, T, F, UopSplitType.VEC_VVV),
298e2695e90SzhanglyGit    VMAND_MM     -> OPMVV(T, FuType.vialuF, VialuFixType.vmand_mm, F, T, F, UopSplitType.VEC_MMM),
299e2695e90SzhanglyGit    VMANDN_MM    -> OPMVV(T, FuType.vialuF, VialuFixType.vmandn_mm, F, T, F, UopSplitType.VEC_MMM),
300e2695e90SzhanglyGit    VMNAND_MM    -> OPMVV(T, FuType.vialuF, VialuFixType.vmnand_mm, F, T, F, UopSplitType.VEC_MMM),
301e2695e90SzhanglyGit    VMNOR_MM     -> OPMVV(T, FuType.vialuF, VialuFixType.vmnor_mm, F, T, F, UopSplitType.VEC_MMM),
302e2695e90SzhanglyGit    VMOR_MM      -> OPMVV(T, FuType.vialuF, VialuFixType.vmor_mm, F, T, F, UopSplitType.VEC_MMM),
303e2695e90SzhanglyGit    VMORN_MM     -> OPMVV(T, FuType.vialuF, VialuFixType.vmorn_mm, F, T, F, UopSplitType.VEC_MMM),
304e2695e90SzhanglyGit    VMXNOR_MM    -> OPMVV(T, FuType.vialuF, VialuFixType.vmxnor_mm, F, T, F, UopSplitType.VEC_MMM),
305e2695e90SzhanglyGit    VMXOR_MM     -> OPMVV(T, FuType.vialuF, VialuFixType.vmxor_mm, F, T, F, UopSplitType.VEC_MMM),
306e2695e90SzhanglyGit    VMSBF_M      -> OPMVV(T, FuType.vipu, VipuType.vmsbf_m, F, T, F, UopSplitType.VEC_M0M),
307e2695e90SzhanglyGit    VMSIF_M      -> OPMVV(T, FuType.vipu, VipuType.vmsif_m, F, T, F, UopSplitType.VEC_M0M),
308e2695e90SzhanglyGit    VMSOF_M      -> OPMVV(T, FuType.vipu, VipuType.vmsof_m, F, T, F, UopSplitType.VEC_M0M),
309adf68ff3Sczw    VMUL_VV      -> OPMVV(T, FuType.vimac, VimacType.vmul, F, T, F, UopSplitType.VEC_VVV),
310adf68ff3Sczw    VMULH_VV     -> OPMVV(T, FuType.vimac, VimacType.vmulh, F, T, F, UopSplitType.VEC_VVV),
311adf68ff3Sczw    VMULHSU_VV   -> OPMVV(T, FuType.vimac, VimacType.vmulhsu, F, T, F, UopSplitType.VEC_VVV),
312adf68ff3Sczw    VMULHU_VV    -> OPMVV(T, FuType.vimac, VimacType.vmulhu, F, T, F, UopSplitType.VEC_VVV),
313b65b9ebaSXuan Hu
314d91483a6Sfdy    VMV_X_S      -> OPMVV(T, FuType.vipu, VipuType.dummy, T, F, F),
315adf68ff3Sczw    VNMSAC_VV    -> OPMVV(T, FuType.vimac, VimacType.vnmsac, F, T, F, UopSplitType.VEC_VVV),
316adf68ff3Sczw    VNMSUB_VV    -> OPMVV(T, FuType.vimac, VimacType.vnmsub, F, T, F, UopSplitType.VEC_VVV),
317e2695e90SzhanglyGit    VREDAND_VS   -> OPMVV(T, FuType.vipu, VipuType.vredand_vs, F, T, F, UopSplitType.VEC_VRED),
318e2695e90SzhanglyGit    VREDMAX_VS   -> OPMVV(T, FuType.vipu, VipuType.vredmax_vs, F, T, F, UopSplitType.VEC_VRED),
319e2695e90SzhanglyGit    VREDMAXU_VS  -> OPMVV(T, FuType.vipu, VipuType.vredmaxu_vs, F, T, F, UopSplitType.VEC_VRED),
320e2695e90SzhanglyGit    VREDMIN_VS   -> OPMVV(T, FuType.vipu, VipuType.vredmin_vs, F, T, F, UopSplitType.VEC_VRED),
321e2695e90SzhanglyGit    VREDMINU_VS  -> OPMVV(T, FuType.vipu, VipuType.vredminu_vs, F, T, F, UopSplitType.VEC_VRED),
322e2695e90SzhanglyGit    VREDOR_VS    -> OPMVV(T, FuType.vipu, VipuType.vredor_vs, F, T, F, UopSplitType.VEC_VRED),
323e2695e90SzhanglyGit    VREDSUM_VS   -> OPMVV(T, FuType.vipu, VipuType.vredsum_vs, F, T, F, UopSplitType.VEC_VRED),
324e2695e90SzhanglyGit    VREDXOR_VS   -> OPMVV(T, FuType.vipu, VipuType.vredxor_vs, F, T, F, UopSplitType.VEC_VRED),
325d91483a6Sfdy    VREM_VV      -> OPMVV(T, FuType.vipu, VipuType.dummy, F, T, F),
326d91483a6Sfdy    VREMU_VV     -> OPMVV(T, FuType.vipu, VipuType.dummy, F, T, F),
327e2695e90SzhanglyGit    VSEXT_VF2    -> OPMVV(T, FuType.vialuF, VialuFixType.vsext_vf2, F, T, F, UopSplitType.VEC_EXT2),
328e2695e90SzhanglyGit    VSEXT_VF4    -> OPMVV(T, FuType.vialuF, VialuFixType.vsext_vf4, F, T, F, UopSplitType.VEC_EXT4),
329e2695e90SzhanglyGit    VSEXT_VF8    -> OPMVV(T, FuType.vialuF, VialuFixType.vsext_vf8, F, T, F, UopSplitType.VEC_EXT8),
330e2695e90SzhanglyGit    VZEXT_VF2    -> OPMVV(T, FuType.vialuF, VialuFixType.vzext_vf2, F, T, F, UopSplitType.VEC_EXT2),
331e2695e90SzhanglyGit    VZEXT_VF4    -> OPMVV(T, FuType.vialuF, VialuFixType.vzext_vf4, F, T, F, UopSplitType.VEC_EXT4),
332e2695e90SzhanglyGit    VZEXT_VF8    -> OPMVV(T, FuType.vialuF, VialuFixType.vzext_vf8, F, T, F, UopSplitType.VEC_EXT8),
333e2695e90SzhanglyGit    VWADD_VV     -> OPMVV(T, FuType.vialuF, VialuFixType.vwadd_vv, F, T, F, UopSplitType.VEC_VVW),
334e2695e90SzhanglyGit    VWADD_WV     -> OPMVV(T, FuType.vialuF, VialuFixType.vwadd_wv, F, T, F, UopSplitType.VEC_WVW),
335e2695e90SzhanglyGit    VWADDU_VV    -> OPMVV(T, FuType.vialuF, VialuFixType.vwaddu_vv, F, T, F, UopSplitType.VEC_VVW),
336e2695e90SzhanglyGit    VWADDU_WV    -> OPMVV(T, FuType.vialuF, VialuFixType.vwaddu_wv, F, T, F, UopSplitType.VEC_WVW),
337adf68ff3Sczw    VWMACC_VV    -> OPMVV(T, FuType.vimac, VimacType.vwmacc, F, T, F, UopSplitType.VEC_VVW),
338adf68ff3Sczw    VWMACCSU_VV  -> OPMVV(T, FuType.vimac, VimacType.vwmaccsu, F, T, F, UopSplitType.VEC_VVW),
339adf68ff3Sczw    VWMACCU_VV   -> OPMVV(T, FuType.vimac, VimacType.vwmaccu, F, T, F, UopSplitType.VEC_VVW),
340adf68ff3Sczw    VWMUL_VV     -> OPMVV(T, FuType.vimac, VimacType.vwmul, F, T, F, UopSplitType.VEC_VVW),
341adf68ff3Sczw    VWMULSU_VV   -> OPMVV(T, FuType.vimac, VimacType.vwmulsu, F, T, F, UopSplitType.VEC_VVW),
342adf68ff3Sczw    VWMULU_VV    -> OPMVV(T, FuType.vimac, VimacType.vwmulu, F, T, F, UopSplitType.VEC_VVW),
343e2695e90SzhanglyGit    VWSUB_VV     -> OPMVV(T, FuType.vialuF, VialuFixType.vwsub_vv, F, T, F, UopSplitType.VEC_VVW),
344e2695e90SzhanglyGit    VWSUB_WV     -> OPMVV(T, FuType.vialuF, VialuFixType.vwsub_wv, F, T, F, UopSplitType.VEC_WVW),
345e2695e90SzhanglyGit    VWSUBU_VV    -> OPMVV(T, FuType.vialuF, VialuFixType.vwsubu_vv, F, T, F, UopSplitType.VEC_VVW),
346e2695e90SzhanglyGit    VWSUBU_WV    -> OPMVV(T, FuType.vialuF, VialuFixType.vwsubu_wv, F, T, F, UopSplitType.VEC_WVW),
347c6661c33SHaojin Tang  )
348912e2179SXuan Hu
349b65b9ebaSXuan Hu  val opmvx: Array[(BitPat, XSDecodeBase)] = Array(
350e2695e90SzhanglyGit    VAADD_VX       -> OPMVX(T, FuType.vialuF, VialuFixType.vaadd_vv, F, T, F, UopSplitType.VEC_VXV),
351e2695e90SzhanglyGit    VAADDU_VX      -> OPMVX(T, FuType.vialuF, VialuFixType.vaaddu_vv, F, T, F, UopSplitType.VEC_VXV),
352e2695e90SzhanglyGit    VASUB_VX       -> OPMVX(T, FuType.vialuF, VialuFixType.vasub_vv, F, T, F, UopSplitType.VEC_VXV),
353e2695e90SzhanglyGit    VASUBU_VX      -> OPMVX(T, FuType.vialuF, VialuFixType.vasubu_vv, F, T, F, UopSplitType.VEC_VXV),
354d91483a6Sfdy    VDIV_VX        -> OPMVX(T, FuType.vipu, VipuType.dummy, F, T, F),
355d91483a6Sfdy    VDIVU_VX       -> OPMVX(T, FuType.vipu, VipuType.dummy, F, T, F),
356adf68ff3Sczw    VMACC_VX       -> OPMVX(T, FuType.vimac, VimacType.vmacc, F, T, F, UopSplitType.VEC_VXV),
357adf68ff3Sczw    VMADD_VX       -> OPMVX(T, FuType.vimac, VimacType.vmadd, F, T, F, UopSplitType.VEC_VXV),
358adf68ff3Sczw    VMUL_VX        -> OPMVX(T, FuType.vimac, VimacType.vmul, F, T, F, UopSplitType.VEC_VXV),
359adf68ff3Sczw    VMULH_VX       -> OPMVX(T, FuType.vimac, VimacType.vmulh, F, T, F, UopSplitType.VEC_VXV),
360adf68ff3Sczw    VMULHSU_VX     -> OPMVX(T, FuType.vimac, VimacType.vmulhsu, F, T, F, UopSplitType.VEC_VXV),
361adf68ff3Sczw    VMULHU_VX      -> OPMVX(T, FuType.vimac, VimacType.vmulhu, F, T, F, UopSplitType.VEC_VXV),
362e2695e90SzhanglyGit    VMV_S_X        -> OPMVX(T, FuType.vipu, VipuType.vmv_s_x, F, T, F, UopSplitType.VEC_0XV),
363b65b9ebaSXuan Hu
364adf68ff3Sczw    VNMSAC_VX      -> OPMVX(T, FuType.vimac, VimacType.vnmsac, F, T, F, UopSplitType.VEC_VXV),
365adf68ff3Sczw    VNMSUB_VX      -> OPMVX(T, FuType.vimac, VimacType.vnmsub, F, T, F, UopSplitType.VEC_VXV),
366d91483a6Sfdy    VREM_VX        -> OPMVX(T, FuType.vipu, VipuType.dummy, F, T, F),
367d91483a6Sfdy    VREMU_VX       -> OPMVX(T, FuType.vipu, VipuType.dummy, F, T, F),
368b65b9ebaSXuan Hu
369e2695e90SzhanglyGit    VSLIDE1DOWN_VX -> OPMVX(T, FuType.vppu, VpermType.vslide1down, F, T, F, UopSplitType.VEC_SLIDE1DOWN),
370e2695e90SzhanglyGit    VSLIDE1UP_VX   -> OPMVX(T, FuType.vppu, VpermType.vslide1up, F, T, F, UopSplitType.VEC_SLIDE1UP),
371e2695e90SzhanglyGit    VWADD_VX       -> OPMVX(T, FuType.vialuF, VialuFixType.vwadd_vv, F, T, F, UopSplitType.VEC_VXW),
372e2695e90SzhanglyGit    VWADD_WX       -> OPMVX(T, FuType.vialuF, VialuFixType.vwadd_wv, F, T, F, UopSplitType.VEC_WXW),
373e2695e90SzhanglyGit    VWADDU_VX      -> OPMVX(T, FuType.vialuF, VialuFixType.vwaddu_vv, F, T, F, UopSplitType.VEC_VXW),
374e2695e90SzhanglyGit    VWADDU_WX      -> OPMVX(T, FuType.vialuF, VialuFixType.vwaddu_wv, F, T, F, UopSplitType.VEC_WXW),
375b65b9ebaSXuan Hu
376b65b9ebaSXuan Hu    // OutOfMemoryError
377adf68ff3Sczw    VWMACC_VX      -> OPMVX(T, FuType.vimac, VimacType.vwmacc, F, T, F, UopSplitType.VEC_VXW),
378adf68ff3Sczw    VWMACCSU_VX    -> OPMVX(T, FuType.vimac, VimacType.vwmaccsu, F, T, F, UopSplitType.VEC_VXW),
379adf68ff3Sczw    VWMACCU_VX     -> OPMVX(T, FuType.vimac, VimacType.vwmaccu, F, T, F, UopSplitType.VEC_VXW),
380b65b9ebaSXuan Hu
381adf68ff3Sczw    VWMACCUS_VX    -> OPMVX(T, FuType.vimac, VimacType.vwmaccus, F, T, F, UopSplitType.VEC_VXW),
382adf68ff3Sczw    VWMUL_VX       -> OPMVX(T, FuType.vimac, VimacType.vwmul, F, T, F, UopSplitType.VEC_VXW),
383adf68ff3Sczw    VWMULSU_VX     -> OPMVX(T, FuType.vimac, VimacType.vwmulsu, F, T, F, UopSplitType.VEC_VXW),
384b65b9ebaSXuan Hu    // Ok
385adf68ff3Sczw    VWMULU_VX      -> OPMVX(T, FuType.vimac, VimacType.vwmulu, F, T, F, UopSplitType.VEC_VXW),
386e2695e90SzhanglyGit    VWSUB_VX       -> OPMVX(T, FuType.vialuF, VialuFixType.vwsub_vv, F, T, F, UopSplitType.VEC_VXW),
387e2695e90SzhanglyGit    VWSUB_WX       -> OPMVX(T, FuType.vialuF, VialuFixType.vwsub_wv, F, T, F, UopSplitType.VEC_WXW),
388e2695e90SzhanglyGit    VWSUBU_VX      -> OPMVX(T, FuType.vialuF, VialuFixType.vwsubu_vv, F, T, F, UopSplitType.VEC_VXW),
389e2695e90SzhanglyGit    VWSUBU_WX      -> OPMVX(T, FuType.vialuF, VialuFixType.vwsubu_wv, F, T, F, UopSplitType.VEC_WXW),
390c6661c33SHaojin Tang  )
3917f2b7720SXuan Hu
392bdda74fdSxiaofeibao-xjtu  val opfff: Array[(BitPat, XSDecodeBase)] = Array(
393bdda74fdSxiaofeibao-xjtu    // Scalar Float Point
394bdda74fdSxiaofeibao-xjtu    FADD_S -> OPFFF(SrcType.fp, SrcType.X, FuType.vfalu, VfaluType.vfadd, F, T, F, UopSplitType.SCA_SIM),
395bdda74fdSxiaofeibao-xjtu    FADD_D -> OPFFF(SrcType.fp, SrcType.X, FuType.vfalu, VfaluType.vfadd, F, T, F, UopSplitType.SCA_SIM),
396bdda74fdSxiaofeibao-xjtu    FSUB_S -> OPFFF(SrcType.fp, SrcType.X, FuType.vfalu, VfaluType.vfsub, F, T, F, UopSplitType.SCA_SIM),
397bdda74fdSxiaofeibao-xjtu    FSUB_D -> OPFFF(SrcType.fp, SrcType.X, FuType.vfalu, VfaluType.vfsub, F, T, F, UopSplitType.SCA_SIM),
398bdda74fdSxiaofeibao-xjtu    FEQ_S  -> OPFFF(SrcType.fp, SrcType.X, FuType.vfalu, VfaluType.vfeq , T, F, F, UopSplitType.SCA_SIM),
399bdda74fdSxiaofeibao-xjtu    FLT_S  -> OPFFF(SrcType.fp, SrcType.X, FuType.vfalu, VfaluType.vflt , T, F, F, UopSplitType.SCA_SIM),
400bdda74fdSxiaofeibao-xjtu    FLE_S  -> OPFFF(SrcType.fp, SrcType.X, FuType.vfalu, VfaluType.vfle , T, F, F, UopSplitType.SCA_SIM),
401bdda74fdSxiaofeibao-xjtu    FEQ_D  -> OPFFF(SrcType.fp, SrcType.X, FuType.vfalu, VfaluType.vfeq , T, F, F, UopSplitType.SCA_SIM),
402bdda74fdSxiaofeibao-xjtu    FLT_D  -> OPFFF(SrcType.fp, SrcType.X, FuType.vfalu, VfaluType.vflt , T, F, F, UopSplitType.SCA_SIM),
403bdda74fdSxiaofeibao-xjtu    FLE_D  -> OPFFF(SrcType.fp, SrcType.X, FuType.vfalu, VfaluType.vfle , T, F, F, UopSplitType.SCA_SIM),
404bdda74fdSxiaofeibao-xjtu    FMIN_S -> OPFFF(SrcType.fp, SrcType.X, FuType.vfalu, VfaluType.vfmin, F, T, F, UopSplitType.SCA_SIM),
405bdda74fdSxiaofeibao-xjtu    FMIN_D -> OPFFF(SrcType.fp, SrcType.X, FuType.vfalu, VfaluType.vfmin, F, T, F, UopSplitType.SCA_SIM),
406bdda74fdSxiaofeibao-xjtu    FMAX_S -> OPFFF(SrcType.fp, SrcType.X, FuType.vfalu, VfaluType.vfmax, F, T, F, UopSplitType.SCA_SIM),
407bdda74fdSxiaofeibao-xjtu    FMAX_D -> OPFFF(SrcType.fp, SrcType.X, FuType.vfalu, VfaluType.vfmax, F, T, F, UopSplitType.SCA_SIM),
408bdda74fdSxiaofeibao-xjtu    // donot wflags
409bdda74fdSxiaofeibao-xjtu    FCLASS_S -> OPFFF(SrcType.fp, SrcType.X, FuType.vfalu, VfaluType.vfclass, T, F, F, UopSplitType.SCA_SIM),
410bdda74fdSxiaofeibao-xjtu    FCLASS_D -> OPFFF(SrcType.fp, SrcType.X, FuType.vfalu, VfaluType.vfclass, T, F, F, UopSplitType.SCA_SIM),
411bdda74fdSxiaofeibao-xjtu    FSGNJ_S  -> OPFFF(SrcType.fp, SrcType.X, FuType.vfalu, VfaluType.vfsgnj , F, T, F, UopSplitType.SCA_SIM),
412bdda74fdSxiaofeibao-xjtu    FSGNJ_D  -> OPFFF(SrcType.fp, SrcType.X, FuType.vfalu, VfaluType.vfsgnj , F, T, F, UopSplitType.SCA_SIM),
413bdda74fdSxiaofeibao-xjtu    FSGNJX_S -> OPFFF(SrcType.fp, SrcType.X, FuType.vfalu, VfaluType.vfsgnjx, F, T, F, UopSplitType.SCA_SIM),
414bdda74fdSxiaofeibao-xjtu    FSGNJX_D -> OPFFF(SrcType.fp, SrcType.X, FuType.vfalu, VfaluType.vfsgnjx, F, T, F, UopSplitType.SCA_SIM),
415bdda74fdSxiaofeibao-xjtu    FSGNJN_S -> OPFFF(SrcType.fp, SrcType.X, FuType.vfalu, VfaluType.vfsgnjn, F, T, F, UopSplitType.SCA_SIM),
416bdda74fdSxiaofeibao-xjtu    FSGNJN_D -> OPFFF(SrcType.fp, SrcType.X, FuType.vfalu, VfaluType.vfsgnjn, F, T, F, UopSplitType.SCA_SIM),
417bdda74fdSxiaofeibao-xjtu
418bdda74fdSxiaofeibao-xjtu    FMUL_S -> OPFFF(SrcType.fp, SrcType.X, FuType.vfma , VfmaType.vfmul, F, T, F, UopSplitType.SCA_SIM),
419bdda74fdSxiaofeibao-xjtu    FMUL_D -> OPFFF(SrcType.fp, SrcType.X, FuType.vfma , VfmaType.vfmul, F, T, F, UopSplitType.SCA_SIM),
420bdda74fdSxiaofeibao-xjtu
421bdda74fdSxiaofeibao-xjtu    FDIV_S  -> OPFFF(SrcType.fp, SrcType.X, FuType.vfdiv, VfdivType.vfdiv , F, T, F, UopSplitType.SCA_SIM),
422bdda74fdSxiaofeibao-xjtu    FDIV_D  -> OPFFF(SrcType.fp, SrcType.X, FuType.vfdiv, VfdivType.vfdiv , F, T, F, UopSplitType.SCA_SIM),
423bdda74fdSxiaofeibao-xjtu    FSQRT_S -> OPFFF(SrcType.fp, SrcType.X, FuType.vfdiv, VfdivType.vfsqrt, F, T, F, UopSplitType.SCA_SIM),
424bdda74fdSxiaofeibao-xjtu    FSQRT_D -> OPFFF(SrcType.fp, SrcType.X, FuType.vfdiv, VfdivType.vfsqrt, F, T, F, UopSplitType.SCA_SIM),
425bdda74fdSxiaofeibao-xjtu
426bdda74fdSxiaofeibao-xjtu    FMADD_S  -> OPFFF(SrcType.fp, SrcType.fp, FuType.vfma, VfmaType.vfmacc , F, T, F, UopSplitType.SCA_SIM),
427bdda74fdSxiaofeibao-xjtu    FMSUB_S  -> OPFFF(SrcType.fp, SrcType.fp, FuType.vfma, VfmaType.vfmsac , F, T, F, UopSplitType.SCA_SIM),
428bdda74fdSxiaofeibao-xjtu    FNMADD_S -> OPFFF(SrcType.fp, SrcType.fp, FuType.vfma, VfmaType.vfnmacc, F, T, F, UopSplitType.SCA_SIM),
429bdda74fdSxiaofeibao-xjtu    FNMSUB_S -> OPFFF(SrcType.fp, SrcType.fp, FuType.vfma, VfmaType.vfnmsac, F, T, F, UopSplitType.SCA_SIM),
430bdda74fdSxiaofeibao-xjtu    FMADD_D  -> OPFFF(SrcType.fp, SrcType.fp, FuType.vfma, VfmaType.vfmacc , F, T, F, UopSplitType.SCA_SIM),
431bdda74fdSxiaofeibao-xjtu    FMSUB_D  -> OPFFF(SrcType.fp, SrcType.fp, FuType.vfma, VfmaType.vfmsac , F, T, F, UopSplitType.SCA_SIM),
432bdda74fdSxiaofeibao-xjtu    FNMADD_D -> OPFFF(SrcType.fp, SrcType.fp, FuType.vfma, VfmaType.vfnmacc, F, T, F, UopSplitType.SCA_SIM),
433bdda74fdSxiaofeibao-xjtu    FNMSUB_D -> OPFFF(SrcType.fp, SrcType.fp, FuType.vfma, VfmaType.vfnmsac, F, T, F, UopSplitType.SCA_SIM),
434bdda74fdSxiaofeibao-xjtu  )
435bdda74fdSxiaofeibao-xjtu
436b65b9ebaSXuan Hu  val opfvv: Array[(BitPat, XSDecodeBase)] = Array(
437b448988dSczw    // 13.2. Vector Single-Width Floating-Point Add/Subtract Instructions
438*cb81ef42Sxiaofeibao-xjtu    VFADD_VV           -> OPFVV(SrcType.vp, SrcType.vp , FuType.vfalu, VfaluType.vfadd, F, T, F, UopSplitType.VEC_VVV),
439*cb81ef42Sxiaofeibao-xjtu    VFSUB_VV           -> OPFVV(SrcType.vp, SrcType.vp , FuType.vfalu, VfaluType.vfsub, F, T, F, UopSplitType.VEC_VVV),
440b448988dSczw
441b448988dSczw    // 13.3. Vector Widening Floating-Point Add/Subtract Instructions
442*cb81ef42Sxiaofeibao-xjtu    VFWADD_VV          -> OPFVV(SrcType.vp, SrcType.vp , FuType.vfalu, VfaluType.vfwadd  , F, T, F, UopSplitType.VEC_VVW),
443*cb81ef42Sxiaofeibao-xjtu    VFWSUB_VV          -> OPFVV(SrcType.vp, SrcType.vp , FuType.vfalu, VfaluType.vfwsub  , F, T, F, UopSplitType.VEC_VVW),
444*cb81ef42Sxiaofeibao-xjtu    VFWADD_WV          -> OPFVV(SrcType.vp, SrcType.vp , FuType.vfalu, VfaluType.vfwadd_w, F, T, F, UopSplitType.VEC_WVW),
445*cb81ef42Sxiaofeibao-xjtu    VFWSUB_WV          -> OPFVV(SrcType.vp, SrcType.vp , FuType.vfalu, VfaluType.vfwsub_w, F, T, F, UopSplitType.VEC_WVW),
446b448988dSczw
447b448988dSczw    // 13.4. Vector Single-Width Floating-Point Multiply/Divide Instructions
448*cb81ef42Sxiaofeibao-xjtu    VFMUL_VV           -> OPFVV(SrcType.vp, SrcType.vp , FuType.vfma, VfmaType.vfmul, F, T, F, UopSplitType.VEC_VVV),
449*cb81ef42Sxiaofeibao-xjtu    VFDIV_VV           -> OPFVV(SrcType.vp, SrcType.vp , FuType.vfdiv, VfdivType.vfdiv , F, T, F, UopSplitType.VEC_VVV),
450b448988dSczw
451b448988dSczw    // 13.5. Vector Widening Floating-Point Multiply
452*cb81ef42Sxiaofeibao-xjtu    VFWMUL_VV          -> OPFVV(SrcType.vp, SrcType.vp , FuType.vfma, VfmaType.vfmul_w, F, T, F, UopSplitType.VEC_VVW),
453b448988dSczw
454b448988dSczw    // 13.6. Vector Single-Width Floating-Point Fused Multiply-Add Instructions
455b19366b2Sxiaofeibao-xjtu    VFMACC_VV          -> OPFVV(SrcType.vp, SrcType.vp, FuType.vfma, VfmaType.vfmacc , F, T, F, UopSplitType.VEC_VVV),
456b19366b2Sxiaofeibao-xjtu    VFNMACC_VV         -> OPFVV(SrcType.vp, SrcType.vp, FuType.vfma, VfmaType.vfnmacc, F, T, F, UopSplitType.VEC_VVV),
457b19366b2Sxiaofeibao-xjtu    VFMSAC_VV          -> OPFVV(SrcType.vp, SrcType.vp, FuType.vfma, VfmaType.vfmsac , F, T, F, UopSplitType.VEC_VVV),
458b19366b2Sxiaofeibao-xjtu    VFNMSAC_VV         -> OPFVV(SrcType.vp, SrcType.vp, FuType.vfma, VfmaType.vfnmsac, F, T, F, UopSplitType.VEC_VVV),
459b19366b2Sxiaofeibao-xjtu    VFMADD_VV          -> OPFVV(SrcType.vp, SrcType.vp, FuType.vfma, VfmaType.vfmadd , F, T, F, UopSplitType.VEC_VVV),
460b19366b2Sxiaofeibao-xjtu    VFNMADD_VV         -> OPFVV(SrcType.vp, SrcType.vp, FuType.vfma, VfmaType.vfnmadd, F, T, F, UopSplitType.VEC_VVV),
461b19366b2Sxiaofeibao-xjtu    VFMSUB_VV          -> OPFVV(SrcType.vp, SrcType.vp, FuType.vfma, VfmaType.vfmsub , F, T, F, UopSplitType.VEC_VVV),
462b19366b2Sxiaofeibao-xjtu    VFNMSUB_VV         -> OPFVV(SrcType.vp, SrcType.vp, FuType.vfma, VfmaType.vfnmsub, F, T, F, UopSplitType.VEC_VVV),
463b448988dSczw
464b448988dSczw    // 13.7. Vector Widening Floating-Point Fused Multiply-Add Instructions
465b19366b2Sxiaofeibao-xjtu    VFWMACC_VV         -> OPFVV(SrcType.vp, SrcType.vp, FuType.vfma, VfmaType.vfmacc_w , F, T, F, UopSplitType.VEC_VVW),
466b19366b2Sxiaofeibao-xjtu    VFWNMACC_VV        -> OPFVV(SrcType.vp, SrcType.vp, FuType.vfma, VfmaType.vfnmacc_w, F, T, F, UopSplitType.VEC_VVW),
467b19366b2Sxiaofeibao-xjtu    VFWMSAC_VV         -> OPFVV(SrcType.vp, SrcType.vp, FuType.vfma, VfmaType.vfmsac_w , F, T, F, UopSplitType.VEC_VVW),
468b19366b2Sxiaofeibao-xjtu    VFWNMSAC_VV        -> OPFVV(SrcType.vp, SrcType.vp, FuType.vfma, VfmaType.vfnmsac_w, F, T, F, UopSplitType.VEC_VVW),
469b448988dSczw
470b448988dSczw    // 13.8. Vector Floating-Point Square-Root Instruction
471*cb81ef42Sxiaofeibao-xjtu    VFSQRT_V           -> OPFVV(SrcType.X , SrcType.vp , FuType.vfdiv, VfdivType.vfsqrt, F, T, F, UopSplitType.VEC_VVV),
472b448988dSczw
473b448988dSczw    // 13.9. Vector Floating-Point Reciprocal Square-Root Estimate Instruction
474912e2179SXuan Hu    VFRSQRT7_V         -> OPFVV(SrcType.X , SrcType.X , FuType.vfpu, VfpuType.dummy, F, T, F),
475b448988dSczw
476b448988dSczw    // 13.10. Vector Floating-Point Reciprocal Estimate Instruction
477912e2179SXuan Hu    VFREC7_V           -> OPFVV(SrcType.X , SrcType.X , FuType.vfpu, VfpuType.dummy, F, T, F),
478b448988dSczw
479b448988dSczw    // 13.11. Vector Floating-Point MIN/MAX Instructions
480*cb81ef42Sxiaofeibao-xjtu    VFMIN_VV           -> OPFVV(SrcType.vp, SrcType.vp , FuType.vfalu, VfaluType.vfmin, F, T, F, UopSplitType.VEC_VVV),
481*cb81ef42Sxiaofeibao-xjtu    VFMAX_VV           -> OPFVV(SrcType.vp, SrcType.vp , FuType.vfalu, VfaluType.vfmax, F, T, F, UopSplitType.VEC_VVV),
482b448988dSczw
483b448988dSczw    // 13.12. Vector Floating-Point Sign-Injection Instructions
484*cb81ef42Sxiaofeibao-xjtu    VFSGNJ_VV          -> OPFVV(SrcType.vp, SrcType.vp , FuType.vfalu, VfaluType.vfsgnj , F, T, F, UopSplitType.VEC_VVV),
485*cb81ef42Sxiaofeibao-xjtu    VFSGNJN_VV         -> OPFVV(SrcType.vp, SrcType.vp , FuType.vfalu, VfaluType.vfsgnjn, F, T, F, UopSplitType.VEC_VVV),
486*cb81ef42Sxiaofeibao-xjtu    VFSGNJX_VV         -> OPFVV(SrcType.vp, SrcType.vp , FuType.vfalu, VfaluType.vfsgnjx, F, T, F, UopSplitType.VEC_VVV),
487b448988dSczw
488b448988dSczw    // 13.13. Vector Floating-Point Compare Instructions
489f06d6d60Sxiaofeibao-xjtu    VMFEQ_VV           -> OPFVV(SrcType.vp, SrcType.vp, FuType.vfalu, VfaluType.vfeq, F, T, F, UopSplitType.VEC_VVM),
490f06d6d60Sxiaofeibao-xjtu    VMFNE_VV           -> OPFVV(SrcType.vp, SrcType.vp, FuType.vfalu, VfaluType.vfne, F, T, F, UopSplitType.VEC_VVM),
491f06d6d60Sxiaofeibao-xjtu    VMFLT_VV           -> OPFVV(SrcType.vp, SrcType.vp, FuType.vfalu, VfaluType.vflt, F, T, F, UopSplitType.VEC_VVM),
492f06d6d60Sxiaofeibao-xjtu    VMFLE_VV           -> OPFVV(SrcType.vp, SrcType.vp, FuType.vfalu, VfaluType.vfle, F, T, F, UopSplitType.VEC_VVM),
493b448988dSczw
494b448988dSczw    // 13.14. Vector Floating-Point Classify Instruction
495f06d6d60Sxiaofeibao-xjtu    VFCLASS_V          -> OPFVV(SrcType.X , SrcType.X , FuType.vfalu, VfaluType.vfclass, F, T, F, UopSplitType.VEC_VVV),
496b448988dSczw
497b448988dSczw    // 13.17. Single-Width Floating-Point/Integer Type-Convert Instructions
498912e2179SXuan Hu    VFCVT_XU_F_V       -> OPFVV(SrcType.X , SrcType.X , FuType.vfpu, VfpuType.dummy, F, T, F),
499912e2179SXuan Hu    VFCVT_X_F_V        -> OPFVV(SrcType.X , SrcType.X , FuType.vfpu, VfpuType.dummy, F, T, F),
500912e2179SXuan Hu    VFCVT_RTZ_XU_F_V   -> OPFVV(SrcType.X , SrcType.X , FuType.vfpu, VfpuType.dummy, F, T, F),
501912e2179SXuan Hu    VFCVT_RTZ_X_F_V    -> OPFVV(SrcType.X , SrcType.X , FuType.vfpu, VfpuType.dummy, F, T, F),
502912e2179SXuan Hu    VFCVT_F_XU_V       -> OPFVV(SrcType.X , SrcType.X , FuType.vfpu, VfpuType.dummy, F, T, F),
503912e2179SXuan Hu    VFCVT_F_X_V        -> OPFVV(SrcType.X , SrcType.X , FuType.vfpu, VfpuType.dummy, F, T, F),
504b448988dSczw
505b448988dSczw    // 13.18. Widening Floating-Point/Integer Type-Convert Instructions
506912e2179SXuan Hu    VFWCVT_XU_F_V      -> OPFVV(SrcType.X , SrcType.X , FuType.vfpu, VfpuType.dummy, F, T, F),
507912e2179SXuan Hu    VFWCVT_X_F_V       -> OPFVV(SrcType.X , SrcType.X , FuType.vfpu, VfpuType.dummy, F, T, F),
508912e2179SXuan Hu    VFWCVT_RTZ_XU_F_V  -> OPFVV(SrcType.X , SrcType.X , FuType.vfpu, VfpuType.dummy, F, T, F),
509912e2179SXuan Hu    VFWCVT_RTZ_X_F_V   -> OPFVV(SrcType.X , SrcType.X , FuType.vfpu, VfpuType.dummy, F, T, F),
510912e2179SXuan Hu    VFWCVT_F_XU_V      -> OPFVV(SrcType.X , SrcType.X , FuType.vfpu, VfpuType.dummy, F, T, F),
511912e2179SXuan Hu    VFWCVT_F_X_V       -> OPFVV(SrcType.X , SrcType.X , FuType.vfpu, VfpuType.dummy, F, T, F),
512912e2179SXuan Hu    VFWCVT_F_F_V       -> OPFVV(SrcType.X , SrcType.X , FuType.vfpu, VfpuType.dummy, F, T, F),
513b448988dSczw
514b65b9ebaSXuan Hu    // !
515b448988dSczw    // 13.19. Narrowing Floating-Point/Integer Type-Convert Instructions
516912e2179SXuan Hu    VFNCVT_XU_F_W      -> OPFVV(SrcType.X , SrcType.X , FuType.vfpu, VfpuType.dummy, F, T, F),
517912e2179SXuan Hu    VFNCVT_X_F_W       -> OPFVV(SrcType.X , SrcType.X , FuType.vfpu, VfpuType.dummy, F, T, F),
518912e2179SXuan Hu    VFNCVT_RTZ_XU_F_W  -> OPFVV(SrcType.X , SrcType.X , FuType.vfpu, VfpuType.dummy, F, T, F),
519912e2179SXuan Hu    VFNCVT_RTZ_X_F_W   -> OPFVV(SrcType.X , SrcType.X , FuType.vfpu, VfpuType.dummy, F, T, F),
520912e2179SXuan Hu    VFNCVT_F_XU_W      -> OPFVV(SrcType.X , SrcType.X , FuType.vfpu, VfpuType.dummy, F, T, F),
521912e2179SXuan Hu    VFNCVT_F_X_W       -> OPFVV(SrcType.X , SrcType.X , FuType.vfpu, VfpuType.dummy, F, T, F),
522912e2179SXuan Hu    VFNCVT_F_F_W       -> OPFVV(SrcType.X , SrcType.X , FuType.vfpu, VfpuType.dummy, F, T, F),
523912e2179SXuan Hu    VFNCVT_ROD_F_F_W   -> OPFVV(SrcType.X , SrcType.X , FuType.vfpu, VfpuType.dummy, F, T, F),
524b448988dSczw    // 14.3. Vector Single-Width Floating-Point Reduction Instructions
525*cb81ef42Sxiaofeibao-xjtu    VFREDOSUM_VS -> OPFVV(SrcType.vp, SrcType.vp, FuType.vfalu, VfaluType.vfredosum, F, T, F, UopSplitType.VEC_VFREDOSUM),
526*cb81ef42Sxiaofeibao-xjtu    VFREDUSUM_VS -> OPFVV(SrcType.vp, SrcType.vp, FuType.vfalu, VfaluType.vfredusum, F, T, F, UopSplitType.VEC_VFRED),
527*cb81ef42Sxiaofeibao-xjtu    VFREDMAX_VS  -> OPFVV(SrcType.vp, SrcType.vp, FuType.vfalu, VfaluType.vfredmax , F, T, F, UopSplitType.VEC_VFRED),
528*cb81ef42Sxiaofeibao-xjtu    VFREDMIN_VS  -> OPFVV(SrcType.vp, SrcType.vp, FuType.vfalu, VfaluType.vfredmin , F, T, F, UopSplitType.VEC_VFRED),
529b448988dSczw
530b448988dSczw    // 14.4. Vector Widening Floating-Point Reduction Instructions
531*cb81ef42Sxiaofeibao-xjtu    VFWREDOSUM_VS -> OPFVV(SrcType.vp, SrcType.vp, FuType.vfalu, VfaluType.vfwredosum, F, T, F, UopSplitType.VEC_VFREDOSUM),
532*cb81ef42Sxiaofeibao-xjtu    VFWREDUSUM_VS -> OPFVV(SrcType.vp, SrcType.vp, FuType.vfalu, VfpuType.dummy, F, T, F),
533b448988dSczw
534b448988dSczw  )
5357f2b7720SXuan Hu
536b65b9ebaSXuan Hu  val opfvf: Array[(BitPat, XSDecodeBase)] = Array(
537b448988dSczw    // 13.2. Vector Single-Width Floating-Point Add/Subtract Instructions
538*cb81ef42Sxiaofeibao-xjtu    VFADD_VF           -> OPFVF(SrcType.fp, SrcType.vp , FuType.vfalu, VfaluType.vfadd, F, T, F, UopSplitType.VEC_VFV),
539*cb81ef42Sxiaofeibao-xjtu    VFSUB_VF           -> OPFVF(SrcType.fp, SrcType.vp , FuType.vfalu, VfpuType.vfsub , F, T, F, UopSplitType.VEC_VFV),
540*cb81ef42Sxiaofeibao-xjtu    VFRSUB_VF          -> OPFVF(SrcType.fp, SrcType.vp , FuType.vfalu, VfpuType.vfsub , F, T, F, UopSplitType.VEC_VFV),
541b448988dSczw
542b448988dSczw    // 13.3. Vector Widening Floating-Point Add/Subtract Instructions
543*cb81ef42Sxiaofeibao-xjtu    VFWADD_VF          -> OPFVF(SrcType.fp, SrcType.vp , FuType.vfalu, VfaluType.vfwadd, F, T, F, UopSplitType.VEC_VFW),
544*cb81ef42Sxiaofeibao-xjtu    VFWSUB_VF          -> OPFVF(SrcType.fp, SrcType.vp , FuType.vfalu, VfaluType.vfwsub, F, T, F, UopSplitType.VEC_VFW),
545*cb81ef42Sxiaofeibao-xjtu    VFWADD_WF          -> OPFVF(SrcType.fp, SrcType.vp , FuType.vfalu, VfaluType.vfwadd_w, F, T, F, UopSplitType.VEC_WFW),
546*cb81ef42Sxiaofeibao-xjtu    VFWSUB_WF          -> OPFVF(SrcType.fp, SrcType.vp , FuType.vfalu, VfaluType.vfwsub_w, F, T, F, UopSplitType.VEC_WFW),
547b448988dSczw
548b448988dSczw    // 13.4. Vector Single-Width Floating-Point Multiply/Divide Instructions
549*cb81ef42Sxiaofeibao-xjtu    VFMUL_VF           -> OPFVF(SrcType.fp, SrcType.vp , FuType.vfma, VfmaType.vfmul, F, T, F, UopSplitType.VEC_VFV),
550*cb81ef42Sxiaofeibao-xjtu    VFDIV_VF           -> OPFVF(SrcType.fp, SrcType.vp , FuType.vfdiv, VfdivType.vfdiv, F, T, F, UopSplitType.VEC_VFV),
551*cb81ef42Sxiaofeibao-xjtu    VFRDIV_VF          -> OPFVF(SrcType.fp, SrcType.vp , FuType.vfdiv, VfdivType.vfdiv, F, T, F, UopSplitType.VEC_VFV),
552b448988dSczw
553b448988dSczw    // 13.5. Vector Widening Floating-Point Multiply
554*cb81ef42Sxiaofeibao-xjtu    VFWMUL_VF          -> OPFVF(SrcType.fp, SrcType.vp , FuType.vfma, VfmaType.vfmul_w, F, T, F, UopSplitType.VEC_VFW),
555b448988dSczw
556b448988dSczw    // 13.6. Vector Single-Width Floating-Point Fused Multiply-Add Instructions
557b19366b2Sxiaofeibao-xjtu    VFMACC_VF          -> OPFVF(SrcType.fp, SrcType.vp, FuType.vfma, VfmaType.vfmacc , F, T, F, UopSplitType.VEC_VFV),
558b19366b2Sxiaofeibao-xjtu    VFNMACC_VF         -> OPFVF(SrcType.fp, SrcType.vp, FuType.vfma, VfmaType.vfnmacc, F, T, F, UopSplitType.VEC_VFV),
559b19366b2Sxiaofeibao-xjtu    VFMSAC_VF          -> OPFVF(SrcType.fp, SrcType.vp, FuType.vfma, VfmaType.vfmsac , F, T, F, UopSplitType.VEC_VFV),
560b19366b2Sxiaofeibao-xjtu    VFNMSAC_VF         -> OPFVF(SrcType.fp, SrcType.vp, FuType.vfma, VfmaType.vfnmsac, F, T, F, UopSplitType.VEC_VFV),
561b19366b2Sxiaofeibao-xjtu    VFMADD_VF          -> OPFVF(SrcType.fp, SrcType.vp, FuType.vfma, VfmaType.vfmadd , F, T, F, UopSplitType.VEC_VFV),
562b19366b2Sxiaofeibao-xjtu    VFNMADD_VF         -> OPFVF(SrcType.fp, SrcType.vp, FuType.vfma, VfmaType.vfnmadd, F, T, F, UopSplitType.VEC_VFV),
563b19366b2Sxiaofeibao-xjtu    VFMSUB_VF          -> OPFVF(SrcType.fp, SrcType.vp, FuType.vfma, VfmaType.vfmsub , F, T, F, UopSplitType.VEC_VFV),
564b19366b2Sxiaofeibao-xjtu    VFNMSUB_VF         -> OPFVF(SrcType.fp, SrcType.vp, FuType.vfma, VfmaType.vfnmsub, F, T, F, UopSplitType.VEC_VFV),
565b448988dSczw
566b448988dSczw    // 13.7. Vector Widening Floating-Point Fused Multiply-Add Instructions
567b19366b2Sxiaofeibao-xjtu    VFWMACC_VF         -> OPFVF(SrcType.fp, SrcType.vp, FuType.vfma, VfmaType.vfmacc_w , F, T, F, UopSplitType.VEC_VFW),
568b19366b2Sxiaofeibao-xjtu    VFWNMACC_VF        -> OPFVF(SrcType.fp, SrcType.vp, FuType.vfma, VfmaType.vfnmacc_w, F, T, F, UopSplitType.VEC_VFW),
569b19366b2Sxiaofeibao-xjtu    VFWMSAC_VF         -> OPFVF(SrcType.fp, SrcType.vp, FuType.vfma, VfmaType.vfmsac_w , F, T, F, UopSplitType.VEC_VFW),
570b19366b2Sxiaofeibao-xjtu    VFWNMSAC_VF        -> OPFVF(SrcType.fp, SrcType.vp, FuType.vfma, VfmaType.vfnmsac_w, F, T, F, UopSplitType.VEC_VFW),
571b448988dSczw
572b448988dSczw    // 13.11. Vector Floating-Point MIN/MAX Instructions
573*cb81ef42Sxiaofeibao-xjtu    VFMIN_VF           -> OPFVF(SrcType.fp, SrcType.vp , FuType.vfalu, VfaluType.vfmin, F, T, F, UopSplitType.VEC_VFV),
574*cb81ef42Sxiaofeibao-xjtu    VFMAX_VF           -> OPFVF(SrcType.fp, SrcType.vp , FuType.vfalu, VfaluType.vfmax, F, T, F, UopSplitType.VEC_VFV),
575b448988dSczw
576b448988dSczw    // 13.12. Vector Floating-Point Sign-Injection Instructions
577*cb81ef42Sxiaofeibao-xjtu    VFSGNJ_VF          -> OPFVF(SrcType.fp, SrcType.vp , FuType.vfalu, VfpuType.vfsgnj , F, T, F, UopSplitType.VEC_VFV),
578*cb81ef42Sxiaofeibao-xjtu    VFSGNJN_VF         -> OPFVF(SrcType.fp, SrcType.vp , FuType.vfalu, VfpuType.vfsgnjn, F, T, F, UopSplitType.VEC_VFV),
579*cb81ef42Sxiaofeibao-xjtu    VFSGNJX_VF         -> OPFVF(SrcType.fp, SrcType.vp , FuType.vfalu, VfpuType.vfsgnjx, F, T, F, UopSplitType.VEC_VFV),
580b448988dSczw
581b448988dSczw    // 13.13. Vector Floating-Point Compare Instructions
582f06d6d60Sxiaofeibao-xjtu    VMFEQ_VF           -> OPFVF(SrcType.fp, SrcType.vp, FuType.vfalu, VfaluType.vfeq, F, F, T, UopSplitType.VEC_VFM),
583f06d6d60Sxiaofeibao-xjtu    VMFNE_VF           -> OPFVF(SrcType.fp, SrcType.vp, FuType.vfalu, VfaluType.vfne, F, F, T, UopSplitType.VEC_VFM),
584f06d6d60Sxiaofeibao-xjtu    VMFLT_VF           -> OPFVF(SrcType.fp, SrcType.vp, FuType.vfalu, VfaluType.vflt, F, F, T, UopSplitType.VEC_VFM),
585f06d6d60Sxiaofeibao-xjtu    VMFLE_VF           -> OPFVF(SrcType.fp, SrcType.vp, FuType.vfalu, VfaluType.vfle, F, F, T, UopSplitType.VEC_VFM),
586f06d6d60Sxiaofeibao-xjtu    VMFGT_VF           -> OPFVF(SrcType.fp, SrcType.vp, FuType.vfalu, VfaluType.vfgt, F, F, T, UopSplitType.VEC_VFM),
587f06d6d60Sxiaofeibao-xjtu    VMFGE_VF           -> OPFVF(SrcType.fp, SrcType.vp, FuType.vfalu, VfaluType.vfge, F, F, T, UopSplitType.VEC_VFM),
588b448988dSczw
589b448988dSczw    // 13.15. Vector Floating-Point Merge Instruction
590*cb81ef42Sxiaofeibao-xjtu    VFMERGE_VFM        -> OPFVF(SrcType.fp, SrcType.vp , FuType.vfalu, VfaluType.vfmerge, F, T, F, UopSplitType.VEC_VFV),
591b448988dSczw
592b448988dSczw    // 13.16. Vector Floating-Point Move Instruction
593*cb81ef42Sxiaofeibao-xjtu    VFMV_V_F           -> OPFVF(SrcType.fp, SrcType.vp , FuType.vfalu, VfaluType.vfmv, F, T, F),// src2=SrcType.X
594b448988dSczw
595b448988dSczw    // 16.2. Floating-Point Scalar Move Instructions
5969bb931c8Sxiaofeibao-xjtu    VFMV_F_S           -> OPFVF(SrcType.X, SrcType.X, FuType.vfalu, VfaluType.vfmv_f_s, T, F, F, UopSplitType.SCA_SIM), // f[rd] = vs2[0] (rs1=0)
5979bb931c8Sxiaofeibao-xjtu    VFMV_S_F           -> OPFVF(SrcType.fp, SrcType.X, FuType.vfalu, VfaluType.vfmv_s_f, F, T, F, UopSplitType.VEC_VFV, src2 = SrcType.X),
598b448988dSczw    // 16.3.3. Vector Slide1up
599e2695e90SzhanglyGit    VFSLIDE1UP_VF      -> OPFVF(SrcType.fp, SrcType.vp , FuType.vppu, VpermType.vfslide1up, F, T, F, UopSplitType.VEC_FSLIDE1UP),// vd[0]=f[rs1], vd[i+1] = vs2[i]
600b448988dSczw
601b448988dSczw    // 16.3.4. Vector Slide1down Instruction
602b448988dSczw    // vslide1down.vx vd, vs2, rs1, vm # vd[i] = vs2[i+1], vd[vl-1]=x[rs1]
603e2695e90SzhanglyGit    VFSLIDE1DOWN_VF    -> OPFVF(SrcType.fp, SrcType.vp , FuType.vppu, VpermType.vfslide1down, F, T, F, UopSplitType.VEC_FSLIDE1DOWN),// vd[i] = vs2[i+1], vd[vl-1]=f[rs1]
6047f2b7720SXuan Hu  )
6057f2b7720SXuan Hu
606b65b9ebaSXuan Hu  val vset: Array[(BitPat, XSDecodeBase)] = Array(
607a32c56f4SXuan Hu    VSETVLI   -> VSET(vli = F, vtypei = T, VSETOpType.uvsetvcfg_xi, F, SelImm.IMM_VSETVLI),
608a32c56f4SXuan Hu    VSETIVLI  -> VSET(vli = T, vtypei = T, VSETOpType.uvsetvcfg_ii, F, SelImm.IMM_VSETIVLI),
609a32c56f4SXuan Hu    VSETVL    -> VSET(vli = F, vtypei = F, VSETOpType.uvsetvcfg_xx, T, SelImm.X), // flush pipe
610912e2179SXuan Hu  )
6117f2b7720SXuan Hu
612b65b9ebaSXuan Hu  val vls: Array[(BitPat, XSDecodeBase)] = Array(
613912e2179SXuan Hu    // 7.4. Vector Unit-Stride Instructions
614912e2179SXuan Hu    VLE8_V        -> VLD(SrcType.X,   VlduType.dummy),
615912e2179SXuan Hu    VLE16_V       -> VLD(SrcType.X,   VlduType.dummy),
616912e2179SXuan Hu    VLE32_V       -> VLD(SrcType.X,   VlduType.dummy),
617912e2179SXuan Hu    VLE64_V       -> VLD(SrcType.X,   VlduType.dummy),
618912e2179SXuan Hu    VSE8_V        -> VST(SrcType.X,   VstuType.dummy),
619912e2179SXuan Hu    VSE16_V       -> VST(SrcType.X,   VstuType.dummy),
620912e2179SXuan Hu    VSE32_V       -> VST(SrcType.X,   VstuType.dummy),
621912e2179SXuan Hu    VSE64_V       -> VST(SrcType.X,   VstuType.dummy),
622912e2179SXuan Hu    VLM_V         -> VLD(SrcType.X,   VlduType.dummy, mask = T),
623912e2179SXuan Hu    VSM_V         -> VST(SrcType.X,   VstuType.dummy, mask = T),
624912e2179SXuan Hu    // 7.5. Vector Strided Instructions
625912e2179SXuan Hu    VLSE8_V       -> VLD(SrcType.xp,  VlduType.dummy, strided = T),
626912e2179SXuan Hu    VLSE16_V      -> VLD(SrcType.xp,  VlduType.dummy, strided = T),
627912e2179SXuan Hu    VLSE32_V      -> VLD(SrcType.xp,  VlduType.dummy, strided = T),
628912e2179SXuan Hu    VLSE64_V      -> VLD(SrcType.xp,  VlduType.dummy, strided = T),
629912e2179SXuan Hu    VSSE8_V       -> VST(SrcType.xp,  VstuType.dummy, strided = T),
630912e2179SXuan Hu    VSSE16_V      -> VST(SrcType.xp,  VstuType.dummy, strided = T),
631912e2179SXuan Hu    VSSE32_V      -> VST(SrcType.xp,  VstuType.dummy, strided = T),
632912e2179SXuan Hu    VSSE64_V      -> VST(SrcType.xp,  VstuType.dummy, strided = T),
633912e2179SXuan Hu    // 7.6. Vector Indexed Instructions
634912e2179SXuan Hu    VLUXEI8_V     -> VLD(SrcType.vp,  VlduType.dummy, indexed = T, ordered = F),
635912e2179SXuan Hu    VLUXEI16_V    -> VLD(SrcType.vp,  VlduType.dummy, indexed = T, ordered = F),
636912e2179SXuan Hu    VLUXEI32_V    -> VLD(SrcType.vp,  VlduType.dummy, indexed = T, ordered = F),
637912e2179SXuan Hu    VLUXEI64_V    -> VLD(SrcType.vp,  VlduType.dummy, indexed = T, ordered = F),
638912e2179SXuan Hu    VLOXEI8_V     -> VLD(SrcType.vp,  VlduType.dummy, indexed = T, ordered = T),
639912e2179SXuan Hu    VLOXEI16_V    -> VLD(SrcType.vp,  VlduType.dummy, indexed = T, ordered = T),
640912e2179SXuan Hu    VLOXEI32_V    -> VLD(SrcType.vp,  VlduType.dummy, indexed = T, ordered = T),
641912e2179SXuan Hu    VLOXEI64_V    -> VLD(SrcType.vp,  VlduType.dummy, indexed = T, ordered = T),
642912e2179SXuan Hu    VSUXEI8_V     -> VLD(SrcType.vp,  VstuType.dummy, indexed = T, ordered = F),
643912e2179SXuan Hu    VSUXEI16_V    -> VST(SrcType.vp,  VstuType.dummy, indexed = T, ordered = F),
644912e2179SXuan Hu    VSUXEI32_V    -> VST(SrcType.vp,  VstuType.dummy, indexed = T, ordered = F),
645912e2179SXuan Hu    VSUXEI64_V    -> VST(SrcType.vp,  VstuType.dummy, indexed = T, ordered = F),
646912e2179SXuan Hu    VSOXEI8_V     -> VST(SrcType.vp,  VstuType.dummy, indexed = T, ordered = T),
647912e2179SXuan Hu    VSOXEI16_V    -> VST(SrcType.vp,  VstuType.dummy, indexed = T, ordered = T),
648912e2179SXuan Hu    VSOXEI32_V    -> VST(SrcType.vp,  VstuType.dummy, indexed = T, ordered = T),
649912e2179SXuan Hu    VSOXEI64_V    -> VST(SrcType.vp,  VstuType.dummy, indexed = T, ordered = T),
650912e2179SXuan Hu    // 7.7. Unit-stride Fault-Only-First Loads
651912e2179SXuan Hu    VLE8FF_V      -> VLD(SrcType.X,   VlduType.dummy, ff = T),
652912e2179SXuan Hu    VLE16FF_V     -> VLD(SrcType.X,   VlduType.dummy, ff = T),
653912e2179SXuan Hu    VLE32FF_V     -> VLD(SrcType.X,   VlduType.dummy, ff = T),
654912e2179SXuan Hu    VLE64FF_V     -> VLD(SrcType.X,   VlduType.dummy, ff = T),
655912e2179SXuan Hu    // 7.8. Vector Load/Store Segment Instructions
656912e2179SXuan Hu    // 7.8.1. Vector Unit-Stride Segment Loads and Stores
657912e2179SXuan Hu    // TODO
658912e2179SXuan Hu    // 7.8.2. Vector Strided Segment Loads and Stores
659912e2179SXuan Hu    // TODO
660912e2179SXuan Hu    // 7.8.3. Vector Indexed Segment Loads and Stores
661912e2179SXuan Hu    // TODO
662912e2179SXuan Hu    // 7.9. Vector Load/Store Whole Register Instructions
663912e2179SXuan Hu    VL1RE8_V      -> VLD(SrcType.X,   VlduType.dummy, whole = T),
664912e2179SXuan Hu    VL1RE16_V     -> VLD(SrcType.X,   VlduType.dummy, whole = T),
665912e2179SXuan Hu    VL1RE32_V     -> VLD(SrcType.X,   VlduType.dummy, whole = T),
666912e2179SXuan Hu    VL1RE64_V     -> VLD(SrcType.X,   VlduType.dummy, whole = T),
667912e2179SXuan Hu    VL2RE8_V      -> VLD(SrcType.X,   VlduType.dummy, whole = T),
668912e2179SXuan Hu    VL2RE16_V     -> VLD(SrcType.X,   VlduType.dummy, whole = T),
669912e2179SXuan Hu    VL2RE32_V     -> VLD(SrcType.X,   VlduType.dummy, whole = T),
670912e2179SXuan Hu    VL2RE64_V     -> VLD(SrcType.X,   VlduType.dummy, whole = T),
671912e2179SXuan Hu    VL4RE8_V      -> VLD(SrcType.X,   VlduType.dummy, whole = T),
672912e2179SXuan Hu    VL4RE16_V     -> VLD(SrcType.X,   VlduType.dummy, whole = T),
673912e2179SXuan Hu    VL4RE32_V     -> VLD(SrcType.X,   VlduType.dummy, whole = T),
674912e2179SXuan Hu    VL4RE64_V     -> VLD(SrcType.X,   VlduType.dummy, whole = T),
675912e2179SXuan Hu    VL8RE8_V      -> VLD(SrcType.X,   VlduType.dummy, whole = T),
676912e2179SXuan Hu    VL8RE16_V     -> VLD(SrcType.X,   VlduType.dummy, whole = T),
677912e2179SXuan Hu    VL8RE32_V     -> VLD(SrcType.X,   VlduType.dummy, whole = T),
678912e2179SXuan Hu    VL8RE64_V     -> VLD(SrcType.X,   VlduType.dummy, whole = T),
679912e2179SXuan Hu    VS1R_V        -> VST(SrcType.X,   VlduType.dummy, whole = T),
680912e2179SXuan Hu    VS2R_V        -> VST(SrcType.X,   VlduType.dummy, whole = T),
681912e2179SXuan Hu    VS4R_V        -> VST(SrcType.X,   VlduType.dummy, whole = T),
682912e2179SXuan Hu    VS8R_V        -> VST(SrcType.X,   VlduType.dummy, whole = T),
683912e2179SXuan Hu  )
684912e2179SXuan Hu
685b65b9ebaSXuan Hu  override val decodeArray: Array[(BitPat, XSDecodeBase)] = vset ++ vls ++
686bdda74fdSxiaofeibao-xjtu    opivv ++ opivx ++ opivi ++ opmvv ++ opmvx ++ opfvv ++ opfvf ++ opfff
6877f2b7720SXuan Hu}
688